| Index: src/ia32/codegen-ia32.cc
|
| ===================================================================
|
| --- src/ia32/codegen-ia32.cc (revision 3506)
|
| +++ src/ia32/codegen-ia32.cc (working copy)
|
| @@ -5375,75 +5375,6 @@
|
| }
|
|
|
|
|
| -void CodeGenerator::GenerateFastMathOp(MathOp op, ZoneList<Expression*>* args) {
|
| - JumpTarget done;
|
| - JumpTarget call_runtime;
|
| - ASSERT(args->length() == 1);
|
| -
|
| - // Load number and duplicate it.
|
| - Load(args->at(0));
|
| - frame_->Dup();
|
| -
|
| - // Get the number into an unaliased register and load it onto the
|
| - // floating point stack still leaving one copy on the frame.
|
| - Result number = frame_->Pop();
|
| - 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. This will succeed since we
|
| - // already checked that it is in range.
|
| - switch (op) {
|
| - case SIN:
|
| - __ fsin();
|
| - break;
|
| - case COS:
|
| - __ fcos();
|
| - break;
|
| - }
|
| -
|
| - // Allocate heap number for result if possible.
|
| - Result scratch1 = allocator()->Allocate();
|
| - Result scratch2 = allocator()->Allocate();
|
| - Result heap_number = allocator()->Allocate();
|
| - __ AllocateHeapNumber(heap_number.reg(),
|
| - scratch1.reg(),
|
| - scratch2.reg(),
|
| - call_runtime.entry_label());
|
| - scratch1.Unuse();
|
| - scratch2.Unuse();
|
| -
|
| - // Store the result in the allocated heap number.
|
| - __ fstp_d(FieldOperand(heap_number.reg(), HeapNumber::kValueOffset));
|
| - // Replace the extra copy of the argument with the result.
|
| - frame_->SetElementAt(0, &heap_number);
|
| - done.Jump();
|
| -
|
| - call_runtime.Bind();
|
| - // Free ST(0) which was not popped before calling into the runtime.
|
| - __ ffree(0);
|
| - Result answer;
|
| - switch (op) {
|
| - case SIN:
|
| - answer = frame_->CallRuntime(Runtime::kMath_sin, 1);
|
| - break;
|
| - case COS:
|
| - answer = frame_->CallRuntime(Runtime::kMath_cos, 1);
|
| - break;
|
| - }
|
| - frame_->Push(&answer);
|
| - done.Bind();
|
| -}
|
| -
|
| -
|
| void CodeGenerator::GenerateStringAdd(ZoneList<Expression*>* args) {
|
| ASSERT_EQ(2, args->length());
|
|
|
| @@ -7465,8 +7396,9 @@
|
| if (use_sse3) {
|
| CpuFeatures::Scope scope(SSE3);
|
| // Check whether the exponent is too big for a 64 bit signed integer.
|
| - __ cmp(Operand(scratch2),
|
| - Immediate(CodeGenerator::kTwoToThePowerOf63Exponent));
|
| + static const uint32_t kTooBigExponent =
|
| + (HeapNumber::kExponentBias + 63) << HeapNumber::kExponentShift;
|
| + __ cmp(Operand(scratch2), Immediate(kTooBigExponent));
|
| __ j(greater_equal, conversion_failure);
|
| // Load x87 register with heap number.
|
| __ fld_d(FieldOperand(source, HeapNumber::kValueOffset));
|
|
|