From 24c2a018f63264238a772245f097d54349b5aaf5 Mon Sep 17 00:00:00 2001 From: "verwaest@chromium.org" Date: Thu, 24 Jul 2014 09:12:34 +0000 Subject: [PATCH] X87: Only to the relevant checks in LoadFunctionPrototype port r22550. original commit message: Only to the relevant checks in LoadFunctionPrototype BUG= R=verwaest@chromium.org Review URL: https://codereview.chromium.org/410223002 Patch from Chunyang Dai . git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@22586 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/x87/macro-assembler-x87.cc | 37 ++++++++++++++++++++----------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/src/x87/macro-assembler-x87.cc b/src/x87/macro-assembler-x87.cc index ba93fbb..f3a4245 100644 --- a/src/x87/macro-assembler-x87.cc +++ b/src/x87/macro-assembler-x87.cc @@ -1869,27 +1869,27 @@ void MacroAssembler::TryGetFunctionPrototype(Register function, Register scratch, Label* miss, bool miss_on_bound_function) { - // Check that the receiver isn't a smi. - JumpIfSmi(function, miss); + Label non_instance; + if (miss_on_bound_function) { + // Check that the receiver isn't a smi. + JumpIfSmi(function, miss); - // Check that the function really is a function. - CmpObjectType(function, JS_FUNCTION_TYPE, result); - j(not_equal, miss); + // Check that the function really is a function. + CmpObjectType(function, JS_FUNCTION_TYPE, result); + j(not_equal, miss); - if (miss_on_bound_function) { // If a bound function, go to miss label. mov(scratch, FieldOperand(function, JSFunction::kSharedFunctionInfoOffset)); BooleanBitTest(scratch, SharedFunctionInfo::kCompilerHintsOffset, SharedFunctionInfo::kBoundFunction); j(not_zero, miss); - } - // Make sure that the function has an instance prototype. - Label non_instance; - movzx_b(scratch, FieldOperand(result, Map::kBitFieldOffset)); - test(scratch, Immediate(1 << Map::kHasNonInstancePrototype)); - j(not_zero, &non_instance); + // Make sure that the function has an instance prototype. + movzx_b(scratch, FieldOperand(result, Map::kBitFieldOffset)); + test(scratch, Immediate(1 << Map::kHasNonInstancePrototype)); + j(not_zero, &non_instance); + } // Get the prototype or initial map from the function. mov(result, @@ -1908,12 +1908,15 @@ void MacroAssembler::TryGetFunctionPrototype(Register function, // Get the prototype from the initial map. mov(result, FieldOperand(result, Map::kPrototypeOffset)); - jmp(&done); - // Non-instance prototype: Fetch prototype from constructor field - // in initial map. - bind(&non_instance); - mov(result, FieldOperand(result, Map::kConstructorOffset)); + if (miss_on_bound_function) { + jmp(&done); + + // Non-instance prototype: Fetch prototype from constructor field + // in initial map. + bind(&non_instance); + mov(result, FieldOperand(result, Map::kConstructorOffset)); + } // All done. bind(&done); -- 2.7.4