Index: src/x64/assembler-x64.cc |
diff --git a/src/x64/assembler-x64.cc b/src/x64/assembler-x64.cc |
index a92196d74cd34457e4fab08f15d22a677ebd6469..a01b53dc39a63a305c7ce1a0b35519abcb7b8cfb 100644 |
--- a/src/x64/assembler-x64.cc |
+++ b/src/x64/assembler-x64.cc |
@@ -1899,7 +1899,7 @@ void Assembler::shrd(Register dst, Register src) { |
} |
-void Assembler::xchg(Register dst, Register src) { |
+void Assembler::xchgq(Register dst, Register src) { |
EnsureSpace ensure_space(this); |
if (src.is(rax) || dst.is(rax)) { // Single-byte encoding |
Register other = src.is(rax) ? dst : src; |
@@ -1917,6 +1917,24 @@ void Assembler::xchg(Register dst, Register src) { |
} |
+void Assembler::xchgl(Register dst, Register src) { |
+ EnsureSpace ensure_space(this); |
+ if (src.is(rax) || dst.is(rax)) { // Single-byte encoding |
+ Register other = src.is(rax) ? dst : src; |
+ emit_optional_rex_32(other); |
+ emit(0x90 | other.low_bits()); |
+ } else if (dst.low_bits() == 4) { |
+ emit_optional_rex_32(dst, src); |
+ emit(0x87); |
+ emit_modrm(dst, src); |
+ } else { |
+ emit_optional_rex_32(src, dst); |
+ emit(0x87); |
+ emit_modrm(src, dst); |
+ } |
+} |
+ |
+ |
void Assembler::store_rax(void* dst, RelocInfo::Mode mode) { |
EnsureSpace ensure_space(this); |
emit(0x48); // REX.W |
@@ -2035,6 +2053,14 @@ void Assembler::testl(const Operand& op, Immediate mask) { |
} |
+void Assembler::testl(const Operand& op, Register reg) { |
+ EnsureSpace ensure_space(this); |
+ emit_optional_rex_32(reg, op); |
+ emit(0x85); |
+ emit_operand(reg, op); |
+} |
+ |
+ |
void Assembler::testq(const Operand& op, Register reg) { |
EnsureSpace ensure_space(this); |
emit_rex_64(reg, op); |