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:
parent
6b5e87bd3e
commit
ea1aebce1d
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user