| Index: src/arm64/assembler-arm64-inl.h
|
| diff --git a/src/arm64/assembler-arm64-inl.h b/src/arm64/assembler-arm64-inl.h
|
| index 2400f579665aae96db1d6ce285b063f6a6277b43..135858d8b1c1d9c43ee281c5a00b1c1bbb39efdf 100644
|
| --- a/src/arm64/assembler-arm64-inl.h
|
| +++ b/src/arm64/assembler-arm64-inl.h
|
| @@ -261,29 +261,23 @@ inline FPRegister CPURegister::D() const {
|
| }
|
|
|
|
|
| -// Operand.
|
| -template<typename T>
|
| -Operand::Operand(Handle<T> value) : reg_(NoReg) {
|
| - initialize_handle(value);
|
| -}
|
| -
|
| -
|
| +// Immediate.
|
| // Default initializer is for int types
|
| -template<typename int_t>
|
| -struct OperandInitializer {
|
| +template<typename T>
|
| +struct ImmediateInitializer {
|
| static const bool kIsIntType = true;
|
| - static inline RelocInfo::Mode rmode_for(int_t) {
|
| - return sizeof(int_t) == 8 ? RelocInfo::NONE64 : RelocInfo::NONE32;
|
| + static inline RelocInfo::Mode rmode_for(T) {
|
| + return sizeof(T) == 8 ? RelocInfo::NONE64 : RelocInfo::NONE32;
|
| }
|
| - static inline int64_t immediate_for(int_t t) {
|
| - STATIC_ASSERT(sizeof(int_t) <= 8);
|
| + static inline int64_t immediate_for(T t) {
|
| + STATIC_ASSERT(sizeof(T) <= 8);
|
| return t;
|
| }
|
| };
|
|
|
|
|
| template<>
|
| -struct OperandInitializer<Smi*> {
|
| +struct ImmediateInitializer<Smi*> {
|
| static const bool kIsIntType = false;
|
| static inline RelocInfo::Mode rmode_for(Smi* t) {
|
| return RelocInfo::NONE64;
|
| @@ -295,7 +289,7 @@ struct OperandInitializer<Smi*> {
|
|
|
|
|
| template<>
|
| -struct OperandInitializer<ExternalReference> {
|
| +struct ImmediateInitializer<ExternalReference> {
|
| static const bool kIsIntType = false;
|
| static inline RelocInfo::Mode rmode_for(ExternalReference t) {
|
| return RelocInfo::EXTERNAL_REFERENCE;
|
| @@ -307,27 +301,46 @@ struct OperandInitializer<ExternalReference> {
|
|
|
|
|
| template<typename T>
|
| -Operand::Operand(T t)
|
| - : immediate_(OperandInitializer<T>::immediate_for(t)),
|
| - reg_(NoReg),
|
| - rmode_(OperandInitializer<T>::rmode_for(t)) {}
|
| +Immediate::Immediate(Handle<T> value) {
|
| + InitializeHandle(value);
|
| +}
|
|
|
|
|
| template<typename T>
|
| -Operand::Operand(T t, RelocInfo::Mode rmode)
|
| - : immediate_(OperandInitializer<T>::immediate_for(t)),
|
| - reg_(NoReg),
|
| +Immediate::Immediate(T t)
|
| + : value_(ImmediateInitializer<T>::immediate_for(t)),
|
| + rmode_(ImmediateInitializer<T>::rmode_for(t)) {}
|
| +
|
| +
|
| +template<typename T>
|
| +Immediate::Immediate(T t, RelocInfo::Mode rmode)
|
| + : value_(ImmediateInitializer<T>::immediate_for(t)),
|
| rmode_(rmode) {
|
| - STATIC_ASSERT(OperandInitializer<T>::kIsIntType);
|
| + STATIC_ASSERT(ImmediateInitializer<T>::kIsIntType);
|
| }
|
|
|
|
|
| +// Operand.
|
| +template<typename T>
|
| +Operand::Operand(Handle<T> value) : immediate_(value), reg_(NoReg) {}
|
| +
|
| +
|
| +template<typename T>
|
| +Operand::Operand(T t) : immediate_(t), reg_(NoReg) {}
|
| +
|
| +
|
| +template<typename T>
|
| +Operand::Operand(T t, RelocInfo::Mode rmode)
|
| + : immediate_(t, rmode),
|
| + reg_(NoReg) {}
|
| +
|
| +
|
| Operand::Operand(Register reg, Shift shift, unsigned shift_amount)
|
| - : reg_(reg),
|
| + : immediate_(0),
|
| + reg_(reg),
|
| shift_(shift),
|
| extend_(NO_EXTEND),
|
| - shift_amount_(shift_amount),
|
| - rmode_(reg.Is64Bits() ? RelocInfo::NONE64 : RelocInfo::NONE32) {
|
| + shift_amount_(shift_amount) {
|
| ASSERT(reg.Is64Bits() || (shift_amount < kWRegSizeInBits));
|
| ASSERT(reg.Is32Bits() || (shift_amount < kXRegSizeInBits));
|
| ASSERT(!reg.IsSP());
|
| @@ -335,11 +348,11 @@ Operand::Operand(Register reg, Shift shift, unsigned shift_amount)
|
|
|
|
|
| Operand::Operand(Register reg, Extend extend, unsigned shift_amount)
|
| - : reg_(reg),
|
| + : immediate_(0),
|
| + reg_(reg),
|
| shift_(NO_SHIFT),
|
| extend_(extend),
|
| - shift_amount_(shift_amount),
|
| - rmode_(reg.Is64Bits() ? RelocInfo::NONE64 : RelocInfo::NONE32) {
|
| + shift_amount_(shift_amount) {
|
| ASSERT(reg.IsValid());
|
| ASSERT(shift_amount <= 4);
|
| ASSERT(!reg.IsSP());
|
| @@ -366,7 +379,7 @@ bool Operand::IsExtendedRegister() const {
|
|
|
| bool Operand::IsZero() const {
|
| if (IsImmediate()) {
|
| - return immediate() == 0;
|
| + return ImmediateValue() == 0;
|
| } else {
|
| return reg().IsZero();
|
| }
|
| @@ -380,12 +393,18 @@ Operand Operand::ToExtendedRegister() const {
|
| }
|
|
|
|
|
| -int64_t Operand::immediate() const {
|
| +Immediate Operand::immediate() const {
|
| ASSERT(IsImmediate());
|
| return immediate_;
|
| }
|
|
|
|
|
| +int64_t Operand::ImmediateValue() const {
|
| + ASSERT(IsImmediate());
|
| + return immediate_.value();
|
| +}
|
| +
|
| +
|
| Register Operand::reg() const {
|
| ASSERT(IsShiftedRegister() || IsExtendedRegister());
|
| return reg_;
|
| @@ -473,7 +492,7 @@ MemOperand::MemOperand(Register base, const Operand& offset, AddrMode addrmode)
|
| ASSERT(base.Is64Bits() && !base.IsZero());
|
|
|
| if (offset.IsImmediate()) {
|
| - offset_ = offset.immediate();
|
| + offset_ = offset.ImmediateValue();
|
|
|
| regoffset_ = NoReg;
|
| } else if (offset.IsShiftedRegister()) {
|
| @@ -944,6 +963,16 @@ LoadStorePairNonTemporalOp Assembler::StorePairNonTemporalOpFor(
|
| }
|
|
|
|
|
| +LoadLiteralOp Assembler::LoadLiteralOpFor(const CPURegister& rt) {
|
| + if (rt.IsRegister()) {
|
| + return rt.Is64Bits() ? LDR_x_lit : LDR_w_lit;
|
| + } else {
|
| + ASSERT(rt.IsFPRegister());
|
| + return rt.Is64Bits() ? LDR_d_lit : LDR_s_lit;
|
| + }
|
| +}
|
| +
|
| +
|
| int Assembler::LinkAndGetInstructionOffsetTo(Label* label) {
|
| ASSERT(kStartOfLabelLinkChain == 0);
|
| int offset = LinkAndGetByteOffsetTo(label);
|
| @@ -1200,11 +1229,6 @@ const Register& Assembler::AppropriateZeroRegFor(const CPURegister& reg) const {
|
| }
|
|
|
|
|
| -void Assembler::LoadRelocated(const CPURegister& rt, const Operand& operand) {
|
| - LoadRelocatedValue(rt, operand, LDR_x_lit);
|
| -}
|
| -
|
| -
|
| inline void Assembler::CheckBufferSpace() {
|
| ASSERT(pc_ < (buffer_ + buffer_size_));
|
| if (buffer_space() < kGap) {
|
|
|