Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / amdgpu-codegenprepare-idiv.ll
blobd9001656f308e1d49d446cb9bbed85e8aee2b7b9
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: opt -S -mtriple=amdgcn-- -mcpu=tahiti -amdgpu-codegenprepare -amdgpu-bypass-slow-div=0 %s | FileCheck %s
3 ; RUN: llc -mtriple=amdgcn-- -mcpu=tahiti -amdgpu-bypass-slow-div=0 < %s | FileCheck -check-prefix=GFX6 %s
4 ; RUN: llc -mtriple=amdgcn-- -mcpu=gfx900 -amdgpu-bypass-slow-div=0 < %s | FileCheck -check-prefix=GFX9 %s
6 define amdgpu_kernel void @udiv_i32(ptr addrspace(1) %out, i32 %x, i32 %y) {
7 ; CHECK-LABEL: @udiv_i32(
8 ; CHECK-NEXT:    [[TMP1:%.*]] = uitofp i32 [[Y:%.*]] to float
9 ; CHECK-NEXT:    [[TMP2:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP1]])
10 ; CHECK-NEXT:    [[TMP3:%.*]] = fmul fast float [[TMP2]], 0x41EFFFFFC0000000
11 ; CHECK-NEXT:    [[TMP4:%.*]] = fptoui float [[TMP3]] to i32
12 ; CHECK-NEXT:    [[TMP5:%.*]] = sub i32 0, [[Y]]
13 ; CHECK-NEXT:    [[TMP6:%.*]] = mul i32 [[TMP5]], [[TMP4]]
14 ; CHECK-NEXT:    [[TMP7:%.*]] = zext i32 [[TMP4]] to i64
15 ; CHECK-NEXT:    [[TMP8:%.*]] = zext i32 [[TMP6]] to i64
16 ; CHECK-NEXT:    [[TMP9:%.*]] = mul i64 [[TMP7]], [[TMP8]]
17 ; CHECK-NEXT:    [[TMP10:%.*]] = trunc i64 [[TMP9]] to i32
18 ; CHECK-NEXT:    [[TMP11:%.*]] = lshr i64 [[TMP9]], 32
19 ; CHECK-NEXT:    [[TMP12:%.*]] = trunc i64 [[TMP11]] to i32
20 ; CHECK-NEXT:    [[TMP13:%.*]] = add i32 [[TMP4]], [[TMP12]]
21 ; CHECK-NEXT:    [[TMP14:%.*]] = zext i32 [[X:%.*]] to i64
22 ; CHECK-NEXT:    [[TMP15:%.*]] = zext i32 [[TMP13]] to i64
23 ; CHECK-NEXT:    [[TMP16:%.*]] = mul i64 [[TMP14]], [[TMP15]]
24 ; CHECK-NEXT:    [[TMP17:%.*]] = trunc i64 [[TMP16]] to i32
25 ; CHECK-NEXT:    [[TMP18:%.*]] = lshr i64 [[TMP16]], 32
26 ; CHECK-NEXT:    [[TMP19:%.*]] = trunc i64 [[TMP18]] to i32
27 ; CHECK-NEXT:    [[TMP20:%.*]] = mul i32 [[TMP19]], [[Y]]
28 ; CHECK-NEXT:    [[TMP21:%.*]] = sub i32 [[X]], [[TMP20]]
29 ; CHECK-NEXT:    [[TMP22:%.*]] = icmp uge i32 [[TMP21]], [[Y]]
30 ; CHECK-NEXT:    [[TMP23:%.*]] = add i32 [[TMP19]], 1
31 ; CHECK-NEXT:    [[TMP24:%.*]] = select i1 [[TMP22]], i32 [[TMP23]], i32 [[TMP19]]
32 ; CHECK-NEXT:    [[TMP25:%.*]] = sub i32 [[TMP21]], [[Y]]
33 ; CHECK-NEXT:    [[TMP26:%.*]] = select i1 [[TMP22]], i32 [[TMP25]], i32 [[TMP21]]
34 ; CHECK-NEXT:    [[TMP27:%.*]] = icmp uge i32 [[TMP26]], [[Y]]
35 ; CHECK-NEXT:    [[TMP28:%.*]] = add i32 [[TMP24]], 1
36 ; CHECK-NEXT:    [[TMP29:%.*]] = select i1 [[TMP27]], i32 [[TMP28]], i32 [[TMP24]]
37 ; CHECK-NEXT:    store i32 [[TMP29]], ptr addrspace(1) [[OUT:%.*]], align 4
38 ; CHECK-NEXT:    ret void
40 ; GFX6-LABEL: udiv_i32:
41 ; GFX6:       ; %bb.0:
42 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
43 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
44 ; GFX6-NEXT:    s_mov_b32 s6, -1
45 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
46 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v0, s3
47 ; GFX6-NEXT:    s_sub_i32 s4, 0, s3
48 ; GFX6-NEXT:    s_mov_b32 s5, s1
49 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v0, v0
50 ; GFX6-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
51 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v0, v0
52 ; GFX6-NEXT:    v_mul_lo_u32 v1, s4, v0
53 ; GFX6-NEXT:    s_mov_b32 s4, s0
54 ; GFX6-NEXT:    v_mul_hi_u32 v1, v0, v1
55 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, v0, v1
56 ; GFX6-NEXT:    v_mul_hi_u32 v0, s2, v0
57 ; GFX6-NEXT:    v_readfirstlane_b32 s0, v0
58 ; GFX6-NEXT:    s_mul_i32 s0, s0, s3
59 ; GFX6-NEXT:    s_sub_i32 s0, s2, s0
60 ; GFX6-NEXT:    s_sub_i32 s1, s0, s3
61 ; GFX6-NEXT:    v_add_i32_e32 v1, vcc, 1, v0
62 ; GFX6-NEXT:    s_cmp_ge_u32 s0, s3
63 ; GFX6-NEXT:    s_cselect_b64 vcc, -1, 0
64 ; GFX6-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
65 ; GFX6-NEXT:    s_cselect_b32 s0, s1, s0
66 ; GFX6-NEXT:    v_add_i32_e32 v1, vcc, 1, v0
67 ; GFX6-NEXT:    s_cmp_ge_u32 s0, s3
68 ; GFX6-NEXT:    s_cselect_b64 vcc, -1, 0
69 ; GFX6-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
70 ; GFX6-NEXT:    buffer_store_dword v0, off, s[4:7], 0
71 ; GFX6-NEXT:    s_endpgm
73 ; GFX9-LABEL: udiv_i32:
74 ; GFX9:       ; %bb.0:
75 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
76 ; GFX9-NEXT:    v_mov_b32_e32 v1, 0
77 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
78 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v0, s3
79 ; GFX9-NEXT:    s_sub_i32 s4, 0, s3
80 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v0, v0
81 ; GFX9-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
82 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v0, v0
83 ; GFX9-NEXT:    v_readfirstlane_b32 s5, v0
84 ; GFX9-NEXT:    s_mul_i32 s4, s4, s5
85 ; GFX9-NEXT:    s_mul_hi_u32 s4, s5, s4
86 ; GFX9-NEXT:    s_add_i32 s5, s5, s4
87 ; GFX9-NEXT:    s_mul_hi_u32 s4, s2, s5
88 ; GFX9-NEXT:    s_mul_i32 s5, s4, s3
89 ; GFX9-NEXT:    s_sub_i32 s2, s2, s5
90 ; GFX9-NEXT:    s_add_i32 s6, s4, 1
91 ; GFX9-NEXT:    s_sub_i32 s5, s2, s3
92 ; GFX9-NEXT:    s_cmp_ge_u32 s2, s3
93 ; GFX9-NEXT:    s_cselect_b32 s4, s6, s4
94 ; GFX9-NEXT:    s_cselect_b32 s2, s5, s2
95 ; GFX9-NEXT:    s_add_i32 s5, s4, 1
96 ; GFX9-NEXT:    s_cmp_ge_u32 s2, s3
97 ; GFX9-NEXT:    s_cselect_b32 s2, s5, s4
98 ; GFX9-NEXT:    v_mov_b32_e32 v0, s2
99 ; GFX9-NEXT:    global_store_dword v1, v0, s[0:1]
100 ; GFX9-NEXT:    s_endpgm
101   %r = udiv i32 %x, %y
102   store i32 %r, ptr addrspace(1) %out
103   ret void
106 define amdgpu_kernel void @urem_i32(ptr addrspace(1) %out, i32 %x, i32 %y) {
107 ; CHECK-LABEL: @urem_i32(
108 ; CHECK-NEXT:    [[TMP1:%.*]] = uitofp i32 [[Y:%.*]] to float
109 ; CHECK-NEXT:    [[TMP2:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP1]])
110 ; CHECK-NEXT:    [[TMP3:%.*]] = fmul fast float [[TMP2]], 0x41EFFFFFC0000000
111 ; CHECK-NEXT:    [[TMP4:%.*]] = fptoui float [[TMP3]] to i32
112 ; CHECK-NEXT:    [[TMP5:%.*]] = sub i32 0, [[Y]]
113 ; CHECK-NEXT:    [[TMP6:%.*]] = mul i32 [[TMP5]], [[TMP4]]
114 ; CHECK-NEXT:    [[TMP7:%.*]] = zext i32 [[TMP4]] to i64
115 ; CHECK-NEXT:    [[TMP8:%.*]] = zext i32 [[TMP6]] to i64
116 ; CHECK-NEXT:    [[TMP9:%.*]] = mul i64 [[TMP7]], [[TMP8]]
117 ; CHECK-NEXT:    [[TMP10:%.*]] = trunc i64 [[TMP9]] to i32
118 ; CHECK-NEXT:    [[TMP11:%.*]] = lshr i64 [[TMP9]], 32
119 ; CHECK-NEXT:    [[TMP12:%.*]] = trunc i64 [[TMP11]] to i32
120 ; CHECK-NEXT:    [[TMP13:%.*]] = add i32 [[TMP4]], [[TMP12]]
121 ; CHECK-NEXT:    [[TMP14:%.*]] = zext i32 [[X:%.*]] to i64
122 ; CHECK-NEXT:    [[TMP15:%.*]] = zext i32 [[TMP13]] to i64
123 ; CHECK-NEXT:    [[TMP16:%.*]] = mul i64 [[TMP14]], [[TMP15]]
124 ; CHECK-NEXT:    [[TMP17:%.*]] = trunc i64 [[TMP16]] to i32
125 ; CHECK-NEXT:    [[TMP18:%.*]] = lshr i64 [[TMP16]], 32
126 ; CHECK-NEXT:    [[TMP19:%.*]] = trunc i64 [[TMP18]] to i32
127 ; CHECK-NEXT:    [[TMP20:%.*]] = mul i32 [[TMP19]], [[Y]]
128 ; CHECK-NEXT:    [[TMP21:%.*]] = sub i32 [[X]], [[TMP20]]
129 ; CHECK-NEXT:    [[TMP22:%.*]] = icmp uge i32 [[TMP21]], [[Y]]
130 ; CHECK-NEXT:    [[TMP23:%.*]] = sub i32 [[TMP21]], [[Y]]
131 ; CHECK-NEXT:    [[TMP24:%.*]] = select i1 [[TMP22]], i32 [[TMP23]], i32 [[TMP21]]
132 ; CHECK-NEXT:    [[TMP25:%.*]] = icmp uge i32 [[TMP24]], [[Y]]
133 ; CHECK-NEXT:    [[TMP26:%.*]] = sub i32 [[TMP24]], [[Y]]
134 ; CHECK-NEXT:    [[TMP27:%.*]] = select i1 [[TMP25]], i32 [[TMP26]], i32 [[TMP24]]
135 ; CHECK-NEXT:    store i32 [[TMP27]], ptr addrspace(1) [[OUT:%.*]], align 4
136 ; CHECK-NEXT:    ret void
138 ; GFX6-LABEL: urem_i32:
139 ; GFX6:       ; %bb.0:
140 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
141 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
142 ; GFX6-NEXT:    s_mov_b32 s6, -1
143 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
144 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v0, s3
145 ; GFX6-NEXT:    s_sub_i32 s4, 0, s3
146 ; GFX6-NEXT:    s_mov_b32 s5, s1
147 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v0, v0
148 ; GFX6-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
149 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v0, v0
150 ; GFX6-NEXT:    v_mul_lo_u32 v1, s4, v0
151 ; GFX6-NEXT:    s_mov_b32 s4, s0
152 ; GFX6-NEXT:    v_mul_hi_u32 v1, v0, v1
153 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, v0, v1
154 ; GFX6-NEXT:    v_mul_hi_u32 v0, s2, v0
155 ; GFX6-NEXT:    v_readfirstlane_b32 s0, v0
156 ; GFX6-NEXT:    s_mul_i32 s0, s0, s3
157 ; GFX6-NEXT:    s_sub_i32 s0, s2, s0
158 ; GFX6-NEXT:    s_sub_i32 s1, s0, s3
159 ; GFX6-NEXT:    s_cmp_ge_u32 s0, s3
160 ; GFX6-NEXT:    s_cselect_b32 s0, s1, s0
161 ; GFX6-NEXT:    s_sub_i32 s1, s0, s3
162 ; GFX6-NEXT:    s_cmp_ge_u32 s0, s3
163 ; GFX6-NEXT:    s_cselect_b32 s0, s1, s0
164 ; GFX6-NEXT:    v_mov_b32_e32 v0, s0
165 ; GFX6-NEXT:    buffer_store_dword v0, off, s[4:7], 0
166 ; GFX6-NEXT:    s_endpgm
168 ; GFX9-LABEL: urem_i32:
169 ; GFX9:       ; %bb.0:
170 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
171 ; GFX9-NEXT:    v_mov_b32_e32 v1, 0
172 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
173 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v0, s3
174 ; GFX9-NEXT:    s_sub_i32 s4, 0, s3
175 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v0, v0
176 ; GFX9-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
177 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v0, v0
178 ; GFX9-NEXT:    v_readfirstlane_b32 s5, v0
179 ; GFX9-NEXT:    s_mul_i32 s4, s4, s5
180 ; GFX9-NEXT:    s_mul_hi_u32 s4, s5, s4
181 ; GFX9-NEXT:    s_add_i32 s5, s5, s4
182 ; GFX9-NEXT:    s_mul_hi_u32 s4, s2, s5
183 ; GFX9-NEXT:    s_mul_i32 s4, s4, s3
184 ; GFX9-NEXT:    s_sub_i32 s2, s2, s4
185 ; GFX9-NEXT:    s_sub_i32 s4, s2, s3
186 ; GFX9-NEXT:    s_cmp_ge_u32 s2, s3
187 ; GFX9-NEXT:    s_cselect_b32 s2, s4, s2
188 ; GFX9-NEXT:    s_sub_i32 s4, s2, s3
189 ; GFX9-NEXT:    s_cmp_ge_u32 s2, s3
190 ; GFX9-NEXT:    s_cselect_b32 s2, s4, s2
191 ; GFX9-NEXT:    v_mov_b32_e32 v0, s2
192 ; GFX9-NEXT:    global_store_dword v1, v0, s[0:1]
193 ; GFX9-NEXT:    s_endpgm
194   %r = urem i32 %x, %y
195   store i32 %r, ptr addrspace(1) %out
196   ret void
199 define amdgpu_kernel void @sdiv_i32(ptr addrspace(1) %out, i32 %x, i32 %y) {
200 ; CHECK-LABEL: @sdiv_i32(
201 ; CHECK-NEXT:    [[TMP1:%.*]] = ashr i32 [[X:%.*]], 31
202 ; CHECK-NEXT:    [[TMP2:%.*]] = ashr i32 [[Y:%.*]], 31
203 ; CHECK-NEXT:    [[TMP3:%.*]] = xor i32 [[TMP1]], [[TMP2]]
204 ; CHECK-NEXT:    [[TMP4:%.*]] = add i32 [[X]], [[TMP1]]
205 ; CHECK-NEXT:    [[TMP5:%.*]] = add i32 [[Y]], [[TMP2]]
206 ; CHECK-NEXT:    [[TMP6:%.*]] = xor i32 [[TMP4]], [[TMP1]]
207 ; CHECK-NEXT:    [[TMP7:%.*]] = xor i32 [[TMP5]], [[TMP2]]
208 ; CHECK-NEXT:    [[TMP8:%.*]] = uitofp i32 [[TMP7]] to float
209 ; CHECK-NEXT:    [[TMP9:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP8]])
210 ; CHECK-NEXT:    [[TMP10:%.*]] = fmul fast float [[TMP9]], 0x41EFFFFFC0000000
211 ; CHECK-NEXT:    [[TMP11:%.*]] = fptoui float [[TMP10]] to i32
212 ; CHECK-NEXT:    [[TMP12:%.*]] = sub i32 0, [[TMP7]]
213 ; CHECK-NEXT:    [[TMP13:%.*]] = mul i32 [[TMP12]], [[TMP11]]
214 ; CHECK-NEXT:    [[TMP14:%.*]] = zext i32 [[TMP11]] to i64
215 ; CHECK-NEXT:    [[TMP15:%.*]] = zext i32 [[TMP13]] to i64
216 ; CHECK-NEXT:    [[TMP16:%.*]] = mul i64 [[TMP14]], [[TMP15]]
217 ; CHECK-NEXT:    [[TMP17:%.*]] = trunc i64 [[TMP16]] to i32
218 ; CHECK-NEXT:    [[TMP18:%.*]] = lshr i64 [[TMP16]], 32
219 ; CHECK-NEXT:    [[TMP19:%.*]] = trunc i64 [[TMP18]] to i32
220 ; CHECK-NEXT:    [[TMP20:%.*]] = add i32 [[TMP11]], [[TMP19]]
221 ; CHECK-NEXT:    [[TMP21:%.*]] = zext i32 [[TMP6]] to i64
222 ; CHECK-NEXT:    [[TMP22:%.*]] = zext i32 [[TMP20]] to i64
223 ; CHECK-NEXT:    [[TMP23:%.*]] = mul i64 [[TMP21]], [[TMP22]]
224 ; CHECK-NEXT:    [[TMP24:%.*]] = trunc i64 [[TMP23]] to i32
225 ; CHECK-NEXT:    [[TMP25:%.*]] = lshr i64 [[TMP23]], 32
226 ; CHECK-NEXT:    [[TMP26:%.*]] = trunc i64 [[TMP25]] to i32
227 ; CHECK-NEXT:    [[TMP27:%.*]] = mul i32 [[TMP26]], [[TMP7]]
228 ; CHECK-NEXT:    [[TMP28:%.*]] = sub i32 [[TMP6]], [[TMP27]]
229 ; CHECK-NEXT:    [[TMP29:%.*]] = icmp uge i32 [[TMP28]], [[TMP7]]
230 ; CHECK-NEXT:    [[TMP30:%.*]] = add i32 [[TMP26]], 1
231 ; CHECK-NEXT:    [[TMP31:%.*]] = select i1 [[TMP29]], i32 [[TMP30]], i32 [[TMP26]]
232 ; CHECK-NEXT:    [[TMP32:%.*]] = sub i32 [[TMP28]], [[TMP7]]
233 ; CHECK-NEXT:    [[TMP33:%.*]] = select i1 [[TMP29]], i32 [[TMP32]], i32 [[TMP28]]
234 ; CHECK-NEXT:    [[TMP34:%.*]] = icmp uge i32 [[TMP33]], [[TMP7]]
235 ; CHECK-NEXT:    [[TMP35:%.*]] = add i32 [[TMP31]], 1
236 ; CHECK-NEXT:    [[TMP36:%.*]] = select i1 [[TMP34]], i32 [[TMP35]], i32 [[TMP31]]
237 ; CHECK-NEXT:    [[TMP37:%.*]] = xor i32 [[TMP36]], [[TMP3]]
238 ; CHECK-NEXT:    [[TMP38:%.*]] = sub i32 [[TMP37]], [[TMP3]]
239 ; CHECK-NEXT:    store i32 [[TMP38]], ptr addrspace(1) [[OUT:%.*]], align 4
240 ; CHECK-NEXT:    ret void
242 ; GFX6-LABEL: sdiv_i32:
243 ; GFX6:       ; %bb.0:
244 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
245 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
246 ; GFX6-NEXT:    s_mov_b32 s6, -1
247 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
248 ; GFX6-NEXT:    s_ashr_i32 s8, s3, 31
249 ; GFX6-NEXT:    s_add_i32 s3, s3, s8
250 ; GFX6-NEXT:    s_xor_b32 s3, s3, s8
251 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v0, s3
252 ; GFX6-NEXT:    s_sub_i32 s4, 0, s3
253 ; GFX6-NEXT:    s_ashr_i32 s9, s2, 31
254 ; GFX6-NEXT:    s_add_i32 s2, s2, s9
255 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v0, v0
256 ; GFX6-NEXT:    s_xor_b32 s2, s2, s9
257 ; GFX6-NEXT:    s_mov_b32 s5, s1
258 ; GFX6-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
259 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v0, v0
260 ; GFX6-NEXT:    v_mul_lo_u32 v1, s4, v0
261 ; GFX6-NEXT:    s_mov_b32 s4, s0
262 ; GFX6-NEXT:    s_xor_b32 s0, s9, s8
263 ; GFX6-NEXT:    v_mul_hi_u32 v1, v0, v1
264 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, v0, v1
265 ; GFX6-NEXT:    v_mul_hi_u32 v0, s2, v0
266 ; GFX6-NEXT:    v_readfirstlane_b32 s1, v0
267 ; GFX6-NEXT:    s_mul_i32 s1, s1, s3
268 ; GFX6-NEXT:    s_sub_i32 s1, s2, s1
269 ; GFX6-NEXT:    s_sub_i32 s2, s1, s3
270 ; GFX6-NEXT:    v_add_i32_e32 v1, vcc, 1, v0
271 ; GFX6-NEXT:    s_cmp_ge_u32 s1, s3
272 ; GFX6-NEXT:    s_cselect_b64 vcc, -1, 0
273 ; GFX6-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
274 ; GFX6-NEXT:    s_cselect_b32 s1, s2, s1
275 ; GFX6-NEXT:    v_add_i32_e32 v1, vcc, 1, v0
276 ; GFX6-NEXT:    s_cmp_ge_u32 s1, s3
277 ; GFX6-NEXT:    s_cselect_b64 vcc, -1, 0
278 ; GFX6-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
279 ; GFX6-NEXT:    v_xor_b32_e32 v0, s0, v0
280 ; GFX6-NEXT:    v_subrev_i32_e32 v0, vcc, s0, v0
281 ; GFX6-NEXT:    buffer_store_dword v0, off, s[4:7], 0
282 ; GFX6-NEXT:    s_endpgm
284 ; GFX9-LABEL: sdiv_i32:
285 ; GFX9:       ; %bb.0:
286 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
287 ; GFX9-NEXT:    v_mov_b32_e32 v1, 0
288 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
289 ; GFX9-NEXT:    s_ashr_i32 s4, s3, 31
290 ; GFX9-NEXT:    s_add_i32 s3, s3, s4
291 ; GFX9-NEXT:    s_xor_b32 s3, s3, s4
292 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v0, s3
293 ; GFX9-NEXT:    s_ashr_i32 s5, s2, 31
294 ; GFX9-NEXT:    s_add_i32 s2, s2, s5
295 ; GFX9-NEXT:    s_xor_b32 s4, s5, s4
296 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v0, v0
297 ; GFX9-NEXT:    s_xor_b32 s2, s2, s5
298 ; GFX9-NEXT:    s_sub_i32 s5, 0, s3
299 ; GFX9-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
300 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v0, v0
301 ; GFX9-NEXT:    v_readfirstlane_b32 s6, v0
302 ; GFX9-NEXT:    s_mul_i32 s5, s5, s6
303 ; GFX9-NEXT:    s_mul_hi_u32 s5, s6, s5
304 ; GFX9-NEXT:    s_add_i32 s6, s6, s5
305 ; GFX9-NEXT:    s_mul_hi_u32 s5, s2, s6
306 ; GFX9-NEXT:    s_mul_i32 s6, s5, s3
307 ; GFX9-NEXT:    s_sub_i32 s2, s2, s6
308 ; GFX9-NEXT:    s_add_i32 s7, s5, 1
309 ; GFX9-NEXT:    s_sub_i32 s6, s2, s3
310 ; GFX9-NEXT:    s_cmp_ge_u32 s2, s3
311 ; GFX9-NEXT:    s_cselect_b32 s5, s7, s5
312 ; GFX9-NEXT:    s_cselect_b32 s2, s6, s2
313 ; GFX9-NEXT:    s_add_i32 s6, s5, 1
314 ; GFX9-NEXT:    s_cmp_ge_u32 s2, s3
315 ; GFX9-NEXT:    s_cselect_b32 s2, s6, s5
316 ; GFX9-NEXT:    s_xor_b32 s2, s2, s4
317 ; GFX9-NEXT:    s_sub_i32 s2, s2, s4
318 ; GFX9-NEXT:    v_mov_b32_e32 v0, s2
319 ; GFX9-NEXT:    global_store_dword v1, v0, s[0:1]
320 ; GFX9-NEXT:    s_endpgm
321   %r = sdiv i32 %x, %y
322   store i32 %r, ptr addrspace(1) %out
323   ret void
326 define amdgpu_kernel void @srem_i32(ptr addrspace(1) %out, i32 %x, i32 %y) {
327 ; CHECK-LABEL: @srem_i32(
328 ; CHECK-NEXT:    [[TMP1:%.*]] = ashr i32 [[X:%.*]], 31
329 ; CHECK-NEXT:    [[TMP2:%.*]] = ashr i32 [[Y:%.*]], 31
330 ; CHECK-NEXT:    [[TMP3:%.*]] = add i32 [[X]], [[TMP1]]
331 ; CHECK-NEXT:    [[TMP4:%.*]] = add i32 [[Y]], [[TMP2]]
332 ; CHECK-NEXT:    [[TMP5:%.*]] = xor i32 [[TMP3]], [[TMP1]]
333 ; CHECK-NEXT:    [[TMP6:%.*]] = xor i32 [[TMP4]], [[TMP2]]
334 ; CHECK-NEXT:    [[TMP7:%.*]] = uitofp i32 [[TMP6]] to float
335 ; CHECK-NEXT:    [[TMP8:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP7]])
336 ; CHECK-NEXT:    [[TMP9:%.*]] = fmul fast float [[TMP8]], 0x41EFFFFFC0000000
337 ; CHECK-NEXT:    [[TMP10:%.*]] = fptoui float [[TMP9]] to i32
338 ; CHECK-NEXT:    [[TMP11:%.*]] = sub i32 0, [[TMP6]]
339 ; CHECK-NEXT:    [[TMP12:%.*]] = mul i32 [[TMP11]], [[TMP10]]
340 ; CHECK-NEXT:    [[TMP13:%.*]] = zext i32 [[TMP10]] to i64
341 ; CHECK-NEXT:    [[TMP14:%.*]] = zext i32 [[TMP12]] to i64
342 ; CHECK-NEXT:    [[TMP15:%.*]] = mul i64 [[TMP13]], [[TMP14]]
343 ; CHECK-NEXT:    [[TMP16:%.*]] = trunc i64 [[TMP15]] to i32
344 ; CHECK-NEXT:    [[TMP17:%.*]] = lshr i64 [[TMP15]], 32
345 ; CHECK-NEXT:    [[TMP18:%.*]] = trunc i64 [[TMP17]] to i32
346 ; CHECK-NEXT:    [[TMP19:%.*]] = add i32 [[TMP10]], [[TMP18]]
347 ; CHECK-NEXT:    [[TMP20:%.*]] = zext i32 [[TMP5]] to i64
348 ; CHECK-NEXT:    [[TMP21:%.*]] = zext i32 [[TMP19]] to i64
349 ; CHECK-NEXT:    [[TMP22:%.*]] = mul i64 [[TMP20]], [[TMP21]]
350 ; CHECK-NEXT:    [[TMP23:%.*]] = trunc i64 [[TMP22]] to i32
351 ; CHECK-NEXT:    [[TMP24:%.*]] = lshr i64 [[TMP22]], 32
352 ; CHECK-NEXT:    [[TMP25:%.*]] = trunc i64 [[TMP24]] to i32
353 ; CHECK-NEXT:    [[TMP26:%.*]] = mul i32 [[TMP25]], [[TMP6]]
354 ; CHECK-NEXT:    [[TMP27:%.*]] = sub i32 [[TMP5]], [[TMP26]]
355 ; CHECK-NEXT:    [[TMP28:%.*]] = icmp uge i32 [[TMP27]], [[TMP6]]
356 ; CHECK-NEXT:    [[TMP29:%.*]] = sub i32 [[TMP27]], [[TMP6]]
357 ; CHECK-NEXT:    [[TMP30:%.*]] = select i1 [[TMP28]], i32 [[TMP29]], i32 [[TMP27]]
358 ; CHECK-NEXT:    [[TMP31:%.*]] = icmp uge i32 [[TMP30]], [[TMP6]]
359 ; CHECK-NEXT:    [[TMP32:%.*]] = sub i32 [[TMP30]], [[TMP6]]
360 ; CHECK-NEXT:    [[TMP33:%.*]] = select i1 [[TMP31]], i32 [[TMP32]], i32 [[TMP30]]
361 ; CHECK-NEXT:    [[TMP34:%.*]] = xor i32 [[TMP33]], [[TMP1]]
362 ; CHECK-NEXT:    [[TMP35:%.*]] = sub i32 [[TMP34]], [[TMP1]]
363 ; CHECK-NEXT:    store i32 [[TMP35]], ptr addrspace(1) [[OUT:%.*]], align 4
364 ; CHECK-NEXT:    ret void
366 ; GFX6-LABEL: srem_i32:
367 ; GFX6:       ; %bb.0:
368 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
369 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
370 ; GFX6-NEXT:    s_ashr_i32 s4, s3, 31
371 ; GFX6-NEXT:    s_add_i32 s3, s3, s4
372 ; GFX6-NEXT:    s_xor_b32 s4, s3, s4
373 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v0, s4
374 ; GFX6-NEXT:    s_sub_i32 s3, 0, s4
375 ; GFX6-NEXT:    s_ashr_i32 s5, s2, 31
376 ; GFX6-NEXT:    s_add_i32 s2, s2, s5
377 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v0, v0
378 ; GFX6-NEXT:    s_xor_b32 s6, s2, s5
379 ; GFX6-NEXT:    s_mov_b32 s2, -1
380 ; GFX6-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
381 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v0, v0
382 ; GFX6-NEXT:    v_mul_lo_u32 v1, s3, v0
383 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
384 ; GFX6-NEXT:    v_mul_hi_u32 v1, v0, v1
385 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, v0, v1
386 ; GFX6-NEXT:    v_mul_hi_u32 v0, s6, v0
387 ; GFX6-NEXT:    v_readfirstlane_b32 s7, v0
388 ; GFX6-NEXT:    s_mul_i32 s7, s7, s4
389 ; GFX6-NEXT:    s_sub_i32 s6, s6, s7
390 ; GFX6-NEXT:    s_sub_i32 s7, s6, s4
391 ; GFX6-NEXT:    s_cmp_ge_u32 s6, s4
392 ; GFX6-NEXT:    s_cselect_b32 s6, s7, s6
393 ; GFX6-NEXT:    s_sub_i32 s7, s6, s4
394 ; GFX6-NEXT:    s_cmp_ge_u32 s6, s4
395 ; GFX6-NEXT:    s_cselect_b32 s4, s7, s6
396 ; GFX6-NEXT:    s_xor_b32 s4, s4, s5
397 ; GFX6-NEXT:    s_sub_i32 s4, s4, s5
398 ; GFX6-NEXT:    v_mov_b32_e32 v0, s4
399 ; GFX6-NEXT:    buffer_store_dword v0, off, s[0:3], 0
400 ; GFX6-NEXT:    s_endpgm
402 ; GFX9-LABEL: srem_i32:
403 ; GFX9:       ; %bb.0:
404 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
405 ; GFX9-NEXT:    v_mov_b32_e32 v1, 0
406 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
407 ; GFX9-NEXT:    s_ashr_i32 s4, s3, 31
408 ; GFX9-NEXT:    s_add_i32 s3, s3, s4
409 ; GFX9-NEXT:    s_xor_b32 s3, s3, s4
410 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v0, s3
411 ; GFX9-NEXT:    s_sub_i32 s5, 0, s3
412 ; GFX9-NEXT:    s_ashr_i32 s4, s2, 31
413 ; GFX9-NEXT:    s_add_i32 s2, s2, s4
414 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v0, v0
415 ; GFX9-NEXT:    s_xor_b32 s2, s2, s4
416 ; GFX9-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
417 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v0, v0
418 ; GFX9-NEXT:    v_readfirstlane_b32 s6, v0
419 ; GFX9-NEXT:    s_mul_i32 s5, s5, s6
420 ; GFX9-NEXT:    s_mul_hi_u32 s5, s6, s5
421 ; GFX9-NEXT:    s_add_i32 s6, s6, s5
422 ; GFX9-NEXT:    s_mul_hi_u32 s5, s2, s6
423 ; GFX9-NEXT:    s_mul_i32 s5, s5, s3
424 ; GFX9-NEXT:    s_sub_i32 s2, s2, s5
425 ; GFX9-NEXT:    s_sub_i32 s5, s2, s3
426 ; GFX9-NEXT:    s_cmp_ge_u32 s2, s3
427 ; GFX9-NEXT:    s_cselect_b32 s2, s5, s2
428 ; GFX9-NEXT:    s_sub_i32 s5, s2, s3
429 ; GFX9-NEXT:    s_cmp_ge_u32 s2, s3
430 ; GFX9-NEXT:    s_cselect_b32 s2, s5, s2
431 ; GFX9-NEXT:    s_xor_b32 s2, s2, s4
432 ; GFX9-NEXT:    s_sub_i32 s2, s2, s4
433 ; GFX9-NEXT:    v_mov_b32_e32 v0, s2
434 ; GFX9-NEXT:    global_store_dword v1, v0, s[0:1]
435 ; GFX9-NEXT:    s_endpgm
436   %r = srem i32 %x, %y
437   store i32 %r, ptr addrspace(1) %out
438   ret void
441 define amdgpu_kernel void @udiv_i16(ptr addrspace(1) %out, i16 %x, i16 %y) {
442 ; CHECK-LABEL: @udiv_i16(
443 ; CHECK-NEXT:    [[TMP1:%.*]] = zext i16 [[X:%.*]] to i32
444 ; CHECK-NEXT:    [[TMP2:%.*]] = zext i16 [[Y:%.*]] to i32
445 ; CHECK-NEXT:    [[TMP3:%.*]] = uitofp i32 [[TMP1]] to float
446 ; CHECK-NEXT:    [[TMP4:%.*]] = uitofp i32 [[TMP2]] to float
447 ; CHECK-NEXT:    [[TMP5:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP4]])
448 ; CHECK-NEXT:    [[TMP6:%.*]] = fmul fast float [[TMP3]], [[TMP5]]
449 ; CHECK-NEXT:    [[TMP7:%.*]] = call fast float @llvm.trunc.f32(float [[TMP6]])
450 ; CHECK-NEXT:    [[TMP8:%.*]] = fneg fast float [[TMP7]]
451 ; CHECK-NEXT:    [[TMP9:%.*]] = call fast float @llvm.amdgcn.fmad.ftz.f32(float [[TMP8]], float [[TMP4]], float [[TMP3]])
452 ; CHECK-NEXT:    [[TMP10:%.*]] = fptoui float [[TMP7]] to i32
453 ; CHECK-NEXT:    [[TMP11:%.*]] = call fast float @llvm.fabs.f32(float [[TMP9]])
454 ; CHECK-NEXT:    [[TMP12:%.*]] = call fast float @llvm.fabs.f32(float [[TMP4]])
455 ; CHECK-NEXT:    [[TMP13:%.*]] = fcmp fast oge float [[TMP11]], [[TMP12]]
456 ; CHECK-NEXT:    [[TMP14:%.*]] = select i1 [[TMP13]], i32 1, i32 0
457 ; CHECK-NEXT:    [[TMP15:%.*]] = add i32 [[TMP10]], [[TMP14]]
458 ; CHECK-NEXT:    [[TMP16:%.*]] = and i32 [[TMP15]], 65535
459 ; CHECK-NEXT:    [[TMP17:%.*]] = trunc i32 [[TMP16]] to i16
460 ; CHECK-NEXT:    store i16 [[TMP17]], ptr addrspace(1) [[OUT:%.*]], align 2
461 ; CHECK-NEXT:    ret void
463 ; GFX6-LABEL: udiv_i16:
464 ; GFX6:       ; %bb.0:
465 ; GFX6-NEXT:    s_load_dword s2, s[0:1], 0xb
466 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
467 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
468 ; GFX6-NEXT:    s_lshr_b32 s3, s2, 16
469 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v0, s3
470 ; GFX6-NEXT:    s_and_b32 s2, s2, 0xffff
471 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v1, s2
472 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
473 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v2, v0
474 ; GFX6-NEXT:    s_mov_b32 s2, -1
475 ; GFX6-NEXT:    v_mul_f32_e32 v2, v1, v2
476 ; GFX6-NEXT:    v_trunc_f32_e32 v2, v2
477 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v3, v2
478 ; GFX6-NEXT:    v_mad_f32 v1, -v2, v0, v1
479 ; GFX6-NEXT:    v_cmp_ge_f32_e64 vcc, |v1|, v0
480 ; GFX6-NEXT:    v_addc_u32_e32 v0, vcc, 0, v3, vcc
481 ; GFX6-NEXT:    buffer_store_short v0, off, s[0:3], 0
482 ; GFX6-NEXT:    s_endpgm
484 ; GFX9-LABEL: udiv_i16:
485 ; GFX9:       ; %bb.0:
486 ; GFX9-NEXT:    s_load_dword s2, s[0:1], 0x2c
487 ; GFX9-NEXT:    v_mov_b32_e32 v3, 0
488 ; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
489 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
490 ; GFX9-NEXT:    s_lshr_b32 s3, s2, 16
491 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v0, s3
492 ; GFX9-NEXT:    s_and_b32 s2, s2, 0xffff
493 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v1, s2
494 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v2, v0
495 ; GFX9-NEXT:    v_mul_f32_e32 v2, v1, v2
496 ; GFX9-NEXT:    v_trunc_f32_e32 v2, v2
497 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v4, v2
498 ; GFX9-NEXT:    v_mad_f32 v1, -v2, v0, v1
499 ; GFX9-NEXT:    v_cmp_ge_f32_e64 vcc, |v1|, v0
500 ; GFX9-NEXT:    v_addc_co_u32_e32 v0, vcc, 0, v4, vcc
501 ; GFX9-NEXT:    global_store_short v3, v0, s[0:1]
502 ; GFX9-NEXT:    s_endpgm
503   %r = udiv i16 %x, %y
504   store i16 %r, ptr addrspace(1) %out
505   ret void
508 define amdgpu_kernel void @urem_i16(ptr addrspace(1) %out, i16 %x, i16 %y) {
509 ; CHECK-LABEL: @urem_i16(
510 ; CHECK-NEXT:    [[TMP1:%.*]] = zext i16 [[X:%.*]] to i32
511 ; CHECK-NEXT:    [[TMP2:%.*]] = zext i16 [[Y:%.*]] to i32
512 ; CHECK-NEXT:    [[TMP3:%.*]] = uitofp i32 [[TMP1]] to float
513 ; CHECK-NEXT:    [[TMP4:%.*]] = uitofp i32 [[TMP2]] to float
514 ; CHECK-NEXT:    [[TMP5:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP4]])
515 ; CHECK-NEXT:    [[TMP6:%.*]] = fmul fast float [[TMP3]], [[TMP5]]
516 ; CHECK-NEXT:    [[TMP7:%.*]] = call fast float @llvm.trunc.f32(float [[TMP6]])
517 ; CHECK-NEXT:    [[TMP8:%.*]] = fneg fast float [[TMP7]]
518 ; CHECK-NEXT:    [[TMP9:%.*]] = call fast float @llvm.amdgcn.fmad.ftz.f32(float [[TMP8]], float [[TMP4]], float [[TMP3]])
519 ; CHECK-NEXT:    [[TMP10:%.*]] = fptoui float [[TMP7]] to i32
520 ; CHECK-NEXT:    [[TMP11:%.*]] = call fast float @llvm.fabs.f32(float [[TMP9]])
521 ; CHECK-NEXT:    [[TMP12:%.*]] = call fast float @llvm.fabs.f32(float [[TMP4]])
522 ; CHECK-NEXT:    [[TMP13:%.*]] = fcmp fast oge float [[TMP11]], [[TMP12]]
523 ; CHECK-NEXT:    [[TMP14:%.*]] = select i1 [[TMP13]], i32 1, i32 0
524 ; CHECK-NEXT:    [[TMP15:%.*]] = add i32 [[TMP10]], [[TMP14]]
525 ; CHECK-NEXT:    [[TMP16:%.*]] = mul i32 [[TMP15]], [[TMP2]]
526 ; CHECK-NEXT:    [[TMP17:%.*]] = sub i32 [[TMP1]], [[TMP16]]
527 ; CHECK-NEXT:    [[TMP18:%.*]] = and i32 [[TMP17]], 65535
528 ; CHECK-NEXT:    [[TMP19:%.*]] = trunc i32 [[TMP18]] to i16
529 ; CHECK-NEXT:    store i16 [[TMP19]], ptr addrspace(1) [[OUT:%.*]], align 2
530 ; CHECK-NEXT:    ret void
532 ; GFX6-LABEL: urem_i16:
533 ; GFX6:       ; %bb.0:
534 ; GFX6-NEXT:    s_load_dword s4, s[0:1], 0xb
535 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
536 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
537 ; GFX6-NEXT:    s_lshr_b32 s2, s4, 16
538 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v0, s2
539 ; GFX6-NEXT:    s_and_b32 s3, s4, 0xffff
540 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v1, s3
541 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
542 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v2, v0
543 ; GFX6-NEXT:    v_mul_f32_e32 v2, v1, v2
544 ; GFX6-NEXT:    v_trunc_f32_e32 v2, v2
545 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v3, v2
546 ; GFX6-NEXT:    v_mad_f32 v1, -v2, v0, v1
547 ; GFX6-NEXT:    v_cmp_ge_f32_e64 vcc, |v1|, v0
548 ; GFX6-NEXT:    v_addc_u32_e32 v0, vcc, 0, v3, vcc
549 ; GFX6-NEXT:    v_mul_lo_u32 v0, v0, s2
550 ; GFX6-NEXT:    s_mov_b32 s2, -1
551 ; GFX6-NEXT:    v_sub_i32_e32 v0, vcc, s4, v0
552 ; GFX6-NEXT:    buffer_store_short v0, off, s[0:3], 0
553 ; GFX6-NEXT:    s_endpgm
555 ; GFX9-LABEL: urem_i16:
556 ; GFX9:       ; %bb.0:
557 ; GFX9-NEXT:    s_load_dword s2, s[0:1], 0x2c
558 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
559 ; GFX9-NEXT:    s_lshr_b32 s3, s2, 16
560 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v0, s3
561 ; GFX9-NEXT:    s_and_b32 s4, s2, 0xffff
562 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v1, s4
563 ; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
564 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v2, v0
565 ; GFX9-NEXT:    v_mul_f32_e32 v2, v1, v2
566 ; GFX9-NEXT:    v_trunc_f32_e32 v2, v2
567 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v3, v2
568 ; GFX9-NEXT:    v_mad_f32 v1, -v2, v0, v1
569 ; GFX9-NEXT:    v_cmp_ge_f32_e64 vcc, |v1|, v0
570 ; GFX9-NEXT:    v_mov_b32_e32 v1, 0
571 ; GFX9-NEXT:    v_addc_co_u32_e32 v0, vcc, 0, v3, vcc
572 ; GFX9-NEXT:    v_mul_lo_u32 v0, v0, s3
573 ; GFX9-NEXT:    v_sub_u32_e32 v0, s2, v0
574 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
575 ; GFX9-NEXT:    global_store_short v1, v0, s[0:1]
576 ; GFX9-NEXT:    s_endpgm
577   %r = urem i16 %x, %y
578   store i16 %r, ptr addrspace(1) %out
579   ret void
582 define amdgpu_kernel void @sdiv_i16(ptr addrspace(1) %out, i16 %x, i16 %y) {
583 ; CHECK-LABEL: @sdiv_i16(
584 ; CHECK-NEXT:    [[TMP1:%.*]] = sext i16 [[X:%.*]] to i32
585 ; CHECK-NEXT:    [[TMP2:%.*]] = sext i16 [[Y:%.*]] to i32
586 ; CHECK-NEXT:    [[TMP3:%.*]] = xor i32 [[TMP1]], [[TMP2]]
587 ; CHECK-NEXT:    [[TMP4:%.*]] = ashr i32 [[TMP3]], 30
588 ; CHECK-NEXT:    [[TMP5:%.*]] = or i32 [[TMP4]], 1
589 ; CHECK-NEXT:    [[TMP6:%.*]] = sitofp i32 [[TMP1]] to float
590 ; CHECK-NEXT:    [[TMP7:%.*]] = sitofp i32 [[TMP2]] to float
591 ; CHECK-NEXT:    [[TMP8:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP7]])
592 ; CHECK-NEXT:    [[TMP9:%.*]] = fmul fast float [[TMP6]], [[TMP8]]
593 ; CHECK-NEXT:    [[TMP10:%.*]] = call fast float @llvm.trunc.f32(float [[TMP9]])
594 ; CHECK-NEXT:    [[TMP11:%.*]] = fneg fast float [[TMP10]]
595 ; CHECK-NEXT:    [[TMP12:%.*]] = call fast float @llvm.amdgcn.fmad.ftz.f32(float [[TMP11]], float [[TMP7]], float [[TMP6]])
596 ; CHECK-NEXT:    [[TMP13:%.*]] = fptosi float [[TMP10]] to i32
597 ; CHECK-NEXT:    [[TMP14:%.*]] = call fast float @llvm.fabs.f32(float [[TMP12]])
598 ; CHECK-NEXT:    [[TMP15:%.*]] = call fast float @llvm.fabs.f32(float [[TMP7]])
599 ; CHECK-NEXT:    [[TMP16:%.*]] = fcmp fast oge float [[TMP14]], [[TMP15]]
600 ; CHECK-NEXT:    [[TMP17:%.*]] = select i1 [[TMP16]], i32 [[TMP5]], i32 0
601 ; CHECK-NEXT:    [[TMP18:%.*]] = add i32 [[TMP13]], [[TMP17]]
602 ; CHECK-NEXT:    [[TMP19:%.*]] = shl i32 [[TMP18]], 16
603 ; CHECK-NEXT:    [[TMP20:%.*]] = ashr i32 [[TMP19]], 16
604 ; CHECK-NEXT:    [[TMP21:%.*]] = trunc i32 [[TMP20]] to i16
605 ; CHECK-NEXT:    store i16 [[TMP21]], ptr addrspace(1) [[OUT:%.*]], align 2
606 ; CHECK-NEXT:    ret void
608 ; GFX6-LABEL: sdiv_i16:
609 ; GFX6:       ; %bb.0:
610 ; GFX6-NEXT:    s_load_dword s4, s[0:1], 0xb
611 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
612 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
613 ; GFX6-NEXT:    s_mov_b32 s2, -1
614 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
615 ; GFX6-NEXT:    s_ashr_i32 s5, s4, 16
616 ; GFX6-NEXT:    v_cvt_f32_i32_e32 v0, s5
617 ; GFX6-NEXT:    s_sext_i32_i16 s4, s4
618 ; GFX6-NEXT:    v_cvt_f32_i32_e32 v1, s4
619 ; GFX6-NEXT:    s_xor_b32 s4, s4, s5
620 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v2, v0
621 ; GFX6-NEXT:    s_ashr_i32 s4, s4, 30
622 ; GFX6-NEXT:    s_or_b32 s6, s4, 1
623 ; GFX6-NEXT:    v_mul_f32_e32 v2, v1, v2
624 ; GFX6-NEXT:    v_trunc_f32_e32 v2, v2
625 ; GFX6-NEXT:    v_mad_f32 v1, -v2, v0, v1
626 ; GFX6-NEXT:    v_cvt_i32_f32_e32 v2, v2
627 ; GFX6-NEXT:    v_cmp_ge_f32_e64 s[4:5], |v1|, |v0|
628 ; GFX6-NEXT:    s_and_b64 s[4:5], s[4:5], exec
629 ; GFX6-NEXT:    s_cselect_b32 s4, s6, 0
630 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, s4, v2
631 ; GFX6-NEXT:    buffer_store_short v0, off, s[0:3], 0
632 ; GFX6-NEXT:    s_endpgm
634 ; GFX9-LABEL: sdiv_i16:
635 ; GFX9:       ; %bb.0:
636 ; GFX9-NEXT:    s_load_dword s4, s[0:1], 0x2c
637 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
638 ; GFX9-NEXT:    v_mov_b32_e32 v1, 0
639 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
640 ; GFX9-NEXT:    s_ashr_i32 s0, s4, 16
641 ; GFX9-NEXT:    v_cvt_f32_i32_e32 v0, s0
642 ; GFX9-NEXT:    s_sext_i32_i16 s1, s4
643 ; GFX9-NEXT:    v_cvt_f32_i32_e32 v2, s1
644 ; GFX9-NEXT:    s_xor_b32 s0, s1, s0
645 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v3, v0
646 ; GFX9-NEXT:    s_ashr_i32 s0, s0, 30
647 ; GFX9-NEXT:    s_or_b32 s4, s0, 1
648 ; GFX9-NEXT:    v_mul_f32_e32 v3, v2, v3
649 ; GFX9-NEXT:    v_trunc_f32_e32 v3, v3
650 ; GFX9-NEXT:    v_mad_f32 v2, -v3, v0, v2
651 ; GFX9-NEXT:    v_cvt_i32_f32_e32 v3, v3
652 ; GFX9-NEXT:    v_cmp_ge_f32_e64 s[0:1], |v2|, |v0|
653 ; GFX9-NEXT:    s_and_b64 s[0:1], s[0:1], exec
654 ; GFX9-NEXT:    s_cselect_b32 s0, s4, 0
655 ; GFX9-NEXT:    v_add_u32_e32 v0, s0, v3
656 ; GFX9-NEXT:    global_store_short v1, v0, s[2:3]
657 ; GFX9-NEXT:    s_endpgm
658   %r = sdiv i16 %x, %y
659   store i16 %r, ptr addrspace(1) %out
660   ret void
663 define amdgpu_kernel void @srem_i16(ptr addrspace(1) %out, i16 %x, i16 %y) {
664 ; CHECK-LABEL: @srem_i16(
665 ; CHECK-NEXT:    [[TMP1:%.*]] = sext i16 [[X:%.*]] to i32
666 ; CHECK-NEXT:    [[TMP2:%.*]] = sext i16 [[Y:%.*]] to i32
667 ; CHECK-NEXT:    [[TMP3:%.*]] = xor i32 [[TMP1]], [[TMP2]]
668 ; CHECK-NEXT:    [[TMP4:%.*]] = ashr i32 [[TMP3]], 30
669 ; CHECK-NEXT:    [[TMP5:%.*]] = or i32 [[TMP4]], 1
670 ; CHECK-NEXT:    [[TMP6:%.*]] = sitofp i32 [[TMP1]] to float
671 ; CHECK-NEXT:    [[TMP7:%.*]] = sitofp i32 [[TMP2]] to float
672 ; CHECK-NEXT:    [[TMP8:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP7]])
673 ; CHECK-NEXT:    [[TMP9:%.*]] = fmul fast float [[TMP6]], [[TMP8]]
674 ; CHECK-NEXT:    [[TMP10:%.*]] = call fast float @llvm.trunc.f32(float [[TMP9]])
675 ; CHECK-NEXT:    [[TMP11:%.*]] = fneg fast float [[TMP10]]
676 ; CHECK-NEXT:    [[TMP12:%.*]] = call fast float @llvm.amdgcn.fmad.ftz.f32(float [[TMP11]], float [[TMP7]], float [[TMP6]])
677 ; CHECK-NEXT:    [[TMP13:%.*]] = fptosi float [[TMP10]] to i32
678 ; CHECK-NEXT:    [[TMP14:%.*]] = call fast float @llvm.fabs.f32(float [[TMP12]])
679 ; CHECK-NEXT:    [[TMP15:%.*]] = call fast float @llvm.fabs.f32(float [[TMP7]])
680 ; CHECK-NEXT:    [[TMP16:%.*]] = fcmp fast oge float [[TMP14]], [[TMP15]]
681 ; CHECK-NEXT:    [[TMP17:%.*]] = select i1 [[TMP16]], i32 [[TMP5]], i32 0
682 ; CHECK-NEXT:    [[TMP18:%.*]] = add i32 [[TMP13]], [[TMP17]]
683 ; CHECK-NEXT:    [[TMP19:%.*]] = mul i32 [[TMP18]], [[TMP2]]
684 ; CHECK-NEXT:    [[TMP20:%.*]] = sub i32 [[TMP1]], [[TMP19]]
685 ; CHECK-NEXT:    [[TMP21:%.*]] = shl i32 [[TMP20]], 16
686 ; CHECK-NEXT:    [[TMP22:%.*]] = ashr i32 [[TMP21]], 16
687 ; CHECK-NEXT:    [[TMP23:%.*]] = trunc i32 [[TMP22]] to i16
688 ; CHECK-NEXT:    store i16 [[TMP23]], ptr addrspace(1) [[OUT:%.*]], align 2
689 ; CHECK-NEXT:    ret void
691 ; GFX6-LABEL: srem_i16:
692 ; GFX6:       ; %bb.0:
693 ; GFX6-NEXT:    s_load_dword s4, s[0:1], 0xb
694 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
695 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
696 ; GFX6-NEXT:    s_ashr_i32 s5, s4, 16
697 ; GFX6-NEXT:    v_cvt_f32_i32_e32 v0, s5
698 ; GFX6-NEXT:    s_sext_i32_i16 s2, s4
699 ; GFX6-NEXT:    v_cvt_f32_i32_e32 v1, s2
700 ; GFX6-NEXT:    s_xor_b32 s2, s2, s5
701 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v2, v0
702 ; GFX6-NEXT:    s_ashr_i32 s2, s2, 30
703 ; GFX6-NEXT:    s_or_b32 s6, s2, 1
704 ; GFX6-NEXT:    v_mul_f32_e32 v2, v1, v2
705 ; GFX6-NEXT:    v_trunc_f32_e32 v2, v2
706 ; GFX6-NEXT:    v_mad_f32 v1, -v2, v0, v1
707 ; GFX6-NEXT:    v_cvt_i32_f32_e32 v2, v2
708 ; GFX6-NEXT:    v_cmp_ge_f32_e64 s[2:3], |v1|, |v0|
709 ; GFX6-NEXT:    s_and_b64 s[2:3], s[2:3], exec
710 ; GFX6-NEXT:    s_cselect_b32 s2, s6, 0
711 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, s2, v2
712 ; GFX6-NEXT:    v_mul_lo_u32 v0, v0, s5
713 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
714 ; GFX6-NEXT:    s_mov_b32 s2, -1
715 ; GFX6-NEXT:    v_sub_i32_e32 v0, vcc, s4, v0
716 ; GFX6-NEXT:    buffer_store_short v0, off, s[0:3], 0
717 ; GFX6-NEXT:    s_endpgm
719 ; GFX9-LABEL: srem_i16:
720 ; GFX9:       ; %bb.0:
721 ; GFX9-NEXT:    s_load_dword s4, s[0:1], 0x2c
722 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
723 ; GFX9-NEXT:    s_ashr_i32 s5, s4, 16
724 ; GFX9-NEXT:    v_cvt_f32_i32_e32 v0, s5
725 ; GFX9-NEXT:    s_sext_i32_i16 s2, s4
726 ; GFX9-NEXT:    v_cvt_f32_i32_e32 v1, s2
727 ; GFX9-NEXT:    s_xor_b32 s2, s2, s5
728 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v2, v0
729 ; GFX9-NEXT:    s_ashr_i32 s2, s2, 30
730 ; GFX9-NEXT:    s_or_b32 s6, s2, 1
731 ; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
732 ; GFX9-NEXT:    v_mul_f32_e32 v2, v1, v2
733 ; GFX9-NEXT:    v_trunc_f32_e32 v2, v2
734 ; GFX9-NEXT:    v_mad_f32 v1, -v2, v0, v1
735 ; GFX9-NEXT:    v_cvt_i32_f32_e32 v2, v2
736 ; GFX9-NEXT:    v_cmp_ge_f32_e64 s[2:3], |v1|, |v0|
737 ; GFX9-NEXT:    s_and_b64 s[2:3], s[2:3], exec
738 ; GFX9-NEXT:    s_cselect_b32 s2, s6, 0
739 ; GFX9-NEXT:    v_add_u32_e32 v0, s2, v2
740 ; GFX9-NEXT:    v_mul_lo_u32 v0, v0, s5
741 ; GFX9-NEXT:    v_mov_b32_e32 v1, 0
742 ; GFX9-NEXT:    v_sub_u32_e32 v0, s4, v0
743 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
744 ; GFX9-NEXT:    global_store_short v1, v0, s[0:1]
745 ; GFX9-NEXT:    s_endpgm
746   %r = srem i16 %x, %y
747   store i16 %r, ptr addrspace(1) %out
748   ret void
751 define amdgpu_kernel void @udiv_i8(ptr addrspace(1) %out, i8 %x, i8 %y) {
752 ; CHECK-LABEL: @udiv_i8(
753 ; CHECK-NEXT:    [[TMP1:%.*]] = zext i8 [[X:%.*]] to i32
754 ; CHECK-NEXT:    [[TMP2:%.*]] = zext i8 [[Y:%.*]] to i32
755 ; CHECK-NEXT:    [[TMP3:%.*]] = uitofp i32 [[TMP1]] to float
756 ; CHECK-NEXT:    [[TMP4:%.*]] = uitofp i32 [[TMP2]] to float
757 ; CHECK-NEXT:    [[TMP5:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP4]])
758 ; CHECK-NEXT:    [[TMP6:%.*]] = fmul fast float [[TMP3]], [[TMP5]]
759 ; CHECK-NEXT:    [[TMP7:%.*]] = call fast float @llvm.trunc.f32(float [[TMP6]])
760 ; CHECK-NEXT:    [[TMP8:%.*]] = fneg fast float [[TMP7]]
761 ; CHECK-NEXT:    [[TMP9:%.*]] = call fast float @llvm.amdgcn.fmad.ftz.f32(float [[TMP8]], float [[TMP4]], float [[TMP3]])
762 ; CHECK-NEXT:    [[TMP10:%.*]] = fptoui float [[TMP7]] to i32
763 ; CHECK-NEXT:    [[TMP11:%.*]] = call fast float @llvm.fabs.f32(float [[TMP9]])
764 ; CHECK-NEXT:    [[TMP12:%.*]] = call fast float @llvm.fabs.f32(float [[TMP4]])
765 ; CHECK-NEXT:    [[TMP13:%.*]] = fcmp fast oge float [[TMP11]], [[TMP12]]
766 ; CHECK-NEXT:    [[TMP14:%.*]] = select i1 [[TMP13]], i32 1, i32 0
767 ; CHECK-NEXT:    [[TMP15:%.*]] = add i32 [[TMP10]], [[TMP14]]
768 ; CHECK-NEXT:    [[TMP16:%.*]] = and i32 [[TMP15]], 255
769 ; CHECK-NEXT:    [[TMP17:%.*]] = trunc i32 [[TMP16]] to i8
770 ; CHECK-NEXT:    store i8 [[TMP17]], ptr addrspace(1) [[OUT:%.*]], align 1
771 ; CHECK-NEXT:    ret void
773 ; GFX6-LABEL: udiv_i8:
774 ; GFX6:       ; %bb.0:
775 ; GFX6-NEXT:    s_load_dword s4, s[0:1], 0xb
776 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
777 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
778 ; GFX6-NEXT:    s_mov_b32 s2, -1
779 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
780 ; GFX6-NEXT:    v_cvt_f32_ubyte1_e32 v0, s4
781 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v1, v0
782 ; GFX6-NEXT:    v_cvt_f32_ubyte0_e32 v2, s4
783 ; GFX6-NEXT:    v_mul_f32_e32 v1, v2, v1
784 ; GFX6-NEXT:    v_trunc_f32_e32 v1, v1
785 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v3, v1
786 ; GFX6-NEXT:    v_mad_f32 v1, -v1, v0, v2
787 ; GFX6-NEXT:    v_cmp_ge_f32_e64 vcc, |v1|, v0
788 ; GFX6-NEXT:    v_addc_u32_e32 v0, vcc, 0, v3, vcc
789 ; GFX6-NEXT:    buffer_store_byte v0, off, s[0:3], 0
790 ; GFX6-NEXT:    s_endpgm
792 ; GFX9-LABEL: udiv_i8:
793 ; GFX9:       ; %bb.0:
794 ; GFX9-NEXT:    s_load_dword s2, s[0:1], 0x2c
795 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0
796 ; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
797 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
798 ; GFX9-NEXT:    v_cvt_f32_ubyte1_e32 v0, s2
799 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v1, v0
800 ; GFX9-NEXT:    v_cvt_f32_ubyte0_e32 v3, s2
801 ; GFX9-NEXT:    v_mul_f32_e32 v1, v3, v1
802 ; GFX9-NEXT:    v_trunc_f32_e32 v1, v1
803 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v4, v1
804 ; GFX9-NEXT:    v_mad_f32 v1, -v1, v0, v3
805 ; GFX9-NEXT:    v_cmp_ge_f32_e64 vcc, |v1|, v0
806 ; GFX9-NEXT:    v_addc_co_u32_e32 v0, vcc, 0, v4, vcc
807 ; GFX9-NEXT:    global_store_byte v2, v0, s[0:1]
808 ; GFX9-NEXT:    s_endpgm
809   %r = udiv i8 %x, %y
810   store i8 %r, ptr addrspace(1) %out
811   ret void
814 define amdgpu_kernel void @urem_i8(ptr addrspace(1) %out, i8 %x, i8 %y) {
815 ; CHECK-LABEL: @urem_i8(
816 ; CHECK-NEXT:    [[TMP1:%.*]] = zext i8 [[X:%.*]] to i32
817 ; CHECK-NEXT:    [[TMP2:%.*]] = zext i8 [[Y:%.*]] to i32
818 ; CHECK-NEXT:    [[TMP3:%.*]] = uitofp i32 [[TMP1]] to float
819 ; CHECK-NEXT:    [[TMP4:%.*]] = uitofp i32 [[TMP2]] to float
820 ; CHECK-NEXT:    [[TMP5:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP4]])
821 ; CHECK-NEXT:    [[TMP6:%.*]] = fmul fast float [[TMP3]], [[TMP5]]
822 ; CHECK-NEXT:    [[TMP7:%.*]] = call fast float @llvm.trunc.f32(float [[TMP6]])
823 ; CHECK-NEXT:    [[TMP8:%.*]] = fneg fast float [[TMP7]]
824 ; CHECK-NEXT:    [[TMP9:%.*]] = call fast float @llvm.amdgcn.fmad.ftz.f32(float [[TMP8]], float [[TMP4]], float [[TMP3]])
825 ; CHECK-NEXT:    [[TMP10:%.*]] = fptoui float [[TMP7]] to i32
826 ; CHECK-NEXT:    [[TMP11:%.*]] = call fast float @llvm.fabs.f32(float [[TMP9]])
827 ; CHECK-NEXT:    [[TMP12:%.*]] = call fast float @llvm.fabs.f32(float [[TMP4]])
828 ; CHECK-NEXT:    [[TMP13:%.*]] = fcmp fast oge float [[TMP11]], [[TMP12]]
829 ; CHECK-NEXT:    [[TMP14:%.*]] = select i1 [[TMP13]], i32 1, i32 0
830 ; CHECK-NEXT:    [[TMP15:%.*]] = add i32 [[TMP10]], [[TMP14]]
831 ; CHECK-NEXT:    [[TMP16:%.*]] = mul i32 [[TMP15]], [[TMP2]]
832 ; CHECK-NEXT:    [[TMP17:%.*]] = sub i32 [[TMP1]], [[TMP16]]
833 ; CHECK-NEXT:    [[TMP18:%.*]] = and i32 [[TMP17]], 255
834 ; CHECK-NEXT:    [[TMP19:%.*]] = trunc i32 [[TMP18]] to i8
835 ; CHECK-NEXT:    store i8 [[TMP19]], ptr addrspace(1) [[OUT:%.*]], align 1
836 ; CHECK-NEXT:    ret void
838 ; GFX6-LABEL: urem_i8:
839 ; GFX6:       ; %bb.0:
840 ; GFX6-NEXT:    s_load_dword s4, s[0:1], 0xb
841 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
842 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
843 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
844 ; GFX6-NEXT:    v_cvt_f32_ubyte1_e32 v0, s4
845 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v1, v0
846 ; GFX6-NEXT:    v_cvt_f32_ubyte0_e32 v2, s4
847 ; GFX6-NEXT:    s_lshr_b32 s2, s4, 8
848 ; GFX6-NEXT:    v_mul_f32_e32 v1, v2, v1
849 ; GFX6-NEXT:    v_trunc_f32_e32 v1, v1
850 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v3, v1
851 ; GFX6-NEXT:    v_mad_f32 v1, -v1, v0, v2
852 ; GFX6-NEXT:    v_cmp_ge_f32_e64 vcc, |v1|, v0
853 ; GFX6-NEXT:    v_addc_u32_e32 v0, vcc, 0, v3, vcc
854 ; GFX6-NEXT:    v_mul_lo_u32 v0, v0, s2
855 ; GFX6-NEXT:    s_mov_b32 s2, -1
856 ; GFX6-NEXT:    v_sub_i32_e32 v0, vcc, s4, v0
857 ; GFX6-NEXT:    buffer_store_byte v0, off, s[0:3], 0
858 ; GFX6-NEXT:    s_endpgm
860 ; GFX9-LABEL: urem_i8:
861 ; GFX9:       ; %bb.0:
862 ; GFX9-NEXT:    s_load_dword s2, s[0:1], 0x2c
863 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
864 ; GFX9-NEXT:    v_cvt_f32_ubyte1_e32 v0, s2
865 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v1, v0
866 ; GFX9-NEXT:    v_cvt_f32_ubyte0_e32 v2, s2
867 ; GFX9-NEXT:    s_lshr_b32 s3, s2, 8
868 ; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
869 ; GFX9-NEXT:    v_mul_f32_e32 v1, v2, v1
870 ; GFX9-NEXT:    v_trunc_f32_e32 v1, v1
871 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v3, v1
872 ; GFX9-NEXT:    v_mad_f32 v1, -v1, v0, v2
873 ; GFX9-NEXT:    v_cmp_ge_f32_e64 vcc, |v1|, v0
874 ; GFX9-NEXT:    v_mov_b32_e32 v1, 0
875 ; GFX9-NEXT:    v_addc_co_u32_e32 v0, vcc, 0, v3, vcc
876 ; GFX9-NEXT:    v_mul_lo_u32 v0, v0, s3
877 ; GFX9-NEXT:    v_sub_u32_e32 v0, s2, v0
878 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
879 ; GFX9-NEXT:    global_store_byte v1, v0, s[0:1]
880 ; GFX9-NEXT:    s_endpgm
881   %r = urem i8 %x, %y
882   store i8 %r, ptr addrspace(1) %out
883   ret void
886 define amdgpu_kernel void @sdiv_i8(ptr addrspace(1) %out, i8 %x, i8 %y) {
887 ; CHECK-LABEL: @sdiv_i8(
888 ; CHECK-NEXT:    [[TMP1:%.*]] = sext i8 [[X:%.*]] to i32
889 ; CHECK-NEXT:    [[TMP2:%.*]] = sext i8 [[Y:%.*]] to i32
890 ; CHECK-NEXT:    [[TMP3:%.*]] = xor i32 [[TMP1]], [[TMP2]]
891 ; CHECK-NEXT:    [[TMP4:%.*]] = ashr i32 [[TMP3]], 30
892 ; CHECK-NEXT:    [[TMP5:%.*]] = or i32 [[TMP4]], 1
893 ; CHECK-NEXT:    [[TMP6:%.*]] = sitofp i32 [[TMP1]] to float
894 ; CHECK-NEXT:    [[TMP7:%.*]] = sitofp i32 [[TMP2]] to float
895 ; CHECK-NEXT:    [[TMP8:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP7]])
896 ; CHECK-NEXT:    [[TMP9:%.*]] = fmul fast float [[TMP6]], [[TMP8]]
897 ; CHECK-NEXT:    [[TMP10:%.*]] = call fast float @llvm.trunc.f32(float [[TMP9]])
898 ; CHECK-NEXT:    [[TMP11:%.*]] = fneg fast float [[TMP10]]
899 ; CHECK-NEXT:    [[TMP12:%.*]] = call fast float @llvm.amdgcn.fmad.ftz.f32(float [[TMP11]], float [[TMP7]], float [[TMP6]])
900 ; CHECK-NEXT:    [[TMP13:%.*]] = fptosi float [[TMP10]] to i32
901 ; CHECK-NEXT:    [[TMP14:%.*]] = call fast float @llvm.fabs.f32(float [[TMP12]])
902 ; CHECK-NEXT:    [[TMP15:%.*]] = call fast float @llvm.fabs.f32(float [[TMP7]])
903 ; CHECK-NEXT:    [[TMP16:%.*]] = fcmp fast oge float [[TMP14]], [[TMP15]]
904 ; CHECK-NEXT:    [[TMP17:%.*]] = select i1 [[TMP16]], i32 [[TMP5]], i32 0
905 ; CHECK-NEXT:    [[TMP18:%.*]] = add i32 [[TMP13]], [[TMP17]]
906 ; CHECK-NEXT:    [[TMP19:%.*]] = shl i32 [[TMP18]], 24
907 ; CHECK-NEXT:    [[TMP20:%.*]] = ashr i32 [[TMP19]], 24
908 ; CHECK-NEXT:    [[TMP21:%.*]] = trunc i32 [[TMP20]] to i8
909 ; CHECK-NEXT:    store i8 [[TMP21]], ptr addrspace(1) [[OUT:%.*]], align 1
910 ; CHECK-NEXT:    ret void
912 ; GFX6-LABEL: sdiv_i8:
913 ; GFX6:       ; %bb.0:
914 ; GFX6-NEXT:    s_load_dword s4, s[0:1], 0xb
915 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
916 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
917 ; GFX6-NEXT:    s_mov_b32 s2, -1
918 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
919 ; GFX6-NEXT:    s_bfe_i32 s5, s4, 0x80008
920 ; GFX6-NEXT:    v_cvt_f32_i32_e32 v0, s5
921 ; GFX6-NEXT:    s_sext_i32_i8 s4, s4
922 ; GFX6-NEXT:    v_cvt_f32_i32_e32 v1, s4
923 ; GFX6-NEXT:    s_xor_b32 s4, s4, s5
924 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v2, v0
925 ; GFX6-NEXT:    s_ashr_i32 s4, s4, 30
926 ; GFX6-NEXT:    s_or_b32 s6, s4, 1
927 ; GFX6-NEXT:    v_mul_f32_e32 v2, v1, v2
928 ; GFX6-NEXT:    v_trunc_f32_e32 v2, v2
929 ; GFX6-NEXT:    v_mad_f32 v1, -v2, v0, v1
930 ; GFX6-NEXT:    v_cvt_i32_f32_e32 v2, v2
931 ; GFX6-NEXT:    v_cmp_ge_f32_e64 s[4:5], |v1|, |v0|
932 ; GFX6-NEXT:    s_and_b64 s[4:5], s[4:5], exec
933 ; GFX6-NEXT:    s_cselect_b32 s4, s6, 0
934 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, s4, v2
935 ; GFX6-NEXT:    buffer_store_byte v0, off, s[0:3], 0
936 ; GFX6-NEXT:    s_endpgm
938 ; GFX9-LABEL: sdiv_i8:
939 ; GFX9:       ; %bb.0:
940 ; GFX9-NEXT:    s_load_dword s4, s[0:1], 0x2c
941 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
942 ; GFX9-NEXT:    v_mov_b32_e32 v1, 0
943 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
944 ; GFX9-NEXT:    s_bfe_i32 s0, s4, 0x80008
945 ; GFX9-NEXT:    v_cvt_f32_i32_e32 v0, s0
946 ; GFX9-NEXT:    s_sext_i32_i8 s1, s4
947 ; GFX9-NEXT:    v_cvt_f32_i32_e32 v2, s1
948 ; GFX9-NEXT:    s_xor_b32 s0, s1, s0
949 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v3, v0
950 ; GFX9-NEXT:    s_ashr_i32 s0, s0, 30
951 ; GFX9-NEXT:    s_or_b32 s4, s0, 1
952 ; GFX9-NEXT:    v_mul_f32_e32 v3, v2, v3
953 ; GFX9-NEXT:    v_trunc_f32_e32 v3, v3
954 ; GFX9-NEXT:    v_mad_f32 v2, -v3, v0, v2
955 ; GFX9-NEXT:    v_cvt_i32_f32_e32 v3, v3
956 ; GFX9-NEXT:    v_cmp_ge_f32_e64 s[0:1], |v2|, |v0|
957 ; GFX9-NEXT:    s_and_b64 s[0:1], s[0:1], exec
958 ; GFX9-NEXT:    s_cselect_b32 s0, s4, 0
959 ; GFX9-NEXT:    v_add_u32_e32 v0, s0, v3
960 ; GFX9-NEXT:    global_store_byte v1, v0, s[2:3]
961 ; GFX9-NEXT:    s_endpgm
962   %r = sdiv i8 %x, %y
963   store i8 %r, ptr addrspace(1) %out
964   ret void
967 define amdgpu_kernel void @srem_i8(ptr addrspace(1) %out, i8 %x, i8 %y) {
968 ; CHECK-LABEL: @srem_i8(
969 ; CHECK-NEXT:    [[TMP1:%.*]] = sext i8 [[X:%.*]] to i32
970 ; CHECK-NEXT:    [[TMP2:%.*]] = sext i8 [[Y:%.*]] to i32
971 ; CHECK-NEXT:    [[TMP3:%.*]] = xor i32 [[TMP1]], [[TMP2]]
972 ; CHECK-NEXT:    [[TMP4:%.*]] = ashr i32 [[TMP3]], 30
973 ; CHECK-NEXT:    [[TMP5:%.*]] = or i32 [[TMP4]], 1
974 ; CHECK-NEXT:    [[TMP6:%.*]] = sitofp i32 [[TMP1]] to float
975 ; CHECK-NEXT:    [[TMP7:%.*]] = sitofp i32 [[TMP2]] to float
976 ; CHECK-NEXT:    [[TMP8:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP7]])
977 ; CHECK-NEXT:    [[TMP9:%.*]] = fmul fast float [[TMP6]], [[TMP8]]
978 ; CHECK-NEXT:    [[TMP10:%.*]] = call fast float @llvm.trunc.f32(float [[TMP9]])
979 ; CHECK-NEXT:    [[TMP11:%.*]] = fneg fast float [[TMP10]]
980 ; CHECK-NEXT:    [[TMP12:%.*]] = call fast float @llvm.amdgcn.fmad.ftz.f32(float [[TMP11]], float [[TMP7]], float [[TMP6]])
981 ; CHECK-NEXT:    [[TMP13:%.*]] = fptosi float [[TMP10]] to i32
982 ; CHECK-NEXT:    [[TMP14:%.*]] = call fast float @llvm.fabs.f32(float [[TMP12]])
983 ; CHECK-NEXT:    [[TMP15:%.*]] = call fast float @llvm.fabs.f32(float [[TMP7]])
984 ; CHECK-NEXT:    [[TMP16:%.*]] = fcmp fast oge float [[TMP14]], [[TMP15]]
985 ; CHECK-NEXT:    [[TMP17:%.*]] = select i1 [[TMP16]], i32 [[TMP5]], i32 0
986 ; CHECK-NEXT:    [[TMP18:%.*]] = add i32 [[TMP13]], [[TMP17]]
987 ; CHECK-NEXT:    [[TMP19:%.*]] = mul i32 [[TMP18]], [[TMP2]]
988 ; CHECK-NEXT:    [[TMP20:%.*]] = sub i32 [[TMP1]], [[TMP19]]
989 ; CHECK-NEXT:    [[TMP21:%.*]] = shl i32 [[TMP20]], 24
990 ; CHECK-NEXT:    [[TMP22:%.*]] = ashr i32 [[TMP21]], 24
991 ; CHECK-NEXT:    [[TMP23:%.*]] = trunc i32 [[TMP22]] to i8
992 ; CHECK-NEXT:    store i8 [[TMP23]], ptr addrspace(1) [[OUT:%.*]], align 1
993 ; CHECK-NEXT:    ret void
995 ; GFX6-LABEL: srem_i8:
996 ; GFX6:       ; %bb.0:
997 ; GFX6-NEXT:    s_load_dword s4, s[0:1], 0xb
998 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
999 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
1000 ; GFX6-NEXT:    s_bfe_i32 s2, s4, 0x80008
1001 ; GFX6-NEXT:    v_cvt_f32_i32_e32 v0, s2
1002 ; GFX6-NEXT:    s_sext_i32_i8 s3, s4
1003 ; GFX6-NEXT:    v_cvt_f32_i32_e32 v1, s3
1004 ; GFX6-NEXT:    s_xor_b32 s2, s3, s2
1005 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v2, v0
1006 ; GFX6-NEXT:    s_ashr_i32 s2, s2, 30
1007 ; GFX6-NEXT:    s_lshr_b32 s5, s4, 8
1008 ; GFX6-NEXT:    s_or_b32 s6, s2, 1
1009 ; GFX6-NEXT:    v_mul_f32_e32 v2, v1, v2
1010 ; GFX6-NEXT:    v_trunc_f32_e32 v2, v2
1011 ; GFX6-NEXT:    v_mad_f32 v1, -v2, v0, v1
1012 ; GFX6-NEXT:    v_cvt_i32_f32_e32 v2, v2
1013 ; GFX6-NEXT:    v_cmp_ge_f32_e64 s[2:3], |v1|, |v0|
1014 ; GFX6-NEXT:    s_and_b64 s[2:3], s[2:3], exec
1015 ; GFX6-NEXT:    s_cselect_b32 s2, s6, 0
1016 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, s2, v2
1017 ; GFX6-NEXT:    v_mul_lo_u32 v0, v0, s5
1018 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
1019 ; GFX6-NEXT:    s_mov_b32 s2, -1
1020 ; GFX6-NEXT:    v_sub_i32_e32 v0, vcc, s4, v0
1021 ; GFX6-NEXT:    buffer_store_byte v0, off, s[0:3], 0
1022 ; GFX6-NEXT:    s_endpgm
1024 ; GFX9-LABEL: srem_i8:
1025 ; GFX9:       ; %bb.0:
1026 ; GFX9-NEXT:    s_load_dword s4, s[0:1], 0x2c
1027 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
1028 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1029 ; GFX9-NEXT:    s_bfe_i32 s0, s4, 0x80008
1030 ; GFX9-NEXT:    v_cvt_f32_i32_e32 v0, s0
1031 ; GFX9-NEXT:    s_sext_i32_i8 s1, s4
1032 ; GFX9-NEXT:    v_cvt_f32_i32_e32 v1, s1
1033 ; GFX9-NEXT:    s_xor_b32 s0, s1, s0
1034 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v2, v0
1035 ; GFX9-NEXT:    s_ashr_i32 s0, s0, 30
1036 ; GFX9-NEXT:    s_lshr_b32 s5, s4, 8
1037 ; GFX9-NEXT:    s_or_b32 s6, s0, 1
1038 ; GFX9-NEXT:    v_mul_f32_e32 v2, v1, v2
1039 ; GFX9-NEXT:    v_trunc_f32_e32 v2, v2
1040 ; GFX9-NEXT:    v_mad_f32 v1, -v2, v0, v1
1041 ; GFX9-NEXT:    v_cvt_i32_f32_e32 v2, v2
1042 ; GFX9-NEXT:    v_cmp_ge_f32_e64 s[0:1], |v1|, |v0|
1043 ; GFX9-NEXT:    s_and_b64 s[0:1], s[0:1], exec
1044 ; GFX9-NEXT:    s_cselect_b32 s0, s6, 0
1045 ; GFX9-NEXT:    v_add_u32_e32 v0, s0, v2
1046 ; GFX9-NEXT:    v_mul_lo_u32 v0, v0, s5
1047 ; GFX9-NEXT:    v_mov_b32_e32 v1, 0
1048 ; GFX9-NEXT:    v_sub_u32_e32 v0, s4, v0
1049 ; GFX9-NEXT:    global_store_byte v1, v0, s[2:3]
1050 ; GFX9-NEXT:    s_endpgm
1051   %r = srem i8 %x, %y
1052   store i8 %r, ptr addrspace(1) %out
1053   ret void
1056 define amdgpu_kernel void @udiv_v4i32(ptr addrspace(1) %out, <4 x i32> %x, <4 x i32> %y) {
1057 ; CHECK-LABEL: @udiv_v4i32(
1058 ; CHECK-NEXT:    [[TMP1:%.*]] = extractelement <4 x i32> [[X:%.*]], i64 0
1059 ; CHECK-NEXT:    [[TMP2:%.*]] = extractelement <4 x i32> [[Y:%.*]], i64 0
1060 ; CHECK-NEXT:    [[TMP3:%.*]] = uitofp i32 [[TMP2]] to float
1061 ; CHECK-NEXT:    [[TMP4:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP3]])
1062 ; CHECK-NEXT:    [[TMP5:%.*]] = fmul fast float [[TMP4]], 0x41EFFFFFC0000000
1063 ; CHECK-NEXT:    [[TMP6:%.*]] = fptoui float [[TMP5]] to i32
1064 ; CHECK-NEXT:    [[TMP7:%.*]] = sub i32 0, [[TMP2]]
1065 ; CHECK-NEXT:    [[TMP8:%.*]] = mul i32 [[TMP7]], [[TMP6]]
1066 ; CHECK-NEXT:    [[TMP9:%.*]] = zext i32 [[TMP6]] to i64
1067 ; CHECK-NEXT:    [[TMP10:%.*]] = zext i32 [[TMP8]] to i64
1068 ; CHECK-NEXT:    [[TMP11:%.*]] = mul i64 [[TMP9]], [[TMP10]]
1069 ; CHECK-NEXT:    [[TMP12:%.*]] = trunc i64 [[TMP11]] to i32
1070 ; CHECK-NEXT:    [[TMP13:%.*]] = lshr i64 [[TMP11]], 32
1071 ; CHECK-NEXT:    [[TMP14:%.*]] = trunc i64 [[TMP13]] to i32
1072 ; CHECK-NEXT:    [[TMP15:%.*]] = add i32 [[TMP6]], [[TMP14]]
1073 ; CHECK-NEXT:    [[TMP16:%.*]] = zext i32 [[TMP1]] to i64
1074 ; CHECK-NEXT:    [[TMP17:%.*]] = zext i32 [[TMP15]] to i64
1075 ; CHECK-NEXT:    [[TMP18:%.*]] = mul i64 [[TMP16]], [[TMP17]]
1076 ; CHECK-NEXT:    [[TMP19:%.*]] = trunc i64 [[TMP18]] to i32
1077 ; CHECK-NEXT:    [[TMP20:%.*]] = lshr i64 [[TMP18]], 32
1078 ; CHECK-NEXT:    [[TMP21:%.*]] = trunc i64 [[TMP20]] to i32
1079 ; CHECK-NEXT:    [[TMP22:%.*]] = mul i32 [[TMP21]], [[TMP2]]
1080 ; CHECK-NEXT:    [[TMP23:%.*]] = sub i32 [[TMP1]], [[TMP22]]
1081 ; CHECK-NEXT:    [[TMP24:%.*]] = icmp uge i32 [[TMP23]], [[TMP2]]
1082 ; CHECK-NEXT:    [[TMP25:%.*]] = add i32 [[TMP21]], 1
1083 ; CHECK-NEXT:    [[TMP26:%.*]] = select i1 [[TMP24]], i32 [[TMP25]], i32 [[TMP21]]
1084 ; CHECK-NEXT:    [[TMP27:%.*]] = sub i32 [[TMP23]], [[TMP2]]
1085 ; CHECK-NEXT:    [[TMP28:%.*]] = select i1 [[TMP24]], i32 [[TMP27]], i32 [[TMP23]]
1086 ; CHECK-NEXT:    [[TMP29:%.*]] = icmp uge i32 [[TMP28]], [[TMP2]]
1087 ; CHECK-NEXT:    [[TMP30:%.*]] = add i32 [[TMP26]], 1
1088 ; CHECK-NEXT:    [[TMP31:%.*]] = select i1 [[TMP29]], i32 [[TMP30]], i32 [[TMP26]]
1089 ; CHECK-NEXT:    [[TMP32:%.*]] = insertelement <4 x i32> poison, i32 [[TMP31]], i64 0
1090 ; CHECK-NEXT:    [[TMP33:%.*]] = extractelement <4 x i32> [[X]], i64 1
1091 ; CHECK-NEXT:    [[TMP34:%.*]] = extractelement <4 x i32> [[Y]], i64 1
1092 ; CHECK-NEXT:    [[TMP35:%.*]] = uitofp i32 [[TMP34]] to float
1093 ; CHECK-NEXT:    [[TMP36:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP35]])
1094 ; CHECK-NEXT:    [[TMP37:%.*]] = fmul fast float [[TMP36]], 0x41EFFFFFC0000000
1095 ; CHECK-NEXT:    [[TMP38:%.*]] = fptoui float [[TMP37]] to i32
1096 ; CHECK-NEXT:    [[TMP39:%.*]] = sub i32 0, [[TMP34]]
1097 ; CHECK-NEXT:    [[TMP40:%.*]] = mul i32 [[TMP39]], [[TMP38]]
1098 ; CHECK-NEXT:    [[TMP41:%.*]] = zext i32 [[TMP38]] to i64
1099 ; CHECK-NEXT:    [[TMP42:%.*]] = zext i32 [[TMP40]] to i64
1100 ; CHECK-NEXT:    [[TMP43:%.*]] = mul i64 [[TMP41]], [[TMP42]]
1101 ; CHECK-NEXT:    [[TMP44:%.*]] = trunc i64 [[TMP43]] to i32
1102 ; CHECK-NEXT:    [[TMP45:%.*]] = lshr i64 [[TMP43]], 32
1103 ; CHECK-NEXT:    [[TMP46:%.*]] = trunc i64 [[TMP45]] to i32
1104 ; CHECK-NEXT:    [[TMP47:%.*]] = add i32 [[TMP38]], [[TMP46]]
1105 ; CHECK-NEXT:    [[TMP48:%.*]] = zext i32 [[TMP33]] to i64
1106 ; CHECK-NEXT:    [[TMP49:%.*]] = zext i32 [[TMP47]] to i64
1107 ; CHECK-NEXT:    [[TMP50:%.*]] = mul i64 [[TMP48]], [[TMP49]]
1108 ; CHECK-NEXT:    [[TMP51:%.*]] = trunc i64 [[TMP50]] to i32
1109 ; CHECK-NEXT:    [[TMP52:%.*]] = lshr i64 [[TMP50]], 32
1110 ; CHECK-NEXT:    [[TMP53:%.*]] = trunc i64 [[TMP52]] to i32
1111 ; CHECK-NEXT:    [[TMP54:%.*]] = mul i32 [[TMP53]], [[TMP34]]
1112 ; CHECK-NEXT:    [[TMP55:%.*]] = sub i32 [[TMP33]], [[TMP54]]
1113 ; CHECK-NEXT:    [[TMP56:%.*]] = icmp uge i32 [[TMP55]], [[TMP34]]
1114 ; CHECK-NEXT:    [[TMP57:%.*]] = add i32 [[TMP53]], 1
1115 ; CHECK-NEXT:    [[TMP58:%.*]] = select i1 [[TMP56]], i32 [[TMP57]], i32 [[TMP53]]
1116 ; CHECK-NEXT:    [[TMP59:%.*]] = sub i32 [[TMP55]], [[TMP34]]
1117 ; CHECK-NEXT:    [[TMP60:%.*]] = select i1 [[TMP56]], i32 [[TMP59]], i32 [[TMP55]]
1118 ; CHECK-NEXT:    [[TMP61:%.*]] = icmp uge i32 [[TMP60]], [[TMP34]]
1119 ; CHECK-NEXT:    [[TMP62:%.*]] = add i32 [[TMP58]], 1
1120 ; CHECK-NEXT:    [[TMP63:%.*]] = select i1 [[TMP61]], i32 [[TMP62]], i32 [[TMP58]]
1121 ; CHECK-NEXT:    [[TMP64:%.*]] = insertelement <4 x i32> [[TMP32]], i32 [[TMP63]], i64 1
1122 ; CHECK-NEXT:    [[TMP65:%.*]] = extractelement <4 x i32> [[X]], i64 2
1123 ; CHECK-NEXT:    [[TMP66:%.*]] = extractelement <4 x i32> [[Y]], i64 2
1124 ; CHECK-NEXT:    [[TMP67:%.*]] = uitofp i32 [[TMP66]] to float
1125 ; CHECK-NEXT:    [[TMP68:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP67]])
1126 ; CHECK-NEXT:    [[TMP69:%.*]] = fmul fast float [[TMP68]], 0x41EFFFFFC0000000
1127 ; CHECK-NEXT:    [[TMP70:%.*]] = fptoui float [[TMP69]] to i32
1128 ; CHECK-NEXT:    [[TMP71:%.*]] = sub i32 0, [[TMP66]]
1129 ; CHECK-NEXT:    [[TMP72:%.*]] = mul i32 [[TMP71]], [[TMP70]]
1130 ; CHECK-NEXT:    [[TMP73:%.*]] = zext i32 [[TMP70]] to i64
1131 ; CHECK-NEXT:    [[TMP74:%.*]] = zext i32 [[TMP72]] to i64
1132 ; CHECK-NEXT:    [[TMP75:%.*]] = mul i64 [[TMP73]], [[TMP74]]
1133 ; CHECK-NEXT:    [[TMP76:%.*]] = trunc i64 [[TMP75]] to i32
1134 ; CHECK-NEXT:    [[TMP77:%.*]] = lshr i64 [[TMP75]], 32
1135 ; CHECK-NEXT:    [[TMP78:%.*]] = trunc i64 [[TMP77]] to i32
1136 ; CHECK-NEXT:    [[TMP79:%.*]] = add i32 [[TMP70]], [[TMP78]]
1137 ; CHECK-NEXT:    [[TMP80:%.*]] = zext i32 [[TMP65]] to i64
1138 ; CHECK-NEXT:    [[TMP81:%.*]] = zext i32 [[TMP79]] to i64
1139 ; CHECK-NEXT:    [[TMP82:%.*]] = mul i64 [[TMP80]], [[TMP81]]
1140 ; CHECK-NEXT:    [[TMP83:%.*]] = trunc i64 [[TMP82]] to i32
1141 ; CHECK-NEXT:    [[TMP84:%.*]] = lshr i64 [[TMP82]], 32
1142 ; CHECK-NEXT:    [[TMP85:%.*]] = trunc i64 [[TMP84]] to i32
1143 ; CHECK-NEXT:    [[TMP86:%.*]] = mul i32 [[TMP85]], [[TMP66]]
1144 ; CHECK-NEXT:    [[TMP87:%.*]] = sub i32 [[TMP65]], [[TMP86]]
1145 ; CHECK-NEXT:    [[TMP88:%.*]] = icmp uge i32 [[TMP87]], [[TMP66]]
1146 ; CHECK-NEXT:    [[TMP89:%.*]] = add i32 [[TMP85]], 1
1147 ; CHECK-NEXT:    [[TMP90:%.*]] = select i1 [[TMP88]], i32 [[TMP89]], i32 [[TMP85]]
1148 ; CHECK-NEXT:    [[TMP91:%.*]] = sub i32 [[TMP87]], [[TMP66]]
1149 ; CHECK-NEXT:    [[TMP92:%.*]] = select i1 [[TMP88]], i32 [[TMP91]], i32 [[TMP87]]
1150 ; CHECK-NEXT:    [[TMP93:%.*]] = icmp uge i32 [[TMP92]], [[TMP66]]
1151 ; CHECK-NEXT:    [[TMP94:%.*]] = add i32 [[TMP90]], 1
1152 ; CHECK-NEXT:    [[TMP95:%.*]] = select i1 [[TMP93]], i32 [[TMP94]], i32 [[TMP90]]
1153 ; CHECK-NEXT:    [[TMP96:%.*]] = insertelement <4 x i32> [[TMP64]], i32 [[TMP95]], i64 2
1154 ; CHECK-NEXT:    [[TMP97:%.*]] = extractelement <4 x i32> [[X]], i64 3
1155 ; CHECK-NEXT:    [[TMP98:%.*]] = extractelement <4 x i32> [[Y]], i64 3
1156 ; CHECK-NEXT:    [[TMP99:%.*]] = uitofp i32 [[TMP98]] to float
1157 ; CHECK-NEXT:    [[TMP100:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP99]])
1158 ; CHECK-NEXT:    [[TMP101:%.*]] = fmul fast float [[TMP100]], 0x41EFFFFFC0000000
1159 ; CHECK-NEXT:    [[TMP102:%.*]] = fptoui float [[TMP101]] to i32
1160 ; CHECK-NEXT:    [[TMP103:%.*]] = sub i32 0, [[TMP98]]
1161 ; CHECK-NEXT:    [[TMP104:%.*]] = mul i32 [[TMP103]], [[TMP102]]
1162 ; CHECK-NEXT:    [[TMP105:%.*]] = zext i32 [[TMP102]] to i64
1163 ; CHECK-NEXT:    [[TMP106:%.*]] = zext i32 [[TMP104]] to i64
1164 ; CHECK-NEXT:    [[TMP107:%.*]] = mul i64 [[TMP105]], [[TMP106]]
1165 ; CHECK-NEXT:    [[TMP108:%.*]] = trunc i64 [[TMP107]] to i32
1166 ; CHECK-NEXT:    [[TMP109:%.*]] = lshr i64 [[TMP107]], 32
1167 ; CHECK-NEXT:    [[TMP110:%.*]] = trunc i64 [[TMP109]] to i32
1168 ; CHECK-NEXT:    [[TMP111:%.*]] = add i32 [[TMP102]], [[TMP110]]
1169 ; CHECK-NEXT:    [[TMP112:%.*]] = zext i32 [[TMP97]] to i64
1170 ; CHECK-NEXT:    [[TMP113:%.*]] = zext i32 [[TMP111]] to i64
1171 ; CHECK-NEXT:    [[TMP114:%.*]] = mul i64 [[TMP112]], [[TMP113]]
1172 ; CHECK-NEXT:    [[TMP115:%.*]] = trunc i64 [[TMP114]] to i32
1173 ; CHECK-NEXT:    [[TMP116:%.*]] = lshr i64 [[TMP114]], 32
1174 ; CHECK-NEXT:    [[TMP117:%.*]] = trunc i64 [[TMP116]] to i32
1175 ; CHECK-NEXT:    [[TMP118:%.*]] = mul i32 [[TMP117]], [[TMP98]]
1176 ; CHECK-NEXT:    [[TMP119:%.*]] = sub i32 [[TMP97]], [[TMP118]]
1177 ; CHECK-NEXT:    [[TMP120:%.*]] = icmp uge i32 [[TMP119]], [[TMP98]]
1178 ; CHECK-NEXT:    [[TMP121:%.*]] = add i32 [[TMP117]], 1
1179 ; CHECK-NEXT:    [[TMP122:%.*]] = select i1 [[TMP120]], i32 [[TMP121]], i32 [[TMP117]]
1180 ; CHECK-NEXT:    [[TMP123:%.*]] = sub i32 [[TMP119]], [[TMP98]]
1181 ; CHECK-NEXT:    [[TMP124:%.*]] = select i1 [[TMP120]], i32 [[TMP123]], i32 [[TMP119]]
1182 ; CHECK-NEXT:    [[TMP125:%.*]] = icmp uge i32 [[TMP124]], [[TMP98]]
1183 ; CHECK-NEXT:    [[TMP126:%.*]] = add i32 [[TMP122]], 1
1184 ; CHECK-NEXT:    [[TMP127:%.*]] = select i1 [[TMP125]], i32 [[TMP126]], i32 [[TMP122]]
1185 ; CHECK-NEXT:    [[TMP128:%.*]] = insertelement <4 x i32> [[TMP96]], i32 [[TMP127]], i64 3
1186 ; CHECK-NEXT:    store <4 x i32> [[TMP128]], ptr addrspace(1) [[OUT:%.*]], align 16
1187 ; CHECK-NEXT:    ret void
1189 ; GFX6-LABEL: udiv_v4i32:
1190 ; GFX6:       ; %bb.0:
1191 ; GFX6-NEXT:    s_load_dwordx8 s[8:15], s[0:1], 0xd
1192 ; GFX6-NEXT:    s_load_dwordx2 s[16:17], s[0:1], 0x9
1193 ; GFX6-NEXT:    s_mov_b32 s19, 0xf000
1194 ; GFX6-NEXT:    s_mov_b32 s18, -1
1195 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
1196 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v0, s12
1197 ; GFX6-NEXT:    s_sub_i32 s2, 0, s12
1198 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v2, s13
1199 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v4, s14
1200 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v0, v0
1201 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v6, s15
1202 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v2, v2
1203 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v4, v4
1204 ; GFX6-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
1205 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v0, v0
1206 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v6, v6
1207 ; GFX6-NEXT:    v_mul_lo_u32 v1, s2, v0
1208 ; GFX6-NEXT:    v_mul_hi_u32 v1, v0, v1
1209 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, v0, v1
1210 ; GFX6-NEXT:    v_mul_hi_u32 v0, s8, v0
1211 ; GFX6-NEXT:    v_mul_f32_e32 v1, 0x4f7ffffe, v2
1212 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v1, v1
1213 ; GFX6-NEXT:    v_readfirstlane_b32 s2, v0
1214 ; GFX6-NEXT:    s_mul_i32 s2, s2, s12
1215 ; GFX6-NEXT:    s_sub_i32 s2, s8, s2
1216 ; GFX6-NEXT:    s_sub_i32 s3, s2, s12
1217 ; GFX6-NEXT:    s_cmp_ge_u32 s2, s12
1218 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, 1, v0
1219 ; GFX6-NEXT:    s_cselect_b32 s2, s3, s2
1220 ; GFX6-NEXT:    s_cselect_b64 vcc, -1, 0
1221 ; GFX6-NEXT:    s_cmp_ge_u32 s2, s12
1222 ; GFX6-NEXT:    s_cselect_b64 s[2:3], -1, 0
1223 ; GFX6-NEXT:    s_sub_i32 s4, 0, s13
1224 ; GFX6-NEXT:    v_mul_lo_u32 v3, s4, v1
1225 ; GFX6-NEXT:    v_cndmask_b32_e32 v0, v0, v2, vcc
1226 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, 1, v0
1227 ; GFX6-NEXT:    v_mul_hi_u32 v3, v1, v3
1228 ; GFX6-NEXT:    v_cndmask_b32_e64 v0, v0, v2, s[2:3]
1229 ; GFX6-NEXT:    v_add_i32_e32 v1, vcc, v1, v3
1230 ; GFX6-NEXT:    v_mul_hi_u32 v1, s9, v1
1231 ; GFX6-NEXT:    v_mul_f32_e32 v3, 0x4f7ffffe, v4
1232 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v3, v3
1233 ; GFX6-NEXT:    v_readfirstlane_b32 s4, v1
1234 ; GFX6-NEXT:    s_mul_i32 s4, s4, s13
1235 ; GFX6-NEXT:    s_sub_i32 s4, s9, s4
1236 ; GFX6-NEXT:    s_sub_i32 s5, s4, s13
1237 ; GFX6-NEXT:    s_cmp_ge_u32 s4, s13
1238 ; GFX6-NEXT:    v_add_i32_e32 v4, vcc, 1, v1
1239 ; GFX6-NEXT:    s_cselect_b32 s4, s5, s4
1240 ; GFX6-NEXT:    s_cselect_b64 vcc, -1, 0
1241 ; GFX6-NEXT:    s_cmp_ge_u32 s4, s13
1242 ; GFX6-NEXT:    s_cselect_b64 s[4:5], -1, 0
1243 ; GFX6-NEXT:    s_sub_i32 s6, 0, s14
1244 ; GFX6-NEXT:    v_mul_lo_u32 v5, s6, v3
1245 ; GFX6-NEXT:    v_cndmask_b32_e32 v1, v1, v4, vcc
1246 ; GFX6-NEXT:    v_add_i32_e32 v4, vcc, 1, v1
1247 ; GFX6-NEXT:    v_mul_hi_u32 v5, v3, v5
1248 ; GFX6-NEXT:    v_cndmask_b32_e64 v1, v1, v4, s[4:5]
1249 ; GFX6-NEXT:    v_add_i32_e32 v3, vcc, v3, v5
1250 ; GFX6-NEXT:    v_mul_hi_u32 v3, s10, v3
1251 ; GFX6-NEXT:    v_mul_f32_e32 v5, 0x4f7ffffe, v6
1252 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v5, v5
1253 ; GFX6-NEXT:    v_readfirstlane_b32 s6, v3
1254 ; GFX6-NEXT:    s_mul_i32 s6, s6, s14
1255 ; GFX6-NEXT:    s_sub_i32 s6, s10, s6
1256 ; GFX6-NEXT:    s_sub_i32 s7, s6, s14
1257 ; GFX6-NEXT:    s_cmp_ge_u32 s6, s14
1258 ; GFX6-NEXT:    v_add_i32_e32 v6, vcc, 1, v3
1259 ; GFX6-NEXT:    s_cselect_b32 s6, s7, s6
1260 ; GFX6-NEXT:    s_cselect_b64 vcc, -1, 0
1261 ; GFX6-NEXT:    s_cmp_ge_u32 s6, s14
1262 ; GFX6-NEXT:    s_cselect_b64 s[6:7], -1, 0
1263 ; GFX6-NEXT:    s_sub_i32 s8, 0, s15
1264 ; GFX6-NEXT:    v_mul_lo_u32 v7, s8, v5
1265 ; GFX6-NEXT:    v_cndmask_b32_e32 v3, v3, v6, vcc
1266 ; GFX6-NEXT:    v_add_i32_e32 v6, vcc, 1, v3
1267 ; GFX6-NEXT:    v_mul_hi_u32 v7, v5, v7
1268 ; GFX6-NEXT:    v_cndmask_b32_e64 v2, v3, v6, s[6:7]
1269 ; GFX6-NEXT:    v_add_i32_e32 v5, vcc, v5, v7
1270 ; GFX6-NEXT:    v_mul_hi_u32 v5, s11, v5
1271 ; GFX6-NEXT:    v_readfirstlane_b32 s0, v5
1272 ; GFX6-NEXT:    s_mul_i32 s0, s0, s15
1273 ; GFX6-NEXT:    s_sub_i32 s0, s11, s0
1274 ; GFX6-NEXT:    s_sub_i32 s1, s0, s15
1275 ; GFX6-NEXT:    v_add_i32_e32 v3, vcc, 1, v5
1276 ; GFX6-NEXT:    s_cmp_ge_u32 s0, s15
1277 ; GFX6-NEXT:    s_cselect_b64 vcc, -1, 0
1278 ; GFX6-NEXT:    v_cndmask_b32_e32 v3, v5, v3, vcc
1279 ; GFX6-NEXT:    s_cselect_b32 s0, s1, s0
1280 ; GFX6-NEXT:    v_add_i32_e32 v4, vcc, 1, v3
1281 ; GFX6-NEXT:    s_cmp_ge_u32 s0, s15
1282 ; GFX6-NEXT:    s_cselect_b64 vcc, -1, 0
1283 ; GFX6-NEXT:    v_cndmask_b32_e32 v3, v3, v4, vcc
1284 ; GFX6-NEXT:    buffer_store_dwordx4 v[0:3], off, s[16:19], 0
1285 ; GFX6-NEXT:    s_endpgm
1287 ; GFX9-LABEL: udiv_v4i32:
1288 ; GFX9:       ; %bb.0:
1289 ; GFX9-NEXT:    s_load_dwordx8 s[4:11], s[0:1], 0x34
1290 ; GFX9-NEXT:    v_mov_b32_e32 v4, 0
1291 ; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
1292 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1293 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v0, s8
1294 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v1, s9
1295 ; GFX9-NEXT:    s_sub_i32 s2, 0, s8
1296 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v2, s10
1297 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v0, v0
1298 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v1, v1
1299 ; GFX9-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
1300 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v0, v0
1301 ; GFX9-NEXT:    v_mul_f32_e32 v1, 0x4f7ffffe, v1
1302 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v1, v1
1303 ; GFX9-NEXT:    v_readfirstlane_b32 s3, v0
1304 ; GFX9-NEXT:    s_mul_i32 s2, s2, s3
1305 ; GFX9-NEXT:    s_mul_hi_u32 s2, s3, s2
1306 ; GFX9-NEXT:    s_add_i32 s3, s3, s2
1307 ; GFX9-NEXT:    s_mul_hi_u32 s2, s4, s3
1308 ; GFX9-NEXT:    s_mul_i32 s3, s2, s8
1309 ; GFX9-NEXT:    s_sub_i32 s3, s4, s3
1310 ; GFX9-NEXT:    s_add_i32 s13, s2, 1
1311 ; GFX9-NEXT:    s_sub_i32 s4, s3, s8
1312 ; GFX9-NEXT:    s_cmp_ge_u32 s3, s8
1313 ; GFX9-NEXT:    s_cselect_b32 s2, s13, s2
1314 ; GFX9-NEXT:    s_cselect_b32 s3, s4, s3
1315 ; GFX9-NEXT:    s_add_i32 s4, s2, 1
1316 ; GFX9-NEXT:    s_cmp_ge_u32 s3, s8
1317 ; GFX9-NEXT:    v_readfirstlane_b32 s12, v1
1318 ; GFX9-NEXT:    s_cselect_b32 s2, s4, s2
1319 ; GFX9-NEXT:    s_sub_i32 s3, 0, s9
1320 ; GFX9-NEXT:    s_mul_i32 s3, s3, s12
1321 ; GFX9-NEXT:    s_mul_hi_u32 s3, s12, s3
1322 ; GFX9-NEXT:    s_add_i32 s12, s12, s3
1323 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v0, v2
1324 ; GFX9-NEXT:    s_mul_hi_u32 s3, s5, s12
1325 ; GFX9-NEXT:    s_mul_i32 s4, s3, s9
1326 ; GFX9-NEXT:    s_sub_i32 s4, s5, s4
1327 ; GFX9-NEXT:    s_add_i32 s8, s3, 1
1328 ; GFX9-NEXT:    s_sub_i32 s5, s4, s9
1329 ; GFX9-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
1330 ; GFX9-NEXT:    s_cmp_ge_u32 s4, s9
1331 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v0, v0
1332 ; GFX9-NEXT:    s_cselect_b32 s3, s8, s3
1333 ; GFX9-NEXT:    s_cselect_b32 s4, s5, s4
1334 ; GFX9-NEXT:    s_add_i32 s5, s3, 1
1335 ; GFX9-NEXT:    s_cmp_ge_u32 s4, s9
1336 ; GFX9-NEXT:    s_cselect_b32 s3, s5, s3
1337 ; GFX9-NEXT:    v_readfirstlane_b32 s5, v0
1338 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v0, s11
1339 ; GFX9-NEXT:    s_sub_i32 s4, 0, s10
1340 ; GFX9-NEXT:    s_mul_i32 s4, s4, s5
1341 ; GFX9-NEXT:    s_mul_hi_u32 s4, s5, s4
1342 ; GFX9-NEXT:    s_add_i32 s5, s5, s4
1343 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v0, v0
1344 ; GFX9-NEXT:    s_mul_hi_u32 s4, s6, s5
1345 ; GFX9-NEXT:    s_mul_i32 s5, s4, s10
1346 ; GFX9-NEXT:    s_sub_i32 s5, s6, s5
1347 ; GFX9-NEXT:    s_add_i32 s6, s4, 1
1348 ; GFX9-NEXT:    s_sub_i32 s8, s5, s10
1349 ; GFX9-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
1350 ; GFX9-NEXT:    s_cmp_ge_u32 s5, s10
1351 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v0, v0
1352 ; GFX9-NEXT:    s_cselect_b32 s4, s6, s4
1353 ; GFX9-NEXT:    s_cselect_b32 s5, s8, s5
1354 ; GFX9-NEXT:    s_add_i32 s6, s4, 1
1355 ; GFX9-NEXT:    s_cmp_ge_u32 s5, s10
1356 ; GFX9-NEXT:    s_cselect_b32 s4, s6, s4
1357 ; GFX9-NEXT:    s_sub_i32 s5, 0, s11
1358 ; GFX9-NEXT:    v_readfirstlane_b32 s6, v0
1359 ; GFX9-NEXT:    s_mul_i32 s5, s5, s6
1360 ; GFX9-NEXT:    s_mul_hi_u32 s5, s6, s5
1361 ; GFX9-NEXT:    s_add_i32 s6, s6, s5
1362 ; GFX9-NEXT:    s_mul_hi_u32 s5, s7, s6
1363 ; GFX9-NEXT:    s_mul_i32 s6, s5, s11
1364 ; GFX9-NEXT:    s_sub_i32 s6, s7, s6
1365 ; GFX9-NEXT:    s_add_i32 s7, s5, 1
1366 ; GFX9-NEXT:    s_sub_i32 s8, s6, s11
1367 ; GFX9-NEXT:    s_cmp_ge_u32 s6, s11
1368 ; GFX9-NEXT:    s_cselect_b32 s5, s7, s5
1369 ; GFX9-NEXT:    s_cselect_b32 s6, s8, s6
1370 ; GFX9-NEXT:    s_add_i32 s7, s5, 1
1371 ; GFX9-NEXT:    s_cmp_ge_u32 s6, s11
1372 ; GFX9-NEXT:    s_cselect_b32 s5, s7, s5
1373 ; GFX9-NEXT:    v_mov_b32_e32 v0, s2
1374 ; GFX9-NEXT:    v_mov_b32_e32 v1, s3
1375 ; GFX9-NEXT:    v_mov_b32_e32 v2, s4
1376 ; GFX9-NEXT:    v_mov_b32_e32 v3, s5
1377 ; GFX9-NEXT:    global_store_dwordx4 v4, v[0:3], s[0:1]
1378 ; GFX9-NEXT:    s_endpgm
1379   %r = udiv <4 x i32> %x, %y
1380   store <4 x i32> %r, ptr addrspace(1) %out
1381   ret void
1384 define amdgpu_kernel void @urem_v4i32(ptr addrspace(1) %out, <4 x i32> %x, <4 x i32> %y) {
1385 ; CHECK-LABEL: @urem_v4i32(
1386 ; CHECK-NEXT:    [[TMP1:%.*]] = extractelement <4 x i32> [[X:%.*]], i64 0
1387 ; CHECK-NEXT:    [[TMP2:%.*]] = extractelement <4 x i32> [[Y:%.*]], i64 0
1388 ; CHECK-NEXT:    [[TMP3:%.*]] = uitofp i32 [[TMP2]] to float
1389 ; CHECK-NEXT:    [[TMP4:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP3]])
1390 ; CHECK-NEXT:    [[TMP5:%.*]] = fmul fast float [[TMP4]], 0x41EFFFFFC0000000
1391 ; CHECK-NEXT:    [[TMP6:%.*]] = fptoui float [[TMP5]] to i32
1392 ; CHECK-NEXT:    [[TMP7:%.*]] = sub i32 0, [[TMP2]]
1393 ; CHECK-NEXT:    [[TMP8:%.*]] = mul i32 [[TMP7]], [[TMP6]]
1394 ; CHECK-NEXT:    [[TMP9:%.*]] = zext i32 [[TMP6]] to i64
1395 ; CHECK-NEXT:    [[TMP10:%.*]] = zext i32 [[TMP8]] to i64
1396 ; CHECK-NEXT:    [[TMP11:%.*]] = mul i64 [[TMP9]], [[TMP10]]
1397 ; CHECK-NEXT:    [[TMP12:%.*]] = trunc i64 [[TMP11]] to i32
1398 ; CHECK-NEXT:    [[TMP13:%.*]] = lshr i64 [[TMP11]], 32
1399 ; CHECK-NEXT:    [[TMP14:%.*]] = trunc i64 [[TMP13]] to i32
1400 ; CHECK-NEXT:    [[TMP15:%.*]] = add i32 [[TMP6]], [[TMP14]]
1401 ; CHECK-NEXT:    [[TMP16:%.*]] = zext i32 [[TMP1]] to i64
1402 ; CHECK-NEXT:    [[TMP17:%.*]] = zext i32 [[TMP15]] to i64
1403 ; CHECK-NEXT:    [[TMP18:%.*]] = mul i64 [[TMP16]], [[TMP17]]
1404 ; CHECK-NEXT:    [[TMP19:%.*]] = trunc i64 [[TMP18]] to i32
1405 ; CHECK-NEXT:    [[TMP20:%.*]] = lshr i64 [[TMP18]], 32
1406 ; CHECK-NEXT:    [[TMP21:%.*]] = trunc i64 [[TMP20]] to i32
1407 ; CHECK-NEXT:    [[TMP22:%.*]] = mul i32 [[TMP21]], [[TMP2]]
1408 ; CHECK-NEXT:    [[TMP23:%.*]] = sub i32 [[TMP1]], [[TMP22]]
1409 ; CHECK-NEXT:    [[TMP24:%.*]] = icmp uge i32 [[TMP23]], [[TMP2]]
1410 ; CHECK-NEXT:    [[TMP25:%.*]] = sub i32 [[TMP23]], [[TMP2]]
1411 ; CHECK-NEXT:    [[TMP26:%.*]] = select i1 [[TMP24]], i32 [[TMP25]], i32 [[TMP23]]
1412 ; CHECK-NEXT:    [[TMP27:%.*]] = icmp uge i32 [[TMP26]], [[TMP2]]
1413 ; CHECK-NEXT:    [[TMP28:%.*]] = sub i32 [[TMP26]], [[TMP2]]
1414 ; CHECK-NEXT:    [[TMP29:%.*]] = select i1 [[TMP27]], i32 [[TMP28]], i32 [[TMP26]]
1415 ; CHECK-NEXT:    [[TMP30:%.*]] = insertelement <4 x i32> poison, i32 [[TMP29]], i64 0
1416 ; CHECK-NEXT:    [[TMP31:%.*]] = extractelement <4 x i32> [[X]], i64 1
1417 ; CHECK-NEXT:    [[TMP32:%.*]] = extractelement <4 x i32> [[Y]], i64 1
1418 ; CHECK-NEXT:    [[TMP33:%.*]] = uitofp i32 [[TMP32]] to float
1419 ; CHECK-NEXT:    [[TMP34:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP33]])
1420 ; CHECK-NEXT:    [[TMP35:%.*]] = fmul fast float [[TMP34]], 0x41EFFFFFC0000000
1421 ; CHECK-NEXT:    [[TMP36:%.*]] = fptoui float [[TMP35]] to i32
1422 ; CHECK-NEXT:    [[TMP37:%.*]] = sub i32 0, [[TMP32]]
1423 ; CHECK-NEXT:    [[TMP38:%.*]] = mul i32 [[TMP37]], [[TMP36]]
1424 ; CHECK-NEXT:    [[TMP39:%.*]] = zext i32 [[TMP36]] to i64
1425 ; CHECK-NEXT:    [[TMP40:%.*]] = zext i32 [[TMP38]] to i64
1426 ; CHECK-NEXT:    [[TMP41:%.*]] = mul i64 [[TMP39]], [[TMP40]]
1427 ; CHECK-NEXT:    [[TMP42:%.*]] = trunc i64 [[TMP41]] to i32
1428 ; CHECK-NEXT:    [[TMP43:%.*]] = lshr i64 [[TMP41]], 32
1429 ; CHECK-NEXT:    [[TMP44:%.*]] = trunc i64 [[TMP43]] to i32
1430 ; CHECK-NEXT:    [[TMP45:%.*]] = add i32 [[TMP36]], [[TMP44]]
1431 ; CHECK-NEXT:    [[TMP46:%.*]] = zext i32 [[TMP31]] to i64
1432 ; CHECK-NEXT:    [[TMP47:%.*]] = zext i32 [[TMP45]] to i64
1433 ; CHECK-NEXT:    [[TMP48:%.*]] = mul i64 [[TMP46]], [[TMP47]]
1434 ; CHECK-NEXT:    [[TMP49:%.*]] = trunc i64 [[TMP48]] to i32
1435 ; CHECK-NEXT:    [[TMP50:%.*]] = lshr i64 [[TMP48]], 32
1436 ; CHECK-NEXT:    [[TMP51:%.*]] = trunc i64 [[TMP50]] to i32
1437 ; CHECK-NEXT:    [[TMP52:%.*]] = mul i32 [[TMP51]], [[TMP32]]
1438 ; CHECK-NEXT:    [[TMP53:%.*]] = sub i32 [[TMP31]], [[TMP52]]
1439 ; CHECK-NEXT:    [[TMP54:%.*]] = icmp uge i32 [[TMP53]], [[TMP32]]
1440 ; CHECK-NEXT:    [[TMP55:%.*]] = sub i32 [[TMP53]], [[TMP32]]
1441 ; CHECK-NEXT:    [[TMP56:%.*]] = select i1 [[TMP54]], i32 [[TMP55]], i32 [[TMP53]]
1442 ; CHECK-NEXT:    [[TMP57:%.*]] = icmp uge i32 [[TMP56]], [[TMP32]]
1443 ; CHECK-NEXT:    [[TMP58:%.*]] = sub i32 [[TMP56]], [[TMP32]]
1444 ; CHECK-NEXT:    [[TMP59:%.*]] = select i1 [[TMP57]], i32 [[TMP58]], i32 [[TMP56]]
1445 ; CHECK-NEXT:    [[TMP60:%.*]] = insertelement <4 x i32> [[TMP30]], i32 [[TMP59]], i64 1
1446 ; CHECK-NEXT:    [[TMP61:%.*]] = extractelement <4 x i32> [[X]], i64 2
1447 ; CHECK-NEXT:    [[TMP62:%.*]] = extractelement <4 x i32> [[Y]], i64 2
1448 ; CHECK-NEXT:    [[TMP63:%.*]] = uitofp i32 [[TMP62]] to float
1449 ; CHECK-NEXT:    [[TMP64:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP63]])
1450 ; CHECK-NEXT:    [[TMP65:%.*]] = fmul fast float [[TMP64]], 0x41EFFFFFC0000000
1451 ; CHECK-NEXT:    [[TMP66:%.*]] = fptoui float [[TMP65]] to i32
1452 ; CHECK-NEXT:    [[TMP67:%.*]] = sub i32 0, [[TMP62]]
1453 ; CHECK-NEXT:    [[TMP68:%.*]] = mul i32 [[TMP67]], [[TMP66]]
1454 ; CHECK-NEXT:    [[TMP69:%.*]] = zext i32 [[TMP66]] to i64
1455 ; CHECK-NEXT:    [[TMP70:%.*]] = zext i32 [[TMP68]] to i64
1456 ; CHECK-NEXT:    [[TMP71:%.*]] = mul i64 [[TMP69]], [[TMP70]]
1457 ; CHECK-NEXT:    [[TMP72:%.*]] = trunc i64 [[TMP71]] to i32
1458 ; CHECK-NEXT:    [[TMP73:%.*]] = lshr i64 [[TMP71]], 32
1459 ; CHECK-NEXT:    [[TMP74:%.*]] = trunc i64 [[TMP73]] to i32
1460 ; CHECK-NEXT:    [[TMP75:%.*]] = add i32 [[TMP66]], [[TMP74]]
1461 ; CHECK-NEXT:    [[TMP76:%.*]] = zext i32 [[TMP61]] to i64
1462 ; CHECK-NEXT:    [[TMP77:%.*]] = zext i32 [[TMP75]] to i64
1463 ; CHECK-NEXT:    [[TMP78:%.*]] = mul i64 [[TMP76]], [[TMP77]]
1464 ; CHECK-NEXT:    [[TMP79:%.*]] = trunc i64 [[TMP78]] to i32
1465 ; CHECK-NEXT:    [[TMP80:%.*]] = lshr i64 [[TMP78]], 32
1466 ; CHECK-NEXT:    [[TMP81:%.*]] = trunc i64 [[TMP80]] to i32
1467 ; CHECK-NEXT:    [[TMP82:%.*]] = mul i32 [[TMP81]], [[TMP62]]
1468 ; CHECK-NEXT:    [[TMP83:%.*]] = sub i32 [[TMP61]], [[TMP82]]
1469 ; CHECK-NEXT:    [[TMP84:%.*]] = icmp uge i32 [[TMP83]], [[TMP62]]
1470 ; CHECK-NEXT:    [[TMP85:%.*]] = sub i32 [[TMP83]], [[TMP62]]
1471 ; CHECK-NEXT:    [[TMP86:%.*]] = select i1 [[TMP84]], i32 [[TMP85]], i32 [[TMP83]]
1472 ; CHECK-NEXT:    [[TMP87:%.*]] = icmp uge i32 [[TMP86]], [[TMP62]]
1473 ; CHECK-NEXT:    [[TMP88:%.*]] = sub i32 [[TMP86]], [[TMP62]]
1474 ; CHECK-NEXT:    [[TMP89:%.*]] = select i1 [[TMP87]], i32 [[TMP88]], i32 [[TMP86]]
1475 ; CHECK-NEXT:    [[TMP90:%.*]] = insertelement <4 x i32> [[TMP60]], i32 [[TMP89]], i64 2
1476 ; CHECK-NEXT:    [[TMP91:%.*]] = extractelement <4 x i32> [[X]], i64 3
1477 ; CHECK-NEXT:    [[TMP92:%.*]] = extractelement <4 x i32> [[Y]], i64 3
1478 ; CHECK-NEXT:    [[TMP93:%.*]] = uitofp i32 [[TMP92]] to float
1479 ; CHECK-NEXT:    [[TMP94:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP93]])
1480 ; CHECK-NEXT:    [[TMP95:%.*]] = fmul fast float [[TMP94]], 0x41EFFFFFC0000000
1481 ; CHECK-NEXT:    [[TMP96:%.*]] = fptoui float [[TMP95]] to i32
1482 ; CHECK-NEXT:    [[TMP97:%.*]] = sub i32 0, [[TMP92]]
1483 ; CHECK-NEXT:    [[TMP98:%.*]] = mul i32 [[TMP97]], [[TMP96]]
1484 ; CHECK-NEXT:    [[TMP99:%.*]] = zext i32 [[TMP96]] to i64
1485 ; CHECK-NEXT:    [[TMP100:%.*]] = zext i32 [[TMP98]] to i64
1486 ; CHECK-NEXT:    [[TMP101:%.*]] = mul i64 [[TMP99]], [[TMP100]]
1487 ; CHECK-NEXT:    [[TMP102:%.*]] = trunc i64 [[TMP101]] to i32
1488 ; CHECK-NEXT:    [[TMP103:%.*]] = lshr i64 [[TMP101]], 32
1489 ; CHECK-NEXT:    [[TMP104:%.*]] = trunc i64 [[TMP103]] to i32
1490 ; CHECK-NEXT:    [[TMP105:%.*]] = add i32 [[TMP96]], [[TMP104]]
1491 ; CHECK-NEXT:    [[TMP106:%.*]] = zext i32 [[TMP91]] to i64
1492 ; CHECK-NEXT:    [[TMP107:%.*]] = zext i32 [[TMP105]] to i64
1493 ; CHECK-NEXT:    [[TMP108:%.*]] = mul i64 [[TMP106]], [[TMP107]]
1494 ; CHECK-NEXT:    [[TMP109:%.*]] = trunc i64 [[TMP108]] to i32
1495 ; CHECK-NEXT:    [[TMP110:%.*]] = lshr i64 [[TMP108]], 32
1496 ; CHECK-NEXT:    [[TMP111:%.*]] = trunc i64 [[TMP110]] to i32
1497 ; CHECK-NEXT:    [[TMP112:%.*]] = mul i32 [[TMP111]], [[TMP92]]
1498 ; CHECK-NEXT:    [[TMP113:%.*]] = sub i32 [[TMP91]], [[TMP112]]
1499 ; CHECK-NEXT:    [[TMP114:%.*]] = icmp uge i32 [[TMP113]], [[TMP92]]
1500 ; CHECK-NEXT:    [[TMP115:%.*]] = sub i32 [[TMP113]], [[TMP92]]
1501 ; CHECK-NEXT:    [[TMP116:%.*]] = select i1 [[TMP114]], i32 [[TMP115]], i32 [[TMP113]]
1502 ; CHECK-NEXT:    [[TMP117:%.*]] = icmp uge i32 [[TMP116]], [[TMP92]]
1503 ; CHECK-NEXT:    [[TMP118:%.*]] = sub i32 [[TMP116]], [[TMP92]]
1504 ; CHECK-NEXT:    [[TMP119:%.*]] = select i1 [[TMP117]], i32 [[TMP118]], i32 [[TMP116]]
1505 ; CHECK-NEXT:    [[TMP120:%.*]] = insertelement <4 x i32> [[TMP90]], i32 [[TMP119]], i64 3
1506 ; CHECK-NEXT:    store <4 x i32> [[TMP120]], ptr addrspace(1) [[OUT:%.*]], align 16
1507 ; CHECK-NEXT:    ret void
1509 ; GFX6-LABEL: urem_v4i32:
1510 ; GFX6:       ; %bb.0:
1511 ; GFX6-NEXT:    s_load_dwordx8 s[4:11], s[0:1], 0xd
1512 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
1513 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
1514 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v0, s8
1515 ; GFX6-NEXT:    s_sub_i32 s2, 0, s8
1516 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v2, s9
1517 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v0, v0
1518 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v2, v2
1519 ; GFX6-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
1520 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v0, v0
1521 ; GFX6-NEXT:    v_mul_lo_u32 v1, s2, v0
1522 ; GFX6-NEXT:    v_mul_hi_u32 v1, v0, v1
1523 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, v0, v1
1524 ; GFX6-NEXT:    v_mul_hi_u32 v0, s4, v0
1525 ; GFX6-NEXT:    v_mul_f32_e32 v1, 0x4f7ffffe, v2
1526 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v1, v1
1527 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v2, s10
1528 ; GFX6-NEXT:    v_readfirstlane_b32 s2, v0
1529 ; GFX6-NEXT:    s_mul_i32 s2, s2, s8
1530 ; GFX6-NEXT:    s_sub_i32 s2, s4, s2
1531 ; GFX6-NEXT:    s_sub_i32 s3, s2, s8
1532 ; GFX6-NEXT:    s_cmp_ge_u32 s2, s8
1533 ; GFX6-NEXT:    s_cselect_b32 s2, s3, s2
1534 ; GFX6-NEXT:    s_sub_i32 s3, s2, s8
1535 ; GFX6-NEXT:    s_cmp_ge_u32 s2, s8
1536 ; GFX6-NEXT:    s_cselect_b32 s4, s3, s2
1537 ; GFX6-NEXT:    s_sub_i32 s2, 0, s9
1538 ; GFX6-NEXT:    v_mul_lo_u32 v0, s2, v1
1539 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v2, v2
1540 ; GFX6-NEXT:    v_mul_hi_u32 v0, v1, v0
1541 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, v1, v0
1542 ; GFX6-NEXT:    v_mul_hi_u32 v0, s5, v0
1543 ; GFX6-NEXT:    v_mul_f32_e32 v1, 0x4f7ffffe, v2
1544 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v1, v1
1545 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v2, s11
1546 ; GFX6-NEXT:    v_readfirstlane_b32 s2, v0
1547 ; GFX6-NEXT:    s_mul_i32 s2, s2, s9
1548 ; GFX6-NEXT:    s_sub_i32 s2, s5, s2
1549 ; GFX6-NEXT:    s_sub_i32 s3, s2, s9
1550 ; GFX6-NEXT:    s_cmp_ge_u32 s2, s9
1551 ; GFX6-NEXT:    s_cselect_b32 s2, s3, s2
1552 ; GFX6-NEXT:    s_sub_i32 s3, s2, s9
1553 ; GFX6-NEXT:    s_cmp_ge_u32 s2, s9
1554 ; GFX6-NEXT:    s_cselect_b32 s5, s3, s2
1555 ; GFX6-NEXT:    s_sub_i32 s2, 0, s10
1556 ; GFX6-NEXT:    v_mul_lo_u32 v0, s2, v1
1557 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v2, v2
1558 ; GFX6-NEXT:    v_mul_hi_u32 v0, v1, v0
1559 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, v1, v0
1560 ; GFX6-NEXT:    v_mul_hi_u32 v0, s6, v0
1561 ; GFX6-NEXT:    v_mul_f32_e32 v1, 0x4f7ffffe, v2
1562 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v1, v1
1563 ; GFX6-NEXT:    v_readfirstlane_b32 s2, v0
1564 ; GFX6-NEXT:    s_mul_i32 s2, s2, s10
1565 ; GFX6-NEXT:    s_sub_i32 s2, s6, s2
1566 ; GFX6-NEXT:    s_sub_i32 s3, s2, s10
1567 ; GFX6-NEXT:    s_cmp_ge_u32 s2, s10
1568 ; GFX6-NEXT:    s_cselect_b32 s2, s3, s2
1569 ; GFX6-NEXT:    s_sub_i32 s3, s2, s10
1570 ; GFX6-NEXT:    s_cmp_ge_u32 s2, s10
1571 ; GFX6-NEXT:    s_cselect_b32 s6, s3, s2
1572 ; GFX6-NEXT:    s_sub_i32 s2, 0, s11
1573 ; GFX6-NEXT:    v_mul_lo_u32 v0, s2, v1
1574 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
1575 ; GFX6-NEXT:    s_mov_b32 s2, -1
1576 ; GFX6-NEXT:    v_mul_hi_u32 v0, v1, v0
1577 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, v1, v0
1578 ; GFX6-NEXT:    v_mul_hi_u32 v2, s7, v0
1579 ; GFX6-NEXT:    v_mov_b32_e32 v0, s4
1580 ; GFX6-NEXT:    v_mov_b32_e32 v1, s5
1581 ; GFX6-NEXT:    v_readfirstlane_b32 s4, v2
1582 ; GFX6-NEXT:    s_mul_i32 s4, s4, s11
1583 ; GFX6-NEXT:    s_sub_i32 s4, s7, s4
1584 ; GFX6-NEXT:    s_sub_i32 s5, s4, s11
1585 ; GFX6-NEXT:    s_cmp_ge_u32 s4, s11
1586 ; GFX6-NEXT:    s_cselect_b32 s4, s5, s4
1587 ; GFX6-NEXT:    s_sub_i32 s5, s4, s11
1588 ; GFX6-NEXT:    s_cmp_ge_u32 s4, s11
1589 ; GFX6-NEXT:    s_cselect_b32 s4, s5, s4
1590 ; GFX6-NEXT:    v_mov_b32_e32 v2, s6
1591 ; GFX6-NEXT:    v_mov_b32_e32 v3, s4
1592 ; GFX6-NEXT:    buffer_store_dwordx4 v[0:3], off, s[0:3], 0
1593 ; GFX6-NEXT:    s_endpgm
1595 ; GFX9-LABEL: urem_v4i32:
1596 ; GFX9:       ; %bb.0:
1597 ; GFX9-NEXT:    s_load_dwordx8 s[4:11], s[0:1], 0x34
1598 ; GFX9-NEXT:    v_mov_b32_e32 v4, 0
1599 ; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
1600 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1601 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v0, s8
1602 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v1, s9
1603 ; GFX9-NEXT:    s_sub_i32 s2, 0, s8
1604 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v2, s10
1605 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v0, v0
1606 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v1, v1
1607 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v2, v2
1608 ; GFX9-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
1609 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v0, v0
1610 ; GFX9-NEXT:    v_mul_f32_e32 v1, 0x4f7ffffe, v1
1611 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v1, v1
1612 ; GFX9-NEXT:    v_mul_f32_e32 v2, 0x4f7ffffe, v2
1613 ; GFX9-NEXT:    v_readfirstlane_b32 s3, v0
1614 ; GFX9-NEXT:    s_mul_i32 s2, s2, s3
1615 ; GFX9-NEXT:    s_mul_hi_u32 s2, s3, s2
1616 ; GFX9-NEXT:    s_add_i32 s3, s3, s2
1617 ; GFX9-NEXT:    s_mul_hi_u32 s2, s4, s3
1618 ; GFX9-NEXT:    s_mul_i32 s2, s2, s8
1619 ; GFX9-NEXT:    s_sub_i32 s2, s4, s2
1620 ; GFX9-NEXT:    s_sub_i32 s3, s2, s8
1621 ; GFX9-NEXT:    s_cmp_ge_u32 s2, s8
1622 ; GFX9-NEXT:    s_cselect_b32 s2, s3, s2
1623 ; GFX9-NEXT:    s_sub_i32 s3, s2, s8
1624 ; GFX9-NEXT:    s_cmp_ge_u32 s2, s8
1625 ; GFX9-NEXT:    v_readfirstlane_b32 s12, v1
1626 ; GFX9-NEXT:    s_cselect_b32 s2, s3, s2
1627 ; GFX9-NEXT:    s_sub_i32 s3, 0, s9
1628 ; GFX9-NEXT:    s_mul_i32 s3, s3, s12
1629 ; GFX9-NEXT:    s_mul_hi_u32 s3, s12, s3
1630 ; GFX9-NEXT:    s_add_i32 s12, s12, s3
1631 ; GFX9-NEXT:    s_mul_hi_u32 s3, s5, s12
1632 ; GFX9-NEXT:    s_mul_i32 s3, s3, s9
1633 ; GFX9-NEXT:    s_sub_i32 s3, s5, s3
1634 ; GFX9-NEXT:    s_sub_i32 s4, s3, s9
1635 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v2, v2
1636 ; GFX9-NEXT:    s_cmp_ge_u32 s3, s9
1637 ; GFX9-NEXT:    s_cselect_b32 s3, s4, s3
1638 ; GFX9-NEXT:    s_sub_i32 s4, s3, s9
1639 ; GFX9-NEXT:    s_cmp_ge_u32 s3, s9
1640 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v0, s11
1641 ; GFX9-NEXT:    s_cselect_b32 s3, s4, s3
1642 ; GFX9-NEXT:    s_sub_i32 s4, 0, s10
1643 ; GFX9-NEXT:    v_readfirstlane_b32 s5, v2
1644 ; GFX9-NEXT:    s_mul_i32 s4, s4, s5
1645 ; GFX9-NEXT:    s_mul_hi_u32 s4, s5, s4
1646 ; GFX9-NEXT:    s_add_i32 s5, s5, s4
1647 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v0, v0
1648 ; GFX9-NEXT:    s_mul_hi_u32 s4, s6, s5
1649 ; GFX9-NEXT:    s_mul_i32 s4, s4, s10
1650 ; GFX9-NEXT:    s_sub_i32 s4, s6, s4
1651 ; GFX9-NEXT:    s_sub_i32 s5, s4, s10
1652 ; GFX9-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
1653 ; GFX9-NEXT:    s_cmp_ge_u32 s4, s10
1654 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v0, v0
1655 ; GFX9-NEXT:    s_cselect_b32 s4, s5, s4
1656 ; GFX9-NEXT:    s_sub_i32 s5, s4, s10
1657 ; GFX9-NEXT:    s_cmp_ge_u32 s4, s10
1658 ; GFX9-NEXT:    s_cselect_b32 s4, s5, s4
1659 ; GFX9-NEXT:    s_sub_i32 s5, 0, s11
1660 ; GFX9-NEXT:    v_readfirstlane_b32 s6, v0
1661 ; GFX9-NEXT:    s_mul_i32 s5, s5, s6
1662 ; GFX9-NEXT:    s_mul_hi_u32 s5, s6, s5
1663 ; GFX9-NEXT:    s_add_i32 s6, s6, s5
1664 ; GFX9-NEXT:    s_mul_hi_u32 s5, s7, s6
1665 ; GFX9-NEXT:    s_mul_i32 s5, s5, s11
1666 ; GFX9-NEXT:    s_sub_i32 s5, s7, s5
1667 ; GFX9-NEXT:    s_sub_i32 s6, s5, s11
1668 ; GFX9-NEXT:    s_cmp_ge_u32 s5, s11
1669 ; GFX9-NEXT:    s_cselect_b32 s5, s6, s5
1670 ; GFX9-NEXT:    s_sub_i32 s6, s5, s11
1671 ; GFX9-NEXT:    s_cmp_ge_u32 s5, s11
1672 ; GFX9-NEXT:    s_cselect_b32 s5, s6, s5
1673 ; GFX9-NEXT:    v_mov_b32_e32 v0, s2
1674 ; GFX9-NEXT:    v_mov_b32_e32 v1, s3
1675 ; GFX9-NEXT:    v_mov_b32_e32 v2, s4
1676 ; GFX9-NEXT:    v_mov_b32_e32 v3, s5
1677 ; GFX9-NEXT:    global_store_dwordx4 v4, v[0:3], s[0:1]
1678 ; GFX9-NEXT:    s_endpgm
1679   %r = urem <4 x i32> %x, %y
1680   store <4 x i32> %r, ptr addrspace(1) %out
1681   ret void
1684 define amdgpu_kernel void @sdiv_v4i32(ptr addrspace(1) %out, <4 x i32> %x, <4 x i32> %y) {
1685 ; CHECK-LABEL: @sdiv_v4i32(
1686 ; CHECK-NEXT:    [[TMP1:%.*]] = extractelement <4 x i32> [[X:%.*]], i64 0
1687 ; CHECK-NEXT:    [[TMP2:%.*]] = extractelement <4 x i32> [[Y:%.*]], i64 0
1688 ; CHECK-NEXT:    [[TMP3:%.*]] = ashr i32 [[TMP1]], 31
1689 ; CHECK-NEXT:    [[TMP4:%.*]] = ashr i32 [[TMP2]], 31
1690 ; CHECK-NEXT:    [[TMP5:%.*]] = xor i32 [[TMP3]], [[TMP4]]
1691 ; CHECK-NEXT:    [[TMP6:%.*]] = add i32 [[TMP1]], [[TMP3]]
1692 ; CHECK-NEXT:    [[TMP7:%.*]] = add i32 [[TMP2]], [[TMP4]]
1693 ; CHECK-NEXT:    [[TMP8:%.*]] = xor i32 [[TMP6]], [[TMP3]]
1694 ; CHECK-NEXT:    [[TMP9:%.*]] = xor i32 [[TMP7]], [[TMP4]]
1695 ; CHECK-NEXT:    [[TMP10:%.*]] = uitofp i32 [[TMP9]] to float
1696 ; CHECK-NEXT:    [[TMP11:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP10]])
1697 ; CHECK-NEXT:    [[TMP12:%.*]] = fmul fast float [[TMP11]], 0x41EFFFFFC0000000
1698 ; CHECK-NEXT:    [[TMP13:%.*]] = fptoui float [[TMP12]] to i32
1699 ; CHECK-NEXT:    [[TMP14:%.*]] = sub i32 0, [[TMP9]]
1700 ; CHECK-NEXT:    [[TMP15:%.*]] = mul i32 [[TMP14]], [[TMP13]]
1701 ; CHECK-NEXT:    [[TMP16:%.*]] = zext i32 [[TMP13]] to i64
1702 ; CHECK-NEXT:    [[TMP17:%.*]] = zext i32 [[TMP15]] to i64
1703 ; CHECK-NEXT:    [[TMP18:%.*]] = mul i64 [[TMP16]], [[TMP17]]
1704 ; CHECK-NEXT:    [[TMP19:%.*]] = trunc i64 [[TMP18]] to i32
1705 ; CHECK-NEXT:    [[TMP20:%.*]] = lshr i64 [[TMP18]], 32
1706 ; CHECK-NEXT:    [[TMP21:%.*]] = trunc i64 [[TMP20]] to i32
1707 ; CHECK-NEXT:    [[TMP22:%.*]] = add i32 [[TMP13]], [[TMP21]]
1708 ; CHECK-NEXT:    [[TMP23:%.*]] = zext i32 [[TMP8]] to i64
1709 ; CHECK-NEXT:    [[TMP24:%.*]] = zext i32 [[TMP22]] to i64
1710 ; CHECK-NEXT:    [[TMP25:%.*]] = mul i64 [[TMP23]], [[TMP24]]
1711 ; CHECK-NEXT:    [[TMP26:%.*]] = trunc i64 [[TMP25]] to i32
1712 ; CHECK-NEXT:    [[TMP27:%.*]] = lshr i64 [[TMP25]], 32
1713 ; CHECK-NEXT:    [[TMP28:%.*]] = trunc i64 [[TMP27]] to i32
1714 ; CHECK-NEXT:    [[TMP29:%.*]] = mul i32 [[TMP28]], [[TMP9]]
1715 ; CHECK-NEXT:    [[TMP30:%.*]] = sub i32 [[TMP8]], [[TMP29]]
1716 ; CHECK-NEXT:    [[TMP31:%.*]] = icmp uge i32 [[TMP30]], [[TMP9]]
1717 ; CHECK-NEXT:    [[TMP32:%.*]] = add i32 [[TMP28]], 1
1718 ; CHECK-NEXT:    [[TMP33:%.*]] = select i1 [[TMP31]], i32 [[TMP32]], i32 [[TMP28]]
1719 ; CHECK-NEXT:    [[TMP34:%.*]] = sub i32 [[TMP30]], [[TMP9]]
1720 ; CHECK-NEXT:    [[TMP35:%.*]] = select i1 [[TMP31]], i32 [[TMP34]], i32 [[TMP30]]
1721 ; CHECK-NEXT:    [[TMP36:%.*]] = icmp uge i32 [[TMP35]], [[TMP9]]
1722 ; CHECK-NEXT:    [[TMP37:%.*]] = add i32 [[TMP33]], 1
1723 ; CHECK-NEXT:    [[TMP38:%.*]] = select i1 [[TMP36]], i32 [[TMP37]], i32 [[TMP33]]
1724 ; CHECK-NEXT:    [[TMP39:%.*]] = xor i32 [[TMP38]], [[TMP5]]
1725 ; CHECK-NEXT:    [[TMP40:%.*]] = sub i32 [[TMP39]], [[TMP5]]
1726 ; CHECK-NEXT:    [[TMP41:%.*]] = insertelement <4 x i32> poison, i32 [[TMP40]], i64 0
1727 ; CHECK-NEXT:    [[TMP42:%.*]] = extractelement <4 x i32> [[X]], i64 1
1728 ; CHECK-NEXT:    [[TMP43:%.*]] = extractelement <4 x i32> [[Y]], i64 1
1729 ; CHECK-NEXT:    [[TMP44:%.*]] = ashr i32 [[TMP42]], 31
1730 ; CHECK-NEXT:    [[TMP45:%.*]] = ashr i32 [[TMP43]], 31
1731 ; CHECK-NEXT:    [[TMP46:%.*]] = xor i32 [[TMP44]], [[TMP45]]
1732 ; CHECK-NEXT:    [[TMP47:%.*]] = add i32 [[TMP42]], [[TMP44]]
1733 ; CHECK-NEXT:    [[TMP48:%.*]] = add i32 [[TMP43]], [[TMP45]]
1734 ; CHECK-NEXT:    [[TMP49:%.*]] = xor i32 [[TMP47]], [[TMP44]]
1735 ; CHECK-NEXT:    [[TMP50:%.*]] = xor i32 [[TMP48]], [[TMP45]]
1736 ; CHECK-NEXT:    [[TMP51:%.*]] = uitofp i32 [[TMP50]] to float
1737 ; CHECK-NEXT:    [[TMP52:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP51]])
1738 ; CHECK-NEXT:    [[TMP53:%.*]] = fmul fast float [[TMP52]], 0x41EFFFFFC0000000
1739 ; CHECK-NEXT:    [[TMP54:%.*]] = fptoui float [[TMP53]] to i32
1740 ; CHECK-NEXT:    [[TMP55:%.*]] = sub i32 0, [[TMP50]]
1741 ; CHECK-NEXT:    [[TMP56:%.*]] = mul i32 [[TMP55]], [[TMP54]]
1742 ; CHECK-NEXT:    [[TMP57:%.*]] = zext i32 [[TMP54]] to i64
1743 ; CHECK-NEXT:    [[TMP58:%.*]] = zext i32 [[TMP56]] to i64
1744 ; CHECK-NEXT:    [[TMP59:%.*]] = mul i64 [[TMP57]], [[TMP58]]
1745 ; CHECK-NEXT:    [[TMP60:%.*]] = trunc i64 [[TMP59]] to i32
1746 ; CHECK-NEXT:    [[TMP61:%.*]] = lshr i64 [[TMP59]], 32
1747 ; CHECK-NEXT:    [[TMP62:%.*]] = trunc i64 [[TMP61]] to i32
1748 ; CHECK-NEXT:    [[TMP63:%.*]] = add i32 [[TMP54]], [[TMP62]]
1749 ; CHECK-NEXT:    [[TMP64:%.*]] = zext i32 [[TMP49]] to i64
1750 ; CHECK-NEXT:    [[TMP65:%.*]] = zext i32 [[TMP63]] to i64
1751 ; CHECK-NEXT:    [[TMP66:%.*]] = mul i64 [[TMP64]], [[TMP65]]
1752 ; CHECK-NEXT:    [[TMP67:%.*]] = trunc i64 [[TMP66]] to i32
1753 ; CHECK-NEXT:    [[TMP68:%.*]] = lshr i64 [[TMP66]], 32
1754 ; CHECK-NEXT:    [[TMP69:%.*]] = trunc i64 [[TMP68]] to i32
1755 ; CHECK-NEXT:    [[TMP70:%.*]] = mul i32 [[TMP69]], [[TMP50]]
1756 ; CHECK-NEXT:    [[TMP71:%.*]] = sub i32 [[TMP49]], [[TMP70]]
1757 ; CHECK-NEXT:    [[TMP72:%.*]] = icmp uge i32 [[TMP71]], [[TMP50]]
1758 ; CHECK-NEXT:    [[TMP73:%.*]] = add i32 [[TMP69]], 1
1759 ; CHECK-NEXT:    [[TMP74:%.*]] = select i1 [[TMP72]], i32 [[TMP73]], i32 [[TMP69]]
1760 ; CHECK-NEXT:    [[TMP75:%.*]] = sub i32 [[TMP71]], [[TMP50]]
1761 ; CHECK-NEXT:    [[TMP76:%.*]] = select i1 [[TMP72]], i32 [[TMP75]], i32 [[TMP71]]
1762 ; CHECK-NEXT:    [[TMP77:%.*]] = icmp uge i32 [[TMP76]], [[TMP50]]
1763 ; CHECK-NEXT:    [[TMP78:%.*]] = add i32 [[TMP74]], 1
1764 ; CHECK-NEXT:    [[TMP79:%.*]] = select i1 [[TMP77]], i32 [[TMP78]], i32 [[TMP74]]
1765 ; CHECK-NEXT:    [[TMP80:%.*]] = xor i32 [[TMP79]], [[TMP46]]
1766 ; CHECK-NEXT:    [[TMP81:%.*]] = sub i32 [[TMP80]], [[TMP46]]
1767 ; CHECK-NEXT:    [[TMP82:%.*]] = insertelement <4 x i32> [[TMP41]], i32 [[TMP81]], i64 1
1768 ; CHECK-NEXT:    [[TMP83:%.*]] = extractelement <4 x i32> [[X]], i64 2
1769 ; CHECK-NEXT:    [[TMP84:%.*]] = extractelement <4 x i32> [[Y]], i64 2
1770 ; CHECK-NEXT:    [[TMP85:%.*]] = ashr i32 [[TMP83]], 31
1771 ; CHECK-NEXT:    [[TMP86:%.*]] = ashr i32 [[TMP84]], 31
1772 ; CHECK-NEXT:    [[TMP87:%.*]] = xor i32 [[TMP85]], [[TMP86]]
1773 ; CHECK-NEXT:    [[TMP88:%.*]] = add i32 [[TMP83]], [[TMP85]]
1774 ; CHECK-NEXT:    [[TMP89:%.*]] = add i32 [[TMP84]], [[TMP86]]
1775 ; CHECK-NEXT:    [[TMP90:%.*]] = xor i32 [[TMP88]], [[TMP85]]
1776 ; CHECK-NEXT:    [[TMP91:%.*]] = xor i32 [[TMP89]], [[TMP86]]
1777 ; CHECK-NEXT:    [[TMP92:%.*]] = uitofp i32 [[TMP91]] to float
1778 ; CHECK-NEXT:    [[TMP93:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP92]])
1779 ; CHECK-NEXT:    [[TMP94:%.*]] = fmul fast float [[TMP93]], 0x41EFFFFFC0000000
1780 ; CHECK-NEXT:    [[TMP95:%.*]] = fptoui float [[TMP94]] to i32
1781 ; CHECK-NEXT:    [[TMP96:%.*]] = sub i32 0, [[TMP91]]
1782 ; CHECK-NEXT:    [[TMP97:%.*]] = mul i32 [[TMP96]], [[TMP95]]
1783 ; CHECK-NEXT:    [[TMP98:%.*]] = zext i32 [[TMP95]] to i64
1784 ; CHECK-NEXT:    [[TMP99:%.*]] = zext i32 [[TMP97]] to i64
1785 ; CHECK-NEXT:    [[TMP100:%.*]] = mul i64 [[TMP98]], [[TMP99]]
1786 ; CHECK-NEXT:    [[TMP101:%.*]] = trunc i64 [[TMP100]] to i32
1787 ; CHECK-NEXT:    [[TMP102:%.*]] = lshr i64 [[TMP100]], 32
1788 ; CHECK-NEXT:    [[TMP103:%.*]] = trunc i64 [[TMP102]] to i32
1789 ; CHECK-NEXT:    [[TMP104:%.*]] = add i32 [[TMP95]], [[TMP103]]
1790 ; CHECK-NEXT:    [[TMP105:%.*]] = zext i32 [[TMP90]] to i64
1791 ; CHECK-NEXT:    [[TMP106:%.*]] = zext i32 [[TMP104]] to i64
1792 ; CHECK-NEXT:    [[TMP107:%.*]] = mul i64 [[TMP105]], [[TMP106]]
1793 ; CHECK-NEXT:    [[TMP108:%.*]] = trunc i64 [[TMP107]] to i32
1794 ; CHECK-NEXT:    [[TMP109:%.*]] = lshr i64 [[TMP107]], 32
1795 ; CHECK-NEXT:    [[TMP110:%.*]] = trunc i64 [[TMP109]] to i32
1796 ; CHECK-NEXT:    [[TMP111:%.*]] = mul i32 [[TMP110]], [[TMP91]]
1797 ; CHECK-NEXT:    [[TMP112:%.*]] = sub i32 [[TMP90]], [[TMP111]]
1798 ; CHECK-NEXT:    [[TMP113:%.*]] = icmp uge i32 [[TMP112]], [[TMP91]]
1799 ; CHECK-NEXT:    [[TMP114:%.*]] = add i32 [[TMP110]], 1
1800 ; CHECK-NEXT:    [[TMP115:%.*]] = select i1 [[TMP113]], i32 [[TMP114]], i32 [[TMP110]]
1801 ; CHECK-NEXT:    [[TMP116:%.*]] = sub i32 [[TMP112]], [[TMP91]]
1802 ; CHECK-NEXT:    [[TMP117:%.*]] = select i1 [[TMP113]], i32 [[TMP116]], i32 [[TMP112]]
1803 ; CHECK-NEXT:    [[TMP118:%.*]] = icmp uge i32 [[TMP117]], [[TMP91]]
1804 ; CHECK-NEXT:    [[TMP119:%.*]] = add i32 [[TMP115]], 1
1805 ; CHECK-NEXT:    [[TMP120:%.*]] = select i1 [[TMP118]], i32 [[TMP119]], i32 [[TMP115]]
1806 ; CHECK-NEXT:    [[TMP121:%.*]] = xor i32 [[TMP120]], [[TMP87]]
1807 ; CHECK-NEXT:    [[TMP122:%.*]] = sub i32 [[TMP121]], [[TMP87]]
1808 ; CHECK-NEXT:    [[TMP123:%.*]] = insertelement <4 x i32> [[TMP82]], i32 [[TMP122]], i64 2
1809 ; CHECK-NEXT:    [[TMP124:%.*]] = extractelement <4 x i32> [[X]], i64 3
1810 ; CHECK-NEXT:    [[TMP125:%.*]] = extractelement <4 x i32> [[Y]], i64 3
1811 ; CHECK-NEXT:    [[TMP126:%.*]] = ashr i32 [[TMP124]], 31
1812 ; CHECK-NEXT:    [[TMP127:%.*]] = ashr i32 [[TMP125]], 31
1813 ; CHECK-NEXT:    [[TMP128:%.*]] = xor i32 [[TMP126]], [[TMP127]]
1814 ; CHECK-NEXT:    [[TMP129:%.*]] = add i32 [[TMP124]], [[TMP126]]
1815 ; CHECK-NEXT:    [[TMP130:%.*]] = add i32 [[TMP125]], [[TMP127]]
1816 ; CHECK-NEXT:    [[TMP131:%.*]] = xor i32 [[TMP129]], [[TMP126]]
1817 ; CHECK-NEXT:    [[TMP132:%.*]] = xor i32 [[TMP130]], [[TMP127]]
1818 ; CHECK-NEXT:    [[TMP133:%.*]] = uitofp i32 [[TMP132]] to float
1819 ; CHECK-NEXT:    [[TMP134:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP133]])
1820 ; CHECK-NEXT:    [[TMP135:%.*]] = fmul fast float [[TMP134]], 0x41EFFFFFC0000000
1821 ; CHECK-NEXT:    [[TMP136:%.*]] = fptoui float [[TMP135]] to i32
1822 ; CHECK-NEXT:    [[TMP137:%.*]] = sub i32 0, [[TMP132]]
1823 ; CHECK-NEXT:    [[TMP138:%.*]] = mul i32 [[TMP137]], [[TMP136]]
1824 ; CHECK-NEXT:    [[TMP139:%.*]] = zext i32 [[TMP136]] to i64
1825 ; CHECK-NEXT:    [[TMP140:%.*]] = zext i32 [[TMP138]] to i64
1826 ; CHECK-NEXT:    [[TMP141:%.*]] = mul i64 [[TMP139]], [[TMP140]]
1827 ; CHECK-NEXT:    [[TMP142:%.*]] = trunc i64 [[TMP141]] to i32
1828 ; CHECK-NEXT:    [[TMP143:%.*]] = lshr i64 [[TMP141]], 32
1829 ; CHECK-NEXT:    [[TMP144:%.*]] = trunc i64 [[TMP143]] to i32
1830 ; CHECK-NEXT:    [[TMP145:%.*]] = add i32 [[TMP136]], [[TMP144]]
1831 ; CHECK-NEXT:    [[TMP146:%.*]] = zext i32 [[TMP131]] to i64
1832 ; CHECK-NEXT:    [[TMP147:%.*]] = zext i32 [[TMP145]] to i64
1833 ; CHECK-NEXT:    [[TMP148:%.*]] = mul i64 [[TMP146]], [[TMP147]]
1834 ; CHECK-NEXT:    [[TMP149:%.*]] = trunc i64 [[TMP148]] to i32
1835 ; CHECK-NEXT:    [[TMP150:%.*]] = lshr i64 [[TMP148]], 32
1836 ; CHECK-NEXT:    [[TMP151:%.*]] = trunc i64 [[TMP150]] to i32
1837 ; CHECK-NEXT:    [[TMP152:%.*]] = mul i32 [[TMP151]], [[TMP132]]
1838 ; CHECK-NEXT:    [[TMP153:%.*]] = sub i32 [[TMP131]], [[TMP152]]
1839 ; CHECK-NEXT:    [[TMP154:%.*]] = icmp uge i32 [[TMP153]], [[TMP132]]
1840 ; CHECK-NEXT:    [[TMP155:%.*]] = add i32 [[TMP151]], 1
1841 ; CHECK-NEXT:    [[TMP156:%.*]] = select i1 [[TMP154]], i32 [[TMP155]], i32 [[TMP151]]
1842 ; CHECK-NEXT:    [[TMP157:%.*]] = sub i32 [[TMP153]], [[TMP132]]
1843 ; CHECK-NEXT:    [[TMP158:%.*]] = select i1 [[TMP154]], i32 [[TMP157]], i32 [[TMP153]]
1844 ; CHECK-NEXT:    [[TMP159:%.*]] = icmp uge i32 [[TMP158]], [[TMP132]]
1845 ; CHECK-NEXT:    [[TMP160:%.*]] = add i32 [[TMP156]], 1
1846 ; CHECK-NEXT:    [[TMP161:%.*]] = select i1 [[TMP159]], i32 [[TMP160]], i32 [[TMP156]]
1847 ; CHECK-NEXT:    [[TMP162:%.*]] = xor i32 [[TMP161]], [[TMP128]]
1848 ; CHECK-NEXT:    [[TMP163:%.*]] = sub i32 [[TMP162]], [[TMP128]]
1849 ; CHECK-NEXT:    [[TMP164:%.*]] = insertelement <4 x i32> [[TMP123]], i32 [[TMP163]], i64 3
1850 ; CHECK-NEXT:    store <4 x i32> [[TMP164]], ptr addrspace(1) [[OUT:%.*]], align 16
1851 ; CHECK-NEXT:    ret void
1853 ; GFX6-LABEL: sdiv_v4i32:
1854 ; GFX6:       ; %bb.0:
1855 ; GFX6-NEXT:    s_load_dwordx8 s[8:15], s[0:1], 0xd
1856 ; GFX6-NEXT:    s_load_dwordx2 s[16:17], s[0:1], 0x9
1857 ; GFX6-NEXT:    s_mov_b32 s19, 0xf000
1858 ; GFX6-NEXT:    s_mov_b32 s18, -1
1859 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
1860 ; GFX6-NEXT:    s_ashr_i32 s2, s12, 31
1861 ; GFX6-NEXT:    s_add_i32 s3, s12, s2
1862 ; GFX6-NEXT:    s_xor_b32 s3, s3, s2
1863 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v0, s3
1864 ; GFX6-NEXT:    s_sub_i32 s4, 0, s3
1865 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v0, v0
1866 ; GFX6-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
1867 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v0, v0
1868 ; GFX6-NEXT:    v_mul_lo_u32 v1, s4, v0
1869 ; GFX6-NEXT:    s_ashr_i32 s4, s8, 31
1870 ; GFX6-NEXT:    s_add_i32 s5, s8, s4
1871 ; GFX6-NEXT:    s_xor_b32 s5, s5, s4
1872 ; GFX6-NEXT:    v_mul_hi_u32 v1, v0, v1
1873 ; GFX6-NEXT:    s_xor_b32 s8, s4, s2
1874 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, v0, v1
1875 ; GFX6-NEXT:    v_mul_hi_u32 v0, s5, v0
1876 ; GFX6-NEXT:    v_readfirstlane_b32 s2, v0
1877 ; GFX6-NEXT:    s_mul_i32 s2, s2, s3
1878 ; GFX6-NEXT:    s_sub_i32 s2, s5, s2
1879 ; GFX6-NEXT:    s_sub_i32 s4, s2, s3
1880 ; GFX6-NEXT:    s_cmp_ge_u32 s2, s3
1881 ; GFX6-NEXT:    v_add_i32_e32 v1, vcc, 1, v0
1882 ; GFX6-NEXT:    s_cselect_b32 s2, s4, s2
1883 ; GFX6-NEXT:    s_cselect_b64 vcc, -1, 0
1884 ; GFX6-NEXT:    s_cmp_ge_u32 s2, s3
1885 ; GFX6-NEXT:    s_cselect_b64 s[2:3], -1, 0
1886 ; GFX6-NEXT:    s_ashr_i32 s4, s13, 31
1887 ; GFX6-NEXT:    s_add_i32 s5, s13, s4
1888 ; GFX6-NEXT:    s_xor_b32 s5, s5, s4
1889 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v2, s5
1890 ; GFX6-NEXT:    s_sub_i32 s6, 0, s5
1891 ; GFX6-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
1892 ; GFX6-NEXT:    v_add_i32_e32 v1, vcc, 1, v0
1893 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v2, v2
1894 ; GFX6-NEXT:    v_cndmask_b32_e64 v0, v0, v1, s[2:3]
1895 ; GFX6-NEXT:    v_xor_b32_e32 v0, s8, v0
1896 ; GFX6-NEXT:    v_mul_f32_e32 v2, 0x4f7ffffe, v2
1897 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v2, v2
1898 ; GFX6-NEXT:    v_mul_lo_u32 v3, s6, v2
1899 ; GFX6-NEXT:    s_ashr_i32 s6, s9, 31
1900 ; GFX6-NEXT:    s_add_i32 s7, s9, s6
1901 ; GFX6-NEXT:    s_xor_b32 s7, s7, s6
1902 ; GFX6-NEXT:    v_mul_hi_u32 v3, v2, v3
1903 ; GFX6-NEXT:    s_xor_b32 s9, s6, s4
1904 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, v2, v3
1905 ; GFX6-NEXT:    v_mul_hi_u32 v2, s7, v2
1906 ; GFX6-NEXT:    v_readfirstlane_b32 s4, v2
1907 ; GFX6-NEXT:    s_mul_i32 s4, s4, s5
1908 ; GFX6-NEXT:    s_sub_i32 s4, s7, s4
1909 ; GFX6-NEXT:    s_sub_i32 s6, s4, s5
1910 ; GFX6-NEXT:    s_cmp_ge_u32 s4, s5
1911 ; GFX6-NEXT:    v_add_i32_e32 v3, vcc, 1, v2
1912 ; GFX6-NEXT:    s_cselect_b32 s4, s6, s4
1913 ; GFX6-NEXT:    s_cselect_b64 vcc, -1, 0
1914 ; GFX6-NEXT:    s_cmp_ge_u32 s4, s5
1915 ; GFX6-NEXT:    s_cselect_b64 s[4:5], -1, 0
1916 ; GFX6-NEXT:    s_ashr_i32 s6, s14, 31
1917 ; GFX6-NEXT:    s_add_i32 s7, s14, s6
1918 ; GFX6-NEXT:    s_xor_b32 s7, s7, s6
1919 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v4, s7
1920 ; GFX6-NEXT:    s_sub_i32 s12, 0, s7
1921 ; GFX6-NEXT:    v_cndmask_b32_e32 v2, v2, v3, vcc
1922 ; GFX6-NEXT:    v_add_i32_e32 v3, vcc, 1, v2
1923 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v4, v4
1924 ; GFX6-NEXT:    v_cndmask_b32_e64 v2, v2, v3, s[4:5]
1925 ; GFX6-NEXT:    v_xor_b32_e32 v2, s9, v2
1926 ; GFX6-NEXT:    v_mul_f32_e32 v4, 0x4f7ffffe, v4
1927 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v4, v4
1928 ; GFX6-NEXT:    v_mul_lo_u32 v5, s12, v4
1929 ; GFX6-NEXT:    s_ashr_i32 s12, s10, 31
1930 ; GFX6-NEXT:    s_add_i32 s10, s10, s12
1931 ; GFX6-NEXT:    s_xor_b32 s10, s10, s12
1932 ; GFX6-NEXT:    v_mul_hi_u32 v5, v4, v5
1933 ; GFX6-NEXT:    s_xor_b32 s12, s12, s6
1934 ; GFX6-NEXT:    v_add_i32_e32 v4, vcc, v4, v5
1935 ; GFX6-NEXT:    v_mul_hi_u32 v4, s10, v4
1936 ; GFX6-NEXT:    v_readfirstlane_b32 s6, v4
1937 ; GFX6-NEXT:    s_mul_i32 s6, s6, s7
1938 ; GFX6-NEXT:    s_sub_i32 s6, s10, s6
1939 ; GFX6-NEXT:    s_sub_i32 s10, s6, s7
1940 ; GFX6-NEXT:    s_cmp_ge_u32 s6, s7
1941 ; GFX6-NEXT:    v_add_i32_e32 v5, vcc, 1, v4
1942 ; GFX6-NEXT:    s_cselect_b32 s6, s10, s6
1943 ; GFX6-NEXT:    s_cselect_b64 vcc, -1, 0
1944 ; GFX6-NEXT:    s_cmp_ge_u32 s6, s7
1945 ; GFX6-NEXT:    s_cselect_b64 s[6:7], -1, 0
1946 ; GFX6-NEXT:    s_ashr_i32 s10, s15, 31
1947 ; GFX6-NEXT:    s_add_i32 s13, s15, s10
1948 ; GFX6-NEXT:    s_xor_b32 s13, s13, s10
1949 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v6, s13
1950 ; GFX6-NEXT:    s_sub_i32 s0, 0, s13
1951 ; GFX6-NEXT:    v_cndmask_b32_e32 v4, v4, v5, vcc
1952 ; GFX6-NEXT:    v_add_i32_e32 v5, vcc, 1, v4
1953 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v1, v6
1954 ; GFX6-NEXT:    v_cndmask_b32_e64 v4, v4, v5, s[6:7]
1955 ; GFX6-NEXT:    v_xor_b32_e32 v4, s12, v4
1956 ; GFX6-NEXT:    v_subrev_i32_e32 v0, vcc, s8, v0
1957 ; GFX6-NEXT:    v_mul_f32_e32 v1, 0x4f7ffffe, v1
1958 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v3, v1
1959 ; GFX6-NEXT:    v_subrev_i32_e32 v1, vcc, s9, v2
1960 ; GFX6-NEXT:    v_mul_lo_u32 v2, s0, v3
1961 ; GFX6-NEXT:    s_ashr_i32 s0, s11, 31
1962 ; GFX6-NEXT:    s_add_i32 s1, s11, s0
1963 ; GFX6-NEXT:    s_xor_b32 s1, s1, s0
1964 ; GFX6-NEXT:    v_mul_hi_u32 v2, v3, v2
1965 ; GFX6-NEXT:    s_xor_b32 s0, s0, s10
1966 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, v3, v2
1967 ; GFX6-NEXT:    v_mul_hi_u32 v3, s1, v2
1968 ; GFX6-NEXT:    v_subrev_i32_e32 v2, vcc, s12, v4
1969 ; GFX6-NEXT:    v_readfirstlane_b32 s2, v3
1970 ; GFX6-NEXT:    s_mul_i32 s2, s2, s13
1971 ; GFX6-NEXT:    s_sub_i32 s1, s1, s2
1972 ; GFX6-NEXT:    s_sub_i32 s2, s1, s13
1973 ; GFX6-NEXT:    v_add_i32_e32 v4, vcc, 1, v3
1974 ; GFX6-NEXT:    s_cmp_ge_u32 s1, s13
1975 ; GFX6-NEXT:    s_cselect_b64 vcc, -1, 0
1976 ; GFX6-NEXT:    v_cndmask_b32_e32 v3, v3, v4, vcc
1977 ; GFX6-NEXT:    s_cselect_b32 s1, s2, s1
1978 ; GFX6-NEXT:    v_add_i32_e32 v4, vcc, 1, v3
1979 ; GFX6-NEXT:    s_cmp_ge_u32 s1, s13
1980 ; GFX6-NEXT:    s_cselect_b64 vcc, -1, 0
1981 ; GFX6-NEXT:    v_cndmask_b32_e32 v3, v3, v4, vcc
1982 ; GFX6-NEXT:    v_xor_b32_e32 v3, s0, v3
1983 ; GFX6-NEXT:    v_subrev_i32_e32 v3, vcc, s0, v3
1984 ; GFX6-NEXT:    buffer_store_dwordx4 v[0:3], off, s[16:19], 0
1985 ; GFX6-NEXT:    s_endpgm
1987 ; GFX9-LABEL: sdiv_v4i32:
1988 ; GFX9:       ; %bb.0:
1989 ; GFX9-NEXT:    s_load_dwordx8 s[4:11], s[0:1], 0x34
1990 ; GFX9-NEXT:    v_mov_b32_e32 v4, 0
1991 ; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
1992 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1993 ; GFX9-NEXT:    s_ashr_i32 s2, s8, 31
1994 ; GFX9-NEXT:    s_add_i32 s3, s8, s2
1995 ; GFX9-NEXT:    s_xor_b32 s3, s3, s2
1996 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v0, s3
1997 ; GFX9-NEXT:    s_ashr_i32 s8, s4, 31
1998 ; GFX9-NEXT:    s_add_i32 s4, s4, s8
1999 ; GFX9-NEXT:    s_xor_b32 s2, s8, s2
2000 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v0, v0
2001 ; GFX9-NEXT:    s_xor_b32 s4, s4, s8
2002 ; GFX9-NEXT:    s_sub_i32 s8, 0, s3
2003 ; GFX9-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
2004 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v0, v0
2005 ; GFX9-NEXT:    v_readfirstlane_b32 s12, v0
2006 ; GFX9-NEXT:    s_mul_i32 s8, s8, s12
2007 ; GFX9-NEXT:    s_mul_hi_u32 s8, s12, s8
2008 ; GFX9-NEXT:    s_add_i32 s12, s12, s8
2009 ; GFX9-NEXT:    s_mul_hi_u32 s8, s4, s12
2010 ; GFX9-NEXT:    s_mul_i32 s12, s8, s3
2011 ; GFX9-NEXT:    s_sub_i32 s4, s4, s12
2012 ; GFX9-NEXT:    s_add_i32 s13, s8, 1
2013 ; GFX9-NEXT:    s_sub_i32 s12, s4, s3
2014 ; GFX9-NEXT:    s_cmp_ge_u32 s4, s3
2015 ; GFX9-NEXT:    s_cselect_b32 s8, s13, s8
2016 ; GFX9-NEXT:    s_cselect_b32 s4, s12, s4
2017 ; GFX9-NEXT:    s_add_i32 s12, s8, 1
2018 ; GFX9-NEXT:    s_cmp_ge_u32 s4, s3
2019 ; GFX9-NEXT:    s_cselect_b32 s3, s12, s8
2020 ; GFX9-NEXT:    s_ashr_i32 s4, s9, 31
2021 ; GFX9-NEXT:    s_add_i32 s8, s9, s4
2022 ; GFX9-NEXT:    s_xor_b32 s8, s8, s4
2023 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v0, s8
2024 ; GFX9-NEXT:    s_ashr_i32 s9, s5, 31
2025 ; GFX9-NEXT:    s_xor_b32 s3, s3, s2
2026 ; GFX9-NEXT:    s_add_i32 s5, s5, s9
2027 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v0, v0
2028 ; GFX9-NEXT:    s_xor_b32 s4, s9, s4
2029 ; GFX9-NEXT:    s_sub_i32 s2, s3, s2
2030 ; GFX9-NEXT:    s_xor_b32 s3, s5, s9
2031 ; GFX9-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
2032 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v0, v0
2033 ; GFX9-NEXT:    s_sub_i32 s5, 0, s8
2034 ; GFX9-NEXT:    v_readfirstlane_b32 s9, v0
2035 ; GFX9-NEXT:    s_mul_i32 s5, s5, s9
2036 ; GFX9-NEXT:    s_mul_hi_u32 s5, s9, s5
2037 ; GFX9-NEXT:    s_add_i32 s9, s9, s5
2038 ; GFX9-NEXT:    s_mul_hi_u32 s5, s3, s9
2039 ; GFX9-NEXT:    s_mul_i32 s9, s5, s8
2040 ; GFX9-NEXT:    s_sub_i32 s3, s3, s9
2041 ; GFX9-NEXT:    s_add_i32 s12, s5, 1
2042 ; GFX9-NEXT:    s_sub_i32 s9, s3, s8
2043 ; GFX9-NEXT:    s_cmp_ge_u32 s3, s8
2044 ; GFX9-NEXT:    s_cselect_b32 s5, s12, s5
2045 ; GFX9-NEXT:    s_cselect_b32 s3, s9, s3
2046 ; GFX9-NEXT:    s_add_i32 s9, s5, 1
2047 ; GFX9-NEXT:    s_cmp_ge_u32 s3, s8
2048 ; GFX9-NEXT:    s_cselect_b32 s3, s9, s5
2049 ; GFX9-NEXT:    s_ashr_i32 s5, s10, 31
2050 ; GFX9-NEXT:    s_add_i32 s8, s10, s5
2051 ; GFX9-NEXT:    s_xor_b32 s8, s8, s5
2052 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v0, s8
2053 ; GFX9-NEXT:    s_ashr_i32 s9, s6, 31
2054 ; GFX9-NEXT:    s_xor_b32 s3, s3, s4
2055 ; GFX9-NEXT:    s_add_i32 s6, s6, s9
2056 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v0, v0
2057 ; GFX9-NEXT:    s_xor_b32 s5, s9, s5
2058 ; GFX9-NEXT:    s_sub_i32 s3, s3, s4
2059 ; GFX9-NEXT:    s_xor_b32 s4, s6, s9
2060 ; GFX9-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
2061 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v0, v0
2062 ; GFX9-NEXT:    s_sub_i32 s6, 0, s8
2063 ; GFX9-NEXT:    v_readfirstlane_b32 s9, v0
2064 ; GFX9-NEXT:    s_mul_i32 s6, s6, s9
2065 ; GFX9-NEXT:    s_mul_hi_u32 s6, s9, s6
2066 ; GFX9-NEXT:    s_add_i32 s9, s9, s6
2067 ; GFX9-NEXT:    s_mul_hi_u32 s6, s4, s9
2068 ; GFX9-NEXT:    s_mul_i32 s9, s6, s8
2069 ; GFX9-NEXT:    s_sub_i32 s4, s4, s9
2070 ; GFX9-NEXT:    s_add_i32 s10, s6, 1
2071 ; GFX9-NEXT:    s_sub_i32 s9, s4, s8
2072 ; GFX9-NEXT:    s_cmp_ge_u32 s4, s8
2073 ; GFX9-NEXT:    s_cselect_b32 s6, s10, s6
2074 ; GFX9-NEXT:    s_cselect_b32 s4, s9, s4
2075 ; GFX9-NEXT:    s_add_i32 s9, s6, 1
2076 ; GFX9-NEXT:    s_cmp_ge_u32 s4, s8
2077 ; GFX9-NEXT:    s_cselect_b32 s4, s9, s6
2078 ; GFX9-NEXT:    s_ashr_i32 s6, s11, 31
2079 ; GFX9-NEXT:    s_add_i32 s8, s11, s6
2080 ; GFX9-NEXT:    s_xor_b32 s8, s8, s6
2081 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v1, s8
2082 ; GFX9-NEXT:    v_mov_b32_e32 v0, s2
2083 ; GFX9-NEXT:    s_ashr_i32 s2, s7, 31
2084 ; GFX9-NEXT:    s_xor_b32 s4, s4, s5
2085 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v1, v1
2086 ; GFX9-NEXT:    s_add_i32 s7, s7, s2
2087 ; GFX9-NEXT:    s_xor_b32 s6, s2, s6
2088 ; GFX9-NEXT:    s_sub_i32 s4, s4, s5
2089 ; GFX9-NEXT:    v_mul_f32_e32 v1, 0x4f7ffffe, v1
2090 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v1, v1
2091 ; GFX9-NEXT:    s_xor_b32 s2, s7, s2
2092 ; GFX9-NEXT:    s_sub_i32 s5, 0, s8
2093 ; GFX9-NEXT:    v_mov_b32_e32 v2, s4
2094 ; GFX9-NEXT:    v_readfirstlane_b32 s7, v1
2095 ; GFX9-NEXT:    s_mul_i32 s5, s5, s7
2096 ; GFX9-NEXT:    s_mul_hi_u32 s5, s7, s5
2097 ; GFX9-NEXT:    s_add_i32 s7, s7, s5
2098 ; GFX9-NEXT:    s_mul_hi_u32 s5, s2, s7
2099 ; GFX9-NEXT:    s_mul_i32 s7, s5, s8
2100 ; GFX9-NEXT:    s_sub_i32 s2, s2, s7
2101 ; GFX9-NEXT:    s_add_i32 s9, s5, 1
2102 ; GFX9-NEXT:    s_sub_i32 s7, s2, s8
2103 ; GFX9-NEXT:    s_cmp_ge_u32 s2, s8
2104 ; GFX9-NEXT:    s_cselect_b32 s5, s9, s5
2105 ; GFX9-NEXT:    s_cselect_b32 s2, s7, s2
2106 ; GFX9-NEXT:    s_add_i32 s7, s5, 1
2107 ; GFX9-NEXT:    s_cmp_ge_u32 s2, s8
2108 ; GFX9-NEXT:    s_cselect_b32 s2, s7, s5
2109 ; GFX9-NEXT:    s_xor_b32 s2, s2, s6
2110 ; GFX9-NEXT:    s_sub_i32 s2, s2, s6
2111 ; GFX9-NEXT:    v_mov_b32_e32 v1, s3
2112 ; GFX9-NEXT:    v_mov_b32_e32 v3, s2
2113 ; GFX9-NEXT:    global_store_dwordx4 v4, v[0:3], s[0:1]
2114 ; GFX9-NEXT:    s_endpgm
2115   %r = sdiv <4 x i32> %x, %y
2116   store <4 x i32> %r, ptr addrspace(1) %out
2117   ret void
2120 define amdgpu_kernel void @srem_v4i32(ptr addrspace(1) %out, <4 x i32> %x, <4 x i32> %y) {
2121 ; CHECK-LABEL: @srem_v4i32(
2122 ; CHECK-NEXT:    [[TMP1:%.*]] = extractelement <4 x i32> [[X:%.*]], i64 0
2123 ; CHECK-NEXT:    [[TMP2:%.*]] = extractelement <4 x i32> [[Y:%.*]], i64 0
2124 ; CHECK-NEXT:    [[TMP3:%.*]] = ashr i32 [[TMP1]], 31
2125 ; CHECK-NEXT:    [[TMP4:%.*]] = ashr i32 [[TMP2]], 31
2126 ; CHECK-NEXT:    [[TMP5:%.*]] = add i32 [[TMP1]], [[TMP3]]
2127 ; CHECK-NEXT:    [[TMP6:%.*]] = add i32 [[TMP2]], [[TMP4]]
2128 ; CHECK-NEXT:    [[TMP7:%.*]] = xor i32 [[TMP5]], [[TMP3]]
2129 ; CHECK-NEXT:    [[TMP8:%.*]] = xor i32 [[TMP6]], [[TMP4]]
2130 ; CHECK-NEXT:    [[TMP9:%.*]] = uitofp i32 [[TMP8]] to float
2131 ; CHECK-NEXT:    [[TMP10:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP9]])
2132 ; CHECK-NEXT:    [[TMP11:%.*]] = fmul fast float [[TMP10]], 0x41EFFFFFC0000000
2133 ; CHECK-NEXT:    [[TMP12:%.*]] = fptoui float [[TMP11]] to i32
2134 ; CHECK-NEXT:    [[TMP13:%.*]] = sub i32 0, [[TMP8]]
2135 ; CHECK-NEXT:    [[TMP14:%.*]] = mul i32 [[TMP13]], [[TMP12]]
2136 ; CHECK-NEXT:    [[TMP15:%.*]] = zext i32 [[TMP12]] to i64
2137 ; CHECK-NEXT:    [[TMP16:%.*]] = zext i32 [[TMP14]] to i64
2138 ; CHECK-NEXT:    [[TMP17:%.*]] = mul i64 [[TMP15]], [[TMP16]]
2139 ; CHECK-NEXT:    [[TMP18:%.*]] = trunc i64 [[TMP17]] to i32
2140 ; CHECK-NEXT:    [[TMP19:%.*]] = lshr i64 [[TMP17]], 32
2141 ; CHECK-NEXT:    [[TMP20:%.*]] = trunc i64 [[TMP19]] to i32
2142 ; CHECK-NEXT:    [[TMP21:%.*]] = add i32 [[TMP12]], [[TMP20]]
2143 ; CHECK-NEXT:    [[TMP22:%.*]] = zext i32 [[TMP7]] to i64
2144 ; CHECK-NEXT:    [[TMP23:%.*]] = zext i32 [[TMP21]] to i64
2145 ; CHECK-NEXT:    [[TMP24:%.*]] = mul i64 [[TMP22]], [[TMP23]]
2146 ; CHECK-NEXT:    [[TMP25:%.*]] = trunc i64 [[TMP24]] to i32
2147 ; CHECK-NEXT:    [[TMP26:%.*]] = lshr i64 [[TMP24]], 32
2148 ; CHECK-NEXT:    [[TMP27:%.*]] = trunc i64 [[TMP26]] to i32
2149 ; CHECK-NEXT:    [[TMP28:%.*]] = mul i32 [[TMP27]], [[TMP8]]
2150 ; CHECK-NEXT:    [[TMP29:%.*]] = sub i32 [[TMP7]], [[TMP28]]
2151 ; CHECK-NEXT:    [[TMP30:%.*]] = icmp uge i32 [[TMP29]], [[TMP8]]
2152 ; CHECK-NEXT:    [[TMP31:%.*]] = sub i32 [[TMP29]], [[TMP8]]
2153 ; CHECK-NEXT:    [[TMP32:%.*]] = select i1 [[TMP30]], i32 [[TMP31]], i32 [[TMP29]]
2154 ; CHECK-NEXT:    [[TMP33:%.*]] = icmp uge i32 [[TMP32]], [[TMP8]]
2155 ; CHECK-NEXT:    [[TMP34:%.*]] = sub i32 [[TMP32]], [[TMP8]]
2156 ; CHECK-NEXT:    [[TMP35:%.*]] = select i1 [[TMP33]], i32 [[TMP34]], i32 [[TMP32]]
2157 ; CHECK-NEXT:    [[TMP36:%.*]] = xor i32 [[TMP35]], [[TMP3]]
2158 ; CHECK-NEXT:    [[TMP37:%.*]] = sub i32 [[TMP36]], [[TMP3]]
2159 ; CHECK-NEXT:    [[TMP38:%.*]] = insertelement <4 x i32> poison, i32 [[TMP37]], i64 0
2160 ; CHECK-NEXT:    [[TMP39:%.*]] = extractelement <4 x i32> [[X]], i64 1
2161 ; CHECK-NEXT:    [[TMP40:%.*]] = extractelement <4 x i32> [[Y]], i64 1
2162 ; CHECK-NEXT:    [[TMP41:%.*]] = ashr i32 [[TMP39]], 31
2163 ; CHECK-NEXT:    [[TMP42:%.*]] = ashr i32 [[TMP40]], 31
2164 ; CHECK-NEXT:    [[TMP43:%.*]] = add i32 [[TMP39]], [[TMP41]]
2165 ; CHECK-NEXT:    [[TMP44:%.*]] = add i32 [[TMP40]], [[TMP42]]
2166 ; CHECK-NEXT:    [[TMP45:%.*]] = xor i32 [[TMP43]], [[TMP41]]
2167 ; CHECK-NEXT:    [[TMP46:%.*]] = xor i32 [[TMP44]], [[TMP42]]
2168 ; CHECK-NEXT:    [[TMP47:%.*]] = uitofp i32 [[TMP46]] to float
2169 ; CHECK-NEXT:    [[TMP48:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP47]])
2170 ; CHECK-NEXT:    [[TMP49:%.*]] = fmul fast float [[TMP48]], 0x41EFFFFFC0000000
2171 ; CHECK-NEXT:    [[TMP50:%.*]] = fptoui float [[TMP49]] to i32
2172 ; CHECK-NEXT:    [[TMP51:%.*]] = sub i32 0, [[TMP46]]
2173 ; CHECK-NEXT:    [[TMP52:%.*]] = mul i32 [[TMP51]], [[TMP50]]
2174 ; CHECK-NEXT:    [[TMP53:%.*]] = zext i32 [[TMP50]] to i64
2175 ; CHECK-NEXT:    [[TMP54:%.*]] = zext i32 [[TMP52]] to i64
2176 ; CHECK-NEXT:    [[TMP55:%.*]] = mul i64 [[TMP53]], [[TMP54]]
2177 ; CHECK-NEXT:    [[TMP56:%.*]] = trunc i64 [[TMP55]] to i32
2178 ; CHECK-NEXT:    [[TMP57:%.*]] = lshr i64 [[TMP55]], 32
2179 ; CHECK-NEXT:    [[TMP58:%.*]] = trunc i64 [[TMP57]] to i32
2180 ; CHECK-NEXT:    [[TMP59:%.*]] = add i32 [[TMP50]], [[TMP58]]
2181 ; CHECK-NEXT:    [[TMP60:%.*]] = zext i32 [[TMP45]] to i64
2182 ; CHECK-NEXT:    [[TMP61:%.*]] = zext i32 [[TMP59]] to i64
2183 ; CHECK-NEXT:    [[TMP62:%.*]] = mul i64 [[TMP60]], [[TMP61]]
2184 ; CHECK-NEXT:    [[TMP63:%.*]] = trunc i64 [[TMP62]] to i32
2185 ; CHECK-NEXT:    [[TMP64:%.*]] = lshr i64 [[TMP62]], 32
2186 ; CHECK-NEXT:    [[TMP65:%.*]] = trunc i64 [[TMP64]] to i32
2187 ; CHECK-NEXT:    [[TMP66:%.*]] = mul i32 [[TMP65]], [[TMP46]]
2188 ; CHECK-NEXT:    [[TMP67:%.*]] = sub i32 [[TMP45]], [[TMP66]]
2189 ; CHECK-NEXT:    [[TMP68:%.*]] = icmp uge i32 [[TMP67]], [[TMP46]]
2190 ; CHECK-NEXT:    [[TMP69:%.*]] = sub i32 [[TMP67]], [[TMP46]]
2191 ; CHECK-NEXT:    [[TMP70:%.*]] = select i1 [[TMP68]], i32 [[TMP69]], i32 [[TMP67]]
2192 ; CHECK-NEXT:    [[TMP71:%.*]] = icmp uge i32 [[TMP70]], [[TMP46]]
2193 ; CHECK-NEXT:    [[TMP72:%.*]] = sub i32 [[TMP70]], [[TMP46]]
2194 ; CHECK-NEXT:    [[TMP73:%.*]] = select i1 [[TMP71]], i32 [[TMP72]], i32 [[TMP70]]
2195 ; CHECK-NEXT:    [[TMP74:%.*]] = xor i32 [[TMP73]], [[TMP41]]
2196 ; CHECK-NEXT:    [[TMP75:%.*]] = sub i32 [[TMP74]], [[TMP41]]
2197 ; CHECK-NEXT:    [[TMP76:%.*]] = insertelement <4 x i32> [[TMP38]], i32 [[TMP75]], i64 1
2198 ; CHECK-NEXT:    [[TMP77:%.*]] = extractelement <4 x i32> [[X]], i64 2
2199 ; CHECK-NEXT:    [[TMP78:%.*]] = extractelement <4 x i32> [[Y]], i64 2
2200 ; CHECK-NEXT:    [[TMP79:%.*]] = ashr i32 [[TMP77]], 31
2201 ; CHECK-NEXT:    [[TMP80:%.*]] = ashr i32 [[TMP78]], 31
2202 ; CHECK-NEXT:    [[TMP81:%.*]] = add i32 [[TMP77]], [[TMP79]]
2203 ; CHECK-NEXT:    [[TMP82:%.*]] = add i32 [[TMP78]], [[TMP80]]
2204 ; CHECK-NEXT:    [[TMP83:%.*]] = xor i32 [[TMP81]], [[TMP79]]
2205 ; CHECK-NEXT:    [[TMP84:%.*]] = xor i32 [[TMP82]], [[TMP80]]
2206 ; CHECK-NEXT:    [[TMP85:%.*]] = uitofp i32 [[TMP84]] to float
2207 ; CHECK-NEXT:    [[TMP86:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP85]])
2208 ; CHECK-NEXT:    [[TMP87:%.*]] = fmul fast float [[TMP86]], 0x41EFFFFFC0000000
2209 ; CHECK-NEXT:    [[TMP88:%.*]] = fptoui float [[TMP87]] to i32
2210 ; CHECK-NEXT:    [[TMP89:%.*]] = sub i32 0, [[TMP84]]
2211 ; CHECK-NEXT:    [[TMP90:%.*]] = mul i32 [[TMP89]], [[TMP88]]
2212 ; CHECK-NEXT:    [[TMP91:%.*]] = zext i32 [[TMP88]] to i64
2213 ; CHECK-NEXT:    [[TMP92:%.*]] = zext i32 [[TMP90]] to i64
2214 ; CHECK-NEXT:    [[TMP93:%.*]] = mul i64 [[TMP91]], [[TMP92]]
2215 ; CHECK-NEXT:    [[TMP94:%.*]] = trunc i64 [[TMP93]] to i32
2216 ; CHECK-NEXT:    [[TMP95:%.*]] = lshr i64 [[TMP93]], 32
2217 ; CHECK-NEXT:    [[TMP96:%.*]] = trunc i64 [[TMP95]] to i32
2218 ; CHECK-NEXT:    [[TMP97:%.*]] = add i32 [[TMP88]], [[TMP96]]
2219 ; CHECK-NEXT:    [[TMP98:%.*]] = zext i32 [[TMP83]] to i64
2220 ; CHECK-NEXT:    [[TMP99:%.*]] = zext i32 [[TMP97]] to i64
2221 ; CHECK-NEXT:    [[TMP100:%.*]] = mul i64 [[TMP98]], [[TMP99]]
2222 ; CHECK-NEXT:    [[TMP101:%.*]] = trunc i64 [[TMP100]] to i32
2223 ; CHECK-NEXT:    [[TMP102:%.*]] = lshr i64 [[TMP100]], 32
2224 ; CHECK-NEXT:    [[TMP103:%.*]] = trunc i64 [[TMP102]] to i32
2225 ; CHECK-NEXT:    [[TMP104:%.*]] = mul i32 [[TMP103]], [[TMP84]]
2226 ; CHECK-NEXT:    [[TMP105:%.*]] = sub i32 [[TMP83]], [[TMP104]]
2227 ; CHECK-NEXT:    [[TMP106:%.*]] = icmp uge i32 [[TMP105]], [[TMP84]]
2228 ; CHECK-NEXT:    [[TMP107:%.*]] = sub i32 [[TMP105]], [[TMP84]]
2229 ; CHECK-NEXT:    [[TMP108:%.*]] = select i1 [[TMP106]], i32 [[TMP107]], i32 [[TMP105]]
2230 ; CHECK-NEXT:    [[TMP109:%.*]] = icmp uge i32 [[TMP108]], [[TMP84]]
2231 ; CHECK-NEXT:    [[TMP110:%.*]] = sub i32 [[TMP108]], [[TMP84]]
2232 ; CHECK-NEXT:    [[TMP111:%.*]] = select i1 [[TMP109]], i32 [[TMP110]], i32 [[TMP108]]
2233 ; CHECK-NEXT:    [[TMP112:%.*]] = xor i32 [[TMP111]], [[TMP79]]
2234 ; CHECK-NEXT:    [[TMP113:%.*]] = sub i32 [[TMP112]], [[TMP79]]
2235 ; CHECK-NEXT:    [[TMP114:%.*]] = insertelement <4 x i32> [[TMP76]], i32 [[TMP113]], i64 2
2236 ; CHECK-NEXT:    [[TMP115:%.*]] = extractelement <4 x i32> [[X]], i64 3
2237 ; CHECK-NEXT:    [[TMP116:%.*]] = extractelement <4 x i32> [[Y]], i64 3
2238 ; CHECK-NEXT:    [[TMP117:%.*]] = ashr i32 [[TMP115]], 31
2239 ; CHECK-NEXT:    [[TMP118:%.*]] = ashr i32 [[TMP116]], 31
2240 ; CHECK-NEXT:    [[TMP119:%.*]] = add i32 [[TMP115]], [[TMP117]]
2241 ; CHECK-NEXT:    [[TMP120:%.*]] = add i32 [[TMP116]], [[TMP118]]
2242 ; CHECK-NEXT:    [[TMP121:%.*]] = xor i32 [[TMP119]], [[TMP117]]
2243 ; CHECK-NEXT:    [[TMP122:%.*]] = xor i32 [[TMP120]], [[TMP118]]
2244 ; CHECK-NEXT:    [[TMP123:%.*]] = uitofp i32 [[TMP122]] to float
2245 ; CHECK-NEXT:    [[TMP124:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP123]])
2246 ; CHECK-NEXT:    [[TMP125:%.*]] = fmul fast float [[TMP124]], 0x41EFFFFFC0000000
2247 ; CHECK-NEXT:    [[TMP126:%.*]] = fptoui float [[TMP125]] to i32
2248 ; CHECK-NEXT:    [[TMP127:%.*]] = sub i32 0, [[TMP122]]
2249 ; CHECK-NEXT:    [[TMP128:%.*]] = mul i32 [[TMP127]], [[TMP126]]
2250 ; CHECK-NEXT:    [[TMP129:%.*]] = zext i32 [[TMP126]] to i64
2251 ; CHECK-NEXT:    [[TMP130:%.*]] = zext i32 [[TMP128]] to i64
2252 ; CHECK-NEXT:    [[TMP131:%.*]] = mul i64 [[TMP129]], [[TMP130]]
2253 ; CHECK-NEXT:    [[TMP132:%.*]] = trunc i64 [[TMP131]] to i32
2254 ; CHECK-NEXT:    [[TMP133:%.*]] = lshr i64 [[TMP131]], 32
2255 ; CHECK-NEXT:    [[TMP134:%.*]] = trunc i64 [[TMP133]] to i32
2256 ; CHECK-NEXT:    [[TMP135:%.*]] = add i32 [[TMP126]], [[TMP134]]
2257 ; CHECK-NEXT:    [[TMP136:%.*]] = zext i32 [[TMP121]] to i64
2258 ; CHECK-NEXT:    [[TMP137:%.*]] = zext i32 [[TMP135]] to i64
2259 ; CHECK-NEXT:    [[TMP138:%.*]] = mul i64 [[TMP136]], [[TMP137]]
2260 ; CHECK-NEXT:    [[TMP139:%.*]] = trunc i64 [[TMP138]] to i32
2261 ; CHECK-NEXT:    [[TMP140:%.*]] = lshr i64 [[TMP138]], 32
2262 ; CHECK-NEXT:    [[TMP141:%.*]] = trunc i64 [[TMP140]] to i32
2263 ; CHECK-NEXT:    [[TMP142:%.*]] = mul i32 [[TMP141]], [[TMP122]]
2264 ; CHECK-NEXT:    [[TMP143:%.*]] = sub i32 [[TMP121]], [[TMP142]]
2265 ; CHECK-NEXT:    [[TMP144:%.*]] = icmp uge i32 [[TMP143]], [[TMP122]]
2266 ; CHECK-NEXT:    [[TMP145:%.*]] = sub i32 [[TMP143]], [[TMP122]]
2267 ; CHECK-NEXT:    [[TMP146:%.*]] = select i1 [[TMP144]], i32 [[TMP145]], i32 [[TMP143]]
2268 ; CHECK-NEXT:    [[TMP147:%.*]] = icmp uge i32 [[TMP146]], [[TMP122]]
2269 ; CHECK-NEXT:    [[TMP148:%.*]] = sub i32 [[TMP146]], [[TMP122]]
2270 ; CHECK-NEXT:    [[TMP149:%.*]] = select i1 [[TMP147]], i32 [[TMP148]], i32 [[TMP146]]
2271 ; CHECK-NEXT:    [[TMP150:%.*]] = xor i32 [[TMP149]], [[TMP117]]
2272 ; CHECK-NEXT:    [[TMP151:%.*]] = sub i32 [[TMP150]], [[TMP117]]
2273 ; CHECK-NEXT:    [[TMP152:%.*]] = insertelement <4 x i32> [[TMP114]], i32 [[TMP151]], i64 3
2274 ; CHECK-NEXT:    store <4 x i32> [[TMP152]], ptr addrspace(1) [[OUT:%.*]], align 16
2275 ; CHECK-NEXT:    ret void
2277 ; GFX6-LABEL: srem_v4i32:
2278 ; GFX6:       ; %bb.0:
2279 ; GFX6-NEXT:    s_load_dwordx8 s[4:11], s[0:1], 0xd
2280 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
2281 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
2282 ; GFX6-NEXT:    s_ashr_i32 s2, s8, 31
2283 ; GFX6-NEXT:    s_add_i32 s3, s8, s2
2284 ; GFX6-NEXT:    s_xor_b32 s2, s3, s2
2285 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v0, s2
2286 ; GFX6-NEXT:    s_sub_i32 s3, 0, s2
2287 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v0, v0
2288 ; GFX6-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
2289 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v0, v0
2290 ; GFX6-NEXT:    v_mul_lo_u32 v1, s3, v0
2291 ; GFX6-NEXT:    s_ashr_i32 s3, s4, 31
2292 ; GFX6-NEXT:    s_add_i32 s4, s4, s3
2293 ; GFX6-NEXT:    s_xor_b32 s4, s4, s3
2294 ; GFX6-NEXT:    v_mul_hi_u32 v1, v0, v1
2295 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, v0, v1
2296 ; GFX6-NEXT:    v_mul_hi_u32 v0, s4, v0
2297 ; GFX6-NEXT:    v_readfirstlane_b32 s8, v0
2298 ; GFX6-NEXT:    s_mul_i32 s8, s8, s2
2299 ; GFX6-NEXT:    s_sub_i32 s4, s4, s8
2300 ; GFX6-NEXT:    s_sub_i32 s8, s4, s2
2301 ; GFX6-NEXT:    s_cmp_ge_u32 s4, s2
2302 ; GFX6-NEXT:    s_cselect_b32 s4, s8, s4
2303 ; GFX6-NEXT:    s_sub_i32 s8, s4, s2
2304 ; GFX6-NEXT:    s_cmp_ge_u32 s4, s2
2305 ; GFX6-NEXT:    s_cselect_b32 s2, s8, s4
2306 ; GFX6-NEXT:    s_ashr_i32 s4, s9, 31
2307 ; GFX6-NEXT:    s_add_i32 s8, s9, s4
2308 ; GFX6-NEXT:    s_xor_b32 s4, s8, s4
2309 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v0, s4
2310 ; GFX6-NEXT:    s_sub_i32 s8, 0, s4
2311 ; GFX6-NEXT:    s_xor_b32 s2, s2, s3
2312 ; GFX6-NEXT:    s_sub_i32 s9, s2, s3
2313 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v0, v0
2314 ; GFX6-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
2315 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v0, v0
2316 ; GFX6-NEXT:    v_mul_lo_u32 v1, s8, v0
2317 ; GFX6-NEXT:    s_ashr_i32 s8, s5, 31
2318 ; GFX6-NEXT:    s_add_i32 s5, s5, s8
2319 ; GFX6-NEXT:    s_xor_b32 s5, s5, s8
2320 ; GFX6-NEXT:    v_mul_hi_u32 v1, v0, v1
2321 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, v0, v1
2322 ; GFX6-NEXT:    v_mul_hi_u32 v0, s5, v0
2323 ; GFX6-NEXT:    v_readfirstlane_b32 s2, v0
2324 ; GFX6-NEXT:    s_mul_i32 s2, s2, s4
2325 ; GFX6-NEXT:    s_sub_i32 s2, s5, s2
2326 ; GFX6-NEXT:    s_sub_i32 s3, s2, s4
2327 ; GFX6-NEXT:    s_cmp_ge_u32 s2, s4
2328 ; GFX6-NEXT:    s_cselect_b32 s2, s3, s2
2329 ; GFX6-NEXT:    s_sub_i32 s3, s2, s4
2330 ; GFX6-NEXT:    s_cmp_ge_u32 s2, s4
2331 ; GFX6-NEXT:    s_cselect_b32 s2, s3, s2
2332 ; GFX6-NEXT:    s_ashr_i32 s3, s10, 31
2333 ; GFX6-NEXT:    s_add_i32 s4, s10, s3
2334 ; GFX6-NEXT:    s_xor_b32 s3, s4, s3
2335 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v0, s3
2336 ; GFX6-NEXT:    s_sub_i32 s4, 0, s3
2337 ; GFX6-NEXT:    s_xor_b32 s2, s2, s8
2338 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v0, v0
2339 ; GFX6-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
2340 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v0, v0
2341 ; GFX6-NEXT:    v_mul_lo_u32 v1, s4, v0
2342 ; GFX6-NEXT:    s_ashr_i32 s4, s6, 31
2343 ; GFX6-NEXT:    s_add_i32 s5, s6, s4
2344 ; GFX6-NEXT:    s_xor_b32 s5, s5, s4
2345 ; GFX6-NEXT:    v_mul_hi_u32 v1, v0, v1
2346 ; GFX6-NEXT:    s_sub_i32 s6, s2, s8
2347 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, v0, v1
2348 ; GFX6-NEXT:    v_mul_hi_u32 v0, s5, v0
2349 ; GFX6-NEXT:    v_readfirstlane_b32 s2, v0
2350 ; GFX6-NEXT:    s_mul_i32 s2, s2, s3
2351 ; GFX6-NEXT:    s_sub_i32 s2, s5, s2
2352 ; GFX6-NEXT:    s_sub_i32 s5, s2, s3
2353 ; GFX6-NEXT:    s_cmp_ge_u32 s2, s3
2354 ; GFX6-NEXT:    s_cselect_b32 s2, s5, s2
2355 ; GFX6-NEXT:    s_sub_i32 s5, s2, s3
2356 ; GFX6-NEXT:    s_cmp_ge_u32 s2, s3
2357 ; GFX6-NEXT:    s_cselect_b32 s5, s5, s2
2358 ; GFX6-NEXT:    s_ashr_i32 s2, s11, 31
2359 ; GFX6-NEXT:    s_add_i32 s3, s11, s2
2360 ; GFX6-NEXT:    s_xor_b32 s8, s3, s2
2361 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v0, s8
2362 ; GFX6-NEXT:    s_sub_i32 s10, 0, s8
2363 ; GFX6-NEXT:    s_xor_b32 s5, s5, s4
2364 ; GFX6-NEXT:    s_sub_i32 s4, s5, s4
2365 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v0, v0
2366 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
2367 ; GFX6-NEXT:    s_mov_b32 s2, -1
2368 ; GFX6-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
2369 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v1, v0
2370 ; GFX6-NEXT:    v_mov_b32_e32 v0, s9
2371 ; GFX6-NEXT:    s_ashr_i32 s9, s7, 31
2372 ; GFX6-NEXT:    s_add_i32 s7, s7, s9
2373 ; GFX6-NEXT:    v_mul_lo_u32 v2, s10, v1
2374 ; GFX6-NEXT:    s_xor_b32 s7, s7, s9
2375 ; GFX6-NEXT:    v_mul_hi_u32 v2, v1, v2
2376 ; GFX6-NEXT:    v_add_i32_e32 v1, vcc, v1, v2
2377 ; GFX6-NEXT:    v_mul_hi_u32 v2, s7, v1
2378 ; GFX6-NEXT:    v_mov_b32_e32 v1, s6
2379 ; GFX6-NEXT:    v_readfirstlane_b32 s5, v2
2380 ; GFX6-NEXT:    s_mul_i32 s5, s5, s8
2381 ; GFX6-NEXT:    s_sub_i32 s5, s7, s5
2382 ; GFX6-NEXT:    s_sub_i32 s6, s5, s8
2383 ; GFX6-NEXT:    s_cmp_ge_u32 s5, s8
2384 ; GFX6-NEXT:    s_cselect_b32 s5, s6, s5
2385 ; GFX6-NEXT:    s_sub_i32 s6, s5, s8
2386 ; GFX6-NEXT:    s_cmp_ge_u32 s5, s8
2387 ; GFX6-NEXT:    s_cselect_b32 s5, s6, s5
2388 ; GFX6-NEXT:    s_xor_b32 s5, s5, s9
2389 ; GFX6-NEXT:    s_sub_i32 s5, s5, s9
2390 ; GFX6-NEXT:    v_mov_b32_e32 v2, s4
2391 ; GFX6-NEXT:    v_mov_b32_e32 v3, s5
2392 ; GFX6-NEXT:    buffer_store_dwordx4 v[0:3], off, s[0:3], 0
2393 ; GFX6-NEXT:    s_endpgm
2395 ; GFX9-LABEL: srem_v4i32:
2396 ; GFX9:       ; %bb.0:
2397 ; GFX9-NEXT:    s_load_dwordx8 s[4:11], s[0:1], 0x34
2398 ; GFX9-NEXT:    v_mov_b32_e32 v4, 0
2399 ; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
2400 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2401 ; GFX9-NEXT:    s_ashr_i32 s2, s8, 31
2402 ; GFX9-NEXT:    s_add_i32 s3, s8, s2
2403 ; GFX9-NEXT:    s_xor_b32 s2, s3, s2
2404 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v0, s2
2405 ; GFX9-NEXT:    s_sub_i32 s8, 0, s2
2406 ; GFX9-NEXT:    s_ashr_i32 s3, s4, 31
2407 ; GFX9-NEXT:    s_add_i32 s4, s4, s3
2408 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v0, v0
2409 ; GFX9-NEXT:    s_xor_b32 s4, s4, s3
2410 ; GFX9-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
2411 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v0, v0
2412 ; GFX9-NEXT:    v_readfirstlane_b32 s12, v0
2413 ; GFX9-NEXT:    s_mul_i32 s8, s8, s12
2414 ; GFX9-NEXT:    s_mul_hi_u32 s8, s12, s8
2415 ; GFX9-NEXT:    s_add_i32 s12, s12, s8
2416 ; GFX9-NEXT:    s_mul_hi_u32 s8, s4, s12
2417 ; GFX9-NEXT:    s_mul_i32 s8, s8, s2
2418 ; GFX9-NEXT:    s_sub_i32 s4, s4, s8
2419 ; GFX9-NEXT:    s_sub_i32 s8, s4, s2
2420 ; GFX9-NEXT:    s_cmp_ge_u32 s4, s2
2421 ; GFX9-NEXT:    s_cselect_b32 s4, s8, s4
2422 ; GFX9-NEXT:    s_sub_i32 s8, s4, s2
2423 ; GFX9-NEXT:    s_cmp_ge_u32 s4, s2
2424 ; GFX9-NEXT:    s_cselect_b32 s2, s8, s4
2425 ; GFX9-NEXT:    s_ashr_i32 s4, s9, 31
2426 ; GFX9-NEXT:    s_add_i32 s8, s9, s4
2427 ; GFX9-NEXT:    s_xor_b32 s4, s8, s4
2428 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v0, s4
2429 ; GFX9-NEXT:    s_ashr_i32 s8, s5, 31
2430 ; GFX9-NEXT:    s_xor_b32 s2, s2, s3
2431 ; GFX9-NEXT:    s_add_i32 s5, s5, s8
2432 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v0, v0
2433 ; GFX9-NEXT:    s_sub_i32 s2, s2, s3
2434 ; GFX9-NEXT:    s_xor_b32 s3, s5, s8
2435 ; GFX9-NEXT:    s_sub_i32 s5, 0, s4
2436 ; GFX9-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
2437 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v0, v0
2438 ; GFX9-NEXT:    v_readfirstlane_b32 s9, v0
2439 ; GFX9-NEXT:    s_mul_i32 s5, s5, s9
2440 ; GFX9-NEXT:    s_mul_hi_u32 s5, s9, s5
2441 ; GFX9-NEXT:    s_add_i32 s9, s9, s5
2442 ; GFX9-NEXT:    s_mul_hi_u32 s5, s3, s9
2443 ; GFX9-NEXT:    s_mul_i32 s5, s5, s4
2444 ; GFX9-NEXT:    s_sub_i32 s3, s3, s5
2445 ; GFX9-NEXT:    s_sub_i32 s5, s3, s4
2446 ; GFX9-NEXT:    s_cmp_ge_u32 s3, s4
2447 ; GFX9-NEXT:    s_cselect_b32 s3, s5, s3
2448 ; GFX9-NEXT:    s_sub_i32 s5, s3, s4
2449 ; GFX9-NEXT:    s_cmp_ge_u32 s3, s4
2450 ; GFX9-NEXT:    s_cselect_b32 s3, s5, s3
2451 ; GFX9-NEXT:    s_ashr_i32 s4, s10, 31
2452 ; GFX9-NEXT:    s_add_i32 s5, s10, s4
2453 ; GFX9-NEXT:    s_xor_b32 s4, s5, s4
2454 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v0, s4
2455 ; GFX9-NEXT:    s_xor_b32 s3, s3, s8
2456 ; GFX9-NEXT:    s_sub_i32 s3, s3, s8
2457 ; GFX9-NEXT:    s_sub_i32 s8, 0, s4
2458 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v0, v0
2459 ; GFX9-NEXT:    s_ashr_i32 s5, s6, 31
2460 ; GFX9-NEXT:    s_add_i32 s6, s6, s5
2461 ; GFX9-NEXT:    s_xor_b32 s6, s6, s5
2462 ; GFX9-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
2463 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v0, v0
2464 ; GFX9-NEXT:    v_mov_b32_e32 v1, s3
2465 ; GFX9-NEXT:    v_readfirstlane_b32 s9, v0
2466 ; GFX9-NEXT:    s_mul_i32 s8, s8, s9
2467 ; GFX9-NEXT:    s_mul_hi_u32 s8, s9, s8
2468 ; GFX9-NEXT:    s_add_i32 s9, s9, s8
2469 ; GFX9-NEXT:    s_mul_hi_u32 s8, s6, s9
2470 ; GFX9-NEXT:    s_mul_i32 s8, s8, s4
2471 ; GFX9-NEXT:    s_sub_i32 s6, s6, s8
2472 ; GFX9-NEXT:    s_sub_i32 s8, s6, s4
2473 ; GFX9-NEXT:    s_cmp_ge_u32 s6, s4
2474 ; GFX9-NEXT:    s_cselect_b32 s6, s8, s6
2475 ; GFX9-NEXT:    s_sub_i32 s8, s6, s4
2476 ; GFX9-NEXT:    s_cmp_ge_u32 s6, s4
2477 ; GFX9-NEXT:    s_cselect_b32 s4, s8, s6
2478 ; GFX9-NEXT:    s_ashr_i32 s6, s11, 31
2479 ; GFX9-NEXT:    s_add_i32 s8, s11, s6
2480 ; GFX9-NEXT:    s_xor_b32 s6, s8, s6
2481 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v2, s6
2482 ; GFX9-NEXT:    v_mov_b32_e32 v0, s2
2483 ; GFX9-NEXT:    s_ashr_i32 s2, s7, 31
2484 ; GFX9-NEXT:    s_xor_b32 s3, s4, s5
2485 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v2, v2
2486 ; GFX9-NEXT:    s_add_i32 s4, s7, s2
2487 ; GFX9-NEXT:    s_sub_i32 s3, s3, s5
2488 ; GFX9-NEXT:    s_sub_i32 s5, 0, s6
2489 ; GFX9-NEXT:    v_mul_f32_e32 v2, 0x4f7ffffe, v2
2490 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v2, v2
2491 ; GFX9-NEXT:    s_xor_b32 s4, s4, s2
2492 ; GFX9-NEXT:    v_readfirstlane_b32 s7, v2
2493 ; GFX9-NEXT:    s_mul_i32 s5, s5, s7
2494 ; GFX9-NEXT:    s_mul_hi_u32 s5, s7, s5
2495 ; GFX9-NEXT:    s_add_i32 s7, s7, s5
2496 ; GFX9-NEXT:    s_mul_hi_u32 s5, s4, s7
2497 ; GFX9-NEXT:    s_mul_i32 s5, s5, s6
2498 ; GFX9-NEXT:    s_sub_i32 s4, s4, s5
2499 ; GFX9-NEXT:    s_sub_i32 s5, s4, s6
2500 ; GFX9-NEXT:    s_cmp_ge_u32 s4, s6
2501 ; GFX9-NEXT:    s_cselect_b32 s4, s5, s4
2502 ; GFX9-NEXT:    s_sub_i32 s5, s4, s6
2503 ; GFX9-NEXT:    s_cmp_ge_u32 s4, s6
2504 ; GFX9-NEXT:    s_cselect_b32 s4, s5, s4
2505 ; GFX9-NEXT:    s_xor_b32 s4, s4, s2
2506 ; GFX9-NEXT:    s_sub_i32 s2, s4, s2
2507 ; GFX9-NEXT:    v_mov_b32_e32 v2, s3
2508 ; GFX9-NEXT:    v_mov_b32_e32 v3, s2
2509 ; GFX9-NEXT:    global_store_dwordx4 v4, v[0:3], s[0:1]
2510 ; GFX9-NEXT:    s_endpgm
2511   %r = srem <4 x i32> %x, %y
2512   store <4 x i32> %r, ptr addrspace(1) %out
2513   ret void
2516 define amdgpu_kernel void @udiv_v4i16(ptr addrspace(1) %out, <4 x i16> %x, <4 x i16> %y) {
2517 ; CHECK-LABEL: @udiv_v4i16(
2518 ; CHECK-NEXT:    [[TMP1:%.*]] = extractelement <4 x i16> [[X:%.*]], i64 0
2519 ; CHECK-NEXT:    [[TMP2:%.*]] = extractelement <4 x i16> [[Y:%.*]], i64 0
2520 ; CHECK-NEXT:    [[TMP3:%.*]] = zext i16 [[TMP1]] to i32
2521 ; CHECK-NEXT:    [[TMP4:%.*]] = zext i16 [[TMP2]] to i32
2522 ; CHECK-NEXT:    [[TMP5:%.*]] = uitofp i32 [[TMP3]] to float
2523 ; CHECK-NEXT:    [[TMP6:%.*]] = uitofp i32 [[TMP4]] to float
2524 ; CHECK-NEXT:    [[TMP7:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP6]])
2525 ; CHECK-NEXT:    [[TMP8:%.*]] = fmul fast float [[TMP5]], [[TMP7]]
2526 ; CHECK-NEXT:    [[TMP9:%.*]] = call fast float @llvm.trunc.f32(float [[TMP8]])
2527 ; CHECK-NEXT:    [[TMP10:%.*]] = fneg fast float [[TMP9]]
2528 ; CHECK-NEXT:    [[TMP11:%.*]] = call fast float @llvm.amdgcn.fmad.ftz.f32(float [[TMP10]], float [[TMP6]], float [[TMP5]])
2529 ; CHECK-NEXT:    [[TMP12:%.*]] = fptoui float [[TMP9]] to i32
2530 ; CHECK-NEXT:    [[TMP13:%.*]] = call fast float @llvm.fabs.f32(float [[TMP11]])
2531 ; CHECK-NEXT:    [[TMP14:%.*]] = call fast float @llvm.fabs.f32(float [[TMP6]])
2532 ; CHECK-NEXT:    [[TMP15:%.*]] = fcmp fast oge float [[TMP13]], [[TMP14]]
2533 ; CHECK-NEXT:    [[TMP16:%.*]] = select i1 [[TMP15]], i32 1, i32 0
2534 ; CHECK-NEXT:    [[TMP17:%.*]] = add i32 [[TMP12]], [[TMP16]]
2535 ; CHECK-NEXT:    [[TMP18:%.*]] = and i32 [[TMP17]], 65535
2536 ; CHECK-NEXT:    [[TMP19:%.*]] = trunc i32 [[TMP18]] to i16
2537 ; CHECK-NEXT:    [[TMP20:%.*]] = insertelement <4 x i16> poison, i16 [[TMP19]], i64 0
2538 ; CHECK-NEXT:    [[TMP21:%.*]] = extractelement <4 x i16> [[X]], i64 1
2539 ; CHECK-NEXT:    [[TMP22:%.*]] = extractelement <4 x i16> [[Y]], i64 1
2540 ; CHECK-NEXT:    [[TMP23:%.*]] = zext i16 [[TMP21]] to i32
2541 ; CHECK-NEXT:    [[TMP24:%.*]] = zext i16 [[TMP22]] to i32
2542 ; CHECK-NEXT:    [[TMP25:%.*]] = uitofp i32 [[TMP23]] to float
2543 ; CHECK-NEXT:    [[TMP26:%.*]] = uitofp i32 [[TMP24]] to float
2544 ; CHECK-NEXT:    [[TMP27:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP26]])
2545 ; CHECK-NEXT:    [[TMP28:%.*]] = fmul fast float [[TMP25]], [[TMP27]]
2546 ; CHECK-NEXT:    [[TMP29:%.*]] = call fast float @llvm.trunc.f32(float [[TMP28]])
2547 ; CHECK-NEXT:    [[TMP30:%.*]] = fneg fast float [[TMP29]]
2548 ; CHECK-NEXT:    [[TMP31:%.*]] = call fast float @llvm.amdgcn.fmad.ftz.f32(float [[TMP30]], float [[TMP26]], float [[TMP25]])
2549 ; CHECK-NEXT:    [[TMP32:%.*]] = fptoui float [[TMP29]] to i32
2550 ; CHECK-NEXT:    [[TMP33:%.*]] = call fast float @llvm.fabs.f32(float [[TMP31]])
2551 ; CHECK-NEXT:    [[TMP34:%.*]] = call fast float @llvm.fabs.f32(float [[TMP26]])
2552 ; CHECK-NEXT:    [[TMP35:%.*]] = fcmp fast oge float [[TMP33]], [[TMP34]]
2553 ; CHECK-NEXT:    [[TMP36:%.*]] = select i1 [[TMP35]], i32 1, i32 0
2554 ; CHECK-NEXT:    [[TMP37:%.*]] = add i32 [[TMP32]], [[TMP36]]
2555 ; CHECK-NEXT:    [[TMP38:%.*]] = and i32 [[TMP37]], 65535
2556 ; CHECK-NEXT:    [[TMP39:%.*]] = trunc i32 [[TMP38]] to i16
2557 ; CHECK-NEXT:    [[TMP40:%.*]] = insertelement <4 x i16> [[TMP20]], i16 [[TMP39]], i64 1
2558 ; CHECK-NEXT:    [[TMP41:%.*]] = extractelement <4 x i16> [[X]], i64 2
2559 ; CHECK-NEXT:    [[TMP42:%.*]] = extractelement <4 x i16> [[Y]], i64 2
2560 ; CHECK-NEXT:    [[TMP43:%.*]] = zext i16 [[TMP41]] to i32
2561 ; CHECK-NEXT:    [[TMP44:%.*]] = zext i16 [[TMP42]] to i32
2562 ; CHECK-NEXT:    [[TMP45:%.*]] = uitofp i32 [[TMP43]] to float
2563 ; CHECK-NEXT:    [[TMP46:%.*]] = uitofp i32 [[TMP44]] to float
2564 ; CHECK-NEXT:    [[TMP47:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP46]])
2565 ; CHECK-NEXT:    [[TMP48:%.*]] = fmul fast float [[TMP45]], [[TMP47]]
2566 ; CHECK-NEXT:    [[TMP49:%.*]] = call fast float @llvm.trunc.f32(float [[TMP48]])
2567 ; CHECK-NEXT:    [[TMP50:%.*]] = fneg fast float [[TMP49]]
2568 ; CHECK-NEXT:    [[TMP51:%.*]] = call fast float @llvm.amdgcn.fmad.ftz.f32(float [[TMP50]], float [[TMP46]], float [[TMP45]])
2569 ; CHECK-NEXT:    [[TMP52:%.*]] = fptoui float [[TMP49]] to i32
2570 ; CHECK-NEXT:    [[TMP53:%.*]] = call fast float @llvm.fabs.f32(float [[TMP51]])
2571 ; CHECK-NEXT:    [[TMP54:%.*]] = call fast float @llvm.fabs.f32(float [[TMP46]])
2572 ; CHECK-NEXT:    [[TMP55:%.*]] = fcmp fast oge float [[TMP53]], [[TMP54]]
2573 ; CHECK-NEXT:    [[TMP56:%.*]] = select i1 [[TMP55]], i32 1, i32 0
2574 ; CHECK-NEXT:    [[TMP57:%.*]] = add i32 [[TMP52]], [[TMP56]]
2575 ; CHECK-NEXT:    [[TMP58:%.*]] = and i32 [[TMP57]], 65535
2576 ; CHECK-NEXT:    [[TMP59:%.*]] = trunc i32 [[TMP58]] to i16
2577 ; CHECK-NEXT:    [[TMP60:%.*]] = insertelement <4 x i16> [[TMP40]], i16 [[TMP59]], i64 2
2578 ; CHECK-NEXT:    [[TMP61:%.*]] = extractelement <4 x i16> [[X]], i64 3
2579 ; CHECK-NEXT:    [[TMP62:%.*]] = extractelement <4 x i16> [[Y]], i64 3
2580 ; CHECK-NEXT:    [[TMP63:%.*]] = zext i16 [[TMP61]] to i32
2581 ; CHECK-NEXT:    [[TMP64:%.*]] = zext i16 [[TMP62]] to i32
2582 ; CHECK-NEXT:    [[TMP65:%.*]] = uitofp i32 [[TMP63]] to float
2583 ; CHECK-NEXT:    [[TMP66:%.*]] = uitofp i32 [[TMP64]] to float
2584 ; CHECK-NEXT:    [[TMP67:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP66]])
2585 ; CHECK-NEXT:    [[TMP68:%.*]] = fmul fast float [[TMP65]], [[TMP67]]
2586 ; CHECK-NEXT:    [[TMP69:%.*]] = call fast float @llvm.trunc.f32(float [[TMP68]])
2587 ; CHECK-NEXT:    [[TMP70:%.*]] = fneg fast float [[TMP69]]
2588 ; CHECK-NEXT:    [[TMP71:%.*]] = call fast float @llvm.amdgcn.fmad.ftz.f32(float [[TMP70]], float [[TMP66]], float [[TMP65]])
2589 ; CHECK-NEXT:    [[TMP72:%.*]] = fptoui float [[TMP69]] to i32
2590 ; CHECK-NEXT:    [[TMP73:%.*]] = call fast float @llvm.fabs.f32(float [[TMP71]])
2591 ; CHECK-NEXT:    [[TMP74:%.*]] = call fast float @llvm.fabs.f32(float [[TMP66]])
2592 ; CHECK-NEXT:    [[TMP75:%.*]] = fcmp fast oge float [[TMP73]], [[TMP74]]
2593 ; CHECK-NEXT:    [[TMP76:%.*]] = select i1 [[TMP75]], i32 1, i32 0
2594 ; CHECK-NEXT:    [[TMP77:%.*]] = add i32 [[TMP72]], [[TMP76]]
2595 ; CHECK-NEXT:    [[TMP78:%.*]] = and i32 [[TMP77]], 65535
2596 ; CHECK-NEXT:    [[TMP79:%.*]] = trunc i32 [[TMP78]] to i16
2597 ; CHECK-NEXT:    [[TMP80:%.*]] = insertelement <4 x i16> [[TMP60]], i16 [[TMP79]], i64 3
2598 ; CHECK-NEXT:    store <4 x i16> [[TMP80]], ptr addrspace(1) [[OUT:%.*]], align 8
2599 ; CHECK-NEXT:    ret void
2601 ; GFX6-LABEL: udiv_v4i16:
2602 ; GFX6:       ; %bb.0:
2603 ; GFX6-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0xb
2604 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
2605 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
2606 ; GFX6-NEXT:    s_mov_b32 s2, -1
2607 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
2608 ; GFX6-NEXT:    s_and_b32 s9, s6, 0xffff
2609 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v0, s9
2610 ; GFX6-NEXT:    s_lshr_b32 s6, s6, 16
2611 ; GFX6-NEXT:    s_and_b32 s8, s4, 0xffff
2612 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v2, s6
2613 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v1, s8
2614 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v3, v0
2615 ; GFX6-NEXT:    s_lshr_b32 s4, s4, 16
2616 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v4, s4
2617 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v5, v2
2618 ; GFX6-NEXT:    v_mul_f32_e32 v3, v1, v3
2619 ; GFX6-NEXT:    v_trunc_f32_e32 v3, v3
2620 ; GFX6-NEXT:    v_mad_f32 v1, -v3, v0, v1
2621 ; GFX6-NEXT:    v_cmp_ge_f32_e64 vcc, |v1|, v0
2622 ; GFX6-NEXT:    v_mul_f32_e32 v1, v4, v5
2623 ; GFX6-NEXT:    v_trunc_f32_e32 v1, v1
2624 ; GFX6-NEXT:    s_and_b32 s4, s7, 0xffff
2625 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v6, v3
2626 ; GFX6-NEXT:    v_mad_f32 v3, -v1, v2, v4
2627 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v4, s4
2628 ; GFX6-NEXT:    s_and_b32 s4, s5, 0xffff
2629 ; GFX6-NEXT:    v_addc_u32_e32 v0, vcc, 0, v6, vcc
2630 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v1, v1
2631 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v5, s4
2632 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v6, v4
2633 ; GFX6-NEXT:    v_cmp_ge_f32_e64 vcc, |v3|, v2
2634 ; GFX6-NEXT:    v_addc_u32_e32 v2, vcc, 0, v1, vcc
2635 ; GFX6-NEXT:    v_mul_f32_e32 v1, v5, v6
2636 ; GFX6-NEXT:    v_trunc_f32_e32 v1, v1
2637 ; GFX6-NEXT:    s_lshr_b32 s4, s7, 16
2638 ; GFX6-NEXT:    v_mad_f32 v3, -v1, v4, v5
2639 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v5, s4
2640 ; GFX6-NEXT:    s_lshr_b32 s4, s5, 16
2641 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v6, s4
2642 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v1, v1
2643 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v7, v5
2644 ; GFX6-NEXT:    v_cmp_ge_f32_e64 vcc, |v3|, v4
2645 ; GFX6-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
2646 ; GFX6-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2647 ; GFX6-NEXT:    v_mul_f32_e32 v3, v6, v7
2648 ; GFX6-NEXT:    v_trunc_f32_e32 v3, v3
2649 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v4, v3
2650 ; GFX6-NEXT:    v_mad_f32 v3, -v3, v5, v6
2651 ; GFX6-NEXT:    v_cmp_ge_f32_e64 vcc, |v3|, v5
2652 ; GFX6-NEXT:    v_and_b32_e32 v1, 0xffff, v1
2653 ; GFX6-NEXT:    v_addc_u32_e32 v3, vcc, 0, v4, vcc
2654 ; GFX6-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
2655 ; GFX6-NEXT:    v_and_b32_e32 v0, 0xffff, v0
2656 ; GFX6-NEXT:    v_or_b32_e32 v1, v1, v3
2657 ; GFX6-NEXT:    v_or_b32_e32 v0, v0, v2
2658 ; GFX6-NEXT:    buffer_store_dwordx2 v[0:1], off, s[0:3], 0
2659 ; GFX6-NEXT:    s_endpgm
2661 ; GFX9-LABEL: udiv_v4i16:
2662 ; GFX9:       ; %bb.0:
2663 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x2c
2664 ; GFX9-NEXT:    v_mov_b32_e32 v6, 0
2665 ; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
2666 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2667 ; GFX9-NEXT:    s_and_b32 s3, s6, 0xffff
2668 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v0, s3
2669 ; GFX9-NEXT:    s_and_b32 s2, s4, 0xffff
2670 ; GFX9-NEXT:    s_lshr_b32 s6, s6, 16
2671 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v2, s2
2672 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v4, v0
2673 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v1, s6
2674 ; GFX9-NEXT:    s_lshr_b32 s4, s4, 16
2675 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v3, s4
2676 ; GFX9-NEXT:    v_mul_f32_e32 v4, v2, v4
2677 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v5, v1
2678 ; GFX9-NEXT:    v_trunc_f32_e32 v4, v4
2679 ; GFX9-NEXT:    s_and_b32 s2, s7, 0xffff
2680 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v7, v4
2681 ; GFX9-NEXT:    v_mad_f32 v2, -v4, v0, v2
2682 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v4, s2
2683 ; GFX9-NEXT:    v_mul_f32_e32 v5, v3, v5
2684 ; GFX9-NEXT:    v_cmp_ge_f32_e64 vcc, |v2|, v0
2685 ; GFX9-NEXT:    s_and_b32 s2, s5, 0xffff
2686 ; GFX9-NEXT:    v_addc_co_u32_e32 v0, vcc, 0, v7, vcc
2687 ; GFX9-NEXT:    v_trunc_f32_e32 v2, v5
2688 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v5, s2
2689 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v7, v4
2690 ; GFX9-NEXT:    v_mad_f32 v3, -v2, v1, v3
2691 ; GFX9-NEXT:    v_cmp_ge_f32_e64 vcc, |v3|, v1
2692 ; GFX9-NEXT:    s_lshr_b32 s2, s7, 16
2693 ; GFX9-NEXT:    v_mul_f32_e32 v1, v5, v7
2694 ; GFX9-NEXT:    v_trunc_f32_e32 v1, v1
2695 ; GFX9-NEXT:    v_mad_f32 v3, -v1, v4, v5
2696 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v5, s2
2697 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v2, v2
2698 ; GFX9-NEXT:    s_lshr_b32 s2, s5, 16
2699 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v7, s2
2700 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v8, v5
2701 ; GFX9-NEXT:    v_addc_co_u32_e32 v2, vcc, 0, v2, vcc
2702 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v1, v1
2703 ; GFX9-NEXT:    v_cmp_ge_f32_e64 vcc, |v3|, v4
2704 ; GFX9-NEXT:    v_mul_f32_e32 v3, v7, v8
2705 ; GFX9-NEXT:    v_trunc_f32_e32 v3, v3
2706 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v4, v3
2707 ; GFX9-NEXT:    v_addc_co_u32_e32 v1, vcc, 0, v1, vcc
2708 ; GFX9-NEXT:    v_mad_f32 v3, -v3, v5, v7
2709 ; GFX9-NEXT:    v_cmp_ge_f32_e64 vcc, |v3|, v5
2710 ; GFX9-NEXT:    v_addc_co_u32_e32 v3, vcc, 0, v4, vcc
2711 ; GFX9-NEXT:    v_and_b32_e32 v1, 0xffff, v1
2712 ; GFX9-NEXT:    v_and_b32_e32 v0, 0xffff, v0
2713 ; GFX9-NEXT:    v_lshl_or_b32 v1, v3, 16, v1
2714 ; GFX9-NEXT:    v_lshl_or_b32 v0, v2, 16, v0
2715 ; GFX9-NEXT:    global_store_dwordx2 v6, v[0:1], s[0:1]
2716 ; GFX9-NEXT:    s_endpgm
2717   %r = udiv <4 x i16> %x, %y
2718   store <4 x i16> %r, ptr addrspace(1) %out
2719   ret void
2722 define amdgpu_kernel void @urem_v4i16(ptr addrspace(1) %out, <4 x i16> %x, <4 x i16> %y) {
2723 ; CHECK-LABEL: @urem_v4i16(
2724 ; CHECK-NEXT:    [[TMP1:%.*]] = extractelement <4 x i16> [[X:%.*]], i64 0
2725 ; CHECK-NEXT:    [[TMP2:%.*]] = extractelement <4 x i16> [[Y:%.*]], i64 0
2726 ; CHECK-NEXT:    [[TMP3:%.*]] = zext i16 [[TMP1]] to i32
2727 ; CHECK-NEXT:    [[TMP4:%.*]] = zext i16 [[TMP2]] to i32
2728 ; CHECK-NEXT:    [[TMP5:%.*]] = uitofp i32 [[TMP3]] to float
2729 ; CHECK-NEXT:    [[TMP6:%.*]] = uitofp i32 [[TMP4]] to float
2730 ; CHECK-NEXT:    [[TMP7:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP6]])
2731 ; CHECK-NEXT:    [[TMP8:%.*]] = fmul fast float [[TMP5]], [[TMP7]]
2732 ; CHECK-NEXT:    [[TMP9:%.*]] = call fast float @llvm.trunc.f32(float [[TMP8]])
2733 ; CHECK-NEXT:    [[TMP10:%.*]] = fneg fast float [[TMP9]]
2734 ; CHECK-NEXT:    [[TMP11:%.*]] = call fast float @llvm.amdgcn.fmad.ftz.f32(float [[TMP10]], float [[TMP6]], float [[TMP5]])
2735 ; CHECK-NEXT:    [[TMP12:%.*]] = fptoui float [[TMP9]] to i32
2736 ; CHECK-NEXT:    [[TMP13:%.*]] = call fast float @llvm.fabs.f32(float [[TMP11]])
2737 ; CHECK-NEXT:    [[TMP14:%.*]] = call fast float @llvm.fabs.f32(float [[TMP6]])
2738 ; CHECK-NEXT:    [[TMP15:%.*]] = fcmp fast oge float [[TMP13]], [[TMP14]]
2739 ; CHECK-NEXT:    [[TMP16:%.*]] = select i1 [[TMP15]], i32 1, i32 0
2740 ; CHECK-NEXT:    [[TMP17:%.*]] = add i32 [[TMP12]], [[TMP16]]
2741 ; CHECK-NEXT:    [[TMP18:%.*]] = mul i32 [[TMP17]], [[TMP4]]
2742 ; CHECK-NEXT:    [[TMP19:%.*]] = sub i32 [[TMP3]], [[TMP18]]
2743 ; CHECK-NEXT:    [[TMP20:%.*]] = and i32 [[TMP19]], 65535
2744 ; CHECK-NEXT:    [[TMP21:%.*]] = trunc i32 [[TMP20]] to i16
2745 ; CHECK-NEXT:    [[TMP22:%.*]] = insertelement <4 x i16> poison, i16 [[TMP21]], i64 0
2746 ; CHECK-NEXT:    [[TMP23:%.*]] = extractelement <4 x i16> [[X]], i64 1
2747 ; CHECK-NEXT:    [[TMP24:%.*]] = extractelement <4 x i16> [[Y]], i64 1
2748 ; CHECK-NEXT:    [[TMP25:%.*]] = zext i16 [[TMP23]] to i32
2749 ; CHECK-NEXT:    [[TMP26:%.*]] = zext i16 [[TMP24]] to i32
2750 ; CHECK-NEXT:    [[TMP27:%.*]] = uitofp i32 [[TMP25]] to float
2751 ; CHECK-NEXT:    [[TMP28:%.*]] = uitofp i32 [[TMP26]] to float
2752 ; CHECK-NEXT:    [[TMP29:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP28]])
2753 ; CHECK-NEXT:    [[TMP30:%.*]] = fmul fast float [[TMP27]], [[TMP29]]
2754 ; CHECK-NEXT:    [[TMP31:%.*]] = call fast float @llvm.trunc.f32(float [[TMP30]])
2755 ; CHECK-NEXT:    [[TMP32:%.*]] = fneg fast float [[TMP31]]
2756 ; CHECK-NEXT:    [[TMP33:%.*]] = call fast float @llvm.amdgcn.fmad.ftz.f32(float [[TMP32]], float [[TMP28]], float [[TMP27]])
2757 ; CHECK-NEXT:    [[TMP34:%.*]] = fptoui float [[TMP31]] to i32
2758 ; CHECK-NEXT:    [[TMP35:%.*]] = call fast float @llvm.fabs.f32(float [[TMP33]])
2759 ; CHECK-NEXT:    [[TMP36:%.*]] = call fast float @llvm.fabs.f32(float [[TMP28]])
2760 ; CHECK-NEXT:    [[TMP37:%.*]] = fcmp fast oge float [[TMP35]], [[TMP36]]
2761 ; CHECK-NEXT:    [[TMP38:%.*]] = select i1 [[TMP37]], i32 1, i32 0
2762 ; CHECK-NEXT:    [[TMP39:%.*]] = add i32 [[TMP34]], [[TMP38]]
2763 ; CHECK-NEXT:    [[TMP40:%.*]] = mul i32 [[TMP39]], [[TMP26]]
2764 ; CHECK-NEXT:    [[TMP41:%.*]] = sub i32 [[TMP25]], [[TMP40]]
2765 ; CHECK-NEXT:    [[TMP42:%.*]] = and i32 [[TMP41]], 65535
2766 ; CHECK-NEXT:    [[TMP43:%.*]] = trunc i32 [[TMP42]] to i16
2767 ; CHECK-NEXT:    [[TMP44:%.*]] = insertelement <4 x i16> [[TMP22]], i16 [[TMP43]], i64 1
2768 ; CHECK-NEXT:    [[TMP45:%.*]] = extractelement <4 x i16> [[X]], i64 2
2769 ; CHECK-NEXT:    [[TMP46:%.*]] = extractelement <4 x i16> [[Y]], i64 2
2770 ; CHECK-NEXT:    [[TMP47:%.*]] = zext i16 [[TMP45]] to i32
2771 ; CHECK-NEXT:    [[TMP48:%.*]] = zext i16 [[TMP46]] to i32
2772 ; CHECK-NEXT:    [[TMP49:%.*]] = uitofp i32 [[TMP47]] to float
2773 ; CHECK-NEXT:    [[TMP50:%.*]] = uitofp i32 [[TMP48]] to float
2774 ; CHECK-NEXT:    [[TMP51:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP50]])
2775 ; CHECK-NEXT:    [[TMP52:%.*]] = fmul fast float [[TMP49]], [[TMP51]]
2776 ; CHECK-NEXT:    [[TMP53:%.*]] = call fast float @llvm.trunc.f32(float [[TMP52]])
2777 ; CHECK-NEXT:    [[TMP54:%.*]] = fneg fast float [[TMP53]]
2778 ; CHECK-NEXT:    [[TMP55:%.*]] = call fast float @llvm.amdgcn.fmad.ftz.f32(float [[TMP54]], float [[TMP50]], float [[TMP49]])
2779 ; CHECK-NEXT:    [[TMP56:%.*]] = fptoui float [[TMP53]] to i32
2780 ; CHECK-NEXT:    [[TMP57:%.*]] = call fast float @llvm.fabs.f32(float [[TMP55]])
2781 ; CHECK-NEXT:    [[TMP58:%.*]] = call fast float @llvm.fabs.f32(float [[TMP50]])
2782 ; CHECK-NEXT:    [[TMP59:%.*]] = fcmp fast oge float [[TMP57]], [[TMP58]]
2783 ; CHECK-NEXT:    [[TMP60:%.*]] = select i1 [[TMP59]], i32 1, i32 0
2784 ; CHECK-NEXT:    [[TMP61:%.*]] = add i32 [[TMP56]], [[TMP60]]
2785 ; CHECK-NEXT:    [[TMP62:%.*]] = mul i32 [[TMP61]], [[TMP48]]
2786 ; CHECK-NEXT:    [[TMP63:%.*]] = sub i32 [[TMP47]], [[TMP62]]
2787 ; CHECK-NEXT:    [[TMP64:%.*]] = and i32 [[TMP63]], 65535
2788 ; CHECK-NEXT:    [[TMP65:%.*]] = trunc i32 [[TMP64]] to i16
2789 ; CHECK-NEXT:    [[TMP66:%.*]] = insertelement <4 x i16> [[TMP44]], i16 [[TMP65]], i64 2
2790 ; CHECK-NEXT:    [[TMP67:%.*]] = extractelement <4 x i16> [[X]], i64 3
2791 ; CHECK-NEXT:    [[TMP68:%.*]] = extractelement <4 x i16> [[Y]], i64 3
2792 ; CHECK-NEXT:    [[TMP69:%.*]] = zext i16 [[TMP67]] to i32
2793 ; CHECK-NEXT:    [[TMP70:%.*]] = zext i16 [[TMP68]] to i32
2794 ; CHECK-NEXT:    [[TMP71:%.*]] = uitofp i32 [[TMP69]] to float
2795 ; CHECK-NEXT:    [[TMP72:%.*]] = uitofp i32 [[TMP70]] to float
2796 ; CHECK-NEXT:    [[TMP73:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP72]])
2797 ; CHECK-NEXT:    [[TMP74:%.*]] = fmul fast float [[TMP71]], [[TMP73]]
2798 ; CHECK-NEXT:    [[TMP75:%.*]] = call fast float @llvm.trunc.f32(float [[TMP74]])
2799 ; CHECK-NEXT:    [[TMP76:%.*]] = fneg fast float [[TMP75]]
2800 ; CHECK-NEXT:    [[TMP77:%.*]] = call fast float @llvm.amdgcn.fmad.ftz.f32(float [[TMP76]], float [[TMP72]], float [[TMP71]])
2801 ; CHECK-NEXT:    [[TMP78:%.*]] = fptoui float [[TMP75]] to i32
2802 ; CHECK-NEXT:    [[TMP79:%.*]] = call fast float @llvm.fabs.f32(float [[TMP77]])
2803 ; CHECK-NEXT:    [[TMP80:%.*]] = call fast float @llvm.fabs.f32(float [[TMP72]])
2804 ; CHECK-NEXT:    [[TMP81:%.*]] = fcmp fast oge float [[TMP79]], [[TMP80]]
2805 ; CHECK-NEXT:    [[TMP82:%.*]] = select i1 [[TMP81]], i32 1, i32 0
2806 ; CHECK-NEXT:    [[TMP83:%.*]] = add i32 [[TMP78]], [[TMP82]]
2807 ; CHECK-NEXT:    [[TMP84:%.*]] = mul i32 [[TMP83]], [[TMP70]]
2808 ; CHECK-NEXT:    [[TMP85:%.*]] = sub i32 [[TMP69]], [[TMP84]]
2809 ; CHECK-NEXT:    [[TMP86:%.*]] = and i32 [[TMP85]], 65535
2810 ; CHECK-NEXT:    [[TMP87:%.*]] = trunc i32 [[TMP86]] to i16
2811 ; CHECK-NEXT:    [[TMP88:%.*]] = insertelement <4 x i16> [[TMP66]], i16 [[TMP87]], i64 3
2812 ; CHECK-NEXT:    store <4 x i16> [[TMP88]], ptr addrspace(1) [[OUT:%.*]], align 8
2813 ; CHECK-NEXT:    ret void
2815 ; GFX6-LABEL: urem_v4i16:
2816 ; GFX6:       ; %bb.0:
2817 ; GFX6-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0xb
2818 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
2819 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
2820 ; GFX6-NEXT:    s_mov_b32 s2, -1
2821 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
2822 ; GFX6-NEXT:    s_and_b32 s9, s6, 0xffff
2823 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v0, s9
2824 ; GFX6-NEXT:    s_and_b32 s8, s4, 0xffff
2825 ; GFX6-NEXT:    s_lshr_b32 s9, s6, 16
2826 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v1, s8
2827 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v3, v0
2828 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v2, s9
2829 ; GFX6-NEXT:    s_lshr_b32 s8, s4, 16
2830 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v4, s8
2831 ; GFX6-NEXT:    v_mul_f32_e32 v3, v1, v3
2832 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v5, v2
2833 ; GFX6-NEXT:    v_trunc_f32_e32 v3, v3
2834 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v6, v3
2835 ; GFX6-NEXT:    v_mad_f32 v1, -v3, v0, v1
2836 ; GFX6-NEXT:    v_cmp_ge_f32_e64 vcc, |v1|, v0
2837 ; GFX6-NEXT:    v_mul_f32_e32 v1, v4, v5
2838 ; GFX6-NEXT:    v_addc_u32_e32 v0, vcc, 0, v6, vcc
2839 ; GFX6-NEXT:    v_trunc_f32_e32 v1, v1
2840 ; GFX6-NEXT:    v_mul_lo_u32 v0, v0, s6
2841 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v3, v1
2842 ; GFX6-NEXT:    v_mad_f32 v1, -v1, v2, v4
2843 ; GFX6-NEXT:    s_and_b32 s6, s7, 0xffff
2844 ; GFX6-NEXT:    v_cmp_ge_f32_e64 vcc, |v1|, v2
2845 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v2, s6
2846 ; GFX6-NEXT:    v_addc_u32_e32 v1, vcc, 0, v3, vcc
2847 ; GFX6-NEXT:    s_and_b32 s6, s5, 0xffff
2848 ; GFX6-NEXT:    v_mul_lo_u32 v1, v1, s9
2849 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v3, s6
2850 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v4, v2
2851 ; GFX6-NEXT:    v_sub_i32_e32 v0, vcc, s4, v0
2852 ; GFX6-NEXT:    s_lshr_b32 s4, s7, 16
2853 ; GFX6-NEXT:    v_sub_i32_e32 v5, vcc, s8, v1
2854 ; GFX6-NEXT:    v_mul_f32_e32 v1, v3, v4
2855 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v4, s4
2856 ; GFX6-NEXT:    s_lshr_b32 s6, s5, 16
2857 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v6, s6
2858 ; GFX6-NEXT:    v_trunc_f32_e32 v1, v1
2859 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v7, v4
2860 ; GFX6-NEXT:    v_mad_f32 v3, -v1, v2, v3
2861 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v1, v1
2862 ; GFX6-NEXT:    v_cmp_ge_f32_e64 vcc, |v3|, v2
2863 ; GFX6-NEXT:    v_mul_f32_e32 v2, v6, v7
2864 ; GFX6-NEXT:    v_trunc_f32_e32 v2, v2
2865 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v3, v2
2866 ; GFX6-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2867 ; GFX6-NEXT:    v_mad_f32 v2, -v2, v4, v6
2868 ; GFX6-NEXT:    v_cmp_ge_f32_e64 vcc, |v2|, v4
2869 ; GFX6-NEXT:    v_addc_u32_e32 v2, vcc, 0, v3, vcc
2870 ; GFX6-NEXT:    v_mul_lo_u32 v1, v1, s7
2871 ; GFX6-NEXT:    v_mul_lo_u32 v2, v2, s4
2872 ; GFX6-NEXT:    v_and_b32_e32 v0, 0xffff, v0
2873 ; GFX6-NEXT:    v_sub_i32_e32 v1, vcc, s5, v1
2874 ; GFX6-NEXT:    v_sub_i32_e32 v2, vcc, s6, v2
2875 ; GFX6-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
2876 ; GFX6-NEXT:    v_and_b32_e32 v1, 0xffff, v1
2877 ; GFX6-NEXT:    v_or_b32_e32 v1, v1, v2
2878 ; GFX6-NEXT:    v_lshlrev_b32_e32 v2, 16, v5
2879 ; GFX6-NEXT:    v_or_b32_e32 v0, v0, v2
2880 ; GFX6-NEXT:    buffer_store_dwordx2 v[0:1], off, s[0:3], 0
2881 ; GFX6-NEXT:    s_endpgm
2883 ; GFX9-LABEL: urem_v4i16:
2884 ; GFX9:       ; %bb.0:
2885 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x2c
2886 ; GFX9-NEXT:    v_mov_b32_e32 v6, 0
2887 ; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
2888 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2889 ; GFX9-NEXT:    s_and_b32 s3, s6, 0xffff
2890 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v0, s3
2891 ; GFX9-NEXT:    s_and_b32 s2, s4, 0xffff
2892 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v2, s2
2893 ; GFX9-NEXT:    s_lshr_b32 s6, s6, 16
2894 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v4, v0
2895 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v1, s6
2896 ; GFX9-NEXT:    s_lshr_b32 s4, s4, 16
2897 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v3, s4
2898 ; GFX9-NEXT:    v_mul_f32_e32 v4, v2, v4
2899 ; GFX9-NEXT:    v_trunc_f32_e32 v4, v4
2900 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v7, v4
2901 ; GFX9-NEXT:    v_mad_f32 v2, -v4, v0, v2
2902 ; GFX9-NEXT:    v_cmp_ge_f32_e64 vcc, |v2|, v0
2903 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v5, v1
2904 ; GFX9-NEXT:    v_addc_co_u32_e32 v0, vcc, 0, v7, vcc
2905 ; GFX9-NEXT:    v_mul_lo_u32 v0, v0, s3
2906 ; GFX9-NEXT:    s_and_b32 s3, s7, 0xffff
2907 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v4, s3
2908 ; GFX9-NEXT:    v_mul_f32_e32 v5, v3, v5
2909 ; GFX9-NEXT:    v_trunc_f32_e32 v2, v5
2910 ; GFX9-NEXT:    s_and_b32 s8, s5, 0xffff
2911 ; GFX9-NEXT:    v_mad_f32 v3, -v2, v1, v3
2912 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v2, v2
2913 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v5, s8
2914 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v7, v4
2915 ; GFX9-NEXT:    v_cmp_ge_f32_e64 vcc, |v3|, v1
2916 ; GFX9-NEXT:    v_addc_co_u32_e32 v1, vcc, 0, v2, vcc
2917 ; GFX9-NEXT:    v_mul_f32_e32 v2, v5, v7
2918 ; GFX9-NEXT:    v_mul_lo_u32 v1, v1, s6
2919 ; GFX9-NEXT:    v_trunc_f32_e32 v2, v2
2920 ; GFX9-NEXT:    s_lshr_b32 s6, s7, 16
2921 ; GFX9-NEXT:    v_mad_f32 v3, -v2, v4, v5
2922 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v5, s6
2923 ; GFX9-NEXT:    s_lshr_b32 s5, s5, 16
2924 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v7, s5
2925 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v2, v2
2926 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v8, v5
2927 ; GFX9-NEXT:    v_cmp_ge_f32_e64 vcc, |v3|, v4
2928 ; GFX9-NEXT:    v_sub_u32_e32 v0, s2, v0
2929 ; GFX9-NEXT:    v_addc_co_u32_e32 v2, vcc, 0, v2, vcc
2930 ; GFX9-NEXT:    v_mul_f32_e32 v3, v7, v8
2931 ; GFX9-NEXT:    v_trunc_f32_e32 v3, v3
2932 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v4, v3
2933 ; GFX9-NEXT:    v_mad_f32 v3, -v3, v5, v7
2934 ; GFX9-NEXT:    v_cmp_ge_f32_e64 vcc, |v3|, v5
2935 ; GFX9-NEXT:    v_mul_lo_u32 v2, v2, s3
2936 ; GFX9-NEXT:    v_addc_co_u32_e32 v3, vcc, 0, v4, vcc
2937 ; GFX9-NEXT:    v_mul_lo_u32 v3, v3, s6
2938 ; GFX9-NEXT:    v_sub_u32_e32 v4, s4, v1
2939 ; GFX9-NEXT:    v_sub_u32_e32 v1, s8, v2
2940 ; GFX9-NEXT:    v_and_b32_e32 v1, 0xffff, v1
2941 ; GFX9-NEXT:    v_sub_u32_e32 v2, s5, v3
2942 ; GFX9-NEXT:    v_and_b32_e32 v0, 0xffff, v0
2943 ; GFX9-NEXT:    v_lshl_or_b32 v1, v2, 16, v1
2944 ; GFX9-NEXT:    v_lshl_or_b32 v0, v4, 16, v0
2945 ; GFX9-NEXT:    global_store_dwordx2 v6, v[0:1], s[0:1]
2946 ; GFX9-NEXT:    s_endpgm
2947   %r = urem <4 x i16> %x, %y
2948   store <4 x i16> %r, ptr addrspace(1) %out
2949   ret void
2952 define amdgpu_kernel void @sdiv_v4i16(ptr addrspace(1) %out, <4 x i16> %x, <4 x i16> %y) {
2953 ; CHECK-LABEL: @sdiv_v4i16(
2954 ; CHECK-NEXT:    [[TMP1:%.*]] = extractelement <4 x i16> [[X:%.*]], i64 0
2955 ; CHECK-NEXT:    [[TMP2:%.*]] = extractelement <4 x i16> [[Y:%.*]], i64 0
2956 ; CHECK-NEXT:    [[TMP3:%.*]] = sext i16 [[TMP1]] to i32
2957 ; CHECK-NEXT:    [[TMP4:%.*]] = sext i16 [[TMP2]] to i32
2958 ; CHECK-NEXT:    [[TMP5:%.*]] = xor i32 [[TMP3]], [[TMP4]]
2959 ; CHECK-NEXT:    [[TMP6:%.*]] = ashr i32 [[TMP5]], 30
2960 ; CHECK-NEXT:    [[TMP7:%.*]] = or i32 [[TMP6]], 1
2961 ; CHECK-NEXT:    [[TMP8:%.*]] = sitofp i32 [[TMP3]] to float
2962 ; CHECK-NEXT:    [[TMP9:%.*]] = sitofp i32 [[TMP4]] to float
2963 ; CHECK-NEXT:    [[TMP10:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP9]])
2964 ; CHECK-NEXT:    [[TMP11:%.*]] = fmul fast float [[TMP8]], [[TMP10]]
2965 ; CHECK-NEXT:    [[TMP12:%.*]] = call fast float @llvm.trunc.f32(float [[TMP11]])
2966 ; CHECK-NEXT:    [[TMP13:%.*]] = fneg fast float [[TMP12]]
2967 ; CHECK-NEXT:    [[TMP14:%.*]] = call fast float @llvm.amdgcn.fmad.ftz.f32(float [[TMP13]], float [[TMP9]], float [[TMP8]])
2968 ; CHECK-NEXT:    [[TMP15:%.*]] = fptosi float [[TMP12]] to i32
2969 ; CHECK-NEXT:    [[TMP16:%.*]] = call fast float @llvm.fabs.f32(float [[TMP14]])
2970 ; CHECK-NEXT:    [[TMP17:%.*]] = call fast float @llvm.fabs.f32(float [[TMP9]])
2971 ; CHECK-NEXT:    [[TMP18:%.*]] = fcmp fast oge float [[TMP16]], [[TMP17]]
2972 ; CHECK-NEXT:    [[TMP19:%.*]] = select i1 [[TMP18]], i32 [[TMP7]], i32 0
2973 ; CHECK-NEXT:    [[TMP20:%.*]] = add i32 [[TMP15]], [[TMP19]]
2974 ; CHECK-NEXT:    [[TMP21:%.*]] = shl i32 [[TMP20]], 16
2975 ; CHECK-NEXT:    [[TMP22:%.*]] = ashr i32 [[TMP21]], 16
2976 ; CHECK-NEXT:    [[TMP23:%.*]] = trunc i32 [[TMP22]] to i16
2977 ; CHECK-NEXT:    [[TMP24:%.*]] = insertelement <4 x i16> poison, i16 [[TMP23]], i64 0
2978 ; CHECK-NEXT:    [[TMP25:%.*]] = extractelement <4 x i16> [[X]], i64 1
2979 ; CHECK-NEXT:    [[TMP26:%.*]] = extractelement <4 x i16> [[Y]], i64 1
2980 ; CHECK-NEXT:    [[TMP27:%.*]] = sext i16 [[TMP25]] to i32
2981 ; CHECK-NEXT:    [[TMP28:%.*]] = sext i16 [[TMP26]] to i32
2982 ; CHECK-NEXT:    [[TMP29:%.*]] = xor i32 [[TMP27]], [[TMP28]]
2983 ; CHECK-NEXT:    [[TMP30:%.*]] = ashr i32 [[TMP29]], 30
2984 ; CHECK-NEXT:    [[TMP31:%.*]] = or i32 [[TMP30]], 1
2985 ; CHECK-NEXT:    [[TMP32:%.*]] = sitofp i32 [[TMP27]] to float
2986 ; CHECK-NEXT:    [[TMP33:%.*]] = sitofp i32 [[TMP28]] to float
2987 ; CHECK-NEXT:    [[TMP34:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP33]])
2988 ; CHECK-NEXT:    [[TMP35:%.*]] = fmul fast float [[TMP32]], [[TMP34]]
2989 ; CHECK-NEXT:    [[TMP36:%.*]] = call fast float @llvm.trunc.f32(float [[TMP35]])
2990 ; CHECK-NEXT:    [[TMP37:%.*]] = fneg fast float [[TMP36]]
2991 ; CHECK-NEXT:    [[TMP38:%.*]] = call fast float @llvm.amdgcn.fmad.ftz.f32(float [[TMP37]], float [[TMP33]], float [[TMP32]])
2992 ; CHECK-NEXT:    [[TMP39:%.*]] = fptosi float [[TMP36]] to i32
2993 ; CHECK-NEXT:    [[TMP40:%.*]] = call fast float @llvm.fabs.f32(float [[TMP38]])
2994 ; CHECK-NEXT:    [[TMP41:%.*]] = call fast float @llvm.fabs.f32(float [[TMP33]])
2995 ; CHECK-NEXT:    [[TMP42:%.*]] = fcmp fast oge float [[TMP40]], [[TMP41]]
2996 ; CHECK-NEXT:    [[TMP43:%.*]] = select i1 [[TMP42]], i32 [[TMP31]], i32 0
2997 ; CHECK-NEXT:    [[TMP44:%.*]] = add i32 [[TMP39]], [[TMP43]]
2998 ; CHECK-NEXT:    [[TMP45:%.*]] = shl i32 [[TMP44]], 16
2999 ; CHECK-NEXT:    [[TMP46:%.*]] = ashr i32 [[TMP45]], 16
3000 ; CHECK-NEXT:    [[TMP47:%.*]] = trunc i32 [[TMP46]] to i16
3001 ; CHECK-NEXT:    [[TMP48:%.*]] = insertelement <4 x i16> [[TMP24]], i16 [[TMP47]], i64 1
3002 ; CHECK-NEXT:    [[TMP49:%.*]] = extractelement <4 x i16> [[X]], i64 2
3003 ; CHECK-NEXT:    [[TMP50:%.*]] = extractelement <4 x i16> [[Y]], i64 2
3004 ; CHECK-NEXT:    [[TMP51:%.*]] = sext i16 [[TMP49]] to i32
3005 ; CHECK-NEXT:    [[TMP52:%.*]] = sext i16 [[TMP50]] to i32
3006 ; CHECK-NEXT:    [[TMP53:%.*]] = xor i32 [[TMP51]], [[TMP52]]
3007 ; CHECK-NEXT:    [[TMP54:%.*]] = ashr i32 [[TMP53]], 30
3008 ; CHECK-NEXT:    [[TMP55:%.*]] = or i32 [[TMP54]], 1
3009 ; CHECK-NEXT:    [[TMP56:%.*]] = sitofp i32 [[TMP51]] to float
3010 ; CHECK-NEXT:    [[TMP57:%.*]] = sitofp i32 [[TMP52]] to float
3011 ; CHECK-NEXT:    [[TMP58:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP57]])
3012 ; CHECK-NEXT:    [[TMP59:%.*]] = fmul fast float [[TMP56]], [[TMP58]]
3013 ; CHECK-NEXT:    [[TMP60:%.*]] = call fast float @llvm.trunc.f32(float [[TMP59]])
3014 ; CHECK-NEXT:    [[TMP61:%.*]] = fneg fast float [[TMP60]]
3015 ; CHECK-NEXT:    [[TMP62:%.*]] = call fast float @llvm.amdgcn.fmad.ftz.f32(float [[TMP61]], float [[TMP57]], float [[TMP56]])
3016 ; CHECK-NEXT:    [[TMP63:%.*]] = fptosi float [[TMP60]] to i32
3017 ; CHECK-NEXT:    [[TMP64:%.*]] = call fast float @llvm.fabs.f32(float [[TMP62]])
3018 ; CHECK-NEXT:    [[TMP65:%.*]] = call fast float @llvm.fabs.f32(float [[TMP57]])
3019 ; CHECK-NEXT:    [[TMP66:%.*]] = fcmp fast oge float [[TMP64]], [[TMP65]]
3020 ; CHECK-NEXT:    [[TMP67:%.*]] = select i1 [[TMP66]], i32 [[TMP55]], i32 0
3021 ; CHECK-NEXT:    [[TMP68:%.*]] = add i32 [[TMP63]], [[TMP67]]
3022 ; CHECK-NEXT:    [[TMP69:%.*]] = shl i32 [[TMP68]], 16
3023 ; CHECK-NEXT:    [[TMP70:%.*]] = ashr i32 [[TMP69]], 16
3024 ; CHECK-NEXT:    [[TMP71:%.*]] = trunc i32 [[TMP70]] to i16
3025 ; CHECK-NEXT:    [[TMP72:%.*]] = insertelement <4 x i16> [[TMP48]], i16 [[TMP71]], i64 2
3026 ; CHECK-NEXT:    [[TMP73:%.*]] = extractelement <4 x i16> [[X]], i64 3
3027 ; CHECK-NEXT:    [[TMP74:%.*]] = extractelement <4 x i16> [[Y]], i64 3
3028 ; CHECK-NEXT:    [[TMP75:%.*]] = sext i16 [[TMP73]] to i32
3029 ; CHECK-NEXT:    [[TMP76:%.*]] = sext i16 [[TMP74]] to i32
3030 ; CHECK-NEXT:    [[TMP77:%.*]] = xor i32 [[TMP75]], [[TMP76]]
3031 ; CHECK-NEXT:    [[TMP78:%.*]] = ashr i32 [[TMP77]], 30
3032 ; CHECK-NEXT:    [[TMP79:%.*]] = or i32 [[TMP78]], 1
3033 ; CHECK-NEXT:    [[TMP80:%.*]] = sitofp i32 [[TMP75]] to float
3034 ; CHECK-NEXT:    [[TMP81:%.*]] = sitofp i32 [[TMP76]] to float
3035 ; CHECK-NEXT:    [[TMP82:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP81]])
3036 ; CHECK-NEXT:    [[TMP83:%.*]] = fmul fast float [[TMP80]], [[TMP82]]
3037 ; CHECK-NEXT:    [[TMP84:%.*]] = call fast float @llvm.trunc.f32(float [[TMP83]])
3038 ; CHECK-NEXT:    [[TMP85:%.*]] = fneg fast float [[TMP84]]
3039 ; CHECK-NEXT:    [[TMP86:%.*]] = call fast float @llvm.amdgcn.fmad.ftz.f32(float [[TMP85]], float [[TMP81]], float [[TMP80]])
3040 ; CHECK-NEXT:    [[TMP87:%.*]] = fptosi float [[TMP84]] to i32
3041 ; CHECK-NEXT:    [[TMP88:%.*]] = call fast float @llvm.fabs.f32(float [[TMP86]])
3042 ; CHECK-NEXT:    [[TMP89:%.*]] = call fast float @llvm.fabs.f32(float [[TMP81]])
3043 ; CHECK-NEXT:    [[TMP90:%.*]] = fcmp fast oge float [[TMP88]], [[TMP89]]
3044 ; CHECK-NEXT:    [[TMP91:%.*]] = select i1 [[TMP90]], i32 [[TMP79]], i32 0
3045 ; CHECK-NEXT:    [[TMP92:%.*]] = add i32 [[TMP87]], [[TMP91]]
3046 ; CHECK-NEXT:    [[TMP93:%.*]] = shl i32 [[TMP92]], 16
3047 ; CHECK-NEXT:    [[TMP94:%.*]] = ashr i32 [[TMP93]], 16
3048 ; CHECK-NEXT:    [[TMP95:%.*]] = trunc i32 [[TMP94]] to i16
3049 ; CHECK-NEXT:    [[TMP96:%.*]] = insertelement <4 x i16> [[TMP72]], i16 [[TMP95]], i64 3
3050 ; CHECK-NEXT:    store <4 x i16> [[TMP96]], ptr addrspace(1) [[OUT:%.*]], align 8
3051 ; CHECK-NEXT:    ret void
3053 ; GFX6-LABEL: sdiv_v4i16:
3054 ; GFX6:       ; %bb.0:
3055 ; GFX6-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0xb
3056 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
3057 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
3058 ; GFX6-NEXT:    s_mov_b32 s2, -1
3059 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
3060 ; GFX6-NEXT:    s_sext_i32_i16 s8, s6
3061 ; GFX6-NEXT:    v_cvt_f32_i32_e32 v0, s8
3062 ; GFX6-NEXT:    s_sext_i32_i16 s9, s4
3063 ; GFX6-NEXT:    v_cvt_f32_i32_e32 v1, s9
3064 ; GFX6-NEXT:    s_xor_b32 s8, s9, s8
3065 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v2, v0
3066 ; GFX6-NEXT:    s_ashr_i32 s8, s8, 30
3067 ; GFX6-NEXT:    s_or_b32 s10, s8, 1
3068 ; GFX6-NEXT:    v_mul_f32_e32 v2, v1, v2
3069 ; GFX6-NEXT:    v_trunc_f32_e32 v2, v2
3070 ; GFX6-NEXT:    v_mad_f32 v1, -v2, v0, v1
3071 ; GFX6-NEXT:    v_cmp_ge_f32_e64 s[8:9], |v1|, |v0|
3072 ; GFX6-NEXT:    s_and_b64 s[8:9], s[8:9], exec
3073 ; GFX6-NEXT:    s_cselect_b32 s8, s10, 0
3074 ; GFX6-NEXT:    s_ashr_i32 s6, s6, 16
3075 ; GFX6-NEXT:    v_cvt_f32_i32_e32 v0, s6
3076 ; GFX6-NEXT:    s_ashr_i32 s4, s4, 16
3077 ; GFX6-NEXT:    v_cvt_f32_i32_e32 v1, s4
3078 ; GFX6-NEXT:    v_cvt_i32_f32_e32 v2, v2
3079 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v3, v0
3080 ; GFX6-NEXT:    s_xor_b32 s4, s4, s6
3081 ; GFX6-NEXT:    s_ashr_i32 s4, s4, 30
3082 ; GFX6-NEXT:    s_sext_i32_i16 s6, s7
3083 ; GFX6-NEXT:    v_mul_f32_e32 v3, v1, v3
3084 ; GFX6-NEXT:    v_trunc_f32_e32 v3, v3
3085 ; GFX6-NEXT:    v_mad_f32 v1, -v3, v0, v1
3086 ; GFX6-NEXT:    v_cvt_i32_f32_e32 v3, v3
3087 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, s8, v2
3088 ; GFX6-NEXT:    s_or_b32 s4, s4, 1
3089 ; GFX6-NEXT:    v_cmp_ge_f32_e64 s[8:9], |v1|, |v0|
3090 ; GFX6-NEXT:    v_cvt_f32_i32_e32 v0, s6
3091 ; GFX6-NEXT:    s_and_b64 s[8:9], s[8:9], exec
3092 ; GFX6-NEXT:    s_cselect_b32 s4, s4, 0
3093 ; GFX6-NEXT:    v_add_i32_e32 v3, vcc, s4, v3
3094 ; GFX6-NEXT:    s_sext_i32_i16 s4, s5
3095 ; GFX6-NEXT:    v_cvt_f32_i32_e32 v1, s4
3096 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v4, v0
3097 ; GFX6-NEXT:    s_xor_b32 s4, s4, s6
3098 ; GFX6-NEXT:    s_ashr_i32 s4, s4, 30
3099 ; GFX6-NEXT:    s_or_b32 s4, s4, 1
3100 ; GFX6-NEXT:    v_mul_f32_e32 v4, v1, v4
3101 ; GFX6-NEXT:    v_trunc_f32_e32 v4, v4
3102 ; GFX6-NEXT:    v_mad_f32 v1, -v4, v0, v1
3103 ; GFX6-NEXT:    v_cmp_ge_f32_e64 s[8:9], |v1|, |v0|
3104 ; GFX6-NEXT:    s_and_b64 s[8:9], s[8:9], exec
3105 ; GFX6-NEXT:    v_cvt_i32_f32_e32 v4, v4
3106 ; GFX6-NEXT:    s_cselect_b32 s4, s4, 0
3107 ; GFX6-NEXT:    s_ashr_i32 s6, s7, 16
3108 ; GFX6-NEXT:    v_cvt_f32_i32_e32 v0, s6
3109 ; GFX6-NEXT:    v_add_i32_e32 v1, vcc, s4, v4
3110 ; GFX6-NEXT:    s_ashr_i32 s4, s5, 16
3111 ; GFX6-NEXT:    v_cvt_f32_i32_e32 v4, s4
3112 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v5, v0
3113 ; GFX6-NEXT:    s_xor_b32 s4, s4, s6
3114 ; GFX6-NEXT:    s_ashr_i32 s4, s4, 30
3115 ; GFX6-NEXT:    s_or_b32 s6, s4, 1
3116 ; GFX6-NEXT:    v_mul_f32_e32 v5, v4, v5
3117 ; GFX6-NEXT:    v_trunc_f32_e32 v5, v5
3118 ; GFX6-NEXT:    v_mad_f32 v4, -v5, v0, v4
3119 ; GFX6-NEXT:    v_cvt_i32_f32_e32 v5, v5
3120 ; GFX6-NEXT:    v_cmp_ge_f32_e64 s[4:5], |v4|, |v0|
3121 ; GFX6-NEXT:    s_and_b64 s[4:5], s[4:5], exec
3122 ; GFX6-NEXT:    s_cselect_b32 s4, s6, 0
3123 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, s4, v5
3124 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
3125 ; GFX6-NEXT:    v_and_b32_e32 v1, 0xffff, v1
3126 ; GFX6-NEXT:    v_or_b32_e32 v1, v1, v0
3127 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 16, v3
3128 ; GFX6-NEXT:    v_and_b32_e32 v2, 0xffff, v2
3129 ; GFX6-NEXT:    v_or_b32_e32 v0, v2, v0
3130 ; GFX6-NEXT:    buffer_store_dwordx2 v[0:1], off, s[0:3], 0
3131 ; GFX6-NEXT:    s_endpgm
3133 ; GFX9-LABEL: sdiv_v4i16:
3134 ; GFX9:       ; %bb.0:
3135 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x2c
3136 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
3137 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0
3138 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
3139 ; GFX9-NEXT:    s_sext_i32_i16 s0, s6
3140 ; GFX9-NEXT:    v_cvt_f32_i32_e32 v0, s0
3141 ; GFX9-NEXT:    s_sext_i32_i16 s1, s4
3142 ; GFX9-NEXT:    v_cvt_f32_i32_e32 v1, s1
3143 ; GFX9-NEXT:    s_xor_b32 s0, s1, s0
3144 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v3, v0
3145 ; GFX9-NEXT:    s_ashr_i32 s0, s0, 30
3146 ; GFX9-NEXT:    s_or_b32 s8, s0, 1
3147 ; GFX9-NEXT:    v_mul_f32_e32 v3, v1, v3
3148 ; GFX9-NEXT:    v_trunc_f32_e32 v3, v3
3149 ; GFX9-NEXT:    v_mad_f32 v1, -v3, v0, v1
3150 ; GFX9-NEXT:    v_cmp_ge_f32_e64 s[0:1], |v1|, |v0|
3151 ; GFX9-NEXT:    s_and_b64 s[0:1], s[0:1], exec
3152 ; GFX9-NEXT:    s_cselect_b32 s0, s8, 0
3153 ; GFX9-NEXT:    s_ashr_i32 s1, s6, 16
3154 ; GFX9-NEXT:    v_cvt_f32_i32_e32 v0, s1
3155 ; GFX9-NEXT:    s_ashr_i32 s4, s4, 16
3156 ; GFX9-NEXT:    v_cvt_f32_i32_e32 v1, s4
3157 ; GFX9-NEXT:    v_cvt_i32_f32_e32 v3, v3
3158 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v4, v0
3159 ; GFX9-NEXT:    v_add_u32_e32 v3, s0, v3
3160 ; GFX9-NEXT:    v_mul_f32_e32 v4, v1, v4
3161 ; GFX9-NEXT:    s_xor_b32 s0, s4, s1
3162 ; GFX9-NEXT:    v_trunc_f32_e32 v4, v4
3163 ; GFX9-NEXT:    s_ashr_i32 s0, s0, 30
3164 ; GFX9-NEXT:    v_mad_f32 v1, -v4, v0, v1
3165 ; GFX9-NEXT:    s_or_b32 s4, s0, 1
3166 ; GFX9-NEXT:    v_cmp_ge_f32_e64 s[0:1], |v1|, |v0|
3167 ; GFX9-NEXT:    s_and_b64 s[0:1], s[0:1], exec
3168 ; GFX9-NEXT:    v_cvt_i32_f32_e32 v4, v4
3169 ; GFX9-NEXT:    s_sext_i32_i16 s1, s7
3170 ; GFX9-NEXT:    v_cvt_f32_i32_e32 v0, s1
3171 ; GFX9-NEXT:    s_cselect_b32 s0, s4, 0
3172 ; GFX9-NEXT:    v_add_u32_e32 v4, s0, v4
3173 ; GFX9-NEXT:    s_sext_i32_i16 s0, s5
3174 ; GFX9-NEXT:    v_cvt_f32_i32_e32 v1, s0
3175 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v5, v0
3176 ; GFX9-NEXT:    s_xor_b32 s0, s0, s1
3177 ; GFX9-NEXT:    s_ashr_i32 s0, s0, 30
3178 ; GFX9-NEXT:    s_or_b32 s4, s0, 1
3179 ; GFX9-NEXT:    v_mul_f32_e32 v5, v1, v5
3180 ; GFX9-NEXT:    v_trunc_f32_e32 v5, v5
3181 ; GFX9-NEXT:    v_mad_f32 v1, -v5, v0, v1
3182 ; GFX9-NEXT:    v_cmp_ge_f32_e64 s[0:1], |v1|, |v0|
3183 ; GFX9-NEXT:    s_and_b64 s[0:1], s[0:1], exec
3184 ; GFX9-NEXT:    v_cvt_i32_f32_e32 v5, v5
3185 ; GFX9-NEXT:    s_cselect_b32 s0, s4, 0
3186 ; GFX9-NEXT:    s_ashr_i32 s1, s7, 16
3187 ; GFX9-NEXT:    v_cvt_f32_i32_e32 v0, s1
3188 ; GFX9-NEXT:    v_add_u32_e32 v1, s0, v5
3189 ; GFX9-NEXT:    s_ashr_i32 s0, s5, 16
3190 ; GFX9-NEXT:    v_cvt_f32_i32_e32 v5, s0
3191 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v6, v0
3192 ; GFX9-NEXT:    s_xor_b32 s0, s0, s1
3193 ; GFX9-NEXT:    s_ashr_i32 s0, s0, 30
3194 ; GFX9-NEXT:    s_or_b32 s4, s0, 1
3195 ; GFX9-NEXT:    v_mul_f32_e32 v6, v5, v6
3196 ; GFX9-NEXT:    v_trunc_f32_e32 v6, v6
3197 ; GFX9-NEXT:    v_mad_f32 v5, -v6, v0, v5
3198 ; GFX9-NEXT:    v_cvt_i32_f32_e32 v6, v6
3199 ; GFX9-NEXT:    v_cmp_ge_f32_e64 s[0:1], |v5|, |v0|
3200 ; GFX9-NEXT:    s_and_b64 s[0:1], s[0:1], exec
3201 ; GFX9-NEXT:    s_cselect_b32 s0, s4, 0
3202 ; GFX9-NEXT:    v_add_u32_e32 v0, s0, v6
3203 ; GFX9-NEXT:    v_and_b32_e32 v1, 0xffff, v1
3204 ; GFX9-NEXT:    v_lshl_or_b32 v1, v0, 16, v1
3205 ; GFX9-NEXT:    v_and_b32_e32 v0, 0xffff, v3
3206 ; GFX9-NEXT:    v_lshl_or_b32 v0, v4, 16, v0
3207 ; GFX9-NEXT:    global_store_dwordx2 v2, v[0:1], s[2:3]
3208 ; GFX9-NEXT:    s_endpgm
3209   %r = sdiv <4 x i16> %x, %y
3210   store <4 x i16> %r, ptr addrspace(1) %out
3211   ret void
3214 define amdgpu_kernel void @srem_v4i16(ptr addrspace(1) %out, <4 x i16> %x, <4 x i16> %y) {
3215 ; CHECK-LABEL: @srem_v4i16(
3216 ; CHECK-NEXT:    [[TMP1:%.*]] = extractelement <4 x i16> [[X:%.*]], i64 0
3217 ; CHECK-NEXT:    [[TMP2:%.*]] = extractelement <4 x i16> [[Y:%.*]], i64 0
3218 ; CHECK-NEXT:    [[TMP3:%.*]] = sext i16 [[TMP1]] to i32
3219 ; CHECK-NEXT:    [[TMP4:%.*]] = sext i16 [[TMP2]] to i32
3220 ; CHECK-NEXT:    [[TMP5:%.*]] = xor i32 [[TMP3]], [[TMP4]]
3221 ; CHECK-NEXT:    [[TMP6:%.*]] = ashr i32 [[TMP5]], 30
3222 ; CHECK-NEXT:    [[TMP7:%.*]] = or i32 [[TMP6]], 1
3223 ; CHECK-NEXT:    [[TMP8:%.*]] = sitofp i32 [[TMP3]] to float
3224 ; CHECK-NEXT:    [[TMP9:%.*]] = sitofp i32 [[TMP4]] to float
3225 ; CHECK-NEXT:    [[TMP10:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP9]])
3226 ; CHECK-NEXT:    [[TMP11:%.*]] = fmul fast float [[TMP8]], [[TMP10]]
3227 ; CHECK-NEXT:    [[TMP12:%.*]] = call fast float @llvm.trunc.f32(float [[TMP11]])
3228 ; CHECK-NEXT:    [[TMP13:%.*]] = fneg fast float [[TMP12]]
3229 ; CHECK-NEXT:    [[TMP14:%.*]] = call fast float @llvm.amdgcn.fmad.ftz.f32(float [[TMP13]], float [[TMP9]], float [[TMP8]])
3230 ; CHECK-NEXT:    [[TMP15:%.*]] = fptosi float [[TMP12]] to i32
3231 ; CHECK-NEXT:    [[TMP16:%.*]] = call fast float @llvm.fabs.f32(float [[TMP14]])
3232 ; CHECK-NEXT:    [[TMP17:%.*]] = call fast float @llvm.fabs.f32(float [[TMP9]])
3233 ; CHECK-NEXT:    [[TMP18:%.*]] = fcmp fast oge float [[TMP16]], [[TMP17]]
3234 ; CHECK-NEXT:    [[TMP19:%.*]] = select i1 [[TMP18]], i32 [[TMP7]], i32 0
3235 ; CHECK-NEXT:    [[TMP20:%.*]] = add i32 [[TMP15]], [[TMP19]]
3236 ; CHECK-NEXT:    [[TMP21:%.*]] = mul i32 [[TMP20]], [[TMP4]]
3237 ; CHECK-NEXT:    [[TMP22:%.*]] = sub i32 [[TMP3]], [[TMP21]]
3238 ; CHECK-NEXT:    [[TMP23:%.*]] = shl i32 [[TMP22]], 16
3239 ; CHECK-NEXT:    [[TMP24:%.*]] = ashr i32 [[TMP23]], 16
3240 ; CHECK-NEXT:    [[TMP25:%.*]] = trunc i32 [[TMP24]] to i16
3241 ; CHECK-NEXT:    [[TMP26:%.*]] = insertelement <4 x i16> poison, i16 [[TMP25]], i64 0
3242 ; CHECK-NEXT:    [[TMP27:%.*]] = extractelement <4 x i16> [[X]], i64 1
3243 ; CHECK-NEXT:    [[TMP28:%.*]] = extractelement <4 x i16> [[Y]], i64 1
3244 ; CHECK-NEXT:    [[TMP29:%.*]] = sext i16 [[TMP27]] to i32
3245 ; CHECK-NEXT:    [[TMP30:%.*]] = sext i16 [[TMP28]] to i32
3246 ; CHECK-NEXT:    [[TMP31:%.*]] = xor i32 [[TMP29]], [[TMP30]]
3247 ; CHECK-NEXT:    [[TMP32:%.*]] = ashr i32 [[TMP31]], 30
3248 ; CHECK-NEXT:    [[TMP33:%.*]] = or i32 [[TMP32]], 1
3249 ; CHECK-NEXT:    [[TMP34:%.*]] = sitofp i32 [[TMP29]] to float
3250 ; CHECK-NEXT:    [[TMP35:%.*]] = sitofp i32 [[TMP30]] to float
3251 ; CHECK-NEXT:    [[TMP36:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP35]])
3252 ; CHECK-NEXT:    [[TMP37:%.*]] = fmul fast float [[TMP34]], [[TMP36]]
3253 ; CHECK-NEXT:    [[TMP38:%.*]] = call fast float @llvm.trunc.f32(float [[TMP37]])
3254 ; CHECK-NEXT:    [[TMP39:%.*]] = fneg fast float [[TMP38]]
3255 ; CHECK-NEXT:    [[TMP40:%.*]] = call fast float @llvm.amdgcn.fmad.ftz.f32(float [[TMP39]], float [[TMP35]], float [[TMP34]])
3256 ; CHECK-NEXT:    [[TMP41:%.*]] = fptosi float [[TMP38]] to i32
3257 ; CHECK-NEXT:    [[TMP42:%.*]] = call fast float @llvm.fabs.f32(float [[TMP40]])
3258 ; CHECK-NEXT:    [[TMP43:%.*]] = call fast float @llvm.fabs.f32(float [[TMP35]])
3259 ; CHECK-NEXT:    [[TMP44:%.*]] = fcmp fast oge float [[TMP42]], [[TMP43]]
3260 ; CHECK-NEXT:    [[TMP45:%.*]] = select i1 [[TMP44]], i32 [[TMP33]], i32 0
3261 ; CHECK-NEXT:    [[TMP46:%.*]] = add i32 [[TMP41]], [[TMP45]]
3262 ; CHECK-NEXT:    [[TMP47:%.*]] = mul i32 [[TMP46]], [[TMP30]]
3263 ; CHECK-NEXT:    [[TMP48:%.*]] = sub i32 [[TMP29]], [[TMP47]]
3264 ; CHECK-NEXT:    [[TMP49:%.*]] = shl i32 [[TMP48]], 16
3265 ; CHECK-NEXT:    [[TMP50:%.*]] = ashr i32 [[TMP49]], 16
3266 ; CHECK-NEXT:    [[TMP51:%.*]] = trunc i32 [[TMP50]] to i16
3267 ; CHECK-NEXT:    [[TMP52:%.*]] = insertelement <4 x i16> [[TMP26]], i16 [[TMP51]], i64 1
3268 ; CHECK-NEXT:    [[TMP53:%.*]] = extractelement <4 x i16> [[X]], i64 2
3269 ; CHECK-NEXT:    [[TMP54:%.*]] = extractelement <4 x i16> [[Y]], i64 2
3270 ; CHECK-NEXT:    [[TMP55:%.*]] = sext i16 [[TMP53]] to i32
3271 ; CHECK-NEXT:    [[TMP56:%.*]] = sext i16 [[TMP54]] to i32
3272 ; CHECK-NEXT:    [[TMP57:%.*]] = xor i32 [[TMP55]], [[TMP56]]
3273 ; CHECK-NEXT:    [[TMP58:%.*]] = ashr i32 [[TMP57]], 30
3274 ; CHECK-NEXT:    [[TMP59:%.*]] = or i32 [[TMP58]], 1
3275 ; CHECK-NEXT:    [[TMP60:%.*]] = sitofp i32 [[TMP55]] to float
3276 ; CHECK-NEXT:    [[TMP61:%.*]] = sitofp i32 [[TMP56]] to float
3277 ; CHECK-NEXT:    [[TMP62:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP61]])
3278 ; CHECK-NEXT:    [[TMP63:%.*]] = fmul fast float [[TMP60]], [[TMP62]]
3279 ; CHECK-NEXT:    [[TMP64:%.*]] = call fast float @llvm.trunc.f32(float [[TMP63]])
3280 ; CHECK-NEXT:    [[TMP65:%.*]] = fneg fast float [[TMP64]]
3281 ; CHECK-NEXT:    [[TMP66:%.*]] = call fast float @llvm.amdgcn.fmad.ftz.f32(float [[TMP65]], float [[TMP61]], float [[TMP60]])
3282 ; CHECK-NEXT:    [[TMP67:%.*]] = fptosi float [[TMP64]] to i32
3283 ; CHECK-NEXT:    [[TMP68:%.*]] = call fast float @llvm.fabs.f32(float [[TMP66]])
3284 ; CHECK-NEXT:    [[TMP69:%.*]] = call fast float @llvm.fabs.f32(float [[TMP61]])
3285 ; CHECK-NEXT:    [[TMP70:%.*]] = fcmp fast oge float [[TMP68]], [[TMP69]]
3286 ; CHECK-NEXT:    [[TMP71:%.*]] = select i1 [[TMP70]], i32 [[TMP59]], i32 0
3287 ; CHECK-NEXT:    [[TMP72:%.*]] = add i32 [[TMP67]], [[TMP71]]
3288 ; CHECK-NEXT:    [[TMP73:%.*]] = mul i32 [[TMP72]], [[TMP56]]
3289 ; CHECK-NEXT:    [[TMP74:%.*]] = sub i32 [[TMP55]], [[TMP73]]
3290 ; CHECK-NEXT:    [[TMP75:%.*]] = shl i32 [[TMP74]], 16
3291 ; CHECK-NEXT:    [[TMP76:%.*]] = ashr i32 [[TMP75]], 16
3292 ; CHECK-NEXT:    [[TMP77:%.*]] = trunc i32 [[TMP76]] to i16
3293 ; CHECK-NEXT:    [[TMP78:%.*]] = insertelement <4 x i16> [[TMP52]], i16 [[TMP77]], i64 2
3294 ; CHECK-NEXT:    [[TMP79:%.*]] = extractelement <4 x i16> [[X]], i64 3
3295 ; CHECK-NEXT:    [[TMP80:%.*]] = extractelement <4 x i16> [[Y]], i64 3
3296 ; CHECK-NEXT:    [[TMP81:%.*]] = sext i16 [[TMP79]] to i32
3297 ; CHECK-NEXT:    [[TMP82:%.*]] = sext i16 [[TMP80]] to i32
3298 ; CHECK-NEXT:    [[TMP83:%.*]] = xor i32 [[TMP81]], [[TMP82]]
3299 ; CHECK-NEXT:    [[TMP84:%.*]] = ashr i32 [[TMP83]], 30
3300 ; CHECK-NEXT:    [[TMP85:%.*]] = or i32 [[TMP84]], 1
3301 ; CHECK-NEXT:    [[TMP86:%.*]] = sitofp i32 [[TMP81]] to float
3302 ; CHECK-NEXT:    [[TMP87:%.*]] = sitofp i32 [[TMP82]] to float
3303 ; CHECK-NEXT:    [[TMP88:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP87]])
3304 ; CHECK-NEXT:    [[TMP89:%.*]] = fmul fast float [[TMP86]], [[TMP88]]
3305 ; CHECK-NEXT:    [[TMP90:%.*]] = call fast float @llvm.trunc.f32(float [[TMP89]])
3306 ; CHECK-NEXT:    [[TMP91:%.*]] = fneg fast float [[TMP90]]
3307 ; CHECK-NEXT:    [[TMP92:%.*]] = call fast float @llvm.amdgcn.fmad.ftz.f32(float [[TMP91]], float [[TMP87]], float [[TMP86]])
3308 ; CHECK-NEXT:    [[TMP93:%.*]] = fptosi float [[TMP90]] to i32
3309 ; CHECK-NEXT:    [[TMP94:%.*]] = call fast float @llvm.fabs.f32(float [[TMP92]])
3310 ; CHECK-NEXT:    [[TMP95:%.*]] = call fast float @llvm.fabs.f32(float [[TMP87]])
3311 ; CHECK-NEXT:    [[TMP96:%.*]] = fcmp fast oge float [[TMP94]], [[TMP95]]
3312 ; CHECK-NEXT:    [[TMP97:%.*]] = select i1 [[TMP96]], i32 [[TMP85]], i32 0
3313 ; CHECK-NEXT:    [[TMP98:%.*]] = add i32 [[TMP93]], [[TMP97]]
3314 ; CHECK-NEXT:    [[TMP99:%.*]] = mul i32 [[TMP98]], [[TMP82]]
3315 ; CHECK-NEXT:    [[TMP100:%.*]] = sub i32 [[TMP81]], [[TMP99]]
3316 ; CHECK-NEXT:    [[TMP101:%.*]] = shl i32 [[TMP100]], 16
3317 ; CHECK-NEXT:    [[TMP102:%.*]] = ashr i32 [[TMP101]], 16
3318 ; CHECK-NEXT:    [[TMP103:%.*]] = trunc i32 [[TMP102]] to i16
3319 ; CHECK-NEXT:    [[TMP104:%.*]] = insertelement <4 x i16> [[TMP78]], i16 [[TMP103]], i64 3
3320 ; CHECK-NEXT:    store <4 x i16> [[TMP104]], ptr addrspace(1) [[OUT:%.*]], align 8
3321 ; CHECK-NEXT:    ret void
3323 ; GFX6-LABEL: srem_v4i16:
3324 ; GFX6:       ; %bb.0:
3325 ; GFX6-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0xb
3326 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
3327 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
3328 ; GFX6-NEXT:    s_mov_b32 s2, -1
3329 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
3330 ; GFX6-NEXT:    s_sext_i32_i16 s8, s6
3331 ; GFX6-NEXT:    v_cvt_f32_i32_e32 v0, s8
3332 ; GFX6-NEXT:    s_sext_i32_i16 s9, s4
3333 ; GFX6-NEXT:    v_cvt_f32_i32_e32 v1, s9
3334 ; GFX6-NEXT:    s_xor_b32 s8, s9, s8
3335 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v2, v0
3336 ; GFX6-NEXT:    s_ashr_i32 s8, s8, 30
3337 ; GFX6-NEXT:    s_or_b32 s10, s8, 1
3338 ; GFX6-NEXT:    v_mul_f32_e32 v2, v1, v2
3339 ; GFX6-NEXT:    v_trunc_f32_e32 v2, v2
3340 ; GFX6-NEXT:    v_mad_f32 v1, -v2, v0, v1
3341 ; GFX6-NEXT:    v_cvt_i32_f32_e32 v2, v2
3342 ; GFX6-NEXT:    v_cmp_ge_f32_e64 s[8:9], |v1|, |v0|
3343 ; GFX6-NEXT:    s_and_b64 s[8:9], s[8:9], exec
3344 ; GFX6-NEXT:    s_cselect_b32 s8, s10, 0
3345 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, s8, v2
3346 ; GFX6-NEXT:    v_mul_lo_u32 v0, v0, s6
3347 ; GFX6-NEXT:    s_ashr_i32 s8, s6, 16
3348 ; GFX6-NEXT:    v_cvt_f32_i32_e32 v1, s8
3349 ; GFX6-NEXT:    s_lshr_b32 s10, s4, 16
3350 ; GFX6-NEXT:    v_sub_i32_e32 v0, vcc, s4, v0
3351 ; GFX6-NEXT:    s_ashr_i32 s4, s4, 16
3352 ; GFX6-NEXT:    v_cvt_f32_i32_e32 v2, s4
3353 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v3, v1
3354 ; GFX6-NEXT:    s_xor_b32 s4, s4, s8
3355 ; GFX6-NEXT:    s_ashr_i32 s4, s4, 30
3356 ; GFX6-NEXT:    s_lshr_b32 s6, s6, 16
3357 ; GFX6-NEXT:    v_mul_f32_e32 v3, v2, v3
3358 ; GFX6-NEXT:    v_trunc_f32_e32 v3, v3
3359 ; GFX6-NEXT:    v_mad_f32 v2, -v3, v1, v2
3360 ; GFX6-NEXT:    v_cvt_i32_f32_e32 v3, v3
3361 ; GFX6-NEXT:    s_or_b32 s4, s4, 1
3362 ; GFX6-NEXT:    v_cmp_ge_f32_e64 s[8:9], |v2|, |v1|
3363 ; GFX6-NEXT:    s_and_b64 s[8:9], s[8:9], exec
3364 ; GFX6-NEXT:    s_cselect_b32 s4, s4, 0
3365 ; GFX6-NEXT:    v_add_i32_e32 v1, vcc, s4, v3
3366 ; GFX6-NEXT:    s_sext_i32_i16 s4, s7
3367 ; GFX6-NEXT:    v_mul_lo_u32 v1, v1, s6
3368 ; GFX6-NEXT:    v_cvt_f32_i32_e32 v2, s4
3369 ; GFX6-NEXT:    s_sext_i32_i16 s6, s5
3370 ; GFX6-NEXT:    s_xor_b32 s4, s6, s4
3371 ; GFX6-NEXT:    v_sub_i32_e32 v3, vcc, s10, v1
3372 ; GFX6-NEXT:    v_cvt_f32_i32_e32 v1, s6
3373 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v4, v2
3374 ; GFX6-NEXT:    s_ashr_i32 s4, s4, 30
3375 ; GFX6-NEXT:    s_or_b32 s4, s4, 1
3376 ; GFX6-NEXT:    v_and_b32_e32 v0, 0xffff, v0
3377 ; GFX6-NEXT:    v_mul_f32_e32 v4, v1, v4
3378 ; GFX6-NEXT:    v_trunc_f32_e32 v4, v4
3379 ; GFX6-NEXT:    v_mad_f32 v1, -v4, v2, v1
3380 ; GFX6-NEXT:    v_cmp_ge_f32_e64 s[8:9], |v1|, |v2|
3381 ; GFX6-NEXT:    v_cvt_i32_f32_e32 v4, v4
3382 ; GFX6-NEXT:    s_and_b64 s[8:9], s[8:9], exec
3383 ; GFX6-NEXT:    s_cselect_b32 s4, s4, 0
3384 ; GFX6-NEXT:    s_ashr_i32 s6, s7, 16
3385 ; GFX6-NEXT:    v_cvt_f32_i32_e32 v2, s6
3386 ; GFX6-NEXT:    v_add_i32_e32 v1, vcc, s4, v4
3387 ; GFX6-NEXT:    v_mul_lo_u32 v1, v1, s7
3388 ; GFX6-NEXT:    s_lshr_b32 s8, s7, 16
3389 ; GFX6-NEXT:    s_ashr_i32 s7, s5, 16
3390 ; GFX6-NEXT:    v_cvt_f32_i32_e32 v4, s7
3391 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v5, v2
3392 ; GFX6-NEXT:    s_xor_b32 s6, s7, s6
3393 ; GFX6-NEXT:    s_ashr_i32 s6, s6, 30
3394 ; GFX6-NEXT:    s_lshr_b32 s4, s5, 16
3395 ; GFX6-NEXT:    v_mul_f32_e32 v5, v4, v5
3396 ; GFX6-NEXT:    v_trunc_f32_e32 v5, v5
3397 ; GFX6-NEXT:    v_mad_f32 v4, -v5, v2, v4
3398 ; GFX6-NEXT:    v_cvt_i32_f32_e32 v5, v5
3399 ; GFX6-NEXT:    s_or_b32 s9, s6, 1
3400 ; GFX6-NEXT:    v_cmp_ge_f32_e64 s[6:7], |v4|, |v2|
3401 ; GFX6-NEXT:    s_and_b64 s[6:7], s[6:7], exec
3402 ; GFX6-NEXT:    s_cselect_b32 s6, s9, 0
3403 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, s6, v5
3404 ; GFX6-NEXT:    v_mul_lo_u32 v2, v2, s8
3405 ; GFX6-NEXT:    v_sub_i32_e32 v1, vcc, s5, v1
3406 ; GFX6-NEXT:    v_and_b32_e32 v1, 0xffff, v1
3407 ; GFX6-NEXT:    v_sub_i32_e32 v2, vcc, s4, v2
3408 ; GFX6-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
3409 ; GFX6-NEXT:    v_or_b32_e32 v1, v1, v2
3410 ; GFX6-NEXT:    v_lshlrev_b32_e32 v2, 16, v3
3411 ; GFX6-NEXT:    v_or_b32_e32 v0, v0, v2
3412 ; GFX6-NEXT:    buffer_store_dwordx2 v[0:1], off, s[0:3], 0
3413 ; GFX6-NEXT:    s_endpgm
3415 ; GFX9-LABEL: srem_v4i16:
3416 ; GFX9:       ; %bb.0:
3417 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x2c
3418 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
3419 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0
3420 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
3421 ; GFX9-NEXT:    s_sext_i32_i16 s8, s6
3422 ; GFX9-NEXT:    v_cvt_f32_i32_e32 v0, s8
3423 ; GFX9-NEXT:    s_sext_i32_i16 s9, s4
3424 ; GFX9-NEXT:    v_cvt_f32_i32_e32 v1, s9
3425 ; GFX9-NEXT:    s_xor_b32 s0, s9, s8
3426 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v3, v0
3427 ; GFX9-NEXT:    s_ashr_i32 s0, s0, 30
3428 ; GFX9-NEXT:    s_or_b32 s10, s0, 1
3429 ; GFX9-NEXT:    v_mul_f32_e32 v3, v1, v3
3430 ; GFX9-NEXT:    v_trunc_f32_e32 v3, v3
3431 ; GFX9-NEXT:    v_mad_f32 v1, -v3, v0, v1
3432 ; GFX9-NEXT:    v_cmp_ge_f32_e64 s[0:1], |v1|, |v0|
3433 ; GFX9-NEXT:    s_and_b64 s[0:1], s[0:1], exec
3434 ; GFX9-NEXT:    s_cselect_b32 s0, s10, 0
3435 ; GFX9-NEXT:    s_ashr_i32 s6, s6, 16
3436 ; GFX9-NEXT:    v_cvt_i32_f32_e32 v3, v3
3437 ; GFX9-NEXT:    v_cvt_f32_i32_e32 v0, s6
3438 ; GFX9-NEXT:    s_ashr_i32 s4, s4, 16
3439 ; GFX9-NEXT:    v_add_u32_e32 v1, s0, v3
3440 ; GFX9-NEXT:    v_cvt_f32_i32_e32 v3, s4
3441 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v4, v0
3442 ; GFX9-NEXT:    s_xor_b32 s0, s4, s6
3443 ; GFX9-NEXT:    s_ashr_i32 s0, s0, 30
3444 ; GFX9-NEXT:    v_mul_lo_u32 v1, v1, s8
3445 ; GFX9-NEXT:    v_mul_f32_e32 v4, v3, v4
3446 ; GFX9-NEXT:    v_trunc_f32_e32 v4, v4
3447 ; GFX9-NEXT:    v_mad_f32 v3, -v4, v0, v3
3448 ; GFX9-NEXT:    s_or_b32 s8, s0, 1
3449 ; GFX9-NEXT:    v_cmp_ge_f32_e64 s[0:1], |v3|, |v0|
3450 ; GFX9-NEXT:    v_cvt_i32_f32_e32 v4, v4
3451 ; GFX9-NEXT:    s_and_b64 s[0:1], s[0:1], exec
3452 ; GFX9-NEXT:    s_cselect_b32 s0, s8, 0
3453 ; GFX9-NEXT:    s_sext_i32_i16 s8, s7
3454 ; GFX9-NEXT:    v_cvt_f32_i32_e32 v3, s8
3455 ; GFX9-NEXT:    v_add_u32_e32 v0, s0, v4
3456 ; GFX9-NEXT:    v_mul_lo_u32 v0, v0, s6
3457 ; GFX9-NEXT:    s_sext_i32_i16 s6, s5
3458 ; GFX9-NEXT:    v_cvt_f32_i32_e32 v4, s6
3459 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v5, v3
3460 ; GFX9-NEXT:    s_xor_b32 s0, s6, s8
3461 ; GFX9-NEXT:    s_ashr_i32 s0, s0, 30
3462 ; GFX9-NEXT:    s_or_b32 s10, s0, 1
3463 ; GFX9-NEXT:    v_mul_f32_e32 v5, v4, v5
3464 ; GFX9-NEXT:    v_trunc_f32_e32 v5, v5
3465 ; GFX9-NEXT:    v_mad_f32 v4, -v5, v3, v4
3466 ; GFX9-NEXT:    v_cmp_ge_f32_e64 s[0:1], |v4|, |v3|
3467 ; GFX9-NEXT:    s_and_b64 s[0:1], s[0:1], exec
3468 ; GFX9-NEXT:    s_cselect_b32 s0, s10, 0
3469 ; GFX9-NEXT:    s_ashr_i32 s7, s7, 16
3470 ; GFX9-NEXT:    v_cvt_i32_f32_e32 v5, v5
3471 ; GFX9-NEXT:    v_cvt_f32_i32_e32 v4, s7
3472 ; GFX9-NEXT:    s_ashr_i32 s5, s5, 16
3473 ; GFX9-NEXT:    v_sub_u32_e32 v0, s4, v0
3474 ; GFX9-NEXT:    v_add_u32_e32 v3, s0, v5
3475 ; GFX9-NEXT:    v_cvt_f32_i32_e32 v5, s5
3476 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v6, v4
3477 ; GFX9-NEXT:    s_xor_b32 s0, s5, s7
3478 ; GFX9-NEXT:    s_ashr_i32 s0, s0, 30
3479 ; GFX9-NEXT:    v_mul_lo_u32 v3, v3, s8
3480 ; GFX9-NEXT:    v_mul_f32_e32 v6, v5, v6
3481 ; GFX9-NEXT:    v_trunc_f32_e32 v6, v6
3482 ; GFX9-NEXT:    v_mad_f32 v5, -v6, v4, v5
3483 ; GFX9-NEXT:    v_cvt_i32_f32_e32 v6, v6
3484 ; GFX9-NEXT:    s_or_b32 s8, s0, 1
3485 ; GFX9-NEXT:    v_cmp_ge_f32_e64 s[0:1], |v5|, |v4|
3486 ; GFX9-NEXT:    s_and_b64 s[0:1], s[0:1], exec
3487 ; GFX9-NEXT:    s_cselect_b32 s0, s8, 0
3488 ; GFX9-NEXT:    v_add_u32_e32 v4, s0, v6
3489 ; GFX9-NEXT:    v_mul_lo_u32 v4, v4, s7
3490 ; GFX9-NEXT:    v_sub_u32_e32 v5, s9, v1
3491 ; GFX9-NEXT:    v_sub_u32_e32 v1, s6, v3
3492 ; GFX9-NEXT:    v_and_b32_e32 v1, 0xffff, v1
3493 ; GFX9-NEXT:    v_sub_u32_e32 v3, s5, v4
3494 ; GFX9-NEXT:    v_lshl_or_b32 v1, v3, 16, v1
3495 ; GFX9-NEXT:    v_and_b32_e32 v3, 0xffff, v5
3496 ; GFX9-NEXT:    v_lshl_or_b32 v0, v0, 16, v3
3497 ; GFX9-NEXT:    global_store_dwordx2 v2, v[0:1], s[2:3]
3498 ; GFX9-NEXT:    s_endpgm
3499   %r = srem <4 x i16> %x, %y
3500   store <4 x i16> %r, ptr addrspace(1) %out
3501   ret void
3504 define amdgpu_kernel void @udiv_i3(ptr addrspace(1) %out, i3 %x, i3 %y) {
3505 ; CHECK-LABEL: @udiv_i3(
3506 ; CHECK-NEXT:    [[TMP1:%.*]] = zext i3 [[X:%.*]] to i32
3507 ; CHECK-NEXT:    [[TMP2:%.*]] = zext i3 [[Y:%.*]] to i32
3508 ; CHECK-NEXT:    [[TMP3:%.*]] = uitofp i32 [[TMP1]] to float
3509 ; CHECK-NEXT:    [[TMP4:%.*]] = uitofp i32 [[TMP2]] to float
3510 ; CHECK-NEXT:    [[TMP5:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP4]])
3511 ; CHECK-NEXT:    [[TMP6:%.*]] = fmul fast float [[TMP3]], [[TMP5]]
3512 ; CHECK-NEXT:    [[TMP7:%.*]] = call fast float @llvm.trunc.f32(float [[TMP6]])
3513 ; CHECK-NEXT:    [[TMP8:%.*]] = fneg fast float [[TMP7]]
3514 ; CHECK-NEXT:    [[TMP9:%.*]] = call fast float @llvm.amdgcn.fmad.ftz.f32(float [[TMP8]], float [[TMP4]], float [[TMP3]])
3515 ; CHECK-NEXT:    [[TMP10:%.*]] = fptoui float [[TMP7]] to i32
3516 ; CHECK-NEXT:    [[TMP11:%.*]] = call fast float @llvm.fabs.f32(float [[TMP9]])
3517 ; CHECK-NEXT:    [[TMP12:%.*]] = call fast float @llvm.fabs.f32(float [[TMP4]])
3518 ; CHECK-NEXT:    [[TMP13:%.*]] = fcmp fast oge float [[TMP11]], [[TMP12]]
3519 ; CHECK-NEXT:    [[TMP14:%.*]] = select i1 [[TMP13]], i32 1, i32 0
3520 ; CHECK-NEXT:    [[TMP15:%.*]] = add i32 [[TMP10]], [[TMP14]]
3521 ; CHECK-NEXT:    [[TMP16:%.*]] = and i32 [[TMP15]], 7
3522 ; CHECK-NEXT:    [[TMP17:%.*]] = trunc i32 [[TMP16]] to i3
3523 ; CHECK-NEXT:    store i3 [[TMP17]], ptr addrspace(1) [[OUT:%.*]], align 1
3524 ; CHECK-NEXT:    ret void
3526 ; GFX6-LABEL: udiv_i3:
3527 ; GFX6:       ; %bb.0:
3528 ; GFX6-NEXT:    s_load_dword s4, s[0:1], 0xb
3529 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
3530 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
3531 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
3532 ; GFX6-NEXT:    s_bfe_u32 s2, s4, 0x30008
3533 ; GFX6-NEXT:    v_cvt_f32_ubyte0_e32 v0, s2
3534 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v1, v0
3535 ; GFX6-NEXT:    s_and_b32 s4, s4, 7
3536 ; GFX6-NEXT:    v_cvt_f32_ubyte0_e32 v2, s4
3537 ; GFX6-NEXT:    s_mov_b32 s2, -1
3538 ; GFX6-NEXT:    v_mul_f32_e32 v1, v2, v1
3539 ; GFX6-NEXT:    v_trunc_f32_e32 v1, v1
3540 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v3, v1
3541 ; GFX6-NEXT:    v_mad_f32 v1, -v1, v0, v2
3542 ; GFX6-NEXT:    v_cmp_ge_f32_e64 vcc, |v1|, v0
3543 ; GFX6-NEXT:    v_addc_u32_e32 v0, vcc, 0, v3, vcc
3544 ; GFX6-NEXT:    v_and_b32_e32 v0, 7, v0
3545 ; GFX6-NEXT:    buffer_store_byte v0, off, s[0:3], 0
3546 ; GFX6-NEXT:    s_endpgm
3548 ; GFX9-LABEL: udiv_i3:
3549 ; GFX9:       ; %bb.0:
3550 ; GFX9-NEXT:    s_load_dword s4, s[0:1], 0x2c
3551 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
3552 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0
3553 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
3554 ; GFX9-NEXT:    s_bfe_u32 s0, s4, 0x30008
3555 ; GFX9-NEXT:    v_cvt_f32_ubyte0_e32 v0, s0
3556 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v1, v0
3557 ; GFX9-NEXT:    s_and_b32 s0, s4, 7
3558 ; GFX9-NEXT:    v_cvt_f32_ubyte0_e32 v3, s0
3559 ; GFX9-NEXT:    v_mul_f32_e32 v1, v3, v1
3560 ; GFX9-NEXT:    v_trunc_f32_e32 v1, v1
3561 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v4, v1
3562 ; GFX9-NEXT:    v_mad_f32 v1, -v1, v0, v3
3563 ; GFX9-NEXT:    v_cmp_ge_f32_e64 vcc, |v1|, v0
3564 ; GFX9-NEXT:    v_addc_co_u32_e32 v0, vcc, 0, v4, vcc
3565 ; GFX9-NEXT:    v_and_b32_e32 v0, 7, v0
3566 ; GFX9-NEXT:    global_store_byte v2, v0, s[2:3]
3567 ; GFX9-NEXT:    s_endpgm
3568   %r = udiv i3 %x, %y
3569   store i3 %r, ptr addrspace(1) %out
3570   ret void
3573 define amdgpu_kernel void @urem_i3(ptr addrspace(1) %out, i3 %x, i3 %y) {
3574 ; CHECK-LABEL: @urem_i3(
3575 ; CHECK-NEXT:    [[TMP1:%.*]] = zext i3 [[X:%.*]] to i32
3576 ; CHECK-NEXT:    [[TMP2:%.*]] = zext i3 [[Y:%.*]] to i32
3577 ; CHECK-NEXT:    [[TMP3:%.*]] = uitofp i32 [[TMP1]] to float
3578 ; CHECK-NEXT:    [[TMP4:%.*]] = uitofp i32 [[TMP2]] to float
3579 ; CHECK-NEXT:    [[TMP5:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP4]])
3580 ; CHECK-NEXT:    [[TMP6:%.*]] = fmul fast float [[TMP3]], [[TMP5]]
3581 ; CHECK-NEXT:    [[TMP7:%.*]] = call fast float @llvm.trunc.f32(float [[TMP6]])
3582 ; CHECK-NEXT:    [[TMP8:%.*]] = fneg fast float [[TMP7]]
3583 ; CHECK-NEXT:    [[TMP9:%.*]] = call fast float @llvm.amdgcn.fmad.ftz.f32(float [[TMP8]], float [[TMP4]], float [[TMP3]])
3584 ; CHECK-NEXT:    [[TMP10:%.*]] = fptoui float [[TMP7]] to i32
3585 ; CHECK-NEXT:    [[TMP11:%.*]] = call fast float @llvm.fabs.f32(float [[TMP9]])
3586 ; CHECK-NEXT:    [[TMP12:%.*]] = call fast float @llvm.fabs.f32(float [[TMP4]])
3587 ; CHECK-NEXT:    [[TMP13:%.*]] = fcmp fast oge float [[TMP11]], [[TMP12]]
3588 ; CHECK-NEXT:    [[TMP14:%.*]] = select i1 [[TMP13]], i32 1, i32 0
3589 ; CHECK-NEXT:    [[TMP15:%.*]] = add i32 [[TMP10]], [[TMP14]]
3590 ; CHECK-NEXT:    [[TMP16:%.*]] = mul i32 [[TMP15]], [[TMP2]]
3591 ; CHECK-NEXT:    [[TMP17:%.*]] = sub i32 [[TMP1]], [[TMP16]]
3592 ; CHECK-NEXT:    [[TMP18:%.*]] = and i32 [[TMP17]], 7
3593 ; CHECK-NEXT:    [[TMP19:%.*]] = trunc i32 [[TMP18]] to i3
3594 ; CHECK-NEXT:    store i3 [[TMP19]], ptr addrspace(1) [[OUT:%.*]], align 1
3595 ; CHECK-NEXT:    ret void
3597 ; GFX6-LABEL: urem_i3:
3598 ; GFX6:       ; %bb.0:
3599 ; GFX6-NEXT:    s_load_dword s4, s[0:1], 0xb
3600 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
3601 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
3602 ; GFX6-NEXT:    s_bfe_u32 s2, s4, 0x30008
3603 ; GFX6-NEXT:    v_cvt_f32_ubyte0_e32 v0, s2
3604 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v1, v0
3605 ; GFX6-NEXT:    s_and_b32 s3, s4, 7
3606 ; GFX6-NEXT:    v_cvt_f32_ubyte0_e32 v2, s3
3607 ; GFX6-NEXT:    s_lshr_b32 s2, s4, 8
3608 ; GFX6-NEXT:    v_mul_f32_e32 v1, v2, v1
3609 ; GFX6-NEXT:    v_trunc_f32_e32 v1, v1
3610 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v3, v1
3611 ; GFX6-NEXT:    v_mad_f32 v1, -v1, v0, v2
3612 ; GFX6-NEXT:    v_cmp_ge_f32_e64 vcc, |v1|, v0
3613 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
3614 ; GFX6-NEXT:    v_addc_u32_e32 v0, vcc, 0, v3, vcc
3615 ; GFX6-NEXT:    v_mul_lo_u32 v0, v0, s2
3616 ; GFX6-NEXT:    s_mov_b32 s2, -1
3617 ; GFX6-NEXT:    v_sub_i32_e32 v0, vcc, s4, v0
3618 ; GFX6-NEXT:    v_and_b32_e32 v0, 7, v0
3619 ; GFX6-NEXT:    buffer_store_byte v0, off, s[0:3], 0
3620 ; GFX6-NEXT:    s_endpgm
3622 ; GFX9-LABEL: urem_i3:
3623 ; GFX9:       ; %bb.0:
3624 ; GFX9-NEXT:    s_load_dword s2, s[0:1], 0x2c
3625 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
3626 ; GFX9-NEXT:    s_bfe_u32 s3, s2, 0x30008
3627 ; GFX9-NEXT:    v_cvt_f32_ubyte0_e32 v0, s3
3628 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v1, v0
3629 ; GFX9-NEXT:    s_and_b32 s4, s2, 7
3630 ; GFX9-NEXT:    v_cvt_f32_ubyte0_e32 v2, s4
3631 ; GFX9-NEXT:    s_lshr_b32 s3, s2, 8
3632 ; GFX9-NEXT:    v_mul_f32_e32 v1, v2, v1
3633 ; GFX9-NEXT:    v_trunc_f32_e32 v1, v1
3634 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v3, v1
3635 ; GFX9-NEXT:    v_mad_f32 v1, -v1, v0, v2
3636 ; GFX9-NEXT:    v_cmp_ge_f32_e64 vcc, |v1|, v0
3637 ; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
3638 ; GFX9-NEXT:    v_addc_co_u32_e32 v0, vcc, 0, v3, vcc
3639 ; GFX9-NEXT:    v_mul_lo_u32 v0, v0, s3
3640 ; GFX9-NEXT:    v_mov_b32_e32 v1, 0
3641 ; GFX9-NEXT:    v_sub_u32_e32 v0, s2, v0
3642 ; GFX9-NEXT:    v_and_b32_e32 v0, 7, v0
3643 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
3644 ; GFX9-NEXT:    global_store_byte v1, v0, s[0:1]
3645 ; GFX9-NEXT:    s_endpgm
3646   %r = urem i3 %x, %y
3647   store i3 %r, ptr addrspace(1) %out
3648   ret void
3651 define amdgpu_kernel void @sdiv_i3(ptr addrspace(1) %out, i3 %x, i3 %y) {
3652 ; CHECK-LABEL: @sdiv_i3(
3653 ; CHECK-NEXT:    [[TMP1:%.*]] = sext i3 [[X:%.*]] to i32
3654 ; CHECK-NEXT:    [[TMP2:%.*]] = sext i3 [[Y:%.*]] to i32
3655 ; CHECK-NEXT:    [[TMP3:%.*]] = xor i32 [[TMP1]], [[TMP2]]
3656 ; CHECK-NEXT:    [[TMP4:%.*]] = ashr i32 [[TMP3]], 30
3657 ; CHECK-NEXT:    [[TMP5:%.*]] = or i32 [[TMP4]], 1
3658 ; CHECK-NEXT:    [[TMP6:%.*]] = sitofp i32 [[TMP1]] to float
3659 ; CHECK-NEXT:    [[TMP7:%.*]] = sitofp i32 [[TMP2]] to float
3660 ; CHECK-NEXT:    [[TMP8:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP7]])
3661 ; CHECK-NEXT:    [[TMP9:%.*]] = fmul fast float [[TMP6]], [[TMP8]]
3662 ; CHECK-NEXT:    [[TMP10:%.*]] = call fast float @llvm.trunc.f32(float [[TMP9]])
3663 ; CHECK-NEXT:    [[TMP11:%.*]] = fneg fast float [[TMP10]]
3664 ; CHECK-NEXT:    [[TMP12:%.*]] = call fast float @llvm.amdgcn.fmad.ftz.f32(float [[TMP11]], float [[TMP7]], float [[TMP6]])
3665 ; CHECK-NEXT:    [[TMP13:%.*]] = fptosi float [[TMP10]] to i32
3666 ; CHECK-NEXT:    [[TMP14:%.*]] = call fast float @llvm.fabs.f32(float [[TMP12]])
3667 ; CHECK-NEXT:    [[TMP15:%.*]] = call fast float @llvm.fabs.f32(float [[TMP7]])
3668 ; CHECK-NEXT:    [[TMP16:%.*]] = fcmp fast oge float [[TMP14]], [[TMP15]]
3669 ; CHECK-NEXT:    [[TMP17:%.*]] = select i1 [[TMP16]], i32 [[TMP5]], i32 0
3670 ; CHECK-NEXT:    [[TMP18:%.*]] = add i32 [[TMP13]], [[TMP17]]
3671 ; CHECK-NEXT:    [[TMP19:%.*]] = shl i32 [[TMP18]], 29
3672 ; CHECK-NEXT:    [[TMP20:%.*]] = ashr i32 [[TMP19]], 29
3673 ; CHECK-NEXT:    [[TMP21:%.*]] = trunc i32 [[TMP20]] to i3
3674 ; CHECK-NEXT:    store i3 [[TMP21]], ptr addrspace(1) [[OUT:%.*]], align 1
3675 ; CHECK-NEXT:    ret void
3677 ; GFX6-LABEL: sdiv_i3:
3678 ; GFX6:       ; %bb.0:
3679 ; GFX6-NEXT:    s_load_dword s4, s[0:1], 0xb
3680 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
3681 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
3682 ; GFX6-NEXT:    s_mov_b32 s2, -1
3683 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
3684 ; GFX6-NEXT:    s_bfe_i32 s5, s4, 0x30008
3685 ; GFX6-NEXT:    v_cvt_f32_i32_e32 v0, s5
3686 ; GFX6-NEXT:    s_bfe_i32 s4, s4, 0x30000
3687 ; GFX6-NEXT:    v_cvt_f32_i32_e32 v1, s4
3688 ; GFX6-NEXT:    s_xor_b32 s4, s4, s5
3689 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v2, v0
3690 ; GFX6-NEXT:    s_ashr_i32 s4, s4, 30
3691 ; GFX6-NEXT:    s_or_b32 s6, s4, 1
3692 ; GFX6-NEXT:    v_mul_f32_e32 v2, v1, v2
3693 ; GFX6-NEXT:    v_trunc_f32_e32 v2, v2
3694 ; GFX6-NEXT:    v_mad_f32 v1, -v2, v0, v1
3695 ; GFX6-NEXT:    v_cvt_i32_f32_e32 v2, v2
3696 ; GFX6-NEXT:    v_cmp_ge_f32_e64 s[4:5], |v1|, |v0|
3697 ; GFX6-NEXT:    s_and_b64 s[4:5], s[4:5], exec
3698 ; GFX6-NEXT:    s_cselect_b32 s4, s6, 0
3699 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, s4, v2
3700 ; GFX6-NEXT:    v_and_b32_e32 v0, 7, v0
3701 ; GFX6-NEXT:    buffer_store_byte v0, off, s[0:3], 0
3702 ; GFX6-NEXT:    s_endpgm
3704 ; GFX9-LABEL: sdiv_i3:
3705 ; GFX9:       ; %bb.0:
3706 ; GFX9-NEXT:    s_load_dword s4, s[0:1], 0x2c
3707 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
3708 ; GFX9-NEXT:    v_mov_b32_e32 v1, 0
3709 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
3710 ; GFX9-NEXT:    s_bfe_i32 s0, s4, 0x30008
3711 ; GFX9-NEXT:    v_cvt_f32_i32_e32 v0, s0
3712 ; GFX9-NEXT:    s_bfe_i32 s1, s4, 0x30000
3713 ; GFX9-NEXT:    v_cvt_f32_i32_e32 v2, s1
3714 ; GFX9-NEXT:    s_xor_b32 s0, s1, s0
3715 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v3, v0
3716 ; GFX9-NEXT:    s_ashr_i32 s0, s0, 30
3717 ; GFX9-NEXT:    s_or_b32 s4, s0, 1
3718 ; GFX9-NEXT:    v_mul_f32_e32 v3, v2, v3
3719 ; GFX9-NEXT:    v_trunc_f32_e32 v3, v3
3720 ; GFX9-NEXT:    v_mad_f32 v2, -v3, v0, v2
3721 ; GFX9-NEXT:    v_cvt_i32_f32_e32 v3, v3
3722 ; GFX9-NEXT:    v_cmp_ge_f32_e64 s[0:1], |v2|, |v0|
3723 ; GFX9-NEXT:    s_and_b64 s[0:1], s[0:1], exec
3724 ; GFX9-NEXT:    s_cselect_b32 s0, s4, 0
3725 ; GFX9-NEXT:    v_add_u32_e32 v0, s0, v3
3726 ; GFX9-NEXT:    v_and_b32_e32 v0, 7, v0
3727 ; GFX9-NEXT:    global_store_byte v1, v0, s[2:3]
3728 ; GFX9-NEXT:    s_endpgm
3729   %r = sdiv i3 %x, %y
3730   store i3 %r, ptr addrspace(1) %out
3731   ret void
3734 define amdgpu_kernel void @srem_i3(ptr addrspace(1) %out, i3 %x, i3 %y) {
3735 ; CHECK-LABEL: @srem_i3(
3736 ; CHECK-NEXT:    [[TMP1:%.*]] = sext i3 [[X:%.*]] to i32
3737 ; CHECK-NEXT:    [[TMP2:%.*]] = sext i3 [[Y:%.*]] to i32
3738 ; CHECK-NEXT:    [[TMP3:%.*]] = xor i32 [[TMP1]], [[TMP2]]
3739 ; CHECK-NEXT:    [[TMP4:%.*]] = ashr i32 [[TMP3]], 30
3740 ; CHECK-NEXT:    [[TMP5:%.*]] = or i32 [[TMP4]], 1
3741 ; CHECK-NEXT:    [[TMP6:%.*]] = sitofp i32 [[TMP1]] to float
3742 ; CHECK-NEXT:    [[TMP7:%.*]] = sitofp i32 [[TMP2]] to float
3743 ; CHECK-NEXT:    [[TMP8:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP7]])
3744 ; CHECK-NEXT:    [[TMP9:%.*]] = fmul fast float [[TMP6]], [[TMP8]]
3745 ; CHECK-NEXT:    [[TMP10:%.*]] = call fast float @llvm.trunc.f32(float [[TMP9]])
3746 ; CHECK-NEXT:    [[TMP11:%.*]] = fneg fast float [[TMP10]]
3747 ; CHECK-NEXT:    [[TMP12:%.*]] = call fast float @llvm.amdgcn.fmad.ftz.f32(float [[TMP11]], float [[TMP7]], float [[TMP6]])
3748 ; CHECK-NEXT:    [[TMP13:%.*]] = fptosi float [[TMP10]] to i32
3749 ; CHECK-NEXT:    [[TMP14:%.*]] = call fast float @llvm.fabs.f32(float [[TMP12]])
3750 ; CHECK-NEXT:    [[TMP15:%.*]] = call fast float @llvm.fabs.f32(float [[TMP7]])
3751 ; CHECK-NEXT:    [[TMP16:%.*]] = fcmp fast oge float [[TMP14]], [[TMP15]]
3752 ; CHECK-NEXT:    [[TMP17:%.*]] = select i1 [[TMP16]], i32 [[TMP5]], i32 0
3753 ; CHECK-NEXT:    [[TMP18:%.*]] = add i32 [[TMP13]], [[TMP17]]
3754 ; CHECK-NEXT:    [[TMP19:%.*]] = mul i32 [[TMP18]], [[TMP2]]
3755 ; CHECK-NEXT:    [[TMP20:%.*]] = sub i32 [[TMP1]], [[TMP19]]
3756 ; CHECK-NEXT:    [[TMP21:%.*]] = shl i32 [[TMP20]], 29
3757 ; CHECK-NEXT:    [[TMP22:%.*]] = ashr i32 [[TMP21]], 29
3758 ; CHECK-NEXT:    [[TMP23:%.*]] = trunc i32 [[TMP22]] to i3
3759 ; CHECK-NEXT:    store i3 [[TMP23]], ptr addrspace(1) [[OUT:%.*]], align 1
3760 ; CHECK-NEXT:    ret void
3762 ; GFX6-LABEL: srem_i3:
3763 ; GFX6:       ; %bb.0:
3764 ; GFX6-NEXT:    s_load_dword s4, s[0:1], 0xb
3765 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
3766 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
3767 ; GFX6-NEXT:    s_bfe_i32 s2, s4, 0x30008
3768 ; GFX6-NEXT:    v_cvt_f32_i32_e32 v0, s2
3769 ; GFX6-NEXT:    s_bfe_i32 s3, s4, 0x30000
3770 ; GFX6-NEXT:    v_cvt_f32_i32_e32 v1, s3
3771 ; GFX6-NEXT:    s_xor_b32 s2, s3, s2
3772 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v2, v0
3773 ; GFX6-NEXT:    s_ashr_i32 s2, s2, 30
3774 ; GFX6-NEXT:    s_lshr_b32 s5, s4, 8
3775 ; GFX6-NEXT:    s_or_b32 s6, s2, 1
3776 ; GFX6-NEXT:    v_mul_f32_e32 v2, v1, v2
3777 ; GFX6-NEXT:    v_trunc_f32_e32 v2, v2
3778 ; GFX6-NEXT:    v_mad_f32 v1, -v2, v0, v1
3779 ; GFX6-NEXT:    v_cvt_i32_f32_e32 v2, v2
3780 ; GFX6-NEXT:    v_cmp_ge_f32_e64 s[2:3], |v1|, |v0|
3781 ; GFX6-NEXT:    s_and_b64 s[2:3], s[2:3], exec
3782 ; GFX6-NEXT:    s_cselect_b32 s2, s6, 0
3783 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, s2, v2
3784 ; GFX6-NEXT:    v_mul_lo_u32 v0, v0, s5
3785 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
3786 ; GFX6-NEXT:    s_mov_b32 s2, -1
3787 ; GFX6-NEXT:    v_sub_i32_e32 v0, vcc, s4, v0
3788 ; GFX6-NEXT:    v_and_b32_e32 v0, 7, v0
3789 ; GFX6-NEXT:    buffer_store_byte v0, off, s[0:3], 0
3790 ; GFX6-NEXT:    s_endpgm
3792 ; GFX9-LABEL: srem_i3:
3793 ; GFX9:       ; %bb.0:
3794 ; GFX9-NEXT:    s_load_dword s4, s[0:1], 0x2c
3795 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
3796 ; GFX9-NEXT:    s_bfe_i32 s2, s4, 0x30008
3797 ; GFX9-NEXT:    v_cvt_f32_i32_e32 v0, s2
3798 ; GFX9-NEXT:    s_bfe_i32 s3, s4, 0x30000
3799 ; GFX9-NEXT:    v_cvt_f32_i32_e32 v1, s3
3800 ; GFX9-NEXT:    s_xor_b32 s2, s3, s2
3801 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v2, v0
3802 ; GFX9-NEXT:    s_ashr_i32 s2, s2, 30
3803 ; GFX9-NEXT:    s_lshr_b32 s5, s4, 8
3804 ; GFX9-NEXT:    s_or_b32 s6, s2, 1
3805 ; GFX9-NEXT:    v_mul_f32_e32 v2, v1, v2
3806 ; GFX9-NEXT:    v_trunc_f32_e32 v2, v2
3807 ; GFX9-NEXT:    v_mad_f32 v1, -v2, v0, v1
3808 ; GFX9-NEXT:    v_cvt_i32_f32_e32 v2, v2
3809 ; GFX9-NEXT:    v_cmp_ge_f32_e64 s[2:3], |v1|, |v0|
3810 ; GFX9-NEXT:    s_and_b64 s[2:3], s[2:3], exec
3811 ; GFX9-NEXT:    s_cselect_b32 s2, s6, 0
3812 ; GFX9-NEXT:    v_add_u32_e32 v0, s2, v2
3813 ; GFX9-NEXT:    v_mul_lo_u32 v0, v0, s5
3814 ; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
3815 ; GFX9-NEXT:    v_mov_b32_e32 v1, 0
3816 ; GFX9-NEXT:    v_sub_u32_e32 v0, s4, v0
3817 ; GFX9-NEXT:    v_and_b32_e32 v0, 7, v0
3818 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
3819 ; GFX9-NEXT:    global_store_byte v1, v0, s[0:1]
3820 ; GFX9-NEXT:    s_endpgm
3821   %r = srem i3 %x, %y
3822   store i3 %r, ptr addrspace(1) %out
3823   ret void
3826 define amdgpu_kernel void @udiv_v3i16(ptr addrspace(1) %out, <3 x i16> %x, <3 x i16> %y) {
3827 ; CHECK-LABEL: @udiv_v3i16(
3828 ; CHECK-NEXT:    [[TMP1:%.*]] = extractelement <3 x i16> [[X:%.*]], i64 0
3829 ; CHECK-NEXT:    [[TMP2:%.*]] = extractelement <3 x i16> [[Y:%.*]], i64 0
3830 ; CHECK-NEXT:    [[TMP3:%.*]] = zext i16 [[TMP1]] to i32
3831 ; CHECK-NEXT:    [[TMP4:%.*]] = zext i16 [[TMP2]] to i32
3832 ; CHECK-NEXT:    [[TMP5:%.*]] = uitofp i32 [[TMP3]] to float
3833 ; CHECK-NEXT:    [[TMP6:%.*]] = uitofp i32 [[TMP4]] to float
3834 ; CHECK-NEXT:    [[TMP7:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP6]])
3835 ; CHECK-NEXT:    [[TMP8:%.*]] = fmul fast float [[TMP5]], [[TMP7]]
3836 ; CHECK-NEXT:    [[TMP9:%.*]] = call fast float @llvm.trunc.f32(float [[TMP8]])
3837 ; CHECK-NEXT:    [[TMP10:%.*]] = fneg fast float [[TMP9]]
3838 ; CHECK-NEXT:    [[TMP11:%.*]] = call fast float @llvm.amdgcn.fmad.ftz.f32(float [[TMP10]], float [[TMP6]], float [[TMP5]])
3839 ; CHECK-NEXT:    [[TMP12:%.*]] = fptoui float [[TMP9]] to i32
3840 ; CHECK-NEXT:    [[TMP13:%.*]] = call fast float @llvm.fabs.f32(float [[TMP11]])
3841 ; CHECK-NEXT:    [[TMP14:%.*]] = call fast float @llvm.fabs.f32(float [[TMP6]])
3842 ; CHECK-NEXT:    [[TMP15:%.*]] = fcmp fast oge float [[TMP13]], [[TMP14]]
3843 ; CHECK-NEXT:    [[TMP16:%.*]] = select i1 [[TMP15]], i32 1, i32 0
3844 ; CHECK-NEXT:    [[TMP17:%.*]] = add i32 [[TMP12]], [[TMP16]]
3845 ; CHECK-NEXT:    [[TMP18:%.*]] = and i32 [[TMP17]], 65535
3846 ; CHECK-NEXT:    [[TMP19:%.*]] = trunc i32 [[TMP18]] to i16
3847 ; CHECK-NEXT:    [[TMP20:%.*]] = insertelement <3 x i16> poison, i16 [[TMP19]], i64 0
3848 ; CHECK-NEXT:    [[TMP21:%.*]] = extractelement <3 x i16> [[X]], i64 1
3849 ; CHECK-NEXT:    [[TMP22:%.*]] = extractelement <3 x i16> [[Y]], i64 1
3850 ; CHECK-NEXT:    [[TMP23:%.*]] = zext i16 [[TMP21]] to i32
3851 ; CHECK-NEXT:    [[TMP24:%.*]] = zext i16 [[TMP22]] to i32
3852 ; CHECK-NEXT:    [[TMP25:%.*]] = uitofp i32 [[TMP23]] to float
3853 ; CHECK-NEXT:    [[TMP26:%.*]] = uitofp i32 [[TMP24]] to float
3854 ; CHECK-NEXT:    [[TMP27:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP26]])
3855 ; CHECK-NEXT:    [[TMP28:%.*]] = fmul fast float [[TMP25]], [[TMP27]]
3856 ; CHECK-NEXT:    [[TMP29:%.*]] = call fast float @llvm.trunc.f32(float [[TMP28]])
3857 ; CHECK-NEXT:    [[TMP30:%.*]] = fneg fast float [[TMP29]]
3858 ; CHECK-NEXT:    [[TMP31:%.*]] = call fast float @llvm.amdgcn.fmad.ftz.f32(float [[TMP30]], float [[TMP26]], float [[TMP25]])
3859 ; CHECK-NEXT:    [[TMP32:%.*]] = fptoui float [[TMP29]] to i32
3860 ; CHECK-NEXT:    [[TMP33:%.*]] = call fast float @llvm.fabs.f32(float [[TMP31]])
3861 ; CHECK-NEXT:    [[TMP34:%.*]] = call fast float @llvm.fabs.f32(float [[TMP26]])
3862 ; CHECK-NEXT:    [[TMP35:%.*]] = fcmp fast oge float [[TMP33]], [[TMP34]]
3863 ; CHECK-NEXT:    [[TMP36:%.*]] = select i1 [[TMP35]], i32 1, i32 0
3864 ; CHECK-NEXT:    [[TMP37:%.*]] = add i32 [[TMP32]], [[TMP36]]
3865 ; CHECK-NEXT:    [[TMP38:%.*]] = and i32 [[TMP37]], 65535
3866 ; CHECK-NEXT:    [[TMP39:%.*]] = trunc i32 [[TMP38]] to i16
3867 ; CHECK-NEXT:    [[TMP40:%.*]] = insertelement <3 x i16> [[TMP20]], i16 [[TMP39]], i64 1
3868 ; CHECK-NEXT:    [[TMP41:%.*]] = extractelement <3 x i16> [[X]], i64 2
3869 ; CHECK-NEXT:    [[TMP42:%.*]] = extractelement <3 x i16> [[Y]], i64 2
3870 ; CHECK-NEXT:    [[TMP43:%.*]] = zext i16 [[TMP41]] to i32
3871 ; CHECK-NEXT:    [[TMP44:%.*]] = zext i16 [[TMP42]] to i32
3872 ; CHECK-NEXT:    [[TMP45:%.*]] = uitofp i32 [[TMP43]] to float
3873 ; CHECK-NEXT:    [[TMP46:%.*]] = uitofp i32 [[TMP44]] to float
3874 ; CHECK-NEXT:    [[TMP47:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP46]])
3875 ; CHECK-NEXT:    [[TMP48:%.*]] = fmul fast float [[TMP45]], [[TMP47]]
3876 ; CHECK-NEXT:    [[TMP49:%.*]] = call fast float @llvm.trunc.f32(float [[TMP48]])
3877 ; CHECK-NEXT:    [[TMP50:%.*]] = fneg fast float [[TMP49]]
3878 ; CHECK-NEXT:    [[TMP51:%.*]] = call fast float @llvm.amdgcn.fmad.ftz.f32(float [[TMP50]], float [[TMP46]], float [[TMP45]])
3879 ; CHECK-NEXT:    [[TMP52:%.*]] = fptoui float [[TMP49]] to i32
3880 ; CHECK-NEXT:    [[TMP53:%.*]] = call fast float @llvm.fabs.f32(float [[TMP51]])
3881 ; CHECK-NEXT:    [[TMP54:%.*]] = call fast float @llvm.fabs.f32(float [[TMP46]])
3882 ; CHECK-NEXT:    [[TMP55:%.*]] = fcmp fast oge float [[TMP53]], [[TMP54]]
3883 ; CHECK-NEXT:    [[TMP56:%.*]] = select i1 [[TMP55]], i32 1, i32 0
3884 ; CHECK-NEXT:    [[TMP57:%.*]] = add i32 [[TMP52]], [[TMP56]]
3885 ; CHECK-NEXT:    [[TMP58:%.*]] = and i32 [[TMP57]], 65535
3886 ; CHECK-NEXT:    [[TMP59:%.*]] = trunc i32 [[TMP58]] to i16
3887 ; CHECK-NEXT:    [[TMP60:%.*]] = insertelement <3 x i16> [[TMP40]], i16 [[TMP59]], i64 2
3888 ; CHECK-NEXT:    store <3 x i16> [[TMP60]], ptr addrspace(1) [[OUT:%.*]], align 8
3889 ; CHECK-NEXT:    ret void
3891 ; GFX6-LABEL: udiv_v3i16:
3892 ; GFX6:       ; %bb.0:
3893 ; GFX6-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0xb
3894 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
3895 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
3896 ; GFX6-NEXT:    s_mov_b32 s2, -1
3897 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
3898 ; GFX6-NEXT:    s_and_b32 s9, s6, 0xffff
3899 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v0, s9
3900 ; GFX6-NEXT:    s_lshr_b32 s6, s6, 16
3901 ; GFX6-NEXT:    s_and_b32 s8, s4, 0xffff
3902 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v2, s6
3903 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v1, s8
3904 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v3, v0
3905 ; GFX6-NEXT:    s_lshr_b32 s4, s4, 16
3906 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v4, s4
3907 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v5, v2
3908 ; GFX6-NEXT:    v_mul_f32_e32 v3, v1, v3
3909 ; GFX6-NEXT:    v_trunc_f32_e32 v3, v3
3910 ; GFX6-NEXT:    v_mad_f32 v1, -v3, v0, v1
3911 ; GFX6-NEXT:    v_cmp_ge_f32_e64 vcc, |v1|, v0
3912 ; GFX6-NEXT:    v_mul_f32_e32 v1, v4, v5
3913 ; GFX6-NEXT:    v_trunc_f32_e32 v1, v1
3914 ; GFX6-NEXT:    s_and_b32 s4, s7, 0xffff
3915 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v6, v3
3916 ; GFX6-NEXT:    v_mad_f32 v3, -v1, v2, v4
3917 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v4, s4
3918 ; GFX6-NEXT:    s_and_b32 s4, s5, 0xffff
3919 ; GFX6-NEXT:    v_addc_u32_e32 v0, vcc, 0, v6, vcc
3920 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v5, s4
3921 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v6, v4
3922 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v1, v1
3923 ; GFX6-NEXT:    v_cmp_ge_f32_e64 vcc, |v3|, v2
3924 ; GFX6-NEXT:    v_and_b32_e32 v0, 0xffff, v0
3925 ; GFX6-NEXT:    v_mul_f32_e32 v2, v5, v6
3926 ; GFX6-NEXT:    v_trunc_f32_e32 v2, v2
3927 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v3, v2
3928 ; GFX6-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
3929 ; GFX6-NEXT:    v_mad_f32 v2, -v2, v4, v5
3930 ; GFX6-NEXT:    v_cmp_ge_f32_e64 vcc, |v2|, v4
3931 ; GFX6-NEXT:    v_addc_u32_e32 v2, vcc, 0, v3, vcc
3932 ; GFX6-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
3933 ; GFX6-NEXT:    v_or_b32_e32 v0, v0, v1
3934 ; GFX6-NEXT:    buffer_store_short v2, off, s[0:3], 0 offset:4
3935 ; GFX6-NEXT:    buffer_store_dword v0, off, s[0:3], 0
3936 ; GFX6-NEXT:    s_endpgm
3938 ; GFX9-LABEL: udiv_v3i16:
3939 ; GFX9:       ; %bb.0:
3940 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x2c
3941 ; GFX9-NEXT:    v_mov_b32_e32 v6, 0
3942 ; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
3943 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
3944 ; GFX9-NEXT:    s_and_b32 s3, s6, 0xffff
3945 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v0, s3
3946 ; GFX9-NEXT:    s_and_b32 s2, s4, 0xffff
3947 ; GFX9-NEXT:    s_lshr_b32 s6, s6, 16
3948 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v1, s6
3949 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v2, s2
3950 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v4, v0
3951 ; GFX9-NEXT:    s_lshr_b32 s4, s4, 16
3952 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v3, s4
3953 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v5, v1
3954 ; GFX9-NEXT:    v_mul_f32_e32 v4, v2, v4
3955 ; GFX9-NEXT:    v_trunc_f32_e32 v4, v4
3956 ; GFX9-NEXT:    s_and_b32 s2, s7, 0xffff
3957 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v7, v4
3958 ; GFX9-NEXT:    v_mad_f32 v2, -v4, v0, v2
3959 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v4, s2
3960 ; GFX9-NEXT:    v_mul_f32_e32 v5, v3, v5
3961 ; GFX9-NEXT:    v_cmp_ge_f32_e64 vcc, |v2|, v0
3962 ; GFX9-NEXT:    v_trunc_f32_e32 v2, v5
3963 ; GFX9-NEXT:    s_and_b32 s2, s5, 0xffff
3964 ; GFX9-NEXT:    v_addc_co_u32_e32 v0, vcc, 0, v7, vcc
3965 ; GFX9-NEXT:    v_mad_f32 v3, -v2, v1, v3
3966 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v2, v2
3967 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v5, s2
3968 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v7, v4
3969 ; GFX9-NEXT:    v_cmp_ge_f32_e64 vcc, |v3|, v1
3970 ; GFX9-NEXT:    v_addc_co_u32_e32 v1, vcc, 0, v2, vcc
3971 ; GFX9-NEXT:    v_mul_f32_e32 v2, v5, v7
3972 ; GFX9-NEXT:    v_trunc_f32_e32 v2, v2
3973 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v3, v2
3974 ; GFX9-NEXT:    v_mad_f32 v2, -v2, v4, v5
3975 ; GFX9-NEXT:    v_cmp_ge_f32_e64 vcc, |v2|, v4
3976 ; GFX9-NEXT:    v_and_b32_e32 v0, 0xffff, v0
3977 ; GFX9-NEXT:    v_addc_co_u32_e32 v2, vcc, 0, v3, vcc
3978 ; GFX9-NEXT:    v_lshl_or_b32 v0, v1, 16, v0
3979 ; GFX9-NEXT:    global_store_short v6, v2, s[0:1] offset:4
3980 ; GFX9-NEXT:    global_store_dword v6, v0, s[0:1]
3981 ; GFX9-NEXT:    s_endpgm
3982   %r = udiv <3 x i16> %x, %y
3983   store <3 x i16> %r, ptr addrspace(1) %out
3984   ret void
3987 define amdgpu_kernel void @urem_v3i16(ptr addrspace(1) %out, <3 x i16> %x, <3 x i16> %y) {
3988 ; CHECK-LABEL: @urem_v3i16(
3989 ; CHECK-NEXT:    [[TMP1:%.*]] = extractelement <3 x i16> [[X:%.*]], i64 0
3990 ; CHECK-NEXT:    [[TMP2:%.*]] = extractelement <3 x i16> [[Y:%.*]], i64 0
3991 ; CHECK-NEXT:    [[TMP3:%.*]] = zext i16 [[TMP1]] to i32
3992 ; CHECK-NEXT:    [[TMP4:%.*]] = zext i16 [[TMP2]] to i32
3993 ; CHECK-NEXT:    [[TMP5:%.*]] = uitofp i32 [[TMP3]] to float
3994 ; CHECK-NEXT:    [[TMP6:%.*]] = uitofp i32 [[TMP4]] to float
3995 ; CHECK-NEXT:    [[TMP7:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP6]])
3996 ; CHECK-NEXT:    [[TMP8:%.*]] = fmul fast float [[TMP5]], [[TMP7]]
3997 ; CHECK-NEXT:    [[TMP9:%.*]] = call fast float @llvm.trunc.f32(float [[TMP8]])
3998 ; CHECK-NEXT:    [[TMP10:%.*]] = fneg fast float [[TMP9]]
3999 ; CHECK-NEXT:    [[TMP11:%.*]] = call fast float @llvm.amdgcn.fmad.ftz.f32(float [[TMP10]], float [[TMP6]], float [[TMP5]])
4000 ; CHECK-NEXT:    [[TMP12:%.*]] = fptoui float [[TMP9]] to i32
4001 ; CHECK-NEXT:    [[TMP13:%.*]] = call fast float @llvm.fabs.f32(float [[TMP11]])
4002 ; CHECK-NEXT:    [[TMP14:%.*]] = call fast float @llvm.fabs.f32(float [[TMP6]])
4003 ; CHECK-NEXT:    [[TMP15:%.*]] = fcmp fast oge float [[TMP13]], [[TMP14]]
4004 ; CHECK-NEXT:    [[TMP16:%.*]] = select i1 [[TMP15]], i32 1, i32 0
4005 ; CHECK-NEXT:    [[TMP17:%.*]] = add i32 [[TMP12]], [[TMP16]]
4006 ; CHECK-NEXT:    [[TMP18:%.*]] = mul i32 [[TMP17]], [[TMP4]]
4007 ; CHECK-NEXT:    [[TMP19:%.*]] = sub i32 [[TMP3]], [[TMP18]]
4008 ; CHECK-NEXT:    [[TMP20:%.*]] = and i32 [[TMP19]], 65535
4009 ; CHECK-NEXT:    [[TMP21:%.*]] = trunc i32 [[TMP20]] to i16
4010 ; CHECK-NEXT:    [[TMP22:%.*]] = insertelement <3 x i16> poison, i16 [[TMP21]], i64 0
4011 ; CHECK-NEXT:    [[TMP23:%.*]] = extractelement <3 x i16> [[X]], i64 1
4012 ; CHECK-NEXT:    [[TMP24:%.*]] = extractelement <3 x i16> [[Y]], i64 1
4013 ; CHECK-NEXT:    [[TMP25:%.*]] = zext i16 [[TMP23]] to i32
4014 ; CHECK-NEXT:    [[TMP26:%.*]] = zext i16 [[TMP24]] to i32
4015 ; CHECK-NEXT:    [[TMP27:%.*]] = uitofp i32 [[TMP25]] to float
4016 ; CHECK-NEXT:    [[TMP28:%.*]] = uitofp i32 [[TMP26]] to float
4017 ; CHECK-NEXT:    [[TMP29:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP28]])
4018 ; CHECK-NEXT:    [[TMP30:%.*]] = fmul fast float [[TMP27]], [[TMP29]]
4019 ; CHECK-NEXT:    [[TMP31:%.*]] = call fast float @llvm.trunc.f32(float [[TMP30]])
4020 ; CHECK-NEXT:    [[TMP32:%.*]] = fneg fast float [[TMP31]]
4021 ; CHECK-NEXT:    [[TMP33:%.*]] = call fast float @llvm.amdgcn.fmad.ftz.f32(float [[TMP32]], float [[TMP28]], float [[TMP27]])
4022 ; CHECK-NEXT:    [[TMP34:%.*]] = fptoui float [[TMP31]] to i32
4023 ; CHECK-NEXT:    [[TMP35:%.*]] = call fast float @llvm.fabs.f32(float [[TMP33]])
4024 ; CHECK-NEXT:    [[TMP36:%.*]] = call fast float @llvm.fabs.f32(float [[TMP28]])
4025 ; CHECK-NEXT:    [[TMP37:%.*]] = fcmp fast oge float [[TMP35]], [[TMP36]]
4026 ; CHECK-NEXT:    [[TMP38:%.*]] = select i1 [[TMP37]], i32 1, i32 0
4027 ; CHECK-NEXT:    [[TMP39:%.*]] = add i32 [[TMP34]], [[TMP38]]
4028 ; CHECK-NEXT:    [[TMP40:%.*]] = mul i32 [[TMP39]], [[TMP26]]
4029 ; CHECK-NEXT:    [[TMP41:%.*]] = sub i32 [[TMP25]], [[TMP40]]
4030 ; CHECK-NEXT:    [[TMP42:%.*]] = and i32 [[TMP41]], 65535
4031 ; CHECK-NEXT:    [[TMP43:%.*]] = trunc i32 [[TMP42]] to i16
4032 ; CHECK-NEXT:    [[TMP44:%.*]] = insertelement <3 x i16> [[TMP22]], i16 [[TMP43]], i64 1
4033 ; CHECK-NEXT:    [[TMP45:%.*]] = extractelement <3 x i16> [[X]], i64 2
4034 ; CHECK-NEXT:    [[TMP46:%.*]] = extractelement <3 x i16> [[Y]], i64 2
4035 ; CHECK-NEXT:    [[TMP47:%.*]] = zext i16 [[TMP45]] to i32
4036 ; CHECK-NEXT:    [[TMP48:%.*]] = zext i16 [[TMP46]] to i32
4037 ; CHECK-NEXT:    [[TMP49:%.*]] = uitofp i32 [[TMP47]] to float
4038 ; CHECK-NEXT:    [[TMP50:%.*]] = uitofp i32 [[TMP48]] to float
4039 ; CHECK-NEXT:    [[TMP51:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP50]])
4040 ; CHECK-NEXT:    [[TMP52:%.*]] = fmul fast float [[TMP49]], [[TMP51]]
4041 ; CHECK-NEXT:    [[TMP53:%.*]] = call fast float @llvm.trunc.f32(float [[TMP52]])
4042 ; CHECK-NEXT:    [[TMP54:%.*]] = fneg fast float [[TMP53]]
4043 ; CHECK-NEXT:    [[TMP55:%.*]] = call fast float @llvm.amdgcn.fmad.ftz.f32(float [[TMP54]], float [[TMP50]], float [[TMP49]])
4044 ; CHECK-NEXT:    [[TMP56:%.*]] = fptoui float [[TMP53]] to i32
4045 ; CHECK-NEXT:    [[TMP57:%.*]] = call fast float @llvm.fabs.f32(float [[TMP55]])
4046 ; CHECK-NEXT:    [[TMP58:%.*]] = call fast float @llvm.fabs.f32(float [[TMP50]])
4047 ; CHECK-NEXT:    [[TMP59:%.*]] = fcmp fast oge float [[TMP57]], [[TMP58]]
4048 ; CHECK-NEXT:    [[TMP60:%.*]] = select i1 [[TMP59]], i32 1, i32 0
4049 ; CHECK-NEXT:    [[TMP61:%.*]] = add i32 [[TMP56]], [[TMP60]]
4050 ; CHECK-NEXT:    [[TMP62:%.*]] = mul i32 [[TMP61]], [[TMP48]]
4051 ; CHECK-NEXT:    [[TMP63:%.*]] = sub i32 [[TMP47]], [[TMP62]]
4052 ; CHECK-NEXT:    [[TMP64:%.*]] = and i32 [[TMP63]], 65535
4053 ; CHECK-NEXT:    [[TMP65:%.*]] = trunc i32 [[TMP64]] to i16
4054 ; CHECK-NEXT:    [[TMP66:%.*]] = insertelement <3 x i16> [[TMP44]], i16 [[TMP65]], i64 2
4055 ; CHECK-NEXT:    store <3 x i16> [[TMP66]], ptr addrspace(1) [[OUT:%.*]], align 8
4056 ; CHECK-NEXT:    ret void
4058 ; GFX6-LABEL: urem_v3i16:
4059 ; GFX6:       ; %bb.0:
4060 ; GFX6-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0xb
4061 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
4062 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
4063 ; GFX6-NEXT:    s_mov_b32 s2, -1
4064 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
4065 ; GFX6-NEXT:    s_and_b32 s9, s6, 0xffff
4066 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v0, s9
4067 ; GFX6-NEXT:    s_and_b32 s8, s4, 0xffff
4068 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v1, s8
4069 ; GFX6-NEXT:    s_lshr_b32 s9, s6, 16
4070 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v3, v0
4071 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v2, s9
4072 ; GFX6-NEXT:    s_lshr_b32 s8, s4, 16
4073 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v4, s8
4074 ; GFX6-NEXT:    v_mul_f32_e32 v3, v1, v3
4075 ; GFX6-NEXT:    v_trunc_f32_e32 v3, v3
4076 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v6, v3
4077 ; GFX6-NEXT:    v_mad_f32 v1, -v3, v0, v1
4078 ; GFX6-NEXT:    v_cmp_ge_f32_e64 vcc, |v1|, v0
4079 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v5, v2
4080 ; GFX6-NEXT:    v_addc_u32_e32 v0, vcc, 0, v6, vcc
4081 ; GFX6-NEXT:    v_mul_lo_u32 v0, v0, s6
4082 ; GFX6-NEXT:    v_mul_f32_e32 v1, v4, v5
4083 ; GFX6-NEXT:    v_trunc_f32_e32 v1, v1
4084 ; GFX6-NEXT:    v_mad_f32 v3, -v1, v2, v4
4085 ; GFX6-NEXT:    v_sub_i32_e32 v0, vcc, s4, v0
4086 ; GFX6-NEXT:    s_and_b32 s4, s7, 0xffff
4087 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v4, s4
4088 ; GFX6-NEXT:    s_and_b32 s4, s5, 0xffff
4089 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v5, s4
4090 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v1, v1
4091 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v6, v4
4092 ; GFX6-NEXT:    v_cmp_ge_f32_e64 vcc, |v3|, v2
4093 ; GFX6-NEXT:    v_and_b32_e32 v0, 0xffff, v0
4094 ; GFX6-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
4095 ; GFX6-NEXT:    v_mul_f32_e32 v2, v5, v6
4096 ; GFX6-NEXT:    v_trunc_f32_e32 v2, v2
4097 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v3, v2
4098 ; GFX6-NEXT:    v_mad_f32 v2, -v2, v4, v5
4099 ; GFX6-NEXT:    v_cmp_ge_f32_e64 vcc, |v2|, v4
4100 ; GFX6-NEXT:    v_mul_lo_u32 v1, v1, s9
4101 ; GFX6-NEXT:    v_addc_u32_e32 v2, vcc, 0, v3, vcc
4102 ; GFX6-NEXT:    v_mul_lo_u32 v2, v2, s7
4103 ; GFX6-NEXT:    v_sub_i32_e32 v1, vcc, s8, v1
4104 ; GFX6-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
4105 ; GFX6-NEXT:    v_sub_i32_e32 v2, vcc, s5, v2
4106 ; GFX6-NEXT:    v_or_b32_e32 v0, v0, v1
4107 ; GFX6-NEXT:    buffer_store_short v2, off, s[0:3], 0 offset:4
4108 ; GFX6-NEXT:    buffer_store_dword v0, off, s[0:3], 0
4109 ; GFX6-NEXT:    s_endpgm
4111 ; GFX9-LABEL: urem_v3i16:
4112 ; GFX9:       ; %bb.0:
4113 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x2c
4114 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
4115 ; GFX9-NEXT:    s_and_b32 s3, s6, 0xffff
4116 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v0, s3
4117 ; GFX9-NEXT:    s_and_b32 s2, s4, 0xffff
4118 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v2, s2
4119 ; GFX9-NEXT:    s_lshr_b32 s6, s6, 16
4120 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v4, v0
4121 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v1, s6
4122 ; GFX9-NEXT:    s_lshr_b32 s4, s4, 16
4123 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v3, s4
4124 ; GFX9-NEXT:    v_mul_f32_e32 v4, v2, v4
4125 ; GFX9-NEXT:    v_trunc_f32_e32 v4, v4
4126 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v5, v1
4127 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v6, v4
4128 ; GFX9-NEXT:    v_mad_f32 v2, -v4, v0, v2
4129 ; GFX9-NEXT:    v_cmp_ge_f32_e64 vcc, |v2|, v0
4130 ; GFX9-NEXT:    v_mul_f32_e32 v5, v3, v5
4131 ; GFX9-NEXT:    v_addc_co_u32_e32 v0, vcc, 0, v6, vcc
4132 ; GFX9-NEXT:    v_trunc_f32_e32 v5, v5
4133 ; GFX9-NEXT:    v_mul_lo_u32 v0, v0, s3
4134 ; GFX9-NEXT:    s_and_b32 s3, s7, 0xffff
4135 ; GFX9-NEXT:    v_mad_f32 v2, -v5, v1, v3
4136 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v3, s3
4137 ; GFX9-NEXT:    s_and_b32 s5, s5, 0xffff
4138 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v4, v5
4139 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v5, s5
4140 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v6, v3
4141 ; GFX9-NEXT:    v_cmp_ge_f32_e64 vcc, |v2|, v1
4142 ; GFX9-NEXT:    v_addc_co_u32_e32 v1, vcc, 0, v4, vcc
4143 ; GFX9-NEXT:    v_mul_f32_e32 v2, v5, v6
4144 ; GFX9-NEXT:    v_trunc_f32_e32 v2, v2
4145 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v4, v2
4146 ; GFX9-NEXT:    v_mad_f32 v2, -v2, v3, v5
4147 ; GFX9-NEXT:    v_cmp_ge_f32_e64 vcc, |v2|, v3
4148 ; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
4149 ; GFX9-NEXT:    v_addc_co_u32_e32 v2, vcc, 0, v4, vcc
4150 ; GFX9-NEXT:    v_mul_lo_u32 v1, v1, s6
4151 ; GFX9-NEXT:    v_mul_lo_u32 v2, v2, s3
4152 ; GFX9-NEXT:    v_sub_u32_e32 v0, s2, v0
4153 ; GFX9-NEXT:    v_mov_b32_e32 v3, 0
4154 ; GFX9-NEXT:    v_sub_u32_e32 v1, s4, v1
4155 ; GFX9-NEXT:    v_sub_u32_e32 v2, s5, v2
4156 ; GFX9-NEXT:    v_and_b32_e32 v0, 0xffff, v0
4157 ; GFX9-NEXT:    v_lshl_or_b32 v0, v1, 16, v0
4158 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
4159 ; GFX9-NEXT:    global_store_short v3, v2, s[0:1] offset:4
4160 ; GFX9-NEXT:    global_store_dword v3, v0, s[0:1]
4161 ; GFX9-NEXT:    s_endpgm
4162   %r = urem <3 x i16> %x, %y
4163   store <3 x i16> %r, ptr addrspace(1) %out
4164   ret void
4167 define amdgpu_kernel void @sdiv_v3i16(ptr addrspace(1) %out, <3 x i16> %x, <3 x i16> %y) {
4168 ; CHECK-LABEL: @sdiv_v3i16(
4169 ; CHECK-NEXT:    [[TMP1:%.*]] = extractelement <3 x i16> [[X:%.*]], i64 0
4170 ; CHECK-NEXT:    [[TMP2:%.*]] = extractelement <3 x i16> [[Y:%.*]], i64 0
4171 ; CHECK-NEXT:    [[TMP3:%.*]] = sext i16 [[TMP1]] to i32
4172 ; CHECK-NEXT:    [[TMP4:%.*]] = sext i16 [[TMP2]] to i32
4173 ; CHECK-NEXT:    [[TMP5:%.*]] = xor i32 [[TMP3]], [[TMP4]]
4174 ; CHECK-NEXT:    [[TMP6:%.*]] = ashr i32 [[TMP5]], 30
4175 ; CHECK-NEXT:    [[TMP7:%.*]] = or i32 [[TMP6]], 1
4176 ; CHECK-NEXT:    [[TMP8:%.*]] = sitofp i32 [[TMP3]] to float
4177 ; CHECK-NEXT:    [[TMP9:%.*]] = sitofp i32 [[TMP4]] to float
4178 ; CHECK-NEXT:    [[TMP10:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP9]])
4179 ; CHECK-NEXT:    [[TMP11:%.*]] = fmul fast float [[TMP8]], [[TMP10]]
4180 ; CHECK-NEXT:    [[TMP12:%.*]] = call fast float @llvm.trunc.f32(float [[TMP11]])
4181 ; CHECK-NEXT:    [[TMP13:%.*]] = fneg fast float [[TMP12]]
4182 ; CHECK-NEXT:    [[TMP14:%.*]] = call fast float @llvm.amdgcn.fmad.ftz.f32(float [[TMP13]], float [[TMP9]], float [[TMP8]])
4183 ; CHECK-NEXT:    [[TMP15:%.*]] = fptosi float [[TMP12]] to i32
4184 ; CHECK-NEXT:    [[TMP16:%.*]] = call fast float @llvm.fabs.f32(float [[TMP14]])
4185 ; CHECK-NEXT:    [[TMP17:%.*]] = call fast float @llvm.fabs.f32(float [[TMP9]])
4186 ; CHECK-NEXT:    [[TMP18:%.*]] = fcmp fast oge float [[TMP16]], [[TMP17]]
4187 ; CHECK-NEXT:    [[TMP19:%.*]] = select i1 [[TMP18]], i32 [[TMP7]], i32 0
4188 ; CHECK-NEXT:    [[TMP20:%.*]] = add i32 [[TMP15]], [[TMP19]]
4189 ; CHECK-NEXT:    [[TMP21:%.*]] = shl i32 [[TMP20]], 16
4190 ; CHECK-NEXT:    [[TMP22:%.*]] = ashr i32 [[TMP21]], 16
4191 ; CHECK-NEXT:    [[TMP23:%.*]] = trunc i32 [[TMP22]] to i16
4192 ; CHECK-NEXT:    [[TMP24:%.*]] = insertelement <3 x i16> poison, i16 [[TMP23]], i64 0
4193 ; CHECK-NEXT:    [[TMP25:%.*]] = extractelement <3 x i16> [[X]], i64 1
4194 ; CHECK-NEXT:    [[TMP26:%.*]] = extractelement <3 x i16> [[Y]], i64 1
4195 ; CHECK-NEXT:    [[TMP27:%.*]] = sext i16 [[TMP25]] to i32
4196 ; CHECK-NEXT:    [[TMP28:%.*]] = sext i16 [[TMP26]] to i32
4197 ; CHECK-NEXT:    [[TMP29:%.*]] = xor i32 [[TMP27]], [[TMP28]]
4198 ; CHECK-NEXT:    [[TMP30:%.*]] = ashr i32 [[TMP29]], 30
4199 ; CHECK-NEXT:    [[TMP31:%.*]] = or i32 [[TMP30]], 1
4200 ; CHECK-NEXT:    [[TMP32:%.*]] = sitofp i32 [[TMP27]] to float
4201 ; CHECK-NEXT:    [[TMP33:%.*]] = sitofp i32 [[TMP28]] to float
4202 ; CHECK-NEXT:    [[TMP34:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP33]])
4203 ; CHECK-NEXT:    [[TMP35:%.*]] = fmul fast float [[TMP32]], [[TMP34]]
4204 ; CHECK-NEXT:    [[TMP36:%.*]] = call fast float @llvm.trunc.f32(float [[TMP35]])
4205 ; CHECK-NEXT:    [[TMP37:%.*]] = fneg fast float [[TMP36]]
4206 ; CHECK-NEXT:    [[TMP38:%.*]] = call fast float @llvm.amdgcn.fmad.ftz.f32(float [[TMP37]], float [[TMP33]], float [[TMP32]])
4207 ; CHECK-NEXT:    [[TMP39:%.*]] = fptosi float [[TMP36]] to i32
4208 ; CHECK-NEXT:    [[TMP40:%.*]] = call fast float @llvm.fabs.f32(float [[TMP38]])
4209 ; CHECK-NEXT:    [[TMP41:%.*]] = call fast float @llvm.fabs.f32(float [[TMP33]])
4210 ; CHECK-NEXT:    [[TMP42:%.*]] = fcmp fast oge float [[TMP40]], [[TMP41]]
4211 ; CHECK-NEXT:    [[TMP43:%.*]] = select i1 [[TMP42]], i32 [[TMP31]], i32 0
4212 ; CHECK-NEXT:    [[TMP44:%.*]] = add i32 [[TMP39]], [[TMP43]]
4213 ; CHECK-NEXT:    [[TMP45:%.*]] = shl i32 [[TMP44]], 16
4214 ; CHECK-NEXT:    [[TMP46:%.*]] = ashr i32 [[TMP45]], 16
4215 ; CHECK-NEXT:    [[TMP47:%.*]] = trunc i32 [[TMP46]] to i16
4216 ; CHECK-NEXT:    [[TMP48:%.*]] = insertelement <3 x i16> [[TMP24]], i16 [[TMP47]], i64 1
4217 ; CHECK-NEXT:    [[TMP49:%.*]] = extractelement <3 x i16> [[X]], i64 2
4218 ; CHECK-NEXT:    [[TMP50:%.*]] = extractelement <3 x i16> [[Y]], i64 2
4219 ; CHECK-NEXT:    [[TMP51:%.*]] = sext i16 [[TMP49]] to i32
4220 ; CHECK-NEXT:    [[TMP52:%.*]] = sext i16 [[TMP50]] to i32
4221 ; CHECK-NEXT:    [[TMP53:%.*]] = xor i32 [[TMP51]], [[TMP52]]
4222 ; CHECK-NEXT:    [[TMP54:%.*]] = ashr i32 [[TMP53]], 30
4223 ; CHECK-NEXT:    [[TMP55:%.*]] = or i32 [[TMP54]], 1
4224 ; CHECK-NEXT:    [[TMP56:%.*]] = sitofp i32 [[TMP51]] to float
4225 ; CHECK-NEXT:    [[TMP57:%.*]] = sitofp i32 [[TMP52]] to float
4226 ; CHECK-NEXT:    [[TMP58:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP57]])
4227 ; CHECK-NEXT:    [[TMP59:%.*]] = fmul fast float [[TMP56]], [[TMP58]]
4228 ; CHECK-NEXT:    [[TMP60:%.*]] = call fast float @llvm.trunc.f32(float [[TMP59]])
4229 ; CHECK-NEXT:    [[TMP61:%.*]] = fneg fast float [[TMP60]]
4230 ; CHECK-NEXT:    [[TMP62:%.*]] = call fast float @llvm.amdgcn.fmad.ftz.f32(float [[TMP61]], float [[TMP57]], float [[TMP56]])
4231 ; CHECK-NEXT:    [[TMP63:%.*]] = fptosi float [[TMP60]] to i32
4232 ; CHECK-NEXT:    [[TMP64:%.*]] = call fast float @llvm.fabs.f32(float [[TMP62]])
4233 ; CHECK-NEXT:    [[TMP65:%.*]] = call fast float @llvm.fabs.f32(float [[TMP57]])
4234 ; CHECK-NEXT:    [[TMP66:%.*]] = fcmp fast oge float [[TMP64]], [[TMP65]]
4235 ; CHECK-NEXT:    [[TMP67:%.*]] = select i1 [[TMP66]], i32 [[TMP55]], i32 0
4236 ; CHECK-NEXT:    [[TMP68:%.*]] = add i32 [[TMP63]], [[TMP67]]
4237 ; CHECK-NEXT:    [[TMP69:%.*]] = shl i32 [[TMP68]], 16
4238 ; CHECK-NEXT:    [[TMP70:%.*]] = ashr i32 [[TMP69]], 16
4239 ; CHECK-NEXT:    [[TMP71:%.*]] = trunc i32 [[TMP70]] to i16
4240 ; CHECK-NEXT:    [[TMP72:%.*]] = insertelement <3 x i16> [[TMP48]], i16 [[TMP71]], i64 2
4241 ; CHECK-NEXT:    store <3 x i16> [[TMP72]], ptr addrspace(1) [[OUT:%.*]], align 8
4242 ; CHECK-NEXT:    ret void
4244 ; GFX6-LABEL: sdiv_v3i16:
4245 ; GFX6:       ; %bb.0:
4246 ; GFX6-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0xb
4247 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
4248 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
4249 ; GFX6-NEXT:    s_mov_b32 s2, -1
4250 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
4251 ; GFX6-NEXT:    s_sext_i32_i16 s8, s6
4252 ; GFX6-NEXT:    v_cvt_f32_i32_e32 v0, s8
4253 ; GFX6-NEXT:    s_sext_i32_i16 s9, s4
4254 ; GFX6-NEXT:    v_cvt_f32_i32_e32 v1, s9
4255 ; GFX6-NEXT:    s_xor_b32 s8, s9, s8
4256 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v2, v0
4257 ; GFX6-NEXT:    s_ashr_i32 s8, s8, 30
4258 ; GFX6-NEXT:    s_or_b32 s10, s8, 1
4259 ; GFX6-NEXT:    v_mul_f32_e32 v2, v1, v2
4260 ; GFX6-NEXT:    v_trunc_f32_e32 v2, v2
4261 ; GFX6-NEXT:    v_mad_f32 v1, -v2, v0, v1
4262 ; GFX6-NEXT:    v_cmp_ge_f32_e64 s[8:9], |v1|, |v0|
4263 ; GFX6-NEXT:    s_and_b64 s[8:9], s[8:9], exec
4264 ; GFX6-NEXT:    s_cselect_b32 s8, s10, 0
4265 ; GFX6-NEXT:    s_ashr_i32 s6, s6, 16
4266 ; GFX6-NEXT:    v_cvt_i32_f32_e32 v2, v2
4267 ; GFX6-NEXT:    v_cvt_f32_i32_e32 v0, s6
4268 ; GFX6-NEXT:    s_ashr_i32 s4, s4, 16
4269 ; GFX6-NEXT:    v_add_i32_e32 v1, vcc, s8, v2
4270 ; GFX6-NEXT:    v_cvt_f32_i32_e32 v2, s4
4271 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v3, v0
4272 ; GFX6-NEXT:    s_xor_b32 s4, s4, s6
4273 ; GFX6-NEXT:    s_ashr_i32 s4, s4, 30
4274 ; GFX6-NEXT:    s_sext_i32_i16 s6, s7
4275 ; GFX6-NEXT:    v_mul_f32_e32 v3, v2, v3
4276 ; GFX6-NEXT:    v_trunc_f32_e32 v3, v3
4277 ; GFX6-NEXT:    v_mad_f32 v2, -v3, v0, v2
4278 ; GFX6-NEXT:    v_cvt_i32_f32_e32 v3, v3
4279 ; GFX6-NEXT:    s_or_b32 s4, s4, 1
4280 ; GFX6-NEXT:    v_cmp_ge_f32_e64 s[8:9], |v2|, |v0|
4281 ; GFX6-NEXT:    v_cvt_f32_i32_e32 v0, s6
4282 ; GFX6-NEXT:    s_and_b64 s[8:9], s[8:9], exec
4283 ; GFX6-NEXT:    s_cselect_b32 s4, s4, 0
4284 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, s4, v3
4285 ; GFX6-NEXT:    s_sext_i32_i16 s4, s5
4286 ; GFX6-NEXT:    v_cvt_f32_i32_e32 v3, s4
4287 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v4, v0
4288 ; GFX6-NEXT:    s_xor_b32 s4, s4, s6
4289 ; GFX6-NEXT:    s_ashr_i32 s4, s4, 30
4290 ; GFX6-NEXT:    s_or_b32 s6, s4, 1
4291 ; GFX6-NEXT:    v_mul_f32_e32 v4, v3, v4
4292 ; GFX6-NEXT:    v_trunc_f32_e32 v4, v4
4293 ; GFX6-NEXT:    v_mad_f32 v3, -v4, v0, v3
4294 ; GFX6-NEXT:    v_cvt_i32_f32_e32 v4, v4
4295 ; GFX6-NEXT:    v_cmp_ge_f32_e64 s[4:5], |v3|, |v0|
4296 ; GFX6-NEXT:    s_and_b64 s[4:5], s[4:5], exec
4297 ; GFX6-NEXT:    s_cselect_b32 s4, s6, 0
4298 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, s4, v4
4299 ; GFX6-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
4300 ; GFX6-NEXT:    v_and_b32_e32 v1, 0xffff, v1
4301 ; GFX6-NEXT:    v_or_b32_e32 v1, v1, v2
4302 ; GFX6-NEXT:    buffer_store_short v0, off, s[0:3], 0 offset:4
4303 ; GFX6-NEXT:    buffer_store_dword v1, off, s[0:3], 0
4304 ; GFX6-NEXT:    s_endpgm
4306 ; GFX9-LABEL: sdiv_v3i16:
4307 ; GFX9:       ; %bb.0:
4308 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x2c
4309 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
4310 ; GFX9-NEXT:    v_mov_b32_e32 v1, 0
4311 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
4312 ; GFX9-NEXT:    s_sext_i32_i16 s0, s6
4313 ; GFX9-NEXT:    v_cvt_f32_i32_e32 v0, s0
4314 ; GFX9-NEXT:    s_sext_i32_i16 s1, s4
4315 ; GFX9-NEXT:    v_cvt_f32_i32_e32 v2, s1
4316 ; GFX9-NEXT:    s_xor_b32 s0, s1, s0
4317 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v3, v0
4318 ; GFX9-NEXT:    s_ashr_i32 s0, s0, 30
4319 ; GFX9-NEXT:    s_or_b32 s8, s0, 1
4320 ; GFX9-NEXT:    v_mul_f32_e32 v3, v2, v3
4321 ; GFX9-NEXT:    v_trunc_f32_e32 v3, v3
4322 ; GFX9-NEXT:    v_mad_f32 v2, -v3, v0, v2
4323 ; GFX9-NEXT:    v_cmp_ge_f32_e64 s[0:1], |v2|, |v0|
4324 ; GFX9-NEXT:    s_and_b64 s[0:1], s[0:1], exec
4325 ; GFX9-NEXT:    s_cselect_b32 s0, s8, 0
4326 ; GFX9-NEXT:    s_ashr_i32 s1, s6, 16
4327 ; GFX9-NEXT:    v_cvt_i32_f32_e32 v3, v3
4328 ; GFX9-NEXT:    v_cvt_f32_i32_e32 v0, s1
4329 ; GFX9-NEXT:    s_ashr_i32 s4, s4, 16
4330 ; GFX9-NEXT:    v_add_u32_e32 v2, s0, v3
4331 ; GFX9-NEXT:    v_cvt_f32_i32_e32 v3, s4
4332 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v4, v0
4333 ; GFX9-NEXT:    s_xor_b32 s0, s4, s1
4334 ; GFX9-NEXT:    s_ashr_i32 s0, s0, 30
4335 ; GFX9-NEXT:    s_or_b32 s4, s0, 1
4336 ; GFX9-NEXT:    v_mul_f32_e32 v4, v3, v4
4337 ; GFX9-NEXT:    v_trunc_f32_e32 v4, v4
4338 ; GFX9-NEXT:    v_mad_f32 v3, -v4, v0, v3
4339 ; GFX9-NEXT:    v_cmp_ge_f32_e64 s[0:1], |v3|, |v0|
4340 ; GFX9-NEXT:    s_and_b64 s[0:1], s[0:1], exec
4341 ; GFX9-NEXT:    v_cvt_i32_f32_e32 v4, v4
4342 ; GFX9-NEXT:    s_sext_i32_i16 s1, s7
4343 ; GFX9-NEXT:    v_cvt_f32_i32_e32 v0, s1
4344 ; GFX9-NEXT:    s_cselect_b32 s0, s4, 0
4345 ; GFX9-NEXT:    v_add_u32_e32 v3, s0, v4
4346 ; GFX9-NEXT:    s_sext_i32_i16 s0, s5
4347 ; GFX9-NEXT:    v_cvt_f32_i32_e32 v4, s0
4348 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v5, v0
4349 ; GFX9-NEXT:    s_xor_b32 s0, s0, s1
4350 ; GFX9-NEXT:    s_ashr_i32 s0, s0, 30
4351 ; GFX9-NEXT:    s_or_b32 s4, s0, 1
4352 ; GFX9-NEXT:    v_mul_f32_e32 v5, v4, v5
4353 ; GFX9-NEXT:    v_trunc_f32_e32 v5, v5
4354 ; GFX9-NEXT:    v_mad_f32 v4, -v5, v0, v4
4355 ; GFX9-NEXT:    v_cvt_i32_f32_e32 v5, v5
4356 ; GFX9-NEXT:    v_cmp_ge_f32_e64 s[0:1], |v4|, |v0|
4357 ; GFX9-NEXT:    s_and_b64 s[0:1], s[0:1], exec
4358 ; GFX9-NEXT:    s_cselect_b32 s0, s4, 0
4359 ; GFX9-NEXT:    v_add_u32_e32 v0, s0, v5
4360 ; GFX9-NEXT:    v_and_b32_e32 v2, 0xffff, v2
4361 ; GFX9-NEXT:    v_lshl_or_b32 v2, v3, 16, v2
4362 ; GFX9-NEXT:    global_store_short v1, v0, s[2:3] offset:4
4363 ; GFX9-NEXT:    global_store_dword v1, v2, s[2:3]
4364 ; GFX9-NEXT:    s_endpgm
4365   %r = sdiv <3 x i16> %x, %y
4366   store <3 x i16> %r, ptr addrspace(1) %out
4367   ret void
4370 define amdgpu_kernel void @srem_v3i16(ptr addrspace(1) %out, <3 x i16> %x, <3 x i16> %y) {
4371 ; CHECK-LABEL: @srem_v3i16(
4372 ; CHECK-NEXT:    [[TMP1:%.*]] = extractelement <3 x i16> [[X:%.*]], i64 0
4373 ; CHECK-NEXT:    [[TMP2:%.*]] = extractelement <3 x i16> [[Y:%.*]], i64 0
4374 ; CHECK-NEXT:    [[TMP3:%.*]] = sext i16 [[TMP1]] to i32
4375 ; CHECK-NEXT:    [[TMP4:%.*]] = sext i16 [[TMP2]] to i32
4376 ; CHECK-NEXT:    [[TMP5:%.*]] = xor i32 [[TMP3]], [[TMP4]]
4377 ; CHECK-NEXT:    [[TMP6:%.*]] = ashr i32 [[TMP5]], 30
4378 ; CHECK-NEXT:    [[TMP7:%.*]] = or i32 [[TMP6]], 1
4379 ; CHECK-NEXT:    [[TMP8:%.*]] = sitofp i32 [[TMP3]] to float
4380 ; CHECK-NEXT:    [[TMP9:%.*]] = sitofp i32 [[TMP4]] to float
4381 ; CHECK-NEXT:    [[TMP10:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP9]])
4382 ; CHECK-NEXT:    [[TMP11:%.*]] = fmul fast float [[TMP8]], [[TMP10]]
4383 ; CHECK-NEXT:    [[TMP12:%.*]] = call fast float @llvm.trunc.f32(float [[TMP11]])
4384 ; CHECK-NEXT:    [[TMP13:%.*]] = fneg fast float [[TMP12]]
4385 ; CHECK-NEXT:    [[TMP14:%.*]] = call fast float @llvm.amdgcn.fmad.ftz.f32(float [[TMP13]], float [[TMP9]], float [[TMP8]])
4386 ; CHECK-NEXT:    [[TMP15:%.*]] = fptosi float [[TMP12]] to i32
4387 ; CHECK-NEXT:    [[TMP16:%.*]] = call fast float @llvm.fabs.f32(float [[TMP14]])
4388 ; CHECK-NEXT:    [[TMP17:%.*]] = call fast float @llvm.fabs.f32(float [[TMP9]])
4389 ; CHECK-NEXT:    [[TMP18:%.*]] = fcmp fast oge float [[TMP16]], [[TMP17]]
4390 ; CHECK-NEXT:    [[TMP19:%.*]] = select i1 [[TMP18]], i32 [[TMP7]], i32 0
4391 ; CHECK-NEXT:    [[TMP20:%.*]] = add i32 [[TMP15]], [[TMP19]]
4392 ; CHECK-NEXT:    [[TMP21:%.*]] = mul i32 [[TMP20]], [[TMP4]]
4393 ; CHECK-NEXT:    [[TMP22:%.*]] = sub i32 [[TMP3]], [[TMP21]]
4394 ; CHECK-NEXT:    [[TMP23:%.*]] = shl i32 [[TMP22]], 16
4395 ; CHECK-NEXT:    [[TMP24:%.*]] = ashr i32 [[TMP23]], 16
4396 ; CHECK-NEXT:    [[TMP25:%.*]] = trunc i32 [[TMP24]] to i16
4397 ; CHECK-NEXT:    [[TMP26:%.*]] = insertelement <3 x i16> poison, i16 [[TMP25]], i64 0
4398 ; CHECK-NEXT:    [[TMP27:%.*]] = extractelement <3 x i16> [[X]], i64 1
4399 ; CHECK-NEXT:    [[TMP28:%.*]] = extractelement <3 x i16> [[Y]], i64 1
4400 ; CHECK-NEXT:    [[TMP29:%.*]] = sext i16 [[TMP27]] to i32
4401 ; CHECK-NEXT:    [[TMP30:%.*]] = sext i16 [[TMP28]] to i32
4402 ; CHECK-NEXT:    [[TMP31:%.*]] = xor i32 [[TMP29]], [[TMP30]]
4403 ; CHECK-NEXT:    [[TMP32:%.*]] = ashr i32 [[TMP31]], 30
4404 ; CHECK-NEXT:    [[TMP33:%.*]] = or i32 [[TMP32]], 1
4405 ; CHECK-NEXT:    [[TMP34:%.*]] = sitofp i32 [[TMP29]] to float
4406 ; CHECK-NEXT:    [[TMP35:%.*]] = sitofp i32 [[TMP30]] to float
4407 ; CHECK-NEXT:    [[TMP36:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP35]])
4408 ; CHECK-NEXT:    [[TMP37:%.*]] = fmul fast float [[TMP34]], [[TMP36]]
4409 ; CHECK-NEXT:    [[TMP38:%.*]] = call fast float @llvm.trunc.f32(float [[TMP37]])
4410 ; CHECK-NEXT:    [[TMP39:%.*]] = fneg fast float [[TMP38]]
4411 ; CHECK-NEXT:    [[TMP40:%.*]] = call fast float @llvm.amdgcn.fmad.ftz.f32(float [[TMP39]], float [[TMP35]], float [[TMP34]])
4412 ; CHECK-NEXT:    [[TMP41:%.*]] = fptosi float [[TMP38]] to i32
4413 ; CHECK-NEXT:    [[TMP42:%.*]] = call fast float @llvm.fabs.f32(float [[TMP40]])
4414 ; CHECK-NEXT:    [[TMP43:%.*]] = call fast float @llvm.fabs.f32(float [[TMP35]])
4415 ; CHECK-NEXT:    [[TMP44:%.*]] = fcmp fast oge float [[TMP42]], [[TMP43]]
4416 ; CHECK-NEXT:    [[TMP45:%.*]] = select i1 [[TMP44]], i32 [[TMP33]], i32 0
4417 ; CHECK-NEXT:    [[TMP46:%.*]] = add i32 [[TMP41]], [[TMP45]]
4418 ; CHECK-NEXT:    [[TMP47:%.*]] = mul i32 [[TMP46]], [[TMP30]]
4419 ; CHECK-NEXT:    [[TMP48:%.*]] = sub i32 [[TMP29]], [[TMP47]]
4420 ; CHECK-NEXT:    [[TMP49:%.*]] = shl i32 [[TMP48]], 16
4421 ; CHECK-NEXT:    [[TMP50:%.*]] = ashr i32 [[TMP49]], 16
4422 ; CHECK-NEXT:    [[TMP51:%.*]] = trunc i32 [[TMP50]] to i16
4423 ; CHECK-NEXT:    [[TMP52:%.*]] = insertelement <3 x i16> [[TMP26]], i16 [[TMP51]], i64 1
4424 ; CHECK-NEXT:    [[TMP53:%.*]] = extractelement <3 x i16> [[X]], i64 2
4425 ; CHECK-NEXT:    [[TMP54:%.*]] = extractelement <3 x i16> [[Y]], i64 2
4426 ; CHECK-NEXT:    [[TMP55:%.*]] = sext i16 [[TMP53]] to i32
4427 ; CHECK-NEXT:    [[TMP56:%.*]] = sext i16 [[TMP54]] to i32
4428 ; CHECK-NEXT:    [[TMP57:%.*]] = xor i32 [[TMP55]], [[TMP56]]
4429 ; CHECK-NEXT:    [[TMP58:%.*]] = ashr i32 [[TMP57]], 30
4430 ; CHECK-NEXT:    [[TMP59:%.*]] = or i32 [[TMP58]], 1
4431 ; CHECK-NEXT:    [[TMP60:%.*]] = sitofp i32 [[TMP55]] to float
4432 ; CHECK-NEXT:    [[TMP61:%.*]] = sitofp i32 [[TMP56]] to float
4433 ; CHECK-NEXT:    [[TMP62:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP61]])
4434 ; CHECK-NEXT:    [[TMP63:%.*]] = fmul fast float [[TMP60]], [[TMP62]]
4435 ; CHECK-NEXT:    [[TMP64:%.*]] = call fast float @llvm.trunc.f32(float [[TMP63]])
4436 ; CHECK-NEXT:    [[TMP65:%.*]] = fneg fast float [[TMP64]]
4437 ; CHECK-NEXT:    [[TMP66:%.*]] = call fast float @llvm.amdgcn.fmad.ftz.f32(float [[TMP65]], float [[TMP61]], float [[TMP60]])
4438 ; CHECK-NEXT:    [[TMP67:%.*]] = fptosi float [[TMP64]] to i32
4439 ; CHECK-NEXT:    [[TMP68:%.*]] = call fast float @llvm.fabs.f32(float [[TMP66]])
4440 ; CHECK-NEXT:    [[TMP69:%.*]] = call fast float @llvm.fabs.f32(float [[TMP61]])
4441 ; CHECK-NEXT:    [[TMP70:%.*]] = fcmp fast oge float [[TMP68]], [[TMP69]]
4442 ; CHECK-NEXT:    [[TMP71:%.*]] = select i1 [[TMP70]], i32 [[TMP59]], i32 0
4443 ; CHECK-NEXT:    [[TMP72:%.*]] = add i32 [[TMP67]], [[TMP71]]
4444 ; CHECK-NEXT:    [[TMP73:%.*]] = mul i32 [[TMP72]], [[TMP56]]
4445 ; CHECK-NEXT:    [[TMP74:%.*]] = sub i32 [[TMP55]], [[TMP73]]
4446 ; CHECK-NEXT:    [[TMP75:%.*]] = shl i32 [[TMP74]], 16
4447 ; CHECK-NEXT:    [[TMP76:%.*]] = ashr i32 [[TMP75]], 16
4448 ; CHECK-NEXT:    [[TMP77:%.*]] = trunc i32 [[TMP76]] to i16
4449 ; CHECK-NEXT:    [[TMP78:%.*]] = insertelement <3 x i16> [[TMP52]], i16 [[TMP77]], i64 2
4450 ; CHECK-NEXT:    store <3 x i16> [[TMP78]], ptr addrspace(1) [[OUT:%.*]], align 8
4451 ; CHECK-NEXT:    ret void
4453 ; GFX6-LABEL: srem_v3i16:
4454 ; GFX6:       ; %bb.0:
4455 ; GFX6-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0xb
4456 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
4457 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
4458 ; GFX6-NEXT:    s_mov_b32 s2, -1
4459 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
4460 ; GFX6-NEXT:    s_sext_i32_i16 s8, s6
4461 ; GFX6-NEXT:    v_cvt_f32_i32_e32 v0, s8
4462 ; GFX6-NEXT:    s_sext_i32_i16 s9, s4
4463 ; GFX6-NEXT:    v_cvt_f32_i32_e32 v1, s9
4464 ; GFX6-NEXT:    s_xor_b32 s8, s9, s8
4465 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v2, v0
4466 ; GFX6-NEXT:    s_ashr_i32 s8, s8, 30
4467 ; GFX6-NEXT:    s_or_b32 s10, s8, 1
4468 ; GFX6-NEXT:    v_mul_f32_e32 v2, v1, v2
4469 ; GFX6-NEXT:    v_trunc_f32_e32 v2, v2
4470 ; GFX6-NEXT:    v_mad_f32 v1, -v2, v0, v1
4471 ; GFX6-NEXT:    v_cvt_i32_f32_e32 v2, v2
4472 ; GFX6-NEXT:    v_cmp_ge_f32_e64 s[8:9], |v1|, |v0|
4473 ; GFX6-NEXT:    s_and_b64 s[8:9], s[8:9], exec
4474 ; GFX6-NEXT:    s_cselect_b32 s8, s10, 0
4475 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, s8, v2
4476 ; GFX6-NEXT:    v_mul_lo_u32 v0, v0, s6
4477 ; GFX6-NEXT:    s_ashr_i32 s8, s6, 16
4478 ; GFX6-NEXT:    v_cvt_f32_i32_e32 v1, s8
4479 ; GFX6-NEXT:    s_lshr_b32 s10, s4, 16
4480 ; GFX6-NEXT:    v_sub_i32_e32 v0, vcc, s4, v0
4481 ; GFX6-NEXT:    s_ashr_i32 s4, s4, 16
4482 ; GFX6-NEXT:    v_cvt_f32_i32_e32 v2, s4
4483 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v3, v1
4484 ; GFX6-NEXT:    s_xor_b32 s4, s4, s8
4485 ; GFX6-NEXT:    s_ashr_i32 s4, s4, 30
4486 ; GFX6-NEXT:    s_lshr_b32 s6, s6, 16
4487 ; GFX6-NEXT:    v_mul_f32_e32 v3, v2, v3
4488 ; GFX6-NEXT:    v_trunc_f32_e32 v3, v3
4489 ; GFX6-NEXT:    v_mad_f32 v2, -v3, v1, v2
4490 ; GFX6-NEXT:    v_cvt_i32_f32_e32 v3, v3
4491 ; GFX6-NEXT:    s_or_b32 s4, s4, 1
4492 ; GFX6-NEXT:    v_cmp_ge_f32_e64 s[8:9], |v2|, |v1|
4493 ; GFX6-NEXT:    s_and_b64 s[8:9], s[8:9], exec
4494 ; GFX6-NEXT:    s_cselect_b32 s4, s4, 0
4495 ; GFX6-NEXT:    v_add_i32_e32 v1, vcc, s4, v3
4496 ; GFX6-NEXT:    s_sext_i32_i16 s4, s7
4497 ; GFX6-NEXT:    v_cvt_f32_i32_e32 v2, s4
4498 ; GFX6-NEXT:    v_mul_lo_u32 v1, v1, s6
4499 ; GFX6-NEXT:    s_sext_i32_i16 s6, s5
4500 ; GFX6-NEXT:    v_cvt_f32_i32_e32 v3, s6
4501 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v4, v2
4502 ; GFX6-NEXT:    s_xor_b32 s4, s6, s4
4503 ; GFX6-NEXT:    s_ashr_i32 s4, s4, 30
4504 ; GFX6-NEXT:    s_or_b32 s4, s4, 1
4505 ; GFX6-NEXT:    v_mul_f32_e32 v4, v3, v4
4506 ; GFX6-NEXT:    v_trunc_f32_e32 v4, v4
4507 ; GFX6-NEXT:    v_mad_f32 v3, -v4, v2, v3
4508 ; GFX6-NEXT:    v_cvt_i32_f32_e32 v4, v4
4509 ; GFX6-NEXT:    v_cmp_ge_f32_e64 s[8:9], |v3|, |v2|
4510 ; GFX6-NEXT:    s_and_b64 s[8:9], s[8:9], exec
4511 ; GFX6-NEXT:    s_cselect_b32 s4, s4, 0
4512 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, s4, v4
4513 ; GFX6-NEXT:    v_mul_lo_u32 v2, v2, s7
4514 ; GFX6-NEXT:    v_sub_i32_e32 v1, vcc, s10, v1
4515 ; GFX6-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
4516 ; GFX6-NEXT:    v_sub_i32_e32 v2, vcc, s5, v2
4517 ; GFX6-NEXT:    v_and_b32_e32 v0, 0xffff, v0
4518 ; GFX6-NEXT:    v_or_b32_e32 v0, v0, v1
4519 ; GFX6-NEXT:    buffer_store_short v2, off, s[0:3], 0 offset:4
4520 ; GFX6-NEXT:    buffer_store_dword v0, off, s[0:3], 0
4521 ; GFX6-NEXT:    s_endpgm
4523 ; GFX9-LABEL: srem_v3i16:
4524 ; GFX9:       ; %bb.0:
4525 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x2c
4526 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
4527 ; GFX9-NEXT:    s_sext_i32_i16 s8, s6
4528 ; GFX9-NEXT:    v_cvt_f32_i32_e32 v0, s8
4529 ; GFX9-NEXT:    s_sext_i32_i16 s9, s4
4530 ; GFX9-NEXT:    v_cvt_f32_i32_e32 v1, s9
4531 ; GFX9-NEXT:    s_xor_b32 s2, s9, s8
4532 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v2, v0
4533 ; GFX9-NEXT:    s_ashr_i32 s2, s2, 30
4534 ; GFX9-NEXT:    s_or_b32 s10, s2, 1
4535 ; GFX9-NEXT:    s_sext_i32_i16 s7, s7
4536 ; GFX9-NEXT:    v_mul_f32_e32 v2, v1, v2
4537 ; GFX9-NEXT:    v_trunc_f32_e32 v2, v2
4538 ; GFX9-NEXT:    v_mad_f32 v1, -v2, v0, v1
4539 ; GFX9-NEXT:    v_cmp_ge_f32_e64 s[2:3], |v1|, |v0|
4540 ; GFX9-NEXT:    s_and_b64 s[2:3], s[2:3], exec
4541 ; GFX9-NEXT:    s_cselect_b32 s2, s10, 0
4542 ; GFX9-NEXT:    s_ashr_i32 s6, s6, 16
4543 ; GFX9-NEXT:    v_cvt_i32_f32_e32 v2, v2
4544 ; GFX9-NEXT:    v_cvt_f32_i32_e32 v0, s6
4545 ; GFX9-NEXT:    s_ashr_i32 s4, s4, 16
4546 ; GFX9-NEXT:    s_sext_i32_i16 s5, s5
4547 ; GFX9-NEXT:    v_add_u32_e32 v1, s2, v2
4548 ; GFX9-NEXT:    v_cvt_f32_i32_e32 v2, s4
4549 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v3, v0
4550 ; GFX9-NEXT:    s_xor_b32 s2, s4, s6
4551 ; GFX9-NEXT:    s_ashr_i32 s2, s2, 30
4552 ; GFX9-NEXT:    v_mul_lo_u32 v1, v1, s8
4553 ; GFX9-NEXT:    v_mul_f32_e32 v3, v2, v3
4554 ; GFX9-NEXT:    v_trunc_f32_e32 v3, v3
4555 ; GFX9-NEXT:    v_mad_f32 v2, -v3, v0, v2
4556 ; GFX9-NEXT:    s_or_b32 s8, s2, 1
4557 ; GFX9-NEXT:    v_cvt_i32_f32_e32 v3, v3
4558 ; GFX9-NEXT:    v_cmp_ge_f32_e64 s[2:3], |v2|, |v0|
4559 ; GFX9-NEXT:    v_cvt_f32_i32_e32 v2, s7
4560 ; GFX9-NEXT:    s_and_b64 s[2:3], s[2:3], exec
4561 ; GFX9-NEXT:    s_cselect_b32 s2, s8, 0
4562 ; GFX9-NEXT:    v_add_u32_e32 v0, s2, v3
4563 ; GFX9-NEXT:    v_cvt_f32_i32_e32 v3, s5
4564 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v4, v2
4565 ; GFX9-NEXT:    s_xor_b32 s2, s5, s7
4566 ; GFX9-NEXT:    s_ashr_i32 s2, s2, 30
4567 ; GFX9-NEXT:    v_mul_lo_u32 v0, v0, s6
4568 ; GFX9-NEXT:    v_mul_f32_e32 v4, v3, v4
4569 ; GFX9-NEXT:    v_trunc_f32_e32 v4, v4
4570 ; GFX9-NEXT:    v_mad_f32 v3, -v4, v2, v3
4571 ; GFX9-NEXT:    v_cvt_i32_f32_e32 v4, v4
4572 ; GFX9-NEXT:    s_or_b32 s6, s2, 1
4573 ; GFX9-NEXT:    v_cmp_ge_f32_e64 s[2:3], |v3|, |v2|
4574 ; GFX9-NEXT:    s_and_b64 s[2:3], s[2:3], exec
4575 ; GFX9-NEXT:    s_cselect_b32 s2, s6, 0
4576 ; GFX9-NEXT:    v_add_u32_e32 v2, s2, v4
4577 ; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
4578 ; GFX9-NEXT:    v_mul_lo_u32 v2, v2, s7
4579 ; GFX9-NEXT:    v_sub_u32_e32 v1, s9, v1
4580 ; GFX9-NEXT:    v_mov_b32_e32 v3, 0
4581 ; GFX9-NEXT:    v_sub_u32_e32 v0, s4, v0
4582 ; GFX9-NEXT:    v_sub_u32_e32 v2, s5, v2
4583 ; GFX9-NEXT:    v_and_b32_e32 v1, 0xffff, v1
4584 ; GFX9-NEXT:    v_lshl_or_b32 v0, v0, 16, v1
4585 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
4586 ; GFX9-NEXT:    global_store_short v3, v2, s[0:1] offset:4
4587 ; GFX9-NEXT:    global_store_dword v3, v0, s[0:1]
4588 ; GFX9-NEXT:    s_endpgm
4589   %r = srem <3 x i16> %x, %y
4590   store <3 x i16> %r, ptr addrspace(1) %out
4591   ret void
4594 define amdgpu_kernel void @udiv_v3i15(ptr addrspace(1) %out, <3 x i15> %x, <3 x i15> %y) {
4595 ; CHECK-LABEL: @udiv_v3i15(
4596 ; CHECK-NEXT:    [[TMP1:%.*]] = extractelement <3 x i15> [[X:%.*]], i64 0
4597 ; CHECK-NEXT:    [[TMP2:%.*]] = extractelement <3 x i15> [[Y:%.*]], i64 0
4598 ; CHECK-NEXT:    [[TMP3:%.*]] = zext i15 [[TMP1]] to i32
4599 ; CHECK-NEXT:    [[TMP4:%.*]] = zext i15 [[TMP2]] to i32
4600 ; CHECK-NEXT:    [[TMP5:%.*]] = uitofp i32 [[TMP3]] to float
4601 ; CHECK-NEXT:    [[TMP6:%.*]] = uitofp i32 [[TMP4]] to float
4602 ; CHECK-NEXT:    [[TMP7:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP6]])
4603 ; CHECK-NEXT:    [[TMP8:%.*]] = fmul fast float [[TMP5]], [[TMP7]]
4604 ; CHECK-NEXT:    [[TMP9:%.*]] = call fast float @llvm.trunc.f32(float [[TMP8]])
4605 ; CHECK-NEXT:    [[TMP10:%.*]] = fneg fast float [[TMP9]]
4606 ; CHECK-NEXT:    [[TMP11:%.*]] = call fast float @llvm.amdgcn.fmad.ftz.f32(float [[TMP10]], float [[TMP6]], float [[TMP5]])
4607 ; CHECK-NEXT:    [[TMP12:%.*]] = fptoui float [[TMP9]] to i32
4608 ; CHECK-NEXT:    [[TMP13:%.*]] = call fast float @llvm.fabs.f32(float [[TMP11]])
4609 ; CHECK-NEXT:    [[TMP14:%.*]] = call fast float @llvm.fabs.f32(float [[TMP6]])
4610 ; CHECK-NEXT:    [[TMP15:%.*]] = fcmp fast oge float [[TMP13]], [[TMP14]]
4611 ; CHECK-NEXT:    [[TMP16:%.*]] = select i1 [[TMP15]], i32 1, i32 0
4612 ; CHECK-NEXT:    [[TMP17:%.*]] = add i32 [[TMP12]], [[TMP16]]
4613 ; CHECK-NEXT:    [[TMP18:%.*]] = and i32 [[TMP17]], 32767
4614 ; CHECK-NEXT:    [[TMP19:%.*]] = trunc i32 [[TMP18]] to i15
4615 ; CHECK-NEXT:    [[TMP20:%.*]] = insertelement <3 x i15> poison, i15 [[TMP19]], i64 0
4616 ; CHECK-NEXT:    [[TMP21:%.*]] = extractelement <3 x i15> [[X]], i64 1
4617 ; CHECK-NEXT:    [[TMP22:%.*]] = extractelement <3 x i15> [[Y]], i64 1
4618 ; CHECK-NEXT:    [[TMP23:%.*]] = zext i15 [[TMP21]] to i32
4619 ; CHECK-NEXT:    [[TMP24:%.*]] = zext i15 [[TMP22]] to i32
4620 ; CHECK-NEXT:    [[TMP25:%.*]] = uitofp i32 [[TMP23]] to float
4621 ; CHECK-NEXT:    [[TMP26:%.*]] = uitofp i32 [[TMP24]] to float
4622 ; CHECK-NEXT:    [[TMP27:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP26]])
4623 ; CHECK-NEXT:    [[TMP28:%.*]] = fmul fast float [[TMP25]], [[TMP27]]
4624 ; CHECK-NEXT:    [[TMP29:%.*]] = call fast float @llvm.trunc.f32(float [[TMP28]])
4625 ; CHECK-NEXT:    [[TMP30:%.*]] = fneg fast float [[TMP29]]
4626 ; CHECK-NEXT:    [[TMP31:%.*]] = call fast float @llvm.amdgcn.fmad.ftz.f32(float [[TMP30]], float [[TMP26]], float [[TMP25]])
4627 ; CHECK-NEXT:    [[TMP32:%.*]] = fptoui float [[TMP29]] to i32
4628 ; CHECK-NEXT:    [[TMP33:%.*]] = call fast float @llvm.fabs.f32(float [[TMP31]])
4629 ; CHECK-NEXT:    [[TMP34:%.*]] = call fast float @llvm.fabs.f32(float [[TMP26]])
4630 ; CHECK-NEXT:    [[TMP35:%.*]] = fcmp fast oge float [[TMP33]], [[TMP34]]
4631 ; CHECK-NEXT:    [[TMP36:%.*]] = select i1 [[TMP35]], i32 1, i32 0
4632 ; CHECK-NEXT:    [[TMP37:%.*]] = add i32 [[TMP32]], [[TMP36]]
4633 ; CHECK-NEXT:    [[TMP38:%.*]] = and i32 [[TMP37]], 32767
4634 ; CHECK-NEXT:    [[TMP39:%.*]] = trunc i32 [[TMP38]] to i15
4635 ; CHECK-NEXT:    [[TMP40:%.*]] = insertelement <3 x i15> [[TMP20]], i15 [[TMP39]], i64 1
4636 ; CHECK-NEXT:    [[TMP41:%.*]] = extractelement <3 x i15> [[X]], i64 2
4637 ; CHECK-NEXT:    [[TMP42:%.*]] = extractelement <3 x i15> [[Y]], i64 2
4638 ; CHECK-NEXT:    [[TMP43:%.*]] = zext i15 [[TMP41]] to i32
4639 ; CHECK-NEXT:    [[TMP44:%.*]] = zext i15 [[TMP42]] to i32
4640 ; CHECK-NEXT:    [[TMP45:%.*]] = uitofp i32 [[TMP43]] to float
4641 ; CHECK-NEXT:    [[TMP46:%.*]] = uitofp i32 [[TMP44]] to float
4642 ; CHECK-NEXT:    [[TMP47:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP46]])
4643 ; CHECK-NEXT:    [[TMP48:%.*]] = fmul fast float [[TMP45]], [[TMP47]]
4644 ; CHECK-NEXT:    [[TMP49:%.*]] = call fast float @llvm.trunc.f32(float [[TMP48]])
4645 ; CHECK-NEXT:    [[TMP50:%.*]] = fneg fast float [[TMP49]]
4646 ; CHECK-NEXT:    [[TMP51:%.*]] = call fast float @llvm.amdgcn.fmad.ftz.f32(float [[TMP50]], float [[TMP46]], float [[TMP45]])
4647 ; CHECK-NEXT:    [[TMP52:%.*]] = fptoui float [[TMP49]] to i32
4648 ; CHECK-NEXT:    [[TMP53:%.*]] = call fast float @llvm.fabs.f32(float [[TMP51]])
4649 ; CHECK-NEXT:    [[TMP54:%.*]] = call fast float @llvm.fabs.f32(float [[TMP46]])
4650 ; CHECK-NEXT:    [[TMP55:%.*]] = fcmp fast oge float [[TMP53]], [[TMP54]]
4651 ; CHECK-NEXT:    [[TMP56:%.*]] = select i1 [[TMP55]], i32 1, i32 0
4652 ; CHECK-NEXT:    [[TMP57:%.*]] = add i32 [[TMP52]], [[TMP56]]
4653 ; CHECK-NEXT:    [[TMP58:%.*]] = and i32 [[TMP57]], 32767
4654 ; CHECK-NEXT:    [[TMP59:%.*]] = trunc i32 [[TMP58]] to i15
4655 ; CHECK-NEXT:    [[TMP60:%.*]] = insertelement <3 x i15> [[TMP40]], i15 [[TMP59]], i64 2
4656 ; CHECK-NEXT:    store <3 x i15> [[TMP60]], ptr addrspace(1) [[OUT:%.*]], align 8
4657 ; CHECK-NEXT:    ret void
4659 ; GFX6-LABEL: udiv_v3i15:
4660 ; GFX6:       ; %bb.0:
4661 ; GFX6-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
4662 ; GFX6-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0xd
4663 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
4664 ; GFX6-NEXT:    s_mov_b32 s2, -1
4665 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
4666 ; GFX6-NEXT:    s_mov_b32 s1, s5
4667 ; GFX6-NEXT:    s_and_b32 s5, s8, 0x7fff
4668 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v1, s5
4669 ; GFX6-NEXT:    s_mov_b32 s0, s4
4670 ; GFX6-NEXT:    s_and_b32 s4, s6, 0x7fff
4671 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v3, s4
4672 ; GFX6-NEXT:    s_bfe_u32 s4, s8, 0xf000f
4673 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v4, v1
4674 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v5, s4
4675 ; GFX6-NEXT:    s_bfe_u32 s5, s6, 0xf000f
4676 ; GFX6-NEXT:    v_mov_b32_e32 v2, s8
4677 ; GFX6-NEXT:    v_alignbit_b32 v2, s9, v2, 30
4678 ; GFX6-NEXT:    v_mul_f32_e32 v4, v3, v4
4679 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v6, s5
4680 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v7, v5
4681 ; GFX6-NEXT:    v_and_b32_e32 v2, 0x7fff, v2
4682 ; GFX6-NEXT:    v_trunc_f32_e32 v4, v4
4683 ; GFX6-NEXT:    v_mad_f32 v3, -v4, v1, v3
4684 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v4, v4
4685 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v2, v2
4686 ; GFX6-NEXT:    v_mov_b32_e32 v0, s6
4687 ; GFX6-NEXT:    v_alignbit_b32 v0, s7, v0, 30
4688 ; GFX6-NEXT:    v_cmp_ge_f32_e64 vcc, |v3|, v1
4689 ; GFX6-NEXT:    v_mul_f32_e32 v1, v6, v7
4690 ; GFX6-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
4691 ; GFX6-NEXT:    v_trunc_f32_e32 v1, v1
4692 ; GFX6-NEXT:    v_addc_u32_e32 v3, vcc, 0, v4, vcc
4693 ; GFX6-NEXT:    v_mad_f32 v4, -v1, v5, v6
4694 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v1, v1
4695 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v0, v0
4696 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v6, v2
4697 ; GFX6-NEXT:    v_cmp_ge_f32_e64 vcc, |v4|, v5
4698 ; GFX6-NEXT:    v_addc_u32_e32 v4, vcc, 0, v1, vcc
4699 ; GFX6-NEXT:    v_mul_f32_e32 v1, v0, v6
4700 ; GFX6-NEXT:    v_trunc_f32_e32 v1, v1
4701 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v5, v1
4702 ; GFX6-NEXT:    v_mad_f32 v0, -v1, v2, v0
4703 ; GFX6-NEXT:    v_cmp_ge_f32_e64 vcc, |v0|, v2
4704 ; GFX6-NEXT:    v_and_b32_e32 v2, 0x7fff, v3
4705 ; GFX6-NEXT:    v_addc_u32_e32 v0, vcc, 0, v5, vcc
4706 ; GFX6-NEXT:    v_and_b32_e32 v3, 0x7fff, v4
4707 ; GFX6-NEXT:    v_lshl_b64 v[0:1], v[0:1], 30
4708 ; GFX6-NEXT:    v_lshlrev_b32_e32 v3, 15, v3
4709 ; GFX6-NEXT:    v_or_b32_e32 v2, v3, v2
4710 ; GFX6-NEXT:    v_or_b32_e32 v0, v2, v0
4711 ; GFX6-NEXT:    buffer_store_dword v0, off, s[0:3], 0
4712 ; GFX6-NEXT:    s_waitcnt expcnt(0)
4713 ; GFX6-NEXT:    v_and_b32_e32 v0, 0x1fff, v1
4714 ; GFX6-NEXT:    buffer_store_short v0, off, s[0:3], 0 offset:4
4715 ; GFX6-NEXT:    s_endpgm
4717 ; GFX9-LABEL: udiv_v3i15:
4718 ; GFX9:       ; %bb.0:
4719 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
4720 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
4721 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0
4722 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
4723 ; GFX9-NEXT:    s_and_b32 s0, s6, 0x7fff
4724 ; GFX9-NEXT:    s_and_b32 s1, s2, 0x7fff
4725 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v1, s1
4726 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v4, s0
4727 ; GFX9-NEXT:    s_bfe_u32 s0, s2, 0xf000f
4728 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v6, s0
4729 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v5, v1
4730 ; GFX9-NEXT:    s_bfe_u32 s1, s6, 0xf000f
4731 ; GFX9-NEXT:    v_mov_b32_e32 v3, s2
4732 ; GFX9-NEXT:    v_alignbit_b32 v3, s3, v3, 30
4733 ; GFX9-NEXT:    v_mul_f32_e32 v5, v4, v5
4734 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v7, s1
4735 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v8, v6
4736 ; GFX9-NEXT:    v_and_b32_e32 v3, 0x7fff, v3
4737 ; GFX9-NEXT:    v_trunc_f32_e32 v5, v5
4738 ; GFX9-NEXT:    v_mad_f32 v4, -v5, v1, v4
4739 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v5, v5
4740 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v3, v3
4741 ; GFX9-NEXT:    v_mov_b32_e32 v0, s6
4742 ; GFX9-NEXT:    v_alignbit_b32 v0, s7, v0, 30
4743 ; GFX9-NEXT:    v_cmp_ge_f32_e64 vcc, |v4|, v1
4744 ; GFX9-NEXT:    v_mul_f32_e32 v1, v7, v8
4745 ; GFX9-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
4746 ; GFX9-NEXT:    v_trunc_f32_e32 v1, v1
4747 ; GFX9-NEXT:    v_addc_co_u32_e32 v4, vcc, 0, v5, vcc
4748 ; GFX9-NEXT:    v_mad_f32 v5, -v1, v6, v7
4749 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v1, v1
4750 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v0, v0
4751 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v7, v3
4752 ; GFX9-NEXT:    v_cmp_ge_f32_e64 vcc, |v5|, v6
4753 ; GFX9-NEXT:    v_addc_co_u32_e32 v5, vcc, 0, v1, vcc
4754 ; GFX9-NEXT:    v_mul_f32_e32 v1, v0, v7
4755 ; GFX9-NEXT:    v_trunc_f32_e32 v1, v1
4756 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v6, v1
4757 ; GFX9-NEXT:    v_mad_f32 v0, -v1, v3, v0
4758 ; GFX9-NEXT:    v_cmp_ge_f32_e64 vcc, |v0|, v3
4759 ; GFX9-NEXT:    v_and_b32_e32 v3, 0x7fff, v4
4760 ; GFX9-NEXT:    v_addc_co_u32_e32 v0, vcc, 0, v6, vcc
4761 ; GFX9-NEXT:    v_and_b32_e32 v4, 0x7fff, v5
4762 ; GFX9-NEXT:    v_lshlrev_b64 v[0:1], 30, v[0:1]
4763 ; GFX9-NEXT:    v_lshlrev_b32_e32 v4, 15, v4
4764 ; GFX9-NEXT:    v_or_b32_e32 v3, v3, v4
4765 ; GFX9-NEXT:    v_or_b32_e32 v0, v3, v0
4766 ; GFX9-NEXT:    global_store_dword v2, v0, s[4:5]
4767 ; GFX9-NEXT:    v_and_b32_e32 v0, 0x1fff, v1
4768 ; GFX9-NEXT:    global_store_short v2, v0, s[4:5] offset:4
4769 ; GFX9-NEXT:    s_endpgm
4770   %r = udiv <3 x i15> %x, %y
4771   store <3 x i15> %r, ptr addrspace(1) %out
4772   ret void
4775 define amdgpu_kernel void @urem_v3i15(ptr addrspace(1) %out, <3 x i15> %x, <3 x i15> %y) {
4776 ; CHECK-LABEL: @urem_v3i15(
4777 ; CHECK-NEXT:    [[TMP1:%.*]] = extractelement <3 x i15> [[X:%.*]], i64 0
4778 ; CHECK-NEXT:    [[TMP2:%.*]] = extractelement <3 x i15> [[Y:%.*]], i64 0
4779 ; CHECK-NEXT:    [[TMP3:%.*]] = zext i15 [[TMP1]] to i32
4780 ; CHECK-NEXT:    [[TMP4:%.*]] = zext i15 [[TMP2]] to i32
4781 ; CHECK-NEXT:    [[TMP5:%.*]] = uitofp i32 [[TMP3]] to float
4782 ; CHECK-NEXT:    [[TMP6:%.*]] = uitofp i32 [[TMP4]] to float
4783 ; CHECK-NEXT:    [[TMP7:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP6]])
4784 ; CHECK-NEXT:    [[TMP8:%.*]] = fmul fast float [[TMP5]], [[TMP7]]
4785 ; CHECK-NEXT:    [[TMP9:%.*]] = call fast float @llvm.trunc.f32(float [[TMP8]])
4786 ; CHECK-NEXT:    [[TMP10:%.*]] = fneg fast float [[TMP9]]
4787 ; CHECK-NEXT:    [[TMP11:%.*]] = call fast float @llvm.amdgcn.fmad.ftz.f32(float [[TMP10]], float [[TMP6]], float [[TMP5]])
4788 ; CHECK-NEXT:    [[TMP12:%.*]] = fptoui float [[TMP9]] to i32
4789 ; CHECK-NEXT:    [[TMP13:%.*]] = call fast float @llvm.fabs.f32(float [[TMP11]])
4790 ; CHECK-NEXT:    [[TMP14:%.*]] = call fast float @llvm.fabs.f32(float [[TMP6]])
4791 ; CHECK-NEXT:    [[TMP15:%.*]] = fcmp fast oge float [[TMP13]], [[TMP14]]
4792 ; CHECK-NEXT:    [[TMP16:%.*]] = select i1 [[TMP15]], i32 1, i32 0
4793 ; CHECK-NEXT:    [[TMP17:%.*]] = add i32 [[TMP12]], [[TMP16]]
4794 ; CHECK-NEXT:    [[TMP18:%.*]] = mul i32 [[TMP17]], [[TMP4]]
4795 ; CHECK-NEXT:    [[TMP19:%.*]] = sub i32 [[TMP3]], [[TMP18]]
4796 ; CHECK-NEXT:    [[TMP20:%.*]] = and i32 [[TMP19]], 32767
4797 ; CHECK-NEXT:    [[TMP21:%.*]] = trunc i32 [[TMP20]] to i15
4798 ; CHECK-NEXT:    [[TMP22:%.*]] = insertelement <3 x i15> poison, i15 [[TMP21]], i64 0
4799 ; CHECK-NEXT:    [[TMP23:%.*]] = extractelement <3 x i15> [[X]], i64 1
4800 ; CHECK-NEXT:    [[TMP24:%.*]] = extractelement <3 x i15> [[Y]], i64 1
4801 ; CHECK-NEXT:    [[TMP25:%.*]] = zext i15 [[TMP23]] to i32
4802 ; CHECK-NEXT:    [[TMP26:%.*]] = zext i15 [[TMP24]] to i32
4803 ; CHECK-NEXT:    [[TMP27:%.*]] = uitofp i32 [[TMP25]] to float
4804 ; CHECK-NEXT:    [[TMP28:%.*]] = uitofp i32 [[TMP26]] to float
4805 ; CHECK-NEXT:    [[TMP29:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP28]])
4806 ; CHECK-NEXT:    [[TMP30:%.*]] = fmul fast float [[TMP27]], [[TMP29]]
4807 ; CHECK-NEXT:    [[TMP31:%.*]] = call fast float @llvm.trunc.f32(float [[TMP30]])
4808 ; CHECK-NEXT:    [[TMP32:%.*]] = fneg fast float [[TMP31]]
4809 ; CHECK-NEXT:    [[TMP33:%.*]] = call fast float @llvm.amdgcn.fmad.ftz.f32(float [[TMP32]], float [[TMP28]], float [[TMP27]])
4810 ; CHECK-NEXT:    [[TMP34:%.*]] = fptoui float [[TMP31]] to i32
4811 ; CHECK-NEXT:    [[TMP35:%.*]] = call fast float @llvm.fabs.f32(float [[TMP33]])
4812 ; CHECK-NEXT:    [[TMP36:%.*]] = call fast float @llvm.fabs.f32(float [[TMP28]])
4813 ; CHECK-NEXT:    [[TMP37:%.*]] = fcmp fast oge float [[TMP35]], [[TMP36]]
4814 ; CHECK-NEXT:    [[TMP38:%.*]] = select i1 [[TMP37]], i32 1, i32 0
4815 ; CHECK-NEXT:    [[TMP39:%.*]] = add i32 [[TMP34]], [[TMP38]]
4816 ; CHECK-NEXT:    [[TMP40:%.*]] = mul i32 [[TMP39]], [[TMP26]]
4817 ; CHECK-NEXT:    [[TMP41:%.*]] = sub i32 [[TMP25]], [[TMP40]]
4818 ; CHECK-NEXT:    [[TMP42:%.*]] = and i32 [[TMP41]], 32767
4819 ; CHECK-NEXT:    [[TMP43:%.*]] = trunc i32 [[TMP42]] to i15
4820 ; CHECK-NEXT:    [[TMP44:%.*]] = insertelement <3 x i15> [[TMP22]], i15 [[TMP43]], i64 1
4821 ; CHECK-NEXT:    [[TMP45:%.*]] = extractelement <3 x i15> [[X]], i64 2
4822 ; CHECK-NEXT:    [[TMP46:%.*]] = extractelement <3 x i15> [[Y]], i64 2
4823 ; CHECK-NEXT:    [[TMP47:%.*]] = zext i15 [[TMP45]] to i32
4824 ; CHECK-NEXT:    [[TMP48:%.*]] = zext i15 [[TMP46]] to i32
4825 ; CHECK-NEXT:    [[TMP49:%.*]] = uitofp i32 [[TMP47]] to float
4826 ; CHECK-NEXT:    [[TMP50:%.*]] = uitofp i32 [[TMP48]] to float
4827 ; CHECK-NEXT:    [[TMP51:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP50]])
4828 ; CHECK-NEXT:    [[TMP52:%.*]] = fmul fast float [[TMP49]], [[TMP51]]
4829 ; CHECK-NEXT:    [[TMP53:%.*]] = call fast float @llvm.trunc.f32(float [[TMP52]])
4830 ; CHECK-NEXT:    [[TMP54:%.*]] = fneg fast float [[TMP53]]
4831 ; CHECK-NEXT:    [[TMP55:%.*]] = call fast float @llvm.amdgcn.fmad.ftz.f32(float [[TMP54]], float [[TMP50]], float [[TMP49]])
4832 ; CHECK-NEXT:    [[TMP56:%.*]] = fptoui float [[TMP53]] to i32
4833 ; CHECK-NEXT:    [[TMP57:%.*]] = call fast float @llvm.fabs.f32(float [[TMP55]])
4834 ; CHECK-NEXT:    [[TMP58:%.*]] = call fast float @llvm.fabs.f32(float [[TMP50]])
4835 ; CHECK-NEXT:    [[TMP59:%.*]] = fcmp fast oge float [[TMP57]], [[TMP58]]
4836 ; CHECK-NEXT:    [[TMP60:%.*]] = select i1 [[TMP59]], i32 1, i32 0
4837 ; CHECK-NEXT:    [[TMP61:%.*]] = add i32 [[TMP56]], [[TMP60]]
4838 ; CHECK-NEXT:    [[TMP62:%.*]] = mul i32 [[TMP61]], [[TMP48]]
4839 ; CHECK-NEXT:    [[TMP63:%.*]] = sub i32 [[TMP47]], [[TMP62]]
4840 ; CHECK-NEXT:    [[TMP64:%.*]] = and i32 [[TMP63]], 32767
4841 ; CHECK-NEXT:    [[TMP65:%.*]] = trunc i32 [[TMP64]] to i15
4842 ; CHECK-NEXT:    [[TMP66:%.*]] = insertelement <3 x i15> [[TMP44]], i15 [[TMP65]], i64 2
4843 ; CHECK-NEXT:    store <3 x i15> [[TMP66]], ptr addrspace(1) [[OUT:%.*]], align 8
4844 ; CHECK-NEXT:    ret void
4846 ; GFX6-LABEL: urem_v3i15:
4847 ; GFX6:       ; %bb.0:
4848 ; GFX6-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
4849 ; GFX6-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0xd
4850 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
4851 ; GFX6-NEXT:    s_mov_b32 s2, -1
4852 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
4853 ; GFX6-NEXT:    v_mov_b32_e32 v0, s6
4854 ; GFX6-NEXT:    v_alignbit_b32 v0, s7, v0, 30
4855 ; GFX6-NEXT:    s_and_b32 s7, s8, 0x7fff
4856 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v1, s7
4857 ; GFX6-NEXT:    s_mov_b32 s1, s5
4858 ; GFX6-NEXT:    s_and_b32 s5, s6, 0x7fff
4859 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v3, s5
4860 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v4, v1
4861 ; GFX6-NEXT:    s_bfe_u32 s5, s8, 0xf000f
4862 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v5, s5
4863 ; GFX6-NEXT:    s_bfe_u32 s7, s6, 0xf000f
4864 ; GFX6-NEXT:    v_mul_f32_e32 v4, v3, v4
4865 ; GFX6-NEXT:    v_trunc_f32_e32 v4, v4
4866 ; GFX6-NEXT:    v_mad_f32 v3, -v4, v1, v3
4867 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v4, v4
4868 ; GFX6-NEXT:    v_cmp_ge_f32_e64 vcc, |v3|, v1
4869 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v3, s7
4870 ; GFX6-NEXT:    v_mov_b32_e32 v2, s8
4871 ; GFX6-NEXT:    v_addc_u32_e32 v1, vcc, 0, v4, vcc
4872 ; GFX6-NEXT:    v_mul_lo_u32 v1, v1, s8
4873 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v4, v5
4874 ; GFX6-NEXT:    v_alignbit_b32 v2, s9, v2, 30
4875 ; GFX6-NEXT:    v_and_b32_e32 v2, 0x7fff, v2
4876 ; GFX6-NEXT:    v_sub_i32_e32 v6, vcc, s6, v1
4877 ; GFX6-NEXT:    v_mul_f32_e32 v1, v3, v4
4878 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v4, v2
4879 ; GFX6-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
4880 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v7, v0
4881 ; GFX6-NEXT:    v_trunc_f32_e32 v1, v1
4882 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v8, v4
4883 ; GFX6-NEXT:    v_mad_f32 v3, -v1, v5, v3
4884 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v1, v1
4885 ; GFX6-NEXT:    v_cmp_ge_f32_e64 vcc, |v3|, v5
4886 ; GFX6-NEXT:    v_mul_f32_e32 v3, v7, v8
4887 ; GFX6-NEXT:    v_trunc_f32_e32 v3, v3
4888 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v5, v3
4889 ; GFX6-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
4890 ; GFX6-NEXT:    v_mad_f32 v3, -v3, v4, v7
4891 ; GFX6-NEXT:    s_lshr_b32 s5, s8, 15
4892 ; GFX6-NEXT:    v_cmp_ge_f32_e64 vcc, |v3|, v4
4893 ; GFX6-NEXT:    v_mul_lo_u32 v1, v1, s5
4894 ; GFX6-NEXT:    v_addc_u32_e32 v3, vcc, 0, v5, vcc
4895 ; GFX6-NEXT:    v_mul_lo_u32 v2, v3, v2
4896 ; GFX6-NEXT:    s_mov_b32 s0, s4
4897 ; GFX6-NEXT:    s_lshr_b32 s4, s6, 15
4898 ; GFX6-NEXT:    v_sub_i32_e32 v3, vcc, s4, v1
4899 ; GFX6-NEXT:    v_sub_i32_e32 v0, vcc, v0, v2
4900 ; GFX6-NEXT:    v_and_b32_e32 v3, 0x7fff, v3
4901 ; GFX6-NEXT:    v_lshl_b64 v[0:1], v[0:1], 30
4902 ; GFX6-NEXT:    v_and_b32_e32 v2, 0x7fff, v6
4903 ; GFX6-NEXT:    v_lshlrev_b32_e32 v3, 15, v3
4904 ; GFX6-NEXT:    v_or_b32_e32 v2, v3, v2
4905 ; GFX6-NEXT:    v_or_b32_e32 v0, v2, v0
4906 ; GFX6-NEXT:    buffer_store_dword v0, off, s[0:3], 0
4907 ; GFX6-NEXT:    s_waitcnt expcnt(0)
4908 ; GFX6-NEXT:    v_and_b32_e32 v0, 0x1fff, v1
4909 ; GFX6-NEXT:    buffer_store_short v0, off, s[0:3], 0 offset:4
4910 ; GFX6-NEXT:    s_endpgm
4912 ; GFX9-LABEL: urem_v3i15:
4913 ; GFX9:       ; %bb.0:
4914 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
4915 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0
4916 ; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x34
4917 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
4918 ; GFX9-NEXT:    v_mov_b32_e32 v0, s6
4919 ; GFX9-NEXT:    v_alignbit_b32 v0, s7, v0, 30
4920 ; GFX9-NEXT:    s_and_b32 s7, s0, 0x7fff
4921 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v1, s7
4922 ; GFX9-NEXT:    s_and_b32 s2, s6, 0x7fff
4923 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v4, s2
4924 ; GFX9-NEXT:    s_bfe_u32 s2, s0, 0xf000f
4925 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v5, v1
4926 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v6, s2
4927 ; GFX9-NEXT:    v_mov_b32_e32 v3, s0
4928 ; GFX9-NEXT:    v_alignbit_b32 v3, s1, v3, 30
4929 ; GFX9-NEXT:    v_mul_f32_e32 v5, v4, v5
4930 ; GFX9-NEXT:    v_trunc_f32_e32 v5, v5
4931 ; GFX9-NEXT:    v_mad_f32 v4, -v5, v1, v4
4932 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v5, v5
4933 ; GFX9-NEXT:    s_bfe_u32 s3, s6, 0xf000f
4934 ; GFX9-NEXT:    v_and_b32_e32 v3, 0x7fff, v3
4935 ; GFX9-NEXT:    v_cmp_ge_f32_e64 vcc, |v4|, v1
4936 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v7, s3
4937 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v8, v6
4938 ; GFX9-NEXT:    v_addc_co_u32_e32 v1, vcc, 0, v5, vcc
4939 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v5, v3
4940 ; GFX9-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
4941 ; GFX9-NEXT:    v_mul_f32_e32 v4, v7, v8
4942 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v8, v0
4943 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v9, v5
4944 ; GFX9-NEXT:    v_trunc_f32_e32 v4, v4
4945 ; GFX9-NEXT:    v_mad_f32 v7, -v4, v6, v7
4946 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v4, v4
4947 ; GFX9-NEXT:    v_cmp_ge_f32_e64 vcc, |v7|, v6
4948 ; GFX9-NEXT:    v_mul_f32_e32 v6, v8, v9
4949 ; GFX9-NEXT:    v_trunc_f32_e32 v6, v6
4950 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v7, v6
4951 ; GFX9-NEXT:    v_addc_co_u32_e32 v4, vcc, 0, v4, vcc
4952 ; GFX9-NEXT:    v_mad_f32 v6, -v6, v5, v8
4953 ; GFX9-NEXT:    s_lshr_b32 s1, s0, 15
4954 ; GFX9-NEXT:    v_cmp_ge_f32_e64 vcc, |v6|, v5
4955 ; GFX9-NEXT:    v_mul_lo_u32 v4, v4, s1
4956 ; GFX9-NEXT:    v_addc_co_u32_e32 v5, vcc, 0, v7, vcc
4957 ; GFX9-NEXT:    v_mul_lo_u32 v1, v1, s0
4958 ; GFX9-NEXT:    v_mul_lo_u32 v3, v5, v3
4959 ; GFX9-NEXT:    s_lshr_b32 s0, s6, 15
4960 ; GFX9-NEXT:    v_sub_u32_e32 v4, s0, v4
4961 ; GFX9-NEXT:    v_sub_u32_e32 v5, s6, v1
4962 ; GFX9-NEXT:    v_sub_u32_e32 v0, v0, v3
4963 ; GFX9-NEXT:    v_and_b32_e32 v4, 0x7fff, v4
4964 ; GFX9-NEXT:    v_lshlrev_b64 v[0:1], 30, v[0:1]
4965 ; GFX9-NEXT:    v_and_b32_e32 v3, 0x7fff, v5
4966 ; GFX9-NEXT:    v_lshlrev_b32_e32 v4, 15, v4
4967 ; GFX9-NEXT:    v_or_b32_e32 v3, v3, v4
4968 ; GFX9-NEXT:    v_or_b32_e32 v0, v3, v0
4969 ; GFX9-NEXT:    global_store_dword v2, v0, s[4:5]
4970 ; GFX9-NEXT:    v_and_b32_e32 v0, 0x1fff, v1
4971 ; GFX9-NEXT:    global_store_short v2, v0, s[4:5] offset:4
4972 ; GFX9-NEXT:    s_endpgm
4973   %r = urem <3 x i15> %x, %y
4974   store <3 x i15> %r, ptr addrspace(1) %out
4975   ret void
4978 define amdgpu_kernel void @sdiv_v3i15(ptr addrspace(1) %out, <3 x i15> %x, <3 x i15> %y) {
4979 ; CHECK-LABEL: @sdiv_v3i15(
4980 ; CHECK-NEXT:    [[TMP1:%.*]] = extractelement <3 x i15> [[X:%.*]], i64 0
4981 ; CHECK-NEXT:    [[TMP2:%.*]] = extractelement <3 x i15> [[Y:%.*]], i64 0
4982 ; CHECK-NEXT:    [[TMP3:%.*]] = sext i15 [[TMP1]] to i32
4983 ; CHECK-NEXT:    [[TMP4:%.*]] = sext i15 [[TMP2]] to i32
4984 ; CHECK-NEXT:    [[TMP5:%.*]] = xor i32 [[TMP3]], [[TMP4]]
4985 ; CHECK-NEXT:    [[TMP6:%.*]] = ashr i32 [[TMP5]], 30
4986 ; CHECK-NEXT:    [[TMP7:%.*]] = or i32 [[TMP6]], 1
4987 ; CHECK-NEXT:    [[TMP8:%.*]] = sitofp i32 [[TMP3]] to float
4988 ; CHECK-NEXT:    [[TMP9:%.*]] = sitofp i32 [[TMP4]] to float
4989 ; CHECK-NEXT:    [[TMP10:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP9]])
4990 ; CHECK-NEXT:    [[TMP11:%.*]] = fmul fast float [[TMP8]], [[TMP10]]
4991 ; CHECK-NEXT:    [[TMP12:%.*]] = call fast float @llvm.trunc.f32(float [[TMP11]])
4992 ; CHECK-NEXT:    [[TMP13:%.*]] = fneg fast float [[TMP12]]
4993 ; CHECK-NEXT:    [[TMP14:%.*]] = call fast float @llvm.amdgcn.fmad.ftz.f32(float [[TMP13]], float [[TMP9]], float [[TMP8]])
4994 ; CHECK-NEXT:    [[TMP15:%.*]] = fptosi float [[TMP12]] to i32
4995 ; CHECK-NEXT:    [[TMP16:%.*]] = call fast float @llvm.fabs.f32(float [[TMP14]])
4996 ; CHECK-NEXT:    [[TMP17:%.*]] = call fast float @llvm.fabs.f32(float [[TMP9]])
4997 ; CHECK-NEXT:    [[TMP18:%.*]] = fcmp fast oge float [[TMP16]], [[TMP17]]
4998 ; CHECK-NEXT:    [[TMP19:%.*]] = select i1 [[TMP18]], i32 [[TMP7]], i32 0
4999 ; CHECK-NEXT:    [[TMP20:%.*]] = add i32 [[TMP15]], [[TMP19]]
5000 ; CHECK-NEXT:    [[TMP21:%.*]] = shl i32 [[TMP20]], 17
5001 ; CHECK-NEXT:    [[TMP22:%.*]] = ashr i32 [[TMP21]], 17
5002 ; CHECK-NEXT:    [[TMP23:%.*]] = trunc i32 [[TMP22]] to i15
5003 ; CHECK-NEXT:    [[TMP24:%.*]] = insertelement <3 x i15> poison, i15 [[TMP23]], i64 0
5004 ; CHECK-NEXT:    [[TMP25:%.*]] = extractelement <3 x i15> [[X]], i64 1
5005 ; CHECK-NEXT:    [[TMP26:%.*]] = extractelement <3 x i15> [[Y]], i64 1
5006 ; CHECK-NEXT:    [[TMP27:%.*]] = sext i15 [[TMP25]] to i32
5007 ; CHECK-NEXT:    [[TMP28:%.*]] = sext i15 [[TMP26]] to i32
5008 ; CHECK-NEXT:    [[TMP29:%.*]] = xor i32 [[TMP27]], [[TMP28]]
5009 ; CHECK-NEXT:    [[TMP30:%.*]] = ashr i32 [[TMP29]], 30
5010 ; CHECK-NEXT:    [[TMP31:%.*]] = or i32 [[TMP30]], 1
5011 ; CHECK-NEXT:    [[TMP32:%.*]] = sitofp i32 [[TMP27]] to float
5012 ; CHECK-NEXT:    [[TMP33:%.*]] = sitofp i32 [[TMP28]] to float
5013 ; CHECK-NEXT:    [[TMP34:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP33]])
5014 ; CHECK-NEXT:    [[TMP35:%.*]] = fmul fast float [[TMP32]], [[TMP34]]
5015 ; CHECK-NEXT:    [[TMP36:%.*]] = call fast float @llvm.trunc.f32(float [[TMP35]])
5016 ; CHECK-NEXT:    [[TMP37:%.*]] = fneg fast float [[TMP36]]
5017 ; CHECK-NEXT:    [[TMP38:%.*]] = call fast float @llvm.amdgcn.fmad.ftz.f32(float [[TMP37]], float [[TMP33]], float [[TMP32]])
5018 ; CHECK-NEXT:    [[TMP39:%.*]] = fptosi float [[TMP36]] to i32
5019 ; CHECK-NEXT:    [[TMP40:%.*]] = call fast float @llvm.fabs.f32(float [[TMP38]])
5020 ; CHECK-NEXT:    [[TMP41:%.*]] = call fast float @llvm.fabs.f32(float [[TMP33]])
5021 ; CHECK-NEXT:    [[TMP42:%.*]] = fcmp fast oge float [[TMP40]], [[TMP41]]
5022 ; CHECK-NEXT:    [[TMP43:%.*]] = select i1 [[TMP42]], i32 [[TMP31]], i32 0
5023 ; CHECK-NEXT:    [[TMP44:%.*]] = add i32 [[TMP39]], [[TMP43]]
5024 ; CHECK-NEXT:    [[TMP45:%.*]] = shl i32 [[TMP44]], 17
5025 ; CHECK-NEXT:    [[TMP46:%.*]] = ashr i32 [[TMP45]], 17
5026 ; CHECK-NEXT:    [[TMP47:%.*]] = trunc i32 [[TMP46]] to i15
5027 ; CHECK-NEXT:    [[TMP48:%.*]] = insertelement <3 x i15> [[TMP24]], i15 [[TMP47]], i64 1
5028 ; CHECK-NEXT:    [[TMP49:%.*]] = extractelement <3 x i15> [[X]], i64 2
5029 ; CHECK-NEXT:    [[TMP50:%.*]] = extractelement <3 x i15> [[Y]], i64 2
5030 ; CHECK-NEXT:    [[TMP51:%.*]] = sext i15 [[TMP49]] to i32
5031 ; CHECK-NEXT:    [[TMP52:%.*]] = sext i15 [[TMP50]] to i32
5032 ; CHECK-NEXT:    [[TMP53:%.*]] = xor i32 [[TMP51]], [[TMP52]]
5033 ; CHECK-NEXT:    [[TMP54:%.*]] = ashr i32 [[TMP53]], 30
5034 ; CHECK-NEXT:    [[TMP55:%.*]] = or i32 [[TMP54]], 1
5035 ; CHECK-NEXT:    [[TMP56:%.*]] = sitofp i32 [[TMP51]] to float
5036 ; CHECK-NEXT:    [[TMP57:%.*]] = sitofp i32 [[TMP52]] to float
5037 ; CHECK-NEXT:    [[TMP58:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP57]])
5038 ; CHECK-NEXT:    [[TMP59:%.*]] = fmul fast float [[TMP56]], [[TMP58]]
5039 ; CHECK-NEXT:    [[TMP60:%.*]] = call fast float @llvm.trunc.f32(float [[TMP59]])
5040 ; CHECK-NEXT:    [[TMP61:%.*]] = fneg fast float [[TMP60]]
5041 ; CHECK-NEXT:    [[TMP62:%.*]] = call fast float @llvm.amdgcn.fmad.ftz.f32(float [[TMP61]], float [[TMP57]], float [[TMP56]])
5042 ; CHECK-NEXT:    [[TMP63:%.*]] = fptosi float [[TMP60]] to i32
5043 ; CHECK-NEXT:    [[TMP64:%.*]] = call fast float @llvm.fabs.f32(float [[TMP62]])
5044 ; CHECK-NEXT:    [[TMP65:%.*]] = call fast float @llvm.fabs.f32(float [[TMP57]])
5045 ; CHECK-NEXT:    [[TMP66:%.*]] = fcmp fast oge float [[TMP64]], [[TMP65]]
5046 ; CHECK-NEXT:    [[TMP67:%.*]] = select i1 [[TMP66]], i32 [[TMP55]], i32 0
5047 ; CHECK-NEXT:    [[TMP68:%.*]] = add i32 [[TMP63]], [[TMP67]]
5048 ; CHECK-NEXT:    [[TMP69:%.*]] = shl i32 [[TMP68]], 17
5049 ; CHECK-NEXT:    [[TMP70:%.*]] = ashr i32 [[TMP69]], 17
5050 ; CHECK-NEXT:    [[TMP71:%.*]] = trunc i32 [[TMP70]] to i15
5051 ; CHECK-NEXT:    [[TMP72:%.*]] = insertelement <3 x i15> [[TMP48]], i15 [[TMP71]], i64 2
5052 ; CHECK-NEXT:    store <3 x i15> [[TMP72]], ptr addrspace(1) [[OUT:%.*]], align 8
5053 ; CHECK-NEXT:    ret void
5055 ; GFX6-LABEL: sdiv_v3i15:
5056 ; GFX6:       ; %bb.0:
5057 ; GFX6-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
5058 ; GFX6-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0xd
5059 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
5060 ; GFX6-NEXT:    s_mov_b32 s2, -1
5061 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
5062 ; GFX6-NEXT:    s_mov_b32 s0, s4
5063 ; GFX6-NEXT:    s_bfe_i32 s4, s8, 0xf0000
5064 ; GFX6-NEXT:    v_cvt_f32_i32_e32 v2, s4
5065 ; GFX6-NEXT:    s_mov_b32 s1, s5
5066 ; GFX6-NEXT:    s_bfe_i32 s5, s6, 0xf0000
5067 ; GFX6-NEXT:    v_cvt_f32_i32_e32 v3, s5
5068 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v4, v2
5069 ; GFX6-NEXT:    s_xor_b32 s4, s5, s4
5070 ; GFX6-NEXT:    v_mov_b32_e32 v0, s6
5071 ; GFX6-NEXT:    s_ashr_i32 s4, s4, 30
5072 ; GFX6-NEXT:    v_mul_f32_e32 v4, v3, v4
5073 ; GFX6-NEXT:    v_trunc_f32_e32 v4, v4
5074 ; GFX6-NEXT:    v_mad_f32 v3, -v4, v2, v3
5075 ; GFX6-NEXT:    v_alignbit_b32 v0, s7, v0, 30
5076 ; GFX6-NEXT:    s_or_b32 s7, s4, 1
5077 ; GFX6-NEXT:    v_cmp_ge_f32_e64 s[4:5], |v3|, |v2|
5078 ; GFX6-NEXT:    s_and_b64 s[4:5], s[4:5], exec
5079 ; GFX6-NEXT:    v_cvt_i32_f32_e32 v4, v4
5080 ; GFX6-NEXT:    s_cselect_b32 s4, s7, 0
5081 ; GFX6-NEXT:    s_bfe_i32 s5, s8, 0xf000f
5082 ; GFX6-NEXT:    v_cvt_f32_i32_e32 v2, s5
5083 ; GFX6-NEXT:    v_add_i32_e32 v3, vcc, s4, v4
5084 ; GFX6-NEXT:    s_bfe_i32 s4, s6, 0xf000f
5085 ; GFX6-NEXT:    v_cvt_f32_i32_e32 v4, s4
5086 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v5, v2
5087 ; GFX6-NEXT:    v_mov_b32_e32 v1, s8
5088 ; GFX6-NEXT:    v_alignbit_b32 v1, s9, v1, 30
5089 ; GFX6-NEXT:    s_xor_b32 s4, s4, s5
5090 ; GFX6-NEXT:    v_mul_f32_e32 v5, v4, v5
5091 ; GFX6-NEXT:    v_trunc_f32_e32 v5, v5
5092 ; GFX6-NEXT:    s_ashr_i32 s4, s4, 30
5093 ; GFX6-NEXT:    v_mad_f32 v4, -v5, v2, v4
5094 ; GFX6-NEXT:    v_bfe_i32 v1, v1, 0, 15
5095 ; GFX6-NEXT:    s_or_b32 s6, s4, 1
5096 ; GFX6-NEXT:    v_cvt_i32_f32_e32 v5, v5
5097 ; GFX6-NEXT:    v_cmp_ge_f32_e64 s[4:5], |v4|, |v2|
5098 ; GFX6-NEXT:    v_cvt_f32_i32_e32 v2, v1
5099 ; GFX6-NEXT:    s_and_b64 s[4:5], s[4:5], exec
5100 ; GFX6-NEXT:    s_cselect_b32 s4, s6, 0
5101 ; GFX6-NEXT:    v_bfe_i32 v0, v0, 0, 15
5102 ; GFX6-NEXT:    v_add_i32_e32 v4, vcc, s4, v5
5103 ; GFX6-NEXT:    v_cvt_f32_i32_e32 v5, v0
5104 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v6, v2
5105 ; GFX6-NEXT:    v_xor_b32_e32 v0, v0, v1
5106 ; GFX6-NEXT:    v_ashrrev_i32_e32 v0, 30, v0
5107 ; GFX6-NEXT:    v_or_b32_e32 v0, 1, v0
5108 ; GFX6-NEXT:    v_mul_f32_e32 v1, v5, v6
5109 ; GFX6-NEXT:    v_trunc_f32_e32 v1, v1
5110 ; GFX6-NEXT:    v_mad_f32 v5, -v1, v2, v5
5111 ; GFX6-NEXT:    v_cvt_i32_f32_e32 v1, v1
5112 ; GFX6-NEXT:    v_cmp_ge_f32_e64 vcc, |v5|, |v2|
5113 ; GFX6-NEXT:    v_cndmask_b32_e32 v0, 0, v0, vcc
5114 ; GFX6-NEXT:    v_and_b32_e32 v2, 0x7fff, v3
5115 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, v0, v1
5116 ; GFX6-NEXT:    v_and_b32_e32 v3, 0x7fff, v4
5117 ; GFX6-NEXT:    v_lshl_b64 v[0:1], v[0:1], 30
5118 ; GFX6-NEXT:    v_lshlrev_b32_e32 v3, 15, v3
5119 ; GFX6-NEXT:    v_or_b32_e32 v2, v3, v2
5120 ; GFX6-NEXT:    v_or_b32_e32 v0, v2, v0
5121 ; GFX6-NEXT:    buffer_store_dword v0, off, s[0:3], 0
5122 ; GFX6-NEXT:    s_waitcnt expcnt(0)
5123 ; GFX6-NEXT:    v_and_b32_e32 v0, 0x1fff, v1
5124 ; GFX6-NEXT:    buffer_store_short v0, off, s[0:3], 0 offset:4
5125 ; GFX6-NEXT:    s_endpgm
5127 ; GFX9-LABEL: sdiv_v3i15:
5128 ; GFX9:       ; %bb.0:
5129 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
5130 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
5131 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0
5132 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
5133 ; GFX9-NEXT:    s_bfe_i32 s1, s6, 0xf0000
5134 ; GFX9-NEXT:    s_bfe_i32 s0, s2, 0xf0000
5135 ; GFX9-NEXT:    v_cvt_f32_i32_e32 v3, s0
5136 ; GFX9-NEXT:    v_cvt_f32_i32_e32 v4, s1
5137 ; GFX9-NEXT:    s_xor_b32 s0, s1, s0
5138 ; GFX9-NEXT:    v_mov_b32_e32 v1, s2
5139 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v5, v3
5140 ; GFX9-NEXT:    s_ashr_i32 s0, s0, 30
5141 ; GFX9-NEXT:    v_alignbit_b32 v1, s3, v1, 30
5142 ; GFX9-NEXT:    s_or_b32 s3, s0, 1
5143 ; GFX9-NEXT:    v_mul_f32_e32 v5, v4, v5
5144 ; GFX9-NEXT:    v_trunc_f32_e32 v5, v5
5145 ; GFX9-NEXT:    v_mad_f32 v4, -v5, v3, v4
5146 ; GFX9-NEXT:    v_cmp_ge_f32_e64 s[0:1], |v4|, |v3|
5147 ; GFX9-NEXT:    s_and_b64 s[0:1], s[0:1], exec
5148 ; GFX9-NEXT:    v_cvt_i32_f32_e32 v5, v5
5149 ; GFX9-NEXT:    s_cselect_b32 s0, s3, 0
5150 ; GFX9-NEXT:    s_bfe_i32 s1, s2, 0xf000f
5151 ; GFX9-NEXT:    v_cvt_f32_i32_e32 v3, s1
5152 ; GFX9-NEXT:    v_add_u32_e32 v4, s0, v5
5153 ; GFX9-NEXT:    s_bfe_i32 s0, s6, 0xf000f
5154 ; GFX9-NEXT:    v_cvt_f32_i32_e32 v5, s0
5155 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v6, v3
5156 ; GFX9-NEXT:    s_xor_b32 s0, s0, s1
5157 ; GFX9-NEXT:    s_ashr_i32 s0, s0, 30
5158 ; GFX9-NEXT:    v_bfe_i32 v1, v1, 0, 15
5159 ; GFX9-NEXT:    v_mul_f32_e32 v6, v5, v6
5160 ; GFX9-NEXT:    v_trunc_f32_e32 v6, v6
5161 ; GFX9-NEXT:    v_mad_f32 v5, -v6, v3, v5
5162 ; GFX9-NEXT:    s_or_b32 s2, s0, 1
5163 ; GFX9-NEXT:    v_cvt_i32_f32_e32 v6, v6
5164 ; GFX9-NEXT:    v_cmp_ge_f32_e64 s[0:1], |v5|, |v3|
5165 ; GFX9-NEXT:    v_cvt_f32_i32_e32 v3, v1
5166 ; GFX9-NEXT:    v_mov_b32_e32 v0, s6
5167 ; GFX9-NEXT:    v_alignbit_b32 v0, s7, v0, 30
5168 ; GFX9-NEXT:    s_and_b64 s[0:1], s[0:1], exec
5169 ; GFX9-NEXT:    s_cselect_b32 s0, s2, 0
5170 ; GFX9-NEXT:    v_bfe_i32 v0, v0, 0, 15
5171 ; GFX9-NEXT:    v_add_u32_e32 v5, s0, v6
5172 ; GFX9-NEXT:    v_cvt_f32_i32_e32 v6, v0
5173 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v7, v3
5174 ; GFX9-NEXT:    v_xor_b32_e32 v0, v0, v1
5175 ; GFX9-NEXT:    v_ashrrev_i32_e32 v0, 30, v0
5176 ; GFX9-NEXT:    v_or_b32_e32 v0, 1, v0
5177 ; GFX9-NEXT:    v_mul_f32_e32 v1, v6, v7
5178 ; GFX9-NEXT:    v_trunc_f32_e32 v1, v1
5179 ; GFX9-NEXT:    v_cvt_i32_f32_e32 v7, v1
5180 ; GFX9-NEXT:    v_mad_f32 v1, -v1, v3, v6
5181 ; GFX9-NEXT:    v_cmp_ge_f32_e64 vcc, |v1|, |v3|
5182 ; GFX9-NEXT:    v_cndmask_b32_e32 v0, 0, v0, vcc
5183 ; GFX9-NEXT:    v_add_u32_e32 v0, v7, v0
5184 ; GFX9-NEXT:    v_and_b32_e32 v3, 0x7fff, v4
5185 ; GFX9-NEXT:    v_and_b32_e32 v4, 0x7fff, v5
5186 ; GFX9-NEXT:    v_lshlrev_b64 v[0:1], 30, v[0:1]
5187 ; GFX9-NEXT:    v_lshlrev_b32_e32 v4, 15, v4
5188 ; GFX9-NEXT:    v_or_b32_e32 v3, v3, v4
5189 ; GFX9-NEXT:    v_or_b32_e32 v0, v3, v0
5190 ; GFX9-NEXT:    global_store_dword v2, v0, s[4:5]
5191 ; GFX9-NEXT:    v_and_b32_e32 v0, 0x1fff, v1
5192 ; GFX9-NEXT:    global_store_short v2, v0, s[4:5] offset:4
5193 ; GFX9-NEXT:    s_endpgm
5194   %r = sdiv <3 x i15> %x, %y
5195   store <3 x i15> %r, ptr addrspace(1) %out
5196   ret void
5199 define amdgpu_kernel void @srem_v3i15(ptr addrspace(1) %out, <3 x i15> %x, <3 x i15> %y) {
5200 ; CHECK-LABEL: @srem_v3i15(
5201 ; CHECK-NEXT:    [[TMP1:%.*]] = extractelement <3 x i15> [[X:%.*]], i64 0
5202 ; CHECK-NEXT:    [[TMP2:%.*]] = extractelement <3 x i15> [[Y:%.*]], i64 0
5203 ; CHECK-NEXT:    [[TMP3:%.*]] = sext i15 [[TMP1]] to i32
5204 ; CHECK-NEXT:    [[TMP4:%.*]] = sext i15 [[TMP2]] to i32
5205 ; CHECK-NEXT:    [[TMP5:%.*]] = xor i32 [[TMP3]], [[TMP4]]
5206 ; CHECK-NEXT:    [[TMP6:%.*]] = ashr i32 [[TMP5]], 30
5207 ; CHECK-NEXT:    [[TMP7:%.*]] = or i32 [[TMP6]], 1
5208 ; CHECK-NEXT:    [[TMP8:%.*]] = sitofp i32 [[TMP3]] to float
5209 ; CHECK-NEXT:    [[TMP9:%.*]] = sitofp i32 [[TMP4]] to float
5210 ; CHECK-NEXT:    [[TMP10:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP9]])
5211 ; CHECK-NEXT:    [[TMP11:%.*]] = fmul fast float [[TMP8]], [[TMP10]]
5212 ; CHECK-NEXT:    [[TMP12:%.*]] = call fast float @llvm.trunc.f32(float [[TMP11]])
5213 ; CHECK-NEXT:    [[TMP13:%.*]] = fneg fast float [[TMP12]]
5214 ; CHECK-NEXT:    [[TMP14:%.*]] = call fast float @llvm.amdgcn.fmad.ftz.f32(float [[TMP13]], float [[TMP9]], float [[TMP8]])
5215 ; CHECK-NEXT:    [[TMP15:%.*]] = fptosi float [[TMP12]] to i32
5216 ; CHECK-NEXT:    [[TMP16:%.*]] = call fast float @llvm.fabs.f32(float [[TMP14]])
5217 ; CHECK-NEXT:    [[TMP17:%.*]] = call fast float @llvm.fabs.f32(float [[TMP9]])
5218 ; CHECK-NEXT:    [[TMP18:%.*]] = fcmp fast oge float [[TMP16]], [[TMP17]]
5219 ; CHECK-NEXT:    [[TMP19:%.*]] = select i1 [[TMP18]], i32 [[TMP7]], i32 0
5220 ; CHECK-NEXT:    [[TMP20:%.*]] = add i32 [[TMP15]], [[TMP19]]
5221 ; CHECK-NEXT:    [[TMP21:%.*]] = mul i32 [[TMP20]], [[TMP4]]
5222 ; CHECK-NEXT:    [[TMP22:%.*]] = sub i32 [[TMP3]], [[TMP21]]
5223 ; CHECK-NEXT:    [[TMP23:%.*]] = shl i32 [[TMP22]], 17
5224 ; CHECK-NEXT:    [[TMP24:%.*]] = ashr i32 [[TMP23]], 17
5225 ; CHECK-NEXT:    [[TMP25:%.*]] = trunc i32 [[TMP24]] to i15
5226 ; CHECK-NEXT:    [[TMP26:%.*]] = insertelement <3 x i15> poison, i15 [[TMP25]], i64 0
5227 ; CHECK-NEXT:    [[TMP27:%.*]] = extractelement <3 x i15> [[X]], i64 1
5228 ; CHECK-NEXT:    [[TMP28:%.*]] = extractelement <3 x i15> [[Y]], i64 1
5229 ; CHECK-NEXT:    [[TMP29:%.*]] = sext i15 [[TMP27]] to i32
5230 ; CHECK-NEXT:    [[TMP30:%.*]] = sext i15 [[TMP28]] to i32
5231 ; CHECK-NEXT:    [[TMP31:%.*]] = xor i32 [[TMP29]], [[TMP30]]
5232 ; CHECK-NEXT:    [[TMP32:%.*]] = ashr i32 [[TMP31]], 30
5233 ; CHECK-NEXT:    [[TMP33:%.*]] = or i32 [[TMP32]], 1
5234 ; CHECK-NEXT:    [[TMP34:%.*]] = sitofp i32 [[TMP29]] to float
5235 ; CHECK-NEXT:    [[TMP35:%.*]] = sitofp i32 [[TMP30]] to float
5236 ; CHECK-NEXT:    [[TMP36:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP35]])
5237 ; CHECK-NEXT:    [[TMP37:%.*]] = fmul fast float [[TMP34]], [[TMP36]]
5238 ; CHECK-NEXT:    [[TMP38:%.*]] = call fast float @llvm.trunc.f32(float [[TMP37]])
5239 ; CHECK-NEXT:    [[TMP39:%.*]] = fneg fast float [[TMP38]]
5240 ; CHECK-NEXT:    [[TMP40:%.*]] = call fast float @llvm.amdgcn.fmad.ftz.f32(float [[TMP39]], float [[TMP35]], float [[TMP34]])
5241 ; CHECK-NEXT:    [[TMP41:%.*]] = fptosi float [[TMP38]] to i32
5242 ; CHECK-NEXT:    [[TMP42:%.*]] = call fast float @llvm.fabs.f32(float [[TMP40]])
5243 ; CHECK-NEXT:    [[TMP43:%.*]] = call fast float @llvm.fabs.f32(float [[TMP35]])
5244 ; CHECK-NEXT:    [[TMP44:%.*]] = fcmp fast oge float [[TMP42]], [[TMP43]]
5245 ; CHECK-NEXT:    [[TMP45:%.*]] = select i1 [[TMP44]], i32 [[TMP33]], i32 0
5246 ; CHECK-NEXT:    [[TMP46:%.*]] = add i32 [[TMP41]], [[TMP45]]
5247 ; CHECK-NEXT:    [[TMP47:%.*]] = mul i32 [[TMP46]], [[TMP30]]
5248 ; CHECK-NEXT:    [[TMP48:%.*]] = sub i32 [[TMP29]], [[TMP47]]
5249 ; CHECK-NEXT:    [[TMP49:%.*]] = shl i32 [[TMP48]], 17
5250 ; CHECK-NEXT:    [[TMP50:%.*]] = ashr i32 [[TMP49]], 17
5251 ; CHECK-NEXT:    [[TMP51:%.*]] = trunc i32 [[TMP50]] to i15
5252 ; CHECK-NEXT:    [[TMP52:%.*]] = insertelement <3 x i15> [[TMP26]], i15 [[TMP51]], i64 1
5253 ; CHECK-NEXT:    [[TMP53:%.*]] = extractelement <3 x i15> [[X]], i64 2
5254 ; CHECK-NEXT:    [[TMP54:%.*]] = extractelement <3 x i15> [[Y]], i64 2
5255 ; CHECK-NEXT:    [[TMP55:%.*]] = sext i15 [[TMP53]] to i32
5256 ; CHECK-NEXT:    [[TMP56:%.*]] = sext i15 [[TMP54]] to i32
5257 ; CHECK-NEXT:    [[TMP57:%.*]] = xor i32 [[TMP55]], [[TMP56]]
5258 ; CHECK-NEXT:    [[TMP58:%.*]] = ashr i32 [[TMP57]], 30
5259 ; CHECK-NEXT:    [[TMP59:%.*]] = or i32 [[TMP58]], 1
5260 ; CHECK-NEXT:    [[TMP60:%.*]] = sitofp i32 [[TMP55]] to float
5261 ; CHECK-NEXT:    [[TMP61:%.*]] = sitofp i32 [[TMP56]] to float
5262 ; CHECK-NEXT:    [[TMP62:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP61]])
5263 ; CHECK-NEXT:    [[TMP63:%.*]] = fmul fast float [[TMP60]], [[TMP62]]
5264 ; CHECK-NEXT:    [[TMP64:%.*]] = call fast float @llvm.trunc.f32(float [[TMP63]])
5265 ; CHECK-NEXT:    [[TMP65:%.*]] = fneg fast float [[TMP64]]
5266 ; CHECK-NEXT:    [[TMP66:%.*]] = call fast float @llvm.amdgcn.fmad.ftz.f32(float [[TMP65]], float [[TMP61]], float [[TMP60]])
5267 ; CHECK-NEXT:    [[TMP67:%.*]] = fptosi float [[TMP64]] to i32
5268 ; CHECK-NEXT:    [[TMP68:%.*]] = call fast float @llvm.fabs.f32(float [[TMP66]])
5269 ; CHECK-NEXT:    [[TMP69:%.*]] = call fast float @llvm.fabs.f32(float [[TMP61]])
5270 ; CHECK-NEXT:    [[TMP70:%.*]] = fcmp fast oge float [[TMP68]], [[TMP69]]
5271 ; CHECK-NEXT:    [[TMP71:%.*]] = select i1 [[TMP70]], i32 [[TMP59]], i32 0
5272 ; CHECK-NEXT:    [[TMP72:%.*]] = add i32 [[TMP67]], [[TMP71]]
5273 ; CHECK-NEXT:    [[TMP73:%.*]] = mul i32 [[TMP72]], [[TMP56]]
5274 ; CHECK-NEXT:    [[TMP74:%.*]] = sub i32 [[TMP55]], [[TMP73]]
5275 ; CHECK-NEXT:    [[TMP75:%.*]] = shl i32 [[TMP74]], 17
5276 ; CHECK-NEXT:    [[TMP76:%.*]] = ashr i32 [[TMP75]], 17
5277 ; CHECK-NEXT:    [[TMP77:%.*]] = trunc i32 [[TMP76]] to i15
5278 ; CHECK-NEXT:    [[TMP78:%.*]] = insertelement <3 x i15> [[TMP52]], i15 [[TMP77]], i64 2
5279 ; CHECK-NEXT:    store <3 x i15> [[TMP78]], ptr addrspace(1) [[OUT:%.*]], align 8
5280 ; CHECK-NEXT:    ret void
5282 ; GFX6-LABEL: srem_v3i15:
5283 ; GFX6:       ; %bb.0:
5284 ; GFX6-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
5285 ; GFX6-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0xd
5286 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
5287 ; GFX6-NEXT:    s_mov_b32 s2, -1
5288 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
5289 ; GFX6-NEXT:    s_mov_b32 s0, s4
5290 ; GFX6-NEXT:    s_bfe_i32 s4, s8, 0xf0000
5291 ; GFX6-NEXT:    v_cvt_f32_i32_e32 v4, s4
5292 ; GFX6-NEXT:    s_mov_b32 s1, s5
5293 ; GFX6-NEXT:    s_bfe_i32 s5, s6, 0xf0000
5294 ; GFX6-NEXT:    v_cvt_f32_i32_e32 v5, s5
5295 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v6, v4
5296 ; GFX6-NEXT:    s_xor_b32 s4, s5, s4
5297 ; GFX6-NEXT:    v_mov_b32_e32 v0, s6
5298 ; GFX6-NEXT:    v_mov_b32_e32 v2, s8
5299 ; GFX6-NEXT:    v_mul_f32_e32 v6, v5, v6
5300 ; GFX6-NEXT:    v_trunc_f32_e32 v6, v6
5301 ; GFX6-NEXT:    s_ashr_i32 s4, s4, 30
5302 ; GFX6-NEXT:    v_mad_f32 v5, -v6, v4, v5
5303 ; GFX6-NEXT:    v_cvt_i32_f32_e32 v6, v6
5304 ; GFX6-NEXT:    v_alignbit_b32 v0, s7, v0, 30
5305 ; GFX6-NEXT:    s_lshr_b32 s7, s6, 15
5306 ; GFX6-NEXT:    v_alignbit_b32 v2, s9, v2, 30
5307 ; GFX6-NEXT:    s_lshr_b32 s9, s8, 15
5308 ; GFX6-NEXT:    s_or_b32 s10, s4, 1
5309 ; GFX6-NEXT:    v_cmp_ge_f32_e64 s[4:5], |v5|, |v4|
5310 ; GFX6-NEXT:    s_and_b64 s[4:5], s[4:5], exec
5311 ; GFX6-NEXT:    s_cselect_b32 s4, s10, 0
5312 ; GFX6-NEXT:    v_add_i32_e32 v4, vcc, s4, v6
5313 ; GFX6-NEXT:    s_bfe_i32 s4, s8, 0xf000f
5314 ; GFX6-NEXT:    v_cvt_f32_i32_e32 v5, s4
5315 ; GFX6-NEXT:    s_bfe_i32 s5, s6, 0xf000f
5316 ; GFX6-NEXT:    v_cvt_f32_i32_e32 v6, s5
5317 ; GFX6-NEXT:    v_mul_lo_u32 v4, v4, s8
5318 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v7, v5
5319 ; GFX6-NEXT:    s_xor_b32 s4, s5, s4
5320 ; GFX6-NEXT:    v_and_b32_e32 v3, 0x7fff, v2
5321 ; GFX6-NEXT:    s_ashr_i32 s4, s4, 30
5322 ; GFX6-NEXT:    v_mul_f32_e32 v7, v6, v7
5323 ; GFX6-NEXT:    v_trunc_f32_e32 v7, v7
5324 ; GFX6-NEXT:    v_mad_f32 v6, -v7, v5, v6
5325 ; GFX6-NEXT:    v_bfe_i32 v2, v2, 0, 15
5326 ; GFX6-NEXT:    v_sub_i32_e32 v4, vcc, s6, v4
5327 ; GFX6-NEXT:    s_or_b32 s6, s4, 1
5328 ; GFX6-NEXT:    v_cvt_i32_f32_e32 v7, v7
5329 ; GFX6-NEXT:    v_cmp_ge_f32_e64 s[4:5], |v6|, |v5|
5330 ; GFX6-NEXT:    v_cvt_f32_i32_e32 v6, v2
5331 ; GFX6-NEXT:    s_and_b64 s[4:5], s[4:5], exec
5332 ; GFX6-NEXT:    v_and_b32_e32 v1, 0x7fff, v0
5333 ; GFX6-NEXT:    s_cselect_b32 s4, s6, 0
5334 ; GFX6-NEXT:    v_bfe_i32 v0, v0, 0, 15
5335 ; GFX6-NEXT:    v_add_i32_e32 v5, vcc, s4, v7
5336 ; GFX6-NEXT:    v_cvt_f32_i32_e32 v7, v0
5337 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v8, v6
5338 ; GFX6-NEXT:    v_xor_b32_e32 v0, v0, v2
5339 ; GFX6-NEXT:    v_ashrrev_i32_e32 v0, 30, v0
5340 ; GFX6-NEXT:    v_or_b32_e32 v0, 1, v0
5341 ; GFX6-NEXT:    v_mul_f32_e32 v2, v7, v8
5342 ; GFX6-NEXT:    v_trunc_f32_e32 v2, v2
5343 ; GFX6-NEXT:    v_mad_f32 v7, -v2, v6, v7
5344 ; GFX6-NEXT:    v_cvt_i32_f32_e32 v2, v2
5345 ; GFX6-NEXT:    v_cmp_ge_f32_e64 vcc, |v7|, |v6|
5346 ; GFX6-NEXT:    v_cndmask_b32_e32 v0, 0, v0, vcc
5347 ; GFX6-NEXT:    v_mul_lo_u32 v5, v5, s9
5348 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, v0, v2
5349 ; GFX6-NEXT:    v_mul_lo_u32 v0, v0, v3
5350 ; GFX6-NEXT:    v_sub_i32_e32 v2, vcc, s7, v5
5351 ; GFX6-NEXT:    v_and_b32_e32 v2, 0x7fff, v2
5352 ; GFX6-NEXT:    v_sub_i32_e32 v0, vcc, v1, v0
5353 ; GFX6-NEXT:    v_lshl_b64 v[0:1], v[0:1], 30
5354 ; GFX6-NEXT:    v_and_b32_e32 v3, 0x7fff, v4
5355 ; GFX6-NEXT:    v_lshlrev_b32_e32 v2, 15, v2
5356 ; GFX6-NEXT:    v_or_b32_e32 v2, v2, v3
5357 ; GFX6-NEXT:    v_or_b32_e32 v0, v2, v0
5358 ; GFX6-NEXT:    buffer_store_dword v0, off, s[0:3], 0
5359 ; GFX6-NEXT:    s_waitcnt expcnt(0)
5360 ; GFX6-NEXT:    v_and_b32_e32 v0, 0x1fff, v1
5361 ; GFX6-NEXT:    buffer_store_short v0, off, s[0:3], 0 offset:4
5362 ; GFX6-NEXT:    s_endpgm
5364 ; GFX9-LABEL: srem_v3i15:
5365 ; GFX9:       ; %bb.0:
5366 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
5367 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
5368 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0
5369 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
5370 ; GFX9-NEXT:    s_bfe_i32 s1, s6, 0xf0000
5371 ; GFX9-NEXT:    s_bfe_i32 s0, s2, 0xf0000
5372 ; GFX9-NEXT:    v_cvt_f32_i32_e32 v4, s0
5373 ; GFX9-NEXT:    v_cvt_f32_i32_e32 v5, s1
5374 ; GFX9-NEXT:    s_xor_b32 s0, s1, s0
5375 ; GFX9-NEXT:    v_mov_b32_e32 v0, s6
5376 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v6, v4
5377 ; GFX9-NEXT:    v_mov_b32_e32 v1, s2
5378 ; GFX9-NEXT:    s_ashr_i32 s0, s0, 30
5379 ; GFX9-NEXT:    s_lshr_b32 s8, s6, 15
5380 ; GFX9-NEXT:    v_mul_f32_e32 v6, v5, v6
5381 ; GFX9-NEXT:    v_trunc_f32_e32 v6, v6
5382 ; GFX9-NEXT:    v_mad_f32 v5, -v6, v4, v5
5383 ; GFX9-NEXT:    v_cvt_i32_f32_e32 v6, v6
5384 ; GFX9-NEXT:    v_alignbit_b32 v0, s7, v0, 30
5385 ; GFX9-NEXT:    v_alignbit_b32 v1, s3, v1, 30
5386 ; GFX9-NEXT:    s_lshr_b32 s3, s2, 15
5387 ; GFX9-NEXT:    s_or_b32 s7, s0, 1
5388 ; GFX9-NEXT:    v_cmp_ge_f32_e64 s[0:1], |v5|, |v4|
5389 ; GFX9-NEXT:    s_and_b64 s[0:1], s[0:1], exec
5390 ; GFX9-NEXT:    s_cselect_b32 s0, s7, 0
5391 ; GFX9-NEXT:    v_add_u32_e32 v4, s0, v6
5392 ; GFX9-NEXT:    s_bfe_i32 s0, s2, 0xf000f
5393 ; GFX9-NEXT:    v_cvt_f32_i32_e32 v5, s0
5394 ; GFX9-NEXT:    s_bfe_i32 s1, s6, 0xf000f
5395 ; GFX9-NEXT:    v_cvt_f32_i32_e32 v6, s1
5396 ; GFX9-NEXT:    s_xor_b32 s0, s1, s0
5397 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v7, v5
5398 ; GFX9-NEXT:    v_and_b32_e32 v3, 0x7fff, v1
5399 ; GFX9-NEXT:    s_ashr_i32 s0, s0, 30
5400 ; GFX9-NEXT:    v_bfe_i32 v1, v1, 0, 15
5401 ; GFX9-NEXT:    v_mul_f32_e32 v7, v6, v7
5402 ; GFX9-NEXT:    v_trunc_f32_e32 v7, v7
5403 ; GFX9-NEXT:    v_mad_f32 v6, -v7, v5, v6
5404 ; GFX9-NEXT:    v_cvt_i32_f32_e32 v7, v7
5405 ; GFX9-NEXT:    v_mul_lo_u32 v4, v4, s2
5406 ; GFX9-NEXT:    s_or_b32 s2, s0, 1
5407 ; GFX9-NEXT:    v_cmp_ge_f32_e64 s[0:1], |v6|, |v5|
5408 ; GFX9-NEXT:    v_cvt_f32_i32_e32 v6, v1
5409 ; GFX9-NEXT:    s_and_b64 s[0:1], s[0:1], exec
5410 ; GFX9-NEXT:    s_cselect_b32 s0, s2, 0
5411 ; GFX9-NEXT:    v_add_u32_e32 v5, s0, v7
5412 ; GFX9-NEXT:    v_bfe_i32 v7, v0, 0, 15
5413 ; GFX9-NEXT:    v_cvt_f32_i32_e32 v8, v7
5414 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v9, v6
5415 ; GFX9-NEXT:    v_xor_b32_e32 v1, v7, v1
5416 ; GFX9-NEXT:    v_ashrrev_i32_e32 v1, 30, v1
5417 ; GFX9-NEXT:    v_or_b32_e32 v1, 1, v1
5418 ; GFX9-NEXT:    v_mul_f32_e32 v7, v8, v9
5419 ; GFX9-NEXT:    v_trunc_f32_e32 v7, v7
5420 ; GFX9-NEXT:    v_cvt_i32_f32_e32 v9, v7
5421 ; GFX9-NEXT:    v_mad_f32 v7, -v7, v6, v8
5422 ; GFX9-NEXT:    v_cmp_ge_f32_e64 vcc, |v7|, |v6|
5423 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, 0, v1, vcc
5424 ; GFX9-NEXT:    v_mul_lo_u32 v5, v5, s3
5425 ; GFX9-NEXT:    v_add_u32_e32 v1, v9, v1
5426 ; GFX9-NEXT:    v_mul_lo_u32 v1, v1, v3
5427 ; GFX9-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
5428 ; GFX9-NEXT:    v_sub_u32_e32 v3, s6, v4
5429 ; GFX9-NEXT:    v_sub_u32_e32 v4, s8, v5
5430 ; GFX9-NEXT:    v_sub_u32_e32 v0, v0, v1
5431 ; GFX9-NEXT:    v_and_b32_e32 v4, 0x7fff, v4
5432 ; GFX9-NEXT:    v_lshlrev_b64 v[0:1], 30, v[0:1]
5433 ; GFX9-NEXT:    v_and_b32_e32 v3, 0x7fff, v3
5434 ; GFX9-NEXT:    v_lshlrev_b32_e32 v4, 15, v4
5435 ; GFX9-NEXT:    v_or_b32_e32 v3, v3, v4
5436 ; GFX9-NEXT:    v_or_b32_e32 v0, v3, v0
5437 ; GFX9-NEXT:    global_store_dword v2, v0, s[4:5]
5438 ; GFX9-NEXT:    v_and_b32_e32 v0, 0x1fff, v1
5439 ; GFX9-NEXT:    global_store_short v2, v0, s[4:5] offset:4
5440 ; GFX9-NEXT:    s_endpgm
5441   %r = srem <3 x i15> %x, %y
5442   store <3 x i15> %r, ptr addrspace(1) %out
5443   ret void
5446 define amdgpu_kernel void @udiv_i32_oddk_denom(ptr addrspace(1) %out, i32 %x) {
5447 ; CHECK-LABEL: @udiv_i32_oddk_denom(
5448 ; CHECK-NEXT:    [[R:%.*]] = udiv i32 [[X:%.*]], 1235195
5449 ; CHECK-NEXT:    store i32 [[R]], ptr addrspace(1) [[OUT:%.*]], align 4
5450 ; CHECK-NEXT:    ret void
5452 ; GFX6-LABEL: udiv_i32_oddk_denom:
5453 ; GFX6:       ; %bb.0:
5454 ; GFX6-NEXT:    s_load_dword s4, s[0:1], 0xb
5455 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
5456 ; GFX6-NEXT:    v_mov_b32_e32 v0, 0xb2a50881
5457 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
5458 ; GFX6-NEXT:    s_mov_b32 s2, -1
5459 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
5460 ; GFX6-NEXT:    v_mul_hi_u32 v0, s4, v0
5461 ; GFX6-NEXT:    v_sub_i32_e32 v1, vcc, s4, v0
5462 ; GFX6-NEXT:    v_lshrrev_b32_e32 v1, 1, v1
5463 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, v1, v0
5464 ; GFX6-NEXT:    v_lshrrev_b32_e32 v0, 20, v0
5465 ; GFX6-NEXT:    buffer_store_dword v0, off, s[0:3], 0
5466 ; GFX6-NEXT:    s_endpgm
5468 ; GFX9-LABEL: udiv_i32_oddk_denom:
5469 ; GFX9:       ; %bb.0:
5470 ; GFX9-NEXT:    s_load_dword s4, s[0:1], 0x2c
5471 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
5472 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
5473 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
5474 ; GFX9-NEXT:    s_mul_hi_u32 s0, s4, 0xb2a50881
5475 ; GFX9-NEXT:    s_sub_i32 s1, s4, s0
5476 ; GFX9-NEXT:    s_lshr_b32 s1, s1, 1
5477 ; GFX9-NEXT:    s_add_i32 s1, s1, s0
5478 ; GFX9-NEXT:    s_lshr_b32 s0, s1, 20
5479 ; GFX9-NEXT:    v_mov_b32_e32 v1, s0
5480 ; GFX9-NEXT:    global_store_dword v0, v1, s[2:3]
5481 ; GFX9-NEXT:    s_endpgm
5482   %r = udiv i32 %x, 1235195
5483   store i32 %r, ptr addrspace(1) %out
5484   ret void
5487 define amdgpu_kernel void @udiv_i32_pow2k_denom(ptr addrspace(1) %out, i32 %x) {
5488 ; CHECK-LABEL: @udiv_i32_pow2k_denom(
5489 ; CHECK-NEXT:    [[R:%.*]] = udiv i32 [[X:%.*]], 4096
5490 ; CHECK-NEXT:    store i32 [[R]], ptr addrspace(1) [[OUT:%.*]], align 4
5491 ; CHECK-NEXT:    ret void
5493 ; GFX6-LABEL: udiv_i32_pow2k_denom:
5494 ; GFX6:       ; %bb.0:
5495 ; GFX6-NEXT:    s_load_dword s4, s[0:1], 0xb
5496 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
5497 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
5498 ; GFX6-NEXT:    s_mov_b32 s2, -1
5499 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
5500 ; GFX6-NEXT:    s_lshr_b32 s4, s4, 12
5501 ; GFX6-NEXT:    v_mov_b32_e32 v0, s4
5502 ; GFX6-NEXT:    buffer_store_dword v0, off, s[0:3], 0
5503 ; GFX6-NEXT:    s_endpgm
5505 ; GFX9-LABEL: udiv_i32_pow2k_denom:
5506 ; GFX9:       ; %bb.0:
5507 ; GFX9-NEXT:    s_load_dword s4, s[0:1], 0x2c
5508 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
5509 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
5510 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
5511 ; GFX9-NEXT:    s_lshr_b32 s0, s4, 12
5512 ; GFX9-NEXT:    v_mov_b32_e32 v1, s0
5513 ; GFX9-NEXT:    global_store_dword v0, v1, s[2:3]
5514 ; GFX9-NEXT:    s_endpgm
5515   %r = udiv i32 %x, 4096
5516   store i32 %r, ptr addrspace(1) %out
5517   ret void
5520 define amdgpu_kernel void @udiv_i32_pow2_shl_denom(ptr addrspace(1) %out, i32 %x, i32 %y) {
5521 ; CHECK-LABEL: @udiv_i32_pow2_shl_denom(
5522 ; CHECK-NEXT:    [[SHL_Y:%.*]] = shl i32 4096, [[Y:%.*]]
5523 ; CHECK-NEXT:    [[R:%.*]] = udiv i32 [[X:%.*]], [[SHL_Y]]
5524 ; CHECK-NEXT:    store i32 [[R]], ptr addrspace(1) [[OUT:%.*]], align 4
5525 ; CHECK-NEXT:    ret void
5527 ; GFX6-LABEL: udiv_i32_pow2_shl_denom:
5528 ; GFX6:       ; %bb.0:
5529 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
5530 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
5531 ; GFX6-NEXT:    s_mov_b32 s6, -1
5532 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
5533 ; GFX6-NEXT:    s_mov_b32 s4, s0
5534 ; GFX6-NEXT:    s_add_i32 s0, s3, 12
5535 ; GFX6-NEXT:    s_lshr_b32 s0, s2, s0
5536 ; GFX6-NEXT:    s_mov_b32 s5, s1
5537 ; GFX6-NEXT:    v_mov_b32_e32 v0, s0
5538 ; GFX6-NEXT:    buffer_store_dword v0, off, s[4:7], 0
5539 ; GFX6-NEXT:    s_endpgm
5541 ; GFX9-LABEL: udiv_i32_pow2_shl_denom:
5542 ; GFX9:       ; %bb.0:
5543 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
5544 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
5545 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
5546 ; GFX9-NEXT:    s_add_i32 s3, s3, 12
5547 ; GFX9-NEXT:    s_lshr_b32 s2, s2, s3
5548 ; GFX9-NEXT:    v_mov_b32_e32 v1, s2
5549 ; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
5550 ; GFX9-NEXT:    s_endpgm
5551   %shl.y = shl i32 4096, %y
5552   %r = udiv i32 %x, %shl.y
5553   store i32 %r, ptr addrspace(1) %out
5554   ret void
5557 define amdgpu_kernel void @udiv_v2i32_pow2k_denom(ptr addrspace(1) %out, <2 x i32> %x) {
5558 ; CHECK-LABEL: @udiv_v2i32_pow2k_denom(
5559 ; CHECK-NEXT:    [[TMP1:%.*]] = extractelement <2 x i32> [[X:%.*]], i64 0
5560 ; CHECK-NEXT:    [[TMP2:%.*]] = udiv i32 [[TMP1]], 4096
5561 ; CHECK-NEXT:    [[TMP3:%.*]] = insertelement <2 x i32> poison, i32 [[TMP2]], i64 0
5562 ; CHECK-NEXT:    [[TMP4:%.*]] = extractelement <2 x i32> [[X]], i64 1
5563 ; CHECK-NEXT:    [[TMP5:%.*]] = udiv i32 [[TMP4]], 4096
5564 ; CHECK-NEXT:    [[TMP6:%.*]] = insertelement <2 x i32> [[TMP3]], i32 [[TMP5]], i64 1
5565 ; CHECK-NEXT:    store <2 x i32> [[TMP6]], ptr addrspace(1) [[OUT:%.*]], align 8
5566 ; CHECK-NEXT:    ret void
5568 ; GFX6-LABEL: udiv_v2i32_pow2k_denom:
5569 ; GFX6:       ; %bb.0:
5570 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
5571 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
5572 ; GFX6-NEXT:    s_mov_b32 s6, -1
5573 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
5574 ; GFX6-NEXT:    s_mov_b32 s4, s0
5575 ; GFX6-NEXT:    s_mov_b32 s5, s1
5576 ; GFX6-NEXT:    s_lshr_b32 s0, s2, 12
5577 ; GFX6-NEXT:    s_lshr_b32 s1, s3, 12
5578 ; GFX6-NEXT:    v_mov_b32_e32 v0, s0
5579 ; GFX6-NEXT:    v_mov_b32_e32 v1, s1
5580 ; GFX6-NEXT:    buffer_store_dwordx2 v[0:1], off, s[4:7], 0
5581 ; GFX6-NEXT:    s_endpgm
5583 ; GFX9-LABEL: udiv_v2i32_pow2k_denom:
5584 ; GFX9:       ; %bb.0:
5585 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
5586 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0
5587 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
5588 ; GFX9-NEXT:    s_lshr_b32 s2, s2, 12
5589 ; GFX9-NEXT:    s_lshr_b32 s3, s3, 12
5590 ; GFX9-NEXT:    v_mov_b32_e32 v0, s2
5591 ; GFX9-NEXT:    v_mov_b32_e32 v1, s3
5592 ; GFX9-NEXT:    global_store_dwordx2 v2, v[0:1], s[0:1]
5593 ; GFX9-NEXT:    s_endpgm
5594   %r = udiv <2 x i32> %x, <i32 4096, i32 4096>
5595   store <2 x i32> %r, ptr addrspace(1) %out
5596   ret void
5599 define amdgpu_kernel void @udiv_v2i32_mixed_pow2k_denom(ptr addrspace(1) %out, <2 x i32> %x) {
5600 ; CHECK-LABEL: @udiv_v2i32_mixed_pow2k_denom(
5601 ; CHECK-NEXT:    [[TMP1:%.*]] = extractelement <2 x i32> [[X:%.*]], i64 0
5602 ; CHECK-NEXT:    [[TMP2:%.*]] = udiv i32 [[TMP1]], 4096
5603 ; CHECK-NEXT:    [[TMP3:%.*]] = insertelement <2 x i32> poison, i32 [[TMP2]], i64 0
5604 ; CHECK-NEXT:    [[TMP4:%.*]] = extractelement <2 x i32> [[X]], i64 1
5605 ; CHECK-NEXT:    [[TMP5:%.*]] = udiv i32 [[TMP4]], 4095
5606 ; CHECK-NEXT:    [[TMP6:%.*]] = insertelement <2 x i32> [[TMP3]], i32 [[TMP5]], i64 1
5607 ; CHECK-NEXT:    store <2 x i32> [[TMP6]], ptr addrspace(1) [[OUT:%.*]], align 8
5608 ; CHECK-NEXT:    ret void
5610 ; GFX6-LABEL: udiv_v2i32_mixed_pow2k_denom:
5611 ; GFX6:       ; %bb.0:
5612 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
5613 ; GFX6-NEXT:    v_mov_b32_e32 v0, 0x100101
5614 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
5615 ; GFX6-NEXT:    s_mov_b32 s6, -1
5616 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
5617 ; GFX6-NEXT:    v_mul_hi_u32 v0, s3, v0
5618 ; GFX6-NEXT:    s_mov_b32 s4, s0
5619 ; GFX6-NEXT:    s_lshr_b32 s0, s2, 12
5620 ; GFX6-NEXT:    s_mov_b32 s5, s1
5621 ; GFX6-NEXT:    v_sub_i32_e32 v1, vcc, s3, v0
5622 ; GFX6-NEXT:    v_lshrrev_b32_e32 v1, 1, v1
5623 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, v1, v0
5624 ; GFX6-NEXT:    v_lshrrev_b32_e32 v1, 11, v0
5625 ; GFX6-NEXT:    v_mov_b32_e32 v0, s0
5626 ; GFX6-NEXT:    buffer_store_dwordx2 v[0:1], off, s[4:7], 0
5627 ; GFX6-NEXT:    s_endpgm
5629 ; GFX9-LABEL: udiv_v2i32_mixed_pow2k_denom:
5630 ; GFX9:       ; %bb.0:
5631 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
5632 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0
5633 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
5634 ; GFX9-NEXT:    s_mul_hi_u32 s4, s3, 0x100101
5635 ; GFX9-NEXT:    s_sub_i32 s3, s3, s4
5636 ; GFX9-NEXT:    s_lshr_b32 s3, s3, 1
5637 ; GFX9-NEXT:    s_add_i32 s3, s3, s4
5638 ; GFX9-NEXT:    s_lshr_b32 s2, s2, 12
5639 ; GFX9-NEXT:    s_lshr_b32 s3, s3, 11
5640 ; GFX9-NEXT:    v_mov_b32_e32 v0, s2
5641 ; GFX9-NEXT:    v_mov_b32_e32 v1, s3
5642 ; GFX9-NEXT:    global_store_dwordx2 v2, v[0:1], s[0:1]
5643 ; GFX9-NEXT:    s_endpgm
5644   %r = udiv <2 x i32> %x, <i32 4096, i32 4095>
5645   store <2 x i32> %r, ptr addrspace(1) %out
5646   ret void
5649 define amdgpu_kernel void @udiv_v2i32_pow2_shl_denom(ptr addrspace(1) %out, <2 x i32> %x, <2 x i32> %y) {
5650 ; CHECK-LABEL: @udiv_v2i32_pow2_shl_denom(
5651 ; CHECK-NEXT:    [[SHL_Y:%.*]] = shl <2 x i32> <i32 4096, i32 4096>, [[Y:%.*]]
5652 ; CHECK-NEXT:    [[TMP1:%.*]] = extractelement <2 x i32> [[X:%.*]], i64 0
5653 ; CHECK-NEXT:    [[TMP2:%.*]] = extractelement <2 x i32> [[SHL_Y]], i64 0
5654 ; CHECK-NEXT:    [[TMP3:%.*]] = uitofp i32 [[TMP2]] to float
5655 ; CHECK-NEXT:    [[TMP4:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP3]])
5656 ; CHECK-NEXT:    [[TMP5:%.*]] = fmul fast float [[TMP4]], 0x41EFFFFFC0000000
5657 ; CHECK-NEXT:    [[TMP6:%.*]] = fptoui float [[TMP5]] to i32
5658 ; CHECK-NEXT:    [[TMP7:%.*]] = sub i32 0, [[TMP2]]
5659 ; CHECK-NEXT:    [[TMP8:%.*]] = mul i32 [[TMP7]], [[TMP6]]
5660 ; CHECK-NEXT:    [[TMP9:%.*]] = zext i32 [[TMP6]] to i64
5661 ; CHECK-NEXT:    [[TMP10:%.*]] = zext i32 [[TMP8]] to i64
5662 ; CHECK-NEXT:    [[TMP11:%.*]] = mul i64 [[TMP9]], [[TMP10]]
5663 ; CHECK-NEXT:    [[TMP12:%.*]] = trunc i64 [[TMP11]] to i32
5664 ; CHECK-NEXT:    [[TMP13:%.*]] = lshr i64 [[TMP11]], 32
5665 ; CHECK-NEXT:    [[TMP14:%.*]] = trunc i64 [[TMP13]] to i32
5666 ; CHECK-NEXT:    [[TMP15:%.*]] = add i32 [[TMP6]], [[TMP14]]
5667 ; CHECK-NEXT:    [[TMP16:%.*]] = zext i32 [[TMP1]] to i64
5668 ; CHECK-NEXT:    [[TMP17:%.*]] = zext i32 [[TMP15]] to i64
5669 ; CHECK-NEXT:    [[TMP18:%.*]] = mul i64 [[TMP16]], [[TMP17]]
5670 ; CHECK-NEXT:    [[TMP19:%.*]] = trunc i64 [[TMP18]] to i32
5671 ; CHECK-NEXT:    [[TMP20:%.*]] = lshr i64 [[TMP18]], 32
5672 ; CHECK-NEXT:    [[TMP21:%.*]] = trunc i64 [[TMP20]] to i32
5673 ; CHECK-NEXT:    [[TMP22:%.*]] = mul i32 [[TMP21]], [[TMP2]]
5674 ; CHECK-NEXT:    [[TMP23:%.*]] = sub i32 [[TMP1]], [[TMP22]]
5675 ; CHECK-NEXT:    [[TMP24:%.*]] = icmp uge i32 [[TMP23]], [[TMP2]]
5676 ; CHECK-NEXT:    [[TMP25:%.*]] = add i32 [[TMP21]], 1
5677 ; CHECK-NEXT:    [[TMP26:%.*]] = select i1 [[TMP24]], i32 [[TMP25]], i32 [[TMP21]]
5678 ; CHECK-NEXT:    [[TMP27:%.*]] = sub i32 [[TMP23]], [[TMP2]]
5679 ; CHECK-NEXT:    [[TMP28:%.*]] = select i1 [[TMP24]], i32 [[TMP27]], i32 [[TMP23]]
5680 ; CHECK-NEXT:    [[TMP29:%.*]] = icmp uge i32 [[TMP28]], [[TMP2]]
5681 ; CHECK-NEXT:    [[TMP30:%.*]] = add i32 [[TMP26]], 1
5682 ; CHECK-NEXT:    [[TMP31:%.*]] = select i1 [[TMP29]], i32 [[TMP30]], i32 [[TMP26]]
5683 ; CHECK-NEXT:    [[TMP32:%.*]] = insertelement <2 x i32> poison, i32 [[TMP31]], i64 0
5684 ; CHECK-NEXT:    [[TMP33:%.*]] = extractelement <2 x i32> [[X]], i64 1
5685 ; CHECK-NEXT:    [[TMP34:%.*]] = extractelement <2 x i32> [[SHL_Y]], i64 1
5686 ; CHECK-NEXT:    [[TMP35:%.*]] = uitofp i32 [[TMP34]] to float
5687 ; CHECK-NEXT:    [[TMP36:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP35]])
5688 ; CHECK-NEXT:    [[TMP37:%.*]] = fmul fast float [[TMP36]], 0x41EFFFFFC0000000
5689 ; CHECK-NEXT:    [[TMP38:%.*]] = fptoui float [[TMP37]] to i32
5690 ; CHECK-NEXT:    [[TMP39:%.*]] = sub i32 0, [[TMP34]]
5691 ; CHECK-NEXT:    [[TMP40:%.*]] = mul i32 [[TMP39]], [[TMP38]]
5692 ; CHECK-NEXT:    [[TMP41:%.*]] = zext i32 [[TMP38]] to i64
5693 ; CHECK-NEXT:    [[TMP42:%.*]] = zext i32 [[TMP40]] to i64
5694 ; CHECK-NEXT:    [[TMP43:%.*]] = mul i64 [[TMP41]], [[TMP42]]
5695 ; CHECK-NEXT:    [[TMP44:%.*]] = trunc i64 [[TMP43]] to i32
5696 ; CHECK-NEXT:    [[TMP45:%.*]] = lshr i64 [[TMP43]], 32
5697 ; CHECK-NEXT:    [[TMP46:%.*]] = trunc i64 [[TMP45]] to i32
5698 ; CHECK-NEXT:    [[TMP47:%.*]] = add i32 [[TMP38]], [[TMP46]]
5699 ; CHECK-NEXT:    [[TMP48:%.*]] = zext i32 [[TMP33]] to i64
5700 ; CHECK-NEXT:    [[TMP49:%.*]] = zext i32 [[TMP47]] to i64
5701 ; CHECK-NEXT:    [[TMP50:%.*]] = mul i64 [[TMP48]], [[TMP49]]
5702 ; CHECK-NEXT:    [[TMP51:%.*]] = trunc i64 [[TMP50]] to i32
5703 ; CHECK-NEXT:    [[TMP52:%.*]] = lshr i64 [[TMP50]], 32
5704 ; CHECK-NEXT:    [[TMP53:%.*]] = trunc i64 [[TMP52]] to i32
5705 ; CHECK-NEXT:    [[TMP54:%.*]] = mul i32 [[TMP53]], [[TMP34]]
5706 ; CHECK-NEXT:    [[TMP55:%.*]] = sub i32 [[TMP33]], [[TMP54]]
5707 ; CHECK-NEXT:    [[TMP56:%.*]] = icmp uge i32 [[TMP55]], [[TMP34]]
5708 ; CHECK-NEXT:    [[TMP57:%.*]] = add i32 [[TMP53]], 1
5709 ; CHECK-NEXT:    [[TMP58:%.*]] = select i1 [[TMP56]], i32 [[TMP57]], i32 [[TMP53]]
5710 ; CHECK-NEXT:    [[TMP59:%.*]] = sub i32 [[TMP55]], [[TMP34]]
5711 ; CHECK-NEXT:    [[TMP60:%.*]] = select i1 [[TMP56]], i32 [[TMP59]], i32 [[TMP55]]
5712 ; CHECK-NEXT:    [[TMP61:%.*]] = icmp uge i32 [[TMP60]], [[TMP34]]
5713 ; CHECK-NEXT:    [[TMP62:%.*]] = add i32 [[TMP58]], 1
5714 ; CHECK-NEXT:    [[TMP63:%.*]] = select i1 [[TMP61]], i32 [[TMP62]], i32 [[TMP58]]
5715 ; CHECK-NEXT:    [[TMP64:%.*]] = insertelement <2 x i32> [[TMP32]], i32 [[TMP63]], i64 1
5716 ; CHECK-NEXT:    store <2 x i32> [[TMP64]], ptr addrspace(1) [[OUT:%.*]], align 8
5717 ; CHECK-NEXT:    ret void
5719 ; GFX6-LABEL: udiv_v2i32_pow2_shl_denom:
5720 ; GFX6:       ; %bb.0:
5721 ; GFX6-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0xb
5722 ; GFX6-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0x9
5723 ; GFX6-NEXT:    s_mov_b32 s11, 0xf000
5724 ; GFX6-NEXT:    s_mov_b32 s10, -1
5725 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
5726 ; GFX6-NEXT:    s_lshl_b32 s2, 0x1000, s6
5727 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v0, s2
5728 ; GFX6-NEXT:    s_sub_i32 s3, 0, s2
5729 ; GFX6-NEXT:    s_lshl_b32 s6, 0x1000, s7
5730 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v2, s6
5731 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v0, v0
5732 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v2, v2
5733 ; GFX6-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
5734 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v0, v0
5735 ; GFX6-NEXT:    v_mul_lo_u32 v1, s3, v0
5736 ; GFX6-NEXT:    v_mul_hi_u32 v1, v0, v1
5737 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, v0, v1
5738 ; GFX6-NEXT:    v_mul_hi_u32 v0, s4, v0
5739 ; GFX6-NEXT:    v_mul_f32_e32 v1, 0x4f7ffffe, v2
5740 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v1, v1
5741 ; GFX6-NEXT:    v_readfirstlane_b32 s3, v0
5742 ; GFX6-NEXT:    s_mul_i32 s3, s3, s2
5743 ; GFX6-NEXT:    s_sub_i32 s3, s4, s3
5744 ; GFX6-NEXT:    s_sub_i32 s4, s3, s2
5745 ; GFX6-NEXT:    s_cmp_ge_u32 s3, s2
5746 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, 1, v0
5747 ; GFX6-NEXT:    s_cselect_b32 s3, s4, s3
5748 ; GFX6-NEXT:    s_cselect_b64 vcc, -1, 0
5749 ; GFX6-NEXT:    s_cmp_ge_u32 s3, s2
5750 ; GFX6-NEXT:    s_cselect_b64 s[2:3], -1, 0
5751 ; GFX6-NEXT:    s_sub_i32 s4, 0, s6
5752 ; GFX6-NEXT:    v_mul_lo_u32 v3, s4, v1
5753 ; GFX6-NEXT:    v_cndmask_b32_e32 v0, v0, v2, vcc
5754 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, 1, v0
5755 ; GFX6-NEXT:    v_mul_hi_u32 v3, v1, v3
5756 ; GFX6-NEXT:    v_cndmask_b32_e64 v0, v0, v2, s[2:3]
5757 ; GFX6-NEXT:    v_add_i32_e32 v1, vcc, v1, v3
5758 ; GFX6-NEXT:    v_mul_hi_u32 v1, s5, v1
5759 ; GFX6-NEXT:    v_readfirstlane_b32 s0, v1
5760 ; GFX6-NEXT:    s_mul_i32 s0, s0, s6
5761 ; GFX6-NEXT:    s_sub_i32 s0, s5, s0
5762 ; GFX6-NEXT:    s_sub_i32 s1, s0, s6
5763 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, 1, v1
5764 ; GFX6-NEXT:    s_cmp_ge_u32 s0, s6
5765 ; GFX6-NEXT:    s_cselect_b64 vcc, -1, 0
5766 ; GFX6-NEXT:    v_cndmask_b32_e32 v1, v1, v2, vcc
5767 ; GFX6-NEXT:    s_cselect_b32 s0, s1, s0
5768 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, 1, v1
5769 ; GFX6-NEXT:    s_cmp_ge_u32 s0, s6
5770 ; GFX6-NEXT:    s_cselect_b64 vcc, -1, 0
5771 ; GFX6-NEXT:    v_cndmask_b32_e32 v1, v1, v2, vcc
5772 ; GFX6-NEXT:    buffer_store_dwordx2 v[0:1], off, s[8:11], 0
5773 ; GFX6-NEXT:    s_endpgm
5775 ; GFX9-LABEL: udiv_v2i32_pow2_shl_denom:
5776 ; GFX9:       ; %bb.0:
5777 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x2c
5778 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0
5779 ; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
5780 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
5781 ; GFX9-NEXT:    s_lshl_b32 s3, 0x1000, s6
5782 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v0, s3
5783 ; GFX9-NEXT:    s_lshl_b32 s2, 0x1000, s7
5784 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v1, s2
5785 ; GFX9-NEXT:    s_sub_i32 s6, 0, s3
5786 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v0, v0
5787 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v1, v1
5788 ; GFX9-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
5789 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v0, v0
5790 ; GFX9-NEXT:    v_mul_f32_e32 v1, 0x4f7ffffe, v1
5791 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v1, v1
5792 ; GFX9-NEXT:    v_readfirstlane_b32 s7, v0
5793 ; GFX9-NEXT:    s_mul_i32 s6, s6, s7
5794 ; GFX9-NEXT:    s_mul_hi_u32 s6, s7, s6
5795 ; GFX9-NEXT:    s_add_i32 s7, s7, s6
5796 ; GFX9-NEXT:    s_mul_hi_u32 s6, s4, s7
5797 ; GFX9-NEXT:    s_mul_i32 s7, s6, s3
5798 ; GFX9-NEXT:    s_sub_i32 s4, s4, s7
5799 ; GFX9-NEXT:    s_add_i32 s9, s6, 1
5800 ; GFX9-NEXT:    s_sub_i32 s7, s4, s3
5801 ; GFX9-NEXT:    s_cmp_ge_u32 s4, s3
5802 ; GFX9-NEXT:    s_cselect_b32 s6, s9, s6
5803 ; GFX9-NEXT:    s_cselect_b32 s4, s7, s4
5804 ; GFX9-NEXT:    s_add_i32 s7, s6, 1
5805 ; GFX9-NEXT:    s_cmp_ge_u32 s4, s3
5806 ; GFX9-NEXT:    v_readfirstlane_b32 s8, v1
5807 ; GFX9-NEXT:    s_cselect_b32 s3, s7, s6
5808 ; GFX9-NEXT:    s_sub_i32 s4, 0, s2
5809 ; GFX9-NEXT:    s_mul_i32 s4, s4, s8
5810 ; GFX9-NEXT:    s_mul_hi_u32 s4, s8, s4
5811 ; GFX9-NEXT:    s_add_i32 s8, s8, s4
5812 ; GFX9-NEXT:    s_mul_hi_u32 s4, s5, s8
5813 ; GFX9-NEXT:    s_mul_i32 s6, s4, s2
5814 ; GFX9-NEXT:    s_sub_i32 s5, s5, s6
5815 ; GFX9-NEXT:    s_add_i32 s7, s4, 1
5816 ; GFX9-NEXT:    s_sub_i32 s6, s5, s2
5817 ; GFX9-NEXT:    s_cmp_ge_u32 s5, s2
5818 ; GFX9-NEXT:    s_cselect_b32 s4, s7, s4
5819 ; GFX9-NEXT:    s_cselect_b32 s5, s6, s5
5820 ; GFX9-NEXT:    s_add_i32 s6, s4, 1
5821 ; GFX9-NEXT:    s_cmp_ge_u32 s5, s2
5822 ; GFX9-NEXT:    s_cselect_b32 s2, s6, s4
5823 ; GFX9-NEXT:    v_mov_b32_e32 v0, s3
5824 ; GFX9-NEXT:    v_mov_b32_e32 v1, s2
5825 ; GFX9-NEXT:    global_store_dwordx2 v2, v[0:1], s[0:1]
5826 ; GFX9-NEXT:    s_endpgm
5827   %shl.y = shl <2 x i32> <i32 4096, i32 4096>, %y
5828   %r = udiv <2 x i32> %x, %shl.y
5829   store <2 x i32> %r, ptr addrspace(1) %out
5830   ret void
5833 define amdgpu_kernel void @urem_i32_oddk_denom(ptr addrspace(1) %out, i32 %x) {
5834 ; CHECK-LABEL: @urem_i32_oddk_denom(
5835 ; CHECK-NEXT:    [[R:%.*]] = urem i32 [[X:%.*]], 1235195
5836 ; CHECK-NEXT:    store i32 [[R]], ptr addrspace(1) [[OUT:%.*]], align 4
5837 ; CHECK-NEXT:    ret void
5839 ; GFX6-LABEL: urem_i32_oddk_denom:
5840 ; GFX6:       ; %bb.0:
5841 ; GFX6-NEXT:    s_load_dword s4, s[0:1], 0xb
5842 ; GFX6-NEXT:    v_mov_b32_e32 v0, 0xb2a50881
5843 ; GFX6-NEXT:    s_mov_b32 s2, 0x12d8fb
5844 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
5845 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
5846 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
5847 ; GFX6-NEXT:    v_mul_hi_u32 v0, s4, v0
5848 ; GFX6-NEXT:    v_sub_i32_e32 v1, vcc, s4, v0
5849 ; GFX6-NEXT:    v_lshrrev_b32_e32 v1, 1, v1
5850 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, v1, v0
5851 ; GFX6-NEXT:    v_lshrrev_b32_e32 v0, 20, v0
5852 ; GFX6-NEXT:    v_mul_lo_u32 v0, v0, s2
5853 ; GFX6-NEXT:    s_mov_b32 s2, -1
5854 ; GFX6-NEXT:    v_sub_i32_e32 v0, vcc, s4, v0
5855 ; GFX6-NEXT:    buffer_store_dword v0, off, s[0:3], 0
5856 ; GFX6-NEXT:    s_endpgm
5858 ; GFX9-LABEL: urem_i32_oddk_denom:
5859 ; GFX9:       ; %bb.0:
5860 ; GFX9-NEXT:    s_load_dword s4, s[0:1], 0x2c
5861 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
5862 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
5863 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
5864 ; GFX9-NEXT:    s_mul_hi_u32 s0, s4, 0xb2a50881
5865 ; GFX9-NEXT:    s_sub_i32 s1, s4, s0
5866 ; GFX9-NEXT:    s_lshr_b32 s1, s1, 1
5867 ; GFX9-NEXT:    s_add_i32 s1, s1, s0
5868 ; GFX9-NEXT:    s_lshr_b32 s0, s1, 20
5869 ; GFX9-NEXT:    s_mul_i32 s0, s0, 0x12d8fb
5870 ; GFX9-NEXT:    s_sub_i32 s0, s4, s0
5871 ; GFX9-NEXT:    v_mov_b32_e32 v1, s0
5872 ; GFX9-NEXT:    global_store_dword v0, v1, s[2:3]
5873 ; GFX9-NEXT:    s_endpgm
5874   %r = urem i32 %x, 1235195
5875   store i32 %r, ptr addrspace(1) %out
5876   ret void
5879 define amdgpu_kernel void @urem_i32_pow2k_denom(ptr addrspace(1) %out, i32 %x) {
5880 ; CHECK-LABEL: @urem_i32_pow2k_denom(
5881 ; CHECK-NEXT:    [[R:%.*]] = urem i32 [[X:%.*]], 4096
5882 ; CHECK-NEXT:    store i32 [[R]], ptr addrspace(1) [[OUT:%.*]], align 4
5883 ; CHECK-NEXT:    ret void
5885 ; GFX6-LABEL: urem_i32_pow2k_denom:
5886 ; GFX6:       ; %bb.0:
5887 ; GFX6-NEXT:    s_load_dword s4, s[0:1], 0xb
5888 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
5889 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
5890 ; GFX6-NEXT:    s_mov_b32 s2, -1
5891 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
5892 ; GFX6-NEXT:    s_and_b32 s4, s4, 0xfff
5893 ; GFX6-NEXT:    v_mov_b32_e32 v0, s4
5894 ; GFX6-NEXT:    buffer_store_dword v0, off, s[0:3], 0
5895 ; GFX6-NEXT:    s_endpgm
5897 ; GFX9-LABEL: urem_i32_pow2k_denom:
5898 ; GFX9:       ; %bb.0:
5899 ; GFX9-NEXT:    s_load_dword s4, s[0:1], 0x2c
5900 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
5901 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
5902 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
5903 ; GFX9-NEXT:    s_and_b32 s0, s4, 0xfff
5904 ; GFX9-NEXT:    v_mov_b32_e32 v1, s0
5905 ; GFX9-NEXT:    global_store_dword v0, v1, s[2:3]
5906 ; GFX9-NEXT:    s_endpgm
5907   %r = urem i32 %x, 4096
5908   store i32 %r, ptr addrspace(1) %out
5909   ret void
5912 define amdgpu_kernel void @urem_i32_pow2_shl_denom(ptr addrspace(1) %out, i32 %x, i32 %y) {
5913 ; CHECK-LABEL: @urem_i32_pow2_shl_denom(
5914 ; CHECK-NEXT:    [[SHL_Y:%.*]] = shl i32 4096, [[Y:%.*]]
5915 ; CHECK-NEXT:    [[R:%.*]] = urem i32 [[X:%.*]], [[SHL_Y]]
5916 ; CHECK-NEXT:    store i32 [[R]], ptr addrspace(1) [[OUT:%.*]], align 4
5917 ; CHECK-NEXT:    ret void
5919 ; GFX6-LABEL: urem_i32_pow2_shl_denom:
5920 ; GFX6:       ; %bb.0:
5921 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
5922 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
5923 ; GFX6-NEXT:    s_mov_b32 s6, -1
5924 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
5925 ; GFX6-NEXT:    s_mov_b32 s4, s0
5926 ; GFX6-NEXT:    s_lshl_b32 s0, 0x1000, s3
5927 ; GFX6-NEXT:    s_add_i32 s0, s0, -1
5928 ; GFX6-NEXT:    s_and_b32 s0, s2, s0
5929 ; GFX6-NEXT:    s_mov_b32 s5, s1
5930 ; GFX6-NEXT:    v_mov_b32_e32 v0, s0
5931 ; GFX6-NEXT:    buffer_store_dword v0, off, s[4:7], 0
5932 ; GFX6-NEXT:    s_endpgm
5934 ; GFX9-LABEL: urem_i32_pow2_shl_denom:
5935 ; GFX9:       ; %bb.0:
5936 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
5937 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
5938 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
5939 ; GFX9-NEXT:    s_lshl_b32 s3, 0x1000, s3
5940 ; GFX9-NEXT:    s_add_i32 s3, s3, -1
5941 ; GFX9-NEXT:    s_and_b32 s2, s2, s3
5942 ; GFX9-NEXT:    v_mov_b32_e32 v1, s2
5943 ; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
5944 ; GFX9-NEXT:    s_endpgm
5945   %shl.y = shl i32 4096, %y
5946   %r = urem i32 %x, %shl.y
5947   store i32 %r, ptr addrspace(1) %out
5948   ret void
5951 define amdgpu_kernel void @urem_v2i32_pow2k_denom(ptr addrspace(1) %out, <2 x i32> %x) {
5952 ; CHECK-LABEL: @urem_v2i32_pow2k_denom(
5953 ; CHECK-NEXT:    [[TMP1:%.*]] = extractelement <2 x i32> [[X:%.*]], i64 0
5954 ; CHECK-NEXT:    [[TMP2:%.*]] = urem i32 [[TMP1]], 4096
5955 ; CHECK-NEXT:    [[TMP3:%.*]] = insertelement <2 x i32> poison, i32 [[TMP2]], i64 0
5956 ; CHECK-NEXT:    [[TMP4:%.*]] = extractelement <2 x i32> [[X]], i64 1
5957 ; CHECK-NEXT:    [[TMP5:%.*]] = urem i32 [[TMP4]], 4096
5958 ; CHECK-NEXT:    [[TMP6:%.*]] = insertelement <2 x i32> [[TMP3]], i32 [[TMP5]], i64 1
5959 ; CHECK-NEXT:    store <2 x i32> [[TMP6]], ptr addrspace(1) [[OUT:%.*]], align 8
5960 ; CHECK-NEXT:    ret void
5962 ; GFX6-LABEL: urem_v2i32_pow2k_denom:
5963 ; GFX6:       ; %bb.0:
5964 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
5965 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
5966 ; GFX6-NEXT:    s_mov_b32 s6, -1
5967 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
5968 ; GFX6-NEXT:    s_mov_b32 s4, s0
5969 ; GFX6-NEXT:    s_mov_b32 s5, s1
5970 ; GFX6-NEXT:    s_and_b32 s0, s2, 0xfff
5971 ; GFX6-NEXT:    s_and_b32 s1, s3, 0xfff
5972 ; GFX6-NEXT:    v_mov_b32_e32 v0, s0
5973 ; GFX6-NEXT:    v_mov_b32_e32 v1, s1
5974 ; GFX6-NEXT:    buffer_store_dwordx2 v[0:1], off, s[4:7], 0
5975 ; GFX6-NEXT:    s_endpgm
5977 ; GFX9-LABEL: urem_v2i32_pow2k_denom:
5978 ; GFX9:       ; %bb.0:
5979 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
5980 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0
5981 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
5982 ; GFX9-NEXT:    s_and_b32 s2, s2, 0xfff
5983 ; GFX9-NEXT:    s_and_b32 s3, s3, 0xfff
5984 ; GFX9-NEXT:    v_mov_b32_e32 v0, s2
5985 ; GFX9-NEXT:    v_mov_b32_e32 v1, s3
5986 ; GFX9-NEXT:    global_store_dwordx2 v2, v[0:1], s[0:1]
5987 ; GFX9-NEXT:    s_endpgm
5988   %r = urem <2 x i32> %x, <i32 4096, i32 4096>
5989   store <2 x i32> %r, ptr addrspace(1) %out
5990   ret void
5993 define amdgpu_kernel void @urem_v2i32_pow2_shl_denom(ptr addrspace(1) %out, <2 x i32> %x, <2 x i32> %y) {
5994 ; CHECK-LABEL: @urem_v2i32_pow2_shl_denom(
5995 ; CHECK-NEXT:    [[SHL_Y:%.*]] = shl <2 x i32> <i32 4096, i32 4096>, [[Y:%.*]]
5996 ; CHECK-NEXT:    [[TMP1:%.*]] = extractelement <2 x i32> [[X:%.*]], i64 0
5997 ; CHECK-NEXT:    [[TMP2:%.*]] = extractelement <2 x i32> [[SHL_Y]], i64 0
5998 ; CHECK-NEXT:    [[TMP3:%.*]] = uitofp i32 [[TMP2]] to float
5999 ; CHECK-NEXT:    [[TMP4:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP3]])
6000 ; CHECK-NEXT:    [[TMP5:%.*]] = fmul fast float [[TMP4]], 0x41EFFFFFC0000000
6001 ; CHECK-NEXT:    [[TMP6:%.*]] = fptoui float [[TMP5]] to i32
6002 ; CHECK-NEXT:    [[TMP7:%.*]] = sub i32 0, [[TMP2]]
6003 ; CHECK-NEXT:    [[TMP8:%.*]] = mul i32 [[TMP7]], [[TMP6]]
6004 ; CHECK-NEXT:    [[TMP9:%.*]] = zext i32 [[TMP6]] to i64
6005 ; CHECK-NEXT:    [[TMP10:%.*]] = zext i32 [[TMP8]] to i64
6006 ; CHECK-NEXT:    [[TMP11:%.*]] = mul i64 [[TMP9]], [[TMP10]]
6007 ; CHECK-NEXT:    [[TMP12:%.*]] = trunc i64 [[TMP11]] to i32
6008 ; CHECK-NEXT:    [[TMP13:%.*]] = lshr i64 [[TMP11]], 32
6009 ; CHECK-NEXT:    [[TMP14:%.*]] = trunc i64 [[TMP13]] to i32
6010 ; CHECK-NEXT:    [[TMP15:%.*]] = add i32 [[TMP6]], [[TMP14]]
6011 ; CHECK-NEXT:    [[TMP16:%.*]] = zext i32 [[TMP1]] to i64
6012 ; CHECK-NEXT:    [[TMP17:%.*]] = zext i32 [[TMP15]] to i64
6013 ; CHECK-NEXT:    [[TMP18:%.*]] = mul i64 [[TMP16]], [[TMP17]]
6014 ; CHECK-NEXT:    [[TMP19:%.*]] = trunc i64 [[TMP18]] to i32
6015 ; CHECK-NEXT:    [[TMP20:%.*]] = lshr i64 [[TMP18]], 32
6016 ; CHECK-NEXT:    [[TMP21:%.*]] = trunc i64 [[TMP20]] to i32
6017 ; CHECK-NEXT:    [[TMP22:%.*]] = mul i32 [[TMP21]], [[TMP2]]
6018 ; CHECK-NEXT:    [[TMP23:%.*]] = sub i32 [[TMP1]], [[TMP22]]
6019 ; CHECK-NEXT:    [[TMP24:%.*]] = icmp uge i32 [[TMP23]], [[TMP2]]
6020 ; CHECK-NEXT:    [[TMP25:%.*]] = sub i32 [[TMP23]], [[TMP2]]
6021 ; CHECK-NEXT:    [[TMP26:%.*]] = select i1 [[TMP24]], i32 [[TMP25]], i32 [[TMP23]]
6022 ; CHECK-NEXT:    [[TMP27:%.*]] = icmp uge i32 [[TMP26]], [[TMP2]]
6023 ; CHECK-NEXT:    [[TMP28:%.*]] = sub i32 [[TMP26]], [[TMP2]]
6024 ; CHECK-NEXT:    [[TMP29:%.*]] = select i1 [[TMP27]], i32 [[TMP28]], i32 [[TMP26]]
6025 ; CHECK-NEXT:    [[TMP30:%.*]] = insertelement <2 x i32> poison, i32 [[TMP29]], i64 0
6026 ; CHECK-NEXT:    [[TMP31:%.*]] = extractelement <2 x i32> [[X]], i64 1
6027 ; CHECK-NEXT:    [[TMP32:%.*]] = extractelement <2 x i32> [[SHL_Y]], i64 1
6028 ; CHECK-NEXT:    [[TMP33:%.*]] = uitofp i32 [[TMP32]] to float
6029 ; CHECK-NEXT:    [[TMP34:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP33]])
6030 ; CHECK-NEXT:    [[TMP35:%.*]] = fmul fast float [[TMP34]], 0x41EFFFFFC0000000
6031 ; CHECK-NEXT:    [[TMP36:%.*]] = fptoui float [[TMP35]] to i32
6032 ; CHECK-NEXT:    [[TMP37:%.*]] = sub i32 0, [[TMP32]]
6033 ; CHECK-NEXT:    [[TMP38:%.*]] = mul i32 [[TMP37]], [[TMP36]]
6034 ; CHECK-NEXT:    [[TMP39:%.*]] = zext i32 [[TMP36]] to i64
6035 ; CHECK-NEXT:    [[TMP40:%.*]] = zext i32 [[TMP38]] to i64
6036 ; CHECK-NEXT:    [[TMP41:%.*]] = mul i64 [[TMP39]], [[TMP40]]
6037 ; CHECK-NEXT:    [[TMP42:%.*]] = trunc i64 [[TMP41]] to i32
6038 ; CHECK-NEXT:    [[TMP43:%.*]] = lshr i64 [[TMP41]], 32
6039 ; CHECK-NEXT:    [[TMP44:%.*]] = trunc i64 [[TMP43]] to i32
6040 ; CHECK-NEXT:    [[TMP45:%.*]] = add i32 [[TMP36]], [[TMP44]]
6041 ; CHECK-NEXT:    [[TMP46:%.*]] = zext i32 [[TMP31]] to i64
6042 ; CHECK-NEXT:    [[TMP47:%.*]] = zext i32 [[TMP45]] to i64
6043 ; CHECK-NEXT:    [[TMP48:%.*]] = mul i64 [[TMP46]], [[TMP47]]
6044 ; CHECK-NEXT:    [[TMP49:%.*]] = trunc i64 [[TMP48]] to i32
6045 ; CHECK-NEXT:    [[TMP50:%.*]] = lshr i64 [[TMP48]], 32
6046 ; CHECK-NEXT:    [[TMP51:%.*]] = trunc i64 [[TMP50]] to i32
6047 ; CHECK-NEXT:    [[TMP52:%.*]] = mul i32 [[TMP51]], [[TMP32]]
6048 ; CHECK-NEXT:    [[TMP53:%.*]] = sub i32 [[TMP31]], [[TMP52]]
6049 ; CHECK-NEXT:    [[TMP54:%.*]] = icmp uge i32 [[TMP53]], [[TMP32]]
6050 ; CHECK-NEXT:    [[TMP55:%.*]] = sub i32 [[TMP53]], [[TMP32]]
6051 ; CHECK-NEXT:    [[TMP56:%.*]] = select i1 [[TMP54]], i32 [[TMP55]], i32 [[TMP53]]
6052 ; CHECK-NEXT:    [[TMP57:%.*]] = icmp uge i32 [[TMP56]], [[TMP32]]
6053 ; CHECK-NEXT:    [[TMP58:%.*]] = sub i32 [[TMP56]], [[TMP32]]
6054 ; CHECK-NEXT:    [[TMP59:%.*]] = select i1 [[TMP57]], i32 [[TMP58]], i32 [[TMP56]]
6055 ; CHECK-NEXT:    [[TMP60:%.*]] = insertelement <2 x i32> [[TMP30]], i32 [[TMP59]], i64 1
6056 ; CHECK-NEXT:    store <2 x i32> [[TMP60]], ptr addrspace(1) [[OUT:%.*]], align 8
6057 ; CHECK-NEXT:    ret void
6059 ; GFX6-LABEL: urem_v2i32_pow2_shl_denom:
6060 ; GFX6:       ; %bb.0:
6061 ; GFX6-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0xb
6062 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
6063 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
6064 ; GFX6-NEXT:    s_lshl_b32 s2, 0x1000, s6
6065 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v0, s2
6066 ; GFX6-NEXT:    s_sub_i32 s3, 0, s2
6067 ; GFX6-NEXT:    s_lshl_b32 s6, 0x1000, s7
6068 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v2, s6
6069 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v0, v0
6070 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v2, v2
6071 ; GFX6-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
6072 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v0, v0
6073 ; GFX6-NEXT:    v_mul_lo_u32 v1, s3, v0
6074 ; GFX6-NEXT:    v_mul_hi_u32 v1, v0, v1
6075 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, v0, v1
6076 ; GFX6-NEXT:    v_mul_hi_u32 v0, s4, v0
6077 ; GFX6-NEXT:    v_mul_f32_e32 v1, 0x4f7ffffe, v2
6078 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v1, v1
6079 ; GFX6-NEXT:    v_readfirstlane_b32 s3, v0
6080 ; GFX6-NEXT:    s_mul_i32 s3, s3, s2
6081 ; GFX6-NEXT:    s_sub_i32 s3, s4, s3
6082 ; GFX6-NEXT:    s_sub_i32 s4, s3, s2
6083 ; GFX6-NEXT:    s_cmp_ge_u32 s3, s2
6084 ; GFX6-NEXT:    s_cselect_b32 s3, s4, s3
6085 ; GFX6-NEXT:    s_sub_i32 s4, s3, s2
6086 ; GFX6-NEXT:    s_cmp_ge_u32 s3, s2
6087 ; GFX6-NEXT:    s_cselect_b32 s4, s4, s3
6088 ; GFX6-NEXT:    s_sub_i32 s2, 0, s6
6089 ; GFX6-NEXT:    v_mul_lo_u32 v0, s2, v1
6090 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
6091 ; GFX6-NEXT:    s_mov_b32 s2, -1
6092 ; GFX6-NEXT:    v_mul_hi_u32 v0, v1, v0
6093 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, v1, v0
6094 ; GFX6-NEXT:    v_mul_hi_u32 v0, s5, v0
6095 ; GFX6-NEXT:    v_readfirstlane_b32 s7, v0
6096 ; GFX6-NEXT:    s_mul_i32 s7, s7, s6
6097 ; GFX6-NEXT:    s_sub_i32 s5, s5, s7
6098 ; GFX6-NEXT:    s_sub_i32 s7, s5, s6
6099 ; GFX6-NEXT:    s_cmp_ge_u32 s5, s6
6100 ; GFX6-NEXT:    s_cselect_b32 s5, s7, s5
6101 ; GFX6-NEXT:    s_sub_i32 s7, s5, s6
6102 ; GFX6-NEXT:    s_cmp_ge_u32 s5, s6
6103 ; GFX6-NEXT:    s_cselect_b32 s5, s7, s5
6104 ; GFX6-NEXT:    v_mov_b32_e32 v0, s4
6105 ; GFX6-NEXT:    v_mov_b32_e32 v1, s5
6106 ; GFX6-NEXT:    buffer_store_dwordx2 v[0:1], off, s[0:3], 0
6107 ; GFX6-NEXT:    s_endpgm
6109 ; GFX9-LABEL: urem_v2i32_pow2_shl_denom:
6110 ; GFX9:       ; %bb.0:
6111 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x2c
6112 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0
6113 ; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
6114 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
6115 ; GFX9-NEXT:    s_lshl_b32 s3, 0x1000, s6
6116 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v0, s3
6117 ; GFX9-NEXT:    s_lshl_b32 s2, 0x1000, s7
6118 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v1, s2
6119 ; GFX9-NEXT:    s_sub_i32 s6, 0, s3
6120 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v0, v0
6121 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v1, v1
6122 ; GFX9-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
6123 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v0, v0
6124 ; GFX9-NEXT:    v_mul_f32_e32 v1, 0x4f7ffffe, v1
6125 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v1, v1
6126 ; GFX9-NEXT:    v_readfirstlane_b32 s7, v0
6127 ; GFX9-NEXT:    s_mul_i32 s6, s6, s7
6128 ; GFX9-NEXT:    s_mul_hi_u32 s6, s7, s6
6129 ; GFX9-NEXT:    s_add_i32 s7, s7, s6
6130 ; GFX9-NEXT:    s_mul_hi_u32 s6, s4, s7
6131 ; GFX9-NEXT:    s_mul_i32 s6, s6, s3
6132 ; GFX9-NEXT:    s_sub_i32 s4, s4, s6
6133 ; GFX9-NEXT:    s_sub_i32 s6, s4, s3
6134 ; GFX9-NEXT:    s_cmp_ge_u32 s4, s3
6135 ; GFX9-NEXT:    s_cselect_b32 s4, s6, s4
6136 ; GFX9-NEXT:    s_sub_i32 s6, s4, s3
6137 ; GFX9-NEXT:    s_cmp_ge_u32 s4, s3
6138 ; GFX9-NEXT:    v_readfirstlane_b32 s8, v1
6139 ; GFX9-NEXT:    s_cselect_b32 s3, s6, s4
6140 ; GFX9-NEXT:    s_sub_i32 s4, 0, s2
6141 ; GFX9-NEXT:    s_mul_i32 s4, s4, s8
6142 ; GFX9-NEXT:    s_mul_hi_u32 s4, s8, s4
6143 ; GFX9-NEXT:    s_add_i32 s8, s8, s4
6144 ; GFX9-NEXT:    s_mul_hi_u32 s4, s5, s8
6145 ; GFX9-NEXT:    s_mul_i32 s4, s4, s2
6146 ; GFX9-NEXT:    s_sub_i32 s4, s5, s4
6147 ; GFX9-NEXT:    s_sub_i32 s5, s4, s2
6148 ; GFX9-NEXT:    s_cmp_ge_u32 s4, s2
6149 ; GFX9-NEXT:    s_cselect_b32 s4, s5, s4
6150 ; GFX9-NEXT:    s_sub_i32 s5, s4, s2
6151 ; GFX9-NEXT:    s_cmp_ge_u32 s4, s2
6152 ; GFX9-NEXT:    s_cselect_b32 s2, s5, s4
6153 ; GFX9-NEXT:    v_mov_b32_e32 v0, s3
6154 ; GFX9-NEXT:    v_mov_b32_e32 v1, s2
6155 ; GFX9-NEXT:    global_store_dwordx2 v2, v[0:1], s[0:1]
6156 ; GFX9-NEXT:    s_endpgm
6157   %shl.y = shl <2 x i32> <i32 4096, i32 4096>, %y
6158   %r = urem <2 x i32> %x, %shl.y
6159   store <2 x i32> %r, ptr addrspace(1) %out
6160   ret void
6163 define amdgpu_kernel void @sdiv_i32_oddk_denom(ptr addrspace(1) %out, i32 %x) {
6164 ; CHECK-LABEL: @sdiv_i32_oddk_denom(
6165 ; CHECK-NEXT:    [[R:%.*]] = sdiv i32 [[X:%.*]], 1235195
6166 ; CHECK-NEXT:    store i32 [[R]], ptr addrspace(1) [[OUT:%.*]], align 4
6167 ; CHECK-NEXT:    ret void
6169 ; GFX6-LABEL: sdiv_i32_oddk_denom:
6170 ; GFX6:       ; %bb.0:
6171 ; GFX6-NEXT:    s_load_dword s4, s[0:1], 0xb
6172 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
6173 ; GFX6-NEXT:    v_mov_b32_e32 v0, 0xd9528441
6174 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
6175 ; GFX6-NEXT:    s_mov_b32 s2, -1
6176 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
6177 ; GFX6-NEXT:    v_mul_hi_i32 v0, s4, v0
6178 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, s4, v0
6179 ; GFX6-NEXT:    v_lshrrev_b32_e32 v1, 31, v0
6180 ; GFX6-NEXT:    v_ashrrev_i32_e32 v0, 20, v0
6181 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, v0, v1
6182 ; GFX6-NEXT:    buffer_store_dword v0, off, s[0:3], 0
6183 ; GFX6-NEXT:    s_endpgm
6185 ; GFX9-LABEL: sdiv_i32_oddk_denom:
6186 ; GFX9:       ; %bb.0:
6187 ; GFX9-NEXT:    s_load_dword s4, s[0:1], 0x2c
6188 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
6189 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
6190 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
6191 ; GFX9-NEXT:    s_mul_hi_i32 s0, s4, 0xd9528441
6192 ; GFX9-NEXT:    s_add_i32 s0, s0, s4
6193 ; GFX9-NEXT:    s_lshr_b32 s1, s0, 31
6194 ; GFX9-NEXT:    s_ashr_i32 s0, s0, 20
6195 ; GFX9-NEXT:    s_add_i32 s0, s0, s1
6196 ; GFX9-NEXT:    v_mov_b32_e32 v1, s0
6197 ; GFX9-NEXT:    global_store_dword v0, v1, s[2:3]
6198 ; GFX9-NEXT:    s_endpgm
6199   %r = sdiv i32 %x, 1235195
6200   store i32 %r, ptr addrspace(1) %out
6201   ret void
6204 define amdgpu_kernel void @sdiv_i32_pow2k_denom(ptr addrspace(1) %out, i32 %x) {
6205 ; CHECK-LABEL: @sdiv_i32_pow2k_denom(
6206 ; CHECK-NEXT:    [[R:%.*]] = sdiv i32 [[X:%.*]], 4096
6207 ; CHECK-NEXT:    store i32 [[R]], ptr addrspace(1) [[OUT:%.*]], align 4
6208 ; CHECK-NEXT:    ret void
6210 ; GFX6-LABEL: sdiv_i32_pow2k_denom:
6211 ; GFX6:       ; %bb.0:
6212 ; GFX6-NEXT:    s_load_dword s4, s[0:1], 0xb
6213 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
6214 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
6215 ; GFX6-NEXT:    s_mov_b32 s2, -1
6216 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
6217 ; GFX6-NEXT:    s_ashr_i32 s5, s4, 31
6218 ; GFX6-NEXT:    s_lshr_b32 s5, s5, 20
6219 ; GFX6-NEXT:    s_add_i32 s4, s4, s5
6220 ; GFX6-NEXT:    s_ashr_i32 s4, s4, 12
6221 ; GFX6-NEXT:    v_mov_b32_e32 v0, s4
6222 ; GFX6-NEXT:    buffer_store_dword v0, off, s[0:3], 0
6223 ; GFX6-NEXT:    s_endpgm
6225 ; GFX9-LABEL: sdiv_i32_pow2k_denom:
6226 ; GFX9:       ; %bb.0:
6227 ; GFX9-NEXT:    s_load_dword s4, s[0:1], 0x2c
6228 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
6229 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
6230 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
6231 ; GFX9-NEXT:    s_ashr_i32 s0, s4, 31
6232 ; GFX9-NEXT:    s_lshr_b32 s0, s0, 20
6233 ; GFX9-NEXT:    s_add_i32 s4, s4, s0
6234 ; GFX9-NEXT:    s_ashr_i32 s0, s4, 12
6235 ; GFX9-NEXT:    v_mov_b32_e32 v1, s0
6236 ; GFX9-NEXT:    global_store_dword v0, v1, s[2:3]
6237 ; GFX9-NEXT:    s_endpgm
6238   %r = sdiv i32 %x, 4096
6239   store i32 %r, ptr addrspace(1) %out
6240   ret void
6243 define amdgpu_kernel void @sdiv_i32_pow2_shl_denom(ptr addrspace(1) %out, i32 %x, i32 %y) {
6244 ; CHECK-LABEL: @sdiv_i32_pow2_shl_denom(
6245 ; CHECK-NEXT:    [[SHL_Y:%.*]] = shl i32 4096, [[Y:%.*]]
6246 ; CHECK-NEXT:    [[R:%.*]] = sdiv i32 [[X:%.*]], [[SHL_Y]]
6247 ; CHECK-NEXT:    store i32 [[R]], ptr addrspace(1) [[OUT:%.*]], align 4
6248 ; CHECK-NEXT:    ret void
6250 ; GFX6-LABEL: sdiv_i32_pow2_shl_denom:
6251 ; GFX6:       ; %bb.0:
6252 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
6253 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
6254 ; GFX6-NEXT:    s_mov_b32 s6, -1
6255 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
6256 ; GFX6-NEXT:    s_lshl_b32 s3, 0x1000, s3
6257 ; GFX6-NEXT:    s_ashr_i32 s8, s3, 31
6258 ; GFX6-NEXT:    s_add_i32 s3, s3, s8
6259 ; GFX6-NEXT:    s_xor_b32 s3, s3, s8
6260 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v0, s3
6261 ; GFX6-NEXT:    s_sub_i32 s4, 0, s3
6262 ; GFX6-NEXT:    s_ashr_i32 s9, s2, 31
6263 ; GFX6-NEXT:    s_add_i32 s2, s2, s9
6264 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v0, v0
6265 ; GFX6-NEXT:    s_xor_b32 s2, s2, s9
6266 ; GFX6-NEXT:    s_mov_b32 s5, s1
6267 ; GFX6-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
6268 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v0, v0
6269 ; GFX6-NEXT:    v_mul_lo_u32 v1, s4, v0
6270 ; GFX6-NEXT:    s_mov_b32 s4, s0
6271 ; GFX6-NEXT:    v_mul_hi_u32 v1, v0, v1
6272 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, v0, v1
6273 ; GFX6-NEXT:    v_mul_hi_u32 v0, s2, v0
6274 ; GFX6-NEXT:    v_readfirstlane_b32 s0, v0
6275 ; GFX6-NEXT:    s_mul_i32 s0, s0, s3
6276 ; GFX6-NEXT:    s_sub_i32 s0, s2, s0
6277 ; GFX6-NEXT:    s_sub_i32 s1, s0, s3
6278 ; GFX6-NEXT:    v_add_i32_e32 v1, vcc, 1, v0
6279 ; GFX6-NEXT:    s_cmp_ge_u32 s0, s3
6280 ; GFX6-NEXT:    s_cselect_b64 vcc, -1, 0
6281 ; GFX6-NEXT:    s_cselect_b32 s0, s1, s0
6282 ; GFX6-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
6283 ; GFX6-NEXT:    v_add_i32_e32 v1, vcc, 1, v0
6284 ; GFX6-NEXT:    s_cmp_ge_u32 s0, s3
6285 ; GFX6-NEXT:    s_cselect_b64 vcc, -1, 0
6286 ; GFX6-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
6287 ; GFX6-NEXT:    s_xor_b32 s0, s9, s8
6288 ; GFX6-NEXT:    v_xor_b32_e32 v0, s0, v0
6289 ; GFX6-NEXT:    v_subrev_i32_e32 v0, vcc, s0, v0
6290 ; GFX6-NEXT:    buffer_store_dword v0, off, s[4:7], 0
6291 ; GFX6-NEXT:    s_endpgm
6293 ; GFX9-LABEL: sdiv_i32_pow2_shl_denom:
6294 ; GFX9:       ; %bb.0:
6295 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
6296 ; GFX9-NEXT:    v_mov_b32_e32 v1, 0
6297 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
6298 ; GFX9-NEXT:    s_lshl_b32 s3, 0x1000, s3
6299 ; GFX9-NEXT:    s_ashr_i32 s4, s3, 31
6300 ; GFX9-NEXT:    s_add_i32 s3, s3, s4
6301 ; GFX9-NEXT:    s_xor_b32 s3, s3, s4
6302 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v0, s3
6303 ; GFX9-NEXT:    s_sub_i32 s6, 0, s3
6304 ; GFX9-NEXT:    s_ashr_i32 s5, s2, 31
6305 ; GFX9-NEXT:    s_add_i32 s2, s2, s5
6306 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v0, v0
6307 ; GFX9-NEXT:    s_xor_b32 s2, s2, s5
6308 ; GFX9-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
6309 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v0, v0
6310 ; GFX9-NEXT:    v_readfirstlane_b32 s7, v0
6311 ; GFX9-NEXT:    s_mul_i32 s6, s6, s7
6312 ; GFX9-NEXT:    s_mul_hi_u32 s6, s7, s6
6313 ; GFX9-NEXT:    s_add_i32 s7, s7, s6
6314 ; GFX9-NEXT:    s_mul_hi_u32 s6, s2, s7
6315 ; GFX9-NEXT:    s_mul_i32 s8, s6, s3
6316 ; GFX9-NEXT:    s_sub_i32 s2, s2, s8
6317 ; GFX9-NEXT:    s_add_i32 s7, s6, 1
6318 ; GFX9-NEXT:    s_sub_i32 s8, s2, s3
6319 ; GFX9-NEXT:    s_cmp_ge_u32 s2, s3
6320 ; GFX9-NEXT:    s_cselect_b32 s6, s7, s6
6321 ; GFX9-NEXT:    s_cselect_b32 s2, s8, s2
6322 ; GFX9-NEXT:    s_add_i32 s7, s6, 1
6323 ; GFX9-NEXT:    s_cmp_ge_u32 s2, s3
6324 ; GFX9-NEXT:    s_cselect_b32 s2, s7, s6
6325 ; GFX9-NEXT:    s_xor_b32 s3, s5, s4
6326 ; GFX9-NEXT:    s_xor_b32 s2, s2, s3
6327 ; GFX9-NEXT:    s_sub_i32 s2, s2, s3
6328 ; GFX9-NEXT:    v_mov_b32_e32 v0, s2
6329 ; GFX9-NEXT:    global_store_dword v1, v0, s[0:1]
6330 ; GFX9-NEXT:    s_endpgm
6331   %shl.y = shl i32 4096, %y
6332   %r = sdiv i32 %x, %shl.y
6333   store i32 %r, ptr addrspace(1) %out
6334   ret void
6337 define amdgpu_kernel void @sdiv_v2i32_pow2k_denom(ptr addrspace(1) %out, <2 x i32> %x) {
6338 ; CHECK-LABEL: @sdiv_v2i32_pow2k_denom(
6339 ; CHECK-NEXT:    [[TMP1:%.*]] = extractelement <2 x i32> [[X:%.*]], i64 0
6340 ; CHECK-NEXT:    [[TMP2:%.*]] = sdiv i32 [[TMP1]], 4096
6341 ; CHECK-NEXT:    [[TMP3:%.*]] = insertelement <2 x i32> poison, i32 [[TMP2]], i64 0
6342 ; CHECK-NEXT:    [[TMP4:%.*]] = extractelement <2 x i32> [[X]], i64 1
6343 ; CHECK-NEXT:    [[TMP5:%.*]] = sdiv i32 [[TMP4]], 4096
6344 ; CHECK-NEXT:    [[TMP6:%.*]] = insertelement <2 x i32> [[TMP3]], i32 [[TMP5]], i64 1
6345 ; CHECK-NEXT:    store <2 x i32> [[TMP6]], ptr addrspace(1) [[OUT:%.*]], align 8
6346 ; CHECK-NEXT:    ret void
6348 ; GFX6-LABEL: sdiv_v2i32_pow2k_denom:
6349 ; GFX6:       ; %bb.0:
6350 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
6351 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
6352 ; GFX6-NEXT:    s_mov_b32 s6, -1
6353 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
6354 ; GFX6-NEXT:    s_mov_b32 s4, s0
6355 ; GFX6-NEXT:    s_mov_b32 s5, s1
6356 ; GFX6-NEXT:    s_ashr_i32 s0, s2, 31
6357 ; GFX6-NEXT:    s_ashr_i32 s1, s3, 31
6358 ; GFX6-NEXT:    s_lshr_b32 s0, s0, 20
6359 ; GFX6-NEXT:    s_lshr_b32 s1, s1, 20
6360 ; GFX6-NEXT:    s_add_i32 s0, s2, s0
6361 ; GFX6-NEXT:    s_add_i32 s1, s3, s1
6362 ; GFX6-NEXT:    s_ashr_i32 s0, s0, 12
6363 ; GFX6-NEXT:    s_ashr_i32 s1, s1, 12
6364 ; GFX6-NEXT:    v_mov_b32_e32 v0, s0
6365 ; GFX6-NEXT:    v_mov_b32_e32 v1, s1
6366 ; GFX6-NEXT:    buffer_store_dwordx2 v[0:1], off, s[4:7], 0
6367 ; GFX6-NEXT:    s_endpgm
6369 ; GFX9-LABEL: sdiv_v2i32_pow2k_denom:
6370 ; GFX9:       ; %bb.0:
6371 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
6372 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0
6373 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
6374 ; GFX9-NEXT:    s_ashr_i32 s4, s2, 31
6375 ; GFX9-NEXT:    s_ashr_i32 s5, s3, 31
6376 ; GFX9-NEXT:    s_lshr_b32 s4, s4, 20
6377 ; GFX9-NEXT:    s_lshr_b32 s5, s5, 20
6378 ; GFX9-NEXT:    s_add_i32 s2, s2, s4
6379 ; GFX9-NEXT:    s_add_i32 s3, s3, s5
6380 ; GFX9-NEXT:    s_ashr_i32 s2, s2, 12
6381 ; GFX9-NEXT:    s_ashr_i32 s3, s3, 12
6382 ; GFX9-NEXT:    v_mov_b32_e32 v0, s2
6383 ; GFX9-NEXT:    v_mov_b32_e32 v1, s3
6384 ; GFX9-NEXT:    global_store_dwordx2 v2, v[0:1], s[0:1]
6385 ; GFX9-NEXT:    s_endpgm
6386   %r = sdiv <2 x i32> %x, <i32 4096, i32 4096>
6387   store <2 x i32> %r, ptr addrspace(1) %out
6388   ret void
6391 define amdgpu_kernel void @ssdiv_v2i32_mixed_pow2k_denom(ptr addrspace(1) %out, <2 x i32> %x) {
6392 ; CHECK-LABEL: @ssdiv_v2i32_mixed_pow2k_denom(
6393 ; CHECK-NEXT:    [[TMP1:%.*]] = extractelement <2 x i32> [[X:%.*]], i64 0
6394 ; CHECK-NEXT:    [[TMP2:%.*]] = sdiv i32 [[TMP1]], 4096
6395 ; CHECK-NEXT:    [[TMP3:%.*]] = insertelement <2 x i32> poison, i32 [[TMP2]], i64 0
6396 ; CHECK-NEXT:    [[TMP4:%.*]] = extractelement <2 x i32> [[X]], i64 1
6397 ; CHECK-NEXT:    [[TMP5:%.*]] = sdiv i32 [[TMP4]], 4095
6398 ; CHECK-NEXT:    [[TMP6:%.*]] = insertelement <2 x i32> [[TMP3]], i32 [[TMP5]], i64 1
6399 ; CHECK-NEXT:    store <2 x i32> [[TMP6]], ptr addrspace(1) [[OUT:%.*]], align 8
6400 ; CHECK-NEXT:    ret void
6402 ; GFX6-LABEL: ssdiv_v2i32_mixed_pow2k_denom:
6403 ; GFX6:       ; %bb.0:
6404 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
6405 ; GFX6-NEXT:    v_mov_b32_e32 v0, 0x80080081
6406 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
6407 ; GFX6-NEXT:    s_mov_b32 s6, -1
6408 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
6409 ; GFX6-NEXT:    v_mul_hi_i32 v0, s3, v0
6410 ; GFX6-NEXT:    s_mov_b32 s4, s0
6411 ; GFX6-NEXT:    s_ashr_i32 s0, s2, 31
6412 ; GFX6-NEXT:    s_lshr_b32 s0, s0, 20
6413 ; GFX6-NEXT:    s_add_i32 s0, s2, s0
6414 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, s3, v0
6415 ; GFX6-NEXT:    s_ashr_i32 s0, s0, 12
6416 ; GFX6-NEXT:    v_lshrrev_b32_e32 v1, 31, v0
6417 ; GFX6-NEXT:    v_ashrrev_i32_e32 v0, 11, v0
6418 ; GFX6-NEXT:    s_mov_b32 s5, s1
6419 ; GFX6-NEXT:    v_add_i32_e32 v1, vcc, v0, v1
6420 ; GFX6-NEXT:    v_mov_b32_e32 v0, s0
6421 ; GFX6-NEXT:    buffer_store_dwordx2 v[0:1], off, s[4:7], 0
6422 ; GFX6-NEXT:    s_endpgm
6424 ; GFX9-LABEL: ssdiv_v2i32_mixed_pow2k_denom:
6425 ; GFX9:       ; %bb.0:
6426 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
6427 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0
6428 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
6429 ; GFX9-NEXT:    s_ashr_i32 s4, s2, 31
6430 ; GFX9-NEXT:    s_mul_hi_i32 s5, s3, 0x80080081
6431 ; GFX9-NEXT:    s_lshr_b32 s4, s4, 20
6432 ; GFX9-NEXT:    s_add_i32 s5, s5, s3
6433 ; GFX9-NEXT:    s_add_i32 s2, s2, s4
6434 ; GFX9-NEXT:    s_lshr_b32 s3, s5, 31
6435 ; GFX9-NEXT:    s_ashr_i32 s4, s5, 11
6436 ; GFX9-NEXT:    s_ashr_i32 s2, s2, 12
6437 ; GFX9-NEXT:    s_add_i32 s4, s4, s3
6438 ; GFX9-NEXT:    v_mov_b32_e32 v0, s2
6439 ; GFX9-NEXT:    v_mov_b32_e32 v1, s4
6440 ; GFX9-NEXT:    global_store_dwordx2 v2, v[0:1], s[0:1]
6441 ; GFX9-NEXT:    s_endpgm
6442   %r = sdiv <2 x i32> %x, <i32 4096, i32 4095>
6443   store <2 x i32> %r, ptr addrspace(1) %out
6444   ret void
6447 define amdgpu_kernel void @sdiv_v2i32_pow2_shl_denom(ptr addrspace(1) %out, <2 x i32> %x, <2 x i32> %y) {
6448 ; CHECK-LABEL: @sdiv_v2i32_pow2_shl_denom(
6449 ; CHECK-NEXT:    [[SHL_Y:%.*]] = shl <2 x i32> <i32 4096, i32 4096>, [[Y:%.*]]
6450 ; CHECK-NEXT:    [[TMP1:%.*]] = extractelement <2 x i32> [[X:%.*]], i64 0
6451 ; CHECK-NEXT:    [[TMP2:%.*]] = extractelement <2 x i32> [[SHL_Y]], i64 0
6452 ; CHECK-NEXT:    [[TMP3:%.*]] = ashr i32 [[TMP1]], 31
6453 ; CHECK-NEXT:    [[TMP4:%.*]] = ashr i32 [[TMP2]], 31
6454 ; CHECK-NEXT:    [[TMP5:%.*]] = xor i32 [[TMP3]], [[TMP4]]
6455 ; CHECK-NEXT:    [[TMP6:%.*]] = add i32 [[TMP1]], [[TMP3]]
6456 ; CHECK-NEXT:    [[TMP7:%.*]] = add i32 [[TMP2]], [[TMP4]]
6457 ; CHECK-NEXT:    [[TMP8:%.*]] = xor i32 [[TMP6]], [[TMP3]]
6458 ; CHECK-NEXT:    [[TMP9:%.*]] = xor i32 [[TMP7]], [[TMP4]]
6459 ; CHECK-NEXT:    [[TMP10:%.*]] = uitofp i32 [[TMP9]] to float
6460 ; CHECK-NEXT:    [[TMP11:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP10]])
6461 ; CHECK-NEXT:    [[TMP12:%.*]] = fmul fast float [[TMP11]], 0x41EFFFFFC0000000
6462 ; CHECK-NEXT:    [[TMP13:%.*]] = fptoui float [[TMP12]] to i32
6463 ; CHECK-NEXT:    [[TMP14:%.*]] = sub i32 0, [[TMP9]]
6464 ; CHECK-NEXT:    [[TMP15:%.*]] = mul i32 [[TMP14]], [[TMP13]]
6465 ; CHECK-NEXT:    [[TMP16:%.*]] = zext i32 [[TMP13]] to i64
6466 ; CHECK-NEXT:    [[TMP17:%.*]] = zext i32 [[TMP15]] to i64
6467 ; CHECK-NEXT:    [[TMP18:%.*]] = mul i64 [[TMP16]], [[TMP17]]
6468 ; CHECK-NEXT:    [[TMP19:%.*]] = trunc i64 [[TMP18]] to i32
6469 ; CHECK-NEXT:    [[TMP20:%.*]] = lshr i64 [[TMP18]], 32
6470 ; CHECK-NEXT:    [[TMP21:%.*]] = trunc i64 [[TMP20]] to i32
6471 ; CHECK-NEXT:    [[TMP22:%.*]] = add i32 [[TMP13]], [[TMP21]]
6472 ; CHECK-NEXT:    [[TMP23:%.*]] = zext i32 [[TMP8]] to i64
6473 ; CHECK-NEXT:    [[TMP24:%.*]] = zext i32 [[TMP22]] to i64
6474 ; CHECK-NEXT:    [[TMP25:%.*]] = mul i64 [[TMP23]], [[TMP24]]
6475 ; CHECK-NEXT:    [[TMP26:%.*]] = trunc i64 [[TMP25]] to i32
6476 ; CHECK-NEXT:    [[TMP27:%.*]] = lshr i64 [[TMP25]], 32
6477 ; CHECK-NEXT:    [[TMP28:%.*]] = trunc i64 [[TMP27]] to i32
6478 ; CHECK-NEXT:    [[TMP29:%.*]] = mul i32 [[TMP28]], [[TMP9]]
6479 ; CHECK-NEXT:    [[TMP30:%.*]] = sub i32 [[TMP8]], [[TMP29]]
6480 ; CHECK-NEXT:    [[TMP31:%.*]] = icmp uge i32 [[TMP30]], [[TMP9]]
6481 ; CHECK-NEXT:    [[TMP32:%.*]] = add i32 [[TMP28]], 1
6482 ; CHECK-NEXT:    [[TMP33:%.*]] = select i1 [[TMP31]], i32 [[TMP32]], i32 [[TMP28]]
6483 ; CHECK-NEXT:    [[TMP34:%.*]] = sub i32 [[TMP30]], [[TMP9]]
6484 ; CHECK-NEXT:    [[TMP35:%.*]] = select i1 [[TMP31]], i32 [[TMP34]], i32 [[TMP30]]
6485 ; CHECK-NEXT:    [[TMP36:%.*]] = icmp uge i32 [[TMP35]], [[TMP9]]
6486 ; CHECK-NEXT:    [[TMP37:%.*]] = add i32 [[TMP33]], 1
6487 ; CHECK-NEXT:    [[TMP38:%.*]] = select i1 [[TMP36]], i32 [[TMP37]], i32 [[TMP33]]
6488 ; CHECK-NEXT:    [[TMP39:%.*]] = xor i32 [[TMP38]], [[TMP5]]
6489 ; CHECK-NEXT:    [[TMP40:%.*]] = sub i32 [[TMP39]], [[TMP5]]
6490 ; CHECK-NEXT:    [[TMP41:%.*]] = insertelement <2 x i32> poison, i32 [[TMP40]], i64 0
6491 ; CHECK-NEXT:    [[TMP42:%.*]] = extractelement <2 x i32> [[X]], i64 1
6492 ; CHECK-NEXT:    [[TMP43:%.*]] = extractelement <2 x i32> [[SHL_Y]], i64 1
6493 ; CHECK-NEXT:    [[TMP44:%.*]] = ashr i32 [[TMP42]], 31
6494 ; CHECK-NEXT:    [[TMP45:%.*]] = ashr i32 [[TMP43]], 31
6495 ; CHECK-NEXT:    [[TMP46:%.*]] = xor i32 [[TMP44]], [[TMP45]]
6496 ; CHECK-NEXT:    [[TMP47:%.*]] = add i32 [[TMP42]], [[TMP44]]
6497 ; CHECK-NEXT:    [[TMP48:%.*]] = add i32 [[TMP43]], [[TMP45]]
6498 ; CHECK-NEXT:    [[TMP49:%.*]] = xor i32 [[TMP47]], [[TMP44]]
6499 ; CHECK-NEXT:    [[TMP50:%.*]] = xor i32 [[TMP48]], [[TMP45]]
6500 ; CHECK-NEXT:    [[TMP51:%.*]] = uitofp i32 [[TMP50]] to float
6501 ; CHECK-NEXT:    [[TMP52:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP51]])
6502 ; CHECK-NEXT:    [[TMP53:%.*]] = fmul fast float [[TMP52]], 0x41EFFFFFC0000000
6503 ; CHECK-NEXT:    [[TMP54:%.*]] = fptoui float [[TMP53]] to i32
6504 ; CHECK-NEXT:    [[TMP55:%.*]] = sub i32 0, [[TMP50]]
6505 ; CHECK-NEXT:    [[TMP56:%.*]] = mul i32 [[TMP55]], [[TMP54]]
6506 ; CHECK-NEXT:    [[TMP57:%.*]] = zext i32 [[TMP54]] to i64
6507 ; CHECK-NEXT:    [[TMP58:%.*]] = zext i32 [[TMP56]] to i64
6508 ; CHECK-NEXT:    [[TMP59:%.*]] = mul i64 [[TMP57]], [[TMP58]]
6509 ; CHECK-NEXT:    [[TMP60:%.*]] = trunc i64 [[TMP59]] to i32
6510 ; CHECK-NEXT:    [[TMP61:%.*]] = lshr i64 [[TMP59]], 32
6511 ; CHECK-NEXT:    [[TMP62:%.*]] = trunc i64 [[TMP61]] to i32
6512 ; CHECK-NEXT:    [[TMP63:%.*]] = add i32 [[TMP54]], [[TMP62]]
6513 ; CHECK-NEXT:    [[TMP64:%.*]] = zext i32 [[TMP49]] to i64
6514 ; CHECK-NEXT:    [[TMP65:%.*]] = zext i32 [[TMP63]] to i64
6515 ; CHECK-NEXT:    [[TMP66:%.*]] = mul i64 [[TMP64]], [[TMP65]]
6516 ; CHECK-NEXT:    [[TMP67:%.*]] = trunc i64 [[TMP66]] to i32
6517 ; CHECK-NEXT:    [[TMP68:%.*]] = lshr i64 [[TMP66]], 32
6518 ; CHECK-NEXT:    [[TMP69:%.*]] = trunc i64 [[TMP68]] to i32
6519 ; CHECK-NEXT:    [[TMP70:%.*]] = mul i32 [[TMP69]], [[TMP50]]
6520 ; CHECK-NEXT:    [[TMP71:%.*]] = sub i32 [[TMP49]], [[TMP70]]
6521 ; CHECK-NEXT:    [[TMP72:%.*]] = icmp uge i32 [[TMP71]], [[TMP50]]
6522 ; CHECK-NEXT:    [[TMP73:%.*]] = add i32 [[TMP69]], 1
6523 ; CHECK-NEXT:    [[TMP74:%.*]] = select i1 [[TMP72]], i32 [[TMP73]], i32 [[TMP69]]
6524 ; CHECK-NEXT:    [[TMP75:%.*]] = sub i32 [[TMP71]], [[TMP50]]
6525 ; CHECK-NEXT:    [[TMP76:%.*]] = select i1 [[TMP72]], i32 [[TMP75]], i32 [[TMP71]]
6526 ; CHECK-NEXT:    [[TMP77:%.*]] = icmp uge i32 [[TMP76]], [[TMP50]]
6527 ; CHECK-NEXT:    [[TMP78:%.*]] = add i32 [[TMP74]], 1
6528 ; CHECK-NEXT:    [[TMP79:%.*]] = select i1 [[TMP77]], i32 [[TMP78]], i32 [[TMP74]]
6529 ; CHECK-NEXT:    [[TMP80:%.*]] = xor i32 [[TMP79]], [[TMP46]]
6530 ; CHECK-NEXT:    [[TMP81:%.*]] = sub i32 [[TMP80]], [[TMP46]]
6531 ; CHECK-NEXT:    [[TMP82:%.*]] = insertelement <2 x i32> [[TMP41]], i32 [[TMP81]], i64 1
6532 ; CHECK-NEXT:    store <2 x i32> [[TMP82]], ptr addrspace(1) [[OUT:%.*]], align 8
6533 ; CHECK-NEXT:    ret void
6535 ; GFX6-LABEL: sdiv_v2i32_pow2_shl_denom:
6536 ; GFX6:       ; %bb.0:
6537 ; GFX6-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0xb
6538 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
6539 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
6540 ; GFX6-NEXT:    s_lshl_b32 s2, 0x1000, s6
6541 ; GFX6-NEXT:    s_ashr_i32 s3, s2, 31
6542 ; GFX6-NEXT:    s_add_i32 s2, s2, s3
6543 ; GFX6-NEXT:    s_xor_b32 s2, s2, s3
6544 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v0, s2
6545 ; GFX6-NEXT:    s_sub_i32 s6, 0, s2
6546 ; GFX6-NEXT:    s_lshl_b32 s7, 0x1000, s7
6547 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v0, v0
6548 ; GFX6-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
6549 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v0, v0
6550 ; GFX6-NEXT:    v_mul_lo_u32 v1, s6, v0
6551 ; GFX6-NEXT:    s_ashr_i32 s6, s4, 31
6552 ; GFX6-NEXT:    s_add_i32 s4, s4, s6
6553 ; GFX6-NEXT:    s_xor_b32 s4, s4, s6
6554 ; GFX6-NEXT:    v_mul_hi_u32 v1, v0, v1
6555 ; GFX6-NEXT:    s_xor_b32 s6, s6, s3
6556 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, v0, v1
6557 ; GFX6-NEXT:    v_mul_hi_u32 v0, s4, v0
6558 ; GFX6-NEXT:    v_readfirstlane_b32 s3, v0
6559 ; GFX6-NEXT:    s_mul_i32 s3, s3, s2
6560 ; GFX6-NEXT:    s_sub_i32 s3, s4, s3
6561 ; GFX6-NEXT:    s_sub_i32 s4, s3, s2
6562 ; GFX6-NEXT:    v_add_i32_e32 v1, vcc, 1, v0
6563 ; GFX6-NEXT:    s_cmp_ge_u32 s3, s2
6564 ; GFX6-NEXT:    s_cselect_b64 vcc, -1, 0
6565 ; GFX6-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
6566 ; GFX6-NEXT:    s_cselect_b32 s3, s4, s3
6567 ; GFX6-NEXT:    v_add_i32_e32 v1, vcc, 1, v0
6568 ; GFX6-NEXT:    s_cmp_ge_u32 s3, s2
6569 ; GFX6-NEXT:    s_cselect_b64 vcc, -1, 0
6570 ; GFX6-NEXT:    s_ashr_i32 s4, s7, 31
6571 ; GFX6-NEXT:    s_add_i32 s7, s7, s4
6572 ; GFX6-NEXT:    s_xor_b32 s7, s7, s4
6573 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v2, s7
6574 ; GFX6-NEXT:    s_sub_i32 s8, 0, s7
6575 ; GFX6-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
6576 ; GFX6-NEXT:    v_xor_b32_e32 v0, s6, v0
6577 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v2, v2
6578 ; GFX6-NEXT:    v_subrev_i32_e32 v0, vcc, s6, v0
6579 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
6580 ; GFX6-NEXT:    v_mul_f32_e32 v2, 0x4f7ffffe, v2
6581 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v2, v2
6582 ; GFX6-NEXT:    s_mov_b32 s2, -1
6583 ; GFX6-NEXT:    v_mul_lo_u32 v3, s8, v2
6584 ; GFX6-NEXT:    s_ashr_i32 s8, s5, 31
6585 ; GFX6-NEXT:    s_add_i32 s5, s5, s8
6586 ; GFX6-NEXT:    s_xor_b32 s5, s5, s8
6587 ; GFX6-NEXT:    v_mul_hi_u32 v1, v2, v3
6588 ; GFX6-NEXT:    s_xor_b32 s4, s8, s4
6589 ; GFX6-NEXT:    v_add_i32_e32 v1, vcc, v2, v1
6590 ; GFX6-NEXT:    v_mul_hi_u32 v1, s5, v1
6591 ; GFX6-NEXT:    v_readfirstlane_b32 s6, v1
6592 ; GFX6-NEXT:    s_mul_i32 s6, s6, s7
6593 ; GFX6-NEXT:    s_sub_i32 s5, s5, s6
6594 ; GFX6-NEXT:    s_sub_i32 s6, s5, s7
6595 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, 1, v1
6596 ; GFX6-NEXT:    s_cmp_ge_u32 s5, s7
6597 ; GFX6-NEXT:    s_cselect_b64 vcc, -1, 0
6598 ; GFX6-NEXT:    v_cndmask_b32_e32 v1, v1, v2, vcc
6599 ; GFX6-NEXT:    s_cselect_b32 s5, s6, s5
6600 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, 1, v1
6601 ; GFX6-NEXT:    s_cmp_ge_u32 s5, s7
6602 ; GFX6-NEXT:    s_cselect_b64 vcc, -1, 0
6603 ; GFX6-NEXT:    v_cndmask_b32_e32 v1, v1, v2, vcc
6604 ; GFX6-NEXT:    v_xor_b32_e32 v1, s4, v1
6605 ; GFX6-NEXT:    v_subrev_i32_e32 v1, vcc, s4, v1
6606 ; GFX6-NEXT:    buffer_store_dwordx2 v[0:1], off, s[0:3], 0
6607 ; GFX6-NEXT:    s_endpgm
6609 ; GFX9-LABEL: sdiv_v2i32_pow2_shl_denom:
6610 ; GFX9:       ; %bb.0:
6611 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x2c
6612 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0
6613 ; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
6614 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
6615 ; GFX9-NEXT:    s_lshl_b32 s2, 0x1000, s6
6616 ; GFX9-NEXT:    s_ashr_i32 s3, s2, 31
6617 ; GFX9-NEXT:    s_add_i32 s2, s2, s3
6618 ; GFX9-NEXT:    s_xor_b32 s2, s2, s3
6619 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v0, s2
6620 ; GFX9-NEXT:    s_lshl_b32 s6, 0x1000, s7
6621 ; GFX9-NEXT:    s_ashr_i32 s7, s4, 31
6622 ; GFX9-NEXT:    s_add_i32 s4, s4, s7
6623 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v0, v0
6624 ; GFX9-NEXT:    s_xor_b32 s3, s7, s3
6625 ; GFX9-NEXT:    s_xor_b32 s4, s4, s7
6626 ; GFX9-NEXT:    s_sub_i32 s7, 0, s2
6627 ; GFX9-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
6628 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v0, v0
6629 ; GFX9-NEXT:    v_readfirstlane_b32 s8, v0
6630 ; GFX9-NEXT:    s_mul_i32 s7, s7, s8
6631 ; GFX9-NEXT:    s_mul_hi_u32 s7, s8, s7
6632 ; GFX9-NEXT:    s_add_i32 s8, s8, s7
6633 ; GFX9-NEXT:    s_mul_hi_u32 s7, s4, s8
6634 ; GFX9-NEXT:    s_mul_i32 s8, s7, s2
6635 ; GFX9-NEXT:    s_sub_i32 s4, s4, s8
6636 ; GFX9-NEXT:    s_add_i32 s9, s7, 1
6637 ; GFX9-NEXT:    s_sub_i32 s8, s4, s2
6638 ; GFX9-NEXT:    s_cmp_ge_u32 s4, s2
6639 ; GFX9-NEXT:    s_cselect_b32 s7, s9, s7
6640 ; GFX9-NEXT:    s_cselect_b32 s4, s8, s4
6641 ; GFX9-NEXT:    s_add_i32 s8, s7, 1
6642 ; GFX9-NEXT:    s_cmp_ge_u32 s4, s2
6643 ; GFX9-NEXT:    s_cselect_b32 s2, s8, s7
6644 ; GFX9-NEXT:    s_ashr_i32 s4, s6, 31
6645 ; GFX9-NEXT:    s_add_i32 s6, s6, s4
6646 ; GFX9-NEXT:    s_xor_b32 s6, s6, s4
6647 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v0, s6
6648 ; GFX9-NEXT:    s_ashr_i32 s7, s5, 31
6649 ; GFX9-NEXT:    s_xor_b32 s2, s2, s3
6650 ; GFX9-NEXT:    s_add_i32 s5, s5, s7
6651 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v0, v0
6652 ; GFX9-NEXT:    s_xor_b32 s4, s7, s4
6653 ; GFX9-NEXT:    s_sub_i32 s2, s2, s3
6654 ; GFX9-NEXT:    s_xor_b32 s3, s5, s7
6655 ; GFX9-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
6656 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v0, v0
6657 ; GFX9-NEXT:    s_sub_i32 s5, 0, s6
6658 ; GFX9-NEXT:    v_readfirstlane_b32 s7, v0
6659 ; GFX9-NEXT:    s_mul_i32 s5, s5, s7
6660 ; GFX9-NEXT:    s_mul_hi_u32 s5, s7, s5
6661 ; GFX9-NEXT:    s_add_i32 s7, s7, s5
6662 ; GFX9-NEXT:    s_mul_hi_u32 s5, s3, s7
6663 ; GFX9-NEXT:    s_mul_i32 s7, s5, s6
6664 ; GFX9-NEXT:    s_sub_i32 s3, s3, s7
6665 ; GFX9-NEXT:    s_add_i32 s8, s5, 1
6666 ; GFX9-NEXT:    s_sub_i32 s7, s3, s6
6667 ; GFX9-NEXT:    s_cmp_ge_u32 s3, s6
6668 ; GFX9-NEXT:    s_cselect_b32 s5, s8, s5
6669 ; GFX9-NEXT:    s_cselect_b32 s3, s7, s3
6670 ; GFX9-NEXT:    s_add_i32 s7, s5, 1
6671 ; GFX9-NEXT:    s_cmp_ge_u32 s3, s6
6672 ; GFX9-NEXT:    s_cselect_b32 s3, s7, s5
6673 ; GFX9-NEXT:    s_xor_b32 s3, s3, s4
6674 ; GFX9-NEXT:    s_sub_i32 s3, s3, s4
6675 ; GFX9-NEXT:    v_mov_b32_e32 v0, s2
6676 ; GFX9-NEXT:    v_mov_b32_e32 v1, s3
6677 ; GFX9-NEXT:    global_store_dwordx2 v2, v[0:1], s[0:1]
6678 ; GFX9-NEXT:    s_endpgm
6679   %shl.y = shl <2 x i32> <i32 4096, i32 4096>, %y
6680   %r = sdiv <2 x i32> %x, %shl.y
6681   store <2 x i32> %r, ptr addrspace(1) %out
6682   ret void
6685 define amdgpu_kernel void @srem_i32_oddk_denom(ptr addrspace(1) %out, i32 %x) {
6686 ; CHECK-LABEL: @srem_i32_oddk_denom(
6687 ; CHECK-NEXT:    [[R:%.*]] = srem i32 [[X:%.*]], 1235195
6688 ; CHECK-NEXT:    store i32 [[R]], ptr addrspace(1) [[OUT:%.*]], align 4
6689 ; CHECK-NEXT:    ret void
6691 ; GFX6-LABEL: srem_i32_oddk_denom:
6692 ; GFX6:       ; %bb.0:
6693 ; GFX6-NEXT:    s_load_dword s4, s[0:1], 0xb
6694 ; GFX6-NEXT:    v_mov_b32_e32 v0, 0xd9528441
6695 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
6696 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
6697 ; GFX6-NEXT:    s_mov_b32 s2, -1
6698 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
6699 ; GFX6-NEXT:    v_mul_hi_i32 v0, s4, v0
6700 ; GFX6-NEXT:    v_readfirstlane_b32 s5, v0
6701 ; GFX6-NEXT:    s_add_i32 s5, s5, s4
6702 ; GFX6-NEXT:    s_lshr_b32 s6, s5, 31
6703 ; GFX6-NEXT:    s_ashr_i32 s5, s5, 20
6704 ; GFX6-NEXT:    s_add_i32 s5, s5, s6
6705 ; GFX6-NEXT:    s_mul_i32 s5, s5, 0x12d8fb
6706 ; GFX6-NEXT:    s_sub_i32 s4, s4, s5
6707 ; GFX6-NEXT:    v_mov_b32_e32 v0, s4
6708 ; GFX6-NEXT:    buffer_store_dword v0, off, s[0:3], 0
6709 ; GFX6-NEXT:    s_endpgm
6711 ; GFX9-LABEL: srem_i32_oddk_denom:
6712 ; GFX9:       ; %bb.0:
6713 ; GFX9-NEXT:    s_load_dword s4, s[0:1], 0x2c
6714 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
6715 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
6716 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
6717 ; GFX9-NEXT:    s_mul_hi_i32 s0, s4, 0xd9528441
6718 ; GFX9-NEXT:    s_add_i32 s0, s0, s4
6719 ; GFX9-NEXT:    s_lshr_b32 s1, s0, 31
6720 ; GFX9-NEXT:    s_ashr_i32 s0, s0, 20
6721 ; GFX9-NEXT:    s_add_i32 s0, s0, s1
6722 ; GFX9-NEXT:    s_mul_i32 s0, s0, 0x12d8fb
6723 ; GFX9-NEXT:    s_sub_i32 s0, s4, s0
6724 ; GFX9-NEXT:    v_mov_b32_e32 v1, s0
6725 ; GFX9-NEXT:    global_store_dword v0, v1, s[2:3]
6726 ; GFX9-NEXT:    s_endpgm
6727   %r = srem i32 %x, 1235195
6728   store i32 %r, ptr addrspace(1) %out
6729   ret void
6732 define amdgpu_kernel void @srem_i32_pow2k_denom(ptr addrspace(1) %out, i32 %x) {
6733 ; CHECK-LABEL: @srem_i32_pow2k_denom(
6734 ; CHECK-NEXT:    [[R:%.*]] = srem i32 [[X:%.*]], 4096
6735 ; CHECK-NEXT:    store i32 [[R]], ptr addrspace(1) [[OUT:%.*]], align 4
6736 ; CHECK-NEXT:    ret void
6738 ; GFX6-LABEL: srem_i32_pow2k_denom:
6739 ; GFX6:       ; %bb.0:
6740 ; GFX6-NEXT:    s_load_dword s4, s[0:1], 0xb
6741 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
6742 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
6743 ; GFX6-NEXT:    s_mov_b32 s2, -1
6744 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
6745 ; GFX6-NEXT:    s_ashr_i32 s5, s4, 31
6746 ; GFX6-NEXT:    s_lshr_b32 s5, s5, 20
6747 ; GFX6-NEXT:    s_add_i32 s5, s4, s5
6748 ; GFX6-NEXT:    s_and_b32 s5, s5, 0xfffff000
6749 ; GFX6-NEXT:    s_sub_i32 s4, s4, s5
6750 ; GFX6-NEXT:    v_mov_b32_e32 v0, s4
6751 ; GFX6-NEXT:    buffer_store_dword v0, off, s[0:3], 0
6752 ; GFX6-NEXT:    s_endpgm
6754 ; GFX9-LABEL: srem_i32_pow2k_denom:
6755 ; GFX9:       ; %bb.0:
6756 ; GFX9-NEXT:    s_load_dword s4, s[0:1], 0x2c
6757 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
6758 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
6759 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
6760 ; GFX9-NEXT:    s_ashr_i32 s0, s4, 31
6761 ; GFX9-NEXT:    s_lshr_b32 s0, s0, 20
6762 ; GFX9-NEXT:    s_add_i32 s0, s4, s0
6763 ; GFX9-NEXT:    s_and_b32 s0, s0, 0xfffff000
6764 ; GFX9-NEXT:    s_sub_i32 s0, s4, s0
6765 ; GFX9-NEXT:    v_mov_b32_e32 v1, s0
6766 ; GFX9-NEXT:    global_store_dword v0, v1, s[2:3]
6767 ; GFX9-NEXT:    s_endpgm
6768   %r = srem i32 %x, 4096
6769   store i32 %r, ptr addrspace(1) %out
6770   ret void
6773 define amdgpu_kernel void @srem_i32_pow2_shl_denom(ptr addrspace(1) %out, i32 %x, i32 %y) {
6774 ; CHECK-LABEL: @srem_i32_pow2_shl_denom(
6775 ; CHECK-NEXT:    [[SHL_Y:%.*]] = shl i32 4096, [[Y:%.*]]
6776 ; CHECK-NEXT:    [[R:%.*]] = srem i32 [[X:%.*]], [[SHL_Y]]
6777 ; CHECK-NEXT:    store i32 [[R]], ptr addrspace(1) [[OUT:%.*]], align 4
6778 ; CHECK-NEXT:    ret void
6780 ; GFX6-LABEL: srem_i32_pow2_shl_denom:
6781 ; GFX6:       ; %bb.0:
6782 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
6783 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
6784 ; GFX6-NEXT:    s_lshl_b32 s3, 0x1000, s3
6785 ; GFX6-NEXT:    s_ashr_i32 s4, s3, 31
6786 ; GFX6-NEXT:    s_add_i32 s3, s3, s4
6787 ; GFX6-NEXT:    s_xor_b32 s4, s3, s4
6788 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v0, s4
6789 ; GFX6-NEXT:    s_sub_i32 s3, 0, s4
6790 ; GFX6-NEXT:    s_ashr_i32 s5, s2, 31
6791 ; GFX6-NEXT:    s_add_i32 s2, s2, s5
6792 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v0, v0
6793 ; GFX6-NEXT:    s_xor_b32 s6, s2, s5
6794 ; GFX6-NEXT:    s_mov_b32 s2, -1
6795 ; GFX6-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
6796 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v0, v0
6797 ; GFX6-NEXT:    v_mul_lo_u32 v1, s3, v0
6798 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
6799 ; GFX6-NEXT:    v_mul_hi_u32 v1, v0, v1
6800 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, v0, v1
6801 ; GFX6-NEXT:    v_mul_hi_u32 v0, s6, v0
6802 ; GFX6-NEXT:    v_readfirstlane_b32 s7, v0
6803 ; GFX6-NEXT:    s_mul_i32 s7, s7, s4
6804 ; GFX6-NEXT:    s_sub_i32 s6, s6, s7
6805 ; GFX6-NEXT:    s_sub_i32 s7, s6, s4
6806 ; GFX6-NEXT:    s_cmp_ge_u32 s6, s4
6807 ; GFX6-NEXT:    s_cselect_b32 s6, s7, s6
6808 ; GFX6-NEXT:    s_sub_i32 s7, s6, s4
6809 ; GFX6-NEXT:    s_cmp_ge_u32 s6, s4
6810 ; GFX6-NEXT:    s_cselect_b32 s4, s7, s6
6811 ; GFX6-NEXT:    s_xor_b32 s4, s4, s5
6812 ; GFX6-NEXT:    s_sub_i32 s4, s4, s5
6813 ; GFX6-NEXT:    v_mov_b32_e32 v0, s4
6814 ; GFX6-NEXT:    buffer_store_dword v0, off, s[0:3], 0
6815 ; GFX6-NEXT:    s_endpgm
6817 ; GFX9-LABEL: srem_i32_pow2_shl_denom:
6818 ; GFX9:       ; %bb.0:
6819 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
6820 ; GFX9-NEXT:    v_mov_b32_e32 v1, 0
6821 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
6822 ; GFX9-NEXT:    s_lshl_b32 s3, 0x1000, s3
6823 ; GFX9-NEXT:    s_ashr_i32 s4, s3, 31
6824 ; GFX9-NEXT:    s_add_i32 s3, s3, s4
6825 ; GFX9-NEXT:    s_xor_b32 s3, s3, s4
6826 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v0, s3
6827 ; GFX9-NEXT:    s_sub_i32 s5, 0, s3
6828 ; GFX9-NEXT:    s_ashr_i32 s4, s2, 31
6829 ; GFX9-NEXT:    s_add_i32 s2, s2, s4
6830 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v0, v0
6831 ; GFX9-NEXT:    s_xor_b32 s2, s2, s4
6832 ; GFX9-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
6833 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v0, v0
6834 ; GFX9-NEXT:    v_readfirstlane_b32 s6, v0
6835 ; GFX9-NEXT:    s_mul_i32 s5, s5, s6
6836 ; GFX9-NEXT:    s_mul_hi_u32 s5, s6, s5
6837 ; GFX9-NEXT:    s_add_i32 s6, s6, s5
6838 ; GFX9-NEXT:    s_mul_hi_u32 s5, s2, s6
6839 ; GFX9-NEXT:    s_mul_i32 s5, s5, s3
6840 ; GFX9-NEXT:    s_sub_i32 s2, s2, s5
6841 ; GFX9-NEXT:    s_sub_i32 s5, s2, s3
6842 ; GFX9-NEXT:    s_cmp_ge_u32 s2, s3
6843 ; GFX9-NEXT:    s_cselect_b32 s2, s5, s2
6844 ; GFX9-NEXT:    s_sub_i32 s5, s2, s3
6845 ; GFX9-NEXT:    s_cmp_ge_u32 s2, s3
6846 ; GFX9-NEXT:    s_cselect_b32 s2, s5, s2
6847 ; GFX9-NEXT:    s_xor_b32 s2, s2, s4
6848 ; GFX9-NEXT:    s_sub_i32 s2, s2, s4
6849 ; GFX9-NEXT:    v_mov_b32_e32 v0, s2
6850 ; GFX9-NEXT:    global_store_dword v1, v0, s[0:1]
6851 ; GFX9-NEXT:    s_endpgm
6852   %shl.y = shl i32 4096, %y
6853   %r = srem i32 %x, %shl.y
6854   store i32 %r, ptr addrspace(1) %out
6855   ret void
6858 define amdgpu_kernel void @srem_v2i32_pow2k_denom(ptr addrspace(1) %out, <2 x i32> %x) {
6859 ; CHECK-LABEL: @srem_v2i32_pow2k_denom(
6860 ; CHECK-NEXT:    [[TMP1:%.*]] = extractelement <2 x i32> [[X:%.*]], i64 0
6861 ; CHECK-NEXT:    [[TMP2:%.*]] = srem i32 [[TMP1]], 4096
6862 ; CHECK-NEXT:    [[TMP3:%.*]] = insertelement <2 x i32> poison, i32 [[TMP2]], i64 0
6863 ; CHECK-NEXT:    [[TMP4:%.*]] = extractelement <2 x i32> [[X]], i64 1
6864 ; CHECK-NEXT:    [[TMP5:%.*]] = srem i32 [[TMP4]], 4096
6865 ; CHECK-NEXT:    [[TMP6:%.*]] = insertelement <2 x i32> [[TMP3]], i32 [[TMP5]], i64 1
6866 ; CHECK-NEXT:    store <2 x i32> [[TMP6]], ptr addrspace(1) [[OUT:%.*]], align 8
6867 ; CHECK-NEXT:    ret void
6869 ; GFX6-LABEL: srem_v2i32_pow2k_denom:
6870 ; GFX6:       ; %bb.0:
6871 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
6872 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
6873 ; GFX6-NEXT:    s_mov_b32 s6, -1
6874 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
6875 ; GFX6-NEXT:    s_mov_b32 s4, s0
6876 ; GFX6-NEXT:    s_mov_b32 s5, s1
6877 ; GFX6-NEXT:    s_ashr_i32 s0, s2, 31
6878 ; GFX6-NEXT:    s_ashr_i32 s1, s3, 31
6879 ; GFX6-NEXT:    s_lshr_b32 s0, s0, 20
6880 ; GFX6-NEXT:    s_lshr_b32 s1, s1, 20
6881 ; GFX6-NEXT:    s_add_i32 s0, s2, s0
6882 ; GFX6-NEXT:    s_add_i32 s1, s3, s1
6883 ; GFX6-NEXT:    s_and_b32 s0, s0, 0xfffff000
6884 ; GFX6-NEXT:    s_and_b32 s1, s1, 0xfffff000
6885 ; GFX6-NEXT:    s_sub_i32 s0, s2, s0
6886 ; GFX6-NEXT:    s_sub_i32 s1, s3, s1
6887 ; GFX6-NEXT:    v_mov_b32_e32 v0, s0
6888 ; GFX6-NEXT:    v_mov_b32_e32 v1, s1
6889 ; GFX6-NEXT:    buffer_store_dwordx2 v[0:1], off, s[4:7], 0
6890 ; GFX6-NEXT:    s_endpgm
6892 ; GFX9-LABEL: srem_v2i32_pow2k_denom:
6893 ; GFX9:       ; %bb.0:
6894 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
6895 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0
6896 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
6897 ; GFX9-NEXT:    s_ashr_i32 s4, s2, 31
6898 ; GFX9-NEXT:    s_ashr_i32 s5, s3, 31
6899 ; GFX9-NEXT:    s_lshr_b32 s4, s4, 20
6900 ; GFX9-NEXT:    s_lshr_b32 s5, s5, 20
6901 ; GFX9-NEXT:    s_add_i32 s4, s2, s4
6902 ; GFX9-NEXT:    s_add_i32 s5, s3, s5
6903 ; GFX9-NEXT:    s_and_b32 s4, s4, 0xfffff000
6904 ; GFX9-NEXT:    s_sub_i32 s2, s2, s4
6905 ; GFX9-NEXT:    s_and_b32 s4, s5, 0xfffff000
6906 ; GFX9-NEXT:    s_sub_i32 s3, s3, s4
6907 ; GFX9-NEXT:    v_mov_b32_e32 v0, s2
6908 ; GFX9-NEXT:    v_mov_b32_e32 v1, s3
6909 ; GFX9-NEXT:    global_store_dwordx2 v2, v[0:1], s[0:1]
6910 ; GFX9-NEXT:    s_endpgm
6911   %r = srem <2 x i32> %x, <i32 4096, i32 4096>
6912   store <2 x i32> %r, ptr addrspace(1) %out
6913   ret void
6916 define amdgpu_kernel void @srem_v2i32_pow2_shl_denom(ptr addrspace(1) %out, <2 x i32> %x, <2 x i32> %y) {
6917 ; CHECK-LABEL: @srem_v2i32_pow2_shl_denom(
6918 ; CHECK-NEXT:    [[SHL_Y:%.*]] = shl <2 x i32> <i32 4096, i32 4096>, [[Y:%.*]]
6919 ; CHECK-NEXT:    [[TMP1:%.*]] = extractelement <2 x i32> [[X:%.*]], i64 0
6920 ; CHECK-NEXT:    [[TMP2:%.*]] = extractelement <2 x i32> [[SHL_Y]], i64 0
6921 ; CHECK-NEXT:    [[TMP3:%.*]] = ashr i32 [[TMP1]], 31
6922 ; CHECK-NEXT:    [[TMP4:%.*]] = ashr i32 [[TMP2]], 31
6923 ; CHECK-NEXT:    [[TMP5:%.*]] = add i32 [[TMP1]], [[TMP3]]
6924 ; CHECK-NEXT:    [[TMP6:%.*]] = add i32 [[TMP2]], [[TMP4]]
6925 ; CHECK-NEXT:    [[TMP7:%.*]] = xor i32 [[TMP5]], [[TMP3]]
6926 ; CHECK-NEXT:    [[TMP8:%.*]] = xor i32 [[TMP6]], [[TMP4]]
6927 ; CHECK-NEXT:    [[TMP9:%.*]] = uitofp i32 [[TMP8]] to float
6928 ; CHECK-NEXT:    [[TMP10:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP9]])
6929 ; CHECK-NEXT:    [[TMP11:%.*]] = fmul fast float [[TMP10]], 0x41EFFFFFC0000000
6930 ; CHECK-NEXT:    [[TMP12:%.*]] = fptoui float [[TMP11]] to i32
6931 ; CHECK-NEXT:    [[TMP13:%.*]] = sub i32 0, [[TMP8]]
6932 ; CHECK-NEXT:    [[TMP14:%.*]] = mul i32 [[TMP13]], [[TMP12]]
6933 ; CHECK-NEXT:    [[TMP15:%.*]] = zext i32 [[TMP12]] to i64
6934 ; CHECK-NEXT:    [[TMP16:%.*]] = zext i32 [[TMP14]] to i64
6935 ; CHECK-NEXT:    [[TMP17:%.*]] = mul i64 [[TMP15]], [[TMP16]]
6936 ; CHECK-NEXT:    [[TMP18:%.*]] = trunc i64 [[TMP17]] to i32
6937 ; CHECK-NEXT:    [[TMP19:%.*]] = lshr i64 [[TMP17]], 32
6938 ; CHECK-NEXT:    [[TMP20:%.*]] = trunc i64 [[TMP19]] to i32
6939 ; CHECK-NEXT:    [[TMP21:%.*]] = add i32 [[TMP12]], [[TMP20]]
6940 ; CHECK-NEXT:    [[TMP22:%.*]] = zext i32 [[TMP7]] to i64
6941 ; CHECK-NEXT:    [[TMP23:%.*]] = zext i32 [[TMP21]] to i64
6942 ; CHECK-NEXT:    [[TMP24:%.*]] = mul i64 [[TMP22]], [[TMP23]]
6943 ; CHECK-NEXT:    [[TMP25:%.*]] = trunc i64 [[TMP24]] to i32
6944 ; CHECK-NEXT:    [[TMP26:%.*]] = lshr i64 [[TMP24]], 32
6945 ; CHECK-NEXT:    [[TMP27:%.*]] = trunc i64 [[TMP26]] to i32
6946 ; CHECK-NEXT:    [[TMP28:%.*]] = mul i32 [[TMP27]], [[TMP8]]
6947 ; CHECK-NEXT:    [[TMP29:%.*]] = sub i32 [[TMP7]], [[TMP28]]
6948 ; CHECK-NEXT:    [[TMP30:%.*]] = icmp uge i32 [[TMP29]], [[TMP8]]
6949 ; CHECK-NEXT:    [[TMP31:%.*]] = sub i32 [[TMP29]], [[TMP8]]
6950 ; CHECK-NEXT:    [[TMP32:%.*]] = select i1 [[TMP30]], i32 [[TMP31]], i32 [[TMP29]]
6951 ; CHECK-NEXT:    [[TMP33:%.*]] = icmp uge i32 [[TMP32]], [[TMP8]]
6952 ; CHECK-NEXT:    [[TMP34:%.*]] = sub i32 [[TMP32]], [[TMP8]]
6953 ; CHECK-NEXT:    [[TMP35:%.*]] = select i1 [[TMP33]], i32 [[TMP34]], i32 [[TMP32]]
6954 ; CHECK-NEXT:    [[TMP36:%.*]] = xor i32 [[TMP35]], [[TMP3]]
6955 ; CHECK-NEXT:    [[TMP37:%.*]] = sub i32 [[TMP36]], [[TMP3]]
6956 ; CHECK-NEXT:    [[TMP38:%.*]] = insertelement <2 x i32> poison, i32 [[TMP37]], i64 0
6957 ; CHECK-NEXT:    [[TMP39:%.*]] = extractelement <2 x i32> [[X]], i64 1
6958 ; CHECK-NEXT:    [[TMP40:%.*]] = extractelement <2 x i32> [[SHL_Y]], i64 1
6959 ; CHECK-NEXT:    [[TMP41:%.*]] = ashr i32 [[TMP39]], 31
6960 ; CHECK-NEXT:    [[TMP42:%.*]] = ashr i32 [[TMP40]], 31
6961 ; CHECK-NEXT:    [[TMP43:%.*]] = add i32 [[TMP39]], [[TMP41]]
6962 ; CHECK-NEXT:    [[TMP44:%.*]] = add i32 [[TMP40]], [[TMP42]]
6963 ; CHECK-NEXT:    [[TMP45:%.*]] = xor i32 [[TMP43]], [[TMP41]]
6964 ; CHECK-NEXT:    [[TMP46:%.*]] = xor i32 [[TMP44]], [[TMP42]]
6965 ; CHECK-NEXT:    [[TMP47:%.*]] = uitofp i32 [[TMP46]] to float
6966 ; CHECK-NEXT:    [[TMP48:%.*]] = call fast float @llvm.amdgcn.rcp.f32(float [[TMP47]])
6967 ; CHECK-NEXT:    [[TMP49:%.*]] = fmul fast float [[TMP48]], 0x41EFFFFFC0000000
6968 ; CHECK-NEXT:    [[TMP50:%.*]] = fptoui float [[TMP49]] to i32
6969 ; CHECK-NEXT:    [[TMP51:%.*]] = sub i32 0, [[TMP46]]
6970 ; CHECK-NEXT:    [[TMP52:%.*]] = mul i32 [[TMP51]], [[TMP50]]
6971 ; CHECK-NEXT:    [[TMP53:%.*]] = zext i32 [[TMP50]] to i64
6972 ; CHECK-NEXT:    [[TMP54:%.*]] = zext i32 [[TMP52]] to i64
6973 ; CHECK-NEXT:    [[TMP55:%.*]] = mul i64 [[TMP53]], [[TMP54]]
6974 ; CHECK-NEXT:    [[TMP56:%.*]] = trunc i64 [[TMP55]] to i32
6975 ; CHECK-NEXT:    [[TMP57:%.*]] = lshr i64 [[TMP55]], 32
6976 ; CHECK-NEXT:    [[TMP58:%.*]] = trunc i64 [[TMP57]] to i32
6977 ; CHECK-NEXT:    [[TMP59:%.*]] = add i32 [[TMP50]], [[TMP58]]
6978 ; CHECK-NEXT:    [[TMP60:%.*]] = zext i32 [[TMP45]] to i64
6979 ; CHECK-NEXT:    [[TMP61:%.*]] = zext i32 [[TMP59]] to i64
6980 ; CHECK-NEXT:    [[TMP62:%.*]] = mul i64 [[TMP60]], [[TMP61]]
6981 ; CHECK-NEXT:    [[TMP63:%.*]] = trunc i64 [[TMP62]] to i32
6982 ; CHECK-NEXT:    [[TMP64:%.*]] = lshr i64 [[TMP62]], 32
6983 ; CHECK-NEXT:    [[TMP65:%.*]] = trunc i64 [[TMP64]] to i32
6984 ; CHECK-NEXT:    [[TMP66:%.*]] = mul i32 [[TMP65]], [[TMP46]]
6985 ; CHECK-NEXT:    [[TMP67:%.*]] = sub i32 [[TMP45]], [[TMP66]]
6986 ; CHECK-NEXT:    [[TMP68:%.*]] = icmp uge i32 [[TMP67]], [[TMP46]]
6987 ; CHECK-NEXT:    [[TMP69:%.*]] = sub i32 [[TMP67]], [[TMP46]]
6988 ; CHECK-NEXT:    [[TMP70:%.*]] = select i1 [[TMP68]], i32 [[TMP69]], i32 [[TMP67]]
6989 ; CHECK-NEXT:    [[TMP71:%.*]] = icmp uge i32 [[TMP70]], [[TMP46]]
6990 ; CHECK-NEXT:    [[TMP72:%.*]] = sub i32 [[TMP70]], [[TMP46]]
6991 ; CHECK-NEXT:    [[TMP73:%.*]] = select i1 [[TMP71]], i32 [[TMP72]], i32 [[TMP70]]
6992 ; CHECK-NEXT:    [[TMP74:%.*]] = xor i32 [[TMP73]], [[TMP41]]
6993 ; CHECK-NEXT:    [[TMP75:%.*]] = sub i32 [[TMP74]], [[TMP41]]
6994 ; CHECK-NEXT:    [[TMP76:%.*]] = insertelement <2 x i32> [[TMP38]], i32 [[TMP75]], i64 1
6995 ; CHECK-NEXT:    store <2 x i32> [[TMP76]], ptr addrspace(1) [[OUT:%.*]], align 8
6996 ; CHECK-NEXT:    ret void
6998 ; GFX6-LABEL: srem_v2i32_pow2_shl_denom:
6999 ; GFX6:       ; %bb.0:
7000 ; GFX6-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0xb
7001 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
7002 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
7003 ; GFX6-NEXT:    s_lshl_b32 s2, 0x1000, s6
7004 ; GFX6-NEXT:    s_ashr_i32 s3, s2, 31
7005 ; GFX6-NEXT:    s_add_i32 s2, s2, s3
7006 ; GFX6-NEXT:    s_xor_b32 s2, s2, s3
7007 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v0, s2
7008 ; GFX6-NEXT:    s_sub_i32 s3, 0, s2
7009 ; GFX6-NEXT:    s_ashr_i32 s6, s4, 31
7010 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v0, v0
7011 ; GFX6-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
7012 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v0, v0
7013 ; GFX6-NEXT:    v_mul_lo_u32 v1, s3, v0
7014 ; GFX6-NEXT:    s_add_i32 s3, s4, s6
7015 ; GFX6-NEXT:    s_xor_b32 s3, s3, s6
7016 ; GFX6-NEXT:    s_lshl_b32 s4, 0x1000, s7
7017 ; GFX6-NEXT:    v_mul_hi_u32 v1, v0, v1
7018 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, v0, v1
7019 ; GFX6-NEXT:    v_mul_hi_u32 v0, s3, v0
7020 ; GFX6-NEXT:    v_readfirstlane_b32 s7, v0
7021 ; GFX6-NEXT:    s_mul_i32 s7, s7, s2
7022 ; GFX6-NEXT:    s_sub_i32 s3, s3, s7
7023 ; GFX6-NEXT:    s_sub_i32 s7, s3, s2
7024 ; GFX6-NEXT:    s_cmp_ge_u32 s3, s2
7025 ; GFX6-NEXT:    s_cselect_b32 s3, s7, s3
7026 ; GFX6-NEXT:    s_sub_i32 s7, s3, s2
7027 ; GFX6-NEXT:    s_cmp_ge_u32 s3, s2
7028 ; GFX6-NEXT:    s_cselect_b32 s7, s7, s3
7029 ; GFX6-NEXT:    s_ashr_i32 s2, s4, 31
7030 ; GFX6-NEXT:    s_add_i32 s4, s4, s2
7031 ; GFX6-NEXT:    s_xor_b32 s4, s4, s2
7032 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v0, s4
7033 ; GFX6-NEXT:    s_sub_i32 s2, 0, s4
7034 ; GFX6-NEXT:    s_ashr_i32 s8, s5, 31
7035 ; GFX6-NEXT:    s_xor_b32 s7, s7, s6
7036 ; GFX6-NEXT:    v_rcp_iflag_f32_e32 v0, v0
7037 ; GFX6-NEXT:    s_sub_i32 s6, s7, s6
7038 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
7039 ; GFX6-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
7040 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v0, v0
7041 ; GFX6-NEXT:    v_mul_lo_u32 v1, s2, v0
7042 ; GFX6-NEXT:    s_add_i32 s2, s5, s8
7043 ; GFX6-NEXT:    s_xor_b32 s5, s2, s8
7044 ; GFX6-NEXT:    s_mov_b32 s2, -1
7045 ; GFX6-NEXT:    v_mul_hi_u32 v1, v0, v1
7046 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, v0, v1
7047 ; GFX6-NEXT:    v_mul_hi_u32 v0, s5, v0
7048 ; GFX6-NEXT:    v_readfirstlane_b32 s7, v0
7049 ; GFX6-NEXT:    s_mul_i32 s7, s7, s4
7050 ; GFX6-NEXT:    s_sub_i32 s5, s5, s7
7051 ; GFX6-NEXT:    s_sub_i32 s7, s5, s4
7052 ; GFX6-NEXT:    s_cmp_ge_u32 s5, s4
7053 ; GFX6-NEXT:    s_cselect_b32 s5, s7, s5
7054 ; GFX6-NEXT:    s_sub_i32 s7, s5, s4
7055 ; GFX6-NEXT:    s_cmp_ge_u32 s5, s4
7056 ; GFX6-NEXT:    s_cselect_b32 s4, s7, s5
7057 ; GFX6-NEXT:    s_xor_b32 s4, s4, s8
7058 ; GFX6-NEXT:    s_sub_i32 s4, s4, s8
7059 ; GFX6-NEXT:    v_mov_b32_e32 v0, s6
7060 ; GFX6-NEXT:    v_mov_b32_e32 v1, s4
7061 ; GFX6-NEXT:    buffer_store_dwordx2 v[0:1], off, s[0:3], 0
7062 ; GFX6-NEXT:    s_endpgm
7064 ; GFX9-LABEL: srem_v2i32_pow2_shl_denom:
7065 ; GFX9:       ; %bb.0:
7066 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x2c
7067 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0
7068 ; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
7069 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
7070 ; GFX9-NEXT:    s_lshl_b32 s2, 0x1000, s6
7071 ; GFX9-NEXT:    s_ashr_i32 s3, s2, 31
7072 ; GFX9-NEXT:    s_add_i32 s2, s2, s3
7073 ; GFX9-NEXT:    s_xor_b32 s2, s2, s3
7074 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v0, s2
7075 ; GFX9-NEXT:    s_lshl_b32 s3, 0x1000, s7
7076 ; GFX9-NEXT:    s_sub_i32 s7, 0, s2
7077 ; GFX9-NEXT:    s_ashr_i32 s6, s4, 31
7078 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v0, v0
7079 ; GFX9-NEXT:    s_add_i32 s4, s4, s6
7080 ; GFX9-NEXT:    s_xor_b32 s4, s4, s6
7081 ; GFX9-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
7082 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v0, v0
7083 ; GFX9-NEXT:    v_readfirstlane_b32 s8, v0
7084 ; GFX9-NEXT:    s_mul_i32 s7, s7, s8
7085 ; GFX9-NEXT:    s_mul_hi_u32 s7, s8, s7
7086 ; GFX9-NEXT:    s_add_i32 s8, s8, s7
7087 ; GFX9-NEXT:    s_mul_hi_u32 s7, s4, s8
7088 ; GFX9-NEXT:    s_mul_i32 s7, s7, s2
7089 ; GFX9-NEXT:    s_sub_i32 s4, s4, s7
7090 ; GFX9-NEXT:    s_sub_i32 s7, s4, s2
7091 ; GFX9-NEXT:    s_cmp_ge_u32 s4, s2
7092 ; GFX9-NEXT:    s_cselect_b32 s4, s7, s4
7093 ; GFX9-NEXT:    s_sub_i32 s7, s4, s2
7094 ; GFX9-NEXT:    s_cmp_ge_u32 s4, s2
7095 ; GFX9-NEXT:    s_cselect_b32 s2, s7, s4
7096 ; GFX9-NEXT:    s_ashr_i32 s4, s3, 31
7097 ; GFX9-NEXT:    s_add_i32 s3, s3, s4
7098 ; GFX9-NEXT:    s_xor_b32 s3, s3, s4
7099 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v0, s3
7100 ; GFX9-NEXT:    s_xor_b32 s2, s2, s6
7101 ; GFX9-NEXT:    s_sub_i32 s2, s2, s6
7102 ; GFX9-NEXT:    s_sub_i32 s6, 0, s3
7103 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v0, v0
7104 ; GFX9-NEXT:    s_ashr_i32 s4, s5, 31
7105 ; GFX9-NEXT:    s_add_i32 s5, s5, s4
7106 ; GFX9-NEXT:    s_xor_b32 s5, s5, s4
7107 ; GFX9-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
7108 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v0, v0
7109 ; GFX9-NEXT:    v_readfirstlane_b32 s7, v0
7110 ; GFX9-NEXT:    s_mul_i32 s6, s6, s7
7111 ; GFX9-NEXT:    s_mul_hi_u32 s6, s7, s6
7112 ; GFX9-NEXT:    s_add_i32 s7, s7, s6
7113 ; GFX9-NEXT:    s_mul_hi_u32 s6, s5, s7
7114 ; GFX9-NEXT:    s_mul_i32 s6, s6, s3
7115 ; GFX9-NEXT:    s_sub_i32 s5, s5, s6
7116 ; GFX9-NEXT:    s_sub_i32 s6, s5, s3
7117 ; GFX9-NEXT:    s_cmp_ge_u32 s5, s3
7118 ; GFX9-NEXT:    s_cselect_b32 s5, s6, s5
7119 ; GFX9-NEXT:    s_sub_i32 s6, s5, s3
7120 ; GFX9-NEXT:    s_cmp_ge_u32 s5, s3
7121 ; GFX9-NEXT:    s_cselect_b32 s3, s6, s5
7122 ; GFX9-NEXT:    s_xor_b32 s3, s3, s4
7123 ; GFX9-NEXT:    s_sub_i32 s3, s3, s4
7124 ; GFX9-NEXT:    v_mov_b32_e32 v0, s2
7125 ; GFX9-NEXT:    v_mov_b32_e32 v1, s3
7126 ; GFX9-NEXT:    global_store_dwordx2 v2, v[0:1], s[0:1]
7127 ; GFX9-NEXT:    s_endpgm
7128   %shl.y = shl <2 x i32> <i32 4096, i32 4096>, %y
7129   %r = srem <2 x i32> %x, %shl.y
7130   store <2 x i32> %r, ptr addrspace(1) %out
7131   ret void
7134 define amdgpu_kernel void @udiv_i64_oddk_denom(ptr addrspace(1) %out, i64 %x) {
7135 ; CHECK-LABEL: @udiv_i64_oddk_denom(
7136 ; CHECK-NEXT:    [[R:%.*]] = udiv i64 [[X:%.*]], 1235195949943
7137 ; CHECK-NEXT:    store i64 [[R]], ptr addrspace(1) [[OUT:%.*]], align 8
7138 ; CHECK-NEXT:    ret void
7140 ; GFX6-LABEL: udiv_i64_oddk_denom:
7141 ; GFX6:       ; %bb.0:
7142 ; GFX6-NEXT:    s_add_u32 s4, 3, 0
7143 ; GFX6-NEXT:    v_mov_b32_e32 v0, 0xe3e0f6
7144 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, s4, v0
7145 ; GFX6-NEXT:    s_addc_u32 s5, 0, 0
7146 ; GFX6-NEXT:    s_or_b32 s4, vcc_lo, vcc_hi
7147 ; GFX6-NEXT:    s_cmp_lg_u32 s4, 0
7148 ; GFX6-NEXT:    s_mov_b32 s4, 0x68958c89
7149 ; GFX6-NEXT:    s_movk_i32 s6, 0xfee0
7150 ; GFX6-NEXT:    v_mul_lo_u32 v1, v0, s6
7151 ; GFX6-NEXT:    v_mul_hi_u32 v2, v0, s4
7152 ; GFX6-NEXT:    s_addc_u32 s5, s5, 0
7153 ; GFX6-NEXT:    s_mul_i32 s6, s5, 0x68958c89
7154 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
7155 ; GFX6-NEXT:    v_add_i32_e32 v1, vcc, v1, v2
7156 ; GFX6-NEXT:    v_mul_lo_u32 v2, v0, s4
7157 ; GFX6-NEXT:    v_add_i32_e32 v1, vcc, s6, v1
7158 ; GFX6-NEXT:    v_mul_lo_u32 v3, v0, v1
7159 ; GFX6-NEXT:    v_mul_hi_u32 v4, v0, v2
7160 ; GFX6-NEXT:    v_mul_hi_u32 v5, v0, v1
7161 ; GFX6-NEXT:    v_mul_hi_u32 v6, s5, v1
7162 ; GFX6-NEXT:    v_mul_lo_u32 v1, s5, v1
7163 ; GFX6-NEXT:    v_add_i32_e32 v3, vcc, v4, v3
7164 ; GFX6-NEXT:    v_addc_u32_e32 v4, vcc, 0, v5, vcc
7165 ; GFX6-NEXT:    v_mul_lo_u32 v5, s5, v2
7166 ; GFX6-NEXT:    v_mul_hi_u32 v2, s5, v2
7167 ; GFX6-NEXT:    s_movk_i32 s8, 0x11f
7168 ; GFX6-NEXT:    s_mov_b32 s9, 0x976a7377
7169 ; GFX6-NEXT:    v_add_i32_e32 v3, vcc, v3, v5
7170 ; GFX6-NEXT:    v_addc_u32_e32 v2, vcc, v4, v2, vcc
7171 ; GFX6-NEXT:    v_addc_u32_e32 v3, vcc, 0, v6, vcc
7172 ; GFX6-NEXT:    v_add_i32_e32 v1, vcc, v2, v1
7173 ; GFX6-NEXT:    v_addc_u32_e32 v2, vcc, 0, v3, vcc
7174 ; GFX6-NEXT:    v_mov_b32_e32 v3, s5
7175 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, v0, v1
7176 ; GFX6-NEXT:    v_addc_u32_e32 v1, vcc, v3, v2, vcc
7177 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
7178 ; GFX6-NEXT:    v_mul_lo_u32 v2, s2, v1
7179 ; GFX6-NEXT:    v_mul_hi_u32 v3, s2, v0
7180 ; GFX6-NEXT:    v_mul_hi_u32 v4, s2, v1
7181 ; GFX6-NEXT:    v_mul_hi_u32 v5, s3, v1
7182 ; GFX6-NEXT:    v_mul_lo_u32 v1, s3, v1
7183 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, v3, v2
7184 ; GFX6-NEXT:    v_addc_u32_e32 v3, vcc, 0, v4, vcc
7185 ; GFX6-NEXT:    v_mul_lo_u32 v4, s3, v0
7186 ; GFX6-NEXT:    v_mul_hi_u32 v0, s3, v0
7187 ; GFX6-NEXT:    s_mov_b32 s4, s0
7188 ; GFX6-NEXT:    s_mov_b32 s5, s1
7189 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, v2, v4
7190 ; GFX6-NEXT:    v_addc_u32_e32 v0, vcc, v3, v0, vcc
7191 ; GFX6-NEXT:    v_addc_u32_e32 v2, vcc, 0, v5, vcc
7192 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, v0, v1
7193 ; GFX6-NEXT:    v_addc_u32_e32 v1, vcc, 0, v2, vcc
7194 ; GFX6-NEXT:    v_mul_lo_u32 v2, v0, s8
7195 ; GFX6-NEXT:    v_mul_hi_u32 v3, v0, s9
7196 ; GFX6-NEXT:    v_mul_lo_u32 v4, v1, s9
7197 ; GFX6-NEXT:    v_mov_b32_e32 v5, 0x11f
7198 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
7199 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, v2, v3
7200 ; GFX6-NEXT:    v_mul_lo_u32 v3, v0, s9
7201 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, v4, v2
7202 ; GFX6-NEXT:    v_sub_i32_e32 v4, vcc, s3, v2
7203 ; GFX6-NEXT:    v_sub_i32_e32 v3, vcc, s2, v3
7204 ; GFX6-NEXT:    v_subb_u32_e64 v4, s[0:1], v4, v5, vcc
7205 ; GFX6-NEXT:    v_subrev_i32_e64 v5, s[0:1], s9, v3
7206 ; GFX6-NEXT:    v_subbrev_u32_e64 v4, s[0:1], 0, v4, s[0:1]
7207 ; GFX6-NEXT:    s_movk_i32 s2, 0x11e
7208 ; GFX6-NEXT:    v_cmp_lt_u32_e64 s[0:1], s2, v4
7209 ; GFX6-NEXT:    s_mov_b32 s9, 0x976a7376
7210 ; GFX6-NEXT:    v_cndmask_b32_e64 v6, 0, -1, s[0:1]
7211 ; GFX6-NEXT:    v_cmp_lt_u32_e64 s[0:1], s9, v5
7212 ; GFX6-NEXT:    v_cndmask_b32_e64 v5, 0, -1, s[0:1]
7213 ; GFX6-NEXT:    v_cmp_eq_u32_e64 s[0:1], s8, v4
7214 ; GFX6-NEXT:    v_cndmask_b32_e64 v4, v6, v5, s[0:1]
7215 ; GFX6-NEXT:    v_add_i32_e64 v5, s[0:1], 1, v0
7216 ; GFX6-NEXT:    v_addc_u32_e64 v6, s[0:1], 0, v1, s[0:1]
7217 ; GFX6-NEXT:    v_add_i32_e64 v7, s[0:1], 2, v0
7218 ; GFX6-NEXT:    v_addc_u32_e64 v8, s[0:1], 0, v1, s[0:1]
7219 ; GFX6-NEXT:    v_cmp_ne_u32_e64 s[0:1], 0, v4
7220 ; GFX6-NEXT:    v_cndmask_b32_e64 v4, v5, v7, s[0:1]
7221 ; GFX6-NEXT:    v_cndmask_b32_e64 v5, v6, v8, s[0:1]
7222 ; GFX6-NEXT:    v_mov_b32_e32 v6, s3
7223 ; GFX6-NEXT:    v_subb_u32_e32 v2, vcc, v6, v2, vcc
7224 ; GFX6-NEXT:    v_cmp_lt_u32_e32 vcc, s2, v2
7225 ; GFX6-NEXT:    v_cndmask_b32_e64 v6, 0, -1, vcc
7226 ; GFX6-NEXT:    v_cmp_lt_u32_e32 vcc, s9, v3
7227 ; GFX6-NEXT:    v_cndmask_b32_e64 v3, 0, -1, vcc
7228 ; GFX6-NEXT:    v_cmp_eq_u32_e32 vcc, s8, v2
7229 ; GFX6-NEXT:    v_cndmask_b32_e32 v2, v6, v3, vcc
7230 ; GFX6-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v2
7231 ; GFX6-NEXT:    s_mov_b32 s6, -1
7232 ; GFX6-NEXT:    v_cndmask_b32_e32 v1, v1, v5, vcc
7233 ; GFX6-NEXT:    v_cndmask_b32_e32 v0, v0, v4, vcc
7234 ; GFX6-NEXT:    buffer_store_dwordx2 v[0:1], off, s[4:7], 0
7235 ; GFX6-NEXT:    s_endpgm
7237 ; GFX9-LABEL: udiv_i64_oddk_denom:
7238 ; GFX9:       ; %bb.0:
7239 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
7240 ; GFX9-NEXT:    s_add_u32 s0, 3, 0
7241 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0xe3e0f6
7242 ; GFX9-NEXT:    s_addc_u32 s1, 0, 0
7243 ; GFX9-NEXT:    v_add_co_u32_e32 v0, vcc, s0, v0
7244 ; GFX9-NEXT:    s_cmp_lg_u64 vcc, 0
7245 ; GFX9-NEXT:    v_readfirstlane_b32 s2, v0
7246 ; GFX9-NEXT:    s_addc_u32 s0, s1, 0
7247 ; GFX9-NEXT:    s_mul_i32 s3, s2, 0xfffffee0
7248 ; GFX9-NEXT:    s_mul_hi_u32 s8, s2, 0x68958c89
7249 ; GFX9-NEXT:    s_mul_i32 s1, s0, 0x68958c89
7250 ; GFX9-NEXT:    s_add_i32 s3, s8, s3
7251 ; GFX9-NEXT:    s_add_i32 s3, s3, s1
7252 ; GFX9-NEXT:    s_mul_i32 s9, s2, 0x68958c89
7253 ; GFX9-NEXT:    s_mul_hi_u32 s1, s2, s3
7254 ; GFX9-NEXT:    s_mul_i32 s8, s2, s3
7255 ; GFX9-NEXT:    s_mul_hi_u32 s2, s2, s9
7256 ; GFX9-NEXT:    s_add_u32 s2, s2, s8
7257 ; GFX9-NEXT:    s_addc_u32 s1, 0, s1
7258 ; GFX9-NEXT:    s_mul_hi_u32 s10, s0, s9
7259 ; GFX9-NEXT:    s_mul_i32 s9, s0, s9
7260 ; GFX9-NEXT:    s_add_u32 s2, s2, s9
7261 ; GFX9-NEXT:    s_mul_hi_u32 s8, s0, s3
7262 ; GFX9-NEXT:    s_addc_u32 s1, s1, s10
7263 ; GFX9-NEXT:    s_addc_u32 s2, s8, 0
7264 ; GFX9-NEXT:    s_mul_i32 s3, s0, s3
7265 ; GFX9-NEXT:    s_add_u32 s1, s1, s3
7266 ; GFX9-NEXT:    s_addc_u32 s2, 0, s2
7267 ; GFX9-NEXT:    v_add_co_u32_e32 v0, vcc, s1, v0
7268 ; GFX9-NEXT:    s_cmp_lg_u64 vcc, 0
7269 ; GFX9-NEXT:    s_addc_u32 s0, s0, s2
7270 ; GFX9-NEXT:    v_readfirstlane_b32 s3, v0
7271 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
7272 ; GFX9-NEXT:    s_mul_i32 s2, s6, s0
7273 ; GFX9-NEXT:    s_mul_hi_u32 s8, s6, s3
7274 ; GFX9-NEXT:    s_mul_hi_u32 s1, s6, s0
7275 ; GFX9-NEXT:    s_add_u32 s2, s8, s2
7276 ; GFX9-NEXT:    s_addc_u32 s1, 0, s1
7277 ; GFX9-NEXT:    s_mul_hi_u32 s9, s7, s3
7278 ; GFX9-NEXT:    s_mul_i32 s3, s7, s3
7279 ; GFX9-NEXT:    s_add_u32 s2, s2, s3
7280 ; GFX9-NEXT:    s_mul_hi_u32 s8, s7, s0
7281 ; GFX9-NEXT:    s_addc_u32 s1, s1, s9
7282 ; GFX9-NEXT:    s_addc_u32 s2, s8, 0
7283 ; GFX9-NEXT:    s_mul_i32 s0, s7, s0
7284 ; GFX9-NEXT:    s_add_u32 s3, s1, s0
7285 ; GFX9-NEXT:    s_addc_u32 s2, 0, s2
7286 ; GFX9-NEXT:    s_mul_i32 s0, s3, 0x11f
7287 ; GFX9-NEXT:    s_mul_hi_u32 s8, s3, 0x976a7377
7288 ; GFX9-NEXT:    s_add_i32 s0, s8, s0
7289 ; GFX9-NEXT:    s_mul_i32 s8, s2, 0x976a7377
7290 ; GFX9-NEXT:    s_mul_i32 s9, s3, 0x976a7377
7291 ; GFX9-NEXT:    s_add_i32 s8, s0, s8
7292 ; GFX9-NEXT:    v_mov_b32_e32 v0, s9
7293 ; GFX9-NEXT:    s_sub_i32 s0, s7, s8
7294 ; GFX9-NEXT:    v_sub_co_u32_e32 v0, vcc, s6, v0
7295 ; GFX9-NEXT:    s_mov_b32 s1, 0x976a7377
7296 ; GFX9-NEXT:    s_cmp_lg_u64 vcc, 0
7297 ; GFX9-NEXT:    s_subb_u32 s6, s0, 0x11f
7298 ; GFX9-NEXT:    v_subrev_co_u32_e64 v1, s[0:1], s1, v0
7299 ; GFX9-NEXT:    s_cmp_lg_u64 s[0:1], 0
7300 ; GFX9-NEXT:    s_subb_u32 s6, s6, 0
7301 ; GFX9-NEXT:    s_cmpk_gt_u32 s6, 0x11e
7302 ; GFX9-NEXT:    s_mov_b32 s10, 0x976a7376
7303 ; GFX9-NEXT:    s_cselect_b32 s9, -1, 0
7304 ; GFX9-NEXT:    v_cmp_lt_u32_e64 s[0:1], s10, v1
7305 ; GFX9-NEXT:    s_cmpk_eq_i32 s6, 0x11f
7306 ; GFX9-NEXT:    v_cndmask_b32_e64 v1, 0, -1, s[0:1]
7307 ; GFX9-NEXT:    v_mov_b32_e32 v3, s9
7308 ; GFX9-NEXT:    s_cselect_b64 s[0:1], -1, 0
7309 ; GFX9-NEXT:    v_cndmask_b32_e64 v1, v3, v1, s[0:1]
7310 ; GFX9-NEXT:    s_add_u32 s0, s3, 1
7311 ; GFX9-NEXT:    s_addc_u32 s6, s2, 0
7312 ; GFX9-NEXT:    s_add_u32 s1, s3, 2
7313 ; GFX9-NEXT:    s_addc_u32 s9, s2, 0
7314 ; GFX9-NEXT:    v_mov_b32_e32 v3, s0
7315 ; GFX9-NEXT:    v_mov_b32_e32 v4, s1
7316 ; GFX9-NEXT:    v_cmp_ne_u32_e64 s[0:1], 0, v1
7317 ; GFX9-NEXT:    v_cndmask_b32_e64 v3, v3, v4, s[0:1]
7318 ; GFX9-NEXT:    v_mov_b32_e32 v1, s6
7319 ; GFX9-NEXT:    v_mov_b32_e32 v4, s9
7320 ; GFX9-NEXT:    s_cmp_lg_u64 vcc, 0
7321 ; GFX9-NEXT:    v_cndmask_b32_e64 v1, v1, v4, s[0:1]
7322 ; GFX9-NEXT:    s_subb_u32 s0, s7, s8
7323 ; GFX9-NEXT:    s_cmpk_gt_u32 s0, 0x11e
7324 ; GFX9-NEXT:    s_cselect_b32 s1, -1, 0
7325 ; GFX9-NEXT:    v_cmp_lt_u32_e32 vcc, s10, v0
7326 ; GFX9-NEXT:    s_cmpk_eq_i32 s0, 0x11f
7327 ; GFX9-NEXT:    v_cndmask_b32_e64 v0, 0, -1, vcc
7328 ; GFX9-NEXT:    v_mov_b32_e32 v4, s1
7329 ; GFX9-NEXT:    s_cselect_b64 vcc, -1, 0
7330 ; GFX9-NEXT:    v_cndmask_b32_e32 v0, v4, v0, vcc
7331 ; GFX9-NEXT:    v_mov_b32_e32 v4, s2
7332 ; GFX9-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v0
7333 ; GFX9-NEXT:    v_mov_b32_e32 v0, s3
7334 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0
7335 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, v4, v1, vcc
7336 ; GFX9-NEXT:    v_cndmask_b32_e32 v0, v0, v3, vcc
7337 ; GFX9-NEXT:    global_store_dwordx2 v2, v[0:1], s[4:5]
7338 ; GFX9-NEXT:    s_endpgm
7339   %r = udiv i64 %x, 1235195949943
7340   store i64 %r, ptr addrspace(1) %out
7341   ret void
7344 define amdgpu_kernel void @udiv_i64_pow2k_denom(ptr addrspace(1) %out, i64 %x) {
7345 ; CHECK-LABEL: @udiv_i64_pow2k_denom(
7346 ; CHECK-NEXT:    [[R:%.*]] = udiv i64 [[X:%.*]], 4096
7347 ; CHECK-NEXT:    store i64 [[R]], ptr addrspace(1) [[OUT:%.*]], align 8
7348 ; CHECK-NEXT:    ret void
7350 ; GFX6-LABEL: udiv_i64_pow2k_denom:
7351 ; GFX6:       ; %bb.0:
7352 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
7353 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
7354 ; GFX6-NEXT:    s_mov_b32 s6, -1
7355 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
7356 ; GFX6-NEXT:    s_mov_b32 s4, s0
7357 ; GFX6-NEXT:    s_mov_b32 s5, s1
7358 ; GFX6-NEXT:    s_lshr_b64 s[0:1], s[2:3], 12
7359 ; GFX6-NEXT:    v_mov_b32_e32 v0, s0
7360 ; GFX6-NEXT:    v_mov_b32_e32 v1, s1
7361 ; GFX6-NEXT:    buffer_store_dwordx2 v[0:1], off, s[4:7], 0
7362 ; GFX6-NEXT:    s_endpgm
7364 ; GFX9-LABEL: udiv_i64_pow2k_denom:
7365 ; GFX9:       ; %bb.0:
7366 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
7367 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0
7368 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
7369 ; GFX9-NEXT:    s_lshr_b64 s[2:3], s[2:3], 12
7370 ; GFX9-NEXT:    v_mov_b32_e32 v0, s2
7371 ; GFX9-NEXT:    v_mov_b32_e32 v1, s3
7372 ; GFX9-NEXT:    global_store_dwordx2 v2, v[0:1], s[0:1]
7373 ; GFX9-NEXT:    s_endpgm
7374   %r = udiv i64 %x, 4096
7375   store i64 %r, ptr addrspace(1) %out
7376   ret void
7379 define amdgpu_kernel void @udiv_i64_pow2_shl_denom(ptr addrspace(1) %out, i64 %x, i64 %y) {
7380 ; CHECK-LABEL: @udiv_i64_pow2_shl_denom(
7381 ; CHECK-NEXT:    [[SHL_Y:%.*]] = shl i64 4096, [[Y:%.*]]
7382 ; CHECK-NEXT:    [[R:%.*]] = udiv i64 [[X:%.*]], [[SHL_Y]]
7383 ; CHECK-NEXT:    store i64 [[R]], ptr addrspace(1) [[OUT:%.*]], align 8
7384 ; CHECK-NEXT:    ret void
7386 ; GFX6-LABEL: udiv_i64_pow2_shl_denom:
7387 ; GFX6:       ; %bb.0:
7388 ; GFX6-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
7389 ; GFX6-NEXT:    s_load_dword s8, s[0:1], 0xd
7390 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
7391 ; GFX6-NEXT:    s_mov_b32 s2, -1
7392 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
7393 ; GFX6-NEXT:    s_mov_b32 s0, s4
7394 ; GFX6-NEXT:    s_add_i32 s8, s8, 12
7395 ; GFX6-NEXT:    s_mov_b32 s1, s5
7396 ; GFX6-NEXT:    s_lshr_b64 s[4:5], s[6:7], s8
7397 ; GFX6-NEXT:    v_mov_b32_e32 v0, s4
7398 ; GFX6-NEXT:    v_mov_b32_e32 v1, s5
7399 ; GFX6-NEXT:    buffer_store_dwordx2 v[0:1], off, s[0:3], 0
7400 ; GFX6-NEXT:    s_endpgm
7402 ; GFX9-LABEL: udiv_i64_pow2_shl_denom:
7403 ; GFX9:       ; %bb.0:
7404 ; GFX9-NEXT:    s_load_dword s2, s[0:1], 0x34
7405 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
7406 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0
7407 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
7408 ; GFX9-NEXT:    s_add_i32 s2, s2, 12
7409 ; GFX9-NEXT:    s_lshr_b64 s[0:1], s[6:7], s2
7410 ; GFX9-NEXT:    v_mov_b32_e32 v0, s0
7411 ; GFX9-NEXT:    v_mov_b32_e32 v1, s1
7412 ; GFX9-NEXT:    global_store_dwordx2 v2, v[0:1], s[4:5]
7413 ; GFX9-NEXT:    s_endpgm
7414   %shl.y = shl i64 4096, %y
7415   %r = udiv i64 %x, %shl.y
7416   store i64 %r, ptr addrspace(1) %out
7417   ret void
7420 define amdgpu_kernel void @udiv_v2i64_pow2k_denom(ptr addrspace(1) %out, <2 x i64> %x) {
7421 ; CHECK-LABEL: @udiv_v2i64_pow2k_denom(
7422 ; CHECK-NEXT:    [[TMP1:%.*]] = extractelement <2 x i64> [[X:%.*]], i64 0
7423 ; CHECK-NEXT:    [[TMP2:%.*]] = udiv i64 [[TMP1]], 4096
7424 ; CHECK-NEXT:    [[TMP3:%.*]] = insertelement <2 x i64> poison, i64 [[TMP2]], i64 0
7425 ; CHECK-NEXT:    [[TMP4:%.*]] = extractelement <2 x i64> [[X]], i64 1
7426 ; CHECK-NEXT:    [[TMP5:%.*]] = udiv i64 [[TMP4]], 4096
7427 ; CHECK-NEXT:    [[TMP6:%.*]] = insertelement <2 x i64> [[TMP3]], i64 [[TMP5]], i64 1
7428 ; CHECK-NEXT:    store <2 x i64> [[TMP6]], ptr addrspace(1) [[OUT:%.*]], align 16
7429 ; CHECK-NEXT:    ret void
7431 ; GFX6-LABEL: udiv_v2i64_pow2k_denom:
7432 ; GFX6:       ; %bb.0:
7433 ; GFX6-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0xd
7434 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
7435 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
7436 ; GFX6-NEXT:    s_mov_b32 s2, -1
7437 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
7438 ; GFX6-NEXT:    s_lshr_b64 s[4:5], s[4:5], 12
7439 ; GFX6-NEXT:    s_lshr_b64 s[6:7], s[6:7], 12
7440 ; GFX6-NEXT:    v_mov_b32_e32 v0, s4
7441 ; GFX6-NEXT:    v_mov_b32_e32 v1, s5
7442 ; GFX6-NEXT:    v_mov_b32_e32 v2, s6
7443 ; GFX6-NEXT:    v_mov_b32_e32 v3, s7
7444 ; GFX6-NEXT:    buffer_store_dwordx4 v[0:3], off, s[0:3], 0
7445 ; GFX6-NEXT:    s_endpgm
7447 ; GFX9-LABEL: udiv_v2i64_pow2k_denom:
7448 ; GFX9:       ; %bb.0:
7449 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x34
7450 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
7451 ; GFX9-NEXT:    v_mov_b32_e32 v4, 0
7452 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
7453 ; GFX9-NEXT:    s_lshr_b64 s[0:1], s[4:5], 12
7454 ; GFX9-NEXT:    s_lshr_b64 s[4:5], s[6:7], 12
7455 ; GFX9-NEXT:    v_mov_b32_e32 v0, s0
7456 ; GFX9-NEXT:    v_mov_b32_e32 v1, s1
7457 ; GFX9-NEXT:    v_mov_b32_e32 v2, s4
7458 ; GFX9-NEXT:    v_mov_b32_e32 v3, s5
7459 ; GFX9-NEXT:    global_store_dwordx4 v4, v[0:3], s[2:3]
7460 ; GFX9-NEXT:    s_endpgm
7461   %r = udiv <2 x i64> %x, <i64 4096, i64 4096>
7462   store <2 x i64> %r, ptr addrspace(1) %out
7463   ret void
7466 define amdgpu_kernel void @udiv_v2i64_mixed_pow2k_denom(ptr addrspace(1) %out, <2 x i64> %x) {
7467 ; CHECK-LABEL: @udiv_v2i64_mixed_pow2k_denom(
7468 ; CHECK-NEXT:    [[TMP1:%.*]] = extractelement <2 x i64> [[X:%.*]], i64 0
7469 ; CHECK-NEXT:    [[TMP2:%.*]] = udiv i64 [[TMP1]], 4096
7470 ; CHECK-NEXT:    [[TMP3:%.*]] = insertelement <2 x i64> poison, i64 [[TMP2]], i64 0
7471 ; CHECK-NEXT:    [[TMP4:%.*]] = extractelement <2 x i64> [[X]], i64 1
7472 ; CHECK-NEXT:    [[TMP5:%.*]] = udiv i64 [[TMP4]], 4095
7473 ; CHECK-NEXT:    [[TMP6:%.*]] = insertelement <2 x i64> [[TMP3]], i64 [[TMP5]], i64 1
7474 ; CHECK-NEXT:    store <2 x i64> [[TMP6]], ptr addrspace(1) [[OUT:%.*]], align 16
7475 ; CHECK-NEXT:    ret void
7477 ; GFX6-LABEL: udiv_v2i64_mixed_pow2k_denom:
7478 ; GFX6:       ; %bb.0:
7479 ; GFX6-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0xd
7480 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
7481 ; GFX6-NEXT:    s_mov_b32 s2, 0x2ff2fc01
7482 ; GFX6-NEXT:    v_bfrev_b32_e32 v0, 7
7483 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
7484 ; GFX6-NEXT:    s_lshr_b64 s[4:5], s[4:5], 12
7485 ; GFX6-NEXT:    s_add_u32 s2, 0xe037f, s2
7486 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, s2, v0
7487 ; GFX6-NEXT:    s_addc_u32 s3, 0, 0
7488 ; GFX6-NEXT:    s_or_b32 s2, vcc_lo, vcc_hi
7489 ; GFX6-NEXT:    s_cmp_lg_u32 s2, 0
7490 ; GFX6-NEXT:    s_movk_i32 s2, 0xf001
7491 ; GFX6-NEXT:    v_mul_hi_u32 v1, v0, s2
7492 ; GFX6-NEXT:    v_mul_lo_u32 v2, v0, s2
7493 ; GFX6-NEXT:    s_addc_u32 s8, s3, 0x1000ff
7494 ; GFX6-NEXT:    s_mul_i32 s3, s8, 0xfffff001
7495 ; GFX6-NEXT:    v_sub_i32_e32 v1, vcc, v1, v0
7496 ; GFX6-NEXT:    v_add_i32_e32 v1, vcc, s3, v1
7497 ; GFX6-NEXT:    v_mul_lo_u32 v3, v0, v1
7498 ; GFX6-NEXT:    v_mul_hi_u32 v4, v0, v2
7499 ; GFX6-NEXT:    v_mul_hi_u32 v5, v0, v1
7500 ; GFX6-NEXT:    v_mul_hi_u32 v6, s8, v1
7501 ; GFX6-NEXT:    v_mul_lo_u32 v1, s8, v1
7502 ; GFX6-NEXT:    v_add_i32_e32 v3, vcc, v4, v3
7503 ; GFX6-NEXT:    v_addc_u32_e32 v4, vcc, 0, v5, vcc
7504 ; GFX6-NEXT:    v_mul_lo_u32 v5, s8, v2
7505 ; GFX6-NEXT:    v_mul_hi_u32 v2, s8, v2
7506 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
7507 ; GFX6-NEXT:    s_mov_b32 s2, -1
7508 ; GFX6-NEXT:    v_add_i32_e32 v3, vcc, v3, v5
7509 ; GFX6-NEXT:    v_addc_u32_e32 v2, vcc, v4, v2, vcc
7510 ; GFX6-NEXT:    v_addc_u32_e32 v3, vcc, 0, v6, vcc
7511 ; GFX6-NEXT:    v_add_i32_e32 v1, vcc, v2, v1
7512 ; GFX6-NEXT:    v_addc_u32_e32 v2, vcc, 0, v3, vcc
7513 ; GFX6-NEXT:    v_mov_b32_e32 v3, s8
7514 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, v0, v1
7515 ; GFX6-NEXT:    v_addc_u32_e32 v1, vcc, v3, v2, vcc
7516 ; GFX6-NEXT:    v_mul_lo_u32 v2, s6, v1
7517 ; GFX6-NEXT:    v_mul_hi_u32 v3, s6, v0
7518 ; GFX6-NEXT:    v_mul_hi_u32 v4, s6, v1
7519 ; GFX6-NEXT:    v_mul_hi_u32 v5, s7, v1
7520 ; GFX6-NEXT:    v_mul_lo_u32 v1, s7, v1
7521 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, v3, v2
7522 ; GFX6-NEXT:    v_addc_u32_e32 v3, vcc, 0, v4, vcc
7523 ; GFX6-NEXT:    v_mul_lo_u32 v4, s7, v0
7524 ; GFX6-NEXT:    v_mul_hi_u32 v0, s7, v0
7525 ; GFX6-NEXT:    s_movk_i32 s8, 0xfff
7526 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, v2, v4
7527 ; GFX6-NEXT:    v_addc_u32_e32 v0, vcc, v3, v0, vcc
7528 ; GFX6-NEXT:    v_addc_u32_e32 v2, vcc, 0, v5, vcc
7529 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, v0, v1
7530 ; GFX6-NEXT:    v_addc_u32_e32 v1, vcc, 0, v2, vcc
7531 ; GFX6-NEXT:    v_mul_lo_u32 v4, v1, s8
7532 ; GFX6-NEXT:    v_mul_hi_u32 v5, v0, s8
7533 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, 1, v0
7534 ; GFX6-NEXT:    v_mul_lo_u32 v8, v0, s8
7535 ; GFX6-NEXT:    v_addc_u32_e32 v3, vcc, 0, v1, vcc
7536 ; GFX6-NEXT:    v_add_i32_e32 v6, vcc, 2, v0
7537 ; GFX6-NEXT:    v_addc_u32_e32 v7, vcc, 0, v1, vcc
7538 ; GFX6-NEXT:    v_add_i32_e32 v4, vcc, v4, v5
7539 ; GFX6-NEXT:    v_mov_b32_e32 v5, s7
7540 ; GFX6-NEXT:    v_sub_i32_e32 v8, vcc, s6, v8
7541 ; GFX6-NEXT:    v_subb_u32_e32 v4, vcc, v5, v4, vcc
7542 ; GFX6-NEXT:    v_subrev_i32_e32 v5, vcc, s8, v8
7543 ; GFX6-NEXT:    v_subbrev_u32_e32 v9, vcc, 0, v4, vcc
7544 ; GFX6-NEXT:    s_movk_i32 s6, 0xffe
7545 ; GFX6-NEXT:    v_cmp_lt_u32_e32 vcc, s6, v5
7546 ; GFX6-NEXT:    v_cndmask_b32_e64 v5, 0, -1, vcc
7547 ; GFX6-NEXT:    v_cmp_eq_u32_e32 vcc, 0, v9
7548 ; GFX6-NEXT:    v_cndmask_b32_e32 v5, -1, v5, vcc
7549 ; GFX6-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v5
7550 ; GFX6-NEXT:    v_cndmask_b32_e32 v2, v2, v6, vcc
7551 ; GFX6-NEXT:    v_cndmask_b32_e32 v3, v3, v7, vcc
7552 ; GFX6-NEXT:    v_cmp_lt_u32_e32 vcc, s6, v8
7553 ; GFX6-NEXT:    v_cndmask_b32_e64 v5, 0, -1, vcc
7554 ; GFX6-NEXT:    v_cmp_eq_u32_e32 vcc, 0, v4
7555 ; GFX6-NEXT:    v_cndmask_b32_e32 v4, -1, v5, vcc
7556 ; GFX6-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v4
7557 ; GFX6-NEXT:    v_cndmask_b32_e32 v3, v1, v3, vcc
7558 ; GFX6-NEXT:    v_cndmask_b32_e32 v2, v0, v2, vcc
7559 ; GFX6-NEXT:    v_mov_b32_e32 v0, s4
7560 ; GFX6-NEXT:    v_mov_b32_e32 v1, s5
7561 ; GFX6-NEXT:    buffer_store_dwordx4 v[0:3], off, s[0:3], 0
7562 ; GFX6-NEXT:    s_endpgm
7564 ; GFX9-LABEL: udiv_v2i64_mixed_pow2k_denom:
7565 ; GFX9:       ; %bb.0:
7566 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x34
7567 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
7568 ; GFX9-NEXT:    s_mov_b32 s8, 0x2ff2fc01
7569 ; GFX9-NEXT:    v_bfrev_b32_e32 v0, 7
7570 ; GFX9-NEXT:    v_mov_b32_e32 v4, 0
7571 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
7572 ; GFX9-NEXT:    s_lshr_b64 s[0:1], s[4:5], 12
7573 ; GFX9-NEXT:    s_add_u32 s4, 0xe037f, s8
7574 ; GFX9-NEXT:    s_addc_u32 s5, 0, 0
7575 ; GFX9-NEXT:    v_add_co_u32_e32 v0, vcc, s4, v0
7576 ; GFX9-NEXT:    s_cmp_lg_u64 vcc, 0
7577 ; GFX9-NEXT:    v_readfirstlane_b32 s8, v0
7578 ; GFX9-NEXT:    s_addc_u32 s4, s5, 0x1000ff
7579 ; GFX9-NEXT:    s_mul_hi_u32 s9, s8, 0xfffff001
7580 ; GFX9-NEXT:    s_mul_i32 s5, s4, 0xfffff001
7581 ; GFX9-NEXT:    s_sub_i32 s9, s9, s8
7582 ; GFX9-NEXT:    s_add_i32 s9, s9, s5
7583 ; GFX9-NEXT:    s_mul_i32 s11, s8, 0xfffff001
7584 ; GFX9-NEXT:    s_mul_hi_u32 s5, s8, s9
7585 ; GFX9-NEXT:    s_mul_i32 s10, s8, s9
7586 ; GFX9-NEXT:    s_mul_hi_u32 s8, s8, s11
7587 ; GFX9-NEXT:    s_add_u32 s8, s8, s10
7588 ; GFX9-NEXT:    s_addc_u32 s5, 0, s5
7589 ; GFX9-NEXT:    s_mul_hi_u32 s12, s4, s11
7590 ; GFX9-NEXT:    s_mul_i32 s11, s4, s11
7591 ; GFX9-NEXT:    s_add_u32 s8, s8, s11
7592 ; GFX9-NEXT:    s_mul_hi_u32 s10, s4, s9
7593 ; GFX9-NEXT:    s_addc_u32 s5, s5, s12
7594 ; GFX9-NEXT:    s_addc_u32 s8, s10, 0
7595 ; GFX9-NEXT:    s_mul_i32 s9, s4, s9
7596 ; GFX9-NEXT:    s_add_u32 s5, s5, s9
7597 ; GFX9-NEXT:    s_addc_u32 s8, 0, s8
7598 ; GFX9-NEXT:    v_add_co_u32_e32 v0, vcc, s5, v0
7599 ; GFX9-NEXT:    s_cmp_lg_u64 vcc, 0
7600 ; GFX9-NEXT:    s_addc_u32 s4, s4, s8
7601 ; GFX9-NEXT:    v_readfirstlane_b32 s9, v0
7602 ; GFX9-NEXT:    s_mul_i32 s8, s6, s4
7603 ; GFX9-NEXT:    s_mul_hi_u32 s10, s6, s9
7604 ; GFX9-NEXT:    s_mul_hi_u32 s5, s6, s4
7605 ; GFX9-NEXT:    s_add_u32 s8, s10, s8
7606 ; GFX9-NEXT:    s_addc_u32 s5, 0, s5
7607 ; GFX9-NEXT:    s_mul_hi_u32 s11, s7, s9
7608 ; GFX9-NEXT:    s_mul_i32 s9, s7, s9
7609 ; GFX9-NEXT:    s_add_u32 s8, s8, s9
7610 ; GFX9-NEXT:    s_mul_hi_u32 s10, s7, s4
7611 ; GFX9-NEXT:    s_addc_u32 s5, s5, s11
7612 ; GFX9-NEXT:    s_addc_u32 s8, s10, 0
7613 ; GFX9-NEXT:    s_mul_i32 s4, s7, s4
7614 ; GFX9-NEXT:    s_add_u32 s4, s5, s4
7615 ; GFX9-NEXT:    s_addc_u32 s5, 0, s8
7616 ; GFX9-NEXT:    s_add_u32 s8, s4, 1
7617 ; GFX9-NEXT:    s_addc_u32 s9, s5, 0
7618 ; GFX9-NEXT:    s_add_u32 s10, s4, 2
7619 ; GFX9-NEXT:    s_mul_i32 s13, s5, 0xfff
7620 ; GFX9-NEXT:    s_mul_hi_u32 s14, s4, 0xfff
7621 ; GFX9-NEXT:    s_addc_u32 s11, s5, 0
7622 ; GFX9-NEXT:    s_add_i32 s14, s14, s13
7623 ; GFX9-NEXT:    s_mul_i32 s13, s4, 0xfff
7624 ; GFX9-NEXT:    v_mov_b32_e32 v0, s13
7625 ; GFX9-NEXT:    v_sub_co_u32_e32 v0, vcc, s6, v0
7626 ; GFX9-NEXT:    s_movk_i32 s12, 0xfff
7627 ; GFX9-NEXT:    s_cmp_lg_u64 vcc, 0
7628 ; GFX9-NEXT:    s_subb_u32 s6, s7, s14
7629 ; GFX9-NEXT:    v_subrev_co_u32_e32 v1, vcc, s12, v0
7630 ; GFX9-NEXT:    s_cmp_lg_u64 vcc, 0
7631 ; GFX9-NEXT:    s_subb_u32 s7, s6, 0
7632 ; GFX9-NEXT:    s_movk_i32 s12, 0xffe
7633 ; GFX9-NEXT:    v_cmp_lt_u32_e32 vcc, s12, v1
7634 ; GFX9-NEXT:    s_cmp_eq_u32 s7, 0
7635 ; GFX9-NEXT:    v_cndmask_b32_e64 v1, 0, -1, vcc
7636 ; GFX9-NEXT:    s_cselect_b64 vcc, -1, 0
7637 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, -1, v1, vcc
7638 ; GFX9-NEXT:    v_mov_b32_e32 v2, s8
7639 ; GFX9-NEXT:    v_mov_b32_e32 v3, s10
7640 ; GFX9-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v1
7641 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, v2, v3, vcc
7642 ; GFX9-NEXT:    v_mov_b32_e32 v2, s9
7643 ; GFX9-NEXT:    v_mov_b32_e32 v3, s11
7644 ; GFX9-NEXT:    v_cndmask_b32_e32 v2, v2, v3, vcc
7645 ; GFX9-NEXT:    v_cmp_lt_u32_e32 vcc, s12, v0
7646 ; GFX9-NEXT:    s_cmp_eq_u32 s6, 0
7647 ; GFX9-NEXT:    v_cndmask_b32_e64 v0, 0, -1, vcc
7648 ; GFX9-NEXT:    s_cselect_b64 vcc, -1, 0
7649 ; GFX9-NEXT:    v_cndmask_b32_e32 v0, -1, v0, vcc
7650 ; GFX9-NEXT:    v_mov_b32_e32 v3, s5
7651 ; GFX9-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v0
7652 ; GFX9-NEXT:    v_mov_b32_e32 v0, s4
7653 ; GFX9-NEXT:    v_cndmask_b32_e32 v3, v3, v2, vcc
7654 ; GFX9-NEXT:    v_cndmask_b32_e32 v2, v0, v1, vcc
7655 ; GFX9-NEXT:    v_mov_b32_e32 v0, s0
7656 ; GFX9-NEXT:    v_mov_b32_e32 v1, s1
7657 ; GFX9-NEXT:    global_store_dwordx4 v4, v[0:3], s[2:3]
7658 ; GFX9-NEXT:    s_endpgm
7659   %r = udiv <2 x i64> %x, <i64 4096, i64 4095>
7660   store <2 x i64> %r, ptr addrspace(1) %out
7661   ret void
7664 define amdgpu_kernel void @udiv_v2i64_pow2_shl_denom(ptr addrspace(1) %out, <2 x i64> %x, <2 x i64> %y) {
7665 ; CHECK-LABEL: @udiv_v2i64_pow2_shl_denom(
7666 ; CHECK-NEXT:    [[SHL_Y:%.*]] = shl <2 x i64> <i64 4096, i64 4096>, [[Y:%.*]]
7667 ; CHECK-NEXT:    [[TMP1:%.*]] = extractelement <2 x i64> [[X:%.*]], i64 0
7668 ; CHECK-NEXT:    [[TMP2:%.*]] = extractelement <2 x i64> [[SHL_Y]], i64 0
7669 ; CHECK-NEXT:    [[TMP3:%.*]] = udiv i64 [[TMP1]], [[TMP2]]
7670 ; CHECK-NEXT:    [[TMP4:%.*]] = insertelement <2 x i64> poison, i64 [[TMP3]], i64 0
7671 ; CHECK-NEXT:    [[TMP5:%.*]] = extractelement <2 x i64> [[X]], i64 1
7672 ; CHECK-NEXT:    [[TMP6:%.*]] = extractelement <2 x i64> [[SHL_Y]], i64 1
7673 ; CHECK-NEXT:    [[TMP7:%.*]] = udiv i64 [[TMP5]], [[TMP6]]
7674 ; CHECK-NEXT:    [[TMP8:%.*]] = insertelement <2 x i64> [[TMP4]], i64 [[TMP7]], i64 1
7675 ; CHECK-NEXT:    store <2 x i64> [[TMP8]], ptr addrspace(1) [[OUT:%.*]], align 16
7676 ; CHECK-NEXT:    ret void
7678 ; GFX6-LABEL: udiv_v2i64_pow2_shl_denom:
7679 ; GFX6:       ; %bb.0:
7680 ; GFX6-NEXT:    s_load_dwordx8 s[4:11], s[0:1], 0xd
7681 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
7682 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
7683 ; GFX6-NEXT:    s_mov_b32 s2, -1
7684 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
7685 ; GFX6-NEXT:    s_add_i32 s8, s8, 12
7686 ; GFX6-NEXT:    s_add_i32 s9, s10, 12
7687 ; GFX6-NEXT:    s_lshr_b64 s[4:5], s[4:5], s8
7688 ; GFX6-NEXT:    s_lshr_b64 s[6:7], s[6:7], s9
7689 ; GFX6-NEXT:    v_mov_b32_e32 v0, s4
7690 ; GFX6-NEXT:    v_mov_b32_e32 v1, s5
7691 ; GFX6-NEXT:    v_mov_b32_e32 v2, s6
7692 ; GFX6-NEXT:    v_mov_b32_e32 v3, s7
7693 ; GFX6-NEXT:    buffer_store_dwordx4 v[0:3], off, s[0:3], 0
7694 ; GFX6-NEXT:    s_endpgm
7696 ; GFX9-LABEL: udiv_v2i64_pow2_shl_denom:
7697 ; GFX9:       ; %bb.0:
7698 ; GFX9-NEXT:    s_load_dwordx8 s[4:11], s[0:1], 0x34
7699 ; GFX9-NEXT:    v_mov_b32_e32 v4, 0
7700 ; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
7701 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
7702 ; GFX9-NEXT:    s_add_i32 s2, s8, 12
7703 ; GFX9-NEXT:    s_add_i32 s8, s10, 12
7704 ; GFX9-NEXT:    s_lshr_b64 s[2:3], s[4:5], s2
7705 ; GFX9-NEXT:    s_lshr_b64 s[4:5], s[6:7], s8
7706 ; GFX9-NEXT:    v_mov_b32_e32 v0, s2
7707 ; GFX9-NEXT:    v_mov_b32_e32 v1, s3
7708 ; GFX9-NEXT:    v_mov_b32_e32 v2, s4
7709 ; GFX9-NEXT:    v_mov_b32_e32 v3, s5
7710 ; GFX9-NEXT:    global_store_dwordx4 v4, v[0:3], s[0:1]
7711 ; GFX9-NEXT:    s_endpgm
7712   %shl.y = shl <2 x i64> <i64 4096, i64 4096>, %y
7713   %r = udiv <2 x i64> %x, %shl.y
7714   store <2 x i64> %r, ptr addrspace(1) %out
7715   ret void
7718 define amdgpu_kernel void @urem_i64_oddk_denom(ptr addrspace(1) %out, i64 %x) {
7719 ; CHECK-LABEL: @urem_i64_oddk_denom(
7720 ; CHECK-NEXT:    [[R:%.*]] = urem i64 [[X:%.*]], 1235195393993
7721 ; CHECK-NEXT:    store i64 [[R]], ptr addrspace(1) [[OUT:%.*]], align 8
7722 ; CHECK-NEXT:    ret void
7724 ; GFX6-LABEL: urem_i64_oddk_denom:
7725 ; GFX6:       ; %bb.0:
7726 ; GFX6-NEXT:    s_load_dwordx4 s[8:11], s[0:1], 0x9
7727 ; GFX6-NEXT:    s_add_u32 s0, 4, 0
7728 ; GFX6-NEXT:    v_mov_b32_e32 v0, 0xe3e0fc
7729 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, s0, v0
7730 ; GFX6-NEXT:    s_addc_u32 s1, 0, 0
7731 ; GFX6-NEXT:    s_or_b32 s0, vcc_lo, vcc_hi
7732 ; GFX6-NEXT:    s_cmp_lg_u32 s0, 0
7733 ; GFX6-NEXT:    s_mov_b32 s0, 0x689e0837
7734 ; GFX6-NEXT:    s_movk_i32 s2, 0xfee0
7735 ; GFX6-NEXT:    v_mul_lo_u32 v1, v0, s2
7736 ; GFX6-NEXT:    v_mul_hi_u32 v2, v0, s0
7737 ; GFX6-NEXT:    s_addc_u32 s1, s1, 0
7738 ; GFX6-NEXT:    s_mul_i32 s2, s1, 0x689e0837
7739 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
7740 ; GFX6-NEXT:    s_mov_b32 s4, s8
7741 ; GFX6-NEXT:    v_add_i32_e32 v1, vcc, v1, v2
7742 ; GFX6-NEXT:    v_mul_lo_u32 v2, v0, s0
7743 ; GFX6-NEXT:    v_add_i32_e32 v1, vcc, s2, v1
7744 ; GFX6-NEXT:    v_mul_lo_u32 v3, v0, v1
7745 ; GFX6-NEXT:    v_mul_hi_u32 v4, v0, v2
7746 ; GFX6-NEXT:    v_mul_hi_u32 v5, v0, v1
7747 ; GFX6-NEXT:    v_mul_hi_u32 v6, s1, v1
7748 ; GFX6-NEXT:    v_mul_lo_u32 v1, s1, v1
7749 ; GFX6-NEXT:    v_add_i32_e32 v3, vcc, v4, v3
7750 ; GFX6-NEXT:    v_addc_u32_e32 v4, vcc, 0, v5, vcc
7751 ; GFX6-NEXT:    v_mul_lo_u32 v5, s1, v2
7752 ; GFX6-NEXT:    v_mul_hi_u32 v2, s1, v2
7753 ; GFX6-NEXT:    s_movk_i32 s8, 0x11f
7754 ; GFX6-NEXT:    s_mov_b32 s12, 0x9761f7c9
7755 ; GFX6-NEXT:    v_add_i32_e32 v3, vcc, v3, v5
7756 ; GFX6-NEXT:    v_addc_u32_e32 v2, vcc, v4, v2, vcc
7757 ; GFX6-NEXT:    v_addc_u32_e32 v3, vcc, 0, v6, vcc
7758 ; GFX6-NEXT:    v_add_i32_e32 v1, vcc, v2, v1
7759 ; GFX6-NEXT:    v_addc_u32_e32 v2, vcc, 0, v3, vcc
7760 ; GFX6-NEXT:    v_mov_b32_e32 v3, s1
7761 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, v0, v1
7762 ; GFX6-NEXT:    v_addc_u32_e32 v1, vcc, v3, v2, vcc
7763 ; GFX6-NEXT:    v_mul_lo_u32 v2, s10, v1
7764 ; GFX6-NEXT:    v_mul_hi_u32 v3, s10, v0
7765 ; GFX6-NEXT:    v_mul_hi_u32 v4, s10, v1
7766 ; GFX6-NEXT:    v_mul_hi_u32 v5, s11, v1
7767 ; GFX6-NEXT:    v_mul_lo_u32 v1, s11, v1
7768 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, v3, v2
7769 ; GFX6-NEXT:    v_addc_u32_e32 v3, vcc, 0, v4, vcc
7770 ; GFX6-NEXT:    v_mul_lo_u32 v4, s11, v0
7771 ; GFX6-NEXT:    v_mul_hi_u32 v0, s11, v0
7772 ; GFX6-NEXT:    s_mov_b32 s5, s9
7773 ; GFX6-NEXT:    s_movk_i32 s9, 0x11e
7774 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, v2, v4
7775 ; GFX6-NEXT:    v_addc_u32_e32 v0, vcc, v3, v0, vcc
7776 ; GFX6-NEXT:    v_addc_u32_e32 v2, vcc, 0, v5, vcc
7777 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, v0, v1
7778 ; GFX6-NEXT:    v_addc_u32_e32 v1, vcc, 0, v2, vcc
7779 ; GFX6-NEXT:    v_mul_lo_u32 v2, v0, s8
7780 ; GFX6-NEXT:    v_mul_hi_u32 v3, v0, s12
7781 ; GFX6-NEXT:    v_mul_lo_u32 v1, v1, s12
7782 ; GFX6-NEXT:    v_mul_lo_u32 v0, v0, s12
7783 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
7784 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, v2, v3
7785 ; GFX6-NEXT:    v_add_i32_e32 v1, vcc, v1, v2
7786 ; GFX6-NEXT:    v_sub_i32_e32 v2, vcc, s11, v1
7787 ; GFX6-NEXT:    v_mov_b32_e32 v3, 0x11f
7788 ; GFX6-NEXT:    v_sub_i32_e32 v0, vcc, s10, v0
7789 ; GFX6-NEXT:    v_subb_u32_e64 v2, s[0:1], v2, v3, vcc
7790 ; GFX6-NEXT:    v_subrev_i32_e64 v4, s[0:1], s12, v0
7791 ; GFX6-NEXT:    v_subbrev_u32_e64 v5, s[2:3], 0, v2, s[0:1]
7792 ; GFX6-NEXT:    v_cmp_lt_u32_e64 s[2:3], s9, v5
7793 ; GFX6-NEXT:    s_mov_b32 s10, 0x9761f7c8
7794 ; GFX6-NEXT:    v_cndmask_b32_e64 v6, 0, -1, s[2:3]
7795 ; GFX6-NEXT:    v_cmp_lt_u32_e64 s[2:3], s10, v4
7796 ; GFX6-NEXT:    v_subb_u32_e64 v2, s[0:1], v2, v3, s[0:1]
7797 ; GFX6-NEXT:    v_cndmask_b32_e64 v7, 0, -1, s[2:3]
7798 ; GFX6-NEXT:    v_cmp_eq_u32_e64 s[2:3], s8, v5
7799 ; GFX6-NEXT:    v_subrev_i32_e64 v3, s[0:1], s12, v4
7800 ; GFX6-NEXT:    v_cndmask_b32_e64 v6, v6, v7, s[2:3]
7801 ; GFX6-NEXT:    v_subbrev_u32_e64 v2, s[0:1], 0, v2, s[0:1]
7802 ; GFX6-NEXT:    v_cmp_ne_u32_e64 s[0:1], 0, v6
7803 ; GFX6-NEXT:    v_cndmask_b32_e64 v3, v4, v3, s[0:1]
7804 ; GFX6-NEXT:    v_mov_b32_e32 v4, s11
7805 ; GFX6-NEXT:    v_subb_u32_e32 v1, vcc, v4, v1, vcc
7806 ; GFX6-NEXT:    v_cmp_lt_u32_e32 vcc, s9, v1
7807 ; GFX6-NEXT:    v_cndmask_b32_e64 v4, 0, -1, vcc
7808 ; GFX6-NEXT:    v_cmp_lt_u32_e32 vcc, s10, v0
7809 ; GFX6-NEXT:    v_cndmask_b32_e64 v2, v5, v2, s[0:1]
7810 ; GFX6-NEXT:    v_cndmask_b32_e64 v5, 0, -1, vcc
7811 ; GFX6-NEXT:    v_cmp_eq_u32_e32 vcc, s8, v1
7812 ; GFX6-NEXT:    v_cndmask_b32_e32 v4, v4, v5, vcc
7813 ; GFX6-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v4
7814 ; GFX6-NEXT:    s_mov_b32 s6, -1
7815 ; GFX6-NEXT:    v_cndmask_b32_e32 v1, v1, v2, vcc
7816 ; GFX6-NEXT:    v_cndmask_b32_e32 v0, v0, v3, vcc
7817 ; GFX6-NEXT:    buffer_store_dwordx2 v[0:1], off, s[4:7], 0
7818 ; GFX6-NEXT:    s_endpgm
7820 ; GFX9-LABEL: urem_i64_oddk_denom:
7821 ; GFX9:       ; %bb.0:
7822 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
7823 ; GFX9-NEXT:    s_add_u32 s0, 4, 0
7824 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0xe3e0fc
7825 ; GFX9-NEXT:    s_addc_u32 s1, 0, 0
7826 ; GFX9-NEXT:    v_add_co_u32_e32 v0, vcc, s0, v0
7827 ; GFX9-NEXT:    s_cmp_lg_u64 vcc, 0
7828 ; GFX9-NEXT:    v_readfirstlane_b32 s2, v0
7829 ; GFX9-NEXT:    s_addc_u32 s0, s1, 0
7830 ; GFX9-NEXT:    s_mul_i32 s3, s2, 0xfffffee0
7831 ; GFX9-NEXT:    s_mul_hi_u32 s8, s2, 0x689e0837
7832 ; GFX9-NEXT:    s_mul_i32 s1, s0, 0x689e0837
7833 ; GFX9-NEXT:    s_add_i32 s3, s8, s3
7834 ; GFX9-NEXT:    s_add_i32 s3, s3, s1
7835 ; GFX9-NEXT:    s_mul_i32 s9, s2, 0x689e0837
7836 ; GFX9-NEXT:    s_mul_hi_u32 s1, s2, s3
7837 ; GFX9-NEXT:    s_mul_i32 s8, s2, s3
7838 ; GFX9-NEXT:    s_mul_hi_u32 s2, s2, s9
7839 ; GFX9-NEXT:    s_add_u32 s2, s2, s8
7840 ; GFX9-NEXT:    s_addc_u32 s1, 0, s1
7841 ; GFX9-NEXT:    s_mul_hi_u32 s10, s0, s9
7842 ; GFX9-NEXT:    s_mul_i32 s9, s0, s9
7843 ; GFX9-NEXT:    s_add_u32 s2, s2, s9
7844 ; GFX9-NEXT:    s_mul_hi_u32 s8, s0, s3
7845 ; GFX9-NEXT:    s_addc_u32 s1, s1, s10
7846 ; GFX9-NEXT:    s_addc_u32 s2, s8, 0
7847 ; GFX9-NEXT:    s_mul_i32 s3, s0, s3
7848 ; GFX9-NEXT:    s_add_u32 s1, s1, s3
7849 ; GFX9-NEXT:    s_addc_u32 s2, 0, s2
7850 ; GFX9-NEXT:    v_add_co_u32_e32 v0, vcc, s1, v0
7851 ; GFX9-NEXT:    s_cmp_lg_u64 vcc, 0
7852 ; GFX9-NEXT:    s_addc_u32 s0, s0, s2
7853 ; GFX9-NEXT:    v_readfirstlane_b32 s3, v0
7854 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
7855 ; GFX9-NEXT:    s_mul_i32 s2, s6, s0
7856 ; GFX9-NEXT:    s_mul_hi_u32 s8, s6, s3
7857 ; GFX9-NEXT:    s_mul_hi_u32 s1, s6, s0
7858 ; GFX9-NEXT:    s_add_u32 s2, s8, s2
7859 ; GFX9-NEXT:    s_addc_u32 s1, 0, s1
7860 ; GFX9-NEXT:    s_mul_hi_u32 s9, s7, s3
7861 ; GFX9-NEXT:    s_mul_i32 s3, s7, s3
7862 ; GFX9-NEXT:    s_add_u32 s2, s2, s3
7863 ; GFX9-NEXT:    s_mul_hi_u32 s8, s7, s0
7864 ; GFX9-NEXT:    s_addc_u32 s1, s1, s9
7865 ; GFX9-NEXT:    s_addc_u32 s2, s8, 0
7866 ; GFX9-NEXT:    s_mul_i32 s0, s7, s0
7867 ; GFX9-NEXT:    s_add_u32 s0, s1, s0
7868 ; GFX9-NEXT:    s_addc_u32 s1, 0, s2
7869 ; GFX9-NEXT:    s_mul_i32 s2, s0, 0x11f
7870 ; GFX9-NEXT:    s_mul_hi_u32 s3, s0, 0x9761f7c9
7871 ; GFX9-NEXT:    s_add_i32 s2, s3, s2
7872 ; GFX9-NEXT:    s_mul_i32 s1, s1, 0x9761f7c9
7873 ; GFX9-NEXT:    s_mul_i32 s0, s0, 0x9761f7c9
7874 ; GFX9-NEXT:    s_add_i32 s9, s2, s1
7875 ; GFX9-NEXT:    v_mov_b32_e32 v0, s0
7876 ; GFX9-NEXT:    s_sub_i32 s1, s7, s9
7877 ; GFX9-NEXT:    v_sub_co_u32_e32 v0, vcc, s6, v0
7878 ; GFX9-NEXT:    s_mov_b32 s8, 0x9761f7c9
7879 ; GFX9-NEXT:    s_cmp_lg_u64 vcc, 0
7880 ; GFX9-NEXT:    s_subb_u32 s6, s1, 0x11f
7881 ; GFX9-NEXT:    v_subrev_co_u32_e64 v1, s[0:1], s8, v0
7882 ; GFX9-NEXT:    s_cmp_lg_u64 s[0:1], 0
7883 ; GFX9-NEXT:    s_subb_u32 s10, s6, 0
7884 ; GFX9-NEXT:    s_cmpk_gt_u32 s10, 0x11e
7885 ; GFX9-NEXT:    s_mov_b32 s12, 0x9761f7c8
7886 ; GFX9-NEXT:    s_cselect_b32 s11, -1, 0
7887 ; GFX9-NEXT:    v_cmp_lt_u32_e64 s[2:3], s12, v1
7888 ; GFX9-NEXT:    s_cmpk_eq_i32 s10, 0x11f
7889 ; GFX9-NEXT:    v_cndmask_b32_e64 v3, 0, -1, s[2:3]
7890 ; GFX9-NEXT:    v_mov_b32_e32 v4, s11
7891 ; GFX9-NEXT:    s_cselect_b64 s[2:3], -1, 0
7892 ; GFX9-NEXT:    s_cmp_lg_u64 s[0:1], 0
7893 ; GFX9-NEXT:    v_cndmask_b32_e64 v3, v4, v3, s[2:3]
7894 ; GFX9-NEXT:    s_subb_u32 s2, s6, 0x11f
7895 ; GFX9-NEXT:    v_subrev_co_u32_e64 v4, s[0:1], s8, v1
7896 ; GFX9-NEXT:    s_cmp_lg_u64 s[0:1], 0
7897 ; GFX9-NEXT:    s_subb_u32 s2, s2, 0
7898 ; GFX9-NEXT:    v_cmp_ne_u32_e64 s[0:1], 0, v3
7899 ; GFX9-NEXT:    v_cndmask_b32_e64 v3, v1, v4, s[0:1]
7900 ; GFX9-NEXT:    v_mov_b32_e32 v1, s10
7901 ; GFX9-NEXT:    v_mov_b32_e32 v4, s2
7902 ; GFX9-NEXT:    s_cmp_lg_u64 vcc, 0
7903 ; GFX9-NEXT:    v_cndmask_b32_e64 v1, v1, v4, s[0:1]
7904 ; GFX9-NEXT:    s_subb_u32 s0, s7, s9
7905 ; GFX9-NEXT:    s_cmpk_gt_u32 s0, 0x11e
7906 ; GFX9-NEXT:    s_cselect_b32 s1, -1, 0
7907 ; GFX9-NEXT:    v_cmp_lt_u32_e32 vcc, s12, v0
7908 ; GFX9-NEXT:    s_cmpk_eq_i32 s0, 0x11f
7909 ; GFX9-NEXT:    v_cndmask_b32_e64 v4, 0, -1, vcc
7910 ; GFX9-NEXT:    v_mov_b32_e32 v5, s1
7911 ; GFX9-NEXT:    s_cselect_b64 vcc, -1, 0
7912 ; GFX9-NEXT:    v_cndmask_b32_e32 v4, v5, v4, vcc
7913 ; GFX9-NEXT:    v_mov_b32_e32 v5, s0
7914 ; GFX9-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v4
7915 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0
7916 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, v5, v1, vcc
7917 ; GFX9-NEXT:    v_cndmask_b32_e32 v0, v0, v3, vcc
7918 ; GFX9-NEXT:    global_store_dwordx2 v2, v[0:1], s[4:5]
7919 ; GFX9-NEXT:    s_endpgm
7920   %r = urem i64 %x, 1235195393993
7921   store i64 %r, ptr addrspace(1) %out
7922   ret void
7925 define amdgpu_kernel void @urem_i64_pow2k_denom(ptr addrspace(1) %out, i64 %x) {
7926 ; CHECK-LABEL: @urem_i64_pow2k_denom(
7927 ; CHECK-NEXT:    [[R:%.*]] = urem i64 [[X:%.*]], 4096
7928 ; CHECK-NEXT:    store i64 [[R]], ptr addrspace(1) [[OUT:%.*]], align 8
7929 ; CHECK-NEXT:    ret void
7931 ; GFX6-LABEL: urem_i64_pow2k_denom:
7932 ; GFX6:       ; %bb.0:
7933 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
7934 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
7935 ; GFX6-NEXT:    s_mov_b32 s6, -1
7936 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0
7937 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
7938 ; GFX6-NEXT:    s_mov_b32 s4, s0
7939 ; GFX6-NEXT:    s_and_b32 s0, s2, 0xfff
7940 ; GFX6-NEXT:    s_mov_b32 s5, s1
7941 ; GFX6-NEXT:    v_mov_b32_e32 v0, s0
7942 ; GFX6-NEXT:    buffer_store_dwordx2 v[0:1], off, s[4:7], 0
7943 ; GFX6-NEXT:    s_endpgm
7945 ; GFX9-LABEL: urem_i64_pow2k_denom:
7946 ; GFX9:       ; %bb.0:
7947 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
7948 ; GFX9-NEXT:    v_mov_b32_e32 v1, 0
7949 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
7950 ; GFX9-NEXT:    s_and_b32 s2, s2, 0xfff
7951 ; GFX9-NEXT:    v_mov_b32_e32 v0, s2
7952 ; GFX9-NEXT:    global_store_dwordx2 v1, v[0:1], s[0:1]
7953 ; GFX9-NEXT:    s_endpgm
7954   %r = urem i64 %x, 4096
7955   store i64 %r, ptr addrspace(1) %out
7956   ret void
7959 define amdgpu_kernel void @urem_i64_pow2_shl_denom(ptr addrspace(1) %out, i64 %x, i64 %y) {
7960 ; CHECK-LABEL: @urem_i64_pow2_shl_denom(
7961 ; CHECK-NEXT:    [[SHL_Y:%.*]] = shl i64 4096, [[Y:%.*]]
7962 ; CHECK-NEXT:    [[R:%.*]] = urem i64 [[X:%.*]], [[SHL_Y]]
7963 ; CHECK-NEXT:    store i64 [[R]], ptr addrspace(1) [[OUT:%.*]], align 8
7964 ; CHECK-NEXT:    ret void
7966 ; GFX6-LABEL: urem_i64_pow2_shl_denom:
7967 ; GFX6:       ; %bb.0:
7968 ; GFX6-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
7969 ; GFX6-NEXT:    s_load_dword s8, s[0:1], 0xd
7970 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
7971 ; GFX6-NEXT:    s_mov_b32 s2, -1
7972 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
7973 ; GFX6-NEXT:    s_mov_b32 s0, s4
7974 ; GFX6-NEXT:    s_mov_b32 s1, s5
7975 ; GFX6-NEXT:    s_lshl_b64 s[4:5], 0x1000, s8
7976 ; GFX6-NEXT:    s_add_u32 s4, s4, -1
7977 ; GFX6-NEXT:    s_addc_u32 s5, s5, -1
7978 ; GFX6-NEXT:    s_and_b64 s[4:5], s[6:7], s[4:5]
7979 ; GFX6-NEXT:    v_mov_b32_e32 v0, s4
7980 ; GFX6-NEXT:    v_mov_b32_e32 v1, s5
7981 ; GFX6-NEXT:    buffer_store_dwordx2 v[0:1], off, s[0:3], 0
7982 ; GFX6-NEXT:    s_endpgm
7984 ; GFX9-LABEL: urem_i64_pow2_shl_denom:
7985 ; GFX9:       ; %bb.0:
7986 ; GFX9-NEXT:    s_load_dword s2, s[0:1], 0x34
7987 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
7988 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0
7989 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
7990 ; GFX9-NEXT:    s_lshl_b64 s[0:1], 0x1000, s2
7991 ; GFX9-NEXT:    s_add_u32 s0, s0, -1
7992 ; GFX9-NEXT:    s_addc_u32 s1, s1, -1
7993 ; GFX9-NEXT:    s_and_b64 s[0:1], s[6:7], s[0:1]
7994 ; GFX9-NEXT:    v_mov_b32_e32 v0, s0
7995 ; GFX9-NEXT:    v_mov_b32_e32 v1, s1
7996 ; GFX9-NEXT:    global_store_dwordx2 v2, v[0:1], s[4:5]
7997 ; GFX9-NEXT:    s_endpgm
7998   %shl.y = shl i64 4096, %y
7999   %r = urem i64 %x, %shl.y
8000   store i64 %r, ptr addrspace(1) %out
8001   ret void
8004 define amdgpu_kernel void @urem_v2i64_pow2k_denom(ptr addrspace(1) %out, <2 x i64> %x) {
8005 ; CHECK-LABEL: @urem_v2i64_pow2k_denom(
8006 ; CHECK-NEXT:    [[TMP1:%.*]] = extractelement <2 x i64> [[X:%.*]], i64 0
8007 ; CHECK-NEXT:    [[TMP2:%.*]] = urem i64 [[TMP1]], 4096
8008 ; CHECK-NEXT:    [[TMP3:%.*]] = insertelement <2 x i64> poison, i64 [[TMP2]], i64 0
8009 ; CHECK-NEXT:    [[TMP4:%.*]] = extractelement <2 x i64> [[X]], i64 1
8010 ; CHECK-NEXT:    [[TMP5:%.*]] = urem i64 [[TMP4]], 4096
8011 ; CHECK-NEXT:    [[TMP6:%.*]] = insertelement <2 x i64> [[TMP3]], i64 [[TMP5]], i64 1
8012 ; CHECK-NEXT:    store <2 x i64> [[TMP6]], ptr addrspace(1) [[OUT:%.*]], align 16
8013 ; CHECK-NEXT:    ret void
8015 ; GFX6-LABEL: urem_v2i64_pow2k_denom:
8016 ; GFX6:       ; %bb.0:
8017 ; GFX6-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0xd
8018 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
8019 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0
8020 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
8021 ; GFX6-NEXT:    s_mov_b32 s2, -1
8022 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
8023 ; GFX6-NEXT:    s_and_b32 s4, s4, 0xfff
8024 ; GFX6-NEXT:    s_and_b32 s5, s6, 0xfff
8025 ; GFX6-NEXT:    v_mov_b32_e32 v0, s4
8026 ; GFX6-NEXT:    v_mov_b32_e32 v2, s5
8027 ; GFX6-NEXT:    v_mov_b32_e32 v3, v1
8028 ; GFX6-NEXT:    buffer_store_dwordx4 v[0:3], off, s[0:3], 0
8029 ; GFX6-NEXT:    s_endpgm
8031 ; GFX9-LABEL: urem_v2i64_pow2k_denom:
8032 ; GFX9:       ; %bb.0:
8033 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x34
8034 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
8035 ; GFX9-NEXT:    v_mov_b32_e32 v1, 0
8036 ; GFX9-NEXT:    v_mov_b32_e32 v3, v1
8037 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
8038 ; GFX9-NEXT:    s_and_b32 s0, s4, 0xfff
8039 ; GFX9-NEXT:    s_and_b32 s1, s6, 0xfff
8040 ; GFX9-NEXT:    v_mov_b32_e32 v0, s0
8041 ; GFX9-NEXT:    v_mov_b32_e32 v2, s1
8042 ; GFX9-NEXT:    global_store_dwordx4 v1, v[0:3], s[2:3]
8043 ; GFX9-NEXT:    s_endpgm
8044   %r = urem <2 x i64> %x, <i64 4096, i64 4096>
8045   store <2 x i64> %r, ptr addrspace(1) %out
8046   ret void
8049 define amdgpu_kernel void @urem_v2i64_pow2_shl_denom(ptr addrspace(1) %out, <2 x i64> %x, <2 x i64> %y) {
8050 ; CHECK-LABEL: @urem_v2i64_pow2_shl_denom(
8051 ; CHECK-NEXT:    [[SHL_Y:%.*]] = shl <2 x i64> <i64 4096, i64 4096>, [[Y:%.*]]
8052 ; CHECK-NEXT:    [[TMP1:%.*]] = extractelement <2 x i64> [[X:%.*]], i64 0
8053 ; CHECK-NEXT:    [[TMP2:%.*]] = extractelement <2 x i64> [[SHL_Y]], i64 0
8054 ; CHECK-NEXT:    [[TMP3:%.*]] = urem i64 [[TMP1]], [[TMP2]]
8055 ; CHECK-NEXT:    [[TMP4:%.*]] = insertelement <2 x i64> poison, i64 [[TMP3]], i64 0
8056 ; CHECK-NEXT:    [[TMP5:%.*]] = extractelement <2 x i64> [[X]], i64 1
8057 ; CHECK-NEXT:    [[TMP6:%.*]] = extractelement <2 x i64> [[SHL_Y]], i64 1
8058 ; CHECK-NEXT:    [[TMP7:%.*]] = urem i64 [[TMP5]], [[TMP6]]
8059 ; CHECK-NEXT:    [[TMP8:%.*]] = insertelement <2 x i64> [[TMP4]], i64 [[TMP7]], i64 1
8060 ; CHECK-NEXT:    store <2 x i64> [[TMP8]], ptr addrspace(1) [[OUT:%.*]], align 16
8061 ; CHECK-NEXT:    ret void
8063 ; GFX6-LABEL: urem_v2i64_pow2_shl_denom:
8064 ; GFX6:       ; %bb.0:
8065 ; GFX6-NEXT:    s_load_dwordx8 s[4:11], s[0:1], 0xd
8066 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
8067 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
8068 ; GFX6-NEXT:    s_mov_b32 s2, -1
8069 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
8070 ; GFX6-NEXT:    s_lshl_b64 s[10:11], 0x1000, s10
8071 ; GFX6-NEXT:    s_lshl_b64 s[8:9], 0x1000, s8
8072 ; GFX6-NEXT:    s_add_u32 s8, s8, -1
8073 ; GFX6-NEXT:    s_addc_u32 s9, s9, -1
8074 ; GFX6-NEXT:    s_and_b64 s[4:5], s[4:5], s[8:9]
8075 ; GFX6-NEXT:    s_add_u32 s8, s10, -1
8076 ; GFX6-NEXT:    s_addc_u32 s9, s11, -1
8077 ; GFX6-NEXT:    s_and_b64 s[6:7], s[6:7], s[8:9]
8078 ; GFX6-NEXT:    v_mov_b32_e32 v0, s4
8079 ; GFX6-NEXT:    v_mov_b32_e32 v1, s5
8080 ; GFX6-NEXT:    v_mov_b32_e32 v2, s6
8081 ; GFX6-NEXT:    v_mov_b32_e32 v3, s7
8082 ; GFX6-NEXT:    buffer_store_dwordx4 v[0:3], off, s[0:3], 0
8083 ; GFX6-NEXT:    s_endpgm
8085 ; GFX9-LABEL: urem_v2i64_pow2_shl_denom:
8086 ; GFX9:       ; %bb.0:
8087 ; GFX9-NEXT:    s_load_dwordx8 s[4:11], s[0:1], 0x34
8088 ; GFX9-NEXT:    v_mov_b32_e32 v4, 0
8089 ; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
8090 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
8091 ; GFX9-NEXT:    s_lshl_b64 s[2:3], 0x1000, s10
8092 ; GFX9-NEXT:    s_lshl_b64 s[8:9], 0x1000, s8
8093 ; GFX9-NEXT:    s_add_u32 s8, s8, -1
8094 ; GFX9-NEXT:    s_addc_u32 s9, s9, -1
8095 ; GFX9-NEXT:    s_and_b64 s[4:5], s[4:5], s[8:9]
8096 ; GFX9-NEXT:    s_add_u32 s2, s2, -1
8097 ; GFX9-NEXT:    s_addc_u32 s3, s3, -1
8098 ; GFX9-NEXT:    s_and_b64 s[2:3], s[6:7], s[2:3]
8099 ; GFX9-NEXT:    v_mov_b32_e32 v0, s4
8100 ; GFX9-NEXT:    v_mov_b32_e32 v1, s5
8101 ; GFX9-NEXT:    v_mov_b32_e32 v2, s2
8102 ; GFX9-NEXT:    v_mov_b32_e32 v3, s3
8103 ; GFX9-NEXT:    global_store_dwordx4 v4, v[0:3], s[0:1]
8104 ; GFX9-NEXT:    s_endpgm
8105   %shl.y = shl <2 x i64> <i64 4096, i64 4096>, %y
8106   %r = urem <2 x i64> %x, %shl.y
8107   store <2 x i64> %r, ptr addrspace(1) %out
8108   ret void
8111 define amdgpu_kernel void @sdiv_i64_oddk_denom(ptr addrspace(1) %out, i64 %x) {
8112 ; CHECK-LABEL: @sdiv_i64_oddk_denom(
8113 ; CHECK-NEXT:    [[R:%.*]] = sdiv i64 [[X:%.*]], 1235195
8114 ; CHECK-NEXT:    store i64 [[R]], ptr addrspace(1) [[OUT:%.*]], align 8
8115 ; CHECK-NEXT:    ret void
8117 ; GFX6-LABEL: sdiv_i64_oddk_denom:
8118 ; GFX6:       ; %bb.0:
8119 ; GFX6-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
8120 ; GFX6-NEXT:    s_mov_b32 s0, 0x33fe64
8121 ; GFX6-NEXT:    s_add_u32 s1, 0x396, s0
8122 ; GFX6-NEXT:    v_mov_b32_e32 v0, 0x28100000
8123 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, s1, v0
8124 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
8125 ; GFX6-NEXT:    s_mov_b32 s0, s4
8126 ; GFX6-NEXT:    s_addc_u32 s4, 0, 0
8127 ; GFX6-NEXT:    s_or_b32 s1, vcc_lo, vcc_hi
8128 ; GFX6-NEXT:    s_cmp_lg_u32 s1, 0
8129 ; GFX6-NEXT:    s_mov_b32 s1, 0xffed2705
8130 ; GFX6-NEXT:    v_mul_hi_u32 v1, v0, s1
8131 ; GFX6-NEXT:    s_addc_u32 s4, s4, 0xd95
8132 ; GFX6-NEXT:    v_mul_lo_u32 v2, v0, s1
8133 ; GFX6-NEXT:    s_mul_i32 s8, s4, 0xffed2705
8134 ; GFX6-NEXT:    v_add_i32_e32 v1, vcc, s8, v1
8135 ; GFX6-NEXT:    v_sub_i32_e32 v1, vcc, v1, v0
8136 ; GFX6-NEXT:    v_mul_lo_u32 v5, v0, v1
8137 ; GFX6-NEXT:    v_mul_hi_u32 v6, v0, v2
8138 ; GFX6-NEXT:    v_mul_hi_u32 v7, v0, v1
8139 ; GFX6-NEXT:    v_mul_hi_u32 v4, s4, v2
8140 ; GFX6-NEXT:    v_mul_lo_u32 v2, s4, v2
8141 ; GFX6-NEXT:    v_mul_hi_u32 v3, s4, v1
8142 ; GFX6-NEXT:    v_add_i32_e32 v5, vcc, v6, v5
8143 ; GFX6-NEXT:    v_addc_u32_e32 v6, vcc, 0, v7, vcc
8144 ; GFX6-NEXT:    v_mul_lo_u32 v1, s4, v1
8145 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, v5, v2
8146 ; GFX6-NEXT:    v_addc_u32_e32 v2, vcc, v6, v4, vcc
8147 ; GFX6-NEXT:    v_addc_u32_e32 v3, vcc, 0, v3, vcc
8148 ; GFX6-NEXT:    v_add_i32_e32 v1, vcc, v2, v1
8149 ; GFX6-NEXT:    s_ashr_i32 s8, s7, 31
8150 ; GFX6-NEXT:    v_addc_u32_e32 v2, vcc, 0, v3, vcc
8151 ; GFX6-NEXT:    s_add_u32 s6, s6, s8
8152 ; GFX6-NEXT:    v_mov_b32_e32 v3, s4
8153 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, v0, v1
8154 ; GFX6-NEXT:    s_mov_b32 s9, s8
8155 ; GFX6-NEXT:    s_addc_u32 s7, s7, s8
8156 ; GFX6-NEXT:    v_addc_u32_e32 v1, vcc, v3, v2, vcc
8157 ; GFX6-NEXT:    s_xor_b64 s[6:7], s[6:7], s[8:9]
8158 ; GFX6-NEXT:    v_mul_lo_u32 v2, s6, v1
8159 ; GFX6-NEXT:    v_mul_hi_u32 v3, s6, v0
8160 ; GFX6-NEXT:    v_mul_hi_u32 v4, s6, v1
8161 ; GFX6-NEXT:    v_mul_hi_u32 v5, s7, v1
8162 ; GFX6-NEXT:    v_mul_lo_u32 v1, s7, v1
8163 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, v3, v2
8164 ; GFX6-NEXT:    v_addc_u32_e32 v3, vcc, 0, v4, vcc
8165 ; GFX6-NEXT:    v_mul_lo_u32 v4, s7, v0
8166 ; GFX6-NEXT:    v_mul_hi_u32 v0, s7, v0
8167 ; GFX6-NEXT:    s_mov_b32 s4, 0x12d8fb
8168 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
8169 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, v2, v4
8170 ; GFX6-NEXT:    v_addc_u32_e32 v0, vcc, v3, v0, vcc
8171 ; GFX6-NEXT:    v_addc_u32_e32 v2, vcc, 0, v5, vcc
8172 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, v0, v1
8173 ; GFX6-NEXT:    v_addc_u32_e32 v1, vcc, 0, v2, vcc
8174 ; GFX6-NEXT:    v_mul_lo_u32 v4, v1, s4
8175 ; GFX6-NEXT:    v_mul_hi_u32 v5, v0, s4
8176 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, 1, v0
8177 ; GFX6-NEXT:    v_mul_lo_u32 v8, v0, s4
8178 ; GFX6-NEXT:    v_addc_u32_e32 v3, vcc, 0, v1, vcc
8179 ; GFX6-NEXT:    v_add_i32_e32 v6, vcc, 2, v0
8180 ; GFX6-NEXT:    v_addc_u32_e32 v7, vcc, 0, v1, vcc
8181 ; GFX6-NEXT:    v_add_i32_e32 v4, vcc, v4, v5
8182 ; GFX6-NEXT:    v_mov_b32_e32 v5, s7
8183 ; GFX6-NEXT:    v_sub_i32_e32 v8, vcc, s6, v8
8184 ; GFX6-NEXT:    v_subb_u32_e32 v4, vcc, v5, v4, vcc
8185 ; GFX6-NEXT:    v_subrev_i32_e32 v5, vcc, s4, v8
8186 ; GFX6-NEXT:    v_subbrev_u32_e32 v9, vcc, 0, v4, vcc
8187 ; GFX6-NEXT:    s_mov_b32 s4, 0x12d8fa
8188 ; GFX6-NEXT:    v_cmp_lt_u32_e32 vcc, s4, v5
8189 ; GFX6-NEXT:    v_cndmask_b32_e64 v5, 0, -1, vcc
8190 ; GFX6-NEXT:    v_cmp_eq_u32_e32 vcc, 0, v9
8191 ; GFX6-NEXT:    v_cndmask_b32_e32 v5, -1, v5, vcc
8192 ; GFX6-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v5
8193 ; GFX6-NEXT:    v_cndmask_b32_e32 v2, v2, v6, vcc
8194 ; GFX6-NEXT:    v_cndmask_b32_e32 v3, v3, v7, vcc
8195 ; GFX6-NEXT:    v_cmp_lt_u32_e32 vcc, s4, v8
8196 ; GFX6-NEXT:    v_cndmask_b32_e64 v5, 0, -1, vcc
8197 ; GFX6-NEXT:    v_cmp_eq_u32_e32 vcc, 0, v4
8198 ; GFX6-NEXT:    v_cndmask_b32_e32 v4, -1, v5, vcc
8199 ; GFX6-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v4
8200 ; GFX6-NEXT:    v_cndmask_b32_e32 v0, v0, v2, vcc
8201 ; GFX6-NEXT:    v_cndmask_b32_e32 v1, v1, v3, vcc
8202 ; GFX6-NEXT:    v_xor_b32_e32 v0, s8, v0
8203 ; GFX6-NEXT:    v_xor_b32_e32 v1, s8, v1
8204 ; GFX6-NEXT:    v_mov_b32_e32 v2, s8
8205 ; GFX6-NEXT:    v_subrev_i32_e32 v0, vcc, s8, v0
8206 ; GFX6-NEXT:    s_mov_b32 s2, -1
8207 ; GFX6-NEXT:    s_mov_b32 s1, s5
8208 ; GFX6-NEXT:    v_subb_u32_e32 v1, vcc, v1, v2, vcc
8209 ; GFX6-NEXT:    buffer_store_dwordx2 v[0:1], off, s[0:3], 0
8210 ; GFX6-NEXT:    s_endpgm
8212 ; GFX9-LABEL: sdiv_i64_oddk_denom:
8213 ; GFX9:       ; %bb.0:
8214 ; GFX9-NEXT:    s_mov_b32 s4, 0x33fe64
8215 ; GFX9-NEXT:    s_add_u32 s4, 0x396, s4
8216 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0x28100000
8217 ; GFX9-NEXT:    s_addc_u32 s5, 0, 0
8218 ; GFX9-NEXT:    v_add_co_u32_e32 v0, vcc, s4, v0
8219 ; GFX9-NEXT:    s_cmp_lg_u64 vcc, 0
8220 ; GFX9-NEXT:    s_addc_u32 s4, s5, 0xd95
8221 ; GFX9-NEXT:    v_readfirstlane_b32 s6, v0
8222 ; GFX9-NEXT:    s_mul_i32 s5, s4, 0xffed2705
8223 ; GFX9-NEXT:    s_mul_hi_u32 s7, s6, 0xffed2705
8224 ; GFX9-NEXT:    s_add_i32 s7, s7, s5
8225 ; GFX9-NEXT:    s_sub_i32 s5, s7, s6
8226 ; GFX9-NEXT:    s_mul_i32 s8, s6, 0xffed2705
8227 ; GFX9-NEXT:    s_mul_hi_u32 s11, s6, s5
8228 ; GFX9-NEXT:    s_mul_i32 s12, s6, s5
8229 ; GFX9-NEXT:    s_mul_hi_u32 s6, s6, s8
8230 ; GFX9-NEXT:    s_add_u32 s6, s6, s12
8231 ; GFX9-NEXT:    s_mul_hi_u32 s9, s4, s8
8232 ; GFX9-NEXT:    s_mul_i32 s10, s4, s8
8233 ; GFX9-NEXT:    s_addc_u32 s8, 0, s11
8234 ; GFX9-NEXT:    s_add_u32 s6, s6, s10
8235 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
8236 ; GFX9-NEXT:    s_mul_hi_u32 s7, s4, s5
8237 ; GFX9-NEXT:    s_addc_u32 s6, s8, s9
8238 ; GFX9-NEXT:    s_addc_u32 s7, s7, 0
8239 ; GFX9-NEXT:    s_mul_i32 s5, s4, s5
8240 ; GFX9-NEXT:    s_add_u32 s5, s6, s5
8241 ; GFX9-NEXT:    s_addc_u32 s6, 0, s7
8242 ; GFX9-NEXT:    v_add_co_u32_e32 v0, vcc, s5, v0
8243 ; GFX9-NEXT:    s_cmp_lg_u64 vcc, 0
8244 ; GFX9-NEXT:    s_addc_u32 s6, s4, s6
8245 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
8246 ; GFX9-NEXT:    s_ashr_i32 s4, s3, 31
8247 ; GFX9-NEXT:    s_add_u32 s2, s2, s4
8248 ; GFX9-NEXT:    s_mov_b32 s5, s4
8249 ; GFX9-NEXT:    s_addc_u32 s3, s3, s4
8250 ; GFX9-NEXT:    s_xor_b64 s[2:3], s[2:3], s[4:5]
8251 ; GFX9-NEXT:    v_readfirstlane_b32 s9, v0
8252 ; GFX9-NEXT:    s_mul_i32 s8, s2, s6
8253 ; GFX9-NEXT:    s_mul_hi_u32 s10, s2, s9
8254 ; GFX9-NEXT:    s_mul_hi_u32 s7, s2, s6
8255 ; GFX9-NEXT:    s_add_u32 s8, s10, s8
8256 ; GFX9-NEXT:    s_addc_u32 s7, 0, s7
8257 ; GFX9-NEXT:    s_mul_hi_u32 s11, s3, s9
8258 ; GFX9-NEXT:    s_mul_i32 s9, s3, s9
8259 ; GFX9-NEXT:    s_add_u32 s8, s8, s9
8260 ; GFX9-NEXT:    s_mul_hi_u32 s10, s3, s6
8261 ; GFX9-NEXT:    s_addc_u32 s7, s7, s11
8262 ; GFX9-NEXT:    s_addc_u32 s8, s10, 0
8263 ; GFX9-NEXT:    s_mul_i32 s6, s3, s6
8264 ; GFX9-NEXT:    s_add_u32 s6, s7, s6
8265 ; GFX9-NEXT:    s_addc_u32 s7, 0, s8
8266 ; GFX9-NEXT:    s_add_u32 s8, s6, 1
8267 ; GFX9-NEXT:    s_addc_u32 s9, s7, 0
8268 ; GFX9-NEXT:    s_add_u32 s10, s6, 2
8269 ; GFX9-NEXT:    s_mul_i32 s13, s7, 0x12d8fb
8270 ; GFX9-NEXT:    s_mul_hi_u32 s14, s6, 0x12d8fb
8271 ; GFX9-NEXT:    s_addc_u32 s11, s7, 0
8272 ; GFX9-NEXT:    s_add_i32 s14, s14, s13
8273 ; GFX9-NEXT:    s_mul_i32 s13, s6, 0x12d8fb
8274 ; GFX9-NEXT:    v_mov_b32_e32 v0, s13
8275 ; GFX9-NEXT:    v_sub_co_u32_e32 v0, vcc, s2, v0
8276 ; GFX9-NEXT:    s_mov_b32 s12, 0x12d8fb
8277 ; GFX9-NEXT:    s_cmp_lg_u64 vcc, 0
8278 ; GFX9-NEXT:    s_subb_u32 s2, s3, s14
8279 ; GFX9-NEXT:    v_subrev_co_u32_e32 v1, vcc, s12, v0
8280 ; GFX9-NEXT:    s_cmp_lg_u64 vcc, 0
8281 ; GFX9-NEXT:    s_subb_u32 s3, s2, 0
8282 ; GFX9-NEXT:    v_readfirstlane_b32 s12, v1
8283 ; GFX9-NEXT:    s_cmp_gt_u32 s12, 0x12d8fa
8284 ; GFX9-NEXT:    s_cselect_b32 s12, -1, 0
8285 ; GFX9-NEXT:    s_cmp_eq_u32 s3, 0
8286 ; GFX9-NEXT:    s_cselect_b32 s3, s12, -1
8287 ; GFX9-NEXT:    s_cmp_lg_u32 s3, 0
8288 ; GFX9-NEXT:    s_cselect_b32 s3, s11, s9
8289 ; GFX9-NEXT:    v_readfirstlane_b32 s9, v0
8290 ; GFX9-NEXT:    s_cselect_b32 s8, s10, s8
8291 ; GFX9-NEXT:    s_cmp_gt_u32 s9, 0x12d8fa
8292 ; GFX9-NEXT:    s_cselect_b32 s9, -1, 0
8293 ; GFX9-NEXT:    s_cmp_eq_u32 s2, 0
8294 ; GFX9-NEXT:    s_cselect_b32 s2, s9, -1
8295 ; GFX9-NEXT:    s_cmp_lg_u32 s2, 0
8296 ; GFX9-NEXT:    s_cselect_b32 s3, s3, s7
8297 ; GFX9-NEXT:    s_cselect_b32 s2, s8, s6
8298 ; GFX9-NEXT:    s_xor_b64 s[2:3], s[2:3], s[4:5]
8299 ; GFX9-NEXT:    s_sub_u32 s2, s2, s4
8300 ; GFX9-NEXT:    s_subb_u32 s3, s3, s4
8301 ; GFX9-NEXT:    v_mov_b32_e32 v0, s2
8302 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0
8303 ; GFX9-NEXT:    v_mov_b32_e32 v1, s3
8304 ; GFX9-NEXT:    global_store_dwordx2 v2, v[0:1], s[0:1]
8305 ; GFX9-NEXT:    s_endpgm
8306   %r = sdiv i64 %x, 1235195
8307   store i64 %r, ptr addrspace(1) %out
8308   ret void
8311 define amdgpu_kernel void @sdiv_i64_pow2k_denom(ptr addrspace(1) %out, i64 %x) {
8312 ; CHECK-LABEL: @sdiv_i64_pow2k_denom(
8313 ; CHECK-NEXT:    [[R:%.*]] = sdiv i64 [[X:%.*]], 4096
8314 ; CHECK-NEXT:    store i64 [[R]], ptr addrspace(1) [[OUT:%.*]], align 8
8315 ; CHECK-NEXT:    ret void
8317 ; GFX6-LABEL: sdiv_i64_pow2k_denom:
8318 ; GFX6:       ; %bb.0:
8319 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
8320 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
8321 ; GFX6-NEXT:    s_mov_b32 s6, -1
8322 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
8323 ; GFX6-NEXT:    s_mov_b32 s4, s0
8324 ; GFX6-NEXT:    s_ashr_i32 s0, s3, 31
8325 ; GFX6-NEXT:    s_lshr_b32 s0, s0, 20
8326 ; GFX6-NEXT:    s_add_u32 s0, s2, s0
8327 ; GFX6-NEXT:    s_mov_b32 s5, s1
8328 ; GFX6-NEXT:    s_addc_u32 s1, s3, 0
8329 ; GFX6-NEXT:    s_ashr_i64 s[0:1], s[0:1], 12
8330 ; GFX6-NEXT:    v_mov_b32_e32 v0, s0
8331 ; GFX6-NEXT:    v_mov_b32_e32 v1, s1
8332 ; GFX6-NEXT:    buffer_store_dwordx2 v[0:1], off, s[4:7], 0
8333 ; GFX6-NEXT:    s_endpgm
8335 ; GFX9-LABEL: sdiv_i64_pow2k_denom:
8336 ; GFX9:       ; %bb.0:
8337 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
8338 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0
8339 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
8340 ; GFX9-NEXT:    s_ashr_i32 s4, s3, 31
8341 ; GFX9-NEXT:    s_lshr_b32 s4, s4, 20
8342 ; GFX9-NEXT:    s_add_u32 s2, s2, s4
8343 ; GFX9-NEXT:    s_addc_u32 s3, s3, 0
8344 ; GFX9-NEXT:    s_ashr_i64 s[2:3], s[2:3], 12
8345 ; GFX9-NEXT:    v_mov_b32_e32 v0, s2
8346 ; GFX9-NEXT:    v_mov_b32_e32 v1, s3
8347 ; GFX9-NEXT:    global_store_dwordx2 v2, v[0:1], s[0:1]
8348 ; GFX9-NEXT:    s_endpgm
8349   %r = sdiv i64 %x, 4096
8350   store i64 %r, ptr addrspace(1) %out
8351   ret void
8354 define amdgpu_kernel void @sdiv_i64_pow2_shl_denom(ptr addrspace(1) %out, i64 %x, i64 %y) {
8355 ; CHECK-LABEL: @sdiv_i64_pow2_shl_denom(
8356 ; CHECK-NEXT:    [[SHL_Y:%.*]] = shl i64 4096, [[Y:%.*]]
8357 ; CHECK-NEXT:    [[R:%.*]] = sdiv i64 [[X:%.*]], [[SHL_Y]]
8358 ; CHECK-NEXT:    store i64 [[R]], ptr addrspace(1) [[OUT:%.*]], align 8
8359 ; CHECK-NEXT:    ret void
8361 ; GFX6-LABEL: sdiv_i64_pow2_shl_denom:
8362 ; GFX6:       ; %bb.0:
8363 ; GFX6-NEXT:    s_load_dword s2, s[0:1], 0xd
8364 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
8365 ; GFX6-NEXT:    s_mov_b32 s6, -1
8366 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
8367 ; GFX6-NEXT:    s_lshl_b64 s[2:3], 0x1000, s2
8368 ; GFX6-NEXT:    s_ashr_i32 s8, s3, 31
8369 ; GFX6-NEXT:    s_add_u32 s2, s2, s8
8370 ; GFX6-NEXT:    s_mov_b32 s9, s8
8371 ; GFX6-NEXT:    s_addc_u32 s3, s3, s8
8372 ; GFX6-NEXT:    s_xor_b64 s[10:11], s[2:3], s[8:9]
8373 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v0, s10
8374 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v1, s11
8375 ; GFX6-NEXT:    s_sub_u32 s4, 0, s10
8376 ; GFX6-NEXT:    s_subb_u32 s5, 0, s11
8377 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
8378 ; GFX6-NEXT:    v_madmk_f32 v0, v1, 0x4f800000, v0
8379 ; GFX6-NEXT:    v_rcp_f32_e32 v0, v0
8380 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
8381 ; GFX6-NEXT:    s_ashr_i32 s12, s3, 31
8382 ; GFX6-NEXT:    v_mul_f32_e32 v0, 0x5f7ffffc, v0
8383 ; GFX6-NEXT:    v_mul_f32_e32 v1, 0x2f800000, v0
8384 ; GFX6-NEXT:    v_trunc_f32_e32 v1, v1
8385 ; GFX6-NEXT:    v_madmk_f32 v0, v1, 0xcf800000, v0
8386 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v1, v1
8387 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v0, v0
8388 ; GFX6-NEXT:    s_add_u32 s2, s2, s12
8389 ; GFX6-NEXT:    s_mov_b32 s13, s12
8390 ; GFX6-NEXT:    v_mul_lo_u32 v2, s4, v1
8391 ; GFX6-NEXT:    v_mul_hi_u32 v3, s4, v0
8392 ; GFX6-NEXT:    v_mul_lo_u32 v5, s5, v0
8393 ; GFX6-NEXT:    v_mul_lo_u32 v4, s4, v0
8394 ; GFX6-NEXT:    s_addc_u32 s3, s3, s12
8395 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, v2, v3
8396 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, v2, v5
8397 ; GFX6-NEXT:    v_mul_hi_u32 v3, v0, v4
8398 ; GFX6-NEXT:    v_mul_lo_u32 v5, v0, v2
8399 ; GFX6-NEXT:    v_mul_hi_u32 v7, v0, v2
8400 ; GFX6-NEXT:    v_mul_lo_u32 v6, v1, v4
8401 ; GFX6-NEXT:    v_mul_hi_u32 v4, v1, v4
8402 ; GFX6-NEXT:    v_mul_hi_u32 v8, v1, v2
8403 ; GFX6-NEXT:    v_add_i32_e32 v3, vcc, v3, v5
8404 ; GFX6-NEXT:    v_addc_u32_e32 v5, vcc, 0, v7, vcc
8405 ; GFX6-NEXT:    v_mul_lo_u32 v2, v1, v2
8406 ; GFX6-NEXT:    v_add_i32_e32 v3, vcc, v3, v6
8407 ; GFX6-NEXT:    v_addc_u32_e32 v3, vcc, v5, v4, vcc
8408 ; GFX6-NEXT:    v_addc_u32_e32 v4, vcc, 0, v8, vcc
8409 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, v3, v2
8410 ; GFX6-NEXT:    v_addc_u32_e32 v3, vcc, 0, v4, vcc
8411 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, v0, v2
8412 ; GFX6-NEXT:    v_addc_u32_e32 v1, vcc, v1, v3, vcc
8413 ; GFX6-NEXT:    v_mul_lo_u32 v2, s4, v1
8414 ; GFX6-NEXT:    v_mul_hi_u32 v3, s4, v0
8415 ; GFX6-NEXT:    v_mul_lo_u32 v4, s5, v0
8416 ; GFX6-NEXT:    s_xor_b64 s[2:3], s[2:3], s[12:13]
8417 ; GFX6-NEXT:    s_mov_b32 s5, s1
8418 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, v2, v3
8419 ; GFX6-NEXT:    v_mul_lo_u32 v3, s4, v0
8420 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, v2, v4
8421 ; GFX6-NEXT:    v_mul_lo_u32 v6, v0, v2
8422 ; GFX6-NEXT:    v_mul_hi_u32 v7, v0, v3
8423 ; GFX6-NEXT:    v_mul_hi_u32 v8, v0, v2
8424 ; GFX6-NEXT:    v_mul_hi_u32 v5, v1, v3
8425 ; GFX6-NEXT:    v_mul_lo_u32 v3, v1, v3
8426 ; GFX6-NEXT:    v_mul_hi_u32 v4, v1, v2
8427 ; GFX6-NEXT:    v_add_i32_e32 v6, vcc, v7, v6
8428 ; GFX6-NEXT:    v_addc_u32_e32 v7, vcc, 0, v8, vcc
8429 ; GFX6-NEXT:    v_mul_lo_u32 v2, v1, v2
8430 ; GFX6-NEXT:    v_add_i32_e32 v3, vcc, v6, v3
8431 ; GFX6-NEXT:    v_addc_u32_e32 v3, vcc, v7, v5, vcc
8432 ; GFX6-NEXT:    v_addc_u32_e32 v4, vcc, 0, v4, vcc
8433 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, v3, v2
8434 ; GFX6-NEXT:    v_addc_u32_e32 v3, vcc, 0, v4, vcc
8435 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, v0, v2
8436 ; GFX6-NEXT:    v_addc_u32_e32 v1, vcc, v1, v3, vcc
8437 ; GFX6-NEXT:    v_mul_lo_u32 v2, s2, v1
8438 ; GFX6-NEXT:    v_mul_hi_u32 v3, s2, v0
8439 ; GFX6-NEXT:    v_mul_hi_u32 v4, s2, v1
8440 ; GFX6-NEXT:    v_mul_hi_u32 v5, s3, v1
8441 ; GFX6-NEXT:    v_mul_lo_u32 v1, s3, v1
8442 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, v3, v2
8443 ; GFX6-NEXT:    v_addc_u32_e32 v3, vcc, 0, v4, vcc
8444 ; GFX6-NEXT:    v_mul_lo_u32 v4, s3, v0
8445 ; GFX6-NEXT:    v_mul_hi_u32 v0, s3, v0
8446 ; GFX6-NEXT:    s_mov_b32 s4, s0
8447 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, v2, v4
8448 ; GFX6-NEXT:    v_addc_u32_e32 v0, vcc, v3, v0, vcc
8449 ; GFX6-NEXT:    v_addc_u32_e32 v2, vcc, 0, v5, vcc
8450 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, v0, v1
8451 ; GFX6-NEXT:    v_addc_u32_e32 v1, vcc, 0, v2, vcc
8452 ; GFX6-NEXT:    v_mul_lo_u32 v2, s10, v1
8453 ; GFX6-NEXT:    v_mul_hi_u32 v3, s10, v0
8454 ; GFX6-NEXT:    v_mul_lo_u32 v4, s11, v0
8455 ; GFX6-NEXT:    v_mov_b32_e32 v5, s11
8456 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, v2, v3
8457 ; GFX6-NEXT:    v_mul_lo_u32 v3, s10, v0
8458 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, v4, v2
8459 ; GFX6-NEXT:    v_sub_i32_e32 v4, vcc, s3, v2
8460 ; GFX6-NEXT:    v_sub_i32_e32 v3, vcc, s2, v3
8461 ; GFX6-NEXT:    v_subb_u32_e64 v4, s[0:1], v4, v5, vcc
8462 ; GFX6-NEXT:    v_subrev_i32_e64 v5, s[0:1], s10, v3
8463 ; GFX6-NEXT:    v_subbrev_u32_e64 v4, s[0:1], 0, v4, s[0:1]
8464 ; GFX6-NEXT:    v_cmp_le_u32_e64 s[0:1], s11, v4
8465 ; GFX6-NEXT:    v_cndmask_b32_e64 v6, 0, -1, s[0:1]
8466 ; GFX6-NEXT:    v_cmp_le_u32_e64 s[0:1], s10, v5
8467 ; GFX6-NEXT:    v_cndmask_b32_e64 v5, 0, -1, s[0:1]
8468 ; GFX6-NEXT:    v_cmp_eq_u32_e64 s[0:1], s11, v4
8469 ; GFX6-NEXT:    v_cndmask_b32_e64 v4, v6, v5, s[0:1]
8470 ; GFX6-NEXT:    v_add_i32_e64 v5, s[0:1], 1, v0
8471 ; GFX6-NEXT:    v_addc_u32_e64 v6, s[0:1], 0, v1, s[0:1]
8472 ; GFX6-NEXT:    v_add_i32_e64 v7, s[0:1], 2, v0
8473 ; GFX6-NEXT:    v_addc_u32_e64 v8, s[0:1], 0, v1, s[0:1]
8474 ; GFX6-NEXT:    v_cmp_ne_u32_e64 s[0:1], 0, v4
8475 ; GFX6-NEXT:    v_cndmask_b32_e64 v4, v5, v7, s[0:1]
8476 ; GFX6-NEXT:    v_cndmask_b32_e64 v5, v6, v8, s[0:1]
8477 ; GFX6-NEXT:    v_mov_b32_e32 v6, s3
8478 ; GFX6-NEXT:    v_subb_u32_e32 v2, vcc, v6, v2, vcc
8479 ; GFX6-NEXT:    v_cmp_le_u32_e32 vcc, s11, v2
8480 ; GFX6-NEXT:    v_cndmask_b32_e64 v6, 0, -1, vcc
8481 ; GFX6-NEXT:    v_cmp_le_u32_e32 vcc, s10, v3
8482 ; GFX6-NEXT:    v_cndmask_b32_e64 v3, 0, -1, vcc
8483 ; GFX6-NEXT:    v_cmp_eq_u32_e32 vcc, s11, v2
8484 ; GFX6-NEXT:    v_cndmask_b32_e32 v2, v6, v3, vcc
8485 ; GFX6-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v2
8486 ; GFX6-NEXT:    v_cndmask_b32_e32 v0, v0, v4, vcc
8487 ; GFX6-NEXT:    s_xor_b64 s[0:1], s[12:13], s[8:9]
8488 ; GFX6-NEXT:    v_cndmask_b32_e32 v1, v1, v5, vcc
8489 ; GFX6-NEXT:    v_xor_b32_e32 v0, s0, v0
8490 ; GFX6-NEXT:    v_xor_b32_e32 v1, s1, v1
8491 ; GFX6-NEXT:    v_mov_b32_e32 v2, s1
8492 ; GFX6-NEXT:    v_subrev_i32_e32 v0, vcc, s0, v0
8493 ; GFX6-NEXT:    v_subb_u32_e32 v1, vcc, v1, v2, vcc
8494 ; GFX6-NEXT:    buffer_store_dwordx2 v[0:1], off, s[4:7], 0
8495 ; GFX6-NEXT:    s_endpgm
8497 ; GFX9-LABEL: sdiv_i64_pow2_shl_denom:
8498 ; GFX9:       ; %bb.0:
8499 ; GFX9-NEXT:    s_load_dword s2, s[0:1], 0x34
8500 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
8501 ; GFX9-NEXT:    s_lshl_b64 s[4:5], 0x1000, s2
8502 ; GFX9-NEXT:    s_ashr_i32 s2, s5, 31
8503 ; GFX9-NEXT:    s_add_u32 s4, s4, s2
8504 ; GFX9-NEXT:    s_mov_b32 s3, s2
8505 ; GFX9-NEXT:    s_addc_u32 s5, s5, s2
8506 ; GFX9-NEXT:    s_xor_b64 s[8:9], s[4:5], s[2:3]
8507 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v0, s8
8508 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v1, s9
8509 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
8510 ; GFX9-NEXT:    s_sub_u32 s0, 0, s8
8511 ; GFX9-NEXT:    s_subb_u32 s1, 0, s9
8512 ; GFX9-NEXT:    v_madmk_f32 v0, v1, 0x4f800000, v0
8513 ; GFX9-NEXT:    v_rcp_f32_e32 v1, v0
8514 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
8515 ; GFX9-NEXT:    v_mul_f32_e32 v1, 0x5f7ffffc, v1
8516 ; GFX9-NEXT:    v_mul_f32_e32 v2, 0x2f800000, v1
8517 ; GFX9-NEXT:    v_trunc_f32_e32 v2, v2
8518 ; GFX9-NEXT:    v_madmk_f32 v1, v2, 0xcf800000, v1
8519 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v2, v2
8520 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v1, v1
8521 ; GFX9-NEXT:    v_readfirstlane_b32 s10, v2
8522 ; GFX9-NEXT:    v_readfirstlane_b32 s11, v1
8523 ; GFX9-NEXT:    s_mul_i32 s12, s0, s10
8524 ; GFX9-NEXT:    s_mul_hi_u32 s14, s0, s11
8525 ; GFX9-NEXT:    s_mul_i32 s13, s1, s11
8526 ; GFX9-NEXT:    s_add_i32 s12, s14, s12
8527 ; GFX9-NEXT:    s_mul_i32 s15, s0, s11
8528 ; GFX9-NEXT:    s_add_i32 s12, s12, s13
8529 ; GFX9-NEXT:    s_mul_hi_u32 s14, s11, s15
8530 ; GFX9-NEXT:    s_mul_hi_u32 s13, s11, s12
8531 ; GFX9-NEXT:    s_mul_i32 s11, s11, s12
8532 ; GFX9-NEXT:    s_add_u32 s11, s14, s11
8533 ; GFX9-NEXT:    s_addc_u32 s13, 0, s13
8534 ; GFX9-NEXT:    s_mul_hi_u32 s16, s10, s15
8535 ; GFX9-NEXT:    s_mul_i32 s15, s10, s15
8536 ; GFX9-NEXT:    s_add_u32 s11, s11, s15
8537 ; GFX9-NEXT:    s_mul_hi_u32 s14, s10, s12
8538 ; GFX9-NEXT:    s_addc_u32 s11, s13, s16
8539 ; GFX9-NEXT:    s_addc_u32 s13, s14, 0
8540 ; GFX9-NEXT:    s_mul_i32 s12, s10, s12
8541 ; GFX9-NEXT:    s_add_u32 s11, s11, s12
8542 ; GFX9-NEXT:    s_addc_u32 s12, 0, s13
8543 ; GFX9-NEXT:    v_add_co_u32_e32 v1, vcc, s11, v1
8544 ; GFX9-NEXT:    s_cmp_lg_u64 vcc, 0
8545 ; GFX9-NEXT:    s_addc_u32 s10, s10, s12
8546 ; GFX9-NEXT:    v_readfirstlane_b32 s12, v1
8547 ; GFX9-NEXT:    s_mul_i32 s11, s0, s10
8548 ; GFX9-NEXT:    s_mul_hi_u32 s13, s0, s12
8549 ; GFX9-NEXT:    s_add_i32 s11, s13, s11
8550 ; GFX9-NEXT:    s_mul_i32 s1, s1, s12
8551 ; GFX9-NEXT:    s_add_i32 s11, s11, s1
8552 ; GFX9-NEXT:    s_mul_i32 s0, s0, s12
8553 ; GFX9-NEXT:    s_mul_hi_u32 s13, s10, s0
8554 ; GFX9-NEXT:    s_mul_i32 s14, s10, s0
8555 ; GFX9-NEXT:    s_mul_i32 s16, s12, s11
8556 ; GFX9-NEXT:    s_mul_hi_u32 s0, s12, s0
8557 ; GFX9-NEXT:    s_mul_hi_u32 s15, s12, s11
8558 ; GFX9-NEXT:    s_add_u32 s0, s0, s16
8559 ; GFX9-NEXT:    s_addc_u32 s12, 0, s15
8560 ; GFX9-NEXT:    s_add_u32 s0, s0, s14
8561 ; GFX9-NEXT:    s_mul_hi_u32 s1, s10, s11
8562 ; GFX9-NEXT:    s_addc_u32 s0, s12, s13
8563 ; GFX9-NEXT:    s_addc_u32 s1, s1, 0
8564 ; GFX9-NEXT:    s_mul_i32 s11, s10, s11
8565 ; GFX9-NEXT:    s_add_u32 s0, s0, s11
8566 ; GFX9-NEXT:    s_addc_u32 s1, 0, s1
8567 ; GFX9-NEXT:    v_add_co_u32_e32 v1, vcc, s0, v1
8568 ; GFX9-NEXT:    s_cmp_lg_u64 vcc, 0
8569 ; GFX9-NEXT:    s_addc_u32 s12, s10, s1
8570 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
8571 ; GFX9-NEXT:    s_ashr_i32 s10, s7, 31
8572 ; GFX9-NEXT:    s_add_u32 s0, s6, s10
8573 ; GFX9-NEXT:    s_mov_b32 s11, s10
8574 ; GFX9-NEXT:    s_addc_u32 s1, s7, s10
8575 ; GFX9-NEXT:    s_xor_b64 s[6:7], s[0:1], s[10:11]
8576 ; GFX9-NEXT:    v_readfirstlane_b32 s13, v1
8577 ; GFX9-NEXT:    s_mul_i32 s1, s6, s12
8578 ; GFX9-NEXT:    s_mul_hi_u32 s14, s6, s13
8579 ; GFX9-NEXT:    s_mul_hi_u32 s0, s6, s12
8580 ; GFX9-NEXT:    s_add_u32 s1, s14, s1
8581 ; GFX9-NEXT:    s_addc_u32 s0, 0, s0
8582 ; GFX9-NEXT:    s_mul_hi_u32 s15, s7, s13
8583 ; GFX9-NEXT:    s_mul_i32 s13, s7, s13
8584 ; GFX9-NEXT:    s_add_u32 s1, s1, s13
8585 ; GFX9-NEXT:    s_mul_hi_u32 s14, s7, s12
8586 ; GFX9-NEXT:    s_addc_u32 s0, s0, s15
8587 ; GFX9-NEXT:    s_addc_u32 s1, s14, 0
8588 ; GFX9-NEXT:    s_mul_i32 s12, s7, s12
8589 ; GFX9-NEXT:    s_add_u32 s12, s0, s12
8590 ; GFX9-NEXT:    s_addc_u32 s13, 0, s1
8591 ; GFX9-NEXT:    s_mul_i32 s0, s8, s13
8592 ; GFX9-NEXT:    s_mul_hi_u32 s1, s8, s12
8593 ; GFX9-NEXT:    s_add_i32 s0, s1, s0
8594 ; GFX9-NEXT:    s_mul_i32 s1, s9, s12
8595 ; GFX9-NEXT:    s_add_i32 s14, s0, s1
8596 ; GFX9-NEXT:    s_mul_i32 s1, s8, s12
8597 ; GFX9-NEXT:    v_mov_b32_e32 v1, s1
8598 ; GFX9-NEXT:    s_sub_i32 s0, s7, s14
8599 ; GFX9-NEXT:    v_sub_co_u32_e32 v1, vcc, s6, v1
8600 ; GFX9-NEXT:    s_cmp_lg_u64 vcc, 0
8601 ; GFX9-NEXT:    s_subb_u32 s6, s0, s9
8602 ; GFX9-NEXT:    v_subrev_co_u32_e64 v2, s[0:1], s8, v1
8603 ; GFX9-NEXT:    s_cmp_lg_u64 s[0:1], 0
8604 ; GFX9-NEXT:    s_subb_u32 s6, s6, 0
8605 ; GFX9-NEXT:    s_cmp_ge_u32 s6, s9
8606 ; GFX9-NEXT:    s_cselect_b32 s15, -1, 0
8607 ; GFX9-NEXT:    v_cmp_le_u32_e64 s[0:1], s8, v2
8608 ; GFX9-NEXT:    s_cmp_eq_u32 s6, s9
8609 ; GFX9-NEXT:    v_cndmask_b32_e64 v2, 0, -1, s[0:1]
8610 ; GFX9-NEXT:    v_mov_b32_e32 v3, s15
8611 ; GFX9-NEXT:    s_cselect_b64 s[0:1], -1, 0
8612 ; GFX9-NEXT:    v_cndmask_b32_e64 v2, v3, v2, s[0:1]
8613 ; GFX9-NEXT:    s_add_u32 s0, s12, 1
8614 ; GFX9-NEXT:    s_addc_u32 s6, s13, 0
8615 ; GFX9-NEXT:    s_add_u32 s1, s12, 2
8616 ; GFX9-NEXT:    s_addc_u32 s15, s13, 0
8617 ; GFX9-NEXT:    v_mov_b32_e32 v3, s0
8618 ; GFX9-NEXT:    v_mov_b32_e32 v4, s1
8619 ; GFX9-NEXT:    v_cmp_ne_u32_e64 s[0:1], 0, v2
8620 ; GFX9-NEXT:    v_cndmask_b32_e64 v2, v3, v4, s[0:1]
8621 ; GFX9-NEXT:    v_mov_b32_e32 v3, s6
8622 ; GFX9-NEXT:    v_mov_b32_e32 v4, s15
8623 ; GFX9-NEXT:    s_cmp_lg_u64 vcc, 0
8624 ; GFX9-NEXT:    v_cndmask_b32_e64 v3, v3, v4, s[0:1]
8625 ; GFX9-NEXT:    s_subb_u32 s0, s7, s14
8626 ; GFX9-NEXT:    s_cmp_ge_u32 s0, s9
8627 ; GFX9-NEXT:    s_cselect_b32 s1, -1, 0
8628 ; GFX9-NEXT:    v_cmp_le_u32_e32 vcc, s8, v1
8629 ; GFX9-NEXT:    s_cmp_eq_u32 s0, s9
8630 ; GFX9-NEXT:    v_cndmask_b32_e64 v1, 0, -1, vcc
8631 ; GFX9-NEXT:    v_mov_b32_e32 v4, s1
8632 ; GFX9-NEXT:    s_cselect_b64 vcc, -1, 0
8633 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, v4, v1, vcc
8634 ; GFX9-NEXT:    v_mov_b32_e32 v4, s13
8635 ; GFX9-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v1
8636 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, v4, v3, vcc
8637 ; GFX9-NEXT:    v_mov_b32_e32 v3, s12
8638 ; GFX9-NEXT:    v_cndmask_b32_e32 v2, v3, v2, vcc
8639 ; GFX9-NEXT:    s_xor_b64 s[0:1], s[10:11], s[2:3]
8640 ; GFX9-NEXT:    v_xor_b32_e32 v2, s0, v2
8641 ; GFX9-NEXT:    v_xor_b32_e32 v3, s1, v1
8642 ; GFX9-NEXT:    v_mov_b32_e32 v4, s1
8643 ; GFX9-NEXT:    v_subrev_co_u32_e32 v1, vcc, s0, v2
8644 ; GFX9-NEXT:    v_subb_co_u32_e32 v2, vcc, v3, v4, vcc
8645 ; GFX9-NEXT:    global_store_dwordx2 v0, v[1:2], s[4:5]
8646 ; GFX9-NEXT:    s_endpgm
8647   %shl.y = shl i64 4096, %y
8648   %r = sdiv i64 %x, %shl.y
8649   store i64 %r, ptr addrspace(1) %out
8650   ret void
8653 define amdgpu_kernel void @sdiv_v2i64_pow2k_denom(ptr addrspace(1) %out, <2 x i64> %x) {
8654 ; CHECK-LABEL: @sdiv_v2i64_pow2k_denom(
8655 ; CHECK-NEXT:    [[TMP1:%.*]] = extractelement <2 x i64> [[X:%.*]], i64 0
8656 ; CHECK-NEXT:    [[TMP2:%.*]] = sdiv i64 [[TMP1]], 4096
8657 ; CHECK-NEXT:    [[TMP3:%.*]] = insertelement <2 x i64> poison, i64 [[TMP2]], i64 0
8658 ; CHECK-NEXT:    [[TMP4:%.*]] = extractelement <2 x i64> [[X]], i64 1
8659 ; CHECK-NEXT:    [[TMP5:%.*]] = sdiv i64 [[TMP4]], 4096
8660 ; CHECK-NEXT:    [[TMP6:%.*]] = insertelement <2 x i64> [[TMP3]], i64 [[TMP5]], i64 1
8661 ; CHECK-NEXT:    store <2 x i64> [[TMP6]], ptr addrspace(1) [[OUT:%.*]], align 16
8662 ; CHECK-NEXT:    ret void
8664 ; GFX6-LABEL: sdiv_v2i64_pow2k_denom:
8665 ; GFX6:       ; %bb.0:
8666 ; GFX6-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0xd
8667 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
8668 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
8669 ; GFX6-NEXT:    s_mov_b32 s2, -1
8670 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
8671 ; GFX6-NEXT:    s_ashr_i32 s8, s5, 31
8672 ; GFX6-NEXT:    s_lshr_b32 s8, s8, 20
8673 ; GFX6-NEXT:    s_add_u32 s4, s4, s8
8674 ; GFX6-NEXT:    s_addc_u32 s5, s5, 0
8675 ; GFX6-NEXT:    s_ashr_i32 s8, s7, 31
8676 ; GFX6-NEXT:    s_ashr_i64 s[4:5], s[4:5], 12
8677 ; GFX6-NEXT:    s_lshr_b32 s8, s8, 20
8678 ; GFX6-NEXT:    s_add_u32 s6, s6, s8
8679 ; GFX6-NEXT:    s_addc_u32 s7, s7, 0
8680 ; GFX6-NEXT:    s_ashr_i64 s[6:7], s[6:7], 12
8681 ; GFX6-NEXT:    v_mov_b32_e32 v0, s4
8682 ; GFX6-NEXT:    v_mov_b32_e32 v1, s5
8683 ; GFX6-NEXT:    v_mov_b32_e32 v2, s6
8684 ; GFX6-NEXT:    v_mov_b32_e32 v3, s7
8685 ; GFX6-NEXT:    buffer_store_dwordx4 v[0:3], off, s[0:3], 0
8686 ; GFX6-NEXT:    s_endpgm
8688 ; GFX9-LABEL: sdiv_v2i64_pow2k_denom:
8689 ; GFX9:       ; %bb.0:
8690 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x34
8691 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
8692 ; GFX9-NEXT:    v_mov_b32_e32 v4, 0
8693 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
8694 ; GFX9-NEXT:    s_ashr_i32 s0, s5, 31
8695 ; GFX9-NEXT:    s_lshr_b32 s0, s0, 20
8696 ; GFX9-NEXT:    s_add_u32 s0, s4, s0
8697 ; GFX9-NEXT:    s_addc_u32 s1, s5, 0
8698 ; GFX9-NEXT:    s_ashr_i32 s4, s7, 31
8699 ; GFX9-NEXT:    s_ashr_i64 s[0:1], s[0:1], 12
8700 ; GFX9-NEXT:    s_lshr_b32 s4, s4, 20
8701 ; GFX9-NEXT:    s_add_u32 s4, s6, s4
8702 ; GFX9-NEXT:    s_addc_u32 s5, s7, 0
8703 ; GFX9-NEXT:    s_ashr_i64 s[4:5], s[4:5], 12
8704 ; GFX9-NEXT:    v_mov_b32_e32 v0, s0
8705 ; GFX9-NEXT:    v_mov_b32_e32 v1, s1
8706 ; GFX9-NEXT:    v_mov_b32_e32 v2, s4
8707 ; GFX9-NEXT:    v_mov_b32_e32 v3, s5
8708 ; GFX9-NEXT:    global_store_dwordx4 v4, v[0:3], s[2:3]
8709 ; GFX9-NEXT:    s_endpgm
8710   %r = sdiv <2 x i64> %x, <i64 4096, i64 4096>
8711   store <2 x i64> %r, ptr addrspace(1) %out
8712   ret void
8715 define amdgpu_kernel void @ssdiv_v2i64_mixed_pow2k_denom(ptr addrspace(1) %out, <2 x i64> %x) {
8716 ; CHECK-LABEL: @ssdiv_v2i64_mixed_pow2k_denom(
8717 ; CHECK-NEXT:    [[TMP1:%.*]] = extractelement <2 x i64> [[X:%.*]], i64 0
8718 ; CHECK-NEXT:    [[TMP2:%.*]] = sdiv i64 [[TMP1]], 4096
8719 ; CHECK-NEXT:    [[TMP3:%.*]] = insertelement <2 x i64> poison, i64 [[TMP2]], i64 0
8720 ; CHECK-NEXT:    [[TMP4:%.*]] = extractelement <2 x i64> [[X]], i64 1
8721 ; CHECK-NEXT:    [[TMP5:%.*]] = sdiv i64 [[TMP4]], 4095
8722 ; CHECK-NEXT:    [[TMP6:%.*]] = insertelement <2 x i64> [[TMP3]], i64 [[TMP5]], i64 1
8723 ; CHECK-NEXT:    store <2 x i64> [[TMP6]], ptr addrspace(1) [[OUT:%.*]], align 16
8724 ; CHECK-NEXT:    ret void
8726 ; GFX6-LABEL: ssdiv_v2i64_mixed_pow2k_denom:
8727 ; GFX6:       ; %bb.0:
8728 ; GFX6-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0xd
8729 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
8730 ; GFX6-NEXT:    s_mov_b32 s2, 0x2ff2fc01
8731 ; GFX6-NEXT:    v_bfrev_b32_e32 v0, 7
8732 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
8733 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
8734 ; GFX6-NEXT:    s_ashr_i32 s8, s5, 31
8735 ; GFX6-NEXT:    s_lshr_b32 s8, s8, 20
8736 ; GFX6-NEXT:    s_add_u32 s4, s4, s8
8737 ; GFX6-NEXT:    s_addc_u32 s5, s5, 0
8738 ; GFX6-NEXT:    s_ashr_i64 s[4:5], s[4:5], 12
8739 ; GFX6-NEXT:    s_add_u32 s2, 0xe037f, s2
8740 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, s2, v0
8741 ; GFX6-NEXT:    s_addc_u32 s8, 0, 0
8742 ; GFX6-NEXT:    s_or_b32 s2, vcc_lo, vcc_hi
8743 ; GFX6-NEXT:    s_cmp_lg_u32 s2, 0
8744 ; GFX6-NEXT:    s_movk_i32 s2, 0xf001
8745 ; GFX6-NEXT:    v_mul_hi_u32 v1, v0, s2
8746 ; GFX6-NEXT:    s_addc_u32 s8, s8, 0x1000ff
8747 ; GFX6-NEXT:    v_mul_lo_u32 v2, v0, s2
8748 ; GFX6-NEXT:    s_mul_i32 s9, s8, 0xfffff001
8749 ; GFX6-NEXT:    v_add_i32_e32 v1, vcc, s9, v1
8750 ; GFX6-NEXT:    v_sub_i32_e32 v1, vcc, v1, v0
8751 ; GFX6-NEXT:    v_mul_lo_u32 v5, v0, v1
8752 ; GFX6-NEXT:    v_mul_hi_u32 v6, v0, v2
8753 ; GFX6-NEXT:    v_mul_hi_u32 v7, v0, v1
8754 ; GFX6-NEXT:    v_mul_hi_u32 v4, s8, v2
8755 ; GFX6-NEXT:    v_mul_lo_u32 v2, s8, v2
8756 ; GFX6-NEXT:    v_mul_hi_u32 v3, s8, v1
8757 ; GFX6-NEXT:    v_add_i32_e32 v5, vcc, v6, v5
8758 ; GFX6-NEXT:    v_addc_u32_e32 v6, vcc, 0, v7, vcc
8759 ; GFX6-NEXT:    v_mul_lo_u32 v1, s8, v1
8760 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, v5, v2
8761 ; GFX6-NEXT:    v_addc_u32_e32 v2, vcc, v6, v4, vcc
8762 ; GFX6-NEXT:    v_addc_u32_e32 v3, vcc, 0, v3, vcc
8763 ; GFX6-NEXT:    v_add_i32_e32 v1, vcc, v2, v1
8764 ; GFX6-NEXT:    v_addc_u32_e32 v2, vcc, 0, v3, vcc
8765 ; GFX6-NEXT:    v_mov_b32_e32 v3, s8
8766 ; GFX6-NEXT:    s_ashr_i32 s8, s7, 31
8767 ; GFX6-NEXT:    s_add_u32 s6, s6, s8
8768 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, v0, v1
8769 ; GFX6-NEXT:    s_mov_b32 s9, s8
8770 ; GFX6-NEXT:    s_addc_u32 s7, s7, s8
8771 ; GFX6-NEXT:    v_addc_u32_e32 v1, vcc, v3, v2, vcc
8772 ; GFX6-NEXT:    s_xor_b64 s[6:7], s[6:7], s[8:9]
8773 ; GFX6-NEXT:    v_mul_lo_u32 v2, s6, v1
8774 ; GFX6-NEXT:    v_mul_hi_u32 v3, s6, v0
8775 ; GFX6-NEXT:    v_mul_hi_u32 v4, s6, v1
8776 ; GFX6-NEXT:    v_mul_hi_u32 v5, s7, v1
8777 ; GFX6-NEXT:    v_mul_lo_u32 v1, s7, v1
8778 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, v3, v2
8779 ; GFX6-NEXT:    v_addc_u32_e32 v3, vcc, 0, v4, vcc
8780 ; GFX6-NEXT:    v_mul_lo_u32 v4, s7, v0
8781 ; GFX6-NEXT:    v_mul_hi_u32 v0, s7, v0
8782 ; GFX6-NEXT:    s_movk_i32 s9, 0xfff
8783 ; GFX6-NEXT:    s_mov_b32 s2, -1
8784 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, v2, v4
8785 ; GFX6-NEXT:    v_addc_u32_e32 v0, vcc, v3, v0, vcc
8786 ; GFX6-NEXT:    v_addc_u32_e32 v2, vcc, 0, v5, vcc
8787 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, v0, v1
8788 ; GFX6-NEXT:    v_addc_u32_e32 v1, vcc, 0, v2, vcc
8789 ; GFX6-NEXT:    v_mul_lo_u32 v4, v1, s9
8790 ; GFX6-NEXT:    v_mul_hi_u32 v5, v0, s9
8791 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, 1, v0
8792 ; GFX6-NEXT:    v_mul_lo_u32 v8, v0, s9
8793 ; GFX6-NEXT:    v_addc_u32_e32 v3, vcc, 0, v1, vcc
8794 ; GFX6-NEXT:    v_add_i32_e32 v6, vcc, 2, v0
8795 ; GFX6-NEXT:    v_addc_u32_e32 v7, vcc, 0, v1, vcc
8796 ; GFX6-NEXT:    v_add_i32_e32 v4, vcc, v4, v5
8797 ; GFX6-NEXT:    v_mov_b32_e32 v5, s7
8798 ; GFX6-NEXT:    v_sub_i32_e32 v8, vcc, s6, v8
8799 ; GFX6-NEXT:    v_subb_u32_e32 v4, vcc, v5, v4, vcc
8800 ; GFX6-NEXT:    v_subrev_i32_e32 v5, vcc, s9, v8
8801 ; GFX6-NEXT:    v_subbrev_u32_e32 v9, vcc, 0, v4, vcc
8802 ; GFX6-NEXT:    s_movk_i32 s6, 0xffe
8803 ; GFX6-NEXT:    v_cmp_lt_u32_e32 vcc, s6, v5
8804 ; GFX6-NEXT:    v_cndmask_b32_e64 v5, 0, -1, vcc
8805 ; GFX6-NEXT:    v_cmp_eq_u32_e32 vcc, 0, v9
8806 ; GFX6-NEXT:    v_cndmask_b32_e32 v5, -1, v5, vcc
8807 ; GFX6-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v5
8808 ; GFX6-NEXT:    v_cndmask_b32_e32 v2, v2, v6, vcc
8809 ; GFX6-NEXT:    v_cndmask_b32_e32 v3, v3, v7, vcc
8810 ; GFX6-NEXT:    v_cmp_lt_u32_e32 vcc, s6, v8
8811 ; GFX6-NEXT:    v_cndmask_b32_e64 v5, 0, -1, vcc
8812 ; GFX6-NEXT:    v_cmp_eq_u32_e32 vcc, 0, v4
8813 ; GFX6-NEXT:    v_cndmask_b32_e32 v4, -1, v5, vcc
8814 ; GFX6-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v4
8815 ; GFX6-NEXT:    v_cndmask_b32_e32 v0, v0, v2, vcc
8816 ; GFX6-NEXT:    v_cndmask_b32_e32 v1, v1, v3, vcc
8817 ; GFX6-NEXT:    v_xor_b32_e32 v0, s8, v0
8818 ; GFX6-NEXT:    v_xor_b32_e32 v1, s8, v1
8819 ; GFX6-NEXT:    v_mov_b32_e32 v3, s8
8820 ; GFX6-NEXT:    v_subrev_i32_e32 v2, vcc, s8, v0
8821 ; GFX6-NEXT:    v_subb_u32_e32 v3, vcc, v1, v3, vcc
8822 ; GFX6-NEXT:    v_mov_b32_e32 v0, s4
8823 ; GFX6-NEXT:    v_mov_b32_e32 v1, s5
8824 ; GFX6-NEXT:    buffer_store_dwordx4 v[0:3], off, s[0:3], 0
8825 ; GFX6-NEXT:    s_endpgm
8827 ; GFX9-LABEL: ssdiv_v2i64_mixed_pow2k_denom:
8828 ; GFX9:       ; %bb.0:
8829 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x34
8830 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
8831 ; GFX9-NEXT:    s_mov_b32 s8, 0x2ff2fc01
8832 ; GFX9-NEXT:    v_bfrev_b32_e32 v0, 7
8833 ; GFX9-NEXT:    v_mov_b32_e32 v4, 0
8834 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
8835 ; GFX9-NEXT:    s_ashr_i32 s0, s5, 31
8836 ; GFX9-NEXT:    s_lshr_b32 s0, s0, 20
8837 ; GFX9-NEXT:    s_add_u32 s0, s4, s0
8838 ; GFX9-NEXT:    s_addc_u32 s1, s5, 0
8839 ; GFX9-NEXT:    s_ashr_i64 s[0:1], s[0:1], 12
8840 ; GFX9-NEXT:    s_add_u32 s4, 0xe037f, s8
8841 ; GFX9-NEXT:    s_addc_u32 s5, 0, 0
8842 ; GFX9-NEXT:    v_add_co_u32_e32 v0, vcc, s4, v0
8843 ; GFX9-NEXT:    s_cmp_lg_u64 vcc, 0
8844 ; GFX9-NEXT:    s_addc_u32 s4, s5, 0x1000ff
8845 ; GFX9-NEXT:    v_readfirstlane_b32 s8, v0
8846 ; GFX9-NEXT:    s_mul_i32 s5, s4, 0xfffff001
8847 ; GFX9-NEXT:    s_mul_hi_u32 s9, s8, 0xfffff001
8848 ; GFX9-NEXT:    s_add_i32 s9, s9, s5
8849 ; GFX9-NEXT:    s_sub_i32 s5, s9, s8
8850 ; GFX9-NEXT:    s_mul_i32 s10, s8, 0xfffff001
8851 ; GFX9-NEXT:    s_mul_hi_u32 s13, s8, s5
8852 ; GFX9-NEXT:    s_mul_i32 s14, s8, s5
8853 ; GFX9-NEXT:    s_mul_hi_u32 s8, s8, s10
8854 ; GFX9-NEXT:    s_add_u32 s8, s8, s14
8855 ; GFX9-NEXT:    s_mul_hi_u32 s11, s4, s10
8856 ; GFX9-NEXT:    s_mul_i32 s12, s4, s10
8857 ; GFX9-NEXT:    s_addc_u32 s10, 0, s13
8858 ; GFX9-NEXT:    s_add_u32 s8, s8, s12
8859 ; GFX9-NEXT:    s_mul_hi_u32 s9, s4, s5
8860 ; GFX9-NEXT:    s_addc_u32 s8, s10, s11
8861 ; GFX9-NEXT:    s_addc_u32 s9, s9, 0
8862 ; GFX9-NEXT:    s_mul_i32 s5, s4, s5
8863 ; GFX9-NEXT:    s_add_u32 s5, s8, s5
8864 ; GFX9-NEXT:    s_addc_u32 s8, 0, s9
8865 ; GFX9-NEXT:    v_add_co_u32_e32 v0, vcc, s5, v0
8866 ; GFX9-NEXT:    s_cmp_lg_u64 vcc, 0
8867 ; GFX9-NEXT:    s_addc_u32 s8, s4, s8
8868 ; GFX9-NEXT:    s_ashr_i32 s4, s7, 31
8869 ; GFX9-NEXT:    s_add_u32 s6, s6, s4
8870 ; GFX9-NEXT:    s_mov_b32 s5, s4
8871 ; GFX9-NEXT:    s_addc_u32 s7, s7, s4
8872 ; GFX9-NEXT:    s_xor_b64 s[6:7], s[6:7], s[4:5]
8873 ; GFX9-NEXT:    v_readfirstlane_b32 s11, v0
8874 ; GFX9-NEXT:    s_mul_i32 s10, s6, s8
8875 ; GFX9-NEXT:    s_mul_hi_u32 s12, s6, s11
8876 ; GFX9-NEXT:    s_mul_hi_u32 s9, s6, s8
8877 ; GFX9-NEXT:    s_add_u32 s10, s12, s10
8878 ; GFX9-NEXT:    s_addc_u32 s9, 0, s9
8879 ; GFX9-NEXT:    s_mul_hi_u32 s13, s7, s11
8880 ; GFX9-NEXT:    s_mul_i32 s11, s7, s11
8881 ; GFX9-NEXT:    s_add_u32 s10, s10, s11
8882 ; GFX9-NEXT:    s_mul_hi_u32 s12, s7, s8
8883 ; GFX9-NEXT:    s_addc_u32 s9, s9, s13
8884 ; GFX9-NEXT:    s_addc_u32 s10, s12, 0
8885 ; GFX9-NEXT:    s_mul_i32 s8, s7, s8
8886 ; GFX9-NEXT:    s_add_u32 s8, s9, s8
8887 ; GFX9-NEXT:    s_addc_u32 s9, 0, s10
8888 ; GFX9-NEXT:    s_add_u32 s10, s8, 1
8889 ; GFX9-NEXT:    s_addc_u32 s11, s9, 0
8890 ; GFX9-NEXT:    s_add_u32 s12, s8, 2
8891 ; GFX9-NEXT:    s_mul_i32 s15, s9, 0xfff
8892 ; GFX9-NEXT:    s_mul_hi_u32 s16, s8, 0xfff
8893 ; GFX9-NEXT:    s_addc_u32 s13, s9, 0
8894 ; GFX9-NEXT:    s_add_i32 s16, s16, s15
8895 ; GFX9-NEXT:    s_mul_i32 s15, s8, 0xfff
8896 ; GFX9-NEXT:    v_mov_b32_e32 v0, s15
8897 ; GFX9-NEXT:    v_sub_co_u32_e32 v0, vcc, s6, v0
8898 ; GFX9-NEXT:    s_movk_i32 s14, 0xfff
8899 ; GFX9-NEXT:    s_cmp_lg_u64 vcc, 0
8900 ; GFX9-NEXT:    s_subb_u32 s6, s7, s16
8901 ; GFX9-NEXT:    v_subrev_co_u32_e32 v1, vcc, s14, v0
8902 ; GFX9-NEXT:    s_cmp_lg_u64 vcc, 0
8903 ; GFX9-NEXT:    s_subb_u32 s7, s6, 0
8904 ; GFX9-NEXT:    v_readfirstlane_b32 s14, v1
8905 ; GFX9-NEXT:    s_cmpk_gt_u32 s14, 0xffe
8906 ; GFX9-NEXT:    s_cselect_b32 s14, -1, 0
8907 ; GFX9-NEXT:    s_cmp_eq_u32 s7, 0
8908 ; GFX9-NEXT:    s_cselect_b32 s7, s14, -1
8909 ; GFX9-NEXT:    s_cmp_lg_u32 s7, 0
8910 ; GFX9-NEXT:    s_cselect_b32 s7, s13, s11
8911 ; GFX9-NEXT:    v_readfirstlane_b32 s11, v0
8912 ; GFX9-NEXT:    s_cselect_b32 s10, s12, s10
8913 ; GFX9-NEXT:    s_cmpk_gt_u32 s11, 0xffe
8914 ; GFX9-NEXT:    s_cselect_b32 s11, -1, 0
8915 ; GFX9-NEXT:    s_cmp_eq_u32 s6, 0
8916 ; GFX9-NEXT:    s_cselect_b32 s6, s11, -1
8917 ; GFX9-NEXT:    s_cmp_lg_u32 s6, 0
8918 ; GFX9-NEXT:    s_cselect_b32 s7, s7, s9
8919 ; GFX9-NEXT:    s_cselect_b32 s6, s10, s8
8920 ; GFX9-NEXT:    s_xor_b64 s[6:7], s[6:7], s[4:5]
8921 ; GFX9-NEXT:    s_sub_u32 s5, s6, s4
8922 ; GFX9-NEXT:    s_subb_u32 s4, s7, s4
8923 ; GFX9-NEXT:    v_mov_b32_e32 v0, s0
8924 ; GFX9-NEXT:    v_mov_b32_e32 v1, s1
8925 ; GFX9-NEXT:    v_mov_b32_e32 v2, s5
8926 ; GFX9-NEXT:    v_mov_b32_e32 v3, s4
8927 ; GFX9-NEXT:    global_store_dwordx4 v4, v[0:3], s[2:3]
8928 ; GFX9-NEXT:    s_endpgm
8929   %r = sdiv <2 x i64> %x, <i64 4096, i64 4095>
8930   store <2 x i64> %r, ptr addrspace(1) %out
8931   ret void
8934 define amdgpu_kernel void @sdiv_v2i64_pow2_shl_denom(ptr addrspace(1) %out, <2 x i64> %x, <2 x i64> %y) {
8935 ; CHECK-LABEL: @sdiv_v2i64_pow2_shl_denom(
8936 ; CHECK-NEXT:    [[SHL_Y:%.*]] = shl <2 x i64> <i64 4096, i64 4096>, [[Y:%.*]]
8937 ; CHECK-NEXT:    [[TMP1:%.*]] = extractelement <2 x i64> [[X:%.*]], i64 0
8938 ; CHECK-NEXT:    [[TMP2:%.*]] = extractelement <2 x i64> [[SHL_Y]], i64 0
8939 ; CHECK-NEXT:    [[TMP3:%.*]] = sdiv i64 [[TMP1]], [[TMP2]]
8940 ; CHECK-NEXT:    [[TMP4:%.*]] = insertelement <2 x i64> poison, i64 [[TMP3]], i64 0
8941 ; CHECK-NEXT:    [[TMP5:%.*]] = extractelement <2 x i64> [[X]], i64 1
8942 ; CHECK-NEXT:    [[TMP6:%.*]] = extractelement <2 x i64> [[SHL_Y]], i64 1
8943 ; CHECK-NEXT:    [[TMP7:%.*]] = sdiv i64 [[TMP5]], [[TMP6]]
8944 ; CHECK-NEXT:    [[TMP8:%.*]] = insertelement <2 x i64> [[TMP4]], i64 [[TMP7]], i64 1
8945 ; CHECK-NEXT:    store <2 x i64> [[TMP8]], ptr addrspace(1) [[OUT:%.*]], align 16
8946 ; CHECK-NEXT:    ret void
8948 ; GFX6-LABEL: sdiv_v2i64_pow2_shl_denom:
8949 ; GFX6:       ; %bb.0:
8950 ; GFX6-NEXT:    s_load_dwordx8 s[4:11], s[0:1], 0xd
8951 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
8952 ; GFX6-NEXT:    s_lshl_b64 s[2:3], 0x1000, s8
8953 ; GFX6-NEXT:    s_lshl_b64 s[12:13], 0x1000, s10
8954 ; GFX6-NEXT:    s_ashr_i32 s14, s3, 31
8955 ; GFX6-NEXT:    s_add_u32 s2, s2, s14
8956 ; GFX6-NEXT:    s_mov_b32 s15, s14
8957 ; GFX6-NEXT:    s_addc_u32 s3, s3, s14
8958 ; GFX6-NEXT:    s_xor_b64 s[2:3], s[2:3], s[14:15]
8959 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v0, s2
8960 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v1, s3
8961 ; GFX6-NEXT:    s_sub_u32 s10, 0, s2
8962 ; GFX6-NEXT:    s_subb_u32 s11, 0, s3
8963 ; GFX6-NEXT:    s_ashr_i32 s16, s5, 31
8964 ; GFX6-NEXT:    v_mac_f32_e32 v0, 0x4f800000, v1
8965 ; GFX6-NEXT:    v_rcp_f32_e32 v0, v0
8966 ; GFX6-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0x9
8967 ; GFX6-NEXT:    s_add_u32 s0, s4, s16
8968 ; GFX6-NEXT:    s_mov_b32 s17, s16
8969 ; GFX6-NEXT:    v_mul_f32_e32 v0, 0x5f7ffffc, v0
8970 ; GFX6-NEXT:    v_mul_f32_e32 v1, 0x2f800000, v0
8971 ; GFX6-NEXT:    v_trunc_f32_e32 v1, v1
8972 ; GFX6-NEXT:    v_mac_f32_e32 v0, 0xcf800000, v1
8973 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v1, v1
8974 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v0, v0
8975 ; GFX6-NEXT:    s_addc_u32 s1, s5, s16
8976 ; GFX6-NEXT:    s_xor_b64 s[4:5], s[0:1], s[16:17]
8977 ; GFX6-NEXT:    v_mul_lo_u32 v2, s10, v1
8978 ; GFX6-NEXT:    v_mul_hi_u32 v3, s10, v0
8979 ; GFX6-NEXT:    v_mul_lo_u32 v5, s11, v0
8980 ; GFX6-NEXT:    v_mul_lo_u32 v4, s10, v0
8981 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, v2, v3
8982 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, v2, v5
8983 ; GFX6-NEXT:    v_mul_hi_u32 v3, v0, v4
8984 ; GFX6-NEXT:    v_mul_lo_u32 v5, v0, v2
8985 ; GFX6-NEXT:    v_mul_hi_u32 v7, v0, v2
8986 ; GFX6-NEXT:    v_mul_hi_u32 v6, v1, v4
8987 ; GFX6-NEXT:    v_mul_lo_u32 v4, v1, v4
8988 ; GFX6-NEXT:    v_mul_hi_u32 v8, v1, v2
8989 ; GFX6-NEXT:    v_add_i32_e32 v3, vcc, v3, v5
8990 ; GFX6-NEXT:    v_addc_u32_e32 v5, vcc, 0, v7, vcc
8991 ; GFX6-NEXT:    v_mul_lo_u32 v2, v1, v2
8992 ; GFX6-NEXT:    v_add_i32_e32 v3, vcc, v3, v4
8993 ; GFX6-NEXT:    v_addc_u32_e32 v3, vcc, v5, v6, vcc
8994 ; GFX6-NEXT:    v_addc_u32_e32 v4, vcc, 0, v8, vcc
8995 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, v3, v2
8996 ; GFX6-NEXT:    v_addc_u32_e32 v3, vcc, 0, v4, vcc
8997 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, v0, v2
8998 ; GFX6-NEXT:    v_addc_u32_e32 v1, vcc, v1, v3, vcc
8999 ; GFX6-NEXT:    v_mul_lo_u32 v2, s10, v1
9000 ; GFX6-NEXT:    v_mul_hi_u32 v3, s10, v0
9001 ; GFX6-NEXT:    v_mul_lo_u32 v4, s11, v0
9002 ; GFX6-NEXT:    s_mov_b32 s11, 0xf000
9003 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, v2, v3
9004 ; GFX6-NEXT:    v_mul_lo_u32 v3, s10, v0
9005 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, v2, v4
9006 ; GFX6-NEXT:    v_mul_lo_u32 v6, v0, v2
9007 ; GFX6-NEXT:    v_mul_hi_u32 v7, v0, v3
9008 ; GFX6-NEXT:    v_mul_hi_u32 v8, v0, v2
9009 ; GFX6-NEXT:    v_mul_hi_u32 v5, v1, v3
9010 ; GFX6-NEXT:    v_mul_lo_u32 v3, v1, v3
9011 ; GFX6-NEXT:    v_mul_hi_u32 v4, v1, v2
9012 ; GFX6-NEXT:    v_add_i32_e32 v6, vcc, v7, v6
9013 ; GFX6-NEXT:    v_addc_u32_e32 v7, vcc, 0, v8, vcc
9014 ; GFX6-NEXT:    v_mul_lo_u32 v2, v1, v2
9015 ; GFX6-NEXT:    v_add_i32_e32 v3, vcc, v6, v3
9016 ; GFX6-NEXT:    v_addc_u32_e32 v3, vcc, v7, v5, vcc
9017 ; GFX6-NEXT:    v_addc_u32_e32 v4, vcc, 0, v4, vcc
9018 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, v3, v2
9019 ; GFX6-NEXT:    v_addc_u32_e32 v3, vcc, 0, v4, vcc
9020 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, v0, v2
9021 ; GFX6-NEXT:    v_addc_u32_e32 v1, vcc, v1, v3, vcc
9022 ; GFX6-NEXT:    v_mul_lo_u32 v2, s4, v1
9023 ; GFX6-NEXT:    v_mul_hi_u32 v3, s4, v0
9024 ; GFX6-NEXT:    v_mul_hi_u32 v4, s4, v1
9025 ; GFX6-NEXT:    v_mul_hi_u32 v5, s5, v1
9026 ; GFX6-NEXT:    v_mul_lo_u32 v1, s5, v1
9027 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, v3, v2
9028 ; GFX6-NEXT:    v_addc_u32_e32 v3, vcc, 0, v4, vcc
9029 ; GFX6-NEXT:    v_mul_lo_u32 v4, s5, v0
9030 ; GFX6-NEXT:    v_mul_hi_u32 v0, s5, v0
9031 ; GFX6-NEXT:    s_mov_b32 s10, -1
9032 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, v2, v4
9033 ; GFX6-NEXT:    v_addc_u32_e32 v0, vcc, v3, v0, vcc
9034 ; GFX6-NEXT:    v_addc_u32_e32 v2, vcc, 0, v5, vcc
9035 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, v0, v1
9036 ; GFX6-NEXT:    v_addc_u32_e32 v1, vcc, 0, v2, vcc
9037 ; GFX6-NEXT:    v_mul_lo_u32 v2, s2, v1
9038 ; GFX6-NEXT:    v_mul_hi_u32 v3, s2, v0
9039 ; GFX6-NEXT:    v_mul_lo_u32 v4, s3, v0
9040 ; GFX6-NEXT:    v_mov_b32_e32 v5, s3
9041 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, v2, v3
9042 ; GFX6-NEXT:    v_mul_lo_u32 v3, s2, v0
9043 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, v4, v2
9044 ; GFX6-NEXT:    v_sub_i32_e32 v4, vcc, s5, v2
9045 ; GFX6-NEXT:    v_sub_i32_e32 v3, vcc, s4, v3
9046 ; GFX6-NEXT:    v_subb_u32_e64 v4, s[0:1], v4, v5, vcc
9047 ; GFX6-NEXT:    v_subrev_i32_e64 v5, s[0:1], s2, v3
9048 ; GFX6-NEXT:    v_subbrev_u32_e64 v4, s[0:1], 0, v4, s[0:1]
9049 ; GFX6-NEXT:    v_cmp_le_u32_e64 s[0:1], s3, v4
9050 ; GFX6-NEXT:    v_cndmask_b32_e64 v6, 0, -1, s[0:1]
9051 ; GFX6-NEXT:    v_cmp_le_u32_e64 s[0:1], s2, v5
9052 ; GFX6-NEXT:    v_cndmask_b32_e64 v5, 0, -1, s[0:1]
9053 ; GFX6-NEXT:    v_cmp_eq_u32_e64 s[0:1], s3, v4
9054 ; GFX6-NEXT:    v_cndmask_b32_e64 v4, v6, v5, s[0:1]
9055 ; GFX6-NEXT:    v_add_i32_e64 v5, s[0:1], 1, v0
9056 ; GFX6-NEXT:    v_addc_u32_e64 v6, s[0:1], 0, v1, s[0:1]
9057 ; GFX6-NEXT:    v_add_i32_e64 v7, s[0:1], 2, v0
9058 ; GFX6-NEXT:    v_addc_u32_e64 v8, s[0:1], 0, v1, s[0:1]
9059 ; GFX6-NEXT:    v_cmp_ne_u32_e64 s[0:1], 0, v4
9060 ; GFX6-NEXT:    v_cndmask_b32_e64 v4, v5, v7, s[0:1]
9061 ; GFX6-NEXT:    v_cndmask_b32_e64 v5, v6, v8, s[0:1]
9062 ; GFX6-NEXT:    s_xor_b64 s[0:1], s[16:17], s[14:15]
9063 ; GFX6-NEXT:    s_ashr_i32 s4, s13, 31
9064 ; GFX6-NEXT:    s_add_u32 s12, s12, s4
9065 ; GFX6-NEXT:    v_mov_b32_e32 v6, s5
9066 ; GFX6-NEXT:    s_mov_b32 s5, s4
9067 ; GFX6-NEXT:    s_addc_u32 s13, s13, s4
9068 ; GFX6-NEXT:    s_xor_b64 s[12:13], s[12:13], s[4:5]
9069 ; GFX6-NEXT:    v_subb_u32_e32 v2, vcc, v6, v2, vcc
9070 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v6, s12
9071 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v7, s13
9072 ; GFX6-NEXT:    v_cmp_le_u32_e32 vcc, s3, v2
9073 ; GFX6-NEXT:    v_cndmask_b32_e64 v8, 0, -1, vcc
9074 ; GFX6-NEXT:    v_cmp_le_u32_e32 vcc, s2, v3
9075 ; GFX6-NEXT:    v_mac_f32_e32 v6, 0x4f800000, v7
9076 ; GFX6-NEXT:    v_rcp_f32_e32 v6, v6
9077 ; GFX6-NEXT:    v_cndmask_b32_e64 v3, 0, -1, vcc
9078 ; GFX6-NEXT:    v_cmp_eq_u32_e32 vcc, s3, v2
9079 ; GFX6-NEXT:    v_cndmask_b32_e32 v2, v8, v3, vcc
9080 ; GFX6-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v2
9081 ; GFX6-NEXT:    v_mul_f32_e32 v2, 0x5f7ffffc, v6
9082 ; GFX6-NEXT:    v_mul_f32_e32 v3, 0x2f800000, v2
9083 ; GFX6-NEXT:    v_trunc_f32_e32 v3, v3
9084 ; GFX6-NEXT:    v_mac_f32_e32 v2, 0xcf800000, v3
9085 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v2, v2
9086 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v3, v3
9087 ; GFX6-NEXT:    s_sub_u32 s2, 0, s12
9088 ; GFX6-NEXT:    v_cndmask_b32_e32 v1, v1, v5, vcc
9089 ; GFX6-NEXT:    v_cndmask_b32_e32 v0, v0, v4, vcc
9090 ; GFX6-NEXT:    v_mul_hi_u32 v4, s2, v2
9091 ; GFX6-NEXT:    v_mul_lo_u32 v5, s2, v3
9092 ; GFX6-NEXT:    s_subb_u32 s3, 0, s13
9093 ; GFX6-NEXT:    v_mul_lo_u32 v6, s3, v2
9094 ; GFX6-NEXT:    v_xor_b32_e32 v0, s0, v0
9095 ; GFX6-NEXT:    v_add_i32_e32 v4, vcc, v5, v4
9096 ; GFX6-NEXT:    v_mul_lo_u32 v5, s2, v2
9097 ; GFX6-NEXT:    v_add_i32_e32 v4, vcc, v4, v6
9098 ; GFX6-NEXT:    v_mul_lo_u32 v6, v2, v4
9099 ; GFX6-NEXT:    v_mul_hi_u32 v7, v2, v5
9100 ; GFX6-NEXT:    v_mul_hi_u32 v8, v2, v4
9101 ; GFX6-NEXT:    v_mul_hi_u32 v9, v3, v4
9102 ; GFX6-NEXT:    v_mul_lo_u32 v4, v3, v4
9103 ; GFX6-NEXT:    v_add_i32_e32 v6, vcc, v7, v6
9104 ; GFX6-NEXT:    v_addc_u32_e32 v7, vcc, 0, v8, vcc
9105 ; GFX6-NEXT:    v_mul_lo_u32 v8, v3, v5
9106 ; GFX6-NEXT:    v_mul_hi_u32 v5, v3, v5
9107 ; GFX6-NEXT:    v_xor_b32_e32 v1, s1, v1
9108 ; GFX6-NEXT:    v_add_i32_e32 v6, vcc, v6, v8
9109 ; GFX6-NEXT:    v_addc_u32_e32 v5, vcc, v7, v5, vcc
9110 ; GFX6-NEXT:    v_addc_u32_e32 v6, vcc, 0, v9, vcc
9111 ; GFX6-NEXT:    v_add_i32_e32 v4, vcc, v5, v4
9112 ; GFX6-NEXT:    v_addc_u32_e32 v5, vcc, 0, v6, vcc
9113 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, v2, v4
9114 ; GFX6-NEXT:    v_addc_u32_e32 v3, vcc, v3, v5, vcc
9115 ; GFX6-NEXT:    v_mul_lo_u32 v4, s2, v3
9116 ; GFX6-NEXT:    v_mul_hi_u32 v5, s2, v2
9117 ; GFX6-NEXT:    v_mul_lo_u32 v6, s3, v2
9118 ; GFX6-NEXT:    v_add_i32_e32 v4, vcc, v4, v5
9119 ; GFX6-NEXT:    v_mul_lo_u32 v5, s2, v2
9120 ; GFX6-NEXT:    v_add_i32_e32 v4, vcc, v4, v6
9121 ; GFX6-NEXT:    v_mul_lo_u32 v8, v2, v4
9122 ; GFX6-NEXT:    v_mul_hi_u32 v9, v2, v5
9123 ; GFX6-NEXT:    v_mul_hi_u32 v10, v2, v4
9124 ; GFX6-NEXT:    v_mul_hi_u32 v7, v3, v5
9125 ; GFX6-NEXT:    v_mul_lo_u32 v5, v3, v5
9126 ; GFX6-NEXT:    v_mul_hi_u32 v6, v3, v4
9127 ; GFX6-NEXT:    v_add_i32_e32 v8, vcc, v9, v8
9128 ; GFX6-NEXT:    v_addc_u32_e32 v9, vcc, 0, v10, vcc
9129 ; GFX6-NEXT:    v_mul_lo_u32 v4, v3, v4
9130 ; GFX6-NEXT:    v_add_i32_e32 v5, vcc, v8, v5
9131 ; GFX6-NEXT:    v_addc_u32_e32 v5, vcc, v9, v7, vcc
9132 ; GFX6-NEXT:    v_addc_u32_e32 v6, vcc, 0, v6, vcc
9133 ; GFX6-NEXT:    v_add_i32_e32 v4, vcc, v5, v4
9134 ; GFX6-NEXT:    s_ashr_i32 s2, s7, 31
9135 ; GFX6-NEXT:    v_addc_u32_e32 v5, vcc, 0, v6, vcc
9136 ; GFX6-NEXT:    s_add_u32 s6, s6, s2
9137 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, v2, v4
9138 ; GFX6-NEXT:    s_mov_b32 s3, s2
9139 ; GFX6-NEXT:    s_addc_u32 s7, s7, s2
9140 ; GFX6-NEXT:    v_addc_u32_e32 v3, vcc, v3, v5, vcc
9141 ; GFX6-NEXT:    s_xor_b64 s[6:7], s[6:7], s[2:3]
9142 ; GFX6-NEXT:    v_mul_lo_u32 v4, s6, v3
9143 ; GFX6-NEXT:    v_mul_hi_u32 v5, s6, v2
9144 ; GFX6-NEXT:    v_mul_hi_u32 v7, s6, v3
9145 ; GFX6-NEXT:    v_mul_hi_u32 v8, s7, v3
9146 ; GFX6-NEXT:    v_mul_lo_u32 v3, s7, v3
9147 ; GFX6-NEXT:    v_add_i32_e32 v4, vcc, v5, v4
9148 ; GFX6-NEXT:    v_addc_u32_e32 v5, vcc, 0, v7, vcc
9149 ; GFX6-NEXT:    v_mul_lo_u32 v7, s7, v2
9150 ; GFX6-NEXT:    v_mul_hi_u32 v2, s7, v2
9151 ; GFX6-NEXT:    v_mov_b32_e32 v6, s1
9152 ; GFX6-NEXT:    v_add_i32_e32 v4, vcc, v4, v7
9153 ; GFX6-NEXT:    v_addc_u32_e32 v2, vcc, v5, v2, vcc
9154 ; GFX6-NEXT:    v_addc_u32_e32 v4, vcc, 0, v8, vcc
9155 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, v2, v3
9156 ; GFX6-NEXT:    v_addc_u32_e32 v3, vcc, 0, v4, vcc
9157 ; GFX6-NEXT:    v_mul_lo_u32 v4, s12, v3
9158 ; GFX6-NEXT:    v_mul_hi_u32 v5, s12, v2
9159 ; GFX6-NEXT:    v_subrev_i32_e32 v0, vcc, s0, v0
9160 ; GFX6-NEXT:    v_subb_u32_e32 v1, vcc, v1, v6, vcc
9161 ; GFX6-NEXT:    v_mul_lo_u32 v6, s13, v2
9162 ; GFX6-NEXT:    v_add_i32_e32 v4, vcc, v4, v5
9163 ; GFX6-NEXT:    v_mul_lo_u32 v5, s12, v2
9164 ; GFX6-NEXT:    v_add_i32_e32 v4, vcc, v6, v4
9165 ; GFX6-NEXT:    v_sub_i32_e32 v6, vcc, s7, v4
9166 ; GFX6-NEXT:    v_mov_b32_e32 v7, s13
9167 ; GFX6-NEXT:    v_sub_i32_e32 v5, vcc, s6, v5
9168 ; GFX6-NEXT:    v_subb_u32_e64 v6, s[0:1], v6, v7, vcc
9169 ; GFX6-NEXT:    v_subrev_i32_e64 v7, s[0:1], s12, v5
9170 ; GFX6-NEXT:    v_subbrev_u32_e64 v6, s[0:1], 0, v6, s[0:1]
9171 ; GFX6-NEXT:    v_cmp_le_u32_e64 s[0:1], s13, v6
9172 ; GFX6-NEXT:    v_cndmask_b32_e64 v8, 0, -1, s[0:1]
9173 ; GFX6-NEXT:    v_cmp_le_u32_e64 s[0:1], s12, v7
9174 ; GFX6-NEXT:    v_cndmask_b32_e64 v7, 0, -1, s[0:1]
9175 ; GFX6-NEXT:    v_cmp_eq_u32_e64 s[0:1], s13, v6
9176 ; GFX6-NEXT:    v_cndmask_b32_e64 v6, v8, v7, s[0:1]
9177 ; GFX6-NEXT:    v_add_i32_e64 v7, s[0:1], 1, v2
9178 ; GFX6-NEXT:    v_addc_u32_e64 v8, s[0:1], 0, v3, s[0:1]
9179 ; GFX6-NEXT:    v_add_i32_e64 v9, s[0:1], 2, v2
9180 ; GFX6-NEXT:    v_addc_u32_e64 v10, s[0:1], 0, v3, s[0:1]
9181 ; GFX6-NEXT:    v_cmp_ne_u32_e64 s[0:1], 0, v6
9182 ; GFX6-NEXT:    v_cndmask_b32_e64 v6, v7, v9, s[0:1]
9183 ; GFX6-NEXT:    v_cndmask_b32_e64 v7, v8, v10, s[0:1]
9184 ; GFX6-NEXT:    v_mov_b32_e32 v8, s7
9185 ; GFX6-NEXT:    v_subb_u32_e32 v4, vcc, v8, v4, vcc
9186 ; GFX6-NEXT:    v_cmp_le_u32_e32 vcc, s13, v4
9187 ; GFX6-NEXT:    v_cndmask_b32_e64 v8, 0, -1, vcc
9188 ; GFX6-NEXT:    v_cmp_le_u32_e32 vcc, s12, v5
9189 ; GFX6-NEXT:    v_cndmask_b32_e64 v5, 0, -1, vcc
9190 ; GFX6-NEXT:    v_cmp_eq_u32_e32 vcc, s13, v4
9191 ; GFX6-NEXT:    v_cndmask_b32_e32 v4, v8, v5, vcc
9192 ; GFX6-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v4
9193 ; GFX6-NEXT:    v_cndmask_b32_e32 v2, v2, v6, vcc
9194 ; GFX6-NEXT:    s_xor_b64 s[0:1], s[2:3], s[4:5]
9195 ; GFX6-NEXT:    v_cndmask_b32_e32 v3, v3, v7, vcc
9196 ; GFX6-NEXT:    v_xor_b32_e32 v2, s0, v2
9197 ; GFX6-NEXT:    v_xor_b32_e32 v3, s1, v3
9198 ; GFX6-NEXT:    v_mov_b32_e32 v4, s1
9199 ; GFX6-NEXT:    v_subrev_i32_e32 v2, vcc, s0, v2
9200 ; GFX6-NEXT:    v_subb_u32_e32 v3, vcc, v3, v4, vcc
9201 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
9202 ; GFX6-NEXT:    buffer_store_dwordx4 v[0:3], off, s[8:11], 0
9203 ; GFX6-NEXT:    s_endpgm
9205 ; GFX9-LABEL: sdiv_v2i64_pow2_shl_denom:
9206 ; GFX9:       ; %bb.0:
9207 ; GFX9-NEXT:    s_load_dwordx8 s[4:11], s[0:1], 0x34
9208 ; GFX9-NEXT:    v_mov_b32_e32 v4, 0
9209 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
9210 ; GFX9-NEXT:    s_lshl_b64 s[2:3], 0x1000, s8
9211 ; GFX9-NEXT:    s_lshl_b64 s[10:11], 0x1000, s10
9212 ; GFX9-NEXT:    s_ashr_i32 s8, s3, 31
9213 ; GFX9-NEXT:    s_add_u32 s2, s2, s8
9214 ; GFX9-NEXT:    s_mov_b32 s9, s8
9215 ; GFX9-NEXT:    s_addc_u32 s3, s3, s8
9216 ; GFX9-NEXT:    s_xor_b64 s[12:13], s[2:3], s[8:9]
9217 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v0, s12
9218 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v1, s13
9219 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
9220 ; GFX9-NEXT:    s_sub_u32 s0, 0, s12
9221 ; GFX9-NEXT:    s_subb_u32 s1, 0, s13
9222 ; GFX9-NEXT:    v_mac_f32_e32 v0, 0x4f800000, v1
9223 ; GFX9-NEXT:    v_rcp_f32_e32 v0, v0
9224 ; GFX9-NEXT:    v_mul_f32_e32 v0, 0x5f7ffffc, v0
9225 ; GFX9-NEXT:    v_mul_f32_e32 v1, 0x2f800000, v0
9226 ; GFX9-NEXT:    v_trunc_f32_e32 v1, v1
9227 ; GFX9-NEXT:    v_mac_f32_e32 v0, 0xcf800000, v1
9228 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v1, v1
9229 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v0, v0
9230 ; GFX9-NEXT:    v_readfirstlane_b32 s14, v1
9231 ; GFX9-NEXT:    v_readfirstlane_b32 s15, v0
9232 ; GFX9-NEXT:    s_mul_i32 s16, s0, s14
9233 ; GFX9-NEXT:    s_mul_hi_u32 s18, s0, s15
9234 ; GFX9-NEXT:    s_mul_i32 s17, s1, s15
9235 ; GFX9-NEXT:    s_add_i32 s16, s18, s16
9236 ; GFX9-NEXT:    s_mul_i32 s19, s0, s15
9237 ; GFX9-NEXT:    s_add_i32 s16, s16, s17
9238 ; GFX9-NEXT:    s_mul_hi_u32 s17, s15, s16
9239 ; GFX9-NEXT:    s_mul_i32 s18, s15, s16
9240 ; GFX9-NEXT:    s_mul_hi_u32 s15, s15, s19
9241 ; GFX9-NEXT:    s_add_u32 s15, s15, s18
9242 ; GFX9-NEXT:    s_addc_u32 s17, 0, s17
9243 ; GFX9-NEXT:    s_mul_hi_u32 s20, s14, s19
9244 ; GFX9-NEXT:    s_mul_i32 s19, s14, s19
9245 ; GFX9-NEXT:    s_add_u32 s15, s15, s19
9246 ; GFX9-NEXT:    s_mul_hi_u32 s18, s14, s16
9247 ; GFX9-NEXT:    s_addc_u32 s15, s17, s20
9248 ; GFX9-NEXT:    s_addc_u32 s17, s18, 0
9249 ; GFX9-NEXT:    s_mul_i32 s16, s14, s16
9250 ; GFX9-NEXT:    s_add_u32 s15, s15, s16
9251 ; GFX9-NEXT:    s_addc_u32 s16, 0, s17
9252 ; GFX9-NEXT:    v_add_co_u32_e32 v0, vcc, s15, v0
9253 ; GFX9-NEXT:    s_cmp_lg_u64 vcc, 0
9254 ; GFX9-NEXT:    s_addc_u32 s14, s14, s16
9255 ; GFX9-NEXT:    v_readfirstlane_b32 s16, v0
9256 ; GFX9-NEXT:    s_mul_i32 s15, s0, s14
9257 ; GFX9-NEXT:    s_mul_hi_u32 s17, s0, s16
9258 ; GFX9-NEXT:    s_add_i32 s15, s17, s15
9259 ; GFX9-NEXT:    s_mul_i32 s1, s1, s16
9260 ; GFX9-NEXT:    s_add_i32 s15, s15, s1
9261 ; GFX9-NEXT:    s_mul_i32 s0, s0, s16
9262 ; GFX9-NEXT:    s_mul_hi_u32 s17, s14, s0
9263 ; GFX9-NEXT:    s_mul_i32 s18, s14, s0
9264 ; GFX9-NEXT:    s_mul_i32 s20, s16, s15
9265 ; GFX9-NEXT:    s_mul_hi_u32 s0, s16, s0
9266 ; GFX9-NEXT:    s_mul_hi_u32 s19, s16, s15
9267 ; GFX9-NEXT:    s_add_u32 s0, s0, s20
9268 ; GFX9-NEXT:    s_addc_u32 s16, 0, s19
9269 ; GFX9-NEXT:    s_add_u32 s0, s0, s18
9270 ; GFX9-NEXT:    s_mul_hi_u32 s1, s14, s15
9271 ; GFX9-NEXT:    s_addc_u32 s0, s16, s17
9272 ; GFX9-NEXT:    s_addc_u32 s1, s1, 0
9273 ; GFX9-NEXT:    s_mul_i32 s15, s14, s15
9274 ; GFX9-NEXT:    s_add_u32 s0, s0, s15
9275 ; GFX9-NEXT:    s_addc_u32 s1, 0, s1
9276 ; GFX9-NEXT:    v_add_co_u32_e32 v0, vcc, s0, v0
9277 ; GFX9-NEXT:    s_cmp_lg_u64 vcc, 0
9278 ; GFX9-NEXT:    s_addc_u32 s16, s14, s1
9279 ; GFX9-NEXT:    s_ashr_i32 s14, s5, 31
9280 ; GFX9-NEXT:    s_add_u32 s0, s4, s14
9281 ; GFX9-NEXT:    s_mov_b32 s15, s14
9282 ; GFX9-NEXT:    s_addc_u32 s1, s5, s14
9283 ; GFX9-NEXT:    s_xor_b64 s[4:5], s[0:1], s[14:15]
9284 ; GFX9-NEXT:    v_readfirstlane_b32 s17, v0
9285 ; GFX9-NEXT:    s_mul_i32 s1, s4, s16
9286 ; GFX9-NEXT:    s_mul_hi_u32 s18, s4, s17
9287 ; GFX9-NEXT:    s_mul_hi_u32 s0, s4, s16
9288 ; GFX9-NEXT:    s_add_u32 s1, s18, s1
9289 ; GFX9-NEXT:    s_addc_u32 s0, 0, s0
9290 ; GFX9-NEXT:    s_mul_hi_u32 s19, s5, s17
9291 ; GFX9-NEXT:    s_mul_i32 s17, s5, s17
9292 ; GFX9-NEXT:    s_add_u32 s1, s1, s17
9293 ; GFX9-NEXT:    s_mul_hi_u32 s18, s5, s16
9294 ; GFX9-NEXT:    s_addc_u32 s0, s0, s19
9295 ; GFX9-NEXT:    s_addc_u32 s1, s18, 0
9296 ; GFX9-NEXT:    s_mul_i32 s16, s5, s16
9297 ; GFX9-NEXT:    s_add_u32 s16, s0, s16
9298 ; GFX9-NEXT:    s_addc_u32 s17, 0, s1
9299 ; GFX9-NEXT:    s_mul_i32 s0, s12, s17
9300 ; GFX9-NEXT:    s_mul_hi_u32 s1, s12, s16
9301 ; GFX9-NEXT:    s_add_i32 s0, s1, s0
9302 ; GFX9-NEXT:    s_mul_i32 s1, s13, s16
9303 ; GFX9-NEXT:    s_add_i32 s18, s0, s1
9304 ; GFX9-NEXT:    s_mul_i32 s1, s12, s16
9305 ; GFX9-NEXT:    v_mov_b32_e32 v0, s1
9306 ; GFX9-NEXT:    s_sub_i32 s0, s5, s18
9307 ; GFX9-NEXT:    v_sub_co_u32_e32 v0, vcc, s4, v0
9308 ; GFX9-NEXT:    s_cmp_lg_u64 vcc, 0
9309 ; GFX9-NEXT:    s_subb_u32 s4, s0, s13
9310 ; GFX9-NEXT:    v_subrev_co_u32_e64 v1, s[0:1], s12, v0
9311 ; GFX9-NEXT:    s_cmp_lg_u64 s[0:1], 0
9312 ; GFX9-NEXT:    s_subb_u32 s4, s4, 0
9313 ; GFX9-NEXT:    s_cmp_ge_u32 s4, s13
9314 ; GFX9-NEXT:    s_cselect_b32 s19, -1, 0
9315 ; GFX9-NEXT:    v_cmp_le_u32_e64 s[0:1], s12, v1
9316 ; GFX9-NEXT:    s_cmp_eq_u32 s4, s13
9317 ; GFX9-NEXT:    v_cndmask_b32_e64 v1, 0, -1, s[0:1]
9318 ; GFX9-NEXT:    v_mov_b32_e32 v2, s19
9319 ; GFX9-NEXT:    s_cselect_b64 s[0:1], -1, 0
9320 ; GFX9-NEXT:    v_cndmask_b32_e64 v1, v2, v1, s[0:1]
9321 ; GFX9-NEXT:    s_add_u32 s0, s16, 1
9322 ; GFX9-NEXT:    s_addc_u32 s4, s17, 0
9323 ; GFX9-NEXT:    s_add_u32 s1, s16, 2
9324 ; GFX9-NEXT:    s_addc_u32 s19, s17, 0
9325 ; GFX9-NEXT:    v_mov_b32_e32 v2, s0
9326 ; GFX9-NEXT:    v_mov_b32_e32 v3, s1
9327 ; GFX9-NEXT:    v_cmp_ne_u32_e64 s[0:1], 0, v1
9328 ; GFX9-NEXT:    v_cndmask_b32_e64 v1, v2, v3, s[0:1]
9329 ; GFX9-NEXT:    v_mov_b32_e32 v2, s4
9330 ; GFX9-NEXT:    v_mov_b32_e32 v3, s19
9331 ; GFX9-NEXT:    s_cmp_lg_u64 vcc, 0
9332 ; GFX9-NEXT:    v_cndmask_b32_e64 v2, v2, v3, s[0:1]
9333 ; GFX9-NEXT:    s_subb_u32 s0, s5, s18
9334 ; GFX9-NEXT:    s_cmp_ge_u32 s0, s13
9335 ; GFX9-NEXT:    s_cselect_b32 s1, -1, 0
9336 ; GFX9-NEXT:    v_cmp_le_u32_e32 vcc, s12, v0
9337 ; GFX9-NEXT:    s_cmp_eq_u32 s0, s13
9338 ; GFX9-NEXT:    v_cndmask_b32_e64 v0, 0, -1, vcc
9339 ; GFX9-NEXT:    v_mov_b32_e32 v3, s1
9340 ; GFX9-NEXT:    s_cselect_b64 vcc, -1, 0
9341 ; GFX9-NEXT:    s_xor_b64 s[0:1], s[14:15], s[8:9]
9342 ; GFX9-NEXT:    s_ashr_i32 s4, s11, 31
9343 ; GFX9-NEXT:    v_cndmask_b32_e32 v0, v3, v0, vcc
9344 ; GFX9-NEXT:    s_add_u32 s8, s10, s4
9345 ; GFX9-NEXT:    v_mov_b32_e32 v3, s17
9346 ; GFX9-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v0
9347 ; GFX9-NEXT:    s_mov_b32 s5, s4
9348 ; GFX9-NEXT:    s_addc_u32 s9, s11, s4
9349 ; GFX9-NEXT:    v_cndmask_b32_e32 v0, v3, v2, vcc
9350 ; GFX9-NEXT:    v_mov_b32_e32 v2, s16
9351 ; GFX9-NEXT:    s_xor_b64 s[8:9], s[8:9], s[4:5]
9352 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, v2, v1, vcc
9353 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v2, s8
9354 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v3, s9
9355 ; GFX9-NEXT:    v_xor_b32_e32 v1, s0, v1
9356 ; GFX9-NEXT:    v_xor_b32_e32 v5, s1, v0
9357 ; GFX9-NEXT:    v_subrev_co_u32_e32 v0, vcc, s0, v1
9358 ; GFX9-NEXT:    v_mac_f32_e32 v2, 0x4f800000, v3
9359 ; GFX9-NEXT:    v_rcp_f32_e32 v2, v2
9360 ; GFX9-NEXT:    s_sub_u32 s0, 0, s8
9361 ; GFX9-NEXT:    v_mov_b32_e32 v6, s1
9362 ; GFX9-NEXT:    s_subb_u32 s1, 0, s9
9363 ; GFX9-NEXT:    v_mul_f32_e32 v2, 0x5f7ffffc, v2
9364 ; GFX9-NEXT:    v_mul_f32_e32 v3, 0x2f800000, v2
9365 ; GFX9-NEXT:    v_trunc_f32_e32 v3, v3
9366 ; GFX9-NEXT:    v_mac_f32_e32 v2, 0xcf800000, v3
9367 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v2, v2
9368 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v3, v3
9369 ; GFX9-NEXT:    v_subb_co_u32_e32 v1, vcc, v5, v6, vcc
9370 ; GFX9-NEXT:    v_readfirstlane_b32 s10, v2
9371 ; GFX9-NEXT:    v_readfirstlane_b32 s13, v3
9372 ; GFX9-NEXT:    s_mul_hi_u32 s12, s0, s10
9373 ; GFX9-NEXT:    s_mul_i32 s14, s0, s13
9374 ; GFX9-NEXT:    s_mul_i32 s11, s1, s10
9375 ; GFX9-NEXT:    s_add_i32 s12, s12, s14
9376 ; GFX9-NEXT:    s_add_i32 s12, s12, s11
9377 ; GFX9-NEXT:    s_mul_i32 s15, s0, s10
9378 ; GFX9-NEXT:    s_mul_hi_u32 s11, s10, s12
9379 ; GFX9-NEXT:    s_mul_i32 s14, s10, s12
9380 ; GFX9-NEXT:    s_mul_hi_u32 s10, s10, s15
9381 ; GFX9-NEXT:    s_add_u32 s10, s10, s14
9382 ; GFX9-NEXT:    s_addc_u32 s11, 0, s11
9383 ; GFX9-NEXT:    s_mul_hi_u32 s16, s13, s15
9384 ; GFX9-NEXT:    s_mul_i32 s15, s13, s15
9385 ; GFX9-NEXT:    s_add_u32 s10, s10, s15
9386 ; GFX9-NEXT:    s_mul_hi_u32 s14, s13, s12
9387 ; GFX9-NEXT:    s_addc_u32 s10, s11, s16
9388 ; GFX9-NEXT:    s_addc_u32 s11, s14, 0
9389 ; GFX9-NEXT:    s_mul_i32 s12, s13, s12
9390 ; GFX9-NEXT:    s_add_u32 s10, s10, s12
9391 ; GFX9-NEXT:    s_addc_u32 s11, 0, s11
9392 ; GFX9-NEXT:    v_add_co_u32_e32 v2, vcc, s10, v2
9393 ; GFX9-NEXT:    s_cmp_lg_u64 vcc, 0
9394 ; GFX9-NEXT:    s_addc_u32 s10, s13, s11
9395 ; GFX9-NEXT:    v_readfirstlane_b32 s12, v2
9396 ; GFX9-NEXT:    s_mul_i32 s11, s0, s10
9397 ; GFX9-NEXT:    s_mul_hi_u32 s13, s0, s12
9398 ; GFX9-NEXT:    s_add_i32 s11, s13, s11
9399 ; GFX9-NEXT:    s_mul_i32 s1, s1, s12
9400 ; GFX9-NEXT:    s_add_i32 s11, s11, s1
9401 ; GFX9-NEXT:    s_mul_i32 s0, s0, s12
9402 ; GFX9-NEXT:    s_mul_hi_u32 s13, s10, s0
9403 ; GFX9-NEXT:    s_mul_i32 s14, s10, s0
9404 ; GFX9-NEXT:    s_mul_i32 s16, s12, s11
9405 ; GFX9-NEXT:    s_mul_hi_u32 s0, s12, s0
9406 ; GFX9-NEXT:    s_mul_hi_u32 s15, s12, s11
9407 ; GFX9-NEXT:    s_add_u32 s0, s0, s16
9408 ; GFX9-NEXT:    s_addc_u32 s12, 0, s15
9409 ; GFX9-NEXT:    s_add_u32 s0, s0, s14
9410 ; GFX9-NEXT:    s_mul_hi_u32 s1, s10, s11
9411 ; GFX9-NEXT:    s_addc_u32 s0, s12, s13
9412 ; GFX9-NEXT:    s_addc_u32 s1, s1, 0
9413 ; GFX9-NEXT:    s_mul_i32 s11, s10, s11
9414 ; GFX9-NEXT:    s_add_u32 s0, s0, s11
9415 ; GFX9-NEXT:    s_addc_u32 s1, 0, s1
9416 ; GFX9-NEXT:    v_add_co_u32_e32 v2, vcc, s0, v2
9417 ; GFX9-NEXT:    s_cmp_lg_u64 vcc, 0
9418 ; GFX9-NEXT:    s_addc_u32 s12, s10, s1
9419 ; GFX9-NEXT:    s_ashr_i32 s10, s7, 31
9420 ; GFX9-NEXT:    s_add_u32 s0, s6, s10
9421 ; GFX9-NEXT:    s_mov_b32 s11, s10
9422 ; GFX9-NEXT:    s_addc_u32 s1, s7, s10
9423 ; GFX9-NEXT:    s_xor_b64 s[6:7], s[0:1], s[10:11]
9424 ; GFX9-NEXT:    v_readfirstlane_b32 s13, v2
9425 ; GFX9-NEXT:    s_mul_i32 s1, s6, s12
9426 ; GFX9-NEXT:    s_mul_hi_u32 s14, s6, s13
9427 ; GFX9-NEXT:    s_mul_hi_u32 s0, s6, s12
9428 ; GFX9-NEXT:    s_add_u32 s1, s14, s1
9429 ; GFX9-NEXT:    s_addc_u32 s0, 0, s0
9430 ; GFX9-NEXT:    s_mul_hi_u32 s15, s7, s13
9431 ; GFX9-NEXT:    s_mul_i32 s13, s7, s13
9432 ; GFX9-NEXT:    s_add_u32 s1, s1, s13
9433 ; GFX9-NEXT:    s_mul_hi_u32 s14, s7, s12
9434 ; GFX9-NEXT:    s_addc_u32 s0, s0, s15
9435 ; GFX9-NEXT:    s_addc_u32 s1, s14, 0
9436 ; GFX9-NEXT:    s_mul_i32 s12, s7, s12
9437 ; GFX9-NEXT:    s_add_u32 s12, s0, s12
9438 ; GFX9-NEXT:    s_addc_u32 s13, 0, s1
9439 ; GFX9-NEXT:    s_mul_i32 s0, s8, s13
9440 ; GFX9-NEXT:    s_mul_hi_u32 s1, s8, s12
9441 ; GFX9-NEXT:    s_add_i32 s0, s1, s0
9442 ; GFX9-NEXT:    s_mul_i32 s1, s9, s12
9443 ; GFX9-NEXT:    s_add_i32 s14, s0, s1
9444 ; GFX9-NEXT:    s_mul_i32 s1, s8, s12
9445 ; GFX9-NEXT:    v_mov_b32_e32 v2, s1
9446 ; GFX9-NEXT:    s_sub_i32 s0, s7, s14
9447 ; GFX9-NEXT:    v_sub_co_u32_e32 v2, vcc, s6, v2
9448 ; GFX9-NEXT:    s_cmp_lg_u64 vcc, 0
9449 ; GFX9-NEXT:    s_subb_u32 s6, s0, s9
9450 ; GFX9-NEXT:    v_subrev_co_u32_e64 v3, s[0:1], s8, v2
9451 ; GFX9-NEXT:    s_cmp_lg_u64 s[0:1], 0
9452 ; GFX9-NEXT:    s_subb_u32 s6, s6, 0
9453 ; GFX9-NEXT:    s_cmp_ge_u32 s6, s9
9454 ; GFX9-NEXT:    s_cselect_b32 s15, -1, 0
9455 ; GFX9-NEXT:    v_cmp_le_u32_e64 s[0:1], s8, v3
9456 ; GFX9-NEXT:    s_cmp_eq_u32 s6, s9
9457 ; GFX9-NEXT:    v_cndmask_b32_e64 v3, 0, -1, s[0:1]
9458 ; GFX9-NEXT:    v_mov_b32_e32 v5, s15
9459 ; GFX9-NEXT:    s_cselect_b64 s[0:1], -1, 0
9460 ; GFX9-NEXT:    v_cndmask_b32_e64 v3, v5, v3, s[0:1]
9461 ; GFX9-NEXT:    s_add_u32 s0, s12, 1
9462 ; GFX9-NEXT:    s_addc_u32 s6, s13, 0
9463 ; GFX9-NEXT:    s_add_u32 s1, s12, 2
9464 ; GFX9-NEXT:    s_addc_u32 s15, s13, 0
9465 ; GFX9-NEXT:    v_mov_b32_e32 v5, s0
9466 ; GFX9-NEXT:    v_mov_b32_e32 v6, s1
9467 ; GFX9-NEXT:    v_cmp_ne_u32_e64 s[0:1], 0, v3
9468 ; GFX9-NEXT:    v_cndmask_b32_e64 v3, v5, v6, s[0:1]
9469 ; GFX9-NEXT:    v_mov_b32_e32 v5, s6
9470 ; GFX9-NEXT:    v_mov_b32_e32 v6, s15
9471 ; GFX9-NEXT:    s_cmp_lg_u64 vcc, 0
9472 ; GFX9-NEXT:    v_cndmask_b32_e64 v5, v5, v6, s[0:1]
9473 ; GFX9-NEXT:    s_subb_u32 s0, s7, s14
9474 ; GFX9-NEXT:    s_cmp_ge_u32 s0, s9
9475 ; GFX9-NEXT:    s_cselect_b32 s1, -1, 0
9476 ; GFX9-NEXT:    v_cmp_le_u32_e32 vcc, s8, v2
9477 ; GFX9-NEXT:    s_cmp_eq_u32 s0, s9
9478 ; GFX9-NEXT:    v_cndmask_b32_e64 v2, 0, -1, vcc
9479 ; GFX9-NEXT:    v_mov_b32_e32 v6, s1
9480 ; GFX9-NEXT:    s_cselect_b64 vcc, -1, 0
9481 ; GFX9-NEXT:    v_cndmask_b32_e32 v2, v6, v2, vcc
9482 ; GFX9-NEXT:    v_mov_b32_e32 v6, s13
9483 ; GFX9-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v2
9484 ; GFX9-NEXT:    v_cndmask_b32_e32 v2, v6, v5, vcc
9485 ; GFX9-NEXT:    v_mov_b32_e32 v5, s12
9486 ; GFX9-NEXT:    v_cndmask_b32_e32 v3, v5, v3, vcc
9487 ; GFX9-NEXT:    s_xor_b64 s[0:1], s[10:11], s[4:5]
9488 ; GFX9-NEXT:    v_xor_b32_e32 v3, s0, v3
9489 ; GFX9-NEXT:    v_xor_b32_e32 v5, s1, v2
9490 ; GFX9-NEXT:    v_mov_b32_e32 v6, s1
9491 ; GFX9-NEXT:    v_subrev_co_u32_e32 v2, vcc, s0, v3
9492 ; GFX9-NEXT:    v_subb_co_u32_e32 v3, vcc, v5, v6, vcc
9493 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
9494 ; GFX9-NEXT:    global_store_dwordx4 v4, v[0:3], s[2:3]
9495 ; GFX9-NEXT:    s_endpgm
9496   %shl.y = shl <2 x i64> <i64 4096, i64 4096>, %y
9497   %r = sdiv <2 x i64> %x, %shl.y
9498   store <2 x i64> %r, ptr addrspace(1) %out
9499   ret void
9502 define amdgpu_kernel void @srem_i64_oddk_denom(ptr addrspace(1) %out, i64 %x) {
9503 ; CHECK-LABEL: @srem_i64_oddk_denom(
9504 ; CHECK-NEXT:    [[R:%.*]] = srem i64 [[X:%.*]], 1235195
9505 ; CHECK-NEXT:    store i64 [[R]], ptr addrspace(1) [[OUT:%.*]], align 8
9506 ; CHECK-NEXT:    ret void
9508 ; GFX6-LABEL: srem_i64_oddk_denom:
9509 ; GFX6:       ; %bb.0:
9510 ; GFX6-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
9511 ; GFX6-NEXT:    s_mov_b32 s0, 0x33fe64
9512 ; GFX6-NEXT:    s_add_u32 s0, 0x396, s0
9513 ; GFX6-NEXT:    v_mov_b32_e32 v0, 0x28100000
9514 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, s0, v0
9515 ; GFX6-NEXT:    s_addc_u32 s1, 0, 0
9516 ; GFX6-NEXT:    s_or_b32 s0, vcc_lo, vcc_hi
9517 ; GFX6-NEXT:    s_cmp_lg_u32 s0, 0
9518 ; GFX6-NEXT:    s_mov_b32 s0, 0xffed2705
9519 ; GFX6-NEXT:    v_mul_hi_u32 v1, v0, s0
9520 ; GFX6-NEXT:    s_addc_u32 s1, s1, 0xd95
9521 ; GFX6-NEXT:    v_mul_lo_u32 v2, v0, s0
9522 ; GFX6-NEXT:    s_mul_i32 s8, s1, 0xffed2705
9523 ; GFX6-NEXT:    v_add_i32_e32 v1, vcc, s8, v1
9524 ; GFX6-NEXT:    v_sub_i32_e32 v1, vcc, v1, v0
9525 ; GFX6-NEXT:    v_mul_lo_u32 v5, v0, v1
9526 ; GFX6-NEXT:    v_mul_hi_u32 v6, v0, v2
9527 ; GFX6-NEXT:    v_mul_hi_u32 v7, v0, v1
9528 ; GFX6-NEXT:    v_mul_hi_u32 v4, s1, v2
9529 ; GFX6-NEXT:    v_mul_lo_u32 v2, s1, v2
9530 ; GFX6-NEXT:    v_mul_hi_u32 v3, s1, v1
9531 ; GFX6-NEXT:    v_add_i32_e32 v5, vcc, v6, v5
9532 ; GFX6-NEXT:    v_addc_u32_e32 v6, vcc, 0, v7, vcc
9533 ; GFX6-NEXT:    v_mul_lo_u32 v1, s1, v1
9534 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, v5, v2
9535 ; GFX6-NEXT:    v_addc_u32_e32 v2, vcc, v6, v4, vcc
9536 ; GFX6-NEXT:    v_addc_u32_e32 v3, vcc, 0, v3, vcc
9537 ; GFX6-NEXT:    v_add_i32_e32 v1, vcc, v2, v1
9538 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
9539 ; GFX6-NEXT:    s_ashr_i32 s8, s7, 31
9540 ; GFX6-NEXT:    v_addc_u32_e32 v2, vcc, 0, v3, vcc
9541 ; GFX6-NEXT:    s_add_u32 s0, s6, s8
9542 ; GFX6-NEXT:    v_mov_b32_e32 v3, s1
9543 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, v0, v1
9544 ; GFX6-NEXT:    s_mov_b32 s9, s8
9545 ; GFX6-NEXT:    s_addc_u32 s1, s7, s8
9546 ; GFX6-NEXT:    v_addc_u32_e32 v1, vcc, v3, v2, vcc
9547 ; GFX6-NEXT:    s_xor_b64 s[6:7], s[0:1], s[8:9]
9548 ; GFX6-NEXT:    v_mul_lo_u32 v2, s6, v1
9549 ; GFX6-NEXT:    v_mul_hi_u32 v3, s6, v0
9550 ; GFX6-NEXT:    v_mul_hi_u32 v4, s6, v1
9551 ; GFX6-NEXT:    v_mul_hi_u32 v5, s7, v1
9552 ; GFX6-NEXT:    v_mul_lo_u32 v1, s7, v1
9553 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, v3, v2
9554 ; GFX6-NEXT:    v_addc_u32_e32 v3, vcc, 0, v4, vcc
9555 ; GFX6-NEXT:    v_mul_lo_u32 v4, s7, v0
9556 ; GFX6-NEXT:    v_mul_hi_u32 v0, s7, v0
9557 ; GFX6-NEXT:    s_mov_b32 s0, s4
9558 ; GFX6-NEXT:    s_mov_b32 s4, 0x12d8fb
9559 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, v2, v4
9560 ; GFX6-NEXT:    v_addc_u32_e32 v0, vcc, v3, v0, vcc
9561 ; GFX6-NEXT:    v_addc_u32_e32 v2, vcc, 0, v5, vcc
9562 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, v0, v1
9563 ; GFX6-NEXT:    v_addc_u32_e32 v1, vcc, 0, v2, vcc
9564 ; GFX6-NEXT:    v_mul_lo_u32 v1, v1, s4
9565 ; GFX6-NEXT:    v_mul_hi_u32 v2, v0, s4
9566 ; GFX6-NEXT:    v_mul_lo_u32 v0, v0, s4
9567 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
9568 ; GFX6-NEXT:    s_mov_b32 s2, -1
9569 ; GFX6-NEXT:    v_add_i32_e32 v1, vcc, v1, v2
9570 ; GFX6-NEXT:    v_mov_b32_e32 v2, s7
9571 ; GFX6-NEXT:    v_sub_i32_e32 v0, vcc, s6, v0
9572 ; GFX6-NEXT:    v_subb_u32_e32 v1, vcc, v2, v1, vcc
9573 ; GFX6-NEXT:    v_subrev_i32_e32 v2, vcc, s4, v0
9574 ; GFX6-NEXT:    v_subbrev_u32_e32 v3, vcc, 0, v1, vcc
9575 ; GFX6-NEXT:    v_subrev_i32_e32 v4, vcc, s4, v2
9576 ; GFX6-NEXT:    v_subbrev_u32_e32 v5, vcc, 0, v3, vcc
9577 ; GFX6-NEXT:    s_mov_b32 s4, 0x12d8fa
9578 ; GFX6-NEXT:    v_cmp_lt_u32_e32 vcc, s4, v2
9579 ; GFX6-NEXT:    v_cndmask_b32_e64 v6, 0, -1, vcc
9580 ; GFX6-NEXT:    v_cmp_eq_u32_e32 vcc, 0, v3
9581 ; GFX6-NEXT:    v_cndmask_b32_e32 v6, -1, v6, vcc
9582 ; GFX6-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v6
9583 ; GFX6-NEXT:    v_cndmask_b32_e32 v3, v3, v5, vcc
9584 ; GFX6-NEXT:    v_cndmask_b32_e32 v2, v2, v4, vcc
9585 ; GFX6-NEXT:    v_cmp_lt_u32_e32 vcc, s4, v0
9586 ; GFX6-NEXT:    v_cndmask_b32_e64 v4, 0, -1, vcc
9587 ; GFX6-NEXT:    v_cmp_eq_u32_e32 vcc, 0, v1
9588 ; GFX6-NEXT:    v_cndmask_b32_e32 v4, -1, v4, vcc
9589 ; GFX6-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v4
9590 ; GFX6-NEXT:    v_cndmask_b32_e32 v0, v0, v2, vcc
9591 ; GFX6-NEXT:    v_cndmask_b32_e32 v1, v1, v3, vcc
9592 ; GFX6-NEXT:    v_xor_b32_e32 v0, s8, v0
9593 ; GFX6-NEXT:    v_xor_b32_e32 v1, s8, v1
9594 ; GFX6-NEXT:    v_mov_b32_e32 v2, s8
9595 ; GFX6-NEXT:    v_subrev_i32_e32 v0, vcc, s8, v0
9596 ; GFX6-NEXT:    s_mov_b32 s1, s5
9597 ; GFX6-NEXT:    v_subb_u32_e32 v1, vcc, v1, v2, vcc
9598 ; GFX6-NEXT:    buffer_store_dwordx2 v[0:1], off, s[0:3], 0
9599 ; GFX6-NEXT:    s_endpgm
9601 ; GFX9-LABEL: srem_i64_oddk_denom:
9602 ; GFX9:       ; %bb.0:
9603 ; GFX9-NEXT:    s_mov_b32 s4, 0x33fe64
9604 ; GFX9-NEXT:    s_add_u32 s4, 0x396, s4
9605 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0x28100000
9606 ; GFX9-NEXT:    s_addc_u32 s5, 0, 0
9607 ; GFX9-NEXT:    v_add_co_u32_e32 v0, vcc, s4, v0
9608 ; GFX9-NEXT:    s_cmp_lg_u64 vcc, 0
9609 ; GFX9-NEXT:    s_addc_u32 s4, s5, 0xd95
9610 ; GFX9-NEXT:    v_readfirstlane_b32 s6, v0
9611 ; GFX9-NEXT:    s_mul_i32 s5, s4, 0xffed2705
9612 ; GFX9-NEXT:    s_mul_hi_u32 s7, s6, 0xffed2705
9613 ; GFX9-NEXT:    s_add_i32 s7, s7, s5
9614 ; GFX9-NEXT:    s_sub_i32 s5, s7, s6
9615 ; GFX9-NEXT:    s_mul_i32 s8, s6, 0xffed2705
9616 ; GFX9-NEXT:    s_mul_hi_u32 s11, s6, s5
9617 ; GFX9-NEXT:    s_mul_i32 s12, s6, s5
9618 ; GFX9-NEXT:    s_mul_hi_u32 s6, s6, s8
9619 ; GFX9-NEXT:    s_add_u32 s6, s6, s12
9620 ; GFX9-NEXT:    s_mul_hi_u32 s9, s4, s8
9621 ; GFX9-NEXT:    s_mul_i32 s10, s4, s8
9622 ; GFX9-NEXT:    s_addc_u32 s8, 0, s11
9623 ; GFX9-NEXT:    s_add_u32 s6, s6, s10
9624 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
9625 ; GFX9-NEXT:    s_mul_hi_u32 s7, s4, s5
9626 ; GFX9-NEXT:    s_addc_u32 s6, s8, s9
9627 ; GFX9-NEXT:    s_addc_u32 s7, s7, 0
9628 ; GFX9-NEXT:    s_mul_i32 s5, s4, s5
9629 ; GFX9-NEXT:    s_add_u32 s5, s6, s5
9630 ; GFX9-NEXT:    s_addc_u32 s6, 0, s7
9631 ; GFX9-NEXT:    v_add_co_u32_e32 v0, vcc, s5, v0
9632 ; GFX9-NEXT:    s_cmp_lg_u64 vcc, 0
9633 ; GFX9-NEXT:    s_addc_u32 s6, s4, s6
9634 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
9635 ; GFX9-NEXT:    s_ashr_i32 s4, s3, 31
9636 ; GFX9-NEXT:    s_add_u32 s2, s2, s4
9637 ; GFX9-NEXT:    s_mov_b32 s5, s4
9638 ; GFX9-NEXT:    s_addc_u32 s3, s3, s4
9639 ; GFX9-NEXT:    s_xor_b64 s[2:3], s[2:3], s[4:5]
9640 ; GFX9-NEXT:    v_readfirstlane_b32 s8, v0
9641 ; GFX9-NEXT:    s_mul_i32 s7, s2, s6
9642 ; GFX9-NEXT:    s_mul_hi_u32 s9, s2, s8
9643 ; GFX9-NEXT:    s_mul_hi_u32 s5, s2, s6
9644 ; GFX9-NEXT:    s_add_u32 s7, s9, s7
9645 ; GFX9-NEXT:    s_addc_u32 s5, 0, s5
9646 ; GFX9-NEXT:    s_mul_hi_u32 s10, s3, s8
9647 ; GFX9-NEXT:    s_mul_i32 s8, s3, s8
9648 ; GFX9-NEXT:    s_add_u32 s7, s7, s8
9649 ; GFX9-NEXT:    s_mul_hi_u32 s9, s3, s6
9650 ; GFX9-NEXT:    s_addc_u32 s5, s5, s10
9651 ; GFX9-NEXT:    s_addc_u32 s7, s9, 0
9652 ; GFX9-NEXT:    s_mul_i32 s6, s3, s6
9653 ; GFX9-NEXT:    s_add_u32 s5, s5, s6
9654 ; GFX9-NEXT:    s_addc_u32 s6, 0, s7
9655 ; GFX9-NEXT:    s_mul_hi_u32 s8, s5, 0x12d8fb
9656 ; GFX9-NEXT:    s_mul_i32 s5, s5, 0x12d8fb
9657 ; GFX9-NEXT:    s_mul_i32 s6, s6, 0x12d8fb
9658 ; GFX9-NEXT:    v_mov_b32_e32 v0, s5
9659 ; GFX9-NEXT:    s_add_i32 s8, s8, s6
9660 ; GFX9-NEXT:    v_sub_co_u32_e32 v0, vcc, s2, v0
9661 ; GFX9-NEXT:    s_mov_b32 s7, 0x12d8fb
9662 ; GFX9-NEXT:    s_cmp_lg_u64 vcc, 0
9663 ; GFX9-NEXT:    s_subb_u32 s2, s3, s8
9664 ; GFX9-NEXT:    v_subrev_co_u32_e32 v1, vcc, s7, v0
9665 ; GFX9-NEXT:    s_cmp_lg_u64 vcc, 0
9666 ; GFX9-NEXT:    s_subb_u32 s3, s2, 0
9667 ; GFX9-NEXT:    v_subrev_co_u32_e32 v3, vcc, s7, v1
9668 ; GFX9-NEXT:    s_cmp_lg_u64 vcc, 0
9669 ; GFX9-NEXT:    s_subb_u32 s5, s3, 0
9670 ; GFX9-NEXT:    s_mov_b32 s6, 0x12d8fa
9671 ; GFX9-NEXT:    v_cmp_lt_u32_e32 vcc, s6, v1
9672 ; GFX9-NEXT:    s_cmp_eq_u32 s3, 0
9673 ; GFX9-NEXT:    v_cndmask_b32_e64 v4, 0, -1, vcc
9674 ; GFX9-NEXT:    s_cselect_b64 vcc, -1, 0
9675 ; GFX9-NEXT:    v_cndmask_b32_e32 v4, -1, v4, vcc
9676 ; GFX9-NEXT:    v_mov_b32_e32 v5, s3
9677 ; GFX9-NEXT:    v_mov_b32_e32 v6, s5
9678 ; GFX9-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v4
9679 ; GFX9-NEXT:    v_cndmask_b32_e32 v4, v5, v6, vcc
9680 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, v1, v3, vcc
9681 ; GFX9-NEXT:    v_cmp_lt_u32_e32 vcc, s6, v0
9682 ; GFX9-NEXT:    s_cmp_eq_u32 s2, 0
9683 ; GFX9-NEXT:    v_cndmask_b32_e64 v3, 0, -1, vcc
9684 ; GFX9-NEXT:    s_cselect_b64 vcc, -1, 0
9685 ; GFX9-NEXT:    v_cndmask_b32_e32 v3, -1, v3, vcc
9686 ; GFX9-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v3
9687 ; GFX9-NEXT:    v_mov_b32_e32 v5, s2
9688 ; GFX9-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
9689 ; GFX9-NEXT:    v_cndmask_b32_e32 v3, v5, v4, vcc
9690 ; GFX9-NEXT:    v_xor_b32_e32 v0, s4, v0
9691 ; GFX9-NEXT:    v_xor_b32_e32 v1, s4, v3
9692 ; GFX9-NEXT:    v_mov_b32_e32 v3, s4
9693 ; GFX9-NEXT:    v_subrev_co_u32_e32 v0, vcc, s4, v0
9694 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0
9695 ; GFX9-NEXT:    v_subb_co_u32_e32 v1, vcc, v1, v3, vcc
9696 ; GFX9-NEXT:    global_store_dwordx2 v2, v[0:1], s[0:1]
9697 ; GFX9-NEXT:    s_endpgm
9698   %r = srem i64 %x, 1235195
9699   store i64 %r, ptr addrspace(1) %out
9700   ret void
9703 define amdgpu_kernel void @srem_i64_pow2k_denom(ptr addrspace(1) %out, i64 %x) {
9704 ; CHECK-LABEL: @srem_i64_pow2k_denom(
9705 ; CHECK-NEXT:    [[R:%.*]] = srem i64 [[X:%.*]], 4096
9706 ; CHECK-NEXT:    store i64 [[R]], ptr addrspace(1) [[OUT:%.*]], align 8
9707 ; CHECK-NEXT:    ret void
9709 ; GFX6-LABEL: srem_i64_pow2k_denom:
9710 ; GFX6:       ; %bb.0:
9711 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
9712 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
9713 ; GFX6-NEXT:    s_mov_b32 s6, -1
9714 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
9715 ; GFX6-NEXT:    s_mov_b32 s4, s0
9716 ; GFX6-NEXT:    s_ashr_i32 s0, s3, 31
9717 ; GFX6-NEXT:    s_lshr_b32 s0, s0, 20
9718 ; GFX6-NEXT:    s_add_u32 s0, s2, s0
9719 ; GFX6-NEXT:    s_mov_b32 s5, s1
9720 ; GFX6-NEXT:    s_addc_u32 s1, s3, 0
9721 ; GFX6-NEXT:    s_and_b32 s0, s0, 0xfffff000
9722 ; GFX6-NEXT:    s_sub_u32 s0, s2, s0
9723 ; GFX6-NEXT:    s_subb_u32 s1, s3, s1
9724 ; GFX6-NEXT:    v_mov_b32_e32 v0, s0
9725 ; GFX6-NEXT:    v_mov_b32_e32 v1, s1
9726 ; GFX6-NEXT:    buffer_store_dwordx2 v[0:1], off, s[4:7], 0
9727 ; GFX6-NEXT:    s_endpgm
9729 ; GFX9-LABEL: srem_i64_pow2k_denom:
9730 ; GFX9:       ; %bb.0:
9731 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
9732 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0
9733 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
9734 ; GFX9-NEXT:    s_ashr_i32 s4, s3, 31
9735 ; GFX9-NEXT:    s_lshr_b32 s4, s4, 20
9736 ; GFX9-NEXT:    s_add_u32 s4, s2, s4
9737 ; GFX9-NEXT:    s_addc_u32 s5, s3, 0
9738 ; GFX9-NEXT:    s_and_b32 s4, s4, 0xfffff000
9739 ; GFX9-NEXT:    s_sub_u32 s2, s2, s4
9740 ; GFX9-NEXT:    s_subb_u32 s3, s3, s5
9741 ; GFX9-NEXT:    v_mov_b32_e32 v0, s2
9742 ; GFX9-NEXT:    v_mov_b32_e32 v1, s3
9743 ; GFX9-NEXT:    global_store_dwordx2 v2, v[0:1], s[0:1]
9744 ; GFX9-NEXT:    s_endpgm
9745   %r = srem i64 %x, 4096
9746   store i64 %r, ptr addrspace(1) %out
9747   ret void
9750 define amdgpu_kernel void @srem_i64_pow2_shl_denom(ptr addrspace(1) %out, i64 %x, i64 %y) {
9751 ; CHECK-LABEL: @srem_i64_pow2_shl_denom(
9752 ; CHECK-NEXT:    [[SHL_Y:%.*]] = shl i64 4096, [[Y:%.*]]
9753 ; CHECK-NEXT:    [[R:%.*]] = srem i64 [[X:%.*]], [[SHL_Y]]
9754 ; CHECK-NEXT:    store i64 [[R]], ptr addrspace(1) [[OUT:%.*]], align 8
9755 ; CHECK-NEXT:    ret void
9757 ; GFX6-LABEL: srem_i64_pow2_shl_denom:
9758 ; GFX6:       ; %bb.0:
9759 ; GFX6-NEXT:    s_load_dword s2, s[0:1], 0xd
9760 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
9761 ; GFX6-NEXT:    s_mov_b32 s6, -1
9762 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
9763 ; GFX6-NEXT:    s_lshl_b64 s[2:3], 0x1000, s2
9764 ; GFX6-NEXT:    s_ashr_i32 s4, s3, 31
9765 ; GFX6-NEXT:    s_add_u32 s2, s2, s4
9766 ; GFX6-NEXT:    s_mov_b32 s5, s4
9767 ; GFX6-NEXT:    s_addc_u32 s3, s3, s4
9768 ; GFX6-NEXT:    s_xor_b64 s[8:9], s[2:3], s[4:5]
9769 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v0, s8
9770 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v1, s9
9771 ; GFX6-NEXT:    s_sub_u32 s4, 0, s8
9772 ; GFX6-NEXT:    s_subb_u32 s5, 0, s9
9773 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
9774 ; GFX6-NEXT:    v_madmk_f32 v0, v1, 0x4f800000, v0
9775 ; GFX6-NEXT:    v_rcp_f32_e32 v0, v0
9776 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
9777 ; GFX6-NEXT:    s_ashr_i32 s10, s3, 31
9778 ; GFX6-NEXT:    v_mul_f32_e32 v0, 0x5f7ffffc, v0
9779 ; GFX6-NEXT:    v_mul_f32_e32 v1, 0x2f800000, v0
9780 ; GFX6-NEXT:    v_trunc_f32_e32 v1, v1
9781 ; GFX6-NEXT:    v_madmk_f32 v0, v1, 0xcf800000, v0
9782 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v1, v1
9783 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v0, v0
9784 ; GFX6-NEXT:    s_add_u32 s2, s2, s10
9785 ; GFX6-NEXT:    s_mov_b32 s11, s10
9786 ; GFX6-NEXT:    v_mul_lo_u32 v2, s4, v1
9787 ; GFX6-NEXT:    v_mul_hi_u32 v3, s4, v0
9788 ; GFX6-NEXT:    v_mul_lo_u32 v5, s5, v0
9789 ; GFX6-NEXT:    v_mul_lo_u32 v4, s4, v0
9790 ; GFX6-NEXT:    s_addc_u32 s3, s3, s10
9791 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, v2, v3
9792 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, v2, v5
9793 ; GFX6-NEXT:    v_mul_hi_u32 v3, v0, v4
9794 ; GFX6-NEXT:    v_mul_lo_u32 v5, v0, v2
9795 ; GFX6-NEXT:    v_mul_hi_u32 v7, v0, v2
9796 ; GFX6-NEXT:    v_mul_lo_u32 v6, v1, v4
9797 ; GFX6-NEXT:    v_mul_hi_u32 v4, v1, v4
9798 ; GFX6-NEXT:    v_mul_hi_u32 v8, v1, v2
9799 ; GFX6-NEXT:    v_add_i32_e32 v3, vcc, v3, v5
9800 ; GFX6-NEXT:    v_addc_u32_e32 v5, vcc, 0, v7, vcc
9801 ; GFX6-NEXT:    v_mul_lo_u32 v2, v1, v2
9802 ; GFX6-NEXT:    v_add_i32_e32 v3, vcc, v3, v6
9803 ; GFX6-NEXT:    v_addc_u32_e32 v3, vcc, v5, v4, vcc
9804 ; GFX6-NEXT:    v_addc_u32_e32 v4, vcc, 0, v8, vcc
9805 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, v3, v2
9806 ; GFX6-NEXT:    v_addc_u32_e32 v3, vcc, 0, v4, vcc
9807 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, v0, v2
9808 ; GFX6-NEXT:    v_addc_u32_e32 v1, vcc, v1, v3, vcc
9809 ; GFX6-NEXT:    v_mul_lo_u32 v2, s4, v1
9810 ; GFX6-NEXT:    v_mul_hi_u32 v3, s4, v0
9811 ; GFX6-NEXT:    v_mul_lo_u32 v4, s5, v0
9812 ; GFX6-NEXT:    s_xor_b64 s[12:13], s[2:3], s[10:11]
9813 ; GFX6-NEXT:    s_mov_b32 s5, s1
9814 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, v2, v3
9815 ; GFX6-NEXT:    v_mul_lo_u32 v3, s4, v0
9816 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, v2, v4
9817 ; GFX6-NEXT:    v_mul_lo_u32 v6, v0, v2
9818 ; GFX6-NEXT:    v_mul_hi_u32 v7, v0, v3
9819 ; GFX6-NEXT:    v_mul_hi_u32 v8, v0, v2
9820 ; GFX6-NEXT:    v_mul_hi_u32 v5, v1, v3
9821 ; GFX6-NEXT:    v_mul_lo_u32 v3, v1, v3
9822 ; GFX6-NEXT:    v_mul_hi_u32 v4, v1, v2
9823 ; GFX6-NEXT:    v_add_i32_e32 v6, vcc, v7, v6
9824 ; GFX6-NEXT:    v_addc_u32_e32 v7, vcc, 0, v8, vcc
9825 ; GFX6-NEXT:    v_mul_lo_u32 v2, v1, v2
9826 ; GFX6-NEXT:    v_add_i32_e32 v3, vcc, v6, v3
9827 ; GFX6-NEXT:    v_addc_u32_e32 v3, vcc, v7, v5, vcc
9828 ; GFX6-NEXT:    v_addc_u32_e32 v4, vcc, 0, v4, vcc
9829 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, v3, v2
9830 ; GFX6-NEXT:    v_addc_u32_e32 v3, vcc, 0, v4, vcc
9831 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, v0, v2
9832 ; GFX6-NEXT:    v_addc_u32_e32 v1, vcc, v1, v3, vcc
9833 ; GFX6-NEXT:    v_mul_lo_u32 v2, s12, v1
9834 ; GFX6-NEXT:    v_mul_hi_u32 v3, s12, v0
9835 ; GFX6-NEXT:    v_mul_hi_u32 v4, s12, v1
9836 ; GFX6-NEXT:    v_mul_hi_u32 v5, s13, v1
9837 ; GFX6-NEXT:    v_mul_lo_u32 v1, s13, v1
9838 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, v3, v2
9839 ; GFX6-NEXT:    v_addc_u32_e32 v3, vcc, 0, v4, vcc
9840 ; GFX6-NEXT:    v_mul_lo_u32 v4, s13, v0
9841 ; GFX6-NEXT:    v_mul_hi_u32 v0, s13, v0
9842 ; GFX6-NEXT:    s_mov_b32 s4, s0
9843 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, v2, v4
9844 ; GFX6-NEXT:    v_addc_u32_e32 v0, vcc, v3, v0, vcc
9845 ; GFX6-NEXT:    v_addc_u32_e32 v2, vcc, 0, v5, vcc
9846 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, v0, v1
9847 ; GFX6-NEXT:    v_addc_u32_e32 v1, vcc, 0, v2, vcc
9848 ; GFX6-NEXT:    v_mul_lo_u32 v1, s8, v1
9849 ; GFX6-NEXT:    v_mul_hi_u32 v2, s8, v0
9850 ; GFX6-NEXT:    v_mul_lo_u32 v3, s9, v0
9851 ; GFX6-NEXT:    v_mul_lo_u32 v0, s8, v0
9852 ; GFX6-NEXT:    v_add_i32_e32 v1, vcc, v1, v2
9853 ; GFX6-NEXT:    v_add_i32_e32 v1, vcc, v3, v1
9854 ; GFX6-NEXT:    v_sub_i32_e32 v2, vcc, s13, v1
9855 ; GFX6-NEXT:    v_mov_b32_e32 v3, s9
9856 ; GFX6-NEXT:    v_sub_i32_e32 v0, vcc, s12, v0
9857 ; GFX6-NEXT:    v_subb_u32_e64 v2, s[0:1], v2, v3, vcc
9858 ; GFX6-NEXT:    v_subrev_i32_e64 v4, s[0:1], s8, v0
9859 ; GFX6-NEXT:    v_subbrev_u32_e64 v5, s[2:3], 0, v2, s[0:1]
9860 ; GFX6-NEXT:    v_cmp_le_u32_e64 s[2:3], s9, v5
9861 ; GFX6-NEXT:    v_cndmask_b32_e64 v6, 0, -1, s[2:3]
9862 ; GFX6-NEXT:    v_cmp_le_u32_e64 s[2:3], s8, v4
9863 ; GFX6-NEXT:    v_subb_u32_e64 v2, s[0:1], v2, v3, s[0:1]
9864 ; GFX6-NEXT:    v_cndmask_b32_e64 v7, 0, -1, s[2:3]
9865 ; GFX6-NEXT:    v_cmp_eq_u32_e64 s[2:3], s9, v5
9866 ; GFX6-NEXT:    v_subrev_i32_e64 v3, s[0:1], s8, v4
9867 ; GFX6-NEXT:    v_cndmask_b32_e64 v6, v6, v7, s[2:3]
9868 ; GFX6-NEXT:    v_subbrev_u32_e64 v2, s[0:1], 0, v2, s[0:1]
9869 ; GFX6-NEXT:    v_cmp_ne_u32_e64 s[0:1], 0, v6
9870 ; GFX6-NEXT:    v_cndmask_b32_e64 v3, v4, v3, s[0:1]
9871 ; GFX6-NEXT:    v_mov_b32_e32 v4, s13
9872 ; GFX6-NEXT:    v_subb_u32_e32 v1, vcc, v4, v1, vcc
9873 ; GFX6-NEXT:    v_cmp_le_u32_e32 vcc, s9, v1
9874 ; GFX6-NEXT:    v_cndmask_b32_e64 v4, 0, -1, vcc
9875 ; GFX6-NEXT:    v_cmp_le_u32_e32 vcc, s8, v0
9876 ; GFX6-NEXT:    v_cndmask_b32_e64 v2, v5, v2, s[0:1]
9877 ; GFX6-NEXT:    v_cndmask_b32_e64 v5, 0, -1, vcc
9878 ; GFX6-NEXT:    v_cmp_eq_u32_e32 vcc, s9, v1
9879 ; GFX6-NEXT:    v_cndmask_b32_e32 v4, v4, v5, vcc
9880 ; GFX6-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v4
9881 ; GFX6-NEXT:    v_cndmask_b32_e32 v0, v0, v3, vcc
9882 ; GFX6-NEXT:    v_cndmask_b32_e32 v1, v1, v2, vcc
9883 ; GFX6-NEXT:    v_xor_b32_e32 v0, s10, v0
9884 ; GFX6-NEXT:    v_xor_b32_e32 v1, s10, v1
9885 ; GFX6-NEXT:    v_mov_b32_e32 v2, s10
9886 ; GFX6-NEXT:    v_subrev_i32_e32 v0, vcc, s10, v0
9887 ; GFX6-NEXT:    v_subb_u32_e32 v1, vcc, v1, v2, vcc
9888 ; GFX6-NEXT:    buffer_store_dwordx2 v[0:1], off, s[4:7], 0
9889 ; GFX6-NEXT:    s_endpgm
9891 ; GFX9-LABEL: srem_i64_pow2_shl_denom:
9892 ; GFX9:       ; %bb.0:
9893 ; GFX9-NEXT:    s_load_dword s2, s[0:1], 0x34
9894 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
9895 ; GFX9-NEXT:    s_lshl_b64 s[2:3], 0x1000, s2
9896 ; GFX9-NEXT:    s_ashr_i32 s4, s3, 31
9897 ; GFX9-NEXT:    s_add_u32 s2, s2, s4
9898 ; GFX9-NEXT:    s_mov_b32 s5, s4
9899 ; GFX9-NEXT:    s_addc_u32 s3, s3, s4
9900 ; GFX9-NEXT:    s_xor_b64 s[8:9], s[2:3], s[4:5]
9901 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v0, s8
9902 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v1, s9
9903 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
9904 ; GFX9-NEXT:    s_sub_u32 s0, 0, s8
9905 ; GFX9-NEXT:    s_subb_u32 s1, 0, s9
9906 ; GFX9-NEXT:    v_madmk_f32 v0, v1, 0x4f800000, v0
9907 ; GFX9-NEXT:    v_rcp_f32_e32 v1, v0
9908 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
9909 ; GFX9-NEXT:    v_mul_f32_e32 v1, 0x5f7ffffc, v1
9910 ; GFX9-NEXT:    v_mul_f32_e32 v2, 0x2f800000, v1
9911 ; GFX9-NEXT:    v_trunc_f32_e32 v2, v2
9912 ; GFX9-NEXT:    v_madmk_f32 v1, v2, 0xcf800000, v1
9913 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v2, v2
9914 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v1, v1
9915 ; GFX9-NEXT:    v_readfirstlane_b32 s2, v2
9916 ; GFX9-NEXT:    v_readfirstlane_b32 s3, v1
9917 ; GFX9-NEXT:    s_mul_i32 s10, s0, s2
9918 ; GFX9-NEXT:    s_mul_hi_u32 s12, s0, s3
9919 ; GFX9-NEXT:    s_mul_i32 s11, s1, s3
9920 ; GFX9-NEXT:    s_add_i32 s10, s12, s10
9921 ; GFX9-NEXT:    s_mul_i32 s13, s0, s3
9922 ; GFX9-NEXT:    s_add_i32 s10, s10, s11
9923 ; GFX9-NEXT:    s_mul_hi_u32 s12, s3, s13
9924 ; GFX9-NEXT:    s_mul_hi_u32 s11, s3, s10
9925 ; GFX9-NEXT:    s_mul_i32 s3, s3, s10
9926 ; GFX9-NEXT:    s_add_u32 s3, s12, s3
9927 ; GFX9-NEXT:    s_addc_u32 s11, 0, s11
9928 ; GFX9-NEXT:    s_mul_hi_u32 s14, s2, s13
9929 ; GFX9-NEXT:    s_mul_i32 s13, s2, s13
9930 ; GFX9-NEXT:    s_add_u32 s3, s3, s13
9931 ; GFX9-NEXT:    s_mul_hi_u32 s12, s2, s10
9932 ; GFX9-NEXT:    s_addc_u32 s3, s11, s14
9933 ; GFX9-NEXT:    s_addc_u32 s11, s12, 0
9934 ; GFX9-NEXT:    s_mul_i32 s10, s2, s10
9935 ; GFX9-NEXT:    s_add_u32 s3, s3, s10
9936 ; GFX9-NEXT:    s_addc_u32 s10, 0, s11
9937 ; GFX9-NEXT:    v_add_co_u32_e32 v1, vcc, s3, v1
9938 ; GFX9-NEXT:    s_cmp_lg_u64 vcc, 0
9939 ; GFX9-NEXT:    s_addc_u32 s2, s2, s10
9940 ; GFX9-NEXT:    v_readfirstlane_b32 s10, v1
9941 ; GFX9-NEXT:    s_mul_i32 s3, s0, s2
9942 ; GFX9-NEXT:    s_mul_hi_u32 s11, s0, s10
9943 ; GFX9-NEXT:    s_add_i32 s3, s11, s3
9944 ; GFX9-NEXT:    s_mul_i32 s1, s1, s10
9945 ; GFX9-NEXT:    s_add_i32 s3, s3, s1
9946 ; GFX9-NEXT:    s_mul_i32 s0, s0, s10
9947 ; GFX9-NEXT:    s_mul_hi_u32 s11, s2, s0
9948 ; GFX9-NEXT:    s_mul_i32 s12, s2, s0
9949 ; GFX9-NEXT:    s_mul_i32 s14, s10, s3
9950 ; GFX9-NEXT:    s_mul_hi_u32 s0, s10, s0
9951 ; GFX9-NEXT:    s_mul_hi_u32 s13, s10, s3
9952 ; GFX9-NEXT:    s_add_u32 s0, s0, s14
9953 ; GFX9-NEXT:    s_addc_u32 s10, 0, s13
9954 ; GFX9-NEXT:    s_add_u32 s0, s0, s12
9955 ; GFX9-NEXT:    s_mul_hi_u32 s1, s2, s3
9956 ; GFX9-NEXT:    s_addc_u32 s0, s10, s11
9957 ; GFX9-NEXT:    s_addc_u32 s1, s1, 0
9958 ; GFX9-NEXT:    s_mul_i32 s3, s2, s3
9959 ; GFX9-NEXT:    s_add_u32 s0, s0, s3
9960 ; GFX9-NEXT:    s_addc_u32 s1, 0, s1
9961 ; GFX9-NEXT:    v_add_co_u32_e32 v1, vcc, s0, v1
9962 ; GFX9-NEXT:    s_cmp_lg_u64 vcc, 0
9963 ; GFX9-NEXT:    s_addc_u32 s2, s2, s1
9964 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
9965 ; GFX9-NEXT:    s_ashr_i32 s10, s7, 31
9966 ; GFX9-NEXT:    s_add_u32 s0, s6, s10
9967 ; GFX9-NEXT:    s_mov_b32 s11, s10
9968 ; GFX9-NEXT:    s_addc_u32 s1, s7, s10
9969 ; GFX9-NEXT:    s_xor_b64 s[6:7], s[0:1], s[10:11]
9970 ; GFX9-NEXT:    v_readfirstlane_b32 s3, v1
9971 ; GFX9-NEXT:    s_mul_i32 s1, s6, s2
9972 ; GFX9-NEXT:    s_mul_hi_u32 s11, s6, s3
9973 ; GFX9-NEXT:    s_mul_hi_u32 s0, s6, s2
9974 ; GFX9-NEXT:    s_add_u32 s1, s11, s1
9975 ; GFX9-NEXT:    s_addc_u32 s0, 0, s0
9976 ; GFX9-NEXT:    s_mul_hi_u32 s12, s7, s3
9977 ; GFX9-NEXT:    s_mul_i32 s3, s7, s3
9978 ; GFX9-NEXT:    s_add_u32 s1, s1, s3
9979 ; GFX9-NEXT:    s_mul_hi_u32 s11, s7, s2
9980 ; GFX9-NEXT:    s_addc_u32 s0, s0, s12
9981 ; GFX9-NEXT:    s_addc_u32 s1, s11, 0
9982 ; GFX9-NEXT:    s_mul_i32 s2, s7, s2
9983 ; GFX9-NEXT:    s_add_u32 s0, s0, s2
9984 ; GFX9-NEXT:    s_addc_u32 s1, 0, s1
9985 ; GFX9-NEXT:    s_mul_i32 s1, s8, s1
9986 ; GFX9-NEXT:    s_mul_hi_u32 s2, s8, s0
9987 ; GFX9-NEXT:    s_add_i32 s1, s2, s1
9988 ; GFX9-NEXT:    s_mul_i32 s2, s9, s0
9989 ; GFX9-NEXT:    s_mul_i32 s0, s8, s0
9990 ; GFX9-NEXT:    s_add_i32 s11, s1, s2
9991 ; GFX9-NEXT:    v_mov_b32_e32 v1, s0
9992 ; GFX9-NEXT:    s_sub_i32 s1, s7, s11
9993 ; GFX9-NEXT:    v_sub_co_u32_e32 v1, vcc, s6, v1
9994 ; GFX9-NEXT:    s_cmp_lg_u64 vcc, 0
9995 ; GFX9-NEXT:    s_subb_u32 s6, s1, s9
9996 ; GFX9-NEXT:    v_subrev_co_u32_e64 v2, s[0:1], s8, v1
9997 ; GFX9-NEXT:    s_cmp_lg_u64 s[0:1], 0
9998 ; GFX9-NEXT:    s_subb_u32 s12, s6, 0
9999 ; GFX9-NEXT:    s_cmp_ge_u32 s12, s9
10000 ; GFX9-NEXT:    s_cselect_b32 s13, -1, 0
10001 ; GFX9-NEXT:    v_cmp_le_u32_e64 s[2:3], s8, v2
10002 ; GFX9-NEXT:    s_cmp_eq_u32 s12, s9
10003 ; GFX9-NEXT:    v_cndmask_b32_e64 v3, 0, -1, s[2:3]
10004 ; GFX9-NEXT:    v_mov_b32_e32 v4, s13
10005 ; GFX9-NEXT:    s_cselect_b64 s[2:3], -1, 0
10006 ; GFX9-NEXT:    s_cmp_lg_u64 s[0:1], 0
10007 ; GFX9-NEXT:    v_cndmask_b32_e64 v3, v4, v3, s[2:3]
10008 ; GFX9-NEXT:    s_subb_u32 s2, s6, s9
10009 ; GFX9-NEXT:    v_subrev_co_u32_e64 v4, s[0:1], s8, v2
10010 ; GFX9-NEXT:    s_cmp_lg_u64 s[0:1], 0
10011 ; GFX9-NEXT:    s_subb_u32 s2, s2, 0
10012 ; GFX9-NEXT:    v_cmp_ne_u32_e64 s[0:1], 0, v3
10013 ; GFX9-NEXT:    v_cndmask_b32_e64 v2, v2, v4, s[0:1]
10014 ; GFX9-NEXT:    v_mov_b32_e32 v3, s12
10015 ; GFX9-NEXT:    v_mov_b32_e32 v4, s2
10016 ; GFX9-NEXT:    s_cmp_lg_u64 vcc, 0
10017 ; GFX9-NEXT:    v_cndmask_b32_e64 v3, v3, v4, s[0:1]
10018 ; GFX9-NEXT:    s_subb_u32 s0, s7, s11
10019 ; GFX9-NEXT:    s_cmp_ge_u32 s0, s9
10020 ; GFX9-NEXT:    s_cselect_b32 s1, -1, 0
10021 ; GFX9-NEXT:    v_cmp_le_u32_e32 vcc, s8, v1
10022 ; GFX9-NEXT:    s_cmp_eq_u32 s0, s9
10023 ; GFX9-NEXT:    v_cndmask_b32_e64 v4, 0, -1, vcc
10024 ; GFX9-NEXT:    v_mov_b32_e32 v5, s1
10025 ; GFX9-NEXT:    s_cselect_b64 vcc, -1, 0
10026 ; GFX9-NEXT:    v_cndmask_b32_e32 v4, v5, v4, vcc
10027 ; GFX9-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v4
10028 ; GFX9-NEXT:    v_mov_b32_e32 v5, s0
10029 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, v1, v2, vcc
10030 ; GFX9-NEXT:    v_cndmask_b32_e32 v3, v5, v3, vcc
10031 ; GFX9-NEXT:    v_xor_b32_e32 v1, s10, v1
10032 ; GFX9-NEXT:    v_xor_b32_e32 v2, s10, v3
10033 ; GFX9-NEXT:    v_mov_b32_e32 v3, s10
10034 ; GFX9-NEXT:    v_subrev_co_u32_e32 v1, vcc, s10, v1
10035 ; GFX9-NEXT:    v_subb_co_u32_e32 v2, vcc, v2, v3, vcc
10036 ; GFX9-NEXT:    global_store_dwordx2 v0, v[1:2], s[4:5]
10037 ; GFX9-NEXT:    s_endpgm
10038   %shl.y = shl i64 4096, %y
10039   %r = srem i64 %x, %shl.y
10040   store i64 %r, ptr addrspace(1) %out
10041   ret void
10044 define amdgpu_kernel void @srem_v2i64_pow2k_denom(ptr addrspace(1) %out, <2 x i64> %x) {
10045 ; CHECK-LABEL: @srem_v2i64_pow2k_denom(
10046 ; CHECK-NEXT:    [[TMP1:%.*]] = extractelement <2 x i64> [[X:%.*]], i64 0
10047 ; CHECK-NEXT:    [[TMP2:%.*]] = srem i64 [[TMP1]], 4096
10048 ; CHECK-NEXT:    [[TMP3:%.*]] = insertelement <2 x i64> poison, i64 [[TMP2]], i64 0
10049 ; CHECK-NEXT:    [[TMP4:%.*]] = extractelement <2 x i64> [[X]], i64 1
10050 ; CHECK-NEXT:    [[TMP5:%.*]] = srem i64 [[TMP4]], 4096
10051 ; CHECK-NEXT:    [[TMP6:%.*]] = insertelement <2 x i64> [[TMP3]], i64 [[TMP5]], i64 1
10052 ; CHECK-NEXT:    store <2 x i64> [[TMP6]], ptr addrspace(1) [[OUT:%.*]], align 16
10053 ; CHECK-NEXT:    ret void
10055 ; GFX6-LABEL: srem_v2i64_pow2k_denom:
10056 ; GFX6:       ; %bb.0:
10057 ; GFX6-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0xd
10058 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
10059 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
10060 ; GFX6-NEXT:    s_mov_b32 s2, -1
10061 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
10062 ; GFX6-NEXT:    s_ashr_i32 s8, s5, 31
10063 ; GFX6-NEXT:    s_lshr_b32 s8, s8, 20
10064 ; GFX6-NEXT:    s_add_u32 s8, s4, s8
10065 ; GFX6-NEXT:    s_addc_u32 s9, s5, 0
10066 ; GFX6-NEXT:    s_and_b32 s8, s8, 0xfffff000
10067 ; GFX6-NEXT:    s_sub_u32 s4, s4, s8
10068 ; GFX6-NEXT:    s_subb_u32 s5, s5, s9
10069 ; GFX6-NEXT:    s_ashr_i32 s8, s7, 31
10070 ; GFX6-NEXT:    s_lshr_b32 s8, s8, 20
10071 ; GFX6-NEXT:    s_add_u32 s8, s6, s8
10072 ; GFX6-NEXT:    s_addc_u32 s9, s7, 0
10073 ; GFX6-NEXT:    s_and_b32 s8, s8, 0xfffff000
10074 ; GFX6-NEXT:    s_sub_u32 s6, s6, s8
10075 ; GFX6-NEXT:    s_subb_u32 s7, s7, s9
10076 ; GFX6-NEXT:    v_mov_b32_e32 v0, s4
10077 ; GFX6-NEXT:    v_mov_b32_e32 v1, s5
10078 ; GFX6-NEXT:    v_mov_b32_e32 v2, s6
10079 ; GFX6-NEXT:    v_mov_b32_e32 v3, s7
10080 ; GFX6-NEXT:    buffer_store_dwordx4 v[0:3], off, s[0:3], 0
10081 ; GFX6-NEXT:    s_endpgm
10083 ; GFX9-LABEL: srem_v2i64_pow2k_denom:
10084 ; GFX9:       ; %bb.0:
10085 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x34
10086 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
10087 ; GFX9-NEXT:    v_mov_b32_e32 v4, 0
10088 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
10089 ; GFX9-NEXT:    s_ashr_i32 s0, s5, 31
10090 ; GFX9-NEXT:    s_lshr_b32 s0, s0, 20
10091 ; GFX9-NEXT:    s_add_u32 s0, s4, s0
10092 ; GFX9-NEXT:    s_addc_u32 s1, s5, 0
10093 ; GFX9-NEXT:    s_and_b32 s0, s0, 0xfffff000
10094 ; GFX9-NEXT:    s_sub_u32 s0, s4, s0
10095 ; GFX9-NEXT:    s_subb_u32 s1, s5, s1
10096 ; GFX9-NEXT:    s_ashr_i32 s4, s7, 31
10097 ; GFX9-NEXT:    s_lshr_b32 s4, s4, 20
10098 ; GFX9-NEXT:    s_add_u32 s4, s6, s4
10099 ; GFX9-NEXT:    s_addc_u32 s5, s7, 0
10100 ; GFX9-NEXT:    s_and_b32 s4, s4, 0xfffff000
10101 ; GFX9-NEXT:    s_sub_u32 s4, s6, s4
10102 ; GFX9-NEXT:    s_subb_u32 s5, s7, s5
10103 ; GFX9-NEXT:    v_mov_b32_e32 v0, s0
10104 ; GFX9-NEXT:    v_mov_b32_e32 v1, s1
10105 ; GFX9-NEXT:    v_mov_b32_e32 v2, s4
10106 ; GFX9-NEXT:    v_mov_b32_e32 v3, s5
10107 ; GFX9-NEXT:    global_store_dwordx4 v4, v[0:3], s[2:3]
10108 ; GFX9-NEXT:    s_endpgm
10109   %r = srem <2 x i64> %x, <i64 4096, i64 4096>
10110   store <2 x i64> %r, ptr addrspace(1) %out
10111   ret void
10114 define amdgpu_kernel void @srem_v2i64_pow2_shl_denom(ptr addrspace(1) %out, <2 x i64> %x, <2 x i64> %y) {
10115 ; CHECK-LABEL: @srem_v2i64_pow2_shl_denom(
10116 ; CHECK-NEXT:    [[SHL_Y:%.*]] = shl <2 x i64> <i64 4096, i64 4096>, [[Y:%.*]]
10117 ; CHECK-NEXT:    [[TMP1:%.*]] = extractelement <2 x i64> [[X:%.*]], i64 0
10118 ; CHECK-NEXT:    [[TMP2:%.*]] = extractelement <2 x i64> [[SHL_Y]], i64 0
10119 ; CHECK-NEXT:    [[TMP3:%.*]] = srem i64 [[TMP1]], [[TMP2]]
10120 ; CHECK-NEXT:    [[TMP4:%.*]] = insertelement <2 x i64> poison, i64 [[TMP3]], i64 0
10121 ; CHECK-NEXT:    [[TMP5:%.*]] = extractelement <2 x i64> [[X]], i64 1
10122 ; CHECK-NEXT:    [[TMP6:%.*]] = extractelement <2 x i64> [[SHL_Y]], i64 1
10123 ; CHECK-NEXT:    [[TMP7:%.*]] = srem i64 [[TMP5]], [[TMP6]]
10124 ; CHECK-NEXT:    [[TMP8:%.*]] = insertelement <2 x i64> [[TMP4]], i64 [[TMP7]], i64 1
10125 ; CHECK-NEXT:    store <2 x i64> [[TMP8]], ptr addrspace(1) [[OUT:%.*]], align 16
10126 ; CHECK-NEXT:    ret void
10128 ; GFX6-LABEL: srem_v2i64_pow2_shl_denom:
10129 ; GFX6:       ; %bb.0:
10130 ; GFX6-NEXT:    s_load_dwordx8 s[4:11], s[0:1], 0xd
10131 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
10132 ; GFX6-NEXT:    s_mov_b32 s11, 0xf000
10133 ; GFX6-NEXT:    s_lshl_b64 s[2:3], 0x1000, s8
10134 ; GFX6-NEXT:    s_lshl_b64 s[16:17], 0x1000, s10
10135 ; GFX6-NEXT:    s_ashr_i32 s8, s3, 31
10136 ; GFX6-NEXT:    s_add_u32 s2, s2, s8
10137 ; GFX6-NEXT:    s_mov_b32 s9, s8
10138 ; GFX6-NEXT:    s_addc_u32 s3, s3, s8
10139 ; GFX6-NEXT:    s_xor_b64 s[14:15], s[2:3], s[8:9]
10140 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v0, s14
10141 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v1, s15
10142 ; GFX6-NEXT:    s_sub_u32 s2, 0, s14
10143 ; GFX6-NEXT:    s_subb_u32 s3, 0, s15
10144 ; GFX6-NEXT:    s_ashr_i32 s12, s5, 31
10145 ; GFX6-NEXT:    v_mac_f32_e32 v0, 0x4f800000, v1
10146 ; GFX6-NEXT:    v_rcp_f32_e32 v0, v0
10147 ; GFX6-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0x9
10148 ; GFX6-NEXT:    s_add_u32 s0, s4, s12
10149 ; GFX6-NEXT:    s_mov_b32 s13, s12
10150 ; GFX6-NEXT:    v_mul_f32_e32 v0, 0x5f7ffffc, v0
10151 ; GFX6-NEXT:    v_mul_f32_e32 v1, 0x2f800000, v0
10152 ; GFX6-NEXT:    v_trunc_f32_e32 v1, v1
10153 ; GFX6-NEXT:    v_mac_f32_e32 v0, 0xcf800000, v1
10154 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v1, v1
10155 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v0, v0
10156 ; GFX6-NEXT:    s_addc_u32 s1, s5, s12
10157 ; GFX6-NEXT:    s_xor_b64 s[4:5], s[0:1], s[12:13]
10158 ; GFX6-NEXT:    v_mul_lo_u32 v2, s2, v1
10159 ; GFX6-NEXT:    v_mul_hi_u32 v3, s2, v0
10160 ; GFX6-NEXT:    v_mul_lo_u32 v5, s3, v0
10161 ; GFX6-NEXT:    v_mul_lo_u32 v4, s2, v0
10162 ; GFX6-NEXT:    s_mov_b32 s10, -1
10163 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, v2, v3
10164 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, v2, v5
10165 ; GFX6-NEXT:    v_mul_hi_u32 v3, v0, v4
10166 ; GFX6-NEXT:    v_mul_lo_u32 v5, v0, v2
10167 ; GFX6-NEXT:    v_mul_hi_u32 v7, v0, v2
10168 ; GFX6-NEXT:    v_mul_hi_u32 v6, v1, v4
10169 ; GFX6-NEXT:    v_mul_lo_u32 v4, v1, v4
10170 ; GFX6-NEXT:    v_mul_hi_u32 v8, v1, v2
10171 ; GFX6-NEXT:    v_add_i32_e32 v3, vcc, v3, v5
10172 ; GFX6-NEXT:    v_addc_u32_e32 v5, vcc, 0, v7, vcc
10173 ; GFX6-NEXT:    v_mul_lo_u32 v2, v1, v2
10174 ; GFX6-NEXT:    v_add_i32_e32 v3, vcc, v3, v4
10175 ; GFX6-NEXT:    v_addc_u32_e32 v3, vcc, v5, v6, vcc
10176 ; GFX6-NEXT:    v_addc_u32_e32 v4, vcc, 0, v8, vcc
10177 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, v3, v2
10178 ; GFX6-NEXT:    v_addc_u32_e32 v3, vcc, 0, v4, vcc
10179 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, v0, v2
10180 ; GFX6-NEXT:    v_addc_u32_e32 v1, vcc, v1, v3, vcc
10181 ; GFX6-NEXT:    v_mul_lo_u32 v2, s2, v1
10182 ; GFX6-NEXT:    v_mul_hi_u32 v3, s2, v0
10183 ; GFX6-NEXT:    v_mul_lo_u32 v4, s3, v0
10184 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, v2, v3
10185 ; GFX6-NEXT:    v_mul_lo_u32 v3, s2, v0
10186 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, v2, v4
10187 ; GFX6-NEXT:    v_mul_lo_u32 v6, v0, v2
10188 ; GFX6-NEXT:    v_mul_hi_u32 v7, v0, v3
10189 ; GFX6-NEXT:    v_mul_hi_u32 v8, v0, v2
10190 ; GFX6-NEXT:    v_mul_hi_u32 v5, v1, v3
10191 ; GFX6-NEXT:    v_mul_lo_u32 v3, v1, v3
10192 ; GFX6-NEXT:    v_mul_hi_u32 v4, v1, v2
10193 ; GFX6-NEXT:    v_add_i32_e32 v6, vcc, v7, v6
10194 ; GFX6-NEXT:    v_addc_u32_e32 v7, vcc, 0, v8, vcc
10195 ; GFX6-NEXT:    v_mul_lo_u32 v2, v1, v2
10196 ; GFX6-NEXT:    v_add_i32_e32 v3, vcc, v6, v3
10197 ; GFX6-NEXT:    v_addc_u32_e32 v3, vcc, v7, v5, vcc
10198 ; GFX6-NEXT:    v_addc_u32_e32 v4, vcc, 0, v4, vcc
10199 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, v3, v2
10200 ; GFX6-NEXT:    v_addc_u32_e32 v3, vcc, 0, v4, vcc
10201 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, v0, v2
10202 ; GFX6-NEXT:    v_addc_u32_e32 v1, vcc, v1, v3, vcc
10203 ; GFX6-NEXT:    v_mul_lo_u32 v2, s4, v1
10204 ; GFX6-NEXT:    v_mul_hi_u32 v3, s4, v0
10205 ; GFX6-NEXT:    v_mul_hi_u32 v4, s4, v1
10206 ; GFX6-NEXT:    v_mul_hi_u32 v5, s5, v1
10207 ; GFX6-NEXT:    v_mul_lo_u32 v1, s5, v1
10208 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, v3, v2
10209 ; GFX6-NEXT:    v_addc_u32_e32 v3, vcc, 0, v4, vcc
10210 ; GFX6-NEXT:    v_mul_lo_u32 v4, s5, v0
10211 ; GFX6-NEXT:    v_mul_hi_u32 v0, s5, v0
10212 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, v2, v4
10213 ; GFX6-NEXT:    v_addc_u32_e32 v0, vcc, v3, v0, vcc
10214 ; GFX6-NEXT:    v_addc_u32_e32 v2, vcc, 0, v5, vcc
10215 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, v0, v1
10216 ; GFX6-NEXT:    v_addc_u32_e32 v1, vcc, 0, v2, vcc
10217 ; GFX6-NEXT:    v_mul_lo_u32 v1, s14, v1
10218 ; GFX6-NEXT:    v_mul_hi_u32 v2, s14, v0
10219 ; GFX6-NEXT:    v_mul_lo_u32 v3, s15, v0
10220 ; GFX6-NEXT:    v_mul_lo_u32 v0, s14, v0
10221 ; GFX6-NEXT:    v_add_i32_e32 v1, vcc, v1, v2
10222 ; GFX6-NEXT:    v_add_i32_e32 v1, vcc, v3, v1
10223 ; GFX6-NEXT:    v_sub_i32_e32 v2, vcc, s5, v1
10224 ; GFX6-NEXT:    v_mov_b32_e32 v3, s15
10225 ; GFX6-NEXT:    v_sub_i32_e32 v0, vcc, s4, v0
10226 ; GFX6-NEXT:    v_subb_u32_e64 v2, s[0:1], v2, v3, vcc
10227 ; GFX6-NEXT:    v_subrev_i32_e64 v4, s[0:1], s14, v0
10228 ; GFX6-NEXT:    v_subbrev_u32_e64 v5, s[2:3], 0, v2, s[0:1]
10229 ; GFX6-NEXT:    v_cmp_le_u32_e64 s[2:3], s15, v5
10230 ; GFX6-NEXT:    v_cndmask_b32_e64 v6, 0, -1, s[2:3]
10231 ; GFX6-NEXT:    v_cmp_le_u32_e64 s[2:3], s14, v4
10232 ; GFX6-NEXT:    v_subb_u32_e64 v2, s[0:1], v2, v3, s[0:1]
10233 ; GFX6-NEXT:    v_cndmask_b32_e64 v7, 0, -1, s[2:3]
10234 ; GFX6-NEXT:    v_cmp_eq_u32_e64 s[2:3], s15, v5
10235 ; GFX6-NEXT:    v_subrev_i32_e64 v3, s[0:1], s14, v4
10236 ; GFX6-NEXT:    v_cndmask_b32_e64 v6, v6, v7, s[2:3]
10237 ; GFX6-NEXT:    v_subbrev_u32_e64 v2, s[0:1], 0, v2, s[0:1]
10238 ; GFX6-NEXT:    v_cmp_ne_u32_e64 s[0:1], 0, v6
10239 ; GFX6-NEXT:    v_cndmask_b32_e64 v3, v4, v3, s[0:1]
10240 ; GFX6-NEXT:    v_cndmask_b32_e64 v2, v5, v2, s[0:1]
10241 ; GFX6-NEXT:    s_ashr_i32 s0, s17, 31
10242 ; GFX6-NEXT:    s_add_u32 s2, s16, s0
10243 ; GFX6-NEXT:    s_mov_b32 s1, s0
10244 ; GFX6-NEXT:    s_addc_u32 s3, s17, s0
10245 ; GFX6-NEXT:    v_mov_b32_e32 v4, s5
10246 ; GFX6-NEXT:    s_xor_b64 s[4:5], s[2:3], s[0:1]
10247 ; GFX6-NEXT:    v_subb_u32_e32 v1, vcc, v4, v1, vcc
10248 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v4, s4
10249 ; GFX6-NEXT:    v_cvt_f32_u32_e32 v5, s5
10250 ; GFX6-NEXT:    v_cmp_le_u32_e32 vcc, s15, v1
10251 ; GFX6-NEXT:    v_cndmask_b32_e64 v6, 0, -1, vcc
10252 ; GFX6-NEXT:    v_cmp_le_u32_e32 vcc, s14, v0
10253 ; GFX6-NEXT:    v_mac_f32_e32 v4, 0x4f800000, v5
10254 ; GFX6-NEXT:    v_rcp_f32_e32 v4, v4
10255 ; GFX6-NEXT:    v_cndmask_b32_e64 v7, 0, -1, vcc
10256 ; GFX6-NEXT:    v_cmp_eq_u32_e32 vcc, s15, v1
10257 ; GFX6-NEXT:    v_cndmask_b32_e32 v5, v6, v7, vcc
10258 ; GFX6-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v5
10259 ; GFX6-NEXT:    v_cndmask_b32_e32 v1, v1, v2, vcc
10260 ; GFX6-NEXT:    v_mul_f32_e32 v2, 0x5f7ffffc, v4
10261 ; GFX6-NEXT:    v_mul_f32_e32 v4, 0x2f800000, v2
10262 ; GFX6-NEXT:    v_trunc_f32_e32 v4, v4
10263 ; GFX6-NEXT:    v_mac_f32_e32 v2, 0xcf800000, v4
10264 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v2, v2
10265 ; GFX6-NEXT:    v_cvt_u32_f32_e32 v4, v4
10266 ; GFX6-NEXT:    s_sub_u32 s0, 0, s4
10267 ; GFX6-NEXT:    v_cndmask_b32_e32 v0, v0, v3, vcc
10268 ; GFX6-NEXT:    v_mul_hi_u32 v3, s0, v2
10269 ; GFX6-NEXT:    v_mul_lo_u32 v5, s0, v4
10270 ; GFX6-NEXT:    s_subb_u32 s1, 0, s5
10271 ; GFX6-NEXT:    v_mul_lo_u32 v6, s1, v2
10272 ; GFX6-NEXT:    s_ashr_i32 s14, s7, 31
10273 ; GFX6-NEXT:    v_add_i32_e32 v3, vcc, v5, v3
10274 ; GFX6-NEXT:    v_mul_lo_u32 v5, s0, v2
10275 ; GFX6-NEXT:    v_add_i32_e32 v3, vcc, v3, v6
10276 ; GFX6-NEXT:    v_mul_lo_u32 v6, v2, v3
10277 ; GFX6-NEXT:    v_mul_hi_u32 v7, v2, v5
10278 ; GFX6-NEXT:    v_mul_hi_u32 v8, v2, v3
10279 ; GFX6-NEXT:    v_mul_hi_u32 v9, v4, v3
10280 ; GFX6-NEXT:    v_mul_lo_u32 v3, v4, v3
10281 ; GFX6-NEXT:    v_add_i32_e32 v6, vcc, v7, v6
10282 ; GFX6-NEXT:    v_addc_u32_e32 v7, vcc, 0, v8, vcc
10283 ; GFX6-NEXT:    v_mul_lo_u32 v8, v4, v5
10284 ; GFX6-NEXT:    v_mul_hi_u32 v5, v4, v5
10285 ; GFX6-NEXT:    s_mov_b32 s15, s14
10286 ; GFX6-NEXT:    v_xor_b32_e32 v0, s12, v0
10287 ; GFX6-NEXT:    v_add_i32_e32 v6, vcc, v6, v8
10288 ; GFX6-NEXT:    v_addc_u32_e32 v5, vcc, v7, v5, vcc
10289 ; GFX6-NEXT:    v_addc_u32_e32 v6, vcc, 0, v9, vcc
10290 ; GFX6-NEXT:    v_add_i32_e32 v3, vcc, v5, v3
10291 ; GFX6-NEXT:    v_addc_u32_e32 v5, vcc, 0, v6, vcc
10292 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, v2, v3
10293 ; GFX6-NEXT:    v_addc_u32_e32 v3, vcc, v4, v5, vcc
10294 ; GFX6-NEXT:    v_mul_lo_u32 v4, s0, v3
10295 ; GFX6-NEXT:    v_mul_hi_u32 v5, s0, v2
10296 ; GFX6-NEXT:    v_mul_lo_u32 v6, s1, v2
10297 ; GFX6-NEXT:    v_xor_b32_e32 v1, s12, v1
10298 ; GFX6-NEXT:    v_add_i32_e32 v4, vcc, v4, v5
10299 ; GFX6-NEXT:    v_mul_lo_u32 v5, s0, v2
10300 ; GFX6-NEXT:    v_add_i32_e32 v4, vcc, v4, v6
10301 ; GFX6-NEXT:    v_mul_lo_u32 v8, v2, v4
10302 ; GFX6-NEXT:    v_mul_hi_u32 v9, v2, v5
10303 ; GFX6-NEXT:    v_mul_hi_u32 v10, v2, v4
10304 ; GFX6-NEXT:    v_mul_hi_u32 v7, v3, v5
10305 ; GFX6-NEXT:    v_mul_lo_u32 v5, v3, v5
10306 ; GFX6-NEXT:    v_mul_hi_u32 v6, v3, v4
10307 ; GFX6-NEXT:    v_add_i32_e32 v8, vcc, v9, v8
10308 ; GFX6-NEXT:    v_addc_u32_e32 v9, vcc, 0, v10, vcc
10309 ; GFX6-NEXT:    v_mul_lo_u32 v4, v3, v4
10310 ; GFX6-NEXT:    v_add_i32_e32 v5, vcc, v8, v5
10311 ; GFX6-NEXT:    v_addc_u32_e32 v5, vcc, v9, v7, vcc
10312 ; GFX6-NEXT:    v_addc_u32_e32 v6, vcc, 0, v6, vcc
10313 ; GFX6-NEXT:    v_add_i32_e32 v4, vcc, v5, v4
10314 ; GFX6-NEXT:    v_addc_u32_e32 v5, vcc, 0, v6, vcc
10315 ; GFX6-NEXT:    s_add_u32 s0, s6, s14
10316 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, v2, v4
10317 ; GFX6-NEXT:    s_addc_u32 s1, s7, s14
10318 ; GFX6-NEXT:    v_addc_u32_e32 v3, vcc, v3, v5, vcc
10319 ; GFX6-NEXT:    s_xor_b64 s[6:7], s[0:1], s[14:15]
10320 ; GFX6-NEXT:    v_mul_lo_u32 v4, s6, v3
10321 ; GFX6-NEXT:    v_mul_hi_u32 v5, s6, v2
10322 ; GFX6-NEXT:    v_mul_hi_u32 v7, s6, v3
10323 ; GFX6-NEXT:    v_mul_hi_u32 v8, s7, v3
10324 ; GFX6-NEXT:    v_mul_lo_u32 v3, s7, v3
10325 ; GFX6-NEXT:    v_add_i32_e32 v4, vcc, v5, v4
10326 ; GFX6-NEXT:    v_addc_u32_e32 v5, vcc, 0, v7, vcc
10327 ; GFX6-NEXT:    v_mul_lo_u32 v7, s7, v2
10328 ; GFX6-NEXT:    v_mul_hi_u32 v2, s7, v2
10329 ; GFX6-NEXT:    v_mov_b32_e32 v6, s12
10330 ; GFX6-NEXT:    v_add_i32_e32 v4, vcc, v4, v7
10331 ; GFX6-NEXT:    v_addc_u32_e32 v2, vcc, v5, v2, vcc
10332 ; GFX6-NEXT:    v_addc_u32_e32 v4, vcc, 0, v8, vcc
10333 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, v2, v3
10334 ; GFX6-NEXT:    v_addc_u32_e32 v3, vcc, 0, v4, vcc
10335 ; GFX6-NEXT:    v_mul_lo_u32 v3, s4, v3
10336 ; GFX6-NEXT:    v_mul_hi_u32 v4, s4, v2
10337 ; GFX6-NEXT:    v_mul_lo_u32 v5, s5, v2
10338 ; GFX6-NEXT:    v_subrev_i32_e32 v0, vcc, s12, v0
10339 ; GFX6-NEXT:    v_mul_lo_u32 v2, s4, v2
10340 ; GFX6-NEXT:    v_subb_u32_e32 v1, vcc, v1, v6, vcc
10341 ; GFX6-NEXT:    v_add_i32_e32 v3, vcc, v3, v4
10342 ; GFX6-NEXT:    v_add_i32_e32 v3, vcc, v5, v3
10343 ; GFX6-NEXT:    v_sub_i32_e32 v4, vcc, s7, v3
10344 ; GFX6-NEXT:    v_mov_b32_e32 v5, s5
10345 ; GFX6-NEXT:    v_sub_i32_e32 v2, vcc, s6, v2
10346 ; GFX6-NEXT:    v_subb_u32_e64 v4, s[0:1], v4, v5, vcc
10347 ; GFX6-NEXT:    v_subrev_i32_e64 v6, s[0:1], s4, v2
10348 ; GFX6-NEXT:    v_subbrev_u32_e64 v7, s[2:3], 0, v4, s[0:1]
10349 ; GFX6-NEXT:    v_cmp_le_u32_e64 s[2:3], s5, v7
10350 ; GFX6-NEXT:    v_cndmask_b32_e64 v8, 0, -1, s[2:3]
10351 ; GFX6-NEXT:    v_cmp_le_u32_e64 s[2:3], s4, v6
10352 ; GFX6-NEXT:    v_subb_u32_e64 v4, s[0:1], v4, v5, s[0:1]
10353 ; GFX6-NEXT:    v_cndmask_b32_e64 v9, 0, -1, s[2:3]
10354 ; GFX6-NEXT:    v_cmp_eq_u32_e64 s[2:3], s5, v7
10355 ; GFX6-NEXT:    v_subrev_i32_e64 v5, s[0:1], s4, v6
10356 ; GFX6-NEXT:    v_cndmask_b32_e64 v8, v8, v9, s[2:3]
10357 ; GFX6-NEXT:    v_subbrev_u32_e64 v4, s[0:1], 0, v4, s[0:1]
10358 ; GFX6-NEXT:    v_cmp_ne_u32_e64 s[0:1], 0, v8
10359 ; GFX6-NEXT:    v_cndmask_b32_e64 v5, v6, v5, s[0:1]
10360 ; GFX6-NEXT:    v_mov_b32_e32 v6, s7
10361 ; GFX6-NEXT:    v_subb_u32_e32 v3, vcc, v6, v3, vcc
10362 ; GFX6-NEXT:    v_cmp_le_u32_e32 vcc, s5, v3
10363 ; GFX6-NEXT:    v_cndmask_b32_e64 v6, 0, -1, vcc
10364 ; GFX6-NEXT:    v_cmp_le_u32_e32 vcc, s4, v2
10365 ; GFX6-NEXT:    v_cndmask_b32_e64 v4, v7, v4, s[0:1]
10366 ; GFX6-NEXT:    v_cndmask_b32_e64 v7, 0, -1, vcc
10367 ; GFX6-NEXT:    v_cmp_eq_u32_e32 vcc, s5, v3
10368 ; GFX6-NEXT:    v_cndmask_b32_e32 v6, v6, v7, vcc
10369 ; GFX6-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v6
10370 ; GFX6-NEXT:    v_cndmask_b32_e32 v2, v2, v5, vcc
10371 ; GFX6-NEXT:    v_cndmask_b32_e32 v3, v3, v4, vcc
10372 ; GFX6-NEXT:    v_xor_b32_e32 v2, s14, v2
10373 ; GFX6-NEXT:    v_xor_b32_e32 v3, s14, v3
10374 ; GFX6-NEXT:    v_mov_b32_e32 v4, s14
10375 ; GFX6-NEXT:    v_subrev_i32_e32 v2, vcc, s14, v2
10376 ; GFX6-NEXT:    v_subb_u32_e32 v3, vcc, v3, v4, vcc
10377 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
10378 ; GFX6-NEXT:    buffer_store_dwordx4 v[0:3], off, s[8:11], 0
10379 ; GFX6-NEXT:    s_endpgm
10381 ; GFX9-LABEL: srem_v2i64_pow2_shl_denom:
10382 ; GFX9:       ; %bb.0:
10383 ; GFX9-NEXT:    s_load_dwordx8 s[4:11], s[0:1], 0x34
10384 ; GFX9-NEXT:    v_mov_b32_e32 v4, 0
10385 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
10386 ; GFX9-NEXT:    s_lshl_b64 s[2:3], 0x1000, s8
10387 ; GFX9-NEXT:    s_lshl_b64 s[10:11], 0x1000, s10
10388 ; GFX9-NEXT:    s_ashr_i32 s8, s3, 31
10389 ; GFX9-NEXT:    s_add_u32 s2, s2, s8
10390 ; GFX9-NEXT:    s_mov_b32 s9, s8
10391 ; GFX9-NEXT:    s_addc_u32 s3, s3, s8
10392 ; GFX9-NEXT:    s_xor_b64 s[12:13], s[2:3], s[8:9]
10393 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v0, s12
10394 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v1, s13
10395 ; GFX9-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0x24
10396 ; GFX9-NEXT:    s_sub_u32 s0, 0, s12
10397 ; GFX9-NEXT:    s_subb_u32 s1, 0, s13
10398 ; GFX9-NEXT:    v_mac_f32_e32 v0, 0x4f800000, v1
10399 ; GFX9-NEXT:    v_rcp_f32_e32 v0, v0
10400 ; GFX9-NEXT:    v_mul_f32_e32 v0, 0x5f7ffffc, v0
10401 ; GFX9-NEXT:    v_mul_f32_e32 v1, 0x2f800000, v0
10402 ; GFX9-NEXT:    v_trunc_f32_e32 v1, v1
10403 ; GFX9-NEXT:    v_mac_f32_e32 v0, 0xcf800000, v1
10404 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v1, v1
10405 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v0, v0
10406 ; GFX9-NEXT:    v_readfirstlane_b32 s2, v1
10407 ; GFX9-NEXT:    v_readfirstlane_b32 s3, v0
10408 ; GFX9-NEXT:    s_mul_i32 s14, s0, s2
10409 ; GFX9-NEXT:    s_mul_hi_u32 s16, s0, s3
10410 ; GFX9-NEXT:    s_mul_i32 s15, s1, s3
10411 ; GFX9-NEXT:    s_add_i32 s14, s16, s14
10412 ; GFX9-NEXT:    s_mul_i32 s17, s0, s3
10413 ; GFX9-NEXT:    s_add_i32 s14, s14, s15
10414 ; GFX9-NEXT:    s_mul_hi_u32 s15, s3, s14
10415 ; GFX9-NEXT:    s_mul_i32 s16, s3, s14
10416 ; GFX9-NEXT:    s_mul_hi_u32 s3, s3, s17
10417 ; GFX9-NEXT:    s_add_u32 s3, s3, s16
10418 ; GFX9-NEXT:    s_addc_u32 s15, 0, s15
10419 ; GFX9-NEXT:    s_mul_hi_u32 s18, s2, s17
10420 ; GFX9-NEXT:    s_mul_i32 s17, s2, s17
10421 ; GFX9-NEXT:    s_add_u32 s3, s3, s17
10422 ; GFX9-NEXT:    s_mul_hi_u32 s16, s2, s14
10423 ; GFX9-NEXT:    s_addc_u32 s3, s15, s18
10424 ; GFX9-NEXT:    s_addc_u32 s15, s16, 0
10425 ; GFX9-NEXT:    s_mul_i32 s14, s2, s14
10426 ; GFX9-NEXT:    s_add_u32 s3, s3, s14
10427 ; GFX9-NEXT:    s_addc_u32 s14, 0, s15
10428 ; GFX9-NEXT:    v_add_co_u32_e32 v0, vcc, s3, v0
10429 ; GFX9-NEXT:    s_cmp_lg_u64 vcc, 0
10430 ; GFX9-NEXT:    s_addc_u32 s2, s2, s14
10431 ; GFX9-NEXT:    v_readfirstlane_b32 s14, v0
10432 ; GFX9-NEXT:    s_mul_i32 s3, s0, s2
10433 ; GFX9-NEXT:    s_mul_hi_u32 s15, s0, s14
10434 ; GFX9-NEXT:    s_add_i32 s3, s15, s3
10435 ; GFX9-NEXT:    s_mul_i32 s1, s1, s14
10436 ; GFX9-NEXT:    s_add_i32 s3, s3, s1
10437 ; GFX9-NEXT:    s_mul_i32 s0, s0, s14
10438 ; GFX9-NEXT:    s_mul_hi_u32 s15, s2, s0
10439 ; GFX9-NEXT:    s_mul_i32 s16, s2, s0
10440 ; GFX9-NEXT:    s_mul_i32 s18, s14, s3
10441 ; GFX9-NEXT:    s_mul_hi_u32 s0, s14, s0
10442 ; GFX9-NEXT:    s_mul_hi_u32 s17, s14, s3
10443 ; GFX9-NEXT:    s_add_u32 s0, s0, s18
10444 ; GFX9-NEXT:    s_addc_u32 s14, 0, s17
10445 ; GFX9-NEXT:    s_add_u32 s0, s0, s16
10446 ; GFX9-NEXT:    s_mul_hi_u32 s1, s2, s3
10447 ; GFX9-NEXT:    s_addc_u32 s0, s14, s15
10448 ; GFX9-NEXT:    s_addc_u32 s1, s1, 0
10449 ; GFX9-NEXT:    s_mul_i32 s3, s2, s3
10450 ; GFX9-NEXT:    s_add_u32 s0, s0, s3
10451 ; GFX9-NEXT:    s_addc_u32 s1, 0, s1
10452 ; GFX9-NEXT:    v_add_co_u32_e32 v0, vcc, s0, v0
10453 ; GFX9-NEXT:    s_cmp_lg_u64 vcc, 0
10454 ; GFX9-NEXT:    s_addc_u32 s2, s2, s1
10455 ; GFX9-NEXT:    s_ashr_i32 s14, s5, 31
10456 ; GFX9-NEXT:    s_add_u32 s0, s4, s14
10457 ; GFX9-NEXT:    s_mov_b32 s15, s14
10458 ; GFX9-NEXT:    s_addc_u32 s1, s5, s14
10459 ; GFX9-NEXT:    s_xor_b64 s[4:5], s[0:1], s[14:15]
10460 ; GFX9-NEXT:    v_readfirstlane_b32 s3, v0
10461 ; GFX9-NEXT:    s_mul_i32 s1, s4, s2
10462 ; GFX9-NEXT:    s_mul_hi_u32 s15, s4, s3
10463 ; GFX9-NEXT:    s_mul_hi_u32 s0, s4, s2
10464 ; GFX9-NEXT:    s_add_u32 s1, s15, s1
10465 ; GFX9-NEXT:    s_addc_u32 s0, 0, s0
10466 ; GFX9-NEXT:    s_mul_hi_u32 s16, s5, s3
10467 ; GFX9-NEXT:    s_mul_i32 s3, s5, s3
10468 ; GFX9-NEXT:    s_add_u32 s1, s1, s3
10469 ; GFX9-NEXT:    s_mul_hi_u32 s15, s5, s2
10470 ; GFX9-NEXT:    s_addc_u32 s0, s0, s16
10471 ; GFX9-NEXT:    s_addc_u32 s1, s15, 0
10472 ; GFX9-NEXT:    s_mul_i32 s2, s5, s2
10473 ; GFX9-NEXT:    s_add_u32 s0, s0, s2
10474 ; GFX9-NEXT:    s_addc_u32 s1, 0, s1
10475 ; GFX9-NEXT:    s_mul_i32 s1, s12, s1
10476 ; GFX9-NEXT:    s_mul_hi_u32 s2, s12, s0
10477 ; GFX9-NEXT:    s_add_i32 s1, s2, s1
10478 ; GFX9-NEXT:    s_mul_i32 s2, s13, s0
10479 ; GFX9-NEXT:    s_mul_i32 s0, s12, s0
10480 ; GFX9-NEXT:    s_add_i32 s15, s1, s2
10481 ; GFX9-NEXT:    v_mov_b32_e32 v0, s0
10482 ; GFX9-NEXT:    s_sub_i32 s1, s5, s15
10483 ; GFX9-NEXT:    v_sub_co_u32_e32 v0, vcc, s4, v0
10484 ; GFX9-NEXT:    s_cmp_lg_u64 vcc, 0
10485 ; GFX9-NEXT:    s_subb_u32 s4, s1, s13
10486 ; GFX9-NEXT:    v_subrev_co_u32_e64 v1, s[0:1], s12, v0
10487 ; GFX9-NEXT:    s_cmp_lg_u64 s[0:1], 0
10488 ; GFX9-NEXT:    s_subb_u32 s16, s4, 0
10489 ; GFX9-NEXT:    s_cmp_ge_u32 s16, s13
10490 ; GFX9-NEXT:    s_cselect_b32 s17, -1, 0
10491 ; GFX9-NEXT:    v_cmp_le_u32_e64 s[2:3], s12, v1
10492 ; GFX9-NEXT:    s_cmp_eq_u32 s16, s13
10493 ; GFX9-NEXT:    v_cndmask_b32_e64 v2, 0, -1, s[2:3]
10494 ; GFX9-NEXT:    v_mov_b32_e32 v3, s17
10495 ; GFX9-NEXT:    s_cselect_b64 s[2:3], -1, 0
10496 ; GFX9-NEXT:    s_cmp_lg_u64 s[0:1], 0
10497 ; GFX9-NEXT:    v_cndmask_b32_e64 v2, v3, v2, s[2:3]
10498 ; GFX9-NEXT:    s_subb_u32 s2, s4, s13
10499 ; GFX9-NEXT:    v_subrev_co_u32_e64 v3, s[0:1], s12, v1
10500 ; GFX9-NEXT:    s_cmp_lg_u64 s[0:1], 0
10501 ; GFX9-NEXT:    s_subb_u32 s2, s2, 0
10502 ; GFX9-NEXT:    v_cmp_ne_u32_e64 s[0:1], 0, v2
10503 ; GFX9-NEXT:    v_cndmask_b32_e64 v1, v1, v3, s[0:1]
10504 ; GFX9-NEXT:    v_mov_b32_e32 v2, s16
10505 ; GFX9-NEXT:    v_mov_b32_e32 v3, s2
10506 ; GFX9-NEXT:    s_cmp_lg_u64 vcc, 0
10507 ; GFX9-NEXT:    v_cndmask_b32_e64 v2, v2, v3, s[0:1]
10508 ; GFX9-NEXT:    s_subb_u32 s0, s5, s15
10509 ; GFX9-NEXT:    s_cmp_ge_u32 s0, s13
10510 ; GFX9-NEXT:    s_cselect_b32 s1, -1, 0
10511 ; GFX9-NEXT:    v_cmp_le_u32_e32 vcc, s12, v0
10512 ; GFX9-NEXT:    s_cmp_eq_u32 s0, s13
10513 ; GFX9-NEXT:    v_cndmask_b32_e64 v3, 0, -1, vcc
10514 ; GFX9-NEXT:    v_mov_b32_e32 v5, s1
10515 ; GFX9-NEXT:    s_cselect_b64 vcc, -1, 0
10516 ; GFX9-NEXT:    v_cndmask_b32_e32 v3, v5, v3, vcc
10517 ; GFX9-NEXT:    v_mov_b32_e32 v5, s0
10518 ; GFX9-NEXT:    s_ashr_i32 s0, s11, 31
10519 ; GFX9-NEXT:    s_add_u32 s2, s10, s0
10520 ; GFX9-NEXT:    s_mov_b32 s1, s0
10521 ; GFX9-NEXT:    s_addc_u32 s3, s11, s0
10522 ; GFX9-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v3
10523 ; GFX9-NEXT:    s_xor_b64 s[4:5], s[2:3], s[0:1]
10524 ; GFX9-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
10525 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v1, s4
10526 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v3, s5
10527 ; GFX9-NEXT:    v_cndmask_b32_e32 v2, v5, v2, vcc
10528 ; GFX9-NEXT:    v_xor_b32_e32 v0, s14, v0
10529 ; GFX9-NEXT:    v_xor_b32_e32 v2, s14, v2
10530 ; GFX9-NEXT:    v_mac_f32_e32 v1, 0x4f800000, v3
10531 ; GFX9-NEXT:    v_rcp_f32_e32 v3, v1
10532 ; GFX9-NEXT:    v_mov_b32_e32 v5, s14
10533 ; GFX9-NEXT:    v_subrev_co_u32_e32 v0, vcc, s14, v0
10534 ; GFX9-NEXT:    v_subb_co_u32_e32 v1, vcc, v2, v5, vcc
10535 ; GFX9-NEXT:    v_mul_f32_e32 v2, 0x5f7ffffc, v3
10536 ; GFX9-NEXT:    v_mul_f32_e32 v3, 0x2f800000, v2
10537 ; GFX9-NEXT:    v_trunc_f32_e32 v3, v3
10538 ; GFX9-NEXT:    v_mac_f32_e32 v2, 0xcf800000, v3
10539 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v2, v2
10540 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v3, v3
10541 ; GFX9-NEXT:    s_sub_u32 s0, 0, s4
10542 ; GFX9-NEXT:    s_subb_u32 s1, 0, s5
10543 ; GFX9-NEXT:    v_readfirstlane_b32 s2, v2
10544 ; GFX9-NEXT:    v_readfirstlane_b32 s11, v3
10545 ; GFX9-NEXT:    s_mul_hi_u32 s10, s0, s2
10546 ; GFX9-NEXT:    s_mul_i32 s12, s0, s11
10547 ; GFX9-NEXT:    s_mul_i32 s3, s1, s2
10548 ; GFX9-NEXT:    s_add_i32 s10, s10, s12
10549 ; GFX9-NEXT:    s_add_i32 s10, s10, s3
10550 ; GFX9-NEXT:    s_mul_i32 s13, s0, s2
10551 ; GFX9-NEXT:    s_mul_hi_u32 s3, s2, s10
10552 ; GFX9-NEXT:    s_mul_i32 s12, s2, s10
10553 ; GFX9-NEXT:    s_mul_hi_u32 s2, s2, s13
10554 ; GFX9-NEXT:    s_add_u32 s2, s2, s12
10555 ; GFX9-NEXT:    s_addc_u32 s3, 0, s3
10556 ; GFX9-NEXT:    s_mul_hi_u32 s14, s11, s13
10557 ; GFX9-NEXT:    s_mul_i32 s13, s11, s13
10558 ; GFX9-NEXT:    s_add_u32 s2, s2, s13
10559 ; GFX9-NEXT:    s_mul_hi_u32 s12, s11, s10
10560 ; GFX9-NEXT:    s_addc_u32 s2, s3, s14
10561 ; GFX9-NEXT:    s_addc_u32 s3, s12, 0
10562 ; GFX9-NEXT:    s_mul_i32 s10, s11, s10
10563 ; GFX9-NEXT:    s_add_u32 s2, s2, s10
10564 ; GFX9-NEXT:    s_addc_u32 s3, 0, s3
10565 ; GFX9-NEXT:    v_add_co_u32_e32 v2, vcc, s2, v2
10566 ; GFX9-NEXT:    s_cmp_lg_u64 vcc, 0
10567 ; GFX9-NEXT:    s_addc_u32 s2, s11, s3
10568 ; GFX9-NEXT:    v_readfirstlane_b32 s10, v2
10569 ; GFX9-NEXT:    s_mul_i32 s3, s0, s2
10570 ; GFX9-NEXT:    s_mul_hi_u32 s11, s0, s10
10571 ; GFX9-NEXT:    s_add_i32 s3, s11, s3
10572 ; GFX9-NEXT:    s_mul_i32 s1, s1, s10
10573 ; GFX9-NEXT:    s_add_i32 s3, s3, s1
10574 ; GFX9-NEXT:    s_mul_i32 s0, s0, s10
10575 ; GFX9-NEXT:    s_mul_hi_u32 s11, s2, s0
10576 ; GFX9-NEXT:    s_mul_i32 s12, s2, s0
10577 ; GFX9-NEXT:    s_mul_i32 s14, s10, s3
10578 ; GFX9-NEXT:    s_mul_hi_u32 s0, s10, s0
10579 ; GFX9-NEXT:    s_mul_hi_u32 s13, s10, s3
10580 ; GFX9-NEXT:    s_add_u32 s0, s0, s14
10581 ; GFX9-NEXT:    s_addc_u32 s10, 0, s13
10582 ; GFX9-NEXT:    s_add_u32 s0, s0, s12
10583 ; GFX9-NEXT:    s_mul_hi_u32 s1, s2, s3
10584 ; GFX9-NEXT:    s_addc_u32 s0, s10, s11
10585 ; GFX9-NEXT:    s_addc_u32 s1, s1, 0
10586 ; GFX9-NEXT:    s_mul_i32 s3, s2, s3
10587 ; GFX9-NEXT:    s_add_u32 s0, s0, s3
10588 ; GFX9-NEXT:    s_addc_u32 s1, 0, s1
10589 ; GFX9-NEXT:    v_add_co_u32_e32 v2, vcc, s0, v2
10590 ; GFX9-NEXT:    s_cmp_lg_u64 vcc, 0
10591 ; GFX9-NEXT:    s_addc_u32 s2, s2, s1
10592 ; GFX9-NEXT:    s_ashr_i32 s10, s7, 31
10593 ; GFX9-NEXT:    s_add_u32 s0, s6, s10
10594 ; GFX9-NEXT:    s_mov_b32 s11, s10
10595 ; GFX9-NEXT:    s_addc_u32 s1, s7, s10
10596 ; GFX9-NEXT:    s_xor_b64 s[6:7], s[0:1], s[10:11]
10597 ; GFX9-NEXT:    v_readfirstlane_b32 s3, v2
10598 ; GFX9-NEXT:    s_mul_i32 s1, s6, s2
10599 ; GFX9-NEXT:    s_mul_hi_u32 s11, s6, s3
10600 ; GFX9-NEXT:    s_mul_hi_u32 s0, s6, s2
10601 ; GFX9-NEXT:    s_add_u32 s1, s11, s1
10602 ; GFX9-NEXT:    s_addc_u32 s0, 0, s0
10603 ; GFX9-NEXT:    s_mul_hi_u32 s12, s7, s3
10604 ; GFX9-NEXT:    s_mul_i32 s3, s7, s3
10605 ; GFX9-NEXT:    s_add_u32 s1, s1, s3
10606 ; GFX9-NEXT:    s_mul_hi_u32 s11, s7, s2
10607 ; GFX9-NEXT:    s_addc_u32 s0, s0, s12
10608 ; GFX9-NEXT:    s_addc_u32 s1, s11, 0
10609 ; GFX9-NEXT:    s_mul_i32 s2, s7, s2
10610 ; GFX9-NEXT:    s_add_u32 s0, s0, s2
10611 ; GFX9-NEXT:    s_addc_u32 s1, 0, s1
10612 ; GFX9-NEXT:    s_mul_i32 s1, s4, s1
10613 ; GFX9-NEXT:    s_mul_hi_u32 s2, s4, s0
10614 ; GFX9-NEXT:    s_add_i32 s1, s2, s1
10615 ; GFX9-NEXT:    s_mul_i32 s2, s5, s0
10616 ; GFX9-NEXT:    s_mul_i32 s0, s4, s0
10617 ; GFX9-NEXT:    s_add_i32 s11, s1, s2
10618 ; GFX9-NEXT:    v_mov_b32_e32 v2, s0
10619 ; GFX9-NEXT:    s_sub_i32 s1, s7, s11
10620 ; GFX9-NEXT:    v_sub_co_u32_e32 v2, vcc, s6, v2
10621 ; GFX9-NEXT:    s_cmp_lg_u64 vcc, 0
10622 ; GFX9-NEXT:    s_subb_u32 s6, s1, s5
10623 ; GFX9-NEXT:    v_subrev_co_u32_e64 v3, s[0:1], s4, v2
10624 ; GFX9-NEXT:    s_cmp_lg_u64 s[0:1], 0
10625 ; GFX9-NEXT:    s_subb_u32 s12, s6, 0
10626 ; GFX9-NEXT:    s_cmp_ge_u32 s12, s5
10627 ; GFX9-NEXT:    s_cselect_b32 s13, -1, 0
10628 ; GFX9-NEXT:    v_cmp_le_u32_e64 s[2:3], s4, v3
10629 ; GFX9-NEXT:    s_cmp_eq_u32 s12, s5
10630 ; GFX9-NEXT:    v_cndmask_b32_e64 v5, 0, -1, s[2:3]
10631 ; GFX9-NEXT:    v_mov_b32_e32 v6, s13
10632 ; GFX9-NEXT:    s_cselect_b64 s[2:3], -1, 0
10633 ; GFX9-NEXT:    s_cmp_lg_u64 s[0:1], 0
10634 ; GFX9-NEXT:    v_cndmask_b32_e64 v5, v6, v5, s[2:3]
10635 ; GFX9-NEXT:    s_subb_u32 s2, s6, s5
10636 ; GFX9-NEXT:    v_subrev_co_u32_e64 v6, s[0:1], s4, v3
10637 ; GFX9-NEXT:    s_cmp_lg_u64 s[0:1], 0
10638 ; GFX9-NEXT:    s_subb_u32 s2, s2, 0
10639 ; GFX9-NEXT:    v_cmp_ne_u32_e64 s[0:1], 0, v5
10640 ; GFX9-NEXT:    v_cndmask_b32_e64 v3, v3, v6, s[0:1]
10641 ; GFX9-NEXT:    v_mov_b32_e32 v5, s12
10642 ; GFX9-NEXT:    v_mov_b32_e32 v6, s2
10643 ; GFX9-NEXT:    s_cmp_lg_u64 vcc, 0
10644 ; GFX9-NEXT:    v_cndmask_b32_e64 v5, v5, v6, s[0:1]
10645 ; GFX9-NEXT:    s_subb_u32 s0, s7, s11
10646 ; GFX9-NEXT:    s_cmp_ge_u32 s0, s5
10647 ; GFX9-NEXT:    s_cselect_b32 s1, -1, 0
10648 ; GFX9-NEXT:    v_cmp_le_u32_e32 vcc, s4, v2
10649 ; GFX9-NEXT:    s_cmp_eq_u32 s0, s5
10650 ; GFX9-NEXT:    v_cndmask_b32_e64 v6, 0, -1, vcc
10651 ; GFX9-NEXT:    v_mov_b32_e32 v7, s1
10652 ; GFX9-NEXT:    s_cselect_b64 vcc, -1, 0
10653 ; GFX9-NEXT:    v_cndmask_b32_e32 v6, v7, v6, vcc
10654 ; GFX9-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v6
10655 ; GFX9-NEXT:    v_mov_b32_e32 v7, s0
10656 ; GFX9-NEXT:    v_cndmask_b32_e32 v2, v2, v3, vcc
10657 ; GFX9-NEXT:    v_cndmask_b32_e32 v5, v7, v5, vcc
10658 ; GFX9-NEXT:    v_xor_b32_e32 v2, s10, v2
10659 ; GFX9-NEXT:    v_xor_b32_e32 v3, s10, v5
10660 ; GFX9-NEXT:    v_mov_b32_e32 v5, s10
10661 ; GFX9-NEXT:    v_subrev_co_u32_e32 v2, vcc, s10, v2
10662 ; GFX9-NEXT:    v_subb_co_u32_e32 v3, vcc, v3, v5, vcc
10663 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
10664 ; GFX9-NEXT:    global_store_dwordx4 v4, v[0:3], s[8:9]
10665 ; GFX9-NEXT:    s_endpgm
10666   %shl.y = shl <2 x i64> <i64 4096, i64 4096>, %y
10667   %r = srem <2 x i64> %x, %shl.y
10668   store <2 x i64> %r, ptr addrspace(1) %out
10669   ret void