Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / v_mac_f16.ll
blobd7a837a6e5f718c026454257963b6742aa7b0f7b
1 ; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn -mcpu=tahiti -verify-machineinstrs < %s | FileCheck -allow-deprecated-dag-overlap -check-prefix=GCN -check-prefix=SI %s
2 ; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn -mcpu=fiji -mattr=-flat-for-global -verify-machineinstrs < %s | FileCheck -allow-deprecated-dag-overlap -check-prefix=GCN -check-prefix=VI %s
4 ; GCN-LABEL: {{^}}mac_f16:
5 ; GCN: {{buffer|flat}}_load_ushort v[[A_F16:[0-9]+]]
6 ; GCN: {{buffer|flat}}_load_ushort v[[B_F16:[0-9]+]]
7 ; GCN: {{buffer|flat}}_load_ushort v[[C_F16:[0-9]+]]
8 ; SI:  v_cvt_f32_f16_e32 v[[A_F32:[0-9]+]], v[[A_F16]]
9 ; SI:  v_cvt_f32_f16_e32 v[[B_F32:[0-9]+]], v[[B_F16]]
10 ; SI:  v_cvt_f32_f16_e32 v[[C_F32:[0-9]+]], v[[C_F16]]
11 ; SI:  v_mac_f32_e32 v[[C_F32]], v[[A_F32]], v[[B_F32]]
12 ; SI:  v_cvt_f16_f32_e32 v[[R_F16:[0-9]+]], v[[C_F32]]
13 ; SI:  buffer_store_short v[[R_F16]]
14 ; VI:  v_mac_f16_e32 v[[C_F16]], v[[A_F16]], v[[B_F16]]
15 ; VI:  buffer_store_short v[[C_F16]]
16 ; GCN: s_endpgm
17 define amdgpu_kernel void @mac_f16(
18     ptr addrspace(1) %r,
19     ptr addrspace(1) %a,
20     ptr addrspace(1) %b,
21     ptr addrspace(1) %c) #0 {
22 entry:
23   %a.val = load half, ptr addrspace(1) %a
24   %b.val = load half, ptr addrspace(1) %b
25   %c.val = load half, ptr addrspace(1) %c
27   %t.val = fmul half %a.val, %b.val
28   %r.val = fadd half %t.val, %c.val
30   store half %r.val, ptr addrspace(1) %r
31   ret void
34 ; GCN-LABEL: {{^}}mac_f16_same_add:
35 ; SI:  v_mad_f32 v{{[0-9]}}, v{{[0-9]+}}, v{{[0-9]+}}, [[ADD:v[0-9]+]]
36 ; SI:  v_mac_f32_e32 [[ADD]], v{{[0-9]+}}, v{{[0-9]+}}
38 ; VI:  v_mad_f16 v{{[0-9]}}, v{{[0-9]+}}, v{{[0-9]+}}, [[ADD:v[0-9]+]]
39 ; VI:  v_mac_f16_e32 [[ADD]], v{{[0-9]+}}, v{{[0-9]+}}
40 ; GCN: s_endpgm
41 define amdgpu_kernel void @mac_f16_same_add(
42     ptr addrspace(1) %r0,
43     ptr addrspace(1) %r1,
44     ptr addrspace(1) %a,
45     ptr addrspace(1) %b,
46     ptr addrspace(1) %c,
47     ptr addrspace(1) %d,
48     ptr addrspace(1) %e) #0 {
49 entry:
50   %a.val = load half, ptr addrspace(1) %a
51   %b.val = load half, ptr addrspace(1) %b
52   %c.val = load half, ptr addrspace(1) %c
53   %d.val = load half, ptr addrspace(1) %d
54   %e.val = load half, ptr addrspace(1) %e
56   %t0.val = fmul half %a.val, %b.val
57   %r0.val = fadd half %t0.val, %c.val
59   %t1.val = fmul half %d.val, %e.val
60   %r1.val = fadd half %t1.val, %c.val
62   store half %r0.val, ptr addrspace(1) %r0
63   store half %r1.val, ptr addrspace(1) %r1
64   ret void
67 ; GCN-LABEL: {{^}}mac_f16_neg_a:
68 ; SI: v_cvt_f32_f16_e32 [[CVT_A:v[0-9]+]], v{{[0-9]+}}
69 ; SI: v_cvt_f32_f16_e32 [[CVT_B:v[0-9]+]], v{{[0-9]+}}
70 ; SI: v_cvt_f32_f16_e32 [[CVT_C:v[0-9]+]], v{{[0-9]+}}
71 ; SI: v_mad_f32 v{{[0-9]+}}, -[[CVT_A]], [[CVT_B]], [[CVT_C]]
73 ; VI-NOT: v_mac_f16
74 ; VI:     v_mad_f16 v{{[0-9]+}}, -v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
75 ; GCN:    s_endpgm
76 define amdgpu_kernel void @mac_f16_neg_a(
77     ptr addrspace(1) %r,
78     ptr addrspace(1) %a,
79     ptr addrspace(1) %b,
80     ptr addrspace(1) %c) #0 {
81 entry:
82   %a.val = load half, ptr addrspace(1) %a
83   %b.val = load half, ptr addrspace(1) %b
84   %c.val = load half, ptr addrspace(1) %c
86   %a.neg = fneg half %a.val
87   %t.val = fmul half %a.neg, %b.val
88   %r.val = fadd half %t.val, %c.val
90   store half %r.val, ptr addrspace(1) %r
91   ret void
94 ; GCN-LABEL: {{^}}mac_f16_neg_b:
95 ; SI: v_cvt_f32_f16_e32 [[CVT_A:v[0-9]+]], v{{[0-9]+}}
96 ; SI: v_cvt_f32_f16_e32 [[CVT_B:v[0-9]+]], v{{[0-9]+}}
97 ; SI: v_cvt_f32_f16_e32 [[CVT_C:v[0-9]+]], v{{[0-9]+}}
98 ; SI: v_mad_f32 v{{[0-9]+}}, -[[CVT_A]], [[CVT_B]], [[CVT_C]]
100 ; VI-NOT: v_mac_f16
101 ; VI:     v_mad_f16 v{{[0-9]+}}, -v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
102 ; GCN:    s_endpgm
103 define amdgpu_kernel void @mac_f16_neg_b(
104     ptr addrspace(1) %r,
105     ptr addrspace(1) %a,
106     ptr addrspace(1) %b,
107     ptr addrspace(1) %c) #0 {
108 entry:
109   %a.val = load half, ptr addrspace(1) %a
110   %b.val = load half, ptr addrspace(1) %b
111   %c.val = load half, ptr addrspace(1) %c
113   %b.neg = fneg half %b.val
114   %t.val = fmul half %a.val, %b.neg
115   %r.val = fadd half %t.val, %c.val
117   store half %r.val, ptr addrspace(1) %r
118   ret void
121 ; GCN-LABEL: {{^}}mac_f16_neg_c:
122 ; SI: v_cvt_f32_f16_e32
123 ; SI: v_cvt_f32_f16_e32
124 ; SI: v_cvt_f32_f16_e32
125 ; SI: v_mad_f32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}, -v{{[0-9]+}}
127 ; VI-NOT: v_mac_f16
128 ; VI:     v_mad_f16 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}, -v{{[0-9]+}}
129 ; GCN:    s_endpgm
130 define amdgpu_kernel void @mac_f16_neg_c(
131     ptr addrspace(1) %r,
132     ptr addrspace(1) %a,
133     ptr addrspace(1) %b,
134     ptr addrspace(1) %c) #0 {
135 entry:
136   %a.val = load half, ptr addrspace(1) %a
137   %b.val = load half, ptr addrspace(1) %b
138   %c.val = load half, ptr addrspace(1) %c
140   %c.neg = fneg half %c.val
141   %t.val = fmul half %a.val, %b.val
142   %r.val = fadd half %t.val, %c.neg
144   store half %r.val, ptr addrspace(1) %r
145   ret void
148 ; GCN-LABEL: {{^}}mac_f16_neg_a_safe_fp_math:
149 ; SI:  v_sub_f32_e32 v[[NEG_A:[0-9]+]], 0, v{{[0-9]+}}
150 ; SI:  v_mac_f32_e32 v{{[0-9]+}}, v[[NEG_A]], v{{[0-9]+}}
151 ; VI:  v_sub_f16_e32 v[[NEG_A:[0-9]+]], 0, v{{[0-9]+}}
152 ; VI:  v_mac_f16_e32 v{{[0-9]+}}, v[[NEG_A]], v{{[0-9]+}}
153 ; GCN: s_endpgm
154 define amdgpu_kernel void @mac_f16_neg_a_safe_fp_math(
155     ptr addrspace(1) %r,
156     ptr addrspace(1) %a,
157     ptr addrspace(1) %b,
158     ptr addrspace(1) %c) #0 {
159 entry:
160   %a.val = load half, ptr addrspace(1) %a
161   %b.val = load half, ptr addrspace(1) %b
162   %c.val = load half, ptr addrspace(1) %c
164   %a.neg = fsub half 0.0, %a.val
165   %t.val = fmul half %a.neg, %b.val
166   %r.val = fadd half %t.val, %c.val
168   store half %r.val, ptr addrspace(1) %r
169   ret void
172 ; GCN-LABEL: {{^}}mac_f16_neg_b_safe_fp_math:
173 ; SI:  v_sub_f32_e32 v[[NEG_A:[0-9]+]], 0, v{{[0-9]+}}
174 ; SI:  v_mac_f32_e32 v{{[0-9]+}}, v{{[0-9]+}}, v[[NEG_A]]
175 ; VI:  v_sub_f16_e32 v[[NEG_A:[0-9]+]], 0, v{{[0-9]+}}
176 ; VI:  v_mac_f16_e32 v{{[0-9]+}}, v{{[0-9]+}}, v[[NEG_A]]
177 ; GCN: s_endpgm
178 define amdgpu_kernel void @mac_f16_neg_b_safe_fp_math(
179     ptr addrspace(1) %r,
180     ptr addrspace(1) %a,
181     ptr addrspace(1) %b,
182     ptr addrspace(1) %c) #0 {
183 entry:
184   %a.val = load half, ptr addrspace(1) %a
185   %b.val = load half, ptr addrspace(1) %b
186   %c.val = load half, ptr addrspace(1) %c
188   %b.neg = fsub half 0.0, %b.val
189   %t.val = fmul half %a.val, %b.neg
190   %r.val = fadd half %t.val, %c.val
192   store half %r.val, ptr addrspace(1) %r
193   ret void
196 ; GCN-LABEL: {{^}}mac_f16_neg_c_safe_fp_math:
197 ; SI:  v_sub_f32_e32 v[[NEG_A:[0-9]+]], 0, v{{[0-9]+}}
198 ; SI:  v_mac_f32_e32 v[[NEG_A]], v{{[0-9]+}}, v{{[0-9]+}}
199 ; VI:  v_sub_f16_e32 v[[NEG_A:[0-9]+]], 0, v{{[0-9]+}}
200 ; VI:  v_mac_f16_e32 v[[NEG_A]], v{{[0-9]+}}, v{{[0-9]+}}
201 ; GCN: s_endpgm
202 define amdgpu_kernel void @mac_f16_neg_c_safe_fp_math(
203     ptr addrspace(1) %r,
204     ptr addrspace(1) %a,
205     ptr addrspace(1) %b,
206     ptr addrspace(1) %c) #0 {
207 entry:
208   %a.val = load half, ptr addrspace(1) %a
209   %b.val = load half, ptr addrspace(1) %b
210   %c.val = load half, ptr addrspace(1) %c
212   %c.neg = fsub half 0.0, %c.val
213   %t.val = fmul half %a.val, %b.val
214   %r.val = fadd half %t.val, %c.neg
216   store half %r.val, ptr addrspace(1) %r
217   ret void
220 ; GCN-LABEL: {{^}}mac_f16_neg_a_nsz_fp_math:
221 ; SI: v_cvt_f32_f16_e32 [[CVT_A:v[0-9]+]], v{{[0-9]+}}
222 ; SI: v_cvt_f32_f16_e32 [[CVT_B:v[0-9]+]], v{{[0-9]+}}
223 ; SI: v_cvt_f32_f16_e32 [[CVT_C:v[0-9]+]], v{{[0-9]+}}
224 ; SI: v_mad_f32 v{{[0-9]+}}, -[[CVT_A]], [[CVT_B]], [[CVT_C]]
226 ; VI-NOT: v_mac_f16
227 ; VI:     v_mad_f16 v{{[0-9]+}}, -v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]}}
228 ; GCN:    s_endpgm
229 define amdgpu_kernel void @mac_f16_neg_a_nsz_fp_math(
230     ptr addrspace(1) %r,
231     ptr addrspace(1) %a,
232     ptr addrspace(1) %b,
233     ptr addrspace(1) %c) #1 {
234 entry:
235   %a.val = load half, ptr addrspace(1) %a
236   %b.val = load half, ptr addrspace(1) %b
237   %c.val = load half, ptr addrspace(1) %c
239   %a.neg = fsub half 0.0, %a.val
240   %t.val = fmul half %a.neg, %b.val
241   %r.val = fadd half %t.val, %c.val
243   store half %r.val, ptr addrspace(1) %r
244   ret void
247 ; GCN-LABEL: {{^}}mac_f16_neg_b_nsz_fp_math:
248 ; SI: v_cvt_f32_f16_e32 [[CVT_A:v[0-9]+]], v{{[0-9]+}}
249 ; SI: v_cvt_f32_f16_e32 [[CVT_B:v[0-9]+]], v{{[0-9]+}}
250 ; SI: v_cvt_f32_f16_e32 [[CVT_C:v[0-9]+]], v{{[0-9]+}}
251 ; SI: v_mad_f32 v{{[0-9]+}}, -[[CVT_A]], [[CVT_B]], [[CVT_C]]
253 ; VI-NOT: v_mac_f16
254 ; VI:     v_mad_f16 v{{[0-9]+}}, -v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]}}
255 ; GCN:    s_endpgm
256 define amdgpu_kernel void @mac_f16_neg_b_nsz_fp_math(
257     ptr addrspace(1) %r,
258     ptr addrspace(1) %a,
259     ptr addrspace(1) %b,
260     ptr addrspace(1) %c) #1 {
261 entry:
262   %a.val = load half, ptr addrspace(1) %a
263   %b.val = load half, ptr addrspace(1) %b
264   %c.val = load half, ptr addrspace(1) %c
266   %b.neg = fsub half 0.0, %b.val
267   %t.val = fmul half %a.val, %b.neg
268   %r.val = fadd half %t.val, %c.val
270   store half %r.val, ptr addrspace(1) %r
271   ret void
274 ; GCN-LABEL: {{^}}mac_f16_neg_c_nsz_fp_math:
275 ; SI: v_cvt_f32_f16_e32 [[CVT_A:v[0-9]+]], v{{[0-9]+}}
276 ; SI: v_cvt_f32_f16_e32 [[CVT_B:v[0-9]+]], v{{[0-9]+}}
277 ; SI: v_cvt_f32_f16_e32 [[CVT_C:v[0-9]+]], v{{[0-9]+}}
278 ; SI: v_mad_f32 v{{[0-9]+}}, [[CVT_A]], [[CVT_B]], -[[CVT_C]]
280 ; VI-NOT: v_mac_f16
281 ; VI:     v_mad_f16 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}, -v{{[0-9]}}
282 ; GCN:    s_endpgm
283 define amdgpu_kernel void @mac_f16_neg_c_nsz_fp_math(
284     ptr addrspace(1) %r,
285     ptr addrspace(1) %a,
286     ptr addrspace(1) %b,
287     ptr addrspace(1) %c) #1 {
288 entry:
289   %a.val = load half, ptr addrspace(1) %a
290   %b.val = load half, ptr addrspace(1) %b
291   %c.val = load half, ptr addrspace(1) %c
293   %c.neg = fsub half 0.0, %c.val
294   %t.val = fmul half %a.val, %b.val
295   %r.val = fadd half %t.val, %c.neg
297   store half %r.val, ptr addrspace(1) %r
298   ret void
301 ; GCN-LABEL: {{^}}mac_v2f16:
302 ; GCN: {{buffer|flat}}_load_dword v[[A_V2_F16:[0-9]+]]
303 ; GCN: {{buffer|flat}}_load_dword v[[B_V2_F16:[0-9]+]]
304 ; GCN: {{buffer|flat}}_load_dword v[[C_V2_F16:[0-9]+]]
306 ; SI:  v_cvt_f32_f16_e32 v[[A_F32_0:[0-9]+]], v[[A_V2_F16]]
307 ; SI-DAG:  v_lshrrev_b32_e32 v[[A_F16_1:[0-9]+]], 16, v[[A_V2_F16]]
308 ; SI-DAG:  v_cvt_f32_f16_e32 v[[A_F32_1:[0-9]+]], v[[A_F16_1]]
310 ; SI-DAG:  v_lshrrev_b32_e32 v[[B_F16_1:[0-9]+]], 16, v[[B_V2_F16]]
311 ; SI-DAG:  v_cvt_f32_f16_e32 v[[B_F32_1:[0-9]+]], v[[B_F16_1]]
312 ; SI-DAG:  v_cvt_f32_f16_e32 v[[B_F32_0:[0-9]+]], v[[B_V2_F16]]
314 ; SI-DAG:  v_lshrrev_b32_e32 v[[C_F16_1:[0-9]+]], 16, v[[C_V2_F16]]
315 ; SI-DAG:  v_cvt_f32_f16_e32 v[[C_F32_1:[0-9]+]], v[[C_F16_1]]
316 ; SI-DAG:  v_cvt_f32_f16_e32 v[[C_F32_0:[0-9]+]], v[[C_V2_F16]]
318 ; SI-DAG:  v_mac_f32_e32 v[[C_F32_0]], v[[A_F32_0]], v[[B_F32_0]]
319 ; SI-DAG:  v_cvt_f16_f32_e32 v[[R_F16_LO:[0-9]+]], v[[C_F32_0]]
320 ; SI-DAG:  v_mac_f32_e32 v[[C_F32_1]], v[[A_F32_1]], v[[B_F32_1]]
321 ; SI-DAG:  v_cvt_f16_f32_e32 v[[R_F16_1:[0-9]+]], v[[C_F32_1]]
322 ; SI:  v_lshlrev_b32_e32 v[[R_F16_HI:[0-9]+]], 16, v[[R_F16_1]]
323 ; VI-NOT: and
324 ; SI:  v_or_b32_e32 v[[R_V2_F16:[0-9]+]], v[[R_F16_LO]], v[[R_F16_HI]]
326 ; VI-DAG: v_lshrrev_b32_e32 v[[C_F16_1:[0-9]+]], 16, v[[C_V2_F16]]
327 ; VI-DAG: v_mac_f16_sdwa v[[C_F16_1]], v[[A_V2_F16]], v[[B_V2_F16]] dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
328 ; VI-DAG: v_mac_f16_e32 v[[C_V2_F16]], v[[A_V2_F16]], v[[B_V2_F16]]
329 ; VI-DAG: v_lshlrev_b32_e32 v[[R_F16_HI:[0-9]+]], 16, v[[C_F16_1]]
330 ; VI-NOT: and
331 ; VI:  v_or_b32_e32 v[[R_V2_F16:[0-9]+]], v[[C_V2_F16]], v[[R_F16_HI]]
333 ; GCN: {{buffer|flat}}_store_dword v[[R_V2_F16]]
334 ; GCN: s_endpgm
335 define amdgpu_kernel void @mac_v2f16(
336     ptr addrspace(1) %r,
337     ptr addrspace(1) %a,
338     ptr addrspace(1) %b,
339     ptr addrspace(1) %c) #0 {
340 entry:
341   %a.val = load <2 x half>, ptr addrspace(1) %a
342   call void @llvm.amdgcn.s.barrier() #2
343   %b.val = load <2 x half>, ptr addrspace(1) %b
344   call void @llvm.amdgcn.s.barrier() #2
345   %c.val = load <2 x half>, ptr addrspace(1) %c
347   %t.val = fmul <2 x half> %a.val, %b.val
348   %r.val = fadd <2 x half> %t.val, %c.val
350   store <2 x half> %r.val, ptr addrspace(1) %r
351   ret void
354 ; GCN-LABEL: {{^}}mac_v2f16_same_add:
355 ; SI-DAG:  v_mad_f32 v{{[0-9]}}, v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
356 ; SI-DAG:  v_mac_f32_e32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
357 ; SI-DAG:  v_mad_f32 v{{[0-9]}}, v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
358 ; SI-DAG:  v_mac_f32_e32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
360 ; VI-DAG:  v_mac_f16_sdwa v{{[0-9]}}, v{{[0-9]+}}, v{{[0-9]+}} dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
361 ; VI-DAG:  v_mad_f16 v{{[0-9]}}, v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
362 ; VI-DAG:  v_mac_f16_sdwa v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
363 ; VI-DAG:  v_mac_f16_e32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
365 ; GCN: s_endpgm
366 define amdgpu_kernel void @mac_v2f16_same_add(
367     ptr addrspace(1) %r0,
368     ptr addrspace(1) %r1,
369     ptr addrspace(1) %a,
370     ptr addrspace(1) %b,
371     ptr addrspace(1) %c,
372     ptr addrspace(1) %d,
373     ptr addrspace(1) %e) #0 {
374 entry:
375   %a.val = load <2 x half>, ptr addrspace(1) %a
376   %b.val = load <2 x half>, ptr addrspace(1) %b
377   %c.val = load <2 x half>, ptr addrspace(1) %c
378   %d.val = load <2 x half>, ptr addrspace(1) %d
379   %e.val = load <2 x half>, ptr addrspace(1) %e
381   %t0.val = fmul <2 x half> %a.val, %b.val
382   %r0.val = fadd <2 x half> %t0.val, %c.val
384   %t1.val = fmul <2 x half> %d.val, %e.val
385   %r1.val = fadd <2 x half> %t1.val, %c.val
387   store <2 x half> %r0.val, ptr addrspace(1) %r0
388   store <2 x half> %r1.val, ptr addrspace(1) %r1
389   ret void
392 ; GCN-LABEL: {{^}}mac_v2f16_neg_a:
393 ; SI: v_cvt_f32_f16_e32 [[CVT0:v[0-9]+]], {{v[0-9]+}}
394 ; SI: v_cvt_f32_f16_e32 [[CVT1:v[0-9]+]], {{v[0-9]+}}
396 ; SI: v_mad_f32 v{{[0-9]+}}, -v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
397 ; SI: v_mad_f32 v{{[0-9]+}}, -v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
399 ; VI-NOT: v_mac_f16
400 ; VI:     v_mad_f16 v{{[0-9]+}}, -v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
401 ; VI:     v_mad_f16 v{{[0-9]+}}, -v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
402 ; GCN:    s_endpgm
403 define amdgpu_kernel void @mac_v2f16_neg_a(
404     ptr addrspace(1) %r,
405     ptr addrspace(1) %a,
406     ptr addrspace(1) %b,
407     ptr addrspace(1) %c) #0 {
408 entry:
409   %a.val = load <2 x half>, ptr addrspace(1) %a
410   %b.val = load <2 x half>, ptr addrspace(1) %b
411   %c.val = load <2 x half>, ptr addrspace(1) %c
413   %a.neg = fneg <2 x half> %a.val
414   %t.val = fmul <2 x half> %a.neg, %b.val
415   %r.val = fadd <2 x half> %t.val, %c.val
417   store <2 x half> %r.val, ptr addrspace(1) %r
418   ret void
421 ; GCN-LABEL: {{^}}mac_v2f16_neg_b
422 ; SI: v_cvt_f32_f16_e32 [[CVT0:v[0-9]+]], {{v[0-9]+}}
423 ; SI: v_cvt_f32_f16_e32 [[CVT1:v[0-9]+]], {{v[0-9]+}}
424 ; SI: v_mad_f32 v{{[0-9]+}}, -v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
425 ; SI: v_mad_f32 v{{[0-9]+}}, -v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
428 ; VI-NOT: v_mac_f16
429 ; VI:     v_mad_f16 v{{[0-9]+}}, -v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
430 ; VI:     v_mad_f16 v{{[0-9]+}}, -v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
431 ; GCN:    s_endpgm
432 define amdgpu_kernel void @mac_v2f16_neg_b(
433     ptr addrspace(1) %r,
434     ptr addrspace(1) %a,
435     ptr addrspace(1) %b,
436     ptr addrspace(1) %c) #0 {
437 entry:
438   %a.val = load <2 x half>, ptr addrspace(1) %a
439   %b.val = load <2 x half>, ptr addrspace(1) %b
440   %c.val = load <2 x half>, ptr addrspace(1) %c
442   %b.neg = fneg <2 x half> %b.val
443   %t.val = fmul <2 x half> %a.val, %b.neg
444   %r.val = fadd <2 x half> %t.val, %c.val
446   store <2 x half> %r.val, ptr addrspace(1) %r
447   ret void
450 ; GCN-LABEL: {{^}}mac_v2f16_neg_c:
451 ; SI: v_cvt_f32_f16_e32 [[CVT0:v[0-9]+]], {{v[0-9]+}}
452 ; SI: v_cvt_f32_f16_e32 [[CVT1:v[0-9]+]], {{v[0-9]+}}
453 ; SI: v_cvt_f32_f16_e32 [[CVT2:v[0-9]+]], {{v[0-9]+}}
454 ; SI: v_cvt_f32_f16_e32 [[CVT3:v[0-9]+]], {{v[0-9]+}}
455 ; SI: v_cvt_f32_f16_e32 [[CVT4:v[0-9]+]], {{v[0-9]+}}
456 ; SI: v_cvt_f32_f16_e32 [[CVT5:v[0-9]+]], {{v[0-9]+}}
458 ; SI-DAG: v_mad_f32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}, -v{{[0-9]+}}
459 ; SI-DAG: v_mad_f32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}, -v{{[0-9]+}}
461 ; VI-NOT: v_mac_f16
462 ; VI:     v_mad_f16 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}, -v{{[0-9]+}}
463 ; VI:     v_mad_f16 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}, -v{{[0-9]+}}
464 ; GCN:    s_endpgm
465 define amdgpu_kernel void @mac_v2f16_neg_c(
466     ptr addrspace(1) %r,
467     ptr addrspace(1) %a,
468     ptr addrspace(1) %b,
469     ptr addrspace(1) %c) #0 {
470 entry:
471   %a.val = load <2 x half>, ptr addrspace(1) %a
472   %b.val = load <2 x half>, ptr addrspace(1) %b
473   %c.val = load <2 x half>, ptr addrspace(1) %c
475   %c.neg = fneg <2 x half> %c.val
476   %t.val = fmul <2 x half> %a.val, %b.val
477   %r.val = fadd <2 x half> %t.val, %c.neg
479   store <2 x half> %r.val, ptr addrspace(1) %r
480   ret void
483 ; GCN-LABEL: {{^}}mac_v2f16_neg_a_safe_fp_math:
485 ; SI:  v_sub_f32_e32 v[[NEG_A0:[0-9]+]], 0, v{{[0-9]+}}
486 ; SI:  v_sub_f32_e32 v[[NEG_A1:[0-9]+]], 0, v{{[0-9]+}}
487 ; SI-DAG:  v_mac_f32_e32 v{{[0-9]+}}, v[[NEG_A0]], v{{[0-9]+}}
488 ; SI-DAG:  v_mac_f32_e32 v{{[0-9]+}}, v[[NEG_A1]], v{{[0-9]+}}
490 ; VI-DAG:  v_mov_b32_e32 [[ZERO:v[0-9]+]], 0
491 ; VI-DAG:  v_sub_f16_e32 v[[NEG_A1:[0-9]+]], 0, v{{[0-9]+}}
492 ; VI-DAG:  v_sub_f16_sdwa v[[NEG_A0:[0-9]+]], [[ZERO]], v{{[0-9]+}} dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1
493 ; VI-DAG:  v_mac_f16_sdwa v{{[0-9]+}}, v[[NEG_A0]], v{{[0-9]+}} dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1
494 ; VI-DAG:  v_mac_f16_e32 v{{[0-9]+}}, v[[NEG_A1]], v{{[0-9]+}}
496 ; GCN: s_endpgm
497 define amdgpu_kernel void @mac_v2f16_neg_a_safe_fp_math(
498     ptr addrspace(1) %r,
499     ptr addrspace(1) %a,
500     ptr addrspace(1) %b,
501     ptr addrspace(1) %c) #0 {
502 entry:
503   %a.val = load <2 x half>, ptr addrspace(1) %a
504   %b.val = load <2 x half>, ptr addrspace(1) %b
505   %c.val = load <2 x half>, ptr addrspace(1) %c
507   %a.neg = fsub <2 x half> <half 0.0, half 0.0>, %a.val
508   %t.val = fmul <2 x half> %a.neg, %b.val
509   %r.val = fadd <2 x half> %t.val, %c.val
511   store <2 x half> %r.val, ptr addrspace(1) %r
512   ret void
515 ; GCN-LABEL: {{^}}mac_v2f16_neg_b_safe_fp_math:
517 ; SI:  v_sub_f32_e32 v[[NEG_A0:[0-9]+]], 0, v{{[0-9]+}}
518 ; SI:  v_sub_f32_e32 v[[NEG_A1:[0-9]+]], 0, v{{[0-9]+}}
519 ; SI-DAG:  v_mac_f32_e32 v{{[0-9]+}}, v{{[0-9]+}}, v[[NEG_A0]]
520 ; SI-DAG:  v_mac_f32_e32 v{{[0-9]+}}, v{{[0-9]+}}, v[[NEG_A1]]
522 ; VI:  v_mov_b32_e32 [[ZERO:v[0-9]+]], 0
523 ; VI:  v_sub_f16_e32 v[[NEG_A1:[0-9]+]], 0, v{{[0-9]+}}
524 ; VI:  v_sub_f16_sdwa v[[NEG_A0:[0-9]+]], [[ZERO]], v{{[0-9]+}} dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1
525 ; VI-DAG:  v_mac_f16_sdwa v{{[0-9]+}}, v{{[0-9]+}}, v[[NEG_A0]] dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
526 ; VI-DAG:  v_mac_f16_e32 v{{[0-9]+}}, v{{[0-9]+}}, v[[NEG_A1]]
528 ; GCN: s_endpgm
529 define amdgpu_kernel void @mac_v2f16_neg_b_safe_fp_math(
530     ptr addrspace(1) %r,
531     ptr addrspace(1) %a,
532     ptr addrspace(1) %b,
533     ptr addrspace(1) %c) #0 {
534 entry:
535   %a.val = load <2 x half>, ptr addrspace(1) %a
536   %b.val = load <2 x half>, ptr addrspace(1) %b
537   %c.val = load <2 x half>, ptr addrspace(1) %c
539   %b.neg = fsub <2 x half> <half 0.0, half 0.0>, %b.val
540   %t.val = fmul <2 x half> %a.val, %b.neg
541   %r.val = fadd <2 x half> %t.val, %c.val
543   store <2 x half> %r.val, ptr addrspace(1) %r
544   ret void
547 ; GCN-LABEL: {{^}}mac_v2f16_neg_c_safe_fp_math:
549 ; SI:  v_sub_f32_e32 v[[NEG_A0:[0-9]+]], 0, v{{[0-9]+}}
550 ; SI:  v_sub_f32_e32 v[[NEG_A1:[0-9]+]], 0, v{{[0-9]+}}
551 ; SI-DAG:  v_mac_f32_e32 v[[NEG_A0]], v{{[0-9]+}}, v{{[0-9]+}}
552 ; SI-DAG:  v_mac_f32_e32 v[[NEG_A1]], v{{[0-9]+}}, v{{[0-9]+}}
554 ; VI:  v_mov_b32_e32 [[ZERO:v[0-9]+]], 0
555 ; VI:  v_sub_f16_e32 v[[NEG_A1:[0-9]+]], 0, v{{[0-9]+}}
556 ; VI:  v_sub_f16_sdwa v[[NEG_A0:[0-9]+]], [[ZERO]], v{{[0-9]+}} dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1
557 ; VI-DAG:  v_mac_f16_sdwa v[[NEG_A0]], v{{[0-9]+}}, v{{[0-9]+}} dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
558 ; VI-DAG:  v_mac_f16_e32 v[[NEG_A1]], v{{[0-9]+}}, v{{[0-9]+}}
560 ; GCN: s_endpgm
561 define amdgpu_kernel void @mac_v2f16_neg_c_safe_fp_math(
562     ptr addrspace(1) %r,
563     ptr addrspace(1) %a,
564     ptr addrspace(1) %b,
565     ptr addrspace(1) %c) #0 {
566 entry:
567   %a.val = load <2 x half>, ptr addrspace(1) %a
568   %b.val = load <2 x half>, ptr addrspace(1) %b
569   %c.val = load <2 x half>, ptr addrspace(1) %c
571   %c.neg = fsub <2 x half> <half 0.0, half 0.0>, %c.val
572   %t.val = fmul <2 x half> %a.val, %b.val
573   %r.val = fadd <2 x half> %t.val, %c.neg
575   store <2 x half> %r.val, ptr addrspace(1) %r
576   ret void
579 ; GCN-LABEL: {{^}}mac_v2f16_neg_a_nsz_fp_math:
580 ; SI: v_cvt_f32_f16_e32 [[CVT0:v[0-9]+]], {{v[0-9]+}}
581 ; SI: v_cvt_f32_f16_e32 [[CVT1:v[0-9]+]], {{v[0-9]+}}
582 ; SI: v_cvt_f32_f16_e32 [[CVT2:v[0-9]+]], {{v[0-9]+}}
583 ; SI: v_cvt_f32_f16_e32 [[CVT3:v[0-9]+]], {{v[0-9]+}}
584 ; SI: v_cvt_f32_f16_e32 [[CVT4:v[0-9]+]], {{v[0-9]+}}
585 ; SI: v_cvt_f32_f16_e32 [[CVT5:v[0-9]+]], {{v[0-9]+}}
587 ; SI-DAG: v_mad_f32 v{{[0-9]+}}, -v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
588 ; SI-DAG: v_mad_f32 v{{[0-9]+}}, -v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
590 ; VI-NOT: v_mac_f16
591 ; VI:     v_mad_f16 v{{[0-9]+}}, -v{{[0-9]+}}, v{{[0-9]+}}, v{{[-0-9]}}
592 ; VI:     v_mad_f16 v{{[0-9]+}}, -v{{[0-9]+}}, v{{[0-9]+}}, v{{[-0-9]}}
593 ; GCN:    s_endpgm
594 define amdgpu_kernel void @mac_v2f16_neg_a_nsz_fp_math(
595     ptr addrspace(1) %r,
596     ptr addrspace(1) %a,
597     ptr addrspace(1) %b,
598     ptr addrspace(1) %c) #1 {
599 entry:
600   %a.val = load <2 x half>, ptr addrspace(1) %a
601   %b.val = load <2 x half>, ptr addrspace(1) %b
602   %c.val = load <2 x half>, ptr addrspace(1) %c
604   %a.neg = fsub <2 x half> <half 0.0, half 0.0>, %a.val
605   %t.val = fmul <2 x half> %a.neg, %b.val
606   %r.val = fadd <2 x half> %t.val, %c.val
608   store <2 x half> %r.val, ptr addrspace(1) %r
609   ret void
612 ; GCN-LABEL: {{^}}mac_v2f16_neg_b_nsz_fp_math:
613 ; SI: v_cvt_f32_f16_e32 [[CVT0:v[0-9]+]], {{v[0-9]+}}
614 ; SI: v_cvt_f32_f16_e32 [[CVT1:v[0-9]+]], {{v[0-9]+}}
615 ; SI: v_cvt_f32_f16_e32 [[CVT2:v[0-9]+]], {{v[0-9]+}}
616 ; SI: v_cvt_f32_f16_e32 [[CVT3:v[0-9]+]], {{v[0-9]+}}
617 ; SI: v_cvt_f32_f16_e32 [[CVT4:v[0-9]+]], {{v[0-9]+}}
618 ; SI: v_cvt_f32_f16_e32 [[CVT5:v[0-9]+]], {{v[0-9]+}}
620 ; SI-DAG: v_mad_f32 v{{[0-9]+}}, -v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
621 ; SI-DAG: v_mad_f32 v{{[0-9]+}}, -v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
623 ; VI-NOT: v_mac_f16
624 ; VI:     v_mad_f16 v{{[0-9]+}}, -v{{[0-9]+}}, v{{[0-9]+}}, v{{[-0-9]}}
625 ; VI:     v_mad_f16 v{{[0-9]+}}, -v{{[0-9]+}}, v{{[0-9]+}}, v{{[-0-9]}}
626 ; GCN:    s_endpgm
627 define amdgpu_kernel void @mac_v2f16_neg_b_nsz_fp_math(
628     ptr addrspace(1) %r,
629     ptr addrspace(1) %a,
630     ptr addrspace(1) %b,
631     ptr addrspace(1) %c) #1 {
632 entry:
633   %a.val = load <2 x half>, ptr addrspace(1) %a
634   %b.val = load <2 x half>, ptr addrspace(1) %b
635   %c.val = load <2 x half>, ptr addrspace(1) %c
637   %b.neg = fsub <2 x half> <half 0.0, half 0.0>, %b.val
638   %t.val = fmul <2 x half> %a.val, %b.neg
639   %r.val = fadd <2 x half> %t.val, %c.val
641   store <2 x half> %r.val, ptr addrspace(1) %r
642   ret void
645 ; GCN-LABEL: {{^}}mac_v2f16_neg_c_nsz_fp_math:
646 ; SI: v_cvt_f32_f16_e32 [[CVT0:v[0-9]+]], {{v[0-9]+}}
647 ; SI: v_cvt_f32_f16_e32 [[CVT1:v[0-9]+]], {{v[0-9]+}}
648 ; SI: v_cvt_f32_f16_e32 [[CVT2:v[0-9]+]], {{v[0-9]+}}
649 ; SI: v_cvt_f32_f16_e32 [[CVT3:v[0-9]+]], {{v[0-9]+}}
650 ; SI: v_cvt_f32_f16_e32 [[CVT4:v[0-9]+]], {{v[0-9]+}}
651 ; SI: v_cvt_f32_f16_e32 [[CVT5:v[0-9]+]], {{v[0-9]+}}
653 ; SI-DAG: v_mad_f32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}, -v{{[0-9]+}}
654 ; SI-DAG: v_mad_f32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}, -v{{[0-9]+}}
656 ; VI-NOT: v_mac_f16
657 ; VI:     v_mad_f16 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}, -v{{[-0-9]}}
658 ; VI:     v_mad_f16 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}, -v{{[-0-9]}}
659 ; GCN:    s_endpgm
660 define amdgpu_kernel void @mac_v2f16_neg_c_nsz_fp_math(
661     ptr addrspace(1) %r,
662     ptr addrspace(1) %a,
663     ptr addrspace(1) %b,
664     ptr addrspace(1) %c) #1 {
665 entry:
666   %a.val = load <2 x half>, ptr addrspace(1) %a
667   %b.val = load <2 x half>, ptr addrspace(1) %b
668   %c.val = load <2 x half>, ptr addrspace(1) %c
670   %c.neg = fsub <2 x half> <half 0.0, half 0.0>, %c.val
671   %t.val = fmul <2 x half> %a.val, %b.val
672   %r.val = fadd <2 x half> %t.val, %c.neg
674   store <2 x half> %r.val, ptr addrspace(1) %r
675   ret void
678 declare void @llvm.amdgcn.s.barrier() #2
680 attributes #0 = { nounwind "no-signed-zeros-fp-math"="false" "denormal-fp-math"="preserve-sign,preserve-sign" }
681 attributes #1 = { nounwind "no-signed-zeros-fp-math"="true" "denormal-fp-math"="preserve-sign,preserve-sign" }
682 attributes #2 = { nounwind convergent }