| 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;
|
|
|