Reviewers: Erik Corry, Description: Avoid memmove when emitting operands in the assembler and get rid of the mutability of the Operand byte buffer.
Please review this at http://codereview.chromium.org/18656 SVN Base: http://v8.googlecode.com/svn/branches/bleeding_edge/ Affected files: M src/assembler-ia32-inl.h M src/assembler-ia32.h M src/assembler-ia32.cc Index: src/assembler-ia32.h =================================================================== --- src/assembler-ia32.h (revision 1122) +++ src/assembler-ia32.h (working copy) @@ -260,19 +260,19 @@ bool is_reg(Register reg) const; private: - // Mutable because reg in ModR/M byte is set by Assembler via set_reg(). - mutable byte buf_[6]; + byte buf_[6]; // The number of bytes in buf_. unsigned int len_; // Only valid if len_ > 4. RelocInfo::Mode rmode_; - inline void set_modrm(int mod, // reg == 0 - Register rm); + // Set the ModRM byte without an encoded 'reg' register. The + // register is encoded later as part of the emit_operand operation. + inline void set_modrm(int mod, Register rm); + inline void set_sib(ScaleFactor scale, Register index, Register base); inline void set_disp8(int8_t disp); inline void set_dispr(int32_t disp, RelocInfo::Mode rmode); - inline void set_reg(Register reg) const; friend class Assembler; }; Index: src/assembler-ia32-inl.h =================================================================== --- src/assembler-ia32-inl.h (revision 1122) +++ src/assembler-ia32-inl.h (working copy) @@ -270,8 +270,7 @@ } -void Operand::set_modrm(int mod, // reg == 0 - Register rm) { +void Operand::set_modrm(int mod, Register rm) { ASSERT((mod & -4) == 0); buf_[0] = mod << 6 | rm.code(); len_ = 1; Index: src/assembler-ia32.cc =================================================================== --- src/assembler-ia32.cc (revision 1122) +++ src/assembler-ia32.cc (working copy) @@ -255,12 +255,6 @@ } -void Operand::set_reg(Register reg) const { - ASSERT(len_ > 0); - buf_[0] = (buf_[0] & ~0x38) | static_cast<byte>(reg.code() << 3); -} - - bool Operand::is_reg(Register reg) const { return ((buf_[0] & 0xF8) == 0xC0) // addressing mode is register only. && ((buf_[0] & 0x07) == reg.code()); // register codes match. @@ -2098,9 +2092,17 @@ void Assembler::emit_operand(Register reg, const Operand& adr) { - adr.set_reg(reg); - memmove(pc_, adr.buf_, adr.len_); - pc_ += adr.len_; + const int length = adr.len_; + ASSERT(length > 0); + + // Emit updated ModRM byte containing the given register. + pc_[0] = (adr.buf_[0] & ~0x38) | (reg.code() << 3); + + // Emit the rest of the encoded operand. + for (int i = 1; i < length; i++) pc_[i] = adr.buf_[i]; + pc_ += length; + + // Emit relocation information if necessary. if (adr.len_ >= sizeof(int32_t) && adr.rmode_ != RelocInfo::NONE) { pc_ -= sizeof(int32_t); // pc_ must be *at* disp32 RecordRelocInfo(adr.rmode_); --~--~---------~--~----~------------~-------~--~----~ v8-dev mailing list [email protected] http://groups.google.com/group/v8-dev -~----------~----~----~----~------~----~------~--~---
