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

Unified Diff: test/cctest/test-assembler-arm64.cc

Issue 2812573003: Reland "ARM64: Add NEON support" (Closed)
Patch Set: Add trace directory to gitignore Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « test/cctest/cctest.gyp ('k') | test/cctest/test-disasm-arm64.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: test/cctest/test-assembler-arm64.cc
diff --git a/test/cctest/test-assembler-arm64.cc b/test/cctest/test-assembler-arm64.cc
index 41b1d7cbbb758ca57f642a647be843ff9db13e41..a9f3702c0949e10d713dce8a4c3ade25a920aace 100644
--- a/test/cctest/test-assembler-arm64.cc
+++ b/test/cctest/test-assembler-arm64.cc
@@ -236,6 +236,11 @@ static void InitializeVM() {
#define CHECK_EQUAL_FP64(expected, result) \
CHECK(EqualFP64(expected, &core, result))
+// Expected values for 128-bit comparisons are passed as two 64-bit values,
+// where expected_h (high) is <127:64> and expected_l (low) is <63:0>.
+#define CHECK_EQUAL_128(expected_h, expected_l, result) \
+ CHECK(Equal128(expected_h, expected_l, &core, result))
+
#ifdef DEBUG
#define CHECK_LITERAL_POOL_SIZE(expected) \
CHECK((expected) == (__ LiteralPoolSize()))
@@ -2513,292 +2518,3667 @@ TEST(ldr_str_wide) {
TEARDOWN();
}
-
-TEST(ldr_str_preindex) {
+TEST(ldr_str_preindex) {
+ INIT_V8();
+ SETUP();
+
+ uint64_t src[2] = {0xfedcba9876543210UL, 0x0123456789abcdefUL};
+ uint64_t dst[6] = {0, 0, 0, 0, 0, 0};
+ uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
+ uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
+
+ START();
+ __ Mov(x17, src_base);
+ __ Mov(x18, dst_base);
+ __ Mov(x19, src_base);
+ __ Mov(x20, dst_base);
+ __ Mov(x21, src_base + 16);
+ __ Mov(x22, dst_base + 40);
+ __ Mov(x23, src_base);
+ __ Mov(x24, dst_base);
+ __ Mov(x25, src_base);
+ __ Mov(x26, dst_base);
+ __ Ldr(w0, MemOperand(x17, 4, PreIndex));
+ __ Str(w0, MemOperand(x18, 12, PreIndex));
+ __ Ldr(x1, MemOperand(x19, 8, PreIndex));
+ __ Str(x1, MemOperand(x20, 16, PreIndex));
+ __ Ldr(w2, MemOperand(x21, -4, PreIndex));
+ __ Str(w2, MemOperand(x22, -4, PreIndex));
+ __ Ldrb(w3, MemOperand(x23, 1, PreIndex));
+ __ Strb(w3, MemOperand(x24, 25, PreIndex));
+ __ Ldrh(w4, MemOperand(x25, 3, PreIndex));
+ __ Strh(w4, MemOperand(x26, 41, PreIndex));
+ END();
+
+ RUN();
+
+ CHECK_EQUAL_64(0xfedcba98, x0);
+ CHECK_EQUAL_64(0xfedcba9800000000UL, dst[1]);
+ CHECK_EQUAL_64(0x0123456789abcdefUL, x1);
+ CHECK_EQUAL_64(0x0123456789abcdefUL, dst[2]);
+ CHECK_EQUAL_64(0x01234567, x2);
+ CHECK_EQUAL_64(0x0123456700000000UL, dst[4]);
+ CHECK_EQUAL_64(0x32, x3);
+ CHECK_EQUAL_64(0x3200, dst[3]);
+ CHECK_EQUAL_64(0x9876, x4);
+ CHECK_EQUAL_64(0x987600, dst[5]);
+ CHECK_EQUAL_64(src_base + 4, x17);
+ CHECK_EQUAL_64(dst_base + 12, x18);
+ CHECK_EQUAL_64(src_base + 8, x19);
+ CHECK_EQUAL_64(dst_base + 16, x20);
+ CHECK_EQUAL_64(src_base + 12, x21);
+ CHECK_EQUAL_64(dst_base + 36, x22);
+ CHECK_EQUAL_64(src_base + 1, x23);
+ CHECK_EQUAL_64(dst_base + 25, x24);
+ CHECK_EQUAL_64(src_base + 3, x25);
+ CHECK_EQUAL_64(dst_base + 41, x26);
+
+ TEARDOWN();
+}
+
+TEST(ldr_str_postindex) {
+ INIT_V8();
+ SETUP();
+
+ uint64_t src[2] = {0xfedcba9876543210UL, 0x0123456789abcdefUL};
+ uint64_t dst[6] = {0, 0, 0, 0, 0, 0};
+ uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
+ uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
+
+ START();
+ __ Mov(x17, src_base + 4);
+ __ Mov(x18, dst_base + 12);
+ __ Mov(x19, src_base + 8);
+ __ Mov(x20, dst_base + 16);
+ __ Mov(x21, src_base + 8);
+ __ Mov(x22, dst_base + 32);
+ __ Mov(x23, src_base + 1);
+ __ Mov(x24, dst_base + 25);
+ __ Mov(x25, src_base + 3);
+ __ Mov(x26, dst_base + 41);
+ __ Ldr(w0, MemOperand(x17, 4, PostIndex));
+ __ Str(w0, MemOperand(x18, 12, PostIndex));
+ __ Ldr(x1, MemOperand(x19, 8, PostIndex));
+ __ Str(x1, MemOperand(x20, 16, PostIndex));
+ __ Ldr(x2, MemOperand(x21, -8, PostIndex));
+ __ Str(x2, MemOperand(x22, -32, PostIndex));
+ __ Ldrb(w3, MemOperand(x23, 1, PostIndex));
+ __ Strb(w3, MemOperand(x24, 5, PostIndex));
+ __ Ldrh(w4, MemOperand(x25, -3, PostIndex));
+ __ Strh(w4, MemOperand(x26, -41, PostIndex));
+ END();
+
+ RUN();
+
+ CHECK_EQUAL_64(0xfedcba98, x0);
+ CHECK_EQUAL_64(0xfedcba9800000000UL, dst[1]);
+ CHECK_EQUAL_64(0x0123456789abcdefUL, x1);
+ CHECK_EQUAL_64(0x0123456789abcdefUL, dst[2]);
+ CHECK_EQUAL_64(0x0123456789abcdefUL, x2);
+ CHECK_EQUAL_64(0x0123456789abcdefUL, dst[4]);
+ CHECK_EQUAL_64(0x32, x3);
+ CHECK_EQUAL_64(0x3200, dst[3]);
+ CHECK_EQUAL_64(0x9876, x4);
+ CHECK_EQUAL_64(0x987600, dst[5]);
+ CHECK_EQUAL_64(src_base + 8, x17);
+ CHECK_EQUAL_64(dst_base + 24, x18);
+ CHECK_EQUAL_64(src_base + 16, x19);
+ CHECK_EQUAL_64(dst_base + 32, x20);
+ CHECK_EQUAL_64(src_base, x21);
+ CHECK_EQUAL_64(dst_base, x22);
+ CHECK_EQUAL_64(src_base + 2, x23);
+ CHECK_EQUAL_64(dst_base + 30, x24);
+ CHECK_EQUAL_64(src_base, x25);
+ CHECK_EQUAL_64(dst_base, x26);
+
+ TEARDOWN();
+}
+
+TEST(load_signed) {
+ INIT_V8();
+ SETUP();
+
+ uint32_t src[2] = {0x80008080, 0x7fff7f7f};
+ uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
+
+ START();
+ __ Mov(x24, src_base);
+ __ Ldrsb(w0, MemOperand(x24));
+ __ Ldrsb(w1, MemOperand(x24, 4));
+ __ Ldrsh(w2, MemOperand(x24));
+ __ Ldrsh(w3, MemOperand(x24, 4));
+ __ Ldrsb(x4, MemOperand(x24));
+ __ Ldrsb(x5, MemOperand(x24, 4));
+ __ Ldrsh(x6, MemOperand(x24));
+ __ Ldrsh(x7, MemOperand(x24, 4));
+ __ Ldrsw(x8, MemOperand(x24));
+ __ Ldrsw(x9, MemOperand(x24, 4));
+ END();
+
+ RUN();
+
+ CHECK_EQUAL_64(0xffffff80, x0);
+ CHECK_EQUAL_64(0x0000007f, x1);
+ CHECK_EQUAL_64(0xffff8080, x2);
+ CHECK_EQUAL_64(0x00007f7f, x3);
+ CHECK_EQUAL_64(0xffffffffffffff80UL, x4);
+ CHECK_EQUAL_64(0x000000000000007fUL, x5);
+ CHECK_EQUAL_64(0xffffffffffff8080UL, x6);
+ CHECK_EQUAL_64(0x0000000000007f7fUL, x7);
+ CHECK_EQUAL_64(0xffffffff80008080UL, x8);
+ CHECK_EQUAL_64(0x000000007fff7f7fUL, x9);
+
+ TEARDOWN();
+}
+
+TEST(load_store_regoffset) {
+ INIT_V8();
+ SETUP();
+
+ uint32_t src[3] = {1, 2, 3};
+ uint32_t dst[4] = {0, 0, 0, 0};
+ uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
+ uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
+
+ START();
+ __ Mov(x16, src_base);
+ __ Mov(x17, dst_base);
+ __ Mov(x18, src_base + 3 * sizeof(src[0]));
+ __ Mov(x19, dst_base + 3 * sizeof(dst[0]));
+ __ Mov(x20, dst_base + 4 * sizeof(dst[0]));
+ __ Mov(x24, 0);
+ __ Mov(x25, 4);
+ __ Mov(x26, -4);
+ __ Mov(x27, 0xfffffffc); // 32-bit -4.
+ __ Mov(x28, 0xfffffffe); // 32-bit -2.
+ __ Mov(x29, 0xffffffff); // 32-bit -1.
+
+ __ Ldr(w0, MemOperand(x16, x24));
+ __ Ldr(x1, MemOperand(x16, x25));
+ __ Ldr(w2, MemOperand(x18, x26));
+ __ Ldr(w3, MemOperand(x18, x27, SXTW));
+ __ Ldr(w4, MemOperand(x18, x28, SXTW, 2));
+ __ Str(w0, MemOperand(x17, x24));
+ __ Str(x1, MemOperand(x17, x25));
+ __ Str(w2, MemOperand(x20, x29, SXTW, 2));
+ END();
+
+ RUN();
+
+ CHECK_EQUAL_64(1, x0);
+ CHECK_EQUAL_64(0x0000000300000002UL, x1);
+ CHECK_EQUAL_64(3, x2);
+ CHECK_EQUAL_64(3, x3);
+ CHECK_EQUAL_64(2, x4);
+ CHECK_EQUAL_32(1, dst[0]);
+ CHECK_EQUAL_32(2, dst[1]);
+ CHECK_EQUAL_32(3, dst[2]);
+ CHECK_EQUAL_32(3, dst[3]);
+
+ TEARDOWN();
+}
+
+TEST(load_store_float) {
+ INIT_V8();
+ SETUP();
+
+ float src[3] = {1.0, 2.0, 3.0};
+ float dst[3] = {0.0, 0.0, 0.0};
+ uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
+ uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
+
+ START();
+ __ Mov(x17, src_base);
+ __ Mov(x18, dst_base);
+ __ Mov(x19, src_base);
+ __ Mov(x20, dst_base);
+ __ Mov(x21, src_base);
+ __ Mov(x22, dst_base);
+ __ Ldr(s0, MemOperand(x17, sizeof(src[0])));
+ __ Str(s0, MemOperand(x18, sizeof(dst[0]), PostIndex));
+ __ Ldr(s1, MemOperand(x19, sizeof(src[0]), PostIndex));
+ __ Str(s1, MemOperand(x20, 2 * sizeof(dst[0]), PreIndex));
+ __ Ldr(s2, MemOperand(x21, 2 * sizeof(src[0]), PreIndex));
+ __ Str(s2, MemOperand(x22, sizeof(dst[0])));
+ END();
+
+ RUN();
+
+ CHECK_EQUAL_FP32(2.0, s0);
+ CHECK_EQUAL_FP32(2.0, dst[0]);
+ CHECK_EQUAL_FP32(1.0, s1);
+ CHECK_EQUAL_FP32(1.0, dst[2]);
+ CHECK_EQUAL_FP32(3.0, s2);
+ CHECK_EQUAL_FP32(3.0, dst[1]);
+ CHECK_EQUAL_64(src_base, x17);
+ CHECK_EQUAL_64(dst_base + sizeof(dst[0]), x18);
+ CHECK_EQUAL_64(src_base + sizeof(src[0]), x19);
+ CHECK_EQUAL_64(dst_base + 2 * sizeof(dst[0]), x20);
+ CHECK_EQUAL_64(src_base + 2 * sizeof(src[0]), x21);
+ CHECK_EQUAL_64(dst_base, x22);
+
+ TEARDOWN();
+}
+
+TEST(load_store_double) {
+ INIT_V8();
+ SETUP();
+
+ double src[3] = {1.0, 2.0, 3.0};
+ double dst[3] = {0.0, 0.0, 0.0};
+ uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
+ uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
+
+ START();
+ __ Mov(x17, src_base);
+ __ Mov(x18, dst_base);
+ __ Mov(x19, src_base);
+ __ Mov(x20, dst_base);
+ __ Mov(x21, src_base);
+ __ Mov(x22, dst_base);
+ __ Ldr(d0, MemOperand(x17, sizeof(src[0])));
+ __ Str(d0, MemOperand(x18, sizeof(dst[0]), PostIndex));
+ __ Ldr(d1, MemOperand(x19, sizeof(src[0]), PostIndex));
+ __ Str(d1, MemOperand(x20, 2 * sizeof(dst[0]), PreIndex));
+ __ Ldr(d2, MemOperand(x21, 2 * sizeof(src[0]), PreIndex));
+ __ Str(d2, MemOperand(x22, sizeof(dst[0])));
+ END();
+
+ RUN();
+
+ CHECK_EQUAL_FP64(2.0, d0);
+ CHECK_EQUAL_FP64(2.0, dst[0]);
+ CHECK_EQUAL_FP64(1.0, d1);
+ CHECK_EQUAL_FP64(1.0, dst[2]);
+ CHECK_EQUAL_FP64(3.0, d2);
+ CHECK_EQUAL_FP64(3.0, dst[1]);
+ CHECK_EQUAL_64(src_base, x17);
+ CHECK_EQUAL_64(dst_base + sizeof(dst[0]), x18);
+ CHECK_EQUAL_64(src_base + sizeof(src[0]), x19);
+ CHECK_EQUAL_64(dst_base + 2 * sizeof(dst[0]), x20);
+ CHECK_EQUAL_64(src_base + 2 * sizeof(src[0]), x21);
+ CHECK_EQUAL_64(dst_base, x22);
+
+ TEARDOWN();
+}
+
+TEST(load_store_b) {
+ INIT_V8();
+ SETUP();
+
+ uint8_t src[3] = {0x12, 0x23, 0x34};
+ uint8_t dst[3] = {0, 0, 0};
+ uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
+ uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
+
+ START();
+ __ Mov(x17, src_base);
+ __ Mov(x18, dst_base);
+ __ Mov(x19, src_base);
+ __ Mov(x20, dst_base);
+ __ Mov(x21, src_base);
+ __ Mov(x22, dst_base);
+ __ Ldr(b0, MemOperand(x17, sizeof(src[0])));
+ __ Str(b0, MemOperand(x18, sizeof(dst[0]), PostIndex));
+ __ Ldr(b1, MemOperand(x19, sizeof(src[0]), PostIndex));
+ __ Str(b1, MemOperand(x20, 2 * sizeof(dst[0]), PreIndex));
+ __ Ldr(b2, MemOperand(x21, 2 * sizeof(src[0]), PreIndex));
+ __ Str(b2, MemOperand(x22, sizeof(dst[0])));
+ END();
+
+ RUN();
+
+ CHECK_EQUAL_128(0, 0x23, q0);
+ CHECK_EQUAL_64(0x23, dst[0]);
+ CHECK_EQUAL_128(0, 0x12, q1);
+ CHECK_EQUAL_64(0x12, dst[2]);
+ CHECK_EQUAL_128(0, 0x34, q2);
+ CHECK_EQUAL_64(0x34, dst[1]);
+ CHECK_EQUAL_64(src_base, x17);
+ CHECK_EQUAL_64(dst_base + sizeof(dst[0]), x18);
+ CHECK_EQUAL_64(src_base + sizeof(src[0]), x19);
+ CHECK_EQUAL_64(dst_base + 2 * sizeof(dst[0]), x20);
+ CHECK_EQUAL_64(src_base + 2 * sizeof(src[0]), x21);
+ CHECK_EQUAL_64(dst_base, x22);
+
+ TEARDOWN();
+}
+
+TEST(load_store_h) {
+ INIT_V8();
+ SETUP();
+
+ uint16_t src[3] = {0x1234, 0x2345, 0x3456};
+ uint16_t dst[3] = {0, 0, 0};
+ uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
+ uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
+
+ START();
+ __ Mov(x17, src_base);
+ __ Mov(x18, dst_base);
+ __ Mov(x19, src_base);
+ __ Mov(x20, dst_base);
+ __ Mov(x21, src_base);
+ __ Mov(x22, dst_base);
+ __ Ldr(h0, MemOperand(x17, sizeof(src[0])));
+ __ Str(h0, MemOperand(x18, sizeof(dst[0]), PostIndex));
+ __ Ldr(h1, MemOperand(x19, sizeof(src[0]), PostIndex));
+ __ Str(h1, MemOperand(x20, 2 * sizeof(dst[0]), PreIndex));
+ __ Ldr(h2, MemOperand(x21, 2 * sizeof(src[0]), PreIndex));
+ __ Str(h2, MemOperand(x22, sizeof(dst[0])));
+ END();
+
+ RUN();
+
+ CHECK_EQUAL_128(0, 0x2345, q0);
+ CHECK_EQUAL_64(0x2345, dst[0]);
+ CHECK_EQUAL_128(0, 0x1234, q1);
+ CHECK_EQUAL_64(0x1234, dst[2]);
+ CHECK_EQUAL_128(0, 0x3456, q2);
+ CHECK_EQUAL_64(0x3456, dst[1]);
+ CHECK_EQUAL_64(src_base, x17);
+ CHECK_EQUAL_64(dst_base + sizeof(dst[0]), x18);
+ CHECK_EQUAL_64(src_base + sizeof(src[0]), x19);
+ CHECK_EQUAL_64(dst_base + 2 * sizeof(dst[0]), x20);
+ CHECK_EQUAL_64(src_base + 2 * sizeof(src[0]), x21);
+ CHECK_EQUAL_64(dst_base, x22);
+
+ TEARDOWN();
+}
+
+TEST(load_store_q) {
+ INIT_V8();
+ SETUP();
+
+ uint8_t src[48] = {0x10, 0x32, 0x54, 0x76, 0x98, 0xba, 0xdc, 0xfe, 0x01, 0x23,
+ 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0x21, 0x43, 0x65, 0x87,
+ 0xa9, 0xcb, 0xed, 0x0f, 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc,
+ 0xde, 0xf0, 0x24, 0x46, 0x68, 0x8a, 0xac, 0xce, 0xe0, 0x02,
+ 0x42, 0x64, 0x86, 0xa8, 0xca, 0xec, 0x0e, 0x20};
+
+ uint64_t dst[6] = {0, 0, 0, 0, 0, 0};
+ uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
+ uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
+
+ START();
+ __ Mov(x17, src_base);
+ __ Mov(x18, dst_base);
+ __ Mov(x19, src_base);
+ __ Mov(x20, dst_base);
+ __ Mov(x21, src_base);
+ __ Mov(x22, dst_base);
+ __ Ldr(q0, MemOperand(x17, 16));
+ __ Str(q0, MemOperand(x18, 16, PostIndex));
+ __ Ldr(q1, MemOperand(x19, 16, PostIndex));
+ __ Str(q1, MemOperand(x20, 32, PreIndex));
+ __ Ldr(q2, MemOperand(x21, 32, PreIndex));
+ __ Str(q2, MemOperand(x22, 16));
+ END();
+
+ RUN();
+
+ CHECK_EQUAL_128(0xf0debc9a78563412, 0x0fedcba987654321, q0);
+ CHECK_EQUAL_64(0x0fedcba987654321, dst[0]);
+ CHECK_EQUAL_64(0xf0debc9a78563412, dst[1]);
+ CHECK_EQUAL_128(0xefcdab8967452301, 0xfedcba9876543210, q1);
+ CHECK_EQUAL_64(0xfedcba9876543210, dst[4]);
+ CHECK_EQUAL_64(0xefcdab8967452301, dst[5]);
+ CHECK_EQUAL_128(0x200eeccaa8866442, 0x02e0ceac8a684624, q2);
+ CHECK_EQUAL_64(0x02e0ceac8a684624, dst[2]);
+ CHECK_EQUAL_64(0x200eeccaa8866442, dst[3]);
+ CHECK_EQUAL_64(src_base, x17);
+ CHECK_EQUAL_64(dst_base + 16, x18);
+ CHECK_EQUAL_64(src_base + 16, x19);
+ CHECK_EQUAL_64(dst_base + 32, x20);
+ CHECK_EQUAL_64(src_base + 32, x21);
+ CHECK_EQUAL_64(dst_base, x22);
+
+ TEARDOWN();
+}
+
+TEST(neon_ld1_d) {
+ INIT_V8();
+ SETUP();
+
+ uint8_t src[32 + 5];
+ for (unsigned i = 0; i < sizeof(src); i++) {
+ src[i] = i;
+ }
+ uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
+
+ START();
+ __ Mov(x17, src_base);
+ __ Ldr(q2, MemOperand(x17)); // Initialise top 64-bits of Q register.
+ __ Ld1(v2.V8B(), MemOperand(x17));
+ __ Add(x17, x17, 1);
+ __ Ld1(v3.V8B(), v4.V8B(), MemOperand(x17));
+ __ Add(x17, x17, 1);
+ __ Ld1(v5.V4H(), v6.V4H(), v7.V4H(), MemOperand(x17));
+ __ Add(x17, x17, 1);
+ __ Ld1(v16.V2S(), v17.V2S(), v18.V2S(), v19.V2S(), MemOperand(x17));
+ __ Add(x17, x17, 1);
+ __ Ld1(v30.V2S(), v31.V2S(), v0.V2S(), v1.V2S(), MemOperand(x17));
+ __ Add(x17, x17, 1);
+ __ Ld1(v20.V1D(), v21.V1D(), v22.V1D(), v23.V1D(), MemOperand(x17));
+ END();
+
+ RUN();
+
+ CHECK_EQUAL_128(0, 0x0706050403020100, q2);
+ CHECK_EQUAL_128(0, 0x0807060504030201, q3);
+ CHECK_EQUAL_128(0, 0x100f0e0d0c0b0a09, q4);
+ CHECK_EQUAL_128(0, 0x0908070605040302, q5);
+ CHECK_EQUAL_128(0, 0x11100f0e0d0c0b0a, q6);
+ CHECK_EQUAL_128(0, 0x1918171615141312, q7);
+ CHECK_EQUAL_128(0, 0x0a09080706050403, q16);
+ CHECK_EQUAL_128(0, 0x1211100f0e0d0c0b, q17);
+ CHECK_EQUAL_128(0, 0x1a19181716151413, q18);
+ CHECK_EQUAL_128(0, 0x2221201f1e1d1c1b, q19);
+ CHECK_EQUAL_128(0, 0x0b0a090807060504, q30);
+ CHECK_EQUAL_128(0, 0x131211100f0e0d0c, q31);
+ CHECK_EQUAL_128(0, 0x1b1a191817161514, q0);
+ CHECK_EQUAL_128(0, 0x232221201f1e1d1c, q1);
+ CHECK_EQUAL_128(0, 0x0c0b0a0908070605, q20);
+ CHECK_EQUAL_128(0, 0x14131211100f0e0d, q21);
+ CHECK_EQUAL_128(0, 0x1c1b1a1918171615, q22);
+ CHECK_EQUAL_128(0, 0x24232221201f1e1d, q23);
+
+ TEARDOWN();
+}
+
+TEST(neon_ld1_d_postindex) {
+ INIT_V8();
+ SETUP();
+
+ uint8_t src[32 + 5];
+ for (unsigned i = 0; i < sizeof(src); i++) {
+ src[i] = i;
+ }
+ uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
+
+ START();
+ __ Mov(x17, src_base);
+ __ Mov(x18, src_base + 1);
+ __ Mov(x19, src_base + 2);
+ __ Mov(x20, src_base + 3);
+ __ Mov(x21, src_base + 4);
+ __ Mov(x22, src_base + 5);
+ __ Mov(x23, 1);
+ __ Ldr(q2, MemOperand(x17)); // Initialise top 64-bits of Q register.
+ __ Ld1(v2.V8B(), MemOperand(x17, x23, PostIndex));
+ __ Ld1(v3.V8B(), v4.V8B(), MemOperand(x18, 16, PostIndex));
+ __ Ld1(v5.V4H(), v6.V4H(), v7.V4H(), MemOperand(x19, 24, PostIndex));
+ __ Ld1(v16.V2S(), v17.V2S(), v18.V2S(), v19.V2S(),
+ MemOperand(x20, 32, PostIndex));
+ __ Ld1(v30.V2S(), v31.V2S(), v0.V2S(), v1.V2S(),
+ MemOperand(x21, 32, PostIndex));
+ __ Ld1(v20.V1D(), v21.V1D(), v22.V1D(), v23.V1D(),
+ MemOperand(x22, 32, PostIndex));
+ END();
+
+ RUN();
+
+ CHECK_EQUAL_128(0, 0x0706050403020100, q2);
+ CHECK_EQUAL_128(0, 0x0807060504030201, q3);
+ CHECK_EQUAL_128(0, 0x100f0e0d0c0b0a09, q4);
+ CHECK_EQUAL_128(0, 0x0908070605040302, q5);
+ CHECK_EQUAL_128(0, 0x11100f0e0d0c0b0a, q6);
+ CHECK_EQUAL_128(0, 0x1918171615141312, q7);
+ CHECK_EQUAL_128(0, 0x0a09080706050403, q16);
+ CHECK_EQUAL_128(0, 0x1211100f0e0d0c0b, q17);
+ CHECK_EQUAL_128(0, 0x1a19181716151413, q18);
+ CHECK_EQUAL_128(0, 0x2221201f1e1d1c1b, q19);
+ CHECK_EQUAL_128(0, 0x0b0a090807060504, q30);
+ CHECK_EQUAL_128(0, 0x131211100f0e0d0c, q31);
+ CHECK_EQUAL_128(0, 0x1b1a191817161514, q0);
+ CHECK_EQUAL_128(0, 0x232221201f1e1d1c, q1);
+ CHECK_EQUAL_128(0, 0x0c0b0a0908070605, q20);
+ CHECK_EQUAL_128(0, 0x14131211100f0e0d, q21);
+ CHECK_EQUAL_128(0, 0x1c1b1a1918171615, q22);
+ CHECK_EQUAL_128(0, 0x24232221201f1e1d, q23);
+ CHECK_EQUAL_64(src_base + 1, x17);
+ CHECK_EQUAL_64(src_base + 1 + 16, x18);
+ CHECK_EQUAL_64(src_base + 2 + 24, x19);
+ CHECK_EQUAL_64(src_base + 3 + 32, x20);
+ CHECK_EQUAL_64(src_base + 4 + 32, x21);
+ CHECK_EQUAL_64(src_base + 5 + 32, x22);
+
+ TEARDOWN();
+}
+
+TEST(neon_ld1_q) {
+ INIT_V8();
+ SETUP();
+
+ uint8_t src[64 + 4];
+ for (unsigned i = 0; i < sizeof(src); i++) {
+ src[i] = i;
+ }
+ uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
+
+ START();
+ __ Mov(x17, src_base);
+ __ Ld1(v2.V16B(), MemOperand(x17));
+ __ Add(x17, x17, 1);
+ __ Ld1(v3.V16B(), v4.V16B(), MemOperand(x17));
+ __ Add(x17, x17, 1);
+ __ Ld1(v5.V8H(), v6.V8H(), v7.V8H(), MemOperand(x17));
+ __ Add(x17, x17, 1);
+ __ Ld1(v16.V4S(), v17.V4S(), v18.V4S(), v19.V4S(), MemOperand(x17));
+ __ Add(x17, x17, 1);
+ __ Ld1(v30.V2D(), v31.V2D(), v0.V2D(), v1.V2D(), MemOperand(x17));
+ END();
+
+ RUN();
+
+ CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0706050403020100, q2);
+ CHECK_EQUAL_128(0x100f0e0d0c0b0a09, 0x0807060504030201, q3);
+ CHECK_EQUAL_128(0x201f1e1d1c1b1a19, 0x1817161514131211, q4);
+ CHECK_EQUAL_128(0x11100f0e0d0c0b0a, 0x0908070605040302, q5);
+ CHECK_EQUAL_128(0x21201f1e1d1c1b1a, 0x1918171615141312, q6);
+ CHECK_EQUAL_128(0x31302f2e2d2c2b2a, 0x2928272625242322, q7);
+ CHECK_EQUAL_128(0x1211100f0e0d0c0b, 0x0a09080706050403, q16);
+ CHECK_EQUAL_128(0x2221201f1e1d1c1b, 0x1a19181716151413, q17);
+ CHECK_EQUAL_128(0x3231302f2e2d2c2b, 0x2a29282726252423, q18);
+ CHECK_EQUAL_128(0x4241403f3e3d3c3b, 0x3a39383736353433, q19);
+ CHECK_EQUAL_128(0x131211100f0e0d0c, 0x0b0a090807060504, q30);
+ CHECK_EQUAL_128(0x232221201f1e1d1c, 0x1b1a191817161514, q31);
+ CHECK_EQUAL_128(0x333231302f2e2d2c, 0x2b2a292827262524, q0);
+ CHECK_EQUAL_128(0x434241403f3e3d3c, 0x3b3a393837363534, q1);
+
+ TEARDOWN();
+}
+
+TEST(neon_ld1_q_postindex) {
+ INIT_V8();
+ SETUP();
+
+ uint8_t src[64 + 4];
+ for (unsigned i = 0; i < sizeof(src); i++) {
+ src[i] = i;
+ }
+ uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
+
+ START();
+ __ Mov(x17, src_base);
+ __ Mov(x18, src_base + 1);
+ __ Mov(x19, src_base + 2);
+ __ Mov(x20, src_base + 3);
+ __ Mov(x21, src_base + 4);
+ __ Mov(x22, 1);
+ __ Ld1(v2.V16B(), MemOperand(x17, x22, PostIndex));
+ __ Ld1(v3.V16B(), v4.V16B(), MemOperand(x18, 32, PostIndex));
+ __ Ld1(v5.V8H(), v6.V8H(), v7.V8H(), MemOperand(x19, 48, PostIndex));
+ __ Ld1(v16.V4S(), v17.V4S(), v18.V4S(), v19.V4S(),
+ MemOperand(x20, 64, PostIndex));
+ __ Ld1(v30.V2D(), v31.V2D(), v0.V2D(), v1.V2D(),
+ MemOperand(x21, 64, PostIndex));
+ END();
+
+ RUN();
+
+ CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0706050403020100, q2);
+ CHECK_EQUAL_128(0x100f0e0d0c0b0a09, 0x0807060504030201, q3);
+ CHECK_EQUAL_128(0x201f1e1d1c1b1a19, 0x1817161514131211, q4);
+ CHECK_EQUAL_128(0x11100f0e0d0c0b0a, 0x0908070605040302, q5);
+ CHECK_EQUAL_128(0x21201f1e1d1c1b1a, 0x1918171615141312, q6);
+ CHECK_EQUAL_128(0x31302f2e2d2c2b2a, 0x2928272625242322, q7);
+ CHECK_EQUAL_128(0x1211100f0e0d0c0b, 0x0a09080706050403, q16);
+ CHECK_EQUAL_128(0x2221201f1e1d1c1b, 0x1a19181716151413, q17);
+ CHECK_EQUAL_128(0x3231302f2e2d2c2b, 0x2a29282726252423, q18);
+ CHECK_EQUAL_128(0x4241403f3e3d3c3b, 0x3a39383736353433, q19);
+ CHECK_EQUAL_128(0x131211100f0e0d0c, 0x0b0a090807060504, q30);
+ CHECK_EQUAL_128(0x232221201f1e1d1c, 0x1b1a191817161514, q31);
+ CHECK_EQUAL_128(0x333231302f2e2d2c, 0x2b2a292827262524, q0);
+ CHECK_EQUAL_128(0x434241403f3e3d3c, 0x3b3a393837363534, q1);
+ CHECK_EQUAL_64(src_base + 1, x17);
+ CHECK_EQUAL_64(src_base + 1 + 32, x18);
+ CHECK_EQUAL_64(src_base + 2 + 48, x19);
+ CHECK_EQUAL_64(src_base + 3 + 64, x20);
+ CHECK_EQUAL_64(src_base + 4 + 64, x21);
+
+ TEARDOWN();
+}
+
+TEST(neon_ld1_lane) {
+ INIT_V8();
+ SETUP();
+
+ uint8_t src[64];
+ for (unsigned i = 0; i < sizeof(src); i++) {
+ src[i] = i;
+ }
+ uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
+
+ START();
+
+ // Test loading whole register by element.
+ __ Mov(x17, src_base);
+ for (int i = 15; i >= 0; i--) {
+ __ Ld1(v0.B(), i, MemOperand(x17));
+ __ Add(x17, x17, 1);
+ }
+
+ __ Mov(x17, src_base);
+ for (int i = 7; i >= 0; i--) {
+ __ Ld1(v1.H(), i, MemOperand(x17));
+ __ Add(x17, x17, 1);
+ }
+
+ __ Mov(x17, src_base);
+ for (int i = 3; i >= 0; i--) {
+ __ Ld1(v2.S(), i, MemOperand(x17));
+ __ Add(x17, x17, 1);
+ }
+
+ __ Mov(x17, src_base);
+ for (int i = 1; i >= 0; i--) {
+ __ Ld1(v3.D(), i, MemOperand(x17));
+ __ Add(x17, x17, 1);
+ }
+
+ // Test loading a single element into an initialised register.
+ __ Mov(x17, src_base);
+ __ Ldr(q4, MemOperand(x17));
+ __ Ld1(v4.B(), 4, MemOperand(x17));
+ __ Ldr(q5, MemOperand(x17));
+ __ Ld1(v5.H(), 3, MemOperand(x17));
+ __ Ldr(q6, MemOperand(x17));
+ __ Ld1(v6.S(), 2, MemOperand(x17));
+ __ Ldr(q7, MemOperand(x17));
+ __ Ld1(v7.D(), 1, MemOperand(x17));
+
+ END();
+
+ RUN();
+
+ CHECK_EQUAL_128(0x0001020304050607, 0x08090a0b0c0d0e0f, q0);
+ CHECK_EQUAL_128(0x0100020103020403, 0x0504060507060807, q1);
+ CHECK_EQUAL_128(0x0302010004030201, 0x0504030206050403, q2);
+ CHECK_EQUAL_128(0x0706050403020100, 0x0807060504030201, q3);
+ CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0706050003020100, q4);
+ CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0100050403020100, q5);
+ CHECK_EQUAL_128(0x0f0e0d0c03020100, 0x0706050403020100, q6);
+ CHECK_EQUAL_128(0x0706050403020100, 0x0706050403020100, q7);
+
+ TEARDOWN();
+}
+
+TEST(neon_ld2_d) {
+ INIT_V8();
+ SETUP();
+
+ uint8_t src[64 + 4];
+ for (unsigned i = 0; i < sizeof(src); i++) {
+ src[i] = i;
+ }
+ uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
+
+ START();
+ __ Mov(x17, src_base);
+ __ Ld2(v2.V8B(), v3.V8B(), MemOperand(x17));
+ __ Add(x17, x17, 1);
+ __ Ld2(v4.V8B(), v5.V8B(), MemOperand(x17));
+ __ Add(x17, x17, 1);
+ __ Ld2(v6.V4H(), v7.V4H(), MemOperand(x17));
+ __ Add(x17, x17, 1);
+ __ Ld2(v31.V2S(), v0.V2S(), MemOperand(x17));
+ END();
+
+ RUN();
+
+ CHECK_EQUAL_128(0, 0x0e0c0a0806040200, q2);
+ CHECK_EQUAL_128(0, 0x0f0d0b0907050301, q3);
+ CHECK_EQUAL_128(0, 0x0f0d0b0907050301, q4);
+ CHECK_EQUAL_128(0, 0x100e0c0a08060402, q5);
+ CHECK_EQUAL_128(0, 0x0f0e0b0a07060302, q6);
+ CHECK_EQUAL_128(0, 0x11100d0c09080504, q7);
+ CHECK_EQUAL_128(0, 0x0e0d0c0b06050403, q31);
+ CHECK_EQUAL_128(0, 0x1211100f0a090807, q0);
+
+ TEARDOWN();
+}
+
+TEST(neon_ld2_d_postindex) {
+ INIT_V8();
+ SETUP();
+
+ uint8_t src[32 + 4];
+ for (unsigned i = 0; i < sizeof(src); i++) {
+ src[i] = i;
+ }
+ uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
+
+ START();
+ __ Mov(x17, src_base);
+ __ Mov(x18, src_base + 1);
+ __ Mov(x19, src_base + 2);
+ __ Mov(x20, src_base + 3);
+ __ Mov(x21, src_base + 4);
+ __ Mov(x22, 1);
+ __ Ld2(v2.V8B(), v3.V8B(), MemOperand(x17, x22, PostIndex));
+ __ Ld2(v4.V8B(), v5.V8B(), MemOperand(x18, 16, PostIndex));
+ __ Ld2(v5.V4H(), v6.V4H(), MemOperand(x19, 16, PostIndex));
+ __ Ld2(v16.V2S(), v17.V2S(), MemOperand(x20, 16, PostIndex));
+ __ Ld2(v31.V2S(), v0.V2S(), MemOperand(x21, 16, PostIndex));
+ END();
+
+ RUN();
+
+ CHECK_EQUAL_128(0, 0x0e0c0a0806040200, q2);
+ CHECK_EQUAL_128(0, 0x0f0d0b0907050301, q3);
+ CHECK_EQUAL_128(0, 0x0f0d0b0907050301, q4);
+ CHECK_EQUAL_128(0, 0x0f0e0b0a07060302, q5);
+ CHECK_EQUAL_128(0, 0x11100d0c09080504, q6);
+ CHECK_EQUAL_128(0, 0x0e0d0c0b06050403, q16);
+ CHECK_EQUAL_128(0, 0x1211100f0a090807, q17);
+ CHECK_EQUAL_128(0, 0x0f0e0d0c07060504, q31);
+ CHECK_EQUAL_128(0, 0x131211100b0a0908, q0);
+
+ CHECK_EQUAL_64(src_base + 1, x17);
+ CHECK_EQUAL_64(src_base + 1 + 16, x18);
+ CHECK_EQUAL_64(src_base + 2 + 16, x19);
+ CHECK_EQUAL_64(src_base + 3 + 16, x20);
+ CHECK_EQUAL_64(src_base + 4 + 16, x21);
+
+ TEARDOWN();
+}
+
+TEST(neon_ld2_q) {
+ INIT_V8();
+ SETUP();
+
+ uint8_t src[64 + 4];
+ for (unsigned i = 0; i < sizeof(src); i++) {
+ src[i] = i;
+ }
+ uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
+
+ START();
+ __ Mov(x17, src_base);
+ __ Ld2(v2.V16B(), v3.V16B(), MemOperand(x17));
+ __ Add(x17, x17, 1);
+ __ Ld2(v4.V16B(), v5.V16B(), MemOperand(x17));
+ __ Add(x17, x17, 1);
+ __ Ld2(v6.V8H(), v7.V8H(), MemOperand(x17));
+ __ Add(x17, x17, 1);
+ __ Ld2(v16.V4S(), v17.V4S(), MemOperand(x17));
+ __ Add(x17, x17, 1);
+ __ Ld2(v31.V2D(), v0.V2D(), MemOperand(x17));
+ END();
+
+ RUN();
+
+ CHECK_EQUAL_128(0x1e1c1a1816141210, 0x0e0c0a0806040200, q2);
+ CHECK_EQUAL_128(0x1f1d1b1917151311, 0x0f0d0b0907050301, q3);
+ CHECK_EQUAL_128(0x1f1d1b1917151311, 0x0f0d0b0907050301, q4);
+ CHECK_EQUAL_128(0x201e1c1a18161412, 0x100e0c0a08060402, q5);
+ CHECK_EQUAL_128(0x1f1e1b1a17161312, 0x0f0e0b0a07060302, q6);
+ CHECK_EQUAL_128(0x21201d1c19181514, 0x11100d0c09080504, q7);
+ CHECK_EQUAL_128(0x1e1d1c1b16151413, 0x0e0d0c0b06050403, q16);
+ CHECK_EQUAL_128(0x2221201f1a191817, 0x1211100f0a090807, q17);
+ CHECK_EQUAL_128(0x1b1a191817161514, 0x0b0a090807060504, q31);
+ CHECK_EQUAL_128(0x232221201f1e1d1c, 0x131211100f0e0d0c, q0);
+
+ TEARDOWN();
+}
+
+TEST(neon_ld2_q_postindex) {
+ INIT_V8();
+ SETUP();
+
+ uint8_t src[64 + 4];
+ for (unsigned i = 0; i < sizeof(src); i++) {
+ src[i] = i;
+ }
+ uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
+
+ START();
+ __ Mov(x17, src_base);
+ __ Mov(x18, src_base + 1);
+ __ Mov(x19, src_base + 2);
+ __ Mov(x20, src_base + 3);
+ __ Mov(x21, src_base + 4);
+ __ Mov(x22, 1);
+ __ Ld2(v2.V16B(), v3.V16B(), MemOperand(x17, x22, PostIndex));
+ __ Ld2(v4.V16B(), v5.V16B(), MemOperand(x18, 32, PostIndex));
+ __ Ld2(v6.V8H(), v7.V8H(), MemOperand(x19, 32, PostIndex));
+ __ Ld2(v16.V4S(), v17.V4S(), MemOperand(x20, 32, PostIndex));
+ __ Ld2(v31.V2D(), v0.V2D(), MemOperand(x21, 32, PostIndex));
+ END();
+
+ RUN();
+
+ CHECK_EQUAL_128(0x1e1c1a1816141210, 0x0e0c0a0806040200, q2);
+ CHECK_EQUAL_128(0x1f1d1b1917151311, 0x0f0d0b0907050301, q3);
+ CHECK_EQUAL_128(0x1f1d1b1917151311, 0x0f0d0b0907050301, q4);
+ CHECK_EQUAL_128(0x201e1c1a18161412, 0x100e0c0a08060402, q5);
+ CHECK_EQUAL_128(0x1f1e1b1a17161312, 0x0f0e0b0a07060302, q6);
+ CHECK_EQUAL_128(0x21201d1c19181514, 0x11100d0c09080504, q7);
+ CHECK_EQUAL_128(0x1e1d1c1b16151413, 0x0e0d0c0b06050403, q16);
+ CHECK_EQUAL_128(0x2221201f1a191817, 0x1211100f0a090807, q17);
+ CHECK_EQUAL_128(0x1b1a191817161514, 0x0b0a090807060504, q31);
+ CHECK_EQUAL_128(0x232221201f1e1d1c, 0x131211100f0e0d0c, q0);
+
+ CHECK_EQUAL_64(src_base + 1, x17);
+ CHECK_EQUAL_64(src_base + 1 + 32, x18);
+ CHECK_EQUAL_64(src_base + 2 + 32, x19);
+ CHECK_EQUAL_64(src_base + 3 + 32, x20);
+ CHECK_EQUAL_64(src_base + 4 + 32, x21);
+
+ TEARDOWN();
+}
+
+TEST(neon_ld2_lane) {
+ INIT_V8();
+ SETUP();
+
+ uint8_t src[64];
+ for (unsigned i = 0; i < sizeof(src); i++) {
+ src[i] = i;
+ }
+ uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
+
+ START();
+
+ // Test loading whole register by element.
+ __ Mov(x17, src_base);
+ for (int i = 15; i >= 0; i--) {
+ __ Ld2(v0.B(), v1.B(), i, MemOperand(x17));
+ __ Add(x17, x17, 1);
+ }
+
+ __ Mov(x17, src_base);
+ for (int i = 7; i >= 0; i--) {
+ __ Ld2(v2.H(), v3.H(), i, MemOperand(x17));
+ __ Add(x17, x17, 1);
+ }
+
+ __ Mov(x17, src_base);
+ for (int i = 3; i >= 0; i--) {
+ __ Ld2(v4.S(), v5.S(), i, MemOperand(x17));
+ __ Add(x17, x17, 1);
+ }
+
+ __ Mov(x17, src_base);
+ for (int i = 1; i >= 0; i--) {
+ __ Ld2(v6.D(), v7.D(), i, MemOperand(x17));
+ __ Add(x17, x17, 1);
+ }
+
+ // Test loading a single element into an initialised register.
+ __ Mov(x17, src_base);
+ __ Mov(x4, x17);
+ __ Ldr(q8, MemOperand(x4, 16, PostIndex));
+ __ Ldr(q9, MemOperand(x4));
+ __ Ld2(v8_.B(), v9.B(), 4, MemOperand(x17));
+ __ Mov(x5, x17);
+ __ Ldr(q10, MemOperand(x5, 16, PostIndex));
+ __ Ldr(q11, MemOperand(x5));
+ __ Ld2(v10.H(), v11.H(), 3, MemOperand(x17));
+ __ Mov(x6, x17);
+ __ Ldr(q12, MemOperand(x6, 16, PostIndex));
+ __ Ldr(q13, MemOperand(x6));
+ __ Ld2(v12.S(), v13.S(), 2, MemOperand(x17));
+ __ Mov(x7, x17);
+ __ Ldr(q14, MemOperand(x7, 16, PostIndex));
+ __ Ldr(q15, MemOperand(x7));
+ __ Ld2(v14.D(), v15.D(), 1, MemOperand(x17));
+
+ END();
+
+ RUN();
+
+ CHECK_EQUAL_128(0x0001020304050607, 0x08090a0b0c0d0e0f, q0);
+ CHECK_EQUAL_128(0x0102030405060708, 0x090a0b0c0d0e0f10, q1);
+ CHECK_EQUAL_128(0x0100020103020403, 0x0504060507060807, q2);
+ CHECK_EQUAL_128(0x0302040305040605, 0x0706080709080a09, q3);
+ CHECK_EQUAL_128(0x0302010004030201, 0x0504030206050403, q4);
+ CHECK_EQUAL_128(0x0706050408070605, 0x090807060a090807, q5);
+ CHECK_EQUAL_128(0x0706050403020100, 0x0807060504030201, q6);
+ CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x100f0e0d0c0b0a09, q7);
+ CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0706050003020100, q8);
+ CHECK_EQUAL_128(0x1f1e1d1c1b1a1918, 0x1716150113121110, q9);
+ CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0100050403020100, q10);
+ CHECK_EQUAL_128(0x1f1e1d1c1b1a1918, 0x0302151413121110, q11);
+ CHECK_EQUAL_128(0x0f0e0d0c03020100, 0x0706050403020100, q12);
+ CHECK_EQUAL_128(0x1f1e1d1c07060504, 0x1716151413121110, q13);
+ CHECK_EQUAL_128(0x0706050403020100, 0x0706050403020100, q14);
+ CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x1716151413121110, q15);
+
+ TEARDOWN();
+}
+
+TEST(neon_ld2_lane_postindex) {
+ INIT_V8();
+ SETUP();
+
+ uint8_t src[64];
+ for (unsigned i = 0; i < sizeof(src); i++) {
+ src[i] = i;
+ }
+ uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
+
+ START();
+ __ Mov(x17, src_base);
+ __ Mov(x18, src_base);
+ __ Mov(x19, src_base);
+ __ Mov(x20, src_base);
+ __ Mov(x21, src_base);
+ __ Mov(x22, src_base);
+ __ Mov(x23, src_base);
+ __ Mov(x24, src_base);
+
+ // Test loading whole register by element.
+ for (int i = 15; i >= 0; i--) {
+ __ Ld2(v0.B(), v1.B(), i, MemOperand(x17, 2, PostIndex));
+ }
+
+ for (int i = 7; i >= 0; i--) {
+ __ Ld2(v2.H(), v3.H(), i, MemOperand(x18, 4, PostIndex));
+ }
+
+ for (int i = 3; i >= 0; i--) {
+ __ Ld2(v4.S(), v5.S(), i, MemOperand(x19, 8, PostIndex));
+ }
+
+ for (int i = 1; i >= 0; i--) {
+ __ Ld2(v6.D(), v7.D(), i, MemOperand(x20, 16, PostIndex));
+ }
+
+ // Test loading a single element into an initialised register.
+ __ Mov(x25, 1);
+ __ Mov(x4, x21);
+ __ Ldr(q8, MemOperand(x4, 16, PostIndex));
+ __ Ldr(q9, MemOperand(x4));
+ __ Ld2(v8_.B(), v9.B(), 4, MemOperand(x21, x25, PostIndex));
+ __ Add(x25, x25, 1);
+
+ __ Mov(x5, x22);
+ __ Ldr(q10, MemOperand(x5, 16, PostIndex));
+ __ Ldr(q11, MemOperand(x5));
+ __ Ld2(v10.H(), v11.H(), 3, MemOperand(x22, x25, PostIndex));
+ __ Add(x25, x25, 1);
+
+ __ Mov(x6, x23);
+ __ Ldr(q12, MemOperand(x6, 16, PostIndex));
+ __ Ldr(q13, MemOperand(x6));
+ __ Ld2(v12.S(), v13.S(), 2, MemOperand(x23, x25, PostIndex));
+ __ Add(x25, x25, 1);
+
+ __ Mov(x7, x24);
+ __ Ldr(q14, MemOperand(x7, 16, PostIndex));
+ __ Ldr(q15, MemOperand(x7));
+ __ Ld2(v14.D(), v15.D(), 1, MemOperand(x24, x25, PostIndex));
+
+ END();
+
+ RUN();
+
+ CHECK_EQUAL_128(0x00020406080a0c0e, 0x10121416181a1c1e, q0);
+ CHECK_EQUAL_128(0x01030507090b0d0f, 0x11131517191b1d1f, q1);
+ CHECK_EQUAL_128(0x0100050409080d0c, 0x1110151419181d1c, q2);
+ CHECK_EQUAL_128(0x030207060b0a0f0e, 0x131217161b1a1f1e, q3);
+ CHECK_EQUAL_128(0x030201000b0a0908, 0x131211101b1a1918, q4);
+ CHECK_EQUAL_128(0x070605040f0e0d0c, 0x171615141f1e1d1c, q5);
+ CHECK_EQUAL_128(0x0706050403020100, 0x1716151413121110, q6);
+ CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x1f1e1d1c1b1a1918, q7);
+ CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0706050003020100, q8);
+ CHECK_EQUAL_128(0x1f1e1d1c1b1a1918, 0x1716150113121110, q9);
+ CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0100050403020100, q10);
+ CHECK_EQUAL_128(0x1f1e1d1c1b1a1918, 0x0302151413121110, q11);
+ CHECK_EQUAL_128(0x0f0e0d0c03020100, 0x0706050403020100, q12);
+ CHECK_EQUAL_128(0x1f1e1d1c07060504, 0x1716151413121110, q13);
+ CHECK_EQUAL_128(0x0706050403020100, 0x0706050403020100, q14);
+ CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x1716151413121110, q15);
+
+ CHECK_EQUAL_64(src_base + 32, x17);
+ CHECK_EQUAL_64(src_base + 32, x18);
+ CHECK_EQUAL_64(src_base + 32, x19);
+ CHECK_EQUAL_64(src_base + 32, x20);
+ CHECK_EQUAL_64(src_base + 1, x21);
+ CHECK_EQUAL_64(src_base + 2, x22);
+ CHECK_EQUAL_64(src_base + 3, x23);
+ CHECK_EQUAL_64(src_base + 4, x24);
+
+ TEARDOWN();
+}
+
+TEST(neon_ld2_alllanes) {
+ INIT_V8();
+ SETUP();
+
+ uint8_t src[64];
+ for (unsigned i = 0; i < sizeof(src); i++) {
+ src[i] = i;
+ }
+ uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
+
+ START();
+ __ Mov(x17, src_base + 1);
+ __ Mov(x18, 1);
+ __ Ld2r(v0.V8B(), v1.V8B(), MemOperand(x17));
+ __ Add(x17, x17, 2);
+ __ Ld2r(v2.V16B(), v3.V16B(), MemOperand(x17));
+ __ Add(x17, x17, 1);
+ __ Ld2r(v4.V4H(), v5.V4H(), MemOperand(x17));
+ __ Add(x17, x17, 1);
+ __ Ld2r(v6.V8H(), v7.V8H(), MemOperand(x17));
+ __ Add(x17, x17, 4);
+ __ Ld2r(v8_.V2S(), v9.V2S(), MemOperand(x17));
+ __ Add(x17, x17, 1);
+ __ Ld2r(v10.V4S(), v11.V4S(), MemOperand(x17));
+ __ Add(x17, x17, 8);
+ __ Ld2r(v12.V2D(), v13.V2D(), MemOperand(x17));
+ END();
+
+ RUN();
+
+ CHECK_EQUAL_128(0x0000000000000000, 0x0101010101010101, q0);
+ CHECK_EQUAL_128(0x0000000000000000, 0x0202020202020202, q1);
+ CHECK_EQUAL_128(0x0303030303030303, 0x0303030303030303, q2);
+ CHECK_EQUAL_128(0x0404040404040404, 0x0404040404040404, q3);
+ CHECK_EQUAL_128(0x0000000000000000, 0x0504050405040504, q4);
+ CHECK_EQUAL_128(0x0000000000000000, 0x0706070607060706, q5);
+ CHECK_EQUAL_128(0x0605060506050605, 0x0605060506050605, q6);
+ CHECK_EQUAL_128(0x0807080708070807, 0x0807080708070807, q7);
+ CHECK_EQUAL_128(0x0000000000000000, 0x0c0b0a090c0b0a09, q8);
+ CHECK_EQUAL_128(0x0000000000000000, 0x100f0e0d100f0e0d, q9);
+ CHECK_EQUAL_128(0x0d0c0b0a0d0c0b0a, 0x0d0c0b0a0d0c0b0a, q10);
+ CHECK_EQUAL_128(0x11100f0e11100f0e, 0x11100f0e11100f0e, q11);
+ CHECK_EQUAL_128(0x1918171615141312, 0x1918171615141312, q12);
+ CHECK_EQUAL_128(0x21201f1e1d1c1b1a, 0x21201f1e1d1c1b1a, q13);
+
+ TEARDOWN();
+}
+
+TEST(neon_ld2_alllanes_postindex) {
+ INIT_V8();
+ SETUP();
+
+ uint8_t src[64];
+ for (unsigned i = 0; i < sizeof(src); i++) {
+ src[i] = i;
+ }
+ uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
+
+ START();
+ __ Mov(x17, src_base + 1);
+ __ Mov(x18, 1);
+ __ Ld2r(v0.V8B(), v1.V8B(), MemOperand(x17, 2, PostIndex));
+ __ Ld2r(v2.V16B(), v3.V16B(), MemOperand(x17, x18, PostIndex));
+ __ Ld2r(v4.V4H(), v5.V4H(), MemOperand(x17, x18, PostIndex));
+ __ Ld2r(v6.V8H(), v7.V8H(), MemOperand(x17, 4, PostIndex));
+ __ Ld2r(v8_.V2S(), v9.V2S(), MemOperand(x17, x18, PostIndex));
+ __ Ld2r(v10.V4S(), v11.V4S(), MemOperand(x17, 8, PostIndex));
+ __ Ld2r(v12.V2D(), v13.V2D(), MemOperand(x17, 16, PostIndex));
+ END();
+
+ RUN();
+
+ CHECK_EQUAL_128(0x0000000000000000, 0x0101010101010101, q0);
+ CHECK_EQUAL_128(0x0000000000000000, 0x0202020202020202, q1);
+ CHECK_EQUAL_128(0x0303030303030303, 0x0303030303030303, q2);
+ CHECK_EQUAL_128(0x0404040404040404, 0x0404040404040404, q3);
+ CHECK_EQUAL_128(0x0000000000000000, 0x0504050405040504, q4);
+ CHECK_EQUAL_128(0x0000000000000000, 0x0706070607060706, q5);
+ CHECK_EQUAL_128(0x0605060506050605, 0x0605060506050605, q6);
+ CHECK_EQUAL_128(0x0807080708070807, 0x0807080708070807, q7);
+ CHECK_EQUAL_128(0x0000000000000000, 0x0c0b0a090c0b0a09, q8);
+ CHECK_EQUAL_128(0x0000000000000000, 0x100f0e0d100f0e0d, q9);
+ CHECK_EQUAL_128(0x0d0c0b0a0d0c0b0a, 0x0d0c0b0a0d0c0b0a, q10);
+ CHECK_EQUAL_128(0x11100f0e11100f0e, 0x11100f0e11100f0e, q11);
+ CHECK_EQUAL_128(0x1918171615141312, 0x1918171615141312, q12);
+ CHECK_EQUAL_128(0x21201f1e1d1c1b1a, 0x21201f1e1d1c1b1a, q13);
+ CHECK_EQUAL_64(src_base + 34, x17);
+
+ TEARDOWN();
+}
+
+TEST(neon_ld3_d) {
+ INIT_V8();
+ SETUP();
+
+ uint8_t src[64 + 4];
+ for (unsigned i = 0; i < sizeof(src); i++) {
+ src[i] = i;
+ }
+ uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
+
+ START();
+ __ Mov(x17, src_base);
+ __ Ld3(v2.V8B(), v3.V8B(), v4.V8B(), MemOperand(x17));
+ __ Add(x17, x17, 1);
+ __ Ld3(v5.V8B(), v6.V8B(), v7.V8B(), MemOperand(x17));
+ __ Add(x17, x17, 1);
+ __ Ld3(v8_.V4H(), v9.V4H(), v10.V4H(), MemOperand(x17));
+ __ Add(x17, x17, 1);
+ __ Ld3(v31.V2S(), v0.V2S(), v1.V2S(), MemOperand(x17));
+ END();
+
+ RUN();
+
+ CHECK_EQUAL_128(0, 0x15120f0c09060300, q2);
+ CHECK_EQUAL_128(0, 0x1613100d0a070401, q3);
+ CHECK_EQUAL_128(0, 0x1714110e0b080502, q4);
+ CHECK_EQUAL_128(0, 0x1613100d0a070401, q5);
+ CHECK_EQUAL_128(0, 0x1714110e0b080502, q6);
+ CHECK_EQUAL_128(0, 0x1815120f0c090603, q7);
+ CHECK_EQUAL_128(0, 0x15140f0e09080302, q8);
+ CHECK_EQUAL_128(0, 0x171611100b0a0504, q9);
+ CHECK_EQUAL_128(0, 0x191813120d0c0706, q10);
+ CHECK_EQUAL_128(0, 0x1211100f06050403, q31);
+ CHECK_EQUAL_128(0, 0x161514130a090807, q0);
+ CHECK_EQUAL_128(0, 0x1a1918170e0d0c0b, q1);
+
+ TEARDOWN();
+}
+
+TEST(neon_ld3_d_postindex) {
+ INIT_V8();
+ SETUP();
+
+ uint8_t src[32 + 4];
+ for (unsigned i = 0; i < sizeof(src); i++) {
+ src[i] = i;
+ }
+ uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
+
+ START();
+ __ Mov(x17, src_base);
+ __ Mov(x18, src_base + 1);
+ __ Mov(x19, src_base + 2);
+ __ Mov(x20, src_base + 3);
+ __ Mov(x21, src_base + 4);
+ __ Mov(x22, 1);
+ __ Ld3(v2.V8B(), v3.V8B(), v4.V8B(), MemOperand(x17, x22, PostIndex));
+ __ Ld3(v5.V8B(), v6.V8B(), v7.V8B(), MemOperand(x18, 24, PostIndex));
+ __ Ld3(v8_.V4H(), v9.V4H(), v10.V4H(), MemOperand(x19, 24, PostIndex));
+ __ Ld3(v11.V2S(), v12.V2S(), v13.V2S(), MemOperand(x20, 24, PostIndex));
+ __ Ld3(v31.V2S(), v0.V2S(), v1.V2S(), MemOperand(x21, 24, PostIndex));
+ END();
+
+ RUN();
+
+ CHECK_EQUAL_128(0, 0x15120f0c09060300, q2);
+ CHECK_EQUAL_128(0, 0x1613100d0a070401, q3);
+ CHECK_EQUAL_128(0, 0x1714110e0b080502, q4);
+ CHECK_EQUAL_128(0, 0x1613100d0a070401, q5);
+ CHECK_EQUAL_128(0, 0x1714110e0b080502, q6);
+ CHECK_EQUAL_128(0, 0x1815120f0c090603, q7);
+ CHECK_EQUAL_128(0, 0x15140f0e09080302, q8);
+ CHECK_EQUAL_128(0, 0x171611100b0a0504, q9);
+ CHECK_EQUAL_128(0, 0x191813120d0c0706, q10);
+ CHECK_EQUAL_128(0, 0x1211100f06050403, q11);
+ CHECK_EQUAL_128(0, 0x161514130a090807, q12);
+ CHECK_EQUAL_128(0, 0x1a1918170e0d0c0b, q13);
+ CHECK_EQUAL_128(0, 0x1312111007060504, q31);
+ CHECK_EQUAL_128(0, 0x171615140b0a0908, q0);
+ CHECK_EQUAL_128(0, 0x1b1a19180f0e0d0c, q1);
+
+ CHECK_EQUAL_64(src_base + 1, x17);
+ CHECK_EQUAL_64(src_base + 1 + 24, x18);
+ CHECK_EQUAL_64(src_base + 2 + 24, x19);
+ CHECK_EQUAL_64(src_base + 3 + 24, x20);
+ CHECK_EQUAL_64(src_base + 4 + 24, x21);
+
+ TEARDOWN();
+}
+
+TEST(neon_ld3_q) {
+ INIT_V8();
+ SETUP();
+
+ uint8_t src[64 + 4];
+ for (unsigned i = 0; i < sizeof(src); i++) {
+ src[i] = i;
+ }
+ uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
+
+ START();
+ __ Mov(x17, src_base);
+ __ Ld3(v2.V16B(), v3.V16B(), v4.V16B(), MemOperand(x17));
+ __ Add(x17, x17, 1);
+ __ Ld3(v5.V16B(), v6.V16B(), v7.V16B(), MemOperand(x17));
+ __ Add(x17, x17, 1);
+ __ Ld3(v8_.V8H(), v9.V8H(), v10.V8H(), MemOperand(x17));
+ __ Add(x17, x17, 1);
+ __ Ld3(v11.V4S(), v12.V4S(), v13.V4S(), MemOperand(x17));
+ __ Add(x17, x17, 1);
+ __ Ld3(v31.V2D(), v0.V2D(), v1.V2D(), MemOperand(x17));
+ END();
+
+ RUN();
+
+ CHECK_EQUAL_128(0x2d2a2724211e1b18, 0x15120f0c09060300, q2);
+ CHECK_EQUAL_128(0x2e2b2825221f1c19, 0x1613100d0a070401, q3);
+ CHECK_EQUAL_128(0x2f2c292623201d1a, 0x1714110e0b080502, q4);
+ CHECK_EQUAL_128(0x2e2b2825221f1c19, 0x1613100d0a070401, q5);
+ CHECK_EQUAL_128(0x2f2c292623201d1a, 0x1714110e0b080502, q6);
+ CHECK_EQUAL_128(0x302d2a2724211e1b, 0x1815120f0c090603, q7);
+ CHECK_EQUAL_128(0x2d2c272621201b1a, 0x15140f0e09080302, q8);
+ CHECK_EQUAL_128(0x2f2e292823221d1c, 0x171611100b0a0504, q9);
+ CHECK_EQUAL_128(0x31302b2a25241f1e, 0x191813120d0c0706, q10);
+ CHECK_EQUAL_128(0x2a2928271e1d1c1b, 0x1211100f06050403, q11);
+ CHECK_EQUAL_128(0x2e2d2c2b2221201f, 0x161514130a090807, q12);
+ CHECK_EQUAL_128(0x3231302f26252423, 0x1a1918170e0d0c0b, q13);
+ CHECK_EQUAL_128(0x232221201f1e1d1c, 0x0b0a090807060504, q31);
+ CHECK_EQUAL_128(0x2b2a292827262524, 0x131211100f0e0d0c, q0);
+ CHECK_EQUAL_128(0x333231302f2e2d2c, 0x1b1a191817161514, q1);
+
+ TEARDOWN();
+}
+
+TEST(neon_ld3_q_postindex) {
+ INIT_V8();
+ SETUP();
+
+ uint8_t src[64 + 4];
+ for (unsigned i = 0; i < sizeof(src); i++) {
+ src[i] = i;
+ }
+ uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
+
+ START();
+ __ Mov(x17, src_base);
+ __ Mov(x18, src_base + 1);
+ __ Mov(x19, src_base + 2);
+ __ Mov(x20, src_base + 3);
+ __ Mov(x21, src_base + 4);
+ __ Mov(x22, 1);
+
+ __ Ld3(v2.V16B(), v3.V16B(), v4.V16B(), MemOperand(x17, x22, PostIndex));
+ __ Ld3(v5.V16B(), v6.V16B(), v7.V16B(), MemOperand(x18, 48, PostIndex));
+ __ Ld3(v8_.V8H(), v9.V8H(), v10.V8H(), MemOperand(x19, 48, PostIndex));
+ __ Ld3(v11.V4S(), v12.V4S(), v13.V4S(), MemOperand(x20, 48, PostIndex));
+ __ Ld3(v31.V2D(), v0.V2D(), v1.V2D(), MemOperand(x21, 48, PostIndex));
+ END();
+
+ RUN();
+
+ CHECK_EQUAL_128(0x2d2a2724211e1b18, 0x15120f0c09060300, q2);
+ CHECK_EQUAL_128(0x2e2b2825221f1c19, 0x1613100d0a070401, q3);
+ CHECK_EQUAL_128(0x2f2c292623201d1a, 0x1714110e0b080502, q4);
+ CHECK_EQUAL_128(0x2e2b2825221f1c19, 0x1613100d0a070401, q5);
+ CHECK_EQUAL_128(0x2f2c292623201d1a, 0x1714110e0b080502, q6);
+ CHECK_EQUAL_128(0x302d2a2724211e1b, 0x1815120f0c090603, q7);
+ CHECK_EQUAL_128(0x2d2c272621201b1a, 0x15140f0e09080302, q8);
+ CHECK_EQUAL_128(0x2f2e292823221d1c, 0x171611100b0a0504, q9);
+ CHECK_EQUAL_128(0x31302b2a25241f1e, 0x191813120d0c0706, q10);
+ CHECK_EQUAL_128(0x2a2928271e1d1c1b, 0x1211100f06050403, q11);
+ CHECK_EQUAL_128(0x2e2d2c2b2221201f, 0x161514130a090807, q12);
+ CHECK_EQUAL_128(0x3231302f26252423, 0x1a1918170e0d0c0b, q13);
+ CHECK_EQUAL_128(0x232221201f1e1d1c, 0x0b0a090807060504, q31);
+ CHECK_EQUAL_128(0x2b2a292827262524, 0x131211100f0e0d0c, q0);
+ CHECK_EQUAL_128(0x333231302f2e2d2c, 0x1b1a191817161514, q1);
+
+ CHECK_EQUAL_64(src_base + 1, x17);
+ CHECK_EQUAL_64(src_base + 1 + 48, x18);
+ CHECK_EQUAL_64(src_base + 2 + 48, x19);
+ CHECK_EQUAL_64(src_base + 3 + 48, x20);
+ CHECK_EQUAL_64(src_base + 4 + 48, x21);
+
+ TEARDOWN();
+}
+
+TEST(neon_ld3_lane) {
+ INIT_V8();
+ SETUP();
+
+ uint8_t src[64];
+ for (unsigned i = 0; i < sizeof(src); i++) {
+ src[i] = i;
+ }
+ uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
+
+ START();
+
+ // Test loading whole register by element.
+ __ Mov(x17, src_base);
+ for (int i = 15; i >= 0; i--) {
+ __ Ld3(v0.B(), v1.B(), v2.B(), i, MemOperand(x17));
+ __ Add(x17, x17, 1);
+ }
+
+ __ Mov(x17, src_base);
+ for (int i = 7; i >= 0; i--) {
+ __ Ld3(v3.H(), v4.H(), v5.H(), i, MemOperand(x17));
+ __ Add(x17, x17, 1);
+ }
+
+ __ Mov(x17, src_base);
+ for (int i = 3; i >= 0; i--) {
+ __ Ld3(v6.S(), v7.S(), v8_.S(), i, MemOperand(x17));
+ __ Add(x17, x17, 1);
+ }
+
+ __ Mov(x17, src_base);
+ for (int i = 1; i >= 0; i--) {
+ __ Ld3(v9.D(), v10.D(), v11.D(), i, MemOperand(x17));
+ __ Add(x17, x17, 1);
+ }
+
+ // Test loading a single element into an initialised register.
+ __ Mov(x17, src_base);
+ __ Mov(x4, x17);
+ __ Ldr(q12, MemOperand(x4, 16, PostIndex));
+ __ Ldr(q13, MemOperand(x4, 16, PostIndex));
+ __ Ldr(q14, MemOperand(x4));
+ __ Ld3(v12.B(), v13.B(), v14.B(), 4, MemOperand(x17));
+ __ Mov(x5, x17);
+ __ Ldr(q15, MemOperand(x5, 16, PostIndex));
+ __ Ldr(q16, MemOperand(x5, 16, PostIndex));
+ __ Ldr(q17, MemOperand(x5));
+ __ Ld3(v15.H(), v16.H(), v17.H(), 3, MemOperand(x17));
+ __ Mov(x6, x17);
+ __ Ldr(q18, MemOperand(x6, 16, PostIndex));
+ __ Ldr(q19, MemOperand(x6, 16, PostIndex));
+ __ Ldr(q20, MemOperand(x6));
+ __ Ld3(v18.S(), v19.S(), v20.S(), 2, MemOperand(x17));
+ __ Mov(x7, x17);
+ __ Ldr(q21, MemOperand(x7, 16, PostIndex));
+ __ Ldr(q22, MemOperand(x7, 16, PostIndex));
+ __ Ldr(q23, MemOperand(x7));
+ __ Ld3(v21.D(), v22.D(), v23.D(), 1, MemOperand(x17));
+
+ END();
+
+ RUN();
+
+ CHECK_EQUAL_128(0x0001020304050607, 0x08090a0b0c0d0e0f, q0);
+ CHECK_EQUAL_128(0x0102030405060708, 0x090a0b0c0d0e0f10, q1);
+ CHECK_EQUAL_128(0x0203040506070809, 0x0a0b0c0d0e0f1011, q2);
+ CHECK_EQUAL_128(0x0100020103020403, 0x0504060507060807, q3);
+ CHECK_EQUAL_128(0x0302040305040605, 0x0706080709080a09, q4);
+ CHECK_EQUAL_128(0x0504060507060807, 0x09080a090b0a0c0b, q5);
+ CHECK_EQUAL_128(0x0302010004030201, 0x0504030206050403, q6);
+ CHECK_EQUAL_128(0x0706050408070605, 0x090807060a090807, q7);
+ CHECK_EQUAL_128(0x0b0a09080c0b0a09, 0x0d0c0b0a0e0d0c0b, q8);
+ CHECK_EQUAL_128(0x0706050403020100, 0x0807060504030201, q9);
+ CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x100f0e0d0c0b0a09, q10);
+ CHECK_EQUAL_128(0x1716151413121110, 0x1817161514131211, q11);
+ CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0706050003020100, q12);
+ CHECK_EQUAL_128(0x1f1e1d1c1b1a1918, 0x1716150113121110, q13);
+ CHECK_EQUAL_128(0x2f2e2d2c2b2a2928, 0x2726250223222120, q14);
+ CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0100050403020100, q15);
+ CHECK_EQUAL_128(0x1f1e1d1c1b1a1918, 0x0302151413121110, q16);
+ CHECK_EQUAL_128(0x2f2e2d2c2b2a2928, 0x0504252423222120, q17);
+
+ TEARDOWN();
+}
+
+TEST(neon_ld3_lane_postindex) {
+ INIT_V8();
+ SETUP();
+
+ uint8_t src[64];
+ for (unsigned i = 0; i < sizeof(src); i++) {
+ src[i] = i;
+ }
+ uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
+
+ START();
+
+ // Test loading whole register by element.
+ __ Mov(x17, src_base);
+ __ Mov(x18, src_base);
+ __ Mov(x19, src_base);
+ __ Mov(x20, src_base);
+ __ Mov(x21, src_base);
+ __ Mov(x22, src_base);
+ __ Mov(x23, src_base);
+ __ Mov(x24, src_base);
+ for (int i = 15; i >= 0; i--) {
+ __ Ld3(v0.B(), v1.B(), v2.B(), i, MemOperand(x17, 3, PostIndex));
+ }
+
+ for (int i = 7; i >= 0; i--) {
+ __ Ld3(v3.H(), v4.H(), v5.H(), i, MemOperand(x18, 6, PostIndex));
+ }
+
+ for (int i = 3; i >= 0; i--) {
+ __ Ld3(v6.S(), v7.S(), v8_.S(), i, MemOperand(x19, 12, PostIndex));
+ }
+
+ for (int i = 1; i >= 0; i--) {
+ __ Ld3(v9.D(), v10.D(), v11.D(), i, MemOperand(x20, 24, PostIndex));
+ }
+
+ // Test loading a single element into an initialised register.
+ __ Mov(x25, 1);
+ __ Mov(x4, x21);
+ __ Ldr(q12, MemOperand(x4, 16, PostIndex));
+ __ Ldr(q13, MemOperand(x4, 16, PostIndex));
+ __ Ldr(q14, MemOperand(x4));
+ __ Ld3(v12.B(), v13.B(), v14.B(), 4, MemOperand(x21, x25, PostIndex));
+ __ Add(x25, x25, 1);
+
+ __ Mov(x5, x22);
+ __ Ldr(q15, MemOperand(x5, 16, PostIndex));
+ __ Ldr(q16, MemOperand(x5, 16, PostIndex));
+ __ Ldr(q17, MemOperand(x5));
+ __ Ld3(v15.H(), v16.H(), v17.H(), 3, MemOperand(x22, x25, PostIndex));
+ __ Add(x25, x25, 1);
+
+ __ Mov(x6, x23);
+ __ Ldr(q18, MemOperand(x6, 16, PostIndex));
+ __ Ldr(q19, MemOperand(x6, 16, PostIndex));
+ __ Ldr(q20, MemOperand(x6));
+ __ Ld3(v18.S(), v19.S(), v20.S(), 2, MemOperand(x23, x25, PostIndex));
+ __ Add(x25, x25, 1);
+
+ __ Mov(x7, x24);
+ __ Ldr(q21, MemOperand(x7, 16, PostIndex));
+ __ Ldr(q22, MemOperand(x7, 16, PostIndex));
+ __ Ldr(q23, MemOperand(x7));
+ __ Ld3(v21.D(), v22.D(), v23.D(), 1, MemOperand(x24, x25, PostIndex));
+
+ END();
+
+ RUN();
+
+ CHECK_EQUAL_128(0x000306090c0f1215, 0x181b1e2124272a2d, q0);
+ CHECK_EQUAL_128(0x0104070a0d101316, 0x191c1f2225282b2e, q1);
+ CHECK_EQUAL_128(0x0205080b0e111417, 0x1a1d202326292c2f, q2);
+ CHECK_EQUAL_128(0x010007060d0c1312, 0x19181f1e25242b2a, q3);
+ CHECK_EQUAL_128(0x030209080f0e1514, 0x1b1a212027262d2c, q4);
+ CHECK_EQUAL_128(0x05040b0a11101716, 0x1d1c232229282f2e, q5);
+ CHECK_EQUAL_128(0x030201000f0e0d0c, 0x1b1a191827262524, q6);
+ CHECK_EQUAL_128(0x0706050413121110, 0x1f1e1d1c2b2a2928, q7);
+ CHECK_EQUAL_128(0x0b0a090817161514, 0x232221202f2e2d2c, q8);
+ CHECK_EQUAL_128(0x0706050403020100, 0x1f1e1d1c1b1a1918, q9);
+ CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x2726252423222120, q10);
+ CHECK_EQUAL_128(0x1716151413121110, 0x2f2e2d2c2b2a2928, q11);
+ CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0706050003020100, q12);
+ CHECK_EQUAL_128(0x1f1e1d1c1b1a1918, 0x1716150113121110, q13);
+ CHECK_EQUAL_128(0x2f2e2d2c2b2a2928, 0x2726250223222120, q14);
+ CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0100050403020100, q15);
+ CHECK_EQUAL_128(0x1f1e1d1c1b1a1918, 0x0302151413121110, q16);
+ CHECK_EQUAL_128(0x2f2e2d2c2b2a2928, 0x0504252423222120, q17);
+ CHECK_EQUAL_128(0x0f0e0d0c03020100, 0x0706050403020100, q18);
+ CHECK_EQUAL_128(0x1f1e1d1c07060504, 0x1716151413121110, q19);
+ CHECK_EQUAL_128(0x2f2e2d2c0b0a0908, 0x2726252423222120, q20);
+ CHECK_EQUAL_128(0x0706050403020100, 0x0706050403020100, q21);
+ CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x1716151413121110, q22);
+ CHECK_EQUAL_128(0x1716151413121110, 0x2726252423222120, q23);
+
+ CHECK_EQUAL_64(src_base + 48, x17);
+ CHECK_EQUAL_64(src_base + 48, x18);
+ CHECK_EQUAL_64(src_base + 48, x19);
+ CHECK_EQUAL_64(src_base + 48, x20);
+ CHECK_EQUAL_64(src_base + 1, x21);
+ CHECK_EQUAL_64(src_base + 2, x22);
+ CHECK_EQUAL_64(src_base + 3, x23);
+ CHECK_EQUAL_64(src_base + 4, x24);
+
+ TEARDOWN();
+}
+
+TEST(neon_ld3_alllanes) {
+ INIT_V8();
+ SETUP();
+
+ uint8_t src[64];
+ for (unsigned i = 0; i < sizeof(src); i++) {
+ src[i] = i;
+ }
+ uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
+
+ START();
+ __ Mov(x17, src_base + 1);
+ __ Mov(x18, 1);
+ __ Ld3r(v0.V8B(), v1.V8B(), v2.V8B(), MemOperand(x17));
+ __ Add(x17, x17, 3);
+ __ Ld3r(v3.V16B(), v4.V16B(), v5.V16B(), MemOperand(x17));
+ __ Add(x17, x17, 1);
+ __ Ld3r(v6.V4H(), v7.V4H(), v8_.V4H(), MemOperand(x17));
+ __ Add(x17, x17, 1);
+ __ Ld3r(v9.V8H(), v10.V8H(), v11.V8H(), MemOperand(x17));
+ __ Add(x17, x17, 6);
+ __ Ld3r(v12.V2S(), v13.V2S(), v14.V2S(), MemOperand(x17));
+ __ Add(x17, x17, 1);
+ __ Ld3r(v15.V4S(), v16.V4S(), v17.V4S(), MemOperand(x17));
+ __ Add(x17, x17, 12);
+ __ Ld3r(v18.V2D(), v19.V2D(), v20.V2D(), MemOperand(x17));
+ END();
+
+ RUN();
+
+ CHECK_EQUAL_128(0x0000000000000000, 0x0101010101010101, q0);
+ CHECK_EQUAL_128(0x0000000000000000, 0x0202020202020202, q1);
+ CHECK_EQUAL_128(0x0000000000000000, 0x0303030303030303, q2);
+ CHECK_EQUAL_128(0x0404040404040404, 0x0404040404040404, q3);
+ CHECK_EQUAL_128(0x0505050505050505, 0x0505050505050505, q4);
+ CHECK_EQUAL_128(0x0606060606060606, 0x0606060606060606, q5);
+ CHECK_EQUAL_128(0x0000000000000000, 0x0605060506050605, q6);
+ CHECK_EQUAL_128(0x0000000000000000, 0x0807080708070807, q7);
+ CHECK_EQUAL_128(0x0000000000000000, 0x0a090a090a090a09, q8);
+ CHECK_EQUAL_128(0x0706070607060706, 0x0706070607060706, q9);
+ CHECK_EQUAL_128(0x0908090809080908, 0x0908090809080908, q10);
+ CHECK_EQUAL_128(0x0b0a0b0a0b0a0b0a, 0x0b0a0b0a0b0a0b0a, q11);
+ CHECK_EQUAL_128(0x0000000000000000, 0x0f0e0d0c0f0e0d0c, q12);
+ CHECK_EQUAL_128(0x0000000000000000, 0x1312111013121110, q13);
+ CHECK_EQUAL_128(0x0000000000000000, 0x1716151417161514, q14);
+ CHECK_EQUAL_128(0x100f0e0d100f0e0d, 0x100f0e0d100f0e0d, q15);
+ CHECK_EQUAL_128(0x1413121114131211, 0x1413121114131211, q16);
+ CHECK_EQUAL_128(0x1817161518171615, 0x1817161518171615, q17);
+ CHECK_EQUAL_128(0x201f1e1d1c1b1a19, 0x201f1e1d1c1b1a19, q18);
+ CHECK_EQUAL_128(0x2827262524232221, 0x2827262524232221, q19);
+ CHECK_EQUAL_128(0x302f2e2d2c2b2a29, 0x302f2e2d2c2b2a29, q20);
+
+ TEARDOWN();
+}
+
+TEST(neon_ld3_alllanes_postindex) {
+ INIT_V8();
+ SETUP();
+
+ uint8_t src[64];
+ for (unsigned i = 0; i < sizeof(src); i++) {
+ src[i] = i;
+ }
+ uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
+ __ Mov(x17, src_base + 1);
+ __ Mov(x18, 1);
+
+ START();
+ __ Mov(x17, src_base + 1);
+ __ Mov(x18, 1);
+ __ Ld3r(v0.V8B(), v1.V8B(), v2.V8B(), MemOperand(x17, 3, PostIndex));
+ __ Ld3r(v3.V16B(), v4.V16B(), v5.V16B(), MemOperand(x17, x18, PostIndex));
+ __ Ld3r(v6.V4H(), v7.V4H(), v8_.V4H(), MemOperand(x17, x18, PostIndex));
+ __ Ld3r(v9.V8H(), v10.V8H(), v11.V8H(), MemOperand(x17, 6, PostIndex));
+ __ Ld3r(v12.V2S(), v13.V2S(), v14.V2S(), MemOperand(x17, x18, PostIndex));
+ __ Ld3r(v15.V4S(), v16.V4S(), v17.V4S(), MemOperand(x17, 12, PostIndex));
+ __ Ld3r(v18.V2D(), v19.V2D(), v20.V2D(), MemOperand(x17, 24, PostIndex));
+ END();
+
+ RUN();
+
+ CHECK_EQUAL_128(0x0000000000000000, 0x0101010101010101, q0);
+ CHECK_EQUAL_128(0x0000000000000000, 0x0202020202020202, q1);
+ CHECK_EQUAL_128(0x0000000000000000, 0x0303030303030303, q2);
+ CHECK_EQUAL_128(0x0404040404040404, 0x0404040404040404, q3);
+ CHECK_EQUAL_128(0x0505050505050505, 0x0505050505050505, q4);
+ CHECK_EQUAL_128(0x0606060606060606, 0x0606060606060606, q5);
+ CHECK_EQUAL_128(0x0000000000000000, 0x0605060506050605, q6);
+ CHECK_EQUAL_128(0x0000000000000000, 0x0807080708070807, q7);
+ CHECK_EQUAL_128(0x0000000000000000, 0x0a090a090a090a09, q8);
+ CHECK_EQUAL_128(0x0706070607060706, 0x0706070607060706, q9);
+ CHECK_EQUAL_128(0x0908090809080908, 0x0908090809080908, q10);
+ CHECK_EQUAL_128(0x0b0a0b0a0b0a0b0a, 0x0b0a0b0a0b0a0b0a, q11);
+ CHECK_EQUAL_128(0x0000000000000000, 0x0f0e0d0c0f0e0d0c, q12);
+ CHECK_EQUAL_128(0x0000000000000000, 0x1312111013121110, q13);
+ CHECK_EQUAL_128(0x0000000000000000, 0x1716151417161514, q14);
+ CHECK_EQUAL_128(0x100f0e0d100f0e0d, 0x100f0e0d100f0e0d, q15);
+ CHECK_EQUAL_128(0x1413121114131211, 0x1413121114131211, q16);
+ CHECK_EQUAL_128(0x1817161518171615, 0x1817161518171615, q17);
+ CHECK_EQUAL_128(0x201f1e1d1c1b1a19, 0x201f1e1d1c1b1a19, q18);
+ CHECK_EQUAL_128(0x2827262524232221, 0x2827262524232221, q19);
+ CHECK_EQUAL_128(0x302f2e2d2c2b2a29, 0x302f2e2d2c2b2a29, q20);
+
+ TEARDOWN();
+}
+
+TEST(neon_ld4_d) {
+ INIT_V8();
+ SETUP();
+
+ uint8_t src[64 + 4];
+ for (unsigned i = 0; i < sizeof(src); i++) {
+ src[i] = i;
+ }
+ uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
+
+ START();
+ __ Mov(x17, src_base);
+ __ Ld4(v2.V8B(), v3.V8B(), v4.V8B(), v5.V8B(), MemOperand(x17));
+ __ Add(x17, x17, 1);
+ __ Ld4(v6.V8B(), v7.V8B(), v8_.V8B(), v9.V8B(), MemOperand(x17));
+ __ Add(x17, x17, 1);
+ __ Ld4(v10.V4H(), v11.V4H(), v12.V4H(), v13.V4H(), MemOperand(x17));
+ __ Add(x17, x17, 1);
+ __ Ld4(v30.V2S(), v31.V2S(), v0.V2S(), v1.V2S(), MemOperand(x17));
+ END();
+
+ RUN();
+
+ CHECK_EQUAL_128(0, 0x1c1814100c080400, q2);
+ CHECK_EQUAL_128(0, 0x1d1915110d090501, q3);
+ CHECK_EQUAL_128(0, 0x1e1a16120e0a0602, q4);
+ CHECK_EQUAL_128(0, 0x1f1b17130f0b0703, q5);
+ CHECK_EQUAL_128(0, 0x1d1915110d090501, q6);
+ CHECK_EQUAL_128(0, 0x1e1a16120e0a0602, q7);
+ CHECK_EQUAL_128(0, 0x1f1b17130f0b0703, q8);
+ CHECK_EQUAL_128(0, 0x201c1814100c0804, q9);
+ CHECK_EQUAL_128(0, 0x1b1a13120b0a0302, q10);
+ CHECK_EQUAL_128(0, 0x1d1c15140d0c0504, q11);
+ CHECK_EQUAL_128(0, 0x1f1e17160f0e0706, q12);
+ CHECK_EQUAL_128(0, 0x2120191811100908, q13);
+ CHECK_EQUAL_128(0, 0x1615141306050403, q30);
+ CHECK_EQUAL_128(0, 0x1a1918170a090807, q31);
+ CHECK_EQUAL_128(0, 0x1e1d1c1b0e0d0c0b, q0);
+ CHECK_EQUAL_128(0, 0x2221201f1211100f, q1);
+
+ TEARDOWN();
+}
+
+TEST(neon_ld4_d_postindex) {
+ INIT_V8();
+ SETUP();
+
+ uint8_t src[32 + 4];
+ for (unsigned i = 0; i < sizeof(src); i++) {
+ src[i] = i;
+ }
+ uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
+
+ START();
+ __ Mov(x17, src_base);
+ __ Mov(x18, src_base + 1);
+ __ Mov(x19, src_base + 2);
+ __ Mov(x20, src_base + 3);
+ __ Mov(x21, src_base + 4);
+ __ Mov(x22, 1);
+ __ Ld4(v2.V8B(), v3.V8B(), v4.V8B(), v5.V8B(),
+ MemOperand(x17, x22, PostIndex));
+ __ Ld4(v6.V8B(), v7.V8B(), v8_.V8B(), v9.V8B(),
+ MemOperand(x18, 32, PostIndex));
+ __ Ld4(v10.V4H(), v11.V4H(), v12.V4H(), v13.V4H(),
+ MemOperand(x19, 32, PostIndex));
+ __ Ld4(v14.V2S(), v15.V2S(), v16.V2S(), v17.V2S(),
+ MemOperand(x20, 32, PostIndex));
+ __ Ld4(v30.V2S(), v31.V2S(), v0.V2S(), v1.V2S(),
+ MemOperand(x21, 32, PostIndex));
+ END();
+
+ RUN();
+
+ CHECK_EQUAL_128(0, 0x1c1814100c080400, q2);
+ CHECK_EQUAL_128(0, 0x1d1915110d090501, q3);
+ CHECK_EQUAL_128(0, 0x1e1a16120e0a0602, q4);
+ CHECK_EQUAL_128(0, 0x1f1b17130f0b0703, q5);
+ CHECK_EQUAL_128(0, 0x1d1915110d090501, q6);
+ CHECK_EQUAL_128(0, 0x1e1a16120e0a0602, q7);
+ CHECK_EQUAL_128(0, 0x1f1b17130f0b0703, q8);
+ CHECK_EQUAL_128(0, 0x201c1814100c0804, q9);
+ CHECK_EQUAL_128(0, 0x1b1a13120b0a0302, q10);
+ CHECK_EQUAL_128(0, 0x1d1c15140d0c0504, q11);
+ CHECK_EQUAL_128(0, 0x1f1e17160f0e0706, q12);
+ CHECK_EQUAL_128(0, 0x2120191811100908, q13);
+ CHECK_EQUAL_128(0, 0x1615141306050403, q14);
+ CHECK_EQUAL_128(0, 0x1a1918170a090807, q15);
+ CHECK_EQUAL_128(0, 0x1e1d1c1b0e0d0c0b, q16);
+ CHECK_EQUAL_128(0, 0x2221201f1211100f, q17);
+ CHECK_EQUAL_128(0, 0x1716151407060504, q30);
+ CHECK_EQUAL_128(0, 0x1b1a19180b0a0908, q31);
+ CHECK_EQUAL_128(0, 0x1f1e1d1c0f0e0d0c, q0);
+ CHECK_EQUAL_128(0, 0x2322212013121110, q1);
+
+ CHECK_EQUAL_64(src_base + 1, x17);
+ CHECK_EQUAL_64(src_base + 1 + 32, x18);
+ CHECK_EQUAL_64(src_base + 2 + 32, x19);
+ CHECK_EQUAL_64(src_base + 3 + 32, x20);
+ CHECK_EQUAL_64(src_base + 4 + 32, x21);
+ TEARDOWN();
+}
+
+TEST(neon_ld4_q) {
+ INIT_V8();
+ SETUP();
+
+ uint8_t src[64 + 4];
+ for (unsigned i = 0; i < sizeof(src); i++) {
+ src[i] = i;
+ }
+ uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
+
+ START();
+ __ Mov(x17, src_base);
+ __ Ld4(v2.V16B(), v3.V16B(), v4.V16B(), v5.V16B(), MemOperand(x17));
+ __ Add(x17, x17, 1);
+ __ Ld4(v6.V16B(), v7.V16B(), v8_.V16B(), v9.V16B(), MemOperand(x17));
+ __ Add(x17, x17, 1);
+ __ Ld4(v10.V8H(), v11.V8H(), v12.V8H(), v13.V8H(), MemOperand(x17));
+ __ Add(x17, x17, 1);
+ __ Ld4(v14.V4S(), v15.V4S(), v16.V4S(), v17.V4S(), MemOperand(x17));
+ __ Add(x17, x17, 1);
+ __ Ld4(v18.V2D(), v19.V2D(), v20.V2D(), v21.V2D(), MemOperand(x17));
+ END();
+
+ RUN();
+
+ CHECK_EQUAL_128(0x3c3834302c282420, 0x1c1814100c080400, q2);
+ CHECK_EQUAL_128(0x3d3935312d292521, 0x1d1915110d090501, q3);
+ CHECK_EQUAL_128(0x3e3a36322e2a2622, 0x1e1a16120e0a0602, q4);
+ CHECK_EQUAL_128(0x3f3b37332f2b2723, 0x1f1b17130f0b0703, q5);
+ CHECK_EQUAL_128(0x3d3935312d292521, 0x1d1915110d090501, q6);
+ CHECK_EQUAL_128(0x3e3a36322e2a2622, 0x1e1a16120e0a0602, q7);
+ CHECK_EQUAL_128(0x3f3b37332f2b2723, 0x1f1b17130f0b0703, q8);
+ CHECK_EQUAL_128(0x403c3834302c2824, 0x201c1814100c0804, q9);
+ CHECK_EQUAL_128(0x3b3a33322b2a2322, 0x1b1a13120b0a0302, q10);
+ CHECK_EQUAL_128(0x3d3c35342d2c2524, 0x1d1c15140d0c0504, q11);
+ CHECK_EQUAL_128(0x3f3e37362f2e2726, 0x1f1e17160f0e0706, q12);
+ CHECK_EQUAL_128(0x4140393831302928, 0x2120191811100908, q13);
+ CHECK_EQUAL_128(0x3635343326252423, 0x1615141306050403, q14);
+ CHECK_EQUAL_128(0x3a3938372a292827, 0x1a1918170a090807, q15);
+ CHECK_EQUAL_128(0x3e3d3c3b2e2d2c2b, 0x1e1d1c1b0e0d0c0b, q16);
+ CHECK_EQUAL_128(0x4241403f3231302f, 0x2221201f1211100f, q17);
+ CHECK_EQUAL_128(0x2b2a292827262524, 0x0b0a090807060504, q18);
+ CHECK_EQUAL_128(0x333231302f2e2d2c, 0x131211100f0e0d0c, q19);
+ CHECK_EQUAL_128(0x3b3a393837363534, 0x1b1a191817161514, q20);
+ CHECK_EQUAL_128(0x434241403f3e3d3c, 0x232221201f1e1d1c, q21);
+ TEARDOWN();
+}
+
+TEST(neon_ld4_q_postindex) {
+ INIT_V8();
+ SETUP();
+
+ uint8_t src[64 + 4];
+ for (unsigned i = 0; i < sizeof(src); i++) {
+ src[i] = i;
+ }
+ uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
+
+ START();
+ __ Mov(x17, src_base);
+ __ Mov(x18, src_base + 1);
+ __ Mov(x19, src_base + 2);
+ __ Mov(x20, src_base + 3);
+ __ Mov(x21, src_base + 4);
+ __ Mov(x22, 1);
+
+ __ Ld4(v2.V16B(), v3.V16B(), v4.V16B(), v5.V16B(),
+ MemOperand(x17, x22, PostIndex));
+ __ Ld4(v6.V16B(), v7.V16B(), v8_.V16B(), v9.V16B(),
+ MemOperand(x18, 64, PostIndex));
+ __ Ld4(v10.V8H(), v11.V8H(), v12.V8H(), v13.V8H(),
+ MemOperand(x19, 64, PostIndex));
+ __ Ld4(v14.V4S(), v15.V4S(), v16.V4S(), v17.V4S(),
+ MemOperand(x20, 64, PostIndex));
+ __ Ld4(v30.V2D(), v31.V2D(), v0.V2D(), v1.V2D(),
+ MemOperand(x21, 64, PostIndex));
+ END();
+
+ RUN();
+
+ CHECK_EQUAL_128(0x3c3834302c282420, 0x1c1814100c080400, q2);
+ CHECK_EQUAL_128(0x3d3935312d292521, 0x1d1915110d090501, q3);
+ CHECK_EQUAL_128(0x3e3a36322e2a2622, 0x1e1a16120e0a0602, q4);
+ CHECK_EQUAL_128(0x3f3b37332f2b2723, 0x1f1b17130f0b0703, q5);
+ CHECK_EQUAL_128(0x3d3935312d292521, 0x1d1915110d090501, q6);
+ CHECK_EQUAL_128(0x3e3a36322e2a2622, 0x1e1a16120e0a0602, q7);
+ CHECK_EQUAL_128(0x3f3b37332f2b2723, 0x1f1b17130f0b0703, q8);
+ CHECK_EQUAL_128(0x403c3834302c2824, 0x201c1814100c0804, q9);
+ CHECK_EQUAL_128(0x3b3a33322b2a2322, 0x1b1a13120b0a0302, q10);
+ CHECK_EQUAL_128(0x3d3c35342d2c2524, 0x1d1c15140d0c0504, q11);
+ CHECK_EQUAL_128(0x3f3e37362f2e2726, 0x1f1e17160f0e0706, q12);
+ CHECK_EQUAL_128(0x4140393831302928, 0x2120191811100908, q13);
+ CHECK_EQUAL_128(0x3635343326252423, 0x1615141306050403, q14);
+ CHECK_EQUAL_128(0x3a3938372a292827, 0x1a1918170a090807, q15);
+ CHECK_EQUAL_128(0x3e3d3c3b2e2d2c2b, 0x1e1d1c1b0e0d0c0b, q16);
+ CHECK_EQUAL_128(0x4241403f3231302f, 0x2221201f1211100f, q17);
+ CHECK_EQUAL_128(0x2b2a292827262524, 0x0b0a090807060504, q30);
+ CHECK_EQUAL_128(0x333231302f2e2d2c, 0x131211100f0e0d0c, q31);
+ CHECK_EQUAL_128(0x3b3a393837363534, 0x1b1a191817161514, q0);
+ CHECK_EQUAL_128(0x434241403f3e3d3c, 0x232221201f1e1d1c, q1);
+
+ CHECK_EQUAL_64(src_base + 1, x17);
+ CHECK_EQUAL_64(src_base + 1 + 64, x18);
+ CHECK_EQUAL_64(src_base + 2 + 64, x19);
+ CHECK_EQUAL_64(src_base + 3 + 64, x20);
+ CHECK_EQUAL_64(src_base + 4 + 64, x21);
+
+ TEARDOWN();
+}
+
+TEST(neon_ld4_lane) {
+ INIT_V8();
+ SETUP();
+
+ uint8_t src[64];
+ for (unsigned i = 0; i < sizeof(src); i++) {
+ src[i] = i;
+ }
+ uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
+
+ START();
+
+ // Test loading whole register by element.
+ __ Mov(x17, src_base);
+ for (int i = 15; i >= 0; i--) {
+ __ Ld4(v0.B(), v1.B(), v2.B(), v3.B(), i, MemOperand(x17));
+ __ Add(x17, x17, 1);
+ }
+
+ __ Mov(x17, src_base);
+ for (int i = 7; i >= 0; i--) {
+ __ Ld4(v4.H(), v5.H(), v6.H(), v7.H(), i, MemOperand(x17));
+ __ Add(x17, x17, 1);
+ }
+
+ __ Mov(x17, src_base);
+ for (int i = 3; i >= 0; i--) {
+ __ Ld4(v8_.S(), v9.S(), v10.S(), v11.S(), i, MemOperand(x17));
+ __ Add(x17, x17, 1);
+ }
+
+ __ Mov(x17, src_base);
+ for (int i = 1; i >= 0; i--) {
+ __ Ld4(v12.D(), v13.D(), v14.D(), v15.D(), i, MemOperand(x17));
+ __ Add(x17, x17, 1);
+ }
+
+ // Test loading a single element into an initialised register.
+ __ Mov(x17, src_base);
+ __ Mov(x4, x17);
+ __ Ldr(q16, MemOperand(x4, 16, PostIndex));
+ __ Ldr(q17, MemOperand(x4, 16, PostIndex));
+ __ Ldr(q18, MemOperand(x4, 16, PostIndex));
+ __ Ldr(q19, MemOperand(x4));
+ __ Ld4(v16.B(), v17.B(), v18.B(), v19.B(), 4, MemOperand(x17));
+
+ __ Mov(x5, x17);
+ __ Ldr(q20, MemOperand(x5, 16, PostIndex));
+ __ Ldr(q21, MemOperand(x5, 16, PostIndex));
+ __ Ldr(q22, MemOperand(x5, 16, PostIndex));
+ __ Ldr(q23, MemOperand(x5));
+ __ Ld4(v20.H(), v21.H(), v22.H(), v23.H(), 3, MemOperand(x17));
+
+ __ Mov(x6, x17);
+ __ Ldr(q24, MemOperand(x6, 16, PostIndex));
+ __ Ldr(q25, MemOperand(x6, 16, PostIndex));
+ __ Ldr(q26, MemOperand(x6, 16, PostIndex));
+ __ Ldr(q27, MemOperand(x6));
+ __ Ld4(v24.S(), v25.S(), v26.S(), v27.S(), 2, MemOperand(x17));
+
+ __ Mov(x7, x17);
+ __ Ldr(q28, MemOperand(x7, 16, PostIndex));
+ __ Ldr(q29, MemOperand(x7, 16, PostIndex));
+ __ Ldr(q30, MemOperand(x7, 16, PostIndex));
+ __ Ldr(q31, MemOperand(x7));
+ __ Ld4(v28.D(), v29.D(), v30.D(), v31.D(), 1, MemOperand(x17));
+
+ END();
+
+ RUN();
+
+ CHECK_EQUAL_128(0x0001020304050607, 0x08090a0b0c0d0e0f, q0);
+ CHECK_EQUAL_128(0x0102030405060708, 0x090a0b0c0d0e0f10, q1);
+ CHECK_EQUAL_128(0x0203040506070809, 0x0a0b0c0d0e0f1011, q2);
+ CHECK_EQUAL_128(0x030405060708090a, 0x0b0c0d0e0f101112, q3);
+ CHECK_EQUAL_128(0x0100020103020403, 0x0504060507060807, q4);
+ CHECK_EQUAL_128(0x0302040305040605, 0x0706080709080a09, q5);
+ CHECK_EQUAL_128(0x0504060507060807, 0x09080a090b0a0c0b, q6);
+ CHECK_EQUAL_128(0x0706080709080a09, 0x0b0a0c0b0d0c0e0d, q7);
+ CHECK_EQUAL_128(0x0302010004030201, 0x0504030206050403, q8);
+ CHECK_EQUAL_128(0x0706050408070605, 0x090807060a090807, q9);
+ CHECK_EQUAL_128(0x0b0a09080c0b0a09, 0x0d0c0b0a0e0d0c0b, q10);
+ CHECK_EQUAL_128(0x0f0e0d0c100f0e0d, 0x11100f0e1211100f, q11);
+ CHECK_EQUAL_128(0x0706050403020100, 0x0807060504030201, q12);
+ CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x100f0e0d0c0b0a09, q13);
+ CHECK_EQUAL_128(0x1716151413121110, 0x1817161514131211, q14);
+ CHECK_EQUAL_128(0x1f1e1d1c1b1a1918, 0x201f1e1d1c1b1a19, q15);
+ CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0706050003020100, q16);
+ CHECK_EQUAL_128(0x1f1e1d1c1b1a1918, 0x1716150113121110, q17);
+ CHECK_EQUAL_128(0x2f2e2d2c2b2a2928, 0x2726250223222120, q18);
+ CHECK_EQUAL_128(0x3f3e3d3c3b3a3938, 0x3736350333323130, q19);
+ CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0100050403020100, q20);
+ CHECK_EQUAL_128(0x1f1e1d1c1b1a1918, 0x0302151413121110, q21);
+ CHECK_EQUAL_128(0x2f2e2d2c2b2a2928, 0x0504252423222120, q22);
+ CHECK_EQUAL_128(0x3f3e3d3c3b3a3938, 0x0706353433323130, q23);
+ CHECK_EQUAL_128(0x0f0e0d0c03020100, 0x0706050403020100, q24);
+ CHECK_EQUAL_128(0x1f1e1d1c07060504, 0x1716151413121110, q25);
+ CHECK_EQUAL_128(0x2f2e2d2c0b0a0908, 0x2726252423222120, q26);
+ CHECK_EQUAL_128(0x3f3e3d3c0f0e0d0c, 0x3736353433323130, q27);
+ CHECK_EQUAL_128(0x0706050403020100, 0x0706050403020100, q28);
+ CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x1716151413121110, q29);
+ CHECK_EQUAL_128(0x1716151413121110, 0x2726252423222120, q30);
+ CHECK_EQUAL_128(0x1f1e1d1c1b1a1918, 0x3736353433323130, q31);
+
+ TEARDOWN();
+}
+
+TEST(neon_ld4_lane_postindex) {
+ INIT_V8();
+ SETUP();
+
+ uint8_t src[64];
+ for (unsigned i = 0; i < sizeof(src); i++) {
+ src[i] = i;
+ }
+ uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
+
+ START();
+
+ // Test loading whole register by element.
+ __ Mov(x17, src_base);
+ for (int i = 15; i >= 0; i--) {
+ __ Ld4(v0.B(), v1.B(), v2.B(), v3.B(), i, MemOperand(x17, 4, PostIndex));
+ }
+
+ __ Mov(x18, src_base);
+ for (int i = 7; i >= 0; i--) {
+ __ Ld4(v4.H(), v5.H(), v6.H(), v7.H(), i, MemOperand(x18, 8, PostIndex));
+ }
+
+ __ Mov(x19, src_base);
+ for (int i = 3; i >= 0; i--) {
+ __ Ld4(v8_.S(), v9.S(), v10.S(), v11.S(), i,
+ MemOperand(x19, 16, PostIndex));
+ }
+
+ __ Mov(x20, src_base);
+ for (int i = 1; i >= 0; i--) {
+ __ Ld4(v12.D(), v13.D(), v14.D(), v15.D(), i,
+ MemOperand(x20, 32, PostIndex));
+ }
+
+ // Test loading a single element into an initialised register.
+ __ Mov(x25, 1);
+ __ Mov(x21, src_base);
+ __ Mov(x22, src_base);
+ __ Mov(x23, src_base);
+ __ Mov(x24, src_base);
+
+ __ Mov(x4, x21);
+ __ Ldr(q16, MemOperand(x4, 16, PostIndex));
+ __ Ldr(q17, MemOperand(x4, 16, PostIndex));
+ __ Ldr(q18, MemOperand(x4, 16, PostIndex));
+ __ Ldr(q19, MemOperand(x4));
+ __ Ld4(v16.B(), v17.B(), v18.B(), v19.B(), 4,
+ MemOperand(x21, x25, PostIndex));
+ __ Add(x25, x25, 1);
+
+ __ Mov(x5, x22);
+ __ Ldr(q20, MemOperand(x5, 16, PostIndex));
+ __ Ldr(q21, MemOperand(x5, 16, PostIndex));
+ __ Ldr(q22, MemOperand(x5, 16, PostIndex));
+ __ Ldr(q23, MemOperand(x5));
+ __ Ld4(v20.H(), v21.H(), v22.H(), v23.H(), 3,
+ MemOperand(x22, x25, PostIndex));
+ __ Add(x25, x25, 1);
+
+ __ Mov(x6, x23);
+ __ Ldr(q24, MemOperand(x6, 16, PostIndex));
+ __ Ldr(q25, MemOperand(x6, 16, PostIndex));
+ __ Ldr(q26, MemOperand(x6, 16, PostIndex));
+ __ Ldr(q27, MemOperand(x6));
+ __ Ld4(v24.S(), v25.S(), v26.S(), v27.S(), 2,
+ MemOperand(x23, x25, PostIndex));
+ __ Add(x25, x25, 1);
+
+ __ Mov(x7, x24);
+ __ Ldr(q28, MemOperand(x7, 16, PostIndex));
+ __ Ldr(q29, MemOperand(x7, 16, PostIndex));
+ __ Ldr(q30, MemOperand(x7, 16, PostIndex));
+ __ Ldr(q31, MemOperand(x7));
+ __ Ld4(v28.D(), v29.D(), v30.D(), v31.D(), 1,
+ MemOperand(x24, x25, PostIndex));
+
+ END();
+
+ RUN();
+
+ CHECK_EQUAL_128(0x0004080c1014181c, 0x2024282c3034383c, q0);
+ CHECK_EQUAL_128(0x0105090d1115191d, 0x2125292d3135393d, q1);
+ CHECK_EQUAL_128(0x02060a0e12161a1e, 0x22262a2e32363a3e, q2);
+ CHECK_EQUAL_128(0x03070b0f13171b1f, 0x23272b2f33373b3f, q3);
+ CHECK_EQUAL_128(0x0100090811101918, 0x2120292831303938, q4);
+ CHECK_EQUAL_128(0x03020b0a13121b1a, 0x23222b2a33323b3a, q5);
+ CHECK_EQUAL_128(0x05040d0c15141d1c, 0x25242d2c35343d3c, q6);
+ CHECK_EQUAL_128(0x07060f0e17161f1e, 0x27262f2e37363f3e, q7);
+ CHECK_EQUAL_128(0x0302010013121110, 0x2322212033323130, q8);
+ CHECK_EQUAL_128(0x0706050417161514, 0x2726252437363534, q9);
+ CHECK_EQUAL_128(0x0b0a09081b1a1918, 0x2b2a29283b3a3938, q10);
+ CHECK_EQUAL_128(0x0f0e0d0c1f1e1d1c, 0x2f2e2d2c3f3e3d3c, q11);
+ CHECK_EQUAL_128(0x0706050403020100, 0x2726252423222120, q12);
+ CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x2f2e2d2c2b2a2928, q13);
+ CHECK_EQUAL_128(0x1716151413121110, 0x3736353433323130, q14);
+ CHECK_EQUAL_128(0x1f1e1d1c1b1a1918, 0x3f3e3d3c3b3a3938, q15);
+ CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0706050003020100, q16);
+ CHECK_EQUAL_128(0x1f1e1d1c1b1a1918, 0x1716150113121110, q17);
+ CHECK_EQUAL_128(0x2f2e2d2c2b2a2928, 0x2726250223222120, q18);
+ CHECK_EQUAL_128(0x3f3e3d3c3b3a3938, 0x3736350333323130, q19);
+ CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0100050403020100, q20);
+ CHECK_EQUAL_128(0x1f1e1d1c1b1a1918, 0x0302151413121110, q21);
+ CHECK_EQUAL_128(0x2f2e2d2c2b2a2928, 0x0504252423222120, q22);
+ CHECK_EQUAL_128(0x3f3e3d3c3b3a3938, 0x0706353433323130, q23);
+ CHECK_EQUAL_128(0x0f0e0d0c03020100, 0x0706050403020100, q24);
+ CHECK_EQUAL_128(0x1f1e1d1c07060504, 0x1716151413121110, q25);
+ CHECK_EQUAL_128(0x2f2e2d2c0b0a0908, 0x2726252423222120, q26);
+ CHECK_EQUAL_128(0x3f3e3d3c0f0e0d0c, 0x3736353433323130, q27);
+ CHECK_EQUAL_128(0x0706050403020100, 0x0706050403020100, q28);
+ CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x1716151413121110, q29);
+ CHECK_EQUAL_128(0x1716151413121110, 0x2726252423222120, q30);
+ CHECK_EQUAL_128(0x1f1e1d1c1b1a1918, 0x3736353433323130, q31);
+
+ CHECK_EQUAL_64(src_base + 64, x17);
+ CHECK_EQUAL_64(src_base + 64, x18);
+ CHECK_EQUAL_64(src_base + 64, x19);
+ CHECK_EQUAL_64(src_base + 64, x20);
+ CHECK_EQUAL_64(src_base + 1, x21);
+ CHECK_EQUAL_64(src_base + 2, x22);
+ CHECK_EQUAL_64(src_base + 3, x23);
+ CHECK_EQUAL_64(src_base + 4, x24);
+
+ TEARDOWN();
+}
+
+TEST(neon_ld4_alllanes) {
+ INIT_V8();
+ SETUP();
+
+ uint8_t src[64];
+ for (unsigned i = 0; i < sizeof(src); i++) {
+ src[i] = i;
+ }
+ uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
+
+ START();
+ __ Mov(x17, src_base + 1);
+ __ Mov(x18, 1);
+ __ Ld4r(v0.V8B(), v1.V8B(), v2.V8B(), v3.V8B(), MemOperand(x17));
+ __ Add(x17, x17, 4);
+ __ Ld4r(v4.V16B(), v5.V16B(), v6.V16B(), v7.V16B(), MemOperand(x17));
+ __ Add(x17, x17, 1);
+ __ Ld4r(v8_.V4H(), v9.V4H(), v10.V4H(), v11.V4H(), MemOperand(x17));
+ __ Add(x17, x17, 1);
+ __ Ld4r(v12.V8H(), v13.V8H(), v14.V8H(), v15.V8H(), MemOperand(x17));
+ __ Add(x17, x17, 8);
+ __ Ld4r(v16.V2S(), v17.V2S(), v18.V2S(), v19.V2S(), MemOperand(x17));
+ __ Add(x17, x17, 1);
+ __ Ld4r(v20.V4S(), v21.V4S(), v22.V4S(), v23.V4S(), MemOperand(x17));
+ __ Add(x17, x17, 16);
+ __ Ld4r(v24.V2D(), v25.V2D(), v26.V2D(), v27.V2D(), MemOperand(x17));
+
+ END();
+
+ RUN();
+
+ CHECK_EQUAL_128(0x0000000000000000, 0x0101010101010101, q0);
+ CHECK_EQUAL_128(0x0000000000000000, 0x0202020202020202, q1);
+ CHECK_EQUAL_128(0x0000000000000000, 0x0303030303030303, q2);
+ CHECK_EQUAL_128(0x0000000000000000, 0x0404040404040404, q3);
+ CHECK_EQUAL_128(0x0505050505050505, 0x0505050505050505, q4);
+ CHECK_EQUAL_128(0x0606060606060606, 0x0606060606060606, q5);
+ CHECK_EQUAL_128(0x0707070707070707, 0x0707070707070707, q6);
+ CHECK_EQUAL_128(0x0808080808080808, 0x0808080808080808, q7);
+ CHECK_EQUAL_128(0x0000000000000000, 0x0706070607060706, q8);
+ CHECK_EQUAL_128(0x0000000000000000, 0x0908090809080908, q9);
+ CHECK_EQUAL_128(0x0000000000000000, 0x0b0a0b0a0b0a0b0a, q10);
+ CHECK_EQUAL_128(0x0000000000000000, 0x0d0c0d0c0d0c0d0c, q11);
+ CHECK_EQUAL_128(0x0807080708070807, 0x0807080708070807, q12);
+ CHECK_EQUAL_128(0x0a090a090a090a09, 0x0a090a090a090a09, q13);
+ CHECK_EQUAL_128(0x0c0b0c0b0c0b0c0b, 0x0c0b0c0b0c0b0c0b, q14);
+ CHECK_EQUAL_128(0x0e0d0e0d0e0d0e0d, 0x0e0d0e0d0e0d0e0d, q15);
+ CHECK_EQUAL_128(0x0000000000000000, 0x1211100f1211100f, q16);
+ CHECK_EQUAL_128(0x0000000000000000, 0x1615141316151413, q17);
+ CHECK_EQUAL_128(0x0000000000000000, 0x1a1918171a191817, q18);
+ CHECK_EQUAL_128(0x0000000000000000, 0x1e1d1c1b1e1d1c1b, q19);
+ CHECK_EQUAL_128(0x1312111013121110, 0x1312111013121110, q20);
+ CHECK_EQUAL_128(0x1716151417161514, 0x1716151417161514, q21);
+ CHECK_EQUAL_128(0x1b1a19181b1a1918, 0x1b1a19181b1a1918, q22);
+ CHECK_EQUAL_128(0x1f1e1d1c1f1e1d1c, 0x1f1e1d1c1f1e1d1c, q23);
+ CHECK_EQUAL_128(0x2726252423222120, 0x2726252423222120, q24);
+ CHECK_EQUAL_128(0x2f2e2d2c2b2a2928, 0x2f2e2d2c2b2a2928, q25);
+ CHECK_EQUAL_128(0x3736353433323130, 0x3736353433323130, q26);
+ CHECK_EQUAL_128(0x3f3e3d3c3b3a3938, 0x3f3e3d3c3b3a3938, q27);
+
+ TEARDOWN();
+}
+
+TEST(neon_ld4_alllanes_postindex) {
+ INIT_V8();
+ SETUP();
+
+ uint8_t src[64];
+ for (unsigned i = 0; i < sizeof(src); i++) {
+ src[i] = i;
+ }
+ uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
+ __ Mov(x17, src_base + 1);
+ __ Mov(x18, 1);
+
+ START();
+ __ Mov(x17, src_base + 1);
+ __ Mov(x18, 1);
+ __ Ld4r(v0.V8B(), v1.V8B(), v2.V8B(), v3.V8B(),
+ MemOperand(x17, 4, PostIndex));
+ __ Ld4r(v4.V16B(), v5.V16B(), v6.V16B(), v7.V16B(),
+ MemOperand(x17, x18, PostIndex));
+ __ Ld4r(v8_.V4H(), v9.V4H(), v10.V4H(), v11.V4H(),
+ MemOperand(x17, x18, PostIndex));
+ __ Ld4r(v12.V8H(), v13.V8H(), v14.V8H(), v15.V8H(),
+ MemOperand(x17, 8, PostIndex));
+ __ Ld4r(v16.V2S(), v17.V2S(), v18.V2S(), v19.V2S(),
+ MemOperand(x17, x18, PostIndex));
+ __ Ld4r(v20.V4S(), v21.V4S(), v22.V4S(), v23.V4S(),
+ MemOperand(x17, 16, PostIndex));
+ __ Ld4r(v24.V2D(), v25.V2D(), v26.V2D(), v27.V2D(),
+ MemOperand(x17, 32, PostIndex));
+ END();
+
+ RUN();
+
+ CHECK_EQUAL_128(0x0000000000000000, 0x0101010101010101, q0);
+ CHECK_EQUAL_128(0x0000000000000000, 0x0202020202020202, q1);
+ CHECK_EQUAL_128(0x0000000000000000, 0x0303030303030303, q2);
+ CHECK_EQUAL_128(0x0000000000000000, 0x0404040404040404, q3);
+ CHECK_EQUAL_128(0x0505050505050505, 0x0505050505050505, q4);
+ CHECK_EQUAL_128(0x0606060606060606, 0x0606060606060606, q5);
+ CHECK_EQUAL_128(0x0707070707070707, 0x0707070707070707, q6);
+ CHECK_EQUAL_128(0x0808080808080808, 0x0808080808080808, q7);
+ CHECK_EQUAL_128(0x0000000000000000, 0x0706070607060706, q8);
+ CHECK_EQUAL_128(0x0000000000000000, 0x0908090809080908, q9);
+ CHECK_EQUAL_128(0x0000000000000000, 0x0b0a0b0a0b0a0b0a, q10);
+ CHECK_EQUAL_128(0x0000000000000000, 0x0d0c0d0c0d0c0d0c, q11);
+ CHECK_EQUAL_128(0x0807080708070807, 0x0807080708070807, q12);
+ CHECK_EQUAL_128(0x0a090a090a090a09, 0x0a090a090a090a09, q13);
+ CHECK_EQUAL_128(0x0c0b0c0b0c0b0c0b, 0x0c0b0c0b0c0b0c0b, q14);
+ CHECK_EQUAL_128(0x0e0d0e0d0e0d0e0d, 0x0e0d0e0d0e0d0e0d, q15);
+ CHECK_EQUAL_128(0x0000000000000000, 0x1211100f1211100f, q16);
+ CHECK_EQUAL_128(0x0000000000000000, 0x1615141316151413, q17);
+ CHECK_EQUAL_128(0x0000000000000000, 0x1a1918171a191817, q18);
+ CHECK_EQUAL_128(0x0000000000000000, 0x1e1d1c1b1e1d1c1b, q19);
+ CHECK_EQUAL_128(0x1312111013121110, 0x1312111013121110, q20);
+ CHECK_EQUAL_128(0x1716151417161514, 0x1716151417161514, q21);
+ CHECK_EQUAL_128(0x1b1a19181b1a1918, 0x1b1a19181b1a1918, q22);
+ CHECK_EQUAL_128(0x1f1e1d1c1f1e1d1c, 0x1f1e1d1c1f1e1d1c, q23);
+ CHECK_EQUAL_128(0x2726252423222120, 0x2726252423222120, q24);
+ CHECK_EQUAL_128(0x2f2e2d2c2b2a2928, 0x2f2e2d2c2b2a2928, q25);
+ CHECK_EQUAL_128(0x3736353433323130, 0x3736353433323130, q26);
+ CHECK_EQUAL_128(0x3f3e3d3c3b3a3938, 0x3f3e3d3c3b3a3938, q27);
+ CHECK_EQUAL_64(src_base + 64, x17);
+
+ TEARDOWN();
+}
+
+TEST(neon_st1_lane) {
+ INIT_V8();
+ SETUP();
+
+ uint8_t src[64];
+ for (unsigned i = 0; i < sizeof(src); i++) {
+ src[i] = i;
+ }
+ uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
+
+ START();
+ __ Mov(x17, src_base);
+ __ Mov(x18, -16);
+ __ Ldr(q0, MemOperand(x17));
+
+ for (int i = 15; i >= 0; i--) {
+ __ St1(v0.B(), i, MemOperand(x17));
+ __ Add(x17, x17, 1);
+ }
+ __ Ldr(q1, MemOperand(x17, x18));
+
+ for (int i = 7; i >= 0; i--) {
+ __ St1(v0.H(), i, MemOperand(x17));
+ __ Add(x17, x17, 2);
+ }
+ __ Ldr(q2, MemOperand(x17, x18));
+
+ for (int i = 3; i >= 0; i--) {
+ __ St1(v0.S(), i, MemOperand(x17));
+ __ Add(x17, x17, 4);
+ }
+ __ Ldr(q3, MemOperand(x17, x18));
+
+ for (int i = 1; i >= 0; i--) {
+ __ St1(v0.D(), i, MemOperand(x17));
+ __ Add(x17, x17, 8);
+ }
+ __ Ldr(q4, MemOperand(x17, x18));
+
+ END();
+
+ RUN();
+
+ CHECK_EQUAL_128(0x0001020304050607, 0x08090a0b0c0d0e0f, q1);
+ CHECK_EQUAL_128(0x0100030205040706, 0x09080b0a0d0c0f0e, q2);
+ CHECK_EQUAL_128(0x0302010007060504, 0x0b0a09080f0e0d0c, q3);
+ CHECK_EQUAL_128(0x0706050403020100, 0x0f0e0d0c0b0a0908, q4);
+
+ TEARDOWN();
+}
+
+TEST(neon_st2_lane) {
+ INIT_V8();
+ SETUP();
+
+ // Struct size * addressing modes * element sizes * vector size.
+ uint8_t dst[2 * 2 * 4 * 16];
+ memset(dst, 0, sizeof(dst));
+ uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
+
+ START();
+ __ Mov(x17, dst_base);
+ __ Mov(x18, dst_base);
+ __ Movi(v0.V2D(), 0x0001020304050607, 0x08090a0b0c0d0e0f);
+ __ Movi(v1.V2D(), 0x1011121314151617, 0x18191a1b1c1d1e1f);
+
+ // Test B stores with and without post index.
+ for (int i = 15; i >= 0; i--) {
+ __ St2(v0.B(), v1.B(), i, MemOperand(x18));
+ __ Add(x18, x18, 2);
+ }
+ for (int i = 15; i >= 0; i--) {
+ __ St2(v0.B(), v1.B(), i, MemOperand(x18, 2, PostIndex));
+ }
+ __ Ldr(q2, MemOperand(x17, 0 * 16));
+ __ Ldr(q3, MemOperand(x17, 1 * 16));
+ __ Ldr(q4, MemOperand(x17, 2 * 16));
+ __ Ldr(q5, MemOperand(x17, 3 * 16));
+
+ // Test H stores with and without post index.
+ __ Mov(x0, 4);
+ for (int i = 7; i >= 0; i--) {
+ __ St2(v0.H(), v1.H(), i, MemOperand(x18));
+ __ Add(x18, x18, 4);
+ }
+ for (int i = 7; i >= 0; i--) {
+ __ St2(v0.H(), v1.H(), i, MemOperand(x18, x0, PostIndex));
+ }
+ __ Ldr(q6, MemOperand(x17, 4 * 16));
+ __ Ldr(q7, MemOperand(x17, 5 * 16));
+ __ Ldr(q16, MemOperand(x17, 6 * 16));
+ __ Ldr(q17, MemOperand(x17, 7 * 16));
+
+ // Test S stores with and without post index.
+ for (int i = 3; i >= 0; i--) {
+ __ St2(v0.S(), v1.S(), i, MemOperand(x18));
+ __ Add(x18, x18, 8);
+ }
+ for (int i = 3; i >= 0; i--) {
+ __ St2(v0.S(), v1.S(), i, MemOperand(x18, 8, PostIndex));
+ }
+ __ Ldr(q18, MemOperand(x17, 8 * 16));
+ __ Ldr(q19, MemOperand(x17, 9 * 16));
+ __ Ldr(q20, MemOperand(x17, 10 * 16));
+ __ Ldr(q21, MemOperand(x17, 11 * 16));
+
+ // Test D stores with and without post index.
+ __ Mov(x0, 16);
+ __ St2(v0.D(), v1.D(), 1, MemOperand(x18));
+ __ Add(x18, x18, 16);
+ __ St2(v0.D(), v1.D(), 0, MemOperand(x18, 16, PostIndex));
+ __ St2(v0.D(), v1.D(), 1, MemOperand(x18, x0, PostIndex));
+ __ St2(v0.D(), v1.D(), 0, MemOperand(x18, x0, PostIndex));
+ __ Ldr(q22, MemOperand(x17, 12 * 16));
+ __ Ldr(q23, MemOperand(x17, 13 * 16));
+ __ Ldr(q24, MemOperand(x17, 14 * 16));
+ __ Ldr(q25, MemOperand(x17, 15 * 16));
+ END();
+
+ RUN();
+
+ CHECK_EQUAL_128(0x1707160615051404, 0x1303120211011000, q2);
+ CHECK_EQUAL_128(0x1f0f1e0e1d0d1c0c, 0x1b0b1a0a19091808, q3);
+ CHECK_EQUAL_128(0x1707160615051404, 0x1303120211011000, q4);
+ CHECK_EQUAL_128(0x1f0f1e0e1d0d1c0c, 0x1b0b1a0a19091808, q5);
+
+ CHECK_EQUAL_128(0x1617060714150405, 0x1213020310110001, q6);
+ CHECK_EQUAL_128(0x1e1f0e0f1c1d0c0d, 0x1a1b0a0b18190809, q7);
+ CHECK_EQUAL_128(0x1617060714150405, 0x1213020310110001, q16);
+ CHECK_EQUAL_128(0x1e1f0e0f1c1d0c0d, 0x1a1b0a0b18190809, q17);
+
+ CHECK_EQUAL_128(0x1415161704050607, 0x1011121300010203, q18);
+ CHECK_EQUAL_128(0x1c1d1e1f0c0d0e0f, 0x18191a1b08090a0b, q19);
+ CHECK_EQUAL_128(0x1415161704050607, 0x1011121300010203, q20);
+ CHECK_EQUAL_128(0x1c1d1e1f0c0d0e0f, 0x18191a1b08090a0b, q21);
+
+ CHECK_EQUAL_128(0x1011121314151617, 0x0001020304050607, q22);
+ CHECK_EQUAL_128(0x18191a1b1c1d1e1f, 0x08090a0b0c0d0e0f, q23);
+ CHECK_EQUAL_128(0x1011121314151617, 0x0001020304050607, q22);
+ CHECK_EQUAL_128(0x18191a1b1c1d1e1f, 0x08090a0b0c0d0e0f, q23);
+
+ TEARDOWN();
+}
+
+TEST(neon_st3_lane) {
+ INIT_V8();
+ SETUP();
+
+ // Struct size * addressing modes * element sizes * vector size.
+ uint8_t dst[3 * 2 * 4 * 16];
+ memset(dst, 0, sizeof(dst));
+ uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
+
+ START();
+ __ Mov(x17, dst_base);
+ __ Mov(x18, dst_base);
+ __ Movi(v0.V2D(), 0x0001020304050607, 0x08090a0b0c0d0e0f);
+ __ Movi(v1.V2D(), 0x1011121314151617, 0x18191a1b1c1d1e1f);
+ __ Movi(v2.V2D(), 0x2021222324252627, 0x28292a2b2c2d2e2f);
+
+ // Test B stores with and without post index.
+ for (int i = 15; i >= 0; i--) {
+ __ St3(v0.B(), v1.B(), v2.B(), i, MemOperand(x18));
+ __ Add(x18, x18, 3);
+ }
+ for (int i = 15; i >= 0; i--) {
+ __ St3(v0.B(), v1.B(), v2.B(), i, MemOperand(x18, 3, PostIndex));
+ }
+ __ Ldr(q3, MemOperand(x17, 0 * 16));
+ __ Ldr(q4, MemOperand(x17, 1 * 16));
+ __ Ldr(q5, MemOperand(x17, 2 * 16));
+ __ Ldr(q6, MemOperand(x17, 3 * 16));
+ __ Ldr(q7, MemOperand(x17, 4 * 16));
+ __ Ldr(q16, MemOperand(x17, 5 * 16));
+
+ // Test H stores with and without post index.
+ __ Mov(x0, 6);
+ for (int i = 7; i >= 0; i--) {
+ __ St3(v0.H(), v1.H(), v2.H(), i, MemOperand(x18));
+ __ Add(x18, x18, 6);
+ }
+ for (int i = 7; i >= 0; i--) {
+ __ St3(v0.H(), v1.H(), v2.H(), i, MemOperand(x18, x0, PostIndex));
+ }
+ __ Ldr(q17, MemOperand(x17, 6 * 16));
+ __ Ldr(q18, MemOperand(x17, 7 * 16));
+ __ Ldr(q19, MemOperand(x17, 8 * 16));
+ __ Ldr(q20, MemOperand(x17, 9 * 16));
+ __ Ldr(q21, MemOperand(x17, 10 * 16));
+ __ Ldr(q22, MemOperand(x17, 11 * 16));
+
+ // Test S stores with and without post index.
+ for (int i = 3; i >= 0; i--) {
+ __ St3(v0.S(), v1.S(), v2.S(), i, MemOperand(x18));
+ __ Add(x18, x18, 12);
+ }
+ for (int i = 3; i >= 0; i--) {
+ __ St3(v0.S(), v1.S(), v2.S(), i, MemOperand(x18, 12, PostIndex));
+ }
+ __ Ldr(q23, MemOperand(x17, 12 * 16));
+ __ Ldr(q24, MemOperand(x17, 13 * 16));
+ __ Ldr(q25, MemOperand(x17, 14 * 16));
+ __ Ldr(q26, MemOperand(x17, 15 * 16));
+ __ Ldr(q27, MemOperand(x17, 16 * 16));
+ __ Ldr(q28, MemOperand(x17, 17 * 16));
+
+ // Test D stores with and without post index.
+ __ Mov(x0, 24);
+ __ St3(v0.D(), v1.D(), v2.D(), 1, MemOperand(x18));
+ __ Add(x18, x18, 24);
+ __ St3(v0.D(), v1.D(), v2.D(), 0, MemOperand(x18, 24, PostIndex));
+ __ St3(v0.D(), v1.D(), v2.D(), 1, MemOperand(x18, x0, PostIndex));
+ __ Ldr(q29, MemOperand(x17, 18 * 16));
+ __ Ldr(q30, MemOperand(x17, 19 * 16));
+ __ Ldr(q31, MemOperand(x17, 20 * 16));
+ END();
+
+ RUN();
+
+ CHECK_EQUAL_128(0x0524140423130322, 0x1202211101201000, q3);
+ CHECK_EQUAL_128(0x1a0a291909281808, 0x2717072616062515, q4);
+ CHECK_EQUAL_128(0x2f1f0f2e1e0e2d1d, 0x0d2c1c0c2b1b0b2a, q5);
+ CHECK_EQUAL_128(0x0524140423130322, 0x1202211101201000, q6);
+ CHECK_EQUAL_128(0x1a0a291909281808, 0x2717072616062515, q7);
+ CHECK_EQUAL_128(0x2f1f0f2e1e0e2d1d, 0x0d2c1c0c2b1b0b2a, q16);
+
+ CHECK_EQUAL_128(0x1415040522231213, 0x0203202110110001, q17);
+ CHECK_EQUAL_128(0x0a0b282918190809, 0x2627161706072425, q18);
+ CHECK_EQUAL_128(0x2e2f1e1f0e0f2c2d, 0x1c1d0c0d2a2b1a1b, q19);
+ CHECK_EQUAL_128(0x1415040522231213, 0x0203202110110001, q20);
+ CHECK_EQUAL_128(0x0a0b282918190809, 0x2627161706072425, q21);
+ CHECK_EQUAL_128(0x2e2f1e1f0e0f2c2d, 0x1c1d0c0d2a2b1a1b, q22);
+
+ CHECK_EQUAL_128(0x0405060720212223, 0x1011121300010203, q23);
+ CHECK_EQUAL_128(0x18191a1b08090a0b, 0x2425262714151617, q24);
+ CHECK_EQUAL_128(0x2c2d2e2f1c1d1e1f, 0x0c0d0e0f28292a2b, q25);
+ CHECK_EQUAL_128(0x0405060720212223, 0x1011121300010203, q26);
+ CHECK_EQUAL_128(0x18191a1b08090a0b, 0x2425262714151617, q27);
+ CHECK_EQUAL_128(0x2c2d2e2f1c1d1e1f, 0x0c0d0e0f28292a2b, q28);
+
+ TEARDOWN();
+}
+
+TEST(neon_st4_lane) {
+ INIT_V8();
+ SETUP();
+
+ // Struct size * element sizes * vector size.
+ uint8_t dst[4 * 4 * 16];
+ memset(dst, 0, sizeof(dst));
+ uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
+
+ START();
+ __ Mov(x17, dst_base);
+ __ Mov(x18, dst_base);
+ __ Movi(v0.V2D(), 0x0001020304050607, 0x08090a0b0c0d0e0f);
+ __ Movi(v1.V2D(), 0x1011121314151617, 0x18191a1b1c1d1e1f);
+ __ Movi(v2.V2D(), 0x2021222324252627, 0x28292a2b2c2d2e2f);
+ __ Movi(v3.V2D(), 0x2021222324252627, 0x28292a2b2c2d2e2f);
+
+ // Test B stores without post index.
+ for (int i = 15; i >= 0; i--) {
+ __ St4(v0.B(), v1.B(), v2.B(), v3.B(), i, MemOperand(x18));
+ __ Add(x18, x18, 4);
+ }
+ __ Ldr(q4, MemOperand(x17, 0 * 16));
+ __ Ldr(q5, MemOperand(x17, 1 * 16));
+ __ Ldr(q6, MemOperand(x17, 2 * 16));
+ __ Ldr(q7, MemOperand(x17, 3 * 16));
+
+ // Test H stores with post index.
+ __ Mov(x0, 8);
+ for (int i = 7; i >= 0; i--) {
+ __ St4(v0.H(), v1.H(), v2.H(), v3.H(), i, MemOperand(x18, x0, PostIndex));
+ }
+ __ Ldr(q16, MemOperand(x17, 4 * 16));
+ __ Ldr(q17, MemOperand(x17, 5 * 16));
+ __ Ldr(q18, MemOperand(x17, 6 * 16));
+ __ Ldr(q19, MemOperand(x17, 7 * 16));
+
+ // Test S stores without post index.
+ for (int i = 3; i >= 0; i--) {
+ __ St4(v0.S(), v1.S(), v2.S(), v3.S(), i, MemOperand(x18));
+ __ Add(x18, x18, 16);
+ }
+ __ Ldr(q20, MemOperand(x17, 8 * 16));
+ __ Ldr(q21, MemOperand(x17, 9 * 16));
+ __ Ldr(q22, MemOperand(x17, 10 * 16));
+ __ Ldr(q23, MemOperand(x17, 11 * 16));
+
+ // Test D stores with post index.
+ __ Mov(x0, 32);
+ __ St4(v0.D(), v1.D(), v2.D(), v3.D(), 0, MemOperand(x18, 32, PostIndex));
+ __ St4(v0.D(), v1.D(), v2.D(), v3.D(), 1, MemOperand(x18, x0, PostIndex));
+
+ __ Ldr(q24, MemOperand(x17, 12 * 16));
+ __ Ldr(q25, MemOperand(x17, 13 * 16));
+ __ Ldr(q26, MemOperand(x17, 14 * 16));
+ __ Ldr(q27, MemOperand(x17, 15 * 16));
+ END();
+
+ RUN();
+
+ CHECK_EQUAL_128(0x2323130322221202, 0x2121110120201000, q4);
+ CHECK_EQUAL_128(0x2727170726261606, 0x2525150524241404, q5);
+ CHECK_EQUAL_128(0x2b2b1b0b2a2a1a0a, 0x2929190928281808, q6);
+ CHECK_EQUAL_128(0x2f2f1f0f2e2e1e0e, 0x2d2d1d0d2c2c1c0c, q7);
+
+ CHECK_EQUAL_128(0x2223222312130203, 0x2021202110110001, q16);
+ CHECK_EQUAL_128(0x2627262716170607, 0x2425242514150405, q17);
+ CHECK_EQUAL_128(0x2a2b2a2b1a1b0a0b, 0x2829282918190809, q18);
+ CHECK_EQUAL_128(0x2e2f2e2f1e1f0e0f, 0x2c2d2c2d1c1d0c0d, q19);
+
+ CHECK_EQUAL_128(0x2021222320212223, 0x1011121300010203, q20);
+ CHECK_EQUAL_128(0x2425262724252627, 0x1415161704050607, q21);
+ CHECK_EQUAL_128(0x28292a2b28292a2b, 0x18191a1b08090a0b, q22);
+ CHECK_EQUAL_128(0x2c2d2e2f2c2d2e2f, 0x1c1d1e1f0c0d0e0f, q23);
+
+ CHECK_EQUAL_128(0x18191a1b1c1d1e1f, 0x08090a0b0c0d0e0f, q24);
+ CHECK_EQUAL_128(0x28292a2b2c2d2e2f, 0x28292a2b2c2d2e2f, q25);
+ CHECK_EQUAL_128(0x1011121314151617, 0x0001020304050607, q26);
+ CHECK_EQUAL_128(0x2021222324252627, 0x2021222324252627, q27);
+
+ TEARDOWN();
+}
+
+TEST(neon_ld1_lane_postindex) {
+ INIT_V8();
+ SETUP();
+
+ uint8_t src[64];
+ for (unsigned i = 0; i < sizeof(src); i++) {
+ src[i] = i;
+ }
+ uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
+
+ START();
+ __ Mov(x17, src_base);
+ __ Mov(x18, src_base);
+ __ Mov(x19, src_base);
+ __ Mov(x20, src_base);
+ __ Mov(x21, src_base);
+ __ Mov(x22, src_base);
+ __ Mov(x23, src_base);
+ __ Mov(x24, src_base);
+
+ // Test loading whole register by element.
+ for (int i = 15; i >= 0; i--) {
+ __ Ld1(v0.B(), i, MemOperand(x17, 1, PostIndex));
+ }
+
+ for (int i = 7; i >= 0; i--) {
+ __ Ld1(v1.H(), i, MemOperand(x18, 2, PostIndex));
+ }
+
+ for (int i = 3; i >= 0; i--) {
+ __ Ld1(v2.S(), i, MemOperand(x19, 4, PostIndex));
+ }
+
+ for (int i = 1; i >= 0; i--) {
+ __ Ld1(v3.D(), i, MemOperand(x20, 8, PostIndex));
+ }
+
+ // Test loading a single element into an initialised register.
+ __ Mov(x25, 1);
+ __ Ldr(q4, MemOperand(x21));
+ __ Ld1(v4.B(), 4, MemOperand(x21, x25, PostIndex));
+ __ Add(x25, x25, 1);
+
+ __ Ldr(q5, MemOperand(x22));
+ __ Ld1(v5.H(), 3, MemOperand(x22, x25, PostIndex));
+ __ Add(x25, x25, 1);
+
+ __ Ldr(q6, MemOperand(x23));
+ __ Ld1(v6.S(), 2, MemOperand(x23, x25, PostIndex));
+ __ Add(x25, x25, 1);
+
+ __ Ldr(q7, MemOperand(x24));
+ __ Ld1(v7.D(), 1, MemOperand(x24, x25, PostIndex));
+
+ END();
+
+ RUN();
+
+ CHECK_EQUAL_128(0x0001020304050607, 0x08090a0b0c0d0e0f, q0);
+ CHECK_EQUAL_128(0x0100030205040706, 0x09080b0a0d0c0f0e, q1);
+ CHECK_EQUAL_128(0x0302010007060504, 0x0b0a09080f0e0d0c, q2);
+ CHECK_EQUAL_128(0x0706050403020100, 0x0f0e0d0c0b0a0908, q3);
+ CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0706050003020100, q4);
+ CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0100050403020100, q5);
+ CHECK_EQUAL_128(0x0f0e0d0c03020100, 0x0706050403020100, q6);
+ CHECK_EQUAL_128(0x0706050403020100, 0x0706050403020100, q7);
+ CHECK_EQUAL_64(src_base + 16, x17);
+ CHECK_EQUAL_64(src_base + 16, x18);
+ CHECK_EQUAL_64(src_base + 16, x19);
+ CHECK_EQUAL_64(src_base + 16, x20);
+ CHECK_EQUAL_64(src_base + 1, x21);
+ CHECK_EQUAL_64(src_base + 2, x22);
+ CHECK_EQUAL_64(src_base + 3, x23);
+ CHECK_EQUAL_64(src_base + 4, x24);
+
+ TEARDOWN();
+}
+
+TEST(neon_st1_lane_postindex) {
+ INIT_V8();
+ SETUP();
+
+ uint8_t src[64];
+ for (unsigned i = 0; i < sizeof(src); i++) {
+ src[i] = i;
+ }
+ uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
+
+ START();
+ __ Mov(x17, src_base);
+ __ Mov(x18, -16);
+ __ Ldr(q0, MemOperand(x17));
+
+ for (int i = 15; i >= 0; i--) {
+ __ St1(v0.B(), i, MemOperand(x17, 1, PostIndex));
+ }
+ __ Ldr(q1, MemOperand(x17, x18));
+
+ for (int i = 7; i >= 0; i--) {
+ __ St1(v0.H(), i, MemOperand(x17, 2, PostIndex));
+ }
+ __ Ldr(q2, MemOperand(x17, x18));
+
+ for (int i = 3; i >= 0; i--) {
+ __ St1(v0.S(), i, MemOperand(x17, 4, PostIndex));
+ }
+ __ Ldr(q3, MemOperand(x17, x18));
+
+ for (int i = 1; i >= 0; i--) {
+ __ St1(v0.D(), i, MemOperand(x17, 8, PostIndex));
+ }
+ __ Ldr(q4, MemOperand(x17, x18));
+
+ END();
+
+ RUN();
+
+ CHECK_EQUAL_128(0x0001020304050607, 0x08090a0b0c0d0e0f, q1);
+ CHECK_EQUAL_128(0x0100030205040706, 0x09080b0a0d0c0f0e, q2);
+ CHECK_EQUAL_128(0x0302010007060504, 0x0b0a09080f0e0d0c, q3);
+ CHECK_EQUAL_128(0x0706050403020100, 0x0f0e0d0c0b0a0908, q4);
+
+ TEARDOWN();
+}
+
+TEST(neon_ld1_alllanes) {
+ INIT_V8();
+ SETUP();
+
+ uint8_t src[64];
+ for (unsigned i = 0; i < sizeof(src); i++) {
+ src[i] = i;
+ }
+ uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
+
+ START();
+ __ Mov(x17, src_base + 1);
+ __ Ld1r(v0.V8B(), MemOperand(x17));
+ __ Add(x17, x17, 1);
+ __ Ld1r(v1.V16B(), MemOperand(x17));
+ __ Add(x17, x17, 1);
+ __ Ld1r(v2.V4H(), MemOperand(x17));
+ __ Add(x17, x17, 1);
+ __ Ld1r(v3.V8H(), MemOperand(x17));
+ __ Add(x17, x17, 1);
+ __ Ld1r(v4.V2S(), MemOperand(x17));
+ __ Add(x17, x17, 1);
+ __ Ld1r(v5.V4S(), MemOperand(x17));
+ __ Add(x17, x17, 1);
+ __ Ld1r(v6.V1D(), MemOperand(x17));
+ __ Add(x17, x17, 1);
+ __ Ld1r(v7.V2D(), MemOperand(x17));
+ END();
+
+ RUN();
+
+ CHECK_EQUAL_128(0, 0x0101010101010101, q0);
+ CHECK_EQUAL_128(0x0202020202020202, 0x0202020202020202, q1);
+ CHECK_EQUAL_128(0, 0x0403040304030403, q2);
+ CHECK_EQUAL_128(0x0504050405040504, 0x0504050405040504, q3);
+ CHECK_EQUAL_128(0, 0x0807060508070605, q4);
+ CHECK_EQUAL_128(0x0908070609080706, 0x0908070609080706, q5);
+ CHECK_EQUAL_128(0, 0x0e0d0c0b0a090807, q6);
+ CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0f0e0d0c0b0a0908, q7);
+
+ TEARDOWN();
+}
+
+TEST(neon_ld1_alllanes_postindex) {
+ INIT_V8();
+ SETUP();
+
+ uint8_t src[64];
+ for (unsigned i = 0; i < sizeof(src); i++) {
+ src[i] = i;
+ }
+ uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
+
+ START();
+ __ Mov(x17, src_base + 1);
+ __ Mov(x18, 1);
+ __ Ld1r(v0.V8B(), MemOperand(x17, 1, PostIndex));
+ __ Ld1r(v1.V16B(), MemOperand(x17, x18, PostIndex));
+ __ Ld1r(v2.V4H(), MemOperand(x17, x18, PostIndex));
+ __ Ld1r(v3.V8H(), MemOperand(x17, 2, PostIndex));
+ __ Ld1r(v4.V2S(), MemOperand(x17, x18, PostIndex));
+ __ Ld1r(v5.V4S(), MemOperand(x17, 4, PostIndex));
+ __ Ld1r(v6.V2D(), MemOperand(x17, 8, PostIndex));
+ END();
+
+ RUN();
+
+ CHECK_EQUAL_128(0, 0x0101010101010101, q0);
+ CHECK_EQUAL_128(0x0202020202020202, 0x0202020202020202, q1);
+ CHECK_EQUAL_128(0, 0x0403040304030403, q2);
+ CHECK_EQUAL_128(0x0504050405040504, 0x0504050405040504, q3);
+ CHECK_EQUAL_128(0, 0x0908070609080706, q4);
+ CHECK_EQUAL_128(0x0a0908070a090807, 0x0a0908070a090807, q5);
+ CHECK_EQUAL_128(0x1211100f0e0d0c0b, 0x1211100f0e0d0c0b, q6);
+ CHECK_EQUAL_64(src_base + 19, x17);
+
+ TEARDOWN();
+}
+
+TEST(neon_st1_d) {
+ INIT_V8();
+ SETUP();
+
+ uint8_t src[14 * kDRegSize];
+ for (unsigned i = 0; i < sizeof(src); i++) {
+ src[i] = i;
+ }
+ uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
+
+ START();
+ __ Mov(x17, src_base);
+ __ Ldr(q0, MemOperand(x17, 16, PostIndex));
+ __ Ldr(q1, MemOperand(x17, 16, PostIndex));
+ __ Ldr(q2, MemOperand(x17, 16, PostIndex));
+ __ Ldr(q3, MemOperand(x17, 16, PostIndex));
+ __ Mov(x17, src_base);
+
+ __ St1(v0.V8B(), MemOperand(x17));
+ __ Ldr(d16, MemOperand(x17, 8, PostIndex));
+
+ __ St1(v0.V8B(), v1.V8B(), MemOperand(x17));
+ __ Ldr(q17, MemOperand(x17, 16, PostIndex));
+
+ __ St1(v0.V4H(), v1.V4H(), v2.V4H(), MemOperand(x17));
+ __ Ldr(d18, MemOperand(x17, 8, PostIndex));
+ __ Ldr(d19, MemOperand(x17, 8, PostIndex));
+ __ Ldr(d20, MemOperand(x17, 8, PostIndex));
+
+ __ St1(v0.V2S(), v1.V2S(), v2.V2S(), v3.V2S(), MemOperand(x17));
+ __ Ldr(q21, MemOperand(x17, 16, PostIndex));
+ __ Ldr(q22, MemOperand(x17, 16, PostIndex));
+
+ __ St1(v0.V1D(), v1.V1D(), v2.V1D(), v3.V1D(), MemOperand(x17));
+ __ Ldr(q23, MemOperand(x17, 16, PostIndex));
+ __ Ldr(q24, MemOperand(x17));
+ END();
+
+ RUN();
+
+ CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0706050403020100, q0);
+ CHECK_EQUAL_128(0x1f1e1d1c1b1a1918, 0x1716151413121110, q1);
+ CHECK_EQUAL_128(0x2f2e2d2c2b2a2928, 0x2726252423222120, q2);
+ CHECK_EQUAL_128(0x3f3e3d3c3b3a3938, 0x3736353433323130, q3);
+ CHECK_EQUAL_128(0, 0x0706050403020100, q16);
+ CHECK_EQUAL_128(0x1716151413121110, 0x0706050403020100, q17);
+ CHECK_EQUAL_128(0, 0x0706050403020100, q18);
+ CHECK_EQUAL_128(0, 0x1716151413121110, q19);
+ CHECK_EQUAL_128(0, 0x2726252423222120, q20);
+ CHECK_EQUAL_128(0x1716151413121110, 0x0706050403020100, q21);
+ CHECK_EQUAL_128(0x3736353433323130, 0x2726252423222120, q22);
+ CHECK_EQUAL_128(0x1716151413121110, 0x0706050403020100, q23);
+ CHECK_EQUAL_128(0x3736353433323130, 0x2726252423222120, q24);
+
+ TEARDOWN();
+}
+
+TEST(neon_st1_d_postindex) {
+ INIT_V8();
+ SETUP();
+
+ uint8_t src[64 + 14 * kDRegSize];
+ for (unsigned i = 0; i < sizeof(src); i++) {
+ src[i] = i;
+ }
+ uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
+
+ START();
+ __ Mov(x17, src_base);
+ __ Mov(x18, -8);
+ __ Mov(x19, -16);
+ __ Mov(x20, -24);
+ __ Mov(x21, -32);
+ __ Ldr(q0, MemOperand(x17, 16, PostIndex));
+ __ Ldr(q1, MemOperand(x17, 16, PostIndex));
+ __ Ldr(q2, MemOperand(x17, 16, PostIndex));
+ __ Ldr(q3, MemOperand(x17, 16, PostIndex));
+ __ Mov(x17, src_base);
+
+ __ St1(v0.V8B(), MemOperand(x17, 8, PostIndex));
+ __ Ldr(d16, MemOperand(x17, x18));
+
+ __ St1(v0.V8B(), v1.V8B(), MemOperand(x17, 16, PostIndex));
+ __ Ldr(q17, MemOperand(x17, x19));
+
+ __ St1(v0.V4H(), v1.V4H(), v2.V4H(), MemOperand(x17, 24, PostIndex));
+ __ Ldr(d18, MemOperand(x17, x20));
+ __ Ldr(d19, MemOperand(x17, x19));
+ __ Ldr(d20, MemOperand(x17, x18));
+
+ __ St1(v0.V2S(), v1.V2S(), v2.V2S(), v3.V2S(),
+ MemOperand(x17, 32, PostIndex));
+ __ Ldr(q21, MemOperand(x17, x21));
+ __ Ldr(q22, MemOperand(x17, x19));
+
+ __ St1(v0.V1D(), v1.V1D(), v2.V1D(), v3.V1D(),
+ MemOperand(x17, 32, PostIndex));
+ __ Ldr(q23, MemOperand(x17, x21));
+ __ Ldr(q24, MemOperand(x17, x19));
+ END();
+
+ RUN();
+
+ CHECK_EQUAL_128(0, 0x0706050403020100, q16);
+ CHECK_EQUAL_128(0x1716151413121110, 0x0706050403020100, q17);
+ CHECK_EQUAL_128(0, 0x0706050403020100, q18);
+ CHECK_EQUAL_128(0, 0x1716151413121110, q19);
+ CHECK_EQUAL_128(0, 0x2726252423222120, q20);
+ CHECK_EQUAL_128(0x1716151413121110, 0x0706050403020100, q21);
+ CHECK_EQUAL_128(0x3736353433323130, 0x2726252423222120, q22);
+ CHECK_EQUAL_128(0x1716151413121110, 0x0706050403020100, q23);
+ CHECK_EQUAL_128(0x3736353433323130, 0x2726252423222120, q24);
+
+ TEARDOWN();
+}
+
+TEST(neon_st1_q) {
+ INIT_V8();
+ SETUP();
+
+ uint8_t src[64 + 160];
+ for (unsigned i = 0; i < sizeof(src); i++) {
+ src[i] = i;
+ }
+ uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
+
+ START();
+ __ Mov(x17, src_base);
+ __ Ldr(q0, MemOperand(x17, 16, PostIndex));
+ __ Ldr(q1, MemOperand(x17, 16, PostIndex));
+ __ Ldr(q2, MemOperand(x17, 16, PostIndex));
+ __ Ldr(q3, MemOperand(x17, 16, PostIndex));
+
+ __ St1(v0.V16B(), MemOperand(x17));
+ __ Ldr(q16, MemOperand(x17, 16, PostIndex));
+
+ __ St1(v0.V8H(), v1.V8H(), MemOperand(x17));
+ __ Ldr(q17, MemOperand(x17, 16, PostIndex));
+ __ Ldr(q18, MemOperand(x17, 16, PostIndex));
+
+ __ St1(v0.V4S(), v1.V4S(), v2.V4S(), MemOperand(x17));
+ __ Ldr(q19, MemOperand(x17, 16, PostIndex));
+ __ Ldr(q20, MemOperand(x17, 16, PostIndex));
+ __ Ldr(q21, MemOperand(x17, 16, PostIndex));
+
+ __ St1(v0.V2D(), v1.V2D(), v2.V2D(), v3.V2D(), MemOperand(x17));
+ __ Ldr(q22, MemOperand(x17, 16, PostIndex));
+ __ Ldr(q23, MemOperand(x17, 16, PostIndex));
+ __ Ldr(q24, MemOperand(x17, 16, PostIndex));
+ __ Ldr(q25, MemOperand(x17));
+ END();
+
+ RUN();
+
+ CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0706050403020100, q16);
+ CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0706050403020100, q17);
+ CHECK_EQUAL_128(0x1f1e1d1c1b1a1918, 0x1716151413121110, q18);
+ CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0706050403020100, q19);
+ CHECK_EQUAL_128(0x1f1e1d1c1b1a1918, 0x1716151413121110, q20);
+ CHECK_EQUAL_128(0x2f2e2d2c2b2a2928, 0x2726252423222120, q21);
+ CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0706050403020100, q22);
+ CHECK_EQUAL_128(0x1f1e1d1c1b1a1918, 0x1716151413121110, q23);
+ CHECK_EQUAL_128(0x2f2e2d2c2b2a2928, 0x2726252423222120, q24);
+ CHECK_EQUAL_128(0x3f3e3d3c3b3a3938, 0x3736353433323130, q25);
+
+ TEARDOWN();
+}
+
+TEST(neon_st1_q_postindex) {
+ INIT_V8();
+ SETUP();
+
+ uint8_t src[64 + 160];
+ for (unsigned i = 0; i < sizeof(src); i++) {
+ src[i] = i;
+ }
+ uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
+
+ START();
+ __ Mov(x17, src_base);
+ __ Mov(x18, -16);
+ __ Mov(x19, -32);
+ __ Mov(x20, -48);
+ __ Mov(x21, -64);
+ __ Ldr(q0, MemOperand(x17, 16, PostIndex));
+ __ Ldr(q1, MemOperand(x17, 16, PostIndex));
+ __ Ldr(q2, MemOperand(x17, 16, PostIndex));
+ __ Ldr(q3, MemOperand(x17, 16, PostIndex));
+
+ __ St1(v0.V16B(), MemOperand(x17, 16, PostIndex));
+ __ Ldr(q16, MemOperand(x17, x18));
+
+ __ St1(v0.V8H(), v1.V8H(), MemOperand(x17, 32, PostIndex));
+ __ Ldr(q17, MemOperand(x17, x19));
+ __ Ldr(q18, MemOperand(x17, x18));
+
+ __ St1(v0.V4S(), v1.V4S(), v2.V4S(), MemOperand(x17, 48, PostIndex));
+ __ Ldr(q19, MemOperand(x17, x20));
+ __ Ldr(q20, MemOperand(x17, x19));
+ __ Ldr(q21, MemOperand(x17, x18));
+
+ __ St1(v0.V2D(), v1.V2D(), v2.V2D(), v3.V2D(),
+ MemOperand(x17, 64, PostIndex));
+ __ Ldr(q22, MemOperand(x17, x21));
+ __ Ldr(q23, MemOperand(x17, x20));
+ __ Ldr(q24, MemOperand(x17, x19));
+ __ Ldr(q25, MemOperand(x17, x18));
+
+ END();
+
+ RUN();
+
+ CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0706050403020100, q16);
+ CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0706050403020100, q17);
+ CHECK_EQUAL_128(0x1f1e1d1c1b1a1918, 0x1716151413121110, q18);
+ CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0706050403020100, q19);
+ CHECK_EQUAL_128(0x1f1e1d1c1b1a1918, 0x1716151413121110, q20);
+ CHECK_EQUAL_128(0x2f2e2d2c2b2a2928, 0x2726252423222120, q21);
+ CHECK_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0706050403020100, q22);
+ CHECK_EQUAL_128(0x1f1e1d1c1b1a1918, 0x1716151413121110, q23);
+ CHECK_EQUAL_128(0x2f2e2d2c2b2a2928, 0x2726252423222120, q24);
+ CHECK_EQUAL_128(0x3f3e3d3c3b3a3938, 0x3736353433323130, q25);
+
+ TEARDOWN();
+}
+
+TEST(neon_st2_d) {
+ INIT_V8();
+ SETUP();
+
+ uint8_t src[4 * 16];
+ for (unsigned i = 0; i < sizeof(src); i++) {
+ src[i] = i;
+ }
+ uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
+
+ START();
+ __ Mov(x17, src_base);
+ __ Mov(x18, src_base);
+ __ Ldr(q0, MemOperand(x17, 16, PostIndex));
+ __ Ldr(q1, MemOperand(x17, 16, PostIndex));
+
+ __ St2(v0.V8B(), v1.V8B(), MemOperand(x18));
+ __ Add(x18, x18, 22);
+ __ St2(v0.V4H(), v1.V4H(), MemOperand(x18));
+ __ Add(x18, x18, 11);
+ __ St2(v0.V2S(), v1.V2S(), MemOperand(x18));
+
+ __ Mov(x19, src_base);
+ __ Ldr(q0, MemOperand(x19, 16, PostIndex));
+ __ Ldr(q1, MemOperand(x19, 16, PostIndex));
+ __ Ldr(q2, MemOperand(x19, 16, PostIndex));
+ __ Ldr(q3, MemOperand(x19, 16, PostIndex));
+
+ END();
+
+ RUN();
+
+ CHECK_EQUAL_128(0x1707160615051404, 0x1303120211011000, q0);
+ CHECK_EQUAL_128(0x0504131203021110, 0x0100151413121110, q1);
+ CHECK_EQUAL_128(0x1615140706050413, 0x1211100302010014, q2);
+ CHECK_EQUAL_128(0x3f3e3d3c3b3a3938, 0x3736353433323117, q3);
+
+ TEARDOWN();
+}
+
+TEST(neon_st2_d_postindex) {
+ INIT_V8();
+ SETUP();
+
+ uint8_t src[4 * 16];
+ for (unsigned i = 0; i < sizeof(src); i++) {
+ src[i] = i;
+ }
+ uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
+
+ START();
+ __ Mov(x22, 5);
+ __ Mov(x17, src_base);
+ __ Mov(x18, src_base);
+ __ Ldr(q0, MemOperand(x17, 16, PostIndex));
+ __ Ldr(q1, MemOperand(x17, 16, PostIndex));
+
+ __ St2(v0.V8B(), v1.V8B(), MemOperand(x18, x22, PostIndex));
+ __ St2(v0.V4H(), v1.V4H(), MemOperand(x18, 16, PostIndex));
+ __ St2(v0.V2S(), v1.V2S(), MemOperand(x18));
+
+ __ Mov(x19, src_base);
+ __ Ldr(q0, MemOperand(x19, 16, PostIndex));
+ __ Ldr(q1, MemOperand(x19, 16, PostIndex));
+ __ Ldr(q2, MemOperand(x19, 16, PostIndex));
+
+ END();
+
+ RUN();
+
+ CHECK_EQUAL_128(0x1405041312030211, 0x1001000211011000, q0);
+ CHECK_EQUAL_128(0x0605041312111003, 0x0201001716070615, q1);
+ CHECK_EQUAL_128(0x2f2e2d2c2b2a2928, 0x2726251716151407, q2);
+
+ TEARDOWN();
+}
+
+TEST(neon_st2_q) {
+ INIT_V8();
+ SETUP();
+
+ uint8_t src[5 * 16];
+ for (unsigned i = 0; i < sizeof(src); i++) {
+ src[i] = i;
+ }
+ uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
+
+ START();
+ __ Mov(x17, src_base);
+ __ Mov(x18, src_base);
+ __ Ldr(q0, MemOperand(x17, 16, PostIndex));
+ __ Ldr(q1, MemOperand(x17, 16, PostIndex));
+
+ __ St2(v0.V16B(), v1.V16B(), MemOperand(x18));
+ __ Add(x18, x18, 8);
+ __ St2(v0.V8H(), v1.V8H(), MemOperand(x18));
+ __ Add(x18, x18, 22);
+ __ St2(v0.V4S(), v1.V4S(), MemOperand(x18));
+ __ Add(x18, x18, 2);
+ __ St2(v0.V2D(), v1.V2D(), MemOperand(x18));
+
+ __ Mov(x19, src_base);
+ __ Ldr(q0, MemOperand(x19, 16, PostIndex));
+ __ Ldr(q1, MemOperand(x19, 16, PostIndex));
+ __ Ldr(q2, MemOperand(x19, 16, PostIndex));
+ __ Ldr(q3, MemOperand(x19, 16, PostIndex));
+
+ END();
+
+ RUN();
+
+ CHECK_EQUAL_128(0x1312030211100100, 0x1303120211011000, q0);
+ CHECK_EQUAL_128(0x01000b0a19180908, 0x1716070615140504, q1);
+ CHECK_EQUAL_128(0x1716151413121110, 0x0706050403020100, q2);
+ CHECK_EQUAL_128(0x1f1e1d1c1b1a1918, 0x0f0e0d0c0b0a0908, q3);
+ TEARDOWN();
+}
+
+TEST(neon_st2_q_postindex) {
+ INIT_V8();
+ SETUP();
+
+ uint8_t src[5 * 16];
+ for (unsigned i = 0; i < sizeof(src); i++) {
+ src[i] = i;
+ }
+ uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
+
+ START();
+ __ Mov(x22, 5);
+ __ Mov(x17, src_base);
+ __ Mov(x18, src_base);
+ __ Ldr(q0, MemOperand(x17, 16, PostIndex));
+ __ Ldr(q1, MemOperand(x17, 16, PostIndex));
+
+ __ St2(v0.V16B(), v1.V16B(), MemOperand(x18, x22, PostIndex));
+ __ St2(v0.V8H(), v1.V8H(), MemOperand(x18, 32, PostIndex));
+ __ St2(v0.V4S(), v1.V4S(), MemOperand(x18, x22, PostIndex));
+ __ St2(v0.V2D(), v1.V2D(), MemOperand(x18));
+
+ __ Mov(x19, src_base);
+ __ Ldr(q0, MemOperand(x19, 16, PostIndex));
+ __ Ldr(q1, MemOperand(x19, 16, PostIndex));
+ __ Ldr(q2, MemOperand(x19, 16, PostIndex));
+ __ Ldr(q3, MemOperand(x19, 16, PostIndex));
+ __ Ldr(q4, MemOperand(x19, 16, PostIndex));
+
+ END();
+
+ RUN();
+
+ CHECK_EQUAL_128(0x1405041312030211, 0x1001000211011000, q0);
+ CHECK_EQUAL_128(0x1c0d0c1b1a0b0a19, 0x1809081716070615, q1);
+ CHECK_EQUAL_128(0x0504030201001003, 0x0201001f1e0f0e1d, q2);
+ CHECK_EQUAL_128(0x0d0c0b0a09081716, 0x1514131211100706, q3);
+ CHECK_EQUAL_128(0x4f4e4d4c4b4a1f1e, 0x1d1c1b1a19180f0e, q4);
+
+ TEARDOWN();
+}
+
+TEST(neon_st3_d) {
+ INIT_V8();
+ SETUP();
+
+ uint8_t src[3 * 16];
+ for (unsigned i = 0; i < sizeof(src); i++) {
+ src[i] = i;
+ }
+ uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
+
+ START();
+ __ Mov(x17, src_base);
+ __ Mov(x18, src_base);
+ __ Ldr(q0, MemOperand(x17, 16, PostIndex));
+ __ Ldr(q1, MemOperand(x17, 16, PostIndex));
+ __ Ldr(q2, MemOperand(x17, 16, PostIndex));
+
+ __ St3(v0.V8B(), v1.V8B(), v2.V8B(), MemOperand(x18));
+ __ Add(x18, x18, 3);
+ __ St3(v0.V4H(), v1.V4H(), v2.V4H(), MemOperand(x18));
+ __ Add(x18, x18, 2);
+ __ St3(v0.V2S(), v1.V2S(), v2.V2S(), MemOperand(x18));
+
+ __ Mov(x19, src_base);
+ __ Ldr(q0, MemOperand(x19, 16, PostIndex));
+ __ Ldr(q1, MemOperand(x19, 16, PostIndex));
+
+ END();
+
+ RUN();
+
+ CHECK_EQUAL_128(0x2221201312111003, 0x0201000100201000, q0);
+ CHECK_EQUAL_128(0x1f1e1d2726252417, 0x1615140706050423, q1);
+
+ TEARDOWN();
+}
+
+TEST(neon_st3_d_postindex) {
+ INIT_V8();
+ SETUP();
+
+ uint8_t src[4 * 16];
+ for (unsigned i = 0; i < sizeof(src); i++) {
+ src[i] = i;
+ }
+ uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
+
+ START();
+ __ Mov(x22, 5);
+ __ Mov(x17, src_base);
+ __ Mov(x18, src_base);
+ __ Ldr(q0, MemOperand(x17, 16, PostIndex));
+ __ Ldr(q1, MemOperand(x17, 16, PostIndex));
+ __ Ldr(q2, MemOperand(x17, 16, PostIndex));
+
+ __ St3(v0.V8B(), v1.V8B(), v2.V8B(), MemOperand(x18, x22, PostIndex));
+ __ St3(v0.V4H(), v1.V4H(), v2.V4H(), MemOperand(x18, 24, PostIndex));
+ __ St3(v0.V2S(), v1.V2S(), v2.V2S(), MemOperand(x18));
+
+ __ Mov(x19, src_base);
+ __ Ldr(q0, MemOperand(x19, 16, PostIndex));
+ __ Ldr(q1, MemOperand(x19, 16, PostIndex));
+ __ Ldr(q2, MemOperand(x19, 16, PostIndex));
+ __ Ldr(q3, MemOperand(x19, 16, PostIndex));
+
+ END();
+
+ RUN();
+
+ CHECK_EQUAL_128(0x2213120302212011, 0x1001001101201000, q0);
+ CHECK_EQUAL_128(0x0201002726171607, 0x0625241514050423, q1);
+ CHECK_EQUAL_128(0x1615140706050423, 0x2221201312111003, q2);
+ CHECK_EQUAL_128(0x3f3e3d3c3b3a3938, 0x3736352726252417, q3);
+
+ TEARDOWN();
+}
+
+TEST(neon_st3_q) {
+ INIT_V8();
+ SETUP();
+
+ uint8_t src[6 * 16];
+ for (unsigned i = 0; i < sizeof(src); i++) {
+ src[i] = i;
+ }
+ uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
+
+ START();
+ __ Mov(x17, src_base);
+ __ Mov(x18, src_base);
+ __ Ldr(q0, MemOperand(x17, 16, PostIndex));
+ __ Ldr(q1, MemOperand(x17, 16, PostIndex));
+ __ Ldr(q2, MemOperand(x17, 16, PostIndex));
+
+ __ St3(v0.V16B(), v1.V16B(), v2.V16B(), MemOperand(x18));
+ __ Add(x18, x18, 5);
+ __ St3(v0.V8H(), v1.V8H(), v2.V8H(), MemOperand(x18));
+ __ Add(x18, x18, 12);
+ __ St3(v0.V4S(), v1.V4S(), v2.V4S(), MemOperand(x18));
+ __ Add(x18, x18, 22);
+ __ St3(v0.V2D(), v1.V2D(), v2.V2D(), MemOperand(x18));
+
+ __ Mov(x19, src_base);
+ __ Ldr(q0, MemOperand(x19, 16, PostIndex));
+ __ Ldr(q1, MemOperand(x19, 16, PostIndex));
+ __ Ldr(q2, MemOperand(x19, 16, PostIndex));
+ __ Ldr(q3, MemOperand(x19, 16, PostIndex));
+ __ Ldr(q4, MemOperand(x19, 16, PostIndex));
+ __ Ldr(q5, MemOperand(x19, 16, PostIndex));
+
+ END();
+
+ RUN();
+
+ CHECK_EQUAL_128(0x2213120302212011, 0x1001001101201000, q0);
+ CHECK_EQUAL_128(0x0605042322212013, 0x1211100302010023, q1);
+ CHECK_EQUAL_128(0x1007060504030201, 0x0025241716151407, q2);
+ CHECK_EQUAL_128(0x0827262524232221, 0x2017161514131211, q3);
+ CHECK_EQUAL_128(0x281f1e1d1c1b1a19, 0x180f0e0d0c0b0a09, q4);
+ CHECK_EQUAL_128(0x5f5e5d5c5b5a5958, 0x572f2e2d2c2b2a29, q5);
+
+ TEARDOWN();
+}
+
+TEST(neon_st3_q_postindex) {
+ INIT_V8();
+ SETUP();
+
+ uint8_t src[7 * 16];
+ for (unsigned i = 0; i < sizeof(src); i++) {
+ src[i] = i;
+ }
+ uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
+
+ START();
+ __ Mov(x22, 5);
+ __ Mov(x17, src_base);
+ __ Mov(x18, src_base);
+ __ Ldr(q0, MemOperand(x17, 16, PostIndex));
+ __ Ldr(q1, MemOperand(x17, 16, PostIndex));
+ __ Ldr(q2, MemOperand(x17, 16, PostIndex));
+
+ __ St3(v0.V16B(), v1.V16B(), v2.V16B(), MemOperand(x18, x22, PostIndex));
+ __ St3(v0.V8H(), v1.V8H(), v2.V8H(), MemOperand(x18, 48, PostIndex));
+ __ St3(v0.V4S(), v1.V4S(), v2.V4S(), MemOperand(x18, x22, PostIndex));
+ __ St3(v0.V2D(), v1.V2D(), v2.V2D(), MemOperand(x18));
+
+ __ Mov(x19, src_base);
+ __ Ldr(q0, MemOperand(x19, 16, PostIndex));
+ __ Ldr(q1, MemOperand(x19, 16, PostIndex));
+ __ Ldr(q2, MemOperand(x19, 16, PostIndex));
+ __ Ldr(q3, MemOperand(x19, 16, PostIndex));
+ __ Ldr(q4, MemOperand(x19, 16, PostIndex));
+ __ Ldr(q5, MemOperand(x19, 16, PostIndex));
+ __ Ldr(q6, MemOperand(x19, 16, PostIndex));
+
+ END();
+
+ RUN();
+
+ CHECK_EQUAL_128(0x2213120302212011, 0x1001001101201000, q0);
+ CHECK_EQUAL_128(0x1809082726171607, 0x0625241514050423, q1);
+ CHECK_EQUAL_128(0x0e2d2c1d1c0d0c2b, 0x2a1b1a0b0a292819, q2);
+ CHECK_EQUAL_128(0x0504030201001003, 0x0201002f2e1f1e0f, q3);
+ CHECK_EQUAL_128(0x2524232221201716, 0x1514131211100706, q4);
+ CHECK_EQUAL_128(0x1d1c1b1a19180f0e, 0x0d0c0b0a09082726, q5);
+ CHECK_EQUAL_128(0x6f6e6d6c6b6a2f2e, 0x2d2c2b2a29281f1e, q6);
+
+ TEARDOWN();
+}
+
+TEST(neon_st4_d) {
+ INIT_V8();
+ SETUP();
+
+ uint8_t src[4 * 16];
+ for (unsigned i = 0; i < sizeof(src); i++) {
+ src[i] = i;
+ }
+ uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
+
+ START();
+ __ Mov(x17, src_base);
+ __ Mov(x18, src_base);
+ __ Ldr(q0, MemOperand(x17, 16, PostIndex));
+ __ Ldr(q1, MemOperand(x17, 16, PostIndex));
+ __ Ldr(q2, MemOperand(x17, 16, PostIndex));
+ __ Ldr(q3, MemOperand(x17, 16, PostIndex));
+
+ __ St4(v0.V8B(), v1.V8B(), v2.V8B(), v3.V8B(), MemOperand(x18));
+ __ Add(x18, x18, 12);
+ __ St4(v0.V4H(), v1.V4H(), v2.V4H(), v3.V4H(), MemOperand(x18));
+ __ Add(x18, x18, 15);
+ __ St4(v0.V2S(), v1.V2S(), v2.V2S(), v3.V2S(), MemOperand(x18));
+
+ __ Mov(x19, src_base);
+ __ Ldr(q0, MemOperand(x19, 16, PostIndex));
+ __ Ldr(q1, MemOperand(x19, 16, PostIndex));
+ __ Ldr(q2, MemOperand(x19, 16, PostIndex));
+ __ Ldr(q3, MemOperand(x19, 16, PostIndex));
+
+ END();
+
+ RUN();
+
+ CHECK_EQUAL_128(0x1110010032221202, 0X3121110130201000, q0);
+ CHECK_EQUAL_128(0x1003020100322322, 0X1312030231302120, q1);
+ CHECK_EQUAL_128(0x1407060504333231, 0X3023222120131211, q2);
+ CHECK_EQUAL_128(0x3f3e3d3c3b373635, 0x3427262524171615, q3);
+
+ TEARDOWN();
+}
+
+TEST(neon_st4_d_postindex) {
+ INIT_V8();
+ SETUP();
+
+ uint8_t src[5 * 16];
+ for (unsigned i = 0; i < sizeof(src); i++) {
+ src[i] = i;
+ }
+ uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
+
+ START();
+ __ Mov(x22, 5);
+ __ Mov(x17, src_base);
+ __ Mov(x18, src_base);
+ __ Ldr(q0, MemOperand(x17, 16, PostIndex));
+ __ Ldr(q1, MemOperand(x17, 16, PostIndex));
+ __ Ldr(q2, MemOperand(x17, 16, PostIndex));
+ __ Ldr(q3, MemOperand(x17, 16, PostIndex));
+
+ __ St4(v0.V8B(), v1.V8B(), v2.V8B(), v3.V8B(),
+ MemOperand(x18, x22, PostIndex));
+ __ St4(v0.V4H(), v1.V4H(), v2.V4H(), v3.V4H(),
+ MemOperand(x18, 32, PostIndex));
+ __ St4(v0.V2S(), v1.V2S(), v2.V2S(), v3.V2S(), MemOperand(x18));
+
+ __ Mov(x19, src_base);
+ __ Ldr(q0, MemOperand(x19, 16, PostIndex));
+ __ Ldr(q1, MemOperand(x19, 16, PostIndex));
+ __ Ldr(q2, MemOperand(x19, 16, PostIndex));
+ __ Ldr(q3, MemOperand(x19, 16, PostIndex));
+ __ Ldr(q4, MemOperand(x19, 16, PostIndex));
+
+ END();
+
+ RUN();
+
+ CHECK_EQUAL_128(0x1203023130212011, 0x1001000130201000, q0);
+ CHECK_EQUAL_128(0x1607063534252415, 0x1405043332232213, q1);
+ CHECK_EQUAL_128(0x2221201312111003, 0x0201003736272617, q2);
+ CHECK_EQUAL_128(0x2625241716151407, 0x0605043332313023, q3);
+ CHECK_EQUAL_128(0x4f4e4d4c4b4a4948, 0x4746453736353427, q4);
+
+ TEARDOWN();
+}
+
+TEST(neon_st4_q) {
INIT_V8();
SETUP();
- uint64_t src[2] = {0xfedcba9876543210UL, 0x0123456789abcdefUL};
- uint64_t dst[6] = {0, 0, 0, 0, 0, 0};
+ uint8_t src[7 * 16];
+ for (unsigned i = 0; i < sizeof(src); i++) {
+ src[i] = i;
+ }
uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
- uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
START();
__ Mov(x17, src_base);
- __ Mov(x18, dst_base);
+ __ Mov(x18, src_base);
+ __ Ldr(q0, MemOperand(x17, 16, PostIndex));
+ __ Ldr(q1, MemOperand(x17, 16, PostIndex));
+ __ Ldr(q2, MemOperand(x17, 16, PostIndex));
+ __ Ldr(q3, MemOperand(x17, 16, PostIndex));
+
+ __ St4(v0.V16B(), v1.V16B(), v2.V16B(), v3.V16B(), MemOperand(x18));
+ __ Add(x18, x18, 5);
+ __ St4(v0.V8H(), v1.V8H(), v2.V8H(), v3.V8H(), MemOperand(x18));
+ __ Add(x18, x18, 12);
+ __ St4(v0.V4S(), v1.V4S(), v2.V4S(), v3.V4S(), MemOperand(x18));
+ __ Add(x18, x18, 22);
+ __ St4(v0.V2D(), v1.V2D(), v2.V2D(), v3.V2D(), MemOperand(x18));
+ __ Add(x18, x18, 10);
+
__ Mov(x19, src_base);
- __ Mov(x20, dst_base);
- __ Mov(x21, src_base + 16);
- __ Mov(x22, dst_base + 40);
- __ Mov(x23, src_base);
- __ Mov(x24, dst_base);
- __ Mov(x25, src_base);
- __ Mov(x26, dst_base);
- __ Ldr(w0, MemOperand(x17, 4, PreIndex));
- __ Str(w0, MemOperand(x18, 12, PreIndex));
- __ Ldr(x1, MemOperand(x19, 8, PreIndex));
- __ Str(x1, MemOperand(x20, 16, PreIndex));
- __ Ldr(w2, MemOperand(x21, -4, PreIndex));
- __ Str(w2, MemOperand(x22, -4, PreIndex));
- __ Ldrb(w3, MemOperand(x23, 1, PreIndex));
- __ Strb(w3, MemOperand(x24, 25, PreIndex));
- __ Ldrh(w4, MemOperand(x25, 3, PreIndex));
- __ Strh(w4, MemOperand(x26, 41, PreIndex));
+ __ Ldr(q0, MemOperand(x19, 16, PostIndex));
+ __ Ldr(q1, MemOperand(x19, 16, PostIndex));
+ __ Ldr(q2, MemOperand(x19, 16, PostIndex));
+ __ Ldr(q3, MemOperand(x19, 16, PostIndex));
+ __ Ldr(q4, MemOperand(x19, 16, PostIndex));
+ __ Ldr(q5, MemOperand(x19, 16, PostIndex));
+ __ Ldr(q6, MemOperand(x19, 16, PostIndex));
+
END();
RUN();
- CHECK_EQUAL_64(0xfedcba98, x0);
- CHECK_EQUAL_64(0xfedcba9800000000UL, dst[1]);
- CHECK_EQUAL_64(0x0123456789abcdefUL, x1);
- CHECK_EQUAL_64(0x0123456789abcdefUL, dst[2]);
- CHECK_EQUAL_64(0x01234567, x2);
- CHECK_EQUAL_64(0x0123456700000000UL, dst[4]);
- CHECK_EQUAL_64(0x32, x3);
- CHECK_EQUAL_64(0x3200, dst[3]);
- CHECK_EQUAL_64(0x9876, x4);
- CHECK_EQUAL_64(0x987600, dst[5]);
- CHECK_EQUAL_64(src_base + 4, x17);
- CHECK_EQUAL_64(dst_base + 12, x18);
- CHECK_EQUAL_64(src_base + 8, x19);
- CHECK_EQUAL_64(dst_base + 16, x20);
- CHECK_EQUAL_64(src_base + 12, x21);
- CHECK_EQUAL_64(dst_base + 36, x22);
- CHECK_EQUAL_64(src_base + 1, x23);
- CHECK_EQUAL_64(dst_base + 25, x24);
- CHECK_EQUAL_64(src_base + 3, x25);
- CHECK_EQUAL_64(dst_base + 41, x26);
+ CHECK_EQUAL_128(0x1203023130212011, 0x1001000130201000, q0);
+ CHECK_EQUAL_128(0x3231302322212013, 0x1211100302010013, q1);
+ CHECK_EQUAL_128(0x1007060504030201, 0x0015140706050433, q2);
+ CHECK_EQUAL_128(0x3027262524232221, 0x2017161514131211, q3);
+ CHECK_EQUAL_128(0x180f0e0d0c0b0a09, 0x0837363534333231, q4);
+ CHECK_EQUAL_128(0x382f2e2d2c2b2a29, 0x281f1e1d1c1b1a19, q5);
+ CHECK_EQUAL_128(0x6f6e6d6c6b6a6968, 0x673f3e3d3c3b3a39, q6);
TEARDOWN();
}
-
-TEST(ldr_str_postindex) {
+TEST(neon_st4_q_postindex) {
INIT_V8();
SETUP();
- uint64_t src[2] = {0xfedcba9876543210UL, 0x0123456789abcdefUL};
- uint64_t dst[6] = {0, 0, 0, 0, 0, 0};
+ uint8_t src[9 * 16];
+ for (unsigned i = 0; i < sizeof(src); i++) {
+ src[i] = i;
+ }
uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
- uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
START();
- __ Mov(x17, src_base + 4);
- __ Mov(x18, dst_base + 12);
- __ Mov(x19, src_base + 8);
- __ Mov(x20, dst_base + 16);
- __ Mov(x21, src_base + 8);
- __ Mov(x22, dst_base + 32);
- __ Mov(x23, src_base + 1);
- __ Mov(x24, dst_base + 25);
- __ Mov(x25, src_base + 3);
- __ Mov(x26, dst_base + 41);
- __ Ldr(w0, MemOperand(x17, 4, PostIndex));
- __ Str(w0, MemOperand(x18, 12, PostIndex));
- __ Ldr(x1, MemOperand(x19, 8, PostIndex));
- __ Str(x1, MemOperand(x20, 16, PostIndex));
- __ Ldr(x2, MemOperand(x21, -8, PostIndex));
- __ Str(x2, MemOperand(x22, -32, PostIndex));
- __ Ldrb(w3, MemOperand(x23, 1, PostIndex));
- __ Strb(w3, MemOperand(x24, 5, PostIndex));
- __ Ldrh(w4, MemOperand(x25, -3, PostIndex));
- __ Strh(w4, MemOperand(x26, -41, PostIndex));
+ __ Mov(x22, 5);
+ __ Mov(x17, src_base);
+ __ Mov(x18, src_base);
+ __ Ldr(q0, MemOperand(x17, 16, PostIndex));
+ __ Ldr(q1, MemOperand(x17, 16, PostIndex));
+ __ Ldr(q2, MemOperand(x17, 16, PostIndex));
+ __ Ldr(q3, MemOperand(x17, 16, PostIndex));
+
+ __ St4(v0.V16B(), v1.V16B(), v2.V16B(), v3.V16B(),
+ MemOperand(x18, x22, PostIndex));
+ __ St4(v0.V8H(), v1.V8H(), v2.V8H(), v3.V8H(),
+ MemOperand(x18, 64, PostIndex));
+ __ St4(v0.V4S(), v1.V4S(), v2.V4S(), v3.V4S(),
+ MemOperand(x18, x22, PostIndex));
+ __ St4(v0.V2D(), v1.V2D(), v2.V2D(), v3.V2D(), MemOperand(x18));
+
+ __ Mov(x19, src_base);
+ __ Ldr(q0, MemOperand(x19, 16, PostIndex));
+ __ Ldr(q1, MemOperand(x19, 16, PostIndex));
+ __ Ldr(q2, MemOperand(x19, 16, PostIndex));
+ __ Ldr(q3, MemOperand(x19, 16, PostIndex));
+ __ Ldr(q4, MemOperand(x19, 16, PostIndex));
+ __ Ldr(q5, MemOperand(x19, 16, PostIndex));
+ __ Ldr(q6, MemOperand(x19, 16, PostIndex));
+ __ Ldr(q7, MemOperand(x19, 16, PostIndex));
+ __ Ldr(q8, MemOperand(x19, 16, PostIndex));
+
END();
RUN();
- CHECK_EQUAL_64(0xfedcba98, x0);
- CHECK_EQUAL_64(0xfedcba9800000000UL, dst[1]);
- CHECK_EQUAL_64(0x0123456789abcdefUL, x1);
- CHECK_EQUAL_64(0x0123456789abcdefUL, dst[2]);
- CHECK_EQUAL_64(0x0123456789abcdefUL, x2);
- CHECK_EQUAL_64(0x0123456789abcdefUL, dst[4]);
- CHECK_EQUAL_64(0x32, x3);
- CHECK_EQUAL_64(0x3200, dst[3]);
- CHECK_EQUAL_64(0x9876, x4);
- CHECK_EQUAL_64(0x987600, dst[5]);
- CHECK_EQUAL_64(src_base + 8, x17);
- CHECK_EQUAL_64(dst_base + 24, x18);
- CHECK_EQUAL_64(src_base + 16, x19);
- CHECK_EQUAL_64(dst_base + 32, x20);
- CHECK_EQUAL_64(src_base, x21);
- CHECK_EQUAL_64(dst_base, x22);
- CHECK_EQUAL_64(src_base + 2, x23);
- CHECK_EQUAL_64(dst_base + 30, x24);
- CHECK_EQUAL_64(src_base, x25);
- CHECK_EQUAL_64(dst_base, x26);
+ CHECK_EQUAL_128(0x1203023130212011, 0x1001000130201000, q0);
+ CHECK_EQUAL_128(0x1607063534252415, 0x1405043332232213, q1);
+ CHECK_EQUAL_128(0x1a0b0a3938292819, 0x1809083736272617, q2);
+ CHECK_EQUAL_128(0x1e0f0e3d3c2d2c1d, 0x1c0d0c3b3a2b2a1b, q3);
+ CHECK_EQUAL_128(0x0504030201001003, 0x0201003f3e2f2e1f, q4);
+ CHECK_EQUAL_128(0x2524232221201716, 0x1514131211100706, q5);
+ CHECK_EQUAL_128(0x0d0c0b0a09083736, 0x3534333231302726, q6);
+ CHECK_EQUAL_128(0x2d2c2b2a29281f1e, 0x1d1c1b1a19180f0e, q7);
+ CHECK_EQUAL_128(0x8f8e8d8c8b8a3f3e, 0x3d3c3b3a39382f2e, q8);
TEARDOWN();
}
-
-TEST(load_signed) {
+TEST(neon_destructive_minmaxp) {
INIT_V8();
SETUP();
- uint32_t src[2] = {0x80008080, 0x7fff7f7f};
- uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
-
START();
- __ Mov(x24, src_base);
- __ Ldrsb(w0, MemOperand(x24));
- __ Ldrsb(w1, MemOperand(x24, 4));
- __ Ldrsh(w2, MemOperand(x24));
- __ Ldrsh(w3, MemOperand(x24, 4));
- __ Ldrsb(x4, MemOperand(x24));
- __ Ldrsb(x5, MemOperand(x24, 4));
- __ Ldrsh(x6, MemOperand(x24));
- __ Ldrsh(x7, MemOperand(x24, 4));
- __ Ldrsw(x8, MemOperand(x24));
- __ Ldrsw(x9, MemOperand(x24, 4));
+ __ Movi(v0.V2D(), 0, 0x2222222233333333);
+ __ Movi(v1.V2D(), 0, 0x0000000011111111);
+
+ __ Sminp(v16.V2S(), v0.V2S(), v1.V2S());
+ __ Mov(v17, v0);
+ __ Sminp(v17.V2S(), v17.V2S(), v1.V2S());
+ __ Mov(v18, v1);
+ __ Sminp(v18.V2S(), v0.V2S(), v18.V2S());
+ __ Mov(v19, v0);
+ __ Sminp(v19.V2S(), v19.V2S(), v19.V2S());
+
+ __ Smaxp(v20.V2S(), v0.V2S(), v1.V2S());
+ __ Mov(v21, v0);
+ __ Smaxp(v21.V2S(), v21.V2S(), v1.V2S());
+ __ Mov(v22, v1);
+ __ Smaxp(v22.V2S(), v0.V2S(), v22.V2S());
+ __ Mov(v23, v0);
+ __ Smaxp(v23.V2S(), v23.V2S(), v23.V2S());
+
+ __ Uminp(v24.V2S(), v0.V2S(), v1.V2S());
+ __ Mov(v25, v0);
+ __ Uminp(v25.V2S(), v25.V2S(), v1.V2S());
+ __ Mov(v26, v1);
+ __ Uminp(v26.V2S(), v0.V2S(), v26.V2S());
+ __ Mov(v27, v0);
+ __ Uminp(v27.V2S(), v27.V2S(), v27.V2S());
+
+ __ Umaxp(v28.V2S(), v0.V2S(), v1.V2S());
+ __ Mov(v29, v0);
+ __ Umaxp(v29.V2S(), v29.V2S(), v1.V2S());
+ __ Mov(v30, v1);
+ __ Umaxp(v30.V2S(), v0.V2S(), v30.V2S());
+ __ Mov(v31, v0);
+ __ Umaxp(v31.V2S(), v31.V2S(), v31.V2S());
END();
RUN();
- CHECK_EQUAL_64(0xffffff80, x0);
- CHECK_EQUAL_64(0x0000007f, x1);
- CHECK_EQUAL_64(0xffff8080, x2);
- CHECK_EQUAL_64(0x00007f7f, x3);
- CHECK_EQUAL_64(0xffffffffffffff80UL, x4);
- CHECK_EQUAL_64(0x000000000000007fUL, x5);
- CHECK_EQUAL_64(0xffffffffffff8080UL, x6);
- CHECK_EQUAL_64(0x0000000000007f7fUL, x7);
- CHECK_EQUAL_64(0xffffffff80008080UL, x8);
- CHECK_EQUAL_64(0x000000007fff7f7fUL, x9);
+ CHECK_EQUAL_128(0, 0x0000000022222222, q16);
+ CHECK_EQUAL_128(0, 0x0000000022222222, q17);
+ CHECK_EQUAL_128(0, 0x0000000022222222, q18);
+ CHECK_EQUAL_128(0, 0x2222222222222222, q19);
+
+ CHECK_EQUAL_128(0, 0x1111111133333333, q20);
+ CHECK_EQUAL_128(0, 0x1111111133333333, q21);
+ CHECK_EQUAL_128(0, 0x1111111133333333, q22);
+ CHECK_EQUAL_128(0, 0x3333333333333333, q23);
+
+ CHECK_EQUAL_128(0, 0x0000000022222222, q24);
+ CHECK_EQUAL_128(0, 0x0000000022222222, q25);
+ CHECK_EQUAL_128(0, 0x0000000022222222, q26);
+ CHECK_EQUAL_128(0, 0x2222222222222222, q27);
+
+ CHECK_EQUAL_128(0, 0x1111111133333333, q28);
+ CHECK_EQUAL_128(0, 0x1111111133333333, q29);
+ CHECK_EQUAL_128(0, 0x1111111133333333, q30);
+ CHECK_EQUAL_128(0, 0x3333333333333333, q31);
TEARDOWN();
}
-
-TEST(load_store_regoffset) {
+TEST(neon_destructive_tbl) {
INIT_V8();
SETUP();
- uint32_t src[3] = {1, 2, 3};
- uint32_t dst[4] = {0, 0, 0, 0};
- uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
- uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
-
START();
- __ Mov(x16, src_base);
- __ Mov(x17, dst_base);
- __ Mov(x18, src_base + 3 * sizeof(src[0]));
- __ Mov(x19, dst_base + 3 * sizeof(dst[0]));
- __ Mov(x20, dst_base + 4 * sizeof(dst[0]));
- __ Mov(x24, 0);
- __ Mov(x25, 4);
- __ Mov(x26, -4);
- __ Mov(x27, 0xfffffffc); // 32-bit -4.
- __ Mov(x28, 0xfffffffe); // 32-bit -2.
- __ Mov(x29, 0xffffffff); // 32-bit -1.
+ __ Movi(v0.V2D(), 0x0041424334353627, 0x28291a1b1c0d0e0f);
+ __ Movi(v1.V2D(), 0xafaeadacabaaa9a8, 0xa7a6a5a4a3a2a1a0);
+ __ Movi(v2.V2D(), 0xbfbebdbcbbbab9b8, 0xb7b6b5b4b3b2b1b0);
+ __ Movi(v3.V2D(), 0xcfcecdcccbcac9c8, 0xc7c6c5c4c3c2c1c0);
+ __ Movi(v4.V2D(), 0xdfdedddcdbdad9d8, 0xd7d6d5d4d3d2d1d0);
- __ Ldr(w0, MemOperand(x16, x24));
- __ Ldr(x1, MemOperand(x16, x25));
- __ Ldr(w2, MemOperand(x18, x26));
- __ Ldr(w3, MemOperand(x18, x27, SXTW));
- __ Ldr(w4, MemOperand(x18, x28, SXTW, 2));
- __ Str(w0, MemOperand(x17, x24));
- __ Str(x1, MemOperand(x17, x25));
- __ Str(w2, MemOperand(x20, x29, SXTW, 2));
+ __ Movi(v16.V2D(), 0x5555555555555555, 0x5555555555555555);
+ __ Tbl(v16.V16B(), v1.V16B(), v0.V16B());
+ __ Mov(v17, v0);
+ __ Tbl(v17.V16B(), v1.V16B(), v17.V16B());
+ __ Mov(v18, v1);
+ __ Tbl(v18.V16B(), v18.V16B(), v0.V16B());
+ __ Mov(v19, v0);
+ __ Tbl(v19.V16B(), v19.V16B(), v19.V16B());
+
+ __ Movi(v20.V2D(), 0x5555555555555555, 0x5555555555555555);
+ __ Tbl(v20.V16B(), v1.V16B(), v2.V16B(), v3.V16B(), v4.V16B(), v0.V16B());
+ __ Mov(v21, v0);
+ __ Tbl(v21.V16B(), v1.V16B(), v2.V16B(), v3.V16B(), v4.V16B(), v21.V16B());
+ __ Mov(v22, v1);
+ __ Mov(v23, v2);
+ __ Mov(v24, v3);
+ __ Mov(v25, v4);
+ __ Tbl(v22.V16B(), v22.V16B(), v23.V16B(), v24.V16B(), v25.V16B(), v0.V16B());
+ __ Mov(v26, v0);
+ __ Mov(v27, v1);
+ __ Mov(v28, v2);
+ __ Mov(v29, v3);
+ __ Tbl(v26.V16B(), v26.V16B(), v27.V16B(), v28.V16B(), v29.V16B(),
+ v26.V16B());
END();
RUN();
- CHECK_EQUAL_64(1, x0);
- CHECK_EQUAL_64(0x0000000300000002UL, x1);
- CHECK_EQUAL_64(3, x2);
- CHECK_EQUAL_64(3, x3);
- CHECK_EQUAL_64(2, x4);
- CHECK_EQUAL_32(1, dst[0]);
- CHECK_EQUAL_32(2, dst[1]);
- CHECK_EQUAL_32(3, dst[2]);
- CHECK_EQUAL_32(3, dst[3]);
+ CHECK_EQUAL_128(0xa000000000000000, 0x0000000000adaeaf, q16);
+ CHECK_EQUAL_128(0xa000000000000000, 0x0000000000adaeaf, q17);
+ CHECK_EQUAL_128(0xa000000000000000, 0x0000000000adaeaf, q18);
+ CHECK_EQUAL_128(0x0f00000000000000, 0x0000000000424100, q19);
+
+ CHECK_EQUAL_128(0xa0000000d4d5d6c7, 0xc8c9babbbcadaeaf, q20);
+ CHECK_EQUAL_128(0xa0000000d4d5d6c7, 0xc8c9babbbcadaeaf, q21);
+ CHECK_EQUAL_128(0xa0000000d4d5d6c7, 0xc8c9babbbcadaeaf, q22);
+ CHECK_EQUAL_128(0x0f000000c4c5c6b7, 0xb8b9aaabac424100, q26);
TEARDOWN();
}
-
-TEST(load_store_float) {
+TEST(neon_destructive_tbx) {
INIT_V8();
SETUP();
- float src[3] = {1.0, 2.0, 3.0};
- float dst[3] = {0.0, 0.0, 0.0};
- uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
- uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
-
START();
- __ Mov(x17, src_base);
- __ Mov(x18, dst_base);
- __ Mov(x19, src_base);
- __ Mov(x20, dst_base);
- __ Mov(x21, src_base);
- __ Mov(x22, dst_base);
- __ Ldr(s0, MemOperand(x17, sizeof(src[0])));
- __ Str(s0, MemOperand(x18, sizeof(dst[0]), PostIndex));
- __ Ldr(s1, MemOperand(x19, sizeof(src[0]), PostIndex));
- __ Str(s1, MemOperand(x20, 2 * sizeof(dst[0]), PreIndex));
- __ Ldr(s2, MemOperand(x21, 2 * sizeof(src[0]), PreIndex));
- __ Str(s2, MemOperand(x22, sizeof(dst[0])));
+ __ Movi(v0.V2D(), 0x0041424334353627, 0x28291a1b1c0d0e0f);
+ __ Movi(v1.V2D(), 0xafaeadacabaaa9a8, 0xa7a6a5a4a3a2a1a0);
+ __ Movi(v2.V2D(), 0xbfbebdbcbbbab9b8, 0xb7b6b5b4b3b2b1b0);
+ __ Movi(v3.V2D(), 0xcfcecdcccbcac9c8, 0xc7c6c5c4c3c2c1c0);
+ __ Movi(v4.V2D(), 0xdfdedddcdbdad9d8, 0xd7d6d5d4d3d2d1d0);
+
+ __ Movi(v16.V2D(), 0x5555555555555555, 0x5555555555555555);
+ __ Tbx(v16.V16B(), v1.V16B(), v0.V16B());
+ __ Mov(v17, v0);
+ __ Tbx(v17.V16B(), v1.V16B(), v17.V16B());
+ __ Mov(v18, v1);
+ __ Tbx(v18.V16B(), v18.V16B(), v0.V16B());
+ __ Mov(v19, v0);
+ __ Tbx(v19.V16B(), v19.V16B(), v19.V16B());
+
+ __ Movi(v20.V2D(), 0x5555555555555555, 0x5555555555555555);
+ __ Tbx(v20.V16B(), v1.V16B(), v2.V16B(), v3.V16B(), v4.V16B(), v0.V16B());
+ __ Mov(v21, v0);
+ __ Tbx(v21.V16B(), v1.V16B(), v2.V16B(), v3.V16B(), v4.V16B(), v21.V16B());
+ __ Mov(v22, v1);
+ __ Mov(v23, v2);
+ __ Mov(v24, v3);
+ __ Mov(v25, v4);
+ __ Tbx(v22.V16B(), v22.V16B(), v23.V16B(), v24.V16B(), v25.V16B(), v0.V16B());
+ __ Mov(v26, v0);
+ __ Mov(v27, v1);
+ __ Mov(v28, v2);
+ __ Mov(v29, v3);
+ __ Tbx(v26.V16B(), v26.V16B(), v27.V16B(), v28.V16B(), v29.V16B(),
+ v26.V16B());
END();
RUN();
- CHECK_EQUAL_FP32(2.0, s0);
- CHECK_EQUAL_FP32(2.0, dst[0]);
- CHECK_EQUAL_FP32(1.0, s1);
- CHECK_EQUAL_FP32(1.0, dst[2]);
- CHECK_EQUAL_FP32(3.0, s2);
- CHECK_EQUAL_FP32(3.0, dst[1]);
- CHECK_EQUAL_64(src_base, x17);
- CHECK_EQUAL_64(dst_base + sizeof(dst[0]), x18);
- CHECK_EQUAL_64(src_base + sizeof(src[0]), x19);
- CHECK_EQUAL_64(dst_base + 2 * sizeof(dst[0]), x20);
- CHECK_EQUAL_64(src_base + 2 * sizeof(src[0]), x21);
- CHECK_EQUAL_64(dst_base, x22);
+ CHECK_EQUAL_128(0xa055555555555555, 0x5555555555adaeaf, q16);
+ CHECK_EQUAL_128(0xa041424334353627, 0x28291a1b1cadaeaf, q17);
+ CHECK_EQUAL_128(0xa0aeadacabaaa9a8, 0xa7a6a5a4a3adaeaf, q18);
+ CHECK_EQUAL_128(0x0f41424334353627, 0x28291a1b1c424100, q19);
+
+ CHECK_EQUAL_128(0xa0555555d4d5d6c7, 0xc8c9babbbcadaeaf, q20);
+ CHECK_EQUAL_128(0xa0414243d4d5d6c7, 0xc8c9babbbcadaeaf, q21);
+ CHECK_EQUAL_128(0xa0aeadacd4d5d6c7, 0xc8c9babbbcadaeaf, q22);
+ CHECK_EQUAL_128(0x0f414243c4c5c6b7, 0xb8b9aaabac424100, q26);
TEARDOWN();
}
-
-TEST(load_store_double) {
+TEST(neon_destructive_fcvtl) {
INIT_V8();
SETUP();
- double src[3] = {1.0, 2.0, 3.0};
- double dst[3] = {0.0, 0.0, 0.0};
- uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
- uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
-
START();
- __ Mov(x17, src_base);
- __ Mov(x18, dst_base);
- __ Mov(x19, src_base);
- __ Mov(x20, dst_base);
- __ Mov(x21, src_base);
- __ Mov(x22, dst_base);
- __ Ldr(d0, MemOperand(x17, sizeof(src[0])));
- __ Str(d0, MemOperand(x18, sizeof(dst[0]), PostIndex));
- __ Ldr(d1, MemOperand(x19, sizeof(src[0]), PostIndex));
- __ Str(d1, MemOperand(x20, 2 * sizeof(dst[0]), PreIndex));
- __ Ldr(d2, MemOperand(x21, 2 * sizeof(src[0]), PreIndex));
- __ Str(d2, MemOperand(x22, sizeof(dst[0])));
+ __ Movi(v0.V2D(), 0x400000003f800000, 0xbf800000c0000000);
+ __ Fcvtl(v16.V2D(), v0.V2S());
+ __ Fcvtl2(v17.V2D(), v0.V4S());
+ __ Mov(v18, v0);
+ __ Mov(v19, v0);
+ __ Fcvtl(v18.V2D(), v18.V2S());
+ __ Fcvtl2(v19.V2D(), v19.V4S());
+
+ __ Movi(v1.V2D(), 0x40003c003c004000, 0xc000bc00bc00c000);
+ __ Fcvtl(v20.V4S(), v1.V4H());
+ __ Fcvtl2(v21.V4S(), v1.V8H());
+ __ Mov(v22, v1);
+ __ Mov(v23, v1);
+ __ Fcvtl(v22.V4S(), v22.V4H());
+ __ Fcvtl2(v23.V4S(), v23.V8H());
+
END();
RUN();
- CHECK_EQUAL_FP64(2.0, d0);
- CHECK_EQUAL_FP64(2.0, dst[0]);
- CHECK_EQUAL_FP64(1.0, d1);
- CHECK_EQUAL_FP64(1.0, dst[2]);
- CHECK_EQUAL_FP64(3.0, d2);
- CHECK_EQUAL_FP64(3.0, dst[1]);
- CHECK_EQUAL_64(src_base, x17);
- CHECK_EQUAL_64(dst_base + sizeof(dst[0]), x18);
- CHECK_EQUAL_64(src_base + sizeof(src[0]), x19);
- CHECK_EQUAL_64(dst_base + 2 * sizeof(dst[0]), x20);
- CHECK_EQUAL_64(src_base + 2 * sizeof(src[0]), x21);
- CHECK_EQUAL_64(dst_base, x22);
+ CHECK_EQUAL_128(0xbff0000000000000, 0xc000000000000000, q16);
+ CHECK_EQUAL_128(0x4000000000000000, 0x3ff0000000000000, q17);
+ CHECK_EQUAL_128(0xbff0000000000000, 0xc000000000000000, q18);
+ CHECK_EQUAL_128(0x4000000000000000, 0x3ff0000000000000, q19);
+
+ CHECK_EQUAL_128(0xc0000000bf800000, 0xbf800000c0000000, q20);
+ CHECK_EQUAL_128(0x400000003f800000, 0x3f80000040000000, q21);
+ CHECK_EQUAL_128(0xc0000000bf800000, 0xbf800000c0000000, q22);
+ CHECK_EQUAL_128(0x400000003f800000, 0x3f80000040000000, q23);
TEARDOWN();
}
@@ -2863,6 +6243,37 @@ TEST(ldp_stp_double) {
TEARDOWN();
}
+TEST(ldp_stp_quad) {
+ SETUP();
+
+ uint64_t src[4] = {0x0123456789abcdef, 0xaaaaaaaa55555555, 0xfedcba9876543210,
+ 0x55555555aaaaaaaa};
+ uint64_t dst[6] = {0, 0, 0, 0, 0, 0};
+ uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
+ uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
+
+ START();
+ __ Mov(x16, src_base);
+ __ Mov(x17, dst_base);
+ __ Ldp(q31, q0, MemOperand(x16, 4 * sizeof(src[0]), PostIndex));
+ __ Stp(q0, q31, MemOperand(x17, 2 * sizeof(dst[1]), PreIndex));
+ END();
+
+ RUN();
+
+ CHECK_EQUAL_128(0xaaaaaaaa55555555, 0x0123456789abcdef, q31);
+ CHECK_EQUAL_128(0x55555555aaaaaaaa, 0xfedcba9876543210, q0);
+ CHECK_EQUAL_64(0, dst[0]);
+ CHECK_EQUAL_64(0, dst[1]);
+ CHECK_EQUAL_64(0xfedcba9876543210, dst[2]);
+ CHECK_EQUAL_64(0x55555555aaaaaaaa, dst[3]);
+ CHECK_EQUAL_64(0x0123456789abcdef, dst[4]);
+ CHECK_EQUAL_64(0xaaaaaaaa55555555, dst[5]);
+ CHECK_EQUAL_64(src_base + 4 * sizeof(src[0]), x16);
+ CHECK_EQUAL_64(dst_base + 2 * sizeof(dst[1]), x17);
+
+ TEARDOWN();
+}
TEST(ldp_stp_offset) {
INIT_V8();
@@ -5359,19 +8770,19 @@ TEST(fmov_reg) {
__ Fmov(x1, d1);
__ Fmov(d2, x1);
__ Fmov(d4, d1);
- __ Fmov(d6, rawbits_to_double(0x0123456789abcdefL));
+ __ Fmov(d6, bit_cast<double>(0x0123456789abcdefL));
__ Fmov(s6, s6);
END();
RUN();
- CHECK_EQUAL_32(float_to_rawbits(1.0), w10);
+ CHECK_EQUAL_32(bit_cast<uint32_t>(1.0f), w10);
CHECK_EQUAL_FP32(1.0, s30);
CHECK_EQUAL_FP32(1.0, s5);
- CHECK_EQUAL_64(double_to_rawbits(-13.0), x1);
+ CHECK_EQUAL_64(bit_cast<uint64_t>(-13.0), x1);
CHECK_EQUAL_FP64(-13.0, d2);
CHECK_EQUAL_FP64(-13.0, d4);
- CHECK_EQUAL_FP32(rawbits_to_float(0x89abcdef), s6);
+ CHECK_EQUAL_FP32(bit_cast<float>(0x89abcdef), s6);
TEARDOWN();
}
@@ -5687,12 +9098,12 @@ TEST(fmadd_fmsub_float) {
TEST(fmadd_fmsub_double_nans) {
INIT_V8();
// Make sure that NaN propagation works correctly.
- double s1 = rawbits_to_double(0x7ff5555511111111);
- double s2 = rawbits_to_double(0x7ff5555522222222);
- double sa = rawbits_to_double(0x7ff55555aaaaaaaa);
- double q1 = rawbits_to_double(0x7ffaaaaa11111111);
- double q2 = rawbits_to_double(0x7ffaaaaa22222222);
- double qa = rawbits_to_double(0x7ffaaaaaaaaaaaaa);
+ double s1 = bit_cast<double>(0x7ff5555511111111);
+ double s2 = bit_cast<double>(0x7ff5555522222222);
+ double sa = bit_cast<double>(0x7ff55555aaaaaaaa);
+ double q1 = bit_cast<double>(0x7ffaaaaa11111111);
+ double q2 = bit_cast<double>(0x7ffaaaaa22222222);
+ double qa = bit_cast<double>(0x7ffaaaaaaaaaaaaa);
CHECK(IsSignallingNaN(s1));
CHECK(IsSignallingNaN(s2));
CHECK(IsSignallingNaN(sa));
@@ -5701,9 +9112,9 @@ TEST(fmadd_fmsub_double_nans) {
CHECK(IsQuietNaN(qa));
// The input NaNs after passing through ProcessNaN.
- double s1_proc = rawbits_to_double(0x7ffd555511111111);
- double s2_proc = rawbits_to_double(0x7ffd555522222222);
- double sa_proc = rawbits_to_double(0x7ffd5555aaaaaaaa);
+ double s1_proc = bit_cast<double>(0x7ffd555511111111);
+ double s2_proc = bit_cast<double>(0x7ffd555522222222);
+ double sa_proc = bit_cast<double>(0x7ffd5555aaaaaaaa);
double q1_proc = q1;
double q2_proc = q2;
double qa_proc = qa;
@@ -5715,10 +9126,10 @@ TEST(fmadd_fmsub_double_nans) {
CHECK(IsQuietNaN(qa_proc));
// Negated NaNs as it would be done on ARMv8 hardware.
- double s1_proc_neg = rawbits_to_double(0xfffd555511111111);
- double sa_proc_neg = rawbits_to_double(0xfffd5555aaaaaaaa);
- double q1_proc_neg = rawbits_to_double(0xfffaaaaa11111111);
- double qa_proc_neg = rawbits_to_double(0xfffaaaaaaaaaaaaa);
+ double s1_proc_neg = bit_cast<double>(0xfffd555511111111);
+ double sa_proc_neg = bit_cast<double>(0xfffd5555aaaaaaaa);
+ double q1_proc_neg = bit_cast<double>(0xfffaaaaa11111111);
+ double qa_proc_neg = bit_cast<double>(0xfffaaaaaaaaaaaaa);
CHECK(IsQuietNaN(s1_proc_neg));
CHECK(IsQuietNaN(sa_proc_neg));
CHECK(IsQuietNaN(q1_proc_neg));
@@ -5770,12 +9181,12 @@ TEST(fmadd_fmsub_double_nans) {
TEST(fmadd_fmsub_float_nans) {
INIT_V8();
// Make sure that NaN propagation works correctly.
- float s1 = rawbits_to_float(0x7f951111);
- float s2 = rawbits_to_float(0x7f952222);
- float sa = rawbits_to_float(0x7f95aaaa);
- float q1 = rawbits_to_float(0x7fea1111);
- float q2 = rawbits_to_float(0x7fea2222);
- float qa = rawbits_to_float(0x7feaaaaa);
+ float s1 = bit_cast<float>(0x7f951111);
+ float s2 = bit_cast<float>(0x7f952222);
+ float sa = bit_cast<float>(0x7f95aaaa);
+ float q1 = bit_cast<float>(0x7fea1111);
+ float q2 = bit_cast<float>(0x7fea2222);
+ float qa = bit_cast<float>(0x7feaaaaa);
CHECK(IsSignallingNaN(s1));
CHECK(IsSignallingNaN(s2));
CHECK(IsSignallingNaN(sa));
@@ -5784,9 +9195,9 @@ TEST(fmadd_fmsub_float_nans) {
CHECK(IsQuietNaN(qa));
// The input NaNs after passing through ProcessNaN.
- float s1_proc = rawbits_to_float(0x7fd51111);
- float s2_proc = rawbits_to_float(0x7fd52222);
- float sa_proc = rawbits_to_float(0x7fd5aaaa);
+ float s1_proc = bit_cast<float>(0x7fd51111);
+ float s2_proc = bit_cast<float>(0x7fd52222);
+ float sa_proc = bit_cast<float>(0x7fd5aaaa);
float q1_proc = q1;
float q2_proc = q2;
float qa_proc = qa;
@@ -5798,10 +9209,10 @@ TEST(fmadd_fmsub_float_nans) {
CHECK(IsQuietNaN(qa_proc));
// Negated NaNs as it would be done on ARMv8 hardware.
- float s1_proc_neg = rawbits_to_float(0xffd51111);
- float sa_proc_neg = rawbits_to_float(0xffd5aaaa);
- float q1_proc_neg = rawbits_to_float(0xffea1111);
- float qa_proc_neg = rawbits_to_float(0xffeaaaaa);
+ float s1_proc_neg = bit_cast<float>(0xffd51111);
+ float sa_proc_neg = bit_cast<float>(0xffd5aaaa);
+ float q1_proc_neg = bit_cast<float>(0xffea1111);
+ float qa_proc_neg = bit_cast<float>(0xffeaaaaa);
CHECK(IsQuietNaN(s1_proc_neg));
CHECK(IsQuietNaN(sa_proc_neg));
CHECK(IsQuietNaN(q1_proc_neg));
@@ -5912,15 +9323,15 @@ static float MinMaxHelper(float n,
float m,
bool min,
float quiet_nan_substitute = 0.0) {
- uint32_t raw_n = float_to_rawbits(n);
- uint32_t raw_m = float_to_rawbits(m);
+ uint32_t raw_n = bit_cast<uint32_t>(n);
+ uint32_t raw_m = bit_cast<uint32_t>(m);
if (std::isnan(n) && ((raw_n & kSQuietNanMask) == 0)) {
// n is signalling NaN.
- return rawbits_to_float(raw_n | kSQuietNanMask);
+ return bit_cast<float>(raw_n | static_cast<uint32_t>(kSQuietNanMask));
} else if (std::isnan(m) && ((raw_m & kSQuietNanMask) == 0)) {
// m is signalling NaN.
- return rawbits_to_float(raw_m | kSQuietNanMask);
+ return bit_cast<float>(raw_m | static_cast<uint32_t>(kSQuietNanMask));
} else if (quiet_nan_substitute == 0.0) {
if (std::isnan(n)) {
// n is quiet NaN.
@@ -5953,15 +9364,15 @@ static double MinMaxHelper(double n,
double m,
bool min,
double quiet_nan_substitute = 0.0) {
- uint64_t raw_n = double_to_rawbits(n);
- uint64_t raw_m = double_to_rawbits(m);
+ uint64_t raw_n = bit_cast<uint64_t>(n);
+ uint64_t raw_m = bit_cast<uint64_t>(m);
if (std::isnan(n) && ((raw_n & kDQuietNanMask) == 0)) {
// n is signalling NaN.
- return rawbits_to_double(raw_n | kDQuietNanMask);
+ return bit_cast<double>(raw_n | kDQuietNanMask);
} else if (std::isnan(m) && ((raw_m & kDQuietNanMask) == 0)) {
// m is signalling NaN.
- return rawbits_to_double(raw_m | kDQuietNanMask);
+ return bit_cast<double>(raw_m | kDQuietNanMask);
} else if (quiet_nan_substitute == 0.0) {
if (std::isnan(n)) {
// n is quiet NaN.
@@ -6017,10 +9428,10 @@ static void FminFmaxDoubleHelper(double n, double m, double min, double max,
TEST(fmax_fmin_d) {
INIT_V8();
// Use non-standard NaNs to check that the payload bits are preserved.
- double snan = rawbits_to_double(0x7ff5555512345678);
- double qnan = rawbits_to_double(0x7ffaaaaa87654321);
+ double snan = bit_cast<double>(0x7ff5555512345678);
+ double qnan = bit_cast<double>(0x7ffaaaaa87654321);
- double snan_processed = rawbits_to_double(0x7ffd555512345678);
+ double snan_processed = bit_cast<double>(0x7ffd555512345678);
double qnan_processed = qnan;
CHECK(IsSignallingNaN(snan));
@@ -6102,10 +9513,10 @@ static void FminFmaxFloatHelper(float n, float m, float min, float max,
TEST(fmax_fmin_s) {
INIT_V8();
// Use non-standard NaNs to check that the payload bits are preserved.
- float snan = rawbits_to_float(0x7f951234);
- float qnan = rawbits_to_float(0x7fea8765);
+ float snan = bit_cast<float>(0x7f951234);
+ float qnan = bit_cast<float>(0x7fea8765);
- float snan_processed = rawbits_to_float(0x7fd51234);
+ float snan_processed = bit_cast<float>(0x7fd51234);
float qnan_processed = qnan;
CHECK(IsSignallingNaN(snan));
@@ -6940,8 +10351,8 @@ TEST(fcvt_ds) {
__ Fmov(s26, -0.0);
__ Fmov(s27, FLT_MAX);
__ Fmov(s28, FLT_MIN);
- __ Fmov(s29, rawbits_to_float(0x7fc12345)); // Quiet NaN.
- __ Fmov(s30, rawbits_to_float(0x7f812345)); // Signalling NaN.
+ __ Fmov(s29, bit_cast<float>(0x7fc12345)); // Quiet NaN.
+ __ Fmov(s30, bit_cast<float>(0x7f812345)); // Signalling NaN.
__ Fcvt(d0, s16);
__ Fcvt(d1, s17);
@@ -6982,8 +10393,8 @@ TEST(fcvt_ds) {
// - The top bit of the mantissa is forced to 1 (making it a quiet NaN).
// - The remaining mantissa bits are copied until they run out.
// - The low-order bits that haven't already been assigned are set to 0.
- CHECK_EQUAL_FP64(rawbits_to_double(0x7ff82468a0000000), d13);
- CHECK_EQUAL_FP64(rawbits_to_double(0x7ff82468a0000000), d14);
+ CHECK_EQUAL_FP64(bit_cast<double>(0x7ff82468a0000000), d13);
+ CHECK_EQUAL_FP64(bit_cast<double>(0x7ff82468a0000000), d14);
TEARDOWN();
}
@@ -6998,83 +10409,86 @@ TEST(fcvt_sd) {
//
// Note that this test only checks ties-to-even rounding, because that is all
// that the simulator supports.
- struct {double in; float expected;} test[] = {
- // Check some simple conversions.
- {0.0, 0.0f},
- {1.0, 1.0f},
- {1.5, 1.5f},
- {2.0, 2.0f},
- {FLT_MAX, FLT_MAX},
- // - The smallest normalized float.
- {pow(2.0, -126), powf(2, -126)},
- // - Normal floats that need (ties-to-even) rounding.
- // For normalized numbers:
- // bit 29 (0x0000000020000000) is the lowest-order bit which will
- // fit in the float's mantissa.
- {rawbits_to_double(0x3ff0000000000000), rawbits_to_float(0x3f800000)},
- {rawbits_to_double(0x3ff0000000000001), rawbits_to_float(0x3f800000)},
- {rawbits_to_double(0x3ff0000010000000), rawbits_to_float(0x3f800000)},
- {rawbits_to_double(0x3ff0000010000001), rawbits_to_float(0x3f800001)},
- {rawbits_to_double(0x3ff0000020000000), rawbits_to_float(0x3f800001)},
- {rawbits_to_double(0x3ff0000020000001), rawbits_to_float(0x3f800001)},
- {rawbits_to_double(0x3ff0000030000000), rawbits_to_float(0x3f800002)},
- {rawbits_to_double(0x3ff0000030000001), rawbits_to_float(0x3f800002)},
- {rawbits_to_double(0x3ff0000040000000), rawbits_to_float(0x3f800002)},
- {rawbits_to_double(0x3ff0000040000001), rawbits_to_float(0x3f800002)},
- {rawbits_to_double(0x3ff0000050000000), rawbits_to_float(0x3f800002)},
- {rawbits_to_double(0x3ff0000050000001), rawbits_to_float(0x3f800003)},
- {rawbits_to_double(0x3ff0000060000000), rawbits_to_float(0x3f800003)},
- // - A mantissa that overflows into the exponent during rounding.
- {rawbits_to_double(0x3feffffff0000000), rawbits_to_float(0x3f800000)},
- // - The largest double that rounds to a normal float.
- {rawbits_to_double(0x47efffffefffffff), rawbits_to_float(0x7f7fffff)},
-
- // Doubles that are too big for a float.
- {kFP64PositiveInfinity, kFP32PositiveInfinity},
- {DBL_MAX, kFP32PositiveInfinity},
- // - The smallest exponent that's too big for a float.
- {pow(2.0, 128), kFP32PositiveInfinity},
- // - This exponent is in range, but the value rounds to infinity.
- {rawbits_to_double(0x47effffff0000000), kFP32PositiveInfinity},
-
- // Doubles that are too small for a float.
- // - The smallest (subnormal) double.
- {DBL_MIN, 0.0},
- // - The largest double which is too small for a subnormal float.
- {rawbits_to_double(0x3690000000000000), rawbits_to_float(0x00000000)},
-
- // Normal doubles that become subnormal floats.
- // - The largest subnormal float.
- {rawbits_to_double(0x380fffffc0000000), rawbits_to_float(0x007fffff)},
- // - The smallest subnormal float.
- {rawbits_to_double(0x36a0000000000000), rawbits_to_float(0x00000001)},
- // - Subnormal floats that need (ties-to-even) rounding.
- // For these subnormals:
- // bit 34 (0x0000000400000000) is the lowest-order bit which will
- // fit in the float's mantissa.
- {rawbits_to_double(0x37c159e000000000), rawbits_to_float(0x00045678)},
- {rawbits_to_double(0x37c159e000000001), rawbits_to_float(0x00045678)},
- {rawbits_to_double(0x37c159e200000000), rawbits_to_float(0x00045678)},
- {rawbits_to_double(0x37c159e200000001), rawbits_to_float(0x00045679)},
- {rawbits_to_double(0x37c159e400000000), rawbits_to_float(0x00045679)},
- {rawbits_to_double(0x37c159e400000001), rawbits_to_float(0x00045679)},
- {rawbits_to_double(0x37c159e600000000), rawbits_to_float(0x0004567a)},
- {rawbits_to_double(0x37c159e600000001), rawbits_to_float(0x0004567a)},
- {rawbits_to_double(0x37c159e800000000), rawbits_to_float(0x0004567a)},
- {rawbits_to_double(0x37c159e800000001), rawbits_to_float(0x0004567a)},
- {rawbits_to_double(0x37c159ea00000000), rawbits_to_float(0x0004567a)},
- {rawbits_to_double(0x37c159ea00000001), rawbits_to_float(0x0004567b)},
- {rawbits_to_double(0x37c159ec00000000), rawbits_to_float(0x0004567b)},
- // - The smallest double which rounds up to become a subnormal float.
- {rawbits_to_double(0x3690000000000001), rawbits_to_float(0x00000001)},
-
- // Check NaN payload preservation.
- {rawbits_to_double(0x7ff82468a0000000), rawbits_to_float(0x7fc12345)},
- {rawbits_to_double(0x7ff82468bfffffff), rawbits_to_float(0x7fc12345)},
- // - Signalling NaNs become quiet NaNs.
- {rawbits_to_double(0x7ff02468a0000000), rawbits_to_float(0x7fc12345)},
- {rawbits_to_double(0x7ff02468bfffffff), rawbits_to_float(0x7fc12345)},
- {rawbits_to_double(0x7ff000001fffffff), rawbits_to_float(0x7fc00000)},
+ struct {
+ double in;
+ float expected;
+ } test[] = {
+ // Check some simple conversions.
+ {0.0, 0.0f},
+ {1.0, 1.0f},
+ {1.5, 1.5f},
+ {2.0, 2.0f},
+ {FLT_MAX, FLT_MAX},
+ // - The smallest normalized float.
+ {pow(2.0, -126), powf(2, -126)},
+ // - Normal floats that need (ties-to-even) rounding.
+ // For normalized numbers:
+ // bit 29 (0x0000000020000000) is the lowest-order bit which will
+ // fit in the float's mantissa.
+ {bit_cast<double>(0x3ff0000000000000), bit_cast<float>(0x3f800000)},
+ {bit_cast<double>(0x3ff0000000000001), bit_cast<float>(0x3f800000)},
+ {bit_cast<double>(0x3ff0000010000000), bit_cast<float>(0x3f800000)},
+ {bit_cast<double>(0x3ff0000010000001), bit_cast<float>(0x3f800001)},
+ {bit_cast<double>(0x3ff0000020000000), bit_cast<float>(0x3f800001)},
+ {bit_cast<double>(0x3ff0000020000001), bit_cast<float>(0x3f800001)},
+ {bit_cast<double>(0x3ff0000030000000), bit_cast<float>(0x3f800002)},
+ {bit_cast<double>(0x3ff0000030000001), bit_cast<float>(0x3f800002)},
+ {bit_cast<double>(0x3ff0000040000000), bit_cast<float>(0x3f800002)},
+ {bit_cast<double>(0x3ff0000040000001), bit_cast<float>(0x3f800002)},
+ {bit_cast<double>(0x3ff0000050000000), bit_cast<float>(0x3f800002)},
+ {bit_cast<double>(0x3ff0000050000001), bit_cast<float>(0x3f800003)},
+ {bit_cast<double>(0x3ff0000060000000), bit_cast<float>(0x3f800003)},
+ // - A mantissa that overflows into the exponent during rounding.
+ {bit_cast<double>(0x3feffffff0000000), bit_cast<float>(0x3f800000)},
+ // - The largest double that rounds to a normal float.
+ {bit_cast<double>(0x47efffffefffffff), bit_cast<float>(0x7f7fffff)},
+
+ // Doubles that are too big for a float.
+ {kFP64PositiveInfinity, kFP32PositiveInfinity},
+ {DBL_MAX, kFP32PositiveInfinity},
+ // - The smallest exponent that's too big for a float.
+ {pow(2.0, 128), kFP32PositiveInfinity},
+ // - This exponent is in range, but the value rounds to infinity.
+ {bit_cast<double>(0x47effffff0000000), kFP32PositiveInfinity},
+
+ // Doubles that are too small for a float.
+ // - The smallest (subnormal) double.
+ {DBL_MIN, 0.0},
+ // - The largest double which is too small for a subnormal float.
+ {bit_cast<double>(0x3690000000000000), bit_cast<float>(0x00000000)},
+
+ // Normal doubles that become subnormal floats.
+ // - The largest subnormal float.
+ {bit_cast<double>(0x380fffffc0000000), bit_cast<float>(0x007fffff)},
+ // - The smallest subnormal float.
+ {bit_cast<double>(0x36a0000000000000), bit_cast<float>(0x00000001)},
+ // - Subnormal floats that need (ties-to-even) rounding.
+ // For these subnormals:
+ // bit 34 (0x0000000400000000) is the lowest-order bit which will
+ // fit in the float's mantissa.
+ {bit_cast<double>(0x37c159e000000000), bit_cast<float>(0x00045678)},
+ {bit_cast<double>(0x37c159e000000001), bit_cast<float>(0x00045678)},
+ {bit_cast<double>(0x37c159e200000000), bit_cast<float>(0x00045678)},
+ {bit_cast<double>(0x37c159e200000001), bit_cast<float>(0x00045679)},
+ {bit_cast<double>(0x37c159e400000000), bit_cast<float>(0x00045679)},
+ {bit_cast<double>(0x37c159e400000001), bit_cast<float>(0x00045679)},
+ {bit_cast<double>(0x37c159e600000000), bit_cast<float>(0x0004567a)},
+ {bit_cast<double>(0x37c159e600000001), bit_cast<float>(0x0004567a)},
+ {bit_cast<double>(0x37c159e800000000), bit_cast<float>(0x0004567a)},
+ {bit_cast<double>(0x37c159e800000001), bit_cast<float>(0x0004567a)},
+ {bit_cast<double>(0x37c159ea00000000), bit_cast<float>(0x0004567a)},
+ {bit_cast<double>(0x37c159ea00000001), bit_cast<float>(0x0004567b)},
+ {bit_cast<double>(0x37c159ec00000000), bit_cast<float>(0x0004567b)},
+ // - The smallest double which rounds up to become a subnormal float.
+ {bit_cast<double>(0x3690000000000001), bit_cast<float>(0x00000001)},
+
+ // Check NaN payload preservation.
+ {bit_cast<double>(0x7ff82468a0000000), bit_cast<float>(0x7fc12345)},
+ {bit_cast<double>(0x7ff82468bfffffff), bit_cast<float>(0x7fc12345)},
+ // - Signalling NaNs become quiet NaNs.
+ {bit_cast<double>(0x7ff02468a0000000), bit_cast<float>(0x7fc12345)},
+ {bit_cast<double>(0x7ff02468bfffffff), bit_cast<float>(0x7fc12345)},
+ {bit_cast<double>(0x7ff000001fffffff), bit_cast<float>(0x7fc00000)},
};
int count = sizeof(test) / sizeof(test[0]);
@@ -8006,8 +11420,8 @@ static void TestUScvtfHelper(uint64_t in,
RUN();
// Check the results.
- double expected_scvtf_base = rawbits_to_double(expected_scvtf_bits);
- double expected_ucvtf_base = rawbits_to_double(expected_ucvtf_bits);
+ double expected_scvtf_base = bit_cast<double>(expected_scvtf_bits);
+ double expected_ucvtf_base = bit_cast<double>(expected_ucvtf_bits);
for (int fbits = 0; fbits <= 32; fbits++) {
double expected_scvtf = expected_scvtf_base / pow(2.0, fbits);
@@ -8161,8 +11575,8 @@ static void TestUScvtf32Helper(uint64_t in,
RUN();
// Check the results.
- float expected_scvtf_base = rawbits_to_float(expected_scvtf_bits);
- float expected_ucvtf_base = rawbits_to_float(expected_ucvtf_bits);
+ float expected_scvtf_base = bit_cast<float>(expected_scvtf_bits);
+ float expected_ucvtf_base = bit_cast<float>(expected_ucvtf_bits);
for (int fbits = 0; fbits <= 32; fbits++) {
float expected_scvtf = expected_scvtf_base / powf(2, fbits);
@@ -9060,13 +12474,13 @@ static void PushPopFPJsspSimpleHelper(int reg_count,
// debug code, for example.
static RegList const allowed = ~0;
if (reg_count == kPushPopFPJsspMaxRegCount) {
- reg_count = CountSetBits(allowed, kNumberOfFPRegisters);
+ reg_count = CountSetBits(allowed, kNumberOfVRegisters);
}
// Work out which registers to use, based on reg_size.
- FPRegister v[kNumberOfRegisters];
- FPRegister d[kNumberOfRegisters];
- RegList list = PopulateFPRegisterArray(NULL, d, v, reg_size, reg_count,
- allowed);
+ VRegister v[kNumberOfRegisters];
+ VRegister d[kNumberOfRegisters];
+ RegList list =
+ PopulateVRegisterArray(NULL, d, v, reg_size, reg_count, allowed);
// The literal base is chosen to have two useful properties:
// * When multiplied (using an integer) by small values (such as a register
@@ -9115,7 +12529,7 @@ static void PushPopFPJsspSimpleHelper(int reg_count,
}
break;
case PushPopRegList:
- __ PushSizeRegList(list, reg_size, CPURegister::kFPRegister);
+ __ PushSizeRegList(list, reg_size, CPURegister::kVRegister);
break;
}
@@ -9139,7 +12553,7 @@ static void PushPopFPJsspSimpleHelper(int reg_count,
}
break;
case PushPopRegList:
- __ PopSizeRegList(list, reg_size, CPURegister::kFPRegister);
+ __ PopSizeRegList(list, reg_size, CPURegister::kVRegister);
break;
}
@@ -9676,7 +13090,7 @@ TEST(push_queued) {
queue.PushQueued();
Clobber(&masm, CPURegList(CPURegister::kRegister, kXRegSizeInBits, 0, 6));
- Clobber(&masm, CPURegList(CPURegister::kFPRegister, kDRegSizeInBits, 0, 2));
+ Clobber(&masm, CPURegList(CPURegister::kVRegister, kDRegSizeInBits, 0, 2));
// Pop them conventionally.
__ Pop(s2);
@@ -9754,7 +13168,7 @@ TEST(pop_queued) {
queue.Queue(x0);
Clobber(&masm, CPURegList(CPURegister::kRegister, kXRegSizeInBits, 0, 6));
- Clobber(&masm, CPURegList(CPURegister::kFPRegister, kDRegSizeInBits, 0, 2));
+ Clobber(&masm, CPURegList(CPURegister::kVRegister, kDRegSizeInBits, 0, 2));
// Actually pop them.
queue.PopQueued();
@@ -9933,24 +13347,473 @@ TEST(jump_either_smi) {
TEST(noreg) {
// This test doesn't generate any code, but it verifies some invariants
// related to NoReg.
- CHECK(NoReg.Is(NoFPReg));
- CHECK(NoFPReg.Is(NoReg));
+ CHECK(NoReg.Is(NoVReg));
+ CHECK(NoVReg.Is(NoReg));
CHECK(NoReg.Is(NoCPUReg));
CHECK(NoCPUReg.Is(NoReg));
- CHECK(NoFPReg.Is(NoCPUReg));
- CHECK(NoCPUReg.Is(NoFPReg));
+ CHECK(NoVReg.Is(NoCPUReg));
+ CHECK(NoCPUReg.Is(NoVReg));
CHECK(NoReg.IsNone());
- CHECK(NoFPReg.IsNone());
+ CHECK(NoVReg.IsNone());
CHECK(NoCPUReg.IsNone());
}
+TEST(vreg) {
+ // This test doesn't generate any code, but it verifies
+ // Helper functions and methods pertaining to VRegister logic.
+
+ CHECK_EQ(8U, RegisterSizeInBitsFromFormat(kFormatB));
+ CHECK_EQ(16U, RegisterSizeInBitsFromFormat(kFormatH));
+ CHECK_EQ(32U, RegisterSizeInBitsFromFormat(kFormatS));
+ CHECK_EQ(64U, RegisterSizeInBitsFromFormat(kFormatD));
+ CHECK_EQ(64U, RegisterSizeInBitsFromFormat(kFormat8B));
+ CHECK_EQ(64U, RegisterSizeInBitsFromFormat(kFormat4H));
+ CHECK_EQ(64U, RegisterSizeInBitsFromFormat(kFormat2S));
+ CHECK_EQ(64U, RegisterSizeInBitsFromFormat(kFormat1D));
+ CHECK_EQ(128U, RegisterSizeInBitsFromFormat(kFormat16B));
+ CHECK_EQ(128U, RegisterSizeInBitsFromFormat(kFormat8H));
+ CHECK_EQ(128U, RegisterSizeInBitsFromFormat(kFormat4S));
+ CHECK_EQ(128U, RegisterSizeInBitsFromFormat(kFormat2D));
+
+ CHECK_EQ(16, LaneCountFromFormat(kFormat16B));
+ CHECK_EQ(8, LaneCountFromFormat(kFormat8B));
+ CHECK_EQ(8, LaneCountFromFormat(kFormat8H));
+ CHECK_EQ(4, LaneCountFromFormat(kFormat4H));
+ CHECK_EQ(4, LaneCountFromFormat(kFormat4S));
+ CHECK_EQ(2, LaneCountFromFormat(kFormat2S));
+ CHECK_EQ(2, LaneCountFromFormat(kFormat2D));
+ CHECK_EQ(1, LaneCountFromFormat(kFormat1D));
+ CHECK_EQ(1, LaneCountFromFormat(kFormatB));
+ CHECK_EQ(1, LaneCountFromFormat(kFormatH));
+ CHECK_EQ(1, LaneCountFromFormat(kFormatS));
+ CHECK_EQ(1, LaneCountFromFormat(kFormatD));
+
+ CHECK(!IsVectorFormat(kFormatB));
+ CHECK(!IsVectorFormat(kFormatH));
+ CHECK(!IsVectorFormat(kFormatS));
+ CHECK(!IsVectorFormat(kFormatD));
+ CHECK(IsVectorFormat(kFormat16B));
+ CHECK(IsVectorFormat(kFormat8B));
+ CHECK(IsVectorFormat(kFormat8H));
+ CHECK(IsVectorFormat(kFormat4H));
+ CHECK(IsVectorFormat(kFormat4S));
+ CHECK(IsVectorFormat(kFormat2S));
+ CHECK(IsVectorFormat(kFormat2D));
+ CHECK(IsVectorFormat(kFormat1D));
+
+ CHECK(!d0.Is8B());
+ CHECK(!d0.Is16B());
+ CHECK(!d0.Is4H());
+ CHECK(!d0.Is8H());
+ CHECK(!d0.Is2S());
+ CHECK(!d0.Is4S());
+ CHECK(d0.Is1D());
+ CHECK(!d0.Is1S());
+ CHECK(!d0.Is1H());
+ CHECK(!d0.Is1B());
+ CHECK(!d0.IsVector());
+ CHECK(d0.IsScalar());
+ CHECK(d0.IsFPRegister());
+
+ CHECK(!d0.IsW());
+ CHECK(!d0.IsX());
+ CHECK(d0.IsV());
+ CHECK(!d0.IsB());
+ CHECK(!d0.IsH());
+ CHECK(!d0.IsS());
+ CHECK(d0.IsD());
+ CHECK(!d0.IsQ());
+
+ CHECK(!s0.Is8B());
+ CHECK(!s0.Is16B());
+ CHECK(!s0.Is4H());
+ CHECK(!s0.Is8H());
+ CHECK(!s0.Is2S());
+ CHECK(!s0.Is4S());
+ CHECK(!s0.Is1D());
+ CHECK(s0.Is1S());
+ CHECK(!s0.Is1H());
+ CHECK(!s0.Is1B());
+ CHECK(!s0.IsVector());
+ CHECK(s0.IsScalar());
+ CHECK(s0.IsFPRegister());
+
+ CHECK(!s0.IsW());
+ CHECK(!s0.IsX());
+ CHECK(s0.IsV());
+ CHECK(!s0.IsB());
+ CHECK(!s0.IsH());
+ CHECK(s0.IsS());
+ CHECK(!s0.IsD());
+ CHECK(!s0.IsQ());
+
+ CHECK(!h0.Is8B());
+ CHECK(!h0.Is16B());
+ CHECK(!h0.Is4H());
+ CHECK(!h0.Is8H());
+ CHECK(!h0.Is2S());
+ CHECK(!h0.Is4S());
+ CHECK(!h0.Is1D());
+ CHECK(!h0.Is1S());
+ CHECK(h0.Is1H());
+ CHECK(!h0.Is1B());
+ CHECK(!h0.IsVector());
+ CHECK(h0.IsScalar());
+ CHECK(!h0.IsFPRegister());
+
+ CHECK(!h0.IsW());
+ CHECK(!h0.IsX());
+ CHECK(h0.IsV());
+ CHECK(!h0.IsB());
+ CHECK(h0.IsH());
+ CHECK(!h0.IsS());
+ CHECK(!h0.IsD());
+ CHECK(!h0.IsQ());
+
+ CHECK(!b0.Is8B());
+ CHECK(!b0.Is16B());
+ CHECK(!b0.Is4H());
+ CHECK(!b0.Is8H());
+ CHECK(!b0.Is2S());
+ CHECK(!b0.Is4S());
+ CHECK(!b0.Is1D());
+ CHECK(!b0.Is1S());
+ CHECK(!b0.Is1H());
+ CHECK(b0.Is1B());
+ CHECK(!b0.IsVector());
+ CHECK(b0.IsScalar());
+ CHECK(!b0.IsFPRegister());
+
+ CHECK(!b0.IsW());
+ CHECK(!b0.IsX());
+ CHECK(b0.IsV());
+ CHECK(b0.IsB());
+ CHECK(!b0.IsH());
+ CHECK(!b0.IsS());
+ CHECK(!b0.IsD());
+ CHECK(!b0.IsQ());
+
+ CHECK(!q0.Is8B());
+ CHECK(!q0.Is16B());
+ CHECK(!q0.Is4H());
+ CHECK(!q0.Is8H());
+ CHECK(!q0.Is2S());
+ CHECK(!q0.Is4S());
+ CHECK(!q0.Is1D());
+ CHECK(!q0.Is2D());
+ CHECK(!q0.Is1S());
+ CHECK(!q0.Is1H());
+ CHECK(!q0.Is1B());
+ CHECK(!q0.IsVector());
+ CHECK(q0.IsScalar());
+ CHECK(!q0.IsFPRegister());
+
+ CHECK(!q0.IsW());
+ CHECK(!q0.IsX());
+ CHECK(q0.IsV());
+ CHECK(!q0.IsB());
+ CHECK(!q0.IsH());
+ CHECK(!q0.IsS());
+ CHECK(!q0.IsD());
+ CHECK(q0.IsQ());
+
+ CHECK(w0.IsW());
+ CHECK(!w0.IsX());
+ CHECK(!w0.IsV());
+ CHECK(!w0.IsB());
+ CHECK(!w0.IsH());
+ CHECK(!w0.IsS());
+ CHECK(!w0.IsD());
+ CHECK(!w0.IsQ());
+
+ CHECK(!x0.IsW());
+ CHECK(x0.IsX());
+ CHECK(!x0.IsV());
+ CHECK(!x0.IsB());
+ CHECK(!x0.IsH());
+ CHECK(!x0.IsS());
+ CHECK(!x0.IsD());
+ CHECK(!x0.IsQ());
+
+ CHECK(v0.V().IsV());
+ CHECK(v0.B().IsB());
+ CHECK(v0.H().IsH());
+ CHECK(v0.D().IsD());
+ CHECK(v0.S().IsS());
+ CHECK(v0.Q().IsQ());
+
+ VRegister test_8b(VRegister::Create(0, 64, 8));
+ CHECK(test_8b.Is8B());
+ CHECK(!test_8b.Is16B());
+ CHECK(!test_8b.Is4H());
+ CHECK(!test_8b.Is8H());
+ CHECK(!test_8b.Is2S());
+ CHECK(!test_8b.Is4S());
+ CHECK(!test_8b.Is1D());
+ CHECK(!test_8b.Is2D());
+ CHECK(!test_8b.Is1H());
+ CHECK(!test_8b.Is1B());
+ CHECK(test_8b.IsVector());
+ CHECK(!test_8b.IsScalar());
+ CHECK(test_8b.IsFPRegister());
+
+ VRegister test_16b(VRegister::Create(0, 128, 16));
+ CHECK(!test_16b.Is8B());
+ CHECK(test_16b.Is16B());
+ CHECK(!test_16b.Is4H());
+ CHECK(!test_16b.Is8H());
+ CHECK(!test_16b.Is2S());
+ CHECK(!test_16b.Is4S());
+ CHECK(!test_16b.Is1D());
+ CHECK(!test_16b.Is2D());
+ CHECK(!test_16b.Is1H());
+ CHECK(!test_16b.Is1B());
+ CHECK(test_16b.IsVector());
+ CHECK(!test_16b.IsScalar());
+ CHECK(!test_16b.IsFPRegister());
+
+ VRegister test_4h(VRegister::Create(0, 64, 4));
+ CHECK(!test_4h.Is8B());
+ CHECK(!test_4h.Is16B());
+ CHECK(test_4h.Is4H());
+ CHECK(!test_4h.Is8H());
+ CHECK(!test_4h.Is2S());
+ CHECK(!test_4h.Is4S());
+ CHECK(!test_4h.Is1D());
+ CHECK(!test_4h.Is2D());
+ CHECK(!test_4h.Is1H());
+ CHECK(!test_4h.Is1B());
+ CHECK(test_4h.IsVector());
+ CHECK(!test_4h.IsScalar());
+ CHECK(test_4h.IsFPRegister());
+
+ VRegister test_8h(VRegister::Create(0, 128, 8));
+ CHECK(!test_8h.Is8B());
+ CHECK(!test_8h.Is16B());
+ CHECK(!test_8h.Is4H());
+ CHECK(test_8h.Is8H());
+ CHECK(!test_8h.Is2S());
+ CHECK(!test_8h.Is4S());
+ CHECK(!test_8h.Is1D());
+ CHECK(!test_8h.Is2D());
+ CHECK(!test_8h.Is1H());
+ CHECK(!test_8h.Is1B());
+ CHECK(test_8h.IsVector());
+ CHECK(!test_8h.IsScalar());
+ CHECK(!test_8h.IsFPRegister());
+
+ VRegister test_2s(VRegister::Create(0, 64, 2));
+ CHECK(!test_2s.Is8B());
+ CHECK(!test_2s.Is16B());
+ CHECK(!test_2s.Is4H());
+ CHECK(!test_2s.Is8H());
+ CHECK(test_2s.Is2S());
+ CHECK(!test_2s.Is4S());
+ CHECK(!test_2s.Is1D());
+ CHECK(!test_2s.Is2D());
+ CHECK(!test_2s.Is1H());
+ CHECK(!test_2s.Is1B());
+ CHECK(test_2s.IsVector());
+ CHECK(!test_2s.IsScalar());
+ CHECK(test_2s.IsFPRegister());
+
+ VRegister test_4s(VRegister::Create(0, 128, 4));
+ CHECK(!test_4s.Is8B());
+ CHECK(!test_4s.Is16B());
+ CHECK(!test_4s.Is4H());
+ CHECK(!test_4s.Is8H());
+ CHECK(!test_4s.Is2S());
+ CHECK(test_4s.Is4S());
+ CHECK(!test_4s.Is1D());
+ CHECK(!test_4s.Is2D());
+ CHECK(!test_4s.Is1S());
+ CHECK(!test_4s.Is1H());
+ CHECK(!test_4s.Is1B());
+ CHECK(test_4s.IsVector());
+ CHECK(!test_4s.IsScalar());
+ CHECK(!test_4s.IsFPRegister());
+
+ VRegister test_1d(VRegister::Create(0, 64, 1));
+ CHECK(!test_1d.Is8B());
+ CHECK(!test_1d.Is16B());
+ CHECK(!test_1d.Is4H());
+ CHECK(!test_1d.Is8H());
+ CHECK(!test_1d.Is2S());
+ CHECK(!test_1d.Is4S());
+ CHECK(test_1d.Is1D());
+ CHECK(!test_1d.Is2D());
+ CHECK(!test_1d.Is1S());
+ CHECK(!test_1d.Is1H());
+ CHECK(!test_1d.Is1B());
+ CHECK(!test_1d.IsVector());
+ CHECK(test_1d.IsScalar());
+ CHECK(test_1d.IsFPRegister());
+
+ VRegister test_2d(VRegister::Create(0, 128, 2));
+ CHECK(!test_2d.Is8B());
+ CHECK(!test_2d.Is16B());
+ CHECK(!test_2d.Is4H());
+ CHECK(!test_2d.Is8H());
+ CHECK(!test_2d.Is2S());
+ CHECK(!test_2d.Is4S());
+ CHECK(!test_2d.Is1D());
+ CHECK(test_2d.Is2D());
+ CHECK(!test_2d.Is1H());
+ CHECK(!test_2d.Is1B());
+ CHECK(test_2d.IsVector());
+ CHECK(!test_2d.IsScalar());
+ CHECK(!test_2d.IsFPRegister());
+
+ VRegister test_1s(VRegister::Create(0, 32, 1));
+ CHECK(!test_1s.Is8B());
+ CHECK(!test_1s.Is16B());
+ CHECK(!test_1s.Is4H());
+ CHECK(!test_1s.Is8H());
+ CHECK(!test_1s.Is2S());
+ CHECK(!test_1s.Is4S());
+ CHECK(!test_1s.Is1D());
+ CHECK(!test_1s.Is2D());
+ CHECK(test_1s.Is1S());
+ CHECK(!test_1s.Is1H());
+ CHECK(!test_1s.Is1B());
+ CHECK(!test_1s.IsVector());
+ CHECK(test_1s.IsScalar());
+ CHECK(test_1s.IsFPRegister());
+
+ VRegister test_1h(VRegister::Create(0, 16, 1));
+ CHECK(!test_1h.Is8B());
+ CHECK(!test_1h.Is16B());
+ CHECK(!test_1h.Is4H());
+ CHECK(!test_1h.Is8H());
+ CHECK(!test_1h.Is2S());
+ CHECK(!test_1h.Is4S());
+ CHECK(!test_1h.Is1D());
+ CHECK(!test_1h.Is2D());
+ CHECK(!test_1h.Is1S());
+ CHECK(test_1h.Is1H());
+ CHECK(!test_1h.Is1B());
+ CHECK(!test_1h.IsVector());
+ CHECK(test_1h.IsScalar());
+ CHECK(!test_1h.IsFPRegister());
+
+ VRegister test_1b(VRegister::Create(0, 8, 1));
+ CHECK(!test_1b.Is8B());
+ CHECK(!test_1b.Is16B());
+ CHECK(!test_1b.Is4H());
+ CHECK(!test_1b.Is8H());
+ CHECK(!test_1b.Is2S());
+ CHECK(!test_1b.Is4S());
+ CHECK(!test_1b.Is1D());
+ CHECK(!test_1b.Is2D());
+ CHECK(!test_1b.Is1S());
+ CHECK(!test_1b.Is1H());
+ CHECK(test_1b.Is1B());
+ CHECK(!test_1b.IsVector());
+ CHECK(test_1b.IsScalar());
+ CHECK(!test_1b.IsFPRegister());
+
+ VRegister test_breg_from_code(VRegister::BRegFromCode(0));
+ CHECK_EQ(test_breg_from_code.SizeInBits(), kBRegSizeInBits);
+
+ VRegister test_hreg_from_code(VRegister::HRegFromCode(0));
+ CHECK_EQ(test_hreg_from_code.SizeInBits(), kHRegSizeInBits);
+
+ VRegister test_sreg_from_code(VRegister::SRegFromCode(0));
+ CHECK_EQ(test_sreg_from_code.SizeInBits(), kSRegSizeInBits);
+
+ VRegister test_dreg_from_code(VRegister::DRegFromCode(0));
+ CHECK_EQ(test_dreg_from_code.SizeInBits(), kDRegSizeInBits);
+
+ VRegister test_qreg_from_code(VRegister::QRegFromCode(0));
+ CHECK_EQ(test_qreg_from_code.SizeInBits(), kQRegSizeInBits);
+
+ VRegister test_vreg_from_code(VRegister::VRegFromCode(0));
+ CHECK_EQ(test_vreg_from_code.SizeInBits(), kVRegSizeInBits);
+
+ VRegister test_v8b(VRegister::VRegFromCode(31).V8B());
+ CHECK_EQ(test_v8b.code(), 31);
+ CHECK_EQ(test_v8b.SizeInBits(), kDRegSizeInBits);
+ CHECK(test_v8b.IsLaneSizeB());
+ CHECK(!test_v8b.IsLaneSizeH());
+ CHECK(!test_v8b.IsLaneSizeS());
+ CHECK(!test_v8b.IsLaneSizeD());
+ CHECK_EQ(test_v8b.LaneSizeInBits(), 8U);
+
+ VRegister test_v16b(VRegister::VRegFromCode(31).V16B());
+ CHECK_EQ(test_v16b.code(), 31);
+ CHECK_EQ(test_v16b.SizeInBits(), kQRegSizeInBits);
+ CHECK(test_v16b.IsLaneSizeB());
+ CHECK(!test_v16b.IsLaneSizeH());
+ CHECK(!test_v16b.IsLaneSizeS());
+ CHECK(!test_v16b.IsLaneSizeD());
+ CHECK_EQ(test_v16b.LaneSizeInBits(), 8U);
+
+ VRegister test_v4h(VRegister::VRegFromCode(31).V4H());
+ CHECK_EQ(test_v4h.code(), 31);
+ CHECK_EQ(test_v4h.SizeInBits(), kDRegSizeInBits);
+ CHECK(!test_v4h.IsLaneSizeB());
+ CHECK(test_v4h.IsLaneSizeH());
+ CHECK(!test_v4h.IsLaneSizeS());
+ CHECK(!test_v4h.IsLaneSizeD());
+ CHECK_EQ(test_v4h.LaneSizeInBits(), 16U);
+
+ VRegister test_v8h(VRegister::VRegFromCode(31).V8H());
+ CHECK_EQ(test_v8h.code(), 31);
+ CHECK_EQ(test_v8h.SizeInBits(), kQRegSizeInBits);
+ CHECK(!test_v8h.IsLaneSizeB());
+ CHECK(test_v8h.IsLaneSizeH());
+ CHECK(!test_v8h.IsLaneSizeS());
+ CHECK(!test_v8h.IsLaneSizeD());
+ CHECK_EQ(test_v8h.LaneSizeInBits(), 16U);
+
+ VRegister test_v2s(VRegister::VRegFromCode(31).V2S());
+ CHECK_EQ(test_v2s.code(), 31);
+ CHECK_EQ(test_v2s.SizeInBits(), kDRegSizeInBits);
+ CHECK(!test_v2s.IsLaneSizeB());
+ CHECK(!test_v2s.IsLaneSizeH());
+ CHECK(test_v2s.IsLaneSizeS());
+ CHECK(!test_v2s.IsLaneSizeD());
+ CHECK_EQ(test_v2s.LaneSizeInBits(), 32U);
+
+ VRegister test_v4s(VRegister::VRegFromCode(31).V4S());
+ CHECK_EQ(test_v4s.code(), 31);
+ CHECK_EQ(test_v4s.SizeInBits(), kQRegSizeInBits);
+ CHECK(!test_v4s.IsLaneSizeB());
+ CHECK(!test_v4s.IsLaneSizeH());
+ CHECK(test_v4s.IsLaneSizeS());
+ CHECK(!test_v4s.IsLaneSizeD());
+ CHECK_EQ(test_v4s.LaneSizeInBits(), 32U);
+
+ VRegister test_v1d(VRegister::VRegFromCode(31).V1D());
+ CHECK_EQ(test_v1d.code(), 31);
+ CHECK_EQ(test_v1d.SizeInBits(), kDRegSizeInBits);
+ CHECK(!test_v1d.IsLaneSizeB());
+ CHECK(!test_v1d.IsLaneSizeH());
+ CHECK(!test_v1d.IsLaneSizeS());
+ CHECK(test_v1d.IsLaneSizeD());
+ CHECK_EQ(test_v1d.LaneSizeInBits(), 64U);
+
+ VRegister test_v2d(VRegister::VRegFromCode(31).V2D());
+ CHECK_EQ(test_v2d.code(), 31);
+ CHECK_EQ(test_v2d.SizeInBits(), kQRegSizeInBits);
+ CHECK(!test_v2d.IsLaneSizeB());
+ CHECK(!test_v2d.IsLaneSizeH());
+ CHECK(!test_v2d.IsLaneSizeS());
+ CHECK(test_v2d.IsLaneSizeD());
+ CHECK_EQ(test_v2d.LaneSizeInBits(), 64U);
+
+ CHECK(test_v1d.IsSameFormat(test_v1d));
+ CHECK(test_v2d.IsSameFormat(test_v2d));
+ CHECK(!test_v1d.IsSameFormat(test_v2d));
+ CHECK(!test_v2s.IsSameFormat(test_v2d));
+}
TEST(isvalid) {
// This test doesn't generate any code, but it verifies some invariants
// related to IsValid().
CHECK(!NoReg.IsValid());
- CHECK(!NoFPReg.IsValid());
+ CHECK(!NoVReg.IsValid());
CHECK(!NoCPUReg.IsValid());
CHECK(x0.IsValid());
@@ -9974,15 +13837,15 @@ TEST(isvalid) {
CHECK(wzr.IsValidRegister());
CHECK(csp.IsValidRegister());
CHECK(wcsp.IsValidRegister());
- CHECK(!x0.IsValidFPRegister());
- CHECK(!w0.IsValidFPRegister());
- CHECK(!xzr.IsValidFPRegister());
- CHECK(!wzr.IsValidFPRegister());
- CHECK(!csp.IsValidFPRegister());
- CHECK(!wcsp.IsValidFPRegister());
-
- CHECK(d0.IsValidFPRegister());
- CHECK(s0.IsValidFPRegister());
+ CHECK(!x0.IsValidVRegister());
+ CHECK(!w0.IsValidVRegister());
+ CHECK(!xzr.IsValidVRegister());
+ CHECK(!wzr.IsValidVRegister());
+ CHECK(!csp.IsValidVRegister());
+ CHECK(!wcsp.IsValidVRegister());
+
+ CHECK(d0.IsValidVRegister());
+ CHECK(s0.IsValidVRegister());
CHECK(!d0.IsValidRegister());
CHECK(!s0.IsValidRegister());
@@ -10009,19 +13872,69 @@ TEST(isvalid) {
CHECK(static_cast<CPURegister>(wzr).IsValidRegister());
CHECK(static_cast<CPURegister>(csp).IsValidRegister());
CHECK(static_cast<CPURegister>(wcsp).IsValidRegister());
- CHECK(!static_cast<CPURegister>(x0).IsValidFPRegister());
- CHECK(!static_cast<CPURegister>(w0).IsValidFPRegister());
- CHECK(!static_cast<CPURegister>(xzr).IsValidFPRegister());
- CHECK(!static_cast<CPURegister>(wzr).IsValidFPRegister());
- CHECK(!static_cast<CPURegister>(csp).IsValidFPRegister());
- CHECK(!static_cast<CPURegister>(wcsp).IsValidFPRegister());
-
- CHECK(static_cast<CPURegister>(d0).IsValidFPRegister());
- CHECK(static_cast<CPURegister>(s0).IsValidFPRegister());
+ CHECK(!static_cast<CPURegister>(x0).IsValidVRegister());
+ CHECK(!static_cast<CPURegister>(w0).IsValidVRegister());
+ CHECK(!static_cast<CPURegister>(xzr).IsValidVRegister());
+ CHECK(!static_cast<CPURegister>(wzr).IsValidVRegister());
+ CHECK(!static_cast<CPURegister>(csp).IsValidVRegister());
+ CHECK(!static_cast<CPURegister>(wcsp).IsValidVRegister());
+
+ CHECK(static_cast<CPURegister>(d0).IsValidVRegister());
+ CHECK(static_cast<CPURegister>(s0).IsValidVRegister());
CHECK(!static_cast<CPURegister>(d0).IsValidRegister());
CHECK(!static_cast<CPURegister>(s0).IsValidRegister());
}
+TEST(areconsecutive) {
+ // This test generates no code; it just checks that AreConsecutive works.
+ CHECK(AreConsecutive(b0, NoVReg));
+ CHECK(AreConsecutive(b1, b2));
+ CHECK(AreConsecutive(b3, b4, b5));
+ CHECK(AreConsecutive(b6, b7, b8, b9));
+ CHECK(AreConsecutive(h10, NoVReg));
+ CHECK(AreConsecutive(h11, h12));
+ CHECK(AreConsecutive(h13, h14, h15));
+ CHECK(AreConsecutive(h16, h17, h18, h19));
+ CHECK(AreConsecutive(s20, NoVReg));
+ CHECK(AreConsecutive(s21, s22));
+ CHECK(AreConsecutive(s23, s24, s25));
+ CHECK(AreConsecutive(s26, s27, s28, s29));
+ CHECK(AreConsecutive(d30, NoVReg));
+ CHECK(AreConsecutive(d31, d0));
+ CHECK(AreConsecutive(d1, d2, d3));
+ CHECK(AreConsecutive(d4, d5, d6, d7));
+ CHECK(AreConsecutive(q8, NoVReg));
+ CHECK(AreConsecutive(q9, q10));
+ CHECK(AreConsecutive(q11, q12, q13));
+ CHECK(AreConsecutive(q14, q15, q16, q17));
+ CHECK(AreConsecutive(v18, NoVReg));
+ CHECK(AreConsecutive(v19, v20));
+ CHECK(AreConsecutive(v21, v22, v23));
+ CHECK(AreConsecutive(v24, v25, v26, v27));
+ CHECK(AreConsecutive(b29, h30));
+ CHECK(AreConsecutive(s31, d0, q1));
+ CHECK(AreConsecutive(v2, b3, h4, s5));
+
+ CHECK(AreConsecutive(b26, b27, NoVReg, NoVReg));
+ CHECK(AreConsecutive(h28, NoVReg, NoVReg, NoVReg));
+
+ CHECK(!AreConsecutive(b0, b2));
+ CHECK(!AreConsecutive(h1, h0));
+ CHECK(!AreConsecutive(s31, s1));
+ CHECK(!AreConsecutive(d12, d12));
+ CHECK(!AreConsecutive(q31, q1));
+
+ CHECK(!AreConsecutive(b5, b4, b3));
+ CHECK(!AreConsecutive(h15, h16, h15, h14));
+ CHECK(!AreConsecutive(s25, s24, s23, s22));
+ CHECK(!AreConsecutive(d5, d6, d7, d6));
+ CHECK(!AreConsecutive(q15, q16, q17, q6));
+
+ CHECK(!AreConsecutive(b0, b1, b3));
+ CHECK(!AreConsecutive(h4, h5, h6, h6));
+ CHECK(!AreConsecutive(d15, d16, d18, NoVReg));
+ CHECK(!AreConsecutive(s28, s30, NoVReg, NoVReg));
+}
TEST(cpureglist_utils_x) {
// This test doesn't generate any code, but it verifies the behaviour of
@@ -10248,8 +14161,8 @@ TEST(cpureglist_utils_empty) {
// them, and that they are empty.
CPURegList reg32(CPURegister::kRegister, kWRegSizeInBits, 0);
CPURegList reg64(CPURegister::kRegister, kXRegSizeInBits, 0);
- CPURegList fpreg32(CPURegister::kFPRegister, kSRegSizeInBits, 0);
- CPURegList fpreg64(CPURegister::kFPRegister, kDRegSizeInBits, 0);
+ CPURegList fpreg32(CPURegister::kVRegister, kSRegSizeInBits, 0);
+ CPURegList fpreg64(CPURegister::kVRegister, kDRegSizeInBits, 0);
CHECK(reg32.IsEmpty());
CHECK(reg64.IsEmpty());
@@ -10587,13 +14500,13 @@ TEST(barriers) {
TEST(process_nan_double) {
INIT_V8();
// Make sure that NaN propagation works correctly.
- double sn = rawbits_to_double(0x7ff5555511111111);
- double qn = rawbits_to_double(0x7ffaaaaa11111111);
+ double sn = bit_cast<double>(0x7ff5555511111111);
+ double qn = bit_cast<double>(0x7ffaaaaa11111111);
CHECK(IsSignallingNaN(sn));
CHECK(IsQuietNaN(qn));
// The input NaNs after passing through ProcessNaN.
- double sn_proc = rawbits_to_double(0x7ffd555511111111);
+ double sn_proc = bit_cast<double>(0x7ffd555511111111);
double qn_proc = qn;
CHECK(IsQuietNaN(sn_proc));
CHECK(IsQuietNaN(qn_proc));
@@ -10633,17 +14546,17 @@ TEST(process_nan_double) {
END();
RUN();
- uint64_t qn_raw = double_to_rawbits(qn);
- uint64_t sn_raw = double_to_rawbits(sn);
+ uint64_t qn_raw = bit_cast<uint64_t>(qn);
+ uint64_t sn_raw = bit_cast<uint64_t>(sn);
// - Signalling NaN
CHECK_EQUAL_FP64(sn, d1);
- CHECK_EQUAL_FP64(rawbits_to_double(sn_raw & ~kDSignMask), d2);
- CHECK_EQUAL_FP64(rawbits_to_double(sn_raw ^ kDSignMask), d3);
+ CHECK_EQUAL_FP64(bit_cast<double>(sn_raw & ~kDSignMask), d2);
+ CHECK_EQUAL_FP64(bit_cast<double>(sn_raw ^ kDSignMask), d3);
// - Quiet NaN
CHECK_EQUAL_FP64(qn, d11);
- CHECK_EQUAL_FP64(rawbits_to_double(qn_raw & ~kDSignMask), d12);
- CHECK_EQUAL_FP64(rawbits_to_double(qn_raw ^ kDSignMask), d13);
+ CHECK_EQUAL_FP64(bit_cast<double>(qn_raw & ~kDSignMask), d12);
+ CHECK_EQUAL_FP64(bit_cast<double>(qn_raw ^ kDSignMask), d13);
// - Signalling NaN
CHECK_EQUAL_FP64(sn_proc, d4);
@@ -10663,13 +14576,13 @@ TEST(process_nan_double) {
TEST(process_nan_float) {
INIT_V8();
// Make sure that NaN propagation works correctly.
- float sn = rawbits_to_float(0x7f951111);
- float qn = rawbits_to_float(0x7fea1111);
+ float sn = bit_cast<float>(0x7f951111);
+ float qn = bit_cast<float>(0x7fea1111);
CHECK(IsSignallingNaN(sn));
CHECK(IsQuietNaN(qn));
// The input NaNs after passing through ProcessNaN.
- float sn_proc = rawbits_to_float(0x7fd51111);
+ float sn_proc = bit_cast<float>(0x7fd51111);
float qn_proc = qn;
CHECK(IsQuietNaN(sn_proc));
CHECK(IsQuietNaN(qn_proc));
@@ -10709,17 +14622,18 @@ TEST(process_nan_float) {
END();
RUN();
- uint32_t qn_raw = float_to_rawbits(qn);
- uint32_t sn_raw = float_to_rawbits(sn);
+ uint32_t qn_raw = bit_cast<uint32_t>(qn);
+ uint32_t sn_raw = bit_cast<uint32_t>(sn);
+ uint32_t sign_mask = static_cast<uint32_t>(kSSignMask);
// - Signalling NaN
CHECK_EQUAL_FP32(sn, s1);
- CHECK_EQUAL_FP32(rawbits_to_float(sn_raw & ~kSSignMask), s2);
- CHECK_EQUAL_FP32(rawbits_to_float(sn_raw ^ kSSignMask), s3);
+ CHECK_EQUAL_FP32(bit_cast<float>(sn_raw & ~sign_mask), s2);
+ CHECK_EQUAL_FP32(bit_cast<float>(sn_raw ^ sign_mask), s3);
// - Quiet NaN
CHECK_EQUAL_FP32(qn, s11);
- CHECK_EQUAL_FP32(rawbits_to_float(qn_raw & ~kSSignMask), s12);
- CHECK_EQUAL_FP32(rawbits_to_float(qn_raw ^ kSSignMask), s13);
+ CHECK_EQUAL_FP32(bit_cast<float>(qn_raw & ~sign_mask), s12);
+ CHECK_EQUAL_FP32(bit_cast<float>(qn_raw ^ sign_mask), s13);
// - Signalling NaN
CHECK_EQUAL_FP32(sn_proc, s4);
@@ -10772,18 +14686,18 @@ static void ProcessNaNsHelper(double n, double m, double expected) {
TEST(process_nans_double) {
INIT_V8();
// Make sure that NaN propagation works correctly.
- double sn = rawbits_to_double(0x7ff5555511111111);
- double sm = rawbits_to_double(0x7ff5555522222222);
- double qn = rawbits_to_double(0x7ffaaaaa11111111);
- double qm = rawbits_to_double(0x7ffaaaaa22222222);
+ double sn = bit_cast<double>(0x7ff5555511111111);
+ double sm = bit_cast<double>(0x7ff5555522222222);
+ double qn = bit_cast<double>(0x7ffaaaaa11111111);
+ double qm = bit_cast<double>(0x7ffaaaaa22222222);
CHECK(IsSignallingNaN(sn));
CHECK(IsSignallingNaN(sm));
CHECK(IsQuietNaN(qn));
CHECK(IsQuietNaN(qm));
// The input NaNs after passing through ProcessNaN.
- double sn_proc = rawbits_to_double(0x7ffd555511111111);
- double sm_proc = rawbits_to_double(0x7ffd555522222222);
+ double sn_proc = bit_cast<double>(0x7ffd555511111111);
+ double sm_proc = bit_cast<double>(0x7ffd555522222222);
double qn_proc = qn;
double qm_proc = qm;
CHECK(IsQuietNaN(sn_proc));
@@ -10844,18 +14758,18 @@ static void ProcessNaNsHelper(float n, float m, float expected) {
TEST(process_nans_float) {
INIT_V8();
// Make sure that NaN propagation works correctly.
- float sn = rawbits_to_float(0x7f951111);
- float sm = rawbits_to_float(0x7f952222);
- float qn = rawbits_to_float(0x7fea1111);
- float qm = rawbits_to_float(0x7fea2222);
+ float sn = bit_cast<float>(0x7f951111);
+ float sm = bit_cast<float>(0x7f952222);
+ float qn = bit_cast<float>(0x7fea1111);
+ float qm = bit_cast<float>(0x7fea2222);
CHECK(IsSignallingNaN(sn));
CHECK(IsSignallingNaN(sm));
CHECK(IsQuietNaN(qn));
CHECK(IsQuietNaN(qm));
// The input NaNs after passing through ProcessNaN.
- float sn_proc = rawbits_to_float(0x7fd51111);
- float sm_proc = rawbits_to_float(0x7fd52222);
+ float sn_proc = bit_cast<float>(0x7fd51111);
+ float sm_proc = bit_cast<float>(0x7fd52222);
float qn_proc = qn;
float qm_proc = qm;
CHECK(IsQuietNaN(sn_proc));
@@ -10937,10 +14851,11 @@ static void DefaultNaNHelper(float n, float m, float a) {
RUN();
if (test_1op) {
- uint32_t n_raw = float_to_rawbits(n);
+ uint32_t n_raw = bit_cast<uint32_t>(n);
+ uint32_t sign_mask = static_cast<uint32_t>(kSSignMask);
CHECK_EQUAL_FP32(n, s10);
- CHECK_EQUAL_FP32(rawbits_to_float(n_raw & ~kSSignMask), s11);
- CHECK_EQUAL_FP32(rawbits_to_float(n_raw ^ kSSignMask), s12);
+ CHECK_EQUAL_FP32(bit_cast<float>(n_raw & ~sign_mask), s11);
+ CHECK_EQUAL_FP32(bit_cast<float>(n_raw ^ sign_mask), s12);
CHECK_EQUAL_FP32(kFP32DefaultNaN, s13);
CHECK_EQUAL_FP32(kFP32DefaultNaN, s14);
CHECK_EQUAL_FP32(kFP32DefaultNaN, s15);
@@ -10968,12 +14883,12 @@ static void DefaultNaNHelper(float n, float m, float a) {
TEST(default_nan_float) {
INIT_V8();
- float sn = rawbits_to_float(0x7f951111);
- float sm = rawbits_to_float(0x7f952222);
- float sa = rawbits_to_float(0x7f95aaaa);
- float qn = rawbits_to_float(0x7fea1111);
- float qm = rawbits_to_float(0x7fea2222);
- float qa = rawbits_to_float(0x7feaaaaa);
+ float sn = bit_cast<float>(0x7f951111);
+ float sm = bit_cast<float>(0x7f952222);
+ float sa = bit_cast<float>(0x7f95aaaa);
+ float qn = bit_cast<float>(0x7fea1111);
+ float qm = bit_cast<float>(0x7fea2222);
+ float qa = bit_cast<float>(0x7feaaaaa);
CHECK(IsSignallingNaN(sn));
CHECK(IsSignallingNaN(sm));
CHECK(IsSignallingNaN(sa));
@@ -11065,10 +14980,10 @@ static void DefaultNaNHelper(double n, double m, double a) {
RUN();
if (test_1op) {
- uint64_t n_raw = double_to_rawbits(n);
+ uint64_t n_raw = bit_cast<uint64_t>(n);
CHECK_EQUAL_FP64(n, d10);
- CHECK_EQUAL_FP64(rawbits_to_double(n_raw & ~kDSignMask), d11);
- CHECK_EQUAL_FP64(rawbits_to_double(n_raw ^ kDSignMask), d12);
+ CHECK_EQUAL_FP64(bit_cast<double>(n_raw & ~kDSignMask), d11);
+ CHECK_EQUAL_FP64(bit_cast<double>(n_raw ^ kDSignMask), d12);
CHECK_EQUAL_FP64(kFP64DefaultNaN, d13);
CHECK_EQUAL_FP64(kFP64DefaultNaN, d14);
CHECK_EQUAL_FP64(kFP64DefaultNaN, d15);
@@ -11096,12 +15011,12 @@ static void DefaultNaNHelper(double n, double m, double a) {
TEST(default_nan_double) {
INIT_V8();
- double sn = rawbits_to_double(0x7ff5555511111111);
- double sm = rawbits_to_double(0x7ff5555522222222);
- double sa = rawbits_to_double(0x7ff55555aaaaaaaa);
- double qn = rawbits_to_double(0x7ffaaaaa11111111);
- double qm = rawbits_to_double(0x7ffaaaaa22222222);
- double qa = rawbits_to_double(0x7ffaaaaaaaaaaaaa);
+ double sn = bit_cast<double>(0x7ff5555511111111);
+ double sm = bit_cast<double>(0x7ff5555522222222);
+ double sa = bit_cast<double>(0x7ff55555aaaaaaaa);
+ double qn = bit_cast<double>(0x7ffaaaaa11111111);
+ double qm = bit_cast<double>(0x7ffaaaaa22222222);
+ double qa = bit_cast<double>(0x7ffaaaaaaaaaaaaa);
CHECK(IsSignallingNaN(sn));
CHECK(IsSignallingNaN(sm));
CHECK(IsSignallingNaN(sa));
« no previous file with comments | « test/cctest/cctest.gyp ('k') | test/cctest/test-disasm-arm64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698