Index: src/ia32/code-stubs-ia32.cc |
diff --git a/src/ia32/code-stubs-ia32.cc b/src/ia32/code-stubs-ia32.cc |
index 03c43611feadef2c2380ce9b40a9ef3a8fee132c..0801881ff0cdb93a9ece6ed178325b48f2d26016 100644 |
--- a/src/ia32/code-stubs-ia32.cc |
+++ b/src/ia32/code-stubs-ia32.cc |
@@ -629,15 +629,7 @@ void DoubleToIStub::Generate(MacroAssembler* masm) { |
__ shrd(result_reg, scratch1); |
__ shr_cl(result_reg); |
__ test(ecx, Immediate(32)); |
- if (CpuFeatures::IsSupported(CMOV)) { |
- CpuFeatureScope use_cmov(masm, CMOV); |
- __ cmov(not_equal, scratch1, result_reg); |
- } else { |
- Label skip_mov; |
- __ j(equal, &skip_mov, Label::kNear); |
- __ mov(scratch1, result_reg); |
- __ bind(&skip_mov); |
- } |
+ __ cmov(not_equal, scratch1, result_reg); |
} |
// If the double was negative, negate the integer result. |
@@ -649,15 +641,7 @@ void DoubleToIStub::Generate(MacroAssembler* masm) { |
} else { |
__ cmp(exponent_operand, Immediate(0)); |
} |
- if (CpuFeatures::IsSupported(CMOV)) { |
- CpuFeatureScope use_cmov(masm, CMOV); |
__ cmov(greater, result_reg, scratch1); |
- } else { |
- Label skip_mov; |
- __ j(less_equal, &skip_mov, Label::kNear); |
- __ mov(result_reg, scratch1); |
- __ bind(&skip_mov); |
- } |
// Restore registers |
__ bind(&done); |
@@ -2068,32 +2052,12 @@ void ICCompareStub::GenerateGeneric(MacroAssembler* masm) { |
// Don't base result on EFLAGS when a NaN is involved. |
__ j(parity_even, &unordered, Label::kNear); |
- if (CpuFeatures::IsSupported(CMOV)) { |
- CpuFeatureScope use_cmov(masm, CMOV); |
- // Return a result of -1, 0, or 1, based on EFLAGS. |
- __ mov(eax, 0); // equal |
- __ mov(ecx, Immediate(Smi::FromInt(1))); |
- __ cmov(above, eax, ecx); |
- __ mov(ecx, Immediate(Smi::FromInt(-1))); |
- __ cmov(below, eax, ecx); |
- __ ret(0); |
- } else { |
- Label below_label, above_label; |
- // Return a result of -1, 0, or 1, based on EFLAGS. |
- __ j(below, &below_label, Label::kNear); |
- __ j(above, &above_label, Label::kNear); |
- |
- __ Move(eax, Immediate(0)); |
- __ ret(0); |
- |
- __ bind(&below_label); |
- __ mov(eax, Immediate(Smi::FromInt(-1))); |
- __ ret(0); |
- |
- __ bind(&above_label); |
- __ mov(eax, Immediate(Smi::FromInt(1))); |
- __ ret(0); |
- } |
+ __ mov(eax, 0); // equal |
+ __ mov(ecx, Immediate(Smi::FromInt(1))); |
+ __ cmov(above, eax, ecx); |
+ __ mov(ecx, Immediate(Smi::FromInt(-1))); |
+ __ cmov(below, eax, ecx); |
+ __ ret(0); |
// If one of the numbers was NaN, then the result is always false. |
// The cc is never not-equal. |
@@ -3776,63 +3740,46 @@ void ICCompareStub::GenerateNumbers(MacroAssembler* masm) { |
__ JumpIfNotSmi(eax, &miss); |
} |
- // Inlining the double comparison and falling back to the general compare |
- // stub if NaN is involved or SSE2 or CMOV is unsupported. |
- if (CpuFeatures::IsSupported(CMOV)) { |
- CpuFeatureScope scope2(masm, CMOV); |
- |
- // Load left and right operand. |
- Label done, left, left_smi, right_smi; |
- __ JumpIfSmi(eax, &right_smi, Label::kNear); |
- __ cmp(FieldOperand(eax, HeapObject::kMapOffset), |
- isolate()->factory()->heap_number_map()); |
- __ j(not_equal, &maybe_undefined1, Label::kNear); |
- __ movsd(xmm1, FieldOperand(eax, HeapNumber::kValueOffset)); |
- __ jmp(&left, Label::kNear); |
- __ bind(&right_smi); |
- __ mov(ecx, eax); // Can't clobber eax because we can still jump away. |
- __ SmiUntag(ecx); |
- __ Cvtsi2sd(xmm1, ecx); |
- |
- __ bind(&left); |
- __ JumpIfSmi(edx, &left_smi, Label::kNear); |
- __ cmp(FieldOperand(edx, HeapObject::kMapOffset), |
- isolate()->factory()->heap_number_map()); |
- __ j(not_equal, &maybe_undefined2, Label::kNear); |
- __ movsd(xmm0, FieldOperand(edx, HeapNumber::kValueOffset)); |
- __ jmp(&done); |
- __ bind(&left_smi); |
- __ mov(ecx, edx); // Can't clobber edx because we can still jump away. |
- __ SmiUntag(ecx); |
- __ Cvtsi2sd(xmm0, ecx); |
+ // Load left and right operand. |
+ Label done, left, left_smi, right_smi; |
+ __ JumpIfSmi(eax, &right_smi, Label::kNear); |
+ __ cmp(FieldOperand(eax, HeapObject::kMapOffset), |
+ isolate()->factory()->heap_number_map()); |
+ __ j(not_equal, &maybe_undefined1, Label::kNear); |
+ __ movsd(xmm1, FieldOperand(eax, HeapNumber::kValueOffset)); |
+ __ jmp(&left, Label::kNear); |
+ __ bind(&right_smi); |
+ __ mov(ecx, eax); // Can't clobber eax because we can still jump away. |
+ __ SmiUntag(ecx); |
+ __ Cvtsi2sd(xmm1, ecx); |
- __ bind(&done); |
- // Compare operands. |
- __ ucomisd(xmm0, xmm1); |
- |
- // Don't base result on EFLAGS when a NaN is involved. |
- __ j(parity_even, &unordered, Label::kNear); |
- |
- // Return a result of -1, 0, or 1, based on EFLAGS. |
- // Performing mov, because xor would destroy the flag register. |
- __ mov(eax, 0); // equal |
- __ mov(ecx, Immediate(Smi::FromInt(1))); |
- __ cmov(above, eax, ecx); |
- __ mov(ecx, Immediate(Smi::FromInt(-1))); |
- __ cmov(below, eax, ecx); |
- __ ret(0); |
- } else { |
- __ mov(ecx, edx); |
- __ and_(ecx, eax); |
- __ JumpIfSmi(ecx, &generic_stub, Label::kNear); |
+ __ bind(&left); |
+ __ JumpIfSmi(edx, &left_smi, Label::kNear); |
+ __ cmp(FieldOperand(edx, HeapObject::kMapOffset), |
+ isolate()->factory()->heap_number_map()); |
+ __ j(not_equal, &maybe_undefined2, Label::kNear); |
+ __ movsd(xmm0, FieldOperand(edx, HeapNumber::kValueOffset)); |
+ __ jmp(&done); |
+ __ bind(&left_smi); |
+ __ mov(ecx, edx); // Can't clobber edx because we can still jump away. |
+ __ SmiUntag(ecx); |
+ __ Cvtsi2sd(xmm0, ecx); |
- __ cmp(FieldOperand(eax, HeapObject::kMapOffset), |
- isolate()->factory()->heap_number_map()); |
- __ j(not_equal, &maybe_undefined1, Label::kNear); |
- __ cmp(FieldOperand(edx, HeapObject::kMapOffset), |
- isolate()->factory()->heap_number_map()); |
- __ j(not_equal, &maybe_undefined2, Label::kNear); |
- } |
+ __ bind(&done); |
+ // Compare operands. |
+ __ ucomisd(xmm0, xmm1); |
+ |
+ // Don't base result on EFLAGS when a NaN is involved. |
+ __ j(parity_even, &unordered, Label::kNear); |
+ |
+ // Return a result of -1, 0, or 1, based on EFLAGS. |
+ // Performing mov, because xor would destroy the flag register. |
+ __ mov(eax, 0); // equal |
+ __ mov(ecx, Immediate(Smi::FromInt(1))); |
+ __ cmov(above, eax, ecx); |
+ __ mov(ecx, Immediate(Smi::FromInt(-1))); |
+ __ cmov(below, eax, ecx); |
+ __ ret(0); |
__ bind(&unordered); |
__ bind(&generic_stub); |