OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "vm/globals.h" | 5 #include "vm/globals.h" |
6 #if defined(TARGET_ARCH_IA32) | 6 #if defined(TARGET_ARCH_IA32) |
7 | 7 |
8 #include "vm/assembler.h" | 8 #include "vm/assembler.h" |
| 9 #include "vm/cpu.h" |
9 #include "vm/os.h" | 10 #include "vm/os.h" |
10 #include "vm/unit_test.h" | 11 #include "vm/unit_test.h" |
11 #include "vm/virtual_memory.h" | 12 #include "vm/virtual_memory.h" |
12 | 13 |
13 namespace dart { | 14 namespace dart { |
14 | 15 |
15 #define __ assembler-> | 16 #define __ assembler-> |
16 | 17 |
17 | 18 |
18 ASSEMBLER_TEST_GENERATE(Simple, assembler) { | 19 ASSEMBLER_TEST_GENERATE(Simple, assembler) { |
(...skipping 2488 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2507 | 2508 |
2508 | 2509 |
2509 ASSEMBLER_TEST_RUN(Orpd, test) { | 2510 ASSEMBLER_TEST_RUN(Orpd, test) { |
2510 typedef double (*OrpdCode)(double d); | 2511 typedef double (*OrpdCode)(double d); |
2511 double res = reinterpret_cast<OrpdCode>(test->entry())(12.56e3); | 2512 double res = reinterpret_cast<OrpdCode>(test->entry())(12.56e3); |
2512 EXPECT_FLOAT_EQ(-12.56e3, res, 0.0); | 2513 EXPECT_FLOAT_EQ(-12.56e3, res, 0.0); |
2513 } | 2514 } |
2514 | 2515 |
2515 | 2516 |
2516 ASSEMBLER_TEST_GENERATE(Pextrd0, assembler) { | 2517 ASSEMBLER_TEST_GENERATE(Pextrd0, assembler) { |
2517 if (CPUFeatures::sse4_1_supported()) { | 2518 if (TargetCPUFeatures::sse4_1_supported()) { |
2518 __ movsd(XMM0, Address(ESP, kWordSize)); | 2519 __ movsd(XMM0, Address(ESP, kWordSize)); |
2519 __ pextrd(EAX, XMM0, Immediate(0)); | 2520 __ pextrd(EAX, XMM0, Immediate(0)); |
2520 } | 2521 } |
2521 __ ret(); | 2522 __ ret(); |
2522 } | 2523 } |
2523 | 2524 |
2524 | 2525 |
2525 ASSEMBLER_TEST_RUN(Pextrd0, test) { | 2526 ASSEMBLER_TEST_RUN(Pextrd0, test) { |
2526 if (CPUFeatures::sse4_1_supported()) { | 2527 if (TargetCPUFeatures::sse4_1_supported()) { |
2527 typedef int32_t (*PextrdCode0)(double d); | 2528 typedef int32_t (*PextrdCode0)(double d); |
2528 int32_t res = reinterpret_cast<PextrdCode0>(test->entry())(123456789); | 2529 int32_t res = reinterpret_cast<PextrdCode0>(test->entry())(123456789); |
2529 EXPECT_EQ(0x54000000, res); | 2530 EXPECT_EQ(0x54000000, res); |
2530 } | 2531 } |
2531 } | 2532 } |
2532 | 2533 |
2533 | 2534 |
2534 ASSEMBLER_TEST_GENERATE(Pextrd1, assembler) { | 2535 ASSEMBLER_TEST_GENERATE(Pextrd1, assembler) { |
2535 if (CPUFeatures::sse4_1_supported()) { | 2536 if (TargetCPUFeatures::sse4_1_supported()) { |
2536 __ movsd(XMM0, Address(ESP, kWordSize)); | 2537 __ movsd(XMM0, Address(ESP, kWordSize)); |
2537 __ pextrd(EAX, XMM0, Immediate(1)); | 2538 __ pextrd(EAX, XMM0, Immediate(1)); |
2538 } | 2539 } |
2539 __ ret(); | 2540 __ ret(); |
2540 } | 2541 } |
2541 | 2542 |
2542 | 2543 |
2543 ASSEMBLER_TEST_RUN(Pextrd1, test) { | 2544 ASSEMBLER_TEST_RUN(Pextrd1, test) { |
2544 if (CPUFeatures::sse4_1_supported()) { | 2545 if (TargetCPUFeatures::sse4_1_supported()) { |
2545 typedef int32_t (*PextrdCode1)(double d); | 2546 typedef int32_t (*PextrdCode1)(double d); |
2546 int32_t res = reinterpret_cast<PextrdCode1>(test->entry())(123456789); | 2547 int32_t res = reinterpret_cast<PextrdCode1>(test->entry())(123456789); |
2547 EXPECT_EQ(0x419d6f34, res); | 2548 EXPECT_EQ(0x419d6f34, res); |
2548 } | 2549 } |
2549 } | 2550 } |
2550 | 2551 |
2551 | 2552 |
2552 ASSEMBLER_TEST_GENERATE(Pmovsxdq, assembler) { | 2553 ASSEMBLER_TEST_GENERATE(Pmovsxdq, assembler) { |
2553 if (CPUFeatures::sse4_1_supported()) { | 2554 if (TargetCPUFeatures::sse4_1_supported()) { |
2554 __ movsd(XMM0, Address(ESP, kWordSize)); | 2555 __ movsd(XMM0, Address(ESP, kWordSize)); |
2555 __ pmovsxdq(XMM0, XMM0); | 2556 __ pmovsxdq(XMM0, XMM0); |
2556 __ pextrd(EAX, XMM0, Immediate(1)); | 2557 __ pextrd(EAX, XMM0, Immediate(1)); |
2557 } | 2558 } |
2558 __ ret(); | 2559 __ ret(); |
2559 } | 2560 } |
2560 | 2561 |
2561 | 2562 |
2562 ASSEMBLER_TEST_RUN(Pmovsxdq, test) { | 2563 ASSEMBLER_TEST_RUN(Pmovsxdq, test) { |
2563 if (CPUFeatures::sse4_1_supported()) { | 2564 if (TargetCPUFeatures::sse4_1_supported()) { |
2564 typedef int32_t (*PmovsxdqCode)(double d); | 2565 typedef int32_t (*PmovsxdqCode)(double d); |
2565 int32_t res = reinterpret_cast<PmovsxdqCode>(test->entry())(123456789); | 2566 int32_t res = reinterpret_cast<PmovsxdqCode>(test->entry())(123456789); |
2566 EXPECT_EQ(0, res); | 2567 EXPECT_EQ(0, res); |
2567 } | 2568 } |
2568 } | 2569 } |
2569 | 2570 |
2570 | 2571 |
2571 ASSEMBLER_TEST_GENERATE(Pcmpeqq, assembler) { | 2572 ASSEMBLER_TEST_GENERATE(Pcmpeqq, assembler) { |
2572 if (CPUFeatures::sse4_1_supported()) { | 2573 if (TargetCPUFeatures::sse4_1_supported()) { |
2573 __ movsd(XMM0, Address(ESP, kWordSize)); | 2574 __ movsd(XMM0, Address(ESP, kWordSize)); |
2574 __ xorpd(XMM1, XMM1); | 2575 __ xorpd(XMM1, XMM1); |
2575 __ pcmpeqq(XMM0, XMM1); | 2576 __ pcmpeqq(XMM0, XMM1); |
2576 __ movd(EAX, XMM0); | 2577 __ movd(EAX, XMM0); |
2577 } | 2578 } |
2578 __ ret(); | 2579 __ ret(); |
2579 } | 2580 } |
2580 | 2581 |
2581 | 2582 |
2582 ASSEMBLER_TEST_RUN(Pcmpeqq, test) { | 2583 ASSEMBLER_TEST_RUN(Pcmpeqq, test) { |
2583 if (CPUFeatures::sse4_1_supported()) { | 2584 if (TargetCPUFeatures::sse4_1_supported()) { |
2584 typedef int32_t (*PcmpeqqCode)(double d); | 2585 typedef int32_t (*PcmpeqqCode)(double d); |
2585 int32_t res = reinterpret_cast<PcmpeqqCode>(test->entry())(0); | 2586 int32_t res = reinterpret_cast<PcmpeqqCode>(test->entry())(0); |
2586 EXPECT_EQ(-1, res); | 2587 EXPECT_EQ(-1, res); |
2587 } | 2588 } |
2588 } | 2589 } |
2589 | 2590 |
2590 | 2591 |
2591 ASSEMBLER_TEST_GENERATE(AndPd, assembler) { | 2592 ASSEMBLER_TEST_GENERATE(AndPd, assembler) { |
2592 __ movsd(XMM0, Address(ESP, kWordSize)); | 2593 __ movsd(XMM0, Address(ESP, kWordSize)); |
2593 __ andpd(XMM0, XMM0); | 2594 __ andpd(XMM0, XMM0); |
(...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2898 FieldAddress(ECX, GrowableObjectArray::data_offset()), | 2899 FieldAddress(ECX, GrowableObjectArray::data_offset()), |
2899 EAX); | 2900 EAX); |
2900 __ popl(EAX); | 2901 __ popl(EAX); |
2901 __ popl(CTX); | 2902 __ popl(CTX); |
2902 __ ret(); | 2903 __ ret(); |
2903 } | 2904 } |
2904 | 2905 |
2905 } // namespace dart | 2906 } // namespace dart |
2906 | 2907 |
2907 #endif // defined TARGET_ARCH_IA32 | 2908 #endif // defined TARGET_ARCH_IA32 |
OLD | NEW |