From ef6ffa2a01c6ff6220909f1df1960a906a44fe1a Mon Sep 17 00:00:00 2001 From: "weiliang.lin@intel.com" Date: Thu, 16 Oct 2014 06:24:47 +0000 Subject: [PATCH] X87: Implement inline %_IsJSProxy() for full codegen and Hydrogen. port r24636. original commit message: Implement inline %_IsJSProxy() for full codegen and Hydrogen Saving a runtime call for many builtin functions. BUG= R=weiliang.lin@intel.com Review URL: https://codereview.chromium.org/657273002 Patch from Chunyang Dai . git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@24649 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/x87/full-codegen-x87.cc | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/x87/full-codegen-x87.cc b/src/x87/full-codegen-x87.cc index 0e9d0bb304..0c4ddb8215 100644 --- a/src/x87/full-codegen-x87.cc +++ b/src/x87/full-codegen-x87.cc @@ -3325,6 +3325,31 @@ void FullCodeGenerator::EmitIsRegExp(CallRuntime* expr) { } +void FullCodeGenerator::EmitIsJSProxy(CallRuntime* expr) { + ZoneList* args = expr->arguments(); + DCHECK(args->length() == 1); + + VisitForAccumulatorValue(args->at(0)); + + Label materialize_true, materialize_false; + Label* if_true = NULL; + Label* if_false = NULL; + Label* fall_through = NULL; + context()->PrepareTest(&materialize_true, &materialize_false, &if_true, + &if_false, &fall_through); + + __ JumpIfSmi(eax, if_false); + Register map = ebx; + __ mov(map, FieldOperand(eax, HeapObject::kMapOffset)); + __ CmpInstanceType(map, FIRST_JS_PROXY_TYPE); + __ j(less, if_false); + __ CmpInstanceType(map, LAST_JS_PROXY_TYPE); + PrepareForBailoutBeforeSplit(expr, true, if_true, if_false); + Split(less_equal, if_true, if_false, fall_through); + + context()->Plug(if_true, if_false); +} + void FullCodeGenerator::EmitIsConstructCall(CallRuntime* expr) { DCHECK(expr->arguments()->length() == 0);