6#if defined(TARGET_ARCH_ARM64)
20#define EXPECT_DISASSEMBLY(expected)
22#define EXPECT_DISASSEMBLY(expected) \
23 EXPECT_STREQ(expected, test->RelativeDisassembly())
28 __ add(
R0,
R0, Operand(42));
34 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
44 __ movz(
R0, Immediate(42), 0);
50 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
57 __ movz(
R0, Immediate(42), 0);
58 __ movz(
R0, Immediate(42), 1);
64 EXPECT_EQ(42LL << 16, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
67 "movz r0, #0x2a lsl 16\n"
72 __ movz(
R0, Immediate(42), 2);
78 EXPECT_EQ(42LL << 32, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
80 "movz r0, #0x2a lsl 32\n"
85 __ movz(
R0, Immediate(42), 3);
91 EXPECT_EQ(42LL << 48, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
93 "movz r0, #0x2a lsl 48\n"
99 __ movn(
R0, Immediate(42), 0);
105 EXPECT_EQ(~42LL, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
112 __ movn(
R0, Immediate(42), 1);
118 EXPECT_EQ(~(42LL << 16), EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
120 "movn r0, #0x2a lsl 16\n"
125 __ movn(
R0, Immediate(42), 2);
131 EXPECT_EQ(~(42LL << 32), EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
133 "movn r0, #0x2a lsl 32\n"
138 __ movn(
R0, Immediate(42), 3);
144 EXPECT_EQ(~(42LL << 48), EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
146 "movn r0, #0x2a lsl 48\n"
152 __ movz(
R0, Immediate(1), 3);
153 __ movk(
R0, Immediate(42), 0);
159 EXPECT_EQ(42LL | (1LL << 48),
160 EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
162 "movz r0, #0x1 lsl 48\n"
168 __ movz(
R0, Immediate(1), 0);
169 __ movk(
R0, Immediate(42), 1);
175 EXPECT_EQ((42LL << 16) | 1,
176 EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
179 "movk r0, #0x2a lsl 16\n"
184 __ movz(
R0, Immediate(1), 0);
185 __ movk(
R0, Immediate(42), 2);
191 EXPECT_EQ((42LL << 32) | 1,
192 EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
195 "movk r0, #0x2a lsl 32\n"
200 __ movz(
R0, Immediate(1), 0);
201 __ movk(
R0, Immediate(42), 3);
207 EXPECT_EQ((42LL << 48) | 1,
208 EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
211 "movk r0, #0x2a lsl 48\n"
216 __ movz(
R0, Immediate(0x8000), 0);
222 EXPECT_EQ(0x8000, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
230 __ movz(
R0, Immediate(20), 0);
231 __ movz(
R1, Immediate(22), 0);
238 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
247 __ movz(
R0, Immediate(20), 0);
248 __ movz(
R1, Immediate(11), 0);
255 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
259 "add r0, r0, r1 lsl #1\n"
264 __ movz(
R0, Immediate(20), 0);
265 __ movz(
R1, Immediate(44), 0);
272 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
276 "add r0, r0, r1 lsr #1\n"
281 __ movz(
R0, Immediate(20), 0);
282 __ movz(
R1, Immediate(44), 0);
289 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
293 "add r0, r0, r1 asr #1\n"
298 __ movz(
R0, Immediate(43), 0);
299 __ movn(
R1, Immediate(0), 0);
307 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
311 "add r1, zr, r1 lsl #3\n"
312 "add r0, r0, r1 asr #3\n"
318 __ movz(
R0, Immediate(43), 0);
319 __ movz(
R1, Immediate(0xffff), 0);
320 __ movk(
R1, Immediate(0xffff), 1);
327 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
331 "movk r1, #0xffff lsl 16\n"
332 "add r0, r0, r1 sxtw\n"
337 __ LoadImmediate(
R2, -1);
338 __ LoadImmediate(
R1, 1);
339 __ LoadImmediate(
R0, 0);
348 EXPECT_EQ(1, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
360 __ LoadImmediate(
R1, 1);
361 __ LoadImmediate(
R0, 0);
370 EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
381 __ LoadImmediate(
R0, 0);
382 __ LoadImmediate(
R1, 1);
383 __ LoadImmediate(
R2, 0xFFFFFFFFFFFFFFFF);
384 __ LoadImmediate(
R3, 0x7FFFFFFFFFFFFFFF);
393 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
398 "mov r3, 0x7fffffffffffffff\n"
401 "csinc r0, r0, r0, vs\n"
406 __ LoadImmediate(
R2, -1);
407 __ LoadImmediate(
R1, 1);
408 __ LoadImmediate(
R0, 0);
417 EXPECT_EQ(1, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
422 "addws tmp, r2, r1\n"
423 "adcws tmp, r2, r0\n"
429 __ LoadImmediate(
R1, 1);
430 __ LoadImmediate(
R0, 0);
439 EXPECT_EQ(0x0FFFFFFFF, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
443 "subws tmp, r0, r1\n"
444 "sbcws tmp, r0, r0\n"
450 __ LoadImmediate(
R0, 0);
451 __ LoadImmediate(
R1, 1);
452 __ LoadImmediate(
R2, 0xFFFFFFFF);
453 __ LoadImmediate(
R3, 0x7FFFFFFF);
462 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
466 "mov r2, 0xffffffff\n"
467 "mov r3, 0x7fffffff\n"
468 "addws tmp, r2, r1\n"
469 "adcws tmp, r3, r0\n"
470 "csinc r0, r0, r0, vs\n"
479 Operand(2 * target::kWordSize));
481 __ movz(
R0, Immediate(43), 0);
482 __ movz(
R1, Immediate(42), 0);
491 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
494 "sub csp, csp, #0x1000\n"
495 "sub csp, csp, #0x10\n"
498 "str r1, [sp, #-8]!\n"
499 "ldr r0, [sp], #8 !\n"
506 __ movz(
R0, Immediate(43), 0);
507 __ movz(
R1, Immediate(42), 0);
508 __ add(
R2,
SP, Operand(1));
509 __ str(
R1, Address(
R2, -1));
510 __ ldr(
R0, Address(
R2, -1));
517 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
520 "sub csp, csp, #0x1000\n"
524 "str r1, [r2, #-1]\n"
525 "ldr r0, [r2, #-1]\n"
534 Operand(32 * target::kWordSize));
536 __ movz(
R0, Immediate(43), 0);
537 __ movz(
R1, Immediate(42), 0);
543 __ add(
SP,
SP, Operand(target::kWordSize));
550 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
553 "sub csp, csp, #0x1000\n"
554 "sub csp, csp, #0x100\n"
557 "str r1, [sp, #-256]!\n"
558 "ldr r0, [sp], #248 !\n"
566 __ movz(
R0, Immediate(43), 0);
567 __ movz(
R1, Immediate(42), 0);
568 __ sub(
SP,
SP, Operand(512 * target::kWordSize));
569 __ andi(
CSP,
SP, Immediate(~15));
571 __ add(
SP,
SP, Operand(512 * target::kWordSize));
579 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
582 "sub csp, csp, #0x1000\n"
585 "sub sp, sp, #0x1000\n"
586 "and csp, sp, 0xfffffffffffffff0\n"
587 "str r1, [sp, #4096]\n"
588 "add sp, sp, #0x1000\n"
596 __ movz(
R0, Immediate(43), 0);
597 __ movz(
R1, Immediate(42), 0);
598 __ movz(
R2, Immediate(0xfff8), 0);
599 __ movk(
R2, Immediate(0xffff), 1);
603 __ sub(
SP,
SP, Operand(target::kWordSize));
604 __ andi(
CSP,
SP, Immediate(~15));
606 __ add(
SP,
SP, Operand(target::kWordSize));
613 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
616 "sub csp, csp, #0x1000\n"
620 "movk r2, #0xffff lsl 16\n"
621 "str r1, [sp, r2 sxtw]\n"
623 "and csp, sp, 0xfffffffffffffff0\n"
632 __ movz(
R0, Immediate(43), 0);
633 __ movz(
R1, Immediate(42), 0);
634 __ movz(
R2, Immediate(10), 0);
635 __ sub(
SP,
SP, Operand(10 * target::kWordSize));
636 __ andi(
CSP,
SP, Immediate(~15));
640 __ add(
SP,
SP, Operand(10 * target::kWordSize));
647 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
650 "sub csp, csp, #0x1000\n"
654 "sub sp, sp, #0x50\n"
655 "and csp, sp, 0xfffffffffffffff0\n"
656 "str r1, [sp, r2 uxtx scaled]\n"
657 "ldr r0, [sp, r2 uxtx scaled]\n"
658 "add sp, sp, #0x50\n"
667 Operand(2 * target::kWordSize));
669 __ LoadImmediate(
R1, 0xffffffff);
679 EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
682 "sub csp, csp, #0x1000\n"
683 "sub csp, csp, #0x10\n"
684 "mov r1, 0xffffffff\n"
685 "strw r1, [sp, #-4]!\n"
687 "ldrsw r1, [sp], #4 !\n"
696 Operand(2 * target::kWordSize));
698 __ LoadImmediate(
R2, 43);
699 __ LoadImmediate(
R3, 42);
709 EXPECT_EQ(1, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
712 "sub csp, csp, #0x1000\n"
713 "sub csp, csp, #0x10\n"
716 "stp r2, r3, [sp, #-16]!\n"
717 "ldp r0, r1, [sp], #16 !\n"
725 __ LoadImmediate(
R2, 43);
726 __ LoadImmediate(
R3, 42);
727 __ sub(
SP,
SP, Operand(4 * target::kWordSize));
728 __ andi(
CSP,
SP, Immediate(~15));
731 __ add(
SP,
SP, Operand(4 * target::kWordSize));
739 EXPECT_EQ(1, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
742 "sub csp, csp, #0x1000\n"
745 "sub sp, sp, #0x20\n"
746 "and csp, sp, 0xfffffffffffffff0\n"
747 "stp r2, r3, [sp, #16]\n"
748 "ldp r0, r1, [sp, #16]\n"
749 "add sp, sp, #0x20\n"
757 __ LoadImmediate(
R2, 0xAABBCCDDEEFF9988);
758 __ LoadImmediate(
R3, 0xBBCCDDEEFF998877);
759 __ sub(
SP,
SP, Operand(4 * target::kWordSize));
760 __ andi(
CSP,
SP, Immediate(~15));
765 __ add(
SP,
SP, Operand(4 * target::kWordSize));
773 EXPECT_EQ(-278523631, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
776 "sub csp, csp, #0x1000\n"
778 "movk r2, #0xeeff lsl 16\n"
779 "movk r2, #0xccdd lsl 32\n"
780 "movk r2, #0xaabb lsl 48\n"
782 "movk r3, #0xff99 lsl 16\n"
783 "movk r3, #0xddee lsl 32\n"
784 "movk r3, #0xbbcc lsl 48\n"
785 "sub sp, sp, #0x20\n"
786 "and csp, sp, 0xfffffffffffffff0\n"
787 "stpw r2, r3, [sp, #8]\n"
788 "ldpw r0, r1, [sp, #8]\n"
789 "add sp, sp, #0x20\n"
797 __ LoadImmediate(
R2, 0xAABBCCDDEEFF9988);
798 __ LoadImmediate(
R3, 0xBBCCDDEEFF998877);
799 __ sub(
SP,
SP, Operand(4 * target::kWordSize));
800 __ andi(
CSP,
SP, Immediate(~15));
805 __ add(
SP,
SP, Operand(4 * target::kWordSize));
813 EXPECT_EQ(-278523631, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
816 "sub csp, csp, #0x1000\n"
818 "movk r2, #0xeeff lsl 16\n"
819 "movk r2, #0xccdd lsl 32\n"
820 "movk r2, #0xaabb lsl 48\n"
822 "movk r3, #0xff99 lsl 16\n"
823 "movk r3, #0xddee lsl 32\n"
824 "movk r3, #0xbbcc lsl 48\n"
825 "sub sp, sp, #0x20\n"
826 "and csp, sp, 0xfffffffffffffff0\n"
827 "stpw r2, r3, [sp, #8]\n"
828 "ldpsw r0, r1, [sp, #8]\n"
829 "add sp, sp, #0x20\n"
837 __ LoadImmediate(
R2, 12);
838 __ LoadImmediate(
R3, 21);
839 __ PushRegisterPair(
R2,
R3);
849 EXPECT_EQ(12, EXECUTE_TEST_CODE_INT64(PushRegisterPair,
test->entry()));
852 "sub csp, csp, #0x1000\n"
855 "stp r2, r3, [sp, #-16]!\n"
856 "ldr r0, [sp], #8 !\n"
857 "ldr r1, [sp], #8 !\n"
864 __ LoadImmediate(
R3, 12);
865 __ LoadImmediate(
R2, 21);
866 __ PushRegisterPair(
R3,
R2);
877 EXECUTE_TEST_CODE_INT64(PushRegisterPairReversed,
test->entry()));
880 "sub csp, csp, #0x1000\n"
883 "stp r3, r2, [sp, #-16]!\n"
884 "ldr r0, [sp], #8 !\n"
885 "ldr r1, [sp], #8 !\n"
892 __ LoadImmediate(
R2, 12);
893 __ LoadImmediate(
R3, 21);
896 __ PopRegisterPair(
R0,
R1);
904 EXPECT_EQ(12, EXECUTE_TEST_CODE_INT64(PopRegisterPair,
test->entry()));
907 "sub csp, csp, #0x1000\n"
910 "str r3, [sp, #-8]!\n"
911 "str r2, [sp, #-8]!\n"
912 "ldp r0, r1, [sp], #16 !\n"
919 __ LoadImmediate(
R3, 12);
920 __ LoadImmediate(
R2, 21);
923 __ PopRegisterPair(
R1,
R0);
932 EXECUTE_TEST_CODE_INT64(PopRegisterPairReversed,
test->entry()));
935 "sub csp, csp, #0x1000\n"
938 "str r3, [sp, #-8]!\n"
939 "str r2, [sp, #-8]!\n"
940 "ldp r1, r0, [sp], #16 !\n"
947 __ LoadDImmediate(
V1, 3.0);
948 __ LoadDImmediate(
V2, 4.0);
949 __ PushDoublePair(
V1,
V2);
950 __ LoadDImmediate(
V1, 0.0);
951 __ LoadDImmediate(
V2, 0.0);
960 EXPECT_EQ(1.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn,
test->entry()));
963 "sub csp, csp, #0x1000\n"
964 "fmovd v1, 3.000000\n"
965 "fmovd v2, 4.000000\n"
966 "fstpd v1, v2, [sp, #-16]!\n"
969 "fldpd v1, v2, [sp], #16 !\n"
977 __ LoadDImmediate(
V1, 3.0);
978 __ LoadDImmediate(
V2, 4.0);
980 __ LoadDImmediate(
V1, 0.0);
981 __ LoadDImmediate(
V2, 0.0);
990 EXPECT_EQ(1.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn,
test->entry()));
993 "sub csp, csp, #0x1000\n"
994 "fmovd v1, 3.000000\n"
995 "fmovd v2, 4.000000\n"
996 "fstpq v1, v2, [sp, #-32]!\n"
999 "fldpq v1, v2, [sp], #32 !\n"
1000 "fsubd v0, v2, v1\n"
1007 __ movz(
R0, Immediate(40), 0);
1008 __ movz(
R1, Immediate(42), 0);
1014 __ cmp(
TMP, Operand(0));
1024 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Semaphore,
test->entry()));
1027 "sub csp, csp, #0x1000\n"
1030 "str r0, [sp, #-8]!\n"
1032 "stxr tmp, r1, sp\n"
1035 "ldr r0, [sp], #8 !\n"
1042 __ movz(
R0, Immediate(40), 0);
1043 __ movz(
R1, Immediate(42), 0);
1056 typedef intptr_t (*FailedSemaphore)()
DART_UNUSED;
1057 EXPECT_EQ(41, EXECUTE_TEST_CODE_INT64(FailedSemaphore,
test->entry()));
1060 "sub csp, csp, #0x1000\n"
1063 "str r0, [sp, #-8]!\n"
1066 "stxr tmp, r1, sp\n"
1067 "ldr r0, [sp], #8 !\n"
1075 __ movz(
R0, Immediate(40), 0);
1079 __ movz(
R0, Immediate(40), 0);
1080 __ movz(
R1, Immediate(42), 0);
1088 __ cmp(
TMP, Operand(0));
1101 EXECUTE_TEST_CODE_INT64(Semaphore32,
test->entry()));
1104 "sub csp, csp, #0x1000\n"
1106 "add r0, r0, r0 lsl #32\n"
1107 "str r0, [sp, #-8]!\n"
1111 "stxrw tmp, r1, sp\n"
1114 "ldr r0, [sp], #8 !\n"
1121 __ movz(
R0, Immediate(40), 0);
1125 __ movz(
R0, Immediate(40), 0);
1126 __ movz(
R1, Immediate(42), 0);
1139 typedef intptr_t (*FailedSemaphore32)()
DART_UNUSED;
1143 EXECUTE_TEST_CODE_INT64(FailedSemaphore32,
test->entry()));
1146 "sub csp, csp, #0x1000\n"
1148 "add r0, r0, r0 lsl #32\n"
1149 "str r0, [sp, #-8]!\n"
1154 "stxrw tmp, r1, sp\n"
1155 "ldr r0, [sp], #8 !\n"
1166 __ LoadImmediate(
R0, 42);
1172 typedef intptr_t (*LoadStoreExclusiveR31)()
DART_UNUSED;
1173 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(LoadStoreExclusiveR31,
test->entry()));
1175 "sub csp, csp, #0x10\n"
1177 "stxr zr, zr, csp\n"
1178 "add csp, csp, #0x10\n"
1185 __ LoadImmediate(
R2, 2);
1191 typedef intptr_t (*AtomicLoadClear)(intptr_t)
DART_UNUSED;
1194 EXECUTE_TEST_CODE_INTPTR_INTPTR(AtomicLoadClear,
test->entry(),
1195 reinterpret_cast<intptr_t
>(&
x)));
1201 "ldclr r2, r0, [r1]\n"
1207 __ LoadImmediate(
R2, 1);
1213 typedef intptr_t (*AtomicLoadSet)(intptr_t)
DART_UNUSED;
1216 EXECUTE_TEST_CODE_INTPTR_INTPTR(AtomicLoadSet,
test->entry(),
1217 reinterpret_cast<intptr_t
>(&
x)));
1223 "ldset r2, r0, [r1]\n"
1236 __ PushImmediate(0x1122334455667788);
1238 __ CompareImmediate(
R1, 0x1122334455667788);
1243 __ PushImmediate(0x1122334455667788);
1245 __ CompareImmediate(
R1, 0x55667788);
1250 __ PushImmediate(0);
1251 __ LoadImmediate(
R1, 0x1122334455667788);
1254 __ CompareImmediate(
R1, 0x1122334455667788);
1258 __ PushImmediate(0);
1259 __ LoadImmediate(
R1, 0x1122334455667788);
1262 __ CompareImmediate(
R1, 0x55667788);
1265 __ LoadImmediate(
R0, 0x42);
1269 __ LoadImmediate(
R0, 0x84);
1278 typedef intptr_t (*LoadAcquireStoreRelease)()
DART_UNUSED;
1280 EXECUTE_TEST_CODE_INT64(LoadAcquireStoreRelease,
test->entry()));
1283 "sub csp, csp, #0x1000\n"
1284 "stp fp, lr, [sp, #-16]!\n"
1286 "movz tmp, #0x7788\n"
1287 "movk tmp, #0x5566 lsl 16\n"
1288 "movk tmp, #0x3344 lsl 32\n"
1289 "movk tmp, #0x1122 lsl 48\n"
1290 "str tmp, [sp, #-8]!\n"
1292 "movz tmp2, #0x7788\n"
1293 "movk tmp2, #0x5566 lsl 16\n"
1294 "movk tmp2, #0x3344 lsl 32\n"
1295 "movk tmp2, #0x1122 lsl 48\n"
1298 "add sp, sp, #0x8\n"
1299 "movz tmp, #0x7788\n"
1300 "movk tmp, #0x5566 lsl 16\n"
1301 "movk tmp, #0x3344 lsl 32\n"
1302 "movk tmp, #0x1122 lsl 48\n"
1303 "str tmp, [sp, #-8]!\n"
1305 "movz tmp2, #0x7788\n"
1306 "movk tmp2, #0x5566 lsl 16\n"
1309 "add sp, sp, #0x8\n"
1311 "str tmp, [sp, #-8]!\n"
1312 "movz r1, #0x7788\n"
1313 "movk r1, #0x5566 lsl 16\n"
1314 "movk r1, #0x3344 lsl 32\n"
1315 "movk r1, #0x1122 lsl 48\n"
1317 "ldr r1, [sp], #8 !\n"
1318 "movz tmp2, #0x7788\n"
1319 "movk tmp2, #0x5566 lsl 16\n"
1320 "movk tmp2, #0x3344 lsl 32\n"
1321 "movk tmp2, #0x1122 lsl 48\n"
1325 "str tmp, [sp, #-8]!\n"
1326 "movz r1, #0x7788\n"
1327 "movk r1, #0x5566 lsl 16\n"
1328 "movk r1, #0x3344 lsl 32\n"
1329 "movk r1, #0x1122 lsl 48\n"
1331 "ldr r1, [sp], #8 !\n"
1332 "movz tmp2, #0x7788\n"
1333 "movk tmp2, #0x5566 lsl 16\n"
1340 "ldp fp, lr, [sp], #16 !\n"
1347 __ movz(
R1, Immediate(43), 0);
1348 __ movz(
R2, Immediate(42), 0);
1355 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
1363constexpr uint64_t kU64MinusOne = 0xffffffffffffffffull;
1364constexpr uint64_t kU64MinInt32 = 0xffffffff80000000ull;
1365constexpr uint64_t kU64MaxInt32 = 0x000000007fffffffull;
1366constexpr uint64_t kU64MinInt64 = 0x8000000000000000ull;
1367constexpr uint64_t kU64MaxInt64 = 0x7fffffffffffffffull;
1369#define FOR_EACH_ASR_64_TEST_CONFIG(M) \
1372 M(kU64MaxInt32, 0, kU64MaxInt32) \
1373 M(kU64MaxInt64, 0, kU64MaxInt64) \
1374 M(kU64MinInt32, 0, kU64MinInt32) \
1375 M(kU64MinInt64, 0, kU64MinInt64) \
1379 M(0xffffull, 1, 0x7fffull) \
1380 M(0xffffffffull, 1, 0x7fffffffull) \
1381 M(kU64MaxInt32, 1, 0x3fffffffull) \
1382 M(kU64MaxInt64, 1, 0x3fffffffffffffffull) \
1383 M(kU64MinInt32, 1, 0xffffffffc0000000ull) \
1384 M(kU64MinInt64, 1, 0xc000000000000000ull) \
1385 M(kU64MinusOne, 1, kU64MinusOne) \
1388 M(0xffffull, 2, 0x3fffull) \
1389 M(0xffffffffull, 2, 0x3fffffffull) \
1390 M(kU64MaxInt32, 2, 0x1fffffffull) \
1391 M(kU64MaxInt64, 2, 0x1fffffffffffffffull) \
1392 M(kU64MinInt32, 2, 0xffffffffe0000000ull) \
1393 M(kU64MinInt64, 2, 0xe000000000000000ull) \
1394 M(kU64MinusOne, 2, kU64MinusOne) \
1398 M(0xffffull, 31, 0ull) \
1399 M(0xffffffffull, 31, 1ull) \
1400 M(kU64MaxInt32, 31, 0ull) \
1401 M(kU64MaxInt64, 31, 0xffffffffull) \
1402 M(kU64MinInt32, 31, kU64MinusOne) \
1403 M(kU64MinInt64, 31, 0xffffffff00000000ull) \
1404 M(kU64MinusOne, 31, kU64MinusOne) \
1408 M(0xffffull, 32, 0ull) \
1409 M(0xffffffffull, 32, 0ull) \
1410 M(kU64MaxInt64, 32, 0x7fffffffull) \
1411 M(kU64MinInt32, 32, kU64MinusOne) \
1412 M(kU64MinInt64, 32, 0xffffffff80000000ull) \
1413 M(kU64MinusOne, 32, kU64MinusOne) \
1417 M(0xffffull, 62, 0ull) \
1418 M(0xffffffffull, 62, 0ull) \
1419 M(kU64MaxInt64, 62, 1ull) \
1420 M(kU64MinInt32, 62, kU64MinusOne) \
1421 M(kU64MinInt64, 62, 0xfffffffffffffffeull) \
1422 M(kU64MinusOne, 62, kU64MinusOne) \
1426 M(0xffffull, 63, 0ull) \
1427 M(0xffffffffull, 63, 0ull) \
1428 M(kU64MaxInt64, 63, 0ull) \
1429 M(kU64MinInt32, 63, kU64MinusOne) \
1430 M(kU64MinInt64, 63, kU64MinusOne) \
1431 M(kU64MinusOne, 63, kU64MinusOne)
1433#define FOR_EACH_LSR_64_TEST_CONFIG(M) \
1436 M(kU64MaxInt32, 0, kU64MaxInt32) \
1437 M(kU64MaxInt64, 0, kU64MaxInt64) \
1438 M(kU64MinInt32, 0, kU64MinInt32) \
1439 M(kU64MinInt64, 0, kU64MinInt64) \
1443 M(0xffffull, 1, 0x7fffull) \
1444 M(0xffffffffull, 1, 0x7fffffffull) \
1445 M(kU64MaxInt32, 1, 0x3fffffffull) \
1446 M(kU64MaxInt64, 1, 0x3fffffffffffffffull) \
1447 M(kU64MinInt32, 1, 0x7fffffffc0000000ull) \
1448 M(kU64MinInt64, 1, 0x4000000000000000ull) \
1449 M(kU64MinusOne, 1, 0x7fffffffffffffffull) \
1452 M(0xffffull, 2, 0x3fffull) \
1453 M(0xffffffffull, 2, 0x3fffffffull) \
1454 M(kU64MaxInt32, 2, 0x1fffffffull) \
1455 M(kU64MaxInt64, 2, 0x1fffffffffffffffull) \
1456 M(kU64MinInt32, 2, 0x3fffffffe0000000ull) \
1457 M(kU64MinInt64, 2, 0x2000000000000000ull) \
1458 M(kU64MinusOne, 2, 0x3fffffffffffffffull) \
1462 M(0xffffull, 31, 0ull) \
1463 M(0xffffffffull, 31, 1ull) \
1464 M(kU64MaxInt32, 31, 0ull) \
1465 M(kU64MaxInt64, 31, 0xffffffffull) \
1466 M(kU64MinInt32, 31, 0x1ffffffffull) \
1467 M(kU64MinInt64, 31, 0x100000000ull) \
1468 M(kU64MinusOne, 31, 0x1ffffffffull) \
1472 M(0xffffull, 32, 0ull) \
1473 M(0xffffffffull, 32, 0ull) \
1474 M(kU64MaxInt64, 32, 0x7fffffffull) \
1475 M(kU64MinInt32, 32, 0xffffffffull) \
1476 M(kU64MinInt64, 32, 0x80000000ull) \
1477 M(kU64MinusOne, 32, 0xffffffffull) \
1481 M(0xffffull, 62, 0ull) \
1482 M(0xffffffffull, 62, 0ull) \
1483 M(kU64MaxInt64, 62, 1ull) \
1484 M(kU64MinInt32, 62, 3ull) \
1485 M(kU64MinInt64, 62, 2ull) \
1486 M(kU64MinusOne, 62, 3ull) \
1490 M(0xffffull, 63, 0ull) \
1491 M(0xffffffffull, 63, 0ull) \
1492 M(kU64MaxInt64, 63, 0ull) \
1493 M(kU64MinInt32, 63, 1ull) \
1494 M(kU64MinInt64, 63, 1ull) \
1495 M(kU64MinusOne, 63, 1ull)
1497#define FOR_EACH_LSL_64_TEST_CONFIG(M) \
1500 M(kU64MaxInt32, 0, kU64MaxInt32) \
1501 M(kU64MaxInt64, 0, kU64MaxInt64) \
1502 M(kU64MinInt32, 0, kU64MinInt32) \
1503 M(kU64MinInt64, 0, kU64MinInt64) \
1507 M(0xffffull, 1, 0x1fffeull) \
1508 M(0xffffffffull, 1, 0x1fffffffeull) \
1509 M(kU64MaxInt32, 1, 0xfffffffeull) \
1510 M(kU64MaxInt64, 1, 0xfffffffffffffffeull) \
1511 M(kU64MinInt32, 1, 0xffffffff00000000ull) \
1512 M(kU64MinInt64, 1, 0ull) \
1513 M(kU64MinusOne, 1, 0xfffffffffffffffeull) \
1516 M(0xffffull, 2, 0x3fffcull) \
1517 M(0xffffffffull, 2, 0x3fffffffcull) \
1518 M(kU64MaxInt32, 2, 0x1fffffffcull) \
1519 M(kU64MaxInt64, 2, 0xfffffffffffffffcull) \
1520 M(kU64MinInt32, 2, 0xfffffffe00000000ull) \
1521 M(kU64MinInt64, 2, 0ull) \
1522 M(kU64MinusOne, 2, 0xfffffffffffffffcull) \
1524 M(1ull, 31, 0x0000000080000000ull) \
1525 M(4ull, 31, 0x0000000200000000ull) \
1526 M(0xffffull, 31, 0x00007fff80000000ull) \
1527 M(0xffffffffull, 31, 0x7fffffff80000000ull) \
1528 M(kU64MaxInt32, 31, 0x3fffffff80000000ull) \
1529 M(kU64MaxInt64, 31, 0xffffffff80000000ull) \
1530 M(kU64MinInt32, 31, 0xc000000000000000ull) \
1531 M(kU64MinInt64, 31, 0ull) \
1532 M(kU64MinusOne, 31, 0xffffffff80000000ull) \
1534 M(1ull, 32, 0x0000000100000000ull) \
1535 M(4ull, 32, 0x0000000400000000ull) \
1536 M(0xffffull, 32, 0x0000ffff00000000ull) \
1537 M(0xffffffffull, 32, 0xffffffff00000000ull) \
1538 M(kU64MaxInt64, 32, 0xffffffff00000000ull) \
1539 M(kU64MinInt32, 32, 0x8000000000000000ull) \
1540 M(kU64MinInt64, 32, 0ull) \
1541 M(kU64MinusOne, 32, 0xffffffff00000000ull) \
1543 M(1ull, 62, 0x4000000000000000ull) \
1545 M(0xffffull, 62, 0xc000000000000000ull) \
1546 M(0xffffffffull, 62, 0xc000000000000000ull) \
1547 M(kU64MaxInt64, 62, 0xc000000000000000ull) \
1548 M(kU64MinInt32, 62, 0ull) \
1549 M(kU64MinInt64, 62, 0ull) \
1550 M(kU64MinusOne, 62, 0xc000000000000000ull) \
1552 M(1ull, 63, 0x8000000000000000ull) \
1554 M(0xffffull, 63, 0x8000000000000000ull) \
1555 M(0xffffffffull, 63, 0x8000000000000000ull) \
1556 M(kU64MaxInt64, 63, 0x8000000000000000ull) \
1557 M(kU64MinInt32, 63, 0ull) \
1558 M(kU64MinInt64, 63, 0ull) \
1559 M(kU64MinusOne, 63, 0x8000000000000000ull)
1561#define SHIFT_64_IMMEDIATE_TEST(macro_op, val, shift, expected) \
1562 ASSEMBLER_TEST_GENERATE(macro_op##_##val##_##shift, assembler) { \
1563 __ LoadImmediate(R1, bit_cast<int64_t>(val)); \
1564 __ macro_op(R0, R1, (shift)); \
1568 ASSEMBLER_TEST_RUN(macro_op##_##val##_##shift, test) { \
1569 typedef int64_t (*Int64Return)() DART_UNUSED; \
1570 EXPECT_EQ((expected), bit_cast<uint64_t>(EXECUTE_TEST_CODE_INT64( \
1571 Int64Return, test->entry()))); \
1574#define ASR_64_IMMEDIATE_TEST(val, shift, expected) \
1575 SHIFT_64_IMMEDIATE_TEST(AsrImmediate, val, shift, expected)
1577#define LSR_64_IMMEDIATE_TEST(val, shift, expected) \
1578 SHIFT_64_IMMEDIATE_TEST(LsrImmediate, val, shift, expected)
1580#define LSL_64_IMMEDIATE_TEST(val, shift, expected) \
1581 SHIFT_64_IMMEDIATE_TEST(LslImmediate, val, shift, expected)
1583FOR_EACH_ASR_64_TEST_CONFIG(ASR_64_IMMEDIATE_TEST)
1584FOR_EACH_LSR_64_TEST_CONFIG(LSR_64_IMMEDIATE_TEST)
1585FOR_EACH_LSL_64_TEST_CONFIG(LSL_64_IMMEDIATE_TEST)
1587#undef LSL_64_IMMEDIATE_TEST
1588#undef LSR_64_IMMEDIATE_TEST
1589#undef ASR_64_IMMEDIATE_TEST
1590#undef SHIFT_64_IMMEDIATE_TEST
1591#undef FOR_EACH_LSL_64_TESTS_LIST
1592#undef FOR_EACH_LSR_64_TESTS_LIST
1593#undef FOR_EACH_ASR_64_TESTS_LIST
1595constexpr uint32_t kU32MinusOne = 0xffffffffu;
1596constexpr uint32_t kU32MinInt32 = 0x80000000u;
1597constexpr uint32_t kU32MaxInt32 = 0x7fffffffu;
1599#define FOR_EACH_ASR_32_TEST_CONFIG(M) \
1602 M(kU32MaxInt32, 0, kU32MaxInt32) \
1603 M(kU32MinInt32, 0, kU32MinInt32) \
1607 M(0xffffu, 1, 0x7fffu) \
1608 M(0xffffffffu, 1, 0xffffffffu) \
1609 M(kU32MaxInt32, 1, 0x3fffffffu) \
1610 M(kU32MinInt32, 1, 0xc0000000u) \
1611 M(kU32MinusOne, 1, 0xffffffffu) \
1614 M(0xffffu, 2, 0x3fffu) \
1615 M(0xffffffffu, 2, 0xffffffffu) \
1616 M(kU32MaxInt32, 2, 0x1fffffffu) \
1617 M(kU32MinInt32, 2, 0xe0000000u) \
1618 M(kU32MinusOne, 2, kU32MinusOne) \
1622 M(0xffffu, 31, 0u) \
1623 M(0xffffffffu, 31, 0xffffffffu) \
1624 M(kU32MaxInt32, 31, 0u) \
1625 M(kU32MinInt32, 31, kU32MinusOne) \
1626 M(kU32MinusOne, 31, kU32MinusOne)
1628#define FOR_EACH_LSR_32_TEST_CONFIG(M) \
1631 M(kU32MaxInt32, 0, kU32MaxInt32) \
1632 M(kU32MinInt32, 0, kU32MinInt32) \
1636 M(0xffffu, 1, 0x7fffu) \
1637 M(0xffffffffu, 1, 0x7fffffffu) \
1638 M(kU32MaxInt32, 1, 0x3fffffffu) \
1639 M(kU32MinInt32, 1, 0x40000000u) \
1640 M(kU32MinusOne, 1, 0x7fffffffu) \
1643 M(0xffffu, 2, 0x3fffu) \
1644 M(0xffffffffu, 2, 0x3fffffffu) \
1645 M(kU32MaxInt32, 2, 0x1fffffffu) \
1646 M(kU32MinInt32, 2, 0x20000000u) \
1647 M(kU32MinusOne, 2, 0x3fffffffu) \
1651 M(0xffffu, 31, 0u) \
1652 M(0xffffffffu, 31, 1u) \
1653 M(kU32MaxInt32, 31, 0u) \
1654 M(kU32MinInt32, 31, 1u) \
1655 M(kU32MinusOne, 31, 1u)
1657#define FOR_EACH_LSL_32_TEST_CONFIG(M) \
1660 M(kU32MaxInt32, 0, kU32MaxInt32) \
1661 M(kU32MinInt32, 0, kU32MinInt32) \
1665 M(0xffffu, 1, 0x1fffeu) \
1666 M(0xffffffffu, 1, 0xfffffffeu) \
1667 M(kU32MaxInt32, 1, 0xfffffffeu) \
1668 M(kU32MinInt32, 1, 0x00000000u) \
1669 M(kU32MinusOne, 1, 0xfffffffeu) \
1672 M(0xffffu, 2, 0x3fffcu) \
1673 M(0xffffffffu, 2, 0xfffffffcu) \
1674 M(kU32MaxInt32, 2, 0xfffffffcu) \
1675 M(kU32MinInt32, 2, 0x00000000u) \
1676 M(kU32MinusOne, 2, 0xfffffffcu) \
1678 M(1u, 31, 0x80000000u) \
1679 M(4u, 31, 0x00000000u) \
1680 M(0xffffu, 31, 0x80000000u) \
1681 M(0xffffffffu, 31, 0x80000000u) \
1682 M(kU32MaxInt32, 31, 0x80000000u) \
1683 M(kU32MinInt32, 31, 0x00000000u) \
1684 M(kU32MinusOne, 31, 0x80000000u)
1686#define SHIFT_32_IMMEDIATE_TEST(macro_op, val, shift, expected) \
1687 ASSEMBLER_TEST_GENERATE(macro_op##a_##val##_##shift, assembler) { \
1688 __ LoadImmediate(R1, bit_cast<int32_t>(val)); \
1689 __ macro_op(R0, R1, (shift), kFourBytes); \
1693 ASSEMBLER_TEST_RUN(macro_op##a_##val##_##shift, test) { \
1694 typedef int32_t (*Int32Return)() DART_UNUSED; \
1695 EXPECT_EQ((expected), bit_cast<uint32_t>((int32_t)EXECUTE_TEST_CODE_INT64( \
1696 Int32Return, test->entry()))); \
1699#define ASR_32_IMMEDIATE_TEST(val, shift, expected) \
1700 SHIFT_32_IMMEDIATE_TEST(AsrImmediate, val, shift, expected)
1702#define LSR_32_IMMEDIATE_TEST(val, shift, expected) \
1703 SHIFT_32_IMMEDIATE_TEST(LsrImmediate, val, shift, expected)
1705#define LSL_32_IMMEDIATE_TEST(val, shift, expected) \
1706 SHIFT_32_IMMEDIATE_TEST(LslImmediate, val, shift, expected)
1708FOR_EACH_ASR_32_TEST_CONFIG(ASR_32_IMMEDIATE_TEST)
1709FOR_EACH_LSR_32_TEST_CONFIG(LSR_32_IMMEDIATE_TEST)
1710FOR_EACH_LSL_32_TEST_CONFIG(LSL_32_IMMEDIATE_TEST)
1712#undef LSL_32_IMMEDIATE_TEST
1713#undef LSR_32_IMMEDIATE_TEST
1714#undef ASR_32_IMMEDIATE_TEST
1715#undef SHIFT_32_IMMEDIATE_TEST
1716#undef FOR_EACH_LSL_32_TESTS_LIST
1717#undef FOR_EACH_LSR_32_TESTS_LIST
1718#undef FOR_EACH_ASR_32_TESTS_LIST
1721 __ LslImmediate(
R0,
R0, 1);
1722 __ LslImmediate(
R0,
R0, 2);
1723 __ LslImmediate(
R0,
R0, 3);
1724 __ LslImmediate(
R0,
R0, 4);
1725 __ LslImmediate(
R0,
R0, 60);
1726 __ LslImmediate(
R0,
R0, 61);
1727 __ LslImmediate(
R0,
R0, 62);
1728 __ LslImmediate(
R0,
R0, 63);
1753 "lslw r0, r0, #28\n"
1754 "lslw r0, r0, #29\n"
1755 "lslw r0, r0, #30\n"
1756 "lslw r0, r0, #31\n");
1760 __ LsrImmediate(
R0,
R0, 1);
1761 __ LsrImmediate(
R0,
R0, 2);
1762 __ LsrImmediate(
R0,
R0, 3);
1763 __ LsrImmediate(
R0,
R0, 4);
1764 __ LsrImmediate(
R0,
R0, 60);
1765 __ LsrImmediate(
R0,
R0, 61);
1766 __ LsrImmediate(
R0,
R0, 62);
1767 __ LsrImmediate(
R0,
R0, 63);
1792 "lsrw r0, r0, #28\n"
1793 "lsrw r0, r0, #29\n"
1794 "lsrw r0, r0, #30\n"
1795 "lsrw r0, r0, #31\n");
1799 __ AsrImmediate(
R0,
R0, 1);
1800 __ AsrImmediate(
R0,
R0, 2);
1801 __ AsrImmediate(
R0,
R0, 3);
1802 __ AsrImmediate(
R0,
R0, 4);
1803 __ AsrImmediate(
R0,
R0, 60);
1804 __ AsrImmediate(
R0,
R0, 61);
1805 __ AsrImmediate(
R0,
R0, 62);
1806 __ AsrImmediate(
R0,
R0, 63);
1831 "asrw r0, r0, #28\n"
1832 "asrw r0, r0, #29\n"
1833 "asrw r0, r0, #30\n"
1834 "asrw r0, r0, #31\n");
1838 __ movz(
R1, Immediate(42), 0);
1839 __ movz(
R2, Immediate(21), 0);
1846 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
1850 "and r0, r1, r2 lsl #1\n"
1855 __ movz(
R1, Immediate(42), 0);
1856 __ movz(
R2, Immediate(5), 0);
1863 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
1872 __ movz(
R1, Immediate(32), 0);
1873 __ movz(
R2, Immediate(10), 0);
1880 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
1889 __ movz(
R1, Immediate(32), 0);
1890 __ movn(
R2, Immediate(0), 0);
1891 __ movk(
R2, Immediate(0xffd5), 0);
1898 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
1902 "movk r2, #0xffd5\n"
1908 __ movz(
R1, Immediate(0xffd5), 0);
1909 __ movz(
R2, Immediate(0xffff), 0);
1916 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
1918 "movz r1, #0xffd5\n"
1919 "movz r2, #0xffff\n"
1925 __ movz(
R1, Immediate(0xffd5), 0);
1926 __ movn(
R2, Immediate(0xffff), 0);
1933 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
1935 "movz r1, #0xffd5\n"
1936 "movn r2, #0xffff\n"
1943 __ movz(
R1, Immediate(42), 0);
1944 __ andi(
R0,
R1, Immediate(0xaaaaaaaaaaaaaaaaULL));
1950 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
1953 "and r0, r1, 0xaaaaaaaaaaaaaaaa\n"
1970 EXPECT_EQ(32, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
1973 "sub tmp2, csp, #0x1f\n"
1974 "and csp, tmp2, 0xfffffffffffffff0\n"
1982 __ movz(
R1, Immediate(43), 0);
1983 __ andi(
R0,
R1, Immediate(1));
1989 EXPECT_EQ(1, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
1997 __ movz(
R1, Immediate(0), 0);
1998 __ movz(
R2, Immediate(0x3f), 0);
1999 __ movz(
R3, Immediate(0xa), 0);
2000 __ orri(
R1,
R1, Immediate(0x0020002000200020ULL));
2008 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
2013 "orr r1, r1, 0x20002000200020\n"
2020 __ movn(
R0, Immediate(0), 0);
2021 __ movk(
R0, Immediate(0xffd5), 0);
2022 __ movz(
R1, Immediate(0x3f), 0);
2023 __ eori(
R0,
R0, Immediate(0x3f3f3f3f3f3f3f3fULL));
2030 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
2033 "movk r0, #0xffd5\n"
2035 "eor r0, r0, 0x3f3f3f3f3f3f3f3f\n"
2044 __ cmp(
R1, Operand(64));
2046 __ LoadImmediate(
R2, 42);
2048 __ cmp(
R2, Operand(58));
2050 __ LoadImmediate(
R0, -1);
2052 __ cmp(
R1, Operand(0));
2056 __ cmp(
R1, Operand(3));
2061 __ LoadImmediate(
R0, 1);
2067 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
2080 "add r0, zr, r0 lsr #3\n"
2094 __ cmp(
R1, Operand(32));
2096 __ LoadImmediate(
R2, 42);
2098 __ cmp(
R2, Operand(26));
2100 __ LoadImmediate(
R0, -1);
2102 __ cmp(
R1, Operand(0));
2106 __ cmp(
R1, Operand(3));
2108 __ LoadImmediate(
R0, 0xFFFFFFFF0FFFFFFF);
2110 __ cmp(
R1, Operand(4));
2112 __ LoadImmediate(
R0, 0xFFFFFFFF);
2114 __ cmp(
R1, Operand(0));
2119 __ LoadImmediate(
R0, 1);
2125 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
2138 "add r0, zr, r0 lsr #35\n"
2142 "mov r0, 0xffffffff0fffffff\n"
2146 "mov r0, 0xffffffff\n"
2157 const int64_t immediate = 0x0000000000000015;
2158 __ LoadImmediate(
R0, immediate);
2165 const int64_t expected = 0xa800000000000000;
2166 EXPECT_EQ(expected, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
2176 __ movz(
R0, Immediate(42), 0);
2178 __ movz(
R0, Immediate(0), 0);
2185 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
2195 __ movz(
R0, Immediate(42), 0);
2198 __ movz(
R0, Immediate(0), 0);
2201 __ movz(
R0, Immediate(0), 0);
2205 __ movz(
R0, Immediate(0), 0);
2211 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
2226 __ movz(
R0, Immediate(42), 0);
2227 __ movz(
R1, Immediate(234), 0);
2228 __ movz(
R2, Immediate(234), 0);
2232 __ movz(
R0, Immediate(0), 0);
2239 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
2253 __ movz(
R0, Immediate(0), 0);
2254 __ movz(
R1, Immediate(233), 0);
2255 __ movz(
R2, Immediate(234), 0);
2259 __ movz(
R0, Immediate(42), 0);
2266 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
2280 __ movz(
R0, Immediate(42), 0);
2281 __ movz(
R1, Immediate(1), 0);
2283 __ cmp(
R1, Operand(1));
2285 __ movz(
R0, Immediate(0), 0);
2292 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
2305 __ movz(
R0, Immediate(42), 0);
2306 __ movn(
R1, Immediate(0), 0);
2308 __ cmn(
R1, Operand(1));
2310 __ movz(
R0, Immediate(0), 0);
2317 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
2330 __ movz(
R0, Immediate(42), 0);
2331 __ movz(
R1, Immediate(233), 0);
2332 __ movz(
R2, Immediate(234), 0);
2336 __ movz(
R0, Immediate(0), 0);
2343 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
2357 __ movz(
R0, Immediate(0), 0);
2358 __ movz(
R1, Immediate(235), 0);
2359 __ movz(
R2, Immediate(234), 0);
2363 __ movz(
R0, Immediate(42), 0);
2370 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
2384 __ movz(
R0, Immediate(42), 0);
2385 __ movz(
R1, Immediate(0), 0);
2388 __ movz(
R0, Immediate(0), 0);
2395 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
2407 __ movz(
R0, Immediate(0), 0);
2408 __ movz(
R1, Immediate(1), 0);
2411 __ movz(
R0, Immediate(42), 0);
2418 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
2430 __ movz(
R0, Immediate(42), 0);
2431 __ movz(
R1, Immediate(1), 0);
2434 __ movz(
R0, Immediate(0), 0);
2441 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
2453 __ movz(
R0, Immediate(0), 0);
2454 __ movz(
R1, Immediate(0), 0);
2457 __ movz(
R0, Immediate(42), 0);
2464 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
2473static constexpr int64_t kBits5And35 = (1 << 5) | (1ll << 35);
2478 __ movz(
R0, Immediate(42), 0);
2479 __ LoadImmediate(
R1, ~kBits5And35);
2482 __ movz(
R0, Immediate(0), 0);
2485 __ tbz(&l2,
R1, 35);
2486 __ movz(
R0, Immediate(0), 0);
2494 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
2497 "movn r1, #0x8 lsl 32\n"
2498 "movk r1, #0xffdf\n"
2509 __ movz(
R0, Immediate(0), 0);
2510 __ LoadImmediate(
R1, kBits5And35);
2513 __ movz(
R0, Immediate(42), 0);
2520 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
2524 "movk r1, #0x8 lsl 32\n"
2533 __ movz(
R0, Immediate(42), 0);
2534 __ LoadImmediate(
R1, kBits5And35);
2537 __ movz(
R0, Immediate(0), 0);
2540 __ tbnz(&l2,
R1, 35);
2541 __ movz(
R0, Immediate(0), 0);
2549 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
2553 "movk r1, #0x8 lsl 32\n"
2554 "tbnzw r1, #5, +8\n"
2556 "tbnz r1, #35, +8\n"
2564 __ movz(
R0, Immediate(0), 0);
2565 __ LoadImmediate(
R1, ~kBits5And35);
2568 __ movz(
R0, Immediate(42), 0);
2575 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
2578 "movn r1, #0x8 lsl 32\n"
2579 "movk r1, #0xffdf\n"
2580 "tbnzw r1, #5, +8\n"
2588 __ movz(
R0, Immediate(42), 0);
2589 __ LoadImmediate(
R1, ~kBits5And35);
2593 const intptr_t kRange = 1 << 14;
2594 for (intptr_t i = 0; i < kRange; i++) {
2598 __ movz(
R0, Immediate(0), 0);
2605 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
2611 __ movz(
R0, Immediate(42), 0);
2612 __ LoadImmediate(
R1, kBits5And35);
2616 const intptr_t kRange = 1 << 14;
2617 for (intptr_t i = 0; i < kRange; i++) {
2621 __ movz(
R0, Immediate(0), 0);
2628 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
2634 __ LoadDImmediate(
V0, 42.0);
2635 __ LoadDImmediate(
V1, 234.0);
2636 __ LoadDImmediate(
V2, 234.0);
2640 __ LoadDImmediate(
V0, 0.0);
2647 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn,
test->entry()));
2649 "movz tmp, #0x4045 lsl 48\n"
2651 "movz tmp, #0x4000 lsl 32\n"
2652 "movk tmp, #0x406d lsl 48\n"
2654 "movz tmp, #0x4000 lsl 32\n"
2655 "movk tmp, #0x406d lsl 48\n"
2666 __ LoadImmediate(
R0, 41);
2668 __ Stop(
"Hammertime");
2670 for (
int i = 0; i < 0x10000; i++) {
2671 __ add(
R0,
R0, Operand(1));
2672 __ sub(
R0,
R0, Operand(1));
2675 __ AddImmediate(
R0,
R0, -1);
2678 __ AddImmediate(
R0,
R0, 1);
2684 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
2690 for (
int i = 0; i < 0x10000; i++) {
2691 __ add(
R0,
R0, Operand(1));
2692 __ sub(
R0,
R0, Operand(1));
2695 __ LoadImmediate(
R0, 41);
2697 __ Stop(
"Hammertime");
2699 __ AddImmediate(
R0,
R0, -1);
2702 __ AddImmediate(
R0,
R0, 1);
2708 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
2713 __ LoadImmediate(
R0, 41);
2716 __ AddImmediate(
R0,
R0, -1);
2719 __ AddImmediate(
R0,
R0, 1);
2722 for (
int i = 0; i < 0x10000; i++) {
2723 __ add(
R0,
R0, Operand(1));
2724 __ sub(
R0,
R0, Operand(1));
2728 __ tbnz(&l2,
R0, 5);
2729 __ Stop(
"Hammertime");
2734 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
2740 __ LoadDImmediate(
V0, 0.0);
2741 __ LoadDImmediate(
V1, 233.0);
2742 __ LoadDImmediate(
V2, 234.0);
2746 __ LoadDImmediate(
V0, 42.0);
2753 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn,
test->entry()));
2756 "movz tmp, #0x2000 lsl 32\n"
2757 "movk tmp, #0x406d lsl 48\n"
2759 "movz tmp, #0x4000 lsl 32\n"
2760 "movk tmp, #0x406d lsl 48\n"
2764 "movz tmp, #0x4045 lsl 48\n"
2772 __ LoadDImmediate(
V0, 42.0);
2773 __ LoadDImmediate(
V1, 233.0);
2774 __ LoadDImmediate(
V2, 234.0);
2778 __ LoadDImmediate(
V0, 0.0);
2785 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn,
test->entry()));
2791 __ LoadDImmediate(
V0, 0.0);
2792 __ LoadDImmediate(
V1, 235.0);
2793 __ LoadDImmediate(
V2, 234.0);
2797 __ LoadDImmediate(
V0, 42.0);
2804 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn,
test->entry()));
2807 "movz tmp, #0x6000 lsl 32\n"
2808 "movk tmp, #0x406d lsl 48\n"
2810 "movz tmp, #0x4000 lsl 32\n"
2811 "movk tmp, #0x406d lsl 48\n"
2815 "movz tmp, #0x4045 lsl 48\n"
2823 __ LoadDImmediate(
V0, 235.0);
2824 __ LoadDImmediate(
V1, 233.0);
2828 __ LoadDImmediate(
V0, 0.0);
2831 __ LoadDImmediate(
V0, 42.0);
2837 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn,
test->entry()));
2839 "movz tmp, #0x6000 lsl 32\n"
2840 "movk tmp, #0x406d lsl 48\n"
2842 "movz tmp, #0x2000 lsl 32\n"
2843 "movk tmp, #0x406d lsl 48\n"
2849 "movz tmp, #0x4045 lsl 48\n"
2857 __ movz(
R0, Immediate(42), 0);
2858 __ movz(
R1, Immediate(2), 0);
2859 __ movz(
R2, Immediate(1), 0);
2863 __ movz(
R0, Immediate(0), 0);
2870 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
2884 __ movz(
R0, Immediate(0), 0);
2885 __ movz(
R1, Immediate(2), 0);
2886 __ movz(
R2, Immediate(2), 0);
2890 __ movz(
R0, Immediate(42), 0);
2897 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
2911 __ movz(
R0, Immediate(42), 0);
2912 __ movz(
R1, Immediate(2), 0);
2913 __ movz(
R2, Immediate(2), 0);
2917 __ movz(
R0, Immediate(0), 0);
2924 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
2938 __ movz(
R0, Immediate(0), 0);
2939 __ movz(
R1, Immediate(2), 0);
2940 __ movz(
R2, Immediate(1), 0);
2944 __ movz(
R0, Immediate(42), 0);
2951 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
2965 __ movz(
R0, Immediate(42), 0);
2966 __ movz(
R1, Immediate(2), 0);
2968 __ andis(
R3,
R1, Immediate(1));
2970 __ movz(
R0, Immediate(0), 0);
2977 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
2981 "ands r3, r1, 0x1\n"
2990 __ movz(
R0, Immediate(0), 0);
2991 __ movz(
R1, Immediate(2), 0);
2993 __ andis(
R3,
R1, Immediate(2));
2995 __ movz(
R0, Immediate(42), 0);
3002 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
3006 "ands r3, r1, 0x2\n"
3014 __ movz(
R0, Immediate(123), 0);
3021 __ movz(
R0, Immediate(42), 0);
3027 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
3031 __ movz(
R0, Immediate(123), 0);
3032 SPILLS_RETURN_ADDRESS_FROM_LR_TO_REGISTER(
3037 RESTORES_RETURN_ADDRESS_FROM_REGISTER_TO_LR(
__ add(
LR,
ZR, Operand(
R3)));
3041 __ movz(
R0, Immediate(42), 0);
3047 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
3052 __ movz(
R0, Immediate(27), 0);
3053 __ movz(
R1, Immediate(9), 0);
3062 EXPECT_EQ(3, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
3072 __ movz(
R0, Immediate(27), 0);
3073 __ movz(
R1, Immediate(9), 0);
3083 EXPECT_EQ(-3, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
3094 __ movz(
R0, Immediate(27), 0);
3095 __ movz(
R1, Immediate(0), 0);
3104 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
3114 __ movz(
R0, Immediate(27), 0);
3115 __ movz(
R1, Immediate(0), 0);
3124 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
3134 __ movz(
R0, Immediate(0x8000), 3);
3135 __ movn(
R1, Immediate(0), 0);
3144 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
3146 "movz r0, #0x8000 lsl 48\n"
3154 __ movz(
R3, Immediate(0x8000), 3);
3155 __ movn(
R1, Immediate(0), 0);
3164 EXPECT_EQ(
static_cast<int64_t
>(0x8000000000000000),
3165 EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
3167 "movz r3, #0x8000 lsl 48\n"
3175 __ movz(
R1, Immediate(21), 0);
3176 __ movz(
R2, Immediate(1), 0);
3183 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
3192 __ movz(
R1, Immediate(84), 0);
3193 __ movz(
R2, Immediate(1), 0);
3200 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
3209 __ movz(
R1, Immediate(1), 0);
3210 __ movz(
R2, Immediate(63), 0);
3218 EXPECT_EQ(1, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
3228 __ movz(
R1, Immediate(1), 0);
3229 __ movz(
R2, Immediate(63), 0);
3237 EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
3247 __ movz(
R1, Immediate(6), 0);
3248 __ movz(
R2, Immediate(7), 0);
3255 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
3264 __ movz(
R1, Immediate(6), 0);
3265 __ movz(
R2, Immediate(7), 0);
3273 EXPECT_EQ(-42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
3283 __ movz(
R1, Immediate(6), 0);
3284 __ movz(
R2, Immediate(7), 0);
3291 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
3295 "smulh r0, r1, r2\n"
3300 __ movz(
R1, Immediate(6), 0);
3301 __ movz(
R2, Immediate(7), 0);
3309 EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
3314 "smulh r0, r1, r2\n"
3319 __ movz(
R1, Immediate(-1), 3);
3320 __ movz(
R2, Immediate(7), 3);
3327 EXPECT_EQ(
static_cast<int64_t
>(0x6fff900000000),
3328 EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
3330 "movz r1, #0xffff lsl 48\n"
3331 "movz r2, #0x7 lsl 48\n"
3332 "umulh r0, r1, r2\n"
3337 __ movn(
R1, Immediate(0), 0);
3338 __ movz(
R2, Immediate(7), 0);
3339 __ movz(
R3, Immediate(8), 0);
3346 EXPECT_EQ(0x700000001, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
3351 "umaddl r0, r1, r2, r3\n"
3356 __ movn(
R1, Immediate(1), 0);
3357 __ movz(
R2, Immediate(7), 0);
3358 __ movz(
R3, Immediate(20), 0);
3365 EXPECT_EQ(6, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
3370 "smaddl r0, r1, r2, r3\n"
3375 __ movn(
R1, Immediate(1), 0);
3376 __ movn(
R2, Immediate(0), 0);
3383 EXPECT_EQ(2, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
3387 "smull r0, r1, r2\n"
3392 __ movz(
R1, Immediate(0xffff), 0);
3393 __ movz(
R2, Immediate(0xffff), 0);
3400 EXPECT_EQ(0xfffe0001, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
3402 "movz r1, #0xffff\n"
3403 "movz r2, #0xffff\n"
3404 "smull r0, r1, r2\n"
3410 __ movz(
R1, Immediate(0xffff), 0);
3411 __ AddImmediate(
R1, 4);
3412 __ movz(
R2, Immediate(0x7fff), 0);
3414 __ AsrImmediate(
R3,
R0, 31);
3416 __ b(&return_ltuae,
NE);
3418 __ Bind(&return_ltuae);
3419 __ movz(
R0, Immediate(42), 0);
3425 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
3427 "movz r1, #0xffff\n"
3428 "add r1, r1, #0x4\n"
3429 "movz r2, #0x7fff\n"
3430 "smull r0, r1, r2\n"
3432 "cmp r3, r0 asr #63\n"
3441 __ movz(
R1, Immediate(0xffff), 0);
3442 __ movn(
R2, Immediate(0xffff), 0);
3443 __ AddImmediate(
R2, -3);
3445 __ AsrImmediate(
R3,
R0, 31);
3447 __ b(&return_ltuae,
NE);
3449 __ Bind(&return_ltuae);
3450 __ movz(
R0, Immediate(42), 0);
3456 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
3458 "movz r1, #0xffff\n"
3459 "movn r2, #0xffff\n"
3460 "sub r2, r2, #0x3\n"
3461 "smull r0, r1, r2\n"
3463 "cmp r3, r0 asr #63\n"
3472 __ LoadImmediate(
R1, 0x01007fff);
3473 __ LoadImmediate(
R2, 0x01007fff);
3475 __ AsrImmediate(
R3,
R0, 31);
3477 __ b(&return_ltuae,
NE);
3479 __ Bind(&return_ltuae);
3480 __ movz(
R0, Immediate(42), 0);
3486 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
3488 "movz r1, #0x7fff\n"
3489 "movk r1, #0x100 lsl 16\n"
3490 "movz r2, #0x7fff\n"
3491 "movk r2, #0x100 lsl 16\n"
3492 "smull r0, r1, r2\n"
3494 "cmp r3, r0 asr #63\n"
3503 __ LoadImmediate(
R1, 0x7fffffff);
3506 __ b(&return_ltuae,
VS);
3508 __ Bind(&return_ltuae);
3509 __ movz(
R0, Immediate(42), 0);
3515 EXPECT_EQ(-0x7fffffff, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
3517 "mov r1, 0x7fffffff\n"
3528 __ LoadImmediate(
R1, 0x7123);
3531 __ b(&return_ltuae,
VS);
3533 __ Bind(&return_ltuae);
3534 __ movz(
R0, Immediate(42), 0);
3540 EXPECT_EQ(-0x7123, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
3542 "movz r1, #0x7123\n"
3553 __ LoadImmediate(
R1, -0x80000000ll);
3556 __ b(&return_ltuae,
VS);
3558 __ Bind(&return_ltuae);
3559 __ movz(
R0, Immediate(42), 0);
3565 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
3567 "mov r1, 0xffffffff80000000\n"
3578 __ LoadImmediate(
R0, 42);
3584 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
3591 __ LoadImmediate(
R0, 0xf1234123);
3597 EXPECT_EQ(0xf1234123, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
3599 "movz r0, #0x4123\n"
3600 "movk r0, #0xf123 lsl 16\n"
3605 __ LoadImmediate(
R0, 0x4321f1234123);
3611 EXPECT_EQ(0x4321f1234123,
3612 EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
3614 "movz r0, #0x4123\n"
3615 "movk r0, #0xf123 lsl 16\n"
3616 "movk r0, #0x4321 lsl 32\n"
3621 __ LoadImmediate(
R0, 0x9287436598237465);
3627 EXPECT_EQ(
static_cast<int64_t
>(0x9287436598237465),
3628 EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
3630 "movz r0, #0x7465\n"
3631 "movk r0, #0x9823 lsl 16\n"
3632 "movk r0, #0x4365 lsl 32\n"
3633 "movk r0, #0x9287 lsl 48\n"
3638 __ LoadImmediate(
R0, -42);
3644 EXPECT_EQ(-42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
3651 __ LoadImmediate(
R0, -0x1212341234);
3657 EXPECT_EQ(-0x1212341234, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
3659 "movn r0, #0x12 lsl 32\n"
3660 "movk r0, #0xedcb lsl 16\n"
3661 "movk r0, #0xedcc\n"
3666 __ LoadImmediate(
R0, -0x1212340000);
3672 EXPECT_EQ(-0x1212340000, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
3674 "movn r0, #0x12 lsl 32\n"
3675 "movk r0, #0xedcc lsl 16\n"
3681 __ LoadImmediate(
R0, -0x1200001234);
3687 EXPECT_EQ(-0x1200001234, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
3689 "movn r0, #0x12 lsl 32\n"
3690 "movk r0, #0xedcc\n"
3695 __ LoadImmediate(
R0, -0x12341234);
3701 EXPECT_EQ(-0x12341234, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
3703 "movn r0, #0x1234 lsl 16\n"
3704 "movk r0, #0xedcc\n"
3716 typedef intptr_t (*LoadHalfWordUnaligned)(intptr_t)
DART_UNUSED;
3725 static_cast<int16_t
>(
static_cast<uint16_t
>(0xAB89)),
3726 EXECUTE_TEST_CODE_INTPTR_INTPTR(LoadHalfWordUnaligned,
test->entry(),
3727 reinterpret_cast<intptr_t
>(&
buffer[0])));
3729 static_cast<int16_t
>(
static_cast<uint16_t
>(0xCDAB)),
3730 EXECUTE_TEST_CODE_INTPTR_INTPTR(LoadHalfWordUnaligned,
test->entry(),
3731 reinterpret_cast<intptr_t
>(&
buffer[1])));
3746 typedef intptr_t (*LoadHalfWordUnsignedUnaligned)(intptr_t)
DART_UNUSED;
3754 EXPECT_EQ(0xAB89, EXECUTE_TEST_CODE_INTPTR_INTPTR(
3755 LoadHalfWordUnsignedUnaligned,
test->entry(),
3756 reinterpret_cast<intptr_t
>(&
buffer[0])));
3757 EXPECT_EQ(0xCDAB, EXECUTE_TEST_CODE_INTPTR_INTPTR(
3758 LoadHalfWordUnsignedUnaligned,
test->entry(),
3759 reinterpret_cast<intptr_t
>(&
buffer[1])));
3767 __ LoadImmediate(
R1, 0xABCD);
3775 typedef intptr_t (*StoreHalfWordUnaligned)(intptr_t)
DART_UNUSED;
3783 EXPECT_EQ(0xABCD, EXECUTE_TEST_CODE_INTPTR_INTPTR(
3784 StoreHalfWordUnaligned,
test->entry(),
3785 reinterpret_cast<intptr_t
>(&
buffer[0])));
3786 EXPECT_EQ(0xCD,
buffer[0]);
3787 EXPECT_EQ(0xAB,
buffer[1]);
3790 EXPECT_EQ(0xABCD, EXECUTE_TEST_CODE_INTPTR_INTPTR(
3791 StoreHalfWordUnaligned,
test->entry(),
3792 reinterpret_cast<intptr_t
>(&
buffer[1])));
3793 EXPECT_EQ(0xCD,
buffer[1]);
3794 EXPECT_EQ(0xAB,
buffer[2]);
3797 "movz r1, #0xabcd\n"
3811 typedef int32_t (*LoadWordUnaligned)(intptr_t)
DART_UNUSED;
3812 uint8_t
buffer[8] = {0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xF0};
3815 static_cast<int32_t
>(0x78563412),
3816 EXECUTE_TEST_CODE_INT32_INTPTR(LoadWordUnaligned,
test->entry(),
3817 reinterpret_cast<intptr_t
>(&
buffer[0])));
3819 static_cast<int32_t
>(0x9A785634),
3820 EXECUTE_TEST_CODE_INT32_INTPTR(LoadWordUnaligned,
test->entry(),
3821 reinterpret_cast<intptr_t
>(&
buffer[1])));
3823 static_cast<int32_t
>(0xBC9A7856),
3824 EXECUTE_TEST_CODE_INT32_INTPTR(LoadWordUnaligned,
test->entry(),
3825 reinterpret_cast<intptr_t
>(&
buffer[2])));
3827 static_cast<int32_t
>(0xDEBC9A78),
3828 EXECUTE_TEST_CODE_INT32_INTPTR(LoadWordUnaligned,
test->entry(),
3829 reinterpret_cast<intptr_t
>(&
buffer[3])));
3837 __ LoadImmediate(
R1, 0x12345678);
3845 typedef intptr_t (*StoreWordUnaligned)(intptr_t)
DART_UNUSED;
3846 uint8_t
buffer[8] = {0, 0, 0, 0, 0, 0, 0, 0};
3848 EXPECT_EQ(0x12345678, EXECUTE_TEST_CODE_INTPTR_INTPTR(
3849 StoreWordUnaligned,
test->entry(),
3850 reinterpret_cast<intptr_t
>(&
buffer[0])));
3851 EXPECT_EQ(0x78,
buffer[0]);
3852 EXPECT_EQ(0x56,
buffer[1]);
3853 EXPECT_EQ(0x34,
buffer[2]);
3854 EXPECT_EQ(0x12,
buffer[3]);
3856 EXPECT_EQ(0x12345678, EXECUTE_TEST_CODE_INTPTR_INTPTR(
3857 StoreWordUnaligned,
test->entry(),
3858 reinterpret_cast<intptr_t
>(&
buffer[1])));
3859 EXPECT_EQ(0x78,
buffer[1]);
3860 EXPECT_EQ(0x56,
buffer[2]);
3861 EXPECT_EQ(0x34,
buffer[3]);
3862 EXPECT_EQ(0x12,
buffer[4]);
3864 EXPECT_EQ(0x12345678, EXECUTE_TEST_CODE_INTPTR_INTPTR(
3865 StoreWordUnaligned,
test->entry(),
3866 reinterpret_cast<intptr_t
>(&
buffer[2])));
3867 EXPECT_EQ(0x78,
buffer[2]);
3868 EXPECT_EQ(0x56,
buffer[3]);
3869 EXPECT_EQ(0x34,
buffer[4]);
3870 EXPECT_EQ(0x12,
buffer[5]);
3872 EXPECT_EQ(0x12345678, EXECUTE_TEST_CODE_INTPTR_INTPTR(
3873 StoreWordUnaligned,
test->entry(),
3874 reinterpret_cast<intptr_t
>(&
buffer[3])));
3875 EXPECT_EQ(0x78,
buffer[3]);
3876 EXPECT_EQ(0x56,
buffer[4]);
3877 EXPECT_EQ(0x34,
buffer[5]);
3878 EXPECT_EQ(0x12,
buffer[6]);
3881 "movz r1, #0x5678\n"
3882 "movk r1, #0x1234 lsl 16\n"
3898 __ RestorePinnedRegisters();
3899 __ LoadPoolPointer(
PP);
3915 __ LoadImmediate(
R0, 42);
3921 EXPECT_EQ(42,
test->InvokeWithCodeAndThread<int64_t>());
3926 __ LoadImmediate(
R0, 0xf1234123);
3932 EXPECT_EQ(0xf1234123,
test->InvokeWithCodeAndThread<int64_t>());
3937 __ LoadImmediate(
R0, 0x4321f1234124);
3943 EXPECT_EQ(0x4321f1234124,
test->InvokeWithCodeAndThread<int64_t>());
3948 __ LoadImmediate(
R0, 0x9287436598237465);
3954 EXPECT_EQ(
static_cast<int64_t
>(0x9287436598237465),
3955 test->InvokeWithCodeAndThread<int64_t>());
3961 __ LoadObject(
R0, Object::null_object());
3968 test->InvokeWithCodeAndThread<
uword>());
3974 __ PushObject(Object::null_object());
3982 test->InvokeWithCodeAndThread<
uword>());
3988 __ LoadObject(
R0, Object::bool_true());
3989 __ LoadObject(
R1, Object::bool_false());
3990 __ ldr(
R2, Address(
THR, Thread::object_null_offset()));
3991 __ CompareObject(
R2, Object::null_object());
3999 test->InvokeWithCodeAndThread<
uword>());
4011 test->InvokeWithCodeAndThread<
uword>());
4023 test->InvokeWithCodeAndThread<
uword>());
4027 __ LoadImmediate(
R1, 42);
4028 __ LoadImmediate(
R2, 1234);
4029 __ CompareRegisters(
R1,
R2);
4036 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
4041 "csel r0, r1, r2, lt\n"
4046 __ LoadImmediate(
R1, 42);
4047 __ LoadImmediate(
R2, 1234);
4048 __ CompareRegisters(
R1,
R2);
4055 EXPECT_EQ(1234, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
4060 "csel r0, r1, r2, ge\n"
4065 __ LoadImmediate(
R1, 42);
4066 __ LoadImmediate(
R2, 1234);
4067 __ CompareRegisters(
R1,
R2);
4074 EXPECT_EQ(43, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
4078 __ LoadImmediate(
R1, 42);
4079 __ LoadImmediate(
R2, 1234);
4080 __ CompareRegisters(
R1,
R2);
4087 EXPECT_EQ(1234, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
4097 __ LoadImmediate(
R1, 42);
4098 __ LoadImmediate(
R2, 1234);
4099 __ CompareRegisters(
R1,
R2);
4106 EXPECT_EQ(~42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
4111 "csinv r0, r2, r1, ge\n"
4116 __ LoadImmediate(
R1, 42);
4117 __ LoadImmediate(
R2, 1234);
4118 __ CompareRegisters(
R1,
R2);
4125 EXPECT_EQ(1234, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
4130 "csinv r0, r2, r1, lt\n"
4135 __ LoadImmediate(
R1, 42);
4136 __ LoadImmediate(
R2, 1234);
4137 __ CompareRegisters(
R1,
R2);
4144 EXPECT_EQ(-42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
4149 "csneg r0, r2, r1, ge\n"
4154 __ LoadImmediate(
R1, 42);
4155 __ LoadImmediate(
R2, 1234);
4156 __ CompareRegisters(
R1,
R2);
4163 EXPECT_EQ(1234, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
4168 "csneg r0, r2, r1, lt\n"
4173 __ LoadImmediate(
R1, 0x819);
4174 __ LoadImmediate(
R0, 0x5a5a5a5a);
4181 EXPECT_EQ(0x81, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
4184 "movz r0, #0x5a5a\n"
4185 "movk r0, #0x5a5a lsl 16\n"
4186 "ubfm r0, r1, #4, #11\n"
4191 __ LoadImmediate(
R1, 0x819);
4192 __ LoadImmediate(
R0, 0x5a5a5a5a);
4199 EXPECT_EQ(-0x7f, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
4202 "movz r0, #0x5a5a\n"
4203 "movk r0, #0x5a5a lsl 16\n"
4204 "sbfm r0, r1, #4, #11\n"
4209 __ LoadImmediate(
R1, 0x819);
4210 __ LoadImmediate(
R0, 0x5a5a5a5a);
4217 EXPECT_EQ(0x5a5b9a5a, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
4220 "movz r0, #0x5a5a\n"
4221 "movk r0, #0x5a5a lsl 16\n"
4222 "bfm r0, r1, #52, #4\n"
4227 __ LoadImmediate(
R1, 0xff1248ff);
4228 __ LoadImmediate(
R0, 0x5a5a5a5a);
4236 EXPECT_EQ(0x7e2491fe, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
4238 "movz r1, #0x48ff\n"
4239 "movk r1, #0xff12 lsl 16\n"
4240 "movz r0, #0x5a5a\n"
4241 "movk r0, #0x5a5a lsl 16\n"
4242 "ubfm r0, r1, #63, #29\n"
4247 __ LoadImmediate(
R1, 0x819);
4248 __ LoadImmediate(
R0, 0x5a5a5a5a);
4255 EXPECT_EQ(0x5a5a5a81, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
4258 "movz r0, #0x5a5a\n"
4259 "movk r0, #0x5a5a lsl 16\n"
4260 "bfm r0, r1, #4, #11\n"
4265 __ LoadImmediate(
R1, 0x819);
4266 __ LoadImmediate(
R0, 0x5a5a5a5a);
4273 EXPECT_EQ(-0x7e70, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
4276 "movz r0, #0x5a5a\n"
4277 "movk r0, #0x5a5a lsl 16\n"
4278 "sbfm r0, r1, #60, #11\n"
4283 __ LoadImmediate(
R1, 0xff);
4284 __ LoadImmediate(
R0, 0x5a5a5a5a);
4286 __ LoadImmediate(
R2, 0x2a);
4287 __ LoadImmediate(
R1, 0x5a5a5a5a);
4295 EXPECT_EQ(0x29, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
4298 "movz r0, #0x5a5a\n"
4299 "movk r0, #0x5a5a lsl 16\n"
4302 "movz r1, #0x5a5a\n"
4303 "movk r1, #0x5a5a lsl 16\n"
4310 __ LoadImmediate(
R1, 0xffff);
4311 __ LoadImmediate(
R0, 0x5a5a5a5a);
4313 __ LoadImmediate(
R2, 0x1002a);
4314 __ LoadImmediate(
R1, 0x5a5a5a5a);
4322 EXPECT_EQ(0x29, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
4325 "movz r0, #0x5a5a\n"
4326 "movk r0, #0x5a5a lsl 16\n"
4329 "movk r2, #0x1 lsl 16\n"
4330 "movz r1, #0x5a5a\n"
4331 "movk r1, #0x5a5a lsl 16\n"
4338 __ LoadImmediate(
R1, 0xffffffffll);
4339 __ LoadImmediate(
R0, 0x5a5a5a5a);
4341 __ LoadImmediate(
R2, 0x10000002all);
4342 __ LoadImmediate(
R1, 0x5a5a5a5a);
4350 EXPECT_EQ(0x29, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
4352 "mov r1, 0xffffffff\n"
4353 "movz r0, #0x5a5a\n"
4354 "movk r0, #0x5a5a lsl 16\n"
4357 "movk r2, #0x1 lsl 32\n"
4358 "movz r1, #0x5a5a\n"
4359 "movk r1, #0x5a5a lsl 16\n"
4366 __ LoadImmediate(
R1, 0xffffffffll);
4367 __ LoadImmediate(
R0, 0x5a5a5a5a);
4369 __ LoadImmediate(
R2, 0x10000002all);
4370 __ LoadImmediate(
R1, 0x5a5a5a5a);
4378 EXPECT_EQ(0xffffffffll + 42,
4379 EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
4381 "mov r1, 0xffffffff\n"
4382 "movz r0, #0x5a5a\n"
4383 "movk r0, #0x5a5a lsl 16\n"
4384 "ubfm r0, r1, #0, #31\n"
4386 "movk r2, #0x1 lsl 32\n"
4387 "movz r1, #0x5a5a\n"
4388 "movk r1, #0x5a5a lsl 16\n"
4389 "ubfm r1, r2, #0, #31\n"
4395 __ LoadImmediate(
R1, -1);
4396 __ LoadImmediate(
R0, 0x5a5a5a5a);
4398 __ LoadImmediate(
R2, 0x12a);
4399 __ LoadImmediate(
R1, 0x5a5a5a5a);
4407 EXPECT_EQ(0xff + 0x2a, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
4410 "movz r0, #0x5a5a\n"
4411 "movk r0, #0x5a5a lsl 16\n"
4414 "movz r1, #0x5a5a\n"
4415 "movk r1, #0x5a5a lsl 16\n"
4422 __ LoadImmediate(
R1, -1);
4423 __ LoadImmediate(
R0, 0x5a5a5a5a);
4425 __ LoadImmediate(
R2, 0x1002a);
4426 __ LoadImmediate(
R1, 0x5a5a5a5a);
4434 EXPECT_EQ(0xffff + 0x2a, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
4437 "movz r0, #0x5a5a\n"
4438 "movk r0, #0x5a5a lsl 16\n"
4441 "movk r2, #0x1 lsl 16\n"
4442 "movz r1, #0x5a5a\n"
4443 "movk r1, #0x5a5a lsl 16\n"
4451 __ LoadDImmediate(
V0, 1.0);
4457 EXPECT_EQ(1.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn,
test->entry()));
4459 "fmovd v0, 1.000000\n"
4464 __ LoadDImmediate(
V0, 123412983.1324524315);
4470 EXPECT_FLOAT_EQ(123412983.1324524315,
4471 EXECUTE_TEST_CODE_DOUBLE(DoubleReturn,
test->entry()),
4474 "movz tmp, #0xa19c\n"
4475 "movk tmp, #0xdc87 lsl 16\n"
4476 "movk tmp, #0x6c87 lsl 32\n"
4477 "movk tmp, #0x419d lsl 48\n"
4483 __ LoadDImmediate(
V1, 1.0);
4490 const int64_t one = bit_cast<int64_t, double>(1.0);
4491 EXPECT_EQ(one, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
4493 "fmovd v1, 1.000000\n"
4499 __ LoadDImmediate(
V1, 1.0);
4507 EXPECT_EQ(1.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn,
test->entry()));
4509 "fmovd v1, 1.000000\n"
4516 __ LoadDImmediate(
V2, 1.0);
4524 int64_t
result = EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry());
4525 const uint32_t one = bit_cast<uint32_t, float>(1.0f);
4526 EXPECT_EQ(one,
static_cast<uint32_t
>(
result));
4528 "fmovd v2, 1.000000\n"
4535 __ LoadImmediate(
R2, bit_cast<uint32_t, float>(1.0f));
4543 int64_t
result = EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry());
4544 const uint32_t one = bit_cast<uint32_t, float>(1.0f);
4545 EXPECT_EQ(one,
static_cast<uint32_t
>(
result));
4547 "mov r2, 0x3f800000\n"
4557 Operand(2 * target::kWordSize));
4559 __ LoadDImmediate(
V1, 42.0);
4568 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn,
test->entry()));
4571 "sub csp, csp, #0x1000\n"
4572 "sub csp, csp, #0x10\n"
4573 "movz tmp, #0x4045 lsl 48\n"
4575 "fstrd v1, [sp, #-8]!\n"
4576 "fldrd v0, [sp], #8 !\n"
4585 Operand(2 * target::kWordSize));
4587 __ LoadDImmediate(
V1, 42.0);
4598 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn,
test->entry()));
4601 "sub csp, csp, #0x1000\n"
4602 "sub csp, csp, #0x10\n"
4603 "movz tmp, #0x4045 lsl 48\n"
4606 "fstrs v2, [sp, #-8]!\n"
4607 "fldrs v3, [sp], #8 !\n"
4617 Operand(2 * target::kWordSize));
4619 __ LoadDImmediate(
V1, 21.0);
4620 __ LoadDImmediate(
V2, 21.0);
4621 __ LoadImmediate(
R1, 42);
4637 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn,
test->entry()));
4640 "sub csp, csp, #0x1000\n"
4641 "sub csp, csp, #0x10\n"
4642 "fmovd v1, 21.000000\n"
4643 "fmovd v2, 21.000000\n"
4645 "str r1, [sp, #-8]!\n"
4646 "fstrd v1, [sp, #-8]!\n"
4647 "fstrd v2, [sp, #-8]!\n"
4648 "fldrq v3, [sp], #16 !\n"
4649 "ldr r0, [sp], #8 !\n"
4650 "fstrq v3, [sp, #-16]!\n"
4651 "fldrd v0, [sp], #8 !\n"
4652 "fldrd v1, [sp], #8 !\n"
4653 "faddd v0, v0, v1\n"
4659 __ LoadDImmediate(
V0, 42.5);
4666 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
4668 "movz tmp, #0x4000 lsl 32\n"
4669 "movk tmp, #0x4045 lsl 48\n"
4676 __ LoadDImmediate(
V0, -42.5);
4684 EXPECT_EQ(-42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
4686 "movz tmp, #0x4000 lsl 32\n"
4687 "movk tmp, #0xc045 lsl 48\n"
4695 __ LoadDImmediate(
V0, 1e20);
4702 EXPECT_EQ(
kMaxInt64, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
4706 __ LoadDImmediate(
V0, -1e20);
4713 EXPECT_EQ(
kMinInt64, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
4715 "movz tmp, #0x8c40\n"
4716 "movk tmp, #0x78b5 lsl 16\n"
4717 "movk tmp, #0xaf1d lsl 32\n"
4718 "movk tmp, #0xc415 lsl 48\n"
4725 __ LoadDImmediate(
V0, 1e10);
4732 EXPECT_EQ(
kMaxInt32, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
4734 "movz tmp, #0x2000 lsl 16\n"
4735 "movk tmp, #0xa05f lsl 32\n"
4736 "movk tmp, #0x4202 lsl 48\n"
4743 __ LoadDImmediate(
V0, -1e10);
4751 EXPECT_EQ(
kMinInt32, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
4753 "movz tmp, #0x2000 lsl 16\n"
4754 "movk tmp, #0xa05f lsl 32\n"
4755 "movk tmp, #0xc202 lsl 48\n"
4763 __ LoadDImmediate(
V0, 42.5);
4770 EXPECT_EQ(43, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
4772 "movz tmp, #0x4000 lsl 32\n"
4773 "movk tmp, #0x4045 lsl 48\n"
4780 __ LoadDImmediate(
V0, -42.5);
4788 EXPECT_EQ(-42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
4790 "movz tmp, #0x4000 lsl 32\n"
4791 "movk tmp, #0xc045 lsl 48\n"
4799 __ LoadDImmediate(
V0, 1e20);
4806 EXPECT_EQ(
kMaxInt64, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
4808 "movz tmp, #0x8c40\n"
4809 "movk tmp, #0x78b5 lsl 16\n"
4810 "movk tmp, #0xaf1d lsl 32\n"
4811 "movk tmp, #0x4415 lsl 48\n"
4818 __ LoadDImmediate(
V0, -1e20);
4825 EXPECT_EQ(
kMinInt64, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
4827 "movz tmp, #0x8c40\n"
4828 "movk tmp, #0x78b5 lsl 16\n"
4829 "movk tmp, #0xaf1d lsl 32\n"
4830 "movk tmp, #0xc415 lsl 48\n"
4837 __ LoadDImmediate(
V0, 1e10);
4844 EXPECT_EQ(
kMaxInt32, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
4846 "movz tmp, #0x2000 lsl 16\n"
4847 "movk tmp, #0xa05f lsl 32\n"
4848 "movk tmp, #0x4202 lsl 48\n"
4855 __ LoadDImmediate(
V0, -1e10);
4863 EXPECT_EQ(
kMinInt32, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
4865 "movz tmp, #0x2000 lsl 16\n"
4866 "movk tmp, #0xa05f lsl 32\n"
4867 "movk tmp, #0xc202 lsl 48\n"
4875 __ LoadDImmediate(
V0, 42.5);
4882 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
4884 "movz tmp, #0x4000 lsl 32\n"
4885 "movk tmp, #0x4045 lsl 48\n"
4892 __ LoadDImmediate(
V0, -42.5);
4900 EXPECT_EQ(-43, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
4902 "movz tmp, #0x4000 lsl 32\n"
4903 "movk tmp, #0xc045 lsl 48\n"
4911 __ LoadDImmediate(
V0, 1e20);
4918 EXPECT_EQ(
kMaxInt64, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
4920 "movz tmp, #0x8c40\n"
4921 "movk tmp, #0x78b5 lsl 16\n"
4922 "movk tmp, #0xaf1d lsl 32\n"
4923 "movk tmp, #0x4415 lsl 48\n"
4930 __ LoadDImmediate(
V0, -1e20);
4937 EXPECT_EQ(
kMinInt64, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
4939 "movz tmp, #0x8c40\n"
4940 "movk tmp, #0x78b5 lsl 16\n"
4941 "movk tmp, #0xaf1d lsl 32\n"
4942 "movk tmp, #0xc415 lsl 48\n"
4949 __ LoadDImmediate(
V0, 1e10);
4956 EXPECT_EQ(
kMaxInt32, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
4958 "movz tmp, #0x2000 lsl 16\n"
4959 "movk tmp, #0xa05f lsl 32\n"
4960 "movk tmp, #0x4202 lsl 48\n"
4967 __ LoadDImmediate(
V0, -1e10);
4975 EXPECT_EQ(
kMinInt32, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
4977 "movz tmp, #0x2000 lsl 16\n"
4978 "movk tmp, #0xa05f lsl 32\n"
4979 "movk tmp, #0xc202 lsl 48\n"
4987 __ LoadImmediate(
R0, 42);
4994 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn,
test->entry()));
5003 __ LoadImmediate(
R0, 0x111111110000002A);
5010 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn,
test->entry()));
5013 "movk r0, #0x1111 lsl 32\n"
5014 "movk r0, #0x1111 lsl 48\n"
5020 __ LoadDImmediate(
V1, 42.0);
5027 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn,
test->entry()));
5029 "movz tmp, #0x4045 lsl 48\n"
5036 __ LoadDImmediate(
V1, -42.0);
5043 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn,
test->entry()));
5045 "movz tmp, #0xc045 lsl 48\n"
5052 __ LoadDImmediate(
V1, 42.0);
5059 EXPECT_EQ(-42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn,
test->entry()));
5061 "movz tmp, #0x4045 lsl 48\n"
5068 __ LoadDImmediate(
V1, -42.0);
5075 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn,
test->entry()));
5077 "movz tmp, #0xc045 lsl 48\n"
5084 __ LoadDImmediate(
V1, 64.0);
5091 EXPECT_EQ(8.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn,
test->entry()));
5093 "movz tmp, #0x4050 lsl 48\n"
5100 __ LoadDImmediate(
V1, 84.0);
5101 __ LoadDImmediate(
V2, 0.5);
5108 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn,
test->entry()));
5110 "movz tmp, #0x4055 lsl 48\n"
5112 "fmovd v2, 0.500000\n"
5113 "fmuld v0, v1, v2\n"
5118 __ LoadDImmediate(
V1, 84.0);
5119 __ LoadDImmediate(
V2, 2.0);
5126 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn,
test->entry()));
5128 "movz tmp, #0x4055 lsl 48\n"
5130 "fmovd v2, 2.000000\n"
5131 "fdivd v0, v1, v2\n"
5136 __ LoadDImmediate(
V1, 41.5);
5137 __ LoadDImmediate(
V2, 0.5);
5144 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn,
test->entry()));
5146 "movz tmp, #0xc000 lsl 32\n"
5147 "movk tmp, #0x4044 lsl 48\n"
5149 "fmovd v2, 0.500000\n"
5150 "faddd v0, v1, v2\n"
5155 __ LoadDImmediate(
V1, 42.5);
5156 __ LoadDImmediate(
V2, 0.5);
5163 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn,
test->entry()));
5165 "movz tmp, #0x4000 lsl 32\n"
5166 "movk tmp, #0x4045 lsl 48\n"
5168 "fmovd v2, 0.500000\n"
5169 "fsubd v0, v1, v2\n"
5175 __ LoadDImmediate(
V0, 43.0);
5176 __ LoadDImmediate(
V1, 42.0);
5177 __ AddImmediate(
SP,
SP, -1 * target::kWordSize);
5178 __ add(
R2,
SP, Operand(1));
5179 __ fstrd(
V1, Address(
R2, -1));
5180 __ fldrd(
V0, Address(
R2, -1));
5181 __ AddImmediate(
SP, 1 * target::kWordSize);
5188 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn,
test->entry()));
5191 "sub csp, csp, #0x1000\n"
5192 "movz tmp, #0x8000 lsl 32\n"
5193 "movk tmp, #0x4045 lsl 48\n"
5195 "movz tmp, #0x4045 lsl 48\n"
5197 "sub sp, sp, #0x8\n"
5198 "add r2, sp, #0x1\n"
5199 "fstrd v1, [r2, #-1]\n"
5200 "fldrd v0, [r2, #-1]\n"
5201 "add sp, sp, #0x8\n"
5210 Operand(32 * target::kWordSize));
5212 __ LoadDImmediate(
V0, 43.0);
5213 __ LoadDImmediate(
V1, 42.0);
5219 __ add(
SP,
SP, Operand(target::kWordSize));
5226 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn,
test->entry()));
5229 "sub csp, csp, #0x1000\n"
5230 "sub csp, csp, #0x100\n"
5231 "movz tmp, #0x8000 lsl 32\n"
5232 "movk tmp, #0x4045 lsl 48\n"
5234 "movz tmp, #0x4045 lsl 48\n"
5236 "fstrd v1, [sp, #-256]!\n"
5237 "fldrd v0, [sp], #248 !\n"
5238 "add sp, sp, #0x8\n"
5245 __ LoadDImmediate(
V0, 43.0);
5246 __ LoadDImmediate(
V1, 42.0);
5247 __ sub(
SP,
SP, Operand(512 * target::kWordSize));
5248 __ andi(
CSP,
SP, Immediate(~15));
5249 __ fstrd(
V1, Address(
SP, 512 * target::kWordSize));
5250 __ add(
SP,
SP, Operand(512 * target::kWordSize));
5251 __ fldrd(
V0, Address(
SP));
5258 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn,
test->entry()));
5261 "sub csp, csp, #0x1000\n"
5262 "movz tmp, #0x8000 lsl 32\n"
5263 "movk tmp, #0x4045 lsl 48\n"
5265 "movz tmp, #0x4045 lsl 48\n"
5267 "sub sp, sp, #0x1000\n"
5268 "and csp, sp, 0xfffffffffffffff0\n"
5269 "fstrd v1, [sp, #4096]\n"
5270 "add sp, sp, #0x1000\n"
5278 __ LoadDImmediate(
V0, 43.0);
5279 __ LoadDImmediate(
V1, 42.0);
5280 __ movz(
R2, Immediate(0xfff8), 0);
5281 __ movk(
R2, Immediate(0xffff), 1);
5285 __ sub(
SP,
SP, Operand(target::kWordSize));
5286 __ andi(
CSP,
SP, Immediate(~15));
5287 __ fldrd(
V0, Address(
SP));
5288 __ add(
SP,
SP, Operand(target::kWordSize));
5295 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn,
test->entry()));
5298 "sub csp, csp, #0x1000\n"
5299 "movz tmp, #0x8000 lsl 32\n"
5300 "movk tmp, #0x4045 lsl 48\n"
5302 "movz tmp, #0x4045 lsl 48\n"
5304 "movz r2, #0xfff8\n"
5305 "movk r2, #0xffff lsl 16\n"
5306 "fstrd v1, [sp, r2 sxtw]\n"
5307 "sub sp, sp, #0x8\n"
5308 "and csp, sp, 0xfffffffffffffff0\n"
5310 "add sp, sp, #0x8\n"
5317 __ LoadDImmediate(
V0, 43.0);
5318 __ LoadDImmediate(
V1, 42.0);
5319 __ movz(
R2, Immediate(10), 0);
5320 __ sub(
SP,
SP, Operand(10 * target::kWordSize));
5321 __ andi(
CSP,
SP, Immediate(~15));
5325 __ add(
SP,
SP, Operand(10 * target::kWordSize));
5332 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn,
test->entry()));
5335 "sub csp, csp, #0x1000\n"
5336 "movz tmp, #0x8000 lsl 32\n"
5337 "movk tmp, #0x4045 lsl 48\n"
5339 "movz tmp, #0x4045 lsl 48\n"
5342 "sub sp, sp, #0x50\n"
5343 "and csp, sp, 0xfffffffffffffff0\n"
5344 "fstrd v1, [sp, r2 uxtx scaled]\n"
5345 "fldrd v0, [sp, r2 uxtx scaled]\n"
5346 "add sp, sp, #0x50\n"
5352 __ LoadImmediate(
R0, 42);
5353 __ LoadImmediate(
R1, 43);
5354 __ LoadImmediate(
R2, 44);
5355 __ LoadImmediate(
R3, 45);
5376 EXPECT_EQ(174, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
5386 "vmovrs r4, v0[0]\n"
5387 "vmovrs r5, v0[1]\n"
5388 "vmovrs r6, v0[2]\n"
5389 "vmovrs r7, v0[3]\n"
5397 __ LoadImmediate(
R0, 42);
5398 __ LoadImmediate(
R1, 43);
5413 EXPECT_EQ(85, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
5419 "vmovrd r2, v0[0]\n"
5420 "vmovrd r3, v0[1]\n"
5426 __ LoadImmediate(
R0, 0xfffffffe);
5427 __ LoadImmediate(
R1, 0xffffffff);
5448 EXPECT_EQ(2, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
5450 "mov r0, 0xfffffffe\n"
5451 "mov r1, 0xffffffff\n"
5457 "vmovrs r2, v0[0]\n"
5458 "vmovrs r3, v0[1]\n"
5459 "vmovrs r4, v0[2]\n"
5460 "vmovrs r5, v0[3]\n"
5468 __ LoadDImmediate(
V1, 21.0);
5469 __ LoadDImmediate(
V2, -21.0);
5492 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn,
test->entry()));
5494 "fmovd v1, 21.000000\n"
5495 "fmovd v2, -21.000000\n"
5499 "vinss v3[1], v1[0]\n"
5500 "vinss v3[3], v2[0]\n"
5502 "vinss v5[0], v4[1]\n"
5503 "vinss v6[0], v4[3]\n"
5506 "faddd v0, v5, v6\n"
5511 __ LoadDImmediate(
V1, 21.0);
5512 __ LoadDImmediate(
V2, -21.0);
5528 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn,
test->entry()));
5530 "fmovd v1, 21.000000\n"
5531 "fmovd v2, -21.000000\n"
5532 "vinsd v3[0], v1[0]\n"
5533 "vinsd v3[1], v2[0]\n"
5535 "vinsd v5[0], v4[0]\n"
5536 "vinsd v6[0], v4[1]\n"
5537 "faddd v0, v5, v6\n"
5542 __ LoadDImmediate(
V1, 42.0);
5543 __ LoadDImmediate(
V2, -84.0);
5565 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn,
test->entry()));
5567 "movz tmp, #0x4045 lsl 48\n"
5569 "movz tmp, #0xc055 lsl 48\n"
5574 "vinss v3[1], v1[0]\n"
5575 "vinss v3[3], v2[0]\n"
5577 "vinss v5[0], v4[1]\n"
5578 "vinss v6[0], v4[3]\n"
5581 "faddd v0, v5, v6\n"
5586 __ LoadDImmediate(
V1, 42.0);
5587 __ LoadDImmediate(
V2, -84.0);
5603 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn,
test->entry()));
5606 "movz tmp, #0x4045 lsl 48\n"
5608 "movz tmp, #0xc055 lsl 48\n"
5610 "vinsd v3[0], v1[0]\n"
5611 "vinsd v3[1], v2[0]\n"
5613 "vinsd v5[0], v4[0]\n"
5614 "vinsd v6[0], v4[1]\n"
5615 "faddd v0, v5, v6\n"
5620 __ LoadDImmediate(
V0, 0.0);
5621 __ LoadDImmediate(
V1, 1.0);
5622 __ LoadDImmediate(
V2, 2.0);
5623 __ LoadDImmediate(
V3, 3.0);
5655 EXPECT_EQ(12.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn,
test->entry()));
5658 "fmovd v1, 1.000000\n"
5659 "fmovd v2, 2.000000\n"
5660 "fmovd v3, 3.000000\n"
5665 "vinss v4[0], v0[0]\n"
5666 "vinss v4[1], v1[0]\n"
5667 "vinss v4[2], v2[0]\n"
5668 "vinss v4[3], v3[0]\n"
5669 "vadds v5, v4, v4\n"
5670 "vinss v0[0], v5[0]\n"
5671 "vinss v1[0], v5[1]\n"
5672 "vinss v2[0], v5[2]\n"
5673 "vinss v3[0], v5[3]\n"
5678 "faddd v0, v0, v1\n"
5679 "faddd v0, v0, v2\n"
5680 "faddd v0, v0, v3\n"
5685 __ LoadDImmediate(
V0, 0.0);
5686 __ LoadDImmediate(
V1, 1.0);
5687 __ LoadDImmediate(
V2, 2.0);
5688 __ LoadDImmediate(
V3, 3.0);
5689 __ LoadDImmediate(
V5, 0.0);
5721 EXPECT_EQ(-6.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn,
test->entry()));
5724 "fmovd v1, 1.000000\n"
5725 "fmovd v2, 2.000000\n"
5726 "fmovd v3, 3.000000\n"
5732 "vinss v4[0], v0[0]\n"
5733 "vinss v4[1], v1[0]\n"
5734 "vinss v4[2], v2[0]\n"
5735 "vinss v4[3], v3[0]\n"
5736 "vsubs v5, v5, v4\n"
5737 "vinss v0[0], v5[0]\n"
5738 "vinss v1[0], v5[1]\n"
5739 "vinss v2[0], v5[2]\n"
5740 "vinss v3[0], v5[3]\n"
5745 "faddd v0, v0, v1\n"
5746 "faddd v0, v0, v2\n"
5747 "faddd v0, v0, v3\n"
5752 __ LoadDImmediate(
V0, 0.0);
5753 __ LoadDImmediate(
V1, 1.0);
5754 __ LoadDImmediate(
V2, 2.0);
5755 __ LoadDImmediate(
V3, 3.0);
5787 EXPECT_EQ(14.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn,
test->entry()));
5790 "fmovd v1, 1.000000\n"
5791 "fmovd v2, 2.000000\n"
5792 "fmovd v3, 3.000000\n"
5797 "vinss v4[0], v0[0]\n"
5798 "vinss v4[1], v1[0]\n"
5799 "vinss v4[2], v2[0]\n"
5800 "vinss v4[3], v3[0]\n"
5801 "vmuls v5, v4, v4\n"
5802 "vinss v0[0], v5[0]\n"
5803 "vinss v1[0], v5[1]\n"
5804 "vinss v2[0], v5[2]\n"
5805 "vinss v3[0], v5[3]\n"
5810 "faddd v0, v0, v1\n"
5811 "faddd v0, v0, v2\n"
5812 "faddd v0, v0, v3\n"
5817 __ LoadDImmediate(
V0, 0.0);
5818 __ LoadDImmediate(
V1, 1.0);
5819 __ LoadDImmediate(
V2, 2.0);
5820 __ LoadDImmediate(
V3, 3.0);
5852 EXPECT_EQ(4.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn,
test->entry()));
5855 "fmovd v1, 1.000000\n"
5856 "fmovd v2, 2.000000\n"
5857 "fmovd v3, 3.000000\n"
5862 "vinss v4[0], v0[0]\n"
5863 "vinss v4[1], v1[0]\n"
5864 "vinss v4[2], v2[0]\n"
5865 "vinss v4[3], v3[0]\n"
5866 "vdivs v5, v4, v4\n"
5867 "vinss v0[0], v5[0]\n"
5868 "vinss v1[0], v5[1]\n"
5869 "vinss v2[0], v5[2]\n"
5870 "vinss v3[0], v5[3]\n"
5875 "faddd v0, v1, v1\n"
5876 "faddd v0, v0, v2\n"
5877 "faddd v0, v0, v3\n"
5882 __ LoadDImmediate(
V0, 2.0);
5883 __ LoadDImmediate(
V1, 3.0);
5899 EXPECT_EQ(10.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn,
test->entry()));
5902 "fmovd v0, 2.000000\n"
5903 "fmovd v1, 3.000000\n"
5904 "vinsd v4[0], v0[0]\n"
5905 "vinsd v4[1], v1[0]\n"
5906 "vaddd v5, v4, v4\n"
5907 "vinsd v0[0], v5[0]\n"
5908 "vinsd v1[0], v5[1]\n"
5909 "faddd v0, v0, v1\n"
5914 __ LoadDImmediate(
V0, 2.0);
5915 __ LoadDImmediate(
V1, 3.0);
5916 __ LoadDImmediate(
V5, 0.0);
5932 EXPECT_EQ(-5.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn,
test->entry()));
5934 "fmovd v0, 2.000000\n"
5935 "fmovd v1, 3.000000\n"
5937 "vinsd v4[0], v0[0]\n"
5938 "vinsd v4[1], v1[0]\n"
5939 "vsubd v5, v5, v4\n"
5940 "vinsd v0[0], v5[0]\n"
5941 "vinsd v1[0], v5[1]\n"
5942 "faddd v0, v0, v1\n"
5947 __ LoadDImmediate(
V0, 2.0);
5948 __ LoadDImmediate(
V1, 3.0);
5964 EXPECT_EQ(13.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn,
test->entry()));
5967 "fmovd v0, 2.000000\n"
5968 "fmovd v1, 3.000000\n"
5969 "vinsd v4[0], v0[0]\n"
5970 "vinsd v4[1], v1[0]\n"
5971 "vmuld v5, v4, v4\n"
5972 "vinsd v0[0], v5[0]\n"
5973 "vinsd v1[0], v5[1]\n"
5974 "faddd v0, v0, v1\n"
5979 __ LoadDImmediate(
V0, 2.0);
5980 __ LoadDImmediate(
V1, 3.0);
5996 EXPECT_EQ(2.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn,
test->entry()));
5998 "fmovd v0, 2.000000\n"
5999 "fmovd v1, 3.000000\n"
6000 "vinsd v4[0], v0[0]\n"
6001 "vinsd v4[1], v1[0]\n"
6002 "vdivd v5, v4, v4\n"
6003 "vinsd v0[0], v5[0]\n"
6004 "vinsd v1[0], v5[1]\n"
6005 "faddd v0, v0, v1\n"
6011 __ LoadDImmediate(
V0, 21.0);
6017 __ sub(
CSP,
CSP, Operand(qword_bytes));
6031 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn,
test->entry()));
6035 "sub csp, csp, #0x1000\n"
6036 "fmovd v0, 21.000000\n"
6038 "sub csp, csp, #0x10\n"
6039 "fstrq v1, [sp, #-16]!\n"
6040 "fldrd v2, [sp], #8 !\n"
6041 "fldrd v3, [sp], #8 !\n"
6042 "faddd v0, v2, v3\n"
6049 __ LoadDImmediate(
V0, 21.0);
6056 __ sub(
CSP,
CSP, Operand(qword_bytes));
6079 EXPECT_EQ(84.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn,
test->entry()));
6083 "sub csp, csp, #0x1000\n"
6084 "fmovd v0, 21.000000\n"
6087 "sub csp, csp, #0x10\n"
6088 "fstrq v1, [sp, #-16]!\n"
6089 "fldrs v3, [sp], #4 !\n"
6090 "fldrs v2, [sp], #4 !\n"
6091 "fldrs v1, [sp], #4 !\n"
6092 "fldrs v0, [sp], #4 !\n"
6097 "faddd v0, v1, v1\n"
6098 "faddd v0, v0, v2\n"
6099 "faddd v0, v0, v3\n"
6106 __ LoadDImmediate(
V5, 42.0);
6112 __ sub(
CSP,
CSP, Operand(qword_bytes));
6126 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn,
test->entry()));
6130 "sub csp, csp, #0x1000\n"
6131 "movz tmp, #0x4045 lsl 48\n"
6133 "vinsd v1[1], v5[0]\n"
6134 "sub csp, csp, #0x10\n"
6135 "fstrq v1, [sp, #-16]!\n"
6136 "fldrd v2, [sp], #8 !\n"
6137 "fldrd v3, [sp], #8 !\n"
6146 __ LoadDImmediate(
V0, 21.0);
6152 __ LoadDImmediate(
V0, 0.0);
6160 __ sub(
CSP,
CSP, Operand(qword_bytes));
6183 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn,
test->entry()));
6186 "sub csp, csp, #0x1000\n"
6187 "fmovd v0, 21.000000\n"
6189 "vinss v1[3], v0[0]\n"
6190 "vinss v1[1], v0[0]\n"
6193 "vinss v1[2], v0[0]\n"
6194 "vinss v1[0], v0[0]\n"
6195 "sub csp, csp, #0x10\n"
6196 "fstrq v1, [sp, #-16]!\n"
6197 "fldrs v3, [sp], #4 !\n"
6198 "fldrs v2, [sp], #4 !\n"
6199 "fldrs v1, [sp], #4 !\n"
6200 "fldrs v0, [sp], #4 !\n"
6205 "faddd v0, v0, v1\n"
6206 "faddd v0, v0, v2\n"
6207 "faddd v0, v0, v3\n"
6213 __ LoadDImmediate(
V1, 21.0);
6214 __ LoadImmediate(
R0, 0xffffffff);
6244 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn,
test->entry()));
6246 "fmovd v1, 21.000000\n"
6247 "mov r0, 0xffffffff\n"
6249 "vinss v0[2], v0[0]\n"
6253 "vinss v3[0], v2[0]\n"
6254 "vinss v4[0], v2[1]\n"
6255 "vinss v5[0], v2[2]\n"
6256 "vinss v6[0], v2[3]\n"
6261 "vaddd v0, v3, v4\n"
6262 "vaddd v0, v0, v5\n"
6263 "vaddd v0, v0, v6\n"
6268 __ LoadDImmediate(
V1, 10.5);
6300 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn,
test->entry()));
6302 "fmovd v1, 10.500000\n"
6305 "vinss v0[2], v0[0]\n"
6307 "vinss v1[1], v0[0]\n"
6308 "vinss v1[3], v0[0]\n"
6310 "vinss v3[0], v2[0]\n"
6311 "vinss v4[0], v2[1]\n"
6312 "vinss v5[0], v2[2]\n"
6313 "vinss v6[0], v2[3]\n"
6318 "vaddd v0, v3, v4\n"
6319 "vaddd v0, v0, v5\n"
6320 "vaddd v0, v0, v6\n"
6325 __ LoadImmediate(
R1, 0xffffffff);
6326 __ LoadImmediate(
R2, ~21);
6353 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
6355 "mov r1, 0xffffffff\n"
6366 "vmovrs r3, v0[0]\n"
6367 "vmovrs r4, v0[1]\n"
6368 "vmovrs r5, v0[2]\n"
6369 "vmovrs r6, v0[3]\n"
6377 __ LoadImmediate(
R4, 21);
6396 EXPECT_EQ(168, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
6401 "vaddw v0, v1, v2\n"
6402 "vmovrs r0, v0[0]\n"
6403 "vmovrs r1, v0[1]\n"
6404 "vmovrs r2, v0[2]\n"
6405 "vmovrs r3, v0[3]\n"
6413 __ LoadImmediate(
R4, 31);
6414 __ LoadImmediate(
R5, 10);
6433 EXPECT_EQ(84, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
6439 "vsubw v0, v1, v2\n"
6440 "vmovrs r0, v0[0]\n"
6441 "vmovrs r1, v0[1]\n"
6442 "vmovrs r2, v0[2]\n"
6443 "vmovrs r3, v0[3]\n"
6451 __ LoadImmediate(
R4, 21);
6466 EXPECT_EQ(84, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
6471 "vaddx v0, v1, v2\n"
6472 "vmovrd r0, v0[0]\n"
6473 "vmovrd r1, v0[1]\n"
6479 __ LoadImmediate(
R4, 31);
6480 __ LoadImmediate(
R5, 10);
6495 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
6501 "vsubx v0, v1, v2\n"
6502 "vmovrd r0, v0[0]\n"
6503 "vmovrd r1, v0[1]\n"
6509 __ LoadDImmediate(
V0, 42.0);
6510 __ LoadDImmediate(
V1, -42.0);
6536 EXPECT_EQ(0xfffffffe, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
6538 "movz tmp, #0x4045 lsl 48\n"
6540 "movz tmp, #0xc045 lsl 48\n"
6545 "vinss v3[0], v0[0]\n"
6546 "vinss v3[1], v1[0]\n"
6547 "vinss v3[2], v0[0]\n"
6548 "vinss v3[3], v1[0]\n"
6549 "vceqs v4, v2, v3\n"
6550 "vmovrs r1, v4[0]\n"
6551 "vmovrs r2, v4[1]\n"
6552 "vmovrs r3, v4[2]\n"
6553 "vmovrs r4, v4[3]\n"
6561 __ LoadDImmediate(
V0, 42.0);
6562 __ LoadDImmediate(
V1, -42.0);
6579 EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
6581 "movz tmp, #0x4045 lsl 48\n"
6583 "movz tmp, #0xc045 lsl 48\n"
6586 "vinsd v3[0], v0[0]\n"
6587 "vinsd v3[1], v1[0]\n"
6588 "vceqd v4, v2, v3\n"
6589 "vmovrd r1, v4[0]\n"
6590 "vmovrd r2, v4[1]\n"
6596 __ LoadDImmediate(
V0, 42.0);
6597 __ LoadDImmediate(
V1, -42.0);
6623 EXPECT_EQ(0xfffffffe, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
6625 "movz tmp, #0x4045 lsl 48\n"
6627 "movz tmp, #0xc045 lsl 48\n"
6632 "vinss v3[0], v0[0]\n"
6633 "vinss v3[1], v1[0]\n"
6634 "vinss v3[2], v0[0]\n"
6635 "vinss v3[3], v1[0]\n"
6636 "vcgts v4, v2, v3\n"
6637 "vmovrs r1, v4[0]\n"
6638 "vmovrs r2, v4[1]\n"
6639 "vmovrs r3, v4[2]\n"
6640 "vmovrs r4, v4[3]\n"
6648 __ LoadDImmediate(
V0, 42.0);
6649 __ LoadDImmediate(
V1, -42.0);
6666 EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
6668 "movz tmp, #0x4045 lsl 48\n"
6670 "movz tmp, #0xc045 lsl 48\n"
6673 "vinsd v3[0], v0[0]\n"
6674 "vinsd v3[1], v1[0]\n"
6675 "vcgtd v4, v2, v3\n"
6676 "vmovrd r1, v4[0]\n"
6677 "vmovrd r2, v4[1]\n"
6683 __ LoadDImmediate(
V0, 42.0);
6684 __ LoadDImmediate(
V1, 43.0);
6710 EXPECT_EQ(0xfffffffe, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
6712 "movz tmp, #0x4045 lsl 48\n"
6714 "movz tmp, #0x8000 lsl 32\n"
6715 "movk tmp, #0x4045 lsl 48\n"
6720 "vinss v3[0], v0[0]\n"
6721 "vinss v3[1], v1[0]\n"
6722 "vinss v3[2], v0[0]\n"
6723 "vinss v3[3], v1[0]\n"
6724 "vcges v4, v2, v3\n"
6725 "vmovrs r1, v4[0]\n"
6726 "vmovrs r2, v4[1]\n"
6727 "vmovrs r3, v4[2]\n"
6728 "vmovrs r4, v4[3]\n"
6736 __ LoadDImmediate(
V0, 42.0);
6737 __ LoadDImmediate(
V1, 43.0);
6754 EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
6756 "movz tmp, #0x4045 lsl 48\n"
6758 "movz tmp, #0x8000 lsl 32\n"
6759 "movk tmp, #0x4045 lsl 48\n"
6762 "vinsd v3[0], v0[0]\n"
6763 "vinsd v3[1], v1[0]\n"
6764 "vcged v4, v2, v3\n"
6765 "vmovrd r1, v4[0]\n"
6766 "vmovrd r2, v4[1]\n"
6781 double d = EXECUTE_TEST_CODE_DOUBLE(DoubleReturn,
test->entry());
6782 EXPECT_EQ(
true, !signbit(
d) && (
d == 0.0));
6786 "vmaxs v0, v2, v1\n"
6791 __ LoadDImmediate(
V0, 10.5);
6792 __ LoadDImmediate(
V1, 10.0);
6823 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn,
test->entry()));
6825 "fmovd v0, 10.500000\n"
6826 "fmovd v1, 10.000000\n"
6830 "vinss v3[0], v0[0]\n"
6831 "vinss v3[1], v1[0]\n"
6832 "vinss v3[2], v0[0]\n"
6833 "vinss v3[3], v1[0]\n"
6834 "vmaxs v4, v2, v3\n"
6835 "vinss v0[0], v4[0]\n"
6836 "vinss v1[0], v4[1]\n"
6837 "vinss v2[0], v4[2]\n"
6838 "vinss v3[0], v4[3]\n"
6843 "faddd v0, v0, v1\n"
6844 "faddd v0, v0, v2\n"
6845 "faddd v0, v0, v3\n"
6859 double d = EXECUTE_TEST_CODE_DOUBLE(DoubleReturn,
test->entry());
6860 EXPECT_EQ(
true, !signbit(
d) && (
d == 0.0));
6864 "vmaxd v0, v2, v1\n"
6869 __ LoadDImmediate(
V0, 21.0);
6870 __ LoadDImmediate(
V1, 20.5);
6887 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn,
test->entry()));
6889 "fmovd v0, 21.000000\n"
6890 "movz tmp, #0x8000 lsl 32\n"
6891 "movk tmp, #0x4034 lsl 48\n"
6894 "vinsd v3[0], v0[0]\n"
6895 "vinsd v3[1], v1[0]\n"
6896 "vmaxd v4, v2, v3\n"
6897 "vinsd v0[0], v4[0]\n"
6898 "vinsd v1[0], v4[1]\n"
6899 "faddd v0, v0, v1\n"
6913 double d = EXECUTE_TEST_CODE_DOUBLE(DoubleReturn,
test->entry());
6914 fprintf(stderr,
"d: %f\n",
d);
6915 EXPECT_EQ(
true, signbit(
d) && (
d == 0.0));
6919 "vmins v0, v1, v2\n"
6924 __ LoadDImmediate(
V0, 10.5);
6925 __ LoadDImmediate(
V1, 11.0);
6956 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn,
test->entry()));
6958 "fmovd v0, 10.500000\n"
6959 "fmovd v1, 11.000000\n"
6963 "vinss v3[0], v0[0]\n"
6964 "vinss v3[1], v1[0]\n"
6965 "vinss v3[2], v0[0]\n"
6966 "vinss v3[3], v1[0]\n"
6967 "vmins v4, v2, v3\n"
6968 "vinss v0[0], v4[0]\n"
6969 "vinss v1[0], v4[1]\n"
6970 "vinss v2[0], v4[2]\n"
6971 "vinss v3[0], v4[3]\n"
6976 "faddd v0, v0, v1\n"
6977 "faddd v0, v0, v2\n"
6978 "faddd v0, v0, v3\n"
6992 double d = EXECUTE_TEST_CODE_DOUBLE(DoubleReturn,
test->entry());
6993 fprintf(stderr,
"d: %f\n",
d);
6994 EXPECT_EQ(
true, signbit(
d) && (
d == 0.0));
6998 "vmind v0, v1, v2\n"
7003 __ LoadDImmediate(
V0, 21.0);
7004 __ LoadDImmediate(
V1, 21.5);
7021 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn,
test->entry()));
7023 "fmovd v0, 21.000000\n"
7024 "movz tmp, #0x8000 lsl 32\n"
7025 "movk tmp, #0x4035 lsl 48\n"
7028 "vinsd v3[0], v0[0]\n"
7029 "vinsd v3[1], v1[0]\n"
7030 "vmind v4, v2, v3\n"
7031 "vinsd v0[0], v4[0]\n"
7032 "vinsd v1[0], v4[1]\n"
7033 "faddd v0, v0, v1\n"
7038 __ LoadDImmediate(
V0, 64.0);
7039 __ LoadDImmediate(
V1, 49.0);
7062 EXPECT_EQ(15.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn,
test->entry()));
7064 "movz tmp, #0x4050 lsl 48\n"
7066 "movz tmp, #0x8000 lsl 32\n"
7067 "movk tmp, #0x4048 lsl 48\n"
7072 "vinss v3[1], v0[0]\n"
7073 "vinss v3[3], v1[0]\n"
7075 "vinss v5[0], v4[1]\n"
7076 "vinss v6[0], v4[3]\n"
7079 "faddd v0, v5, v6\n"
7084 __ LoadDImmediate(
V0, 64.0);
7085 __ LoadDImmediate(
V1, 49.0);
7101 EXPECT_EQ(15.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn,
test->entry()));
7103 "movz tmp, #0x4050 lsl 48\n"
7105 "movz tmp, #0x8000 lsl 32\n"
7106 "movk tmp, #0x4048 lsl 48\n"
7108 "vinsd v3[0], v0[0]\n"
7109 "vinsd v3[1], v1[0]\n"
7111 "vinsd v5[0], v4[0]\n"
7112 "vinsd v6[0], v4[1]\n"
7113 "faddd v0, v5, v6\n"
7118static float arm_recip_estimate(
float a) {
7120 if (isinf(
a) || (fabs(
a) >= exp2f(126)))
7127 uint32_t a_bits = bit_cast<uint32_t, float>(
a);
7129 uint64_t scaled = (
static_cast<uint64_t
>(0x3fe) << 52) |
7130 ((
static_cast<uint64_t
>(a_bits) & 0x7fffff) << 29);
7132 int32_t result_exp = 253 - ((a_bits >> 23) & 0xff);
7133 ASSERT((result_exp >= 1) && (result_exp <= 252));
7135 double scaled_d = bit_cast<double, uint64_t>(scaled);
7136 ASSERT((scaled_d >= 0.5) && (scaled_d < 1.0));
7139 int32_t q =
static_cast<int32_t
>(scaled_d * 512.0);
7141 double r = 1.0 / ((
static_cast<double>(q) + 0.5) / 512.0);
7143 int32_t
s =
static_cast<int32_t
>(256.0 * r + 0.5);
7144 double estimate =
static_cast<double>(
s) / 256.0;
7145 ASSERT((estimate >= 1.0) && (estimate <= (511.0 / 256.0)));
7148 int32_t result_bits =
7149 (a_bits & 0x80000000) | ((result_exp & 0xff) << 23) |
7150 ((bit_cast<uint64_t, double>(estimate) >> 29) & 0x7fffff);
7151 return bit_cast<float, int32_t>(result_bits);
7155 __ LoadDImmediate(
V1, 147.0);
7169 float res = EXECUTE_TEST_CODE_DOUBLE(DoubleReturn,
test->entry());
7170 EXPECT_FLOAT_EQ(arm_recip_estimate(147.0), res, 0.0001);
7172 "movz tmp, #0x6000 lsl 32\n"
7173 "movk tmp, #0x4062 lsl 48\n"
7176 "vinss v2[0], v1[0]\n"
7177 "vinss v2[1], v1[0]\n"
7178 "vinss v2[2], v1[0]\n"
7179 "vinss v2[3], v1[0]\n"
7186 __ LoadDImmediate(
V1, 5.0);
7187 __ LoadDImmediate(
V2, 10.0);
7201 double res = EXECUTE_TEST_CODE_DOUBLE(DoubleReturn,
test->entry());
7202 EXPECT_FLOAT_EQ(2.0 - 10.0 * 5.0, res, 0.0001);
7204 "fmovd v1, 5.000000\n"
7205 "fmovd v2, 10.000000\n"
7208 "vrecpss v0, v1, v2\n"
7214 __ LoadDImmediate(
V0, 1.0 / 10.5);
7239 double res = EXECUTE_TEST_CODE_DOUBLE(DoubleReturn,
test->entry());
7240 EXPECT_FLOAT_EQ(42.0, res, 0.0001);
7242 "movz tmp, #0x8618\n"
7243 "movk tmp, #0x1861 lsl 16\n"
7244 "movk tmp, #0x6186 lsl 32\n"
7245 "movk tmp, #0x3fb8 lsl 48\n"
7250 "vrecpss v31, v1, v2\n"
7251 "vmuls v2, v2, v31\n"
7252 "vrecpss v31, v1, v2\n"
7253 "vmuls v2, v2, v31\n"
7254 "vinss v0[0], v2[0]\n"
7255 "vinss v1[0], v2[1]\n"
7256 "vinss v2[0], v2[2]\n"
7257 "vinss v3[0], v2[3]\n"
7262 "faddd v0, v0, v1\n"
7263 "faddd v0, v0, v2\n"
7264 "faddd v0, v0, v3\n"
7268static float arm_reciprocal_sqrt_estimate(
float a) {
7270 if (isinf(
a) || (fabs(
a) >= exp2f(126)))
7277 uint32_t a_bits = bit_cast<uint32_t, float>(
a);
7279 if (((a_bits >> 23) & 1) != 0) {
7281 scaled = (
static_cast<uint64_t
>(0x3fd) << 52) |
7282 ((
static_cast<uint64_t
>(a_bits) & 0x7fffff) << 29);
7285 scaled = (
static_cast<uint64_t
>(0x3fe) << 52) |
7286 ((
static_cast<uint64_t
>(a_bits) & 0x7fffff) << 29);
7289 int32_t result_exp = (380 - ((a_bits >> 23) & 0xff)) / 2;
7291 double scaled_d = bit_cast<double, uint64_t>(scaled);
7292 ASSERT((scaled_d >= 0.25) && (scaled_d < 1.0));
7295 if (scaled_d < 0.5) {
7299 int32_t q0 =
static_cast<int32_t
>(scaled_d * 512.0);
7301 r = 1.0 /
sqrt((
static_cast<double>(q0) + 0.5) / 512.0);
7306 int32_t q1 =
static_cast<int32_t
>(scaled_d * 256.0);
7308 r = 1.0 /
sqrt((
static_cast<double>(q1) + 0.5) / 256.0);
7311 int32_t
s =
static_cast<int>(256.0 * r + 0.5);
7312 double estimate =
static_cast<double>(
s) / 256.0;
7313 ASSERT((estimate >= 1.0) && (estimate <= (511.0 / 256.0)));
7316 int32_t result_bits =
7317 ((result_exp & 0xff) << 23) |
7318 ((bit_cast<uint64_t, double>(estimate) >> 29) & 0x7fffff);
7319 return bit_cast<float, int32_t>(result_bits);
7323 __ LoadDImmediate(
V1, 147.0);
7335 double res = EXECUTE_TEST_CODE_DOUBLE(DoubleReturn,
test->entry());
7336 EXPECT_FLOAT_EQ(arm_reciprocal_sqrt_estimate(147.0), res, 0.0001);
7338 "movz tmp, #0x6000 lsl 32\n"
7339 "movk tmp, #0x4062 lsl 48\n"
7348 __ LoadDImmediate(
V1, 5.0);
7349 __ LoadDImmediate(
V2, 10.0);
7363 double res = EXECUTE_TEST_CODE_DOUBLE(DoubleReturn,
test->entry());
7364 EXPECT_FLOAT_EQ((3.0 - 10.0 * 5.0) / 2.0, res, 0.0001);
7366 "fmovd v1, 5.000000\n"
7367 "fmovd v2, 10.000000\n"
7370 "vrsqrts v0, v1, v2\n"
7376 __ LoadDImmediate(
V1, 147000.0);
7388 double res = EXECUTE_TEST_CODE_DOUBLE(DoubleReturn,
test->entry());
7389 EXPECT_FLOAT_EQ(1.0 /
sqrt(147000.0), res, 0.0001);
7391 "movz tmp, #0xf1c0 lsl 32\n"
7392 "movk tmp, #0x4101 lsl 48\n"
7396 "vmuls v31, v0, v0\n"
7397 "vrsqrts v31, v1, v31\n"
7398 "vmuls v0, v0, v31\n"
7399 "vmuls v31, v0, v0\n"
7400 "vrsqrts v31, v1, v31\n"
7401 "vmuls v0, v0, v31\n"
7416 SPILLS_LR_TO_FRAME(
__ Push(
LR));
7420 __ StoreCompressedIntoObject(
7422 RESTORES_LR_FROM_FRAME(
__ Pop(
LR));
7433const intptr_t kMaxPushedNumber = 913;
7436 __ SetupDartSP((kMaxPushedNumber + 1) * target::kWordSize);
7437 for (intptr_t i = kMaxPushedNumber; i >= 0; i--) {
7438 __ PushImmediate(i);
7440 __ Drop(kMaxPushedNumber);
7449 EXPECT_EQ(kMaxPushedNumber,
7450 EXECUTE_TEST_CODE_INT64(Int64Return,
test->entry()));
7459 typedef intptr_t (*IntPtrReturn)(intptr_t)
DART_UNUSED;
7460 EXPECT_EQ(0xfffffe00,
7461 EXECUTE_TEST_CODE_INTPTR_INTPTR(IntPtrReturn,
test->entry(), -42));
7462 EXPECT_EQ(0, EXECUTE_TEST_CODE_INTPTR_INTPTR(IntPtrReturn,
test->entry(), 0));
7464 EXECUTE_TEST_CODE_INTPTR_INTPTR(IntPtrReturn,
test->entry(), 42));
7466 "andw r0, r0, 0xfffffe00\n"
7476 typedef intptr_t (*IntPtrReturn)(intptr_t)
DART_UNUSED;
7477 EXPECT_EQ(0xffffffd6,
7478 EXECUTE_TEST_CODE_INTPTR_INTPTR(IntPtrReturn,
test->entry(), -42));
7479 EXPECT_EQ(0xfffffe00,
7480 EXECUTE_TEST_CODE_INTPTR_INTPTR(IntPtrReturn,
test->entry(), 0));
7481 EXPECT_EQ(0xfffffe2a,
7482 EXECUTE_TEST_CODE_INTPTR_INTPTR(IntPtrReturn,
test->entry(), 42));
7484 "orrw r0, r0, 0xfffffe00\n"
7494 typedef intptr_t (*IntPtrReturn)(intptr_t)
DART_UNUSED;
7496 EXECUTE_TEST_CODE_INTPTR_INTPTR(IntPtrReturn,
test->entry(), -42));
7497 EXPECT_EQ(0xfffffe00,
7498 EXECUTE_TEST_CODE_INTPTR_INTPTR(IntPtrReturn,
test->entry(), 0));
7499 EXPECT_EQ(0xfffffe2a,
7500 EXECUTE_TEST_CODE_INTPTR_INTPTR(IntPtrReturn,
test->entry(), 42));
7502 "eorw r0, r0, 0xfffffe00\n"
7510 __ LoadImmediate(
R0, 1);
7513 __ LoadImmediate(
R0, 0);
7518 typedef intptr_t (*IntPtrReturn)(intptr_t)
DART_UNUSED;
7520 EXECUTE_TEST_CODE_INTPTR_INTPTR(IntPtrReturn,
test->entry(), -42));
7521 EXPECT_EQ(0, EXECUTE_TEST_CODE_INTPTR_INTPTR(IntPtrReturn,
test->entry(), 0));
7523 EXECUTE_TEST_CODE_INTPTR_INTPTR(IntPtrReturn,
test->entry(), 42));
7525 "tstw r0, 0xfffffe00\n"
7537 __ LoadImmediate(
R0, 0);
7540 __ LoadImmediate(
R0, 1);
7545 typedef intptr_t (*IntPtrReturn)(intptr_t)
DART_UNUSED;
7547 EXECUTE_TEST_CODE_INTPTR_INTPTR(IntPtrReturn,
test->entry(), -513));
7549 EXECUTE_TEST_CODE_INTPTR_INTPTR(IntPtrReturn,
test->entry(), -512));
7551 EXECUTE_TEST_CODE_INTPTR_INTPTR(IntPtrReturn,
test->entry(), -511));
7562#if !defined(TARGET_USES_THREAD_SANITIZER)
7567 __ LoadImmediate(
R1, 0);
7570 __ LoadImmediate(
R0, 0);
7571 __ StoreReleaseToOffset(
R1,
SP, 0);
7572 __ LoadAcquireFromOffset(
R0,
SP, 0);
7580 typedef intptr_t (*StoreReleaseLoadAcquire)(intptr_t)
DART_UNUSED;
7581 EXPECT_EQ(123, EXECUTE_TEST_CODE_INTPTR_INTPTR(StoreReleaseLoadAcquire,
7582 test->entry(), 123));
7585 "sub csp, csp, #0x1000\n"
7586 "str r1, [sp, #-8]!\n"
7588 "str r1, [sp, #-8]!\n"
7593 "ldr r1, [sp], #8 !\n"
7594 "ldr r1, [sp], #8 !\n"
7602 __ LoadImmediate(
R1, 0);
7605 __ LoadImmediate(
R0, 0);
7606 __ sub(
SP,
SP, Operand(1024 * target::kWordSize));
7607 __ StoreReleaseToOffset(
R1,
SP, 1024);
7608 __ LoadAcquireFromOffset(
R0,
SP, 1024);
7609 __ add(
SP,
SP, Operand(1024 * target::kWordSize));
7617 typedef intptr_t (*StoreReleaseLoadAcquire1024)(intptr_t)
DART_UNUSED;
7618 EXPECT_EQ(123, EXECUTE_TEST_CODE_INTPTR_INTPTR(StoreReleaseLoadAcquire1024,
7619 test->entry(), 123));
7622 "sub csp, csp, #0x1000\n"
7623 "str r1, [sp, #-8]!\n"
7625 "str r1, [sp, #-8]!\n"
7628 "sub sp, sp, #0x2000\n"
7629 "add tmp2, sp, #0x400\n"
7631 "add tmp2, sp, #0x400\n"
7633 "add sp, sp, #0x2000\n"
7634 "ldr r1, [sp], #8 !\n"
7635 "ldr r1, [sp], #8 !\n"
7641static void RangeCheck(Assembler* assembler,
Register value,
Register temp) {
7646 __ LoadImmediate(return_reg, Immediate(0));
7649 __ LoadImmediate(return_reg, Immediate(1));
7656 RangeCheck(assembler, value, temp);
7661 result =
test->Invoke<intptr_t, intptr_t>(kErrorCid);
7663 result =
test->Invoke<intptr_t, intptr_t>(kUnwindErrorCid);
7665 result =
test->Invoke<intptr_t, intptr_t>(kFunctionCid);
7667 result =
test->Invoke<intptr_t, intptr_t>(kMintCid);
7674 RangeCheck(assembler, value, temp);
7679 result =
test->Invoke<intptr_t, intptr_t>(kErrorCid);
7681 result =
test->Invoke<intptr_t, intptr_t>(kUnwindErrorCid);
7683 result =
test->Invoke<intptr_t, intptr_t>(kFunctionCid);
7685 result =
test->Invoke<intptr_t, intptr_t>(kMintCid);
7697 __ mov(return_reg, value);
7703 result =
test->Invoke<intptr_t, intptr_t>(kErrorCid);
7704 EXPECT_EQ(kErrorCid,
result);
7705 result =
test->Invoke<intptr_t, intptr_t>(kUnwindErrorCid);
7706 EXPECT_EQ(kUnwindErrorCid,
result);
7707 result =
test->Invoke<intptr_t, intptr_t>(kFunctionCid);
7708 EXPECT_EQ(kFunctionCid,
result);
7709 result =
test->Invoke<intptr_t, intptr_t>(kMintCid);
7710 EXPECT_EQ(kMintCid,
result);
7716 const auto& do_nothing_just_return =
7720 SPILLS_LR_TO_FRAME({
__ PushRegister(
LR); });
7722 const RegisterSet clobbered_regs(
7725 __ PushRegisters(clobbered_regs);
7729 const auto check_all_allocatable_registers_are_preserved_by_call = [&]() {
7731 __ LoadImmediate(reg,
static_cast<int32_t
>(reg));
7733 __ BranchLink(do_nothing_just_return);
7736 if (!FLAG_precompiled_mode && reg ==
CODE_REG)
continue;
7739 __ CompareImmediate(reg,
static_cast<int32_t
>(reg));
7741 __ LoadImmediate(
R0, reg);
7747 check_all_allocatable_registers_are_preserved_by_call();
7749 FLAG_precompiled_mode =
true;
7750 check_all_allocatable_registers_are_preserved_by_call();
7751 FLAG_precompiled_mode =
false;
7753 __ LoadImmediate(
R0, 42);
7755 __ PopRegisters(clobbered_regs);
7756 RESTORES_LR_FROM_FRAME({
__ PopRegister(
LR); });
7762 const intptr_t
result =
test->InvokeWithCodeAndThread<int64_t>();
static void done(const char *config, const char *src, const char *srcOptions, const char *name)
static bool ok(int result)
Type::kYUV Type::kRGBA() int(0.7 *637)
static const Code & Generate(const char *name, const std::function< void(compiler::Assembler *assembler)> &generator)
static const Bool & False()
static const Bool & True()
static const Register ArgumentRegisters[]
static constexpr Register kReturnReg
static intptr_t data_offset()
static intptr_t write_barrier_mask_offset()
static Address Pair(Register rn, int32_t offset=0, AddressType at=PairOffset)
VULKAN_HPP_DEFAULT_DISPATCH_LOADER_DYNAMIC_STORAGE auto & d
static const uint8_t buffer[]
const uint8_t uint32_t uint32_t GError ** error
static int Log2OperandSizeBytes(OperandSize os)
void LeaveTestFrame(Assembler *assembler)
void EnterTestFrame(Assembler *assembler)
constexpr int64_t kMaxInt64
constexpr int64_t kMinInt64
static Utils::BitsRange< Register > RegisterRange(uint32_t regs)
constexpr int32_t kMinInt32
static const ClassId kLastErrorCid
static const ClassId kFirstErrorCid
constexpr RegList kDartAvailableCpuRegs
constexpr int32_t kMaxInt32
SIN Vec< N, float > sqrt(const Vec< N, float > &x)
#define ASSEMBLER_TEST_GENERATE(name, assembler)
#define ASSEMBLER_TEST_RUN(name, test)