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