Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / AArch64 / faddp-half.ll
blob6068a4742eea998e1391de2e09b1d181b09dcedb
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc --mtriple=aarch64 -mattr=+fullfp16 < %s | FileCheck %s
3 ; RUN: llc --mtriple=aarch64 < %s | FileCheck %s --check-prefix=CHECKNOFP16
5 define half @faddp_2xhalf(<2 x half> %a) {
6 ; CHECK-LABEL: faddp_2xhalf:
7 ; CHECK:       // %bb.0: // %entry
8 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
9 ; CHECK-NEXT:    faddp h0, v0.2h
10 ; CHECK-NEXT:    ret
12 ; CHECKNOFP16-LABEL: faddp_2xhalf:
13 ; CHECKNOFP16:       // %bb.0: // %entry
14 ; CHECKNOFP16-NEXT:    // kill: def $d0 killed $d0 def $q0
15 ; CHECKNOFP16-NEXT:    dup v1.4h, v0.h[1]
16 ; CHECKNOFP16-NEXT:    fcvtl v0.4s, v0.4h
17 ; CHECKNOFP16-NEXT:    fcvtl v1.4s, v1.4h
18 ; CHECKNOFP16-NEXT:    fadd v0.4s, v0.4s, v1.4s
19 ; CHECKNOFP16-NEXT:    fcvtn v0.4h, v0.4s
20 ; CHECKNOFP16-NEXT:    // kill: def $h0 killed $h0 killed $q0
21 ; CHECKNOFP16-NEXT:    ret
22 entry:
23   %shift = shufflevector <2 x half> %a, <2 x half> undef, <2 x i32> <i32 1, i32 undef>
24   %0 = fadd <2 x half> %a, %shift
25   %1 = extractelement <2 x half> %0, i32 0
26   ret half %1
29 define half @faddp_2xhalf_commute(<2 x half> %a) {
30 ; CHECK-LABEL: faddp_2xhalf_commute:
31 ; CHECK:       // %bb.0: // %entry
32 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
33 ; CHECK-NEXT:    faddp h0, v0.2h
34 ; CHECK-NEXT:    ret
36 ; CHECKNOFP16-LABEL: faddp_2xhalf_commute:
37 ; CHECKNOFP16:       // %bb.0: // %entry
38 ; CHECKNOFP16-NEXT:    // kill: def $d0 killed $d0 def $q0
39 ; CHECKNOFP16-NEXT:    dup v1.4h, v0.h[1]
40 ; CHECKNOFP16-NEXT:    fcvtl v0.4s, v0.4h
41 ; CHECKNOFP16-NEXT:    fcvtl v1.4s, v1.4h
42 ; CHECKNOFP16-NEXT:    fadd v0.4s, v1.4s, v0.4s
43 ; CHECKNOFP16-NEXT:    fcvtn v0.4h, v0.4s
44 ; CHECKNOFP16-NEXT:    // kill: def $h0 killed $h0 killed $q0
45 ; CHECKNOFP16-NEXT:    ret
46 entry:
47   %shift = shufflevector <2 x half> %a, <2 x half> undef, <2 x i32> <i32 1, i32 undef>
48   %0 = fadd <2 x half> %shift, %a
49   %1 = extractelement <2 x half> %0, i32 0
50   ret half %1
53 define half @faddp_4xhalf(<4 x half> %a) {
54 ; CHECK-LABEL: faddp_4xhalf:
55 ; CHECK:       // %bb.0: // %entry
56 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
57 ; CHECK-NEXT:    faddp h0, v0.2h
58 ; CHECK-NEXT:    ret
60 ; CHECKNOFP16-LABEL: faddp_4xhalf:
61 ; CHECKNOFP16:       // %bb.0: // %entry
62 ; CHECKNOFP16-NEXT:    // kill: def $d0 killed $d0 def $q0
63 ; CHECKNOFP16-NEXT:    dup v1.4h, v0.h[1]
64 ; CHECKNOFP16-NEXT:    fcvtl v0.4s, v0.4h
65 ; CHECKNOFP16-NEXT:    fcvtl v1.4s, v1.4h
66 ; CHECKNOFP16-NEXT:    fadd v0.4s, v0.4s, v1.4s
67 ; CHECKNOFP16-NEXT:    fcvtn v0.4h, v0.4s
68 ; CHECKNOFP16-NEXT:    // kill: def $h0 killed $h0 killed $q0
69 ; CHECKNOFP16-NEXT:    ret
70 entry:
71   %shift = shufflevector <4 x half> %a, <4 x half> undef, <4 x i32> <i32 1, i32 undef, i32 undef, i32 undef>
72   %0 = fadd <4 x half> %a, %shift
73   %1 = extractelement <4 x half> %0, i32 0
74   ret half %1
77 define half @faddp_4xhalf_commute(<4 x half> %a) {
78 ; CHECK-LABEL: faddp_4xhalf_commute:
79 ; CHECK:       // %bb.0: // %entry
80 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
81 ; CHECK-NEXT:    faddp h0, v0.2h
82 ; CHECK-NEXT:    ret
84 ; CHECKNOFP16-LABEL: faddp_4xhalf_commute:
85 ; CHECKNOFP16:       // %bb.0: // %entry
86 ; CHECKNOFP16-NEXT:    // kill: def $d0 killed $d0 def $q0
87 ; CHECKNOFP16-NEXT:    dup v1.4h, v0.h[1]
88 ; CHECKNOFP16-NEXT:    fcvtl v0.4s, v0.4h
89 ; CHECKNOFP16-NEXT:    fcvtl v1.4s, v1.4h
90 ; CHECKNOFP16-NEXT:    fadd v0.4s, v1.4s, v0.4s
91 ; CHECKNOFP16-NEXT:    fcvtn v0.4h, v0.4s
92 ; CHECKNOFP16-NEXT:    // kill: def $h0 killed $h0 killed $q0
93 ; CHECKNOFP16-NEXT:    ret
94 entry:
95   %shift = shufflevector <4 x half> %a, <4 x half> undef, <4 x i32> <i32 1, i32 undef, i32 undef, i32 undef>
96   %0 = fadd <4 x half> %shift, %a
97   %1 = extractelement <4 x half> %0, i32 0
98   ret half %1
101 define half @faddp_8xhalf(<8 x half> %a) {
102 ; CHECK-LABEL: faddp_8xhalf:
103 ; CHECK:       // %bb.0: // %entry
104 ; CHECK-NEXT:    faddp h0, v0.2h
105 ; CHECK-NEXT:    ret
107 ; CHECKNOFP16-LABEL: faddp_8xhalf:
108 ; CHECKNOFP16:       // %bb.0: // %entry
109 ; CHECKNOFP16-NEXT:    dup v1.8h, v0.h[1]
110 ; CHECKNOFP16-NEXT:    fcvt s0, h0
111 ; CHECKNOFP16-NEXT:    fcvt s1, h1
112 ; CHECKNOFP16-NEXT:    fadd s0, s0, s1
113 ; CHECKNOFP16-NEXT:    fcvt h0, s0
114 ; CHECKNOFP16-NEXT:    ret
115 entry:
116   %shift = shufflevector <8 x half> %a, <8 x half> undef, <8 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
117   %0 = fadd <8 x half> %a, %shift
118   %1 = extractelement <8 x half> %0, i32 0
119   ret half %1
122 define half @faddp_8xhalf_commute(<8 x half> %a) {
123 ; CHECK-LABEL: faddp_8xhalf_commute:
124 ; CHECK:       // %bb.0: // %entry
125 ; CHECK-NEXT:    faddp h0, v0.2h
126 ; CHECK-NEXT:    ret
128 ; CHECKNOFP16-LABEL: faddp_8xhalf_commute:
129 ; CHECKNOFP16:       // %bb.0: // %entry
130 ; CHECKNOFP16-NEXT:    dup v1.8h, v0.h[1]
131 ; CHECKNOFP16-NEXT:    fcvt s0, h0
132 ; CHECKNOFP16-NEXT:    fcvt s1, h1
133 ; CHECKNOFP16-NEXT:    fadd s0, s1, s0
134 ; CHECKNOFP16-NEXT:    fcvt h0, s0
135 ; CHECKNOFP16-NEXT:    ret
136 entry:
137   %shift = shufflevector <8 x half> %a, <8 x half> undef, <8 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
138   %0 = fadd <8 x half> %shift, %a
139   %1 = extractelement <8 x half> %0, i32 0
140   ret half %1
143 define <8 x half> @addp_v8f16(<8 x half> %a) {
144 ; CHECK-LABEL: addp_v8f16:
145 ; CHECK:       // %bb.0: // %entry
146 ; CHECK-NEXT:    rev32 v1.8h, v0.8h
147 ; CHECK-NEXT:    fadd v0.8h, v1.8h, v0.8h
148 ; CHECK-NEXT:    ret
150 ; CHECKNOFP16-LABEL: addp_v8f16:
151 ; CHECKNOFP16:       // %bb.0: // %entry
152 ; CHECKNOFP16-NEXT:    rev32 v2.8h, v0.8h
153 ; CHECKNOFP16-NEXT:    mov h1, v0.h[1]
154 ; CHECKNOFP16-NEXT:    fcvt s4, h0
155 ; CHECKNOFP16-NEXT:    mov h5, v0.h[2]
156 ; CHECKNOFP16-NEXT:    mov h16, v0.h[3]
157 ; CHECKNOFP16-NEXT:    mov h3, v2.h[1]
158 ; CHECKNOFP16-NEXT:    fcvt s6, h2
159 ; CHECKNOFP16-NEXT:    fcvt s1, h1
160 ; CHECKNOFP16-NEXT:    mov h7, v2.h[2]
161 ; CHECKNOFP16-NEXT:    fcvt s5, h5
162 ; CHECKNOFP16-NEXT:    fcvt s16, h16
163 ; CHECKNOFP16-NEXT:    fcvt s3, h3
164 ; CHECKNOFP16-NEXT:    fadd s4, s6, s4
165 ; CHECKNOFP16-NEXT:    mov h6, v2.h[3]
166 ; CHECKNOFP16-NEXT:    fcvt s7, h7
167 ; CHECKNOFP16-NEXT:    fadd s3, s3, s1
168 ; CHECKNOFP16-NEXT:    fcvt s6, h6
169 ; CHECKNOFP16-NEXT:    fcvt h1, s4
170 ; CHECKNOFP16-NEXT:    fadd s4, s7, s5
171 ; CHECKNOFP16-NEXT:    mov h5, v0.h[4]
172 ; CHECKNOFP16-NEXT:    mov h7, v2.h[4]
173 ; CHECKNOFP16-NEXT:    fcvt h3, s3
174 ; CHECKNOFP16-NEXT:    fadd s6, s6, s16
175 ; CHECKNOFP16-NEXT:    mov h16, v2.h[5]
176 ; CHECKNOFP16-NEXT:    fcvt h4, s4
177 ; CHECKNOFP16-NEXT:    mov v1.h[1], v3.h[0]
178 ; CHECKNOFP16-NEXT:    fcvt s3, h5
179 ; CHECKNOFP16-NEXT:    fcvt s5, h7
180 ; CHECKNOFP16-NEXT:    mov h7, v0.h[5]
181 ; CHECKNOFP16-NEXT:    fcvt h6, s6
182 ; CHECKNOFP16-NEXT:    fcvt s16, h16
183 ; CHECKNOFP16-NEXT:    mov v1.h[2], v4.h[0]
184 ; CHECKNOFP16-NEXT:    mov h4, v0.h[6]
185 ; CHECKNOFP16-NEXT:    fadd s3, s5, s3
186 ; CHECKNOFP16-NEXT:    mov h5, v2.h[6]
187 ; CHECKNOFP16-NEXT:    fcvt s7, h7
188 ; CHECKNOFP16-NEXT:    mov h0, v0.h[7]
189 ; CHECKNOFP16-NEXT:    mov h2, v2.h[7]
190 ; CHECKNOFP16-NEXT:    mov v1.h[3], v6.h[0]
191 ; CHECKNOFP16-NEXT:    fcvt s4, h4
192 ; CHECKNOFP16-NEXT:    fcvt h3, s3
193 ; CHECKNOFP16-NEXT:    fcvt s5, h5
194 ; CHECKNOFP16-NEXT:    fadd s6, s16, s7
195 ; CHECKNOFP16-NEXT:    fcvt s0, h0
196 ; CHECKNOFP16-NEXT:    fcvt s2, h2
197 ; CHECKNOFP16-NEXT:    mov v1.h[4], v3.h[0]
198 ; CHECKNOFP16-NEXT:    fadd s4, s5, s4
199 ; CHECKNOFP16-NEXT:    fcvt h3, s6
200 ; CHECKNOFP16-NEXT:    fadd s0, s2, s0
201 ; CHECKNOFP16-NEXT:    mov v1.h[5], v3.h[0]
202 ; CHECKNOFP16-NEXT:    fcvt h3, s4
203 ; CHECKNOFP16-NEXT:    fcvt h0, s0
204 ; CHECKNOFP16-NEXT:    mov v1.h[6], v3.h[0]
205 ; CHECKNOFP16-NEXT:    mov v1.h[7], v0.h[0]
206 ; CHECKNOFP16-NEXT:    mov v0.16b, v1.16b
207 ; CHECKNOFP16-NEXT:    ret
208 entry:
209   %s = shufflevector <8 x half> %a, <8 x half> poison, <8 x i32> <i32 1, i32 0, i32 3, i32 2, i32 5, i32 4, i32 7, i32 6>
210   %b = fadd reassoc <8 x half> %s, %a
211   ret <8 x half> %b
214 define <16 x half> @addp_v16f16(<16 x half> %a) {
215 ; CHECK-LABEL: addp_v16f16:
216 ; CHECK:       // %bb.0: // %entry
217 ; CHECK-NEXT:    faddp v1.8h, v0.8h, v1.8h
218 ; CHECK-NEXT:    zip1 v0.8h, v1.8h, v1.8h
219 ; CHECK-NEXT:    zip2 v1.8h, v1.8h, v1.8h
220 ; CHECK-NEXT:    ret
222 ; CHECKNOFP16-LABEL: addp_v16f16:
223 ; CHECKNOFP16:       // %bb.0: // %entry
224 ; CHECKNOFP16-NEXT:    rev32 v5.8h, v0.8h
225 ; CHECKNOFP16-NEXT:    rev32 v4.8h, v1.8h
226 ; CHECKNOFP16-NEXT:    mov h3, v0.h[1]
227 ; CHECKNOFP16-NEXT:    mov h6, v1.h[1]
228 ; CHECKNOFP16-NEXT:    fcvt s16, h0
229 ; CHECKNOFP16-NEXT:    mov h17, v0.h[2]
230 ; CHECKNOFP16-NEXT:    fcvt s20, h1
231 ; CHECKNOFP16-NEXT:    mov h21, v1.h[2]
232 ; CHECKNOFP16-NEXT:    mov h2, v5.h[1]
233 ; CHECKNOFP16-NEXT:    mov h7, v4.h[1]
234 ; CHECKNOFP16-NEXT:    fcvt s3, h3
235 ; CHECKNOFP16-NEXT:    fcvt s18, h5
236 ; CHECKNOFP16-NEXT:    mov h19, v5.h[2]
237 ; CHECKNOFP16-NEXT:    fcvt s6, h6
238 ; CHECKNOFP16-NEXT:    fcvt s22, h4
239 ; CHECKNOFP16-NEXT:    mov h23, v4.h[2]
240 ; CHECKNOFP16-NEXT:    fcvt s17, h17
241 ; CHECKNOFP16-NEXT:    mov h24, v5.h[3]
242 ; CHECKNOFP16-NEXT:    fcvt s21, h21
243 ; CHECKNOFP16-NEXT:    mov h25, v4.h[6]
244 ; CHECKNOFP16-NEXT:    fcvt s2, h2
245 ; CHECKNOFP16-NEXT:    fcvt s7, h7
246 ; CHECKNOFP16-NEXT:    fadd s16, s18, s16
247 ; CHECKNOFP16-NEXT:    fcvt s18, h19
248 ; CHECKNOFP16-NEXT:    mov h19, v0.h[3]
249 ; CHECKNOFP16-NEXT:    fadd s20, s22, s20
250 ; CHECKNOFP16-NEXT:    fcvt s22, h23
251 ; CHECKNOFP16-NEXT:    mov h23, v4.h[3]
252 ; CHECKNOFP16-NEXT:    fadd s3, s2, s3
253 ; CHECKNOFP16-NEXT:    fadd s6, s7, s6
254 ; CHECKNOFP16-NEXT:    mov h7, v1.h[3]
255 ; CHECKNOFP16-NEXT:    fcvt h2, s16
256 ; CHECKNOFP16-NEXT:    fadd s16, s18, s17
257 ; CHECKNOFP16-NEXT:    fcvt s18, h19
258 ; CHECKNOFP16-NEXT:    fcvt s19, h24
259 ; CHECKNOFP16-NEXT:    mov h24, v5.h[6]
260 ; CHECKNOFP16-NEXT:    fcvt h17, s3
261 ; CHECKNOFP16-NEXT:    fcvt h3, s20
262 ; CHECKNOFP16-NEXT:    fadd s20, s22, s21
263 ; CHECKNOFP16-NEXT:    fcvt h6, s6
264 ; CHECKNOFP16-NEXT:    fcvt s7, h7
265 ; CHECKNOFP16-NEXT:    fcvt s22, h23
266 ; CHECKNOFP16-NEXT:    mov h21, v0.h[4]
267 ; CHECKNOFP16-NEXT:    mov h23, v5.h[4]
268 ; CHECKNOFP16-NEXT:    fcvt h16, s16
269 ; CHECKNOFP16-NEXT:    fadd s18, s19, s18
270 ; CHECKNOFP16-NEXT:    mov h19, v4.h[4]
271 ; CHECKNOFP16-NEXT:    mov v2.h[1], v17.h[0]
272 ; CHECKNOFP16-NEXT:    mov h17, v1.h[4]
273 ; CHECKNOFP16-NEXT:    mov v3.h[1], v6.h[0]
274 ; CHECKNOFP16-NEXT:    fcvt h6, s20
275 ; CHECKNOFP16-NEXT:    fadd s7, s22, s7
276 ; CHECKNOFP16-NEXT:    fcvt s20, h21
277 ; CHECKNOFP16-NEXT:    mov h21, v0.h[5]
278 ; CHECKNOFP16-NEXT:    mov h22, v5.h[5]
279 ; CHECKNOFP16-NEXT:    fcvt h18, s18
280 ; CHECKNOFP16-NEXT:    fcvt s19, h19
281 ; CHECKNOFP16-NEXT:    mov h5, v5.h[7]
282 ; CHECKNOFP16-NEXT:    mov v2.h[2], v16.h[0]
283 ; CHECKNOFP16-NEXT:    fcvt s16, h23
284 ; CHECKNOFP16-NEXT:    fcvt s17, h17
285 ; CHECKNOFP16-NEXT:    mov v3.h[2], v6.h[0]
286 ; CHECKNOFP16-NEXT:    fcvt h6, s7
287 ; CHECKNOFP16-NEXT:    mov h7, v1.h[5]
288 ; CHECKNOFP16-NEXT:    mov h23, v4.h[5]
289 ; CHECKNOFP16-NEXT:    mov h4, v4.h[7]
290 ; CHECKNOFP16-NEXT:    fcvt s5, h5
291 ; CHECKNOFP16-NEXT:    fadd s16, s16, s20
292 ; CHECKNOFP16-NEXT:    mov h20, v0.h[6]
293 ; CHECKNOFP16-NEXT:    fadd s17, s19, s17
294 ; CHECKNOFP16-NEXT:    mov h19, v1.h[6]
295 ; CHECKNOFP16-NEXT:    mov v2.h[3], v18.h[0]
296 ; CHECKNOFP16-NEXT:    fcvt s18, h21
297 ; CHECKNOFP16-NEXT:    fcvt s21, h22
298 ; CHECKNOFP16-NEXT:    mov v3.h[3], v6.h[0]
299 ; CHECKNOFP16-NEXT:    fcvt s6, h7
300 ; CHECKNOFP16-NEXT:    fcvt s7, h23
301 ; CHECKNOFP16-NEXT:    fcvt s22, h24
302 ; CHECKNOFP16-NEXT:    fcvt s23, h25
303 ; CHECKNOFP16-NEXT:    fcvt h16, s16
304 ; CHECKNOFP16-NEXT:    fcvt s20, h20
305 ; CHECKNOFP16-NEXT:    fcvt h17, s17
306 ; CHECKNOFP16-NEXT:    fcvt s19, h19
307 ; CHECKNOFP16-NEXT:    mov h0, v0.h[7]
308 ; CHECKNOFP16-NEXT:    mov h1, v1.h[7]
309 ; CHECKNOFP16-NEXT:    fadd s18, s21, s18
310 ; CHECKNOFP16-NEXT:    fcvt s4, h4
311 ; CHECKNOFP16-NEXT:    fadd s6, s7, s6
312 ; CHECKNOFP16-NEXT:    mov v2.h[4], v16.h[0]
313 ; CHECKNOFP16-NEXT:    fadd s7, s22, s20
314 ; CHECKNOFP16-NEXT:    mov v3.h[4], v17.h[0]
315 ; CHECKNOFP16-NEXT:    fadd s16, s23, s19
316 ; CHECKNOFP16-NEXT:    fcvt s0, h0
317 ; CHECKNOFP16-NEXT:    fcvt s1, h1
318 ; CHECKNOFP16-NEXT:    fcvt h17, s18
319 ; CHECKNOFP16-NEXT:    fcvt h6, s6
320 ; CHECKNOFP16-NEXT:    fadd s0, s5, s0
321 ; CHECKNOFP16-NEXT:    fcvt h5, s7
322 ; CHECKNOFP16-NEXT:    fadd s1, s4, s1
323 ; CHECKNOFP16-NEXT:    mov v2.h[5], v17.h[0]
324 ; CHECKNOFP16-NEXT:    mov v3.h[5], v6.h[0]
325 ; CHECKNOFP16-NEXT:    fcvt h6, s16
326 ; CHECKNOFP16-NEXT:    fcvt h0, s0
327 ; CHECKNOFP16-NEXT:    fcvt h1, s1
328 ; CHECKNOFP16-NEXT:    mov v2.h[6], v5.h[0]
329 ; CHECKNOFP16-NEXT:    mov v3.h[6], v6.h[0]
330 ; CHECKNOFP16-NEXT:    mov v2.h[7], v0.h[0]
331 ; CHECKNOFP16-NEXT:    mov v3.h[7], v1.h[0]
332 ; CHECKNOFP16-NEXT:    mov v0.16b, v2.16b
333 ; CHECKNOFP16-NEXT:    mov v1.16b, v3.16b
334 ; CHECKNOFP16-NEXT:    ret
335 entry:
336   %s = shufflevector <16 x half> %a, <16 x half> poison, <16 x i32> <i32 1, i32 0, i32 3, i32 2, i32 5, i32 4, i32 7, i32 6, i32 9, i32 8, i32 11, i32 10, i32 13, i32 12, i32 15, i32 14>
337   %b = fadd reassoc <16 x half> %s, %a
338   ret <16 x half> %b