1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -global-isel -march=amdgcn -mcpu=tahiti < %s | FileCheck -check-prefix=GFX6 %s
3; RUN: llc -global-isel -march=amdgcn -mcpu=fiji < %s | FileCheck -check-prefix=GFX8 %s
4; RUN: llc -global-isel -march=amdgcn -mcpu=gfx900 < %s | FileCheck -check-prefix=GFX9 %s
5; RUN: llc -global-isel -march=amdgcn -mcpu=gfx1010 < %s | FileCheck -check-prefix=GFX10 %s
6
7define float @v_fma_f32(float %x, float %y, float %z) {
8; GFX6-LABEL: v_fma_f32:
9; GFX6:       ; %bb.0:
10; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
11; GFX6-NEXT:    v_fma_f32 v0, v0, v1, v2
12; GFX6-NEXT:    s_setpc_b64 s[30:31]
13;
14; GFX8-LABEL: v_fma_f32:
15; GFX8:       ; %bb.0:
16; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
17; GFX8-NEXT:    v_fma_f32 v0, v0, v1, v2
18; GFX8-NEXT:    s_setpc_b64 s[30:31]
19;
20; GFX9-LABEL: v_fma_f32:
21; GFX9:       ; %bb.0:
22; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
23; GFX9-NEXT:    v_fma_f32 v0, v0, v1, v2
24; GFX9-NEXT:    s_setpc_b64 s[30:31]
25;
26; GFX10-LABEL: v_fma_f32:
27; GFX10:       ; %bb.0:
28; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
29; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
30; GFX10-NEXT:    v_fma_f32 v0, v0, v1, v2
31; GFX10-NEXT:    s_setpc_b64 s[30:31]
32  %fma = call float @llvm.fma.f32(float %x, float %y, float %z)
33  ret float %fma
34}
35
36define <2 x float> @v_fma_v2f32(<2 x float> %x, <2 x float> %y, <2 x float> %z) {
37; GFX6-LABEL: v_fma_v2f32:
38; GFX6:       ; %bb.0:
39; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
40; GFX6-NEXT:    v_fma_f32 v0, v0, v2, v4
41; GFX6-NEXT:    v_fma_f32 v1, v1, v3, v5
42; GFX6-NEXT:    s_setpc_b64 s[30:31]
43;
44; GFX8-LABEL: v_fma_v2f32:
45; GFX8:       ; %bb.0:
46; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
47; GFX8-NEXT:    v_fma_f32 v0, v0, v2, v4
48; GFX8-NEXT:    v_fma_f32 v1, v1, v3, v5
49; GFX8-NEXT:    s_setpc_b64 s[30:31]
50;
51; GFX9-LABEL: v_fma_v2f32:
52; GFX9:       ; %bb.0:
53; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
54; GFX9-NEXT:    v_fma_f32 v0, v0, v2, v4
55; GFX9-NEXT:    v_fma_f32 v1, v1, v3, v5
56; GFX9-NEXT:    s_setpc_b64 s[30:31]
57;
58; GFX10-LABEL: v_fma_v2f32:
59; GFX10:       ; %bb.0:
60; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
61; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
62; GFX10-NEXT:    v_fma_f32 v0, v0, v2, v4
63; GFX10-NEXT:    v_fma_f32 v1, v1, v3, v5
64; GFX10-NEXT:    s_setpc_b64 s[30:31]
65  %fma = call <2 x float> @llvm.fma.v2f32(<2 x float> %x, <2 x float> %y, <2 x float> %z)
66  ret <2 x float> %fma
67}
68
69define half @v_fma_f16(half %x, half %y, half %z) {
70; GFX6-LABEL: v_fma_f16:
71; GFX6:       ; %bb.0:
72; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
73; GFX6-NEXT:    v_cvt_f32_f16_e32 v0, v0
74; GFX6-NEXT:    v_cvt_f32_f16_e32 v1, v1
75; GFX6-NEXT:    v_cvt_f32_f16_e32 v2, v2
76; GFX6-NEXT:    v_fma_f32 v0, v0, v1, v2
77; GFX6-NEXT:    v_cvt_f16_f32_e32 v0, v0
78; GFX6-NEXT:    s_setpc_b64 s[30:31]
79;
80; GFX8-LABEL: v_fma_f16:
81; GFX8:       ; %bb.0:
82; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
83; GFX8-NEXT:    v_fma_f16 v0, v0, v1, v2
84; GFX8-NEXT:    s_setpc_b64 s[30:31]
85;
86; GFX9-LABEL: v_fma_f16:
87; GFX9:       ; %bb.0:
88; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
89; GFX9-NEXT:    v_fma_f16 v0, v0, v1, v2
90; GFX9-NEXT:    s_setpc_b64 s[30:31]
91;
92; GFX10-LABEL: v_fma_f16:
93; GFX10:       ; %bb.0:
94; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
95; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
96; GFX10-NEXT:    v_fmac_f16_e32 v2, v0, v1
97; GFX10-NEXT:    v_mov_b32_e32 v0, v2
98; GFX10-NEXT:    s_setpc_b64 s[30:31]
99  %fma = call half @llvm.fma.f16(half %x, half %y, half %z)
100  ret half %fma
101}
102
103define <2 x half> @v_fma_v2f16(<2 x half> %x, <2 x half> %y, <2 x half> %z) {
104; GFX6-LABEL: v_fma_v2f16:
105; GFX6:       ; %bb.0:
106; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
107; GFX6-NEXT:    v_lshrrev_b32_e32 v3, 16, v0
108; GFX6-NEXT:    v_lshrrev_b32_e32 v4, 16, v1
109; GFX6-NEXT:    v_lshrrev_b32_e32 v5, 16, v2
110; GFX6-NEXT:    v_cvt_f32_f16_e32 v0, v0
111; GFX6-NEXT:    v_cvt_f32_f16_e32 v1, v1
112; GFX6-NEXT:    v_cvt_f32_f16_e32 v2, v2
113; GFX6-NEXT:    v_cvt_f32_f16_e32 v3, v3
114; GFX6-NEXT:    v_cvt_f32_f16_e32 v4, v4
115; GFX6-NEXT:    v_cvt_f32_f16_e32 v5, v5
116; GFX6-NEXT:    v_fma_f32 v0, v0, v1, v2
117; GFX6-NEXT:    v_cvt_f16_f32_e32 v0, v0
118; GFX6-NEXT:    v_fma_f32 v1, v3, v4, v5
119; GFX6-NEXT:    v_cvt_f16_f32_e32 v1, v1
120; GFX6-NEXT:    v_bfe_u32 v0, v0, 0, 16
121; GFX6-NEXT:    v_bfe_u32 v1, v1, 0, 16
122; GFX6-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
123; GFX6-NEXT:    v_or_b32_e32 v0, v0, v1
124; GFX6-NEXT:    s_setpc_b64 s[30:31]
125;
126; GFX8-LABEL: v_fma_v2f16:
127; GFX8:       ; %bb.0:
128; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
129; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 16, v0
130; GFX8-NEXT:    v_lshrrev_b32_e32 v4, 16, v1
131; GFX8-NEXT:    v_lshrrev_b32_e32 v5, 16, v2
132; GFX8-NEXT:    v_fma_f16 v0, v0, v1, v2
133; GFX8-NEXT:    v_fma_f16 v1, v3, v4, v5
134; GFX8-NEXT:    v_mov_b32_e32 v2, 16
135; GFX8-NEXT:    v_lshlrev_b32_sdwa v1, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_0
136; GFX8-NEXT:    v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
137; GFX8-NEXT:    s_setpc_b64 s[30:31]
138;
139; GFX9-LABEL: v_fma_v2f16:
140; GFX9:       ; %bb.0:
141; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
142; GFX9-NEXT:    v_pk_fma_f16 v0, v0, v1, v2
143; GFX9-NEXT:    s_setpc_b64 s[30:31]
144;
145; GFX10-LABEL: v_fma_v2f16:
146; GFX10:       ; %bb.0:
147; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
148; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
149; GFX10-NEXT:    v_pk_fma_f16 v0, v0, v1, v2
150; GFX10-NEXT:    s_setpc_b64 s[30:31]
151  %fma = call <2 x half> @llvm.fma.v2f16(<2 x half> %x, <2 x half> %y, <2 x half> %z)
152  ret <2 x half> %fma
153}
154
155define <2 x half> @v_fma_v2f16_fneg_lhs(<2 x half> %x, <2 x half> %y, <2 x half> %z) {
156; GFX6-LABEL: v_fma_v2f16_fneg_lhs:
157; GFX6:       ; %bb.0:
158; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
159; GFX6-NEXT:    v_xor_b32_e32 v0, 0x80008000, v0
160; GFX6-NEXT:    v_lshrrev_b32_e32 v3, 16, v0
161; GFX6-NEXT:    v_lshrrev_b32_e32 v4, 16, v1
162; GFX6-NEXT:    v_lshrrev_b32_e32 v5, 16, v2
163; GFX6-NEXT:    v_cvt_f32_f16_e32 v0, v0
164; GFX6-NEXT:    v_cvt_f32_f16_e32 v1, v1
165; GFX6-NEXT:    v_cvt_f32_f16_e32 v2, v2
166; GFX6-NEXT:    v_cvt_f32_f16_e32 v3, v3
167; GFX6-NEXT:    v_cvt_f32_f16_e32 v4, v4
168; GFX6-NEXT:    v_cvt_f32_f16_e32 v5, v5
169; GFX6-NEXT:    v_fma_f32 v0, v0, v1, v2
170; GFX6-NEXT:    v_cvt_f16_f32_e32 v0, v0
171; GFX6-NEXT:    v_fma_f32 v1, v3, v4, v5
172; GFX6-NEXT:    v_cvt_f16_f32_e32 v1, v1
173; GFX6-NEXT:    v_bfe_u32 v0, v0, 0, 16
174; GFX6-NEXT:    v_bfe_u32 v1, v1, 0, 16
175; GFX6-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
176; GFX6-NEXT:    v_or_b32_e32 v0, v0, v1
177; GFX6-NEXT:    s_setpc_b64 s[30:31]
178;
179; GFX8-LABEL: v_fma_v2f16_fneg_lhs:
180; GFX8:       ; %bb.0:
181; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
182; GFX8-NEXT:    v_xor_b32_e32 v0, 0x80008000, v0
183; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 16, v0
184; GFX8-NEXT:    v_lshrrev_b32_e32 v4, 16, v1
185; GFX8-NEXT:    v_lshrrev_b32_e32 v5, 16, v2
186; GFX8-NEXT:    v_fma_f16 v0, v0, v1, v2
187; GFX8-NEXT:    v_fma_f16 v1, v3, v4, v5
188; GFX8-NEXT:    v_mov_b32_e32 v2, 16
189; GFX8-NEXT:    v_lshlrev_b32_sdwa v1, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_0
190; GFX8-NEXT:    v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
191; GFX8-NEXT:    s_setpc_b64 s[30:31]
192;
193; GFX9-LABEL: v_fma_v2f16_fneg_lhs:
194; GFX9:       ; %bb.0:
195; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
196; GFX9-NEXT:    v_pk_fma_f16 v0, v0, v1, v2 neg_lo:[1,0,0] neg_hi:[1,0,0]
197; GFX9-NEXT:    s_setpc_b64 s[30:31]
198;
199; GFX10-LABEL: v_fma_v2f16_fneg_lhs:
200; GFX10:       ; %bb.0:
201; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
202; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
203; GFX10-NEXT:    v_pk_fma_f16 v0, v0, v1, v2 neg_lo:[1,0,0] neg_hi:[1,0,0]
204; GFX10-NEXT:    s_setpc_b64 s[30:31]
205  %x.fneg = fneg <2 x half> %x
206  %fma = call <2 x half> @llvm.fma.v2f16(<2 x half> %x.fneg, <2 x half> %y, <2 x half> %z)
207  ret <2 x half> %fma
208}
209
210define <2 x half> @v_fma_v2f16_fneg_rhs(<2 x half> %x, <2 x half> %y, <2 x half> %z) {
211; GFX6-LABEL: v_fma_v2f16_fneg_rhs:
212; GFX6:       ; %bb.0:
213; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
214; GFX6-NEXT:    v_xor_b32_e32 v1, 0x80008000, v1
215; GFX6-NEXT:    v_lshrrev_b32_e32 v3, 16, v0
216; GFX6-NEXT:    v_lshrrev_b32_e32 v4, 16, v1
217; GFX6-NEXT:    v_lshrrev_b32_e32 v5, 16, v2
218; GFX6-NEXT:    v_cvt_f32_f16_e32 v0, v0
219; GFX6-NEXT:    v_cvt_f32_f16_e32 v1, v1
220; GFX6-NEXT:    v_cvt_f32_f16_e32 v2, v2
221; GFX6-NEXT:    v_cvt_f32_f16_e32 v3, v3
222; GFX6-NEXT:    v_cvt_f32_f16_e32 v4, v4
223; GFX6-NEXT:    v_cvt_f32_f16_e32 v5, v5
224; GFX6-NEXT:    v_fma_f32 v0, v0, v1, v2
225; GFX6-NEXT:    v_cvt_f16_f32_e32 v0, v0
226; GFX6-NEXT:    v_fma_f32 v1, v3, v4, v5
227; GFX6-NEXT:    v_cvt_f16_f32_e32 v1, v1
228; GFX6-NEXT:    v_bfe_u32 v0, v0, 0, 16
229; GFX6-NEXT:    v_bfe_u32 v1, v1, 0, 16
230; GFX6-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
231; GFX6-NEXT:    v_or_b32_e32 v0, v0, v1
232; GFX6-NEXT:    s_setpc_b64 s[30:31]
233;
234; GFX8-LABEL: v_fma_v2f16_fneg_rhs:
235; GFX8:       ; %bb.0:
236; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
237; GFX8-NEXT:    v_xor_b32_e32 v1, 0x80008000, v1
238; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 16, v0
239; GFX8-NEXT:    v_lshrrev_b32_e32 v4, 16, v1
240; GFX8-NEXT:    v_lshrrev_b32_e32 v5, 16, v2
241; GFX8-NEXT:    v_fma_f16 v0, v0, v1, v2
242; GFX8-NEXT:    v_fma_f16 v1, v3, v4, v5
243; GFX8-NEXT:    v_mov_b32_e32 v2, 16
244; GFX8-NEXT:    v_lshlrev_b32_sdwa v1, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_0
245; GFX8-NEXT:    v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
246; GFX8-NEXT:    s_setpc_b64 s[30:31]
247;
248; GFX9-LABEL: v_fma_v2f16_fneg_rhs:
249; GFX9:       ; %bb.0:
250; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
251; GFX9-NEXT:    v_pk_fma_f16 v0, v0, v1, v2 neg_lo:[0,1,0] neg_hi:[0,1,0]
252; GFX9-NEXT:    s_setpc_b64 s[30:31]
253;
254; GFX10-LABEL: v_fma_v2f16_fneg_rhs:
255; GFX10:       ; %bb.0:
256; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
257; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
258; GFX10-NEXT:    v_pk_fma_f16 v0, v0, v1, v2 neg_lo:[0,1,0] neg_hi:[0,1,0]
259; GFX10-NEXT:    s_setpc_b64 s[30:31]
260  %y.fneg = fneg <2 x half> %y
261  %fma = call <2 x half> @llvm.fma.v2f16(<2 x half> %x, <2 x half> %y.fneg, <2 x half> %z)
262  ret <2 x half> %fma
263}
264
265define <2 x half> @v_fma_v2f16_fneg_lhs_rhs(<2 x half> %x, <2 x half> %y, <2 x half> %z) {
266; GFX6-LABEL: v_fma_v2f16_fneg_lhs_rhs:
267; GFX6:       ; %bb.0:
268; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
269; GFX6-NEXT:    s_mov_b32 s4, 0x80008000
270; GFX6-NEXT:    v_xor_b32_e32 v0, s4, v0
271; GFX6-NEXT:    v_xor_b32_e32 v1, s4, v1
272; GFX6-NEXT:    v_lshrrev_b32_e32 v3, 16, v0
273; GFX6-NEXT:    v_lshrrev_b32_e32 v4, 16, v1
274; GFX6-NEXT:    v_lshrrev_b32_e32 v5, 16, v2
275; GFX6-NEXT:    v_cvt_f32_f16_e32 v0, v0
276; GFX6-NEXT:    v_cvt_f32_f16_e32 v1, v1
277; GFX6-NEXT:    v_cvt_f32_f16_e32 v2, v2
278; GFX6-NEXT:    v_cvt_f32_f16_e32 v3, v3
279; GFX6-NEXT:    v_cvt_f32_f16_e32 v4, v4
280; GFX6-NEXT:    v_cvt_f32_f16_e32 v5, v5
281; GFX6-NEXT:    v_fma_f32 v0, v0, v1, v2
282; GFX6-NEXT:    v_cvt_f16_f32_e32 v0, v0
283; GFX6-NEXT:    v_fma_f32 v1, v3, v4, v5
284; GFX6-NEXT:    v_cvt_f16_f32_e32 v1, v1
285; GFX6-NEXT:    v_bfe_u32 v0, v0, 0, 16
286; GFX6-NEXT:    v_bfe_u32 v1, v1, 0, 16
287; GFX6-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
288; GFX6-NEXT:    v_or_b32_e32 v0, v0, v1
289; GFX6-NEXT:    s_setpc_b64 s[30:31]
290;
291; GFX8-LABEL: v_fma_v2f16_fneg_lhs_rhs:
292; GFX8:       ; %bb.0:
293; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
294; GFX8-NEXT:    s_mov_b32 s4, 0x80008000
295; GFX8-NEXT:    v_xor_b32_e32 v0, s4, v0
296; GFX8-NEXT:    v_xor_b32_e32 v1, s4, v1
297; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 16, v0
298; GFX8-NEXT:    v_lshrrev_b32_e32 v4, 16, v1
299; GFX8-NEXT:    v_lshrrev_b32_e32 v5, 16, v2
300; GFX8-NEXT:    v_fma_f16 v0, v0, v1, v2
301; GFX8-NEXT:    v_fma_f16 v1, v3, v4, v5
302; GFX8-NEXT:    v_mov_b32_e32 v2, 16
303; GFX8-NEXT:    v_lshlrev_b32_sdwa v1, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_0
304; GFX8-NEXT:    v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
305; GFX8-NEXT:    s_setpc_b64 s[30:31]
306;
307; GFX9-LABEL: v_fma_v2f16_fneg_lhs_rhs:
308; GFX9:       ; %bb.0:
309; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
310; GFX9-NEXT:    v_pk_fma_f16 v0, v0, v1, v2 neg_lo:[1,1,0] neg_hi:[1,1,0]
311; GFX9-NEXT:    s_setpc_b64 s[30:31]
312;
313; GFX10-LABEL: v_fma_v2f16_fneg_lhs_rhs:
314; GFX10:       ; %bb.0:
315; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
316; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
317; GFX10-NEXT:    v_pk_fma_f16 v0, v0, v1, v2 neg_lo:[1,1,0] neg_hi:[1,1,0]
318; GFX10-NEXT:    s_setpc_b64 s[30:31]
319  %x.fneg = fneg <2 x half> %x
320  %y.fneg = fneg <2 x half> %y
321  %fma = call <2 x half> @llvm.fma.v2f16(<2 x half> %x.fneg, <2 x half> %y.fneg, <2 x half> %z)
322  ret <2 x half> %fma
323}
324
325; FIXME:
326; define <3 x half> @v_fma_v3f16(<3 x half> %x, <3 x half> %y, <3 x half> %z) {
327;   %fma = call <3 x half> @llvm.fma.v3f16(<3 x half> %x, <3 x half> %y, <3 x half> %z)
328;   ret <3 x half> %fma
329; }
330
331define <4 x half> @v_fma_v4f16(<4 x half> %x, <4 x half> %y, <4 x half> %z) {
332; GFX6-LABEL: v_fma_v4f16:
333; GFX6:       ; %bb.0:
334; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
335; GFX6-NEXT:    v_cvt_f32_f16_e32 v0, v0
336; GFX6-NEXT:    v_cvt_f32_f16_e32 v4, v4
337; GFX6-NEXT:    v_cvt_f32_f16_e32 v8, v8
338; GFX6-NEXT:    v_cvt_f32_f16_e32 v1, v1
339; GFX6-NEXT:    v_cvt_f32_f16_e32 v5, v5
340; GFX6-NEXT:    v_cvt_f32_f16_e32 v9, v9
341; GFX6-NEXT:    v_fma_f32 v0, v0, v4, v8
342; GFX6-NEXT:    v_cvt_f32_f16_e32 v4, v6
343; GFX6-NEXT:    v_cvt_f32_f16_e32 v6, v7
344; GFX6-NEXT:    v_fma_f32 v1, v1, v5, v9
345; GFX6-NEXT:    v_cvt_f32_f16_e32 v2, v2
346; GFX6-NEXT:    v_cvt_f32_f16_e32 v5, v10
347; GFX6-NEXT:    v_cvt_f32_f16_e32 v3, v3
348; GFX6-NEXT:    v_cvt_f32_f16_e32 v7, v11
349; GFX6-NEXT:    v_cvt_f16_f32_e32 v0, v0
350; GFX6-NEXT:    v_fma_f32 v2, v2, v4, v5
351; GFX6-NEXT:    v_cvt_f16_f32_e32 v1, v1
352; GFX6-NEXT:    v_fma_f32 v3, v3, v6, v7
353; GFX6-NEXT:    v_cvt_f16_f32_e32 v2, v2
354; GFX6-NEXT:    v_cvt_f16_f32_e32 v3, v3
355; GFX6-NEXT:    s_setpc_b64 s[30:31]
356;
357; GFX8-LABEL: v_fma_v4f16:
358; GFX8:       ; %bb.0:
359; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
360; GFX8-NEXT:    v_lshrrev_b32_e32 v6, 16, v0
361; GFX8-NEXT:    v_lshrrev_b32_e32 v8, 16, v2
362; GFX8-NEXT:    v_lshrrev_b32_e32 v10, 16, v4
363; GFX8-NEXT:    v_fma_f16 v0, v0, v2, v4
364; GFX8-NEXT:    v_lshrrev_b32_e32 v7, 16, v1
365; GFX8-NEXT:    v_lshrrev_b32_e32 v9, 16, v3
366; GFX8-NEXT:    v_lshrrev_b32_e32 v11, 16, v5
367; GFX8-NEXT:    v_fma_f16 v2, v6, v8, v10
368; GFX8-NEXT:    v_mov_b32_e32 v4, 16
369; GFX8-NEXT:    v_fma_f16 v1, v1, v3, v5
370; GFX8-NEXT:    v_lshlrev_b32_sdwa v2, v4, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_0
371; GFX8-NEXT:    v_fma_f16 v3, v7, v9, v11
372; GFX8-NEXT:    v_or_b32_sdwa v0, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
373; GFX8-NEXT:    v_lshlrev_b32_sdwa v2, v4, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_0
374; GFX8-NEXT:    v_or_b32_sdwa v1, v1, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
375; GFX8-NEXT:    s_setpc_b64 s[30:31]
376;
377; GFX9-LABEL: v_fma_v4f16:
378; GFX9:       ; %bb.0:
379; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
380; GFX9-NEXT:    v_pk_fma_f16 v0, v0, v2, v4
381; GFX9-NEXT:    v_pk_fma_f16 v1, v1, v3, v5
382; GFX9-NEXT:    s_setpc_b64 s[30:31]
383;
384; GFX10-LABEL: v_fma_v4f16:
385; GFX10:       ; %bb.0:
386; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
387; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
388; GFX10-NEXT:    v_pk_fma_f16 v0, v0, v2, v4
389; GFX10-NEXT:    v_pk_fma_f16 v1, v1, v3, v5
390; GFX10-NEXT:    s_setpc_b64 s[30:31]
391  %fma = call <4 x half> @llvm.fma.v4f16(<4 x half> %x, <4 x half> %y, <4 x half> %z)
392  ret <4 x half> %fma
393}
394
395define double @v_fma_f64(double %x, double %y, double %z) {
396; GFX6-LABEL: v_fma_f64:
397; GFX6:       ; %bb.0:
398; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
399; GFX6-NEXT:    v_fma_f64 v[0:1], v[0:1], v[2:3], v[4:5]
400; GFX6-NEXT:    s_setpc_b64 s[30:31]
401;
402; GFX8-LABEL: v_fma_f64:
403; GFX8:       ; %bb.0:
404; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
405; GFX8-NEXT:    v_fma_f64 v[0:1], v[0:1], v[2:3], v[4:5]
406; GFX8-NEXT:    s_setpc_b64 s[30:31]
407;
408; GFX9-LABEL: v_fma_f64:
409; GFX9:       ; %bb.0:
410; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
411; GFX9-NEXT:    v_fma_f64 v[0:1], v[0:1], v[2:3], v[4:5]
412; GFX9-NEXT:    s_setpc_b64 s[30:31]
413;
414; GFX10-LABEL: v_fma_f64:
415; GFX10:       ; %bb.0:
416; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
417; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
418; GFX10-NEXT:    v_fma_f64 v[0:1], v[0:1], v[2:3], v[4:5]
419; GFX10-NEXT:    s_setpc_b64 s[30:31]
420  %fma = call double @llvm.fma.f64(double %x, double %y, double %z)
421  ret double %fma
422}
423
424define double @v_fma_f64_fneg_all(double %x, double %y, double %z) {
425; GFX6-LABEL: v_fma_f64_fneg_all:
426; GFX6:       ; %bb.0:
427; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
428; GFX6-NEXT:    v_fma_f64 v[0:1], -v[0:1], -v[2:3], -v[4:5]
429; GFX6-NEXT:    s_setpc_b64 s[30:31]
430;
431; GFX8-LABEL: v_fma_f64_fneg_all:
432; GFX8:       ; %bb.0:
433; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
434; GFX8-NEXT:    v_fma_f64 v[0:1], -v[0:1], -v[2:3], -v[4:5]
435; GFX8-NEXT:    s_setpc_b64 s[30:31]
436;
437; GFX9-LABEL: v_fma_f64_fneg_all:
438; GFX9:       ; %bb.0:
439; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
440; GFX9-NEXT:    v_fma_f64 v[0:1], -v[0:1], -v[2:3], -v[4:5]
441; GFX9-NEXT:    s_setpc_b64 s[30:31]
442;
443; GFX10-LABEL: v_fma_f64_fneg_all:
444; GFX10:       ; %bb.0:
445; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
446; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
447; GFX10-NEXT:    v_fma_f64 v[0:1], -v[0:1], -v[2:3], -v[4:5]
448; GFX10-NEXT:    s_setpc_b64 s[30:31]
449  %neg.x = fneg double %x
450  %neg.y = fneg double %y
451  %neg.z = fneg double %z
452  %fma = call double @llvm.fma.f64(double %neg.x, double %neg.y, double %neg.z)
453  ret double %fma
454}
455
456define <2 x double> @v_fma_v2f64(<2 x double> %x, <2 x double> %y, <2 x double> %z) {
457; GFX6-LABEL: v_fma_v2f64:
458; GFX6:       ; %bb.0:
459; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
460; GFX6-NEXT:    v_fma_f64 v[0:1], v[0:1], v[4:5], v[8:9]
461; GFX6-NEXT:    v_fma_f64 v[2:3], v[2:3], v[6:7], v[10:11]
462; GFX6-NEXT:    s_setpc_b64 s[30:31]
463;
464; GFX8-LABEL: v_fma_v2f64:
465; GFX8:       ; %bb.0:
466; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
467; GFX8-NEXT:    v_fma_f64 v[0:1], v[0:1], v[4:5], v[8:9]
468; GFX8-NEXT:    v_fma_f64 v[2:3], v[2:3], v[6:7], v[10:11]
469; GFX8-NEXT:    s_setpc_b64 s[30:31]
470;
471; GFX9-LABEL: v_fma_v2f64:
472; GFX9:       ; %bb.0:
473; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
474; GFX9-NEXT:    v_fma_f64 v[0:1], v[0:1], v[4:5], v[8:9]
475; GFX9-NEXT:    v_fma_f64 v[2:3], v[2:3], v[6:7], v[10:11]
476; GFX9-NEXT:    s_setpc_b64 s[30:31]
477;
478; GFX10-LABEL: v_fma_v2f64:
479; GFX10:       ; %bb.0:
480; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
481; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
482; GFX10-NEXT:    v_fma_f64 v[0:1], v[0:1], v[4:5], v[8:9]
483; GFX10-NEXT:    v_fma_f64 v[2:3], v[2:3], v[6:7], v[10:11]
484; GFX10-NEXT:    s_setpc_b64 s[30:31]
485  %fma = call <2 x double> @llvm.fma.v2f64(<2 x double> %x, <2 x double> %y, <2 x double> %z)
486  ret <2 x double> %fma
487}
488
489define float @v_fma_f32_fabs_lhs(float %x, float %y, float %z) {
490; GFX6-LABEL: v_fma_f32_fabs_lhs:
491; GFX6:       ; %bb.0:
492; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
493; GFX6-NEXT:    v_fma_f32 v0, |v0|, v1, v2
494; GFX6-NEXT:    s_setpc_b64 s[30:31]
495;
496; GFX8-LABEL: v_fma_f32_fabs_lhs:
497; GFX8:       ; %bb.0:
498; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
499; GFX8-NEXT:    v_fma_f32 v0, |v0|, v1, v2
500; GFX8-NEXT:    s_setpc_b64 s[30:31]
501;
502; GFX9-LABEL: v_fma_f32_fabs_lhs:
503; GFX9:       ; %bb.0:
504; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
505; GFX9-NEXT:    v_fma_f32 v0, |v0|, v1, v2
506; GFX9-NEXT:    s_setpc_b64 s[30:31]
507;
508; GFX10-LABEL: v_fma_f32_fabs_lhs:
509; GFX10:       ; %bb.0:
510; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
511; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
512; GFX10-NEXT:    v_fma_f32 v0, v1, |v0|, v2
513; GFX10-NEXT:    s_setpc_b64 s[30:31]
514  %fabs.x = call float @llvm.fabs.f32(float %x)
515  %fma = call float @llvm.fma.f32(float %fabs.x, float %y, float %z)
516  ret float %fma
517}
518
519define float @v_fma_f32_fabs_rhs(float %x, float %y, float %z) {
520; GFX6-LABEL: v_fma_f32_fabs_rhs:
521; GFX6:       ; %bb.0:
522; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
523; GFX6-NEXT:    v_fma_f32 v0, v0, |v1|, v2
524; GFX6-NEXT:    s_setpc_b64 s[30:31]
525;
526; GFX8-LABEL: v_fma_f32_fabs_rhs:
527; GFX8:       ; %bb.0:
528; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
529; GFX8-NEXT:    v_fma_f32 v0, v0, |v1|, v2
530; GFX8-NEXT:    s_setpc_b64 s[30:31]
531;
532; GFX9-LABEL: v_fma_f32_fabs_rhs:
533; GFX9:       ; %bb.0:
534; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
535; GFX9-NEXT:    v_fma_f32 v0, v0, |v1|, v2
536; GFX9-NEXT:    s_setpc_b64 s[30:31]
537;
538; GFX10-LABEL: v_fma_f32_fabs_rhs:
539; GFX10:       ; %bb.0:
540; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
541; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
542; GFX10-NEXT:    v_fma_f32 v0, |v1|, v0, v2
543; GFX10-NEXT:    s_setpc_b64 s[30:31]
544  %fabs.y = call float @llvm.fabs.f32(float %y)
545  %fma = call float @llvm.fma.f32(float %x, float %fabs.y, float %z)
546  ret float %fma
547}
548
549define float @v_fma_f32_fabs_lhs_rhs(float %x, float %y, float %z) {
550; GFX6-LABEL: v_fma_f32_fabs_lhs_rhs:
551; GFX6:       ; %bb.0:
552; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
553; GFX6-NEXT:    v_fma_f32 v0, |v0|, |v1|, v2
554; GFX6-NEXT:    s_setpc_b64 s[30:31]
555;
556; GFX8-LABEL: v_fma_f32_fabs_lhs_rhs:
557; GFX8:       ; %bb.0:
558; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
559; GFX8-NEXT:    v_fma_f32 v0, |v0|, |v1|, v2
560; GFX8-NEXT:    s_setpc_b64 s[30:31]
561;
562; GFX9-LABEL: v_fma_f32_fabs_lhs_rhs:
563; GFX9:       ; %bb.0:
564; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
565; GFX9-NEXT:    v_fma_f32 v0, |v0|, |v1|, v2
566; GFX9-NEXT:    s_setpc_b64 s[30:31]
567;
568; GFX10-LABEL: v_fma_f32_fabs_lhs_rhs:
569; GFX10:       ; %bb.0:
570; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
571; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
572; GFX10-NEXT:    v_fma_f32 v0, |v1|, |v0|, v2
573; GFX10-NEXT:    s_setpc_b64 s[30:31]
574  %fabs.x = call float @llvm.fabs.f32(float %x)
575  %fabs.y = call float @llvm.fabs.f32(float %y)
576  %fma = call float @llvm.fma.f32(float %fabs.x, float %fabs.y, float %z)
577  ret float %fma
578}
579
580define amdgpu_ps float @v_fma_f32_sgpr_vgpr_vgpr(float inreg %x, float %y, float %z) {
581; GFX6-LABEL: v_fma_f32_sgpr_vgpr_vgpr:
582; GFX6:       ; %bb.0:
583; GFX6-NEXT:    v_fma_f32 v0, s0, v0, v1
584; GFX6-NEXT:    ; return to shader part epilog
585;
586; GFX8-LABEL: v_fma_f32_sgpr_vgpr_vgpr:
587; GFX8:       ; %bb.0:
588; GFX8-NEXT:    v_fma_f32 v0, s0, v0, v1
589; GFX8-NEXT:    ; return to shader part epilog
590;
591; GFX9-LABEL: v_fma_f32_sgpr_vgpr_vgpr:
592; GFX9:       ; %bb.0:
593; GFX9-NEXT:    v_fma_f32 v0, s0, v0, v1
594; GFX9-NEXT:    ; return to shader part epilog
595;
596; GFX10-LABEL: v_fma_f32_sgpr_vgpr_vgpr:
597; GFX10:       ; %bb.0:
598; GFX10-NEXT:    v_fma_f32 v0, s0, v0, v1
599; GFX10-NEXT:    ; return to shader part epilog
600  %fma = call float @llvm.fma.f32(float %x, float %y, float %z)
601  ret float %fma
602}
603
604define amdgpu_ps float @v_fma_f32_vgpr_sgpr_vgpr(float %x, float inreg %y, float %z) {
605; GFX6-LABEL: v_fma_f32_vgpr_sgpr_vgpr:
606; GFX6:       ; %bb.0:
607; GFX6-NEXT:    v_fma_f32 v0, v0, s0, v1
608; GFX6-NEXT:    ; return to shader part epilog
609;
610; GFX8-LABEL: v_fma_f32_vgpr_sgpr_vgpr:
611; GFX8:       ; %bb.0:
612; GFX8-NEXT:    v_fma_f32 v0, v0, s0, v1
613; GFX8-NEXT:    ; return to shader part epilog
614;
615; GFX9-LABEL: v_fma_f32_vgpr_sgpr_vgpr:
616; GFX9:       ; %bb.0:
617; GFX9-NEXT:    v_fma_f32 v0, v0, s0, v1
618; GFX9-NEXT:    ; return to shader part epilog
619;
620; GFX10-LABEL: v_fma_f32_vgpr_sgpr_vgpr:
621; GFX10:       ; %bb.0:
622; GFX10-NEXT:    v_fma_f32 v0, s0, v0, v1
623; GFX10-NEXT:    ; return to shader part epilog
624  %fma = call float @llvm.fma.f32(float %x, float %y, float %z)
625  ret float %fma
626}
627
628define amdgpu_ps float @v_fma_f32_sgpr_sgpr_sgpr(float inreg %x, float inreg %y, float inreg %z) {
629; GFX6-LABEL: v_fma_f32_sgpr_sgpr_sgpr:
630; GFX6:       ; %bb.0:
631; GFX6-NEXT:    v_mov_b32_e32 v0, s1
632; GFX6-NEXT:    v_mov_b32_e32 v1, s2
633; GFX6-NEXT:    v_fma_f32 v0, s0, v0, v1
634; GFX6-NEXT:    ; return to shader part epilog
635;
636; GFX8-LABEL: v_fma_f32_sgpr_sgpr_sgpr:
637; GFX8:       ; %bb.0:
638; GFX8-NEXT:    v_mov_b32_e32 v0, s1
639; GFX8-NEXT:    v_mov_b32_e32 v1, s2
640; GFX8-NEXT:    v_fma_f32 v0, s0, v0, v1
641; GFX8-NEXT:    ; return to shader part epilog
642;
643; GFX9-LABEL: v_fma_f32_sgpr_sgpr_sgpr:
644; GFX9:       ; %bb.0:
645; GFX9-NEXT:    v_mov_b32_e32 v0, s1
646; GFX9-NEXT:    v_mov_b32_e32 v1, s2
647; GFX9-NEXT:    v_fma_f32 v0, s0, v0, v1
648; GFX9-NEXT:    ; return to shader part epilog
649;
650; GFX10-LABEL: v_fma_f32_sgpr_sgpr_sgpr:
651; GFX10:       ; %bb.0:
652; GFX10-NEXT:    v_mov_b32_e32 v0, s2
653; GFX10-NEXT:    v_fma_f32 v0, s1, s0, v0
654; GFX10-NEXT:    ; return to shader part epilog
655  %fma = call float @llvm.fma.f32(float %x, float %y, float %z)
656  ret float %fma
657}
658
659define float @v_fma_f32_fneg_lhs(float %x, float %y, float %z) {
660; GFX6-LABEL: v_fma_f32_fneg_lhs:
661; GFX6:       ; %bb.0:
662; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
663; GFX6-NEXT:    v_fma_f32 v0, -v0, v1, v2
664; GFX6-NEXT:    s_setpc_b64 s[30:31]
665;
666; GFX8-LABEL: v_fma_f32_fneg_lhs:
667; GFX8:       ; %bb.0:
668; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
669; GFX8-NEXT:    v_fma_f32 v0, -v0, v1, v2
670; GFX8-NEXT:    s_setpc_b64 s[30:31]
671;
672; GFX9-LABEL: v_fma_f32_fneg_lhs:
673; GFX9:       ; %bb.0:
674; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
675; GFX9-NEXT:    v_fma_f32 v0, -v0, v1, v2
676; GFX9-NEXT:    s_setpc_b64 s[30:31]
677;
678; GFX10-LABEL: v_fma_f32_fneg_lhs:
679; GFX10:       ; %bb.0:
680; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
681; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
682; GFX10-NEXT:    v_fma_f32 v0, v1, -v0, v2
683; GFX10-NEXT:    s_setpc_b64 s[30:31]
684  %neg.x = fneg float %x
685  %fma = call float @llvm.fma.f32(float %neg.x, float %y, float %z)
686  ret float %fma
687}
688
689define float @v_fma_f32_fneg_rhs(float %x, float %y, float %z) {
690; GFX6-LABEL: v_fma_f32_fneg_rhs:
691; GFX6:       ; %bb.0:
692; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
693; GFX6-NEXT:    v_fma_f32 v0, v0, -v1, v2
694; GFX6-NEXT:    s_setpc_b64 s[30:31]
695;
696; GFX8-LABEL: v_fma_f32_fneg_rhs:
697; GFX8:       ; %bb.0:
698; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
699; GFX8-NEXT:    v_fma_f32 v0, v0, -v1, v2
700; GFX8-NEXT:    s_setpc_b64 s[30:31]
701;
702; GFX9-LABEL: v_fma_f32_fneg_rhs:
703; GFX9:       ; %bb.0:
704; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
705; GFX9-NEXT:    v_fma_f32 v0, v0, -v1, v2
706; GFX9-NEXT:    s_setpc_b64 s[30:31]
707;
708; GFX10-LABEL: v_fma_f32_fneg_rhs:
709; GFX10:       ; %bb.0:
710; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
711; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
712; GFX10-NEXT:    v_fma_f32 v0, -v1, v0, v2
713; GFX10-NEXT:    s_setpc_b64 s[30:31]
714  %neg.y = fneg float %y
715  %fma = call float @llvm.fma.f32(float %x, float %neg.y, float %z)
716  ret float %fma
717}
718
719define float @v_fma_f32_fneg_z(float %x, float %y, float %z) {
720; GFX6-LABEL: v_fma_f32_fneg_z:
721; GFX6:       ; %bb.0:
722; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
723; GFX6-NEXT:    v_fma_f32 v0, v0, v1, -v2
724; GFX6-NEXT:    s_setpc_b64 s[30:31]
725;
726; GFX8-LABEL: v_fma_f32_fneg_z:
727; GFX8:       ; %bb.0:
728; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
729; GFX8-NEXT:    v_fma_f32 v0, v0, v1, -v2
730; GFX8-NEXT:    s_setpc_b64 s[30:31]
731;
732; GFX9-LABEL: v_fma_f32_fneg_z:
733; GFX9:       ; %bb.0:
734; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
735; GFX9-NEXT:    v_fma_f32 v0, v0, v1, -v2
736; GFX9-NEXT:    s_setpc_b64 s[30:31]
737;
738; GFX10-LABEL: v_fma_f32_fneg_z:
739; GFX10:       ; %bb.0:
740; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
741; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
742; GFX10-NEXT:    v_fma_f32 v0, v0, v1, -v2
743; GFX10-NEXT:    s_setpc_b64 s[30:31]
744  %neg.z = fneg float %z
745  %fma = call float @llvm.fma.f32(float %x, float %y, float %neg.z)
746  ret float %fma
747}
748
749declare half @llvm.fma.f16(half, half, half) #0
750declare float @llvm.fma.f32(float, float, float) #0
751declare double @llvm.fma.f64(double, double, double) #0
752
753declare half @llvm.fabs.f16(half) #0
754declare float @llvm.fabs.f32(float) #0
755
756declare <2 x half> @llvm.fma.v2f16(<2 x half>, <2 x half>, <2 x half>) #0
757declare <2 x float> @llvm.fma.v2f32(<2 x float>, <2 x float>, <2 x float>) #0
758declare <2 x double> @llvm.fma.v2f64(<2 x double>, <2 x double>, <2 x double>) #0
759
760declare <3 x half> @llvm.fma.v3f16(<3 x half>, <3 x half>, <3 x half>) #0
761declare <4 x half> @llvm.fma.v4f16(<4 x half>, <4 x half>, <4 x half>) #0
762
763attributes #0 = { nounwind readnone speculatable willreturn }
764