Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / fdiv32-to-rcp-folding.ll
blob62b42aa3512332d4b5b911502de451bb5914cf7e
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
2 ; RUN: llc -march=amdgcn -mcpu=gfx900 -denormal-fp-math-f32=ieee < %s | FileCheck -enable-var-scope -check-prefixes=GCN,GCN-DENORM %s
3 ; RUN: llc -march=amdgcn -mcpu=gfx900 -denormal-fp-math-f32=preserve-sign < %s | FileCheck -enable-var-scope -check-prefixes=GCN,GCN-FLUSH %s
5 define amdgpu_kernel void @div_1_by_x_25ulp(ptr addrspace(1) %arg) {
6 ; GCN-DENORM-LABEL: div_1_by_x_25ulp:
7 ; GCN-DENORM:       ; %bb.0:
8 ; GCN-DENORM-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
9 ; GCN-DENORM-NEXT:    v_mov_b32_e32 v1, 0
10 ; GCN-DENORM-NEXT:    s_waitcnt lgkmcnt(0)
11 ; GCN-DENORM-NEXT:    s_load_dword s2, s[0:1], 0x0
12 ; GCN-DENORM-NEXT:    s_waitcnt lgkmcnt(0)
13 ; GCN-DENORM-NEXT:    v_frexp_mant_f32_e32 v0, s2
14 ; GCN-DENORM-NEXT:    v_rcp_f32_e32 v0, v0
15 ; GCN-DENORM-NEXT:    v_frexp_exp_i32_f32_e32 v2, s2
16 ; GCN-DENORM-NEXT:    v_sub_u32_e32 v2, 0, v2
17 ; GCN-DENORM-NEXT:    v_ldexp_f32 v0, v0, v2
18 ; GCN-DENORM-NEXT:    global_store_dword v1, v0, s[0:1]
19 ; GCN-DENORM-NEXT:    s_endpgm
21 ; GCN-FLUSH-LABEL: div_1_by_x_25ulp:
22 ; GCN-FLUSH:       ; %bb.0:
23 ; GCN-FLUSH-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
24 ; GCN-FLUSH-NEXT:    v_mov_b32_e32 v1, 0
25 ; GCN-FLUSH-NEXT:    s_waitcnt lgkmcnt(0)
26 ; GCN-FLUSH-NEXT:    s_load_dword s2, s[0:1], 0x0
27 ; GCN-FLUSH-NEXT:    s_waitcnt lgkmcnt(0)
28 ; GCN-FLUSH-NEXT:    v_rcp_f32_e32 v0, s2
29 ; GCN-FLUSH-NEXT:    global_store_dword v1, v0, s[0:1]
30 ; GCN-FLUSH-NEXT:    s_endpgm
31   %load = load float, ptr addrspace(1) %arg, align 4
32   %div = fdiv float 1.000000e+00, %load, !fpmath !0
33   store float %div, ptr addrspace(1) %arg, align 4
34   ret void
37 define amdgpu_kernel void @div_minus_1_by_x_25ulp(ptr addrspace(1) %arg) {
38 ; GCN-DENORM-LABEL: div_minus_1_by_x_25ulp:
39 ; GCN-DENORM:       ; %bb.0:
40 ; GCN-DENORM-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
41 ; GCN-DENORM-NEXT:    v_mov_b32_e32 v1, 0
42 ; GCN-DENORM-NEXT:    s_waitcnt lgkmcnt(0)
43 ; GCN-DENORM-NEXT:    s_load_dword s2, s[0:1], 0x0
44 ; GCN-DENORM-NEXT:    s_waitcnt lgkmcnt(0)
45 ; GCN-DENORM-NEXT:    v_frexp_mant_f32_e64 v0, -s2
46 ; GCN-DENORM-NEXT:    v_rcp_f32_e32 v0, v0
47 ; GCN-DENORM-NEXT:    v_frexp_exp_i32_f32_e32 v2, s2
48 ; GCN-DENORM-NEXT:    v_sub_u32_e32 v2, 0, v2
49 ; GCN-DENORM-NEXT:    v_ldexp_f32 v0, v0, v2
50 ; GCN-DENORM-NEXT:    global_store_dword v1, v0, s[0:1]
51 ; GCN-DENORM-NEXT:    s_endpgm
53 ; GCN-FLUSH-LABEL: div_minus_1_by_x_25ulp:
54 ; GCN-FLUSH:       ; %bb.0:
55 ; GCN-FLUSH-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
56 ; GCN-FLUSH-NEXT:    v_mov_b32_e32 v1, 0
57 ; GCN-FLUSH-NEXT:    s_waitcnt lgkmcnt(0)
58 ; GCN-FLUSH-NEXT:    s_load_dword s2, s[0:1], 0x0
59 ; GCN-FLUSH-NEXT:    s_waitcnt lgkmcnt(0)
60 ; GCN-FLUSH-NEXT:    v_rcp_f32_e64 v0, -s2
61 ; GCN-FLUSH-NEXT:    global_store_dword v1, v0, s[0:1]
62 ; GCN-FLUSH-NEXT:    s_endpgm
63   %load = load float, ptr addrspace(1) %arg, align 4
64   %div = fdiv float -1.000000e+00, %load, !fpmath !0
65   store float %div, ptr addrspace(1) %arg, align 4
66   ret void
69 define amdgpu_kernel void @div_1_by_minus_x_25ulp(ptr addrspace(1) %arg) {
70 ; GCN-DENORM-LABEL: div_1_by_minus_x_25ulp:
71 ; GCN-DENORM:       ; %bb.0:
72 ; GCN-DENORM-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
73 ; GCN-DENORM-NEXT:    v_mov_b32_e32 v1, 0
74 ; GCN-DENORM-NEXT:    s_waitcnt lgkmcnt(0)
75 ; GCN-DENORM-NEXT:    s_load_dword s2, s[0:1], 0x0
76 ; GCN-DENORM-NEXT:    s_waitcnt lgkmcnt(0)
77 ; GCN-DENORM-NEXT:    v_frexp_mant_f32_e64 v0, -s2
78 ; GCN-DENORM-NEXT:    v_rcp_f32_e32 v0, v0
79 ; GCN-DENORM-NEXT:    v_frexp_exp_i32_f32_e32 v2, s2
80 ; GCN-DENORM-NEXT:    v_sub_u32_e32 v2, 0, v2
81 ; GCN-DENORM-NEXT:    v_ldexp_f32 v0, v0, v2
82 ; GCN-DENORM-NEXT:    global_store_dword v1, v0, s[0:1]
83 ; GCN-DENORM-NEXT:    s_endpgm
85 ; GCN-FLUSH-LABEL: div_1_by_minus_x_25ulp:
86 ; GCN-FLUSH:       ; %bb.0:
87 ; GCN-FLUSH-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
88 ; GCN-FLUSH-NEXT:    v_mov_b32_e32 v1, 0
89 ; GCN-FLUSH-NEXT:    s_waitcnt lgkmcnt(0)
90 ; GCN-FLUSH-NEXT:    s_load_dword s2, s[0:1], 0x0
91 ; GCN-FLUSH-NEXT:    s_waitcnt lgkmcnt(0)
92 ; GCN-FLUSH-NEXT:    v_rcp_f32_e64 v0, -s2
93 ; GCN-FLUSH-NEXT:    global_store_dword v1, v0, s[0:1]
94 ; GCN-FLUSH-NEXT:    s_endpgm
95   %load = load float, ptr addrspace(1) %arg, align 4
96   %neg = fneg float %load
97   %div = fdiv float 1.000000e+00, %neg, !fpmath !0
98   store float %div, ptr addrspace(1) %arg, align 4
99   ret void
102 define amdgpu_kernel void @div_minus_1_by_minus_x_25ulp(ptr addrspace(1) %arg) {
103 ; GCN-DENORM-LABEL: div_minus_1_by_minus_x_25ulp:
104 ; GCN-DENORM:       ; %bb.0:
105 ; GCN-DENORM-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
106 ; GCN-DENORM-NEXT:    v_mov_b32_e32 v1, 0
107 ; GCN-DENORM-NEXT:    s_waitcnt lgkmcnt(0)
108 ; GCN-DENORM-NEXT:    s_load_dword s2, s[0:1], 0x0
109 ; GCN-DENORM-NEXT:    s_waitcnt lgkmcnt(0)
110 ; GCN-DENORM-NEXT:    v_frexp_mant_f32_e32 v0, s2
111 ; GCN-DENORM-NEXT:    v_rcp_f32_e32 v0, v0
112 ; GCN-DENORM-NEXT:    v_frexp_exp_i32_f32_e32 v2, s2
113 ; GCN-DENORM-NEXT:    v_sub_u32_e32 v2, 0, v2
114 ; GCN-DENORM-NEXT:    v_ldexp_f32 v0, v0, v2
115 ; GCN-DENORM-NEXT:    global_store_dword v1, v0, s[0:1]
116 ; GCN-DENORM-NEXT:    s_endpgm
118 ; GCN-FLUSH-LABEL: div_minus_1_by_minus_x_25ulp:
119 ; GCN-FLUSH:       ; %bb.0:
120 ; GCN-FLUSH-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
121 ; GCN-FLUSH-NEXT:    v_mov_b32_e32 v1, 0
122 ; GCN-FLUSH-NEXT:    s_waitcnt lgkmcnt(0)
123 ; GCN-FLUSH-NEXT:    s_load_dword s2, s[0:1], 0x0
124 ; GCN-FLUSH-NEXT:    s_waitcnt lgkmcnt(0)
125 ; GCN-FLUSH-NEXT:    v_rcp_f32_e32 v0, s2
126 ; GCN-FLUSH-NEXT:    global_store_dword v1, v0, s[0:1]
127 ; GCN-FLUSH-NEXT:    s_endpgm
128   %load = load float, ptr addrspace(1) %arg, align 4
129   %neg = fsub float -0.000000e+00, %load
130   %div = fdiv float -1.000000e+00, %neg, !fpmath !0
131   store float %div, ptr addrspace(1) %arg, align 4
132   ret void
135 define amdgpu_kernel void @div_v4_1_by_x_25ulp(ptr addrspace(1) %arg) {
136 ; GCN-DENORM-LABEL: div_v4_1_by_x_25ulp:
137 ; GCN-DENORM:       ; %bb.0:
138 ; GCN-DENORM-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
139 ; GCN-DENORM-NEXT:    v_mov_b32_e32 v4, 0
140 ; GCN-DENORM-NEXT:    s_waitcnt lgkmcnt(0)
141 ; GCN-DENORM-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
142 ; GCN-DENORM-NEXT:    s_waitcnt lgkmcnt(0)
143 ; GCN-DENORM-NEXT:    v_frexp_mant_f32_e32 v0, s0
144 ; GCN-DENORM-NEXT:    v_frexp_mant_f32_e32 v2, s1
145 ; GCN-DENORM-NEXT:    v_rcp_f32_e32 v0, v0
146 ; GCN-DENORM-NEXT:    v_rcp_f32_e32 v2, v2
147 ; GCN-DENORM-NEXT:    v_frexp_exp_i32_f32_e32 v1, s0
148 ; GCN-DENORM-NEXT:    v_frexp_exp_i32_f32_e32 v3, s1
149 ; GCN-DENORM-NEXT:    v_frexp_mant_f32_e32 v5, s2
150 ; GCN-DENORM-NEXT:    v_sub_u32_e32 v1, 0, v1
151 ; GCN-DENORM-NEXT:    v_sub_u32_e32 v3, 0, v3
152 ; GCN-DENORM-NEXT:    v_rcp_f32_e32 v5, v5
153 ; GCN-DENORM-NEXT:    v_ldexp_f32 v0, v0, v1
154 ; GCN-DENORM-NEXT:    v_ldexp_f32 v1, v2, v3
155 ; GCN-DENORM-NEXT:    v_frexp_mant_f32_e32 v3, s3
156 ; GCN-DENORM-NEXT:    v_frexp_exp_i32_f32_e32 v6, s2
157 ; GCN-DENORM-NEXT:    v_rcp_f32_e32 v3, v3
158 ; GCN-DENORM-NEXT:    v_sub_u32_e32 v2, 0, v6
159 ; GCN-DENORM-NEXT:    v_ldexp_f32 v2, v5, v2
160 ; GCN-DENORM-NEXT:    v_frexp_exp_i32_f32_e32 v5, s3
161 ; GCN-DENORM-NEXT:    v_sub_u32_e32 v5, 0, v5
162 ; GCN-DENORM-NEXT:    v_ldexp_f32 v3, v3, v5
163 ; GCN-DENORM-NEXT:    global_store_dwordx4 v4, v[0:3], s[4:5]
164 ; GCN-DENORM-NEXT:    s_endpgm
166 ; GCN-FLUSH-LABEL: div_v4_1_by_x_25ulp:
167 ; GCN-FLUSH:       ; %bb.0:
168 ; GCN-FLUSH-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
169 ; GCN-FLUSH-NEXT:    v_mov_b32_e32 v4, 0
170 ; GCN-FLUSH-NEXT:    s_waitcnt lgkmcnt(0)
171 ; GCN-FLUSH-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
172 ; GCN-FLUSH-NEXT:    s_waitcnt lgkmcnt(0)
173 ; GCN-FLUSH-NEXT:    v_rcp_f32_e32 v0, s0
174 ; GCN-FLUSH-NEXT:    v_rcp_f32_e32 v1, s1
175 ; GCN-FLUSH-NEXT:    v_rcp_f32_e32 v2, s2
176 ; GCN-FLUSH-NEXT:    v_rcp_f32_e32 v3, s3
177 ; GCN-FLUSH-NEXT:    global_store_dwordx4 v4, v[0:3], s[4:5]
178 ; GCN-FLUSH-NEXT:    s_endpgm
179   %load = load <4 x float>, ptr addrspace(1) %arg, align 16
180   %div = fdiv <4 x float> <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00>, %load, !fpmath !0
181   store <4 x float> %div, ptr addrspace(1) %arg, align 16
182   ret void
185 define amdgpu_kernel void @div_v4_minus_1_by_x_25ulp(ptr addrspace(1) %arg) {
186 ; GCN-DENORM-LABEL: div_v4_minus_1_by_x_25ulp:
187 ; GCN-DENORM:       ; %bb.0:
188 ; GCN-DENORM-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
189 ; GCN-DENORM-NEXT:    v_mov_b32_e32 v4, 0
190 ; GCN-DENORM-NEXT:    s_waitcnt lgkmcnt(0)
191 ; GCN-DENORM-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
192 ; GCN-DENORM-NEXT:    s_waitcnt lgkmcnt(0)
193 ; GCN-DENORM-NEXT:    v_frexp_mant_f32_e64 v0, -s0
194 ; GCN-DENORM-NEXT:    v_frexp_mant_f32_e64 v2, -s1
195 ; GCN-DENORM-NEXT:    v_rcp_f32_e32 v0, v0
196 ; GCN-DENORM-NEXT:    v_rcp_f32_e32 v2, v2
197 ; GCN-DENORM-NEXT:    v_frexp_exp_i32_f32_e32 v1, s0
198 ; GCN-DENORM-NEXT:    v_frexp_exp_i32_f32_e32 v3, s1
199 ; GCN-DENORM-NEXT:    v_frexp_mant_f32_e64 v5, -s2
200 ; GCN-DENORM-NEXT:    v_sub_u32_e32 v1, 0, v1
201 ; GCN-DENORM-NEXT:    v_sub_u32_e32 v3, 0, v3
202 ; GCN-DENORM-NEXT:    v_rcp_f32_e32 v5, v5
203 ; GCN-DENORM-NEXT:    v_ldexp_f32 v0, v0, v1
204 ; GCN-DENORM-NEXT:    v_ldexp_f32 v1, v2, v3
205 ; GCN-DENORM-NEXT:    v_frexp_mant_f32_e64 v3, -s3
206 ; GCN-DENORM-NEXT:    v_frexp_exp_i32_f32_e32 v6, s2
207 ; GCN-DENORM-NEXT:    v_rcp_f32_e32 v3, v3
208 ; GCN-DENORM-NEXT:    v_sub_u32_e32 v2, 0, v6
209 ; GCN-DENORM-NEXT:    v_ldexp_f32 v2, v5, v2
210 ; GCN-DENORM-NEXT:    v_frexp_exp_i32_f32_e32 v5, s3
211 ; GCN-DENORM-NEXT:    v_sub_u32_e32 v5, 0, v5
212 ; GCN-DENORM-NEXT:    v_ldexp_f32 v3, v3, v5
213 ; GCN-DENORM-NEXT:    global_store_dwordx4 v4, v[0:3], s[4:5]
214 ; GCN-DENORM-NEXT:    s_endpgm
216 ; GCN-FLUSH-LABEL: div_v4_minus_1_by_x_25ulp:
217 ; GCN-FLUSH:       ; %bb.0:
218 ; GCN-FLUSH-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
219 ; GCN-FLUSH-NEXT:    v_mov_b32_e32 v4, 0
220 ; GCN-FLUSH-NEXT:    s_waitcnt lgkmcnt(0)
221 ; GCN-FLUSH-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
222 ; GCN-FLUSH-NEXT:    s_waitcnt lgkmcnt(0)
223 ; GCN-FLUSH-NEXT:    v_rcp_f32_e64 v0, -s0
224 ; GCN-FLUSH-NEXT:    v_rcp_f32_e64 v1, -s1
225 ; GCN-FLUSH-NEXT:    v_rcp_f32_e64 v2, -s2
226 ; GCN-FLUSH-NEXT:    v_rcp_f32_e64 v3, -s3
227 ; GCN-FLUSH-NEXT:    global_store_dwordx4 v4, v[0:3], s[4:5]
228 ; GCN-FLUSH-NEXT:    s_endpgm
229   %load = load <4 x float>, ptr addrspace(1) %arg, align 16
230   %div = fdiv <4 x float> <float -1.000000e+00, float -1.000000e+00, float -1.000000e+00, float -1.000000e+00>, %load, !fpmath !0
231   store <4 x float> %div, ptr addrspace(1) %arg, align 16
232   ret void
235 define amdgpu_kernel void @div_v4_1_by_minus_x_25ulp(ptr addrspace(1) %arg) {
236 ; GCN-DENORM-LABEL: div_v4_1_by_minus_x_25ulp:
237 ; GCN-DENORM:       ; %bb.0:
238 ; GCN-DENORM-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
239 ; GCN-DENORM-NEXT:    v_mov_b32_e32 v4, 0
240 ; GCN-DENORM-NEXT:    s_waitcnt lgkmcnt(0)
241 ; GCN-DENORM-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
242 ; GCN-DENORM-NEXT:    s_waitcnt lgkmcnt(0)
243 ; GCN-DENORM-NEXT:    v_frexp_mant_f32_e64 v0, -s0
244 ; GCN-DENORM-NEXT:    v_frexp_mant_f32_e64 v2, -s1
245 ; GCN-DENORM-NEXT:    v_rcp_f32_e32 v0, v0
246 ; GCN-DENORM-NEXT:    v_rcp_f32_e32 v2, v2
247 ; GCN-DENORM-NEXT:    v_frexp_exp_i32_f32_e32 v1, s0
248 ; GCN-DENORM-NEXT:    v_frexp_exp_i32_f32_e32 v3, s1
249 ; GCN-DENORM-NEXT:    v_frexp_mant_f32_e64 v5, -s2
250 ; GCN-DENORM-NEXT:    v_sub_u32_e32 v1, 0, v1
251 ; GCN-DENORM-NEXT:    v_sub_u32_e32 v3, 0, v3
252 ; GCN-DENORM-NEXT:    v_rcp_f32_e32 v5, v5
253 ; GCN-DENORM-NEXT:    v_ldexp_f32 v0, v0, v1
254 ; GCN-DENORM-NEXT:    v_ldexp_f32 v1, v2, v3
255 ; GCN-DENORM-NEXT:    v_frexp_mant_f32_e64 v3, -s3
256 ; GCN-DENORM-NEXT:    v_frexp_exp_i32_f32_e32 v6, s2
257 ; GCN-DENORM-NEXT:    v_rcp_f32_e32 v3, v3
258 ; GCN-DENORM-NEXT:    v_sub_u32_e32 v2, 0, v6
259 ; GCN-DENORM-NEXT:    v_ldexp_f32 v2, v5, v2
260 ; GCN-DENORM-NEXT:    v_frexp_exp_i32_f32_e32 v5, s3
261 ; GCN-DENORM-NEXT:    v_sub_u32_e32 v5, 0, v5
262 ; GCN-DENORM-NEXT:    v_ldexp_f32 v3, v3, v5
263 ; GCN-DENORM-NEXT:    global_store_dwordx4 v4, v[0:3], s[4:5]
264 ; GCN-DENORM-NEXT:    s_endpgm
266 ; GCN-FLUSH-LABEL: div_v4_1_by_minus_x_25ulp:
267 ; GCN-FLUSH:       ; %bb.0:
268 ; GCN-FLUSH-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
269 ; GCN-FLUSH-NEXT:    v_mov_b32_e32 v4, 0
270 ; GCN-FLUSH-NEXT:    s_waitcnt lgkmcnt(0)
271 ; GCN-FLUSH-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
272 ; GCN-FLUSH-NEXT:    s_waitcnt lgkmcnt(0)
273 ; GCN-FLUSH-NEXT:    v_rcp_f32_e64 v0, -s0
274 ; GCN-FLUSH-NEXT:    v_rcp_f32_e64 v1, -s1
275 ; GCN-FLUSH-NEXT:    v_rcp_f32_e64 v2, -s2
276 ; GCN-FLUSH-NEXT:    v_rcp_f32_e64 v3, -s3
277 ; GCN-FLUSH-NEXT:    global_store_dwordx4 v4, v[0:3], s[4:5]
278 ; GCN-FLUSH-NEXT:    s_endpgm
279   %load = load <4 x float>, ptr addrspace(1) %arg, align 16
280   %neg = fneg <4 x float> %load
281   %div = fdiv <4 x float> <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00>, %neg, !fpmath !0
282   store <4 x float> %div, ptr addrspace(1) %arg, align 16
283   ret void
286 define amdgpu_kernel void @div_v4_minus_1_by_minus_x_25ulp(ptr addrspace(1) %arg) {
287 ; GCN-DENORM-LABEL: div_v4_minus_1_by_minus_x_25ulp:
288 ; GCN-DENORM:       ; %bb.0:
289 ; GCN-DENORM-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
290 ; GCN-DENORM-NEXT:    v_mov_b32_e32 v4, 0
291 ; GCN-DENORM-NEXT:    s_waitcnt lgkmcnt(0)
292 ; GCN-DENORM-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
293 ; GCN-DENORM-NEXT:    s_waitcnt lgkmcnt(0)
294 ; GCN-DENORM-NEXT:    v_frexp_mant_f32_e32 v0, s0
295 ; GCN-DENORM-NEXT:    v_frexp_mant_f32_e32 v2, s1
296 ; GCN-DENORM-NEXT:    v_rcp_f32_e32 v0, v0
297 ; GCN-DENORM-NEXT:    v_rcp_f32_e32 v2, v2
298 ; GCN-DENORM-NEXT:    v_frexp_exp_i32_f32_e32 v1, s0
299 ; GCN-DENORM-NEXT:    v_frexp_exp_i32_f32_e32 v3, s1
300 ; GCN-DENORM-NEXT:    v_frexp_mant_f32_e32 v5, s2
301 ; GCN-DENORM-NEXT:    v_sub_u32_e32 v1, 0, v1
302 ; GCN-DENORM-NEXT:    v_sub_u32_e32 v3, 0, v3
303 ; GCN-DENORM-NEXT:    v_rcp_f32_e32 v5, v5
304 ; GCN-DENORM-NEXT:    v_ldexp_f32 v0, v0, v1
305 ; GCN-DENORM-NEXT:    v_ldexp_f32 v1, v2, v3
306 ; GCN-DENORM-NEXT:    v_frexp_mant_f32_e32 v3, s3
307 ; GCN-DENORM-NEXT:    v_frexp_exp_i32_f32_e32 v6, s2
308 ; GCN-DENORM-NEXT:    v_rcp_f32_e32 v3, v3
309 ; GCN-DENORM-NEXT:    v_sub_u32_e32 v2, 0, v6
310 ; GCN-DENORM-NEXT:    v_ldexp_f32 v2, v5, v2
311 ; GCN-DENORM-NEXT:    v_frexp_exp_i32_f32_e32 v5, s3
312 ; GCN-DENORM-NEXT:    v_sub_u32_e32 v5, 0, v5
313 ; GCN-DENORM-NEXT:    v_ldexp_f32 v3, v3, v5
314 ; GCN-DENORM-NEXT:    global_store_dwordx4 v4, v[0:3], s[4:5]
315 ; GCN-DENORM-NEXT:    s_endpgm
317 ; GCN-FLUSH-LABEL: div_v4_minus_1_by_minus_x_25ulp:
318 ; GCN-FLUSH:       ; %bb.0:
319 ; GCN-FLUSH-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
320 ; GCN-FLUSH-NEXT:    v_mov_b32_e32 v4, 0
321 ; GCN-FLUSH-NEXT:    s_waitcnt lgkmcnt(0)
322 ; GCN-FLUSH-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
323 ; GCN-FLUSH-NEXT:    s_waitcnt lgkmcnt(0)
324 ; GCN-FLUSH-NEXT:    v_rcp_f32_e32 v0, s0
325 ; GCN-FLUSH-NEXT:    v_rcp_f32_e32 v1, s1
326 ; GCN-FLUSH-NEXT:    v_rcp_f32_e32 v2, s2
327 ; GCN-FLUSH-NEXT:    v_rcp_f32_e32 v3, s3
328 ; GCN-FLUSH-NEXT:    global_store_dwordx4 v4, v[0:3], s[4:5]
329 ; GCN-FLUSH-NEXT:    s_endpgm
330   %load = load <4 x float>, ptr addrspace(1) %arg, align 16
331   %neg = fneg <4 x float> %load
332   %div = fdiv <4 x float> <float -1.000000e+00, float -1.000000e+00, float -1.000000e+00, float -1.000000e+00>, %neg, !fpmath !0
333   store <4 x float> %div, ptr addrspace(1) %arg, align 16
334   ret void
337 define amdgpu_kernel void @div_v4_c_by_x_25ulp(ptr addrspace(1) %arg) {
338 ; GCN-DENORM-LABEL: div_v4_c_by_x_25ulp:
339 ; GCN-DENORM:       ; %bb.0:
340 ; GCN-DENORM-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
341 ; GCN-DENORM-NEXT:    v_mov_b32_e32 v4, 0
342 ; GCN-DENORM-NEXT:    s_waitcnt lgkmcnt(0)
343 ; GCN-DENORM-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
344 ; GCN-DENORM-NEXT:    s_waitcnt lgkmcnt(0)
345 ; GCN-DENORM-NEXT:    v_frexp_mant_f32_e32 v1, s0
346 ; GCN-DENORM-NEXT:    v_frexp_mant_f32_e32 v2, s1
347 ; GCN-DENORM-NEXT:    v_rcp_f32_e32 v1, v1
348 ; GCN-DENORM-NEXT:    v_rcp_f32_e32 v2, v2
349 ; GCN-DENORM-NEXT:    v_frexp_exp_i32_f32_e32 v3, s1
350 ; GCN-DENORM-NEXT:    v_frexp_mant_f32_e64 v5, -s2
351 ; GCN-DENORM-NEXT:    v_sub_u32_e32 v3, 0, v3
352 ; GCN-DENORM-NEXT:    v_rcp_f32_e32 v5, v5
353 ; GCN-DENORM-NEXT:    v_mul_f32_e32 v7, 0.5, v1
354 ; GCN-DENORM-NEXT:    v_ldexp_f32 v1, v2, v3
355 ; GCN-DENORM-NEXT:    v_frexp_mant_f32_e32 v2, s3
356 ; GCN-DENORM-NEXT:    v_rcp_f32_e32 v3, v2
357 ; GCN-DENORM-NEXT:    v_frexp_exp_i32_f32_e32 v6, s2
358 ; GCN-DENORM-NEXT:    v_sub_u32_e32 v2, 0, v6
359 ; GCN-DENORM-NEXT:    v_frexp_exp_i32_f32_e32 v0, s0
360 ; GCN-DENORM-NEXT:    v_ldexp_f32 v2, v5, v2
361 ; GCN-DENORM-NEXT:    v_frexp_exp_i32_f32_e32 v5, s3
362 ; GCN-DENORM-NEXT:    v_sub_u32_e32 v0, 2, v0
363 ; GCN-DENORM-NEXT:    v_mul_f32_e32 v3, -0.5, v3
364 ; GCN-DENORM-NEXT:    v_sub_u32_e32 v5, 2, v5
365 ; GCN-DENORM-NEXT:    v_ldexp_f32 v0, v7, v0
366 ; GCN-DENORM-NEXT:    v_ldexp_f32 v3, v3, v5
367 ; GCN-DENORM-NEXT:    global_store_dwordx4 v4, v[0:3], s[4:5]
368 ; GCN-DENORM-NEXT:    s_endpgm
370 ; GCN-FLUSH-LABEL: div_v4_c_by_x_25ulp:
371 ; GCN-FLUSH:       ; %bb.0:
372 ; GCN-FLUSH-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
373 ; GCN-FLUSH-NEXT:    v_mov_b32_e32 v0, 0x6f800000
374 ; GCN-FLUSH-NEXT:    v_mov_b32_e32 v1, 0x2f800000
375 ; GCN-FLUSH-NEXT:    v_mov_b32_e32 v4, 0
376 ; GCN-FLUSH-NEXT:    s_waitcnt lgkmcnt(0)
377 ; GCN-FLUSH-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
378 ; GCN-FLUSH-NEXT:    s_waitcnt lgkmcnt(0)
379 ; GCN-FLUSH-NEXT:    v_cmp_gt_f32_e64 vcc, |s0|, v0
380 ; GCN-FLUSH-NEXT:    v_cndmask_b32_e32 v3, 1.0, v1, vcc
381 ; GCN-FLUSH-NEXT:    v_cmp_gt_f32_e64 vcc, |s3|, v0
382 ; GCN-FLUSH-NEXT:    v_cndmask_b32_e32 v5, 1.0, v1, vcc
383 ; GCN-FLUSH-NEXT:    v_mul_f32_e32 v0, s0, v3
384 ; GCN-FLUSH-NEXT:    v_mul_f32_e32 v1, s3, v5
385 ; GCN-FLUSH-NEXT:    v_rcp_f32_e32 v0, v0
386 ; GCN-FLUSH-NEXT:    v_rcp_f32_e32 v6, v1
387 ; GCN-FLUSH-NEXT:    v_rcp_f32_e32 v1, s1
388 ; GCN-FLUSH-NEXT:    v_rcp_f32_e64 v2, -s2
389 ; GCN-FLUSH-NEXT:    v_add_f32_e32 v0, v0, v0
390 ; GCN-FLUSH-NEXT:    v_mul_f32_e32 v6, -2.0, v6
391 ; GCN-FLUSH-NEXT:    v_mul_f32_e32 v0, v3, v0
392 ; GCN-FLUSH-NEXT:    v_mul_f32_e32 v3, v5, v6
393 ; GCN-FLUSH-NEXT:    global_store_dwordx4 v4, v[0:3], s[4:5]
394 ; GCN-FLUSH-NEXT:    s_endpgm
395   %load = load <4 x float>, ptr addrspace(1) %arg, align 16
396   %div = fdiv <4 x float> <float 2.000000e+00, float 1.000000e+00, float -1.000000e+00, float -2.000000e+00>, %load, !fpmath !0
397   store <4 x float> %div, ptr addrspace(1) %arg, align 16
398   ret void
401 define amdgpu_kernel void @div_v4_c_by_minus_x_25ulp(ptr addrspace(1) %arg) {
402 ; GCN-DENORM-LABEL: div_v4_c_by_minus_x_25ulp:
403 ; GCN-DENORM:       ; %bb.0:
404 ; GCN-DENORM-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
405 ; GCN-DENORM-NEXT:    v_mov_b32_e32 v4, 0
406 ; GCN-DENORM-NEXT:    s_waitcnt lgkmcnt(0)
407 ; GCN-DENORM-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
408 ; GCN-DENORM-NEXT:    s_waitcnt lgkmcnt(0)
409 ; GCN-DENORM-NEXT:    v_frexp_mant_f32_e64 v1, -s0
410 ; GCN-DENORM-NEXT:    v_frexp_mant_f32_e64 v2, -s1
411 ; GCN-DENORM-NEXT:    v_rcp_f32_e32 v1, v1
412 ; GCN-DENORM-NEXT:    v_rcp_f32_e32 v2, v2
413 ; GCN-DENORM-NEXT:    v_frexp_exp_i32_f32_e32 v3, s1
414 ; GCN-DENORM-NEXT:    v_frexp_mant_f32_e32 v5, s2
415 ; GCN-DENORM-NEXT:    v_sub_u32_e32 v3, 0, v3
416 ; GCN-DENORM-NEXT:    v_rcp_f32_e32 v5, v5
417 ; GCN-DENORM-NEXT:    v_mul_f32_e32 v7, 0.5, v1
418 ; GCN-DENORM-NEXT:    v_ldexp_f32 v1, v2, v3
419 ; GCN-DENORM-NEXT:    v_frexp_mant_f32_e64 v2, -s3
420 ; GCN-DENORM-NEXT:    v_rcp_f32_e32 v3, v2
421 ; GCN-DENORM-NEXT:    v_frexp_exp_i32_f32_e32 v6, s2
422 ; GCN-DENORM-NEXT:    v_sub_u32_e32 v2, 0, v6
423 ; GCN-DENORM-NEXT:    v_frexp_exp_i32_f32_e32 v0, s0
424 ; GCN-DENORM-NEXT:    v_ldexp_f32 v2, v5, v2
425 ; GCN-DENORM-NEXT:    v_frexp_exp_i32_f32_e32 v5, s3
426 ; GCN-DENORM-NEXT:    v_sub_u32_e32 v0, 2, v0
427 ; GCN-DENORM-NEXT:    v_mul_f32_e32 v3, -0.5, v3
428 ; GCN-DENORM-NEXT:    v_sub_u32_e32 v5, 2, v5
429 ; GCN-DENORM-NEXT:    v_ldexp_f32 v0, v7, v0
430 ; GCN-DENORM-NEXT:    v_ldexp_f32 v3, v3, v5
431 ; GCN-DENORM-NEXT:    global_store_dwordx4 v4, v[0:3], s[4:5]
432 ; GCN-DENORM-NEXT:    s_endpgm
434 ; GCN-FLUSH-LABEL: div_v4_c_by_minus_x_25ulp:
435 ; GCN-FLUSH:       ; %bb.0:
436 ; GCN-FLUSH-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
437 ; GCN-FLUSH-NEXT:    v_mov_b32_e32 v0, 0x6f800000
438 ; GCN-FLUSH-NEXT:    v_mov_b32_e32 v2, 0x2f800000
439 ; GCN-FLUSH-NEXT:    v_mov_b32_e32 v4, 0
440 ; GCN-FLUSH-NEXT:    s_waitcnt lgkmcnt(0)
441 ; GCN-FLUSH-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
442 ; GCN-FLUSH-NEXT:    s_waitcnt lgkmcnt(0)
443 ; GCN-FLUSH-NEXT:    v_cmp_gt_f32_e64 vcc, |s0|, v0
444 ; GCN-FLUSH-NEXT:    v_cndmask_b32_e32 v3, 1.0, v2, vcc
445 ; GCN-FLUSH-NEXT:    v_cmp_gt_f32_e64 vcc, |s3|, v0
446 ; GCN-FLUSH-NEXT:    v_mul_f32_e32 v5, s0, v3
447 ; GCN-FLUSH-NEXT:    v_mul_f32_e64 v6, -s0, v3
448 ; GCN-FLUSH-NEXT:    v_cndmask_b32_e32 v7, 1.0, v2, vcc
449 ; GCN-FLUSH-NEXT:    v_rcp_f32_e32 v5, v5
450 ; GCN-FLUSH-NEXT:    v_rcp_f32_e32 v6, v6
451 ; GCN-FLUSH-NEXT:    v_mul_f32_e32 v0, s3, v7
452 ; GCN-FLUSH-NEXT:    v_rcp_f32_e32 v8, v0
453 ; GCN-FLUSH-NEXT:    v_rcp_f32_e64 v1, -s1
454 ; GCN-FLUSH-NEXT:    v_rcp_f32_e32 v2, s2
455 ; GCN-FLUSH-NEXT:    v_sub_f32_e32 v0, v6, v5
456 ; GCN-FLUSH-NEXT:    v_mul_f32_e32 v0, v3, v0
457 ; GCN-FLUSH-NEXT:    v_add_f32_e32 v3, v8, v8
458 ; GCN-FLUSH-NEXT:    v_mul_f32_e32 v3, v7, v3
459 ; GCN-FLUSH-NEXT:    global_store_dwordx4 v4, v[0:3], s[4:5]
460 ; GCN-FLUSH-NEXT:    s_endpgm
461   %load = load <4 x float>, ptr addrspace(1) %arg, align 16
462   %neg = fneg <4 x float> %load
463   %div = fdiv <4 x float> <float 2.000000e+00, float 1.000000e+00, float -1.000000e+00, float -2.000000e+00>, %neg, !fpmath !0
464   store <4 x float> %div, ptr addrspace(1) %arg, align 16
465   ret void
468 define amdgpu_kernel void @div_v_by_x_25ulp(ptr addrspace(1) %arg, float %num) {
469 ; GCN-DENORM-LABEL: div_v_by_x_25ulp:
470 ; GCN-DENORM:       ; %bb.0:
471 ; GCN-DENORM-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
472 ; GCN-DENORM-NEXT:    s_load_dword s4, s[0:1], 0x2c
473 ; GCN-DENORM-NEXT:    v_mov_b32_e32 v0, 0
474 ; GCN-DENORM-NEXT:    s_waitcnt lgkmcnt(0)
475 ; GCN-DENORM-NEXT:    s_load_dword s0, s[2:3], 0x0
476 ; GCN-DENORM-NEXT:    v_frexp_exp_i32_f32_e32 v2, s4
477 ; GCN-DENORM-NEXT:    v_frexp_mant_f32_e32 v3, s4
478 ; GCN-DENORM-NEXT:    s_waitcnt lgkmcnt(0)
479 ; GCN-DENORM-NEXT:    v_frexp_mant_f32_e32 v1, s0
480 ; GCN-DENORM-NEXT:    v_rcp_f32_e32 v1, v1
481 ; GCN-DENORM-NEXT:    v_frexp_exp_i32_f32_e32 v4, s0
482 ; GCN-DENORM-NEXT:    v_sub_u32_e32 v2, v2, v4
483 ; GCN-DENORM-NEXT:    v_mul_f32_e32 v1, v3, v1
484 ; GCN-DENORM-NEXT:    v_ldexp_f32 v1, v1, v2
485 ; GCN-DENORM-NEXT:    global_store_dword v0, v1, s[2:3]
486 ; GCN-DENORM-NEXT:    s_endpgm
488 ; GCN-FLUSH-LABEL: div_v_by_x_25ulp:
489 ; GCN-FLUSH:       ; %bb.0:
490 ; GCN-FLUSH-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
491 ; GCN-FLUSH-NEXT:    s_load_dword s4, s[0:1], 0x2c
492 ; GCN-FLUSH-NEXT:    v_mov_b32_e32 v0, 0x6f800000
493 ; GCN-FLUSH-NEXT:    v_mov_b32_e32 v1, 0x2f800000
494 ; GCN-FLUSH-NEXT:    v_mov_b32_e32 v2, 0
495 ; GCN-FLUSH-NEXT:    s_waitcnt lgkmcnt(0)
496 ; GCN-FLUSH-NEXT:    s_load_dword s0, s[2:3], 0x0
497 ; GCN-FLUSH-NEXT:    s_waitcnt lgkmcnt(0)
498 ; GCN-FLUSH-NEXT:    v_cmp_gt_f32_e64 vcc, |s0|, v0
499 ; GCN-FLUSH-NEXT:    v_cndmask_b32_e32 v0, 1.0, v1, vcc
500 ; GCN-FLUSH-NEXT:    v_mul_f32_e32 v1, s0, v0
501 ; GCN-FLUSH-NEXT:    v_rcp_f32_e32 v1, v1
502 ; GCN-FLUSH-NEXT:    v_mul_f32_e32 v1, s4, v1
503 ; GCN-FLUSH-NEXT:    v_mul_f32_e32 v0, v0, v1
504 ; GCN-FLUSH-NEXT:    global_store_dword v2, v0, s[2:3]
505 ; GCN-FLUSH-NEXT:    s_endpgm
506   %load = load float, ptr addrspace(1) %arg, align 4
507   %div = fdiv float %num, %load, !fpmath !0
508   store float %div, ptr addrspace(1) %arg, align 4
509   ret void
512 define amdgpu_kernel void @div_1_by_x_fast(ptr addrspace(1) %arg) {
513 ; GCN-LABEL: div_1_by_x_fast:
514 ; GCN:       ; %bb.0:
515 ; GCN-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
516 ; GCN-NEXT:    v_mov_b32_e32 v1, 0
517 ; GCN-NEXT:    s_waitcnt lgkmcnt(0)
518 ; GCN-NEXT:    s_load_dword s2, s[0:1], 0x0
519 ; GCN-NEXT:    s_waitcnt lgkmcnt(0)
520 ; GCN-NEXT:    v_rcp_f32_e32 v0, s2
521 ; GCN-NEXT:    global_store_dword v1, v0, s[0:1]
522 ; GCN-NEXT:    s_endpgm
523   %load = load float, ptr addrspace(1) %arg, align 4
524   %div = fdiv fast float 1.000000e+00, %load, !fpmath !0
525   store float %div, ptr addrspace(1) %arg, align 4
526   ret void
529 define amdgpu_kernel void @div_minus_1_by_x_fast(ptr addrspace(1) %arg) {
530 ; GCN-DENORM-LABEL: div_minus_1_by_x_fast:
531 ; GCN-DENORM:       ; %bb.0:
532 ; GCN-DENORM-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
533 ; GCN-DENORM-NEXT:    v_mov_b32_e32 v1, 0
534 ; GCN-DENORM-NEXT:    s_waitcnt lgkmcnt(0)
535 ; GCN-DENORM-NEXT:    s_load_dword s2, s[0:1], 0x0
536 ; GCN-DENORM-NEXT:    s_waitcnt lgkmcnt(0)
537 ; GCN-DENORM-NEXT:    v_rcp_f32_e64 v0, -s2
538 ; GCN-DENORM-NEXT:    global_store_dword v1, v0, s[0:1]
539 ; GCN-DENORM-NEXT:    s_endpgm
541 ; GCN-FLUSH-LABEL: div_minus_1_by_x_fast:
542 ; GCN-FLUSH:       ; %bb.0:
543 ; GCN-FLUSH-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
544 ; GCN-FLUSH-NEXT:    v_mov_b32_e32 v1, 0
545 ; GCN-FLUSH-NEXT:    s_waitcnt lgkmcnt(0)
546 ; GCN-FLUSH-NEXT:    s_load_dword s2, s[0:1], 0x0
547 ; GCN-FLUSH-NEXT:    s_waitcnt lgkmcnt(0)
548 ; GCN-FLUSH-NEXT:    v_rcp_f32_e32 v0, s2
549 ; GCN-FLUSH-NEXT:    v_sub_f32_e32 v0, 0x80000000, v0
550 ; GCN-FLUSH-NEXT:    global_store_dword v1, v0, s[0:1]
551 ; GCN-FLUSH-NEXT:    s_endpgm
552   %load = load float, ptr addrspace(1) %arg, align 4
553   %div = fdiv fast float -1.000000e+00, %load, !fpmath !0
554   store float %div, ptr addrspace(1) %arg, align 4
555   ret void
558 define amdgpu_kernel void @div_1_by_minus_x_fast(ptr addrspace(1) %arg) {
559 ; GCN-LABEL: div_1_by_minus_x_fast:
560 ; GCN:       ; %bb.0:
561 ; GCN-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
562 ; GCN-NEXT:    v_mov_b32_e32 v1, 0
563 ; GCN-NEXT:    s_waitcnt lgkmcnt(0)
564 ; GCN-NEXT:    s_load_dword s2, s[0:1], 0x0
565 ; GCN-NEXT:    s_waitcnt lgkmcnt(0)
566 ; GCN-NEXT:    v_rcp_f32_e64 v0, -s2
567 ; GCN-NEXT:    global_store_dword v1, v0, s[0:1]
568 ; GCN-NEXT:    s_endpgm
569   %load = load float, ptr addrspace(1) %arg, align 4
570   %neg = fneg float %load, !fpmath !0
571   %div = fdiv fast float 1.000000e+00, %neg
572   store float %div, ptr addrspace(1) %arg, align 4
573   ret void
576 define amdgpu_kernel void @div_minus_1_by_minus_x_fast(ptr addrspace(1) %arg) {
577 ; GCN-DENORM-LABEL: div_minus_1_by_minus_x_fast:
578 ; GCN-DENORM:       ; %bb.0:
579 ; GCN-DENORM-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
580 ; GCN-DENORM-NEXT:    v_mov_b32_e32 v1, 0
581 ; GCN-DENORM-NEXT:    s_waitcnt lgkmcnt(0)
582 ; GCN-DENORM-NEXT:    s_load_dword s2, s[0:1], 0x0
583 ; GCN-DENORM-NEXT:    s_waitcnt lgkmcnt(0)
584 ; GCN-DENORM-NEXT:    v_rcp_f32_e32 v0, s2
585 ; GCN-DENORM-NEXT:    global_store_dword v1, v0, s[0:1]
586 ; GCN-DENORM-NEXT:    s_endpgm
588 ; GCN-FLUSH-LABEL: div_minus_1_by_minus_x_fast:
589 ; GCN-FLUSH:       ; %bb.0:
590 ; GCN-FLUSH-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
591 ; GCN-FLUSH-NEXT:    v_mov_b32_e32 v1, 0
592 ; GCN-FLUSH-NEXT:    s_waitcnt lgkmcnt(0)
593 ; GCN-FLUSH-NEXT:    s_load_dword s2, s[0:1], 0x0
594 ; GCN-FLUSH-NEXT:    s_waitcnt lgkmcnt(0)
595 ; GCN-FLUSH-NEXT:    v_rcp_f32_e64 v0, -s2
596 ; GCN-FLUSH-NEXT:    v_sub_f32_e32 v0, 0x80000000, v0
597 ; GCN-FLUSH-NEXT:    global_store_dword v1, v0, s[0:1]
598 ; GCN-FLUSH-NEXT:    s_endpgm
599   %load = load float, ptr addrspace(1) %arg, align 4
600   %neg = fsub float -0.000000e+00, %load, !fpmath !0
601   %div = fdiv fast float -1.000000e+00, %neg
602   store float %div, ptr addrspace(1) %arg, align 4
603   ret void
606 define amdgpu_kernel void @div_1_by_x_correctly_rounded(ptr addrspace(1) %arg) {
607 ; GCN-DENORM-LABEL: div_1_by_x_correctly_rounded:
608 ; GCN-DENORM:       ; %bb.0:
609 ; GCN-DENORM-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
610 ; GCN-DENORM-NEXT:    s_waitcnt lgkmcnt(0)
611 ; GCN-DENORM-NEXT:    s_load_dword s4, s[0:1], 0x0
612 ; GCN-DENORM-NEXT:    s_waitcnt lgkmcnt(0)
613 ; GCN-DENORM-NEXT:    v_div_scale_f32 v0, s[2:3], s4, s4, 1.0
614 ; GCN-DENORM-NEXT:    v_div_scale_f32 v1, vcc, 1.0, s4, 1.0
615 ; GCN-DENORM-NEXT:    v_rcp_f32_e32 v2, v0
616 ; GCN-DENORM-NEXT:    v_fma_f32 v3, -v0, v2, 1.0
617 ; GCN-DENORM-NEXT:    v_fma_f32 v2, v3, v2, v2
618 ; GCN-DENORM-NEXT:    v_mul_f32_e32 v3, v1, v2
619 ; GCN-DENORM-NEXT:    v_fma_f32 v4, -v0, v3, v1
620 ; GCN-DENORM-NEXT:    v_fma_f32 v3, v4, v2, v3
621 ; GCN-DENORM-NEXT:    v_fma_f32 v0, -v0, v3, v1
622 ; GCN-DENORM-NEXT:    v_div_fmas_f32 v0, v0, v2, v3
623 ; GCN-DENORM-NEXT:    v_mov_b32_e32 v1, 0
624 ; GCN-DENORM-NEXT:    v_div_fixup_f32 v0, v0, s4, 1.0
625 ; GCN-DENORM-NEXT:    global_store_dword v1, v0, s[0:1]
626 ; GCN-DENORM-NEXT:    s_endpgm
628 ; GCN-FLUSH-LABEL: div_1_by_x_correctly_rounded:
629 ; GCN-FLUSH:       ; %bb.0:
630 ; GCN-FLUSH-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
631 ; GCN-FLUSH-NEXT:    s_waitcnt lgkmcnt(0)
632 ; GCN-FLUSH-NEXT:    s_load_dword s4, s[0:1], 0x0
633 ; GCN-FLUSH-NEXT:    s_waitcnt lgkmcnt(0)
634 ; GCN-FLUSH-NEXT:    v_div_scale_f32 v0, s[2:3], s4, s4, 1.0
635 ; GCN-FLUSH-NEXT:    v_div_scale_f32 v1, vcc, 1.0, s4, 1.0
636 ; GCN-FLUSH-NEXT:    v_rcp_f32_e32 v2, v0
637 ; GCN-FLUSH-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_MODE, 4, 2), 3
638 ; GCN-FLUSH-NEXT:    v_fma_f32 v3, -v0, v2, 1.0
639 ; GCN-FLUSH-NEXT:    v_fma_f32 v2, v3, v2, v2
640 ; GCN-FLUSH-NEXT:    v_mul_f32_e32 v3, v1, v2
641 ; GCN-FLUSH-NEXT:    v_fma_f32 v4, -v0, v3, v1
642 ; GCN-FLUSH-NEXT:    v_fma_f32 v3, v4, v2, v3
643 ; GCN-FLUSH-NEXT:    v_fma_f32 v0, -v0, v3, v1
644 ; GCN-FLUSH-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_MODE, 4, 2), 0
645 ; GCN-FLUSH-NEXT:    v_div_fmas_f32 v0, v0, v2, v3
646 ; GCN-FLUSH-NEXT:    v_mov_b32_e32 v1, 0
647 ; GCN-FLUSH-NEXT:    v_div_fixup_f32 v0, v0, s4, 1.0
648 ; GCN-FLUSH-NEXT:    global_store_dword v1, v0, s[0:1]
649 ; GCN-FLUSH-NEXT:    s_endpgm
650   %load = load float, ptr addrspace(1) %arg, align 4
651   %div = fdiv float 1.000000e+00, %load
652   store float %div, ptr addrspace(1) %arg, align 4
653   ret void
656 define amdgpu_kernel void @div_minus_1_by_x_correctly_rounded(ptr addrspace(1) %arg) {
657 ; GCN-DENORM-LABEL: div_minus_1_by_x_correctly_rounded:
658 ; GCN-DENORM:       ; %bb.0:
659 ; GCN-DENORM-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
660 ; GCN-DENORM-NEXT:    s_waitcnt lgkmcnt(0)
661 ; GCN-DENORM-NEXT:    s_load_dword s4, s[0:1], 0x0
662 ; GCN-DENORM-NEXT:    s_waitcnt lgkmcnt(0)
663 ; GCN-DENORM-NEXT:    v_div_scale_f32 v0, s[2:3], s4, s4, -1.0
664 ; GCN-DENORM-NEXT:    v_div_scale_f32 v1, vcc, -1.0, s4, -1.0
665 ; GCN-DENORM-NEXT:    v_rcp_f32_e32 v2, v0
666 ; GCN-DENORM-NEXT:    v_fma_f32 v3, -v0, v2, 1.0
667 ; GCN-DENORM-NEXT:    v_fma_f32 v2, v3, v2, v2
668 ; GCN-DENORM-NEXT:    v_mul_f32_e32 v3, v1, v2
669 ; GCN-DENORM-NEXT:    v_fma_f32 v4, -v0, v3, v1
670 ; GCN-DENORM-NEXT:    v_fma_f32 v3, v4, v2, v3
671 ; GCN-DENORM-NEXT:    v_fma_f32 v0, -v0, v3, v1
672 ; GCN-DENORM-NEXT:    v_div_fmas_f32 v0, v0, v2, v3
673 ; GCN-DENORM-NEXT:    v_mov_b32_e32 v1, 0
674 ; GCN-DENORM-NEXT:    v_div_fixup_f32 v0, v0, s4, -1.0
675 ; GCN-DENORM-NEXT:    global_store_dword v1, v0, s[0:1]
676 ; GCN-DENORM-NEXT:    s_endpgm
678 ; GCN-FLUSH-LABEL: div_minus_1_by_x_correctly_rounded:
679 ; GCN-FLUSH:       ; %bb.0:
680 ; GCN-FLUSH-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
681 ; GCN-FLUSH-NEXT:    s_waitcnt lgkmcnt(0)
682 ; GCN-FLUSH-NEXT:    s_load_dword s4, s[0:1], 0x0
683 ; GCN-FLUSH-NEXT:    s_waitcnt lgkmcnt(0)
684 ; GCN-FLUSH-NEXT:    v_div_scale_f32 v0, s[2:3], s4, s4, -1.0
685 ; GCN-FLUSH-NEXT:    v_div_scale_f32 v1, vcc, -1.0, s4, -1.0
686 ; GCN-FLUSH-NEXT:    v_rcp_f32_e32 v2, v0
687 ; GCN-FLUSH-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_MODE, 4, 2), 3
688 ; GCN-FLUSH-NEXT:    v_fma_f32 v3, -v0, v2, 1.0
689 ; GCN-FLUSH-NEXT:    v_fma_f32 v2, v3, v2, v2
690 ; GCN-FLUSH-NEXT:    v_mul_f32_e32 v3, v1, v2
691 ; GCN-FLUSH-NEXT:    v_fma_f32 v4, -v0, v3, v1
692 ; GCN-FLUSH-NEXT:    v_fma_f32 v3, v4, v2, v3
693 ; GCN-FLUSH-NEXT:    v_fma_f32 v0, -v0, v3, v1
694 ; GCN-FLUSH-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_MODE, 4, 2), 0
695 ; GCN-FLUSH-NEXT:    v_div_fmas_f32 v0, v0, v2, v3
696 ; GCN-FLUSH-NEXT:    v_mov_b32_e32 v1, 0
697 ; GCN-FLUSH-NEXT:    v_div_fixup_f32 v0, v0, s4, -1.0
698 ; GCN-FLUSH-NEXT:    global_store_dword v1, v0, s[0:1]
699 ; GCN-FLUSH-NEXT:    s_endpgm
700   %load = load float, ptr addrspace(1) %arg, align 4
701   %div = fdiv float -1.000000e+00, %load
702   store float %div, ptr addrspace(1) %arg, align 4
703   ret void
706 define amdgpu_kernel void @div_1_by_minus_x_correctly_rounded(ptr addrspace(1) %arg) {
707 ; GCN-DENORM-LABEL: div_1_by_minus_x_correctly_rounded:
708 ; GCN-DENORM:       ; %bb.0:
709 ; GCN-DENORM-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
710 ; GCN-DENORM-NEXT:    s_waitcnt lgkmcnt(0)
711 ; GCN-DENORM-NEXT:    s_load_dword s4, s[0:1], 0x0
712 ; GCN-DENORM-NEXT:    s_waitcnt lgkmcnt(0)
713 ; GCN-DENORM-NEXT:    v_div_scale_f32 v0, s[2:3], s4, s4, -1.0
714 ; GCN-DENORM-NEXT:    v_div_scale_f32 v1, vcc, -1.0, s4, -1.0
715 ; GCN-DENORM-NEXT:    v_rcp_f32_e32 v2, v0
716 ; GCN-DENORM-NEXT:    v_fma_f32 v3, -v0, v2, 1.0
717 ; GCN-DENORM-NEXT:    v_fma_f32 v2, v3, v2, v2
718 ; GCN-DENORM-NEXT:    v_mul_f32_e32 v3, v1, v2
719 ; GCN-DENORM-NEXT:    v_fma_f32 v4, -v0, v3, v1
720 ; GCN-DENORM-NEXT:    v_fma_f32 v3, v4, v2, v3
721 ; GCN-DENORM-NEXT:    v_fma_f32 v0, -v0, v3, v1
722 ; GCN-DENORM-NEXT:    v_div_fmas_f32 v0, v0, v2, v3
723 ; GCN-DENORM-NEXT:    v_mov_b32_e32 v1, 0
724 ; GCN-DENORM-NEXT:    v_div_fixup_f32 v0, v0, s4, -1.0
725 ; GCN-DENORM-NEXT:    global_store_dword v1, v0, s[0:1]
726 ; GCN-DENORM-NEXT:    s_endpgm
728 ; GCN-FLUSH-LABEL: div_1_by_minus_x_correctly_rounded:
729 ; GCN-FLUSH:       ; %bb.0:
730 ; GCN-FLUSH-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
731 ; GCN-FLUSH-NEXT:    s_waitcnt lgkmcnt(0)
732 ; GCN-FLUSH-NEXT:    s_load_dword s4, s[0:1], 0x0
733 ; GCN-FLUSH-NEXT:    s_waitcnt lgkmcnt(0)
734 ; GCN-FLUSH-NEXT:    v_div_scale_f32 v0, s[2:3], -s4, -s4, 1.0
735 ; GCN-FLUSH-NEXT:    v_div_scale_f32 v1, vcc, 1.0, -s4, 1.0
736 ; GCN-FLUSH-NEXT:    v_rcp_f32_e32 v2, v0
737 ; GCN-FLUSH-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_MODE, 4, 2), 3
738 ; GCN-FLUSH-NEXT:    v_fma_f32 v3, -v0, v2, 1.0
739 ; GCN-FLUSH-NEXT:    v_fma_f32 v2, v3, v2, v2
740 ; GCN-FLUSH-NEXT:    v_mul_f32_e32 v3, v1, v2
741 ; GCN-FLUSH-NEXT:    v_fma_f32 v4, -v0, v3, v1
742 ; GCN-FLUSH-NEXT:    v_fma_f32 v3, v4, v2, v3
743 ; GCN-FLUSH-NEXT:    v_fma_f32 v0, -v0, v3, v1
744 ; GCN-FLUSH-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_MODE, 4, 2), 0
745 ; GCN-FLUSH-NEXT:    v_div_fmas_f32 v0, v0, v2, v3
746 ; GCN-FLUSH-NEXT:    v_mov_b32_e32 v1, 0
747 ; GCN-FLUSH-NEXT:    v_div_fixup_f32 v0, v0, -s4, 1.0
748 ; GCN-FLUSH-NEXT:    global_store_dword v1, v0, s[0:1]
749 ; GCN-FLUSH-NEXT:    s_endpgm
750   %load = load float, ptr addrspace(1) %arg, align 4
751   %neg = fsub float -0.000000e+00, %load
752   %div = fdiv float 1.000000e+00, %neg
753   store float %div, ptr addrspace(1) %arg, align 4
754   ret void
757 define amdgpu_kernel void @div_minus_1_by_minus_x_correctly_rounded(ptr addrspace(1) %arg) {
758 ; GCN-DENORM-LABEL: div_minus_1_by_minus_x_correctly_rounded:
759 ; GCN-DENORM:       ; %bb.0:
760 ; GCN-DENORM-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
761 ; GCN-DENORM-NEXT:    s_waitcnt lgkmcnt(0)
762 ; GCN-DENORM-NEXT:    s_load_dword s4, s[0:1], 0x0
763 ; GCN-DENORM-NEXT:    s_waitcnt lgkmcnt(0)
764 ; GCN-DENORM-NEXT:    v_div_scale_f32 v0, s[2:3], s4, s4, 1.0
765 ; GCN-DENORM-NEXT:    v_div_scale_f32 v1, vcc, 1.0, s4, 1.0
766 ; GCN-DENORM-NEXT:    v_rcp_f32_e32 v2, v0
767 ; GCN-DENORM-NEXT:    v_fma_f32 v3, -v0, v2, 1.0
768 ; GCN-DENORM-NEXT:    v_fma_f32 v2, v3, v2, v2
769 ; GCN-DENORM-NEXT:    v_mul_f32_e32 v3, v1, v2
770 ; GCN-DENORM-NEXT:    v_fma_f32 v4, -v0, v3, v1
771 ; GCN-DENORM-NEXT:    v_fma_f32 v3, v4, v2, v3
772 ; GCN-DENORM-NEXT:    v_fma_f32 v0, -v0, v3, v1
773 ; GCN-DENORM-NEXT:    v_div_fmas_f32 v0, v0, v2, v3
774 ; GCN-DENORM-NEXT:    v_mov_b32_e32 v1, 0
775 ; GCN-DENORM-NEXT:    v_div_fixup_f32 v0, v0, s4, 1.0
776 ; GCN-DENORM-NEXT:    global_store_dword v1, v0, s[0:1]
777 ; GCN-DENORM-NEXT:    s_endpgm
779 ; GCN-FLUSH-LABEL: div_minus_1_by_minus_x_correctly_rounded:
780 ; GCN-FLUSH:       ; %bb.0:
781 ; GCN-FLUSH-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
782 ; GCN-FLUSH-NEXT:    s_waitcnt lgkmcnt(0)
783 ; GCN-FLUSH-NEXT:    s_load_dword s4, s[0:1], 0x0
784 ; GCN-FLUSH-NEXT:    s_waitcnt lgkmcnt(0)
785 ; GCN-FLUSH-NEXT:    v_div_scale_f32 v0, s[2:3], -s4, -s4, -1.0
786 ; GCN-FLUSH-NEXT:    v_div_scale_f32 v1, vcc, -1.0, -s4, -1.0
787 ; GCN-FLUSH-NEXT:    v_rcp_f32_e32 v2, v0
788 ; GCN-FLUSH-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_MODE, 4, 2), 3
789 ; GCN-FLUSH-NEXT:    v_fma_f32 v3, -v0, v2, 1.0
790 ; GCN-FLUSH-NEXT:    v_fma_f32 v2, v3, v2, v2
791 ; GCN-FLUSH-NEXT:    v_mul_f32_e32 v3, v1, v2
792 ; GCN-FLUSH-NEXT:    v_fma_f32 v4, -v0, v3, v1
793 ; GCN-FLUSH-NEXT:    v_fma_f32 v3, v4, v2, v3
794 ; GCN-FLUSH-NEXT:    v_fma_f32 v0, -v0, v3, v1
795 ; GCN-FLUSH-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_MODE, 4, 2), 0
796 ; GCN-FLUSH-NEXT:    v_div_fmas_f32 v0, v0, v2, v3
797 ; GCN-FLUSH-NEXT:    v_mov_b32_e32 v1, 0
798 ; GCN-FLUSH-NEXT:    v_div_fixup_f32 v0, v0, -s4, -1.0
799 ; GCN-FLUSH-NEXT:    global_store_dword v1, v0, s[0:1]
800 ; GCN-FLUSH-NEXT:    s_endpgm
801   %load = load float, ptr addrspace(1) %arg, align 4
802   %neg = fsub float -0.000000e+00, %load
803   %div = fdiv float -1.000000e+00, %neg
804   store float %div, ptr addrspace(1) %arg, align 4
805   ret void
808 !0 = !{float 2.500000e+00}