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