| Index: src/x64/lithium-codegen-x64.cc
|
| ===================================================================
|
| --- src/x64/lithium-codegen-x64.cc (revision 8253)
|
| +++ src/x64/lithium-codegen-x64.cc (working copy)
|
| @@ -3362,8 +3362,9 @@
|
|
|
| void LCodeGen::EmitNumberUntagD(Register input_reg,
|
| XMMRegister result_reg,
|
| + bool deoptimize_on_undefined,
|
| LEnvironment* env) {
|
| - NearLabel load_smi, heap_number, done;
|
| + NearLabel load_smi, done;
|
|
|
| // Smi check.
|
| __ JumpIfSmi(input_reg, &load_smi);
|
| @@ -3371,18 +3372,22 @@
|
| // Heap number map check.
|
| __ CompareRoot(FieldOperand(input_reg, HeapObject::kMapOffset),
|
| Heap::kHeapNumberMapRootIndex);
|
| - __ j(equal, &heap_number);
|
| + if (deoptimize_on_undefined) {
|
| + DeoptimizeIf(not_equal, env);
|
| + } else {
|
| + NearLabel heap_number;
|
| + __ j(equal, &heap_number);
|
| + __ CompareRoot(input_reg, Heap::kUndefinedValueRootIndex);
|
| + DeoptimizeIf(not_equal, env);
|
|
|
| - __ CompareRoot(input_reg, Heap::kUndefinedValueRootIndex);
|
| - DeoptimizeIf(not_equal, env);
|
| + // Convert undefined to NaN. Compute NaN as 0/0.
|
| + __ xorpd(result_reg, result_reg);
|
| + __ divsd(result_reg, result_reg);
|
| + __ jmp(&done);
|
|
|
| - // Convert undefined to NaN. Compute NaN as 0/0.
|
| - __ xorpd(result_reg, result_reg);
|
| - __ divsd(result_reg, result_reg);
|
| - __ jmp(&done);
|
| -
|
| + __ bind(&heap_number);
|
| + }
|
| // Heap number to XMM conversion.
|
| - __ bind(&heap_number);
|
| __ movsd(result_reg, FieldOperand(input_reg, HeapNumber::kValueOffset));
|
| __ jmp(&done);
|
|
|
| @@ -3473,7 +3478,9 @@
|
| Register input_reg = ToRegister(input);
|
| XMMRegister result_reg = ToDoubleRegister(result);
|
|
|
| - EmitNumberUntagD(input_reg, result_reg, instr->environment());
|
| + EmitNumberUntagD(input_reg, result_reg,
|
| + instr->hydrogen()->deoptimize_on_undefined(),
|
| + instr->environment());
|
| }
|
|
|
|
|
|
|