Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(52)

Side by Side Diff: test/cctest/test-assembler-arm64.cc

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

Powered by Google App Engine
This is Rietveld 408576698