1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -march=amdgcn -mcpu=gfx900 -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefix=GFX9 %s
3; RUN: llc -march=amdgcn -mcpu=gfx1010 -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefix=GFX10 %s
4
5define amdgpu_kernel void @udiv32_invariant_denom(i32 addrspace(1)* nocapture %arg, i32 %arg1) {
6; GFX9-LABEL: udiv32_invariant_denom:
7; GFX9:       ; %bb.0: ; %bb
8; GFX9-NEXT:    s_load_dword s2, s[0:1], 0x2c
9; GFX9-NEXT:    s_mov_b64 s[4:5], 0
10; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
11; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
12; GFX9-NEXT:    v_cvt_f32_u32_e32 v0, s2
13; GFX9-NEXT:    s_sub_i32 s3, 0, s2
14; GFX9-NEXT:    v_rcp_iflag_f32_e32 v0, v0
15; GFX9-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
16; GFX9-NEXT:    v_cvt_u32_f32_e32 v0, v0
17; GFX9-NEXT:    v_mul_lo_u32 v1, s3, v0
18; GFX9-NEXT:    v_mul_hi_u32 v1, v0, v1
19; GFX9-NEXT:    v_add_u32_e32 v0, v0, v1
20; GFX9-NEXT:    v_mov_b32_e32 v1, 0
21; GFX9-NEXT:  BB0_1: ; %bb3
22; GFX9-NEXT:    ; =>This Inner Loop Header: Depth=1
23; GFX9-NEXT:    v_mul_lo_u32 v2, s5, v0
24; GFX9-NEXT:    v_mul_hi_u32 v3, s4, v0
25; GFX9-NEXT:    v_add_u32_e32 v2, v3, v2
26; GFX9-NEXT:    v_mul_lo_u32 v3, s3, v2
27; GFX9-NEXT:    v_not_b32_e32 v5, v2
28; GFX9-NEXT:    v_mul_lo_u32 v5, s2, v5
29; GFX9-NEXT:    v_add_u32_e32 v4, 1, v2
30; GFX9-NEXT:    v_add_u32_e32 v3, s4, v3
31; GFX9-NEXT:    v_cmp_le_u32_e32 vcc, s2, v3
32; GFX9-NEXT:    v_cndmask_b32_e32 v2, v2, v4, vcc
33; GFX9-NEXT:    v_add_u32_e32 v4, s4, v5
34; GFX9-NEXT:    v_cndmask_b32_e32 v3, v3, v4, vcc
35; GFX9-NEXT:    s_add_u32 s4, s4, 1
36; GFX9-NEXT:    v_add_u32_e32 v4, 1, v2
37; GFX9-NEXT:    v_cmp_le_u32_e32 vcc, s2, v3
38; GFX9-NEXT:    v_cndmask_b32_e32 v2, v2, v4, vcc
39; GFX9-NEXT:    s_addc_u32 s5, s5, 0
40; GFX9-NEXT:    global_store_dword v1, v2, s[0:1]
41; GFX9-NEXT:    s_add_u32 s0, s0, 4
42; GFX9-NEXT:    s_addc_u32 s1, s1, 0
43; GFX9-NEXT:    s_cmpk_eq_i32 s4, 0x400
44; GFX9-NEXT:    s_cbranch_scc0 BB0_1
45; GFX9-NEXT:  ; %bb.2: ; %bb2
46; GFX9-NEXT:    s_endpgm
47;
48; GFX10-LABEL: udiv32_invariant_denom:
49; GFX10:       ; %bb.0: ; %bb
50; GFX10-NEXT:    s_load_dword s2, s[0:1], 0x2c
51; GFX10-NEXT:    s_mov_b64 s[4:5], 0
52; GFX10-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
53; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
54; GFX10-NEXT:    v_cvt_f32_u32_e32 v0, s2
55; GFX10-NEXT:    s_sub_i32 s3, 0, s2
56; GFX10-NEXT:    v_rcp_iflag_f32_e32 v0, v0
57; GFX10-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
58; GFX10-NEXT:    v_cvt_u32_f32_e32 v0, v0
59; GFX10-NEXT:    v_mul_lo_u32 v1, s3, v0
60; GFX10-NEXT:    v_mul_hi_u32 v1, v0, v1
61; GFX10-NEXT:    v_add_nc_u32_e32 v0, v0, v1
62; GFX10-NEXT:    v_mov_b32_e32 v1, 0
63; GFX10-NEXT:  BB0_1: ; %bb3
64; GFX10-NEXT:    ; =>This Inner Loop Header: Depth=1
65; GFX10-NEXT:    v_mul_lo_u32 v2, s5, v0
66; GFX10-NEXT:    v_mul_hi_u32 v3, s4, v0
67; GFX10-NEXT:    v_add_nc_u32_e32 v2, v3, v2
68; GFX10-NEXT:    v_mul_lo_u32 v4, s3, v2
69; GFX10-NEXT:    v_not_b32_e32 v3, v2
70; GFX10-NEXT:    v_add_nc_u32_e32 v5, 1, v2
71; GFX10-NEXT:    v_mul_lo_u32 v3, s2, v3
72; GFX10-NEXT:    v_add_nc_u32_e32 v4, s4, v4
73; GFX10-NEXT:    v_cmp_le_u32_e32 vcc_lo, s2, v4
74; GFX10-NEXT:    v_add_nc_u32_e32 v3, s4, v3
75; GFX10-NEXT:    s_add_u32 s4, s4, 1
76; GFX10-NEXT:    s_addc_u32 s5, s5, 0
77; GFX10-NEXT:    v_cndmask_b32_e32 v2, v2, v5, vcc_lo
78; GFX10-NEXT:    v_cndmask_b32_e32 v3, v4, v3, vcc_lo
79; GFX10-NEXT:    v_add_nc_u32_e32 v4, 1, v2
80; GFX10-NEXT:    v_cmp_le_u32_e32 vcc_lo, s2, v3
81; GFX10-NEXT:    v_cndmask_b32_e32 v2, v2, v4, vcc_lo
82; GFX10-NEXT:    global_store_dword v1, v2, s[0:1]
83; GFX10-NEXT:    s_waitcnt_depctr 0xffe3
84; GFX10-NEXT:    s_add_u32 s0, s0, 4
85; GFX10-NEXT:    s_addc_u32 s1, s1, 0
86; GFX10-NEXT:    s_cmpk_eq_i32 s4, 0x400
87; GFX10-NEXT:    s_cbranch_scc0 BB0_1
88; GFX10-NEXT:  ; %bb.2: ; %bb2
89; GFX10-NEXT:    s_endpgm
90bb:
91  br label %bb3
92
93bb2:                                              ; preds = %bb3
94  ret void
95
96bb3:                                              ; preds = %bb3, %bb
97  %tmp = phi i32 [ 0, %bb ], [ %tmp7, %bb3 ]
98  %tmp4 = udiv i32 %tmp, %arg1
99  %tmp5 = zext i32 %tmp to i64
100  %tmp6 = getelementptr inbounds i32, i32 addrspace(1)* %arg, i64 %tmp5
101  store i32 %tmp4, i32 addrspace(1)* %tmp6, align 4
102  %tmp7 = add nuw nsw i32 %tmp, 1
103  %tmp8 = icmp eq i32 %tmp7, 1024
104  br i1 %tmp8, label %bb2, label %bb3
105}
106
107define amdgpu_kernel void @urem32_invariant_denom(i32 addrspace(1)* nocapture %arg, i32 %arg1) {
108; GFX9-LABEL: urem32_invariant_denom:
109; GFX9:       ; %bb.0: ; %bb
110; GFX9-NEXT:    s_load_dword s2, s[0:1], 0x2c
111; GFX9-NEXT:    s_mov_b64 s[4:5], 0
112; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
113; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
114; GFX9-NEXT:    v_cvt_f32_u32_e32 v0, s2
115; GFX9-NEXT:    s_sub_i32 s3, 0, s2
116; GFX9-NEXT:    v_rcp_iflag_f32_e32 v0, v0
117; GFX9-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
118; GFX9-NEXT:    v_cvt_u32_f32_e32 v0, v0
119; GFX9-NEXT:    v_mul_lo_u32 v1, s3, v0
120; GFX9-NEXT:    v_mul_hi_u32 v1, v0, v1
121; GFX9-NEXT:    v_add_u32_e32 v0, v0, v1
122; GFX9-NEXT:    v_mov_b32_e32 v1, 0
123; GFX9-NEXT:  BB1_1: ; %bb3
124; GFX9-NEXT:    ; =>This Inner Loop Header: Depth=1
125; GFX9-NEXT:    v_mul_lo_u32 v2, s5, v0
126; GFX9-NEXT:    v_mul_hi_u32 v3, s4, v0
127; GFX9-NEXT:    v_add_u32_e32 v2, v3, v2
128; GFX9-NEXT:    v_mul_lo_u32 v3, s3, v2
129; GFX9-NEXT:    v_not_b32_e32 v2, v2
130; GFX9-NEXT:    v_mul_lo_u32 v2, s2, v2
131; GFX9-NEXT:    v_add_u32_e32 v3, s4, v3
132; GFX9-NEXT:    v_cmp_le_u32_e32 vcc, s2, v3
133; GFX9-NEXT:    v_add_u32_e32 v2, s4, v2
134; GFX9-NEXT:    v_cndmask_b32_e32 v2, v3, v2, vcc
135; GFX9-NEXT:    s_add_u32 s4, s4, 1
136; GFX9-NEXT:    v_subrev_u32_e32 v3, s2, v2
137; GFX9-NEXT:    v_cmp_le_u32_e32 vcc, s2, v2
138; GFX9-NEXT:    v_cndmask_b32_e32 v2, v2, v3, vcc
139; GFX9-NEXT:    s_addc_u32 s5, s5, 0
140; GFX9-NEXT:    global_store_dword v1, v2, s[0:1]
141; GFX9-NEXT:    s_add_u32 s0, s0, 4
142; GFX9-NEXT:    s_addc_u32 s1, s1, 0
143; GFX9-NEXT:    s_cmpk_eq_i32 s4, 0x400
144; GFX9-NEXT:    s_cbranch_scc0 BB1_1
145; GFX9-NEXT:  ; %bb.2: ; %bb2
146; GFX9-NEXT:    s_endpgm
147;
148; GFX10-LABEL: urem32_invariant_denom:
149; GFX10:       ; %bb.0: ; %bb
150; GFX10-NEXT:    s_load_dword s2, s[0:1], 0x2c
151; GFX10-NEXT:    s_mov_b64 s[4:5], 0
152; GFX10-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
153; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
154; GFX10-NEXT:    v_cvt_f32_u32_e32 v0, s2
155; GFX10-NEXT:    s_sub_i32 s3, 0, s2
156; GFX10-NEXT:    v_rcp_iflag_f32_e32 v0, v0
157; GFX10-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
158; GFX10-NEXT:    v_cvt_u32_f32_e32 v0, v0
159; GFX10-NEXT:    v_mul_lo_u32 v1, s3, v0
160; GFX10-NEXT:    v_mul_hi_u32 v1, v0, v1
161; GFX10-NEXT:    v_add_nc_u32_e32 v0, v0, v1
162; GFX10-NEXT:    v_mov_b32_e32 v1, 0
163; GFX10-NEXT:  BB1_1: ; %bb3
164; GFX10-NEXT:    ; =>This Inner Loop Header: Depth=1
165; GFX10-NEXT:    v_mul_lo_u32 v2, s5, v0
166; GFX10-NEXT:    v_mul_hi_u32 v3, s4, v0
167; GFX10-NEXT:    v_add_nc_u32_e32 v2, v3, v2
168; GFX10-NEXT:    v_not_b32_e32 v3, v2
169; GFX10-NEXT:    v_mul_lo_u32 v2, s3, v2
170; GFX10-NEXT:    v_mul_lo_u32 v3, s2, v3
171; GFX10-NEXT:    v_add_nc_u32_e32 v2, s4, v2
172; GFX10-NEXT:    v_add_nc_u32_e32 v3, s4, v3
173; GFX10-NEXT:    v_cmp_le_u32_e32 vcc_lo, s2, v2
174; GFX10-NEXT:    s_add_u32 s4, s4, 1
175; GFX10-NEXT:    s_addc_u32 s5, s5, 0
176; GFX10-NEXT:    v_cndmask_b32_e32 v2, v2, v3, vcc_lo
177; GFX10-NEXT:    v_subrev_nc_u32_e32 v3, s2, v2
178; GFX10-NEXT:    v_cmp_le_u32_e32 vcc_lo, s2, v2
179; GFX10-NEXT:    v_cndmask_b32_e32 v2, v2, v3, vcc_lo
180; GFX10-NEXT:    global_store_dword v1, v2, s[0:1]
181; GFX10-NEXT:    s_waitcnt_depctr 0xffe3
182; GFX10-NEXT:    s_add_u32 s0, s0, 4
183; GFX10-NEXT:    s_addc_u32 s1, s1, 0
184; GFX10-NEXT:    s_cmpk_eq_i32 s4, 0x400
185; GFX10-NEXT:    s_cbranch_scc0 BB1_1
186; GFX10-NEXT:  ; %bb.2: ; %bb2
187; GFX10-NEXT:    s_endpgm
188bb:
189  br label %bb3
190
191bb2:                                              ; preds = %bb3
192  ret void
193
194bb3:                                              ; preds = %bb3, %bb
195  %tmp = phi i32 [ 0, %bb ], [ %tmp7, %bb3 ]
196  %tmp4 = urem i32 %tmp, %arg1
197  %tmp5 = zext i32 %tmp to i64
198  %tmp6 = getelementptr inbounds i32, i32 addrspace(1)* %arg, i64 %tmp5
199  store i32 %tmp4, i32 addrspace(1)* %tmp6, align 4
200  %tmp7 = add nuw nsw i32 %tmp, 1
201  %tmp8 = icmp eq i32 %tmp7, 1024
202  br i1 %tmp8, label %bb2, label %bb3
203}
204
205define amdgpu_kernel void @sdiv32_invariant_denom(i32 addrspace(1)* nocapture %arg, i32 %arg1) {
206; GFX9-LABEL: sdiv32_invariant_denom:
207; GFX9:       ; %bb.0: ; %bb
208; GFX9-NEXT:    s_load_dword s3, s[0:1], 0x2c
209; GFX9-NEXT:    s_nop 0
210; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
211; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
212; GFX9-NEXT:    s_ashr_i32 s2, s3, 31
213; GFX9-NEXT:    s_add_i32 s3, s3, s2
214; GFX9-NEXT:    s_xor_b32 s3, s3, s2
215; GFX9-NEXT:    v_cvt_f32_u32_e32 v0, s3
216; GFX9-NEXT:    s_sub_i32 s4, 0, s3
217; GFX9-NEXT:    v_rcp_iflag_f32_e32 v0, v0
218; GFX9-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
219; GFX9-NEXT:    v_cvt_u32_f32_e32 v0, v0
220; GFX9-NEXT:    v_mul_lo_u32 v1, s4, v0
221; GFX9-NEXT:    s_mov_b32 s4, 0
222; GFX9-NEXT:    v_mul_hi_u32 v1, v0, v1
223; GFX9-NEXT:    v_add_u32_e32 v0, v0, v1
224; GFX9-NEXT:    v_mov_b32_e32 v1, 0
225; GFX9-NEXT:  BB2_1: ; %bb3
226; GFX9-NEXT:    ; =>This Inner Loop Header: Depth=1
227; GFX9-NEXT:    v_mul_hi_u32 v2, s4, v0
228; GFX9-NEXT:    v_mul_lo_u32 v3, v2, s3
229; GFX9-NEXT:    v_add_u32_e32 v4, 1, v2
230; GFX9-NEXT:    v_sub_u32_e32 v3, s4, v3
231; GFX9-NEXT:    v_cmp_le_u32_e32 vcc, s3, v3
232; GFX9-NEXT:    v_cndmask_b32_e32 v2, v2, v4, vcc
233; GFX9-NEXT:    v_subrev_u32_e32 v4, s3, v3
234; GFX9-NEXT:    v_cndmask_b32_e32 v3, v3, v4, vcc
235; GFX9-NEXT:    v_add_u32_e32 v4, 1, v2
236; GFX9-NEXT:    v_cmp_le_u32_e32 vcc, s3, v3
237; GFX9-NEXT:    v_cndmask_b32_e32 v2, v2, v4, vcc
238; GFX9-NEXT:    v_xor_b32_e32 v2, s2, v2
239; GFX9-NEXT:    v_subrev_u32_e32 v2, s2, v2
240; GFX9-NEXT:    s_add_i32 s4, s4, 1
241; GFX9-NEXT:    global_store_dword v1, v2, s[0:1]
242; GFX9-NEXT:    s_add_u32 s0, s0, 4
243; GFX9-NEXT:    s_addc_u32 s1, s1, 0
244; GFX9-NEXT:    s_cmpk_eq_i32 s4, 0x400
245; GFX9-NEXT:    s_cbranch_scc0 BB2_1
246; GFX9-NEXT:  ; %bb.2: ; %bb2
247; GFX9-NEXT:    s_endpgm
248;
249; GFX10-LABEL: sdiv32_invariant_denom:
250; GFX10:       ; %bb.0: ; %bb
251; GFX10-NEXT:    s_clause 0x1
252; GFX10-NEXT:    s_load_dword s3, s[0:1], 0x2c
253; GFX10-NEXT:    s_nop 0
254; GFX10-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
255; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
256; GFX10-NEXT:    s_ashr_i32 s2, s3, 31
257; GFX10-NEXT:    s_add_i32 s3, s3, s2
258; GFX10-NEXT:    s_xor_b32 s3, s3, s2
259; GFX10-NEXT:    v_cvt_f32_u32_e32 v0, s3
260; GFX10-NEXT:    s_sub_i32 s4, 0, s3
261; GFX10-NEXT:    v_rcp_iflag_f32_e32 v0, v0
262; GFX10-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
263; GFX10-NEXT:    v_cvt_u32_f32_e32 v0, v0
264; GFX10-NEXT:    v_mul_lo_u32 v1, s4, v0
265; GFX10-NEXT:    s_mov_b32 s4, 0
266; GFX10-NEXT:    v_mul_hi_u32 v1, v0, v1
267; GFX10-NEXT:    v_add_nc_u32_e32 v0, v0, v1
268; GFX10-NEXT:    v_mov_b32_e32 v1, 0
269; GFX10-NEXT:  BB2_1: ; %bb3
270; GFX10-NEXT:    ; =>This Inner Loop Header: Depth=1
271; GFX10-NEXT:    v_mul_hi_u32 v2, s4, v0
272; GFX10-NEXT:    v_mul_lo_u32 v3, v2, s3
273; GFX10-NEXT:    v_add_nc_u32_e32 v4, 1, v2
274; GFX10-NEXT:    v_sub_nc_u32_e32 v3, s4, v3
275; GFX10-NEXT:    s_add_i32 s4, s4, 1
276; GFX10-NEXT:    v_cmp_le_u32_e32 vcc_lo, s3, v3
277; GFX10-NEXT:    v_subrev_nc_u32_e32 v5, s3, v3
278; GFX10-NEXT:    v_cndmask_b32_e32 v2, v2, v4, vcc_lo
279; GFX10-NEXT:    v_cndmask_b32_e32 v3, v3, v5, vcc_lo
280; GFX10-NEXT:    v_add_nc_u32_e32 v4, 1, v2
281; GFX10-NEXT:    v_cmp_le_u32_e32 vcc_lo, s3, v3
282; GFX10-NEXT:    v_cndmask_b32_e32 v2, v2, v4, vcc_lo
283; GFX10-NEXT:    v_xor_b32_e32 v2, s2, v2
284; GFX10-NEXT:    v_subrev_nc_u32_e32 v2, s2, v2
285; GFX10-NEXT:    global_store_dword v1, v2, s[0:1]
286; GFX10-NEXT:    s_waitcnt_depctr 0xffe3
287; GFX10-NEXT:    s_add_u32 s0, s0, 4
288; GFX10-NEXT:    s_addc_u32 s1, s1, 0
289; GFX10-NEXT:    s_cmpk_eq_i32 s4, 0x400
290; GFX10-NEXT:    s_cbranch_scc0 BB2_1
291; GFX10-NEXT:  ; %bb.2: ; %bb2
292; GFX10-NEXT:    s_endpgm
293bb:
294  br label %bb3
295
296bb2:                                              ; preds = %bb3
297  ret void
298
299bb3:                                              ; preds = %bb3, %bb
300  %tmp = phi i32 [ 0, %bb ], [ %tmp7, %bb3 ]
301  %tmp4 = sdiv i32 %tmp, %arg1
302  %tmp5 = zext i32 %tmp to i64
303  %tmp6 = getelementptr inbounds i32, i32 addrspace(1)* %arg, i64 %tmp5
304  store i32 %tmp4, i32 addrspace(1)* %tmp6, align 4
305  %tmp7 = add nuw nsw i32 %tmp, 1
306  %tmp8 = icmp eq i32 %tmp7, 1024
307  br i1 %tmp8, label %bb2, label %bb3
308}
309
310define amdgpu_kernel void @srem32_invariant_denom(i32 addrspace(1)* nocapture %arg, i32 %arg1) {
311; GFX9-LABEL: srem32_invariant_denom:
312; GFX9:       ; %bb.0: ; %bb
313; GFX9-NEXT:    s_load_dword s2, s[0:1], 0x2c
314; GFX9-NEXT:    s_nop 0
315; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
316; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
317; GFX9-NEXT:    s_ashr_i32 s3, s2, 31
318; GFX9-NEXT:    s_add_i32 s2, s2, s3
319; GFX9-NEXT:    s_xor_b32 s2, s2, s3
320; GFX9-NEXT:    v_cvt_f32_u32_e32 v0, s2
321; GFX9-NEXT:    s_sub_i32 s3, 0, s2
322; GFX9-NEXT:    v_rcp_iflag_f32_e32 v0, v0
323; GFX9-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
324; GFX9-NEXT:    v_cvt_u32_f32_e32 v0, v0
325; GFX9-NEXT:    v_mul_lo_u32 v1, s3, v0
326; GFX9-NEXT:    s_mov_b32 s3, 0
327; GFX9-NEXT:    v_mul_hi_u32 v1, v0, v1
328; GFX9-NEXT:    v_add_u32_e32 v0, v0, v1
329; GFX9-NEXT:    v_mov_b32_e32 v1, 0
330; GFX9-NEXT:  BB3_1: ; %bb3
331; GFX9-NEXT:    ; =>This Inner Loop Header: Depth=1
332; GFX9-NEXT:    v_mul_hi_u32 v2, s3, v0
333; GFX9-NEXT:    v_mul_lo_u32 v2, v2, s2
334; GFX9-NEXT:    v_sub_u32_e32 v2, s3, v2
335; GFX9-NEXT:    v_subrev_u32_e32 v3, s2, v2
336; GFX9-NEXT:    v_cmp_le_u32_e32 vcc, s2, v2
337; GFX9-NEXT:    v_cndmask_b32_e32 v2, v2, v3, vcc
338; GFX9-NEXT:    v_subrev_u32_e32 v3, s2, v2
339; GFX9-NEXT:    v_cmp_le_u32_e32 vcc, s2, v2
340; GFX9-NEXT:    v_cndmask_b32_e32 v2, v2, v3, vcc
341; GFX9-NEXT:    s_add_i32 s3, s3, 1
342; GFX9-NEXT:    global_store_dword v1, v2, s[0:1]
343; GFX9-NEXT:    s_add_u32 s0, s0, 4
344; GFX9-NEXT:    s_addc_u32 s1, s1, 0
345; GFX9-NEXT:    s_cmpk_eq_i32 s3, 0x400
346; GFX9-NEXT:    s_cbranch_scc0 BB3_1
347; GFX9-NEXT:  ; %bb.2: ; %bb2
348; GFX9-NEXT:    s_endpgm
349;
350; GFX10-LABEL: srem32_invariant_denom:
351; GFX10:       ; %bb.0: ; %bb
352; GFX10-NEXT:    s_clause 0x1
353; GFX10-NEXT:    s_load_dword s2, s[0:1], 0x2c
354; GFX10-NEXT:    s_nop 0
355; GFX10-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
356; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
357; GFX10-NEXT:    s_ashr_i32 s3, s2, 31
358; GFX10-NEXT:    s_add_i32 s2, s2, s3
359; GFX10-NEXT:    s_xor_b32 s2, s2, s3
360; GFX10-NEXT:    v_cvt_f32_u32_e32 v0, s2
361; GFX10-NEXT:    s_sub_i32 s3, 0, s2
362; GFX10-NEXT:    v_rcp_iflag_f32_e32 v0, v0
363; GFX10-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
364; GFX10-NEXT:    v_cvt_u32_f32_e32 v0, v0
365; GFX10-NEXT:    v_mul_lo_u32 v1, s3, v0
366; GFX10-NEXT:    s_mov_b32 s3, 0
367; GFX10-NEXT:    v_mul_hi_u32 v1, v0, v1
368; GFX10-NEXT:    v_add_nc_u32_e32 v0, v0, v1
369; GFX10-NEXT:    v_mov_b32_e32 v1, 0
370; GFX10-NEXT:  BB3_1: ; %bb3
371; GFX10-NEXT:    ; =>This Inner Loop Header: Depth=1
372; GFX10-NEXT:    v_mul_hi_u32 v2, s3, v0
373; GFX10-NEXT:    v_mul_lo_u32 v2, v2, s2
374; GFX10-NEXT:    v_sub_nc_u32_e32 v2, s3, v2
375; GFX10-NEXT:    s_add_i32 s3, s3, 1
376; GFX10-NEXT:    v_subrev_nc_u32_e32 v3, s2, v2
377; GFX10-NEXT:    v_cmp_le_u32_e32 vcc_lo, s2, v2
378; GFX10-NEXT:    v_cndmask_b32_e32 v2, v2, v3, vcc_lo
379; GFX10-NEXT:    v_subrev_nc_u32_e32 v3, s2, v2
380; GFX10-NEXT:    v_cmp_le_u32_e32 vcc_lo, s2, v2
381; GFX10-NEXT:    v_cndmask_b32_e32 v2, v2, v3, vcc_lo
382; GFX10-NEXT:    global_store_dword v1, v2, s[0:1]
383; GFX10-NEXT:    s_waitcnt_depctr 0xffe3
384; GFX10-NEXT:    s_add_u32 s0, s0, 4
385; GFX10-NEXT:    s_addc_u32 s1, s1, 0
386; GFX10-NEXT:    s_cmpk_eq_i32 s3, 0x400
387; GFX10-NEXT:    s_cbranch_scc0 BB3_1
388; GFX10-NEXT:  ; %bb.2: ; %bb2
389; GFX10-NEXT:    s_endpgm
390bb:
391  br label %bb3
392
393bb2:                                              ; preds = %bb3
394  ret void
395
396bb3:                                              ; preds = %bb3, %bb
397  %tmp = phi i32 [ 0, %bb ], [ %tmp7, %bb3 ]
398  %tmp4 = srem i32 %tmp, %arg1
399  %tmp5 = zext i32 %tmp to i64
400  %tmp6 = getelementptr inbounds i32, i32 addrspace(1)* %arg, i64 %tmp5
401  store i32 %tmp4, i32 addrspace(1)* %tmp6, align 4
402  %tmp7 = add nuw nsw i32 %tmp, 1
403  %tmp8 = icmp eq i32 %tmp7, 1024
404  br i1 %tmp8, label %bb2, label %bb3
405}
406
407define amdgpu_kernel void @udiv16_invariant_denom(i16 addrspace(1)* nocapture %arg, i16 %arg1) {
408; GFX9-LABEL: udiv16_invariant_denom:
409; GFX9:       ; %bb.0: ; %bb
410; GFX9-NEXT:    s_load_dword s3, s[0:1], 0x2c
411; GFX9-NEXT:    s_mov_b32 s2, 0xffff
412; GFX9-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
413; GFX9-NEXT:    v_mov_b32_e32 v3, 0
414; GFX9-NEXT:    v_mov_b32_e32 v4, 0
415; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
416; GFX9-NEXT:    s_and_b32 s3, s2, s3
417; GFX9-NEXT:    v_cvt_f32_u32_e32 v0, s3
418; GFX9-NEXT:    s_movk_i32 s3, 0x400
419; GFX9-NEXT:    v_rcp_iflag_f32_e32 v1, v0
420; GFX9-NEXT:  BB4_1: ; %bb3
421; GFX9-NEXT:    ; =>This Inner Loop Header: Depth=1
422; GFX9-NEXT:    v_and_b32_e32 v2, s2, v4
423; GFX9-NEXT:    v_cvt_f32_u32_e32 v8, v2
424; GFX9-NEXT:    v_lshlrev_b64 v[5:6], 1, v[2:3]
425; GFX9-NEXT:    v_mov_b32_e32 v7, s5
426; GFX9-NEXT:    v_add_co_u32_e64 v5, s[0:1], s4, v5
427; GFX9-NEXT:    v_mul_f32_e32 v2, v8, v1
428; GFX9-NEXT:    v_trunc_f32_e32 v2, v2
429; GFX9-NEXT:    v_addc_co_u32_e64 v6, s[0:1], v7, v6, s[0:1]
430; GFX9-NEXT:    v_cvt_u32_f32_e32 v7, v2
431; GFX9-NEXT:    v_add_u16_e32 v4, 1, v4
432; GFX9-NEXT:    v_mad_f32 v2, -v2, v0, v8
433; GFX9-NEXT:    v_cmp_ge_f32_e64 s[0:1], |v2|, v0
434; GFX9-NEXT:    v_cmp_eq_u16_e32 vcc, s3, v4
435; GFX9-NEXT:    v_addc_co_u32_e64 v2, s[0:1], 0, v7, s[0:1]
436; GFX9-NEXT:    s_and_b64 vcc, exec, vcc
437; GFX9-NEXT:    global_store_short v[5:6], v2, off
438; GFX9-NEXT:    s_cbranch_vccz BB4_1
439; GFX9-NEXT:  ; %bb.2: ; %bb2
440; GFX9-NEXT:    s_endpgm
441;
442; GFX10-LABEL: udiv16_invariant_denom:
443; GFX10:       ; %bb.0: ; %bb
444; GFX10-NEXT:    s_clause 0x1
445; GFX10-NEXT:    s_load_dword s4, s[0:1], 0x2c
446; GFX10-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
447; GFX10-NEXT:    s_mov_b32 s1, 0xffff
448; GFX10-NEXT:    v_mov_b32_e32 v3, 0
449; GFX10-NEXT:    v_mov_b32_e32 v4, 0
450; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
451; GFX10-NEXT:    s_and_b32 s0, s1, s4
452; GFX10-NEXT:    v_cvt_f32_u32_e32 v0, s0
453; GFX10-NEXT:    v_rcp_iflag_f32_e32 v1, v0
454; GFX10-NEXT:  BB4_1: ; %bb3
455; GFX10-NEXT:    ; =>This Inner Loop Header: Depth=1
456; GFX10-NEXT:    v_and_b32_e32 v2, s1, v4
457; GFX10-NEXT:    v_add_nc_u16 v4, v4, 1
458; GFX10-NEXT:    v_cvt_f32_u32_e32 v7, v2
459; GFX10-NEXT:    v_lshlrev_b64 v[5:6], 1, v[2:3]
460; GFX10-NEXT:    v_cmp_eq_u16_e32 vcc_lo, 0x400, v4
461; GFX10-NEXT:    v_mul_f32_e32 v2, v7, v1
462; GFX10-NEXT:    v_add_co_u32 v5, s0, s2, v5
463; GFX10-NEXT:    s_and_b32 vcc_lo, exec_lo, vcc_lo
464; GFX10-NEXT:    v_add_co_ci_u32_e64 v6, s0, s3, v6, s0
465; GFX10-NEXT:    v_trunc_f32_e32 v2, v2
466; GFX10-NEXT:    v_mad_f32 v7, -v2, v0, v7
467; GFX10-NEXT:    v_cvt_u32_f32_e32 v2, v2
468; GFX10-NEXT:    v_cmp_ge_f32_e64 s0, |v7|, v0
469; GFX10-NEXT:    v_add_co_ci_u32_e64 v2, s0, 0, v2, s0
470; GFX10-NEXT:    global_store_short v[5:6], v2, off
471; GFX10-NEXT:    s_cbranch_vccz BB4_1
472; GFX10-NEXT:  ; %bb.2: ; %bb2
473; GFX10-NEXT:    s_endpgm
474bb:
475  br label %bb3
476
477bb2:                                              ; preds = %bb3
478  ret void
479
480bb3:                                              ; preds = %bb3, %bb
481  %tmp = phi i16 [ 0, %bb ], [ %tmp7, %bb3 ]
482  %tmp4 = udiv i16 %tmp, %arg1
483  %tmp5 = zext i16 %tmp to i64
484  %tmp6 = getelementptr inbounds i16, i16 addrspace(1)* %arg, i64 %tmp5
485  store i16 %tmp4, i16 addrspace(1)* %tmp6, align 2
486  %tmp7 = add nuw nsw i16 %tmp, 1
487  %tmp8 = icmp eq i16 %tmp7, 1024
488  br i1 %tmp8, label %bb2, label %bb3
489}
490
491define amdgpu_kernel void @urem16_invariant_denom(i16 addrspace(1)* nocapture %arg, i16 %arg1) {
492; GFX9-LABEL: urem16_invariant_denom:
493; GFX9:       ; %bb.0: ; %bb
494; GFX9-NEXT:    s_load_dword s2, s[0:1], 0x2c
495; GFX9-NEXT:    s_mov_b32 s4, 0xffff
496; GFX9-NEXT:    s_load_dwordx2 s[6:7], s[0:1], 0x24
497; GFX9-NEXT:    v_mov_b32_e32 v3, 0
498; GFX9-NEXT:    s_movk_i32 s8, 0x400
499; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
500; GFX9-NEXT:    s_and_b32 s5, s4, s2
501; GFX9-NEXT:    v_cvt_f32_u32_e32 v0, s5
502; GFX9-NEXT:    v_mov_b32_e32 v4, 0
503; GFX9-NEXT:    v_rcp_iflag_f32_e32 v1, v0
504; GFX9-NEXT:  BB5_1: ; %bb3
505; GFX9-NEXT:    ; =>This Inner Loop Header: Depth=1
506; GFX9-NEXT:    v_and_b32_e32 v2, s4, v4
507; GFX9-NEXT:    v_cvt_f32_u32_e32 v8, v2
508; GFX9-NEXT:    v_lshlrev_b64 v[5:6], 1, v[2:3]
509; GFX9-NEXT:    v_add_u16_e32 v4, 1, v4
510; GFX9-NEXT:    v_cmp_eq_u16_e32 vcc, s8, v4
511; GFX9-NEXT:    v_mul_f32_e32 v9, v8, v1
512; GFX9-NEXT:    v_trunc_f32_e32 v9, v9
513; GFX9-NEXT:    v_cvt_u32_f32_e32 v10, v9
514; GFX9-NEXT:    v_mad_f32 v8, -v9, v0, v8
515; GFX9-NEXT:    v_cmp_ge_f32_e64 s[2:3], |v8|, v0
516; GFX9-NEXT:    v_mov_b32_e32 v7, s7
517; GFX9-NEXT:    v_addc_co_u32_e64 v8, s[2:3], 0, v10, s[2:3]
518; GFX9-NEXT:    v_mul_lo_u32 v8, v8, s5
519; GFX9-NEXT:    v_add_co_u32_e64 v5, s[0:1], s6, v5
520; GFX9-NEXT:    s_and_b64 vcc, exec, vcc
521; GFX9-NEXT:    v_addc_co_u32_e64 v6, s[0:1], v7, v6, s[0:1]
522; GFX9-NEXT:    v_sub_u32_e32 v2, v2, v8
523; GFX9-NEXT:    global_store_short v[5:6], v2, off
524; GFX9-NEXT:    s_cbranch_vccz BB5_1
525; GFX9-NEXT:  ; %bb.2: ; %bb2
526; GFX9-NEXT:    s_endpgm
527;
528; GFX10-LABEL: urem16_invariant_denom:
529; GFX10:       ; %bb.0: ; %bb
530; GFX10-NEXT:    s_clause 0x1
531; GFX10-NEXT:    s_load_dword s4, s[0:1], 0x2c
532; GFX10-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
533; GFX10-NEXT:    s_mov_b32 s1, 0xffff
534; GFX10-NEXT:    v_mov_b32_e32 v3, 0
535; GFX10-NEXT:    v_mov_b32_e32 v4, 0
536; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
537; GFX10-NEXT:    s_and_b32 s4, s1, s4
538; GFX10-NEXT:    v_cvt_f32_u32_e32 v0, s4
539; GFX10-NEXT:    v_rcp_iflag_f32_e32 v1, v0
540; GFX10-NEXT:  BB5_1: ; %bb3
541; GFX10-NEXT:    ; =>This Inner Loop Header: Depth=1
542; GFX10-NEXT:    v_and_b32_e32 v2, s1, v4
543; GFX10-NEXT:    v_add_nc_u16 v4, v4, 1
544; GFX10-NEXT:    v_cvt_f32_u32_e32 v7, v2
545; GFX10-NEXT:    v_lshlrev_b64 v[5:6], 1, v[2:3]
546; GFX10-NEXT:    v_mul_f32_e32 v8, v7, v1
547; GFX10-NEXT:    v_add_co_u32 v5, s0, s2, v5
548; GFX10-NEXT:    v_add_co_ci_u32_e64 v6, s0, s3, v6, s0
549; GFX10-NEXT:    v_trunc_f32_e32 v8, v8
550; GFX10-NEXT:    v_mad_f32 v7, -v8, v0, v7
551; GFX10-NEXT:    v_cvt_u32_f32_e32 v8, v8
552; GFX10-NEXT:    v_cmp_ge_f32_e64 vcc_lo, |v7|, v0
553; GFX10-NEXT:    v_add_co_ci_u32_e32 v7, vcc_lo, 0, v8, vcc_lo
554; GFX10-NEXT:    v_cmp_eq_u16_e32 vcc_lo, 0x400, v4
555; GFX10-NEXT:    v_mul_lo_u32 v7, v7, s4
556; GFX10-NEXT:    s_and_b32 vcc_lo, exec_lo, vcc_lo
557; GFX10-NEXT:    v_sub_nc_u32_e32 v2, v2, v7
558; GFX10-NEXT:    global_store_short v[5:6], v2, off
559; GFX10-NEXT:    s_cbranch_vccz BB5_1
560; GFX10-NEXT:  ; %bb.2: ; %bb2
561; GFX10-NEXT:    s_endpgm
562bb:
563  br label %bb3
564
565bb2:                                              ; preds = %bb3
566  ret void
567
568bb3:                                              ; preds = %bb3, %bb
569  %tmp = phi i16 [ 0, %bb ], [ %tmp7, %bb3 ]
570  %tmp4 = urem i16 %tmp, %arg1
571  %tmp5 = zext i16 %tmp to i64
572  %tmp6 = getelementptr inbounds i16, i16 addrspace(1)* %arg, i64 %tmp5
573  store i16 %tmp4, i16 addrspace(1)* %tmp6, align 2
574  %tmp7 = add nuw nsw i16 %tmp, 1
575  %tmp8 = icmp eq i16 %tmp7, 1024
576  br i1 %tmp8, label %bb2, label %bb3
577}
578
579define amdgpu_kernel void @sdiv16_invariant_denom(i16 addrspace(1)* nocapture %arg, i16 %arg1) {
580; GFX9-LABEL: sdiv16_invariant_denom:
581; GFX9:       ; %bb.0: ; %bb
582; GFX9-NEXT:    s_load_dword s2, s[0:1], 0x2c
583; GFX9-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
584; GFX9-NEXT:    v_mov_b32_e32 v3, 0
585; GFX9-NEXT:    s_movk_i32 s3, 0x400
586; GFX9-NEXT:    v_mov_b32_e32 v4, 0
587; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
588; GFX9-NEXT:    s_sext_i32_i16 s2, s2
589; GFX9-NEXT:    v_cvt_f32_i32_e32 v0, s2
590; GFX9-NEXT:    v_rcp_iflag_f32_e32 v1, v0
591; GFX9-NEXT:  BB6_1: ; %bb3
592; GFX9-NEXT:    ; =>This Inner Loop Header: Depth=1
593; GFX9-NEXT:    v_bfe_i32 v5, v4, 0, 16
594; GFX9-NEXT:    v_and_b32_e32 v2, 0xffff, v4
595; GFX9-NEXT:    v_cvt_f32_i32_e32 v9, v5
596; GFX9-NEXT:    v_xor_b32_e32 v8, s2, v5
597; GFX9-NEXT:    v_lshlrev_b64 v[5:6], 1, v[2:3]
598; GFX9-NEXT:    v_mov_b32_e32 v7, s5
599; GFX9-NEXT:    v_add_co_u32_e64 v5, s[0:1], s4, v5
600; GFX9-NEXT:    v_addc_co_u32_e64 v6, s[0:1], v7, v6, s[0:1]
601; GFX9-NEXT:    v_mul_f32_e32 v7, v9, v1
602; GFX9-NEXT:    v_trunc_f32_e32 v7, v7
603; GFX9-NEXT:    v_ashrrev_i32_e32 v2, 30, v8
604; GFX9-NEXT:    v_cvt_i32_f32_e32 v8, v7
605; GFX9-NEXT:    v_mad_f32 v7, -v7, v0, v9
606; GFX9-NEXT:    v_add_u16_e32 v4, 1, v4
607; GFX9-NEXT:    v_or_b32_e32 v2, 1, v2
608; GFX9-NEXT:    v_cmp_ge_f32_e64 s[0:1], |v7|, |v0|
609; GFX9-NEXT:    v_cmp_eq_u16_e32 vcc, s3, v4
610; GFX9-NEXT:    v_cndmask_b32_e64 v2, 0, v2, s[0:1]
611; GFX9-NEXT:    v_add_u32_e32 v2, v8, v2
612; GFX9-NEXT:    s_and_b64 vcc, exec, vcc
613; GFX9-NEXT:    global_store_short v[5:6], v2, off
614; GFX9-NEXT:    s_cbranch_vccz BB6_1
615; GFX9-NEXT:  ; %bb.2: ; %bb2
616; GFX9-NEXT:    s_endpgm
617;
618; GFX10-LABEL: sdiv16_invariant_denom:
619; GFX10:       ; %bb.0: ; %bb
620; GFX10-NEXT:    s_clause 0x1
621; GFX10-NEXT:    s_load_dword s4, s[0:1], 0x2c
622; GFX10-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
623; GFX10-NEXT:    v_mov_b32_e32 v3, 0
624; GFX10-NEXT:    v_mov_b32_e32 v4, 0
625; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
626; GFX10-NEXT:    s_sext_i32_i16 s4, s4
627; GFX10-NEXT:    v_cvt_f32_i32_e32 v0, s4
628; GFX10-NEXT:    v_rcp_iflag_f32_e32 v1, v0
629; GFX10-NEXT:  BB6_1: ; %bb3
630; GFX10-NEXT:    ; =>This Inner Loop Header: Depth=1
631; GFX10-NEXT:    v_bfe_i32 v5, v4, 0, 16
632; GFX10-NEXT:    v_and_b32_e32 v2, 0xffff, v4
633; GFX10-NEXT:    v_add_nc_u16 v4, v4, 1
634; GFX10-NEXT:    v_cvt_f32_i32_e32 v7, v5
635; GFX10-NEXT:    v_xor_b32_e32 v8, s4, v5
636; GFX10-NEXT:    v_lshlrev_b64 v[5:6], 1, v[2:3]
637; GFX10-NEXT:    v_cmp_eq_u16_e32 vcc_lo, 0x400, v4
638; GFX10-NEXT:    v_mul_f32_e32 v2, v7, v1
639; GFX10-NEXT:    v_ashrrev_i32_e32 v8, 30, v8
640; GFX10-NEXT:    v_add_co_u32 v5, s0, s2, v5
641; GFX10-NEXT:    s_and_b32 vcc_lo, exec_lo, vcc_lo
642; GFX10-NEXT:    v_trunc_f32_e32 v2, v2
643; GFX10-NEXT:    v_or_b32_e32 v8, 1, v8
644; GFX10-NEXT:    v_add_co_ci_u32_e64 v6, s0, s3, v6, s0
645; GFX10-NEXT:    v_mad_f32 v7, -v2, v0, v7
646; GFX10-NEXT:    v_cvt_i32_f32_e32 v2, v2
647; GFX10-NEXT:    v_cmp_ge_f32_e64 s1, |v7|, |v0|
648; GFX10-NEXT:    v_cndmask_b32_e64 v7, 0, v8, s1
649; GFX10-NEXT:    v_add_nc_u32_e32 v2, v2, v7
650; GFX10-NEXT:    global_store_short v[5:6], v2, off
651; GFX10-NEXT:    s_cbranch_vccz BB6_1
652; GFX10-NEXT:  ; %bb.2: ; %bb2
653; GFX10-NEXT:    s_endpgm
654bb:
655  br label %bb3
656
657bb2:                                              ; preds = %bb3
658  ret void
659
660bb3:                                              ; preds = %bb3, %bb
661  %tmp = phi i16 [ 0, %bb ], [ %tmp7, %bb3 ]
662  %tmp4 = sdiv i16 %tmp, %arg1
663  %tmp5 = zext i16 %tmp to i64
664  %tmp6 = getelementptr inbounds i16, i16 addrspace(1)* %arg, i64 %tmp5
665  store i16 %tmp4, i16 addrspace(1)* %tmp6, align 2
666  %tmp7 = add nuw nsw i16 %tmp, 1
667  %tmp8 = icmp eq i16 %tmp7, 1024
668  br i1 %tmp8, label %bb2, label %bb3
669}
670
671define amdgpu_kernel void @srem16_invariant_denom(i16 addrspace(1)* nocapture %arg, i16 %arg1) {
672; GFX9-LABEL: srem16_invariant_denom:
673; GFX9:       ; %bb.0: ; %bb
674; GFX9-NEXT:    s_load_dword s2, s[0:1], 0x2c
675; GFX9-NEXT:    s_load_dwordx2 s[6:7], s[0:1], 0x24
676; GFX9-NEXT:    v_mov_b32_e32 v3, 0
677; GFX9-NEXT:    s_movk_i32 s5, 0x400
678; GFX9-NEXT:    v_mov_b32_e32 v4, 0
679; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
680; GFX9-NEXT:    s_sext_i32_i16 s4, s2
681; GFX9-NEXT:    v_cvt_f32_i32_e32 v0, s4
682; GFX9-NEXT:    v_rcp_iflag_f32_e32 v1, v0
683; GFX9-NEXT:  BB7_1: ; %bb3
684; GFX9-NEXT:    ; =>This Inner Loop Header: Depth=1
685; GFX9-NEXT:    v_bfe_i32 v7, v4, 0, 16
686; GFX9-NEXT:    v_cvt_f32_i32_e32 v10, v7
687; GFX9-NEXT:    v_and_b32_e32 v2, 0xffff, v4
688; GFX9-NEXT:    v_xor_b32_e32 v9, s4, v7
689; GFX9-NEXT:    v_lshlrev_b64 v[5:6], 1, v[2:3]
690; GFX9-NEXT:    v_ashrrev_i32_e32 v2, 30, v9
691; GFX9-NEXT:    v_mul_f32_e32 v9, v10, v1
692; GFX9-NEXT:    v_trunc_f32_e32 v9, v9
693; GFX9-NEXT:    v_cvt_i32_f32_e32 v11, v9
694; GFX9-NEXT:    v_mad_f32 v9, -v9, v0, v10
695; GFX9-NEXT:    v_or_b32_e32 v2, 1, v2
696; GFX9-NEXT:    v_cmp_ge_f32_e64 s[2:3], |v9|, |v0|
697; GFX9-NEXT:    v_cndmask_b32_e64 v2, 0, v2, s[2:3]
698; GFX9-NEXT:    v_add_u32_e32 v2, v11, v2
699; GFX9-NEXT:    v_mul_lo_u32 v2, v2, s4
700; GFX9-NEXT:    v_add_u16_e32 v4, 1, v4
701; GFX9-NEXT:    v_cmp_eq_u16_e32 vcc, s5, v4
702; GFX9-NEXT:    v_mov_b32_e32 v8, s7
703; GFX9-NEXT:    v_add_co_u32_e64 v5, s[0:1], s6, v5
704; GFX9-NEXT:    s_and_b64 vcc, exec, vcc
705; GFX9-NEXT:    v_sub_u32_e32 v2, v7, v2
706; GFX9-NEXT:    v_addc_co_u32_e64 v6, s[0:1], v8, v6, s[0:1]
707; GFX9-NEXT:    global_store_short v[5:6], v2, off
708; GFX9-NEXT:    s_cbranch_vccz BB7_1
709; GFX9-NEXT:  ; %bb.2: ; %bb2
710; GFX9-NEXT:    s_endpgm
711;
712; GFX10-LABEL: srem16_invariant_denom:
713; GFX10:       ; %bb.0: ; %bb
714; GFX10-NEXT:    s_clause 0x1
715; GFX10-NEXT:    s_load_dword s4, s[0:1], 0x2c
716; GFX10-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
717; GFX10-NEXT:    v_mov_b32_e32 v3, 0
718; GFX10-NEXT:    v_mov_b32_e32 v4, 0
719; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
720; GFX10-NEXT:    s_sext_i32_i16 s1, s4
721; GFX10-NEXT:    v_cvt_f32_i32_e32 v0, s1
722; GFX10-NEXT:    v_rcp_iflag_f32_e32 v1, v0
723; GFX10-NEXT:  BB7_1: ; %bb3
724; GFX10-NEXT:    ; =>This Inner Loop Header: Depth=1
725; GFX10-NEXT:    v_bfe_i32 v7, v4, 0, 16
726; GFX10-NEXT:    v_and_b32_e32 v2, 0xffff, v4
727; GFX10-NEXT:    v_add_nc_u16 v4, v4, 1
728; GFX10-NEXT:    v_cvt_f32_i32_e32 v5, v7
729; GFX10-NEXT:    v_xor_b32_e32 v6, s1, v7
730; GFX10-NEXT:    v_mul_f32_e32 v8, v5, v1
731; GFX10-NEXT:    v_ashrrev_i32_e32 v6, 30, v6
732; GFX10-NEXT:    v_trunc_f32_e32 v8, v8
733; GFX10-NEXT:    v_or_b32_e32 v6, 1, v6
734; GFX10-NEXT:    v_mad_f32 v5, -v8, v0, v5
735; GFX10-NEXT:    v_cvt_i32_f32_e32 v8, v8
736; GFX10-NEXT:    v_cmp_ge_f32_e64 vcc_lo, |v5|, |v0|
737; GFX10-NEXT:    v_cndmask_b32_e32 v9, 0, v6, vcc_lo
738; GFX10-NEXT:    v_lshlrev_b64 v[5:6], 1, v[2:3]
739; GFX10-NEXT:    v_cmp_eq_u16_e32 vcc_lo, 0x400, v4
740; GFX10-NEXT:    v_add_nc_u32_e32 v2, v8, v9
741; GFX10-NEXT:    v_add_co_u32 v5, s0, s2, v5
742; GFX10-NEXT:    s_and_b32 vcc_lo, exec_lo, vcc_lo
743; GFX10-NEXT:    v_add_co_ci_u32_e64 v6, s0, s3, v6, s0
744; GFX10-NEXT:    v_mul_lo_u32 v2, v2, s1
745; GFX10-NEXT:    v_sub_nc_u32_e32 v2, v7, v2
746; GFX10-NEXT:    global_store_short v[5:6], v2, off
747; GFX10-NEXT:    s_cbranch_vccz BB7_1
748; GFX10-NEXT:  ; %bb.2: ; %bb2
749; GFX10-NEXT:    s_endpgm
750bb:
751  br label %bb3
752
753bb2:                                              ; preds = %bb3
754  ret void
755
756bb3:                                              ; preds = %bb3, %bb
757  %tmp = phi i16 [ 0, %bb ], [ %tmp7, %bb3 ]
758  %tmp4 = srem i16 %tmp, %arg1
759  %tmp5 = zext i16 %tmp to i64
760  %tmp6 = getelementptr inbounds i16, i16 addrspace(1)* %arg, i64 %tmp5
761  store i16 %tmp4, i16 addrspace(1)* %tmp6, align 2
762  %tmp7 = add nuw nsw i16 %tmp, 1
763  %tmp8 = icmp eq i16 %tmp7, 1024
764  br i1 %tmp8, label %bb2, label %bb3
765}
766