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/ieee754.h" | 10 #include "src/base/ieee754.h" |
(...skipping 4153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4164 TEST(RunInt32PairAddUseOnlyHighWord) { | 4164 TEST(RunInt32PairAddUseOnlyHighWord) { |
4165 BufferedRawMachineAssemblerTester<int32_t> m( | 4165 BufferedRawMachineAssemblerTester<int32_t> m( |
4166 MachineType::Uint32(), MachineType::Uint32(), MachineType::Uint32(), | 4166 MachineType::Uint32(), MachineType::Uint32(), MachineType::Uint32(), |
4167 MachineType::Uint32()); | 4167 MachineType::Uint32()); |
4168 | 4168 |
4169 m.Return(m.Projection(1, m.Int32PairAdd(m.Parameter(0), m.Parameter(1), | 4169 m.Return(m.Projection(1, m.Int32PairAdd(m.Parameter(0), m.Parameter(1), |
4170 m.Parameter(2), m.Parameter(3)))); | 4170 m.Parameter(2), m.Parameter(3)))); |
4171 | 4171 |
4172 FOR_UINT64_INPUTS(i) { | 4172 FOR_UINT64_INPUTS(i) { |
4173 FOR_UINT64_INPUTS(j) { | 4173 FOR_UINT64_INPUTS(j) { |
4174 CHECK_EQ(static_cast<uint32_t>((*i + *j) >> 32), | 4174 CHECK_EQ( |
4175 m.Call(static_cast<uint32_t>(*i & 0xffffffff), | 4175 static_cast<uint32_t>((*i + *j) >> 32), |
4176 static_cast<uint32_t>(*i >> 32), | 4176 static_cast<uint32_t>(m.Call(static_cast<uint32_t>(*i & 0xffffffff), |
4177 static_cast<uint32_t>(*j & 0xffffffff), | 4177 static_cast<uint32_t>(*i >> 32), |
4178 static_cast<uint32_t>(*j >> 32))); | 4178 static_cast<uint32_t>(*j & 0xffffffff), |
| 4179 static_cast<uint32_t>(*j >> 32)))); |
4179 } | 4180 } |
4180 } | 4181 } |
4181 } | 4182 } |
4182 | 4183 |
4183 void TestInt32PairAddWithSharedInput(int a, int b, int c, int d) { | 4184 void TestInt32PairAddWithSharedInput(int a, int b, int c, int d) { |
4184 BufferedRawMachineAssemblerTester<int32_t> m(MachineType::Uint32(), | 4185 BufferedRawMachineAssemblerTester<int32_t> m(MachineType::Uint32(), |
4185 MachineType::Uint32()); | 4186 MachineType::Uint32()); |
4186 | 4187 |
4187 uint32_t high; | 4188 uint32_t high; |
4188 uint32_t low; | 4189 uint32_t low; |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4246 TEST(RunInt32PairSubUseOnlyHighWord) { | 4247 TEST(RunInt32PairSubUseOnlyHighWord) { |
4247 BufferedRawMachineAssemblerTester<int32_t> m( | 4248 BufferedRawMachineAssemblerTester<int32_t> m( |
4248 MachineType::Uint32(), MachineType::Uint32(), MachineType::Uint32(), | 4249 MachineType::Uint32(), MachineType::Uint32(), MachineType::Uint32(), |
4249 MachineType::Uint32()); | 4250 MachineType::Uint32()); |
4250 | 4251 |
4251 m.Return(m.Projection(1, m.Int32PairSub(m.Parameter(0), m.Parameter(1), | 4252 m.Return(m.Projection(1, m.Int32PairSub(m.Parameter(0), m.Parameter(1), |
4252 m.Parameter(2), m.Parameter(3)))); | 4253 m.Parameter(2), m.Parameter(3)))); |
4253 | 4254 |
4254 FOR_UINT64_INPUTS(i) { | 4255 FOR_UINT64_INPUTS(i) { |
4255 FOR_UINT64_INPUTS(j) { | 4256 FOR_UINT64_INPUTS(j) { |
4256 CHECK_EQ(static_cast<uint32_t>((*i - *j) >> 32), | 4257 CHECK_EQ( |
4257 m.Call(static_cast<uint32_t>(*i & 0xffffffff), | 4258 static_cast<uint32_t>((*i - *j) >> 32), |
4258 static_cast<uint32_t>(*i >> 32), | 4259 static_cast<uint32_t>(m.Call(static_cast<uint32_t>(*i & 0xffffffff), |
4259 static_cast<uint32_t>(*j & 0xffffffff), | 4260 static_cast<uint32_t>(*i >> 32), |
4260 static_cast<uint32_t>(*j >> 32))); | 4261 static_cast<uint32_t>(*j & 0xffffffff), |
| 4262 static_cast<uint32_t>(*j >> 32)))); |
4261 } | 4263 } |
4262 } | 4264 } |
4263 } | 4265 } |
4264 | 4266 |
4265 void TestInt32PairSubWithSharedInput(int a, int b, int c, int d) { | 4267 void TestInt32PairSubWithSharedInput(int a, int b, int c, int d) { |
4266 BufferedRawMachineAssemblerTester<int32_t> m(MachineType::Uint32(), | 4268 BufferedRawMachineAssemblerTester<int32_t> m(MachineType::Uint32(), |
4267 MachineType::Uint32()); | 4269 MachineType::Uint32()); |
4268 | 4270 |
4269 uint32_t high; | 4271 uint32_t high; |
4270 uint32_t low; | 4272 uint32_t low; |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4328 TEST(RunInt32PairMulUseOnlyHighWord) { | 4330 TEST(RunInt32PairMulUseOnlyHighWord) { |
4329 BufferedRawMachineAssemblerTester<int32_t> m( | 4331 BufferedRawMachineAssemblerTester<int32_t> m( |
4330 MachineType::Uint32(), MachineType::Uint32(), MachineType::Uint32(), | 4332 MachineType::Uint32(), MachineType::Uint32(), MachineType::Uint32(), |
4331 MachineType::Uint32()); | 4333 MachineType::Uint32()); |
4332 | 4334 |
4333 m.Return(m.Projection(1, m.Int32PairMul(m.Parameter(0), m.Parameter(1), | 4335 m.Return(m.Projection(1, m.Int32PairMul(m.Parameter(0), m.Parameter(1), |
4334 m.Parameter(2), m.Parameter(3)))); | 4336 m.Parameter(2), m.Parameter(3)))); |
4335 | 4337 |
4336 FOR_UINT64_INPUTS(i) { | 4338 FOR_UINT64_INPUTS(i) { |
4337 FOR_UINT64_INPUTS(j) { | 4339 FOR_UINT64_INPUTS(j) { |
4338 CHECK_EQ(static_cast<uint32_t>((*i * *j) >> 32), | 4340 CHECK_EQ( |
4339 m.Call(static_cast<uint32_t>(*i & 0xffffffff), | 4341 static_cast<uint32_t>((*i * *j) >> 32), |
4340 static_cast<uint32_t>(*i >> 32), | 4342 static_cast<uint32_t>(m.Call(static_cast<uint32_t>(*i & 0xffffffff), |
4341 static_cast<uint32_t>(*j & 0xffffffff), | 4343 static_cast<uint32_t>(*i >> 32), |
4342 static_cast<uint32_t>(*j >> 32))); | 4344 static_cast<uint32_t>(*j & 0xffffffff), |
| 4345 static_cast<uint32_t>(*j >> 32)))); |
4343 } | 4346 } |
4344 } | 4347 } |
4345 } | 4348 } |
4346 | 4349 |
4347 void TestInt32PairMulWithSharedInput(int a, int b, int c, int d) { | 4350 void TestInt32PairMulWithSharedInput(int a, int b, int c, int d) { |
4348 BufferedRawMachineAssemblerTester<int32_t> m(MachineType::Uint32(), | 4351 BufferedRawMachineAssemblerTester<int32_t> m(MachineType::Uint32(), |
4349 MachineType::Uint32()); | 4352 MachineType::Uint32()); |
4350 | 4353 |
4351 uint32_t high; | 4354 uint32_t high; |
4352 uint32_t low; | 4355 uint32_t low; |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4407 | 4410 |
4408 TEST(RunWord32PairShlUseOnlyHighWord) { | 4411 TEST(RunWord32PairShlUseOnlyHighWord) { |
4409 BufferedRawMachineAssemblerTester<int32_t> m( | 4412 BufferedRawMachineAssemblerTester<int32_t> m( |
4410 MachineType::Uint32(), MachineType::Uint32(), MachineType::Uint32()); | 4413 MachineType::Uint32(), MachineType::Uint32(), MachineType::Uint32()); |
4411 | 4414 |
4412 m.Return(m.Projection( | 4415 m.Return(m.Projection( |
4413 1, m.Word32PairShl(m.Parameter(0), m.Parameter(1), m.Parameter(2)))); | 4416 1, m.Word32PairShl(m.Parameter(0), m.Parameter(1), m.Parameter(2)))); |
4414 | 4417 |
4415 FOR_UINT64_INPUTS(i) { | 4418 FOR_UINT64_INPUTS(i) { |
4416 for (uint32_t j = 0; j < 64; j++) { | 4419 for (uint32_t j = 0; j < 64; j++) { |
4417 CHECK_EQ(static_cast<uint32_t>((*i << j) >> 32), | 4420 CHECK_EQ( |
4418 m.Call(static_cast<uint32_t>(*i & 0xffffffff), | 4421 static_cast<uint32_t>((*i << j) >> 32), |
4419 static_cast<uint32_t>(*i >> 32), j)); | 4422 static_cast<uint32_t>(m.Call(static_cast<uint32_t>(*i & 0xffffffff), |
| 4423 static_cast<uint32_t>(*i >> 32), j))); |
4420 } | 4424 } |
4421 } | 4425 } |
4422 } | 4426 } |
4423 | 4427 |
4424 void TestWord32PairShlWithSharedInput(int a, int b) { | 4428 void TestWord32PairShlWithSharedInput(int a, int b) { |
4425 BufferedRawMachineAssemblerTester<int32_t> m(MachineType::Uint32(), | 4429 BufferedRawMachineAssemblerTester<int32_t> m(MachineType::Uint32(), |
4426 MachineType::Uint32()); | 4430 MachineType::Uint32()); |
4427 | 4431 |
4428 uint32_t high; | 4432 uint32_t high; |
4429 uint32_t low; | 4433 uint32_t low; |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4480 | 4484 |
4481 TEST(RunWord32PairShrUseOnlyHighWord) { | 4485 TEST(RunWord32PairShrUseOnlyHighWord) { |
4482 BufferedRawMachineAssemblerTester<int32_t> m( | 4486 BufferedRawMachineAssemblerTester<int32_t> m( |
4483 MachineType::Uint32(), MachineType::Uint32(), MachineType::Uint32()); | 4487 MachineType::Uint32(), MachineType::Uint32(), MachineType::Uint32()); |
4484 | 4488 |
4485 m.Return(m.Projection( | 4489 m.Return(m.Projection( |
4486 1, m.Word32PairShr(m.Parameter(0), m.Parameter(1), m.Parameter(2)))); | 4490 1, m.Word32PairShr(m.Parameter(0), m.Parameter(1), m.Parameter(2)))); |
4487 | 4491 |
4488 FOR_UINT64_INPUTS(i) { | 4492 FOR_UINT64_INPUTS(i) { |
4489 for (uint32_t j = 0; j < 64; j++) { | 4493 for (uint32_t j = 0; j < 64; j++) { |
4490 CHECK_EQ(static_cast<uint32_t>((*i >> j) >> 32), | 4494 CHECK_EQ( |
4491 m.Call(static_cast<uint32_t>(*i & 0xffffffff), | 4495 static_cast<uint32_t>((*i >> j) >> 32), |
4492 static_cast<uint32_t>(*i >> 32), j)); | 4496 static_cast<uint32_t>(m.Call(static_cast<uint32_t>(*i & 0xffffffff), |
| 4497 static_cast<uint32_t>(*i >> 32), j))); |
4493 } | 4498 } |
4494 } | 4499 } |
4495 } | 4500 } |
4496 | 4501 |
4497 TEST(RunWord32PairSar) { | 4502 TEST(RunWord32PairSar) { |
4498 BufferedRawMachineAssemblerTester<int32_t> m( | 4503 BufferedRawMachineAssemblerTester<int32_t> m( |
4499 MachineType::Uint32(), MachineType::Uint32(), MachineType::Uint32()); | 4504 MachineType::Uint32(), MachineType::Uint32(), MachineType::Uint32()); |
4500 | 4505 |
4501 uint32_t high; | 4506 uint32_t high; |
4502 uint32_t low; | 4507 uint32_t low; |
4503 | 4508 |
4504 Node* PairAdd = | 4509 Node* PairAdd = |
4505 m.Word32PairSar(m.Parameter(0), m.Parameter(1), m.Parameter(2)); | 4510 m.Word32PairSar(m.Parameter(0), m.Parameter(1), m.Parameter(2)); |
4506 | 4511 |
4507 m.StoreToPointer(&low, MachineRepresentation::kWord32, | 4512 m.StoreToPointer(&low, MachineRepresentation::kWord32, |
4508 m.Projection(0, PairAdd)); | 4513 m.Projection(0, PairAdd)); |
4509 m.StoreToPointer(&high, MachineRepresentation::kWord32, | 4514 m.StoreToPointer(&high, MachineRepresentation::kWord32, |
4510 m.Projection(1, PairAdd)); | 4515 m.Projection(1, PairAdd)); |
4511 m.Return(m.Int32Constant(74)); | 4516 m.Return(m.Int32Constant(74)); |
4512 | 4517 |
4513 FOR_INT64_INPUTS(i) { | 4518 FOR_INT64_INPUTS(i) { |
4514 for (uint32_t j = 0; j < 64; j++) { | 4519 for (uint32_t j = 0; j < 64; j++) { |
4515 m.Call(static_cast<uint32_t>(*i & 0xffffffff), | 4520 m.Call(static_cast<uint32_t>(*i & 0xffffffff), |
4516 static_cast<uint32_t>(*i >> 32), j); | 4521 static_cast<uint32_t>(*i >> 32), j); |
4517 CHECK_EQ(*i >> j, ToInt64(low, high)); | 4522 CHECK_EQ(*i >> j, static_cast<int64_t>(ToInt64(low, high))); |
4518 } | 4523 } |
4519 } | 4524 } |
4520 } | 4525 } |
4521 | 4526 |
4522 TEST(RunWord32PairSarUseOnlyHighWord) { | 4527 TEST(RunWord32PairSarUseOnlyHighWord) { |
4523 BufferedRawMachineAssemblerTester<int32_t> m( | 4528 BufferedRawMachineAssemblerTester<int32_t> m( |
4524 MachineType::Uint32(), MachineType::Uint32(), MachineType::Uint32()); | 4529 MachineType::Uint32(), MachineType::Uint32(), MachineType::Uint32()); |
4525 | 4530 |
4526 m.Return(m.Projection( | 4531 m.Return(m.Projection( |
4527 1, m.Word32PairSar(m.Parameter(0), m.Parameter(1), m.Parameter(2)))); | 4532 1, m.Word32PairSar(m.Parameter(0), m.Parameter(1), m.Parameter(2)))); |
4528 | 4533 |
4529 FOR_INT64_INPUTS(i) { | 4534 FOR_INT64_INPUTS(i) { |
4530 for (uint32_t j = 0; j < 64; j++) { | 4535 for (uint32_t j = 0; j < 64; j++) { |
4531 CHECK_EQ(static_cast<uint32_t>((*i >> j) >> 32), | 4536 CHECK_EQ( |
4532 m.Call(static_cast<uint32_t>(*i & 0xffffffff), | 4537 static_cast<uint32_t>((*i >> j) >> 32), |
4533 static_cast<uint32_t>(*i >> 32), j)); | 4538 static_cast<uint32_t>(m.Call(static_cast<uint32_t>(*i & 0xffffffff), |
| 4539 static_cast<uint32_t>(*i >> 32), j))); |
4534 } | 4540 } |
4535 } | 4541 } |
4536 } | 4542 } |
4537 #endif | 4543 #endif |
4538 | 4544 |
4539 TEST(RunDeadChangeFloat64ToInt32) { | 4545 TEST(RunDeadChangeFloat64ToInt32) { |
4540 RawMachineAssemblerTester<int32_t> m; | 4546 RawMachineAssemblerTester<int32_t> m; |
4541 const int magic = 0x88abcda4; | 4547 const int magic = 0x88abcda4; |
4542 m.ChangeFloat64ToInt32(m.Float64Constant(999.78)); | 4548 m.ChangeFloat64ToInt32(m.Float64Constant(999.78)); |
4543 m.Return(m.Int32Constant(magic)); | 4549 m.Return(m.Int32Constant(magic)); |
(...skipping 2131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6675 r.Goto(&merge); | 6681 r.Goto(&merge); |
6676 r.Bind(&merge); | 6682 r.Bind(&merge); |
6677 Node* phi = r.Phi(MachineRepresentation::kWord32, fa, fb); | 6683 Node* phi = r.Phi(MachineRepresentation::kWord32, fa, fb); |
6678 r.Return(phi); | 6684 r.Return(phi); |
6679 CHECK_EQ(1, r.Call(1)); | 6685 CHECK_EQ(1, r.Call(1)); |
6680 } | 6686 } |
6681 | 6687 |
6682 } // namespace compiler | 6688 } // namespace compiler |
6683 } // namespace internal | 6689 } // namespace internal |
6684 } // namespace v8 | 6690 } // namespace v8 |
OLD | NEW |