OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
226 | 226 |
227 #define CHECK_EQUAL_FP32(expected, result) \ | 227 #define CHECK_EQUAL_FP32(expected, result) \ |
228 CHECK(EqualFP32(expected, &core, result)) | 228 CHECK(EqualFP32(expected, &core, result)) |
229 | 229 |
230 #define CHECK_EQUAL_64(expected, result) \ | 230 #define CHECK_EQUAL_64(expected, result) \ |
231 CHECK(Equal64(expected, &core, result)) | 231 CHECK(Equal64(expected, &core, result)) |
232 | 232 |
233 #define CHECK_EQUAL_FP64(expected, result) \ | 233 #define CHECK_EQUAL_FP64(expected, result) \ |
234 CHECK(EqualFP64(expected, &core, result)) | 234 CHECK(EqualFP64(expected, &core, result)) |
235 | 235 |
| 236 // Expected values for 128-bit comparisons are passed as two 64-bit values, |
| 237 // where expected_h (high) is <127:64> and expected_l (low) is <63:0>. |
| 238 #define CHECK_EQUAL_128(expected_h, expected_l, result) \ |
| 239 CHECK(Equal128(expected_h, expected_l, &core, result)) |
| 240 |
236 #ifdef DEBUG | 241 #ifdef DEBUG |
237 #define CHECK_LITERAL_POOL_SIZE(expected) \ | 242 #define CHECK_LITERAL_POOL_SIZE(expected) \ |
238 CHECK((expected) == (__ LiteralPoolSize())) | 243 CHECK((expected) == (__ LiteralPoolSize())) |
239 #else | 244 #else |
240 #define CHECK_LITERAL_POOL_SIZE(expected) ((void)0) | 245 #define CHECK_LITERAL_POOL_SIZE(expected) ((void)0) |
241 #endif | 246 #endif |
242 | 247 |
243 | 248 |
244 TEST(stack_ops) { | 249 TEST(stack_ops) { |
245 INIT_V8(); | 250 INIT_V8(); |
(...skipping 2257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2503 CHECK_EQUAL_64(src_base + 4096 * sizeof(src[0]), x24); | 2508 CHECK_EQUAL_64(src_base + 4096 * sizeof(src[0]), x24); |
2504 CHECK_EQUAL_64(dst_base + 4096 * sizeof(dst[0]), x25); | 2509 CHECK_EQUAL_64(dst_base + 4096 * sizeof(dst[0]), x25); |
2505 CHECK_EQUAL_32(6144, w2); | 2510 CHECK_EQUAL_32(6144, w2); |
2506 CHECK_EQUAL_32(6144, dst[6144]); | 2511 CHECK_EQUAL_32(6144, dst[6144]); |
2507 CHECK_EQUAL_64(src_base + 6144 * sizeof(src[0]), x26); | 2512 CHECK_EQUAL_64(src_base + 6144 * sizeof(src[0]), x26); |
2508 CHECK_EQUAL_64(dst_base + 6144 * sizeof(dst[0]), x27); | 2513 CHECK_EQUAL_64(dst_base + 6144 * sizeof(dst[0]), x27); |
2509 | 2514 |
2510 TEARDOWN(); | 2515 TEARDOWN(); |
2511 } | 2516 } |
2512 | 2517 |
2513 | |
2514 TEST(ldr_str_preindex) { | 2518 TEST(ldr_str_preindex) { |
2515 INIT_V8(); | 2519 INIT_V8(); |
2516 SETUP(); | 2520 SETUP(); |
2517 | 2521 |
2518 uint64_t src[2] = {0xfedcba9876543210UL, 0x0123456789abcdefUL}; | 2522 uint64_t src[2] = {0xfedcba9876543210UL, 0x0123456789abcdefUL}; |
2519 uint64_t dst[6] = {0, 0, 0, 0, 0, 0}; | 2523 uint64_t dst[6] = {0, 0, 0, 0, 0, 0}; |
2520 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); | 2524 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); |
2521 uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst); | 2525 uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst); |
2522 | 2526 |
2523 START(); | 2527 START(); |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2562 CHECK_EQUAL_64(src_base + 12, x21); | 2566 CHECK_EQUAL_64(src_base + 12, x21); |
2563 CHECK_EQUAL_64(dst_base + 36, x22); | 2567 CHECK_EQUAL_64(dst_base + 36, x22); |
2564 CHECK_EQUAL_64(src_base + 1, x23); | 2568 CHECK_EQUAL_64(src_base + 1, x23); |
2565 CHECK_EQUAL_64(dst_base + 25, x24); | 2569 CHECK_EQUAL_64(dst_base + 25, x24); |
2566 CHECK_EQUAL_64(src_base + 3, x25); | 2570 CHECK_EQUAL_64(src_base + 3, x25); |
2567 CHECK_EQUAL_64(dst_base + 41, x26); | 2571 CHECK_EQUAL_64(dst_base + 41, x26); |
2568 | 2572 |
2569 TEARDOWN(); | 2573 TEARDOWN(); |
2570 } | 2574 } |
2571 | 2575 |
2572 | |
2573 TEST(ldr_str_postindex) { | 2576 TEST(ldr_str_postindex) { |
2574 INIT_V8(); | 2577 INIT_V8(); |
2575 SETUP(); | 2578 SETUP(); |
2576 | 2579 |
2577 uint64_t src[2] = {0xfedcba9876543210UL, 0x0123456789abcdefUL}; | 2580 uint64_t src[2] = {0xfedcba9876543210UL, 0x0123456789abcdefUL}; |
2578 uint64_t dst[6] = {0, 0, 0, 0, 0, 0}; | 2581 uint64_t dst[6] = {0, 0, 0, 0, 0, 0}; |
2579 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); | 2582 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); |
2580 uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst); | 2583 uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst); |
2581 | 2584 |
2582 START(); | 2585 START(); |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2621 CHECK_EQUAL_64(src_base, x21); | 2624 CHECK_EQUAL_64(src_base, x21); |
2622 CHECK_EQUAL_64(dst_base, x22); | 2625 CHECK_EQUAL_64(dst_base, x22); |
2623 CHECK_EQUAL_64(src_base + 2, x23); | 2626 CHECK_EQUAL_64(src_base + 2, x23); |
2624 CHECK_EQUAL_64(dst_base + 30, x24); | 2627 CHECK_EQUAL_64(dst_base + 30, x24); |
2625 CHECK_EQUAL_64(src_base, x25); | 2628 CHECK_EQUAL_64(src_base, x25); |
2626 CHECK_EQUAL_64(dst_base, x26); | 2629 CHECK_EQUAL_64(dst_base, x26); |
2627 | 2630 |
2628 TEARDOWN(); | 2631 TEARDOWN(); |
2629 } | 2632 } |
2630 | 2633 |
2631 | |
2632 TEST(load_signed) { | 2634 TEST(load_signed) { |
2633 INIT_V8(); | 2635 INIT_V8(); |
2634 SETUP(); | 2636 SETUP(); |
2635 | 2637 |
2636 uint32_t src[2] = {0x80008080, 0x7fff7f7f}; | 2638 uint32_t src[2] = {0x80008080, 0x7fff7f7f}; |
2637 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); | 2639 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); |
2638 | 2640 |
2639 START(); | 2641 START(); |
2640 __ Mov(x24, src_base); | 2642 __ Mov(x24, src_base); |
2641 __ Ldrsb(w0, MemOperand(x24)); | 2643 __ Ldrsb(w0, MemOperand(x24)); |
(...skipping 17 matching lines...) Expand all Loading... |
2659 CHECK_EQUAL_64(0xffffffffffffff80UL, x4); | 2661 CHECK_EQUAL_64(0xffffffffffffff80UL, x4); |
2660 CHECK_EQUAL_64(0x000000000000007fUL, x5); | 2662 CHECK_EQUAL_64(0x000000000000007fUL, x5); |
2661 CHECK_EQUAL_64(0xffffffffffff8080UL, x6); | 2663 CHECK_EQUAL_64(0xffffffffffff8080UL, x6); |
2662 CHECK_EQUAL_64(0x0000000000007f7fUL, x7); | 2664 CHECK_EQUAL_64(0x0000000000007f7fUL, x7); |
2663 CHECK_EQUAL_64(0xffffffff80008080UL, x8); | 2665 CHECK_EQUAL_64(0xffffffff80008080UL, x8); |
2664 CHECK_EQUAL_64(0x000000007fff7f7fUL, x9); | 2666 CHECK_EQUAL_64(0x000000007fff7f7fUL, x9); |
2665 | 2667 |
2666 TEARDOWN(); | 2668 TEARDOWN(); |
2667 } | 2669 } |
2668 | 2670 |
2669 | |
2670 TEST(load_store_regoffset) { | 2671 TEST(load_store_regoffset) { |
2671 INIT_V8(); | 2672 INIT_V8(); |
2672 SETUP(); | 2673 SETUP(); |
2673 | 2674 |
2674 uint32_t src[3] = {1, 2, 3}; | 2675 uint32_t src[3] = {1, 2, 3}; |
2675 uint32_t dst[4] = {0, 0, 0, 0}; | 2676 uint32_t dst[4] = {0, 0, 0, 0}; |
2676 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); | 2677 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); |
2677 uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst); | 2678 uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst); |
2678 | 2679 |
2679 START(); | 2680 START(); |
(...skipping 27 matching lines...) Expand all Loading... |
2707 CHECK_EQUAL_64(3, x3); | 2708 CHECK_EQUAL_64(3, x3); |
2708 CHECK_EQUAL_64(2, x4); | 2709 CHECK_EQUAL_64(2, x4); |
2709 CHECK_EQUAL_32(1, dst[0]); | 2710 CHECK_EQUAL_32(1, dst[0]); |
2710 CHECK_EQUAL_32(2, dst[1]); | 2711 CHECK_EQUAL_32(2, dst[1]); |
2711 CHECK_EQUAL_32(3, dst[2]); | 2712 CHECK_EQUAL_32(3, dst[2]); |
2712 CHECK_EQUAL_32(3, dst[3]); | 2713 CHECK_EQUAL_32(3, dst[3]); |
2713 | 2714 |
2714 TEARDOWN(); | 2715 TEARDOWN(); |
2715 } | 2716 } |
2716 | 2717 |
2717 | |
2718 TEST(load_store_float) { | 2718 TEST(load_store_float) { |
2719 INIT_V8(); | 2719 INIT_V8(); |
2720 SETUP(); | 2720 SETUP(); |
2721 | 2721 |
2722 float src[3] = {1.0, 2.0, 3.0}; | 2722 float src[3] = {1.0, 2.0, 3.0}; |
2723 float dst[3] = {0.0, 0.0, 0.0}; | 2723 float dst[3] = {0.0, 0.0, 0.0}; |
2724 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); | 2724 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); |
2725 uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst); | 2725 uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst); |
2726 | 2726 |
2727 START(); | 2727 START(); |
(...skipping 22 matching lines...) Expand all Loading... |
2750 CHECK_EQUAL_64(src_base, x17); | 2750 CHECK_EQUAL_64(src_base, x17); |
2751 CHECK_EQUAL_64(dst_base + sizeof(dst[0]), x18); | 2751 CHECK_EQUAL_64(dst_base + sizeof(dst[0]), x18); |
2752 CHECK_EQUAL_64(src_base + sizeof(src[0]), x19); | 2752 CHECK_EQUAL_64(src_base + sizeof(src[0]), x19); |
2753 CHECK_EQUAL_64(dst_base + 2 * sizeof(dst[0]), x20); | 2753 CHECK_EQUAL_64(dst_base + 2 * sizeof(dst[0]), x20); |
2754 CHECK_EQUAL_64(src_base + 2 * sizeof(src[0]), x21); | 2754 CHECK_EQUAL_64(src_base + 2 * sizeof(src[0]), x21); |
2755 CHECK_EQUAL_64(dst_base, x22); | 2755 CHECK_EQUAL_64(dst_base, x22); |
2756 | 2756 |
2757 TEARDOWN(); | 2757 TEARDOWN(); |
2758 } | 2758 } |
2759 | 2759 |
2760 | |
2761 TEST(load_store_double) { | 2760 TEST(load_store_double) { |
2762 INIT_V8(); | 2761 INIT_V8(); |
2763 SETUP(); | 2762 SETUP(); |
2764 | 2763 |
2765 double src[3] = {1.0, 2.0, 3.0}; | 2764 double src[3] = {1.0, 2.0, 3.0}; |
2766 double dst[3] = {0.0, 0.0, 0.0}; | 2765 double dst[3] = {0.0, 0.0, 0.0}; |
2767 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); | 2766 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); |
2768 uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst); | 2767 uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst); |
2769 | 2768 |
2770 START(); | 2769 START(); |
(...skipping 21 matching lines...) Expand all Loading... |
2792 CHECK_EQUAL_FP64(3.0, dst[1]); | 2791 CHECK_EQUAL_FP64(3.0, dst[1]); |
2793 CHECK_EQUAL_64(src_base, x17); | 2792 CHECK_EQUAL_64(src_base, x17); |
2794 CHECK_EQUAL_64(dst_base + sizeof(dst[0]), x18); | 2793 CHECK_EQUAL_64(dst_base + sizeof(dst[0]), x18); |
2795 CHECK_EQUAL_64(src_base + sizeof(src[0]), x19); | 2794 CHECK_EQUAL_64(src_base + sizeof(src[0]), x19); |
2796 CHECK_EQUAL_64(dst_base + 2 * sizeof(dst[0]), x20); | 2795 CHECK_EQUAL_64(dst_base + 2 * sizeof(dst[0]), x20); |
2797 CHECK_EQUAL_64(src_base + 2 * sizeof(src[0]), x21); | 2796 CHECK_EQUAL_64(src_base + 2 * sizeof(src[0]), x21); |
2798 CHECK_EQUAL_64(dst_base, x22); | 2797 CHECK_EQUAL_64(dst_base, x22); |
2799 | 2798 |
2800 TEARDOWN(); | 2799 TEARDOWN(); |
2801 } | 2800 } |
| 2801 |
| 2802 TEST(load_store_b) { |
| 2803 INIT_V8(); |
| 2804 SETUP(); |
| 2805 |
| 2806 uint8_t src[3] = {0x12, 0x23, 0x34}; |
| 2807 uint8_t dst[3] = {0, 0, 0}; |
| 2808 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); |
| 2809 uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst); |
| 2810 |
| 2811 START(); |
| 2812 __ Mov(x17, src_base); |
| 2813 __ Mov(x18, dst_base); |
| 2814 __ Mov(x19, src_base); |
| 2815 __ Mov(x20, dst_base); |
| 2816 __ Mov(x21, src_base); |
| 2817 __ Mov(x22, dst_base); |
| 2818 __ Ldr(b0, MemOperand(x17, sizeof(src[0]))); |
| 2819 __ Str(b0, MemOperand(x18, sizeof(dst[0]), PostIndex)); |
| 2820 __ Ldr(b1, MemOperand(x19, sizeof(src[0]), PostIndex)); |
| 2821 __ Str(b1, MemOperand(x20, 2 * sizeof(dst[0]), PreIndex)); |
| 2822 __ Ldr(b2, MemOperand(x21, 2 * sizeof(src[0]), PreIndex)); |
| 2823 __ Str(b2, MemOperand(x22, sizeof(dst[0]))); |
| 2824 END(); |
| 2825 |
| 2826 RUN(); |
| 2827 |
| 2828 CHECK_EQUAL_128(0, 0x23, q0); |
| 2829 CHECK_EQUAL_64(0x23, dst[0]); |
| 2830 CHECK_EQUAL_128(0, 0x12, q1); |
| 2831 CHECK_EQUAL_64(0x12, dst[2]); |
| 2832 CHECK_EQUAL_128(0, 0x34, q2); |
| 2833 CHECK_EQUAL_64(0x34, dst[1]); |
| 2834 CHECK_EQUAL_64(src_base, x17); |
| 2835 CHECK_EQUAL_64(dst_base + sizeof(dst[0]), x18); |
| 2836 CHECK_EQUAL_64(src_base + sizeof(src[0]), x19); |
| 2837 CHECK_EQUAL_64(dst_base + 2 * sizeof(dst[0]), x20); |
| 2838 CHECK_EQUAL_64(src_base + 2 * sizeof(src[0]), x21); |
| 2839 CHECK_EQUAL_64(dst_base, x22); |
| 2840 |
| 2841 TEARDOWN(); |
| 2842 } |
| 2843 |
| 2844 TEST(load_store_h) { |
| 2845 INIT_V8(); |
| 2846 SETUP(); |
| 2847 |
| 2848 uint16_t src[3] = {0x1234, 0x2345, 0x3456}; |
| 2849 uint16_t dst[3] = {0, 0, 0}; |
| 2850 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); |
| 2851 uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst); |
| 2852 |
| 2853 START(); |
| 2854 __ Mov(x17, src_base); |
| 2855 __ Mov(x18, dst_base); |
| 2856 __ Mov(x19, src_base); |
| 2857 __ Mov(x20, dst_base); |
| 2858 __ Mov(x21, src_base); |
| 2859 __ Mov(x22, dst_base); |
| 2860 __ Ldr(h0, MemOperand(x17, sizeof(src[0]))); |
| 2861 __ Str(h0, MemOperand(x18, sizeof(dst[0]), PostIndex)); |
| 2862 __ Ldr(h1, MemOperand(x19, sizeof(src[0]), PostIndex)); |
| 2863 __ Str(h1, MemOperand(x20, 2 * sizeof(dst[0]), PreIndex)); |
| 2864 __ Ldr(h2, MemOperand(x21, 2 * sizeof(src[0]), PreIndex)); |
| 2865 __ Str(h2, MemOperand(x22, sizeof(dst[0]))); |
| 2866 END(); |
| 2867 |
| 2868 RUN(); |
| 2869 |
| 2870 CHECK_EQUAL_128(0, 0x2345, q0); |
| 2871 CHECK_EQUAL_64(0x2345, dst[0]); |
| 2872 CHECK_EQUAL_128(0, 0x1234, q1); |
| 2873 CHECK_EQUAL_64(0x1234, dst[2]); |
| 2874 CHECK_EQUAL_128(0, 0x3456, q2); |
| 2875 CHECK_EQUAL_64(0x3456, dst[1]); |
| 2876 CHECK_EQUAL_64(src_base, x17); |
| 2877 CHECK_EQUAL_64(dst_base + sizeof(dst[0]), x18); |
| 2878 CHECK_EQUAL_64(src_base + sizeof(src[0]), x19); |
| 2879 CHECK_EQUAL_64(dst_base + 2 * sizeof(dst[0]), x20); |
| 2880 CHECK_EQUAL_64(src_base + 2 * sizeof(src[0]), x21); |
| 2881 CHECK_EQUAL_64(dst_base, x22); |
| 2882 |
| 2883 TEARDOWN(); |
| 2884 } |
| 2885 |
| 2886 TEST(load_store_q) { |
| 2887 INIT_V8(); |
| 2888 SETUP(); |
| 2889 |
| 2890 uint8_t src[48] = {0x10, 0x32, 0x54, 0x76, 0x98, 0xba, 0xdc, 0xfe, 0x01, 0x23, |
| 2891 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0x21, 0x43, 0x65, 0x87, |
| 2892 0xa9, 0xcb, 0xed, 0x0f, 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, |
| 2893 0xde, 0xf0, 0x24, 0x46, 0x68, 0x8a, 0xac, 0xce, 0xe0, 0x02, |
| 2894 0x42, 0x64, 0x86, 0xa8, 0xca, 0xec, 0x0e, 0x20}; |
| 2895 |
| 2896 uint64_t dst[6] = {0, 0, 0, 0, 0, 0}; |
| 2897 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); |
| 2898 uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst); |
| 2899 |
| 2900 START(); |
| 2901 __ Mov(x17, src_base); |
| 2902 __ Mov(x18, dst_base); |
| 2903 __ Mov(x19, src_base); |
| 2904 __ Mov(x20, dst_base); |
| 2905 __ Mov(x21, src_base); |
| 2906 __ Mov(x22, dst_base); |
| 2907 __ Ldr(q0, MemOperand(x17, 16)); |
| 2908 __ Str(q0, MemOperand(x18, 16, PostIndex)); |
| 2909 __ Ldr(q1, MemOperand(x19, 16, PostIndex)); |
| 2910 __ Str(q1, MemOperand(x20, 32, PreIndex)); |
| 2911 __ Ldr(q2, MemOperand(x21, 32, PreIndex)); |
| 2912 __ Str(q2, MemOperand(x22, 16)); |
| 2913 END(); |
| 2914 |
| 2915 RUN(); |
| 2916 |
| 2917 CHECK_EQUAL_128(0xf0debc9a78563412, 0x0fedcba987654321, q0); |
| 2918 CHECK_EQUAL_64(0x0fedcba987654321, dst[0]); |
| 2919 CHECK_EQUAL_64(0xf0debc9a78563412, dst[1]); |
| 2920 CHECK_EQUAL_128(0xefcdab8967452301, 0xfedcba9876543210, q1); |
| 2921 CHECK_EQUAL_64(0xfedcba9876543210, dst[4]); |
| 2922 CHECK_EQUAL_64(0xefcdab8967452301, dst[5]); |
| 2923 CHECK_EQUAL_128(0x200eeccaa8866442, 0x02e0ceac8a684624, q2); |
| 2924 CHECK_EQUAL_64(0x02e0ceac8a684624, dst[2]); |
| 2925 CHECK_EQUAL_64(0x200eeccaa8866442, dst[3]); |
| 2926 CHECK_EQUAL_64(src_base, x17); |
| 2927 CHECK_EQUAL_64(dst_base + 16, x18); |
| 2928 CHECK_EQUAL_64(src_base + 16, x19); |
| 2929 CHECK_EQUAL_64(dst_base + 32, x20); |
| 2930 CHECK_EQUAL_64(src_base + 32, x21); |
| 2931 CHECK_EQUAL_64(dst_base, x22); |
| 2932 |
| 2933 TEARDOWN(); |
| 2934 } |
| 2935 |
| 2936 TEST(neon_ld1_d) { |
| 2937 INIT_V8(); |
| 2938 SETUP(); |
| 2939 |
| 2940 uint8_t src[32 + 5]; |
| 2941 for (unsigned i = 0; i < sizeof(src); i++) { |
| 2942 src[i] = i; |
| 2943 } |
| 2944 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); |
| 2945 |
| 2946 START(); |
| 2947 __ Mov(x17, src_base); |
| 2948 __ Ldr(q2, MemOperand(x17)); // Initialise top 64-bits of Q register. |
| 2949 __ Ld1(v2.V8B(), MemOperand(x17)); |
| 2950 __ Add(x17, x17, 1); |
| 2951 __ Ld1(v3.V8B(), v4.V8B(), MemOperand(x17)); |
| 2952 __ Add(x17, x17, 1); |
| 2953 __ Ld1(v5.V4H(), v6.V4H(), v7.V4H(), MemOperand(x17)); |
| 2954 __ Add(x17, x17, 1); |
| 2955 __ Ld1(v16.V2S(), v17.V2S(), v18.V2S(), v19.V2S(), MemOperand(x17)); |
| 2956 __ Add(x17, x17, 1); |
| 2957 __ Ld1(v30.V2S(), v31.V2S(), v0.V2S(), v1.V2S(), MemOperand(x17)); |
| 2958 __ Add(x17, x17, 1); |
| 2959 __ Ld1(v20.V1D(), v21.V1D(), v22.V1D(), v23.V1D(), MemOperand(x17)); |
| 2960 END(); |
| 2961 |
| 2962 RUN(); |
| 2963 |
| 2964 CHECK_EQUAL_128(0, 0x0706050403020100, q2); |
| 2965 CHECK_EQUAL_128(0, 0x0807060504030201, q3); |
| 2966 CHECK_EQUAL_128(0, 0x100f0e0d0c0b0a09, q4); |
| 2967 CHECK_EQUAL_128(0, 0x0908070605040302, q5); |
| 2968 CHECK_EQUAL_128(0, 0x11100f0e0d0c0b0a, q6); |
| 2969 CHECK_EQUAL_128(0, 0x1918171615141312, q7); |
| 2970 CHECK_EQUAL_128(0, 0x0a09080706050403, q16); |
| 2971 CHECK_EQUAL_128(0, 0x1211100f0e0d0c0b, q17); |
| 2972 CHECK_EQUAL_128(0, 0x1a19181716151413, q18); |
| 2973 CHECK_EQUAL_128(0, 0x2221201f1e1d1c1b, q19); |
| 2974 CHECK_EQUAL_128(0, 0x0b0a090807060504, q30); |
| 2975 CHECK_EQUAL_128(0, 0x131211100f0e0d0c, q31); |
| 2976 CHECK_EQUAL_128(0, 0x1b1a191817161514, q0); |
| 2977 CHECK_EQUAL_128(0, 0x232221201f1e1d1c, q1); |
| 2978 CHECK_EQUAL_128(0, 0x0c0b0a0908070605, q20); |
| 2979 CHECK_EQUAL_128(0, 0x14131211100f0e0d, q21); |
| 2980 CHECK_EQUAL_128(0, 0x1c1b1a1918171615, q22); |
| 2981 CHECK_EQUAL_128(0, 0x24232221201f1e1d, q23); |
| 2982 |
| 2983 TEARDOWN(); |
| 2984 } |
| 2985 |
| 2986 TEST(neon_ld1_d_postindex) { |
| 2987 INIT_V8(); |
| 2988 SETUP(); |
| 2989 |
| 2990 uint8_t src[32 + 5]; |
| 2991 for (unsigned i = 0; i < sizeof(src); i++) { |
| 2992 src[i] = i; |
| 2993 } |
| 2994 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); |
| 2995 |
| 2996 START(); |
| 2997 __ Mov(x17, src_base); |
| 2998 __ Mov(x18, src_base + 1); |
| 2999 __ Mov(x19, src_base + 2); |
| 3000 __ Mov(x20, src_base + 3); |
| 3001 __ Mov(x21, src_base + 4); |
| 3002 __ Mov(x22, src_base + 5); |
| 3003 __ Mov(x23, 1); |
| 3004 __ Ldr(q2, MemOperand(x17)); // Initialise top 64-bits of Q register. |
| 3005 __ Ld1(v2.V8B(), MemOperand(x17, x23, PostIndex)); |
| 3006 __ Ld1(v3.V8B(), v4.V8B(), MemOperand(x18, 16, PostIndex)); |
| 3007 __ Ld1(v5.V4H(), v6.V4H(), v7.V4H(), MemOperand(x19, 24, PostIndex)); |
| 3008 __ Ld1(v16.V2S(), v17.V2S(), v18.V2S(), v19.V2S(), |
| 3009 MemOperand(x20, 32, PostIndex)); |
| 3010 __ Ld1(v30.V2S(), v31.V2S(), v0.V2S(), v1.V2S(), |
| 3011 MemOperand(x21, 32, PostIndex)); |
| 3012 __ Ld1(v20.V1D(), v21.V1D(), v22.V1D(), v23.V1D(), |
| 3013 MemOperand(x22, 32, PostIndex)); |
| 3014 END(); |
| 3015 |
| 3016 RUN(); |
| 3017 |
| 3018 CHECK_EQUAL_128(0, 0x0706050403020100, q2); |
| 3019 CHECK_EQUAL_128(0, 0x0807060504030201, q3); |
| 3020 CHECK_EQUAL_128(0, 0x100f0e0d0c0b0a09, q4); |
| 3021 CHECK_EQUAL_128(0, 0x0908070605040302, q5); |
| 3022 CHECK_EQUAL_128(0, 0x11100f0e0d0c0b0a, q6); |
| 3023 CHECK_EQUAL_128(0, 0x1918171615141312, q7); |
| 3024 CHECK_EQUAL_128(0, 0x0a09080706050403, q16); |
| 3025 CHECK_EQUAL_128(0, 0x1211100f0e0d0c0b, q17); |
| 3026 CHECK_EQUAL_128(0, 0x1a19181716151413, q18); |
| 3027 CHECK_EQUAL_128(0, 0x2221201f1e1d1c1b, q19); |
| 3028 CHECK_EQUAL_128(0, 0x0b0a090807060504, q30); |
| 3029 CHECK_EQUAL_128(0, 0x131211100f0e0d0c, q31); |
| 3030 CHECK_EQUAL_128(0, 0x1b1a191817161514, q0); |
| 3031 CHECK_EQUAL_128(0, 0x232221201f1e1d1c, q1); |
| 3032 CHECK_EQUAL_128(0, 0x0c0b0a0908070605, q20); |
| 3033 CHECK_EQUAL_128(0, 0x14131211100f0e0d, q21); |
| 3034 CHECK_EQUAL_128(0, 0x1c1b1a1918171615, q22); |
| 3035 CHECK_EQUAL_128(0, 0x24232221201f1e1d, q23); |
| 3036 CHECK_EQUAL_64(src_base + 1, x17); |
| 3037 CHECK_EQUAL_64(src_base + 1 + 16, x18); |
| 3038 CHECK_EQUAL_64(src_base + 2 + 24, x19); |
| 3039 CHECK_EQUAL_64(src_base + 3 + 32, x20); |
| 3040 CHECK_EQUAL_64(src_base + 4 + 32, x21); |
| 3041 CHECK_EQUAL_64(src_base + 5 + 32, x22); |
| 3042 |
| 3043 TEARDOWN(); |
| 3044 } |
| 3045 |
| 3046 TEST(neon_ld1_q) { |
| 3047 INIT_V8(); |
| 3048 SETUP(); |
| 3049 |
| 3050 uint8_t src[64 + 4]; |
| 3051 for (unsigned i = 0; i < sizeof(src); i++) { |
| 3052 src[i] = i; |
| 3053 } |
| 3054 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); |
| 3055 |
| 3056 START(); |
| 3057 __ Mov(x17, src_base); |
| 3058 __ Ld1(v2.V16B(), MemOperand(x17)); |
| 3059 __ Add(x17, x17, 1); |
| 3060 __ Ld1(v3.V16B(), v4.V16B(), MemOperand(x17)); |
| 3061 __ Add(x17, x17, 1); |
| 3062 __ Ld1(v5.V8H(), v6.V8H(), v7.V8H(), MemOperand(x17)); |
| 3063 __ Add(x17, x17, 1); |
| 3064 __ Ld1(v16.V4S(), v17.V4S(), v18.V4S(), v19.V4S(), MemOperand(x17)); |
| 3065 __ Add(x17, x17, 1); |
| 3066 __ Ld1(v30.V2D(), v31.V2D(), v0.V2D(), v1.V2D(), MemOperand(x17)); |
| 3067 END(); |
| 3068 |
| 3069 RUN(); |
| 3070 |
| 3071 CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0706050403020100, q2); |
| 3072 CHECK_EQUAL_128(0x100f0e0d0c0b0a09, 0x0807060504030201, q3); |
| 3073 CHECK_EQUAL_128(0x201f1e1d1c1b1a19, 0x1817161514131211, q4); |
| 3074 CHECK_EQUAL_128(0x11100f0e0d0c0b0a, 0x0908070605040302, q5); |
| 3075 CHECK_EQUAL_128(0x21201f1e1d1c1b1a, 0x1918171615141312, q6); |
| 3076 CHECK_EQUAL_128(0x31302f2e2d2c2b2a, 0x2928272625242322, q7); |
| 3077 CHECK_EQUAL_128(0x1211100f0e0d0c0b, 0x0a09080706050403, q16); |
| 3078 CHECK_EQUAL_128(0x2221201f1e1d1c1b, 0x1a19181716151413, q17); |
| 3079 CHECK_EQUAL_128(0x3231302f2e2d2c2b, 0x2a29282726252423, q18); |
| 3080 CHECK_EQUAL_128(0x4241403f3e3d3c3b, 0x3a39383736353433, q19); |
| 3081 CHECK_EQUAL_128(0x131211100f0e0d0c, 0x0b0a090807060504, q30); |
| 3082 CHECK_EQUAL_128(0x232221201f1e1d1c, 0x1b1a191817161514, q31); |
| 3083 CHECK_EQUAL_128(0x333231302f2e2d2c, 0x2b2a292827262524, q0); |
| 3084 CHECK_EQUAL_128(0x434241403f3e3d3c, 0x3b3a393837363534, q1); |
| 3085 |
| 3086 TEARDOWN(); |
| 3087 } |
| 3088 |
| 3089 TEST(neon_ld1_q_postindex) { |
| 3090 INIT_V8(); |
| 3091 SETUP(); |
| 3092 |
| 3093 uint8_t src[64 + 4]; |
| 3094 for (unsigned i = 0; i < sizeof(src); i++) { |
| 3095 src[i] = i; |
| 3096 } |
| 3097 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); |
| 3098 |
| 3099 START(); |
| 3100 __ Mov(x17, src_base); |
| 3101 __ Mov(x18, src_base + 1); |
| 3102 __ Mov(x19, src_base + 2); |
| 3103 __ Mov(x20, src_base + 3); |
| 3104 __ Mov(x21, src_base + 4); |
| 3105 __ Mov(x22, 1); |
| 3106 __ Ld1(v2.V16B(), MemOperand(x17, x22, PostIndex)); |
| 3107 __ Ld1(v3.V16B(), v4.V16B(), MemOperand(x18, 32, PostIndex)); |
| 3108 __ Ld1(v5.V8H(), v6.V8H(), v7.V8H(), MemOperand(x19, 48, PostIndex)); |
| 3109 __ Ld1(v16.V4S(), v17.V4S(), v18.V4S(), v19.V4S(), |
| 3110 MemOperand(x20, 64, PostIndex)); |
| 3111 __ Ld1(v30.V2D(), v31.V2D(), v0.V2D(), v1.V2D(), |
| 3112 MemOperand(x21, 64, PostIndex)); |
| 3113 END(); |
| 3114 |
| 3115 RUN(); |
| 3116 |
| 3117 CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0706050403020100, q2); |
| 3118 CHECK_EQUAL_128(0x100f0e0d0c0b0a09, 0x0807060504030201, q3); |
| 3119 CHECK_EQUAL_128(0x201f1e1d1c1b1a19, 0x1817161514131211, q4); |
| 3120 CHECK_EQUAL_128(0x11100f0e0d0c0b0a, 0x0908070605040302, q5); |
| 3121 CHECK_EQUAL_128(0x21201f1e1d1c1b1a, 0x1918171615141312, q6); |
| 3122 CHECK_EQUAL_128(0x31302f2e2d2c2b2a, 0x2928272625242322, q7); |
| 3123 CHECK_EQUAL_128(0x1211100f0e0d0c0b, 0x0a09080706050403, q16); |
| 3124 CHECK_EQUAL_128(0x2221201f1e1d1c1b, 0x1a19181716151413, q17); |
| 3125 CHECK_EQUAL_128(0x3231302f2e2d2c2b, 0x2a29282726252423, q18); |
| 3126 CHECK_EQUAL_128(0x4241403f3e3d3c3b, 0x3a39383736353433, q19); |
| 3127 CHECK_EQUAL_128(0x131211100f0e0d0c, 0x0b0a090807060504, q30); |
| 3128 CHECK_EQUAL_128(0x232221201f1e1d1c, 0x1b1a191817161514, q31); |
| 3129 CHECK_EQUAL_128(0x333231302f2e2d2c, 0x2b2a292827262524, q0); |
| 3130 CHECK_EQUAL_128(0x434241403f3e3d3c, 0x3b3a393837363534, q1); |
| 3131 CHECK_EQUAL_64(src_base + 1, x17); |
| 3132 CHECK_EQUAL_64(src_base + 1 + 32, x18); |
| 3133 CHECK_EQUAL_64(src_base + 2 + 48, x19); |
| 3134 CHECK_EQUAL_64(src_base + 3 + 64, x20); |
| 3135 CHECK_EQUAL_64(src_base + 4 + 64, x21); |
| 3136 |
| 3137 TEARDOWN(); |
| 3138 } |
| 3139 |
| 3140 TEST(neon_ld1_lane) { |
| 3141 INIT_V8(); |
| 3142 SETUP(); |
| 3143 |
| 3144 uint8_t src[64]; |
| 3145 for (unsigned i = 0; i < sizeof(src); i++) { |
| 3146 src[i] = i; |
| 3147 } |
| 3148 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); |
| 3149 |
| 3150 START(); |
| 3151 |
| 3152 // Test loading whole register by element. |
| 3153 __ Mov(x17, src_base); |
| 3154 for (int i = 15; i >= 0; i--) { |
| 3155 __ Ld1(v0.B(), i, MemOperand(x17)); |
| 3156 __ Add(x17, x17, 1); |
| 3157 } |
| 3158 |
| 3159 __ Mov(x17, src_base); |
| 3160 for (int i = 7; i >= 0; i--) { |
| 3161 __ Ld1(v1.H(), i, MemOperand(x17)); |
| 3162 __ Add(x17, x17, 1); |
| 3163 } |
| 3164 |
| 3165 __ Mov(x17, src_base); |
| 3166 for (int i = 3; i >= 0; i--) { |
| 3167 __ Ld1(v2.S(), i, MemOperand(x17)); |
| 3168 __ Add(x17, x17, 1); |
| 3169 } |
| 3170 |
| 3171 __ Mov(x17, src_base); |
| 3172 for (int i = 1; i >= 0; i--) { |
| 3173 __ Ld1(v3.D(), i, MemOperand(x17)); |
| 3174 __ Add(x17, x17, 1); |
| 3175 } |
| 3176 |
| 3177 // Test loading a single element into an initialised register. |
| 3178 __ Mov(x17, src_base); |
| 3179 __ Ldr(q4, MemOperand(x17)); |
| 3180 __ Ld1(v4.B(), 4, MemOperand(x17)); |
| 3181 __ Ldr(q5, MemOperand(x17)); |
| 3182 __ Ld1(v5.H(), 3, MemOperand(x17)); |
| 3183 __ Ldr(q6, MemOperand(x17)); |
| 3184 __ Ld1(v6.S(), 2, MemOperand(x17)); |
| 3185 __ Ldr(q7, MemOperand(x17)); |
| 3186 __ Ld1(v7.D(), 1, MemOperand(x17)); |
| 3187 |
| 3188 END(); |
| 3189 |
| 3190 RUN(); |
| 3191 |
| 3192 CHECK_EQUAL_128(0x0001020304050607, 0x08090a0b0c0d0e0f, q0); |
| 3193 CHECK_EQUAL_128(0x0100020103020403, 0x0504060507060807, q1); |
| 3194 CHECK_EQUAL_128(0x0302010004030201, 0x0504030206050403, q2); |
| 3195 CHECK_EQUAL_128(0x0706050403020100, 0x0807060504030201, q3); |
| 3196 CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0706050003020100, q4); |
| 3197 CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0100050403020100, q5); |
| 3198 CHECK_EQUAL_128(0x0f0e0d0c03020100, 0x0706050403020100, q6); |
| 3199 CHECK_EQUAL_128(0x0706050403020100, 0x0706050403020100, q7); |
| 3200 |
| 3201 TEARDOWN(); |
| 3202 } |
| 3203 |
| 3204 TEST(neon_ld2_d) { |
| 3205 INIT_V8(); |
| 3206 SETUP(); |
| 3207 |
| 3208 uint8_t src[64 + 4]; |
| 3209 for (unsigned i = 0; i < sizeof(src); i++) { |
| 3210 src[i] = i; |
| 3211 } |
| 3212 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); |
| 3213 |
| 3214 START(); |
| 3215 __ Mov(x17, src_base); |
| 3216 __ Ld2(v2.V8B(), v3.V8B(), MemOperand(x17)); |
| 3217 __ Add(x17, x17, 1); |
| 3218 __ Ld2(v4.V8B(), v5.V8B(), MemOperand(x17)); |
| 3219 __ Add(x17, x17, 1); |
| 3220 __ Ld2(v6.V4H(), v7.V4H(), MemOperand(x17)); |
| 3221 __ Add(x17, x17, 1); |
| 3222 __ Ld2(v31.V2S(), v0.V2S(), MemOperand(x17)); |
| 3223 END(); |
| 3224 |
| 3225 RUN(); |
| 3226 |
| 3227 CHECK_EQUAL_128(0, 0x0e0c0a0806040200, q2); |
| 3228 CHECK_EQUAL_128(0, 0x0f0d0b0907050301, q3); |
| 3229 CHECK_EQUAL_128(0, 0x0f0d0b0907050301, q4); |
| 3230 CHECK_EQUAL_128(0, 0x100e0c0a08060402, q5); |
| 3231 CHECK_EQUAL_128(0, 0x0f0e0b0a07060302, q6); |
| 3232 CHECK_EQUAL_128(0, 0x11100d0c09080504, q7); |
| 3233 CHECK_EQUAL_128(0, 0x0e0d0c0b06050403, q31); |
| 3234 CHECK_EQUAL_128(0, 0x1211100f0a090807, q0); |
| 3235 |
| 3236 TEARDOWN(); |
| 3237 } |
| 3238 |
| 3239 TEST(neon_ld2_d_postindex) { |
| 3240 INIT_V8(); |
| 3241 SETUP(); |
| 3242 |
| 3243 uint8_t src[32 + 4]; |
| 3244 for (unsigned i = 0; i < sizeof(src); i++) { |
| 3245 src[i] = i; |
| 3246 } |
| 3247 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); |
| 3248 |
| 3249 START(); |
| 3250 __ Mov(x17, src_base); |
| 3251 __ Mov(x18, src_base + 1); |
| 3252 __ Mov(x19, src_base + 2); |
| 3253 __ Mov(x20, src_base + 3); |
| 3254 __ Mov(x21, src_base + 4); |
| 3255 __ Mov(x22, 1); |
| 3256 __ Ld2(v2.V8B(), v3.V8B(), MemOperand(x17, x22, PostIndex)); |
| 3257 __ Ld2(v4.V8B(), v5.V8B(), MemOperand(x18, 16, PostIndex)); |
| 3258 __ Ld2(v5.V4H(), v6.V4H(), MemOperand(x19, 16, PostIndex)); |
| 3259 __ Ld2(v16.V2S(), v17.V2S(), MemOperand(x20, 16, PostIndex)); |
| 3260 __ Ld2(v31.V2S(), v0.V2S(), MemOperand(x21, 16, PostIndex)); |
| 3261 END(); |
| 3262 |
| 3263 RUN(); |
| 3264 |
| 3265 CHECK_EQUAL_128(0, 0x0e0c0a0806040200, q2); |
| 3266 CHECK_EQUAL_128(0, 0x0f0d0b0907050301, q3); |
| 3267 CHECK_EQUAL_128(0, 0x0f0d0b0907050301, q4); |
| 3268 CHECK_EQUAL_128(0, 0x0f0e0b0a07060302, q5); |
| 3269 CHECK_EQUAL_128(0, 0x11100d0c09080504, q6); |
| 3270 CHECK_EQUAL_128(0, 0x0e0d0c0b06050403, q16); |
| 3271 CHECK_EQUAL_128(0, 0x1211100f0a090807, q17); |
| 3272 CHECK_EQUAL_128(0, 0x0f0e0d0c07060504, q31); |
| 3273 CHECK_EQUAL_128(0, 0x131211100b0a0908, q0); |
| 3274 |
| 3275 CHECK_EQUAL_64(src_base + 1, x17); |
| 3276 CHECK_EQUAL_64(src_base + 1 + 16, x18); |
| 3277 CHECK_EQUAL_64(src_base + 2 + 16, x19); |
| 3278 CHECK_EQUAL_64(src_base + 3 + 16, x20); |
| 3279 CHECK_EQUAL_64(src_base + 4 + 16, x21); |
| 3280 |
| 3281 TEARDOWN(); |
| 3282 } |
| 3283 |
| 3284 TEST(neon_ld2_q) { |
| 3285 INIT_V8(); |
| 3286 SETUP(); |
| 3287 |
| 3288 uint8_t src[64 + 4]; |
| 3289 for (unsigned i = 0; i < sizeof(src); i++) { |
| 3290 src[i] = i; |
| 3291 } |
| 3292 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); |
| 3293 |
| 3294 START(); |
| 3295 __ Mov(x17, src_base); |
| 3296 __ Ld2(v2.V16B(), v3.V16B(), MemOperand(x17)); |
| 3297 __ Add(x17, x17, 1); |
| 3298 __ Ld2(v4.V16B(), v5.V16B(), MemOperand(x17)); |
| 3299 __ Add(x17, x17, 1); |
| 3300 __ Ld2(v6.V8H(), v7.V8H(), MemOperand(x17)); |
| 3301 __ Add(x17, x17, 1); |
| 3302 __ Ld2(v16.V4S(), v17.V4S(), MemOperand(x17)); |
| 3303 __ Add(x17, x17, 1); |
| 3304 __ Ld2(v31.V2D(), v0.V2D(), MemOperand(x17)); |
| 3305 END(); |
| 3306 |
| 3307 RUN(); |
| 3308 |
| 3309 CHECK_EQUAL_128(0x1e1c1a1816141210, 0x0e0c0a0806040200, q2); |
| 3310 CHECK_EQUAL_128(0x1f1d1b1917151311, 0x0f0d0b0907050301, q3); |
| 3311 CHECK_EQUAL_128(0x1f1d1b1917151311, 0x0f0d0b0907050301, q4); |
| 3312 CHECK_EQUAL_128(0x201e1c1a18161412, 0x100e0c0a08060402, q5); |
| 3313 CHECK_EQUAL_128(0x1f1e1b1a17161312, 0x0f0e0b0a07060302, q6); |
| 3314 CHECK_EQUAL_128(0x21201d1c19181514, 0x11100d0c09080504, q7); |
| 3315 CHECK_EQUAL_128(0x1e1d1c1b16151413, 0x0e0d0c0b06050403, q16); |
| 3316 CHECK_EQUAL_128(0x2221201f1a191817, 0x1211100f0a090807, q17); |
| 3317 CHECK_EQUAL_128(0x1b1a191817161514, 0x0b0a090807060504, q31); |
| 3318 CHECK_EQUAL_128(0x232221201f1e1d1c, 0x131211100f0e0d0c, q0); |
| 3319 |
| 3320 TEARDOWN(); |
| 3321 } |
| 3322 |
| 3323 TEST(neon_ld2_q_postindex) { |
| 3324 INIT_V8(); |
| 3325 SETUP(); |
| 3326 |
| 3327 uint8_t src[64 + 4]; |
| 3328 for (unsigned i = 0; i < sizeof(src); i++) { |
| 3329 src[i] = i; |
| 3330 } |
| 3331 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); |
| 3332 |
| 3333 START(); |
| 3334 __ Mov(x17, src_base); |
| 3335 __ Mov(x18, src_base + 1); |
| 3336 __ Mov(x19, src_base + 2); |
| 3337 __ Mov(x20, src_base + 3); |
| 3338 __ Mov(x21, src_base + 4); |
| 3339 __ Mov(x22, 1); |
| 3340 __ Ld2(v2.V16B(), v3.V16B(), MemOperand(x17, x22, PostIndex)); |
| 3341 __ Ld2(v4.V16B(), v5.V16B(), MemOperand(x18, 32, PostIndex)); |
| 3342 __ Ld2(v6.V8H(), v7.V8H(), MemOperand(x19, 32, PostIndex)); |
| 3343 __ Ld2(v16.V4S(), v17.V4S(), MemOperand(x20, 32, PostIndex)); |
| 3344 __ Ld2(v31.V2D(), v0.V2D(), MemOperand(x21, 32, PostIndex)); |
| 3345 END(); |
| 3346 |
| 3347 RUN(); |
| 3348 |
| 3349 CHECK_EQUAL_128(0x1e1c1a1816141210, 0x0e0c0a0806040200, q2); |
| 3350 CHECK_EQUAL_128(0x1f1d1b1917151311, 0x0f0d0b0907050301, q3); |
| 3351 CHECK_EQUAL_128(0x1f1d1b1917151311, 0x0f0d0b0907050301, q4); |
| 3352 CHECK_EQUAL_128(0x201e1c1a18161412, 0x100e0c0a08060402, q5); |
| 3353 CHECK_EQUAL_128(0x1f1e1b1a17161312, 0x0f0e0b0a07060302, q6); |
| 3354 CHECK_EQUAL_128(0x21201d1c19181514, 0x11100d0c09080504, q7); |
| 3355 CHECK_EQUAL_128(0x1e1d1c1b16151413, 0x0e0d0c0b06050403, q16); |
| 3356 CHECK_EQUAL_128(0x2221201f1a191817, 0x1211100f0a090807, q17); |
| 3357 CHECK_EQUAL_128(0x1b1a191817161514, 0x0b0a090807060504, q31); |
| 3358 CHECK_EQUAL_128(0x232221201f1e1d1c, 0x131211100f0e0d0c, q0); |
| 3359 |
| 3360 CHECK_EQUAL_64(src_base + 1, x17); |
| 3361 CHECK_EQUAL_64(src_base + 1 + 32, x18); |
| 3362 CHECK_EQUAL_64(src_base + 2 + 32, x19); |
| 3363 CHECK_EQUAL_64(src_base + 3 + 32, x20); |
| 3364 CHECK_EQUAL_64(src_base + 4 + 32, x21); |
| 3365 |
| 3366 TEARDOWN(); |
| 3367 } |
| 3368 |
| 3369 TEST(neon_ld2_lane) { |
| 3370 INIT_V8(); |
| 3371 SETUP(); |
| 3372 |
| 3373 uint8_t src[64]; |
| 3374 for (unsigned i = 0; i < sizeof(src); i++) { |
| 3375 src[i] = i; |
| 3376 } |
| 3377 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); |
| 3378 |
| 3379 START(); |
| 3380 |
| 3381 // Test loading whole register by element. |
| 3382 __ Mov(x17, src_base); |
| 3383 for (int i = 15; i >= 0; i--) { |
| 3384 __ Ld2(v0.B(), v1.B(), i, MemOperand(x17)); |
| 3385 __ Add(x17, x17, 1); |
| 3386 } |
| 3387 |
| 3388 __ Mov(x17, src_base); |
| 3389 for (int i = 7; i >= 0; i--) { |
| 3390 __ Ld2(v2.H(), v3.H(), i, MemOperand(x17)); |
| 3391 __ Add(x17, x17, 1); |
| 3392 } |
| 3393 |
| 3394 __ Mov(x17, src_base); |
| 3395 for (int i = 3; i >= 0; i--) { |
| 3396 __ Ld2(v4.S(), v5.S(), i, MemOperand(x17)); |
| 3397 __ Add(x17, x17, 1); |
| 3398 } |
| 3399 |
| 3400 __ Mov(x17, src_base); |
| 3401 for (int i = 1; i >= 0; i--) { |
| 3402 __ Ld2(v6.D(), v7.D(), i, MemOperand(x17)); |
| 3403 __ Add(x17, x17, 1); |
| 3404 } |
| 3405 |
| 3406 // Test loading a single element into an initialised register. |
| 3407 __ Mov(x17, src_base); |
| 3408 __ Mov(x4, x17); |
| 3409 __ Ldr(q8, MemOperand(x4, 16, PostIndex)); |
| 3410 __ Ldr(q9, MemOperand(x4)); |
| 3411 __ Ld2(v8_.B(), v9.B(), 4, MemOperand(x17)); |
| 3412 __ Mov(x5, x17); |
| 3413 __ Ldr(q10, MemOperand(x5, 16, PostIndex)); |
| 3414 __ Ldr(q11, MemOperand(x5)); |
| 3415 __ Ld2(v10.H(), v11.H(), 3, MemOperand(x17)); |
| 3416 __ Mov(x6, x17); |
| 3417 __ Ldr(q12, MemOperand(x6, 16, PostIndex)); |
| 3418 __ Ldr(q13, MemOperand(x6)); |
| 3419 __ Ld2(v12.S(), v13.S(), 2, MemOperand(x17)); |
| 3420 __ Mov(x7, x17); |
| 3421 __ Ldr(q14, MemOperand(x7, 16, PostIndex)); |
| 3422 __ Ldr(q15, MemOperand(x7)); |
| 3423 __ Ld2(v14.D(), v15.D(), 1, MemOperand(x17)); |
| 3424 |
| 3425 END(); |
| 3426 |
| 3427 RUN(); |
| 3428 |
| 3429 CHECK_EQUAL_128(0x0001020304050607, 0x08090a0b0c0d0e0f, q0); |
| 3430 CHECK_EQUAL_128(0x0102030405060708, 0x090a0b0c0d0e0f10, q1); |
| 3431 CHECK_EQUAL_128(0x0100020103020403, 0x0504060507060807, q2); |
| 3432 CHECK_EQUAL_128(0x0302040305040605, 0x0706080709080a09, q3); |
| 3433 CHECK_EQUAL_128(0x0302010004030201, 0x0504030206050403, q4); |
| 3434 CHECK_EQUAL_128(0x0706050408070605, 0x090807060a090807, q5); |
| 3435 CHECK_EQUAL_128(0x0706050403020100, 0x0807060504030201, q6); |
| 3436 CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x100f0e0d0c0b0a09, q7); |
| 3437 CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0706050003020100, q8); |
| 3438 CHECK_EQUAL_128(0x1f1e1d1c1b1a1918, 0x1716150113121110, q9); |
| 3439 CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0100050403020100, q10); |
| 3440 CHECK_EQUAL_128(0x1f1e1d1c1b1a1918, 0x0302151413121110, q11); |
| 3441 CHECK_EQUAL_128(0x0f0e0d0c03020100, 0x0706050403020100, q12); |
| 3442 CHECK_EQUAL_128(0x1f1e1d1c07060504, 0x1716151413121110, q13); |
| 3443 CHECK_EQUAL_128(0x0706050403020100, 0x0706050403020100, q14); |
| 3444 CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x1716151413121110, q15); |
| 3445 |
| 3446 TEARDOWN(); |
| 3447 } |
| 3448 |
| 3449 TEST(neon_ld2_lane_postindex) { |
| 3450 INIT_V8(); |
| 3451 SETUP(); |
| 3452 |
| 3453 uint8_t src[64]; |
| 3454 for (unsigned i = 0; i < sizeof(src); i++) { |
| 3455 src[i] = i; |
| 3456 } |
| 3457 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); |
| 3458 |
| 3459 START(); |
| 3460 __ Mov(x17, src_base); |
| 3461 __ Mov(x18, src_base); |
| 3462 __ Mov(x19, src_base); |
| 3463 __ Mov(x20, src_base); |
| 3464 __ Mov(x21, src_base); |
| 3465 __ Mov(x22, src_base); |
| 3466 __ Mov(x23, src_base); |
| 3467 __ Mov(x24, src_base); |
| 3468 |
| 3469 // Test loading whole register by element. |
| 3470 for (int i = 15; i >= 0; i--) { |
| 3471 __ Ld2(v0.B(), v1.B(), i, MemOperand(x17, 2, PostIndex)); |
| 3472 } |
| 3473 |
| 3474 for (int i = 7; i >= 0; i--) { |
| 3475 __ Ld2(v2.H(), v3.H(), i, MemOperand(x18, 4, PostIndex)); |
| 3476 } |
| 3477 |
| 3478 for (int i = 3; i >= 0; i--) { |
| 3479 __ Ld2(v4.S(), v5.S(), i, MemOperand(x19, 8, PostIndex)); |
| 3480 } |
| 3481 |
| 3482 for (int i = 1; i >= 0; i--) { |
| 3483 __ Ld2(v6.D(), v7.D(), i, MemOperand(x20, 16, PostIndex)); |
| 3484 } |
| 3485 |
| 3486 // Test loading a single element into an initialised register. |
| 3487 __ Mov(x25, 1); |
| 3488 __ Mov(x4, x21); |
| 3489 __ Ldr(q8, MemOperand(x4, 16, PostIndex)); |
| 3490 __ Ldr(q9, MemOperand(x4)); |
| 3491 __ Ld2(v8_.B(), v9.B(), 4, MemOperand(x21, x25, PostIndex)); |
| 3492 __ Add(x25, x25, 1); |
| 3493 |
| 3494 __ Mov(x5, x22); |
| 3495 __ Ldr(q10, MemOperand(x5, 16, PostIndex)); |
| 3496 __ Ldr(q11, MemOperand(x5)); |
| 3497 __ Ld2(v10.H(), v11.H(), 3, MemOperand(x22, x25, PostIndex)); |
| 3498 __ Add(x25, x25, 1); |
| 3499 |
| 3500 __ Mov(x6, x23); |
| 3501 __ Ldr(q12, MemOperand(x6, 16, PostIndex)); |
| 3502 __ Ldr(q13, MemOperand(x6)); |
| 3503 __ Ld2(v12.S(), v13.S(), 2, MemOperand(x23, x25, PostIndex)); |
| 3504 __ Add(x25, x25, 1); |
| 3505 |
| 3506 __ Mov(x7, x24); |
| 3507 __ Ldr(q14, MemOperand(x7, 16, PostIndex)); |
| 3508 __ Ldr(q15, MemOperand(x7)); |
| 3509 __ Ld2(v14.D(), v15.D(), 1, MemOperand(x24, x25, PostIndex)); |
| 3510 |
| 3511 END(); |
| 3512 |
| 3513 RUN(); |
| 3514 |
| 3515 CHECK_EQUAL_128(0x00020406080a0c0e, 0x10121416181a1c1e, q0); |
| 3516 CHECK_EQUAL_128(0x01030507090b0d0f, 0x11131517191b1d1f, q1); |
| 3517 CHECK_EQUAL_128(0x0100050409080d0c, 0x1110151419181d1c, q2); |
| 3518 CHECK_EQUAL_128(0x030207060b0a0f0e, 0x131217161b1a1f1e, q3); |
| 3519 CHECK_EQUAL_128(0x030201000b0a0908, 0x131211101b1a1918, q4); |
| 3520 CHECK_EQUAL_128(0x070605040f0e0d0c, 0x171615141f1e1d1c, q5); |
| 3521 CHECK_EQUAL_128(0x0706050403020100, 0x1716151413121110, q6); |
| 3522 CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x1f1e1d1c1b1a1918, q7); |
| 3523 CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0706050003020100, q8); |
| 3524 CHECK_EQUAL_128(0x1f1e1d1c1b1a1918, 0x1716150113121110, q9); |
| 3525 CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0100050403020100, q10); |
| 3526 CHECK_EQUAL_128(0x1f1e1d1c1b1a1918, 0x0302151413121110, q11); |
| 3527 CHECK_EQUAL_128(0x0f0e0d0c03020100, 0x0706050403020100, q12); |
| 3528 CHECK_EQUAL_128(0x1f1e1d1c07060504, 0x1716151413121110, q13); |
| 3529 CHECK_EQUAL_128(0x0706050403020100, 0x0706050403020100, q14); |
| 3530 CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x1716151413121110, q15); |
| 3531 |
| 3532 CHECK_EQUAL_64(src_base + 32, x17); |
| 3533 CHECK_EQUAL_64(src_base + 32, x18); |
| 3534 CHECK_EQUAL_64(src_base + 32, x19); |
| 3535 CHECK_EQUAL_64(src_base + 32, x20); |
| 3536 CHECK_EQUAL_64(src_base + 1, x21); |
| 3537 CHECK_EQUAL_64(src_base + 2, x22); |
| 3538 CHECK_EQUAL_64(src_base + 3, x23); |
| 3539 CHECK_EQUAL_64(src_base + 4, x24); |
| 3540 |
| 3541 TEARDOWN(); |
| 3542 } |
| 3543 |
| 3544 TEST(neon_ld2_alllanes) { |
| 3545 INIT_V8(); |
| 3546 SETUP(); |
| 3547 |
| 3548 uint8_t src[64]; |
| 3549 for (unsigned i = 0; i < sizeof(src); i++) { |
| 3550 src[i] = i; |
| 3551 } |
| 3552 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); |
| 3553 |
| 3554 START(); |
| 3555 __ Mov(x17, src_base + 1); |
| 3556 __ Mov(x18, 1); |
| 3557 __ Ld2r(v0.V8B(), v1.V8B(), MemOperand(x17)); |
| 3558 __ Add(x17, x17, 2); |
| 3559 __ Ld2r(v2.V16B(), v3.V16B(), MemOperand(x17)); |
| 3560 __ Add(x17, x17, 1); |
| 3561 __ Ld2r(v4.V4H(), v5.V4H(), MemOperand(x17)); |
| 3562 __ Add(x17, x17, 1); |
| 3563 __ Ld2r(v6.V8H(), v7.V8H(), MemOperand(x17)); |
| 3564 __ Add(x17, x17, 4); |
| 3565 __ Ld2r(v8_.V2S(), v9.V2S(), MemOperand(x17)); |
| 3566 __ Add(x17, x17, 1); |
| 3567 __ Ld2r(v10.V4S(), v11.V4S(), MemOperand(x17)); |
| 3568 __ Add(x17, x17, 8); |
| 3569 __ Ld2r(v12.V2D(), v13.V2D(), MemOperand(x17)); |
| 3570 END(); |
| 3571 |
| 3572 RUN(); |
| 3573 |
| 3574 CHECK_EQUAL_128(0x0000000000000000, 0x0101010101010101, q0); |
| 3575 CHECK_EQUAL_128(0x0000000000000000, 0x0202020202020202, q1); |
| 3576 CHECK_EQUAL_128(0x0303030303030303, 0x0303030303030303, q2); |
| 3577 CHECK_EQUAL_128(0x0404040404040404, 0x0404040404040404, q3); |
| 3578 CHECK_EQUAL_128(0x0000000000000000, 0x0504050405040504, q4); |
| 3579 CHECK_EQUAL_128(0x0000000000000000, 0x0706070607060706, q5); |
| 3580 CHECK_EQUAL_128(0x0605060506050605, 0x0605060506050605, q6); |
| 3581 CHECK_EQUAL_128(0x0807080708070807, 0x0807080708070807, q7); |
| 3582 CHECK_EQUAL_128(0x0000000000000000, 0x0c0b0a090c0b0a09, q8); |
| 3583 CHECK_EQUAL_128(0x0000000000000000, 0x100f0e0d100f0e0d, q9); |
| 3584 CHECK_EQUAL_128(0x0d0c0b0a0d0c0b0a, 0x0d0c0b0a0d0c0b0a, q10); |
| 3585 CHECK_EQUAL_128(0x11100f0e11100f0e, 0x11100f0e11100f0e, q11); |
| 3586 CHECK_EQUAL_128(0x1918171615141312, 0x1918171615141312, q12); |
| 3587 CHECK_EQUAL_128(0x21201f1e1d1c1b1a, 0x21201f1e1d1c1b1a, q13); |
| 3588 |
| 3589 TEARDOWN(); |
| 3590 } |
| 3591 |
| 3592 TEST(neon_ld2_alllanes_postindex) { |
| 3593 INIT_V8(); |
| 3594 SETUP(); |
| 3595 |
| 3596 uint8_t src[64]; |
| 3597 for (unsigned i = 0; i < sizeof(src); i++) { |
| 3598 src[i] = i; |
| 3599 } |
| 3600 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); |
| 3601 |
| 3602 START(); |
| 3603 __ Mov(x17, src_base + 1); |
| 3604 __ Mov(x18, 1); |
| 3605 __ Ld2r(v0.V8B(), v1.V8B(), MemOperand(x17, 2, PostIndex)); |
| 3606 __ Ld2r(v2.V16B(), v3.V16B(), MemOperand(x17, x18, PostIndex)); |
| 3607 __ Ld2r(v4.V4H(), v5.V4H(), MemOperand(x17, x18, PostIndex)); |
| 3608 __ Ld2r(v6.V8H(), v7.V8H(), MemOperand(x17, 4, PostIndex)); |
| 3609 __ Ld2r(v8_.V2S(), v9.V2S(), MemOperand(x17, x18, PostIndex)); |
| 3610 __ Ld2r(v10.V4S(), v11.V4S(), MemOperand(x17, 8, PostIndex)); |
| 3611 __ Ld2r(v12.V2D(), v13.V2D(), MemOperand(x17, 16, PostIndex)); |
| 3612 END(); |
| 3613 |
| 3614 RUN(); |
| 3615 |
| 3616 CHECK_EQUAL_128(0x0000000000000000, 0x0101010101010101, q0); |
| 3617 CHECK_EQUAL_128(0x0000000000000000, 0x0202020202020202, q1); |
| 3618 CHECK_EQUAL_128(0x0303030303030303, 0x0303030303030303, q2); |
| 3619 CHECK_EQUAL_128(0x0404040404040404, 0x0404040404040404, q3); |
| 3620 CHECK_EQUAL_128(0x0000000000000000, 0x0504050405040504, q4); |
| 3621 CHECK_EQUAL_128(0x0000000000000000, 0x0706070607060706, q5); |
| 3622 CHECK_EQUAL_128(0x0605060506050605, 0x0605060506050605, q6); |
| 3623 CHECK_EQUAL_128(0x0807080708070807, 0x0807080708070807, q7); |
| 3624 CHECK_EQUAL_128(0x0000000000000000, 0x0c0b0a090c0b0a09, q8); |
| 3625 CHECK_EQUAL_128(0x0000000000000000, 0x100f0e0d100f0e0d, q9); |
| 3626 CHECK_EQUAL_128(0x0d0c0b0a0d0c0b0a, 0x0d0c0b0a0d0c0b0a, q10); |
| 3627 CHECK_EQUAL_128(0x11100f0e11100f0e, 0x11100f0e11100f0e, q11); |
| 3628 CHECK_EQUAL_128(0x1918171615141312, 0x1918171615141312, q12); |
| 3629 CHECK_EQUAL_128(0x21201f1e1d1c1b1a, 0x21201f1e1d1c1b1a, q13); |
| 3630 CHECK_EQUAL_64(src_base + 34, x17); |
| 3631 |
| 3632 TEARDOWN(); |
| 3633 } |
| 3634 |
| 3635 TEST(neon_ld3_d) { |
| 3636 INIT_V8(); |
| 3637 SETUP(); |
| 3638 |
| 3639 uint8_t src[64 + 4]; |
| 3640 for (unsigned i = 0; i < sizeof(src); i++) { |
| 3641 src[i] = i; |
| 3642 } |
| 3643 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); |
| 3644 |
| 3645 START(); |
| 3646 __ Mov(x17, src_base); |
| 3647 __ Ld3(v2.V8B(), v3.V8B(), v4.V8B(), MemOperand(x17)); |
| 3648 __ Add(x17, x17, 1); |
| 3649 __ Ld3(v5.V8B(), v6.V8B(), v7.V8B(), MemOperand(x17)); |
| 3650 __ Add(x17, x17, 1); |
| 3651 __ Ld3(v8_.V4H(), v9.V4H(), v10.V4H(), MemOperand(x17)); |
| 3652 __ Add(x17, x17, 1); |
| 3653 __ Ld3(v31.V2S(), v0.V2S(), v1.V2S(), MemOperand(x17)); |
| 3654 END(); |
| 3655 |
| 3656 RUN(); |
| 3657 |
| 3658 CHECK_EQUAL_128(0, 0x15120f0c09060300, q2); |
| 3659 CHECK_EQUAL_128(0, 0x1613100d0a070401, q3); |
| 3660 CHECK_EQUAL_128(0, 0x1714110e0b080502, q4); |
| 3661 CHECK_EQUAL_128(0, 0x1613100d0a070401, q5); |
| 3662 CHECK_EQUAL_128(0, 0x1714110e0b080502, q6); |
| 3663 CHECK_EQUAL_128(0, 0x1815120f0c090603, q7); |
| 3664 CHECK_EQUAL_128(0, 0x15140f0e09080302, q8); |
| 3665 CHECK_EQUAL_128(0, 0x171611100b0a0504, q9); |
| 3666 CHECK_EQUAL_128(0, 0x191813120d0c0706, q10); |
| 3667 CHECK_EQUAL_128(0, 0x1211100f06050403, q31); |
| 3668 CHECK_EQUAL_128(0, 0x161514130a090807, q0); |
| 3669 CHECK_EQUAL_128(0, 0x1a1918170e0d0c0b, q1); |
| 3670 |
| 3671 TEARDOWN(); |
| 3672 } |
| 3673 |
| 3674 TEST(neon_ld3_d_postindex) { |
| 3675 INIT_V8(); |
| 3676 SETUP(); |
| 3677 |
| 3678 uint8_t src[32 + 4]; |
| 3679 for (unsigned i = 0; i < sizeof(src); i++) { |
| 3680 src[i] = i; |
| 3681 } |
| 3682 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); |
| 3683 |
| 3684 START(); |
| 3685 __ Mov(x17, src_base); |
| 3686 __ Mov(x18, src_base + 1); |
| 3687 __ Mov(x19, src_base + 2); |
| 3688 __ Mov(x20, src_base + 3); |
| 3689 __ Mov(x21, src_base + 4); |
| 3690 __ Mov(x22, 1); |
| 3691 __ Ld3(v2.V8B(), v3.V8B(), v4.V8B(), MemOperand(x17, x22, PostIndex)); |
| 3692 __ Ld3(v5.V8B(), v6.V8B(), v7.V8B(), MemOperand(x18, 24, PostIndex)); |
| 3693 __ Ld3(v8_.V4H(), v9.V4H(), v10.V4H(), MemOperand(x19, 24, PostIndex)); |
| 3694 __ Ld3(v11.V2S(), v12.V2S(), v13.V2S(), MemOperand(x20, 24, PostIndex)); |
| 3695 __ Ld3(v31.V2S(), v0.V2S(), v1.V2S(), MemOperand(x21, 24, PostIndex)); |
| 3696 END(); |
| 3697 |
| 3698 RUN(); |
| 3699 |
| 3700 CHECK_EQUAL_128(0, 0x15120f0c09060300, q2); |
| 3701 CHECK_EQUAL_128(0, 0x1613100d0a070401, q3); |
| 3702 CHECK_EQUAL_128(0, 0x1714110e0b080502, q4); |
| 3703 CHECK_EQUAL_128(0, 0x1613100d0a070401, q5); |
| 3704 CHECK_EQUAL_128(0, 0x1714110e0b080502, q6); |
| 3705 CHECK_EQUAL_128(0, 0x1815120f0c090603, q7); |
| 3706 CHECK_EQUAL_128(0, 0x15140f0e09080302, q8); |
| 3707 CHECK_EQUAL_128(0, 0x171611100b0a0504, q9); |
| 3708 CHECK_EQUAL_128(0, 0x191813120d0c0706, q10); |
| 3709 CHECK_EQUAL_128(0, 0x1211100f06050403, q11); |
| 3710 CHECK_EQUAL_128(0, 0x161514130a090807, q12); |
| 3711 CHECK_EQUAL_128(0, 0x1a1918170e0d0c0b, q13); |
| 3712 CHECK_EQUAL_128(0, 0x1312111007060504, q31); |
| 3713 CHECK_EQUAL_128(0, 0x171615140b0a0908, q0); |
| 3714 CHECK_EQUAL_128(0, 0x1b1a19180f0e0d0c, q1); |
| 3715 |
| 3716 CHECK_EQUAL_64(src_base + 1, x17); |
| 3717 CHECK_EQUAL_64(src_base + 1 + 24, x18); |
| 3718 CHECK_EQUAL_64(src_base + 2 + 24, x19); |
| 3719 CHECK_EQUAL_64(src_base + 3 + 24, x20); |
| 3720 CHECK_EQUAL_64(src_base + 4 + 24, x21); |
| 3721 |
| 3722 TEARDOWN(); |
| 3723 } |
| 3724 |
| 3725 TEST(neon_ld3_q) { |
| 3726 INIT_V8(); |
| 3727 SETUP(); |
| 3728 |
| 3729 uint8_t src[64 + 4]; |
| 3730 for (unsigned i = 0; i < sizeof(src); i++) { |
| 3731 src[i] = i; |
| 3732 } |
| 3733 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); |
| 3734 |
| 3735 START(); |
| 3736 __ Mov(x17, src_base); |
| 3737 __ Ld3(v2.V16B(), v3.V16B(), v4.V16B(), MemOperand(x17)); |
| 3738 __ Add(x17, x17, 1); |
| 3739 __ Ld3(v5.V16B(), v6.V16B(), v7.V16B(), MemOperand(x17)); |
| 3740 __ Add(x17, x17, 1); |
| 3741 __ Ld3(v8_.V8H(), v9.V8H(), v10.V8H(), MemOperand(x17)); |
| 3742 __ Add(x17, x17, 1); |
| 3743 __ Ld3(v11.V4S(), v12.V4S(), v13.V4S(), MemOperand(x17)); |
| 3744 __ Add(x17, x17, 1); |
| 3745 __ Ld3(v31.V2D(), v0.V2D(), v1.V2D(), MemOperand(x17)); |
| 3746 END(); |
| 3747 |
| 3748 RUN(); |
| 3749 |
| 3750 CHECK_EQUAL_128(0x2d2a2724211e1b18, 0x15120f0c09060300, q2); |
| 3751 CHECK_EQUAL_128(0x2e2b2825221f1c19, 0x1613100d0a070401, q3); |
| 3752 CHECK_EQUAL_128(0x2f2c292623201d1a, 0x1714110e0b080502, q4); |
| 3753 CHECK_EQUAL_128(0x2e2b2825221f1c19, 0x1613100d0a070401, q5); |
| 3754 CHECK_EQUAL_128(0x2f2c292623201d1a, 0x1714110e0b080502, q6); |
| 3755 CHECK_EQUAL_128(0x302d2a2724211e1b, 0x1815120f0c090603, q7); |
| 3756 CHECK_EQUAL_128(0x2d2c272621201b1a, 0x15140f0e09080302, q8); |
| 3757 CHECK_EQUAL_128(0x2f2e292823221d1c, 0x171611100b0a0504, q9); |
| 3758 CHECK_EQUAL_128(0x31302b2a25241f1e, 0x191813120d0c0706, q10); |
| 3759 CHECK_EQUAL_128(0x2a2928271e1d1c1b, 0x1211100f06050403, q11); |
| 3760 CHECK_EQUAL_128(0x2e2d2c2b2221201f, 0x161514130a090807, q12); |
| 3761 CHECK_EQUAL_128(0x3231302f26252423, 0x1a1918170e0d0c0b, q13); |
| 3762 CHECK_EQUAL_128(0x232221201f1e1d1c, 0x0b0a090807060504, q31); |
| 3763 CHECK_EQUAL_128(0x2b2a292827262524, 0x131211100f0e0d0c, q0); |
| 3764 CHECK_EQUAL_128(0x333231302f2e2d2c, 0x1b1a191817161514, q1); |
| 3765 |
| 3766 TEARDOWN(); |
| 3767 } |
| 3768 |
| 3769 TEST(neon_ld3_q_postindex) { |
| 3770 INIT_V8(); |
| 3771 SETUP(); |
| 3772 |
| 3773 uint8_t src[64 + 4]; |
| 3774 for (unsigned i = 0; i < sizeof(src); i++) { |
| 3775 src[i] = i; |
| 3776 } |
| 3777 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); |
| 3778 |
| 3779 START(); |
| 3780 __ Mov(x17, src_base); |
| 3781 __ Mov(x18, src_base + 1); |
| 3782 __ Mov(x19, src_base + 2); |
| 3783 __ Mov(x20, src_base + 3); |
| 3784 __ Mov(x21, src_base + 4); |
| 3785 __ Mov(x22, 1); |
| 3786 |
| 3787 __ Ld3(v2.V16B(), v3.V16B(), v4.V16B(), MemOperand(x17, x22, PostIndex)); |
| 3788 __ Ld3(v5.V16B(), v6.V16B(), v7.V16B(), MemOperand(x18, 48, PostIndex)); |
| 3789 __ Ld3(v8_.V8H(), v9.V8H(), v10.V8H(), MemOperand(x19, 48, PostIndex)); |
| 3790 __ Ld3(v11.V4S(), v12.V4S(), v13.V4S(), MemOperand(x20, 48, PostIndex)); |
| 3791 __ Ld3(v31.V2D(), v0.V2D(), v1.V2D(), MemOperand(x21, 48, PostIndex)); |
| 3792 END(); |
| 3793 |
| 3794 RUN(); |
| 3795 |
| 3796 CHECK_EQUAL_128(0x2d2a2724211e1b18, 0x15120f0c09060300, q2); |
| 3797 CHECK_EQUAL_128(0x2e2b2825221f1c19, 0x1613100d0a070401, q3); |
| 3798 CHECK_EQUAL_128(0x2f2c292623201d1a, 0x1714110e0b080502, q4); |
| 3799 CHECK_EQUAL_128(0x2e2b2825221f1c19, 0x1613100d0a070401, q5); |
| 3800 CHECK_EQUAL_128(0x2f2c292623201d1a, 0x1714110e0b080502, q6); |
| 3801 CHECK_EQUAL_128(0x302d2a2724211e1b, 0x1815120f0c090603, q7); |
| 3802 CHECK_EQUAL_128(0x2d2c272621201b1a, 0x15140f0e09080302, q8); |
| 3803 CHECK_EQUAL_128(0x2f2e292823221d1c, 0x171611100b0a0504, q9); |
| 3804 CHECK_EQUAL_128(0x31302b2a25241f1e, 0x191813120d0c0706, q10); |
| 3805 CHECK_EQUAL_128(0x2a2928271e1d1c1b, 0x1211100f06050403, q11); |
| 3806 CHECK_EQUAL_128(0x2e2d2c2b2221201f, 0x161514130a090807, q12); |
| 3807 CHECK_EQUAL_128(0x3231302f26252423, 0x1a1918170e0d0c0b, q13); |
| 3808 CHECK_EQUAL_128(0x232221201f1e1d1c, 0x0b0a090807060504, q31); |
| 3809 CHECK_EQUAL_128(0x2b2a292827262524, 0x131211100f0e0d0c, q0); |
| 3810 CHECK_EQUAL_128(0x333231302f2e2d2c, 0x1b1a191817161514, q1); |
| 3811 |
| 3812 CHECK_EQUAL_64(src_base + 1, x17); |
| 3813 CHECK_EQUAL_64(src_base + 1 + 48, x18); |
| 3814 CHECK_EQUAL_64(src_base + 2 + 48, x19); |
| 3815 CHECK_EQUAL_64(src_base + 3 + 48, x20); |
| 3816 CHECK_EQUAL_64(src_base + 4 + 48, x21); |
| 3817 |
| 3818 TEARDOWN(); |
| 3819 } |
| 3820 |
| 3821 TEST(neon_ld3_lane) { |
| 3822 INIT_V8(); |
| 3823 SETUP(); |
| 3824 |
| 3825 uint8_t src[64]; |
| 3826 for (unsigned i = 0; i < sizeof(src); i++) { |
| 3827 src[i] = i; |
| 3828 } |
| 3829 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); |
| 3830 |
| 3831 START(); |
| 3832 |
| 3833 // Test loading whole register by element. |
| 3834 __ Mov(x17, src_base); |
| 3835 for (int i = 15; i >= 0; i--) { |
| 3836 __ Ld3(v0.B(), v1.B(), v2.B(), i, MemOperand(x17)); |
| 3837 __ Add(x17, x17, 1); |
| 3838 } |
| 3839 |
| 3840 __ Mov(x17, src_base); |
| 3841 for (int i = 7; i >= 0; i--) { |
| 3842 __ Ld3(v3.H(), v4.H(), v5.H(), i, MemOperand(x17)); |
| 3843 __ Add(x17, x17, 1); |
| 3844 } |
| 3845 |
| 3846 __ Mov(x17, src_base); |
| 3847 for (int i = 3; i >= 0; i--) { |
| 3848 __ Ld3(v6.S(), v7.S(), v8_.S(), i, MemOperand(x17)); |
| 3849 __ Add(x17, x17, 1); |
| 3850 } |
| 3851 |
| 3852 __ Mov(x17, src_base); |
| 3853 for (int i = 1; i >= 0; i--) { |
| 3854 __ Ld3(v9.D(), v10.D(), v11.D(), i, MemOperand(x17)); |
| 3855 __ Add(x17, x17, 1); |
| 3856 } |
| 3857 |
| 3858 // Test loading a single element into an initialised register. |
| 3859 __ Mov(x17, src_base); |
| 3860 __ Mov(x4, x17); |
| 3861 __ Ldr(q12, MemOperand(x4, 16, PostIndex)); |
| 3862 __ Ldr(q13, MemOperand(x4, 16, PostIndex)); |
| 3863 __ Ldr(q14, MemOperand(x4)); |
| 3864 __ Ld3(v12.B(), v13.B(), v14.B(), 4, MemOperand(x17)); |
| 3865 __ Mov(x5, x17); |
| 3866 __ Ldr(q15, MemOperand(x5, 16, PostIndex)); |
| 3867 __ Ldr(q16, MemOperand(x5, 16, PostIndex)); |
| 3868 __ Ldr(q17, MemOperand(x5)); |
| 3869 __ Ld3(v15.H(), v16.H(), v17.H(), 3, MemOperand(x17)); |
| 3870 __ Mov(x6, x17); |
| 3871 __ Ldr(q18, MemOperand(x6, 16, PostIndex)); |
| 3872 __ Ldr(q19, MemOperand(x6, 16, PostIndex)); |
| 3873 __ Ldr(q20, MemOperand(x6)); |
| 3874 __ Ld3(v18.S(), v19.S(), v20.S(), 2, MemOperand(x17)); |
| 3875 __ Mov(x7, x17); |
| 3876 __ Ldr(q21, MemOperand(x7, 16, PostIndex)); |
| 3877 __ Ldr(q22, MemOperand(x7, 16, PostIndex)); |
| 3878 __ Ldr(q23, MemOperand(x7)); |
| 3879 __ Ld3(v21.D(), v22.D(), v23.D(), 1, MemOperand(x17)); |
| 3880 |
| 3881 END(); |
| 3882 |
| 3883 RUN(); |
| 3884 |
| 3885 CHECK_EQUAL_128(0x0001020304050607, 0x08090a0b0c0d0e0f, q0); |
| 3886 CHECK_EQUAL_128(0x0102030405060708, 0x090a0b0c0d0e0f10, q1); |
| 3887 CHECK_EQUAL_128(0x0203040506070809, 0x0a0b0c0d0e0f1011, q2); |
| 3888 CHECK_EQUAL_128(0x0100020103020403, 0x0504060507060807, q3); |
| 3889 CHECK_EQUAL_128(0x0302040305040605, 0x0706080709080a09, q4); |
| 3890 CHECK_EQUAL_128(0x0504060507060807, 0x09080a090b0a0c0b, q5); |
| 3891 CHECK_EQUAL_128(0x0302010004030201, 0x0504030206050403, q6); |
| 3892 CHECK_EQUAL_128(0x0706050408070605, 0x090807060a090807, q7); |
| 3893 CHECK_EQUAL_128(0x0b0a09080c0b0a09, 0x0d0c0b0a0e0d0c0b, q8); |
| 3894 CHECK_EQUAL_128(0x0706050403020100, 0x0807060504030201, q9); |
| 3895 CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x100f0e0d0c0b0a09, q10); |
| 3896 CHECK_EQUAL_128(0x1716151413121110, 0x1817161514131211, q11); |
| 3897 CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0706050003020100, q12); |
| 3898 CHECK_EQUAL_128(0x1f1e1d1c1b1a1918, 0x1716150113121110, q13); |
| 3899 CHECK_EQUAL_128(0x2f2e2d2c2b2a2928, 0x2726250223222120, q14); |
| 3900 CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0100050403020100, q15); |
| 3901 CHECK_EQUAL_128(0x1f1e1d1c1b1a1918, 0x0302151413121110, q16); |
| 3902 CHECK_EQUAL_128(0x2f2e2d2c2b2a2928, 0x0504252423222120, q17); |
| 3903 |
| 3904 TEARDOWN(); |
| 3905 } |
| 3906 |
| 3907 TEST(neon_ld3_lane_postindex) { |
| 3908 INIT_V8(); |
| 3909 SETUP(); |
| 3910 |
| 3911 uint8_t src[64]; |
| 3912 for (unsigned i = 0; i < sizeof(src); i++) { |
| 3913 src[i] = i; |
| 3914 } |
| 3915 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); |
| 3916 |
| 3917 START(); |
| 3918 |
| 3919 // Test loading whole register by element. |
| 3920 __ Mov(x17, src_base); |
| 3921 __ Mov(x18, src_base); |
| 3922 __ Mov(x19, src_base); |
| 3923 __ Mov(x20, src_base); |
| 3924 __ Mov(x21, src_base); |
| 3925 __ Mov(x22, src_base); |
| 3926 __ Mov(x23, src_base); |
| 3927 __ Mov(x24, src_base); |
| 3928 for (int i = 15; i >= 0; i--) { |
| 3929 __ Ld3(v0.B(), v1.B(), v2.B(), i, MemOperand(x17, 3, PostIndex)); |
| 3930 } |
| 3931 |
| 3932 for (int i = 7; i >= 0; i--) { |
| 3933 __ Ld3(v3.H(), v4.H(), v5.H(), i, MemOperand(x18, 6, PostIndex)); |
| 3934 } |
| 3935 |
| 3936 for (int i = 3; i >= 0; i--) { |
| 3937 __ Ld3(v6.S(), v7.S(), v8_.S(), i, MemOperand(x19, 12, PostIndex)); |
| 3938 } |
| 3939 |
| 3940 for (int i = 1; i >= 0; i--) { |
| 3941 __ Ld3(v9.D(), v10.D(), v11.D(), i, MemOperand(x20, 24, PostIndex)); |
| 3942 } |
| 3943 |
| 3944 // Test loading a single element into an initialised register. |
| 3945 __ Mov(x25, 1); |
| 3946 __ Mov(x4, x21); |
| 3947 __ Ldr(q12, MemOperand(x4, 16, PostIndex)); |
| 3948 __ Ldr(q13, MemOperand(x4, 16, PostIndex)); |
| 3949 __ Ldr(q14, MemOperand(x4)); |
| 3950 __ Ld3(v12.B(), v13.B(), v14.B(), 4, MemOperand(x21, x25, PostIndex)); |
| 3951 __ Add(x25, x25, 1); |
| 3952 |
| 3953 __ Mov(x5, x22); |
| 3954 __ Ldr(q15, MemOperand(x5, 16, PostIndex)); |
| 3955 __ Ldr(q16, MemOperand(x5, 16, PostIndex)); |
| 3956 __ Ldr(q17, MemOperand(x5)); |
| 3957 __ Ld3(v15.H(), v16.H(), v17.H(), 3, MemOperand(x22, x25, PostIndex)); |
| 3958 __ Add(x25, x25, 1); |
| 3959 |
| 3960 __ Mov(x6, x23); |
| 3961 __ Ldr(q18, MemOperand(x6, 16, PostIndex)); |
| 3962 __ Ldr(q19, MemOperand(x6, 16, PostIndex)); |
| 3963 __ Ldr(q20, MemOperand(x6)); |
| 3964 __ Ld3(v18.S(), v19.S(), v20.S(), 2, MemOperand(x23, x25, PostIndex)); |
| 3965 __ Add(x25, x25, 1); |
| 3966 |
| 3967 __ Mov(x7, x24); |
| 3968 __ Ldr(q21, MemOperand(x7, 16, PostIndex)); |
| 3969 __ Ldr(q22, MemOperand(x7, 16, PostIndex)); |
| 3970 __ Ldr(q23, MemOperand(x7)); |
| 3971 __ Ld3(v21.D(), v22.D(), v23.D(), 1, MemOperand(x24, x25, PostIndex)); |
| 3972 |
| 3973 END(); |
| 3974 |
| 3975 RUN(); |
| 3976 |
| 3977 CHECK_EQUAL_128(0x000306090c0f1215, 0x181b1e2124272a2d, q0); |
| 3978 CHECK_EQUAL_128(0x0104070a0d101316, 0x191c1f2225282b2e, q1); |
| 3979 CHECK_EQUAL_128(0x0205080b0e111417, 0x1a1d202326292c2f, q2); |
| 3980 CHECK_EQUAL_128(0x010007060d0c1312, 0x19181f1e25242b2a, q3); |
| 3981 CHECK_EQUAL_128(0x030209080f0e1514, 0x1b1a212027262d2c, q4); |
| 3982 CHECK_EQUAL_128(0x05040b0a11101716, 0x1d1c232229282f2e, q5); |
| 3983 CHECK_EQUAL_128(0x030201000f0e0d0c, 0x1b1a191827262524, q6); |
| 3984 CHECK_EQUAL_128(0x0706050413121110, 0x1f1e1d1c2b2a2928, q7); |
| 3985 CHECK_EQUAL_128(0x0b0a090817161514, 0x232221202f2e2d2c, q8); |
| 3986 CHECK_EQUAL_128(0x0706050403020100, 0x1f1e1d1c1b1a1918, q9); |
| 3987 CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x2726252423222120, q10); |
| 3988 CHECK_EQUAL_128(0x1716151413121110, 0x2f2e2d2c2b2a2928, q11); |
| 3989 CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0706050003020100, q12); |
| 3990 CHECK_EQUAL_128(0x1f1e1d1c1b1a1918, 0x1716150113121110, q13); |
| 3991 CHECK_EQUAL_128(0x2f2e2d2c2b2a2928, 0x2726250223222120, q14); |
| 3992 CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0100050403020100, q15); |
| 3993 CHECK_EQUAL_128(0x1f1e1d1c1b1a1918, 0x0302151413121110, q16); |
| 3994 CHECK_EQUAL_128(0x2f2e2d2c2b2a2928, 0x0504252423222120, q17); |
| 3995 CHECK_EQUAL_128(0x0f0e0d0c03020100, 0x0706050403020100, q18); |
| 3996 CHECK_EQUAL_128(0x1f1e1d1c07060504, 0x1716151413121110, q19); |
| 3997 CHECK_EQUAL_128(0x2f2e2d2c0b0a0908, 0x2726252423222120, q20); |
| 3998 CHECK_EQUAL_128(0x0706050403020100, 0x0706050403020100, q21); |
| 3999 CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x1716151413121110, q22); |
| 4000 CHECK_EQUAL_128(0x1716151413121110, 0x2726252423222120, q23); |
| 4001 |
| 4002 CHECK_EQUAL_64(src_base + 48, x17); |
| 4003 CHECK_EQUAL_64(src_base + 48, x18); |
| 4004 CHECK_EQUAL_64(src_base + 48, x19); |
| 4005 CHECK_EQUAL_64(src_base + 48, x20); |
| 4006 CHECK_EQUAL_64(src_base + 1, x21); |
| 4007 CHECK_EQUAL_64(src_base + 2, x22); |
| 4008 CHECK_EQUAL_64(src_base + 3, x23); |
| 4009 CHECK_EQUAL_64(src_base + 4, x24); |
| 4010 |
| 4011 TEARDOWN(); |
| 4012 } |
| 4013 |
| 4014 TEST(neon_ld3_alllanes) { |
| 4015 INIT_V8(); |
| 4016 SETUP(); |
| 4017 |
| 4018 uint8_t src[64]; |
| 4019 for (unsigned i = 0; i < sizeof(src); i++) { |
| 4020 src[i] = i; |
| 4021 } |
| 4022 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); |
| 4023 |
| 4024 START(); |
| 4025 __ Mov(x17, src_base + 1); |
| 4026 __ Mov(x18, 1); |
| 4027 __ Ld3r(v0.V8B(), v1.V8B(), v2.V8B(), MemOperand(x17)); |
| 4028 __ Add(x17, x17, 3); |
| 4029 __ Ld3r(v3.V16B(), v4.V16B(), v5.V16B(), MemOperand(x17)); |
| 4030 __ Add(x17, x17, 1); |
| 4031 __ Ld3r(v6.V4H(), v7.V4H(), v8_.V4H(), MemOperand(x17)); |
| 4032 __ Add(x17, x17, 1); |
| 4033 __ Ld3r(v9.V8H(), v10.V8H(), v11.V8H(), MemOperand(x17)); |
| 4034 __ Add(x17, x17, 6); |
| 4035 __ Ld3r(v12.V2S(), v13.V2S(), v14.V2S(), MemOperand(x17)); |
| 4036 __ Add(x17, x17, 1); |
| 4037 __ Ld3r(v15.V4S(), v16.V4S(), v17.V4S(), MemOperand(x17)); |
| 4038 __ Add(x17, x17, 12); |
| 4039 __ Ld3r(v18.V2D(), v19.V2D(), v20.V2D(), MemOperand(x17)); |
| 4040 END(); |
| 4041 |
| 4042 RUN(); |
| 4043 |
| 4044 CHECK_EQUAL_128(0x0000000000000000, 0x0101010101010101, q0); |
| 4045 CHECK_EQUAL_128(0x0000000000000000, 0x0202020202020202, q1); |
| 4046 CHECK_EQUAL_128(0x0000000000000000, 0x0303030303030303, q2); |
| 4047 CHECK_EQUAL_128(0x0404040404040404, 0x0404040404040404, q3); |
| 4048 CHECK_EQUAL_128(0x0505050505050505, 0x0505050505050505, q4); |
| 4049 CHECK_EQUAL_128(0x0606060606060606, 0x0606060606060606, q5); |
| 4050 CHECK_EQUAL_128(0x0000000000000000, 0x0605060506050605, q6); |
| 4051 CHECK_EQUAL_128(0x0000000000000000, 0x0807080708070807, q7); |
| 4052 CHECK_EQUAL_128(0x0000000000000000, 0x0a090a090a090a09, q8); |
| 4053 CHECK_EQUAL_128(0x0706070607060706, 0x0706070607060706, q9); |
| 4054 CHECK_EQUAL_128(0x0908090809080908, 0x0908090809080908, q10); |
| 4055 CHECK_EQUAL_128(0x0b0a0b0a0b0a0b0a, 0x0b0a0b0a0b0a0b0a, q11); |
| 4056 CHECK_EQUAL_128(0x0000000000000000, 0x0f0e0d0c0f0e0d0c, q12); |
| 4057 CHECK_EQUAL_128(0x0000000000000000, 0x1312111013121110, q13); |
| 4058 CHECK_EQUAL_128(0x0000000000000000, 0x1716151417161514, q14); |
| 4059 CHECK_EQUAL_128(0x100f0e0d100f0e0d, 0x100f0e0d100f0e0d, q15); |
| 4060 CHECK_EQUAL_128(0x1413121114131211, 0x1413121114131211, q16); |
| 4061 CHECK_EQUAL_128(0x1817161518171615, 0x1817161518171615, q17); |
| 4062 CHECK_EQUAL_128(0x201f1e1d1c1b1a19, 0x201f1e1d1c1b1a19, q18); |
| 4063 CHECK_EQUAL_128(0x2827262524232221, 0x2827262524232221, q19); |
| 4064 CHECK_EQUAL_128(0x302f2e2d2c2b2a29, 0x302f2e2d2c2b2a29, q20); |
| 4065 |
| 4066 TEARDOWN(); |
| 4067 } |
| 4068 |
| 4069 TEST(neon_ld3_alllanes_postindex) { |
| 4070 INIT_V8(); |
| 4071 SETUP(); |
| 4072 |
| 4073 uint8_t src[64]; |
| 4074 for (unsigned i = 0; i < sizeof(src); i++) { |
| 4075 src[i] = i; |
| 4076 } |
| 4077 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); |
| 4078 __ Mov(x17, src_base + 1); |
| 4079 __ Mov(x18, 1); |
| 4080 |
| 4081 START(); |
| 4082 __ Mov(x17, src_base + 1); |
| 4083 __ Mov(x18, 1); |
| 4084 __ Ld3r(v0.V8B(), v1.V8B(), v2.V8B(), MemOperand(x17, 3, PostIndex)); |
| 4085 __ Ld3r(v3.V16B(), v4.V16B(), v5.V16B(), MemOperand(x17, x18, PostIndex)); |
| 4086 __ Ld3r(v6.V4H(), v7.V4H(), v8_.V4H(), MemOperand(x17, x18, PostIndex)); |
| 4087 __ Ld3r(v9.V8H(), v10.V8H(), v11.V8H(), MemOperand(x17, 6, PostIndex)); |
| 4088 __ Ld3r(v12.V2S(), v13.V2S(), v14.V2S(), MemOperand(x17, x18, PostIndex)); |
| 4089 __ Ld3r(v15.V4S(), v16.V4S(), v17.V4S(), MemOperand(x17, 12, PostIndex)); |
| 4090 __ Ld3r(v18.V2D(), v19.V2D(), v20.V2D(), MemOperand(x17, 24, PostIndex)); |
| 4091 END(); |
| 4092 |
| 4093 RUN(); |
| 4094 |
| 4095 CHECK_EQUAL_128(0x0000000000000000, 0x0101010101010101, q0); |
| 4096 CHECK_EQUAL_128(0x0000000000000000, 0x0202020202020202, q1); |
| 4097 CHECK_EQUAL_128(0x0000000000000000, 0x0303030303030303, q2); |
| 4098 CHECK_EQUAL_128(0x0404040404040404, 0x0404040404040404, q3); |
| 4099 CHECK_EQUAL_128(0x0505050505050505, 0x0505050505050505, q4); |
| 4100 CHECK_EQUAL_128(0x0606060606060606, 0x0606060606060606, q5); |
| 4101 CHECK_EQUAL_128(0x0000000000000000, 0x0605060506050605, q6); |
| 4102 CHECK_EQUAL_128(0x0000000000000000, 0x0807080708070807, q7); |
| 4103 CHECK_EQUAL_128(0x0000000000000000, 0x0a090a090a090a09, q8); |
| 4104 CHECK_EQUAL_128(0x0706070607060706, 0x0706070607060706, q9); |
| 4105 CHECK_EQUAL_128(0x0908090809080908, 0x0908090809080908, q10); |
| 4106 CHECK_EQUAL_128(0x0b0a0b0a0b0a0b0a, 0x0b0a0b0a0b0a0b0a, q11); |
| 4107 CHECK_EQUAL_128(0x0000000000000000, 0x0f0e0d0c0f0e0d0c, q12); |
| 4108 CHECK_EQUAL_128(0x0000000000000000, 0x1312111013121110, q13); |
| 4109 CHECK_EQUAL_128(0x0000000000000000, 0x1716151417161514, q14); |
| 4110 CHECK_EQUAL_128(0x100f0e0d100f0e0d, 0x100f0e0d100f0e0d, q15); |
| 4111 CHECK_EQUAL_128(0x1413121114131211, 0x1413121114131211, q16); |
| 4112 CHECK_EQUAL_128(0x1817161518171615, 0x1817161518171615, q17); |
| 4113 CHECK_EQUAL_128(0x201f1e1d1c1b1a19, 0x201f1e1d1c1b1a19, q18); |
| 4114 CHECK_EQUAL_128(0x2827262524232221, 0x2827262524232221, q19); |
| 4115 CHECK_EQUAL_128(0x302f2e2d2c2b2a29, 0x302f2e2d2c2b2a29, q20); |
| 4116 |
| 4117 TEARDOWN(); |
| 4118 } |
| 4119 |
| 4120 TEST(neon_ld4_d) { |
| 4121 INIT_V8(); |
| 4122 SETUP(); |
| 4123 |
| 4124 uint8_t src[64 + 4]; |
| 4125 for (unsigned i = 0; i < sizeof(src); i++) { |
| 4126 src[i] = i; |
| 4127 } |
| 4128 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); |
| 4129 |
| 4130 START(); |
| 4131 __ Mov(x17, src_base); |
| 4132 __ Ld4(v2.V8B(), v3.V8B(), v4.V8B(), v5.V8B(), MemOperand(x17)); |
| 4133 __ Add(x17, x17, 1); |
| 4134 __ Ld4(v6.V8B(), v7.V8B(), v8_.V8B(), v9.V8B(), MemOperand(x17)); |
| 4135 __ Add(x17, x17, 1); |
| 4136 __ Ld4(v10.V4H(), v11.V4H(), v12.V4H(), v13.V4H(), MemOperand(x17)); |
| 4137 __ Add(x17, x17, 1); |
| 4138 __ Ld4(v30.V2S(), v31.V2S(), v0.V2S(), v1.V2S(), MemOperand(x17)); |
| 4139 END(); |
| 4140 |
| 4141 RUN(); |
| 4142 |
| 4143 CHECK_EQUAL_128(0, 0x1c1814100c080400, q2); |
| 4144 CHECK_EQUAL_128(0, 0x1d1915110d090501, q3); |
| 4145 CHECK_EQUAL_128(0, 0x1e1a16120e0a0602, q4); |
| 4146 CHECK_EQUAL_128(0, 0x1f1b17130f0b0703, q5); |
| 4147 CHECK_EQUAL_128(0, 0x1d1915110d090501, q6); |
| 4148 CHECK_EQUAL_128(0, 0x1e1a16120e0a0602, q7); |
| 4149 CHECK_EQUAL_128(0, 0x1f1b17130f0b0703, q8); |
| 4150 CHECK_EQUAL_128(0, 0x201c1814100c0804, q9); |
| 4151 CHECK_EQUAL_128(0, 0x1b1a13120b0a0302, q10); |
| 4152 CHECK_EQUAL_128(0, 0x1d1c15140d0c0504, q11); |
| 4153 CHECK_EQUAL_128(0, 0x1f1e17160f0e0706, q12); |
| 4154 CHECK_EQUAL_128(0, 0x2120191811100908, q13); |
| 4155 CHECK_EQUAL_128(0, 0x1615141306050403, q30); |
| 4156 CHECK_EQUAL_128(0, 0x1a1918170a090807, q31); |
| 4157 CHECK_EQUAL_128(0, 0x1e1d1c1b0e0d0c0b, q0); |
| 4158 CHECK_EQUAL_128(0, 0x2221201f1211100f, q1); |
| 4159 |
| 4160 TEARDOWN(); |
| 4161 } |
| 4162 |
| 4163 TEST(neon_ld4_d_postindex) { |
| 4164 INIT_V8(); |
| 4165 SETUP(); |
| 4166 |
| 4167 uint8_t src[32 + 4]; |
| 4168 for (unsigned i = 0; i < sizeof(src); i++) { |
| 4169 src[i] = i; |
| 4170 } |
| 4171 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); |
| 4172 |
| 4173 START(); |
| 4174 __ Mov(x17, src_base); |
| 4175 __ Mov(x18, src_base + 1); |
| 4176 __ Mov(x19, src_base + 2); |
| 4177 __ Mov(x20, src_base + 3); |
| 4178 __ Mov(x21, src_base + 4); |
| 4179 __ Mov(x22, 1); |
| 4180 __ Ld4(v2.V8B(), v3.V8B(), v4.V8B(), v5.V8B(), |
| 4181 MemOperand(x17, x22, PostIndex)); |
| 4182 __ Ld4(v6.V8B(), v7.V8B(), v8_.V8B(), v9.V8B(), |
| 4183 MemOperand(x18, 32, PostIndex)); |
| 4184 __ Ld4(v10.V4H(), v11.V4H(), v12.V4H(), v13.V4H(), |
| 4185 MemOperand(x19, 32, PostIndex)); |
| 4186 __ Ld4(v14.V2S(), v15.V2S(), v16.V2S(), v17.V2S(), |
| 4187 MemOperand(x20, 32, PostIndex)); |
| 4188 __ Ld4(v30.V2S(), v31.V2S(), v0.V2S(), v1.V2S(), |
| 4189 MemOperand(x21, 32, PostIndex)); |
| 4190 END(); |
| 4191 |
| 4192 RUN(); |
| 4193 |
| 4194 CHECK_EQUAL_128(0, 0x1c1814100c080400, q2); |
| 4195 CHECK_EQUAL_128(0, 0x1d1915110d090501, q3); |
| 4196 CHECK_EQUAL_128(0, 0x1e1a16120e0a0602, q4); |
| 4197 CHECK_EQUAL_128(0, 0x1f1b17130f0b0703, q5); |
| 4198 CHECK_EQUAL_128(0, 0x1d1915110d090501, q6); |
| 4199 CHECK_EQUAL_128(0, 0x1e1a16120e0a0602, q7); |
| 4200 CHECK_EQUAL_128(0, 0x1f1b17130f0b0703, q8); |
| 4201 CHECK_EQUAL_128(0, 0x201c1814100c0804, q9); |
| 4202 CHECK_EQUAL_128(0, 0x1b1a13120b0a0302, q10); |
| 4203 CHECK_EQUAL_128(0, 0x1d1c15140d0c0504, q11); |
| 4204 CHECK_EQUAL_128(0, 0x1f1e17160f0e0706, q12); |
| 4205 CHECK_EQUAL_128(0, 0x2120191811100908, q13); |
| 4206 CHECK_EQUAL_128(0, 0x1615141306050403, q14); |
| 4207 CHECK_EQUAL_128(0, 0x1a1918170a090807, q15); |
| 4208 CHECK_EQUAL_128(0, 0x1e1d1c1b0e0d0c0b, q16); |
| 4209 CHECK_EQUAL_128(0, 0x2221201f1211100f, q17); |
| 4210 CHECK_EQUAL_128(0, 0x1716151407060504, q30); |
| 4211 CHECK_EQUAL_128(0, 0x1b1a19180b0a0908, q31); |
| 4212 CHECK_EQUAL_128(0, 0x1f1e1d1c0f0e0d0c, q0); |
| 4213 CHECK_EQUAL_128(0, 0x2322212013121110, q1); |
| 4214 |
| 4215 CHECK_EQUAL_64(src_base + 1, x17); |
| 4216 CHECK_EQUAL_64(src_base + 1 + 32, x18); |
| 4217 CHECK_EQUAL_64(src_base + 2 + 32, x19); |
| 4218 CHECK_EQUAL_64(src_base + 3 + 32, x20); |
| 4219 CHECK_EQUAL_64(src_base + 4 + 32, x21); |
| 4220 TEARDOWN(); |
| 4221 } |
| 4222 |
| 4223 TEST(neon_ld4_q) { |
| 4224 INIT_V8(); |
| 4225 SETUP(); |
| 4226 |
| 4227 uint8_t src[64 + 4]; |
| 4228 for (unsigned i = 0; i < sizeof(src); i++) { |
| 4229 src[i] = i; |
| 4230 } |
| 4231 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); |
| 4232 |
| 4233 START(); |
| 4234 __ Mov(x17, src_base); |
| 4235 __ Ld4(v2.V16B(), v3.V16B(), v4.V16B(), v5.V16B(), MemOperand(x17)); |
| 4236 __ Add(x17, x17, 1); |
| 4237 __ Ld4(v6.V16B(), v7.V16B(), v8_.V16B(), v9.V16B(), MemOperand(x17)); |
| 4238 __ Add(x17, x17, 1); |
| 4239 __ Ld4(v10.V8H(), v11.V8H(), v12.V8H(), v13.V8H(), MemOperand(x17)); |
| 4240 __ Add(x17, x17, 1); |
| 4241 __ Ld4(v14.V4S(), v15.V4S(), v16.V4S(), v17.V4S(), MemOperand(x17)); |
| 4242 __ Add(x17, x17, 1); |
| 4243 __ Ld4(v18.V2D(), v19.V2D(), v20.V2D(), v21.V2D(), MemOperand(x17)); |
| 4244 END(); |
| 4245 |
| 4246 RUN(); |
| 4247 |
| 4248 CHECK_EQUAL_128(0x3c3834302c282420, 0x1c1814100c080400, q2); |
| 4249 CHECK_EQUAL_128(0x3d3935312d292521, 0x1d1915110d090501, q3); |
| 4250 CHECK_EQUAL_128(0x3e3a36322e2a2622, 0x1e1a16120e0a0602, q4); |
| 4251 CHECK_EQUAL_128(0x3f3b37332f2b2723, 0x1f1b17130f0b0703, q5); |
| 4252 CHECK_EQUAL_128(0x3d3935312d292521, 0x1d1915110d090501, q6); |
| 4253 CHECK_EQUAL_128(0x3e3a36322e2a2622, 0x1e1a16120e0a0602, q7); |
| 4254 CHECK_EQUAL_128(0x3f3b37332f2b2723, 0x1f1b17130f0b0703, q8); |
| 4255 CHECK_EQUAL_128(0x403c3834302c2824, 0x201c1814100c0804, q9); |
| 4256 CHECK_EQUAL_128(0x3b3a33322b2a2322, 0x1b1a13120b0a0302, q10); |
| 4257 CHECK_EQUAL_128(0x3d3c35342d2c2524, 0x1d1c15140d0c0504, q11); |
| 4258 CHECK_EQUAL_128(0x3f3e37362f2e2726, 0x1f1e17160f0e0706, q12); |
| 4259 CHECK_EQUAL_128(0x4140393831302928, 0x2120191811100908, q13); |
| 4260 CHECK_EQUAL_128(0x3635343326252423, 0x1615141306050403, q14); |
| 4261 CHECK_EQUAL_128(0x3a3938372a292827, 0x1a1918170a090807, q15); |
| 4262 CHECK_EQUAL_128(0x3e3d3c3b2e2d2c2b, 0x1e1d1c1b0e0d0c0b, q16); |
| 4263 CHECK_EQUAL_128(0x4241403f3231302f, 0x2221201f1211100f, q17); |
| 4264 CHECK_EQUAL_128(0x2b2a292827262524, 0x0b0a090807060504, q18); |
| 4265 CHECK_EQUAL_128(0x333231302f2e2d2c, 0x131211100f0e0d0c, q19); |
| 4266 CHECK_EQUAL_128(0x3b3a393837363534, 0x1b1a191817161514, q20); |
| 4267 CHECK_EQUAL_128(0x434241403f3e3d3c, 0x232221201f1e1d1c, q21); |
| 4268 TEARDOWN(); |
| 4269 } |
| 4270 |
| 4271 TEST(neon_ld4_q_postindex) { |
| 4272 INIT_V8(); |
| 4273 SETUP(); |
| 4274 |
| 4275 uint8_t src[64 + 4]; |
| 4276 for (unsigned i = 0; i < sizeof(src); i++) { |
| 4277 src[i] = i; |
| 4278 } |
| 4279 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); |
| 4280 |
| 4281 START(); |
| 4282 __ Mov(x17, src_base); |
| 4283 __ Mov(x18, src_base + 1); |
| 4284 __ Mov(x19, src_base + 2); |
| 4285 __ Mov(x20, src_base + 3); |
| 4286 __ Mov(x21, src_base + 4); |
| 4287 __ Mov(x22, 1); |
| 4288 |
| 4289 __ Ld4(v2.V16B(), v3.V16B(), v4.V16B(), v5.V16B(), |
| 4290 MemOperand(x17, x22, PostIndex)); |
| 4291 __ Ld4(v6.V16B(), v7.V16B(), v8_.V16B(), v9.V16B(), |
| 4292 MemOperand(x18, 64, PostIndex)); |
| 4293 __ Ld4(v10.V8H(), v11.V8H(), v12.V8H(), v13.V8H(), |
| 4294 MemOperand(x19, 64, PostIndex)); |
| 4295 __ Ld4(v14.V4S(), v15.V4S(), v16.V4S(), v17.V4S(), |
| 4296 MemOperand(x20, 64, PostIndex)); |
| 4297 __ Ld4(v30.V2D(), v31.V2D(), v0.V2D(), v1.V2D(), |
| 4298 MemOperand(x21, 64, PostIndex)); |
| 4299 END(); |
| 4300 |
| 4301 RUN(); |
| 4302 |
| 4303 CHECK_EQUAL_128(0x3c3834302c282420, 0x1c1814100c080400, q2); |
| 4304 CHECK_EQUAL_128(0x3d3935312d292521, 0x1d1915110d090501, q3); |
| 4305 CHECK_EQUAL_128(0x3e3a36322e2a2622, 0x1e1a16120e0a0602, q4); |
| 4306 CHECK_EQUAL_128(0x3f3b37332f2b2723, 0x1f1b17130f0b0703, q5); |
| 4307 CHECK_EQUAL_128(0x3d3935312d292521, 0x1d1915110d090501, q6); |
| 4308 CHECK_EQUAL_128(0x3e3a36322e2a2622, 0x1e1a16120e0a0602, q7); |
| 4309 CHECK_EQUAL_128(0x3f3b37332f2b2723, 0x1f1b17130f0b0703, q8); |
| 4310 CHECK_EQUAL_128(0x403c3834302c2824, 0x201c1814100c0804, q9); |
| 4311 CHECK_EQUAL_128(0x3b3a33322b2a2322, 0x1b1a13120b0a0302, q10); |
| 4312 CHECK_EQUAL_128(0x3d3c35342d2c2524, 0x1d1c15140d0c0504, q11); |
| 4313 CHECK_EQUAL_128(0x3f3e37362f2e2726, 0x1f1e17160f0e0706, q12); |
| 4314 CHECK_EQUAL_128(0x4140393831302928, 0x2120191811100908, q13); |
| 4315 CHECK_EQUAL_128(0x3635343326252423, 0x1615141306050403, q14); |
| 4316 CHECK_EQUAL_128(0x3a3938372a292827, 0x1a1918170a090807, q15); |
| 4317 CHECK_EQUAL_128(0x3e3d3c3b2e2d2c2b, 0x1e1d1c1b0e0d0c0b, q16); |
| 4318 CHECK_EQUAL_128(0x4241403f3231302f, 0x2221201f1211100f, q17); |
| 4319 CHECK_EQUAL_128(0x2b2a292827262524, 0x0b0a090807060504, q30); |
| 4320 CHECK_EQUAL_128(0x333231302f2e2d2c, 0x131211100f0e0d0c, q31); |
| 4321 CHECK_EQUAL_128(0x3b3a393837363534, 0x1b1a191817161514, q0); |
| 4322 CHECK_EQUAL_128(0x434241403f3e3d3c, 0x232221201f1e1d1c, q1); |
| 4323 |
| 4324 CHECK_EQUAL_64(src_base + 1, x17); |
| 4325 CHECK_EQUAL_64(src_base + 1 + 64, x18); |
| 4326 CHECK_EQUAL_64(src_base + 2 + 64, x19); |
| 4327 CHECK_EQUAL_64(src_base + 3 + 64, x20); |
| 4328 CHECK_EQUAL_64(src_base + 4 + 64, x21); |
| 4329 |
| 4330 TEARDOWN(); |
| 4331 } |
| 4332 |
| 4333 TEST(neon_ld4_lane) { |
| 4334 INIT_V8(); |
| 4335 SETUP(); |
| 4336 |
| 4337 uint8_t src[64]; |
| 4338 for (unsigned i = 0; i < sizeof(src); i++) { |
| 4339 src[i] = i; |
| 4340 } |
| 4341 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); |
| 4342 |
| 4343 START(); |
| 4344 |
| 4345 // Test loading whole register by element. |
| 4346 __ Mov(x17, src_base); |
| 4347 for (int i = 15; i >= 0; i--) { |
| 4348 __ Ld4(v0.B(), v1.B(), v2.B(), v3.B(), i, MemOperand(x17)); |
| 4349 __ Add(x17, x17, 1); |
| 4350 } |
| 4351 |
| 4352 __ Mov(x17, src_base); |
| 4353 for (int i = 7; i >= 0; i--) { |
| 4354 __ Ld4(v4.H(), v5.H(), v6.H(), v7.H(), i, MemOperand(x17)); |
| 4355 __ Add(x17, x17, 1); |
| 4356 } |
| 4357 |
| 4358 __ Mov(x17, src_base); |
| 4359 for (int i = 3; i >= 0; i--) { |
| 4360 __ Ld4(v8_.S(), v9.S(), v10.S(), v11.S(), i, MemOperand(x17)); |
| 4361 __ Add(x17, x17, 1); |
| 4362 } |
| 4363 |
| 4364 __ Mov(x17, src_base); |
| 4365 for (int i = 1; i >= 0; i--) { |
| 4366 __ Ld4(v12.D(), v13.D(), v14.D(), v15.D(), i, MemOperand(x17)); |
| 4367 __ Add(x17, x17, 1); |
| 4368 } |
| 4369 |
| 4370 // Test loading a single element into an initialised register. |
| 4371 __ Mov(x17, src_base); |
| 4372 __ Mov(x4, x17); |
| 4373 __ Ldr(q16, MemOperand(x4, 16, PostIndex)); |
| 4374 __ Ldr(q17, MemOperand(x4, 16, PostIndex)); |
| 4375 __ Ldr(q18, MemOperand(x4, 16, PostIndex)); |
| 4376 __ Ldr(q19, MemOperand(x4)); |
| 4377 __ Ld4(v16.B(), v17.B(), v18.B(), v19.B(), 4, MemOperand(x17)); |
| 4378 |
| 4379 __ Mov(x5, x17); |
| 4380 __ Ldr(q20, MemOperand(x5, 16, PostIndex)); |
| 4381 __ Ldr(q21, MemOperand(x5, 16, PostIndex)); |
| 4382 __ Ldr(q22, MemOperand(x5, 16, PostIndex)); |
| 4383 __ Ldr(q23, MemOperand(x5)); |
| 4384 __ Ld4(v20.H(), v21.H(), v22.H(), v23.H(), 3, MemOperand(x17)); |
| 4385 |
| 4386 __ Mov(x6, x17); |
| 4387 __ Ldr(q24, MemOperand(x6, 16, PostIndex)); |
| 4388 __ Ldr(q25, MemOperand(x6, 16, PostIndex)); |
| 4389 __ Ldr(q26, MemOperand(x6, 16, PostIndex)); |
| 4390 __ Ldr(q27, MemOperand(x6)); |
| 4391 __ Ld4(v24.S(), v25.S(), v26.S(), v27.S(), 2, MemOperand(x17)); |
| 4392 |
| 4393 __ Mov(x7, x17); |
| 4394 __ Ldr(q28, MemOperand(x7, 16, PostIndex)); |
| 4395 __ Ldr(q29, MemOperand(x7, 16, PostIndex)); |
| 4396 __ Ldr(q30, MemOperand(x7, 16, PostIndex)); |
| 4397 __ Ldr(q31, MemOperand(x7)); |
| 4398 __ Ld4(v28.D(), v29.D(), v30.D(), v31.D(), 1, MemOperand(x17)); |
| 4399 |
| 4400 END(); |
| 4401 |
| 4402 RUN(); |
| 4403 |
| 4404 CHECK_EQUAL_128(0x0001020304050607, 0x08090a0b0c0d0e0f, q0); |
| 4405 CHECK_EQUAL_128(0x0102030405060708, 0x090a0b0c0d0e0f10, q1); |
| 4406 CHECK_EQUAL_128(0x0203040506070809, 0x0a0b0c0d0e0f1011, q2); |
| 4407 CHECK_EQUAL_128(0x030405060708090a, 0x0b0c0d0e0f101112, q3); |
| 4408 CHECK_EQUAL_128(0x0100020103020403, 0x0504060507060807, q4); |
| 4409 CHECK_EQUAL_128(0x0302040305040605, 0x0706080709080a09, q5); |
| 4410 CHECK_EQUAL_128(0x0504060507060807, 0x09080a090b0a0c0b, q6); |
| 4411 CHECK_EQUAL_128(0x0706080709080a09, 0x0b0a0c0b0d0c0e0d, q7); |
| 4412 CHECK_EQUAL_128(0x0302010004030201, 0x0504030206050403, q8); |
| 4413 CHECK_EQUAL_128(0x0706050408070605, 0x090807060a090807, q9); |
| 4414 CHECK_EQUAL_128(0x0b0a09080c0b0a09, 0x0d0c0b0a0e0d0c0b, q10); |
| 4415 CHECK_EQUAL_128(0x0f0e0d0c100f0e0d, 0x11100f0e1211100f, q11); |
| 4416 CHECK_EQUAL_128(0x0706050403020100, 0x0807060504030201, q12); |
| 4417 CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x100f0e0d0c0b0a09, q13); |
| 4418 CHECK_EQUAL_128(0x1716151413121110, 0x1817161514131211, q14); |
| 4419 CHECK_EQUAL_128(0x1f1e1d1c1b1a1918, 0x201f1e1d1c1b1a19, q15); |
| 4420 CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0706050003020100, q16); |
| 4421 CHECK_EQUAL_128(0x1f1e1d1c1b1a1918, 0x1716150113121110, q17); |
| 4422 CHECK_EQUAL_128(0x2f2e2d2c2b2a2928, 0x2726250223222120, q18); |
| 4423 CHECK_EQUAL_128(0x3f3e3d3c3b3a3938, 0x3736350333323130, q19); |
| 4424 CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0100050403020100, q20); |
| 4425 CHECK_EQUAL_128(0x1f1e1d1c1b1a1918, 0x0302151413121110, q21); |
| 4426 CHECK_EQUAL_128(0x2f2e2d2c2b2a2928, 0x0504252423222120, q22); |
| 4427 CHECK_EQUAL_128(0x3f3e3d3c3b3a3938, 0x0706353433323130, q23); |
| 4428 CHECK_EQUAL_128(0x0f0e0d0c03020100, 0x0706050403020100, q24); |
| 4429 CHECK_EQUAL_128(0x1f1e1d1c07060504, 0x1716151413121110, q25); |
| 4430 CHECK_EQUAL_128(0x2f2e2d2c0b0a0908, 0x2726252423222120, q26); |
| 4431 CHECK_EQUAL_128(0x3f3e3d3c0f0e0d0c, 0x3736353433323130, q27); |
| 4432 CHECK_EQUAL_128(0x0706050403020100, 0x0706050403020100, q28); |
| 4433 CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x1716151413121110, q29); |
| 4434 CHECK_EQUAL_128(0x1716151413121110, 0x2726252423222120, q30); |
| 4435 CHECK_EQUAL_128(0x1f1e1d1c1b1a1918, 0x3736353433323130, q31); |
| 4436 |
| 4437 TEARDOWN(); |
| 4438 } |
| 4439 |
| 4440 TEST(neon_ld4_lane_postindex) { |
| 4441 INIT_V8(); |
| 4442 SETUP(); |
| 4443 |
| 4444 uint8_t src[64]; |
| 4445 for (unsigned i = 0; i < sizeof(src); i++) { |
| 4446 src[i] = i; |
| 4447 } |
| 4448 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); |
| 4449 |
| 4450 START(); |
| 4451 |
| 4452 // Test loading whole register by element. |
| 4453 __ Mov(x17, src_base); |
| 4454 for (int i = 15; i >= 0; i--) { |
| 4455 __ Ld4(v0.B(), v1.B(), v2.B(), v3.B(), i, MemOperand(x17, 4, PostIndex)); |
| 4456 } |
| 4457 |
| 4458 __ Mov(x18, src_base); |
| 4459 for (int i = 7; i >= 0; i--) { |
| 4460 __ Ld4(v4.H(), v5.H(), v6.H(), v7.H(), i, MemOperand(x18, 8, PostIndex)); |
| 4461 } |
| 4462 |
| 4463 __ Mov(x19, src_base); |
| 4464 for (int i = 3; i >= 0; i--) { |
| 4465 __ Ld4(v8_.S(), v9.S(), v10.S(), v11.S(), i, |
| 4466 MemOperand(x19, 16, PostIndex)); |
| 4467 } |
| 4468 |
| 4469 __ Mov(x20, src_base); |
| 4470 for (int i = 1; i >= 0; i--) { |
| 4471 __ Ld4(v12.D(), v13.D(), v14.D(), v15.D(), i, |
| 4472 MemOperand(x20, 32, PostIndex)); |
| 4473 } |
| 4474 |
| 4475 // Test loading a single element into an initialised register. |
| 4476 __ Mov(x25, 1); |
| 4477 __ Mov(x21, src_base); |
| 4478 __ Mov(x22, src_base); |
| 4479 __ Mov(x23, src_base); |
| 4480 __ Mov(x24, src_base); |
| 4481 |
| 4482 __ Mov(x4, x21); |
| 4483 __ Ldr(q16, MemOperand(x4, 16, PostIndex)); |
| 4484 __ Ldr(q17, MemOperand(x4, 16, PostIndex)); |
| 4485 __ Ldr(q18, MemOperand(x4, 16, PostIndex)); |
| 4486 __ Ldr(q19, MemOperand(x4)); |
| 4487 __ Ld4(v16.B(), v17.B(), v18.B(), v19.B(), 4, |
| 4488 MemOperand(x21, x25, PostIndex)); |
| 4489 __ Add(x25, x25, 1); |
| 4490 |
| 4491 __ Mov(x5, x22); |
| 4492 __ Ldr(q20, MemOperand(x5, 16, PostIndex)); |
| 4493 __ Ldr(q21, MemOperand(x5, 16, PostIndex)); |
| 4494 __ Ldr(q22, MemOperand(x5, 16, PostIndex)); |
| 4495 __ Ldr(q23, MemOperand(x5)); |
| 4496 __ Ld4(v20.H(), v21.H(), v22.H(), v23.H(), 3, |
| 4497 MemOperand(x22, x25, PostIndex)); |
| 4498 __ Add(x25, x25, 1); |
| 4499 |
| 4500 __ Mov(x6, x23); |
| 4501 __ Ldr(q24, MemOperand(x6, 16, PostIndex)); |
| 4502 __ Ldr(q25, MemOperand(x6, 16, PostIndex)); |
| 4503 __ Ldr(q26, MemOperand(x6, 16, PostIndex)); |
| 4504 __ Ldr(q27, MemOperand(x6)); |
| 4505 __ Ld4(v24.S(), v25.S(), v26.S(), v27.S(), 2, |
| 4506 MemOperand(x23, x25, PostIndex)); |
| 4507 __ Add(x25, x25, 1); |
| 4508 |
| 4509 __ Mov(x7, x24); |
| 4510 __ Ldr(q28, MemOperand(x7, 16, PostIndex)); |
| 4511 __ Ldr(q29, MemOperand(x7, 16, PostIndex)); |
| 4512 __ Ldr(q30, MemOperand(x7, 16, PostIndex)); |
| 4513 __ Ldr(q31, MemOperand(x7)); |
| 4514 __ Ld4(v28.D(), v29.D(), v30.D(), v31.D(), 1, |
| 4515 MemOperand(x24, x25, PostIndex)); |
| 4516 |
| 4517 END(); |
| 4518 |
| 4519 RUN(); |
| 4520 |
| 4521 CHECK_EQUAL_128(0x0004080c1014181c, 0x2024282c3034383c, q0); |
| 4522 CHECK_EQUAL_128(0x0105090d1115191d, 0x2125292d3135393d, q1); |
| 4523 CHECK_EQUAL_128(0x02060a0e12161a1e, 0x22262a2e32363a3e, q2); |
| 4524 CHECK_EQUAL_128(0x03070b0f13171b1f, 0x23272b2f33373b3f, q3); |
| 4525 CHECK_EQUAL_128(0x0100090811101918, 0x2120292831303938, q4); |
| 4526 CHECK_EQUAL_128(0x03020b0a13121b1a, 0x23222b2a33323b3a, q5); |
| 4527 CHECK_EQUAL_128(0x05040d0c15141d1c, 0x25242d2c35343d3c, q6); |
| 4528 CHECK_EQUAL_128(0x07060f0e17161f1e, 0x27262f2e37363f3e, q7); |
| 4529 CHECK_EQUAL_128(0x0302010013121110, 0x2322212033323130, q8); |
| 4530 CHECK_EQUAL_128(0x0706050417161514, 0x2726252437363534, q9); |
| 4531 CHECK_EQUAL_128(0x0b0a09081b1a1918, 0x2b2a29283b3a3938, q10); |
| 4532 CHECK_EQUAL_128(0x0f0e0d0c1f1e1d1c, 0x2f2e2d2c3f3e3d3c, q11); |
| 4533 CHECK_EQUAL_128(0x0706050403020100, 0x2726252423222120, q12); |
| 4534 CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x2f2e2d2c2b2a2928, q13); |
| 4535 CHECK_EQUAL_128(0x1716151413121110, 0x3736353433323130, q14); |
| 4536 CHECK_EQUAL_128(0x1f1e1d1c1b1a1918, 0x3f3e3d3c3b3a3938, q15); |
| 4537 CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0706050003020100, q16); |
| 4538 CHECK_EQUAL_128(0x1f1e1d1c1b1a1918, 0x1716150113121110, q17); |
| 4539 CHECK_EQUAL_128(0x2f2e2d2c2b2a2928, 0x2726250223222120, q18); |
| 4540 CHECK_EQUAL_128(0x3f3e3d3c3b3a3938, 0x3736350333323130, q19); |
| 4541 CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0100050403020100, q20); |
| 4542 CHECK_EQUAL_128(0x1f1e1d1c1b1a1918, 0x0302151413121110, q21); |
| 4543 CHECK_EQUAL_128(0x2f2e2d2c2b2a2928, 0x0504252423222120, q22); |
| 4544 CHECK_EQUAL_128(0x3f3e3d3c3b3a3938, 0x0706353433323130, q23); |
| 4545 CHECK_EQUAL_128(0x0f0e0d0c03020100, 0x0706050403020100, q24); |
| 4546 CHECK_EQUAL_128(0x1f1e1d1c07060504, 0x1716151413121110, q25); |
| 4547 CHECK_EQUAL_128(0x2f2e2d2c0b0a0908, 0x2726252423222120, q26); |
| 4548 CHECK_EQUAL_128(0x3f3e3d3c0f0e0d0c, 0x3736353433323130, q27); |
| 4549 CHECK_EQUAL_128(0x0706050403020100, 0x0706050403020100, q28); |
| 4550 CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x1716151413121110, q29); |
| 4551 CHECK_EQUAL_128(0x1716151413121110, 0x2726252423222120, q30); |
| 4552 CHECK_EQUAL_128(0x1f1e1d1c1b1a1918, 0x3736353433323130, q31); |
| 4553 |
| 4554 CHECK_EQUAL_64(src_base + 64, x17); |
| 4555 CHECK_EQUAL_64(src_base + 64, x18); |
| 4556 CHECK_EQUAL_64(src_base + 64, x19); |
| 4557 CHECK_EQUAL_64(src_base + 64, x20); |
| 4558 CHECK_EQUAL_64(src_base + 1, x21); |
| 4559 CHECK_EQUAL_64(src_base + 2, x22); |
| 4560 CHECK_EQUAL_64(src_base + 3, x23); |
| 4561 CHECK_EQUAL_64(src_base + 4, x24); |
| 4562 |
| 4563 TEARDOWN(); |
| 4564 } |
| 4565 |
| 4566 TEST(neon_ld4_alllanes) { |
| 4567 INIT_V8(); |
| 4568 SETUP(); |
| 4569 |
| 4570 uint8_t src[64]; |
| 4571 for (unsigned i = 0; i < sizeof(src); i++) { |
| 4572 src[i] = i; |
| 4573 } |
| 4574 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); |
| 4575 |
| 4576 START(); |
| 4577 __ Mov(x17, src_base + 1); |
| 4578 __ Mov(x18, 1); |
| 4579 __ Ld4r(v0.V8B(), v1.V8B(), v2.V8B(), v3.V8B(), MemOperand(x17)); |
| 4580 __ Add(x17, x17, 4); |
| 4581 __ Ld4r(v4.V16B(), v5.V16B(), v6.V16B(), v7.V16B(), MemOperand(x17)); |
| 4582 __ Add(x17, x17, 1); |
| 4583 __ Ld4r(v8_.V4H(), v9.V4H(), v10.V4H(), v11.V4H(), MemOperand(x17)); |
| 4584 __ Add(x17, x17, 1); |
| 4585 __ Ld4r(v12.V8H(), v13.V8H(), v14.V8H(), v15.V8H(), MemOperand(x17)); |
| 4586 __ Add(x17, x17, 8); |
| 4587 __ Ld4r(v16.V2S(), v17.V2S(), v18.V2S(), v19.V2S(), MemOperand(x17)); |
| 4588 __ Add(x17, x17, 1); |
| 4589 __ Ld4r(v20.V4S(), v21.V4S(), v22.V4S(), v23.V4S(), MemOperand(x17)); |
| 4590 __ Add(x17, x17, 16); |
| 4591 __ Ld4r(v24.V2D(), v25.V2D(), v26.V2D(), v27.V2D(), MemOperand(x17)); |
| 4592 |
| 4593 END(); |
| 4594 |
| 4595 RUN(); |
| 4596 |
| 4597 CHECK_EQUAL_128(0x0000000000000000, 0x0101010101010101, q0); |
| 4598 CHECK_EQUAL_128(0x0000000000000000, 0x0202020202020202, q1); |
| 4599 CHECK_EQUAL_128(0x0000000000000000, 0x0303030303030303, q2); |
| 4600 CHECK_EQUAL_128(0x0000000000000000, 0x0404040404040404, q3); |
| 4601 CHECK_EQUAL_128(0x0505050505050505, 0x0505050505050505, q4); |
| 4602 CHECK_EQUAL_128(0x0606060606060606, 0x0606060606060606, q5); |
| 4603 CHECK_EQUAL_128(0x0707070707070707, 0x0707070707070707, q6); |
| 4604 CHECK_EQUAL_128(0x0808080808080808, 0x0808080808080808, q7); |
| 4605 CHECK_EQUAL_128(0x0000000000000000, 0x0706070607060706, q8); |
| 4606 CHECK_EQUAL_128(0x0000000000000000, 0x0908090809080908, q9); |
| 4607 CHECK_EQUAL_128(0x0000000000000000, 0x0b0a0b0a0b0a0b0a, q10); |
| 4608 CHECK_EQUAL_128(0x0000000000000000, 0x0d0c0d0c0d0c0d0c, q11); |
| 4609 CHECK_EQUAL_128(0x0807080708070807, 0x0807080708070807, q12); |
| 4610 CHECK_EQUAL_128(0x0a090a090a090a09, 0x0a090a090a090a09, q13); |
| 4611 CHECK_EQUAL_128(0x0c0b0c0b0c0b0c0b, 0x0c0b0c0b0c0b0c0b, q14); |
| 4612 CHECK_EQUAL_128(0x0e0d0e0d0e0d0e0d, 0x0e0d0e0d0e0d0e0d, q15); |
| 4613 CHECK_EQUAL_128(0x0000000000000000, 0x1211100f1211100f, q16); |
| 4614 CHECK_EQUAL_128(0x0000000000000000, 0x1615141316151413, q17); |
| 4615 CHECK_EQUAL_128(0x0000000000000000, 0x1a1918171a191817, q18); |
| 4616 CHECK_EQUAL_128(0x0000000000000000, 0x1e1d1c1b1e1d1c1b, q19); |
| 4617 CHECK_EQUAL_128(0x1312111013121110, 0x1312111013121110, q20); |
| 4618 CHECK_EQUAL_128(0x1716151417161514, 0x1716151417161514, q21); |
| 4619 CHECK_EQUAL_128(0x1b1a19181b1a1918, 0x1b1a19181b1a1918, q22); |
| 4620 CHECK_EQUAL_128(0x1f1e1d1c1f1e1d1c, 0x1f1e1d1c1f1e1d1c, q23); |
| 4621 CHECK_EQUAL_128(0x2726252423222120, 0x2726252423222120, q24); |
| 4622 CHECK_EQUAL_128(0x2f2e2d2c2b2a2928, 0x2f2e2d2c2b2a2928, q25); |
| 4623 CHECK_EQUAL_128(0x3736353433323130, 0x3736353433323130, q26); |
| 4624 CHECK_EQUAL_128(0x3f3e3d3c3b3a3938, 0x3f3e3d3c3b3a3938, q27); |
| 4625 |
| 4626 TEARDOWN(); |
| 4627 } |
| 4628 |
| 4629 TEST(neon_ld4_alllanes_postindex) { |
| 4630 INIT_V8(); |
| 4631 SETUP(); |
| 4632 |
| 4633 uint8_t src[64]; |
| 4634 for (unsigned i = 0; i < sizeof(src); i++) { |
| 4635 src[i] = i; |
| 4636 } |
| 4637 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); |
| 4638 __ Mov(x17, src_base + 1); |
| 4639 __ Mov(x18, 1); |
| 4640 |
| 4641 START(); |
| 4642 __ Mov(x17, src_base + 1); |
| 4643 __ Mov(x18, 1); |
| 4644 __ Ld4r(v0.V8B(), v1.V8B(), v2.V8B(), v3.V8B(), |
| 4645 MemOperand(x17, 4, PostIndex)); |
| 4646 __ Ld4r(v4.V16B(), v5.V16B(), v6.V16B(), v7.V16B(), |
| 4647 MemOperand(x17, x18, PostIndex)); |
| 4648 __ Ld4r(v8_.V4H(), v9.V4H(), v10.V4H(), v11.V4H(), |
| 4649 MemOperand(x17, x18, PostIndex)); |
| 4650 __ Ld4r(v12.V8H(), v13.V8H(), v14.V8H(), v15.V8H(), |
| 4651 MemOperand(x17, 8, PostIndex)); |
| 4652 __ Ld4r(v16.V2S(), v17.V2S(), v18.V2S(), v19.V2S(), |
| 4653 MemOperand(x17, x18, PostIndex)); |
| 4654 __ Ld4r(v20.V4S(), v21.V4S(), v22.V4S(), v23.V4S(), |
| 4655 MemOperand(x17, 16, PostIndex)); |
| 4656 __ Ld4r(v24.V2D(), v25.V2D(), v26.V2D(), v27.V2D(), |
| 4657 MemOperand(x17, 32, PostIndex)); |
| 4658 END(); |
| 4659 |
| 4660 RUN(); |
| 4661 |
| 4662 CHECK_EQUAL_128(0x0000000000000000, 0x0101010101010101, q0); |
| 4663 CHECK_EQUAL_128(0x0000000000000000, 0x0202020202020202, q1); |
| 4664 CHECK_EQUAL_128(0x0000000000000000, 0x0303030303030303, q2); |
| 4665 CHECK_EQUAL_128(0x0000000000000000, 0x0404040404040404, q3); |
| 4666 CHECK_EQUAL_128(0x0505050505050505, 0x0505050505050505, q4); |
| 4667 CHECK_EQUAL_128(0x0606060606060606, 0x0606060606060606, q5); |
| 4668 CHECK_EQUAL_128(0x0707070707070707, 0x0707070707070707, q6); |
| 4669 CHECK_EQUAL_128(0x0808080808080808, 0x0808080808080808, q7); |
| 4670 CHECK_EQUAL_128(0x0000000000000000, 0x0706070607060706, q8); |
| 4671 CHECK_EQUAL_128(0x0000000000000000, 0x0908090809080908, q9); |
| 4672 CHECK_EQUAL_128(0x0000000000000000, 0x0b0a0b0a0b0a0b0a, q10); |
| 4673 CHECK_EQUAL_128(0x0000000000000000, 0x0d0c0d0c0d0c0d0c, q11); |
| 4674 CHECK_EQUAL_128(0x0807080708070807, 0x0807080708070807, q12); |
| 4675 CHECK_EQUAL_128(0x0a090a090a090a09, 0x0a090a090a090a09, q13); |
| 4676 CHECK_EQUAL_128(0x0c0b0c0b0c0b0c0b, 0x0c0b0c0b0c0b0c0b, q14); |
| 4677 CHECK_EQUAL_128(0x0e0d0e0d0e0d0e0d, 0x0e0d0e0d0e0d0e0d, q15); |
| 4678 CHECK_EQUAL_128(0x0000000000000000, 0x1211100f1211100f, q16); |
| 4679 CHECK_EQUAL_128(0x0000000000000000, 0x1615141316151413, q17); |
| 4680 CHECK_EQUAL_128(0x0000000000000000, 0x1a1918171a191817, q18); |
| 4681 CHECK_EQUAL_128(0x0000000000000000, 0x1e1d1c1b1e1d1c1b, q19); |
| 4682 CHECK_EQUAL_128(0x1312111013121110, 0x1312111013121110, q20); |
| 4683 CHECK_EQUAL_128(0x1716151417161514, 0x1716151417161514, q21); |
| 4684 CHECK_EQUAL_128(0x1b1a19181b1a1918, 0x1b1a19181b1a1918, q22); |
| 4685 CHECK_EQUAL_128(0x1f1e1d1c1f1e1d1c, 0x1f1e1d1c1f1e1d1c, q23); |
| 4686 CHECK_EQUAL_128(0x2726252423222120, 0x2726252423222120, q24); |
| 4687 CHECK_EQUAL_128(0x2f2e2d2c2b2a2928, 0x2f2e2d2c2b2a2928, q25); |
| 4688 CHECK_EQUAL_128(0x3736353433323130, 0x3736353433323130, q26); |
| 4689 CHECK_EQUAL_128(0x3f3e3d3c3b3a3938, 0x3f3e3d3c3b3a3938, q27); |
| 4690 CHECK_EQUAL_64(src_base + 64, x17); |
| 4691 |
| 4692 TEARDOWN(); |
| 4693 } |
| 4694 |
| 4695 TEST(neon_st1_lane) { |
| 4696 INIT_V8(); |
| 4697 SETUP(); |
| 4698 |
| 4699 uint8_t src[64]; |
| 4700 for (unsigned i = 0; i < sizeof(src); i++) { |
| 4701 src[i] = i; |
| 4702 } |
| 4703 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); |
| 4704 |
| 4705 START(); |
| 4706 __ Mov(x17, src_base); |
| 4707 __ Mov(x18, -16); |
| 4708 __ Ldr(q0, MemOperand(x17)); |
| 4709 |
| 4710 for (int i = 15; i >= 0; i--) { |
| 4711 __ St1(v0.B(), i, MemOperand(x17)); |
| 4712 __ Add(x17, x17, 1); |
| 4713 } |
| 4714 __ Ldr(q1, MemOperand(x17, x18)); |
| 4715 |
| 4716 for (int i = 7; i >= 0; i--) { |
| 4717 __ St1(v0.H(), i, MemOperand(x17)); |
| 4718 __ Add(x17, x17, 2); |
| 4719 } |
| 4720 __ Ldr(q2, MemOperand(x17, x18)); |
| 4721 |
| 4722 for (int i = 3; i >= 0; i--) { |
| 4723 __ St1(v0.S(), i, MemOperand(x17)); |
| 4724 __ Add(x17, x17, 4); |
| 4725 } |
| 4726 __ Ldr(q3, MemOperand(x17, x18)); |
| 4727 |
| 4728 for (int i = 1; i >= 0; i--) { |
| 4729 __ St1(v0.D(), i, MemOperand(x17)); |
| 4730 __ Add(x17, x17, 8); |
| 4731 } |
| 4732 __ Ldr(q4, MemOperand(x17, x18)); |
| 4733 |
| 4734 END(); |
| 4735 |
| 4736 RUN(); |
| 4737 |
| 4738 CHECK_EQUAL_128(0x0001020304050607, 0x08090a0b0c0d0e0f, q1); |
| 4739 CHECK_EQUAL_128(0x0100030205040706, 0x09080b0a0d0c0f0e, q2); |
| 4740 CHECK_EQUAL_128(0x0302010007060504, 0x0b0a09080f0e0d0c, q3); |
| 4741 CHECK_EQUAL_128(0x0706050403020100, 0x0f0e0d0c0b0a0908, q4); |
| 4742 |
| 4743 TEARDOWN(); |
| 4744 } |
| 4745 |
| 4746 TEST(neon_st2_lane) { |
| 4747 INIT_V8(); |
| 4748 SETUP(); |
| 4749 |
| 4750 // Struct size * addressing modes * element sizes * vector size. |
| 4751 uint8_t dst[2 * 2 * 4 * 16]; |
| 4752 memset(dst, 0, sizeof(dst)); |
| 4753 uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst); |
| 4754 |
| 4755 START(); |
| 4756 __ Mov(x17, dst_base); |
| 4757 __ Mov(x18, dst_base); |
| 4758 __ Movi(v0.V2D(), 0x0001020304050607, 0x08090a0b0c0d0e0f); |
| 4759 __ Movi(v1.V2D(), 0x1011121314151617, 0x18191a1b1c1d1e1f); |
| 4760 |
| 4761 // Test B stores with and without post index. |
| 4762 for (int i = 15; i >= 0; i--) { |
| 4763 __ St2(v0.B(), v1.B(), i, MemOperand(x18)); |
| 4764 __ Add(x18, x18, 2); |
| 4765 } |
| 4766 for (int i = 15; i >= 0; i--) { |
| 4767 __ St2(v0.B(), v1.B(), i, MemOperand(x18, 2, PostIndex)); |
| 4768 } |
| 4769 __ Ldr(q2, MemOperand(x17, 0 * 16)); |
| 4770 __ Ldr(q3, MemOperand(x17, 1 * 16)); |
| 4771 __ Ldr(q4, MemOperand(x17, 2 * 16)); |
| 4772 __ Ldr(q5, MemOperand(x17, 3 * 16)); |
| 4773 |
| 4774 // Test H stores with and without post index. |
| 4775 __ Mov(x0, 4); |
| 4776 for (int i = 7; i >= 0; i--) { |
| 4777 __ St2(v0.H(), v1.H(), i, MemOperand(x18)); |
| 4778 __ Add(x18, x18, 4); |
| 4779 } |
| 4780 for (int i = 7; i >= 0; i--) { |
| 4781 __ St2(v0.H(), v1.H(), i, MemOperand(x18, x0, PostIndex)); |
| 4782 } |
| 4783 __ Ldr(q6, MemOperand(x17, 4 * 16)); |
| 4784 __ Ldr(q7, MemOperand(x17, 5 * 16)); |
| 4785 __ Ldr(q16, MemOperand(x17, 6 * 16)); |
| 4786 __ Ldr(q17, MemOperand(x17, 7 * 16)); |
| 4787 |
| 4788 // Test S stores with and without post index. |
| 4789 for (int i = 3; i >= 0; i--) { |
| 4790 __ St2(v0.S(), v1.S(), i, MemOperand(x18)); |
| 4791 __ Add(x18, x18, 8); |
| 4792 } |
| 4793 for (int i = 3; i >= 0; i--) { |
| 4794 __ St2(v0.S(), v1.S(), i, MemOperand(x18, 8, PostIndex)); |
| 4795 } |
| 4796 __ Ldr(q18, MemOperand(x17, 8 * 16)); |
| 4797 __ Ldr(q19, MemOperand(x17, 9 * 16)); |
| 4798 __ Ldr(q20, MemOperand(x17, 10 * 16)); |
| 4799 __ Ldr(q21, MemOperand(x17, 11 * 16)); |
| 4800 |
| 4801 // Test D stores with and without post index. |
| 4802 __ Mov(x0, 16); |
| 4803 __ St2(v0.D(), v1.D(), 1, MemOperand(x18)); |
| 4804 __ Add(x18, x18, 16); |
| 4805 __ St2(v0.D(), v1.D(), 0, MemOperand(x18, 16, PostIndex)); |
| 4806 __ St2(v0.D(), v1.D(), 1, MemOperand(x18, x0, PostIndex)); |
| 4807 __ St2(v0.D(), v1.D(), 0, MemOperand(x18, x0, PostIndex)); |
| 4808 __ Ldr(q22, MemOperand(x17, 12 * 16)); |
| 4809 __ Ldr(q23, MemOperand(x17, 13 * 16)); |
| 4810 __ Ldr(q24, MemOperand(x17, 14 * 16)); |
| 4811 __ Ldr(q25, MemOperand(x17, 15 * 16)); |
| 4812 END(); |
| 4813 |
| 4814 RUN(); |
| 4815 |
| 4816 CHECK_EQUAL_128(0x1707160615051404, 0x1303120211011000, q2); |
| 4817 CHECK_EQUAL_128(0x1f0f1e0e1d0d1c0c, 0x1b0b1a0a19091808, q3); |
| 4818 CHECK_EQUAL_128(0x1707160615051404, 0x1303120211011000, q4); |
| 4819 CHECK_EQUAL_128(0x1f0f1e0e1d0d1c0c, 0x1b0b1a0a19091808, q5); |
| 4820 |
| 4821 CHECK_EQUAL_128(0x1617060714150405, 0x1213020310110001, q6); |
| 4822 CHECK_EQUAL_128(0x1e1f0e0f1c1d0c0d, 0x1a1b0a0b18190809, q7); |
| 4823 CHECK_EQUAL_128(0x1617060714150405, 0x1213020310110001, q16); |
| 4824 CHECK_EQUAL_128(0x1e1f0e0f1c1d0c0d, 0x1a1b0a0b18190809, q17); |
| 4825 |
| 4826 CHECK_EQUAL_128(0x1415161704050607, 0x1011121300010203, q18); |
| 4827 CHECK_EQUAL_128(0x1c1d1e1f0c0d0e0f, 0x18191a1b08090a0b, q19); |
| 4828 CHECK_EQUAL_128(0x1415161704050607, 0x1011121300010203, q20); |
| 4829 CHECK_EQUAL_128(0x1c1d1e1f0c0d0e0f, 0x18191a1b08090a0b, q21); |
| 4830 |
| 4831 CHECK_EQUAL_128(0x1011121314151617, 0x0001020304050607, q22); |
| 4832 CHECK_EQUAL_128(0x18191a1b1c1d1e1f, 0x08090a0b0c0d0e0f, q23); |
| 4833 CHECK_EQUAL_128(0x1011121314151617, 0x0001020304050607, q22); |
| 4834 CHECK_EQUAL_128(0x18191a1b1c1d1e1f, 0x08090a0b0c0d0e0f, q23); |
| 4835 |
| 4836 TEARDOWN(); |
| 4837 } |
| 4838 |
| 4839 TEST(neon_st3_lane) { |
| 4840 INIT_V8(); |
| 4841 SETUP(); |
| 4842 |
| 4843 // Struct size * addressing modes * element sizes * vector size. |
| 4844 uint8_t dst[3 * 2 * 4 * 16]; |
| 4845 memset(dst, 0, sizeof(dst)); |
| 4846 uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst); |
| 4847 |
| 4848 START(); |
| 4849 __ Mov(x17, dst_base); |
| 4850 __ Mov(x18, dst_base); |
| 4851 __ Movi(v0.V2D(), 0x0001020304050607, 0x08090a0b0c0d0e0f); |
| 4852 __ Movi(v1.V2D(), 0x1011121314151617, 0x18191a1b1c1d1e1f); |
| 4853 __ Movi(v2.V2D(), 0x2021222324252627, 0x28292a2b2c2d2e2f); |
| 4854 |
| 4855 // Test B stores with and without post index. |
| 4856 for (int i = 15; i >= 0; i--) { |
| 4857 __ St3(v0.B(), v1.B(), v2.B(), i, MemOperand(x18)); |
| 4858 __ Add(x18, x18, 3); |
| 4859 } |
| 4860 for (int i = 15; i >= 0; i--) { |
| 4861 __ St3(v0.B(), v1.B(), v2.B(), i, MemOperand(x18, 3, PostIndex)); |
| 4862 } |
| 4863 __ Ldr(q3, MemOperand(x17, 0 * 16)); |
| 4864 __ Ldr(q4, MemOperand(x17, 1 * 16)); |
| 4865 __ Ldr(q5, MemOperand(x17, 2 * 16)); |
| 4866 __ Ldr(q6, MemOperand(x17, 3 * 16)); |
| 4867 __ Ldr(q7, MemOperand(x17, 4 * 16)); |
| 4868 __ Ldr(q16, MemOperand(x17, 5 * 16)); |
| 4869 |
| 4870 // Test H stores with and without post index. |
| 4871 __ Mov(x0, 6); |
| 4872 for (int i = 7; i >= 0; i--) { |
| 4873 __ St3(v0.H(), v1.H(), v2.H(), i, MemOperand(x18)); |
| 4874 __ Add(x18, x18, 6); |
| 4875 } |
| 4876 for (int i = 7; i >= 0; i--) { |
| 4877 __ St3(v0.H(), v1.H(), v2.H(), i, MemOperand(x18, x0, PostIndex)); |
| 4878 } |
| 4879 __ Ldr(q17, MemOperand(x17, 6 * 16)); |
| 4880 __ Ldr(q18, MemOperand(x17, 7 * 16)); |
| 4881 __ Ldr(q19, MemOperand(x17, 8 * 16)); |
| 4882 __ Ldr(q20, MemOperand(x17, 9 * 16)); |
| 4883 __ Ldr(q21, MemOperand(x17, 10 * 16)); |
| 4884 __ Ldr(q22, MemOperand(x17, 11 * 16)); |
| 4885 |
| 4886 // Test S stores with and without post index. |
| 4887 for (int i = 3; i >= 0; i--) { |
| 4888 __ St3(v0.S(), v1.S(), v2.S(), i, MemOperand(x18)); |
| 4889 __ Add(x18, x18, 12); |
| 4890 } |
| 4891 for (int i = 3; i >= 0; i--) { |
| 4892 __ St3(v0.S(), v1.S(), v2.S(), i, MemOperand(x18, 12, PostIndex)); |
| 4893 } |
| 4894 __ Ldr(q23, MemOperand(x17, 12 * 16)); |
| 4895 __ Ldr(q24, MemOperand(x17, 13 * 16)); |
| 4896 __ Ldr(q25, MemOperand(x17, 14 * 16)); |
| 4897 __ Ldr(q26, MemOperand(x17, 15 * 16)); |
| 4898 __ Ldr(q27, MemOperand(x17, 16 * 16)); |
| 4899 __ Ldr(q28, MemOperand(x17, 17 * 16)); |
| 4900 |
| 4901 // Test D stores with and without post index. |
| 4902 __ Mov(x0, 24); |
| 4903 __ St3(v0.D(), v1.D(), v2.D(), 1, MemOperand(x18)); |
| 4904 __ Add(x18, x18, 24); |
| 4905 __ St3(v0.D(), v1.D(), v2.D(), 0, MemOperand(x18, 24, PostIndex)); |
| 4906 __ St3(v0.D(), v1.D(), v2.D(), 1, MemOperand(x18, x0, PostIndex)); |
| 4907 __ Ldr(q29, MemOperand(x17, 18 * 16)); |
| 4908 __ Ldr(q30, MemOperand(x17, 19 * 16)); |
| 4909 __ Ldr(q31, MemOperand(x17, 20 * 16)); |
| 4910 END(); |
| 4911 |
| 4912 RUN(); |
| 4913 |
| 4914 CHECK_EQUAL_128(0x0524140423130322, 0x1202211101201000, q3); |
| 4915 CHECK_EQUAL_128(0x1a0a291909281808, 0x2717072616062515, q4); |
| 4916 CHECK_EQUAL_128(0x2f1f0f2e1e0e2d1d, 0x0d2c1c0c2b1b0b2a, q5); |
| 4917 CHECK_EQUAL_128(0x0524140423130322, 0x1202211101201000, q6); |
| 4918 CHECK_EQUAL_128(0x1a0a291909281808, 0x2717072616062515, q7); |
| 4919 CHECK_EQUAL_128(0x2f1f0f2e1e0e2d1d, 0x0d2c1c0c2b1b0b2a, q16); |
| 4920 |
| 4921 CHECK_EQUAL_128(0x1415040522231213, 0x0203202110110001, q17); |
| 4922 CHECK_EQUAL_128(0x0a0b282918190809, 0x2627161706072425, q18); |
| 4923 CHECK_EQUAL_128(0x2e2f1e1f0e0f2c2d, 0x1c1d0c0d2a2b1a1b, q19); |
| 4924 CHECK_EQUAL_128(0x1415040522231213, 0x0203202110110001, q20); |
| 4925 CHECK_EQUAL_128(0x0a0b282918190809, 0x2627161706072425, q21); |
| 4926 CHECK_EQUAL_128(0x2e2f1e1f0e0f2c2d, 0x1c1d0c0d2a2b1a1b, q22); |
| 4927 |
| 4928 CHECK_EQUAL_128(0x0405060720212223, 0x1011121300010203, q23); |
| 4929 CHECK_EQUAL_128(0x18191a1b08090a0b, 0x2425262714151617, q24); |
| 4930 CHECK_EQUAL_128(0x2c2d2e2f1c1d1e1f, 0x0c0d0e0f28292a2b, q25); |
| 4931 CHECK_EQUAL_128(0x0405060720212223, 0x1011121300010203, q26); |
| 4932 CHECK_EQUAL_128(0x18191a1b08090a0b, 0x2425262714151617, q27); |
| 4933 CHECK_EQUAL_128(0x2c2d2e2f1c1d1e1f, 0x0c0d0e0f28292a2b, q28); |
| 4934 |
| 4935 TEARDOWN(); |
| 4936 } |
| 4937 |
| 4938 TEST(neon_st4_lane) { |
| 4939 INIT_V8(); |
| 4940 SETUP(); |
| 4941 |
| 4942 // Struct size * element sizes * vector size. |
| 4943 uint8_t dst[4 * 4 * 16]; |
| 4944 memset(dst, 0, sizeof(dst)); |
| 4945 uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst); |
| 4946 |
| 4947 START(); |
| 4948 __ Mov(x17, dst_base); |
| 4949 __ Mov(x18, dst_base); |
| 4950 __ Movi(v0.V2D(), 0x0001020304050607, 0x08090a0b0c0d0e0f); |
| 4951 __ Movi(v1.V2D(), 0x1011121314151617, 0x18191a1b1c1d1e1f); |
| 4952 __ Movi(v2.V2D(), 0x2021222324252627, 0x28292a2b2c2d2e2f); |
| 4953 __ Movi(v3.V2D(), 0x2021222324252627, 0x28292a2b2c2d2e2f); |
| 4954 |
| 4955 // Test B stores without post index. |
| 4956 for (int i = 15; i >= 0; i--) { |
| 4957 __ St4(v0.B(), v1.B(), v2.B(), v3.B(), i, MemOperand(x18)); |
| 4958 __ Add(x18, x18, 4); |
| 4959 } |
| 4960 __ Ldr(q4, MemOperand(x17, 0 * 16)); |
| 4961 __ Ldr(q5, MemOperand(x17, 1 * 16)); |
| 4962 __ Ldr(q6, MemOperand(x17, 2 * 16)); |
| 4963 __ Ldr(q7, MemOperand(x17, 3 * 16)); |
| 4964 |
| 4965 // Test H stores with post index. |
| 4966 __ Mov(x0, 8); |
| 4967 for (int i = 7; i >= 0; i--) { |
| 4968 __ St4(v0.H(), v1.H(), v2.H(), v3.H(), i, MemOperand(x18, x0, PostIndex)); |
| 4969 } |
| 4970 __ Ldr(q16, MemOperand(x17, 4 * 16)); |
| 4971 __ Ldr(q17, MemOperand(x17, 5 * 16)); |
| 4972 __ Ldr(q18, MemOperand(x17, 6 * 16)); |
| 4973 __ Ldr(q19, MemOperand(x17, 7 * 16)); |
| 4974 |
| 4975 // Test S stores without post index. |
| 4976 for (int i = 3; i >= 0; i--) { |
| 4977 __ St4(v0.S(), v1.S(), v2.S(), v3.S(), i, MemOperand(x18)); |
| 4978 __ Add(x18, x18, 16); |
| 4979 } |
| 4980 __ Ldr(q20, MemOperand(x17, 8 * 16)); |
| 4981 __ Ldr(q21, MemOperand(x17, 9 * 16)); |
| 4982 __ Ldr(q22, MemOperand(x17, 10 * 16)); |
| 4983 __ Ldr(q23, MemOperand(x17, 11 * 16)); |
| 4984 |
| 4985 // Test D stores with post index. |
| 4986 __ Mov(x0, 32); |
| 4987 __ St4(v0.D(), v1.D(), v2.D(), v3.D(), 0, MemOperand(x18, 32, PostIndex)); |
| 4988 __ St4(v0.D(), v1.D(), v2.D(), v3.D(), 1, MemOperand(x18, x0, PostIndex)); |
| 4989 |
| 4990 __ Ldr(q24, MemOperand(x17, 12 * 16)); |
| 4991 __ Ldr(q25, MemOperand(x17, 13 * 16)); |
| 4992 __ Ldr(q26, MemOperand(x17, 14 * 16)); |
| 4993 __ Ldr(q27, MemOperand(x17, 15 * 16)); |
| 4994 END(); |
| 4995 |
| 4996 RUN(); |
| 4997 |
| 4998 CHECK_EQUAL_128(0x2323130322221202, 0x2121110120201000, q4); |
| 4999 CHECK_EQUAL_128(0x2727170726261606, 0x2525150524241404, q5); |
| 5000 CHECK_EQUAL_128(0x2b2b1b0b2a2a1a0a, 0x2929190928281808, q6); |
| 5001 CHECK_EQUAL_128(0x2f2f1f0f2e2e1e0e, 0x2d2d1d0d2c2c1c0c, q7); |
| 5002 |
| 5003 CHECK_EQUAL_128(0x2223222312130203, 0x2021202110110001, q16); |
| 5004 CHECK_EQUAL_128(0x2627262716170607, 0x2425242514150405, q17); |
| 5005 CHECK_EQUAL_128(0x2a2b2a2b1a1b0a0b, 0x2829282918190809, q18); |
| 5006 CHECK_EQUAL_128(0x2e2f2e2f1e1f0e0f, 0x2c2d2c2d1c1d0c0d, q19); |
| 5007 |
| 5008 CHECK_EQUAL_128(0x2021222320212223, 0x1011121300010203, q20); |
| 5009 CHECK_EQUAL_128(0x2425262724252627, 0x1415161704050607, q21); |
| 5010 CHECK_EQUAL_128(0x28292a2b28292a2b, 0x18191a1b08090a0b, q22); |
| 5011 CHECK_EQUAL_128(0x2c2d2e2f2c2d2e2f, 0x1c1d1e1f0c0d0e0f, q23); |
| 5012 |
| 5013 CHECK_EQUAL_128(0x18191a1b1c1d1e1f, 0x08090a0b0c0d0e0f, q24); |
| 5014 CHECK_EQUAL_128(0x28292a2b2c2d2e2f, 0x28292a2b2c2d2e2f, q25); |
| 5015 CHECK_EQUAL_128(0x1011121314151617, 0x0001020304050607, q26); |
| 5016 CHECK_EQUAL_128(0x2021222324252627, 0x2021222324252627, q27); |
| 5017 |
| 5018 TEARDOWN(); |
| 5019 } |
| 5020 |
| 5021 TEST(neon_ld1_lane_postindex) { |
| 5022 INIT_V8(); |
| 5023 SETUP(); |
| 5024 |
| 5025 uint8_t src[64]; |
| 5026 for (unsigned i = 0; i < sizeof(src); i++) { |
| 5027 src[i] = i; |
| 5028 } |
| 5029 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); |
| 5030 |
| 5031 START(); |
| 5032 __ Mov(x17, src_base); |
| 5033 __ Mov(x18, src_base); |
| 5034 __ Mov(x19, src_base); |
| 5035 __ Mov(x20, src_base); |
| 5036 __ Mov(x21, src_base); |
| 5037 __ Mov(x22, src_base); |
| 5038 __ Mov(x23, src_base); |
| 5039 __ Mov(x24, src_base); |
| 5040 |
| 5041 // Test loading whole register by element. |
| 5042 for (int i = 15; i >= 0; i--) { |
| 5043 __ Ld1(v0.B(), i, MemOperand(x17, 1, PostIndex)); |
| 5044 } |
| 5045 |
| 5046 for (int i = 7; i >= 0; i--) { |
| 5047 __ Ld1(v1.H(), i, MemOperand(x18, 2, PostIndex)); |
| 5048 } |
| 5049 |
| 5050 for (int i = 3; i >= 0; i--) { |
| 5051 __ Ld1(v2.S(), i, MemOperand(x19, 4, PostIndex)); |
| 5052 } |
| 5053 |
| 5054 for (int i = 1; i >= 0; i--) { |
| 5055 __ Ld1(v3.D(), i, MemOperand(x20, 8, PostIndex)); |
| 5056 } |
| 5057 |
| 5058 // Test loading a single element into an initialised register. |
| 5059 __ Mov(x25, 1); |
| 5060 __ Ldr(q4, MemOperand(x21)); |
| 5061 __ Ld1(v4.B(), 4, MemOperand(x21, x25, PostIndex)); |
| 5062 __ Add(x25, x25, 1); |
| 5063 |
| 5064 __ Ldr(q5, MemOperand(x22)); |
| 5065 __ Ld1(v5.H(), 3, MemOperand(x22, x25, PostIndex)); |
| 5066 __ Add(x25, x25, 1); |
| 5067 |
| 5068 __ Ldr(q6, MemOperand(x23)); |
| 5069 __ Ld1(v6.S(), 2, MemOperand(x23, x25, PostIndex)); |
| 5070 __ Add(x25, x25, 1); |
| 5071 |
| 5072 __ Ldr(q7, MemOperand(x24)); |
| 5073 __ Ld1(v7.D(), 1, MemOperand(x24, x25, PostIndex)); |
| 5074 |
| 5075 END(); |
| 5076 |
| 5077 RUN(); |
| 5078 |
| 5079 CHECK_EQUAL_128(0x0001020304050607, 0x08090a0b0c0d0e0f, q0); |
| 5080 CHECK_EQUAL_128(0x0100030205040706, 0x09080b0a0d0c0f0e, q1); |
| 5081 CHECK_EQUAL_128(0x0302010007060504, 0x0b0a09080f0e0d0c, q2); |
| 5082 CHECK_EQUAL_128(0x0706050403020100, 0x0f0e0d0c0b0a0908, q3); |
| 5083 CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0706050003020100, q4); |
| 5084 CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0100050403020100, q5); |
| 5085 CHECK_EQUAL_128(0x0f0e0d0c03020100, 0x0706050403020100, q6); |
| 5086 CHECK_EQUAL_128(0x0706050403020100, 0x0706050403020100, q7); |
| 5087 CHECK_EQUAL_64(src_base + 16, x17); |
| 5088 CHECK_EQUAL_64(src_base + 16, x18); |
| 5089 CHECK_EQUAL_64(src_base + 16, x19); |
| 5090 CHECK_EQUAL_64(src_base + 16, x20); |
| 5091 CHECK_EQUAL_64(src_base + 1, x21); |
| 5092 CHECK_EQUAL_64(src_base + 2, x22); |
| 5093 CHECK_EQUAL_64(src_base + 3, x23); |
| 5094 CHECK_EQUAL_64(src_base + 4, x24); |
| 5095 |
| 5096 TEARDOWN(); |
| 5097 } |
| 5098 |
| 5099 TEST(neon_st1_lane_postindex) { |
| 5100 INIT_V8(); |
| 5101 SETUP(); |
| 5102 |
| 5103 uint8_t src[64]; |
| 5104 for (unsigned i = 0; i < sizeof(src); i++) { |
| 5105 src[i] = i; |
| 5106 } |
| 5107 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); |
| 5108 |
| 5109 START(); |
| 5110 __ Mov(x17, src_base); |
| 5111 __ Mov(x18, -16); |
| 5112 __ Ldr(q0, MemOperand(x17)); |
| 5113 |
| 5114 for (int i = 15; i >= 0; i--) { |
| 5115 __ St1(v0.B(), i, MemOperand(x17, 1, PostIndex)); |
| 5116 } |
| 5117 __ Ldr(q1, MemOperand(x17, x18)); |
| 5118 |
| 5119 for (int i = 7; i >= 0; i--) { |
| 5120 __ St1(v0.H(), i, MemOperand(x17, 2, PostIndex)); |
| 5121 } |
| 5122 __ Ldr(q2, MemOperand(x17, x18)); |
| 5123 |
| 5124 for (int i = 3; i >= 0; i--) { |
| 5125 __ St1(v0.S(), i, MemOperand(x17, 4, PostIndex)); |
| 5126 } |
| 5127 __ Ldr(q3, MemOperand(x17, x18)); |
| 5128 |
| 5129 for (int i = 1; i >= 0; i--) { |
| 5130 __ St1(v0.D(), i, MemOperand(x17, 8, PostIndex)); |
| 5131 } |
| 5132 __ Ldr(q4, MemOperand(x17, x18)); |
| 5133 |
| 5134 END(); |
| 5135 |
| 5136 RUN(); |
| 5137 |
| 5138 CHECK_EQUAL_128(0x0001020304050607, 0x08090a0b0c0d0e0f, q1); |
| 5139 CHECK_EQUAL_128(0x0100030205040706, 0x09080b0a0d0c0f0e, q2); |
| 5140 CHECK_EQUAL_128(0x0302010007060504, 0x0b0a09080f0e0d0c, q3); |
| 5141 CHECK_EQUAL_128(0x0706050403020100, 0x0f0e0d0c0b0a0908, q4); |
| 5142 |
| 5143 TEARDOWN(); |
| 5144 } |
| 5145 |
| 5146 TEST(neon_ld1_alllanes) { |
| 5147 INIT_V8(); |
| 5148 SETUP(); |
| 5149 |
| 5150 uint8_t src[64]; |
| 5151 for (unsigned i = 0; i < sizeof(src); i++) { |
| 5152 src[i] = i; |
| 5153 } |
| 5154 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); |
| 5155 |
| 5156 START(); |
| 5157 __ Mov(x17, src_base + 1); |
| 5158 __ Ld1r(v0.V8B(), MemOperand(x17)); |
| 5159 __ Add(x17, x17, 1); |
| 5160 __ Ld1r(v1.V16B(), MemOperand(x17)); |
| 5161 __ Add(x17, x17, 1); |
| 5162 __ Ld1r(v2.V4H(), MemOperand(x17)); |
| 5163 __ Add(x17, x17, 1); |
| 5164 __ Ld1r(v3.V8H(), MemOperand(x17)); |
| 5165 __ Add(x17, x17, 1); |
| 5166 __ Ld1r(v4.V2S(), MemOperand(x17)); |
| 5167 __ Add(x17, x17, 1); |
| 5168 __ Ld1r(v5.V4S(), MemOperand(x17)); |
| 5169 __ Add(x17, x17, 1); |
| 5170 __ Ld1r(v6.V1D(), MemOperand(x17)); |
| 5171 __ Add(x17, x17, 1); |
| 5172 __ Ld1r(v7.V2D(), MemOperand(x17)); |
| 5173 END(); |
| 5174 |
| 5175 RUN(); |
| 5176 |
| 5177 CHECK_EQUAL_128(0, 0x0101010101010101, q0); |
| 5178 CHECK_EQUAL_128(0x0202020202020202, 0x0202020202020202, q1); |
| 5179 CHECK_EQUAL_128(0, 0x0403040304030403, q2); |
| 5180 CHECK_EQUAL_128(0x0504050405040504, 0x0504050405040504, q3); |
| 5181 CHECK_EQUAL_128(0, 0x0807060508070605, q4); |
| 5182 CHECK_EQUAL_128(0x0908070609080706, 0x0908070609080706, q5); |
| 5183 CHECK_EQUAL_128(0, 0x0e0d0c0b0a090807, q6); |
| 5184 CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0f0e0d0c0b0a0908, q7); |
| 5185 |
| 5186 TEARDOWN(); |
| 5187 } |
| 5188 |
| 5189 TEST(neon_ld1_alllanes_postindex) { |
| 5190 INIT_V8(); |
| 5191 SETUP(); |
| 5192 |
| 5193 uint8_t src[64]; |
| 5194 for (unsigned i = 0; i < sizeof(src); i++) { |
| 5195 src[i] = i; |
| 5196 } |
| 5197 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); |
| 5198 |
| 5199 START(); |
| 5200 __ Mov(x17, src_base + 1); |
| 5201 __ Mov(x18, 1); |
| 5202 __ Ld1r(v0.V8B(), MemOperand(x17, 1, PostIndex)); |
| 5203 __ Ld1r(v1.V16B(), MemOperand(x17, x18, PostIndex)); |
| 5204 __ Ld1r(v2.V4H(), MemOperand(x17, x18, PostIndex)); |
| 5205 __ Ld1r(v3.V8H(), MemOperand(x17, 2, PostIndex)); |
| 5206 __ Ld1r(v4.V2S(), MemOperand(x17, x18, PostIndex)); |
| 5207 __ Ld1r(v5.V4S(), MemOperand(x17, 4, PostIndex)); |
| 5208 __ Ld1r(v6.V2D(), MemOperand(x17, 8, PostIndex)); |
| 5209 END(); |
| 5210 |
| 5211 RUN(); |
| 5212 |
| 5213 CHECK_EQUAL_128(0, 0x0101010101010101, q0); |
| 5214 CHECK_EQUAL_128(0x0202020202020202, 0x0202020202020202, q1); |
| 5215 CHECK_EQUAL_128(0, 0x0403040304030403, q2); |
| 5216 CHECK_EQUAL_128(0x0504050405040504, 0x0504050405040504, q3); |
| 5217 CHECK_EQUAL_128(0, 0x0908070609080706, q4); |
| 5218 CHECK_EQUAL_128(0x0a0908070a090807, 0x0a0908070a090807, q5); |
| 5219 CHECK_EQUAL_128(0x1211100f0e0d0c0b, 0x1211100f0e0d0c0b, q6); |
| 5220 CHECK_EQUAL_64(src_base + 19, x17); |
| 5221 |
| 5222 TEARDOWN(); |
| 5223 } |
| 5224 |
| 5225 TEST(neon_st1_d) { |
| 5226 INIT_V8(); |
| 5227 SETUP(); |
| 5228 |
| 5229 uint8_t src[14 * kDRegSize]; |
| 5230 for (unsigned i = 0; i < sizeof(src); i++) { |
| 5231 src[i] = i; |
| 5232 } |
| 5233 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); |
| 5234 |
| 5235 START(); |
| 5236 __ Mov(x17, src_base); |
| 5237 __ Ldr(q0, MemOperand(x17, 16, PostIndex)); |
| 5238 __ Ldr(q1, MemOperand(x17, 16, PostIndex)); |
| 5239 __ Ldr(q2, MemOperand(x17, 16, PostIndex)); |
| 5240 __ Ldr(q3, MemOperand(x17, 16, PostIndex)); |
| 5241 __ Mov(x17, src_base); |
| 5242 |
| 5243 __ St1(v0.V8B(), MemOperand(x17)); |
| 5244 __ Ldr(d16, MemOperand(x17, 8, PostIndex)); |
| 5245 |
| 5246 __ St1(v0.V8B(), v1.V8B(), MemOperand(x17)); |
| 5247 __ Ldr(q17, MemOperand(x17, 16, PostIndex)); |
| 5248 |
| 5249 __ St1(v0.V4H(), v1.V4H(), v2.V4H(), MemOperand(x17)); |
| 5250 __ Ldr(d18, MemOperand(x17, 8, PostIndex)); |
| 5251 __ Ldr(d19, MemOperand(x17, 8, PostIndex)); |
| 5252 __ Ldr(d20, MemOperand(x17, 8, PostIndex)); |
| 5253 |
| 5254 __ St1(v0.V2S(), v1.V2S(), v2.V2S(), v3.V2S(), MemOperand(x17)); |
| 5255 __ Ldr(q21, MemOperand(x17, 16, PostIndex)); |
| 5256 __ Ldr(q22, MemOperand(x17, 16, PostIndex)); |
| 5257 |
| 5258 __ St1(v0.V1D(), v1.V1D(), v2.V1D(), v3.V1D(), MemOperand(x17)); |
| 5259 __ Ldr(q23, MemOperand(x17, 16, PostIndex)); |
| 5260 __ Ldr(q24, MemOperand(x17)); |
| 5261 END(); |
| 5262 |
| 5263 RUN(); |
| 5264 |
| 5265 CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0706050403020100, q0); |
| 5266 CHECK_EQUAL_128(0x1f1e1d1c1b1a1918, 0x1716151413121110, q1); |
| 5267 CHECK_EQUAL_128(0x2f2e2d2c2b2a2928, 0x2726252423222120, q2); |
| 5268 CHECK_EQUAL_128(0x3f3e3d3c3b3a3938, 0x3736353433323130, q3); |
| 5269 CHECK_EQUAL_128(0, 0x0706050403020100, q16); |
| 5270 CHECK_EQUAL_128(0x1716151413121110, 0x0706050403020100, q17); |
| 5271 CHECK_EQUAL_128(0, 0x0706050403020100, q18); |
| 5272 CHECK_EQUAL_128(0, 0x1716151413121110, q19); |
| 5273 CHECK_EQUAL_128(0, 0x2726252423222120, q20); |
| 5274 CHECK_EQUAL_128(0x1716151413121110, 0x0706050403020100, q21); |
| 5275 CHECK_EQUAL_128(0x3736353433323130, 0x2726252423222120, q22); |
| 5276 CHECK_EQUAL_128(0x1716151413121110, 0x0706050403020100, q23); |
| 5277 CHECK_EQUAL_128(0x3736353433323130, 0x2726252423222120, q24); |
| 5278 |
| 5279 TEARDOWN(); |
| 5280 } |
| 5281 |
| 5282 TEST(neon_st1_d_postindex) { |
| 5283 INIT_V8(); |
| 5284 SETUP(); |
| 5285 |
| 5286 uint8_t src[64 + 14 * kDRegSize]; |
| 5287 for (unsigned i = 0; i < sizeof(src); i++) { |
| 5288 src[i] = i; |
| 5289 } |
| 5290 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); |
| 5291 |
| 5292 START(); |
| 5293 __ Mov(x17, src_base); |
| 5294 __ Mov(x18, -8); |
| 5295 __ Mov(x19, -16); |
| 5296 __ Mov(x20, -24); |
| 5297 __ Mov(x21, -32); |
| 5298 __ Ldr(q0, MemOperand(x17, 16, PostIndex)); |
| 5299 __ Ldr(q1, MemOperand(x17, 16, PostIndex)); |
| 5300 __ Ldr(q2, MemOperand(x17, 16, PostIndex)); |
| 5301 __ Ldr(q3, MemOperand(x17, 16, PostIndex)); |
| 5302 __ Mov(x17, src_base); |
| 5303 |
| 5304 __ St1(v0.V8B(), MemOperand(x17, 8, PostIndex)); |
| 5305 __ Ldr(d16, MemOperand(x17, x18)); |
| 5306 |
| 5307 __ St1(v0.V8B(), v1.V8B(), MemOperand(x17, 16, PostIndex)); |
| 5308 __ Ldr(q17, MemOperand(x17, x19)); |
| 5309 |
| 5310 __ St1(v0.V4H(), v1.V4H(), v2.V4H(), MemOperand(x17, 24, PostIndex)); |
| 5311 __ Ldr(d18, MemOperand(x17, x20)); |
| 5312 __ Ldr(d19, MemOperand(x17, x19)); |
| 5313 __ Ldr(d20, MemOperand(x17, x18)); |
| 5314 |
| 5315 __ St1(v0.V2S(), v1.V2S(), v2.V2S(), v3.V2S(), |
| 5316 MemOperand(x17, 32, PostIndex)); |
| 5317 __ Ldr(q21, MemOperand(x17, x21)); |
| 5318 __ Ldr(q22, MemOperand(x17, x19)); |
| 5319 |
| 5320 __ St1(v0.V1D(), v1.V1D(), v2.V1D(), v3.V1D(), |
| 5321 MemOperand(x17, 32, PostIndex)); |
| 5322 __ Ldr(q23, MemOperand(x17, x21)); |
| 5323 __ Ldr(q24, MemOperand(x17, x19)); |
| 5324 END(); |
| 5325 |
| 5326 RUN(); |
| 5327 |
| 5328 CHECK_EQUAL_128(0, 0x0706050403020100, q16); |
| 5329 CHECK_EQUAL_128(0x1716151413121110, 0x0706050403020100, q17); |
| 5330 CHECK_EQUAL_128(0, 0x0706050403020100, q18); |
| 5331 CHECK_EQUAL_128(0, 0x1716151413121110, q19); |
| 5332 CHECK_EQUAL_128(0, 0x2726252423222120, q20); |
| 5333 CHECK_EQUAL_128(0x1716151413121110, 0x0706050403020100, q21); |
| 5334 CHECK_EQUAL_128(0x3736353433323130, 0x2726252423222120, q22); |
| 5335 CHECK_EQUAL_128(0x1716151413121110, 0x0706050403020100, q23); |
| 5336 CHECK_EQUAL_128(0x3736353433323130, 0x2726252423222120, q24); |
| 5337 |
| 5338 TEARDOWN(); |
| 5339 } |
| 5340 |
| 5341 TEST(neon_st1_q) { |
| 5342 INIT_V8(); |
| 5343 SETUP(); |
| 5344 |
| 5345 uint8_t src[64 + 160]; |
| 5346 for (unsigned i = 0; i < sizeof(src); i++) { |
| 5347 src[i] = i; |
| 5348 } |
| 5349 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); |
| 5350 |
| 5351 START(); |
| 5352 __ Mov(x17, src_base); |
| 5353 __ Ldr(q0, MemOperand(x17, 16, PostIndex)); |
| 5354 __ Ldr(q1, MemOperand(x17, 16, PostIndex)); |
| 5355 __ Ldr(q2, MemOperand(x17, 16, PostIndex)); |
| 5356 __ Ldr(q3, MemOperand(x17, 16, PostIndex)); |
| 5357 |
| 5358 __ St1(v0.V16B(), MemOperand(x17)); |
| 5359 __ Ldr(q16, MemOperand(x17, 16, PostIndex)); |
| 5360 |
| 5361 __ St1(v0.V8H(), v1.V8H(), MemOperand(x17)); |
| 5362 __ Ldr(q17, MemOperand(x17, 16, PostIndex)); |
| 5363 __ Ldr(q18, MemOperand(x17, 16, PostIndex)); |
| 5364 |
| 5365 __ St1(v0.V4S(), v1.V4S(), v2.V4S(), MemOperand(x17)); |
| 5366 __ Ldr(q19, MemOperand(x17, 16, PostIndex)); |
| 5367 __ Ldr(q20, MemOperand(x17, 16, PostIndex)); |
| 5368 __ Ldr(q21, MemOperand(x17, 16, PostIndex)); |
| 5369 |
| 5370 __ St1(v0.V2D(), v1.V2D(), v2.V2D(), v3.V2D(), MemOperand(x17)); |
| 5371 __ Ldr(q22, MemOperand(x17, 16, PostIndex)); |
| 5372 __ Ldr(q23, MemOperand(x17, 16, PostIndex)); |
| 5373 __ Ldr(q24, MemOperand(x17, 16, PostIndex)); |
| 5374 __ Ldr(q25, MemOperand(x17)); |
| 5375 END(); |
| 5376 |
| 5377 RUN(); |
| 5378 |
| 5379 CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0706050403020100, q16); |
| 5380 CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0706050403020100, q17); |
| 5381 CHECK_EQUAL_128(0x1f1e1d1c1b1a1918, 0x1716151413121110, q18); |
| 5382 CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0706050403020100, q19); |
| 5383 CHECK_EQUAL_128(0x1f1e1d1c1b1a1918, 0x1716151413121110, q20); |
| 5384 CHECK_EQUAL_128(0x2f2e2d2c2b2a2928, 0x2726252423222120, q21); |
| 5385 CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0706050403020100, q22); |
| 5386 CHECK_EQUAL_128(0x1f1e1d1c1b1a1918, 0x1716151413121110, q23); |
| 5387 CHECK_EQUAL_128(0x2f2e2d2c2b2a2928, 0x2726252423222120, q24); |
| 5388 CHECK_EQUAL_128(0x3f3e3d3c3b3a3938, 0x3736353433323130, q25); |
| 5389 |
| 5390 TEARDOWN(); |
| 5391 } |
| 5392 |
| 5393 TEST(neon_st1_q_postindex) { |
| 5394 INIT_V8(); |
| 5395 SETUP(); |
| 5396 |
| 5397 uint8_t src[64 + 160]; |
| 5398 for (unsigned i = 0; i < sizeof(src); i++) { |
| 5399 src[i] = i; |
| 5400 } |
| 5401 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); |
| 5402 |
| 5403 START(); |
| 5404 __ Mov(x17, src_base); |
| 5405 __ Mov(x18, -16); |
| 5406 __ Mov(x19, -32); |
| 5407 __ Mov(x20, -48); |
| 5408 __ Mov(x21, -64); |
| 5409 __ Ldr(q0, MemOperand(x17, 16, PostIndex)); |
| 5410 __ Ldr(q1, MemOperand(x17, 16, PostIndex)); |
| 5411 __ Ldr(q2, MemOperand(x17, 16, PostIndex)); |
| 5412 __ Ldr(q3, MemOperand(x17, 16, PostIndex)); |
| 5413 |
| 5414 __ St1(v0.V16B(), MemOperand(x17, 16, PostIndex)); |
| 5415 __ Ldr(q16, MemOperand(x17, x18)); |
| 5416 |
| 5417 __ St1(v0.V8H(), v1.V8H(), MemOperand(x17, 32, PostIndex)); |
| 5418 __ Ldr(q17, MemOperand(x17, x19)); |
| 5419 __ Ldr(q18, MemOperand(x17, x18)); |
| 5420 |
| 5421 __ St1(v0.V4S(), v1.V4S(), v2.V4S(), MemOperand(x17, 48, PostIndex)); |
| 5422 __ Ldr(q19, MemOperand(x17, x20)); |
| 5423 __ Ldr(q20, MemOperand(x17, x19)); |
| 5424 __ Ldr(q21, MemOperand(x17, x18)); |
| 5425 |
| 5426 __ St1(v0.V2D(), v1.V2D(), v2.V2D(), v3.V2D(), |
| 5427 MemOperand(x17, 64, PostIndex)); |
| 5428 __ Ldr(q22, MemOperand(x17, x21)); |
| 5429 __ Ldr(q23, MemOperand(x17, x20)); |
| 5430 __ Ldr(q24, MemOperand(x17, x19)); |
| 5431 __ Ldr(q25, MemOperand(x17, x18)); |
| 5432 |
| 5433 END(); |
| 5434 |
| 5435 RUN(); |
| 5436 |
| 5437 CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0706050403020100, q16); |
| 5438 CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0706050403020100, q17); |
| 5439 CHECK_EQUAL_128(0x1f1e1d1c1b1a1918, 0x1716151413121110, q18); |
| 5440 CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0706050403020100, q19); |
| 5441 CHECK_EQUAL_128(0x1f1e1d1c1b1a1918, 0x1716151413121110, q20); |
| 5442 CHECK_EQUAL_128(0x2f2e2d2c2b2a2928, 0x2726252423222120, q21); |
| 5443 CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0706050403020100, q22); |
| 5444 CHECK_EQUAL_128(0x1f1e1d1c1b1a1918, 0x1716151413121110, q23); |
| 5445 CHECK_EQUAL_128(0x2f2e2d2c2b2a2928, 0x2726252423222120, q24); |
| 5446 CHECK_EQUAL_128(0x3f3e3d3c3b3a3938, 0x3736353433323130, q25); |
| 5447 |
| 5448 TEARDOWN(); |
| 5449 } |
| 5450 |
| 5451 TEST(neon_st2_d) { |
| 5452 INIT_V8(); |
| 5453 SETUP(); |
| 5454 |
| 5455 uint8_t src[4 * 16]; |
| 5456 for (unsigned i = 0; i < sizeof(src); i++) { |
| 5457 src[i] = i; |
| 5458 } |
| 5459 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); |
| 5460 |
| 5461 START(); |
| 5462 __ Mov(x17, src_base); |
| 5463 __ Mov(x18, src_base); |
| 5464 __ Ldr(q0, MemOperand(x17, 16, PostIndex)); |
| 5465 __ Ldr(q1, MemOperand(x17, 16, PostIndex)); |
| 5466 |
| 5467 __ St2(v0.V8B(), v1.V8B(), MemOperand(x18)); |
| 5468 __ Add(x18, x18, 22); |
| 5469 __ St2(v0.V4H(), v1.V4H(), MemOperand(x18)); |
| 5470 __ Add(x18, x18, 11); |
| 5471 __ St2(v0.V2S(), v1.V2S(), MemOperand(x18)); |
| 5472 |
| 5473 __ Mov(x19, src_base); |
| 5474 __ Ldr(q0, MemOperand(x19, 16, PostIndex)); |
| 5475 __ Ldr(q1, MemOperand(x19, 16, PostIndex)); |
| 5476 __ Ldr(q2, MemOperand(x19, 16, PostIndex)); |
| 5477 __ Ldr(q3, MemOperand(x19, 16, PostIndex)); |
| 5478 |
| 5479 END(); |
| 5480 |
| 5481 RUN(); |
| 5482 |
| 5483 CHECK_EQUAL_128(0x1707160615051404, 0x1303120211011000, q0); |
| 5484 CHECK_EQUAL_128(0x0504131203021110, 0x0100151413121110, q1); |
| 5485 CHECK_EQUAL_128(0x1615140706050413, 0x1211100302010014, q2); |
| 5486 CHECK_EQUAL_128(0x3f3e3d3c3b3a3938, 0x3736353433323117, q3); |
| 5487 |
| 5488 TEARDOWN(); |
| 5489 } |
| 5490 |
| 5491 TEST(neon_st2_d_postindex) { |
| 5492 INIT_V8(); |
| 5493 SETUP(); |
| 5494 |
| 5495 uint8_t src[4 * 16]; |
| 5496 for (unsigned i = 0; i < sizeof(src); i++) { |
| 5497 src[i] = i; |
| 5498 } |
| 5499 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); |
| 5500 |
| 5501 START(); |
| 5502 __ Mov(x22, 5); |
| 5503 __ Mov(x17, src_base); |
| 5504 __ Mov(x18, src_base); |
| 5505 __ Ldr(q0, MemOperand(x17, 16, PostIndex)); |
| 5506 __ Ldr(q1, MemOperand(x17, 16, PostIndex)); |
| 5507 |
| 5508 __ St2(v0.V8B(), v1.V8B(), MemOperand(x18, x22, PostIndex)); |
| 5509 __ St2(v0.V4H(), v1.V4H(), MemOperand(x18, 16, PostIndex)); |
| 5510 __ St2(v0.V2S(), v1.V2S(), MemOperand(x18)); |
| 5511 |
| 5512 __ Mov(x19, src_base); |
| 5513 __ Ldr(q0, MemOperand(x19, 16, PostIndex)); |
| 5514 __ Ldr(q1, MemOperand(x19, 16, PostIndex)); |
| 5515 __ Ldr(q2, MemOperand(x19, 16, PostIndex)); |
| 5516 |
| 5517 END(); |
| 5518 |
| 5519 RUN(); |
| 5520 |
| 5521 CHECK_EQUAL_128(0x1405041312030211, 0x1001000211011000, q0); |
| 5522 CHECK_EQUAL_128(0x0605041312111003, 0x0201001716070615, q1); |
| 5523 CHECK_EQUAL_128(0x2f2e2d2c2b2a2928, 0x2726251716151407, q2); |
| 5524 |
| 5525 TEARDOWN(); |
| 5526 } |
| 5527 |
| 5528 TEST(neon_st2_q) { |
| 5529 INIT_V8(); |
| 5530 SETUP(); |
| 5531 |
| 5532 uint8_t src[5 * 16]; |
| 5533 for (unsigned i = 0; i < sizeof(src); i++) { |
| 5534 src[i] = i; |
| 5535 } |
| 5536 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); |
| 5537 |
| 5538 START(); |
| 5539 __ Mov(x17, src_base); |
| 5540 __ Mov(x18, src_base); |
| 5541 __ Ldr(q0, MemOperand(x17, 16, PostIndex)); |
| 5542 __ Ldr(q1, MemOperand(x17, 16, PostIndex)); |
| 5543 |
| 5544 __ St2(v0.V16B(), v1.V16B(), MemOperand(x18)); |
| 5545 __ Add(x18, x18, 8); |
| 5546 __ St2(v0.V8H(), v1.V8H(), MemOperand(x18)); |
| 5547 __ Add(x18, x18, 22); |
| 5548 __ St2(v0.V4S(), v1.V4S(), MemOperand(x18)); |
| 5549 __ Add(x18, x18, 2); |
| 5550 __ St2(v0.V2D(), v1.V2D(), MemOperand(x18)); |
| 5551 |
| 5552 __ Mov(x19, src_base); |
| 5553 __ Ldr(q0, MemOperand(x19, 16, PostIndex)); |
| 5554 __ Ldr(q1, MemOperand(x19, 16, PostIndex)); |
| 5555 __ Ldr(q2, MemOperand(x19, 16, PostIndex)); |
| 5556 __ Ldr(q3, MemOperand(x19, 16, PostIndex)); |
| 5557 |
| 5558 END(); |
| 5559 |
| 5560 RUN(); |
| 5561 |
| 5562 CHECK_EQUAL_128(0x1312030211100100, 0x1303120211011000, q0); |
| 5563 CHECK_EQUAL_128(0x01000b0a19180908, 0x1716070615140504, q1); |
| 5564 CHECK_EQUAL_128(0x1716151413121110, 0x0706050403020100, q2); |
| 5565 CHECK_EQUAL_128(0x1f1e1d1c1b1a1918, 0x0f0e0d0c0b0a0908, q3); |
| 5566 TEARDOWN(); |
| 5567 } |
| 5568 |
| 5569 TEST(neon_st2_q_postindex) { |
| 5570 INIT_V8(); |
| 5571 SETUP(); |
| 5572 |
| 5573 uint8_t src[5 * 16]; |
| 5574 for (unsigned i = 0; i < sizeof(src); i++) { |
| 5575 src[i] = i; |
| 5576 } |
| 5577 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); |
| 5578 |
| 5579 START(); |
| 5580 __ Mov(x22, 5); |
| 5581 __ Mov(x17, src_base); |
| 5582 __ Mov(x18, src_base); |
| 5583 __ Ldr(q0, MemOperand(x17, 16, PostIndex)); |
| 5584 __ Ldr(q1, MemOperand(x17, 16, PostIndex)); |
| 5585 |
| 5586 __ St2(v0.V16B(), v1.V16B(), MemOperand(x18, x22, PostIndex)); |
| 5587 __ St2(v0.V8H(), v1.V8H(), MemOperand(x18, 32, PostIndex)); |
| 5588 __ St2(v0.V4S(), v1.V4S(), MemOperand(x18, x22, PostIndex)); |
| 5589 __ St2(v0.V2D(), v1.V2D(), MemOperand(x18)); |
| 5590 |
| 5591 __ Mov(x19, src_base); |
| 5592 __ Ldr(q0, MemOperand(x19, 16, PostIndex)); |
| 5593 __ Ldr(q1, MemOperand(x19, 16, PostIndex)); |
| 5594 __ Ldr(q2, MemOperand(x19, 16, PostIndex)); |
| 5595 __ Ldr(q3, MemOperand(x19, 16, PostIndex)); |
| 5596 __ Ldr(q4, MemOperand(x19, 16, PostIndex)); |
| 5597 |
| 5598 END(); |
| 5599 |
| 5600 RUN(); |
| 5601 |
| 5602 CHECK_EQUAL_128(0x1405041312030211, 0x1001000211011000, q0); |
| 5603 CHECK_EQUAL_128(0x1c0d0c1b1a0b0a19, 0x1809081716070615, q1); |
| 5604 CHECK_EQUAL_128(0x0504030201001003, 0x0201001f1e0f0e1d, q2); |
| 5605 CHECK_EQUAL_128(0x0d0c0b0a09081716, 0x1514131211100706, q3); |
| 5606 CHECK_EQUAL_128(0x4f4e4d4c4b4a1f1e, 0x1d1c1b1a19180f0e, q4); |
| 5607 |
| 5608 TEARDOWN(); |
| 5609 } |
| 5610 |
| 5611 TEST(neon_st3_d) { |
| 5612 INIT_V8(); |
| 5613 SETUP(); |
| 5614 |
| 5615 uint8_t src[3 * 16]; |
| 5616 for (unsigned i = 0; i < sizeof(src); i++) { |
| 5617 src[i] = i; |
| 5618 } |
| 5619 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); |
| 5620 |
| 5621 START(); |
| 5622 __ Mov(x17, src_base); |
| 5623 __ Mov(x18, src_base); |
| 5624 __ Ldr(q0, MemOperand(x17, 16, PostIndex)); |
| 5625 __ Ldr(q1, MemOperand(x17, 16, PostIndex)); |
| 5626 __ Ldr(q2, MemOperand(x17, 16, PostIndex)); |
| 5627 |
| 5628 __ St3(v0.V8B(), v1.V8B(), v2.V8B(), MemOperand(x18)); |
| 5629 __ Add(x18, x18, 3); |
| 5630 __ St3(v0.V4H(), v1.V4H(), v2.V4H(), MemOperand(x18)); |
| 5631 __ Add(x18, x18, 2); |
| 5632 __ St3(v0.V2S(), v1.V2S(), v2.V2S(), MemOperand(x18)); |
| 5633 |
| 5634 __ Mov(x19, src_base); |
| 5635 __ Ldr(q0, MemOperand(x19, 16, PostIndex)); |
| 5636 __ Ldr(q1, MemOperand(x19, 16, PostIndex)); |
| 5637 |
| 5638 END(); |
| 5639 |
| 5640 RUN(); |
| 5641 |
| 5642 CHECK_EQUAL_128(0x2221201312111003, 0x0201000100201000, q0); |
| 5643 CHECK_EQUAL_128(0x1f1e1d2726252417, 0x1615140706050423, q1); |
| 5644 |
| 5645 TEARDOWN(); |
| 5646 } |
| 5647 |
| 5648 TEST(neon_st3_d_postindex) { |
| 5649 INIT_V8(); |
| 5650 SETUP(); |
| 5651 |
| 5652 uint8_t src[4 * 16]; |
| 5653 for (unsigned i = 0; i < sizeof(src); i++) { |
| 5654 src[i] = i; |
| 5655 } |
| 5656 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); |
| 5657 |
| 5658 START(); |
| 5659 __ Mov(x22, 5); |
| 5660 __ Mov(x17, src_base); |
| 5661 __ Mov(x18, src_base); |
| 5662 __ Ldr(q0, MemOperand(x17, 16, PostIndex)); |
| 5663 __ Ldr(q1, MemOperand(x17, 16, PostIndex)); |
| 5664 __ Ldr(q2, MemOperand(x17, 16, PostIndex)); |
| 5665 |
| 5666 __ St3(v0.V8B(), v1.V8B(), v2.V8B(), MemOperand(x18, x22, PostIndex)); |
| 5667 __ St3(v0.V4H(), v1.V4H(), v2.V4H(), MemOperand(x18, 24, PostIndex)); |
| 5668 __ St3(v0.V2S(), v1.V2S(), v2.V2S(), MemOperand(x18)); |
| 5669 |
| 5670 __ Mov(x19, src_base); |
| 5671 __ Ldr(q0, MemOperand(x19, 16, PostIndex)); |
| 5672 __ Ldr(q1, MemOperand(x19, 16, PostIndex)); |
| 5673 __ Ldr(q2, MemOperand(x19, 16, PostIndex)); |
| 5674 __ Ldr(q3, MemOperand(x19, 16, PostIndex)); |
| 5675 |
| 5676 END(); |
| 5677 |
| 5678 RUN(); |
| 5679 |
| 5680 CHECK_EQUAL_128(0x2213120302212011, 0x1001001101201000, q0); |
| 5681 CHECK_EQUAL_128(0x0201002726171607, 0x0625241514050423, q1); |
| 5682 CHECK_EQUAL_128(0x1615140706050423, 0x2221201312111003, q2); |
| 5683 CHECK_EQUAL_128(0x3f3e3d3c3b3a3938, 0x3736352726252417, q3); |
| 5684 |
| 5685 TEARDOWN(); |
| 5686 } |
| 5687 |
| 5688 TEST(neon_st3_q) { |
| 5689 INIT_V8(); |
| 5690 SETUP(); |
| 5691 |
| 5692 uint8_t src[6 * 16]; |
| 5693 for (unsigned i = 0; i < sizeof(src); i++) { |
| 5694 src[i] = i; |
| 5695 } |
| 5696 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); |
| 5697 |
| 5698 START(); |
| 5699 __ Mov(x17, src_base); |
| 5700 __ Mov(x18, src_base); |
| 5701 __ Ldr(q0, MemOperand(x17, 16, PostIndex)); |
| 5702 __ Ldr(q1, MemOperand(x17, 16, PostIndex)); |
| 5703 __ Ldr(q2, MemOperand(x17, 16, PostIndex)); |
| 5704 |
| 5705 __ St3(v0.V16B(), v1.V16B(), v2.V16B(), MemOperand(x18)); |
| 5706 __ Add(x18, x18, 5); |
| 5707 __ St3(v0.V8H(), v1.V8H(), v2.V8H(), MemOperand(x18)); |
| 5708 __ Add(x18, x18, 12); |
| 5709 __ St3(v0.V4S(), v1.V4S(), v2.V4S(), MemOperand(x18)); |
| 5710 __ Add(x18, x18, 22); |
| 5711 __ St3(v0.V2D(), v1.V2D(), v2.V2D(), MemOperand(x18)); |
| 5712 |
| 5713 __ Mov(x19, src_base); |
| 5714 __ Ldr(q0, MemOperand(x19, 16, PostIndex)); |
| 5715 __ Ldr(q1, MemOperand(x19, 16, PostIndex)); |
| 5716 __ Ldr(q2, MemOperand(x19, 16, PostIndex)); |
| 5717 __ Ldr(q3, MemOperand(x19, 16, PostIndex)); |
| 5718 __ Ldr(q4, MemOperand(x19, 16, PostIndex)); |
| 5719 __ Ldr(q5, MemOperand(x19, 16, PostIndex)); |
| 5720 |
| 5721 END(); |
| 5722 |
| 5723 RUN(); |
| 5724 |
| 5725 CHECK_EQUAL_128(0x2213120302212011, 0x1001001101201000, q0); |
| 5726 CHECK_EQUAL_128(0x0605042322212013, 0x1211100302010023, q1); |
| 5727 CHECK_EQUAL_128(0x1007060504030201, 0x0025241716151407, q2); |
| 5728 CHECK_EQUAL_128(0x0827262524232221, 0x2017161514131211, q3); |
| 5729 CHECK_EQUAL_128(0x281f1e1d1c1b1a19, 0x180f0e0d0c0b0a09, q4); |
| 5730 CHECK_EQUAL_128(0x5f5e5d5c5b5a5958, 0x572f2e2d2c2b2a29, q5); |
| 5731 |
| 5732 TEARDOWN(); |
| 5733 } |
| 5734 |
| 5735 TEST(neon_st3_q_postindex) { |
| 5736 INIT_V8(); |
| 5737 SETUP(); |
| 5738 |
| 5739 uint8_t src[7 * 16]; |
| 5740 for (unsigned i = 0; i < sizeof(src); i++) { |
| 5741 src[i] = i; |
| 5742 } |
| 5743 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); |
| 5744 |
| 5745 START(); |
| 5746 __ Mov(x22, 5); |
| 5747 __ Mov(x17, src_base); |
| 5748 __ Mov(x18, src_base); |
| 5749 __ Ldr(q0, MemOperand(x17, 16, PostIndex)); |
| 5750 __ Ldr(q1, MemOperand(x17, 16, PostIndex)); |
| 5751 __ Ldr(q2, MemOperand(x17, 16, PostIndex)); |
| 5752 |
| 5753 __ St3(v0.V16B(), v1.V16B(), v2.V16B(), MemOperand(x18, x22, PostIndex)); |
| 5754 __ St3(v0.V8H(), v1.V8H(), v2.V8H(), MemOperand(x18, 48, PostIndex)); |
| 5755 __ St3(v0.V4S(), v1.V4S(), v2.V4S(), MemOperand(x18, x22, PostIndex)); |
| 5756 __ St3(v0.V2D(), v1.V2D(), v2.V2D(), MemOperand(x18)); |
| 5757 |
| 5758 __ Mov(x19, src_base); |
| 5759 __ Ldr(q0, MemOperand(x19, 16, PostIndex)); |
| 5760 __ Ldr(q1, MemOperand(x19, 16, PostIndex)); |
| 5761 __ Ldr(q2, MemOperand(x19, 16, PostIndex)); |
| 5762 __ Ldr(q3, MemOperand(x19, 16, PostIndex)); |
| 5763 __ Ldr(q4, MemOperand(x19, 16, PostIndex)); |
| 5764 __ Ldr(q5, MemOperand(x19, 16, PostIndex)); |
| 5765 __ Ldr(q6, MemOperand(x19, 16, PostIndex)); |
| 5766 |
| 5767 END(); |
| 5768 |
| 5769 RUN(); |
| 5770 |
| 5771 CHECK_EQUAL_128(0x2213120302212011, 0x1001001101201000, q0); |
| 5772 CHECK_EQUAL_128(0x1809082726171607, 0x0625241514050423, q1); |
| 5773 CHECK_EQUAL_128(0x0e2d2c1d1c0d0c2b, 0x2a1b1a0b0a292819, q2); |
| 5774 CHECK_EQUAL_128(0x0504030201001003, 0x0201002f2e1f1e0f, q3); |
| 5775 CHECK_EQUAL_128(0x2524232221201716, 0x1514131211100706, q4); |
| 5776 CHECK_EQUAL_128(0x1d1c1b1a19180f0e, 0x0d0c0b0a09082726, q5); |
| 5777 CHECK_EQUAL_128(0x6f6e6d6c6b6a2f2e, 0x2d2c2b2a29281f1e, q6); |
| 5778 |
| 5779 TEARDOWN(); |
| 5780 } |
| 5781 |
| 5782 TEST(neon_st4_d) { |
| 5783 INIT_V8(); |
| 5784 SETUP(); |
| 5785 |
| 5786 uint8_t src[4 * 16]; |
| 5787 for (unsigned i = 0; i < sizeof(src); i++) { |
| 5788 src[i] = i; |
| 5789 } |
| 5790 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); |
| 5791 |
| 5792 START(); |
| 5793 __ Mov(x17, src_base); |
| 5794 __ Mov(x18, src_base); |
| 5795 __ Ldr(q0, MemOperand(x17, 16, PostIndex)); |
| 5796 __ Ldr(q1, MemOperand(x17, 16, PostIndex)); |
| 5797 __ Ldr(q2, MemOperand(x17, 16, PostIndex)); |
| 5798 __ Ldr(q3, MemOperand(x17, 16, PostIndex)); |
| 5799 |
| 5800 __ St4(v0.V8B(), v1.V8B(), v2.V8B(), v3.V8B(), MemOperand(x18)); |
| 5801 __ Add(x18, x18, 12); |
| 5802 __ St4(v0.V4H(), v1.V4H(), v2.V4H(), v3.V4H(), MemOperand(x18)); |
| 5803 __ Add(x18, x18, 15); |
| 5804 __ St4(v0.V2S(), v1.V2S(), v2.V2S(), v3.V2S(), MemOperand(x18)); |
| 5805 |
| 5806 __ Mov(x19, src_base); |
| 5807 __ Ldr(q0, MemOperand(x19, 16, PostIndex)); |
| 5808 __ Ldr(q1, MemOperand(x19, 16, PostIndex)); |
| 5809 __ Ldr(q2, MemOperand(x19, 16, PostIndex)); |
| 5810 __ Ldr(q3, MemOperand(x19, 16, PostIndex)); |
| 5811 |
| 5812 END(); |
| 5813 |
| 5814 RUN(); |
| 5815 |
| 5816 CHECK_EQUAL_128(0x1110010032221202, 0X3121110130201000, q0); |
| 5817 CHECK_EQUAL_128(0x1003020100322322, 0X1312030231302120, q1); |
| 5818 CHECK_EQUAL_128(0x1407060504333231, 0X3023222120131211, q2); |
| 5819 CHECK_EQUAL_128(0x3f3e3d3c3b373635, 0x3427262524171615, q3); |
| 5820 |
| 5821 TEARDOWN(); |
| 5822 } |
| 5823 |
| 5824 TEST(neon_st4_d_postindex) { |
| 5825 INIT_V8(); |
| 5826 SETUP(); |
| 5827 |
| 5828 uint8_t src[5 * 16]; |
| 5829 for (unsigned i = 0; i < sizeof(src); i++) { |
| 5830 src[i] = i; |
| 5831 } |
| 5832 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); |
| 5833 |
| 5834 START(); |
| 5835 __ Mov(x22, 5); |
| 5836 __ Mov(x17, src_base); |
| 5837 __ Mov(x18, src_base); |
| 5838 __ Ldr(q0, MemOperand(x17, 16, PostIndex)); |
| 5839 __ Ldr(q1, MemOperand(x17, 16, PostIndex)); |
| 5840 __ Ldr(q2, MemOperand(x17, 16, PostIndex)); |
| 5841 __ Ldr(q3, MemOperand(x17, 16, PostIndex)); |
| 5842 |
| 5843 __ St4(v0.V8B(), v1.V8B(), v2.V8B(), v3.V8B(), |
| 5844 MemOperand(x18, x22, PostIndex)); |
| 5845 __ St4(v0.V4H(), v1.V4H(), v2.V4H(), v3.V4H(), |
| 5846 MemOperand(x18, 32, PostIndex)); |
| 5847 __ St4(v0.V2S(), v1.V2S(), v2.V2S(), v3.V2S(), MemOperand(x18)); |
| 5848 |
| 5849 __ Mov(x19, src_base); |
| 5850 __ Ldr(q0, MemOperand(x19, 16, PostIndex)); |
| 5851 __ Ldr(q1, MemOperand(x19, 16, PostIndex)); |
| 5852 __ Ldr(q2, MemOperand(x19, 16, PostIndex)); |
| 5853 __ Ldr(q3, MemOperand(x19, 16, PostIndex)); |
| 5854 __ Ldr(q4, MemOperand(x19, 16, PostIndex)); |
| 5855 |
| 5856 END(); |
| 5857 |
| 5858 RUN(); |
| 5859 |
| 5860 CHECK_EQUAL_128(0x1203023130212011, 0x1001000130201000, q0); |
| 5861 CHECK_EQUAL_128(0x1607063534252415, 0x1405043332232213, q1); |
| 5862 CHECK_EQUAL_128(0x2221201312111003, 0x0201003736272617, q2); |
| 5863 CHECK_EQUAL_128(0x2625241716151407, 0x0605043332313023, q3); |
| 5864 CHECK_EQUAL_128(0x4f4e4d4c4b4a4948, 0x4746453736353427, q4); |
| 5865 |
| 5866 TEARDOWN(); |
| 5867 } |
| 5868 |
| 5869 TEST(neon_st4_q) { |
| 5870 INIT_V8(); |
| 5871 SETUP(); |
| 5872 |
| 5873 uint8_t src[7 * 16]; |
| 5874 for (unsigned i = 0; i < sizeof(src); i++) { |
| 5875 src[i] = i; |
| 5876 } |
| 5877 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); |
| 5878 |
| 5879 START(); |
| 5880 __ Mov(x17, src_base); |
| 5881 __ Mov(x18, src_base); |
| 5882 __ Ldr(q0, MemOperand(x17, 16, PostIndex)); |
| 5883 __ Ldr(q1, MemOperand(x17, 16, PostIndex)); |
| 5884 __ Ldr(q2, MemOperand(x17, 16, PostIndex)); |
| 5885 __ Ldr(q3, MemOperand(x17, 16, PostIndex)); |
| 5886 |
| 5887 __ St4(v0.V16B(), v1.V16B(), v2.V16B(), v3.V16B(), MemOperand(x18)); |
| 5888 __ Add(x18, x18, 5); |
| 5889 __ St4(v0.V8H(), v1.V8H(), v2.V8H(), v3.V8H(), MemOperand(x18)); |
| 5890 __ Add(x18, x18, 12); |
| 5891 __ St4(v0.V4S(), v1.V4S(), v2.V4S(), v3.V4S(), MemOperand(x18)); |
| 5892 __ Add(x18, x18, 22); |
| 5893 __ St4(v0.V2D(), v1.V2D(), v2.V2D(), v3.V2D(), MemOperand(x18)); |
| 5894 __ Add(x18, x18, 10); |
| 5895 |
| 5896 __ Mov(x19, src_base); |
| 5897 __ Ldr(q0, MemOperand(x19, 16, PostIndex)); |
| 5898 __ Ldr(q1, MemOperand(x19, 16, PostIndex)); |
| 5899 __ Ldr(q2, MemOperand(x19, 16, PostIndex)); |
| 5900 __ Ldr(q3, MemOperand(x19, 16, PostIndex)); |
| 5901 __ Ldr(q4, MemOperand(x19, 16, PostIndex)); |
| 5902 __ Ldr(q5, MemOperand(x19, 16, PostIndex)); |
| 5903 __ Ldr(q6, MemOperand(x19, 16, PostIndex)); |
| 5904 |
| 5905 END(); |
| 5906 |
| 5907 RUN(); |
| 5908 |
| 5909 CHECK_EQUAL_128(0x1203023130212011, 0x1001000130201000, q0); |
| 5910 CHECK_EQUAL_128(0x3231302322212013, 0x1211100302010013, q1); |
| 5911 CHECK_EQUAL_128(0x1007060504030201, 0x0015140706050433, q2); |
| 5912 CHECK_EQUAL_128(0x3027262524232221, 0x2017161514131211, q3); |
| 5913 CHECK_EQUAL_128(0x180f0e0d0c0b0a09, 0x0837363534333231, q4); |
| 5914 CHECK_EQUAL_128(0x382f2e2d2c2b2a29, 0x281f1e1d1c1b1a19, q5); |
| 5915 CHECK_EQUAL_128(0x6f6e6d6c6b6a6968, 0x673f3e3d3c3b3a39, q6); |
| 5916 |
| 5917 TEARDOWN(); |
| 5918 } |
| 5919 |
| 5920 TEST(neon_st4_q_postindex) { |
| 5921 INIT_V8(); |
| 5922 SETUP(); |
| 5923 |
| 5924 uint8_t src[9 * 16]; |
| 5925 for (unsigned i = 0; i < sizeof(src); i++) { |
| 5926 src[i] = i; |
| 5927 } |
| 5928 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); |
| 5929 |
| 5930 START(); |
| 5931 __ Mov(x22, 5); |
| 5932 __ Mov(x17, src_base); |
| 5933 __ Mov(x18, src_base); |
| 5934 __ Ldr(q0, MemOperand(x17, 16, PostIndex)); |
| 5935 __ Ldr(q1, MemOperand(x17, 16, PostIndex)); |
| 5936 __ Ldr(q2, MemOperand(x17, 16, PostIndex)); |
| 5937 __ Ldr(q3, MemOperand(x17, 16, PostIndex)); |
| 5938 |
| 5939 __ St4(v0.V16B(), v1.V16B(), v2.V16B(), v3.V16B(), |
| 5940 MemOperand(x18, x22, PostIndex)); |
| 5941 __ St4(v0.V8H(), v1.V8H(), v2.V8H(), v3.V8H(), |
| 5942 MemOperand(x18, 64, PostIndex)); |
| 5943 __ St4(v0.V4S(), v1.V4S(), v2.V4S(), v3.V4S(), |
| 5944 MemOperand(x18, x22, PostIndex)); |
| 5945 __ St4(v0.V2D(), v1.V2D(), v2.V2D(), v3.V2D(), MemOperand(x18)); |
| 5946 |
| 5947 __ Mov(x19, src_base); |
| 5948 __ Ldr(q0, MemOperand(x19, 16, PostIndex)); |
| 5949 __ Ldr(q1, MemOperand(x19, 16, PostIndex)); |
| 5950 __ Ldr(q2, MemOperand(x19, 16, PostIndex)); |
| 5951 __ Ldr(q3, MemOperand(x19, 16, PostIndex)); |
| 5952 __ Ldr(q4, MemOperand(x19, 16, PostIndex)); |
| 5953 __ Ldr(q5, MemOperand(x19, 16, PostIndex)); |
| 5954 __ Ldr(q6, MemOperand(x19, 16, PostIndex)); |
| 5955 __ Ldr(q7, MemOperand(x19, 16, PostIndex)); |
| 5956 __ Ldr(q8, MemOperand(x19, 16, PostIndex)); |
| 5957 |
| 5958 END(); |
| 5959 |
| 5960 RUN(); |
| 5961 |
| 5962 CHECK_EQUAL_128(0x1203023130212011, 0x1001000130201000, q0); |
| 5963 CHECK_EQUAL_128(0x1607063534252415, 0x1405043332232213, q1); |
| 5964 CHECK_EQUAL_128(0x1a0b0a3938292819, 0x1809083736272617, q2); |
| 5965 CHECK_EQUAL_128(0x1e0f0e3d3c2d2c1d, 0x1c0d0c3b3a2b2a1b, q3); |
| 5966 CHECK_EQUAL_128(0x0504030201001003, 0x0201003f3e2f2e1f, q4); |
| 5967 CHECK_EQUAL_128(0x2524232221201716, 0x1514131211100706, q5); |
| 5968 CHECK_EQUAL_128(0x0d0c0b0a09083736, 0x3534333231302726, q6); |
| 5969 CHECK_EQUAL_128(0x2d2c2b2a29281f1e, 0x1d1c1b1a19180f0e, q7); |
| 5970 CHECK_EQUAL_128(0x8f8e8d8c8b8a3f3e, 0x3d3c3b3a39382f2e, q8); |
| 5971 |
| 5972 TEARDOWN(); |
| 5973 } |
| 5974 |
| 5975 TEST(neon_destructive_minmaxp) { |
| 5976 INIT_V8(); |
| 5977 SETUP(); |
| 5978 |
| 5979 START(); |
| 5980 __ Movi(v0.V2D(), 0, 0x2222222233333333); |
| 5981 __ Movi(v1.V2D(), 0, 0x0000000011111111); |
| 5982 |
| 5983 __ Sminp(v16.V2S(), v0.V2S(), v1.V2S()); |
| 5984 __ Mov(v17, v0); |
| 5985 __ Sminp(v17.V2S(), v17.V2S(), v1.V2S()); |
| 5986 __ Mov(v18, v1); |
| 5987 __ Sminp(v18.V2S(), v0.V2S(), v18.V2S()); |
| 5988 __ Mov(v19, v0); |
| 5989 __ Sminp(v19.V2S(), v19.V2S(), v19.V2S()); |
| 5990 |
| 5991 __ Smaxp(v20.V2S(), v0.V2S(), v1.V2S()); |
| 5992 __ Mov(v21, v0); |
| 5993 __ Smaxp(v21.V2S(), v21.V2S(), v1.V2S()); |
| 5994 __ Mov(v22, v1); |
| 5995 __ Smaxp(v22.V2S(), v0.V2S(), v22.V2S()); |
| 5996 __ Mov(v23, v0); |
| 5997 __ Smaxp(v23.V2S(), v23.V2S(), v23.V2S()); |
| 5998 |
| 5999 __ Uminp(v24.V2S(), v0.V2S(), v1.V2S()); |
| 6000 __ Mov(v25, v0); |
| 6001 __ Uminp(v25.V2S(), v25.V2S(), v1.V2S()); |
| 6002 __ Mov(v26, v1); |
| 6003 __ Uminp(v26.V2S(), v0.V2S(), v26.V2S()); |
| 6004 __ Mov(v27, v0); |
| 6005 __ Uminp(v27.V2S(), v27.V2S(), v27.V2S()); |
| 6006 |
| 6007 __ Umaxp(v28.V2S(), v0.V2S(), v1.V2S()); |
| 6008 __ Mov(v29, v0); |
| 6009 __ Umaxp(v29.V2S(), v29.V2S(), v1.V2S()); |
| 6010 __ Mov(v30, v1); |
| 6011 __ Umaxp(v30.V2S(), v0.V2S(), v30.V2S()); |
| 6012 __ Mov(v31, v0); |
| 6013 __ Umaxp(v31.V2S(), v31.V2S(), v31.V2S()); |
| 6014 END(); |
| 6015 |
| 6016 RUN(); |
| 6017 |
| 6018 CHECK_EQUAL_128(0, 0x0000000022222222, q16); |
| 6019 CHECK_EQUAL_128(0, 0x0000000022222222, q17); |
| 6020 CHECK_EQUAL_128(0, 0x0000000022222222, q18); |
| 6021 CHECK_EQUAL_128(0, 0x2222222222222222, q19); |
| 6022 |
| 6023 CHECK_EQUAL_128(0, 0x1111111133333333, q20); |
| 6024 CHECK_EQUAL_128(0, 0x1111111133333333, q21); |
| 6025 CHECK_EQUAL_128(0, 0x1111111133333333, q22); |
| 6026 CHECK_EQUAL_128(0, 0x3333333333333333, q23); |
| 6027 |
| 6028 CHECK_EQUAL_128(0, 0x0000000022222222, q24); |
| 6029 CHECK_EQUAL_128(0, 0x0000000022222222, q25); |
| 6030 CHECK_EQUAL_128(0, 0x0000000022222222, q26); |
| 6031 CHECK_EQUAL_128(0, 0x2222222222222222, q27); |
| 6032 |
| 6033 CHECK_EQUAL_128(0, 0x1111111133333333, q28); |
| 6034 CHECK_EQUAL_128(0, 0x1111111133333333, q29); |
| 6035 CHECK_EQUAL_128(0, 0x1111111133333333, q30); |
| 6036 CHECK_EQUAL_128(0, 0x3333333333333333, q31); |
| 6037 |
| 6038 TEARDOWN(); |
| 6039 } |
| 6040 |
| 6041 TEST(neon_destructive_tbl) { |
| 6042 INIT_V8(); |
| 6043 SETUP(); |
| 6044 |
| 6045 START(); |
| 6046 __ Movi(v0.V2D(), 0x0041424334353627, 0x28291a1b1c0d0e0f); |
| 6047 __ Movi(v1.V2D(), 0xafaeadacabaaa9a8, 0xa7a6a5a4a3a2a1a0); |
| 6048 __ Movi(v2.V2D(), 0xbfbebdbcbbbab9b8, 0xb7b6b5b4b3b2b1b0); |
| 6049 __ Movi(v3.V2D(), 0xcfcecdcccbcac9c8, 0xc7c6c5c4c3c2c1c0); |
| 6050 __ Movi(v4.V2D(), 0xdfdedddcdbdad9d8, 0xd7d6d5d4d3d2d1d0); |
| 6051 |
| 6052 __ Movi(v16.V2D(), 0x5555555555555555, 0x5555555555555555); |
| 6053 __ Tbl(v16.V16B(), v1.V16B(), v0.V16B()); |
| 6054 __ Mov(v17, v0); |
| 6055 __ Tbl(v17.V16B(), v1.V16B(), v17.V16B()); |
| 6056 __ Mov(v18, v1); |
| 6057 __ Tbl(v18.V16B(), v18.V16B(), v0.V16B()); |
| 6058 __ Mov(v19, v0); |
| 6059 __ Tbl(v19.V16B(), v19.V16B(), v19.V16B()); |
| 6060 |
| 6061 __ Movi(v20.V2D(), 0x5555555555555555, 0x5555555555555555); |
| 6062 __ Tbl(v20.V16B(), v1.V16B(), v2.V16B(), v3.V16B(), v4.V16B(), v0.V16B()); |
| 6063 __ Mov(v21, v0); |
| 6064 __ Tbl(v21.V16B(), v1.V16B(), v2.V16B(), v3.V16B(), v4.V16B(), v21.V16B()); |
| 6065 __ Mov(v22, v1); |
| 6066 __ Mov(v23, v2); |
| 6067 __ Mov(v24, v3); |
| 6068 __ Mov(v25, v4); |
| 6069 __ Tbl(v22.V16B(), v22.V16B(), v23.V16B(), v24.V16B(), v25.V16B(), v0.V16B()); |
| 6070 __ Mov(v26, v0); |
| 6071 __ Mov(v27, v1); |
| 6072 __ Mov(v28, v2); |
| 6073 __ Mov(v29, v3); |
| 6074 __ Tbl(v26.V16B(), v26.V16B(), v27.V16B(), v28.V16B(), v29.V16B(), |
| 6075 v26.V16B()); |
| 6076 END(); |
| 6077 |
| 6078 RUN(); |
| 6079 |
| 6080 CHECK_EQUAL_128(0xa000000000000000, 0x0000000000adaeaf, q16); |
| 6081 CHECK_EQUAL_128(0xa000000000000000, 0x0000000000adaeaf, q17); |
| 6082 CHECK_EQUAL_128(0xa000000000000000, 0x0000000000adaeaf, q18); |
| 6083 CHECK_EQUAL_128(0x0f00000000000000, 0x0000000000424100, q19); |
| 6084 |
| 6085 CHECK_EQUAL_128(0xa0000000d4d5d6c7, 0xc8c9babbbcadaeaf, q20); |
| 6086 CHECK_EQUAL_128(0xa0000000d4d5d6c7, 0xc8c9babbbcadaeaf, q21); |
| 6087 CHECK_EQUAL_128(0xa0000000d4d5d6c7, 0xc8c9babbbcadaeaf, q22); |
| 6088 CHECK_EQUAL_128(0x0f000000c4c5c6b7, 0xb8b9aaabac424100, q26); |
| 6089 |
| 6090 TEARDOWN(); |
| 6091 } |
| 6092 |
| 6093 TEST(neon_destructive_tbx) { |
| 6094 INIT_V8(); |
| 6095 SETUP(); |
| 6096 |
| 6097 START(); |
| 6098 __ Movi(v0.V2D(), 0x0041424334353627, 0x28291a1b1c0d0e0f); |
| 6099 __ Movi(v1.V2D(), 0xafaeadacabaaa9a8, 0xa7a6a5a4a3a2a1a0); |
| 6100 __ Movi(v2.V2D(), 0xbfbebdbcbbbab9b8, 0xb7b6b5b4b3b2b1b0); |
| 6101 __ Movi(v3.V2D(), 0xcfcecdcccbcac9c8, 0xc7c6c5c4c3c2c1c0); |
| 6102 __ Movi(v4.V2D(), 0xdfdedddcdbdad9d8, 0xd7d6d5d4d3d2d1d0); |
| 6103 |
| 6104 __ Movi(v16.V2D(), 0x5555555555555555, 0x5555555555555555); |
| 6105 __ Tbx(v16.V16B(), v1.V16B(), v0.V16B()); |
| 6106 __ Mov(v17, v0); |
| 6107 __ Tbx(v17.V16B(), v1.V16B(), v17.V16B()); |
| 6108 __ Mov(v18, v1); |
| 6109 __ Tbx(v18.V16B(), v18.V16B(), v0.V16B()); |
| 6110 __ Mov(v19, v0); |
| 6111 __ Tbx(v19.V16B(), v19.V16B(), v19.V16B()); |
| 6112 |
| 6113 __ Movi(v20.V2D(), 0x5555555555555555, 0x5555555555555555); |
| 6114 __ Tbx(v20.V16B(), v1.V16B(), v2.V16B(), v3.V16B(), v4.V16B(), v0.V16B()); |
| 6115 __ Mov(v21, v0); |
| 6116 __ Tbx(v21.V16B(), v1.V16B(), v2.V16B(), v3.V16B(), v4.V16B(), v21.V16B()); |
| 6117 __ Mov(v22, v1); |
| 6118 __ Mov(v23, v2); |
| 6119 __ Mov(v24, v3); |
| 6120 __ Mov(v25, v4); |
| 6121 __ Tbx(v22.V16B(), v22.V16B(), v23.V16B(), v24.V16B(), v25.V16B(), v0.V16B()); |
| 6122 __ Mov(v26, v0); |
| 6123 __ Mov(v27, v1); |
| 6124 __ Mov(v28, v2); |
| 6125 __ Mov(v29, v3); |
| 6126 __ Tbx(v26.V16B(), v26.V16B(), v27.V16B(), v28.V16B(), v29.V16B(), |
| 6127 v26.V16B()); |
| 6128 END(); |
| 6129 |
| 6130 RUN(); |
| 6131 |
| 6132 CHECK_EQUAL_128(0xa055555555555555, 0x5555555555adaeaf, q16); |
| 6133 CHECK_EQUAL_128(0xa041424334353627, 0x28291a1b1cadaeaf, q17); |
| 6134 CHECK_EQUAL_128(0xa0aeadacabaaa9a8, 0xa7a6a5a4a3adaeaf, q18); |
| 6135 CHECK_EQUAL_128(0x0f41424334353627, 0x28291a1b1c424100, q19); |
| 6136 |
| 6137 CHECK_EQUAL_128(0xa0555555d4d5d6c7, 0xc8c9babbbcadaeaf, q20); |
| 6138 CHECK_EQUAL_128(0xa0414243d4d5d6c7, 0xc8c9babbbcadaeaf, q21); |
| 6139 CHECK_EQUAL_128(0xa0aeadacd4d5d6c7, 0xc8c9babbbcadaeaf, q22); |
| 6140 CHECK_EQUAL_128(0x0f414243c4c5c6b7, 0xb8b9aaabac424100, q26); |
| 6141 |
| 6142 TEARDOWN(); |
| 6143 } |
| 6144 |
| 6145 TEST(neon_destructive_fcvtl) { |
| 6146 INIT_V8(); |
| 6147 SETUP(); |
| 6148 |
| 6149 START(); |
| 6150 __ Movi(v0.V2D(), 0x400000003f800000, 0xbf800000c0000000); |
| 6151 __ Fcvtl(v16.V2D(), v0.V2S()); |
| 6152 __ Fcvtl2(v17.V2D(), v0.V4S()); |
| 6153 __ Mov(v18, v0); |
| 6154 __ Mov(v19, v0); |
| 6155 __ Fcvtl(v18.V2D(), v18.V2S()); |
| 6156 __ Fcvtl2(v19.V2D(), v19.V4S()); |
| 6157 |
| 6158 __ Movi(v1.V2D(), 0x40003c003c004000, 0xc000bc00bc00c000); |
| 6159 __ Fcvtl(v20.V4S(), v1.V4H()); |
| 6160 __ Fcvtl2(v21.V4S(), v1.V8H()); |
| 6161 __ Mov(v22, v1); |
| 6162 __ Mov(v23, v1); |
| 6163 __ Fcvtl(v22.V4S(), v22.V4H()); |
| 6164 __ Fcvtl2(v23.V4S(), v23.V8H()); |
| 6165 |
| 6166 END(); |
| 6167 |
| 6168 RUN(); |
| 6169 |
| 6170 CHECK_EQUAL_128(0xbff0000000000000, 0xc000000000000000, q16); |
| 6171 CHECK_EQUAL_128(0x4000000000000000, 0x3ff0000000000000, q17); |
| 6172 CHECK_EQUAL_128(0xbff0000000000000, 0xc000000000000000, q18); |
| 6173 CHECK_EQUAL_128(0x4000000000000000, 0x3ff0000000000000, q19); |
| 6174 |
| 6175 CHECK_EQUAL_128(0xc0000000bf800000, 0xbf800000c0000000, q20); |
| 6176 CHECK_EQUAL_128(0x400000003f800000, 0x3f80000040000000, q21); |
| 6177 CHECK_EQUAL_128(0xc0000000bf800000, 0xbf800000c0000000, q22); |
| 6178 CHECK_EQUAL_128(0x400000003f800000, 0x3f80000040000000, q23); |
| 6179 |
| 6180 TEARDOWN(); |
| 6181 } |
2802 | 6182 |
2803 | 6183 |
2804 TEST(ldp_stp_float) { | 6184 TEST(ldp_stp_float) { |
2805 INIT_V8(); | 6185 INIT_V8(); |
2806 SETUP(); | 6186 SETUP(); |
2807 | 6187 |
2808 float src[2] = {1.0, 2.0}; | 6188 float src[2] = {1.0, 2.0}; |
2809 float dst[3] = {0.0, 0.0, 0.0}; | 6189 float dst[3] = {0.0, 0.0, 0.0}; |
2810 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); | 6190 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); |
2811 uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst); | 6191 uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst); |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2853 CHECK_EQUAL_FP64(2.0, d0); | 6233 CHECK_EQUAL_FP64(2.0, d0); |
2854 CHECK_EQUAL_FP64(0.0, dst[0]); | 6234 CHECK_EQUAL_FP64(0.0, dst[0]); |
2855 CHECK_EQUAL_FP64(2.0, dst[1]); | 6235 CHECK_EQUAL_FP64(2.0, dst[1]); |
2856 CHECK_EQUAL_FP64(1.0, dst[2]); | 6236 CHECK_EQUAL_FP64(1.0, dst[2]); |
2857 CHECK_EQUAL_64(src_base + 2 * sizeof(src[0]), x16); | 6237 CHECK_EQUAL_64(src_base + 2 * sizeof(src[0]), x16); |
2858 CHECK_EQUAL_64(dst_base + sizeof(dst[1]), x17); | 6238 CHECK_EQUAL_64(dst_base + sizeof(dst[1]), x17); |
2859 | 6239 |
2860 TEARDOWN(); | 6240 TEARDOWN(); |
2861 } | 6241 } |
2862 | 6242 |
| 6243 TEST(ldp_stp_quad) { |
| 6244 SETUP(); |
| 6245 |
| 6246 uint64_t src[4] = {0x0123456789abcdef, 0xaaaaaaaa55555555, 0xfedcba9876543210, |
| 6247 0x55555555aaaaaaaa}; |
| 6248 uint64_t dst[6] = {0, 0, 0, 0, 0, 0}; |
| 6249 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); |
| 6250 uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst); |
| 6251 |
| 6252 START(); |
| 6253 __ Mov(x16, src_base); |
| 6254 __ Mov(x17, dst_base); |
| 6255 __ Ldp(q31, q0, MemOperand(x16, 4 * sizeof(src[0]), PostIndex)); |
| 6256 __ Stp(q0, q31, MemOperand(x17, 2 * sizeof(dst[1]), PreIndex)); |
| 6257 END(); |
| 6258 |
| 6259 RUN(); |
| 6260 |
| 6261 CHECK_EQUAL_128(0xaaaaaaaa55555555, 0x0123456789abcdef, q31); |
| 6262 CHECK_EQUAL_128(0x55555555aaaaaaaa, 0xfedcba9876543210, q0); |
| 6263 CHECK_EQUAL_64(0, dst[0]); |
| 6264 CHECK_EQUAL_64(0, dst[1]); |
| 6265 CHECK_EQUAL_64(0xfedcba9876543210, dst[2]); |
| 6266 CHECK_EQUAL_64(0x55555555aaaaaaaa, dst[3]); |
| 6267 CHECK_EQUAL_64(0x0123456789abcdef, dst[4]); |
| 6268 CHECK_EQUAL_64(0xaaaaaaaa55555555, dst[5]); |
| 6269 CHECK_EQUAL_64(src_base + 4 * sizeof(src[0]), x16); |
| 6270 CHECK_EQUAL_64(dst_base + 2 * sizeof(dst[1]), x17); |
| 6271 |
| 6272 TEARDOWN(); |
| 6273 } |
2863 | 6274 |
2864 TEST(ldp_stp_offset) { | 6275 TEST(ldp_stp_offset) { |
2865 INIT_V8(); | 6276 INIT_V8(); |
2866 SETUP(); | 6277 SETUP(); |
2867 | 6278 |
2868 uint64_t src[3] = {0x0011223344556677UL, 0x8899aabbccddeeffUL, | 6279 uint64_t src[3] = {0x0011223344556677UL, 0x8899aabbccddeeffUL, |
2869 0xffeeddccbbaa9988UL}; | 6280 0xffeeddccbbaa9988UL}; |
2870 uint64_t dst[7] = {0, 0, 0, 0, 0, 0, 0}; | 6281 uint64_t dst[7] = {0, 0, 0, 0, 0, 0, 0}; |
2871 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); | 6282 uintptr_t src_base = reinterpret_cast<uintptr_t>(src); |
2872 uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst); | 6283 uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst); |
(...skipping 2476 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5349 | 8760 |
5350 START(); | 8761 START(); |
5351 __ Fmov(s20, 1.0); | 8762 __ Fmov(s20, 1.0); |
5352 __ Fmov(w10, s20); | 8763 __ Fmov(w10, s20); |
5353 __ Fmov(s30, w10); | 8764 __ Fmov(s30, w10); |
5354 __ Fmov(s5, s20); | 8765 __ Fmov(s5, s20); |
5355 __ Fmov(d1, -13.0); | 8766 __ Fmov(d1, -13.0); |
5356 __ Fmov(x1, d1); | 8767 __ Fmov(x1, d1); |
5357 __ Fmov(d2, x1); | 8768 __ Fmov(d2, x1); |
5358 __ Fmov(d4, d1); | 8769 __ Fmov(d4, d1); |
5359 __ Fmov(d6, rawbits_to_double(0x0123456789abcdefL)); | 8770 __ Fmov(d6, bit_cast<double>(0x0123456789abcdefL)); |
5360 __ Fmov(s6, s6); | 8771 __ Fmov(s6, s6); |
5361 END(); | 8772 END(); |
5362 | 8773 |
5363 RUN(); | 8774 RUN(); |
5364 | 8775 |
5365 CHECK_EQUAL_32(float_to_rawbits(1.0), w10); | 8776 CHECK_EQUAL_32(bit_cast<uint32_t>(1.0f), w10); |
5366 CHECK_EQUAL_FP32(1.0, s30); | 8777 CHECK_EQUAL_FP32(1.0, s30); |
5367 CHECK_EQUAL_FP32(1.0, s5); | 8778 CHECK_EQUAL_FP32(1.0, s5); |
5368 CHECK_EQUAL_64(double_to_rawbits(-13.0), x1); | 8779 CHECK_EQUAL_64(bit_cast<uint64_t>(-13.0), x1); |
5369 CHECK_EQUAL_FP64(-13.0, d2); | 8780 CHECK_EQUAL_FP64(-13.0, d2); |
5370 CHECK_EQUAL_FP64(-13.0, d4); | 8781 CHECK_EQUAL_FP64(-13.0, d4); |
5371 CHECK_EQUAL_FP32(rawbits_to_float(0x89abcdef), s6); | 8782 CHECK_EQUAL_FP32(bit_cast<float>(0x89abcdef), s6); |
5372 | 8783 |
5373 TEARDOWN(); | 8784 TEARDOWN(); |
5374 } | 8785 } |
5375 | 8786 |
5376 | 8787 |
5377 TEST(fadd) { | 8788 TEST(fadd) { |
5378 INIT_V8(); | 8789 INIT_V8(); |
5379 SETUP(); | 8790 SETUP(); |
5380 | 8791 |
5381 START(); | 8792 START(); |
(...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5677 kFP32DefaultNaN, // inf + (-inf * 1) = NaN | 9088 kFP32DefaultNaN, // inf + (-inf * 1) = NaN |
5678 kFP32PositiveInfinity, // inf + ( inf * 1) = inf | 9089 kFP32PositiveInfinity, // inf + ( inf * 1) = inf |
5679 kFP32DefaultNaN, // -inf + ( inf * 1) = NaN | 9090 kFP32DefaultNaN, // -inf + ( inf * 1) = NaN |
5680 kFP32NegativeInfinity); // -inf + (-inf * 1) = -inf | 9091 kFP32NegativeInfinity); // -inf + (-inf * 1) = -inf |
5681 } | 9092 } |
5682 | 9093 |
5683 | 9094 |
5684 TEST(fmadd_fmsub_double_nans) { | 9095 TEST(fmadd_fmsub_double_nans) { |
5685 INIT_V8(); | 9096 INIT_V8(); |
5686 // Make sure that NaN propagation works correctly. | 9097 // Make sure that NaN propagation works correctly. |
5687 double s1 = rawbits_to_double(0x7ff5555511111111); | 9098 double s1 = bit_cast<double>(0x7ff5555511111111); |
5688 double s2 = rawbits_to_double(0x7ff5555522222222); | 9099 double s2 = bit_cast<double>(0x7ff5555522222222); |
5689 double sa = rawbits_to_double(0x7ff55555aaaaaaaa); | 9100 double sa = bit_cast<double>(0x7ff55555aaaaaaaa); |
5690 double q1 = rawbits_to_double(0x7ffaaaaa11111111); | 9101 double q1 = bit_cast<double>(0x7ffaaaaa11111111); |
5691 double q2 = rawbits_to_double(0x7ffaaaaa22222222); | 9102 double q2 = bit_cast<double>(0x7ffaaaaa22222222); |
5692 double qa = rawbits_to_double(0x7ffaaaaaaaaaaaaa); | 9103 double qa = bit_cast<double>(0x7ffaaaaaaaaaaaaa); |
5693 CHECK(IsSignallingNaN(s1)); | 9104 CHECK(IsSignallingNaN(s1)); |
5694 CHECK(IsSignallingNaN(s2)); | 9105 CHECK(IsSignallingNaN(s2)); |
5695 CHECK(IsSignallingNaN(sa)); | 9106 CHECK(IsSignallingNaN(sa)); |
5696 CHECK(IsQuietNaN(q1)); | 9107 CHECK(IsQuietNaN(q1)); |
5697 CHECK(IsQuietNaN(q2)); | 9108 CHECK(IsQuietNaN(q2)); |
5698 CHECK(IsQuietNaN(qa)); | 9109 CHECK(IsQuietNaN(qa)); |
5699 | 9110 |
5700 // The input NaNs after passing through ProcessNaN. | 9111 // The input NaNs after passing through ProcessNaN. |
5701 double s1_proc = rawbits_to_double(0x7ffd555511111111); | 9112 double s1_proc = bit_cast<double>(0x7ffd555511111111); |
5702 double s2_proc = rawbits_to_double(0x7ffd555522222222); | 9113 double s2_proc = bit_cast<double>(0x7ffd555522222222); |
5703 double sa_proc = rawbits_to_double(0x7ffd5555aaaaaaaa); | 9114 double sa_proc = bit_cast<double>(0x7ffd5555aaaaaaaa); |
5704 double q1_proc = q1; | 9115 double q1_proc = q1; |
5705 double q2_proc = q2; | 9116 double q2_proc = q2; |
5706 double qa_proc = qa; | 9117 double qa_proc = qa; |
5707 CHECK(IsQuietNaN(s1_proc)); | 9118 CHECK(IsQuietNaN(s1_proc)); |
5708 CHECK(IsQuietNaN(s2_proc)); | 9119 CHECK(IsQuietNaN(s2_proc)); |
5709 CHECK(IsQuietNaN(sa_proc)); | 9120 CHECK(IsQuietNaN(sa_proc)); |
5710 CHECK(IsQuietNaN(q1_proc)); | 9121 CHECK(IsQuietNaN(q1_proc)); |
5711 CHECK(IsQuietNaN(q2_proc)); | 9122 CHECK(IsQuietNaN(q2_proc)); |
5712 CHECK(IsQuietNaN(qa_proc)); | 9123 CHECK(IsQuietNaN(qa_proc)); |
5713 | 9124 |
5714 // Negated NaNs as it would be done on ARMv8 hardware. | 9125 // Negated NaNs as it would be done on ARMv8 hardware. |
5715 double s1_proc_neg = rawbits_to_double(0xfffd555511111111); | 9126 double s1_proc_neg = bit_cast<double>(0xfffd555511111111); |
5716 double sa_proc_neg = rawbits_to_double(0xfffd5555aaaaaaaa); | 9127 double sa_proc_neg = bit_cast<double>(0xfffd5555aaaaaaaa); |
5717 double q1_proc_neg = rawbits_to_double(0xfffaaaaa11111111); | 9128 double q1_proc_neg = bit_cast<double>(0xfffaaaaa11111111); |
5718 double qa_proc_neg = rawbits_to_double(0xfffaaaaaaaaaaaaa); | 9129 double qa_proc_neg = bit_cast<double>(0xfffaaaaaaaaaaaaa); |
5719 CHECK(IsQuietNaN(s1_proc_neg)); | 9130 CHECK(IsQuietNaN(s1_proc_neg)); |
5720 CHECK(IsQuietNaN(sa_proc_neg)); | 9131 CHECK(IsQuietNaN(sa_proc_neg)); |
5721 CHECK(IsQuietNaN(q1_proc_neg)); | 9132 CHECK(IsQuietNaN(q1_proc_neg)); |
5722 CHECK(IsQuietNaN(qa_proc_neg)); | 9133 CHECK(IsQuietNaN(qa_proc_neg)); |
5723 | 9134 |
5724 // Quiet NaNs are propagated. | 9135 // Quiet NaNs are propagated. |
5725 FmaddFmsubHelper(q1, 0, 0, q1_proc, q1_proc_neg, q1_proc_neg, q1_proc); | 9136 FmaddFmsubHelper(q1, 0, 0, q1_proc, q1_proc_neg, q1_proc_neg, q1_proc); |
5726 FmaddFmsubHelper(0, q2, 0, q2_proc, q2_proc, q2_proc, q2_proc); | 9137 FmaddFmsubHelper(0, q2, 0, q2_proc, q2_proc, q2_proc, q2_proc); |
5727 FmaddFmsubHelper(0, 0, qa, qa_proc, qa_proc, qa_proc_neg, qa_proc_neg); | 9138 FmaddFmsubHelper(0, 0, qa, qa_proc, qa_proc, qa_proc_neg, qa_proc_neg); |
5728 FmaddFmsubHelper(q1, q2, 0, q1_proc, q1_proc_neg, q1_proc_neg, q1_proc); | 9139 FmaddFmsubHelper(q1, q2, 0, q1_proc, q1_proc_neg, q1_proc_neg, q1_proc); |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5760 kFP64DefaultNaN, kFP64DefaultNaN); | 9171 kFP64DefaultNaN, kFP64DefaultNaN); |
5761 FmaddFmsubHelper(kFP64NegativeInfinity, 0, qa, | 9172 FmaddFmsubHelper(kFP64NegativeInfinity, 0, qa, |
5762 kFP64DefaultNaN, kFP64DefaultNaN, | 9173 kFP64DefaultNaN, kFP64DefaultNaN, |
5763 kFP64DefaultNaN, kFP64DefaultNaN); | 9174 kFP64DefaultNaN, kFP64DefaultNaN); |
5764 } | 9175 } |
5765 | 9176 |
5766 | 9177 |
5767 TEST(fmadd_fmsub_float_nans) { | 9178 TEST(fmadd_fmsub_float_nans) { |
5768 INIT_V8(); | 9179 INIT_V8(); |
5769 // Make sure that NaN propagation works correctly. | 9180 // Make sure that NaN propagation works correctly. |
5770 float s1 = rawbits_to_float(0x7f951111); | 9181 float s1 = bit_cast<float>(0x7f951111); |
5771 float s2 = rawbits_to_float(0x7f952222); | 9182 float s2 = bit_cast<float>(0x7f952222); |
5772 float sa = rawbits_to_float(0x7f95aaaa); | 9183 float sa = bit_cast<float>(0x7f95aaaa); |
5773 float q1 = rawbits_to_float(0x7fea1111); | 9184 float q1 = bit_cast<float>(0x7fea1111); |
5774 float q2 = rawbits_to_float(0x7fea2222); | 9185 float q2 = bit_cast<float>(0x7fea2222); |
5775 float qa = rawbits_to_float(0x7feaaaaa); | 9186 float qa = bit_cast<float>(0x7feaaaaa); |
5776 CHECK(IsSignallingNaN(s1)); | 9187 CHECK(IsSignallingNaN(s1)); |
5777 CHECK(IsSignallingNaN(s2)); | 9188 CHECK(IsSignallingNaN(s2)); |
5778 CHECK(IsSignallingNaN(sa)); | 9189 CHECK(IsSignallingNaN(sa)); |
5779 CHECK(IsQuietNaN(q1)); | 9190 CHECK(IsQuietNaN(q1)); |
5780 CHECK(IsQuietNaN(q2)); | 9191 CHECK(IsQuietNaN(q2)); |
5781 CHECK(IsQuietNaN(qa)); | 9192 CHECK(IsQuietNaN(qa)); |
5782 | 9193 |
5783 // The input NaNs after passing through ProcessNaN. | 9194 // The input NaNs after passing through ProcessNaN. |
5784 float s1_proc = rawbits_to_float(0x7fd51111); | 9195 float s1_proc = bit_cast<float>(0x7fd51111); |
5785 float s2_proc = rawbits_to_float(0x7fd52222); | 9196 float s2_proc = bit_cast<float>(0x7fd52222); |
5786 float sa_proc = rawbits_to_float(0x7fd5aaaa); | 9197 float sa_proc = bit_cast<float>(0x7fd5aaaa); |
5787 float q1_proc = q1; | 9198 float q1_proc = q1; |
5788 float q2_proc = q2; | 9199 float q2_proc = q2; |
5789 float qa_proc = qa; | 9200 float qa_proc = qa; |
5790 CHECK(IsQuietNaN(s1_proc)); | 9201 CHECK(IsQuietNaN(s1_proc)); |
5791 CHECK(IsQuietNaN(s2_proc)); | 9202 CHECK(IsQuietNaN(s2_proc)); |
5792 CHECK(IsQuietNaN(sa_proc)); | 9203 CHECK(IsQuietNaN(sa_proc)); |
5793 CHECK(IsQuietNaN(q1_proc)); | 9204 CHECK(IsQuietNaN(q1_proc)); |
5794 CHECK(IsQuietNaN(q2_proc)); | 9205 CHECK(IsQuietNaN(q2_proc)); |
5795 CHECK(IsQuietNaN(qa_proc)); | 9206 CHECK(IsQuietNaN(qa_proc)); |
5796 | 9207 |
5797 // Negated NaNs as it would be done on ARMv8 hardware. | 9208 // Negated NaNs as it would be done on ARMv8 hardware. |
5798 float s1_proc_neg = rawbits_to_float(0xffd51111); | 9209 float s1_proc_neg = bit_cast<float>(0xffd51111); |
5799 float sa_proc_neg = rawbits_to_float(0xffd5aaaa); | 9210 float sa_proc_neg = bit_cast<float>(0xffd5aaaa); |
5800 float q1_proc_neg = rawbits_to_float(0xffea1111); | 9211 float q1_proc_neg = bit_cast<float>(0xffea1111); |
5801 float qa_proc_neg = rawbits_to_float(0xffeaaaaa); | 9212 float qa_proc_neg = bit_cast<float>(0xffeaaaaa); |
5802 CHECK(IsQuietNaN(s1_proc_neg)); | 9213 CHECK(IsQuietNaN(s1_proc_neg)); |
5803 CHECK(IsQuietNaN(sa_proc_neg)); | 9214 CHECK(IsQuietNaN(sa_proc_neg)); |
5804 CHECK(IsQuietNaN(q1_proc_neg)); | 9215 CHECK(IsQuietNaN(q1_proc_neg)); |
5805 CHECK(IsQuietNaN(qa_proc_neg)); | 9216 CHECK(IsQuietNaN(qa_proc_neg)); |
5806 | 9217 |
5807 // Quiet NaNs are propagated. | 9218 // Quiet NaNs are propagated. |
5808 FmaddFmsubHelper(q1, 0, 0, q1_proc, q1_proc_neg, q1_proc_neg, q1_proc); | 9219 FmaddFmsubHelper(q1, 0, 0, q1_proc, q1_proc_neg, q1_proc_neg, q1_proc); |
5809 FmaddFmsubHelper(0, q2, 0, q2_proc, q2_proc, q2_proc, q2_proc); | 9220 FmaddFmsubHelper(0, q2, 0, q2_proc, q2_proc, q2_proc, q2_proc); |
5810 FmaddFmsubHelper(0, 0, qa, qa_proc, qa_proc, qa_proc_neg, qa_proc_neg); | 9221 FmaddFmsubHelper(0, 0, qa, qa_proc, qa_proc, qa_proc_neg, qa_proc_neg); |
5811 FmaddFmsubHelper(q1, q2, 0, q1_proc, q1_proc_neg, q1_proc_neg, q1_proc); | 9222 FmaddFmsubHelper(q1, q2, 0, q1_proc, q1_proc_neg, q1_proc_neg, q1_proc); |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5902 CHECK_EQUAL_FP64(kFP64DefaultNaN, d13); | 9313 CHECK_EQUAL_FP64(kFP64DefaultNaN, d13); |
5903 | 9314 |
5904 TEARDOWN(); | 9315 TEARDOWN(); |
5905 } | 9316 } |
5906 | 9317 |
5907 | 9318 |
5908 static float MinMaxHelper(float n, | 9319 static float MinMaxHelper(float n, |
5909 float m, | 9320 float m, |
5910 bool min, | 9321 bool min, |
5911 float quiet_nan_substitute = 0.0) { | 9322 float quiet_nan_substitute = 0.0) { |
5912 uint32_t raw_n = float_to_rawbits(n); | 9323 uint32_t raw_n = bit_cast<uint32_t>(n); |
5913 uint32_t raw_m = float_to_rawbits(m); | 9324 uint32_t raw_m = bit_cast<uint32_t>(m); |
5914 | 9325 |
5915 if (std::isnan(n) && ((raw_n & kSQuietNanMask) == 0)) { | 9326 if (std::isnan(n) && ((raw_n & kSQuietNanMask) == 0)) { |
5916 // n is signalling NaN. | 9327 // n is signalling NaN. |
5917 return rawbits_to_float(raw_n | kSQuietNanMask); | 9328 return bit_cast<float>(raw_n | static_cast<uint32_t>(kSQuietNanMask)); |
5918 } else if (std::isnan(m) && ((raw_m & kSQuietNanMask) == 0)) { | 9329 } else if (std::isnan(m) && ((raw_m & kSQuietNanMask) == 0)) { |
5919 // m is signalling NaN. | 9330 // m is signalling NaN. |
5920 return rawbits_to_float(raw_m | kSQuietNanMask); | 9331 return bit_cast<float>(raw_m | static_cast<uint32_t>(kSQuietNanMask)); |
5921 } else if (quiet_nan_substitute == 0.0) { | 9332 } else if (quiet_nan_substitute == 0.0) { |
5922 if (std::isnan(n)) { | 9333 if (std::isnan(n)) { |
5923 // n is quiet NaN. | 9334 // n is quiet NaN. |
5924 return n; | 9335 return n; |
5925 } else if (std::isnan(m)) { | 9336 } else if (std::isnan(m)) { |
5926 // m is quiet NaN. | 9337 // m is quiet NaN. |
5927 return m; | 9338 return m; |
5928 } | 9339 } |
5929 } else { | 9340 } else { |
5930 // Substitute n or m if one is quiet, but not both. | 9341 // Substitute n or m if one is quiet, but not both. |
(...skipping 12 matching lines...) Expand all Loading... |
5943 } | 9354 } |
5944 | 9355 |
5945 return min ? fminf(n, m) : fmaxf(n, m); | 9356 return min ? fminf(n, m) : fmaxf(n, m); |
5946 } | 9357 } |
5947 | 9358 |
5948 | 9359 |
5949 static double MinMaxHelper(double n, | 9360 static double MinMaxHelper(double n, |
5950 double m, | 9361 double m, |
5951 bool min, | 9362 bool min, |
5952 double quiet_nan_substitute = 0.0) { | 9363 double quiet_nan_substitute = 0.0) { |
5953 uint64_t raw_n = double_to_rawbits(n); | 9364 uint64_t raw_n = bit_cast<uint64_t>(n); |
5954 uint64_t raw_m = double_to_rawbits(m); | 9365 uint64_t raw_m = bit_cast<uint64_t>(m); |
5955 | 9366 |
5956 if (std::isnan(n) && ((raw_n & kDQuietNanMask) == 0)) { | 9367 if (std::isnan(n) && ((raw_n & kDQuietNanMask) == 0)) { |
5957 // n is signalling NaN. | 9368 // n is signalling NaN. |
5958 return rawbits_to_double(raw_n | kDQuietNanMask); | 9369 return bit_cast<double>(raw_n | kDQuietNanMask); |
5959 } else if (std::isnan(m) && ((raw_m & kDQuietNanMask) == 0)) { | 9370 } else if (std::isnan(m) && ((raw_m & kDQuietNanMask) == 0)) { |
5960 // m is signalling NaN. | 9371 // m is signalling NaN. |
5961 return rawbits_to_double(raw_m | kDQuietNanMask); | 9372 return bit_cast<double>(raw_m | kDQuietNanMask); |
5962 } else if (quiet_nan_substitute == 0.0) { | 9373 } else if (quiet_nan_substitute == 0.0) { |
5963 if (std::isnan(n)) { | 9374 if (std::isnan(n)) { |
5964 // n is quiet NaN. | 9375 // n is quiet NaN. |
5965 return n; | 9376 return n; |
5966 } else if (std::isnan(m)) { | 9377 } else if (std::isnan(m)) { |
5967 // m is quiet NaN. | 9378 // m is quiet NaN. |
5968 return m; | 9379 return m; |
5969 } | 9380 } |
5970 } else { | 9381 } else { |
5971 // Substitute n or m if one is quiet, but not both. | 9382 // Substitute n or m if one is quiet, but not both. |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6007 CHECK_EQUAL_FP64(minnm, d30); | 9418 CHECK_EQUAL_FP64(minnm, d30); |
6008 CHECK_EQUAL_FP64(maxnm, d31); | 9419 CHECK_EQUAL_FP64(maxnm, d31); |
6009 | 9420 |
6010 TEARDOWN(); | 9421 TEARDOWN(); |
6011 } | 9422 } |
6012 | 9423 |
6013 | 9424 |
6014 TEST(fmax_fmin_d) { | 9425 TEST(fmax_fmin_d) { |
6015 INIT_V8(); | 9426 INIT_V8(); |
6016 // Use non-standard NaNs to check that the payload bits are preserved. | 9427 // Use non-standard NaNs to check that the payload bits are preserved. |
6017 double snan = rawbits_to_double(0x7ff5555512345678); | 9428 double snan = bit_cast<double>(0x7ff5555512345678); |
6018 double qnan = rawbits_to_double(0x7ffaaaaa87654321); | 9429 double qnan = bit_cast<double>(0x7ffaaaaa87654321); |
6019 | 9430 |
6020 double snan_processed = rawbits_to_double(0x7ffd555512345678); | 9431 double snan_processed = bit_cast<double>(0x7ffd555512345678); |
6021 double qnan_processed = qnan; | 9432 double qnan_processed = qnan; |
6022 | 9433 |
6023 CHECK(IsSignallingNaN(snan)); | 9434 CHECK(IsSignallingNaN(snan)); |
6024 CHECK(IsQuietNaN(qnan)); | 9435 CHECK(IsQuietNaN(qnan)); |
6025 CHECK(IsQuietNaN(snan_processed)); | 9436 CHECK(IsQuietNaN(snan_processed)); |
6026 CHECK(IsQuietNaN(qnan_processed)); | 9437 CHECK(IsQuietNaN(qnan_processed)); |
6027 | 9438 |
6028 // Bootstrap tests. | 9439 // Bootstrap tests. |
6029 FminFmaxDoubleHelper(0, 0, 0, 0, 0, 0); | 9440 FminFmaxDoubleHelper(0, 0, 0, 0, 0, 0); |
6030 FminFmaxDoubleHelper(0, 1, 0, 1, 0, 1); | 9441 FminFmaxDoubleHelper(0, 1, 0, 1, 0, 1); |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6092 CHECK_EQUAL_FP32(minnm, s30); | 9503 CHECK_EQUAL_FP32(minnm, s30); |
6093 CHECK_EQUAL_FP32(maxnm, s31); | 9504 CHECK_EQUAL_FP32(maxnm, s31); |
6094 | 9505 |
6095 TEARDOWN(); | 9506 TEARDOWN(); |
6096 } | 9507 } |
6097 | 9508 |
6098 | 9509 |
6099 TEST(fmax_fmin_s) { | 9510 TEST(fmax_fmin_s) { |
6100 INIT_V8(); | 9511 INIT_V8(); |
6101 // Use non-standard NaNs to check that the payload bits are preserved. | 9512 // Use non-standard NaNs to check that the payload bits are preserved. |
6102 float snan = rawbits_to_float(0x7f951234); | 9513 float snan = bit_cast<float>(0x7f951234); |
6103 float qnan = rawbits_to_float(0x7fea8765); | 9514 float qnan = bit_cast<float>(0x7fea8765); |
6104 | 9515 |
6105 float snan_processed = rawbits_to_float(0x7fd51234); | 9516 float snan_processed = bit_cast<float>(0x7fd51234); |
6106 float qnan_processed = qnan; | 9517 float qnan_processed = qnan; |
6107 | 9518 |
6108 CHECK(IsSignallingNaN(snan)); | 9519 CHECK(IsSignallingNaN(snan)); |
6109 CHECK(IsQuietNaN(qnan)); | 9520 CHECK(IsQuietNaN(qnan)); |
6110 CHECK(IsQuietNaN(snan_processed)); | 9521 CHECK(IsQuietNaN(snan_processed)); |
6111 CHECK(IsQuietNaN(qnan_processed)); | 9522 CHECK(IsQuietNaN(qnan_processed)); |
6112 | 9523 |
6113 // Bootstrap tests. | 9524 // Bootstrap tests. |
6114 FminFmaxFloatHelper(0, 0, 0, 0, 0, 0); | 9525 FminFmaxFloatHelper(0, 0, 0, 0, 0, 0); |
6115 FminFmaxFloatHelper(0, 1, 0, 1, 0, 1); | 9526 FminFmaxFloatHelper(0, 1, 0, 1, 0, 1); |
(...skipping 814 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6930 __ Fmov(s19, 1.9); | 10341 __ Fmov(s19, 1.9); |
6931 __ Fmov(s20, 2.5); | 10342 __ Fmov(s20, 2.5); |
6932 __ Fmov(s21, -1.5); | 10343 __ Fmov(s21, -1.5); |
6933 __ Fmov(s22, -2.5); | 10344 __ Fmov(s22, -2.5); |
6934 __ Fmov(s23, kFP32PositiveInfinity); | 10345 __ Fmov(s23, kFP32PositiveInfinity); |
6935 __ Fmov(s24, kFP32NegativeInfinity); | 10346 __ Fmov(s24, kFP32NegativeInfinity); |
6936 __ Fmov(s25, 0.0); | 10347 __ Fmov(s25, 0.0); |
6937 __ Fmov(s26, -0.0); | 10348 __ Fmov(s26, -0.0); |
6938 __ Fmov(s27, FLT_MAX); | 10349 __ Fmov(s27, FLT_MAX); |
6939 __ Fmov(s28, FLT_MIN); | 10350 __ Fmov(s28, FLT_MIN); |
6940 __ Fmov(s29, rawbits_to_float(0x7fc12345)); // Quiet NaN. | 10351 __ Fmov(s29, bit_cast<float>(0x7fc12345)); // Quiet NaN. |
6941 __ Fmov(s30, rawbits_to_float(0x7f812345)); // Signalling NaN. | 10352 __ Fmov(s30, bit_cast<float>(0x7f812345)); // Signalling NaN. |
6942 | 10353 |
6943 __ Fcvt(d0, s16); | 10354 __ Fcvt(d0, s16); |
6944 __ Fcvt(d1, s17); | 10355 __ Fcvt(d1, s17); |
6945 __ Fcvt(d2, s18); | 10356 __ Fcvt(d2, s18); |
6946 __ Fcvt(d3, s19); | 10357 __ Fcvt(d3, s19); |
6947 __ Fcvt(d4, s20); | 10358 __ Fcvt(d4, s20); |
6948 __ Fcvt(d5, s21); | 10359 __ Fcvt(d5, s21); |
6949 __ Fcvt(d6, s22); | 10360 __ Fcvt(d6, s22); |
6950 __ Fcvt(d7, s23); | 10361 __ Fcvt(d7, s23); |
6951 __ Fcvt(d8, s24); | 10362 __ Fcvt(d8, s24); |
(...skipping 20 matching lines...) Expand all Loading... |
6972 CHECK_EQUAL_FP64(-0.0f, d10); | 10383 CHECK_EQUAL_FP64(-0.0f, d10); |
6973 CHECK_EQUAL_FP64(FLT_MAX, d11); | 10384 CHECK_EQUAL_FP64(FLT_MAX, d11); |
6974 CHECK_EQUAL_FP64(FLT_MIN, d12); | 10385 CHECK_EQUAL_FP64(FLT_MIN, d12); |
6975 | 10386 |
6976 // Check that the NaN payload is preserved according to ARM64 conversion | 10387 // Check that the NaN payload is preserved according to ARM64 conversion |
6977 // rules: | 10388 // rules: |
6978 // - The sign bit is preserved. | 10389 // - The sign bit is preserved. |
6979 // - The top bit of the mantissa is forced to 1 (making it a quiet NaN). | 10390 // - The top bit of the mantissa is forced to 1 (making it a quiet NaN). |
6980 // - The remaining mantissa bits are copied until they run out. | 10391 // - The remaining mantissa bits are copied until they run out. |
6981 // - The low-order bits that haven't already been assigned are set to 0. | 10392 // - The low-order bits that haven't already been assigned are set to 0. |
6982 CHECK_EQUAL_FP64(rawbits_to_double(0x7ff82468a0000000), d13); | 10393 CHECK_EQUAL_FP64(bit_cast<double>(0x7ff82468a0000000), d13); |
6983 CHECK_EQUAL_FP64(rawbits_to_double(0x7ff82468a0000000), d14); | 10394 CHECK_EQUAL_FP64(bit_cast<double>(0x7ff82468a0000000), d14); |
6984 | 10395 |
6985 TEARDOWN(); | 10396 TEARDOWN(); |
6986 } | 10397 } |
6987 | 10398 |
6988 | 10399 |
6989 TEST(fcvt_sd) { | 10400 TEST(fcvt_sd) { |
6990 INIT_V8(); | 10401 INIT_V8(); |
6991 // There are a huge number of corner-cases to check, so this test iterates | 10402 // There are a huge number of corner-cases to check, so this test iterates |
6992 // through a list. The list is then negated and checked again (since the sign | 10403 // through a list. The list is then negated and checked again (since the sign |
6993 // is irrelevant in ties-to-even rounding), so the list shouldn't include any | 10404 // is irrelevant in ties-to-even rounding), so the list shouldn't include any |
6994 // negative values. | 10405 // negative values. |
6995 // | 10406 // |
6996 // Note that this test only checks ties-to-even rounding, because that is all | 10407 // Note that this test only checks ties-to-even rounding, because that is all |
6997 // that the simulator supports. | 10408 // that the simulator supports. |
6998 struct {double in; float expected;} test[] = { | 10409 struct { |
6999 // Check some simple conversions. | 10410 double in; |
7000 {0.0, 0.0f}, | 10411 float expected; |
7001 {1.0, 1.0f}, | 10412 } test[] = { |
7002 {1.5, 1.5f}, | 10413 // Check some simple conversions. |
7003 {2.0, 2.0f}, | 10414 {0.0, 0.0f}, |
7004 {FLT_MAX, FLT_MAX}, | 10415 {1.0, 1.0f}, |
7005 // - The smallest normalized float. | 10416 {1.5, 1.5f}, |
7006 {pow(2.0, -126), powf(2, -126)}, | 10417 {2.0, 2.0f}, |
7007 // - Normal floats that need (ties-to-even) rounding. | 10418 {FLT_MAX, FLT_MAX}, |
7008 // For normalized numbers: | 10419 // - The smallest normalized float. |
7009 // bit 29 (0x0000000020000000) is the lowest-order bit which will | 10420 {pow(2.0, -126), powf(2, -126)}, |
7010 // fit in the float's mantissa. | 10421 // - Normal floats that need (ties-to-even) rounding. |
7011 {rawbits_to_double(0x3ff0000000000000), rawbits_to_float(0x3f800000)}, | 10422 // For normalized numbers: |
7012 {rawbits_to_double(0x3ff0000000000001), rawbits_to_float(0x3f800000)}, | 10423 // bit 29 (0x0000000020000000) is the lowest-order bit which will |
7013 {rawbits_to_double(0x3ff0000010000000), rawbits_to_float(0x3f800000)}, | 10424 // fit in the float's mantissa. |
7014 {rawbits_to_double(0x3ff0000010000001), rawbits_to_float(0x3f800001)}, | 10425 {bit_cast<double>(0x3ff0000000000000), bit_cast<float>(0x3f800000)}, |
7015 {rawbits_to_double(0x3ff0000020000000), rawbits_to_float(0x3f800001)}, | 10426 {bit_cast<double>(0x3ff0000000000001), bit_cast<float>(0x3f800000)}, |
7016 {rawbits_to_double(0x3ff0000020000001), rawbits_to_float(0x3f800001)}, | 10427 {bit_cast<double>(0x3ff0000010000000), bit_cast<float>(0x3f800000)}, |
7017 {rawbits_to_double(0x3ff0000030000000), rawbits_to_float(0x3f800002)}, | 10428 {bit_cast<double>(0x3ff0000010000001), bit_cast<float>(0x3f800001)}, |
7018 {rawbits_to_double(0x3ff0000030000001), rawbits_to_float(0x3f800002)}, | 10429 {bit_cast<double>(0x3ff0000020000000), bit_cast<float>(0x3f800001)}, |
7019 {rawbits_to_double(0x3ff0000040000000), rawbits_to_float(0x3f800002)}, | 10430 {bit_cast<double>(0x3ff0000020000001), bit_cast<float>(0x3f800001)}, |
7020 {rawbits_to_double(0x3ff0000040000001), rawbits_to_float(0x3f800002)}, | 10431 {bit_cast<double>(0x3ff0000030000000), bit_cast<float>(0x3f800002)}, |
7021 {rawbits_to_double(0x3ff0000050000000), rawbits_to_float(0x3f800002)}, | 10432 {bit_cast<double>(0x3ff0000030000001), bit_cast<float>(0x3f800002)}, |
7022 {rawbits_to_double(0x3ff0000050000001), rawbits_to_float(0x3f800003)}, | 10433 {bit_cast<double>(0x3ff0000040000000), bit_cast<float>(0x3f800002)}, |
7023 {rawbits_to_double(0x3ff0000060000000), rawbits_to_float(0x3f800003)}, | 10434 {bit_cast<double>(0x3ff0000040000001), bit_cast<float>(0x3f800002)}, |
7024 // - A mantissa that overflows into the exponent during rounding. | 10435 {bit_cast<double>(0x3ff0000050000000), bit_cast<float>(0x3f800002)}, |
7025 {rawbits_to_double(0x3feffffff0000000), rawbits_to_float(0x3f800000)}, | 10436 {bit_cast<double>(0x3ff0000050000001), bit_cast<float>(0x3f800003)}, |
7026 // - The largest double that rounds to a normal float. | 10437 {bit_cast<double>(0x3ff0000060000000), bit_cast<float>(0x3f800003)}, |
7027 {rawbits_to_double(0x47efffffefffffff), rawbits_to_float(0x7f7fffff)}, | 10438 // - A mantissa that overflows into the exponent during rounding. |
| 10439 {bit_cast<double>(0x3feffffff0000000), bit_cast<float>(0x3f800000)}, |
| 10440 // - The largest double that rounds to a normal float. |
| 10441 {bit_cast<double>(0x47efffffefffffff), bit_cast<float>(0x7f7fffff)}, |
7028 | 10442 |
7029 // Doubles that are too big for a float. | 10443 // Doubles that are too big for a float. |
7030 {kFP64PositiveInfinity, kFP32PositiveInfinity}, | 10444 {kFP64PositiveInfinity, kFP32PositiveInfinity}, |
7031 {DBL_MAX, kFP32PositiveInfinity}, | 10445 {DBL_MAX, kFP32PositiveInfinity}, |
7032 // - The smallest exponent that's too big for a float. | 10446 // - The smallest exponent that's too big for a float. |
7033 {pow(2.0, 128), kFP32PositiveInfinity}, | 10447 {pow(2.0, 128), kFP32PositiveInfinity}, |
7034 // - This exponent is in range, but the value rounds to infinity. | 10448 // - This exponent is in range, but the value rounds to infinity. |
7035 {rawbits_to_double(0x47effffff0000000), kFP32PositiveInfinity}, | 10449 {bit_cast<double>(0x47effffff0000000), kFP32PositiveInfinity}, |
7036 | 10450 |
7037 // Doubles that are too small for a float. | 10451 // Doubles that are too small for a float. |
7038 // - The smallest (subnormal) double. | 10452 // - The smallest (subnormal) double. |
7039 {DBL_MIN, 0.0}, | 10453 {DBL_MIN, 0.0}, |
7040 // - The largest double which is too small for a subnormal float. | 10454 // - The largest double which is too small for a subnormal float. |
7041 {rawbits_to_double(0x3690000000000000), rawbits_to_float(0x00000000)}, | 10455 {bit_cast<double>(0x3690000000000000), bit_cast<float>(0x00000000)}, |
7042 | 10456 |
7043 // Normal doubles that become subnormal floats. | 10457 // Normal doubles that become subnormal floats. |
7044 // - The largest subnormal float. | 10458 // - The largest subnormal float. |
7045 {rawbits_to_double(0x380fffffc0000000), rawbits_to_float(0x007fffff)}, | 10459 {bit_cast<double>(0x380fffffc0000000), bit_cast<float>(0x007fffff)}, |
7046 // - The smallest subnormal float. | 10460 // - The smallest subnormal float. |
7047 {rawbits_to_double(0x36a0000000000000), rawbits_to_float(0x00000001)}, | 10461 {bit_cast<double>(0x36a0000000000000), bit_cast<float>(0x00000001)}, |
7048 // - Subnormal floats that need (ties-to-even) rounding. | 10462 // - Subnormal floats that need (ties-to-even) rounding. |
7049 // For these subnormals: | 10463 // For these subnormals: |
7050 // bit 34 (0x0000000400000000) is the lowest-order bit which will | 10464 // bit 34 (0x0000000400000000) is the lowest-order bit which will |
7051 // fit in the float's mantissa. | 10465 // fit in the float's mantissa. |
7052 {rawbits_to_double(0x37c159e000000000), rawbits_to_float(0x00045678)}, | 10466 {bit_cast<double>(0x37c159e000000000), bit_cast<float>(0x00045678)}, |
7053 {rawbits_to_double(0x37c159e000000001), rawbits_to_float(0x00045678)}, | 10467 {bit_cast<double>(0x37c159e000000001), bit_cast<float>(0x00045678)}, |
7054 {rawbits_to_double(0x37c159e200000000), rawbits_to_float(0x00045678)}, | 10468 {bit_cast<double>(0x37c159e200000000), bit_cast<float>(0x00045678)}, |
7055 {rawbits_to_double(0x37c159e200000001), rawbits_to_float(0x00045679)}, | 10469 {bit_cast<double>(0x37c159e200000001), bit_cast<float>(0x00045679)}, |
7056 {rawbits_to_double(0x37c159e400000000), rawbits_to_float(0x00045679)}, | 10470 {bit_cast<double>(0x37c159e400000000), bit_cast<float>(0x00045679)}, |
7057 {rawbits_to_double(0x37c159e400000001), rawbits_to_float(0x00045679)}, | 10471 {bit_cast<double>(0x37c159e400000001), bit_cast<float>(0x00045679)}, |
7058 {rawbits_to_double(0x37c159e600000000), rawbits_to_float(0x0004567a)}, | 10472 {bit_cast<double>(0x37c159e600000000), bit_cast<float>(0x0004567a)}, |
7059 {rawbits_to_double(0x37c159e600000001), rawbits_to_float(0x0004567a)}, | 10473 {bit_cast<double>(0x37c159e600000001), bit_cast<float>(0x0004567a)}, |
7060 {rawbits_to_double(0x37c159e800000000), rawbits_to_float(0x0004567a)}, | 10474 {bit_cast<double>(0x37c159e800000000), bit_cast<float>(0x0004567a)}, |
7061 {rawbits_to_double(0x37c159e800000001), rawbits_to_float(0x0004567a)}, | 10475 {bit_cast<double>(0x37c159e800000001), bit_cast<float>(0x0004567a)}, |
7062 {rawbits_to_double(0x37c159ea00000000), rawbits_to_float(0x0004567a)}, | 10476 {bit_cast<double>(0x37c159ea00000000), bit_cast<float>(0x0004567a)}, |
7063 {rawbits_to_double(0x37c159ea00000001), rawbits_to_float(0x0004567b)}, | 10477 {bit_cast<double>(0x37c159ea00000001), bit_cast<float>(0x0004567b)}, |
7064 {rawbits_to_double(0x37c159ec00000000), rawbits_to_float(0x0004567b)}, | 10478 {bit_cast<double>(0x37c159ec00000000), bit_cast<float>(0x0004567b)}, |
7065 // - The smallest double which rounds up to become a subnormal float. | 10479 // - The smallest double which rounds up to become a subnormal float. |
7066 {rawbits_to_double(0x3690000000000001), rawbits_to_float(0x00000001)}, | 10480 {bit_cast<double>(0x3690000000000001), bit_cast<float>(0x00000001)}, |
7067 | 10481 |
7068 // Check NaN payload preservation. | 10482 // Check NaN payload preservation. |
7069 {rawbits_to_double(0x7ff82468a0000000), rawbits_to_float(0x7fc12345)}, | 10483 {bit_cast<double>(0x7ff82468a0000000), bit_cast<float>(0x7fc12345)}, |
7070 {rawbits_to_double(0x7ff82468bfffffff), rawbits_to_float(0x7fc12345)}, | 10484 {bit_cast<double>(0x7ff82468bfffffff), bit_cast<float>(0x7fc12345)}, |
7071 // - Signalling NaNs become quiet NaNs. | 10485 // - Signalling NaNs become quiet NaNs. |
7072 {rawbits_to_double(0x7ff02468a0000000), rawbits_to_float(0x7fc12345)}, | 10486 {bit_cast<double>(0x7ff02468a0000000), bit_cast<float>(0x7fc12345)}, |
7073 {rawbits_to_double(0x7ff02468bfffffff), rawbits_to_float(0x7fc12345)}, | 10487 {bit_cast<double>(0x7ff02468bfffffff), bit_cast<float>(0x7fc12345)}, |
7074 {rawbits_to_double(0x7ff000001fffffff), rawbits_to_float(0x7fc00000)}, | 10488 {bit_cast<double>(0x7ff000001fffffff), bit_cast<float>(0x7fc00000)}, |
7075 }; | 10489 }; |
7076 int count = sizeof(test) / sizeof(test[0]); | 10490 int count = sizeof(test) / sizeof(test[0]); |
7077 | 10491 |
7078 for (int i = 0; i < count; i++) { | 10492 for (int i = 0; i < count; i++) { |
7079 double in = test[i].in; | 10493 double in = test[i].in; |
7080 float expected = test[i].expected; | 10494 float expected = test[i].expected; |
7081 | 10495 |
7082 // We only expect positive input. | 10496 // We only expect positive input. |
7083 CHECK(std::signbit(in) == 0); | 10497 CHECK(std::signbit(in) == 0); |
7084 CHECK(std::signbit(expected) == 0); | 10498 CHECK(std::signbit(expected) == 0); |
(...skipping 911 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7996 __ Scvtf(d0, x10, fbits); | 11410 __ Scvtf(d0, x10, fbits); |
7997 __ Ucvtf(d1, x10, fbits); | 11411 __ Ucvtf(d1, x10, fbits); |
7998 __ Str(d0, MemOperand(x0, fbits * kDRegSize)); | 11412 __ Str(d0, MemOperand(x0, fbits * kDRegSize)); |
7999 __ Str(d1, MemOperand(x1, fbits * kDRegSize)); | 11413 __ Str(d1, MemOperand(x1, fbits * kDRegSize)); |
8000 } | 11414 } |
8001 | 11415 |
8002 END(); | 11416 END(); |
8003 RUN(); | 11417 RUN(); |
8004 | 11418 |
8005 // Check the results. | 11419 // Check the results. |
8006 double expected_scvtf_base = rawbits_to_double(expected_scvtf_bits); | 11420 double expected_scvtf_base = bit_cast<double>(expected_scvtf_bits); |
8007 double expected_ucvtf_base = rawbits_to_double(expected_ucvtf_bits); | 11421 double expected_ucvtf_base = bit_cast<double>(expected_ucvtf_bits); |
8008 | 11422 |
8009 for (int fbits = 0; fbits <= 32; fbits++) { | 11423 for (int fbits = 0; fbits <= 32; fbits++) { |
8010 double expected_scvtf = expected_scvtf_base / pow(2.0, fbits); | 11424 double expected_scvtf = expected_scvtf_base / pow(2.0, fbits); |
8011 double expected_ucvtf = expected_ucvtf_base / pow(2.0, fbits); | 11425 double expected_ucvtf = expected_ucvtf_base / pow(2.0, fbits); |
8012 CHECK_EQUAL_FP64(expected_scvtf, results_scvtf_x[fbits]); | 11426 CHECK_EQUAL_FP64(expected_scvtf, results_scvtf_x[fbits]); |
8013 CHECK_EQUAL_FP64(expected_ucvtf, results_ucvtf_x[fbits]); | 11427 CHECK_EQUAL_FP64(expected_ucvtf, results_ucvtf_x[fbits]); |
8014 if (cvtf_s32) CHECK_EQUAL_FP64(expected_scvtf, results_scvtf_w[fbits]); | 11428 if (cvtf_s32) CHECK_EQUAL_FP64(expected_scvtf, results_scvtf_w[fbits]); |
8015 if (cvtf_u32) CHECK_EQUAL_FP64(expected_ucvtf, results_ucvtf_w[fbits]); | 11429 if (cvtf_u32) CHECK_EQUAL_FP64(expected_ucvtf, results_ucvtf_w[fbits]); |
8016 } | 11430 } |
8017 for (int fbits = 33; fbits <= 64; fbits++) { | 11431 for (int fbits = 33; fbits <= 64; fbits++) { |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8151 __ Scvtf(s0, x10, fbits); | 11565 __ Scvtf(s0, x10, fbits); |
8152 __ Ucvtf(s1, x10, fbits); | 11566 __ Ucvtf(s1, x10, fbits); |
8153 __ Str(s0, MemOperand(x0, fbits * kSRegSize)); | 11567 __ Str(s0, MemOperand(x0, fbits * kSRegSize)); |
8154 __ Str(s1, MemOperand(x1, fbits * kSRegSize)); | 11568 __ Str(s1, MemOperand(x1, fbits * kSRegSize)); |
8155 } | 11569 } |
8156 | 11570 |
8157 END(); | 11571 END(); |
8158 RUN(); | 11572 RUN(); |
8159 | 11573 |
8160 // Check the results. | 11574 // Check the results. |
8161 float expected_scvtf_base = rawbits_to_float(expected_scvtf_bits); | 11575 float expected_scvtf_base = bit_cast<float>(expected_scvtf_bits); |
8162 float expected_ucvtf_base = rawbits_to_float(expected_ucvtf_bits); | 11576 float expected_ucvtf_base = bit_cast<float>(expected_ucvtf_bits); |
8163 | 11577 |
8164 for (int fbits = 0; fbits <= 32; fbits++) { | 11578 for (int fbits = 0; fbits <= 32; fbits++) { |
8165 float expected_scvtf = expected_scvtf_base / powf(2, fbits); | 11579 float expected_scvtf = expected_scvtf_base / powf(2, fbits); |
8166 float expected_ucvtf = expected_ucvtf_base / powf(2, fbits); | 11580 float expected_ucvtf = expected_ucvtf_base / powf(2, fbits); |
8167 CHECK_EQUAL_FP32(expected_scvtf, results_scvtf_x[fbits]); | 11581 CHECK_EQUAL_FP32(expected_scvtf, results_scvtf_x[fbits]); |
8168 CHECK_EQUAL_FP32(expected_ucvtf, results_ucvtf_x[fbits]); | 11582 CHECK_EQUAL_FP32(expected_ucvtf, results_ucvtf_x[fbits]); |
8169 if (cvtf_s32) CHECK_EQUAL_FP32(expected_scvtf, results_scvtf_w[fbits]); | 11583 if (cvtf_s32) CHECK_EQUAL_FP32(expected_scvtf, results_scvtf_w[fbits]); |
8170 if (cvtf_u32) CHECK_EQUAL_FP32(expected_ucvtf, results_ucvtf_w[fbits]); | 11584 if (cvtf_u32) CHECK_EQUAL_FP32(expected_ucvtf, results_ucvtf_w[fbits]); |
8171 break; | 11585 break; |
8172 } | 11586 } |
(...skipping 877 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9050 PushPopMethod push_method, | 12464 PushPopMethod push_method, |
9051 PushPopMethod pop_method) { | 12465 PushPopMethod pop_method) { |
9052 SETUP(); | 12466 SETUP(); |
9053 | 12467 |
9054 START(); | 12468 START(); |
9055 | 12469 |
9056 // We can use any floating-point register. None of them are reserved for | 12470 // We can use any floating-point register. None of them are reserved for |
9057 // debug code, for example. | 12471 // debug code, for example. |
9058 static RegList const allowed = ~0; | 12472 static RegList const allowed = ~0; |
9059 if (reg_count == kPushPopFPJsspMaxRegCount) { | 12473 if (reg_count == kPushPopFPJsspMaxRegCount) { |
9060 reg_count = CountSetBits(allowed, kNumberOfFPRegisters); | 12474 reg_count = CountSetBits(allowed, kNumberOfVRegisters); |
9061 } | 12475 } |
9062 // Work out which registers to use, based on reg_size. | 12476 // Work out which registers to use, based on reg_size. |
9063 FPRegister v[kNumberOfRegisters]; | 12477 VRegister v[kNumberOfRegisters]; |
9064 FPRegister d[kNumberOfRegisters]; | 12478 VRegister d[kNumberOfRegisters]; |
9065 RegList list = PopulateFPRegisterArray(NULL, d, v, reg_size, reg_count, | 12479 RegList list = |
9066 allowed); | 12480 PopulateVRegisterArray(NULL, d, v, reg_size, reg_count, allowed); |
9067 | 12481 |
9068 // The literal base is chosen to have two useful properties: | 12482 // The literal base is chosen to have two useful properties: |
9069 // * When multiplied (using an integer) by small values (such as a register | 12483 // * When multiplied (using an integer) by small values (such as a register |
9070 // index), this value is clearly readable in the result. | 12484 // index), this value is clearly readable in the result. |
9071 // * The value is not formed from repeating fixed-size smaller values, so it | 12485 // * The value is not formed from repeating fixed-size smaller values, so it |
9072 // can be used to detect endianness-related errors. | 12486 // can be used to detect endianness-related errors. |
9073 // * It is never a floating-point NaN, and will therefore always compare | 12487 // * It is never a floating-point NaN, and will therefore always compare |
9074 // equal to itself. | 12488 // equal to itself. |
9075 uint64_t literal_base = 0x0100001000100101UL; | 12489 uint64_t literal_base = 0x0100001000100101UL; |
9076 | 12490 |
(...skipping 28 matching lines...) Expand all Loading... |
9105 switch (i) { | 12519 switch (i) { |
9106 case 3: __ Push(v[2], v[1], v[0]); break; | 12520 case 3: __ Push(v[2], v[1], v[0]); break; |
9107 case 2: __ Push(v[1], v[0]); break; | 12521 case 2: __ Push(v[1], v[0]); break; |
9108 case 1: __ Push(v[0]); break; | 12522 case 1: __ Push(v[0]); break; |
9109 default: | 12523 default: |
9110 CHECK(i == 0); | 12524 CHECK(i == 0); |
9111 break; | 12525 break; |
9112 } | 12526 } |
9113 break; | 12527 break; |
9114 case PushPopRegList: | 12528 case PushPopRegList: |
9115 __ PushSizeRegList(list, reg_size, CPURegister::kFPRegister); | 12529 __ PushSizeRegList(list, reg_size, CPURegister::kVRegister); |
9116 break; | 12530 break; |
9117 } | 12531 } |
9118 | 12532 |
9119 // Clobber all the registers, to ensure that they get repopulated by Pop. | 12533 // Clobber all the registers, to ensure that they get repopulated by Pop. |
9120 ClobberFP(&masm, list); | 12534 ClobberFP(&masm, list); |
9121 | 12535 |
9122 switch (pop_method) { | 12536 switch (pop_method) { |
9123 case PushPopByFour: | 12537 case PushPopByFour: |
9124 // Pop low-numbered registers first (from the lowest addresses). | 12538 // Pop low-numbered registers first (from the lowest addresses). |
9125 for (i = 0; i <= (reg_count-4); i += 4) { | 12539 for (i = 0; i <= (reg_count-4); i += 4) { |
9126 __ Pop(v[i], v[i+1], v[i+2], v[i+3]); | 12540 __ Pop(v[i], v[i+1], v[i+2], v[i+3]); |
9127 } | 12541 } |
9128 // Finish off the leftovers. | 12542 // Finish off the leftovers. |
9129 switch (reg_count - i) { | 12543 switch (reg_count - i) { |
9130 case 3: __ Pop(v[i], v[i+1], v[i+2]); break; | 12544 case 3: __ Pop(v[i], v[i+1], v[i+2]); break; |
9131 case 2: __ Pop(v[i], v[i+1]); break; | 12545 case 2: __ Pop(v[i], v[i+1]); break; |
9132 case 1: __ Pop(v[i]); break; | 12546 case 1: __ Pop(v[i]); break; |
9133 default: | 12547 default: |
9134 CHECK(i == reg_count); | 12548 CHECK(i == reg_count); |
9135 break; | 12549 break; |
9136 } | 12550 } |
9137 break; | 12551 break; |
9138 case PushPopRegList: | 12552 case PushPopRegList: |
9139 __ PopSizeRegList(list, reg_size, CPURegister::kFPRegister); | 12553 __ PopSizeRegList(list, reg_size, CPURegister::kVRegister); |
9140 break; | 12554 break; |
9141 } | 12555 } |
9142 | 12556 |
9143 // Drop memory to restore jssp. | 12557 // Drop memory to restore jssp. |
9144 __ Drop(claim, kByteSizeInBytes); | 12558 __ Drop(claim, kByteSizeInBytes); |
9145 | 12559 |
9146 __ Mov(csp, __ StackPointer()); | 12560 __ Mov(csp, __ StackPointer()); |
9147 __ SetStackPointer(csp); | 12561 __ SetStackPointer(csp); |
9148 } | 12562 } |
9149 | 12563 |
(...skipping 516 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9666 __ Mov(w5, 0x12340005); | 13080 __ Mov(w5, 0x12340005); |
9667 __ Mov(w6, 0x12340006); | 13081 __ Mov(w6, 0x12340006); |
9668 __ Fmov(d0, 123400.0); | 13082 __ Fmov(d0, 123400.0); |
9669 __ Fmov(d1, 123401.0); | 13083 __ Fmov(d1, 123401.0); |
9670 __ Fmov(s2, 123402.0); | 13084 __ Fmov(s2, 123402.0); |
9671 | 13085 |
9672 // Actually push them. | 13086 // Actually push them. |
9673 queue.PushQueued(); | 13087 queue.PushQueued(); |
9674 | 13088 |
9675 Clobber(&masm, CPURegList(CPURegister::kRegister, kXRegSizeInBits, 0, 6)); | 13089 Clobber(&masm, CPURegList(CPURegister::kRegister, kXRegSizeInBits, 0, 6)); |
9676 Clobber(&masm, CPURegList(CPURegister::kFPRegister, kDRegSizeInBits, 0, 2)); | 13090 Clobber(&masm, CPURegList(CPURegister::kVRegister, kDRegSizeInBits, 0, 2)); |
9677 | 13091 |
9678 // Pop them conventionally. | 13092 // Pop them conventionally. |
9679 __ Pop(s2); | 13093 __ Pop(s2); |
9680 __ Pop(d1, d0); | 13094 __ Pop(d1, d0); |
9681 __ Pop(w6, w5, w4); | 13095 __ Pop(w6, w5, w4); |
9682 __ Pop(x3, x2, x1, x0); | 13096 __ Pop(x3, x2, x1, x0); |
9683 | 13097 |
9684 __ Mov(csp, __ StackPointer()); | 13098 __ Mov(csp, __ StackPointer()); |
9685 __ SetStackPointer(csp); | 13099 __ SetStackPointer(csp); |
9686 | 13100 |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9744 queue.Queue(w6); | 13158 queue.Queue(w6); |
9745 queue.Queue(w5); | 13159 queue.Queue(w5); |
9746 queue.Queue(w4); | 13160 queue.Queue(w4); |
9747 | 13161 |
9748 queue.Queue(x3); | 13162 queue.Queue(x3); |
9749 queue.Queue(x2); | 13163 queue.Queue(x2); |
9750 queue.Queue(x1); | 13164 queue.Queue(x1); |
9751 queue.Queue(x0); | 13165 queue.Queue(x0); |
9752 | 13166 |
9753 Clobber(&masm, CPURegList(CPURegister::kRegister, kXRegSizeInBits, 0, 6)); | 13167 Clobber(&masm, CPURegList(CPURegister::kRegister, kXRegSizeInBits, 0, 6)); |
9754 Clobber(&masm, CPURegList(CPURegister::kFPRegister, kDRegSizeInBits, 0, 2)); | 13168 Clobber(&masm, CPURegList(CPURegister::kVRegister, kDRegSizeInBits, 0, 2)); |
9755 | 13169 |
9756 // Actually pop them. | 13170 // Actually pop them. |
9757 queue.PopQueued(); | 13171 queue.PopQueued(); |
9758 | 13172 |
9759 __ Mov(csp, __ StackPointer()); | 13173 __ Mov(csp, __ StackPointer()); |
9760 __ SetStackPointer(csp); | 13174 __ SetStackPointer(csp); |
9761 | 13175 |
9762 END(); | 13176 END(); |
9763 | 13177 |
9764 RUN(); | 13178 RUN(); |
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9923 CHECK_EQUAL_64(1, x6); | 13337 CHECK_EQUAL_64(1, x6); |
9924 CHECK_EQUAL_64(1, x7); | 13338 CHECK_EQUAL_64(1, x7); |
9925 | 13339 |
9926 TEARDOWN(); | 13340 TEARDOWN(); |
9927 } | 13341 } |
9928 | 13342 |
9929 | 13343 |
9930 TEST(noreg) { | 13344 TEST(noreg) { |
9931 // This test doesn't generate any code, but it verifies some invariants | 13345 // This test doesn't generate any code, but it verifies some invariants |
9932 // related to NoReg. | 13346 // related to NoReg. |
9933 CHECK(NoReg.Is(NoFPReg)); | 13347 CHECK(NoReg.Is(NoVReg)); |
9934 CHECK(NoFPReg.Is(NoReg)); | 13348 CHECK(NoVReg.Is(NoReg)); |
9935 CHECK(NoReg.Is(NoCPUReg)); | 13349 CHECK(NoReg.Is(NoCPUReg)); |
9936 CHECK(NoCPUReg.Is(NoReg)); | 13350 CHECK(NoCPUReg.Is(NoReg)); |
9937 CHECK(NoFPReg.Is(NoCPUReg)); | 13351 CHECK(NoVReg.Is(NoCPUReg)); |
9938 CHECK(NoCPUReg.Is(NoFPReg)); | 13352 CHECK(NoCPUReg.Is(NoVReg)); |
9939 | 13353 |
9940 CHECK(NoReg.IsNone()); | 13354 CHECK(NoReg.IsNone()); |
9941 CHECK(NoFPReg.IsNone()); | 13355 CHECK(NoVReg.IsNone()); |
9942 CHECK(NoCPUReg.IsNone()); | 13356 CHECK(NoCPUReg.IsNone()); |
9943 } | 13357 } |
9944 | 13358 |
| 13359 TEST(vreg) { |
| 13360 // This test doesn't generate any code, but it verifies |
| 13361 // Helper functions and methods pertaining to VRegister logic. |
| 13362 |
| 13363 CHECK_EQ(8U, RegisterSizeInBitsFromFormat(kFormatB)); |
| 13364 CHECK_EQ(16U, RegisterSizeInBitsFromFormat(kFormatH)); |
| 13365 CHECK_EQ(32U, RegisterSizeInBitsFromFormat(kFormatS)); |
| 13366 CHECK_EQ(64U, RegisterSizeInBitsFromFormat(kFormatD)); |
| 13367 CHECK_EQ(64U, RegisterSizeInBitsFromFormat(kFormat8B)); |
| 13368 CHECK_EQ(64U, RegisterSizeInBitsFromFormat(kFormat4H)); |
| 13369 CHECK_EQ(64U, RegisterSizeInBitsFromFormat(kFormat2S)); |
| 13370 CHECK_EQ(64U, RegisterSizeInBitsFromFormat(kFormat1D)); |
| 13371 CHECK_EQ(128U, RegisterSizeInBitsFromFormat(kFormat16B)); |
| 13372 CHECK_EQ(128U, RegisterSizeInBitsFromFormat(kFormat8H)); |
| 13373 CHECK_EQ(128U, RegisterSizeInBitsFromFormat(kFormat4S)); |
| 13374 CHECK_EQ(128U, RegisterSizeInBitsFromFormat(kFormat2D)); |
| 13375 |
| 13376 CHECK_EQ(16, LaneCountFromFormat(kFormat16B)); |
| 13377 CHECK_EQ(8, LaneCountFromFormat(kFormat8B)); |
| 13378 CHECK_EQ(8, LaneCountFromFormat(kFormat8H)); |
| 13379 CHECK_EQ(4, LaneCountFromFormat(kFormat4H)); |
| 13380 CHECK_EQ(4, LaneCountFromFormat(kFormat4S)); |
| 13381 CHECK_EQ(2, LaneCountFromFormat(kFormat2S)); |
| 13382 CHECK_EQ(2, LaneCountFromFormat(kFormat2D)); |
| 13383 CHECK_EQ(1, LaneCountFromFormat(kFormat1D)); |
| 13384 CHECK_EQ(1, LaneCountFromFormat(kFormatB)); |
| 13385 CHECK_EQ(1, LaneCountFromFormat(kFormatH)); |
| 13386 CHECK_EQ(1, LaneCountFromFormat(kFormatS)); |
| 13387 CHECK_EQ(1, LaneCountFromFormat(kFormatD)); |
| 13388 |
| 13389 CHECK(!IsVectorFormat(kFormatB)); |
| 13390 CHECK(!IsVectorFormat(kFormatH)); |
| 13391 CHECK(!IsVectorFormat(kFormatS)); |
| 13392 CHECK(!IsVectorFormat(kFormatD)); |
| 13393 CHECK(IsVectorFormat(kFormat16B)); |
| 13394 CHECK(IsVectorFormat(kFormat8B)); |
| 13395 CHECK(IsVectorFormat(kFormat8H)); |
| 13396 CHECK(IsVectorFormat(kFormat4H)); |
| 13397 CHECK(IsVectorFormat(kFormat4S)); |
| 13398 CHECK(IsVectorFormat(kFormat2S)); |
| 13399 CHECK(IsVectorFormat(kFormat2D)); |
| 13400 CHECK(IsVectorFormat(kFormat1D)); |
| 13401 |
| 13402 CHECK(!d0.Is8B()); |
| 13403 CHECK(!d0.Is16B()); |
| 13404 CHECK(!d0.Is4H()); |
| 13405 CHECK(!d0.Is8H()); |
| 13406 CHECK(!d0.Is2S()); |
| 13407 CHECK(!d0.Is4S()); |
| 13408 CHECK(d0.Is1D()); |
| 13409 CHECK(!d0.Is1S()); |
| 13410 CHECK(!d0.Is1H()); |
| 13411 CHECK(!d0.Is1B()); |
| 13412 CHECK(!d0.IsVector()); |
| 13413 CHECK(d0.IsScalar()); |
| 13414 CHECK(d0.IsFPRegister()); |
| 13415 |
| 13416 CHECK(!d0.IsW()); |
| 13417 CHECK(!d0.IsX()); |
| 13418 CHECK(d0.IsV()); |
| 13419 CHECK(!d0.IsB()); |
| 13420 CHECK(!d0.IsH()); |
| 13421 CHECK(!d0.IsS()); |
| 13422 CHECK(d0.IsD()); |
| 13423 CHECK(!d0.IsQ()); |
| 13424 |
| 13425 CHECK(!s0.Is8B()); |
| 13426 CHECK(!s0.Is16B()); |
| 13427 CHECK(!s0.Is4H()); |
| 13428 CHECK(!s0.Is8H()); |
| 13429 CHECK(!s0.Is2S()); |
| 13430 CHECK(!s0.Is4S()); |
| 13431 CHECK(!s0.Is1D()); |
| 13432 CHECK(s0.Is1S()); |
| 13433 CHECK(!s0.Is1H()); |
| 13434 CHECK(!s0.Is1B()); |
| 13435 CHECK(!s0.IsVector()); |
| 13436 CHECK(s0.IsScalar()); |
| 13437 CHECK(s0.IsFPRegister()); |
| 13438 |
| 13439 CHECK(!s0.IsW()); |
| 13440 CHECK(!s0.IsX()); |
| 13441 CHECK(s0.IsV()); |
| 13442 CHECK(!s0.IsB()); |
| 13443 CHECK(!s0.IsH()); |
| 13444 CHECK(s0.IsS()); |
| 13445 CHECK(!s0.IsD()); |
| 13446 CHECK(!s0.IsQ()); |
| 13447 |
| 13448 CHECK(!h0.Is8B()); |
| 13449 CHECK(!h0.Is16B()); |
| 13450 CHECK(!h0.Is4H()); |
| 13451 CHECK(!h0.Is8H()); |
| 13452 CHECK(!h0.Is2S()); |
| 13453 CHECK(!h0.Is4S()); |
| 13454 CHECK(!h0.Is1D()); |
| 13455 CHECK(!h0.Is1S()); |
| 13456 CHECK(h0.Is1H()); |
| 13457 CHECK(!h0.Is1B()); |
| 13458 CHECK(!h0.IsVector()); |
| 13459 CHECK(h0.IsScalar()); |
| 13460 CHECK(!h0.IsFPRegister()); |
| 13461 |
| 13462 CHECK(!h0.IsW()); |
| 13463 CHECK(!h0.IsX()); |
| 13464 CHECK(h0.IsV()); |
| 13465 CHECK(!h0.IsB()); |
| 13466 CHECK(h0.IsH()); |
| 13467 CHECK(!h0.IsS()); |
| 13468 CHECK(!h0.IsD()); |
| 13469 CHECK(!h0.IsQ()); |
| 13470 |
| 13471 CHECK(!b0.Is8B()); |
| 13472 CHECK(!b0.Is16B()); |
| 13473 CHECK(!b0.Is4H()); |
| 13474 CHECK(!b0.Is8H()); |
| 13475 CHECK(!b0.Is2S()); |
| 13476 CHECK(!b0.Is4S()); |
| 13477 CHECK(!b0.Is1D()); |
| 13478 CHECK(!b0.Is1S()); |
| 13479 CHECK(!b0.Is1H()); |
| 13480 CHECK(b0.Is1B()); |
| 13481 CHECK(!b0.IsVector()); |
| 13482 CHECK(b0.IsScalar()); |
| 13483 CHECK(!b0.IsFPRegister()); |
| 13484 |
| 13485 CHECK(!b0.IsW()); |
| 13486 CHECK(!b0.IsX()); |
| 13487 CHECK(b0.IsV()); |
| 13488 CHECK(b0.IsB()); |
| 13489 CHECK(!b0.IsH()); |
| 13490 CHECK(!b0.IsS()); |
| 13491 CHECK(!b0.IsD()); |
| 13492 CHECK(!b0.IsQ()); |
| 13493 |
| 13494 CHECK(!q0.Is8B()); |
| 13495 CHECK(!q0.Is16B()); |
| 13496 CHECK(!q0.Is4H()); |
| 13497 CHECK(!q0.Is8H()); |
| 13498 CHECK(!q0.Is2S()); |
| 13499 CHECK(!q0.Is4S()); |
| 13500 CHECK(!q0.Is1D()); |
| 13501 CHECK(!q0.Is2D()); |
| 13502 CHECK(!q0.Is1S()); |
| 13503 CHECK(!q0.Is1H()); |
| 13504 CHECK(!q0.Is1B()); |
| 13505 CHECK(!q0.IsVector()); |
| 13506 CHECK(q0.IsScalar()); |
| 13507 CHECK(!q0.IsFPRegister()); |
| 13508 |
| 13509 CHECK(!q0.IsW()); |
| 13510 CHECK(!q0.IsX()); |
| 13511 CHECK(q0.IsV()); |
| 13512 CHECK(!q0.IsB()); |
| 13513 CHECK(!q0.IsH()); |
| 13514 CHECK(!q0.IsS()); |
| 13515 CHECK(!q0.IsD()); |
| 13516 CHECK(q0.IsQ()); |
| 13517 |
| 13518 CHECK(w0.IsW()); |
| 13519 CHECK(!w0.IsX()); |
| 13520 CHECK(!w0.IsV()); |
| 13521 CHECK(!w0.IsB()); |
| 13522 CHECK(!w0.IsH()); |
| 13523 CHECK(!w0.IsS()); |
| 13524 CHECK(!w0.IsD()); |
| 13525 CHECK(!w0.IsQ()); |
| 13526 |
| 13527 CHECK(!x0.IsW()); |
| 13528 CHECK(x0.IsX()); |
| 13529 CHECK(!x0.IsV()); |
| 13530 CHECK(!x0.IsB()); |
| 13531 CHECK(!x0.IsH()); |
| 13532 CHECK(!x0.IsS()); |
| 13533 CHECK(!x0.IsD()); |
| 13534 CHECK(!x0.IsQ()); |
| 13535 |
| 13536 CHECK(v0.V().IsV()); |
| 13537 CHECK(v0.B().IsB()); |
| 13538 CHECK(v0.H().IsH()); |
| 13539 CHECK(v0.D().IsD()); |
| 13540 CHECK(v0.S().IsS()); |
| 13541 CHECK(v0.Q().IsQ()); |
| 13542 |
| 13543 VRegister test_8b(VRegister::Create(0, 64, 8)); |
| 13544 CHECK(test_8b.Is8B()); |
| 13545 CHECK(!test_8b.Is16B()); |
| 13546 CHECK(!test_8b.Is4H()); |
| 13547 CHECK(!test_8b.Is8H()); |
| 13548 CHECK(!test_8b.Is2S()); |
| 13549 CHECK(!test_8b.Is4S()); |
| 13550 CHECK(!test_8b.Is1D()); |
| 13551 CHECK(!test_8b.Is2D()); |
| 13552 CHECK(!test_8b.Is1H()); |
| 13553 CHECK(!test_8b.Is1B()); |
| 13554 CHECK(test_8b.IsVector()); |
| 13555 CHECK(!test_8b.IsScalar()); |
| 13556 CHECK(test_8b.IsFPRegister()); |
| 13557 |
| 13558 VRegister test_16b(VRegister::Create(0, 128, 16)); |
| 13559 CHECK(!test_16b.Is8B()); |
| 13560 CHECK(test_16b.Is16B()); |
| 13561 CHECK(!test_16b.Is4H()); |
| 13562 CHECK(!test_16b.Is8H()); |
| 13563 CHECK(!test_16b.Is2S()); |
| 13564 CHECK(!test_16b.Is4S()); |
| 13565 CHECK(!test_16b.Is1D()); |
| 13566 CHECK(!test_16b.Is2D()); |
| 13567 CHECK(!test_16b.Is1H()); |
| 13568 CHECK(!test_16b.Is1B()); |
| 13569 CHECK(test_16b.IsVector()); |
| 13570 CHECK(!test_16b.IsScalar()); |
| 13571 CHECK(!test_16b.IsFPRegister()); |
| 13572 |
| 13573 VRegister test_4h(VRegister::Create(0, 64, 4)); |
| 13574 CHECK(!test_4h.Is8B()); |
| 13575 CHECK(!test_4h.Is16B()); |
| 13576 CHECK(test_4h.Is4H()); |
| 13577 CHECK(!test_4h.Is8H()); |
| 13578 CHECK(!test_4h.Is2S()); |
| 13579 CHECK(!test_4h.Is4S()); |
| 13580 CHECK(!test_4h.Is1D()); |
| 13581 CHECK(!test_4h.Is2D()); |
| 13582 CHECK(!test_4h.Is1H()); |
| 13583 CHECK(!test_4h.Is1B()); |
| 13584 CHECK(test_4h.IsVector()); |
| 13585 CHECK(!test_4h.IsScalar()); |
| 13586 CHECK(test_4h.IsFPRegister()); |
| 13587 |
| 13588 VRegister test_8h(VRegister::Create(0, 128, 8)); |
| 13589 CHECK(!test_8h.Is8B()); |
| 13590 CHECK(!test_8h.Is16B()); |
| 13591 CHECK(!test_8h.Is4H()); |
| 13592 CHECK(test_8h.Is8H()); |
| 13593 CHECK(!test_8h.Is2S()); |
| 13594 CHECK(!test_8h.Is4S()); |
| 13595 CHECK(!test_8h.Is1D()); |
| 13596 CHECK(!test_8h.Is2D()); |
| 13597 CHECK(!test_8h.Is1H()); |
| 13598 CHECK(!test_8h.Is1B()); |
| 13599 CHECK(test_8h.IsVector()); |
| 13600 CHECK(!test_8h.IsScalar()); |
| 13601 CHECK(!test_8h.IsFPRegister()); |
| 13602 |
| 13603 VRegister test_2s(VRegister::Create(0, 64, 2)); |
| 13604 CHECK(!test_2s.Is8B()); |
| 13605 CHECK(!test_2s.Is16B()); |
| 13606 CHECK(!test_2s.Is4H()); |
| 13607 CHECK(!test_2s.Is8H()); |
| 13608 CHECK(test_2s.Is2S()); |
| 13609 CHECK(!test_2s.Is4S()); |
| 13610 CHECK(!test_2s.Is1D()); |
| 13611 CHECK(!test_2s.Is2D()); |
| 13612 CHECK(!test_2s.Is1H()); |
| 13613 CHECK(!test_2s.Is1B()); |
| 13614 CHECK(test_2s.IsVector()); |
| 13615 CHECK(!test_2s.IsScalar()); |
| 13616 CHECK(test_2s.IsFPRegister()); |
| 13617 |
| 13618 VRegister test_4s(VRegister::Create(0, 128, 4)); |
| 13619 CHECK(!test_4s.Is8B()); |
| 13620 CHECK(!test_4s.Is16B()); |
| 13621 CHECK(!test_4s.Is4H()); |
| 13622 CHECK(!test_4s.Is8H()); |
| 13623 CHECK(!test_4s.Is2S()); |
| 13624 CHECK(test_4s.Is4S()); |
| 13625 CHECK(!test_4s.Is1D()); |
| 13626 CHECK(!test_4s.Is2D()); |
| 13627 CHECK(!test_4s.Is1S()); |
| 13628 CHECK(!test_4s.Is1H()); |
| 13629 CHECK(!test_4s.Is1B()); |
| 13630 CHECK(test_4s.IsVector()); |
| 13631 CHECK(!test_4s.IsScalar()); |
| 13632 CHECK(!test_4s.IsFPRegister()); |
| 13633 |
| 13634 VRegister test_1d(VRegister::Create(0, 64, 1)); |
| 13635 CHECK(!test_1d.Is8B()); |
| 13636 CHECK(!test_1d.Is16B()); |
| 13637 CHECK(!test_1d.Is4H()); |
| 13638 CHECK(!test_1d.Is8H()); |
| 13639 CHECK(!test_1d.Is2S()); |
| 13640 CHECK(!test_1d.Is4S()); |
| 13641 CHECK(test_1d.Is1D()); |
| 13642 CHECK(!test_1d.Is2D()); |
| 13643 CHECK(!test_1d.Is1S()); |
| 13644 CHECK(!test_1d.Is1H()); |
| 13645 CHECK(!test_1d.Is1B()); |
| 13646 CHECK(!test_1d.IsVector()); |
| 13647 CHECK(test_1d.IsScalar()); |
| 13648 CHECK(test_1d.IsFPRegister()); |
| 13649 |
| 13650 VRegister test_2d(VRegister::Create(0, 128, 2)); |
| 13651 CHECK(!test_2d.Is8B()); |
| 13652 CHECK(!test_2d.Is16B()); |
| 13653 CHECK(!test_2d.Is4H()); |
| 13654 CHECK(!test_2d.Is8H()); |
| 13655 CHECK(!test_2d.Is2S()); |
| 13656 CHECK(!test_2d.Is4S()); |
| 13657 CHECK(!test_2d.Is1D()); |
| 13658 CHECK(test_2d.Is2D()); |
| 13659 CHECK(!test_2d.Is1H()); |
| 13660 CHECK(!test_2d.Is1B()); |
| 13661 CHECK(test_2d.IsVector()); |
| 13662 CHECK(!test_2d.IsScalar()); |
| 13663 CHECK(!test_2d.IsFPRegister()); |
| 13664 |
| 13665 VRegister test_1s(VRegister::Create(0, 32, 1)); |
| 13666 CHECK(!test_1s.Is8B()); |
| 13667 CHECK(!test_1s.Is16B()); |
| 13668 CHECK(!test_1s.Is4H()); |
| 13669 CHECK(!test_1s.Is8H()); |
| 13670 CHECK(!test_1s.Is2S()); |
| 13671 CHECK(!test_1s.Is4S()); |
| 13672 CHECK(!test_1s.Is1D()); |
| 13673 CHECK(!test_1s.Is2D()); |
| 13674 CHECK(test_1s.Is1S()); |
| 13675 CHECK(!test_1s.Is1H()); |
| 13676 CHECK(!test_1s.Is1B()); |
| 13677 CHECK(!test_1s.IsVector()); |
| 13678 CHECK(test_1s.IsScalar()); |
| 13679 CHECK(test_1s.IsFPRegister()); |
| 13680 |
| 13681 VRegister test_1h(VRegister::Create(0, 16, 1)); |
| 13682 CHECK(!test_1h.Is8B()); |
| 13683 CHECK(!test_1h.Is16B()); |
| 13684 CHECK(!test_1h.Is4H()); |
| 13685 CHECK(!test_1h.Is8H()); |
| 13686 CHECK(!test_1h.Is2S()); |
| 13687 CHECK(!test_1h.Is4S()); |
| 13688 CHECK(!test_1h.Is1D()); |
| 13689 CHECK(!test_1h.Is2D()); |
| 13690 CHECK(!test_1h.Is1S()); |
| 13691 CHECK(test_1h.Is1H()); |
| 13692 CHECK(!test_1h.Is1B()); |
| 13693 CHECK(!test_1h.IsVector()); |
| 13694 CHECK(test_1h.IsScalar()); |
| 13695 CHECK(!test_1h.IsFPRegister()); |
| 13696 |
| 13697 VRegister test_1b(VRegister::Create(0, 8, 1)); |
| 13698 CHECK(!test_1b.Is8B()); |
| 13699 CHECK(!test_1b.Is16B()); |
| 13700 CHECK(!test_1b.Is4H()); |
| 13701 CHECK(!test_1b.Is8H()); |
| 13702 CHECK(!test_1b.Is2S()); |
| 13703 CHECK(!test_1b.Is4S()); |
| 13704 CHECK(!test_1b.Is1D()); |
| 13705 CHECK(!test_1b.Is2D()); |
| 13706 CHECK(!test_1b.Is1S()); |
| 13707 CHECK(!test_1b.Is1H()); |
| 13708 CHECK(test_1b.Is1B()); |
| 13709 CHECK(!test_1b.IsVector()); |
| 13710 CHECK(test_1b.IsScalar()); |
| 13711 CHECK(!test_1b.IsFPRegister()); |
| 13712 |
| 13713 VRegister test_breg_from_code(VRegister::BRegFromCode(0)); |
| 13714 CHECK_EQ(test_breg_from_code.SizeInBits(), kBRegSizeInBits); |
| 13715 |
| 13716 VRegister test_hreg_from_code(VRegister::HRegFromCode(0)); |
| 13717 CHECK_EQ(test_hreg_from_code.SizeInBits(), kHRegSizeInBits); |
| 13718 |
| 13719 VRegister test_sreg_from_code(VRegister::SRegFromCode(0)); |
| 13720 CHECK_EQ(test_sreg_from_code.SizeInBits(), kSRegSizeInBits); |
| 13721 |
| 13722 VRegister test_dreg_from_code(VRegister::DRegFromCode(0)); |
| 13723 CHECK_EQ(test_dreg_from_code.SizeInBits(), kDRegSizeInBits); |
| 13724 |
| 13725 VRegister test_qreg_from_code(VRegister::QRegFromCode(0)); |
| 13726 CHECK_EQ(test_qreg_from_code.SizeInBits(), kQRegSizeInBits); |
| 13727 |
| 13728 VRegister test_vreg_from_code(VRegister::VRegFromCode(0)); |
| 13729 CHECK_EQ(test_vreg_from_code.SizeInBits(), kVRegSizeInBits); |
| 13730 |
| 13731 VRegister test_v8b(VRegister::VRegFromCode(31).V8B()); |
| 13732 CHECK_EQ(test_v8b.code(), 31); |
| 13733 CHECK_EQ(test_v8b.SizeInBits(), kDRegSizeInBits); |
| 13734 CHECK(test_v8b.IsLaneSizeB()); |
| 13735 CHECK(!test_v8b.IsLaneSizeH()); |
| 13736 CHECK(!test_v8b.IsLaneSizeS()); |
| 13737 CHECK(!test_v8b.IsLaneSizeD()); |
| 13738 CHECK_EQ(test_v8b.LaneSizeInBits(), 8U); |
| 13739 |
| 13740 VRegister test_v16b(VRegister::VRegFromCode(31).V16B()); |
| 13741 CHECK_EQ(test_v16b.code(), 31); |
| 13742 CHECK_EQ(test_v16b.SizeInBits(), kQRegSizeInBits); |
| 13743 CHECK(test_v16b.IsLaneSizeB()); |
| 13744 CHECK(!test_v16b.IsLaneSizeH()); |
| 13745 CHECK(!test_v16b.IsLaneSizeS()); |
| 13746 CHECK(!test_v16b.IsLaneSizeD()); |
| 13747 CHECK_EQ(test_v16b.LaneSizeInBits(), 8U); |
| 13748 |
| 13749 VRegister test_v4h(VRegister::VRegFromCode(31).V4H()); |
| 13750 CHECK_EQ(test_v4h.code(), 31); |
| 13751 CHECK_EQ(test_v4h.SizeInBits(), kDRegSizeInBits); |
| 13752 CHECK(!test_v4h.IsLaneSizeB()); |
| 13753 CHECK(test_v4h.IsLaneSizeH()); |
| 13754 CHECK(!test_v4h.IsLaneSizeS()); |
| 13755 CHECK(!test_v4h.IsLaneSizeD()); |
| 13756 CHECK_EQ(test_v4h.LaneSizeInBits(), 16U); |
| 13757 |
| 13758 VRegister test_v8h(VRegister::VRegFromCode(31).V8H()); |
| 13759 CHECK_EQ(test_v8h.code(), 31); |
| 13760 CHECK_EQ(test_v8h.SizeInBits(), kQRegSizeInBits); |
| 13761 CHECK(!test_v8h.IsLaneSizeB()); |
| 13762 CHECK(test_v8h.IsLaneSizeH()); |
| 13763 CHECK(!test_v8h.IsLaneSizeS()); |
| 13764 CHECK(!test_v8h.IsLaneSizeD()); |
| 13765 CHECK_EQ(test_v8h.LaneSizeInBits(), 16U); |
| 13766 |
| 13767 VRegister test_v2s(VRegister::VRegFromCode(31).V2S()); |
| 13768 CHECK_EQ(test_v2s.code(), 31); |
| 13769 CHECK_EQ(test_v2s.SizeInBits(), kDRegSizeInBits); |
| 13770 CHECK(!test_v2s.IsLaneSizeB()); |
| 13771 CHECK(!test_v2s.IsLaneSizeH()); |
| 13772 CHECK(test_v2s.IsLaneSizeS()); |
| 13773 CHECK(!test_v2s.IsLaneSizeD()); |
| 13774 CHECK_EQ(test_v2s.LaneSizeInBits(), 32U); |
| 13775 |
| 13776 VRegister test_v4s(VRegister::VRegFromCode(31).V4S()); |
| 13777 CHECK_EQ(test_v4s.code(), 31); |
| 13778 CHECK_EQ(test_v4s.SizeInBits(), kQRegSizeInBits); |
| 13779 CHECK(!test_v4s.IsLaneSizeB()); |
| 13780 CHECK(!test_v4s.IsLaneSizeH()); |
| 13781 CHECK(test_v4s.IsLaneSizeS()); |
| 13782 CHECK(!test_v4s.IsLaneSizeD()); |
| 13783 CHECK_EQ(test_v4s.LaneSizeInBits(), 32U); |
| 13784 |
| 13785 VRegister test_v1d(VRegister::VRegFromCode(31).V1D()); |
| 13786 CHECK_EQ(test_v1d.code(), 31); |
| 13787 CHECK_EQ(test_v1d.SizeInBits(), kDRegSizeInBits); |
| 13788 CHECK(!test_v1d.IsLaneSizeB()); |
| 13789 CHECK(!test_v1d.IsLaneSizeH()); |
| 13790 CHECK(!test_v1d.IsLaneSizeS()); |
| 13791 CHECK(test_v1d.IsLaneSizeD()); |
| 13792 CHECK_EQ(test_v1d.LaneSizeInBits(), 64U); |
| 13793 |
| 13794 VRegister test_v2d(VRegister::VRegFromCode(31).V2D()); |
| 13795 CHECK_EQ(test_v2d.code(), 31); |
| 13796 CHECK_EQ(test_v2d.SizeInBits(), kQRegSizeInBits); |
| 13797 CHECK(!test_v2d.IsLaneSizeB()); |
| 13798 CHECK(!test_v2d.IsLaneSizeH()); |
| 13799 CHECK(!test_v2d.IsLaneSizeS()); |
| 13800 CHECK(test_v2d.IsLaneSizeD()); |
| 13801 CHECK_EQ(test_v2d.LaneSizeInBits(), 64U); |
| 13802 |
| 13803 CHECK(test_v1d.IsSameFormat(test_v1d)); |
| 13804 CHECK(test_v2d.IsSameFormat(test_v2d)); |
| 13805 CHECK(!test_v1d.IsSameFormat(test_v2d)); |
| 13806 CHECK(!test_v2s.IsSameFormat(test_v2d)); |
| 13807 } |
9945 | 13808 |
9946 TEST(isvalid) { | 13809 TEST(isvalid) { |
9947 // This test doesn't generate any code, but it verifies some invariants | 13810 // This test doesn't generate any code, but it verifies some invariants |
9948 // related to IsValid(). | 13811 // related to IsValid(). |
9949 CHECK(!NoReg.IsValid()); | 13812 CHECK(!NoReg.IsValid()); |
9950 CHECK(!NoFPReg.IsValid()); | 13813 CHECK(!NoVReg.IsValid()); |
9951 CHECK(!NoCPUReg.IsValid()); | 13814 CHECK(!NoCPUReg.IsValid()); |
9952 | 13815 |
9953 CHECK(x0.IsValid()); | 13816 CHECK(x0.IsValid()); |
9954 CHECK(w0.IsValid()); | 13817 CHECK(w0.IsValid()); |
9955 CHECK(x30.IsValid()); | 13818 CHECK(x30.IsValid()); |
9956 CHECK(w30.IsValid()); | 13819 CHECK(w30.IsValid()); |
9957 CHECK(xzr.IsValid()); | 13820 CHECK(xzr.IsValid()); |
9958 CHECK(wzr.IsValid()); | 13821 CHECK(wzr.IsValid()); |
9959 | 13822 |
9960 CHECK(csp.IsValid()); | 13823 CHECK(csp.IsValid()); |
9961 CHECK(wcsp.IsValid()); | 13824 CHECK(wcsp.IsValid()); |
9962 | 13825 |
9963 CHECK(d0.IsValid()); | 13826 CHECK(d0.IsValid()); |
9964 CHECK(s0.IsValid()); | 13827 CHECK(s0.IsValid()); |
9965 CHECK(d31.IsValid()); | 13828 CHECK(d31.IsValid()); |
9966 CHECK(s31.IsValid()); | 13829 CHECK(s31.IsValid()); |
9967 | 13830 |
9968 CHECK(x0.IsValidRegister()); | 13831 CHECK(x0.IsValidRegister()); |
9969 CHECK(w0.IsValidRegister()); | 13832 CHECK(w0.IsValidRegister()); |
9970 CHECK(xzr.IsValidRegister()); | 13833 CHECK(xzr.IsValidRegister()); |
9971 CHECK(wzr.IsValidRegister()); | 13834 CHECK(wzr.IsValidRegister()); |
9972 CHECK(csp.IsValidRegister()); | 13835 CHECK(csp.IsValidRegister()); |
9973 CHECK(wcsp.IsValidRegister()); | 13836 CHECK(wcsp.IsValidRegister()); |
9974 CHECK(!x0.IsValidFPRegister()); | 13837 CHECK(!x0.IsValidVRegister()); |
9975 CHECK(!w0.IsValidFPRegister()); | 13838 CHECK(!w0.IsValidVRegister()); |
9976 CHECK(!xzr.IsValidFPRegister()); | 13839 CHECK(!xzr.IsValidVRegister()); |
9977 CHECK(!wzr.IsValidFPRegister()); | 13840 CHECK(!wzr.IsValidVRegister()); |
9978 CHECK(!csp.IsValidFPRegister()); | 13841 CHECK(!csp.IsValidVRegister()); |
9979 CHECK(!wcsp.IsValidFPRegister()); | 13842 CHECK(!wcsp.IsValidVRegister()); |
9980 | 13843 |
9981 CHECK(d0.IsValidFPRegister()); | 13844 CHECK(d0.IsValidVRegister()); |
9982 CHECK(s0.IsValidFPRegister()); | 13845 CHECK(s0.IsValidVRegister()); |
9983 CHECK(!d0.IsValidRegister()); | 13846 CHECK(!d0.IsValidRegister()); |
9984 CHECK(!s0.IsValidRegister()); | 13847 CHECK(!s0.IsValidRegister()); |
9985 | 13848 |
9986 // Test the same as before, but using CPURegister types. This shouldn't make | 13849 // Test the same as before, but using CPURegister types. This shouldn't make |
9987 // any difference. | 13850 // any difference. |
9988 CHECK(static_cast<CPURegister>(x0).IsValid()); | 13851 CHECK(static_cast<CPURegister>(x0).IsValid()); |
9989 CHECK(static_cast<CPURegister>(w0).IsValid()); | 13852 CHECK(static_cast<CPURegister>(w0).IsValid()); |
9990 CHECK(static_cast<CPURegister>(x30).IsValid()); | 13853 CHECK(static_cast<CPURegister>(x30).IsValid()); |
9991 CHECK(static_cast<CPURegister>(w30).IsValid()); | 13854 CHECK(static_cast<CPURegister>(w30).IsValid()); |
9992 CHECK(static_cast<CPURegister>(xzr).IsValid()); | 13855 CHECK(static_cast<CPURegister>(xzr).IsValid()); |
9993 CHECK(static_cast<CPURegister>(wzr).IsValid()); | 13856 CHECK(static_cast<CPURegister>(wzr).IsValid()); |
9994 | 13857 |
9995 CHECK(static_cast<CPURegister>(csp).IsValid()); | 13858 CHECK(static_cast<CPURegister>(csp).IsValid()); |
9996 CHECK(static_cast<CPURegister>(wcsp).IsValid()); | 13859 CHECK(static_cast<CPURegister>(wcsp).IsValid()); |
9997 | 13860 |
9998 CHECK(static_cast<CPURegister>(d0).IsValid()); | 13861 CHECK(static_cast<CPURegister>(d0).IsValid()); |
9999 CHECK(static_cast<CPURegister>(s0).IsValid()); | 13862 CHECK(static_cast<CPURegister>(s0).IsValid()); |
10000 CHECK(static_cast<CPURegister>(d31).IsValid()); | 13863 CHECK(static_cast<CPURegister>(d31).IsValid()); |
10001 CHECK(static_cast<CPURegister>(s31).IsValid()); | 13864 CHECK(static_cast<CPURegister>(s31).IsValid()); |
10002 | 13865 |
10003 CHECK(static_cast<CPURegister>(x0).IsValidRegister()); | 13866 CHECK(static_cast<CPURegister>(x0).IsValidRegister()); |
10004 CHECK(static_cast<CPURegister>(w0).IsValidRegister()); | 13867 CHECK(static_cast<CPURegister>(w0).IsValidRegister()); |
10005 CHECK(static_cast<CPURegister>(xzr).IsValidRegister()); | 13868 CHECK(static_cast<CPURegister>(xzr).IsValidRegister()); |
10006 CHECK(static_cast<CPURegister>(wzr).IsValidRegister()); | 13869 CHECK(static_cast<CPURegister>(wzr).IsValidRegister()); |
10007 CHECK(static_cast<CPURegister>(csp).IsValidRegister()); | 13870 CHECK(static_cast<CPURegister>(csp).IsValidRegister()); |
10008 CHECK(static_cast<CPURegister>(wcsp).IsValidRegister()); | 13871 CHECK(static_cast<CPURegister>(wcsp).IsValidRegister()); |
10009 CHECK(!static_cast<CPURegister>(x0).IsValidFPRegister()); | 13872 CHECK(!static_cast<CPURegister>(x0).IsValidVRegister()); |
10010 CHECK(!static_cast<CPURegister>(w0).IsValidFPRegister()); | 13873 CHECK(!static_cast<CPURegister>(w0).IsValidVRegister()); |
10011 CHECK(!static_cast<CPURegister>(xzr).IsValidFPRegister()); | 13874 CHECK(!static_cast<CPURegister>(xzr).IsValidVRegister()); |
10012 CHECK(!static_cast<CPURegister>(wzr).IsValidFPRegister()); | 13875 CHECK(!static_cast<CPURegister>(wzr).IsValidVRegister()); |
10013 CHECK(!static_cast<CPURegister>(csp).IsValidFPRegister()); | 13876 CHECK(!static_cast<CPURegister>(csp).IsValidVRegister()); |
10014 CHECK(!static_cast<CPURegister>(wcsp).IsValidFPRegister()); | 13877 CHECK(!static_cast<CPURegister>(wcsp).IsValidVRegister()); |
10015 | 13878 |
10016 CHECK(static_cast<CPURegister>(d0).IsValidFPRegister()); | 13879 CHECK(static_cast<CPURegister>(d0).IsValidVRegister()); |
10017 CHECK(static_cast<CPURegister>(s0).IsValidFPRegister()); | 13880 CHECK(static_cast<CPURegister>(s0).IsValidVRegister()); |
10018 CHECK(!static_cast<CPURegister>(d0).IsValidRegister()); | 13881 CHECK(!static_cast<CPURegister>(d0).IsValidRegister()); |
10019 CHECK(!static_cast<CPURegister>(s0).IsValidRegister()); | 13882 CHECK(!static_cast<CPURegister>(s0).IsValidRegister()); |
10020 } | 13883 } |
10021 | 13884 |
| 13885 TEST(areconsecutive) { |
| 13886 // This test generates no code; it just checks that AreConsecutive works. |
| 13887 CHECK(AreConsecutive(b0, NoVReg)); |
| 13888 CHECK(AreConsecutive(b1, b2)); |
| 13889 CHECK(AreConsecutive(b3, b4, b5)); |
| 13890 CHECK(AreConsecutive(b6, b7, b8, b9)); |
| 13891 CHECK(AreConsecutive(h10, NoVReg)); |
| 13892 CHECK(AreConsecutive(h11, h12)); |
| 13893 CHECK(AreConsecutive(h13, h14, h15)); |
| 13894 CHECK(AreConsecutive(h16, h17, h18, h19)); |
| 13895 CHECK(AreConsecutive(s20, NoVReg)); |
| 13896 CHECK(AreConsecutive(s21, s22)); |
| 13897 CHECK(AreConsecutive(s23, s24, s25)); |
| 13898 CHECK(AreConsecutive(s26, s27, s28, s29)); |
| 13899 CHECK(AreConsecutive(d30, NoVReg)); |
| 13900 CHECK(AreConsecutive(d31, d0)); |
| 13901 CHECK(AreConsecutive(d1, d2, d3)); |
| 13902 CHECK(AreConsecutive(d4, d5, d6, d7)); |
| 13903 CHECK(AreConsecutive(q8, NoVReg)); |
| 13904 CHECK(AreConsecutive(q9, q10)); |
| 13905 CHECK(AreConsecutive(q11, q12, q13)); |
| 13906 CHECK(AreConsecutive(q14, q15, q16, q17)); |
| 13907 CHECK(AreConsecutive(v18, NoVReg)); |
| 13908 CHECK(AreConsecutive(v19, v20)); |
| 13909 CHECK(AreConsecutive(v21, v22, v23)); |
| 13910 CHECK(AreConsecutive(v24, v25, v26, v27)); |
| 13911 CHECK(AreConsecutive(b29, h30)); |
| 13912 CHECK(AreConsecutive(s31, d0, q1)); |
| 13913 CHECK(AreConsecutive(v2, b3, h4, s5)); |
| 13914 |
| 13915 CHECK(AreConsecutive(b26, b27, NoVReg, NoVReg)); |
| 13916 CHECK(AreConsecutive(h28, NoVReg, NoVReg, NoVReg)); |
| 13917 |
| 13918 CHECK(!AreConsecutive(b0, b2)); |
| 13919 CHECK(!AreConsecutive(h1, h0)); |
| 13920 CHECK(!AreConsecutive(s31, s1)); |
| 13921 CHECK(!AreConsecutive(d12, d12)); |
| 13922 CHECK(!AreConsecutive(q31, q1)); |
| 13923 |
| 13924 CHECK(!AreConsecutive(b5, b4, b3)); |
| 13925 CHECK(!AreConsecutive(h15, h16, h15, h14)); |
| 13926 CHECK(!AreConsecutive(s25, s24, s23, s22)); |
| 13927 CHECK(!AreConsecutive(d5, d6, d7, d6)); |
| 13928 CHECK(!AreConsecutive(q15, q16, q17, q6)); |
| 13929 |
| 13930 CHECK(!AreConsecutive(b0, b1, b3)); |
| 13931 CHECK(!AreConsecutive(h4, h5, h6, h6)); |
| 13932 CHECK(!AreConsecutive(d15, d16, d18, NoVReg)); |
| 13933 CHECK(!AreConsecutive(s28, s30, NoVReg, NoVReg)); |
| 13934 } |
10022 | 13935 |
10023 TEST(cpureglist_utils_x) { | 13936 TEST(cpureglist_utils_x) { |
10024 // This test doesn't generate any code, but it verifies the behaviour of | 13937 // This test doesn't generate any code, but it verifies the behaviour of |
10025 // the CPURegList utility methods. | 13938 // the CPURegList utility methods. |
10026 | 13939 |
10027 // Test a list of X registers. | 13940 // Test a list of X registers. |
10028 CPURegList test(x0, x1, x2, x3); | 13941 CPURegList test(x0, x1, x2, x3); |
10029 | 13942 |
10030 CHECK(test.IncludesAliasOf(x0)); | 13943 CHECK(test.IncludesAliasOf(x0)); |
10031 CHECK(test.IncludesAliasOf(x1)); | 13944 CHECK(test.IncludesAliasOf(x1)); |
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10238 | 14151 |
10239 TEST(cpureglist_utils_empty) { | 14152 TEST(cpureglist_utils_empty) { |
10240 // This test doesn't generate any code, but it verifies the behaviour of | 14153 // This test doesn't generate any code, but it verifies the behaviour of |
10241 // the CPURegList utility methods. | 14154 // the CPURegList utility methods. |
10242 | 14155 |
10243 // Test an empty list. | 14156 // Test an empty list. |
10244 // Empty lists can have type and size properties. Check that we can create | 14157 // Empty lists can have type and size properties. Check that we can create |
10245 // them, and that they are empty. | 14158 // them, and that they are empty. |
10246 CPURegList reg32(CPURegister::kRegister, kWRegSizeInBits, 0); | 14159 CPURegList reg32(CPURegister::kRegister, kWRegSizeInBits, 0); |
10247 CPURegList reg64(CPURegister::kRegister, kXRegSizeInBits, 0); | 14160 CPURegList reg64(CPURegister::kRegister, kXRegSizeInBits, 0); |
10248 CPURegList fpreg32(CPURegister::kFPRegister, kSRegSizeInBits, 0); | 14161 CPURegList fpreg32(CPURegister::kVRegister, kSRegSizeInBits, 0); |
10249 CPURegList fpreg64(CPURegister::kFPRegister, kDRegSizeInBits, 0); | 14162 CPURegList fpreg64(CPURegister::kVRegister, kDRegSizeInBits, 0); |
10250 | 14163 |
10251 CHECK(reg32.IsEmpty()); | 14164 CHECK(reg32.IsEmpty()); |
10252 CHECK(reg64.IsEmpty()); | 14165 CHECK(reg64.IsEmpty()); |
10253 CHECK(fpreg32.IsEmpty()); | 14166 CHECK(fpreg32.IsEmpty()); |
10254 CHECK(fpreg64.IsEmpty()); | 14167 CHECK(fpreg64.IsEmpty()); |
10255 | 14168 |
10256 CHECK(reg32.PopLowestIndex().IsNone()); | 14169 CHECK(reg32.PopLowestIndex().IsNone()); |
10257 CHECK(reg64.PopLowestIndex().IsNone()); | 14170 CHECK(reg64.PopLowestIndex().IsNone()); |
10258 CHECK(fpreg32.PopLowestIndex().IsNone()); | 14171 CHECK(fpreg32.PopLowestIndex().IsNone()); |
10259 CHECK(fpreg64.PopLowestIndex().IsNone()); | 14172 CHECK(fpreg64.PopLowestIndex().IsNone()); |
(...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10577 | 14490 |
10578 RUN(); | 14491 RUN(); |
10579 | 14492 |
10580 TEARDOWN(); | 14493 TEARDOWN(); |
10581 } | 14494 } |
10582 | 14495 |
10583 | 14496 |
10584 TEST(process_nan_double) { | 14497 TEST(process_nan_double) { |
10585 INIT_V8(); | 14498 INIT_V8(); |
10586 // Make sure that NaN propagation works correctly. | 14499 // Make sure that NaN propagation works correctly. |
10587 double sn = rawbits_to_double(0x7ff5555511111111); | 14500 double sn = bit_cast<double>(0x7ff5555511111111); |
10588 double qn = rawbits_to_double(0x7ffaaaaa11111111); | 14501 double qn = bit_cast<double>(0x7ffaaaaa11111111); |
10589 CHECK(IsSignallingNaN(sn)); | 14502 CHECK(IsSignallingNaN(sn)); |
10590 CHECK(IsQuietNaN(qn)); | 14503 CHECK(IsQuietNaN(qn)); |
10591 | 14504 |
10592 // The input NaNs after passing through ProcessNaN. | 14505 // The input NaNs after passing through ProcessNaN. |
10593 double sn_proc = rawbits_to_double(0x7ffd555511111111); | 14506 double sn_proc = bit_cast<double>(0x7ffd555511111111); |
10594 double qn_proc = qn; | 14507 double qn_proc = qn; |
10595 CHECK(IsQuietNaN(sn_proc)); | 14508 CHECK(IsQuietNaN(sn_proc)); |
10596 CHECK(IsQuietNaN(qn_proc)); | 14509 CHECK(IsQuietNaN(qn_proc)); |
10597 | 14510 |
10598 SETUP(); | 14511 SETUP(); |
10599 START(); | 14512 START(); |
10600 | 14513 |
10601 // Execute a number of instructions which all use ProcessNaN, and check that | 14514 // Execute a number of instructions which all use ProcessNaN, and check that |
10602 // they all handle the NaN correctly. | 14515 // they all handle the NaN correctly. |
10603 __ Fmov(d0, sn); | 14516 __ Fmov(d0, sn); |
(...skipping 19 matching lines...) Expand all Loading... |
10623 __ Fsqrt(d14, d10); | 14536 __ Fsqrt(d14, d10); |
10624 __ Frinta(d15, d10); | 14537 __ Frinta(d15, d10); |
10625 __ Frintn(d16, d10); | 14538 __ Frintn(d16, d10); |
10626 __ Frintz(d17, d10); | 14539 __ Frintz(d17, d10); |
10627 | 14540 |
10628 // The behaviour of fcvt is checked in TEST(fcvt_sd). | 14541 // The behaviour of fcvt is checked in TEST(fcvt_sd). |
10629 | 14542 |
10630 END(); | 14543 END(); |
10631 RUN(); | 14544 RUN(); |
10632 | 14545 |
10633 uint64_t qn_raw = double_to_rawbits(qn); | 14546 uint64_t qn_raw = bit_cast<uint64_t>(qn); |
10634 uint64_t sn_raw = double_to_rawbits(sn); | 14547 uint64_t sn_raw = bit_cast<uint64_t>(sn); |
10635 | 14548 |
10636 // - Signalling NaN | 14549 // - Signalling NaN |
10637 CHECK_EQUAL_FP64(sn, d1); | 14550 CHECK_EQUAL_FP64(sn, d1); |
10638 CHECK_EQUAL_FP64(rawbits_to_double(sn_raw & ~kDSignMask), d2); | 14551 CHECK_EQUAL_FP64(bit_cast<double>(sn_raw & ~kDSignMask), d2); |
10639 CHECK_EQUAL_FP64(rawbits_to_double(sn_raw ^ kDSignMask), d3); | 14552 CHECK_EQUAL_FP64(bit_cast<double>(sn_raw ^ kDSignMask), d3); |
10640 // - Quiet NaN | 14553 // - Quiet NaN |
10641 CHECK_EQUAL_FP64(qn, d11); | 14554 CHECK_EQUAL_FP64(qn, d11); |
10642 CHECK_EQUAL_FP64(rawbits_to_double(qn_raw & ~kDSignMask), d12); | 14555 CHECK_EQUAL_FP64(bit_cast<double>(qn_raw & ~kDSignMask), d12); |
10643 CHECK_EQUAL_FP64(rawbits_to_double(qn_raw ^ kDSignMask), d13); | 14556 CHECK_EQUAL_FP64(bit_cast<double>(qn_raw ^ kDSignMask), d13); |
10644 | 14557 |
10645 // - Signalling NaN | 14558 // - Signalling NaN |
10646 CHECK_EQUAL_FP64(sn_proc, d4); | 14559 CHECK_EQUAL_FP64(sn_proc, d4); |
10647 CHECK_EQUAL_FP64(sn_proc, d5); | 14560 CHECK_EQUAL_FP64(sn_proc, d5); |
10648 CHECK_EQUAL_FP64(sn_proc, d6); | 14561 CHECK_EQUAL_FP64(sn_proc, d6); |
10649 CHECK_EQUAL_FP64(sn_proc, d7); | 14562 CHECK_EQUAL_FP64(sn_proc, d7); |
10650 // - Quiet NaN | 14563 // - Quiet NaN |
10651 CHECK_EQUAL_FP64(qn_proc, d14); | 14564 CHECK_EQUAL_FP64(qn_proc, d14); |
10652 CHECK_EQUAL_FP64(qn_proc, d15); | 14565 CHECK_EQUAL_FP64(qn_proc, d15); |
10653 CHECK_EQUAL_FP64(qn_proc, d16); | 14566 CHECK_EQUAL_FP64(qn_proc, d16); |
10654 CHECK_EQUAL_FP64(qn_proc, d17); | 14567 CHECK_EQUAL_FP64(qn_proc, d17); |
10655 | 14568 |
10656 TEARDOWN(); | 14569 TEARDOWN(); |
10657 } | 14570 } |
10658 | 14571 |
10659 | 14572 |
10660 TEST(process_nan_float) { | 14573 TEST(process_nan_float) { |
10661 INIT_V8(); | 14574 INIT_V8(); |
10662 // Make sure that NaN propagation works correctly. | 14575 // Make sure that NaN propagation works correctly. |
10663 float sn = rawbits_to_float(0x7f951111); | 14576 float sn = bit_cast<float>(0x7f951111); |
10664 float qn = rawbits_to_float(0x7fea1111); | 14577 float qn = bit_cast<float>(0x7fea1111); |
10665 CHECK(IsSignallingNaN(sn)); | 14578 CHECK(IsSignallingNaN(sn)); |
10666 CHECK(IsQuietNaN(qn)); | 14579 CHECK(IsQuietNaN(qn)); |
10667 | 14580 |
10668 // The input NaNs after passing through ProcessNaN. | 14581 // The input NaNs after passing through ProcessNaN. |
10669 float sn_proc = rawbits_to_float(0x7fd51111); | 14582 float sn_proc = bit_cast<float>(0x7fd51111); |
10670 float qn_proc = qn; | 14583 float qn_proc = qn; |
10671 CHECK(IsQuietNaN(sn_proc)); | 14584 CHECK(IsQuietNaN(sn_proc)); |
10672 CHECK(IsQuietNaN(qn_proc)); | 14585 CHECK(IsQuietNaN(qn_proc)); |
10673 | 14586 |
10674 SETUP(); | 14587 SETUP(); |
10675 START(); | 14588 START(); |
10676 | 14589 |
10677 // Execute a number of instructions which all use ProcessNaN, and check that | 14590 // Execute a number of instructions which all use ProcessNaN, and check that |
10678 // they all handle the NaN correctly. | 14591 // they all handle the NaN correctly. |
10679 __ Fmov(s0, sn); | 14592 __ Fmov(s0, sn); |
(...skipping 19 matching lines...) Expand all Loading... |
10699 __ Fsqrt(s14, s10); | 14612 __ Fsqrt(s14, s10); |
10700 __ Frinta(s15, s10); | 14613 __ Frinta(s15, s10); |
10701 __ Frintn(s16, s10); | 14614 __ Frintn(s16, s10); |
10702 __ Frintz(s17, s10); | 14615 __ Frintz(s17, s10); |
10703 | 14616 |
10704 // The behaviour of fcvt is checked in TEST(fcvt_sd). | 14617 // The behaviour of fcvt is checked in TEST(fcvt_sd). |
10705 | 14618 |
10706 END(); | 14619 END(); |
10707 RUN(); | 14620 RUN(); |
10708 | 14621 |
10709 uint32_t qn_raw = float_to_rawbits(qn); | 14622 uint32_t qn_raw = bit_cast<uint32_t>(qn); |
10710 uint32_t sn_raw = float_to_rawbits(sn); | 14623 uint32_t sn_raw = bit_cast<uint32_t>(sn); |
| 14624 uint32_t sign_mask = static_cast<uint32_t>(kSSignMask); |
10711 | 14625 |
10712 // - Signalling NaN | 14626 // - Signalling NaN |
10713 CHECK_EQUAL_FP32(sn, s1); | 14627 CHECK_EQUAL_FP32(sn, s1); |
10714 CHECK_EQUAL_FP32(rawbits_to_float(sn_raw & ~kSSignMask), s2); | 14628 CHECK_EQUAL_FP32(bit_cast<float>(sn_raw & ~sign_mask), s2); |
10715 CHECK_EQUAL_FP32(rawbits_to_float(sn_raw ^ kSSignMask), s3); | 14629 CHECK_EQUAL_FP32(bit_cast<float>(sn_raw ^ sign_mask), s3); |
10716 // - Quiet NaN | 14630 // - Quiet NaN |
10717 CHECK_EQUAL_FP32(qn, s11); | 14631 CHECK_EQUAL_FP32(qn, s11); |
10718 CHECK_EQUAL_FP32(rawbits_to_float(qn_raw & ~kSSignMask), s12); | 14632 CHECK_EQUAL_FP32(bit_cast<float>(qn_raw & ~sign_mask), s12); |
10719 CHECK_EQUAL_FP32(rawbits_to_float(qn_raw ^ kSSignMask), s13); | 14633 CHECK_EQUAL_FP32(bit_cast<float>(qn_raw ^ sign_mask), s13); |
10720 | 14634 |
10721 // - Signalling NaN | 14635 // - Signalling NaN |
10722 CHECK_EQUAL_FP32(sn_proc, s4); | 14636 CHECK_EQUAL_FP32(sn_proc, s4); |
10723 CHECK_EQUAL_FP32(sn_proc, s5); | 14637 CHECK_EQUAL_FP32(sn_proc, s5); |
10724 CHECK_EQUAL_FP32(sn_proc, s6); | 14638 CHECK_EQUAL_FP32(sn_proc, s6); |
10725 CHECK_EQUAL_FP32(sn_proc, s7); | 14639 CHECK_EQUAL_FP32(sn_proc, s7); |
10726 // - Quiet NaN | 14640 // - Quiet NaN |
10727 CHECK_EQUAL_FP32(qn_proc, s14); | 14641 CHECK_EQUAL_FP32(qn_proc, s14); |
10728 CHECK_EQUAL_FP32(qn_proc, s15); | 14642 CHECK_EQUAL_FP32(qn_proc, s15); |
10729 CHECK_EQUAL_FP32(qn_proc, s16); | 14643 CHECK_EQUAL_FP32(qn_proc, s16); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10762 CHECK_EQUAL_FP64(expected, d6); | 14676 CHECK_EQUAL_FP64(expected, d6); |
10763 CHECK_EQUAL_FP64(expected, d7); | 14677 CHECK_EQUAL_FP64(expected, d7); |
10764 | 14678 |
10765 TEARDOWN(); | 14679 TEARDOWN(); |
10766 } | 14680 } |
10767 | 14681 |
10768 | 14682 |
10769 TEST(process_nans_double) { | 14683 TEST(process_nans_double) { |
10770 INIT_V8(); | 14684 INIT_V8(); |
10771 // Make sure that NaN propagation works correctly. | 14685 // Make sure that NaN propagation works correctly. |
10772 double sn = rawbits_to_double(0x7ff5555511111111); | 14686 double sn = bit_cast<double>(0x7ff5555511111111); |
10773 double sm = rawbits_to_double(0x7ff5555522222222); | 14687 double sm = bit_cast<double>(0x7ff5555522222222); |
10774 double qn = rawbits_to_double(0x7ffaaaaa11111111); | 14688 double qn = bit_cast<double>(0x7ffaaaaa11111111); |
10775 double qm = rawbits_to_double(0x7ffaaaaa22222222); | 14689 double qm = bit_cast<double>(0x7ffaaaaa22222222); |
10776 CHECK(IsSignallingNaN(sn)); | 14690 CHECK(IsSignallingNaN(sn)); |
10777 CHECK(IsSignallingNaN(sm)); | 14691 CHECK(IsSignallingNaN(sm)); |
10778 CHECK(IsQuietNaN(qn)); | 14692 CHECK(IsQuietNaN(qn)); |
10779 CHECK(IsQuietNaN(qm)); | 14693 CHECK(IsQuietNaN(qm)); |
10780 | 14694 |
10781 // The input NaNs after passing through ProcessNaN. | 14695 // The input NaNs after passing through ProcessNaN. |
10782 double sn_proc = rawbits_to_double(0x7ffd555511111111); | 14696 double sn_proc = bit_cast<double>(0x7ffd555511111111); |
10783 double sm_proc = rawbits_to_double(0x7ffd555522222222); | 14697 double sm_proc = bit_cast<double>(0x7ffd555522222222); |
10784 double qn_proc = qn; | 14698 double qn_proc = qn; |
10785 double qm_proc = qm; | 14699 double qm_proc = qm; |
10786 CHECK(IsQuietNaN(sn_proc)); | 14700 CHECK(IsQuietNaN(sn_proc)); |
10787 CHECK(IsQuietNaN(sm_proc)); | 14701 CHECK(IsQuietNaN(sm_proc)); |
10788 CHECK(IsQuietNaN(qn_proc)); | 14702 CHECK(IsQuietNaN(qn_proc)); |
10789 CHECK(IsQuietNaN(qm_proc)); | 14703 CHECK(IsQuietNaN(qm_proc)); |
10790 | 14704 |
10791 // Quiet NaNs are propagated. | 14705 // Quiet NaNs are propagated. |
10792 ProcessNaNsHelper(qn, 0, qn_proc); | 14706 ProcessNaNsHelper(qn, 0, qn_proc); |
10793 ProcessNaNsHelper(0, qm, qm_proc); | 14707 ProcessNaNsHelper(0, qm, qm_proc); |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10834 CHECK_EQUAL_FP32(expected, s6); | 14748 CHECK_EQUAL_FP32(expected, s6); |
10835 CHECK_EQUAL_FP32(expected, s7); | 14749 CHECK_EQUAL_FP32(expected, s7); |
10836 | 14750 |
10837 TEARDOWN(); | 14751 TEARDOWN(); |
10838 } | 14752 } |
10839 | 14753 |
10840 | 14754 |
10841 TEST(process_nans_float) { | 14755 TEST(process_nans_float) { |
10842 INIT_V8(); | 14756 INIT_V8(); |
10843 // Make sure that NaN propagation works correctly. | 14757 // Make sure that NaN propagation works correctly. |
10844 float sn = rawbits_to_float(0x7f951111); | 14758 float sn = bit_cast<float>(0x7f951111); |
10845 float sm = rawbits_to_float(0x7f952222); | 14759 float sm = bit_cast<float>(0x7f952222); |
10846 float qn = rawbits_to_float(0x7fea1111); | 14760 float qn = bit_cast<float>(0x7fea1111); |
10847 float qm = rawbits_to_float(0x7fea2222); | 14761 float qm = bit_cast<float>(0x7fea2222); |
10848 CHECK(IsSignallingNaN(sn)); | 14762 CHECK(IsSignallingNaN(sn)); |
10849 CHECK(IsSignallingNaN(sm)); | 14763 CHECK(IsSignallingNaN(sm)); |
10850 CHECK(IsQuietNaN(qn)); | 14764 CHECK(IsQuietNaN(qn)); |
10851 CHECK(IsQuietNaN(qm)); | 14765 CHECK(IsQuietNaN(qm)); |
10852 | 14766 |
10853 // The input NaNs after passing through ProcessNaN. | 14767 // The input NaNs after passing through ProcessNaN. |
10854 float sn_proc = rawbits_to_float(0x7fd51111); | 14768 float sn_proc = bit_cast<float>(0x7fd51111); |
10855 float sm_proc = rawbits_to_float(0x7fd52222); | 14769 float sm_proc = bit_cast<float>(0x7fd52222); |
10856 float qn_proc = qn; | 14770 float qn_proc = qn; |
10857 float qm_proc = qm; | 14771 float qm_proc = qm; |
10858 CHECK(IsQuietNaN(sn_proc)); | 14772 CHECK(IsQuietNaN(sn_proc)); |
10859 CHECK(IsQuietNaN(sm_proc)); | 14773 CHECK(IsQuietNaN(sm_proc)); |
10860 CHECK(IsQuietNaN(qn_proc)); | 14774 CHECK(IsQuietNaN(qn_proc)); |
10861 CHECK(IsQuietNaN(qm_proc)); | 14775 CHECK(IsQuietNaN(qm_proc)); |
10862 | 14776 |
10863 // Quiet NaNs are propagated. | 14777 // Quiet NaNs are propagated. |
10864 ProcessNaNsHelper(qn, 0, qn_proc); | 14778 ProcessNaNsHelper(qn, 0, qn_proc); |
10865 ProcessNaNsHelper(0, qm, qm_proc); | 14779 ProcessNaNsHelper(0, qm, qm_proc); |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10927 __ Fnmadd(s26, s0, s1, s2); | 14841 __ Fnmadd(s26, s0, s1, s2); |
10928 __ Fnmsub(s27, s0, s1, s2); | 14842 __ Fnmsub(s27, s0, s1, s2); |
10929 | 14843 |
10930 // Restore FPCR. | 14844 // Restore FPCR. |
10931 __ Msr(FPCR, x0); | 14845 __ Msr(FPCR, x0); |
10932 | 14846 |
10933 END(); | 14847 END(); |
10934 RUN(); | 14848 RUN(); |
10935 | 14849 |
10936 if (test_1op) { | 14850 if (test_1op) { |
10937 uint32_t n_raw = float_to_rawbits(n); | 14851 uint32_t n_raw = bit_cast<uint32_t>(n); |
| 14852 uint32_t sign_mask = static_cast<uint32_t>(kSSignMask); |
10938 CHECK_EQUAL_FP32(n, s10); | 14853 CHECK_EQUAL_FP32(n, s10); |
10939 CHECK_EQUAL_FP32(rawbits_to_float(n_raw & ~kSSignMask), s11); | 14854 CHECK_EQUAL_FP32(bit_cast<float>(n_raw & ~sign_mask), s11); |
10940 CHECK_EQUAL_FP32(rawbits_to_float(n_raw ^ kSSignMask), s12); | 14855 CHECK_EQUAL_FP32(bit_cast<float>(n_raw ^ sign_mask), s12); |
10941 CHECK_EQUAL_FP32(kFP32DefaultNaN, s13); | 14856 CHECK_EQUAL_FP32(kFP32DefaultNaN, s13); |
10942 CHECK_EQUAL_FP32(kFP32DefaultNaN, s14); | 14857 CHECK_EQUAL_FP32(kFP32DefaultNaN, s14); |
10943 CHECK_EQUAL_FP32(kFP32DefaultNaN, s15); | 14858 CHECK_EQUAL_FP32(kFP32DefaultNaN, s15); |
10944 CHECK_EQUAL_FP32(kFP32DefaultNaN, s16); | 14859 CHECK_EQUAL_FP32(kFP32DefaultNaN, s16); |
10945 CHECK_EQUAL_FP64(kFP64DefaultNaN, d17); | 14860 CHECK_EQUAL_FP64(kFP64DefaultNaN, d17); |
10946 } | 14861 } |
10947 | 14862 |
10948 if (test_2op) { | 14863 if (test_2op) { |
10949 CHECK_EQUAL_FP32(kFP32DefaultNaN, s18); | 14864 CHECK_EQUAL_FP32(kFP32DefaultNaN, s18); |
10950 CHECK_EQUAL_FP32(kFP32DefaultNaN, s19); | 14865 CHECK_EQUAL_FP32(kFP32DefaultNaN, s19); |
10951 CHECK_EQUAL_FP32(kFP32DefaultNaN, s20); | 14866 CHECK_EQUAL_FP32(kFP32DefaultNaN, s20); |
10952 CHECK_EQUAL_FP32(kFP32DefaultNaN, s21); | 14867 CHECK_EQUAL_FP32(kFP32DefaultNaN, s21); |
10953 CHECK_EQUAL_FP32(kFP32DefaultNaN, s22); | 14868 CHECK_EQUAL_FP32(kFP32DefaultNaN, s22); |
10954 CHECK_EQUAL_FP32(kFP32DefaultNaN, s23); | 14869 CHECK_EQUAL_FP32(kFP32DefaultNaN, s23); |
10955 } | 14870 } |
10956 | 14871 |
10957 CHECK_EQUAL_FP32(kFP32DefaultNaN, s24); | 14872 CHECK_EQUAL_FP32(kFP32DefaultNaN, s24); |
10958 CHECK_EQUAL_FP32(kFP32DefaultNaN, s25); | 14873 CHECK_EQUAL_FP32(kFP32DefaultNaN, s25); |
10959 CHECK_EQUAL_FP32(kFP32DefaultNaN, s26); | 14874 CHECK_EQUAL_FP32(kFP32DefaultNaN, s26); |
10960 CHECK_EQUAL_FP32(kFP32DefaultNaN, s27); | 14875 CHECK_EQUAL_FP32(kFP32DefaultNaN, s27); |
10961 | 14876 |
10962 TEARDOWN(); | 14877 TEARDOWN(); |
10963 } | 14878 } |
10964 | 14879 |
10965 | 14880 |
10966 TEST(default_nan_float) { | 14881 TEST(default_nan_float) { |
10967 INIT_V8(); | 14882 INIT_V8(); |
10968 float sn = rawbits_to_float(0x7f951111); | 14883 float sn = bit_cast<float>(0x7f951111); |
10969 float sm = rawbits_to_float(0x7f952222); | 14884 float sm = bit_cast<float>(0x7f952222); |
10970 float sa = rawbits_to_float(0x7f95aaaa); | 14885 float sa = bit_cast<float>(0x7f95aaaa); |
10971 float qn = rawbits_to_float(0x7fea1111); | 14886 float qn = bit_cast<float>(0x7fea1111); |
10972 float qm = rawbits_to_float(0x7fea2222); | 14887 float qm = bit_cast<float>(0x7fea2222); |
10973 float qa = rawbits_to_float(0x7feaaaaa); | 14888 float qa = bit_cast<float>(0x7feaaaaa); |
10974 CHECK(IsSignallingNaN(sn)); | 14889 CHECK(IsSignallingNaN(sn)); |
10975 CHECK(IsSignallingNaN(sm)); | 14890 CHECK(IsSignallingNaN(sm)); |
10976 CHECK(IsSignallingNaN(sa)); | 14891 CHECK(IsSignallingNaN(sa)); |
10977 CHECK(IsQuietNaN(qn)); | 14892 CHECK(IsQuietNaN(qn)); |
10978 CHECK(IsQuietNaN(qm)); | 14893 CHECK(IsQuietNaN(qm)); |
10979 CHECK(IsQuietNaN(qa)); | 14894 CHECK(IsQuietNaN(qa)); |
10980 | 14895 |
10981 // - Signalling NaNs | 14896 // - Signalling NaNs |
10982 DefaultNaNHelper(sn, 0.0f, 0.0f); | 14897 DefaultNaNHelper(sn, 0.0f, 0.0f); |
10983 DefaultNaNHelper(0.0f, sm, 0.0f); | 14898 DefaultNaNHelper(0.0f, sm, 0.0f); |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11055 __ Fnmadd(d26, d0, d1, d2); | 14970 __ Fnmadd(d26, d0, d1, d2); |
11056 __ Fnmsub(d27, d0, d1, d2); | 14971 __ Fnmsub(d27, d0, d1, d2); |
11057 | 14972 |
11058 // Restore FPCR. | 14973 // Restore FPCR. |
11059 __ Msr(FPCR, x0); | 14974 __ Msr(FPCR, x0); |
11060 | 14975 |
11061 END(); | 14976 END(); |
11062 RUN(); | 14977 RUN(); |
11063 | 14978 |
11064 if (test_1op) { | 14979 if (test_1op) { |
11065 uint64_t n_raw = double_to_rawbits(n); | 14980 uint64_t n_raw = bit_cast<uint64_t>(n); |
11066 CHECK_EQUAL_FP64(n, d10); | 14981 CHECK_EQUAL_FP64(n, d10); |
11067 CHECK_EQUAL_FP64(rawbits_to_double(n_raw & ~kDSignMask), d11); | 14982 CHECK_EQUAL_FP64(bit_cast<double>(n_raw & ~kDSignMask), d11); |
11068 CHECK_EQUAL_FP64(rawbits_to_double(n_raw ^ kDSignMask), d12); | 14983 CHECK_EQUAL_FP64(bit_cast<double>(n_raw ^ kDSignMask), d12); |
11069 CHECK_EQUAL_FP64(kFP64DefaultNaN, d13); | 14984 CHECK_EQUAL_FP64(kFP64DefaultNaN, d13); |
11070 CHECK_EQUAL_FP64(kFP64DefaultNaN, d14); | 14985 CHECK_EQUAL_FP64(kFP64DefaultNaN, d14); |
11071 CHECK_EQUAL_FP64(kFP64DefaultNaN, d15); | 14986 CHECK_EQUAL_FP64(kFP64DefaultNaN, d15); |
11072 CHECK_EQUAL_FP64(kFP64DefaultNaN, d16); | 14987 CHECK_EQUAL_FP64(kFP64DefaultNaN, d16); |
11073 CHECK_EQUAL_FP32(kFP32DefaultNaN, s17); | 14988 CHECK_EQUAL_FP32(kFP32DefaultNaN, s17); |
11074 } | 14989 } |
11075 | 14990 |
11076 if (test_2op) { | 14991 if (test_2op) { |
11077 CHECK_EQUAL_FP64(kFP64DefaultNaN, d18); | 14992 CHECK_EQUAL_FP64(kFP64DefaultNaN, d18); |
11078 CHECK_EQUAL_FP64(kFP64DefaultNaN, d19); | 14993 CHECK_EQUAL_FP64(kFP64DefaultNaN, d19); |
11079 CHECK_EQUAL_FP64(kFP64DefaultNaN, d20); | 14994 CHECK_EQUAL_FP64(kFP64DefaultNaN, d20); |
11080 CHECK_EQUAL_FP64(kFP64DefaultNaN, d21); | 14995 CHECK_EQUAL_FP64(kFP64DefaultNaN, d21); |
11081 CHECK_EQUAL_FP64(kFP64DefaultNaN, d22); | 14996 CHECK_EQUAL_FP64(kFP64DefaultNaN, d22); |
11082 CHECK_EQUAL_FP64(kFP64DefaultNaN, d23); | 14997 CHECK_EQUAL_FP64(kFP64DefaultNaN, d23); |
11083 } | 14998 } |
11084 | 14999 |
11085 CHECK_EQUAL_FP64(kFP64DefaultNaN, d24); | 15000 CHECK_EQUAL_FP64(kFP64DefaultNaN, d24); |
11086 CHECK_EQUAL_FP64(kFP64DefaultNaN, d25); | 15001 CHECK_EQUAL_FP64(kFP64DefaultNaN, d25); |
11087 CHECK_EQUAL_FP64(kFP64DefaultNaN, d26); | 15002 CHECK_EQUAL_FP64(kFP64DefaultNaN, d26); |
11088 CHECK_EQUAL_FP64(kFP64DefaultNaN, d27); | 15003 CHECK_EQUAL_FP64(kFP64DefaultNaN, d27); |
11089 | 15004 |
11090 TEARDOWN(); | 15005 TEARDOWN(); |
11091 } | 15006 } |
11092 | 15007 |
11093 | 15008 |
11094 TEST(default_nan_double) { | 15009 TEST(default_nan_double) { |
11095 INIT_V8(); | 15010 INIT_V8(); |
11096 double sn = rawbits_to_double(0x7ff5555511111111); | 15011 double sn = bit_cast<double>(0x7ff5555511111111); |
11097 double sm = rawbits_to_double(0x7ff5555522222222); | 15012 double sm = bit_cast<double>(0x7ff5555522222222); |
11098 double sa = rawbits_to_double(0x7ff55555aaaaaaaa); | 15013 double sa = bit_cast<double>(0x7ff55555aaaaaaaa); |
11099 double qn = rawbits_to_double(0x7ffaaaaa11111111); | 15014 double qn = bit_cast<double>(0x7ffaaaaa11111111); |
11100 double qm = rawbits_to_double(0x7ffaaaaa22222222); | 15015 double qm = bit_cast<double>(0x7ffaaaaa22222222); |
11101 double qa = rawbits_to_double(0x7ffaaaaaaaaaaaaa); | 15016 double qa = bit_cast<double>(0x7ffaaaaaaaaaaaaa); |
11102 CHECK(IsSignallingNaN(sn)); | 15017 CHECK(IsSignallingNaN(sn)); |
11103 CHECK(IsSignallingNaN(sm)); | 15018 CHECK(IsSignallingNaN(sm)); |
11104 CHECK(IsSignallingNaN(sa)); | 15019 CHECK(IsSignallingNaN(sa)); |
11105 CHECK(IsQuietNaN(qn)); | 15020 CHECK(IsQuietNaN(qn)); |
11106 CHECK(IsQuietNaN(qm)); | 15021 CHECK(IsQuietNaN(qm)); |
11107 CHECK(IsQuietNaN(qa)); | 15022 CHECK(IsQuietNaN(qa)); |
11108 | 15023 |
11109 // - Signalling NaNs | 15024 // - Signalling NaNs |
11110 DefaultNaNHelper(sn, 0.0, 0.0); | 15025 DefaultNaNHelper(sn, 0.0, 0.0); |
11111 DefaultNaNHelper(0.0, sm, 0.0); | 15026 DefaultNaNHelper(0.0, sm, 0.0); |
(...skipping 406 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11518 __ Mov(x0, 1); | 15433 __ Mov(x0, 1); |
11519 | 15434 |
11520 END(); | 15435 END(); |
11521 | 15436 |
11522 RUN(); | 15437 RUN(); |
11523 | 15438 |
11524 CHECK_EQUAL_64(0x1, x0); | 15439 CHECK_EQUAL_64(0x1, x0); |
11525 | 15440 |
11526 TEARDOWN(); | 15441 TEARDOWN(); |
11527 } | 15442 } |
OLD | NEW |