Index: src/ia32/codegen-ia32.cc |
=================================================================== |
--- src/ia32/codegen-ia32.cc (revision 3504) |
+++ src/ia32/codegen-ia32.cc (working copy) |
@@ -5390,9 +5390,17 @@ |
number.ToRegister(); |
frame_->Spill(number.reg()); |
FloatingPointHelper::LoadFloatOperand(masm_, number.reg()); |
+ |
+ // Check whether the exponent is so big that performing a sine or |
+ // cosine operation could result in inaccurate results or an |
+ // exception. In that case call the runtime routine. |
+ __ and_(number.reg(), HeapNumber::kExponentMask); |
+ __ cmp(Operand(number.reg()), Immediate(kTwoToThePowerOf63Exponent)); |
+ call_runtime.Branch(greater_equal, not_taken); |
number.Unuse(); |
- // Perform the operation on the number. |
+ // Perform the operation on the number. This will succeed since we |
+ // already checked that it is in range. |
switch (op) { |
case SIN: |
__ fsin(); |
@@ -5402,14 +5410,6 @@ |
break; |
} |
- // Go slow case if argument to operation is out of range. |
- Result eax_reg = allocator_->Allocate(eax); |
- ASSERT(eax_reg.is_valid()); |
- __ fnstsw_ax(); |
- __ sahf(); |
- eax_reg.Unuse(); |
- call_runtime.Branch(parity_even, not_taken); |
- |
// Allocate heap number for result if possible. |
Result scratch1 = allocator()->Allocate(); |
Result scratch2 = allocator()->Allocate(); |
@@ -7465,9 +7465,8 @@ |
if (use_sse3) { |
CpuFeatures::Scope scope(SSE3); |
// Check whether the exponent is too big for a 64 bit signed integer. |
- const uint32_t too_big_exponent = |
- (HeapNumber::kExponentBias + 63) << HeapNumber::kExponentShift; |
- __ cmp(Operand(scratch2), Immediate(too_big_exponent)); |
+ __ cmp(Operand(scratch2), |
+ Immediate(CodeGenerator::kTwoToThePowerOf63Exponent)); |
__ j(greater_equal, conversion_failure); |
// Load x87 register with heap number. |
__ fld_d(FieldOperand(source, HeapNumber::kValueOffset)); |