Index: src/x64/codegen-x64.cc |
=================================================================== |
--- src/x64/codegen-x64.cc (revision 2356) |
+++ src/x64/codegen-x64.cc (working copy) |
@@ -4386,8 +4386,8 @@ |
Register left_reg = left_side.reg(); |
Register right_reg = right_side.reg(); |
- __ movq(kScratchRegister, left_side.reg()); |
- __ or_(kScratchRegister, right_side.reg()); |
+ __ movq(kScratchRegister, left_reg); |
+ __ or_(kScratchRegister, right_reg); |
__ testl(kScratchRegister, Immediate(kSmiTagMask)); |
is_smi.Branch(zero, taken); |
// When non-smi, call out to the compare stub. |
@@ -6493,17 +6493,18 @@ |
__ bind(&load_smi_lhs); |
ASSERT(kSmiTagSize == 1); |
ASSERT(kSmiTag == 0); |
- __ lea(kScratchRegister, Operand(lhs, lhs, times_1, 0)); |
+ __ movsxlq(kScratchRegister, lhs); |
+ __ sar(kScratchRegister, Immediate(kSmiTagSize)); |
__ push(kScratchRegister); |
- __ fild_s(Operand(rsp, 0)); |
+ __ fild_d(Operand(rsp, 0)); |
__ pop(kScratchRegister); |
__ jmp(&done_load_lhs); |
__ bind(&load_smi_rhs); |
- __ movq(kScratchRegister, rhs); |
+ __ movsxlq(kScratchRegister, rhs); |
__ sar(kScratchRegister, Immediate(kSmiTagSize)); |
__ push(kScratchRegister); |
- __ fild_s(Operand(rsp, 0)); |
+ __ fild_d(Operand(rsp, 0)); |
__ pop(kScratchRegister); |
__ bind(&done); |
@@ -6512,24 +6513,18 @@ |
void FloatingPointHelper::CheckFloatOperands(MacroAssembler* masm, |
Label* non_float) { |
Label test_other, done; |
- // Test if both operands are floats or smi -> scratch=k_is_float; |
- // Otherwise scratch = k_not_float. |
+ // Test if both operands are numbers (heap_numbers or smis). |
+ // If not, jump to label non_float. |
__ testl(rdx, Immediate(kSmiTagMask)); |
__ j(zero, &test_other); // argument in rdx is OK |
- __ movq(kScratchRegister, |
- Factory::heap_number_map(), |
- RelocInfo::EMBEDDED_OBJECT); |
- __ cmpq(kScratchRegister, FieldOperand(rdx, HeapObject::kMapOffset)); |
- __ j(not_equal, non_float); // argument in rdx is not a number -> NaN |
+ __ Cmp(FieldOperand(rdx, HeapObject::kMapOffset),Factory::heap_number_map()); |
+ __ j(not_equal, non_float); // The argument in rdx is not a number. |
__ bind(&test_other); |
__ testl(rax, Immediate(kSmiTagMask)); |
__ j(zero, &done); // argument in rax is OK |
- __ movq(kScratchRegister, |
- Factory::heap_number_map(), |
- RelocInfo::EMBEDDED_OBJECT); |
- __ cmpq(kScratchRegister, FieldOperand(rax, HeapObject::kMapOffset)); |
- __ j(not_equal, non_float); // argument in rax is not a number -> NaN |
+ __ Cmp(FieldOperand(rax, HeapObject::kMapOffset),Factory::heap_number_map()); |
+ __ j(not_equal, non_float); // The argument in rax is not a number. |
// Fall-through: Both operands are numbers. |
__ bind(&done); |
@@ -6792,6 +6787,7 @@ |
__ testl(rax, Immediate(1)); |
__ j(not_zero, &operand_conversion_failure); |
} else { |
+ // TODO(X64): Verify that SSE3 is always supported, drop this code. |
// Check if right operand is int32. |
__ fist_s(Operand(rsp, 0 * kPointerSize)); |
__ fild_s(Operand(rsp, 0 * kPointerSize)); |