OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <functional> | 5 #include <functional> |
6 #include <limits> | 6 #include <limits> |
7 | 7 |
8 #include "test/cctest/cctest.h" | 8 #include "test/cctest/cctest.h" |
9 #include "test/cctest/compiler/codegen-tester.h" | 9 #include "test/cctest/compiler/codegen-tester.h" |
10 #include "test/cctest/compiler/value-helper.h" | 10 #include "test/cctest/compiler/value-helper.h" |
(...skipping 2475 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2486 int constant = 0x55555 + i; | 2486 int constant = 0x55555 + i; |
2487 m.NewNode(ops[i], m.Parameter(0), m.Parameter(1)); | 2487 m.NewNode(ops[i], m.Parameter(0), m.Parameter(1)); |
2488 m.Return(m.Int32Constant(constant)); | 2488 m.Return(m.Int32Constant(constant)); |
2489 | 2489 |
2490 CHECK_EQ(constant, m.Call(1, 1)); | 2490 CHECK_EQ(constant, m.Call(1, 1)); |
2491 } | 2491 } |
2492 } | 2492 } |
2493 | 2493 |
2494 | 2494 |
2495 template <typename Type, typename CType> | 2495 template <typename Type, typename CType> |
2496 static void RunLoadImmIndex(MachineRepresentation rep) { | 2496 static void RunLoadImmIndex(MachineType rep) { |
2497 const int kNumElems = 3; | 2497 const int kNumElems = 3; |
2498 CType buffer[kNumElems]; | 2498 CType buffer[kNumElems]; |
2499 | 2499 |
2500 // initialize the buffer with raw data. | 2500 // initialize the buffer with raw data. |
2501 byte* raw = reinterpret_cast<byte*>(buffer); | 2501 byte* raw = reinterpret_cast<byte*>(buffer); |
2502 for (size_t i = 0; i < sizeof(buffer); i++) { | 2502 for (size_t i = 0; i < sizeof(buffer); i++) { |
2503 raw[i] = static_cast<byte>((i + sizeof(buffer)) ^ 0xAA); | 2503 raw[i] = static_cast<byte>((i + sizeof(buffer)) ^ 0xAA); |
2504 } | 2504 } |
2505 | 2505 |
2506 // Test with various large and small offsets. | 2506 // Test with various large and small offsets. |
(...skipping 18 matching lines...) Expand all Loading... |
2525 RunLoadImmIndex<int16_t, uint16_t>(kMachineWord16); | 2525 RunLoadImmIndex<int16_t, uint16_t>(kMachineWord16); |
2526 RunLoadImmIndex<int32_t, uint32_t>(kMachineWord32); | 2526 RunLoadImmIndex<int32_t, uint32_t>(kMachineWord32); |
2527 RunLoadImmIndex<int32_t*, int32_t*>(kMachineTagged); | 2527 RunLoadImmIndex<int32_t*, int32_t*>(kMachineTagged); |
2528 | 2528 |
2529 // TODO(titzer): test kMachineFloat64 loads | 2529 // TODO(titzer): test kMachineFloat64 loads |
2530 // TODO(titzer): test various indexing modes. | 2530 // TODO(titzer): test various indexing modes. |
2531 } | 2531 } |
2532 | 2532 |
2533 | 2533 |
2534 template <typename CType> | 2534 template <typename CType> |
2535 static void RunLoadStore(MachineRepresentation rep) { | 2535 static void RunLoadStore(MachineType rep) { |
2536 const int kNumElems = 4; | 2536 const int kNumElems = 4; |
2537 CType buffer[kNumElems]; | 2537 CType buffer[kNumElems]; |
2538 | 2538 |
2539 for (int32_t x = 0; x < kNumElems; x++) { | 2539 for (int32_t x = 0; x < kNumElems; x++) { |
2540 int32_t y = kNumElems - x - 1; | 2540 int32_t y = kNumElems - x - 1; |
2541 // initialize the buffer with raw data. | 2541 // initialize the buffer with raw data. |
2542 byte* raw = reinterpret_cast<byte*>(buffer); | 2542 byte* raw = reinterpret_cast<byte*>(buffer); |
2543 for (size_t i = 0; i < sizeof(buffer); i++) { | 2543 for (size_t i = 0; i < sizeof(buffer); i++) { |
2544 raw[i] = static_cast<byte>((i + sizeof(buffer)) ^ 0xAA); | 2544 raw[i] = static_cast<byte>((i + sizeof(buffer)) ^ 0xAA); |
2545 } | 2545 } |
(...skipping 798 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3344 | 3344 |
3345 | 3345 |
3346 TEST(RunCallSeven) { | 3346 TEST(RunCallSeven) { |
3347 for (int i = 0; i < 2; i++) { | 3347 for (int i = 0; i < 2; i++) { |
3348 bool call_direct = i == 0; | 3348 bool call_direct = i == 0; |
3349 void* function_address = | 3349 void* function_address = |
3350 reinterpret_cast<void*>(reinterpret_cast<intptr_t>(&Seven)); | 3350 reinterpret_cast<void*>(reinterpret_cast<intptr_t>(&Seven)); |
3351 | 3351 |
3352 RawMachineAssemblerTester<int32_t> m; | 3352 RawMachineAssemblerTester<int32_t> m; |
3353 Node** args = NULL; | 3353 Node** args = NULL; |
3354 MachineRepresentation* arg_types = NULL; | 3354 MachineType* arg_types = NULL; |
3355 Node* function = | 3355 Node* function = |
3356 call_direct ? m.PointerConstant(function_address) | 3356 call_direct ? m.PointerConstant(function_address) |
3357 : m.LoadFromPointer(&function_address, | 3357 : m.LoadFromPointer(&function_address, |
3358 MachineOperatorBuilder::pointer_rep()); | 3358 MachineOperatorBuilder::pointer_rep()); |
3359 m.Return(m.CallC(function, kMachineWord32, arg_types, args, 0)); | 3359 m.Return(m.CallC(function, kMachineWord32, arg_types, args, 0)); |
3360 | 3360 |
3361 CHECK_EQ(7, m.Call()); | 3361 CHECK_EQ(7, m.Call()); |
3362 } | 3362 } |
3363 } | 3363 } |
3364 | 3364 |
3365 | 3365 |
3366 TEST(RunCallUnaryMinus) { | 3366 TEST(RunCallUnaryMinus) { |
3367 for (int i = 0; i < 2; i++) { | 3367 for (int i = 0; i < 2; i++) { |
3368 bool call_direct = i == 0; | 3368 bool call_direct = i == 0; |
3369 void* function_address = | 3369 void* function_address = |
3370 reinterpret_cast<void*>(reinterpret_cast<intptr_t>(&UnaryMinus)); | 3370 reinterpret_cast<void*>(reinterpret_cast<intptr_t>(&UnaryMinus)); |
3371 | 3371 |
3372 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 3372 RawMachineAssemblerTester<int32_t> m(kMachineWord32); |
3373 Node* args[] = {m.Parameter(0)}; | 3373 Node* args[] = {m.Parameter(0)}; |
3374 MachineRepresentation arg_types[] = {kMachineWord32}; | 3374 MachineType arg_types[] = {kMachineWord32}; |
3375 Node* function = | 3375 Node* function = |
3376 call_direct ? m.PointerConstant(function_address) | 3376 call_direct ? m.PointerConstant(function_address) |
3377 : m.LoadFromPointer(&function_address, | 3377 : m.LoadFromPointer(&function_address, |
3378 MachineOperatorBuilder::pointer_rep()); | 3378 MachineOperatorBuilder::pointer_rep()); |
3379 m.Return(m.CallC(function, kMachineWord32, arg_types, args, 1)); | 3379 m.Return(m.CallC(function, kMachineWord32, arg_types, args, 1)); |
3380 | 3380 |
3381 FOR_INT32_INPUTS(i) { | 3381 FOR_INT32_INPUTS(i) { |
3382 int a = *i; | 3382 int a = *i; |
3383 CHECK_EQ(-a, m.Call(a)); | 3383 CHECK_EQ(-a, m.Call(a)); |
3384 } | 3384 } |
3385 } | 3385 } |
3386 } | 3386 } |
3387 | 3387 |
3388 | 3388 |
3389 TEST(RunCallAPlusTwoB) { | 3389 TEST(RunCallAPlusTwoB) { |
3390 for (int i = 0; i < 2; i++) { | 3390 for (int i = 0; i < 2; i++) { |
3391 bool call_direct = i == 0; | 3391 bool call_direct = i == 0; |
3392 void* function_address = | 3392 void* function_address = |
3393 reinterpret_cast<void*>(reinterpret_cast<intptr_t>(&APlusTwoB)); | 3393 reinterpret_cast<void*>(reinterpret_cast<intptr_t>(&APlusTwoB)); |
3394 | 3394 |
3395 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32); | 3395 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32); |
3396 Node* args[] = {m.Parameter(0), m.Parameter(1)}; | 3396 Node* args[] = {m.Parameter(0), m.Parameter(1)}; |
3397 MachineRepresentation arg_types[] = {kMachineWord32, kMachineWord32}; | 3397 MachineType arg_types[] = {kMachineWord32, kMachineWord32}; |
3398 Node* function = | 3398 Node* function = |
3399 call_direct ? m.PointerConstant(function_address) | 3399 call_direct ? m.PointerConstant(function_address) |
3400 : m.LoadFromPointer(&function_address, | 3400 : m.LoadFromPointer(&function_address, |
3401 MachineOperatorBuilder::pointer_rep()); | 3401 MachineOperatorBuilder::pointer_rep()); |
3402 m.Return(m.CallC(function, kMachineWord32, arg_types, args, 2)); | 3402 m.Return(m.CallC(function, kMachineWord32, arg_types, args, 2)); |
3403 | 3403 |
3404 FOR_INT32_INPUTS(i) { | 3404 FOR_INT32_INPUTS(i) { |
3405 FOR_INT32_INPUTS(j) { | 3405 FOR_INT32_INPUTS(j) { |
3406 int a = *i; | 3406 int a = *i; |
3407 int b = *j; | 3407 int b = *j; |
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3589 FOR_FLOAT64_INPUTS(pr) { | 3589 FOR_FLOAT64_INPUTS(pr) { |
3590 input_a = *pl; | 3590 input_a = *pl; |
3591 input_b = *pr; | 3591 input_b = *pr; |
3592 int32_t expected = cmp.Float64Compare(input_a, input_b) ? 1 : 0; | 3592 int32_t expected = cmp.Float64Compare(input_a, input_b) ? 1 : 0; |
3593 CHECK_EQ(expected, m.Call()); | 3593 CHECK_EQ(expected, m.Call()); |
3594 } | 3594 } |
3595 } | 3595 } |
3596 } | 3596 } |
3597 | 3597 |
3598 | 3598 |
3599 template <typename IntType, MachineRepresentation kRepresentation> | 3599 template <typename IntType, MachineType kRepresentation> |
3600 static void LoadStoreTruncation() { | 3600 static void LoadStoreTruncation() { |
3601 IntType input; | 3601 IntType input; |
3602 | 3602 |
3603 RawMachineAssemblerTester<int32_t> m; | 3603 RawMachineAssemblerTester<int32_t> m; |
3604 Node* a = m.LoadFromPointer(&input, kRepresentation); | 3604 Node* a = m.LoadFromPointer(&input, kRepresentation); |
3605 Node* ap1 = m.Int32Add(a, m.Int32Constant(1)); | 3605 Node* ap1 = m.Int32Add(a, m.Int32Constant(1)); |
3606 m.StoreToPointer(&input, kRepresentation, ap1); | 3606 m.StoreToPointer(&input, kRepresentation, ap1); |
3607 m.Return(ap1); | 3607 m.Return(ap1); |
3608 | 3608 |
3609 const IntType max = std::numeric_limits<IntType>::max(); | 3609 const IntType max = std::numeric_limits<IntType>::max(); |
(...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3860 Node* one = m.Int32Constant(1); | 3860 Node* one = m.Int32Constant(1); |
3861 Node* acc = one; | 3861 Node* acc = one; |
3862 for (int i = 0; i < kInputSize; i++) { | 3862 for (int i = 0; i < kInputSize; i++) { |
3863 acc = m.Int32Add(acc, one); | 3863 acc = m.Int32Add(acc, one); |
3864 accs[i] = acc; | 3864 accs[i] = acc; |
3865 } | 3865 } |
3866 // If the spill slot computation is wrong, it might load from the c frame | 3866 // If the spill slot computation is wrong, it might load from the c frame |
3867 { | 3867 { |
3868 void* func = reinterpret_cast<void*>(reinterpret_cast<intptr_t>(&Seven)); | 3868 void* func = reinterpret_cast<void*>(reinterpret_cast<intptr_t>(&Seven)); |
3869 Node** args = NULL; | 3869 Node** args = NULL; |
3870 MachineRepresentation* arg_types = NULL; | 3870 MachineType* arg_types = NULL; |
3871 m.CallC(m.PointerConstant(func), kMachineWord32, arg_types, args, 0); | 3871 m.CallC(m.PointerConstant(func), kMachineWord32, arg_types, args, 0); |
3872 } | 3872 } |
3873 for (int i = 0; i < kInputSize; i++) { | 3873 for (int i = 0; i < kInputSize; i++) { |
3874 m.StoreToPointer(&outputs[i], kMachineWord32, accs[i]); | 3874 m.StoreToPointer(&outputs[i], kMachineWord32, accs[i]); |
3875 } | 3875 } |
3876 m.Return(one); | 3876 m.Return(one); |
3877 m.Call(); | 3877 m.Call(); |
3878 for (int i = 0; i < kInputSize; i++) { | 3878 for (int i = 0; i < kInputSize; i++) { |
3879 CHECK_EQ(outputs[i], i + 2); | 3879 CHECK_EQ(outputs[i], i + 2); |
3880 } | 3880 } |
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4068 FOR_UINT32_INPUTS(i) { | 4068 FOR_UINT32_INPUTS(i) { |
4069 FOR_UINT32_INPUTS(j) { | 4069 FOR_UINT32_INPUTS(j) { |
4070 int32_t expected; | 4070 int32_t expected; |
4071 if (ssub_overflow(*i, *j, &expected)) expected = constant; | 4071 if (ssub_overflow(*i, *j, &expected)) expected = constant; |
4072 CHECK_EQ(expected, bt.call(*i, *j)); | 4072 CHECK_EQ(expected, bt.call(*i, *j)); |
4073 } | 4073 } |
4074 } | 4074 } |
4075 } | 4075 } |
4076 | 4076 |
4077 #endif // V8_TURBOFAN_TARGET | 4077 #endif // V8_TURBOFAN_TARGET |
OLD | NEW |