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

Unified Diff: src/IceTargetLoweringX8632Traits.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/IceTargetLoweringX8632Traits.h
diff --git a/src/IceTargetLoweringX8632Traits.h b/src/IceTargetLoweringX8632Traits.h
index 918a5852b9d514585cd248930b78628026c6ff8e..68725479f315be7548d93c74a67804bd4b313632 100644
--- a/src/IceTargetLoweringX8632Traits.h
+++ b/src/IceTargetLoweringX8632Traits.h
@@ -182,79 +182,69 @@ template <> struct MachineTraits<TargetX8632> {
return *this;
}
- Address(GPRRegister base, int32_t disp) {
- if (disp == 0 && base != RegX8632::Encoded_Reg_ebp) {
- SetModRM(0, base);
- if (base == RegX8632::Encoded_Reg_esp)
- SetSIB(TIMES_1, RegX8632::Encoded_Reg_esp, base);
- } else if (Utils::IsInt(8, disp)) {
- SetModRM(1, base);
- if (base == RegX8632::Encoded_Reg_esp)
- SetSIB(TIMES_1, RegX8632::Encoded_Reg_esp, base);
- SetDisp8(disp);
+ Address(GPRRegister Base, int32_t Disp, AssemblerFixup *Fixup) {
+ if (Fixup == nullptr && Disp == 0 && Base != RegX8632::Encoded_Reg_ebp) {
+ SetModRM(0, Base);
+ if (Base == RegX8632::Encoded_Reg_esp)
+ SetSIB(TIMES_1, RegX8632::Encoded_Reg_esp, Base);
+ } else if (Fixup == nullptr && Utils::IsInt(8, Disp)) {
+ SetModRM(1, Base);
+ if (Base == RegX8632::Encoded_Reg_esp)
+ SetSIB(TIMES_1, RegX8632::Encoded_Reg_esp, Base);
+ SetDisp8(Disp);
} else {
- SetModRM(2, base);
- if (base == RegX8632::Encoded_Reg_esp)
- SetSIB(TIMES_1, RegX8632::Encoded_Reg_esp, base);
- SetDisp32(disp);
+ SetModRM(2, Base);
+ if (Base == RegX8632::Encoded_Reg_esp)
+ SetSIB(TIMES_1, RegX8632::Encoded_Reg_esp, Base);
+ SetDisp32(Disp);
+ if (Fixup)
+ SetFixup(Fixup);
}
}
- Address(GPRRegister index, ScaleFactor scale, int32_t disp) {
- assert(index != RegX8632::Encoded_Reg_esp); // Illegal addressing mode.
+ Address(GPRRegister Index, ScaleFactor Scale, int32_t Disp,
+ AssemblerFixup *Fixup) {
+ assert(Index != RegX8632::Encoded_Reg_esp); // Illegal addressing mode.
SetModRM(0, RegX8632::Encoded_Reg_esp);
- SetSIB(scale, index, RegX8632::Encoded_Reg_ebp);
- SetDisp32(disp);
+ SetSIB(Scale, Index, RegX8632::Encoded_Reg_ebp);
+ SetDisp32(Disp);
+ if (Fixup)
+ SetFixup(Fixup);
}
- Address(GPRRegister base, GPRRegister index, ScaleFactor scale,
- int32_t disp) {
- assert(index != RegX8632::Encoded_Reg_esp); // Illegal addressing mode.
- if (disp == 0 && base != RegX8632::Encoded_Reg_ebp) {
+ Address(GPRRegister Base, GPRRegister Index, ScaleFactor Scale,
+ int32_t Disp, AssemblerFixup *Fixup) {
+ assert(Index != RegX8632::Encoded_Reg_esp); // Illegal addressing mode.
+ if (Fixup == nullptr && Disp == 0 && Base != RegX8632::Encoded_Reg_ebp) {
SetModRM(0, RegX8632::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, RegX8632::Encoded_Reg_esp);
- SetSIB(scale, index, base);
- SetDisp8(disp);
+ SetSIB(Scale, Index, Base);
+ SetDisp8(Disp);
} else {
SetModRM(2, RegX8632::Encoded_Reg_esp);
- SetSIB(scale, index, base);
- SetDisp32(disp);
+ SetSIB(Scale, Index, Base);
+ SetDisp32(Disp);
+ if (Fixup)
+ SetFixup(Fixup);
}
}
- /// AbsoluteTag is a special tag used by clients to create an absolute
- /// Address.
- enum AbsoluteTag { ABSOLUTE };
-
- Address(AbsoluteTag, const uintptr_t Addr) {
- SetModRM(0, RegX8632::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 an absolute address expression on x86-32.
+ Address(RelocOffsetT Offset, AssemblerFixup *Fixup) {
SetModRM(0, RegX8632::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) {
AssemblerFixup *Fixup = Asm->createFixup(llvm::ELF::R_386_32, Imm);
const RelocOffsetT Offset = 0;
- return Address(ABSOLUTE, Offset, Fixup);
+ return Address(Offset, Fixup);
}
};

Powered by Google App Engine
This is Rietveld 408576698