Index: src/arm/lithium-codegen-arm.cc |
diff --git a/src/arm/lithium-codegen-arm.cc b/src/arm/lithium-codegen-arm.cc |
index 4b05db1d6a0e4138446501a636d67ccc392721c5..6dadef0873e6e762a679bedbc78da380298ac03e 100644 |
--- a/src/arm/lithium-codegen-arm.cc |
+++ b/src/arm/lithium-codegen-arm.cc |
@@ -5557,22 +5557,21 @@ Condition LCodeGen::EmitTypeofIs(Label* true_label, |
Register scratch = scratch0(); |
if (type_name->Equals(heap()->number_string())) { |
__ JumpIfSmi(input, true_label); |
- __ ldr(input, FieldMemOperand(input, HeapObject::kMapOffset)); |
- __ LoadRoot(ip, Heap::kHeapNumberMapRootIndex); |
- __ cmp(input, Operand(ip)); |
+ __ ldr(scratch, FieldMemOperand(input, HeapObject::kMapOffset)); |
+ __ CompareRoot(scratch, Heap::kHeapNumberMapRootIndex); |
final_branch_condition = eq; |
} else if (type_name->Equals(heap()->string_string())) { |
__ JumpIfSmi(input, false_label); |
- __ CompareObjectType(input, input, scratch, FIRST_NONSTRING_TYPE); |
+ __ CompareObjectType(input, scratch, no_reg, FIRST_NONSTRING_TYPE); |
__ b(ge, false_label); |
- __ ldrb(ip, FieldMemOperand(input, Map::kBitFieldOffset)); |
- __ tst(ip, Operand(1 << Map::kIsUndetectable)); |
+ __ ldrb(scratch, FieldMemOperand(scratch, Map::kBitFieldOffset)); |
+ __ tst(scratch, Operand(1 << Map::kIsUndetectable)); |
final_branch_condition = eq; |
} else if (type_name->Equals(heap()->symbol_string())) { |
__ JumpIfSmi(input, false_label); |
- __ CompareObjectType(input, input, scratch, SYMBOL_TYPE); |
+ __ CompareObjectType(input, scratch, no_reg, SYMBOL_TYPE); |
final_branch_condition = eq; |
} else if (type_name->Equals(heap()->boolean_string())) { |
@@ -5590,33 +5589,35 @@ Condition LCodeGen::EmitTypeofIs(Label* true_label, |
__ b(eq, true_label); |
__ JumpIfSmi(input, false_label); |
// Check for undetectable objects => true. |
- __ ldr(input, FieldMemOperand(input, HeapObject::kMapOffset)); |
- __ ldrb(ip, FieldMemOperand(input, Map::kBitFieldOffset)); |
- __ tst(ip, Operand(1 << Map::kIsUndetectable)); |
+ __ ldr(scratch, FieldMemOperand(input, HeapObject::kMapOffset)); |
+ __ ldrb(scratch, FieldMemOperand(scratch, Map::kBitFieldOffset)); |
+ __ tst(scratch, Operand(1 << Map::kIsUndetectable)); |
final_branch_condition = ne; |
} else if (type_name->Equals(heap()->function_string())) { |
STATIC_ASSERT(NUM_OF_CALLABLE_SPEC_OBJECT_TYPES == 2); |
+ Register type_reg = scratch; |
__ JumpIfSmi(input, false_label); |
- __ CompareObjectType(input, scratch, input, JS_FUNCTION_TYPE); |
+ __ CompareObjectType(input, scratch, type_reg, JS_FUNCTION_TYPE); |
__ b(eq, true_label); |
- __ cmp(input, Operand(JS_FUNCTION_PROXY_TYPE)); |
+ __ cmp(type_reg, Operand(JS_FUNCTION_PROXY_TYPE)); |
final_branch_condition = eq; |
} else if (type_name->Equals(heap()->object_string())) { |
+ Register map = scratch; |
__ JumpIfSmi(input, false_label); |
if (!FLAG_harmony_typeof) { |
__ CompareRoot(input, Heap::kNullValueRootIndex); |
__ b(eq, true_label); |
} |
- __ CompareObjectType(input, input, scratch, |
- FIRST_NONCALLABLE_SPEC_OBJECT_TYPE); |
- __ b(lt, false_label); |
- __ CompareInstanceType(input, scratch, LAST_NONCALLABLE_SPEC_OBJECT_TYPE); |
- __ b(gt, false_label); |
+ __ CheckObjectTypeRange(input, |
+ map, |
+ FIRST_NONCALLABLE_SPEC_OBJECT_TYPE, |
+ LAST_NONCALLABLE_SPEC_OBJECT_TYPE, |
+ false_label); |
// Check for undetectable objects => false. |
- __ ldrb(ip, FieldMemOperand(input, Map::kBitFieldOffset)); |
- __ tst(ip, Operand(1 << Map::kIsUndetectable)); |
+ __ ldrb(scratch, FieldMemOperand(map, Map::kBitFieldOffset)); |
+ __ tst(scratch, Operand(1 << Map::kIsUndetectable)); |
final_branch_condition = eq; |
} else { |