Chromium Code Reviews| Index: src/x64/assembler-x64.h |
| diff --git a/src/x64/assembler-x64.h b/src/x64/assembler-x64.h |
| index 06a7c4070c2ece5254f40754e30baa1d301d3b12..170e6d67572471ddb7e198e1be1ad0420b2b21f3 100644 |
| --- a/src/x64/assembler-x64.h |
| +++ b/src/x64/assembler-x64.h |
| @@ -225,10 +225,12 @@ class Immediate BASE_EMBEDDED { |
| // Machine instruction Operands |
| enum ScaleFactor { |
| - times_1 = 0, |
| - times_2 = 1, |
| - times_4 = 2, |
| - times_8 = 3 |
| + kTimes1 = 0, |
| + kTimes2 = 1, |
| + kTimes4 = 2, |
| + kTimes8 = 3, |
| + kTimesIntSize = kTimes4, |
| + kTimesPointerSize = kTimes8 |
| }; |
| @@ -626,6 +628,7 @@ class Assembler : public Malloced { |
| void hlt(); |
| void int3(); |
| void nop(); |
| + void nop(int n); |
| void rdtsc(); |
| void ret(int imm16); |
| @@ -647,16 +650,18 @@ class Assembler : public Malloced { |
| void bind(Label* L); // binds an unbound label L to the current code position |
| // Calls |
| + // Call near relative 32-bit displacement, relative to next instruction. |
| void call(Label* L); |
| - void call(byte* entry, RelocInfo::Mode rmode); |
| - void call(const Operand& adr); |
| - void call(Handle<Code> code, RelocInfo::Mode rmode); |
| + |
| + // Call near absolute indirect, address in register |
| + void call(Register adr); |
| // Jumps |
| + // Jump short or near relative. |
| void jmp(Label* L); // unconditional jump to L |
| - void jmp(byte* entry, RelocInfo::Mode rmode); |
| - void jmp(const Operand& adr); |
| - void jmp(Handle<Code> code, RelocInfo::Mode rmode); |
| + |
| + // Jump near absolute indirect (r64) |
| + void jmp(Register adr); |
| // Conditional jumps |
| void j(Condition cc, Label* L); |
| @@ -815,7 +820,6 @@ class Assembler : public Malloced { |
| // High bit of reg goes to REX.R, high bit of rm_reg goes to REX.B. |
| // REX.W is set. |
| inline void emit_rex_64(Register reg, Register rm_reg); |
| - void emit_rex_64(Register rm_reg) { emit_rex_64(rax, rm_reg); } |
| // Emits a REX prefix that encodes a 64-bit operand size and |
| // the top bit of the destination, index, and base register codes. |
| @@ -823,10 +827,22 @@ class Assembler : public Malloced { |
| // 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); |
| - void emit_rex_64(const Operand& op) { emit_rex_64(rax, op); } |
| + |
| + // Emits a REX prefix that encodes a 64-bit operand size and |
| + // the top bit of the register code. |
| + // The high bit of register is used for REX.B. |
| + // REX.W is set and REX.R and REX.X are clear. |
| + inline void emit_rex_64(Register rm_reg); |
| + |
| + // Emits a REX prefix that encodes a 64-bit operand size and |
| + // the top bit of the index and base register codes. |
| + // 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); |
| // High bit of reg goes to REX.R, high bit of rm_reg goes to REX.B. |
| - // REX.W is set. |
| + // REX.W is clear. |
| inline void emit_rex_32(Register reg, Register rm_reg); |
| // The high bit of reg is used for REX.R, the high bit of op's base |
| @@ -848,11 +864,15 @@ class Assembler : public Malloced { |
| // 1- or 4-byte offset for a memory operand. Also encodes |
| // the second operand of the operation, a register or operation |
| // subcode, into the Mod/RM byte. |
| - void emit_operand(Register reg, const Operand& adr); |
| - void emit_operand(int op_subcode, const Operand& adr) { |
| - emit_operand(Register::toRegister(op_subcode), adr); |
| + void emit_operand(Register reg, const Operand& adr) { |
| + emit_operand(reg.code() & 0x07, adr); |
|
William Hesse
2009/05/29 13:08:00
I would really like to put the & 0x7 into the base
Lasse Reichstein
2009/05/29 13:13:29
There is no need for a register code argument when
|
| } |
| + // Emit the Mod/RM byte, and optionally the SIB byte and |
| + // 1- or 4-byte offset for a memory operand. Also used to encode |
| + // a three-byte opcode extension into the Mod/RM byte. |
| + void emit_operand(int rm, const Operand& adr); |
| + |
| // Emit the code-object-relative offset of the label's position |
| inline void emit_code_relative_offset(Label* label); |