[AMDGPU] Make v8i16/v8f16 legal
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / GlobalISel / udivrem.ll
blob5bd27e66550545fad8fdd5c35aef55f6e37d6154
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -global-isel -amdgpu-codegenprepare-disable-idiv-expansion=1 -amdgpu-bypass-slow-div=0 -mtriple=amdgcn-amd-amdhsa -mcpu=tonga -verify-machineinstrs < %s | FileCheck --check-prefix=GFX8 %s
3 ; RUN: llc -global-isel -amdgpu-codegenprepare-disable-idiv-expansion=1 -amdgpu-bypass-slow-div=0 -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -verify-machineinstrs < %s | FileCheck -check-prefix=GFX9 %s
4 ; RUN: llc -global-isel -amdgpu-codegenprepare-disable-idiv-expansion=1 -amdgpu-bypass-slow-div=0 -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1010 -verify-machineinstrs < %s | FileCheck -check-prefix=GFX10 %s
6 define amdgpu_kernel void @udivrem_i32(i32 addrspace(1)* %out0, i32 addrspace(1)* %out1, i32 %x, i32 %y) {
7 ; GFX8-LABEL: udivrem_i32:
8 ; GFX8:       ; %bb.0:
9 ; GFX8-NEXT:    s_load_dwordx2 s[6:7], s[4:5], 0x10
10 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
11 ; GFX8-NEXT:    v_cvt_f32_u32_e32 v0, s7
12 ; GFX8-NEXT:    s_sub_i32 s0, 0, s7
13 ; GFX8-NEXT:    v_rcp_iflag_f32_e32 v0, v0
14 ; GFX8-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
15 ; GFX8-NEXT:    v_cvt_u32_f32_e32 v0, v0
16 ; GFX8-NEXT:    v_mul_lo_u32 v1, s0, v0
17 ; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
18 ; GFX8-NEXT:    v_mul_hi_u32 v1, v0, v1
19 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, v0, v1
20 ; GFX8-NEXT:    v_mul_hi_u32 v2, s6, v0
21 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
22 ; GFX8-NEXT:    v_mov_b32_e32 v0, s0
23 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
24 ; GFX8-NEXT:    v_mul_lo_u32 v3, v2, s7
25 ; GFX8-NEXT:    v_add_u32_e32 v4, vcc, 1, v2
26 ; GFX8-NEXT:    v_sub_u32_e32 v3, vcc, s6, v3
27 ; GFX8-NEXT:    v_cmp_le_u32_e32 vcc, s7, v3
28 ; GFX8-NEXT:    v_cndmask_b32_e32 v2, v2, v4, vcc
29 ; GFX8-NEXT:    v_subrev_u32_e64 v4, s[0:1], s7, v3
30 ; GFX8-NEXT:    v_cndmask_b32_e32 v3, v3, v4, vcc
31 ; GFX8-NEXT:    v_add_u32_e32 v4, vcc, 1, v2
32 ; GFX8-NEXT:    v_cmp_le_u32_e32 vcc, s7, v3
33 ; GFX8-NEXT:    v_cndmask_b32_e32 v2, v2, v4, vcc
34 ; GFX8-NEXT:    v_subrev_u32_e64 v4, s[0:1], s7, v3
35 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
36 ; GFX8-NEXT:    v_mov_b32_e32 v0, s2
37 ; GFX8-NEXT:    v_cndmask_b32_e32 v3, v3, v4, vcc
38 ; GFX8-NEXT:    v_mov_b32_e32 v1, s3
39 ; GFX8-NEXT:    flat_store_dword v[0:1], v3
40 ; GFX8-NEXT:    s_endpgm
42 ; GFX9-LABEL: udivrem_i32:
43 ; GFX9:       ; %bb.0:
44 ; GFX9-NEXT:    s_load_dwordx2 s[6:7], s[4:5], 0x10
45 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0
46 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
47 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v0, s7
48 ; GFX9-NEXT:    s_sub_i32 s0, 0, s7
49 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v0, v0
50 ; GFX9-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
51 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v0, v0
52 ; GFX9-NEXT:    v_mul_lo_u32 v1, s0, v0
53 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
54 ; GFX9-NEXT:    v_mul_hi_u32 v1, v0, v1
55 ; GFX9-NEXT:    v_add_u32_e32 v0, v0, v1
56 ; GFX9-NEXT:    v_mul_hi_u32 v0, s6, v0
57 ; GFX9-NEXT:    v_mul_lo_u32 v1, v0, s7
58 ; GFX9-NEXT:    v_add_u32_e32 v3, 1, v0
59 ; GFX9-NEXT:    v_sub_u32_e32 v1, s6, v1
60 ; GFX9-NEXT:    v_cmp_le_u32_e32 vcc, s7, v1
61 ; GFX9-NEXT:    v_cndmask_b32_e32 v0, v0, v3, vcc
62 ; GFX9-NEXT:    v_subrev_u32_e32 v3, s7, v1
63 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, v1, v3, vcc
64 ; GFX9-NEXT:    v_add_u32_e32 v3, 1, v0
65 ; GFX9-NEXT:    v_cmp_le_u32_e32 vcc, s7, v1
66 ; GFX9-NEXT:    v_cndmask_b32_e32 v0, v0, v3, vcc
67 ; GFX9-NEXT:    v_subrev_u32_e32 v3, s7, v1
68 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, v1, v3, vcc
69 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
70 ; GFX9-NEXT:    global_store_dword v2, v0, s[0:1]
71 ; GFX9-NEXT:    global_store_dword v2, v1, s[2:3]
72 ; GFX9-NEXT:    s_endpgm
74 ; GFX10-LABEL: udivrem_i32:
75 ; GFX10:       ; %bb.0:
76 ; GFX10-NEXT:    s_load_dwordx2 s[6:7], s[4:5], 0x10
77 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
78 ; GFX10-NEXT:    v_cvt_f32_u32_e32 v0, s7
79 ; GFX10-NEXT:    s_sub_i32 s0, 0, s7
80 ; GFX10-NEXT:    v_rcp_iflag_f32_e32 v0, v0
81 ; GFX10-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
82 ; GFX10-NEXT:    v_cvt_u32_f32_e32 v0, v0
83 ; GFX10-NEXT:    v_mul_lo_u32 v1, s0, v0
84 ; GFX10-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
85 ; GFX10-NEXT:    v_mul_hi_u32 v1, v0, v1
86 ; GFX10-NEXT:    v_add_nc_u32_e32 v0, v0, v1
87 ; GFX10-NEXT:    v_mul_hi_u32 v0, s6, v0
88 ; GFX10-NEXT:    v_mul_lo_u32 v1, v0, s7
89 ; GFX10-NEXT:    v_add_nc_u32_e32 v2, 1, v0
90 ; GFX10-NEXT:    v_sub_nc_u32_e32 v1, s6, v1
91 ; GFX10-NEXT:    v_subrev_nc_u32_e32 v3, s7, v1
92 ; GFX10-NEXT:    v_cmp_le_u32_e32 vcc_lo, s7, v1
93 ; GFX10-NEXT:    v_cndmask_b32_e32 v0, v0, v2, vcc_lo
94 ; GFX10-NEXT:    v_cndmask_b32_e32 v1, v1, v3, vcc_lo
95 ; GFX10-NEXT:    v_add_nc_u32_e32 v2, 1, v0
96 ; GFX10-NEXT:    v_cmp_le_u32_e32 vcc_lo, s7, v1
97 ; GFX10-NEXT:    v_subrev_nc_u32_e32 v3, s7, v1
98 ; GFX10-NEXT:    v_cndmask_b32_e32 v0, v0, v2, vcc_lo
99 ; GFX10-NEXT:    v_mov_b32_e32 v2, 0
100 ; GFX10-NEXT:    v_cndmask_b32_e32 v1, v1, v3, vcc_lo
101 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
102 ; GFX10-NEXT:    global_store_dword v2, v0, s[0:1]
103 ; GFX10-NEXT:    global_store_dword v2, v1, s[2:3]
104 ; GFX10-NEXT:    s_endpgm
105   %div = udiv i32 %x, %y
106   store i32 %div, i32 addrspace(1)* %out0
107   %rem = urem i32 %x, %y
108   store i32 %rem, i32 addrspace(1)* %out1
109   ret void
112 define amdgpu_kernel void @udivrem_i64(i64 addrspace(1)* %out0, i64 addrspace(1)* %out1, i64 %x, i64 %y) {
113 ; GFX8-LABEL: udivrem_i64:
114 ; GFX8:       ; %bb.0:
115 ; GFX8-NEXT:    s_load_dwordx8 s[4:11], s[4:5], 0x0
116 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
117 ; GFX8-NEXT:    v_cvt_f32_u32_e32 v0, s11
118 ; GFX8-NEXT:    v_cvt_f32_u32_e32 v1, s10
119 ; GFX8-NEXT:    s_sub_u32 s0, 0, s10
120 ; GFX8-NEXT:    s_cselect_b32 s1, 1, 0
121 ; GFX8-NEXT:    v_mul_f32_e32 v0, 0x4f800000, v0
122 ; GFX8-NEXT:    v_add_f32_e32 v0, v0, v1
123 ; GFX8-NEXT:    v_rcp_iflag_f32_e32 v0, v0
124 ; GFX8-NEXT:    s_and_b32 s1, s1, 1
125 ; GFX8-NEXT:    s_cmp_lg_u32 s1, 0
126 ; GFX8-NEXT:    s_subb_u32 s1, 0, s11
127 ; GFX8-NEXT:    v_mul_f32_e32 v0, 0x5f7ffffc, v0
128 ; GFX8-NEXT:    v_mul_f32_e32 v1, 0x2f800000, v0
129 ; GFX8-NEXT:    v_trunc_f32_e32 v1, v1
130 ; GFX8-NEXT:    v_mul_f32_e32 v2, 0xcf800000, v1
131 ; GFX8-NEXT:    v_add_f32_e32 v0, v2, v0
132 ; GFX8-NEXT:    v_cvt_u32_f32_e32 v1, v1
133 ; GFX8-NEXT:    v_cvt_u32_f32_e32 v0, v0
134 ; GFX8-NEXT:    v_mul_lo_u32 v2, s0, v1
135 ; GFX8-NEXT:    v_mul_lo_u32 v3, s1, v0
136 ; GFX8-NEXT:    v_mul_hi_u32 v5, s0, v0
137 ; GFX8-NEXT:    v_mul_lo_u32 v4, s0, v0
138 ; GFX8-NEXT:    v_add_u32_e32 v2, vcc, v3, v2
139 ; GFX8-NEXT:    v_add_u32_e32 v2, vcc, v2, v5
140 ; GFX8-NEXT:    v_mul_lo_u32 v3, v1, v4
141 ; GFX8-NEXT:    v_mul_lo_u32 v5, v0, v2
142 ; GFX8-NEXT:    v_mul_hi_u32 v6, v0, v4
143 ; GFX8-NEXT:    v_mul_lo_u32 v7, v1, v2
144 ; GFX8-NEXT:    v_mul_hi_u32 v4, v1, v4
145 ; GFX8-NEXT:    v_add_u32_e32 v3, vcc, v3, v5
146 ; GFX8-NEXT:    v_cndmask_b32_e64 v5, 0, 1, vcc
147 ; GFX8-NEXT:    v_add_u32_e32 v3, vcc, v3, v6
148 ; GFX8-NEXT:    v_cndmask_b32_e64 v3, 0, 1, vcc
149 ; GFX8-NEXT:    v_add_u32_e32 v3, vcc, v5, v3
150 ; GFX8-NEXT:    v_mul_hi_u32 v5, v0, v2
151 ; GFX8-NEXT:    v_add_u32_e32 v4, vcc, v7, v4
152 ; GFX8-NEXT:    v_cndmask_b32_e64 v6, 0, 1, vcc
153 ; GFX8-NEXT:    v_add_u32_e32 v4, vcc, v4, v5
154 ; GFX8-NEXT:    v_cndmask_b32_e64 v5, 0, 1, vcc
155 ; GFX8-NEXT:    v_add_u32_e32 v5, vcc, v6, v5
156 ; GFX8-NEXT:    v_mul_hi_u32 v2, v1, v2
157 ; GFX8-NEXT:    v_add_u32_e32 v3, vcc, v4, v3
158 ; GFX8-NEXT:    v_cndmask_b32_e64 v4, 0, 1, vcc
159 ; GFX8-NEXT:    v_add_u32_e32 v4, vcc, v5, v4
160 ; GFX8-NEXT:    v_add_u32_e32 v2, vcc, v2, v4
161 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, v0, v3
162 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, v1, v2, vcc
163 ; GFX8-NEXT:    v_mul_lo_u32 v2, s1, v0
164 ; GFX8-NEXT:    v_mul_lo_u32 v3, s0, v1
165 ; GFX8-NEXT:    v_mul_hi_u32 v5, s0, v0
166 ; GFX8-NEXT:    v_mul_lo_u32 v4, s0, v0
167 ; GFX8-NEXT:    v_mov_b32_e32 v6, s11
168 ; GFX8-NEXT:    v_add_u32_e32 v2, vcc, v2, v3
169 ; GFX8-NEXT:    v_add_u32_e32 v2, vcc, v2, v5
170 ; GFX8-NEXT:    v_mul_lo_u32 v3, v1, v4
171 ; GFX8-NEXT:    v_mul_lo_u32 v5, v0, v2
172 ; GFX8-NEXT:    v_mul_hi_u32 v7, v0, v4
173 ; GFX8-NEXT:    v_mul_hi_u32 v4, v1, v4
174 ; GFX8-NEXT:    v_add_u32_e32 v3, vcc, v3, v5
175 ; GFX8-NEXT:    v_cndmask_b32_e64 v5, 0, 1, vcc
176 ; GFX8-NEXT:    v_add_u32_e32 v3, vcc, v3, v7
177 ; GFX8-NEXT:    v_cndmask_b32_e64 v3, 0, 1, vcc
178 ; GFX8-NEXT:    v_mul_lo_u32 v7, v1, v2
179 ; GFX8-NEXT:    v_add_u32_e32 v3, vcc, v5, v3
180 ; GFX8-NEXT:    v_mul_hi_u32 v5, v0, v2
181 ; GFX8-NEXT:    v_add_u32_e32 v4, vcc, v7, v4
182 ; GFX8-NEXT:    v_cndmask_b32_e64 v7, 0, 1, vcc
183 ; GFX8-NEXT:    v_add_u32_e32 v4, vcc, v4, v5
184 ; GFX8-NEXT:    v_cndmask_b32_e64 v5, 0, 1, vcc
185 ; GFX8-NEXT:    v_add_u32_e32 v5, vcc, v7, v5
186 ; GFX8-NEXT:    v_mul_hi_u32 v2, v1, v2
187 ; GFX8-NEXT:    v_add_u32_e32 v3, vcc, v4, v3
188 ; GFX8-NEXT:    v_cndmask_b32_e64 v4, 0, 1, vcc
189 ; GFX8-NEXT:    v_add_u32_e32 v4, vcc, v5, v4
190 ; GFX8-NEXT:    v_add_u32_e32 v2, vcc, v2, v4
191 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, v0, v3
192 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, v1, v2, vcc
193 ; GFX8-NEXT:    v_mul_lo_u32 v2, s9, v0
194 ; GFX8-NEXT:    v_mul_lo_u32 v3, s8, v1
195 ; GFX8-NEXT:    v_mul_hi_u32 v5, s8, v0
196 ; GFX8-NEXT:    v_mul_hi_u32 v0, s9, v0
197 ; GFX8-NEXT:    v_mov_b32_e32 v4, s9
198 ; GFX8-NEXT:    v_add_u32_e32 v2, vcc, v2, v3
199 ; GFX8-NEXT:    v_cndmask_b32_e64 v3, 0, 1, vcc
200 ; GFX8-NEXT:    v_add_u32_e32 v2, vcc, v2, v5
201 ; GFX8-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
202 ; GFX8-NEXT:    v_mul_lo_u32 v5, s9, v1
203 ; GFX8-NEXT:    v_add_u32_e32 v2, vcc, v3, v2
204 ; GFX8-NEXT:    v_mul_hi_u32 v3, s8, v1
205 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, v5, v0
206 ; GFX8-NEXT:    v_cndmask_b32_e64 v5, 0, 1, vcc
207 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, v0, v3
208 ; GFX8-NEXT:    v_cndmask_b32_e64 v3, 0, 1, vcc
209 ; GFX8-NEXT:    v_add_u32_e32 v3, vcc, v5, v3
210 ; GFX8-NEXT:    v_mul_hi_u32 v1, s9, v1
211 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
212 ; GFX8-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
213 ; GFX8-NEXT:    v_add_u32_e32 v2, vcc, v3, v2
214 ; GFX8-NEXT:    v_add_u32_e32 v1, vcc, v1, v2
215 ; GFX8-NEXT:    v_mul_lo_u32 v2, s11, v0
216 ; GFX8-NEXT:    v_mul_lo_u32 v3, s10, v1
217 ; GFX8-NEXT:    v_mul_hi_u32 v7, s10, v0
218 ; GFX8-NEXT:    v_mul_lo_u32 v5, s10, v0
219 ; GFX8-NEXT:    v_add_u32_e32 v2, vcc, v2, v3
220 ; GFX8-NEXT:    v_add_u32_e32 v2, vcc, v2, v7
221 ; GFX8-NEXT:    v_sub_u32_e32 v3, vcc, s8, v5
222 ; GFX8-NEXT:    v_subb_u32_e64 v4, s[0:1], v4, v2, vcc
223 ; GFX8-NEXT:    v_sub_u32_e64 v2, s[0:1], s9, v2
224 ; GFX8-NEXT:    v_cmp_le_u32_e64 s[0:1], s11, v4
225 ; GFX8-NEXT:    v_cndmask_b32_e64 v5, 0, -1, s[0:1]
226 ; GFX8-NEXT:    v_cmp_le_u32_e64 s[0:1], s10, v3
227 ; GFX8-NEXT:    v_cndmask_b32_e64 v7, 0, -1, s[0:1]
228 ; GFX8-NEXT:    v_cmp_eq_u32_e64 s[0:1], s11, v4
229 ; GFX8-NEXT:    v_subb_u32_e32 v2, vcc, v2, v6, vcc
230 ; GFX8-NEXT:    v_cndmask_b32_e64 v5, v5, v7, s[0:1]
231 ; GFX8-NEXT:    v_subrev_u32_e32 v7, vcc, s10, v3
232 ; GFX8-NEXT:    v_subbrev_u32_e64 v8, s[0:1], 0, v2, vcc
233 ; GFX8-NEXT:    v_add_u32_e64 v9, s[0:1], 1, v0
234 ; GFX8-NEXT:    v_addc_u32_e64 v10, s[0:1], 0, v1, s[0:1]
235 ; GFX8-NEXT:    v_cmp_le_u32_e64 s[0:1], s11, v8
236 ; GFX8-NEXT:    v_cndmask_b32_e64 v11, 0, -1, s[0:1]
237 ; GFX8-NEXT:    v_cmp_le_u32_e64 s[0:1], s10, v7
238 ; GFX8-NEXT:    v_cndmask_b32_e64 v12, 0, -1, s[0:1]
239 ; GFX8-NEXT:    v_cmp_eq_u32_e64 s[0:1], s11, v8
240 ; GFX8-NEXT:    v_subb_u32_e32 v2, vcc, v2, v6, vcc
241 ; GFX8-NEXT:    v_cndmask_b32_e64 v11, v11, v12, s[0:1]
242 ; GFX8-NEXT:    v_add_u32_e64 v12, s[0:1], 1, v9
243 ; GFX8-NEXT:    v_subrev_u32_e32 v6, vcc, s10, v7
244 ; GFX8-NEXT:    v_addc_u32_e64 v13, s[0:1], 0, v10, s[0:1]
245 ; GFX8-NEXT:    v_subbrev_u32_e32 v2, vcc, 0, v2, vcc
246 ; GFX8-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v11
247 ; GFX8-NEXT:    v_cmp_ne_u32_e64 s[0:1], 0, v11
248 ; GFX8-NEXT:    v_cndmask_b32_e32 v9, v9, v12, vcc
249 ; GFX8-NEXT:    v_cndmask_b32_e32 v10, v10, v13, vcc
250 ; GFX8-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v5
251 ; GFX8-NEXT:    v_cndmask_b32_e64 v5, v7, v6, s[0:1]
252 ; GFX8-NEXT:    v_cndmask_b32_e64 v6, v8, v2, s[0:1]
253 ; GFX8-NEXT:    v_cndmask_b32_e32 v2, v3, v5, vcc
254 ; GFX8-NEXT:    v_cndmask_b32_e32 v3, v4, v6, vcc
255 ; GFX8-NEXT:    v_mov_b32_e32 v4, s4
256 ; GFX8-NEXT:    v_cndmask_b32_e32 v0, v0, v9, vcc
257 ; GFX8-NEXT:    v_cndmask_b32_e32 v1, v1, v10, vcc
258 ; GFX8-NEXT:    v_mov_b32_e32 v5, s5
259 ; GFX8-NEXT:    flat_store_dwordx2 v[4:5], v[0:1]
260 ; GFX8-NEXT:    v_mov_b32_e32 v0, s6
261 ; GFX8-NEXT:    v_mov_b32_e32 v1, s7
262 ; GFX8-NEXT:    flat_store_dwordx2 v[0:1], v[2:3]
263 ; GFX8-NEXT:    s_endpgm
265 ; GFX9-LABEL: udivrem_i64:
266 ; GFX9:       ; %bb.0:
267 ; GFX9-NEXT:    s_load_dwordx8 s[4:11], s[4:5], 0x0
268 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
269 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v0, s11
270 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v1, s10
271 ; GFX9-NEXT:    s_sub_u32 s0, 0, s10
272 ; GFX9-NEXT:    s_cselect_b32 s1, 1, 0
273 ; GFX9-NEXT:    v_mul_f32_e32 v0, 0x4f800000, v0
274 ; GFX9-NEXT:    v_add_f32_e32 v0, v0, v1
275 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v0, v0
276 ; GFX9-NEXT:    s_and_b32 s1, s1, 1
277 ; GFX9-NEXT:    s_cmp_lg_u32 s1, 0
278 ; GFX9-NEXT:    s_subb_u32 s1, 0, s11
279 ; GFX9-NEXT:    v_mul_f32_e32 v0, 0x5f7ffffc, v0
280 ; GFX9-NEXT:    v_mul_f32_e32 v1, 0x2f800000, v0
281 ; GFX9-NEXT:    v_trunc_f32_e32 v1, v1
282 ; GFX9-NEXT:    v_mul_f32_e32 v2, 0xcf800000, v1
283 ; GFX9-NEXT:    v_add_f32_e32 v0, v2, v0
284 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v1, v1
285 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v0, v0
286 ; GFX9-NEXT:    v_mul_lo_u32 v2, s0, v1
287 ; GFX9-NEXT:    v_mul_lo_u32 v3, s1, v0
288 ; GFX9-NEXT:    v_mul_hi_u32 v4, s0, v0
289 ; GFX9-NEXT:    v_mul_lo_u32 v5, s0, v0
290 ; GFX9-NEXT:    v_add3_u32 v2, v3, v2, v4
291 ; GFX9-NEXT:    v_mul_lo_u32 v3, v1, v5
292 ; GFX9-NEXT:    v_mul_lo_u32 v6, v0, v2
293 ; GFX9-NEXT:    v_mul_hi_u32 v4, v0, v5
294 ; GFX9-NEXT:    v_mul_hi_u32 v5, v1, v5
295 ; GFX9-NEXT:    v_mul_lo_u32 v7, v1, v2
296 ; GFX9-NEXT:    v_mul_hi_u32 v8, v0, v2
297 ; GFX9-NEXT:    v_add_co_u32_e32 v3, vcc, v3, v6
298 ; GFX9-NEXT:    v_cndmask_b32_e64 v6, 0, 1, vcc
299 ; GFX9-NEXT:    v_add_co_u32_e32 v3, vcc, v3, v4
300 ; GFX9-NEXT:    v_cndmask_b32_e64 v3, 0, 1, vcc
301 ; GFX9-NEXT:    v_add_co_u32_e32 v4, vcc, v7, v5
302 ; GFX9-NEXT:    v_mul_hi_u32 v2, v1, v2
303 ; GFX9-NEXT:    v_add_u32_e32 v3, v6, v3
304 ; GFX9-NEXT:    v_cndmask_b32_e64 v5, 0, 1, vcc
305 ; GFX9-NEXT:    v_add_co_u32_e32 v4, vcc, v4, v8
306 ; GFX9-NEXT:    v_cndmask_b32_e64 v6, 0, 1, vcc
307 ; GFX9-NEXT:    v_add_co_u32_e32 v3, vcc, v4, v3
308 ; GFX9-NEXT:    v_add_u32_e32 v5, v5, v6
309 ; GFX9-NEXT:    v_cndmask_b32_e64 v4, 0, 1, vcc
310 ; GFX9-NEXT:    v_add3_u32 v2, v5, v4, v2
311 ; GFX9-NEXT:    v_add_co_u32_e32 v0, vcc, v0, v3
312 ; GFX9-NEXT:    v_addc_co_u32_e32 v1, vcc, v1, v2, vcc
313 ; GFX9-NEXT:    v_mul_lo_u32 v2, s1, v0
314 ; GFX9-NEXT:    v_mul_lo_u32 v3, s0, v1
315 ; GFX9-NEXT:    v_mul_hi_u32 v4, s0, v0
316 ; GFX9-NEXT:    v_mul_lo_u32 v5, s0, v0
317 ; GFX9-NEXT:    v_mov_b32_e32 v8, s9
318 ; GFX9-NEXT:    v_add3_u32 v2, v2, v3, v4
319 ; GFX9-NEXT:    v_mul_lo_u32 v3, v1, v5
320 ; GFX9-NEXT:    v_mul_lo_u32 v4, v0, v2
321 ; GFX9-NEXT:    v_mul_hi_u32 v6, v0, v5
322 ; GFX9-NEXT:    v_mul_hi_u32 v5, v1, v5
323 ; GFX9-NEXT:    v_add_co_u32_e32 v3, vcc, v3, v4
324 ; GFX9-NEXT:    v_cndmask_b32_e64 v4, 0, 1, vcc
325 ; GFX9-NEXT:    v_add_co_u32_e32 v3, vcc, v3, v6
326 ; GFX9-NEXT:    v_cndmask_b32_e64 v3, 0, 1, vcc
327 ; GFX9-NEXT:    v_mul_lo_u32 v6, v1, v2
328 ; GFX9-NEXT:    v_add_u32_e32 v3, v4, v3
329 ; GFX9-NEXT:    v_mul_hi_u32 v4, v0, v2
330 ; GFX9-NEXT:    v_mul_hi_u32 v2, v1, v2
331 ; GFX9-NEXT:    v_add_co_u32_e32 v5, vcc, v6, v5
332 ; GFX9-NEXT:    v_cndmask_b32_e64 v6, 0, 1, vcc
333 ; GFX9-NEXT:    v_add_co_u32_e32 v4, vcc, v5, v4
334 ; GFX9-NEXT:    v_cndmask_b32_e64 v5, 0, 1, vcc
335 ; GFX9-NEXT:    v_add_co_u32_e32 v3, vcc, v4, v3
336 ; GFX9-NEXT:    v_add_u32_e32 v5, v6, v5
337 ; GFX9-NEXT:    v_cndmask_b32_e64 v4, 0, 1, vcc
338 ; GFX9-NEXT:    v_add3_u32 v2, v5, v4, v2
339 ; GFX9-NEXT:    v_add_co_u32_e32 v0, vcc, v0, v3
340 ; GFX9-NEXT:    v_addc_co_u32_e32 v1, vcc, v1, v2, vcc
341 ; GFX9-NEXT:    v_mul_lo_u32 v2, s9, v0
342 ; GFX9-NEXT:    v_mul_lo_u32 v3, s8, v1
343 ; GFX9-NEXT:    v_mul_hi_u32 v5, s8, v0
344 ; GFX9-NEXT:    v_mul_hi_u32 v0, s9, v0
345 ; GFX9-NEXT:    v_mov_b32_e32 v4, s11
346 ; GFX9-NEXT:    v_add_co_u32_e32 v2, vcc, v2, v3
347 ; GFX9-NEXT:    v_cndmask_b32_e64 v3, 0, 1, vcc
348 ; GFX9-NEXT:    v_add_co_u32_e32 v2, vcc, v2, v5
349 ; GFX9-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
350 ; GFX9-NEXT:    v_mul_lo_u32 v5, s9, v1
351 ; GFX9-NEXT:    v_add_u32_e32 v2, v3, v2
352 ; GFX9-NEXT:    v_mul_hi_u32 v3, s8, v1
353 ; GFX9-NEXT:    v_mul_hi_u32 v1, s9, v1
354 ; GFX9-NEXT:    v_add_co_u32_e32 v0, vcc, v5, v0
355 ; GFX9-NEXT:    v_cndmask_b32_e64 v5, 0, 1, vcc
356 ; GFX9-NEXT:    v_add_co_u32_e32 v0, vcc, v0, v3
357 ; GFX9-NEXT:    v_cndmask_b32_e64 v3, 0, 1, vcc
358 ; GFX9-NEXT:    v_add_co_u32_e32 v0, vcc, v0, v2
359 ; GFX9-NEXT:    v_add_u32_e32 v3, v5, v3
360 ; GFX9-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
361 ; GFX9-NEXT:    v_add3_u32 v1, v3, v2, v1
362 ; GFX9-NEXT:    v_mul_lo_u32 v2, s11, v0
363 ; GFX9-NEXT:    v_mul_lo_u32 v3, s10, v1
364 ; GFX9-NEXT:    v_mul_hi_u32 v5, s10, v0
365 ; GFX9-NEXT:    v_mul_lo_u32 v7, s10, v0
366 ; GFX9-NEXT:    v_mov_b32_e32 v6, 0
367 ; GFX9-NEXT:    v_add3_u32 v2, v2, v3, v5
368 ; GFX9-NEXT:    v_sub_co_u32_e32 v3, vcc, s8, v7
369 ; GFX9-NEXT:    v_subb_co_u32_e64 v5, s[0:1], v8, v2, vcc
370 ; GFX9-NEXT:    v_cmp_le_u32_e64 s[0:1], s11, v5
371 ; GFX9-NEXT:    v_sub_u32_e32 v2, s9, v2
372 ; GFX9-NEXT:    v_cndmask_b32_e64 v7, 0, -1, s[0:1]
373 ; GFX9-NEXT:    v_cmp_le_u32_e64 s[0:1], s10, v3
374 ; GFX9-NEXT:    v_cndmask_b32_e64 v8, 0, -1, s[0:1]
375 ; GFX9-NEXT:    v_cmp_eq_u32_e64 s[0:1], s11, v5
376 ; GFX9-NEXT:    v_subb_co_u32_e32 v2, vcc, v2, v4, vcc
377 ; GFX9-NEXT:    v_cndmask_b32_e64 v7, v7, v8, s[0:1]
378 ; GFX9-NEXT:    v_subrev_co_u32_e32 v8, vcc, s10, v3
379 ; GFX9-NEXT:    v_subbrev_co_u32_e64 v9, s[0:1], 0, v2, vcc
380 ; GFX9-NEXT:    v_add_co_u32_e64 v10, s[0:1], 1, v0
381 ; GFX9-NEXT:    v_addc_co_u32_e64 v11, s[0:1], 0, v1, s[0:1]
382 ; GFX9-NEXT:    v_cmp_le_u32_e64 s[0:1], s11, v9
383 ; GFX9-NEXT:    v_cndmask_b32_e64 v12, 0, -1, s[0:1]
384 ; GFX9-NEXT:    v_cmp_le_u32_e64 s[0:1], s10, v8
385 ; GFX9-NEXT:    v_subb_co_u32_e32 v2, vcc, v2, v4, vcc
386 ; GFX9-NEXT:    v_cndmask_b32_e64 v13, 0, -1, s[0:1]
387 ; GFX9-NEXT:    v_cmp_eq_u32_e64 s[0:1], s11, v9
388 ; GFX9-NEXT:    v_subrev_co_u32_e32 v4, vcc, s10, v8
389 ; GFX9-NEXT:    v_cndmask_b32_e64 v12, v12, v13, s[0:1]
390 ; GFX9-NEXT:    v_add_co_u32_e64 v13, s[0:1], 1, v10
391 ; GFX9-NEXT:    v_subbrev_co_u32_e32 v2, vcc, 0, v2, vcc
392 ; GFX9-NEXT:    v_addc_co_u32_e64 v14, s[0:1], 0, v11, s[0:1]
393 ; GFX9-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v12
394 ; GFX9-NEXT:    v_cndmask_b32_e32 v10, v10, v13, vcc
395 ; GFX9-NEXT:    v_cndmask_b32_e32 v11, v11, v14, vcc
396 ; GFX9-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v7
397 ; GFX9-NEXT:    v_cmp_ne_u32_e64 s[0:1], 0, v12
398 ; GFX9-NEXT:    v_cndmask_b32_e32 v0, v0, v10, vcc
399 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, v1, v11, vcc
400 ; GFX9-NEXT:    v_cndmask_b32_e64 v4, v8, v4, s[0:1]
401 ; GFX9-NEXT:    v_cndmask_b32_e64 v7, v9, v2, s[0:1]
402 ; GFX9-NEXT:    v_cndmask_b32_e32 v2, v3, v4, vcc
403 ; GFX9-NEXT:    v_cndmask_b32_e32 v3, v5, v7, vcc
404 ; GFX9-NEXT:    global_store_dwordx2 v6, v[0:1], s[4:5]
405 ; GFX9-NEXT:    global_store_dwordx2 v6, v[2:3], s[6:7]
406 ; GFX9-NEXT:    s_endpgm
408 ; GFX10-LABEL: udivrem_i64:
409 ; GFX10:       ; %bb.0:
410 ; GFX10-NEXT:    s_load_dwordx8 s[4:11], s[4:5], 0x0
411 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
412 ; GFX10-NEXT:    v_cvt_f32_u32_e32 v0, s11
413 ; GFX10-NEXT:    v_cvt_f32_u32_e32 v1, s10
414 ; GFX10-NEXT:    s_sub_u32 s0, 0, s10
415 ; GFX10-NEXT:    s_cselect_b32 s1, 1, 0
416 ; GFX10-NEXT:    s_and_b32 s1, s1, 1
417 ; GFX10-NEXT:    v_mul_f32_e32 v0, 0x4f800000, v0
418 ; GFX10-NEXT:    s_cmp_lg_u32 s1, 0
419 ; GFX10-NEXT:    s_subb_u32 s1, 0, s11
420 ; GFX10-NEXT:    v_add_f32_e32 v0, v0, v1
421 ; GFX10-NEXT:    v_rcp_iflag_f32_e32 v0, v0
422 ; GFX10-NEXT:    v_mul_f32_e32 v0, 0x5f7ffffc, v0
423 ; GFX10-NEXT:    v_mul_f32_e32 v1, 0x2f800000, v0
424 ; GFX10-NEXT:    v_trunc_f32_e32 v1, v1
425 ; GFX10-NEXT:    v_mul_f32_e32 v2, 0xcf800000, v1
426 ; GFX10-NEXT:    v_cvt_u32_f32_e32 v1, v1
427 ; GFX10-NEXT:    v_add_f32_e32 v0, v2, v0
428 ; GFX10-NEXT:    v_mul_lo_u32 v2, s0, v1
429 ; GFX10-NEXT:    v_cvt_u32_f32_e32 v0, v0
430 ; GFX10-NEXT:    v_mul_lo_u32 v3, s1, v0
431 ; GFX10-NEXT:    v_mul_hi_u32 v4, s0, v0
432 ; GFX10-NEXT:    v_mul_lo_u32 v5, s0, v0
433 ; GFX10-NEXT:    v_add3_u32 v2, v3, v2, v4
434 ; GFX10-NEXT:    v_mul_lo_u32 v3, v1, v5
435 ; GFX10-NEXT:    v_mul_hi_u32 v6, v1, v5
436 ; GFX10-NEXT:    v_mul_hi_u32 v5, v0, v5
437 ; GFX10-NEXT:    v_mul_lo_u32 v4, v0, v2
438 ; GFX10-NEXT:    v_mul_lo_u32 v7, v1, v2
439 ; GFX10-NEXT:    v_mul_hi_u32 v8, v0, v2
440 ; GFX10-NEXT:    v_mul_hi_u32 v2, v1, v2
441 ; GFX10-NEXT:    v_add_co_u32 v3, s2, v3, v4
442 ; GFX10-NEXT:    v_cndmask_b32_e64 v4, 0, 1, s2
443 ; GFX10-NEXT:    v_add_co_u32 v6, s2, v7, v6
444 ; GFX10-NEXT:    v_cndmask_b32_e64 v7, 0, 1, s2
445 ; GFX10-NEXT:    v_add_co_u32 v3, s2, v3, v5
446 ; GFX10-NEXT:    v_cndmask_b32_e64 v3, 0, 1, s2
447 ; GFX10-NEXT:    v_add_co_u32 v5, s2, v6, v8
448 ; GFX10-NEXT:    v_cndmask_b32_e64 v6, 0, 1, s2
449 ; GFX10-NEXT:    v_add_nc_u32_e32 v3, v4, v3
450 ; GFX10-NEXT:    v_add_nc_u32_e32 v4, v7, v6
451 ; GFX10-NEXT:    v_add_co_u32 v3, s2, v5, v3
452 ; GFX10-NEXT:    v_cndmask_b32_e64 v5, 0, 1, s2
453 ; GFX10-NEXT:    v_add_co_u32 v0, vcc_lo, v0, v3
454 ; GFX10-NEXT:    v_add3_u32 v2, v4, v5, v2
455 ; GFX10-NEXT:    v_mul_hi_u32 v3, s0, v0
456 ; GFX10-NEXT:    v_mul_lo_u32 v5, s0, v0
457 ; GFX10-NEXT:    v_add_co_ci_u32_e32 v1, vcc_lo, v1, v2, vcc_lo
458 ; GFX10-NEXT:    v_mul_lo_u32 v2, s1, v0
459 ; GFX10-NEXT:    v_mul_lo_u32 v4, s0, v1
460 ; GFX10-NEXT:    v_mul_hi_u32 v6, v1, v5
461 ; GFX10-NEXT:    v_add3_u32 v2, v2, v4, v3
462 ; GFX10-NEXT:    v_mul_lo_u32 v3, v1, v5
463 ; GFX10-NEXT:    v_mul_hi_u32 v5, v0, v5
464 ; GFX10-NEXT:    v_mul_lo_u32 v4, v0, v2
465 ; GFX10-NEXT:    v_mul_lo_u32 v7, v1, v2
466 ; GFX10-NEXT:    v_mul_hi_u32 v8, v0, v2
467 ; GFX10-NEXT:    v_mul_hi_u32 v2, v1, v2
468 ; GFX10-NEXT:    v_add_co_u32 v3, s0, v3, v4
469 ; GFX10-NEXT:    v_cndmask_b32_e64 v4, 0, 1, s0
470 ; GFX10-NEXT:    v_add_co_u32 v6, s0, v7, v6
471 ; GFX10-NEXT:    v_cndmask_b32_e64 v7, 0, 1, s0
472 ; GFX10-NEXT:    v_add_co_u32 v3, s0, v3, v5
473 ; GFX10-NEXT:    v_cndmask_b32_e64 v3, 0, 1, s0
474 ; GFX10-NEXT:    v_add_co_u32 v5, s0, v6, v8
475 ; GFX10-NEXT:    v_cndmask_b32_e64 v6, 0, 1, s0
476 ; GFX10-NEXT:    v_add_nc_u32_e32 v3, v4, v3
477 ; GFX10-NEXT:    v_add_nc_u32_e32 v4, v7, v6
478 ; GFX10-NEXT:    v_add_co_u32 v3, s0, v5, v3
479 ; GFX10-NEXT:    v_cndmask_b32_e64 v5, 0, 1, s0
480 ; GFX10-NEXT:    v_add_co_u32 v0, vcc_lo, v0, v3
481 ; GFX10-NEXT:    v_add3_u32 v2, v4, v5, v2
482 ; GFX10-NEXT:    v_mul_hi_u32 v4, s9, v0
483 ; GFX10-NEXT:    v_add_co_ci_u32_e32 v1, vcc_lo, v1, v2, vcc_lo
484 ; GFX10-NEXT:    v_mul_lo_u32 v2, s9, v0
485 ; GFX10-NEXT:    v_mul_hi_u32 v0, s8, v0
486 ; GFX10-NEXT:    v_mul_lo_u32 v3, s8, v1
487 ; GFX10-NEXT:    v_mul_lo_u32 v5, s9, v1
488 ; GFX10-NEXT:    v_mul_hi_u32 v6, s8, v1
489 ; GFX10-NEXT:    v_mul_hi_u32 v1, s9, v1
490 ; GFX10-NEXT:    v_add_co_u32 v2, s0, v2, v3
491 ; GFX10-NEXT:    v_cndmask_b32_e64 v3, 0, 1, s0
492 ; GFX10-NEXT:    v_add_co_u32 v4, s0, v5, v4
493 ; GFX10-NEXT:    v_cndmask_b32_e64 v5, 0, 1, s0
494 ; GFX10-NEXT:    v_add_co_u32 v0, s0, v2, v0
495 ; GFX10-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s0
496 ; GFX10-NEXT:    v_add_co_u32 v2, s0, v4, v6
497 ; GFX10-NEXT:    v_cndmask_b32_e64 v4, 0, 1, s0
498 ; GFX10-NEXT:    v_add_nc_u32_e32 v0, v3, v0
499 ; GFX10-NEXT:    v_add_nc_u32_e32 v3, v5, v4
500 ; GFX10-NEXT:    v_add_co_u32 v0, s0, v2, v0
501 ; GFX10-NEXT:    v_cndmask_b32_e64 v2, 0, 1, s0
502 ; GFX10-NEXT:    v_mul_lo_u32 v5, s10, v0
503 ; GFX10-NEXT:    v_add_co_u32 v6, vcc_lo, v0, 1
504 ; GFX10-NEXT:    v_add3_u32 v1, v3, v2, v1
505 ; GFX10-NEXT:    v_mul_lo_u32 v2, s11, v0
506 ; GFX10-NEXT:    v_mul_hi_u32 v3, s10, v0
507 ; GFX10-NEXT:    v_mul_lo_u32 v4, s10, v1
508 ; GFX10-NEXT:    v_add_co_ci_u32_e32 v7, vcc_lo, 0, v1, vcc_lo
509 ; GFX10-NEXT:    v_add3_u32 v2, v2, v4, v3
510 ; GFX10-NEXT:    v_add_co_u32 v3, vcc_lo, v6, 1
511 ; GFX10-NEXT:    v_add_co_ci_u32_e32 v4, vcc_lo, 0, v7, vcc_lo
512 ; GFX10-NEXT:    v_sub_nc_u32_e32 v8, s9, v2
513 ; GFX10-NEXT:    v_sub_co_u32 v5, vcc_lo, s8, v5
514 ; GFX10-NEXT:    v_sub_co_ci_u32_e64 v9, s0, s9, v2, vcc_lo
515 ; GFX10-NEXT:    v_subrev_co_ci_u32_e32 v2, vcc_lo, s11, v8, vcc_lo
516 ; GFX10-NEXT:    v_cmp_le_u32_e32 vcc_lo, s10, v5
517 ; GFX10-NEXT:    v_cndmask_b32_e64 v8, 0, -1, vcc_lo
518 ; GFX10-NEXT:    v_sub_co_u32 v10, vcc_lo, v5, s10
519 ; GFX10-NEXT:    v_subrev_co_ci_u32_e64 v11, s0, 0, v2, vcc_lo
520 ; GFX10-NEXT:    v_cmp_le_u32_e64 s0, s11, v9
521 ; GFX10-NEXT:    v_subrev_co_ci_u32_e32 v2, vcc_lo, s11, v2, vcc_lo
522 ; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, s11, v11
523 ; GFX10-NEXT:    v_cndmask_b32_e64 v12, 0, -1, s0
524 ; GFX10-NEXT:    v_cmp_le_u32_e64 s0, s10, v10
525 ; GFX10-NEXT:    v_cndmask_b32_e64 v13, 0, -1, s0
526 ; GFX10-NEXT:    v_cmp_le_u32_e64 s0, s11, v11
527 ; GFX10-NEXT:    v_cndmask_b32_e64 v14, 0, -1, s0
528 ; GFX10-NEXT:    v_cmp_eq_u32_e64 s0, s11, v9
529 ; GFX10-NEXT:    v_cndmask_b32_e64 v8, v12, v8, s0
530 ; GFX10-NEXT:    v_cndmask_b32_e32 v12, v14, v13, vcc_lo
531 ; GFX10-NEXT:    v_sub_co_u32 v13, vcc_lo, v10, s10
532 ; GFX10-NEXT:    v_subrev_co_ci_u32_e32 v2, vcc_lo, 0, v2, vcc_lo
533 ; GFX10-NEXT:    v_cmp_ne_u32_e32 vcc_lo, 0, v12
534 ; GFX10-NEXT:    v_cmp_ne_u32_e64 s0, 0, v12
535 ; GFX10-NEXT:    v_cmp_ne_u32_e64 s1, 0, v8
536 ; GFX10-NEXT:    v_mov_b32_e32 v8, 0
537 ; GFX10-NEXT:    v_cndmask_b32_e32 v3, v6, v3, vcc_lo
538 ; GFX10-NEXT:    v_cndmask_b32_e32 v4, v7, v4, vcc_lo
539 ; GFX10-NEXT:    v_cndmask_b32_e64 v6, v10, v13, s0
540 ; GFX10-NEXT:    v_cndmask_b32_e64 v7, v11, v2, s0
541 ; GFX10-NEXT:    v_cndmask_b32_e64 v0, v0, v3, s1
542 ; GFX10-NEXT:    v_cndmask_b32_e64 v1, v1, v4, s1
543 ; GFX10-NEXT:    v_cndmask_b32_e64 v2, v5, v6, s1
544 ; GFX10-NEXT:    v_cndmask_b32_e64 v3, v9, v7, s1
545 ; GFX10-NEXT:    global_store_dwordx2 v8, v[0:1], s[4:5]
546 ; GFX10-NEXT:    global_store_dwordx2 v8, v[2:3], s[6:7]
547 ; GFX10-NEXT:    s_endpgm
548   %div = udiv i64 %x, %y
549   store i64 %div, i64 addrspace(1)* %out0
550   %rem = urem i64 %x, %y
551   store i64 %rem, i64 addrspace(1)* %out1
552   ret void
555 define amdgpu_kernel void @udivrem_v2i32(<2 x i32> addrspace(1)* %out0, <2 x i32> addrspace(1)* %out1, <2 x i32> %x, <2 x i32> %y) {
556 ; GFX8-LABEL: udivrem_v2i32:
557 ; GFX8:       ; %bb.0:
558 ; GFX8-NEXT:    s_load_dwordx2 s[2:3], s[4:5], 0x18
559 ; GFX8-NEXT:    s_load_dwordx2 s[8:9], s[4:5], 0x10
560 ; GFX8-NEXT:    s_load_dwordx4 s[4:7], s[4:5], 0x0
561 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
562 ; GFX8-NEXT:    v_cvt_f32_u32_e32 v0, s2
563 ; GFX8-NEXT:    v_cvt_f32_u32_e32 v1, s3
564 ; GFX8-NEXT:    s_sub_i32 s0, 0, s2
565 ; GFX8-NEXT:    v_rcp_iflag_f32_e32 v0, v0
566 ; GFX8-NEXT:    v_rcp_iflag_f32_e32 v1, v1
567 ; GFX8-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
568 ; GFX8-NEXT:    v_cvt_u32_f32_e32 v0, v0
569 ; GFX8-NEXT:    v_mul_f32_e32 v1, 0x4f7ffffe, v1
570 ; GFX8-NEXT:    v_cvt_u32_f32_e32 v1, v1
571 ; GFX8-NEXT:    v_mul_lo_u32 v2, s0, v0
572 ; GFX8-NEXT:    s_sub_i32 s0, 0, s3
573 ; GFX8-NEXT:    v_mul_lo_u32 v3, s0, v1
574 ; GFX8-NEXT:    v_mul_hi_u32 v2, v0, v2
575 ; GFX8-NEXT:    v_mul_hi_u32 v3, v1, v3
576 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
577 ; GFX8-NEXT:    v_mul_hi_u32 v0, s8, v0
578 ; GFX8-NEXT:    v_add_u32_e32 v1, vcc, v1, v3
579 ; GFX8-NEXT:    v_mul_hi_u32 v1, s9, v1
580 ; GFX8-NEXT:    v_mul_lo_u32 v2, v0, s2
581 ; GFX8-NEXT:    v_add_u32_e32 v3, vcc, 1, v0
582 ; GFX8-NEXT:    v_mul_lo_u32 v4, v1, s3
583 ; GFX8-NEXT:    v_sub_u32_e32 v2, vcc, s8, v2
584 ; GFX8-NEXT:    v_cmp_le_u32_e32 vcc, s2, v2
585 ; GFX8-NEXT:    v_cndmask_b32_e32 v0, v0, v3, vcc
586 ; GFX8-NEXT:    v_subrev_u32_e64 v3, s[0:1], s2, v2
587 ; GFX8-NEXT:    v_cndmask_b32_e32 v2, v2, v3, vcc
588 ; GFX8-NEXT:    v_add_u32_e32 v3, vcc, 1, v0
589 ; GFX8-NEXT:    v_cmp_le_u32_e32 vcc, s2, v2
590 ; GFX8-NEXT:    v_cndmask_b32_e32 v0, v0, v3, vcc
591 ; GFX8-NEXT:    v_subrev_u32_e64 v3, s[0:1], s2, v2
592 ; GFX8-NEXT:    v_cndmask_b32_e32 v2, v2, v3, vcc
593 ; GFX8-NEXT:    v_sub_u32_e32 v3, vcc, s9, v4
594 ; GFX8-NEXT:    v_add_u32_e32 v4, vcc, 1, v1
595 ; GFX8-NEXT:    v_cmp_le_u32_e32 vcc, s3, v3
596 ; GFX8-NEXT:    v_cndmask_b32_e32 v1, v1, v4, vcc
597 ; GFX8-NEXT:    v_subrev_u32_e64 v4, s[0:1], s3, v3
598 ; GFX8-NEXT:    v_cndmask_b32_e32 v3, v3, v4, vcc
599 ; GFX8-NEXT:    v_add_u32_e32 v4, vcc, 1, v1
600 ; GFX8-NEXT:    v_cmp_le_u32_e32 vcc, s3, v3
601 ; GFX8-NEXT:    v_cndmask_b32_e32 v1, v1, v4, vcc
602 ; GFX8-NEXT:    v_subrev_u32_e64 v4, s[0:1], s3, v3
603 ; GFX8-NEXT:    v_cndmask_b32_e32 v3, v3, v4, vcc
604 ; GFX8-NEXT:    v_mov_b32_e32 v4, s4
605 ; GFX8-NEXT:    v_mov_b32_e32 v5, s5
606 ; GFX8-NEXT:    flat_store_dwordx2 v[4:5], v[0:1]
607 ; GFX8-NEXT:    v_mov_b32_e32 v0, s6
608 ; GFX8-NEXT:    v_mov_b32_e32 v1, s7
609 ; GFX8-NEXT:    flat_store_dwordx2 v[0:1], v[2:3]
610 ; GFX8-NEXT:    s_endpgm
612 ; GFX9-LABEL: udivrem_v2i32:
613 ; GFX9:       ; %bb.0:
614 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[4:5], 0x18
615 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
616 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v0, s2
617 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v1, s3
618 ; GFX9-NEXT:    s_sub_i32 s0, 0, s2
619 ; GFX9-NEXT:    s_sub_i32 s1, 0, s3
620 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v0, v0
621 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v1, v1
622 ; GFX9-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
623 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v0, v0
624 ; GFX9-NEXT:    v_mul_f32_e32 v1, 0x4f7ffffe, v1
625 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v1, v1
626 ; GFX9-NEXT:    v_mul_lo_u32 v2, s0, v0
627 ; GFX9-NEXT:    v_mul_lo_u32 v3, s1, v1
628 ; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x10
629 ; GFX9-NEXT:    v_mul_hi_u32 v2, v0, v2
630 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[4:5], 0x0
631 ; GFX9-NEXT:    v_mul_hi_u32 v3, v1, v3
632 ; GFX9-NEXT:    v_add_u32_e32 v0, v0, v2
633 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
634 ; GFX9-NEXT:    v_mul_hi_u32 v0, s0, v0
635 ; GFX9-NEXT:    v_add_u32_e32 v1, v1, v3
636 ; GFX9-NEXT:    v_mul_hi_u32 v1, s1, v1
637 ; GFX9-NEXT:    v_mul_lo_u32 v2, v0, s2
638 ; GFX9-NEXT:    v_add_u32_e32 v4, 1, v0
639 ; GFX9-NEXT:    v_mul_lo_u32 v3, v1, s3
640 ; GFX9-NEXT:    v_add_u32_e32 v5, 1, v1
641 ; GFX9-NEXT:    v_sub_u32_e32 v2, s0, v2
642 ; GFX9-NEXT:    v_cmp_le_u32_e32 vcc, s2, v2
643 ; GFX9-NEXT:    v_sub_u32_e32 v3, s1, v3
644 ; GFX9-NEXT:    v_cndmask_b32_e32 v0, v0, v4, vcc
645 ; GFX9-NEXT:    v_subrev_u32_e32 v4, s2, v2
646 ; GFX9-NEXT:    v_cmp_le_u32_e64 s[0:1], s3, v3
647 ; GFX9-NEXT:    v_cndmask_b32_e32 v2, v2, v4, vcc
648 ; GFX9-NEXT:    v_cndmask_b32_e64 v1, v1, v5, s[0:1]
649 ; GFX9-NEXT:    v_subrev_u32_e32 v5, s3, v3
650 ; GFX9-NEXT:    v_add_u32_e32 v4, 1, v0
651 ; GFX9-NEXT:    v_cmp_le_u32_e32 vcc, s2, v2
652 ; GFX9-NEXT:    v_cndmask_b32_e64 v3, v3, v5, s[0:1]
653 ; GFX9-NEXT:    v_cndmask_b32_e32 v0, v0, v4, vcc
654 ; GFX9-NEXT:    v_subrev_u32_e32 v4, s2, v2
655 ; GFX9-NEXT:    v_cndmask_b32_e32 v2, v2, v4, vcc
656 ; GFX9-NEXT:    v_add_u32_e32 v4, 1, v1
657 ; GFX9-NEXT:    v_cmp_le_u32_e32 vcc, s3, v3
658 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, v1, v4, vcc
659 ; GFX9-NEXT:    v_subrev_u32_e32 v4, s3, v3
660 ; GFX9-NEXT:    v_cndmask_b32_e32 v3, v3, v4, vcc
661 ; GFX9-NEXT:    v_mov_b32_e32 v4, 0
662 ; GFX9-NEXT:    global_store_dwordx2 v4, v[0:1], s[4:5]
663 ; GFX9-NEXT:    global_store_dwordx2 v4, v[2:3], s[6:7]
664 ; GFX9-NEXT:    s_endpgm
666 ; GFX10-LABEL: udivrem_v2i32:
667 ; GFX10:       ; %bb.0:
668 ; GFX10-NEXT:    s_load_dwordx2 s[2:3], s[4:5], 0x18
669 ; GFX10-NEXT:    v_mov_b32_e32 v8, 0
670 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
671 ; GFX10-NEXT:    v_cvt_f32_u32_e32 v0, s2
672 ; GFX10-NEXT:    v_cvt_f32_u32_e32 v1, s3
673 ; GFX10-NEXT:    s_sub_i32 s0, 0, s2
674 ; GFX10-NEXT:    s_sub_i32 s1, 0, s3
675 ; GFX10-NEXT:    v_rcp_iflag_f32_e32 v0, v0
676 ; GFX10-NEXT:    v_rcp_iflag_f32_e32 v1, v1
677 ; GFX10-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
678 ; GFX10-NEXT:    v_mul_f32_e32 v1, 0x4f7ffffe, v1
679 ; GFX10-NEXT:    v_cvt_u32_f32_e32 v0, v0
680 ; GFX10-NEXT:    v_cvt_u32_f32_e32 v1, v1
681 ; GFX10-NEXT:    v_mul_lo_u32 v2, s0, v0
682 ; GFX10-NEXT:    v_mul_lo_u32 v3, s1, v1
683 ; GFX10-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x10
684 ; GFX10-NEXT:    v_mul_hi_u32 v2, v0, v2
685 ; GFX10-NEXT:    v_mul_hi_u32 v3, v1, v3
686 ; GFX10-NEXT:    s_load_dwordx4 s[4:7], s[4:5], 0x0
687 ; GFX10-NEXT:    v_add_nc_u32_e32 v0, v0, v2
688 ; GFX10-NEXT:    v_add_nc_u32_e32 v1, v1, v3
689 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
690 ; GFX10-NEXT:    v_mul_hi_u32 v0, s0, v0
691 ; GFX10-NEXT:    v_mul_hi_u32 v1, s1, v1
692 ; GFX10-NEXT:    v_mul_lo_u32 v2, v0, s2
693 ; GFX10-NEXT:    v_mul_lo_u32 v3, v1, s3
694 ; GFX10-NEXT:    v_add_nc_u32_e32 v4, 1, v0
695 ; GFX10-NEXT:    v_add_nc_u32_e32 v5, 1, v1
696 ; GFX10-NEXT:    v_sub_nc_u32_e32 v2, s0, v2
697 ; GFX10-NEXT:    v_sub_nc_u32_e32 v3, s1, v3
698 ; GFX10-NEXT:    v_subrev_nc_u32_e32 v6, s2, v2
699 ; GFX10-NEXT:    v_cmp_le_u32_e32 vcc_lo, s3, v3
700 ; GFX10-NEXT:    v_cmp_le_u32_e64 s0, s2, v2
701 ; GFX10-NEXT:    v_subrev_nc_u32_e32 v7, s3, v3
702 ; GFX10-NEXT:    v_cndmask_b32_e32 v1, v1, v5, vcc_lo
703 ; GFX10-NEXT:    v_cndmask_b32_e64 v0, v0, v4, s0
704 ; GFX10-NEXT:    v_cndmask_b32_e64 v2, v2, v6, s0
705 ; GFX10-NEXT:    v_cndmask_b32_e32 v3, v3, v7, vcc_lo
706 ; GFX10-NEXT:    v_add_nc_u32_e32 v5, 1, v1
707 ; GFX10-NEXT:    v_add_nc_u32_e32 v4, 1, v0
708 ; GFX10-NEXT:    v_cmp_le_u32_e64 s0, s2, v2
709 ; GFX10-NEXT:    v_cmp_le_u32_e32 vcc_lo, s3, v3
710 ; GFX10-NEXT:    v_subrev_nc_u32_e32 v6, s2, v2
711 ; GFX10-NEXT:    v_subrev_nc_u32_e32 v7, s3, v3
712 ; GFX10-NEXT:    v_cndmask_b32_e64 v0, v0, v4, s0
713 ; GFX10-NEXT:    v_cndmask_b32_e32 v1, v1, v5, vcc_lo
714 ; GFX10-NEXT:    v_cndmask_b32_e64 v2, v2, v6, s0
715 ; GFX10-NEXT:    v_cndmask_b32_e32 v3, v3, v7, vcc_lo
716 ; GFX10-NEXT:    global_store_dwordx2 v8, v[0:1], s[4:5]
717 ; GFX10-NEXT:    global_store_dwordx2 v8, v[2:3], s[6:7]
718 ; GFX10-NEXT:    s_endpgm
719   %div = udiv <2 x i32> %x, %y
720   store <2 x i32> %div, <2 x i32> addrspace(1)* %out0
721   %rem = urem <2 x i32> %x, %y
722   store <2 x i32> %rem, <2 x i32> addrspace(1)* %out1
723   ret void
726 define amdgpu_kernel void @udivrem_v4i32(<4 x i32> addrspace(1)* %out0, <4 x i32> addrspace(1)* %out1, <4 x i32> %x, <4 x i32> %y) {
727 ; GFX8-LABEL: udivrem_v4i32:
728 ; GFX8:       ; %bb.0:
729 ; GFX8-NEXT:    s_load_dwordx4 s[8:11], s[4:5], 0x20
730 ; GFX8-NEXT:    s_load_dwordx4 s[12:15], s[4:5], 0x10
731 ; GFX8-NEXT:    v_mov_b32_e32 v2, 0x4f7ffffe
732 ; GFX8-NEXT:    s_load_dwordx4 s[4:7], s[4:5], 0x0
733 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
734 ; GFX8-NEXT:    v_cvt_f32_u32_e32 v0, s8
735 ; GFX8-NEXT:    v_cvt_f32_u32_e32 v1, s9
736 ; GFX8-NEXT:    s_sub_i32 s0, 0, s8
737 ; GFX8-NEXT:    v_cvt_f32_u32_e32 v6, s10
738 ; GFX8-NEXT:    v_rcp_iflag_f32_e32 v0, v0
739 ; GFX8-NEXT:    v_rcp_iflag_f32_e32 v1, v1
740 ; GFX8-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
741 ; GFX8-NEXT:    v_cvt_u32_f32_e32 v0, v0
742 ; GFX8-NEXT:    v_mul_f32_e32 v1, v1, v2
743 ; GFX8-NEXT:    v_cvt_u32_f32_e32 v1, v1
744 ; GFX8-NEXT:    v_mul_lo_u32 v3, s0, v0
745 ; GFX8-NEXT:    s_sub_i32 s0, 0, s9
746 ; GFX8-NEXT:    v_mul_lo_u32 v4, s0, v1
747 ; GFX8-NEXT:    v_mul_hi_u32 v3, v0, v3
748 ; GFX8-NEXT:    v_mul_hi_u32 v4, v1, v4
749 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, v0, v3
750 ; GFX8-NEXT:    v_mul_hi_u32 v0, s12, v0
751 ; GFX8-NEXT:    v_add_u32_e32 v1, vcc, v1, v4
752 ; GFX8-NEXT:    v_mul_hi_u32 v1, s13, v1
753 ; GFX8-NEXT:    v_mul_lo_u32 v3, v0, s8
754 ; GFX8-NEXT:    v_add_u32_e32 v4, vcc, 1, v0
755 ; GFX8-NEXT:    v_mul_lo_u32 v5, v1, s9
756 ; GFX8-NEXT:    v_sub_u32_e32 v3, vcc, s12, v3
757 ; GFX8-NEXT:    v_cmp_le_u32_e32 vcc, s8, v3
758 ; GFX8-NEXT:    v_cndmask_b32_e32 v0, v0, v4, vcc
759 ; GFX8-NEXT:    v_subrev_u32_e64 v4, s[0:1], s8, v3
760 ; GFX8-NEXT:    v_cndmask_b32_e32 v3, v3, v4, vcc
761 ; GFX8-NEXT:    v_add_u32_e32 v4, vcc, 1, v0
762 ; GFX8-NEXT:    v_cmp_le_u32_e32 vcc, s8, v3
763 ; GFX8-NEXT:    v_cndmask_b32_e32 v0, v0, v4, vcc
764 ; GFX8-NEXT:    v_subrev_u32_e64 v4, s[0:1], s8, v3
765 ; GFX8-NEXT:    v_cndmask_b32_e32 v4, v3, v4, vcc
766 ; GFX8-NEXT:    v_sub_u32_e32 v3, vcc, s13, v5
767 ; GFX8-NEXT:    v_rcp_iflag_f32_e32 v5, v6
768 ; GFX8-NEXT:    v_add_u32_e32 v6, vcc, 1, v1
769 ; GFX8-NEXT:    v_cmp_le_u32_e32 vcc, s9, v3
770 ; GFX8-NEXT:    v_mul_f32_e32 v5, v5, v2
771 ; GFX8-NEXT:    v_cndmask_b32_e32 v1, v1, v6, vcc
772 ; GFX8-NEXT:    v_cvt_u32_f32_e32 v5, v5
773 ; GFX8-NEXT:    v_subrev_u32_e64 v6, s[0:1], s9, v3
774 ; GFX8-NEXT:    v_cndmask_b32_e32 v3, v3, v6, vcc
775 ; GFX8-NEXT:    v_add_u32_e32 v6, vcc, 1, v1
776 ; GFX8-NEXT:    v_cmp_le_u32_e32 vcc, s9, v3
777 ; GFX8-NEXT:    s_sub_i32 s0, 0, s10
778 ; GFX8-NEXT:    v_cndmask_b32_e32 v1, v1, v6, vcc
779 ; GFX8-NEXT:    v_cvt_f32_u32_e32 v6, s11
780 ; GFX8-NEXT:    v_mul_lo_u32 v7, s0, v5
781 ; GFX8-NEXT:    v_rcp_iflag_f32_e32 v6, v6
782 ; GFX8-NEXT:    v_mul_hi_u32 v7, v5, v7
783 ; GFX8-NEXT:    v_mul_f32_e32 v2, v6, v2
784 ; GFX8-NEXT:    v_add_u32_e64 v5, s[0:1], v5, v7
785 ; GFX8-NEXT:    v_cvt_u32_f32_e32 v2, v2
786 ; GFX8-NEXT:    v_mul_hi_u32 v7, s14, v5
787 ; GFX8-NEXT:    v_subrev_u32_e64 v5, s[0:1], s9, v3
788 ; GFX8-NEXT:    s_sub_i32 s0, 0, s11
789 ; GFX8-NEXT:    v_mul_lo_u32 v6, s0, v2
790 ; GFX8-NEXT:    v_cndmask_b32_e32 v5, v3, v5, vcc
791 ; GFX8-NEXT:    v_mul_lo_u32 v3, v7, s10
792 ; GFX8-NEXT:    v_add_u32_e32 v8, vcc, 1, v7
793 ; GFX8-NEXT:    v_mul_hi_u32 v6, v2, v6
794 ; GFX8-NEXT:    v_sub_u32_e32 v3, vcc, s14, v3
795 ; GFX8-NEXT:    v_cmp_le_u32_e32 vcc, s10, v3
796 ; GFX8-NEXT:    v_cndmask_b32_e32 v7, v7, v8, vcc
797 ; GFX8-NEXT:    v_subrev_u32_e64 v8, s[0:1], s10, v3
798 ; GFX8-NEXT:    v_cndmask_b32_e32 v3, v3, v8, vcc
799 ; GFX8-NEXT:    v_add_u32_e32 v2, vcc, v2, v6
800 ; GFX8-NEXT:    v_mul_hi_u32 v8, s15, v2
801 ; GFX8-NEXT:    v_add_u32_e32 v2, vcc, 1, v7
802 ; GFX8-NEXT:    v_cmp_le_u32_e32 vcc, s10, v3
803 ; GFX8-NEXT:    v_cndmask_b32_e32 v2, v7, v2, vcc
804 ; GFX8-NEXT:    v_mul_lo_u32 v7, v8, s11
805 ; GFX8-NEXT:    v_subrev_u32_e64 v6, s[0:1], s10, v3
806 ; GFX8-NEXT:    v_cndmask_b32_e32 v6, v3, v6, vcc
807 ; GFX8-NEXT:    v_sub_u32_e32 v3, vcc, s15, v7
808 ; GFX8-NEXT:    v_add_u32_e32 v7, vcc, 1, v8
809 ; GFX8-NEXT:    v_cmp_le_u32_e32 vcc, s11, v3
810 ; GFX8-NEXT:    v_cndmask_b32_e32 v7, v8, v7, vcc
811 ; GFX8-NEXT:    v_subrev_u32_e64 v8, s[0:1], s11, v3
812 ; GFX8-NEXT:    v_cndmask_b32_e32 v8, v3, v8, vcc
813 ; GFX8-NEXT:    v_add_u32_e32 v3, vcc, 1, v7
814 ; GFX8-NEXT:    v_cmp_le_u32_e32 vcc, s11, v8
815 ; GFX8-NEXT:    v_cndmask_b32_e32 v3, v7, v3, vcc
816 ; GFX8-NEXT:    v_subrev_u32_e64 v7, s[0:1], s11, v8
817 ; GFX8-NEXT:    v_cndmask_b32_e32 v7, v8, v7, vcc
818 ; GFX8-NEXT:    v_mov_b32_e32 v9, s5
819 ; GFX8-NEXT:    v_mov_b32_e32 v8, s4
820 ; GFX8-NEXT:    flat_store_dwordx4 v[8:9], v[0:3]
821 ; GFX8-NEXT:    s_nop 0
822 ; GFX8-NEXT:    v_mov_b32_e32 v0, s6
823 ; GFX8-NEXT:    v_mov_b32_e32 v1, s7
824 ; GFX8-NEXT:    flat_store_dwordx4 v[0:1], v[4:7]
825 ; GFX8-NEXT:    s_endpgm
827 ; GFX9-LABEL: udivrem_v4i32:
828 ; GFX9:       ; %bb.0:
829 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x20
830 ; GFX9-NEXT:    s_load_dwordx4 s[8:11], s[4:5], 0x10
831 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0x4f7ffffe
832 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
833 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v0, s0
834 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v1, s1
835 ; GFX9-NEXT:    s_sub_i32 s6, 0, s0
836 ; GFX9-NEXT:    s_sub_i32 s7, 0, s1
837 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v0, v0
838 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v1, v1
839 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v5, s2
840 ; GFX9-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
841 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v0, v0
842 ; GFX9-NEXT:    v_mul_f32_e32 v1, v1, v2
843 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v1, v1
844 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v5, v5
845 ; GFX9-NEXT:    v_mul_lo_u32 v3, s6, v0
846 ; GFX9-NEXT:    v_mul_lo_u32 v4, s7, v1
847 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[4:5], 0x0
848 ; GFX9-NEXT:    v_mul_hi_u32 v3, v0, v3
849 ; GFX9-NEXT:    v_mul_hi_u32 v4, v1, v4
850 ; GFX9-NEXT:    v_add_u32_e32 v0, v0, v3
851 ; GFX9-NEXT:    v_mul_hi_u32 v0, s8, v0
852 ; GFX9-NEXT:    v_add_u32_e32 v1, v1, v4
853 ; GFX9-NEXT:    v_mul_hi_u32 v1, s9, v1
854 ; GFX9-NEXT:    v_mul_f32_e32 v3, v5, v2
855 ; GFX9-NEXT:    v_mul_lo_u32 v4, v0, s0
856 ; GFX9-NEXT:    v_add_u32_e32 v6, 1, v0
857 ; GFX9-NEXT:    v_mul_lo_u32 v5, v1, s1
858 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v3, v3
859 ; GFX9-NEXT:    v_sub_u32_e32 v4, s8, v4
860 ; GFX9-NEXT:    v_cmp_le_u32_e32 vcc, s0, v4
861 ; GFX9-NEXT:    v_cndmask_b32_e32 v0, v0, v6, vcc
862 ; GFX9-NEXT:    v_subrev_u32_e32 v6, s0, v4
863 ; GFX9-NEXT:    v_cndmask_b32_e32 v4, v4, v6, vcc
864 ; GFX9-NEXT:    v_add_u32_e32 v6, 1, v0
865 ; GFX9-NEXT:    v_cmp_le_u32_e32 vcc, s0, v4
866 ; GFX9-NEXT:    v_sub_u32_e32 v5, s9, v5
867 ; GFX9-NEXT:    v_cndmask_b32_e32 v0, v0, v6, vcc
868 ; GFX9-NEXT:    v_subrev_u32_e32 v6, s0, v4
869 ; GFX9-NEXT:    v_cndmask_b32_e32 v4, v4, v6, vcc
870 ; GFX9-NEXT:    v_add_u32_e32 v6, 1, v1
871 ; GFX9-NEXT:    v_cmp_le_u32_e32 vcc, s1, v5
872 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, v1, v6, vcc
873 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v6, s3
874 ; GFX9-NEXT:    s_sub_i32 s0, 0, s2
875 ; GFX9-NEXT:    v_mul_lo_u32 v7, s0, v3
876 ; GFX9-NEXT:    s_sub_i32 s0, 0, s3
877 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v6, v6
878 ; GFX9-NEXT:    v_subrev_u32_e32 v8, s1, v5
879 ; GFX9-NEXT:    v_mul_hi_u32 v7, v3, v7
880 ; GFX9-NEXT:    v_cndmask_b32_e32 v5, v5, v8, vcc
881 ; GFX9-NEXT:    v_mul_f32_e32 v2, v6, v2
882 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v2, v2
883 ; GFX9-NEXT:    v_add_u32_e32 v3, v3, v7
884 ; GFX9-NEXT:    v_mul_hi_u32 v3, s10, v3
885 ; GFX9-NEXT:    v_add_u32_e32 v8, 1, v1
886 ; GFX9-NEXT:    v_mul_lo_u32 v7, s0, v2
887 ; GFX9-NEXT:    v_cmp_le_u32_e32 vcc, s1, v5
888 ; GFX9-NEXT:    v_mul_lo_u32 v6, v3, s2
889 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, v1, v8, vcc
890 ; GFX9-NEXT:    v_mul_hi_u32 v7, v2, v7
891 ; GFX9-NEXT:    v_subrev_u32_e32 v8, s1, v5
892 ; GFX9-NEXT:    v_sub_u32_e32 v6, s10, v6
893 ; GFX9-NEXT:    v_cndmask_b32_e32 v5, v5, v8, vcc
894 ; GFX9-NEXT:    v_add_u32_e32 v2, v2, v7
895 ; GFX9-NEXT:    v_mul_hi_u32 v7, s11, v2
896 ; GFX9-NEXT:    v_add_u32_e32 v8, 1, v3
897 ; GFX9-NEXT:    v_cmp_le_u32_e32 vcc, s2, v6
898 ; GFX9-NEXT:    v_cndmask_b32_e32 v3, v3, v8, vcc
899 ; GFX9-NEXT:    v_subrev_u32_e32 v2, s2, v6
900 ; GFX9-NEXT:    v_mul_lo_u32 v8, v7, s3
901 ; GFX9-NEXT:    v_cndmask_b32_e32 v6, v6, v2, vcc
902 ; GFX9-NEXT:    v_add_u32_e32 v2, 1, v3
903 ; GFX9-NEXT:    v_cmp_le_u32_e32 vcc, s2, v6
904 ; GFX9-NEXT:    v_cndmask_b32_e32 v2, v3, v2, vcc
905 ; GFX9-NEXT:    v_subrev_u32_e32 v3, s2, v6
906 ; GFX9-NEXT:    v_cndmask_b32_e32 v6, v6, v3, vcc
907 ; GFX9-NEXT:    v_sub_u32_e32 v3, s11, v8
908 ; GFX9-NEXT:    v_add_u32_e32 v8, 1, v7
909 ; GFX9-NEXT:    v_cmp_le_u32_e32 vcc, s3, v3
910 ; GFX9-NEXT:    v_cndmask_b32_e32 v7, v7, v8, vcc
911 ; GFX9-NEXT:    v_subrev_u32_e32 v8, s3, v3
912 ; GFX9-NEXT:    v_cndmask_b32_e32 v8, v3, v8, vcc
913 ; GFX9-NEXT:    v_add_u32_e32 v3, 1, v7
914 ; GFX9-NEXT:    v_cmp_le_u32_e32 vcc, s3, v8
915 ; GFX9-NEXT:    v_cndmask_b32_e32 v3, v7, v3, vcc
916 ; GFX9-NEXT:    v_subrev_u32_e32 v7, s3, v8
917 ; GFX9-NEXT:    v_cndmask_b32_e32 v7, v8, v7, vcc
918 ; GFX9-NEXT:    v_mov_b32_e32 v8, 0
919 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
920 ; GFX9-NEXT:    global_store_dwordx4 v8, v[0:3], s[4:5]
921 ; GFX9-NEXT:    global_store_dwordx4 v8, v[4:7], s[6:7]
922 ; GFX9-NEXT:    s_endpgm
924 ; GFX10-LABEL: udivrem_v4i32:
925 ; GFX10:       ; %bb.0:
926 ; GFX10-NEXT:    s_clause 0x1
927 ; GFX10-NEXT:    s_load_dwordx4 s[8:11], s[4:5], 0x20
928 ; GFX10-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x10
929 ; GFX10-NEXT:    v_mov_b32_e32 v4, 0x4f7ffffe
930 ; GFX10-NEXT:    v_mov_b32_e32 v8, 0
931 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
932 ; GFX10-NEXT:    v_cvt_f32_u32_e32 v0, s8
933 ; GFX10-NEXT:    v_cvt_f32_u32_e32 v1, s9
934 ; GFX10-NEXT:    v_cvt_f32_u32_e32 v2, s10
935 ; GFX10-NEXT:    v_cvt_f32_u32_e32 v3, s11
936 ; GFX10-NEXT:    s_sub_i32 s6, 0, s8
937 ; GFX10-NEXT:    v_rcp_iflag_f32_e32 v0, v0
938 ; GFX10-NEXT:    v_rcp_iflag_f32_e32 v1, v1
939 ; GFX10-NEXT:    v_rcp_iflag_f32_e32 v2, v2
940 ; GFX10-NEXT:    v_rcp_iflag_f32_e32 v3, v3
941 ; GFX10-NEXT:    s_sub_i32 s7, 0, s9
942 ; GFX10-NEXT:    s_sub_i32 s12, 0, s10
943 ; GFX10-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
944 ; GFX10-NEXT:    v_mul_f32_e32 v1, v1, v4
945 ; GFX10-NEXT:    v_mul_f32_e32 v2, v2, v4
946 ; GFX10-NEXT:    v_mul_f32_e32 v3, v3, v4
947 ; GFX10-NEXT:    v_cvt_u32_f32_e32 v0, v0
948 ; GFX10-NEXT:    v_cvt_u32_f32_e32 v1, v1
949 ; GFX10-NEXT:    v_cvt_u32_f32_e32 v2, v2
950 ; GFX10-NEXT:    v_cvt_u32_f32_e32 v3, v3
951 ; GFX10-NEXT:    v_mul_lo_u32 v4, s6, v0
952 ; GFX10-NEXT:    v_mul_lo_u32 v5, s7, v1
953 ; GFX10-NEXT:    v_mul_lo_u32 v6, s12, v2
954 ; GFX10-NEXT:    s_sub_i32 s6, 0, s11
955 ; GFX10-NEXT:    v_mul_lo_u32 v7, s6, v3
956 ; GFX10-NEXT:    s_load_dwordx4 s[4:7], s[4:5], 0x0
957 ; GFX10-NEXT:    v_mul_hi_u32 v4, v0, v4
958 ; GFX10-NEXT:    v_mul_hi_u32 v5, v1, v5
959 ; GFX10-NEXT:    v_mul_hi_u32 v6, v2, v6
960 ; GFX10-NEXT:    v_mul_hi_u32 v7, v3, v7
961 ; GFX10-NEXT:    v_add_nc_u32_e32 v0, v0, v4
962 ; GFX10-NEXT:    v_add_nc_u32_e32 v1, v1, v5
963 ; GFX10-NEXT:    v_add_nc_u32_e32 v2, v2, v6
964 ; GFX10-NEXT:    v_add_nc_u32_e32 v3, v3, v7
965 ; GFX10-NEXT:    v_mul_hi_u32 v0, s0, v0
966 ; GFX10-NEXT:    v_mul_hi_u32 v1, s1, v1
967 ; GFX10-NEXT:    v_mul_hi_u32 v2, s2, v2
968 ; GFX10-NEXT:    v_mul_hi_u32 v3, s3, v3
969 ; GFX10-NEXT:    v_mul_lo_u32 v4, v0, s8
970 ; GFX10-NEXT:    v_mul_lo_u32 v5, v1, s9
971 ; GFX10-NEXT:    v_mul_lo_u32 v6, v2, s10
972 ; GFX10-NEXT:    v_add_nc_u32_e32 v9, 1, v0
973 ; GFX10-NEXT:    v_mul_lo_u32 v7, v3, s11
974 ; GFX10-NEXT:    v_add_nc_u32_e32 v10, 1, v1
975 ; GFX10-NEXT:    v_add_nc_u32_e32 v11, 1, v2
976 ; GFX10-NEXT:    v_add_nc_u32_e32 v12, 1, v3
977 ; GFX10-NEXT:    v_sub_nc_u32_e32 v4, s0, v4
978 ; GFX10-NEXT:    v_sub_nc_u32_e32 v5, s1, v5
979 ; GFX10-NEXT:    v_sub_nc_u32_e32 v6, s2, v6
980 ; GFX10-NEXT:    v_sub_nc_u32_e32 v7, s3, v7
981 ; GFX10-NEXT:    v_cmp_le_u32_e32 vcc_lo, s8, v4
982 ; GFX10-NEXT:    v_cmp_le_u32_e64 s0, s9, v5
983 ; GFX10-NEXT:    v_cmp_le_u32_e64 s1, s10, v6
984 ; GFX10-NEXT:    v_cmp_le_u32_e64 s2, s11, v7
985 ; GFX10-NEXT:    v_cndmask_b32_e32 v0, v0, v9, vcc_lo
986 ; GFX10-NEXT:    v_subrev_nc_u32_e32 v9, s8, v4
987 ; GFX10-NEXT:    v_cndmask_b32_e64 v1, v1, v10, s0
988 ; GFX10-NEXT:    v_subrev_nc_u32_e32 v10, s9, v5
989 ; GFX10-NEXT:    v_cndmask_b32_e64 v2, v2, v11, s1
990 ; GFX10-NEXT:    v_subrev_nc_u32_e32 v11, s10, v6
991 ; GFX10-NEXT:    v_cndmask_b32_e64 v3, v3, v12, s2
992 ; GFX10-NEXT:    v_subrev_nc_u32_e32 v12, s11, v7
993 ; GFX10-NEXT:    v_cndmask_b32_e32 v4, v4, v9, vcc_lo
994 ; GFX10-NEXT:    v_cndmask_b32_e64 v5, v5, v10, s0
995 ; GFX10-NEXT:    v_cndmask_b32_e64 v6, v6, v11, s1
996 ; GFX10-NEXT:    v_add_nc_u32_e32 v9, 1, v0
997 ; GFX10-NEXT:    v_cndmask_b32_e64 v7, v7, v12, s2
998 ; GFX10-NEXT:    v_add_nc_u32_e32 v10, 1, v1
999 ; GFX10-NEXT:    v_add_nc_u32_e32 v11, 1, v2
1000 ; GFX10-NEXT:    v_cmp_le_u32_e32 vcc_lo, s8, v4
1001 ; GFX10-NEXT:    v_cmp_le_u32_e64 s0, s9, v5
1002 ; GFX10-NEXT:    v_cmp_le_u32_e64 s1, s10, v6
1003 ; GFX10-NEXT:    v_add_nc_u32_e32 v12, 1, v3
1004 ; GFX10-NEXT:    v_cmp_le_u32_e64 s2, s11, v7
1005 ; GFX10-NEXT:    v_cndmask_b32_e32 v0, v0, v9, vcc_lo
1006 ; GFX10-NEXT:    v_subrev_nc_u32_e32 v9, s8, v4
1007 ; GFX10-NEXT:    v_cndmask_b32_e64 v1, v1, v10, s0
1008 ; GFX10-NEXT:    v_subrev_nc_u32_e32 v10, s9, v5
1009 ; GFX10-NEXT:    v_cndmask_b32_e64 v2, v2, v11, s1
1010 ; GFX10-NEXT:    v_subrev_nc_u32_e32 v11, s10, v6
1011 ; GFX10-NEXT:    v_subrev_nc_u32_e32 v13, s11, v7
1012 ; GFX10-NEXT:    v_cndmask_b32_e64 v3, v3, v12, s2
1013 ; GFX10-NEXT:    v_cndmask_b32_e32 v4, v4, v9, vcc_lo
1014 ; GFX10-NEXT:    v_cndmask_b32_e64 v5, v5, v10, s0
1015 ; GFX10-NEXT:    v_cndmask_b32_e64 v6, v6, v11, s1
1016 ; GFX10-NEXT:    v_cndmask_b32_e64 v7, v7, v13, s2
1017 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
1018 ; GFX10-NEXT:    global_store_dwordx4 v8, v[0:3], s[4:5]
1019 ; GFX10-NEXT:    global_store_dwordx4 v8, v[4:7], s[6:7]
1020 ; GFX10-NEXT:    s_endpgm
1021   %div = udiv <4 x i32> %x, %y
1022   store <4 x i32> %div, <4 x i32> addrspace(1)* %out0
1023   %rem = urem <4 x i32> %x, %y
1024   store <4 x i32> %rem, <4 x i32> addrspace(1)* %out1
1025   ret void
1028 define amdgpu_kernel void @udivrem_v2i64(<2 x i64> addrspace(1)* %out0, <2 x i64> addrspace(1)* %out1, <2 x i64> %x, <2 x i64> %y) {
1029 ; GFX8-LABEL: udivrem_v2i64:
1030 ; GFX8:       ; %bb.0:
1031 ; GFX8-NEXT:    s_load_dwordx4 s[8:11], s[4:5], 0x20
1032 ; GFX8-NEXT:    s_load_dwordx4 s[12:15], s[4:5], 0x10
1033 ; GFX8-NEXT:    s_load_dwordx4 s[4:7], s[4:5], 0x0
1034 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1035 ; GFX8-NEXT:    v_cvt_f32_u32_e32 v0, s9
1036 ; GFX8-NEXT:    v_cvt_f32_u32_e32 v1, s8
1037 ; GFX8-NEXT:    s_sub_u32 s0, 0, s8
1038 ; GFX8-NEXT:    s_cselect_b32 s1, 1, 0
1039 ; GFX8-NEXT:    v_mul_f32_e32 v0, 0x4f800000, v0
1040 ; GFX8-NEXT:    v_add_f32_e32 v0, v0, v1
1041 ; GFX8-NEXT:    v_rcp_iflag_f32_e32 v0, v0
1042 ; GFX8-NEXT:    s_and_b32 s1, s1, 1
1043 ; GFX8-NEXT:    s_cmp_lg_u32 s1, 0
1044 ; GFX8-NEXT:    s_subb_u32 s1, 0, s9
1045 ; GFX8-NEXT:    v_mul_f32_e32 v0, 0x5f7ffffc, v0
1046 ; GFX8-NEXT:    v_mul_f32_e32 v1, 0x2f800000, v0
1047 ; GFX8-NEXT:    v_trunc_f32_e32 v1, v1
1048 ; GFX8-NEXT:    v_mul_f32_e32 v2, 0xcf800000, v1
1049 ; GFX8-NEXT:    v_add_f32_e32 v0, v2, v0
1050 ; GFX8-NEXT:    v_cvt_u32_f32_e32 v1, v1
1051 ; GFX8-NEXT:    v_cvt_u32_f32_e32 v0, v0
1052 ; GFX8-NEXT:    s_sub_u32 s2, 0, s10
1053 ; GFX8-NEXT:    v_mul_lo_u32 v2, s0, v1
1054 ; GFX8-NEXT:    v_mul_lo_u32 v3, s1, v0
1055 ; GFX8-NEXT:    v_mul_hi_u32 v5, s0, v0
1056 ; GFX8-NEXT:    v_mul_lo_u32 v4, s0, v0
1057 ; GFX8-NEXT:    v_add_u32_e32 v2, vcc, v3, v2
1058 ; GFX8-NEXT:    v_add_u32_e32 v2, vcc, v2, v5
1059 ; GFX8-NEXT:    v_mul_lo_u32 v3, v1, v4
1060 ; GFX8-NEXT:    v_mul_lo_u32 v5, v0, v2
1061 ; GFX8-NEXT:    v_mul_hi_u32 v6, v0, v4
1062 ; GFX8-NEXT:    v_mul_hi_u32 v4, v1, v4
1063 ; GFX8-NEXT:    v_add_u32_e32 v3, vcc, v3, v5
1064 ; GFX8-NEXT:    v_cndmask_b32_e64 v5, 0, 1, vcc
1065 ; GFX8-NEXT:    v_add_u32_e32 v3, vcc, v3, v6
1066 ; GFX8-NEXT:    v_cndmask_b32_e64 v3, 0, 1, vcc
1067 ; GFX8-NEXT:    v_mul_lo_u32 v6, v1, v2
1068 ; GFX8-NEXT:    v_add_u32_e32 v3, vcc, v5, v3
1069 ; GFX8-NEXT:    v_mul_hi_u32 v5, v0, v2
1070 ; GFX8-NEXT:    v_add_u32_e32 v4, vcc, v6, v4
1071 ; GFX8-NEXT:    v_cndmask_b32_e64 v6, 0, 1, vcc
1072 ; GFX8-NEXT:    v_add_u32_e32 v4, vcc, v4, v5
1073 ; GFX8-NEXT:    v_cndmask_b32_e64 v5, 0, 1, vcc
1074 ; GFX8-NEXT:    v_add_u32_e32 v5, vcc, v6, v5
1075 ; GFX8-NEXT:    v_mul_hi_u32 v2, v1, v2
1076 ; GFX8-NEXT:    v_add_u32_e32 v3, vcc, v4, v3
1077 ; GFX8-NEXT:    v_cndmask_b32_e64 v4, 0, 1, vcc
1078 ; GFX8-NEXT:    v_add_u32_e32 v4, vcc, v5, v4
1079 ; GFX8-NEXT:    v_add_u32_e32 v2, vcc, v2, v4
1080 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, v0, v3
1081 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, v1, v2, vcc
1082 ; GFX8-NEXT:    v_mul_lo_u32 v2, s1, v0
1083 ; GFX8-NEXT:    v_mul_lo_u32 v3, s0, v1
1084 ; GFX8-NEXT:    v_mul_hi_u32 v5, s0, v0
1085 ; GFX8-NEXT:    v_mul_lo_u32 v4, s0, v0
1086 ; GFX8-NEXT:    v_mov_b32_e32 v6, s9
1087 ; GFX8-NEXT:    v_add_u32_e32 v2, vcc, v2, v3
1088 ; GFX8-NEXT:    v_add_u32_e32 v2, vcc, v2, v5
1089 ; GFX8-NEXT:    v_mul_lo_u32 v3, v1, v4
1090 ; GFX8-NEXT:    v_mul_lo_u32 v5, v0, v2
1091 ; GFX8-NEXT:    v_mul_hi_u32 v7, v0, v4
1092 ; GFX8-NEXT:    v_mul_hi_u32 v4, v1, v4
1093 ; GFX8-NEXT:    v_add_u32_e32 v3, vcc, v3, v5
1094 ; GFX8-NEXT:    v_cndmask_b32_e64 v5, 0, 1, vcc
1095 ; GFX8-NEXT:    v_add_u32_e32 v3, vcc, v3, v7
1096 ; GFX8-NEXT:    v_cndmask_b32_e64 v3, 0, 1, vcc
1097 ; GFX8-NEXT:    v_mul_lo_u32 v7, v1, v2
1098 ; GFX8-NEXT:    v_add_u32_e32 v3, vcc, v5, v3
1099 ; GFX8-NEXT:    v_mul_hi_u32 v5, v0, v2
1100 ; GFX8-NEXT:    v_add_u32_e32 v4, vcc, v7, v4
1101 ; GFX8-NEXT:    v_cndmask_b32_e64 v7, 0, 1, vcc
1102 ; GFX8-NEXT:    v_add_u32_e32 v4, vcc, v4, v5
1103 ; GFX8-NEXT:    v_cndmask_b32_e64 v5, 0, 1, vcc
1104 ; GFX8-NEXT:    v_add_u32_e32 v5, vcc, v7, v5
1105 ; GFX8-NEXT:    v_mul_hi_u32 v2, v1, v2
1106 ; GFX8-NEXT:    v_add_u32_e32 v3, vcc, v4, v3
1107 ; GFX8-NEXT:    v_cndmask_b32_e64 v4, 0, 1, vcc
1108 ; GFX8-NEXT:    v_add_u32_e32 v4, vcc, v5, v4
1109 ; GFX8-NEXT:    v_add_u32_e32 v2, vcc, v2, v4
1110 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, v0, v3
1111 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, v1, v2, vcc
1112 ; GFX8-NEXT:    v_mul_lo_u32 v2, s13, v0
1113 ; GFX8-NEXT:    v_mul_lo_u32 v3, s12, v1
1114 ; GFX8-NEXT:    v_mul_hi_u32 v5, s12, v0
1115 ; GFX8-NEXT:    v_mul_hi_u32 v0, s13, v0
1116 ; GFX8-NEXT:    v_mov_b32_e32 v4, s13
1117 ; GFX8-NEXT:    v_add_u32_e32 v2, vcc, v2, v3
1118 ; GFX8-NEXT:    v_cndmask_b32_e64 v3, 0, 1, vcc
1119 ; GFX8-NEXT:    v_add_u32_e32 v2, vcc, v2, v5
1120 ; GFX8-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
1121 ; GFX8-NEXT:    v_mul_lo_u32 v5, s13, v1
1122 ; GFX8-NEXT:    v_add_u32_e32 v2, vcc, v3, v2
1123 ; GFX8-NEXT:    v_mul_hi_u32 v3, s12, v1
1124 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, v5, v0
1125 ; GFX8-NEXT:    v_cndmask_b32_e64 v5, 0, 1, vcc
1126 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, v0, v3
1127 ; GFX8-NEXT:    v_cndmask_b32_e64 v3, 0, 1, vcc
1128 ; GFX8-NEXT:    v_add_u32_e32 v3, vcc, v5, v3
1129 ; GFX8-NEXT:    v_mul_hi_u32 v1, s13, v1
1130 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
1131 ; GFX8-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
1132 ; GFX8-NEXT:    v_add_u32_e32 v2, vcc, v3, v2
1133 ; GFX8-NEXT:    v_add_u32_e32 v1, vcc, v1, v2
1134 ; GFX8-NEXT:    v_mul_lo_u32 v2, s9, v0
1135 ; GFX8-NEXT:    v_mul_lo_u32 v3, s8, v1
1136 ; GFX8-NEXT:    v_mul_hi_u32 v7, s8, v0
1137 ; GFX8-NEXT:    v_mul_lo_u32 v5, s8, v0
1138 ; GFX8-NEXT:    v_add_u32_e32 v2, vcc, v2, v3
1139 ; GFX8-NEXT:    v_add_u32_e32 v2, vcc, v2, v7
1140 ; GFX8-NEXT:    v_sub_u32_e32 v3, vcc, s12, v5
1141 ; GFX8-NEXT:    v_subb_u32_e64 v5, s[0:1], v4, v2, vcc
1142 ; GFX8-NEXT:    v_sub_u32_e64 v2, s[0:1], s13, v2
1143 ; GFX8-NEXT:    v_cmp_le_u32_e64 s[0:1], s9, v5
1144 ; GFX8-NEXT:    v_cndmask_b32_e64 v4, 0, -1, s[0:1]
1145 ; GFX8-NEXT:    v_cmp_le_u32_e64 s[0:1], s8, v3
1146 ; GFX8-NEXT:    v_cndmask_b32_e64 v7, 0, -1, s[0:1]
1147 ; GFX8-NEXT:    v_cmp_eq_u32_e64 s[0:1], s9, v5
1148 ; GFX8-NEXT:    v_subb_u32_e32 v2, vcc, v2, v6, vcc
1149 ; GFX8-NEXT:    v_cndmask_b32_e64 v4, v4, v7, s[0:1]
1150 ; GFX8-NEXT:    v_subrev_u32_e32 v7, vcc, s8, v3
1151 ; GFX8-NEXT:    v_subbrev_u32_e64 v8, s[0:1], 0, v2, vcc
1152 ; GFX8-NEXT:    v_add_u32_e64 v9, s[0:1], 1, v0
1153 ; GFX8-NEXT:    v_addc_u32_e64 v10, s[0:1], 0, v1, s[0:1]
1154 ; GFX8-NEXT:    v_cmp_le_u32_e64 s[0:1], s9, v8
1155 ; GFX8-NEXT:    v_cndmask_b32_e64 v11, 0, -1, s[0:1]
1156 ; GFX8-NEXT:    v_cmp_le_u32_e64 s[0:1], s8, v7
1157 ; GFX8-NEXT:    v_subb_u32_e32 v2, vcc, v2, v6, vcc
1158 ; GFX8-NEXT:    v_cndmask_b32_e64 v12, 0, -1, s[0:1]
1159 ; GFX8-NEXT:    v_cmp_eq_u32_e64 s[0:1], s9, v8
1160 ; GFX8-NEXT:    v_subrev_u32_e32 v6, vcc, s8, v7
1161 ; GFX8-NEXT:    v_cndmask_b32_e64 v11, v11, v12, s[0:1]
1162 ; GFX8-NEXT:    v_add_u32_e64 v12, s[0:1], 1, v9
1163 ; GFX8-NEXT:    v_subbrev_u32_e32 v2, vcc, 0, v2, vcc
1164 ; GFX8-NEXT:    v_addc_u32_e64 v13, s[0:1], 0, v10, s[0:1]
1165 ; GFX8-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v11
1166 ; GFX8-NEXT:    v_cndmask_b32_e32 v10, v10, v13, vcc
1167 ; GFX8-NEXT:    v_cvt_f32_u32_e32 v13, s11
1168 ; GFX8-NEXT:    v_cndmask_b32_e32 v9, v9, v12, vcc
1169 ; GFX8-NEXT:    v_cvt_f32_u32_e32 v12, s10
1170 ; GFX8-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v4
1171 ; GFX8-NEXT:    v_mul_f32_e32 v4, 0x4f800000, v13
1172 ; GFX8-NEXT:    v_cndmask_b32_e32 v0, v0, v9, vcc
1173 ; GFX8-NEXT:    v_add_f32_e32 v4, v4, v12
1174 ; GFX8-NEXT:    v_rcp_iflag_f32_e32 v9, v4
1175 ; GFX8-NEXT:    v_cmp_ne_u32_e64 s[0:1], 0, v11
1176 ; GFX8-NEXT:    v_cndmask_b32_e64 v4, v7, v6, s[0:1]
1177 ; GFX8-NEXT:    v_cndmask_b32_e32 v4, v3, v4, vcc
1178 ; GFX8-NEXT:    v_mul_f32_e32 v3, 0x5f7ffffc, v9
1179 ; GFX8-NEXT:    v_mul_f32_e32 v6, 0x2f800000, v3
1180 ; GFX8-NEXT:    v_trunc_f32_e32 v6, v6
1181 ; GFX8-NEXT:    v_mul_f32_e32 v7, 0xcf800000, v6
1182 ; GFX8-NEXT:    v_add_f32_e32 v3, v7, v3
1183 ; GFX8-NEXT:    v_cndmask_b32_e64 v2, v8, v2, s[0:1]
1184 ; GFX8-NEXT:    v_cvt_u32_f32_e32 v3, v3
1185 ; GFX8-NEXT:    v_cvt_u32_f32_e32 v6, v6
1186 ; GFX8-NEXT:    s_cselect_b32 s0, 1, 0
1187 ; GFX8-NEXT:    s_and_b32 s0, s0, 1
1188 ; GFX8-NEXT:    s_cmp_lg_u32 s0, 0
1189 ; GFX8-NEXT:    s_subb_u32 s3, 0, s11
1190 ; GFX8-NEXT:    v_mul_lo_u32 v7, s3, v3
1191 ; GFX8-NEXT:    v_mul_lo_u32 v8, s2, v6
1192 ; GFX8-NEXT:    v_cndmask_b32_e32 v1, v1, v10, vcc
1193 ; GFX8-NEXT:    v_mul_hi_u32 v10, s2, v3
1194 ; GFX8-NEXT:    v_mul_lo_u32 v9, s2, v3
1195 ; GFX8-NEXT:    v_add_u32_e64 v7, s[0:1], v7, v8
1196 ; GFX8-NEXT:    v_add_u32_e64 v7, s[0:1], v7, v10
1197 ; GFX8-NEXT:    v_mul_lo_u32 v8, v6, v9
1198 ; GFX8-NEXT:    v_mul_lo_u32 v10, v3, v7
1199 ; GFX8-NEXT:    v_cndmask_b32_e32 v5, v5, v2, vcc
1200 ; GFX8-NEXT:    v_mul_hi_u32 v2, v3, v9
1201 ; GFX8-NEXT:    v_mul_hi_u32 v9, v6, v9
1202 ; GFX8-NEXT:    v_add_u32_e32 v8, vcc, v8, v10
1203 ; GFX8-NEXT:    v_cndmask_b32_e64 v10, 0, 1, vcc
1204 ; GFX8-NEXT:    v_add_u32_e32 v2, vcc, v8, v2
1205 ; GFX8-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
1206 ; GFX8-NEXT:    v_mul_lo_u32 v8, v6, v7
1207 ; GFX8-NEXT:    v_add_u32_e32 v2, vcc, v10, v2
1208 ; GFX8-NEXT:    v_mul_hi_u32 v10, v3, v7
1209 ; GFX8-NEXT:    v_add_u32_e32 v8, vcc, v8, v9
1210 ; GFX8-NEXT:    v_cndmask_b32_e64 v9, 0, 1, vcc
1211 ; GFX8-NEXT:    v_add_u32_e32 v8, vcc, v8, v10
1212 ; GFX8-NEXT:    v_cndmask_b32_e64 v10, 0, 1, vcc
1213 ; GFX8-NEXT:    v_add_u32_e32 v9, vcc, v9, v10
1214 ; GFX8-NEXT:    v_mul_hi_u32 v7, v6, v7
1215 ; GFX8-NEXT:    v_add_u32_e32 v2, vcc, v8, v2
1216 ; GFX8-NEXT:    v_cndmask_b32_e64 v8, 0, 1, vcc
1217 ; GFX8-NEXT:    v_add_u32_e32 v8, vcc, v9, v8
1218 ; GFX8-NEXT:    v_add_u32_e32 v7, vcc, v7, v8
1219 ; GFX8-NEXT:    v_add_u32_e32 v2, vcc, v3, v2
1220 ; GFX8-NEXT:    v_addc_u32_e32 v3, vcc, v6, v7, vcc
1221 ; GFX8-NEXT:    v_mul_lo_u32 v6, s3, v2
1222 ; GFX8-NEXT:    v_mul_lo_u32 v7, s2, v3
1223 ; GFX8-NEXT:    v_mul_hi_u32 v9, s2, v2
1224 ; GFX8-NEXT:    v_mul_lo_u32 v8, s2, v2
1225 ; GFX8-NEXT:    v_mov_b32_e32 v10, s11
1226 ; GFX8-NEXT:    v_add_u32_e32 v6, vcc, v6, v7
1227 ; GFX8-NEXT:    v_add_u32_e32 v6, vcc, v6, v9
1228 ; GFX8-NEXT:    v_mul_lo_u32 v7, v3, v8
1229 ; GFX8-NEXT:    v_mul_lo_u32 v9, v2, v6
1230 ; GFX8-NEXT:    v_mul_hi_u32 v11, v2, v8
1231 ; GFX8-NEXT:    v_mul_hi_u32 v8, v3, v8
1232 ; GFX8-NEXT:    v_add_u32_e32 v7, vcc, v7, v9
1233 ; GFX8-NEXT:    v_cndmask_b32_e64 v9, 0, 1, vcc
1234 ; GFX8-NEXT:    v_add_u32_e32 v7, vcc, v7, v11
1235 ; GFX8-NEXT:    v_cndmask_b32_e64 v7, 0, 1, vcc
1236 ; GFX8-NEXT:    v_mul_lo_u32 v11, v3, v6
1237 ; GFX8-NEXT:    v_add_u32_e32 v7, vcc, v9, v7
1238 ; GFX8-NEXT:    v_mul_hi_u32 v9, v2, v6
1239 ; GFX8-NEXT:    v_add_u32_e32 v8, vcc, v11, v8
1240 ; GFX8-NEXT:    v_cndmask_b32_e64 v11, 0, 1, vcc
1241 ; GFX8-NEXT:    v_add_u32_e32 v8, vcc, v8, v9
1242 ; GFX8-NEXT:    v_cndmask_b32_e64 v9, 0, 1, vcc
1243 ; GFX8-NEXT:    v_add_u32_e32 v9, vcc, v11, v9
1244 ; GFX8-NEXT:    v_mul_hi_u32 v6, v3, v6
1245 ; GFX8-NEXT:    v_add_u32_e32 v7, vcc, v8, v7
1246 ; GFX8-NEXT:    v_cndmask_b32_e64 v8, 0, 1, vcc
1247 ; GFX8-NEXT:    v_add_u32_e32 v8, vcc, v9, v8
1248 ; GFX8-NEXT:    v_add_u32_e32 v6, vcc, v6, v8
1249 ; GFX8-NEXT:    v_add_u32_e32 v2, vcc, v2, v7
1250 ; GFX8-NEXT:    v_addc_u32_e32 v3, vcc, v3, v6, vcc
1251 ; GFX8-NEXT:    v_mul_lo_u32 v6, s15, v2
1252 ; GFX8-NEXT:    v_mul_lo_u32 v7, s14, v3
1253 ; GFX8-NEXT:    v_mul_hi_u32 v9, s14, v2
1254 ; GFX8-NEXT:    v_mul_hi_u32 v2, s15, v2
1255 ; GFX8-NEXT:    v_mov_b32_e32 v8, s15
1256 ; GFX8-NEXT:    v_add_u32_e32 v6, vcc, v6, v7
1257 ; GFX8-NEXT:    v_cndmask_b32_e64 v7, 0, 1, vcc
1258 ; GFX8-NEXT:    v_add_u32_e32 v6, vcc, v6, v9
1259 ; GFX8-NEXT:    v_cndmask_b32_e64 v6, 0, 1, vcc
1260 ; GFX8-NEXT:    v_mul_lo_u32 v9, s15, v3
1261 ; GFX8-NEXT:    v_add_u32_e32 v6, vcc, v7, v6
1262 ; GFX8-NEXT:    v_mul_hi_u32 v7, s14, v3
1263 ; GFX8-NEXT:    v_add_u32_e32 v2, vcc, v9, v2
1264 ; GFX8-NEXT:    v_cndmask_b32_e64 v9, 0, 1, vcc
1265 ; GFX8-NEXT:    v_add_u32_e32 v2, vcc, v2, v7
1266 ; GFX8-NEXT:    v_cndmask_b32_e64 v7, 0, 1, vcc
1267 ; GFX8-NEXT:    v_add_u32_e32 v7, vcc, v9, v7
1268 ; GFX8-NEXT:    v_mul_hi_u32 v3, s15, v3
1269 ; GFX8-NEXT:    v_add_u32_e32 v2, vcc, v2, v6
1270 ; GFX8-NEXT:    v_cndmask_b32_e64 v6, 0, 1, vcc
1271 ; GFX8-NEXT:    v_add_u32_e32 v6, vcc, v7, v6
1272 ; GFX8-NEXT:    v_add_u32_e32 v3, vcc, v3, v6
1273 ; GFX8-NEXT:    v_mul_lo_u32 v6, s11, v2
1274 ; GFX8-NEXT:    v_mul_lo_u32 v7, s10, v3
1275 ; GFX8-NEXT:    v_mul_hi_u32 v11, s10, v2
1276 ; GFX8-NEXT:    v_mul_lo_u32 v9, s10, v2
1277 ; GFX8-NEXT:    v_add_u32_e32 v6, vcc, v6, v7
1278 ; GFX8-NEXT:    v_add_u32_e32 v6, vcc, v6, v11
1279 ; GFX8-NEXT:    v_sub_u32_e32 v7, vcc, s14, v9
1280 ; GFX8-NEXT:    v_subb_u32_e64 v8, s[0:1], v8, v6, vcc
1281 ; GFX8-NEXT:    v_sub_u32_e64 v6, s[0:1], s15, v6
1282 ; GFX8-NEXT:    v_cmp_le_u32_e64 s[0:1], s11, v8
1283 ; GFX8-NEXT:    v_cndmask_b32_e64 v9, 0, -1, s[0:1]
1284 ; GFX8-NEXT:    v_cmp_le_u32_e64 s[0:1], s10, v7
1285 ; GFX8-NEXT:    v_cndmask_b32_e64 v11, 0, -1, s[0:1]
1286 ; GFX8-NEXT:    v_cmp_eq_u32_e64 s[0:1], s11, v8
1287 ; GFX8-NEXT:    v_subb_u32_e32 v6, vcc, v6, v10, vcc
1288 ; GFX8-NEXT:    v_cndmask_b32_e64 v9, v9, v11, s[0:1]
1289 ; GFX8-NEXT:    v_subrev_u32_e32 v11, vcc, s10, v7
1290 ; GFX8-NEXT:    v_subbrev_u32_e64 v12, s[0:1], 0, v6, vcc
1291 ; GFX8-NEXT:    v_cmp_le_u32_e64 s[0:1], s11, v12
1292 ; GFX8-NEXT:    v_cndmask_b32_e64 v13, 0, -1, s[0:1]
1293 ; GFX8-NEXT:    v_cmp_le_u32_e64 s[0:1], s10, v11
1294 ; GFX8-NEXT:    v_cndmask_b32_e64 v14, 0, -1, s[0:1]
1295 ; GFX8-NEXT:    v_cmp_eq_u32_e64 s[0:1], s11, v12
1296 ; GFX8-NEXT:    v_cndmask_b32_e64 v13, v13, v14, s[0:1]
1297 ; GFX8-NEXT:    v_add_u32_e64 v14, s[0:1], 1, v2
1298 ; GFX8-NEXT:    v_subb_u32_e32 v6, vcc, v6, v10, vcc
1299 ; GFX8-NEXT:    v_addc_u32_e64 v15, s[0:1], 0, v3, s[0:1]
1300 ; GFX8-NEXT:    v_add_u32_e32 v10, vcc, 1, v14
1301 ; GFX8-NEXT:    v_addc_u32_e32 v16, vcc, 0, v15, vcc
1302 ; GFX8-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v13
1303 ; GFX8-NEXT:    v_subrev_u32_e64 v13, s[0:1], s10, v11
1304 ; GFX8-NEXT:    v_subbrev_u32_e64 v6, s[0:1], 0, v6, s[0:1]
1305 ; GFX8-NEXT:    v_cndmask_b32_e32 v10, v14, v10, vcc
1306 ; GFX8-NEXT:    v_cmp_ne_u32_e64 s[0:1], 0, v9
1307 ; GFX8-NEXT:    v_cndmask_b32_e64 v2, v2, v10, s[0:1]
1308 ; GFX8-NEXT:    v_cndmask_b32_e32 v9, v11, v13, vcc
1309 ; GFX8-NEXT:    v_cndmask_b32_e32 v10, v12, v6, vcc
1310 ; GFX8-NEXT:    v_cndmask_b32_e32 v14, v15, v16, vcc
1311 ; GFX8-NEXT:    v_cndmask_b32_e64 v6, v7, v9, s[0:1]
1312 ; GFX8-NEXT:    v_cndmask_b32_e64 v7, v8, v10, s[0:1]
1313 ; GFX8-NEXT:    v_mov_b32_e32 v9, s5
1314 ; GFX8-NEXT:    v_cndmask_b32_e64 v3, v3, v14, s[0:1]
1315 ; GFX8-NEXT:    v_mov_b32_e32 v8, s4
1316 ; GFX8-NEXT:    flat_store_dwordx4 v[8:9], v[0:3]
1317 ; GFX8-NEXT:    s_nop 0
1318 ; GFX8-NEXT:    v_mov_b32_e32 v0, s6
1319 ; GFX8-NEXT:    v_mov_b32_e32 v1, s7
1320 ; GFX8-NEXT:    flat_store_dwordx4 v[0:1], v[4:7]
1321 ; GFX8-NEXT:    s_endpgm
1323 ; GFX9-LABEL: udivrem_v2i64:
1324 ; GFX9:       ; %bb.0:
1325 ; GFX9-NEXT:    s_load_dwordx4 s[8:11], s[4:5], 0x20
1326 ; GFX9-NEXT:    s_load_dwordx4 s[12:15], s[4:5], 0x10
1327 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1328 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v0, s9
1329 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v1, s8
1330 ; GFX9-NEXT:    s_sub_u32 s0, 0, s8
1331 ; GFX9-NEXT:    s_cselect_b32 s1, 1, 0
1332 ; GFX9-NEXT:    v_mul_f32_e32 v0, 0x4f800000, v0
1333 ; GFX9-NEXT:    v_add_f32_e32 v0, v0, v1
1334 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v0, v0
1335 ; GFX9-NEXT:    s_and_b32 s1, s1, 1
1336 ; GFX9-NEXT:    s_cmp_lg_u32 s1, 0
1337 ; GFX9-NEXT:    s_subb_u32 s1, 0, s9
1338 ; GFX9-NEXT:    v_mul_f32_e32 v0, 0x5f7ffffc, v0
1339 ; GFX9-NEXT:    v_mul_f32_e32 v1, 0x2f800000, v0
1340 ; GFX9-NEXT:    v_trunc_f32_e32 v1, v1
1341 ; GFX9-NEXT:    v_mul_f32_e32 v2, 0xcf800000, v1
1342 ; GFX9-NEXT:    v_add_f32_e32 v0, v2, v0
1343 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v1, v1
1344 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v0, v0
1345 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v14, s11
1346 ; GFX9-NEXT:    s_sub_u32 s2, 0, s10
1347 ; GFX9-NEXT:    v_mul_lo_u32 v2, s0, v1
1348 ; GFX9-NEXT:    v_mul_lo_u32 v3, s1, v0
1349 ; GFX9-NEXT:    v_mul_hi_u32 v4, s0, v0
1350 ; GFX9-NEXT:    v_mul_lo_u32 v5, s0, v0
1351 ; GFX9-NEXT:    v_mul_f32_e32 v14, 0x4f800000, v14
1352 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[4:5], 0x0
1353 ; GFX9-NEXT:    v_add3_u32 v2, v3, v2, v4
1354 ; GFX9-NEXT:    v_mul_lo_u32 v3, v1, v5
1355 ; GFX9-NEXT:    v_mul_lo_u32 v6, v0, v2
1356 ; GFX9-NEXT:    v_mul_hi_u32 v4, v0, v5
1357 ; GFX9-NEXT:    v_mul_hi_u32 v5, v1, v5
1358 ; GFX9-NEXT:    v_mul_lo_u32 v7, v1, v2
1359 ; GFX9-NEXT:    v_mul_hi_u32 v8, v0, v2
1360 ; GFX9-NEXT:    v_add_co_u32_e32 v3, vcc, v3, v6
1361 ; GFX9-NEXT:    v_cndmask_b32_e64 v6, 0, 1, vcc
1362 ; GFX9-NEXT:    v_add_co_u32_e32 v3, vcc, v3, v4
1363 ; GFX9-NEXT:    v_cndmask_b32_e64 v3, 0, 1, vcc
1364 ; GFX9-NEXT:    v_add_co_u32_e32 v4, vcc, v7, v5
1365 ; GFX9-NEXT:    v_mul_hi_u32 v2, v1, v2
1366 ; GFX9-NEXT:    v_add_u32_e32 v3, v6, v3
1367 ; GFX9-NEXT:    v_cndmask_b32_e64 v5, 0, 1, vcc
1368 ; GFX9-NEXT:    v_add_co_u32_e32 v4, vcc, v4, v8
1369 ; GFX9-NEXT:    v_cndmask_b32_e64 v6, 0, 1, vcc
1370 ; GFX9-NEXT:    v_add_co_u32_e32 v3, vcc, v4, v3
1371 ; GFX9-NEXT:    v_add_u32_e32 v5, v5, v6
1372 ; GFX9-NEXT:    v_cndmask_b32_e64 v4, 0, 1, vcc
1373 ; GFX9-NEXT:    v_add3_u32 v2, v5, v4, v2
1374 ; GFX9-NEXT:    v_add_co_u32_e32 v0, vcc, v0, v3
1375 ; GFX9-NEXT:    v_addc_co_u32_e32 v1, vcc, v1, v2, vcc
1376 ; GFX9-NEXT:    v_mul_lo_u32 v2, s1, v0
1377 ; GFX9-NEXT:    v_mul_lo_u32 v3, s0, v1
1378 ; GFX9-NEXT:    v_mul_hi_u32 v4, s0, v0
1379 ; GFX9-NEXT:    v_mul_lo_u32 v5, s0, v0
1380 ; GFX9-NEXT:    v_mov_b32_e32 v7, s13
1381 ; GFX9-NEXT:    v_add3_u32 v2, v2, v3, v4
1382 ; GFX9-NEXT:    v_mul_lo_u32 v3, v1, v5
1383 ; GFX9-NEXT:    v_mul_lo_u32 v4, v0, v2
1384 ; GFX9-NEXT:    v_mul_hi_u32 v6, v0, v5
1385 ; GFX9-NEXT:    v_mul_hi_u32 v5, v1, v5
1386 ; GFX9-NEXT:    v_add_co_u32_e32 v3, vcc, v3, v4
1387 ; GFX9-NEXT:    v_cndmask_b32_e64 v4, 0, 1, vcc
1388 ; GFX9-NEXT:    v_add_co_u32_e32 v3, vcc, v3, v6
1389 ; GFX9-NEXT:    v_cndmask_b32_e64 v3, 0, 1, vcc
1390 ; GFX9-NEXT:    v_mul_lo_u32 v6, v1, v2
1391 ; GFX9-NEXT:    v_add_u32_e32 v3, v4, v3
1392 ; GFX9-NEXT:    v_mul_hi_u32 v4, v0, v2
1393 ; GFX9-NEXT:    v_mul_hi_u32 v2, v1, v2
1394 ; GFX9-NEXT:    v_add_co_u32_e32 v5, vcc, v6, v5
1395 ; GFX9-NEXT:    v_cndmask_b32_e64 v6, 0, 1, vcc
1396 ; GFX9-NEXT:    v_add_co_u32_e32 v4, vcc, v5, v4
1397 ; GFX9-NEXT:    v_cndmask_b32_e64 v5, 0, 1, vcc
1398 ; GFX9-NEXT:    v_add_co_u32_e32 v3, vcc, v4, v3
1399 ; GFX9-NEXT:    v_add_u32_e32 v5, v6, v5
1400 ; GFX9-NEXT:    v_cndmask_b32_e64 v4, 0, 1, vcc
1401 ; GFX9-NEXT:    v_add3_u32 v2, v5, v4, v2
1402 ; GFX9-NEXT:    v_add_co_u32_e32 v0, vcc, v0, v3
1403 ; GFX9-NEXT:    v_addc_co_u32_e32 v1, vcc, v1, v2, vcc
1404 ; GFX9-NEXT:    v_mul_lo_u32 v2, s13, v0
1405 ; GFX9-NEXT:    v_mul_lo_u32 v3, s12, v1
1406 ; GFX9-NEXT:    v_mul_hi_u32 v4, s12, v0
1407 ; GFX9-NEXT:    v_mul_hi_u32 v0, s13, v0
1408 ; GFX9-NEXT:    v_mov_b32_e32 v5, s9
1409 ; GFX9-NEXT:    v_add_co_u32_e32 v2, vcc, v2, v3
1410 ; GFX9-NEXT:    v_cndmask_b32_e64 v3, 0, 1, vcc
1411 ; GFX9-NEXT:    v_add_co_u32_e32 v2, vcc, v2, v4
1412 ; GFX9-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
1413 ; GFX9-NEXT:    v_mul_lo_u32 v4, s13, v1
1414 ; GFX9-NEXT:    v_add_u32_e32 v2, v3, v2
1415 ; GFX9-NEXT:    v_mul_hi_u32 v3, s12, v1
1416 ; GFX9-NEXT:    v_mul_hi_u32 v1, s13, v1
1417 ; GFX9-NEXT:    v_add_co_u32_e32 v0, vcc, v4, v0
1418 ; GFX9-NEXT:    v_cndmask_b32_e64 v4, 0, 1, vcc
1419 ; GFX9-NEXT:    v_add_co_u32_e32 v0, vcc, v0, v3
1420 ; GFX9-NEXT:    v_cndmask_b32_e64 v3, 0, 1, vcc
1421 ; GFX9-NEXT:    v_add_co_u32_e32 v0, vcc, v0, v2
1422 ; GFX9-NEXT:    v_add_u32_e32 v3, v4, v3
1423 ; GFX9-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
1424 ; GFX9-NEXT:    v_add3_u32 v1, v3, v2, v1
1425 ; GFX9-NEXT:    v_mul_lo_u32 v2, s9, v0
1426 ; GFX9-NEXT:    v_mul_lo_u32 v3, s8, v1
1427 ; GFX9-NEXT:    v_mul_hi_u32 v4, s8, v0
1428 ; GFX9-NEXT:    v_mul_lo_u32 v6, s8, v0
1429 ; GFX9-NEXT:    v_add3_u32 v2, v2, v3, v4
1430 ; GFX9-NEXT:    v_sub_co_u32_e32 v3, vcc, s12, v6
1431 ; GFX9-NEXT:    v_subb_co_u32_e64 v6, s[0:1], v7, v2, vcc
1432 ; GFX9-NEXT:    v_cmp_le_u32_e64 s[0:1], s9, v6
1433 ; GFX9-NEXT:    v_sub_u32_e32 v2, s13, v2
1434 ; GFX9-NEXT:    v_cndmask_b32_e64 v4, 0, -1, s[0:1]
1435 ; GFX9-NEXT:    v_cmp_le_u32_e64 s[0:1], s8, v3
1436 ; GFX9-NEXT:    v_cndmask_b32_e64 v7, 0, -1, s[0:1]
1437 ; GFX9-NEXT:    v_cmp_eq_u32_e64 s[0:1], s9, v6
1438 ; GFX9-NEXT:    v_subb_co_u32_e32 v2, vcc, v2, v5, vcc
1439 ; GFX9-NEXT:    v_cndmask_b32_e64 v4, v4, v7, s[0:1]
1440 ; GFX9-NEXT:    v_subrev_co_u32_e32 v7, vcc, s8, v3
1441 ; GFX9-NEXT:    v_subbrev_co_u32_e64 v8, s[0:1], 0, v2, vcc
1442 ; GFX9-NEXT:    v_subb_co_u32_e32 v2, vcc, v2, v5, vcc
1443 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v5, s10
1444 ; GFX9-NEXT:    v_add_co_u32_e64 v9, s[0:1], 1, v0
1445 ; GFX9-NEXT:    v_addc_co_u32_e64 v10, s[0:1], 0, v1, s[0:1]
1446 ; GFX9-NEXT:    v_add_f32_e32 v5, v14, v5
1447 ; GFX9-NEXT:    v_cmp_le_u32_e64 s[0:1], s9, v8
1448 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v5, v5
1449 ; GFX9-NEXT:    v_cndmask_b32_e64 v11, 0, -1, s[0:1]
1450 ; GFX9-NEXT:    v_cmp_le_u32_e64 s[0:1], s8, v7
1451 ; GFX9-NEXT:    v_cndmask_b32_e64 v12, 0, -1, s[0:1]
1452 ; GFX9-NEXT:    v_cmp_eq_u32_e64 s[0:1], s9, v8
1453 ; GFX9-NEXT:    v_subrev_co_u32_e32 v15, vcc, s8, v7
1454 ; GFX9-NEXT:    v_cndmask_b32_e64 v11, v11, v12, s[0:1]
1455 ; GFX9-NEXT:    v_subbrev_co_u32_e32 v2, vcc, 0, v2, vcc
1456 ; GFX9-NEXT:    v_add_co_u32_e64 v12, s[0:1], 1, v9
1457 ; GFX9-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v11
1458 ; GFX9-NEXT:    v_mul_f32_e32 v5, 0x5f7ffffc, v5
1459 ; GFX9-NEXT:    v_cndmask_b32_e32 v9, v9, v12, vcc
1460 ; GFX9-NEXT:    v_mul_f32_e32 v12, 0x2f800000, v5
1461 ; GFX9-NEXT:    v_addc_co_u32_e64 v13, s[0:1], 0, v10, s[0:1]
1462 ; GFX9-NEXT:    v_trunc_f32_e32 v12, v12
1463 ; GFX9-NEXT:    v_cndmask_b32_e32 v10, v10, v13, vcc
1464 ; GFX9-NEXT:    v_mul_f32_e32 v13, 0xcf800000, v12
1465 ; GFX9-NEXT:    v_add_f32_e32 v5, v13, v5
1466 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v5, v5
1467 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v12, v12
1468 ; GFX9-NEXT:    s_cselect_b32 s0, 1, 0
1469 ; GFX9-NEXT:    s_and_b32 s0, s0, 1
1470 ; GFX9-NEXT:    s_cmp_lg_u32 s0, 0
1471 ; GFX9-NEXT:    s_subb_u32 s3, 0, s11
1472 ; GFX9-NEXT:    v_mul_lo_u32 v13, s3, v5
1473 ; GFX9-NEXT:    v_mul_lo_u32 v14, s2, v12
1474 ; GFX9-NEXT:    v_mul_hi_u32 v16, s2, v5
1475 ; GFX9-NEXT:    v_mul_lo_u32 v17, s2, v5
1476 ; GFX9-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v4
1477 ; GFX9-NEXT:    v_cndmask_b32_e32 v0, v0, v9, vcc
1478 ; GFX9-NEXT:    v_add3_u32 v4, v13, v14, v16
1479 ; GFX9-NEXT:    v_mul_lo_u32 v9, v12, v17
1480 ; GFX9-NEXT:    v_mul_lo_u32 v13, v5, v4
1481 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, v1, v10, vcc
1482 ; GFX9-NEXT:    v_mul_hi_u32 v10, v5, v17
1483 ; GFX9-NEXT:    v_mul_hi_u32 v14, v12, v17
1484 ; GFX9-NEXT:    v_add_co_u32_e64 v9, s[0:1], v9, v13
1485 ; GFX9-NEXT:    v_cndmask_b32_e64 v13, 0, 1, s[0:1]
1486 ; GFX9-NEXT:    v_add_co_u32_e64 v9, s[0:1], v9, v10
1487 ; GFX9-NEXT:    v_cndmask_b32_e64 v9, 0, 1, s[0:1]
1488 ; GFX9-NEXT:    v_mul_lo_u32 v10, v12, v4
1489 ; GFX9-NEXT:    v_add_u32_e32 v9, v13, v9
1490 ; GFX9-NEXT:    v_mul_hi_u32 v13, v5, v4
1491 ; GFX9-NEXT:    v_mul_hi_u32 v4, v12, v4
1492 ; GFX9-NEXT:    v_add_co_u32_e64 v10, s[0:1], v10, v14
1493 ; GFX9-NEXT:    v_cndmask_b32_e64 v14, 0, 1, s[0:1]
1494 ; GFX9-NEXT:    v_add_co_u32_e64 v10, s[0:1], v10, v13
1495 ; GFX9-NEXT:    v_cndmask_b32_e64 v13, 0, 1, s[0:1]
1496 ; GFX9-NEXT:    v_add_co_u32_e64 v9, s[0:1], v10, v9
1497 ; GFX9-NEXT:    v_add_u32_e32 v13, v14, v13
1498 ; GFX9-NEXT:    v_cndmask_b32_e64 v10, 0, 1, s[0:1]
1499 ; GFX9-NEXT:    v_add3_u32 v4, v13, v10, v4
1500 ; GFX9-NEXT:    v_add_co_u32_e64 v5, s[0:1], v5, v9
1501 ; GFX9-NEXT:    v_addc_co_u32_e64 v9, s[0:1], v12, v4, s[0:1]
1502 ; GFX9-NEXT:    v_mul_lo_u32 v4, s3, v5
1503 ; GFX9-NEXT:    v_mul_lo_u32 v12, s2, v9
1504 ; GFX9-NEXT:    v_mul_hi_u32 v13, s2, v5
1505 ; GFX9-NEXT:    v_mul_lo_u32 v10, s2, v5
1506 ; GFX9-NEXT:    v_cmp_ne_u32_e64 s[0:1], 0, v11
1507 ; GFX9-NEXT:    v_cndmask_b32_e64 v2, v8, v2, s[0:1]
1508 ; GFX9-NEXT:    v_add3_u32 v8, v4, v12, v13
1509 ; GFX9-NEXT:    v_cndmask_b32_e64 v7, v7, v15, s[0:1]
1510 ; GFX9-NEXT:    v_mul_lo_u32 v11, v9, v10
1511 ; GFX9-NEXT:    v_mul_lo_u32 v12, v5, v8
1512 ; GFX9-NEXT:    v_cndmask_b32_e32 v4, v3, v7, vcc
1513 ; GFX9-NEXT:    v_mul_hi_u32 v3, v5, v10
1514 ; GFX9-NEXT:    v_mul_hi_u32 v10, v9, v10
1515 ; GFX9-NEXT:    v_add_co_u32_e64 v7, s[0:1], v11, v12
1516 ; GFX9-NEXT:    v_cndmask_b32_e64 v11, 0, 1, s[0:1]
1517 ; GFX9-NEXT:    v_add_co_u32_e64 v3, s[0:1], v7, v3
1518 ; GFX9-NEXT:    v_cndmask_b32_e64 v3, 0, 1, s[0:1]
1519 ; GFX9-NEXT:    v_mul_lo_u32 v7, v9, v8
1520 ; GFX9-NEXT:    v_add_u32_e32 v3, v11, v3
1521 ; GFX9-NEXT:    v_mul_hi_u32 v11, v5, v8
1522 ; GFX9-NEXT:    v_mul_hi_u32 v8, v9, v8
1523 ; GFX9-NEXT:    v_add_co_u32_e64 v7, s[0:1], v7, v10
1524 ; GFX9-NEXT:    v_cndmask_b32_e64 v10, 0, 1, s[0:1]
1525 ; GFX9-NEXT:    v_add_co_u32_e64 v7, s[0:1], v7, v11
1526 ; GFX9-NEXT:    v_cndmask_b32_e64 v11, 0, 1, s[0:1]
1527 ; GFX9-NEXT:    v_add_co_u32_e64 v3, s[0:1], v7, v3
1528 ; GFX9-NEXT:    v_add_u32_e32 v10, v10, v11
1529 ; GFX9-NEXT:    v_cndmask_b32_e64 v7, 0, 1, s[0:1]
1530 ; GFX9-NEXT:    v_add3_u32 v7, v10, v7, v8
1531 ; GFX9-NEXT:    v_add_co_u32_e64 v3, s[0:1], v5, v3
1532 ; GFX9-NEXT:    v_addc_co_u32_e64 v7, s[0:1], v9, v7, s[0:1]
1533 ; GFX9-NEXT:    v_mul_lo_u32 v8, s15, v3
1534 ; GFX9-NEXT:    v_mul_lo_u32 v9, s14, v7
1535 ; GFX9-NEXT:    v_cndmask_b32_e32 v5, v6, v2, vcc
1536 ; GFX9-NEXT:    v_mul_hi_u32 v2, s14, v3
1537 ; GFX9-NEXT:    v_mul_hi_u32 v3, s15, v3
1538 ; GFX9-NEXT:    v_add_co_u32_e32 v6, vcc, v8, v9
1539 ; GFX9-NEXT:    v_cndmask_b32_e64 v8, 0, 1, vcc
1540 ; GFX9-NEXT:    v_add_co_u32_e32 v2, vcc, v6, v2
1541 ; GFX9-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
1542 ; GFX9-NEXT:    v_mul_lo_u32 v6, s15, v7
1543 ; GFX9-NEXT:    v_add_u32_e32 v2, v8, v2
1544 ; GFX9-NEXT:    v_mul_hi_u32 v8, s14, v7
1545 ; GFX9-NEXT:    v_mul_hi_u32 v7, s15, v7
1546 ; GFX9-NEXT:    v_add_co_u32_e32 v3, vcc, v6, v3
1547 ; GFX9-NEXT:    v_cndmask_b32_e64 v6, 0, 1, vcc
1548 ; GFX9-NEXT:    v_add_co_u32_e32 v3, vcc, v3, v8
1549 ; GFX9-NEXT:    v_cndmask_b32_e64 v8, 0, 1, vcc
1550 ; GFX9-NEXT:    v_add_co_u32_e32 v2, vcc, v3, v2
1551 ; GFX9-NEXT:    v_add_u32_e32 v6, v6, v8
1552 ; GFX9-NEXT:    v_cndmask_b32_e64 v3, 0, 1, vcc
1553 ; GFX9-NEXT:    v_add3_u32 v3, v6, v3, v7
1554 ; GFX9-NEXT:    v_mul_lo_u32 v6, s11, v2
1555 ; GFX9-NEXT:    v_mul_lo_u32 v7, s10, v3
1556 ; GFX9-NEXT:    v_mul_hi_u32 v8, s10, v2
1557 ; GFX9-NEXT:    v_mul_lo_u32 v10, s10, v2
1558 ; GFX9-NEXT:    v_mov_b32_e32 v11, s15
1559 ; GFX9-NEXT:    v_mov_b32_e32 v9, s11
1560 ; GFX9-NEXT:    v_add3_u32 v6, v6, v7, v8
1561 ; GFX9-NEXT:    v_sub_co_u32_e32 v7, vcc, s14, v10
1562 ; GFX9-NEXT:    v_subb_co_u32_e64 v8, s[0:1], v11, v6, vcc
1563 ; GFX9-NEXT:    v_cmp_le_u32_e64 s[0:1], s11, v8
1564 ; GFX9-NEXT:    v_sub_u32_e32 v6, s15, v6
1565 ; GFX9-NEXT:    v_cndmask_b32_e64 v10, 0, -1, s[0:1]
1566 ; GFX9-NEXT:    v_cmp_le_u32_e64 s[0:1], s10, v7
1567 ; GFX9-NEXT:    v_cndmask_b32_e64 v11, 0, -1, s[0:1]
1568 ; GFX9-NEXT:    v_cmp_eq_u32_e64 s[0:1], s11, v8
1569 ; GFX9-NEXT:    v_subb_co_u32_e32 v6, vcc, v6, v9, vcc
1570 ; GFX9-NEXT:    v_cndmask_b32_e64 v10, v10, v11, s[0:1]
1571 ; GFX9-NEXT:    v_subrev_co_u32_e32 v11, vcc, s10, v7
1572 ; GFX9-NEXT:    v_subbrev_co_u32_e64 v12, s[0:1], 0, v6, vcc
1573 ; GFX9-NEXT:    v_cmp_le_u32_e64 s[0:1], s11, v12
1574 ; GFX9-NEXT:    v_cndmask_b32_e64 v13, 0, -1, s[0:1]
1575 ; GFX9-NEXT:    v_cmp_le_u32_e64 s[0:1], s10, v11
1576 ; GFX9-NEXT:    v_cndmask_b32_e64 v14, 0, -1, s[0:1]
1577 ; GFX9-NEXT:    v_cmp_eq_u32_e64 s[0:1], s11, v12
1578 ; GFX9-NEXT:    v_cndmask_b32_e64 v13, v13, v14, s[0:1]
1579 ; GFX9-NEXT:    v_add_co_u32_e64 v14, s[0:1], 1, v2
1580 ; GFX9-NEXT:    v_subb_co_u32_e32 v6, vcc, v6, v9, vcc
1581 ; GFX9-NEXT:    v_addc_co_u32_e64 v15, s[0:1], 0, v3, s[0:1]
1582 ; GFX9-NEXT:    v_add_co_u32_e32 v9, vcc, 1, v14
1583 ; GFX9-NEXT:    v_addc_co_u32_e32 v16, vcc, 0, v15, vcc
1584 ; GFX9-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v13
1585 ; GFX9-NEXT:    v_cndmask_b32_e32 v9, v14, v9, vcc
1586 ; GFX9-NEXT:    v_cndmask_b32_e32 v14, v15, v16, vcc
1587 ; GFX9-NEXT:    v_subrev_co_u32_e64 v15, s[0:1], s10, v11
1588 ; GFX9-NEXT:    v_subbrev_co_u32_e64 v6, s[0:1], 0, v6, s[0:1]
1589 ; GFX9-NEXT:    v_cmp_ne_u32_e64 s[0:1], 0, v10
1590 ; GFX9-NEXT:    v_mov_b32_e32 v13, 0
1591 ; GFX9-NEXT:    v_cndmask_b32_e64 v2, v2, v9, s[0:1]
1592 ; GFX9-NEXT:    v_cndmask_b32_e64 v3, v3, v14, s[0:1]
1593 ; GFX9-NEXT:    v_cndmask_b32_e32 v9, v11, v15, vcc
1594 ; GFX9-NEXT:    v_cndmask_b32_e32 v10, v12, v6, vcc
1595 ; GFX9-NEXT:    v_cndmask_b32_e64 v6, v7, v9, s[0:1]
1596 ; GFX9-NEXT:    v_cndmask_b32_e64 v7, v8, v10, s[0:1]
1597 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1598 ; GFX9-NEXT:    global_store_dwordx4 v13, v[0:3], s[4:5]
1599 ; GFX9-NEXT:    global_store_dwordx4 v13, v[4:7], s[6:7]
1600 ; GFX9-NEXT:    s_endpgm
1602 ; GFX10-LABEL: udivrem_v2i64:
1603 ; GFX10:       ; %bb.0:
1604 ; GFX10-NEXT:    s_load_dwordx4 s[8:11], s[4:5], 0x20
1605 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
1606 ; GFX10-NEXT:    v_cvt_f32_u32_e32 v0, s9
1607 ; GFX10-NEXT:    v_cvt_f32_u32_e32 v2, s11
1608 ; GFX10-NEXT:    v_cvt_f32_u32_e32 v1, s8
1609 ; GFX10-NEXT:    v_cvt_f32_u32_e32 v3, s10
1610 ; GFX10-NEXT:    s_sub_u32 s6, 0, s8
1611 ; GFX10-NEXT:    v_mul_f32_e32 v0, 0x4f800000, v0
1612 ; GFX10-NEXT:    v_mul_f32_e32 v2, 0x4f800000, v2
1613 ; GFX10-NEXT:    s_cselect_b32 s0, 1, 0
1614 ; GFX10-NEXT:    s_and_b32 s0, s0, 1
1615 ; GFX10-NEXT:    v_add_f32_e32 v0, v0, v1
1616 ; GFX10-NEXT:    v_add_f32_e32 v1, v2, v3
1617 ; GFX10-NEXT:    s_cmp_lg_u32 s0, 0
1618 ; GFX10-NEXT:    s_subb_u32 s7, 0, s9
1619 ; GFX10-NEXT:    v_rcp_iflag_f32_e32 v0, v0
1620 ; GFX10-NEXT:    v_rcp_iflag_f32_e32 v1, v1
1621 ; GFX10-NEXT:    s_sub_u32 s12, 0, s10
1622 ; GFX10-NEXT:    s_cselect_b32 s0, 1, 0
1623 ; GFX10-NEXT:    s_and_b32 s0, s0, 1
1624 ; GFX10-NEXT:    s_cmp_lg_u32 s0, 0
1625 ; GFX10-NEXT:    s_subb_u32 s13, 0, s11
1626 ; GFX10-NEXT:    v_mul_f32_e32 v0, 0x5f7ffffc, v0
1627 ; GFX10-NEXT:    v_mul_f32_e32 v1, 0x5f7ffffc, v1
1628 ; GFX10-NEXT:    v_mul_f32_e32 v2, 0x2f800000, v0
1629 ; GFX10-NEXT:    v_mul_f32_e32 v3, 0x2f800000, v1
1630 ; GFX10-NEXT:    v_trunc_f32_e32 v2, v2
1631 ; GFX10-NEXT:    v_trunc_f32_e32 v3, v3
1632 ; GFX10-NEXT:    v_mul_f32_e32 v4, 0xcf800000, v2
1633 ; GFX10-NEXT:    v_mul_f32_e32 v5, 0xcf800000, v3
1634 ; GFX10-NEXT:    v_cvt_u32_f32_e32 v2, v2
1635 ; GFX10-NEXT:    v_cvt_u32_f32_e32 v3, v3
1636 ; GFX10-NEXT:    v_add_f32_e32 v0, v4, v0
1637 ; GFX10-NEXT:    v_add_f32_e32 v1, v5, v1
1638 ; GFX10-NEXT:    v_mul_lo_u32 v4, s6, v2
1639 ; GFX10-NEXT:    v_mul_lo_u32 v8, s12, v3
1640 ; GFX10-NEXT:    v_cvt_u32_f32_e32 v0, v0
1641 ; GFX10-NEXT:    v_cvt_u32_f32_e32 v1, v1
1642 ; GFX10-NEXT:    v_mul_lo_u32 v5, s7, v0
1643 ; GFX10-NEXT:    v_mul_hi_u32 v6, s6, v0
1644 ; GFX10-NEXT:    v_mul_lo_u32 v9, s13, v1
1645 ; GFX10-NEXT:    v_mul_hi_u32 v10, s12, v1
1646 ; GFX10-NEXT:    v_mul_lo_u32 v7, s6, v0
1647 ; GFX10-NEXT:    v_mul_lo_u32 v11, s12, v1
1648 ; GFX10-NEXT:    v_add3_u32 v4, v5, v4, v6
1649 ; GFX10-NEXT:    v_add3_u32 v8, v9, v8, v10
1650 ; GFX10-NEXT:    v_mul_lo_u32 v5, v2, v7
1651 ; GFX10-NEXT:    v_mul_hi_u32 v6, v0, v7
1652 ; GFX10-NEXT:    v_mul_lo_u32 v12, v0, v4
1653 ; GFX10-NEXT:    v_mul_hi_u32 v7, v2, v7
1654 ; GFX10-NEXT:    v_mul_lo_u32 v13, v2, v4
1655 ; GFX10-NEXT:    v_mul_lo_u32 v9, v3, v11
1656 ; GFX10-NEXT:    v_mul_lo_u32 v15, v1, v8
1657 ; GFX10-NEXT:    v_mul_hi_u32 v10, v1, v11
1658 ; GFX10-NEXT:    v_mul_hi_u32 v11, v3, v11
1659 ; GFX10-NEXT:    v_mul_lo_u32 v16, v3, v8
1660 ; GFX10-NEXT:    v_add_co_u32 v5, s0, v5, v12
1661 ; GFX10-NEXT:    v_mul_hi_u32 v14, v0, v4
1662 ; GFX10-NEXT:    v_cndmask_b32_e64 v12, 0, 1, s0
1663 ; GFX10-NEXT:    v_add_co_u32 v7, s0, v13, v7
1664 ; GFX10-NEXT:    v_cndmask_b32_e64 v13, 0, 1, s0
1665 ; GFX10-NEXT:    v_add_co_u32 v9, s0, v9, v15
1666 ; GFX10-NEXT:    v_cndmask_b32_e64 v15, 0, 1, s0
1667 ; GFX10-NEXT:    v_add_co_u32 v11, s0, v16, v11
1668 ; GFX10-NEXT:    v_cndmask_b32_e64 v16, 0, 1, s0
1669 ; GFX10-NEXT:    v_add_co_u32 v5, s0, v5, v6
1670 ; GFX10-NEXT:    v_mul_hi_u32 v17, v1, v8
1671 ; GFX10-NEXT:    v_cndmask_b32_e64 v5, 0, 1, s0
1672 ; GFX10-NEXT:    v_add_co_u32 v6, s0, v7, v14
1673 ; GFX10-NEXT:    v_cndmask_b32_e64 v7, 0, 1, s0
1674 ; GFX10-NEXT:    v_add_co_u32 v9, s0, v9, v10
1675 ; GFX10-NEXT:    v_cndmask_b32_e64 v9, 0, 1, s0
1676 ; GFX10-NEXT:    v_add_nc_u32_e32 v5, v12, v5
1677 ; GFX10-NEXT:    v_add_co_u32 v10, s0, v11, v17
1678 ; GFX10-NEXT:    v_mul_hi_u32 v4, v2, v4
1679 ; GFX10-NEXT:    v_add_nc_u32_e32 v9, v15, v9
1680 ; GFX10-NEXT:    v_cndmask_b32_e64 v11, 0, 1, s0
1681 ; GFX10-NEXT:    v_add_co_u32 v5, s0, v6, v5
1682 ; GFX10-NEXT:    v_add_nc_u32_e32 v7, v13, v7
1683 ; GFX10-NEXT:    v_cndmask_b32_e64 v6, 0, 1, s0
1684 ; GFX10-NEXT:    v_mul_hi_u32 v8, v3, v8
1685 ; GFX10-NEXT:    v_add_co_u32 v9, s0, v10, v9
1686 ; GFX10-NEXT:    v_add_nc_u32_e32 v11, v16, v11
1687 ; GFX10-NEXT:    v_cndmask_b32_e64 v10, 0, 1, s0
1688 ; GFX10-NEXT:    v_add3_u32 v4, v7, v6, v4
1689 ; GFX10-NEXT:    v_add_co_u32 v0, vcc_lo, v0, v5
1690 ; GFX10-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x10
1691 ; GFX10-NEXT:    v_add3_u32 v5, v11, v10, v8
1692 ; GFX10-NEXT:    v_add_co_ci_u32_e32 v2, vcc_lo, v2, v4, vcc_lo
1693 ; GFX10-NEXT:    v_add_co_u32 v1, vcc_lo, v1, v9
1694 ; GFX10-NEXT:    v_add_co_ci_u32_e32 v3, vcc_lo, v3, v5, vcc_lo
1695 ; GFX10-NEXT:    v_mul_lo_u32 v6, s7, v0
1696 ; GFX10-NEXT:    v_mul_hi_u32 v7, s6, v0
1697 ; GFX10-NEXT:    v_mul_lo_u32 v5, s6, v2
1698 ; GFX10-NEXT:    v_mul_lo_u32 v9, s13, v1
1699 ; GFX10-NEXT:    v_mul_hi_u32 v10, s12, v1
1700 ; GFX10-NEXT:    v_mul_lo_u32 v11, s12, v3
1701 ; GFX10-NEXT:    v_mul_lo_u32 v4, s6, v0
1702 ; GFX10-NEXT:    v_mul_lo_u32 v8, s12, v1
1703 ; GFX10-NEXT:    v_add3_u32 v5, v6, v5, v7
1704 ; GFX10-NEXT:    v_add3_u32 v9, v9, v11, v10
1705 ; GFX10-NEXT:    v_mul_lo_u32 v12, v2, v4
1706 ; GFX10-NEXT:    v_mul_lo_u32 v10, v0, v5
1707 ; GFX10-NEXT:    v_mul_hi_u32 v13, v0, v4
1708 ; GFX10-NEXT:    v_mul_hi_u32 v4, v2, v4
1709 ; GFX10-NEXT:    v_mul_lo_u32 v11, v2, v5
1710 ; GFX10-NEXT:    v_mul_lo_u32 v6, v3, v8
1711 ; GFX10-NEXT:    v_mul_lo_u32 v15, v1, v9
1712 ; GFX10-NEXT:    v_mul_hi_u32 v7, v1, v8
1713 ; GFX10-NEXT:    v_mul_hi_u32 v8, v3, v8
1714 ; GFX10-NEXT:    v_add_co_u32 v10, s6, v12, v10
1715 ; GFX10-NEXT:    v_cndmask_b32_e64 v12, 0, 1, s6
1716 ; GFX10-NEXT:    v_add_co_u32 v4, s6, v11, v4
1717 ; GFX10-NEXT:    v_mul_lo_u32 v16, v3, v9
1718 ; GFX10-NEXT:    v_cndmask_b32_e64 v11, 0, 1, s6
1719 ; GFX10-NEXT:    v_add_co_u32 v6, s6, v6, v15
1720 ; GFX10-NEXT:    v_mul_hi_u32 v14, v0, v5
1721 ; GFX10-NEXT:    v_cndmask_b32_e64 v15, 0, 1, s6
1722 ; GFX10-NEXT:    v_add_co_u32 v10, s6, v10, v13
1723 ; GFX10-NEXT:    v_cndmask_b32_e64 v10, 0, 1, s6
1724 ; GFX10-NEXT:    v_add_co_u32 v8, s6, v16, v8
1725 ; GFX10-NEXT:    v_cndmask_b32_e64 v13, 0, 1, s6
1726 ; GFX10-NEXT:    v_add_co_u32 v4, s6, v4, v14
1727 ; GFX10-NEXT:    v_add_nc_u32_e32 v10, v12, v10
1728 ; GFX10-NEXT:    v_cndmask_b32_e64 v14, 0, 1, s6
1729 ; GFX10-NEXT:    v_add_co_u32 v6, s6, v6, v7
1730 ; GFX10-NEXT:    v_mul_hi_u32 v5, v2, v5
1731 ; GFX10-NEXT:    v_cndmask_b32_e64 v6, 0, 1, s6
1732 ; GFX10-NEXT:    v_add_co_u32 v4, s6, v4, v10
1733 ; GFX10-NEXT:    v_add_nc_u32_e32 v7, v11, v14
1734 ; GFX10-NEXT:    v_cndmask_b32_e64 v10, 0, 1, s6
1735 ; GFX10-NEXT:    v_mul_hi_u32 v17, v1, v9
1736 ; GFX10-NEXT:    v_add_co_u32 v0, vcc_lo, v0, v4
1737 ; GFX10-NEXT:    v_add_nc_u32_e32 v6, v15, v6
1738 ; GFX10-NEXT:    v_add3_u32 v5, v7, v10, v5
1739 ; GFX10-NEXT:    v_mul_hi_u32 v9, v3, v9
1740 ; GFX10-NEXT:    v_mov_b32_e32 v10, 0
1741 ; GFX10-NEXT:    v_add_co_u32 v8, s6, v8, v17
1742 ; GFX10-NEXT:    v_add_co_ci_u32_e32 v2, vcc_lo, v2, v5, vcc_lo
1743 ; GFX10-NEXT:    v_cndmask_b32_e64 v11, 0, 1, s6
1744 ; GFX10-NEXT:    v_add_co_u32 v4, s12, v8, v6
1745 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
1746 ; GFX10-NEXT:    v_mul_lo_u32 v6, s1, v0
1747 ; GFX10-NEXT:    v_mul_lo_u32 v8, s0, v2
1748 ; GFX10-NEXT:    v_add_nc_u32_e32 v7, v13, v11
1749 ; GFX10-NEXT:    v_mul_hi_u32 v11, s1, v0
1750 ; GFX10-NEXT:    v_mul_hi_u32 v0, s0, v0
1751 ; GFX10-NEXT:    v_cndmask_b32_e64 v5, 0, 1, s12
1752 ; GFX10-NEXT:    v_mul_lo_u32 v12, s1, v2
1753 ; GFX10-NEXT:    v_add_co_u32 v1, vcc_lo, v1, v4
1754 ; GFX10-NEXT:    v_add_co_u32 v6, s12, v6, v8
1755 ; GFX10-NEXT:    v_add3_u32 v5, v7, v5, v9
1756 ; GFX10-NEXT:    v_mul_hi_u32 v7, s0, v2
1757 ; GFX10-NEXT:    v_cndmask_b32_e64 v8, 0, 1, s12
1758 ; GFX10-NEXT:    v_add_co_u32 v0, s13, v6, v0
1759 ; GFX10-NEXT:    v_add_co_u32 v9, s12, v12, v11
1760 ; GFX10-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s13
1761 ; GFX10-NEXT:    v_cndmask_b32_e64 v6, 0, 1, s12
1762 ; GFX10-NEXT:    v_mul_hi_u32 v2, s1, v2
1763 ; GFX10-NEXT:    v_add_co_u32 v7, s12, v9, v7
1764 ; GFX10-NEXT:    v_add_nc_u32_e32 v0, v8, v0
1765 ; GFX10-NEXT:    v_cndmask_b32_e64 v9, 0, 1, s12
1766 ; GFX10-NEXT:    v_add_co_ci_u32_e32 v3, vcc_lo, v3, v5, vcc_lo
1767 ; GFX10-NEXT:    s_load_dwordx4 s[4:7], s[4:5], 0x0
1768 ; GFX10-NEXT:    v_add_co_u32 v0, s12, v7, v0
1769 ; GFX10-NEXT:    v_add_nc_u32_e32 v4, v6, v9
1770 ; GFX10-NEXT:    v_cndmask_b32_e64 v5, 0, 1, s12
1771 ; GFX10-NEXT:    v_mul_lo_u32 v6, s3, v1
1772 ; GFX10-NEXT:    v_mul_lo_u32 v8, s2, v3
1773 ; GFX10-NEXT:    v_mul_lo_u32 v9, s9, v0
1774 ; GFX10-NEXT:    v_mul_hi_u32 v11, s8, v0
1775 ; GFX10-NEXT:    v_add3_u32 v2, v4, v5, v2
1776 ; GFX10-NEXT:    v_mul_hi_u32 v7, s2, v1
1777 ; GFX10-NEXT:    v_mul_lo_u32 v13, s8, v0
1778 ; GFX10-NEXT:    v_mul_hi_u32 v1, s3, v1
1779 ; GFX10-NEXT:    v_mul_lo_u32 v4, s3, v3
1780 ; GFX10-NEXT:    v_mul_lo_u32 v12, s8, v2
1781 ; GFX10-NEXT:    v_add_co_u32 v6, s12, v6, v8
1782 ; GFX10-NEXT:    v_mul_hi_u32 v5, s2, v3
1783 ; GFX10-NEXT:    v_cndmask_b32_e64 v8, 0, 1, s12
1784 ; GFX10-NEXT:    v_mul_hi_u32 v3, s3, v3
1785 ; GFX10-NEXT:    v_add_co_u32 v1, s12, v4, v1
1786 ; GFX10-NEXT:    v_add3_u32 v9, v9, v12, v11
1787 ; GFX10-NEXT:    v_sub_co_u32 v11, vcc_lo, s0, v13
1788 ; GFX10-NEXT:    v_add_co_u32 v6, s0, v6, v7
1789 ; GFX10-NEXT:    v_sub_nc_u32_e32 v7, s1, v9
1790 ; GFX10-NEXT:    v_cndmask_b32_e64 v6, 0, 1, s0
1791 ; GFX10-NEXT:    v_sub_co_ci_u32_e64 v9, s0, s1, v9, vcc_lo
1792 ; GFX10-NEXT:    v_cmp_le_u32_e64 s0, s8, v11
1793 ; GFX10-NEXT:    v_subrev_co_ci_u32_e32 v7, vcc_lo, s9, v7, vcc_lo
1794 ; GFX10-NEXT:    v_cmp_le_u32_e32 vcc_lo, s9, v9
1795 ; GFX10-NEXT:    v_add_nc_u32_e32 v6, v8, v6
1796 ; GFX10-NEXT:    v_cndmask_b32_e64 v12, 0, -1, s0
1797 ; GFX10-NEXT:    v_cndmask_b32_e64 v4, 0, 1, s12
1798 ; GFX10-NEXT:    v_cndmask_b32_e64 v13, 0, -1, vcc_lo
1799 ; GFX10-NEXT:    v_sub_co_u32 v14, vcc_lo, v11, s8
1800 ; GFX10-NEXT:    v_subrev_co_ci_u32_e64 v15, s0, 0, v7, vcc_lo
1801 ; GFX10-NEXT:    v_add_co_u32 v1, s0, v1, v5
1802 ; GFX10-NEXT:    v_cndmask_b32_e64 v5, 0, 1, s0
1803 ; GFX10-NEXT:    v_cmp_eq_u32_e64 s0, s9, v9
1804 ; GFX10-NEXT:    v_subrev_co_ci_u32_e32 v7, vcc_lo, s9, v7, vcc_lo
1805 ; GFX10-NEXT:    v_add_nc_u32_e32 v4, v4, v5
1806 ; GFX10-NEXT:    v_cndmask_b32_e64 v12, v13, v12, s0
1807 ; GFX10-NEXT:    v_cmp_le_u32_e64 s0, s9, v15
1808 ; GFX10-NEXT:    v_cndmask_b32_e64 v13, 0, -1, s0
1809 ; GFX10-NEXT:    v_cmp_le_u32_e64 s0, s8, v14
1810 ; GFX10-NEXT:    v_cndmask_b32_e64 v8, 0, -1, s0
1811 ; GFX10-NEXT:    v_add_co_u32 v6, s0, v1, v6
1812 ; GFX10-NEXT:    v_cndmask_b32_e64 v1, 0, 1, s0
1813 ; GFX10-NEXT:    v_add_co_u32 v5, s0, v0, 1
1814 ; GFX10-NEXT:    v_add_co_ci_u32_e64 v16, s0, 0, v2, s0
1815 ; GFX10-NEXT:    v_cmp_eq_u32_e64 s0, s9, v15
1816 ; GFX10-NEXT:    v_add3_u32 v3, v4, v1, v3
1817 ; GFX10-NEXT:    v_mul_hi_u32 v18, s10, v6
1818 ; GFX10-NEXT:    v_cndmask_b32_e64 v8, v13, v8, s0
1819 ; GFX10-NEXT:    v_mul_lo_u32 v13, s11, v6
1820 ; GFX10-NEXT:    v_mul_lo_u32 v17, s10, v3
1821 ; GFX10-NEXT:    v_add_co_u32 v1, s0, v5, 1
1822 ; GFX10-NEXT:    v_cmp_ne_u32_e32 vcc_lo, 0, v8
1823 ; GFX10-NEXT:    v_add_co_ci_u32_e64 v4, s0, 0, v16, s0
1824 ; GFX10-NEXT:    v_sub_co_u32 v19, s0, v14, s8
1825 ; GFX10-NEXT:    v_cndmask_b32_e32 v1, v5, v1, vcc_lo
1826 ; GFX10-NEXT:    v_mul_lo_u32 v5, s10, v6
1827 ; GFX10-NEXT:    v_cndmask_b32_e32 v4, v16, v4, vcc_lo
1828 ; GFX10-NEXT:    v_add3_u32 v13, v13, v17, v18
1829 ; GFX10-NEXT:    v_cmp_ne_u32_e32 vcc_lo, 0, v12
1830 ; GFX10-NEXT:    v_subrev_co_ci_u32_e64 v7, s0, 0, v7, s0
1831 ; GFX10-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc_lo
1832 ; GFX10-NEXT:    v_cndmask_b32_e32 v1, v2, v4, vcc_lo
1833 ; GFX10-NEXT:    v_sub_nc_u32_e32 v2, s3, v13
1834 ; GFX10-NEXT:    v_sub_co_u32 v12, s0, s2, v5
1835 ; GFX10-NEXT:    v_sub_co_ci_u32_e64 v16, s1, s3, v13, s0
1836 ; GFX10-NEXT:    v_subrev_co_ci_u32_e64 v2, s0, s11, v2, s0
1837 ; GFX10-NEXT:    v_cmp_le_u32_e64 s0, s10, v12
1838 ; GFX10-NEXT:    v_cmp_ne_u32_e64 s1, 0, v8
1839 ; GFX10-NEXT:    v_cmp_le_u32_e64 s2, s11, v16
1840 ; GFX10-NEXT:    v_cndmask_b32_e64 v8, 0, -1, s0
1841 ; GFX10-NEXT:    v_sub_co_u32 v13, s0, v12, s10
1842 ; GFX10-NEXT:    v_cndmask_b32_e64 v4, v14, v19, s1
1843 ; GFX10-NEXT:    v_cndmask_b32_e64 v5, 0, -1, s2
1844 ; GFX10-NEXT:    v_subrev_co_ci_u32_e64 v14, s2, 0, v2, s0
1845 ; GFX10-NEXT:    v_cndmask_b32_e64 v7, v15, v7, s1
1846 ; GFX10-NEXT:    v_cmp_eq_u32_e64 s1, s11, v16
1847 ; GFX10-NEXT:    v_cndmask_b32_e32 v4, v11, v4, vcc_lo
1848 ; GFX10-NEXT:    v_subrev_co_ci_u32_e64 v2, s0, s11, v2, s0
1849 ; GFX10-NEXT:    v_cndmask_b32_e64 v5, v5, v8, s1
1850 ; GFX10-NEXT:    v_cmp_le_u32_e64 s1, s11, v14
1851 ; GFX10-NEXT:    v_cndmask_b32_e64 v8, 0, -1, s1
1852 ; GFX10-NEXT:    v_cmp_le_u32_e64 s1, s10, v13
1853 ; GFX10-NEXT:    v_cndmask_b32_e64 v11, 0, -1, s1
1854 ; GFX10-NEXT:    v_add_co_u32 v15, s1, v6, 1
1855 ; GFX10-NEXT:    v_add_co_ci_u32_e64 v17, s1, 0, v3, s1
1856 ; GFX10-NEXT:    v_cmp_eq_u32_e64 s1, s11, v14
1857 ; GFX10-NEXT:    v_cndmask_b32_e64 v8, v8, v11, s1
1858 ; GFX10-NEXT:    v_add_co_u32 v11, s1, v15, 1
1859 ; GFX10-NEXT:    v_add_co_ci_u32_e64 v18, s1, 0, v17, s1
1860 ; GFX10-NEXT:    v_cmp_ne_u32_e64 s0, 0, v8
1861 ; GFX10-NEXT:    v_sub_co_u32 v8, s1, v13, s10
1862 ; GFX10-NEXT:    v_subrev_co_ci_u32_e64 v2, s1, 0, v2, s1
1863 ; GFX10-NEXT:    v_cndmask_b32_e64 v11, v15, v11, s0
1864 ; GFX10-NEXT:    v_cndmask_b32_e64 v15, v17, v18, s0
1865 ; GFX10-NEXT:    v_cmp_ne_u32_e64 s1, 0, v5
1866 ; GFX10-NEXT:    v_cndmask_b32_e64 v8, v13, v8, s0
1867 ; GFX10-NEXT:    v_cndmask_b32_e64 v13, v14, v2, s0
1868 ; GFX10-NEXT:    v_cndmask_b32_e32 v5, v9, v7, vcc_lo
1869 ; GFX10-NEXT:    v_cndmask_b32_e64 v2, v6, v11, s1
1870 ; GFX10-NEXT:    v_cndmask_b32_e64 v3, v3, v15, s1
1871 ; GFX10-NEXT:    v_cndmask_b32_e64 v6, v12, v8, s1
1872 ; GFX10-NEXT:    v_cndmask_b32_e64 v7, v16, v13, s1
1873 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
1874 ; GFX10-NEXT:    global_store_dwordx4 v10, v[0:3], s[4:5]
1875 ; GFX10-NEXT:    global_store_dwordx4 v10, v[4:7], s[6:7]
1876 ; GFX10-NEXT:    s_endpgm
1877   %div = udiv <2 x i64> %x, %y
1878   store <2 x i64> %div, <2 x i64> addrspace(1)* %out0
1879   %rem = urem <2 x i64> %x, %y
1880   store <2 x i64> %rem, <2 x i64> addrspace(1)* %out1
1881   ret void
1884 define amdgpu_kernel void @udiv_i8(i8 addrspace(1)* %out0, i8 addrspace(1)* %out1, i8 %x, i8 %y) {
1885 ; GFX8-LABEL: udiv_i8:
1886 ; GFX8:       ; %bb.0:
1887 ; GFX8-NEXT:    s_load_dword s6, s[4:5], 0x10
1888 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1889 ; GFX8-NEXT:    s_bfe_u32 s7, s6, 0x80008
1890 ; GFX8-NEXT:    v_cvt_f32_ubyte0_e32 v0, s7
1891 ; GFX8-NEXT:    v_rcp_iflag_f32_e32 v0, v0
1892 ; GFX8-NEXT:    s_sub_i32 s0, 0, s7
1893 ; GFX8-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
1894 ; GFX8-NEXT:    v_cvt_u32_f32_e32 v0, v0
1895 ; GFX8-NEXT:    v_mul_lo_u32 v1, s0, v0
1896 ; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
1897 ; GFX8-NEXT:    s_and_b32 s4, s6, 0xff
1898 ; GFX8-NEXT:    v_mul_hi_u32 v1, v0, v1
1899 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, v0, v1
1900 ; GFX8-NEXT:    v_mul_hi_u32 v2, s4, v0
1901 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1902 ; GFX8-NEXT:    v_mov_b32_e32 v0, s0
1903 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
1904 ; GFX8-NEXT:    v_mul_lo_u32 v3, v2, s7
1905 ; GFX8-NEXT:    v_add_u32_e32 v4, vcc, 1, v2
1906 ; GFX8-NEXT:    v_sub_u32_e32 v3, vcc, s4, v3
1907 ; GFX8-NEXT:    v_cmp_le_u32_e32 vcc, s7, v3
1908 ; GFX8-NEXT:    v_cndmask_b32_e32 v2, v2, v4, vcc
1909 ; GFX8-NEXT:    v_subrev_u32_e64 v4, s[0:1], s7, v3
1910 ; GFX8-NEXT:    v_cndmask_b32_e32 v3, v3, v4, vcc
1911 ; GFX8-NEXT:    v_add_u32_e32 v4, vcc, 1, v2
1912 ; GFX8-NEXT:    v_cmp_le_u32_e32 vcc, s7, v3
1913 ; GFX8-NEXT:    v_cndmask_b32_e32 v2, v2, v4, vcc
1914 ; GFX8-NEXT:    v_subrev_u32_e64 v4, s[0:1], s7, v3
1915 ; GFX8-NEXT:    flat_store_byte v[0:1], v2
1916 ; GFX8-NEXT:    v_mov_b32_e32 v0, s2
1917 ; GFX8-NEXT:    v_cndmask_b32_e32 v3, v3, v4, vcc
1918 ; GFX8-NEXT:    v_mov_b32_e32 v1, s3
1919 ; GFX8-NEXT:    flat_store_byte v[0:1], v3
1920 ; GFX8-NEXT:    s_endpgm
1922 ; GFX9-LABEL: udiv_i8:
1923 ; GFX9:       ; %bb.0:
1924 ; GFX9-NEXT:    s_load_dword s0, s[4:5], 0x10
1925 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0
1926 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1927 ; GFX9-NEXT:    s_bfe_u32 s6, s0, 0x80008
1928 ; GFX9-NEXT:    v_cvt_f32_ubyte0_e32 v0, s6
1929 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v0, v0
1930 ; GFX9-NEXT:    s_sub_i32 s1, 0, s6
1931 ; GFX9-NEXT:    s_and_b32 s7, s0, 0xff
1932 ; GFX9-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
1933 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v0, v0
1934 ; GFX9-NEXT:    v_mul_lo_u32 v1, s1, v0
1935 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
1936 ; GFX9-NEXT:    v_mul_hi_u32 v1, v0, v1
1937 ; GFX9-NEXT:    v_add_u32_e32 v0, v0, v1
1938 ; GFX9-NEXT:    v_mul_hi_u32 v0, s7, v0
1939 ; GFX9-NEXT:    v_mul_lo_u32 v1, v0, s6
1940 ; GFX9-NEXT:    v_add_u32_e32 v3, 1, v0
1941 ; GFX9-NEXT:    v_sub_u32_e32 v1, s7, v1
1942 ; GFX9-NEXT:    v_cmp_le_u32_e32 vcc, s6, v1
1943 ; GFX9-NEXT:    v_cndmask_b32_e32 v0, v0, v3, vcc
1944 ; GFX9-NEXT:    v_subrev_u32_e32 v3, s6, v1
1945 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, v1, v3, vcc
1946 ; GFX9-NEXT:    v_add_u32_e32 v3, 1, v0
1947 ; GFX9-NEXT:    v_cmp_le_u32_e32 vcc, s6, v1
1948 ; GFX9-NEXT:    v_cndmask_b32_e32 v0, v0, v3, vcc
1949 ; GFX9-NEXT:    v_subrev_u32_e32 v3, s6, v1
1950 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, v1, v3, vcc
1951 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1952 ; GFX9-NEXT:    global_store_byte v2, v0, s[0:1]
1953 ; GFX9-NEXT:    global_store_byte v2, v1, s[2:3]
1954 ; GFX9-NEXT:    s_endpgm
1956 ; GFX10-LABEL: udiv_i8:
1957 ; GFX10:       ; %bb.0:
1958 ; GFX10-NEXT:    s_load_dword s0, s[4:5], 0x10
1959 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
1960 ; GFX10-NEXT:    s_bfe_u32 s6, s0, 0x80008
1961 ; GFX10-NEXT:    s_and_b32 s0, s0, 0xff
1962 ; GFX10-NEXT:    v_cvt_f32_ubyte0_e32 v0, s6
1963 ; GFX10-NEXT:    s_sub_i32 s1, 0, s6
1964 ; GFX10-NEXT:    v_rcp_iflag_f32_e32 v0, v0
1965 ; GFX10-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
1966 ; GFX10-NEXT:    v_cvt_u32_f32_e32 v0, v0
1967 ; GFX10-NEXT:    v_mul_lo_u32 v1, s1, v0
1968 ; GFX10-NEXT:    v_mul_hi_u32 v1, v0, v1
1969 ; GFX10-NEXT:    v_add_nc_u32_e32 v0, v0, v1
1970 ; GFX10-NEXT:    v_mul_hi_u32 v0, s0, v0
1971 ; GFX10-NEXT:    v_mul_lo_u32 v1, v0, s6
1972 ; GFX10-NEXT:    v_add_nc_u32_e32 v2, 1, v0
1973 ; GFX10-NEXT:    v_sub_nc_u32_e32 v1, s0, v1
1974 ; GFX10-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
1975 ; GFX10-NEXT:    v_subrev_nc_u32_e32 v3, s6, v1
1976 ; GFX10-NEXT:    v_cmp_le_u32_e32 vcc_lo, s6, v1
1977 ; GFX10-NEXT:    v_cndmask_b32_e32 v0, v0, v2, vcc_lo
1978 ; GFX10-NEXT:    v_cndmask_b32_e32 v1, v1, v3, vcc_lo
1979 ; GFX10-NEXT:    v_add_nc_u32_e32 v2, 1, v0
1980 ; GFX10-NEXT:    v_cmp_le_u32_e32 vcc_lo, s6, v1
1981 ; GFX10-NEXT:    v_subrev_nc_u32_e32 v3, s6, v1
1982 ; GFX10-NEXT:    v_cndmask_b32_e32 v0, v0, v2, vcc_lo
1983 ; GFX10-NEXT:    v_mov_b32_e32 v2, 0
1984 ; GFX10-NEXT:    v_cndmask_b32_e32 v1, v1, v3, vcc_lo
1985 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
1986 ; GFX10-NEXT:    global_store_byte v2, v0, s[0:1]
1987 ; GFX10-NEXT:    global_store_byte v2, v1, s[2:3]
1988 ; GFX10-NEXT:    s_endpgm
1989   %div = udiv i8 %x, %y
1990   store i8 %div, i8 addrspace(1)* %out0
1991   %rem = urem i8 %x, %y
1992   store i8 %rem, i8 addrspace(1)* %out1
1993   ret void
1996 define amdgpu_kernel void @udivrem_v2i8(<2 x i8> addrspace(1)* %out0, <2 x i8> addrspace(1)* %out1, <2 x i8> %x, <2 x i8> %y) {
1997 ; GFX8-LABEL: udivrem_v2i8:
1998 ; GFX8:       ; %bb.0:
1999 ; GFX8-NEXT:    s_load_dword s0, s[4:5], 0x10
2000 ; GFX8-NEXT:    s_load_dwordx4 s[4:7], s[4:5], 0x0
2001 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
2002 ; GFX8-NEXT:    s_bfe_u32 s2, s0, 0x80010
2003 ; GFX8-NEXT:    v_cvt_f32_ubyte0_e32 v0, s2
2004 ; GFX8-NEXT:    v_rcp_iflag_f32_e32 v0, v0
2005 ; GFX8-NEXT:    v_cvt_f32_ubyte3_e32 v1, s0
2006 ; GFX8-NEXT:    v_rcp_iflag_f32_e32 v1, v1
2007 ; GFX8-NEXT:    s_sub_i32 s1, 0, s2
2008 ; GFX8-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
2009 ; GFX8-NEXT:    v_cvt_u32_f32_e32 v0, v0
2010 ; GFX8-NEXT:    v_mul_f32_e32 v1, 0x4f7ffffe, v1
2011 ; GFX8-NEXT:    v_cvt_u32_f32_e32 v1, v1
2012 ; GFX8-NEXT:    s_lshr_b32 s3, s0, 24
2013 ; GFX8-NEXT:    v_mul_lo_u32 v2, s1, v0
2014 ; GFX8-NEXT:    s_sub_i32 s1, 0, s3
2015 ; GFX8-NEXT:    v_mul_lo_u32 v3, s1, v1
2016 ; GFX8-NEXT:    s_and_b32 s1, s0, 0xff
2017 ; GFX8-NEXT:    v_mul_hi_u32 v2, v0, v2
2018 ; GFX8-NEXT:    s_bfe_u32 s8, s0, 0x80008
2019 ; GFX8-NEXT:    v_mul_hi_u32 v3, v1, v3
2020 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
2021 ; GFX8-NEXT:    v_mul_hi_u32 v0, s1, v0
2022 ; GFX8-NEXT:    v_add_u32_e32 v1, vcc, v1, v3
2023 ; GFX8-NEXT:    v_mul_hi_u32 v1, s8, v1
2024 ; GFX8-NEXT:    v_mul_lo_u32 v2, v0, s2
2025 ; GFX8-NEXT:    v_add_u32_e32 v3, vcc, 1, v0
2026 ; GFX8-NEXT:    v_sub_u32_e32 v2, vcc, s1, v2
2027 ; GFX8-NEXT:    v_cmp_le_u32_e32 vcc, s2, v2
2028 ; GFX8-NEXT:    v_cndmask_b32_e32 v0, v0, v3, vcc
2029 ; GFX8-NEXT:    v_subrev_u32_e64 v3, s[0:1], s2, v2
2030 ; GFX8-NEXT:    v_cndmask_b32_e32 v2, v2, v3, vcc
2031 ; GFX8-NEXT:    v_add_u32_e32 v3, vcc, 1, v0
2032 ; GFX8-NEXT:    v_cmp_le_u32_e32 vcc, s2, v2
2033 ; GFX8-NEXT:    v_cndmask_b32_e32 v0, v0, v3, vcc
2034 ; GFX8-NEXT:    v_mul_lo_u32 v3, v1, s3
2035 ; GFX8-NEXT:    v_subrev_u32_e64 v4, s[0:1], s2, v2
2036 ; GFX8-NEXT:    v_cndmask_b32_e32 v2, v2, v4, vcc
2037 ; GFX8-NEXT:    v_sub_u32_e32 v3, vcc, s8, v3
2038 ; GFX8-NEXT:    v_add_u32_e32 v4, vcc, 1, v1
2039 ; GFX8-NEXT:    v_cmp_le_u32_e32 vcc, s3, v3
2040 ; GFX8-NEXT:    v_cndmask_b32_e32 v1, v1, v4, vcc
2041 ; GFX8-NEXT:    v_subrev_u32_e64 v4, s[0:1], s3, v3
2042 ; GFX8-NEXT:    v_cndmask_b32_e32 v3, v3, v4, vcc
2043 ; GFX8-NEXT:    v_add_u32_e32 v4, vcc, 1, v1
2044 ; GFX8-NEXT:    v_cmp_le_u32_e32 vcc, s3, v3
2045 ; GFX8-NEXT:    v_cndmask_b32_e32 v1, v1, v4, vcc
2046 ; GFX8-NEXT:    v_subrev_u32_e64 v4, s[0:1], s3, v3
2047 ; GFX8-NEXT:    s_movk_i32 s0, 0xff
2048 ; GFX8-NEXT:    v_and_b32_e32 v1, s0, v1
2049 ; GFX8-NEXT:    v_lshlrev_b16_e32 v1, 8, v1
2050 ; GFX8-NEXT:    v_cndmask_b32_e32 v3, v3, v4, vcc
2051 ; GFX8-NEXT:    v_or_b32_sdwa v4, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
2052 ; GFX8-NEXT:    v_mov_b32_e32 v0, s4
2053 ; GFX8-NEXT:    v_mov_b32_e32 v1, s5
2054 ; GFX8-NEXT:    flat_store_short v[0:1], v4
2055 ; GFX8-NEXT:    v_and_b32_e32 v0, s0, v3
2056 ; GFX8-NEXT:    v_lshlrev_b16_e32 v0, 8, v0
2057 ; GFX8-NEXT:    v_or_b32_sdwa v2, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
2058 ; GFX8-NEXT:    v_mov_b32_e32 v0, s6
2059 ; GFX8-NEXT:    v_mov_b32_e32 v1, s7
2060 ; GFX8-NEXT:    flat_store_short v[0:1], v2
2061 ; GFX8-NEXT:    s_endpgm
2063 ; GFX9-LABEL: udivrem_v2i8:
2064 ; GFX9:       ; %bb.0:
2065 ; GFX9-NEXT:    s_load_dword s0, s[4:5], 0x10
2066 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2067 ; GFX9-NEXT:    s_bfe_u32 s6, s0, 0x80010
2068 ; GFX9-NEXT:    v_cvt_f32_ubyte0_e32 v1, s6
2069 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v1, v1
2070 ; GFX9-NEXT:    v_cvt_f32_ubyte3_e32 v0, s0
2071 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v0, v0
2072 ; GFX9-NEXT:    s_sub_i32 s1, 0, s6
2073 ; GFX9-NEXT:    v_mul_f32_e32 v1, 0x4f7ffffe, v1
2074 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v1, v1
2075 ; GFX9-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
2076 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v0, v0
2077 ; GFX9-NEXT:    s_lshr_b32 s7, s0, 24
2078 ; GFX9-NEXT:    v_mul_lo_u32 v3, s1, v1
2079 ; GFX9-NEXT:    s_sub_i32 s2, 0, s7
2080 ; GFX9-NEXT:    v_mul_lo_u32 v2, s2, v0
2081 ; GFX9-NEXT:    s_and_b32 s8, s0, 0xff
2082 ; GFX9-NEXT:    v_mul_hi_u32 v3, v1, v3
2083 ; GFX9-NEXT:    s_bfe_u32 s9, s0, 0x80008
2084 ; GFX9-NEXT:    v_mul_hi_u32 v2, v0, v2
2085 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2086 ; GFX9-NEXT:    v_add_u32_e32 v1, v1, v3
2087 ; GFX9-NEXT:    v_mul_hi_u32 v1, s8, v1
2088 ; GFX9-NEXT:    v_add_u32_e32 v0, v0, v2
2089 ; GFX9-NEXT:    v_mul_hi_u32 v0, s9, v0
2090 ; GFX9-NEXT:    s_movk_i32 s4, 0xff
2091 ; GFX9-NEXT:    v_mul_lo_u32 v3, v1, s6
2092 ; GFX9-NEXT:    v_add_u32_e32 v4, 1, v1
2093 ; GFX9-NEXT:    v_mul_lo_u32 v2, v0, s7
2094 ; GFX9-NEXT:    v_sub_u32_e32 v3, s8, v3
2095 ; GFX9-NEXT:    v_cmp_le_u32_e32 vcc, s6, v3
2096 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, v1, v4, vcc
2097 ; GFX9-NEXT:    v_subrev_u32_e32 v4, s6, v3
2098 ; GFX9-NEXT:    v_cndmask_b32_e32 v3, v3, v4, vcc
2099 ; GFX9-NEXT:    v_add_u32_e32 v4, 1, v1
2100 ; GFX9-NEXT:    v_cmp_le_u32_e32 vcc, s6, v3
2101 ; GFX9-NEXT:    v_sub_u32_e32 v2, s9, v2
2102 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, v1, v4, vcc
2103 ; GFX9-NEXT:    v_subrev_u32_e32 v4, s6, v3
2104 ; GFX9-NEXT:    v_cndmask_b32_e32 v3, v3, v4, vcc
2105 ; GFX9-NEXT:    v_add_u32_e32 v4, 1, v0
2106 ; GFX9-NEXT:    v_cmp_le_u32_e32 vcc, s7, v2
2107 ; GFX9-NEXT:    v_cndmask_b32_e32 v0, v0, v4, vcc
2108 ; GFX9-NEXT:    v_subrev_u32_e32 v4, s7, v2
2109 ; GFX9-NEXT:    v_cndmask_b32_e32 v2, v2, v4, vcc
2110 ; GFX9-NEXT:    v_add_u32_e32 v4, 1, v0
2111 ; GFX9-NEXT:    v_cmp_le_u32_e32 vcc, s7, v2
2112 ; GFX9-NEXT:    v_cndmask_b32_e32 v0, v0, v4, vcc
2113 ; GFX9-NEXT:    v_and_b32_e32 v0, s4, v0
2114 ; GFX9-NEXT:    v_subrev_u32_e32 v4, s7, v2
2115 ; GFX9-NEXT:    v_lshlrev_b16_e32 v0, 8, v0
2116 ; GFX9-NEXT:    v_cndmask_b32_e32 v2, v2, v4, vcc
2117 ; GFX9-NEXT:    v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
2118 ; GFX9-NEXT:    v_mov_b32_e32 v1, 0
2119 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2120 ; GFX9-NEXT:    global_store_short v1, v0, s[0:1]
2121 ; GFX9-NEXT:    v_and_b32_e32 v0, s4, v2
2122 ; GFX9-NEXT:    v_lshlrev_b16_e32 v0, 8, v0
2123 ; GFX9-NEXT:    v_or_b32_sdwa v0, v3, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
2124 ; GFX9-NEXT:    global_store_short v1, v0, s[2:3]
2125 ; GFX9-NEXT:    s_endpgm
2127 ; GFX10-LABEL: udivrem_v2i8:
2128 ; GFX10:       ; %bb.0:
2129 ; GFX10-NEXT:    s_load_dword s0, s[4:5], 0x10
2130 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
2131 ; GFX10-NEXT:    v_cvt_f32_ubyte3_e32 v0, s0
2132 ; GFX10-NEXT:    s_bfe_u32 s1, s0, 0x80010
2133 ; GFX10-NEXT:    s_lshr_b32 s2, s0, 24
2134 ; GFX10-NEXT:    v_cvt_f32_ubyte0_e32 v1, s1
2135 ; GFX10-NEXT:    s_sub_i32 s3, 0, s2
2136 ; GFX10-NEXT:    v_rcp_iflag_f32_e32 v0, v0
2137 ; GFX10-NEXT:    s_load_dwordx4 s[4:7], s[4:5], 0x0
2138 ; GFX10-NEXT:    v_rcp_iflag_f32_e32 v1, v1
2139 ; GFX10-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
2140 ; GFX10-NEXT:    v_mul_f32_e32 v1, 0x4f7ffffe, v1
2141 ; GFX10-NEXT:    v_cvt_u32_f32_e32 v0, v0
2142 ; GFX10-NEXT:    v_cvt_u32_f32_e32 v1, v1
2143 ; GFX10-NEXT:    v_mul_lo_u32 v2, s3, v0
2144 ; GFX10-NEXT:    s_sub_i32 s3, 0, s1
2145 ; GFX10-NEXT:    v_mul_lo_u32 v3, s3, v1
2146 ; GFX10-NEXT:    s_bfe_u32 s3, s0, 0x80008
2147 ; GFX10-NEXT:    s_and_b32 s0, s0, 0xff
2148 ; GFX10-NEXT:    v_mul_hi_u32 v2, v0, v2
2149 ; GFX10-NEXT:    v_mul_hi_u32 v3, v1, v3
2150 ; GFX10-NEXT:    v_add_nc_u32_e32 v0, v0, v2
2151 ; GFX10-NEXT:    v_add_nc_u32_e32 v1, v1, v3
2152 ; GFX10-NEXT:    v_mul_hi_u32 v0, s3, v0
2153 ; GFX10-NEXT:    v_mul_hi_u32 v1, s0, v1
2154 ; GFX10-NEXT:    v_mul_lo_u32 v2, v0, s2
2155 ; GFX10-NEXT:    v_add_nc_u32_e32 v4, 1, v0
2156 ; GFX10-NEXT:    v_mul_lo_u32 v3, v1, s1
2157 ; GFX10-NEXT:    v_add_nc_u32_e32 v6, 1, v1
2158 ; GFX10-NEXT:    v_sub_nc_u32_e32 v2, s3, v2
2159 ; GFX10-NEXT:    v_sub_nc_u32_e32 v3, s0, v3
2160 ; GFX10-NEXT:    v_subrev_nc_u32_e32 v5, s2, v2
2161 ; GFX10-NEXT:    v_cmp_le_u32_e32 vcc_lo, s2, v2
2162 ; GFX10-NEXT:    v_cmp_le_u32_e64 s0, s1, v3
2163 ; GFX10-NEXT:    v_subrev_nc_u32_e32 v7, s1, v3
2164 ; GFX10-NEXT:    v_cndmask_b32_e32 v0, v0, v4, vcc_lo
2165 ; GFX10-NEXT:    v_cndmask_b32_e32 v2, v2, v5, vcc_lo
2166 ; GFX10-NEXT:    v_cndmask_b32_e64 v1, v1, v6, s0
2167 ; GFX10-NEXT:    v_cndmask_b32_e64 v3, v3, v7, s0
2168 ; GFX10-NEXT:    v_add_nc_u32_e32 v4, 1, v0
2169 ; GFX10-NEXT:    v_cmp_le_u32_e32 vcc_lo, s2, v2
2170 ; GFX10-NEXT:    v_subrev_nc_u32_e32 v5, s2, v2
2171 ; GFX10-NEXT:    v_add_nc_u32_e32 v6, 1, v1
2172 ; GFX10-NEXT:    v_cmp_le_u32_e64 s0, s1, v3
2173 ; GFX10-NEXT:    v_subrev_nc_u32_e32 v7, s1, v3
2174 ; GFX10-NEXT:    v_cndmask_b32_e32 v0, v0, v4, vcc_lo
2175 ; GFX10-NEXT:    v_cndmask_b32_e32 v2, v2, v5, vcc_lo
2176 ; GFX10-NEXT:    s_movk_i32 s1, 0xff
2177 ; GFX10-NEXT:    v_cndmask_b32_e64 v1, v1, v6, s0
2178 ; GFX10-NEXT:    v_cndmask_b32_e64 v3, v3, v7, s0
2179 ; GFX10-NEXT:    v_and_b32_sdwa v0, v0, s1 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
2180 ; GFX10-NEXT:    v_and_b32_sdwa v2, v2, s1 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
2181 ; GFX10-NEXT:    v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
2182 ; GFX10-NEXT:    v_mov_b32_e32 v1, 0
2183 ; GFX10-NEXT:    v_or_b32_sdwa v2, v3, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
2184 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
2185 ; GFX10-NEXT:    global_store_short v1, v0, s[4:5]
2186 ; GFX10-NEXT:    global_store_short v1, v2, s[6:7]
2187 ; GFX10-NEXT:    s_endpgm
2188   %div = udiv <2 x i8> %x, %y
2189   store <2 x i8> %div, <2 x i8> addrspace(1)* %out0
2190   %rem = urem <2 x i8> %x, %y
2191   store <2 x i8> %rem, <2 x i8> addrspace(1)* %out1
2192   ret void
2195 define amdgpu_kernel void @udiv_i16(i16 addrspace(1)* %out0, i16 addrspace(1)* %out1, i16 %x, i16 %y) {
2196 ; GFX8-LABEL: udiv_i16:
2197 ; GFX8:       ; %bb.0:
2198 ; GFX8-NEXT:    s_load_dword s6, s[4:5], 0x10
2199 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
2200 ; GFX8-NEXT:    s_lshr_b32 s7, s6, 16
2201 ; GFX8-NEXT:    v_cvt_f32_u32_e32 v0, s7
2202 ; GFX8-NEXT:    s_sub_i32 s0, 0, s7
2203 ; GFX8-NEXT:    v_rcp_iflag_f32_e32 v0, v0
2204 ; GFX8-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
2205 ; GFX8-NEXT:    v_cvt_u32_f32_e32 v0, v0
2206 ; GFX8-NEXT:    v_mul_lo_u32 v1, s0, v0
2207 ; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2208 ; GFX8-NEXT:    s_and_b32 s4, s6, 0xffff
2209 ; GFX8-NEXT:    v_mul_hi_u32 v1, v0, v1
2210 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, v0, v1
2211 ; GFX8-NEXT:    v_mul_hi_u32 v2, s4, v0
2212 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
2213 ; GFX8-NEXT:    v_mov_b32_e32 v0, s0
2214 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
2215 ; GFX8-NEXT:    v_mul_lo_u32 v3, v2, s7
2216 ; GFX8-NEXT:    v_add_u32_e32 v4, vcc, 1, v2
2217 ; GFX8-NEXT:    v_sub_u32_e32 v3, vcc, s4, v3
2218 ; GFX8-NEXT:    v_cmp_le_u32_e32 vcc, s7, v3
2219 ; GFX8-NEXT:    v_cndmask_b32_e32 v2, v2, v4, vcc
2220 ; GFX8-NEXT:    v_subrev_u32_e64 v4, s[0:1], s7, v3
2221 ; GFX8-NEXT:    v_cndmask_b32_e32 v3, v3, v4, vcc
2222 ; GFX8-NEXT:    v_add_u32_e32 v4, vcc, 1, v2
2223 ; GFX8-NEXT:    v_cmp_le_u32_e32 vcc, s7, v3
2224 ; GFX8-NEXT:    v_cndmask_b32_e32 v2, v2, v4, vcc
2225 ; GFX8-NEXT:    v_subrev_u32_e64 v4, s[0:1], s7, v3
2226 ; GFX8-NEXT:    flat_store_short v[0:1], v2
2227 ; GFX8-NEXT:    v_mov_b32_e32 v0, s2
2228 ; GFX8-NEXT:    v_cndmask_b32_e32 v3, v3, v4, vcc
2229 ; GFX8-NEXT:    v_mov_b32_e32 v1, s3
2230 ; GFX8-NEXT:    flat_store_short v[0:1], v3
2231 ; GFX8-NEXT:    s_endpgm
2233 ; GFX9-LABEL: udiv_i16:
2234 ; GFX9:       ; %bb.0:
2235 ; GFX9-NEXT:    s_load_dword s0, s[4:5], 0x10
2236 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0
2237 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2238 ; GFX9-NEXT:    s_lshr_b32 s6, s0, 16
2239 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v0, s6
2240 ; GFX9-NEXT:    s_sub_i32 s1, 0, s6
2241 ; GFX9-NEXT:    s_and_b32 s7, s0, 0xffff
2242 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v0, v0
2243 ; GFX9-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
2244 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v0, v0
2245 ; GFX9-NEXT:    v_mul_lo_u32 v1, s1, v0
2246 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2247 ; GFX9-NEXT:    v_mul_hi_u32 v1, v0, v1
2248 ; GFX9-NEXT:    v_add_u32_e32 v0, v0, v1
2249 ; GFX9-NEXT:    v_mul_hi_u32 v0, s7, v0
2250 ; GFX9-NEXT:    v_mul_lo_u32 v1, v0, s6
2251 ; GFX9-NEXT:    v_add_u32_e32 v3, 1, v0
2252 ; GFX9-NEXT:    v_sub_u32_e32 v1, s7, v1
2253 ; GFX9-NEXT:    v_cmp_le_u32_e32 vcc, s6, v1
2254 ; GFX9-NEXT:    v_cndmask_b32_e32 v0, v0, v3, vcc
2255 ; GFX9-NEXT:    v_subrev_u32_e32 v3, s6, v1
2256 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, v1, v3, vcc
2257 ; GFX9-NEXT:    v_add_u32_e32 v3, 1, v0
2258 ; GFX9-NEXT:    v_cmp_le_u32_e32 vcc, s6, v1
2259 ; GFX9-NEXT:    v_cndmask_b32_e32 v0, v0, v3, vcc
2260 ; GFX9-NEXT:    v_subrev_u32_e32 v3, s6, v1
2261 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, v1, v3, vcc
2262 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2263 ; GFX9-NEXT:    global_store_short v2, v0, s[0:1]
2264 ; GFX9-NEXT:    global_store_short v2, v1, s[2:3]
2265 ; GFX9-NEXT:    s_endpgm
2267 ; GFX10-LABEL: udiv_i16:
2268 ; GFX10:       ; %bb.0:
2269 ; GFX10-NEXT:    s_load_dword s0, s[4:5], 0x10
2270 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
2271 ; GFX10-NEXT:    s_lshr_b32 s6, s0, 16
2272 ; GFX10-NEXT:    s_and_b32 s0, s0, 0xffff
2273 ; GFX10-NEXT:    v_cvt_f32_u32_e32 v0, s6
2274 ; GFX10-NEXT:    s_sub_i32 s1, 0, s6
2275 ; GFX10-NEXT:    v_rcp_iflag_f32_e32 v0, v0
2276 ; GFX10-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
2277 ; GFX10-NEXT:    v_cvt_u32_f32_e32 v0, v0
2278 ; GFX10-NEXT:    v_mul_lo_u32 v1, s1, v0
2279 ; GFX10-NEXT:    v_mul_hi_u32 v1, v0, v1
2280 ; GFX10-NEXT:    v_add_nc_u32_e32 v0, v0, v1
2281 ; GFX10-NEXT:    v_mul_hi_u32 v0, s0, v0
2282 ; GFX10-NEXT:    v_mul_lo_u32 v1, v0, s6
2283 ; GFX10-NEXT:    v_add_nc_u32_e32 v2, 1, v0
2284 ; GFX10-NEXT:    v_sub_nc_u32_e32 v1, s0, v1
2285 ; GFX10-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2286 ; GFX10-NEXT:    v_subrev_nc_u32_e32 v3, s6, v1
2287 ; GFX10-NEXT:    v_cmp_le_u32_e32 vcc_lo, s6, v1
2288 ; GFX10-NEXT:    v_cndmask_b32_e32 v0, v0, v2, vcc_lo
2289 ; GFX10-NEXT:    v_cndmask_b32_e32 v1, v1, v3, vcc_lo
2290 ; GFX10-NEXT:    v_add_nc_u32_e32 v2, 1, v0
2291 ; GFX10-NEXT:    v_cmp_le_u32_e32 vcc_lo, s6, v1
2292 ; GFX10-NEXT:    v_subrev_nc_u32_e32 v3, s6, v1
2293 ; GFX10-NEXT:    v_cndmask_b32_e32 v0, v0, v2, vcc_lo
2294 ; GFX10-NEXT:    v_mov_b32_e32 v2, 0
2295 ; GFX10-NEXT:    v_cndmask_b32_e32 v1, v1, v3, vcc_lo
2296 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
2297 ; GFX10-NEXT:    global_store_short v2, v0, s[0:1]
2298 ; GFX10-NEXT:    global_store_short v2, v1, s[2:3]
2299 ; GFX10-NEXT:    s_endpgm
2300   %div = udiv i16 %x, %y
2301   store i16 %div, i16 addrspace(1)* %out0
2302   %rem = urem i16 %x, %y
2303   store i16 %rem, i16 addrspace(1)* %out1
2304   ret void
2307 define amdgpu_kernel void @udivrem_v2i16(<2 x i16> addrspace(1)* %out0, <2 x i16> addrspace(1)* %out1, <2 x i16> %x, <2 x i16> %y) {
2308 ; GFX8-LABEL: udivrem_v2i16:
2309 ; GFX8:       ; %bb.0:
2310 ; GFX8-NEXT:    s_load_dword s0, s[4:5], 0x14
2311 ; GFX8-NEXT:    s_mov_b32 s2, 0xffff
2312 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
2313 ; GFX8-NEXT:    s_and_b32 s6, s0, s2
2314 ; GFX8-NEXT:    v_cvt_f32_u32_e32 v0, s6
2315 ; GFX8-NEXT:    s_lshr_b32 s3, s0, 16
2316 ; GFX8-NEXT:    v_cvt_f32_u32_e32 v1, s3
2317 ; GFX8-NEXT:    s_sub_i32 s1, 0, s6
2318 ; GFX8-NEXT:    v_rcp_iflag_f32_e32 v0, v0
2319 ; GFX8-NEXT:    s_load_dwordx4 s[8:11], s[4:5], 0x0
2320 ; GFX8-NEXT:    s_load_dword s0, s[4:5], 0x10
2321 ; GFX8-NEXT:    v_rcp_iflag_f32_e32 v1, v1
2322 ; GFX8-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
2323 ; GFX8-NEXT:    v_cvt_u32_f32_e32 v0, v0
2324 ; GFX8-NEXT:    v_mul_f32_e32 v1, 0x4f7ffffe, v1
2325 ; GFX8-NEXT:    v_cvt_u32_f32_e32 v1, v1
2326 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
2327 ; GFX8-NEXT:    s_lshr_b32 s4, s0, 16
2328 ; GFX8-NEXT:    v_mul_lo_u32 v2, s1, v0
2329 ; GFX8-NEXT:    s_sub_i32 s1, 0, s3
2330 ; GFX8-NEXT:    s_and_b32 s0, s0, s2
2331 ; GFX8-NEXT:    v_mul_lo_u32 v3, s1, v1
2332 ; GFX8-NEXT:    v_mul_hi_u32 v2, v0, v2
2333 ; GFX8-NEXT:    v_mul_hi_u32 v3, v1, v3
2334 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
2335 ; GFX8-NEXT:    v_mul_hi_u32 v0, s0, v0
2336 ; GFX8-NEXT:    v_add_u32_e32 v1, vcc, v1, v3
2337 ; GFX8-NEXT:    v_mul_hi_u32 v1, s4, v1
2338 ; GFX8-NEXT:    v_mul_lo_u32 v2, v0, s6
2339 ; GFX8-NEXT:    v_add_u32_e32 v3, vcc, 1, v0
2340 ; GFX8-NEXT:    v_sub_u32_e32 v2, vcc, s0, v2
2341 ; GFX8-NEXT:    v_cmp_le_u32_e32 vcc, s6, v2
2342 ; GFX8-NEXT:    v_cndmask_b32_e32 v0, v0, v3, vcc
2343 ; GFX8-NEXT:    v_subrev_u32_e64 v3, s[0:1], s6, v2
2344 ; GFX8-NEXT:    v_cndmask_b32_e32 v2, v2, v3, vcc
2345 ; GFX8-NEXT:    v_add_u32_e32 v3, vcc, 1, v0
2346 ; GFX8-NEXT:    v_cmp_le_u32_e32 vcc, s6, v2
2347 ; GFX8-NEXT:    v_cndmask_b32_e32 v0, v0, v3, vcc
2348 ; GFX8-NEXT:    v_mul_lo_u32 v3, v1, s3
2349 ; GFX8-NEXT:    v_subrev_u32_e64 v4, s[0:1], s6, v2
2350 ; GFX8-NEXT:    v_cndmask_b32_e32 v2, v2, v4, vcc
2351 ; GFX8-NEXT:    v_sub_u32_e32 v3, vcc, s4, v3
2352 ; GFX8-NEXT:    v_add_u32_e32 v4, vcc, 1, v1
2353 ; GFX8-NEXT:    v_cmp_le_u32_e32 vcc, s3, v3
2354 ; GFX8-NEXT:    v_cndmask_b32_e32 v1, v1, v4, vcc
2355 ; GFX8-NEXT:    v_subrev_u32_e64 v4, s[0:1], s3, v3
2356 ; GFX8-NEXT:    v_cndmask_b32_e32 v3, v3, v4, vcc
2357 ; GFX8-NEXT:    v_add_u32_e32 v4, vcc, 1, v1
2358 ; GFX8-NEXT:    v_cmp_le_u32_e32 vcc, s3, v3
2359 ; GFX8-NEXT:    v_cndmask_b32_e32 v1, v1, v4, vcc
2360 ; GFX8-NEXT:    v_subrev_u32_e64 v4, s[0:1], s3, v3
2361 ; GFX8-NEXT:    v_and_b32_e32 v1, s2, v1
2362 ; GFX8-NEXT:    v_cndmask_b32_e32 v3, v3, v4, vcc
2363 ; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
2364 ; GFX8-NEXT:    v_or_b32_sdwa v4, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
2365 ; GFX8-NEXT:    v_and_b32_e32 v0, s2, v3
2366 ; GFX8-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
2367 ; GFX8-NEXT:    v_or_b32_sdwa v2, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
2368 ; GFX8-NEXT:    v_mov_b32_e32 v0, s8
2369 ; GFX8-NEXT:    v_mov_b32_e32 v1, s9
2370 ; GFX8-NEXT:    flat_store_dword v[0:1], v4
2371 ; GFX8-NEXT:    v_mov_b32_e32 v0, s10
2372 ; GFX8-NEXT:    v_mov_b32_e32 v1, s11
2373 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
2374 ; GFX8-NEXT:    s_endpgm
2376 ; GFX9-LABEL: udivrem_v2i16:
2377 ; GFX9:       ; %bb.0:
2378 ; GFX9-NEXT:    s_load_dword s0, s[4:5], 0x14
2379 ; GFX9-NEXT:    s_mov_b32 s1, 0xffff
2380 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2381 ; GFX9-NEXT:    s_and_b32 s7, s0, s1
2382 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v0, s7
2383 ; GFX9-NEXT:    s_lshr_b32 s6, s0, 16
2384 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v1, s6
2385 ; GFX9-NEXT:    s_sub_i32 s2, 0, s7
2386 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v0, v0
2387 ; GFX9-NEXT:    s_load_dword s0, s[4:5], 0x10
2388 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v1, v1
2389 ; GFX9-NEXT:    s_sub_i32 s3, 0, s6
2390 ; GFX9-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
2391 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v0, v0
2392 ; GFX9-NEXT:    v_mul_f32_e32 v1, 0x4f7ffffe, v1
2393 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v1, v1
2394 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2395 ; GFX9-NEXT:    s_and_b32 s9, s0, s1
2396 ; GFX9-NEXT:    v_mul_lo_u32 v2, s2, v0
2397 ; GFX9-NEXT:    s_lshr_b32 s8, s0, 16
2398 ; GFX9-NEXT:    v_mul_lo_u32 v3, s3, v1
2399 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2400 ; GFX9-NEXT:    v_mul_hi_u32 v2, v0, v2
2401 ; GFX9-NEXT:    v_mul_hi_u32 v3, v1, v3
2402 ; GFX9-NEXT:    v_add_u32_e32 v0, v0, v2
2403 ; GFX9-NEXT:    v_mul_hi_u32 v0, s9, v0
2404 ; GFX9-NEXT:    v_add_u32_e32 v1, v1, v3
2405 ; GFX9-NEXT:    v_mul_hi_u32 v1, s8, v1
2406 ; GFX9-NEXT:    v_mul_lo_u32 v2, v0, s7
2407 ; GFX9-NEXT:    v_add_u32_e32 v4, 1, v0
2408 ; GFX9-NEXT:    v_mul_lo_u32 v3, v1, s6
2409 ; GFX9-NEXT:    v_add_u32_e32 v5, 1, v1
2410 ; GFX9-NEXT:    v_sub_u32_e32 v2, s9, v2
2411 ; GFX9-NEXT:    v_cmp_le_u32_e32 vcc, s7, v2
2412 ; GFX9-NEXT:    v_cndmask_b32_e32 v0, v0, v4, vcc
2413 ; GFX9-NEXT:    v_subrev_u32_e32 v4, s7, v2
2414 ; GFX9-NEXT:    v_cndmask_b32_e32 v2, v2, v4, vcc
2415 ; GFX9-NEXT:    v_add_u32_e32 v4, 1, v0
2416 ; GFX9-NEXT:    v_cmp_le_u32_e32 vcc, s7, v2
2417 ; GFX9-NEXT:    v_sub_u32_e32 v3, s8, v3
2418 ; GFX9-NEXT:    v_cndmask_b32_e32 v0, v0, v4, vcc
2419 ; GFX9-NEXT:    v_subrev_u32_e32 v4, s7, v2
2420 ; GFX9-NEXT:    v_cndmask_b32_e32 v2, v2, v4, vcc
2421 ; GFX9-NEXT:    v_cmp_le_u32_e32 vcc, s6, v3
2422 ; GFX9-NEXT:    v_subrev_u32_e32 v4, s6, v3
2423 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, v1, v5, vcc
2424 ; GFX9-NEXT:    v_cndmask_b32_e32 v3, v3, v4, vcc
2425 ; GFX9-NEXT:    v_add_u32_e32 v4, 1, v1
2426 ; GFX9-NEXT:    v_cmp_le_u32_e32 vcc, s6, v3
2427 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, v1, v4, vcc
2428 ; GFX9-NEXT:    v_subrev_u32_e32 v4, s6, v3
2429 ; GFX9-NEXT:    v_cndmask_b32_e32 v3, v3, v4, vcc
2430 ; GFX9-NEXT:    v_mov_b32_e32 v4, 0xffff
2431 ; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
2432 ; GFX9-NEXT:    v_and_or_b32 v0, v0, v4, v1
2433 ; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 16, v3
2434 ; GFX9-NEXT:    v_and_or_b32 v1, v2, v4, v1
2435 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0
2436 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2437 ; GFX9-NEXT:    global_store_dword v2, v0, s[0:1]
2438 ; GFX9-NEXT:    global_store_dword v2, v1, s[2:3]
2439 ; GFX9-NEXT:    s_endpgm
2441 ; GFX10-LABEL: udivrem_v2i16:
2442 ; GFX10:       ; %bb.0:
2443 ; GFX10-NEXT:    s_load_dword s0, s[4:5], 0x14
2444 ; GFX10-NEXT:    s_mov_b32 s2, 0xffff
2445 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
2446 ; GFX10-NEXT:    s_lshr_b32 s1, s0, 16
2447 ; GFX10-NEXT:    s_and_b32 s3, s0, s2
2448 ; GFX10-NEXT:    v_cvt_f32_u32_e32 v0, s1
2449 ; GFX10-NEXT:    v_cvt_f32_u32_e32 v1, s3
2450 ; GFX10-NEXT:    s_sub_i32 s6, 0, s1
2451 ; GFX10-NEXT:    s_load_dword s0, s[4:5], 0x10
2452 ; GFX10-NEXT:    v_rcp_iflag_f32_e32 v0, v0
2453 ; GFX10-NEXT:    v_rcp_iflag_f32_e32 v1, v1
2454 ; GFX10-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
2455 ; GFX10-NEXT:    v_mul_f32_e32 v1, 0x4f7ffffe, v1
2456 ; GFX10-NEXT:    v_cvt_u32_f32_e32 v0, v0
2457 ; GFX10-NEXT:    v_cvt_u32_f32_e32 v1, v1
2458 ; GFX10-NEXT:    v_mul_lo_u32 v2, s6, v0
2459 ; GFX10-NEXT:    s_sub_i32 s6, 0, s3
2460 ; GFX10-NEXT:    v_mul_lo_u32 v3, s6, v1
2461 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
2462 ; GFX10-NEXT:    s_lshr_b32 s6, s0, 16
2463 ; GFX10-NEXT:    s_and_b32 s0, s0, s2
2464 ; GFX10-NEXT:    v_mul_hi_u32 v2, v0, v2
2465 ; GFX10-NEXT:    v_mul_hi_u32 v3, v1, v3
2466 ; GFX10-NEXT:    v_add_nc_u32_e32 v0, v0, v2
2467 ; GFX10-NEXT:    v_add_nc_u32_e32 v1, v1, v3
2468 ; GFX10-NEXT:    v_mul_hi_u32 v0, s6, v0
2469 ; GFX10-NEXT:    v_mul_hi_u32 v1, s0, v1
2470 ; GFX10-NEXT:    v_mul_lo_u32 v2, v0, s1
2471 ; GFX10-NEXT:    v_add_nc_u32_e32 v4, 1, v0
2472 ; GFX10-NEXT:    v_mul_lo_u32 v3, v1, s3
2473 ; GFX10-NEXT:    v_add_nc_u32_e32 v6, 1, v1
2474 ; GFX10-NEXT:    v_sub_nc_u32_e32 v2, s6, v2
2475 ; GFX10-NEXT:    s_load_dwordx4 s[4:7], s[4:5], 0x0
2476 ; GFX10-NEXT:    v_sub_nc_u32_e32 v3, s0, v3
2477 ; GFX10-NEXT:    v_subrev_nc_u32_e32 v5, s1, v2
2478 ; GFX10-NEXT:    v_cmp_le_u32_e32 vcc_lo, s1, v2
2479 ; GFX10-NEXT:    v_cmp_le_u32_e64 s0, s3, v3
2480 ; GFX10-NEXT:    v_subrev_nc_u32_e32 v7, s3, v3
2481 ; GFX10-NEXT:    v_cndmask_b32_e32 v0, v0, v4, vcc_lo
2482 ; GFX10-NEXT:    v_cndmask_b32_e32 v2, v2, v5, vcc_lo
2483 ; GFX10-NEXT:    v_cndmask_b32_e64 v1, v1, v6, s0
2484 ; GFX10-NEXT:    v_cndmask_b32_e64 v3, v3, v7, s0
2485 ; GFX10-NEXT:    v_add_nc_u32_e32 v4, 1, v0
2486 ; GFX10-NEXT:    v_cmp_le_u32_e32 vcc_lo, s1, v2
2487 ; GFX10-NEXT:    v_subrev_nc_u32_e32 v5, s1, v2
2488 ; GFX10-NEXT:    v_add_nc_u32_e32 v6, 1, v1
2489 ; GFX10-NEXT:    v_cmp_le_u32_e64 s0, s3, v3
2490 ; GFX10-NEXT:    v_subrev_nc_u32_e32 v7, s3, v3
2491 ; GFX10-NEXT:    v_cndmask_b32_e32 v0, v0, v4, vcc_lo
2492 ; GFX10-NEXT:    v_cndmask_b32_e32 v2, v2, v5, vcc_lo
2493 ; GFX10-NEXT:    v_mov_b32_e32 v4, 0xffff
2494 ; GFX10-NEXT:    v_cndmask_b32_e64 v1, v1, v6, s0
2495 ; GFX10-NEXT:    v_cndmask_b32_e64 v3, v3, v7, s0
2496 ; GFX10-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
2497 ; GFX10-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
2498 ; GFX10-NEXT:    v_and_or_b32 v0, v1, v4, v0
2499 ; GFX10-NEXT:    v_mov_b32_e32 v1, 0
2500 ; GFX10-NEXT:    v_and_or_b32 v2, v3, v4, v2
2501 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
2502 ; GFX10-NEXT:    global_store_dword v1, v0, s[4:5]
2503 ; GFX10-NEXT:    global_store_dword v1, v2, s[6:7]
2504 ; GFX10-NEXT:    s_endpgm
2505   %div = udiv <2 x i16> %x, %y
2506   store <2 x i16> %div, <2 x i16> addrspace(1)* %out0
2507   %rem = urem <2 x i16> %x, %y
2508   store <2 x i16> %rem, <2 x i16> addrspace(1)* %out1
2509   ret void
2512 define amdgpu_kernel void @udivrem_i3(i3 addrspace(1)* %out0, i3 addrspace(1)* %out1, i3 %x, i3 %y) {
2513 ; GFX8-LABEL: udivrem_i3:
2514 ; GFX8:       ; %bb.0:
2515 ; GFX8-NEXT:    s_load_dword s6, s[4:5], 0x10
2516 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
2517 ; GFX8-NEXT:    s_bfe_u32 s7, s6, 0x30008
2518 ; GFX8-NEXT:    v_cvt_f32_ubyte0_e32 v0, s7
2519 ; GFX8-NEXT:    v_rcp_iflag_f32_e32 v0, v0
2520 ; GFX8-NEXT:    s_sub_i32 s0, 0, s7
2521 ; GFX8-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
2522 ; GFX8-NEXT:    v_cvt_u32_f32_e32 v0, v0
2523 ; GFX8-NEXT:    v_mul_lo_u32 v1, s0, v0
2524 ; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2525 ; GFX8-NEXT:    s_and_b32 s4, s6, 7
2526 ; GFX8-NEXT:    v_mul_hi_u32 v1, v0, v1
2527 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, v0, v1
2528 ; GFX8-NEXT:    v_mul_hi_u32 v2, s4, v0
2529 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
2530 ; GFX8-NEXT:    v_mov_b32_e32 v0, s0
2531 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
2532 ; GFX8-NEXT:    v_mul_lo_u32 v3, v2, s7
2533 ; GFX8-NEXT:    v_add_u32_e32 v4, vcc, 1, v2
2534 ; GFX8-NEXT:    v_sub_u32_e32 v3, vcc, s4, v3
2535 ; GFX8-NEXT:    v_cmp_le_u32_e32 vcc, s7, v3
2536 ; GFX8-NEXT:    v_cndmask_b32_e32 v2, v2, v4, vcc
2537 ; GFX8-NEXT:    v_subrev_u32_e64 v4, s[0:1], s7, v3
2538 ; GFX8-NEXT:    v_cndmask_b32_e32 v3, v3, v4, vcc
2539 ; GFX8-NEXT:    v_add_u32_e32 v4, vcc, 1, v2
2540 ; GFX8-NEXT:    v_cmp_le_u32_e32 vcc, s7, v3
2541 ; GFX8-NEXT:    v_cndmask_b32_e32 v2, v2, v4, vcc
2542 ; GFX8-NEXT:    v_subrev_u32_e64 v4, s[0:1], s7, v3
2543 ; GFX8-NEXT:    v_and_b32_e32 v2, 7, v2
2544 ; GFX8-NEXT:    v_cndmask_b32_e32 v3, v3, v4, vcc
2545 ; GFX8-NEXT:    flat_store_byte v[0:1], v2
2546 ; GFX8-NEXT:    v_mov_b32_e32 v0, s2
2547 ; GFX8-NEXT:    v_and_b32_e32 v2, 7, v3
2548 ; GFX8-NEXT:    v_mov_b32_e32 v1, s3
2549 ; GFX8-NEXT:    flat_store_byte v[0:1], v2
2550 ; GFX8-NEXT:    s_endpgm
2552 ; GFX9-LABEL: udivrem_i3:
2553 ; GFX9:       ; %bb.0:
2554 ; GFX9-NEXT:    s_load_dword s0, s[4:5], 0x10
2555 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0
2556 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2557 ; GFX9-NEXT:    s_bfe_u32 s6, s0, 0x30008
2558 ; GFX9-NEXT:    v_cvt_f32_ubyte0_e32 v0, s6
2559 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v0, v0
2560 ; GFX9-NEXT:    s_sub_i32 s1, 0, s6
2561 ; GFX9-NEXT:    s_and_b32 s7, s0, 7
2562 ; GFX9-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
2563 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v0, v0
2564 ; GFX9-NEXT:    v_mul_lo_u32 v1, s1, v0
2565 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2566 ; GFX9-NEXT:    v_mul_hi_u32 v1, v0, v1
2567 ; GFX9-NEXT:    v_add_u32_e32 v0, v0, v1
2568 ; GFX9-NEXT:    v_mul_hi_u32 v0, s7, v0
2569 ; GFX9-NEXT:    v_mul_lo_u32 v1, v0, s6
2570 ; GFX9-NEXT:    v_add_u32_e32 v3, 1, v0
2571 ; GFX9-NEXT:    v_sub_u32_e32 v1, s7, v1
2572 ; GFX9-NEXT:    v_cmp_le_u32_e32 vcc, s6, v1
2573 ; GFX9-NEXT:    v_cndmask_b32_e32 v0, v0, v3, vcc
2574 ; GFX9-NEXT:    v_subrev_u32_e32 v3, s6, v1
2575 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, v1, v3, vcc
2576 ; GFX9-NEXT:    v_add_u32_e32 v3, 1, v0
2577 ; GFX9-NEXT:    v_cmp_le_u32_e32 vcc, s6, v1
2578 ; GFX9-NEXT:    v_cndmask_b32_e32 v0, v0, v3, vcc
2579 ; GFX9-NEXT:    v_subrev_u32_e32 v3, s6, v1
2580 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, v1, v3, vcc
2581 ; GFX9-NEXT:    v_and_b32_e32 v0, 7, v0
2582 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2583 ; GFX9-NEXT:    global_store_byte v2, v0, s[0:1]
2584 ; GFX9-NEXT:    v_and_b32_e32 v0, 7, v1
2585 ; GFX9-NEXT:    global_store_byte v2, v0, s[2:3]
2586 ; GFX9-NEXT:    s_endpgm
2588 ; GFX10-LABEL: udivrem_i3:
2589 ; GFX10:       ; %bb.0:
2590 ; GFX10-NEXT:    s_load_dword s0, s[4:5], 0x10
2591 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
2592 ; GFX10-NEXT:    s_bfe_u32 s6, s0, 0x30008
2593 ; GFX10-NEXT:    s_and_b32 s0, s0, 7
2594 ; GFX10-NEXT:    v_cvt_f32_ubyte0_e32 v0, s6
2595 ; GFX10-NEXT:    s_sub_i32 s1, 0, s6
2596 ; GFX10-NEXT:    v_rcp_iflag_f32_e32 v0, v0
2597 ; GFX10-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
2598 ; GFX10-NEXT:    v_cvt_u32_f32_e32 v0, v0
2599 ; GFX10-NEXT:    v_mul_lo_u32 v1, s1, v0
2600 ; GFX10-NEXT:    v_mul_hi_u32 v1, v0, v1
2601 ; GFX10-NEXT:    v_add_nc_u32_e32 v0, v0, v1
2602 ; GFX10-NEXT:    v_mul_hi_u32 v0, s0, v0
2603 ; GFX10-NEXT:    v_mul_lo_u32 v1, v0, s6
2604 ; GFX10-NEXT:    v_add_nc_u32_e32 v2, 1, v0
2605 ; GFX10-NEXT:    v_sub_nc_u32_e32 v1, s0, v1
2606 ; GFX10-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2607 ; GFX10-NEXT:    v_subrev_nc_u32_e32 v3, s6, v1
2608 ; GFX10-NEXT:    v_cmp_le_u32_e32 vcc_lo, s6, v1
2609 ; GFX10-NEXT:    v_cndmask_b32_e32 v0, v0, v2, vcc_lo
2610 ; GFX10-NEXT:    v_cndmask_b32_e32 v1, v1, v3, vcc_lo
2611 ; GFX10-NEXT:    v_add_nc_u32_e32 v2, 1, v0
2612 ; GFX10-NEXT:    v_cmp_le_u32_e32 vcc_lo, s6, v1
2613 ; GFX10-NEXT:    v_subrev_nc_u32_e32 v3, s6, v1
2614 ; GFX10-NEXT:    v_cndmask_b32_e32 v0, v0, v2, vcc_lo
2615 ; GFX10-NEXT:    v_cndmask_b32_e32 v1, v1, v3, vcc_lo
2616 ; GFX10-NEXT:    v_mov_b32_e32 v2, 0
2617 ; GFX10-NEXT:    v_and_b32_e32 v0, 7, v0
2618 ; GFX10-NEXT:    v_and_b32_e32 v1, 7, v1
2619 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
2620 ; GFX10-NEXT:    global_store_byte v2, v0, s[0:1]
2621 ; GFX10-NEXT:    global_store_byte v2, v1, s[2:3]
2622 ; GFX10-NEXT:    s_endpgm
2623   %div = udiv i3 %x, %y
2624   store i3 %div, i3 addrspace(1)* %out0
2625   %rem = urem i3 %x, %y
2626   store i3 %rem, i3 addrspace(1)* %out1
2627   ret void
2630 define amdgpu_kernel void @udivrem_i27(i27 addrspace(1)* %out0, i27 addrspace(1)* %out1, i27 %x, i27 %y) {
2631 ; GFX8-LABEL: udivrem_i27:
2632 ; GFX8:       ; %bb.0:
2633 ; GFX8-NEXT:    s_load_dwordx2 s[6:7], s[4:5], 0x10
2634 ; GFX8-NEXT:    s_mov_b32 s8, 0x7ffffff
2635 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
2636 ; GFX8-NEXT:    s_and_b32 s7, s7, s8
2637 ; GFX8-NEXT:    v_cvt_f32_u32_e32 v0, s7
2638 ; GFX8-NEXT:    s_sub_i32 s0, 0, s7
2639 ; GFX8-NEXT:    v_rcp_iflag_f32_e32 v0, v0
2640 ; GFX8-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
2641 ; GFX8-NEXT:    v_cvt_u32_f32_e32 v0, v0
2642 ; GFX8-NEXT:    v_mul_lo_u32 v1, s0, v0
2643 ; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2644 ; GFX8-NEXT:    s_and_b32 s4, s6, s8
2645 ; GFX8-NEXT:    v_mul_hi_u32 v1, v0, v1
2646 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, v0, v1
2647 ; GFX8-NEXT:    v_mul_hi_u32 v2, s4, v0
2648 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
2649 ; GFX8-NEXT:    v_mov_b32_e32 v0, s0
2650 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
2651 ; GFX8-NEXT:    v_mul_lo_u32 v3, v2, s7
2652 ; GFX8-NEXT:    v_add_u32_e32 v4, vcc, 1, v2
2653 ; GFX8-NEXT:    v_sub_u32_e32 v3, vcc, s4, v3
2654 ; GFX8-NEXT:    v_cmp_le_u32_e32 vcc, s7, v3
2655 ; GFX8-NEXT:    v_cndmask_b32_e32 v2, v2, v4, vcc
2656 ; GFX8-NEXT:    v_subrev_u32_e64 v4, s[0:1], s7, v3
2657 ; GFX8-NEXT:    v_cndmask_b32_e32 v3, v3, v4, vcc
2658 ; GFX8-NEXT:    v_add_u32_e32 v4, vcc, 1, v2
2659 ; GFX8-NEXT:    v_cmp_le_u32_e32 vcc, s7, v3
2660 ; GFX8-NEXT:    v_cndmask_b32_e32 v2, v2, v4, vcc
2661 ; GFX8-NEXT:    v_subrev_u32_e64 v4, s[0:1], s7, v3
2662 ; GFX8-NEXT:    v_and_b32_e32 v2, s8, v2
2663 ; GFX8-NEXT:    v_cndmask_b32_e32 v3, v3, v4, vcc
2664 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
2665 ; GFX8-NEXT:    v_mov_b32_e32 v0, s2
2666 ; GFX8-NEXT:    v_and_b32_e32 v2, s8, v3
2667 ; GFX8-NEXT:    v_mov_b32_e32 v1, s3
2668 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
2669 ; GFX8-NEXT:    s_endpgm
2671 ; GFX9-LABEL: udivrem_i27:
2672 ; GFX9:       ; %bb.0:
2673 ; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x10
2674 ; GFX9-NEXT:    s_mov_b32 s6, 0x7ffffff
2675 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0
2676 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2677 ; GFX9-NEXT:    s_and_b32 s7, s1, s6
2678 ; GFX9-NEXT:    v_cvt_f32_u32_e32 v0, s7
2679 ; GFX9-NEXT:    s_sub_i32 s1, 0, s7
2680 ; GFX9-NEXT:    s_and_b32 s8, s0, s6
2681 ; GFX9-NEXT:    v_rcp_iflag_f32_e32 v0, v0
2682 ; GFX9-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
2683 ; GFX9-NEXT:    v_cvt_u32_f32_e32 v0, v0
2684 ; GFX9-NEXT:    v_mul_lo_u32 v1, s1, v0
2685 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2686 ; GFX9-NEXT:    v_mul_hi_u32 v1, v0, v1
2687 ; GFX9-NEXT:    v_add_u32_e32 v0, v0, v1
2688 ; GFX9-NEXT:    v_mul_hi_u32 v0, s8, v0
2689 ; GFX9-NEXT:    v_mul_lo_u32 v1, v0, s7
2690 ; GFX9-NEXT:    v_add_u32_e32 v3, 1, v0
2691 ; GFX9-NEXT:    v_sub_u32_e32 v1, s8, v1
2692 ; GFX9-NEXT:    v_cmp_le_u32_e32 vcc, s7, v1
2693 ; GFX9-NEXT:    v_cndmask_b32_e32 v0, v0, v3, vcc
2694 ; GFX9-NEXT:    v_subrev_u32_e32 v3, s7, v1
2695 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, v1, v3, vcc
2696 ; GFX9-NEXT:    v_add_u32_e32 v3, 1, v0
2697 ; GFX9-NEXT:    v_cmp_le_u32_e32 vcc, s7, v1
2698 ; GFX9-NEXT:    v_cndmask_b32_e32 v0, v0, v3, vcc
2699 ; GFX9-NEXT:    v_subrev_u32_e32 v3, s7, v1
2700 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, v1, v3, vcc
2701 ; GFX9-NEXT:    v_and_b32_e32 v0, s6, v0
2702 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2703 ; GFX9-NEXT:    global_store_dword v2, v0, s[0:1]
2704 ; GFX9-NEXT:    v_and_b32_e32 v0, s6, v1
2705 ; GFX9-NEXT:    global_store_dword v2, v0, s[2:3]
2706 ; GFX9-NEXT:    s_endpgm
2708 ; GFX10-LABEL: udivrem_i27:
2709 ; GFX10:       ; %bb.0:
2710 ; GFX10-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x10
2711 ; GFX10-NEXT:    s_mov_b32 s6, 0x7ffffff
2712 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
2713 ; GFX10-NEXT:    s_and_b32 s7, s1, s6
2714 ; GFX10-NEXT:    s_and_b32 s0, s0, s6
2715 ; GFX10-NEXT:    v_cvt_f32_u32_e32 v0, s7
2716 ; GFX10-NEXT:    s_sub_i32 s1, 0, s7
2717 ; GFX10-NEXT:    v_rcp_iflag_f32_e32 v0, v0
2718 ; GFX10-NEXT:    v_mul_f32_e32 v0, 0x4f7ffffe, v0
2719 ; GFX10-NEXT:    v_cvt_u32_f32_e32 v0, v0
2720 ; GFX10-NEXT:    v_mul_lo_u32 v1, s1, v0
2721 ; GFX10-NEXT:    v_mul_hi_u32 v1, v0, v1
2722 ; GFX10-NEXT:    v_add_nc_u32_e32 v0, v0, v1
2723 ; GFX10-NEXT:    v_mul_hi_u32 v0, s0, v0
2724 ; GFX10-NEXT:    v_mul_lo_u32 v1, v0, s7
2725 ; GFX10-NEXT:    v_add_nc_u32_e32 v2, 1, v0
2726 ; GFX10-NEXT:    v_sub_nc_u32_e32 v1, s0, v1
2727 ; GFX10-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2728 ; GFX10-NEXT:    v_subrev_nc_u32_e32 v3, s7, v1
2729 ; GFX10-NEXT:    v_cmp_le_u32_e32 vcc_lo, s7, v1
2730 ; GFX10-NEXT:    v_cndmask_b32_e32 v0, v0, v2, vcc_lo
2731 ; GFX10-NEXT:    v_cndmask_b32_e32 v1, v1, v3, vcc_lo
2732 ; GFX10-NEXT:    v_add_nc_u32_e32 v2, 1, v0
2733 ; GFX10-NEXT:    v_cmp_le_u32_e32 vcc_lo, s7, v1
2734 ; GFX10-NEXT:    v_subrev_nc_u32_e32 v3, s7, v1
2735 ; GFX10-NEXT:    v_cndmask_b32_e32 v0, v0, v2, vcc_lo
2736 ; GFX10-NEXT:    v_cndmask_b32_e32 v1, v1, v3, vcc_lo
2737 ; GFX10-NEXT:    v_mov_b32_e32 v2, 0
2738 ; GFX10-NEXT:    v_and_b32_e32 v0, s6, v0
2739 ; GFX10-NEXT:    v_and_b32_e32 v1, s6, v1
2740 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
2741 ; GFX10-NEXT:    global_store_dword v2, v0, s[0:1]
2742 ; GFX10-NEXT:    global_store_dword v2, v1, s[2:3]
2743 ; GFX10-NEXT:    s_endpgm
2744   %div = udiv i27 %x, %y
2745   store i27 %div, i27 addrspace(1)* %out0
2746   %rem = urem i27 %x, %y
2747   store i27 %rem, i27 addrspace(1)* %out1
2748   ret void