Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(22)

Unified Diff: src/IceTargetLoweringX8664Traits.h

Issue 1428443002: Enhance address mode recovery (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Streamline absolute addressing support (rip-relative on x64) Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/IceTargetLoweringX8664Traits.h
diff --git a/src/IceTargetLoweringX8664Traits.h b/src/IceTargetLoweringX8664Traits.h
index 0ed40a862001da2e8bccc3239ea8a8f8adf5060f..4f1c6e4c9b6d54bce19ee2ef7d905fc61aa76be2 100644
--- a/src/IceTargetLoweringX8664Traits.h
+++ b/src/IceTargetLoweringX8664Traits.h
@@ -201,81 +201,72 @@ template <> struct MachineTraits<TargetX8664> {
return *this;
}
- Address(GPRRegister base, int32_t disp) {
- if (disp == 0 && (base & 7) != RegX8664::Encoded_Reg_ebp) {
- SetModRM(0, base);
- if ((base & 7) == RegX8664::Encoded_Reg_esp)
- SetSIB(TIMES_1, RegX8664::Encoded_Reg_esp, base);
- } else if (Utils::IsInt(8, disp)) {
- SetModRM(1, base);
- if ((base & 7) == RegX8664::Encoded_Reg_esp)
- SetSIB(TIMES_1, RegX8664::Encoded_Reg_esp, base);
- SetDisp8(disp);
+ Address(GPRRegister Base, int32_t Disp, AssemblerFixup *Fixup) {
+ if (Fixup == nullptr && Disp == 0 &&
+ (Base & 7) != RegX8664::Encoded_Reg_ebp) {
+ SetModRM(0, Base);
+ if ((Base & 7) == RegX8664::Encoded_Reg_esp)
+ SetSIB(TIMES_1, RegX8664::Encoded_Reg_esp, Base);
+ } else if (Fixup == nullptr && Utils::IsInt(8, Disp)) {
+ SetModRM(1, Base);
+ if ((Base & 7) == RegX8664::Encoded_Reg_esp)
+ SetSIB(TIMES_1, RegX8664::Encoded_Reg_esp, Base);
+ SetDisp8(Disp);
} else {
- SetModRM(2, base);
- if ((base & 7) == RegX8664::Encoded_Reg_esp)
- SetSIB(TIMES_1, RegX8664::Encoded_Reg_esp, base);
- SetDisp32(disp);
+ SetModRM(2, Base);
+ if ((Base & 7) == RegX8664::Encoded_Reg_esp)
+ SetSIB(TIMES_1, RegX8664::Encoded_Reg_esp, Base);
+ SetDisp32(Disp);
+ if (Fixup)
+ SetFixup(Fixup);
}
}
- Address(GPRRegister index, ScaleFactor scale, int32_t disp) {
- assert(index != RegX8664::Encoded_Reg_esp); // Illegal addressing mode.
+ Address(GPRRegister Index, ScaleFactor Scale, int32_t Disp,
+ AssemblerFixup *Fixup) {
+ assert(Index != RegX8664::Encoded_Reg_esp); // Illegal addressing mode.
SetModRM(0, RegX8664::Encoded_Reg_esp);
- SetSIB(scale, index, RegX8664::Encoded_Reg_ebp);
- SetDisp32(disp);
+ SetSIB(Scale, Index, RegX8664::Encoded_Reg_ebp);
+ SetDisp32(Disp);
+ if (Fixup)
+ SetFixup(Fixup);
}
- Address(GPRRegister base, GPRRegister index, ScaleFactor scale,
- int32_t disp) {
- assert(index != RegX8664::Encoded_Reg_esp); // Illegal addressing mode.
- if (disp == 0 && (base & 7) != RegX8664::Encoded_Reg_ebp) {
+ Address(GPRRegister Base, GPRRegister Index, ScaleFactor Scale,
+ int32_t Disp, AssemblerFixup *Fixup) {
+ assert(Index != RegX8664::Encoded_Reg_esp); // Illegal addressing mode.
+ if (Fixup == nullptr && Disp == 0 &&
+ (Base & 7) != RegX8664::Encoded_Reg_ebp) {
SetModRM(0, RegX8664::Encoded_Reg_esp);
- SetSIB(scale, index, base);
- } else if (Utils::IsInt(8, disp)) {
+ SetSIB(Scale, Index, Base);
+ } else if (Fixup == nullptr && Utils::IsInt(8, Disp)) {
SetModRM(1, RegX8664::Encoded_Reg_esp);
- SetSIB(scale, index, base);
- SetDisp8(disp);
+ SetSIB(Scale, Index, Base);
+ SetDisp8(Disp);
} else {
SetModRM(2, RegX8664::Encoded_Reg_esp);
- SetSIB(scale, index, base);
- SetDisp32(disp);
+ SetSIB(Scale, Index, Base);
+ SetDisp32(Disp);
+ if (Fixup)
+ SetFixup(Fixup);
}
}
- // PcRelTag is a special tag for requesting rip-relative addressing in
- // X86-64.
- // TODO(jpp): this is bogus. remove.
- enum AbsoluteTag { ABSOLUTE };
-
- Address(AbsoluteTag, const uintptr_t Addr) {
- SetModRM(0, RegX8664::Encoded_Reg_ebp);
- SetDisp32(Addr);
- }
-
- // TODO(jpp): remove this.
- static Address Absolute(const uintptr_t Addr) {
- return Address(ABSOLUTE, Addr);
- }
-
- Address(AbsoluteTag, RelocOffsetT Offset, AssemblerFixup *Fixup) {
+ /// Generate a RIP-relative address expression on x86-64.
+ Address(RelocOffsetT Offset, AssemblerFixup *Fixup) {
SetModRM(0, RegX8664::Encoded_Reg_ebp);
// Use the Offset in the displacement for now. If we decide to process
// fixups later, we'll need to patch up the emitted displacement.
SetDisp32(Offset);
- SetFixup(Fixup);
- }
-
- // TODO(jpp): remove this.
- static Address Absolute(RelocOffsetT Offset, AssemblerFixup *Fixup) {
- return Address(ABSOLUTE, Offset, Fixup);
+ if (Fixup)
+ SetFixup(Fixup);
}
static Address ofConstPool(Assembler *Asm, const Constant *Imm) {
// TODO(jpp): ???
AssemblerFixup *Fixup = Asm->createFixup(RelFixup, Imm);
const RelocOffsetT Offset = 4;
- return Address(ABSOLUTE, Offset, Fixup);
+ return Address(Offset, Fixup);
}
};

Powered by Google App Engine
This is Rietveld 408576698