Index: src/x64/assembler-x64.h |
=================================================================== |
--- src/x64/assembler-x64.h (revision 2230) |
+++ src/x64/assembler-x64.h (working copy) |
@@ -92,6 +92,17 @@ |
return 1 << code_; |
} |
+ // Return the high bit of the register code as a 0 or 1. Used often |
+ // when constructing the REX prefix byte. |
+ int high_bit() const { |
+ return code_ >> 3; |
+ } |
+ // Return the 3 low bits of the register code. Used when encoding registers |
+ // in modR/M, SIB, and opcode bytes. |
+ int low_bits() const { |
+ return code_ & 0x7; |
+ } |
+ |
// (unfortunately we can't make this private in a struct when initializing |
// by assignment.) |
int code_; |
@@ -983,7 +994,7 @@ |
// 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) { |
- emit_operand(reg.code() & 0x07, adr); |
+ emit_operand(reg.low_bits(), adr); |
} |
// Emit the ModR/M byte, and optionally the SIB byte and |
@@ -993,14 +1004,14 @@ |
// Emit a ModR/M byte with registers coded in the reg and rm_reg fields. |
void emit_modrm(Register reg, Register rm_reg) { |
- emit(0xC0 | (reg.code() & 0x7) << 3 | (rm_reg.code() & 0x7)); |
+ emit(0xC0 | reg.low_bits() << 3 | rm_reg.low_bits()); |
} |
// Emit a ModR/M byte with an operation subcode in the reg field and |
// a register in the rm_reg field. |
void emit_modrm(int code, Register rm_reg) { |
- ASSERT((code & ~0x7) == 0); |
- emit(0xC0 | (code & 0x7) << 3 | (rm_reg.code() & 0x7)); |
+ ASSERT(is_uint3(code)); |
+ emit(0xC0 | code << 3 | rm_reg.low_bits()); |
} |
// Emit the code-object-relative offset of the label's position |