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 0d22bc914168eb9fd10d69db7d34023626b8d5a7..c0515c5d3e12edf57ef1ae4fa6f30db3bd4289bb 100644 |
| --- a/src/ia32/lithium-codegen-ia32.cc |
| +++ b/src/ia32/lithium-codegen-ia32.cc |
| @@ -2219,6 +2219,13 @@ void LCodeGen::EmitBranch(InstrType instr, Condition cc) { |
| } |
| +template<class InstrType> |
| +void LCodeGen::EmitFalseBranch(InstrType instr, Condition cc) { |
| + int false_block = instr->FalseDestination(chunk_); |
| + __ j(cc, chunk_->GetAssemblyLabel(false_block)); |
| +} |
| + |
| + |
| void LCodeGen::DoIsNumberAndBranch(LIsNumberAndBranch* instr) { |
| Representation r = instr->hydrogen()->value()->representation(); |
| if (r.IsSmiOrInteger32() || r.IsDouble()) { |
| @@ -2469,6 +2476,46 @@ void LCodeGen::DoCmpObjectEqAndBranch(LCmpObjectEqAndBranch* instr) { |
| } |
| +void LCodeGen::DoCmpHoleAndBranch(LCmpHoleAndBranch* instr) { |
| + if (instr->hydrogen()->representation().IsTagged()) { |
|
danno
2013/08/13 12:55:03
What about smi representations?
Toon Verwaest
2013/08/13 13:18:56
The hole never escapes as smi; only as double (nan
|
| + Register input_reg = ToRegister(instr->object()); |
| + __ cmp(input_reg, factory()->the_hole_value()); |
| + EmitBranch(instr, equal); |
| + return; |
| + } |
| + |
| + bool use_sse2 = CpuFeatures::IsSupported(SSE2); |
| + if (use_sse2) { |
| + CpuFeatureScope scope(masm(), SSE2); |
| + XMMRegister input_reg = ToDoubleRegister(instr->object()); |
| + __ ucomisd(input_reg, input_reg); |
| + } else { |
| + // Put the value to the top of stack |
| + X87Register src = ToX87Register(instr->object()); |
| + X87LoadForUsage(src); |
| + __ fld(0); |
| + __ fld(0); |
| + __ FCmp(); |
| + } |
| + |
| + EmitFalseBranch(instr, parity_odd); |
| + |
| + __ sub(esp, Immediate(kDoubleSize)); |
| + if (use_sse2) { |
| + CpuFeatureScope scope(masm(), SSE2); |
| + XMMRegister input_reg = ToDoubleRegister(instr->object()); |
| + __ movdbl(MemOperand(esp, 0), input_reg); |
| + } else { |
| + __ fld(0); |
| + __ fstp_d(MemOperand(esp, 0)); |
| + } |
| + |
| + __ add(esp, Immediate(kDoubleSize)); |
| + __ cmp(MemOperand(esp, -sizeof(kHoleNanLower32)), Immediate(kHoleNanUpper32)); |
| + EmitBranch(instr, equal); |
| +} |
| + |
| + |
| Condition LCodeGen::EmitIsObject(Register input, |
| Register temp1, |
| Label* is_not_object, |
| @@ -5069,13 +5116,6 @@ void LCodeGen::DoNumberTagD(LNumberTagD* instr) { |
| Register reg = ToRegister(instr->result()); |
| - bool convert_hole = false; |
| - HValue* change_input = instr->hydrogen()->value(); |
| - if (change_input->IsLoadKeyed()) { |
| - HLoadKeyed* load = HLoadKeyed::cast(change_input); |
| - convert_hole = load->UsesMustHandleHole(); |
| - } |
| - |
| bool use_sse2 = CpuFeatures::IsSupported(SSE2); |
| if (!use_sse2) { |
| // Put the value to the top of stack |
| @@ -5083,54 +5123,6 @@ void LCodeGen::DoNumberTagD(LNumberTagD* instr) { |
| X87LoadForUsage(src); |
| } |
| - Label no_special_nan_handling; |
| - Label done; |
| - if (convert_hole) { |
| - if (use_sse2) { |
| - CpuFeatureScope scope(masm(), SSE2); |
| - XMMRegister input_reg = ToDoubleRegister(instr->value()); |
| - __ ucomisd(input_reg, input_reg); |
| - } else { |
| - __ fld(0); |
| - __ fld(0); |
| - __ FCmp(); |
| - } |
| - |
| - __ j(parity_odd, &no_special_nan_handling); |
| - __ sub(esp, Immediate(kDoubleSize)); |
| - if (use_sse2) { |
| - CpuFeatureScope scope(masm(), SSE2); |
| - XMMRegister input_reg = ToDoubleRegister(instr->value()); |
| - __ movdbl(MemOperand(esp, 0), input_reg); |
| - } else { |
| - __ fld(0); |
| - __ fstp_d(MemOperand(esp, 0)); |
| - } |
| - __ cmp(MemOperand(esp, sizeof(kHoleNanLower32)), |
| - Immediate(kHoleNanUpper32)); |
| - Label canonicalize; |
| - __ j(not_equal, &canonicalize); |
| - __ add(esp, Immediate(kDoubleSize)); |
| - __ mov(reg, factory()->the_hole_value()); |
| - if (!use_sse2) { |
| - __ fstp(0); |
| - } |
| - __ jmp(&done); |
| - __ bind(&canonicalize); |
| - __ add(esp, Immediate(kDoubleSize)); |
| - ExternalReference nan = |
| - ExternalReference::address_of_canonical_non_hole_nan(); |
| - if (use_sse2) { |
| - CpuFeatureScope scope(masm(), SSE2); |
| - XMMRegister input_reg = ToDoubleRegister(instr->value()); |
| - __ movdbl(input_reg, Operand::StaticVariable(nan)); |
| - } else { |
| - __ fstp(0); |
| - __ fld_d(Operand::StaticVariable(nan)); |
| - } |
| - } |
| - |
| - __ bind(&no_special_nan_handling); |
| DeferredNumberTagD* deferred = new(zone()) DeferredNumberTagD(this, instr); |
| if (FLAG_inline_new) { |
| Register tmp = ToRegister(instr->temp()); |
| @@ -5146,7 +5138,6 @@ void LCodeGen::DoNumberTagD(LNumberTagD* instr) { |
| } else { |
| __ fstp_d(FieldOperand(reg, HeapNumber::kValueOffset)); |
| } |
| - __ bind(&done); |
| } |
| @@ -5196,23 +5187,21 @@ void LCodeGen::DoSmiUntag(LSmiUntag* instr) { |
| void LCodeGen::EmitNumberUntagDNoSSE2(Register input_reg, |
| Register temp_reg, |
| X87Register res_reg, |
| - bool allow_undefined_as_nan, |
| + bool convert_undefined_to_nan, |
| bool deoptimize_on_minus_zero, |
| LEnvironment* env, |
| NumberUntagDMode mode) { |
| Label load_smi, done; |
| X87PrepareToWrite(res_reg); |
| - STATIC_ASSERT(NUMBER_CANDIDATE_IS_ANY_TAGGED_CONVERT_HOLE > |
| - NUMBER_CANDIDATE_IS_ANY_TAGGED); |
| - if (mode >= NUMBER_CANDIDATE_IS_ANY_TAGGED) { |
| + if (mode == NUMBER_CANDIDATE_IS_ANY_TAGGED) { |
| // Smi check. |
| __ JumpIfSmi(input_reg, &load_smi, Label::kNear); |
| // Heap number map check. |
| __ cmp(FieldOperand(input_reg, HeapObject::kMapOffset), |
| factory()->heap_number_map()); |
| - if (!allow_undefined_as_nan) { |
| + if (!convert_undefined_to_nan) { |
| DeoptimizeIf(not_equal, env); |
| } else { |
| Label heap_number, convert; |
| @@ -5220,10 +5209,6 @@ void LCodeGen::EmitNumberUntagDNoSSE2(Register input_reg, |
| // Convert undefined (or hole) to NaN. |
| __ cmp(input_reg, factory()->undefined_value()); |
| - if (mode == NUMBER_CANDIDATE_IS_ANY_TAGGED_CONVERT_HOLE) { |
| - __ j(equal, &convert, Label::kNear); |
| - __ cmp(input_reg, factory()->the_hole_value()); |
| - } |
| DeoptimizeIf(not_equal, env); |
| __ bind(&convert); |
| @@ -5270,22 +5255,20 @@ void LCodeGen::EmitNumberUntagDNoSSE2(Register input_reg, |
| void LCodeGen::EmitNumberUntagD(Register input_reg, |
| Register temp_reg, |
| XMMRegister result_reg, |
| - bool allow_undefined_as_nan, |
| + bool convert_undefined_to_nan, |
| bool deoptimize_on_minus_zero, |
| LEnvironment* env, |
| NumberUntagDMode mode) { |
| Label load_smi, done; |
| - STATIC_ASSERT(NUMBER_CANDIDATE_IS_ANY_TAGGED_CONVERT_HOLE > |
| - NUMBER_CANDIDATE_IS_ANY_TAGGED); |
| - if (mode >= NUMBER_CANDIDATE_IS_ANY_TAGGED) { |
| + if (mode == NUMBER_CANDIDATE_IS_ANY_TAGGED) { |
| // Smi check. |
| __ JumpIfSmi(input_reg, &load_smi, Label::kNear); |
| // Heap number map check. |
| __ cmp(FieldOperand(input_reg, HeapObject::kMapOffset), |
| factory()->heap_number_map()); |
| - if (!allow_undefined_as_nan) { |
| + if (!convert_undefined_to_nan) { |
| DeoptimizeIf(not_equal, env); |
| } else { |
| Label heap_number, convert; |
| @@ -5293,10 +5276,6 @@ void LCodeGen::EmitNumberUntagD(Register input_reg, |
| // Convert undefined (and hole) to NaN. |
| __ cmp(input_reg, factory()->undefined_value()); |
| - if (mode == NUMBER_CANDIDATE_IS_ANY_TAGGED_CONVERT_HOLE) { |
| - __ j(equal, &convert, Label::kNear); |
| - __ cmp(input_reg, factory()->the_hole_value()); |
| - } |
| DeoptimizeIf(not_equal, env); |
| __ bind(&convert); |
| @@ -5621,16 +5600,9 @@ void LCodeGen::DoNumberUntagD(LNumberUntagD* instr) { |
| instr->hydrogen()->deoptimize_on_minus_zero(); |
| Register temp_reg = deoptimize_on_minus_zero ? ToRegister(temp) : no_reg; |
| - NumberUntagDMode mode = NUMBER_CANDIDATE_IS_ANY_TAGGED; |
| HValue* value = instr->hydrogen()->value(); |
| - if (value->representation().IsSmi()) { |
| - mode = NUMBER_CANDIDATE_IS_SMI; |
| - } else if (value->IsLoadKeyed()) { |
| - HLoadKeyed* load = HLoadKeyed::cast(value); |
| - if (load->UsesMustHandleHole()) { |
| - mode = NUMBER_CANDIDATE_IS_ANY_TAGGED_CONVERT_HOLE; |
| - } |
| - } |
| + NumberUntagDMode mode = value->representation().IsSmi() |
| + ? NUMBER_CANDIDATE_IS_SMI : NUMBER_CANDIDATE_IS_ANY_TAGGED; |
| if (CpuFeatures::IsSupported(SSE2)) { |
| CpuFeatureScope scope(masm(), SSE2); |
| @@ -5638,7 +5610,7 @@ void LCodeGen::DoNumberUntagD(LNumberUntagD* instr) { |
| EmitNumberUntagD(input_reg, |
| temp_reg, |
| result_reg, |
| - instr->hydrogen()->allow_undefined_as_nan(), |
| + instr->hydrogen()->convert_undefined_to_nan(), |
| deoptimize_on_minus_zero, |
| instr->environment(), |
| mode); |
| @@ -5646,7 +5618,7 @@ void LCodeGen::DoNumberUntagD(LNumberUntagD* instr) { |
| EmitNumberUntagDNoSSE2(input_reg, |
| temp_reg, |
| ToX87Register(instr->result()), |
| - instr->hydrogen()->allow_undefined_as_nan(), |
| + instr->hydrogen()->convert_undefined_to_nan(), |
| deoptimize_on_minus_zero, |
| instr->environment(), |
| mode); |