| Index: runtime/vm/assembler_arm64.h
|
| diff --git a/runtime/vm/assembler_arm64.h b/runtime/vm/assembler_arm64.h
|
| index 4ef4f9582af6adf45b4f1da6aea79b7e88dab9bb..f87f76d3bcd95b33e2a62cc19a5181a6d4736db4 100644
|
| --- a/runtime/vm/assembler_arm64.h
|
| +++ b/runtime/vm/assembler_arm64.h
|
| @@ -25,9 +25,9 @@ class StubEntry;
|
|
|
| class Immediate : public ValueObject {
|
| public:
|
| - explicit Immediate(int64_t value) : value_(value) { }
|
| + explicit Immediate(int64_t value) : value_(value) {}
|
|
|
| - Immediate(const Immediate& other) : ValueObject(), value_(other.value_) { }
|
| + Immediate(const Immediate& other) : ValueObject(), value_(other.value_) {}
|
| Immediate& operator=(const Immediate& other) {
|
| value_ = other.value_;
|
| return *this;
|
| @@ -44,7 +44,7 @@ class Immediate : public ValueObject {
|
|
|
| class Label : public ValueObject {
|
| public:
|
| - Label() : position_(0) { }
|
| + Label() : position_(0) {}
|
|
|
| ~Label() {
|
| // Assert if label is being destroyed with unresolved branches pending.
|
| @@ -65,9 +65,7 @@ class Label : public ValueObject {
|
| private:
|
| intptr_t position_;
|
|
|
| - void Reinitialize() {
|
| - position_ = 0;
|
| - }
|
| + void Reinitialize() { position_ = 0; }
|
|
|
| void BindTo(intptr_t position) {
|
| ASSERT(!IsBound());
|
| @@ -92,8 +90,7 @@ class Address : public ValueObject {
|
| : ValueObject(),
|
| encoding_(other.encoding_),
|
| type_(other.type_),
|
| - base_(other.base_) {
|
| - }
|
| + base_(other.base_) {}
|
|
|
| Address& operator=(const Address& other) {
|
| encoding_ = other.encoding_;
|
| @@ -118,31 +115,26 @@ class Address : public ValueObject {
|
| // operand size, and assert that offset is aligned accordingly.
|
| // For the smaller signed imm9 case, the offset is the number of bytes, but
|
| // is unscaled.
|
| - Address(Register rn, int32_t offset = 0, AddressType at = Offset,
|
| + Address(Register rn,
|
| + int32_t offset = 0,
|
| + AddressType at = Offset,
|
| OperandSize sz = kDoubleWord) {
|
| ASSERT((rn != kNoRegister) && (rn != R31) && (rn != ZR));
|
| ASSERT(CanHoldOffset(offset, at, sz));
|
| const Register crn = ConcreteRegister(rn);
|
| const int32_t scale = Log2OperandSizeBytes(sz);
|
| - if ((at == Offset) &&
|
| - Utils::IsUint(12 + scale, offset) &&
|
| + if ((at == Offset) && Utils::IsUint(12 + scale, offset) &&
|
| (offset == ((offset >> scale) << scale))) {
|
| - encoding_ =
|
| - B24 |
|
| - ((offset >> scale) << kImm12Shift) |
|
| - (static_cast<int32_t>(crn) << kRnShift);
|
| - } else if ((at == Offset) &&
|
| - Utils::IsInt(9, offset)) {
|
| - encoding_ =
|
| - ((offset & 0x1ff) << kImm9Shift) |
|
| - (static_cast<int32_t>(crn) << kRnShift);
|
| + encoding_ = B24 | ((offset >> scale) << kImm12Shift) |
|
| + (static_cast<int32_t>(crn) << kRnShift);
|
| + } else if ((at == Offset) && Utils::IsInt(9, offset)) {
|
| + encoding_ = ((offset & 0x1ff) << kImm9Shift) |
|
| + (static_cast<int32_t>(crn) << kRnShift);
|
| } else if ((at == PreIndex) || (at == PostIndex)) {
|
| ASSERT(Utils::IsInt(9, offset));
|
| int32_t idx = (at == PostIndex) ? B10 : (B11 | B10);
|
| - encoding_ =
|
| - idx |
|
| - ((offset & 0x1ff) << kImm9Shift) |
|
| - (static_cast<int32_t>(crn) << kRnShift);
|
| + encoding_ = idx | ((offset & 0x1ff) << kImm9Shift) |
|
| + (static_cast<int32_t>(crn) << kRnShift);
|
| } else {
|
| ASSERT((at == PairOffset) || (at == PairPreIndex) ||
|
| (at == PairPostIndex));
|
| @@ -150,25 +142,34 @@ class Address : public ValueObject {
|
| (offset == ((offset >> scale) << scale)));
|
| int32_t idx = 0;
|
| switch (at) {
|
| - case PairPostIndex: idx = B23; break;
|
| - case PairPreIndex: idx = B24 | B23; break;
|
| - case PairOffset: idx = B24; break;
|
| - default: UNREACHABLE(); break;
|
| + case PairPostIndex:
|
| + idx = B23;
|
| + break;
|
| + case PairPreIndex:
|
| + idx = B24 | B23;
|
| + break;
|
| + case PairOffset:
|
| + idx = B24;
|
| + break;
|
| + default:
|
| + UNREACHABLE();
|
| + break;
|
| }
|
| - encoding_ =
|
| - idx |
|
| - (((offset >> scale) << kImm7Shift) & kImm7Mask) |
|
| - (static_cast<int32_t>(crn) << kRnShift);
|
| + encoding_ = idx | (((offset >> scale) << kImm7Shift) & kImm7Mask) |
|
| + (static_cast<int32_t>(crn) << kRnShift);
|
| }
|
| type_ = at;
|
| base_ = crn;
|
| }
|
|
|
| // This addressing mode does not exist.
|
| - Address(Register rn, Register offset, AddressType at,
|
| + Address(Register rn,
|
| + Register offset,
|
| + AddressType at,
|
| OperandSize sz = kDoubleWord);
|
|
|
| - static bool CanHoldOffset(int32_t offset, AddressType at = Offset,
|
| + static bool CanHoldOffset(int32_t offset,
|
| + AddressType at = Offset,
|
| OperandSize sz = kDoubleWord) {
|
| if (at == Offset) {
|
| // Offset fits in 12 bit unsigned and has right alignment for sz,
|
| @@ -178,8 +179,7 @@ class Address : public ValueObject {
|
| (offset == ((offset >> scale) << scale))) ||
|
| (Utils::IsInt(9, offset));
|
| } else if (at == PCOffset) {
|
| - return Utils::IsInt(21, offset) &&
|
| - (offset == ((offset >> 2) << 2));
|
| + return Utils::IsInt(21, offset) && (offset == ((offset >> 2) << 2));
|
| } else if ((at == PreIndex) || (at == PostIndex)) {
|
| return Utils::IsInt(9, offset);
|
| } else {
|
| @@ -219,8 +219,10 @@ class Address : public ValueObject {
|
| // Base register rn with offset rm. rm is sign-extended according to ext.
|
| // If ext is UXTX, rm may be optionally scaled by the
|
| // Log2OperandSize (specified by the instruction).
|
| - Address(Register rn, Register rm,
|
| - Extend ext = UXTX, Scaling scale = Unscaled) {
|
| + Address(Register rn,
|
| + Register rm,
|
| + Extend ext = UXTX,
|
| + Scaling scale = Unscaled) {
|
| ASSERT((rn != R31) && (rn != ZR));
|
| ASSERT((rm != R31) && (rm != CSP));
|
| // Can only scale when ext = UXTX.
|
| @@ -229,11 +231,9 @@ class Address : public ValueObject {
|
| const Register crn = ConcreteRegister(rn);
|
| const Register crm = ConcreteRegister(rm);
|
| const int32_t s = (scale == Scaled) ? B12 : 0;
|
| - encoding_ =
|
| - B21 | B11 | s |
|
| - (static_cast<int32_t>(crn) << kRnShift) |
|
| - (static_cast<int32_t>(crm) << kRmShift) |
|
| - (static_cast<int32_t>(ext) << kExtendTypeShift);
|
| + encoding_ = B21 | B11 | s | (static_cast<int32_t>(crn) << kRnShift) |
|
| + (static_cast<int32_t>(crm) << kRmShift) |
|
| + (static_cast<int32_t>(ext) << kExtendTypeShift);
|
| type_ = Reg;
|
| base_ = crn;
|
| }
|
| @@ -303,12 +303,12 @@ class Address : public ValueObject {
|
| class FieldAddress : public Address {
|
| public:
|
| FieldAddress(Register base, int32_t disp, OperandSize sz = kDoubleWord)
|
| - : Address(base, disp - kHeapObjectTag, Offset, sz) { }
|
| + : Address(base, disp - kHeapObjectTag, Offset, sz) {}
|
|
|
| // This addressing mode does not exist.
|
| FieldAddress(Register base, Register disp, OperandSize sz = kDoubleWord);
|
|
|
| - FieldAddress(const FieldAddress& other) : Address(other) { }
|
| + FieldAddress(const FieldAddress& other) : Address(other) {}
|
|
|
| FieldAddress& operator=(const FieldAddress& other) {
|
| Address::operator=(other);
|
| @@ -328,11 +328,11 @@ class Operand : public ValueObject {
|
| };
|
|
|
| // Data-processing operand - Uninitialized.
|
| - Operand() : encoding_(-1), type_(Unknown) { }
|
| + Operand() : encoding_(-1), type_(Unknown) {}
|
|
|
| // Data-processing operands - Copy constructor.
|
| Operand(const Operand& other)
|
| - : ValueObject(), encoding_(other.encoding_), type_(other.type_) { }
|
| + : ValueObject(), encoding_(other.encoding_), type_(other.type_) {}
|
|
|
| Operand& operator=(const Operand& other) {
|
| type_ = other.type_;
|
| @@ -351,10 +351,8 @@ class Operand : public ValueObject {
|
| ASSERT(Utils::IsUint(6, imm));
|
| ASSERT((rm != R31) && (rm != CSP));
|
| const Register crm = ConcreteRegister(rm);
|
| - encoding_ =
|
| - (imm << kImm6Shift) |
|
| - (static_cast<int32_t>(crm) << kRmShift) |
|
| - (static_cast<int32_t>(shift) << kShiftTypeShift);
|
| + encoding_ = (imm << kImm6Shift) | (static_cast<int32_t>(crm) << kRmShift) |
|
| + (static_cast<int32_t>(shift) << kShiftTypeShift);
|
| type_ = Shifted;
|
| }
|
|
|
| @@ -365,11 +363,9 @@ class Operand : public ValueObject {
|
| ASSERT(Utils::IsUint(3, imm));
|
| ASSERT((rm != R31) && (rm != CSP));
|
| const Register crm = ConcreteRegister(rm);
|
| - encoding_ =
|
| - B21 |
|
| - (static_cast<int32_t>(crm) << kRmShift) |
|
| - (static_cast<int32_t>(extend) << kExtendTypeShift) |
|
| - ((imm & 0x7) << kImm3Shift);
|
| + encoding_ = B21 | (static_cast<int32_t>(crm) << kRmShift) |
|
| + (static_cast<int32_t>(extend) << kExtendTypeShift) |
|
| + ((imm & 0x7) << kImm3Shift);
|
| type_ = Extended;
|
| }
|
|
|
| @@ -395,10 +391,9 @@ class Operand : public ValueObject {
|
| ASSERT((n == 1) || (n == 0));
|
| ASSERT(Utils::IsUint(6, imm_s) && Utils::IsUint(6, imm_r));
|
| type_ = BitfieldImm;
|
| - encoding_ =
|
| - (static_cast<int32_t>(n) << kNShift) |
|
| - (static_cast<int32_t>(imm_s) << kImmSShift) |
|
| - (static_cast<int32_t>(imm_r) << kImmRShift);
|
| + encoding_ = (static_cast<int32_t>(n) << kNShift) |
|
| + (static_cast<int32_t>(imm_s) << kImmSShift) |
|
| + (static_cast<int32_t>(imm_r) << kImmRShift);
|
| }
|
|
|
| // Test if a given value can be encoded in the immediate field of a logical
|
| @@ -434,12 +429,8 @@ class Operand : public ValueObject {
|
| }
|
|
|
| private:
|
| - uint32_t encoding() const {
|
| - return encoding_;
|
| - }
|
| - OperandType type() const {
|
| - return type_;
|
| - }
|
| + uint32_t encoding() const { return encoding_; }
|
| + OperandType type() const { return type_; }
|
|
|
| uint32_t encoding_;
|
| OperandType type_;
|
| @@ -451,11 +442,9 @@ class Operand : public ValueObject {
|
| class Assembler : public ValueObject {
|
| public:
|
| explicit Assembler(bool use_far_branches = false);
|
| - ~Assembler() { }
|
| + ~Assembler() {}
|
|
|
| - void PopRegister(Register r) {
|
| - Pop(r);
|
| - }
|
| + void PopRegister(Register r) { Pop(r); }
|
|
|
| void Drop(intptr_t stack_elements) {
|
| add(SP, SP, Operand(stack_elements * kWordSize));
|
| @@ -488,9 +477,7 @@ class Assembler : public ValueObject {
|
| return FLAG_use_far_branches || use_far_branches_;
|
| }
|
|
|
| - void set_use_far_branches(bool b) {
|
| - use_far_branches_ = b;
|
| - }
|
| + void set_use_far_branches(bool b) { use_far_branches_ = b; }
|
|
|
| void FinalizeInstructions(const MemoryRegion& region) {
|
| buffer_.FinalizeInstructions(region);
|
| @@ -592,9 +579,7 @@ class Assembler : public ValueObject {
|
| }
|
|
|
| // PC relative immediate add. imm is in bytes.
|
| - void adr(Register rd, const Immediate& imm) {
|
| - EmitPCRelOp(ADR, rd, imm);
|
| - }
|
| + void adr(Register rd, const Immediate& imm) { EmitPCRelOp(ADR, rd, imm); }
|
|
|
| // Logical immediate operations.
|
| void andi(Register rd, Register rn, const Immediate& imm) {
|
| @@ -800,13 +785,9 @@ class Assembler : public ValueObject {
|
| // rn cmp o.
|
| // For add and sub, to use CSP for rn, o must be of type Operand::Extend.
|
| // For an unmodified rm in this case, use Operand(rm, UXTX, 0);
|
| - void cmp(Register rn, Operand o) {
|
| - subs(ZR, rn, o);
|
| - }
|
| + void cmp(Register rn, Operand o) { subs(ZR, rn, o); }
|
| // rn cmp -o.
|
| - void cmn(Register rn, Operand o) {
|
| - adds(ZR, rn, o);
|
| - }
|
| + void cmn(Register rn, Operand o) { adds(ZR, rn, o); }
|
|
|
| void CompareRegisters(Register rn, Register rm) {
|
| if (rn == CSP) {
|
| @@ -823,12 +804,8 @@ class Assembler : public ValueObject {
|
| EmitConditionalBranch(BCOND, cond, label);
|
| }
|
|
|
| - void b(int32_t offset) {
|
| - EmitUnconditionalBranchOp(B, offset);
|
| - }
|
| - void bl(int32_t offset) {
|
| - EmitUnconditionalBranchOp(BL, offset);
|
| - }
|
| + void b(int32_t offset) { EmitUnconditionalBranchOp(B, offset); }
|
| + void bl(int32_t offset) { EmitUnconditionalBranchOp(BL, offset); }
|
|
|
| void cbz(Label* label, Register rt, OperandSize sz = kDoubleWord) {
|
| EmitCompareAndBranch(CBZ, rt, label, sz);
|
| @@ -839,20 +816,12 @@ class Assembler : public ValueObject {
|
| }
|
|
|
| // Branch, link, return.
|
| - void br(Register rn) {
|
| - EmitUnconditionalBranchRegOp(BR, rn);
|
| - }
|
| - void blr(Register rn) {
|
| - EmitUnconditionalBranchRegOp(BLR, rn);
|
| - }
|
| - void ret(Register rn = R30) {
|
| - EmitUnconditionalBranchRegOp(RET, rn);
|
| - }
|
| + void br(Register rn) { EmitUnconditionalBranchRegOp(BR, rn); }
|
| + void blr(Register rn) { EmitUnconditionalBranchRegOp(BLR, rn); }
|
| + void ret(Register rn = R30) { EmitUnconditionalBranchRegOp(RET, rn); }
|
|
|
| // Breakpoint.
|
| - void brk(uint16_t imm) {
|
| - EmitExceptionGenOp(BRK, imm);
|
| - }
|
| + void brk(uint16_t imm) { EmitExceptionGenOp(BRK, imm); }
|
|
|
| static uword GetBreakInstructionFiller() {
|
| const intptr_t encoding = ExceptionGenOpEncoding(BRK, 0);
|
| @@ -904,24 +873,12 @@ class Assembler : public ValueObject {
|
| const Register crd = ConcreteRegister(rd);
|
| EmitFPIntCvtOp(FCVTZDS, crd, static_cast<Register>(vn));
|
| }
|
| - void fmovdd(VRegister vd, VRegister vn) {
|
| - EmitFPOneSourceOp(FMOVDD, vd, vn);
|
| - }
|
| - void fabsd(VRegister vd, VRegister vn) {
|
| - EmitFPOneSourceOp(FABSD, vd, vn);
|
| - }
|
| - void fnegd(VRegister vd, VRegister vn) {
|
| - EmitFPOneSourceOp(FNEGD, vd, vn);
|
| - }
|
| - void fsqrtd(VRegister vd, VRegister vn) {
|
| - EmitFPOneSourceOp(FSQRTD, vd, vn);
|
| - }
|
| - void fcvtsd(VRegister vd, VRegister vn) {
|
| - EmitFPOneSourceOp(FCVTSD, vd, vn);
|
| - }
|
| - void fcvtds(VRegister vd, VRegister vn) {
|
| - EmitFPOneSourceOp(FCVTDS, vd, vn);
|
| - }
|
| + void fmovdd(VRegister vd, VRegister vn) { EmitFPOneSourceOp(FMOVDD, vd, vn); }
|
| + void fabsd(VRegister vd, VRegister vn) { EmitFPOneSourceOp(FABSD, vd, vn); }
|
| + void fnegd(VRegister vd, VRegister vn) { EmitFPOneSourceOp(FNEGD, vd, vn); }
|
| + void fsqrtd(VRegister vd, VRegister vn) { EmitFPOneSourceOp(FSQRTD, vd, vn); }
|
| + void fcvtsd(VRegister vd, VRegister vn) { EmitFPOneSourceOp(FCVTSD, vd, vn); }
|
| + void fcvtds(VRegister vd, VRegister vn) { EmitFPOneSourceOp(FCVTDS, vd, vn); }
|
| void fldrq(VRegister vt, Address a) {
|
| ASSERT(a.type() != Address::PCOffset);
|
| EmitLoadStoreReg(FLDRQ, static_cast<Register>(vt), a, kByte);
|
| @@ -946,12 +903,8 @@ class Assembler : public ValueObject {
|
| ASSERT(a.type() != Address::PCOffset);
|
| EmitLoadStoreReg(FSTR, static_cast<Register>(vt), a, kSWord);
|
| }
|
| - void fcmpd(VRegister vn, VRegister vm) {
|
| - EmitFPCompareOp(FCMPD, vn, vm);
|
| - }
|
| - void fcmpdz(VRegister vn) {
|
| - EmitFPCompareOp(FCMPZD, vn, V0);
|
| - }
|
| + void fcmpd(VRegister vn, VRegister vm) { EmitFPCompareOp(FCMPD, vn, vm); }
|
| + void fcmpdz(VRegister vn) { EmitFPCompareOp(FCMPZD, vn, V0); }
|
| void fmuld(VRegister vd, VRegister vn, VRegister vm) {
|
| EmitFPTwoSourceOp(FMULD, vd, vn, vm);
|
| }
|
| @@ -1047,27 +1000,13 @@ class Assembler : public ValueObject {
|
| void vrsqrtss(VRegister vd, VRegister vn, VRegister vm) {
|
| EmitSIMDThreeSameOp(VRSQRTSS, vd, vn, vm);
|
| }
|
| - void vnot(VRegister vd, VRegister vn) {
|
| - EmitSIMDTwoRegOp(VNOT, vd, vn);
|
| - }
|
| - void vabss(VRegister vd, VRegister vn) {
|
| - EmitSIMDTwoRegOp(VABSS, vd, vn);
|
| - }
|
| - void vabsd(VRegister vd, VRegister vn) {
|
| - EmitSIMDTwoRegOp(VABSD, vd, vn);
|
| - }
|
| - void vnegs(VRegister vd, VRegister vn) {
|
| - EmitSIMDTwoRegOp(VNEGS, vd, vn);
|
| - }
|
| - void vnegd(VRegister vd, VRegister vn) {
|
| - EmitSIMDTwoRegOp(VNEGD, vd, vn);
|
| - }
|
| - void vsqrts(VRegister vd, VRegister vn) {
|
| - EmitSIMDTwoRegOp(VSQRTS, vd, vn);
|
| - }
|
| - void vsqrtd(VRegister vd, VRegister vn) {
|
| - EmitSIMDTwoRegOp(VSQRTD, vd, vn);
|
| - }
|
| + void vnot(VRegister vd, VRegister vn) { EmitSIMDTwoRegOp(VNOT, vd, vn); }
|
| + void vabss(VRegister vd, VRegister vn) { EmitSIMDTwoRegOp(VABSS, vd, vn); }
|
| + void vabsd(VRegister vd, VRegister vn) { EmitSIMDTwoRegOp(VABSD, vd, vn); }
|
| + void vnegs(VRegister vd, VRegister vn) { EmitSIMDTwoRegOp(VNEGS, vd, vn); }
|
| + void vnegd(VRegister vd, VRegister vn) { EmitSIMDTwoRegOp(VNEGD, vd, vn); }
|
| + void vsqrts(VRegister vd, VRegister vn) { EmitSIMDTwoRegOp(VSQRTS, vd, vn); }
|
| + void vsqrtd(VRegister vd, VRegister vn) { EmitSIMDTwoRegOp(VSQRTD, vd, vn); }
|
| void vrecpes(VRegister vd, VRegister vn) {
|
| EmitSIMDTwoRegOp(VRECPES, vd, vn);
|
| }
|
| @@ -1119,21 +1058,11 @@ class Assembler : public ValueObject {
|
| orr(rd, ZR, Operand(rn));
|
| }
|
| }
|
| - void vmov(VRegister vd, VRegister vn) {
|
| - vorr(vd, vn, vn);
|
| - }
|
| - void mvn(Register rd, Register rm) {
|
| - orn(rd, ZR, Operand(rm));
|
| - }
|
| - void neg(Register rd, Register rm) {
|
| - sub(rd, ZR, Operand(rm));
|
| - }
|
| - void negs(Register rd, Register rm) {
|
| - subs(rd, ZR, Operand(rm));
|
| - }
|
| - void mul(Register rd, Register rn, Register rm) {
|
| - madd(rd, rn, rm, ZR);
|
| - }
|
| + void vmov(VRegister vd, VRegister vn) { vorr(vd, vn, vn); }
|
| + void mvn(Register rd, Register rm) { orn(rd, ZR, Operand(rm)); }
|
| + void neg(Register rd, Register rm) { sub(rd, ZR, Operand(rm)); }
|
| + void negs(Register rd, Register rm) { subs(rd, ZR, Operand(rm)); }
|
| + void mul(Register rd, Register rn, Register rm) { madd(rd, rn, rm, ZR); }
|
| void Push(Register reg) {
|
| ASSERT(reg != PP); // Only push PP with TagAndPushPP().
|
| str(reg, Address(SP, -1 * kWordSize, Address::PreIndex));
|
| @@ -1177,8 +1106,7 @@ class Assembler : public ValueObject {
|
| COMPILE_ASSERT(CODE_REG != TMP2);
|
| // Add the heap object tag back to PP before putting it on the stack.
|
| add(TMP2, PP, Operand(kHeapObjectTag));
|
| - stp(TMP2, CODE_REG,
|
| - Address(SP, -2 * kWordSize, Address::PairPreIndex));
|
| + stp(TMP2, CODE_REG, Address(SP, -2 * kWordSize, Address::PairPreIndex));
|
| }
|
| void PopAndUntagPP() {
|
| ldr(PP, Address(SP, 1 * kWordSize, Address::PostIndex));
|
| @@ -1186,12 +1114,8 @@ class Assembler : public ValueObject {
|
| // The caller of PopAndUntagPP() must explicitly allow use of popped PP.
|
| set_constant_pool_allowed(false);
|
| }
|
| - void tst(Register rn, Operand o) {
|
| - ands(ZR, rn, o);
|
| - }
|
| - void tsti(Register rn, const Immediate& imm) {
|
| - andis(ZR, rn, imm);
|
| - }
|
| + void tst(Register rn, Operand o) { ands(ZR, rn, o); }
|
| + void tsti(Register rn, const Immediate& imm) { andis(ZR, rn, imm); }
|
|
|
| void LslImmediate(Register rd, Register rn, int shift) {
|
| add(rd, ZR, Operand(rn, LSL, shift));
|
| @@ -1206,15 +1130,11 @@ class Assembler : public ValueObject {
|
| void VRecps(VRegister vd, VRegister vn);
|
| void VRSqrts(VRegister vd, VRegister vn);
|
|
|
| - void SmiUntag(Register reg) {
|
| - AsrImmediate(reg, reg, kSmiTagSize);
|
| - }
|
| + void SmiUntag(Register reg) { AsrImmediate(reg, reg, kSmiTagSize); }
|
| void SmiUntag(Register dst, Register src) {
|
| AsrImmediate(dst, src, kSmiTagSize);
|
| }
|
| - void SmiTag(Register reg) {
|
| - LslImmediate(reg, reg, kSmiTagSize);
|
| - }
|
| + void SmiTag(Register reg) { LslImmediate(reg, reg, kSmiTagSize); }
|
| void SmiTag(Register dst, Register src) {
|
| LslImmediate(dst, src, kSmiTagSize);
|
| }
|
| @@ -1253,9 +1173,13 @@ class Assembler : public ValueObject {
|
| void TestImmediate(Register rn, int64_t imm);
|
| void CompareImmediate(Register rn, int64_t imm);
|
|
|
| - void LoadFromOffset(Register dest, Register base, int32_t offset,
|
| + void LoadFromOffset(Register dest,
|
| + Register base,
|
| + int32_t offset,
|
| OperandSize sz = kDoubleWord);
|
| - void LoadFieldFromOffset(Register dest, Register base, int32_t offset,
|
| + void LoadFieldFromOffset(Register dest,
|
| + Register base,
|
| + int32_t offset,
|
| OperandSize sz = kDoubleWord) {
|
| LoadFromOffset(dest, base, offset - kHeapObjectTag, sz);
|
| }
|
| @@ -1268,9 +1192,13 @@ class Assembler : public ValueObject {
|
| LoadQFromOffset(dest, base, offset - kHeapObjectTag);
|
| }
|
|
|
| - void StoreToOffset(Register src, Register base, int32_t offset,
|
| + void StoreToOffset(Register src,
|
| + Register base,
|
| + int32_t offset,
|
| OperandSize sz = kDoubleWord);
|
| - void StoreFieldToOffset(Register src, Register base, int32_t offset,
|
| + void StoreFieldToOffset(Register src,
|
| + Register base,
|
| + int32_t offset,
|
| OperandSize sz = kDoubleWord) {
|
| StoreToOffset(src, base, offset - kHeapObjectTag, sz);
|
| }
|
| @@ -1308,12 +1236,8 @@ class Assembler : public ValueObject {
|
| // Object pool, loading from pool, etc.
|
| void LoadPoolPointer(Register pp = PP);
|
|
|
| - bool constant_pool_allowed() const {
|
| - return constant_pool_allowed_;
|
| - }
|
| - void set_constant_pool_allowed(bool b) {
|
| - constant_pool_allowed_ = b;
|
| - }
|
| + bool constant_pool_allowed() const { return constant_pool_allowed_; }
|
| + void set_constant_pool_allowed(bool b) { constant_pool_allowed_ = b; }
|
|
|
| intptr_t FindImmediate(int64_t imm);
|
| bool CanLoadFromObjectPool(const Object& object) const;
|
| @@ -1366,8 +1290,7 @@ class Assembler : public ValueObject {
|
|
|
| void MonomorphicCheckedEntry();
|
|
|
| - void UpdateAllocationStats(intptr_t cid,
|
| - Heap::Space space);
|
| + void UpdateAllocationStats(intptr_t cid, Heap::Space space);
|
|
|
| void UpdateAllocationStatsWithSize(intptr_t cid,
|
| Register size_reg,
|
| @@ -1375,9 +1298,7 @@ class Assembler : public ValueObject {
|
|
|
| // If allocation tracing for |cid| is enabled, will jump to |trace| label,
|
| // which will allocate in the runtime where tracing occurs.
|
| - void MaybeTraceAllocation(intptr_t cid,
|
| - Register temp_reg,
|
| - Label* trace);
|
| + void MaybeTraceAllocation(intptr_t cid, Register temp_reg, Label* trace);
|
|
|
| // Inlined allocation of an instance of class 'cls', code has no runtime
|
| // calls. Jump to 'failure' if the instance cannot be allocated here.
|
| @@ -1421,9 +1342,10 @@ class Assembler : public ValueObject {
|
| Register array,
|
| Register index);
|
|
|
| - void LoadUnaligned(Register dst, Register addr, Register tmp,
|
| - OperandSize sz);
|
| - void StoreUnaligned(Register src, Register addr, Register tmp,
|
| + void LoadUnaligned(Register dst, Register addr, Register tmp, OperandSize sz);
|
| + void StoreUnaligned(Register src,
|
| + Register addr,
|
| + Register tmp,
|
| OperandSize sz);
|
|
|
| private:
|
| @@ -1436,7 +1358,7 @@ class Assembler : public ValueObject {
|
| class CodeComment : public ZoneAllocated {
|
| public:
|
| CodeComment(intptr_t pc_offset, const String& comment)
|
| - : pc_offset_(pc_offset), comment_(comment) { }
|
| + : pc_offset_(pc_offset), comment_(comment) {}
|
|
|
| intptr_t pc_offset() const { return pc_offset_; }
|
| const String& comment() const { return comment_; }
|
| @@ -1457,8 +1379,12 @@ class Assembler : public ValueObject {
|
|
|
| void LoadObjectHelper(Register dst, const Object& obj, bool is_unique);
|
|
|
| - void AddSubHelper(OperandSize os, bool set_flags, bool subtract,
|
| - Register rd, Register rn, Operand o) {
|
| + void AddSubHelper(OperandSize os,
|
| + bool set_flags,
|
| + bool subtract,
|
| + Register rd,
|
| + Register rn,
|
| + Operand o) {
|
| ASSERT((rd != R31) && (rn != R31));
|
| const Register crd = ConcreteRegister(rd);
|
| const Register crn = ConcreteRegister(rn);
|
| @@ -1475,8 +1401,12 @@ class Assembler : public ValueObject {
|
| }
|
| }
|
|
|
| - void AddSubWithCarryHelper(OperandSize sz, bool set_flags, bool subtract,
|
| - Register rd, Register rn, Register rm) {
|
| + void AddSubWithCarryHelper(OperandSize sz,
|
| + bool set_flags,
|
| + bool subtract,
|
| + Register rd,
|
| + Register rn,
|
| + Register rm) {
|
| ASSERT((rd != R31) && (rn != R31) && (rm != R31));
|
| ASSERT((rd != CSP) && (rn != CSP) && (rm != CSP));
|
| const Register crd = ConcreteRegister(rd);
|
| @@ -1485,48 +1415,53 @@ class Assembler : public ValueObject {
|
| const int32_t size = (sz == kDoubleWord) ? B31 : 0;
|
| const int32_t s = set_flags ? B29 : 0;
|
| const int32_t op = subtract ? SBC : ADC;
|
| - const int32_t encoding =
|
| - op | size | s |
|
| - (static_cast<int32_t>(crd) << kRdShift) |
|
| - (static_cast<int32_t>(crn) << kRnShift) |
|
| - (static_cast<int32_t>(crm) << kRmShift);
|
| + const int32_t encoding = op | size | s |
|
| + (static_cast<int32_t>(crd) << kRdShift) |
|
| + (static_cast<int32_t>(crn) << kRnShift) |
|
| + (static_cast<int32_t>(crm) << kRmShift);
|
| Emit(encoding);
|
| }
|
|
|
| - void EmitAddSubImmOp(AddSubImmOp op, Register rd, Register rn,
|
| - Operand o, OperandSize sz, bool set_flags) {
|
| + void EmitAddSubImmOp(AddSubImmOp op,
|
| + Register rd,
|
| + Register rn,
|
| + Operand o,
|
| + OperandSize sz,
|
| + bool set_flags) {
|
| ASSERT((sz == kDoubleWord) || (sz == kWord) || (sz == kUnsignedWord));
|
| const int32_t size = (sz == kDoubleWord) ? B31 : 0;
|
| const int32_t s = set_flags ? B29 : 0;
|
| const int32_t encoding =
|
| - op | size | s |
|
| - (static_cast<int32_t>(rd) << kRdShift) |
|
| - (static_cast<int32_t>(rn) << kRnShift) |
|
| - o.encoding();
|
| + op | size | s | (static_cast<int32_t>(rd) << kRdShift) |
|
| + (static_cast<int32_t>(rn) << kRnShift) | o.encoding();
|
| Emit(encoding);
|
| }
|
|
|
| - void EmitLogicalImmOp(LogicalImmOp op, Register rd, Register rn,
|
| - Operand o, OperandSize sz) {
|
| + void EmitLogicalImmOp(LogicalImmOp op,
|
| + Register rd,
|
| + Register rn,
|
| + Operand o,
|
| + OperandSize sz) {
|
| ASSERT((sz == kDoubleWord) || (sz == kWord) || (sz == kUnsignedWord));
|
| ASSERT((rd != R31) && (rn != R31));
|
| ASSERT(rn != CSP);
|
| - ASSERT((op == ANDIS) || (rd != ZR)); // op != ANDIS => rd != ZR.
|
| + ASSERT((op == ANDIS) || (rd != ZR)); // op != ANDIS => rd != ZR.
|
| ASSERT((op != ANDIS) || (rd != CSP)); // op == ANDIS => rd != CSP.
|
| ASSERT(o.type() == Operand::BitfieldImm);
|
| const int32_t size = (sz == kDoubleWord) ? B31 : 0;
|
| const Register crd = ConcreteRegister(rd);
|
| const Register crn = ConcreteRegister(rn);
|
| const int32_t encoding =
|
| - op | size |
|
| - (static_cast<int32_t>(crd) << kRdShift) |
|
| - (static_cast<int32_t>(crn) << kRnShift) |
|
| - o.encoding();
|
| + op | size | (static_cast<int32_t>(crd) << kRdShift) |
|
| + (static_cast<int32_t>(crn) << kRnShift) | o.encoding();
|
| Emit(encoding);
|
| }
|
|
|
| void EmitLogicalShiftOp(LogicalShiftOp op,
|
| - Register rd, Register rn, Operand o, OperandSize sz) {
|
| + Register rd,
|
| + Register rn,
|
| + Operand o,
|
| + OperandSize sz) {
|
| ASSERT((sz == kDoubleWord) || (sz == kWord) || (sz == kUnsignedWord));
|
| ASSERT((rd != R31) && (rn != R31));
|
| ASSERT((rd != CSP) && (rn != CSP));
|
| @@ -1535,32 +1470,31 @@ class Assembler : public ValueObject {
|
| const Register crd = ConcreteRegister(rd);
|
| const Register crn = ConcreteRegister(rn);
|
| const int32_t encoding =
|
| - op | size |
|
| - (static_cast<int32_t>(crd) << kRdShift) |
|
| - (static_cast<int32_t>(crn) << kRnShift) |
|
| - o.encoding();
|
| + op | size | (static_cast<int32_t>(crd) << kRdShift) |
|
| + (static_cast<int32_t>(crn) << kRnShift) | o.encoding();
|
| Emit(encoding);
|
| }
|
|
|
| void EmitAddSubShiftExtOp(AddSubShiftExtOp op,
|
| - Register rd, Register rn, Operand o,
|
| - OperandSize sz, bool set_flags) {
|
| + Register rd,
|
| + Register rn,
|
| + Operand o,
|
| + OperandSize sz,
|
| + bool set_flags) {
|
| ASSERT((sz == kDoubleWord) || (sz == kWord) || (sz == kUnsignedWord));
|
| const int32_t size = (sz == kDoubleWord) ? B31 : 0;
|
| const int32_t s = set_flags ? B29 : 0;
|
| const int32_t encoding =
|
| - op | size | s |
|
| - (static_cast<int32_t>(rd) << kRdShift) |
|
| - (static_cast<int32_t>(rn) << kRnShift) |
|
| - o.encoding();
|
| + op | size | s | (static_cast<int32_t>(rd) << kRdShift) |
|
| + (static_cast<int32_t>(rn) << kRnShift) | o.encoding();
|
| Emit(encoding);
|
| }
|
|
|
| int32_t EncodeImm19BranchOffset(int64_t imm, int32_t instr) {
|
| if (!CanEncodeImm19BranchOffset(imm)) {
|
| ASSERT(!use_far_branches());
|
| - Thread::Current()->long_jump_base()->Jump(
|
| - 1, Object::branch_offset_error());
|
| + Thread::Current()->long_jump_base()->Jump(1,
|
| + Object::branch_offset_error());
|
| }
|
| const int32_t imm32 = static_cast<int32_t>(imm);
|
| const int32_t off = (((imm32 >> 2) << kImm19Shift) & kImm19Mask);
|
| @@ -1610,7 +1544,9 @@ class Assembler : public ValueObject {
|
| return static_cast<int64_t>(off);
|
| }
|
|
|
| - void EmitCompareAndBranchOp(CompareAndBranchOp op, Register rt, int64_t imm,
|
| + void EmitCompareAndBranchOp(CompareAndBranchOp op,
|
| + Register rt,
|
| + int64_t imm,
|
| OperandSize sz) {
|
| ASSERT((sz == kDoubleWord) || (sz == kWord) || (sz == kUnsignedWord));
|
| ASSERT(Utils::IsInt(21, imm) && ((imm & 0x3) == 0));
|
| @@ -1619,19 +1555,16 @@ class Assembler : public ValueObject {
|
| const int32_t size = (sz == kDoubleWord) ? B31 : 0;
|
| const int32_t encoded_offset = EncodeImm19BranchOffset(imm, 0);
|
| const int32_t encoding =
|
| - op | size |
|
| - (static_cast<int32_t>(crt) << kRtShift) |
|
| - encoded_offset;
|
| + op | size | (static_cast<int32_t>(crt) << kRtShift) | encoded_offset;
|
| Emit(encoding);
|
| }
|
|
|
| - void EmitConditionalBranchOp(ConditionalBranchOp op, Condition cond,
|
| + void EmitConditionalBranchOp(ConditionalBranchOp op,
|
| + Condition cond,
|
| int64_t imm) {
|
| const int32_t off = EncodeImm19BranchOffset(imm, 0);
|
| const int32_t encoding =
|
| - op |
|
| - (static_cast<int32_t>(cond) << kCondShift) |
|
| - off;
|
| + op | (static_cast<int32_t>(cond) << kCondShift) | off;
|
| Emit(encoding);
|
| }
|
|
|
| @@ -1640,7 +1573,8 @@ class Assembler : public ValueObject {
|
| return Utils::IsInt(21, offset);
|
| }
|
|
|
| - void EmitConditionalBranch(ConditionalBranchOp op, Condition cond,
|
| + void EmitConditionalBranch(ConditionalBranchOp op,
|
| + Condition cond,
|
| Label* label) {
|
| if (label->IsBound()) {
|
| const int64_t dest = label->Position() - buffer_.Size();
|
| @@ -1650,8 +1584,8 @@ class Assembler : public ValueObject {
|
| // no need for a guard branch.
|
| b(dest);
|
| } else {
|
| - EmitConditionalBranchOp(
|
| - op, InvertCondition(cond), 2 * Instr::kInstrSize);
|
| + EmitConditionalBranchOp(op, InvertCondition(cond),
|
| + 2 * Instr::kInstrSize);
|
| b(dest);
|
| }
|
| } else {
|
| @@ -1663,8 +1597,8 @@ class Assembler : public ValueObject {
|
| // When cond is AL, this guard branch will be rewritten as a nop when
|
| // the label is bound. We don't write it as a nop initially because it
|
| // makes the decoding code in Bind simpler.
|
| - EmitConditionalBranchOp(
|
| - op, InvertCondition(cond), 2 * Instr::kInstrSize);
|
| + EmitConditionalBranchOp(op, InvertCondition(cond),
|
| + 2 * Instr::kInstrSize);
|
| b(label->position_);
|
| } else {
|
| EmitConditionalBranchOp(op, cond, label->position_);
|
| @@ -1673,22 +1607,24 @@ class Assembler : public ValueObject {
|
| }
|
| }
|
|
|
| - void EmitCompareAndBranch(CompareAndBranchOp op, Register rt,
|
| - Label* label, OperandSize sz) {
|
| + void EmitCompareAndBranch(CompareAndBranchOp op,
|
| + Register rt,
|
| + Label* label,
|
| + OperandSize sz) {
|
| if (label->IsBound()) {
|
| const int64_t dest = label->Position() - buffer_.Size();
|
| if (use_far_branches() && !CanEncodeImm19BranchOffset(dest)) {
|
| - EmitCompareAndBranchOp(
|
| - op == CBZ ? CBNZ : CBZ, rt, 2 * Instr::kInstrSize, sz);
|
| - b(dest);
|
| + EmitCompareAndBranchOp(op == CBZ ? CBNZ : CBZ, rt,
|
| + 2 * Instr::kInstrSize, sz);
|
| + b(dest);
|
| } else {
|
| EmitCompareAndBranchOp(op, rt, dest, sz);
|
| }
|
| } else {
|
| const int64_t position = buffer_.Size();
|
| if (use_far_branches()) {
|
| - EmitCompareAndBranchOp(
|
| - op == CBZ ? CBNZ : CBZ, rt, 2 * Instr::kInstrSize, sz);
|
| + EmitCompareAndBranchOp(op == CBZ ? CBNZ : CBZ, rt,
|
| + 2 * Instr::kInstrSize, sz);
|
| b(label->position_);
|
| } else {
|
| EmitCompareAndBranchOp(op, rt, label->position_, sz);
|
| @@ -1712,8 +1648,7 @@ class Assembler : public ValueObject {
|
| void EmitUnconditionalBranchRegOp(UnconditionalBranchRegOp op, Register rn) {
|
| ASSERT((rn != CSP) && (rn != R31));
|
| const Register crn = ConcreteRegister(rn);
|
| - const int32_t encoding =
|
| - op | (static_cast<int32_t>(crn) << kRnShift);
|
| + const int32_t encoding = op | (static_cast<int32_t>(crn) << kRnShift);
|
| Emit(encoding);
|
| }
|
|
|
| @@ -1725,21 +1660,26 @@ class Assembler : public ValueObject {
|
| Emit(ExceptionGenOpEncoding(op, imm));
|
| }
|
|
|
| - void EmitMoveWideOp(MoveWideOp op, Register rd, const Immediate& imm,
|
| - int hw_idx, OperandSize sz) {
|
| + void EmitMoveWideOp(MoveWideOp op,
|
| + Register rd,
|
| + const Immediate& imm,
|
| + int hw_idx,
|
| + OperandSize sz) {
|
| ASSERT((hw_idx >= 0) && (hw_idx <= 3));
|
| ASSERT((sz == kDoubleWord) || (sz == kWord) || (sz == kUnsignedWord));
|
| const int32_t size = (sz == kDoubleWord) ? B31 : 0;
|
| const int32_t encoding =
|
| - op | size |
|
| - (static_cast<int32_t>(rd) << kRdShift) |
|
| + op | size | (static_cast<int32_t>(rd) << kRdShift) |
|
| (static_cast<int32_t>(hw_idx) << kHWShift) |
|
| (static_cast<int32_t>(imm.value() & 0xffff) << kImm16Shift);
|
| Emit(encoding);
|
| }
|
|
|
| - void EmitLoadStoreExclusive(LoadStoreExclusiveOp op, Register rs, Register rn,
|
| - Register rt, OperandSize sz = kDoubleWord) {
|
| + void EmitLoadStoreExclusive(LoadStoreExclusiveOp op,
|
| + Register rs,
|
| + Register rn,
|
| + Register rt,
|
| + OperandSize sz = kDoubleWord) {
|
| ASSERT(sz == kDoubleWord);
|
| const int32_t size = B31 | B30;
|
|
|
| @@ -1748,40 +1688,42 @@ class Assembler : public ValueObject {
|
| ASSERT((rt != kNoRegister) && (rt != ZR));
|
|
|
| const int32_t encoding =
|
| - op | size |
|
| - (static_cast<int32_t>(ConcreteRegister(rs)) << kRsShift) |
|
| + op | size | (static_cast<int32_t>(ConcreteRegister(rs)) << kRsShift) |
|
| (static_cast<int32_t>(ConcreteRegister(rn)) << kRnShift) |
|
| (static_cast<int32_t>(ConcreteRegister(rt)) << kRtShift);
|
|
|
| Emit(encoding);
|
| }
|
|
|
| - void EmitLoadStoreReg(LoadStoreRegOp op, Register rt, Address a,
|
| + void EmitLoadStoreReg(LoadStoreRegOp op,
|
| + Register rt,
|
| + Address a,
|
| OperandSize sz) {
|
| const Register crt = ConcreteRegister(rt);
|
| const int32_t size = Log2OperandSizeBytes(sz);
|
| - const int32_t encoding =
|
| - op | ((size & 0x3) << kSzShift) |
|
| - (static_cast<int32_t>(crt) << kRtShift) |
|
| - a.encoding();
|
| + const int32_t encoding = op | ((size & 0x3) << kSzShift) |
|
| + (static_cast<int32_t>(crt) << kRtShift) |
|
| + a.encoding();
|
| Emit(encoding);
|
| }
|
|
|
| - void EmitLoadRegLiteral(LoadRegLiteralOp op, Register rt, Address a,
|
| + void EmitLoadRegLiteral(LoadRegLiteralOp op,
|
| + Register rt,
|
| + Address a,
|
| OperandSize sz) {
|
| ASSERT((sz == kDoubleWord) || (sz == kWord) || (sz == kUnsignedWord));
|
| ASSERT((rt != CSP) && (rt != R31));
|
| const Register crt = ConcreteRegister(rt);
|
| const int32_t size = (sz == kDoubleWord) ? B30 : 0;
|
| const int32_t encoding =
|
| - op | size |
|
| - (static_cast<int32_t>(crt) << kRtShift) |
|
| - a.encoding();
|
| + op | size | (static_cast<int32_t>(crt) << kRtShift) | a.encoding();
|
| Emit(encoding);
|
| }
|
|
|
| void EmitLoadStoreRegPair(LoadStoreRegPairOp op,
|
| - Register rt, Register rt2, Address a,
|
| + Register rt,
|
| + Register rt2,
|
| + Address a,
|
| OperandSize sz) {
|
| ASSERT((sz == kDoubleWord) || (sz == kWord) || (sz == kUnsignedWord));
|
| ASSERT((rt != CSP) && (rt != R31));
|
| @@ -1790,16 +1732,22 @@ class Assembler : public ValueObject {
|
| const Register crt2 = ConcreteRegister(rt2);
|
| int32_t opc = 0;
|
| switch (sz) {
|
| - case kDoubleWord: opc = B31; break;
|
| - case kWord: opc = B30; break;
|
| - case kUnsignedWord: opc = 0; break;
|
| - default: UNREACHABLE(); break;
|
| + case kDoubleWord:
|
| + opc = B31;
|
| + break;
|
| + case kWord:
|
| + opc = B30;
|
| + break;
|
| + case kUnsignedWord:
|
| + opc = 0;
|
| + break;
|
| + default:
|
| + UNREACHABLE();
|
| + break;
|
| }
|
| const int32_t encoding =
|
| - opc | op |
|
| - (static_cast<int32_t>(crt) << kRtShift) |
|
| - (static_cast<int32_t>(crt2) << kRt2Shift) |
|
| - a.encoding();
|
| + opc | op | (static_cast<int32_t>(crt) << kRtShift) |
|
| + (static_cast<int32_t>(crt2) << kRt2Shift) | a.encoding();
|
| Emit(encoding);
|
| }
|
|
|
| @@ -1810,28 +1758,29 @@ class Assembler : public ValueObject {
|
| const int32_t loimm = (imm.value() & 0x3) << 29;
|
| const int32_t hiimm = ((imm.value() >> 2) << kImm19Shift) & kImm19Mask;
|
| const int32_t encoding =
|
| - op | loimm | hiimm |
|
| - (static_cast<int32_t>(crd) << kRdShift);
|
| + op | loimm | hiimm | (static_cast<int32_t>(crd) << kRdShift);
|
| Emit(encoding);
|
| }
|
|
|
| void EmitMiscDP1Source(MiscDP1SourceOp op,
|
| - Register rd, Register rn,
|
| + Register rd,
|
| + Register rn,
|
| OperandSize sz) {
|
| ASSERT((rd != CSP) && (rn != CSP));
|
| ASSERT((sz == kDoubleWord) || (sz == kWord) || (sz == kUnsignedWord));
|
| const Register crd = ConcreteRegister(rd);
|
| const Register crn = ConcreteRegister(rn);
|
| const int32_t size = (sz == kDoubleWord) ? B31 : 0;
|
| - const int32_t encoding =
|
| - op | size |
|
| - (static_cast<int32_t>(crd) << kRdShift) |
|
| - (static_cast<int32_t>(crn) << kRnShift);
|
| + const int32_t encoding = op | size |
|
| + (static_cast<int32_t>(crd) << kRdShift) |
|
| + (static_cast<int32_t>(crn) << kRnShift);
|
| Emit(encoding);
|
| }
|
|
|
| void EmitMiscDP2Source(MiscDP2SourceOp op,
|
| - Register rd, Register rn, Register rm,
|
| + Register rd,
|
| + Register rn,
|
| + Register rm,
|
| OperandSize sz) {
|
| ASSERT((rd != CSP) && (rn != CSP) && (rm != CSP));
|
| ASSERT((sz == kDoubleWord) || (sz == kWord) || (sz == kUnsignedWord));
|
| @@ -1839,16 +1788,18 @@ class Assembler : public ValueObject {
|
| const Register crn = ConcreteRegister(rn);
|
| const Register crm = ConcreteRegister(rm);
|
| const int32_t size = (sz == kDoubleWord) ? B31 : 0;
|
| - const int32_t encoding =
|
| - op | size |
|
| - (static_cast<int32_t>(crd) << kRdShift) |
|
| - (static_cast<int32_t>(crn) << kRnShift) |
|
| - (static_cast<int32_t>(crm) << kRmShift);
|
| + const int32_t encoding = op | size |
|
| + (static_cast<int32_t>(crd) << kRdShift) |
|
| + (static_cast<int32_t>(crn) << kRnShift) |
|
| + (static_cast<int32_t>(crm) << kRmShift);
|
| Emit(encoding);
|
| }
|
|
|
| void EmitMiscDP3Source(MiscDP3SourceOp op,
|
| - Register rd, Register rn, Register rm, Register ra,
|
| + Register rd,
|
| + Register rn,
|
| + Register rm,
|
| + Register ra,
|
| OperandSize sz) {
|
| ASSERT((rd != CSP) && (rn != CSP) && (rm != CSP) && (ra != CSP));
|
| ASSERT((sz == kDoubleWord) || (sz == kWord) || (sz == kUnsignedWord));
|
| @@ -1857,108 +1808,101 @@ class Assembler : public ValueObject {
|
| const Register crm = ConcreteRegister(rm);
|
| const Register cra = ConcreteRegister(ra);
|
| const int32_t size = (sz == kDoubleWord) ? B31 : 0;
|
| - const int32_t encoding =
|
| - op | size |
|
| - (static_cast<int32_t>(crd) << kRdShift) |
|
| - (static_cast<int32_t>(crn) << kRnShift) |
|
| - (static_cast<int32_t>(crm) << kRmShift) |
|
| - (static_cast<int32_t>(cra) << kRaShift);
|
| + const int32_t encoding = op | size |
|
| + (static_cast<int32_t>(crd) << kRdShift) |
|
| + (static_cast<int32_t>(crn) << kRnShift) |
|
| + (static_cast<int32_t>(crm) << kRmShift) |
|
| + (static_cast<int32_t>(cra) << kRaShift);
|
| Emit(encoding);
|
| }
|
|
|
| void EmitConditionalSelect(ConditionalSelectOp op,
|
| - Register rd, Register rn, Register rm,
|
| - Condition cond, OperandSize sz) {
|
| + Register rd,
|
| + Register rn,
|
| + Register rm,
|
| + Condition cond,
|
| + OperandSize sz) {
|
| ASSERT((rd != CSP) && (rn != CSP) && (rm != CSP));
|
| ASSERT((sz == kDoubleWord) || (sz == kWord) || (sz == kUnsignedWord));
|
| const Register crd = ConcreteRegister(rd);
|
| const Register crn = ConcreteRegister(rn);
|
| const Register crm = ConcreteRegister(rm);
|
| const int32_t size = (sz == kDoubleWord) ? B31 : 0;
|
| - const int32_t encoding =
|
| - op | size |
|
| - (static_cast<int32_t>(crd) << kRdShift) |
|
| - (static_cast<int32_t>(crn) << kRnShift) |
|
| - (static_cast<int32_t>(crm) << kRmShift) |
|
| - (static_cast<int32_t>(cond) << kSelCondShift);
|
| + const int32_t encoding = op | size |
|
| + (static_cast<int32_t>(crd) << kRdShift) |
|
| + (static_cast<int32_t>(crn) << kRnShift) |
|
| + (static_cast<int32_t>(crm) << kRmShift) |
|
| + (static_cast<int32_t>(cond) << kSelCondShift);
|
| Emit(encoding);
|
| }
|
|
|
| void EmitFPImm(FPImmOp op, VRegister vd, uint8_t imm8) {
|
| const int32_t encoding =
|
| - op |
|
| - (static_cast<int32_t>(vd) << kVdShift) |
|
| - (imm8 << kImm8Shift);
|
| + op | (static_cast<int32_t>(vd) << kVdShift) | (imm8 << kImm8Shift);
|
| Emit(encoding);
|
| }
|
|
|
| - void EmitFPIntCvtOp(FPIntCvtOp op, Register rd, Register rn,
|
| + void EmitFPIntCvtOp(FPIntCvtOp op,
|
| + Register rd,
|
| + Register rn,
|
| OperandSize sz = kDoubleWord) {
|
| ASSERT((sz == kDoubleWord) || (sz == kWord));
|
| const int32_t sfield = (sz == kDoubleWord) ? B31 : 0;
|
| - const int32_t encoding =
|
| - op |
|
| - (static_cast<int32_t>(rd) << kRdShift) |
|
| - (static_cast<int32_t>(rn) << kRnShift) |
|
| - sfield;
|
| + const int32_t encoding = op | (static_cast<int32_t>(rd) << kRdShift) |
|
| + (static_cast<int32_t>(rn) << kRnShift) | sfield;
|
| Emit(encoding);
|
| }
|
|
|
| void EmitFPOneSourceOp(FPOneSourceOp op, VRegister vd, VRegister vn) {
|
| - const int32_t encoding =
|
| - op |
|
| - (static_cast<int32_t>(vd) << kVdShift) |
|
| - (static_cast<int32_t>(vn) << kVnShift);
|
| + const int32_t encoding = op | (static_cast<int32_t>(vd) << kVdShift) |
|
| + (static_cast<int32_t>(vn) << kVnShift);
|
| Emit(encoding);
|
| }
|
|
|
| void EmitFPTwoSourceOp(FPTwoSourceOp op,
|
| - VRegister vd, VRegister vn, VRegister vm) {
|
| - const int32_t encoding =
|
| - op |
|
| - (static_cast<int32_t>(vd) << kVdShift) |
|
| - (static_cast<int32_t>(vn) << kVnShift) |
|
| - (static_cast<int32_t>(vm) << kVmShift);
|
| + VRegister vd,
|
| + VRegister vn,
|
| + VRegister vm) {
|
| + const int32_t encoding = op | (static_cast<int32_t>(vd) << kVdShift) |
|
| + (static_cast<int32_t>(vn) << kVnShift) |
|
| + (static_cast<int32_t>(vm) << kVmShift);
|
| Emit(encoding);
|
| }
|
|
|
| void EmitFPCompareOp(FPCompareOp op, VRegister vn, VRegister vm) {
|
| - const int32_t encoding =
|
| - op |
|
| - (static_cast<int32_t>(vn) << kVnShift) |
|
| - (static_cast<int32_t>(vm) << kVmShift);
|
| + const int32_t encoding = op | (static_cast<int32_t>(vn) << kVnShift) |
|
| + (static_cast<int32_t>(vm) << kVmShift);
|
| Emit(encoding);
|
| }
|
|
|
| void EmitSIMDThreeSameOp(SIMDThreeSameOp op,
|
| - VRegister vd, VRegister vn, VRegister vm) {
|
| - const int32_t encoding =
|
| - op |
|
| - (static_cast<int32_t>(vd) << kVdShift) |
|
| - (static_cast<int32_t>(vn) << kVnShift) |
|
| - (static_cast<int32_t>(vm) << kVmShift);
|
| + VRegister vd,
|
| + VRegister vn,
|
| + VRegister vm) {
|
| + const int32_t encoding = op | (static_cast<int32_t>(vd) << kVdShift) |
|
| + (static_cast<int32_t>(vn) << kVnShift) |
|
| + (static_cast<int32_t>(vm) << kVmShift);
|
| Emit(encoding);
|
| }
|
|
|
| - void EmitSIMDCopyOp(SIMDCopyOp op, VRegister vd, VRegister vn, OperandSize sz,
|
| - int32_t idx4, int32_t idx5) {
|
| + void EmitSIMDCopyOp(SIMDCopyOp op,
|
| + VRegister vd,
|
| + VRegister vn,
|
| + OperandSize sz,
|
| + int32_t idx4,
|
| + int32_t idx5) {
|
| const int32_t shift = Log2OperandSizeBytes(sz);
|
| const int32_t imm5 = ((idx5 << (shift + 1)) | (1 << shift)) & 0x1f;
|
| const int32_t imm4 = (idx4 << shift) & 0xf;
|
| - const int32_t encoding =
|
| - op |
|
| - (imm5 << kImm5Shift) |
|
| - (imm4 << kImm4Shift) |
|
| - (static_cast<int32_t>(vd) << kVdShift) |
|
| - (static_cast<int32_t>(vn) << kVnShift);
|
| + const int32_t encoding = op | (imm5 << kImm5Shift) | (imm4 << kImm4Shift) |
|
| + (static_cast<int32_t>(vd) << kVdShift) |
|
| + (static_cast<int32_t>(vn) << kVnShift);
|
| Emit(encoding);
|
| }
|
|
|
| void EmitSIMDTwoRegOp(SIMDTwoRegOp op, VRegister vd, VRegister vn) {
|
| - const int32_t encoding =
|
| - op |
|
| - (static_cast<int32_t>(vd) << kVdShift) |
|
| - (static_cast<int32_t>(vn) << kVnShift);
|
| + const int32_t encoding = op | (static_cast<int32_t>(vd) << kVdShift) |
|
| + (static_cast<int32_t>(vn) << kVnShift);
|
| Emit(encoding);
|
| }
|
|
|
|
|