Commit 0bc8ef88 authored by plind44@gmail.com's avatar plind44@gmail.com

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 <palfia@homejinni.com>.

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@15259 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 54483c48
......@@ -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(&not_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));
}
}
}
}
......
......@@ -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;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment