| 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 #include <cmath> | 5 #include <cmath> |
| 6 #include <functional> | 6 #include <functional> |
| 7 #include <limits> | 7 #include <limits> |
| 8 | 8 |
| 9 #include "src/base/bits.h" | 9 #include "src/base/bits.h" |
| 10 #include "src/base/utils/random-number-generator.h" | 10 #include "src/base/utils/random-number-generator.h" |
| (...skipping 12 matching lines...) Expand all Loading... |
| 23 | 23 |
| 24 TEST(RunInt32Add) { | 24 TEST(RunInt32Add) { |
| 25 RawMachineAssemblerTester<int32_t> m; | 25 RawMachineAssemblerTester<int32_t> m; |
| 26 Node* add = m.Int32Add(m.Int32Constant(0), m.Int32Constant(1)); | 26 Node* add = m.Int32Add(m.Int32Constant(0), m.Int32Constant(1)); |
| 27 m.Return(add); | 27 m.Return(add); |
| 28 CHECK_EQ(1, m.Call()); | 28 CHECK_EQ(1, m.Call()); |
| 29 } | 29 } |
| 30 | 30 |
| 31 | 31 |
| 32 TEST(RunWord32Ctz) { | 32 TEST(RunWord32Ctz) { |
| 33 BufferedRawMachineAssemblerTester<int32_t> m(kMachUint32); | 33 BufferedRawMachineAssemblerTester<int32_t> m(MachineType::Uint32()); |
| 34 if (!m.machine()->Word32Ctz().IsSupported()) { | 34 if (!m.machine()->Word32Ctz().IsSupported()) { |
| 35 // We can only test the operator if it exists on the testing platform. | 35 // We can only test the operator if it exists on the testing platform. |
| 36 return; | 36 return; |
| 37 } | 37 } |
| 38 m.Return(m.AddNode(m.machine()->Word32Ctz().op(), m.Parameter(0))); | 38 m.Return(m.AddNode(m.machine()->Word32Ctz().op(), m.Parameter(0))); |
| 39 | 39 |
| 40 CHECK_EQ(32, m.Call(uint32_t(0x00000000))); | 40 CHECK_EQ(32, m.Call(uint32_t(0x00000000))); |
| 41 CHECK_EQ(31, m.Call(uint32_t(0x80000000))); | 41 CHECK_EQ(31, m.Call(uint32_t(0x80000000))); |
| 42 CHECK_EQ(30, m.Call(uint32_t(0x40000000))); | 42 CHECK_EQ(30, m.Call(uint32_t(0x40000000))); |
| 43 CHECK_EQ(29, m.Call(uint32_t(0x20000000))); | 43 CHECK_EQ(29, m.Call(uint32_t(0x20000000))); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 67 CHECK_EQ(5, m.Call(uint32_t(0xde3bcb20))); | 67 CHECK_EQ(5, m.Call(uint32_t(0xde3bcb20))); |
| 68 CHECK_EQ(4, m.Call(uint32_t(0xd7e8a610))); | 68 CHECK_EQ(4, m.Call(uint32_t(0xd7e8a610))); |
| 69 CHECK_EQ(3, m.Call(uint32_t(0x9afdbc88))); | 69 CHECK_EQ(3, m.Call(uint32_t(0x9afdbc88))); |
| 70 CHECK_EQ(2, m.Call(uint32_t(0x9afdbc84))); | 70 CHECK_EQ(2, m.Call(uint32_t(0x9afdbc84))); |
| 71 CHECK_EQ(1, m.Call(uint32_t(0x9afdbc82))); | 71 CHECK_EQ(1, m.Call(uint32_t(0x9afdbc82))); |
| 72 CHECK_EQ(0, m.Call(uint32_t(0x9afdbc81))); | 72 CHECK_EQ(0, m.Call(uint32_t(0x9afdbc81))); |
| 73 } | 73 } |
| 74 | 74 |
| 75 | 75 |
| 76 TEST(RunWord32Clz) { | 76 TEST(RunWord32Clz) { |
| 77 BufferedRawMachineAssemblerTester<int32_t> m(kMachUint32); | 77 BufferedRawMachineAssemblerTester<int32_t> m(MachineType::Uint32()); |
| 78 m.Return(m.Word32Clz(m.Parameter(0))); | 78 m.Return(m.Word32Clz(m.Parameter(0))); |
| 79 | 79 |
| 80 CHECK_EQ(0, m.Call(uint32_t(0x80001000))); | 80 CHECK_EQ(0, m.Call(uint32_t(0x80001000))); |
| 81 CHECK_EQ(1, m.Call(uint32_t(0x40000500))); | 81 CHECK_EQ(1, m.Call(uint32_t(0x40000500))); |
| 82 CHECK_EQ(2, m.Call(uint32_t(0x20000300))); | 82 CHECK_EQ(2, m.Call(uint32_t(0x20000300))); |
| 83 CHECK_EQ(3, m.Call(uint32_t(0x10000003))); | 83 CHECK_EQ(3, m.Call(uint32_t(0x10000003))); |
| 84 CHECK_EQ(4, m.Call(uint32_t(0x08050000))); | 84 CHECK_EQ(4, m.Call(uint32_t(0x08050000))); |
| 85 CHECK_EQ(5, m.Call(uint32_t(0x04006000))); | 85 CHECK_EQ(5, m.Call(uint32_t(0x04006000))); |
| 86 CHECK_EQ(6, m.Call(uint32_t(0x02000000))); | 86 CHECK_EQ(6, m.Call(uint32_t(0x02000000))); |
| 87 CHECK_EQ(7, m.Call(uint32_t(0x010000a0))); | 87 CHECK_EQ(7, m.Call(uint32_t(0x010000a0))); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 107 CHECK_EQ(27, m.Call(uint32_t(0x00000013))); | 107 CHECK_EQ(27, m.Call(uint32_t(0x00000013))); |
| 108 CHECK_EQ(28, m.Call(uint32_t(0x00000008))); | 108 CHECK_EQ(28, m.Call(uint32_t(0x00000008))); |
| 109 CHECK_EQ(29, m.Call(uint32_t(0x00000004))); | 109 CHECK_EQ(29, m.Call(uint32_t(0x00000004))); |
| 110 CHECK_EQ(30, m.Call(uint32_t(0x00000002))); | 110 CHECK_EQ(30, m.Call(uint32_t(0x00000002))); |
| 111 CHECK_EQ(31, m.Call(uint32_t(0x00000001))); | 111 CHECK_EQ(31, m.Call(uint32_t(0x00000001))); |
| 112 CHECK_EQ(32, m.Call(uint32_t(0x00000000))); | 112 CHECK_EQ(32, m.Call(uint32_t(0x00000000))); |
| 113 } | 113 } |
| 114 | 114 |
| 115 | 115 |
| 116 TEST(RunWord32Popcnt) { | 116 TEST(RunWord32Popcnt) { |
| 117 BufferedRawMachineAssemblerTester<int32_t> m(kMachUint32); | 117 BufferedRawMachineAssemblerTester<int32_t> m(MachineType::Uint32()); |
| 118 if (!m.machine()->Word32Popcnt().IsSupported()) { | 118 if (!m.machine()->Word32Popcnt().IsSupported()) { |
| 119 // We can only test the operator if it exists on the testing platform. | 119 // We can only test the operator if it exists on the testing platform. |
| 120 return; | 120 return; |
| 121 } | 121 } |
| 122 m.Return(m.AddNode(m.machine()->Word32Popcnt().op(), m.Parameter(0))); | 122 m.Return(m.AddNode(m.machine()->Word32Popcnt().op(), m.Parameter(0))); |
| 123 | 123 |
| 124 CHECK_EQ(0, m.Call(uint32_t(0x00000000))); | 124 CHECK_EQ(0, m.Call(uint32_t(0x00000000))); |
| 125 CHECK_EQ(1, m.Call(uint32_t(0x00000001))); | 125 CHECK_EQ(1, m.Call(uint32_t(0x00000001))); |
| 126 CHECK_EQ(1, m.Call(uint32_t(0x80000000))); | 126 CHECK_EQ(1, m.Call(uint32_t(0x80000000))); |
| 127 CHECK_EQ(32, m.Call(uint32_t(0xffffffff))); | 127 CHECK_EQ(32, m.Call(uint32_t(0xffffffff))); |
| 128 CHECK_EQ(6, m.Call(uint32_t(0x000dc100))); | 128 CHECK_EQ(6, m.Call(uint32_t(0x000dc100))); |
| 129 CHECK_EQ(9, m.Call(uint32_t(0xe00dc100))); | 129 CHECK_EQ(9, m.Call(uint32_t(0xe00dc100))); |
| 130 CHECK_EQ(11, m.Call(uint32_t(0xe00dc103))); | 130 CHECK_EQ(11, m.Call(uint32_t(0xe00dc103))); |
| 131 CHECK_EQ(9, m.Call(uint32_t(0x000dc107))); | 131 CHECK_EQ(9, m.Call(uint32_t(0x000dc107))); |
| 132 } | 132 } |
| 133 | 133 |
| 134 | 134 |
| 135 #if V8_TARGET_ARCH_64_BIT | 135 #if V8_TARGET_ARCH_64_BIT |
| 136 TEST(RunWord64Clz) { | 136 TEST(RunWord64Clz) { |
| 137 BufferedRawMachineAssemblerTester<int32_t> m(kMachUint64); | 137 BufferedRawMachineAssemblerTester<int32_t> m(MachineType::Uint64()); |
| 138 m.Return(m.Word64Clz(m.Parameter(0))); | 138 m.Return(m.Word64Clz(m.Parameter(0))); |
| 139 | 139 |
| 140 CHECK_EQ(0, m.Call(uint64_t(0x8000100000000000))); | 140 CHECK_EQ(0, m.Call(uint64_t(0x8000100000000000))); |
| 141 CHECK_EQ(1, m.Call(uint64_t(0x4000050000000000))); | 141 CHECK_EQ(1, m.Call(uint64_t(0x4000050000000000))); |
| 142 CHECK_EQ(2, m.Call(uint64_t(0x2000030000000000))); | 142 CHECK_EQ(2, m.Call(uint64_t(0x2000030000000000))); |
| 143 CHECK_EQ(3, m.Call(uint64_t(0x1000000300000000))); | 143 CHECK_EQ(3, m.Call(uint64_t(0x1000000300000000))); |
| 144 CHECK_EQ(4, m.Call(uint64_t(0x0805000000000000))); | 144 CHECK_EQ(4, m.Call(uint64_t(0x0805000000000000))); |
| 145 CHECK_EQ(5, m.Call(uint64_t(0x0400600000000000))); | 145 CHECK_EQ(5, m.Call(uint64_t(0x0400600000000000))); |
| 146 CHECK_EQ(6, m.Call(uint64_t(0x0200000000000000))); | 146 CHECK_EQ(6, m.Call(uint64_t(0x0200000000000000))); |
| 147 CHECK_EQ(7, m.Call(uint64_t(0x010000a000000000))); | 147 CHECK_EQ(7, m.Call(uint64_t(0x010000a000000000))); |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 199 CHECK_EQ(59, m.Call(uint64_t(0x0000000000000013))); | 199 CHECK_EQ(59, m.Call(uint64_t(0x0000000000000013))); |
| 200 CHECK_EQ(60, m.Call(uint64_t(0x0000000000000008))); | 200 CHECK_EQ(60, m.Call(uint64_t(0x0000000000000008))); |
| 201 CHECK_EQ(61, m.Call(uint64_t(0x0000000000000004))); | 201 CHECK_EQ(61, m.Call(uint64_t(0x0000000000000004))); |
| 202 CHECK_EQ(62, m.Call(uint64_t(0x0000000000000002))); | 202 CHECK_EQ(62, m.Call(uint64_t(0x0000000000000002))); |
| 203 CHECK_EQ(63, m.Call(uint64_t(0x0000000000000001))); | 203 CHECK_EQ(63, m.Call(uint64_t(0x0000000000000001))); |
| 204 CHECK_EQ(64, m.Call(uint64_t(0x0000000000000000))); | 204 CHECK_EQ(64, m.Call(uint64_t(0x0000000000000000))); |
| 205 } | 205 } |
| 206 | 206 |
| 207 | 207 |
| 208 TEST(RunWord64Ctz) { | 208 TEST(RunWord64Ctz) { |
| 209 RawMachineAssemblerTester<int32_t> m(kMachUint64); | 209 RawMachineAssemblerTester<int32_t> m(MachineType::Uint64()); |
| 210 if (!m.machine()->Word64Ctz().IsSupported()) { | 210 if (!m.machine()->Word64Ctz().IsSupported()) { |
| 211 return; | 211 return; |
| 212 } | 212 } |
| 213 | 213 |
| 214 m.Return(m.AddNode(m.machine()->Word64Ctz().op(), m.Parameter(0))); | 214 m.Return(m.AddNode(m.machine()->Word64Ctz().op(), m.Parameter(0))); |
| 215 | 215 |
| 216 CHECK_EQ(64, m.Call(uint64_t(0x0000000000000000))); | 216 CHECK_EQ(64, m.Call(uint64_t(0x0000000000000000))); |
| 217 CHECK_EQ(63, m.Call(uint64_t(0x8000000000000000))); | 217 CHECK_EQ(63, m.Call(uint64_t(0x8000000000000000))); |
| 218 CHECK_EQ(62, m.Call(uint64_t(0x4000000000000000))); | 218 CHECK_EQ(62, m.Call(uint64_t(0x4000000000000000))); |
| 219 CHECK_EQ(61, m.Call(uint64_t(0x2000000000000000))); | 219 CHECK_EQ(61, m.Call(uint64_t(0x2000000000000000))); |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 275 CHECK_EQ(5, m.Call(uint64_t(0x00000000de3bcb20))); | 275 CHECK_EQ(5, m.Call(uint64_t(0x00000000de3bcb20))); |
| 276 CHECK_EQ(4, m.Call(uint64_t(0x00000000d7e8a610))); | 276 CHECK_EQ(4, m.Call(uint64_t(0x00000000d7e8a610))); |
| 277 CHECK_EQ(3, m.Call(uint64_t(0x000000009afdbc88))); | 277 CHECK_EQ(3, m.Call(uint64_t(0x000000009afdbc88))); |
| 278 CHECK_EQ(2, m.Call(uint64_t(0x000000009afdbc84))); | 278 CHECK_EQ(2, m.Call(uint64_t(0x000000009afdbc84))); |
| 279 CHECK_EQ(1, m.Call(uint64_t(0x000000009afdbc82))); | 279 CHECK_EQ(1, m.Call(uint64_t(0x000000009afdbc82))); |
| 280 CHECK_EQ(0, m.Call(uint64_t(0x000000009afdbc81))); | 280 CHECK_EQ(0, m.Call(uint64_t(0x000000009afdbc81))); |
| 281 } | 281 } |
| 282 | 282 |
| 283 | 283 |
| 284 TEST(RunWord64Popcnt) { | 284 TEST(RunWord64Popcnt) { |
| 285 BufferedRawMachineAssemblerTester<int32_t> m(kMachUint64); | 285 BufferedRawMachineAssemblerTester<int32_t> m(MachineType::Uint64()); |
| 286 if (!m.machine()->Word64Popcnt().IsSupported()) { | 286 if (!m.machine()->Word64Popcnt().IsSupported()) { |
| 287 return; | 287 return; |
| 288 } | 288 } |
| 289 | 289 |
| 290 m.Return(m.AddNode(m.machine()->Word64Popcnt().op(), m.Parameter(0))); | 290 m.Return(m.AddNode(m.machine()->Word64Popcnt().op(), m.Parameter(0))); |
| 291 | 291 |
| 292 CHECK_EQ(0, m.Call(uint64_t(0x0000000000000000))); | 292 CHECK_EQ(0, m.Call(uint64_t(0x0000000000000000))); |
| 293 CHECK_EQ(1, m.Call(uint64_t(0x0000000000000001))); | 293 CHECK_EQ(1, m.Call(uint64_t(0x0000000000000001))); |
| 294 CHECK_EQ(1, m.Call(uint64_t(0x8000000000000000))); | 294 CHECK_EQ(1, m.Call(uint64_t(0x8000000000000000))); |
| 295 CHECK_EQ(64, m.Call(uint64_t(0xffffffffffffffff))); | 295 CHECK_EQ(64, m.Call(uint64_t(0xffffffffffffffff))); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 311 return m->Int32Constant(0); | 311 return m->Int32Constant(0); |
| 312 case 3: | 312 case 3: |
| 313 return m->Int32Constant(1); | 313 return m->Int32Constant(1); |
| 314 case 4: | 314 case 4: |
| 315 return m->Int32Constant(-1); | 315 return m->Int32Constant(-1); |
| 316 case 5: | 316 case 5: |
| 317 return m->Int32Constant(0xff); | 317 return m->Int32Constant(0xff); |
| 318 case 6: | 318 case 6: |
| 319 return m->Int32Constant(0x01234567); | 319 return m->Int32Constant(0x01234567); |
| 320 case 7: | 320 case 7: |
| 321 return m->Load(kMachInt32, m->PointerConstant(NULL)); | 321 return m->Load(MachineType::Int32(), m->PointerConstant(NULL)); |
| 322 default: | 322 default: |
| 323 return NULL; | 323 return NULL; |
| 324 } | 324 } |
| 325 } | 325 } |
| 326 | 326 |
| 327 | 327 |
| 328 TEST(CodeGenInt32Binop) { | 328 TEST(CodeGenInt32Binop) { |
| 329 RawMachineAssemblerTester<void> m; | 329 RawMachineAssemblerTester<void> m; |
| 330 | 330 |
| 331 const Operator* kOps[] = { | 331 const Operator* kOps[] = { |
| 332 m.machine()->Word32And(), m.machine()->Word32Or(), | 332 m.machine()->Word32And(), m.machine()->Word32Or(), |
| 333 m.machine()->Word32Xor(), m.machine()->Word32Shl(), | 333 m.machine()->Word32Xor(), m.machine()->Word32Shl(), |
| 334 m.machine()->Word32Shr(), m.machine()->Word32Sar(), | 334 m.machine()->Word32Shr(), m.machine()->Word32Sar(), |
| 335 m.machine()->Word32Equal(), m.machine()->Int32Add(), | 335 m.machine()->Word32Equal(), m.machine()->Int32Add(), |
| 336 m.machine()->Int32Sub(), m.machine()->Int32Mul(), | 336 m.machine()->Int32Sub(), m.machine()->Int32Mul(), |
| 337 m.machine()->Int32MulHigh(), m.machine()->Int32Div(), | 337 m.machine()->Int32MulHigh(), m.machine()->Int32Div(), |
| 338 m.machine()->Uint32Div(), m.machine()->Int32Mod(), | 338 m.machine()->Uint32Div(), m.machine()->Int32Mod(), |
| 339 m.machine()->Uint32Mod(), m.machine()->Uint32MulHigh(), | 339 m.machine()->Uint32Mod(), m.machine()->Uint32MulHigh(), |
| 340 m.machine()->Int32LessThan(), m.machine()->Int32LessThanOrEqual(), | 340 m.machine()->Int32LessThan(), m.machine()->Int32LessThanOrEqual(), |
| 341 m.machine()->Uint32LessThan(), m.machine()->Uint32LessThanOrEqual()}; | 341 m.machine()->Uint32LessThan(), m.machine()->Uint32LessThanOrEqual()}; |
| 342 | 342 |
| 343 for (size_t i = 0; i < arraysize(kOps); ++i) { | 343 for (size_t i = 0; i < arraysize(kOps); ++i) { |
| 344 for (int j = 0; j < 8; j++) { | 344 for (int j = 0; j < 8; j++) { |
| 345 for (int k = 0; k < 8; k++) { | 345 for (int k = 0; k < 8; k++) { |
| 346 RawMachineAssemblerTester<int32_t> m(kMachInt32, kMachInt32); | 346 RawMachineAssemblerTester<int32_t> m(MachineType::Int32(), |
| 347 MachineType::Int32()); |
| 347 Node* a = Int32Input(&m, j); | 348 Node* a = Int32Input(&m, j); |
| 348 Node* b = Int32Input(&m, k); | 349 Node* b = Int32Input(&m, k); |
| 349 m.Return(m.AddNode(kOps[i], a, b)); | 350 m.Return(m.AddNode(kOps[i], a, b)); |
| 350 m.GenerateCode(); | 351 m.GenerateCode(); |
| 351 } | 352 } |
| 352 } | 353 } |
| 353 } | 354 } |
| 354 } | 355 } |
| 355 | 356 |
| 356 | 357 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 372 return m->Int64Constant(0); | 373 return m->Int64Constant(0); |
| 373 case 3: | 374 case 3: |
| 374 return m->Int64Constant(1); | 375 return m->Int64Constant(1); |
| 375 case 4: | 376 case 4: |
| 376 return m->Int64Constant(-1); | 377 return m->Int64Constant(-1); |
| 377 case 5: | 378 case 5: |
| 378 return m->Int64Constant(0xff); | 379 return m->Int64Constant(0xff); |
| 379 case 6: | 380 case 6: |
| 380 return m->Int64Constant(0x0123456789abcdefLL); | 381 return m->Int64Constant(0x0123456789abcdefLL); |
| 381 case 7: | 382 case 7: |
| 382 return m->Load(kMachInt64, m->PointerConstant(NULL)); | 383 return m->Load(MachineType::Int64(), m->PointerConstant(NULL)); |
| 383 default: | 384 default: |
| 384 return NULL; | 385 return NULL; |
| 385 } | 386 } |
| 386 } | 387 } |
| 387 | 388 |
| 388 | 389 |
| 389 TEST(CodeGenInt64Binop) { | 390 TEST(CodeGenInt64Binop) { |
| 390 RawMachineAssemblerTester<void> m; | 391 RawMachineAssemblerTester<void> m; |
| 391 | 392 |
| 392 const Operator* kOps[] = { | 393 const Operator* kOps[] = { |
| 393 m.machine()->Word64And(), m.machine()->Word64Or(), | 394 m.machine()->Word64And(), m.machine()->Word64Or(), |
| 394 m.machine()->Word64Xor(), m.machine()->Word64Shl(), | 395 m.machine()->Word64Xor(), m.machine()->Word64Shl(), |
| 395 m.machine()->Word64Shr(), m.machine()->Word64Sar(), | 396 m.machine()->Word64Shr(), m.machine()->Word64Sar(), |
| 396 m.machine()->Word64Equal(), m.machine()->Int64Add(), | 397 m.machine()->Word64Equal(), m.machine()->Int64Add(), |
| 397 m.machine()->Int64Sub(), m.machine()->Int64Mul(), m.machine()->Int64Div(), | 398 m.machine()->Int64Sub(), m.machine()->Int64Mul(), m.machine()->Int64Div(), |
| 398 m.machine()->Uint64Div(), m.machine()->Int64Mod(), | 399 m.machine()->Uint64Div(), m.machine()->Int64Mod(), |
| 399 m.machine()->Uint64Mod(), m.machine()->Int64LessThan(), | 400 m.machine()->Uint64Mod(), m.machine()->Int64LessThan(), |
| 400 m.machine()->Int64LessThanOrEqual(), m.machine()->Uint64LessThan(), | 401 m.machine()->Int64LessThanOrEqual(), m.machine()->Uint64LessThan(), |
| 401 m.machine()->Uint64LessThanOrEqual()}; | 402 m.machine()->Uint64LessThanOrEqual()}; |
| 402 | 403 |
| 403 for (size_t i = 0; i < arraysize(kOps); ++i) { | 404 for (size_t i = 0; i < arraysize(kOps); ++i) { |
| 404 for (int j = 0; j < 8; j++) { | 405 for (int j = 0; j < 8; j++) { |
| 405 for (int k = 0; k < 8; k++) { | 406 for (int k = 0; k < 8; k++) { |
| 406 RawMachineAssemblerTester<int64_t> m(kMachInt64, kMachInt64); | 407 RawMachineAssemblerTester<int64_t> m(MachineType::Int64(), |
| 408 MachineType::Int64()); |
| 407 Node* a = Int64Input(&m, j); | 409 Node* a = Int64Input(&m, j); |
| 408 Node* b = Int64Input(&m, k); | 410 Node* b = Int64Input(&m, k); |
| 409 m.Return(m.AddNode(kOps[i], a, b)); | 411 m.Return(m.AddNode(kOps[i], a, b)); |
| 410 m.GenerateCode(); | 412 m.GenerateCode(); |
| 411 } | 413 } |
| 412 } | 414 } |
| 413 } | 415 } |
| 414 } | 416 } |
| 415 | 417 |
| 416 | 418 |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 491 m.Goto(&header); | 493 m.Goto(&header); |
| 492 m.Bind(&exit); | 494 m.Bind(&exit); |
| 493 m.Return(m.Int32Constant(constant)); | 495 m.Return(m.Int32Constant(constant)); |
| 494 | 496 |
| 495 CHECK_EQ(constant, m.Call()); | 497 CHECK_EQ(constant, m.Call()); |
| 496 } | 498 } |
| 497 | 499 |
| 498 | 500 |
| 499 template <typename R> | 501 template <typename R> |
| 500 static void BuildDiamondPhi(RawMachineAssemblerTester<R>* m, Node* cond_node, | 502 static void BuildDiamondPhi(RawMachineAssemblerTester<R>* m, Node* cond_node, |
| 501 MachineType type, Node* true_node, | 503 MachineRepresentation rep, Node* true_node, |
| 502 Node* false_node) { | 504 Node* false_node) { |
| 503 RawMachineLabel blocka, blockb, end; | 505 RawMachineLabel blocka, blockb, end; |
| 504 m->Branch(cond_node, &blocka, &blockb); | 506 m->Branch(cond_node, &blocka, &blockb); |
| 505 m->Bind(&blocka); | 507 m->Bind(&blocka); |
| 506 m->Goto(&end); | 508 m->Goto(&end); |
| 507 m->Bind(&blockb); | 509 m->Bind(&blockb); |
| 508 m->Goto(&end); | 510 m->Goto(&end); |
| 509 | 511 |
| 510 m->Bind(&end); | 512 m->Bind(&end); |
| 511 Node* phi = m->Phi(type, true_node, false_node); | 513 Node* phi = m->Phi(rep, true_node, false_node); |
| 512 m->Return(phi); | 514 m->Return(phi); |
| 513 } | 515 } |
| 514 | 516 |
| 515 | 517 |
| 516 TEST(RunDiamondPhiConst) { | 518 TEST(RunDiamondPhiConst) { |
| 517 RawMachineAssemblerTester<int32_t> m(kMachInt32); | 519 RawMachineAssemblerTester<int32_t> m(MachineType::Int32()); |
| 518 int false_val = 0xFF666; | 520 int false_val = 0xFF666; |
| 519 int true_val = 0x00DDD; | 521 int true_val = 0x00DDD; |
| 520 Node* true_node = m.Int32Constant(true_val); | 522 Node* true_node = m.Int32Constant(true_val); |
| 521 Node* false_node = m.Int32Constant(false_val); | 523 Node* false_node = m.Int32Constant(false_val); |
| 522 BuildDiamondPhi(&m, m.Parameter(0), kMachInt32, true_node, false_node); | 524 BuildDiamondPhi(&m, m.Parameter(0), MachineRepresentation::kWord32, true_node, |
| 525 false_node); |
| 523 CHECK_EQ(false_val, m.Call(0)); | 526 CHECK_EQ(false_val, m.Call(0)); |
| 524 CHECK_EQ(true_val, m.Call(1)); | 527 CHECK_EQ(true_val, m.Call(1)); |
| 525 } | 528 } |
| 526 | 529 |
| 527 | 530 |
| 528 TEST(RunDiamondPhiNumber) { | 531 TEST(RunDiamondPhiNumber) { |
| 529 RawMachineAssemblerTester<Object*> m(kMachInt32); | 532 RawMachineAssemblerTester<Object*> m(MachineType::Int32()); |
| 530 double false_val = -11.1; | 533 double false_val = -11.1; |
| 531 double true_val = 200.1; | 534 double true_val = 200.1; |
| 532 Node* true_node = m.NumberConstant(true_val); | 535 Node* true_node = m.NumberConstant(true_val); |
| 533 Node* false_node = m.NumberConstant(false_val); | 536 Node* false_node = m.NumberConstant(false_val); |
| 534 BuildDiamondPhi(&m, m.Parameter(0), kMachAnyTagged, true_node, false_node); | 537 BuildDiamondPhi(&m, m.Parameter(0), MachineRepresentation::kTagged, true_node, |
| 538 false_node); |
| 535 m.CheckNumber(false_val, m.Call(0)); | 539 m.CheckNumber(false_val, m.Call(0)); |
| 536 m.CheckNumber(true_val, m.Call(1)); | 540 m.CheckNumber(true_val, m.Call(1)); |
| 537 } | 541 } |
| 538 | 542 |
| 539 | 543 |
| 540 TEST(RunDiamondPhiString) { | 544 TEST(RunDiamondPhiString) { |
| 541 RawMachineAssemblerTester<Object*> m(kMachInt32); | 545 RawMachineAssemblerTester<Object*> m(MachineType::Int32()); |
| 542 const char* false_val = "false"; | 546 const char* false_val = "false"; |
| 543 const char* true_val = "true"; | 547 const char* true_val = "true"; |
| 544 Node* true_node = m.StringConstant(true_val); | 548 Node* true_node = m.StringConstant(true_val); |
| 545 Node* false_node = m.StringConstant(false_val); | 549 Node* false_node = m.StringConstant(false_val); |
| 546 BuildDiamondPhi(&m, m.Parameter(0), kMachAnyTagged, true_node, false_node); | 550 BuildDiamondPhi(&m, m.Parameter(0), MachineRepresentation::kTagged, true_node, |
| 551 false_node); |
| 547 m.CheckString(false_val, m.Call(0)); | 552 m.CheckString(false_val, m.Call(0)); |
| 548 m.CheckString(true_val, m.Call(1)); | 553 m.CheckString(true_val, m.Call(1)); |
| 549 } | 554 } |
| 550 | 555 |
| 551 | 556 |
| 552 TEST(RunDiamondPhiParam) { | 557 TEST(RunDiamondPhiParam) { |
| 553 RawMachineAssemblerTester<int32_t> m(kMachInt32, kMachInt32, kMachInt32); | 558 RawMachineAssemblerTester<int32_t> m( |
| 554 BuildDiamondPhi(&m, m.Parameter(0), kMachInt32, m.Parameter(1), | 559 MachineType::Int32(), MachineType::Int32(), MachineType::Int32()); |
| 555 m.Parameter(2)); | 560 BuildDiamondPhi(&m, m.Parameter(0), MachineRepresentation::kWord32, |
| 561 m.Parameter(1), m.Parameter(2)); |
| 556 int32_t c1 = 0x260cb75a; | 562 int32_t c1 = 0x260cb75a; |
| 557 int32_t c2 = 0xcd3e9c8b; | 563 int32_t c2 = 0xcd3e9c8b; |
| 558 int result = m.Call(0, c1, c2); | 564 int result = m.Call(0, c1, c2); |
| 559 CHECK_EQ(c2, result); | 565 CHECK_EQ(c2, result); |
| 560 result = m.Call(1, c1, c2); | 566 result = m.Call(1, c1, c2); |
| 561 CHECK_EQ(c1, result); | 567 CHECK_EQ(c1, result); |
| 562 } | 568 } |
| 563 | 569 |
| 564 | 570 |
| 565 TEST(RunLoopPhiConst) { | 571 TEST(RunLoopPhiConst) { |
| 566 RawMachineAssemblerTester<int32_t> m; | 572 RawMachineAssemblerTester<int32_t> m; |
| 567 int true_val = 0x44000; | 573 int true_val = 0x44000; |
| 568 int false_val = 0x00888; | 574 int false_val = 0x00888; |
| 569 | 575 |
| 570 Node* cond_node = m.Int32Constant(0); | 576 Node* cond_node = m.Int32Constant(0); |
| 571 Node* true_node = m.Int32Constant(true_val); | 577 Node* true_node = m.Int32Constant(true_val); |
| 572 Node* false_node = m.Int32Constant(false_val); | 578 Node* false_node = m.Int32Constant(false_val); |
| 573 | 579 |
| 574 // x = false_val; while(false) { x = true_val; } return x; | 580 // x = false_val; while(false) { x = true_val; } return x; |
| 575 RawMachineLabel body, header, end; | 581 RawMachineLabel body, header, end; |
| 576 | 582 |
| 577 m.Goto(&header); | 583 m.Goto(&header); |
| 578 m.Bind(&header); | 584 m.Bind(&header); |
| 579 Node* phi = m.Phi(kMachInt32, false_node, true_node); | 585 Node* phi = m.Phi(MachineRepresentation::kWord32, false_node, true_node); |
| 580 m.Branch(cond_node, &body, &end); | 586 m.Branch(cond_node, &body, &end); |
| 581 m.Bind(&body); | 587 m.Bind(&body); |
| 582 m.Goto(&header); | 588 m.Goto(&header); |
| 583 m.Bind(&end); | 589 m.Bind(&end); |
| 584 m.Return(phi); | 590 m.Return(phi); |
| 585 | 591 |
| 586 CHECK_EQ(false_val, m.Call()); | 592 CHECK_EQ(false_val, m.Call()); |
| 587 } | 593 } |
| 588 | 594 |
| 589 | 595 |
| 590 TEST(RunLoopPhiParam) { | 596 TEST(RunLoopPhiParam) { |
| 591 RawMachineAssemblerTester<int32_t> m(kMachInt32, kMachInt32, kMachInt32); | 597 RawMachineAssemblerTester<int32_t> m( |
| 598 MachineType::Int32(), MachineType::Int32(), MachineType::Int32()); |
| 592 | 599 |
| 593 RawMachineLabel blocka, blockb, end; | 600 RawMachineLabel blocka, blockb, end; |
| 594 | 601 |
| 595 m.Goto(&blocka); | 602 m.Goto(&blocka); |
| 596 | 603 |
| 597 m.Bind(&blocka); | 604 m.Bind(&blocka); |
| 598 Node* phi = m.Phi(kMachInt32, m.Parameter(1), m.Parameter(2)); | 605 Node* phi = |
| 599 Node* cond = m.Phi(kMachInt32, m.Parameter(0), m.Int32Constant(0)); | 606 m.Phi(MachineRepresentation::kWord32, m.Parameter(1), m.Parameter(2)); |
| 607 Node* cond = |
| 608 m.Phi(MachineRepresentation::kWord32, m.Parameter(0), m.Int32Constant(0)); |
| 600 m.Branch(cond, &blockb, &end); | 609 m.Branch(cond, &blockb, &end); |
| 601 | 610 |
| 602 m.Bind(&blockb); | 611 m.Bind(&blockb); |
| 603 m.Goto(&blocka); | 612 m.Goto(&blocka); |
| 604 | 613 |
| 605 m.Bind(&end); | 614 m.Bind(&end); |
| 606 m.Return(phi); | 615 m.Return(phi); |
| 607 | 616 |
| 608 int32_t c1 = 0xa81903b4; | 617 int32_t c1 = 0xa81903b4; |
| 609 int32_t c2 = 0x5a1207da; | 618 int32_t c2 = 0x5a1207da; |
| 610 int result = m.Call(0, c1, c2); | 619 int result = m.Call(0, c1, c2); |
| 611 CHECK_EQ(c1, result); | 620 CHECK_EQ(c1, result); |
| 612 result = m.Call(1, c1, c2); | 621 result = m.Call(1, c1, c2); |
| 613 CHECK_EQ(c2, result); | 622 CHECK_EQ(c2, result); |
| 614 } | 623 } |
| 615 | 624 |
| 616 | 625 |
| 617 TEST(RunLoopPhiInduction) { | 626 TEST(RunLoopPhiInduction) { |
| 618 RawMachineAssemblerTester<int32_t> m; | 627 RawMachineAssemblerTester<int32_t> m; |
| 619 | 628 |
| 620 int false_val = 0x10777; | 629 int false_val = 0x10777; |
| 621 | 630 |
| 622 // x = false_val; while(false) { x++; } return x; | 631 // x = false_val; while(false) { x++; } return x; |
| 623 RawMachineLabel header, body, end; | 632 RawMachineLabel header, body, end; |
| 624 Node* false_node = m.Int32Constant(false_val); | 633 Node* false_node = m.Int32Constant(false_val); |
| 625 | 634 |
| 626 m.Goto(&header); | 635 m.Goto(&header); |
| 627 | 636 |
| 628 m.Bind(&header); | 637 m.Bind(&header); |
| 629 Node* phi = m.Phi(kMachInt32, false_node, false_node); | 638 Node* phi = m.Phi(MachineRepresentation::kWord32, false_node, false_node); |
| 630 m.Branch(m.Int32Constant(0), &body, &end); | 639 m.Branch(m.Int32Constant(0), &body, &end); |
| 631 | 640 |
| 632 m.Bind(&body); | 641 m.Bind(&body); |
| 633 Node* add = m.Int32Add(phi, m.Int32Constant(1)); | 642 Node* add = m.Int32Add(phi, m.Int32Constant(1)); |
| 634 phi->ReplaceInput(1, add); | 643 phi->ReplaceInput(1, add); |
| 635 m.Goto(&header); | 644 m.Goto(&header); |
| 636 | 645 |
| 637 m.Bind(&end); | 646 m.Bind(&end); |
| 638 m.Return(phi); | 647 m.Return(phi); |
| 639 | 648 |
| 640 CHECK_EQ(false_val, m.Call()); | 649 CHECK_EQ(false_val, m.Call()); |
| 641 } | 650 } |
| 642 | 651 |
| 643 | 652 |
| 644 TEST(RunLoopIncrement) { | 653 TEST(RunLoopIncrement) { |
| 645 RawMachineAssemblerTester<int32_t> m; | 654 RawMachineAssemblerTester<int32_t> m; |
| 646 Int32BinopTester bt(&m); | 655 Int32BinopTester bt(&m); |
| 647 | 656 |
| 648 // x = 0; while(x ^ param) { x++; } return x; | 657 // x = 0; while(x ^ param) { x++; } return x; |
| 649 RawMachineLabel header, body, end; | 658 RawMachineLabel header, body, end; |
| 650 Node* zero = m.Int32Constant(0); | 659 Node* zero = m.Int32Constant(0); |
| 651 | 660 |
| 652 m.Goto(&header); | 661 m.Goto(&header); |
| 653 | 662 |
| 654 m.Bind(&header); | 663 m.Bind(&header); |
| 655 Node* phi = m.Phi(kMachInt32, zero, zero); | 664 Node* phi = m.Phi(MachineRepresentation::kWord32, zero, zero); |
| 656 m.Branch(m.WordXor(phi, bt.param0), &body, &end); | 665 m.Branch(m.WordXor(phi, bt.param0), &body, &end); |
| 657 | 666 |
| 658 m.Bind(&body); | 667 m.Bind(&body); |
| 659 phi->ReplaceInput(1, m.Int32Add(phi, m.Int32Constant(1))); | 668 phi->ReplaceInput(1, m.Int32Add(phi, m.Int32Constant(1))); |
| 660 m.Goto(&header); | 669 m.Goto(&header); |
| 661 | 670 |
| 662 m.Bind(&end); | 671 m.Bind(&end); |
| 663 bt.AddReturn(phi); | 672 bt.AddReturn(phi); |
| 664 | 673 |
| 665 CHECK_EQ(11, bt.call(11, 0)); | 674 CHECK_EQ(11, bt.call(11, 0)); |
| 666 CHECK_EQ(110, bt.call(110, 0)); | 675 CHECK_EQ(110, bt.call(110, 0)); |
| 667 CHECK_EQ(176, bt.call(176, 0)); | 676 CHECK_EQ(176, bt.call(176, 0)); |
| 668 } | 677 } |
| 669 | 678 |
| 670 | 679 |
| 671 TEST(RunLoopIncrement2) { | 680 TEST(RunLoopIncrement2) { |
| 672 RawMachineAssemblerTester<int32_t> m; | 681 RawMachineAssemblerTester<int32_t> m; |
| 673 Int32BinopTester bt(&m); | 682 Int32BinopTester bt(&m); |
| 674 | 683 |
| 675 // x = 0; while(x < param) { x++; } return x; | 684 // x = 0; while(x < param) { x++; } return x; |
| 676 RawMachineLabel header, body, end; | 685 RawMachineLabel header, body, end; |
| 677 Node* zero = m.Int32Constant(0); | 686 Node* zero = m.Int32Constant(0); |
| 678 | 687 |
| 679 m.Goto(&header); | 688 m.Goto(&header); |
| 680 | 689 |
| 681 m.Bind(&header); | 690 m.Bind(&header); |
| 682 Node* phi = m.Phi(kMachInt32, zero, zero); | 691 Node* phi = m.Phi(MachineRepresentation::kWord32, zero, zero); |
| 683 m.Branch(m.Int32LessThan(phi, bt.param0), &body, &end); | 692 m.Branch(m.Int32LessThan(phi, bt.param0), &body, &end); |
| 684 | 693 |
| 685 m.Bind(&body); | 694 m.Bind(&body); |
| 686 phi->ReplaceInput(1, m.Int32Add(phi, m.Int32Constant(1))); | 695 phi->ReplaceInput(1, m.Int32Add(phi, m.Int32Constant(1))); |
| 687 m.Goto(&header); | 696 m.Goto(&header); |
| 688 | 697 |
| 689 m.Bind(&end); | 698 m.Bind(&end); |
| 690 bt.AddReturn(phi); | 699 bt.AddReturn(phi); |
| 691 | 700 |
| 692 CHECK_EQ(11, bt.call(11, 0)); | 701 CHECK_EQ(11, bt.call(11, 0)); |
| 693 CHECK_EQ(110, bt.call(110, 0)); | 702 CHECK_EQ(110, bt.call(110, 0)); |
| 694 CHECK_EQ(176, bt.call(176, 0)); | 703 CHECK_EQ(176, bt.call(176, 0)); |
| 695 CHECK_EQ(0, bt.call(-200, 0)); | 704 CHECK_EQ(0, bt.call(-200, 0)); |
| 696 } | 705 } |
| 697 | 706 |
| 698 | 707 |
| 699 TEST(RunLoopIncrement3) { | 708 TEST(RunLoopIncrement3) { |
| 700 RawMachineAssemblerTester<int32_t> m; | 709 RawMachineAssemblerTester<int32_t> m; |
| 701 Int32BinopTester bt(&m); | 710 Int32BinopTester bt(&m); |
| 702 | 711 |
| 703 // x = 0; while(x < param) { x++; } return x; | 712 // x = 0; while(x < param) { x++; } return x; |
| 704 RawMachineLabel header, body, end; | 713 RawMachineLabel header, body, end; |
| 705 Node* zero = m.Int32Constant(0); | 714 Node* zero = m.Int32Constant(0); |
| 706 | 715 |
| 707 m.Goto(&header); | 716 m.Goto(&header); |
| 708 | 717 |
| 709 m.Bind(&header); | 718 m.Bind(&header); |
| 710 Node* phi = m.Phi(kMachInt32, zero, zero); | 719 Node* phi = m.Phi(MachineRepresentation::kWord32, zero, zero); |
| 711 m.Branch(m.Uint32LessThan(phi, bt.param0), &body, &end); | 720 m.Branch(m.Uint32LessThan(phi, bt.param0), &body, &end); |
| 712 | 721 |
| 713 m.Bind(&body); | 722 m.Bind(&body); |
| 714 phi->ReplaceInput(1, m.Int32Add(phi, m.Int32Constant(1))); | 723 phi->ReplaceInput(1, m.Int32Add(phi, m.Int32Constant(1))); |
| 715 m.Goto(&header); | 724 m.Goto(&header); |
| 716 | 725 |
| 717 m.Bind(&end); | 726 m.Bind(&end); |
| 718 bt.AddReturn(phi); | 727 bt.AddReturn(phi); |
| 719 | 728 |
| 720 CHECK_EQ(11, bt.call(11, 0)); | 729 CHECK_EQ(11, bt.call(11, 0)); |
| 721 CHECK_EQ(110, bt.call(110, 0)); | 730 CHECK_EQ(110, bt.call(110, 0)); |
| 722 CHECK_EQ(176, bt.call(176, 0)); | 731 CHECK_EQ(176, bt.call(176, 0)); |
| 723 CHECK_EQ(200, bt.call(200, 0)); | 732 CHECK_EQ(200, bt.call(200, 0)); |
| 724 } | 733 } |
| 725 | 734 |
| 726 | 735 |
| 727 TEST(RunLoopDecrement) { | 736 TEST(RunLoopDecrement) { |
| 728 RawMachineAssemblerTester<int32_t> m; | 737 RawMachineAssemblerTester<int32_t> m; |
| 729 Int32BinopTester bt(&m); | 738 Int32BinopTester bt(&m); |
| 730 | 739 |
| 731 // x = param; while(x) { x--; } return x; | 740 // x = param; while(x) { x--; } return x; |
| 732 RawMachineLabel header, body, end; | 741 RawMachineLabel header, body, end; |
| 733 | 742 |
| 734 m.Goto(&header); | 743 m.Goto(&header); |
| 735 | 744 |
| 736 m.Bind(&header); | 745 m.Bind(&header); |
| 737 Node* phi = m.Phi(kMachInt32, bt.param0, m.Int32Constant(0)); | 746 Node* phi = |
| 747 m.Phi(MachineRepresentation::kWord32, bt.param0, m.Int32Constant(0)); |
| 738 m.Branch(phi, &body, &end); | 748 m.Branch(phi, &body, &end); |
| 739 | 749 |
| 740 m.Bind(&body); | 750 m.Bind(&body); |
| 741 phi->ReplaceInput(1, m.Int32Sub(phi, m.Int32Constant(1))); | 751 phi->ReplaceInput(1, m.Int32Sub(phi, m.Int32Constant(1))); |
| 742 m.Goto(&header); | 752 m.Goto(&header); |
| 743 | 753 |
| 744 m.Bind(&end); | 754 m.Bind(&end); |
| 745 bt.AddReturn(phi); | 755 bt.AddReturn(phi); |
| 746 | 756 |
| 747 CHECK_EQ(0, bt.call(11, 0)); | 757 CHECK_EQ(0, bt.call(11, 0)); |
| 748 CHECK_EQ(0, bt.call(110, 0)); | 758 CHECK_EQ(0, bt.call(110, 0)); |
| 749 CHECK_EQ(0, bt.call(197, 0)); | 759 CHECK_EQ(0, bt.call(197, 0)); |
| 750 } | 760 } |
| 751 | 761 |
| 752 | 762 |
| 753 TEST(RunLoopIncrementFloat32) { | 763 TEST(RunLoopIncrementFloat32) { |
| 754 RawMachineAssemblerTester<int32_t> m; | 764 RawMachineAssemblerTester<int32_t> m; |
| 755 | 765 |
| 756 // x = -3.0f; while(x < 10f) { x = x + 0.5f; } return (int) (double) x; | 766 // x = -3.0f; while(x < 10f) { x = x + 0.5f; } return (int) (double) x; |
| 757 RawMachineLabel header, body, end; | 767 RawMachineLabel header, body, end; |
| 758 Node* minus_3 = m.Float32Constant(-3.0f); | 768 Node* minus_3 = m.Float32Constant(-3.0f); |
| 759 Node* ten = m.Float32Constant(10.0f); | 769 Node* ten = m.Float32Constant(10.0f); |
| 760 | 770 |
| 761 m.Goto(&header); | 771 m.Goto(&header); |
| 762 | 772 |
| 763 m.Bind(&header); | 773 m.Bind(&header); |
| 764 Node* phi = m.Phi(kMachFloat32, minus_3, ten); | 774 Node* phi = m.Phi(MachineRepresentation::kFloat32, minus_3, ten); |
| 765 m.Branch(m.Float32LessThan(phi, ten), &body, &end); | 775 m.Branch(m.Float32LessThan(phi, ten), &body, &end); |
| 766 | 776 |
| 767 m.Bind(&body); | 777 m.Bind(&body); |
| 768 phi->ReplaceInput(1, m.Float32Add(phi, m.Float32Constant(0.5f))); | 778 phi->ReplaceInput(1, m.Float32Add(phi, m.Float32Constant(0.5f))); |
| 769 m.Goto(&header); | 779 m.Goto(&header); |
| 770 | 780 |
| 771 m.Bind(&end); | 781 m.Bind(&end); |
| 772 m.Return(m.ChangeFloat64ToInt32(m.ChangeFloat32ToFloat64(phi))); | 782 m.Return(m.ChangeFloat64ToInt32(m.ChangeFloat32ToFloat64(phi))); |
| 773 | 783 |
| 774 CHECK_EQ(10, m.Call()); | 784 CHECK_EQ(10, m.Call()); |
| 775 } | 785 } |
| 776 | 786 |
| 777 | 787 |
| 778 TEST(RunLoopIncrementFloat64) { | 788 TEST(RunLoopIncrementFloat64) { |
| 779 RawMachineAssemblerTester<int32_t> m; | 789 RawMachineAssemblerTester<int32_t> m; |
| 780 | 790 |
| 781 // x = -3.0; while(x < 10) { x = x + 0.5; } return (int) x; | 791 // x = -3.0; while(x < 10) { x = x + 0.5; } return (int) x; |
| 782 RawMachineLabel header, body, end; | 792 RawMachineLabel header, body, end; |
| 783 Node* minus_3 = m.Float64Constant(-3.0); | 793 Node* minus_3 = m.Float64Constant(-3.0); |
| 784 Node* ten = m.Float64Constant(10.0); | 794 Node* ten = m.Float64Constant(10.0); |
| 785 | 795 |
| 786 m.Goto(&header); | 796 m.Goto(&header); |
| 787 | 797 |
| 788 m.Bind(&header); | 798 m.Bind(&header); |
| 789 Node* phi = m.Phi(kMachFloat64, minus_3, ten); | 799 Node* phi = m.Phi(MachineRepresentation::kFloat64, minus_3, ten); |
| 790 m.Branch(m.Float64LessThan(phi, ten), &body, &end); | 800 m.Branch(m.Float64LessThan(phi, ten), &body, &end); |
| 791 | 801 |
| 792 m.Bind(&body); | 802 m.Bind(&body); |
| 793 phi->ReplaceInput(1, m.Float64Add(phi, m.Float64Constant(0.5))); | 803 phi->ReplaceInput(1, m.Float64Add(phi, m.Float64Constant(0.5))); |
| 794 m.Goto(&header); | 804 m.Goto(&header); |
| 795 | 805 |
| 796 m.Bind(&end); | 806 m.Bind(&end); |
| 797 m.Return(m.ChangeFloat64ToInt32(phi)); | 807 m.Return(m.ChangeFloat64ToInt32(phi)); |
| 798 | 808 |
| 799 CHECK_EQ(10, m.Call()); | 809 CHECK_EQ(10, m.Call()); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 817 m.Bind(&def); | 827 m.Bind(&def); |
| 818 m.Goto(&end); | 828 m.Goto(&end); |
| 819 m.Bind(&end); | 829 m.Bind(&end); |
| 820 m.Return(m.Int32Constant(constant)); | 830 m.Return(m.Int32Constant(constant)); |
| 821 | 831 |
| 822 CHECK_EQ(constant, m.Call()); | 832 CHECK_EQ(constant, m.Call()); |
| 823 } | 833 } |
| 824 | 834 |
| 825 | 835 |
| 826 TEST(RunSwitch2) { | 836 TEST(RunSwitch2) { |
| 827 RawMachineAssemblerTester<int32_t> m(kMachInt32); | 837 RawMachineAssemblerTester<int32_t> m(MachineType::Int32()); |
| 828 | 838 |
| 829 RawMachineLabel blocka, blockb, blockc; | 839 RawMachineLabel blocka, blockb, blockc; |
| 830 RawMachineLabel* case_labels[] = {&blocka, &blockb}; | 840 RawMachineLabel* case_labels[] = {&blocka, &blockb}; |
| 831 int32_t case_values[] = {std::numeric_limits<int32_t>::min(), | 841 int32_t case_values[] = {std::numeric_limits<int32_t>::min(), |
| 832 std::numeric_limits<int32_t>::max()}; | 842 std::numeric_limits<int32_t>::max()}; |
| 833 m.Switch(m.Parameter(0), &blockc, case_values, case_labels, | 843 m.Switch(m.Parameter(0), &blockc, case_values, case_labels, |
| 834 arraysize(case_labels)); | 844 arraysize(case_labels)); |
| 835 m.Bind(&blocka); | 845 m.Bind(&blocka); |
| 836 m.Return(m.Int32Constant(-1)); | 846 m.Return(m.Int32Constant(-1)); |
| 837 m.Bind(&blockb); | 847 m.Bind(&blockb); |
| 838 m.Return(m.Int32Constant(1)); | 848 m.Return(m.Int32Constant(1)); |
| 839 m.Bind(&blockc); | 849 m.Bind(&blockc); |
| 840 m.Return(m.Int32Constant(0)); | 850 m.Return(m.Int32Constant(0)); |
| 841 | 851 |
| 842 CHECK_EQ(1, m.Call(std::numeric_limits<int32_t>::max())); | 852 CHECK_EQ(1, m.Call(std::numeric_limits<int32_t>::max())); |
| 843 CHECK_EQ(-1, m.Call(std::numeric_limits<int32_t>::min())); | 853 CHECK_EQ(-1, m.Call(std::numeric_limits<int32_t>::min())); |
| 844 for (int i = -100; i < 100; i += 25) { | 854 for (int i = -100; i < 100; i += 25) { |
| 845 CHECK_EQ(0, m.Call(i)); | 855 CHECK_EQ(0, m.Call(i)); |
| 846 } | 856 } |
| 847 } | 857 } |
| 848 | 858 |
| 849 | 859 |
| 850 TEST(RunSwitch3) { | 860 TEST(RunSwitch3) { |
| 851 RawMachineAssemblerTester<int32_t> m(kMachInt32); | 861 RawMachineAssemblerTester<int32_t> m(MachineType::Int32()); |
| 852 | 862 |
| 853 RawMachineLabel blocka, blockb, blockc; | 863 RawMachineLabel blocka, blockb, blockc; |
| 854 RawMachineLabel* case_labels[] = {&blocka, &blockb}; | 864 RawMachineLabel* case_labels[] = {&blocka, &blockb}; |
| 855 int32_t case_values[] = {std::numeric_limits<int32_t>::min() + 0, | 865 int32_t case_values[] = {std::numeric_limits<int32_t>::min() + 0, |
| 856 std::numeric_limits<int32_t>::min() + 1}; | 866 std::numeric_limits<int32_t>::min() + 1}; |
| 857 m.Switch(m.Parameter(0), &blockc, case_values, case_labels, | 867 m.Switch(m.Parameter(0), &blockc, case_values, case_labels, |
| 858 arraysize(case_labels)); | 868 arraysize(case_labels)); |
| 859 m.Bind(&blocka); | 869 m.Bind(&blocka); |
| 860 m.Return(m.Int32Constant(0)); | 870 m.Return(m.Int32Constant(0)); |
| 861 m.Bind(&blockb); | 871 m.Bind(&blockb); |
| 862 m.Return(m.Int32Constant(1)); | 872 m.Return(m.Int32Constant(1)); |
| 863 m.Bind(&blockc); | 873 m.Bind(&blockc); |
| 864 m.Return(m.Int32Constant(2)); | 874 m.Return(m.Int32Constant(2)); |
| 865 | 875 |
| 866 CHECK_EQ(0, m.Call(std::numeric_limits<int32_t>::min() + 0)); | 876 CHECK_EQ(0, m.Call(std::numeric_limits<int32_t>::min() + 0)); |
| 867 CHECK_EQ(1, m.Call(std::numeric_limits<int32_t>::min() + 1)); | 877 CHECK_EQ(1, m.Call(std::numeric_limits<int32_t>::min() + 1)); |
| 868 for (int i = -100; i < 100; i += 25) { | 878 for (int i = -100; i < 100; i += 25) { |
| 869 CHECK_EQ(2, m.Call(i)); | 879 CHECK_EQ(2, m.Call(i)); |
| 870 } | 880 } |
| 871 } | 881 } |
| 872 | 882 |
| 873 | 883 |
| 874 TEST(RunSwitch4) { | 884 TEST(RunSwitch4) { |
| 875 RawMachineAssemblerTester<int32_t> m(kMachInt32); | 885 RawMachineAssemblerTester<int32_t> m(MachineType::Int32()); |
| 876 | 886 |
| 877 const size_t kNumCases = 512; | 887 const size_t kNumCases = 512; |
| 878 const size_t kNumValues = kNumCases + 1; | 888 const size_t kNumValues = kNumCases + 1; |
| 879 int32_t values[kNumValues]; | 889 int32_t values[kNumValues]; |
| 880 m.main_isolate()->random_number_generator()->NextBytes(values, | 890 m.main_isolate()->random_number_generator()->NextBytes(values, |
| 881 sizeof(values)); | 891 sizeof(values)); |
| 882 RawMachineLabel end, def; | 892 RawMachineLabel end, def; |
| 883 int32_t case_values[kNumCases]; | 893 int32_t case_values[kNumCases]; |
| 884 RawMachineLabel* case_labels[kNumCases]; | 894 RawMachineLabel* case_labels[kNumCases]; |
| 885 Node* results[kNumValues]; | 895 Node* results[kNumValues]; |
| 886 for (size_t i = 0; i < kNumCases; ++i) { | 896 for (size_t i = 0; i < kNumCases; ++i) { |
| 887 case_values[i] = static_cast<int32_t>(i); | 897 case_values[i] = static_cast<int32_t>(i); |
| 888 case_labels[i] = | 898 case_labels[i] = |
| 889 new (m.main_zone()->New(sizeof(RawMachineLabel))) RawMachineLabel; | 899 new (m.main_zone()->New(sizeof(RawMachineLabel))) RawMachineLabel; |
| 890 } | 900 } |
| 891 m.Switch(m.Parameter(0), &def, case_values, case_labels, | 901 m.Switch(m.Parameter(0), &def, case_values, case_labels, |
| 892 arraysize(case_labels)); | 902 arraysize(case_labels)); |
| 893 for (size_t i = 0; i < kNumCases; ++i) { | 903 for (size_t i = 0; i < kNumCases; ++i) { |
| 894 m.Bind(case_labels[i]); | 904 m.Bind(case_labels[i]); |
| 895 results[i] = m.Int32Constant(values[i]); | 905 results[i] = m.Int32Constant(values[i]); |
| 896 m.Goto(&end); | 906 m.Goto(&end); |
| 897 } | 907 } |
| 898 m.Bind(&def); | 908 m.Bind(&def); |
| 899 results[kNumCases] = m.Int32Constant(values[kNumCases]); | 909 results[kNumCases] = m.Int32Constant(values[kNumCases]); |
| 900 m.Goto(&end); | 910 m.Goto(&end); |
| 901 m.Bind(&end); | 911 m.Bind(&end); |
| 902 const int num_results = static_cast<int>(arraysize(results)); | 912 const int num_results = static_cast<int>(arraysize(results)); |
| 903 Node* phi = | 913 Node* phi = |
| 904 m.AddNode(m.common()->Phi(kMachInt32, num_results), num_results, results); | 914 m.AddNode(m.common()->Phi(MachineRepresentation::kWord32, num_results), |
| 915 num_results, results); |
| 905 m.Return(phi); | 916 m.Return(phi); |
| 906 | 917 |
| 907 for (size_t i = 0; i < kNumValues; ++i) { | 918 for (size_t i = 0; i < kNumValues; ++i) { |
| 908 CHECK_EQ(values[i], m.Call(static_cast<int>(i))); | 919 CHECK_EQ(values[i], m.Call(static_cast<int>(i))); |
| 909 } | 920 } |
| 910 } | 921 } |
| 911 | 922 |
| 912 | 923 |
| 913 TEST(RunLoadInt32) { | 924 TEST(RunLoadInt32) { |
| 914 RawMachineAssemblerTester<int32_t> m; | 925 RawMachineAssemblerTester<int32_t> m; |
| 915 | 926 |
| 916 int32_t p1 = 0; // loads directly from this location. | 927 int32_t p1 = 0; // loads directly from this location. |
| 917 m.Return(m.LoadFromPointer(&p1, kMachInt32)); | 928 m.Return(m.LoadFromPointer(&p1, MachineType::Int32())); |
| 918 | 929 |
| 919 FOR_INT32_INPUTS(i) { | 930 FOR_INT32_INPUTS(i) { |
| 920 p1 = *i; | 931 p1 = *i; |
| 921 CHECK_EQ(p1, m.Call()); | 932 CHECK_EQ(p1, m.Call()); |
| 922 } | 933 } |
| 923 } | 934 } |
| 924 | 935 |
| 925 | 936 |
| 926 TEST(RunLoadInt32Offset) { | 937 TEST(RunLoadInt32Offset) { |
| 927 int32_t p1 = 0; // loads directly from this location. | 938 int32_t p1 = 0; // loads directly from this location. |
| 928 | 939 |
| 929 int32_t offsets[] = {-2000000, -100, -101, 1, 3, | 940 int32_t offsets[] = {-2000000, -100, -101, 1, 3, |
| 930 7, 120, 2000, 2000000000, 0xff}; | 941 7, 120, 2000, 2000000000, 0xff}; |
| 931 | 942 |
| 932 for (size_t i = 0; i < arraysize(offsets); i++) { | 943 for (size_t i = 0; i < arraysize(offsets); i++) { |
| 933 RawMachineAssemblerTester<int32_t> m; | 944 RawMachineAssemblerTester<int32_t> m; |
| 934 int32_t offset = offsets[i]; | 945 int32_t offset = offsets[i]; |
| 935 byte* pointer = reinterpret_cast<byte*>(&p1) - offset; | 946 byte* pointer = reinterpret_cast<byte*>(&p1) - offset; |
| 936 // generate load [#base + #index] | 947 // generate load [#base + #index] |
| 937 m.Return(m.LoadFromPointer(pointer, kMachInt32, offset)); | 948 m.Return(m.LoadFromPointer(pointer, MachineType::Int32(), offset)); |
| 938 | 949 |
| 939 FOR_INT32_INPUTS(j) { | 950 FOR_INT32_INPUTS(j) { |
| 940 p1 = *j; | 951 p1 = *j; |
| 941 CHECK_EQ(p1, m.Call()); | 952 CHECK_EQ(p1, m.Call()); |
| 942 } | 953 } |
| 943 } | 954 } |
| 944 } | 955 } |
| 945 | 956 |
| 946 | 957 |
| 947 TEST(RunLoadStoreFloat32Offset) { | 958 TEST(RunLoadStoreFloat32Offset) { |
| 948 float p1 = 0.0f; // loads directly from this location. | 959 float p1 = 0.0f; // loads directly from this location. |
| 949 float p2 = 0.0f; // and stores directly into this location. | 960 float p2 = 0.0f; // and stores directly into this location. |
| 950 | 961 |
| 951 FOR_INT32_INPUTS(i) { | 962 FOR_INT32_INPUTS(i) { |
| 952 int32_t magic = 0x2342aabb + *i * 3; | 963 int32_t magic = 0x2342aabb + *i * 3; |
| 953 RawMachineAssemblerTester<int32_t> m; | 964 RawMachineAssemblerTester<int32_t> m; |
| 954 int32_t offset = *i; | 965 int32_t offset = *i; |
| 955 byte* from = reinterpret_cast<byte*>(&p1) - offset; | 966 byte* from = reinterpret_cast<byte*>(&p1) - offset; |
| 956 byte* to = reinterpret_cast<byte*>(&p2) - offset; | 967 byte* to = reinterpret_cast<byte*>(&p2) - offset; |
| 957 // generate load [#base + #index] | 968 // generate load [#base + #index] |
| 958 Node* load = | 969 Node* load = m.Load(MachineType::Float32(), m.PointerConstant(from), |
| 959 m.Load(kMachFloat32, m.PointerConstant(from), m.IntPtrConstant(offset)); | 970 m.IntPtrConstant(offset)); |
| 960 m.Store(kMachFloat32, m.PointerConstant(to), m.IntPtrConstant(offset), load, | 971 m.Store(MachineType::Float32(), m.PointerConstant(to), |
| 961 kNoWriteBarrier); | 972 m.IntPtrConstant(offset), load, kNoWriteBarrier); |
| 962 m.Return(m.Int32Constant(magic)); | 973 m.Return(m.Int32Constant(magic)); |
| 963 | 974 |
| 964 FOR_FLOAT32_INPUTS(j) { | 975 FOR_FLOAT32_INPUTS(j) { |
| 965 p1 = *j; | 976 p1 = *j; |
| 966 p2 = *j - 5; | 977 p2 = *j - 5; |
| 967 CHECK_EQ(magic, m.Call()); | 978 CHECK_EQ(magic, m.Call()); |
| 968 CheckDoubleEq(p1, p2); | 979 CheckDoubleEq(p1, p2); |
| 969 } | 980 } |
| 970 } | 981 } |
| 971 } | 982 } |
| 972 | 983 |
| 973 | 984 |
| 974 TEST(RunLoadStoreFloat64Offset) { | 985 TEST(RunLoadStoreFloat64Offset) { |
| 975 double p1 = 0; // loads directly from this location. | 986 double p1 = 0; // loads directly from this location. |
| 976 double p2 = 0; // and stores directly into this location. | 987 double p2 = 0; // and stores directly into this location. |
| 977 | 988 |
| 978 FOR_INT32_INPUTS(i) { | 989 FOR_INT32_INPUTS(i) { |
| 979 int32_t magic = 0x2342aabb + *i * 3; | 990 int32_t magic = 0x2342aabb + *i * 3; |
| 980 RawMachineAssemblerTester<int32_t> m; | 991 RawMachineAssemblerTester<int32_t> m; |
| 981 int32_t offset = *i; | 992 int32_t offset = *i; |
| 982 byte* from = reinterpret_cast<byte*>(&p1) - offset; | 993 byte* from = reinterpret_cast<byte*>(&p1) - offset; |
| 983 byte* to = reinterpret_cast<byte*>(&p2) - offset; | 994 byte* to = reinterpret_cast<byte*>(&p2) - offset; |
| 984 // generate load [#base + #index] | 995 // generate load [#base + #index] |
| 985 Node* load = | 996 Node* load = m.Load(MachineType::Float64(), m.PointerConstant(from), |
| 986 m.Load(kMachFloat64, m.PointerConstant(from), m.IntPtrConstant(offset)); | 997 m.IntPtrConstant(offset)); |
| 987 m.Store(kMachFloat64, m.PointerConstant(to), m.IntPtrConstant(offset), load, | 998 m.Store(MachineType::Float64(), m.PointerConstant(to), |
| 988 kNoWriteBarrier); | 999 m.IntPtrConstant(offset), load, kNoWriteBarrier); |
| 989 m.Return(m.Int32Constant(magic)); | 1000 m.Return(m.Int32Constant(magic)); |
| 990 | 1001 |
| 991 FOR_FLOAT64_INPUTS(j) { | 1002 FOR_FLOAT64_INPUTS(j) { |
| 992 p1 = *j; | 1003 p1 = *j; |
| 993 p2 = *j - 5; | 1004 p2 = *j - 5; |
| 994 CHECK_EQ(magic, m.Call()); | 1005 CHECK_EQ(magic, m.Call()); |
| 995 CheckDoubleEq(p1, p2); | 1006 CheckDoubleEq(p1, p2); |
| 996 } | 1007 } |
| 997 } | 1008 } |
| 998 } | 1009 } |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1009 // Use uint32_t because signed overflow is UB in C. | 1020 // Use uint32_t because signed overflow is UB in C. |
| 1010 int expected = static_cast<int32_t>(*i + *j); | 1021 int expected = static_cast<int32_t>(*i + *j); |
| 1011 CHECK_EQ(expected, bt.call(*i, *j)); | 1022 CHECK_EQ(expected, bt.call(*i, *j)); |
| 1012 } | 1023 } |
| 1013 } | 1024 } |
| 1014 } | 1025 } |
| 1015 | 1026 |
| 1016 | 1027 |
| 1017 TEST(RunInt32AddAndWord32EqualP) { | 1028 TEST(RunInt32AddAndWord32EqualP) { |
| 1018 { | 1029 { |
| 1019 RawMachineAssemblerTester<int32_t> m(kMachInt32, kMachInt32, kMachInt32); | 1030 RawMachineAssemblerTester<int32_t> m( |
| 1031 MachineType::Int32(), MachineType::Int32(), MachineType::Int32()); |
| 1020 m.Return(m.Int32Add(m.Parameter(0), | 1032 m.Return(m.Int32Add(m.Parameter(0), |
| 1021 m.Word32Equal(m.Parameter(1), m.Parameter(2)))); | 1033 m.Word32Equal(m.Parameter(1), m.Parameter(2)))); |
| 1022 FOR_INT32_INPUTS(i) { | 1034 FOR_INT32_INPUTS(i) { |
| 1023 FOR_INT32_INPUTS(j) { | 1035 FOR_INT32_INPUTS(j) { |
| 1024 FOR_INT32_INPUTS(k) { | 1036 FOR_INT32_INPUTS(k) { |
| 1025 // Use uint32_t because signed overflow is UB in C. | 1037 // Use uint32_t because signed overflow is UB in C. |
| 1026 int32_t const expected = | 1038 int32_t const expected = |
| 1027 bit_cast<int32_t>(bit_cast<uint32_t>(*i) + (*j == *k)); | 1039 bit_cast<int32_t>(bit_cast<uint32_t>(*i) + (*j == *k)); |
| 1028 CHECK_EQ(expected, m.Call(*i, *j, *k)); | 1040 CHECK_EQ(expected, m.Call(*i, *j, *k)); |
| 1029 } | 1041 } |
| 1030 } | 1042 } |
| 1031 } | 1043 } |
| 1032 } | 1044 } |
| 1033 { | 1045 { |
| 1034 RawMachineAssemblerTester<int32_t> m(kMachInt32, kMachInt32, kMachInt32); | 1046 RawMachineAssemblerTester<int32_t> m( |
| 1047 MachineType::Int32(), MachineType::Int32(), MachineType::Int32()); |
| 1035 m.Return(m.Int32Add(m.Word32Equal(m.Parameter(0), m.Parameter(1)), | 1048 m.Return(m.Int32Add(m.Word32Equal(m.Parameter(0), m.Parameter(1)), |
| 1036 m.Parameter(2))); | 1049 m.Parameter(2))); |
| 1037 FOR_INT32_INPUTS(i) { | 1050 FOR_INT32_INPUTS(i) { |
| 1038 FOR_INT32_INPUTS(j) { | 1051 FOR_INT32_INPUTS(j) { |
| 1039 FOR_INT32_INPUTS(k) { | 1052 FOR_INT32_INPUTS(k) { |
| 1040 // Use uint32_t because signed overflow is UB in C. | 1053 // Use uint32_t because signed overflow is UB in C. |
| 1041 int32_t const expected = | 1054 int32_t const expected = |
| 1042 bit_cast<int32_t>((*i == *j) + bit_cast<uint32_t>(*k)); | 1055 bit_cast<int32_t>((*i == *j) + bit_cast<uint32_t>(*k)); |
| 1043 CHECK_EQ(expected, m.Call(*i, *j, *k)); | 1056 CHECK_EQ(expected, m.Call(*i, *j, *k)); |
| 1044 } | 1057 } |
| 1045 } | 1058 } |
| 1046 } | 1059 } |
| 1047 } | 1060 } |
| 1048 } | 1061 } |
| 1049 | 1062 |
| 1050 | 1063 |
| 1051 TEST(RunInt32AddAndWord32EqualImm) { | 1064 TEST(RunInt32AddAndWord32EqualImm) { |
| 1052 { | 1065 { |
| 1053 FOR_INT32_INPUTS(i) { | 1066 FOR_INT32_INPUTS(i) { |
| 1054 RawMachineAssemblerTester<int32_t> m(kMachInt32, kMachInt32); | 1067 RawMachineAssemblerTester<int32_t> m(MachineType::Int32(), |
| 1068 MachineType::Int32()); |
| 1055 m.Return(m.Int32Add(m.Int32Constant(*i), | 1069 m.Return(m.Int32Add(m.Int32Constant(*i), |
| 1056 m.Word32Equal(m.Parameter(0), m.Parameter(1)))); | 1070 m.Word32Equal(m.Parameter(0), m.Parameter(1)))); |
| 1057 FOR_INT32_INPUTS(j) { | 1071 FOR_INT32_INPUTS(j) { |
| 1058 FOR_INT32_INPUTS(k) { | 1072 FOR_INT32_INPUTS(k) { |
| 1059 // Use uint32_t because signed overflow is UB in C. | 1073 // Use uint32_t because signed overflow is UB in C. |
| 1060 int32_t const expected = | 1074 int32_t const expected = |
| 1061 bit_cast<int32_t>(bit_cast<uint32_t>(*i) + (*j == *k)); | 1075 bit_cast<int32_t>(bit_cast<uint32_t>(*i) + (*j == *k)); |
| 1062 CHECK_EQ(expected, m.Call(*j, *k)); | 1076 CHECK_EQ(expected, m.Call(*j, *k)); |
| 1063 } | 1077 } |
| 1064 } | 1078 } |
| 1065 } | 1079 } |
| 1066 } | 1080 } |
| 1067 { | 1081 { |
| 1068 FOR_INT32_INPUTS(i) { | 1082 FOR_INT32_INPUTS(i) { |
| 1069 RawMachineAssemblerTester<int32_t> m(kMachInt32, kMachInt32); | 1083 RawMachineAssemblerTester<int32_t> m(MachineType::Int32(), |
| 1084 MachineType::Int32()); |
| 1070 m.Return(m.Int32Add(m.Word32Equal(m.Int32Constant(*i), m.Parameter(0)), | 1085 m.Return(m.Int32Add(m.Word32Equal(m.Int32Constant(*i), m.Parameter(0)), |
| 1071 m.Parameter(1))); | 1086 m.Parameter(1))); |
| 1072 FOR_INT32_INPUTS(j) { | 1087 FOR_INT32_INPUTS(j) { |
| 1073 FOR_INT32_INPUTS(k) { | 1088 FOR_INT32_INPUTS(k) { |
| 1074 // Use uint32_t because signed overflow is UB in C. | 1089 // Use uint32_t because signed overflow is UB in C. |
| 1075 int32_t const expected = | 1090 int32_t const expected = |
| 1076 bit_cast<int32_t>((*i == *j) + bit_cast<uint32_t>(*k)); | 1091 bit_cast<int32_t>((*i == *j) + bit_cast<uint32_t>(*k)); |
| 1077 CHECK_EQ(expected, m.Call(*j, *k)); | 1092 CHECK_EQ(expected, m.Call(*j, *k)); |
| 1078 } | 1093 } |
| 1079 } | 1094 } |
| 1080 } | 1095 } |
| 1081 } | 1096 } |
| 1082 } | 1097 } |
| 1083 | 1098 |
| 1084 | 1099 |
| 1085 TEST(RunInt32AddAndWord32NotEqualP) { | 1100 TEST(RunInt32AddAndWord32NotEqualP) { |
| 1086 { | 1101 { |
| 1087 RawMachineAssemblerTester<int32_t> m(kMachInt32, kMachInt32, kMachInt32); | 1102 RawMachineAssemblerTester<int32_t> m( |
| 1103 MachineType::Int32(), MachineType::Int32(), MachineType::Int32()); |
| 1088 m.Return(m.Int32Add(m.Parameter(0), | 1104 m.Return(m.Int32Add(m.Parameter(0), |
| 1089 m.Word32NotEqual(m.Parameter(1), m.Parameter(2)))); | 1105 m.Word32NotEqual(m.Parameter(1), m.Parameter(2)))); |
| 1090 FOR_INT32_INPUTS(i) { | 1106 FOR_INT32_INPUTS(i) { |
| 1091 FOR_INT32_INPUTS(j) { | 1107 FOR_INT32_INPUTS(j) { |
| 1092 FOR_INT32_INPUTS(k) { | 1108 FOR_INT32_INPUTS(k) { |
| 1093 // Use uint32_t because signed overflow is UB in C. | 1109 // Use uint32_t because signed overflow is UB in C. |
| 1094 int32_t const expected = | 1110 int32_t const expected = |
| 1095 bit_cast<int32_t>(bit_cast<uint32_t>(*i) + (*j != *k)); | 1111 bit_cast<int32_t>(bit_cast<uint32_t>(*i) + (*j != *k)); |
| 1096 CHECK_EQ(expected, m.Call(*i, *j, *k)); | 1112 CHECK_EQ(expected, m.Call(*i, *j, *k)); |
| 1097 } | 1113 } |
| 1098 } | 1114 } |
| 1099 } | 1115 } |
| 1100 } | 1116 } |
| 1101 { | 1117 { |
| 1102 RawMachineAssemblerTester<int32_t> m(kMachInt32, kMachInt32, kMachInt32); | 1118 RawMachineAssemblerTester<int32_t> m( |
| 1119 MachineType::Int32(), MachineType::Int32(), MachineType::Int32()); |
| 1103 m.Return(m.Int32Add(m.Word32NotEqual(m.Parameter(0), m.Parameter(1)), | 1120 m.Return(m.Int32Add(m.Word32NotEqual(m.Parameter(0), m.Parameter(1)), |
| 1104 m.Parameter(2))); | 1121 m.Parameter(2))); |
| 1105 FOR_INT32_INPUTS(i) { | 1122 FOR_INT32_INPUTS(i) { |
| 1106 FOR_INT32_INPUTS(j) { | 1123 FOR_INT32_INPUTS(j) { |
| 1107 FOR_INT32_INPUTS(k) { | 1124 FOR_INT32_INPUTS(k) { |
| 1108 // Use uint32_t because signed overflow is UB in C. | 1125 // Use uint32_t because signed overflow is UB in C. |
| 1109 int32_t const expected = | 1126 int32_t const expected = |
| 1110 bit_cast<int32_t>((*i != *j) + bit_cast<uint32_t>(*k)); | 1127 bit_cast<int32_t>((*i != *j) + bit_cast<uint32_t>(*k)); |
| 1111 CHECK_EQ(expected, m.Call(*i, *j, *k)); | 1128 CHECK_EQ(expected, m.Call(*i, *j, *k)); |
| 1112 } | 1129 } |
| 1113 } | 1130 } |
| 1114 } | 1131 } |
| 1115 } | 1132 } |
| 1116 } | 1133 } |
| 1117 | 1134 |
| 1118 | 1135 |
| 1119 TEST(RunInt32AddAndWord32NotEqualImm) { | 1136 TEST(RunInt32AddAndWord32NotEqualImm) { |
| 1120 { | 1137 { |
| 1121 FOR_INT32_INPUTS(i) { | 1138 FOR_INT32_INPUTS(i) { |
| 1122 RawMachineAssemblerTester<int32_t> m(kMachInt32, kMachInt32); | 1139 RawMachineAssemblerTester<int32_t> m(MachineType::Int32(), |
| 1140 MachineType::Int32()); |
| 1123 m.Return(m.Int32Add(m.Int32Constant(*i), | 1141 m.Return(m.Int32Add(m.Int32Constant(*i), |
| 1124 m.Word32NotEqual(m.Parameter(0), m.Parameter(1)))); | 1142 m.Word32NotEqual(m.Parameter(0), m.Parameter(1)))); |
| 1125 FOR_INT32_INPUTS(j) { | 1143 FOR_INT32_INPUTS(j) { |
| 1126 FOR_INT32_INPUTS(k) { | 1144 FOR_INT32_INPUTS(k) { |
| 1127 // Use uint32_t because signed overflow is UB in C. | 1145 // Use uint32_t because signed overflow is UB in C. |
| 1128 int32_t const expected = | 1146 int32_t const expected = |
| 1129 bit_cast<int32_t>(bit_cast<uint32_t>(*i) + (*j != *k)); | 1147 bit_cast<int32_t>(bit_cast<uint32_t>(*i) + (*j != *k)); |
| 1130 CHECK_EQ(expected, m.Call(*j, *k)); | 1148 CHECK_EQ(expected, m.Call(*j, *k)); |
| 1131 } | 1149 } |
| 1132 } | 1150 } |
| 1133 } | 1151 } |
| 1134 } | 1152 } |
| 1135 { | 1153 { |
| 1136 FOR_INT32_INPUTS(i) { | 1154 FOR_INT32_INPUTS(i) { |
| 1137 RawMachineAssemblerTester<int32_t> m(kMachInt32, kMachInt32); | 1155 RawMachineAssemblerTester<int32_t> m(MachineType::Int32(), |
| 1156 MachineType::Int32()); |
| 1138 m.Return(m.Int32Add(m.Word32NotEqual(m.Int32Constant(*i), m.Parameter(0)), | 1157 m.Return(m.Int32Add(m.Word32NotEqual(m.Int32Constant(*i), m.Parameter(0)), |
| 1139 m.Parameter(1))); | 1158 m.Parameter(1))); |
| 1140 FOR_INT32_INPUTS(j) { | 1159 FOR_INT32_INPUTS(j) { |
| 1141 FOR_INT32_INPUTS(k) { | 1160 FOR_INT32_INPUTS(k) { |
| 1142 // Use uint32_t because signed overflow is UB in C. | 1161 // Use uint32_t because signed overflow is UB in C. |
| 1143 int32_t const expected = | 1162 int32_t const expected = |
| 1144 bit_cast<int32_t>((*i != *j) + bit_cast<uint32_t>(*k)); | 1163 bit_cast<int32_t>((*i != *j) + bit_cast<uint32_t>(*k)); |
| 1145 CHECK_EQ(expected, m.Call(*j, *k)); | 1164 CHECK_EQ(expected, m.Call(*j, *k)); |
| 1146 } | 1165 } |
| 1147 } | 1166 } |
| 1148 } | 1167 } |
| 1149 } | 1168 } |
| 1150 } | 1169 } |
| 1151 | 1170 |
| 1152 | 1171 |
| 1153 TEST(RunInt32AddAndWord32SarP) { | 1172 TEST(RunInt32AddAndWord32SarP) { |
| 1154 { | 1173 { |
| 1155 RawMachineAssemblerTester<int32_t> m(kMachUint32, kMachInt32, kMachUint32); | 1174 RawMachineAssemblerTester<int32_t> m( |
| 1175 MachineType::Uint32(), MachineType::Int32(), MachineType::Uint32()); |
| 1156 m.Return(m.Int32Add(m.Parameter(0), | 1176 m.Return(m.Int32Add(m.Parameter(0), |
| 1157 m.Word32Sar(m.Parameter(1), m.Parameter(2)))); | 1177 m.Word32Sar(m.Parameter(1), m.Parameter(2)))); |
| 1158 FOR_UINT32_INPUTS(i) { | 1178 FOR_UINT32_INPUTS(i) { |
| 1159 FOR_INT32_INPUTS(j) { | 1179 FOR_INT32_INPUTS(j) { |
| 1160 FOR_UINT32_SHIFTS(shift) { | 1180 FOR_UINT32_SHIFTS(shift) { |
| 1161 // Use uint32_t because signed overflow is UB in C. | 1181 // Use uint32_t because signed overflow is UB in C. |
| 1162 int32_t expected = *i + (*j >> shift); | 1182 int32_t expected = *i + (*j >> shift); |
| 1163 CHECK_EQ(expected, m.Call(*i, *j, shift)); | 1183 CHECK_EQ(expected, m.Call(*i, *j, shift)); |
| 1164 } | 1184 } |
| 1165 } | 1185 } |
| 1166 } | 1186 } |
| 1167 } | 1187 } |
| 1168 { | 1188 { |
| 1169 RawMachineAssemblerTester<int32_t> m(kMachInt32, kMachUint32, kMachUint32); | 1189 RawMachineAssemblerTester<int32_t> m( |
| 1190 MachineType::Int32(), MachineType::Uint32(), MachineType::Uint32()); |
| 1170 m.Return(m.Int32Add(m.Word32Sar(m.Parameter(0), m.Parameter(1)), | 1191 m.Return(m.Int32Add(m.Word32Sar(m.Parameter(0), m.Parameter(1)), |
| 1171 m.Parameter(2))); | 1192 m.Parameter(2))); |
| 1172 FOR_INT32_INPUTS(i) { | 1193 FOR_INT32_INPUTS(i) { |
| 1173 FOR_UINT32_SHIFTS(shift) { | 1194 FOR_UINT32_SHIFTS(shift) { |
| 1174 FOR_UINT32_INPUTS(k) { | 1195 FOR_UINT32_INPUTS(k) { |
| 1175 // Use uint32_t because signed overflow is UB in C. | 1196 // Use uint32_t because signed overflow is UB in C. |
| 1176 int32_t expected = (*i >> shift) + *k; | 1197 int32_t expected = (*i >> shift) + *k; |
| 1177 CHECK_EQ(expected, m.Call(*i, shift, *k)); | 1198 CHECK_EQ(expected, m.Call(*i, shift, *k)); |
| 1178 } | 1199 } |
| 1179 } | 1200 } |
| 1180 } | 1201 } |
| 1181 } | 1202 } |
| 1182 } | 1203 } |
| 1183 | 1204 |
| 1184 | 1205 |
| 1185 TEST(RunInt32AddAndWord32ShlP) { | 1206 TEST(RunInt32AddAndWord32ShlP) { |
| 1186 { | 1207 { |
| 1187 RawMachineAssemblerTester<int32_t> m(kMachUint32, kMachInt32, kMachUint32); | 1208 RawMachineAssemblerTester<int32_t> m( |
| 1209 MachineType::Uint32(), MachineType::Int32(), MachineType::Uint32()); |
| 1188 m.Return(m.Int32Add(m.Parameter(0), | 1210 m.Return(m.Int32Add(m.Parameter(0), |
| 1189 m.Word32Shl(m.Parameter(1), m.Parameter(2)))); | 1211 m.Word32Shl(m.Parameter(1), m.Parameter(2)))); |
| 1190 FOR_UINT32_INPUTS(i) { | 1212 FOR_UINT32_INPUTS(i) { |
| 1191 FOR_INT32_INPUTS(j) { | 1213 FOR_INT32_INPUTS(j) { |
| 1192 FOR_UINT32_SHIFTS(shift) { | 1214 FOR_UINT32_SHIFTS(shift) { |
| 1193 // Use uint32_t because signed overflow is UB in C. | 1215 // Use uint32_t because signed overflow is UB in C. |
| 1194 int32_t expected = *i + (*j << shift); | 1216 int32_t expected = *i + (*j << shift); |
| 1195 CHECK_EQ(expected, m.Call(*i, *j, shift)); | 1217 CHECK_EQ(expected, m.Call(*i, *j, shift)); |
| 1196 } | 1218 } |
| 1197 } | 1219 } |
| 1198 } | 1220 } |
| 1199 } | 1221 } |
| 1200 { | 1222 { |
| 1201 RawMachineAssemblerTester<int32_t> m(kMachInt32, kMachUint32, kMachUint32); | 1223 RawMachineAssemblerTester<int32_t> m( |
| 1224 MachineType::Int32(), MachineType::Uint32(), MachineType::Uint32()); |
| 1202 m.Return(m.Int32Add(m.Word32Shl(m.Parameter(0), m.Parameter(1)), | 1225 m.Return(m.Int32Add(m.Word32Shl(m.Parameter(0), m.Parameter(1)), |
| 1203 m.Parameter(2))); | 1226 m.Parameter(2))); |
| 1204 FOR_INT32_INPUTS(i) { | 1227 FOR_INT32_INPUTS(i) { |
| 1205 FOR_UINT32_SHIFTS(shift) { | 1228 FOR_UINT32_SHIFTS(shift) { |
| 1206 FOR_UINT32_INPUTS(k) { | 1229 FOR_UINT32_INPUTS(k) { |
| 1207 // Use uint32_t because signed overflow is UB in C. | 1230 // Use uint32_t because signed overflow is UB in C. |
| 1208 int32_t expected = (*i << shift) + *k; | 1231 int32_t expected = (*i << shift) + *k; |
| 1209 CHECK_EQ(expected, m.Call(*i, shift, *k)); | 1232 CHECK_EQ(expected, m.Call(*i, shift, *k)); |
| 1210 } | 1233 } |
| 1211 } | 1234 } |
| 1212 } | 1235 } |
| 1213 } | 1236 } |
| 1214 } | 1237 } |
| 1215 | 1238 |
| 1216 | 1239 |
| 1217 TEST(RunInt32AddAndWord32ShrP) { | 1240 TEST(RunInt32AddAndWord32ShrP) { |
| 1218 { | 1241 { |
| 1219 RawMachineAssemblerTester<int32_t> m(kMachUint32, kMachUint32, kMachUint32); | 1242 RawMachineAssemblerTester<int32_t> m( |
| 1243 MachineType::Uint32(), MachineType::Uint32(), MachineType::Uint32()); |
| 1220 m.Return(m.Int32Add(m.Parameter(0), | 1244 m.Return(m.Int32Add(m.Parameter(0), |
| 1221 m.Word32Shr(m.Parameter(1), m.Parameter(2)))); | 1245 m.Word32Shr(m.Parameter(1), m.Parameter(2)))); |
| 1222 FOR_UINT32_INPUTS(i) { | 1246 FOR_UINT32_INPUTS(i) { |
| 1223 FOR_UINT32_INPUTS(j) { | 1247 FOR_UINT32_INPUTS(j) { |
| 1224 FOR_UINT32_SHIFTS(shift) { | 1248 FOR_UINT32_SHIFTS(shift) { |
| 1225 // Use uint32_t because signed overflow is UB in C. | 1249 // Use uint32_t because signed overflow is UB in C. |
| 1226 int32_t expected = *i + (*j >> shift); | 1250 int32_t expected = *i + (*j >> shift); |
| 1227 CHECK_EQ(expected, m.Call(*i, *j, shift)); | 1251 CHECK_EQ(expected, m.Call(*i, *j, shift)); |
| 1228 } | 1252 } |
| 1229 } | 1253 } |
| 1230 } | 1254 } |
| 1231 } | 1255 } |
| 1232 { | 1256 { |
| 1233 RawMachineAssemblerTester<int32_t> m(kMachUint32, kMachUint32, kMachUint32); | 1257 RawMachineAssemblerTester<int32_t> m( |
| 1258 MachineType::Uint32(), MachineType::Uint32(), MachineType::Uint32()); |
| 1234 m.Return(m.Int32Add(m.Word32Shr(m.Parameter(0), m.Parameter(1)), | 1259 m.Return(m.Int32Add(m.Word32Shr(m.Parameter(0), m.Parameter(1)), |
| 1235 m.Parameter(2))); | 1260 m.Parameter(2))); |
| 1236 FOR_UINT32_INPUTS(i) { | 1261 FOR_UINT32_INPUTS(i) { |
| 1237 FOR_UINT32_SHIFTS(shift) { | 1262 FOR_UINT32_SHIFTS(shift) { |
| 1238 FOR_UINT32_INPUTS(k) { | 1263 FOR_UINT32_INPUTS(k) { |
| 1239 // Use uint32_t because signed overflow is UB in C. | 1264 // Use uint32_t because signed overflow is UB in C. |
| 1240 int32_t expected = (*i >> shift) + *k; | 1265 int32_t expected = (*i >> shift) + *k; |
| 1241 CHECK_EQ(expected, m.Call(*i, shift, *k)); | 1266 CHECK_EQ(expected, m.Call(*i, shift, *k)); |
| 1242 } | 1267 } |
| 1243 } | 1268 } |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1279 bt.AddReturn(m.Int32Constant(0 - constant)); | 1304 bt.AddReturn(m.Int32Constant(0 - constant)); |
| 1280 FOR_UINT32_INPUTS(i) { | 1305 FOR_UINT32_INPUTS(i) { |
| 1281 FOR_UINT32_INPUTS(j) { | 1306 FOR_UINT32_INPUTS(j) { |
| 1282 int32_t expected = (*i + *j) != 0 ? constant : 0 - constant; | 1307 int32_t expected = (*i + *j) != 0 ? constant : 0 - constant; |
| 1283 CHECK_EQ(expected, bt.call(*i, *j)); | 1308 CHECK_EQ(expected, bt.call(*i, *j)); |
| 1284 } | 1309 } |
| 1285 } | 1310 } |
| 1286 } | 1311 } |
| 1287 { | 1312 { |
| 1288 FOR_UINT32_INPUTS(i) { | 1313 FOR_UINT32_INPUTS(i) { |
| 1289 RawMachineAssemblerTester<uint32_t> m(kMachUint32); | 1314 RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32()); |
| 1290 RawMachineLabel blocka, blockb; | 1315 RawMachineLabel blocka, blockb; |
| 1291 m.Branch(m.Word32Equal(m.Int32Add(m.Int32Constant(*i), m.Parameter(0)), | 1316 m.Branch(m.Word32Equal(m.Int32Add(m.Int32Constant(*i), m.Parameter(0)), |
| 1292 m.Int32Constant(0)), | 1317 m.Int32Constant(0)), |
| 1293 &blocka, &blockb); | 1318 &blocka, &blockb); |
| 1294 m.Bind(&blocka); | 1319 m.Bind(&blocka); |
| 1295 m.Return(m.Int32Constant(constant)); | 1320 m.Return(m.Int32Constant(constant)); |
| 1296 m.Bind(&blockb); | 1321 m.Bind(&blockb); |
| 1297 m.Return(m.Int32Constant(0 - constant)); | 1322 m.Return(m.Int32Constant(0 - constant)); |
| 1298 FOR_UINT32_INPUTS(j) { | 1323 FOR_UINT32_INPUTS(j) { |
| 1299 uint32_t expected = (*i + *j) == 0 ? constant : 0 - constant; | 1324 uint32_t expected = (*i + *j) == 0 ? constant : 0 - constant; |
| 1300 CHECK_EQ(expected, m.Call(*j)); | 1325 CHECK_EQ(expected, m.Call(*j)); |
| 1301 } | 1326 } |
| 1302 } | 1327 } |
| 1303 } | 1328 } |
| 1304 { | 1329 { |
| 1305 FOR_UINT32_INPUTS(i) { | 1330 FOR_UINT32_INPUTS(i) { |
| 1306 RawMachineAssemblerTester<uint32_t> m(kMachUint32); | 1331 RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32()); |
| 1307 RawMachineLabel blocka, blockb; | 1332 RawMachineLabel blocka, blockb; |
| 1308 m.Branch(m.Word32NotEqual(m.Int32Add(m.Int32Constant(*i), m.Parameter(0)), | 1333 m.Branch(m.Word32NotEqual(m.Int32Add(m.Int32Constant(*i), m.Parameter(0)), |
| 1309 m.Int32Constant(0)), | 1334 m.Int32Constant(0)), |
| 1310 &blocka, &blockb); | 1335 &blocka, &blockb); |
| 1311 m.Bind(&blocka); | 1336 m.Bind(&blocka); |
| 1312 m.Return(m.Int32Constant(constant)); | 1337 m.Return(m.Int32Constant(constant)); |
| 1313 m.Bind(&blockb); | 1338 m.Bind(&blockb); |
| 1314 m.Return(m.Int32Constant(0 - constant)); | 1339 m.Return(m.Int32Constant(0 - constant)); |
| 1315 FOR_UINT32_INPUTS(j) { | 1340 FOR_UINT32_INPUTS(j) { |
| 1316 uint32_t expected = (*i + *j) != 0 ? constant : 0 - constant; | 1341 uint32_t expected = (*i + *j) != 0 ? constant : 0 - constant; |
| 1317 CHECK_EQ(expected, m.Call(*j)); | 1342 CHECK_EQ(expected, m.Call(*j)); |
| 1318 } | 1343 } |
| 1319 } | 1344 } |
| 1320 } | 1345 } |
| 1321 { | 1346 { |
| 1322 RawMachineAssemblerTester<void> m; | 1347 RawMachineAssemblerTester<void> m; |
| 1323 const Operator* shops[] = {m.machine()->Word32Sar(), | 1348 const Operator* shops[] = {m.machine()->Word32Sar(), |
| 1324 m.machine()->Word32Shl(), | 1349 m.machine()->Word32Shl(), |
| 1325 m.machine()->Word32Shr()}; | 1350 m.machine()->Word32Shr()}; |
| 1326 for (size_t n = 0; n < arraysize(shops); n++) { | 1351 for (size_t n = 0; n < arraysize(shops); n++) { |
| 1327 RawMachineAssemblerTester<int32_t> m(kMachUint32, kMachInt32, | 1352 RawMachineAssemblerTester<int32_t> m( |
| 1328 kMachUint32); | 1353 MachineType::Uint32(), MachineType::Int32(), MachineType::Uint32()); |
| 1329 RawMachineLabel blocka, blockb; | 1354 RawMachineLabel blocka, blockb; |
| 1330 m.Branch(m.Word32Equal(m.Int32Add(m.Parameter(0), | 1355 m.Branch(m.Word32Equal(m.Int32Add(m.Parameter(0), |
| 1331 m.AddNode(shops[n], m.Parameter(1), | 1356 m.AddNode(shops[n], m.Parameter(1), |
| 1332 m.Parameter(2))), | 1357 m.Parameter(2))), |
| 1333 m.Int32Constant(0)), | 1358 m.Int32Constant(0)), |
| 1334 &blocka, &blockb); | 1359 &blocka, &blockb); |
| 1335 m.Bind(&blocka); | 1360 m.Bind(&blocka); |
| 1336 m.Return(m.Int32Constant(constant)); | 1361 m.Return(m.Int32Constant(constant)); |
| 1337 m.Bind(&blockb); | 1362 m.Bind(&blockb); |
| 1338 m.Return(m.Int32Constant(0 - constant)); | 1363 m.Return(m.Int32Constant(0 - constant)); |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1383 m.Word32Equal(m.Int32Constant(0), m.Int32Add(bt.param0, bt.param1))); | 1408 m.Word32Equal(m.Int32Constant(0), m.Int32Add(bt.param0, bt.param1))); |
| 1384 FOR_UINT32_INPUTS(i) { | 1409 FOR_UINT32_INPUTS(i) { |
| 1385 FOR_UINT32_INPUTS(j) { | 1410 FOR_UINT32_INPUTS(j) { |
| 1386 uint32_t expected = (*i + *j) == 0; | 1411 uint32_t expected = (*i + *j) == 0; |
| 1387 CHECK_EQ(expected, bt.call(*i, *j)); | 1412 CHECK_EQ(expected, bt.call(*i, *j)); |
| 1388 } | 1413 } |
| 1389 } | 1414 } |
| 1390 } | 1415 } |
| 1391 { | 1416 { |
| 1392 FOR_UINT32_INPUTS(i) { | 1417 FOR_UINT32_INPUTS(i) { |
| 1393 RawMachineAssemblerTester<uint32_t> m(kMachUint32); | 1418 RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32()); |
| 1394 m.Return(m.Word32Equal(m.Int32Add(m.Int32Constant(*i), m.Parameter(0)), | 1419 m.Return(m.Word32Equal(m.Int32Add(m.Int32Constant(*i), m.Parameter(0)), |
| 1395 m.Int32Constant(0))); | 1420 m.Int32Constant(0))); |
| 1396 FOR_UINT32_INPUTS(j) { | 1421 FOR_UINT32_INPUTS(j) { |
| 1397 uint32_t expected = (*i + *j) == 0; | 1422 uint32_t expected = (*i + *j) == 0; |
| 1398 CHECK_EQ(expected, m.Call(*j)); | 1423 CHECK_EQ(expected, m.Call(*j)); |
| 1399 } | 1424 } |
| 1400 } | 1425 } |
| 1401 } | 1426 } |
| 1402 { | 1427 { |
| 1403 FOR_UINT32_INPUTS(i) { | 1428 FOR_UINT32_INPUTS(i) { |
| 1404 RawMachineAssemblerTester<uint32_t> m(kMachUint32); | 1429 RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32()); |
| 1405 m.Return(m.Word32Equal(m.Int32Add(m.Parameter(0), m.Int32Constant(*i)), | 1430 m.Return(m.Word32Equal(m.Int32Add(m.Parameter(0), m.Int32Constant(*i)), |
| 1406 m.Int32Constant(0))); | 1431 m.Int32Constant(0))); |
| 1407 FOR_UINT32_INPUTS(j) { | 1432 FOR_UINT32_INPUTS(j) { |
| 1408 uint32_t expected = (*j + *i) == 0; | 1433 uint32_t expected = (*j + *i) == 0; |
| 1409 CHECK_EQ(expected, m.Call(*j)); | 1434 CHECK_EQ(expected, m.Call(*j)); |
| 1410 } | 1435 } |
| 1411 } | 1436 } |
| 1412 } | 1437 } |
| 1413 { | 1438 { |
| 1414 RawMachineAssemblerTester<void> m; | 1439 RawMachineAssemblerTester<void> m; |
| 1415 const Operator* shops[] = {m.machine()->Word32Sar(), | 1440 const Operator* shops[] = {m.machine()->Word32Sar(), |
| 1416 m.machine()->Word32Shl(), | 1441 m.machine()->Word32Shl(), |
| 1417 m.machine()->Word32Shr()}; | 1442 m.machine()->Word32Shr()}; |
| 1418 for (size_t n = 0; n < arraysize(shops); n++) { | 1443 for (size_t n = 0; n < arraysize(shops); n++) { |
| 1419 RawMachineAssemblerTester<int32_t> m(kMachUint32, kMachInt32, | 1444 RawMachineAssemblerTester<int32_t> m( |
| 1420 kMachUint32); | 1445 MachineType::Uint32(), MachineType::Int32(), MachineType::Uint32()); |
| 1421 m.Return(m.Word32Equal( | 1446 m.Return(m.Word32Equal( |
| 1422 m.Int32Add(m.Parameter(0), | 1447 m.Int32Add(m.Parameter(0), |
| 1423 m.AddNode(shops[n], m.Parameter(1), m.Parameter(2))), | 1448 m.AddNode(shops[n], m.Parameter(1), m.Parameter(2))), |
| 1424 m.Int32Constant(0))); | 1449 m.Int32Constant(0))); |
| 1425 FOR_UINT32_INPUTS(i) { | 1450 FOR_UINT32_INPUTS(i) { |
| 1426 FOR_INT32_INPUTS(j) { | 1451 FOR_INT32_INPUTS(j) { |
| 1427 FOR_UINT32_SHIFTS(shift) { | 1452 FOR_UINT32_SHIFTS(shift) { |
| 1428 int32_t right; | 1453 int32_t right; |
| 1429 switch (shops[n]->opcode()) { | 1454 switch (shops[n]->opcode()) { |
| 1430 default: | 1455 default: |
| (...skipping 29 matching lines...) Expand all Loading... |
| 1460 uint32_t expected = static_cast<int32_t>(*i - *j); | 1485 uint32_t expected = static_cast<int32_t>(*i - *j); |
| 1461 CHECK_EQ(expected, bt.call(*i, *j)); | 1486 CHECK_EQ(expected, bt.call(*i, *j)); |
| 1462 } | 1487 } |
| 1463 } | 1488 } |
| 1464 } | 1489 } |
| 1465 | 1490 |
| 1466 | 1491 |
| 1467 TEST(RunInt32SubImm) { | 1492 TEST(RunInt32SubImm) { |
| 1468 { | 1493 { |
| 1469 FOR_UINT32_INPUTS(i) { | 1494 FOR_UINT32_INPUTS(i) { |
| 1470 RawMachineAssemblerTester<uint32_t> m(kMachUint32); | 1495 RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32()); |
| 1471 m.Return(m.Int32Sub(m.Int32Constant(*i), m.Parameter(0))); | 1496 m.Return(m.Int32Sub(m.Int32Constant(*i), m.Parameter(0))); |
| 1472 FOR_UINT32_INPUTS(j) { | 1497 FOR_UINT32_INPUTS(j) { |
| 1473 uint32_t expected = *i - *j; | 1498 uint32_t expected = *i - *j; |
| 1474 CHECK_EQ(expected, m.Call(*j)); | 1499 CHECK_EQ(expected, m.Call(*j)); |
| 1475 } | 1500 } |
| 1476 } | 1501 } |
| 1477 } | 1502 } |
| 1478 { | 1503 { |
| 1479 FOR_UINT32_INPUTS(i) { | 1504 FOR_UINT32_INPUTS(i) { |
| 1480 RawMachineAssemblerTester<uint32_t> m(kMachUint32); | 1505 RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32()); |
| 1481 m.Return(m.Int32Sub(m.Parameter(0), m.Int32Constant(*i))); | 1506 m.Return(m.Int32Sub(m.Parameter(0), m.Int32Constant(*i))); |
| 1482 FOR_UINT32_INPUTS(j) { | 1507 FOR_UINT32_INPUTS(j) { |
| 1483 uint32_t expected = *j - *i; | 1508 uint32_t expected = *j - *i; |
| 1484 CHECK_EQ(expected, m.Call(*j)); | 1509 CHECK_EQ(expected, m.Call(*j)); |
| 1485 } | 1510 } |
| 1486 } | 1511 } |
| 1487 } | 1512 } |
| 1488 } | 1513 } |
| 1489 | 1514 |
| 1490 | 1515 |
| 1491 TEST(RunInt32SubAndWord32SarP) { | 1516 TEST(RunInt32SubAndWord32SarP) { |
| 1492 { | 1517 { |
| 1493 RawMachineAssemblerTester<int32_t> m(kMachUint32, kMachInt32, kMachUint32); | 1518 RawMachineAssemblerTester<int32_t> m( |
| 1519 MachineType::Uint32(), MachineType::Int32(), MachineType::Uint32()); |
| 1494 m.Return(m.Int32Sub(m.Parameter(0), | 1520 m.Return(m.Int32Sub(m.Parameter(0), |
| 1495 m.Word32Sar(m.Parameter(1), m.Parameter(2)))); | 1521 m.Word32Sar(m.Parameter(1), m.Parameter(2)))); |
| 1496 FOR_UINT32_INPUTS(i) { | 1522 FOR_UINT32_INPUTS(i) { |
| 1497 FOR_INT32_INPUTS(j) { | 1523 FOR_INT32_INPUTS(j) { |
| 1498 FOR_UINT32_SHIFTS(shift) { | 1524 FOR_UINT32_SHIFTS(shift) { |
| 1499 int32_t expected = *i - (*j >> shift); | 1525 int32_t expected = *i - (*j >> shift); |
| 1500 CHECK_EQ(expected, m.Call(*i, *j, shift)); | 1526 CHECK_EQ(expected, m.Call(*i, *j, shift)); |
| 1501 } | 1527 } |
| 1502 } | 1528 } |
| 1503 } | 1529 } |
| 1504 } | 1530 } |
| 1505 { | 1531 { |
| 1506 RawMachineAssemblerTester<int32_t> m(kMachInt32, kMachUint32, kMachUint32); | 1532 RawMachineAssemblerTester<int32_t> m( |
| 1533 MachineType::Int32(), MachineType::Uint32(), MachineType::Uint32()); |
| 1507 m.Return(m.Int32Sub(m.Word32Sar(m.Parameter(0), m.Parameter(1)), | 1534 m.Return(m.Int32Sub(m.Word32Sar(m.Parameter(0), m.Parameter(1)), |
| 1508 m.Parameter(2))); | 1535 m.Parameter(2))); |
| 1509 FOR_INT32_INPUTS(i) { | 1536 FOR_INT32_INPUTS(i) { |
| 1510 FOR_UINT32_SHIFTS(shift) { | 1537 FOR_UINT32_SHIFTS(shift) { |
| 1511 FOR_UINT32_INPUTS(k) { | 1538 FOR_UINT32_INPUTS(k) { |
| 1512 int32_t expected = (*i >> shift) - *k; | 1539 int32_t expected = (*i >> shift) - *k; |
| 1513 CHECK_EQ(expected, m.Call(*i, shift, *k)); | 1540 CHECK_EQ(expected, m.Call(*i, shift, *k)); |
| 1514 } | 1541 } |
| 1515 } | 1542 } |
| 1516 } | 1543 } |
| 1517 } | 1544 } |
| 1518 } | 1545 } |
| 1519 | 1546 |
| 1520 | 1547 |
| 1521 TEST(RunInt32SubAndWord32ShlP) { | 1548 TEST(RunInt32SubAndWord32ShlP) { |
| 1522 { | 1549 { |
| 1523 RawMachineAssemblerTester<int32_t> m(kMachUint32, kMachInt32, kMachUint32); | 1550 RawMachineAssemblerTester<int32_t> m( |
| 1551 MachineType::Uint32(), MachineType::Int32(), MachineType::Uint32()); |
| 1524 m.Return(m.Int32Sub(m.Parameter(0), | 1552 m.Return(m.Int32Sub(m.Parameter(0), |
| 1525 m.Word32Shl(m.Parameter(1), m.Parameter(2)))); | 1553 m.Word32Shl(m.Parameter(1), m.Parameter(2)))); |
| 1526 FOR_UINT32_INPUTS(i) { | 1554 FOR_UINT32_INPUTS(i) { |
| 1527 FOR_INT32_INPUTS(j) { | 1555 FOR_INT32_INPUTS(j) { |
| 1528 FOR_UINT32_SHIFTS(shift) { | 1556 FOR_UINT32_SHIFTS(shift) { |
| 1529 int32_t expected = *i - (*j << shift); | 1557 int32_t expected = *i - (*j << shift); |
| 1530 CHECK_EQ(expected, m.Call(*i, *j, shift)); | 1558 CHECK_EQ(expected, m.Call(*i, *j, shift)); |
| 1531 } | 1559 } |
| 1532 } | 1560 } |
| 1533 } | 1561 } |
| 1534 } | 1562 } |
| 1535 { | 1563 { |
| 1536 RawMachineAssemblerTester<int32_t> m(kMachInt32, kMachUint32, kMachUint32); | 1564 RawMachineAssemblerTester<int32_t> m( |
| 1565 MachineType::Int32(), MachineType::Uint32(), MachineType::Uint32()); |
| 1537 m.Return(m.Int32Sub(m.Word32Shl(m.Parameter(0), m.Parameter(1)), | 1566 m.Return(m.Int32Sub(m.Word32Shl(m.Parameter(0), m.Parameter(1)), |
| 1538 m.Parameter(2))); | 1567 m.Parameter(2))); |
| 1539 FOR_INT32_INPUTS(i) { | 1568 FOR_INT32_INPUTS(i) { |
| 1540 FOR_UINT32_SHIFTS(shift) { | 1569 FOR_UINT32_SHIFTS(shift) { |
| 1541 FOR_UINT32_INPUTS(k) { | 1570 FOR_UINT32_INPUTS(k) { |
| 1542 // Use uint32_t because signed overflow is UB in C. | 1571 // Use uint32_t because signed overflow is UB in C. |
| 1543 int32_t expected = (*i << shift) - *k; | 1572 int32_t expected = (*i << shift) - *k; |
| 1544 CHECK_EQ(expected, m.Call(*i, shift, *k)); | 1573 CHECK_EQ(expected, m.Call(*i, shift, *k)); |
| 1545 } | 1574 } |
| 1546 } | 1575 } |
| 1547 } | 1576 } |
| 1548 } | 1577 } |
| 1549 } | 1578 } |
| 1550 | 1579 |
| 1551 | 1580 |
| 1552 TEST(RunInt32SubAndWord32ShrP) { | 1581 TEST(RunInt32SubAndWord32ShrP) { |
| 1553 { | 1582 { |
| 1554 RawMachineAssemblerTester<uint32_t> m(kMachUint32, kMachUint32, | 1583 RawMachineAssemblerTester<uint32_t> m( |
| 1555 kMachUint32); | 1584 MachineType::Uint32(), MachineType::Uint32(), MachineType::Uint32()); |
| 1556 m.Return(m.Int32Sub(m.Parameter(0), | 1585 m.Return(m.Int32Sub(m.Parameter(0), |
| 1557 m.Word32Shr(m.Parameter(1), m.Parameter(2)))); | 1586 m.Word32Shr(m.Parameter(1), m.Parameter(2)))); |
| 1558 FOR_UINT32_INPUTS(i) { | 1587 FOR_UINT32_INPUTS(i) { |
| 1559 FOR_UINT32_INPUTS(j) { | 1588 FOR_UINT32_INPUTS(j) { |
| 1560 FOR_UINT32_SHIFTS(shift) { | 1589 FOR_UINT32_SHIFTS(shift) { |
| 1561 // Use uint32_t because signed overflow is UB in C. | 1590 // Use uint32_t because signed overflow is UB in C. |
| 1562 uint32_t expected = *i - (*j >> shift); | 1591 uint32_t expected = *i - (*j >> shift); |
| 1563 CHECK_EQ(expected, m.Call(*i, *j, shift)); | 1592 CHECK_EQ(expected, m.Call(*i, *j, shift)); |
| 1564 } | 1593 } |
| 1565 } | 1594 } |
| 1566 } | 1595 } |
| 1567 } | 1596 } |
| 1568 { | 1597 { |
| 1569 RawMachineAssemblerTester<uint32_t> m(kMachUint32, kMachUint32, | 1598 RawMachineAssemblerTester<uint32_t> m( |
| 1570 kMachUint32); | 1599 MachineType::Uint32(), MachineType::Uint32(), MachineType::Uint32()); |
| 1571 m.Return(m.Int32Sub(m.Word32Shr(m.Parameter(0), m.Parameter(1)), | 1600 m.Return(m.Int32Sub(m.Word32Shr(m.Parameter(0), m.Parameter(1)), |
| 1572 m.Parameter(2))); | 1601 m.Parameter(2))); |
| 1573 FOR_UINT32_INPUTS(i) { | 1602 FOR_UINT32_INPUTS(i) { |
| 1574 FOR_UINT32_SHIFTS(shift) { | 1603 FOR_UINT32_SHIFTS(shift) { |
| 1575 FOR_UINT32_INPUTS(k) { | 1604 FOR_UINT32_INPUTS(k) { |
| 1576 // Use uint32_t because signed overflow is UB in C. | 1605 // Use uint32_t because signed overflow is UB in C. |
| 1577 uint32_t expected = (*i >> shift) - *k; | 1606 uint32_t expected = (*i >> shift) - *k; |
| 1578 CHECK_EQ(expected, m.Call(*i, shift, *k)); | 1607 CHECK_EQ(expected, m.Call(*i, shift, *k)); |
| 1579 } | 1608 } |
| 1580 } | 1609 } |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1616 bt.AddReturn(m.Int32Constant(0 - constant)); | 1645 bt.AddReturn(m.Int32Constant(0 - constant)); |
| 1617 FOR_UINT32_INPUTS(i) { | 1646 FOR_UINT32_INPUTS(i) { |
| 1618 FOR_UINT32_INPUTS(j) { | 1647 FOR_UINT32_INPUTS(j) { |
| 1619 int32_t expected = (*i - *j) != 0 ? constant : 0 - constant; | 1648 int32_t expected = (*i - *j) != 0 ? constant : 0 - constant; |
| 1620 CHECK_EQ(expected, bt.call(*i, *j)); | 1649 CHECK_EQ(expected, bt.call(*i, *j)); |
| 1621 } | 1650 } |
| 1622 } | 1651 } |
| 1623 } | 1652 } |
| 1624 { | 1653 { |
| 1625 FOR_UINT32_INPUTS(i) { | 1654 FOR_UINT32_INPUTS(i) { |
| 1626 RawMachineAssemblerTester<uint32_t> m(kMachUint32); | 1655 RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32()); |
| 1627 RawMachineLabel blocka, blockb; | 1656 RawMachineLabel blocka, blockb; |
| 1628 m.Branch(m.Word32Equal(m.Int32Sub(m.Int32Constant(*i), m.Parameter(0)), | 1657 m.Branch(m.Word32Equal(m.Int32Sub(m.Int32Constant(*i), m.Parameter(0)), |
| 1629 m.Int32Constant(0)), | 1658 m.Int32Constant(0)), |
| 1630 &blocka, &blockb); | 1659 &blocka, &blockb); |
| 1631 m.Bind(&blocka); | 1660 m.Bind(&blocka); |
| 1632 m.Return(m.Int32Constant(constant)); | 1661 m.Return(m.Int32Constant(constant)); |
| 1633 m.Bind(&blockb); | 1662 m.Bind(&blockb); |
| 1634 m.Return(m.Int32Constant(0 - constant)); | 1663 m.Return(m.Int32Constant(0 - constant)); |
| 1635 FOR_UINT32_INPUTS(j) { | 1664 FOR_UINT32_INPUTS(j) { |
| 1636 uint32_t expected = (*i - *j) == 0 ? constant : 0 - constant; | 1665 uint32_t expected = (*i - *j) == 0 ? constant : 0 - constant; |
| 1637 CHECK_EQ(expected, m.Call(*j)); | 1666 CHECK_EQ(expected, m.Call(*j)); |
| 1638 } | 1667 } |
| 1639 } | 1668 } |
| 1640 } | 1669 } |
| 1641 { | 1670 { |
| 1642 FOR_UINT32_INPUTS(i) { | 1671 FOR_UINT32_INPUTS(i) { |
| 1643 RawMachineAssemblerTester<int32_t> m(kMachUint32); | 1672 RawMachineAssemblerTester<int32_t> m(MachineType::Uint32()); |
| 1644 RawMachineLabel blocka, blockb; | 1673 RawMachineLabel blocka, blockb; |
| 1645 m.Branch(m.Word32NotEqual(m.Int32Sub(m.Int32Constant(*i), m.Parameter(0)), | 1674 m.Branch(m.Word32NotEqual(m.Int32Sub(m.Int32Constant(*i), m.Parameter(0)), |
| 1646 m.Int32Constant(0)), | 1675 m.Int32Constant(0)), |
| 1647 &blocka, &blockb); | 1676 &blocka, &blockb); |
| 1648 m.Bind(&blocka); | 1677 m.Bind(&blocka); |
| 1649 m.Return(m.Int32Constant(constant)); | 1678 m.Return(m.Int32Constant(constant)); |
| 1650 m.Bind(&blockb); | 1679 m.Bind(&blockb); |
| 1651 m.Return(m.Int32Constant(0 - constant)); | 1680 m.Return(m.Int32Constant(0 - constant)); |
| 1652 FOR_UINT32_INPUTS(j) { | 1681 FOR_UINT32_INPUTS(j) { |
| 1653 int32_t expected = (*i - *j) != 0 ? constant : 0 - constant; | 1682 int32_t expected = (*i - *j) != 0 ? constant : 0 - constant; |
| 1654 CHECK_EQ(expected, m.Call(*j)); | 1683 CHECK_EQ(expected, m.Call(*j)); |
| 1655 } | 1684 } |
| 1656 } | 1685 } |
| 1657 } | 1686 } |
| 1658 { | 1687 { |
| 1659 RawMachineAssemblerTester<void> m; | 1688 RawMachineAssemblerTester<void> m; |
| 1660 const Operator* shops[] = {m.machine()->Word32Sar(), | 1689 const Operator* shops[] = {m.machine()->Word32Sar(), |
| 1661 m.machine()->Word32Shl(), | 1690 m.machine()->Word32Shl(), |
| 1662 m.machine()->Word32Shr()}; | 1691 m.machine()->Word32Shr()}; |
| 1663 for (size_t n = 0; n < arraysize(shops); n++) { | 1692 for (size_t n = 0; n < arraysize(shops); n++) { |
| 1664 RawMachineAssemblerTester<int32_t> m(kMachUint32, kMachInt32, | 1693 RawMachineAssemblerTester<int32_t> m( |
| 1665 kMachUint32); | 1694 MachineType::Uint32(), MachineType::Int32(), MachineType::Uint32()); |
| 1666 RawMachineLabel blocka, blockb; | 1695 RawMachineLabel blocka, blockb; |
| 1667 m.Branch(m.Word32Equal(m.Int32Sub(m.Parameter(0), | 1696 m.Branch(m.Word32Equal(m.Int32Sub(m.Parameter(0), |
| 1668 m.AddNode(shops[n], m.Parameter(1), | 1697 m.AddNode(shops[n], m.Parameter(1), |
| 1669 m.Parameter(2))), | 1698 m.Parameter(2))), |
| 1670 m.Int32Constant(0)), | 1699 m.Int32Constant(0)), |
| 1671 &blocka, &blockb); | 1700 &blocka, &blockb); |
| 1672 m.Bind(&blocka); | 1701 m.Bind(&blocka); |
| 1673 m.Return(m.Int32Constant(constant)); | 1702 m.Return(m.Int32Constant(constant)); |
| 1674 m.Bind(&blockb); | 1703 m.Bind(&blockb); |
| 1675 m.Return(m.Int32Constant(0 - constant)); | 1704 m.Return(m.Int32Constant(0 - constant)); |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1720 m.Word32Equal(m.Int32Constant(0), m.Int32Sub(bt.param0, bt.param1))); | 1749 m.Word32Equal(m.Int32Constant(0), m.Int32Sub(bt.param0, bt.param1))); |
| 1721 FOR_UINT32_INPUTS(i) { | 1750 FOR_UINT32_INPUTS(i) { |
| 1722 FOR_UINT32_INPUTS(j) { | 1751 FOR_UINT32_INPUTS(j) { |
| 1723 uint32_t expected = (*i - *j) == 0; | 1752 uint32_t expected = (*i - *j) == 0; |
| 1724 CHECK_EQ(expected, bt.call(*i, *j)); | 1753 CHECK_EQ(expected, bt.call(*i, *j)); |
| 1725 } | 1754 } |
| 1726 } | 1755 } |
| 1727 } | 1756 } |
| 1728 { | 1757 { |
| 1729 FOR_UINT32_INPUTS(i) { | 1758 FOR_UINT32_INPUTS(i) { |
| 1730 RawMachineAssemblerTester<uint32_t> m(kMachUint32); | 1759 RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32()); |
| 1731 m.Return(m.Word32Equal(m.Int32Sub(m.Int32Constant(*i), m.Parameter(0)), | 1760 m.Return(m.Word32Equal(m.Int32Sub(m.Int32Constant(*i), m.Parameter(0)), |
| 1732 m.Int32Constant(0))); | 1761 m.Int32Constant(0))); |
| 1733 FOR_UINT32_INPUTS(j) { | 1762 FOR_UINT32_INPUTS(j) { |
| 1734 uint32_t expected = (*i - *j) == 0; | 1763 uint32_t expected = (*i - *j) == 0; |
| 1735 CHECK_EQ(expected, m.Call(*j)); | 1764 CHECK_EQ(expected, m.Call(*j)); |
| 1736 } | 1765 } |
| 1737 } | 1766 } |
| 1738 } | 1767 } |
| 1739 { | 1768 { |
| 1740 FOR_UINT32_INPUTS(i) { | 1769 FOR_UINT32_INPUTS(i) { |
| 1741 RawMachineAssemblerTester<uint32_t> m(kMachUint32); | 1770 RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32()); |
| 1742 m.Return(m.Word32Equal(m.Int32Sub(m.Parameter(0), m.Int32Constant(*i)), | 1771 m.Return(m.Word32Equal(m.Int32Sub(m.Parameter(0), m.Int32Constant(*i)), |
| 1743 m.Int32Constant(0))); | 1772 m.Int32Constant(0))); |
| 1744 FOR_UINT32_INPUTS(j) { | 1773 FOR_UINT32_INPUTS(j) { |
| 1745 uint32_t expected = (*j - *i) == 0; | 1774 uint32_t expected = (*j - *i) == 0; |
| 1746 CHECK_EQ(expected, m.Call(*j)); | 1775 CHECK_EQ(expected, m.Call(*j)); |
| 1747 } | 1776 } |
| 1748 } | 1777 } |
| 1749 } | 1778 } |
| 1750 { | 1779 { |
| 1751 RawMachineAssemblerTester<void> m; | 1780 RawMachineAssemblerTester<void> m; |
| 1752 const Operator* shops[] = {m.machine()->Word32Sar(), | 1781 const Operator* shops[] = {m.machine()->Word32Sar(), |
| 1753 m.machine()->Word32Shl(), | 1782 m.machine()->Word32Shl(), |
| 1754 m.machine()->Word32Shr()}; | 1783 m.machine()->Word32Shr()}; |
| 1755 for (size_t n = 0; n < arraysize(shops); n++) { | 1784 for (size_t n = 0; n < arraysize(shops); n++) { |
| 1756 RawMachineAssemblerTester<int32_t> m(kMachUint32, kMachInt32, | 1785 RawMachineAssemblerTester<int32_t> m( |
| 1757 kMachUint32); | 1786 MachineType::Uint32(), MachineType::Int32(), MachineType::Uint32()); |
| 1758 m.Return(m.Word32Equal( | 1787 m.Return(m.Word32Equal( |
| 1759 m.Int32Sub(m.Parameter(0), | 1788 m.Int32Sub(m.Parameter(0), |
| 1760 m.AddNode(shops[n], m.Parameter(1), m.Parameter(2))), | 1789 m.AddNode(shops[n], m.Parameter(1), m.Parameter(2))), |
| 1761 m.Int32Constant(0))); | 1790 m.Int32Constant(0))); |
| 1762 FOR_UINT32_INPUTS(i) { | 1791 FOR_UINT32_INPUTS(i) { |
| 1763 FOR_INT32_INPUTS(j) { | 1792 FOR_INT32_INPUTS(j) { |
| 1764 FOR_UINT32_SHIFTS(shift) { | 1793 FOR_UINT32_SHIFTS(shift) { |
| 1765 int32_t right; | 1794 int32_t right; |
| 1766 switch (shops[n]->opcode()) { | 1795 switch (shops[n]->opcode()) { |
| 1767 default: | 1796 default: |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1822 (static_cast<int64_t>(*i) * static_cast<int64_t>(*j)) >> 32); | 1851 (static_cast<int64_t>(*i) * static_cast<int64_t>(*j)) >> 32); |
| 1823 CHECK_EQ(expected, bt.call(*i, *j)); | 1852 CHECK_EQ(expected, bt.call(*i, *j)); |
| 1824 } | 1853 } |
| 1825 } | 1854 } |
| 1826 } | 1855 } |
| 1827 | 1856 |
| 1828 | 1857 |
| 1829 TEST(RunInt32MulImm) { | 1858 TEST(RunInt32MulImm) { |
| 1830 { | 1859 { |
| 1831 FOR_UINT32_INPUTS(i) { | 1860 FOR_UINT32_INPUTS(i) { |
| 1832 RawMachineAssemblerTester<uint32_t> m(kMachUint32); | 1861 RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32()); |
| 1833 m.Return(m.Int32Mul(m.Int32Constant(*i), m.Parameter(0))); | 1862 m.Return(m.Int32Mul(m.Int32Constant(*i), m.Parameter(0))); |
| 1834 FOR_UINT32_INPUTS(j) { | 1863 FOR_UINT32_INPUTS(j) { |
| 1835 uint32_t expected = *i * *j; | 1864 uint32_t expected = *i * *j; |
| 1836 CHECK_EQ(expected, m.Call(*j)); | 1865 CHECK_EQ(expected, m.Call(*j)); |
| 1837 } | 1866 } |
| 1838 } | 1867 } |
| 1839 } | 1868 } |
| 1840 { | 1869 { |
| 1841 FOR_UINT32_INPUTS(i) { | 1870 FOR_UINT32_INPUTS(i) { |
| 1842 RawMachineAssemblerTester<uint32_t> m(kMachUint32); | 1871 RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32()); |
| 1843 m.Return(m.Int32Mul(m.Parameter(0), m.Int32Constant(*i))); | 1872 m.Return(m.Int32Mul(m.Parameter(0), m.Int32Constant(*i))); |
| 1844 FOR_UINT32_INPUTS(j) { | 1873 FOR_UINT32_INPUTS(j) { |
| 1845 uint32_t expected = *j * *i; | 1874 uint32_t expected = *j * *i; |
| 1846 CHECK_EQ(expected, m.Call(*j)); | 1875 CHECK_EQ(expected, m.Call(*j)); |
| 1847 } | 1876 } |
| 1848 } | 1877 } |
| 1849 } | 1878 } |
| 1850 } | 1879 } |
| 1851 | 1880 |
| 1852 | 1881 |
| 1853 TEST(RunInt32MulAndInt32AddP) { | 1882 TEST(RunInt32MulAndInt32AddP) { |
| 1854 { | 1883 { |
| 1855 FOR_INT32_INPUTS(i) { | 1884 FOR_INT32_INPUTS(i) { |
| 1856 FOR_INT32_INPUTS(j) { | 1885 FOR_INT32_INPUTS(j) { |
| 1857 RawMachineAssemblerTester<int32_t> m(kMachInt32); | 1886 RawMachineAssemblerTester<int32_t> m(MachineType::Int32()); |
| 1858 int32_t p0 = *i; | 1887 int32_t p0 = *i; |
| 1859 int32_t p1 = *j; | 1888 int32_t p1 = *j; |
| 1860 m.Return(m.Int32Add(m.Int32Constant(p0), | 1889 m.Return(m.Int32Add(m.Int32Constant(p0), |
| 1861 m.Int32Mul(m.Parameter(0), m.Int32Constant(p1)))); | 1890 m.Int32Mul(m.Parameter(0), m.Int32Constant(p1)))); |
| 1862 FOR_INT32_INPUTS(k) { | 1891 FOR_INT32_INPUTS(k) { |
| 1863 int32_t p2 = *k; | 1892 int32_t p2 = *k; |
| 1864 int expected = p0 + static_cast<int32_t>(p1 * p2); | 1893 int expected = p0 + static_cast<int32_t>(p1 * p2); |
| 1865 CHECK_EQ(expected, m.Call(p2)); | 1894 CHECK_EQ(expected, m.Call(p2)); |
| 1866 } | 1895 } |
| 1867 } | 1896 } |
| 1868 } | 1897 } |
| 1869 } | 1898 } |
| 1870 { | 1899 { |
| 1871 RawMachineAssemblerTester<int32_t> m(kMachInt32, kMachInt32, kMachInt32); | 1900 RawMachineAssemblerTester<int32_t> m( |
| 1901 MachineType::Int32(), MachineType::Int32(), MachineType::Int32()); |
| 1872 m.Return( | 1902 m.Return( |
| 1873 m.Int32Add(m.Parameter(0), m.Int32Mul(m.Parameter(1), m.Parameter(2)))); | 1903 m.Int32Add(m.Parameter(0), m.Int32Mul(m.Parameter(1), m.Parameter(2)))); |
| 1874 FOR_INT32_INPUTS(i) { | 1904 FOR_INT32_INPUTS(i) { |
| 1875 FOR_INT32_INPUTS(j) { | 1905 FOR_INT32_INPUTS(j) { |
| 1876 FOR_INT32_INPUTS(k) { | 1906 FOR_INT32_INPUTS(k) { |
| 1877 int32_t p0 = *i; | 1907 int32_t p0 = *i; |
| 1878 int32_t p1 = *j; | 1908 int32_t p1 = *j; |
| 1879 int32_t p2 = *k; | 1909 int32_t p2 = *k; |
| 1880 int expected = p0 + static_cast<int32_t>(p1 * p2); | 1910 int expected = p0 + static_cast<int32_t>(p1 * p2); |
| 1881 CHECK_EQ(expected, m.Call(p0, p1, p2)); | 1911 CHECK_EQ(expected, m.Call(p0, p1, p2)); |
| 1882 } | 1912 } |
| 1883 } | 1913 } |
| 1884 } | 1914 } |
| 1885 } | 1915 } |
| 1886 { | 1916 { |
| 1887 RawMachineAssemblerTester<int32_t> m(kMachInt32, kMachInt32, kMachInt32); | 1917 RawMachineAssemblerTester<int32_t> m( |
| 1918 MachineType::Int32(), MachineType::Int32(), MachineType::Int32()); |
| 1888 m.Return( | 1919 m.Return( |
| 1889 m.Int32Add(m.Int32Mul(m.Parameter(0), m.Parameter(1)), m.Parameter(2))); | 1920 m.Int32Add(m.Int32Mul(m.Parameter(0), m.Parameter(1)), m.Parameter(2))); |
| 1890 FOR_INT32_INPUTS(i) { | 1921 FOR_INT32_INPUTS(i) { |
| 1891 FOR_INT32_INPUTS(j) { | 1922 FOR_INT32_INPUTS(j) { |
| 1892 FOR_INT32_INPUTS(k) { | 1923 FOR_INT32_INPUTS(k) { |
| 1893 int32_t p0 = *i; | 1924 int32_t p0 = *i; |
| 1894 int32_t p1 = *j; | 1925 int32_t p1 = *j; |
| 1895 int32_t p2 = *k; | 1926 int32_t p2 = *k; |
| 1896 int expected = static_cast<int32_t>(p0 * p1) + p2; | 1927 int expected = static_cast<int32_t>(p0 * p1) + p2; |
| 1897 CHECK_EQ(expected, m.Call(p0, p1, p2)); | 1928 CHECK_EQ(expected, m.Call(p0, p1, p2)); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1913 CHECK_EQ(expected, bt.call(p0, p1)); | 1944 CHECK_EQ(expected, bt.call(p0, p1)); |
| 1914 } | 1945 } |
| 1915 } | 1946 } |
| 1916 } | 1947 } |
| 1917 } | 1948 } |
| 1918 } | 1949 } |
| 1919 | 1950 |
| 1920 | 1951 |
| 1921 TEST(RunInt32MulAndInt32SubP) { | 1952 TEST(RunInt32MulAndInt32SubP) { |
| 1922 { | 1953 { |
| 1923 RawMachineAssemblerTester<int32_t> m(kMachUint32, kMachInt32, kMachInt32); | 1954 RawMachineAssemblerTester<int32_t> m( |
| 1955 MachineType::Uint32(), MachineType::Int32(), MachineType::Int32()); |
| 1924 m.Return( | 1956 m.Return( |
| 1925 m.Int32Sub(m.Parameter(0), m.Int32Mul(m.Parameter(1), m.Parameter(2)))); | 1957 m.Int32Sub(m.Parameter(0), m.Int32Mul(m.Parameter(1), m.Parameter(2)))); |
| 1926 FOR_UINT32_INPUTS(i) { | 1958 FOR_UINT32_INPUTS(i) { |
| 1927 FOR_INT32_INPUTS(j) { | 1959 FOR_INT32_INPUTS(j) { |
| 1928 FOR_INT32_INPUTS(k) { | 1960 FOR_INT32_INPUTS(k) { |
| 1929 uint32_t p0 = *i; | 1961 uint32_t p0 = *i; |
| 1930 int32_t p1 = *j; | 1962 int32_t p1 = *j; |
| 1931 int32_t p2 = *k; | 1963 int32_t p2 = *k; |
| 1932 // Use uint32_t because signed overflow is UB in C. | 1964 // Use uint32_t because signed overflow is UB in C. |
| 1933 int expected = p0 - static_cast<uint32_t>(p1 * p2); | 1965 int expected = p0 - static_cast<uint32_t>(p1 * p2); |
| (...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2223 CHECK_EQ(expected, bt.call(*i, *j)); | 2255 CHECK_EQ(expected, bt.call(*i, *j)); |
| 2224 } | 2256 } |
| 2225 } | 2257 } |
| 2226 } | 2258 } |
| 2227 } | 2259 } |
| 2228 | 2260 |
| 2229 | 2261 |
| 2230 TEST(RunWord32AndImm) { | 2262 TEST(RunWord32AndImm) { |
| 2231 { | 2263 { |
| 2232 FOR_UINT32_INPUTS(i) { | 2264 FOR_UINT32_INPUTS(i) { |
| 2233 RawMachineAssemblerTester<uint32_t> m(kMachUint32); | 2265 RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32()); |
| 2234 m.Return(m.Word32And(m.Int32Constant(*i), m.Parameter(0))); | 2266 m.Return(m.Word32And(m.Int32Constant(*i), m.Parameter(0))); |
| 2235 FOR_UINT32_INPUTS(j) { | 2267 FOR_UINT32_INPUTS(j) { |
| 2236 uint32_t expected = *i & *j; | 2268 uint32_t expected = *i & *j; |
| 2237 CHECK_EQ(expected, m.Call(*j)); | 2269 CHECK_EQ(expected, m.Call(*j)); |
| 2238 } | 2270 } |
| 2239 } | 2271 } |
| 2240 } | 2272 } |
| 2241 { | 2273 { |
| 2242 FOR_UINT32_INPUTS(i) { | 2274 FOR_UINT32_INPUTS(i) { |
| 2243 RawMachineAssemblerTester<uint32_t> m(kMachUint32); | 2275 RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32()); |
| 2244 m.Return(m.Word32And(m.Int32Constant(*i), m.Word32Not(m.Parameter(0)))); | 2276 m.Return(m.Word32And(m.Int32Constant(*i), m.Word32Not(m.Parameter(0)))); |
| 2245 FOR_UINT32_INPUTS(j) { | 2277 FOR_UINT32_INPUTS(j) { |
| 2246 uint32_t expected = *i & ~(*j); | 2278 uint32_t expected = *i & ~(*j); |
| 2247 CHECK_EQ(expected, m.Call(*j)); | 2279 CHECK_EQ(expected, m.Call(*j)); |
| 2248 } | 2280 } |
| 2249 } | 2281 } |
| 2250 } | 2282 } |
| 2251 } | 2283 } |
| 2252 | 2284 |
| 2253 | 2285 |
| (...skipping 30 matching lines...) Expand all Loading... |
| 2284 bt.AddReturn(m.Int32Constant(0 - constant)); | 2316 bt.AddReturn(m.Int32Constant(0 - constant)); |
| 2285 FOR_UINT32_INPUTS(i) { | 2317 FOR_UINT32_INPUTS(i) { |
| 2286 FOR_UINT32_INPUTS(j) { | 2318 FOR_UINT32_INPUTS(j) { |
| 2287 int32_t expected = (*i & *j) != 0 ? constant : 0 - constant; | 2319 int32_t expected = (*i & *j) != 0 ? constant : 0 - constant; |
| 2288 CHECK_EQ(expected, bt.call(*i, *j)); | 2320 CHECK_EQ(expected, bt.call(*i, *j)); |
| 2289 } | 2321 } |
| 2290 } | 2322 } |
| 2291 } | 2323 } |
| 2292 { | 2324 { |
| 2293 FOR_UINT32_INPUTS(i) { | 2325 FOR_UINT32_INPUTS(i) { |
| 2294 RawMachineAssemblerTester<int32_t> m(kMachUint32); | 2326 RawMachineAssemblerTester<int32_t> m(MachineType::Uint32()); |
| 2295 RawMachineLabel blocka, blockb; | 2327 RawMachineLabel blocka, blockb; |
| 2296 m.Branch(m.Word32Equal(m.Word32And(m.Int32Constant(*i), m.Parameter(0)), | 2328 m.Branch(m.Word32Equal(m.Word32And(m.Int32Constant(*i), m.Parameter(0)), |
| 2297 m.Int32Constant(0)), | 2329 m.Int32Constant(0)), |
| 2298 &blocka, &blockb); | 2330 &blocka, &blockb); |
| 2299 m.Bind(&blocka); | 2331 m.Bind(&blocka); |
| 2300 m.Return(m.Int32Constant(constant)); | 2332 m.Return(m.Int32Constant(constant)); |
| 2301 m.Bind(&blockb); | 2333 m.Bind(&blockb); |
| 2302 m.Return(m.Int32Constant(0 - constant)); | 2334 m.Return(m.Int32Constant(0 - constant)); |
| 2303 FOR_UINT32_INPUTS(j) { | 2335 FOR_UINT32_INPUTS(j) { |
| 2304 int32_t expected = (*i & *j) == 0 ? constant : 0 - constant; | 2336 int32_t expected = (*i & *j) == 0 ? constant : 0 - constant; |
| 2305 CHECK_EQ(expected, m.Call(*j)); | 2337 CHECK_EQ(expected, m.Call(*j)); |
| 2306 } | 2338 } |
| 2307 } | 2339 } |
| 2308 } | 2340 } |
| 2309 { | 2341 { |
| 2310 FOR_UINT32_INPUTS(i) { | 2342 FOR_UINT32_INPUTS(i) { |
| 2311 RawMachineAssemblerTester<int32_t> m(kMachUint32); | 2343 RawMachineAssemblerTester<int32_t> m(MachineType::Uint32()); |
| 2312 RawMachineLabel blocka, blockb; | 2344 RawMachineLabel blocka, blockb; |
| 2313 m.Branch( | 2345 m.Branch( |
| 2314 m.Word32NotEqual(m.Word32And(m.Int32Constant(*i), m.Parameter(0)), | 2346 m.Word32NotEqual(m.Word32And(m.Int32Constant(*i), m.Parameter(0)), |
| 2315 m.Int32Constant(0)), | 2347 m.Int32Constant(0)), |
| 2316 &blocka, &blockb); | 2348 &blocka, &blockb); |
| 2317 m.Bind(&blocka); | 2349 m.Bind(&blocka); |
| 2318 m.Return(m.Int32Constant(constant)); | 2350 m.Return(m.Int32Constant(constant)); |
| 2319 m.Bind(&blockb); | 2351 m.Bind(&blockb); |
| 2320 m.Return(m.Int32Constant(0 - constant)); | 2352 m.Return(m.Int32Constant(0 - constant)); |
| 2321 FOR_UINT32_INPUTS(j) { | 2353 FOR_UINT32_INPUTS(j) { |
| 2322 int32_t expected = (*i & *j) != 0 ? constant : 0 - constant; | 2354 int32_t expected = (*i & *j) != 0 ? constant : 0 - constant; |
| 2323 CHECK_EQ(expected, m.Call(*j)); | 2355 CHECK_EQ(expected, m.Call(*j)); |
| 2324 } | 2356 } |
| 2325 } | 2357 } |
| 2326 } | 2358 } |
| 2327 { | 2359 { |
| 2328 RawMachineAssemblerTester<void> m; | 2360 RawMachineAssemblerTester<void> m; |
| 2329 const Operator* shops[] = {m.machine()->Word32Sar(), | 2361 const Operator* shops[] = {m.machine()->Word32Sar(), |
| 2330 m.machine()->Word32Shl(), | 2362 m.machine()->Word32Shl(), |
| 2331 m.machine()->Word32Shr()}; | 2363 m.machine()->Word32Shr()}; |
| 2332 for (size_t n = 0; n < arraysize(shops); n++) { | 2364 for (size_t n = 0; n < arraysize(shops); n++) { |
| 2333 RawMachineAssemblerTester<int32_t> m(kMachUint32, kMachInt32, | 2365 RawMachineAssemblerTester<int32_t> m( |
| 2334 kMachUint32); | 2366 MachineType::Uint32(), MachineType::Int32(), MachineType::Uint32()); |
| 2335 RawMachineLabel blocka, blockb; | 2367 RawMachineLabel blocka, blockb; |
| 2336 m.Branch(m.Word32Equal(m.Word32And(m.Parameter(0), | 2368 m.Branch(m.Word32Equal(m.Word32And(m.Parameter(0), |
| 2337 m.AddNode(shops[n], m.Parameter(1), | 2369 m.AddNode(shops[n], m.Parameter(1), |
| 2338 m.Parameter(2))), | 2370 m.Parameter(2))), |
| 2339 m.Int32Constant(0)), | 2371 m.Int32Constant(0)), |
| 2340 &blocka, &blockb); | 2372 &blocka, &blockb); |
| 2341 m.Bind(&blocka); | 2373 m.Bind(&blocka); |
| 2342 m.Return(m.Int32Constant(constant)); | 2374 m.Return(m.Int32Constant(constant)); |
| 2343 m.Bind(&blockb); | 2375 m.Bind(&blockb); |
| 2344 m.Return(m.Int32Constant(0 - constant)); | 2376 m.Return(m.Int32Constant(0 - constant)); |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2389 m.Word32Equal(m.Int32Constant(0), m.Word32And(bt.param0, bt.param1))); | 2421 m.Word32Equal(m.Int32Constant(0), m.Word32And(bt.param0, bt.param1))); |
| 2390 FOR_UINT32_INPUTS(i) { | 2422 FOR_UINT32_INPUTS(i) { |
| 2391 FOR_UINT32_INPUTS(j) { | 2423 FOR_UINT32_INPUTS(j) { |
| 2392 uint32_t expected = (*i & *j) == 0; | 2424 uint32_t expected = (*i & *j) == 0; |
| 2393 CHECK_EQ(expected, bt.call(*i, *j)); | 2425 CHECK_EQ(expected, bt.call(*i, *j)); |
| 2394 } | 2426 } |
| 2395 } | 2427 } |
| 2396 } | 2428 } |
| 2397 { | 2429 { |
| 2398 FOR_UINT32_INPUTS(i) { | 2430 FOR_UINT32_INPUTS(i) { |
| 2399 RawMachineAssemblerTester<uint32_t> m(kMachUint32); | 2431 RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32()); |
| 2400 m.Return(m.Word32Equal(m.Word32And(m.Int32Constant(*i), m.Parameter(0)), | 2432 m.Return(m.Word32Equal(m.Word32And(m.Int32Constant(*i), m.Parameter(0)), |
| 2401 m.Int32Constant(0))); | 2433 m.Int32Constant(0))); |
| 2402 FOR_UINT32_INPUTS(j) { | 2434 FOR_UINT32_INPUTS(j) { |
| 2403 uint32_t expected = (*i & *j) == 0; | 2435 uint32_t expected = (*i & *j) == 0; |
| 2404 CHECK_EQ(expected, m.Call(*j)); | 2436 CHECK_EQ(expected, m.Call(*j)); |
| 2405 } | 2437 } |
| 2406 } | 2438 } |
| 2407 } | 2439 } |
| 2408 { | 2440 { |
| 2409 FOR_UINT32_INPUTS(i) { | 2441 FOR_UINT32_INPUTS(i) { |
| 2410 RawMachineAssemblerTester<uint32_t> m(kMachUint32); | 2442 RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32()); |
| 2411 m.Return(m.Word32Equal(m.Word32And(m.Parameter(0), m.Int32Constant(*i)), | 2443 m.Return(m.Word32Equal(m.Word32And(m.Parameter(0), m.Int32Constant(*i)), |
| 2412 m.Int32Constant(0))); | 2444 m.Int32Constant(0))); |
| 2413 FOR_UINT32_INPUTS(j) { | 2445 FOR_UINT32_INPUTS(j) { |
| 2414 uint32_t expected = (*j & *i) == 0; | 2446 uint32_t expected = (*j & *i) == 0; |
| 2415 CHECK_EQ(expected, m.Call(*j)); | 2447 CHECK_EQ(expected, m.Call(*j)); |
| 2416 } | 2448 } |
| 2417 } | 2449 } |
| 2418 } | 2450 } |
| 2419 } | 2451 } |
| 2420 | 2452 |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2452 CHECK_EQ(expected, bt.call(*i, *j)); | 2484 CHECK_EQ(expected, bt.call(*i, *j)); |
| 2453 } | 2485 } |
| 2454 } | 2486 } |
| 2455 } | 2487 } |
| 2456 } | 2488 } |
| 2457 | 2489 |
| 2458 | 2490 |
| 2459 TEST(RunWord32OrImm) { | 2491 TEST(RunWord32OrImm) { |
| 2460 { | 2492 { |
| 2461 FOR_UINT32_INPUTS(i) { | 2493 FOR_UINT32_INPUTS(i) { |
| 2462 RawMachineAssemblerTester<uint32_t> m(kMachUint32); | 2494 RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32()); |
| 2463 m.Return(m.Word32Or(m.Int32Constant(*i), m.Parameter(0))); | 2495 m.Return(m.Word32Or(m.Int32Constant(*i), m.Parameter(0))); |
| 2464 FOR_UINT32_INPUTS(j) { | 2496 FOR_UINT32_INPUTS(j) { |
| 2465 uint32_t expected = *i | *j; | 2497 uint32_t expected = *i | *j; |
| 2466 CHECK_EQ(expected, m.Call(*j)); | 2498 CHECK_EQ(expected, m.Call(*j)); |
| 2467 } | 2499 } |
| 2468 } | 2500 } |
| 2469 } | 2501 } |
| 2470 { | 2502 { |
| 2471 FOR_UINT32_INPUTS(i) { | 2503 FOR_UINT32_INPUTS(i) { |
| 2472 RawMachineAssemblerTester<uint32_t> m(kMachUint32); | 2504 RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32()); |
| 2473 m.Return(m.Word32Or(m.Int32Constant(*i), m.Word32Not(m.Parameter(0)))); | 2505 m.Return(m.Word32Or(m.Int32Constant(*i), m.Word32Not(m.Parameter(0)))); |
| 2474 FOR_UINT32_INPUTS(j) { | 2506 FOR_UINT32_INPUTS(j) { |
| 2475 uint32_t expected = *i | ~(*j); | 2507 uint32_t expected = *i | ~(*j); |
| 2476 CHECK_EQ(expected, m.Call(*j)); | 2508 CHECK_EQ(expected, m.Call(*j)); |
| 2477 } | 2509 } |
| 2478 } | 2510 } |
| 2479 } | 2511 } |
| 2480 } | 2512 } |
| 2481 | 2513 |
| 2482 | 2514 |
| (...skipping 30 matching lines...) Expand all Loading... |
| 2513 bt.AddReturn(m.Int32Constant(0 - constant)); | 2545 bt.AddReturn(m.Int32Constant(0 - constant)); |
| 2514 FOR_INT32_INPUTS(i) { | 2546 FOR_INT32_INPUTS(i) { |
| 2515 FOR_INT32_INPUTS(j) { | 2547 FOR_INT32_INPUTS(j) { |
| 2516 int32_t expected = (*i | *j) != 0 ? constant : 0 - constant; | 2548 int32_t expected = (*i | *j) != 0 ? constant : 0 - constant; |
| 2517 CHECK_EQ(expected, bt.call(*i, *j)); | 2549 CHECK_EQ(expected, bt.call(*i, *j)); |
| 2518 } | 2550 } |
| 2519 } | 2551 } |
| 2520 } | 2552 } |
| 2521 { | 2553 { |
| 2522 FOR_INT32_INPUTS(i) { | 2554 FOR_INT32_INPUTS(i) { |
| 2523 RawMachineAssemblerTester<int32_t> m(kMachInt32); | 2555 RawMachineAssemblerTester<int32_t> m(MachineType::Int32()); |
| 2524 RawMachineLabel blocka, blockb; | 2556 RawMachineLabel blocka, blockb; |
| 2525 m.Branch(m.Word32Equal(m.Word32Or(m.Int32Constant(*i), m.Parameter(0)), | 2557 m.Branch(m.Word32Equal(m.Word32Or(m.Int32Constant(*i), m.Parameter(0)), |
| 2526 m.Int32Constant(0)), | 2558 m.Int32Constant(0)), |
| 2527 &blocka, &blockb); | 2559 &blocka, &blockb); |
| 2528 m.Bind(&blocka); | 2560 m.Bind(&blocka); |
| 2529 m.Return(m.Int32Constant(constant)); | 2561 m.Return(m.Int32Constant(constant)); |
| 2530 m.Bind(&blockb); | 2562 m.Bind(&blockb); |
| 2531 m.Return(m.Int32Constant(0 - constant)); | 2563 m.Return(m.Int32Constant(0 - constant)); |
| 2532 FOR_INT32_INPUTS(j) { | 2564 FOR_INT32_INPUTS(j) { |
| 2533 int32_t expected = (*i | *j) == 0 ? constant : 0 - constant; | 2565 int32_t expected = (*i | *j) == 0 ? constant : 0 - constant; |
| 2534 CHECK_EQ(expected, m.Call(*j)); | 2566 CHECK_EQ(expected, m.Call(*j)); |
| 2535 } | 2567 } |
| 2536 } | 2568 } |
| 2537 } | 2569 } |
| 2538 { | 2570 { |
| 2539 FOR_INT32_INPUTS(i) { | 2571 FOR_INT32_INPUTS(i) { |
| 2540 RawMachineAssemblerTester<int32_t> m(kMachInt32); | 2572 RawMachineAssemblerTester<int32_t> m(MachineType::Int32()); |
| 2541 RawMachineLabel blocka, blockb; | 2573 RawMachineLabel blocka, blockb; |
| 2542 m.Branch(m.Word32NotEqual(m.Word32Or(m.Int32Constant(*i), m.Parameter(0)), | 2574 m.Branch(m.Word32NotEqual(m.Word32Or(m.Int32Constant(*i), m.Parameter(0)), |
| 2543 m.Int32Constant(0)), | 2575 m.Int32Constant(0)), |
| 2544 &blocka, &blockb); | 2576 &blocka, &blockb); |
| 2545 m.Bind(&blocka); | 2577 m.Bind(&blocka); |
| 2546 m.Return(m.Int32Constant(constant)); | 2578 m.Return(m.Int32Constant(constant)); |
| 2547 m.Bind(&blockb); | 2579 m.Bind(&blockb); |
| 2548 m.Return(m.Int32Constant(0 - constant)); | 2580 m.Return(m.Int32Constant(0 - constant)); |
| 2549 FOR_INT32_INPUTS(j) { | 2581 FOR_INT32_INPUTS(j) { |
| 2550 int32_t expected = (*i | *j) != 0 ? constant : 0 - constant; | 2582 int32_t expected = (*i | *j) != 0 ? constant : 0 - constant; |
| 2551 CHECK_EQ(expected, m.Call(*j)); | 2583 CHECK_EQ(expected, m.Call(*j)); |
| 2552 } | 2584 } |
| 2553 } | 2585 } |
| 2554 } | 2586 } |
| 2555 { | 2587 { |
| 2556 RawMachineAssemblerTester<void> m; | 2588 RawMachineAssemblerTester<void> m; |
| 2557 const Operator* shops[] = {m.machine()->Word32Sar(), | 2589 const Operator* shops[] = {m.machine()->Word32Sar(), |
| 2558 m.machine()->Word32Shl(), | 2590 m.machine()->Word32Shl(), |
| 2559 m.machine()->Word32Shr()}; | 2591 m.machine()->Word32Shr()}; |
| 2560 for (size_t n = 0; n < arraysize(shops); n++) { | 2592 for (size_t n = 0; n < arraysize(shops); n++) { |
| 2561 RawMachineAssemblerTester<int32_t> m(kMachUint32, kMachInt32, | 2593 RawMachineAssemblerTester<int32_t> m( |
| 2562 kMachUint32); | 2594 MachineType::Uint32(), MachineType::Int32(), MachineType::Uint32()); |
| 2563 RawMachineLabel blocka, blockb; | 2595 RawMachineLabel blocka, blockb; |
| 2564 m.Branch(m.Word32Equal(m.Word32Or(m.Parameter(0), | 2596 m.Branch(m.Word32Equal(m.Word32Or(m.Parameter(0), |
| 2565 m.AddNode(shops[n], m.Parameter(1), | 2597 m.AddNode(shops[n], m.Parameter(1), |
| 2566 m.Parameter(2))), | 2598 m.Parameter(2))), |
| 2567 m.Int32Constant(0)), | 2599 m.Int32Constant(0)), |
| 2568 &blocka, &blockb); | 2600 &blocka, &blockb); |
| 2569 m.Bind(&blocka); | 2601 m.Bind(&blocka); |
| 2570 m.Return(m.Int32Constant(constant)); | 2602 m.Return(m.Int32Constant(constant)); |
| 2571 m.Bind(&blockb); | 2603 m.Bind(&blockb); |
| 2572 m.Return(m.Int32Constant(0 - constant)); | 2604 m.Return(m.Int32Constant(0 - constant)); |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2617 m.Word32Equal(m.Int32Constant(0), m.Word32Or(bt.param0, bt.param1))); | 2649 m.Word32Equal(m.Int32Constant(0), m.Word32Or(bt.param0, bt.param1))); |
| 2618 FOR_UINT32_INPUTS(i) { | 2650 FOR_UINT32_INPUTS(i) { |
| 2619 FOR_UINT32_INPUTS(j) { | 2651 FOR_UINT32_INPUTS(j) { |
| 2620 int32_t expected = (*i | *j) == 0; | 2652 int32_t expected = (*i | *j) == 0; |
| 2621 CHECK_EQ(expected, bt.call(*i, *j)); | 2653 CHECK_EQ(expected, bt.call(*i, *j)); |
| 2622 } | 2654 } |
| 2623 } | 2655 } |
| 2624 } | 2656 } |
| 2625 { | 2657 { |
| 2626 FOR_UINT32_INPUTS(i) { | 2658 FOR_UINT32_INPUTS(i) { |
| 2627 RawMachineAssemblerTester<uint32_t> m(kMachUint32); | 2659 RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32()); |
| 2628 m.Return(m.Word32Equal(m.Word32Or(m.Int32Constant(*i), m.Parameter(0)), | 2660 m.Return(m.Word32Equal(m.Word32Or(m.Int32Constant(*i), m.Parameter(0)), |
| 2629 m.Int32Constant(0))); | 2661 m.Int32Constant(0))); |
| 2630 FOR_UINT32_INPUTS(j) { | 2662 FOR_UINT32_INPUTS(j) { |
| 2631 uint32_t expected = (*i | *j) == 0; | 2663 uint32_t expected = (*i | *j) == 0; |
| 2632 CHECK_EQ(expected, m.Call(*j)); | 2664 CHECK_EQ(expected, m.Call(*j)); |
| 2633 } | 2665 } |
| 2634 } | 2666 } |
| 2635 } | 2667 } |
| 2636 { | 2668 { |
| 2637 FOR_UINT32_INPUTS(i) { | 2669 FOR_UINT32_INPUTS(i) { |
| 2638 RawMachineAssemblerTester<uint32_t> m(kMachUint32); | 2670 RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32()); |
| 2639 m.Return(m.Word32Equal(m.Word32Or(m.Parameter(0), m.Int32Constant(*i)), | 2671 m.Return(m.Word32Equal(m.Word32Or(m.Parameter(0), m.Int32Constant(*i)), |
| 2640 m.Int32Constant(0))); | 2672 m.Int32Constant(0))); |
| 2641 FOR_UINT32_INPUTS(j) { | 2673 FOR_UINT32_INPUTS(j) { |
| 2642 uint32_t expected = (*j | *i) == 0; | 2674 uint32_t expected = (*j | *i) == 0; |
| 2643 CHECK_EQ(expected, m.Call(*j)); | 2675 CHECK_EQ(expected, m.Call(*j)); |
| 2644 } | 2676 } |
| 2645 } | 2677 } |
| 2646 } | 2678 } |
| 2647 } | 2679 } |
| 2648 | 2680 |
| 2649 | 2681 |
| 2650 TEST(RunWord32XorP) { | 2682 TEST(RunWord32XorP) { |
| 2651 { | 2683 { |
| 2652 FOR_UINT32_INPUTS(i) { | 2684 FOR_UINT32_INPUTS(i) { |
| 2653 RawMachineAssemblerTester<uint32_t> m(kMachUint32); | 2685 RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32()); |
| 2654 m.Return(m.Word32Xor(m.Int32Constant(*i), m.Parameter(0))); | 2686 m.Return(m.Word32Xor(m.Int32Constant(*i), m.Parameter(0))); |
| 2655 FOR_UINT32_INPUTS(j) { | 2687 FOR_UINT32_INPUTS(j) { |
| 2656 uint32_t expected = *i ^ *j; | 2688 uint32_t expected = *i ^ *j; |
| 2657 CHECK_EQ(expected, m.Call(*j)); | 2689 CHECK_EQ(expected, m.Call(*j)); |
| 2658 } | 2690 } |
| 2659 } | 2691 } |
| 2660 } | 2692 } |
| 2661 { | 2693 { |
| 2662 RawMachineAssemblerTester<int32_t> m; | 2694 RawMachineAssemblerTester<int32_t> m; |
| 2663 Uint32BinopTester bt(&m); | 2695 Uint32BinopTester bt(&m); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 2686 bt.AddReturn(m.Word32Xor(m.Word32Not(bt.param0), bt.param1)); | 2718 bt.AddReturn(m.Word32Xor(m.Word32Not(bt.param0), bt.param1)); |
| 2687 FOR_INT32_INPUTS(i) { | 2719 FOR_INT32_INPUTS(i) { |
| 2688 FOR_INT32_INPUTS(j) { | 2720 FOR_INT32_INPUTS(j) { |
| 2689 int32_t expected = ~(*i) ^ *j; | 2721 int32_t expected = ~(*i) ^ *j; |
| 2690 CHECK_EQ(expected, bt.call(*i, *j)); | 2722 CHECK_EQ(expected, bt.call(*i, *j)); |
| 2691 } | 2723 } |
| 2692 } | 2724 } |
| 2693 } | 2725 } |
| 2694 { | 2726 { |
| 2695 FOR_UINT32_INPUTS(i) { | 2727 FOR_UINT32_INPUTS(i) { |
| 2696 RawMachineAssemblerTester<uint32_t> m(kMachUint32); | 2728 RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32()); |
| 2697 m.Return(m.Word32Xor(m.Int32Constant(*i), m.Word32Not(m.Parameter(0)))); | 2729 m.Return(m.Word32Xor(m.Int32Constant(*i), m.Word32Not(m.Parameter(0)))); |
| 2698 FOR_UINT32_INPUTS(j) { | 2730 FOR_UINT32_INPUTS(j) { |
| 2699 uint32_t expected = *i ^ ~(*j); | 2731 uint32_t expected = *i ^ ~(*j); |
| 2700 CHECK_EQ(expected, m.Call(*j)); | 2732 CHECK_EQ(expected, m.Call(*j)); |
| 2701 } | 2733 } |
| 2702 } | 2734 } |
| 2703 } | 2735 } |
| 2704 } | 2736 } |
| 2705 | 2737 |
| 2706 | 2738 |
| (...skipping 30 matching lines...) Expand all Loading... |
| 2737 bt.AddReturn(m.Int32Constant(0 - constant)); | 2769 bt.AddReturn(m.Int32Constant(0 - constant)); |
| 2738 FOR_UINT32_INPUTS(i) { | 2770 FOR_UINT32_INPUTS(i) { |
| 2739 FOR_UINT32_INPUTS(j) { | 2771 FOR_UINT32_INPUTS(j) { |
| 2740 uint32_t expected = (*i ^ *j) != 0 ? constant : 0 - constant; | 2772 uint32_t expected = (*i ^ *j) != 0 ? constant : 0 - constant; |
| 2741 CHECK_EQ(expected, bt.call(*i, *j)); | 2773 CHECK_EQ(expected, bt.call(*i, *j)); |
| 2742 } | 2774 } |
| 2743 } | 2775 } |
| 2744 } | 2776 } |
| 2745 { | 2777 { |
| 2746 FOR_UINT32_INPUTS(i) { | 2778 FOR_UINT32_INPUTS(i) { |
| 2747 RawMachineAssemblerTester<uint32_t> m(kMachUint32); | 2779 RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32()); |
| 2748 RawMachineLabel blocka, blockb; | 2780 RawMachineLabel blocka, blockb; |
| 2749 m.Branch(m.Word32Equal(m.Word32Xor(m.Int32Constant(*i), m.Parameter(0)), | 2781 m.Branch(m.Word32Equal(m.Word32Xor(m.Int32Constant(*i), m.Parameter(0)), |
| 2750 m.Int32Constant(0)), | 2782 m.Int32Constant(0)), |
| 2751 &blocka, &blockb); | 2783 &blocka, &blockb); |
| 2752 m.Bind(&blocka); | 2784 m.Bind(&blocka); |
| 2753 m.Return(m.Int32Constant(constant)); | 2785 m.Return(m.Int32Constant(constant)); |
| 2754 m.Bind(&blockb); | 2786 m.Bind(&blockb); |
| 2755 m.Return(m.Int32Constant(0 - constant)); | 2787 m.Return(m.Int32Constant(0 - constant)); |
| 2756 FOR_UINT32_INPUTS(j) { | 2788 FOR_UINT32_INPUTS(j) { |
| 2757 uint32_t expected = (*i ^ *j) == 0 ? constant : 0 - constant; | 2789 uint32_t expected = (*i ^ *j) == 0 ? constant : 0 - constant; |
| 2758 CHECK_EQ(expected, m.Call(*j)); | 2790 CHECK_EQ(expected, m.Call(*j)); |
| 2759 } | 2791 } |
| 2760 } | 2792 } |
| 2761 } | 2793 } |
| 2762 { | 2794 { |
| 2763 FOR_UINT32_INPUTS(i) { | 2795 FOR_UINT32_INPUTS(i) { |
| 2764 RawMachineAssemblerTester<uint32_t> m(kMachUint32); | 2796 RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32()); |
| 2765 RawMachineLabel blocka, blockb; | 2797 RawMachineLabel blocka, blockb; |
| 2766 m.Branch( | 2798 m.Branch( |
| 2767 m.Word32NotEqual(m.Word32Xor(m.Int32Constant(*i), m.Parameter(0)), | 2799 m.Word32NotEqual(m.Word32Xor(m.Int32Constant(*i), m.Parameter(0)), |
| 2768 m.Int32Constant(0)), | 2800 m.Int32Constant(0)), |
| 2769 &blocka, &blockb); | 2801 &blocka, &blockb); |
| 2770 m.Bind(&blocka); | 2802 m.Bind(&blocka); |
| 2771 m.Return(m.Int32Constant(constant)); | 2803 m.Return(m.Int32Constant(constant)); |
| 2772 m.Bind(&blockb); | 2804 m.Bind(&blockb); |
| 2773 m.Return(m.Int32Constant(0 - constant)); | 2805 m.Return(m.Int32Constant(0 - constant)); |
| 2774 FOR_UINT32_INPUTS(j) { | 2806 FOR_UINT32_INPUTS(j) { |
| 2775 uint32_t expected = (*i ^ *j) != 0 ? constant : 0 - constant; | 2807 uint32_t expected = (*i ^ *j) != 0 ? constant : 0 - constant; |
| 2776 CHECK_EQ(expected, m.Call(*j)); | 2808 CHECK_EQ(expected, m.Call(*j)); |
| 2777 } | 2809 } |
| 2778 } | 2810 } |
| 2779 } | 2811 } |
| 2780 { | 2812 { |
| 2781 RawMachineAssemblerTester<void> m; | 2813 RawMachineAssemblerTester<void> m; |
| 2782 const Operator* shops[] = {m.machine()->Word32Sar(), | 2814 const Operator* shops[] = {m.machine()->Word32Sar(), |
| 2783 m.machine()->Word32Shl(), | 2815 m.machine()->Word32Shl(), |
| 2784 m.machine()->Word32Shr()}; | 2816 m.machine()->Word32Shr()}; |
| 2785 for (size_t n = 0; n < arraysize(shops); n++) { | 2817 for (size_t n = 0; n < arraysize(shops); n++) { |
| 2786 RawMachineAssemblerTester<int32_t> m(kMachUint32, kMachInt32, | 2818 RawMachineAssemblerTester<int32_t> m( |
| 2787 kMachUint32); | 2819 MachineType::Uint32(), MachineType::Int32(), MachineType::Uint32()); |
| 2788 RawMachineLabel blocka, blockb; | 2820 RawMachineLabel blocka, blockb; |
| 2789 m.Branch(m.Word32Equal(m.Word32Xor(m.Parameter(0), | 2821 m.Branch(m.Word32Equal(m.Word32Xor(m.Parameter(0), |
| 2790 m.AddNode(shops[n], m.Parameter(1), | 2822 m.AddNode(shops[n], m.Parameter(1), |
| 2791 m.Parameter(2))), | 2823 m.Parameter(2))), |
| 2792 m.Int32Constant(0)), | 2824 m.Int32Constant(0)), |
| 2793 &blocka, &blockb); | 2825 &blocka, &blockb); |
| 2794 m.Bind(&blocka); | 2826 m.Bind(&blocka); |
| 2795 m.Return(m.Int32Constant(constant)); | 2827 m.Return(m.Int32Constant(constant)); |
| 2796 m.Bind(&blockb); | 2828 m.Bind(&blockb); |
| 2797 m.Return(m.Int32Constant(0 - constant)); | 2829 m.Return(m.Int32Constant(0 - constant)); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 2818 } | 2850 } |
| 2819 } | 2851 } |
| 2820 } | 2852 } |
| 2821 } | 2853 } |
| 2822 } | 2854 } |
| 2823 | 2855 |
| 2824 | 2856 |
| 2825 TEST(RunWord32ShlP) { | 2857 TEST(RunWord32ShlP) { |
| 2826 { | 2858 { |
| 2827 FOR_UINT32_SHIFTS(shift) { | 2859 FOR_UINT32_SHIFTS(shift) { |
| 2828 RawMachineAssemblerTester<uint32_t> m(kMachUint32); | 2860 RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32()); |
| 2829 m.Return(m.Word32Shl(m.Parameter(0), m.Int32Constant(shift))); | 2861 m.Return(m.Word32Shl(m.Parameter(0), m.Int32Constant(shift))); |
| 2830 FOR_UINT32_INPUTS(j) { | 2862 FOR_UINT32_INPUTS(j) { |
| 2831 uint32_t expected = *j << shift; | 2863 uint32_t expected = *j << shift; |
| 2832 CHECK_EQ(expected, m.Call(*j)); | 2864 CHECK_EQ(expected, m.Call(*j)); |
| 2833 } | 2865 } |
| 2834 } | 2866 } |
| 2835 } | 2867 } |
| 2836 { | 2868 { |
| 2837 RawMachineAssemblerTester<int32_t> m; | 2869 RawMachineAssemblerTester<int32_t> m; |
| 2838 Uint32BinopTester bt(&m); | 2870 Uint32BinopTester bt(&m); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 2867 m.Word32Equal(m.Int32Constant(0), m.Word32Shl(bt.param0, bt.param1))); | 2899 m.Word32Equal(m.Int32Constant(0), m.Word32Shl(bt.param0, bt.param1))); |
| 2868 FOR_UINT32_INPUTS(i) { | 2900 FOR_UINT32_INPUTS(i) { |
| 2869 FOR_UINT32_SHIFTS(shift) { | 2901 FOR_UINT32_SHIFTS(shift) { |
| 2870 uint32_t expected = 0 == (*i << shift); | 2902 uint32_t expected = 0 == (*i << shift); |
| 2871 CHECK_EQ(expected, bt.call(*i, shift)); | 2903 CHECK_EQ(expected, bt.call(*i, shift)); |
| 2872 } | 2904 } |
| 2873 } | 2905 } |
| 2874 } | 2906 } |
| 2875 { | 2907 { |
| 2876 FOR_UINT32_SHIFTS(shift) { | 2908 FOR_UINT32_SHIFTS(shift) { |
| 2877 RawMachineAssemblerTester<uint32_t> m(kMachUint32); | 2909 RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32()); |
| 2878 m.Return( | 2910 m.Return( |
| 2879 m.Word32Equal(m.Int32Constant(0), | 2911 m.Word32Equal(m.Int32Constant(0), |
| 2880 m.Word32Shl(m.Parameter(0), m.Int32Constant(shift)))); | 2912 m.Word32Shl(m.Parameter(0), m.Int32Constant(shift)))); |
| 2881 FOR_UINT32_INPUTS(i) { | 2913 FOR_UINT32_INPUTS(i) { |
| 2882 uint32_t expected = 0 == (*i << shift); | 2914 uint32_t expected = 0 == (*i << shift); |
| 2883 CHECK_EQ(expected, m.Call(*i)); | 2915 CHECK_EQ(expected, m.Call(*i)); |
| 2884 } | 2916 } |
| 2885 } | 2917 } |
| 2886 } | 2918 } |
| 2887 { | 2919 { |
| 2888 FOR_UINT32_SHIFTS(shift) { | 2920 FOR_UINT32_SHIFTS(shift) { |
| 2889 RawMachineAssemblerTester<uint32_t> m(kMachUint32); | 2921 RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32()); |
| 2890 m.Return( | 2922 m.Return( |
| 2891 m.Word32Equal(m.Word32Shl(m.Parameter(0), m.Int32Constant(shift)), | 2923 m.Word32Equal(m.Word32Shl(m.Parameter(0), m.Int32Constant(shift)), |
| 2892 m.Int32Constant(0))); | 2924 m.Int32Constant(0))); |
| 2893 FOR_UINT32_INPUTS(i) { | 2925 FOR_UINT32_INPUTS(i) { |
| 2894 uint32_t expected = 0 == (*i << shift); | 2926 uint32_t expected = 0 == (*i << shift); |
| 2895 CHECK_EQ(expected, m.Call(*i)); | 2927 CHECK_EQ(expected, m.Call(*i)); |
| 2896 } | 2928 } |
| 2897 } | 2929 } |
| 2898 } | 2930 } |
| 2899 } | 2931 } |
| 2900 | 2932 |
| 2901 | 2933 |
| 2902 TEST(RunWord32ShrP) { | 2934 TEST(RunWord32ShrP) { |
| 2903 { | 2935 { |
| 2904 FOR_UINT32_SHIFTS(shift) { | 2936 FOR_UINT32_SHIFTS(shift) { |
| 2905 RawMachineAssemblerTester<uint32_t> m(kMachUint32); | 2937 RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32()); |
| 2906 m.Return(m.Word32Shr(m.Parameter(0), m.Int32Constant(shift))); | 2938 m.Return(m.Word32Shr(m.Parameter(0), m.Int32Constant(shift))); |
| 2907 FOR_UINT32_INPUTS(j) { | 2939 FOR_UINT32_INPUTS(j) { |
| 2908 uint32_t expected = *j >> shift; | 2940 uint32_t expected = *j >> shift; |
| 2909 CHECK_EQ(expected, m.Call(*j)); | 2941 CHECK_EQ(expected, m.Call(*j)); |
| 2910 } | 2942 } |
| 2911 } | 2943 } |
| 2912 } | 2944 } |
| 2913 { | 2945 { |
| 2914 RawMachineAssemblerTester<int32_t> m; | 2946 RawMachineAssemblerTester<int32_t> m; |
| 2915 Uint32BinopTester bt(&m); | 2947 Uint32BinopTester bt(&m); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 2945 m.Word32Equal(m.Int32Constant(0), m.Word32Shr(bt.param0, bt.param1))); | 2977 m.Word32Equal(m.Int32Constant(0), m.Word32Shr(bt.param0, bt.param1))); |
| 2946 FOR_UINT32_INPUTS(i) { | 2978 FOR_UINT32_INPUTS(i) { |
| 2947 FOR_UINT32_SHIFTS(shift) { | 2979 FOR_UINT32_SHIFTS(shift) { |
| 2948 uint32_t expected = 0 == (*i >> shift); | 2980 uint32_t expected = 0 == (*i >> shift); |
| 2949 CHECK_EQ(expected, bt.call(*i, shift)); | 2981 CHECK_EQ(expected, bt.call(*i, shift)); |
| 2950 } | 2982 } |
| 2951 } | 2983 } |
| 2952 } | 2984 } |
| 2953 { | 2985 { |
| 2954 FOR_UINT32_SHIFTS(shift) { | 2986 FOR_UINT32_SHIFTS(shift) { |
| 2955 RawMachineAssemblerTester<uint32_t> m(kMachUint32); | 2987 RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32()); |
| 2956 m.Return( | 2988 m.Return( |
| 2957 m.Word32Equal(m.Int32Constant(0), | 2989 m.Word32Equal(m.Int32Constant(0), |
| 2958 m.Word32Shr(m.Parameter(0), m.Int32Constant(shift)))); | 2990 m.Word32Shr(m.Parameter(0), m.Int32Constant(shift)))); |
| 2959 FOR_UINT32_INPUTS(i) { | 2991 FOR_UINT32_INPUTS(i) { |
| 2960 uint32_t expected = 0 == (*i >> shift); | 2992 uint32_t expected = 0 == (*i >> shift); |
| 2961 CHECK_EQ(expected, m.Call(*i)); | 2993 CHECK_EQ(expected, m.Call(*i)); |
| 2962 } | 2994 } |
| 2963 } | 2995 } |
| 2964 } | 2996 } |
| 2965 { | 2997 { |
| 2966 FOR_UINT32_SHIFTS(shift) { | 2998 FOR_UINT32_SHIFTS(shift) { |
| 2967 RawMachineAssemblerTester<uint32_t> m(kMachUint32); | 2999 RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32()); |
| 2968 m.Return( | 3000 m.Return( |
| 2969 m.Word32Equal(m.Word32Shr(m.Parameter(0), m.Int32Constant(shift)), | 3001 m.Word32Equal(m.Word32Shr(m.Parameter(0), m.Int32Constant(shift)), |
| 2970 m.Int32Constant(0))); | 3002 m.Int32Constant(0))); |
| 2971 FOR_UINT32_INPUTS(i) { | 3003 FOR_UINT32_INPUTS(i) { |
| 2972 uint32_t expected = 0 == (*i >> shift); | 3004 uint32_t expected = 0 == (*i >> shift); |
| 2973 CHECK_EQ(expected, m.Call(*i)); | 3005 CHECK_EQ(expected, m.Call(*i)); |
| 2974 } | 3006 } |
| 2975 } | 3007 } |
| 2976 } | 3008 } |
| 2977 } | 3009 } |
| 2978 | 3010 |
| 2979 | 3011 |
| 2980 TEST(RunWord32SarP) { | 3012 TEST(RunWord32SarP) { |
| 2981 { | 3013 { |
| 2982 FOR_INT32_SHIFTS(shift) { | 3014 FOR_INT32_SHIFTS(shift) { |
| 2983 RawMachineAssemblerTester<int32_t> m(kMachInt32); | 3015 RawMachineAssemblerTester<int32_t> m(MachineType::Int32()); |
| 2984 m.Return(m.Word32Sar(m.Parameter(0), m.Int32Constant(shift))); | 3016 m.Return(m.Word32Sar(m.Parameter(0), m.Int32Constant(shift))); |
| 2985 FOR_INT32_INPUTS(j) { | 3017 FOR_INT32_INPUTS(j) { |
| 2986 int32_t expected = *j >> shift; | 3018 int32_t expected = *j >> shift; |
| 2987 CHECK_EQ(expected, m.Call(*j)); | 3019 CHECK_EQ(expected, m.Call(*j)); |
| 2988 } | 3020 } |
| 2989 } | 3021 } |
| 2990 } | 3022 } |
| 2991 { | 3023 { |
| 2992 RawMachineAssemblerTester<int32_t> m; | 3024 RawMachineAssemblerTester<int32_t> m; |
| 2993 Int32BinopTester bt(&m); | 3025 Int32BinopTester bt(&m); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 3023 m.Word32Equal(m.Int32Constant(0), m.Word32Sar(bt.param0, bt.param1))); | 3055 m.Word32Equal(m.Int32Constant(0), m.Word32Sar(bt.param0, bt.param1))); |
| 3024 FOR_INT32_INPUTS(i) { | 3056 FOR_INT32_INPUTS(i) { |
| 3025 FOR_INT32_SHIFTS(shift) { | 3057 FOR_INT32_SHIFTS(shift) { |
| 3026 int32_t expected = 0 == (*i >> shift); | 3058 int32_t expected = 0 == (*i >> shift); |
| 3027 CHECK_EQ(expected, bt.call(*i, shift)); | 3059 CHECK_EQ(expected, bt.call(*i, shift)); |
| 3028 } | 3060 } |
| 3029 } | 3061 } |
| 3030 } | 3062 } |
| 3031 { | 3063 { |
| 3032 FOR_INT32_SHIFTS(shift) { | 3064 FOR_INT32_SHIFTS(shift) { |
| 3033 RawMachineAssemblerTester<int32_t> m(kMachInt32); | 3065 RawMachineAssemblerTester<int32_t> m(MachineType::Int32()); |
| 3034 m.Return( | 3066 m.Return( |
| 3035 m.Word32Equal(m.Int32Constant(0), | 3067 m.Word32Equal(m.Int32Constant(0), |
| 3036 m.Word32Sar(m.Parameter(0), m.Int32Constant(shift)))); | 3068 m.Word32Sar(m.Parameter(0), m.Int32Constant(shift)))); |
| 3037 FOR_INT32_INPUTS(i) { | 3069 FOR_INT32_INPUTS(i) { |
| 3038 int32_t expected = 0 == (*i >> shift); | 3070 int32_t expected = 0 == (*i >> shift); |
| 3039 CHECK_EQ(expected, m.Call(*i)); | 3071 CHECK_EQ(expected, m.Call(*i)); |
| 3040 } | 3072 } |
| 3041 } | 3073 } |
| 3042 } | 3074 } |
| 3043 { | 3075 { |
| 3044 FOR_INT32_SHIFTS(shift) { | 3076 FOR_INT32_SHIFTS(shift) { |
| 3045 RawMachineAssemblerTester<int32_t> m(kMachInt32); | 3077 RawMachineAssemblerTester<int32_t> m(MachineType::Int32()); |
| 3046 m.Return( | 3078 m.Return( |
| 3047 m.Word32Equal(m.Word32Sar(m.Parameter(0), m.Int32Constant(shift)), | 3079 m.Word32Equal(m.Word32Sar(m.Parameter(0), m.Int32Constant(shift)), |
| 3048 m.Int32Constant(0))); | 3080 m.Int32Constant(0))); |
| 3049 FOR_INT32_INPUTS(i) { | 3081 FOR_INT32_INPUTS(i) { |
| 3050 int32_t expected = 0 == (*i >> shift); | 3082 int32_t expected = 0 == (*i >> shift); |
| 3051 CHECK_EQ(expected, m.Call(*i)); | 3083 CHECK_EQ(expected, m.Call(*i)); |
| 3052 } | 3084 } |
| 3053 } | 3085 } |
| 3054 } | 3086 } |
| 3055 } | 3087 } |
| 3056 | 3088 |
| 3057 | 3089 |
| 3058 TEST(RunWord32RorP) { | 3090 TEST(RunWord32RorP) { |
| 3059 { | 3091 { |
| 3060 FOR_UINT32_SHIFTS(shift) { | 3092 FOR_UINT32_SHIFTS(shift) { |
| 3061 RawMachineAssemblerTester<int32_t> m(kMachUint32); | 3093 RawMachineAssemblerTester<int32_t> m(MachineType::Uint32()); |
| 3062 m.Return(m.Word32Ror(m.Parameter(0), m.Int32Constant(shift))); | 3094 m.Return(m.Word32Ror(m.Parameter(0), m.Int32Constant(shift))); |
| 3063 FOR_UINT32_INPUTS(j) { | 3095 FOR_UINT32_INPUTS(j) { |
| 3064 int32_t expected = bits::RotateRight32(*j, shift); | 3096 int32_t expected = bits::RotateRight32(*j, shift); |
| 3065 CHECK_EQ(expected, m.Call(*j)); | 3097 CHECK_EQ(expected, m.Call(*j)); |
| 3066 } | 3098 } |
| 3067 } | 3099 } |
| 3068 } | 3100 } |
| 3069 { | 3101 { |
| 3070 RawMachineAssemblerTester<int32_t> m; | 3102 RawMachineAssemblerTester<int32_t> m; |
| 3071 Uint32BinopTester bt(&m); | 3103 Uint32BinopTester bt(&m); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 3100 m.Word32Equal(m.Int32Constant(0), m.Word32Ror(bt.param0, bt.param1))); | 3132 m.Word32Equal(m.Int32Constant(0), m.Word32Ror(bt.param0, bt.param1))); |
| 3101 FOR_UINT32_INPUTS(i) { | 3133 FOR_UINT32_INPUTS(i) { |
| 3102 FOR_UINT32_SHIFTS(shift) { | 3134 FOR_UINT32_SHIFTS(shift) { |
| 3103 uint32_t expected = 0 == bits::RotateRight32(*i, shift); | 3135 uint32_t expected = 0 == bits::RotateRight32(*i, shift); |
| 3104 CHECK_EQ(expected, bt.call(*i, shift)); | 3136 CHECK_EQ(expected, bt.call(*i, shift)); |
| 3105 } | 3137 } |
| 3106 } | 3138 } |
| 3107 } | 3139 } |
| 3108 { | 3140 { |
| 3109 FOR_UINT32_SHIFTS(shift) { | 3141 FOR_UINT32_SHIFTS(shift) { |
| 3110 RawMachineAssemblerTester<uint32_t> m(kMachUint32); | 3142 RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32()); |
| 3111 m.Return( | 3143 m.Return( |
| 3112 m.Word32Equal(m.Int32Constant(0), | 3144 m.Word32Equal(m.Int32Constant(0), |
| 3113 m.Word32Ror(m.Parameter(0), m.Int32Constant(shift)))); | 3145 m.Word32Ror(m.Parameter(0), m.Int32Constant(shift)))); |
| 3114 FOR_UINT32_INPUTS(i) { | 3146 FOR_UINT32_INPUTS(i) { |
| 3115 uint32_t expected = 0 == bits::RotateRight32(*i, shift); | 3147 uint32_t expected = 0 == bits::RotateRight32(*i, shift); |
| 3116 CHECK_EQ(expected, m.Call(*i)); | 3148 CHECK_EQ(expected, m.Call(*i)); |
| 3117 } | 3149 } |
| 3118 } | 3150 } |
| 3119 } | 3151 } |
| 3120 { | 3152 { |
| 3121 FOR_UINT32_SHIFTS(shift) { | 3153 FOR_UINT32_SHIFTS(shift) { |
| 3122 RawMachineAssemblerTester<uint32_t> m(kMachUint32); | 3154 RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32()); |
| 3123 m.Return( | 3155 m.Return( |
| 3124 m.Word32Equal(m.Word32Ror(m.Parameter(0), m.Int32Constant(shift)), | 3156 m.Word32Equal(m.Word32Ror(m.Parameter(0), m.Int32Constant(shift)), |
| 3125 m.Int32Constant(0))); | 3157 m.Int32Constant(0))); |
| 3126 FOR_UINT32_INPUTS(i) { | 3158 FOR_UINT32_INPUTS(i) { |
| 3127 uint32_t expected = 0 == bits::RotateRight32(*i, shift); | 3159 uint32_t expected = 0 == bits::RotateRight32(*i, shift); |
| 3128 CHECK_EQ(expected, m.Call(*i)); | 3160 CHECK_EQ(expected, m.Call(*i)); |
| 3129 } | 3161 } |
| 3130 } | 3162 } |
| 3131 } | 3163 } |
| 3132 } | 3164 } |
| 3133 | 3165 |
| 3134 | 3166 |
| 3135 TEST(RunWord32NotP) { | 3167 TEST(RunWord32NotP) { |
| 3136 RawMachineAssemblerTester<int32_t> m(kMachInt32); | 3168 RawMachineAssemblerTester<int32_t> m(MachineType::Int32()); |
| 3137 m.Return(m.Word32Not(m.Parameter(0))); | 3169 m.Return(m.Word32Not(m.Parameter(0))); |
| 3138 FOR_INT32_INPUTS(i) { | 3170 FOR_INT32_INPUTS(i) { |
| 3139 int expected = ~(*i); | 3171 int expected = ~(*i); |
| 3140 CHECK_EQ(expected, m.Call(*i)); | 3172 CHECK_EQ(expected, m.Call(*i)); |
| 3141 } | 3173 } |
| 3142 } | 3174 } |
| 3143 | 3175 |
| 3144 | 3176 |
| 3145 TEST(RunInt32NegP) { | 3177 TEST(RunInt32NegP) { |
| 3146 RawMachineAssemblerTester<int32_t> m(kMachInt32); | 3178 RawMachineAssemblerTester<int32_t> m(MachineType::Int32()); |
| 3147 m.Return(m.Int32Neg(m.Parameter(0))); | 3179 m.Return(m.Int32Neg(m.Parameter(0))); |
| 3148 FOR_INT32_INPUTS(i) { | 3180 FOR_INT32_INPUTS(i) { |
| 3149 int expected = -*i; | 3181 int expected = -*i; |
| 3150 CHECK_EQ(expected, m.Call(*i)); | 3182 CHECK_EQ(expected, m.Call(*i)); |
| 3151 } | 3183 } |
| 3152 } | 3184 } |
| 3153 | 3185 |
| 3154 | 3186 |
| 3155 TEST(RunWord32EqualAndWord32SarP) { | 3187 TEST(RunWord32EqualAndWord32SarP) { |
| 3156 { | 3188 { |
| 3157 RawMachineAssemblerTester<int32_t> m(kMachInt32, kMachInt32, kMachUint32); | 3189 RawMachineAssemblerTester<int32_t> m( |
| 3190 MachineType::Int32(), MachineType::Int32(), MachineType::Uint32()); |
| 3158 m.Return(m.Word32Equal(m.Parameter(0), | 3191 m.Return(m.Word32Equal(m.Parameter(0), |
| 3159 m.Word32Sar(m.Parameter(1), m.Parameter(2)))); | 3192 m.Word32Sar(m.Parameter(1), m.Parameter(2)))); |
| 3160 FOR_INT32_INPUTS(i) { | 3193 FOR_INT32_INPUTS(i) { |
| 3161 FOR_INT32_INPUTS(j) { | 3194 FOR_INT32_INPUTS(j) { |
| 3162 FOR_UINT32_SHIFTS(shift) { | 3195 FOR_UINT32_SHIFTS(shift) { |
| 3163 int32_t expected = (*i == (*j >> shift)); | 3196 int32_t expected = (*i == (*j >> shift)); |
| 3164 CHECK_EQ(expected, m.Call(*i, *j, shift)); | 3197 CHECK_EQ(expected, m.Call(*i, *j, shift)); |
| 3165 } | 3198 } |
| 3166 } | 3199 } |
| 3167 } | 3200 } |
| 3168 } | 3201 } |
| 3169 { | 3202 { |
| 3170 RawMachineAssemblerTester<int32_t> m(kMachInt32, kMachUint32, kMachInt32); | 3203 RawMachineAssemblerTester<int32_t> m( |
| 3204 MachineType::Int32(), MachineType::Uint32(), MachineType::Int32()); |
| 3171 m.Return(m.Word32Equal(m.Word32Sar(m.Parameter(0), m.Parameter(1)), | 3205 m.Return(m.Word32Equal(m.Word32Sar(m.Parameter(0), m.Parameter(1)), |
| 3172 m.Parameter(2))); | 3206 m.Parameter(2))); |
| 3173 FOR_INT32_INPUTS(i) { | 3207 FOR_INT32_INPUTS(i) { |
| 3174 FOR_UINT32_SHIFTS(shift) { | 3208 FOR_UINT32_SHIFTS(shift) { |
| 3175 FOR_INT32_INPUTS(k) { | 3209 FOR_INT32_INPUTS(k) { |
| 3176 int32_t expected = ((*i >> shift) == *k); | 3210 int32_t expected = ((*i >> shift) == *k); |
| 3177 CHECK_EQ(expected, m.Call(*i, shift, *k)); | 3211 CHECK_EQ(expected, m.Call(*i, shift, *k)); |
| 3178 } | 3212 } |
| 3179 } | 3213 } |
| 3180 } | 3214 } |
| 3181 } | 3215 } |
| 3182 } | 3216 } |
| 3183 | 3217 |
| 3184 | 3218 |
| 3185 TEST(RunWord32EqualAndWord32ShlP) { | 3219 TEST(RunWord32EqualAndWord32ShlP) { |
| 3186 { | 3220 { |
| 3187 RawMachineAssemblerTester<int32_t> m(kMachUint32, kMachUint32, kMachUint32); | 3221 RawMachineAssemblerTester<int32_t> m( |
| 3222 MachineType::Uint32(), MachineType::Uint32(), MachineType::Uint32()); |
| 3188 m.Return(m.Word32Equal(m.Parameter(0), | 3223 m.Return(m.Word32Equal(m.Parameter(0), |
| 3189 m.Word32Shl(m.Parameter(1), m.Parameter(2)))); | 3224 m.Word32Shl(m.Parameter(1), m.Parameter(2)))); |
| 3190 FOR_UINT32_INPUTS(i) { | 3225 FOR_UINT32_INPUTS(i) { |
| 3191 FOR_UINT32_INPUTS(j) { | 3226 FOR_UINT32_INPUTS(j) { |
| 3192 FOR_UINT32_SHIFTS(shift) { | 3227 FOR_UINT32_SHIFTS(shift) { |
| 3193 int32_t expected = (*i == (*j << shift)); | 3228 int32_t expected = (*i == (*j << shift)); |
| 3194 CHECK_EQ(expected, m.Call(*i, *j, shift)); | 3229 CHECK_EQ(expected, m.Call(*i, *j, shift)); |
| 3195 } | 3230 } |
| 3196 } | 3231 } |
| 3197 } | 3232 } |
| 3198 } | 3233 } |
| 3199 { | 3234 { |
| 3200 RawMachineAssemblerTester<int32_t> m(kMachUint32, kMachUint32, kMachUint32); | 3235 RawMachineAssemblerTester<int32_t> m( |
| 3236 MachineType::Uint32(), MachineType::Uint32(), MachineType::Uint32()); |
| 3201 m.Return(m.Word32Equal(m.Word32Shl(m.Parameter(0), m.Parameter(1)), | 3237 m.Return(m.Word32Equal(m.Word32Shl(m.Parameter(0), m.Parameter(1)), |
| 3202 m.Parameter(2))); | 3238 m.Parameter(2))); |
| 3203 FOR_UINT32_INPUTS(i) { | 3239 FOR_UINT32_INPUTS(i) { |
| 3204 FOR_UINT32_SHIFTS(shift) { | 3240 FOR_UINT32_SHIFTS(shift) { |
| 3205 FOR_UINT32_INPUTS(k) { | 3241 FOR_UINT32_INPUTS(k) { |
| 3206 int32_t expected = ((*i << shift) == *k); | 3242 int32_t expected = ((*i << shift) == *k); |
| 3207 CHECK_EQ(expected, m.Call(*i, shift, *k)); | 3243 CHECK_EQ(expected, m.Call(*i, shift, *k)); |
| 3208 } | 3244 } |
| 3209 } | 3245 } |
| 3210 } | 3246 } |
| 3211 } | 3247 } |
| 3212 } | 3248 } |
| 3213 | 3249 |
| 3214 | 3250 |
| 3215 TEST(RunWord32EqualAndWord32ShrP) { | 3251 TEST(RunWord32EqualAndWord32ShrP) { |
| 3216 { | 3252 { |
| 3217 RawMachineAssemblerTester<int32_t> m(kMachUint32, kMachUint32, kMachUint32); | 3253 RawMachineAssemblerTester<int32_t> m( |
| 3254 MachineType::Uint32(), MachineType::Uint32(), MachineType::Uint32()); |
| 3218 m.Return(m.Word32Equal(m.Parameter(0), | 3255 m.Return(m.Word32Equal(m.Parameter(0), |
| 3219 m.Word32Shr(m.Parameter(1), m.Parameter(2)))); | 3256 m.Word32Shr(m.Parameter(1), m.Parameter(2)))); |
| 3220 FOR_UINT32_INPUTS(i) { | 3257 FOR_UINT32_INPUTS(i) { |
| 3221 FOR_UINT32_INPUTS(j) { | 3258 FOR_UINT32_INPUTS(j) { |
| 3222 FOR_UINT32_SHIFTS(shift) { | 3259 FOR_UINT32_SHIFTS(shift) { |
| 3223 int32_t expected = (*i == (*j >> shift)); | 3260 int32_t expected = (*i == (*j >> shift)); |
| 3224 CHECK_EQ(expected, m.Call(*i, *j, shift)); | 3261 CHECK_EQ(expected, m.Call(*i, *j, shift)); |
| 3225 } | 3262 } |
| 3226 } | 3263 } |
| 3227 } | 3264 } |
| 3228 } | 3265 } |
| 3229 { | 3266 { |
| 3230 RawMachineAssemblerTester<int32_t> m(kMachUint32, kMachUint32, kMachUint32); | 3267 RawMachineAssemblerTester<int32_t> m( |
| 3268 MachineType::Uint32(), MachineType::Uint32(), MachineType::Uint32()); |
| 3231 m.Return(m.Word32Equal(m.Word32Shr(m.Parameter(0), m.Parameter(1)), | 3269 m.Return(m.Word32Equal(m.Word32Shr(m.Parameter(0), m.Parameter(1)), |
| 3232 m.Parameter(2))); | 3270 m.Parameter(2))); |
| 3233 FOR_UINT32_INPUTS(i) { | 3271 FOR_UINT32_INPUTS(i) { |
| 3234 FOR_UINT32_SHIFTS(shift) { | 3272 FOR_UINT32_SHIFTS(shift) { |
| 3235 FOR_UINT32_INPUTS(k) { | 3273 FOR_UINT32_INPUTS(k) { |
| 3236 int32_t expected = ((*i >> shift) == *k); | 3274 int32_t expected = ((*i >> shift) == *k); |
| 3237 CHECK_EQ(expected, m.Call(*i, shift, *k)); | 3275 CHECK_EQ(expected, m.Call(*i, shift, *k)); |
| 3238 } | 3276 } |
| 3239 } | 3277 } |
| 3240 } | 3278 } |
| 3241 } | 3279 } |
| 3242 } | 3280 } |
| 3243 | 3281 |
| 3244 | 3282 |
| 3245 TEST(RunDeadNodes) { | 3283 TEST(RunDeadNodes) { |
| 3246 for (int i = 0; true; i++) { | 3284 for (int i = 0; true; i++) { |
| 3247 RawMachineAssemblerTester<int32_t> m(i == 5 ? kMachInt32 : kMachNone); | 3285 RawMachineAssemblerTester<int32_t> m(i == 5 ? MachineType::Int32() |
| 3286 : MachineType::None()); |
| 3248 int constant = 0x55 + i; | 3287 int constant = 0x55 + i; |
| 3249 switch (i) { | 3288 switch (i) { |
| 3250 case 0: | 3289 case 0: |
| 3251 m.Int32Constant(44); | 3290 m.Int32Constant(44); |
| 3252 break; | 3291 break; |
| 3253 case 1: | 3292 case 1: |
| 3254 m.StringConstant("unused"); | 3293 m.StringConstant("unused"); |
| 3255 break; | 3294 break; |
| 3256 case 2: | 3295 case 2: |
| 3257 m.NumberConstant(11.1); | 3296 m.NumberConstant(11.1); |
| 3258 break; | 3297 break; |
| 3259 case 3: | 3298 case 3: |
| 3260 m.PointerConstant(&constant); | 3299 m.PointerConstant(&constant); |
| 3261 break; | 3300 break; |
| 3262 case 4: | 3301 case 4: |
| 3263 m.LoadFromPointer(&constant, kMachInt32); | 3302 m.LoadFromPointer(&constant, MachineType::Int32()); |
| 3264 break; | 3303 break; |
| 3265 case 5: | 3304 case 5: |
| 3266 m.Parameter(0); | 3305 m.Parameter(0); |
| 3267 break; | 3306 break; |
| 3268 default: | 3307 default: |
| 3269 return; | 3308 return; |
| 3270 } | 3309 } |
| 3271 m.Return(m.Int32Constant(constant)); | 3310 m.Return(m.Int32Constant(constant)); |
| 3272 if (i != 5) { | 3311 if (i != 5) { |
| 3273 CHECK_EQ(constant, m.Call()); | 3312 CHECK_EQ(constant, m.Call()); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 3288 m.machine()->Word32Ror(), m.machine()->Word32Equal(), | 3327 m.machine()->Word32Ror(), m.machine()->Word32Equal(), |
| 3289 m.machine()->Int32Add(), m.machine()->Int32Sub(), | 3328 m.machine()->Int32Add(), m.machine()->Int32Sub(), |
| 3290 m.machine()->Int32Mul(), m.machine()->Int32MulHigh(), | 3329 m.machine()->Int32Mul(), m.machine()->Int32MulHigh(), |
| 3291 m.machine()->Int32Div(), m.machine()->Uint32Div(), | 3330 m.machine()->Int32Div(), m.machine()->Uint32Div(), |
| 3292 m.machine()->Int32Mod(), m.machine()->Uint32Mod(), | 3331 m.machine()->Int32Mod(), m.machine()->Uint32Mod(), |
| 3293 m.machine()->Uint32MulHigh(), m.machine()->Int32LessThan(), | 3332 m.machine()->Uint32MulHigh(), m.machine()->Int32LessThan(), |
| 3294 m.machine()->Int32LessThanOrEqual(), m.machine()->Uint32LessThan(), | 3333 m.machine()->Int32LessThanOrEqual(), m.machine()->Uint32LessThan(), |
| 3295 m.machine()->Uint32LessThanOrEqual()}; | 3334 m.machine()->Uint32LessThanOrEqual()}; |
| 3296 | 3335 |
| 3297 for (size_t i = 0; i < arraysize(kOps); ++i) { | 3336 for (size_t i = 0; i < arraysize(kOps); ++i) { |
| 3298 RawMachineAssemblerTester<int32_t> m(kMachInt32, kMachInt32); | 3337 RawMachineAssemblerTester<int32_t> m(MachineType::Int32(), |
| 3338 MachineType::Int32()); |
| 3299 int32_t constant = static_cast<int32_t>(0x55555 + i); | 3339 int32_t constant = static_cast<int32_t>(0x55555 + i); |
| 3300 m.AddNode(kOps[i], m.Parameter(0), m.Parameter(1)); | 3340 m.AddNode(kOps[i], m.Parameter(0), m.Parameter(1)); |
| 3301 m.Return(m.Int32Constant(constant)); | 3341 m.Return(m.Int32Constant(constant)); |
| 3302 | 3342 |
| 3303 CHECK_EQ(constant, m.Call(1, 1)); | 3343 CHECK_EQ(constant, m.Call(1, 1)); |
| 3304 } | 3344 } |
| 3305 } | 3345 } |
| 3306 | 3346 |
| 3307 | 3347 |
| 3308 template <typename Type> | 3348 template <typename Type> |
| (...skipping 17 matching lines...) Expand all Loading... |
| 3326 | 3366 |
| 3327 Type expected = buffer[i]; | 3367 Type expected = buffer[i]; |
| 3328 Type actual = m.Call(); | 3368 Type actual = m.Call(); |
| 3329 CHECK(expected == actual); | 3369 CHECK(expected == actual); |
| 3330 } | 3370 } |
| 3331 } | 3371 } |
| 3332 } | 3372 } |
| 3333 | 3373 |
| 3334 | 3374 |
| 3335 TEST(RunLoadImmIndex) { | 3375 TEST(RunLoadImmIndex) { |
| 3336 RunLoadImmIndex<int8_t>(kMachInt8); | 3376 RunLoadImmIndex<int8_t>(MachineType::Int8()); |
| 3337 RunLoadImmIndex<uint8_t>(kMachUint8); | 3377 RunLoadImmIndex<uint8_t>(MachineType::Uint8()); |
| 3338 RunLoadImmIndex<int16_t>(kMachInt16); | 3378 RunLoadImmIndex<int16_t>(MachineType::Int16()); |
| 3339 RunLoadImmIndex<uint16_t>(kMachUint16); | 3379 RunLoadImmIndex<uint16_t>(MachineType::Uint16()); |
| 3340 RunLoadImmIndex<int32_t>(kMachInt32); | 3380 RunLoadImmIndex<int32_t>(MachineType::Int32()); |
| 3341 RunLoadImmIndex<uint32_t>(kMachUint32); | 3381 RunLoadImmIndex<uint32_t>(MachineType::Uint32()); |
| 3342 RunLoadImmIndex<int32_t*>(kMachAnyTagged); | 3382 RunLoadImmIndex<int32_t*>(MachineType::AnyTagged()); |
| 3343 | 3383 |
| 3344 // TODO(titzer): test kRepBit loads | 3384 // TODO(titzer): test kRepBit loads |
| 3345 // TODO(titzer): test kMachFloat64 loads | 3385 // TODO(titzer): test MachineType::Float64() loads |
| 3346 // TODO(titzer): test various indexing modes. | 3386 // TODO(titzer): test various indexing modes. |
| 3347 } | 3387 } |
| 3348 | 3388 |
| 3349 | 3389 |
| 3350 template <typename CType> | 3390 template <typename CType> |
| 3351 static void RunLoadStore(MachineType rep) { | 3391 static void RunLoadStore(MachineType rep) { |
| 3352 const int kNumElems = 4; | 3392 const int kNumElems = 4; |
| 3353 CType buffer[kNumElems]; | 3393 CType buffer[kNumElems]; |
| 3354 | 3394 |
| 3355 for (int32_t x = 0; x < kNumElems; x++) { | 3395 for (int32_t x = 0; x < kNumElems; x++) { |
| (...skipping 14 matching lines...) Expand all Loading... |
| 3370 m.Return(m.Int32Constant(OK)); | 3410 m.Return(m.Int32Constant(OK)); |
| 3371 | 3411 |
| 3372 CHECK(buffer[x] != buffer[y]); | 3412 CHECK(buffer[x] != buffer[y]); |
| 3373 CHECK_EQ(OK, m.Call()); | 3413 CHECK_EQ(OK, m.Call()); |
| 3374 CHECK(buffer[x] == buffer[y]); | 3414 CHECK(buffer[x] == buffer[y]); |
| 3375 } | 3415 } |
| 3376 } | 3416 } |
| 3377 | 3417 |
| 3378 | 3418 |
| 3379 TEST(RunLoadStore) { | 3419 TEST(RunLoadStore) { |
| 3380 RunLoadStore<int8_t>(kMachInt8); | 3420 RunLoadStore<int8_t>(MachineType::Int8()); |
| 3381 RunLoadStore<uint8_t>(kMachUint8); | 3421 RunLoadStore<uint8_t>(MachineType::Uint8()); |
| 3382 RunLoadStore<int16_t>(kMachInt16); | 3422 RunLoadStore<int16_t>(MachineType::Int16()); |
| 3383 RunLoadStore<uint16_t>(kMachUint16); | 3423 RunLoadStore<uint16_t>(MachineType::Uint16()); |
| 3384 RunLoadStore<int32_t>(kMachInt32); | 3424 RunLoadStore<int32_t>(MachineType::Int32()); |
| 3385 RunLoadStore<uint32_t>(kMachUint32); | 3425 RunLoadStore<uint32_t>(MachineType::Uint32()); |
| 3386 RunLoadStore<void*>(kMachAnyTagged); | 3426 RunLoadStore<void*>(MachineType::AnyTagged()); |
| 3387 RunLoadStore<float>(kMachFloat32); | 3427 RunLoadStore<float>(MachineType::Float32()); |
| 3388 RunLoadStore<double>(kMachFloat64); | 3428 RunLoadStore<double>(MachineType::Float64()); |
| 3389 } | 3429 } |
| 3390 | 3430 |
| 3391 | 3431 |
| 3392 TEST(RunFloat32Add) { | 3432 TEST(RunFloat32Add) { |
| 3393 BufferedRawMachineAssemblerTester<float> m(kMachFloat32, kMachFloat32); | 3433 BufferedRawMachineAssemblerTester<float> m(MachineType::Float32(), |
| 3434 MachineType::Float32()); |
| 3394 m.Return(m.Float32Add(m.Parameter(0), m.Parameter(1))); | 3435 m.Return(m.Float32Add(m.Parameter(0), m.Parameter(1))); |
| 3395 | 3436 |
| 3396 FOR_FLOAT32_INPUTS(i) { | 3437 FOR_FLOAT32_INPUTS(i) { |
| 3397 FOR_FLOAT32_INPUTS(j) { | 3438 FOR_FLOAT32_INPUTS(j) { |
| 3398 volatile float expected = *i + *j; | 3439 volatile float expected = *i + *j; |
| 3399 CheckFloatEq(expected, m.Call(*i, *j)); | 3440 CheckFloatEq(expected, m.Call(*i, *j)); |
| 3400 } | 3441 } |
| 3401 } | 3442 } |
| 3402 } | 3443 } |
| 3403 | 3444 |
| 3404 | 3445 |
| 3405 TEST(RunFloat32Sub) { | 3446 TEST(RunFloat32Sub) { |
| 3406 BufferedRawMachineAssemblerTester<float> m(kMachFloat32, kMachFloat32); | 3447 BufferedRawMachineAssemblerTester<float> m(MachineType::Float32(), |
| 3448 MachineType::Float32()); |
| 3407 m.Return(m.Float32Sub(m.Parameter(0), m.Parameter(1))); | 3449 m.Return(m.Float32Sub(m.Parameter(0), m.Parameter(1))); |
| 3408 | 3450 |
| 3409 FOR_FLOAT32_INPUTS(i) { | 3451 FOR_FLOAT32_INPUTS(i) { |
| 3410 FOR_FLOAT32_INPUTS(j) { | 3452 FOR_FLOAT32_INPUTS(j) { |
| 3411 volatile float expected = *i - *j; | 3453 volatile float expected = *i - *j; |
| 3412 CheckFloatEq(expected, m.Call(*i, *j)); | 3454 CheckFloatEq(expected, m.Call(*i, *j)); |
| 3413 } | 3455 } |
| 3414 } | 3456 } |
| 3415 } | 3457 } |
| 3416 | 3458 |
| 3417 | 3459 |
| 3418 TEST(RunFloat32Mul) { | 3460 TEST(RunFloat32Mul) { |
| 3419 BufferedRawMachineAssemblerTester<float> m(kMachFloat32, kMachFloat32); | 3461 BufferedRawMachineAssemblerTester<float> m(MachineType::Float32(), |
| 3462 MachineType::Float32()); |
| 3420 m.Return(m.Float32Mul(m.Parameter(0), m.Parameter(1))); | 3463 m.Return(m.Float32Mul(m.Parameter(0), m.Parameter(1))); |
| 3421 | 3464 |
| 3422 FOR_FLOAT32_INPUTS(i) { | 3465 FOR_FLOAT32_INPUTS(i) { |
| 3423 FOR_FLOAT32_INPUTS(j) { | 3466 FOR_FLOAT32_INPUTS(j) { |
| 3424 volatile float expected = *i * *j; | 3467 volatile float expected = *i * *j; |
| 3425 CheckFloatEq(expected, m.Call(*i, *j)); | 3468 CheckFloatEq(expected, m.Call(*i, *j)); |
| 3426 } | 3469 } |
| 3427 } | 3470 } |
| 3428 } | 3471 } |
| 3429 | 3472 |
| 3430 | 3473 |
| 3431 TEST(RunFloat32Div) { | 3474 TEST(RunFloat32Div) { |
| 3432 BufferedRawMachineAssemblerTester<float> m(kMachFloat32, kMachFloat32); | 3475 BufferedRawMachineAssemblerTester<float> m(MachineType::Float32(), |
| 3476 MachineType::Float32()); |
| 3433 m.Return(m.Float32Div(m.Parameter(0), m.Parameter(1))); | 3477 m.Return(m.Float32Div(m.Parameter(0), m.Parameter(1))); |
| 3434 | 3478 |
| 3435 FOR_FLOAT32_INPUTS(i) { | 3479 FOR_FLOAT32_INPUTS(i) { |
| 3436 FOR_FLOAT32_INPUTS(j) { | 3480 FOR_FLOAT32_INPUTS(j) { |
| 3437 volatile float expected = *i / *j; | 3481 volatile float expected = *i / *j; |
| 3438 CheckFloatEq(expected, m.Call(*i, *j)); | 3482 CheckFloatEq(expected, m.Call(*i, *j)); |
| 3439 } | 3483 } |
| 3440 } | 3484 } |
| 3441 } | 3485 } |
| 3442 | 3486 |
| 3443 | 3487 |
| 3444 TEST(RunFloat64Add) { | 3488 TEST(RunFloat64Add) { |
| 3445 BufferedRawMachineAssemblerTester<double> m(kMachFloat64, kMachFloat64); | 3489 BufferedRawMachineAssemblerTester<double> m(MachineType::Float64(), |
| 3490 MachineType::Float64()); |
| 3446 m.Return(m.Float64Add(m.Parameter(0), m.Parameter(1))); | 3491 m.Return(m.Float64Add(m.Parameter(0), m.Parameter(1))); |
| 3447 | 3492 |
| 3448 FOR_FLOAT64_INPUTS(i) { | 3493 FOR_FLOAT64_INPUTS(i) { |
| 3449 FOR_FLOAT64_INPUTS(j) { CheckDoubleEq(*i + *j, m.Call(*i, *j)); } | 3494 FOR_FLOAT64_INPUTS(j) { CheckDoubleEq(*i + *j, m.Call(*i, *j)); } |
| 3450 } | 3495 } |
| 3451 } | 3496 } |
| 3452 | 3497 |
| 3453 | 3498 |
| 3454 TEST(RunFloat64Sub) { | 3499 TEST(RunFloat64Sub) { |
| 3455 BufferedRawMachineAssemblerTester<double> m(kMachFloat64, kMachFloat64); | 3500 BufferedRawMachineAssemblerTester<double> m(MachineType::Float64(), |
| 3501 MachineType::Float64()); |
| 3456 m.Return(m.Float64Sub(m.Parameter(0), m.Parameter(1))); | 3502 m.Return(m.Float64Sub(m.Parameter(0), m.Parameter(1))); |
| 3457 | 3503 |
| 3458 FOR_FLOAT64_INPUTS(i) { | 3504 FOR_FLOAT64_INPUTS(i) { |
| 3459 FOR_FLOAT64_INPUTS(j) { CheckDoubleEq(*i - *j, m.Call(*i, *j)); } | 3505 FOR_FLOAT64_INPUTS(j) { CheckDoubleEq(*i - *j, m.Call(*i, *j)); } |
| 3460 } | 3506 } |
| 3461 } | 3507 } |
| 3462 | 3508 |
| 3463 | 3509 |
| 3464 TEST(RunFloat64Mul) { | 3510 TEST(RunFloat64Mul) { |
| 3465 BufferedRawMachineAssemblerTester<double> m(kMachFloat64, kMachFloat64); | 3511 BufferedRawMachineAssemblerTester<double> m(MachineType::Float64(), |
| 3512 MachineType::Float64()); |
| 3466 m.Return(m.Float64Mul(m.Parameter(0), m.Parameter(1))); | 3513 m.Return(m.Float64Mul(m.Parameter(0), m.Parameter(1))); |
| 3467 | 3514 |
| 3468 FOR_FLOAT64_INPUTS(i) { | 3515 FOR_FLOAT64_INPUTS(i) { |
| 3469 FOR_FLOAT64_INPUTS(j) { | 3516 FOR_FLOAT64_INPUTS(j) { |
| 3470 volatile double expected = *i * *j; | 3517 volatile double expected = *i * *j; |
| 3471 CheckDoubleEq(expected, m.Call(*i, *j)); | 3518 CheckDoubleEq(expected, m.Call(*i, *j)); |
| 3472 } | 3519 } |
| 3473 } | 3520 } |
| 3474 } | 3521 } |
| 3475 | 3522 |
| 3476 | 3523 |
| 3477 TEST(RunFloat64Div) { | 3524 TEST(RunFloat64Div) { |
| 3478 BufferedRawMachineAssemblerTester<double> m(kMachFloat64, kMachFloat64); | 3525 BufferedRawMachineAssemblerTester<double> m(MachineType::Float64(), |
| 3526 MachineType::Float64()); |
| 3479 m.Return(m.Float64Div(m.Parameter(0), m.Parameter(1))); | 3527 m.Return(m.Float64Div(m.Parameter(0), m.Parameter(1))); |
| 3480 | 3528 |
| 3481 FOR_FLOAT64_INPUTS(i) { | 3529 FOR_FLOAT64_INPUTS(i) { |
| 3482 FOR_FLOAT64_INPUTS(j) { | 3530 FOR_FLOAT64_INPUTS(j) { |
| 3483 volatile double expected = *i / *j; | 3531 volatile double expected = *i / *j; |
| 3484 CheckDoubleEq(expected, m.Call(*i, *j)); | 3532 CheckDoubleEq(expected, m.Call(*i, *j)); |
| 3485 } | 3533 } |
| 3486 } | 3534 } |
| 3487 } | 3535 } |
| 3488 | 3536 |
| 3489 | 3537 |
| 3490 TEST(RunFloat64Mod) { | 3538 TEST(RunFloat64Mod) { |
| 3491 BufferedRawMachineAssemblerTester<double> m(kMachFloat64, kMachFloat64); | 3539 BufferedRawMachineAssemblerTester<double> m(MachineType::Float64(), |
| 3540 MachineType::Float64()); |
| 3492 m.Return(m.Float64Mod(m.Parameter(0), m.Parameter(1))); | 3541 m.Return(m.Float64Mod(m.Parameter(0), m.Parameter(1))); |
| 3493 | 3542 |
| 3494 FOR_FLOAT64_INPUTS(i) { | 3543 FOR_FLOAT64_INPUTS(i) { |
| 3495 FOR_FLOAT64_INPUTS(j) { CheckDoubleEq(modulo(*i, *j), m.Call(*i, *j)); } | 3544 FOR_FLOAT64_INPUTS(j) { CheckDoubleEq(modulo(*i, *j), m.Call(*i, *j)); } |
| 3496 } | 3545 } |
| 3497 } | 3546 } |
| 3498 | 3547 |
| 3499 | 3548 |
| 3500 TEST(RunDeadFloat32Binops) { | 3549 TEST(RunDeadFloat32Binops) { |
| 3501 RawMachineAssemblerTester<int32_t> m; | 3550 RawMachineAssemblerTester<int32_t> m; |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3635 FOR_FLOAT32_INPUTS(pr) { | 3684 FOR_FLOAT32_INPUTS(pr) { |
| 3636 float expected = *pl - *pr; | 3685 float expected = *pl - *pr; |
| 3637 CheckFloatEq(expected, bt.call(*pl, *pr)); | 3686 CheckFloatEq(expected, bt.call(*pl, *pr)); |
| 3638 } | 3687 } |
| 3639 } | 3688 } |
| 3640 } | 3689 } |
| 3641 | 3690 |
| 3642 | 3691 |
| 3643 TEST(RunFloat32SubImm1) { | 3692 TEST(RunFloat32SubImm1) { |
| 3644 FOR_FLOAT32_INPUTS(i) { | 3693 FOR_FLOAT32_INPUTS(i) { |
| 3645 BufferedRawMachineAssemblerTester<float> m(kMachFloat32); | 3694 BufferedRawMachineAssemblerTester<float> m(MachineType::Float32()); |
| 3646 m.Return(m.Float32Sub(m.Float32Constant(*i), m.Parameter(0))); | 3695 m.Return(m.Float32Sub(m.Float32Constant(*i), m.Parameter(0))); |
| 3647 | 3696 |
| 3648 FOR_FLOAT32_INPUTS(j) { | 3697 FOR_FLOAT32_INPUTS(j) { |
| 3649 volatile float expected = *i - *j; | 3698 volatile float expected = *i - *j; |
| 3650 CheckFloatEq(expected, m.Call(*j)); | 3699 CheckFloatEq(expected, m.Call(*j)); |
| 3651 } | 3700 } |
| 3652 } | 3701 } |
| 3653 } | 3702 } |
| 3654 | 3703 |
| 3655 | 3704 |
| 3656 TEST(RunFloat32SubImm2) { | 3705 TEST(RunFloat32SubImm2) { |
| 3657 FOR_FLOAT32_INPUTS(i) { | 3706 FOR_FLOAT32_INPUTS(i) { |
| 3658 BufferedRawMachineAssemblerTester<float> m(kMachFloat32); | 3707 BufferedRawMachineAssemblerTester<float> m(MachineType::Float32()); |
| 3659 m.Return(m.Float32Sub(m.Parameter(0), m.Float32Constant(*i))); | 3708 m.Return(m.Float32Sub(m.Parameter(0), m.Float32Constant(*i))); |
| 3660 | 3709 |
| 3661 FOR_FLOAT32_INPUTS(j) { | 3710 FOR_FLOAT32_INPUTS(j) { |
| 3662 volatile float expected = *j - *i; | 3711 volatile float expected = *j - *i; |
| 3663 CheckFloatEq(expected, m.Call(*j)); | 3712 CheckFloatEq(expected, m.Call(*j)); |
| 3664 } | 3713 } |
| 3665 } | 3714 } |
| 3666 } | 3715 } |
| 3667 | 3716 |
| 3668 | 3717 |
| 3669 TEST(RunFloat64SubImm1) { | 3718 TEST(RunFloat64SubImm1) { |
| 3670 FOR_FLOAT64_INPUTS(i) { | 3719 FOR_FLOAT64_INPUTS(i) { |
| 3671 BufferedRawMachineAssemblerTester<double> m(kMachFloat64); | 3720 BufferedRawMachineAssemblerTester<double> m(MachineType::Float64()); |
| 3672 m.Return(m.Float64Sub(m.Float64Constant(*i), m.Parameter(0))); | 3721 m.Return(m.Float64Sub(m.Float64Constant(*i), m.Parameter(0))); |
| 3673 | 3722 |
| 3674 FOR_FLOAT64_INPUTS(j) { CheckFloatEq(*i - *j, m.Call(*j)); } | 3723 FOR_FLOAT64_INPUTS(j) { CheckFloatEq(*i - *j, m.Call(*j)); } |
| 3675 } | 3724 } |
| 3676 } | 3725 } |
| 3677 | 3726 |
| 3678 | 3727 |
| 3679 TEST(RunFloat64SubImm2) { | 3728 TEST(RunFloat64SubImm2) { |
| 3680 FOR_FLOAT64_INPUTS(i) { | 3729 FOR_FLOAT64_INPUTS(i) { |
| 3681 BufferedRawMachineAssemblerTester<double> m(kMachFloat64); | 3730 BufferedRawMachineAssemblerTester<double> m(MachineType::Float64()); |
| 3682 m.Return(m.Float64Sub(m.Parameter(0), m.Float64Constant(*i))); | 3731 m.Return(m.Float64Sub(m.Parameter(0), m.Float64Constant(*i))); |
| 3683 | 3732 |
| 3684 FOR_FLOAT64_INPUTS(j) { CheckFloatEq(*j - *i, m.Call(*j)); } | 3733 FOR_FLOAT64_INPUTS(j) { CheckFloatEq(*j - *i, m.Call(*j)); } |
| 3685 } | 3734 } |
| 3686 } | 3735 } |
| 3687 | 3736 |
| 3688 | 3737 |
| 3689 TEST(RunFloat64SubP) { | 3738 TEST(RunFloat64SubP) { |
| 3690 RawMachineAssemblerTester<int32_t> m; | 3739 RawMachineAssemblerTester<int32_t> m; |
| 3691 Float64BinopTester bt(&m); | 3740 Float64BinopTester bt(&m); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3725 FOR_FLOAT64_INPUTS(pl) { | 3774 FOR_FLOAT64_INPUTS(pl) { |
| 3726 FOR_FLOAT64_INPUTS(pr) { | 3775 FOR_FLOAT64_INPUTS(pr) { |
| 3727 double expected = *pl * *pr; | 3776 double expected = *pl * *pr; |
| 3728 CheckDoubleEq(expected, bt.call(*pl, *pr)); | 3777 CheckDoubleEq(expected, bt.call(*pl, *pr)); |
| 3729 } | 3778 } |
| 3730 } | 3779 } |
| 3731 } | 3780 } |
| 3732 | 3781 |
| 3733 | 3782 |
| 3734 TEST(RunFloat64MulAndFloat64Add1) { | 3783 TEST(RunFloat64MulAndFloat64Add1) { |
| 3735 BufferedRawMachineAssemblerTester<double> m(kMachFloat64, kMachFloat64, | 3784 BufferedRawMachineAssemblerTester<double> m( |
| 3736 kMachFloat64); | 3785 MachineType::Float64(), MachineType::Float64(), MachineType::Float64()); |
| 3737 m.Return(m.Float64Add(m.Float64Mul(m.Parameter(0), m.Parameter(1)), | 3786 m.Return(m.Float64Add(m.Float64Mul(m.Parameter(0), m.Parameter(1)), |
| 3738 m.Parameter(2))); | 3787 m.Parameter(2))); |
| 3739 | 3788 |
| 3740 FOR_FLOAT64_INPUTS(i) { | 3789 FOR_FLOAT64_INPUTS(i) { |
| 3741 FOR_FLOAT64_INPUTS(j) { | 3790 FOR_FLOAT64_INPUTS(j) { |
| 3742 FOR_FLOAT64_INPUTS(k) { | 3791 FOR_FLOAT64_INPUTS(k) { |
| 3743 CheckDoubleEq((*i * *j) + *k, m.Call(*i, *j, *k)); | 3792 CheckDoubleEq((*i * *j) + *k, m.Call(*i, *j, *k)); |
| 3744 } | 3793 } |
| 3745 } | 3794 } |
| 3746 } | 3795 } |
| 3747 } | 3796 } |
| 3748 | 3797 |
| 3749 | 3798 |
| 3750 TEST(RunFloat64MulAndFloat64Add2) { | 3799 TEST(RunFloat64MulAndFloat64Add2) { |
| 3751 BufferedRawMachineAssemblerTester<double> m(kMachFloat64, kMachFloat64, | 3800 BufferedRawMachineAssemblerTester<double> m( |
| 3752 kMachFloat64); | 3801 MachineType::Float64(), MachineType::Float64(), MachineType::Float64()); |
| 3753 m.Return(m.Float64Add(m.Parameter(0), | 3802 m.Return(m.Float64Add(m.Parameter(0), |
| 3754 m.Float64Mul(m.Parameter(1), m.Parameter(2)))); | 3803 m.Float64Mul(m.Parameter(1), m.Parameter(2)))); |
| 3755 | 3804 |
| 3756 FOR_FLOAT64_INPUTS(i) { | 3805 FOR_FLOAT64_INPUTS(i) { |
| 3757 FOR_FLOAT64_INPUTS(j) { | 3806 FOR_FLOAT64_INPUTS(j) { |
| 3758 FOR_FLOAT64_INPUTS(k) { | 3807 FOR_FLOAT64_INPUTS(k) { |
| 3759 CheckDoubleEq(*i + (*j * *k), m.Call(*i, *j, *k)); | 3808 CheckDoubleEq(*i + (*j * *k), m.Call(*i, *j, *k)); |
| 3760 } | 3809 } |
| 3761 } | 3810 } |
| 3762 } | 3811 } |
| 3763 } | 3812 } |
| 3764 | 3813 |
| 3765 | 3814 |
| 3766 TEST(RunFloat64MulAndFloat64Sub1) { | 3815 TEST(RunFloat64MulAndFloat64Sub1) { |
| 3767 BufferedRawMachineAssemblerTester<double> m(kMachFloat64, kMachFloat64, | 3816 BufferedRawMachineAssemblerTester<double> m( |
| 3768 kMachFloat64); | 3817 MachineType::Float64(), MachineType::Float64(), MachineType::Float64()); |
| 3769 m.Return(m.Float64Sub(m.Float64Mul(m.Parameter(0), m.Parameter(1)), | 3818 m.Return(m.Float64Sub(m.Float64Mul(m.Parameter(0), m.Parameter(1)), |
| 3770 m.Parameter(2))); | 3819 m.Parameter(2))); |
| 3771 | 3820 |
| 3772 FOR_FLOAT64_INPUTS(i) { | 3821 FOR_FLOAT64_INPUTS(i) { |
| 3773 FOR_FLOAT64_INPUTS(j) { | 3822 FOR_FLOAT64_INPUTS(j) { |
| 3774 FOR_FLOAT64_INPUTS(k) { | 3823 FOR_FLOAT64_INPUTS(k) { |
| 3775 CheckDoubleEq((*i * *j) - *k, m.Call(*i, *j, *k)); | 3824 CheckDoubleEq((*i * *j) - *k, m.Call(*i, *j, *k)); |
| 3776 } | 3825 } |
| 3777 } | 3826 } |
| 3778 } | 3827 } |
| 3779 } | 3828 } |
| 3780 | 3829 |
| 3781 | 3830 |
| 3782 TEST(RunFloat64MulAndFloat64Sub2) { | 3831 TEST(RunFloat64MulAndFloat64Sub2) { |
| 3783 BufferedRawMachineAssemblerTester<double> m(kMachFloat64, kMachFloat64, | 3832 BufferedRawMachineAssemblerTester<double> m( |
| 3784 kMachFloat64); | 3833 MachineType::Float64(), MachineType::Float64(), MachineType::Float64()); |
| 3785 m.Return(m.Float64Sub(m.Parameter(0), | 3834 m.Return(m.Float64Sub(m.Parameter(0), |
| 3786 m.Float64Mul(m.Parameter(1), m.Parameter(2)))); | 3835 m.Float64Mul(m.Parameter(1), m.Parameter(2)))); |
| 3787 | 3836 |
| 3788 FOR_FLOAT64_INPUTS(i) { | 3837 FOR_FLOAT64_INPUTS(i) { |
| 3789 FOR_FLOAT64_INPUTS(j) { | 3838 FOR_FLOAT64_INPUTS(j) { |
| 3790 FOR_FLOAT64_INPUTS(k) { | 3839 FOR_FLOAT64_INPUTS(k) { |
| 3791 CheckDoubleEq(*i - (*j * *k), m.Call(*i, *j, *k)); | 3840 CheckDoubleEq(*i - (*j * *k), m.Call(*i, *j, *k)); |
| 3792 } | 3841 } |
| 3793 } | 3842 } |
| 3794 } | 3843 } |
| 3795 } | 3844 } |
| 3796 | 3845 |
| 3797 | 3846 |
| 3798 TEST(RunFloat64MulImm1) { | 3847 TEST(RunFloat64MulImm1) { |
| 3799 FOR_FLOAT64_INPUTS(i) { | 3848 FOR_FLOAT64_INPUTS(i) { |
| 3800 BufferedRawMachineAssemblerTester<double> m(kMachFloat64); | 3849 BufferedRawMachineAssemblerTester<double> m(MachineType::Float64()); |
| 3801 m.Return(m.Float64Mul(m.Float64Constant(*i), m.Parameter(0))); | 3850 m.Return(m.Float64Mul(m.Float64Constant(*i), m.Parameter(0))); |
| 3802 | 3851 |
| 3803 FOR_FLOAT64_INPUTS(j) { CheckFloatEq(*i * *j, m.Call(*j)); } | 3852 FOR_FLOAT64_INPUTS(j) { CheckFloatEq(*i * *j, m.Call(*j)); } |
| 3804 } | 3853 } |
| 3805 } | 3854 } |
| 3806 | 3855 |
| 3807 | 3856 |
| 3808 TEST(RunFloat64MulImm2) { | 3857 TEST(RunFloat64MulImm2) { |
| 3809 FOR_FLOAT64_INPUTS(i) { | 3858 FOR_FLOAT64_INPUTS(i) { |
| 3810 BufferedRawMachineAssemblerTester<double> m(kMachFloat64); | 3859 BufferedRawMachineAssemblerTester<double> m(MachineType::Float64()); |
| 3811 m.Return(m.Float64Mul(m.Parameter(0), m.Float64Constant(*i))); | 3860 m.Return(m.Float64Mul(m.Parameter(0), m.Float64Constant(*i))); |
| 3812 | 3861 |
| 3813 FOR_FLOAT64_INPUTS(j) { CheckFloatEq(*j * *i, m.Call(*j)); } | 3862 FOR_FLOAT64_INPUTS(j) { CheckFloatEq(*j * *i, m.Call(*j)); } |
| 3814 } | 3863 } |
| 3815 } | 3864 } |
| 3816 | 3865 |
| 3817 | 3866 |
| 3818 TEST(RunFloat32DivP) { | 3867 TEST(RunFloat32DivP) { |
| 3819 RawMachineAssemblerTester<int32_t> m; | 3868 RawMachineAssemblerTester<int32_t> m; |
| 3820 Float32BinopTester bt(&m); | 3869 Float32BinopTester bt(&m); |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3863 | 3912 |
| 3864 TEST(RunChangeInt32ToFloat64_A) { | 3913 TEST(RunChangeInt32ToFloat64_A) { |
| 3865 int32_t magic = 0x986234; | 3914 int32_t magic = 0x986234; |
| 3866 BufferedRawMachineAssemblerTester<double> m; | 3915 BufferedRawMachineAssemblerTester<double> m; |
| 3867 m.Return(m.ChangeInt32ToFloat64(m.Int32Constant(magic))); | 3916 m.Return(m.ChangeInt32ToFloat64(m.Int32Constant(magic))); |
| 3868 CheckDoubleEq(static_cast<double>(magic), m.Call()); | 3917 CheckDoubleEq(static_cast<double>(magic), m.Call()); |
| 3869 } | 3918 } |
| 3870 | 3919 |
| 3871 | 3920 |
| 3872 TEST(RunChangeInt32ToFloat64_B) { | 3921 TEST(RunChangeInt32ToFloat64_B) { |
| 3873 BufferedRawMachineAssemblerTester<double> m(kMachInt32); | 3922 BufferedRawMachineAssemblerTester<double> m(MachineType::Int32()); |
| 3874 m.Return(m.ChangeInt32ToFloat64(m.Parameter(0))); | 3923 m.Return(m.ChangeInt32ToFloat64(m.Parameter(0))); |
| 3875 | 3924 |
| 3876 FOR_INT32_INPUTS(i) { CheckDoubleEq(static_cast<double>(*i), m.Call(*i)); } | 3925 FOR_INT32_INPUTS(i) { CheckDoubleEq(static_cast<double>(*i), m.Call(*i)); } |
| 3877 } | 3926 } |
| 3878 | 3927 |
| 3879 | 3928 |
| 3880 TEST(RunChangeUint32ToFloat64) { | 3929 TEST(RunChangeUint32ToFloat64) { |
| 3881 BufferedRawMachineAssemblerTester<double> m(kMachUint32); | 3930 BufferedRawMachineAssemblerTester<double> m(MachineType::Uint32()); |
| 3882 m.Return(m.ChangeUint32ToFloat64(m.Parameter(0))); | 3931 m.Return(m.ChangeUint32ToFloat64(m.Parameter(0))); |
| 3883 | 3932 |
| 3884 FOR_UINT32_INPUTS(i) { CheckDoubleEq(static_cast<double>(*i), m.Call(*i)); } | 3933 FOR_UINT32_INPUTS(i) { CheckDoubleEq(static_cast<double>(*i), m.Call(*i)); } |
| 3885 } | 3934 } |
| 3886 | 3935 |
| 3887 | 3936 |
| 3888 TEST(RunChangeFloat64ToInt32_A) { | 3937 TEST(RunChangeFloat64ToInt32_A) { |
| 3889 BufferedRawMachineAssemblerTester<int32_t> m; | 3938 BufferedRawMachineAssemblerTester<int32_t> m; |
| 3890 double magic = 11.1; | 3939 double magic = 11.1; |
| 3891 m.Return(m.ChangeFloat64ToInt32(m.Float64Constant(magic))); | 3940 m.Return(m.ChangeFloat64ToInt32(m.Float64Constant(magic))); |
| 3892 CHECK_EQ(static_cast<int32_t>(magic), m.Call()); | 3941 CHECK_EQ(static_cast<int32_t>(magic), m.Call()); |
| 3893 } | 3942 } |
| 3894 | 3943 |
| 3895 | 3944 |
| 3896 TEST(RunChangeFloat64ToInt32_B) { | 3945 TEST(RunChangeFloat64ToInt32_B) { |
| 3897 BufferedRawMachineAssemblerTester<int32_t> m(kMachFloat64); | 3946 BufferedRawMachineAssemblerTester<int32_t> m(MachineType::Float64()); |
| 3898 m.Return(m.ChangeFloat64ToInt32(m.Parameter(0))); | 3947 m.Return(m.ChangeFloat64ToInt32(m.Parameter(0))); |
| 3899 | 3948 |
| 3900 // Note we don't check fractional inputs, or inputs outside the range of | 3949 // Note we don't check fractional inputs, or inputs outside the range of |
| 3901 // int32, because these Convert operators really should be Change operators. | 3950 // int32, because these Convert operators really should be Change operators. |
| 3902 FOR_INT32_INPUTS(i) { CHECK_EQ(*i, m.Call(static_cast<double>(*i))); } | 3951 FOR_INT32_INPUTS(i) { CHECK_EQ(*i, m.Call(static_cast<double>(*i))); } |
| 3903 | 3952 |
| 3904 for (int32_t n = 1; n < 31; ++n) { | 3953 for (int32_t n = 1; n < 31; ++n) { |
| 3905 CHECK_EQ(1 << n, m.Call(static_cast<double>(1 << n))); | 3954 CHECK_EQ(1 << n, m.Call(static_cast<double>(1 << n))); |
| 3906 } | 3955 } |
| 3907 | 3956 |
| 3908 for (int32_t n = 1; n < 31; ++n) { | 3957 for (int32_t n = 1; n < 31; ++n) { |
| 3909 CHECK_EQ(3 << n, m.Call(static_cast<double>(3 << n))); | 3958 CHECK_EQ(3 << n, m.Call(static_cast<double>(3 << n))); |
| 3910 } | 3959 } |
| 3911 } | 3960 } |
| 3912 | 3961 |
| 3913 | 3962 |
| 3914 TEST(RunChangeFloat64ToUint32) { | 3963 TEST(RunChangeFloat64ToUint32) { |
| 3915 BufferedRawMachineAssemblerTester<uint32_t> m(kMachFloat64); | 3964 BufferedRawMachineAssemblerTester<uint32_t> m(MachineType::Float64()); |
| 3916 m.Return(m.ChangeFloat64ToUint32(m.Parameter(0))); | 3965 m.Return(m.ChangeFloat64ToUint32(m.Parameter(0))); |
| 3917 | 3966 |
| 3918 { | 3967 { |
| 3919 FOR_UINT32_INPUTS(i) { CHECK_EQ(*i, m.Call(static_cast<double>(*i))); } | 3968 FOR_UINT32_INPUTS(i) { CHECK_EQ(*i, m.Call(static_cast<double>(*i))); } |
| 3920 } | 3969 } |
| 3921 | 3970 |
| 3922 // Check various powers of 2. | 3971 // Check various powers of 2. |
| 3923 for (int32_t n = 1; n < 31; ++n) { | 3972 for (int32_t n = 1; n < 31; ++n) { |
| 3924 { CHECK_EQ(1u << n, m.Call(static_cast<double>(1u << n))); } | 3973 { CHECK_EQ(1u << n, m.Call(static_cast<double>(1u << n))); } |
| 3925 | 3974 |
| 3926 { CHECK_EQ(3u << n, m.Call(static_cast<double>(3u << n))); } | 3975 { CHECK_EQ(3u << n, m.Call(static_cast<double>(3u << n))); } |
| 3927 } | 3976 } |
| 3928 // Note we don't check fractional inputs, because these Convert operators | 3977 // Note we don't check fractional inputs, because these Convert operators |
| 3929 // really should be Change operators. | 3978 // really should be Change operators. |
| 3930 } | 3979 } |
| 3931 | 3980 |
| 3932 | 3981 |
| 3933 TEST(RunTruncateFloat64ToFloat32) { | 3982 TEST(RunTruncateFloat64ToFloat32) { |
| 3934 BufferedRawMachineAssemblerTester<float> m(kMachFloat64); | 3983 BufferedRawMachineAssemblerTester<float> m(MachineType::Float64()); |
| 3935 | 3984 |
| 3936 m.Return(m.TruncateFloat64ToFloat32(m.Parameter(0))); | 3985 m.Return(m.TruncateFloat64ToFloat32(m.Parameter(0))); |
| 3937 | 3986 |
| 3938 FOR_FLOAT64_INPUTS(i) { CheckFloatEq(DoubleToFloat32(*i), m.Call(*i)); } | 3987 FOR_FLOAT64_INPUTS(i) { CheckFloatEq(DoubleToFloat32(*i), m.Call(*i)); } |
| 3939 } | 3988 } |
| 3940 | 3989 |
| 3941 | 3990 |
| 3942 TEST(RunDeadChangeFloat64ToInt32) { | 3991 TEST(RunDeadChangeFloat64ToInt32) { |
| 3943 RawMachineAssemblerTester<int32_t> m; | 3992 RawMachineAssemblerTester<int32_t> m; |
| 3944 const int magic = 0x88abcda4; | 3993 const int magic = 0x88abcda4; |
| (...skipping 15 matching lines...) Expand all Loading... |
| 3960 TEST(RunLoopPhiInduction2) { | 4009 TEST(RunLoopPhiInduction2) { |
| 3961 RawMachineAssemblerTester<int32_t> m; | 4010 RawMachineAssemblerTester<int32_t> m; |
| 3962 | 4011 |
| 3963 int false_val = 0x10777; | 4012 int false_val = 0x10777; |
| 3964 | 4013 |
| 3965 // x = false_val; while(false) { x++; } return x; | 4014 // x = false_val; while(false) { x++; } return x; |
| 3966 RawMachineLabel header, body, end; | 4015 RawMachineLabel header, body, end; |
| 3967 Node* false_node = m.Int32Constant(false_val); | 4016 Node* false_node = m.Int32Constant(false_val); |
| 3968 m.Goto(&header); | 4017 m.Goto(&header); |
| 3969 m.Bind(&header); | 4018 m.Bind(&header); |
| 3970 Node* phi = m.Phi(kMachInt32, false_node, false_node); | 4019 Node* phi = m.Phi(MachineRepresentation::kWord32, false_node, false_node); |
| 3971 m.Branch(m.Int32Constant(0), &body, &end); | 4020 m.Branch(m.Int32Constant(0), &body, &end); |
| 3972 m.Bind(&body); | 4021 m.Bind(&body); |
| 3973 Node* add = m.Int32Add(phi, m.Int32Constant(1)); | 4022 Node* add = m.Int32Add(phi, m.Int32Constant(1)); |
| 3974 phi->ReplaceInput(1, add); | 4023 phi->ReplaceInput(1, add); |
| 3975 m.Goto(&header); | 4024 m.Goto(&header); |
| 3976 m.Bind(&end); | 4025 m.Bind(&end); |
| 3977 m.Return(phi); | 4026 m.Return(phi); |
| 3978 | 4027 |
| 3979 CHECK_EQ(false_val, m.Call()); | 4028 CHECK_EQ(false_val, m.Call()); |
| 3980 } | 4029 } |
| 3981 | 4030 |
| 3982 | 4031 |
| 3983 TEST(RunFloatDiamond) { | 4032 TEST(RunFloatDiamond) { |
| 3984 RawMachineAssemblerTester<int32_t> m; | 4033 RawMachineAssemblerTester<int32_t> m; |
| 3985 | 4034 |
| 3986 const int magic = 99645; | 4035 const int magic = 99645; |
| 3987 float buffer = 0.1f; | 4036 float buffer = 0.1f; |
| 3988 float constant = 99.99f; | 4037 float constant = 99.99f; |
| 3989 | 4038 |
| 3990 RawMachineLabel blocka, blockb, end; | 4039 RawMachineLabel blocka, blockb, end; |
| 3991 Node* k1 = m.Float32Constant(constant); | 4040 Node* k1 = m.Float32Constant(constant); |
| 3992 Node* k2 = m.Float32Constant(0 - constant); | 4041 Node* k2 = m.Float32Constant(0 - constant); |
| 3993 m.Branch(m.Int32Constant(0), &blocka, &blockb); | 4042 m.Branch(m.Int32Constant(0), &blocka, &blockb); |
| 3994 m.Bind(&blocka); | 4043 m.Bind(&blocka); |
| 3995 m.Goto(&end); | 4044 m.Goto(&end); |
| 3996 m.Bind(&blockb); | 4045 m.Bind(&blockb); |
| 3997 m.Goto(&end); | 4046 m.Goto(&end); |
| 3998 m.Bind(&end); | 4047 m.Bind(&end); |
| 3999 Node* phi = m.Phi(kMachFloat32, k2, k1); | 4048 Node* phi = m.Phi(MachineRepresentation::kFloat32, k2, k1); |
| 4000 m.Store(kMachFloat32, m.PointerConstant(&buffer), m.IntPtrConstant(0), phi, | 4049 m.Store(MachineType::Float32(), m.PointerConstant(&buffer), |
| 4001 kNoWriteBarrier); | 4050 m.IntPtrConstant(0), phi, kNoWriteBarrier); |
| 4002 m.Return(m.Int32Constant(magic)); | 4051 m.Return(m.Int32Constant(magic)); |
| 4003 | 4052 |
| 4004 CHECK_EQ(magic, m.Call()); | 4053 CHECK_EQ(magic, m.Call()); |
| 4005 CHECK(constant == buffer); | 4054 CHECK(constant == buffer); |
| 4006 } | 4055 } |
| 4007 | 4056 |
| 4008 | 4057 |
| 4009 TEST(RunDoubleDiamond) { | 4058 TEST(RunDoubleDiamond) { |
| 4010 RawMachineAssemblerTester<int32_t> m; | 4059 RawMachineAssemblerTester<int32_t> m; |
| 4011 | 4060 |
| 4012 const int magic = 99645; | 4061 const int magic = 99645; |
| 4013 double buffer = 0.1; | 4062 double buffer = 0.1; |
| 4014 double constant = 99.99; | 4063 double constant = 99.99; |
| 4015 | 4064 |
| 4016 RawMachineLabel blocka, blockb, end; | 4065 RawMachineLabel blocka, blockb, end; |
| 4017 Node* k1 = m.Float64Constant(constant); | 4066 Node* k1 = m.Float64Constant(constant); |
| 4018 Node* k2 = m.Float64Constant(0 - constant); | 4067 Node* k2 = m.Float64Constant(0 - constant); |
| 4019 m.Branch(m.Int32Constant(0), &blocka, &blockb); | 4068 m.Branch(m.Int32Constant(0), &blocka, &blockb); |
| 4020 m.Bind(&blocka); | 4069 m.Bind(&blocka); |
| 4021 m.Goto(&end); | 4070 m.Goto(&end); |
| 4022 m.Bind(&blockb); | 4071 m.Bind(&blockb); |
| 4023 m.Goto(&end); | 4072 m.Goto(&end); |
| 4024 m.Bind(&end); | 4073 m.Bind(&end); |
| 4025 Node* phi = m.Phi(kMachFloat64, k2, k1); | 4074 Node* phi = m.Phi(MachineRepresentation::kFloat64, k2, k1); |
| 4026 m.Store(kMachFloat64, m.PointerConstant(&buffer), m.Int32Constant(0), phi, | 4075 m.Store(MachineType::Float64(), m.PointerConstant(&buffer), |
| 4027 kNoWriteBarrier); | 4076 m.Int32Constant(0), phi, kNoWriteBarrier); |
| 4028 m.Return(m.Int32Constant(magic)); | 4077 m.Return(m.Int32Constant(magic)); |
| 4029 | 4078 |
| 4030 CHECK_EQ(magic, m.Call()); | 4079 CHECK_EQ(magic, m.Call()); |
| 4031 CHECK_EQ(constant, buffer); | 4080 CHECK_EQ(constant, buffer); |
| 4032 } | 4081 } |
| 4033 | 4082 |
| 4034 | 4083 |
| 4035 TEST(RunRefDiamond) { | 4084 TEST(RunRefDiamond) { |
| 4036 RawMachineAssemblerTester<int32_t> m; | 4085 RawMachineAssemblerTester<int32_t> m; |
| 4037 | 4086 |
| 4038 const int magic = 99644; | 4087 const int magic = 99644; |
| 4039 Handle<String> rexpected = | 4088 Handle<String> rexpected = |
| 4040 CcTest::i_isolate()->factory()->InternalizeUtf8String("A"); | 4089 CcTest::i_isolate()->factory()->InternalizeUtf8String("A"); |
| 4041 String* buffer; | 4090 String* buffer; |
| 4042 | 4091 |
| 4043 RawMachineLabel blocka, blockb, end; | 4092 RawMachineLabel blocka, blockb, end; |
| 4044 Node* k1 = m.StringConstant("A"); | 4093 Node* k1 = m.StringConstant("A"); |
| 4045 Node* k2 = m.StringConstant("B"); | 4094 Node* k2 = m.StringConstant("B"); |
| 4046 m.Branch(m.Int32Constant(0), &blocka, &blockb); | 4095 m.Branch(m.Int32Constant(0), &blocka, &blockb); |
| 4047 m.Bind(&blocka); | 4096 m.Bind(&blocka); |
| 4048 m.Goto(&end); | 4097 m.Goto(&end); |
| 4049 m.Bind(&blockb); | 4098 m.Bind(&blockb); |
| 4050 m.Goto(&end); | 4099 m.Goto(&end); |
| 4051 m.Bind(&end); | 4100 m.Bind(&end); |
| 4052 Node* phi = m.Phi(kMachAnyTagged, k2, k1); | 4101 Node* phi = m.Phi(MachineRepresentation::kTagged, k2, k1); |
| 4053 m.Store(kMachAnyTagged, m.PointerConstant(&buffer), m.Int32Constant(0), phi, | 4102 m.Store(MachineType::AnyTagged(), m.PointerConstant(&buffer), |
| 4054 kNoWriteBarrier); | 4103 m.Int32Constant(0), phi, kNoWriteBarrier); |
| 4055 m.Return(m.Int32Constant(magic)); | 4104 m.Return(m.Int32Constant(magic)); |
| 4056 | 4105 |
| 4057 CHECK_EQ(magic, m.Call()); | 4106 CHECK_EQ(magic, m.Call()); |
| 4058 CHECK(rexpected->SameValue(buffer)); | 4107 CHECK(rexpected->SameValue(buffer)); |
| 4059 } | 4108 } |
| 4060 | 4109 |
| 4061 | 4110 |
| 4062 TEST(RunDoubleRefDiamond) { | 4111 TEST(RunDoubleRefDiamond) { |
| 4063 RawMachineAssemblerTester<int32_t> m; | 4112 RawMachineAssemblerTester<int32_t> m; |
| 4064 | 4113 |
| 4065 const int magic = 99648; | 4114 const int magic = 99648; |
| 4066 double dbuffer = 0.1; | 4115 double dbuffer = 0.1; |
| 4067 double dconstant = 99.99; | 4116 double dconstant = 99.99; |
| 4068 Handle<String> rexpected = | 4117 Handle<String> rexpected = |
| 4069 CcTest::i_isolate()->factory()->InternalizeUtf8String("AX"); | 4118 CcTest::i_isolate()->factory()->InternalizeUtf8String("AX"); |
| 4070 String* rbuffer; | 4119 String* rbuffer; |
| 4071 | 4120 |
| 4072 RawMachineLabel blocka, blockb, end; | 4121 RawMachineLabel blocka, blockb, end; |
| 4073 Node* d1 = m.Float64Constant(dconstant); | 4122 Node* d1 = m.Float64Constant(dconstant); |
| 4074 Node* d2 = m.Float64Constant(0 - dconstant); | 4123 Node* d2 = m.Float64Constant(0 - dconstant); |
| 4075 Node* r1 = m.StringConstant("AX"); | 4124 Node* r1 = m.StringConstant("AX"); |
| 4076 Node* r2 = m.StringConstant("BX"); | 4125 Node* r2 = m.StringConstant("BX"); |
| 4077 m.Branch(m.Int32Constant(0), &blocka, &blockb); | 4126 m.Branch(m.Int32Constant(0), &blocka, &blockb); |
| 4078 m.Bind(&blocka); | 4127 m.Bind(&blocka); |
| 4079 m.Goto(&end); | 4128 m.Goto(&end); |
| 4080 m.Bind(&blockb); | 4129 m.Bind(&blockb); |
| 4081 m.Goto(&end); | 4130 m.Goto(&end); |
| 4082 m.Bind(&end); | 4131 m.Bind(&end); |
| 4083 Node* dphi = m.Phi(kMachFloat64, d2, d1); | 4132 Node* dphi = m.Phi(MachineRepresentation::kFloat64, d2, d1); |
| 4084 Node* rphi = m.Phi(kMachAnyTagged, r2, r1); | 4133 Node* rphi = m.Phi(MachineRepresentation::kTagged, r2, r1); |
| 4085 m.Store(kMachFloat64, m.PointerConstant(&dbuffer), m.Int32Constant(0), dphi, | 4134 m.Store(MachineType::Float64(), m.PointerConstant(&dbuffer), |
| 4086 kNoWriteBarrier); | 4135 m.Int32Constant(0), dphi, kNoWriteBarrier); |
| 4087 m.Store(kMachAnyTagged, m.PointerConstant(&rbuffer), m.Int32Constant(0), rphi, | 4136 m.Store(MachineType::AnyTagged(), m.PointerConstant(&rbuffer), |
| 4088 kNoWriteBarrier); | 4137 m.Int32Constant(0), rphi, kNoWriteBarrier); |
| 4089 m.Return(m.Int32Constant(magic)); | 4138 m.Return(m.Int32Constant(magic)); |
| 4090 | 4139 |
| 4091 CHECK_EQ(magic, m.Call()); | 4140 CHECK_EQ(magic, m.Call()); |
| 4092 CHECK_EQ(dconstant, dbuffer); | 4141 CHECK_EQ(dconstant, dbuffer); |
| 4093 CHECK(rexpected->SameValue(rbuffer)); | 4142 CHECK(rexpected->SameValue(rbuffer)); |
| 4094 } | 4143 } |
| 4095 | 4144 |
| 4096 | 4145 |
| 4097 TEST(RunDoubleRefDoubleDiamond) { | 4146 TEST(RunDoubleRefDoubleDiamond) { |
| 4098 RawMachineAssemblerTester<int32_t> m; | 4147 RawMachineAssemblerTester<int32_t> m; |
| 4099 | 4148 |
| 4100 const int magic = 99649; | 4149 const int magic = 99649; |
| 4101 double dbuffer = 0.1; | 4150 double dbuffer = 0.1; |
| 4102 double dconstant = 99.997; | 4151 double dconstant = 99.997; |
| 4103 Handle<String> rexpected = | 4152 Handle<String> rexpected = |
| 4104 CcTest::i_isolate()->factory()->InternalizeUtf8String("AD"); | 4153 CcTest::i_isolate()->factory()->InternalizeUtf8String("AD"); |
| 4105 String* rbuffer; | 4154 String* rbuffer; |
| 4106 | 4155 |
| 4107 RawMachineLabel blocka, blockb, mid, blockd, blocke, end; | 4156 RawMachineLabel blocka, blockb, mid, blockd, blocke, end; |
| 4108 Node* d1 = m.Float64Constant(dconstant); | 4157 Node* d1 = m.Float64Constant(dconstant); |
| 4109 Node* d2 = m.Float64Constant(0 - dconstant); | 4158 Node* d2 = m.Float64Constant(0 - dconstant); |
| 4110 Node* r1 = m.StringConstant("AD"); | 4159 Node* r1 = m.StringConstant("AD"); |
| 4111 Node* r2 = m.StringConstant("BD"); | 4160 Node* r2 = m.StringConstant("BD"); |
| 4112 m.Branch(m.Int32Constant(0), &blocka, &blockb); | 4161 m.Branch(m.Int32Constant(0), &blocka, &blockb); |
| 4113 m.Bind(&blocka); | 4162 m.Bind(&blocka); |
| 4114 m.Goto(&mid); | 4163 m.Goto(&mid); |
| 4115 m.Bind(&blockb); | 4164 m.Bind(&blockb); |
| 4116 m.Goto(&mid); | 4165 m.Goto(&mid); |
| 4117 m.Bind(&mid); | 4166 m.Bind(&mid); |
| 4118 Node* dphi1 = m.Phi(kMachFloat64, d2, d1); | 4167 Node* dphi1 = m.Phi(MachineRepresentation::kFloat64, d2, d1); |
| 4119 Node* rphi1 = m.Phi(kMachAnyTagged, r2, r1); | 4168 Node* rphi1 = m.Phi(MachineRepresentation::kTagged, r2, r1); |
| 4120 m.Branch(m.Int32Constant(0), &blockd, &blocke); | 4169 m.Branch(m.Int32Constant(0), &blockd, &blocke); |
| 4121 | 4170 |
| 4122 m.Bind(&blockd); | 4171 m.Bind(&blockd); |
| 4123 m.Goto(&end); | 4172 m.Goto(&end); |
| 4124 m.Bind(&blocke); | 4173 m.Bind(&blocke); |
| 4125 m.Goto(&end); | 4174 m.Goto(&end); |
| 4126 m.Bind(&end); | 4175 m.Bind(&end); |
| 4127 Node* dphi2 = m.Phi(kMachFloat64, d1, dphi1); | 4176 Node* dphi2 = m.Phi(MachineRepresentation::kFloat64, d1, dphi1); |
| 4128 Node* rphi2 = m.Phi(kMachAnyTagged, r1, rphi1); | 4177 Node* rphi2 = m.Phi(MachineRepresentation::kTagged, r1, rphi1); |
| 4129 | 4178 |
| 4130 m.Store(kMachFloat64, m.PointerConstant(&dbuffer), m.Int32Constant(0), dphi2, | 4179 m.Store(MachineType::Float64(), m.PointerConstant(&dbuffer), |
| 4131 kNoWriteBarrier); | 4180 m.Int32Constant(0), dphi2, kNoWriteBarrier); |
| 4132 m.Store(kMachAnyTagged, m.PointerConstant(&rbuffer), m.Int32Constant(0), | 4181 m.Store(MachineType::AnyTagged(), m.PointerConstant(&rbuffer), |
| 4133 rphi2, kNoWriteBarrier); | 4182 m.Int32Constant(0), rphi2, kNoWriteBarrier); |
| 4134 m.Return(m.Int32Constant(magic)); | 4183 m.Return(m.Int32Constant(magic)); |
| 4135 | 4184 |
| 4136 CHECK_EQ(magic, m.Call()); | 4185 CHECK_EQ(magic, m.Call()); |
| 4137 CHECK_EQ(dconstant, dbuffer); | 4186 CHECK_EQ(dconstant, dbuffer); |
| 4138 CHECK(rexpected->SameValue(rbuffer)); | 4187 CHECK(rexpected->SameValue(rbuffer)); |
| 4139 } | 4188 } |
| 4140 | 4189 |
| 4141 | 4190 |
| 4142 TEST(RunDoubleLoopPhi) { | 4191 TEST(RunDoubleLoopPhi) { |
| 4143 RawMachineAssemblerTester<int32_t> m; | 4192 RawMachineAssemblerTester<int32_t> m; |
| 4144 RawMachineLabel header, body, end; | 4193 RawMachineLabel header, body, end; |
| 4145 | 4194 |
| 4146 int magic = 99773; | 4195 int magic = 99773; |
| 4147 double buffer = 0.99; | 4196 double buffer = 0.99; |
| 4148 double dconstant = 777.1; | 4197 double dconstant = 777.1; |
| 4149 | 4198 |
| 4150 Node* zero = m.Int32Constant(0); | 4199 Node* zero = m.Int32Constant(0); |
| 4151 Node* dk = m.Float64Constant(dconstant); | 4200 Node* dk = m.Float64Constant(dconstant); |
| 4152 | 4201 |
| 4153 m.Goto(&header); | 4202 m.Goto(&header); |
| 4154 m.Bind(&header); | 4203 m.Bind(&header); |
| 4155 Node* phi = m.Phi(kMachFloat64, dk, dk); | 4204 Node* phi = m.Phi(MachineRepresentation::kFloat64, dk, dk); |
| 4156 phi->ReplaceInput(1, phi); | 4205 phi->ReplaceInput(1, phi); |
| 4157 m.Branch(zero, &body, &end); | 4206 m.Branch(zero, &body, &end); |
| 4158 m.Bind(&body); | 4207 m.Bind(&body); |
| 4159 m.Goto(&header); | 4208 m.Goto(&header); |
| 4160 m.Bind(&end); | 4209 m.Bind(&end); |
| 4161 m.Store(kMachFloat64, m.PointerConstant(&buffer), m.Int32Constant(0), phi, | 4210 m.Store(MachineType::Float64(), m.PointerConstant(&buffer), |
| 4162 kNoWriteBarrier); | 4211 m.Int32Constant(0), phi, kNoWriteBarrier); |
| 4163 m.Return(m.Int32Constant(magic)); | 4212 m.Return(m.Int32Constant(magic)); |
| 4164 | 4213 |
| 4165 CHECK_EQ(magic, m.Call()); | 4214 CHECK_EQ(magic, m.Call()); |
| 4166 } | 4215 } |
| 4167 | 4216 |
| 4168 | 4217 |
| 4169 TEST(RunCountToTenAccRaw) { | 4218 TEST(RunCountToTenAccRaw) { |
| 4170 RawMachineAssemblerTester<int32_t> m; | 4219 RawMachineAssemblerTester<int32_t> m; |
| 4171 | 4220 |
| 4172 Node* zero = m.Int32Constant(0); | 4221 Node* zero = m.Int32Constant(0); |
| 4173 Node* ten = m.Int32Constant(10); | 4222 Node* ten = m.Int32Constant(10); |
| 4174 Node* one = m.Int32Constant(1); | 4223 Node* one = m.Int32Constant(1); |
| 4175 | 4224 |
| 4176 RawMachineLabel header, body, body_cont, end; | 4225 RawMachineLabel header, body, body_cont, end; |
| 4177 | 4226 |
| 4178 m.Goto(&header); | 4227 m.Goto(&header); |
| 4179 | 4228 |
| 4180 m.Bind(&header); | 4229 m.Bind(&header); |
| 4181 Node* i = m.Phi(kMachInt32, zero, zero); | 4230 Node* i = m.Phi(MachineRepresentation::kWord32, zero, zero); |
| 4182 Node* j = m.Phi(kMachInt32, zero, zero); | 4231 Node* j = m.Phi(MachineRepresentation::kWord32, zero, zero); |
| 4183 m.Goto(&body); | 4232 m.Goto(&body); |
| 4184 | 4233 |
| 4185 m.Bind(&body); | 4234 m.Bind(&body); |
| 4186 Node* next_i = m.Int32Add(i, one); | 4235 Node* next_i = m.Int32Add(i, one); |
| 4187 Node* next_j = m.Int32Add(j, one); | 4236 Node* next_j = m.Int32Add(j, one); |
| 4188 m.Branch(m.Word32Equal(next_i, ten), &end, &body_cont); | 4237 m.Branch(m.Word32Equal(next_i, ten), &end, &body_cont); |
| 4189 | 4238 |
| 4190 m.Bind(&body_cont); | 4239 m.Bind(&body_cont); |
| 4191 i->ReplaceInput(1, next_i); | 4240 i->ReplaceInput(1, next_i); |
| 4192 j->ReplaceInput(1, next_j); | 4241 j->ReplaceInput(1, next_j); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 4204 | 4253 |
| 4205 Node* zero = m.Int32Constant(0); | 4254 Node* zero = m.Int32Constant(0); |
| 4206 Node* ten = m.Int32Constant(10); | 4255 Node* ten = m.Int32Constant(10); |
| 4207 Node* one = m.Int32Constant(1); | 4256 Node* one = m.Int32Constant(1); |
| 4208 | 4257 |
| 4209 RawMachineLabel header, body, body_cont, end; | 4258 RawMachineLabel header, body, body_cont, end; |
| 4210 | 4259 |
| 4211 m.Goto(&header); | 4260 m.Goto(&header); |
| 4212 | 4261 |
| 4213 m.Bind(&header); | 4262 m.Bind(&header); |
| 4214 Node* i = m.Phi(kMachInt32, zero, zero); | 4263 Node* i = m.Phi(MachineRepresentation::kWord32, zero, zero); |
| 4215 Node* j = m.Phi(kMachInt32, zero, zero); | 4264 Node* j = m.Phi(MachineRepresentation::kWord32, zero, zero); |
| 4216 Node* k = m.Phi(kMachInt32, zero, zero); | 4265 Node* k = m.Phi(MachineRepresentation::kWord32, zero, zero); |
| 4217 m.Goto(&body); | 4266 m.Goto(&body); |
| 4218 | 4267 |
| 4219 m.Bind(&body); | 4268 m.Bind(&body); |
| 4220 Node* next_i = m.Int32Add(i, one); | 4269 Node* next_i = m.Int32Add(i, one); |
| 4221 Node* next_j = m.Int32Add(j, one); | 4270 Node* next_j = m.Int32Add(j, one); |
| 4222 Node* next_k = m.Int32Add(j, one); | 4271 Node* next_k = m.Int32Add(j, one); |
| 4223 m.Branch(m.Word32Equal(next_i, ten), &end, &body_cont); | 4272 m.Branch(m.Word32Equal(next_i, ten), &end, &body_cont); |
| 4224 | 4273 |
| 4225 m.Bind(&body_cont); | 4274 m.Bind(&body_cont); |
| 4226 i->ReplaceInput(1, next_i); | 4275 i->ReplaceInput(1, next_i); |
| 4227 j->ReplaceInput(1, next_j); | 4276 j->ReplaceInput(1, next_j); |
| 4228 k->ReplaceInput(1, next_k); | 4277 k->ReplaceInput(1, next_k); |
| 4229 m.Goto(&header); | 4278 m.Goto(&header); |
| 4230 | 4279 |
| 4231 m.Bind(&end); | 4280 m.Bind(&end); |
| 4232 m.Return(ten); | 4281 m.Return(ten); |
| 4233 | 4282 |
| 4234 CHECK_EQ(10, m.Call()); | 4283 CHECK_EQ(10, m.Call()); |
| 4235 } | 4284 } |
| 4236 | 4285 |
| 4237 | 4286 |
| 4238 TEST(RunAddTree) { | 4287 TEST(RunAddTree) { |
| 4239 RawMachineAssemblerTester<int32_t> m; | 4288 RawMachineAssemblerTester<int32_t> m; |
| 4240 int32_t inputs[] = {11, 12, 13, 14, 15, 16, 17, 18}; | 4289 int32_t inputs[] = {11, 12, 13, 14, 15, 16, 17, 18}; |
| 4241 | 4290 |
| 4242 Node* base = m.PointerConstant(inputs); | 4291 Node* base = m.PointerConstant(inputs); |
| 4243 Node* n0 = m.Load(kMachInt32, base, m.Int32Constant(0 * sizeof(int32_t))); | 4292 Node* n0 = |
| 4244 Node* n1 = m.Load(kMachInt32, base, m.Int32Constant(1 * sizeof(int32_t))); | 4293 m.Load(MachineType::Int32(), base, m.Int32Constant(0 * sizeof(int32_t))); |
| 4245 Node* n2 = m.Load(kMachInt32, base, m.Int32Constant(2 * sizeof(int32_t))); | 4294 Node* n1 = |
| 4246 Node* n3 = m.Load(kMachInt32, base, m.Int32Constant(3 * sizeof(int32_t))); | 4295 m.Load(MachineType::Int32(), base, m.Int32Constant(1 * sizeof(int32_t))); |
| 4247 Node* n4 = m.Load(kMachInt32, base, m.Int32Constant(4 * sizeof(int32_t))); | 4296 Node* n2 = |
| 4248 Node* n5 = m.Load(kMachInt32, base, m.Int32Constant(5 * sizeof(int32_t))); | 4297 m.Load(MachineType::Int32(), base, m.Int32Constant(2 * sizeof(int32_t))); |
| 4249 Node* n6 = m.Load(kMachInt32, base, m.Int32Constant(6 * sizeof(int32_t))); | 4298 Node* n3 = |
| 4250 Node* n7 = m.Load(kMachInt32, base, m.Int32Constant(7 * sizeof(int32_t))); | 4299 m.Load(MachineType::Int32(), base, m.Int32Constant(3 * sizeof(int32_t))); |
| 4300 Node* n4 = |
| 4301 m.Load(MachineType::Int32(), base, m.Int32Constant(4 * sizeof(int32_t))); |
| 4302 Node* n5 = |
| 4303 m.Load(MachineType::Int32(), base, m.Int32Constant(5 * sizeof(int32_t))); |
| 4304 Node* n6 = |
| 4305 m.Load(MachineType::Int32(), base, m.Int32Constant(6 * sizeof(int32_t))); |
| 4306 Node* n7 = |
| 4307 m.Load(MachineType::Int32(), base, m.Int32Constant(7 * sizeof(int32_t))); |
| 4251 | 4308 |
| 4252 Node* i1 = m.Int32Add(n0, n1); | 4309 Node* i1 = m.Int32Add(n0, n1); |
| 4253 Node* i2 = m.Int32Add(n2, n3); | 4310 Node* i2 = m.Int32Add(n2, n3); |
| 4254 Node* i3 = m.Int32Add(n4, n5); | 4311 Node* i3 = m.Int32Add(n4, n5); |
| 4255 Node* i4 = m.Int32Add(n6, n7); | 4312 Node* i4 = m.Int32Add(n6, n7); |
| 4256 | 4313 |
| 4257 Node* i5 = m.Int32Add(i1, i2); | 4314 Node* i5 = m.Int32Add(i1, i2); |
| 4258 Node* i6 = m.Int32Add(i3, i4); | 4315 Node* i6 = m.Int32Add(i3, i4); |
| 4259 | 4316 |
| 4260 Node* i7 = m.Int32Add(i5, i6); | 4317 Node* i7 = m.Int32Add(i5, i6); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 4272 int test_case, int node_type, double x, | 4329 int test_case, int node_type, double x, |
| 4273 double y) { | 4330 double y) { |
| 4274 static double buffer[2]; | 4331 static double buffer[2]; |
| 4275 buffer[0] = x; | 4332 buffer[0] = x; |
| 4276 buffer[1] = y; | 4333 buffer[1] = y; |
| 4277 CHECK(0 <= test_case && test_case < kFloat64CompareHelperTestCases); | 4334 CHECK(0 <= test_case && test_case < kFloat64CompareHelperTestCases); |
| 4278 CHECK(0 <= node_type && node_type < kFloat64CompareHelperNodeType); | 4335 CHECK(0 <= node_type && node_type < kFloat64CompareHelperNodeType); |
| 4279 CHECK(x < y); | 4336 CHECK(x < y); |
| 4280 bool load_a = node_type / 2 == 1; | 4337 bool load_a = node_type / 2 == 1; |
| 4281 bool load_b = node_type % 2 == 1; | 4338 bool load_b = node_type % 2 == 1; |
| 4282 Node* a = load_a ? m->Load(kMachFloat64, m->PointerConstant(&buffer[0])) | 4339 Node* a = |
| 4283 : m->Float64Constant(x); | 4340 load_a ? m->Load(MachineType::Float64(), m->PointerConstant(&buffer[0])) |
| 4284 Node* b = load_b ? m->Load(kMachFloat64, m->PointerConstant(&buffer[1])) | 4341 : m->Float64Constant(x); |
| 4285 : m->Float64Constant(y); | 4342 Node* b = |
| 4343 load_b ? m->Load(MachineType::Float64(), m->PointerConstant(&buffer[1])) |
| 4344 : m->Float64Constant(y); |
| 4286 Node* cmp = NULL; | 4345 Node* cmp = NULL; |
| 4287 bool expected = false; | 4346 bool expected = false; |
| 4288 switch (test_case) { | 4347 switch (test_case) { |
| 4289 // Equal tests. | 4348 // Equal tests. |
| 4290 case 0: | 4349 case 0: |
| 4291 cmp = m->Float64Equal(a, b); | 4350 cmp = m->Float64Equal(a, b); |
| 4292 expected = false; | 4351 expected = false; |
| 4293 break; | 4352 break; |
| 4294 case 1: | 4353 case 1: |
| 4295 cmp = m->Float64Equal(a, a); | 4354 cmp = m->Float64Equal(a, a); |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4402 } | 4461 } |
| 4403 } | 4462 } |
| 4404 } | 4463 } |
| 4405 | 4464 |
| 4406 | 4465 |
| 4407 TEST(RunFloat64Equal) { | 4466 TEST(RunFloat64Equal) { |
| 4408 double input_a = 0.0; | 4467 double input_a = 0.0; |
| 4409 double input_b = 0.0; | 4468 double input_b = 0.0; |
| 4410 | 4469 |
| 4411 RawMachineAssemblerTester<int32_t> m; | 4470 RawMachineAssemblerTester<int32_t> m; |
| 4412 Node* a = m.LoadFromPointer(&input_a, kMachFloat64); | 4471 Node* a = m.LoadFromPointer(&input_a, MachineType::Float64()); |
| 4413 Node* b = m.LoadFromPointer(&input_b, kMachFloat64); | 4472 Node* b = m.LoadFromPointer(&input_b, MachineType::Float64()); |
| 4414 m.Return(m.Float64Equal(a, b)); | 4473 m.Return(m.Float64Equal(a, b)); |
| 4415 | 4474 |
| 4416 CompareWrapper cmp(IrOpcode::kFloat64Equal); | 4475 CompareWrapper cmp(IrOpcode::kFloat64Equal); |
| 4417 FOR_FLOAT64_INPUTS(pl) { | 4476 FOR_FLOAT64_INPUTS(pl) { |
| 4418 FOR_FLOAT64_INPUTS(pr) { | 4477 FOR_FLOAT64_INPUTS(pr) { |
| 4419 input_a = *pl; | 4478 input_a = *pl; |
| 4420 input_b = *pr; | 4479 input_b = *pr; |
| 4421 int32_t expected = cmp.Float64Compare(input_a, input_b) ? 1 : 0; | 4480 int32_t expected = cmp.Float64Compare(input_a, input_b) ? 1 : 0; |
| 4422 CHECK_EQ(expected, m.Call()); | 4481 CHECK_EQ(expected, m.Call()); |
| 4423 } | 4482 } |
| 4424 } | 4483 } |
| 4425 } | 4484 } |
| 4426 | 4485 |
| 4427 | 4486 |
| 4428 TEST(RunFloat64LessThan) { | 4487 TEST(RunFloat64LessThan) { |
| 4429 double input_a = 0.0; | 4488 double input_a = 0.0; |
| 4430 double input_b = 0.0; | 4489 double input_b = 0.0; |
| 4431 | 4490 |
| 4432 RawMachineAssemblerTester<int32_t> m; | 4491 RawMachineAssemblerTester<int32_t> m; |
| 4433 Node* a = m.LoadFromPointer(&input_a, kMachFloat64); | 4492 Node* a = m.LoadFromPointer(&input_a, MachineType::Float64()); |
| 4434 Node* b = m.LoadFromPointer(&input_b, kMachFloat64); | 4493 Node* b = m.LoadFromPointer(&input_b, MachineType::Float64()); |
| 4435 m.Return(m.Float64LessThan(a, b)); | 4494 m.Return(m.Float64LessThan(a, b)); |
| 4436 | 4495 |
| 4437 CompareWrapper cmp(IrOpcode::kFloat64LessThan); | 4496 CompareWrapper cmp(IrOpcode::kFloat64LessThan); |
| 4438 FOR_FLOAT64_INPUTS(pl) { | 4497 FOR_FLOAT64_INPUTS(pl) { |
| 4439 FOR_FLOAT64_INPUTS(pr) { | 4498 FOR_FLOAT64_INPUTS(pr) { |
| 4440 input_a = *pl; | 4499 input_a = *pl; |
| 4441 input_b = *pr; | 4500 input_b = *pr; |
| 4442 int32_t expected = cmp.Float64Compare(input_a, input_b) ? 1 : 0; | 4501 int32_t expected = cmp.Float64Compare(input_a, input_b) ? 1 : 0; |
| 4443 CHECK_EQ(expected, m.Call()); | 4502 CHECK_EQ(expected, m.Call()); |
| 4444 } | 4503 } |
| 4445 } | 4504 } |
| 4446 } | 4505 } |
| 4447 | 4506 |
| 4448 | 4507 |
| 4449 template <typename IntType, MachineType kRepresentation> | 4508 template <typename IntType> |
| 4450 static void LoadStoreTruncation() { | 4509 static void LoadStoreTruncation(MachineType kRepresentation) { |
| 4451 IntType input; | 4510 IntType input; |
| 4452 | 4511 |
| 4453 RawMachineAssemblerTester<int32_t> m; | 4512 RawMachineAssemblerTester<int32_t> m; |
| 4454 Node* a = m.LoadFromPointer(&input, kRepresentation); | 4513 Node* a = m.LoadFromPointer(&input, kRepresentation); |
| 4455 Node* ap1 = m.Int32Add(a, m.Int32Constant(1)); | 4514 Node* ap1 = m.Int32Add(a, m.Int32Constant(1)); |
| 4456 m.StoreToPointer(&input, kRepresentation, ap1); | 4515 m.StoreToPointer(&input, kRepresentation, ap1); |
| 4457 m.Return(ap1); | 4516 m.Return(ap1); |
| 4458 | 4517 |
| 4459 const IntType max = std::numeric_limits<IntType>::max(); | 4518 const IntType max = std::numeric_limits<IntType>::max(); |
| 4460 const IntType min = std::numeric_limits<IntType>::min(); | 4519 const IntType min = std::numeric_limits<IntType>::min(); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 4473 for (int i = -127; i < 127; i++) { | 4532 for (int i = -127; i < 127; i++) { |
| 4474 input = i; | 4533 input = i; |
| 4475 int expected = i >= 0 ? i + 1 : max + (i - min) + 2; | 4534 int expected = i >= 0 ? i + 1 : max + (i - min) + 2; |
| 4476 CHECK_EQ(static_cast<IntType>(expected), m.Call()); | 4535 CHECK_EQ(static_cast<IntType>(expected), m.Call()); |
| 4477 CHECK_EQ(static_cast<IntType>(i + 1), input); | 4536 CHECK_EQ(static_cast<IntType>(i + 1), input); |
| 4478 } | 4537 } |
| 4479 } | 4538 } |
| 4480 | 4539 |
| 4481 | 4540 |
| 4482 TEST(RunLoadStoreTruncation) { | 4541 TEST(RunLoadStoreTruncation) { |
| 4483 LoadStoreTruncation<int8_t, kMachInt8>(); | 4542 LoadStoreTruncation<int8_t>(MachineType::Int8()); |
| 4484 LoadStoreTruncation<int16_t, kMachInt16>(); | 4543 LoadStoreTruncation<int16_t>(MachineType::Int16()); |
| 4485 } | 4544 } |
| 4486 | 4545 |
| 4487 | 4546 |
| 4488 static void IntPtrCompare(intptr_t left, intptr_t right) { | 4547 static void IntPtrCompare(intptr_t left, intptr_t right) { |
| 4489 for (int test = 0; test < 7; test++) { | 4548 for (int test = 0; test < 7; test++) { |
| 4490 RawMachineAssemblerTester<bool> m(kMachPtr, kMachPtr); | 4549 RawMachineAssemblerTester<bool> m(MachineType::Pointer(), |
| 4550 MachineType::Pointer()); |
| 4491 Node* p0 = m.Parameter(0); | 4551 Node* p0 = m.Parameter(0); |
| 4492 Node* p1 = m.Parameter(1); | 4552 Node* p1 = m.Parameter(1); |
| 4493 Node* res = NULL; | 4553 Node* res = NULL; |
| 4494 bool expected = false; | 4554 bool expected = false; |
| 4495 switch (test) { | 4555 switch (test) { |
| 4496 case 0: | 4556 case 0: |
| 4497 res = m.IntPtrLessThan(p0, p1); | 4557 res = m.IntPtrLessThan(p0, p1); |
| 4498 expected = true; | 4558 expected = true; |
| 4499 break; | 4559 break; |
| 4500 case 1: | 4560 case 1: |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4549 int32_t outputs[kInputSize]; | 4609 int32_t outputs[kInputSize]; |
| 4550 for (int i = 0; i < kInputSize; i++) { | 4610 for (int i = 0; i < kInputSize; i++) { |
| 4551 inputs[i] = i; | 4611 inputs[i] = i; |
| 4552 outputs[i] = -1; | 4612 outputs[i] = -1; |
| 4553 } | 4613 } |
| 4554 RawMachineAssemblerTester<int32_t*> m; | 4614 RawMachineAssemblerTester<int32_t*> m; |
| 4555 Node* input = m.PointerConstant(&inputs[0]); | 4615 Node* input = m.PointerConstant(&inputs[0]); |
| 4556 Node* output = m.PointerConstant(&outputs[kInputSize - 1]); | 4616 Node* output = m.PointerConstant(&outputs[kInputSize - 1]); |
| 4557 Node* elem_size = m.IntPtrConstant(sizeof(inputs[0])); | 4617 Node* elem_size = m.IntPtrConstant(sizeof(inputs[0])); |
| 4558 for (int i = 0; i < kInputSize; i++) { | 4618 for (int i = 0; i < kInputSize; i++) { |
| 4559 m.Store(kMachInt32, output, m.Load(kMachInt32, input), kNoWriteBarrier); | 4619 m.Store(MachineType::Int32(), output, m.Load(MachineType::Int32(), input), |
| 4620 kNoWriteBarrier); |
| 4560 input = m.IntPtrAdd(input, elem_size); | 4621 input = m.IntPtrAdd(input, elem_size); |
| 4561 output = m.IntPtrSub(output, elem_size); | 4622 output = m.IntPtrSub(output, elem_size); |
| 4562 } | 4623 } |
| 4563 m.Return(input); | 4624 m.Return(input); |
| 4564 CHECK_EQ(&inputs[kInputSize], m.Call()); | 4625 CHECK_EQ(&inputs[kInputSize], m.Call()); |
| 4565 for (int i = 0; i < kInputSize; i++) { | 4626 for (int i = 0; i < kInputSize; i++) { |
| 4566 CHECK_EQ(i, inputs[i]); | 4627 CHECK_EQ(i, inputs[i]); |
| 4567 CHECK_EQ(kInputSize - i - 1, outputs[i]); | 4628 CHECK_EQ(kInputSize - i - 1, outputs[i]); |
| 4568 } | 4629 } |
| 4569 } | 4630 } |
| 4570 | 4631 |
| 4571 | 4632 |
| 4572 TEST(RunSpillLotsOfThings) { | 4633 TEST(RunSpillLotsOfThings) { |
| 4573 static const int kInputSize = 1000; | 4634 static const int kInputSize = 1000; |
| 4574 RawMachineAssemblerTester<int32_t> m; | 4635 RawMachineAssemblerTester<int32_t> m; |
| 4575 Node* accs[kInputSize]; | 4636 Node* accs[kInputSize]; |
| 4576 int32_t outputs[kInputSize]; | 4637 int32_t outputs[kInputSize]; |
| 4577 Node* one = m.Int32Constant(1); | 4638 Node* one = m.Int32Constant(1); |
| 4578 Node* acc = one; | 4639 Node* acc = one; |
| 4579 for (int i = 0; i < kInputSize; i++) { | 4640 for (int i = 0; i < kInputSize; i++) { |
| 4580 acc = m.Int32Add(acc, one); | 4641 acc = m.Int32Add(acc, one); |
| 4581 accs[i] = acc; | 4642 accs[i] = acc; |
| 4582 } | 4643 } |
| 4583 for (int i = 0; i < kInputSize; i++) { | 4644 for (int i = 0; i < kInputSize; i++) { |
| 4584 m.StoreToPointer(&outputs[i], kMachInt32, accs[i]); | 4645 m.StoreToPointer(&outputs[i], MachineType::Int32(), accs[i]); |
| 4585 } | 4646 } |
| 4586 m.Return(one); | 4647 m.Return(one); |
| 4587 m.Call(); | 4648 m.Call(); |
| 4588 for (int i = 0; i < kInputSize; i++) { | 4649 for (int i = 0; i < kInputSize; i++) { |
| 4589 CHECK_EQ(outputs[i], i + 2); | 4650 CHECK_EQ(outputs[i], i + 2); |
| 4590 } | 4651 } |
| 4591 } | 4652 } |
| 4592 | 4653 |
| 4593 | 4654 |
| 4594 TEST(RunSpillConstantsAndParameters) { | 4655 TEST(RunSpillConstantsAndParameters) { |
| 4595 static const int kInputSize = 1000; | 4656 static const int kInputSize = 1000; |
| 4596 static const int32_t kBase = 987; | 4657 static const int32_t kBase = 987; |
| 4597 RawMachineAssemblerTester<int32_t> m(kMachInt32, kMachInt32); | 4658 RawMachineAssemblerTester<int32_t> m(MachineType::Int32(), |
| 4659 MachineType::Int32()); |
| 4598 int32_t outputs[kInputSize]; | 4660 int32_t outputs[kInputSize]; |
| 4599 Node* csts[kInputSize]; | 4661 Node* csts[kInputSize]; |
| 4600 Node* accs[kInputSize]; | 4662 Node* accs[kInputSize]; |
| 4601 Node* acc = m.Int32Constant(0); | 4663 Node* acc = m.Int32Constant(0); |
| 4602 for (int i = 0; i < kInputSize; i++) { | 4664 for (int i = 0; i < kInputSize; i++) { |
| 4603 csts[i] = m.Int32Constant(static_cast<int32_t>(kBase + i)); | 4665 csts[i] = m.Int32Constant(static_cast<int32_t>(kBase + i)); |
| 4604 } | 4666 } |
| 4605 for (int i = 0; i < kInputSize; i++) { | 4667 for (int i = 0; i < kInputSize; i++) { |
| 4606 acc = m.Int32Add(acc, csts[i]); | 4668 acc = m.Int32Add(acc, csts[i]); |
| 4607 accs[i] = acc; | 4669 accs[i] = acc; |
| 4608 } | 4670 } |
| 4609 for (int i = 0; i < kInputSize; i++) { | 4671 for (int i = 0; i < kInputSize; i++) { |
| 4610 m.StoreToPointer(&outputs[i], kMachInt32, accs[i]); | 4672 m.StoreToPointer(&outputs[i], MachineType::Int32(), accs[i]); |
| 4611 } | 4673 } |
| 4612 m.Return(m.Int32Add(acc, m.Int32Add(m.Parameter(0), m.Parameter(1)))); | 4674 m.Return(m.Int32Add(acc, m.Int32Add(m.Parameter(0), m.Parameter(1)))); |
| 4613 FOR_INT32_INPUTS(i) { | 4675 FOR_INT32_INPUTS(i) { |
| 4614 FOR_INT32_INPUTS(j) { | 4676 FOR_INT32_INPUTS(j) { |
| 4615 int32_t expected = *i + *j; | 4677 int32_t expected = *i + *j; |
| 4616 for (int k = 0; k < kInputSize; k++) { | 4678 for (int k = 0; k < kInputSize; k++) { |
| 4617 expected += kBase + k; | 4679 expected += kBase + k; |
| 4618 } | 4680 } |
| 4619 CHECK_EQ(expected, m.Call(*i, *j)); | 4681 CHECK_EQ(expected, m.Call(*i, *j)); |
| 4620 expected = 0; | 4682 expected = 0; |
| 4621 for (int k = 0; k < kInputSize; k++) { | 4683 for (int k = 0; k < kInputSize; k++) { |
| 4622 expected += kBase + k; | 4684 expected += kBase + k; |
| 4623 CHECK_EQ(expected, outputs[k]); | 4685 CHECK_EQ(expected, outputs[k]); |
| 4624 } | 4686 } |
| 4625 } | 4687 } |
| 4626 } | 4688 } |
| 4627 } | 4689 } |
| 4628 | 4690 |
| 4629 | 4691 |
| 4630 TEST(RunNewSpaceConstantsInPhi) { | 4692 TEST(RunNewSpaceConstantsInPhi) { |
| 4631 RawMachineAssemblerTester<Object*> m(kMachInt32); | 4693 RawMachineAssemblerTester<Object*> m(MachineType::Int32()); |
| 4632 | 4694 |
| 4633 Isolate* isolate = CcTest::i_isolate(); | 4695 Isolate* isolate = CcTest::i_isolate(); |
| 4634 Handle<HeapNumber> true_val = isolate->factory()->NewHeapNumber(11.2); | 4696 Handle<HeapNumber> true_val = isolate->factory()->NewHeapNumber(11.2); |
| 4635 Handle<HeapNumber> false_val = isolate->factory()->NewHeapNumber(11.3); | 4697 Handle<HeapNumber> false_val = isolate->factory()->NewHeapNumber(11.3); |
| 4636 Node* true_node = m.HeapConstant(true_val); | 4698 Node* true_node = m.HeapConstant(true_val); |
| 4637 Node* false_node = m.HeapConstant(false_val); | 4699 Node* false_node = m.HeapConstant(false_val); |
| 4638 | 4700 |
| 4639 RawMachineLabel blocka, blockb, end; | 4701 RawMachineLabel blocka, blockb, end; |
| 4640 m.Branch(m.Parameter(0), &blocka, &blockb); | 4702 m.Branch(m.Parameter(0), &blocka, &blockb); |
| 4641 m.Bind(&blocka); | 4703 m.Bind(&blocka); |
| 4642 m.Goto(&end); | 4704 m.Goto(&end); |
| 4643 m.Bind(&blockb); | 4705 m.Bind(&blockb); |
| 4644 m.Goto(&end); | 4706 m.Goto(&end); |
| 4645 | 4707 |
| 4646 m.Bind(&end); | 4708 m.Bind(&end); |
| 4647 Node* phi = m.Phi(kMachAnyTagged, true_node, false_node); | 4709 Node* phi = m.Phi(MachineRepresentation::kTagged, true_node, false_node); |
| 4648 m.Return(phi); | 4710 m.Return(phi); |
| 4649 | 4711 |
| 4650 CHECK_EQ(*false_val, m.Call(0)); | 4712 CHECK_EQ(*false_val, m.Call(0)); |
| 4651 CHECK_EQ(*true_val, m.Call(1)); | 4713 CHECK_EQ(*true_val, m.Call(1)); |
| 4652 } | 4714 } |
| 4653 | 4715 |
| 4654 | 4716 |
| 4655 TEST(RunInt32AddWithOverflowP) { | 4717 TEST(RunInt32AddWithOverflowP) { |
| 4656 int32_t actual_val = -1; | 4718 int32_t actual_val = -1; |
| 4657 RawMachineAssemblerTester<int32_t> m; | 4719 RawMachineAssemblerTester<int32_t> m; |
| 4658 Int32BinopTester bt(&m); | 4720 Int32BinopTester bt(&m); |
| 4659 Node* add = m.Int32AddWithOverflow(bt.param0, bt.param1); | 4721 Node* add = m.Int32AddWithOverflow(bt.param0, bt.param1); |
| 4660 Node* val = m.Projection(0, add); | 4722 Node* val = m.Projection(0, add); |
| 4661 Node* ovf = m.Projection(1, add); | 4723 Node* ovf = m.Projection(1, add); |
| 4662 m.StoreToPointer(&actual_val, kMachInt32, val); | 4724 m.StoreToPointer(&actual_val, MachineType::Int32(), val); |
| 4663 bt.AddReturn(ovf); | 4725 bt.AddReturn(ovf); |
| 4664 FOR_INT32_INPUTS(i) { | 4726 FOR_INT32_INPUTS(i) { |
| 4665 FOR_INT32_INPUTS(j) { | 4727 FOR_INT32_INPUTS(j) { |
| 4666 int32_t expected_val; | 4728 int32_t expected_val; |
| 4667 int expected_ovf = bits::SignedAddOverflow32(*i, *j, &expected_val); | 4729 int expected_ovf = bits::SignedAddOverflow32(*i, *j, &expected_val); |
| 4668 CHECK_EQ(expected_ovf, bt.call(*i, *j)); | 4730 CHECK_EQ(expected_ovf, bt.call(*i, *j)); |
| 4669 CHECK_EQ(expected_val, actual_val); | 4731 CHECK_EQ(expected_val, actual_val); |
| 4670 } | 4732 } |
| 4671 } | 4733 } |
| 4672 } | 4734 } |
| 4673 | 4735 |
| 4674 | 4736 |
| 4675 TEST(RunInt32AddWithOverflowImm) { | 4737 TEST(RunInt32AddWithOverflowImm) { |
| 4676 int32_t actual_val = -1, expected_val = 0; | 4738 int32_t actual_val = -1, expected_val = 0; |
| 4677 FOR_INT32_INPUTS(i) { | 4739 FOR_INT32_INPUTS(i) { |
| 4678 { | 4740 { |
| 4679 RawMachineAssemblerTester<int32_t> m(kMachInt32); | 4741 RawMachineAssemblerTester<int32_t> m(MachineType::Int32()); |
| 4680 Node* add = m.Int32AddWithOverflow(m.Int32Constant(*i), m.Parameter(0)); | 4742 Node* add = m.Int32AddWithOverflow(m.Int32Constant(*i), m.Parameter(0)); |
| 4681 Node* val = m.Projection(0, add); | 4743 Node* val = m.Projection(0, add); |
| 4682 Node* ovf = m.Projection(1, add); | 4744 Node* ovf = m.Projection(1, add); |
| 4683 m.StoreToPointer(&actual_val, kMachInt32, val); | 4745 m.StoreToPointer(&actual_val, MachineType::Int32(), val); |
| 4684 m.Return(ovf); | 4746 m.Return(ovf); |
| 4685 FOR_INT32_INPUTS(j) { | 4747 FOR_INT32_INPUTS(j) { |
| 4686 int expected_ovf = bits::SignedAddOverflow32(*i, *j, &expected_val); | 4748 int expected_ovf = bits::SignedAddOverflow32(*i, *j, &expected_val); |
| 4687 CHECK_EQ(expected_ovf, m.Call(*j)); | 4749 CHECK_EQ(expected_ovf, m.Call(*j)); |
| 4688 CHECK_EQ(expected_val, actual_val); | 4750 CHECK_EQ(expected_val, actual_val); |
| 4689 } | 4751 } |
| 4690 } | 4752 } |
| 4691 { | 4753 { |
| 4692 RawMachineAssemblerTester<int32_t> m(kMachInt32); | 4754 RawMachineAssemblerTester<int32_t> m(MachineType::Int32()); |
| 4693 Node* add = m.Int32AddWithOverflow(m.Parameter(0), m.Int32Constant(*i)); | 4755 Node* add = m.Int32AddWithOverflow(m.Parameter(0), m.Int32Constant(*i)); |
| 4694 Node* val = m.Projection(0, add); | 4756 Node* val = m.Projection(0, add); |
| 4695 Node* ovf = m.Projection(1, add); | 4757 Node* ovf = m.Projection(1, add); |
| 4696 m.StoreToPointer(&actual_val, kMachInt32, val); | 4758 m.StoreToPointer(&actual_val, MachineType::Int32(), val); |
| 4697 m.Return(ovf); | 4759 m.Return(ovf); |
| 4698 FOR_INT32_INPUTS(j) { | 4760 FOR_INT32_INPUTS(j) { |
| 4699 int expected_ovf = bits::SignedAddOverflow32(*i, *j, &expected_val); | 4761 int expected_ovf = bits::SignedAddOverflow32(*i, *j, &expected_val); |
| 4700 CHECK_EQ(expected_ovf, m.Call(*j)); | 4762 CHECK_EQ(expected_ovf, m.Call(*j)); |
| 4701 CHECK_EQ(expected_val, actual_val); | 4763 CHECK_EQ(expected_val, actual_val); |
| 4702 } | 4764 } |
| 4703 } | 4765 } |
| 4704 FOR_INT32_INPUTS(j) { | 4766 FOR_INT32_INPUTS(j) { |
| 4705 RawMachineAssemblerTester<int32_t> m; | 4767 RawMachineAssemblerTester<int32_t> m; |
| 4706 Node* add = | 4768 Node* add = |
| 4707 m.Int32AddWithOverflow(m.Int32Constant(*i), m.Int32Constant(*j)); | 4769 m.Int32AddWithOverflow(m.Int32Constant(*i), m.Int32Constant(*j)); |
| 4708 Node* val = m.Projection(0, add); | 4770 Node* val = m.Projection(0, add); |
| 4709 Node* ovf = m.Projection(1, add); | 4771 Node* ovf = m.Projection(1, add); |
| 4710 m.StoreToPointer(&actual_val, kMachInt32, val); | 4772 m.StoreToPointer(&actual_val, MachineType::Int32(), val); |
| 4711 m.Return(ovf); | 4773 m.Return(ovf); |
| 4712 int expected_ovf = bits::SignedAddOverflow32(*i, *j, &expected_val); | 4774 int expected_ovf = bits::SignedAddOverflow32(*i, *j, &expected_val); |
| 4713 CHECK_EQ(expected_ovf, m.Call()); | 4775 CHECK_EQ(expected_ovf, m.Call()); |
| 4714 CHECK_EQ(expected_val, actual_val); | 4776 CHECK_EQ(expected_val, actual_val); |
| 4715 } | 4777 } |
| 4716 } | 4778 } |
| 4717 } | 4779 } |
| 4718 | 4780 |
| 4719 | 4781 |
| 4720 TEST(RunInt32AddWithOverflowInBranchP) { | 4782 TEST(RunInt32AddWithOverflowInBranchP) { |
| (...skipping 19 matching lines...) Expand all Loading... |
| 4740 } | 4802 } |
| 4741 | 4803 |
| 4742 | 4804 |
| 4743 TEST(RunInt32SubWithOverflowP) { | 4805 TEST(RunInt32SubWithOverflowP) { |
| 4744 int32_t actual_val = -1; | 4806 int32_t actual_val = -1; |
| 4745 RawMachineAssemblerTester<int32_t> m; | 4807 RawMachineAssemblerTester<int32_t> m; |
| 4746 Int32BinopTester bt(&m); | 4808 Int32BinopTester bt(&m); |
| 4747 Node* add = m.Int32SubWithOverflow(bt.param0, bt.param1); | 4809 Node* add = m.Int32SubWithOverflow(bt.param0, bt.param1); |
| 4748 Node* val = m.Projection(0, add); | 4810 Node* val = m.Projection(0, add); |
| 4749 Node* ovf = m.Projection(1, add); | 4811 Node* ovf = m.Projection(1, add); |
| 4750 m.StoreToPointer(&actual_val, kMachInt32, val); | 4812 m.StoreToPointer(&actual_val, MachineType::Int32(), val); |
| 4751 bt.AddReturn(ovf); | 4813 bt.AddReturn(ovf); |
| 4752 FOR_INT32_INPUTS(i) { | 4814 FOR_INT32_INPUTS(i) { |
| 4753 FOR_INT32_INPUTS(j) { | 4815 FOR_INT32_INPUTS(j) { |
| 4754 int32_t expected_val; | 4816 int32_t expected_val; |
| 4755 int expected_ovf = bits::SignedSubOverflow32(*i, *j, &expected_val); | 4817 int expected_ovf = bits::SignedSubOverflow32(*i, *j, &expected_val); |
| 4756 CHECK_EQ(expected_ovf, bt.call(*i, *j)); | 4818 CHECK_EQ(expected_ovf, bt.call(*i, *j)); |
| 4757 CHECK_EQ(expected_val, actual_val); | 4819 CHECK_EQ(expected_val, actual_val); |
| 4758 } | 4820 } |
| 4759 } | 4821 } |
| 4760 } | 4822 } |
| 4761 | 4823 |
| 4762 | 4824 |
| 4763 TEST(RunInt32SubWithOverflowImm) { | 4825 TEST(RunInt32SubWithOverflowImm) { |
| 4764 int32_t actual_val = -1, expected_val = 0; | 4826 int32_t actual_val = -1, expected_val = 0; |
| 4765 FOR_INT32_INPUTS(i) { | 4827 FOR_INT32_INPUTS(i) { |
| 4766 { | 4828 { |
| 4767 RawMachineAssemblerTester<int32_t> m(kMachInt32); | 4829 RawMachineAssemblerTester<int32_t> m(MachineType::Int32()); |
| 4768 Node* add = m.Int32SubWithOverflow(m.Int32Constant(*i), m.Parameter(0)); | 4830 Node* add = m.Int32SubWithOverflow(m.Int32Constant(*i), m.Parameter(0)); |
| 4769 Node* val = m.Projection(0, add); | 4831 Node* val = m.Projection(0, add); |
| 4770 Node* ovf = m.Projection(1, add); | 4832 Node* ovf = m.Projection(1, add); |
| 4771 m.StoreToPointer(&actual_val, kMachInt32, val); | 4833 m.StoreToPointer(&actual_val, MachineType::Int32(), val); |
| 4772 m.Return(ovf); | 4834 m.Return(ovf); |
| 4773 FOR_INT32_INPUTS(j) { | 4835 FOR_INT32_INPUTS(j) { |
| 4774 int expected_ovf = bits::SignedSubOverflow32(*i, *j, &expected_val); | 4836 int expected_ovf = bits::SignedSubOverflow32(*i, *j, &expected_val); |
| 4775 CHECK_EQ(expected_ovf, m.Call(*j)); | 4837 CHECK_EQ(expected_ovf, m.Call(*j)); |
| 4776 CHECK_EQ(expected_val, actual_val); | 4838 CHECK_EQ(expected_val, actual_val); |
| 4777 } | 4839 } |
| 4778 } | 4840 } |
| 4779 { | 4841 { |
| 4780 RawMachineAssemblerTester<int32_t> m(kMachInt32); | 4842 RawMachineAssemblerTester<int32_t> m(MachineType::Int32()); |
| 4781 Node* add = m.Int32SubWithOverflow(m.Parameter(0), m.Int32Constant(*i)); | 4843 Node* add = m.Int32SubWithOverflow(m.Parameter(0), m.Int32Constant(*i)); |
| 4782 Node* val = m.Projection(0, add); | 4844 Node* val = m.Projection(0, add); |
| 4783 Node* ovf = m.Projection(1, add); | 4845 Node* ovf = m.Projection(1, add); |
| 4784 m.StoreToPointer(&actual_val, kMachInt32, val); | 4846 m.StoreToPointer(&actual_val, MachineType::Int32(), val); |
| 4785 m.Return(ovf); | 4847 m.Return(ovf); |
| 4786 FOR_INT32_INPUTS(j) { | 4848 FOR_INT32_INPUTS(j) { |
| 4787 int expected_ovf = bits::SignedSubOverflow32(*j, *i, &expected_val); | 4849 int expected_ovf = bits::SignedSubOverflow32(*j, *i, &expected_val); |
| 4788 CHECK_EQ(expected_ovf, m.Call(*j)); | 4850 CHECK_EQ(expected_ovf, m.Call(*j)); |
| 4789 CHECK_EQ(expected_val, actual_val); | 4851 CHECK_EQ(expected_val, actual_val); |
| 4790 } | 4852 } |
| 4791 } | 4853 } |
| 4792 FOR_INT32_INPUTS(j) { | 4854 FOR_INT32_INPUTS(j) { |
| 4793 RawMachineAssemblerTester<int32_t> m; | 4855 RawMachineAssemblerTester<int32_t> m; |
| 4794 Node* add = | 4856 Node* add = |
| 4795 m.Int32SubWithOverflow(m.Int32Constant(*i), m.Int32Constant(*j)); | 4857 m.Int32SubWithOverflow(m.Int32Constant(*i), m.Int32Constant(*j)); |
| 4796 Node* val = m.Projection(0, add); | 4858 Node* val = m.Projection(0, add); |
| 4797 Node* ovf = m.Projection(1, add); | 4859 Node* ovf = m.Projection(1, add); |
| 4798 m.StoreToPointer(&actual_val, kMachInt32, val); | 4860 m.StoreToPointer(&actual_val, MachineType::Int32(), val); |
| 4799 m.Return(ovf); | 4861 m.Return(ovf); |
| 4800 int expected_ovf = bits::SignedSubOverflow32(*i, *j, &expected_val); | 4862 int expected_ovf = bits::SignedSubOverflow32(*i, *j, &expected_val); |
| 4801 CHECK_EQ(expected_ovf, m.Call()); | 4863 CHECK_EQ(expected_ovf, m.Call()); |
| 4802 CHECK_EQ(expected_val, actual_val); | 4864 CHECK_EQ(expected_val, actual_val); |
| 4803 } | 4865 } |
| 4804 } | 4866 } |
| 4805 } | 4867 } |
| 4806 | 4868 |
| 4807 | 4869 |
| 4808 TEST(RunInt32SubWithOverflowInBranchP) { | 4870 TEST(RunInt32SubWithOverflowInBranchP) { |
| (...skipping 17 matching lines...) Expand all Loading... |
| 4826 } | 4888 } |
| 4827 } | 4889 } |
| 4828 } | 4890 } |
| 4829 | 4891 |
| 4830 | 4892 |
| 4831 TEST(RunWord64EqualInBranchP) { | 4893 TEST(RunWord64EqualInBranchP) { |
| 4832 int64_t input; | 4894 int64_t input; |
| 4833 RawMachineLabel blocka, blockb; | 4895 RawMachineLabel blocka, blockb; |
| 4834 RawMachineAssemblerTester<int64_t> m; | 4896 RawMachineAssemblerTester<int64_t> m; |
| 4835 if (!m.machine()->Is64()) return; | 4897 if (!m.machine()->Is64()) return; |
| 4836 Node* value = m.LoadFromPointer(&input, kMachInt64); | 4898 Node* value = m.LoadFromPointer(&input, MachineType::Int64()); |
| 4837 m.Branch(m.Word64Equal(value, m.Int64Constant(0)), &blocka, &blockb); | 4899 m.Branch(m.Word64Equal(value, m.Int64Constant(0)), &blocka, &blockb); |
| 4838 m.Bind(&blocka); | 4900 m.Bind(&blocka); |
| 4839 m.Return(m.Int32Constant(1)); | 4901 m.Return(m.Int32Constant(1)); |
| 4840 m.Bind(&blockb); | 4902 m.Bind(&blockb); |
| 4841 m.Return(m.Int32Constant(2)); | 4903 m.Return(m.Int32Constant(2)); |
| 4842 input = V8_INT64_C(0); | 4904 input = V8_INT64_C(0); |
| 4843 CHECK_EQ(1, m.Call()); | 4905 CHECK_EQ(1, m.Call()); |
| 4844 input = V8_INT64_C(1); | 4906 input = V8_INT64_C(1); |
| 4845 CHECK_EQ(2, m.Call()); | 4907 CHECK_EQ(2, m.Call()); |
| 4846 input = V8_INT64_C(0x100000000); | 4908 input = V8_INT64_C(0x100000000); |
| 4847 CHECK_EQ(2, m.Call()); | 4909 CHECK_EQ(2, m.Call()); |
| 4848 } | 4910 } |
| 4849 | 4911 |
| 4850 | 4912 |
| 4851 TEST(RunChangeInt32ToInt64P) { | 4913 TEST(RunChangeInt32ToInt64P) { |
| 4852 if (kPointerSize < 8) return; | 4914 if (kPointerSize < 8) return; |
| 4853 int64_t actual = -1; | 4915 int64_t actual = -1; |
| 4854 RawMachineAssemblerTester<int32_t> m(kMachInt32); | 4916 RawMachineAssemblerTester<int32_t> m(MachineType::Int32()); |
| 4855 m.StoreToPointer(&actual, kMachInt64, m.ChangeInt32ToInt64(m.Parameter(0))); | 4917 m.StoreToPointer(&actual, MachineType::Int64(), |
| 4918 m.ChangeInt32ToInt64(m.Parameter(0))); |
| 4856 m.Return(m.Int32Constant(0)); | 4919 m.Return(m.Int32Constant(0)); |
| 4857 FOR_INT32_INPUTS(i) { | 4920 FOR_INT32_INPUTS(i) { |
| 4858 int64_t expected = *i; | 4921 int64_t expected = *i; |
| 4859 CHECK_EQ(0, m.Call(*i)); | 4922 CHECK_EQ(0, m.Call(*i)); |
| 4860 CHECK_EQ(expected, actual); | 4923 CHECK_EQ(expected, actual); |
| 4861 } | 4924 } |
| 4862 } | 4925 } |
| 4863 | 4926 |
| 4864 | 4927 |
| 4865 TEST(RunChangeUint32ToUint64P) { | 4928 TEST(RunChangeUint32ToUint64P) { |
| 4866 if (kPointerSize < 8) return; | 4929 if (kPointerSize < 8) return; |
| 4867 int64_t actual = -1; | 4930 int64_t actual = -1; |
| 4868 RawMachineAssemblerTester<int32_t> m(kMachUint32); | 4931 RawMachineAssemblerTester<int32_t> m(MachineType::Uint32()); |
| 4869 m.StoreToPointer(&actual, kMachUint64, | 4932 m.StoreToPointer(&actual, MachineType::Uint64(), |
| 4870 m.ChangeUint32ToUint64(m.Parameter(0))); | 4933 m.ChangeUint32ToUint64(m.Parameter(0))); |
| 4871 m.Return(m.Int32Constant(0)); | 4934 m.Return(m.Int32Constant(0)); |
| 4872 FOR_UINT32_INPUTS(i) { | 4935 FOR_UINT32_INPUTS(i) { |
| 4873 int64_t expected = static_cast<uint64_t>(*i); | 4936 int64_t expected = static_cast<uint64_t>(*i); |
| 4874 CHECK_EQ(0, m.Call(*i)); | 4937 CHECK_EQ(0, m.Call(*i)); |
| 4875 CHECK_EQ(expected, actual); | 4938 CHECK_EQ(expected, actual); |
| 4876 } | 4939 } |
| 4877 } | 4940 } |
| 4878 | 4941 |
| 4879 | 4942 |
| 4880 TEST(RunTruncateInt64ToInt32P) { | 4943 TEST(RunTruncateInt64ToInt32P) { |
| 4881 if (kPointerSize < 8) return; | 4944 if (kPointerSize < 8) return; |
| 4882 int64_t expected = -1; | 4945 int64_t expected = -1; |
| 4883 RawMachineAssemblerTester<int32_t> m; | 4946 RawMachineAssemblerTester<int32_t> m; |
| 4884 m.Return(m.TruncateInt64ToInt32(m.LoadFromPointer(&expected, kMachInt64))); | 4947 m.Return(m.TruncateInt64ToInt32( |
| 4948 m.LoadFromPointer(&expected, MachineType::Int64()))); |
| 4885 FOR_UINT32_INPUTS(i) { | 4949 FOR_UINT32_INPUTS(i) { |
| 4886 FOR_UINT32_INPUTS(j) { | 4950 FOR_UINT32_INPUTS(j) { |
| 4887 expected = (static_cast<uint64_t>(*j) << 32) | *i; | 4951 expected = (static_cast<uint64_t>(*j) << 32) | *i; |
| 4888 CHECK_EQ(static_cast<int32_t>(expected), m.Call()); | 4952 CHECK_EQ(static_cast<int32_t>(expected), m.Call()); |
| 4889 } | 4953 } |
| 4890 } | 4954 } |
| 4891 } | 4955 } |
| 4892 | 4956 |
| 4893 | 4957 |
| 4894 TEST(RunTruncateFloat64ToInt32P) { | 4958 TEST(RunTruncateFloat64ToInt32P) { |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4945 {9.6714157802890681e+24, -2147483648.0}, | 5009 {9.6714157802890681e+24, -2147483648.0}, |
| 4946 {-9.6714157802890681e+24, -2147483648.0}, | 5010 {-9.6714157802890681e+24, -2147483648.0}, |
| 4947 {1.9342813113834065e+25, 2147483648.0}, | 5011 {1.9342813113834065e+25, 2147483648.0}, |
| 4948 {-1.9342813113834065e+25, 2147483648.0}, | 5012 {-1.9342813113834065e+25, 2147483648.0}, |
| 4949 {3.868562622766813e+25, 0}, | 5013 {3.868562622766813e+25, 0}, |
| 4950 {-3.868562622766813e+25, 0}, | 5014 {-3.868562622766813e+25, 0}, |
| 4951 {1.7976931348623157e+308, 0}, | 5015 {1.7976931348623157e+308, 0}, |
| 4952 {-1.7976931348623157e+308, 0}}; | 5016 {-1.7976931348623157e+308, 0}}; |
| 4953 double input = -1.0; | 5017 double input = -1.0; |
| 4954 RawMachineAssemblerTester<int32_t> m; | 5018 RawMachineAssemblerTester<int32_t> m; |
| 4955 m.Return(m.TruncateFloat64ToInt32(TruncationMode::kJavaScript, | 5019 m.Return(m.TruncateFloat64ToInt32( |
| 4956 m.LoadFromPointer(&input, kMachFloat64))); | 5020 TruncationMode::kJavaScript, |
| 5021 m.LoadFromPointer(&input, MachineType::Float64()))); |
| 4957 for (size_t i = 0; i < arraysize(kValues); ++i) { | 5022 for (size_t i = 0; i < arraysize(kValues); ++i) { |
| 4958 input = kValues[i].from; | 5023 input = kValues[i].from; |
| 4959 uint64_t expected = static_cast<int64_t>(kValues[i].raw); | 5024 uint64_t expected = static_cast<int64_t>(kValues[i].raw); |
| 4960 CHECK_EQ(static_cast<int>(expected), m.Call()); | 5025 CHECK_EQ(static_cast<int>(expected), m.Call()); |
| 4961 } | 5026 } |
| 4962 } | 5027 } |
| 4963 | 5028 |
| 4964 | 5029 |
| 4965 TEST(RunChangeFloat32ToFloat64) { | 5030 TEST(RunChangeFloat32ToFloat64) { |
| 4966 BufferedRawMachineAssemblerTester<double> m(kMachFloat32); | 5031 BufferedRawMachineAssemblerTester<double> m(MachineType::Float32()); |
| 4967 | 5032 |
| 4968 m.Return(m.ChangeFloat32ToFloat64(m.Parameter(0))); | 5033 m.Return(m.ChangeFloat32ToFloat64(m.Parameter(0))); |
| 4969 | 5034 |
| 4970 FOR_FLOAT32_INPUTS(i) { CheckDoubleEq(static_cast<double>(*i), m.Call(*i)); } | 5035 FOR_FLOAT32_INPUTS(i) { CheckDoubleEq(static_cast<double>(*i), m.Call(*i)); } |
| 4971 } | 5036 } |
| 4972 | 5037 |
| 4973 | 5038 |
| 4974 TEST(RunFloat32Constant) { | 5039 TEST(RunFloat32Constant) { |
| 4975 FOR_FLOAT32_INPUTS(i) { | 5040 FOR_FLOAT32_INPUTS(i) { |
| 4976 BufferedRawMachineAssemblerTester<float> m; | 5041 BufferedRawMachineAssemblerTester<float> m; |
| 4977 m.Return(m.Float32Constant(*i)); | 5042 m.Return(m.Float32Constant(*i)); |
| 4978 CheckFloatEq(*i, m.Call()); | 5043 CheckFloatEq(*i, m.Call()); |
| 4979 } | 5044 } |
| 4980 } | 5045 } |
| 4981 | 5046 |
| 4982 | 5047 |
| 4983 TEST(RunFloat64ExtractLowWord32) { | 5048 TEST(RunFloat64ExtractLowWord32) { |
| 4984 BufferedRawMachineAssemblerTester<uint32_t> m(kMachFloat64); | 5049 BufferedRawMachineAssemblerTester<uint32_t> m(MachineType::Float64()); |
| 4985 m.Return(m.Float64ExtractLowWord32(m.Parameter(0))); | 5050 m.Return(m.Float64ExtractLowWord32(m.Parameter(0))); |
| 4986 FOR_FLOAT64_INPUTS(i) { | 5051 FOR_FLOAT64_INPUTS(i) { |
| 4987 uint32_t expected = static_cast<uint32_t>(bit_cast<uint64_t>(*i)); | 5052 uint32_t expected = static_cast<uint32_t>(bit_cast<uint64_t>(*i)); |
| 4988 CHECK_EQ(expected, m.Call(*i)); | 5053 CHECK_EQ(expected, m.Call(*i)); |
| 4989 } | 5054 } |
| 4990 } | 5055 } |
| 4991 | 5056 |
| 4992 | 5057 |
| 4993 TEST(RunFloat64ExtractHighWord32) { | 5058 TEST(RunFloat64ExtractHighWord32) { |
| 4994 BufferedRawMachineAssemblerTester<uint32_t> m(kMachFloat64); | 5059 BufferedRawMachineAssemblerTester<uint32_t> m(MachineType::Float64()); |
| 4995 m.Return(m.Float64ExtractHighWord32(m.Parameter(0))); | 5060 m.Return(m.Float64ExtractHighWord32(m.Parameter(0))); |
| 4996 FOR_FLOAT64_INPUTS(i) { | 5061 FOR_FLOAT64_INPUTS(i) { |
| 4997 uint32_t expected = static_cast<uint32_t>(bit_cast<uint64_t>(*i) >> 32); | 5062 uint32_t expected = static_cast<uint32_t>(bit_cast<uint64_t>(*i) >> 32); |
| 4998 CHECK_EQ(expected, m.Call(*i)); | 5063 CHECK_EQ(expected, m.Call(*i)); |
| 4999 } | 5064 } |
| 5000 } | 5065 } |
| 5001 | 5066 |
| 5002 | 5067 |
| 5003 TEST(RunFloat64InsertLowWord32) { | 5068 TEST(RunFloat64InsertLowWord32) { |
| 5004 BufferedRawMachineAssemblerTester<double> m(kMachFloat64, kMachInt32); | 5069 BufferedRawMachineAssemblerTester<double> m(MachineType::Float64(), |
| 5070 MachineType::Int32()); |
| 5005 m.Return(m.Float64InsertLowWord32(m.Parameter(0), m.Parameter(1))); | 5071 m.Return(m.Float64InsertLowWord32(m.Parameter(0), m.Parameter(1))); |
| 5006 FOR_FLOAT64_INPUTS(i) { | 5072 FOR_FLOAT64_INPUTS(i) { |
| 5007 FOR_INT32_INPUTS(j) { | 5073 FOR_INT32_INPUTS(j) { |
| 5008 double expected = bit_cast<double>( | 5074 double expected = bit_cast<double>( |
| 5009 (bit_cast<uint64_t>(*i) & ~(V8_UINT64_C(0xFFFFFFFF))) | | 5075 (bit_cast<uint64_t>(*i) & ~(V8_UINT64_C(0xFFFFFFFF))) | |
| 5010 (static_cast<uint64_t>(bit_cast<uint32_t>(*j)))); | 5076 (static_cast<uint64_t>(bit_cast<uint32_t>(*j)))); |
| 5011 CheckDoubleEq(expected, m.Call(*i, *j)); | 5077 CheckDoubleEq(expected, m.Call(*i, *j)); |
| 5012 } | 5078 } |
| 5013 } | 5079 } |
| 5014 } | 5080 } |
| 5015 | 5081 |
| 5016 | 5082 |
| 5017 TEST(RunFloat64InsertHighWord32) { | 5083 TEST(RunFloat64InsertHighWord32) { |
| 5018 BufferedRawMachineAssemblerTester<double> m(kMachFloat64, kMachUint32); | 5084 BufferedRawMachineAssemblerTester<double> m(MachineType::Float64(), |
| 5085 MachineType::Uint32()); |
| 5019 m.Return(m.Float64InsertHighWord32(m.Parameter(0), m.Parameter(1))); | 5086 m.Return(m.Float64InsertHighWord32(m.Parameter(0), m.Parameter(1))); |
| 5020 FOR_FLOAT64_INPUTS(i) { | 5087 FOR_FLOAT64_INPUTS(i) { |
| 5021 FOR_UINT32_INPUTS(j) { | 5088 FOR_UINT32_INPUTS(j) { |
| 5022 uint64_t expected = (bit_cast<uint64_t>(*i) & 0xFFFFFFFF) | | 5089 uint64_t expected = (bit_cast<uint64_t>(*i) & 0xFFFFFFFF) | |
| 5023 (static_cast<uint64_t>(*j) << 32); | 5090 (static_cast<uint64_t>(*j) << 32); |
| 5024 | 5091 |
| 5025 CheckDoubleEq(bit_cast<double>(expected), m.Call(*i, *j)); | 5092 CheckDoubleEq(bit_cast<double>(expected), m.Call(*i, *j)); |
| 5026 } | 5093 } |
| 5027 } | 5094 } |
| 5028 } | 5095 } |
| 5029 | 5096 |
| 5030 | 5097 |
| 5031 TEST(RunFloat32Abs) { | 5098 TEST(RunFloat32Abs) { |
| 5032 BufferedRawMachineAssemblerTester<float> m(kMachFloat32); | 5099 BufferedRawMachineAssemblerTester<float> m(MachineType::Float32()); |
| 5033 m.Return(m.Float32Abs(m.Parameter(0))); | 5100 m.Return(m.Float32Abs(m.Parameter(0))); |
| 5034 FOR_FLOAT32_INPUTS(i) { CheckFloatEq(std::abs(*i), m.Call(*i)); } | 5101 FOR_FLOAT32_INPUTS(i) { CheckFloatEq(std::abs(*i), m.Call(*i)); } |
| 5035 } | 5102 } |
| 5036 | 5103 |
| 5037 | 5104 |
| 5038 TEST(RunFloat64Abs) { | 5105 TEST(RunFloat64Abs) { |
| 5039 BufferedRawMachineAssemblerTester<double> m(kMachFloat64); | 5106 BufferedRawMachineAssemblerTester<double> m(MachineType::Float64()); |
| 5040 m.Return(m.Float64Abs(m.Parameter(0))); | 5107 m.Return(m.Float64Abs(m.Parameter(0))); |
| 5041 FOR_FLOAT64_INPUTS(i) { CheckDoubleEq(std::abs(*i), m.Call(*i)); } | 5108 FOR_FLOAT64_INPUTS(i) { CheckDoubleEq(std::abs(*i), m.Call(*i)); } |
| 5042 } | 5109 } |
| 5043 | 5110 |
| 5044 | 5111 |
| 5045 static double two_30 = 1 << 30; // 2^30 is a smi boundary. | 5112 static double two_30 = 1 << 30; // 2^30 is a smi boundary. |
| 5046 static double two_52 = two_30 * (1 << 22); // 2^52 is a precision boundary. | 5113 static double two_52 = two_30 * (1 << 22); // 2^52 is a precision boundary. |
| 5047 static double kValues[] = {0.1, | 5114 static double kValues[] = {0.1, |
| 5048 0.2, | 5115 0.2, |
| 5049 0.49999999999999994, | 5116 0.49999999999999994, |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5134 -two_52 - 0.1, | 5201 -two_52 - 0.1, |
| 5135 -two_52 - 0.5, | 5202 -two_52 - 0.5, |
| 5136 -two_52 - 0.7, | 5203 -two_52 - 0.7, |
| 5137 -two_52 + 1, | 5204 -two_52 + 1, |
| 5138 -two_52 + 1 - 0.1, | 5205 -two_52 + 1 - 0.1, |
| 5139 -two_52 + 1 - 0.5, | 5206 -two_52 + 1 - 0.5, |
| 5140 -two_52 + 1 - 0.7}; | 5207 -two_52 + 1 - 0.7}; |
| 5141 | 5208 |
| 5142 | 5209 |
| 5143 TEST(RunFloat32RoundDown) { | 5210 TEST(RunFloat32RoundDown) { |
| 5144 BufferedRawMachineAssemblerTester<float> m(kMachFloat32); | 5211 BufferedRawMachineAssemblerTester<float> m(MachineType::Float32()); |
| 5145 if (!m.machine()->Float32RoundDown().IsSupported()) return; | 5212 if (!m.machine()->Float32RoundDown().IsSupported()) return; |
| 5146 | 5213 |
| 5147 m.Return(m.Float32RoundDown(m.Parameter(0))); | 5214 m.Return(m.Float32RoundDown(m.Parameter(0))); |
| 5148 | 5215 |
| 5149 FOR_FLOAT32_INPUTS(i) { CheckFloatEq(floorf(*i), m.Call(*i)); } | 5216 FOR_FLOAT32_INPUTS(i) { CheckFloatEq(floorf(*i), m.Call(*i)); } |
| 5150 } | 5217 } |
| 5151 | 5218 |
| 5152 | 5219 |
| 5153 TEST(RunFloat64RoundDown1) { | 5220 TEST(RunFloat64RoundDown1) { |
| 5154 BufferedRawMachineAssemblerTester<double> m(kMachFloat64); | 5221 BufferedRawMachineAssemblerTester<double> m(MachineType::Float64()); |
| 5155 if (!m.machine()->Float64RoundDown().IsSupported()) return; | 5222 if (!m.machine()->Float64RoundDown().IsSupported()) return; |
| 5156 | 5223 |
| 5157 m.Return(m.Float64RoundDown(m.Parameter(0))); | 5224 m.Return(m.Float64RoundDown(m.Parameter(0))); |
| 5158 | 5225 |
| 5159 FOR_FLOAT64_INPUTS(i) { CheckDoubleEq(floor(*i), m.Call(*i)); } | 5226 FOR_FLOAT64_INPUTS(i) { CheckDoubleEq(floor(*i), m.Call(*i)); } |
| 5160 } | 5227 } |
| 5161 | 5228 |
| 5162 | 5229 |
| 5163 TEST(RunFloat64RoundDown2) { | 5230 TEST(RunFloat64RoundDown2) { |
| 5164 BufferedRawMachineAssemblerTester<double> m(kMachFloat64); | 5231 BufferedRawMachineAssemblerTester<double> m(MachineType::Float64()); |
| 5165 if (!m.machine()->Float64RoundDown().IsSupported()) return; | 5232 if (!m.machine()->Float64RoundDown().IsSupported()) return; |
| 5166 m.Return(m.Float64Sub(m.Float64Constant(-0.0), | 5233 m.Return(m.Float64Sub(m.Float64Constant(-0.0), |
| 5167 m.Float64RoundDown(m.Float64Sub(m.Float64Constant(-0.0), | 5234 m.Float64RoundDown(m.Float64Sub(m.Float64Constant(-0.0), |
| 5168 m.Parameter(0))))); | 5235 m.Parameter(0))))); |
| 5169 | 5236 |
| 5170 for (size_t i = 0; i < arraysize(kValues); ++i) { | 5237 for (size_t i = 0; i < arraysize(kValues); ++i) { |
| 5171 CHECK_EQ(ceil(kValues[i]), m.Call(kValues[i])); | 5238 CHECK_EQ(ceil(kValues[i]), m.Call(kValues[i])); |
| 5172 } | 5239 } |
| 5173 } | 5240 } |
| 5174 | 5241 |
| 5175 | 5242 |
| 5176 TEST(RunFloat32RoundUp) { | 5243 TEST(RunFloat32RoundUp) { |
| 5177 BufferedRawMachineAssemblerTester<float> m(kMachFloat32); | 5244 BufferedRawMachineAssemblerTester<float> m(MachineType::Float32()); |
| 5178 if (!m.machine()->Float32RoundUp().IsSupported()) return; | 5245 if (!m.machine()->Float32RoundUp().IsSupported()) return; |
| 5179 m.Return(m.Float32RoundUp(m.Parameter(0))); | 5246 m.Return(m.Float32RoundUp(m.Parameter(0))); |
| 5180 | 5247 |
| 5181 FOR_FLOAT32_INPUTS(i) { CheckFloatEq(ceilf(*i), m.Call(*i)); } | 5248 FOR_FLOAT32_INPUTS(i) { CheckFloatEq(ceilf(*i), m.Call(*i)); } |
| 5182 } | 5249 } |
| 5183 | 5250 |
| 5184 | 5251 |
| 5185 TEST(RunFloat64RoundUp) { | 5252 TEST(RunFloat64RoundUp) { |
| 5186 BufferedRawMachineAssemblerTester<double> m(kMachFloat64); | 5253 BufferedRawMachineAssemblerTester<double> m(MachineType::Float64()); |
| 5187 if (!m.machine()->Float64RoundUp().IsSupported()) return; | 5254 if (!m.machine()->Float64RoundUp().IsSupported()) return; |
| 5188 m.Return(m.Float64RoundUp(m.Parameter(0))); | 5255 m.Return(m.Float64RoundUp(m.Parameter(0))); |
| 5189 | 5256 |
| 5190 FOR_FLOAT64_INPUTS(i) { CheckDoubleEq(ceil(*i), m.Call(*i)); } | 5257 FOR_FLOAT64_INPUTS(i) { CheckDoubleEq(ceil(*i), m.Call(*i)); } |
| 5191 } | 5258 } |
| 5192 | 5259 |
| 5193 | 5260 |
| 5194 TEST(RunFloat32RoundTiesEven) { | 5261 TEST(RunFloat32RoundTiesEven) { |
| 5195 BufferedRawMachineAssemblerTester<float> m(kMachFloat32); | 5262 BufferedRawMachineAssemblerTester<float> m(MachineType::Float32()); |
| 5196 if (!m.machine()->Float32RoundTiesEven().IsSupported()) return; | 5263 if (!m.machine()->Float32RoundTiesEven().IsSupported()) return; |
| 5197 m.Return(m.Float32RoundTiesEven(m.Parameter(0))); | 5264 m.Return(m.Float32RoundTiesEven(m.Parameter(0))); |
| 5198 | 5265 |
| 5199 FOR_FLOAT32_INPUTS(i) { CheckFloatEq(nearbyint(*i), m.Call(*i)); } | 5266 FOR_FLOAT32_INPUTS(i) { CheckFloatEq(nearbyint(*i), m.Call(*i)); } |
| 5200 } | 5267 } |
| 5201 | 5268 |
| 5202 | 5269 |
| 5203 TEST(RunFloat64RoundTiesEven) { | 5270 TEST(RunFloat64RoundTiesEven) { |
| 5204 BufferedRawMachineAssemblerTester<double> m(kMachFloat64); | 5271 BufferedRawMachineAssemblerTester<double> m(MachineType::Float64()); |
| 5205 if (!m.machine()->Float64RoundTiesEven().IsSupported()) return; | 5272 if (!m.machine()->Float64RoundTiesEven().IsSupported()) return; |
| 5206 m.Return(m.Float64RoundTiesEven(m.Parameter(0))); | 5273 m.Return(m.Float64RoundTiesEven(m.Parameter(0))); |
| 5207 | 5274 |
| 5208 FOR_FLOAT64_INPUTS(i) { CheckDoubleEq(nearbyint(*i), m.Call(*i)); } | 5275 FOR_FLOAT64_INPUTS(i) { CheckDoubleEq(nearbyint(*i), m.Call(*i)); } |
| 5209 } | 5276 } |
| 5210 | 5277 |
| 5211 | 5278 |
| 5212 TEST(RunFloat32RoundTruncate) { | 5279 TEST(RunFloat32RoundTruncate) { |
| 5213 BufferedRawMachineAssemblerTester<float> m(kMachFloat32); | 5280 BufferedRawMachineAssemblerTester<float> m(MachineType::Float32()); |
| 5214 if (!m.machine()->Float32RoundTruncate().IsSupported()) return; | 5281 if (!m.machine()->Float32RoundTruncate().IsSupported()) return; |
| 5215 | 5282 |
| 5216 m.Return(m.Float32RoundTruncate(m.Parameter(0))); | 5283 m.Return(m.Float32RoundTruncate(m.Parameter(0))); |
| 5217 | 5284 |
| 5218 FOR_FLOAT32_INPUTS(i) { CheckFloatEq(truncf(*i), m.Call(*i)); } | 5285 FOR_FLOAT32_INPUTS(i) { CheckFloatEq(truncf(*i), m.Call(*i)); } |
| 5219 } | 5286 } |
| 5220 | 5287 |
| 5221 | 5288 |
| 5222 TEST(RunFloat64RoundTruncate) { | 5289 TEST(RunFloat64RoundTruncate) { |
| 5223 BufferedRawMachineAssemblerTester<double> m(kMachFloat64); | 5290 BufferedRawMachineAssemblerTester<double> m(MachineType::Float64()); |
| 5224 if (!m.machine()->Float64RoundTruncate().IsSupported()) return; | 5291 if (!m.machine()->Float64RoundTruncate().IsSupported()) return; |
| 5225 m.Return(m.Float64RoundTruncate(m.Parameter(0))); | 5292 m.Return(m.Float64RoundTruncate(m.Parameter(0))); |
| 5226 for (size_t i = 0; i < arraysize(kValues); ++i) { | 5293 for (size_t i = 0; i < arraysize(kValues); ++i) { |
| 5227 CHECK_EQ(trunc(kValues[i]), m.Call(kValues[i])); | 5294 CHECK_EQ(trunc(kValues[i]), m.Call(kValues[i])); |
| 5228 } | 5295 } |
| 5229 } | 5296 } |
| 5230 | 5297 |
| 5231 | 5298 |
| 5232 TEST(RunFloat64RoundTiesAway) { | 5299 TEST(RunFloat64RoundTiesAway) { |
| 5233 BufferedRawMachineAssemblerTester<double> m(kMachFloat64); | 5300 BufferedRawMachineAssemblerTester<double> m(MachineType::Float64()); |
| 5234 if (!m.machine()->Float64RoundTiesAway().IsSupported()) return; | 5301 if (!m.machine()->Float64RoundTiesAway().IsSupported()) return; |
| 5235 m.Return(m.Float64RoundTiesAway(m.Parameter(0))); | 5302 m.Return(m.Float64RoundTiesAway(m.Parameter(0))); |
| 5236 for (size_t i = 0; i < arraysize(kValues); ++i) { | 5303 for (size_t i = 0; i < arraysize(kValues); ++i) { |
| 5237 CHECK_EQ(round(kValues[i]), m.Call(kValues[i])); | 5304 CHECK_EQ(round(kValues[i]), m.Call(kValues[i])); |
| 5238 } | 5305 } |
| 5239 } | 5306 } |
| 5240 | 5307 |
| 5241 | 5308 |
| 5242 #if !USE_SIMULATOR | 5309 #if !USE_SIMULATOR |
| 5243 | 5310 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 5259 int32_t g, int32_t h) { | 5326 int32_t g, int32_t h) { |
| 5260 return a + b + c + d + e + f + g + h; | 5327 return a + b + c + d + e + f + g + h; |
| 5261 } | 5328 } |
| 5262 | 5329 |
| 5263 } // namespace | 5330 } // namespace |
| 5264 | 5331 |
| 5265 | 5332 |
| 5266 TEST(RunCallCFunction0) { | 5333 TEST(RunCallCFunction0) { |
| 5267 auto* foo0_ptr = &foo0; | 5334 auto* foo0_ptr = &foo0; |
| 5268 RawMachineAssemblerTester<int32_t> m; | 5335 RawMachineAssemblerTester<int32_t> m; |
| 5269 Node* function = m.LoadFromPointer(&foo0_ptr, kMachPtr); | 5336 Node* function = m.LoadFromPointer(&foo0_ptr, MachineType::Pointer()); |
| 5270 m.Return(m.CallCFunction0(kMachInt32, function)); | 5337 m.Return(m.CallCFunction0(MachineType::Int32(), function)); |
| 5271 CHECK_EQ(kMagicFoo0, m.Call()); | 5338 CHECK_EQ(kMagicFoo0, m.Call()); |
| 5272 } | 5339 } |
| 5273 | 5340 |
| 5274 | 5341 |
| 5275 TEST(RunCallCFunction1) { | 5342 TEST(RunCallCFunction1) { |
| 5276 auto* foo1_ptr = &foo1; | 5343 auto* foo1_ptr = &foo1; |
| 5277 RawMachineAssemblerTester<int32_t> m(kMachInt32); | 5344 RawMachineAssemblerTester<int32_t> m(MachineType::Int32()); |
| 5278 Node* function = m.LoadFromPointer(&foo1_ptr, kMachPtr); | 5345 Node* function = m.LoadFromPointer(&foo1_ptr, MachineType::Pointer()); |
| 5279 m.Return(m.CallCFunction1(kMachInt32, kMachInt32, function, m.Parameter(0))); | 5346 m.Return(m.CallCFunction1(MachineType::Int32(), MachineType::Int32(), |
| 5347 function, m.Parameter(0))); |
| 5280 FOR_INT32_INPUTS(i) { | 5348 FOR_INT32_INPUTS(i) { |
| 5281 int32_t const expected = *i; | 5349 int32_t const expected = *i; |
| 5282 CHECK_EQ(expected, m.Call(expected)); | 5350 CHECK_EQ(expected, m.Call(expected)); |
| 5283 } | 5351 } |
| 5284 } | 5352 } |
| 5285 | 5353 |
| 5286 | 5354 |
| 5287 TEST(RunCallCFunction2) { | 5355 TEST(RunCallCFunction2) { |
| 5288 auto* foo2_ptr = &foo2; | 5356 auto* foo2_ptr = &foo2; |
| 5289 RawMachineAssemblerTester<int32_t> m(kMachInt32, kMachInt32); | 5357 RawMachineAssemblerTester<int32_t> m(MachineType::Int32(), |
| 5290 Node* function = m.LoadFromPointer(&foo2_ptr, kMachPtr); | 5358 MachineType::Int32()); |
| 5291 m.Return(m.CallCFunction2(kMachInt32, kMachInt32, kMachInt32, function, | 5359 Node* function = m.LoadFromPointer(&foo2_ptr, MachineType::Pointer()); |
| 5292 m.Parameter(0), m.Parameter(1))); | 5360 m.Return(m.CallCFunction2(MachineType::Int32(), MachineType::Int32(), |
| 5361 MachineType::Int32(), function, m.Parameter(0), |
| 5362 m.Parameter(1))); |
| 5293 FOR_INT32_INPUTS(i) { | 5363 FOR_INT32_INPUTS(i) { |
| 5294 int32_t const x = *i; | 5364 int32_t const x = *i; |
| 5295 FOR_INT32_INPUTS(j) { | 5365 FOR_INT32_INPUTS(j) { |
| 5296 int32_t const y = *j; | 5366 int32_t const y = *j; |
| 5297 CHECK_EQ(x - y, m.Call(x, y)); | 5367 CHECK_EQ(x - y, m.Call(x, y)); |
| 5298 } | 5368 } |
| 5299 } | 5369 } |
| 5300 } | 5370 } |
| 5301 | 5371 |
| 5302 | 5372 |
| 5303 TEST(RunCallCFunction8) { | 5373 TEST(RunCallCFunction8) { |
| 5304 auto* foo8_ptr = &foo8; | 5374 auto* foo8_ptr = &foo8; |
| 5305 RawMachineAssemblerTester<int32_t> m(kMachInt32); | 5375 RawMachineAssemblerTester<int32_t> m(MachineType::Int32()); |
| 5306 Node* function = m.LoadFromPointer(&foo8_ptr, kMachPtr); | 5376 Node* function = m.LoadFromPointer(&foo8_ptr, MachineType::Pointer()); |
| 5307 Node* param = m.Parameter(0); | 5377 Node* param = m.Parameter(0); |
| 5308 m.Return(m.CallCFunction8(kMachInt32, kMachInt32, kMachInt32, kMachInt32, | 5378 m.Return(m.CallCFunction8( |
| 5309 kMachInt32, kMachInt32, kMachInt32, kMachInt32, | 5379 MachineType::Int32(), MachineType::Int32(), MachineType::Int32(), |
| 5310 kMachInt32, function, param, param, param, param, | 5380 MachineType::Int32(), MachineType::Int32(), MachineType::Int32(), |
| 5311 param, param, param, param)); | 5381 MachineType::Int32(), MachineType::Int32(), MachineType::Int32(), |
| 5382 function, param, param, param, param, param, param, param, param)); |
| 5312 FOR_INT32_INPUTS(i) { | 5383 FOR_INT32_INPUTS(i) { |
| 5313 int32_t const x = *i; | 5384 int32_t const x = *i; |
| 5314 CHECK_EQ(x * 8, m.Call(x)); | 5385 CHECK_EQ(x * 8, m.Call(x)); |
| 5315 } | 5386 } |
| 5316 } | 5387 } |
| 5317 #endif // USE_SIMULATOR | 5388 #endif // USE_SIMULATOR |
| 5318 | 5389 |
| 5319 #if V8_TARGET_ARCH_64_BIT | 5390 #if V8_TARGET_ARCH_64_BIT |
| 5320 // TODO(titzer): run int64 tests on all platforms when supported. | 5391 // TODO(titzer): run int64 tests on all platforms when supported. |
| 5321 TEST(RunCheckedLoadInt64) { | 5392 TEST(RunCheckedLoadInt64) { |
| 5322 int64_t buffer[] = {0x66bbccddeeff0011LL, 0x1122334455667788LL}; | 5393 int64_t buffer[] = {0x66bbccddeeff0011LL, 0x1122334455667788LL}; |
| 5323 RawMachineAssemblerTester<int64_t> m(kMachInt32); | 5394 RawMachineAssemblerTester<int64_t> m(MachineType::Int32()); |
| 5324 Node* base = m.PointerConstant(buffer); | 5395 Node* base = m.PointerConstant(buffer); |
| 5325 Node* index = m.Parameter(0); | 5396 Node* index = m.Parameter(0); |
| 5326 Node* length = m.Int32Constant(16); | 5397 Node* length = m.Int32Constant(16); |
| 5327 Node* load = | 5398 Node* load = m.AddNode(m.machine()->CheckedLoad(MachineType::Int64()), base, |
| 5328 m.AddNode(m.machine()->CheckedLoad(kMachInt64), base, index, length); | 5399 index, length); |
| 5329 m.Return(load); | 5400 m.Return(load); |
| 5330 | 5401 |
| 5331 CHECK_EQ(buffer[0], m.Call(0)); | 5402 CHECK_EQ(buffer[0], m.Call(0)); |
| 5332 CHECK_EQ(buffer[1], m.Call(8)); | 5403 CHECK_EQ(buffer[1], m.Call(8)); |
| 5333 CHECK_EQ(0, m.Call(16)); | 5404 CHECK_EQ(0, m.Call(16)); |
| 5334 } | 5405 } |
| 5335 | 5406 |
| 5336 | 5407 |
| 5337 TEST(RunCheckedStoreInt64) { | 5408 TEST(RunCheckedStoreInt64) { |
| 5338 const int64_t write = 0x5566778899aabbLL; | 5409 const int64_t write = 0x5566778899aabbLL; |
| 5339 const int64_t before = 0x33bbccddeeff0011LL; | 5410 const int64_t before = 0x33bbccddeeff0011LL; |
| 5340 int64_t buffer[] = {before, before}; | 5411 int64_t buffer[] = {before, before}; |
| 5341 RawMachineAssemblerTester<int32_t> m(kMachInt32); | 5412 RawMachineAssemblerTester<int32_t> m(MachineType::Int32()); |
| 5342 Node* base = m.PointerConstant(buffer); | 5413 Node* base = m.PointerConstant(buffer); |
| 5343 Node* index = m.Parameter(0); | 5414 Node* index = m.Parameter(0); |
| 5344 Node* length = m.Int32Constant(16); | 5415 Node* length = m.Int32Constant(16); |
| 5345 Node* value = m.Int64Constant(write); | 5416 Node* value = m.Int64Constant(write); |
| 5346 Node* store = m.AddNode(m.machine()->CheckedStore(kMachInt64), base, index, | 5417 Node* store = m.AddNode(m.machine()->CheckedStore(MachineType::Int64()), base, |
| 5347 length, value); | 5418 index, length, value); |
| 5348 USE(store); | 5419 USE(store); |
| 5349 m.Return(m.Int32Constant(11)); | 5420 m.Return(m.Int32Constant(11)); |
| 5350 | 5421 |
| 5351 CHECK_EQ(11, m.Call(16)); | 5422 CHECK_EQ(11, m.Call(16)); |
| 5352 CHECK_EQ(before, buffer[0]); | 5423 CHECK_EQ(before, buffer[0]); |
| 5353 CHECK_EQ(before, buffer[1]); | 5424 CHECK_EQ(before, buffer[1]); |
| 5354 | 5425 |
| 5355 CHECK_EQ(11, m.Call(0)); | 5426 CHECK_EQ(11, m.Call(0)); |
| 5356 CHECK_EQ(write, buffer[0]); | 5427 CHECK_EQ(write, buffer[0]); |
| 5357 CHECK_EQ(before, buffer[1]); | 5428 CHECK_EQ(before, buffer[1]); |
| 5358 | 5429 |
| 5359 CHECK_EQ(11, m.Call(8)); | 5430 CHECK_EQ(11, m.Call(8)); |
| 5360 CHECK_EQ(write, buffer[0]); | 5431 CHECK_EQ(write, buffer[0]); |
| 5361 CHECK_EQ(write, buffer[1]); | 5432 CHECK_EQ(write, buffer[1]); |
| 5362 } | 5433 } |
| 5363 | 5434 |
| 5364 | 5435 |
| 5365 TEST(RunBitcastInt64ToFloat64) { | 5436 TEST(RunBitcastInt64ToFloat64) { |
| 5366 int64_t input = 1; | 5437 int64_t input = 1; |
| 5367 double output = 0.0; | 5438 double output = 0.0; |
| 5368 RawMachineAssemblerTester<int32_t> m; | 5439 RawMachineAssemblerTester<int32_t> m; |
| 5369 m.StoreToPointer( | 5440 m.StoreToPointer( |
| 5370 &output, kMachFloat64, | 5441 &output, MachineType::Float64(), |
| 5371 m.BitcastInt64ToFloat64(m.LoadFromPointer(&input, kMachInt64))); | 5442 m.BitcastInt64ToFloat64(m.LoadFromPointer(&input, MachineType::Int64()))); |
| 5372 m.Return(m.Int32Constant(11)); | 5443 m.Return(m.Int32Constant(11)); |
| 5373 FOR_INT64_INPUTS(i) { | 5444 FOR_INT64_INPUTS(i) { |
| 5374 input = *i; | 5445 input = *i; |
| 5375 CHECK_EQ(11, m.Call()); | 5446 CHECK_EQ(11, m.Call()); |
| 5376 double expected = bit_cast<double>(input); | 5447 double expected = bit_cast<double>(input); |
| 5377 CHECK_EQ(bit_cast<int64_t>(expected), bit_cast<int64_t>(output)); | 5448 CHECK_EQ(bit_cast<int64_t>(expected), bit_cast<int64_t>(output)); |
| 5378 } | 5449 } |
| 5379 } | 5450 } |
| 5380 | 5451 |
| 5381 | 5452 |
| 5382 TEST(RunBitcastFloat64ToInt64) { | 5453 TEST(RunBitcastFloat64ToInt64) { |
| 5383 BufferedRawMachineAssemblerTester<int64_t> m(kMachFloat64); | 5454 BufferedRawMachineAssemblerTester<int64_t> m(MachineType::Float64()); |
| 5384 | 5455 |
| 5385 m.Return(m.BitcastFloat64ToInt64(m.Parameter(0))); | 5456 m.Return(m.BitcastFloat64ToInt64(m.Parameter(0))); |
| 5386 FOR_FLOAT64_INPUTS(i) { CHECK_EQ(bit_cast<int64_t>(*i), m.Call(*i)); } | 5457 FOR_FLOAT64_INPUTS(i) { CHECK_EQ(bit_cast<int64_t>(*i), m.Call(*i)); } |
| 5387 } | 5458 } |
| 5388 | 5459 |
| 5389 | 5460 |
| 5390 TEST(RunTryTruncateFloat32ToInt64WithoutCheck) { | 5461 TEST(RunTryTruncateFloat32ToInt64WithoutCheck) { |
| 5391 BufferedRawMachineAssemblerTester<int64_t> m(kMachFloat32); | 5462 BufferedRawMachineAssemblerTester<int64_t> m(MachineType::Float32()); |
| 5392 m.Return(m.TryTruncateFloat32ToInt64(m.Parameter(0))); | 5463 m.Return(m.TryTruncateFloat32ToInt64(m.Parameter(0))); |
| 5393 | 5464 |
| 5394 FOR_INT64_INPUTS(i) { | 5465 FOR_INT64_INPUTS(i) { |
| 5395 float input = static_cast<float>(*i); | 5466 float input = static_cast<float>(*i); |
| 5396 if (input < 9223372036854775808.0 && input > -9223372036854775809.0) { | 5467 if (input < 9223372036854775808.0 && input > -9223372036854775809.0) { |
| 5397 CHECK_EQ(static_cast<int64_t>(input), m.Call(input)); | 5468 CHECK_EQ(static_cast<int64_t>(input), m.Call(input)); |
| 5398 } | 5469 } |
| 5399 } | 5470 } |
| 5400 } | 5471 } |
| 5401 | 5472 |
| 5402 | 5473 |
| 5403 TEST(RunTryTruncateFloat32ToInt64WithCheck) { | 5474 TEST(RunTryTruncateFloat32ToInt64WithCheck) { |
| 5404 int64_t success = 0; | 5475 int64_t success = 0; |
| 5405 BufferedRawMachineAssemblerTester<int64_t> m(kMachFloat32); | 5476 BufferedRawMachineAssemblerTester<int64_t> m(MachineType::Float32()); |
| 5406 Node* trunc = m.TryTruncateFloat32ToInt64(m.Parameter(0)); | 5477 Node* trunc = m.TryTruncateFloat32ToInt64(m.Parameter(0)); |
| 5407 Node* val = m.Projection(0, trunc); | 5478 Node* val = m.Projection(0, trunc); |
| 5408 Node* check = m.Projection(1, trunc); | 5479 Node* check = m.Projection(1, trunc); |
| 5409 m.StoreToPointer(&success, kMachInt64, check); | 5480 m.StoreToPointer(&success, MachineType::Int64(), check); |
| 5410 m.Return(val); | 5481 m.Return(val); |
| 5411 | 5482 |
| 5412 FOR_FLOAT32_INPUTS(i) { | 5483 FOR_FLOAT32_INPUTS(i) { |
| 5413 if (*i < 9223372036854775808.0 && *i > -9223372036854775809.0) { | 5484 if (*i < 9223372036854775808.0 && *i > -9223372036854775809.0) { |
| 5414 CHECK_EQ(static_cast<int64_t>(*i), m.Call(*i)); | 5485 CHECK_EQ(static_cast<int64_t>(*i), m.Call(*i)); |
| 5415 CHECK_NE(0, success); | 5486 CHECK_NE(0, success); |
| 5416 } else { | 5487 } else { |
| 5417 m.Call(*i); | 5488 m.Call(*i); |
| 5418 CHECK_EQ(0, success); | 5489 CHECK_EQ(0, success); |
| 5419 } | 5490 } |
| 5420 } | 5491 } |
| 5421 } | 5492 } |
| 5422 | 5493 |
| 5423 | 5494 |
| 5424 TEST(RunTryTruncateFloat64ToInt64WithoutCheck) { | 5495 TEST(RunTryTruncateFloat64ToInt64WithoutCheck) { |
| 5425 BufferedRawMachineAssemblerTester<int64_t> m(kMachFloat64); | 5496 BufferedRawMachineAssemblerTester<int64_t> m(MachineType::Float64()); |
| 5426 m.Return(m.TryTruncateFloat64ToInt64(m.Parameter(0))); | 5497 m.Return(m.TryTruncateFloat64ToInt64(m.Parameter(0))); |
| 5427 | 5498 |
| 5428 FOR_INT64_INPUTS(i) { | 5499 FOR_INT64_INPUTS(i) { |
| 5429 double input = static_cast<double>(*i); | 5500 double input = static_cast<double>(*i); |
| 5430 CHECK_EQ(static_cast<int64_t>(input), m.Call(input)); | 5501 CHECK_EQ(static_cast<int64_t>(input), m.Call(input)); |
| 5431 } | 5502 } |
| 5432 } | 5503 } |
| 5433 | 5504 |
| 5434 | 5505 |
| 5435 TEST(RunTryTruncateFloat64ToInt64WithCheck) { | 5506 TEST(RunTryTruncateFloat64ToInt64WithCheck) { |
| 5436 int64_t success = 0; | 5507 int64_t success = 0; |
| 5437 BufferedRawMachineAssemblerTester<int64_t> m(kMachFloat64); | 5508 BufferedRawMachineAssemblerTester<int64_t> m(MachineType::Float64()); |
| 5438 Node* trunc = m.TryTruncateFloat64ToInt64(m.Parameter(0)); | 5509 Node* trunc = m.TryTruncateFloat64ToInt64(m.Parameter(0)); |
| 5439 Node* val = m.Projection(0, trunc); | 5510 Node* val = m.Projection(0, trunc); |
| 5440 Node* check = m.Projection(1, trunc); | 5511 Node* check = m.Projection(1, trunc); |
| 5441 m.StoreToPointer(&success, kMachInt64, check); | 5512 m.StoreToPointer(&success, MachineType::Int64(), check); |
| 5442 m.Return(val); | 5513 m.Return(val); |
| 5443 | 5514 |
| 5444 FOR_FLOAT64_INPUTS(i) { | 5515 FOR_FLOAT64_INPUTS(i) { |
| 5445 if (*i < 9223372036854775808.0 && *i > -9223372036854775809.0) { | 5516 if (*i < 9223372036854775808.0 && *i > -9223372036854775809.0) { |
| 5446 // Conversions within this range should succeed. | 5517 // Conversions within this range should succeed. |
| 5447 CHECK_EQ(static_cast<int64_t>(*i), m.Call(*i)); | 5518 CHECK_EQ(static_cast<int64_t>(*i), m.Call(*i)); |
| 5448 CHECK_NE(0, success); | 5519 CHECK_NE(0, success); |
| 5449 } else { | 5520 } else { |
| 5450 m.Call(*i); | 5521 m.Call(*i); |
| 5451 CHECK_EQ(0, success); | 5522 CHECK_EQ(0, success); |
| 5452 } | 5523 } |
| 5453 } | 5524 } |
| 5454 } | 5525 } |
| 5455 | 5526 |
| 5456 | 5527 |
| 5457 TEST(RunTruncateFloat32ToUint64) { | 5528 TEST(RunTruncateFloat32ToUint64) { |
| 5458 BufferedRawMachineAssemblerTester<uint64_t> m(kMachFloat32); | 5529 BufferedRawMachineAssemblerTester<uint64_t> m(MachineType::Float32()); |
| 5459 m.Return(m.TruncateFloat32ToUint64(m.Parameter(0))); | 5530 m.Return(m.TruncateFloat32ToUint64(m.Parameter(0))); |
| 5460 | 5531 |
| 5461 FOR_UINT64_INPUTS(i) { | 5532 FOR_UINT64_INPUTS(i) { |
| 5462 float input = static_cast<float>(*i); | 5533 float input = static_cast<float>(*i); |
| 5463 if (input < 18446744073709551616.0) { | 5534 if (input < 18446744073709551616.0) { |
| 5464 CHECK_EQ(static_cast<uint64_t>(input), m.Call(input)); | 5535 CHECK_EQ(static_cast<uint64_t>(input), m.Call(input)); |
| 5465 } | 5536 } |
| 5466 } | 5537 } |
| 5467 FOR_FLOAT32_INPUTS(j) { | 5538 FOR_FLOAT32_INPUTS(j) { |
| 5468 if (*j < 18446744073709551616.0 && *j >= 0) { | 5539 if (*j < 18446744073709551616.0 && *j >= 0) { |
| 5469 CHECK_EQ(static_cast<uint64_t>(*j), m.Call(*j)); | 5540 CHECK_EQ(static_cast<uint64_t>(*j), m.Call(*j)); |
| 5470 } | 5541 } |
| 5471 } | 5542 } |
| 5472 } | 5543 } |
| 5473 | 5544 |
| 5474 | 5545 |
| 5475 TEST(RunTryTruncateFloat64ToUint64WithoutCheck) { | 5546 TEST(RunTryTruncateFloat64ToUint64WithoutCheck) { |
| 5476 BufferedRawMachineAssemblerTester<uint64_t> m(kMachFloat64); | 5547 BufferedRawMachineAssemblerTester<uint64_t> m(MachineType::Float64()); |
| 5477 m.Return(m.TruncateFloat64ToUint64(m.Parameter(0))); | 5548 m.Return(m.TruncateFloat64ToUint64(m.Parameter(0))); |
| 5478 | 5549 |
| 5479 FOR_UINT64_INPUTS(j) { | 5550 FOR_UINT64_INPUTS(j) { |
| 5480 double input = static_cast<double>(*j); | 5551 double input = static_cast<double>(*j); |
| 5481 | 5552 |
| 5482 if (input < 18446744073709551616.0) { | 5553 if (input < 18446744073709551616.0) { |
| 5483 CHECK_EQ(static_cast<uint64_t>(input), m.Call(input)); | 5554 CHECK_EQ(static_cast<uint64_t>(input), m.Call(input)); |
| 5484 } | 5555 } |
| 5485 } | 5556 } |
| 5486 } | 5557 } |
| 5487 | 5558 |
| 5488 | 5559 |
| 5489 TEST(RunTryTruncateFloat64ToUint64WithCheck) { | 5560 TEST(RunTryTruncateFloat64ToUint64WithCheck) { |
| 5490 int64_t success = 0; | 5561 int64_t success = 0; |
| 5491 BufferedRawMachineAssemblerTester<int64_t> m(kMachFloat64); | 5562 BufferedRawMachineAssemblerTester<int64_t> m(MachineType::Float64()); |
| 5492 Node* trunc = m.TryTruncateFloat64ToUint64(m.Parameter(0)); | 5563 Node* trunc = m.TryTruncateFloat64ToUint64(m.Parameter(0)); |
| 5493 Node* val = m.Projection(0, trunc); | 5564 Node* val = m.Projection(0, trunc); |
| 5494 Node* check = m.Projection(1, trunc); | 5565 Node* check = m.Projection(1, trunc); |
| 5495 m.StoreToPointer(&success, kMachInt64, check); | 5566 m.StoreToPointer(&success, MachineType::Int64(), check); |
| 5496 m.Return(val); | 5567 m.Return(val); |
| 5497 | 5568 |
| 5498 FOR_FLOAT64_INPUTS(i) { | 5569 FOR_FLOAT64_INPUTS(i) { |
| 5499 if (*i < 18446744073709551616.0 && *i >= 0) { | 5570 if (*i < 18446744073709551616.0 && *i >= 0) { |
| 5500 // Conversions within this range should succeed. | 5571 // Conversions within this range should succeed. |
| 5501 CHECK_EQ(static_cast<uint64_t>(*i), m.Call(*i)); | 5572 CHECK_EQ(static_cast<uint64_t>(*i), m.Call(*i)); |
| 5502 CHECK_NE(0, success); | 5573 CHECK_NE(0, success); |
| 5503 } else { | 5574 } else { |
| 5504 m.Call(*i); | 5575 m.Call(*i); |
| 5505 CHECK_EQ(0, success); | 5576 CHECK_EQ(0, success); |
| 5506 } | 5577 } |
| 5507 } | 5578 } |
| 5508 } | 5579 } |
| 5509 | 5580 |
| 5510 | 5581 |
| 5511 TEST(RunRoundInt64ToFloat32) { | 5582 TEST(RunRoundInt64ToFloat32) { |
| 5512 BufferedRawMachineAssemblerTester<float> m(kMachInt64); | 5583 BufferedRawMachineAssemblerTester<float> m(MachineType::Int64()); |
| 5513 m.Return(m.RoundInt64ToFloat32(m.Parameter(0))); | 5584 m.Return(m.RoundInt64ToFloat32(m.Parameter(0))); |
| 5514 FOR_INT64_INPUTS(i) { CHECK_EQ(static_cast<float>(*i), m.Call(*i)); } | 5585 FOR_INT64_INPUTS(i) { CHECK_EQ(static_cast<float>(*i), m.Call(*i)); } |
| 5515 } | 5586 } |
| 5516 | 5587 |
| 5517 | 5588 |
| 5518 TEST(RunRoundInt64ToFloat64) { | 5589 TEST(RunRoundInt64ToFloat64) { |
| 5519 BufferedRawMachineAssemblerTester<double> m(kMachInt64); | 5590 BufferedRawMachineAssemblerTester<double> m(MachineType::Int64()); |
| 5520 m.Return(m.RoundInt64ToFloat64(m.Parameter(0))); | 5591 m.Return(m.RoundInt64ToFloat64(m.Parameter(0))); |
| 5521 FOR_INT64_INPUTS(i) { CHECK_EQ(static_cast<double>(*i), m.Call(*i)); } | 5592 FOR_INT64_INPUTS(i) { CHECK_EQ(static_cast<double>(*i), m.Call(*i)); } |
| 5522 } | 5593 } |
| 5523 | 5594 |
| 5524 | 5595 |
| 5525 TEST(RunRoundUint64ToFloat64) { | 5596 TEST(RunRoundUint64ToFloat64) { |
| 5526 struct { | 5597 struct { |
| 5527 uint64_t input; | 5598 uint64_t input; |
| 5528 uint64_t expected; | 5599 uint64_t expected; |
| 5529 } values[] = {{0x0, 0x0}, | 5600 } values[] = {{0x0, 0x0}, |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5595 {0x1fffffffffff, 0x42bfffffffffff00}, | 5666 {0x1fffffffffff, 0x42bfffffffffff00}, |
| 5596 {0xfffffffffff, 0x42affffffffffe00}, | 5667 {0xfffffffffff, 0x42affffffffffe00}, |
| 5597 {0x7ffffffffff, 0x429ffffffffffc00}, | 5668 {0x7ffffffffff, 0x429ffffffffffc00}, |
| 5598 {0x3ffffffffff, 0x428ffffffffff800}, | 5669 {0x3ffffffffff, 0x428ffffffffff800}, |
| 5599 {0x1ffffffffff, 0x427ffffffffff000}, | 5670 {0x1ffffffffff, 0x427ffffffffff000}, |
| 5600 {0x8000008000000000, 0x43e0000010000000}, | 5671 {0x8000008000000000, 0x43e0000010000000}, |
| 5601 {0x8000008000000001, 0x43e0000010000000}, | 5672 {0x8000008000000001, 0x43e0000010000000}, |
| 5602 {0x8000000000000400, 0x43e0000000000000}, | 5673 {0x8000000000000400, 0x43e0000000000000}, |
| 5603 {0x8000000000000401, 0x43e0000000000001}}; | 5674 {0x8000000000000401, 0x43e0000000000001}}; |
| 5604 | 5675 |
| 5605 BufferedRawMachineAssemblerTester<double> m(kMachUint64); | 5676 BufferedRawMachineAssemblerTester<double> m(MachineType::Uint64()); |
| 5606 m.Return(m.RoundUint64ToFloat64(m.Parameter(0))); | 5677 m.Return(m.RoundUint64ToFloat64(m.Parameter(0))); |
| 5607 | 5678 |
| 5608 for (size_t i = 0; i < arraysize(values); i++) { | 5679 for (size_t i = 0; i < arraysize(values); i++) { |
| 5609 CHECK_EQ(bit_cast<double>(values[i].expected), m.Call(values[i].input)); | 5680 CHECK_EQ(bit_cast<double>(values[i].expected), m.Call(values[i].input)); |
| 5610 } | 5681 } |
| 5611 } | 5682 } |
| 5612 | 5683 |
| 5613 | 5684 |
| 5614 TEST(RunRoundUint64ToFloat32) { | 5685 TEST(RunRoundUint64ToFloat32) { |
| 5615 struct { | 5686 struct { |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5685 {0x1fffffffffff, 0x56000000}, | 5756 {0x1fffffffffff, 0x56000000}, |
| 5686 {0xfffffffffff, 0x55800000}, | 5757 {0xfffffffffff, 0x55800000}, |
| 5687 {0x7ffffffffff, 0x55000000}, | 5758 {0x7ffffffffff, 0x55000000}, |
| 5688 {0x3ffffffffff, 0x54800000}, | 5759 {0x3ffffffffff, 0x54800000}, |
| 5689 {0x1ffffffffff, 0x54000000}, | 5760 {0x1ffffffffff, 0x54000000}, |
| 5690 {0x8000008000000000, 0x5f000000}, | 5761 {0x8000008000000000, 0x5f000000}, |
| 5691 {0x8000008000000001, 0x5f000001}, | 5762 {0x8000008000000001, 0x5f000001}, |
| 5692 {0x8000000000000400, 0x5f000000}, | 5763 {0x8000000000000400, 0x5f000000}, |
| 5693 {0x8000000000000401, 0x5f000000}}; | 5764 {0x8000000000000401, 0x5f000000}}; |
| 5694 | 5765 |
| 5695 BufferedRawMachineAssemblerTester<float> m(kMachUint64); | 5766 BufferedRawMachineAssemblerTester<float> m(MachineType::Uint64()); |
| 5696 m.Return(m.RoundUint64ToFloat32(m.Parameter(0))); | 5767 m.Return(m.RoundUint64ToFloat32(m.Parameter(0))); |
| 5697 | 5768 |
| 5698 for (size_t i = 0; i < arraysize(values); i++) { | 5769 for (size_t i = 0; i < arraysize(values); i++) { |
| 5699 CHECK_EQ(bit_cast<float>(values[i].expected), m.Call(values[i].input)); | 5770 CHECK_EQ(bit_cast<float>(values[i].expected), m.Call(values[i].input)); |
| 5700 } | 5771 } |
| 5701 } | 5772 } |
| 5702 | 5773 |
| 5703 | 5774 |
| 5704 #endif | 5775 #endif |
| 5705 | 5776 |
| 5706 | 5777 |
| 5707 TEST(RunBitcastFloat32ToInt32) { | 5778 TEST(RunBitcastFloat32ToInt32) { |
| 5708 float input = 32.25; | 5779 float input = 32.25; |
| 5709 RawMachineAssemblerTester<int32_t> m; | 5780 RawMachineAssemblerTester<int32_t> m; |
| 5710 m.Return(m.BitcastFloat32ToInt32(m.LoadFromPointer(&input, kMachFloat32))); | 5781 m.Return(m.BitcastFloat32ToInt32( |
| 5782 m.LoadFromPointer(&input, MachineType::Float32()))); |
| 5711 FOR_FLOAT32_INPUTS(i) { | 5783 FOR_FLOAT32_INPUTS(i) { |
| 5712 input = *i; | 5784 input = *i; |
| 5713 int32_t expected = bit_cast<int32_t>(input); | 5785 int32_t expected = bit_cast<int32_t>(input); |
| 5714 CHECK_EQ(expected, m.Call()); | 5786 CHECK_EQ(expected, m.Call()); |
| 5715 } | 5787 } |
| 5716 } | 5788 } |
| 5717 | 5789 |
| 5718 | 5790 |
| 5719 TEST(RunBitcastInt32ToFloat32) { | 5791 TEST(RunBitcastInt32ToFloat32) { |
| 5720 int32_t input = 1; | 5792 int32_t input = 1; |
| 5721 float output = 0.0; | 5793 float output = 0.0; |
| 5722 RawMachineAssemblerTester<int32_t> m; | 5794 RawMachineAssemblerTester<int32_t> m; |
| 5723 m.StoreToPointer( | 5795 m.StoreToPointer( |
| 5724 &output, kMachFloat32, | 5796 &output, MachineType::Float32(), |
| 5725 m.BitcastInt32ToFloat32(m.LoadFromPointer(&input, kMachInt32))); | 5797 m.BitcastInt32ToFloat32(m.LoadFromPointer(&input, MachineType::Int32()))); |
| 5726 m.Return(m.Int32Constant(11)); | 5798 m.Return(m.Int32Constant(11)); |
| 5727 FOR_INT32_INPUTS(i) { | 5799 FOR_INT32_INPUTS(i) { |
| 5728 input = *i; | 5800 input = *i; |
| 5729 CHECK_EQ(11, m.Call()); | 5801 CHECK_EQ(11, m.Call()); |
| 5730 float expected = bit_cast<float>(input); | 5802 float expected = bit_cast<float>(input); |
| 5731 CHECK_EQ(bit_cast<int32_t>(expected), bit_cast<int32_t>(output)); | 5803 CHECK_EQ(bit_cast<int32_t>(expected), bit_cast<int32_t>(output)); |
| 5732 } | 5804 } |
| 5733 } | 5805 } |
| 5734 | 5806 |
| 5735 | 5807 |
| 5736 TEST(RunComputedCodeObject) { | 5808 TEST(RunComputedCodeObject) { |
| 5737 GraphBuilderTester<int32_t> a; | 5809 GraphBuilderTester<int32_t> a; |
| 5738 a.Return(a.Int32Constant(33)); | 5810 a.Return(a.Int32Constant(33)); |
| 5739 a.End(); | 5811 a.End(); |
| 5740 Handle<Code> code_a = a.GetCode(); | 5812 Handle<Code> code_a = a.GetCode(); |
| 5741 | 5813 |
| 5742 GraphBuilderTester<int32_t> b; | 5814 GraphBuilderTester<int32_t> b; |
| 5743 b.Return(b.Int32Constant(44)); | 5815 b.Return(b.Int32Constant(44)); |
| 5744 b.End(); | 5816 b.End(); |
| 5745 Handle<Code> code_b = b.GetCode(); | 5817 Handle<Code> code_b = b.GetCode(); |
| 5746 | 5818 |
| 5747 RawMachineAssemblerTester<int32_t> r(kMachInt32); | 5819 RawMachineAssemblerTester<int32_t> r(MachineType::Int32()); |
| 5748 RawMachineLabel tlabel; | 5820 RawMachineLabel tlabel; |
| 5749 RawMachineLabel flabel; | 5821 RawMachineLabel flabel; |
| 5750 RawMachineLabel merge; | 5822 RawMachineLabel merge; |
| 5751 r.Branch(r.Parameter(0), &tlabel, &flabel); | 5823 r.Branch(r.Parameter(0), &tlabel, &flabel); |
| 5752 r.Bind(&tlabel); | 5824 r.Bind(&tlabel); |
| 5753 Node* fa = r.HeapConstant(code_a); | 5825 Node* fa = r.HeapConstant(code_a); |
| 5754 r.Goto(&merge); | 5826 r.Goto(&merge); |
| 5755 r.Bind(&flabel); | 5827 r.Bind(&flabel); |
| 5756 Node* fb = r.HeapConstant(code_b); | 5828 Node* fb = r.HeapConstant(code_b); |
| 5757 r.Goto(&merge); | 5829 r.Goto(&merge); |
| 5758 r.Bind(&merge); | 5830 r.Bind(&merge); |
| 5759 Node* phi = r.Phi(kMachInt32, fa, fb); | 5831 Node* phi = r.Phi(MachineRepresentation::kWord32, fa, fb); |
| 5760 | 5832 |
| 5761 // TODO(titzer): all this descriptor hackery is just to call the above | 5833 // TODO(titzer): all this descriptor hackery is just to call the above |
| 5762 // functions as code objects instead of direct addresses. | 5834 // functions as code objects instead of direct addresses. |
| 5763 CSignature0<int32_t> sig; | 5835 CSignature0<int32_t> sig; |
| 5764 CallDescriptor* c = Linkage::GetSimplifiedCDescriptor(r.zone(), &sig); | 5836 CallDescriptor* c = Linkage::GetSimplifiedCDescriptor(r.zone(), &sig); |
| 5765 LinkageLocation ret[] = {c->GetReturnLocation(0)}; | 5837 LinkageLocation ret[] = {c->GetReturnLocation(0)}; |
| 5766 Signature<LinkageLocation> loc(1, 0, ret); | 5838 Signature<LinkageLocation> loc(1, 0, ret); |
| 5767 CallDescriptor* desc = new (r.zone()) CallDescriptor( // -- | 5839 CallDescriptor* desc = new (r.zone()) CallDescriptor( // -- |
| 5768 CallDescriptor::kCallCodeObject, // kind | 5840 CallDescriptor::kCallCodeObject, // kind |
| 5769 kMachAnyTagged, // target_type | 5841 MachineType::AnyTagged(), // target_type |
| 5770 c->GetInputLocation(0), // target_loc | 5842 c->GetInputLocation(0), // target_loc |
| 5771 &sig, // machine_sig | 5843 &sig, // machine_sig |
| 5772 &loc, // location_sig | 5844 &loc, // location_sig |
| 5773 0, // stack count | 5845 0, // stack count |
| 5774 Operator::kNoProperties, // properties | 5846 Operator::kNoProperties, // properties |
| 5775 c->CalleeSavedRegisters(), // callee saved | 5847 c->CalleeSavedRegisters(), // callee saved |
| 5776 c->CalleeSavedFPRegisters(), // callee saved FP | 5848 c->CalleeSavedFPRegisters(), // callee saved FP |
| 5777 CallDescriptor::kNoFlags, // flags | 5849 CallDescriptor::kNoFlags, // flags |
| 5778 "c-call-as-code"); | 5850 "c-call-as-code"); |
| 5779 Node* call = r.AddNode(r.common()->Call(desc), phi); | 5851 Node* call = r.AddNode(r.common()->Call(desc), phi); |
| 5780 r.Return(call); | 5852 r.Return(call); |
| 5781 | 5853 |
| 5782 CHECK_EQ(33, r.Call(1)); | 5854 CHECK_EQ(33, r.Call(1)); |
| 5783 CHECK_EQ(44, r.Call(0)); | 5855 CHECK_EQ(44, r.Call(0)); |
| 5784 } | 5856 } |
| 5785 | 5857 |
| 5786 } // namespace compiler | 5858 } // namespace compiler |
| 5787 } // namespace internal | 5859 } // namespace internal |
| 5788 } // namespace v8 | 5860 } // namespace v8 |
| OLD | NEW |