| Index: src/ia32/macro-assembler-ia32.cc
|
| diff --git a/src/ia32/macro-assembler-ia32.cc b/src/ia32/macro-assembler-ia32.cc
|
| index f27927de96f3f1cca25e841129a27439d03f4ff8..6c97226e3feeb25e9d4a71b379f467d853f46b2f 100644
|
| --- a/src/ia32/macro-assembler-ia32.cc
|
| +++ b/src/ia32/macro-assembler-ia32.cc
|
| @@ -244,42 +244,6 @@ void MacroAssembler::TruncateDoubleToI(Register result_reg,
|
| }
|
|
|
|
|
| -void MacroAssembler::TruncateX87TOSToI(Register result_reg) {
|
| - sub(esp, Immediate(kDoubleSize));
|
| - fst_d(MemOperand(esp, 0));
|
| - SlowTruncateToI(result_reg, esp, 0);
|
| - add(esp, Immediate(kDoubleSize));
|
| -}
|
| -
|
| -
|
| -void MacroAssembler::X87TOSToI(Register result_reg,
|
| - MinusZeroMode minus_zero_mode,
|
| - Label* conversion_failed,
|
| - Label::Distance dst) {
|
| - Label done;
|
| - sub(esp, Immediate(kPointerSize));
|
| - fld(0);
|
| - fist_s(MemOperand(esp, 0));
|
| - fild_s(MemOperand(esp, 0));
|
| - pop(result_reg);
|
| - FCmp();
|
| - j(not_equal, conversion_failed, dst);
|
| - j(parity_even, conversion_failed, dst);
|
| - if (minus_zero_mode == FAIL_ON_MINUS_ZERO) {
|
| - test(result_reg, Operand(result_reg));
|
| - j(not_zero, &done, Label::kNear);
|
| - // To check for minus zero, we load the value again as float, and check
|
| - // if that is still 0.
|
| - sub(esp, Immediate(kPointerSize));
|
| - fst_s(MemOperand(esp, 0));
|
| - pop(result_reg);
|
| - test(result_reg, Operand(result_reg));
|
| - j(not_zero, conversion_failed, dst);
|
| - }
|
| - bind(&done);
|
| -}
|
| -
|
| -
|
| void MacroAssembler::DoubleToI(Register result_reg,
|
| XMMRegister input_reg,
|
| XMMRegister scratch,
|
| @@ -347,8 +311,7 @@ void MacroAssembler::TruncateHeapNumberToI(Register result_reg,
|
| fstp(0);
|
| SlowTruncateToI(result_reg, input_reg);
|
| }
|
| - } else if (CpuFeatures::IsSupported(SSE2)) {
|
| - CpuFeatureScope scope(this, SSE2);
|
| + } else {
|
| movsd(xmm0, FieldOperand(input_reg, HeapNumber::kValueOffset));
|
| cvttsd2si(result_reg, Operand(xmm0));
|
| cmp(result_reg, 0x1);
|
| @@ -372,8 +335,6 @@ void MacroAssembler::TruncateHeapNumberToI(Register result_reg,
|
| } else {
|
| SlowTruncateToI(result_reg, input_reg);
|
| }
|
| - } else {
|
| - SlowTruncateToI(result_reg, input_reg);
|
| }
|
| bind(&done);
|
| }
|
| @@ -391,60 +352,23 @@ void MacroAssembler::TaggedToI(Register result_reg,
|
| isolate()->factory()->heap_number_map());
|
| j(not_equal, lost_precision, Label::kNear);
|
|
|
| - if (CpuFeatures::IsSafeForSnapshot(isolate(), SSE2)) {
|
| - ASSERT(!temp.is(no_xmm_reg));
|
| - CpuFeatureScope scope(this, SSE2);
|
| + ASSERT(!temp.is(no_xmm_reg));
|
|
|
| - movsd(xmm0, FieldOperand(input_reg, HeapNumber::kValueOffset));
|
| - cvttsd2si(result_reg, Operand(xmm0));
|
| - Cvtsi2sd(temp, Operand(result_reg));
|
| - ucomisd(xmm0, temp);
|
| - RecordComment("Deferred TaggedToI: lost precision");
|
| - j(not_equal, lost_precision, Label::kNear);
|
| - RecordComment("Deferred TaggedToI: NaN");
|
| - j(parity_even, lost_precision, Label::kNear);
|
| - if (minus_zero_mode == FAIL_ON_MINUS_ZERO) {
|
| - test(result_reg, Operand(result_reg));
|
| - j(not_zero, &done, Label::kNear);
|
| - movmskpd(result_reg, xmm0);
|
| - and_(result_reg, 1);
|
| - RecordComment("Deferred TaggedToI: minus zero");
|
| - j(not_zero, lost_precision, Label::kNear);
|
| - }
|
| - } else {
|
| - // TODO(olivf) Converting a number on the fpu is actually quite slow. We
|
| - // should first try a fast conversion and then bailout to this slow case.
|
| - Label lost_precision_pop, zero_check;
|
| - Label* lost_precision_int = (minus_zero_mode == FAIL_ON_MINUS_ZERO)
|
| - ? &lost_precision_pop : lost_precision;
|
| - sub(esp, Immediate(kPointerSize));
|
| - fld_d(FieldOperand(input_reg, HeapNumber::kValueOffset));
|
| - if (minus_zero_mode == FAIL_ON_MINUS_ZERO) fld(0);
|
| - fist_s(MemOperand(esp, 0));
|
| - fild_s(MemOperand(esp, 0));
|
| - FCmp();
|
| - pop(result_reg);
|
| - j(not_equal, lost_precision_int, Label::kNear);
|
| - j(parity_even, lost_precision_int, Label::kNear); // NaN.
|
| - if (minus_zero_mode == FAIL_ON_MINUS_ZERO) {
|
| - test(result_reg, Operand(result_reg));
|
| - j(zero, &zero_check, Label::kNear);
|
| - fstp(0);
|
| - jmp(&done, Label::kNear);
|
| - bind(&zero_check);
|
| - // To check for minus zero, we load the value again as float, and check
|
| - // if that is still 0.
|
| - sub(esp, Immediate(kPointerSize));
|
| - fstp_s(Operand(esp, 0));
|
| - pop(result_reg);
|
| - test(result_reg, Operand(result_reg));
|
| - j(zero, &done, Label::kNear);
|
| - jmp(lost_precision, Label::kNear);
|
| -
|
| - bind(&lost_precision_pop);
|
| - fstp(0);
|
| - jmp(lost_precision, Label::kNear);
|
| - }
|
| + movsd(xmm0, FieldOperand(input_reg, HeapNumber::kValueOffset));
|
| + cvttsd2si(result_reg, Operand(xmm0));
|
| + Cvtsi2sd(temp, Operand(result_reg));
|
| + ucomisd(xmm0, temp);
|
| + RecordComment("Deferred TaggedToI: lost precision");
|
| + j(not_equal, lost_precision, Label::kNear);
|
| + RecordComment("Deferred TaggedToI: NaN");
|
| + j(parity_even, lost_precision, Label::kNear);
|
| + if (minus_zero_mode == FAIL_ON_MINUS_ZERO) {
|
| + test(result_reg, Operand(result_reg));
|
| + j(not_zero, &done, Label::kNear);
|
| + movmskpd(result_reg, xmm0);
|
| + and_(result_reg, 1);
|
| + RecordComment("Deferred TaggedToI: minus zero");
|
| + j(not_zero, lost_precision, Label::kNear);
|
| }
|
| bind(&done);
|
| }
|
| @@ -465,21 +389,6 @@ void MacroAssembler::LoadUint32(XMMRegister dst,
|
| }
|
|
|
|
|
| -void MacroAssembler::LoadUint32NoSSE2(Register src) {
|
| - Label done;
|
| - push(src);
|
| - fild_s(Operand(esp, 0));
|
| - cmp(src, Immediate(0));
|
| - j(not_sign, &done, Label::kNear);
|
| - ExternalReference uint32_bias =
|
| - ExternalReference::address_of_uint32_bias();
|
| - fld_d(Operand::StaticVariable(uint32_bias));
|
| - faddp(1);
|
| - bind(&done);
|
| - add(esp, Immediate(kPointerSize));
|
| -}
|
| -
|
| -
|
| void MacroAssembler::RecordWriteArray(Register object,
|
| Register value,
|
| Register index,
|
| @@ -794,7 +703,6 @@ void MacroAssembler::StoreNumberToDoubleElements(
|
| Register scratch1,
|
| XMMRegister scratch2,
|
| Label* fail,
|
| - bool specialize_for_processor,
|
| int elements_offset) {
|
| Label smi_value, done, maybe_nan, not_nan, is_nan, have_double_value;
|
| JumpIfSmi(maybe_number, &smi_value, Label::kNear);
|
| @@ -813,19 +721,11 @@ void MacroAssembler::StoreNumberToDoubleElements(
|
| bind(¬_nan);
|
| ExternalReference canonical_nan_reference =
|
| ExternalReference::address_of_canonical_non_hole_nan();
|
| - if (CpuFeatures::IsSupported(SSE2) && specialize_for_processor) {
|
| - CpuFeatureScope use_sse2(this, SSE2);
|
| - movsd(scratch2, FieldOperand(maybe_number, HeapNumber::kValueOffset));
|
| - bind(&have_double_value);
|
| - movsd(FieldOperand(elements, key, times_4,
|
| - FixedDoubleArray::kHeaderSize - elements_offset),
|
| - scratch2);
|
| - } else {
|
| - fld_d(FieldOperand(maybe_number, HeapNumber::kValueOffset));
|
| - bind(&have_double_value);
|
| - fstp_d(FieldOperand(elements, key, times_4,
|
| - FixedDoubleArray::kHeaderSize - elements_offset));
|
| - }
|
| + movsd(scratch2, FieldOperand(maybe_number, HeapNumber::kValueOffset));
|
| + bind(&have_double_value);
|
| + movsd(FieldOperand(elements, key, times_4,
|
| + FixedDoubleArray::kHeaderSize - elements_offset),
|
| + scratch2);
|
| jmp(&done);
|
|
|
| bind(&maybe_nan);
|
| @@ -835,12 +735,7 @@ void MacroAssembler::StoreNumberToDoubleElements(
|
| cmp(FieldOperand(maybe_number, HeapNumber::kValueOffset), Immediate(0));
|
| j(zero, ¬_nan);
|
| bind(&is_nan);
|
| - if (CpuFeatures::IsSupported(SSE2) && specialize_for_processor) {
|
| - CpuFeatureScope use_sse2(this, SSE2);
|
| - movsd(scratch2, Operand::StaticVariable(canonical_nan_reference));
|
| - } else {
|
| - fld_d(Operand::StaticVariable(canonical_nan_reference));
|
| - }
|
| + movsd(scratch2, Operand::StaticVariable(canonical_nan_reference));
|
| jmp(&have_double_value, Label::kNear);
|
|
|
| bind(&smi_value);
|
| @@ -848,19 +743,10 @@ void MacroAssembler::StoreNumberToDoubleElements(
|
| // Preserve original value.
|
| mov(scratch1, maybe_number);
|
| SmiUntag(scratch1);
|
| - if (CpuFeatures::IsSupported(SSE2) && specialize_for_processor) {
|
| - CpuFeatureScope fscope(this, SSE2);
|
| - Cvtsi2sd(scratch2, scratch1);
|
| - movsd(FieldOperand(elements, key, times_4,
|
| - FixedDoubleArray::kHeaderSize - elements_offset),
|
| - scratch2);
|
| - } else {
|
| - push(scratch1);
|
| - fild_s(Operand(esp, 0));
|
| - pop(scratch1);
|
| - fstp_d(FieldOperand(elements, key, times_4,
|
| - FixedDoubleArray::kHeaderSize - elements_offset));
|
| - }
|
| + Cvtsi2sd(scratch2, scratch1);
|
| + movsd(FieldOperand(elements, key, times_4,
|
| + FixedDoubleArray::kHeaderSize - elements_offset),
|
| + scratch2);
|
| bind(&done);
|
| }
|
|
|
| @@ -1093,7 +979,6 @@ void MacroAssembler::EnterExitFramePrologue() {
|
| void MacroAssembler::EnterExitFrameEpilogue(int argc, bool save_doubles) {
|
| // Optionally save all XMM registers.
|
| if (save_doubles) {
|
| - CpuFeatureScope scope(this, SSE2);
|
| int space = XMMRegister::kNumRegisters * kDoubleSize + argc * kPointerSize;
|
| sub(esp, Immediate(space));
|
| const int offset = -2 * kPointerSize;
|
| @@ -1139,7 +1024,6 @@ void MacroAssembler::EnterApiExitFrame(int argc) {
|
| void MacroAssembler::LeaveExitFrame(bool save_doubles) {
|
| // Optionally restore all XMM registers.
|
| if (save_doubles) {
|
| - CpuFeatureScope scope(this, SSE2);
|
| const int offset = -2 * kPointerSize;
|
| for (int i = 0; i < XMMRegister::kNumRegisters; i++) {
|
| XMMRegister reg = XMMRegister::from_code(i);
|
| @@ -2212,10 +2096,7 @@ void MacroAssembler::CallRuntime(const Runtime::Function* f,
|
| // smarter.
|
| Move(eax, Immediate(num_arguments));
|
| mov(ebx, Immediate(ExternalReference(f, isolate())));
|
| - CEntryStub ces(isolate(),
|
| - 1,
|
| - CpuFeatures::IsSupported(SSE2) ? save_doubles
|
| - : kDontSaveFPRegs);
|
| + CEntryStub ces(isolate(), 1, save_doubles);
|
| CallStub(&ces);
|
| }
|
|
|
| @@ -2764,27 +2645,6 @@ void MacroAssembler::Ret(int bytes_dropped, Register scratch) {
|
| }
|
|
|
|
|
| -void MacroAssembler::VerifyX87StackDepth(uint32_t depth) {
|
| - // Make sure the floating point stack is either empty or has depth items.
|
| - ASSERT(depth <= 7);
|
| - // This is very expensive.
|
| - ASSERT(FLAG_debug_code && FLAG_enable_slow_asserts);
|
| -
|
| - // The top-of-stack (tos) is 7 if there is one item pushed.
|
| - int tos = (8 - depth) % 8;
|
| - const int kTopMask = 0x3800;
|
| - push(eax);
|
| - fwait();
|
| - fnstsw_ax();
|
| - and_(eax, kTopMask);
|
| - shr(eax, 11);
|
| - cmp(eax, Immediate(tos));
|
| - Check(equal, kUnexpectedFPUStackDepthAfterInstruction);
|
| - fnclex();
|
| - pop(eax);
|
| -}
|
| -
|
| -
|
| void MacroAssembler::Drop(int stack_elements) {
|
| if (stack_elements > 0) {
|
| add(esp, Immediate(stack_elements * kPointerSize));
|
| @@ -2815,7 +2675,6 @@ void MacroAssembler::Move(const Operand& dst, const Immediate& x) {
|
|
|
| void MacroAssembler::Move(XMMRegister dst, double val) {
|
| // TODO(titzer): recognize double constants with ExternalReferences.
|
| - CpuFeatureScope scope(this, SSE2);
|
| uint64_t int_val = BitCast<uint64_t, double>(val);
|
| if (int_val == 0) {
|
| xorps(dst, dst);
|
| @@ -3075,15 +2934,8 @@ void MacroAssembler::LookupNumberStringCache(Register object,
|
| times_twice_pointer_size,
|
| FixedArray::kHeaderSize));
|
| JumpIfSmi(probe, not_found);
|
| - if (CpuFeatures::IsSupported(SSE2)) {
|
| - CpuFeatureScope fscope(this, SSE2);
|
| - movsd(xmm0, FieldOperand(object, HeapNumber::kValueOffset));
|
| - ucomisd(xmm0, FieldOperand(probe, HeapNumber::kValueOffset));
|
| - } else {
|
| - fld_d(FieldOperand(object, HeapNumber::kValueOffset));
|
| - fld_d(FieldOperand(probe, HeapNumber::kValueOffset));
|
| - FCmp();
|
| - }
|
| + movsd(xmm0, FieldOperand(object, HeapNumber::kValueOffset));
|
| + ucomisd(xmm0, FieldOperand(probe, HeapNumber::kValueOffset));
|
| j(parity_even, not_found); // Bail out if NaN is involved.
|
| j(not_equal, not_found); // The cache did not contain this value.
|
| jmp(&load_result_from_cache, Label::kNear);
|
|
|