From: plind44@gmail.com Date: Fri, 21 Jun 2013 02:43:13 +0000 (+0000) Subject: MIPS: Let NaN flow as double into HBranch + some minor improvements X-Git-Tag: upstream/4.7.83~13738 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=0bc8ef88dda397b0d84a50cbe8a54c0e01132182;p=platform%2Fupstream%2Fv8.git MIPS: Let NaN flow as double into HBranch + some minor improvements Port r15246 (cb18dce2) BUG= R=plind44@gmail.com Review URL: https://codereview.chromium.org/17198012 Patch from Akos Palfi . git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@15259 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- diff --git a/src/mips/lithium-codegen-mips.cc b/src/mips/lithium-codegen-mips.cc index c50e066..d05cd28 100644 --- a/src/mips/lithium-codegen-mips.cc +++ b/src/mips/lithium-codegen-mips.cc @@ -2039,10 +2039,23 @@ void LCodeGen::DoBranch(LBranch* instr) { } else if (type.IsSmi()) { ASSERT(!info()->IsStub()); EmitBranch(instr, ne, reg, Operand(zero_reg)); + } else if (type.IsJSArray()) { + ASSERT(!info()->IsStub()); + EmitBranch(instr, al, zero_reg, Operand(zero_reg)); + } else if (type.IsHeapNumber()) { + ASSERT(!info()->IsStub()); + DoubleRegister dbl_scratch = double_scratch0(); + __ ldc1(dbl_scratch, FieldMemOperand(reg, HeapNumber::kValueOffset)); + // Test the double value. Zero and NaN are false. + EmitBranchF(instr, nue, dbl_scratch, kDoubleRegZero); + } else if (type.IsString()) { + ASSERT(!info()->IsStub()); + __ lw(at, FieldMemOperand(reg, String::kLengthOffset)); + EmitBranch(instr, ne, at, Operand(zero_reg)); } else { ToBooleanStub::Types expected = instr->hydrogen()->expected_input_types(); // Avoid deopts in the case where we've never executed this path before. - if (expected.IsEmpty()) expected = ToBooleanStub::all_types(); + if (expected.IsEmpty()) expected = ToBooleanStub::Types::Generic(); if (expected.Contains(ToBooleanStub::UNDEFINED)) { // undefined -> false. @@ -2122,8 +2135,11 @@ void LCodeGen::DoBranch(LBranch* instr) { __ bind(¬_heap_number); } - // We've seen something for the first time -> deopt. - DeoptimizeIf(al, instr->environment(), zero_reg, Operand(zero_reg)); + if (!expected.IsGeneric()) { + // We've seen something for the first time -> deopt. + // This can only happen if we are not generic already. + DeoptimizeIf(al, instr->environment(), zero_reg, Operand(zero_reg)); + } } } } diff --git a/src/mips/lithium-mips.cc b/src/mips/lithium-mips.cc index 9616a32..293ecb0 100644 --- a/src/mips/lithium-mips.cc +++ b/src/mips/lithium-mips.cc @@ -1003,10 +1003,13 @@ LInstruction* LChunkBuilder::DoBranch(HBranch* instr) { LBranch* result = new(zone()) LBranch(UseRegister(value)); // Tagged values that are not known smis or booleans require a - // deoptimization environment. + // deoptimization environment. If the instruction is generic no + // environment is needed since all cases are handled. Representation rep = value->representation(); HType type = value->type(); - if (rep.IsTagged() && !type.IsSmi() && !type.IsBoolean()) { + ToBooleanStub::Types expected = instr->expected_input_types(); + if (rep.IsTagged() && !type.IsSmi() && !type.IsBoolean() && + !expected.IsGeneric()) { return AssignEnvironment(result); } return result;