MIPS: Implement inline %_IsJSProxy() for full codegen and Hydrogen.

Port r24636

Original commit message:
Saving a runtime call for many builtin functions.

BUG=
R=paul.lind@imgtec.com

Review URL: https://codereview.chromium.org/661503002

git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@24645 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
balazs.kilvady@imgtec.com 2014-10-15 17:14:17 +00:00
parent 8949d5f580
commit e6a73c1eb5
2 changed files with 52 additions and 0 deletions

View File

@ -3417,6 +3417,32 @@ void FullCodeGenerator::EmitIsRegExp(CallRuntime* expr) {
}
void FullCodeGenerator::EmitIsJSProxy(CallRuntime* expr) {
ZoneList<Expression*>* 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(v0, if_false);
Register map = a1;
Register type_reg = a2;
__ GetObjectType(v0, map, type_reg);
__ Subu(type_reg, type_reg, Operand(FIRST_JS_PROXY_TYPE));
PrepareForBailoutBeforeSplit(expr, true, if_true, if_false);
Split(ls, type_reg, Operand(LAST_JS_PROXY_TYPE - FIRST_JS_PROXY_TYPE),
if_true, if_false, fall_through);
context()->Plug(if_true, if_false);
}
void FullCodeGenerator::EmitIsConstructCall(CallRuntime* expr) {
DCHECK(expr->arguments()->length() == 0);

View File

@ -3416,6 +3416,32 @@ void FullCodeGenerator::EmitIsRegExp(CallRuntime* expr) {
}
void FullCodeGenerator::EmitIsJSProxy(CallRuntime* expr) {
ZoneList<Expression*>* 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(v0, if_false);
Register map = a1;
Register type_reg = a2;
__ GetObjectType(v0, map, type_reg);
__ Subu(type_reg, type_reg, Operand(FIRST_JS_PROXY_TYPE));
PrepareForBailoutBeforeSplit(expr, true, if_true, if_false);
Split(ls, type_reg, Operand(LAST_JS_PROXY_TYPE - FIRST_JS_PROXY_TYPE),
if_true, if_false, fall_through);
context()->Plug(if_true, if_false);
}
void FullCodeGenerator::EmitIsConstructCall(CallRuntime* expr) {
DCHECK(expr->arguments()->length() == 0);