MIPS: Save one branch for normal heap number un-tagging.

Port r16856 (edeb2d3)

BUG=
R=gergely@homejinni.com

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

Patch from Balazs Kilvady <kilvadyb@homejinni.com>.

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@16871 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
palfia@homejinni.com 2013-09-20 19:05:48 +00:00
parent 6b5e87bd3e
commit ea1aebce1d

View File

@ -4801,34 +4801,19 @@ void LCodeGen::EmitNumberUntagD(Register input_reg,
LEnvironment* env, LEnvironment* env,
NumberUntagDMode mode) { NumberUntagDMode mode) {
Register scratch = scratch0(); Register scratch = scratch0();
Label convert, load_smi, done;
Label load_smi, heap_number, done;
if (mode == NUMBER_CANDIDATE_IS_ANY_TAGGED) { if (mode == NUMBER_CANDIDATE_IS_ANY_TAGGED) {
// Smi check. // Smi check.
__ UntagAndJumpIfSmi(scratch, input_reg, &load_smi); __ UntagAndJumpIfSmi(scratch, input_reg, &load_smi);
// Heap number map check. // Heap number map check.
__ lw(scratch, FieldMemOperand(input_reg, HeapObject::kMapOffset)); __ lw(scratch, FieldMemOperand(input_reg, HeapObject::kMapOffset));
__ LoadRoot(at, Heap::kHeapNumberMapRootIndex); __ LoadRoot(at, Heap::kHeapNumberMapRootIndex);
if (!can_convert_undefined_to_nan) { if (can_convert_undefined_to_nan) {
DeoptimizeIf(ne, env, scratch, Operand(at)); __ Branch(&convert, ne, scratch, Operand(at));
} else { } else {
Label heap_number, convert; DeoptimizeIf(ne, env, scratch, Operand(at));
__ Branch(&heap_number, eq, scratch, Operand(at));
// Convert undefined (and hole) to NaN.
__ LoadRoot(at, Heap::kUndefinedValueRootIndex);
DeoptimizeIf(ne, env, input_reg, Operand(at));
__ bind(&convert);
__ LoadRoot(at, Heap::kNanValueRootIndex);
__ ldc1(result_reg, FieldMemOperand(at, HeapNumber::kValueOffset));
__ Branch(&done);
__ bind(&heap_number);
} }
// Heap number to double register conversion. // Load heap number.
__ ldc1(result_reg, FieldMemOperand(input_reg, HeapNumber::kValueOffset)); __ ldc1(result_reg, FieldMemOperand(input_reg, HeapNumber::kValueOffset));
if (deoptimize_on_minus_zero) { if (deoptimize_on_minus_zero) {
__ mfc1(at, result_reg.low()); __ mfc1(at, result_reg.low());
@ -4837,11 +4822,19 @@ void LCodeGen::EmitNumberUntagD(Register input_reg,
DeoptimizeIf(eq, env, scratch, Operand(HeapNumber::kSignMask)); DeoptimizeIf(eq, env, scratch, Operand(HeapNumber::kSignMask));
} }
__ Branch(&done); __ Branch(&done);
if (can_convert_undefined_to_nan) {
__ bind(&convert);
// Convert undefined (and hole) to NaN.
__ LoadRoot(at, Heap::kUndefinedValueRootIndex);
DeoptimizeIf(ne, env, input_reg, Operand(at));
__ LoadRoot(scratch, Heap::kNanValueRootIndex);
__ ldc1(result_reg, FieldMemOperand(scratch, HeapNumber::kValueOffset));
__ Branch(&done);
}
} else { } else {
__ SmiUntag(scratch, input_reg); __ SmiUntag(scratch, input_reg);
ASSERT(mode == NUMBER_CANDIDATE_IS_SMI); ASSERT(mode == NUMBER_CANDIDATE_IS_SMI);
} }
// Smi to double register conversion // Smi to double register conversion
__ bind(&load_smi); __ bind(&load_smi);
// scratch: untagged value of input_reg // scratch: untagged value of input_reg