Index: src/x64/codegen-x64.cc |
=================================================================== |
--- src/x64/codegen-x64.cc (revision 2367) |
+++ src/x64/codegen-x64.cc (working copy) |
@@ -3144,11 +3144,9 @@ |
__ testb(FieldOperand(kScratchRegister, Map::kBitFieldOffset), |
Immediate(1 << Map::kIsUndetectable)); |
destination()->false_target()->Branch(not_zero); |
- __ movb(kScratchRegister, |
- FieldOperand(kScratchRegister, Map::kInstanceTypeOffset)); |
- __ cmpb(kScratchRegister, Immediate(FIRST_JS_OBJECT_TYPE)); |
+ __ CmpInstanceType(kScratchRegister, FIRST_JS_OBJECT_TYPE); |
destination()->false_target()->Branch(below); |
- __ cmpb(kScratchRegister, Immediate(LAST_JS_OBJECT_TYPE)); |
+ __ CmpInstanceType(kScratchRegister, LAST_JS_OBJECT_TYPE); |
answer.Unuse(); |
destination()->Split(below_equal); |
} else { |
@@ -3393,27 +3391,22 @@ |
// Check that the object is a JS object but take special care of JS |
// functions to make sure they have 'Function' as their class. |
- { Result tmp = allocator()->Allocate(); |
- __ movq(obj.reg(), FieldOperand(obj.reg(), HeapObject::kMapOffset)); |
- __ movb(tmp.reg(), FieldOperand(obj.reg(), Map::kInstanceTypeOffset)); |
- __ cmpb(tmp.reg(), Immediate(FIRST_JS_OBJECT_TYPE)); |
- null.Branch(less); |
- // As long as JS_FUNCTION_TYPE is the last instance type and it is |
- // right after LAST_JS_OBJECT_TYPE, we can avoid checking for |
- // LAST_JS_OBJECT_TYPE. |
- ASSERT(LAST_TYPE == JS_FUNCTION_TYPE); |
- ASSERT(JS_FUNCTION_TYPE == LAST_JS_OBJECT_TYPE + 1); |
- __ cmpb(tmp.reg(), Immediate(JS_FUNCTION_TYPE)); |
- function.Branch(equal); |
- } |
+ __ CmpObjectType(obj.reg(), FIRST_JS_OBJECT_TYPE, obj.reg()); |
+ null.Branch(less); |
+ // As long as JS_FUNCTION_TYPE is the last instance type and it is |
+ // right after LAST_JS_OBJECT_TYPE, we can avoid checking for |
+ // LAST_JS_OBJECT_TYPE. |
+ ASSERT(LAST_TYPE == JS_FUNCTION_TYPE); |
+ ASSERT(JS_FUNCTION_TYPE == LAST_JS_OBJECT_TYPE + 1); |
+ __ CmpInstanceType(obj.reg(), JS_FUNCTION_TYPE); |
+ function.Branch(equal); |
+ |
// Check if the constructor in the map is a function. |
- { Result tmp = allocator()->Allocate(); |
- __ movq(obj.reg(), FieldOperand(obj.reg(), Map::kConstructorOffset)); |
- __ CmpObjectType(obj.reg(), JS_FUNCTION_TYPE, tmp.reg()); |
- non_function_constructor.Branch(not_equal); |
- } |
+ __ movq(obj.reg(), FieldOperand(obj.reg(), Map::kConstructorOffset)); |
+ __ CmpObjectType(obj.reg(), JS_FUNCTION_TYPE, kScratchRegister); |
+ non_function_constructor.Branch(not_equal); |
// The obj register now contains the constructor function. Grab the |
// instance class name from there. |
@@ -5428,6 +5421,7 @@ |
__ j(equal, &false_result); |
// Get the map and type of the heap object. |
+ // We don't use CmpObjectType because we manipulate the type field. |
__ movq(rdx, FieldOperand(rax, HeapObject::kMapOffset)); |
__ movzxbq(rcx, FieldOperand(rdx, Map::kInstanceTypeOffset)); |