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