| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. Use of this | 1 // Copyright 2014 the V8 project authors. All rights reserved. Use of this |
| 2 // source code is governed by a BSD-style license that can be found in the | 2 // source code is governed by a BSD-style license that can be found in the |
| 3 // LICENSE file. | 3 // LICENSE file. |
| 4 | 4 |
| 5 // TODO(jochen): Remove this after the setting is turned on globally. | 5 // TODO(jochen): Remove this after the setting is turned on globally. |
| 6 #define V8_IMMINENT_DEPRECATION_WARNINGS | 6 #define V8_IMMINENT_DEPRECATION_WARNINGS |
| 7 | 7 |
| 8 #include <cmath> | 8 #include <cmath> |
| 9 #include <functional> | 9 #include <functional> |
| 10 #include <limits> | 10 #include <limits> |
| (...skipping 16 matching lines...) Expand all Loading... |
| 27 | 27 |
| 28 | 28 |
| 29 TEST(RunInt32Add) { | 29 TEST(RunInt32Add) { |
| 30 RawMachineAssemblerTester<int32_t> m; | 30 RawMachineAssemblerTester<int32_t> m; |
| 31 Node* add = m.Int32Add(m.Int32Constant(0), m.Int32Constant(1)); | 31 Node* add = m.Int32Add(m.Int32Constant(0), m.Int32Constant(1)); |
| 32 m.Return(add); | 32 m.Return(add); |
| 33 CHECK_EQ(1, m.Call()); | 33 CHECK_EQ(1, m.Call()); |
| 34 } | 34 } |
| 35 | 35 |
| 36 | 36 |
| 37 void TestWord32Ctz(int32_t value, int32_t expected) { | 37 TEST(RunWord32Ctz) { |
| 38 RawMachineAssemblerTester<int32_t> m; | 38 BufferedRawMachineAssemblerTester<int32_t> m(kMachUint32); |
| 39 if (m.machine()->Word32Ctz().IsSupported()) { | 39 if (!m.machine()->Word32Ctz().IsSupported()) { |
| 40 Node* ctz = | 40 // We can only test the operator if it exists on the testing platform. |
| 41 m.AddNode(m.machine()->Word32Ctz().op(), m.Int32Constant(value)); | 41 return; |
| 42 m.Return(ctz); | |
| 43 CHECK_EQ(expected, m.Call()); | |
| 44 } | 42 } |
| 43 m.Return(m.AddNode(m.machine()->Word32Ctz().op(), m.Parameter(0))); |
| 44 |
| 45 CHECK_EQ(32, m.Call(uint32_t(0x00000000))); |
| 46 CHECK_EQ(31, m.Call(uint32_t(0x80000000))); |
| 47 CHECK_EQ(30, m.Call(uint32_t(0x40000000))); |
| 48 CHECK_EQ(29, m.Call(uint32_t(0x20000000))); |
| 49 CHECK_EQ(28, m.Call(uint32_t(0x10000000))); |
| 50 CHECK_EQ(27, m.Call(uint32_t(0xa8000000))); |
| 51 CHECK_EQ(26, m.Call(uint32_t(0xf4000000))); |
| 52 CHECK_EQ(25, m.Call(uint32_t(0x62000000))); |
| 53 CHECK_EQ(24, m.Call(uint32_t(0x91000000))); |
| 54 CHECK_EQ(23, m.Call(uint32_t(0xcd800000))); |
| 55 CHECK_EQ(22, m.Call(uint32_t(0x09400000))); |
| 56 CHECK_EQ(21, m.Call(uint32_t(0xaf200000))); |
| 57 CHECK_EQ(20, m.Call(uint32_t(0xac100000))); |
| 58 CHECK_EQ(19, m.Call(uint32_t(0xe0b80000))); |
| 59 CHECK_EQ(18, m.Call(uint32_t(0x9ce40000))); |
| 60 CHECK_EQ(17, m.Call(uint32_t(0xc7920000))); |
| 61 CHECK_EQ(16, m.Call(uint32_t(0xb8f10000))); |
| 62 CHECK_EQ(15, m.Call(uint32_t(0x3b9f8000))); |
| 63 CHECK_EQ(14, m.Call(uint32_t(0xdb4c4000))); |
| 64 CHECK_EQ(13, m.Call(uint32_t(0xe9a32000))); |
| 65 CHECK_EQ(12, m.Call(uint32_t(0xfca61000))); |
| 66 CHECK_EQ(11, m.Call(uint32_t(0x6c8a7800))); |
| 67 CHECK_EQ(10, m.Call(uint32_t(0x8ce5a400))); |
| 68 CHECK_EQ(9, m.Call(uint32_t(0xcb7d0200))); |
| 69 CHECK_EQ(8, m.Call(uint32_t(0xcb4dc100))); |
| 70 CHECK_EQ(7, m.Call(uint32_t(0xdfbec580))); |
| 71 CHECK_EQ(6, m.Call(uint32_t(0x27a9db40))); |
| 72 CHECK_EQ(5, m.Call(uint32_t(0xde3bcb20))); |
| 73 CHECK_EQ(4, m.Call(uint32_t(0xd7e8a610))); |
| 74 CHECK_EQ(3, m.Call(uint32_t(0x9afdbc88))); |
| 75 CHECK_EQ(2, m.Call(uint32_t(0x9afdbc84))); |
| 76 CHECK_EQ(1, m.Call(uint32_t(0x9afdbc82))); |
| 77 CHECK_EQ(0, m.Call(uint32_t(0x9afdbc81))); |
| 45 } | 78 } |
| 46 | 79 |
| 47 | 80 |
| 48 TEST(RunInt32Ctz) { | 81 TEST(RunWord32Clz) { |
| 49 TestWord32Ctz(0x00000000, 32); | 82 BufferedRawMachineAssemblerTester<int32_t> m(kMachUint32); |
| 50 TestWord32Ctz(0x80000000, 31); | 83 m.Return(m.Word32Clz(m.Parameter(0))); |
| 51 TestWord32Ctz(0x40000000, 30); | 84 |
| 52 TestWord32Ctz(0x20000000, 29); | 85 CHECK_EQ(0, m.Call(uint32_t(0x80001000))); |
| 53 TestWord32Ctz(0x10000000, 28); | 86 CHECK_EQ(1, m.Call(uint32_t(0x40000500))); |
| 54 TestWord32Ctz(0xa8000000, 27); | 87 CHECK_EQ(2, m.Call(uint32_t(0x20000300))); |
| 55 TestWord32Ctz(0xf4000000, 26); | 88 CHECK_EQ(3, m.Call(uint32_t(0x10000003))); |
| 56 TestWord32Ctz(0x62000000, 25); | 89 CHECK_EQ(4, m.Call(uint32_t(0x08050000))); |
| 57 TestWord32Ctz(0x91000000, 24); | 90 CHECK_EQ(5, m.Call(uint32_t(0x04006000))); |
| 58 TestWord32Ctz(0xcd800000, 23); | 91 CHECK_EQ(6, m.Call(uint32_t(0x02000000))); |
| 59 TestWord32Ctz(0x09400000, 22); | 92 CHECK_EQ(7, m.Call(uint32_t(0x010000a0))); |
| 60 TestWord32Ctz(0xaf200000, 21); | 93 CHECK_EQ(8, m.Call(uint32_t(0x00800c00))); |
| 61 TestWord32Ctz(0xac100000, 20); | 94 CHECK_EQ(9, m.Call(uint32_t(0x00400000))); |
| 62 TestWord32Ctz(0xe0b80000, 19); | 95 CHECK_EQ(10, m.Call(uint32_t(0x0020000d))); |
| 63 TestWord32Ctz(0x9ce40000, 18); | 96 CHECK_EQ(11, m.Call(uint32_t(0x00100f00))); |
| 64 TestWord32Ctz(0xc7920000, 17); | 97 CHECK_EQ(12, m.Call(uint32_t(0x00080000))); |
| 65 TestWord32Ctz(0xb8f10000, 16); | 98 CHECK_EQ(13, m.Call(uint32_t(0x00041000))); |
| 66 TestWord32Ctz(0x3b9f8000, 15); | 99 CHECK_EQ(14, m.Call(uint32_t(0x00020020))); |
| 67 TestWord32Ctz(0xdb4c4000, 14); | 100 CHECK_EQ(15, m.Call(uint32_t(0x00010300))); |
| 68 TestWord32Ctz(0xe9a32000, 13); | 101 CHECK_EQ(16, m.Call(uint32_t(0x00008040))); |
| 69 TestWord32Ctz(0xfca61000, 12); | 102 CHECK_EQ(17, m.Call(uint32_t(0x00004005))); |
| 70 TestWord32Ctz(0x6c8a7800, 11); | 103 CHECK_EQ(18, m.Call(uint32_t(0x00002050))); |
| 71 TestWord32Ctz(0x8ce5a400, 10); | 104 CHECK_EQ(19, m.Call(uint32_t(0x00001700))); |
| 72 TestWord32Ctz(0xcb7d0200, 9); | 105 CHECK_EQ(20, m.Call(uint32_t(0x00000870))); |
| 73 TestWord32Ctz(0xcb4dc100, 8); | 106 CHECK_EQ(21, m.Call(uint32_t(0x00000405))); |
| 74 TestWord32Ctz(0xdfbec580, 7); | 107 CHECK_EQ(22, m.Call(uint32_t(0x00000203))); |
| 75 TestWord32Ctz(0x27a9db40, 6); | 108 CHECK_EQ(23, m.Call(uint32_t(0x00000101))); |
| 76 TestWord32Ctz(0xde3bcb20, 5); | 109 CHECK_EQ(24, m.Call(uint32_t(0x00000089))); |
| 77 TestWord32Ctz(0xd7e8a610, 4); | 110 CHECK_EQ(25, m.Call(uint32_t(0x00000041))); |
| 78 TestWord32Ctz(0x9afdbc88, 3); | 111 CHECK_EQ(26, m.Call(uint32_t(0x00000022))); |
| 79 TestWord32Ctz(0x9afdbc84, 2); | 112 CHECK_EQ(27, m.Call(uint32_t(0x00000013))); |
| 80 TestWord32Ctz(0x9afdbc82, 1); | 113 CHECK_EQ(28, m.Call(uint32_t(0x00000008))); |
| 81 TestWord32Ctz(0x9afdbc81, 0); | 114 CHECK_EQ(29, m.Call(uint32_t(0x00000004))); |
| 115 CHECK_EQ(30, m.Call(uint32_t(0x00000002))); |
| 116 CHECK_EQ(31, m.Call(uint32_t(0x00000001))); |
| 117 CHECK_EQ(32, m.Call(uint32_t(0x00000000))); |
| 82 } | 118 } |
| 83 | 119 |
| 84 | 120 |
| 85 void TestWord32Clz(int32_t value, int32_t expected) { | 121 TEST(RunWord32Popcnt) { |
| 86 RawMachineAssemblerTester<int32_t> m; | 122 BufferedRawMachineAssemblerTester<int32_t> m(kMachUint32); |
| 87 Node* clz = m.Word32Clz(m.Int32Constant(value)); | 123 if (!m.machine()->Word32Popcnt().IsSupported()) { |
| 88 m.Return(clz); | 124 // We can only test the operator if it exists on the testing platform. |
| 89 CHECK_EQ(expected, m.Call()); | 125 return; |
| 126 } |
| 127 m.Return(m.AddNode(m.machine()->Word32Popcnt().op(), m.Parameter(0))); |
| 128 |
| 129 CHECK_EQ(0, m.Call(uint32_t(0x00000000))); |
| 130 CHECK_EQ(1, m.Call(uint32_t(0x00000001))); |
| 131 CHECK_EQ(1, m.Call(uint32_t(0x80000000))); |
| 132 CHECK_EQ(32, m.Call(uint32_t(0xffffffff))); |
| 133 CHECK_EQ(6, m.Call(uint32_t(0x000dc100))); |
| 134 CHECK_EQ(9, m.Call(uint32_t(0xe00dc100))); |
| 135 CHECK_EQ(11, m.Call(uint32_t(0xe00dc103))); |
| 136 CHECK_EQ(9, m.Call(uint32_t(0x000dc107))); |
| 90 } | 137 } |
| 91 | 138 |
| 92 | 139 |
| 93 TEST(RunInt32Clz) { | |
| 94 TestWord32Clz(0x80001000, 0); | |
| 95 TestWord32Clz(0x40000500, 1); | |
| 96 TestWord32Clz(0x20000300, 2); | |
| 97 TestWord32Clz(0x10000003, 3); | |
| 98 TestWord32Clz(0x08050000, 4); | |
| 99 TestWord32Clz(0x04006000, 5); | |
| 100 TestWord32Clz(0x02000000, 6); | |
| 101 TestWord32Clz(0x010000a0, 7); | |
| 102 TestWord32Clz(0x00800c00, 8); | |
| 103 TestWord32Clz(0x00400000, 9); | |
| 104 TestWord32Clz(0x0020000d, 10); | |
| 105 TestWord32Clz(0x00100f00, 11); | |
| 106 TestWord32Clz(0x00080000, 12); | |
| 107 TestWord32Clz(0x00041000, 13); | |
| 108 TestWord32Clz(0x00020020, 14); | |
| 109 TestWord32Clz(0x00010300, 15); | |
| 110 TestWord32Clz(0x00008040, 16); | |
| 111 TestWord32Clz(0x00004005, 17); | |
| 112 TestWord32Clz(0x00002050, 18); | |
| 113 TestWord32Clz(0x00001700, 19); | |
| 114 TestWord32Clz(0x00000870, 20); | |
| 115 TestWord32Clz(0x00000405, 21); | |
| 116 TestWord32Clz(0x00000203, 22); | |
| 117 TestWord32Clz(0x00000101, 23); | |
| 118 TestWord32Clz(0x00000089, 24); | |
| 119 TestWord32Clz(0x00000041, 25); | |
| 120 TestWord32Clz(0x00000022, 26); | |
| 121 TestWord32Clz(0x00000013, 27); | |
| 122 TestWord32Clz(0x00000008, 28); | |
| 123 TestWord32Clz(0x00000004, 29); | |
| 124 TestWord32Clz(0x00000002, 30); | |
| 125 TestWord32Clz(0x00000001, 31); | |
| 126 TestWord32Clz(0x00000000, 32); | |
| 127 } | |
| 128 | |
| 129 | |
| 130 #if V8_TARGET_ARCH_64_BIT | 140 #if V8_TARGET_ARCH_64_BIT |
| 131 TEST(RunWord64Clz) { | 141 TEST(RunWord64Clz) { |
| 132 BufferedRawMachineAssemblerTester<int32_t> m(kMachUint64); | 142 BufferedRawMachineAssemblerTester<int32_t> m(kMachUint64); |
| 133 m.Return(m.Word64Clz(m.Parameter(0))); | 143 m.Return(m.Word64Clz(m.Parameter(0))); |
| 134 | 144 |
| 135 CHECK_EQ(0, m.Call(uint64_t(0x8000100000000000))); | 145 CHECK_EQ(0, m.Call(uint64_t(0x8000100000000000))); |
| 136 CHECK_EQ(1, m.Call(uint64_t(0x4000050000000000))); | 146 CHECK_EQ(1, m.Call(uint64_t(0x4000050000000000))); |
| 137 CHECK_EQ(2, m.Call(uint64_t(0x2000030000000000))); | 147 CHECK_EQ(2, m.Call(uint64_t(0x2000030000000000))); |
| 138 CHECK_EQ(3, m.Call(uint64_t(0x1000000300000000))); | 148 CHECK_EQ(3, m.Call(uint64_t(0x1000000300000000))); |
| 139 CHECK_EQ(4, m.Call(uint64_t(0x0805000000000000))); | 149 CHECK_EQ(4, m.Call(uint64_t(0x0805000000000000))); |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 194 CHECK_EQ(59, m.Call(uint64_t(0x0000000000000013))); | 204 CHECK_EQ(59, m.Call(uint64_t(0x0000000000000013))); |
| 195 CHECK_EQ(60, m.Call(uint64_t(0x0000000000000008))); | 205 CHECK_EQ(60, m.Call(uint64_t(0x0000000000000008))); |
| 196 CHECK_EQ(61, m.Call(uint64_t(0x0000000000000004))); | 206 CHECK_EQ(61, m.Call(uint64_t(0x0000000000000004))); |
| 197 CHECK_EQ(62, m.Call(uint64_t(0x0000000000000002))); | 207 CHECK_EQ(62, m.Call(uint64_t(0x0000000000000002))); |
| 198 CHECK_EQ(63, m.Call(uint64_t(0x0000000000000001))); | 208 CHECK_EQ(63, m.Call(uint64_t(0x0000000000000001))); |
| 199 CHECK_EQ(64, m.Call(uint64_t(0x0000000000000000))); | 209 CHECK_EQ(64, m.Call(uint64_t(0x0000000000000000))); |
| 200 } | 210 } |
| 201 #endif // V8_TARGET_ARCH_64_BIT | 211 #endif // V8_TARGET_ARCH_64_BIT |
| 202 | 212 |
| 203 | 213 |
| 204 void TestWord32Popcnt(int32_t value, int32_t expected) { | |
| 205 RawMachineAssemblerTester<int32_t> m; | |
| 206 compiler::OptionalOperator op = m.machine()->Word32Popcnt(); | |
| 207 if (op.IsSupported()) { | |
| 208 Node* popcnt = m.AddNode(op.op(), m.Int32Constant(value)); | |
| 209 m.Return(popcnt); | |
| 210 CHECK_EQ(expected, m.Call()); | |
| 211 } | |
| 212 } | |
| 213 | |
| 214 | |
| 215 TEST(RunWord32Popcnt) { | |
| 216 TestWord32Popcnt(0x00000000, 0); | |
| 217 TestWord32Popcnt(0x00000001, 1); | |
| 218 TestWord32Popcnt(0x80000000, 1); | |
| 219 TestWord32Popcnt(0xffffffff, 32); | |
| 220 TestWord32Popcnt(0x000dc100, 6); | |
| 221 TestWord32Popcnt(0xe00dc100, 9); | |
| 222 TestWord32Popcnt(0xe00dc103, 11); | |
| 223 TestWord32Popcnt(0x000dc107, 9); | |
| 224 } | |
| 225 | |
| 226 | |
| 227 static Node* Int32Input(RawMachineAssemblerTester<int32_t>* m, int index) { | 214 static Node* Int32Input(RawMachineAssemblerTester<int32_t>* m, int index) { |
| 228 switch (index) { | 215 switch (index) { |
| 229 case 0: | 216 case 0: |
| 230 return m->Parameter(0); | 217 return m->Parameter(0); |
| 231 case 1: | 218 case 1: |
| 232 return m->Parameter(1); | 219 return m->Parameter(1); |
| 233 case 2: | 220 case 2: |
| 234 return m->Int32Constant(0); | 221 return m->Int32Constant(0); |
| 235 case 3: | 222 case 3: |
| 236 return m->Int32Constant(1); | 223 return m->Int32Constant(1); |
| (...skipping 3555 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3792 | 3779 |
| 3793 | 3780 |
| 3794 TEST(RunChangeInt32ToFloat64_B) { | 3781 TEST(RunChangeInt32ToFloat64_B) { |
| 3795 BufferedRawMachineAssemblerTester<double> m(kMachInt32); | 3782 BufferedRawMachineAssemblerTester<double> m(kMachInt32); |
| 3796 m.Return(m.ChangeInt32ToFloat64(m.Parameter(0))); | 3783 m.Return(m.ChangeInt32ToFloat64(m.Parameter(0))); |
| 3797 | 3784 |
| 3798 FOR_INT32_INPUTS(i) { CheckDoubleEq(static_cast<double>(*i), m.Call(*i)); } | 3785 FOR_INT32_INPUTS(i) { CheckDoubleEq(static_cast<double>(*i), m.Call(*i)); } |
| 3799 } | 3786 } |
| 3800 | 3787 |
| 3801 | 3788 |
| 3802 TEST(RunChangeUint32ToFloat64_B) { | 3789 TEST(RunChangeUint32ToFloat64) { |
| 3803 RawMachineAssemblerTester<uint32_t> m(kMachUint32); | 3790 BufferedRawMachineAssemblerTester<double> m(kMachUint32); |
| 3804 double output = 0; | 3791 m.Return(m.ChangeUint32ToFloat64(m.Parameter(0))); |
| 3805 | 3792 |
| 3806 Node* convert = m.ChangeUint32ToFloat64(m.Parameter(0)); | 3793 FOR_UINT32_INPUTS(i) { CheckDoubleEq(static_cast<double>(*i), m.Call(*i)); } |
| 3807 m.Store(kMachFloat64, m.PointerConstant(&output), m.Int32Constant(0), convert, | |
| 3808 kNoWriteBarrier); | |
| 3809 m.Return(m.Parameter(0)); | |
| 3810 | |
| 3811 FOR_UINT32_INPUTS(i) { | |
| 3812 uint32_t expect = *i; | |
| 3813 CHECK_EQ(expect, m.Call(expect)); | |
| 3814 CHECK_EQ(static_cast<double>(expect), output); | |
| 3815 } | |
| 3816 } | 3794 } |
| 3817 | 3795 |
| 3818 | 3796 |
| 3819 TEST(RunChangeUint32ToFloat64_spilled) { | |
| 3820 RawMachineAssemblerTester<int32_t> m; | |
| 3821 const int kNumInputs = 32; | |
| 3822 int32_t magic = 0x786234; | |
| 3823 uint32_t input[kNumInputs]; | |
| 3824 double result[kNumInputs]; | |
| 3825 Node* input_node[kNumInputs]; | |
| 3826 | |
| 3827 for (int i = 0; i < kNumInputs; i++) { | |
| 3828 input_node[i] = | |
| 3829 m.Load(kMachUint32, m.PointerConstant(&input), m.Int32Constant(i * 4)); | |
| 3830 } | |
| 3831 | |
| 3832 for (int i = 0; i < kNumInputs; i++) { | |
| 3833 m.Store(kMachFloat64, m.PointerConstant(&result), m.Int32Constant(i * 8), | |
| 3834 m.ChangeUint32ToFloat64(input_node[i]), kNoWriteBarrier); | |
| 3835 } | |
| 3836 | |
| 3837 m.Return(m.Int32Constant(magic)); | |
| 3838 | |
| 3839 for (int i = 0; i < kNumInputs; i++) { | |
| 3840 input[i] = 100 + i; | |
| 3841 } | |
| 3842 | |
| 3843 CHECK_EQ(magic, m.Call()); | |
| 3844 | |
| 3845 for (int i = 0; i < kNumInputs; i++) { | |
| 3846 CHECK_EQ(result[i], static_cast<double>(100 + i)); | |
| 3847 } | |
| 3848 } | |
| 3849 | |
| 3850 | |
| 3851 TEST(RunChangeFloat64ToInt32_A) { | 3797 TEST(RunChangeFloat64ToInt32_A) { |
| 3852 BufferedRawMachineAssemblerTester<int32_t> m; | 3798 BufferedRawMachineAssemblerTester<int32_t> m; |
| 3853 double magic = 11.1; | 3799 double magic = 11.1; |
| 3854 m.Return(m.ChangeFloat64ToInt32(m.Float64Constant(magic))); | 3800 m.Return(m.ChangeFloat64ToInt32(m.Float64Constant(magic))); |
| 3855 CHECK_EQ(static_cast<int32_t>(magic), m.Call()); | 3801 CHECK_EQ(static_cast<int32_t>(magic), m.Call()); |
| 3856 } | 3802 } |
| 3857 | 3803 |
| 3858 | 3804 |
| 3859 TEST(RunChangeFloat64ToInt32_B) { | 3805 TEST(RunChangeFloat64ToInt32_B) { |
| 3860 BufferedRawMachineAssemblerTester<int32_t> m(kMachFloat64); | 3806 BufferedRawMachineAssemblerTester<int32_t> m(kMachFloat64); |
| 3861 m.Return(m.ChangeFloat64ToInt32(m.Parameter(0))); | 3807 m.Return(m.ChangeFloat64ToInt32(m.Parameter(0))); |
| 3862 | 3808 |
| 3863 // Note we don't check fractional inputs, or inputs outside the range of | 3809 // Note we don't check fractional inputs, or inputs outside the range of |
| 3864 // int32, because these Convert operators really should be Change operators. | 3810 // int32, because these Convert operators really should be Change operators. |
| 3865 FOR_INT32_INPUTS(i) { CHECK_EQ(*i, m.Call(static_cast<double>(*i))); } | 3811 FOR_INT32_INPUTS(i) { CHECK_EQ(*i, m.Call(static_cast<double>(*i))); } |
| 3866 | 3812 |
| 3867 for (int32_t n = 1; n < 31; ++n) { | 3813 for (int32_t n = 1; n < 31; ++n) { |
| 3868 CHECK_EQ(1 << n, m.Call(static_cast<double>(1 << n))); | 3814 CHECK_EQ(1 << n, m.Call(static_cast<double>(1 << n))); |
| 3869 } | 3815 } |
| 3870 | 3816 |
| 3871 for (int32_t n = 1; n < 31; ++n) { | 3817 for (int32_t n = 1; n < 31; ++n) { |
| 3872 CHECK_EQ(3 << n, m.Call(static_cast<double>(3 << n))); | 3818 CHECK_EQ(3 << n, m.Call(static_cast<double>(3 << n))); |
| 3873 } | 3819 } |
| 3874 } | 3820 } |
| 3875 | 3821 |
| 3876 | 3822 |
| 3877 TEST(RunChangeFloat64ToUint32_B) { | 3823 TEST(RunChangeFloat64ToUint32) { |
| 3878 RawMachineAssemblerTester<int32_t> m; | 3824 BufferedRawMachineAssemblerTester<uint32_t> m(kMachFloat64); |
| 3879 double input = 0; | 3825 m.Return(m.ChangeFloat64ToUint32(m.Parameter(0))); |
| 3880 int32_t output = 0; | |
| 3881 | |
| 3882 Node* load = | |
| 3883 m.Load(kMachFloat64, m.PointerConstant(&input), m.Int32Constant(0)); | |
| 3884 Node* convert = m.ChangeFloat64ToUint32(load); | |
| 3885 m.Store(kMachInt32, m.PointerConstant(&output), m.Int32Constant(0), convert, | |
| 3886 kNoWriteBarrier); | |
| 3887 m.Return(convert); | |
| 3888 | 3826 |
| 3889 { | 3827 { |
| 3890 FOR_UINT32_INPUTS(i) { | 3828 FOR_UINT32_INPUTS(i) { CHECK_EQ(*i, m.Call(static_cast<double>(*i))); } |
| 3891 input = *i; | |
| 3892 // TODO(titzer): add a CheckEqualsHelper overload for uint32_t. | |
| 3893 int32_t expect = static_cast<int32_t>(*i); | |
| 3894 CHECK_EQ(expect, m.Call()); | |
| 3895 CHECK_EQ(expect, output); | |
| 3896 } | |
| 3897 } | 3829 } |
| 3898 | 3830 |
| 3899 // Check various powers of 2. | 3831 // Check various powers of 2. |
| 3900 for (int32_t n = 1; n < 31; ++n) { | 3832 for (int32_t n = 1; n < 31; ++n) { |
| 3901 { | 3833 { CHECK_EQ(1u << n, m.Call(static_cast<double>(1u << n))); } |
| 3902 input = 1u << n; | |
| 3903 int32_t expect = static_cast<int32_t>(static_cast<uint32_t>(input)); | |
| 3904 CHECK_EQ(expect, m.Call()); | |
| 3905 CHECK_EQ(expect, output); | |
| 3906 } | |
| 3907 | 3834 |
| 3908 { | 3835 { CHECK_EQ(3u << n, m.Call(static_cast<double>(3u << n))); } |
| 3909 input = 3u << n; | |
| 3910 int32_t expect = static_cast<int32_t>(static_cast<uint32_t>(input)); | |
| 3911 CHECK_EQ(expect, m.Call()); | |
| 3912 CHECK_EQ(expect, output); | |
| 3913 } | |
| 3914 } | 3836 } |
| 3915 // Note we don't check fractional inputs, because these Convert operators | 3837 // Note we don't check fractional inputs, because these Convert operators |
| 3916 // really should be Change operators. | 3838 // really should be Change operators. |
| 3917 } | 3839 } |
| 3918 | 3840 |
| 3919 | 3841 |
| 3920 TEST(RunChangeFloat64ToInt32_spilled) { | 3842 TEST(RunTruncateFloat64ToFloat32) { |
| 3921 RawMachineAssemblerTester<int32_t> m; | 3843 BufferedRawMachineAssemblerTester<float> m(kMachFloat64); |
| 3922 const int kNumInputs = 32; | |
| 3923 int32_t magic = 0x786234; | |
| 3924 double input[kNumInputs]; | |
| 3925 int32_t result[kNumInputs]; | |
| 3926 Node* input_node[kNumInputs]; | |
| 3927 | 3844 |
| 3928 for (int i = 0; i < kNumInputs; i++) { | 3845 m.Return(m.TruncateFloat64ToFloat32(m.Parameter(0))); |
| 3929 input_node[i] = | |
| 3930 m.Load(kMachFloat64, m.PointerConstant(&input), m.Int32Constant(i * 8)); | |
| 3931 } | |
| 3932 | 3846 |
| 3933 for (int i = 0; i < kNumInputs; i++) { | 3847 FOR_FLOAT64_INPUTS(i) { CheckFloatEq(DoubleToFloat32(*i), m.Call(*i)); } |
| 3934 m.Store(kMachInt32, m.PointerConstant(&result), m.Int32Constant(i * 4), | |
| 3935 m.ChangeFloat64ToInt32(input_node[i]), kNoWriteBarrier); | |
| 3936 } | |
| 3937 | |
| 3938 m.Return(m.Int32Constant(magic)); | |
| 3939 | |
| 3940 for (int i = 0; i < kNumInputs; i++) { | |
| 3941 input[i] = 100.9 + i; | |
| 3942 } | |
| 3943 | |
| 3944 CHECK_EQ(magic, m.Call()); | |
| 3945 | |
| 3946 for (int i = 0; i < kNumInputs; i++) { | |
| 3947 CHECK_EQ(result[i], 100 + i); | |
| 3948 } | |
| 3949 } | 3848 } |
| 3950 | 3849 |
| 3951 | 3850 |
| 3952 TEST(RunChangeFloat64ToUint32_spilled) { | |
| 3953 RawMachineAssemblerTester<uint32_t> m; | |
| 3954 const int kNumInputs = 32; | |
| 3955 uint32_t magic = 0x786234; | |
| 3956 double input[kNumInputs]; | |
| 3957 uint32_t result[kNumInputs]; | |
| 3958 Node* input_node[kNumInputs]; | |
| 3959 | |
| 3960 for (int i = 0; i < kNumInputs; i++) { | |
| 3961 input_node[i] = | |
| 3962 m.Load(kMachFloat64, m.PointerConstant(&input), m.Int32Constant(i * 8)); | |
| 3963 } | |
| 3964 | |
| 3965 for (int i = 0; i < kNumInputs; i++) { | |
| 3966 m.Store(kMachUint32, m.PointerConstant(&result), m.Int32Constant(i * 4), | |
| 3967 m.ChangeFloat64ToUint32(input_node[i]), kNoWriteBarrier); | |
| 3968 } | |
| 3969 | |
| 3970 m.Return(m.Int32Constant(magic)); | |
| 3971 | |
| 3972 for (int i = 0; i < kNumInputs; i++) { | |
| 3973 if (i % 2) { | |
| 3974 input[i] = 100 + i + 2147483648u; | |
| 3975 } else { | |
| 3976 input[i] = 100 + i; | |
| 3977 } | |
| 3978 } | |
| 3979 | |
| 3980 CHECK_EQ(magic, m.Call()); | |
| 3981 | |
| 3982 for (int i = 0; i < kNumInputs; i++) { | |
| 3983 if (i % 2) { | |
| 3984 CHECK_EQ(result[i], static_cast<uint32_t>(100 + i + 2147483648u)); | |
| 3985 } else { | |
| 3986 CHECK_EQ(result[i], static_cast<uint32_t>(100 + i)); | |
| 3987 } | |
| 3988 } | |
| 3989 } | |
| 3990 | |
| 3991 | |
| 3992 TEST(RunTruncateFloat64ToFloat32_spilled) { | |
| 3993 RawMachineAssemblerTester<uint32_t> m; | |
| 3994 const int kNumInputs = 32; | |
| 3995 uint32_t magic = 0x786234; | |
| 3996 double input[kNumInputs]; | |
| 3997 float result[kNumInputs]; | |
| 3998 Node* input_node[kNumInputs]; | |
| 3999 | |
| 4000 for (int i = 0; i < kNumInputs; i++) { | |
| 4001 input_node[i] = | |
| 4002 m.Load(kMachFloat64, m.PointerConstant(&input), m.Int32Constant(i * 8)); | |
| 4003 } | |
| 4004 | |
| 4005 for (int i = 0; i < kNumInputs; i++) { | |
| 4006 m.Store(kMachFloat32, m.PointerConstant(&result), m.Int32Constant(i * 4), | |
| 4007 m.TruncateFloat64ToFloat32(input_node[i]), kNoWriteBarrier); | |
| 4008 } | |
| 4009 | |
| 4010 m.Return(m.Int32Constant(magic)); | |
| 4011 | |
| 4012 for (int i = 0; i < kNumInputs; i++) { | |
| 4013 input[i] = 0.1 + i; | |
| 4014 } | |
| 4015 | |
| 4016 CHECK_EQ(magic, m.Call()); | |
| 4017 | |
| 4018 for (int i = 0; i < kNumInputs; i++) { | |
| 4019 CHECK_EQ(result[i], DoubleToFloat32(input[i])); | |
| 4020 } | |
| 4021 } | |
| 4022 | |
| 4023 | |
| 4024 TEST(RunDeadChangeFloat64ToInt32) { | 3851 TEST(RunDeadChangeFloat64ToInt32) { |
| 4025 RawMachineAssemblerTester<int32_t> m; | 3852 RawMachineAssemblerTester<int32_t> m; |
| 4026 const int magic = 0x88abcda4; | 3853 const int magic = 0x88abcda4; |
| 4027 m.ChangeFloat64ToInt32(m.Float64Constant(999.78)); | 3854 m.ChangeFloat64ToInt32(m.Float64Constant(999.78)); |
| 4028 m.Return(m.Int32Constant(magic)); | 3855 m.Return(m.Int32Constant(magic)); |
| 4029 CHECK_EQ(magic, m.Call()); | 3856 CHECK_EQ(magic, m.Call()); |
| 4030 } | 3857 } |
| 4031 | 3858 |
| 4032 | 3859 |
| 4033 TEST(RunDeadChangeInt32ToFloat64) { | 3860 TEST(RunDeadChangeInt32ToFloat64) { |
| (...skipping 1004 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5038 m.LoadFromPointer(&input, kMachFloat64))); | 4865 m.LoadFromPointer(&input, kMachFloat64))); |
| 5039 for (size_t i = 0; i < arraysize(kValues); ++i) { | 4866 for (size_t i = 0; i < arraysize(kValues); ++i) { |
| 5040 input = kValues[i].from; | 4867 input = kValues[i].from; |
| 5041 uint64_t expected = static_cast<int64_t>(kValues[i].raw); | 4868 uint64_t expected = static_cast<int64_t>(kValues[i].raw); |
| 5042 CHECK_EQ(static_cast<int>(expected), m.Call()); | 4869 CHECK_EQ(static_cast<int>(expected), m.Call()); |
| 5043 } | 4870 } |
| 5044 } | 4871 } |
| 5045 | 4872 |
| 5046 | 4873 |
| 5047 TEST(RunChangeFloat32ToFloat64) { | 4874 TEST(RunChangeFloat32ToFloat64) { |
| 5048 double actual = 0.0f; | 4875 BufferedRawMachineAssemblerTester<double> m(kMachFloat32); |
| 5049 float expected = 0.0; | |
| 5050 RawMachineAssemblerTester<int32_t> m; | |
| 5051 m.StoreToPointer( | |
| 5052 &actual, kMachFloat64, | |
| 5053 m.ChangeFloat32ToFloat64(m.LoadFromPointer(&expected, kMachFloat32))); | |
| 5054 m.Return(m.Int32Constant(0)); | |
| 5055 FOR_FLOAT32_INPUTS(i) { | |
| 5056 expected = *i; | |
| 5057 CHECK_EQ(0, m.Call()); | |
| 5058 CHECK_EQ(static_cast<double>(expected), actual); | |
| 5059 } | |
| 5060 } | |
| 5061 | 4876 |
| 4877 m.Return(m.ChangeFloat32ToFloat64(m.Parameter(0))); |
| 5062 | 4878 |
| 5063 TEST(RunChangeFloat32ToFloat64_spilled) { | 4879 FOR_FLOAT32_INPUTS(i) { CheckDoubleEq(static_cast<double>(*i), m.Call(*i)); } |
| 5064 RawMachineAssemblerTester<int32_t> m; | |
| 5065 const int kNumInputs = 32; | |
| 5066 int32_t magic = 0x786234; | |
| 5067 float input[kNumInputs]; | |
| 5068 double result[kNumInputs]; | |
| 5069 Node* input_node[kNumInputs]; | |
| 5070 | |
| 5071 for (int i = 0; i < kNumInputs; i++) { | |
| 5072 input_node[i] = | |
| 5073 m.Load(kMachFloat32, m.PointerConstant(&input), m.Int32Constant(i * 4)); | |
| 5074 } | |
| 5075 | |
| 5076 for (int i = 0; i < kNumInputs; i++) { | |
| 5077 m.Store(kMachFloat64, m.PointerConstant(&result), m.Int32Constant(i * 8), | |
| 5078 m.ChangeFloat32ToFloat64(input_node[i]), kNoWriteBarrier); | |
| 5079 } | |
| 5080 | |
| 5081 m.Return(m.Int32Constant(magic)); | |
| 5082 | |
| 5083 for (int i = 0; i < kNumInputs; i++) { | |
| 5084 input[i] = 100.9f + i; | |
| 5085 } | |
| 5086 | |
| 5087 CHECK_EQ(magic, m.Call()); | |
| 5088 | |
| 5089 for (int i = 0; i < kNumInputs; i++) { | |
| 5090 CHECK_EQ(result[i], static_cast<double>(input[i])); | |
| 5091 } | |
| 5092 } | |
| 5093 | |
| 5094 | |
| 5095 TEST(RunTruncateFloat64ToFloat32) { | |
| 5096 float actual = 0.0f; | |
| 5097 double input = 0.0; | |
| 5098 RawMachineAssemblerTester<int32_t> m; | |
| 5099 m.StoreToPointer( | |
| 5100 &actual, kMachFloat32, | |
| 5101 m.TruncateFloat64ToFloat32(m.LoadFromPointer(&input, kMachFloat64))); | |
| 5102 m.Return(m.Int32Constant(0)); | |
| 5103 FOR_FLOAT64_INPUTS(i) { | |
| 5104 input = *i; | |
| 5105 volatile double expected = DoubleToFloat32(input); | |
| 5106 CHECK_EQ(0, m.Call()); | |
| 5107 CheckDoubleEq(expected, actual); | |
| 5108 } | |
| 5109 } | 4880 } |
| 5110 | 4881 |
| 5111 | 4882 |
| 5112 TEST(RunFloat32Constant) { | 4883 TEST(RunFloat32Constant) { |
| 5113 FOR_FLOAT32_INPUTS(i) { | 4884 FOR_FLOAT32_INPUTS(i) { |
| 5114 float expected = *i; | 4885 BufferedRawMachineAssemblerTester<float> m; |
| 5115 float actual = *i; | 4886 m.Return(m.Float32Constant(*i)); |
| 5116 RawMachineAssemblerTester<int32_t> m; | 4887 CheckFloatEq(*i, m.Call()); |
| 5117 m.StoreToPointer(&actual, kMachFloat32, m.Float32Constant(expected)); | |
| 5118 m.Return(m.Int32Constant(0)); | |
| 5119 CHECK_EQ(0, m.Call()); | |
| 5120 CHECK_EQ(expected, actual); | |
| 5121 } | 4888 } |
| 5122 } | 4889 } |
| 5123 | 4890 |
| 5124 | 4891 |
| 5125 TEST(RunFloat64ExtractLowWord32) { | 4892 TEST(RunFloat64ExtractLowWord32) { |
| 5126 uint64_t input = 0; | 4893 BufferedRawMachineAssemblerTester<uint32_t> m(kMachFloat64); |
| 5127 RawMachineAssemblerTester<int32_t> m; | 4894 m.Return(m.Float64ExtractLowWord32(m.Parameter(0))); |
| 5128 m.Return(m.Float64ExtractLowWord32(m.LoadFromPointer(&input, kMachFloat64))); | |
| 5129 FOR_FLOAT64_INPUTS(i) { | 4895 FOR_FLOAT64_INPUTS(i) { |
| 5130 input = bit_cast<uint64_t>(*i); | 4896 uint32_t expected = static_cast<uint32_t>(bit_cast<uint64_t>(*i)); |
| 5131 int32_t expected = bit_cast<int32_t>(static_cast<uint32_t>(input)); | 4897 CHECK_EQ(expected, m.Call(*i)); |
| 5132 CHECK_EQ(expected, m.Call()); | |
| 5133 } | 4898 } |
| 5134 } | 4899 } |
| 5135 | 4900 |
| 5136 | 4901 |
| 5137 TEST(RunFloat64ExtractHighWord32) { | 4902 TEST(RunFloat64ExtractHighWord32) { |
| 5138 uint64_t input = 0; | 4903 BufferedRawMachineAssemblerTester<uint32_t> m(kMachFloat64); |
| 5139 RawMachineAssemblerTester<int32_t> m; | 4904 m.Return(m.Float64ExtractHighWord32(m.Parameter(0))); |
| 5140 m.Return(m.Float64ExtractHighWord32(m.LoadFromPointer(&input, kMachFloat64))); | |
| 5141 FOR_FLOAT64_INPUTS(i) { | 4905 FOR_FLOAT64_INPUTS(i) { |
| 5142 input = bit_cast<uint64_t>(*i); | 4906 uint32_t expected = static_cast<uint32_t>(bit_cast<uint64_t>(*i) >> 32); |
| 5143 int32_t expected = bit_cast<int32_t>(static_cast<uint32_t>(input >> 32)); | 4907 CHECK_EQ(expected, m.Call(*i)); |
| 5144 CHECK_EQ(expected, m.Call()); | |
| 5145 } | 4908 } |
| 5146 } | 4909 } |
| 5147 | 4910 |
| 5148 | 4911 |
| 5149 TEST(RunFloat64InsertLowWord32) { | 4912 TEST(RunFloat64InsertLowWord32) { |
| 5150 uint64_t input = 0; | 4913 BufferedRawMachineAssemblerTester<double> m(kMachFloat64, kMachInt32); |
| 5151 uint64_t result = 0; | 4914 m.Return(m.Float64InsertLowWord32(m.Parameter(0), m.Parameter(1))); |
| 5152 RawMachineAssemblerTester<int32_t> m(kMachInt32); | |
| 5153 m.StoreToPointer( | |
| 5154 &result, kMachFloat64, | |
| 5155 m.Float64InsertLowWord32(m.LoadFromPointer(&input, kMachFloat64), | |
| 5156 m.Parameter(0))); | |
| 5157 m.Return(m.Int32Constant(0)); | |
| 5158 FOR_FLOAT64_INPUTS(i) { | 4915 FOR_FLOAT64_INPUTS(i) { |
| 5159 FOR_INT32_INPUTS(j) { | 4916 FOR_INT32_INPUTS(j) { |
| 5160 input = bit_cast<uint64_t>(*i); | 4917 double expected = bit_cast<double>( |
| 5161 uint64_t expected = (input & ~(V8_UINT64_C(0xFFFFFFFF))) | | 4918 (bit_cast<uint64_t>(*i) & ~(V8_UINT64_C(0xFFFFFFFF))) | |
| 5162 (static_cast<uint64_t>(bit_cast<uint32_t>(*j))); | 4919 (static_cast<uint64_t>(bit_cast<uint32_t>(*j)))); |
| 5163 CHECK_EQ(0, m.Call(*j)); | 4920 CheckDoubleEq(expected, m.Call(*i, *j)); |
| 5164 CHECK_EQ(expected, result); | |
| 5165 } | 4921 } |
| 5166 } | 4922 } |
| 5167 } | 4923 } |
| 5168 | 4924 |
| 5169 | 4925 |
| 5170 TEST(RunFloat64InsertHighWord32) { | 4926 TEST(RunFloat64InsertHighWord32) { |
| 5171 uint64_t input = 0; | 4927 BufferedRawMachineAssemblerTester<double> m(kMachFloat64, kMachUint32); |
| 5172 uint64_t result = 0; | 4928 m.Return(m.Float64InsertHighWord32(m.Parameter(0), m.Parameter(1))); |
| 5173 RawMachineAssemblerTester<int32_t> m(kMachInt32); | |
| 5174 m.StoreToPointer( | |
| 5175 &result, kMachFloat64, | |
| 5176 m.Float64InsertHighWord32(m.LoadFromPointer(&input, kMachFloat64), | |
| 5177 m.Parameter(0))); | |
| 5178 m.Return(m.Int32Constant(0)); | |
| 5179 FOR_FLOAT64_INPUTS(i) { | 4929 FOR_FLOAT64_INPUTS(i) { |
| 5180 FOR_INT32_INPUTS(j) { | 4930 FOR_UINT32_INPUTS(j) { |
| 5181 input = bit_cast<uint64_t>(*i); | 4931 uint64_t expected = (bit_cast<uint64_t>(*i) & 0xFFFFFFFF) | |
| 5182 uint64_t expected = (input & ~(V8_UINT64_C(0xFFFFFFFF) << 32)) | | 4932 (static_cast<uint64_t>(*j) << 32); |
| 5183 (static_cast<uint64_t>(bit_cast<uint32_t>(*j)) << 32); | 4933 |
| 5184 CHECK_EQ(0, m.Call(*j)); | 4934 CheckDoubleEq(bit_cast<double>(expected), m.Call(*i, *j)); |
| 5185 CHECK_EQ(expected, result); | |
| 5186 } | 4935 } |
| 5187 } | 4936 } |
| 5188 } | 4937 } |
| 5189 | 4938 |
| 5190 | 4939 |
| 5191 TEST(RunFloat32Abs) { | 4940 TEST(RunFloat32Abs) { |
| 5192 float input = -1.0; | 4941 BufferedRawMachineAssemblerTester<float> m(kMachFloat32); |
| 5193 float result = 0.0; | 4942 m.Return(m.Float32Abs(m.Parameter(0))); |
| 5194 RawMachineAssemblerTester<int32_t> m; | 4943 FOR_FLOAT32_INPUTS(i) { CheckFloatEq(std::abs(*i), m.Call(*i)); } |
| 5195 m.StoreToPointer(&result, kMachFloat32, | |
| 5196 m.Float32Abs(m.LoadFromPointer(&input, kMachFloat32))); | |
| 5197 m.Return(m.Int32Constant(0)); | |
| 5198 FOR_FLOAT32_INPUTS(i) { | |
| 5199 input = *i; | |
| 5200 float expected = std::abs(input); | |
| 5201 CHECK_EQ(0, m.Call()); | |
| 5202 CheckFloatEq(expected, result); | |
| 5203 } | |
| 5204 } | 4944 } |
| 5205 | 4945 |
| 5206 | 4946 |
| 5207 TEST(RunFloat64Abs) { | 4947 TEST(RunFloat64Abs) { |
| 5208 double input = -1.0; | 4948 BufferedRawMachineAssemblerTester<double> m(kMachFloat64); |
| 5209 double result = 0.0; | 4949 m.Return(m.Float64Abs(m.Parameter(0))); |
| 5210 RawMachineAssemblerTester<int32_t> m; | 4950 FOR_FLOAT64_INPUTS(i) { CheckDoubleEq(std::abs(*i), m.Call(*i)); } |
| 5211 m.StoreToPointer(&result, kMachFloat64, | |
| 5212 m.Float64Abs(m.LoadFromPointer(&input, kMachFloat64))); | |
| 5213 m.Return(m.Int32Constant(0)); | |
| 5214 FOR_FLOAT64_INPUTS(i) { | |
| 5215 input = *i; | |
| 5216 double expected = std::abs(input); | |
| 5217 CHECK_EQ(0, m.Call()); | |
| 5218 CheckDoubleEq(expected, result); | |
| 5219 } | |
| 5220 } | 4951 } |
| 5221 | 4952 |
| 5222 | 4953 |
| 5223 static double two_30 = 1 << 30; // 2^30 is a smi boundary. | 4954 static double two_30 = 1 << 30; // 2^30 is a smi boundary. |
| 5224 static double two_52 = two_30 * (1 << 22); // 2^52 is a precision boundary. | 4955 static double two_52 = two_30 * (1 << 22); // 2^52 is a precision boundary. |
| 5225 static double kValues[] = {0.1, | 4956 static double kValues[] = {0.1, |
| 5226 0.2, | 4957 0.2, |
| 5227 0.49999999999999994, | 4958 0.49999999999999994, |
| 5228 0.5, | 4959 0.5, |
| 5229 0.7, | 4960 0.7, |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5312 -two_52 - 0.1, | 5043 -two_52 - 0.1, |
| 5313 -two_52 - 0.5, | 5044 -two_52 - 0.5, |
| 5314 -two_52 - 0.7, | 5045 -two_52 - 0.7, |
| 5315 -two_52 + 1, | 5046 -two_52 + 1, |
| 5316 -two_52 + 1 - 0.1, | 5047 -two_52 + 1 - 0.1, |
| 5317 -two_52 + 1 - 0.5, | 5048 -two_52 + 1 - 0.5, |
| 5318 -two_52 + 1 - 0.7}; | 5049 -two_52 + 1 - 0.7}; |
| 5319 | 5050 |
| 5320 | 5051 |
| 5321 TEST(RunFloat64RoundDown1) { | 5052 TEST(RunFloat64RoundDown1) { |
| 5322 double input = -1.0; | 5053 BufferedRawMachineAssemblerTester<double> m(kMachFloat64); |
| 5323 double result = 0.0; | |
| 5324 RawMachineAssemblerTester<int32_t> m; | |
| 5325 if (!m.machine()->Float64RoundDown().IsSupported()) return; | 5054 if (!m.machine()->Float64RoundDown().IsSupported()) return; |
| 5326 m.StoreToPointer(&result, kMachFloat64, | 5055 |
| 5327 m.Float64RoundDown(m.LoadFromPointer(&input, kMachFloat64))); | 5056 m.Return(m.Float64RoundDown(m.Parameter(0))); |
| 5328 m.Return(m.Int32Constant(0)); | 5057 |
| 5329 for (size_t i = 0; i < arraysize(kValues); ++i) { | 5058 FOR_FLOAT64_INPUTS(i) { CheckDoubleEq(std::floor(*i), m.Call(*i)); } |
| 5330 input = kValues[i]; | |
| 5331 CHECK_EQ(0, m.Call()); | |
| 5332 double expected = std::floor(kValues[i]); | |
| 5333 CHECK_EQ(expected, result); | |
| 5334 } | |
| 5335 } | 5059 } |
| 5336 | 5060 |
| 5337 | 5061 |
| 5338 TEST(RunFloat64RoundDown2) { | 5062 TEST(RunFloat64RoundDown2) { |
| 5339 double input = -1.0; | 5063 double input = -1.0; |
| 5340 double result = 0.0; | 5064 double result = 0.0; |
| 5341 RawMachineAssemblerTester<int32_t> m; | 5065 RawMachineAssemblerTester<int32_t> m; |
| 5342 if (!m.machine()->Float64RoundDown().IsSupported()) return; | 5066 if (!m.machine()->Float64RoundDown().IsSupported()) return; |
| 5343 m.StoreToPointer(&result, kMachFloat64, | 5067 m.StoreToPointer(&result, kMachFloat64, |
| 5344 m.Float64Sub(m.Float64Constant(-0.0), | 5068 m.Float64Sub(m.Float64Constant(-0.0), |
| (...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5633 Node* call = r.AddNode(r.common()->Call(desc), phi); | 5357 Node* call = r.AddNode(r.common()->Call(desc), phi); |
| 5634 r.Return(call); | 5358 r.Return(call); |
| 5635 | 5359 |
| 5636 CHECK_EQ(33, r.Call(1)); | 5360 CHECK_EQ(33, r.Call(1)); |
| 5637 CHECK_EQ(44, r.Call(0)); | 5361 CHECK_EQ(44, r.Call(0)); |
| 5638 } | 5362 } |
| 5639 | 5363 |
| 5640 } // namespace compiler | 5364 } // namespace compiler |
| 5641 } // namespace internal | 5365 } // namespace internal |
| 5642 } // namespace v8 | 5366 } // namespace v8 |
| OLD | NEW |