Index: src/IceTargetLoweringX8664Traits.h |
diff --git a/src/IceTargetLoweringX8664Traits.h b/src/IceTargetLoweringX8664Traits.h |
index bfa0231892d6111091184aee1d6247557278ba97..db8c098f09296995768cabda1a31aa56b2b801d6 100644 |
--- a/src/IceTargetLoweringX8664Traits.h |
+++ b/src/IceTargetLoweringX8664Traits.h |
@@ -89,18 +89,15 @@ struct TargetX8664Traits { |
RexB = RexBase | (1 << 0), |
}; |
- Operand(const Operand &other) |
- : fixup_(other.fixup_), rex_(other.rex_), length_(other.length_) { |
- memmove(&encoding_[0], &other.encoding_[0], other.length_); |
- } |
+ protected: |
+ // Needed by subclass Address. |
+ Operand() = default; |
- Operand &operator=(const Operand &other) { |
- length_ = other.length_; |
- fixup_ = other.fixup_; |
- rex_ = other.rex_; |
- memmove(&encoding_[0], &other.encoding_[0], other.length_); |
- return *this; |
- } |
+ public: |
+ Operand(const Operand &) = default; |
+ Operand(Operand &&) = default; |
+ Operand &operator=(const Operand &) = default; |
+ Operand &operator=(Operand &&) = default; |
uint8_t mod() const { return (encoding_at(0) >> 6) & 3; } |
@@ -131,19 +128,9 @@ struct TargetX8664Traits { |
return static_cast<int8_t>(encoding_[length_ - 1]); |
} |
- int32_t disp32() const { |
- assert(length_ >= 5); |
- // TODO(stichnot): This method is not currently used. Delete it along |
- // with other unused methods, or use a safe version of bitCopy(). |
- llvm::report_fatal_error("Unexpected call to disp32()"); |
- // return Utils::bitCopy<int32_t>(encoding_[length_ - 4]); |
- } |
- |
AssemblerFixup *fixup() const { return fixup_; } |
protected: |
- Operand() : fixup_(nullptr), length_(0) {} // Needed by subclass Address. |
- |
void SetModRM(int mod, GPRRegister rm) { |
assert((mod & ~3) == 0); |
encoding_[0] = (mod << 6) | (rm & 0x07); |
@@ -175,10 +162,10 @@ struct TargetX8664Traits { |
void SetFixup(AssemblerFixup *fixup) { fixup_ = fixup; } |
private: |
- AssemblerFixup *fixup_; |
+ AssemblerFixup *fixup_ = nullptr; |
uint8_t rex_ = 0; |
uint8_t encoding_[6]; |
- uint8_t length_; |
+ uint8_t length_ = 0; |
explicit Operand(GPRRegister reg) : fixup_(nullptr) { SetModRM(3, reg); } |
@@ -201,31 +188,29 @@ struct TargetX8664Traits { |
}; |
class Address : public Operand { |
- Address() = delete; |
+ Address() = default; |
public: |
- Address(const Address &other) : Operand(other) {} |
- |
- Address &operator=(const Address &other) { |
- Operand::operator=(other); |
- return *this; |
- } |
+ Address(const Address &) = default; |
+ Address(Address &&) = default; |
+ Address &operator=(const Address &) = default; |
+ Address &operator=(Address &&) = default; |
Address(GPRRegister Base, int32_t Disp, AssemblerFixup *Fixup) { |
if (Fixup == nullptr && Disp == 0 && |
- (Base & 7) != RegX8664::Encoded_Reg_ebp) { |
+ (Base & 7) != RegX8664::Encoded_Reg_rbp) { |
SetModRM(0, Base); |
- if ((Base & 7) == RegX8664::Encoded_Reg_esp) |
- SetSIB(TIMES_1, RegX8664::Encoded_Reg_esp, Base); |
+ if ((Base & 7) == RegX8664::Encoded_Reg_rsp) |
+ SetSIB(TIMES_1, RegX8664::Encoded_Reg_rsp, 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); |
+ if ((Base & 7) == RegX8664::Encoded_Reg_rsp) |
+ SetSIB(TIMES_1, RegX8664::Encoded_Reg_rsp, Base); |
SetDisp8(Disp); |
} else { |
SetModRM(2, Base); |
- if ((Base & 7) == RegX8664::Encoded_Reg_esp) |
- SetSIB(TIMES_1, RegX8664::Encoded_Reg_esp, Base); |
+ if ((Base & 7) == RegX8664::Encoded_Reg_rsp) |
+ SetSIB(TIMES_1, RegX8664::Encoded_Reg_rsp, Base); |
SetDisp32(Disp); |
if (Fixup) |
SetFixup(Fixup); |
@@ -234,9 +219,9 @@ struct TargetX8664Traits { |
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); |
+ assert(Index != RegX8664::Encoded_Reg_rsp); // Illegal addressing mode. |
+ SetModRM(0, RegX8664::Encoded_Reg_rsp); |
+ SetSIB(Scale, Index, RegX8664::Encoded_Reg_rbp); |
SetDisp32(Disp); |
if (Fixup) |
SetFixup(Fixup); |
@@ -244,17 +229,17 @@ struct TargetX8664Traits { |
Address(GPRRegister Base, GPRRegister Index, ScaleFactor Scale, |
int32_t Disp, AssemblerFixup *Fixup) { |
- assert(Index != RegX8664::Encoded_Reg_esp); // Illegal addressing mode. |
+ assert(Index != RegX8664::Encoded_Reg_rsp); // Illegal addressing mode. |
if (Fixup == nullptr && Disp == 0 && |
- (Base & 7) != RegX8664::Encoded_Reg_ebp) { |
- SetModRM(0, RegX8664::Encoded_Reg_esp); |
+ (Base & 7) != RegX8664::Encoded_Reg_rbp) { |
+ SetModRM(0, RegX8664::Encoded_Reg_rsp); |
SetSIB(Scale, Index, Base); |
} else if (Fixup == nullptr && Utils::IsInt(8, Disp)) { |
- SetModRM(1, RegX8664::Encoded_Reg_esp); |
+ SetModRM(1, RegX8664::Encoded_Reg_rsp); |
SetSIB(Scale, Index, Base); |
SetDisp8(Disp); |
} else { |
- SetModRM(2, RegX8664::Encoded_Reg_esp); |
+ SetModRM(2, RegX8664::Encoded_Reg_rsp); |
SetSIB(Scale, Index, Base); |
SetDisp32(Disp); |
if (Fixup) |
@@ -263,23 +248,25 @@ struct TargetX8664Traits { |
} |
/// Generate a RIP-relative address expression on x86-64. |
- Address(RelocOffsetT Offset, AssemblerFixup *Fixup) { |
- SetModRM(0x0, RegX8664::Encoded_Reg_esp); |
+ static Address RipRelative(RelocOffsetT Offset, AssemblerFixup *Fixup) { |
+ assert(Fixup == nullptr || Fixup->kind() == FK_PcRel); |
+ Address NewAddress; |
+ NewAddress.SetModRM(0x0, RegX8664::Encoded_Reg_rbp); |
- static constexpr ScaleFactor Scale = TIMES_1; |
- SetSIB(Scale, RegX8664::Encoded_Reg_esp, 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); |
+ NewAddress.SetDisp32(Offset); |
if (Fixup) |
- SetFixup(Fixup); |
+ NewAddress.SetFixup(Fixup); |
+ |
+ return NewAddress; |
} |
static Address ofConstPool(Assembler *Asm, const Constant *Imm) { |
// TODO(jpp): ??? |
AssemblerFixup *Fixup = Asm->createFixup(FK_Abs, Imm); |
const RelocOffsetT Offset = 4; |
- return Address(Offset, Fixup); |
+ return Address::RipRelative(Offset, Fixup); |
} |
}; |