OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/crankshaft/ppc/lithium-codegen-ppc.h" | 5 #include "src/crankshaft/ppc/lithium-codegen-ppc.h" |
6 | 6 |
7 #include "src/base/bits.h" | 7 #include "src/base/bits.h" |
8 #include "src/code-factory.h" | 8 #include "src/code-factory.h" |
9 #include "src/code-stubs.h" | 9 #include "src/code-stubs.h" |
10 #include "src/crankshaft/hydrogen-osr.h" | 10 #include "src/crankshaft/hydrogen-osr.h" |
(...skipping 3595 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3606 new (zone()) DeferredMathAbsTaggedHeapNumber(this, instr); | 3606 new (zone()) DeferredMathAbsTaggedHeapNumber(this, instr); |
3607 Register input = ToRegister(instr->value()); | 3607 Register input = ToRegister(instr->value()); |
3608 // Smi check. | 3608 // Smi check. |
3609 __ JumpIfNotSmi(input, deferred->entry()); | 3609 __ JumpIfNotSmi(input, deferred->entry()); |
3610 // If smi, handle it directly. | 3610 // If smi, handle it directly. |
3611 EmitMathAbs(instr); | 3611 EmitMathAbs(instr); |
3612 __ bind(deferred->exit()); | 3612 __ bind(deferred->exit()); |
3613 } | 3613 } |
3614 } | 3614 } |
3615 | 3615 |
| 3616 void LCodeGen::DoMathFloorD(LMathFloorD* instr) { |
| 3617 DoubleRegister input_reg = ToDoubleRegister(instr->value()); |
| 3618 DoubleRegister output_reg = ToDoubleRegister(instr->result()); |
| 3619 __ frim(output_reg, input_reg); |
| 3620 } |
3616 | 3621 |
3617 void LCodeGen::DoMathFloor(LMathFloor* instr) { | 3622 void LCodeGen::DoMathFloorI(LMathFloorI* instr) { |
3618 DoubleRegister input = ToDoubleRegister(instr->value()); | 3623 DoubleRegister input = ToDoubleRegister(instr->value()); |
3619 Register result = ToRegister(instr->result()); | 3624 Register result = ToRegister(instr->result()); |
3620 Register input_high = scratch0(); | 3625 Register input_high = scratch0(); |
3621 Register scratch = ip; | 3626 Register scratch = ip; |
3622 Label done, exact; | 3627 Label done, exact; |
3623 | 3628 |
3624 __ TryInt32Floor(result, input, input_high, scratch, double_scratch0(), &done, | 3629 __ TryInt32Floor(result, input, input_high, scratch, double_scratch0(), &done, |
3625 &exact); | 3630 &exact); |
3626 DeoptimizeIf(al, instr, Deoptimizer::kLostPrecisionOrNaN); | 3631 DeoptimizeIf(al, instr, Deoptimizer::kLostPrecisionOrNaN); |
3627 | 3632 |
3628 __ bind(&exact); | 3633 __ bind(&exact); |
3629 if (instr->hydrogen()->CheckFlag(HValue::kBailoutOnMinusZero)) { | 3634 if (instr->hydrogen()->CheckFlag(HValue::kBailoutOnMinusZero)) { |
3630 // Test for -0. | 3635 // Test for -0. |
3631 __ cmpi(result, Operand::Zero()); | 3636 __ cmpi(result, Operand::Zero()); |
3632 __ bne(&done); | 3637 __ bne(&done); |
3633 __ cmpwi(input_high, Operand::Zero()); | 3638 __ cmpwi(input_high, Operand::Zero()); |
3634 DeoptimizeIf(lt, instr, Deoptimizer::kMinusZero); | 3639 DeoptimizeIf(lt, instr, Deoptimizer::kMinusZero); |
3635 } | 3640 } |
3636 __ bind(&done); | 3641 __ bind(&done); |
3637 } | 3642 } |
3638 | 3643 |
| 3644 void LCodeGen::DoMathRoundD(LMathRoundD* instr) { |
| 3645 DoubleRegister input_reg = ToDoubleRegister(instr->value()); |
| 3646 DoubleRegister output_reg = ToDoubleRegister(instr->result()); |
| 3647 DoubleRegister dot_five = double_scratch0(); |
| 3648 Label done; |
3639 | 3649 |
3640 void LCodeGen::DoMathRound(LMathRound* instr) { | 3650 __ frin(output_reg, input_reg); |
| 3651 __ fcmpu(input_reg, kDoubleRegZero); |
| 3652 __ bge(&done); |
| 3653 __ fcmpu(output_reg, input_reg); |
| 3654 __ beq(&done); |
| 3655 |
| 3656 // Negative, non-integer case |
| 3657 __ LoadDoubleLiteral(dot_five, 0.5, r0); |
| 3658 __ fadd(output_reg, input_reg, dot_five); |
| 3659 __ frim(output_reg, output_reg); |
| 3660 // The range [-0.5, -0.0[ yielded +0.0. Force the sign to negative. |
| 3661 __ fabs(output_reg, output_reg); |
| 3662 __ fneg(output_reg, output_reg); |
| 3663 |
| 3664 __ bind(&done); |
| 3665 } |
| 3666 |
| 3667 void LCodeGen::DoMathRoundI(LMathRoundI* instr) { |
3641 DoubleRegister input = ToDoubleRegister(instr->value()); | 3668 DoubleRegister input = ToDoubleRegister(instr->value()); |
3642 Register result = ToRegister(instr->result()); | 3669 Register result = ToRegister(instr->result()); |
3643 DoubleRegister double_scratch1 = ToDoubleRegister(instr->temp()); | 3670 DoubleRegister double_scratch1 = ToDoubleRegister(instr->temp()); |
3644 DoubleRegister input_plus_dot_five = double_scratch1; | 3671 DoubleRegister input_plus_dot_five = double_scratch1; |
3645 Register scratch1 = scratch0(); | 3672 Register scratch1 = scratch0(); |
3646 Register scratch2 = ip; | 3673 Register scratch2 = ip; |
3647 DoubleRegister dot_five = double_scratch0(); | 3674 DoubleRegister dot_five = double_scratch0(); |
3648 Label convert, done; | 3675 Label convert, done; |
3649 | 3676 |
3650 __ LoadDoubleLiteral(dot_five, 0.5, r0); | 3677 __ LoadDoubleLiteral(dot_five, 0.5, r0); |
(...skipping 2099 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5750 __ LoadP(result, | 5777 __ LoadP(result, |
5751 FieldMemOperand(scratch, FixedArray::kHeaderSize - kPointerSize)); | 5778 FieldMemOperand(scratch, FixedArray::kHeaderSize - kPointerSize)); |
5752 __ bind(deferred->exit()); | 5779 __ bind(deferred->exit()); |
5753 __ bind(&done); | 5780 __ bind(&done); |
5754 } | 5781 } |
5755 | 5782 |
5756 #undef __ | 5783 #undef __ |
5757 | 5784 |
5758 } // namespace internal | 5785 } // namespace internal |
5759 } // namespace v8 | 5786 } // namespace v8 |
OLD | NEW |