| Index: runtime/vm/assembler_arm64_test.cc
|
| ===================================================================
|
| --- runtime/vm/assembler_arm64_test.cc (revision 36576)
|
| +++ runtime/vm/assembler_arm64_test.cc (working copy)
|
| @@ -1846,6 +1846,191 @@
|
| }
|
|
|
|
|
| +ASSEMBLER_TEST_GENERATE(VinswVmovrs, assembler) {
|
| + __ LoadImmediate(R0, 42, kNoPP);
|
| + __ LoadImmediate(R1, 43, kNoPP);
|
| + __ LoadImmediate(R2, 44, kNoPP);
|
| + __ LoadImmediate(R3, 45, kNoPP);
|
| +
|
| + __ vinsw(V0, 0, R0);
|
| + __ vinsw(V0, 1, R1);
|
| + __ vinsw(V0, 2, R2);
|
| + __ vinsw(V0, 3, R3);
|
| +
|
| + __ vmovrs(R4, V0, 0);
|
| + __ vmovrs(R5, V0, 1);
|
| + __ vmovrs(R6, V0, 2);
|
| + __ vmovrs(R7, V0, 3);
|
| +
|
| + __ add(R0, R4, Operand(R5));
|
| + __ add(R0, R0, Operand(R6));
|
| + __ add(R0, R0, Operand(R7));
|
| + __ ret();
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_RUN(VinswVmovrs, test) {
|
| + EXPECT(test != NULL);
|
| + typedef int (*Tst)();
|
| + EXPECT_EQ(174, EXECUTE_TEST_CODE_INT64(Tst, test->entry()));
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_GENERATE(VinsxVmovrd, assembler) {
|
| + __ LoadImmediate(R0, 42, kNoPP);
|
| + __ LoadImmediate(R1, 43, kNoPP);
|
| +
|
| + __ vinsx(V0, 0, R0);
|
| + __ vinsx(V0, 1, R1);
|
| +
|
| + __ vmovrd(R2, V0, 0);
|
| + __ vmovrd(R3, V0, 1);
|
| +
|
| + __ add(R0, R2, Operand(R3));
|
| + __ ret();
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_RUN(VinsxVmovrd, test) {
|
| + EXPECT(test != NULL);
|
| + typedef int (*Tst)();
|
| + EXPECT_EQ(85, EXECUTE_TEST_CODE_INT64(Tst, test->entry()));
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_GENERATE(Vnot, assembler) {
|
| + __ LoadImmediate(R0, 0xfffffffe, kNoPP);
|
| + __ LoadImmediate(R1, 0xffffffff, kNoPP);
|
| + __ vinsw(V1, 0, R1);
|
| + __ vinsw(V1, 1, R0);
|
| + __ vinsw(V1, 2, R1);
|
| + __ vinsw(V1, 3, R0);
|
| +
|
| + __ vnot(V0, V1);
|
| +
|
| + __ vmovrs(R2, V0, 0);
|
| + __ vmovrs(R3, V0, 1);
|
| + __ vmovrs(R4, V0, 2);
|
| + __ vmovrs(R5, V0, 3);
|
| + __ add(R0, R2, Operand(R3));
|
| + __ add(R0, R0, Operand(R4));
|
| + __ add(R0, R0, Operand(R5));
|
| + __ ret();
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_RUN(Vnot, test) {
|
| + EXPECT(test != NULL);
|
| + typedef int (*Tst)();
|
| + EXPECT_EQ(2, EXECUTE_TEST_CODE_INT64(Tst, test->entry()));
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_GENERATE(Vabss, assembler) {
|
| + __ LoadDImmediate(V1, 21.0, kNoPP);
|
| + __ LoadDImmediate(V2, -21.0, kNoPP);
|
| +
|
| + __ fcvtsd(V1, V1);
|
| + __ fcvtsd(V2, V2);
|
| +
|
| + __ veor(V3, V3, V3);
|
| + __ vinss(V3, 1, V1, 0);
|
| + __ vinss(V3, 3, V2, 0);
|
| +
|
| + __ vabss(V4, V3);
|
| +
|
| + __ vinss(V5, 0, V4, 1);
|
| + __ vinss(V6, 0, V4, 3);
|
| +
|
| + __ fcvtds(V5, V5);
|
| + __ fcvtds(V6, V6);
|
| +
|
| + __ faddd(V0, V5, V6);
|
| + __ ret();
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_RUN(Vabss, test) {
|
| + typedef int (*SimpleCode)();
|
| + EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_GENERATE(Vabsd, assembler) {
|
| + __ LoadDImmediate(V1, 21.0, kNoPP);
|
| + __ LoadDImmediate(V2, -21.0, kNoPP);
|
| +
|
| + __ vinsd(V3, 0, V1, 0);
|
| + __ vinsd(V3, 1, V2, 0);
|
| +
|
| + __ vabsd(V4, V3);
|
| +
|
| + __ vinsd(V5, 0, V4, 0);
|
| + __ vinsd(V6, 0, V4, 1);
|
| +
|
| + __ faddd(V0, V5, V6);
|
| + __ ret();
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_RUN(Vabsd, test) {
|
| + typedef int (*SimpleCode)();
|
| + EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_GENERATE(Vnegs, assembler) {
|
| + __ LoadDImmediate(V1, 42.0, kNoPP);
|
| + __ LoadDImmediate(V2, -84.0, kNoPP);
|
| +
|
| + __ fcvtsd(V1, V1);
|
| + __ fcvtsd(V2, V2);
|
| +
|
| + __ veor(V3, V3, V3);
|
| + __ vinss(V3, 1, V1, 0);
|
| + __ vinss(V3, 3, V2, 0);
|
| +
|
| + __ vnegs(V4, V3);
|
| +
|
| + __ vinss(V5, 0, V4, 1);
|
| + __ vinss(V6, 0, V4, 3);
|
| +
|
| + __ fcvtds(V5, V5);
|
| + __ fcvtds(V6, V6);
|
| + __ faddd(V0, V5, V6);
|
| + __ ret();
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_RUN(Vnegs, test) {
|
| + typedef int (*SimpleCode)();
|
| + EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_GENERATE(Vnegd, assembler) {
|
| + __ LoadDImmediate(V1, 42.0, kNoPP);
|
| + __ LoadDImmediate(V2, -84.0, kNoPP);
|
| +
|
| + __ vinsd(V3, 0, V1, 0);
|
| + __ vinsd(V3, 1, V2, 0);
|
| +
|
| + __ vnegd(V4, V3);
|
| +
|
| + __ vinsd(V5, 0, V4, 0);
|
| + __ vinsd(V6, 0, V4, 1);
|
| +
|
| + __ faddd(V0, V5, V6);
|
| + __ ret();
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_RUN(Vnegd, test) {
|
| + typedef int (*SimpleCode)();
|
| + EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
|
| +}
|
| +
|
| +
|
| ASSEMBLER_TEST_GENERATE(Vadds, assembler) {
|
| __ LoadDImmediate(V0, 0.0, kNoPP);
|
| __ LoadDImmediate(V1, 1.0, kNoPP);
|
| @@ -1857,21 +2042,17 @@
|
| __ fcvtsd(V2, V2);
|
| __ fcvtsd(V3, V3);
|
|
|
| - const int sword_bytes = 1 << Log2OperandSizeBytes(kSWord);
|
| - const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord);
|
| - __ fstrs(V0, Address(SP, -1 * sword_bytes, Address::PreIndex));
|
| - __ fstrs(V1, Address(SP, -1 * sword_bytes, Address::PreIndex));
|
| - __ fstrs(V2, Address(SP, -1 * sword_bytes, Address::PreIndex));
|
| - __ fstrs(V3, Address(SP, -1 * sword_bytes, Address::PreIndex));
|
| + __ vinss(V4, 0, V0, 0);
|
| + __ vinss(V4, 1, V1, 0);
|
| + __ vinss(V4, 2, V2, 0);
|
| + __ vinss(V4, 3, V3, 0);
|
|
|
| - __ fldrq(V4, Address(SP, 1 * qword_bytes, Address::PostIndex));
|
| __ vadds(V5, V4, V4);
|
| - __ fstrq(V5, Address(SP, -1 * qword_bytes, Address::PreIndex));
|
|
|
| - __ fldrs(V0, Address(SP, 1 * sword_bytes, Address::PostIndex));
|
| - __ fldrs(V1, Address(SP, 1 * sword_bytes, Address::PostIndex));
|
| - __ fldrs(V2, Address(SP, 1 * sword_bytes, Address::PostIndex));
|
| - __ fldrs(V3, Address(SP, 1 * sword_bytes, Address::PostIndex));
|
| + __ vinss(V0, 0, V5, 0);
|
| + __ vinss(V1, 0, V5, 1);
|
| + __ vinss(V2, 0, V5, 2);
|
| + __ vinss(V3, 0, V5, 3);
|
|
|
| __ fcvtds(V0, V0);
|
| __ fcvtds(V1, V1);
|
| @@ -1903,21 +2084,17 @@
|
| __ fcvtsd(V2, V2);
|
| __ fcvtsd(V3, V3);
|
|
|
| - const int sword_bytes = 1 << Log2OperandSizeBytes(kSWord);
|
| - const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord);
|
| - __ fstrs(V0, Address(SP, -1 * sword_bytes, Address::PreIndex));
|
| - __ fstrs(V1, Address(SP, -1 * sword_bytes, Address::PreIndex));
|
| - __ fstrs(V2, Address(SP, -1 * sword_bytes, Address::PreIndex));
|
| - __ fstrs(V3, Address(SP, -1 * sword_bytes, Address::PreIndex));
|
| + __ vinss(V4, 0, V0, 0);
|
| + __ vinss(V4, 1, V1, 0);
|
| + __ vinss(V4, 2, V2, 0);
|
| + __ vinss(V4, 3, V3, 0);
|
|
|
| - __ fldrq(V4, Address(SP, 1 * qword_bytes, Address::PostIndex));
|
| __ vsubs(V5, V5, V4);
|
| - __ fstrq(V5, Address(SP, -1 * qword_bytes, Address::PreIndex));
|
|
|
| - __ fldrs(V0, Address(SP, 1 * sword_bytes, Address::PostIndex));
|
| - __ fldrs(V1, Address(SP, 1 * sword_bytes, Address::PostIndex));
|
| - __ fldrs(V2, Address(SP, 1 * sword_bytes, Address::PostIndex));
|
| - __ fldrs(V3, Address(SP, 1 * sword_bytes, Address::PostIndex));
|
| + __ vinss(V0, 0, V5, 0);
|
| + __ vinss(V1, 0, V5, 1);
|
| + __ vinss(V2, 0, V5, 2);
|
| + __ vinss(V3, 0, V5, 3);
|
|
|
| __ fcvtds(V0, V0);
|
| __ fcvtds(V1, V1);
|
| @@ -1948,21 +2125,17 @@
|
| __ fcvtsd(V2, V2);
|
| __ fcvtsd(V3, V3);
|
|
|
| - const int sword_bytes = 1 << Log2OperandSizeBytes(kSWord);
|
| - const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord);
|
| - __ fstrs(V0, Address(SP, -1 * sword_bytes, Address::PreIndex));
|
| - __ fstrs(V1, Address(SP, -1 * sword_bytes, Address::PreIndex));
|
| - __ fstrs(V2, Address(SP, -1 * sword_bytes, Address::PreIndex));
|
| - __ fstrs(V3, Address(SP, -1 * sword_bytes, Address::PreIndex));
|
| + __ vinss(V4, 0, V0, 0);
|
| + __ vinss(V4, 1, V1, 0);
|
| + __ vinss(V4, 2, V2, 0);
|
| + __ vinss(V4, 3, V3, 0);
|
|
|
| - __ fldrq(V4, Address(SP, 1 * qword_bytes, Address::PostIndex));
|
| __ vmuls(V5, V4, V4);
|
| - __ fstrq(V5, Address(SP, -1 * qword_bytes, Address::PreIndex));
|
|
|
| - __ fldrs(V0, Address(SP, 1 * sword_bytes, Address::PostIndex));
|
| - __ fldrs(V1, Address(SP, 1 * sword_bytes, Address::PostIndex));
|
| - __ fldrs(V2, Address(SP, 1 * sword_bytes, Address::PostIndex));
|
| - __ fldrs(V3, Address(SP, 1 * sword_bytes, Address::PostIndex));
|
| + __ vinss(V0, 0, V5, 0);
|
| + __ vinss(V1, 0, V5, 1);
|
| + __ vinss(V2, 0, V5, 2);
|
| + __ vinss(V3, 0, V5, 3);
|
|
|
| __ fcvtds(V0, V0);
|
| __ fcvtds(V1, V1);
|
| @@ -1993,21 +2166,17 @@
|
| __ fcvtsd(V2, V2);
|
| __ fcvtsd(V3, V3);
|
|
|
| - const int sword_bytes = 1 << Log2OperandSizeBytes(kSWord);
|
| - const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord);
|
| - __ fstrs(V0, Address(SP, -1 * sword_bytes, Address::PreIndex));
|
| - __ fstrs(V1, Address(SP, -1 * sword_bytes, Address::PreIndex));
|
| - __ fstrs(V2, Address(SP, -1 * sword_bytes, Address::PreIndex));
|
| - __ fstrs(V3, Address(SP, -1 * sword_bytes, Address::PreIndex));
|
| + __ vinss(V4, 0, V0, 0);
|
| + __ vinss(V4, 1, V1, 0);
|
| + __ vinss(V4, 2, V2, 0);
|
| + __ vinss(V4, 3, V3, 0);
|
|
|
| - __ fldrq(V4, Address(SP, 1 * qword_bytes, Address::PostIndex));
|
| __ vdivs(V5, V4, V4);
|
| - __ fstrq(V5, Address(SP, -1 * qword_bytes, Address::PreIndex));
|
|
|
| - __ fldrs(V3, Address(SP, 1 * sword_bytes, Address::PostIndex));
|
| - __ fldrs(V2, Address(SP, 1 * sword_bytes, Address::PostIndex));
|
| - __ fldrs(V1, Address(SP, 1 * sword_bytes, Address::PostIndex));
|
| - __ fldrs(V0, Address(SP, 1 * sword_bytes, Address::PostIndex));
|
| + __ vinss(V0, 0, V5, 0);
|
| + __ vinss(V1, 0, V5, 1);
|
| + __ vinss(V2, 0, V5, 2);
|
| + __ vinss(V3, 0, V5, 3);
|
|
|
| __ fcvtds(V0, V0);
|
| __ fcvtds(V1, V1);
|
| @@ -2027,22 +2196,17 @@
|
| }
|
|
|
|
|
| -
|
| ASSEMBLER_TEST_GENERATE(Vaddd, assembler) {
|
| __ LoadDImmediate(V0, 2.0, kNoPP);
|
| __ LoadDImmediate(V1, 3.0, kNoPP);
|
|
|
| - const int dword_bytes = 1 << Log2OperandSizeBytes(kDWord);
|
| - const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord);
|
| - __ fstrd(V0, Address(SP, -1 * dword_bytes, Address::PreIndex));
|
| - __ fstrd(V1, Address(SP, -1 * dword_bytes, Address::PreIndex));
|
| + __ vinsd(V4, 0, V0, 0);
|
| + __ vinsd(V4, 1, V1, 0);
|
|
|
| - __ fldrq(V4, Address(SP, 1 * qword_bytes, Address::PostIndex));
|
| __ vaddd(V5, V4, V4);
|
| - __ fstrq(V5, Address(SP, -1 * qword_bytes, Address::PreIndex));
|
|
|
| - __ fldrd(V1, Address(SP, 1 * dword_bytes, Address::PostIndex));
|
| - __ fldrd(V0, Address(SP, 1 * dword_bytes, Address::PostIndex));
|
| + __ vinsd(V0, 0, V5, 0);
|
| + __ vinsd(V1, 0, V5, 1);
|
|
|
| __ faddd(V0, V0, V1);
|
| __ ret();
|
| @@ -2060,17 +2224,13 @@
|
| __ LoadDImmediate(V1, 3.0, kNoPP);
|
| __ LoadDImmediate(V5, 0.0, kNoPP);
|
|
|
| - const int dword_bytes = 1 << Log2OperandSizeBytes(kDWord);
|
| - const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord);
|
| - __ fstrd(V0, Address(SP, -1 * dword_bytes, Address::PreIndex));
|
| - __ fstrd(V1, Address(SP, -1 * dword_bytes, Address::PreIndex));
|
| + __ vinsd(V4, 0, V0, 0);
|
| + __ vinsd(V4, 1, V1, 0);
|
|
|
| - __ fldrq(V4, Address(SP, 1 * qword_bytes, Address::PostIndex));
|
| __ vsubd(V5, V5, V4);
|
| - __ fstrq(V5, Address(SP, -1 * qword_bytes, Address::PreIndex));
|
|
|
| - __ fldrd(V1, Address(SP, 1 * dword_bytes, Address::PostIndex));
|
| - __ fldrd(V0, Address(SP, 1 * dword_bytes, Address::PostIndex));
|
| + __ vinsd(V0, 0, V5, 0);
|
| + __ vinsd(V1, 0, V5, 1);
|
|
|
| __ faddd(V0, V0, V1);
|
| __ ret();
|
| @@ -2087,17 +2247,13 @@
|
| __ LoadDImmediate(V0, 2.0, kNoPP);
|
| __ LoadDImmediate(V1, 3.0, kNoPP);
|
|
|
| - const int dword_bytes = 1 << Log2OperandSizeBytes(kDWord);
|
| - const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord);
|
| - __ fstrd(V0, Address(SP, -1 * dword_bytes, Address::PreIndex));
|
| - __ fstrd(V1, Address(SP, -1 * dword_bytes, Address::PreIndex));
|
| + __ vinsd(V4, 0, V0, 0);
|
| + __ vinsd(V4, 1, V1, 0);
|
|
|
| - __ fldrq(V4, Address(SP, 1 * qword_bytes, Address::PostIndex));
|
| __ vmuld(V5, V4, V4);
|
| - __ fstrq(V5, Address(SP, -1 * qword_bytes, Address::PreIndex));
|
|
|
| - __ fldrd(V1, Address(SP, 1 * dword_bytes, Address::PostIndex));
|
| - __ fldrd(V0, Address(SP, 1 * dword_bytes, Address::PostIndex));
|
| + __ vinsd(V0, 0, V5, 0);
|
| + __ vinsd(V1, 0, V5, 1);
|
|
|
| __ faddd(V0, V0, V1);
|
| __ ret();
|
| @@ -2114,17 +2270,13 @@
|
| __ LoadDImmediate(V0, 2.0, kNoPP);
|
| __ LoadDImmediate(V1, 3.0, kNoPP);
|
|
|
| - const int dword_bytes = 1 << Log2OperandSizeBytes(kDWord);
|
| - const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord);
|
| - __ fstrd(V0, Address(SP, -1 * dword_bytes, Address::PreIndex));
|
| - __ fstrd(V1, Address(SP, -1 * dword_bytes, Address::PreIndex));
|
| + __ vinsd(V4, 0, V0, 0);
|
| + __ vinsd(V4, 1, V1, 0);
|
|
|
| - __ fldrq(V4, Address(SP, 1 * qword_bytes, Address::PostIndex));
|
| __ vdivd(V5, V4, V4);
|
| - __ fstrq(V5, Address(SP, -1 * qword_bytes, Address::PreIndex));
|
|
|
| - __ fldrd(V1, Address(SP, 1 * dword_bytes, Address::PostIndex));
|
| - __ fldrd(V0, Address(SP, 1 * dword_bytes, Address::PostIndex));
|
| + __ vinsd(V0, 0, V5, 0);
|
| + __ vinsd(V1, 0, V5, 1);
|
|
|
| __ faddd(V0, V0, V1);
|
| __ ret();
|
| @@ -2247,6 +2399,209 @@
|
| }
|
|
|
|
|
| +ASSEMBLER_TEST_GENERATE(Vand, assembler) {
|
| + __ LoadDImmediate(V1, 21.0, kNoPP);
|
| + __ LoadImmediate(R0, 0xffffffff, kNoPP);
|
| +
|
| + // V0 <- (0, 0xffffffff, 0, 0xffffffff)
|
| + __ fmovdr(V0, R0);
|
| + __ vinss(V0, 2, V0, 0);
|
| +
|
| + // V1 <- (21.0, 21.0, 21.0, 21.0)
|
| + __ fcvtsd(V1, V1);
|
| + __ vdups(V1, V1, 0);
|
| +
|
| + __ vand(V2, V1, V0);
|
| +
|
| + __ vinss(V3, 0, V2, 0);
|
| + __ vinss(V4, 0, V2, 1);
|
| + __ vinss(V5, 0, V2, 2);
|
| + __ vinss(V6, 0, V2, 3);
|
| +
|
| + __ fcvtds(V3, V3);
|
| + __ fcvtds(V4, V4);
|
| + __ fcvtds(V5, V5);
|
| + __ fcvtds(V6, V6);
|
| +
|
| + __ vaddd(V0, V3, V4);
|
| + __ vaddd(V0, V0, V5);
|
| + __ vaddd(V0, V0, V6);
|
| + __ ret();
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_RUN(Vand, test) {
|
| + typedef int (*SimpleCode)();
|
| + EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_GENERATE(Vorr, assembler) {
|
| + __ LoadDImmediate(V1, 10.5, kNoPP);
|
| + __ fcvtsd(V1, V1);
|
| +
|
| + // V0 <- (0, 10.5, 0, 10.5)
|
| + __ fmovdd(V0, V1);
|
| + __ vinss(V0, 2, V0, 0);
|
| +
|
| + // V1 <- (10.5, 0, 10.5, 0)
|
| + __ veor(V1, V1, V1);
|
| + __ vinss(V1, 1, V0, 0);
|
| + __ vinss(V1, 3, V0, 0);
|
| +
|
| + __ vorr(V2, V1, V0);
|
| +
|
| + __ vinss(V3, 0, V2, 0);
|
| + __ vinss(V4, 0, V2, 1);
|
| + __ vinss(V5, 0, V2, 2);
|
| + __ vinss(V6, 0, V2, 3);
|
| +
|
| + __ fcvtds(V3, V3);
|
| + __ fcvtds(V4, V4);
|
| + __ fcvtds(V5, V5);
|
| + __ fcvtds(V6, V6);
|
| +
|
| + __ vaddd(V0, V3, V4);
|
| + __ vaddd(V0, V0, V5);
|
| + __ vaddd(V0, V0, V6);
|
| + __ ret();
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_RUN(Vorr, test) {
|
| + typedef int (*SimpleCode)();
|
| + EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_GENERATE(Veor, assembler) {
|
| + __ LoadImmediate(R1, 0xffffffff, kNoPP);
|
| + __ LoadImmediate(R2, ~21, kNoPP);
|
| +
|
| + __ vinsw(V1, 0, R1);
|
| + __ vinsw(V1, 1, R2);
|
| + __ vinsw(V1, 2, R1);
|
| + __ vinsw(V1, 3, R2);
|
| +
|
| + __ vinsw(V2, 0, R1);
|
| + __ vinsw(V2, 1, R1);
|
| + __ vinsw(V2, 2, R1);
|
| + __ vinsw(V2, 3, R1);
|
| +
|
| + __ veor(V0, V1, V2);
|
| +
|
| + __ vmovrs(R3, V0, 0);
|
| + __ vmovrs(R4, V0, 1);
|
| + __ vmovrs(R5, V0, 2);
|
| + __ vmovrs(R6, V0, 3);
|
| +
|
| + __ add(R0, R3, Operand(R4));
|
| + __ add(R0, R0, Operand(R5));
|
| + __ add(R0, R0, Operand(R6));
|
| + __ ret();
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_RUN(Veor, test) {
|
| + typedef int (*SimpleCode)();
|
| + EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_GENERATE(Vaddw, assembler) {
|
| + __ LoadImmediate(R4, 21, kNoPP);
|
| +
|
| + __ vdupw(V1, R4);
|
| + __ vdupw(V2, R4);
|
| +
|
| + __ vaddw(V0, V1, V2);
|
| +
|
| + __ vmovrs(R0, V0, 0);
|
| + __ vmovrs(R1, V0, 1);
|
| + __ vmovrs(R2, V0, 2);
|
| + __ vmovrs(R3, V0, 3);
|
| + __ add(R0, R0, Operand(R1));
|
| + __ add(R0, R0, Operand(R2));
|
| + __ add(R0, R0, Operand(R3));
|
| + __ ret();
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_RUN(Vaddw, test) {
|
| + typedef int (*SimpleCode)();
|
| + EXPECT_EQ(168, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_GENERATE(Vsubw, assembler) {
|
| + __ LoadImmediate(R4, 31, kNoPP);
|
| + __ LoadImmediate(R5, 10, kNoPP);
|
| +
|
| + __ vdupw(V1, R4);
|
| + __ vdupw(V2, R5);
|
| +
|
| + __ vsubw(V0, V1, V2);
|
| +
|
| + __ vmovrs(R0, V0, 0);
|
| + __ vmovrs(R1, V0, 1);
|
| + __ vmovrs(R2, V0, 2);
|
| + __ vmovrs(R3, V0, 3);
|
| + __ add(R0, R0, Operand(R1));
|
| + __ add(R0, R0, Operand(R2));
|
| + __ add(R0, R0, Operand(R3));
|
| + __ ret();
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_RUN(Vsubw, test) {
|
| + typedef int (*SimpleCode)();
|
| + EXPECT_EQ(84, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_GENERATE(Vaddx, assembler) {
|
| + __ LoadImmediate(R4, 21, kNoPP);
|
| +
|
| + __ vdupx(V1, R4);
|
| + __ vdupx(V2, R4);
|
| +
|
| + __ vaddx(V0, V1, V2);
|
| +
|
| + __ vmovrd(R0, V0, 0);
|
| + __ vmovrd(R1, V0, 1);
|
| + __ add(R0, R0, Operand(R1));
|
| + __ ret();
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_RUN(Vaddx, test) {
|
| + typedef int (*SimpleCode)();
|
| + EXPECT_EQ(84, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_GENERATE(Vsubx, assembler) {
|
| + __ LoadImmediate(R4, 31, kNoPP);
|
| + __ LoadImmediate(R5, 10, kNoPP);
|
| +
|
| + __ vdupx(V1, R4);
|
| + __ vdupx(V2, R5);
|
| +
|
| + __ vsubx(V0, V1, V2);
|
| +
|
| + __ vmovrd(R0, V0, 0);
|
| + __ vmovrd(R1, V0, 1);
|
| + __ add(R0, R0, Operand(R1));
|
| + __ ret();
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_RUN(Vsubx, test) {
|
| + typedef int (*SimpleCode)();
|
| + EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
|
| +}
|
| +
|
| +
|
| // Called from assembler_test.cc.
|
| // LR: return address.
|
| // R0: context.
|
|
|