Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(7)

Unified Diff: src/x64/assembler-x64.h

Issue 119078: Add multiplication and division to x64 assembler. Add emit_modrm() function. (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 11 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | src/x64/assembler-x64.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/x64/assembler-x64.h
===================================================================
--- src/x64/assembler-x64.h (revision 2097)
+++ src/x64/assembler-x64.h (working copy)
@@ -270,7 +270,7 @@
unsigned int len_;
RelocInfo::Mode rmode_;
- // Set the ModRM byte without an encoded 'reg' register. The
+ // Set the ModR/M byte without an encoded 'reg' register. The
// register is encoded later as part of the emit_operand operation.
// set_modrm can be called before or after set_sib and set_disp*.
inline void set_modrm(int mod, Register rm);
@@ -417,7 +417,7 @@
// Moves
void movb(Register dst, const Operand& src);
- void movb(const Operand& dst, int8_t imm8);
+ void movb(Register dst, Immediate imm);
void movb(const Operand& dst, Register src);
void movl(Register dst, Register src);
@@ -538,16 +538,20 @@
// Sign-extends rax into rdx:rax.
void cqo();
+ // Divide rdx:rax by src. Quotient in rax, remainder in rdx.
void idiv(Register src);
+ void imul(Register dst, Register src);
void imul(Register dst, const Operand& src);
- void imul(Register dst, Register src, int32_t imm32);
+ // Performs the operation dst = src * imm.
+ void imul(Register dst, Register src, Immediate imm);
void inc(Register dst);
void inc(const Operand& dst);
void lea(Register dst, const Operand& src);
+ // Multiply rax by src, put the result in rdx:rax.
void mul(Register src);
void neg(Register dst);
@@ -579,12 +583,12 @@
void rcl(Register dst, uint8_t imm8);
- void sbb(Register dst, const Operand& src);
+ // Shifts dst:src left by cl bits, affecting only dst.
+ void shld(Register dst, Register src);
- void shld(Register dst, const Operand& src);
+ // Shifts src:dst right by cl bits, affecting only dst.
+ void shrd(Register dst, Register src);
- void shrd(Register dst, const Operand& src);
-
// Shifts dst right, duplicating sign bit, by shift_amount bits.
// Shifting by 1 is handled efficiently.
void sar(Register dst, Immediate shift_amount) {
@@ -636,6 +640,8 @@
void testb(const Operand& op, Immediate mask);
void testl(Register reg, Immediate mask);
void testl(const Operand& op, Immediate mask);
+ void testq(const Operand& op, Register reg);
+ void testq(Register dst, Register src);
void xor_(Register dst, Register src) {
arithmetic_op(0x33, dst, src);
@@ -898,7 +904,7 @@
// High bit of base goes to REX.B and high bit of index to REX.X.
// REX.W and REX.R are clear.
- inline void emit_rex_32(const Operand &);
+ inline void emit_rex_32(const Operand& op);
// High bit of reg goes to REX.R, high bit of rm_reg goes to REX.B.
// REX.W is cleared. If no REX bits are set, no byte is emitted.
@@ -919,26 +925,38 @@
inline void emit_optional_rex_32(const Operand& op);
- // Emit the Mod/RM byte, and optionally the SIB byte and
+ // Emit the ModR/M 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 or operation
- // subcode, into the Mod/RM byte.
+ // 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 the Mod/RM byte, and optionally the SIB byte and
+ // Emit the ModR/M 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.
+ // a three-bit opcode extension into the ModR/M byte.
void emit_operand(int rm, const Operand& adr);
+ // 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 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));
+ }
+
// Emit the code-object-relative offset of the label's position
inline void emit_code_relative_offset(Label* label);
// 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.
+ // ModR/M 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);
« no previous file with comments | « no previous file | src/x64/assembler-x64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698