1 ; RUN: llvm-mc -triple arm64-apple-darwin -mattr=neon -output-asm-variant=1 -show-encoding < %s | FileCheck %s
4 ;-----------------------------------------------------------------------------
5 ; ADD #0 to/from SP/WSP is a MOV
6 ;-----------------------------------------------------------------------------
24 ;-----------------------------------------------------------------------------
25 ; ORR Rd, Rn, Rn is a MOV
26 ;-----------------------------------------------------------------------------
36 ;-----------------------------------------------------------------------------
38 ;-----------------------------------------------------------------------------
43 ands wzr, w1, w2, lsl #2
44 ands xzr, x1, x2, lsl #3
48 ; CHECK: tst w1, #0x3 ; encoding: [0x3f,0x04,0x00,0x72]
49 ; CHECK: tst x1, #0x3 ; encoding: [0x3f,0x04,0x40,0xf2]
50 ; CHECK: tst w1, w2 ; encoding: [0x3f,0x00,0x02,0x6a]
51 ; CHECK: tst x1, x2 ; encoding: [0x3f,0x00,0x02,0xea]
52 ; CHECK: tst w1, w2, lsl #2 ; encoding: [0x3f,0x08,0x02,0x6a]
53 ; CHECK: tst x1, x2, lsl #3 ; encoding: [0x3f,0x0c,0x02,0xea]
54 ; CHECK: tst w3, w7, lsl #31 ; encoding: [0x7f,0x7c,0x07,0x6a]
55 ; CHECK: tst x2, x20, asr #0 ; encoding: [0x5f,0x00,0x94,0xea]
57 ;-----------------------------------------------------------------------------
58 ; ADDS to WZR/XZR is a CMN
59 ;-----------------------------------------------------------------------------
69 ; CHECK: cmn w1, #3 ; encoding: [0x3f,0x0c,0x00,0x31]
70 ; CHECK: cmn x2, #1024, lsl #12 ; encoding: [0x5f,0x00,0x50,0xb1]
71 ; CHECK: cmn w4, w5 ; encoding: [0x9f,0x00,0x05,0x2b]
72 ; CHECK: cmn x6, x7 ; encoding: [0xdf,0x00,0x07,0xab]
73 ; CHECK: cmn w8, w9, asr #3 ; encoding: [0x1f,0x0d,0x89,0x2b]
74 ; CHECK: cmn x2, x3, lsr #4 ; encoding: [0x5f,0x10,0x43,0xab]
75 ; CHECK: cmn x2, w3, uxtb #1 ; encoding: [0x5f,0x04,0x23,0xab]
76 ; CHECK: cmn x4, x5, uxtx #1 ; encoding: [0x9f,0x64,0x25,0xab]
79 ;-----------------------------------------------------------------------------
80 ; SUBS to WZR/XZR is a CMP
81 ;-----------------------------------------------------------------------------
82 cmp w1, #1024, lsl #12
95 ; CHECK: cmp w1, #1024, lsl #12 ; encoding: [0x3f,0x00,0x50,0x71]
96 ; CHECK: cmp x2, #1024 ; encoding: [0x5f,0x00,0x10,0xf1]
97 ; CHECK: cmp w4, w5 ; encoding: [0x9f,0x00,0x05,0x6b]
98 ; CHECK: cmp x6, x7 ; encoding: [0xdf,0x00,0x07,0xeb]
99 ; CHECK: cmp w8, w9, asr #3 ; encoding: [0x1f,0x0d,0x89,0x6b]
100 ; CHECK: cmp x2, x3, lsr #4 ; encoding: [0x5f,0x10,0x43,0xeb]
101 ; CHECK: cmp x2, w3, uxth #2 ; encoding: [0x5f,0x28,0x23,0xeb]
102 ; CHECK: cmp x4, x5, uxtx ; encoding: [0x9f,0x60,0x25,0xeb]
103 ; CHECK: cmp wzr, w1 ; encoding: [0xff,0x03,0x01,0x6b]
104 ; CHECK: cmp x8, w8, uxtw ; encoding: [0x1f,0x41,0x28,0xeb]
105 ; CHECK: cmp w9, w8, uxtw ; encoding: [0x3f,0x41,0x28,0x6b]
106 ; CHECK: cmp wsp, w9 ; encoding: [0xff,0x43,0x29,0x6b]
109 ;-----------------------------------------------------------------------------
110 ; SUB/SUBS from WZR/XZR is a NEG
111 ;-----------------------------------------------------------------------------
116 ; CHECK: neg w0, w1, lsl #1
120 ; CHECK: neg x0, x1, asr #1
124 ; CHECK: negs w0, w1, lsl #1
128 ; CHECK: negs x0, x1, asr #1
130 ;-----------------------------------------------------------------------------
132 ;-----------------------------------------------------------------------------
134 mov x0, #281470681743360
135 mov x0, #18446744073709486080
137 ; CHECK: movz x0, #0xffff, lsl #32
138 ; CHECK: movn x0, #0xffff
146 ; CHECK: movn w0, #0xff
147 ; CHECK: movn wzr, #0
148 ; CHECK: movn wzr, #0xff
150 ;-----------------------------------------------------------------------------
152 ;-----------------------------------------------------------------------------
158 ; CHECK: mvn w4, w9 ; encoding: [0xe4,0x03,0x29,0x2a]
159 ; CHECK: mvn x2, x3 ; encoding: [0xe2,0x03,0x23,0xaa]
160 ; CHECK: mvn w4, w9 ; encoding: [0xe4,0x03,0x29,0x2a]
164 orn w4, wzr, w9, lsl #1
166 ; CHECK: mvn w4, w9, lsl #1 ; encoding: [0xe4,0x07,0x29,0x2a]
167 ; CHECK: mvn x2, x3, lsl #1 ; encoding: [0xe2,0x07,0x23,0xaa]
168 ; CHECK: mvn w4, w9, lsl #1 ; encoding: [0xe4,0x07,0x29,0x2a]
170 ;-----------------------------------------------------------------------------
172 ;-----------------------------------------------------------------------------
189 ; CHECK: bfi w0, w0, #1, #4
190 ; CHECK: bfi x0, x0, #1, #4
191 ; CHECK: bfxil w0, w0, #0, #2
192 ; CHECK: bfxil x0, x0, #0, #2
193 ; CHECK: bfxil w0, w0, #2, #3
194 ; CHECK: bfxil x0, x0, #2, #3
195 ; CHECK: sbfiz w0, w0, #1, #4
196 ; CHECK: sbfiz x0, x0, #1, #4
197 ; CHECK: sbfx w0, w0, #2, #3
198 ; CHECK: sbfx x0, x0, #2, #3
199 ; CHECK: ubfiz w0, w0, #1, #4
200 ; CHECK: ubfiz x0, x0, #1, #4
201 ; CHECK: ubfx w0, w0, #2, #3
202 ; CHECK: ubfx x0, x0, #2, #3
204 ;-----------------------------------------------------------------------------
205 ; Shift (immediate) aliases
206 ;-----------------------------------------------------------------------------
208 ; CHECK: asr w1, w3, #13
209 ; CHECK: asr x1, x3, #13
210 ; CHECK: lsl w0, w0, #1
211 ; CHECK: lsl x0, x0, #1
212 ; CHECK: lsr w0, w0, #4
213 ; CHECK: lsr x0, x0, #4
215 sbfm w1, w3, #13, #31
216 sbfm x1, x3, #13, #63
217 ubfm w0, w0, #31, #30
218 ubfm x0, x0, #63, #62
221 ; CHECK: ror w1, w3, #5
222 ; CHECK: ror x1, x3, #5
225 ; CHECK: lsl w1, wzr, #3
228 ;-----------------------------------------------------------------------------
229 ; Sign/Zero extend aliases
230 ;-----------------------------------------------------------------------------
254 ; CHECK: ubfx x1, x2, #0, #32
256 ;-----------------------------------------------------------------------------
258 ;-----------------------------------------------------------------------------
270 ;-----------------------------------------------------------------------------
271 ; 6.6.1 Multiply aliases
272 ;-----------------------------------------------------------------------------
283 ; CHECK: mneg w1, w2, w3
284 ; CHECK: mneg x1, x2, x3
285 ; CHECK: mul w1, w2, w3
286 ; CHECK: mul x1, x2, x3
287 ; CHECK: smnegl x1, w2, w3
288 ; CHECK: umnegl x1, w2, w3
289 ; CHECK: smull x1, w2, w3
290 ; CHECK: umull x1, w2, w3
292 ;-----------------------------------------------------------------------------
293 ; Conditional select aliases
294 ;-----------------------------------------------------------------------------
307 ; CHECK: csetm w1, ne
308 ; CHECK: csetm x1, ne
309 ; CHECK: cinc w1, w2, lt
310 ; CHECK: cinc x1, x2, lt
311 ; CHECK: cinv w1, w2, mi
312 ; CHECK: cinv x1, x2, mi
314 ;-----------------------------------------------------------------------------
316 ;-----------------------------------------------------------------------------
368 ; CHECK: tlbi vmalle1is
370 ; CHECK: tlbi alle2is
372 ; CHECK: tlbi alle3is
380 ; CHECK: tlbi aside1is
382 ; CHECK: tlbi vaae1is
384 ; CHECK: tlbi alle1is
386 ; CHECK: tlbi vale1is
388 ; CHECK: tlbi vaale1is
390 ; CHECK: tlbi vmalle1
394 ; CHECK: tlbi vale2is
396 ; CHECK: tlbi vale3is
420 ; CHECK: tlbi ipas2e1
422 ; CHECK: tlbi ipas2le1
424 ; CHECK: tlbi ipas2e1is
426 ; CHECK: tlbi ipas2le1is
428 ; CHECK: tlbi vmalls12e1
430 ; CHECK: tlbi vmalls12e1is
433 ; CHECK: ic ialluis ; encoding: [0x1f,0x71,0x08,0xd5]
435 ; CHECK: ic iallu ; encoding: [0x1f,0x75,0x08,0xd5]
437 ; CHECK: ic ivau, x0 ; encoding: [0x20,0x75,0x0b,0xd5]
440 ; CHECK: dc zva, x0 ; encoding: [0x20,0x74,0x0b,0xd5]
442 ; CHECK: dc ivac, x0 ; encoding: [0x20,0x76,0x08,0xd5]
444 ; CHECK: dc isw, x0 ; encoding: [0x40,0x76,0x08,0xd5]
446 ; CHECK: dc cvac, x0 ; encoding: [0x20,0x7a,0x0b,0xd5]
448 ; CHECK: dc csw, x0 ; encoding: [0x40,0x7a,0x08,0xd5]
450 ; CHECK: dc cvau, x0 ; encoding: [0x20,0x7b,0x0b,0xd5]
452 ; CHECK: dc civac, x0 ; encoding: [0x20,0x7e,0x0b,0xd5]
454 ; CHECK: dc cisw, x0 ; encoding: [0x40,0x7e,0x08,0xd5]
457 ; CHECK: at s1e1r, x0 ; encoding: [0x00,0x78,0x08,0xd5]
459 ; CHECK: at s1e2r, x0 ; encoding: [0x00,0x78,0x0c,0xd5]
461 ; CHECK: at s1e3r, x0 ; encoding: [0x00,0x78,0x0e,0xd5]
463 ; CHECK: at s1e1w, x0 ; encoding: [0x20,0x78,0x08,0xd5]
465 ; CHECK: at s1e2w, x0 ; encoding: [0x20,0x78,0x0c,0xd5]
467 ; CHECK: at s1e3w, x0 ; encoding: [0x20,0x78,0x0e,0xd5]
469 ; CHECK: at s1e0r, x0 ; encoding: [0x40,0x78,0x08,0xd5]
471 ; CHECK: at s1e0w, x0 ; encoding: [0x60,0x78,0x08,0xd5]
473 ; CHECK: at s12e1r, x0 ; encoding: [0x80,0x78,0x0c,0xd5]
475 ; CHECK: at s12e1w, x0 ; encoding: [0xa0,0x78,0x0c,0xd5]
477 ; CHECK: at s12e0r, x0 ; encoding: [0xc0,0x78,0x0c,0xd5]
479 ; CHECK: at s12e0w, x0 ; encoding: [0xe0,0x78,0x0c,0xd5]
482 ; CHECK: tlbi vmalle1is ; encoding: [0x1f,0x83,0x08,0xd5]
484 ; CHECK: tlbi alle2is ; encoding: [0x1f,0x83,0x0c,0xd5]
486 ; CHECK: tlbi alle3is ; encoding: [0x1f,0x83,0x0e,0xd5]
488 ; CHECK: tlbi vae1is, x0 ; encoding: [0x20,0x83,0x08,0xd5]
490 ; CHECK: tlbi vae2is, x0 ; encoding: [0x20,0x83,0x0c,0xd5]
492 ; CHECK: tlbi vae3is, x0 ; encoding: [0x20,0x83,0x0e,0xd5]
494 ; CHECK: tlbi aside1is, x0 ; encoding: [0x40,0x83,0x08,0xd5]
496 ; CHECK: tlbi vaae1is, x0 ; encoding: [0x60,0x83,0x08,0xd5]
498 ; CHECK: tlbi alle1is ; encoding: [0x9f,0x83,0x0c,0xd5]
500 ; CHECK: tlbi vale1is, x0 ; encoding: [0xa0,0x83,0x08,0xd5]
502 ; CHECK: tlbi vaale1is, x0 ; encoding: [0xe0,0x83,0x08,0xd5]
504 ; CHECK: tlbi vmalle1 ; encoding: [0x1f,0x87,0x08,0xd5]
506 ; CHECK: tlbi alle2 ; encoding: [0x1f,0x87,0x0c,0xd5]
508 ; CHECK: tlbi vale2is, x0 ; encoding: [0xa0,0x83,0x0c,0xd5]
510 ; CHECK: tlbi vale3is, x0 ; encoding: [0xa0,0x83,0x0e,0xd5]
512 ; CHECK: tlbi alle3 ; encoding: [0x1f,0x87,0x0e,0xd5]
514 ; CHECK: tlbi vae1, x0 ; encoding: [0x20,0x87,0x08,0xd5]
516 ; CHECK: tlbi vae2, x0 ; encoding: [0x20,0x87,0x0c,0xd5]
518 ; CHECK: tlbi vae3, x0 ; encoding: [0x20,0x87,0x0e,0xd5]
520 ; CHECK: tlbi aside1, x0 ; encoding: [0x40,0x87,0x08,0xd5]
522 ; CHECK: tlbi vaae1, x0 ; encoding: [0x60,0x87,0x08,0xd5]
524 ; CHECK: tlbi alle1 ; encoding: [0x9f,0x87,0x0c,0xd5
526 ; CHECK: tlbi vale1, x0 ; encoding: [0xa0,0x87,0x08,0xd5]
528 ; CHECK: tlbi vale2, x0 ; encoding: [0xa0,0x87,0x0c,0xd5]
530 ; CHECK: tlbi vale3, x0 ; encoding: [0xa0,0x87,0x0e,0xd5]
532 ; CHECK: tlbi vaale1, x0 ; encoding: [0xe0,0x87,0x08,0xd5]
534 ; CHECK: tlbi ipas2e1, x0 ; encoding: [0x20,0x84,0x0c,0xd5]
536 ; CHECK: tlbi ipas2le1, x0 ; encoding: [0xa0,0x84,0x0c,0xd5]
538 ; CHECK: tlbi ipas2e1is, x0 ; encoding: [0x20,0x80,0x0c,0xd5]
540 ; CHECK: tlbi ipas2le1is, x0 ; encoding: [0xa0,0x80,0x0c,0xd5]
542 ; CHECK: tlbi vmalls12e1 ; encoding: [0xdf,0x87,0x0c,0xd5]
544 ; CHECK: tlbi vmalls12e1is ; encoding: [0xdf,0x83,0x0c,0xd5]
546 ;-----------------------------------------------------------------------------
547 ; 5.8.5 Vector Arithmetic aliases
548 ;-----------------------------------------------------------------------------
557 ; CHECK: cmhs.8b v0, v1, v2
558 ; CHECK: cmhs.16b v0, v1, v2
559 ; CHECK: cmhs.4h v0, v1, v2
560 ; CHECK: cmhs.8h v0, v1, v2
561 ; CHECK: cmhs.2s v0, v1, v2
562 ; CHECK: cmhs.4s v0, v1, v2
563 ; CHECK: cmhs.2d v0, v1, v2
572 ; CHECK: cmhi.8b v0, v1, v2
573 ; CHECK: cmhi.16b v0, v1, v2
574 ; CHECK: cmhi.4h v0, v1, v2
575 ; CHECK: cmhi.8h v0, v1, v2
576 ; CHECK: cmhi.2s v0, v1, v2
577 ; CHECK: cmhi.4s v0, v1, v2
578 ; CHECK: cmhi.2d v0, v1, v2
587 ; CHECK: cmge.8b v0, v1, v2
588 ; CHECK: cmge.16b v0, v1, v2
589 ; CHECK: cmge.4h v0, v1, v2
590 ; CHECK: cmge.8h v0, v1, v2
591 ; CHECK: cmge.2s v0, v1, v2
592 ; CHECK: cmge.4s v0, v1, v2
593 ; CHECK: cmge.2d v0, v1, v2
602 ; CHECK: cmgt.8b v0, v1, v2
603 ; CHECK: cmgt.16b v0, v1, v2
604 ; CHECK: cmgt.4h v0, v1, v2
605 ; CHECK: cmgt.8h v0, v1, v2
606 ; CHECK: cmgt.2s v0, v1, v2
607 ; CHECK: cmgt.4s v0, v1, v2
608 ; CHECK: cmgt.2d v0, v1, v2
613 ; CHECK: fcmge.2s v0, v1, v2
614 ; CHECK: fcmge.4s v0, v1, v2
615 ; CHECK: fcmge.2d v0, v1, v2
620 ; CHECK: fcmgt.2s v0, v1, v2
621 ; CHECK: fcmgt.4s v0, v1, v2
622 ; CHECK: fcmgt.2d v0, v1, v2
627 ; CHECK: facge.2s v0, v1, v2
628 ; CHECK: facge.4s v0, v1, v2
629 ; CHECK: facge.2d v0, v1, v2
634 ; CHECK: facgt.2s v0, v1, v2
635 ; CHECK: facgt.4s v0, v1, v2
636 ; CHECK: facgt.2d v0, v1, v2
638 ;-----------------------------------------------------------------------------
639 ; 5.8.6 Scalar Arithmetic aliases
640 ;-----------------------------------------------------------------------------
643 ; CHECK: cmhs d0, d1, d2
646 ; CHECK: cmge d0, d1, d2
649 ; CHECK: cmhi d0, d1, d2
652 ; CHECK: cmgt d0, d1, d2
656 ; CHECK: fcmge s0, s1, s2
657 ; CHECK: fcmge d0, d1, d2
661 ; CHECK: fcmgt s0, s1, s2
662 ; CHECK: fcmgt d0, d1, d2
666 ; CHECK: facge s0, s1, s2
667 ; CHECK: facge d0, d1, d2
671 ; CHECK: facgt s0, s1, s2
672 ; CHECK: facgt d0, d1, d2
674 ;-----------------------------------------------------------------------------
675 ; 5.8.14 Vector Shift (immediate)
676 ;-----------------------------------------------------------------------------
678 ; CHECK: sshll.8h v1, v2, #0
680 ; CHECK: sshll.8h v1, v2, #0
683 ; CHECK: sshll.4s v1, v2, #0
685 ; CHECK: sshll.4s v1, v2, #0
688 ; CHECK: sshll.2d v1, v2, #0
690 ; CHECK: sshll.2d v1, v2, #0
693 ; CHECK: sshll2.8h v1, v2, #0
695 ; CHECK: sshll2.8h v1, v2, #0
698 ; CHECK: sshll2.4s v1, v2, #0
700 ; CHECK: sshll2.4s v1, v2, #0
703 ; CHECK: sshll2.2d v1, v2, #0
705 ; CHECK: sshll2.2d v1, v2, #0
708 ; CHECK: ushll.8h v1, v2, #0
710 ; CHECK: ushll.8h v1, v2, #0
713 ; CHECK: ushll.4s v1, v2, #0
715 ; CHECK: ushll.4s v1, v2, #0
718 ; CHECK: ushll.2d v1, v2, #0
720 ; CHECK: ushll.2d v1, v2, #0
723 ; CHECK: ushll2.8h v1, v2, #0
725 ; CHECK: ushll2.8h v1, v2, #0
728 ; CHECK: ushll2.4s v1, v2, #0
730 ; CHECK: ushll2.4s v1, v2, #0
733 ; CHECK: ushll2.2d v1, v2, #0
735 ; CHECK: ushll2.2d v1, v2, #0
738 ;-----------------------------------------------------------------------------
739 ; MOVI verbose syntax with shift operand omitted.
740 ;-----------------------------------------------------------------------------
745 movi v1.2d, #0x000000000000ff
746 movi v2.2D, #0x000000000000ff
748 ; CHECK: movi.16b v4, #0 ; encoding: [0x04,0xe4,0x00,0x4f]
749 ; CHECK: movi.16b v4, #0x1 ; encoding: [0x24,0xe4,0x00,0x4f]
750 ; CHECK: movi.8b v4, #0x2 ; encoding: [0x44,0xe4,0x00,0x0f]
751 ; CHECK: movi.8b v4, #0x3 ; encoding: [0x64,0xe4,0x00,0x0f]
752 ; CHECK: movi.2d v1, #0x000000000000ff ; encoding: [0x21,0xe4,0x00,0x6f]
753 ; CHECK: movi.2d v2, #0x000000000000ff ; encoding: [0x22,0xe4,0x00,0x6f]