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]
|