Index: src/x64/assembler-x64.cc |
diff --git a/src/x64/assembler-x64.cc b/src/x64/assembler-x64.cc |
index 60383da01554a2ad2280f982ff5df20a9665b141..7a1f7a20c280d8d0f9ca2cd6fa4c5ee974a0f3b4 100644 |
--- a/src/x64/assembler-x64.cc |
+++ b/src/x64/assembler-x64.cc |
@@ -467,24 +467,30 @@ void Assembler::emit_operand(int code, const Operand& adr) { |
// Assembler Instruction implementations. |
-void Assembler::arithmetic_op(byte opcode, Register reg, const Operand& op) { |
+void Assembler::arithmetic_op(byte opcode, |
+ Register reg, |
+ const Operand& op, |
+ int size) { |
EnsureSpace ensure_space(this); |
- emit_rex_64(reg, op); |
+ emit_rex(reg, op, size); |
emit(opcode); |
emit_operand(reg, op); |
} |
-void Assembler::arithmetic_op(byte opcode, Register reg, Register rm_reg) { |
+void Assembler::arithmetic_op(byte opcode, |
+ Register reg, |
+ Register rm_reg, |
+ int size) { |
EnsureSpace ensure_space(this); |
ASSERT((opcode & 0xC6) == 2); |
if (rm_reg.low_bits() == 4) { // Forces SIB byte. |
// Swap reg and rm_reg and change opcode operand order. |
- emit_rex_64(rm_reg, reg); |
+ emit_rex(rm_reg, reg, size); |
emit(opcode ^ 0x02); |
emit_modrm(rm_reg, reg); |
} else { |
- emit_rex_64(reg, rm_reg); |
+ emit_rex(reg, rm_reg, size); |
emit(opcode); |
emit_modrm(reg, rm_reg); |
} |
@@ -520,13 +526,21 @@ void Assembler::arithmetic_op_16(byte opcode, |
} |
-void Assembler::arithmetic_op_32(byte opcode, Register reg, Register rm_reg) { |
+void Assembler::arithmetic_op_8(byte opcode, Register reg, const Operand& op) { |
+ EnsureSpace ensure_space(this); |
+ emit_optional_rex_32(reg, op); |
haitao.feng
2014/03/27 14:20:36
I did not use the "is_byte_register()" interface a
|
+ emit(opcode); |
+ emit_operand(reg, op); |
+} |
+ |
+ |
+void Assembler::arithmetic_op_8(byte opcode, Register reg, Register rm_reg) { |
EnsureSpace ensure_space(this); |
ASSERT((opcode & 0xC6) == 2); |
- if (rm_reg.low_bits() == 4) { // Forces SIB byte. |
+ if (rm_reg.low_bits() == 4) { // Forces SIB byte. |
// Swap reg and rm_reg and change opcode operand order. |
emit_optional_rex_32(rm_reg, reg); |
- emit(opcode ^ 0x02); // E.g. 0x03 -> 0x01 for ADD. |
+ emit(opcode ^ 0x02); |
emit_modrm(rm_reg, reg); |
} else { |
emit_optional_rex_32(reg, rm_reg); |
@@ -536,21 +550,12 @@ void Assembler::arithmetic_op_32(byte opcode, Register reg, Register rm_reg) { |
} |
-void Assembler::arithmetic_op_32(byte opcode, |
- Register reg, |
- const Operand& rm_reg) { |
- EnsureSpace ensure_space(this); |
- emit_optional_rex_32(reg, rm_reg); |
- emit(opcode); |
- emit_operand(reg, rm_reg); |
-} |
- |
- |
void Assembler::immediate_arithmetic_op(byte subcode, |
Register dst, |
- Immediate src) { |
+ Immediate src, |
+ int size) { |
EnsureSpace ensure_space(this); |
- emit_rex_64(dst); |
+ emit_rex(dst, size); |
if (is_int8(src.value_)) { |
emit(0x83); |
emit_modrm(subcode, dst); |
@@ -567,9 +572,10 @@ void Assembler::immediate_arithmetic_op(byte subcode, |
void Assembler::immediate_arithmetic_op(byte subcode, |
const Operand& dst, |
- Immediate src) { |
+ Immediate src, |
+ int size) { |
EnsureSpace ensure_space(this); |
- emit_rex_64(dst); |
+ emit_rex(dst, size); |
if (is_int8(src.value_)) { |
emit(0x83); |
emit_operand(subcode, dst); |
@@ -621,43 +627,6 @@ void Assembler::immediate_arithmetic_op_16(byte subcode, |
} |
-void Assembler::immediate_arithmetic_op_32(byte subcode, |
- Register dst, |
- Immediate src) { |
- EnsureSpace ensure_space(this); |
- emit_optional_rex_32(dst); |
- if (is_int8(src.value_)) { |
- emit(0x83); |
- emit_modrm(subcode, dst); |
- emit(src.value_); |
- } else if (dst.is(rax)) { |
- emit(0x05 | (subcode << 3)); |
- emitl(src.value_); |
- } else { |
- emit(0x81); |
- emit_modrm(subcode, dst); |
- emitl(src.value_); |
- } |
-} |
- |
- |
-void Assembler::immediate_arithmetic_op_32(byte subcode, |
- const Operand& dst, |
- Immediate src) { |
- EnsureSpace ensure_space(this); |
- emit_optional_rex_32(dst); |
- if (is_int8(src.value_)) { |
- emit(0x83); |
- emit_operand(subcode, dst); |
- emit(src.value_); |
- } else { |
- emit(0x81); |
- emit_operand(subcode, dst); |
- emitl(src.value_); |
- } |
-} |
- |
- |
void Assembler::immediate_arithmetic_op_8(byte subcode, |
const Operand& dst, |
Immediate src) { |
@@ -675,8 +644,8 @@ void Assembler::immediate_arithmetic_op_8(byte subcode, |
Immediate src) { |
EnsureSpace ensure_space(this); |
if (!dst.is_byte_register()) { |
haitao.feng
2014/03/27 14:20:36
It seems that we could remove "is_byte_register()"
|
- // Use 64-bit mode byte registers. |
- emit_rex_64(dst); |
+ // Register is not one of al, bl, cl, dl. Its encoding needs REX. |
+ emit_rex_32(dst); |
} |
ASSERT(is_int8(src.value_) || is_uint8(src.value_)); |
emit(0x80); |