1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -global-isel -march=amdgcn -mcpu=tahiti -denormal-fp-math=ieee -verify-machineinstrs < %s | FileCheck -check-prefixes=GCN,GCN-IEEE,GFX6-IEEE %s
3; RUN: llc -global-isel -march=amdgcn -mcpu=tahiti -denormal-fp-math=preserve-sign -verify-machineinstrs < %s | FileCheck -check-prefixes=GCN,GCN-FLUSH,GFX6-FLUSH %s
4
5; RUN: llc -global-isel -march=amdgcn -mcpu=fiji -denormal-fp-math=ieee -verify-machineinstrs < %s | FileCheck -check-prefixes=GCN,GCN-IEEE,GFX89-IEEE %s
6; RUN: llc -global-isel -march=amdgcn -mcpu=fiji -denormal-fp-math=preserve-sign -verify-machineinstrs < %s | FileCheck -check-prefixes=GCN,GCN-FLUSH,GFX89-FLUSH %s
7
8; RUN: llc -global-isel -march=amdgcn -mcpu=gfx900 -denormal-fp-math=ieee -verify-machineinstrs < %s | FileCheck -check-prefixes=GCN,GCN-IEEE,GFX89-IEEE %s
9; RUN: llc -global-isel -march=amdgcn -mcpu=gfx900 -denormal-fp-math=preserve-sign -verify-machineinstrs < %s | FileCheck -check-prefixes=GCN,GCN-FLUSH,GFX89-FLUSH %s
10
11; RUN: llc -global-isel -march=amdgcn -mcpu=gfx1010 -denormal-fp-math=ieee -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX10,GFX10-IEEE %s
12; RUN: llc -global-isel -march=amdgcn -mcpu=gfx1010 -denormal-fp-math=preserve-sign -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX10,GFX10-FLUSH %s
13
14define float @v_fdiv_f32(float %a, float %b) {
15; GFX6-IEEE-LABEL: v_fdiv_f32:
16; GFX6-IEEE:       ; %bb.0:
17; GFX6-IEEE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
18; GFX6-IEEE-NEXT:    v_div_scale_f32 v2, s[4:5], v1, v1, v0
19; GFX6-IEEE-NEXT:    v_rcp_f32_e32 v3, v2
20; GFX6-IEEE-NEXT:    v_div_scale_f32 v4, vcc, v0, v1, v0
21; GFX6-IEEE-NEXT:    v_fma_f32 v5, -v2, v3, 1.0
22; GFX6-IEEE-NEXT:    v_fma_f32 v3, v5, v3, v3
23; GFX6-IEEE-NEXT:    v_mul_f32_e32 v5, v4, v3
24; GFX6-IEEE-NEXT:    v_fma_f32 v6, -v2, v5, v4
25; GFX6-IEEE-NEXT:    v_fma_f32 v5, v6, v3, v5
26; GFX6-IEEE-NEXT:    v_fma_f32 v2, -v2, v5, v4
27; GFX6-IEEE-NEXT:    v_div_fmas_f32 v2, v2, v3, v5
28; GFX6-IEEE-NEXT:    v_div_fixup_f32 v0, v2, v1, v0
29; GFX6-IEEE-NEXT:    s_setpc_b64 s[30:31]
30;
31; GFX6-FLUSH-LABEL: v_fdiv_f32:
32; GFX6-FLUSH:       ; %bb.0:
33; GFX6-FLUSH-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
34; GFX6-FLUSH-NEXT:    v_div_scale_f32 v2, s[4:5], v1, v1, v0
35; GFX6-FLUSH-NEXT:    v_rcp_f32_e32 v3, v2
36; GFX6-FLUSH-NEXT:    v_div_scale_f32 v4, vcc, v0, v1, v0
37; GFX6-FLUSH-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_MODE, 4, 2), 3
38; GFX6-FLUSH-NEXT:    v_fma_f32 v5, -v2, v3, 1.0
39; GFX6-FLUSH-NEXT:    v_fma_f32 v3, v5, v3, v3
40; GFX6-FLUSH-NEXT:    v_mul_f32_e32 v5, v4, v3
41; GFX6-FLUSH-NEXT:    v_fma_f32 v6, -v2, v5, v4
42; GFX6-FLUSH-NEXT:    v_fma_f32 v5, v6, v3, v5
43; GFX6-FLUSH-NEXT:    v_fma_f32 v2, -v2, v5, v4
44; GFX6-FLUSH-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_MODE, 4, 2), 0
45; GFX6-FLUSH-NEXT:    v_div_fmas_f32 v2, v2, v3, v5
46; GFX6-FLUSH-NEXT:    v_div_fixup_f32 v0, v2, v1, v0
47; GFX6-FLUSH-NEXT:    s_setpc_b64 s[30:31]
48;
49; GFX89-IEEE-LABEL: v_fdiv_f32:
50; GFX89-IEEE:       ; %bb.0:
51; GFX89-IEEE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
52; GFX89-IEEE-NEXT:    v_div_scale_f32 v2, s[4:5], v1, v1, v0
53; GFX89-IEEE-NEXT:    v_div_scale_f32 v3, vcc, v0, v1, v0
54; GFX89-IEEE-NEXT:    v_rcp_f32_e32 v4, v2
55; GFX89-IEEE-NEXT:    v_fma_f32 v5, -v2, v4, 1.0
56; GFX89-IEEE-NEXT:    v_fma_f32 v4, v5, v4, v4
57; GFX89-IEEE-NEXT:    v_mul_f32_e32 v5, v3, v4
58; GFX89-IEEE-NEXT:    v_fma_f32 v6, -v2, v5, v3
59; GFX89-IEEE-NEXT:    v_fma_f32 v5, v6, v4, v5
60; GFX89-IEEE-NEXT:    v_fma_f32 v2, -v2, v5, v3
61; GFX89-IEEE-NEXT:    v_div_fmas_f32 v2, v2, v4, v5
62; GFX89-IEEE-NEXT:    v_div_fixup_f32 v0, v2, v1, v0
63; GFX89-IEEE-NEXT:    s_setpc_b64 s[30:31]
64;
65; GFX89-FLUSH-LABEL: v_fdiv_f32:
66; GFX89-FLUSH:       ; %bb.0:
67; GFX89-FLUSH-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
68; GFX89-FLUSH-NEXT:    v_div_scale_f32 v2, s[4:5], v1, v1, v0
69; GFX89-FLUSH-NEXT:    v_div_scale_f32 v3, vcc, v0, v1, v0
70; GFX89-FLUSH-NEXT:    v_rcp_f32_e32 v4, v2
71; GFX89-FLUSH-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_MODE, 4, 2), 3
72; GFX89-FLUSH-NEXT:    v_fma_f32 v5, -v2, v4, 1.0
73; GFX89-FLUSH-NEXT:    v_fma_f32 v4, v5, v4, v4
74; GFX89-FLUSH-NEXT:    v_mul_f32_e32 v5, v3, v4
75; GFX89-FLUSH-NEXT:    v_fma_f32 v6, -v2, v5, v3
76; GFX89-FLUSH-NEXT:    v_fma_f32 v5, v6, v4, v5
77; GFX89-FLUSH-NEXT:    v_fma_f32 v2, -v2, v5, v3
78; GFX89-FLUSH-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_MODE, 4, 2), 0
79; GFX89-FLUSH-NEXT:    v_div_fmas_f32 v2, v2, v4, v5
80; GFX89-FLUSH-NEXT:    v_div_fixup_f32 v0, v2, v1, v0
81; GFX89-FLUSH-NEXT:    s_setpc_b64 s[30:31]
82;
83; GFX10-IEEE-LABEL: v_fdiv_f32:
84; GFX10-IEEE:       ; %bb.0:
85; GFX10-IEEE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
86; GFX10-IEEE-NEXT:    s_waitcnt_vscnt null, 0x0
87; GFX10-IEEE-NEXT:    v_div_scale_f32 v2, s4, v1, v1, v0
88; GFX10-IEEE-NEXT:    v_div_scale_f32 v5, vcc_lo, v0, v1, v0
89; GFX10-IEEE-NEXT:    v_rcp_f32_e32 v3, v2
90; GFX10-IEEE-NEXT:    v_fma_f32 v4, -v2, v3, 1.0
91; GFX10-IEEE-NEXT:    v_fmac_f32_e32 v3, v4, v3
92; GFX10-IEEE-NEXT:    v_mul_f32_e32 v4, v5, v3
93; GFX10-IEEE-NEXT:    v_fma_f32 v6, v4, -v2, v5
94; GFX10-IEEE-NEXT:    v_fmac_f32_e32 v4, v6, v3
95; GFX10-IEEE-NEXT:    v_fmac_f32_e64 v5, -v2, v4
96; GFX10-IEEE-NEXT:    v_div_fmas_f32 v2, v5, v3, v4
97; GFX10-IEEE-NEXT:    v_div_fixup_f32 v0, v2, v1, v0
98; GFX10-IEEE-NEXT:    s_setpc_b64 s[30:31]
99;
100; GFX10-FLUSH-LABEL: v_fdiv_f32:
101; GFX10-FLUSH:       ; %bb.0:
102; GFX10-FLUSH-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
103; GFX10-FLUSH-NEXT:    s_waitcnt_vscnt null, 0x0
104; GFX10-FLUSH-NEXT:    v_div_scale_f32 v2, s4, v1, v1, v0
105; GFX10-FLUSH-NEXT:    v_div_scale_f32 v4, vcc_lo, v0, v1, v0
106; GFX10-FLUSH-NEXT:    v_rcp_f32_e32 v3, v2
107; GFX10-FLUSH-NEXT:    s_denorm_mode 3
108; GFX10-FLUSH-NEXT:    v_fma_f32 v5, -v2, v3, 1.0
109; GFX10-FLUSH-NEXT:    v_fmac_f32_e32 v3, v5, v3
110; GFX10-FLUSH-NEXT:    v_mul_f32_e32 v5, v4, v3
111; GFX10-FLUSH-NEXT:    v_fma_f32 v6, v5, -v2, v4
112; GFX10-FLUSH-NEXT:    v_fmac_f32_e32 v5, v6, v3
113; GFX10-FLUSH-NEXT:    v_fmac_f32_e64 v4, -v2, v5
114; GFX10-FLUSH-NEXT:    s_denorm_mode 0
115; GFX10-FLUSH-NEXT:    v_div_fmas_f32 v2, v4, v3, v5
116; GFX10-FLUSH-NEXT:    v_div_fixup_f32 v0, v2, v1, v0
117; GFX10-FLUSH-NEXT:    s_setpc_b64 s[30:31]
118  %fdiv = fdiv float %a, %b
119  ret float %fdiv
120}
121
122define float @v_fdiv_f32_afn(float %a, float %b) {
123; GCN-LABEL: v_fdiv_f32_afn:
124; GCN:       ; %bb.0:
125; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
126; GCN-NEXT:    v_rcp_f32_e32 v1, v1
127; GCN-NEXT:    v_mul_f32_e32 v0, v0, v1
128; GCN-NEXT:    s_setpc_b64 s[30:31]
129;
130; GFX10-LABEL: v_fdiv_f32_afn:
131; GFX10:       ; %bb.0:
132; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
133; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
134; GFX10-NEXT:    v_rcp_f32_e32 v1, v1
135; GFX10-NEXT:    v_mul_f32_e32 v0, v0, v1
136; GFX10-NEXT:    s_setpc_b64 s[30:31]
137  %fdiv = fdiv afn float %a, %b
138  ret float %fdiv
139}
140
141define float @v_fdiv_f32_ulp25(float %a, float %b) {
142; GFX6-IEEE-LABEL: v_fdiv_f32_ulp25:
143; GFX6-IEEE:       ; %bb.0:
144; GFX6-IEEE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
145; GFX6-IEEE-NEXT:    v_div_scale_f32 v2, s[4:5], v1, v1, v0
146; GFX6-IEEE-NEXT:    v_rcp_f32_e32 v3, v2
147; GFX6-IEEE-NEXT:    v_div_scale_f32 v4, vcc, v0, v1, v0
148; GFX6-IEEE-NEXT:    v_fma_f32 v5, -v2, v3, 1.0
149; GFX6-IEEE-NEXT:    v_fma_f32 v3, v5, v3, v3
150; GFX6-IEEE-NEXT:    v_mul_f32_e32 v5, v4, v3
151; GFX6-IEEE-NEXT:    v_fma_f32 v6, -v2, v5, v4
152; GFX6-IEEE-NEXT:    v_fma_f32 v5, v6, v3, v5
153; GFX6-IEEE-NEXT:    v_fma_f32 v2, -v2, v5, v4
154; GFX6-IEEE-NEXT:    v_div_fmas_f32 v2, v2, v3, v5
155; GFX6-IEEE-NEXT:    v_div_fixup_f32 v0, v2, v1, v0
156; GFX6-IEEE-NEXT:    s_setpc_b64 s[30:31]
157;
158; GCN-FLUSH-LABEL: v_fdiv_f32_ulp25:
159; GCN-FLUSH:       ; %bb.0:
160; GCN-FLUSH-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
161; GCN-FLUSH-NEXT:    v_mov_b32_e32 v2, 0x6f800000
162; GCN-FLUSH-NEXT:    v_mov_b32_e32 v3, 0x2f800000
163; GCN-FLUSH-NEXT:    v_cmp_gt_f32_e64 vcc, |v1|, v2
164; GCN-FLUSH-NEXT:    v_cndmask_b32_e32 v2, 1.0, v3, vcc
165; GCN-FLUSH-NEXT:    v_mul_f32_e32 v1, v1, v2
166; GCN-FLUSH-NEXT:    v_rcp_f32_e32 v1, v1
167; GCN-FLUSH-NEXT:    v_mul_f32_e32 v0, v0, v1
168; GCN-FLUSH-NEXT:    v_mul_f32_e32 v0, v2, v0
169; GCN-FLUSH-NEXT:    s_setpc_b64 s[30:31]
170;
171; GFX89-IEEE-LABEL: v_fdiv_f32_ulp25:
172; GFX89-IEEE:       ; %bb.0:
173; GFX89-IEEE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
174; GFX89-IEEE-NEXT:    v_div_scale_f32 v2, s[4:5], v1, v1, v0
175; GFX89-IEEE-NEXT:    v_div_scale_f32 v3, vcc, v0, v1, v0
176; GFX89-IEEE-NEXT:    v_rcp_f32_e32 v4, v2
177; GFX89-IEEE-NEXT:    v_fma_f32 v5, -v2, v4, 1.0
178; GFX89-IEEE-NEXT:    v_fma_f32 v4, v5, v4, v4
179; GFX89-IEEE-NEXT:    v_mul_f32_e32 v5, v3, v4
180; GFX89-IEEE-NEXT:    v_fma_f32 v6, -v2, v5, v3
181; GFX89-IEEE-NEXT:    v_fma_f32 v5, v6, v4, v5
182; GFX89-IEEE-NEXT:    v_fma_f32 v2, -v2, v5, v3
183; GFX89-IEEE-NEXT:    v_div_fmas_f32 v2, v2, v4, v5
184; GFX89-IEEE-NEXT:    v_div_fixup_f32 v0, v2, v1, v0
185; GFX89-IEEE-NEXT:    s_setpc_b64 s[30:31]
186;
187; GFX10-IEEE-LABEL: v_fdiv_f32_ulp25:
188; GFX10-IEEE:       ; %bb.0:
189; GFX10-IEEE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
190; GFX10-IEEE-NEXT:    s_waitcnt_vscnt null, 0x0
191; GFX10-IEEE-NEXT:    v_div_scale_f32 v2, s4, v1, v1, v0
192; GFX10-IEEE-NEXT:    v_div_scale_f32 v5, vcc_lo, v0, v1, v0
193; GFX10-IEEE-NEXT:    v_rcp_f32_e32 v3, v2
194; GFX10-IEEE-NEXT:    v_fma_f32 v4, -v2, v3, 1.0
195; GFX10-IEEE-NEXT:    v_fmac_f32_e32 v3, v4, v3
196; GFX10-IEEE-NEXT:    v_mul_f32_e32 v4, v5, v3
197; GFX10-IEEE-NEXT:    v_fma_f32 v6, v4, -v2, v5
198; GFX10-IEEE-NEXT:    v_fmac_f32_e32 v4, v6, v3
199; GFX10-IEEE-NEXT:    v_fmac_f32_e64 v5, -v2, v4
200; GFX10-IEEE-NEXT:    v_div_fmas_f32 v2, v5, v3, v4
201; GFX10-IEEE-NEXT:    v_div_fixup_f32 v0, v2, v1, v0
202; GFX10-IEEE-NEXT:    s_setpc_b64 s[30:31]
203;
204; GFX10-FLUSH-LABEL: v_fdiv_f32_ulp25:
205; GFX10-FLUSH:       ; %bb.0:
206; GFX10-FLUSH-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
207; GFX10-FLUSH-NEXT:    s_waitcnt_vscnt null, 0x0
208; GFX10-FLUSH-NEXT:    v_cmp_lt_f32_e64 s4, 0x6f800000, |v1|
209; GFX10-FLUSH-NEXT:    v_cndmask_b32_e64 v2, 1.0, 0x2f800000, s4
210; GFX10-FLUSH-NEXT:    v_mul_f32_e32 v1, v1, v2
211; GFX10-FLUSH-NEXT:    v_rcp_f32_e32 v1, v1
212; GFX10-FLUSH-NEXT:    v_mul_f32_e32 v0, v0, v1
213; GFX10-FLUSH-NEXT:    v_mul_f32_e32 v0, v2, v0
214; GFX10-FLUSH-NEXT:    s_setpc_b64 s[30:31]
215  %fdiv = fdiv float %a, %b, !fpmath !0
216  ret float %fdiv
217}
218
219define float @v_rcp_f32(float %x) {
220; GFX6-IEEE-LABEL: v_rcp_f32:
221; GFX6-IEEE:       ; %bb.0:
222; GFX6-IEEE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
223; GFX6-IEEE-NEXT:    v_div_scale_f32 v1, s[4:5], v0, v0, 1.0
224; GFX6-IEEE-NEXT:    v_rcp_f32_e32 v2, v1
225; GFX6-IEEE-NEXT:    v_div_scale_f32 v3, vcc, 1.0, v0, 1.0
226; GFX6-IEEE-NEXT:    v_fma_f32 v4, -v1, v2, 1.0
227; GFX6-IEEE-NEXT:    v_fma_f32 v2, v4, v2, v2
228; GFX6-IEEE-NEXT:    v_mul_f32_e32 v4, v3, v2
229; GFX6-IEEE-NEXT:    v_fma_f32 v5, -v1, v4, v3
230; GFX6-IEEE-NEXT:    v_fma_f32 v4, v5, v2, v4
231; GFX6-IEEE-NEXT:    v_fma_f32 v1, -v1, v4, v3
232; GFX6-IEEE-NEXT:    v_div_fmas_f32 v1, v1, v2, v4
233; GFX6-IEEE-NEXT:    v_div_fixup_f32 v0, v1, v0, 1.0
234; GFX6-IEEE-NEXT:    s_setpc_b64 s[30:31]
235;
236; GFX6-FLUSH-LABEL: v_rcp_f32:
237; GFX6-FLUSH:       ; %bb.0:
238; GFX6-FLUSH-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
239; GFX6-FLUSH-NEXT:    v_div_scale_f32 v1, s[4:5], v0, v0, 1.0
240; GFX6-FLUSH-NEXT:    v_rcp_f32_e32 v2, v1
241; GFX6-FLUSH-NEXT:    v_div_scale_f32 v3, vcc, 1.0, v0, 1.0
242; GFX6-FLUSH-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_MODE, 4, 2), 3
243; GFX6-FLUSH-NEXT:    v_fma_f32 v4, -v1, v2, 1.0
244; GFX6-FLUSH-NEXT:    v_fma_f32 v2, v4, v2, v2
245; GFX6-FLUSH-NEXT:    v_mul_f32_e32 v4, v3, v2
246; GFX6-FLUSH-NEXT:    v_fma_f32 v5, -v1, v4, v3
247; GFX6-FLUSH-NEXT:    v_fma_f32 v4, v5, v2, v4
248; GFX6-FLUSH-NEXT:    v_fma_f32 v1, -v1, v4, v3
249; GFX6-FLUSH-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_MODE, 4, 2), 0
250; GFX6-FLUSH-NEXT:    v_div_fmas_f32 v1, v1, v2, v4
251; GFX6-FLUSH-NEXT:    v_div_fixup_f32 v0, v1, v0, 1.0
252; GFX6-FLUSH-NEXT:    s_setpc_b64 s[30:31]
253;
254; GFX89-IEEE-LABEL: v_rcp_f32:
255; GFX89-IEEE:       ; %bb.0:
256; GFX89-IEEE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
257; GFX89-IEEE-NEXT:    v_div_scale_f32 v1, s[4:5], v0, v0, 1.0
258; GFX89-IEEE-NEXT:    v_div_scale_f32 v2, vcc, 1.0, v0, 1.0
259; GFX89-IEEE-NEXT:    v_rcp_f32_e32 v3, v1
260; GFX89-IEEE-NEXT:    v_fma_f32 v4, -v1, v3, 1.0
261; GFX89-IEEE-NEXT:    v_fma_f32 v3, v4, v3, v3
262; GFX89-IEEE-NEXT:    v_mul_f32_e32 v4, v2, v3
263; GFX89-IEEE-NEXT:    v_fma_f32 v5, -v1, v4, v2
264; GFX89-IEEE-NEXT:    v_fma_f32 v4, v5, v3, v4
265; GFX89-IEEE-NEXT:    v_fma_f32 v1, -v1, v4, v2
266; GFX89-IEEE-NEXT:    v_div_fmas_f32 v1, v1, v3, v4
267; GFX89-IEEE-NEXT:    v_div_fixup_f32 v0, v1, v0, 1.0
268; GFX89-IEEE-NEXT:    s_setpc_b64 s[30:31]
269;
270; GFX89-FLUSH-LABEL: v_rcp_f32:
271; GFX89-FLUSH:       ; %bb.0:
272; GFX89-FLUSH-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
273; GFX89-FLUSH-NEXT:    v_div_scale_f32 v1, s[4:5], v0, v0, 1.0
274; GFX89-FLUSH-NEXT:    v_div_scale_f32 v2, vcc, 1.0, v0, 1.0
275; GFX89-FLUSH-NEXT:    v_rcp_f32_e32 v3, v1
276; GFX89-FLUSH-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_MODE, 4, 2), 3
277; GFX89-FLUSH-NEXT:    v_fma_f32 v4, -v1, v3, 1.0
278; GFX89-FLUSH-NEXT:    v_fma_f32 v3, v4, v3, v3
279; GFX89-FLUSH-NEXT:    v_mul_f32_e32 v4, v2, v3
280; GFX89-FLUSH-NEXT:    v_fma_f32 v5, -v1, v4, v2
281; GFX89-FLUSH-NEXT:    v_fma_f32 v4, v5, v3, v4
282; GFX89-FLUSH-NEXT:    v_fma_f32 v1, -v1, v4, v2
283; GFX89-FLUSH-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_MODE, 4, 2), 0
284; GFX89-FLUSH-NEXT:    v_div_fmas_f32 v1, v1, v3, v4
285; GFX89-FLUSH-NEXT:    v_div_fixup_f32 v0, v1, v0, 1.0
286; GFX89-FLUSH-NEXT:    s_setpc_b64 s[30:31]
287;
288; GFX10-IEEE-LABEL: v_rcp_f32:
289; GFX10-IEEE:       ; %bb.0:
290; GFX10-IEEE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
291; GFX10-IEEE-NEXT:    s_waitcnt_vscnt null, 0x0
292; GFX10-IEEE-NEXT:    v_div_scale_f32 v1, s4, v0, v0, 1.0
293; GFX10-IEEE-NEXT:    v_div_scale_f32 v4, vcc_lo, 1.0, v0, 1.0
294; GFX10-IEEE-NEXT:    v_rcp_f32_e32 v2, v1
295; GFX10-IEEE-NEXT:    v_fma_f32 v3, -v1, v2, 1.0
296; GFX10-IEEE-NEXT:    v_fmac_f32_e32 v2, v3, v2
297; GFX10-IEEE-NEXT:    v_mul_f32_e32 v3, v4, v2
298; GFX10-IEEE-NEXT:    v_fma_f32 v5, v3, -v1, v4
299; GFX10-IEEE-NEXT:    v_fmac_f32_e32 v3, v5, v2
300; GFX10-IEEE-NEXT:    v_fmac_f32_e64 v4, -v1, v3
301; GFX10-IEEE-NEXT:    v_div_fmas_f32 v1, v4, v2, v3
302; GFX10-IEEE-NEXT:    v_div_fixup_f32 v0, v1, v0, 1.0
303; GFX10-IEEE-NEXT:    s_setpc_b64 s[30:31]
304;
305; GFX10-FLUSH-LABEL: v_rcp_f32:
306; GFX10-FLUSH:       ; %bb.0:
307; GFX10-FLUSH-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
308; GFX10-FLUSH-NEXT:    s_waitcnt_vscnt null, 0x0
309; GFX10-FLUSH-NEXT:    v_div_scale_f32 v1, s4, v0, v0, 1.0
310; GFX10-FLUSH-NEXT:    v_div_scale_f32 v3, vcc_lo, 1.0, v0, 1.0
311; GFX10-FLUSH-NEXT:    v_rcp_f32_e32 v2, v1
312; GFX10-FLUSH-NEXT:    s_denorm_mode 3
313; GFX10-FLUSH-NEXT:    v_fma_f32 v4, -v1, v2, 1.0
314; GFX10-FLUSH-NEXT:    v_fmac_f32_e32 v2, v4, v2
315; GFX10-FLUSH-NEXT:    v_mul_f32_e32 v4, v3, v2
316; GFX10-FLUSH-NEXT:    v_fma_f32 v5, v4, -v1, v3
317; GFX10-FLUSH-NEXT:    v_fmac_f32_e32 v4, v5, v2
318; GFX10-FLUSH-NEXT:    v_fmac_f32_e64 v3, -v1, v4
319; GFX10-FLUSH-NEXT:    s_denorm_mode 0
320; GFX10-FLUSH-NEXT:    v_div_fmas_f32 v1, v3, v2, v4
321; GFX10-FLUSH-NEXT:    v_div_fixup_f32 v0, v1, v0, 1.0
322; GFX10-FLUSH-NEXT:    s_setpc_b64 s[30:31]
323  %fdiv = fdiv float 1.0, %x
324  ret float %fdiv
325}
326
327define float @v_rcp_f32_arcp(float %x) {
328; GFX6-IEEE-LABEL: v_rcp_f32_arcp:
329; GFX6-IEEE:       ; %bb.0:
330; GFX6-IEEE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
331; GFX6-IEEE-NEXT:    v_div_scale_f32 v1, s[4:5], v0, v0, 1.0
332; GFX6-IEEE-NEXT:    v_rcp_f32_e32 v2, v1
333; GFX6-IEEE-NEXT:    v_div_scale_f32 v3, vcc, 1.0, v0, 1.0
334; GFX6-IEEE-NEXT:    v_fma_f32 v4, -v1, v2, 1.0
335; GFX6-IEEE-NEXT:    v_fma_f32 v2, v4, v2, v2
336; GFX6-IEEE-NEXT:    v_mul_f32_e32 v4, v3, v2
337; GFX6-IEEE-NEXT:    v_fma_f32 v5, -v1, v4, v3
338; GFX6-IEEE-NEXT:    v_fma_f32 v4, v5, v2, v4
339; GFX6-IEEE-NEXT:    v_fma_f32 v1, -v1, v4, v3
340; GFX6-IEEE-NEXT:    v_div_fmas_f32 v1, v1, v2, v4
341; GFX6-IEEE-NEXT:    v_div_fixup_f32 v0, v1, v0, 1.0
342; GFX6-IEEE-NEXT:    s_setpc_b64 s[30:31]
343;
344; GFX6-FLUSH-LABEL: v_rcp_f32_arcp:
345; GFX6-FLUSH:       ; %bb.0:
346; GFX6-FLUSH-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
347; GFX6-FLUSH-NEXT:    v_div_scale_f32 v1, s[4:5], v0, v0, 1.0
348; GFX6-FLUSH-NEXT:    v_rcp_f32_e32 v2, v1
349; GFX6-FLUSH-NEXT:    v_div_scale_f32 v3, vcc, 1.0, v0, 1.0
350; GFX6-FLUSH-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_MODE, 4, 2), 3
351; GFX6-FLUSH-NEXT:    v_fma_f32 v4, -v1, v2, 1.0
352; GFX6-FLUSH-NEXT:    v_fma_f32 v2, v4, v2, v2
353; GFX6-FLUSH-NEXT:    v_mul_f32_e32 v4, v3, v2
354; GFX6-FLUSH-NEXT:    v_fma_f32 v5, -v1, v4, v3
355; GFX6-FLUSH-NEXT:    v_fma_f32 v4, v5, v2, v4
356; GFX6-FLUSH-NEXT:    v_fma_f32 v1, -v1, v4, v3
357; GFX6-FLUSH-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_MODE, 4, 2), 0
358; GFX6-FLUSH-NEXT:    v_div_fmas_f32 v1, v1, v2, v4
359; GFX6-FLUSH-NEXT:    v_div_fixup_f32 v0, v1, v0, 1.0
360; GFX6-FLUSH-NEXT:    s_setpc_b64 s[30:31]
361;
362; GFX89-IEEE-LABEL: v_rcp_f32_arcp:
363; GFX89-IEEE:       ; %bb.0:
364; GFX89-IEEE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
365; GFX89-IEEE-NEXT:    v_div_scale_f32 v1, s[4:5], v0, v0, 1.0
366; GFX89-IEEE-NEXT:    v_div_scale_f32 v2, vcc, 1.0, v0, 1.0
367; GFX89-IEEE-NEXT:    v_rcp_f32_e32 v3, v1
368; GFX89-IEEE-NEXT:    v_fma_f32 v4, -v1, v3, 1.0
369; GFX89-IEEE-NEXT:    v_fma_f32 v3, v4, v3, v3
370; GFX89-IEEE-NEXT:    v_mul_f32_e32 v4, v2, v3
371; GFX89-IEEE-NEXT:    v_fma_f32 v5, -v1, v4, v2
372; GFX89-IEEE-NEXT:    v_fma_f32 v4, v5, v3, v4
373; GFX89-IEEE-NEXT:    v_fma_f32 v1, -v1, v4, v2
374; GFX89-IEEE-NEXT:    v_div_fmas_f32 v1, v1, v3, v4
375; GFX89-IEEE-NEXT:    v_div_fixup_f32 v0, v1, v0, 1.0
376; GFX89-IEEE-NEXT:    s_setpc_b64 s[30:31]
377;
378; GFX89-FLUSH-LABEL: v_rcp_f32_arcp:
379; GFX89-FLUSH:       ; %bb.0:
380; GFX89-FLUSH-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
381; GFX89-FLUSH-NEXT:    v_div_scale_f32 v1, s[4:5], v0, v0, 1.0
382; GFX89-FLUSH-NEXT:    v_div_scale_f32 v2, vcc, 1.0, v0, 1.0
383; GFX89-FLUSH-NEXT:    v_rcp_f32_e32 v3, v1
384; GFX89-FLUSH-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_MODE, 4, 2), 3
385; GFX89-FLUSH-NEXT:    v_fma_f32 v4, -v1, v3, 1.0
386; GFX89-FLUSH-NEXT:    v_fma_f32 v3, v4, v3, v3
387; GFX89-FLUSH-NEXT:    v_mul_f32_e32 v4, v2, v3
388; GFX89-FLUSH-NEXT:    v_fma_f32 v5, -v1, v4, v2
389; GFX89-FLUSH-NEXT:    v_fma_f32 v4, v5, v3, v4
390; GFX89-FLUSH-NEXT:    v_fma_f32 v1, -v1, v4, v2
391; GFX89-FLUSH-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_MODE, 4, 2), 0
392; GFX89-FLUSH-NEXT:    v_div_fmas_f32 v1, v1, v3, v4
393; GFX89-FLUSH-NEXT:    v_div_fixup_f32 v0, v1, v0, 1.0
394; GFX89-FLUSH-NEXT:    s_setpc_b64 s[30:31]
395;
396; GFX10-IEEE-LABEL: v_rcp_f32_arcp:
397; GFX10-IEEE:       ; %bb.0:
398; GFX10-IEEE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
399; GFX10-IEEE-NEXT:    s_waitcnt_vscnt null, 0x0
400; GFX10-IEEE-NEXT:    v_div_scale_f32 v1, s4, v0, v0, 1.0
401; GFX10-IEEE-NEXT:    v_div_scale_f32 v4, vcc_lo, 1.0, v0, 1.0
402; GFX10-IEEE-NEXT:    v_rcp_f32_e32 v2, v1
403; GFX10-IEEE-NEXT:    v_fma_f32 v3, -v1, v2, 1.0
404; GFX10-IEEE-NEXT:    v_fmac_f32_e32 v2, v3, v2
405; GFX10-IEEE-NEXT:    v_mul_f32_e32 v3, v4, v2
406; GFX10-IEEE-NEXT:    v_fma_f32 v5, v3, -v1, v4
407; GFX10-IEEE-NEXT:    v_fmac_f32_e32 v3, v5, v2
408; GFX10-IEEE-NEXT:    v_fmac_f32_e64 v4, -v1, v3
409; GFX10-IEEE-NEXT:    v_div_fmas_f32 v1, v4, v2, v3
410; GFX10-IEEE-NEXT:    v_div_fixup_f32 v0, v1, v0, 1.0
411; GFX10-IEEE-NEXT:    s_setpc_b64 s[30:31]
412;
413; GFX10-FLUSH-LABEL: v_rcp_f32_arcp:
414; GFX10-FLUSH:       ; %bb.0:
415; GFX10-FLUSH-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
416; GFX10-FLUSH-NEXT:    s_waitcnt_vscnt null, 0x0
417; GFX10-FLUSH-NEXT:    v_div_scale_f32 v1, s4, v0, v0, 1.0
418; GFX10-FLUSH-NEXT:    v_div_scale_f32 v3, vcc_lo, 1.0, v0, 1.0
419; GFX10-FLUSH-NEXT:    v_rcp_f32_e32 v2, v1
420; GFX10-FLUSH-NEXT:    s_denorm_mode 3
421; GFX10-FLUSH-NEXT:    v_fma_f32 v4, -v1, v2, 1.0
422; GFX10-FLUSH-NEXT:    v_fmac_f32_e32 v2, v4, v2
423; GFX10-FLUSH-NEXT:    v_mul_f32_e32 v4, v3, v2
424; GFX10-FLUSH-NEXT:    v_fma_f32 v5, v4, -v1, v3
425; GFX10-FLUSH-NEXT:    v_fmac_f32_e32 v4, v5, v2
426; GFX10-FLUSH-NEXT:    v_fmac_f32_e64 v3, -v1, v4
427; GFX10-FLUSH-NEXT:    s_denorm_mode 0
428; GFX10-FLUSH-NEXT:    v_div_fmas_f32 v1, v3, v2, v4
429; GFX10-FLUSH-NEXT:    v_div_fixup_f32 v0, v1, v0, 1.0
430; GFX10-FLUSH-NEXT:    s_setpc_b64 s[30:31]
431  %fdiv = fdiv arcp float 1.0, %x
432  ret float %fdiv
433}
434
435define float @v_rcp_f32_arcp_afn(float %x) {
436; GCN-LABEL: v_rcp_f32_arcp_afn:
437; GCN:       ; %bb.0:
438; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
439; GCN-NEXT:    v_rcp_f32_e32 v0, v0
440; GCN-NEXT:    s_setpc_b64 s[30:31]
441;
442; GFX10-LABEL: v_rcp_f32_arcp_afn:
443; GFX10:       ; %bb.0:
444; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
445; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
446; GFX10-NEXT:    v_rcp_f32_e32 v0, v0
447; GFX10-NEXT:    s_setpc_b64 s[30:31]
448  %fdiv = fdiv arcp afn float 1.0, %x
449  ret float %fdiv
450}
451
452define float @v_rcp_f32_ulp25(float %x) {
453; GCN-IEEE-LABEL: v_rcp_f32_ulp25:
454; GCN-IEEE:       ; %bb.0:
455; GCN-IEEE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
456; GCN-IEEE-NEXT:    v_mov_b32_e32 v1, 0x6f800000
457; GCN-IEEE-NEXT:    v_mov_b32_e32 v2, 0x2f800000
458; GCN-IEEE-NEXT:    v_cmp_gt_f32_e64 vcc, |v0|, v1
459; GCN-IEEE-NEXT:    v_cndmask_b32_e32 v1, 1.0, v2, vcc
460; GCN-IEEE-NEXT:    v_mul_f32_e32 v0, v0, v1
461; GCN-IEEE-NEXT:    v_rcp_f32_e32 v0, v0
462; GCN-IEEE-NEXT:    v_mul_f32_e32 v0, 1.0, v0
463; GCN-IEEE-NEXT:    v_mul_f32_e32 v0, v1, v0
464; GCN-IEEE-NEXT:    s_setpc_b64 s[30:31]
465;
466; GCN-FLUSH-LABEL: v_rcp_f32_ulp25:
467; GCN-FLUSH:       ; %bb.0:
468; GCN-FLUSH-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
469; GCN-FLUSH-NEXT:    v_rcp_f32_e32 v0, v0
470; GCN-FLUSH-NEXT:    s_setpc_b64 s[30:31]
471;
472; GFX10-IEEE-LABEL: v_rcp_f32_ulp25:
473; GFX10-IEEE:       ; %bb.0:
474; GFX10-IEEE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
475; GFX10-IEEE-NEXT:    s_waitcnt_vscnt null, 0x0
476; GFX10-IEEE-NEXT:    v_cmp_lt_f32_e64 s4, 0x6f800000, |v0|
477; GFX10-IEEE-NEXT:    v_cndmask_b32_e64 v1, 1.0, 0x2f800000, s4
478; GFX10-IEEE-NEXT:    v_mul_f32_e32 v0, v0, v1
479; GFX10-IEEE-NEXT:    v_rcp_f32_e32 v0, v0
480; GFX10-IEEE-NEXT:    v_mul_f32_e32 v0, 1.0, v0
481; GFX10-IEEE-NEXT:    v_mul_f32_e32 v0, v1, v0
482; GFX10-IEEE-NEXT:    s_setpc_b64 s[30:31]
483;
484; GFX10-FLUSH-LABEL: v_rcp_f32_ulp25:
485; GFX10-FLUSH:       ; %bb.0:
486; GFX10-FLUSH-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
487; GFX10-FLUSH-NEXT:    s_waitcnt_vscnt null, 0x0
488; GFX10-FLUSH-NEXT:    v_rcp_f32_e32 v0, v0
489; GFX10-FLUSH-NEXT:    s_setpc_b64 s[30:31]
490  %fdiv = fdiv float 1.0, %x, !fpmath !0
491  ret float %fdiv
492}
493
494define float @v_fdiv_f32_afn_ulp25(float %a, float %b) {
495; GCN-LABEL: v_fdiv_f32_afn_ulp25:
496; GCN:       ; %bb.0:
497; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
498; GCN-NEXT:    v_rcp_f32_e32 v1, v1
499; GCN-NEXT:    v_mul_f32_e32 v0, v0, v1
500; GCN-NEXT:    s_setpc_b64 s[30:31]
501;
502; GFX10-LABEL: v_fdiv_f32_afn_ulp25:
503; GFX10:       ; %bb.0:
504; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
505; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
506; GFX10-NEXT:    v_rcp_f32_e32 v1, v1
507; GFX10-NEXT:    v_mul_f32_e32 v0, v0, v1
508; GFX10-NEXT:    s_setpc_b64 s[30:31]
509  %fdiv = fdiv afn float %a, %b, !fpmath !0
510  ret float %fdiv
511}
512
513define float @v_fdiv_f32_arcp_ulp25(float %a, float %b) {
514; GFX6-IEEE-LABEL: v_fdiv_f32_arcp_ulp25:
515; GFX6-IEEE:       ; %bb.0:
516; GFX6-IEEE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
517; GFX6-IEEE-NEXT:    v_div_scale_f32 v2, s[4:5], v1, v1, v0
518; GFX6-IEEE-NEXT:    v_rcp_f32_e32 v3, v2
519; GFX6-IEEE-NEXT:    v_div_scale_f32 v4, vcc, v0, v1, v0
520; GFX6-IEEE-NEXT:    v_fma_f32 v5, -v2, v3, 1.0
521; GFX6-IEEE-NEXT:    v_fma_f32 v3, v5, v3, v3
522; GFX6-IEEE-NEXT:    v_mul_f32_e32 v5, v4, v3
523; GFX6-IEEE-NEXT:    v_fma_f32 v6, -v2, v5, v4
524; GFX6-IEEE-NEXT:    v_fma_f32 v5, v6, v3, v5
525; GFX6-IEEE-NEXT:    v_fma_f32 v2, -v2, v5, v4
526; GFX6-IEEE-NEXT:    v_div_fmas_f32 v2, v2, v3, v5
527; GFX6-IEEE-NEXT:    v_div_fixup_f32 v0, v2, v1, v0
528; GFX6-IEEE-NEXT:    s_setpc_b64 s[30:31]
529;
530; GCN-FLUSH-LABEL: v_fdiv_f32_arcp_ulp25:
531; GCN-FLUSH:       ; %bb.0:
532; GCN-FLUSH-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
533; GCN-FLUSH-NEXT:    v_mov_b32_e32 v2, 0x6f800000
534; GCN-FLUSH-NEXT:    v_mov_b32_e32 v3, 0x2f800000
535; GCN-FLUSH-NEXT:    v_cmp_gt_f32_e64 vcc, |v1|, v2
536; GCN-FLUSH-NEXT:    v_cndmask_b32_e32 v2, 1.0, v3, vcc
537; GCN-FLUSH-NEXT:    v_mul_f32_e32 v1, v1, v2
538; GCN-FLUSH-NEXT:    v_rcp_f32_e32 v1, v1
539; GCN-FLUSH-NEXT:    v_mul_f32_e32 v0, v0, v1
540; GCN-FLUSH-NEXT:    v_mul_f32_e32 v0, v2, v0
541; GCN-FLUSH-NEXT:    s_setpc_b64 s[30:31]
542;
543; GFX89-IEEE-LABEL: v_fdiv_f32_arcp_ulp25:
544; GFX89-IEEE:       ; %bb.0:
545; GFX89-IEEE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
546; GFX89-IEEE-NEXT:    v_div_scale_f32 v2, s[4:5], v1, v1, v0
547; GFX89-IEEE-NEXT:    v_div_scale_f32 v3, vcc, v0, v1, v0
548; GFX89-IEEE-NEXT:    v_rcp_f32_e32 v4, v2
549; GFX89-IEEE-NEXT:    v_fma_f32 v5, -v2, v4, 1.0
550; GFX89-IEEE-NEXT:    v_fma_f32 v4, v5, v4, v4
551; GFX89-IEEE-NEXT:    v_mul_f32_e32 v5, v3, v4
552; GFX89-IEEE-NEXT:    v_fma_f32 v6, -v2, v5, v3
553; GFX89-IEEE-NEXT:    v_fma_f32 v5, v6, v4, v5
554; GFX89-IEEE-NEXT:    v_fma_f32 v2, -v2, v5, v3
555; GFX89-IEEE-NEXT:    v_div_fmas_f32 v2, v2, v4, v5
556; GFX89-IEEE-NEXT:    v_div_fixup_f32 v0, v2, v1, v0
557; GFX89-IEEE-NEXT:    s_setpc_b64 s[30:31]
558;
559; GFX10-IEEE-LABEL: v_fdiv_f32_arcp_ulp25:
560; GFX10-IEEE:       ; %bb.0:
561; GFX10-IEEE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
562; GFX10-IEEE-NEXT:    s_waitcnt_vscnt null, 0x0
563; GFX10-IEEE-NEXT:    v_div_scale_f32 v2, s4, v1, v1, v0
564; GFX10-IEEE-NEXT:    v_div_scale_f32 v5, vcc_lo, v0, v1, v0
565; GFX10-IEEE-NEXT:    v_rcp_f32_e32 v3, v2
566; GFX10-IEEE-NEXT:    v_fma_f32 v4, -v2, v3, 1.0
567; GFX10-IEEE-NEXT:    v_fmac_f32_e32 v3, v4, v3
568; GFX10-IEEE-NEXT:    v_mul_f32_e32 v4, v5, v3
569; GFX10-IEEE-NEXT:    v_fma_f32 v6, v4, -v2, v5
570; GFX10-IEEE-NEXT:    v_fmac_f32_e32 v4, v6, v3
571; GFX10-IEEE-NEXT:    v_fmac_f32_e64 v5, -v2, v4
572; GFX10-IEEE-NEXT:    v_div_fmas_f32 v2, v5, v3, v4
573; GFX10-IEEE-NEXT:    v_div_fixup_f32 v0, v2, v1, v0
574; GFX10-IEEE-NEXT:    s_setpc_b64 s[30:31]
575;
576; GFX10-FLUSH-LABEL: v_fdiv_f32_arcp_ulp25:
577; GFX10-FLUSH:       ; %bb.0:
578; GFX10-FLUSH-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
579; GFX10-FLUSH-NEXT:    s_waitcnt_vscnt null, 0x0
580; GFX10-FLUSH-NEXT:    v_cmp_lt_f32_e64 s4, 0x6f800000, |v1|
581; GFX10-FLUSH-NEXT:    v_cndmask_b32_e64 v2, 1.0, 0x2f800000, s4
582; GFX10-FLUSH-NEXT:    v_mul_f32_e32 v1, v1, v2
583; GFX10-FLUSH-NEXT:    v_rcp_f32_e32 v1, v1
584; GFX10-FLUSH-NEXT:    v_mul_f32_e32 v0, v0, v1
585; GFX10-FLUSH-NEXT:    v_mul_f32_e32 v0, v2, v0
586; GFX10-FLUSH-NEXT:    s_setpc_b64 s[30:31]
587  %fdiv = fdiv arcp float %a, %b, !fpmath !0
588  ret float %fdiv
589}
590
591define <2 x float> @v_fdiv_v2f32(<2 x float> %a, <2 x float> %b) {
592; GFX6-IEEE-LABEL: v_fdiv_v2f32:
593; GFX6-IEEE:       ; %bb.0:
594; GFX6-IEEE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
595; GFX6-IEEE-NEXT:    v_div_scale_f32 v4, s[4:5], v2, v2, v0
596; GFX6-IEEE-NEXT:    v_rcp_f32_e32 v5, v4
597; GFX6-IEEE-NEXT:    v_div_scale_f32 v6, vcc, v0, v2, v0
598; GFX6-IEEE-NEXT:    v_fma_f32 v7, -v4, v5, 1.0
599; GFX6-IEEE-NEXT:    v_fma_f32 v5, v7, v5, v5
600; GFX6-IEEE-NEXT:    v_mul_f32_e32 v7, v6, v5
601; GFX6-IEEE-NEXT:    v_fma_f32 v8, -v4, v7, v6
602; GFX6-IEEE-NEXT:    v_fma_f32 v7, v8, v5, v7
603; GFX6-IEEE-NEXT:    v_fma_f32 v4, -v4, v7, v6
604; GFX6-IEEE-NEXT:    v_div_fmas_f32 v4, v4, v5, v7
605; GFX6-IEEE-NEXT:    v_div_scale_f32 v5, s[4:5], v3, v3, v1
606; GFX6-IEEE-NEXT:    v_rcp_f32_e32 v6, v5
607; GFX6-IEEE-NEXT:    v_div_fixup_f32 v0, v4, v2, v0
608; GFX6-IEEE-NEXT:    v_div_scale_f32 v2, vcc, v1, v3, v1
609; GFX6-IEEE-NEXT:    v_fma_f32 v4, -v5, v6, 1.0
610; GFX6-IEEE-NEXT:    v_fma_f32 v4, v4, v6, v6
611; GFX6-IEEE-NEXT:    v_mul_f32_e32 v6, v2, v4
612; GFX6-IEEE-NEXT:    v_fma_f32 v7, -v5, v6, v2
613; GFX6-IEEE-NEXT:    v_fma_f32 v6, v7, v4, v6
614; GFX6-IEEE-NEXT:    v_fma_f32 v2, -v5, v6, v2
615; GFX6-IEEE-NEXT:    v_div_fmas_f32 v2, v2, v4, v6
616; GFX6-IEEE-NEXT:    v_div_fixup_f32 v1, v2, v3, v1
617; GFX6-IEEE-NEXT:    s_setpc_b64 s[30:31]
618;
619; GFX6-FLUSH-LABEL: v_fdiv_v2f32:
620; GFX6-FLUSH:       ; %bb.0:
621; GFX6-FLUSH-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
622; GFX6-FLUSH-NEXT:    v_div_scale_f32 v4, s[4:5], v2, v2, v0
623; GFX6-FLUSH-NEXT:    v_rcp_f32_e32 v5, v4
624; GFX6-FLUSH-NEXT:    v_div_scale_f32 v6, vcc, v0, v2, v0
625; GFX6-FLUSH-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_MODE, 4, 2), 3
626; GFX6-FLUSH-NEXT:    v_fma_f32 v7, -v4, v5, 1.0
627; GFX6-FLUSH-NEXT:    v_fma_f32 v5, v7, v5, v5
628; GFX6-FLUSH-NEXT:    v_mul_f32_e32 v7, v6, v5
629; GFX6-FLUSH-NEXT:    v_fma_f32 v8, -v4, v7, v6
630; GFX6-FLUSH-NEXT:    v_fma_f32 v7, v8, v5, v7
631; GFX6-FLUSH-NEXT:    v_fma_f32 v4, -v4, v7, v6
632; GFX6-FLUSH-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_MODE, 4, 2), 0
633; GFX6-FLUSH-NEXT:    v_div_fmas_f32 v4, v4, v5, v7
634; GFX6-FLUSH-NEXT:    v_div_scale_f32 v5, s[4:5], v3, v3, v1
635; GFX6-FLUSH-NEXT:    v_div_fixup_f32 v0, v4, v2, v0
636; GFX6-FLUSH-NEXT:    v_rcp_f32_e32 v6, v5
637; GFX6-FLUSH-NEXT:    v_div_scale_f32 v2, vcc, v1, v3, v1
638; GFX6-FLUSH-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_MODE, 4, 2), 3
639; GFX6-FLUSH-NEXT:    v_fma_f32 v4, -v5, v6, 1.0
640; GFX6-FLUSH-NEXT:    v_fma_f32 v4, v4, v6, v6
641; GFX6-FLUSH-NEXT:    v_mul_f32_e32 v6, v2, v4
642; GFX6-FLUSH-NEXT:    v_fma_f32 v7, -v5, v6, v2
643; GFX6-FLUSH-NEXT:    v_fma_f32 v6, v7, v4, v6
644; GFX6-FLUSH-NEXT:    v_fma_f32 v2, -v5, v6, v2
645; GFX6-FLUSH-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_MODE, 4, 2), 0
646; GFX6-FLUSH-NEXT:    v_div_fmas_f32 v2, v2, v4, v6
647; GFX6-FLUSH-NEXT:    v_div_fixup_f32 v1, v2, v3, v1
648; GFX6-FLUSH-NEXT:    s_setpc_b64 s[30:31]
649;
650; GFX89-IEEE-LABEL: v_fdiv_v2f32:
651; GFX89-IEEE:       ; %bb.0:
652; GFX89-IEEE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
653; GFX89-IEEE-NEXT:    v_div_scale_f32 v4, s[4:5], v2, v2, v0
654; GFX89-IEEE-NEXT:    v_div_scale_f32 v5, s[4:5], v3, v3, v1
655; GFX89-IEEE-NEXT:    v_div_scale_f32 v6, vcc, v0, v2, v0
656; GFX89-IEEE-NEXT:    v_div_scale_f32 v7, s[4:5], v1, v3, v1
657; GFX89-IEEE-NEXT:    v_rcp_f32_e32 v8, v4
658; GFX89-IEEE-NEXT:    v_rcp_f32_e32 v9, v5
659; GFX89-IEEE-NEXT:    v_fma_f32 v10, -v4, v8, 1.0
660; GFX89-IEEE-NEXT:    v_fma_f32 v11, -v5, v9, 1.0
661; GFX89-IEEE-NEXT:    v_fma_f32 v8, v10, v8, v8
662; GFX89-IEEE-NEXT:    v_fma_f32 v9, v11, v9, v9
663; GFX89-IEEE-NEXT:    v_mul_f32_e32 v10, v6, v8
664; GFX89-IEEE-NEXT:    v_fma_f32 v12, -v4, v10, v6
665; GFX89-IEEE-NEXT:    v_mul_f32_e32 v11, v7, v9
666; GFX89-IEEE-NEXT:    v_fma_f32 v13, -v5, v11, v7
667; GFX89-IEEE-NEXT:    v_fma_f32 v10, v12, v8, v10
668; GFX89-IEEE-NEXT:    v_fma_f32 v4, -v4, v10, v6
669; GFX89-IEEE-NEXT:    v_fma_f32 v11, v13, v9, v11
670; GFX89-IEEE-NEXT:    v_div_fmas_f32 v4, v4, v8, v10
671; GFX89-IEEE-NEXT:    v_fma_f32 v5, -v5, v11, v7
672; GFX89-IEEE-NEXT:    s_mov_b64 vcc, s[4:5]
673; GFX89-IEEE-NEXT:    v_div_fmas_f32 v5, v5, v9, v11
674; GFX89-IEEE-NEXT:    v_div_fixup_f32 v0, v4, v2, v0
675; GFX89-IEEE-NEXT:    v_div_fixup_f32 v1, v5, v3, v1
676; GFX89-IEEE-NEXT:    s_setpc_b64 s[30:31]
677;
678; GFX89-FLUSH-LABEL: v_fdiv_v2f32:
679; GFX89-FLUSH:       ; %bb.0:
680; GFX89-FLUSH-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
681; GFX89-FLUSH-NEXT:    v_div_scale_f32 v4, s[4:5], v2, v2, v0
682; GFX89-FLUSH-NEXT:    v_div_scale_f32 v5, vcc, v0, v2, v0
683; GFX89-FLUSH-NEXT:    v_rcp_f32_e32 v6, v4
684; GFX89-FLUSH-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_MODE, 4, 2), 3
685; GFX89-FLUSH-NEXT:    v_fma_f32 v7, -v4, v6, 1.0
686; GFX89-FLUSH-NEXT:    v_fma_f32 v6, v7, v6, v6
687; GFX89-FLUSH-NEXT:    v_mul_f32_e32 v7, v5, v6
688; GFX89-FLUSH-NEXT:    v_fma_f32 v8, -v4, v7, v5
689; GFX89-FLUSH-NEXT:    v_fma_f32 v7, v8, v6, v7
690; GFX89-FLUSH-NEXT:    v_fma_f32 v4, -v4, v7, v5
691; GFX89-FLUSH-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_MODE, 4, 2), 0
692; GFX89-FLUSH-NEXT:    v_div_fmas_f32 v4, v4, v6, v7
693; GFX89-FLUSH-NEXT:    v_div_scale_f32 v5, s[4:5], v3, v3, v1
694; GFX89-FLUSH-NEXT:    v_div_scale_f32 v6, vcc, v1, v3, v1
695; GFX89-FLUSH-NEXT:    v_div_fixup_f32 v0, v4, v2, v0
696; GFX89-FLUSH-NEXT:    v_rcp_f32_e32 v7, v5
697; GFX89-FLUSH-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_MODE, 4, 2), 3
698; GFX89-FLUSH-NEXT:    v_fma_f32 v2, -v5, v7, 1.0
699; GFX89-FLUSH-NEXT:    v_fma_f32 v2, v2, v7, v7
700; GFX89-FLUSH-NEXT:    v_mul_f32_e32 v4, v6, v2
701; GFX89-FLUSH-NEXT:    v_fma_f32 v7, -v5, v4, v6
702; GFX89-FLUSH-NEXT:    v_fma_f32 v4, v7, v2, v4
703; GFX89-FLUSH-NEXT:    v_fma_f32 v5, -v5, v4, v6
704; GFX89-FLUSH-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_MODE, 4, 2), 0
705; GFX89-FLUSH-NEXT:    v_div_fmas_f32 v2, v5, v2, v4
706; GFX89-FLUSH-NEXT:    v_div_fixup_f32 v1, v2, v3, v1
707; GFX89-FLUSH-NEXT:    s_setpc_b64 s[30:31]
708;
709; GFX10-IEEE-LABEL: v_fdiv_v2f32:
710; GFX10-IEEE:       ; %bb.0:
711; GFX10-IEEE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
712; GFX10-IEEE-NEXT:    s_waitcnt_vscnt null, 0x0
713; GFX10-IEEE-NEXT:    v_div_scale_f32 v4, s4, v2, v2, v0
714; GFX10-IEEE-NEXT:    v_div_scale_f32 v5, s4, v3, v3, v1
715; GFX10-IEEE-NEXT:    v_div_scale_f32 v10, vcc_lo, v0, v2, v0
716; GFX10-IEEE-NEXT:    v_rcp_f32_e32 v6, v4
717; GFX10-IEEE-NEXT:    v_rcp_f32_e32 v7, v5
718; GFX10-IEEE-NEXT:    v_fma_f32 v8, -v4, v6, 1.0
719; GFX10-IEEE-NEXT:    v_fma_f32 v9, -v5, v7, 1.0
720; GFX10-IEEE-NEXT:    v_fmac_f32_e32 v6, v8, v6
721; GFX10-IEEE-NEXT:    v_fmac_f32_e32 v7, v9, v7
722; GFX10-IEEE-NEXT:    v_div_scale_f32 v8, s4, v1, v3, v1
723; GFX10-IEEE-NEXT:    v_mul_f32_e32 v9, v10, v6
724; GFX10-IEEE-NEXT:    v_mul_f32_e32 v11, v8, v7
725; GFX10-IEEE-NEXT:    v_fma_f32 v12, v9, -v4, v10
726; GFX10-IEEE-NEXT:    v_fma_f32 v13, v11, -v5, v8
727; GFX10-IEEE-NEXT:    v_fmac_f32_e32 v9, v12, v6
728; GFX10-IEEE-NEXT:    v_fmac_f32_e32 v11, v13, v7
729; GFX10-IEEE-NEXT:    v_fmac_f32_e64 v10, -v4, v9
730; GFX10-IEEE-NEXT:    v_fmac_f32_e64 v8, -v5, v11
731; GFX10-IEEE-NEXT:    v_div_fmas_f32 v4, v10, v6, v9
732; GFX10-IEEE-NEXT:    s_mov_b32 vcc_lo, s4
733; GFX10-IEEE-NEXT:    v_div_fmas_f32 v5, v8, v7, v11
734; GFX10-IEEE-NEXT:    v_div_fixup_f32 v0, v4, v2, v0
735; GFX10-IEEE-NEXT:    v_div_fixup_f32 v1, v5, v3, v1
736; GFX10-IEEE-NEXT:    s_setpc_b64 s[30:31]
737;
738; GFX10-FLUSH-LABEL: v_fdiv_v2f32:
739; GFX10-FLUSH:       ; %bb.0:
740; GFX10-FLUSH-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
741; GFX10-FLUSH-NEXT:    s_waitcnt_vscnt null, 0x0
742; GFX10-FLUSH-NEXT:    v_div_scale_f32 v4, s4, v2, v2, v0
743; GFX10-FLUSH-NEXT:    v_div_scale_f32 v6, vcc_lo, v0, v2, v0
744; GFX10-FLUSH-NEXT:    v_rcp_f32_e32 v5, v4
745; GFX10-FLUSH-NEXT:    s_denorm_mode 3
746; GFX10-FLUSH-NEXT:    v_fma_f32 v7, -v4, v5, 1.0
747; GFX10-FLUSH-NEXT:    v_fmac_f32_e32 v5, v7, v5
748; GFX10-FLUSH-NEXT:    v_mul_f32_e32 v7, v6, v5
749; GFX10-FLUSH-NEXT:    v_fma_f32 v8, v7, -v4, v6
750; GFX10-FLUSH-NEXT:    v_fmac_f32_e32 v7, v8, v5
751; GFX10-FLUSH-NEXT:    v_fmac_f32_e64 v6, -v4, v7
752; GFX10-FLUSH-NEXT:    s_denorm_mode 0
753; GFX10-FLUSH-NEXT:    v_div_scale_f32 v4, s4, v3, v3, v1
754; GFX10-FLUSH-NEXT:    v_div_fmas_f32 v5, v6, v5, v7
755; GFX10-FLUSH-NEXT:    v_rcp_f32_e32 v6, v4
756; GFX10-FLUSH-NEXT:    v_div_fixup_f32 v0, v5, v2, v0
757; GFX10-FLUSH-NEXT:    v_div_scale_f32 v2, vcc_lo, v1, v3, v1
758; GFX10-FLUSH-NEXT:    s_denorm_mode 3
759; GFX10-FLUSH-NEXT:    v_fma_f32 v5, -v4, v6, 1.0
760; GFX10-FLUSH-NEXT:    v_fmac_f32_e32 v6, v5, v6
761; GFX10-FLUSH-NEXT:    v_mul_f32_e32 v5, v2, v6
762; GFX10-FLUSH-NEXT:    v_fma_f32 v7, v5, -v4, v2
763; GFX10-FLUSH-NEXT:    v_fmac_f32_e32 v5, v7, v6
764; GFX10-FLUSH-NEXT:    v_fmac_f32_e64 v2, -v4, v5
765; GFX10-FLUSH-NEXT:    s_denorm_mode 0
766; GFX10-FLUSH-NEXT:    v_div_fmas_f32 v2, v2, v6, v5
767; GFX10-FLUSH-NEXT:    v_div_fixup_f32 v1, v2, v3, v1
768; GFX10-FLUSH-NEXT:    s_setpc_b64 s[30:31]
769  %fdiv = fdiv <2 x float> %a, %b
770  ret <2 x float> %fdiv
771}
772
773define <2 x float> @v_fdiv_v2f32_afn(<2 x float> %a, <2 x float> %b) {
774; GCN-LABEL: v_fdiv_v2f32_afn:
775; GCN:       ; %bb.0:
776; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
777; GCN-NEXT:    v_rcp_f32_e32 v2, v2
778; GCN-NEXT:    v_rcp_f32_e32 v3, v3
779; GCN-NEXT:    v_mul_f32_e32 v0, v0, v2
780; GCN-NEXT:    v_mul_f32_e32 v1, v1, v3
781; GCN-NEXT:    s_setpc_b64 s[30:31]
782;
783; GFX10-LABEL: v_fdiv_v2f32_afn:
784; GFX10:       ; %bb.0:
785; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
786; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
787; GFX10-NEXT:    v_rcp_f32_e32 v2, v2
788; GFX10-NEXT:    v_rcp_f32_e32 v3, v3
789; GFX10-NEXT:    v_mul_f32_e32 v0, v0, v2
790; GFX10-NEXT:    v_mul_f32_e32 v1, v1, v3
791; GFX10-NEXT:    s_setpc_b64 s[30:31]
792  %fdiv = fdiv afn <2 x float> %a, %b
793  ret <2 x float> %fdiv
794}
795
796define <2 x float> @v_fdiv_v2f32_ulp25(<2 x float> %a, <2 x float> %b) {
797; GFX6-IEEE-LABEL: v_fdiv_v2f32_ulp25:
798; GFX6-IEEE:       ; %bb.0:
799; GFX6-IEEE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
800; GFX6-IEEE-NEXT:    v_div_scale_f32 v4, s[4:5], v2, v2, v0
801; GFX6-IEEE-NEXT:    v_rcp_f32_e32 v5, v4
802; GFX6-IEEE-NEXT:    v_div_scale_f32 v6, vcc, v0, v2, v0
803; GFX6-IEEE-NEXT:    v_fma_f32 v7, -v4, v5, 1.0
804; GFX6-IEEE-NEXT:    v_fma_f32 v5, v7, v5, v5
805; GFX6-IEEE-NEXT:    v_mul_f32_e32 v7, v6, v5
806; GFX6-IEEE-NEXT:    v_fma_f32 v8, -v4, v7, v6
807; GFX6-IEEE-NEXT:    v_fma_f32 v7, v8, v5, v7
808; GFX6-IEEE-NEXT:    v_fma_f32 v4, -v4, v7, v6
809; GFX6-IEEE-NEXT:    v_div_fmas_f32 v4, v4, v5, v7
810; GFX6-IEEE-NEXT:    v_div_scale_f32 v5, s[4:5], v3, v3, v1
811; GFX6-IEEE-NEXT:    v_rcp_f32_e32 v6, v5
812; GFX6-IEEE-NEXT:    v_div_fixup_f32 v0, v4, v2, v0
813; GFX6-IEEE-NEXT:    v_div_scale_f32 v2, vcc, v1, v3, v1
814; GFX6-IEEE-NEXT:    v_fma_f32 v4, -v5, v6, 1.0
815; GFX6-IEEE-NEXT:    v_fma_f32 v4, v4, v6, v6
816; GFX6-IEEE-NEXT:    v_mul_f32_e32 v6, v2, v4
817; GFX6-IEEE-NEXT:    v_fma_f32 v7, -v5, v6, v2
818; GFX6-IEEE-NEXT:    v_fma_f32 v6, v7, v4, v6
819; GFX6-IEEE-NEXT:    v_fma_f32 v2, -v5, v6, v2
820; GFX6-IEEE-NEXT:    v_div_fmas_f32 v2, v2, v4, v6
821; GFX6-IEEE-NEXT:    v_div_fixup_f32 v1, v2, v3, v1
822; GFX6-IEEE-NEXT:    s_setpc_b64 s[30:31]
823;
824; GCN-FLUSH-LABEL: v_fdiv_v2f32_ulp25:
825; GCN-FLUSH:       ; %bb.0:
826; GCN-FLUSH-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
827; GCN-FLUSH-NEXT:    s_mov_b32 s4, 0x6f800000
828; GCN-FLUSH-NEXT:    v_mov_b32_e32 v4, 0x2f800000
829; GCN-FLUSH-NEXT:    v_cmp_gt_f32_e64 vcc, |v2|, s4
830; GCN-FLUSH-NEXT:    v_cndmask_b32_e32 v5, 1.0, v4, vcc
831; GCN-FLUSH-NEXT:    v_cmp_gt_f32_e64 vcc, |v3|, s4
832; GCN-FLUSH-NEXT:    v_cndmask_b32_e32 v4, 1.0, v4, vcc
833; GCN-FLUSH-NEXT:    v_mul_f32_e32 v2, v2, v5
834; GCN-FLUSH-NEXT:    v_mul_f32_e32 v3, v3, v4
835; GCN-FLUSH-NEXT:    v_rcp_f32_e32 v2, v2
836; GCN-FLUSH-NEXT:    v_rcp_f32_e32 v3, v3
837; GCN-FLUSH-NEXT:    v_mul_f32_e32 v0, v0, v2
838; GCN-FLUSH-NEXT:    v_mul_f32_e32 v1, v1, v3
839; GCN-FLUSH-NEXT:    v_mul_f32_e32 v0, v5, v0
840; GCN-FLUSH-NEXT:    v_mul_f32_e32 v1, v4, v1
841; GCN-FLUSH-NEXT:    s_setpc_b64 s[30:31]
842;
843; GFX89-IEEE-LABEL: v_fdiv_v2f32_ulp25:
844; GFX89-IEEE:       ; %bb.0:
845; GFX89-IEEE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
846; GFX89-IEEE-NEXT:    v_div_scale_f32 v4, s[4:5], v2, v2, v0
847; GFX89-IEEE-NEXT:    v_div_scale_f32 v5, s[4:5], v3, v3, v1
848; GFX89-IEEE-NEXT:    v_div_scale_f32 v6, vcc, v0, v2, v0
849; GFX89-IEEE-NEXT:    v_div_scale_f32 v7, s[4:5], v1, v3, v1
850; GFX89-IEEE-NEXT:    v_rcp_f32_e32 v8, v4
851; GFX89-IEEE-NEXT:    v_rcp_f32_e32 v9, v5
852; GFX89-IEEE-NEXT:    v_fma_f32 v10, -v4, v8, 1.0
853; GFX89-IEEE-NEXT:    v_fma_f32 v11, -v5, v9, 1.0
854; GFX89-IEEE-NEXT:    v_fma_f32 v8, v10, v8, v8
855; GFX89-IEEE-NEXT:    v_fma_f32 v9, v11, v9, v9
856; GFX89-IEEE-NEXT:    v_mul_f32_e32 v10, v6, v8
857; GFX89-IEEE-NEXT:    v_fma_f32 v12, -v4, v10, v6
858; GFX89-IEEE-NEXT:    v_mul_f32_e32 v11, v7, v9
859; GFX89-IEEE-NEXT:    v_fma_f32 v13, -v5, v11, v7
860; GFX89-IEEE-NEXT:    v_fma_f32 v10, v12, v8, v10
861; GFX89-IEEE-NEXT:    v_fma_f32 v4, -v4, v10, v6
862; GFX89-IEEE-NEXT:    v_fma_f32 v11, v13, v9, v11
863; GFX89-IEEE-NEXT:    v_div_fmas_f32 v4, v4, v8, v10
864; GFX89-IEEE-NEXT:    v_fma_f32 v5, -v5, v11, v7
865; GFX89-IEEE-NEXT:    s_mov_b64 vcc, s[4:5]
866; GFX89-IEEE-NEXT:    v_div_fmas_f32 v5, v5, v9, v11
867; GFX89-IEEE-NEXT:    v_div_fixup_f32 v0, v4, v2, v0
868; GFX89-IEEE-NEXT:    v_div_fixup_f32 v1, v5, v3, v1
869; GFX89-IEEE-NEXT:    s_setpc_b64 s[30:31]
870;
871; GFX10-IEEE-LABEL: v_fdiv_v2f32_ulp25:
872; GFX10-IEEE:       ; %bb.0:
873; GFX10-IEEE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
874; GFX10-IEEE-NEXT:    s_waitcnt_vscnt null, 0x0
875; GFX10-IEEE-NEXT:    v_div_scale_f32 v4, s4, v2, v2, v0
876; GFX10-IEEE-NEXT:    v_div_scale_f32 v5, s4, v3, v3, v1
877; GFX10-IEEE-NEXT:    v_div_scale_f32 v10, vcc_lo, v0, v2, v0
878; GFX10-IEEE-NEXT:    v_rcp_f32_e32 v6, v4
879; GFX10-IEEE-NEXT:    v_rcp_f32_e32 v7, v5
880; GFX10-IEEE-NEXT:    v_fma_f32 v8, -v4, v6, 1.0
881; GFX10-IEEE-NEXT:    v_fma_f32 v9, -v5, v7, 1.0
882; GFX10-IEEE-NEXT:    v_fmac_f32_e32 v6, v8, v6
883; GFX10-IEEE-NEXT:    v_fmac_f32_e32 v7, v9, v7
884; GFX10-IEEE-NEXT:    v_div_scale_f32 v8, s4, v1, v3, v1
885; GFX10-IEEE-NEXT:    v_mul_f32_e32 v9, v10, v6
886; GFX10-IEEE-NEXT:    v_mul_f32_e32 v11, v8, v7
887; GFX10-IEEE-NEXT:    v_fma_f32 v12, v9, -v4, v10
888; GFX10-IEEE-NEXT:    v_fma_f32 v13, v11, -v5, v8
889; GFX10-IEEE-NEXT:    v_fmac_f32_e32 v9, v12, v6
890; GFX10-IEEE-NEXT:    v_fmac_f32_e32 v11, v13, v7
891; GFX10-IEEE-NEXT:    v_fmac_f32_e64 v10, -v4, v9
892; GFX10-IEEE-NEXT:    v_fmac_f32_e64 v8, -v5, v11
893; GFX10-IEEE-NEXT:    v_div_fmas_f32 v4, v10, v6, v9
894; GFX10-IEEE-NEXT:    s_mov_b32 vcc_lo, s4
895; GFX10-IEEE-NEXT:    v_div_fmas_f32 v5, v8, v7, v11
896; GFX10-IEEE-NEXT:    v_div_fixup_f32 v0, v4, v2, v0
897; GFX10-IEEE-NEXT:    v_div_fixup_f32 v1, v5, v3, v1
898; GFX10-IEEE-NEXT:    s_setpc_b64 s[30:31]
899;
900; GFX10-FLUSH-LABEL: v_fdiv_v2f32_ulp25:
901; GFX10-FLUSH:       ; %bb.0:
902; GFX10-FLUSH-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
903; GFX10-FLUSH-NEXT:    s_waitcnt_vscnt null, 0x0
904; GFX10-FLUSH-NEXT:    s_mov_b32 s4, 0x6f800000
905; GFX10-FLUSH-NEXT:    s_mov_b32 s5, 0x2f800000
906; GFX10-FLUSH-NEXT:    v_cmp_gt_f32_e64 s6, |v2|, s4
907; GFX10-FLUSH-NEXT:    v_cmp_gt_f32_e64 s4, |v3|, s4
908; GFX10-FLUSH-NEXT:    v_cndmask_b32_e64 v4, 1.0, s5, s6
909; GFX10-FLUSH-NEXT:    v_cndmask_b32_e64 v5, 1.0, s5, s4
910; GFX10-FLUSH-NEXT:    v_mul_f32_e32 v2, v2, v4
911; GFX10-FLUSH-NEXT:    v_mul_f32_e32 v3, v3, v5
912; GFX10-FLUSH-NEXT:    v_rcp_f32_e32 v2, v2
913; GFX10-FLUSH-NEXT:    v_rcp_f32_e32 v3, v3
914; GFX10-FLUSH-NEXT:    v_mul_f32_e32 v0, v0, v2
915; GFX10-FLUSH-NEXT:    v_mul_f32_e32 v1, v1, v3
916; GFX10-FLUSH-NEXT:    v_mul_f32_e32 v0, v4, v0
917; GFX10-FLUSH-NEXT:    v_mul_f32_e32 v1, v5, v1
918; GFX10-FLUSH-NEXT:    s_setpc_b64 s[30:31]
919  %fdiv = fdiv <2 x float> %a, %b, !fpmath !0
920  ret <2 x float> %fdiv
921}
922
923define <2 x float> @v_rcp_v2f32(<2 x float> %x) {
924; GFX6-IEEE-LABEL: v_rcp_v2f32:
925; GFX6-IEEE:       ; %bb.0:
926; GFX6-IEEE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
927; GFX6-IEEE-NEXT:    v_div_scale_f32 v2, s[4:5], v0, v0, 1.0
928; GFX6-IEEE-NEXT:    v_rcp_f32_e32 v3, v2
929; GFX6-IEEE-NEXT:    v_div_scale_f32 v4, vcc, 1.0, v0, 1.0
930; GFX6-IEEE-NEXT:    v_fma_f32 v5, -v2, v3, 1.0
931; GFX6-IEEE-NEXT:    v_fma_f32 v3, v5, v3, v3
932; GFX6-IEEE-NEXT:    v_mul_f32_e32 v5, v4, v3
933; GFX6-IEEE-NEXT:    v_fma_f32 v6, -v2, v5, v4
934; GFX6-IEEE-NEXT:    v_fma_f32 v5, v6, v3, v5
935; GFX6-IEEE-NEXT:    v_fma_f32 v2, -v2, v5, v4
936; GFX6-IEEE-NEXT:    v_div_fmas_f32 v2, v2, v3, v5
937; GFX6-IEEE-NEXT:    v_div_scale_f32 v3, s[4:5], v1, v1, 1.0
938; GFX6-IEEE-NEXT:    v_rcp_f32_e32 v4, v3
939; GFX6-IEEE-NEXT:    v_div_fixup_f32 v0, v2, v0, 1.0
940; GFX6-IEEE-NEXT:    v_div_scale_f32 v2, vcc, 1.0, v1, 1.0
941; GFX6-IEEE-NEXT:    v_fma_f32 v5, -v3, v4, 1.0
942; GFX6-IEEE-NEXT:    v_fma_f32 v4, v5, v4, v4
943; GFX6-IEEE-NEXT:    v_mul_f32_e32 v5, v2, v4
944; GFX6-IEEE-NEXT:    v_fma_f32 v6, -v3, v5, v2
945; GFX6-IEEE-NEXT:    v_fma_f32 v5, v6, v4, v5
946; GFX6-IEEE-NEXT:    v_fma_f32 v2, -v3, v5, v2
947; GFX6-IEEE-NEXT:    v_div_fmas_f32 v2, v2, v4, v5
948; GFX6-IEEE-NEXT:    v_div_fixup_f32 v1, v2, v1, 1.0
949; GFX6-IEEE-NEXT:    s_setpc_b64 s[30:31]
950;
951; GFX6-FLUSH-LABEL: v_rcp_v2f32:
952; GFX6-FLUSH:       ; %bb.0:
953; GFX6-FLUSH-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
954; GFX6-FLUSH-NEXT:    v_div_scale_f32 v2, s[4:5], v0, v0, 1.0
955; GFX6-FLUSH-NEXT:    v_rcp_f32_e32 v3, v2
956; GFX6-FLUSH-NEXT:    v_div_scale_f32 v4, vcc, 1.0, v0, 1.0
957; GFX6-FLUSH-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_MODE, 4, 2), 3
958; GFX6-FLUSH-NEXT:    v_fma_f32 v5, -v2, v3, 1.0
959; GFX6-FLUSH-NEXT:    v_fma_f32 v3, v5, v3, v3
960; GFX6-FLUSH-NEXT:    v_mul_f32_e32 v5, v4, v3
961; GFX6-FLUSH-NEXT:    v_fma_f32 v6, -v2, v5, v4
962; GFX6-FLUSH-NEXT:    v_fma_f32 v5, v6, v3, v5
963; GFX6-FLUSH-NEXT:    v_fma_f32 v2, -v2, v5, v4
964; GFX6-FLUSH-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_MODE, 4, 2), 0
965; GFX6-FLUSH-NEXT:    v_div_fmas_f32 v2, v2, v3, v5
966; GFX6-FLUSH-NEXT:    v_div_scale_f32 v3, s[4:5], v1, v1, 1.0
967; GFX6-FLUSH-NEXT:    v_div_fixup_f32 v0, v2, v0, 1.0
968; GFX6-FLUSH-NEXT:    v_rcp_f32_e32 v4, v3
969; GFX6-FLUSH-NEXT:    v_div_scale_f32 v2, vcc, 1.0, v1, 1.0
970; GFX6-FLUSH-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_MODE, 4, 2), 3
971; GFX6-FLUSH-NEXT:    v_fma_f32 v5, -v3, v4, 1.0
972; GFX6-FLUSH-NEXT:    v_fma_f32 v4, v5, v4, v4
973; GFX6-FLUSH-NEXT:    v_mul_f32_e32 v5, v2, v4
974; GFX6-FLUSH-NEXT:    v_fma_f32 v6, -v3, v5, v2
975; GFX6-FLUSH-NEXT:    v_fma_f32 v5, v6, v4, v5
976; GFX6-FLUSH-NEXT:    v_fma_f32 v2, -v3, v5, v2
977; GFX6-FLUSH-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_MODE, 4, 2), 0
978; GFX6-FLUSH-NEXT:    v_div_fmas_f32 v2, v2, v4, v5
979; GFX6-FLUSH-NEXT:    v_div_fixup_f32 v1, v2, v1, 1.0
980; GFX6-FLUSH-NEXT:    s_setpc_b64 s[30:31]
981;
982; GFX89-IEEE-LABEL: v_rcp_v2f32:
983; GFX89-IEEE:       ; %bb.0:
984; GFX89-IEEE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
985; GFX89-IEEE-NEXT:    v_div_scale_f32 v2, s[4:5], v0, v0, 1.0
986; GFX89-IEEE-NEXT:    v_div_scale_f32 v3, s[4:5], v1, v1, 1.0
987; GFX89-IEEE-NEXT:    v_div_scale_f32 v4, vcc, 1.0, v0, 1.0
988; GFX89-IEEE-NEXT:    v_div_scale_f32 v5, s[4:5], 1.0, v1, 1.0
989; GFX89-IEEE-NEXT:    v_rcp_f32_e32 v6, v2
990; GFX89-IEEE-NEXT:    v_rcp_f32_e32 v7, v3
991; GFX89-IEEE-NEXT:    v_fma_f32 v8, -v2, v6, 1.0
992; GFX89-IEEE-NEXT:    v_fma_f32 v9, -v3, v7, 1.0
993; GFX89-IEEE-NEXT:    v_fma_f32 v6, v8, v6, v6
994; GFX89-IEEE-NEXT:    v_fma_f32 v7, v9, v7, v7
995; GFX89-IEEE-NEXT:    v_mul_f32_e32 v8, v4, v6
996; GFX89-IEEE-NEXT:    v_fma_f32 v10, -v2, v8, v4
997; GFX89-IEEE-NEXT:    v_mul_f32_e32 v9, v5, v7
998; GFX89-IEEE-NEXT:    v_fma_f32 v11, -v3, v9, v5
999; GFX89-IEEE-NEXT:    v_fma_f32 v8, v10, v6, v8
1000; GFX89-IEEE-NEXT:    v_fma_f32 v2, -v2, v8, v4
1001; GFX89-IEEE-NEXT:    v_fma_f32 v9, v11, v7, v9
1002; GFX89-IEEE-NEXT:    v_div_fmas_f32 v2, v2, v6, v8
1003; GFX89-IEEE-NEXT:    v_fma_f32 v3, -v3, v9, v5
1004; GFX89-IEEE-NEXT:    s_mov_b64 vcc, s[4:5]
1005; GFX89-IEEE-NEXT:    v_div_fmas_f32 v3, v3, v7, v9
1006; GFX89-IEEE-NEXT:    v_div_fixup_f32 v0, v2, v0, 1.0
1007; GFX89-IEEE-NEXT:    v_div_fixup_f32 v1, v3, v1, 1.0
1008; GFX89-IEEE-NEXT:    s_setpc_b64 s[30:31]
1009;
1010; GFX89-FLUSH-LABEL: v_rcp_v2f32:
1011; GFX89-FLUSH:       ; %bb.0:
1012; GFX89-FLUSH-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1013; GFX89-FLUSH-NEXT:    v_div_scale_f32 v2, s[4:5], v0, v0, 1.0
1014; GFX89-FLUSH-NEXT:    v_div_scale_f32 v3, vcc, 1.0, v0, 1.0
1015; GFX89-FLUSH-NEXT:    v_rcp_f32_e32 v4, v2
1016; GFX89-FLUSH-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_MODE, 4, 2), 3
1017; GFX89-FLUSH-NEXT:    v_fma_f32 v5, -v2, v4, 1.0
1018; GFX89-FLUSH-NEXT:    v_fma_f32 v4, v5, v4, v4
1019; GFX89-FLUSH-NEXT:    v_mul_f32_e32 v5, v3, v4
1020; GFX89-FLUSH-NEXT:    v_fma_f32 v6, -v2, v5, v3
1021; GFX89-FLUSH-NEXT:    v_fma_f32 v5, v6, v4, v5
1022; GFX89-FLUSH-NEXT:    v_fma_f32 v2, -v2, v5, v3
1023; GFX89-FLUSH-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_MODE, 4, 2), 0
1024; GFX89-FLUSH-NEXT:    v_div_fmas_f32 v2, v2, v4, v5
1025; GFX89-FLUSH-NEXT:    v_div_scale_f32 v3, s[4:5], v1, v1, 1.0
1026; GFX89-FLUSH-NEXT:    v_div_scale_f32 v4, vcc, 1.0, v1, 1.0
1027; GFX89-FLUSH-NEXT:    v_div_fixup_f32 v0, v2, v0, 1.0
1028; GFX89-FLUSH-NEXT:    v_rcp_f32_e32 v5, v3
1029; GFX89-FLUSH-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_MODE, 4, 2), 3
1030; GFX89-FLUSH-NEXT:    v_fma_f32 v2, -v3, v5, 1.0
1031; GFX89-FLUSH-NEXT:    v_fma_f32 v2, v2, v5, v5
1032; GFX89-FLUSH-NEXT:    v_mul_f32_e32 v5, v4, v2
1033; GFX89-FLUSH-NEXT:    v_fma_f32 v6, -v3, v5, v4
1034; GFX89-FLUSH-NEXT:    v_fma_f32 v5, v6, v2, v5
1035; GFX89-FLUSH-NEXT:    v_fma_f32 v3, -v3, v5, v4
1036; GFX89-FLUSH-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_MODE, 4, 2), 0
1037; GFX89-FLUSH-NEXT:    v_div_fmas_f32 v2, v3, v2, v5
1038; GFX89-FLUSH-NEXT:    v_div_fixup_f32 v1, v2, v1, 1.0
1039; GFX89-FLUSH-NEXT:    s_setpc_b64 s[30:31]
1040;
1041; GFX10-IEEE-LABEL: v_rcp_v2f32:
1042; GFX10-IEEE:       ; %bb.0:
1043; GFX10-IEEE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1044; GFX10-IEEE-NEXT:    s_waitcnt_vscnt null, 0x0
1045; GFX10-IEEE-NEXT:    v_div_scale_f32 v2, s4, v0, v0, 1.0
1046; GFX10-IEEE-NEXT:    v_div_scale_f32 v3, s4, v1, v1, 1.0
1047; GFX10-IEEE-NEXT:    v_div_scale_f32 v8, vcc_lo, 1.0, v0, 1.0
1048; GFX10-IEEE-NEXT:    v_rcp_f32_e32 v4, v2
1049; GFX10-IEEE-NEXT:    v_rcp_f32_e32 v5, v3
1050; GFX10-IEEE-NEXT:    v_fma_f32 v6, -v2, v4, 1.0
1051; GFX10-IEEE-NEXT:    v_fma_f32 v7, -v3, v5, 1.0
1052; GFX10-IEEE-NEXT:    v_fmac_f32_e32 v4, v6, v4
1053; GFX10-IEEE-NEXT:    v_fmac_f32_e32 v5, v7, v5
1054; GFX10-IEEE-NEXT:    v_div_scale_f32 v6, s4, 1.0, v1, 1.0
1055; GFX10-IEEE-NEXT:    v_mul_f32_e32 v7, v8, v4
1056; GFX10-IEEE-NEXT:    v_mul_f32_e32 v9, v6, v5
1057; GFX10-IEEE-NEXT:    v_fma_f32 v10, v7, -v2, v8
1058; GFX10-IEEE-NEXT:    v_fma_f32 v11, v9, -v3, v6
1059; GFX10-IEEE-NEXT:    v_fmac_f32_e32 v7, v10, v4
1060; GFX10-IEEE-NEXT:    v_fmac_f32_e32 v9, v11, v5
1061; GFX10-IEEE-NEXT:    v_fmac_f32_e64 v8, -v2, v7
1062; GFX10-IEEE-NEXT:    v_fmac_f32_e64 v6, -v3, v9
1063; GFX10-IEEE-NEXT:    v_div_fmas_f32 v2, v8, v4, v7
1064; GFX10-IEEE-NEXT:    s_mov_b32 vcc_lo, s4
1065; GFX10-IEEE-NEXT:    v_div_fmas_f32 v3, v6, v5, v9
1066; GFX10-IEEE-NEXT:    v_div_fixup_f32 v0, v2, v0, 1.0
1067; GFX10-IEEE-NEXT:    v_div_fixup_f32 v1, v3, v1, 1.0
1068; GFX10-IEEE-NEXT:    s_setpc_b64 s[30:31]
1069;
1070; GFX10-FLUSH-LABEL: v_rcp_v2f32:
1071; GFX10-FLUSH:       ; %bb.0:
1072; GFX10-FLUSH-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1073; GFX10-FLUSH-NEXT:    s_waitcnt_vscnt null, 0x0
1074; GFX10-FLUSH-NEXT:    v_div_scale_f32 v2, s4, v0, v0, 1.0
1075; GFX10-FLUSH-NEXT:    v_div_scale_f32 v4, vcc_lo, 1.0, v0, 1.0
1076; GFX10-FLUSH-NEXT:    v_rcp_f32_e32 v3, v2
1077; GFX10-FLUSH-NEXT:    s_denorm_mode 3
1078; GFX10-FLUSH-NEXT:    v_fma_f32 v5, -v2, v3, 1.0
1079; GFX10-FLUSH-NEXT:    v_fmac_f32_e32 v3, v5, v3
1080; GFX10-FLUSH-NEXT:    v_mul_f32_e32 v5, v4, v3
1081; GFX10-FLUSH-NEXT:    v_fma_f32 v6, v5, -v2, v4
1082; GFX10-FLUSH-NEXT:    v_fmac_f32_e32 v5, v6, v3
1083; GFX10-FLUSH-NEXT:    v_fmac_f32_e64 v4, -v2, v5
1084; GFX10-FLUSH-NEXT:    s_denorm_mode 0
1085; GFX10-FLUSH-NEXT:    v_div_scale_f32 v2, s4, v1, v1, 1.0
1086; GFX10-FLUSH-NEXT:    v_div_fmas_f32 v3, v4, v3, v5
1087; GFX10-FLUSH-NEXT:    v_rcp_f32_e32 v4, v2
1088; GFX10-FLUSH-NEXT:    v_div_fixup_f32 v0, v3, v0, 1.0
1089; GFX10-FLUSH-NEXT:    v_div_scale_f32 v3, vcc_lo, 1.0, v1, 1.0
1090; GFX10-FLUSH-NEXT:    s_denorm_mode 3
1091; GFX10-FLUSH-NEXT:    v_fma_f32 v5, -v2, v4, 1.0
1092; GFX10-FLUSH-NEXT:    v_fmac_f32_e32 v4, v5, v4
1093; GFX10-FLUSH-NEXT:    v_mul_f32_e32 v5, v3, v4
1094; GFX10-FLUSH-NEXT:    v_fma_f32 v6, v5, -v2, v3
1095; GFX10-FLUSH-NEXT:    v_fmac_f32_e32 v5, v6, v4
1096; GFX10-FLUSH-NEXT:    v_fmac_f32_e64 v3, -v2, v5
1097; GFX10-FLUSH-NEXT:    s_denorm_mode 0
1098; GFX10-FLUSH-NEXT:    v_div_fmas_f32 v2, v3, v4, v5
1099; GFX10-FLUSH-NEXT:    v_div_fixup_f32 v1, v2, v1, 1.0
1100; GFX10-FLUSH-NEXT:    s_setpc_b64 s[30:31]
1101  %fdiv = fdiv <2 x float> <float 1.0, float 1.0>, %x
1102  ret <2 x float> %fdiv
1103}
1104
1105define <2 x float> @v_rcp_v2f32_arcp(<2 x float> %x) {
1106; GFX6-IEEE-LABEL: v_rcp_v2f32_arcp:
1107; GFX6-IEEE:       ; %bb.0:
1108; GFX6-IEEE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1109; GFX6-IEEE-NEXT:    v_div_scale_f32 v2, s[4:5], v0, v0, 1.0
1110; GFX6-IEEE-NEXT:    v_rcp_f32_e32 v3, v2
1111; GFX6-IEEE-NEXT:    v_div_scale_f32 v4, vcc, 1.0, v0, 1.0
1112; GFX6-IEEE-NEXT:    v_fma_f32 v5, -v2, v3, 1.0
1113; GFX6-IEEE-NEXT:    v_fma_f32 v3, v5, v3, v3
1114; GFX6-IEEE-NEXT:    v_mul_f32_e32 v5, v4, v3
1115; GFX6-IEEE-NEXT:    v_fma_f32 v6, -v2, v5, v4
1116; GFX6-IEEE-NEXT:    v_fma_f32 v5, v6, v3, v5
1117; GFX6-IEEE-NEXT:    v_fma_f32 v2, -v2, v5, v4
1118; GFX6-IEEE-NEXT:    v_div_fmas_f32 v2, v2, v3, v5
1119; GFX6-IEEE-NEXT:    v_div_scale_f32 v3, s[4:5], v1, v1, 1.0
1120; GFX6-IEEE-NEXT:    v_rcp_f32_e32 v4, v3
1121; GFX6-IEEE-NEXT:    v_div_fixup_f32 v0, v2, v0, 1.0
1122; GFX6-IEEE-NEXT:    v_div_scale_f32 v2, vcc, 1.0, v1, 1.0
1123; GFX6-IEEE-NEXT:    v_fma_f32 v5, -v3, v4, 1.0
1124; GFX6-IEEE-NEXT:    v_fma_f32 v4, v5, v4, v4
1125; GFX6-IEEE-NEXT:    v_mul_f32_e32 v5, v2, v4
1126; GFX6-IEEE-NEXT:    v_fma_f32 v6, -v3, v5, v2
1127; GFX6-IEEE-NEXT:    v_fma_f32 v5, v6, v4, v5
1128; GFX6-IEEE-NEXT:    v_fma_f32 v2, -v3, v5, v2
1129; GFX6-IEEE-NEXT:    v_div_fmas_f32 v2, v2, v4, v5
1130; GFX6-IEEE-NEXT:    v_div_fixup_f32 v1, v2, v1, 1.0
1131; GFX6-IEEE-NEXT:    s_setpc_b64 s[30:31]
1132;
1133; GFX6-FLUSH-LABEL: v_rcp_v2f32_arcp:
1134; GFX6-FLUSH:       ; %bb.0:
1135; GFX6-FLUSH-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1136; GFX6-FLUSH-NEXT:    v_div_scale_f32 v2, s[4:5], v0, v0, 1.0
1137; GFX6-FLUSH-NEXT:    v_rcp_f32_e32 v3, v2
1138; GFX6-FLUSH-NEXT:    v_div_scale_f32 v4, vcc, 1.0, v0, 1.0
1139; GFX6-FLUSH-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_MODE, 4, 2), 3
1140; GFX6-FLUSH-NEXT:    v_fma_f32 v5, -v2, v3, 1.0
1141; GFX6-FLUSH-NEXT:    v_fma_f32 v3, v5, v3, v3
1142; GFX6-FLUSH-NEXT:    v_mul_f32_e32 v5, v4, v3
1143; GFX6-FLUSH-NEXT:    v_fma_f32 v6, -v2, v5, v4
1144; GFX6-FLUSH-NEXT:    v_fma_f32 v5, v6, v3, v5
1145; GFX6-FLUSH-NEXT:    v_fma_f32 v2, -v2, v5, v4
1146; GFX6-FLUSH-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_MODE, 4, 2), 0
1147; GFX6-FLUSH-NEXT:    v_div_fmas_f32 v2, v2, v3, v5
1148; GFX6-FLUSH-NEXT:    v_div_scale_f32 v3, s[4:5], v1, v1, 1.0
1149; GFX6-FLUSH-NEXT:    v_div_fixup_f32 v0, v2, v0, 1.0
1150; GFX6-FLUSH-NEXT:    v_rcp_f32_e32 v4, v3
1151; GFX6-FLUSH-NEXT:    v_div_scale_f32 v2, vcc, 1.0, v1, 1.0
1152; GFX6-FLUSH-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_MODE, 4, 2), 3
1153; GFX6-FLUSH-NEXT:    v_fma_f32 v5, -v3, v4, 1.0
1154; GFX6-FLUSH-NEXT:    v_fma_f32 v4, v5, v4, v4
1155; GFX6-FLUSH-NEXT:    v_mul_f32_e32 v5, v2, v4
1156; GFX6-FLUSH-NEXT:    v_fma_f32 v6, -v3, v5, v2
1157; GFX6-FLUSH-NEXT:    v_fma_f32 v5, v6, v4, v5
1158; GFX6-FLUSH-NEXT:    v_fma_f32 v2, -v3, v5, v2
1159; GFX6-FLUSH-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_MODE, 4, 2), 0
1160; GFX6-FLUSH-NEXT:    v_div_fmas_f32 v2, v2, v4, v5
1161; GFX6-FLUSH-NEXT:    v_div_fixup_f32 v1, v2, v1, 1.0
1162; GFX6-FLUSH-NEXT:    s_setpc_b64 s[30:31]
1163;
1164; GFX89-IEEE-LABEL: v_rcp_v2f32_arcp:
1165; GFX89-IEEE:       ; %bb.0:
1166; GFX89-IEEE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1167; GFX89-IEEE-NEXT:    v_div_scale_f32 v2, s[4:5], v0, v0, 1.0
1168; GFX89-IEEE-NEXT:    v_div_scale_f32 v3, s[4:5], v1, v1, 1.0
1169; GFX89-IEEE-NEXT:    v_div_scale_f32 v4, vcc, 1.0, v0, 1.0
1170; GFX89-IEEE-NEXT:    v_div_scale_f32 v5, s[4:5], 1.0, v1, 1.0
1171; GFX89-IEEE-NEXT:    v_rcp_f32_e32 v6, v2
1172; GFX89-IEEE-NEXT:    v_rcp_f32_e32 v7, v3
1173; GFX89-IEEE-NEXT:    v_fma_f32 v8, -v2, v6, 1.0
1174; GFX89-IEEE-NEXT:    v_fma_f32 v9, -v3, v7, 1.0
1175; GFX89-IEEE-NEXT:    v_fma_f32 v6, v8, v6, v6
1176; GFX89-IEEE-NEXT:    v_fma_f32 v7, v9, v7, v7
1177; GFX89-IEEE-NEXT:    v_mul_f32_e32 v8, v4, v6
1178; GFX89-IEEE-NEXT:    v_fma_f32 v10, -v2, v8, v4
1179; GFX89-IEEE-NEXT:    v_mul_f32_e32 v9, v5, v7
1180; GFX89-IEEE-NEXT:    v_fma_f32 v11, -v3, v9, v5
1181; GFX89-IEEE-NEXT:    v_fma_f32 v8, v10, v6, v8
1182; GFX89-IEEE-NEXT:    v_fma_f32 v2, -v2, v8, v4
1183; GFX89-IEEE-NEXT:    v_fma_f32 v9, v11, v7, v9
1184; GFX89-IEEE-NEXT:    v_div_fmas_f32 v2, v2, v6, v8
1185; GFX89-IEEE-NEXT:    v_fma_f32 v3, -v3, v9, v5
1186; GFX89-IEEE-NEXT:    s_mov_b64 vcc, s[4:5]
1187; GFX89-IEEE-NEXT:    v_div_fmas_f32 v3, v3, v7, v9
1188; GFX89-IEEE-NEXT:    v_div_fixup_f32 v0, v2, v0, 1.0
1189; GFX89-IEEE-NEXT:    v_div_fixup_f32 v1, v3, v1, 1.0
1190; GFX89-IEEE-NEXT:    s_setpc_b64 s[30:31]
1191;
1192; GFX89-FLUSH-LABEL: v_rcp_v2f32_arcp:
1193; GFX89-FLUSH:       ; %bb.0:
1194; GFX89-FLUSH-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1195; GFX89-FLUSH-NEXT:    v_div_scale_f32 v2, s[4:5], v0, v0, 1.0
1196; GFX89-FLUSH-NEXT:    v_div_scale_f32 v3, vcc, 1.0, v0, 1.0
1197; GFX89-FLUSH-NEXT:    v_rcp_f32_e32 v4, v2
1198; GFX89-FLUSH-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_MODE, 4, 2), 3
1199; GFX89-FLUSH-NEXT:    v_fma_f32 v5, -v2, v4, 1.0
1200; GFX89-FLUSH-NEXT:    v_fma_f32 v4, v5, v4, v4
1201; GFX89-FLUSH-NEXT:    v_mul_f32_e32 v5, v3, v4
1202; GFX89-FLUSH-NEXT:    v_fma_f32 v6, -v2, v5, v3
1203; GFX89-FLUSH-NEXT:    v_fma_f32 v5, v6, v4, v5
1204; GFX89-FLUSH-NEXT:    v_fma_f32 v2, -v2, v5, v3
1205; GFX89-FLUSH-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_MODE, 4, 2), 0
1206; GFX89-FLUSH-NEXT:    v_div_fmas_f32 v2, v2, v4, v5
1207; GFX89-FLUSH-NEXT:    v_div_scale_f32 v3, s[4:5], v1, v1, 1.0
1208; GFX89-FLUSH-NEXT:    v_div_scale_f32 v4, vcc, 1.0, v1, 1.0
1209; GFX89-FLUSH-NEXT:    v_div_fixup_f32 v0, v2, v0, 1.0
1210; GFX89-FLUSH-NEXT:    v_rcp_f32_e32 v5, v3
1211; GFX89-FLUSH-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_MODE, 4, 2), 3
1212; GFX89-FLUSH-NEXT:    v_fma_f32 v2, -v3, v5, 1.0
1213; GFX89-FLUSH-NEXT:    v_fma_f32 v2, v2, v5, v5
1214; GFX89-FLUSH-NEXT:    v_mul_f32_e32 v5, v4, v2
1215; GFX89-FLUSH-NEXT:    v_fma_f32 v6, -v3, v5, v4
1216; GFX89-FLUSH-NEXT:    v_fma_f32 v5, v6, v2, v5
1217; GFX89-FLUSH-NEXT:    v_fma_f32 v3, -v3, v5, v4
1218; GFX89-FLUSH-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_MODE, 4, 2), 0
1219; GFX89-FLUSH-NEXT:    v_div_fmas_f32 v2, v3, v2, v5
1220; GFX89-FLUSH-NEXT:    v_div_fixup_f32 v1, v2, v1, 1.0
1221; GFX89-FLUSH-NEXT:    s_setpc_b64 s[30:31]
1222;
1223; GFX10-IEEE-LABEL: v_rcp_v2f32_arcp:
1224; GFX10-IEEE:       ; %bb.0:
1225; GFX10-IEEE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1226; GFX10-IEEE-NEXT:    s_waitcnt_vscnt null, 0x0
1227; GFX10-IEEE-NEXT:    v_div_scale_f32 v2, s4, v0, v0, 1.0
1228; GFX10-IEEE-NEXT:    v_div_scale_f32 v3, s4, v1, v1, 1.0
1229; GFX10-IEEE-NEXT:    v_div_scale_f32 v8, vcc_lo, 1.0, v0, 1.0
1230; GFX10-IEEE-NEXT:    v_rcp_f32_e32 v4, v2
1231; GFX10-IEEE-NEXT:    v_rcp_f32_e32 v5, v3
1232; GFX10-IEEE-NEXT:    v_fma_f32 v6, -v2, v4, 1.0
1233; GFX10-IEEE-NEXT:    v_fma_f32 v7, -v3, v5, 1.0
1234; GFX10-IEEE-NEXT:    v_fmac_f32_e32 v4, v6, v4
1235; GFX10-IEEE-NEXT:    v_fmac_f32_e32 v5, v7, v5
1236; GFX10-IEEE-NEXT:    v_div_scale_f32 v6, s4, 1.0, v1, 1.0
1237; GFX10-IEEE-NEXT:    v_mul_f32_e32 v7, v8, v4
1238; GFX10-IEEE-NEXT:    v_mul_f32_e32 v9, v6, v5
1239; GFX10-IEEE-NEXT:    v_fma_f32 v10, v7, -v2, v8
1240; GFX10-IEEE-NEXT:    v_fma_f32 v11, v9, -v3, v6
1241; GFX10-IEEE-NEXT:    v_fmac_f32_e32 v7, v10, v4
1242; GFX10-IEEE-NEXT:    v_fmac_f32_e32 v9, v11, v5
1243; GFX10-IEEE-NEXT:    v_fmac_f32_e64 v8, -v2, v7
1244; GFX10-IEEE-NEXT:    v_fmac_f32_e64 v6, -v3, v9
1245; GFX10-IEEE-NEXT:    v_div_fmas_f32 v2, v8, v4, v7
1246; GFX10-IEEE-NEXT:    s_mov_b32 vcc_lo, s4
1247; GFX10-IEEE-NEXT:    v_div_fmas_f32 v3, v6, v5, v9
1248; GFX10-IEEE-NEXT:    v_div_fixup_f32 v0, v2, v0, 1.0
1249; GFX10-IEEE-NEXT:    v_div_fixup_f32 v1, v3, v1, 1.0
1250; GFX10-IEEE-NEXT:    s_setpc_b64 s[30:31]
1251;
1252; GFX10-FLUSH-LABEL: v_rcp_v2f32_arcp:
1253; GFX10-FLUSH:       ; %bb.0:
1254; GFX10-FLUSH-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1255; GFX10-FLUSH-NEXT:    s_waitcnt_vscnt null, 0x0
1256; GFX10-FLUSH-NEXT:    v_div_scale_f32 v2, s4, v0, v0, 1.0
1257; GFX10-FLUSH-NEXT:    v_div_scale_f32 v4, vcc_lo, 1.0, v0, 1.0
1258; GFX10-FLUSH-NEXT:    v_rcp_f32_e32 v3, v2
1259; GFX10-FLUSH-NEXT:    s_denorm_mode 3
1260; GFX10-FLUSH-NEXT:    v_fma_f32 v5, -v2, v3, 1.0
1261; GFX10-FLUSH-NEXT:    v_fmac_f32_e32 v3, v5, v3
1262; GFX10-FLUSH-NEXT:    v_mul_f32_e32 v5, v4, v3
1263; GFX10-FLUSH-NEXT:    v_fma_f32 v6, v5, -v2, v4
1264; GFX10-FLUSH-NEXT:    v_fmac_f32_e32 v5, v6, v3
1265; GFX10-FLUSH-NEXT:    v_fmac_f32_e64 v4, -v2, v5
1266; GFX10-FLUSH-NEXT:    s_denorm_mode 0
1267; GFX10-FLUSH-NEXT:    v_div_scale_f32 v2, s4, v1, v1, 1.0
1268; GFX10-FLUSH-NEXT:    v_div_fmas_f32 v3, v4, v3, v5
1269; GFX10-FLUSH-NEXT:    v_rcp_f32_e32 v4, v2
1270; GFX10-FLUSH-NEXT:    v_div_fixup_f32 v0, v3, v0, 1.0
1271; GFX10-FLUSH-NEXT:    v_div_scale_f32 v3, vcc_lo, 1.0, v1, 1.0
1272; GFX10-FLUSH-NEXT:    s_denorm_mode 3
1273; GFX10-FLUSH-NEXT:    v_fma_f32 v5, -v2, v4, 1.0
1274; GFX10-FLUSH-NEXT:    v_fmac_f32_e32 v4, v5, v4
1275; GFX10-FLUSH-NEXT:    v_mul_f32_e32 v5, v3, v4
1276; GFX10-FLUSH-NEXT:    v_fma_f32 v6, v5, -v2, v3
1277; GFX10-FLUSH-NEXT:    v_fmac_f32_e32 v5, v6, v4
1278; GFX10-FLUSH-NEXT:    v_fmac_f32_e64 v3, -v2, v5
1279; GFX10-FLUSH-NEXT:    s_denorm_mode 0
1280; GFX10-FLUSH-NEXT:    v_div_fmas_f32 v2, v3, v4, v5
1281; GFX10-FLUSH-NEXT:    v_div_fixup_f32 v1, v2, v1, 1.0
1282; GFX10-FLUSH-NEXT:    s_setpc_b64 s[30:31]
1283  %fdiv = fdiv arcp <2 x float> <float 1.0, float 1.0>, %x
1284  ret <2 x float> %fdiv
1285}
1286
1287define <2 x float> @v_rcp_v2f32_arcp_afn(<2 x float> %x) {
1288; GCN-LABEL: v_rcp_v2f32_arcp_afn:
1289; GCN:       ; %bb.0:
1290; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1291; GCN-NEXT:    v_rcp_f32_e32 v0, v0
1292; GCN-NEXT:    v_rcp_f32_e32 v1, v1
1293; GCN-NEXT:    s_setpc_b64 s[30:31]
1294;
1295; GFX10-LABEL: v_rcp_v2f32_arcp_afn:
1296; GFX10:       ; %bb.0:
1297; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1298; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
1299; GFX10-NEXT:    v_rcp_f32_e32 v0, v0
1300; GFX10-NEXT:    v_rcp_f32_e32 v1, v1
1301; GFX10-NEXT:    s_setpc_b64 s[30:31]
1302  %fdiv = fdiv arcp afn <2 x float> <float 1.0, float 1.0>, %x
1303  ret <2 x float> %fdiv
1304}
1305
1306define <2 x float> @v_rcp_v2f32_ulp25(<2 x float> %x) {
1307; GCN-IEEE-LABEL: v_rcp_v2f32_ulp25:
1308; GCN-IEEE:       ; %bb.0:
1309; GCN-IEEE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1310; GCN-IEEE-NEXT:    s_mov_b32 s4, 0x6f800000
1311; GCN-IEEE-NEXT:    v_mov_b32_e32 v2, 0x2f800000
1312; GCN-IEEE-NEXT:    v_cmp_gt_f32_e64 vcc, |v0|, s4
1313; GCN-IEEE-NEXT:    v_cndmask_b32_e32 v3, 1.0, v2, vcc
1314; GCN-IEEE-NEXT:    v_cmp_gt_f32_e64 vcc, |v1|, s4
1315; GCN-IEEE-NEXT:    v_cndmask_b32_e32 v2, 1.0, v2, vcc
1316; GCN-IEEE-NEXT:    v_mul_f32_e32 v0, v0, v3
1317; GCN-IEEE-NEXT:    v_mul_f32_e32 v1, v1, v2
1318; GCN-IEEE-NEXT:    v_rcp_f32_e32 v0, v0
1319; GCN-IEEE-NEXT:    v_rcp_f32_e32 v1, v1
1320; GCN-IEEE-NEXT:    v_mul_f32_e32 v0, 1.0, v0
1321; GCN-IEEE-NEXT:    v_mul_f32_e32 v1, 1.0, v1
1322; GCN-IEEE-NEXT:    v_mul_f32_e32 v0, v3, v0
1323; GCN-IEEE-NEXT:    v_mul_f32_e32 v1, v2, v1
1324; GCN-IEEE-NEXT:    s_setpc_b64 s[30:31]
1325;
1326; GCN-FLUSH-LABEL: v_rcp_v2f32_ulp25:
1327; GCN-FLUSH:       ; %bb.0:
1328; GCN-FLUSH-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1329; GCN-FLUSH-NEXT:    v_rcp_f32_e32 v0, v0
1330; GCN-FLUSH-NEXT:    v_rcp_f32_e32 v1, v1
1331; GCN-FLUSH-NEXT:    s_setpc_b64 s[30:31]
1332;
1333; GFX10-IEEE-LABEL: v_rcp_v2f32_ulp25:
1334; GFX10-IEEE:       ; %bb.0:
1335; GFX10-IEEE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1336; GFX10-IEEE-NEXT:    s_waitcnt_vscnt null, 0x0
1337; GFX10-IEEE-NEXT:    s_mov_b32 s4, 0x6f800000
1338; GFX10-IEEE-NEXT:    s_mov_b32 s5, 0x2f800000
1339; GFX10-IEEE-NEXT:    v_cmp_gt_f32_e64 s6, |v0|, s4
1340; GFX10-IEEE-NEXT:    v_cmp_gt_f32_e64 s4, |v1|, s4
1341; GFX10-IEEE-NEXT:    v_cndmask_b32_e64 v2, 1.0, s5, s6
1342; GFX10-IEEE-NEXT:    v_cndmask_b32_e64 v3, 1.0, s5, s4
1343; GFX10-IEEE-NEXT:    v_mul_f32_e32 v0, v0, v2
1344; GFX10-IEEE-NEXT:    v_mul_f32_e32 v1, v1, v3
1345; GFX10-IEEE-NEXT:    v_rcp_f32_e32 v0, v0
1346; GFX10-IEEE-NEXT:    v_rcp_f32_e32 v1, v1
1347; GFX10-IEEE-NEXT:    v_mul_f32_e32 v0, 1.0, v0
1348; GFX10-IEEE-NEXT:    v_mul_f32_e32 v1, 1.0, v1
1349; GFX10-IEEE-NEXT:    v_mul_f32_e32 v0, v2, v0
1350; GFX10-IEEE-NEXT:    v_mul_f32_e32 v1, v3, v1
1351; GFX10-IEEE-NEXT:    s_setpc_b64 s[30:31]
1352;
1353; GFX10-FLUSH-LABEL: v_rcp_v2f32_ulp25:
1354; GFX10-FLUSH:       ; %bb.0:
1355; GFX10-FLUSH-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1356; GFX10-FLUSH-NEXT:    s_waitcnt_vscnt null, 0x0
1357; GFX10-FLUSH-NEXT:    v_rcp_f32_e32 v0, v0
1358; GFX10-FLUSH-NEXT:    v_rcp_f32_e32 v1, v1
1359; GFX10-FLUSH-NEXT:    s_setpc_b64 s[30:31]
1360  %fdiv = fdiv <2 x float> <float 1.0, float 1.0>, %x, !fpmath !0
1361  ret <2 x float> %fdiv
1362}
1363
1364define <2 x float> @v_fdiv_v2f32_afn_ulp25(<2 x float> %a, <2 x float> %b) {
1365; GCN-LABEL: v_fdiv_v2f32_afn_ulp25:
1366; GCN:       ; %bb.0:
1367; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1368; GCN-NEXT:    v_rcp_f32_e32 v2, v2
1369; GCN-NEXT:    v_rcp_f32_e32 v3, v3
1370; GCN-NEXT:    v_mul_f32_e32 v0, v0, v2
1371; GCN-NEXT:    v_mul_f32_e32 v1, v1, v3
1372; GCN-NEXT:    s_setpc_b64 s[30:31]
1373;
1374; GFX10-LABEL: v_fdiv_v2f32_afn_ulp25:
1375; GFX10:       ; %bb.0:
1376; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1377; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
1378; GFX10-NEXT:    v_rcp_f32_e32 v2, v2
1379; GFX10-NEXT:    v_rcp_f32_e32 v3, v3
1380; GFX10-NEXT:    v_mul_f32_e32 v0, v0, v2
1381; GFX10-NEXT:    v_mul_f32_e32 v1, v1, v3
1382; GFX10-NEXT:    s_setpc_b64 s[30:31]
1383  %fdiv = fdiv afn <2 x float> %a, %b, !fpmath !0
1384  ret <2 x float> %fdiv
1385}
1386
1387define <2 x float> @v_fdiv_v2f32_arcp_ulp25(<2 x float> %a, <2 x float> %b) {
1388; GFX6-IEEE-LABEL: v_fdiv_v2f32_arcp_ulp25:
1389; GFX6-IEEE:       ; %bb.0:
1390; GFX6-IEEE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1391; GFX6-IEEE-NEXT:    v_div_scale_f32 v4, s[4:5], v2, v2, v0
1392; GFX6-IEEE-NEXT:    v_rcp_f32_e32 v5, v4
1393; GFX6-IEEE-NEXT:    v_div_scale_f32 v6, vcc, v0, v2, v0
1394; GFX6-IEEE-NEXT:    v_fma_f32 v7, -v4, v5, 1.0
1395; GFX6-IEEE-NEXT:    v_fma_f32 v5, v7, v5, v5
1396; GFX6-IEEE-NEXT:    v_mul_f32_e32 v7, v6, v5
1397; GFX6-IEEE-NEXT:    v_fma_f32 v8, -v4, v7, v6
1398; GFX6-IEEE-NEXT:    v_fma_f32 v7, v8, v5, v7
1399; GFX6-IEEE-NEXT:    v_fma_f32 v4, -v4, v7, v6
1400; GFX6-IEEE-NEXT:    v_div_fmas_f32 v4, v4, v5, v7
1401; GFX6-IEEE-NEXT:    v_div_scale_f32 v5, s[4:5], v3, v3, v1
1402; GFX6-IEEE-NEXT:    v_rcp_f32_e32 v6, v5
1403; GFX6-IEEE-NEXT:    v_div_fixup_f32 v0, v4, v2, v0
1404; GFX6-IEEE-NEXT:    v_div_scale_f32 v2, vcc, v1, v3, v1
1405; GFX6-IEEE-NEXT:    v_fma_f32 v4, -v5, v6, 1.0
1406; GFX6-IEEE-NEXT:    v_fma_f32 v4, v4, v6, v6
1407; GFX6-IEEE-NEXT:    v_mul_f32_e32 v6, v2, v4
1408; GFX6-IEEE-NEXT:    v_fma_f32 v7, -v5, v6, v2
1409; GFX6-IEEE-NEXT:    v_fma_f32 v6, v7, v4, v6
1410; GFX6-IEEE-NEXT:    v_fma_f32 v2, -v5, v6, v2
1411; GFX6-IEEE-NEXT:    v_div_fmas_f32 v2, v2, v4, v6
1412; GFX6-IEEE-NEXT:    v_div_fixup_f32 v1, v2, v3, v1
1413; GFX6-IEEE-NEXT:    s_setpc_b64 s[30:31]
1414;
1415; GCN-FLUSH-LABEL: v_fdiv_v2f32_arcp_ulp25:
1416; GCN-FLUSH:       ; %bb.0:
1417; GCN-FLUSH-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1418; GCN-FLUSH-NEXT:    s_mov_b32 s4, 0x6f800000
1419; GCN-FLUSH-NEXT:    v_mov_b32_e32 v4, 0x2f800000
1420; GCN-FLUSH-NEXT:    v_cmp_gt_f32_e64 vcc, |v2|, s4
1421; GCN-FLUSH-NEXT:    v_cndmask_b32_e32 v5, 1.0, v4, vcc
1422; GCN-FLUSH-NEXT:    v_cmp_gt_f32_e64 vcc, |v3|, s4
1423; GCN-FLUSH-NEXT:    v_cndmask_b32_e32 v4, 1.0, v4, vcc
1424; GCN-FLUSH-NEXT:    v_mul_f32_e32 v2, v2, v5
1425; GCN-FLUSH-NEXT:    v_mul_f32_e32 v3, v3, v4
1426; GCN-FLUSH-NEXT:    v_rcp_f32_e32 v2, v2
1427; GCN-FLUSH-NEXT:    v_rcp_f32_e32 v3, v3
1428; GCN-FLUSH-NEXT:    v_mul_f32_e32 v0, v0, v2
1429; GCN-FLUSH-NEXT:    v_mul_f32_e32 v1, v1, v3
1430; GCN-FLUSH-NEXT:    v_mul_f32_e32 v0, v5, v0
1431; GCN-FLUSH-NEXT:    v_mul_f32_e32 v1, v4, v1
1432; GCN-FLUSH-NEXT:    s_setpc_b64 s[30:31]
1433;
1434; GFX89-IEEE-LABEL: v_fdiv_v2f32_arcp_ulp25:
1435; GFX89-IEEE:       ; %bb.0:
1436; GFX89-IEEE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1437; GFX89-IEEE-NEXT:    v_div_scale_f32 v4, s[4:5], v2, v2, v0
1438; GFX89-IEEE-NEXT:    v_div_scale_f32 v5, s[4:5], v3, v3, v1
1439; GFX89-IEEE-NEXT:    v_div_scale_f32 v6, vcc, v0, v2, v0
1440; GFX89-IEEE-NEXT:    v_div_scale_f32 v7, s[4:5], v1, v3, v1
1441; GFX89-IEEE-NEXT:    v_rcp_f32_e32 v8, v4
1442; GFX89-IEEE-NEXT:    v_rcp_f32_e32 v9, v5
1443; GFX89-IEEE-NEXT:    v_fma_f32 v10, -v4, v8, 1.0
1444; GFX89-IEEE-NEXT:    v_fma_f32 v11, -v5, v9, 1.0
1445; GFX89-IEEE-NEXT:    v_fma_f32 v8, v10, v8, v8
1446; GFX89-IEEE-NEXT:    v_fma_f32 v9, v11, v9, v9
1447; GFX89-IEEE-NEXT:    v_mul_f32_e32 v10, v6, v8
1448; GFX89-IEEE-NEXT:    v_fma_f32 v12, -v4, v10, v6
1449; GFX89-IEEE-NEXT:    v_mul_f32_e32 v11, v7, v9
1450; GFX89-IEEE-NEXT:    v_fma_f32 v13, -v5, v11, v7
1451; GFX89-IEEE-NEXT:    v_fma_f32 v10, v12, v8, v10
1452; GFX89-IEEE-NEXT:    v_fma_f32 v4, -v4, v10, v6
1453; GFX89-IEEE-NEXT:    v_fma_f32 v11, v13, v9, v11
1454; GFX89-IEEE-NEXT:    v_div_fmas_f32 v4, v4, v8, v10
1455; GFX89-IEEE-NEXT:    v_fma_f32 v5, -v5, v11, v7
1456; GFX89-IEEE-NEXT:    s_mov_b64 vcc, s[4:5]
1457; GFX89-IEEE-NEXT:    v_div_fmas_f32 v5, v5, v9, v11
1458; GFX89-IEEE-NEXT:    v_div_fixup_f32 v0, v4, v2, v0
1459; GFX89-IEEE-NEXT:    v_div_fixup_f32 v1, v5, v3, v1
1460; GFX89-IEEE-NEXT:    s_setpc_b64 s[30:31]
1461;
1462; GFX10-IEEE-LABEL: v_fdiv_v2f32_arcp_ulp25:
1463; GFX10-IEEE:       ; %bb.0:
1464; GFX10-IEEE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1465; GFX10-IEEE-NEXT:    s_waitcnt_vscnt null, 0x0
1466; GFX10-IEEE-NEXT:    v_div_scale_f32 v4, s4, v2, v2, v0
1467; GFX10-IEEE-NEXT:    v_div_scale_f32 v5, s4, v3, v3, v1
1468; GFX10-IEEE-NEXT:    v_div_scale_f32 v10, vcc_lo, v0, v2, v0
1469; GFX10-IEEE-NEXT:    v_rcp_f32_e32 v6, v4
1470; GFX10-IEEE-NEXT:    v_rcp_f32_e32 v7, v5
1471; GFX10-IEEE-NEXT:    v_fma_f32 v8, -v4, v6, 1.0
1472; GFX10-IEEE-NEXT:    v_fma_f32 v9, -v5, v7, 1.0
1473; GFX10-IEEE-NEXT:    v_fmac_f32_e32 v6, v8, v6
1474; GFX10-IEEE-NEXT:    v_fmac_f32_e32 v7, v9, v7
1475; GFX10-IEEE-NEXT:    v_div_scale_f32 v8, s4, v1, v3, v1
1476; GFX10-IEEE-NEXT:    v_mul_f32_e32 v9, v10, v6
1477; GFX10-IEEE-NEXT:    v_mul_f32_e32 v11, v8, v7
1478; GFX10-IEEE-NEXT:    v_fma_f32 v12, v9, -v4, v10
1479; GFX10-IEEE-NEXT:    v_fma_f32 v13, v11, -v5, v8
1480; GFX10-IEEE-NEXT:    v_fmac_f32_e32 v9, v12, v6
1481; GFX10-IEEE-NEXT:    v_fmac_f32_e32 v11, v13, v7
1482; GFX10-IEEE-NEXT:    v_fmac_f32_e64 v10, -v4, v9
1483; GFX10-IEEE-NEXT:    v_fmac_f32_e64 v8, -v5, v11
1484; GFX10-IEEE-NEXT:    v_div_fmas_f32 v4, v10, v6, v9
1485; GFX10-IEEE-NEXT:    s_mov_b32 vcc_lo, s4
1486; GFX10-IEEE-NEXT:    v_div_fmas_f32 v5, v8, v7, v11
1487; GFX10-IEEE-NEXT:    v_div_fixup_f32 v0, v4, v2, v0
1488; GFX10-IEEE-NEXT:    v_div_fixup_f32 v1, v5, v3, v1
1489; GFX10-IEEE-NEXT:    s_setpc_b64 s[30:31]
1490;
1491; GFX10-FLUSH-LABEL: v_fdiv_v2f32_arcp_ulp25:
1492; GFX10-FLUSH:       ; %bb.0:
1493; GFX10-FLUSH-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1494; GFX10-FLUSH-NEXT:    s_waitcnt_vscnt null, 0x0
1495; GFX10-FLUSH-NEXT:    s_mov_b32 s4, 0x6f800000
1496; GFX10-FLUSH-NEXT:    s_mov_b32 s5, 0x2f800000
1497; GFX10-FLUSH-NEXT:    v_cmp_gt_f32_e64 s6, |v2|, s4
1498; GFX10-FLUSH-NEXT:    v_cmp_gt_f32_e64 s4, |v3|, s4
1499; GFX10-FLUSH-NEXT:    v_cndmask_b32_e64 v4, 1.0, s5, s6
1500; GFX10-FLUSH-NEXT:    v_cndmask_b32_e64 v5, 1.0, s5, s4
1501; GFX10-FLUSH-NEXT:    v_mul_f32_e32 v2, v2, v4
1502; GFX10-FLUSH-NEXT:    v_mul_f32_e32 v3, v3, v5
1503; GFX10-FLUSH-NEXT:    v_rcp_f32_e32 v2, v2
1504; GFX10-FLUSH-NEXT:    v_rcp_f32_e32 v3, v3
1505; GFX10-FLUSH-NEXT:    v_mul_f32_e32 v0, v0, v2
1506; GFX10-FLUSH-NEXT:    v_mul_f32_e32 v1, v1, v3
1507; GFX10-FLUSH-NEXT:    v_mul_f32_e32 v0, v4, v0
1508; GFX10-FLUSH-NEXT:    v_mul_f32_e32 v1, v5, v1
1509; GFX10-FLUSH-NEXT:    s_setpc_b64 s[30:31]
1510  %fdiv = fdiv arcp <2 x float> %a, %b, !fpmath !0
1511  ret <2 x float> %fdiv
1512}
1513
1514define <2 x float> @v_fdiv_v2f32_arcp_afn_ulp25(<2 x float> %a, <2 x float> %b) {
1515; GCN-LABEL: v_fdiv_v2f32_arcp_afn_ulp25:
1516; GCN:       ; %bb.0:
1517; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1518; GCN-NEXT:    v_rcp_f32_e32 v2, v2
1519; GCN-NEXT:    v_rcp_f32_e32 v3, v3
1520; GCN-NEXT:    v_mul_f32_e32 v0, v0, v2
1521; GCN-NEXT:    v_mul_f32_e32 v1, v1, v3
1522; GCN-NEXT:    s_setpc_b64 s[30:31]
1523;
1524; GFX10-LABEL: v_fdiv_v2f32_arcp_afn_ulp25:
1525; GFX10:       ; %bb.0:
1526; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1527; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
1528; GFX10-NEXT:    v_rcp_f32_e32 v2, v2
1529; GFX10-NEXT:    v_rcp_f32_e32 v3, v3
1530; GFX10-NEXT:    v_mul_f32_e32 v0, v0, v2
1531; GFX10-NEXT:    v_mul_f32_e32 v1, v1, v3
1532; GFX10-NEXT:    s_setpc_b64 s[30:31]
1533  %fdiv = fdiv afn arcp <2 x float> %a, %b, !fpmath !0
1534  ret <2 x float> %fdiv
1535}
1536
1537!0 = !{float 2.500000e+00}
1538