Index: src/arm64/code-stubs-arm64.cc |
diff --git a/src/arm64/code-stubs-arm64.cc b/src/arm64/code-stubs-arm64.cc |
index 93b0e2867b31f03d987aba6422f87555485cff3a..3ebfeb23e3143e558b7c3a87e8e3e5b9b03f3dc2 100644 |
--- a/src/arm64/code-stubs-arm64.cc |
+++ b/src/arm64/code-stubs-arm64.cc |
@@ -223,30 +223,30 @@ static void EmitIdenticalObjectComparison(MacroAssembler* masm, |
if ((cond == lt) || (cond == gt)) { |
__ JumpIfObjectType(right, scratch, scratch, FIRST_SPEC_OBJECT_TYPE, slow, |
ge); |
+ } else if (cond == eq) { |
+ __ JumpIfHeapNumber(right, &heap_number); |
} else { |
Register right_type = scratch; |
__ JumpIfObjectType(right, right_type, right_type, HEAP_NUMBER_TYPE, |
ulan
2014/09/24 08:21:41
Forgot to replace this with JumpIfHeapNumber?
vincent.belliard
2014/09/24 08:25:41
We needs right_type when it's not a heap number. U
ulan
2014/09/24 08:37:04
I see, thanks for explaining.
|
&heap_number); |
// Comparing JS objects with <=, >= is complicated. |
- if (cond != eq) { |
- __ Cmp(right_type, FIRST_SPEC_OBJECT_TYPE); |
- __ B(ge, slow); |
- // Normally here we fall through to return_equal, but undefined is |
- // special: (undefined == undefined) == true, but |
- // (undefined <= undefined) == false! See ECMAScript 11.8.5. |
- if ((cond == le) || (cond == ge)) { |
- __ Cmp(right_type, ODDBALL_TYPE); |
- __ B(ne, &return_equal); |
- __ JumpIfNotRoot(right, Heap::kUndefinedValueRootIndex, &return_equal); |
- if (cond == le) { |
- // undefined <= undefined should fail. |
- __ Mov(result, GREATER); |
- } else { |
- // undefined >= undefined should fail. |
- __ Mov(result, LESS); |
- } |
- __ Ret(); |
+ __ Cmp(right_type, FIRST_SPEC_OBJECT_TYPE); |
+ __ B(ge, slow); |
+ // Normally here we fall through to return_equal, but undefined is |
+ // special: (undefined == undefined) == true, but |
+ // (undefined <= undefined) == false! See ECMAScript 11.8.5. |
+ if ((cond == le) || (cond == ge)) { |
+ __ Cmp(right_type, ODDBALL_TYPE); |
+ __ B(ne, &return_equal); |
+ __ JumpIfNotRoot(right, Heap::kUndefinedValueRootIndex, &return_equal); |
+ if (cond == le) { |
+ // undefined <= undefined should fail. |
+ __ Mov(result, GREATER); |
+ } else { |
+ // undefined >= undefined should fail. |
+ __ Mov(result, LESS); |
} |
+ __ Ret(); |
} |
} |
@@ -350,10 +350,8 @@ static void EmitSmiNonsmiComparison(MacroAssembler* masm, |
Register right, |
FPRegister left_d, |
FPRegister right_d, |
- Register scratch, |
Label* slow, |
bool strict) { |
- DCHECK(!AreAliased(left, right, scratch)); |
DCHECK(!AreAliased(left_d, right_d)); |
DCHECK((left.is(x0) && right.is(x1)) || |
(right.is(x0) && left.is(x1))); |
@@ -367,8 +365,7 @@ static void EmitSmiNonsmiComparison(MacroAssembler* masm, |
// If right is not a number and left is a smi, then strict equality cannot |
// succeed. Return non-equal. |
Label is_heap_number; |
- __ JumpIfObjectType(right, scratch, scratch, HEAP_NUMBER_TYPE, |
- &is_heap_number); |
+ __ JumpIfHeapNumber(right, &is_heap_number); |
// Register right is a non-zero pointer, which is a valid NOT_EQUAL result. |
if (!right.is(result)) { |
__ Mov(result, NOT_EQUAL); |
@@ -378,7 +375,7 @@ static void EmitSmiNonsmiComparison(MacroAssembler* masm, |
} else { |
// Smi compared non-strictly with a non-smi, non-heap-number. Call the |
// runtime. |
- __ JumpIfNotObjectType(right, scratch, scratch, HEAP_NUMBER_TYPE, slow); |
+ __ JumpIfNotHeapNumber(right, slow); |
} |
// Left is the smi. Right is a heap number. Load right value into right_d, and |
@@ -393,8 +390,7 @@ static void EmitSmiNonsmiComparison(MacroAssembler* masm, |
// If left is not a number and right is a smi then strict equality cannot |
// succeed. Return non-equal. |
Label is_heap_number; |
- __ JumpIfObjectType(left, scratch, scratch, HEAP_NUMBER_TYPE, |
- &is_heap_number); |
+ __ JumpIfHeapNumber(left, &is_heap_number); |
// Register left is a non-zero pointer, which is a valid NOT_EQUAL result. |
if (!left.is(result)) { |
__ Mov(result, NOT_EQUAL); |
@@ -404,7 +400,7 @@ static void EmitSmiNonsmiComparison(MacroAssembler* masm, |
} else { |
// Smi compared non-strictly with a non-smi, non-heap-number. Call the |
// runtime. |
- __ JumpIfNotObjectType(left, scratch, scratch, HEAP_NUMBER_TYPE, slow); |
+ __ JumpIfNotHeapNumber(left, slow); |
} |
// Right is the smi. Left is a heap number. Load left value into left_d, and |
@@ -472,7 +468,6 @@ static void EmitCheckForInternalizedStringsOrObjects(MacroAssembler* masm, |
static void CompareICStub_CheckInputType(MacroAssembler* masm, Register input, |
- Register scratch, |
CompareICState::State expected, |
Label* fail) { |
Label ok; |
@@ -480,8 +475,7 @@ static void CompareICStub_CheckInputType(MacroAssembler* masm, Register input, |
__ JumpIfNotSmi(input, fail); |
} else if (expected == CompareICState::NUMBER) { |
__ JumpIfSmi(input, &ok); |
- __ CheckMap(input, scratch, Heap::kHeapNumberMapRootIndex, fail, |
- DONT_DO_SMI_CHECK); |
+ __ JumpIfNotHeapNumber(input, fail); |
} |
// We could be strict about internalized/non-internalized here, but as long as |
// hydrogen doesn't care, the stub doesn't have to care either. |
@@ -496,8 +490,8 @@ void CompareICStub::GenerateGeneric(MacroAssembler* masm) { |
Condition cond = GetCondition(); |
Label miss; |
- CompareICStub_CheckInputType(masm, lhs, x2, left(), &miss); |
- CompareICStub_CheckInputType(masm, rhs, x3, right(), &miss); |
+ CompareICStub_CheckInputType(masm, lhs, left(), &miss); |
+ CompareICStub_CheckInputType(masm, rhs, right(), &miss); |
Label slow; // Call builtin. |
Label not_smis, both_loaded_as_doubles; |
@@ -530,7 +524,7 @@ void CompareICStub::GenerateGeneric(MacroAssembler* masm) { |
// rhs_d, left into lhs_d. |
FPRegister rhs_d = d0; |
FPRegister lhs_d = d1; |
- EmitSmiNonsmiComparison(masm, lhs, rhs, lhs_d, rhs_d, x10, &slow, strict()); |
+ EmitSmiNonsmiComparison(masm, lhs, rhs, lhs_d, rhs_d, &slow, strict()); |
__ Bind(&both_loaded_as_doubles); |
// The arguments have been converted to doubles and stored in rhs_d and |
@@ -3140,11 +3134,7 @@ void StringCharCodeAtGenerator::GenerateSlow( |
__ Bind(&index_not_smi_); |
// If index is a heap number, try converting it to an integer. |
- __ CheckMap(index_, |
- result_, |
- Heap::kHeapNumberMapRootIndex, |
- index_not_number_, |
- DONT_DO_SMI_CHECK); |
+ __ JumpIfNotHeapNumber(index_, index_not_number_); |
call_helper.BeforeCall(masm); |
// Save object_ on the stack and pass index_ as argument for runtime call. |
__ Push(object_, index_); |
@@ -3265,15 +3255,13 @@ void CompareICStub::GenerateNumbers(MacroAssembler* masm) { |
// Load rhs if it's a heap number. |
__ JumpIfSmi(rhs, &handle_lhs); |
- __ CheckMap(rhs, x10, Heap::kHeapNumberMapRootIndex, &maybe_undefined1, |
- DONT_DO_SMI_CHECK); |
+ __ JumpIfNotHeapNumber(rhs, &maybe_undefined1); |
__ Ldr(rhs_d, FieldMemOperand(rhs, HeapNumber::kValueOffset)); |
// Load lhs if it's a heap number. |
__ Bind(&handle_lhs); |
__ JumpIfSmi(lhs, &values_in_d_regs); |
- __ CheckMap(lhs, x10, Heap::kHeapNumberMapRootIndex, &maybe_undefined2, |
- DONT_DO_SMI_CHECK); |
+ __ JumpIfNotHeapNumber(lhs, &maybe_undefined2); |
__ Ldr(lhs_d, FieldMemOperand(lhs, HeapNumber::kValueOffset)); |
__ Bind(&values_in_d_regs); |
@@ -3293,7 +3281,7 @@ void CompareICStub::GenerateNumbers(MacroAssembler* masm) { |
if (Token::IsOrderedRelationalCompareOp(op())) { |
__ JumpIfNotRoot(rhs, Heap::kUndefinedValueRootIndex, &miss); |
__ JumpIfSmi(lhs, &unordered); |
- __ JumpIfNotObjectType(lhs, x10, x10, HEAP_NUMBER_TYPE, &maybe_undefined2); |
+ __ JumpIfNotHeapNumber(lhs, &maybe_undefined2); |
__ B(&unordered); |
} |