From ae4234b4885a3279485a26260d8e7b08717e9ef4 Mon Sep 17 00:00:00 2001 From: "bmeurer@chromium.org" Date: Fri, 20 Sep 2013 09:57:58 +0000 Subject: [PATCH] Save one branch for normal heap number un-tagging. R=bmeurer@chromium.org Review URL: https://codereview.chromium.org/23496041 Patch from Bangfu Tao . git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@16856 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/arm/lithium-codegen-arm.cc | 35 ++++++++++++++--------------------- 1 file changed, 14 insertions(+), 21 deletions(-) diff --git a/src/arm/lithium-codegen-arm.cc b/src/arm/lithium-codegen-arm.cc index 60b9cbc..f62e3ff 100644 --- a/src/arm/lithium-codegen-arm.cc +++ b/src/arm/lithium-codegen-arm.cc @@ -4868,36 +4868,20 @@ void LCodeGen::EmitNumberUntagD(Register input_reg, Register scratch = scratch0(); SwVfpRegister flt_scratch = double_scratch0().low(); ASSERT(!result_reg.is(double_scratch0())); - - Label load_smi, heap_number, done; - + Label convert, load_smi, done; if (mode == NUMBER_CANDIDATE_IS_ANY_TAGGED) { // Smi check. __ UntagAndJumpIfSmi(scratch, input_reg, &load_smi); - // Heap number map check. __ ldr(scratch, FieldMemOperand(input_reg, HeapObject::kMapOffset)); __ LoadRoot(ip, Heap::kHeapNumberMapRootIndex); __ cmp(scratch, Operand(ip)); - if (!can_convert_undefined_to_nan) { - DeoptimizeIf(ne, env); + if (can_convert_undefined_to_nan) { + __ b(ne, &convert); } else { - Label heap_number, convert; - __ b(eq, &heap_number); - - // Convert undefined (and hole) to NaN. - __ LoadRoot(ip, Heap::kUndefinedValueRootIndex); - __ cmp(input_reg, Operand(ip)); DeoptimizeIf(ne, env); - - __ bind(&convert); - __ LoadRoot(scratch, Heap::kNanValueRootIndex); - __ vldr(result_reg, scratch, HeapNumber::kValueOffset - kHeapObjectTag); - __ jmp(&done); - - __ bind(&heap_number); } - // Heap number to double register conversion. + // load heap number __ vldr(result_reg, input_reg, HeapNumber::kValueOffset - kHeapObjectTag); if (deoptimize_on_minus_zero) { __ VmovLow(scratch, result_reg); @@ -4908,11 +4892,20 @@ void LCodeGen::EmitNumberUntagD(Register input_reg, DeoptimizeIf(eq, env); } __ jmp(&done); + if (can_convert_undefined_to_nan) { + __ bind(&convert); + // Convert undefined (and hole) to NaN. + __ LoadRoot(ip, Heap::kUndefinedValueRootIndex); + __ cmp(input_reg, Operand(ip)); + DeoptimizeIf(ne, env); + __ LoadRoot(scratch, Heap::kNanValueRootIndex); + __ vldr(result_reg, scratch, HeapNumber::kValueOffset - kHeapObjectTag); + __ jmp(&done); + } } else { __ SmiUntag(scratch, input_reg); ASSERT(mode == NUMBER_CANDIDATE_IS_SMI); } - // Smi to double register conversion __ bind(&load_smi); // scratch: untagged value of input_reg -- 2.7.4