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