Index: src/IceAssemblerX86Base.h |
diff --git a/src/IceAssemblerX86Base.h b/src/IceAssemblerX86Base.h |
index 9da66a3fc2c0548caf518b8e01c6140ac12173a6..3af54e316c04a9f10a4c2a193e624b353034f7a2 100644 |
--- a/src/IceAssemblerX86Base.h |
+++ b/src/IceAssemblerX86Base.h |
@@ -44,11 +44,10 @@ class AssemblerX86Base : public ::Ice::Assembler { |
AssemblerX86Base &operator=(const AssemblerX86Base &) = delete; |
protected: |
- explicit AssemblerX86Base(bool use_far_branches = false) |
- : Assembler(Traits::AsmKind) { |
- // This mode is only needed and implemented for MIPS and ARM. |
- assert(!use_far_branches); |
- (void)use_far_branches; |
+ explicit AssemblerX86Base(bool EmitAddrSizeOverridePrefix = Traits::Is64Bit) |
+ : Assembler(Traits::AsmKind), |
+ EmitAddrSizeOverridePrefix(EmitAddrSizeOverridePrefix) { |
+ assert(Traits::Is64Bit || !EmitAddrSizeOverridePrefix); |
} |
public: |
@@ -288,6 +287,8 @@ public: |
static const intptr_t kCallExternalLabelSize = 5; |
void pushl(GPRRegister reg); |
+ void pushl(const Immediate &Imm); |
+ void pushl(const ConstantRelocatable *Label); |
void popl(GPRRegister reg); |
void popl(const Address &address); |
@@ -711,6 +712,11 @@ protected: |
private: |
ENABLE_MAKE_UNIQUE; |
+ // EmidAddrSizeOverridePrefix directs the emission of the 0x67 prefix to |
+ // force 32-bit registers when accessing memory. This is only used in native |
+ // 64-bit. |
+ const bool EmitAddrSizeOverridePrefix; |
+ |
static constexpr Type RexTypeIrrelevant = IceType_i32; |
static constexpr Type RexTypeForceRexW = IceType_i64; |
static constexpr GPRRegister RexRegIrrelevant = |
@@ -746,7 +752,7 @@ private: |
Label *getOrCreateLabel(SizeT Number, LabelVector &Labels); |
void emitAddrSizeOverridePrefix() { |
- if (!Traits::Is64Bit) { |
+ if (!Traits::Is64Bit || !EmitAddrSizeOverridePrefix) { |
return; |
} |
static constexpr uint8_t AddrSizeOverridePrefix = 0x67; |