837 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
			
		
		
	
	
			837 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
| ; RUN: llvm-mc -triple arm64-apple-darwin -mattr=neon -output-asm-variant=1 -show-encoding -print-imm-hex < %s | FileCheck %s
 | |
| 
 | |
| foo:
 | |
| ;-----------------------------------------------------------------------------
 | |
| ; ADD #0 to/from SP/WSP is a MOV
 | |
| ;-----------------------------------------------------------------------------
 | |
|   add x1, sp, #0
 | |
| ; CHECK: mov x1, sp
 | |
|   add sp, x2, #0
 | |
| ; CHECK: mov sp, x2
 | |
|   add w3, wsp, #0
 | |
| ; CHECK: mov w3, wsp
 | |
|   add wsp, w4, #0
 | |
| ; CHECK: mov wsp, w4
 | |
|   mov x5, sp
 | |
| ; CHECK: mov x5, sp
 | |
|   mov sp, x6
 | |
| ; CHECK: mov sp, x6
 | |
|   mov w7, wsp
 | |
| ; CHECK: mov w7, wsp
 | |
|   mov wsp, w8
 | |
| ; CHECK: mov wsp, w8
 | |
| 
 | |
| ;-----------------------------------------------------------------------------
 | |
| ; ORR Rd, Rn, Rn is a MOV
 | |
| ;-----------------------------------------------------------------------------
 | |
|   orr x2, xzr, x9
 | |
| ; CHECK: mov x2, x9
 | |
|   orr w2, wzr, w9
 | |
| ; CHECK: mov w2, w9
 | |
|   mov x3, x4
 | |
| ; CHECK: mov x3, x4
 | |
|   mov w5, w6
 | |
| ; CHECK: mov w5, w6
 | |
| 
 | |
| ;-----------------------------------------------------------------------------
 | |
| ; TST Xn, #<imm>
 | |
| ;-----------------------------------------------------------------------------
 | |
|         tst w1, #3
 | |
|         tst x1, #3
 | |
|         tst w1, w2
 | |
|         tst x1, x2
 | |
|         ands wzr, w1, w2, lsl #2
 | |
|         ands xzr, x1, x2, lsl #3
 | |
|         tst w3, w7, lsl #31
 | |
|         tst x2, x20, asr #0
 | |
| 
 | |
| ; CHECK: tst	w1, #0x3                ; encoding: [0x3f,0x04,0x00,0x72]
 | |
| ; CHECK: tst	x1, #0x3                ; encoding: [0x3f,0x04,0x40,0xf2]
 | |
| ; CHECK: tst	w1, w2                  ; encoding: [0x3f,0x00,0x02,0x6a]
 | |
| ; CHECK: tst	x1, x2                  ; encoding: [0x3f,0x00,0x02,0xea]
 | |
| ; CHECK: tst	w1, w2, lsl #2          ; encoding: [0x3f,0x08,0x02,0x6a]
 | |
| ; CHECK: tst	x1, x2, lsl #3          ; encoding: [0x3f,0x0c,0x02,0xea]
 | |
| ; CHECK: tst	w3, w7, lsl #31         ; encoding: [0x7f,0x7c,0x07,0x6a]
 | |
| ; CHECK: tst	x2, x20, asr #0         ; encoding: [0x5f,0x00,0x94,0xea]
 | |
| 
 | |
| ;-----------------------------------------------------------------------------
 | |
| ; ADDS to WZR/XZR is a CMN
 | |
| ;-----------------------------------------------------------------------------
 | |
|   cmn w1, #3, lsl #0
 | |
|   cmn x2, #4194304
 | |
|   cmn w4, w5
 | |
|   cmn x6, x7
 | |
|   cmn w8, w9, asr #3
 | |
|   cmn x2, x3, lsr #4
 | |
|   cmn x2, w3, uxtb #1
 | |
|   cmn x4, x5, uxtx #1
 | |
| 
 | |
| ; CHECK: cmn	w1, #0x3                  ; encoding: [0x3f,0x0c,0x00,0x31]
 | |
| ; CHECK: cmn	x2, #0x400, lsl #12      ; encoding: [0x5f,0x00,0x50,0xb1]
 | |
| ; CHECK: cmn	w4, w5                  ; encoding: [0x9f,0x00,0x05,0x2b]
 | |
| ; CHECK: cmn	x6, x7                  ; encoding: [0xdf,0x00,0x07,0xab]
 | |
| ; CHECK: cmn	w8, w9, asr #3          ; encoding: [0x1f,0x0d,0x89,0x2b]
 | |
| ; CHECK: cmn	x2, x3, lsr #4          ; encoding: [0x5f,0x10,0x43,0xab]
 | |
| ; CHECK: cmn	x2, w3, uxtb #1         ; encoding: [0x5f,0x04,0x23,0xab]
 | |
| ; CHECK: cmn	x4, x5, uxtx #1         ; encoding: [0x9f,0x64,0x25,0xab]
 | |
| 
 | |
| 
 | |
| ;-----------------------------------------------------------------------------
 | |
| ; SUBS to WZR/XZR is a CMP
 | |
| ;-----------------------------------------------------------------------------
 | |
|   cmp w1, #1024, lsl #12
 | |
|   cmp x2, #1024
 | |
|   cmp w4, w5
 | |
|   cmp x6, x7
 | |
|   cmp w8, w9, asr #3
 | |
|   cmp x2, x3, lsr #4
 | |
|   cmp x2, w3, uxth #2
 | |
|   cmp x4, x5, uxtx
 | |
|   cmp wzr, w1
 | |
|   cmp x8, w8, uxtw
 | |
|   cmp w9, w8, uxtw
 | |
|   cmp wsp, w9, lsl #0
 | |
| 
 | |
| ; CHECK: cmp	w1, #0x400, lsl #12      ; encoding: [0x3f,0x00,0x50,0x71]
 | |
| ; CHECK: cmp	x2, #0x400               ; encoding: [0x5f,0x00,0x10,0xf1]
 | |
| ; CHECK: cmp	w4, w5                  ; encoding: [0x9f,0x00,0x05,0x6b]
 | |
| ; CHECK: cmp	x6, x7                  ; encoding: [0xdf,0x00,0x07,0xeb]
 | |
| ; CHECK: cmp	w8, w9, asr #3          ; encoding: [0x1f,0x0d,0x89,0x6b]
 | |
| ; CHECK: cmp	x2, x3, lsr #4          ; encoding: [0x5f,0x10,0x43,0xeb]
 | |
| ; CHECK: cmp	x2, w3, uxth #2         ; encoding: [0x5f,0x28,0x23,0xeb]
 | |
| ; CHECK: cmp	x4, x5, uxtx            ; encoding: [0x9f,0x60,0x25,0xeb]
 | |
| ; CHECK: cmp	wzr, w1                 ; encoding: [0xff,0x03,0x01,0x6b]
 | |
| ; CHECK: cmp	x8, w8, uxtw            ; encoding: [0x1f,0x41,0x28,0xeb]
 | |
| ; CHECK: cmp	w9, w8, uxtw            ; encoding: [0x3f,0x41,0x28,0x6b]
 | |
| ; CHECK: cmp	wsp, w9                 ; encoding: [0xff,0x43,0x29,0x6b]
 | |
| 
 | |
| 
 | |
| ;-----------------------------------------------------------------------------
 | |
| ; SUB/SUBS from WZR/XZR is a NEG
 | |
| ;-----------------------------------------------------------------------------
 | |
| 
 | |
|   neg w0, w1
 | |
| ; CHECK: neg w0, w1
 | |
|   neg w0, w1, lsl #1
 | |
| ; CHECK: neg w0, w1, lsl #1
 | |
|   neg x0, x1
 | |
| ; CHECK: neg x0, x1
 | |
|   neg x0, x1, asr #1
 | |
| ; CHECK: neg x0, x1, asr #1
 | |
|   negs w0, w1
 | |
| ; CHECK: negs w0, w1
 | |
|   negs w0, w1, lsl #1
 | |
| ; CHECK: negs w0, w1, lsl #1
 | |
|   negs x0, x1
 | |
| ; CHECK: negs x0, x1
 | |
|   negs x0, x1, asr #1
 | |
| ; CHECK: negs x0, x1, asr #1
 | |
| 
 | |
| ;-----------------------------------------------------------------------------
 | |
| ; MOV aliases
 | |
| ;-----------------------------------------------------------------------------
 | |
| 
 | |
|   mov x0, #281470681743360
 | |
|   mov x0, #18446744073709486080
 | |
| 
 | |
| ; CHECK: mov x0, #0xffff00000000
 | |
| ; CHECK: mov x0, #-0x10000
 | |
| 
 | |
|   mov w0, #0xffffffff
 | |
|   mov w0, #0xffffff00
 | |
|   mov wzr, #0xffffffff
 | |
|   mov wzr, #0xffffff00
 | |
| 
 | |
| ; CHECK: mov   w0, #-0x1
 | |
| ; CHECK: mov   w0, #-0x100
 | |
| ; CHECK: mov   wzr, #-0x1
 | |
| ; CHECK: mov   wzr, #-0x100
 | |
| 
 | |
|   ; 0 can be encoded by MOVZ in multiple ways, only "lsl #0" is a MOV alias.
 | |
|   movz x0, #0
 | |
|   movz x0, #0, lsl #16
 | |
|   movz x0, #0, lsl #32
 | |
|   movz x0, #0, lsl #48
 | |
|   movz w0, #0
 | |
|   movz w0, #0, lsl #16
 | |
| ; CHECK: mov x0, #0x0
 | |
| ; CHECK: movz x0, #0x0, lsl #16
 | |
| ; CHECK: movz x0, #0x0, lsl #32
 | |
| ; CHECK: movz x0, #0x0, lsl #48
 | |
| ; CHECK: mov w0, #0x0
 | |
| ; CHECK: movz w0, #0x0, lsl #16
 | |
| 
 | |
|   ; Similarly to MOVZ, -1 can be encoded in multiple ways, only one of which is
 | |
|   ; "MOV".
 | |
|   movn x0, #0
 | |
|   movn x0, #0, lsl #16
 | |
|   movn x0, #0, lsl #32
 | |
|   movn x0, #0, lsl #48
 | |
|   movn w0, #0
 | |
|   movn w0, #0, lsl #16
 | |
| ; CHECK: mov x0, #-0x1
 | |
| ; CHECK: movn x0, #0x0, lsl #16
 | |
| ; CHECK: movn x0, #0x0, lsl #32
 | |
| ; CHECK: movn x0, #0x0, lsl #48
 | |
| ; CHECK: mov w0, #-0x1
 | |
| ; CHECK: movn w0, #0x0, lsl #16
 | |
| 
 | |
|   ; Two 32-bit immediates are encodable by both MOVN and MOVZ, make sure the MOV
 | |
|   ; corresponds to the MOVZ version.
 | |
|   movz w0, #0xffff
 | |
|   movz w0, #0xffff, lsl #16
 | |
|   movn w0, #0xffff
 | |
|   movn w0, #0xffff, lsl #16
 | |
| ; CHECK: mov w0, #0xffff
 | |
| ; CHECK: mov w0, #-0x10000
 | |
| ; CHECK: movn w0, #0xffff
 | |
| ; CHECK: movn w0, #0xffff, lsl #16
 | |
| 
 | |
|   orr x20, xzr, #0xaaaaaaaaaaaaaaaa
 | |
|   orr w15, wzr, #0xaaaaaaaa
 | |
| ; CHECK: mov x20, #-0x5555555555555556
 | |
| ; CHECK: mov w15, #-0x55555556
 | |
| 
 | |
|   ; ORR is mostly repeating bit sequences and cannot encode -1, so it only
 | |
|   ; overlaps with MOVZ or MOVN if the repeat-width is the whole register. In
 | |
|   ; both cases MOVZ/MOVN are preferred.
 | |
|   orr x3, xzr, #0x1
 | |
|   orr w3, wzr, #0x1
 | |
|   orr x3, xzr, #0x10000
 | |
|   orr w3, wzr, #0x10000
 | |
|   orr x3, xzr, #0x700000000
 | |
|   orr x3, xzr, #0x3000000000000
 | |
| ; CHECK: orr x3, xzr, #0x1
 | |
| ; CHECK: orr w3, wzr, #0x1
 | |
| ; CHECK: orr x3, xzr, #0x10000
 | |
| ; CHECK: orr w3, wzr, #0x10000
 | |
| ; CHECK: orr x3, xzr, #0x700000000
 | |
| ; CHECK: orr x3, xzr, #0x3000000000000
 | |
| 
 | |
| 
 | |
|   orr x5, xzr, #0xfffffffffffffff0
 | |
|   orr w2, wzr, #0xfffffffe
 | |
|   orr x5, xzr, #0xfffffffffcffffff
 | |
|   orr w2, wzr, #0xf0ffffff
 | |
|   orr x5, xzr, #0xffffff00ffffffff
 | |
|   orr x5, xzr, #0x8000ffffffffffff
 | |
| ; CHECK: orr x5, xzr, #0xfffffffffffffff0
 | |
| ; CHECK: orr w2, wzr, #0xfffffffe
 | |
| ; CHECK: orr x5, xzr, #0x8000ffffffffffff
 | |
| 
 | |
|   ; 0xffff is interesting because there are exceptions in the MOVN rules for
 | |
|   ; it. Make sure we don't accidentally fall down any of those holes.
 | |
|   orr w3, wzr, #0xffff0000
 | |
|   orr w3, wzr, #0xffff
 | |
|   orr x3, xzr, #0xffff000000000000
 | |
|   orr x5, xzr, #0x0000ffffffffffff
 | |
| ; CHECK: orr w3, wzr, #0xffff0000
 | |
| ; CHECK: orr w3, wzr, #0xffff
 | |
| ; CHECK: orr x3, xzr, #0xffff000000000000
 | |
| ; CHECK: orr x5, xzr, #0xffffffffffff
 | |
| 
 | |
| ;-----------------------------------------------------------------------------
 | |
| ; MVN aliases
 | |
| ;-----------------------------------------------------------------------------
 | |
| 
 | |
|         mvn w4, w9
 | |
|         mvn x2, x3
 | |
|         orn w4, wzr, w9
 | |
| 
 | |
| ; CHECK: mvn	w4, w9             ; encoding: [0xe4,0x03,0x29,0x2a]
 | |
| ; CHECK: mvn	x2, x3             ; encoding: [0xe2,0x03,0x23,0xaa]
 | |
| ; CHECK: mvn	w4, w9             ; encoding: [0xe4,0x03,0x29,0x2a]
 | |
| 
 | |
|         mvn w4, w9, lsl #1
 | |
|         mvn x2, x3, lsl #1
 | |
|         orn w4, wzr, w9, lsl #1
 | |
| 
 | |
| ; CHECK: mvn	w4, w9, lsl #1     ; encoding: [0xe4,0x07,0x29,0x2a]
 | |
| ; CHECK: mvn	x2, x3, lsl #1     ; encoding: [0xe2,0x07,0x23,0xaa]
 | |
| ; CHECK: mvn	w4, w9, lsl #1     ; encoding: [0xe4,0x07,0x29,0x2a]
 | |
| 
 | |
| ;-----------------------------------------------------------------------------
 | |
| ; Bitfield aliases
 | |
| ;-----------------------------------------------------------------------------
 | |
| 
 | |
|   bfi   w0, w0, #1, #4
 | |
|   bfi   x0, x0, #1, #4
 | |
|   bfi   w0, w0, #0, #2
 | |
|   bfi   x0, x0, #0, #2
 | |
|   bfxil w0, w0, #2, #3
 | |
|   bfxil x0, x0, #2, #3
 | |
|   sbfiz w0, w0, #1, #4
 | |
|   sbfiz x0, x0, #1, #4
 | |
|   sbfx  w0, w0, #2, #3
 | |
|   sbfx  x0, x0, #2, #3
 | |
|   ubfiz w0, w0, #1, #4
 | |
|   ubfiz x0, x0, #1, #4
 | |
|   ubfx  w0, w0, #2, #3
 | |
|   ubfx  x0, x0, #2, #3
 | |
| 
 | |
| ; CHECK: bfi   w0, w0, #1, #4
 | |
| ; CHECK: bfi   x0, x0, #1, #4
 | |
| ; CHECK: bfxil w0, w0, #0, #2
 | |
| ; CHECK: bfxil x0, x0, #0, #2
 | |
| ; CHECK: bfxil w0, w0, #2, #3
 | |
| ; CHECK: bfxil x0, x0, #2, #3
 | |
| ; CHECK: sbfiz w0, w0, #1, #4
 | |
| ; CHECK: sbfiz x0, x0, #1, #4
 | |
| ; CHECK: sbfx  w0, w0, #2, #3
 | |
| ; CHECK: sbfx  x0, x0, #2, #3
 | |
| ; CHECK: ubfiz w0, w0, #1, #4
 | |
| ; CHECK: ubfiz x0, x0, #1, #4
 | |
| ; CHECK: ubfx  w0, w0, #2, #3
 | |
| ; CHECK: ubfx  x0, x0, #2, #3
 | |
| 
 | |
| ;-----------------------------------------------------------------------------
 | |
| ; Shift (immediate) aliases
 | |
| ;-----------------------------------------------------------------------------
 | |
| 
 | |
| ; CHECK: asr w1, w3, #13
 | |
| ; CHECK: asr x1, x3, #13
 | |
| ; CHECK: lsl w0, w0, #1
 | |
| ; CHECK: lsl x0, x0, #1
 | |
| ; CHECK: lsr w0, w0, #4
 | |
| ; CHECK: lsr x0, x0, #4
 | |
| 
 | |
|    sbfm w1, w3, #13, #31
 | |
|    sbfm x1, x3, #13, #63
 | |
|    ubfm w0, w0, #31, #30
 | |
|    ubfm x0, x0, #63, #62
 | |
|    ubfm w0, w0, #4, #31
 | |
|    ubfm x0, x0, #4, #63
 | |
| ; CHECK: ror w1, w3, #0x5
 | |
| ; CHECK: ror x1, x3, #0x5
 | |
|    ror w1, w3, #5
 | |
|    ror x1, x3, #5
 | |
| ; CHECK: lsl w1, wzr, #3
 | |
|    lsl w1, wzr, #3
 | |
| 
 | |
| ;-----------------------------------------------------------------------------
 | |
| ; Sign/Zero extend aliases
 | |
| ;-----------------------------------------------------------------------------
 | |
| 
 | |
|   sxtb  w1, w2
 | |
|   sxth  w1, w2
 | |
|   uxtb  w1, w2
 | |
|   uxth  w1, w2
 | |
| 
 | |
| ; CHECK: sxtb w1, w2
 | |
| ; CHECK: sxth w1, w2
 | |
| ; CHECK: uxtb w1, w2
 | |
| ; CHECK: uxth w1, w2
 | |
| 
 | |
|   sxtb  x1, w2
 | |
|   sxth  x1, w2
 | |
|   sxtw  x1, w2
 | |
|   uxtb  x1, w2
 | |
|   uxth  x1, w2
 | |
|   uxtw  x1, w2
 | |
| 
 | |
| ; CHECK: sxtb x1, w2
 | |
| ; CHECK: sxth x1, w2
 | |
| ; CHECK: sxtw x1, w2
 | |
| ; CHECK: uxtb w1, w2
 | |
| ; CHECK: uxth w1, w2
 | |
| ; CHECK: ubfx x1, x2, #0, #32
 | |
| 
 | |
| ;-----------------------------------------------------------------------------
 | |
| ; Negate with carry
 | |
| ;-----------------------------------------------------------------------------
 | |
| 
 | |
|   ngc   w1, w2
 | |
|   ngc   x1, x2
 | |
|   ngcs  w1, w2
 | |
|   ngcs  x1, x2
 | |
| 
 | |
| ; CHECK: ngc  w1, w2
 | |
| ; CHECK: ngc  x1, x2
 | |
| ; CHECK: ngcs w1, w2
 | |
| ; CHECK: ngcs x1, x2
 | |
| 
 | |
| ;-----------------------------------------------------------------------------
 | |
| ; 6.6.1 Multiply aliases
 | |
| ;-----------------------------------------------------------------------------
 | |
| 
 | |
|   mneg   w1, w2, w3
 | |
|   mneg   x1, x2, x3
 | |
|   mul    w1, w2, w3
 | |
|   mul    x1, x2, x3
 | |
|   smnegl x1, w2, w3
 | |
|   umnegl x1, w2, w3
 | |
|   smull   x1, w2, w3
 | |
|   umull   x1, w2, w3
 | |
| 
 | |
| ; CHECK: mneg w1, w2, w3
 | |
| ; CHECK: mneg x1, x2, x3
 | |
| ; CHECK: mul w1, w2, w3
 | |
| ; CHECK: mul x1, x2, x3
 | |
| ; CHECK: smnegl x1, w2, w3
 | |
| ; CHECK: umnegl x1, w2, w3
 | |
| ; CHECK: smull x1, w2, w3
 | |
| ; CHECK: umull x1, w2, w3
 | |
| 
 | |
| ;-----------------------------------------------------------------------------
 | |
| ; Conditional select aliases
 | |
| ;-----------------------------------------------------------------------------
 | |
| 
 | |
|   cset   w1, eq
 | |
|   cset   x1, eq
 | |
|   csetm  w1, ne
 | |
|   csetm  x1, ne
 | |
|   cinc   w1, w2, lt
 | |
|   cinc   x1, x2, lt
 | |
|   cinv   w1, w2, mi
 | |
|   cinv   x1, x2, mi
 | |
| 
 | |
| ; CHECK: cset  w1, eq
 | |
| ; CHECK: cset  x1, eq
 | |
| ; CHECK: csetm  w1, ne
 | |
| ; CHECK: csetm  x1, ne
 | |
| ; CHECK: cinc  w1, w2, lt
 | |
| ; CHECK: cinc  x1, x2, lt
 | |
| ; CHECK: cinv  w1, w2, mi
 | |
| ; CHECK: cinv  x1, x2, mi
 | |
| 
 | |
| ;-----------------------------------------------------------------------------
 | |
| ; SYS aliases
 | |
| ;-----------------------------------------------------------------------------
 | |
| 
 | |
|   sys #0, c7, c1, #0
 | |
| ; CHECK: ic ialluis
 | |
|   sys #0, c7, c5, #0
 | |
| ; CHECK: ic iallu
 | |
|   sys #3, c7, c5, #1
 | |
| ; CHECK: ic ivau
 | |
| 
 | |
|   sys #3, c7, c4, #1
 | |
| ; CHECK: dc zva
 | |
|   sys #0, c7, c6, #1
 | |
| ; CHECK: dc ivac
 | |
|   sys #0, c7, c6, #2
 | |
| ; CHECK: dc isw
 | |
|   sys #3, c7, c10, #1
 | |
| ; CHECK: dc cvac
 | |
|   sys #0, c7, c10, #2
 | |
| ; CHECK: dc csw
 | |
|   sys #3, c7, c11, #1
 | |
| ; CHECK: dc cvau
 | |
|   sys #3, c7, c14, #1
 | |
| ; CHECK: dc civac
 | |
|   sys #0, c7, c14, #2
 | |
| ; CHECK: dc cisw
 | |
| 
 | |
|   sys #0, c7, c8, #0
 | |
| ; CHECK: at s1e1r
 | |
|   sys #4, c7, c8, #0
 | |
| ; CHECK: at s1e2r
 | |
|   sys #6, c7, c8, #0
 | |
| ; CHECK: at s1e3r
 | |
|   sys #0, c7, c8, #1
 | |
| ; CHECK: at s1e1w
 | |
|   sys #4, c7, c8, #1
 | |
| ; CHECK: at s1e2w
 | |
|   sys #6, c7, c8, #1
 | |
| ; CHECK: at s1e3w
 | |
|   sys #0, c7, c8, #2
 | |
| ; CHECK: at s1e0r
 | |
|   sys #0, c7, c8, #3
 | |
| ; CHECK: at s1e0w
 | |
|   sys #4, c7, c8, #4
 | |
| ; CHECK: at s12e1r
 | |
|   sys #4, c7, c8, #5
 | |
| ; CHECK: at s12e1w
 | |
|   sys #4, c7, c8, #6
 | |
| ; CHECK: at s12e0r
 | |
|   sys #4, c7, c8, #7
 | |
| ; CHECK: at s12e0w
 | |
| 
 | |
|   sys #0, c8, c3, #0
 | |
| ; CHECK: tlbi vmalle1is
 | |
|   sys #4, c8, c3, #0
 | |
| ; CHECK: tlbi alle2is
 | |
|   sys #6, c8, c3, #0
 | |
| ; CHECK: tlbi alle3is
 | |
|   sys #0, c8, c3, #1
 | |
| ; CHECK: tlbi vae1is
 | |
|   sys #4, c8, c3, #1
 | |
| ; CHECK: tlbi vae2is
 | |
|   sys #6, c8, c3, #1
 | |
| ; CHECK: tlbi vae3is
 | |
|   sys #0, c8, c3, #2
 | |
| ; CHECK: tlbi aside1is
 | |
|   sys #0, c8, c3, #3
 | |
| ; CHECK: tlbi vaae1is
 | |
|   sys #4, c8, c3, #4
 | |
| ; CHECK: tlbi alle1is
 | |
|   sys #0, c8, c3, #5
 | |
| ; CHECK: tlbi vale1is
 | |
|   sys #0, c8, c3, #7
 | |
| ; CHECK: tlbi vaale1is
 | |
|   sys #0, c8, c7, #0
 | |
| ; CHECK: tlbi vmalle1
 | |
|   sys #4, c8, c7, #0
 | |
| ; CHECK: tlbi alle2
 | |
|   sys #4, c8, c3, #5
 | |
| ; CHECK: tlbi vale2is
 | |
|   sys #6, c8, c3, #5
 | |
| ; CHECK: tlbi vale3is
 | |
|   sys #6, c8, c7, #0
 | |
| ; CHECK: tlbi alle3
 | |
|   sys #0, c8, c7, #1
 | |
| ; CHECK: tlbi vae1
 | |
|   sys #4, c8, c7, #1
 | |
| ; CHECK: tlbi vae2
 | |
|   sys #6, c8, c7, #1
 | |
| ; CHECK: tlbi vae3
 | |
|   sys #0, c8, c7, #2
 | |
| ; CHECK: tlbi aside1
 | |
|   sys #0, c8, c7, #3
 | |
| ; CHECK: tlbi vaae1
 | |
|   sys #4, c8, c7, #4
 | |
| ; CHECK: tlbi alle1
 | |
|   sys #0, c8, c7, #5
 | |
| ; CHECK: tlbi vale1
 | |
|   sys #4, c8, c7, #5
 | |
| ; CHECK: tlbi vale2
 | |
|   sys #6, c8, c7, #5
 | |
| ; CHECK: tlbi vale3
 | |
|   sys #0, c8, c7, #7
 | |
| ; CHECK: tlbi vaale1
 | |
|   sys #4, c8, c4, #1
 | |
| ; CHECK: tlbi ipas2e1
 | |
|   sys #4, c8, c4, #5
 | |
| ; CHECK: tlbi ipas2le1
 | |
|   sys #4, c8, c0, #1
 | |
| ; CHECK: tlbi ipas2e1is
 | |
|   sys #4, c8, c0, #5
 | |
| ; CHECK: tlbi ipas2le1is
 | |
|   sys #4, c8, c7, #6
 | |
| ; CHECK: tlbi vmalls12e1
 | |
|   sys #4, c8, c3, #6
 | |
| ; CHECK: tlbi vmalls12e1is
 | |
| 
 | |
|   ic ialluis
 | |
| ; CHECK: ic ialluis                 ; encoding: [0x1f,0x71,0x08,0xd5]
 | |
|   ic iallu
 | |
| ; CHECK: ic iallu                   ; encoding: [0x1f,0x75,0x08,0xd5]
 | |
|   ic ivau, x0
 | |
| ; CHECK: ic ivau, x0                ; encoding: [0x20,0x75,0x0b,0xd5]
 | |
| 
 | |
|   dc zva, x0
 | |
| ; CHECK: dc zva, x0                 ; encoding: [0x20,0x74,0x0b,0xd5]
 | |
|   dc ivac, x0
 | |
| ; CHECK: dc ivac, x0                ; encoding: [0x20,0x76,0x08,0xd5]
 | |
|   dc isw, x0
 | |
| ; CHECK: dc isw, x0                 ; encoding: [0x40,0x76,0x08,0xd5]
 | |
|   dc cvac, x0
 | |
| ; CHECK: dc cvac, x0                ; encoding: [0x20,0x7a,0x0b,0xd5]
 | |
|   dc csw, x0
 | |
| ; CHECK: dc csw, x0                 ; encoding: [0x40,0x7a,0x08,0xd5]
 | |
|   dc cvau, x0
 | |
| ; CHECK: dc cvau, x0                ; encoding: [0x20,0x7b,0x0b,0xd5]
 | |
|   dc civac, x0
 | |
| ; CHECK: dc civac, x0               ; encoding: [0x20,0x7e,0x0b,0xd5]
 | |
|   dc cisw, x0
 | |
| ; CHECK: dc cisw, x0                ; encoding: [0x40,0x7e,0x08,0xd5]
 | |
| 
 | |
|   at s1e1r, x0
 | |
| ; CHECK: at s1e1r, x0               ; encoding: [0x00,0x78,0x08,0xd5]
 | |
|   at s1e2r, x0
 | |
| ; CHECK: at s1e2r, x0               ; encoding: [0x00,0x78,0x0c,0xd5]
 | |
|   at s1e3r, x0
 | |
| ; CHECK: at s1e3r, x0               ; encoding: [0x00,0x78,0x0e,0xd5]
 | |
|   at s1e1w, x0
 | |
| ; CHECK: at s1e1w, x0               ; encoding: [0x20,0x78,0x08,0xd5]
 | |
|   at s1e2w, x0
 | |
| ; CHECK: at s1e2w, x0               ; encoding: [0x20,0x78,0x0c,0xd5]
 | |
|   at s1e3w, x0
 | |
| ; CHECK: at s1e3w, x0               ; encoding: [0x20,0x78,0x0e,0xd5]
 | |
|   at s1e0r, x0
 | |
| ; CHECK: at s1e0r, x0               ; encoding: [0x40,0x78,0x08,0xd5]
 | |
|   at s1e0w, x0
 | |
| ; CHECK: at s1e0w, x0               ; encoding: [0x60,0x78,0x08,0xd5]
 | |
|   at s12e1r, x0
 | |
| ; CHECK: at s12e1r, x0              ; encoding: [0x80,0x78,0x0c,0xd5]
 | |
|   at s12e1w, x0
 | |
| ; CHECK: at s12e1w, x0              ; encoding: [0xa0,0x78,0x0c,0xd5]
 | |
|   at s12e0r, x0
 | |
| ; CHECK: at s12e0r, x0              ; encoding: [0xc0,0x78,0x0c,0xd5]
 | |
|   at s12e0w, x0
 | |
| ; CHECK: at s12e0w, x0              ; encoding: [0xe0,0x78,0x0c,0xd5]
 | |
| 
 | |
|   tlbi vmalle1is
 | |
| ; CHECK: tlbi vmalle1is             ; encoding: [0x1f,0x83,0x08,0xd5]
 | |
|   tlbi alle2is
 | |
| ; CHECK: tlbi alle2is               ; encoding: [0x1f,0x83,0x0c,0xd5]
 | |
|   tlbi alle3is
 | |
| ; CHECK: tlbi alle3is               ; encoding: [0x1f,0x83,0x0e,0xd5]
 | |
|   tlbi vae1is, x0
 | |
| ; CHECK: tlbi vae1is, x0            ; encoding: [0x20,0x83,0x08,0xd5]
 | |
|   tlbi vae2is, x0
 | |
| ; CHECK: tlbi vae2is, x0            ; encoding: [0x20,0x83,0x0c,0xd5]
 | |
|   tlbi vae3is, x0
 | |
| ; CHECK: tlbi vae3is, x0            ; encoding: [0x20,0x83,0x0e,0xd5]
 | |
|   tlbi aside1is, x0
 | |
| ; CHECK: tlbi aside1is, x0          ; encoding: [0x40,0x83,0x08,0xd5]
 | |
|   tlbi vaae1is, x0
 | |
| ; CHECK: tlbi vaae1is, x0           ; encoding: [0x60,0x83,0x08,0xd5]
 | |
|   tlbi alle1is
 | |
| ; CHECK: tlbi alle1is               ; encoding: [0x9f,0x83,0x0c,0xd5]
 | |
|   tlbi vale1is, x0
 | |
| ; CHECK: tlbi vale1is, x0           ; encoding: [0xa0,0x83,0x08,0xd5]
 | |
|   tlbi vaale1is, x0
 | |
| ; CHECK: tlbi vaale1is, x0          ; encoding: [0xe0,0x83,0x08,0xd5]
 | |
|   tlbi vmalle1
 | |
| ; CHECK: tlbi vmalle1               ; encoding: [0x1f,0x87,0x08,0xd5]
 | |
|   tlbi alle2
 | |
| ; CHECK: tlbi alle2                 ; encoding: [0x1f,0x87,0x0c,0xd5]
 | |
|   tlbi vale2is, x0
 | |
| ; CHECK: tlbi vale2is, x0           ; encoding: [0xa0,0x83,0x0c,0xd5]
 | |
|   tlbi vale3is, x0
 | |
| ; CHECK: tlbi vale3is, x0           ; encoding: [0xa0,0x83,0x0e,0xd5]
 | |
|   tlbi alle3
 | |
| ; CHECK: tlbi alle3                 ; encoding: [0x1f,0x87,0x0e,0xd5]
 | |
|   tlbi vae1, x0
 | |
| ; CHECK: tlbi vae1, x0              ; encoding: [0x20,0x87,0x08,0xd5]
 | |
|   tlbi vae2, x0
 | |
| ; CHECK: tlbi vae2, x0              ; encoding: [0x20,0x87,0x0c,0xd5]
 | |
|   tlbi vae3, x0
 | |
| ; CHECK: tlbi vae3, x0              ; encoding: [0x20,0x87,0x0e,0xd5]
 | |
|   tlbi aside1, x0
 | |
| ; CHECK: tlbi aside1, x0            ; encoding: [0x40,0x87,0x08,0xd5]
 | |
|   tlbi vaae1, x0
 | |
| ; CHECK: tlbi vaae1, x0             ; encoding: [0x60,0x87,0x08,0xd5]
 | |
|   tlbi alle1
 | |
| ; CHECK: tlbi alle1                 ; encoding: [0x9f,0x87,0x0c,0xd5
 | |
|   tlbi vale1, x0
 | |
| ; CHECK: tlbi vale1, x0             ; encoding: [0xa0,0x87,0x08,0xd5]
 | |
|   tlbi vale2, x0
 | |
| ; CHECK: tlbi vale2, x0             ; encoding: [0xa0,0x87,0x0c,0xd5]
 | |
|   tlbi vale3, x0
 | |
| ; CHECK: tlbi vale3, x0             ; encoding: [0xa0,0x87,0x0e,0xd5]
 | |
|   tlbi vaale1, x0
 | |
| ; CHECK: tlbi vaale1, x0            ; encoding: [0xe0,0x87,0x08,0xd5]
 | |
|   tlbi ipas2e1, x0
 | |
| ; CHECK: tlbi ipas2e1, x0           ; encoding: [0x20,0x84,0x0c,0xd5]
 | |
|   tlbi ipas2le1, x0
 | |
| ; CHECK: tlbi ipas2le1, x0          ; encoding: [0xa0,0x84,0x0c,0xd5]
 | |
|   tlbi ipas2e1is, x0
 | |
| ; CHECK: tlbi ipas2e1is, x0         ; encoding: [0x20,0x80,0x0c,0xd5]
 | |
|   tlbi ipas2le1is, x0
 | |
| ; CHECK: tlbi ipas2le1is, x0        ; encoding: [0xa0,0x80,0x0c,0xd5]
 | |
|   tlbi vmalls12e1
 | |
| ; CHECK: tlbi vmalls12e1            ; encoding: [0xdf,0x87,0x0c,0xd5]
 | |
|   tlbi vmalls12e1is
 | |
| ; CHECK: tlbi vmalls12e1is          ; encoding: [0xdf,0x83,0x0c,0xd5]
 | |
| 
 | |
| ;-----------------------------------------------------------------------------
 | |
| ; 5.8.5 Vector Arithmetic aliases
 | |
| ;-----------------------------------------------------------------------------
 | |
| 
 | |
|   cmls.8b v0, v2, v1
 | |
|   cmls.16b v0, v2, v1
 | |
|   cmls.4h v0, v2, v1
 | |
|   cmls.8h v0, v2, v1
 | |
|   cmls.2s v0, v2, v1
 | |
|   cmls.4s v0, v2, v1
 | |
|   cmls.2d v0, v2, v1
 | |
| ; CHECK: cmhs.8b v0, v1, v2
 | |
| ; CHECK: cmhs.16b v0, v1, v2
 | |
| ; CHECK: cmhs.4h v0, v1, v2
 | |
| ; CHECK: cmhs.8h v0, v1, v2
 | |
| ; CHECK: cmhs.2s v0, v1, v2
 | |
| ; CHECK: cmhs.4s v0, v1, v2
 | |
| ; CHECK: cmhs.2d v0, v1, v2
 | |
| 
 | |
|   cmlo.8b v0, v2, v1
 | |
|   cmlo.16b v0, v2, v1
 | |
|   cmlo.4h v0, v2, v1
 | |
|   cmlo.8h v0, v2, v1
 | |
|   cmlo.2s v0, v2, v1
 | |
|   cmlo.4s v0, v2, v1
 | |
|   cmlo.2d v0, v2, v1
 | |
| ; CHECK: cmhi.8b v0, v1, v2
 | |
| ; CHECK: cmhi.16b v0, v1, v2
 | |
| ; CHECK: cmhi.4h v0, v1, v2
 | |
| ; CHECK: cmhi.8h v0, v1, v2
 | |
| ; CHECK: cmhi.2s v0, v1, v2
 | |
| ; CHECK: cmhi.4s v0, v1, v2
 | |
| ; CHECK: cmhi.2d v0, v1, v2
 | |
| 
 | |
|   cmle.8b v0, v2, v1
 | |
|   cmle.16b v0, v2, v1
 | |
|   cmle.4h v0, v2, v1
 | |
|   cmle.8h  v0, v2, v1
 | |
|   cmle.2s v0, v2, v1
 | |
|   cmle.4s v0, v2, v1
 | |
|   cmle.2d v0, v2, v1
 | |
| ; CHECK: cmge.8b v0, v1, v2
 | |
| ; CHECK: cmge.16b v0, v1, v2
 | |
| ; CHECK: cmge.4h v0, v1, v2
 | |
| ; CHECK: cmge.8h v0, v1, v2
 | |
| ; CHECK: cmge.2s v0, v1, v2
 | |
| ; CHECK: cmge.4s v0, v1, v2
 | |
| ; CHECK: cmge.2d v0, v1, v2
 | |
| 
 | |
|   cmlt.8b v0, v2, v1
 | |
|   cmlt.16b v0, v2, v1
 | |
|   cmlt.4h v0, v2, v1
 | |
|   cmlt.8h  v0, v2, v1
 | |
|   cmlt.2s v0, v2, v1
 | |
|   cmlt.4s v0, v2, v1
 | |
|   cmlt.2d v0, v2, v1
 | |
| ; CHECK: cmgt.8b v0, v1, v2
 | |
| ; CHECK: cmgt.16b v0, v1, v2
 | |
| ; CHECK: cmgt.4h v0, v1, v2
 | |
| ; CHECK: cmgt.8h v0, v1, v2
 | |
| ; CHECK: cmgt.2s v0, v1, v2
 | |
| ; CHECK: cmgt.4s v0, v1, v2
 | |
| ; CHECK: cmgt.2d v0, v1, v2
 | |
| 
 | |
|   fcmle.2s v0, v2, v1
 | |
|   fcmle.4s v0, v2, v1
 | |
|   fcmle.2d v0, v2, v1
 | |
| ; CHECK: fcmge.2s v0, v1, v2
 | |
| ; CHECK: fcmge.4s v0, v1, v2
 | |
| ; CHECK: fcmge.2d v0, v1, v2
 | |
| 
 | |
|   fcmlt.2s v0, v2, v1
 | |
|   fcmlt.4s v0, v2, v1
 | |
|   fcmlt.2d v0, v2, v1
 | |
| ; CHECK: fcmgt.2s v0, v1, v2
 | |
| ; CHECK: fcmgt.4s v0, v1, v2
 | |
| ; CHECK: fcmgt.2d v0, v1, v2
 | |
| 
 | |
|   facle.2s v0, v2, v1
 | |
|   facle.4s v0, v2, v1
 | |
|   facle.2d v0, v2, v1
 | |
| ; CHECK: facge.2s v0, v1, v2
 | |
| ; CHECK: facge.4s v0, v1, v2
 | |
| ; CHECK: facge.2d v0, v1, v2
 | |
| 
 | |
|   faclt.2s v0, v2, v1
 | |
|   faclt.4s v0, v2, v1
 | |
|   faclt.2d v0, v2, v1
 | |
| ; CHECK: facgt.2s v0, v1, v2
 | |
| ; CHECK: facgt.4s v0, v1, v2
 | |
| ; CHECK: facgt.2d v0, v1, v2
 | |
| 
 | |
| ;-----------------------------------------------------------------------------
 | |
| ; 5.8.6 Scalar Arithmetic aliases
 | |
| ;-----------------------------------------------------------------------------
 | |
| 
 | |
|   cmls d0, d2, d1
 | |
| ; CHECK: cmhs d0, d1, d2
 | |
| 
 | |
|   cmle d0, d2, d1
 | |
| ; CHECK: cmge d0, d1, d2
 | |
| 
 | |
|   cmlo d0, d2, d1
 | |
| ; CHECK: cmhi d0, d1, d2
 | |
| 
 | |
|   cmlt d0, d2, d1
 | |
| ; CHECK: cmgt d0, d1, d2
 | |
| 
 | |
|   fcmle s0, s2, s1
 | |
|   fcmle d0, d2, d1
 | |
| ; CHECK: fcmge s0, s1, s2
 | |
| ; CHECK: fcmge d0, d1, d2
 | |
| 
 | |
|   fcmlt s0, s2, s1
 | |
|   fcmlt d0, d2, d1
 | |
| ; CHECK: fcmgt s0, s1, s2
 | |
| ; CHECK: fcmgt d0, d1, d2
 | |
| 
 | |
|   facle s0, s2, s1
 | |
|   facle d0, d2, d1
 | |
| ; CHECK: facge s0, s1, s2
 | |
| ; CHECK: facge d0, d1, d2
 | |
| 
 | |
|   faclt s0, s2, s1
 | |
|   faclt d0, d2, d1
 | |
| ; CHECK: facgt s0, s1, s2
 | |
| ; CHECK: facgt d0, d1, d2
 | |
| 
 | |
| ;-----------------------------------------------------------------------------
 | |
| ; 5.8.14 Vector Shift (immediate)
 | |
| ;-----------------------------------------------------------------------------
 | |
|   sxtl v1.8h, v2.8b
 | |
| ; CHECK: sshll.8h v1, v2, #0
 | |
|   sxtl.8h v1, v2
 | |
| ; CHECK: sshll.8h v1, v2, #0
 | |
| 
 | |
|   sxtl v1.4s, v2.4h
 | |
| ; CHECK: sshll.4s v1, v2, #0
 | |
|   sxtl.4s v1, v2
 | |
| ; CHECK: sshll.4s v1, v2, #0
 | |
| 
 | |
|   sxtl v1.2d, v2.2s
 | |
| ; CHECK: sshll.2d v1, v2, #0
 | |
|   sxtl.2d v1, v2
 | |
| ; CHECK: sshll.2d v1, v2, #0
 | |
| 
 | |
|   sxtl2 v1.8h, v2.16b
 | |
| ; CHECK: sshll2.8h v1, v2, #0
 | |
|   sxtl2.8h v1, v2
 | |
| ; CHECK: sshll2.8h v1, v2, #0
 | |
| 
 | |
|   sxtl2 v1.4s, v2.8h
 | |
| ; CHECK: sshll2.4s v1, v2, #0
 | |
|   sxtl2.4s v1, v2
 | |
| ; CHECK: sshll2.4s v1, v2, #0
 | |
| 
 | |
|   sxtl2 v1.2d, v2.4s
 | |
| ; CHECK: sshll2.2d v1, v2, #0
 | |
|   sxtl2.2d v1, v2
 | |
| ; CHECK: sshll2.2d v1, v2, #0
 | |
| 
 | |
|   uxtl v1.8h, v2.8b
 | |
| ; CHECK: ushll.8h v1, v2, #0
 | |
|   uxtl.8h v1, v2
 | |
| ; CHECK: ushll.8h v1, v2, #0
 | |
| 
 | |
|   uxtl v1.4s, v2.4h
 | |
| ; CHECK: ushll.4s v1, v2, #0
 | |
|   uxtl.4s v1, v2
 | |
| ; CHECK: ushll.4s v1, v2, #0
 | |
| 
 | |
|   uxtl v1.2d, v2.2s
 | |
| ; CHECK: ushll.2d v1, v2, #0
 | |
|   uxtl.2d v1, v2
 | |
| ; CHECK: ushll.2d v1, v2, #0
 | |
| 
 | |
|   uxtl2 v1.8h, v2.16b
 | |
| ; CHECK: ushll2.8h v1, v2, #0
 | |
|   uxtl2.8h v1, v2
 | |
| ; CHECK: ushll2.8h v1, v2, #0
 | |
| 
 | |
|   uxtl2 v1.4s, v2.8h
 | |
| ; CHECK: ushll2.4s v1, v2, #0
 | |
|   uxtl2.4s v1, v2
 | |
| ; CHECK: ushll2.4s v1, v2, #0
 | |
| 
 | |
|   uxtl2 v1.2d, v2.4s
 | |
| ; CHECK: ushll2.2d v1, v2, #0
 | |
|   uxtl2.2d v1, v2
 | |
| ; CHECK: ushll2.2d v1, v2, #0
 | |
| 
 | |
| 
 | |
| ;-----------------------------------------------------------------------------
 | |
| ; MOVI verbose syntax with shift operand omitted.
 | |
| ;-----------------------------------------------------------------------------
 | |
|   movi v4.16b, #0x00
 | |
|   movi v4.16B, #0x01
 | |
|   movi v4.8b, #0x02
 | |
|   movi v4.8B, #0x03
 | |
|   movi v1.2d, #0x000000000000ff
 | |
|   movi v2.2D, #0x000000000000ff
 | |
| 
 | |
| ; CHECK: movi.16b	v4, #0x0              ; encoding: [0x04,0xe4,0x00,0x4f]
 | |
| ; CHECK: movi.16b	v4, #0x1              ; encoding: [0x24,0xe4,0x00,0x4f]
 | |
| ; CHECK: movi.8b	v4, #0x2               ; encoding: [0x44,0xe4,0x00,0x0f]
 | |
| ; CHECK: movi.8b	v4, #0x3               ; encoding: [0x64,0xe4,0x00,0x0f]
 | |
| ; CHECK: movi.2d	v1, #0x000000000000ff ; encoding: [0x21,0xe4,0x00,0x6f]
 | |
| ; CHECK: movi.2d	v2, #0x000000000000ff ; encoding: [0x22,0xe4,0x00,0x6f]
 |