Chromium Code Reviews| Index: src/ia32/lithium-codegen-ia32.cc |
| diff --git a/src/ia32/lithium-codegen-ia32.cc b/src/ia32/lithium-codegen-ia32.cc |
| index 9940f8af7be54fc72e96af0939b4faa6350135d6..8b1053232a179cf891ddec1f7ecd436226d795c6 100644 |
| --- a/src/ia32/lithium-codegen-ia32.cc |
| +++ b/src/ia32/lithium-codegen-ia32.cc |
| @@ -3676,8 +3676,10 @@ void LCodeGen::DoSmiUntag(LSmiUntag* instr) { |
| void LCodeGen::EmitNumberUntagD(Register input_reg, |
| + Register temp_reg, |
| XMMRegister result_reg, |
| bool deoptimize_on_undefined, |
| + bool deoptimize_on_minus_zero, |
| LEnvironment* env) { |
| Label load_smi, done; |
| @@ -3706,6 +3708,15 @@ void LCodeGen::EmitNumberUntagD(Register input_reg, |
| } |
| // Heap number to XMM conversion. |
| __ movdbl(result_reg, FieldOperand(input_reg, HeapNumber::kValueOffset)); |
| + if (deoptimize_on_minus_zero) { |
| + XMMRegister xmm_scratch = xmm0; |
| + __ xorps(xmm_scratch, xmm_scratch); |
| + __ ucomisd(result_reg, xmm_scratch); |
| + __ j(not_zero, &done, Label::kNear); |
| + __ movmskpd(temp_reg, result_reg); |
| + __ test_b(temp_reg, 1); |
| + DeoptimizeIf(not_zero, env); |
| + } |
| __ jmp(&done, Label::kNear); |
| // Smi to XMM conversion |
| @@ -3828,14 +3839,23 @@ void LCodeGen::DoTaggedToI(LTaggedToI* instr) { |
| void LCodeGen::DoNumberUntagD(LNumberUntagD* instr) { |
| LOperand* input = instr->InputAt(0); |
| ASSERT(input->IsRegister()); |
| + LOperand* temp = instr->TempAt(0); |
| + ASSERT(temp == NULL || temp->IsRegister()); |
| LOperand* result = instr->result(); |
| ASSERT(result->IsDoubleRegister()); |
| Register input_reg = ToRegister(input); |
| XMMRegister result_reg = ToDoubleRegister(result); |
| - EmitNumberUntagD(input_reg, result_reg, |
| + bool deoptmize_on_minus_zero = |
|
fschneider
2012/01/11 10:29:32
s/deoptmize/deoptimize/g
|
| + instr->hydrogen()->CheckFlag(HValue::kBailoutOnMinusZero); |
| + Register temp_reg = deoptmize_on_minus_zero ? ToRegister(temp) : no_reg; |
| + |
| + EmitNumberUntagD(input_reg, |
| + temp_reg, |
| + result_reg, |
| instr->hydrogen()->deoptimize_on_undefined(), |
| + deoptmize_on_minus_zero, |
| instr->environment()); |
| } |