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: rev32 v2.4h, v0.4h
140 ; CHECK-NEXT: rev32 v3.4h, v1.4h
141 ; CHECK-NEXT: ext v1.8b, v2.8b, v1.8b, #4
142 ; CHECK-NEXT: ext v0.8b, v3.8b, v0.8b, #4
143 ; CHECK-NEXT: mov v0.d[1], v1.d[0]
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: uzp1 v2.4h, v0.4h, v0.4h
155 ; CHECK-NEXT: trn1 v3.4h, v1.4h, v1.4h
156 ; CHECK-NEXT: ext v1.8b, v2.8b, v1.8b, #4
157 ; CHECK-NEXT: ext v0.8b, v3.8b, v0.8b, #4
158 ; CHECK-NEXT: mov v0.d[1], v1.d[0]
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: // kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
172 ; CHECK-NEXT: ldr q2, [x8, :lo12:.LCPI14_0]
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>