[AArch64] Improve shuffle vector by using wider types
[llvm-project.git] / llvm / test / CodeGen / AArch64 / neon-widen-shuffle.ll
blob89e91944bc3df8afb4b6a330ba4f9867b7330571
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
8 ; CHECK-NEXT:    ret
9 entry:
10   %res = shufflevector <2 x half> %a, <2 x half> %b, <4 x i32> <i32 2, i32 3, i32 0, i32 undef>
11   ret <4 x half> %res
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
18 ; CHECK-NEXT:    ret
19 entry:
20   %res = shufflevector <2 x half> %a, <2 x half> %b, <4 x i32> <i32 undef, i32 1, i32 2, i32 undef>
21   ret <4 x half> %res
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]
28 ; CHECK-NEXT:    ret
29 entry:
30   %res = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 6, i32 7, i32 2, i32 3>
31   ret <4 x i32> %res
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]
38 ; CHECK-NEXT:    ret
39 entry:
40   %res = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 0, i32 1, i32 6, i32 7>
41   ret <4 x float> %res
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
48 ; CHECK-NEXT:    ret
49 entry:
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>
54   ret <16 x i8> %res
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
61 ; CHECK-NEXT:    ret
62 entry:
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>
67   ret <16 x i8> %res
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
74 ; CHECK-NEXT:    ret
75 entry:
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>
78   ret <8 x i8> %res
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
85 ; CHECK-NEXT:    ret
86 entry:
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>
89   ret <8 x i8> %res
92 ; No blocks
93 define <8 x i8> @shuffle9(<8 x i8> %a) {
94 ; CHECK-LABEL: shuffle9:
95 ; CHECK:       // %bb.0:
96 ; CHECK-NEXT:    rev32 v0.4h, v0.4h
97 ; CHECK-NEXT:    ret
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>
100   ret <8 x i8> %res
103 define <8 x i16> @shuffle10(<8 x i16> %a) {
104 ; CHECK-LABEL: shuffle10:
105 ; CHECK:       // %bb.0:
106 ; CHECK-NEXT:    rev64 v0.4s, v0.4s
107 ; CHECK-NEXT:    ret
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>
110   ret <8 x i16> %res
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
118 ; CHECK-NEXT:    ret
119 entry:
120   %res = shufflevector <8 x i16> %a, <8 x i16> %b, <4 x i32> <i32 8, i32 9, i32 0, i32 1>
121   ret <4 x i16> %res
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
129 ; CHECK-NEXT:    ret
130 entry:
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>
133   ret <8 x i8> %res
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]
144 ; CHECK-NEXT:    ret
145 entry:
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>
148   ret <8 x i16> %res
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]
159 ; CHECK-NEXT:    ret
160 entry:
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>
163   ret <8 x i16> %res
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
174 ; CHECK-NEXT:    ret
175 entry:
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>
178   ret <8 x i16> %res