diff options
Diffstat (limited to 'deps/v8/src/x64/assembler-x64.h')
-rw-r--r-- | deps/v8/src/x64/assembler-x64.h | 746 |
1 files changed, 347 insertions, 399 deletions
diff --git a/deps/v8/src/x64/assembler-x64.h b/deps/v8/src/x64/assembler-x64.h index 1c838b964b..a532729d15 100644 --- a/deps/v8/src/x64/assembler-x64.h +++ b/deps/v8/src/x64/assembler-x64.h @@ -81,9 +81,6 @@ namespace internal { V(r14) \ V(r15) -// The length of pushq(rbp), movp(rbp, rsp), Push(rsi) and Push(rdi). -constexpr int kNoCodeAgeSequenceLength = kPointerSize == kInt64Size ? 6 : 17; - enum RegisterCode { #define REGISTER_CODE(R) kRegCode_##R, GENERAL_REGISTERS(REGISTER_CODE) @@ -316,7 +313,7 @@ class Immediate BASE_EMBEDDED { private: int32_t value_; - RelocInfo::Mode rmode_ = RelocInfo::NONE32; + RelocInfo::Mode rmode_ = RelocInfo::NONE; friend class Assembler; }; @@ -325,7 +322,7 @@ class Immediate BASE_EMBEDDED { // ----------------------------------------------------------------------------- // Machine instruction Operands -enum ScaleFactor { +enum ScaleFactor : int8_t { times_1 = 0, times_2 = 1, times_4 = 2, @@ -334,9 +331,15 @@ enum ScaleFactor { times_pointer_size = (kPointerSize == 8) ? times_8 : times_4 }; - -class Operand BASE_EMBEDDED { +class Operand { public: + struct Data { + byte rex = 0; + byte buf[9]; + byte len = 1; // number of bytes of buf_ in use. + int8_t addend; // for rip + offset + addend. + }; + // [base + disp/r] Operand(Register base, int32_t disp); @@ -354,10 +357,12 @@ class Operand BASE_EMBEDDED { // Offset from existing memory operand. // Offset is added to existing displacement as 32-bit signed values and // this must not overflow. - Operand(const Operand& base, int32_t offset); + Operand(Operand base, int32_t offset); // [rip + disp/r] - explicit Operand(Label* label); + explicit Operand(Label* label, int addend = 0); + + Operand(const Operand&) = default; // Checks whether either base or index register is the given register. // Does not check the "reg" part of the Operand. @@ -365,33 +370,29 @@ class Operand BASE_EMBEDDED { // Queries related to the size of the generated instruction. // Whether the generated instruction will have a REX prefix. - bool requires_rex() const { return rex_ != 0; } + bool requires_rex() const { return data_.rex != 0; } // Size of the ModR/M, SIB and displacement parts of the generated // instruction. - int operand_size() const { return len_; } - - private: - byte rex_; - byte buf_[9]; - // The number of bytes of buf_ in use. - byte len_; - - // Set the ModR/M byte without an encoded 'reg' register. The - // register is encoded later as part of the emit_operand operation. - // set_modrm can be called before or after set_sib and set_disp*. - inline void set_modrm(int mod, Register rm); - - // Set the SIB byte if one is needed. Sets the length to 2 rather than 1. - inline void set_sib(ScaleFactor scale, Register index, Register base); + int operand_size() const { return data_.len; } - // Adds operand displacement fields (offsets added to the memory address). - // Needs to be called after set_sib, not before it. - inline void set_disp8(int disp); - inline void set_disp32(int disp); - inline void set_disp64(int64_t disp); // for labels. + const Data& data() const { return data_; } - friend class Assembler; + private: + const Data data_; }; +static_assert(sizeof(Operand) <= 2 * kPointerSize, + "Operand must be small enough to pass it by value"); +// Unfortunately, MSVC 2015 is broken in that both is_trivially_destructible and +// is_trivially_copy_constructible are true, but is_trivially_copyable is false. +// (status at 2018-02-26, observed on the msvc waterfall bot). +#if V8_CC_MSVC +static_assert(std::is_trivially_copy_constructible<Operand>::value && + std::is_trivially_destructible<Operand>::value, + "Operand must be trivially copyable to pass it by value"); +#else +static_assert(IS_TRIVIALLY_COPYABLE(Operand), + "Operand must be trivially copyable to pass it by value"); +#endif #define ASSEMBLER_INSTRUCTION_LIST(V) \ V(add) \ @@ -476,7 +477,7 @@ class Assembler : public AssemblerBase { // The isolate argument is unused (and may be nullptr) when skipping flushing. static inline Address target_address_at(Address pc, Address constant_pool); static inline void set_target_address_at( - Isolate* isolate, Address pc, Address constant_pool, Address target, + Address pc, Address constant_pool, Address target, ICacheFlushMode icache_flush_mode = FLUSH_ICACHE_IF_NEEDED); // Return the code target address at a call site from the return address @@ -486,23 +487,13 @@ class Assembler : public AssemblerBase { // This sets the branch destination (which is in the instruction on x64). // This is for calls and branches within generated code. inline static void deserialization_set_special_target_at( - Isolate* isolate, Address instruction_payload, Code* code, - Address target); + Address instruction_payload, Code* code, Address target); // This sets the internal reference at the pc. inline static void deserialization_set_target_internal_reference_at( - Isolate* isolate, Address pc, Address target, + Address pc, Address target, RelocInfo::Mode mode = RelocInfo::INTERNAL_REFERENCE); - static inline RelocInfo::Mode RelocInfoNone() { - if (kPointerSize == kInt64Size) { - return RelocInfo::NONE64; - } else { - DCHECK_EQ(kPointerSize, kInt32Size); - return RelocInfo::NONE32; - } - } - inline Handle<Code> code_target_object_handle_at(Address pc); inline Address runtime_entry_at(Address pc); // Number of bytes taken up by the branch target in the code. @@ -629,29 +620,29 @@ class Assembler : public AssemblerBase { // 32 bit value, the normal push will optimize the 8 bit case. void pushq_imm32(int32_t imm32); void pushq(Register src); - void pushq(const Operand& src); + void pushq(Operand src); void popq(Register dst); - void popq(const Operand& dst); + void popq(Operand dst); void enter(Immediate size); void leave(); // Moves - void movb(Register dst, const Operand& src); + void movb(Register dst, Operand src); void movb(Register dst, Immediate imm); - void movb(const Operand& dst, Register src); - void movb(const Operand& dst, Immediate imm); + void movb(Operand dst, Register src); + void movb(Operand dst, Immediate imm); // Move the low 16 bits of a 64-bit register value to a 16-bit // memory location. - void movw(Register dst, const Operand& src); - void movw(const Operand& dst, Register src); - void movw(const Operand& dst, Immediate imm); + void movw(Register dst, Operand src); + void movw(Operand dst, Register src); + void movw(Operand dst, Immediate imm); // Move the offset of the label location relative to the current // position (after the move) to the destination. - void movl(const Operand& dst, Label* src); + void movl(Operand dst, Label* src); // Loads a pointer into a register with a relocation mode. void movp(Register dst, void* ptr, RelocInfo::Mode rmode); @@ -667,20 +658,20 @@ class Assembler : public AssemblerBase { // Loads a 64-bit immediate into a register. void movq(Register dst, int64_t value, - RelocInfo::Mode rmode = RelocInfo::NONE64); + RelocInfo::Mode rmode = RelocInfo::NONE); void movq(Register dst, uint64_t value, - RelocInfo::Mode rmode = RelocInfo::NONE64); + RelocInfo::Mode rmode = RelocInfo::NONE); void movsxbl(Register dst, Register src); - void movsxbl(Register dst, const Operand& src); + void movsxbl(Register dst, Operand src); void movsxbq(Register dst, Register src); - void movsxbq(Register dst, const Operand& src); + void movsxbq(Register dst, Operand src); void movsxwl(Register dst, Register src); - void movsxwl(Register dst, const Operand& src); + void movsxwl(Register dst, Operand src); void movsxwq(Register dst, Register src); - void movsxwq(Register dst, const Operand& src); + void movsxwq(Register dst, Operand src); void movsxlq(Register dst, Register src); - void movsxlq(Register dst, const Operand& src); + void movsxlq(Register dst, Operand src); // Repeated moves. @@ -696,9 +687,9 @@ class Assembler : public AssemblerBase { // Conditional moves. void cmovq(Condition cc, Register dst, Register src); - void cmovq(Condition cc, Register dst, const Operand& src); + void cmovq(Condition cc, Register dst, Operand src); void cmovl(Condition cc, Register dst, Register src); - void cmovl(Condition cc, Register dst, const Operand& src); + void cmovl(Condition cc, Register dst, Operand src); void cmpb(Register dst, Immediate src) { immediate_arithmetic_op_8(0x7, dst, src); @@ -710,19 +701,15 @@ class Assembler : public AssemblerBase { arithmetic_op_8(0x3A, dst, src); } - void cmpb(Register dst, const Operand& src) { - arithmetic_op_8(0x3A, dst, src); - } + void cmpb(Register dst, Operand src) { arithmetic_op_8(0x3A, dst, src); } - void cmpb(const Operand& dst, Register src) { - arithmetic_op_8(0x38, src, dst); - } + void cmpb(Operand dst, Register src) { arithmetic_op_8(0x38, src, dst); } - void cmpb(const Operand& dst, Immediate src) { + void cmpb(Operand dst, Immediate src) { immediate_arithmetic_op_8(0x7, dst, src); } - void cmpw(const Operand& dst, Immediate src) { + void cmpw(Operand dst, Immediate src) { immediate_arithmetic_op_16(0x7, dst, src); } @@ -730,37 +717,33 @@ class Assembler : public AssemblerBase { immediate_arithmetic_op_16(0x7, dst, src); } - void cmpw(Register dst, const Operand& src) { - arithmetic_op_16(0x3B, dst, src); - } + void cmpw(Register dst, Operand src) { arithmetic_op_16(0x3B, dst, src); } void cmpw(Register dst, Register src) { arithmetic_op_16(0x3B, dst, src); } - void cmpw(const Operand& dst, Register src) { - arithmetic_op_16(0x39, src, dst); - } + void cmpw(Operand dst, Register src) { arithmetic_op_16(0x39, src, dst); } - void testb(Register reg, const Operand& op) { testb(op, reg); } + void testb(Register reg, Operand op) { testb(op, reg); } - void testw(Register reg, const Operand& op) { testw(op, reg); } + void testw(Register reg, Operand op) { testw(op, reg); } void andb(Register dst, Immediate src) { immediate_arithmetic_op_8(0x4, dst, src); } void decb(Register dst); - void decb(const Operand& dst); + void decb(Operand dst); // Lock prefix. void lock(); - void xchgb(Register reg, const Operand& op); - void xchgw(Register reg, const Operand& op); + void xchgb(Register reg, Operand op); + void xchgw(Register reg, Operand op); - void cmpxchgb(const Operand& dst, Register src); - void cmpxchgw(const Operand& dst, Register src); + void cmpxchgb(Operand dst, Register src); + void cmpxchgw(Operand dst, Register src); // Sign-extends rax into rdx:rax. void cqo(); @@ -769,7 +752,7 @@ class Assembler : public AssemblerBase { // Multiply eax by src, put the result in edx:eax. void mull(Register src); - void mull(const Operand& src); + void mull(Operand src); // Multiply rax by src, put the result in rdx:rax. void mulq(Register src); @@ -825,27 +808,29 @@ class Assembler : public AssemblerBase { immediate_arithmetic_op_8(0x5, dst, src); } + void sub_sp_32(uint32_t imm); + void testb(Register dst, Register src); void testb(Register reg, Immediate mask); - void testb(const Operand& op, Immediate mask); - void testb(const Operand& op, Register reg); + void testb(Operand op, Immediate mask); + void testb(Operand op, Register reg); void testw(Register dst, Register src); void testw(Register reg, Immediate mask); - void testw(const Operand& op, Immediate mask); - void testw(const Operand& op, Register reg); + void testw(Operand op, Immediate mask); + void testw(Operand op, Register reg); // Bit operations. - void bt(const Operand& dst, Register src); - void bts(const Operand& dst, Register src); + void bt(Operand dst, Register src); + void bts(Operand dst, Register src); void bsrq(Register dst, Register src); - void bsrq(Register dst, const Operand& src); + void bsrq(Register dst, Operand src); void bsrl(Register dst, Register src); - void bsrl(Register dst, const Operand& src); + void bsrl(Register dst, Operand src); void bsfq(Register dst, Register src); - void bsfq(Register dst, const Operand& src); + void bsfq(Register dst, Operand src); void bsfl(Register dst, Register src); - void bsfl(Register dst, const Operand& src); + void bsfl(Register dst, Operand src); // Miscellaneous void clc(); @@ -859,7 +844,7 @@ class Assembler : public AssemblerBase { void setcc(Condition cc, Register reg); void pshufw(XMMRegister dst, XMMRegister src, uint8_t shuffle); - void pshufw(XMMRegister dst, const Operand& src, uint8_t shuffle); + void pshufw(XMMRegister dst, Operand src, uint8_t shuffle); // Label operations & relative jumps (PPUM Appendix D) // @@ -906,7 +891,7 @@ class Assembler : public AssemblerBase { // Jump near absolute indirect (r64) void jmp(Register adr); - void jmp(const Operand& src); + void jmp(Operand src); // Conditional jumps void j(Condition cc, @@ -923,23 +908,23 @@ class Assembler : public AssemblerBase { void fldpi(); void fldln2(); - void fld_s(const Operand& adr); - void fld_d(const Operand& adr); + void fld_s(Operand adr); + void fld_d(Operand adr); - void fstp_s(const Operand& adr); - void fstp_d(const Operand& adr); + void fstp_s(Operand adr); + void fstp_d(Operand adr); void fstp(int index); - void fild_s(const Operand& adr); - void fild_d(const Operand& adr); + void fild_s(Operand adr); + void fild_d(Operand adr); - void fist_s(const Operand& adr); + void fist_s(Operand adr); - void fistp_s(const Operand& adr); - void fistp_d(const Operand& adr); + void fistp_s(Operand adr); + void fistp_d(Operand adr); - void fisttp_s(const Operand& adr); - void fisttp_d(const Operand& adr); + void fisttp_s(Operand adr); + void fisttp_d(Operand adr); void fabs(); void fchs(); @@ -949,7 +934,7 @@ class Assembler : public AssemblerBase { void fmul(int i); void fdiv(int i); - void fisub_s(const Operand& adr); + void fisub_s(Operand adr); void faddp(int i = 1); void fsubp(int i = 1); @@ -988,24 +973,24 @@ class Assembler : public AssemblerBase { // SSE instructions void addss(XMMRegister dst, XMMRegister src); - void addss(XMMRegister dst, const Operand& src); + void addss(XMMRegister dst, Operand src); void subss(XMMRegister dst, XMMRegister src); - void subss(XMMRegister dst, const Operand& src); + void subss(XMMRegister dst, Operand src); void mulss(XMMRegister dst, XMMRegister src); - void mulss(XMMRegister dst, const Operand& src); + void mulss(XMMRegister dst, Operand src); void divss(XMMRegister dst, XMMRegister src); - void divss(XMMRegister dst, const Operand& src); + void divss(XMMRegister dst, Operand src); void maxss(XMMRegister dst, XMMRegister src); - void maxss(XMMRegister dst, const Operand& src); + void maxss(XMMRegister dst, Operand src); void minss(XMMRegister dst, XMMRegister src); - void minss(XMMRegister dst, const Operand& src); + void minss(XMMRegister dst, Operand src); void sqrtss(XMMRegister dst, XMMRegister src); - void sqrtss(XMMRegister dst, const Operand& src); + void sqrtss(XMMRegister dst, Operand src); void ucomiss(XMMRegister dst, XMMRegister src); - void ucomiss(XMMRegister dst, const Operand& src); + void ucomiss(XMMRegister dst, Operand src); void movaps(XMMRegister dst, XMMRegister src); // Don't use this unless it's important to keep the @@ -1014,48 +999,48 @@ class Assembler : public AssemblerBase { // values in xmm registers. void movss(XMMRegister dst, XMMRegister src); - void movss(XMMRegister dst, const Operand& src); - void movss(const Operand& dst, XMMRegister src); + void movss(XMMRegister dst, Operand src); + void movss(Operand dst, XMMRegister src); void shufps(XMMRegister dst, XMMRegister src, byte imm8); - void cvttss2si(Register dst, const Operand& src); + void cvttss2si(Register dst, Operand src); void cvttss2si(Register dst, XMMRegister src); - void cvtlsi2ss(XMMRegister dst, const Operand& src); + void cvtlsi2ss(XMMRegister dst, Operand src); void cvtlsi2ss(XMMRegister dst, Register src); void andps(XMMRegister dst, XMMRegister src); - void andps(XMMRegister dst, const Operand& src); + void andps(XMMRegister dst, Operand src); void orps(XMMRegister dst, XMMRegister src); - void orps(XMMRegister dst, const Operand& src); + void orps(XMMRegister dst, Operand src); void xorps(XMMRegister dst, XMMRegister src); - void xorps(XMMRegister dst, const Operand& src); + void xorps(XMMRegister dst, Operand src); void addps(XMMRegister dst, XMMRegister src); - void addps(XMMRegister dst, const Operand& src); + void addps(XMMRegister dst, Operand src); void subps(XMMRegister dst, XMMRegister src); - void subps(XMMRegister dst, const Operand& src); + void subps(XMMRegister dst, Operand src); void mulps(XMMRegister dst, XMMRegister src); - void mulps(XMMRegister dst, const Operand& src); + void mulps(XMMRegister dst, Operand src); void divps(XMMRegister dst, XMMRegister src); - void divps(XMMRegister dst, const Operand& src); + void divps(XMMRegister dst, Operand src); void movmskps(Register dst, XMMRegister src); void vinstr(byte op, XMMRegister dst, XMMRegister src1, XMMRegister src2, SIMDPrefix pp, LeadingOpcode m, VexW w); - void vinstr(byte op, XMMRegister dst, XMMRegister src1, const Operand& src2, + void vinstr(byte op, XMMRegister dst, XMMRegister src1, Operand src2, SIMDPrefix pp, LeadingOpcode m, VexW w); // SSE2 instructions void sse2_instr(XMMRegister dst, XMMRegister src, byte prefix, byte escape, byte opcode); - void sse2_instr(XMMRegister dst, const Operand& src, byte prefix, byte escape, + void sse2_instr(XMMRegister dst, Operand src, byte prefix, byte escape, byte opcode); #define DECLARE_SSE2_INSTRUCTION(instruction, prefix, escape, opcode) \ void instruction(XMMRegister dst, XMMRegister src) { \ sse2_instr(dst, src, 0x##prefix, 0x##escape, 0x##opcode); \ } \ - void instruction(XMMRegister dst, const Operand& src) { \ + void instruction(XMMRegister dst, Operand src) { \ sse2_instr(dst, src, 0x##prefix, 0x##escape, 0x##opcode); \ } @@ -1066,8 +1051,7 @@ class Assembler : public AssemblerBase { void v##instruction(XMMRegister dst, XMMRegister src1, XMMRegister src2) { \ vinstr(0x##opcode, dst, src1, src2, k##prefix, k##escape, kW0); \ } \ - void v##instruction(XMMRegister dst, XMMRegister src1, \ - const Operand& src2) { \ + void v##instruction(XMMRegister dst, XMMRegister src1, Operand src2) { \ vinstr(0x##opcode, dst, src1, src2, k##prefix, k##escape, kW0); \ } @@ -1075,20 +1059,20 @@ class Assembler : public AssemblerBase { #undef DECLARE_SSE2_AVX_INSTRUCTION // SSE3 - void lddqu(XMMRegister dst, const Operand& src); + void lddqu(XMMRegister dst, Operand src); // SSSE3 void ssse3_instr(XMMRegister dst, XMMRegister src, byte prefix, byte escape1, byte escape2, byte opcode); - void ssse3_instr(XMMRegister dst, const Operand& src, byte prefix, - byte escape1, byte escape2, byte opcode); + void ssse3_instr(XMMRegister dst, Operand src, byte prefix, byte escape1, + byte escape2, byte opcode); #define DECLARE_SSSE3_INSTRUCTION(instruction, prefix, escape1, escape2, \ opcode) \ void instruction(XMMRegister dst, XMMRegister src) { \ ssse3_instr(dst, src, 0x##prefix, 0x##escape1, 0x##escape2, 0x##opcode); \ } \ - void instruction(XMMRegister dst, const Operand& src) { \ + void instruction(XMMRegister dst, Operand src) { \ ssse3_instr(dst, src, 0x##prefix, 0x##escape1, 0x##escape2, 0x##opcode); \ } @@ -1098,14 +1082,14 @@ class Assembler : public AssemblerBase { // SSE4 void sse4_instr(XMMRegister dst, XMMRegister src, byte prefix, byte escape1, byte escape2, byte opcode); - void sse4_instr(XMMRegister dst, const Operand& src, byte prefix, - byte escape1, byte escape2, byte opcode); + void sse4_instr(XMMRegister dst, Operand src, byte prefix, byte escape1, + byte escape2, byte opcode); #define DECLARE_SSE4_INSTRUCTION(instruction, prefix, escape1, escape2, \ opcode) \ void instruction(XMMRegister dst, XMMRegister src) { \ sse4_instr(dst, src, 0x##prefix, 0x##escape1, 0x##escape2, 0x##opcode); \ } \ - void instruction(XMMRegister dst, const Operand& src) { \ + void instruction(XMMRegister dst, Operand src) { \ sse4_instr(dst, src, 0x##prefix, 0x##escape1, 0x##escape2, 0x##opcode); \ } @@ -1117,8 +1101,7 @@ class Assembler : public AssemblerBase { void v##instruction(XMMRegister dst, XMMRegister src1, XMMRegister src2) { \ vinstr(0x##opcode, dst, src1, src2, k##prefix, k##escape1##escape2, kW0); \ } \ - void v##instruction(XMMRegister dst, XMMRegister src1, \ - const Operand& src2) { \ + void v##instruction(XMMRegister dst, XMMRegister src1, Operand src2) { \ vinstr(0x##opcode, dst, src1, src2, k##prefix, k##escape1##escape2, kW0); \ } @@ -1127,7 +1110,7 @@ class Assembler : public AssemblerBase { #undef DECLARE_SSE34_AVX_INSTRUCTION void movd(XMMRegister dst, Register src); - void movd(XMMRegister dst, const Operand& src); + void movd(XMMRegister dst, Operand src); void movd(Register dst, XMMRegister src); void movq(XMMRegister dst, Register src); void movq(Register dst, XMMRegister src); @@ -1139,18 +1122,18 @@ class Assembler : public AssemblerBase { // values in xmm registers. void movsd(XMMRegister dst, XMMRegister src); - void movsd(const Operand& dst, XMMRegister src); - void movsd(XMMRegister dst, const Operand& src); + void movsd(Operand dst, XMMRegister src); + void movsd(XMMRegister dst, Operand src); - void movdqa(const Operand& dst, XMMRegister src); - void movdqa(XMMRegister dst, const Operand& src); + void movdqa(Operand dst, XMMRegister src); + void movdqa(XMMRegister dst, Operand src); - void movdqu(const Operand& dst, XMMRegister src); - void movdqu(XMMRegister dst, const Operand& src); + void movdqu(Operand dst, XMMRegister src); + void movdqu(XMMRegister dst, Operand src); void movapd(XMMRegister dst, XMMRegister src); - void movupd(XMMRegister dst, const Operand& src); - void movupd(const Operand& dst, XMMRegister src); + void movupd(XMMRegister dst, Operand src); + void movupd(Operand dst, XMMRegister src); void psllq(XMMRegister reg, byte imm8); void psrlq(XMMRegister reg, byte imm8); @@ -1161,98 +1144,96 @@ class Assembler : public AssemblerBase { void psraw(XMMRegister reg, byte imm8); void psrad(XMMRegister reg, byte imm8); - void cvttsd2si(Register dst, const Operand& src); + void cvttsd2si(Register dst, Operand src); void cvttsd2si(Register dst, XMMRegister src); void cvttss2siq(Register dst, XMMRegister src); - void cvttss2siq(Register dst, const Operand& src); + void cvttss2siq(Register dst, Operand src); void cvttsd2siq(Register dst, XMMRegister src); - void cvttsd2siq(Register dst, const Operand& src); + void cvttsd2siq(Register dst, Operand src); - void cvtlsi2sd(XMMRegister dst, const Operand& src); + void cvtlsi2sd(XMMRegister dst, Operand src); void cvtlsi2sd(XMMRegister dst, Register src); - void cvtqsi2ss(XMMRegister dst, const Operand& src); + void cvtqsi2ss(XMMRegister dst, Operand src); void cvtqsi2ss(XMMRegister dst, Register src); - void cvtqsi2sd(XMMRegister dst, const Operand& src); + void cvtqsi2sd(XMMRegister dst, Operand src); void cvtqsi2sd(XMMRegister dst, Register src); void cvtss2sd(XMMRegister dst, XMMRegister src); - void cvtss2sd(XMMRegister dst, const Operand& src); + void cvtss2sd(XMMRegister dst, Operand src); void cvtsd2ss(XMMRegister dst, XMMRegister src); - void cvtsd2ss(XMMRegister dst, const Operand& src); + void cvtsd2ss(XMMRegister dst, Operand src); void cvtsd2si(Register dst, XMMRegister src); void cvtsd2siq(Register dst, XMMRegister src); void addsd(XMMRegister dst, XMMRegister src); - void addsd(XMMRegister dst, const Operand& src); + void addsd(XMMRegister dst, Operand src); void subsd(XMMRegister dst, XMMRegister src); - void subsd(XMMRegister dst, const Operand& src); + void subsd(XMMRegister dst, Operand src); void mulsd(XMMRegister dst, XMMRegister src); - void mulsd(XMMRegister dst, const Operand& src); + void mulsd(XMMRegister dst, Operand src); void divsd(XMMRegister dst, XMMRegister src); - void divsd(XMMRegister dst, const Operand& src); + void divsd(XMMRegister dst, Operand src); void maxsd(XMMRegister dst, XMMRegister src); - void maxsd(XMMRegister dst, const Operand& src); + void maxsd(XMMRegister dst, Operand src); void minsd(XMMRegister dst, XMMRegister src); - void minsd(XMMRegister dst, const Operand& src); + void minsd(XMMRegister dst, Operand src); void andpd(XMMRegister dst, XMMRegister src); - void andpd(XMMRegister dst, const Operand& src); + void andpd(XMMRegister dst, Operand src); void orpd(XMMRegister dst, XMMRegister src); - void orpd(XMMRegister dst, const Operand& src); + void orpd(XMMRegister dst, Operand src); void xorpd(XMMRegister dst, XMMRegister src); - void xorpd(XMMRegister dst, const Operand& src); + void xorpd(XMMRegister dst, Operand src); void sqrtsd(XMMRegister dst, XMMRegister src); - void sqrtsd(XMMRegister dst, const Operand& src); + void sqrtsd(XMMRegister dst, Operand src); void haddps(XMMRegister dst, XMMRegister src); - void haddps(XMMRegister dst, const Operand& src); + void haddps(XMMRegister dst, Operand src); void ucomisd(XMMRegister dst, XMMRegister src); - void ucomisd(XMMRegister dst, const Operand& src); + void ucomisd(XMMRegister dst, Operand src); void cmpltsd(XMMRegister dst, XMMRegister src); void movmskpd(Register dst, XMMRegister src); void punpckldq(XMMRegister dst, XMMRegister src); - void punpckldq(XMMRegister dst, const Operand& src); + void punpckldq(XMMRegister dst, Operand src); void punpckhdq(XMMRegister dst, XMMRegister src); // SSE 4.1 instruction void insertps(XMMRegister dst, XMMRegister src, byte imm8); void extractps(Register dst, XMMRegister src, byte imm8); void pextrb(Register dst, XMMRegister src, int8_t imm8); - void pextrb(const Operand& dst, XMMRegister src, int8_t imm8); + void pextrb(Operand dst, XMMRegister src, int8_t imm8); void pextrw(Register dst, XMMRegister src, int8_t imm8); - void pextrw(const Operand& dst, XMMRegister src, int8_t imm8); + void pextrw(Operand dst, XMMRegister src, int8_t imm8); void pextrd(Register dst, XMMRegister src, int8_t imm8); - void pextrd(const Operand& dst, XMMRegister src, int8_t imm8); + void pextrd(Operand dst, XMMRegister src, int8_t imm8); void pinsrb(XMMRegister dst, Register src, int8_t imm8); - void pinsrb(XMMRegister dst, const Operand& src, int8_t imm8); + void pinsrb(XMMRegister dst, Operand src, int8_t imm8); void pinsrw(XMMRegister dst, Register src, int8_t imm8); - void pinsrw(XMMRegister dst, const Operand& src, int8_t imm8); + void pinsrw(XMMRegister dst, Operand src, int8_t imm8); void pinsrd(XMMRegister dst, Register src, int8_t imm8); - void pinsrd(XMMRegister dst, const Operand& src, int8_t imm8); + void pinsrd(XMMRegister dst, Operand src, int8_t imm8); void roundss(XMMRegister dst, XMMRegister src, RoundingMode mode); void roundsd(XMMRegister dst, XMMRegister src, RoundingMode mode); void cmpps(XMMRegister dst, XMMRegister src, int8_t cmp); - void cmpps(XMMRegister dst, const Operand& src, int8_t cmp); + void cmpps(XMMRegister dst, Operand src, int8_t cmp); void cmppd(XMMRegister dst, XMMRegister src, int8_t cmp); - void cmppd(XMMRegister dst, const Operand& src, int8_t cmp); + void cmppd(XMMRegister dst, Operand src, int8_t cmp); #define SSE_CMP_P(instr, imm8) \ void instr##ps(XMMRegister dst, XMMRegister src) { cmpps(dst, src, imm8); } \ - void instr##ps(XMMRegister dst, const Operand& src) { \ - cmpps(dst, src, imm8); \ - } \ + void instr##ps(XMMRegister dst, Operand src) { cmpps(dst, src, imm8); } \ void instr##pd(XMMRegister dst, XMMRegister src) { cmppd(dst, src, imm8); } \ - void instr##pd(XMMRegister dst, const Operand& src) { cmppd(dst, src, imm8); } + void instr##pd(XMMRegister dst, Operand src) { cmppd(dst, src, imm8); } SSE_CMP_P(cmpeq, 0x0); SSE_CMP_P(cmplt, 0x1); @@ -1264,25 +1245,25 @@ class Assembler : public AssemblerBase { #undef SSE_CMP_P void minps(XMMRegister dst, XMMRegister src); - void minps(XMMRegister dst, const Operand& src); + void minps(XMMRegister dst, Operand src); void maxps(XMMRegister dst, XMMRegister src); - void maxps(XMMRegister dst, const Operand& src); + void maxps(XMMRegister dst, Operand src); void rcpps(XMMRegister dst, XMMRegister src); - void rcpps(XMMRegister dst, const Operand& src); + void rcpps(XMMRegister dst, Operand src); void rsqrtps(XMMRegister dst, XMMRegister src); - void rsqrtps(XMMRegister dst, const Operand& src); + void rsqrtps(XMMRegister dst, Operand src); void sqrtps(XMMRegister dst, XMMRegister src); - void sqrtps(XMMRegister dst, const Operand& src); + void sqrtps(XMMRegister dst, Operand src); void movups(XMMRegister dst, XMMRegister src); - void movups(XMMRegister dst, const Operand& src); - void movups(const Operand& dst, XMMRegister src); + void movups(XMMRegister dst, Operand src); + void movups(Operand dst, XMMRegister src); void psrldq(XMMRegister dst, uint8_t shift); void pshufd(XMMRegister dst, XMMRegister src, uint8_t shuffle); - void pshufd(XMMRegister dst, const Operand& src, uint8_t shuffle); + void pshufd(XMMRegister dst, Operand src, uint8_t shuffle); void pshufhw(XMMRegister dst, XMMRegister src, uint8_t shuffle); void pshuflw(XMMRegister dst, XMMRegister src, uint8_t shuffle); void cvtdq2ps(XMMRegister dst, XMMRegister src); - void cvtdq2ps(XMMRegister dst, const Operand& src); + void cvtdq2ps(XMMRegister dst, Operand src); // AVX instruction void vfmadd132sd(XMMRegister dst, XMMRegister src1, XMMRegister src2) { @@ -1294,13 +1275,13 @@ class Assembler : public AssemblerBase { void vfmadd231sd(XMMRegister dst, XMMRegister src1, XMMRegister src2) { vfmasd(0xb9, dst, src1, src2); } - void vfmadd132sd(XMMRegister dst, XMMRegister src1, const Operand& src2) { + void vfmadd132sd(XMMRegister dst, XMMRegister src1, Operand src2) { vfmasd(0x99, dst, src1, src2); } - void vfmadd213sd(XMMRegister dst, XMMRegister src1, const Operand& src2) { + void vfmadd213sd(XMMRegister dst, XMMRegister src1, Operand src2) { vfmasd(0xa9, dst, src1, src2); } - void vfmadd231sd(XMMRegister dst, XMMRegister src1, const Operand& src2) { + void vfmadd231sd(XMMRegister dst, XMMRegister src1, Operand src2) { vfmasd(0xb9, dst, src1, src2); } void vfmsub132sd(XMMRegister dst, XMMRegister src1, XMMRegister src2) { @@ -1312,13 +1293,13 @@ class Assembler : public AssemblerBase { void vfmsub231sd(XMMRegister dst, XMMRegister src1, XMMRegister src2) { vfmasd(0xbb, dst, src1, src2); } - void vfmsub132sd(XMMRegister dst, XMMRegister src1, const Operand& src2) { + void vfmsub132sd(XMMRegister dst, XMMRegister src1, Operand src2) { vfmasd(0x9b, dst, src1, src2); } - void vfmsub213sd(XMMRegister dst, XMMRegister src1, const Operand& src2) { + void vfmsub213sd(XMMRegister dst, XMMRegister src1, Operand src2) { vfmasd(0xab, dst, src1, src2); } - void vfmsub231sd(XMMRegister dst, XMMRegister src1, const Operand& src2) { + void vfmsub231sd(XMMRegister dst, XMMRegister src1, Operand src2) { vfmasd(0xbb, dst, src1, src2); } void vfnmadd132sd(XMMRegister dst, XMMRegister src1, XMMRegister src2) { @@ -1330,13 +1311,13 @@ class Assembler : public AssemblerBase { void vfnmadd231sd(XMMRegister dst, XMMRegister src1, XMMRegister src2) { vfmasd(0xbd, dst, src1, src2); } - void vfnmadd132sd(XMMRegister dst, XMMRegister src1, const Operand& src2) { + void vfnmadd132sd(XMMRegister dst, XMMRegister src1, Operand src2) { vfmasd(0x9d, dst, src1, src2); } - void vfnmadd213sd(XMMRegister dst, XMMRegister src1, const Operand& src2) { + void vfnmadd213sd(XMMRegister dst, XMMRegister src1, Operand src2) { vfmasd(0xad, dst, src1, src2); } - void vfnmadd231sd(XMMRegister dst, XMMRegister src1, const Operand& src2) { + void vfnmadd231sd(XMMRegister dst, XMMRegister src1, Operand src2) { vfmasd(0xbd, dst, src1, src2); } void vfnmsub132sd(XMMRegister dst, XMMRegister src1, XMMRegister src2) { @@ -1348,17 +1329,17 @@ class Assembler : public AssemblerBase { void vfnmsub231sd(XMMRegister dst, XMMRegister src1, XMMRegister src2) { vfmasd(0xbf, dst, src1, src2); } - void vfnmsub132sd(XMMRegister dst, XMMRegister src1, const Operand& src2) { + void vfnmsub132sd(XMMRegister dst, XMMRegister src1, Operand src2) { vfmasd(0x9f, dst, src1, src2); } - void vfnmsub213sd(XMMRegister dst, XMMRegister src1, const Operand& src2) { + void vfnmsub213sd(XMMRegister dst, XMMRegister src1, Operand src2) { vfmasd(0xaf, dst, src1, src2); } - void vfnmsub231sd(XMMRegister dst, XMMRegister src1, const Operand& src2) { + void vfnmsub231sd(XMMRegister dst, XMMRegister src1, Operand src2) { vfmasd(0xbf, dst, src1, src2); } void vfmasd(byte op, XMMRegister dst, XMMRegister src1, XMMRegister src2); - void vfmasd(byte op, XMMRegister dst, XMMRegister src1, const Operand& src2); + void vfmasd(byte op, XMMRegister dst, XMMRegister src1, Operand src2); void vfmadd132ss(XMMRegister dst, XMMRegister src1, XMMRegister src2) { vfmass(0x99, dst, src1, src2); @@ -1369,13 +1350,13 @@ class Assembler : public AssemblerBase { void vfmadd231ss(XMMRegister dst, XMMRegister src1, XMMRegister src2) { vfmass(0xb9, dst, src1, src2); } - void vfmadd132ss(XMMRegister dst, XMMRegister src1, const Operand& src2) { + void vfmadd132ss(XMMRegister dst, XMMRegister src1, Operand src2) { vfmass(0x99, dst, src1, src2); } - void vfmadd213ss(XMMRegister dst, XMMRegister src1, const Operand& src2) { + void vfmadd213ss(XMMRegister dst, XMMRegister src1, Operand src2) { vfmass(0xa9, dst, src1, src2); } - void vfmadd231ss(XMMRegister dst, XMMRegister src1, const Operand& src2) { + void vfmadd231ss(XMMRegister dst, XMMRegister src1, Operand src2) { vfmass(0xb9, dst, src1, src2); } void vfmsub132ss(XMMRegister dst, XMMRegister src1, XMMRegister src2) { @@ -1387,13 +1368,13 @@ class Assembler : public AssemblerBase { void vfmsub231ss(XMMRegister dst, XMMRegister src1, XMMRegister src2) { vfmass(0xbb, dst, src1, src2); } - void vfmsub132ss(XMMRegister dst, XMMRegister src1, const Operand& src2) { + void vfmsub132ss(XMMRegister dst, XMMRegister src1, Operand src2) { vfmass(0x9b, dst, src1, src2); } - void vfmsub213ss(XMMRegister dst, XMMRegister src1, const Operand& src2) { + void vfmsub213ss(XMMRegister dst, XMMRegister src1, Operand src2) { vfmass(0xab, dst, src1, src2); } - void vfmsub231ss(XMMRegister dst, XMMRegister src1, const Operand& src2) { + void vfmsub231ss(XMMRegister dst, XMMRegister src1, Operand src2) { vfmass(0xbb, dst, src1, src2); } void vfnmadd132ss(XMMRegister dst, XMMRegister src1, XMMRegister src2) { @@ -1405,13 +1386,13 @@ class Assembler : public AssemblerBase { void vfnmadd231ss(XMMRegister dst, XMMRegister src1, XMMRegister src2) { vfmass(0xbd, dst, src1, src2); } - void vfnmadd132ss(XMMRegister dst, XMMRegister src1, const Operand& src2) { + void vfnmadd132ss(XMMRegister dst, XMMRegister src1, Operand src2) { vfmass(0x9d, dst, src1, src2); } - void vfnmadd213ss(XMMRegister dst, XMMRegister src1, const Operand& src2) { + void vfnmadd213ss(XMMRegister dst, XMMRegister src1, Operand src2) { vfmass(0xad, dst, src1, src2); } - void vfnmadd231ss(XMMRegister dst, XMMRegister src1, const Operand& src2) { + void vfnmadd231ss(XMMRegister dst, XMMRegister src1, Operand src2) { vfmass(0xbd, dst, src1, src2); } void vfnmsub132ss(XMMRegister dst, XMMRegister src1, XMMRegister src2) { @@ -1423,34 +1404,30 @@ class Assembler : public AssemblerBase { void vfnmsub231ss(XMMRegister dst, XMMRegister src1, XMMRegister src2) { vfmass(0xbf, dst, src1, src2); } - void vfnmsub132ss(XMMRegister dst, XMMRegister src1, const Operand& src2) { + void vfnmsub132ss(XMMRegister dst, XMMRegister src1, Operand src2) { vfmass(0x9f, dst, src1, src2); } - void vfnmsub213ss(XMMRegister dst, XMMRegister src1, const Operand& src2) { + void vfnmsub213ss(XMMRegister dst, XMMRegister src1, Operand src2) { vfmass(0xaf, dst, src1, src2); } - void vfnmsub231ss(XMMRegister dst, XMMRegister src1, const Operand& src2) { + void vfnmsub231ss(XMMRegister dst, XMMRegister src1, Operand src2) { vfmass(0xbf, dst, src1, src2); } void vfmass(byte op, XMMRegister dst, XMMRegister src1, XMMRegister src2); - void vfmass(byte op, XMMRegister dst, XMMRegister src1, const Operand& src2); + void vfmass(byte op, XMMRegister dst, XMMRegister src1, Operand src2); void vmovd(XMMRegister dst, Register src); - void vmovd(XMMRegister dst, const Operand& src); + void vmovd(XMMRegister dst, Operand src); void vmovd(Register dst, XMMRegister src); void vmovq(XMMRegister dst, Register src); - void vmovq(XMMRegister dst, const Operand& src); + void vmovq(XMMRegister dst, Operand src); void vmovq(Register dst, XMMRegister src); void vmovsd(XMMRegister dst, XMMRegister src1, XMMRegister src2) { vsd(0x10, dst, src1, src2); } - void vmovsd(XMMRegister dst, const Operand& src) { - vsd(0x10, dst, xmm0, src); - } - void vmovsd(const Operand& dst, XMMRegister src) { - vsd(0x11, src, xmm0, dst); - } + void vmovsd(XMMRegister dst, Operand src) { vsd(0x10, dst, xmm0, src); } + void vmovsd(Operand dst, XMMRegister src) { vsd(0x11, src, xmm0, dst); } #define AVX_SP_3(instr, opcode) \ AVX_S_3(instr, opcode) \ @@ -1464,12 +1441,12 @@ class Assembler : public AssemblerBase { AVX_3(instr##ps, opcode, vps) \ AVX_3(instr##pd, opcode, vpd) -#define AVX_3(instr, opcode, impl) \ - void instr(XMMRegister dst, XMMRegister src1, XMMRegister src2) { \ - impl(opcode, dst, src1, src2); \ - } \ - void instr(XMMRegister dst, XMMRegister src1, const Operand& src2) { \ - impl(opcode, dst, src1, src2); \ +#define AVX_3(instr, opcode, impl) \ + void instr(XMMRegister dst, XMMRegister src1, XMMRegister src2) { \ + impl(opcode, dst, src1, src2); \ + } \ + void instr(XMMRegister dst, XMMRegister src1, Operand src2) { \ + impl(opcode, dst, src1, src2); \ } AVX_SP_3(vsqrt, 0x51); @@ -1500,42 +1477,42 @@ class Assembler : public AssemblerBase { void vcvtss2sd(XMMRegister dst, XMMRegister src1, XMMRegister src2) { vinstr(0x5a, dst, src1, src2, kF3, k0F, kWIG); } - void vcvtss2sd(XMMRegister dst, XMMRegister src1, const Operand& src2) { + void vcvtss2sd(XMMRegister dst, XMMRegister src1, Operand src2) { vinstr(0x5a, dst, src1, src2, kF3, k0F, kWIG); } void vcvtlsi2sd(XMMRegister dst, XMMRegister src1, Register src2) { XMMRegister isrc2 = XMMRegister::from_code(src2.code()); vinstr(0x2a, dst, src1, isrc2, kF2, k0F, kW0); } - void vcvtlsi2sd(XMMRegister dst, XMMRegister src1, const Operand& src2) { + void vcvtlsi2sd(XMMRegister dst, XMMRegister src1, Operand src2) { vinstr(0x2a, dst, src1, src2, kF2, k0F, kW0); } void vcvtlsi2ss(XMMRegister dst, XMMRegister src1, Register src2) { XMMRegister isrc2 = XMMRegister::from_code(src2.code()); vinstr(0x2a, dst, src1, isrc2, kF3, k0F, kW0); } - void vcvtlsi2ss(XMMRegister dst, XMMRegister src1, const Operand& src2) { + void vcvtlsi2ss(XMMRegister dst, XMMRegister src1, Operand src2) { vinstr(0x2a, dst, src1, src2, kF3, k0F, kW0); } void vcvtqsi2ss(XMMRegister dst, XMMRegister src1, Register src2) { XMMRegister isrc2 = XMMRegister::from_code(src2.code()); vinstr(0x2a, dst, src1, isrc2, kF3, k0F, kW1); } - void vcvtqsi2ss(XMMRegister dst, XMMRegister src1, const Operand& src2) { + void vcvtqsi2ss(XMMRegister dst, XMMRegister src1, Operand src2) { vinstr(0x2a, dst, src1, src2, kF3, k0F, kW1); } void vcvtqsi2sd(XMMRegister dst, XMMRegister src1, Register src2) { XMMRegister isrc2 = XMMRegister::from_code(src2.code()); vinstr(0x2a, dst, src1, isrc2, kF2, k0F, kW1); } - void vcvtqsi2sd(XMMRegister dst, XMMRegister src1, const Operand& src2) { + void vcvtqsi2sd(XMMRegister dst, XMMRegister src1, Operand src2) { vinstr(0x2a, dst, src1, src2, kF2, k0F, kW1); } void vcvttss2si(Register dst, XMMRegister src) { XMMRegister idst = XMMRegister::from_code(dst.code()); vinstr(0x2c, idst, xmm0, src, kF3, k0F, kW0); } - void vcvttss2si(Register dst, const Operand& src) { + void vcvttss2si(Register dst, Operand src) { XMMRegister idst = XMMRegister::from_code(dst.code()); vinstr(0x2c, idst, xmm0, src, kF3, k0F, kW0); } @@ -1543,7 +1520,7 @@ class Assembler : public AssemblerBase { XMMRegister idst = XMMRegister::from_code(dst.code()); vinstr(0x2c, idst, xmm0, src, kF2, k0F, kW0); } - void vcvttsd2si(Register dst, const Operand& src) { + void vcvttsd2si(Register dst, Operand src) { XMMRegister idst = XMMRegister::from_code(dst.code()); vinstr(0x2c, idst, xmm0, src, kF2, k0F, kW0); } @@ -1551,7 +1528,7 @@ class Assembler : public AssemblerBase { XMMRegister idst = XMMRegister::from_code(dst.code()); vinstr(0x2c, idst, xmm0, src, kF3, k0F, kW1); } - void vcvttss2siq(Register dst, const Operand& src) { + void vcvttss2siq(Register dst, Operand src) { XMMRegister idst = XMMRegister::from_code(dst.code()); vinstr(0x2c, idst, xmm0, src, kF3, k0F, kW1); } @@ -1559,7 +1536,7 @@ class Assembler : public AssemblerBase { XMMRegister idst = XMMRegister::from_code(dst.code()); vinstr(0x2c, idst, xmm0, src, kF2, k0F, kW1); } - void vcvttsd2siq(Register dst, const Operand& src) { + void vcvttsd2siq(Register dst, Operand src) { XMMRegister idst = XMMRegister::from_code(dst.code()); vinstr(0x2c, idst, xmm0, src, kF2, k0F, kW1); } @@ -1570,7 +1547,7 @@ class Assembler : public AssemblerBase { void vucomisd(XMMRegister dst, XMMRegister src) { vinstr(0x2e, dst, xmm0, src, k66, k0F, kWIG); } - void vucomisd(XMMRegister dst, const Operand& src) { + void vucomisd(XMMRegister dst, Operand src) { vinstr(0x2e, dst, xmm0, src, k66, k0F, kWIG); } void vroundss(XMMRegister dst, XMMRegister src1, XMMRegister src2, @@ -1587,39 +1564,27 @@ class Assembler : public AssemblerBase { void vsd(byte op, XMMRegister dst, XMMRegister src1, XMMRegister src2) { vinstr(op, dst, src1, src2, kF2, k0F, kWIG); } - void vsd(byte op, XMMRegister dst, XMMRegister src1, const Operand& src2) { + void vsd(byte op, XMMRegister dst, XMMRegister src1, Operand src2) { vinstr(op, dst, src1, src2, kF2, k0F, kWIG); } void vmovss(XMMRegister dst, XMMRegister src1, XMMRegister src2) { vss(0x10, dst, src1, src2); } - void vmovss(XMMRegister dst, const Operand& src) { - vss(0x10, dst, xmm0, src); - } - void vmovss(const Operand& dst, XMMRegister src) { - vss(0x11, src, xmm0, dst); - } + void vmovss(XMMRegister dst, Operand src) { vss(0x10, dst, xmm0, src); } + void vmovss(Operand dst, XMMRegister src) { vss(0x11, src, xmm0, dst); } void vucomiss(XMMRegister dst, XMMRegister src); - void vucomiss(XMMRegister dst, const Operand& src); + void vucomiss(XMMRegister dst, Operand src); void vss(byte op, XMMRegister dst, XMMRegister src1, XMMRegister src2); - void vss(byte op, XMMRegister dst, XMMRegister src1, const Operand& src2); + void vss(byte op, XMMRegister dst, XMMRegister src1, Operand src2); void vmovaps(XMMRegister dst, XMMRegister src) { vps(0x28, dst, xmm0, src); } void vmovups(XMMRegister dst, XMMRegister src) { vps(0x10, dst, xmm0, src); } - void vmovups(XMMRegister dst, const Operand& src) { - vps(0x10, dst, xmm0, src); - } - void vmovups(const Operand& dst, XMMRegister src) { - vps(0x11, src, xmm0, dst); - } + void vmovups(XMMRegister dst, Operand src) { vps(0x10, dst, xmm0, src); } + void vmovups(Operand dst, XMMRegister src) { vps(0x11, src, xmm0, dst); } void vmovapd(XMMRegister dst, XMMRegister src) { vpd(0x28, dst, xmm0, src); } - void vmovupd(XMMRegister dst, const Operand& src) { - vpd(0x10, dst, xmm0, src); - } - void vmovupd(const Operand& dst, XMMRegister src) { - vpd(0x11, src, xmm0, dst); - } + void vmovupd(XMMRegister dst, Operand src) { vpd(0x10, dst, xmm0, src); } + void vmovupd(Operand dst, XMMRegister src) { vpd(0x11, src, xmm0, dst); } void vmovmskps(Register dst, XMMRegister src) { XMMRegister idst = XMMRegister::from_code(dst.code()); vps(0x50, idst, xmm0, src); @@ -1632,8 +1597,7 @@ class Assembler : public AssemblerBase { vps(0xC2, dst, src1, src2); emit(cmp); } - void vcmpps(XMMRegister dst, XMMRegister src1, const Operand& src2, - int8_t cmp) { + void vcmpps(XMMRegister dst, XMMRegister src1, Operand src2, int8_t cmp) { vps(0xC2, dst, src1, src2); emit(cmp); } @@ -1641,24 +1605,23 @@ class Assembler : public AssemblerBase { vpd(0xC2, dst, src1, src2); emit(cmp); } - void vcmppd(XMMRegister dst, XMMRegister src1, const Operand& src2, - int8_t cmp) { + void vcmppd(XMMRegister dst, XMMRegister src1, Operand src2, int8_t cmp) { vpd(0xC2, dst, src1, src2); emit(cmp); } -#define AVX_CMP_P(instr, imm8) \ - void instr##ps(XMMRegister dst, XMMRegister src1, XMMRegister src2) { \ - vcmpps(dst, src1, src2, imm8); \ - } \ - void instr##ps(XMMRegister dst, XMMRegister src1, const Operand& src2) { \ - vcmpps(dst, src1, src2, imm8); \ - } \ - void instr##pd(XMMRegister dst, XMMRegister src1, XMMRegister src2) { \ - vcmppd(dst, src1, src2, imm8); \ - } \ - void instr##pd(XMMRegister dst, XMMRegister src1, const Operand& src2) { \ - vcmppd(dst, src1, src2, imm8); \ +#define AVX_CMP_P(instr, imm8) \ + void instr##ps(XMMRegister dst, XMMRegister src1, XMMRegister src2) { \ + vcmpps(dst, src1, src2, imm8); \ + } \ + void instr##ps(XMMRegister dst, XMMRegister src1, Operand src2) { \ + vcmpps(dst, src1, src2, imm8); \ + } \ + void instr##pd(XMMRegister dst, XMMRegister src1, XMMRegister src2) { \ + vcmppd(dst, src1, src2, imm8); \ + } \ + void instr##pd(XMMRegister dst, XMMRegister src1, Operand src2) { \ + vcmppd(dst, src1, src2, imm8); \ } AVX_CMP_P(vcmpeq, 0x0); @@ -1670,7 +1633,7 @@ class Assembler : public AssemblerBase { #undef AVX_CMP_P - void vlddqu(XMMRegister dst, const Operand& src) { + void vlddqu(XMMRegister dst, Operand src) { vinstr(0xF0, dst, xmm0, src, kF2, k0F, kWIG); } void vpsllw(XMMRegister dst, XMMRegister src, int8_t imm8) { @@ -1702,7 +1665,7 @@ class Assembler : public AssemblerBase { vinstr(0x14, src, xmm0, idst, k66, k0F3A, kW0); emit(imm8); } - void vpextrb(const Operand& dst, XMMRegister src, int8_t imm8) { + void vpextrb(Operand dst, XMMRegister src, int8_t imm8) { vinstr(0x14, src, xmm0, dst, k66, k0F3A, kW0); emit(imm8); } @@ -1711,7 +1674,7 @@ class Assembler : public AssemblerBase { vinstr(0xc5, idst, xmm0, src, k66, k0F, kW0); emit(imm8); } - void vpextrw(const Operand& dst, XMMRegister src, int8_t imm8) { + void vpextrw(Operand dst, XMMRegister src, int8_t imm8) { vinstr(0x15, src, xmm0, dst, k66, k0F3A, kW0); emit(imm8); } @@ -1720,7 +1683,7 @@ class Assembler : public AssemblerBase { vinstr(0x16, src, xmm0, idst, k66, k0F3A, kW0); emit(imm8); } - void vpextrd(const Operand& dst, XMMRegister src, int8_t imm8) { + void vpextrd(Operand dst, XMMRegister src, int8_t imm8) { vinstr(0x16, src, xmm0, dst, k66, k0F3A, kW0); emit(imm8); } @@ -1729,8 +1692,7 @@ class Assembler : public AssemblerBase { vinstr(0x20, dst, src1, isrc, k66, k0F3A, kW0); emit(imm8); } - void vpinsrb(XMMRegister dst, XMMRegister src1, const Operand& src2, - int8_t imm8) { + void vpinsrb(XMMRegister dst, XMMRegister src1, Operand src2, int8_t imm8) { vinstr(0x20, dst, src1, src2, k66, k0F3A, kW0); emit(imm8); } @@ -1739,8 +1701,7 @@ class Assembler : public AssemblerBase { vinstr(0xc4, dst, src1, isrc, k66, k0F, kW0); emit(imm8); } - void vpinsrw(XMMRegister dst, XMMRegister src1, const Operand& src2, - int8_t imm8) { + void vpinsrw(XMMRegister dst, XMMRegister src1, Operand src2, int8_t imm8) { vinstr(0xc4, dst, src1, src2, k66, k0F, kW0); emit(imm8); } @@ -1749,8 +1710,7 @@ class Assembler : public AssemblerBase { vinstr(0x22, dst, src1, isrc, k66, k0F3A, kW0); emit(imm8); } - void vpinsrd(XMMRegister dst, XMMRegister src1, const Operand& src2, - int8_t imm8) { + void vpinsrd(XMMRegister dst, XMMRegister src1, Operand src2, int8_t imm8) { vinstr(0x22, dst, src1, src2, k66, k0F3A, kW0); emit(imm8); } @@ -1760,150 +1720,150 @@ class Assembler : public AssemblerBase { } void vps(byte op, XMMRegister dst, XMMRegister src1, XMMRegister src2); - void vps(byte op, XMMRegister dst, XMMRegister src1, const Operand& src2); + void vps(byte op, XMMRegister dst, XMMRegister src1, Operand src2); void vpd(byte op, XMMRegister dst, XMMRegister src1, XMMRegister src2); - void vpd(byte op, XMMRegister dst, XMMRegister src1, const Operand& src2); + void vpd(byte op, XMMRegister dst, XMMRegister src1, Operand src2); // BMI instruction void andnq(Register dst, Register src1, Register src2) { bmi1q(0xf2, dst, src1, src2); } - void andnq(Register dst, Register src1, const Operand& src2) { + void andnq(Register dst, Register src1, Operand src2) { bmi1q(0xf2, dst, src1, src2); } void andnl(Register dst, Register src1, Register src2) { bmi1l(0xf2, dst, src1, src2); } - void andnl(Register dst, Register src1, const Operand& src2) { + void andnl(Register dst, Register src1, Operand src2) { bmi1l(0xf2, dst, src1, src2); } void bextrq(Register dst, Register src1, Register src2) { bmi1q(0xf7, dst, src2, src1); } - void bextrq(Register dst, const Operand& src1, Register src2) { + void bextrq(Register dst, Operand src1, Register src2) { bmi1q(0xf7, dst, src2, src1); } void bextrl(Register dst, Register src1, Register src2) { bmi1l(0xf7, dst, src2, src1); } - void bextrl(Register dst, const Operand& src1, Register src2) { + void bextrl(Register dst, Operand src1, Register src2) { bmi1l(0xf7, dst, src2, src1); } void blsiq(Register dst, Register src) { bmi1q(0xf3, rbx, dst, src); } - void blsiq(Register dst, const Operand& src) { bmi1q(0xf3, rbx, dst, src); } + void blsiq(Register dst, Operand src) { bmi1q(0xf3, rbx, dst, src); } void blsil(Register dst, Register src) { bmi1l(0xf3, rbx, dst, src); } - void blsil(Register dst, const Operand& src) { bmi1l(0xf3, rbx, dst, src); } + void blsil(Register dst, Operand src) { bmi1l(0xf3, rbx, dst, src); } void blsmskq(Register dst, Register src) { bmi1q(0xf3, rdx, dst, src); } - void blsmskq(Register dst, const Operand& src) { bmi1q(0xf3, rdx, dst, src); } + void blsmskq(Register dst, Operand src) { bmi1q(0xf3, rdx, dst, src); } void blsmskl(Register dst, Register src) { bmi1l(0xf3, rdx, dst, src); } - void blsmskl(Register dst, const Operand& src) { bmi1l(0xf3, rdx, dst, src); } + void blsmskl(Register dst, Operand src) { bmi1l(0xf3, rdx, dst, src); } void blsrq(Register dst, Register src) { bmi1q(0xf3, rcx, dst, src); } - void blsrq(Register dst, const Operand& src) { bmi1q(0xf3, rcx, dst, src); } + void blsrq(Register dst, Operand src) { bmi1q(0xf3, rcx, dst, src); } void blsrl(Register dst, Register src) { bmi1l(0xf3, rcx, dst, src); } - void blsrl(Register dst, const Operand& src) { bmi1l(0xf3, rcx, dst, src); } + void blsrl(Register dst, Operand src) { bmi1l(0xf3, rcx, dst, src); } void tzcntq(Register dst, Register src); - void tzcntq(Register dst, const Operand& src); + void tzcntq(Register dst, Operand src); void tzcntl(Register dst, Register src); - void tzcntl(Register dst, const Operand& src); + void tzcntl(Register dst, Operand src); void lzcntq(Register dst, Register src); - void lzcntq(Register dst, const Operand& src); + void lzcntq(Register dst, Operand src); void lzcntl(Register dst, Register src); - void lzcntl(Register dst, const Operand& src); + void lzcntl(Register dst, Operand src); void popcntq(Register dst, Register src); - void popcntq(Register dst, const Operand& src); + void popcntq(Register dst, Operand src); void popcntl(Register dst, Register src); - void popcntl(Register dst, const Operand& src); + void popcntl(Register dst, Operand src); void bzhiq(Register dst, Register src1, Register src2) { bmi2q(kNone, 0xf5, dst, src2, src1); } - void bzhiq(Register dst, const Operand& src1, Register src2) { + void bzhiq(Register dst, Operand src1, Register src2) { bmi2q(kNone, 0xf5, dst, src2, src1); } void bzhil(Register dst, Register src1, Register src2) { bmi2l(kNone, 0xf5, dst, src2, src1); } - void bzhil(Register dst, const Operand& src1, Register src2) { + void bzhil(Register dst, Operand src1, Register src2) { bmi2l(kNone, 0xf5, dst, src2, src1); } void mulxq(Register dst1, Register dst2, Register src) { bmi2q(kF2, 0xf6, dst1, dst2, src); } - void mulxq(Register dst1, Register dst2, const Operand& src) { + void mulxq(Register dst1, Register dst2, Operand src) { bmi2q(kF2, 0xf6, dst1, dst2, src); } void mulxl(Register dst1, Register dst2, Register src) { bmi2l(kF2, 0xf6, dst1, dst2, src); } - void mulxl(Register dst1, Register dst2, const Operand& src) { + void mulxl(Register dst1, Register dst2, Operand src) { bmi2l(kF2, 0xf6, dst1, dst2, src); } void pdepq(Register dst, Register src1, Register src2) { bmi2q(kF2, 0xf5, dst, src1, src2); } - void pdepq(Register dst, Register src1, const Operand& src2) { + void pdepq(Register dst, Register src1, Operand src2) { bmi2q(kF2, 0xf5, dst, src1, src2); } void pdepl(Register dst, Register src1, Register src2) { bmi2l(kF2, 0xf5, dst, src1, src2); } - void pdepl(Register dst, Register src1, const Operand& src2) { + void pdepl(Register dst, Register src1, Operand src2) { bmi2l(kF2, 0xf5, dst, src1, src2); } void pextq(Register dst, Register src1, Register src2) { bmi2q(kF3, 0xf5, dst, src1, src2); } - void pextq(Register dst, Register src1, const Operand& src2) { + void pextq(Register dst, Register src1, Operand src2) { bmi2q(kF3, 0xf5, dst, src1, src2); } void pextl(Register dst, Register src1, Register src2) { bmi2l(kF3, 0xf5, dst, src1, src2); } - void pextl(Register dst, Register src1, const Operand& src2) { + void pextl(Register dst, Register src1, Operand src2) { bmi2l(kF3, 0xf5, dst, src1, src2); } void sarxq(Register dst, Register src1, Register src2) { bmi2q(kF3, 0xf7, dst, src2, src1); } - void sarxq(Register dst, const Operand& src1, Register src2) { + void sarxq(Register dst, Operand src1, Register src2) { bmi2q(kF3, 0xf7, dst, src2, src1); } void sarxl(Register dst, Register src1, Register src2) { bmi2l(kF3, 0xf7, dst, src2, src1); } - void sarxl(Register dst, const Operand& src1, Register src2) { + void sarxl(Register dst, Operand src1, Register src2) { bmi2l(kF3, 0xf7, dst, src2, src1); } void shlxq(Register dst, Register src1, Register src2) { bmi2q(k66, 0xf7, dst, src2, src1); } - void shlxq(Register dst, const Operand& src1, Register src2) { + void shlxq(Register dst, Operand src1, Register src2) { bmi2q(k66, 0xf7, dst, src2, src1); } void shlxl(Register dst, Register src1, Register src2) { bmi2l(k66, 0xf7, dst, src2, src1); } - void shlxl(Register dst, const Operand& src1, Register src2) { + void shlxl(Register dst, Operand src1, Register src2) { bmi2l(k66, 0xf7, dst, src2, src1); } void shrxq(Register dst, Register src1, Register src2) { bmi2q(kF2, 0xf7, dst, src2, src1); } - void shrxq(Register dst, const Operand& src1, Register src2) { + void shrxq(Register dst, Operand src1, Register src2) { bmi2q(kF2, 0xf7, dst, src2, src1); } void shrxl(Register dst, Register src1, Register src2) { bmi2l(kF2, 0xf7, dst, src2, src1); } - void shrxl(Register dst, const Operand& src1, Register src2) { + void shrxl(Register dst, Operand src1, Register src2) { bmi2l(kF2, 0xf7, dst, src2, src1); } void rorxq(Register dst, Register src, byte imm8); - void rorxq(Register dst, const Operand& src, byte imm8); + void rorxq(Register dst, Operand src, byte imm8); void rorxl(Register dst, Register src, byte imm8); - void rorxl(Register dst, const Operand& src, byte imm8); + void rorxl(Register dst, Operand src, byte imm8); void lfence(); void pause(); @@ -1961,7 +1921,7 @@ class Assembler : public AssemblerBase { protected: // Call near indirect - void call(const Operand& operand); + void call(Operand operand); private: byte* addr_at(int pos) { return buffer_ + pos; } @@ -1997,8 +1957,8 @@ class Assembler : public AssemblerBase { // The high bit of reg is used for REX.R, the high bit of op's base // register is used for REX.B, and the high bit of op's index register // is used for REX.X. REX.W is set. - inline void emit_rex_64(Register reg, const Operand& op); - inline void emit_rex_64(XMMRegister reg, const Operand& op); + inline void emit_rex_64(Register reg, Operand op); + inline void emit_rex_64(XMMRegister reg, Operand op); // Emits a REX prefix that encodes a 64-bit operand size and // the top bit of the register code. @@ -2011,7 +1971,7 @@ class Assembler : public AssemblerBase { // The high bit of op's base register is used for REX.B, and the high // bit of op's index register is used for REX.X. // REX.W is set and REX.R clear. - inline void emit_rex_64(const Operand& op); + inline void emit_rex_64(Operand op); // Emit a REX prefix that only sets REX.W to choose a 64-bit operand size. void emit_rex_64() { emit(0x48); } @@ -2023,7 +1983,7 @@ class Assembler : public AssemblerBase { // The high bit of reg is used for REX.R, the high bit of op's base // register is used for REX.B, and the high bit of op's index register // is used for REX.X. REX.W is cleared. - inline void emit_rex_32(Register reg, const Operand& op); + inline void emit_rex_32(Register reg, Operand op); // High bit of rm_reg goes to REX.B. // REX.W, REX.R and REX.X are clear. @@ -2031,7 +1991,7 @@ class Assembler : public AssemblerBase { // High bit of base goes to REX.B and high bit of index to REX.X. // REX.W and REX.R are clear. - inline void emit_rex_32(const Operand& op); + inline void emit_rex_32(Operand op); // High bit of reg goes to REX.R, high bit of rm_reg goes to REX.B. // REX.W is cleared. If no REX bits are set, no byte is emitted. @@ -2041,7 +2001,7 @@ class Assembler : public AssemblerBase { // register is used for REX.B, and the high bit of op's index register // is used for REX.X. REX.W is cleared. If no REX bits are set, nothing // is emitted. - inline void emit_optional_rex_32(Register reg, const Operand& op); + inline void emit_optional_rex_32(Register reg, Operand op); // As for emit_optional_rex_32(Register, Register), except that // the registers are XMM registers. @@ -2055,18 +2015,18 @@ class Assembler : public AssemblerBase { // one of the registers is an XMM registers. inline void emit_optional_rex_32(Register reg, XMMRegister base); - // As for emit_optional_rex_32(Register, const Operand&), except that + // As for emit_optional_rex_32(Register, Operand), except that // the register is an XMM register. - inline void emit_optional_rex_32(XMMRegister reg, const Operand& op); + inline void emit_optional_rex_32(XMMRegister reg, Operand op); // Optionally do as emit_rex_32(Register) if the register number has // the high bit set. inline void emit_optional_rex_32(Register rm_reg); inline void emit_optional_rex_32(XMMRegister rm_reg); - // Optionally do as emit_rex_32(const Operand&) if the operand register + // Optionally do as emit_rex_32(Operand) if the operand register // numbers have a high bit set. - inline void emit_optional_rex_32(const Operand& op); + inline void emit_optional_rex_32(Operand op); void emit_rex(int size) { if (size == kInt64Size) { @@ -2102,8 +2062,7 @@ class Assembler : public AssemblerBase { SIMDPrefix pp); void emit_vex3_byte0() { emit(0xc4); } inline void emit_vex3_byte1(XMMRegister reg, XMMRegister rm, LeadingOpcode m); - inline void emit_vex3_byte1(XMMRegister reg, const Operand& rm, - LeadingOpcode m); + inline void emit_vex3_byte1(XMMRegister reg, Operand rm, LeadingOpcode m); inline void emit_vex3_byte2(VexW w, XMMRegister v, VectorLength l, SIMDPrefix pp); inline void emit_vex_prefix(XMMRegister reg, XMMRegister v, XMMRegister rm, @@ -2112,10 +2071,10 @@ class Assembler : public AssemblerBase { inline void emit_vex_prefix(Register reg, Register v, Register rm, VectorLength l, SIMDPrefix pp, LeadingOpcode m, VexW w); - inline void emit_vex_prefix(XMMRegister reg, XMMRegister v, const Operand& rm, + inline void emit_vex_prefix(XMMRegister reg, XMMRegister v, Operand rm, VectorLength l, SIMDPrefix pp, LeadingOpcode m, VexW w); - inline void emit_vex_prefix(Register reg, Register v, const Operand& rm, + inline void emit_vex_prefix(Register reg, Register v, Operand rm, VectorLength l, SIMDPrefix pp, LeadingOpcode m, VexW w); @@ -2123,14 +2082,14 @@ class Assembler : public AssemblerBase { // 1- or 4-byte offset for a memory operand. Also encodes // the second operand of the operation, a register or operation // subcode, into the reg field of the ModR/M byte. - void emit_operand(Register reg, const Operand& adr) { + void emit_operand(Register reg, Operand adr) { emit_operand(reg.low_bits(), adr); } // Emit the ModR/M byte, and optionally the SIB byte and // 1- or 4-byte offset for a memory operand. Also used to encode // a three-bit opcode extension into the ModR/M byte. - void emit_operand(int rm, const Operand& adr); + void emit_operand(int rm, Operand adr); // Emit a ModR/M byte with registers coded in the reg and rm_reg fields. void emit_modrm(Register reg, Register rm_reg) { @@ -2149,8 +2108,8 @@ class Assembler : public AssemblerBase { // The first argument is the reg field, the second argument is the r/m field. void emit_sse_operand(XMMRegister dst, XMMRegister src); - void emit_sse_operand(XMMRegister reg, const Operand& adr); - void emit_sse_operand(Register reg, const Operand& adr); + void emit_sse_operand(XMMRegister reg, Operand adr); + void emit_sse_operand(Register reg, Operand adr); void emit_sse_operand(XMMRegister dst, Register src); void emit_sse_operand(Register dst, XMMRegister src); void emit_sse_operand(XMMRegister dst); @@ -2160,37 +2119,28 @@ class Assembler : public AssemblerBase { // similar, differing just in the opcode or in the reg field of the // ModR/M byte. void arithmetic_op_8(byte opcode, Register reg, Register rm_reg); - void arithmetic_op_8(byte opcode, Register reg, const Operand& rm_reg); + void arithmetic_op_8(byte opcode, Register reg, Operand rm_reg); void arithmetic_op_16(byte opcode, Register reg, Register rm_reg); - void arithmetic_op_16(byte opcode, Register reg, const Operand& rm_reg); + void arithmetic_op_16(byte opcode, Register reg, Operand rm_reg); // Operate on operands/registers with pointer size, 32-bit or 64-bit size. void arithmetic_op(byte opcode, Register reg, Register rm_reg, int size); - void arithmetic_op(byte opcode, - Register reg, - const Operand& rm_reg, - int size); + void arithmetic_op(byte opcode, Register reg, Operand rm_reg, int size); // Operate on a byte in memory or register. void immediate_arithmetic_op_8(byte subcode, Register dst, Immediate src); - void immediate_arithmetic_op_8(byte subcode, - const Operand& dst, - Immediate src); + void immediate_arithmetic_op_8(byte subcode, Operand dst, Immediate src); // Operate on a word in memory or register. void immediate_arithmetic_op_16(byte subcode, Register dst, Immediate src); - void immediate_arithmetic_op_16(byte subcode, - const Operand& dst, - Immediate src); + void immediate_arithmetic_op_16(byte subcode, Operand dst, Immediate src); // Operate on operands/registers with pointer size, 32-bit or 64-bit size. void immediate_arithmetic_op(byte subcode, Register dst, Immediate src, int size); - void immediate_arithmetic_op(byte subcode, - const Operand& dst, - Immediate src, + void immediate_arithmetic_op(byte subcode, Operand dst, Immediate src, int size); // Emit machine code for a shift operation. @@ -2218,15 +2168,15 @@ class Assembler : public AssemblerBase { immediate_arithmetic_op(0x0, dst, src, size); } - void emit_add(Register dst, const Operand& src, int size) { + void emit_add(Register dst, Operand src, int size) { arithmetic_op(0x03, dst, src, size); } - void emit_add(const Operand& dst, Register src, int size) { + void emit_add(Operand dst, Register src, int size) { arithmetic_op(0x1, src, dst, size); } - void emit_add(const Operand& dst, Immediate src, int size) { + void emit_add(Operand dst, Immediate src, int size) { immediate_arithmetic_op(0x0, dst, src, size); } @@ -2234,11 +2184,11 @@ class Assembler : public AssemblerBase { arithmetic_op(0x23, dst, src, size); } - void emit_and(Register dst, const Operand& src, int size) { + void emit_and(Register dst, Operand src, int size) { arithmetic_op(0x23, dst, src, size); } - void emit_and(const Operand& dst, Register src, int size) { + void emit_and(Operand dst, Register src, int size) { arithmetic_op(0x21, src, dst, size); } @@ -2246,7 +2196,7 @@ class Assembler : public AssemblerBase { immediate_arithmetic_op(0x4, dst, src, size); } - void emit_and(const Operand& dst, Immediate src, int size) { + void emit_and(Operand dst, Immediate src, int size) { immediate_arithmetic_op(0x4, dst, src, size); } @@ -2254,11 +2204,11 @@ class Assembler : public AssemblerBase { arithmetic_op(0x3B, dst, src, size); } - void emit_cmp(Register dst, const Operand& src, int size) { + void emit_cmp(Register dst, Operand src, int size) { arithmetic_op(0x3B, dst, src, size); } - void emit_cmp(const Operand& dst, Register src, int size) { + void emit_cmp(Operand dst, Register src, int size) { arithmetic_op(0x39, src, dst, size); } @@ -2266,17 +2216,17 @@ class Assembler : public AssemblerBase { immediate_arithmetic_op(0x7, dst, src, size); } - void emit_cmp(const Operand& dst, Immediate src, int size) { + void emit_cmp(Operand dst, Immediate src, int size) { immediate_arithmetic_op(0x7, dst, src, size); } // Compare {al,ax,eax,rax} with src. If equal, set ZF and write dst into // src. Otherwise clear ZF and write src into {al,ax,eax,rax}. This // operation is only atomic if prefixed by the lock instruction. - void emit_cmpxchg(const Operand& dst, Register src, int size); + void emit_cmpxchg(Operand dst, Register src, int size); void emit_dec(Register dst, int size); - void emit_dec(const Operand& dst, int size); + void emit_dec(Operand dst, int size); // Divide rdx:rax by src. Quotient in rax, remainder in rdx when size is 64. // Divide edx:eax by lower 32 bits of src. Quotient in eax, remainder in edx @@ -2287,43 +2237,43 @@ class Assembler : public AssemblerBase { // Signed multiply instructions. // rdx:rax = rax * src when size is 64 or edx:eax = eax * src when size is 32. void emit_imul(Register src, int size); - void emit_imul(const Operand& src, int size); + void emit_imul(Operand src, int size); void emit_imul(Register dst, Register src, int size); - void emit_imul(Register dst, const Operand& src, int size); + void emit_imul(Register dst, Operand src, int size); void emit_imul(Register dst, Register src, Immediate imm, int size); - void emit_imul(Register dst, const Operand& src, Immediate imm, int size); + void emit_imul(Register dst, Operand src, Immediate imm, int size); void emit_inc(Register dst, int size); - void emit_inc(const Operand& dst, int size); + void emit_inc(Operand dst, int size); - void emit_lea(Register dst, const Operand& src, int size); + void emit_lea(Register dst, Operand src, int size); - void emit_mov(Register dst, const Operand& src, int size); + void emit_mov(Register dst, Operand src, int size); void emit_mov(Register dst, Register src, int size); - void emit_mov(const Operand& dst, Register src, int size); + void emit_mov(Operand dst, Register src, int size); void emit_mov(Register dst, Immediate value, int size); - void emit_mov(const Operand& dst, Immediate value, int size); + void emit_mov(Operand dst, Immediate value, int size); - void emit_movzxb(Register dst, const Operand& src, int size); + void emit_movzxb(Register dst, Operand src, int size); void emit_movzxb(Register dst, Register src, int size); - void emit_movzxw(Register dst, const Operand& src, int size); + void emit_movzxw(Register dst, Operand src, int size); void emit_movzxw(Register dst, Register src, int size); void emit_neg(Register dst, int size); - void emit_neg(const Operand& dst, int size); + void emit_neg(Operand dst, int size); void emit_not(Register dst, int size); - void emit_not(const Operand& dst, int size); + void emit_not(Operand dst, int size); void emit_or(Register dst, Register src, int size) { arithmetic_op(0x0B, dst, src, size); } - void emit_or(Register dst, const Operand& src, int size) { + void emit_or(Register dst, Operand src, int size) { arithmetic_op(0x0B, dst, src, size); } - void emit_or(const Operand& dst, Register src, int size) { + void emit_or(Operand dst, Register src, int size) { arithmetic_op(0x9, src, dst, size); } @@ -2331,7 +2281,7 @@ class Assembler : public AssemblerBase { immediate_arithmetic_op(0x1, dst, src, size); } - void emit_or(const Operand& dst, Immediate src, int size) { + void emit_or(Operand dst, Immediate src, int size) { immediate_arithmetic_op(0x1, dst, src, size); } @@ -2349,28 +2299,28 @@ class Assembler : public AssemblerBase { immediate_arithmetic_op(0x5, dst, src, size); } - void emit_sub(Register dst, const Operand& src, int size) { + void emit_sub(Register dst, Operand src, int size) { arithmetic_op(0x2B, dst, src, size); } - void emit_sub(const Operand& dst, Register src, int size) { + void emit_sub(Operand dst, Register src, int size) { arithmetic_op(0x29, src, dst, size); } - void emit_sub(const Operand& dst, Immediate src, int size) { + void emit_sub(Operand dst, Immediate src, int size) { immediate_arithmetic_op(0x5, dst, src, size); } void emit_test(Register dst, Register src, int size); void emit_test(Register reg, Immediate mask, int size); - void emit_test(const Operand& op, Register reg, int size); - void emit_test(const Operand& op, Immediate mask, int size); - void emit_test(Register reg, const Operand& op, int size) { + void emit_test(Operand op, Register reg, int size); + void emit_test(Operand op, Immediate mask, int size); + void emit_test(Register reg, Operand op, int size) { return emit_test(op, reg, size); } void emit_xchg(Register dst, Register src, int size); - void emit_xchg(Register dst, const Operand& src, int size); + void emit_xchg(Register dst, Operand src, int size); void emit_xor(Register dst, Register src, int size) { if (size == kInt64Size && dst.code() == src.code()) { @@ -2382,7 +2332,7 @@ class Assembler : public AssemblerBase { } } - void emit_xor(Register dst, const Operand& src, int size) { + void emit_xor(Register dst, Operand src, int size) { arithmetic_op(0x33, dst, src, size); } @@ -2390,25 +2340,23 @@ class Assembler : public AssemblerBase { immediate_arithmetic_op(0x6, dst, src, size); } - void emit_xor(const Operand& dst, Immediate src, int size) { + void emit_xor(Operand dst, Immediate src, int size) { immediate_arithmetic_op(0x6, dst, src, size); } - void emit_xor(const Operand& dst, Register src, int size) { + void emit_xor(Operand dst, Register src, int size) { arithmetic_op(0x31, src, dst, size); } // Most BMI instructions are similar. void bmi1q(byte op, Register reg, Register vreg, Register rm); - void bmi1q(byte op, Register reg, Register vreg, const Operand& rm); + void bmi1q(byte op, Register reg, Register vreg, Operand rm); void bmi1l(byte op, Register reg, Register vreg, Register rm); - void bmi1l(byte op, Register reg, Register vreg, const Operand& rm); + void bmi1l(byte op, Register reg, Register vreg, Operand rm); void bmi2q(SIMDPrefix pp, byte op, Register reg, Register vreg, Register rm); - void bmi2q(SIMDPrefix pp, byte op, Register reg, Register vreg, - const Operand& rm); + void bmi2q(SIMDPrefix pp, byte op, Register reg, Register vreg, Operand rm); void bmi2l(SIMDPrefix pp, byte op, Register reg, Register vreg, Register rm); - void bmi2l(SIMDPrefix pp, byte op, Register reg, Register vreg, - const Operand& rm); + void bmi2l(SIMDPrefix pp, byte op, Register reg, Register vreg, Operand rm); // record the position of jmp/jcc instruction void record_farjmp_position(Label* L, int pos); |