| 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);
|
| + }
|
| }
|
|
|
|
|
|
|