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,GFX6 %s
3; RUN: llc -global-isel -march=amdgcn -mcpu=tahiti -denormal-fp-math=preserve-sign -verify-machineinstrs < %s | FileCheck -check-prefixes=GCN,GFX6 %s
4
5; RUN: llc -global-isel -march=amdgcn -mcpu=fiji -denormal-fp-math=ieee -verify-machineinstrs < %s | FileCheck -check-prefixes=GCN,GFX8 %s
6; RUN: llc -global-isel -march=amdgcn -mcpu=fiji -denormal-fp-math=preserve-sign -verify-machineinstrs < %s | FileCheck -check-prefixes=GCN,GFX8 %s
7
8; RUN: llc -global-isel -march=amdgcn -mcpu=gfx900 -denormal-fp-math=ieee -verify-machineinstrs < %s | FileCheck -check-prefixes=GCN,GFX9 %s
9; RUN: llc -global-isel -march=amdgcn -mcpu=gfx900 -denormal-fp-math=preserve-sign -verify-machineinstrs < %s | FileCheck -check-prefixes=GCN,GFX9 %s
10
11; RUN: llc -global-isel -march=amdgcn -mcpu=gfx1010 -denormal-fp-math=ieee -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX10 %s
12; RUN: llc -global-isel -march=amdgcn -mcpu=gfx1010 -denormal-fp-math=preserve-sign -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX10 %s
13
14; RUN: llc -global-isel -march=amdgcn -mcpu=gfx1100 -denormal-fp-math=ieee -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX11 %s
15; RUN: llc -global-isel -march=amdgcn -mcpu=gfx1100 -denormal-fp-math=preserve-sign -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX11 %s
16
17define double @v_fdiv_f64(double %a, double %b) {
18; GFX6-LABEL: v_fdiv_f64:
19; GFX6:       ; %bb.0:
20; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
21; GFX6-NEXT:    v_div_scale_f64 v[4:5], s[4:5], v[2:3], v[2:3], v[0:1]
22; GFX6-NEXT:    v_div_scale_f64 v[10:11], s[4:5], v[0:1], v[2:3], v[0:1]
23; GFX6-NEXT:    v_rcp_f64_e32 v[6:7], v[4:5]
24; GFX6-NEXT:    v_cmp_eq_u32_e64 s[4:5], v3, v5
25; GFX6-NEXT:    v_cmp_eq_u32_e32 vcc, v1, v11
26; GFX6-NEXT:    s_xor_b64 vcc, vcc, s[4:5]
27; GFX6-NEXT:    v_fma_f64 v[8:9], -v[4:5], v[6:7], 1.0
28; GFX6-NEXT:    v_fma_f64 v[6:7], v[6:7], v[8:9], v[6:7]
29; GFX6-NEXT:    v_fma_f64 v[8:9], -v[4:5], v[6:7], 1.0
30; GFX6-NEXT:    v_fma_f64 v[6:7], v[6:7], v[8:9], v[6:7]
31; GFX6-NEXT:    v_mul_f64 v[8:9], v[10:11], v[6:7]
32; GFX6-NEXT:    v_fma_f64 v[4:5], -v[4:5], v[8:9], v[10:11]
33; GFX6-NEXT:    v_div_fmas_f64 v[4:5], v[4:5], v[6:7], v[8:9]
34; GFX6-NEXT:    v_div_fixup_f64 v[0:1], v[4:5], v[2:3], v[0:1]
35; GFX6-NEXT:    s_setpc_b64 s[30:31]
36;
37; GFX8-LABEL: v_fdiv_f64:
38; GFX8:       ; %bb.0:
39; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
40; GFX8-NEXT:    v_div_scale_f64 v[4:5], s[4:5], v[2:3], v[2:3], v[0:1]
41; GFX8-NEXT:    v_rcp_f64_e32 v[6:7], v[4:5]
42; GFX8-NEXT:    v_fma_f64 v[8:9], -v[4:5], v[6:7], 1.0
43; GFX8-NEXT:    v_fma_f64 v[6:7], v[6:7], v[8:9], v[6:7]
44; GFX8-NEXT:    v_div_scale_f64 v[8:9], vcc, v[0:1], v[2:3], v[0:1]
45; GFX8-NEXT:    v_fma_f64 v[10:11], -v[4:5], v[6:7], 1.0
46; GFX8-NEXT:    v_fma_f64 v[6:7], v[6:7], v[10:11], v[6:7]
47; GFX8-NEXT:    v_mul_f64 v[10:11], v[8:9], v[6:7]
48; GFX8-NEXT:    v_fma_f64 v[4:5], -v[4:5], v[10:11], v[8:9]
49; GFX8-NEXT:    v_div_fmas_f64 v[4:5], v[4:5], v[6:7], v[10:11]
50; GFX8-NEXT:    v_div_fixup_f64 v[0:1], v[4:5], v[2:3], v[0:1]
51; GFX8-NEXT:    s_setpc_b64 s[30:31]
52;
53; GFX9-LABEL: v_fdiv_f64:
54; GFX9:       ; %bb.0:
55; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
56; GFX9-NEXT:    v_div_scale_f64 v[4:5], s[4:5], v[2:3], v[2:3], v[0:1]
57; GFX9-NEXT:    v_rcp_f64_e32 v[6:7], v[4:5]
58; GFX9-NEXT:    v_fma_f64 v[8:9], -v[4:5], v[6:7], 1.0
59; GFX9-NEXT:    v_fma_f64 v[6:7], v[6:7], v[8:9], v[6:7]
60; GFX9-NEXT:    v_div_scale_f64 v[8:9], vcc, v[0:1], v[2:3], v[0:1]
61; GFX9-NEXT:    v_fma_f64 v[10:11], -v[4:5], v[6:7], 1.0
62; GFX9-NEXT:    v_fma_f64 v[6:7], v[6:7], v[10:11], v[6:7]
63; GFX9-NEXT:    v_mul_f64 v[10:11], v[8:9], v[6:7]
64; GFX9-NEXT:    v_fma_f64 v[4:5], -v[4:5], v[10:11], v[8:9]
65; GFX9-NEXT:    v_div_fmas_f64 v[4:5], v[4:5], v[6:7], v[10:11]
66; GFX9-NEXT:    v_div_fixup_f64 v[0:1], v[4:5], v[2:3], v[0:1]
67; GFX9-NEXT:    s_setpc_b64 s[30:31]
68;
69; GFX10-LABEL: v_fdiv_f64:
70; GFX10:       ; %bb.0:
71; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
72; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
73; GFX10-NEXT:    v_div_scale_f64 v[4:5], s4, v[2:3], v[2:3], v[0:1]
74; GFX10-NEXT:    v_div_scale_f64 v[10:11], vcc_lo, v[0:1], v[2:3], v[0:1]
75; GFX10-NEXT:    v_rcp_f64_e32 v[6:7], v[4:5]
76; GFX10-NEXT:    v_fma_f64 v[8:9], -v[4:5], v[6:7], 1.0
77; GFX10-NEXT:    v_fma_f64 v[6:7], v[6:7], v[8:9], v[6:7]
78; GFX10-NEXT:    v_fma_f64 v[8:9], -v[4:5], v[6:7], 1.0
79; GFX10-NEXT:    v_fma_f64 v[6:7], v[6:7], v[8:9], v[6:7]
80; GFX10-NEXT:    v_mul_f64 v[8:9], v[10:11], v[6:7]
81; GFX10-NEXT:    v_fma_f64 v[4:5], -v[4:5], v[8:9], v[10:11]
82; GFX10-NEXT:    v_div_fmas_f64 v[4:5], v[4:5], v[6:7], v[8:9]
83; GFX10-NEXT:    v_div_fixup_f64 v[0:1], v[4:5], v[2:3], v[0:1]
84; GFX10-NEXT:    s_setpc_b64 s[30:31]
85;
86; GFX11-LABEL: v_fdiv_f64:
87; GFX11:       ; %bb.0:
88; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
89; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
90; GFX11-NEXT:    v_div_scale_f64 v[4:5], null, v[2:3], v[2:3], v[0:1]
91; GFX11-NEXT:    v_div_scale_f64 v[10:11], vcc_lo, v[0:1], v[2:3], v[0:1]
92; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_2) | instid1(VALU_DEP_1)
93; GFX11-NEXT:    v_rcp_f64_e32 v[6:7], v[4:5]
94; GFX11-NEXT:    s_waitcnt_depctr 0xfff
95; GFX11-NEXT:    v_fma_f64 v[8:9], -v[4:5], v[6:7], 1.0
96; GFX11-NEXT:    v_fma_f64 v[6:7], v[6:7], v[8:9], v[6:7]
97; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
98; GFX11-NEXT:    v_fma_f64 v[8:9], -v[4:5], v[6:7], 1.0
99; GFX11-NEXT:    v_fma_f64 v[6:7], v[6:7], v[8:9], v[6:7]
100; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
101; GFX11-NEXT:    v_mul_f64 v[8:9], v[10:11], v[6:7]
102; GFX11-NEXT:    v_fma_f64 v[4:5], -v[4:5], v[8:9], v[10:11]
103; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
104; GFX11-NEXT:    v_div_fmas_f64 v[4:5], v[4:5], v[6:7], v[8:9]
105; GFX11-NEXT:    v_div_fixup_f64 v[0:1], v[4:5], v[2:3], v[0:1]
106; GFX11-NEXT:    s_setpc_b64 s[30:31]
107  %fdiv = fdiv double %a, %b
108  ret double %fdiv
109}
110
111define double @v_fdiv_f64_afn(double %a, double %b) {
112; GCN-LABEL: v_fdiv_f64_afn:
113; GCN:       ; %bb.0:
114; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
115; GCN-NEXT:    v_rcp_f64_e32 v[4:5], v[2:3]
116; GCN-NEXT:    v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
117; GCN-NEXT:    v_fma_f64 v[4:5], v[6:7], v[4:5], v[4:5]
118; GCN-NEXT:    v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
119; GCN-NEXT:    v_fma_f64 v[4:5], v[6:7], v[4:5], v[4:5]
120; GCN-NEXT:    v_mul_f64 v[6:7], v[0:1], v[4:5]
121; GCN-NEXT:    v_fma_f64 v[0:1], -v[2:3], v[6:7], v[0:1]
122; GCN-NEXT:    v_fma_f64 v[0:1], v[0:1], v[4:5], v[6:7]
123; GCN-NEXT:    s_setpc_b64 s[30:31]
124;
125; GFX10-LABEL: v_fdiv_f64_afn:
126; GFX10:       ; %bb.0:
127; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
128; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
129; GFX10-NEXT:    v_rcp_f64_e32 v[4:5], v[2:3]
130; GFX10-NEXT:    v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
131; GFX10-NEXT:    v_fma_f64 v[4:5], v[6:7], v[4:5], v[4:5]
132; GFX10-NEXT:    v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
133; GFX10-NEXT:    v_fma_f64 v[4:5], v[6:7], v[4:5], v[4:5]
134; GFX10-NEXT:    v_mul_f64 v[6:7], v[0:1], v[4:5]
135; GFX10-NEXT:    v_fma_f64 v[0:1], -v[2:3], v[6:7], v[0:1]
136; GFX10-NEXT:    v_fma_f64 v[0:1], v[0:1], v[4:5], v[6:7]
137; GFX10-NEXT:    s_setpc_b64 s[30:31]
138;
139; GFX11-LABEL: v_fdiv_f64_afn:
140; GFX11:       ; %bb.0:
141; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
142; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
143; GFX11-NEXT:    v_rcp_f64_e32 v[4:5], v[2:3]
144; GFX11-NEXT:    s_waitcnt_depctr 0xfff
145; GFX11-NEXT:    v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
146; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
147; GFX11-NEXT:    v_fma_f64 v[4:5], v[6:7], v[4:5], v[4:5]
148; GFX11-NEXT:    v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
149; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
150; GFX11-NEXT:    v_fma_f64 v[4:5], v[6:7], v[4:5], v[4:5]
151; GFX11-NEXT:    v_mul_f64 v[6:7], v[0:1], v[4:5]
152; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
153; GFX11-NEXT:    v_fma_f64 v[0:1], -v[2:3], v[6:7], v[0:1]
154; GFX11-NEXT:    v_fma_f64 v[0:1], v[0:1], v[4:5], v[6:7]
155; GFX11-NEXT:    s_setpc_b64 s[30:31]
156  %fdiv = fdiv afn double %a, %b
157  ret double %fdiv
158}
159
160define double @v_fdiv_f64_ulp25(double %a, double %b) {
161; GFX6-LABEL: v_fdiv_f64_ulp25:
162; GFX6:       ; %bb.0:
163; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
164; GFX6-NEXT:    v_div_scale_f64 v[4:5], s[4:5], v[2:3], v[2:3], v[0:1]
165; GFX6-NEXT:    v_div_scale_f64 v[10:11], s[4:5], v[0:1], v[2:3], v[0:1]
166; GFX6-NEXT:    v_rcp_f64_e32 v[6:7], v[4:5]
167; GFX6-NEXT:    v_cmp_eq_u32_e64 s[4:5], v3, v5
168; GFX6-NEXT:    v_cmp_eq_u32_e32 vcc, v1, v11
169; GFX6-NEXT:    s_xor_b64 vcc, vcc, s[4:5]
170; GFX6-NEXT:    v_fma_f64 v[8:9], -v[4:5], v[6:7], 1.0
171; GFX6-NEXT:    v_fma_f64 v[6:7], v[6:7], v[8:9], v[6:7]
172; GFX6-NEXT:    v_fma_f64 v[8:9], -v[4:5], v[6:7], 1.0
173; GFX6-NEXT:    v_fma_f64 v[6:7], v[6:7], v[8:9], v[6:7]
174; GFX6-NEXT:    v_mul_f64 v[8:9], v[10:11], v[6:7]
175; GFX6-NEXT:    v_fma_f64 v[4:5], -v[4:5], v[8:9], v[10:11]
176; GFX6-NEXT:    v_div_fmas_f64 v[4:5], v[4:5], v[6:7], v[8:9]
177; GFX6-NEXT:    v_div_fixup_f64 v[0:1], v[4:5], v[2:3], v[0:1]
178; GFX6-NEXT:    s_setpc_b64 s[30:31]
179;
180; GFX8-LABEL: v_fdiv_f64_ulp25:
181; GFX8:       ; %bb.0:
182; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
183; GFX8-NEXT:    v_div_scale_f64 v[4:5], s[4:5], v[2:3], v[2:3], v[0:1]
184; GFX8-NEXT:    v_rcp_f64_e32 v[6:7], v[4:5]
185; GFX8-NEXT:    v_fma_f64 v[8:9], -v[4:5], v[6:7], 1.0
186; GFX8-NEXT:    v_fma_f64 v[6:7], v[6:7], v[8:9], v[6:7]
187; GFX8-NEXT:    v_div_scale_f64 v[8:9], vcc, v[0:1], v[2:3], v[0:1]
188; GFX8-NEXT:    v_fma_f64 v[10:11], -v[4:5], v[6:7], 1.0
189; GFX8-NEXT:    v_fma_f64 v[6:7], v[6:7], v[10:11], v[6:7]
190; GFX8-NEXT:    v_mul_f64 v[10:11], v[8:9], v[6:7]
191; GFX8-NEXT:    v_fma_f64 v[4:5], -v[4:5], v[10:11], v[8:9]
192; GFX8-NEXT:    v_div_fmas_f64 v[4:5], v[4:5], v[6:7], v[10:11]
193; GFX8-NEXT:    v_div_fixup_f64 v[0:1], v[4:5], v[2:3], v[0:1]
194; GFX8-NEXT:    s_setpc_b64 s[30:31]
195;
196; GFX9-LABEL: v_fdiv_f64_ulp25:
197; GFX9:       ; %bb.0:
198; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
199; GFX9-NEXT:    v_div_scale_f64 v[4:5], s[4:5], v[2:3], v[2:3], v[0:1]
200; GFX9-NEXT:    v_rcp_f64_e32 v[6:7], v[4:5]
201; GFX9-NEXT:    v_fma_f64 v[8:9], -v[4:5], v[6:7], 1.0
202; GFX9-NEXT:    v_fma_f64 v[6:7], v[6:7], v[8:9], v[6:7]
203; GFX9-NEXT:    v_div_scale_f64 v[8:9], vcc, v[0:1], v[2:3], v[0:1]
204; GFX9-NEXT:    v_fma_f64 v[10:11], -v[4:5], v[6:7], 1.0
205; GFX9-NEXT:    v_fma_f64 v[6:7], v[6:7], v[10:11], v[6:7]
206; GFX9-NEXT:    v_mul_f64 v[10:11], v[8:9], v[6:7]
207; GFX9-NEXT:    v_fma_f64 v[4:5], -v[4:5], v[10:11], v[8:9]
208; GFX9-NEXT:    v_div_fmas_f64 v[4:5], v[4:5], v[6:7], v[10:11]
209; GFX9-NEXT:    v_div_fixup_f64 v[0:1], v[4:5], v[2:3], v[0:1]
210; GFX9-NEXT:    s_setpc_b64 s[30:31]
211;
212; GFX10-LABEL: v_fdiv_f64_ulp25:
213; GFX10:       ; %bb.0:
214; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
215; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
216; GFX10-NEXT:    v_div_scale_f64 v[4:5], s4, v[2:3], v[2:3], v[0:1]
217; GFX10-NEXT:    v_div_scale_f64 v[10:11], vcc_lo, v[0:1], v[2:3], v[0:1]
218; GFX10-NEXT:    v_rcp_f64_e32 v[6:7], v[4:5]
219; GFX10-NEXT:    v_fma_f64 v[8:9], -v[4:5], v[6:7], 1.0
220; GFX10-NEXT:    v_fma_f64 v[6:7], v[6:7], v[8:9], v[6:7]
221; GFX10-NEXT:    v_fma_f64 v[8:9], -v[4:5], v[6:7], 1.0
222; GFX10-NEXT:    v_fma_f64 v[6:7], v[6:7], v[8:9], v[6:7]
223; GFX10-NEXT:    v_mul_f64 v[8:9], v[10:11], v[6:7]
224; GFX10-NEXT:    v_fma_f64 v[4:5], -v[4:5], v[8:9], v[10:11]
225; GFX10-NEXT:    v_div_fmas_f64 v[4:5], v[4:5], v[6:7], v[8:9]
226; GFX10-NEXT:    v_div_fixup_f64 v[0:1], v[4:5], v[2:3], v[0:1]
227; GFX10-NEXT:    s_setpc_b64 s[30:31]
228;
229; GFX11-LABEL: v_fdiv_f64_ulp25:
230; GFX11:       ; %bb.0:
231; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
232; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
233; GFX11-NEXT:    v_div_scale_f64 v[4:5], null, v[2:3], v[2:3], v[0:1]
234; GFX11-NEXT:    v_div_scale_f64 v[10:11], vcc_lo, v[0:1], v[2:3], v[0:1]
235; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_2) | instid1(VALU_DEP_1)
236; GFX11-NEXT:    v_rcp_f64_e32 v[6:7], v[4:5]
237; GFX11-NEXT:    s_waitcnt_depctr 0xfff
238; GFX11-NEXT:    v_fma_f64 v[8:9], -v[4:5], v[6:7], 1.0
239; GFX11-NEXT:    v_fma_f64 v[6:7], v[6:7], v[8:9], v[6:7]
240; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
241; GFX11-NEXT:    v_fma_f64 v[8:9], -v[4:5], v[6:7], 1.0
242; GFX11-NEXT:    v_fma_f64 v[6:7], v[6:7], v[8:9], v[6:7]
243; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
244; GFX11-NEXT:    v_mul_f64 v[8:9], v[10:11], v[6:7]
245; GFX11-NEXT:    v_fma_f64 v[4:5], -v[4:5], v[8:9], v[10:11]
246; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
247; GFX11-NEXT:    v_div_fmas_f64 v[4:5], v[4:5], v[6:7], v[8:9]
248; GFX11-NEXT:    v_div_fixup_f64 v[0:1], v[4:5], v[2:3], v[0:1]
249; GFX11-NEXT:    s_setpc_b64 s[30:31]
250  %fdiv = fdiv double %a, %b, !fpmath !0
251  ret double %fdiv
252}
253
254define double @v_rcp_f64(double %x) {
255; GFX6-LABEL: v_rcp_f64:
256; GFX6:       ; %bb.0:
257; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
258; GFX6-NEXT:    v_div_scale_f64 v[2:3], s[4:5], v[0:1], v[0:1], 1.0
259; GFX6-NEXT:    v_div_scale_f64 v[8:9], s[4:5], 1.0, v[0:1], 1.0
260; GFX6-NEXT:    v_rcp_f64_e32 v[4:5], v[2:3]
261; GFX6-NEXT:    v_mov_b32_e32 v10, 0x3ff00000
262; GFX6-NEXT:    v_cmp_eq_u32_e32 vcc, v10, v9
263; GFX6-NEXT:    v_cmp_eq_u32_e64 s[4:5], v1, v3
264; GFX6-NEXT:    v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
265; GFX6-NEXT:    s_xor_b64 vcc, vcc, s[4:5]
266; GFX6-NEXT:    v_fma_f64 v[4:5], v[4:5], v[6:7], v[4:5]
267; GFX6-NEXT:    v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
268; GFX6-NEXT:    v_fma_f64 v[4:5], v[4:5], v[6:7], v[4:5]
269; GFX6-NEXT:    v_mul_f64 v[6:7], v[8:9], v[4:5]
270; GFX6-NEXT:    v_fma_f64 v[2:3], -v[2:3], v[6:7], v[8:9]
271; GFX6-NEXT:    v_div_fmas_f64 v[2:3], v[2:3], v[4:5], v[6:7]
272; GFX6-NEXT:    v_div_fixup_f64 v[0:1], v[2:3], v[0:1], 1.0
273; GFX6-NEXT:    s_setpc_b64 s[30:31]
274;
275; GFX8-LABEL: v_rcp_f64:
276; GFX8:       ; %bb.0:
277; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
278; GFX8-NEXT:    v_div_scale_f64 v[2:3], s[4:5], v[0:1], v[0:1], 1.0
279; GFX8-NEXT:    v_rcp_f64_e32 v[4:5], v[2:3]
280; GFX8-NEXT:    v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
281; GFX8-NEXT:    v_fma_f64 v[4:5], v[4:5], v[6:7], v[4:5]
282; GFX8-NEXT:    v_div_scale_f64 v[6:7], vcc, 1.0, v[0:1], 1.0
283; GFX8-NEXT:    v_fma_f64 v[8:9], -v[2:3], v[4:5], 1.0
284; GFX8-NEXT:    v_fma_f64 v[4:5], v[4:5], v[8:9], v[4:5]
285; GFX8-NEXT:    v_mul_f64 v[8:9], v[6:7], v[4:5]
286; GFX8-NEXT:    v_fma_f64 v[2:3], -v[2:3], v[8:9], v[6:7]
287; GFX8-NEXT:    v_div_fmas_f64 v[2:3], v[2:3], v[4:5], v[8:9]
288; GFX8-NEXT:    v_div_fixup_f64 v[0:1], v[2:3], v[0:1], 1.0
289; GFX8-NEXT:    s_setpc_b64 s[30:31]
290;
291; GFX9-LABEL: v_rcp_f64:
292; GFX9:       ; %bb.0:
293; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
294; GFX9-NEXT:    v_div_scale_f64 v[2:3], s[4:5], v[0:1], v[0:1], 1.0
295; GFX9-NEXT:    v_rcp_f64_e32 v[4:5], v[2:3]
296; GFX9-NEXT:    v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
297; GFX9-NEXT:    v_fma_f64 v[4:5], v[4:5], v[6:7], v[4:5]
298; GFX9-NEXT:    v_div_scale_f64 v[6:7], vcc, 1.0, v[0:1], 1.0
299; GFX9-NEXT:    v_fma_f64 v[8:9], -v[2:3], v[4:5], 1.0
300; GFX9-NEXT:    v_fma_f64 v[4:5], v[4:5], v[8:9], v[4:5]
301; GFX9-NEXT:    v_mul_f64 v[8:9], v[6:7], v[4:5]
302; GFX9-NEXT:    v_fma_f64 v[2:3], -v[2:3], v[8:9], v[6:7]
303; GFX9-NEXT:    v_div_fmas_f64 v[2:3], v[2:3], v[4:5], v[8:9]
304; GFX9-NEXT:    v_div_fixup_f64 v[0:1], v[2:3], v[0:1], 1.0
305; GFX9-NEXT:    s_setpc_b64 s[30:31]
306;
307; GFX10-LABEL: v_rcp_f64:
308; GFX10:       ; %bb.0:
309; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
310; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
311; GFX10-NEXT:    v_div_scale_f64 v[2:3], s4, v[0:1], v[0:1], 1.0
312; GFX10-NEXT:    v_div_scale_f64 v[8:9], vcc_lo, 1.0, v[0:1], 1.0
313; GFX10-NEXT:    v_rcp_f64_e32 v[4:5], v[2:3]
314; GFX10-NEXT:    v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
315; GFX10-NEXT:    v_fma_f64 v[4:5], v[4:5], v[6:7], v[4:5]
316; GFX10-NEXT:    v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
317; GFX10-NEXT:    v_fma_f64 v[4:5], v[4:5], v[6:7], v[4:5]
318; GFX10-NEXT:    v_mul_f64 v[6:7], v[8:9], v[4:5]
319; GFX10-NEXT:    v_fma_f64 v[2:3], -v[2:3], v[6:7], v[8:9]
320; GFX10-NEXT:    v_div_fmas_f64 v[2:3], v[2:3], v[4:5], v[6:7]
321; GFX10-NEXT:    v_div_fixup_f64 v[0:1], v[2:3], v[0:1], 1.0
322; GFX10-NEXT:    s_setpc_b64 s[30:31]
323;
324; GFX11-LABEL: v_rcp_f64:
325; GFX11:       ; %bb.0:
326; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
327; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
328; GFX11-NEXT:    v_div_scale_f64 v[2:3], null, v[0:1], v[0:1], 1.0
329; GFX11-NEXT:    v_div_scale_f64 v[8:9], vcc_lo, 1.0, v[0:1], 1.0
330; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_2) | instid1(VALU_DEP_1)
331; GFX11-NEXT:    v_rcp_f64_e32 v[4:5], v[2:3]
332; GFX11-NEXT:    s_waitcnt_depctr 0xfff
333; GFX11-NEXT:    v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
334; GFX11-NEXT:    v_fma_f64 v[4:5], v[4:5], v[6:7], v[4:5]
335; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
336; GFX11-NEXT:    v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
337; GFX11-NEXT:    v_fma_f64 v[4:5], v[4:5], v[6:7], v[4:5]
338; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
339; GFX11-NEXT:    v_mul_f64 v[6:7], v[8:9], v[4:5]
340; GFX11-NEXT:    v_fma_f64 v[2:3], -v[2:3], v[6:7], v[8:9]
341; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
342; GFX11-NEXT:    v_div_fmas_f64 v[2:3], v[2:3], v[4:5], v[6:7]
343; GFX11-NEXT:    v_div_fixup_f64 v[0:1], v[2:3], v[0:1], 1.0
344; GFX11-NEXT:    s_setpc_b64 s[30:31]
345  %fdiv = fdiv double 1.0, %x
346  ret double %fdiv
347}
348
349define double @v_rcp_f64_arcp(double %x) {
350; GFX6-LABEL: v_rcp_f64_arcp:
351; GFX6:       ; %bb.0:
352; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
353; GFX6-NEXT:    v_div_scale_f64 v[2:3], s[4:5], v[0:1], v[0:1], 1.0
354; GFX6-NEXT:    v_div_scale_f64 v[8:9], s[4:5], 1.0, v[0:1], 1.0
355; GFX6-NEXT:    v_rcp_f64_e32 v[4:5], v[2:3]
356; GFX6-NEXT:    v_mov_b32_e32 v10, 0x3ff00000
357; GFX6-NEXT:    v_cmp_eq_u32_e32 vcc, v10, v9
358; GFX6-NEXT:    v_cmp_eq_u32_e64 s[4:5], v1, v3
359; GFX6-NEXT:    v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
360; GFX6-NEXT:    s_xor_b64 vcc, vcc, s[4:5]
361; GFX6-NEXT:    v_fma_f64 v[4:5], v[4:5], v[6:7], v[4:5]
362; GFX6-NEXT:    v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
363; GFX6-NEXT:    v_fma_f64 v[4:5], v[4:5], v[6:7], v[4:5]
364; GFX6-NEXT:    v_mul_f64 v[6:7], v[8:9], v[4:5]
365; GFX6-NEXT:    v_fma_f64 v[2:3], -v[2:3], v[6:7], v[8:9]
366; GFX6-NEXT:    v_div_fmas_f64 v[2:3], v[2:3], v[4:5], v[6:7]
367; GFX6-NEXT:    v_div_fixup_f64 v[0:1], v[2:3], v[0:1], 1.0
368; GFX6-NEXT:    s_setpc_b64 s[30:31]
369;
370; GFX8-LABEL: v_rcp_f64_arcp:
371; GFX8:       ; %bb.0:
372; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
373; GFX8-NEXT:    v_div_scale_f64 v[2:3], s[4:5], v[0:1], v[0:1], 1.0
374; GFX8-NEXT:    v_rcp_f64_e32 v[4:5], v[2:3]
375; GFX8-NEXT:    v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
376; GFX8-NEXT:    v_fma_f64 v[4:5], v[4:5], v[6:7], v[4:5]
377; GFX8-NEXT:    v_div_scale_f64 v[6:7], vcc, 1.0, v[0:1], 1.0
378; GFX8-NEXT:    v_fma_f64 v[8:9], -v[2:3], v[4:5], 1.0
379; GFX8-NEXT:    v_fma_f64 v[4:5], v[4:5], v[8:9], v[4:5]
380; GFX8-NEXT:    v_mul_f64 v[8:9], v[6:7], v[4:5]
381; GFX8-NEXT:    v_fma_f64 v[2:3], -v[2:3], v[8:9], v[6:7]
382; GFX8-NEXT:    v_div_fmas_f64 v[2:3], v[2:3], v[4:5], v[8:9]
383; GFX8-NEXT:    v_div_fixup_f64 v[0:1], v[2:3], v[0:1], 1.0
384; GFX8-NEXT:    s_setpc_b64 s[30:31]
385;
386; GFX9-LABEL: v_rcp_f64_arcp:
387; GFX9:       ; %bb.0:
388; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
389; GFX9-NEXT:    v_div_scale_f64 v[2:3], s[4:5], v[0:1], v[0:1], 1.0
390; GFX9-NEXT:    v_rcp_f64_e32 v[4:5], v[2:3]
391; GFX9-NEXT:    v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
392; GFX9-NEXT:    v_fma_f64 v[4:5], v[4:5], v[6:7], v[4:5]
393; GFX9-NEXT:    v_div_scale_f64 v[6:7], vcc, 1.0, v[0:1], 1.0
394; GFX9-NEXT:    v_fma_f64 v[8:9], -v[2:3], v[4:5], 1.0
395; GFX9-NEXT:    v_fma_f64 v[4:5], v[4:5], v[8:9], v[4:5]
396; GFX9-NEXT:    v_mul_f64 v[8:9], v[6:7], v[4:5]
397; GFX9-NEXT:    v_fma_f64 v[2:3], -v[2:3], v[8:9], v[6:7]
398; GFX9-NEXT:    v_div_fmas_f64 v[2:3], v[2:3], v[4:5], v[8:9]
399; GFX9-NEXT:    v_div_fixup_f64 v[0:1], v[2:3], v[0:1], 1.0
400; GFX9-NEXT:    s_setpc_b64 s[30:31]
401;
402; GFX10-LABEL: v_rcp_f64_arcp:
403; GFX10:       ; %bb.0:
404; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
405; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
406; GFX10-NEXT:    v_div_scale_f64 v[2:3], s4, v[0:1], v[0:1], 1.0
407; GFX10-NEXT:    v_div_scale_f64 v[8:9], vcc_lo, 1.0, v[0:1], 1.0
408; GFX10-NEXT:    v_rcp_f64_e32 v[4:5], v[2:3]
409; GFX10-NEXT:    v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
410; GFX10-NEXT:    v_fma_f64 v[4:5], v[4:5], v[6:7], v[4:5]
411; GFX10-NEXT:    v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
412; GFX10-NEXT:    v_fma_f64 v[4:5], v[4:5], v[6:7], v[4:5]
413; GFX10-NEXT:    v_mul_f64 v[6:7], v[8:9], v[4:5]
414; GFX10-NEXT:    v_fma_f64 v[2:3], -v[2:3], v[6:7], v[8:9]
415; GFX10-NEXT:    v_div_fmas_f64 v[2:3], v[2:3], v[4:5], v[6:7]
416; GFX10-NEXT:    v_div_fixup_f64 v[0:1], v[2:3], v[0:1], 1.0
417; GFX10-NEXT:    s_setpc_b64 s[30:31]
418;
419; GFX11-LABEL: v_rcp_f64_arcp:
420; GFX11:       ; %bb.0:
421; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
422; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
423; GFX11-NEXT:    v_div_scale_f64 v[2:3], null, v[0:1], v[0:1], 1.0
424; GFX11-NEXT:    v_div_scale_f64 v[8:9], vcc_lo, 1.0, v[0:1], 1.0
425; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_2) | instid1(VALU_DEP_1)
426; GFX11-NEXT:    v_rcp_f64_e32 v[4:5], v[2:3]
427; GFX11-NEXT:    s_waitcnt_depctr 0xfff
428; GFX11-NEXT:    v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
429; GFX11-NEXT:    v_fma_f64 v[4:5], v[4:5], v[6:7], v[4:5]
430; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
431; GFX11-NEXT:    v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
432; GFX11-NEXT:    v_fma_f64 v[4:5], v[4:5], v[6:7], v[4:5]
433; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
434; GFX11-NEXT:    v_mul_f64 v[6:7], v[8:9], v[4:5]
435; GFX11-NEXT:    v_fma_f64 v[2:3], -v[2:3], v[6:7], v[8:9]
436; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
437; GFX11-NEXT:    v_div_fmas_f64 v[2:3], v[2:3], v[4:5], v[6:7]
438; GFX11-NEXT:    v_div_fixup_f64 v[0:1], v[2:3], v[0:1], 1.0
439; GFX11-NEXT:    s_setpc_b64 s[30:31]
440  %fdiv = fdiv arcp double 1.0, %x
441  ret double %fdiv
442}
443
444define double @v_rcp_f64_arcp_afn(double %x) {
445; GCN-LABEL: v_rcp_f64_arcp_afn:
446; GCN:       ; %bb.0:
447; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
448; GCN-NEXT:    v_rcp_f64_e32 v[2:3], v[0:1]
449; GCN-NEXT:    v_fma_f64 v[4:5], -v[0:1], v[2:3], 1.0
450; GCN-NEXT:    v_fma_f64 v[2:3], v[4:5], v[2:3], v[2:3]
451; GCN-NEXT:    v_fma_f64 v[4:5], -v[0:1], v[2:3], 1.0
452; GCN-NEXT:    v_fma_f64 v[2:3], v[4:5], v[2:3], v[2:3]
453; GCN-NEXT:    v_mul_f64 v[4:5], 1.0, v[2:3]
454; GCN-NEXT:    v_fma_f64 v[0:1], -v[0:1], v[4:5], 1.0
455; GCN-NEXT:    v_fma_f64 v[0:1], v[0:1], v[2:3], v[4:5]
456; GCN-NEXT:    s_setpc_b64 s[30:31]
457;
458; GFX10-LABEL: v_rcp_f64_arcp_afn:
459; GFX10:       ; %bb.0:
460; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
461; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
462; GFX10-NEXT:    v_rcp_f64_e32 v[2:3], v[0:1]
463; GFX10-NEXT:    v_fma_f64 v[4:5], -v[0:1], v[2:3], 1.0
464; GFX10-NEXT:    v_fma_f64 v[2:3], v[4:5], v[2:3], v[2:3]
465; GFX10-NEXT:    v_fma_f64 v[4:5], -v[0:1], v[2:3], 1.0
466; GFX10-NEXT:    v_fma_f64 v[2:3], v[4:5], v[2:3], v[2:3]
467; GFX10-NEXT:    v_mul_f64 v[4:5], 1.0, v[2:3]
468; GFX10-NEXT:    v_fma_f64 v[0:1], -v[0:1], v[4:5], 1.0
469; GFX10-NEXT:    v_fma_f64 v[0:1], v[0:1], v[2:3], v[4:5]
470; GFX10-NEXT:    s_setpc_b64 s[30:31]
471;
472; GFX11-LABEL: v_rcp_f64_arcp_afn:
473; GFX11:       ; %bb.0:
474; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
475; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
476; GFX11-NEXT:    v_rcp_f64_e32 v[2:3], v[0:1]
477; GFX11-NEXT:    s_waitcnt_depctr 0xfff
478; GFX11-NEXT:    v_fma_f64 v[4:5], -v[0:1], v[2:3], 1.0
479; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
480; GFX11-NEXT:    v_fma_f64 v[2:3], v[4:5], v[2:3], v[2:3]
481; GFX11-NEXT:    v_fma_f64 v[4:5], -v[0:1], v[2:3], 1.0
482; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
483; GFX11-NEXT:    v_fma_f64 v[2:3], v[4:5], v[2:3], v[2:3]
484; GFX11-NEXT:    v_mul_f64 v[4:5], 1.0, v[2:3]
485; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
486; GFX11-NEXT:    v_fma_f64 v[0:1], -v[0:1], v[4:5], 1.0
487; GFX11-NEXT:    v_fma_f64 v[0:1], v[0:1], v[2:3], v[4:5]
488; GFX11-NEXT:    s_setpc_b64 s[30:31]
489  %fdiv = fdiv arcp afn double 1.0, %x
490  ret double %fdiv
491}
492
493define double @v_rcp_f64_ulp25(double %x) {
494; GFX6-LABEL: v_rcp_f64_ulp25:
495; GFX6:       ; %bb.0:
496; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
497; GFX6-NEXT:    v_div_scale_f64 v[2:3], s[4:5], v[0:1], v[0:1], 1.0
498; GFX6-NEXT:    v_div_scale_f64 v[8:9], s[4:5], 1.0, v[0:1], 1.0
499; GFX6-NEXT:    v_rcp_f64_e32 v[4:5], v[2:3]
500; GFX6-NEXT:    v_mov_b32_e32 v10, 0x3ff00000
501; GFX6-NEXT:    v_cmp_eq_u32_e32 vcc, v10, v9
502; GFX6-NEXT:    v_cmp_eq_u32_e64 s[4:5], v1, v3
503; GFX6-NEXT:    v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
504; GFX6-NEXT:    s_xor_b64 vcc, vcc, s[4:5]
505; GFX6-NEXT:    v_fma_f64 v[4:5], v[4:5], v[6:7], v[4:5]
506; GFX6-NEXT:    v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
507; GFX6-NEXT:    v_fma_f64 v[4:5], v[4:5], v[6:7], v[4:5]
508; GFX6-NEXT:    v_mul_f64 v[6:7], v[8:9], v[4:5]
509; GFX6-NEXT:    v_fma_f64 v[2:3], -v[2:3], v[6:7], v[8:9]
510; GFX6-NEXT:    v_div_fmas_f64 v[2:3], v[2:3], v[4:5], v[6:7]
511; GFX6-NEXT:    v_div_fixup_f64 v[0:1], v[2:3], v[0:1], 1.0
512; GFX6-NEXT:    s_setpc_b64 s[30:31]
513;
514; GFX8-LABEL: v_rcp_f64_ulp25:
515; GFX8:       ; %bb.0:
516; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
517; GFX8-NEXT:    v_div_scale_f64 v[2:3], s[4:5], v[0:1], v[0:1], 1.0
518; GFX8-NEXT:    v_rcp_f64_e32 v[4:5], v[2:3]
519; GFX8-NEXT:    v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
520; GFX8-NEXT:    v_fma_f64 v[4:5], v[4:5], v[6:7], v[4:5]
521; GFX8-NEXT:    v_div_scale_f64 v[6:7], vcc, 1.0, v[0:1], 1.0
522; GFX8-NEXT:    v_fma_f64 v[8:9], -v[2:3], v[4:5], 1.0
523; GFX8-NEXT:    v_fma_f64 v[4:5], v[4:5], v[8:9], v[4:5]
524; GFX8-NEXT:    v_mul_f64 v[8:9], v[6:7], v[4:5]
525; GFX8-NEXT:    v_fma_f64 v[2:3], -v[2:3], v[8:9], v[6:7]
526; GFX8-NEXT:    v_div_fmas_f64 v[2:3], v[2:3], v[4:5], v[8:9]
527; GFX8-NEXT:    v_div_fixup_f64 v[0:1], v[2:3], v[0:1], 1.0
528; GFX8-NEXT:    s_setpc_b64 s[30:31]
529;
530; GFX9-LABEL: v_rcp_f64_ulp25:
531; GFX9:       ; %bb.0:
532; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
533; GFX9-NEXT:    v_div_scale_f64 v[2:3], s[4:5], v[0:1], v[0:1], 1.0
534; GFX9-NEXT:    v_rcp_f64_e32 v[4:5], v[2:3]
535; GFX9-NEXT:    v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
536; GFX9-NEXT:    v_fma_f64 v[4:5], v[4:5], v[6:7], v[4:5]
537; GFX9-NEXT:    v_div_scale_f64 v[6:7], vcc, 1.0, v[0:1], 1.0
538; GFX9-NEXT:    v_fma_f64 v[8:9], -v[2:3], v[4:5], 1.0
539; GFX9-NEXT:    v_fma_f64 v[4:5], v[4:5], v[8:9], v[4:5]
540; GFX9-NEXT:    v_mul_f64 v[8:9], v[6:7], v[4:5]
541; GFX9-NEXT:    v_fma_f64 v[2:3], -v[2:3], v[8:9], v[6:7]
542; GFX9-NEXT:    v_div_fmas_f64 v[2:3], v[2:3], v[4:5], v[8:9]
543; GFX9-NEXT:    v_div_fixup_f64 v[0:1], v[2:3], v[0:1], 1.0
544; GFX9-NEXT:    s_setpc_b64 s[30:31]
545;
546; GFX10-LABEL: v_rcp_f64_ulp25:
547; GFX10:       ; %bb.0:
548; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
549; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
550; GFX10-NEXT:    v_div_scale_f64 v[2:3], s4, v[0:1], v[0:1], 1.0
551; GFX10-NEXT:    v_div_scale_f64 v[8:9], vcc_lo, 1.0, v[0:1], 1.0
552; GFX10-NEXT:    v_rcp_f64_e32 v[4:5], v[2:3]
553; GFX10-NEXT:    v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
554; GFX10-NEXT:    v_fma_f64 v[4:5], v[4:5], v[6:7], v[4:5]
555; GFX10-NEXT:    v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
556; GFX10-NEXT:    v_fma_f64 v[4:5], v[4:5], v[6:7], v[4:5]
557; GFX10-NEXT:    v_mul_f64 v[6:7], v[8:9], v[4:5]
558; GFX10-NEXT:    v_fma_f64 v[2:3], -v[2:3], v[6:7], v[8:9]
559; GFX10-NEXT:    v_div_fmas_f64 v[2:3], v[2:3], v[4:5], v[6:7]
560; GFX10-NEXT:    v_div_fixup_f64 v[0:1], v[2:3], v[0:1], 1.0
561; GFX10-NEXT:    s_setpc_b64 s[30:31]
562;
563; GFX11-LABEL: v_rcp_f64_ulp25:
564; GFX11:       ; %bb.0:
565; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
566; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
567; GFX11-NEXT:    v_div_scale_f64 v[2:3], null, v[0:1], v[0:1], 1.0
568; GFX11-NEXT:    v_div_scale_f64 v[8:9], vcc_lo, 1.0, v[0:1], 1.0
569; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_2) | instid1(VALU_DEP_1)
570; GFX11-NEXT:    v_rcp_f64_e32 v[4:5], v[2:3]
571; GFX11-NEXT:    s_waitcnt_depctr 0xfff
572; GFX11-NEXT:    v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
573; GFX11-NEXT:    v_fma_f64 v[4:5], v[4:5], v[6:7], v[4:5]
574; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
575; GFX11-NEXT:    v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
576; GFX11-NEXT:    v_fma_f64 v[4:5], v[4:5], v[6:7], v[4:5]
577; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
578; GFX11-NEXT:    v_mul_f64 v[6:7], v[8:9], v[4:5]
579; GFX11-NEXT:    v_fma_f64 v[2:3], -v[2:3], v[6:7], v[8:9]
580; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
581; GFX11-NEXT:    v_div_fmas_f64 v[2:3], v[2:3], v[4:5], v[6:7]
582; GFX11-NEXT:    v_div_fixup_f64 v[0:1], v[2:3], v[0:1], 1.0
583; GFX11-NEXT:    s_setpc_b64 s[30:31]
584  %fdiv = fdiv double 1.0, %x, !fpmath !0
585  ret double %fdiv
586}
587
588define double @v_fdiv_f64_afn_ulp25(double %a, double %b) {
589; GCN-LABEL: v_fdiv_f64_afn_ulp25:
590; GCN:       ; %bb.0:
591; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
592; GCN-NEXT:    v_rcp_f64_e32 v[4:5], v[2:3]
593; GCN-NEXT:    v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
594; GCN-NEXT:    v_fma_f64 v[4:5], v[6:7], v[4:5], v[4:5]
595; GCN-NEXT:    v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
596; GCN-NEXT:    v_fma_f64 v[4:5], v[6:7], v[4:5], v[4:5]
597; GCN-NEXT:    v_mul_f64 v[6:7], v[0:1], v[4:5]
598; GCN-NEXT:    v_fma_f64 v[0:1], -v[2:3], v[6:7], v[0:1]
599; GCN-NEXT:    v_fma_f64 v[0:1], v[0:1], v[4:5], v[6:7]
600; GCN-NEXT:    s_setpc_b64 s[30:31]
601;
602; GFX10-LABEL: v_fdiv_f64_afn_ulp25:
603; GFX10:       ; %bb.0:
604; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
605; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
606; GFX10-NEXT:    v_rcp_f64_e32 v[4:5], v[2:3]
607; GFX10-NEXT:    v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
608; GFX10-NEXT:    v_fma_f64 v[4:5], v[6:7], v[4:5], v[4:5]
609; GFX10-NEXT:    v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
610; GFX10-NEXT:    v_fma_f64 v[4:5], v[6:7], v[4:5], v[4:5]
611; GFX10-NEXT:    v_mul_f64 v[6:7], v[0:1], v[4:5]
612; GFX10-NEXT:    v_fma_f64 v[0:1], -v[2:3], v[6:7], v[0:1]
613; GFX10-NEXT:    v_fma_f64 v[0:1], v[0:1], v[4:5], v[6:7]
614; GFX10-NEXT:    s_setpc_b64 s[30:31]
615;
616; GFX11-LABEL: v_fdiv_f64_afn_ulp25:
617; GFX11:       ; %bb.0:
618; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
619; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
620; GFX11-NEXT:    v_rcp_f64_e32 v[4:5], v[2:3]
621; GFX11-NEXT:    s_waitcnt_depctr 0xfff
622; GFX11-NEXT:    v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
623; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
624; GFX11-NEXT:    v_fma_f64 v[4:5], v[6:7], v[4:5], v[4:5]
625; GFX11-NEXT:    v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
626; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
627; GFX11-NEXT:    v_fma_f64 v[4:5], v[6:7], v[4:5], v[4:5]
628; GFX11-NEXT:    v_mul_f64 v[6:7], v[0:1], v[4:5]
629; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
630; GFX11-NEXT:    v_fma_f64 v[0:1], -v[2:3], v[6:7], v[0:1]
631; GFX11-NEXT:    v_fma_f64 v[0:1], v[0:1], v[4:5], v[6:7]
632; GFX11-NEXT:    s_setpc_b64 s[30:31]
633  %fdiv = fdiv afn double %a, %b, !fpmath !0
634  ret double %fdiv
635}
636
637define double @v_fdiv_f64_arcp_ulp25(double %a, double %b) {
638; GFX6-LABEL: v_fdiv_f64_arcp_ulp25:
639; GFX6:       ; %bb.0:
640; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
641; GFX6-NEXT:    v_div_scale_f64 v[4:5], s[4:5], v[2:3], v[2:3], v[0:1]
642; GFX6-NEXT:    v_div_scale_f64 v[10:11], s[4:5], v[0:1], v[2:3], v[0:1]
643; GFX6-NEXT:    v_rcp_f64_e32 v[6:7], v[4:5]
644; GFX6-NEXT:    v_cmp_eq_u32_e64 s[4:5], v3, v5
645; GFX6-NEXT:    v_cmp_eq_u32_e32 vcc, v1, v11
646; GFX6-NEXT:    s_xor_b64 vcc, vcc, s[4:5]
647; GFX6-NEXT:    v_fma_f64 v[8:9], -v[4:5], v[6:7], 1.0
648; GFX6-NEXT:    v_fma_f64 v[6:7], v[6:7], v[8:9], v[6:7]
649; GFX6-NEXT:    v_fma_f64 v[8:9], -v[4:5], v[6:7], 1.0
650; GFX6-NEXT:    v_fma_f64 v[6:7], v[6:7], v[8:9], v[6:7]
651; GFX6-NEXT:    v_mul_f64 v[8:9], v[10:11], v[6:7]
652; GFX6-NEXT:    v_fma_f64 v[4:5], -v[4:5], v[8:9], v[10:11]
653; GFX6-NEXT:    v_div_fmas_f64 v[4:5], v[4:5], v[6:7], v[8:9]
654; GFX6-NEXT:    v_div_fixup_f64 v[0:1], v[4:5], v[2:3], v[0:1]
655; GFX6-NEXT:    s_setpc_b64 s[30:31]
656;
657; GFX8-LABEL: v_fdiv_f64_arcp_ulp25:
658; GFX8:       ; %bb.0:
659; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
660; GFX8-NEXT:    v_div_scale_f64 v[4:5], s[4:5], v[2:3], v[2:3], v[0:1]
661; GFX8-NEXT:    v_rcp_f64_e32 v[6:7], v[4:5]
662; GFX8-NEXT:    v_fma_f64 v[8:9], -v[4:5], v[6:7], 1.0
663; GFX8-NEXT:    v_fma_f64 v[6:7], v[6:7], v[8:9], v[6:7]
664; GFX8-NEXT:    v_div_scale_f64 v[8:9], vcc, v[0:1], v[2:3], v[0:1]
665; GFX8-NEXT:    v_fma_f64 v[10:11], -v[4:5], v[6:7], 1.0
666; GFX8-NEXT:    v_fma_f64 v[6:7], v[6:7], v[10:11], v[6:7]
667; GFX8-NEXT:    v_mul_f64 v[10:11], v[8:9], v[6:7]
668; GFX8-NEXT:    v_fma_f64 v[4:5], -v[4:5], v[10:11], v[8:9]
669; GFX8-NEXT:    v_div_fmas_f64 v[4:5], v[4:5], v[6:7], v[10:11]
670; GFX8-NEXT:    v_div_fixup_f64 v[0:1], v[4:5], v[2:3], v[0:1]
671; GFX8-NEXT:    s_setpc_b64 s[30:31]
672;
673; GFX9-LABEL: v_fdiv_f64_arcp_ulp25:
674; GFX9:       ; %bb.0:
675; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
676; GFX9-NEXT:    v_div_scale_f64 v[4:5], s[4:5], v[2:3], v[2:3], v[0:1]
677; GFX9-NEXT:    v_rcp_f64_e32 v[6:7], v[4:5]
678; GFX9-NEXT:    v_fma_f64 v[8:9], -v[4:5], v[6:7], 1.0
679; GFX9-NEXT:    v_fma_f64 v[6:7], v[6:7], v[8:9], v[6:7]
680; GFX9-NEXT:    v_div_scale_f64 v[8:9], vcc, v[0:1], v[2:3], v[0:1]
681; GFX9-NEXT:    v_fma_f64 v[10:11], -v[4:5], v[6:7], 1.0
682; GFX9-NEXT:    v_fma_f64 v[6:7], v[6:7], v[10:11], v[6:7]
683; GFX9-NEXT:    v_mul_f64 v[10:11], v[8:9], v[6:7]
684; GFX9-NEXT:    v_fma_f64 v[4:5], -v[4:5], v[10:11], v[8:9]
685; GFX9-NEXT:    v_div_fmas_f64 v[4:5], v[4:5], v[6:7], v[10:11]
686; GFX9-NEXT:    v_div_fixup_f64 v[0:1], v[4:5], v[2:3], v[0:1]
687; GFX9-NEXT:    s_setpc_b64 s[30:31]
688;
689; GFX10-LABEL: v_fdiv_f64_arcp_ulp25:
690; GFX10:       ; %bb.0:
691; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
692; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
693; GFX10-NEXT:    v_div_scale_f64 v[4:5], s4, v[2:3], v[2:3], v[0:1]
694; GFX10-NEXT:    v_div_scale_f64 v[10:11], vcc_lo, v[0:1], v[2:3], v[0:1]
695; GFX10-NEXT:    v_rcp_f64_e32 v[6:7], v[4:5]
696; GFX10-NEXT:    v_fma_f64 v[8:9], -v[4:5], v[6:7], 1.0
697; GFX10-NEXT:    v_fma_f64 v[6:7], v[6:7], v[8:9], v[6:7]
698; GFX10-NEXT:    v_fma_f64 v[8:9], -v[4:5], v[6:7], 1.0
699; GFX10-NEXT:    v_fma_f64 v[6:7], v[6:7], v[8:9], v[6:7]
700; GFX10-NEXT:    v_mul_f64 v[8:9], v[10:11], v[6:7]
701; GFX10-NEXT:    v_fma_f64 v[4:5], -v[4:5], v[8:9], v[10:11]
702; GFX10-NEXT:    v_div_fmas_f64 v[4:5], v[4:5], v[6:7], v[8:9]
703; GFX10-NEXT:    v_div_fixup_f64 v[0:1], v[4:5], v[2:3], v[0:1]
704; GFX10-NEXT:    s_setpc_b64 s[30:31]
705;
706; GFX11-LABEL: v_fdiv_f64_arcp_ulp25:
707; GFX11:       ; %bb.0:
708; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
709; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
710; GFX11-NEXT:    v_div_scale_f64 v[4:5], null, v[2:3], v[2:3], v[0:1]
711; GFX11-NEXT:    v_div_scale_f64 v[10:11], vcc_lo, v[0:1], v[2:3], v[0:1]
712; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_2) | instid1(VALU_DEP_1)
713; GFX11-NEXT:    v_rcp_f64_e32 v[6:7], v[4:5]
714; GFX11-NEXT:    s_waitcnt_depctr 0xfff
715; GFX11-NEXT:    v_fma_f64 v[8:9], -v[4:5], v[6:7], 1.0
716; GFX11-NEXT:    v_fma_f64 v[6:7], v[6:7], v[8:9], v[6:7]
717; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
718; GFX11-NEXT:    v_fma_f64 v[8:9], -v[4:5], v[6:7], 1.0
719; GFX11-NEXT:    v_fma_f64 v[6:7], v[6:7], v[8:9], v[6:7]
720; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
721; GFX11-NEXT:    v_mul_f64 v[8:9], v[10:11], v[6:7]
722; GFX11-NEXT:    v_fma_f64 v[4:5], -v[4:5], v[8:9], v[10:11]
723; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
724; GFX11-NEXT:    v_div_fmas_f64 v[4:5], v[4:5], v[6:7], v[8:9]
725; GFX11-NEXT:    v_div_fixup_f64 v[0:1], v[4:5], v[2:3], v[0:1]
726; GFX11-NEXT:    s_setpc_b64 s[30:31]
727  %fdiv = fdiv arcp double %a, %b, !fpmath !0
728  ret double %fdiv
729}
730
731define <2 x double> @v_fdiv_v2f64(<2 x double> %a, <2 x double> %b) {
732; GFX6-LABEL: v_fdiv_v2f64:
733; GFX6:       ; %bb.0:
734; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
735; GFX6-NEXT:    v_div_scale_f64 v[8:9], s[4:5], v[4:5], v[4:5], v[0:1]
736; GFX6-NEXT:    v_div_scale_f64 v[14:15], s[4:5], v[6:7], v[6:7], v[2:3]
737; GFX6-NEXT:    v_rcp_f64_e32 v[10:11], v[8:9]
738; GFX6-NEXT:    v_div_scale_f64 v[18:19], s[4:5], v[0:1], v[4:5], v[0:1]
739; GFX6-NEXT:    v_rcp_f64_e32 v[16:17], v[14:15]
740; GFX6-NEXT:    v_fma_f64 v[12:13], -v[8:9], v[10:11], 1.0
741; GFX6-NEXT:    v_cmp_eq_u32_e32 vcc, v1, v19
742; GFX6-NEXT:    v_fma_f64 v[10:11], v[10:11], v[12:13], v[10:11]
743; GFX6-NEXT:    v_cmp_eq_u32_e64 s[4:5], v5, v9
744; GFX6-NEXT:    v_fma_f64 v[12:13], -v[8:9], v[10:11], 1.0
745; GFX6-NEXT:    s_xor_b64 vcc, vcc, s[4:5]
746; GFX6-NEXT:    v_fma_f64 v[10:11], v[10:11], v[12:13], v[10:11]
747; GFX6-NEXT:    v_fma_f64 v[12:13], -v[14:15], v[16:17], 1.0
748; GFX6-NEXT:    v_cmp_eq_u32_e64 s[4:5], v7, v15
749; GFX6-NEXT:    v_fma_f64 v[12:13], v[16:17], v[12:13], v[16:17]
750; GFX6-NEXT:    v_mul_f64 v[16:17], v[18:19], v[10:11]
751; GFX6-NEXT:    v_fma_f64 v[18:19], -v[8:9], v[16:17], v[18:19]
752; GFX6-NEXT:    v_fma_f64 v[8:9], -v[14:15], v[12:13], 1.0
753; GFX6-NEXT:    v_div_fmas_f64 v[10:11], v[18:19], v[10:11], v[16:17]
754; GFX6-NEXT:    v_fma_f64 v[8:9], v[12:13], v[8:9], v[12:13]
755; GFX6-NEXT:    v_div_scale_f64 v[12:13], s[6:7], v[2:3], v[6:7], v[2:3]
756; GFX6-NEXT:    v_div_fixup_f64 v[0:1], v[10:11], v[4:5], v[0:1]
757; GFX6-NEXT:    v_mul_f64 v[16:17], v[12:13], v[8:9]
758; GFX6-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v13
759; GFX6-NEXT:    v_fma_f64 v[18:19], -v[14:15], v[16:17], v[12:13]
760; GFX6-NEXT:    s_xor_b64 vcc, vcc, s[4:5]
761; GFX6-NEXT:    s_nop 1
762; GFX6-NEXT:    v_div_fmas_f64 v[8:9], v[18:19], v[8:9], v[16:17]
763; GFX6-NEXT:    v_div_fixup_f64 v[2:3], v[8:9], v[6:7], v[2:3]
764; GFX6-NEXT:    s_setpc_b64 s[30:31]
765;
766; GFX8-LABEL: v_fdiv_v2f64:
767; GFX8:       ; %bb.0:
768; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
769; GFX8-NEXT:    v_div_scale_f64 v[8:9], s[4:5], v[4:5], v[4:5], v[0:1]
770; GFX8-NEXT:    v_div_scale_f64 v[10:11], s[4:5], v[6:7], v[6:7], v[2:3]
771; GFX8-NEXT:    v_rcp_f64_e32 v[12:13], v[8:9]
772; GFX8-NEXT:    v_rcp_f64_e32 v[14:15], v[10:11]
773; GFX8-NEXT:    v_fma_f64 v[16:17], -v[8:9], v[12:13], 1.0
774; GFX8-NEXT:    v_fma_f64 v[18:19], -v[10:11], v[14:15], 1.0
775; GFX8-NEXT:    v_fma_f64 v[12:13], v[12:13], v[16:17], v[12:13]
776; GFX8-NEXT:    v_fma_f64 v[14:15], v[14:15], v[18:19], v[14:15]
777; GFX8-NEXT:    v_div_scale_f64 v[18:19], vcc, v[0:1], v[4:5], v[0:1]
778; GFX8-NEXT:    v_fma_f64 v[16:17], -v[8:9], v[12:13], 1.0
779; GFX8-NEXT:    v_fma_f64 v[12:13], v[12:13], v[16:17], v[12:13]
780; GFX8-NEXT:    v_fma_f64 v[16:17], -v[10:11], v[14:15], 1.0
781; GFX8-NEXT:    v_fma_f64 v[14:15], v[14:15], v[16:17], v[14:15]
782; GFX8-NEXT:    v_mul_f64 v[16:17], v[18:19], v[12:13]
783; GFX8-NEXT:    v_fma_f64 v[8:9], -v[8:9], v[16:17], v[18:19]
784; GFX8-NEXT:    v_div_scale_f64 v[18:19], s[4:5], v[2:3], v[6:7], v[2:3]
785; GFX8-NEXT:    v_div_fmas_f64 v[8:9], v[8:9], v[12:13], v[16:17]
786; GFX8-NEXT:    s_mov_b64 vcc, s[4:5]
787; GFX8-NEXT:    v_mul_f64 v[20:21], v[18:19], v[14:15]
788; GFX8-NEXT:    v_div_fixup_f64 v[0:1], v[8:9], v[4:5], v[0:1]
789; GFX8-NEXT:    v_fma_f64 v[10:11], -v[10:11], v[20:21], v[18:19]
790; GFX8-NEXT:    v_div_fmas_f64 v[10:11], v[10:11], v[14:15], v[20:21]
791; GFX8-NEXT:    v_div_fixup_f64 v[2:3], v[10:11], v[6:7], v[2:3]
792; GFX8-NEXT:    s_setpc_b64 s[30:31]
793;
794; GFX9-LABEL: v_fdiv_v2f64:
795; GFX9:       ; %bb.0:
796; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
797; GFX9-NEXT:    v_div_scale_f64 v[8:9], s[4:5], v[4:5], v[4:5], v[0:1]
798; GFX9-NEXT:    v_div_scale_f64 v[10:11], s[4:5], v[6:7], v[6:7], v[2:3]
799; GFX9-NEXT:    v_rcp_f64_e32 v[12:13], v[8:9]
800; GFX9-NEXT:    v_rcp_f64_e32 v[14:15], v[10:11]
801; GFX9-NEXT:    v_fma_f64 v[16:17], -v[8:9], v[12:13], 1.0
802; GFX9-NEXT:    v_fma_f64 v[18:19], -v[10:11], v[14:15], 1.0
803; GFX9-NEXT:    v_fma_f64 v[12:13], v[12:13], v[16:17], v[12:13]
804; GFX9-NEXT:    v_fma_f64 v[14:15], v[14:15], v[18:19], v[14:15]
805; GFX9-NEXT:    v_div_scale_f64 v[18:19], vcc, v[0:1], v[4:5], v[0:1]
806; GFX9-NEXT:    v_fma_f64 v[16:17], -v[8:9], v[12:13], 1.0
807; GFX9-NEXT:    v_fma_f64 v[12:13], v[12:13], v[16:17], v[12:13]
808; GFX9-NEXT:    v_fma_f64 v[16:17], -v[10:11], v[14:15], 1.0
809; GFX9-NEXT:    v_fma_f64 v[14:15], v[14:15], v[16:17], v[14:15]
810; GFX9-NEXT:    v_mul_f64 v[16:17], v[18:19], v[12:13]
811; GFX9-NEXT:    v_fma_f64 v[8:9], -v[8:9], v[16:17], v[18:19]
812; GFX9-NEXT:    v_div_scale_f64 v[18:19], s[4:5], v[2:3], v[6:7], v[2:3]
813; GFX9-NEXT:    v_div_fmas_f64 v[8:9], v[8:9], v[12:13], v[16:17]
814; GFX9-NEXT:    s_mov_b64 vcc, s[4:5]
815; GFX9-NEXT:    v_mul_f64 v[20:21], v[18:19], v[14:15]
816; GFX9-NEXT:    v_div_fixup_f64 v[0:1], v[8:9], v[4:5], v[0:1]
817; GFX9-NEXT:    v_fma_f64 v[10:11], -v[10:11], v[20:21], v[18:19]
818; GFX9-NEXT:    v_div_fmas_f64 v[10:11], v[10:11], v[14:15], v[20:21]
819; GFX9-NEXT:    v_div_fixup_f64 v[2:3], v[10:11], v[6:7], v[2:3]
820; GFX9-NEXT:    s_setpc_b64 s[30:31]
821;
822; GFX10-LABEL: v_fdiv_v2f64:
823; GFX10:       ; %bb.0:
824; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
825; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
826; GFX10-NEXT:    v_div_scale_f64 v[8:9], s4, v[4:5], v[4:5], v[0:1]
827; GFX10-NEXT:    v_div_scale_f64 v[10:11], s4, v[6:7], v[6:7], v[2:3]
828; GFX10-NEXT:    v_div_scale_f64 v[20:21], vcc_lo, v[0:1], v[4:5], v[0:1]
829; GFX10-NEXT:    v_rcp_f64_e32 v[12:13], v[8:9]
830; GFX10-NEXT:    v_rcp_f64_e32 v[14:15], v[10:11]
831; GFX10-NEXT:    v_fma_f64 v[16:17], -v[8:9], v[12:13], 1.0
832; GFX10-NEXT:    v_fma_f64 v[18:19], -v[10:11], v[14:15], 1.0
833; GFX10-NEXT:    v_fma_f64 v[12:13], v[12:13], v[16:17], v[12:13]
834; GFX10-NEXT:    v_fma_f64 v[14:15], v[14:15], v[18:19], v[14:15]
835; GFX10-NEXT:    v_fma_f64 v[16:17], -v[8:9], v[12:13], 1.0
836; GFX10-NEXT:    v_fma_f64 v[18:19], -v[10:11], v[14:15], 1.0
837; GFX10-NEXT:    v_fma_f64 v[12:13], v[12:13], v[16:17], v[12:13]
838; GFX10-NEXT:    v_div_scale_f64 v[16:17], s4, v[2:3], v[6:7], v[2:3]
839; GFX10-NEXT:    v_fma_f64 v[14:15], v[14:15], v[18:19], v[14:15]
840; GFX10-NEXT:    v_mul_f64 v[18:19], v[20:21], v[12:13]
841; GFX10-NEXT:    v_mul_f64 v[22:23], v[16:17], v[14:15]
842; GFX10-NEXT:    v_fma_f64 v[8:9], -v[8:9], v[18:19], v[20:21]
843; GFX10-NEXT:    v_fma_f64 v[10:11], -v[10:11], v[22:23], v[16:17]
844; GFX10-NEXT:    v_div_fmas_f64 v[8:9], v[8:9], v[12:13], v[18:19]
845; GFX10-NEXT:    s_mov_b32 vcc_lo, s4
846; GFX10-NEXT:    v_div_fmas_f64 v[10:11], v[10:11], v[14:15], v[22:23]
847; GFX10-NEXT:    v_div_fixup_f64 v[0:1], v[8:9], v[4:5], v[0:1]
848; GFX10-NEXT:    v_div_fixup_f64 v[2:3], v[10:11], v[6:7], v[2:3]
849; GFX10-NEXT:    s_setpc_b64 s[30:31]
850;
851; GFX11-LABEL: v_fdiv_v2f64:
852; GFX11:       ; %bb.0:
853; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
854; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
855; GFX11-NEXT:    v_div_scale_f64 v[8:9], null, v[4:5], v[4:5], v[0:1]
856; GFX11-NEXT:    v_div_scale_f64 v[10:11], null, v[6:7], v[6:7], v[2:3]
857; GFX11-NEXT:    v_div_scale_f64 v[20:21], vcc_lo, v[0:1], v[4:5], v[0:1]
858; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_2)
859; GFX11-NEXT:    v_rcp_f64_e32 v[12:13], v[8:9]
860; GFX11-NEXT:    v_rcp_f64_e32 v[14:15], v[10:11]
861; GFX11-NEXT:    s_waitcnt_depctr 0xfff
862; GFX11-NEXT:    v_fma_f64 v[16:17], -v[8:9], v[12:13], 1.0
863; GFX11-NEXT:    v_fma_f64 v[18:19], -v[10:11], v[14:15], 1.0
864; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
865; GFX11-NEXT:    v_fma_f64 v[12:13], v[12:13], v[16:17], v[12:13]
866; GFX11-NEXT:    v_fma_f64 v[14:15], v[14:15], v[18:19], v[14:15]
867; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
868; GFX11-NEXT:    v_fma_f64 v[16:17], -v[8:9], v[12:13], 1.0
869; GFX11-NEXT:    v_fma_f64 v[18:19], -v[10:11], v[14:15], 1.0
870; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_3)
871; GFX11-NEXT:    v_fma_f64 v[12:13], v[12:13], v[16:17], v[12:13]
872; GFX11-NEXT:    v_div_scale_f64 v[16:17], s0, v[2:3], v[6:7], v[2:3]
873; GFX11-NEXT:    v_fma_f64 v[14:15], v[14:15], v[18:19], v[14:15]
874; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_2)
875; GFX11-NEXT:    v_mul_f64 v[18:19], v[20:21], v[12:13]
876; GFX11-NEXT:    v_mul_f64 v[22:23], v[16:17], v[14:15]
877; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
878; GFX11-NEXT:    v_fma_f64 v[8:9], -v[8:9], v[18:19], v[20:21]
879; GFX11-NEXT:    v_fma_f64 v[10:11], -v[10:11], v[22:23], v[16:17]
880; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2)
881; GFX11-NEXT:    v_div_fmas_f64 v[8:9], v[8:9], v[12:13], v[18:19]
882; GFX11-NEXT:    s_mov_b32 vcc_lo, s0
883; GFX11-NEXT:    v_div_fmas_f64 v[10:11], v[10:11], v[14:15], v[22:23]
884; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
885; GFX11-NEXT:    v_div_fixup_f64 v[0:1], v[8:9], v[4:5], v[0:1]
886; GFX11-NEXT:    v_div_fixup_f64 v[2:3], v[10:11], v[6:7], v[2:3]
887; GFX11-NEXT:    s_setpc_b64 s[30:31]
888  %fdiv = fdiv <2 x double> %a, %b
889  ret <2 x double> %fdiv
890}
891
892define <2 x double> @v_fdiv_v2f64_afn(<2 x double> %a, <2 x double> %b) {
893; GCN-LABEL: v_fdiv_v2f64_afn:
894; GCN:       ; %bb.0:
895; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
896; GCN-NEXT:    v_rcp_f64_e32 v[8:9], v[4:5]
897; GCN-NEXT:    v_rcp_f64_e32 v[10:11], v[6:7]
898; GCN-NEXT:    v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
899; GCN-NEXT:    v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
900; GCN-NEXT:    v_fma_f64 v[8:9], v[12:13], v[8:9], v[8:9]
901; GCN-NEXT:    v_fma_f64 v[10:11], v[14:15], v[10:11], v[10:11]
902; GCN-NEXT:    v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
903; GCN-NEXT:    v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
904; GCN-NEXT:    v_fma_f64 v[8:9], v[12:13], v[8:9], v[8:9]
905; GCN-NEXT:    v_fma_f64 v[10:11], v[14:15], v[10:11], v[10:11]
906; GCN-NEXT:    v_mul_f64 v[12:13], v[0:1], v[8:9]
907; GCN-NEXT:    v_mul_f64 v[14:15], v[2:3], v[10:11]
908; GCN-NEXT:    v_fma_f64 v[0:1], -v[4:5], v[12:13], v[0:1]
909; GCN-NEXT:    v_fma_f64 v[2:3], -v[6:7], v[14:15], v[2:3]
910; GCN-NEXT:    v_fma_f64 v[0:1], v[0:1], v[8:9], v[12:13]
911; GCN-NEXT:    v_fma_f64 v[2:3], v[2:3], v[10:11], v[14:15]
912; GCN-NEXT:    s_setpc_b64 s[30:31]
913;
914; GFX10-LABEL: v_fdiv_v2f64_afn:
915; GFX10:       ; %bb.0:
916; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
917; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
918; GFX10-NEXT:    v_rcp_f64_e32 v[8:9], v[4:5]
919; GFX10-NEXT:    v_rcp_f64_e32 v[10:11], v[6:7]
920; GFX10-NEXT:    v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
921; GFX10-NEXT:    v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
922; GFX10-NEXT:    v_fma_f64 v[8:9], v[12:13], v[8:9], v[8:9]
923; GFX10-NEXT:    v_fma_f64 v[10:11], v[14:15], v[10:11], v[10:11]
924; GFX10-NEXT:    v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
925; GFX10-NEXT:    v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
926; GFX10-NEXT:    v_fma_f64 v[8:9], v[12:13], v[8:9], v[8:9]
927; GFX10-NEXT:    v_fma_f64 v[10:11], v[14:15], v[10:11], v[10:11]
928; GFX10-NEXT:    v_mul_f64 v[12:13], v[0:1], v[8:9]
929; GFX10-NEXT:    v_mul_f64 v[14:15], v[2:3], v[10:11]
930; GFX10-NEXT:    v_fma_f64 v[0:1], -v[4:5], v[12:13], v[0:1]
931; GFX10-NEXT:    v_fma_f64 v[2:3], -v[6:7], v[14:15], v[2:3]
932; GFX10-NEXT:    v_fma_f64 v[0:1], v[0:1], v[8:9], v[12:13]
933; GFX10-NEXT:    v_fma_f64 v[2:3], v[2:3], v[10:11], v[14:15]
934; GFX10-NEXT:    s_setpc_b64 s[30:31]
935;
936; GFX11-LABEL: v_fdiv_v2f64_afn:
937; GFX11:       ; %bb.0:
938; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
939; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
940; GFX11-NEXT:    v_rcp_f64_e32 v[8:9], v[4:5]
941; GFX11-NEXT:    v_rcp_f64_e32 v[10:11], v[6:7]
942; GFX11-NEXT:    s_waitcnt_depctr 0xfff
943; GFX11-NEXT:    v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
944; GFX11-NEXT:    v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
945; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
946; GFX11-NEXT:    v_fma_f64 v[8:9], v[12:13], v[8:9], v[8:9]
947; GFX11-NEXT:    v_fma_f64 v[10:11], v[14:15], v[10:11], v[10:11]
948; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
949; GFX11-NEXT:    v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
950; GFX11-NEXT:    v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
951; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
952; GFX11-NEXT:    v_fma_f64 v[8:9], v[12:13], v[8:9], v[8:9]
953; GFX11-NEXT:    v_fma_f64 v[10:11], v[14:15], v[10:11], v[10:11]
954; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
955; GFX11-NEXT:    v_mul_f64 v[12:13], v[0:1], v[8:9]
956; GFX11-NEXT:    v_mul_f64 v[14:15], v[2:3], v[10:11]
957; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
958; GFX11-NEXT:    v_fma_f64 v[0:1], -v[4:5], v[12:13], v[0:1]
959; GFX11-NEXT:    v_fma_f64 v[2:3], -v[6:7], v[14:15], v[2:3]
960; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
961; GFX11-NEXT:    v_fma_f64 v[0:1], v[0:1], v[8:9], v[12:13]
962; GFX11-NEXT:    v_fma_f64 v[2:3], v[2:3], v[10:11], v[14:15]
963; GFX11-NEXT:    s_setpc_b64 s[30:31]
964  %fdiv = fdiv afn <2 x double> %a, %b
965  ret <2 x double> %fdiv
966}
967
968define <2 x double> @v_fdiv_v2f64_ulp25(<2 x double> %a, <2 x double> %b) {
969; GFX6-LABEL: v_fdiv_v2f64_ulp25:
970; GFX6:       ; %bb.0:
971; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
972; GFX6-NEXT:    v_div_scale_f64 v[8:9], s[4:5], v[4:5], v[4:5], v[0:1]
973; GFX6-NEXT:    v_div_scale_f64 v[14:15], s[4:5], v[6:7], v[6:7], v[2:3]
974; GFX6-NEXT:    v_rcp_f64_e32 v[10:11], v[8:9]
975; GFX6-NEXT:    v_div_scale_f64 v[18:19], s[4:5], v[0:1], v[4:5], v[0:1]
976; GFX6-NEXT:    v_rcp_f64_e32 v[16:17], v[14:15]
977; GFX6-NEXT:    v_fma_f64 v[12:13], -v[8:9], v[10:11], 1.0
978; GFX6-NEXT:    v_cmp_eq_u32_e32 vcc, v1, v19
979; GFX6-NEXT:    v_fma_f64 v[10:11], v[10:11], v[12:13], v[10:11]
980; GFX6-NEXT:    v_cmp_eq_u32_e64 s[4:5], v5, v9
981; GFX6-NEXT:    v_fma_f64 v[12:13], -v[8:9], v[10:11], 1.0
982; GFX6-NEXT:    s_xor_b64 vcc, vcc, s[4:5]
983; GFX6-NEXT:    v_fma_f64 v[10:11], v[10:11], v[12:13], v[10:11]
984; GFX6-NEXT:    v_fma_f64 v[12:13], -v[14:15], v[16:17], 1.0
985; GFX6-NEXT:    v_cmp_eq_u32_e64 s[4:5], v7, v15
986; GFX6-NEXT:    v_fma_f64 v[12:13], v[16:17], v[12:13], v[16:17]
987; GFX6-NEXT:    v_mul_f64 v[16:17], v[18:19], v[10:11]
988; GFX6-NEXT:    v_fma_f64 v[18:19], -v[8:9], v[16:17], v[18:19]
989; GFX6-NEXT:    v_fma_f64 v[8:9], -v[14:15], v[12:13], 1.0
990; GFX6-NEXT:    v_div_fmas_f64 v[10:11], v[18:19], v[10:11], v[16:17]
991; GFX6-NEXT:    v_fma_f64 v[8:9], v[12:13], v[8:9], v[12:13]
992; GFX6-NEXT:    v_div_scale_f64 v[12:13], s[6:7], v[2:3], v[6:7], v[2:3]
993; GFX6-NEXT:    v_div_fixup_f64 v[0:1], v[10:11], v[4:5], v[0:1]
994; GFX6-NEXT:    v_mul_f64 v[16:17], v[12:13], v[8:9]
995; GFX6-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v13
996; GFX6-NEXT:    v_fma_f64 v[18:19], -v[14:15], v[16:17], v[12:13]
997; GFX6-NEXT:    s_xor_b64 vcc, vcc, s[4:5]
998; GFX6-NEXT:    s_nop 1
999; GFX6-NEXT:    v_div_fmas_f64 v[8:9], v[18:19], v[8:9], v[16:17]
1000; GFX6-NEXT:    v_div_fixup_f64 v[2:3], v[8:9], v[6:7], v[2:3]
1001; GFX6-NEXT:    s_setpc_b64 s[30:31]
1002;
1003; GFX8-LABEL: v_fdiv_v2f64_ulp25:
1004; GFX8:       ; %bb.0:
1005; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1006; GFX8-NEXT:    v_div_scale_f64 v[8:9], s[4:5], v[4:5], v[4:5], v[0:1]
1007; GFX8-NEXT:    v_div_scale_f64 v[10:11], s[4:5], v[6:7], v[6:7], v[2:3]
1008; GFX8-NEXT:    v_rcp_f64_e32 v[12:13], v[8:9]
1009; GFX8-NEXT:    v_rcp_f64_e32 v[14:15], v[10:11]
1010; GFX8-NEXT:    v_fma_f64 v[16:17], -v[8:9], v[12:13], 1.0
1011; GFX8-NEXT:    v_fma_f64 v[18:19], -v[10:11], v[14:15], 1.0
1012; GFX8-NEXT:    v_fma_f64 v[12:13], v[12:13], v[16:17], v[12:13]
1013; GFX8-NEXT:    v_fma_f64 v[14:15], v[14:15], v[18:19], v[14:15]
1014; GFX8-NEXT:    v_div_scale_f64 v[18:19], vcc, v[0:1], v[4:5], v[0:1]
1015; GFX8-NEXT:    v_fma_f64 v[16:17], -v[8:9], v[12:13], 1.0
1016; GFX8-NEXT:    v_fma_f64 v[12:13], v[12:13], v[16:17], v[12:13]
1017; GFX8-NEXT:    v_fma_f64 v[16:17], -v[10:11], v[14:15], 1.0
1018; GFX8-NEXT:    v_fma_f64 v[14:15], v[14:15], v[16:17], v[14:15]
1019; GFX8-NEXT:    v_mul_f64 v[16:17], v[18:19], v[12:13]
1020; GFX8-NEXT:    v_fma_f64 v[8:9], -v[8:9], v[16:17], v[18:19]
1021; GFX8-NEXT:    v_div_scale_f64 v[18:19], s[4:5], v[2:3], v[6:7], v[2:3]
1022; GFX8-NEXT:    v_div_fmas_f64 v[8:9], v[8:9], v[12:13], v[16:17]
1023; GFX8-NEXT:    s_mov_b64 vcc, s[4:5]
1024; GFX8-NEXT:    v_mul_f64 v[20:21], v[18:19], v[14:15]
1025; GFX8-NEXT:    v_div_fixup_f64 v[0:1], v[8:9], v[4:5], v[0:1]
1026; GFX8-NEXT:    v_fma_f64 v[10:11], -v[10:11], v[20:21], v[18:19]
1027; GFX8-NEXT:    v_div_fmas_f64 v[10:11], v[10:11], v[14:15], v[20:21]
1028; GFX8-NEXT:    v_div_fixup_f64 v[2:3], v[10:11], v[6:7], v[2:3]
1029; GFX8-NEXT:    s_setpc_b64 s[30:31]
1030;
1031; GFX9-LABEL: v_fdiv_v2f64_ulp25:
1032; GFX9:       ; %bb.0:
1033; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1034; GFX9-NEXT:    v_div_scale_f64 v[8:9], s[4:5], v[4:5], v[4:5], v[0:1]
1035; GFX9-NEXT:    v_div_scale_f64 v[10:11], s[4:5], v[6:7], v[6:7], v[2:3]
1036; GFX9-NEXT:    v_rcp_f64_e32 v[12:13], v[8:9]
1037; GFX9-NEXT:    v_rcp_f64_e32 v[14:15], v[10:11]
1038; GFX9-NEXT:    v_fma_f64 v[16:17], -v[8:9], v[12:13], 1.0
1039; GFX9-NEXT:    v_fma_f64 v[18:19], -v[10:11], v[14:15], 1.0
1040; GFX9-NEXT:    v_fma_f64 v[12:13], v[12:13], v[16:17], v[12:13]
1041; GFX9-NEXT:    v_fma_f64 v[14:15], v[14:15], v[18:19], v[14:15]
1042; GFX9-NEXT:    v_div_scale_f64 v[18:19], vcc, v[0:1], v[4:5], v[0:1]
1043; GFX9-NEXT:    v_fma_f64 v[16:17], -v[8:9], v[12:13], 1.0
1044; GFX9-NEXT:    v_fma_f64 v[12:13], v[12:13], v[16:17], v[12:13]
1045; GFX9-NEXT:    v_fma_f64 v[16:17], -v[10:11], v[14:15], 1.0
1046; GFX9-NEXT:    v_fma_f64 v[14:15], v[14:15], v[16:17], v[14:15]
1047; GFX9-NEXT:    v_mul_f64 v[16:17], v[18:19], v[12:13]
1048; GFX9-NEXT:    v_fma_f64 v[8:9], -v[8:9], v[16:17], v[18:19]
1049; GFX9-NEXT:    v_div_scale_f64 v[18:19], s[4:5], v[2:3], v[6:7], v[2:3]
1050; GFX9-NEXT:    v_div_fmas_f64 v[8:9], v[8:9], v[12:13], v[16:17]
1051; GFX9-NEXT:    s_mov_b64 vcc, s[4:5]
1052; GFX9-NEXT:    v_mul_f64 v[20:21], v[18:19], v[14:15]
1053; GFX9-NEXT:    v_div_fixup_f64 v[0:1], v[8:9], v[4:5], v[0:1]
1054; GFX9-NEXT:    v_fma_f64 v[10:11], -v[10:11], v[20:21], v[18:19]
1055; GFX9-NEXT:    v_div_fmas_f64 v[10:11], v[10:11], v[14:15], v[20:21]
1056; GFX9-NEXT:    v_div_fixup_f64 v[2:3], v[10:11], v[6:7], v[2:3]
1057; GFX9-NEXT:    s_setpc_b64 s[30:31]
1058;
1059; GFX10-LABEL: v_fdiv_v2f64_ulp25:
1060; GFX10:       ; %bb.0:
1061; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1062; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
1063; GFX10-NEXT:    v_div_scale_f64 v[8:9], s4, v[4:5], v[4:5], v[0:1]
1064; GFX10-NEXT:    v_div_scale_f64 v[10:11], s4, v[6:7], v[6:7], v[2:3]
1065; GFX10-NEXT:    v_div_scale_f64 v[20:21], vcc_lo, v[0:1], v[4:5], v[0:1]
1066; GFX10-NEXT:    v_rcp_f64_e32 v[12:13], v[8:9]
1067; GFX10-NEXT:    v_rcp_f64_e32 v[14:15], v[10:11]
1068; GFX10-NEXT:    v_fma_f64 v[16:17], -v[8:9], v[12:13], 1.0
1069; GFX10-NEXT:    v_fma_f64 v[18:19], -v[10:11], v[14:15], 1.0
1070; GFX10-NEXT:    v_fma_f64 v[12:13], v[12:13], v[16:17], v[12:13]
1071; GFX10-NEXT:    v_fma_f64 v[14:15], v[14:15], v[18:19], v[14:15]
1072; GFX10-NEXT:    v_fma_f64 v[16:17], -v[8:9], v[12:13], 1.0
1073; GFX10-NEXT:    v_fma_f64 v[18:19], -v[10:11], v[14:15], 1.0
1074; GFX10-NEXT:    v_fma_f64 v[12:13], v[12:13], v[16:17], v[12:13]
1075; GFX10-NEXT:    v_div_scale_f64 v[16:17], s4, v[2:3], v[6:7], v[2:3]
1076; GFX10-NEXT:    v_fma_f64 v[14:15], v[14:15], v[18:19], v[14:15]
1077; GFX10-NEXT:    v_mul_f64 v[18:19], v[20:21], v[12:13]
1078; GFX10-NEXT:    v_mul_f64 v[22:23], v[16:17], v[14:15]
1079; GFX10-NEXT:    v_fma_f64 v[8:9], -v[8:9], v[18:19], v[20:21]
1080; GFX10-NEXT:    v_fma_f64 v[10:11], -v[10:11], v[22:23], v[16:17]
1081; GFX10-NEXT:    v_div_fmas_f64 v[8:9], v[8:9], v[12:13], v[18:19]
1082; GFX10-NEXT:    s_mov_b32 vcc_lo, s4
1083; GFX10-NEXT:    v_div_fmas_f64 v[10:11], v[10:11], v[14:15], v[22:23]
1084; GFX10-NEXT:    v_div_fixup_f64 v[0:1], v[8:9], v[4:5], v[0:1]
1085; GFX10-NEXT:    v_div_fixup_f64 v[2:3], v[10:11], v[6:7], v[2:3]
1086; GFX10-NEXT:    s_setpc_b64 s[30:31]
1087;
1088; GFX11-LABEL: v_fdiv_v2f64_ulp25:
1089; GFX11:       ; %bb.0:
1090; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1091; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
1092; GFX11-NEXT:    v_div_scale_f64 v[8:9], null, v[4:5], v[4:5], v[0:1]
1093; GFX11-NEXT:    v_div_scale_f64 v[10:11], null, v[6:7], v[6:7], v[2:3]
1094; GFX11-NEXT:    v_div_scale_f64 v[20:21], vcc_lo, v[0:1], v[4:5], v[0:1]
1095; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_2)
1096; GFX11-NEXT:    v_rcp_f64_e32 v[12:13], v[8:9]
1097; GFX11-NEXT:    v_rcp_f64_e32 v[14:15], v[10:11]
1098; GFX11-NEXT:    s_waitcnt_depctr 0xfff
1099; GFX11-NEXT:    v_fma_f64 v[16:17], -v[8:9], v[12:13], 1.0
1100; GFX11-NEXT:    v_fma_f64 v[18:19], -v[10:11], v[14:15], 1.0
1101; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
1102; GFX11-NEXT:    v_fma_f64 v[12:13], v[12:13], v[16:17], v[12:13]
1103; GFX11-NEXT:    v_fma_f64 v[14:15], v[14:15], v[18:19], v[14:15]
1104; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
1105; GFX11-NEXT:    v_fma_f64 v[16:17], -v[8:9], v[12:13], 1.0
1106; GFX11-NEXT:    v_fma_f64 v[18:19], -v[10:11], v[14:15], 1.0
1107; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_3)
1108; GFX11-NEXT:    v_fma_f64 v[12:13], v[12:13], v[16:17], v[12:13]
1109; GFX11-NEXT:    v_div_scale_f64 v[16:17], s0, v[2:3], v[6:7], v[2:3]
1110; GFX11-NEXT:    v_fma_f64 v[14:15], v[14:15], v[18:19], v[14:15]
1111; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_2)
1112; GFX11-NEXT:    v_mul_f64 v[18:19], v[20:21], v[12:13]
1113; GFX11-NEXT:    v_mul_f64 v[22:23], v[16:17], v[14:15]
1114; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
1115; GFX11-NEXT:    v_fma_f64 v[8:9], -v[8:9], v[18:19], v[20:21]
1116; GFX11-NEXT:    v_fma_f64 v[10:11], -v[10:11], v[22:23], v[16:17]
1117; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2)
1118; GFX11-NEXT:    v_div_fmas_f64 v[8:9], v[8:9], v[12:13], v[18:19]
1119; GFX11-NEXT:    s_mov_b32 vcc_lo, s0
1120; GFX11-NEXT:    v_div_fmas_f64 v[10:11], v[10:11], v[14:15], v[22:23]
1121; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
1122; GFX11-NEXT:    v_div_fixup_f64 v[0:1], v[8:9], v[4:5], v[0:1]
1123; GFX11-NEXT:    v_div_fixup_f64 v[2:3], v[10:11], v[6:7], v[2:3]
1124; GFX11-NEXT:    s_setpc_b64 s[30:31]
1125  %fdiv = fdiv <2 x double> %a, %b, !fpmath !0
1126  ret <2 x double> %fdiv
1127}
1128
1129define <2 x double> @v_rcp_v2f64(<2 x double> %x) {
1130; GFX6-LABEL: v_rcp_v2f64:
1131; GFX6:       ; %bb.0:
1132; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1133; GFX6-NEXT:    v_div_scale_f64 v[4:5], s[4:5], v[0:1], v[0:1], 1.0
1134; GFX6-NEXT:    v_div_scale_f64 v[10:11], s[4:5], v[2:3], v[2:3], 1.0
1135; GFX6-NEXT:    v_rcp_f64_e32 v[6:7], v[4:5]
1136; GFX6-NEXT:    v_mov_b32_e32 v18, 0x3ff00000
1137; GFX6-NEXT:    v_rcp_f64_e32 v[14:15], v[10:11]
1138; GFX6-NEXT:    v_fma_f64 v[8:9], -v[4:5], v[6:7], 1.0
1139; GFX6-NEXT:    v_fma_f64 v[16:17], -v[10:11], v[14:15], 1.0
1140; GFX6-NEXT:    v_fma_f64 v[6:7], v[6:7], v[8:9], v[6:7]
1141; GFX6-NEXT:    v_div_scale_f64 v[8:9], s[4:5], 1.0, v[0:1], 1.0
1142; GFX6-NEXT:    v_fma_f64 v[12:13], -v[4:5], v[6:7], 1.0
1143; GFX6-NEXT:    v_fma_f64 v[14:15], v[14:15], v[16:17], v[14:15]
1144; GFX6-NEXT:    v_fma_f64 v[6:7], v[6:7], v[12:13], v[6:7]
1145; GFX6-NEXT:    v_cmp_eq_u32_e32 vcc, v18, v9
1146; GFX6-NEXT:    v_mul_f64 v[12:13], v[8:9], v[6:7]
1147; GFX6-NEXT:    v_cmp_eq_u32_e64 s[4:5], v1, v5
1148; GFX6-NEXT:    v_fma_f64 v[8:9], -v[4:5], v[12:13], v[8:9]
1149; GFX6-NEXT:    v_fma_f64 v[4:5], -v[10:11], v[14:15], 1.0
1150; GFX6-NEXT:    v_div_scale_f64 v[16:17], s[6:7], 1.0, v[2:3], 1.0
1151; GFX6-NEXT:    v_fma_f64 v[4:5], v[14:15], v[4:5], v[14:15]
1152; GFX6-NEXT:    s_xor_b64 vcc, vcc, s[4:5]
1153; GFX6-NEXT:    v_mul_f64 v[14:15], v[16:17], v[4:5]
1154; GFX6-NEXT:    v_div_fmas_f64 v[6:7], v[8:9], v[6:7], v[12:13]
1155; GFX6-NEXT:    v_fma_f64 v[8:9], -v[10:11], v[14:15], v[16:17]
1156; GFX6-NEXT:    v_cmp_eq_u32_e32 vcc, v18, v17
1157; GFX6-NEXT:    v_cmp_eq_u32_e64 s[4:5], v3, v11
1158; GFX6-NEXT:    s_xor_b64 vcc, vcc, s[4:5]
1159; GFX6-NEXT:    v_div_fixup_f64 v[0:1], v[6:7], v[0:1], 1.0
1160; GFX6-NEXT:    s_nop 0
1161; GFX6-NEXT:    v_div_fmas_f64 v[4:5], v[8:9], v[4:5], v[14:15]
1162; GFX6-NEXT:    v_div_fixup_f64 v[2:3], v[4:5], v[2:3], 1.0
1163; GFX6-NEXT:    s_setpc_b64 s[30:31]
1164;
1165; GFX8-LABEL: v_rcp_v2f64:
1166; GFX8:       ; %bb.0:
1167; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1168; GFX8-NEXT:    v_div_scale_f64 v[4:5], s[4:5], v[0:1], v[0:1], 1.0
1169; GFX8-NEXT:    v_div_scale_f64 v[6:7], s[4:5], v[2:3], v[2:3], 1.0
1170; GFX8-NEXT:    v_div_scale_f64 v[16:17], s[4:5], 1.0, v[2:3], 1.0
1171; GFX8-NEXT:    v_rcp_f64_e32 v[8:9], v[4:5]
1172; GFX8-NEXT:    v_rcp_f64_e32 v[10:11], v[6:7]
1173; GFX8-NEXT:    v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
1174; GFX8-NEXT:    v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
1175; GFX8-NEXT:    v_fma_f64 v[8:9], v[8:9], v[12:13], v[8:9]
1176; GFX8-NEXT:    v_div_scale_f64 v[12:13], vcc, 1.0, v[0:1], 1.0
1177; GFX8-NEXT:    v_fma_f64 v[10:11], v[10:11], v[14:15], v[10:11]
1178; GFX8-NEXT:    v_fma_f64 v[14:15], -v[4:5], v[8:9], 1.0
1179; GFX8-NEXT:    v_fma_f64 v[18:19], -v[6:7], v[10:11], 1.0
1180; GFX8-NEXT:    v_fma_f64 v[8:9], v[8:9], v[14:15], v[8:9]
1181; GFX8-NEXT:    v_fma_f64 v[10:11], v[10:11], v[18:19], v[10:11]
1182; GFX8-NEXT:    v_mul_f64 v[14:15], v[12:13], v[8:9]
1183; GFX8-NEXT:    v_mul_f64 v[18:19], v[16:17], v[10:11]
1184; GFX8-NEXT:    v_fma_f64 v[4:5], -v[4:5], v[14:15], v[12:13]
1185; GFX8-NEXT:    v_fma_f64 v[6:7], -v[6:7], v[18:19], v[16:17]
1186; GFX8-NEXT:    v_div_fmas_f64 v[4:5], v[4:5], v[8:9], v[14:15]
1187; GFX8-NEXT:    s_mov_b64 vcc, s[4:5]
1188; GFX8-NEXT:    v_div_fmas_f64 v[6:7], v[6:7], v[10:11], v[18:19]
1189; GFX8-NEXT:    v_div_fixup_f64 v[0:1], v[4:5], v[0:1], 1.0
1190; GFX8-NEXT:    v_div_fixup_f64 v[2:3], v[6:7], v[2:3], 1.0
1191; GFX8-NEXT:    s_setpc_b64 s[30:31]
1192;
1193; GFX9-LABEL: v_rcp_v2f64:
1194; GFX9:       ; %bb.0:
1195; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1196; GFX9-NEXT:    v_div_scale_f64 v[4:5], s[4:5], v[0:1], v[0:1], 1.0
1197; GFX9-NEXT:    v_div_scale_f64 v[6:7], s[4:5], v[2:3], v[2:3], 1.0
1198; GFX9-NEXT:    v_div_scale_f64 v[16:17], s[4:5], 1.0, v[2:3], 1.0
1199; GFX9-NEXT:    v_rcp_f64_e32 v[8:9], v[4:5]
1200; GFX9-NEXT:    v_rcp_f64_e32 v[10:11], v[6:7]
1201; GFX9-NEXT:    v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
1202; GFX9-NEXT:    v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
1203; GFX9-NEXT:    v_fma_f64 v[8:9], v[8:9], v[12:13], v[8:9]
1204; GFX9-NEXT:    v_div_scale_f64 v[12:13], vcc, 1.0, v[0:1], 1.0
1205; GFX9-NEXT:    v_fma_f64 v[10:11], v[10:11], v[14:15], v[10:11]
1206; GFX9-NEXT:    v_fma_f64 v[14:15], -v[4:5], v[8:9], 1.0
1207; GFX9-NEXT:    v_fma_f64 v[18:19], -v[6:7], v[10:11], 1.0
1208; GFX9-NEXT:    v_fma_f64 v[8:9], v[8:9], v[14:15], v[8:9]
1209; GFX9-NEXT:    v_fma_f64 v[10:11], v[10:11], v[18:19], v[10:11]
1210; GFX9-NEXT:    v_mul_f64 v[14:15], v[12:13], v[8:9]
1211; GFX9-NEXT:    v_mul_f64 v[18:19], v[16:17], v[10:11]
1212; GFX9-NEXT:    v_fma_f64 v[4:5], -v[4:5], v[14:15], v[12:13]
1213; GFX9-NEXT:    v_fma_f64 v[6:7], -v[6:7], v[18:19], v[16:17]
1214; GFX9-NEXT:    v_div_fmas_f64 v[4:5], v[4:5], v[8:9], v[14:15]
1215; GFX9-NEXT:    s_mov_b64 vcc, s[4:5]
1216; GFX9-NEXT:    v_div_fmas_f64 v[6:7], v[6:7], v[10:11], v[18:19]
1217; GFX9-NEXT:    v_div_fixup_f64 v[0:1], v[4:5], v[0:1], 1.0
1218; GFX9-NEXT:    v_div_fixup_f64 v[2:3], v[6:7], v[2:3], 1.0
1219; GFX9-NEXT:    s_setpc_b64 s[30:31]
1220;
1221; GFX10-LABEL: v_rcp_v2f64:
1222; GFX10:       ; %bb.0:
1223; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1224; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
1225; GFX10-NEXT:    v_div_scale_f64 v[4:5], s4, v[0:1], v[0:1], 1.0
1226; GFX10-NEXT:    v_div_scale_f64 v[6:7], s4, v[2:3], v[2:3], 1.0
1227; GFX10-NEXT:    v_div_scale_f64 v[16:17], vcc_lo, 1.0, v[0:1], 1.0
1228; GFX10-NEXT:    v_rcp_f64_e32 v[8:9], v[4:5]
1229; GFX10-NEXT:    v_rcp_f64_e32 v[10:11], v[6:7]
1230; GFX10-NEXT:    v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
1231; GFX10-NEXT:    v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
1232; GFX10-NEXT:    v_fma_f64 v[8:9], v[8:9], v[12:13], v[8:9]
1233; GFX10-NEXT:    v_fma_f64 v[10:11], v[10:11], v[14:15], v[10:11]
1234; GFX10-NEXT:    v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
1235; GFX10-NEXT:    v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
1236; GFX10-NEXT:    v_fma_f64 v[8:9], v[8:9], v[12:13], v[8:9]
1237; GFX10-NEXT:    v_div_scale_f64 v[12:13], s4, 1.0, v[2:3], 1.0
1238; GFX10-NEXT:    v_fma_f64 v[10:11], v[10:11], v[14:15], v[10:11]
1239; GFX10-NEXT:    v_mul_f64 v[14:15], v[16:17], v[8:9]
1240; GFX10-NEXT:    v_mul_f64 v[18:19], v[12:13], v[10:11]
1241; GFX10-NEXT:    v_fma_f64 v[4:5], -v[4:5], v[14:15], v[16:17]
1242; GFX10-NEXT:    v_fma_f64 v[6:7], -v[6:7], v[18:19], v[12:13]
1243; GFX10-NEXT:    v_div_fmas_f64 v[4:5], v[4:5], v[8:9], v[14:15]
1244; GFX10-NEXT:    s_mov_b32 vcc_lo, s4
1245; GFX10-NEXT:    v_div_fmas_f64 v[6:7], v[6:7], v[10:11], v[18:19]
1246; GFX10-NEXT:    v_div_fixup_f64 v[0:1], v[4:5], v[0:1], 1.0
1247; GFX10-NEXT:    v_div_fixup_f64 v[2:3], v[6:7], v[2:3], 1.0
1248; GFX10-NEXT:    s_setpc_b64 s[30:31]
1249;
1250; GFX11-LABEL: v_rcp_v2f64:
1251; GFX11:       ; %bb.0:
1252; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1253; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
1254; GFX11-NEXT:    v_div_scale_f64 v[4:5], null, v[0:1], v[0:1], 1.0
1255; GFX11-NEXT:    v_div_scale_f64 v[6:7], null, v[2:3], v[2:3], 1.0
1256; GFX11-NEXT:    v_div_scale_f64 v[16:17], vcc_lo, 1.0, v[0:1], 1.0
1257; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_2)
1258; GFX11-NEXT:    v_rcp_f64_e32 v[8:9], v[4:5]
1259; GFX11-NEXT:    v_rcp_f64_e32 v[10:11], v[6:7]
1260; GFX11-NEXT:    s_waitcnt_depctr 0xfff
1261; GFX11-NEXT:    v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
1262; GFX11-NEXT:    v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
1263; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
1264; GFX11-NEXT:    v_fma_f64 v[8:9], v[8:9], v[12:13], v[8:9]
1265; GFX11-NEXT:    v_fma_f64 v[10:11], v[10:11], v[14:15], v[10:11]
1266; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
1267; GFX11-NEXT:    v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
1268; GFX11-NEXT:    v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
1269; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_3)
1270; GFX11-NEXT:    v_fma_f64 v[8:9], v[8:9], v[12:13], v[8:9]
1271; GFX11-NEXT:    v_div_scale_f64 v[12:13], s0, 1.0, v[2:3], 1.0
1272; GFX11-NEXT:    v_fma_f64 v[10:11], v[10:11], v[14:15], v[10:11]
1273; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_2)
1274; GFX11-NEXT:    v_mul_f64 v[14:15], v[16:17], v[8:9]
1275; GFX11-NEXT:    v_mul_f64 v[18:19], v[12:13], v[10:11]
1276; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
1277; GFX11-NEXT:    v_fma_f64 v[4:5], -v[4:5], v[14:15], v[16:17]
1278; GFX11-NEXT:    v_fma_f64 v[6:7], -v[6:7], v[18:19], v[12:13]
1279; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2)
1280; GFX11-NEXT:    v_div_fmas_f64 v[4:5], v[4:5], v[8:9], v[14:15]
1281; GFX11-NEXT:    s_mov_b32 vcc_lo, s0
1282; GFX11-NEXT:    v_div_fmas_f64 v[6:7], v[6:7], v[10:11], v[18:19]
1283; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
1284; GFX11-NEXT:    v_div_fixup_f64 v[0:1], v[4:5], v[0:1], 1.0
1285; GFX11-NEXT:    v_div_fixup_f64 v[2:3], v[6:7], v[2:3], 1.0
1286; GFX11-NEXT:    s_setpc_b64 s[30:31]
1287  %fdiv = fdiv <2 x double> <double 1.0, double 1.0>, %x
1288  ret <2 x double> %fdiv
1289}
1290
1291define <2 x double> @v_rcp_v2f64_arcp(<2 x double> %x) {
1292; GFX6-LABEL: v_rcp_v2f64_arcp:
1293; GFX6:       ; %bb.0:
1294; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1295; GFX6-NEXT:    v_div_scale_f64 v[4:5], s[4:5], v[0:1], v[0:1], 1.0
1296; GFX6-NEXT:    v_div_scale_f64 v[10:11], s[4:5], v[2:3], v[2:3], 1.0
1297; GFX6-NEXT:    v_rcp_f64_e32 v[6:7], v[4:5]
1298; GFX6-NEXT:    v_mov_b32_e32 v18, 0x3ff00000
1299; GFX6-NEXT:    v_rcp_f64_e32 v[14:15], v[10:11]
1300; GFX6-NEXT:    v_fma_f64 v[8:9], -v[4:5], v[6:7], 1.0
1301; GFX6-NEXT:    v_fma_f64 v[16:17], -v[10:11], v[14:15], 1.0
1302; GFX6-NEXT:    v_fma_f64 v[6:7], v[6:7], v[8:9], v[6:7]
1303; GFX6-NEXT:    v_div_scale_f64 v[8:9], s[4:5], 1.0, v[0:1], 1.0
1304; GFX6-NEXT:    v_fma_f64 v[12:13], -v[4:5], v[6:7], 1.0
1305; GFX6-NEXT:    v_fma_f64 v[14:15], v[14:15], v[16:17], v[14:15]
1306; GFX6-NEXT:    v_fma_f64 v[6:7], v[6:7], v[12:13], v[6:7]
1307; GFX6-NEXT:    v_cmp_eq_u32_e32 vcc, v18, v9
1308; GFX6-NEXT:    v_mul_f64 v[12:13], v[8:9], v[6:7]
1309; GFX6-NEXT:    v_cmp_eq_u32_e64 s[4:5], v1, v5
1310; GFX6-NEXT:    v_fma_f64 v[8:9], -v[4:5], v[12:13], v[8:9]
1311; GFX6-NEXT:    v_fma_f64 v[4:5], -v[10:11], v[14:15], 1.0
1312; GFX6-NEXT:    v_div_scale_f64 v[16:17], s[6:7], 1.0, v[2:3], 1.0
1313; GFX6-NEXT:    v_fma_f64 v[4:5], v[14:15], v[4:5], v[14:15]
1314; GFX6-NEXT:    s_xor_b64 vcc, vcc, s[4:5]
1315; GFX6-NEXT:    v_mul_f64 v[14:15], v[16:17], v[4:5]
1316; GFX6-NEXT:    v_div_fmas_f64 v[6:7], v[8:9], v[6:7], v[12:13]
1317; GFX6-NEXT:    v_fma_f64 v[8:9], -v[10:11], v[14:15], v[16:17]
1318; GFX6-NEXT:    v_cmp_eq_u32_e32 vcc, v18, v17
1319; GFX6-NEXT:    v_cmp_eq_u32_e64 s[4:5], v3, v11
1320; GFX6-NEXT:    s_xor_b64 vcc, vcc, s[4:5]
1321; GFX6-NEXT:    v_div_fixup_f64 v[0:1], v[6:7], v[0:1], 1.0
1322; GFX6-NEXT:    s_nop 0
1323; GFX6-NEXT:    v_div_fmas_f64 v[4:5], v[8:9], v[4:5], v[14:15]
1324; GFX6-NEXT:    v_div_fixup_f64 v[2:3], v[4:5], v[2:3], 1.0
1325; GFX6-NEXT:    s_setpc_b64 s[30:31]
1326;
1327; GFX8-LABEL: v_rcp_v2f64_arcp:
1328; GFX8:       ; %bb.0:
1329; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1330; GFX8-NEXT:    v_div_scale_f64 v[4:5], s[4:5], v[0:1], v[0:1], 1.0
1331; GFX8-NEXT:    v_div_scale_f64 v[6:7], s[4:5], v[2:3], v[2:3], 1.0
1332; GFX8-NEXT:    v_div_scale_f64 v[16:17], s[4:5], 1.0, v[2:3], 1.0
1333; GFX8-NEXT:    v_rcp_f64_e32 v[8:9], v[4:5]
1334; GFX8-NEXT:    v_rcp_f64_e32 v[10:11], v[6:7]
1335; GFX8-NEXT:    v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
1336; GFX8-NEXT:    v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
1337; GFX8-NEXT:    v_fma_f64 v[8:9], v[8:9], v[12:13], v[8:9]
1338; GFX8-NEXT:    v_div_scale_f64 v[12:13], vcc, 1.0, v[0:1], 1.0
1339; GFX8-NEXT:    v_fma_f64 v[10:11], v[10:11], v[14:15], v[10:11]
1340; GFX8-NEXT:    v_fma_f64 v[14:15], -v[4:5], v[8:9], 1.0
1341; GFX8-NEXT:    v_fma_f64 v[18:19], -v[6:7], v[10:11], 1.0
1342; GFX8-NEXT:    v_fma_f64 v[8:9], v[8:9], v[14:15], v[8:9]
1343; GFX8-NEXT:    v_fma_f64 v[10:11], v[10:11], v[18:19], v[10:11]
1344; GFX8-NEXT:    v_mul_f64 v[14:15], v[12:13], v[8:9]
1345; GFX8-NEXT:    v_mul_f64 v[18:19], v[16:17], v[10:11]
1346; GFX8-NEXT:    v_fma_f64 v[4:5], -v[4:5], v[14:15], v[12:13]
1347; GFX8-NEXT:    v_fma_f64 v[6:7], -v[6:7], v[18:19], v[16:17]
1348; GFX8-NEXT:    v_div_fmas_f64 v[4:5], v[4:5], v[8:9], v[14:15]
1349; GFX8-NEXT:    s_mov_b64 vcc, s[4:5]
1350; GFX8-NEXT:    v_div_fmas_f64 v[6:7], v[6:7], v[10:11], v[18:19]
1351; GFX8-NEXT:    v_div_fixup_f64 v[0:1], v[4:5], v[0:1], 1.0
1352; GFX8-NEXT:    v_div_fixup_f64 v[2:3], v[6:7], v[2:3], 1.0
1353; GFX8-NEXT:    s_setpc_b64 s[30:31]
1354;
1355; GFX9-LABEL: v_rcp_v2f64_arcp:
1356; GFX9:       ; %bb.0:
1357; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1358; GFX9-NEXT:    v_div_scale_f64 v[4:5], s[4:5], v[0:1], v[0:1], 1.0
1359; GFX9-NEXT:    v_div_scale_f64 v[6:7], s[4:5], v[2:3], v[2:3], 1.0
1360; GFX9-NEXT:    v_div_scale_f64 v[16:17], s[4:5], 1.0, v[2:3], 1.0
1361; GFX9-NEXT:    v_rcp_f64_e32 v[8:9], v[4:5]
1362; GFX9-NEXT:    v_rcp_f64_e32 v[10:11], v[6:7]
1363; GFX9-NEXT:    v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
1364; GFX9-NEXT:    v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
1365; GFX9-NEXT:    v_fma_f64 v[8:9], v[8:9], v[12:13], v[8:9]
1366; GFX9-NEXT:    v_div_scale_f64 v[12:13], vcc, 1.0, v[0:1], 1.0
1367; GFX9-NEXT:    v_fma_f64 v[10:11], v[10:11], v[14:15], v[10:11]
1368; GFX9-NEXT:    v_fma_f64 v[14:15], -v[4:5], v[8:9], 1.0
1369; GFX9-NEXT:    v_fma_f64 v[18:19], -v[6:7], v[10:11], 1.0
1370; GFX9-NEXT:    v_fma_f64 v[8:9], v[8:9], v[14:15], v[8:9]
1371; GFX9-NEXT:    v_fma_f64 v[10:11], v[10:11], v[18:19], v[10:11]
1372; GFX9-NEXT:    v_mul_f64 v[14:15], v[12:13], v[8:9]
1373; GFX9-NEXT:    v_mul_f64 v[18:19], v[16:17], v[10:11]
1374; GFX9-NEXT:    v_fma_f64 v[4:5], -v[4:5], v[14:15], v[12:13]
1375; GFX9-NEXT:    v_fma_f64 v[6:7], -v[6:7], v[18:19], v[16:17]
1376; GFX9-NEXT:    v_div_fmas_f64 v[4:5], v[4:5], v[8:9], v[14:15]
1377; GFX9-NEXT:    s_mov_b64 vcc, s[4:5]
1378; GFX9-NEXT:    v_div_fmas_f64 v[6:7], v[6:7], v[10:11], v[18:19]
1379; GFX9-NEXT:    v_div_fixup_f64 v[0:1], v[4:5], v[0:1], 1.0
1380; GFX9-NEXT:    v_div_fixup_f64 v[2:3], v[6:7], v[2:3], 1.0
1381; GFX9-NEXT:    s_setpc_b64 s[30:31]
1382;
1383; GFX10-LABEL: v_rcp_v2f64_arcp:
1384; GFX10:       ; %bb.0:
1385; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1386; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
1387; GFX10-NEXT:    v_div_scale_f64 v[4:5], s4, v[0:1], v[0:1], 1.0
1388; GFX10-NEXT:    v_div_scale_f64 v[6:7], s4, v[2:3], v[2:3], 1.0
1389; GFX10-NEXT:    v_div_scale_f64 v[16:17], vcc_lo, 1.0, v[0:1], 1.0
1390; GFX10-NEXT:    v_rcp_f64_e32 v[8:9], v[4:5]
1391; GFX10-NEXT:    v_rcp_f64_e32 v[10:11], v[6:7]
1392; GFX10-NEXT:    v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
1393; GFX10-NEXT:    v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
1394; GFX10-NEXT:    v_fma_f64 v[8:9], v[8:9], v[12:13], v[8:9]
1395; GFX10-NEXT:    v_fma_f64 v[10:11], v[10:11], v[14:15], v[10:11]
1396; GFX10-NEXT:    v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
1397; GFX10-NEXT:    v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
1398; GFX10-NEXT:    v_fma_f64 v[8:9], v[8:9], v[12:13], v[8:9]
1399; GFX10-NEXT:    v_div_scale_f64 v[12:13], s4, 1.0, v[2:3], 1.0
1400; GFX10-NEXT:    v_fma_f64 v[10:11], v[10:11], v[14:15], v[10:11]
1401; GFX10-NEXT:    v_mul_f64 v[14:15], v[16:17], v[8:9]
1402; GFX10-NEXT:    v_mul_f64 v[18:19], v[12:13], v[10:11]
1403; GFX10-NEXT:    v_fma_f64 v[4:5], -v[4:5], v[14:15], v[16:17]
1404; GFX10-NEXT:    v_fma_f64 v[6:7], -v[6:7], v[18:19], v[12:13]
1405; GFX10-NEXT:    v_div_fmas_f64 v[4:5], v[4:5], v[8:9], v[14:15]
1406; GFX10-NEXT:    s_mov_b32 vcc_lo, s4
1407; GFX10-NEXT:    v_div_fmas_f64 v[6:7], v[6:7], v[10:11], v[18:19]
1408; GFX10-NEXT:    v_div_fixup_f64 v[0:1], v[4:5], v[0:1], 1.0
1409; GFX10-NEXT:    v_div_fixup_f64 v[2:3], v[6:7], v[2:3], 1.0
1410; GFX10-NEXT:    s_setpc_b64 s[30:31]
1411;
1412; GFX11-LABEL: v_rcp_v2f64_arcp:
1413; GFX11:       ; %bb.0:
1414; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1415; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
1416; GFX11-NEXT:    v_div_scale_f64 v[4:5], null, v[0:1], v[0:1], 1.0
1417; GFX11-NEXT:    v_div_scale_f64 v[6:7], null, v[2:3], v[2:3], 1.0
1418; GFX11-NEXT:    v_div_scale_f64 v[16:17], vcc_lo, 1.0, v[0:1], 1.0
1419; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_2)
1420; GFX11-NEXT:    v_rcp_f64_e32 v[8:9], v[4:5]
1421; GFX11-NEXT:    v_rcp_f64_e32 v[10:11], v[6:7]
1422; GFX11-NEXT:    s_waitcnt_depctr 0xfff
1423; GFX11-NEXT:    v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
1424; GFX11-NEXT:    v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
1425; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
1426; GFX11-NEXT:    v_fma_f64 v[8:9], v[8:9], v[12:13], v[8:9]
1427; GFX11-NEXT:    v_fma_f64 v[10:11], v[10:11], v[14:15], v[10:11]
1428; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
1429; GFX11-NEXT:    v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
1430; GFX11-NEXT:    v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
1431; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_3)
1432; GFX11-NEXT:    v_fma_f64 v[8:9], v[8:9], v[12:13], v[8:9]
1433; GFX11-NEXT:    v_div_scale_f64 v[12:13], s0, 1.0, v[2:3], 1.0
1434; GFX11-NEXT:    v_fma_f64 v[10:11], v[10:11], v[14:15], v[10:11]
1435; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_2)
1436; GFX11-NEXT:    v_mul_f64 v[14:15], v[16:17], v[8:9]
1437; GFX11-NEXT:    v_mul_f64 v[18:19], v[12:13], v[10:11]
1438; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
1439; GFX11-NEXT:    v_fma_f64 v[4:5], -v[4:5], v[14:15], v[16:17]
1440; GFX11-NEXT:    v_fma_f64 v[6:7], -v[6:7], v[18:19], v[12:13]
1441; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2)
1442; GFX11-NEXT:    v_div_fmas_f64 v[4:5], v[4:5], v[8:9], v[14:15]
1443; GFX11-NEXT:    s_mov_b32 vcc_lo, s0
1444; GFX11-NEXT:    v_div_fmas_f64 v[6:7], v[6:7], v[10:11], v[18:19]
1445; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
1446; GFX11-NEXT:    v_div_fixup_f64 v[0:1], v[4:5], v[0:1], 1.0
1447; GFX11-NEXT:    v_div_fixup_f64 v[2:3], v[6:7], v[2:3], 1.0
1448; GFX11-NEXT:    s_setpc_b64 s[30:31]
1449  %fdiv = fdiv arcp <2 x double> <double 1.0, double 1.0>, %x
1450  ret <2 x double> %fdiv
1451}
1452
1453define <2 x double> @v_rcp_v2f64_arcp_afn(<2 x double> %x) {
1454; GCN-LABEL: v_rcp_v2f64_arcp_afn:
1455; GCN:       ; %bb.0:
1456; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1457; GCN-NEXT:    v_rcp_f64_e32 v[4:5], v[0:1]
1458; GCN-NEXT:    v_rcp_f64_e32 v[6:7], v[2:3]
1459; GCN-NEXT:    v_fma_f64 v[8:9], -v[0:1], v[4:5], 1.0
1460; GCN-NEXT:    v_fma_f64 v[10:11], -v[2:3], v[6:7], 1.0
1461; GCN-NEXT:    v_fma_f64 v[4:5], v[8:9], v[4:5], v[4:5]
1462; GCN-NEXT:    v_fma_f64 v[6:7], v[10:11], v[6:7], v[6:7]
1463; GCN-NEXT:    v_fma_f64 v[8:9], -v[0:1], v[4:5], 1.0
1464; GCN-NEXT:    v_fma_f64 v[10:11], -v[2:3], v[6:7], 1.0
1465; GCN-NEXT:    v_fma_f64 v[4:5], v[8:9], v[4:5], v[4:5]
1466; GCN-NEXT:    v_fma_f64 v[6:7], v[10:11], v[6:7], v[6:7]
1467; GCN-NEXT:    v_mul_f64 v[8:9], 1.0, v[4:5]
1468; GCN-NEXT:    v_mul_f64 v[10:11], 1.0, v[6:7]
1469; GCN-NEXT:    v_fma_f64 v[0:1], -v[0:1], v[8:9], 1.0
1470; GCN-NEXT:    v_fma_f64 v[2:3], -v[2:3], v[10:11], 1.0
1471; GCN-NEXT:    v_fma_f64 v[0:1], v[0:1], v[4:5], v[8:9]
1472; GCN-NEXT:    v_fma_f64 v[2:3], v[2:3], v[6:7], v[10:11]
1473; GCN-NEXT:    s_setpc_b64 s[30:31]
1474;
1475; GFX10-LABEL: v_rcp_v2f64_arcp_afn:
1476; GFX10:       ; %bb.0:
1477; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1478; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
1479; GFX10-NEXT:    v_rcp_f64_e32 v[4:5], v[0:1]
1480; GFX10-NEXT:    v_rcp_f64_e32 v[6:7], v[2:3]
1481; GFX10-NEXT:    v_fma_f64 v[8:9], -v[0:1], v[4:5], 1.0
1482; GFX10-NEXT:    v_fma_f64 v[10:11], -v[2:3], v[6:7], 1.0
1483; GFX10-NEXT:    v_fma_f64 v[4:5], v[8:9], v[4:5], v[4:5]
1484; GFX10-NEXT:    v_fma_f64 v[6:7], v[10:11], v[6:7], v[6:7]
1485; GFX10-NEXT:    v_fma_f64 v[8:9], -v[0:1], v[4:5], 1.0
1486; GFX10-NEXT:    v_fma_f64 v[10:11], -v[2:3], v[6:7], 1.0
1487; GFX10-NEXT:    v_fma_f64 v[4:5], v[8:9], v[4:5], v[4:5]
1488; GFX10-NEXT:    v_fma_f64 v[6:7], v[10:11], v[6:7], v[6:7]
1489; GFX10-NEXT:    v_mul_f64 v[8:9], 1.0, v[4:5]
1490; GFX10-NEXT:    v_mul_f64 v[10:11], 1.0, v[6:7]
1491; GFX10-NEXT:    v_fma_f64 v[0:1], -v[0:1], v[8:9], 1.0
1492; GFX10-NEXT:    v_fma_f64 v[2:3], -v[2:3], v[10:11], 1.0
1493; GFX10-NEXT:    v_fma_f64 v[0:1], v[0:1], v[4:5], v[8:9]
1494; GFX10-NEXT:    v_fma_f64 v[2:3], v[2:3], v[6:7], v[10:11]
1495; GFX10-NEXT:    s_setpc_b64 s[30:31]
1496;
1497; GFX11-LABEL: v_rcp_v2f64_arcp_afn:
1498; GFX11:       ; %bb.0:
1499; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1500; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
1501; GFX11-NEXT:    v_rcp_f64_e32 v[4:5], v[0:1]
1502; GFX11-NEXT:    v_rcp_f64_e32 v[6:7], v[2:3]
1503; GFX11-NEXT:    s_waitcnt_depctr 0xfff
1504; GFX11-NEXT:    v_fma_f64 v[8:9], -v[0:1], v[4:5], 1.0
1505; GFX11-NEXT:    v_fma_f64 v[10:11], -v[2:3], v[6:7], 1.0
1506; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
1507; GFX11-NEXT:    v_fma_f64 v[4:5], v[8:9], v[4:5], v[4:5]
1508; GFX11-NEXT:    v_fma_f64 v[6:7], v[10:11], v[6:7], v[6:7]
1509; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
1510; GFX11-NEXT:    v_fma_f64 v[8:9], -v[0:1], v[4:5], 1.0
1511; GFX11-NEXT:    v_fma_f64 v[10:11], -v[2:3], v[6:7], 1.0
1512; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
1513; GFX11-NEXT:    v_fma_f64 v[4:5], v[8:9], v[4:5], v[4:5]
1514; GFX11-NEXT:    v_fma_f64 v[6:7], v[10:11], v[6:7], v[6:7]
1515; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
1516; GFX11-NEXT:    v_mul_f64 v[8:9], 1.0, v[4:5]
1517; GFX11-NEXT:    v_mul_f64 v[10:11], 1.0, v[6:7]
1518; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
1519; GFX11-NEXT:    v_fma_f64 v[0:1], -v[0:1], v[8:9], 1.0
1520; GFX11-NEXT:    v_fma_f64 v[2:3], -v[2:3], v[10:11], 1.0
1521; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
1522; GFX11-NEXT:    v_fma_f64 v[0:1], v[0:1], v[4:5], v[8:9]
1523; GFX11-NEXT:    v_fma_f64 v[2:3], v[2:3], v[6:7], v[10:11]
1524; GFX11-NEXT:    s_setpc_b64 s[30:31]
1525  %fdiv = fdiv arcp afn <2 x double> <double 1.0, double 1.0>, %x
1526  ret <2 x double> %fdiv
1527}
1528
1529define <2 x double> @v_rcp_v2f64_ulp25(<2 x double> %x) {
1530; GFX6-LABEL: v_rcp_v2f64_ulp25:
1531; GFX6:       ; %bb.0:
1532; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1533; GFX6-NEXT:    v_div_scale_f64 v[4:5], s[4:5], v[0:1], v[0:1], 1.0
1534; GFX6-NEXT:    v_div_scale_f64 v[10:11], s[4:5], v[2:3], v[2:3], 1.0
1535; GFX6-NEXT:    v_rcp_f64_e32 v[6:7], v[4:5]
1536; GFX6-NEXT:    v_mov_b32_e32 v18, 0x3ff00000
1537; GFX6-NEXT:    v_rcp_f64_e32 v[14:15], v[10:11]
1538; GFX6-NEXT:    v_fma_f64 v[8:9], -v[4:5], v[6:7], 1.0
1539; GFX6-NEXT:    v_fma_f64 v[16:17], -v[10:11], v[14:15], 1.0
1540; GFX6-NEXT:    v_fma_f64 v[6:7], v[6:7], v[8:9], v[6:7]
1541; GFX6-NEXT:    v_div_scale_f64 v[8:9], s[4:5], 1.0, v[0:1], 1.0
1542; GFX6-NEXT:    v_fma_f64 v[12:13], -v[4:5], v[6:7], 1.0
1543; GFX6-NEXT:    v_fma_f64 v[14:15], v[14:15], v[16:17], v[14:15]
1544; GFX6-NEXT:    v_fma_f64 v[6:7], v[6:7], v[12:13], v[6:7]
1545; GFX6-NEXT:    v_cmp_eq_u32_e32 vcc, v18, v9
1546; GFX6-NEXT:    v_mul_f64 v[12:13], v[8:9], v[6:7]
1547; GFX6-NEXT:    v_cmp_eq_u32_e64 s[4:5], v1, v5
1548; GFX6-NEXT:    v_fma_f64 v[8:9], -v[4:5], v[12:13], v[8:9]
1549; GFX6-NEXT:    v_fma_f64 v[4:5], -v[10:11], v[14:15], 1.0
1550; GFX6-NEXT:    v_div_scale_f64 v[16:17], s[6:7], 1.0, v[2:3], 1.0
1551; GFX6-NEXT:    v_fma_f64 v[4:5], v[14:15], v[4:5], v[14:15]
1552; GFX6-NEXT:    s_xor_b64 vcc, vcc, s[4:5]
1553; GFX6-NEXT:    v_mul_f64 v[14:15], v[16:17], v[4:5]
1554; GFX6-NEXT:    v_div_fmas_f64 v[6:7], v[8:9], v[6:7], v[12:13]
1555; GFX6-NEXT:    v_fma_f64 v[8:9], -v[10:11], v[14:15], v[16:17]
1556; GFX6-NEXT:    v_cmp_eq_u32_e32 vcc, v18, v17
1557; GFX6-NEXT:    v_cmp_eq_u32_e64 s[4:5], v3, v11
1558; GFX6-NEXT:    s_xor_b64 vcc, vcc, s[4:5]
1559; GFX6-NEXT:    v_div_fixup_f64 v[0:1], v[6:7], v[0:1], 1.0
1560; GFX6-NEXT:    s_nop 0
1561; GFX6-NEXT:    v_div_fmas_f64 v[4:5], v[8:9], v[4:5], v[14:15]
1562; GFX6-NEXT:    v_div_fixup_f64 v[2:3], v[4:5], v[2:3], 1.0
1563; GFX6-NEXT:    s_setpc_b64 s[30:31]
1564;
1565; GFX8-LABEL: v_rcp_v2f64_ulp25:
1566; GFX8:       ; %bb.0:
1567; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1568; GFX8-NEXT:    v_div_scale_f64 v[4:5], s[4:5], v[0:1], v[0:1], 1.0
1569; GFX8-NEXT:    v_div_scale_f64 v[6:7], s[4:5], v[2:3], v[2:3], 1.0
1570; GFX8-NEXT:    v_div_scale_f64 v[16:17], s[4:5], 1.0, v[2:3], 1.0
1571; GFX8-NEXT:    v_rcp_f64_e32 v[8:9], v[4:5]
1572; GFX8-NEXT:    v_rcp_f64_e32 v[10:11], v[6:7]
1573; GFX8-NEXT:    v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
1574; GFX8-NEXT:    v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
1575; GFX8-NEXT:    v_fma_f64 v[8:9], v[8:9], v[12:13], v[8:9]
1576; GFX8-NEXT:    v_div_scale_f64 v[12:13], vcc, 1.0, v[0:1], 1.0
1577; GFX8-NEXT:    v_fma_f64 v[10:11], v[10:11], v[14:15], v[10:11]
1578; GFX8-NEXT:    v_fma_f64 v[14:15], -v[4:5], v[8:9], 1.0
1579; GFX8-NEXT:    v_fma_f64 v[18:19], -v[6:7], v[10:11], 1.0
1580; GFX8-NEXT:    v_fma_f64 v[8:9], v[8:9], v[14:15], v[8:9]
1581; GFX8-NEXT:    v_fma_f64 v[10:11], v[10:11], v[18:19], v[10:11]
1582; GFX8-NEXT:    v_mul_f64 v[14:15], v[12:13], v[8:9]
1583; GFX8-NEXT:    v_mul_f64 v[18:19], v[16:17], v[10:11]
1584; GFX8-NEXT:    v_fma_f64 v[4:5], -v[4:5], v[14:15], v[12:13]
1585; GFX8-NEXT:    v_fma_f64 v[6:7], -v[6:7], v[18:19], v[16:17]
1586; GFX8-NEXT:    v_div_fmas_f64 v[4:5], v[4:5], v[8:9], v[14:15]
1587; GFX8-NEXT:    s_mov_b64 vcc, s[4:5]
1588; GFX8-NEXT:    v_div_fmas_f64 v[6:7], v[6:7], v[10:11], v[18:19]
1589; GFX8-NEXT:    v_div_fixup_f64 v[0:1], v[4:5], v[0:1], 1.0
1590; GFX8-NEXT:    v_div_fixup_f64 v[2:3], v[6:7], v[2:3], 1.0
1591; GFX8-NEXT:    s_setpc_b64 s[30:31]
1592;
1593; GFX9-LABEL: v_rcp_v2f64_ulp25:
1594; GFX9:       ; %bb.0:
1595; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1596; GFX9-NEXT:    v_div_scale_f64 v[4:5], s[4:5], v[0:1], v[0:1], 1.0
1597; GFX9-NEXT:    v_div_scale_f64 v[6:7], s[4:5], v[2:3], v[2:3], 1.0
1598; GFX9-NEXT:    v_div_scale_f64 v[16:17], s[4:5], 1.0, v[2:3], 1.0
1599; GFX9-NEXT:    v_rcp_f64_e32 v[8:9], v[4:5]
1600; GFX9-NEXT:    v_rcp_f64_e32 v[10:11], v[6:7]
1601; GFX9-NEXT:    v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
1602; GFX9-NEXT:    v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
1603; GFX9-NEXT:    v_fma_f64 v[8:9], v[8:9], v[12:13], v[8:9]
1604; GFX9-NEXT:    v_div_scale_f64 v[12:13], vcc, 1.0, v[0:1], 1.0
1605; GFX9-NEXT:    v_fma_f64 v[10:11], v[10:11], v[14:15], v[10:11]
1606; GFX9-NEXT:    v_fma_f64 v[14:15], -v[4:5], v[8:9], 1.0
1607; GFX9-NEXT:    v_fma_f64 v[18:19], -v[6:7], v[10:11], 1.0
1608; GFX9-NEXT:    v_fma_f64 v[8:9], v[8:9], v[14:15], v[8:9]
1609; GFX9-NEXT:    v_fma_f64 v[10:11], v[10:11], v[18:19], v[10:11]
1610; GFX9-NEXT:    v_mul_f64 v[14:15], v[12:13], v[8:9]
1611; GFX9-NEXT:    v_mul_f64 v[18:19], v[16:17], v[10:11]
1612; GFX9-NEXT:    v_fma_f64 v[4:5], -v[4:5], v[14:15], v[12:13]
1613; GFX9-NEXT:    v_fma_f64 v[6:7], -v[6:7], v[18:19], v[16:17]
1614; GFX9-NEXT:    v_div_fmas_f64 v[4:5], v[4:5], v[8:9], v[14:15]
1615; GFX9-NEXT:    s_mov_b64 vcc, s[4:5]
1616; GFX9-NEXT:    v_div_fmas_f64 v[6:7], v[6:7], v[10:11], v[18:19]
1617; GFX9-NEXT:    v_div_fixup_f64 v[0:1], v[4:5], v[0:1], 1.0
1618; GFX9-NEXT:    v_div_fixup_f64 v[2:3], v[6:7], v[2:3], 1.0
1619; GFX9-NEXT:    s_setpc_b64 s[30:31]
1620;
1621; GFX10-LABEL: v_rcp_v2f64_ulp25:
1622; GFX10:       ; %bb.0:
1623; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1624; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
1625; GFX10-NEXT:    v_div_scale_f64 v[4:5], s4, v[0:1], v[0:1], 1.0
1626; GFX10-NEXT:    v_div_scale_f64 v[6:7], s4, v[2:3], v[2:3], 1.0
1627; GFX10-NEXT:    v_div_scale_f64 v[16:17], vcc_lo, 1.0, v[0:1], 1.0
1628; GFX10-NEXT:    v_rcp_f64_e32 v[8:9], v[4:5]
1629; GFX10-NEXT:    v_rcp_f64_e32 v[10:11], v[6:7]
1630; GFX10-NEXT:    v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
1631; GFX10-NEXT:    v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
1632; GFX10-NEXT:    v_fma_f64 v[8:9], v[8:9], v[12:13], v[8:9]
1633; GFX10-NEXT:    v_fma_f64 v[10:11], v[10:11], v[14:15], v[10:11]
1634; GFX10-NEXT:    v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
1635; GFX10-NEXT:    v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
1636; GFX10-NEXT:    v_fma_f64 v[8:9], v[8:9], v[12:13], v[8:9]
1637; GFX10-NEXT:    v_div_scale_f64 v[12:13], s4, 1.0, v[2:3], 1.0
1638; GFX10-NEXT:    v_fma_f64 v[10:11], v[10:11], v[14:15], v[10:11]
1639; GFX10-NEXT:    v_mul_f64 v[14:15], v[16:17], v[8:9]
1640; GFX10-NEXT:    v_mul_f64 v[18:19], v[12:13], v[10:11]
1641; GFX10-NEXT:    v_fma_f64 v[4:5], -v[4:5], v[14:15], v[16:17]
1642; GFX10-NEXT:    v_fma_f64 v[6:7], -v[6:7], v[18:19], v[12:13]
1643; GFX10-NEXT:    v_div_fmas_f64 v[4:5], v[4:5], v[8:9], v[14:15]
1644; GFX10-NEXT:    s_mov_b32 vcc_lo, s4
1645; GFX10-NEXT:    v_div_fmas_f64 v[6:7], v[6:7], v[10:11], v[18:19]
1646; GFX10-NEXT:    v_div_fixup_f64 v[0:1], v[4:5], v[0:1], 1.0
1647; GFX10-NEXT:    v_div_fixup_f64 v[2:3], v[6:7], v[2:3], 1.0
1648; GFX10-NEXT:    s_setpc_b64 s[30:31]
1649;
1650; GFX11-LABEL: v_rcp_v2f64_ulp25:
1651; GFX11:       ; %bb.0:
1652; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1653; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
1654; GFX11-NEXT:    v_div_scale_f64 v[4:5], null, v[0:1], v[0:1], 1.0
1655; GFX11-NEXT:    v_div_scale_f64 v[6:7], null, v[2:3], v[2:3], 1.0
1656; GFX11-NEXT:    v_div_scale_f64 v[16:17], vcc_lo, 1.0, v[0:1], 1.0
1657; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_2)
1658; GFX11-NEXT:    v_rcp_f64_e32 v[8:9], v[4:5]
1659; GFX11-NEXT:    v_rcp_f64_e32 v[10:11], v[6:7]
1660; GFX11-NEXT:    s_waitcnt_depctr 0xfff
1661; GFX11-NEXT:    v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
1662; GFX11-NEXT:    v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
1663; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
1664; GFX11-NEXT:    v_fma_f64 v[8:9], v[8:9], v[12:13], v[8:9]
1665; GFX11-NEXT:    v_fma_f64 v[10:11], v[10:11], v[14:15], v[10:11]
1666; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
1667; GFX11-NEXT:    v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
1668; GFX11-NEXT:    v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
1669; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_3)
1670; GFX11-NEXT:    v_fma_f64 v[8:9], v[8:9], v[12:13], v[8:9]
1671; GFX11-NEXT:    v_div_scale_f64 v[12:13], s0, 1.0, v[2:3], 1.0
1672; GFX11-NEXT:    v_fma_f64 v[10:11], v[10:11], v[14:15], v[10:11]
1673; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_2)
1674; GFX11-NEXT:    v_mul_f64 v[14:15], v[16:17], v[8:9]
1675; GFX11-NEXT:    v_mul_f64 v[18:19], v[12:13], v[10:11]
1676; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
1677; GFX11-NEXT:    v_fma_f64 v[4:5], -v[4:5], v[14:15], v[16:17]
1678; GFX11-NEXT:    v_fma_f64 v[6:7], -v[6:7], v[18:19], v[12:13]
1679; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2)
1680; GFX11-NEXT:    v_div_fmas_f64 v[4:5], v[4:5], v[8:9], v[14:15]
1681; GFX11-NEXT:    s_mov_b32 vcc_lo, s0
1682; GFX11-NEXT:    v_div_fmas_f64 v[6:7], v[6:7], v[10:11], v[18:19]
1683; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
1684; GFX11-NEXT:    v_div_fixup_f64 v[0:1], v[4:5], v[0:1], 1.0
1685; GFX11-NEXT:    v_div_fixup_f64 v[2:3], v[6:7], v[2:3], 1.0
1686; GFX11-NEXT:    s_setpc_b64 s[30:31]
1687  %fdiv = fdiv <2 x double> <double 1.0, double 1.0>, %x, !fpmath !0
1688  ret <2 x double> %fdiv
1689}
1690
1691define <2 x double> @v_fdiv_v2f64_afn_ulp25(<2 x double> %a, <2 x double> %b) {
1692; GCN-LABEL: v_fdiv_v2f64_afn_ulp25:
1693; GCN:       ; %bb.0:
1694; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1695; GCN-NEXT:    v_rcp_f64_e32 v[8:9], v[4:5]
1696; GCN-NEXT:    v_rcp_f64_e32 v[10:11], v[6:7]
1697; GCN-NEXT:    v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
1698; GCN-NEXT:    v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
1699; GCN-NEXT:    v_fma_f64 v[8:9], v[12:13], v[8:9], v[8:9]
1700; GCN-NEXT:    v_fma_f64 v[10:11], v[14:15], v[10:11], v[10:11]
1701; GCN-NEXT:    v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
1702; GCN-NEXT:    v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
1703; GCN-NEXT:    v_fma_f64 v[8:9], v[12:13], v[8:9], v[8:9]
1704; GCN-NEXT:    v_fma_f64 v[10:11], v[14:15], v[10:11], v[10:11]
1705; GCN-NEXT:    v_mul_f64 v[12:13], v[0:1], v[8:9]
1706; GCN-NEXT:    v_mul_f64 v[14:15], v[2:3], v[10:11]
1707; GCN-NEXT:    v_fma_f64 v[0:1], -v[4:5], v[12:13], v[0:1]
1708; GCN-NEXT:    v_fma_f64 v[2:3], -v[6:7], v[14:15], v[2:3]
1709; GCN-NEXT:    v_fma_f64 v[0:1], v[0:1], v[8:9], v[12:13]
1710; GCN-NEXT:    v_fma_f64 v[2:3], v[2:3], v[10:11], v[14:15]
1711; GCN-NEXT:    s_setpc_b64 s[30:31]
1712;
1713; GFX10-LABEL: v_fdiv_v2f64_afn_ulp25:
1714; GFX10:       ; %bb.0:
1715; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1716; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
1717; GFX10-NEXT:    v_rcp_f64_e32 v[8:9], v[4:5]
1718; GFX10-NEXT:    v_rcp_f64_e32 v[10:11], v[6:7]
1719; GFX10-NEXT:    v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
1720; GFX10-NEXT:    v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
1721; GFX10-NEXT:    v_fma_f64 v[8:9], v[12:13], v[8:9], v[8:9]
1722; GFX10-NEXT:    v_fma_f64 v[10:11], v[14:15], v[10:11], v[10:11]
1723; GFX10-NEXT:    v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
1724; GFX10-NEXT:    v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
1725; GFX10-NEXT:    v_fma_f64 v[8:9], v[12:13], v[8:9], v[8:9]
1726; GFX10-NEXT:    v_fma_f64 v[10:11], v[14:15], v[10:11], v[10:11]
1727; GFX10-NEXT:    v_mul_f64 v[12:13], v[0:1], v[8:9]
1728; GFX10-NEXT:    v_mul_f64 v[14:15], v[2:3], v[10:11]
1729; GFX10-NEXT:    v_fma_f64 v[0:1], -v[4:5], v[12:13], v[0:1]
1730; GFX10-NEXT:    v_fma_f64 v[2:3], -v[6:7], v[14:15], v[2:3]
1731; GFX10-NEXT:    v_fma_f64 v[0:1], v[0:1], v[8:9], v[12:13]
1732; GFX10-NEXT:    v_fma_f64 v[2:3], v[2:3], v[10:11], v[14:15]
1733; GFX10-NEXT:    s_setpc_b64 s[30:31]
1734;
1735; GFX11-LABEL: v_fdiv_v2f64_afn_ulp25:
1736; GFX11:       ; %bb.0:
1737; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1738; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
1739; GFX11-NEXT:    v_rcp_f64_e32 v[8:9], v[4:5]
1740; GFX11-NEXT:    v_rcp_f64_e32 v[10:11], v[6:7]
1741; GFX11-NEXT:    s_waitcnt_depctr 0xfff
1742; GFX11-NEXT:    v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
1743; GFX11-NEXT:    v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
1744; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
1745; GFX11-NEXT:    v_fma_f64 v[8:9], v[12:13], v[8:9], v[8:9]
1746; GFX11-NEXT:    v_fma_f64 v[10:11], v[14:15], v[10:11], v[10:11]
1747; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
1748; GFX11-NEXT:    v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
1749; GFX11-NEXT:    v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
1750; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
1751; GFX11-NEXT:    v_fma_f64 v[8:9], v[12:13], v[8:9], v[8:9]
1752; GFX11-NEXT:    v_fma_f64 v[10:11], v[14:15], v[10:11], v[10:11]
1753; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
1754; GFX11-NEXT:    v_mul_f64 v[12:13], v[0:1], v[8:9]
1755; GFX11-NEXT:    v_mul_f64 v[14:15], v[2:3], v[10:11]
1756; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
1757; GFX11-NEXT:    v_fma_f64 v[0:1], -v[4:5], v[12:13], v[0:1]
1758; GFX11-NEXT:    v_fma_f64 v[2:3], -v[6:7], v[14:15], v[2:3]
1759; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
1760; GFX11-NEXT:    v_fma_f64 v[0:1], v[0:1], v[8:9], v[12:13]
1761; GFX11-NEXT:    v_fma_f64 v[2:3], v[2:3], v[10:11], v[14:15]
1762; GFX11-NEXT:    s_setpc_b64 s[30:31]
1763  %fdiv = fdiv afn <2 x double> %a, %b, !fpmath !0
1764  ret <2 x double> %fdiv
1765}
1766
1767define <2 x double> @v_fdiv_v2f64_arcp_ulp25(<2 x double> %a, <2 x double> %b) {
1768; GFX6-LABEL: v_fdiv_v2f64_arcp_ulp25:
1769; GFX6:       ; %bb.0:
1770; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1771; GFX6-NEXT:    v_div_scale_f64 v[8:9], s[4:5], v[4:5], v[4:5], v[0:1]
1772; GFX6-NEXT:    v_div_scale_f64 v[14:15], s[4:5], v[6:7], v[6:7], v[2:3]
1773; GFX6-NEXT:    v_rcp_f64_e32 v[10:11], v[8:9]
1774; GFX6-NEXT:    v_div_scale_f64 v[18:19], s[4:5], v[0:1], v[4:5], v[0:1]
1775; GFX6-NEXT:    v_rcp_f64_e32 v[16:17], v[14:15]
1776; GFX6-NEXT:    v_fma_f64 v[12:13], -v[8:9], v[10:11], 1.0
1777; GFX6-NEXT:    v_cmp_eq_u32_e32 vcc, v1, v19
1778; GFX6-NEXT:    v_fma_f64 v[10:11], v[10:11], v[12:13], v[10:11]
1779; GFX6-NEXT:    v_cmp_eq_u32_e64 s[4:5], v5, v9
1780; GFX6-NEXT:    v_fma_f64 v[12:13], -v[8:9], v[10:11], 1.0
1781; GFX6-NEXT:    s_xor_b64 vcc, vcc, s[4:5]
1782; GFX6-NEXT:    v_fma_f64 v[10:11], v[10:11], v[12:13], v[10:11]
1783; GFX6-NEXT:    v_fma_f64 v[12:13], -v[14:15], v[16:17], 1.0
1784; GFX6-NEXT:    v_cmp_eq_u32_e64 s[4:5], v7, v15
1785; GFX6-NEXT:    v_fma_f64 v[12:13], v[16:17], v[12:13], v[16:17]
1786; GFX6-NEXT:    v_mul_f64 v[16:17], v[18:19], v[10:11]
1787; GFX6-NEXT:    v_fma_f64 v[18:19], -v[8:9], v[16:17], v[18:19]
1788; GFX6-NEXT:    v_fma_f64 v[8:9], -v[14:15], v[12:13], 1.0
1789; GFX6-NEXT:    v_div_fmas_f64 v[10:11], v[18:19], v[10:11], v[16:17]
1790; GFX6-NEXT:    v_fma_f64 v[8:9], v[12:13], v[8:9], v[12:13]
1791; GFX6-NEXT:    v_div_scale_f64 v[12:13], s[6:7], v[2:3], v[6:7], v[2:3]
1792; GFX6-NEXT:    v_div_fixup_f64 v[0:1], v[10:11], v[4:5], v[0:1]
1793; GFX6-NEXT:    v_mul_f64 v[16:17], v[12:13], v[8:9]
1794; GFX6-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v13
1795; GFX6-NEXT:    v_fma_f64 v[18:19], -v[14:15], v[16:17], v[12:13]
1796; GFX6-NEXT:    s_xor_b64 vcc, vcc, s[4:5]
1797; GFX6-NEXT:    s_nop 1
1798; GFX6-NEXT:    v_div_fmas_f64 v[8:9], v[18:19], v[8:9], v[16:17]
1799; GFX6-NEXT:    v_div_fixup_f64 v[2:3], v[8:9], v[6:7], v[2:3]
1800; GFX6-NEXT:    s_setpc_b64 s[30:31]
1801;
1802; GFX8-LABEL: v_fdiv_v2f64_arcp_ulp25:
1803; GFX8:       ; %bb.0:
1804; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1805; GFX8-NEXT:    v_div_scale_f64 v[8:9], s[4:5], v[4:5], v[4:5], v[0:1]
1806; GFX8-NEXT:    v_div_scale_f64 v[10:11], s[4:5], v[6:7], v[6:7], v[2:3]
1807; GFX8-NEXT:    v_rcp_f64_e32 v[12:13], v[8:9]
1808; GFX8-NEXT:    v_rcp_f64_e32 v[14:15], v[10:11]
1809; GFX8-NEXT:    v_fma_f64 v[16:17], -v[8:9], v[12:13], 1.0
1810; GFX8-NEXT:    v_fma_f64 v[18:19], -v[10:11], v[14:15], 1.0
1811; GFX8-NEXT:    v_fma_f64 v[12:13], v[12:13], v[16:17], v[12:13]
1812; GFX8-NEXT:    v_fma_f64 v[14:15], v[14:15], v[18:19], v[14:15]
1813; GFX8-NEXT:    v_div_scale_f64 v[18:19], vcc, v[0:1], v[4:5], v[0:1]
1814; GFX8-NEXT:    v_fma_f64 v[16:17], -v[8:9], v[12:13], 1.0
1815; GFX8-NEXT:    v_fma_f64 v[12:13], v[12:13], v[16:17], v[12:13]
1816; GFX8-NEXT:    v_fma_f64 v[16:17], -v[10:11], v[14:15], 1.0
1817; GFX8-NEXT:    v_fma_f64 v[14:15], v[14:15], v[16:17], v[14:15]
1818; GFX8-NEXT:    v_mul_f64 v[16:17], v[18:19], v[12:13]
1819; GFX8-NEXT:    v_fma_f64 v[8:9], -v[8:9], v[16:17], v[18:19]
1820; GFX8-NEXT:    v_div_scale_f64 v[18:19], s[4:5], v[2:3], v[6:7], v[2:3]
1821; GFX8-NEXT:    v_div_fmas_f64 v[8:9], v[8:9], v[12:13], v[16:17]
1822; GFX8-NEXT:    s_mov_b64 vcc, s[4:5]
1823; GFX8-NEXT:    v_mul_f64 v[20:21], v[18:19], v[14:15]
1824; GFX8-NEXT:    v_div_fixup_f64 v[0:1], v[8:9], v[4:5], v[0:1]
1825; GFX8-NEXT:    v_fma_f64 v[10:11], -v[10:11], v[20:21], v[18:19]
1826; GFX8-NEXT:    v_div_fmas_f64 v[10:11], v[10:11], v[14:15], v[20:21]
1827; GFX8-NEXT:    v_div_fixup_f64 v[2:3], v[10:11], v[6:7], v[2:3]
1828; GFX8-NEXT:    s_setpc_b64 s[30:31]
1829;
1830; GFX9-LABEL: v_fdiv_v2f64_arcp_ulp25:
1831; GFX9:       ; %bb.0:
1832; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1833; GFX9-NEXT:    v_div_scale_f64 v[8:9], s[4:5], v[4:5], v[4:5], v[0:1]
1834; GFX9-NEXT:    v_div_scale_f64 v[10:11], s[4:5], v[6:7], v[6:7], v[2:3]
1835; GFX9-NEXT:    v_rcp_f64_e32 v[12:13], v[8:9]
1836; GFX9-NEXT:    v_rcp_f64_e32 v[14:15], v[10:11]
1837; GFX9-NEXT:    v_fma_f64 v[16:17], -v[8:9], v[12:13], 1.0
1838; GFX9-NEXT:    v_fma_f64 v[18:19], -v[10:11], v[14:15], 1.0
1839; GFX9-NEXT:    v_fma_f64 v[12:13], v[12:13], v[16:17], v[12:13]
1840; GFX9-NEXT:    v_fma_f64 v[14:15], v[14:15], v[18:19], v[14:15]
1841; GFX9-NEXT:    v_div_scale_f64 v[18:19], vcc, v[0:1], v[4:5], v[0:1]
1842; GFX9-NEXT:    v_fma_f64 v[16:17], -v[8:9], v[12:13], 1.0
1843; GFX9-NEXT:    v_fma_f64 v[12:13], v[12:13], v[16:17], v[12:13]
1844; GFX9-NEXT:    v_fma_f64 v[16:17], -v[10:11], v[14:15], 1.0
1845; GFX9-NEXT:    v_fma_f64 v[14:15], v[14:15], v[16:17], v[14:15]
1846; GFX9-NEXT:    v_mul_f64 v[16:17], v[18:19], v[12:13]
1847; GFX9-NEXT:    v_fma_f64 v[8:9], -v[8:9], v[16:17], v[18:19]
1848; GFX9-NEXT:    v_div_scale_f64 v[18:19], s[4:5], v[2:3], v[6:7], v[2:3]
1849; GFX9-NEXT:    v_div_fmas_f64 v[8:9], v[8:9], v[12:13], v[16:17]
1850; GFX9-NEXT:    s_mov_b64 vcc, s[4:5]
1851; GFX9-NEXT:    v_mul_f64 v[20:21], v[18:19], v[14:15]
1852; GFX9-NEXT:    v_div_fixup_f64 v[0:1], v[8:9], v[4:5], v[0:1]
1853; GFX9-NEXT:    v_fma_f64 v[10:11], -v[10:11], v[20:21], v[18:19]
1854; GFX9-NEXT:    v_div_fmas_f64 v[10:11], v[10:11], v[14:15], v[20:21]
1855; GFX9-NEXT:    v_div_fixup_f64 v[2:3], v[10:11], v[6:7], v[2:3]
1856; GFX9-NEXT:    s_setpc_b64 s[30:31]
1857;
1858; GFX10-LABEL: v_fdiv_v2f64_arcp_ulp25:
1859; GFX10:       ; %bb.0:
1860; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1861; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
1862; GFX10-NEXT:    v_div_scale_f64 v[8:9], s4, v[4:5], v[4:5], v[0:1]
1863; GFX10-NEXT:    v_div_scale_f64 v[10:11], s4, v[6:7], v[6:7], v[2:3]
1864; GFX10-NEXT:    v_div_scale_f64 v[20:21], vcc_lo, v[0:1], v[4:5], v[0:1]
1865; GFX10-NEXT:    v_rcp_f64_e32 v[12:13], v[8:9]
1866; GFX10-NEXT:    v_rcp_f64_e32 v[14:15], v[10:11]
1867; GFX10-NEXT:    v_fma_f64 v[16:17], -v[8:9], v[12:13], 1.0
1868; GFX10-NEXT:    v_fma_f64 v[18:19], -v[10:11], v[14:15], 1.0
1869; GFX10-NEXT:    v_fma_f64 v[12:13], v[12:13], v[16:17], v[12:13]
1870; GFX10-NEXT:    v_fma_f64 v[14:15], v[14:15], v[18:19], v[14:15]
1871; GFX10-NEXT:    v_fma_f64 v[16:17], -v[8:9], v[12:13], 1.0
1872; GFX10-NEXT:    v_fma_f64 v[18:19], -v[10:11], v[14:15], 1.0
1873; GFX10-NEXT:    v_fma_f64 v[12:13], v[12:13], v[16:17], v[12:13]
1874; GFX10-NEXT:    v_div_scale_f64 v[16:17], s4, v[2:3], v[6:7], v[2:3]
1875; GFX10-NEXT:    v_fma_f64 v[14:15], v[14:15], v[18:19], v[14:15]
1876; GFX10-NEXT:    v_mul_f64 v[18:19], v[20:21], v[12:13]
1877; GFX10-NEXT:    v_mul_f64 v[22:23], v[16:17], v[14:15]
1878; GFX10-NEXT:    v_fma_f64 v[8:9], -v[8:9], v[18:19], v[20:21]
1879; GFX10-NEXT:    v_fma_f64 v[10:11], -v[10:11], v[22:23], v[16:17]
1880; GFX10-NEXT:    v_div_fmas_f64 v[8:9], v[8:9], v[12:13], v[18:19]
1881; GFX10-NEXT:    s_mov_b32 vcc_lo, s4
1882; GFX10-NEXT:    v_div_fmas_f64 v[10:11], v[10:11], v[14:15], v[22:23]
1883; GFX10-NEXT:    v_div_fixup_f64 v[0:1], v[8:9], v[4:5], v[0:1]
1884; GFX10-NEXT:    v_div_fixup_f64 v[2:3], v[10:11], v[6:7], v[2:3]
1885; GFX10-NEXT:    s_setpc_b64 s[30:31]
1886;
1887; GFX11-LABEL: v_fdiv_v2f64_arcp_ulp25:
1888; GFX11:       ; %bb.0:
1889; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1890; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
1891; GFX11-NEXT:    v_div_scale_f64 v[8:9], null, v[4:5], v[4:5], v[0:1]
1892; GFX11-NEXT:    v_div_scale_f64 v[10:11], null, v[6:7], v[6:7], v[2:3]
1893; GFX11-NEXT:    v_div_scale_f64 v[20:21], vcc_lo, v[0:1], v[4:5], v[0:1]
1894; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_2)
1895; GFX11-NEXT:    v_rcp_f64_e32 v[12:13], v[8:9]
1896; GFX11-NEXT:    v_rcp_f64_e32 v[14:15], v[10:11]
1897; GFX11-NEXT:    s_waitcnt_depctr 0xfff
1898; GFX11-NEXT:    v_fma_f64 v[16:17], -v[8:9], v[12:13], 1.0
1899; GFX11-NEXT:    v_fma_f64 v[18:19], -v[10:11], v[14:15], 1.0
1900; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
1901; GFX11-NEXT:    v_fma_f64 v[12:13], v[12:13], v[16:17], v[12:13]
1902; GFX11-NEXT:    v_fma_f64 v[14:15], v[14:15], v[18:19], v[14:15]
1903; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
1904; GFX11-NEXT:    v_fma_f64 v[16:17], -v[8:9], v[12:13], 1.0
1905; GFX11-NEXT:    v_fma_f64 v[18:19], -v[10:11], v[14:15], 1.0
1906; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_3)
1907; GFX11-NEXT:    v_fma_f64 v[12:13], v[12:13], v[16:17], v[12:13]
1908; GFX11-NEXT:    v_div_scale_f64 v[16:17], s0, v[2:3], v[6:7], v[2:3]
1909; GFX11-NEXT:    v_fma_f64 v[14:15], v[14:15], v[18:19], v[14:15]
1910; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_2)
1911; GFX11-NEXT:    v_mul_f64 v[18:19], v[20:21], v[12:13]
1912; GFX11-NEXT:    v_mul_f64 v[22:23], v[16:17], v[14:15]
1913; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
1914; GFX11-NEXT:    v_fma_f64 v[8:9], -v[8:9], v[18:19], v[20:21]
1915; GFX11-NEXT:    v_fma_f64 v[10:11], -v[10:11], v[22:23], v[16:17]
1916; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2)
1917; GFX11-NEXT:    v_div_fmas_f64 v[8:9], v[8:9], v[12:13], v[18:19]
1918; GFX11-NEXT:    s_mov_b32 vcc_lo, s0
1919; GFX11-NEXT:    v_div_fmas_f64 v[10:11], v[10:11], v[14:15], v[22:23]
1920; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
1921; GFX11-NEXT:    v_div_fixup_f64 v[0:1], v[8:9], v[4:5], v[0:1]
1922; GFX11-NEXT:    v_div_fixup_f64 v[2:3], v[10:11], v[6:7], v[2:3]
1923; GFX11-NEXT:    s_setpc_b64 s[30:31]
1924  %fdiv = fdiv arcp <2 x double> %a, %b, !fpmath !0
1925  ret <2 x double> %fdiv
1926}
1927
1928define <2 x double> @v_fdiv_v2f64_arcp_afn_ulp25(<2 x double> %a, <2 x double> %b) {
1929; GCN-LABEL: v_fdiv_v2f64_arcp_afn_ulp25:
1930; GCN:       ; %bb.0:
1931; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1932; GCN-NEXT:    v_rcp_f64_e32 v[8:9], v[4:5]
1933; GCN-NEXT:    v_rcp_f64_e32 v[10:11], v[6:7]
1934; GCN-NEXT:    v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
1935; GCN-NEXT:    v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
1936; GCN-NEXT:    v_fma_f64 v[8:9], v[12:13], v[8:9], v[8:9]
1937; GCN-NEXT:    v_fma_f64 v[10:11], v[14:15], v[10:11], v[10:11]
1938; GCN-NEXT:    v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
1939; GCN-NEXT:    v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
1940; GCN-NEXT:    v_fma_f64 v[8:9], v[12:13], v[8:9], v[8:9]
1941; GCN-NEXT:    v_fma_f64 v[10:11], v[14:15], v[10:11], v[10:11]
1942; GCN-NEXT:    v_mul_f64 v[12:13], v[0:1], v[8:9]
1943; GCN-NEXT:    v_mul_f64 v[14:15], v[2:3], v[10:11]
1944; GCN-NEXT:    v_fma_f64 v[0:1], -v[4:5], v[12:13], v[0:1]
1945; GCN-NEXT:    v_fma_f64 v[2:3], -v[6:7], v[14:15], v[2:3]
1946; GCN-NEXT:    v_fma_f64 v[0:1], v[0:1], v[8:9], v[12:13]
1947; GCN-NEXT:    v_fma_f64 v[2:3], v[2:3], v[10:11], v[14:15]
1948; GCN-NEXT:    s_setpc_b64 s[30:31]
1949;
1950; GFX10-LABEL: v_fdiv_v2f64_arcp_afn_ulp25:
1951; GFX10:       ; %bb.0:
1952; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1953; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
1954; GFX10-NEXT:    v_rcp_f64_e32 v[8:9], v[4:5]
1955; GFX10-NEXT:    v_rcp_f64_e32 v[10:11], v[6:7]
1956; GFX10-NEXT:    v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
1957; GFX10-NEXT:    v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
1958; GFX10-NEXT:    v_fma_f64 v[8:9], v[12:13], v[8:9], v[8:9]
1959; GFX10-NEXT:    v_fma_f64 v[10:11], v[14:15], v[10:11], v[10:11]
1960; GFX10-NEXT:    v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
1961; GFX10-NEXT:    v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
1962; GFX10-NEXT:    v_fma_f64 v[8:9], v[12:13], v[8:9], v[8:9]
1963; GFX10-NEXT:    v_fma_f64 v[10:11], v[14:15], v[10:11], v[10:11]
1964; GFX10-NEXT:    v_mul_f64 v[12:13], v[0:1], v[8:9]
1965; GFX10-NEXT:    v_mul_f64 v[14:15], v[2:3], v[10:11]
1966; GFX10-NEXT:    v_fma_f64 v[0:1], -v[4:5], v[12:13], v[0:1]
1967; GFX10-NEXT:    v_fma_f64 v[2:3], -v[6:7], v[14:15], v[2:3]
1968; GFX10-NEXT:    v_fma_f64 v[0:1], v[0:1], v[8:9], v[12:13]
1969; GFX10-NEXT:    v_fma_f64 v[2:3], v[2:3], v[10:11], v[14:15]
1970; GFX10-NEXT:    s_setpc_b64 s[30:31]
1971;
1972; GFX11-LABEL: v_fdiv_v2f64_arcp_afn_ulp25:
1973; GFX11:       ; %bb.0:
1974; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1975; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
1976; GFX11-NEXT:    v_rcp_f64_e32 v[8:9], v[4:5]
1977; GFX11-NEXT:    v_rcp_f64_e32 v[10:11], v[6:7]
1978; GFX11-NEXT:    s_waitcnt_depctr 0xfff
1979; GFX11-NEXT:    v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
1980; GFX11-NEXT:    v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
1981; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
1982; GFX11-NEXT:    v_fma_f64 v[8:9], v[12:13], v[8:9], v[8:9]
1983; GFX11-NEXT:    v_fma_f64 v[10:11], v[14:15], v[10:11], v[10:11]
1984; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
1985; GFX11-NEXT:    v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
1986; GFX11-NEXT:    v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
1987; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
1988; GFX11-NEXT:    v_fma_f64 v[8:9], v[12:13], v[8:9], v[8:9]
1989; GFX11-NEXT:    v_fma_f64 v[10:11], v[14:15], v[10:11], v[10:11]
1990; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
1991; GFX11-NEXT:    v_mul_f64 v[12:13], v[0:1], v[8:9]
1992; GFX11-NEXT:    v_mul_f64 v[14:15], v[2:3], v[10:11]
1993; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
1994; GFX11-NEXT:    v_fma_f64 v[0:1], -v[4:5], v[12:13], v[0:1]
1995; GFX11-NEXT:    v_fma_f64 v[2:3], -v[6:7], v[14:15], v[2:3]
1996; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
1997; GFX11-NEXT:    v_fma_f64 v[0:1], v[0:1], v[8:9], v[12:13]
1998; GFX11-NEXT:    v_fma_f64 v[2:3], v[2:3], v[10:11], v[14:15]
1999; GFX11-NEXT:    s_setpc_b64 s[30:31]
2000  %fdiv = fdiv afn arcp <2 x double> %a, %b, !fpmath !0
2001  ret <2 x double> %fdiv
2002}
2003
2004!0 = !{float 2.500000e+00}
2005