OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. Use of this | 1 // Copyright 2014 the V8 project authors. All rights reserved. Use of this |
2 // source code is governed by a BSD-style license that can be found in the | 2 // source code is governed by a BSD-style license that can be found in the |
3 // LICENSE file. | 3 // LICENSE file. |
4 | 4 |
5 // TODO(jochen): Remove this after the setting is turned on globally. | 5 // TODO(jochen): Remove this after the setting is turned on globally. |
6 #define V8_IMMINENT_DEPRECATION_WARNINGS | 6 #define V8_IMMINENT_DEPRECATION_WARNINGS |
7 | 7 |
8 #include <cmath> | 8 #include <cmath> |
9 #include <functional> | 9 #include <functional> |
10 #include <limits> | 10 #include <limits> |
11 | 11 |
12 #include "src/base/bits.h" | 12 #include "src/base/bits.h" |
13 #include "src/base/utils/random-number-generator.h" | 13 #include "src/base/utils/random-number-generator.h" |
14 #include "src/codegen.h" | 14 #include "src/codegen.h" |
15 #include "test/cctest/cctest.h" | 15 #include "test/cctest/cctest.h" |
16 #include "test/cctest/compiler/codegen-tester.h" | 16 #include "test/cctest/compiler/codegen-tester.h" |
17 #include "test/cctest/compiler/graph-builder-tester.h" | 17 #include "test/cctest/compiler/graph-builder-tester.h" |
18 #include "test/cctest/compiler/value-helper.h" | 18 #include "test/cctest/compiler/value-helper.h" |
19 | 19 |
20 using namespace v8::base; | 20 using namespace v8::base; |
21 using namespace v8::internal; | 21 using namespace v8::internal; |
22 using namespace v8::internal::compiler; | 22 using namespace v8::internal::compiler; |
23 | 23 |
24 typedef RawMachineAssembler::Label MLabel; | 24 typedef RawMachineAssembler::Label MLabel; |
25 | 25 |
26 | 26 |
27 StoreRepresentation StoreRepForType(MachineType type) { | |
28 return StoreRepresentation(type, kNoWriteBarrier); | |
29 } | |
30 | |
31 | |
32 TEST(RunInt32Add) { | 27 TEST(RunInt32Add) { |
33 RawMachineAssemblerTester<int32_t> m; | 28 RawMachineAssemblerTester<int32_t> m; |
34 Node* add = m.Int32Add(m.Int32Constant(0), m.Int32Constant(1)); | 29 Node* add = m.Int32Add(m.Int32Constant(0), m.Int32Constant(1)); |
35 m.Return(add); | 30 m.Return(add); |
36 CHECK_EQ(1, m.Call()); | 31 CHECK_EQ(1, m.Call()); |
37 } | 32 } |
38 | 33 |
39 | 34 |
40 void TestWord32Ctz(int32_t value, int32_t expected) { | 35 void TestWord32Ctz(int32_t value, int32_t expected) { |
41 RawMachineAssemblerTester<int32_t> m; | 36 RawMachineAssemblerTester<int32_t> m; |
(...skipping 759 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
801 | 796 |
802 FOR_INT32_INPUTS(i) { | 797 FOR_INT32_INPUTS(i) { |
803 int32_t magic = 0x2342aabb + *i * 3; | 798 int32_t magic = 0x2342aabb + *i * 3; |
804 RawMachineAssemblerTester<int32_t> m; | 799 RawMachineAssemblerTester<int32_t> m; |
805 int32_t offset = *i; | 800 int32_t offset = *i; |
806 byte* from = reinterpret_cast<byte*>(&p1) - offset; | 801 byte* from = reinterpret_cast<byte*>(&p1) - offset; |
807 byte* to = reinterpret_cast<byte*>(&p2) - offset; | 802 byte* to = reinterpret_cast<byte*>(&p2) - offset; |
808 // generate load [#base + #index] | 803 // generate load [#base + #index] |
809 Node* load = | 804 Node* load = |
810 m.Load(kMachFloat32, m.PointerConstant(from), m.IntPtrConstant(offset)); | 805 m.Load(kMachFloat32, m.PointerConstant(from), m.IntPtrConstant(offset)); |
811 m.Store(StoreRepresentation(kMachFloat32, kNoWriteBarrier), | 806 m.Store(kMachFloat32, m.PointerConstant(to), m.IntPtrConstant(offset), load, |
812 m.PointerConstant(to), m.IntPtrConstant(offset), load); | 807 kNoWriteBarrier); |
813 m.Return(m.Int32Constant(magic)); | 808 m.Return(m.Int32Constant(magic)); |
814 | 809 |
815 FOR_FLOAT32_INPUTS(j) { | 810 FOR_FLOAT32_INPUTS(j) { |
816 p1 = *j; | 811 p1 = *j; |
817 p2 = *j - 5; | 812 p2 = *j - 5; |
818 CHECK_EQ(magic, m.Call()); | 813 CHECK_EQ(magic, m.Call()); |
819 CheckDoubleEq(p1, p2); | 814 CheckDoubleEq(p1, p2); |
820 } | 815 } |
821 } | 816 } |
822 } | 817 } |
823 | 818 |
824 | 819 |
825 TEST(RunLoadStoreFloat64Offset) { | 820 TEST(RunLoadStoreFloat64Offset) { |
826 double p1 = 0; // loads directly from this location. | 821 double p1 = 0; // loads directly from this location. |
827 double p2 = 0; // and stores directly into this location. | 822 double p2 = 0; // and stores directly into this location. |
828 | 823 |
829 FOR_INT32_INPUTS(i) { | 824 FOR_INT32_INPUTS(i) { |
830 int32_t magic = 0x2342aabb + *i * 3; | 825 int32_t magic = 0x2342aabb + *i * 3; |
831 RawMachineAssemblerTester<int32_t> m; | 826 RawMachineAssemblerTester<int32_t> m; |
832 int32_t offset = *i; | 827 int32_t offset = *i; |
833 byte* from = reinterpret_cast<byte*>(&p1) - offset; | 828 byte* from = reinterpret_cast<byte*>(&p1) - offset; |
834 byte* to = reinterpret_cast<byte*>(&p2) - offset; | 829 byte* to = reinterpret_cast<byte*>(&p2) - offset; |
835 // generate load [#base + #index] | 830 // generate load [#base + #index] |
836 Node* load = | 831 Node* load = |
837 m.Load(kMachFloat64, m.PointerConstant(from), m.IntPtrConstant(offset)); | 832 m.Load(kMachFloat64, m.PointerConstant(from), m.IntPtrConstant(offset)); |
838 m.Store(StoreRepresentation(kMachFloat64, kNoWriteBarrier), | 833 m.Store(kMachFloat64, m.PointerConstant(to), m.IntPtrConstant(offset), load, |
839 m.PointerConstant(to), m.IntPtrConstant(offset), load); | 834 kNoWriteBarrier); |
840 m.Return(m.Int32Constant(magic)); | 835 m.Return(m.Int32Constant(magic)); |
841 | 836 |
842 FOR_FLOAT64_INPUTS(j) { | 837 FOR_FLOAT64_INPUTS(j) { |
843 p1 = *j; | 838 p1 = *j; |
844 p2 = *j - 5; | 839 p2 = *j - 5; |
845 CHECK_EQ(magic, m.Call()); | 840 CHECK_EQ(magic, m.Call()); |
846 CheckDoubleEq(p1, p2); | 841 CheckDoubleEq(p1, p2); |
847 } | 842 } |
848 } | 843 } |
849 } | 844 } |
(...skipping 2360 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3210 for (size_t i = 0; i < sizeof(buffer); i++) { | 3205 for (size_t i = 0; i < sizeof(buffer); i++) { |
3211 raw[i] = static_cast<byte>((i + sizeof(buffer)) ^ 0xAA); | 3206 raw[i] = static_cast<byte>((i + sizeof(buffer)) ^ 0xAA); |
3212 } | 3207 } |
3213 | 3208 |
3214 RawMachineAssemblerTester<int32_t> m; | 3209 RawMachineAssemblerTester<int32_t> m; |
3215 int32_t OK = 0x29000 + x; | 3210 int32_t OK = 0x29000 + x; |
3216 Node* base = m.PointerConstant(buffer); | 3211 Node* base = m.PointerConstant(buffer); |
3217 Node* index0 = m.IntPtrConstant(x * sizeof(buffer[0])); | 3212 Node* index0 = m.IntPtrConstant(x * sizeof(buffer[0])); |
3218 Node* load = m.Load(rep, base, index0); | 3213 Node* load = m.Load(rep, base, index0); |
3219 Node* index1 = m.IntPtrConstant(y * sizeof(buffer[0])); | 3214 Node* index1 = m.IntPtrConstant(y * sizeof(buffer[0])); |
3220 StoreRepresentation store_rep(rep, kNoWriteBarrier); | 3215 m.Store(rep, base, index1, load, kNoWriteBarrier); |
3221 m.Store(StoreRepForType(rep), base, index1, load); | |
3222 m.Return(m.Int32Constant(OK)); | 3216 m.Return(m.Int32Constant(OK)); |
3223 | 3217 |
3224 CHECK(buffer[x] != buffer[y]); | 3218 CHECK(buffer[x] != buffer[y]); |
3225 CHECK_EQ(OK, m.Call()); | 3219 CHECK_EQ(OK, m.Call()); |
3226 CHECK(buffer[x] == buffer[y]); | 3220 CHECK(buffer[x] == buffer[y]); |
3227 } | 3221 } |
3228 } | 3222 } |
3229 | 3223 |
3230 | 3224 |
3231 TEST(RunLoadStore) { | 3225 TEST(RunLoadStore) { |
(...skipping 30 matching lines...) Expand all Loading... |
3262 NULL}; | 3256 NULL}; |
3263 | 3257 |
3264 for (int i = 0; ops[i] != NULL; i++) { | 3258 for (int i = 0; ops[i] != NULL; i++) { |
3265 for (int j = 0; inputs[j] != NULL; j += 2) { | 3259 for (int j = 0; inputs[j] != NULL; j += 2) { |
3266 RawMachineAssemblerTester<int32_t> m; | 3260 RawMachineAssemblerTester<int32_t> m; |
3267 Node* a = m.AddNode(inputs[j]); | 3261 Node* a = m.AddNode(inputs[j]); |
3268 Node* b = m.AddNode(inputs[j + 1]); | 3262 Node* b = m.AddNode(inputs[j + 1]); |
3269 Node* binop = m.AddNode(ops[i], a, b); | 3263 Node* binop = m.AddNode(ops[i], a, b); |
3270 Node* base = m.PointerConstant(&result); | 3264 Node* base = m.PointerConstant(&result); |
3271 Node* zero = m.IntPtrConstant(0); | 3265 Node* zero = m.IntPtrConstant(0); |
3272 m.Store(StoreRepForType(kMachFloat32), base, zero, binop); | 3266 m.Store(kMachFloat32, base, zero, binop, kNoWriteBarrier); |
3273 m.Return(m.Int32Constant(i + j)); | 3267 m.Return(m.Int32Constant(i + j)); |
3274 CHECK_EQ(i + j, m.Call()); | 3268 CHECK_EQ(i + j, m.Call()); |
3275 } | 3269 } |
3276 } | 3270 } |
3277 } | 3271 } |
3278 | 3272 |
3279 | 3273 |
3280 TEST(RunFloat64Binop) { | 3274 TEST(RunFloat64Binop) { |
3281 RawMachineAssemblerTester<int32_t> m; | 3275 RawMachineAssemblerTester<int32_t> m; |
3282 double result; | 3276 double result; |
(...skipping 15 matching lines...) Expand all Loading... |
3298 NULL}; | 3292 NULL}; |
3299 | 3293 |
3300 for (int i = 0; ops[i] != NULL; i++) { | 3294 for (int i = 0; ops[i] != NULL; i++) { |
3301 for (int j = 0; inputs[j] != NULL; j += 2) { | 3295 for (int j = 0; inputs[j] != NULL; j += 2) { |
3302 RawMachineAssemblerTester<int32_t> m; | 3296 RawMachineAssemblerTester<int32_t> m; |
3303 Node* a = m.AddNode(inputs[j]); | 3297 Node* a = m.AddNode(inputs[j]); |
3304 Node* b = m.AddNode(inputs[j + 1]); | 3298 Node* b = m.AddNode(inputs[j + 1]); |
3305 Node* binop = m.AddNode(ops[i], a, b); | 3299 Node* binop = m.AddNode(ops[i], a, b); |
3306 Node* base = m.PointerConstant(&result); | 3300 Node* base = m.PointerConstant(&result); |
3307 Node* zero = m.Int32Constant(0); | 3301 Node* zero = m.Int32Constant(0); |
3308 m.Store(StoreRepForType(kMachFloat64), base, zero, binop); | 3302 m.Store(kMachFloat64, base, zero, binop, kNoWriteBarrier); |
3309 m.Return(m.Int32Constant(i + j)); | 3303 m.Return(m.Int32Constant(i + j)); |
3310 CHECK_EQ(i + j, m.Call()); | 3304 CHECK_EQ(i + j, m.Call()); |
3311 } | 3305 } |
3312 } | 3306 } |
3313 } | 3307 } |
3314 | 3308 |
3315 | 3309 |
3316 TEST(RunDeadFloat32Binops) { | 3310 TEST(RunDeadFloat32Binops) { |
3317 RawMachineAssemblerTester<int32_t> m; | 3311 RawMachineAssemblerTester<int32_t> m; |
3318 | 3312 |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3393 | 3387 |
3394 | 3388 |
3395 TEST(RunFloat32SubImm1) { | 3389 TEST(RunFloat32SubImm1) { |
3396 float input = 0.0f; | 3390 float input = 0.0f; |
3397 float output = 0.0f; | 3391 float output = 0.0f; |
3398 | 3392 |
3399 FOR_FLOAT32_INPUTS(i) { | 3393 FOR_FLOAT32_INPUTS(i) { |
3400 RawMachineAssemblerTester<int32_t> m; | 3394 RawMachineAssemblerTester<int32_t> m; |
3401 Node* t0 = m.LoadFromPointer(&input, kMachFloat32); | 3395 Node* t0 = m.LoadFromPointer(&input, kMachFloat32); |
3402 Node* t1 = m.Float32Sub(m.Float32Constant(*i), t0); | 3396 Node* t1 = m.Float32Sub(m.Float32Constant(*i), t0); |
3403 m.StoreToPointer(&output, StoreRepForType(kMachFloat32), t1); | 3397 m.StoreToPointer(&output, kMachFloat32, t1); |
3404 m.Return(m.Int32Constant(0)); | 3398 m.Return(m.Int32Constant(0)); |
3405 FOR_FLOAT32_INPUTS(j) { | 3399 FOR_FLOAT32_INPUTS(j) { |
3406 input = *j; | 3400 input = *j; |
3407 float expected = *i - input; | 3401 float expected = *i - input; |
3408 CHECK_EQ(0, m.Call()); | 3402 CHECK_EQ(0, m.Call()); |
3409 CheckFloatEq(expected, output); | 3403 CheckFloatEq(expected, output); |
3410 } | 3404 } |
3411 } | 3405 } |
3412 } | 3406 } |
3413 | 3407 |
3414 | 3408 |
3415 TEST(RunFloat32SubImm2) { | 3409 TEST(RunFloat32SubImm2) { |
3416 float input = 0.0f; | 3410 float input = 0.0f; |
3417 float output = 0.0f; | 3411 float output = 0.0f; |
3418 | 3412 |
3419 FOR_FLOAT32_INPUTS(i) { | 3413 FOR_FLOAT32_INPUTS(i) { |
3420 RawMachineAssemblerTester<int32_t> m; | 3414 RawMachineAssemblerTester<int32_t> m; |
3421 Node* t0 = m.LoadFromPointer(&input, kMachFloat32); | 3415 Node* t0 = m.LoadFromPointer(&input, kMachFloat32); |
3422 Node* t1 = m.Float32Sub(t0, m.Float32Constant(*i)); | 3416 Node* t1 = m.Float32Sub(t0, m.Float32Constant(*i)); |
3423 m.StoreToPointer(&output, StoreRepForType(kMachFloat32), t1); | 3417 m.StoreToPointer(&output, kMachFloat32, t1); |
3424 m.Return(m.Int32Constant(0)); | 3418 m.Return(m.Int32Constant(0)); |
3425 FOR_FLOAT32_INPUTS(j) { | 3419 FOR_FLOAT32_INPUTS(j) { |
3426 input = *j; | 3420 input = *j; |
3427 float expected = input - *i; | 3421 float expected = input - *i; |
3428 CHECK_EQ(0, m.Call()); | 3422 CHECK_EQ(0, m.Call()); |
3429 CheckFloatEq(expected, output); | 3423 CheckFloatEq(expected, output); |
3430 } | 3424 } |
3431 } | 3425 } |
3432 } | 3426 } |
3433 | 3427 |
(...skipping 14 matching lines...) Expand all Loading... |
3448 | 3442 |
3449 | 3443 |
3450 TEST(RunFloat64SubImm1) { | 3444 TEST(RunFloat64SubImm1) { |
3451 double input = 0.0; | 3445 double input = 0.0; |
3452 double output = 0.0; | 3446 double output = 0.0; |
3453 | 3447 |
3454 FOR_FLOAT64_INPUTS(i) { | 3448 FOR_FLOAT64_INPUTS(i) { |
3455 RawMachineAssemblerTester<int32_t> m; | 3449 RawMachineAssemblerTester<int32_t> m; |
3456 Node* t0 = m.LoadFromPointer(&input, kMachFloat64); | 3450 Node* t0 = m.LoadFromPointer(&input, kMachFloat64); |
3457 Node* t1 = m.Float64Sub(m.Float64Constant(*i), t0); | 3451 Node* t1 = m.Float64Sub(m.Float64Constant(*i), t0); |
3458 m.StoreToPointer(&output, StoreRepForType(kMachFloat64), t1); | 3452 m.StoreToPointer(&output, kMachFloat64, t1); |
3459 m.Return(m.Int32Constant(0)); | 3453 m.Return(m.Int32Constant(0)); |
3460 FOR_FLOAT64_INPUTS(j) { | 3454 FOR_FLOAT64_INPUTS(j) { |
3461 input = *j; | 3455 input = *j; |
3462 double expected = *i - input; | 3456 double expected = *i - input; |
3463 CHECK_EQ(0, m.Call()); | 3457 CHECK_EQ(0, m.Call()); |
3464 CheckDoubleEq(expected, output); | 3458 CheckDoubleEq(expected, output); |
3465 } | 3459 } |
3466 } | 3460 } |
3467 } | 3461 } |
3468 | 3462 |
3469 | 3463 |
3470 TEST(RunFloat64SubImm2) { | 3464 TEST(RunFloat64SubImm2) { |
3471 double input = 0.0; | 3465 double input = 0.0; |
3472 double output = 0.0; | 3466 double output = 0.0; |
3473 | 3467 |
3474 FOR_FLOAT64_INPUTS(i) { | 3468 FOR_FLOAT64_INPUTS(i) { |
3475 RawMachineAssemblerTester<int32_t> m; | 3469 RawMachineAssemblerTester<int32_t> m; |
3476 Node* t0 = m.LoadFromPointer(&input, kMachFloat64); | 3470 Node* t0 = m.LoadFromPointer(&input, kMachFloat64); |
3477 Node* t1 = m.Float64Sub(t0, m.Float64Constant(*i)); | 3471 Node* t1 = m.Float64Sub(t0, m.Float64Constant(*i)); |
3478 m.StoreToPointer(&output, StoreRepForType(kMachFloat64), t1); | 3472 m.StoreToPointer(&output, kMachFloat64, t1); |
3479 m.Return(m.Int32Constant(0)); | 3473 m.Return(m.Int32Constant(0)); |
3480 FOR_FLOAT64_INPUTS(j) { | 3474 FOR_FLOAT64_INPUTS(j) { |
3481 input = *j; | 3475 input = *j; |
3482 double expected = input - *i; | 3476 double expected = input - *i; |
3483 CHECK_EQ(0, m.Call()); | 3477 CHECK_EQ(0, m.Call()); |
3484 CheckDoubleEq(expected, output); | 3478 CheckDoubleEq(expected, output); |
3485 } | 3479 } |
3486 } | 3480 } |
3487 } | 3481 } |
3488 | 3482 |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3521 double input_a = 0.0; | 3515 double input_a = 0.0; |
3522 double input_b = 0.0; | 3516 double input_b = 0.0; |
3523 double input_c = 0.0; | 3517 double input_c = 0.0; |
3524 double output = 0.0; | 3518 double output = 0.0; |
3525 | 3519 |
3526 { | 3520 { |
3527 RawMachineAssemblerTester<int32_t> m; | 3521 RawMachineAssemblerTester<int32_t> m; |
3528 Node* a = m.LoadFromPointer(&input_a, kMachFloat64); | 3522 Node* a = m.LoadFromPointer(&input_a, kMachFloat64); |
3529 Node* b = m.LoadFromPointer(&input_b, kMachFloat64); | 3523 Node* b = m.LoadFromPointer(&input_b, kMachFloat64); |
3530 Node* c = m.LoadFromPointer(&input_c, kMachFloat64); | 3524 Node* c = m.LoadFromPointer(&input_c, kMachFloat64); |
3531 m.StoreToPointer(&output, StoreRepForType(kMachFloat64), | 3525 m.StoreToPointer(&output, kMachFloat64, |
3532 m.Float64Add(m.Float64Mul(a, b), c)); | 3526 m.Float64Add(m.Float64Mul(a, b), c)); |
3533 m.Return(m.Int32Constant(0)); | 3527 m.Return(m.Int32Constant(0)); |
3534 FOR_FLOAT64_INPUTS(i) { | 3528 FOR_FLOAT64_INPUTS(i) { |
3535 FOR_FLOAT64_INPUTS(j) { | 3529 FOR_FLOAT64_INPUTS(j) { |
3536 FOR_FLOAT64_INPUTS(k) { | 3530 FOR_FLOAT64_INPUTS(k) { |
3537 input_a = *i; | 3531 input_a = *i; |
3538 input_b = *j; | 3532 input_b = *j; |
3539 input_c = *k; | 3533 input_c = *k; |
3540 volatile double temp = input_a * input_b; | 3534 volatile double temp = input_a * input_b; |
3541 volatile double expected = temp + input_c; | 3535 volatile double expected = temp + input_c; |
3542 CHECK_EQ(0, m.Call()); | 3536 CHECK_EQ(0, m.Call()); |
3543 CheckDoubleEq(expected, output); | 3537 CheckDoubleEq(expected, output); |
3544 } | 3538 } |
3545 } | 3539 } |
3546 } | 3540 } |
3547 } | 3541 } |
3548 { | 3542 { |
3549 RawMachineAssemblerTester<int32_t> m; | 3543 RawMachineAssemblerTester<int32_t> m; |
3550 Node* a = m.LoadFromPointer(&input_a, kMachFloat64); | 3544 Node* a = m.LoadFromPointer(&input_a, kMachFloat64); |
3551 Node* b = m.LoadFromPointer(&input_b, kMachFloat64); | 3545 Node* b = m.LoadFromPointer(&input_b, kMachFloat64); |
3552 Node* c = m.LoadFromPointer(&input_c, kMachFloat64); | 3546 Node* c = m.LoadFromPointer(&input_c, kMachFloat64); |
3553 m.StoreToPointer(&output, StoreRepForType(kMachFloat64), | 3547 m.StoreToPointer(&output, kMachFloat64, |
3554 m.Float64Add(a, m.Float64Mul(b, c))); | 3548 m.Float64Add(a, m.Float64Mul(b, c))); |
3555 m.Return(m.Int32Constant(0)); | 3549 m.Return(m.Int32Constant(0)); |
3556 FOR_FLOAT64_INPUTS(i) { | 3550 FOR_FLOAT64_INPUTS(i) { |
3557 FOR_FLOAT64_INPUTS(j) { | 3551 FOR_FLOAT64_INPUTS(j) { |
3558 FOR_FLOAT64_INPUTS(k) { | 3552 FOR_FLOAT64_INPUTS(k) { |
3559 input_a = *i; | 3553 input_a = *i; |
3560 input_b = *j; | 3554 input_b = *j; |
3561 input_c = *k; | 3555 input_c = *k; |
3562 volatile double temp = input_b * input_c; | 3556 volatile double temp = input_b * input_c; |
3563 volatile double expected = input_a + temp; | 3557 volatile double expected = input_a + temp; |
3564 CHECK_EQ(0, m.Call()); | 3558 CHECK_EQ(0, m.Call()); |
3565 CheckDoubleEq(expected, output); | 3559 CheckDoubleEq(expected, output); |
3566 } | 3560 } |
3567 } | 3561 } |
3568 } | 3562 } |
3569 } | 3563 } |
3570 } | 3564 } |
3571 | 3565 |
3572 | 3566 |
3573 TEST(RunFloat64MulAndFloat64SubP) { | 3567 TEST(RunFloat64MulAndFloat64SubP) { |
3574 double input_a = 0.0; | 3568 double input_a = 0.0; |
3575 double input_b = 0.0; | 3569 double input_b = 0.0; |
3576 double input_c = 0.0; | 3570 double input_c = 0.0; |
3577 double output = 0.0; | 3571 double output = 0.0; |
3578 | 3572 |
3579 RawMachineAssemblerTester<int32_t> m; | 3573 RawMachineAssemblerTester<int32_t> m; |
3580 Node* a = m.LoadFromPointer(&input_a, kMachFloat64); | 3574 Node* a = m.LoadFromPointer(&input_a, kMachFloat64); |
3581 Node* b = m.LoadFromPointer(&input_b, kMachFloat64); | 3575 Node* b = m.LoadFromPointer(&input_b, kMachFloat64); |
3582 Node* c = m.LoadFromPointer(&input_c, kMachFloat64); | 3576 Node* c = m.LoadFromPointer(&input_c, kMachFloat64); |
3583 m.StoreToPointer(&output, StoreRepForType(kMachFloat64), | 3577 m.StoreToPointer(&output, kMachFloat64, m.Float64Sub(a, m.Float64Mul(b, c))); |
3584 m.Float64Sub(a, m.Float64Mul(b, c))); | |
3585 m.Return(m.Int32Constant(0)); | 3578 m.Return(m.Int32Constant(0)); |
3586 | 3579 |
3587 FOR_FLOAT64_INPUTS(i) { | 3580 FOR_FLOAT64_INPUTS(i) { |
3588 FOR_FLOAT64_INPUTS(j) { | 3581 FOR_FLOAT64_INPUTS(j) { |
3589 FOR_FLOAT64_INPUTS(k) { | 3582 FOR_FLOAT64_INPUTS(k) { |
3590 input_a = *i; | 3583 input_a = *i; |
3591 input_b = *j; | 3584 input_b = *j; |
3592 input_c = *k; | 3585 input_c = *k; |
3593 volatile double temp = input_b * input_c; | 3586 volatile double temp = input_b * input_c; |
3594 volatile double expected = input_a - temp; | 3587 volatile double expected = input_a - temp; |
3595 CHECK_EQ(0, m.Call()); | 3588 CHECK_EQ(0, m.Call()); |
3596 CheckDoubleEq(expected, output); | 3589 CheckDoubleEq(expected, output); |
3597 } | 3590 } |
3598 } | 3591 } |
3599 } | 3592 } |
3600 } | 3593 } |
3601 | 3594 |
3602 | 3595 |
3603 TEST(RunFloat64MulImm) { | 3596 TEST(RunFloat64MulImm) { |
3604 double input = 0.0; | 3597 double input = 0.0; |
3605 double output = 0.0; | 3598 double output = 0.0; |
3606 | 3599 |
3607 { | 3600 { |
3608 FOR_FLOAT64_INPUTS(i) { | 3601 FOR_FLOAT64_INPUTS(i) { |
3609 RawMachineAssemblerTester<int32_t> m; | 3602 RawMachineAssemblerTester<int32_t> m; |
3610 Node* t0 = m.LoadFromPointer(&input, kMachFloat64); | 3603 Node* t0 = m.LoadFromPointer(&input, kMachFloat64); |
3611 Node* t1 = m.Float64Mul(m.Float64Constant(*i), t0); | 3604 Node* t1 = m.Float64Mul(m.Float64Constant(*i), t0); |
3612 m.StoreToPointer(&output, StoreRepForType(kMachFloat64), t1); | 3605 m.StoreToPointer(&output, kMachFloat64, t1); |
3613 m.Return(m.Int32Constant(0)); | 3606 m.Return(m.Int32Constant(0)); |
3614 FOR_FLOAT64_INPUTS(j) { | 3607 FOR_FLOAT64_INPUTS(j) { |
3615 input = *j; | 3608 input = *j; |
3616 double expected = *i * input; | 3609 double expected = *i * input; |
3617 CHECK_EQ(0, m.Call()); | 3610 CHECK_EQ(0, m.Call()); |
3618 CheckDoubleEq(expected, output); | 3611 CheckDoubleEq(expected, output); |
3619 } | 3612 } |
3620 } | 3613 } |
3621 } | 3614 } |
3622 { | 3615 { |
3623 FOR_FLOAT64_INPUTS(i) { | 3616 FOR_FLOAT64_INPUTS(i) { |
3624 RawMachineAssemblerTester<int32_t> m; | 3617 RawMachineAssemblerTester<int32_t> m; |
3625 Node* t0 = m.LoadFromPointer(&input, kMachFloat64); | 3618 Node* t0 = m.LoadFromPointer(&input, kMachFloat64); |
3626 Node* t1 = m.Float64Mul(t0, m.Float64Constant(*i)); | 3619 Node* t1 = m.Float64Mul(t0, m.Float64Constant(*i)); |
3627 m.StoreToPointer(&output, StoreRepForType(kMachFloat64), t1); | 3620 m.StoreToPointer(&output, kMachFloat64, t1); |
3628 m.Return(m.Int32Constant(0)); | 3621 m.Return(m.Int32Constant(0)); |
3629 FOR_FLOAT64_INPUTS(j) { | 3622 FOR_FLOAT64_INPUTS(j) { |
3630 input = *j; | 3623 input = *j; |
3631 double expected = input * *i; | 3624 double expected = input * *i; |
3632 CHECK_EQ(0, m.Call()); | 3625 CHECK_EQ(0, m.Call()); |
3633 CheckDoubleEq(expected, output); | 3626 CheckDoubleEq(expected, output); |
3634 } | 3627 } |
3635 } | 3628 } |
3636 } | 3629 } |
3637 } | 3630 } |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3682 } | 3675 } |
3683 } | 3676 } |
3684 | 3677 |
3685 | 3678 |
3686 TEST(RunChangeInt32ToFloat64_A) { | 3679 TEST(RunChangeInt32ToFloat64_A) { |
3687 RawMachineAssemblerTester<int32_t> m; | 3680 RawMachineAssemblerTester<int32_t> m; |
3688 int32_t magic = 0x986234; | 3681 int32_t magic = 0x986234; |
3689 double result = 0; | 3682 double result = 0; |
3690 | 3683 |
3691 Node* convert = m.ChangeInt32ToFloat64(m.Int32Constant(magic)); | 3684 Node* convert = m.ChangeInt32ToFloat64(m.Int32Constant(magic)); |
3692 m.Store(StoreRepForType(kMachFloat64), m.PointerConstant(&result), | 3685 m.Store(kMachFloat64, m.PointerConstant(&result), m.Int32Constant(0), convert, |
3693 m.Int32Constant(0), convert); | 3686 kNoWriteBarrier); |
3694 m.Return(m.Int32Constant(magic)); | 3687 m.Return(m.Int32Constant(magic)); |
3695 | 3688 |
3696 CHECK_EQ(magic, m.Call()); | 3689 CHECK_EQ(magic, m.Call()); |
3697 CHECK_EQ(static_cast<double>(magic), result); | 3690 CHECK_EQ(static_cast<double>(magic), result); |
3698 } | 3691 } |
3699 | 3692 |
3700 | 3693 |
3701 TEST(RunChangeInt32ToFloat64_B) { | 3694 TEST(RunChangeInt32ToFloat64_B) { |
3702 RawMachineAssemblerTester<int32_t> m(kMachInt32); | 3695 RawMachineAssemblerTester<int32_t> m(kMachInt32); |
3703 double output = 0; | 3696 double output = 0; |
3704 | 3697 |
3705 Node* convert = m.ChangeInt32ToFloat64(m.Parameter(0)); | 3698 Node* convert = m.ChangeInt32ToFloat64(m.Parameter(0)); |
3706 m.Store(StoreRepForType(kMachFloat64), m.PointerConstant(&output), | 3699 m.Store(kMachFloat64, m.PointerConstant(&output), m.Int32Constant(0), convert, |
3707 m.Int32Constant(0), convert); | 3700 kNoWriteBarrier); |
3708 m.Return(m.Parameter(0)); | 3701 m.Return(m.Parameter(0)); |
3709 | 3702 |
3710 FOR_INT32_INPUTS(i) { | 3703 FOR_INT32_INPUTS(i) { |
3711 int32_t expect = *i; | 3704 int32_t expect = *i; |
3712 CHECK_EQ(expect, m.Call(expect)); | 3705 CHECK_EQ(expect, m.Call(expect)); |
3713 CHECK_EQ(static_cast<double>(expect), output); | 3706 CHECK_EQ(static_cast<double>(expect), output); |
3714 } | 3707 } |
3715 } | 3708 } |
3716 | 3709 |
3717 | 3710 |
3718 TEST(RunChangeUint32ToFloat64_B) { | 3711 TEST(RunChangeUint32ToFloat64_B) { |
3719 RawMachineAssemblerTester<uint32_t> m(kMachUint32); | 3712 RawMachineAssemblerTester<uint32_t> m(kMachUint32); |
3720 double output = 0; | 3713 double output = 0; |
3721 | 3714 |
3722 Node* convert = m.ChangeUint32ToFloat64(m.Parameter(0)); | 3715 Node* convert = m.ChangeUint32ToFloat64(m.Parameter(0)); |
3723 m.Store(StoreRepForType(kMachFloat64), m.PointerConstant(&output), | 3716 m.Store(kMachFloat64, m.PointerConstant(&output), m.Int32Constant(0), convert, |
3724 m.Int32Constant(0), convert); | 3717 kNoWriteBarrier); |
3725 m.Return(m.Parameter(0)); | 3718 m.Return(m.Parameter(0)); |
3726 | 3719 |
3727 FOR_UINT32_INPUTS(i) { | 3720 FOR_UINT32_INPUTS(i) { |
3728 uint32_t expect = *i; | 3721 uint32_t expect = *i; |
3729 CHECK_EQ(expect, m.Call(expect)); | 3722 CHECK_EQ(expect, m.Call(expect)); |
3730 CHECK_EQ(static_cast<double>(expect), output); | 3723 CHECK_EQ(static_cast<double>(expect), output); |
3731 } | 3724 } |
3732 } | 3725 } |
3733 | 3726 |
3734 | 3727 |
3735 TEST(RunChangeUint32ToFloat64_spilled) { | 3728 TEST(RunChangeUint32ToFloat64_spilled) { |
3736 RawMachineAssemblerTester<int32_t> m; | 3729 RawMachineAssemblerTester<int32_t> m; |
3737 const int kNumInputs = 32; | 3730 const int kNumInputs = 32; |
3738 int32_t magic = 0x786234; | 3731 int32_t magic = 0x786234; |
3739 uint32_t input[kNumInputs]; | 3732 uint32_t input[kNumInputs]; |
3740 double result[kNumInputs]; | 3733 double result[kNumInputs]; |
3741 Node* input_node[kNumInputs]; | 3734 Node* input_node[kNumInputs]; |
3742 | 3735 |
3743 for (int i = 0; i < kNumInputs; i++) { | 3736 for (int i = 0; i < kNumInputs; i++) { |
3744 input_node[i] = | 3737 input_node[i] = |
3745 m.Load(kMachUint32, m.PointerConstant(&input), m.Int32Constant(i * 4)); | 3738 m.Load(kMachUint32, m.PointerConstant(&input), m.Int32Constant(i * 4)); |
3746 } | 3739 } |
3747 | 3740 |
3748 for (int i = 0; i < kNumInputs; i++) { | 3741 for (int i = 0; i < kNumInputs; i++) { |
3749 m.Store(StoreRepForType(kMachFloat64), m.PointerConstant(&result), | 3742 m.Store(kMachFloat64, m.PointerConstant(&result), m.Int32Constant(i * 8), |
3750 m.Int32Constant(i * 8), m.ChangeUint32ToFloat64(input_node[i])); | 3743 m.ChangeUint32ToFloat64(input_node[i]), kNoWriteBarrier); |
3751 } | 3744 } |
3752 | 3745 |
3753 m.Return(m.Int32Constant(magic)); | 3746 m.Return(m.Int32Constant(magic)); |
3754 | 3747 |
3755 for (int i = 0; i < kNumInputs; i++) { | 3748 for (int i = 0; i < kNumInputs; i++) { |
3756 input[i] = 100 + i; | 3749 input[i] = 100 + i; |
3757 } | 3750 } |
3758 | 3751 |
3759 CHECK_EQ(magic, m.Call()); | 3752 CHECK_EQ(magic, m.Call()); |
3760 | 3753 |
3761 for (int i = 0; i < kNumInputs; i++) { | 3754 for (int i = 0; i < kNumInputs; i++) { |
3762 CHECK_EQ(result[i], static_cast<double>(100 + i)); | 3755 CHECK_EQ(result[i], static_cast<double>(100 + i)); |
3763 } | 3756 } |
3764 } | 3757 } |
3765 | 3758 |
3766 | 3759 |
3767 TEST(RunChangeFloat64ToInt32_A) { | 3760 TEST(RunChangeFloat64ToInt32_A) { |
3768 RawMachineAssemblerTester<int32_t> m; | 3761 RawMachineAssemblerTester<int32_t> m; |
3769 int32_t magic = 0x786234; | 3762 int32_t magic = 0x786234; |
3770 double input = 11.1; | 3763 double input = 11.1; |
3771 int32_t result = 0; | 3764 int32_t result = 0; |
3772 | 3765 |
3773 m.Store(StoreRepForType(kMachInt32), m.PointerConstant(&result), | 3766 m.Store(kMachInt32, m.PointerConstant(&result), m.Int32Constant(0), |
3774 m.Int32Constant(0), m.ChangeFloat64ToInt32(m.Float64Constant(input))); | 3767 m.ChangeFloat64ToInt32(m.Float64Constant(input)), kNoWriteBarrier); |
3775 m.Return(m.Int32Constant(magic)); | 3768 m.Return(m.Int32Constant(magic)); |
3776 | 3769 |
3777 CHECK_EQ(magic, m.Call()); | 3770 CHECK_EQ(magic, m.Call()); |
3778 CHECK_EQ(static_cast<int32_t>(input), result); | 3771 CHECK_EQ(static_cast<int32_t>(input), result); |
3779 } | 3772 } |
3780 | 3773 |
3781 | 3774 |
3782 TEST(RunChangeFloat64ToInt32_B) { | 3775 TEST(RunChangeFloat64ToInt32_B) { |
3783 RawMachineAssemblerTester<int32_t> m; | 3776 RawMachineAssemblerTester<int32_t> m; |
3784 double input = 0; | 3777 double input = 0; |
3785 int32_t output = 0; | 3778 int32_t output = 0; |
3786 | 3779 |
3787 Node* load = | 3780 Node* load = |
3788 m.Load(kMachFloat64, m.PointerConstant(&input), m.Int32Constant(0)); | 3781 m.Load(kMachFloat64, m.PointerConstant(&input), m.Int32Constant(0)); |
3789 Node* convert = m.ChangeFloat64ToInt32(load); | 3782 Node* convert = m.ChangeFloat64ToInt32(load); |
3790 m.Store(StoreRepForType(kMachInt32), m.PointerConstant(&output), | 3783 m.Store(kMachInt32, m.PointerConstant(&output), m.Int32Constant(0), convert, |
3791 m.Int32Constant(0), convert); | 3784 kNoWriteBarrier); |
3792 m.Return(convert); | 3785 m.Return(convert); |
3793 | 3786 |
3794 { | 3787 { |
3795 FOR_INT32_INPUTS(i) { | 3788 FOR_INT32_INPUTS(i) { |
3796 input = *i; | 3789 input = *i; |
3797 int32_t expect = *i; | 3790 int32_t expect = *i; |
3798 CHECK_EQ(expect, m.Call()); | 3791 CHECK_EQ(expect, m.Call()); |
3799 CHECK_EQ(expect, output); | 3792 CHECK_EQ(expect, output); |
3800 } | 3793 } |
3801 } | 3794 } |
(...skipping 20 matching lines...) Expand all Loading... |
3822 | 3815 |
3823 | 3816 |
3824 TEST(RunChangeFloat64ToUint32_B) { | 3817 TEST(RunChangeFloat64ToUint32_B) { |
3825 RawMachineAssemblerTester<int32_t> m; | 3818 RawMachineAssemblerTester<int32_t> m; |
3826 double input = 0; | 3819 double input = 0; |
3827 int32_t output = 0; | 3820 int32_t output = 0; |
3828 | 3821 |
3829 Node* load = | 3822 Node* load = |
3830 m.Load(kMachFloat64, m.PointerConstant(&input), m.Int32Constant(0)); | 3823 m.Load(kMachFloat64, m.PointerConstant(&input), m.Int32Constant(0)); |
3831 Node* convert = m.ChangeFloat64ToUint32(load); | 3824 Node* convert = m.ChangeFloat64ToUint32(load); |
3832 m.Store(StoreRepForType(kMachInt32), m.PointerConstant(&output), | 3825 m.Store(kMachInt32, m.PointerConstant(&output), m.Int32Constant(0), convert, |
3833 m.Int32Constant(0), convert); | 3826 kNoWriteBarrier); |
3834 m.Return(convert); | 3827 m.Return(convert); |
3835 | 3828 |
3836 { | 3829 { |
3837 FOR_UINT32_INPUTS(i) { | 3830 FOR_UINT32_INPUTS(i) { |
3838 input = *i; | 3831 input = *i; |
3839 // TODO(titzer): add a CheckEqualsHelper overload for uint32_t. | 3832 // TODO(titzer): add a CheckEqualsHelper overload for uint32_t. |
3840 int32_t expect = static_cast<int32_t>(*i); | 3833 int32_t expect = static_cast<int32_t>(*i); |
3841 CHECK_EQ(expect, m.Call()); | 3834 CHECK_EQ(expect, m.Call()); |
3842 CHECK_EQ(expect, output); | 3835 CHECK_EQ(expect, output); |
3843 } | 3836 } |
(...skipping 27 matching lines...) Expand all Loading... |
3871 double input[kNumInputs]; | 3864 double input[kNumInputs]; |
3872 int32_t result[kNumInputs]; | 3865 int32_t result[kNumInputs]; |
3873 Node* input_node[kNumInputs]; | 3866 Node* input_node[kNumInputs]; |
3874 | 3867 |
3875 for (int i = 0; i < kNumInputs; i++) { | 3868 for (int i = 0; i < kNumInputs; i++) { |
3876 input_node[i] = | 3869 input_node[i] = |
3877 m.Load(kMachFloat64, m.PointerConstant(&input), m.Int32Constant(i * 8)); | 3870 m.Load(kMachFloat64, m.PointerConstant(&input), m.Int32Constant(i * 8)); |
3878 } | 3871 } |
3879 | 3872 |
3880 for (int i = 0; i < kNumInputs; i++) { | 3873 for (int i = 0; i < kNumInputs; i++) { |
3881 m.Store(StoreRepForType(kMachInt32), m.PointerConstant(&result), | 3874 m.Store(kMachInt32, m.PointerConstant(&result), m.Int32Constant(i * 4), |
3882 m.Int32Constant(i * 4), m.ChangeFloat64ToInt32(input_node[i])); | 3875 m.ChangeFloat64ToInt32(input_node[i]), kNoWriteBarrier); |
3883 } | 3876 } |
3884 | 3877 |
3885 m.Return(m.Int32Constant(magic)); | 3878 m.Return(m.Int32Constant(magic)); |
3886 | 3879 |
3887 for (int i = 0; i < kNumInputs; i++) { | 3880 for (int i = 0; i < kNumInputs; i++) { |
3888 input[i] = 100.9 + i; | 3881 input[i] = 100.9 + i; |
3889 } | 3882 } |
3890 | 3883 |
3891 CHECK_EQ(magic, m.Call()); | 3884 CHECK_EQ(magic, m.Call()); |
3892 | 3885 |
(...skipping 10 matching lines...) Expand all Loading... |
3903 double input[kNumInputs]; | 3896 double input[kNumInputs]; |
3904 uint32_t result[kNumInputs]; | 3897 uint32_t result[kNumInputs]; |
3905 Node* input_node[kNumInputs]; | 3898 Node* input_node[kNumInputs]; |
3906 | 3899 |
3907 for (int i = 0; i < kNumInputs; i++) { | 3900 for (int i = 0; i < kNumInputs; i++) { |
3908 input_node[i] = | 3901 input_node[i] = |
3909 m.Load(kMachFloat64, m.PointerConstant(&input), m.Int32Constant(i * 8)); | 3902 m.Load(kMachFloat64, m.PointerConstant(&input), m.Int32Constant(i * 8)); |
3910 } | 3903 } |
3911 | 3904 |
3912 for (int i = 0; i < kNumInputs; i++) { | 3905 for (int i = 0; i < kNumInputs; i++) { |
3913 m.Store(StoreRepForType(kMachUint32), m.PointerConstant(&result), | 3906 m.Store(kMachUint32, m.PointerConstant(&result), m.Int32Constant(i * 4), |
3914 m.Int32Constant(i * 4), m.ChangeFloat64ToUint32(input_node[i])); | 3907 m.ChangeFloat64ToUint32(input_node[i]), kNoWriteBarrier); |
3915 } | 3908 } |
3916 | 3909 |
3917 m.Return(m.Int32Constant(magic)); | 3910 m.Return(m.Int32Constant(magic)); |
3918 | 3911 |
3919 for (int i = 0; i < kNumInputs; i++) { | 3912 for (int i = 0; i < kNumInputs; i++) { |
3920 if (i % 2) { | 3913 if (i % 2) { |
3921 input[i] = 100 + i + 2147483648u; | 3914 input[i] = 100 + i + 2147483648u; |
3922 } else { | 3915 } else { |
3923 input[i] = 100 + i; | 3916 input[i] = 100 + i; |
3924 } | 3917 } |
(...skipping 18 matching lines...) Expand all Loading... |
3943 double input[kNumInputs]; | 3936 double input[kNumInputs]; |
3944 float result[kNumInputs]; | 3937 float result[kNumInputs]; |
3945 Node* input_node[kNumInputs]; | 3938 Node* input_node[kNumInputs]; |
3946 | 3939 |
3947 for (int i = 0; i < kNumInputs; i++) { | 3940 for (int i = 0; i < kNumInputs; i++) { |
3948 input_node[i] = | 3941 input_node[i] = |
3949 m.Load(kMachFloat64, m.PointerConstant(&input), m.Int32Constant(i * 8)); | 3942 m.Load(kMachFloat64, m.PointerConstant(&input), m.Int32Constant(i * 8)); |
3950 } | 3943 } |
3951 | 3944 |
3952 for (int i = 0; i < kNumInputs; i++) { | 3945 for (int i = 0; i < kNumInputs; i++) { |
3953 m.Store(StoreRepForType(kMachFloat32), m.PointerConstant(&result), | 3946 m.Store(kMachFloat32, m.PointerConstant(&result), m.Int32Constant(i * 4), |
3954 m.Int32Constant(i * 4), m.TruncateFloat64ToFloat32(input_node[i])); | 3947 m.TruncateFloat64ToFloat32(input_node[i]), kNoWriteBarrier); |
3955 } | 3948 } |
3956 | 3949 |
3957 m.Return(m.Int32Constant(magic)); | 3950 m.Return(m.Int32Constant(magic)); |
3958 | 3951 |
3959 for (int i = 0; i < kNumInputs; i++) { | 3952 for (int i = 0; i < kNumInputs; i++) { |
3960 input[i] = 0.1 + i; | 3953 input[i] = 0.1 + i; |
3961 } | 3954 } |
3962 | 3955 |
3963 CHECK_EQ(magic, m.Call()); | 3956 CHECK_EQ(magic, m.Call()); |
3964 | 3957 |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4019 MLabel blocka, blockb, end; | 4012 MLabel blocka, blockb, end; |
4020 Node* k1 = m.Float32Constant(constant); | 4013 Node* k1 = m.Float32Constant(constant); |
4021 Node* k2 = m.Float32Constant(0 - constant); | 4014 Node* k2 = m.Float32Constant(0 - constant); |
4022 m.Branch(m.Int32Constant(0), &blocka, &blockb); | 4015 m.Branch(m.Int32Constant(0), &blocka, &blockb); |
4023 m.Bind(&blocka); | 4016 m.Bind(&blocka); |
4024 m.Goto(&end); | 4017 m.Goto(&end); |
4025 m.Bind(&blockb); | 4018 m.Bind(&blockb); |
4026 m.Goto(&end); | 4019 m.Goto(&end); |
4027 m.Bind(&end); | 4020 m.Bind(&end); |
4028 Node* phi = m.Phi(kMachFloat32, k2, k1); | 4021 Node* phi = m.Phi(kMachFloat32, k2, k1); |
4029 m.Store(StoreRepForType(kMachFloat32), m.PointerConstant(&buffer), | 4022 m.Store(kMachFloat32, m.PointerConstant(&buffer), m.IntPtrConstant(0), phi, |
4030 m.IntPtrConstant(0), phi); | 4023 kNoWriteBarrier); |
4031 m.Return(m.Int32Constant(magic)); | 4024 m.Return(m.Int32Constant(magic)); |
4032 | 4025 |
4033 CHECK_EQ(magic, m.Call()); | 4026 CHECK_EQ(magic, m.Call()); |
4034 CHECK(constant == buffer); | 4027 CHECK(constant == buffer); |
4035 } | 4028 } |
4036 | 4029 |
4037 | 4030 |
4038 TEST(RunDoubleDiamond) { | 4031 TEST(RunDoubleDiamond) { |
4039 RawMachineAssemblerTester<int32_t> m; | 4032 RawMachineAssemblerTester<int32_t> m; |
4040 | 4033 |
4041 const int magic = 99645; | 4034 const int magic = 99645; |
4042 double buffer = 0.1; | 4035 double buffer = 0.1; |
4043 double constant = 99.99; | 4036 double constant = 99.99; |
4044 | 4037 |
4045 MLabel blocka, blockb, end; | 4038 MLabel blocka, blockb, end; |
4046 Node* k1 = m.Float64Constant(constant); | 4039 Node* k1 = m.Float64Constant(constant); |
4047 Node* k2 = m.Float64Constant(0 - constant); | 4040 Node* k2 = m.Float64Constant(0 - constant); |
4048 m.Branch(m.Int32Constant(0), &blocka, &blockb); | 4041 m.Branch(m.Int32Constant(0), &blocka, &blockb); |
4049 m.Bind(&blocka); | 4042 m.Bind(&blocka); |
4050 m.Goto(&end); | 4043 m.Goto(&end); |
4051 m.Bind(&blockb); | 4044 m.Bind(&blockb); |
4052 m.Goto(&end); | 4045 m.Goto(&end); |
4053 m.Bind(&end); | 4046 m.Bind(&end); |
4054 Node* phi = m.Phi(kMachFloat64, k2, k1); | 4047 Node* phi = m.Phi(kMachFloat64, k2, k1); |
4055 m.Store(StoreRepForType(kMachFloat64), m.PointerConstant(&buffer), | 4048 m.Store(kMachFloat64, m.PointerConstant(&buffer), m.Int32Constant(0), phi, |
4056 m.Int32Constant(0), phi); | 4049 kNoWriteBarrier); |
4057 m.Return(m.Int32Constant(magic)); | 4050 m.Return(m.Int32Constant(magic)); |
4058 | 4051 |
4059 CHECK_EQ(magic, m.Call()); | 4052 CHECK_EQ(magic, m.Call()); |
4060 CHECK_EQ(constant, buffer); | 4053 CHECK_EQ(constant, buffer); |
4061 } | 4054 } |
4062 | 4055 |
4063 | 4056 |
4064 TEST(RunRefDiamond) { | 4057 TEST(RunRefDiamond) { |
4065 RawMachineAssemblerTester<int32_t> m; | 4058 RawMachineAssemblerTester<int32_t> m; |
4066 | 4059 |
4067 const int magic = 99644; | 4060 const int magic = 99644; |
4068 Handle<String> rexpected = | 4061 Handle<String> rexpected = |
4069 CcTest::i_isolate()->factory()->InternalizeUtf8String("A"); | 4062 CcTest::i_isolate()->factory()->InternalizeUtf8String("A"); |
4070 String* buffer; | 4063 String* buffer; |
4071 | 4064 |
4072 MLabel blocka, blockb, end; | 4065 MLabel blocka, blockb, end; |
4073 Node* k1 = m.StringConstant("A"); | 4066 Node* k1 = m.StringConstant("A"); |
4074 Node* k2 = m.StringConstant("B"); | 4067 Node* k2 = m.StringConstant("B"); |
4075 m.Branch(m.Int32Constant(0), &blocka, &blockb); | 4068 m.Branch(m.Int32Constant(0), &blocka, &blockb); |
4076 m.Bind(&blocka); | 4069 m.Bind(&blocka); |
4077 m.Goto(&end); | 4070 m.Goto(&end); |
4078 m.Bind(&blockb); | 4071 m.Bind(&blockb); |
4079 m.Goto(&end); | 4072 m.Goto(&end); |
4080 m.Bind(&end); | 4073 m.Bind(&end); |
4081 Node* phi = m.Phi(kMachAnyTagged, k2, k1); | 4074 Node* phi = m.Phi(kMachAnyTagged, k2, k1); |
4082 m.Store(StoreRepForType(kMachAnyTagged), m.PointerConstant(&buffer), | 4075 m.Store(kMachAnyTagged, m.PointerConstant(&buffer), m.Int32Constant(0), phi, |
4083 m.Int32Constant(0), phi); | 4076 kNoWriteBarrier); |
4084 m.Return(m.Int32Constant(magic)); | 4077 m.Return(m.Int32Constant(magic)); |
4085 | 4078 |
4086 CHECK_EQ(magic, m.Call()); | 4079 CHECK_EQ(magic, m.Call()); |
4087 CHECK(rexpected->SameValue(buffer)); | 4080 CHECK(rexpected->SameValue(buffer)); |
4088 } | 4081 } |
4089 | 4082 |
4090 | 4083 |
4091 TEST(RunDoubleRefDiamond) { | 4084 TEST(RunDoubleRefDiamond) { |
4092 RawMachineAssemblerTester<int32_t> m; | 4085 RawMachineAssemblerTester<int32_t> m; |
4093 | 4086 |
(...skipping 10 matching lines...) Expand all Loading... |
4104 Node* r1 = m.StringConstant("AX"); | 4097 Node* r1 = m.StringConstant("AX"); |
4105 Node* r2 = m.StringConstant("BX"); | 4098 Node* r2 = m.StringConstant("BX"); |
4106 m.Branch(m.Int32Constant(0), &blocka, &blockb); | 4099 m.Branch(m.Int32Constant(0), &blocka, &blockb); |
4107 m.Bind(&blocka); | 4100 m.Bind(&blocka); |
4108 m.Goto(&end); | 4101 m.Goto(&end); |
4109 m.Bind(&blockb); | 4102 m.Bind(&blockb); |
4110 m.Goto(&end); | 4103 m.Goto(&end); |
4111 m.Bind(&end); | 4104 m.Bind(&end); |
4112 Node* dphi = m.Phi(kMachFloat64, d2, d1); | 4105 Node* dphi = m.Phi(kMachFloat64, d2, d1); |
4113 Node* rphi = m.Phi(kMachAnyTagged, r2, r1); | 4106 Node* rphi = m.Phi(kMachAnyTagged, r2, r1); |
4114 m.Store(StoreRepForType(kMachFloat64), m.PointerConstant(&dbuffer), | 4107 m.Store(kMachFloat64, m.PointerConstant(&dbuffer), m.Int32Constant(0), dphi, |
4115 m.Int32Constant(0), dphi); | 4108 kNoWriteBarrier); |
4116 m.Store(StoreRepForType(kMachAnyTagged), m.PointerConstant(&rbuffer), | 4109 m.Store(kMachAnyTagged, m.PointerConstant(&rbuffer), m.Int32Constant(0), rphi, |
4117 m.Int32Constant(0), rphi); | 4110 kNoWriteBarrier); |
4118 m.Return(m.Int32Constant(magic)); | 4111 m.Return(m.Int32Constant(magic)); |
4119 | 4112 |
4120 CHECK_EQ(magic, m.Call()); | 4113 CHECK_EQ(magic, m.Call()); |
4121 CHECK_EQ(dconstant, dbuffer); | 4114 CHECK_EQ(dconstant, dbuffer); |
4122 CHECK(rexpected->SameValue(rbuffer)); | 4115 CHECK(rexpected->SameValue(rbuffer)); |
4123 } | 4116 } |
4124 | 4117 |
4125 | 4118 |
4126 TEST(RunDoubleRefDoubleDiamond) { | 4119 TEST(RunDoubleRefDoubleDiamond) { |
4127 RawMachineAssemblerTester<int32_t> m; | 4120 RawMachineAssemblerTester<int32_t> m; |
(...skipping 21 matching lines...) Expand all Loading... |
4149 m.Branch(m.Int32Constant(0), &blockd, &blocke); | 4142 m.Branch(m.Int32Constant(0), &blockd, &blocke); |
4150 | 4143 |
4151 m.Bind(&blockd); | 4144 m.Bind(&blockd); |
4152 m.Goto(&end); | 4145 m.Goto(&end); |
4153 m.Bind(&blocke); | 4146 m.Bind(&blocke); |
4154 m.Goto(&end); | 4147 m.Goto(&end); |
4155 m.Bind(&end); | 4148 m.Bind(&end); |
4156 Node* dphi2 = m.Phi(kMachFloat64, d1, dphi1); | 4149 Node* dphi2 = m.Phi(kMachFloat64, d1, dphi1); |
4157 Node* rphi2 = m.Phi(kMachAnyTagged, r1, rphi1); | 4150 Node* rphi2 = m.Phi(kMachAnyTagged, r1, rphi1); |
4158 | 4151 |
4159 m.Store(StoreRepForType(kMachFloat64), m.PointerConstant(&dbuffer), | 4152 m.Store(kMachFloat64, m.PointerConstant(&dbuffer), m.Int32Constant(0), dphi2, |
4160 m.Int32Constant(0), dphi2); | 4153 kNoWriteBarrier); |
4161 m.Store(StoreRepForType(kMachAnyTagged), m.PointerConstant(&rbuffer), | 4154 m.Store(kMachAnyTagged, m.PointerConstant(&rbuffer), m.Int32Constant(0), |
4162 m.Int32Constant(0), rphi2); | 4155 rphi2, kNoWriteBarrier); |
4163 m.Return(m.Int32Constant(magic)); | 4156 m.Return(m.Int32Constant(magic)); |
4164 | 4157 |
4165 CHECK_EQ(magic, m.Call()); | 4158 CHECK_EQ(magic, m.Call()); |
4166 CHECK_EQ(dconstant, dbuffer); | 4159 CHECK_EQ(dconstant, dbuffer); |
4167 CHECK(rexpected->SameValue(rbuffer)); | 4160 CHECK(rexpected->SameValue(rbuffer)); |
4168 } | 4161 } |
4169 | 4162 |
4170 | 4163 |
4171 TEST(RunDoubleLoopPhi) { | 4164 TEST(RunDoubleLoopPhi) { |
4172 RawMachineAssemblerTester<int32_t> m; | 4165 RawMachineAssemblerTester<int32_t> m; |
4173 MLabel header, body, end; | 4166 MLabel header, body, end; |
4174 | 4167 |
4175 int magic = 99773; | 4168 int magic = 99773; |
4176 double buffer = 0.99; | 4169 double buffer = 0.99; |
4177 double dconstant = 777.1; | 4170 double dconstant = 777.1; |
4178 | 4171 |
4179 Node* zero = m.Int32Constant(0); | 4172 Node* zero = m.Int32Constant(0); |
4180 Node* dk = m.Float64Constant(dconstant); | 4173 Node* dk = m.Float64Constant(dconstant); |
4181 | 4174 |
4182 m.Goto(&header); | 4175 m.Goto(&header); |
4183 m.Bind(&header); | 4176 m.Bind(&header); |
4184 Node* phi = m.Phi(kMachFloat64, dk, dk); | 4177 Node* phi = m.Phi(kMachFloat64, dk, dk); |
4185 phi->ReplaceInput(1, phi); | 4178 phi->ReplaceInput(1, phi); |
4186 m.Branch(zero, &body, &end); | 4179 m.Branch(zero, &body, &end); |
4187 m.Bind(&body); | 4180 m.Bind(&body); |
4188 m.Goto(&header); | 4181 m.Goto(&header); |
4189 m.Bind(&end); | 4182 m.Bind(&end); |
4190 m.Store(StoreRepForType(kMachFloat64), m.PointerConstant(&buffer), | 4183 m.Store(kMachFloat64, m.PointerConstant(&buffer), m.Int32Constant(0), phi, |
4191 m.Int32Constant(0), phi); | 4184 kNoWriteBarrier); |
4192 m.Return(m.Int32Constant(magic)); | 4185 m.Return(m.Int32Constant(magic)); |
4193 | 4186 |
4194 CHECK_EQ(magic, m.Call()); | 4187 CHECK_EQ(magic, m.Call()); |
4195 } | 4188 } |
4196 | 4189 |
4197 | 4190 |
4198 TEST(RunCountToTenAccRaw) { | 4191 TEST(RunCountToTenAccRaw) { |
4199 RawMachineAssemblerTester<int32_t> m; | 4192 RawMachineAssemblerTester<int32_t> m; |
4200 | 4193 |
4201 Node* zero = m.Int32Constant(0); | 4194 Node* zero = m.Int32Constant(0); |
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4475 } | 4468 } |
4476 | 4469 |
4477 | 4470 |
4478 template <typename IntType, MachineType kRepresentation> | 4471 template <typename IntType, MachineType kRepresentation> |
4479 static void LoadStoreTruncation() { | 4472 static void LoadStoreTruncation() { |
4480 IntType input; | 4473 IntType input; |
4481 | 4474 |
4482 RawMachineAssemblerTester<int32_t> m; | 4475 RawMachineAssemblerTester<int32_t> m; |
4483 Node* a = m.LoadFromPointer(&input, kRepresentation); | 4476 Node* a = m.LoadFromPointer(&input, kRepresentation); |
4484 Node* ap1 = m.Int32Add(a, m.Int32Constant(1)); | 4477 Node* ap1 = m.Int32Add(a, m.Int32Constant(1)); |
4485 m.StoreToPointer(&input, StoreRepForType(kRepresentation), ap1); | 4478 m.StoreToPointer(&input, kRepresentation, ap1); |
4486 m.Return(ap1); | 4479 m.Return(ap1); |
4487 | 4480 |
4488 const IntType max = std::numeric_limits<IntType>::max(); | 4481 const IntType max = std::numeric_limits<IntType>::max(); |
4489 const IntType min = std::numeric_limits<IntType>::min(); | 4482 const IntType min = std::numeric_limits<IntType>::min(); |
4490 | 4483 |
4491 // Test upper bound. | 4484 // Test upper bound. |
4492 input = max; | 4485 input = max; |
4493 CHECK_EQ(max + 1, m.Call()); | 4486 CHECK_EQ(max + 1, m.Call()); |
4494 CHECK_EQ(min, input); | 4487 CHECK_EQ(min, input); |
4495 | 4488 |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4578 int32_t outputs[kInputSize]; | 4571 int32_t outputs[kInputSize]; |
4579 for (int i = 0; i < kInputSize; i++) { | 4572 for (int i = 0; i < kInputSize; i++) { |
4580 inputs[i] = i; | 4573 inputs[i] = i; |
4581 outputs[i] = -1; | 4574 outputs[i] = -1; |
4582 } | 4575 } |
4583 RawMachineAssemblerTester<int32_t*> m; | 4576 RawMachineAssemblerTester<int32_t*> m; |
4584 Node* input = m.PointerConstant(&inputs[0]); | 4577 Node* input = m.PointerConstant(&inputs[0]); |
4585 Node* output = m.PointerConstant(&outputs[kInputSize - 1]); | 4578 Node* output = m.PointerConstant(&outputs[kInputSize - 1]); |
4586 Node* elem_size = m.IntPtrConstant(sizeof(inputs[0])); | 4579 Node* elem_size = m.IntPtrConstant(sizeof(inputs[0])); |
4587 for (int i = 0; i < kInputSize; i++) { | 4580 for (int i = 0; i < kInputSize; i++) { |
4588 m.Store(StoreRepForType(kMachInt32), output, m.Load(kMachInt32, input)); | 4581 m.Store(kMachInt32, output, m.Load(kMachInt32, input), kNoWriteBarrier); |
4589 input = m.IntPtrAdd(input, elem_size); | 4582 input = m.IntPtrAdd(input, elem_size); |
4590 output = m.IntPtrSub(output, elem_size); | 4583 output = m.IntPtrSub(output, elem_size); |
4591 } | 4584 } |
4592 m.Return(input); | 4585 m.Return(input); |
4593 CHECK_EQ(&inputs[kInputSize], m.Call()); | 4586 CHECK_EQ(&inputs[kInputSize], m.Call()); |
4594 for (int i = 0; i < kInputSize; i++) { | 4587 for (int i = 0; i < kInputSize; i++) { |
4595 CHECK_EQ(i, inputs[i]); | 4588 CHECK_EQ(i, inputs[i]); |
4596 CHECK_EQ(kInputSize - i - 1, outputs[i]); | 4589 CHECK_EQ(kInputSize - i - 1, outputs[i]); |
4597 } | 4590 } |
4598 } | 4591 } |
4599 | 4592 |
4600 | 4593 |
4601 TEST(RunSpillLotsOfThings) { | 4594 TEST(RunSpillLotsOfThings) { |
4602 static const int kInputSize = 1000; | 4595 static const int kInputSize = 1000; |
4603 RawMachineAssemblerTester<int32_t> m; | 4596 RawMachineAssemblerTester<int32_t> m; |
4604 Node* accs[kInputSize]; | 4597 Node* accs[kInputSize]; |
4605 int32_t outputs[kInputSize]; | 4598 int32_t outputs[kInputSize]; |
4606 Node* one = m.Int32Constant(1); | 4599 Node* one = m.Int32Constant(1); |
4607 Node* acc = one; | 4600 Node* acc = one; |
4608 for (int i = 0; i < kInputSize; i++) { | 4601 for (int i = 0; i < kInputSize; i++) { |
4609 acc = m.Int32Add(acc, one); | 4602 acc = m.Int32Add(acc, one); |
4610 accs[i] = acc; | 4603 accs[i] = acc; |
4611 } | 4604 } |
4612 for (int i = 0; i < kInputSize; i++) { | 4605 for (int i = 0; i < kInputSize; i++) { |
4613 m.StoreToPointer(&outputs[i], StoreRepForType(kMachInt32), accs[i]); | 4606 m.StoreToPointer(&outputs[i], kMachInt32, accs[i]); |
4614 } | 4607 } |
4615 m.Return(one); | 4608 m.Return(one); |
4616 m.Call(); | 4609 m.Call(); |
4617 for (int i = 0; i < kInputSize; i++) { | 4610 for (int i = 0; i < kInputSize; i++) { |
4618 CHECK_EQ(outputs[i], i + 2); | 4611 CHECK_EQ(outputs[i], i + 2); |
4619 } | 4612 } |
4620 } | 4613 } |
4621 | 4614 |
4622 | 4615 |
4623 TEST(RunSpillConstantsAndParameters) { | 4616 TEST(RunSpillConstantsAndParameters) { |
4624 static const int kInputSize = 1000; | 4617 static const int kInputSize = 1000; |
4625 static const int32_t kBase = 987; | 4618 static const int32_t kBase = 987; |
4626 RawMachineAssemblerTester<int32_t> m(kMachInt32, kMachInt32); | 4619 RawMachineAssemblerTester<int32_t> m(kMachInt32, kMachInt32); |
4627 int32_t outputs[kInputSize]; | 4620 int32_t outputs[kInputSize]; |
4628 Node* csts[kInputSize]; | 4621 Node* csts[kInputSize]; |
4629 Node* accs[kInputSize]; | 4622 Node* accs[kInputSize]; |
4630 Node* acc = m.Int32Constant(0); | 4623 Node* acc = m.Int32Constant(0); |
4631 for (int i = 0; i < kInputSize; i++) { | 4624 for (int i = 0; i < kInputSize; i++) { |
4632 csts[i] = m.Int32Constant(static_cast<int32_t>(kBase + i)); | 4625 csts[i] = m.Int32Constant(static_cast<int32_t>(kBase + i)); |
4633 } | 4626 } |
4634 for (int i = 0; i < kInputSize; i++) { | 4627 for (int i = 0; i < kInputSize; i++) { |
4635 acc = m.Int32Add(acc, csts[i]); | 4628 acc = m.Int32Add(acc, csts[i]); |
4636 accs[i] = acc; | 4629 accs[i] = acc; |
4637 } | 4630 } |
4638 for (int i = 0; i < kInputSize; i++) { | 4631 for (int i = 0; i < kInputSize; i++) { |
4639 m.StoreToPointer(&outputs[i], StoreRepForType(kMachInt32), accs[i]); | 4632 m.StoreToPointer(&outputs[i], kMachInt32, accs[i]); |
4640 } | 4633 } |
4641 m.Return(m.Int32Add(acc, m.Int32Add(m.Parameter(0), m.Parameter(1)))); | 4634 m.Return(m.Int32Add(acc, m.Int32Add(m.Parameter(0), m.Parameter(1)))); |
4642 FOR_INT32_INPUTS(i) { | 4635 FOR_INT32_INPUTS(i) { |
4643 FOR_INT32_INPUTS(j) { | 4636 FOR_INT32_INPUTS(j) { |
4644 int32_t expected = *i + *j; | 4637 int32_t expected = *i + *j; |
4645 for (int k = 0; k < kInputSize; k++) { | 4638 for (int k = 0; k < kInputSize; k++) { |
4646 expected += kBase + k; | 4639 expected += kBase + k; |
4647 } | 4640 } |
4648 CHECK_EQ(expected, m.Call(*i, *j)); | 4641 CHECK_EQ(expected, m.Call(*i, *j)); |
4649 expected = 0; | 4642 expected = 0; |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4681 } | 4674 } |
4682 | 4675 |
4683 | 4676 |
4684 TEST(RunInt32AddWithOverflowP) { | 4677 TEST(RunInt32AddWithOverflowP) { |
4685 int32_t actual_val = -1; | 4678 int32_t actual_val = -1; |
4686 RawMachineAssemblerTester<int32_t> m; | 4679 RawMachineAssemblerTester<int32_t> m; |
4687 Int32BinopTester bt(&m); | 4680 Int32BinopTester bt(&m); |
4688 Node* add = m.Int32AddWithOverflow(bt.param0, bt.param1); | 4681 Node* add = m.Int32AddWithOverflow(bt.param0, bt.param1); |
4689 Node* val = m.Projection(0, add); | 4682 Node* val = m.Projection(0, add); |
4690 Node* ovf = m.Projection(1, add); | 4683 Node* ovf = m.Projection(1, add); |
4691 m.StoreToPointer(&actual_val, StoreRepForType(kMachInt32), val); | 4684 m.StoreToPointer(&actual_val, kMachInt32, val); |
4692 bt.AddReturn(ovf); | 4685 bt.AddReturn(ovf); |
4693 FOR_INT32_INPUTS(i) { | 4686 FOR_INT32_INPUTS(i) { |
4694 FOR_INT32_INPUTS(j) { | 4687 FOR_INT32_INPUTS(j) { |
4695 int32_t expected_val; | 4688 int32_t expected_val; |
4696 int expected_ovf = bits::SignedAddOverflow32(*i, *j, &expected_val); | 4689 int expected_ovf = bits::SignedAddOverflow32(*i, *j, &expected_val); |
4697 CHECK_EQ(expected_ovf, bt.call(*i, *j)); | 4690 CHECK_EQ(expected_ovf, bt.call(*i, *j)); |
4698 CHECK_EQ(expected_val, actual_val); | 4691 CHECK_EQ(expected_val, actual_val); |
4699 } | 4692 } |
4700 } | 4693 } |
4701 } | 4694 } |
4702 | 4695 |
4703 | 4696 |
4704 TEST(RunInt32AddWithOverflowImm) { | 4697 TEST(RunInt32AddWithOverflowImm) { |
4705 int32_t actual_val = -1, expected_val = 0; | 4698 int32_t actual_val = -1, expected_val = 0; |
4706 FOR_INT32_INPUTS(i) { | 4699 FOR_INT32_INPUTS(i) { |
4707 { | 4700 { |
4708 RawMachineAssemblerTester<int32_t> m(kMachInt32); | 4701 RawMachineAssemblerTester<int32_t> m(kMachInt32); |
4709 Node* add = m.Int32AddWithOverflow(m.Int32Constant(*i), m.Parameter(0)); | 4702 Node* add = m.Int32AddWithOverflow(m.Int32Constant(*i), m.Parameter(0)); |
4710 Node* val = m.Projection(0, add); | 4703 Node* val = m.Projection(0, add); |
4711 Node* ovf = m.Projection(1, add); | 4704 Node* ovf = m.Projection(1, add); |
4712 m.StoreToPointer(&actual_val, StoreRepForType(kMachInt32), val); | 4705 m.StoreToPointer(&actual_val, kMachInt32, val); |
4713 m.Return(ovf); | 4706 m.Return(ovf); |
4714 FOR_INT32_INPUTS(j) { | 4707 FOR_INT32_INPUTS(j) { |
4715 int expected_ovf = bits::SignedAddOverflow32(*i, *j, &expected_val); | 4708 int expected_ovf = bits::SignedAddOverflow32(*i, *j, &expected_val); |
4716 CHECK_EQ(expected_ovf, m.Call(*j)); | 4709 CHECK_EQ(expected_ovf, m.Call(*j)); |
4717 CHECK_EQ(expected_val, actual_val); | 4710 CHECK_EQ(expected_val, actual_val); |
4718 } | 4711 } |
4719 } | 4712 } |
4720 { | 4713 { |
4721 RawMachineAssemblerTester<int32_t> m(kMachInt32); | 4714 RawMachineAssemblerTester<int32_t> m(kMachInt32); |
4722 Node* add = m.Int32AddWithOverflow(m.Parameter(0), m.Int32Constant(*i)); | 4715 Node* add = m.Int32AddWithOverflow(m.Parameter(0), m.Int32Constant(*i)); |
4723 Node* val = m.Projection(0, add); | 4716 Node* val = m.Projection(0, add); |
4724 Node* ovf = m.Projection(1, add); | 4717 Node* ovf = m.Projection(1, add); |
4725 m.StoreToPointer(&actual_val, StoreRepForType(kMachInt32), val); | 4718 m.StoreToPointer(&actual_val, kMachInt32, val); |
4726 m.Return(ovf); | 4719 m.Return(ovf); |
4727 FOR_INT32_INPUTS(j) { | 4720 FOR_INT32_INPUTS(j) { |
4728 int expected_ovf = bits::SignedAddOverflow32(*i, *j, &expected_val); | 4721 int expected_ovf = bits::SignedAddOverflow32(*i, *j, &expected_val); |
4729 CHECK_EQ(expected_ovf, m.Call(*j)); | 4722 CHECK_EQ(expected_ovf, m.Call(*j)); |
4730 CHECK_EQ(expected_val, actual_val); | 4723 CHECK_EQ(expected_val, actual_val); |
4731 } | 4724 } |
4732 } | 4725 } |
4733 FOR_INT32_INPUTS(j) { | 4726 FOR_INT32_INPUTS(j) { |
4734 RawMachineAssemblerTester<int32_t> m; | 4727 RawMachineAssemblerTester<int32_t> m; |
4735 Node* add = | 4728 Node* add = |
4736 m.Int32AddWithOverflow(m.Int32Constant(*i), m.Int32Constant(*j)); | 4729 m.Int32AddWithOverflow(m.Int32Constant(*i), m.Int32Constant(*j)); |
4737 Node* val = m.Projection(0, add); | 4730 Node* val = m.Projection(0, add); |
4738 Node* ovf = m.Projection(1, add); | 4731 Node* ovf = m.Projection(1, add); |
4739 m.StoreToPointer(&actual_val, StoreRepForType(kMachInt32), val); | 4732 m.StoreToPointer(&actual_val, kMachInt32, val); |
4740 m.Return(ovf); | 4733 m.Return(ovf); |
4741 int expected_ovf = bits::SignedAddOverflow32(*i, *j, &expected_val); | 4734 int expected_ovf = bits::SignedAddOverflow32(*i, *j, &expected_val); |
4742 CHECK_EQ(expected_ovf, m.Call()); | 4735 CHECK_EQ(expected_ovf, m.Call()); |
4743 CHECK_EQ(expected_val, actual_val); | 4736 CHECK_EQ(expected_val, actual_val); |
4744 } | 4737 } |
4745 } | 4738 } |
4746 } | 4739 } |
4747 | 4740 |
4748 | 4741 |
4749 TEST(RunInt32AddWithOverflowInBranchP) { | 4742 TEST(RunInt32AddWithOverflowInBranchP) { |
(...skipping 19 matching lines...) Expand all Loading... |
4769 } | 4762 } |
4770 | 4763 |
4771 | 4764 |
4772 TEST(RunInt32SubWithOverflowP) { | 4765 TEST(RunInt32SubWithOverflowP) { |
4773 int32_t actual_val = -1; | 4766 int32_t actual_val = -1; |
4774 RawMachineAssemblerTester<int32_t> m; | 4767 RawMachineAssemblerTester<int32_t> m; |
4775 Int32BinopTester bt(&m); | 4768 Int32BinopTester bt(&m); |
4776 Node* add = m.Int32SubWithOverflow(bt.param0, bt.param1); | 4769 Node* add = m.Int32SubWithOverflow(bt.param0, bt.param1); |
4777 Node* val = m.Projection(0, add); | 4770 Node* val = m.Projection(0, add); |
4778 Node* ovf = m.Projection(1, add); | 4771 Node* ovf = m.Projection(1, add); |
4779 m.StoreToPointer(&actual_val, StoreRepForType(kMachInt32), val); | 4772 m.StoreToPointer(&actual_val, kMachInt32, val); |
4780 bt.AddReturn(ovf); | 4773 bt.AddReturn(ovf); |
4781 FOR_INT32_INPUTS(i) { | 4774 FOR_INT32_INPUTS(i) { |
4782 FOR_INT32_INPUTS(j) { | 4775 FOR_INT32_INPUTS(j) { |
4783 int32_t expected_val; | 4776 int32_t expected_val; |
4784 int expected_ovf = bits::SignedSubOverflow32(*i, *j, &expected_val); | 4777 int expected_ovf = bits::SignedSubOverflow32(*i, *j, &expected_val); |
4785 CHECK_EQ(expected_ovf, bt.call(*i, *j)); | 4778 CHECK_EQ(expected_ovf, bt.call(*i, *j)); |
4786 CHECK_EQ(expected_val, actual_val); | 4779 CHECK_EQ(expected_val, actual_val); |
4787 } | 4780 } |
4788 } | 4781 } |
4789 } | 4782 } |
4790 | 4783 |
4791 | 4784 |
4792 TEST(RunInt32SubWithOverflowImm) { | 4785 TEST(RunInt32SubWithOverflowImm) { |
4793 int32_t actual_val = -1, expected_val = 0; | 4786 int32_t actual_val = -1, expected_val = 0; |
4794 FOR_INT32_INPUTS(i) { | 4787 FOR_INT32_INPUTS(i) { |
4795 { | 4788 { |
4796 RawMachineAssemblerTester<int32_t> m(kMachInt32); | 4789 RawMachineAssemblerTester<int32_t> m(kMachInt32); |
4797 Node* add = m.Int32SubWithOverflow(m.Int32Constant(*i), m.Parameter(0)); | 4790 Node* add = m.Int32SubWithOverflow(m.Int32Constant(*i), m.Parameter(0)); |
4798 Node* val = m.Projection(0, add); | 4791 Node* val = m.Projection(0, add); |
4799 Node* ovf = m.Projection(1, add); | 4792 Node* ovf = m.Projection(1, add); |
4800 m.StoreToPointer(&actual_val, StoreRepForType(kMachInt32), val); | 4793 m.StoreToPointer(&actual_val, kMachInt32, val); |
4801 m.Return(ovf); | 4794 m.Return(ovf); |
4802 FOR_INT32_INPUTS(j) { | 4795 FOR_INT32_INPUTS(j) { |
4803 int expected_ovf = bits::SignedSubOverflow32(*i, *j, &expected_val); | 4796 int expected_ovf = bits::SignedSubOverflow32(*i, *j, &expected_val); |
4804 CHECK_EQ(expected_ovf, m.Call(*j)); | 4797 CHECK_EQ(expected_ovf, m.Call(*j)); |
4805 CHECK_EQ(expected_val, actual_val); | 4798 CHECK_EQ(expected_val, actual_val); |
4806 } | 4799 } |
4807 } | 4800 } |
4808 { | 4801 { |
4809 RawMachineAssemblerTester<int32_t> m(kMachInt32); | 4802 RawMachineAssemblerTester<int32_t> m(kMachInt32); |
4810 Node* add = m.Int32SubWithOverflow(m.Parameter(0), m.Int32Constant(*i)); | 4803 Node* add = m.Int32SubWithOverflow(m.Parameter(0), m.Int32Constant(*i)); |
4811 Node* val = m.Projection(0, add); | 4804 Node* val = m.Projection(0, add); |
4812 Node* ovf = m.Projection(1, add); | 4805 Node* ovf = m.Projection(1, add); |
4813 m.StoreToPointer(&actual_val, StoreRepForType(kMachInt32), val); | 4806 m.StoreToPointer(&actual_val, kMachInt32, val); |
4814 m.Return(ovf); | 4807 m.Return(ovf); |
4815 FOR_INT32_INPUTS(j) { | 4808 FOR_INT32_INPUTS(j) { |
4816 int expected_ovf = bits::SignedSubOverflow32(*j, *i, &expected_val); | 4809 int expected_ovf = bits::SignedSubOverflow32(*j, *i, &expected_val); |
4817 CHECK_EQ(expected_ovf, m.Call(*j)); | 4810 CHECK_EQ(expected_ovf, m.Call(*j)); |
4818 CHECK_EQ(expected_val, actual_val); | 4811 CHECK_EQ(expected_val, actual_val); |
4819 } | 4812 } |
4820 } | 4813 } |
4821 FOR_INT32_INPUTS(j) { | 4814 FOR_INT32_INPUTS(j) { |
4822 RawMachineAssemblerTester<int32_t> m; | 4815 RawMachineAssemblerTester<int32_t> m; |
4823 Node* add = | 4816 Node* add = |
4824 m.Int32SubWithOverflow(m.Int32Constant(*i), m.Int32Constant(*j)); | 4817 m.Int32SubWithOverflow(m.Int32Constant(*i), m.Int32Constant(*j)); |
4825 Node* val = m.Projection(0, add); | 4818 Node* val = m.Projection(0, add); |
4826 Node* ovf = m.Projection(1, add); | 4819 Node* ovf = m.Projection(1, add); |
4827 m.StoreToPointer(&actual_val, StoreRepForType(kMachInt32), val); | 4820 m.StoreToPointer(&actual_val, kMachInt32, val); |
4828 m.Return(ovf); | 4821 m.Return(ovf); |
4829 int expected_ovf = bits::SignedSubOverflow32(*i, *j, &expected_val); | 4822 int expected_ovf = bits::SignedSubOverflow32(*i, *j, &expected_val); |
4830 CHECK_EQ(expected_ovf, m.Call()); | 4823 CHECK_EQ(expected_ovf, m.Call()); |
4831 CHECK_EQ(expected_val, actual_val); | 4824 CHECK_EQ(expected_val, actual_val); |
4832 } | 4825 } |
4833 } | 4826 } |
4834 } | 4827 } |
4835 | 4828 |
4836 | 4829 |
4837 TEST(RunInt32SubWithOverflowInBranchP) { | 4830 TEST(RunInt32SubWithOverflowInBranchP) { |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4874 CHECK_EQ(2, m.Call()); | 4867 CHECK_EQ(2, m.Call()); |
4875 input = V8_INT64_C(0x100000000); | 4868 input = V8_INT64_C(0x100000000); |
4876 CHECK_EQ(2, m.Call()); | 4869 CHECK_EQ(2, m.Call()); |
4877 } | 4870 } |
4878 | 4871 |
4879 | 4872 |
4880 TEST(RunChangeInt32ToInt64P) { | 4873 TEST(RunChangeInt32ToInt64P) { |
4881 if (kPointerSize < 8) return; | 4874 if (kPointerSize < 8) return; |
4882 int64_t actual = -1; | 4875 int64_t actual = -1; |
4883 RawMachineAssemblerTester<int32_t> m(kMachInt32); | 4876 RawMachineAssemblerTester<int32_t> m(kMachInt32); |
4884 m.StoreToPointer(&actual, StoreRepForType(kMachInt64), | 4877 m.StoreToPointer(&actual, kMachInt64, m.ChangeInt32ToInt64(m.Parameter(0))); |
4885 m.ChangeInt32ToInt64(m.Parameter(0))); | |
4886 m.Return(m.Int32Constant(0)); | 4878 m.Return(m.Int32Constant(0)); |
4887 FOR_INT32_INPUTS(i) { | 4879 FOR_INT32_INPUTS(i) { |
4888 int64_t expected = *i; | 4880 int64_t expected = *i; |
4889 CHECK_EQ(0, m.Call(*i)); | 4881 CHECK_EQ(0, m.Call(*i)); |
4890 CHECK_EQ(expected, actual); | 4882 CHECK_EQ(expected, actual); |
4891 } | 4883 } |
4892 } | 4884 } |
4893 | 4885 |
4894 | 4886 |
4895 TEST(RunChangeUint32ToUint64P) { | 4887 TEST(RunChangeUint32ToUint64P) { |
4896 if (kPointerSize < 8) return; | 4888 if (kPointerSize < 8) return; |
4897 int64_t actual = -1; | 4889 int64_t actual = -1; |
4898 RawMachineAssemblerTester<int32_t> m(kMachUint32); | 4890 RawMachineAssemblerTester<int32_t> m(kMachUint32); |
4899 m.StoreToPointer(&actual, StoreRepForType(kMachUint64), | 4891 m.StoreToPointer(&actual, kMachUint64, |
4900 m.ChangeUint32ToUint64(m.Parameter(0))); | 4892 m.ChangeUint32ToUint64(m.Parameter(0))); |
4901 m.Return(m.Int32Constant(0)); | 4893 m.Return(m.Int32Constant(0)); |
4902 FOR_UINT32_INPUTS(i) { | 4894 FOR_UINT32_INPUTS(i) { |
4903 int64_t expected = static_cast<uint64_t>(*i); | 4895 int64_t expected = static_cast<uint64_t>(*i); |
4904 CHECK_EQ(0, m.Call(*i)); | 4896 CHECK_EQ(0, m.Call(*i)); |
4905 CHECK_EQ(expected, actual); | 4897 CHECK_EQ(expected, actual); |
4906 } | 4898 } |
4907 } | 4899 } |
4908 | 4900 |
4909 | 4901 |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4990 CHECK_EQ(static_cast<int>(expected), m.Call()); | 4982 CHECK_EQ(static_cast<int>(expected), m.Call()); |
4991 } | 4983 } |
4992 } | 4984 } |
4993 | 4985 |
4994 | 4986 |
4995 TEST(RunChangeFloat32ToFloat64) { | 4987 TEST(RunChangeFloat32ToFloat64) { |
4996 double actual = 0.0f; | 4988 double actual = 0.0f; |
4997 float expected = 0.0; | 4989 float expected = 0.0; |
4998 RawMachineAssemblerTester<int32_t> m; | 4990 RawMachineAssemblerTester<int32_t> m; |
4999 m.StoreToPointer( | 4991 m.StoreToPointer( |
5000 &actual, StoreRepForType(kMachFloat64), | 4992 &actual, kMachFloat64, |
5001 m.ChangeFloat32ToFloat64(m.LoadFromPointer(&expected, kMachFloat32))); | 4993 m.ChangeFloat32ToFloat64(m.LoadFromPointer(&expected, kMachFloat32))); |
5002 m.Return(m.Int32Constant(0)); | 4994 m.Return(m.Int32Constant(0)); |
5003 FOR_FLOAT32_INPUTS(i) { | 4995 FOR_FLOAT32_INPUTS(i) { |
5004 expected = *i; | 4996 expected = *i; |
5005 CHECK_EQ(0, m.Call()); | 4997 CHECK_EQ(0, m.Call()); |
5006 CHECK_EQ(static_cast<double>(expected), actual); | 4998 CHECK_EQ(static_cast<double>(expected), actual); |
5007 } | 4999 } |
5008 } | 5000 } |
5009 | 5001 |
5010 | 5002 |
5011 TEST(RunChangeFloat32ToFloat64_spilled) { | 5003 TEST(RunChangeFloat32ToFloat64_spilled) { |
5012 RawMachineAssemblerTester<int32_t> m; | 5004 RawMachineAssemblerTester<int32_t> m; |
5013 const int kNumInputs = 32; | 5005 const int kNumInputs = 32; |
5014 int32_t magic = 0x786234; | 5006 int32_t magic = 0x786234; |
5015 float input[kNumInputs]; | 5007 float input[kNumInputs]; |
5016 double result[kNumInputs]; | 5008 double result[kNumInputs]; |
5017 Node* input_node[kNumInputs]; | 5009 Node* input_node[kNumInputs]; |
5018 | 5010 |
5019 for (int i = 0; i < kNumInputs; i++) { | 5011 for (int i = 0; i < kNumInputs; i++) { |
5020 input_node[i] = | 5012 input_node[i] = |
5021 m.Load(kMachFloat32, m.PointerConstant(&input), m.Int32Constant(i * 4)); | 5013 m.Load(kMachFloat32, m.PointerConstant(&input), m.Int32Constant(i * 4)); |
5022 } | 5014 } |
5023 | 5015 |
5024 for (int i = 0; i < kNumInputs; i++) { | 5016 for (int i = 0; i < kNumInputs; i++) { |
5025 m.Store(StoreRepForType(kMachFloat64), m.PointerConstant(&result), | 5017 m.Store(kMachFloat64, m.PointerConstant(&result), m.Int32Constant(i * 8), |
5026 m.Int32Constant(i * 8), m.ChangeFloat32ToFloat64(input_node[i])); | 5018 m.ChangeFloat32ToFloat64(input_node[i]), kNoWriteBarrier); |
5027 } | 5019 } |
5028 | 5020 |
5029 m.Return(m.Int32Constant(magic)); | 5021 m.Return(m.Int32Constant(magic)); |
5030 | 5022 |
5031 for (int i = 0; i < kNumInputs; i++) { | 5023 for (int i = 0; i < kNumInputs; i++) { |
5032 input[i] = 100.9f + i; | 5024 input[i] = 100.9f + i; |
5033 } | 5025 } |
5034 | 5026 |
5035 CHECK_EQ(magic, m.Call()); | 5027 CHECK_EQ(magic, m.Call()); |
5036 | 5028 |
5037 for (int i = 0; i < kNumInputs; i++) { | 5029 for (int i = 0; i < kNumInputs; i++) { |
5038 CHECK_EQ(result[i], static_cast<double>(input[i])); | 5030 CHECK_EQ(result[i], static_cast<double>(input[i])); |
5039 } | 5031 } |
5040 } | 5032 } |
5041 | 5033 |
5042 | 5034 |
5043 TEST(RunTruncateFloat64ToFloat32) { | 5035 TEST(RunTruncateFloat64ToFloat32) { |
5044 float actual = 0.0f; | 5036 float actual = 0.0f; |
5045 double input = 0.0; | 5037 double input = 0.0; |
5046 RawMachineAssemblerTester<int32_t> m; | 5038 RawMachineAssemblerTester<int32_t> m; |
5047 m.StoreToPointer( | 5039 m.StoreToPointer( |
5048 &actual, StoreRepForType(kMachFloat32), | 5040 &actual, kMachFloat32, |
5049 m.TruncateFloat64ToFloat32(m.LoadFromPointer(&input, kMachFloat64))); | 5041 m.TruncateFloat64ToFloat32(m.LoadFromPointer(&input, kMachFloat64))); |
5050 m.Return(m.Int32Constant(0)); | 5042 m.Return(m.Int32Constant(0)); |
5051 FOR_FLOAT64_INPUTS(i) { | 5043 FOR_FLOAT64_INPUTS(i) { |
5052 input = *i; | 5044 input = *i; |
5053 volatile double expected = DoubleToFloat32(input); | 5045 volatile double expected = DoubleToFloat32(input); |
5054 CHECK_EQ(0, m.Call()); | 5046 CHECK_EQ(0, m.Call()); |
5055 CheckDoubleEq(expected, actual); | 5047 CheckDoubleEq(expected, actual); |
5056 } | 5048 } |
5057 } | 5049 } |
5058 | 5050 |
5059 | 5051 |
5060 TEST(RunFloat32Constant) { | 5052 TEST(RunFloat32Constant) { |
5061 FOR_FLOAT32_INPUTS(i) { | 5053 FOR_FLOAT32_INPUTS(i) { |
5062 float expected = *i; | 5054 float expected = *i; |
5063 float actual = *i; | 5055 float actual = *i; |
5064 RawMachineAssemblerTester<int32_t> m; | 5056 RawMachineAssemblerTester<int32_t> m; |
5065 m.StoreToPointer(&actual, StoreRepForType(kMachFloat32), | 5057 m.StoreToPointer(&actual, kMachFloat32, m.Float32Constant(expected)); |
5066 m.Float32Constant(expected)); | |
5067 m.Return(m.Int32Constant(0)); | 5058 m.Return(m.Int32Constant(0)); |
5068 CHECK_EQ(0, m.Call()); | 5059 CHECK_EQ(0, m.Call()); |
5069 CHECK_EQ(expected, actual); | 5060 CHECK_EQ(expected, actual); |
5070 } | 5061 } |
5071 } | 5062 } |
5072 | 5063 |
5073 | 5064 |
5074 TEST(RunFloat64ExtractLowWord32) { | 5065 TEST(RunFloat64ExtractLowWord32) { |
5075 uint64_t input = 0; | 5066 uint64_t input = 0; |
5076 RawMachineAssemblerTester<int32_t> m; | 5067 RawMachineAssemblerTester<int32_t> m; |
(...skipping 16 matching lines...) Expand all Loading... |
5093 CHECK_EQ(expected, m.Call()); | 5084 CHECK_EQ(expected, m.Call()); |
5094 } | 5085 } |
5095 } | 5086 } |
5096 | 5087 |
5097 | 5088 |
5098 TEST(RunFloat64InsertLowWord32) { | 5089 TEST(RunFloat64InsertLowWord32) { |
5099 uint64_t input = 0; | 5090 uint64_t input = 0; |
5100 uint64_t result = 0; | 5091 uint64_t result = 0; |
5101 RawMachineAssemblerTester<int32_t> m(kMachInt32); | 5092 RawMachineAssemblerTester<int32_t> m(kMachInt32); |
5102 m.StoreToPointer( | 5093 m.StoreToPointer( |
5103 &result, StoreRepForType(kMachFloat64), | 5094 &result, kMachFloat64, |
5104 m.Float64InsertLowWord32(m.LoadFromPointer(&input, kMachFloat64), | 5095 m.Float64InsertLowWord32(m.LoadFromPointer(&input, kMachFloat64), |
5105 m.Parameter(0))); | 5096 m.Parameter(0))); |
5106 m.Return(m.Int32Constant(0)); | 5097 m.Return(m.Int32Constant(0)); |
5107 FOR_FLOAT64_INPUTS(i) { | 5098 FOR_FLOAT64_INPUTS(i) { |
5108 FOR_INT32_INPUTS(j) { | 5099 FOR_INT32_INPUTS(j) { |
5109 input = bit_cast<uint64_t>(*i); | 5100 input = bit_cast<uint64_t>(*i); |
5110 uint64_t expected = (input & ~(V8_UINT64_C(0xFFFFFFFF))) | | 5101 uint64_t expected = (input & ~(V8_UINT64_C(0xFFFFFFFF))) | |
5111 (static_cast<uint64_t>(bit_cast<uint32_t>(*j))); | 5102 (static_cast<uint64_t>(bit_cast<uint32_t>(*j))); |
5112 CHECK_EQ(0, m.Call(*j)); | 5103 CHECK_EQ(0, m.Call(*j)); |
5113 CHECK_EQ(expected, result); | 5104 CHECK_EQ(expected, result); |
5114 } | 5105 } |
5115 } | 5106 } |
5116 } | 5107 } |
5117 | 5108 |
5118 | 5109 |
5119 TEST(RunFloat64InsertHighWord32) { | 5110 TEST(RunFloat64InsertHighWord32) { |
5120 uint64_t input = 0; | 5111 uint64_t input = 0; |
5121 uint64_t result = 0; | 5112 uint64_t result = 0; |
5122 RawMachineAssemblerTester<int32_t> m(kMachInt32); | 5113 RawMachineAssemblerTester<int32_t> m(kMachInt32); |
5123 m.StoreToPointer( | 5114 m.StoreToPointer( |
5124 &result, StoreRepForType(kMachFloat64), | 5115 &result, kMachFloat64, |
5125 m.Float64InsertHighWord32(m.LoadFromPointer(&input, kMachFloat64), | 5116 m.Float64InsertHighWord32(m.LoadFromPointer(&input, kMachFloat64), |
5126 m.Parameter(0))); | 5117 m.Parameter(0))); |
5127 m.Return(m.Int32Constant(0)); | 5118 m.Return(m.Int32Constant(0)); |
5128 FOR_FLOAT64_INPUTS(i) { | 5119 FOR_FLOAT64_INPUTS(i) { |
5129 FOR_INT32_INPUTS(j) { | 5120 FOR_INT32_INPUTS(j) { |
5130 input = bit_cast<uint64_t>(*i); | 5121 input = bit_cast<uint64_t>(*i); |
5131 uint64_t expected = (input & ~(V8_UINT64_C(0xFFFFFFFF) << 32)) | | 5122 uint64_t expected = (input & ~(V8_UINT64_C(0xFFFFFFFF) << 32)) | |
5132 (static_cast<uint64_t>(bit_cast<uint32_t>(*j)) << 32); | 5123 (static_cast<uint64_t>(bit_cast<uint32_t>(*j)) << 32); |
5133 CHECK_EQ(0, m.Call(*j)); | 5124 CHECK_EQ(0, m.Call(*j)); |
5134 CHECK_EQ(expected, result); | 5125 CHECK_EQ(expected, result); |
5135 } | 5126 } |
5136 } | 5127 } |
5137 } | 5128 } |
5138 | 5129 |
5139 | 5130 |
5140 TEST(RunFloat32Abs) { | 5131 TEST(RunFloat32Abs) { |
5141 float input = -1.0; | 5132 float input = -1.0; |
5142 float result = 0.0; | 5133 float result = 0.0; |
5143 RawMachineAssemblerTester<int32_t> m; | 5134 RawMachineAssemblerTester<int32_t> m; |
5144 m.StoreToPointer(&result, StoreRepForType(kMachFloat32), | 5135 m.StoreToPointer(&result, kMachFloat32, |
5145 m.Float32Abs(m.LoadFromPointer(&input, kMachFloat32))); | 5136 m.Float32Abs(m.LoadFromPointer(&input, kMachFloat32))); |
5146 m.Return(m.Int32Constant(0)); | 5137 m.Return(m.Int32Constant(0)); |
5147 FOR_FLOAT32_INPUTS(i) { | 5138 FOR_FLOAT32_INPUTS(i) { |
5148 input = *i; | 5139 input = *i; |
5149 float expected = std::abs(input); | 5140 float expected = std::abs(input); |
5150 CHECK_EQ(0, m.Call()); | 5141 CHECK_EQ(0, m.Call()); |
5151 CheckFloatEq(expected, result); | 5142 CheckFloatEq(expected, result); |
5152 } | 5143 } |
5153 } | 5144 } |
5154 | 5145 |
5155 | 5146 |
5156 TEST(RunFloat64Abs) { | 5147 TEST(RunFloat64Abs) { |
5157 double input = -1.0; | 5148 double input = -1.0; |
5158 double result = 0.0; | 5149 double result = 0.0; |
5159 RawMachineAssemblerTester<int32_t> m; | 5150 RawMachineAssemblerTester<int32_t> m; |
5160 m.StoreToPointer(&result, StoreRepForType(kMachFloat64), | 5151 m.StoreToPointer(&result, kMachFloat64, |
5161 m.Float64Abs(m.LoadFromPointer(&input, kMachFloat64))); | 5152 m.Float64Abs(m.LoadFromPointer(&input, kMachFloat64))); |
5162 m.Return(m.Int32Constant(0)); | 5153 m.Return(m.Int32Constant(0)); |
5163 FOR_FLOAT64_INPUTS(i) { | 5154 FOR_FLOAT64_INPUTS(i) { |
5164 input = *i; | 5155 input = *i; |
5165 double expected = std::abs(input); | 5156 double expected = std::abs(input); |
5166 CHECK_EQ(0, m.Call()); | 5157 CHECK_EQ(0, m.Call()); |
5167 CheckDoubleEq(expected, result); | 5158 CheckDoubleEq(expected, result); |
5168 } | 5159 } |
5169 } | 5160 } |
5170 | 5161 |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5265 -two_52 + 1 - 0.1, | 5256 -two_52 + 1 - 0.1, |
5266 -two_52 + 1 - 0.5, | 5257 -two_52 + 1 - 0.5, |
5267 -two_52 + 1 - 0.7}; | 5258 -two_52 + 1 - 0.7}; |
5268 | 5259 |
5269 | 5260 |
5270 TEST(RunFloat64RoundDown1) { | 5261 TEST(RunFloat64RoundDown1) { |
5271 double input = -1.0; | 5262 double input = -1.0; |
5272 double result = 0.0; | 5263 double result = 0.0; |
5273 RawMachineAssemblerTester<int32_t> m; | 5264 RawMachineAssemblerTester<int32_t> m; |
5274 if (!m.machine()->Float64RoundDown().IsSupported()) return; | 5265 if (!m.machine()->Float64RoundDown().IsSupported()) return; |
5275 m.StoreToPointer(&result, StoreRepForType(kMachFloat64), | 5266 m.StoreToPointer(&result, kMachFloat64, |
5276 m.Float64RoundDown(m.LoadFromPointer(&input, kMachFloat64))); | 5267 m.Float64RoundDown(m.LoadFromPointer(&input, kMachFloat64))); |
5277 m.Return(m.Int32Constant(0)); | 5268 m.Return(m.Int32Constant(0)); |
5278 for (size_t i = 0; i < arraysize(kValues); ++i) { | 5269 for (size_t i = 0; i < arraysize(kValues); ++i) { |
5279 input = kValues[i]; | 5270 input = kValues[i]; |
5280 CHECK_EQ(0, m.Call()); | 5271 CHECK_EQ(0, m.Call()); |
5281 double expected = std::floor(kValues[i]); | 5272 double expected = std::floor(kValues[i]); |
5282 CHECK_EQ(expected, result); | 5273 CHECK_EQ(expected, result); |
5283 } | 5274 } |
5284 } | 5275 } |
5285 | 5276 |
5286 | 5277 |
5287 TEST(RunFloat64RoundDown2) { | 5278 TEST(RunFloat64RoundDown2) { |
5288 double input = -1.0; | 5279 double input = -1.0; |
5289 double result = 0.0; | 5280 double result = 0.0; |
5290 RawMachineAssemblerTester<int32_t> m; | 5281 RawMachineAssemblerTester<int32_t> m; |
5291 if (!m.machine()->Float64RoundDown().IsSupported()) return; | 5282 if (!m.machine()->Float64RoundDown().IsSupported()) return; |
5292 m.StoreToPointer(&result, StoreRepForType(kMachFloat64), | 5283 m.StoreToPointer(&result, kMachFloat64, |
5293 m.Float64Sub(m.Float64Constant(-0.0), | 5284 m.Float64Sub(m.Float64Constant(-0.0), |
5294 m.Float64RoundDown(m.Float64Sub( | 5285 m.Float64RoundDown(m.Float64Sub( |
5295 m.Float64Constant(-0.0), | 5286 m.Float64Constant(-0.0), |
5296 m.LoadFromPointer(&input, kMachFloat64))))); | 5287 m.LoadFromPointer(&input, kMachFloat64))))); |
5297 m.Return(m.Int32Constant(0)); | 5288 m.Return(m.Int32Constant(0)); |
5298 for (size_t i = 0; i < arraysize(kValues); ++i) { | 5289 for (size_t i = 0; i < arraysize(kValues); ++i) { |
5299 input = kValues[i]; | 5290 input = kValues[i]; |
5300 CHECK_EQ(0, m.Call()); | 5291 CHECK_EQ(0, m.Call()); |
5301 double expected = std::ceil(kValues[i]); | 5292 double expected = std::ceil(kValues[i]); |
5302 CHECK_EQ(expected, result); | 5293 CHECK_EQ(expected, result); |
5303 } | 5294 } |
5304 } | 5295 } |
5305 | 5296 |
5306 | 5297 |
5307 TEST(RunFloat64RoundTruncate) { | 5298 TEST(RunFloat64RoundTruncate) { |
5308 double input = -1.0; | 5299 double input = -1.0; |
5309 double result = 0.0; | 5300 double result = 0.0; |
5310 RawMachineAssemblerTester<int32_t> m; | 5301 RawMachineAssemblerTester<int32_t> m; |
5311 if (!m.machine()->Float64RoundTruncate().IsSupported()) return; | 5302 if (!m.machine()->Float64RoundTruncate().IsSupported()) return; |
5312 m.StoreToPointer( | 5303 m.StoreToPointer( |
5313 &result, StoreRepForType(kMachFloat64), | 5304 &result, kMachFloat64, |
5314 m.Float64RoundTruncate(m.LoadFromPointer(&input, kMachFloat64))); | 5305 m.Float64RoundTruncate(m.LoadFromPointer(&input, kMachFloat64))); |
5315 m.Return(m.Int32Constant(0)); | 5306 m.Return(m.Int32Constant(0)); |
5316 for (size_t i = 0; i < arraysize(kValues); ++i) { | 5307 for (size_t i = 0; i < arraysize(kValues); ++i) { |
5317 input = kValues[i]; | 5308 input = kValues[i]; |
5318 CHECK_EQ(0, m.Call()); | 5309 CHECK_EQ(0, m.Call()); |
5319 double expected = trunc(kValues[i]); | 5310 double expected = trunc(kValues[i]); |
5320 CHECK_EQ(expected, result); | 5311 CHECK_EQ(expected, result); |
5321 } | 5312 } |
5322 } | 5313 } |
5323 | 5314 |
5324 | 5315 |
5325 TEST(RunFloat64RoundTiesAway) { | 5316 TEST(RunFloat64RoundTiesAway) { |
5326 double input = -1.0; | 5317 double input = -1.0; |
5327 double result = 0.0; | 5318 double result = 0.0; |
5328 RawMachineAssemblerTester<int32_t> m; | 5319 RawMachineAssemblerTester<int32_t> m; |
5329 if (!m.machine()->Float64RoundTiesAway().IsSupported()) return; | 5320 if (!m.machine()->Float64RoundTiesAway().IsSupported()) return; |
5330 m.StoreToPointer( | 5321 m.StoreToPointer( |
5331 &result, StoreRepForType(kMachFloat64), | 5322 &result, kMachFloat64, |
5332 m.Float64RoundTiesAway(m.LoadFromPointer(&input, kMachFloat64))); | 5323 m.Float64RoundTiesAway(m.LoadFromPointer(&input, kMachFloat64))); |
5333 m.Return(m.Int32Constant(0)); | 5324 m.Return(m.Int32Constant(0)); |
5334 for (size_t i = 0; i < arraysize(kValues); ++i) { | 5325 for (size_t i = 0; i < arraysize(kValues); ++i) { |
5335 input = kValues[i]; | 5326 input = kValues[i]; |
5336 CHECK_EQ(0, m.Call()); | 5327 CHECK_EQ(0, m.Call()); |
5337 double expected = round(kValues[i]); | 5328 double expected = round(kValues[i]); |
5338 CHECK_EQ(expected, result); | 5329 CHECK_EQ(expected, result); |
5339 } | 5330 } |
5340 } | 5331 } |
5341 | 5332 |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5461 CHECK_EQ(write, buffer[0]); | 5452 CHECK_EQ(write, buffer[0]); |
5462 CHECK_EQ(write, buffer[1]); | 5453 CHECK_EQ(write, buffer[1]); |
5463 } | 5454 } |
5464 | 5455 |
5465 | 5456 |
5466 TEST(RunBitcastInt64ToFloat64) { | 5457 TEST(RunBitcastInt64ToFloat64) { |
5467 int64_t input = 1; | 5458 int64_t input = 1; |
5468 double output = 0.0; | 5459 double output = 0.0; |
5469 RawMachineAssemblerTester<int32_t> m; | 5460 RawMachineAssemblerTester<int32_t> m; |
5470 m.StoreToPointer( | 5461 m.StoreToPointer( |
5471 &output, StoreRepForType(kMachFloat64), | 5462 &output, kMachFloat64, |
5472 m.BitcastInt64ToFloat64(m.LoadFromPointer(&input, kMachInt64))); | 5463 m.BitcastInt64ToFloat64(m.LoadFromPointer(&input, kMachInt64))); |
5473 m.Return(m.Int32Constant(11)); | 5464 m.Return(m.Int32Constant(11)); |
5474 FOR_INT64_INPUTS(i) { | 5465 FOR_INT64_INPUTS(i) { |
5475 input = *i; | 5466 input = *i; |
5476 CHECK_EQ(11, m.Call()); | 5467 CHECK_EQ(11, m.Call()); |
5477 double expected = bit_cast<double>(input); | 5468 double expected = bit_cast<double>(input); |
5478 CHECK_EQ(bit_cast<int64_t>(expected), bit_cast<int64_t>(output)); | 5469 CHECK_EQ(bit_cast<int64_t>(expected), bit_cast<int64_t>(output)); |
5479 } | 5470 } |
5480 } | 5471 } |
5481 | 5472 |
5482 | 5473 |
5483 TEST(RunBitcastFloat64ToInt64) { | 5474 TEST(RunBitcastFloat64ToInt64) { |
5484 double input = 0; | 5475 double input = 0; |
5485 int64_t output = 0; | 5476 int64_t output = 0; |
5486 RawMachineAssemblerTester<int32_t> m; | 5477 RawMachineAssemblerTester<int32_t> m; |
5487 m.StoreToPointer( | 5478 m.StoreToPointer( |
5488 &output, StoreRepForType(kMachInt64), | 5479 &output, kMachInt64, |
5489 m.BitcastFloat64ToInt64(m.LoadFromPointer(&input, kMachFloat64))); | 5480 m.BitcastFloat64ToInt64(m.LoadFromPointer(&input, kMachFloat64))); |
5490 m.Return(m.Int32Constant(11)); | 5481 m.Return(m.Int32Constant(11)); |
5491 FOR_FLOAT64_INPUTS(i) { | 5482 FOR_FLOAT64_INPUTS(i) { |
5492 input = *i; | 5483 input = *i; |
5493 CHECK_EQ(11, m.Call()); | 5484 CHECK_EQ(11, m.Call()); |
5494 double expected = bit_cast<int64_t>(input); | 5485 double expected = bit_cast<int64_t>(input); |
5495 CHECK_EQ(expected, output); | 5486 CHECK_EQ(expected, output); |
5496 } | 5487 } |
5497 } | 5488 } |
5498 #endif | 5489 #endif |
5499 | 5490 |
5500 | 5491 |
5501 TEST(RunBitcastFloat32ToInt32) { | 5492 TEST(RunBitcastFloat32ToInt32) { |
5502 float input = 32.25; | 5493 float input = 32.25; |
5503 RawMachineAssemblerTester<int32_t> m; | 5494 RawMachineAssemblerTester<int32_t> m; |
5504 m.Return(m.BitcastFloat32ToInt32(m.LoadFromPointer(&input, kMachFloat32))); | 5495 m.Return(m.BitcastFloat32ToInt32(m.LoadFromPointer(&input, kMachFloat32))); |
5505 FOR_FLOAT32_INPUTS(i) { | 5496 FOR_FLOAT32_INPUTS(i) { |
5506 input = *i; | 5497 input = *i; |
5507 int32_t expected = bit_cast<int32_t>(input); | 5498 int32_t expected = bit_cast<int32_t>(input); |
5508 CHECK_EQ(expected, m.Call()); | 5499 CHECK_EQ(expected, m.Call()); |
5509 } | 5500 } |
5510 } | 5501 } |
5511 | 5502 |
5512 | 5503 |
5513 TEST(RunBitcastInt32ToFloat32) { | 5504 TEST(RunBitcastInt32ToFloat32) { |
5514 int32_t input = 1; | 5505 int32_t input = 1; |
5515 float output = 0.0; | 5506 float output = 0.0; |
5516 RawMachineAssemblerTester<int32_t> m; | 5507 RawMachineAssemblerTester<int32_t> m; |
5517 m.StoreToPointer( | 5508 m.StoreToPointer( |
5518 &output, StoreRepForType(kMachFloat32), | 5509 &output, kMachFloat32, |
5519 m.BitcastInt32ToFloat32(m.LoadFromPointer(&input, kMachInt32))); | 5510 m.BitcastInt32ToFloat32(m.LoadFromPointer(&input, kMachInt32))); |
5520 m.Return(m.Int32Constant(11)); | 5511 m.Return(m.Int32Constant(11)); |
5521 FOR_INT32_INPUTS(i) { | 5512 FOR_INT32_INPUTS(i) { |
5522 input = *i; | 5513 input = *i; |
5523 CHECK_EQ(11, m.Call()); | 5514 CHECK_EQ(11, m.Call()); |
5524 float expected = bit_cast<float>(input); | 5515 float expected = bit_cast<float>(input); |
5525 CHECK_EQ(bit_cast<int32_t>(expected), bit_cast<int32_t>(output)); | 5516 CHECK_EQ(bit_cast<int32_t>(expected), bit_cast<int32_t>(output)); |
5526 } | 5517 } |
5527 } | 5518 } |
5528 | 5519 |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5569 c->CalleeSavedRegisters(), // callee saved | 5560 c->CalleeSavedRegisters(), // callee saved |
5570 c->CalleeSavedFPRegisters(), // callee saved FP | 5561 c->CalleeSavedFPRegisters(), // callee saved FP |
5571 CallDescriptor::kNoFlags, // flags | 5562 CallDescriptor::kNoFlags, // flags |
5572 "c-call-as-code"); | 5563 "c-call-as-code"); |
5573 Node* call = r.AddNode(r.common()->Call(desc), phi); | 5564 Node* call = r.AddNode(r.common()->Call(desc), phi); |
5574 r.Return(call); | 5565 r.Return(call); |
5575 | 5566 |
5576 CHECK_EQ(33, r.Call(1)); | 5567 CHECK_EQ(33, r.Call(1)); |
5577 CHECK_EQ(44, r.Call(0)); | 5568 CHECK_EQ(44, r.Call(0)); |
5578 } | 5569 } |
OLD | NEW |