Chromium Code Reviews| Index: src/x64/assembler-x64.h |
| diff --git a/src/x64/assembler-x64.h b/src/x64/assembler-x64.h |
| index a2b72821eff9e9ec37bf7ee8642f2884c0195ea8..c4f80c0f785f64cd9edc706641ed4d6db4de36bb 100644 |
| --- a/src/x64/assembler-x64.h |
| +++ b/src/x64/assembler-x64.h |
| @@ -509,8 +509,12 @@ class CpuFeatures : public AllStatic { |
| }; |
| -#define ASSEMBLER_INSTRUCTION_LIST(V) \ |
| - V(mov) |
| +#define ASSEMBLER_INSTRUCTION_LIST(V) \ |
| + V(add) \ |
| + V(idiv) \ |
| + V(imul) \ |
| + V(mov) \ |
| + V(sub) |
| class Assembler : public AssemblerBase { |
| @@ -664,6 +668,21 @@ class Assembler : public AssemblerBase { |
| // Naming conflicts with C++ keywords are resolved by adding a trailing '_'. |
| #define DECLARE_INSTRUCTION(instruction) \ |
| + template<class P1> \ |
| + void instruction##p(P1 p1) { \ |
| + emit_##instruction(p1, kPointerSize); \ |
| + } \ |
| + \ |
| + template<class P1> \ |
| + void instruction##l(P1 p1) { \ |
| + emit_##instruction(p1, kInt32Size); \ |
| + } \ |
| + \ |
| + template<class P1> \ |
| + void instruction##q(P1 p1) { \ |
| + emit_##instruction(p1, kInt64Size); \ |
| + } \ |
| + \ |
| template<class P1, class P2> \ |
| void instruction##p(P1 p1, P2 p2) { \ |
| emit_##instruction(p1, p2, kPointerSize); \ |
| @@ -677,6 +696,21 @@ class Assembler : public AssemblerBase { |
| template<class P1, class P2> \ |
| void instruction##q(P1 p1, P2 p2) { \ |
| emit_##instruction(p1, p2, kInt64Size); \ |
| + } \ |
| + \ |
| + template<class P1, class P2, class P3> \ |
| + void instruction##p(P1 p1, P2 p2, P3 p3) { \ |
| + emit_##instruction(p1, p2, p3, kPointerSize); \ |
| + } \ |
| + \ |
| + template<class P1, class P2, class P3> \ |
| + void instruction##l(P1 p1, P2 p2, P3 p3) { \ |
| + emit_##instruction(p1, p2, p3, kInt32Size); \ |
| + } \ |
| + \ |
| + template<class P1, class P2, class P3> \ |
| + void instruction##q(P1 p1, P2 p2, P3 p3) { \ |
| + emit_##instruction(p1, p2, p3, kInt64Size); \ |
| } |
| ASSEMBLER_INSTRUCTION_LIST(DECLARE_INSTRUCTION) |
| #undef DECLARE_INSTRUCTION |
| @@ -760,47 +794,6 @@ class Assembler : public AssemblerBase { |
| void xchgq(Register dst, Register src); |
| void xchgl(Register dst, Register src); |
| - // Arithmetics |
| - void addl(Register dst, Register src) { |
| - arithmetic_op_32(0x03, dst, src); |
| - } |
| - |
| - void addl(Register dst, Immediate src) { |
| - immediate_arithmetic_op_32(0x0, dst, src); |
| - } |
| - |
| - void addl(Register dst, const Operand& src) { |
| - arithmetic_op_32(0x03, dst, src); |
| - } |
| - |
| - void addl(const Operand& dst, Immediate src) { |
| - immediate_arithmetic_op_32(0x0, dst, src); |
| - } |
| - |
| - void addl(const Operand& dst, Register src) { |
| - arithmetic_op_32(0x01, src, dst); |
| - } |
| - |
| - void addq(Register dst, Register src) { |
| - arithmetic_op(0x03, dst, src); |
| - } |
| - |
| - void addq(Register dst, const Operand& src) { |
| - arithmetic_op(0x03, dst, src); |
| - } |
| - |
| - void addq(const Operand& dst, Register src) { |
| - arithmetic_op(0x01, src, dst); |
| - } |
| - |
| - void addq(Register dst, Immediate src) { |
| - immediate_arithmetic_op(0x0, dst, src); |
| - } |
| - |
| - void addq(const Operand& dst, Immediate src) { |
| - immediate_arithmetic_op(0x0, dst, src); |
| - } |
| - |
| void sbbl(Register dst, Register src) { |
| arithmetic_op_32(0x1b, dst, src); |
| } |
| @@ -939,22 +932,6 @@ class Assembler : public AssemblerBase { |
| // Sign-extends eax into edx:eax. |
| void cdq(); |
| - // Divide rdx:rax by src. Quotient in rax, remainder in rdx. |
| - void idivq(Register src); |
| - // Divide edx:eax by lower 32 bits of src. Quotient in eax, rem. in edx. |
| - void idivl(Register src); |
| - |
| - // Signed multiply instructions. |
| - void imul(Register src); // rdx:rax = rax * src. |
| - void imul(Register dst, Register src); // dst = dst * src. |
| - void imul(Register dst, const Operand& src); // dst = dst * src. |
| - void imul(Register dst, Register src, Immediate imm); // dst = src * imm. |
| - // Signed 32-bit multiply instructions. |
| - void imull(Register src); // edx:eax = eax * src. |
| - void imull(Register dst, Register src); // dst = dst * src. |
| - void imull(Register dst, const Operand& src); // dst = dst * src. |
| - void imull(Register dst, Register src, Immediate imm); // dst = src * imm. |
| - |
| void incq(Register dst); |
| void incq(const Operand& dst); |
| void incl(Register dst); |
| @@ -1105,46 +1082,6 @@ class Assembler : public AssemblerBase { |
| void store_rax(void* dst, RelocInfo::Mode mode); |
| void store_rax(ExternalReference ref); |
| - void subq(Register dst, Register src) { |
| - arithmetic_op(0x2B, dst, src); |
| - } |
| - |
| - void subq(Register dst, const Operand& src) { |
| - arithmetic_op(0x2B, dst, src); |
| - } |
| - |
| - void subq(const Operand& dst, Register src) { |
| - arithmetic_op(0x29, src, dst); |
| - } |
| - |
| - void subq(Register dst, Immediate src) { |
| - immediate_arithmetic_op(0x5, dst, src); |
| - } |
| - |
| - void subq(const Operand& dst, Immediate src) { |
| - immediate_arithmetic_op(0x5, dst, src); |
| - } |
| - |
| - void subl(Register dst, Register src) { |
| - arithmetic_op_32(0x2B, dst, src); |
| - } |
| - |
| - void subl(Register dst, const Operand& src) { |
| - arithmetic_op_32(0x2B, dst, src); |
| - } |
| - |
| - void subl(const Operand& dst, Register src) { |
| - arithmetic_op_32(0x29, src, dst); |
| - } |
| - |
| - void subl(const Operand& dst, Immediate src) { |
| - immediate_arithmetic_op_32(0x5, dst, src); |
| - } |
| - |
| - void subl(Register dst, Immediate src) { |
| - immediate_arithmetic_op_32(0x5, dst, src); |
| - } |
| - |
| void subb(Register dst, Immediate src) { |
| immediate_arithmetic_op_8(0x5, dst, src); |
| } |
| @@ -1712,6 +1649,109 @@ class Assembler : public AssemblerBase { |
| // record reloc info for current pc_ |
| void RecordRelocInfo(RelocInfo::Mode rmode, intptr_t data = 0); |
| + // Arithmetics |
| + void emit_add(Register dst, Register src, int size) { |
| + if (size == kInt64Size) { |
| + arithmetic_op(0x03, dst, src); |
| + } else { |
| + ASSERT(size == kInt32Size); |
| + arithmetic_op_32(0x03, dst, src); |
|
haitao.feng
2014/03/19 15:21:25
The arithmetic_op and arithmetic_op_32 could be un
Toon Verwaest
2014/03/20 10:43:50
Sounds good.
On 2014/03/19 15:21:25, haitao.feng
|
| + } |
| + } |
| + |
| + void emit_add(Register dst, Immediate src, int size) { |
| + if (size == kInt64Size) { |
| + immediate_arithmetic_op(0x0, dst, src); |
| + } else { |
| + ASSERT(size == kInt32Size); |
| + immediate_arithmetic_op_32(0x0, dst, src); |
| + } |
| + } |
| + |
| + void emit_add(Register dst, const Operand& src, int size) { |
| + if (size == kInt64Size) { |
| + arithmetic_op(0x03, dst, src); |
| + } else { |
| + ASSERT(size == kInt32Size); |
| + arithmetic_op_32(0x03, dst, src); |
| + } |
| + } |
| + |
| + void emit_add(const Operand& dst, Register src, int size) { |
| + if (size == kInt64Size) { |
| + arithmetic_op(0x1, src, dst); |
| + } else { |
| + ASSERT(size == kInt32Size); |
| + arithmetic_op_32(0x1, src, dst); |
| + } |
| + } |
| + |
| + void emit_add(const Operand& dst, Immediate src, int size) { |
| + if (size == kInt64Size) { |
| + immediate_arithmetic_op(0x0, dst, src); |
| + } else { |
| + ASSERT(size == kInt32Size); |
| + immediate_arithmetic_op_32(0x0, dst, src); |
| + } |
| + } |
| + |
| + // 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 |
| + // when size is 32. |
| + void emit_idiv(Register src, int size); |
| + |
| + // 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(Register dst, Register src, int size); |
| + void emit_imul(Register dst, const Operand& src, int size); |
| + void emit_imul(Register dst, Register src, Immediate imm, int size); |
| + |
| + void emit_sub(Register dst, Register src, int size) { |
| + if (size == kInt64Size) { |
| + arithmetic_op(0x2B, dst, src); |
| + } else { |
| + ASSERT(size == kInt32Size); |
| + arithmetic_op_32(0x2B, dst, src); |
| + } |
| + } |
| + |
| + void emit_sub(Register dst, Immediate src, int size) { |
| + if (size == kInt64Size) { |
| + immediate_arithmetic_op(0x5, dst, src); |
| + } else { |
| + ASSERT(size == kInt32Size); |
| + immediate_arithmetic_op_32(0x5, dst, src); |
| + } |
| + } |
| + |
| + void emit_sub(Register dst, const Operand& src, int size) { |
| + if (size == kInt64Size) { |
| + arithmetic_op(0x2B, dst, src); |
| + } else { |
| + ASSERT(size == kInt32Size); |
| + arithmetic_op_32(0x2B, dst, src); |
| + } |
| + } |
| + |
| + void emit_sub(const Operand& dst, Register src, int size) { |
| + if (size == kInt64Size) { |
| + arithmetic_op(0x29, src, dst); |
| + } else { |
| + ASSERT(size == kInt32Size); |
| + arithmetic_op_32(0x29, src, dst); |
| + } |
| + } |
| + |
| + void emit_sub(const Operand& dst, Immediate src, int size) { |
| + if (size == kInt64Size) { |
| + immediate_arithmetic_op(0x5, dst, src); |
| + } else { |
| + ASSERT(size == kInt32Size); |
| + immediate_arithmetic_op_32(0x5, dst, src); |
| + } |
| + } |
| + |
| void emit_mov(Register dst, const Operand& src, int size); |
| void emit_mov(Register dst, Register src, int size); |
| void emit_mov(const Operand& dst, Register src, int size); |