Index: src/x64/assembler-x64.h |
=================================================================== |
--- src/x64/assembler-x64.h (revision 2069) |
+++ src/x64/assembler-x64.h (working copy) |
@@ -450,6 +450,7 @@ |
arithmetic_op(0x03, dst, src); |
} |
+ |
void add(const Operand& dst, Register src) { |
arithmetic_op(0x01, src, dst); |
} |
@@ -482,12 +483,26 @@ |
immediate_arithmetic_op(0x7, dst, src); |
} |
+ void and_(Register dst, Register src) { |
+ arithmetic_op(0x23, dst, src); |
+ } |
- void and_(Register dst, int32_t imm32); |
- void and_(Register dst, const Operand& src); |
- void and_(const Operand& src, Register dst); |
- void and_(const Operand& dst, const Immediate& x); |
+ void and_(Register dst, const Operand& src) { |
+ arithmetic_op(0x23, dst, src); |
+ } |
+ void and_(const Operand& dst, Register src) { |
+ arithmetic_op(0x21, src, dst); |
+ } |
+ |
+ void and_(Register dst, Immediate src) { |
+ immediate_arithmetic_op(0x4, dst, src); |
+ } |
+ |
+ void and_(const Operand& dst, Immediate src) { |
+ immediate_arithmetic_op(0x4, dst, src); |
+ } |
+ |
void cmpb(const Operand& op, int8_t imm8); |
void cmpb_al(const Operand& op); |
void cmpw_ax(const Operand& op); |
@@ -516,11 +531,27 @@ |
void not_(Register dst); |
- void or_(Register dst, int32_t imm32); |
- void or_(Register dst, const Operand& src); |
- void or_(const Operand& dst, Register src); |
- void or_(const Operand& dst, const Immediate& x); |
+ void or_(Register dst, Register src) { |
+ arithmetic_op(0x0B, dst, src); |
+ } |
+ void or_(Register dst, const Operand& src) { |
+ arithmetic_op(0x0B, dst, src); |
+ } |
+ |
+ void or_(const Operand& dst, Register src) { |
+ arithmetic_op(0x09, src, dst); |
+ } |
+ |
+ void or_(Register dst, Immediate src) { |
+ immediate_arithmetic_op(0x1, dst, src); |
+ } |
+ |
+ void or_(const Operand& dst, Immediate src) { |
+ immediate_arithmetic_op(0x1, dst, src); |
+ } |
+ |
+ |
void rcl(Register dst, uint8_t imm8); |
void sar(Register dst, uint8_t imm8); |
@@ -539,19 +570,52 @@ |
void shr(Register dst); |
void shr_cl(Register dst); |
- void sub(const Operand& dst, const Immediate& x); |
- void sub(Register dst, const Operand& src); |
- void sub(const Operand& dst, Register src); |
+ void sub(Register dst, Register src) { |
+ arithmetic_op(0x2B, dst, src); |
+ } |
+ void sub(Register dst, const Operand& src) { |
+ arithmetic_op(0x2B, dst, src); |
+ } |
+ |
+ void sub(const Operand& dst, Register src) { |
+ arithmetic_op(0x29, src, dst); |
+ } |
+ |
+ void sub(Register dst, Immediate src) { |
+ immediate_arithmetic_op(0x5, dst, src); |
+ } |
+ |
+ void sub(const Operand& dst, Immediate src) { |
+ immediate_arithmetic_op(0x5, dst, src); |
+ } |
+ |
+ |
void test(Register reg, const Immediate& imm); |
void test(Register reg, const Operand& op); |
void test(const Operand& op, const Immediate& imm); |
- void xor_(Register dst, int32_t imm32); |
- void xor_(Register dst, const Operand& src); |
- void xor_(const Operand& src, Register dst); |
- void xor_(const Operand& dst, const Immediate& x); |
+ void xor_(Register dst, Register src) { |
+ arithmetic_op(0x33, dst, src); |
+ } |
+ void xor_(Register dst, const Operand& src) { |
+ arithmetic_op(0x33, dst, src); |
+ } |
+ |
+ void xor_(const Operand& dst, Register src) { |
+ arithmetic_op(0x31, src, dst); |
+ } |
+ |
+ void xor_(Register dst, Immediate src) { |
+ immediate_arithmetic_op(0x6, dst, src); |
+ } |
+ |
+ void xor_(const Operand& dst, Immediate src) { |
+ immediate_arithmetic_op(0x6, dst, src); |
+ } |
+ |
+ |
// Bit operations. |
void bt(const Operand& dst, Register src); |
void bts(const Operand& dst, Register src); |
@@ -733,6 +797,8 @@ |
// code emission |
void GrowBuffer(); |
+ |
+ void emit(byte x) { *pc_++ = x; } |
inline void emitl(uint32_t x); |
inline void emit(Handle<Object> handle); |
inline void emitq(uint64_t x, RelocInfo::Mode rmode); |
@@ -751,25 +817,23 @@ |
// is used for REX.X. REX.W is set. |
inline void emit_rex_64(Register reg, const Operand& op); |
+ // Emit the Mod/RM byte, and optionally the SIB byte and |
+ // 1- or 4-byte offset for a memory operand. Also encodes |
+ // the second operand of the operation, a register, into the Mod/RM byte. |
+ void emit_operand(Register reg, const Operand& adr); |
+ |
// Emit the code-object-relative offset of the label's position |
inline void emit_code_relative_offset(Label* label); |
- // instruction generation |
- void emit_arith_b(int op1, int op2, Register dst, int imm8); |
- |
- // Emit a basic arithmetic instruction (i.e. first byte of the family is 0x81) |
- // with a given destination expression and an immediate operand. It attempts |
- // to use the shortest encoding possible. |
- // sel specifies the /n in the modrm byte (see the Intel PRM). |
+ // Emit machine code for one of the operations ADD, ADC, SUB, SBC, |
+ // AND, OR, XOR, or CMP. The encodings of these operations are all |
+ // similar, differing just in the opcode or in the reg field of the |
+ // Mod/RM byte. |
void arithmetic_op(byte opcode, Register dst, Register src); |
void arithmetic_op(byte opcode, Register reg, const Operand& op); |
void immediate_arithmetic_op(byte subcode, Register dst, Immediate src); |
void immediate_arithmetic_op(byte subcode, const Operand& dst, Immediate src); |
- void emit_arith(int sel, Operand dst, const Immediate& x); |
- |
- void emit_operand(Register reg, const Operand& adr); |
- |
void emit_farith(int b1, int b2, int i); |
// labels |