Index: src/x64/assembler-x64-inl.h |
=================================================================== |
--- src/x64/assembler-x64-inl.h (revision 2061) |
+++ src/x64/assembler-x64-inl.h (working copy) |
@@ -173,13 +173,32 @@ |
return reinterpret_cast<Object**>(pc_ + 1); |
} |
+// ----------------------------------------------------------------------------- |
+// Implementation of Operand |
+Operand::Operand(Register base, int32_t disp) { |
+ len_ = 1; |
+ if (base.is(rsp) || base.is(r12)) { |
+ // SIB byte is needed to encode (rsp + offset) or (r12 + offset). |
+ set_sib(times_1, rsp, base); |
+ } |
+ |
+ if (disp == 0 && !base.is(rbp) && !base.is(r13)) { |
+ set_modrm(0, rsp); |
+ } else if (is_int8(disp)) { |
+ set_modrm(1, base); |
+ set_disp8(disp); |
+ } else { |
+ set_modrm(2, base); |
+ set_disp32(disp); |
+ } |
+} |
+ |
void Operand::set_modrm(int mod, Register rm) { |
ASSERT((mod & -4) == 0); |
buf_[0] = mod << 6 | (rm.code() & 0x7); |
// Set REX.B to the high bit of rm.code(). |
rex_ |= (rm.code() >> 3); |
- len_ = 1; |
} |
@@ -193,8 +212,15 @@ |
len_ = 2; |
} |
+void Operand::set_disp8(int disp) { |
+ ASSERT(is_int8(disp)); |
+ ASSERT(len_ == 1 || len_ == 2); |
+ int8_t* p = reinterpret_cast<int8_t*>(&buf_[len_]); |
+ *p = disp; |
+ len_ += sizeof(int8_t); |
+} |
-void Operand::set_disp32(int32_t disp) { |
+void Operand::set_disp32(int disp) { |
ASSERT(len_ == 1 || len_ == 2); |
int32_t* p = reinterpret_cast<int32_t*>(&buf_[len_]); |
*p = disp; |
@@ -202,11 +228,6 @@ |
} |
-Operand::Operand(Register reg) { |
- // reg |
- set_modrm(3, reg); |
-} |
- |
} } // namespace v8::internal |
#endif // V8_X64_ASSEMBLER_X64_INL_H_ |