Index: src/x64/macro-assembler-x64.cc |
diff --git a/src/x64/macro-assembler-x64.cc b/src/x64/macro-assembler-x64.cc |
index 1a0b119d84d155dd306a426506f2f0bb82248ed5..01792163dfae495fb591858f18e1f6dee7c34fee 100644 |
--- a/src/x64/macro-assembler-x64.cc |
+++ b/src/x64/macro-assembler-x64.cc |
@@ -208,7 +208,9 @@ Handle<Code> MacroAssembler::ResolveBuiltin(Builtins::JavaScript id, |
void MacroAssembler::Set(Register dst, int64_t x) { |
- if (is_int32(x)) { |
+ if (x == 0) { |
+ xor_(dst, dst); |
+ } else if (is_int32(x)) { |
movq(dst, Immediate(x)); |
} else if (is_uint32(x)) { |
movl(dst, Immediate(x)); |
@@ -219,14 +221,17 @@ void MacroAssembler::Set(Register dst, int64_t x) { |
void MacroAssembler::Set(const Operand& dst, int64_t x) { |
- if (is_int32(x)) { |
- movq(kScratchRegister, Immediate(x)); |
+ if (x == 0) { |
+ xor_(kScratchRegister, kScratchRegister); |
+ movq(dst, kScratchRegister); |
+ } else if (is_int32(x)) { |
+ movq(dst, Immediate(x)); |
} else if (is_uint32(x)) { |
- movl(kScratchRegister, Immediate(x)); |
+ movl(dst, Immediate(x)); |
} else { |
movq(kScratchRegister, x, RelocInfo::NONE); |
+ movq(dst, kScratchRegister); |
} |
- movq(dst, kScratchRegister); |
} |
@@ -240,11 +245,13 @@ void MacroAssembler::LoadUnsafeSmi(Register dst, Smi* source) { |
void MacroAssembler::Move(Register dst, Handle<Object> source) { |
+ ASSERT(!source->IsFailure()); |
if (source->IsSmi()) { |
if (IsUnsafeSmi(source)) { |
LoadUnsafeSmi(dst, source); |
} else { |
- movq(dst, source, RelocInfo::NONE); |
+ int32_t smi = static_cast<int32_t>(reinterpret_cast<intptr_t>(*source)); |
+ movq(dst, Immediate(smi)); |
} |
} else { |
movq(dst, source, RelocInfo::EMBEDDED_OBJECT); |
@@ -253,8 +260,13 @@ void MacroAssembler::Move(Register dst, Handle<Object> source) { |
void MacroAssembler::Move(const Operand& dst, Handle<Object> source) { |
- Move(kScratchRegister, source); |
- movq(dst, kScratchRegister); |
+ if (source->IsSmi()) { |
+ int32_t smi = static_cast<int32_t>(reinterpret_cast<intptr_t>(*source)); |
+ movq(dst, Immediate(smi)); |
+ } else { |
+ movq(kScratchRegister, source, RelocInfo::EMBEDDED_OBJECT); |
+ movq(dst, kScratchRegister); |
+ } |
} |
@@ -265,14 +277,37 @@ void MacroAssembler::Cmp(Register dst, Handle<Object> source) { |
void MacroAssembler::Cmp(const Operand& dst, Handle<Object> source) { |
- Move(kScratchRegister, source); |
- cmpq(dst, kScratchRegister); |
+ if (source->IsSmi()) { |
+ if (IsUnsafeSmi(source)) { |
+ LoadUnsafeSmi(kScratchRegister, source); |
+ cmpl(dst, kScratchRegister); |
+ } else { |
+ // For smi-comparison, it suffices to compare the low 32 bits. |
+ int32_t smi = static_cast<int32_t>(reinterpret_cast<intptr_t>(*source)); |
+ cmpl(dst, Immediate(smi)); |
+ } |
+ } else { |
+ ASSERT(source->IsHeapObject()); |
+ movq(kScratchRegister, source, RelocInfo::EMBEDDED_OBJECT); |
+ cmpq(dst, kScratchRegister); |
+ } |
} |
void MacroAssembler::Push(Handle<Object> source) { |
- Move(kScratchRegister, source); |
- push(kScratchRegister); |
+ if (source->IsSmi()) { |
+ if (IsUnsafeSmi(source)) { |
+ LoadUnsafeSmi(kScratchRegister, source); |
+ push(kScratchRegister); |
+ } else { |
+ int32_t smi = static_cast<int32_t>(reinterpret_cast<intptr_t>(*source)); |
+ push(Immediate(smi)); |
+ } |
+ } else { |
+ ASSERT(source->IsHeapObject()); |
+ movq(kScratchRegister, source, RelocInfo::EMBEDDED_OBJECT); |
+ push(kScratchRegister); |
+ } |
} |