| Index: src/ia32/macro-assembler-ia32.cc
|
| diff --git a/src/ia32/macro-assembler-ia32.cc b/src/ia32/macro-assembler-ia32.cc
|
| index 0e2264a964eaab24e4ac997455f58464005588b6..40710dc7cb464d44da127a41dde7d3ccc06f62b6 100644
|
| --- a/src/ia32/macro-assembler-ia32.cc
|
| +++ b/src/ia32/macro-assembler-ia32.cc
|
| @@ -581,134 +581,9 @@
|
| }
|
|
|
|
|
| -void MacroAssembler::Cvtsi2ss(XMMRegister dst, const Operand& src) {
|
| - xorps(dst, dst);
|
| - cvtsi2ss(dst, src);
|
| -}
|
| -
|
| -
|
| void MacroAssembler::Cvtsi2sd(XMMRegister dst, const Operand& src) {
|
| xorps(dst, dst);
|
| cvtsi2sd(dst, src);
|
| -}
|
| -
|
| -
|
| -void MacroAssembler::Roundss(XMMRegister dst, XMMRegister src, Register tmp,
|
| - RoundingMode mode) {
|
| - if (CpuFeatures::IsSupported(SSE4_1)) {
|
| - CpuFeatureScope sse_scope(this, SSE4_1);
|
| - roundss(dst, src, mode);
|
| - } else {
|
| - // We have to store the original rounding mode to restore it later.
|
| - {
|
| - sub(esp, Immediate(kPointerSize * 2));
|
| - stmxcsr(Operand(esp, 0));
|
| - mov(tmp, Operand(esp, 0));
|
| - and_(tmp, Immediate(0xffff9fff));
|
| - or_(tmp, Immediate(mode << 13));
|
| - mov(Operand(esp, kPointerSize), tmp);
|
| - ldmxcsr(Operand(esp, kPointerSize));
|
| - }
|
| -
|
| - // Do rounding by conversion to int.
|
| - cvtss2si(tmp, src);
|
| -
|
| - Label out_of_range;
|
| - Label done;
|
| - // Check whether the input is within int32 range.
|
| - cmp(tmp, Immediate(1));
|
| - j(overflow, &out_of_range);
|
| - // If the conversion results in INT_MIN, then the input is outside
|
| - // int range, and due to the limited precision of float32 this means
|
| - // that the input must have been an integer already. We are therefore
|
| - // done already.
|
| - cvtsi2ss(dst, tmp);
|
| - if (!dst.is(src)) {
|
| - jmp(&done);
|
| - }
|
| -
|
| - bind(&out_of_range);
|
| - if (!dst.is(src)) {
|
| - movss(dst, src);
|
| - }
|
| -
|
| - bind(&done);
|
| - // Restore the original rounding mode.
|
| - ldmxcsr(Operand(esp, 0));
|
| - add(esp, Immediate(kPointerSize * 2));
|
| - }
|
| -}
|
| -
|
| -
|
| -void MacroAssembler::Roundsd(XMMRegister dst, XMMRegister src, Register tmp,
|
| - XMMRegister xtmp, RoundingMode mode) {
|
| - if (CpuFeatures::IsSupported(SSE4_1)) {
|
| - CpuFeatureScope sse_scope(this, SSE4_1);
|
| - roundsd(dst, src, mode);
|
| - } else {
|
| - // We have to store the original rounding mode to restore it later.
|
| - {
|
| - sub(esp, Immediate(kPointerSize * 2));
|
| - stmxcsr(Operand(esp, 0));
|
| - mov(tmp, Operand(esp, 0));
|
| - and_(tmp, Immediate(0xffff9fff));
|
| - or_(tmp, Immediate(mode << 13));
|
| - mov(Operand(esp, kPointerSize), tmp);
|
| - ldmxcsr(Operand(esp, kPointerSize));
|
| - }
|
| -
|
| - // Convert the input to int32.
|
| - cvtsd2si(tmp, src);
|
| -
|
| - Label out_of_range;
|
| - Label done;
|
| - // Check whether the input is within int32 range.
|
| - cmp(tmp, Immediate(1));
|
| - j(overflow, &out_of_range);
|
| - // The input is within int32 range. We achieve rounding by converting
|
| - // back to float.
|
| - Cvtsi2sd(dst, tmp);
|
| - jmp(&done);
|
| - bind(&out_of_range);
|
| - if (!dst.is(src)) {
|
| - movsd(dst, src);
|
| - }
|
| - // If the input is outside [-2^52, 2^52], then the result = input.
|
| - int64_t offset = 1;
|
| - offset <<= 52;
|
| - Move(xtmp, static_cast<double>(offset));
|
| -
|
| - ucomisd(xtmp, src);
|
| -
|
| - j(below_equal, &done);
|
| -
|
| - Move(xtmp, static_cast<double>(-offset));
|
| -
|
| - ucomisd(xtmp, src);
|
| - j(above_equal, &done);
|
| -
|
| - // Positive number have to be handled differently than negative numbers.
|
| - xorpd(xtmp, xtmp);
|
| - ucomisd(xtmp, src);
|
| -
|
| - Move(xtmp, static_cast<double>(offset));
|
| -
|
| - Label below_zero;
|
| - j(above, &below_zero);
|
| -
|
| - addsd(dst, xtmp);
|
| - subsd(dst, xtmp);
|
| - jmp(&done);
|
| -
|
| - bind(&below_zero);
|
| - subsd(dst, xtmp);
|
| - addsd(dst, xtmp);
|
| -
|
| - bind(&done);
|
| - // Restore the original rounding mode.
|
| - ldmxcsr(Operand(esp, 0));
|
| - add(esp, Immediate(kPointerSize * 2));
|
| - }
|
| }
|
|
|
|
|
|
|