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

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

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

Powered by Google App Engine
This is Rietveld 408576698