1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -verify-machineinstrs -mtriple=aarch64-none-linux-gnu -mattr=+neon | FileCheck %s
4 define <4 x half> @shuffle1(<2 x half> %a, <2 x half> %b) {
5 ; CHECK-LABEL: shuffle1:
6 ; CHECK: // %bb.0: // %entry
7 ; CHECK-NEXT: zip1 v0.2s, v1.2s, v0.2s
10 %res = shufflevector <2 x half> %a, <2 x half> %b, <4 x i32> <i32 2, i32 3, i32 0, i32 undef>
14 define <4 x half> @shuffle2(<2 x half> %a, <2 x half> %b) {
15 ; CHECK-LABEL: shuffle2:
16 ; CHECK: // %bb.0: // %entry
17 ; CHECK-NEXT: zip1 v0.2s, v0.2s, v1.2s
20 %res = shufflevector <2 x half> %a, <2 x half> %b, <4 x i32> <i32 undef, i32 1, i32 2, i32 undef>
24 define <4 x i32> @shuffle3(<4 x i32> %a, <4 x i32> %b) {
25 ; CHECK-LABEL: shuffle3:
26 ; CHECK: // %bb.0: // %entry
27 ; CHECK-NEXT: mov v0.d[0], v1.d[1]
30 %res = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 6, i32 7, i32 2, i32 3>
34 define <4 x float> @shuffle4(<4 x float> %a, <4 x float> %b) {
35 ; CHECK-LABEL: shuffle4:
36 ; CHECK: // %bb.0: // %entry
37 ; CHECK-NEXT: mov v0.d[1], v1.d[1]
40 %res = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 0, i32 1, i32 6, i32 7>
44 define <16 x i8> @shuffle5(<16 x i8> %a, <16 x i8> %b) {
45 ; CHECK-LABEL: shuffle5:
46 ; CHECK: // %bb.0: // %entry
47 ; CHECK-NEXT: uzp1 v0.8h, v0.8h, v1.8h
50 %res = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 0, i32 1, i32 4, i32 5,
51 i32 8, i32 9, i32 12, i32 13,
52 i32 16, i32 17, i32 20, i32 21,
53 i32 24, i32 25, i32 28, i32 29>
57 define <16 x i8> @shuffle6(<16 x i8> %a, <16 x i8> %b) {
58 ; CHECK-LABEL: shuffle6:
59 ; CHECK: // %bb.0: // %entry
60 ; CHECK-NEXT: trn1 v0.8h, v0.8h, v1.8h
63 %res = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 0, i32 1, i32 16, i32 17,
64 i32 4, i32 5, i32 20, i32 21,
65 i32 8, i32 9, i32 24, i32 25,
66 i32 12, i32 13, i32 28, i32 29>
70 define <8 x i8> @shuffle7(<8 x i8> %a, <8 x i8> %b) {
71 ; CHECK-LABEL: shuffle7:
72 ; CHECK: // %bb.0: // %entry
73 ; CHECK-NEXT: uzp2 v0.4h, v0.4h, v1.4h
76 %res = shufflevector <8 x i8> %a, <8 x i8> %b, <8 x i32> <i32 2, i32 3, i32 6, i32 undef,
77 i32 undef, i32 11, i32 14, i32 undef>
81 define <8 x i8> @shuffle8(<8 x i8> %a, <8 x i8> %b) {
82 ; CHECK-LABEL: shuffle8:
83 ; CHECK: // %bb.0: // %entry
84 ; CHECK-NEXT: trn2 v0.4h, v0.4h, v1.4h
87 %res = shufflevector <8 x i8> %a, <8 x i8> %b, <8 x i32> <i32 2, i32 3, i32 10, i32 undef,
88 i32 undef, i32 7, i32 14, i32 undef>
93 define <8 x i8> @shuffle9(<8 x i8> %a) {
94 ; CHECK-LABEL: shuffle9:
96 ; CHECK-NEXT: rev32 v0.4h, v0.4h
98 %res = shufflevector <8 x i8> %a, <8 x i8> undef, <8 x i32> <i32 2, i32 3, i32 0, i32 1,
99 i32 6, i32 7, i32 4, i32 5>
103 define <8 x i16> @shuffle10(<8 x i16> %a) {
104 ; CHECK-LABEL: shuffle10:
106 ; CHECK-NEXT: rev64 v0.4s, v0.4s
108 %res = shufflevector <8 x i16> %a, <8 x i16> undef, <8 x i32> <i32 2, i32 3, i32 0, i32 1,
109 i32 undef, i32 undef, i32 4, i32 5>
113 define <4 x i16> @shuffle11(<8 x i16> %a, <8 x i16> %b) {
114 ; CHECK-LABEL: shuffle11:
115 ; CHECK: // %bb.0: // %entry
116 ; CHECK-NEXT: mov v1.s[1], v0.s[0]
117 ; CHECK-NEXT: fmov d0, d1
120 %res = shufflevector <8 x i16> %a, <8 x i16> %b, <4 x i32> <i32 8, i32 9, i32 0, i32 1>
124 define <8 x i8> @shuffle12(<8 x i8> %a, <8 x i8> %b) {
125 ; CHECK-LABEL: shuffle12:
126 ; CHECK: // %bb.0: // %entry
127 ; CHECK-NEXT: uzp1 v0.4h, v0.4h, v1.4h
128 ; CHECK-NEXT: trn2 v0.4h, v0.4h, v0.4h
131 %res = shufflevector <8 x i8> %a, <8 x i8> %b, <8 x i32> <i32 4, i32 5, i32 4, i32 undef,
132 i32 undef, i32 13, i32 12, i32 undef>
136 define <8 x i16> @shuffle_widen_faili1(<4 x i16> %a, <4 x i16> %b) {
137 ; CHECK-LABEL: shuffle_widen_faili1:
138 ; CHECK: // %bb.0: // %entry
139 ; CHECK-NEXT: adrp x8, .LCPI12_0
140 ; CHECK-NEXT: // kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
141 ; CHECK-NEXT: ldr q2, [x8, :lo12:.LCPI12_0]
142 ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
143 ; CHECK-NEXT: tbl v0.16b, { v0.16b, v1.16b }, v2.16b
146 %res = shufflevector <4 x i16> %a, <4 x i16> %b, <8 x i32> <i32 7, i32 6, i32 0, i32 1,
147 i32 3, i32 2, i32 4, i32 5>
151 define <8 x i16> @shuffle_widen_fail2(<4 x i16> %a, <4 x i16> %b) {
152 ; CHECK-LABEL: shuffle_widen_fail2:
153 ; CHECK: // %bb.0: // %entry
154 ; CHECK-NEXT: adrp x8, .LCPI13_0
155 ; CHECK-NEXT: // kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
156 ; CHECK-NEXT: ldr q2, [x8, :lo12:.LCPI13_0]
157 ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
158 ; CHECK-NEXT: tbl v0.16b, { v0.16b, v1.16b }, v2.16b
161 %res = shufflevector <4 x i16> %a, <4 x i16> %b, <8 x i32> <i32 6, i32 6, i32 0, i32 1,
162 i32 undef, i32 2, i32 4, i32 5>
166 define <8 x i16> @shuffle_widen_fail3(<8 x i16> %a, <8 x i16> %b) {
167 ; CHECK-LABEL: shuffle_widen_fail3:
168 ; CHECK: // %bb.0: // %entry
169 ; CHECK-NEXT: adrp x8, .LCPI14_0
170 ; CHECK-NEXT: // kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
171 ; CHECK-NEXT: ldr q2, [x8, :lo12:.LCPI14_0]
172 ; CHECK-NEXT: // kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
173 ; CHECK-NEXT: tbl v0.16b, { v0.16b, v1.16b }, v2.16b
176 %res = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 1, i32 5, i32 12, i32 14,
177 i32 10, i32 6, i32 7, i32 13>