| Index: src/x64/assembler-x64.cc
|
| diff --git a/src/x64/assembler-x64.cc b/src/x64/assembler-x64.cc
|
| index f85f42e264490aa104400dae674f62967c17868f..6a5ec615b1f753b2f400042b4c81a2399a4f270f 100644
|
| --- a/src/x64/assembler-x64.cc
|
| +++ b/src/x64/assembler-x64.cc
|
| @@ -300,6 +300,34 @@ Operand::Operand(const Operand& operand, int32_t offset) {
|
| }
|
| }
|
|
|
| +
|
| +bool Operand::AddressUsesRegister(Register reg) const {
|
| + int code = reg.code();
|
| + ASSERT((buf_[0] & 0xC0) != 0xC0); // Always a memory operand.
|
| + // Start with only low three bits of base register. Initial decoding doesn't
|
| + // distinguish on the REX.B bit.
|
| + int base_code = buf_[0] & 0x07;
|
| + if (base_code == rsp.code()) {
|
| + // SIB byte present in buf_[1].
|
| + // Check the index register from the SIB byte + REX.X prefix.
|
| + int index_code = ((buf_[1] >> 3) & 0x07) | ((rex_ & 0x02) << 2);
|
| + // Index code (including REX.X) of 0x04 (rsp) means no index register.
|
| + if (index_code != rsp.code() && index_code == code) return true;
|
| + // Add REX.B to get the full base register code.
|
| + base_code = (buf_[1] & 0x07) | ((rex_ & 0x01) << 3);
|
| + // A base register of 0x05 (rbp) with mod = 0 means no base register.
|
| + if (base_code == rbp.code() && ((buf_[0] & 0xC0) == 0)) return false;
|
| + return code == base_code;
|
| + } else {
|
| + // A base register with low bits of 0x05 (rbp or r13) and mod = 0 means
|
| + // no base register.
|
| + if (base_code == rbp.code() && ((buf_[0] & 0xC0) == 0)) return false;
|
| + base_code |= ((rex_ & 0x01) << 3);
|
| + return code == base_code;
|
| + }
|
| +}
|
| +
|
| +
|
| // -----------------------------------------------------------------------------
|
| // Implementation of Assembler.
|
|
|
| @@ -2661,6 +2689,30 @@ void Assembler::movq(Register dst, XMMRegister src) {
|
| }
|
|
|
|
|
| +void Assembler::movdqa(const Operand& dst, XMMRegister src) {
|
| + ASSERT(CpuFeatures::IsEnabled(SSE2));
|
| + EnsureSpace ensure_space(this);
|
| + last_pc_ = pc_;
|
| + emit(0x66);
|
| + emit_rex_64(src, dst);
|
| + emit(0x0F);
|
| + emit(0x7F);
|
| + emit_sse_operand(src, dst);
|
| +}
|
| +
|
| +
|
| +void Assembler::movdqa(XMMRegister dst, const Operand& src) {
|
| + ASSERT(CpuFeatures::IsEnabled(SSE2));
|
| + EnsureSpace ensure_space(this);
|
| + last_pc_ = pc_;
|
| + emit(0x66);
|
| + emit_rex_64(dst, src);
|
| + emit(0x0F);
|
| + emit(0x6F);
|
| + emit_sse_operand(dst, src);
|
| +}
|
| +
|
| +
|
| void Assembler::extractps(Register dst, XMMRegister src, byte imm8) {
|
| ASSERT(is_uint2(imm8));
|
| EnsureSpace ensure_space(this);
|
|
|