Fixes RIP literal sign extending on 32bit

RIP Literal isn't actually RIP literal on 32bit, it is RIP absolute.
64bit treats the 32bit as a signed offset, while 32bit treats it as a
32bit unsigned offset
This commit is contained in:
Ryan Houdek committed 2020-10-17 20:19:50 -07:00
1 parent 6741b9d23f
commit dd49a04809
3 files changed
+9 -6

No files matched your search

+1 -1
View File
@@ -424,7 +424,7 @@ bool Decoder::NormalOp(FEXCore::X86Tables::X86InstInfo const *Info, uint16_t Op)
Bytes -= 4;
NonGPR.TypeRIPLiteral.Type = DecodedOperand::TYPE_RIP_RELATIVE;
NonGPR.TypeRIPLiteral.Literal = Literal;
NonGPR.TypeRIPLiteral.Literal.u = Literal;
}
else {
// Register-direct addressing
@@ -4505,11 +4505,11 @@ OrderedNode *OpDispatchBuilder::LoadSource_WithOpSize(FEXCore::IR::RegisterClass
}
else if (Operand.TypeNone.Type == FEXCore::X86Tables::DecodedOperand::TYPE_RIP_RELATIVE) {
if (CTX->Config.Is64BitMode) {
Src = _Constant(GPRSize * 8, Operand.TypeRIPLiteral.Literal + Op->PC + Op->InstSize);
Src = _Constant(GPRSize * 8, Operand.TypeRIPLiteral.Literal.s + Op->PC + Op->InstSize);
}
else {
// 32bit this isn't RIP relative but instead absolute
Src = _Constant(GPRSize * 8, Operand.TypeRIPLiteral.Literal);
Src = _Constant(GPRSize * 8, Operand.TypeRIPLiteral.Literal.u);
}
LoadableType = true;
@@ -4637,11 +4637,11 @@ void OpDispatchBuilder::StoreResult_WithOpSize(FEXCore::IR::RegisterClassType Cl
}
else if (Operand.TypeNone.Type == FEXCore::X86Tables::DecodedOperand::TYPE_RIP_RELATIVE) {
if (CTX->Config.Is64BitMode) {
MemStoreDst = _Constant(GPRSize * 8, Operand.TypeRIPLiteral.Literal + Op->PC + Op->InstSize);
MemStoreDst = _Constant(GPRSize * 8, Operand.TypeRIPLiteral.Literal.s + Op->PC + Op->InstSize);
}
else {
// 32bit this isn't RIP relative but instead absolute
MemStoreDst = _Constant(GPRSize * 8, Operand.TypeRIPLiteral.Literal);
MemStoreDst = _Constant(GPRSize * 8, Operand.TypeRIPLiteral.Literal.u);
}
MemStore = true;
}
+4 -1
View File
@@ -128,7 +128,10 @@ union DecodedOperand {
struct {
uint8_t Type;
int32_t Literal;
union {
int32_t s;
uint32_t u;
} Literal;
} TypeRIPLiteral;
struct {