xref: /aosp_15_r20/external/llvm/test/CodeGen/AMDGPU/udivrem24.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s
2*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s
3*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=r600 -mcpu=redwood < %s | FileCheck -check-prefix=EG -check-prefix=FUNC %s
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}udiv24_i8:
6*9880d681SAndroid Build Coastguard Worker; SI: v_cvt_f32_ubyte
7*9880d681SAndroid Build Coastguard Worker; SI: v_cvt_f32_ubyte
8*9880d681SAndroid Build Coastguard Worker; SI: v_rcp_f32
9*9880d681SAndroid Build Coastguard Worker; SI: v_cvt_u32_f32
10*9880d681SAndroid Build Coastguard Worker
11*9880d681SAndroid Build Coastguard Worker; EG: UINT_TO_FLT
12*9880d681SAndroid Build Coastguard Worker; EG-DAG: UINT_TO_FLT
13*9880d681SAndroid Build Coastguard Worker; EG-DAG: RECIP_IEEE
14*9880d681SAndroid Build Coastguard Worker; EG: FLT_TO_UINT
15*9880d681SAndroid Build Coastguard Workerdefine void @udiv24_i8(i8 addrspace(1)* %out, i8 addrspace(1)* %in) {
16*9880d681SAndroid Build Coastguard Worker  %den_ptr = getelementptr i8, i8 addrspace(1)* %in, i8 1
17*9880d681SAndroid Build Coastguard Worker  %num = load i8, i8 addrspace(1) * %in
18*9880d681SAndroid Build Coastguard Worker  %den = load i8, i8 addrspace(1) * %den_ptr
19*9880d681SAndroid Build Coastguard Worker  %result = udiv i8 %num, %den
20*9880d681SAndroid Build Coastguard Worker  store i8 %result, i8 addrspace(1)* %out
21*9880d681SAndroid Build Coastguard Worker  ret void
22*9880d681SAndroid Build Coastguard Worker}
23*9880d681SAndroid Build Coastguard Worker
24*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}udiv24_i16:
25*9880d681SAndroid Build Coastguard Worker; SI: v_cvt_f32_u32
26*9880d681SAndroid Build Coastguard Worker; SI: v_cvt_f32_u32
27*9880d681SAndroid Build Coastguard Worker; SI: v_rcp_f32
28*9880d681SAndroid Build Coastguard Worker; SI: v_cvt_u32_f32
29*9880d681SAndroid Build Coastguard Worker
30*9880d681SAndroid Build Coastguard Worker; EG: UINT_TO_FLT
31*9880d681SAndroid Build Coastguard Worker; EG-DAG: UINT_TO_FLT
32*9880d681SAndroid Build Coastguard Worker; EG-DAG: RECIP_IEEE
33*9880d681SAndroid Build Coastguard Worker; EG: FLT_TO_UINT
34*9880d681SAndroid Build Coastguard Workerdefine void @udiv24_i16(i16 addrspace(1)* %out, i16 addrspace(1)* %in) {
35*9880d681SAndroid Build Coastguard Worker  %den_ptr = getelementptr i16, i16 addrspace(1)* %in, i16 1
36*9880d681SAndroid Build Coastguard Worker  %num = load i16, i16 addrspace(1) * %in, align 2
37*9880d681SAndroid Build Coastguard Worker  %den = load i16, i16 addrspace(1) * %den_ptr, align 2
38*9880d681SAndroid Build Coastguard Worker  %result = udiv i16 %num, %den
39*9880d681SAndroid Build Coastguard Worker  store i16 %result, i16 addrspace(1)* %out, align 2
40*9880d681SAndroid Build Coastguard Worker  ret void
41*9880d681SAndroid Build Coastguard Worker}
42*9880d681SAndroid Build Coastguard Worker
43*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}udiv23_i32:
44*9880d681SAndroid Build Coastguard Worker; SI: v_cvt_f32_u32
45*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_cvt_f32_u32
46*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_rcp_f32
47*9880d681SAndroid Build Coastguard Worker; SI: v_cvt_u32_f32
48*9880d681SAndroid Build Coastguard Worker
49*9880d681SAndroid Build Coastguard Worker; EG: UINT_TO_FLT
50*9880d681SAndroid Build Coastguard Worker; EG-DAG: UINT_TO_FLT
51*9880d681SAndroid Build Coastguard Worker; EG-DAG: RECIP_IEEE
52*9880d681SAndroid Build Coastguard Worker; EG: FLT_TO_UINT
53*9880d681SAndroid Build Coastguard Workerdefine void @udiv23_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) {
54*9880d681SAndroid Build Coastguard Worker  %den_ptr = getelementptr i32, i32 addrspace(1)* %in, i32 1
55*9880d681SAndroid Build Coastguard Worker  %num = load i32, i32 addrspace(1) * %in, align 4
56*9880d681SAndroid Build Coastguard Worker  %den = load i32, i32 addrspace(1) * %den_ptr, align 4
57*9880d681SAndroid Build Coastguard Worker  %num.i23.0 = shl i32 %num, 9
58*9880d681SAndroid Build Coastguard Worker  %den.i23.0 = shl i32 %den, 9
59*9880d681SAndroid Build Coastguard Worker  %num.i23 = lshr i32 %num.i23.0, 9
60*9880d681SAndroid Build Coastguard Worker  %den.i23 = lshr i32 %den.i23.0, 9
61*9880d681SAndroid Build Coastguard Worker  %result = udiv i32 %num.i23, %den.i23
62*9880d681SAndroid Build Coastguard Worker  store i32 %result, i32 addrspace(1)* %out, align 4
63*9880d681SAndroid Build Coastguard Worker  ret void
64*9880d681SAndroid Build Coastguard Worker}
65*9880d681SAndroid Build Coastguard Worker
66*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}udiv24_i32:
67*9880d681SAndroid Build Coastguard Worker; SI: v_rcp_iflag
68*9880d681SAndroid Build Coastguard Worker; SI-NOT v_rcp_f32
69*9880d681SAndroid Build Coastguard Worker; EG-NOT: RECIP_IEEE
70*9880d681SAndroid Build Coastguard Workerdefine void @udiv24_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) {
71*9880d681SAndroid Build Coastguard Worker  %den_ptr = getelementptr i32, i32 addrspace(1)* %in, i32 1
72*9880d681SAndroid Build Coastguard Worker  %num = load i32, i32 addrspace(1) * %in, align 4
73*9880d681SAndroid Build Coastguard Worker  %den = load i32, i32 addrspace(1) * %den_ptr, align 4
74*9880d681SAndroid Build Coastguard Worker  %num.i24.0 = shl i32 %num, 8
75*9880d681SAndroid Build Coastguard Worker  %den.i24.0 = shl i32 %den, 8
76*9880d681SAndroid Build Coastguard Worker  %num.i24 = lshr i32 %num.i24.0, 8
77*9880d681SAndroid Build Coastguard Worker  %den.i24 = lshr i32 %den.i24.0, 8
78*9880d681SAndroid Build Coastguard Worker  %result = udiv i32 %num.i24, %den.i24
79*9880d681SAndroid Build Coastguard Worker  store i32 %result, i32 addrspace(1)* %out, align 4
80*9880d681SAndroid Build Coastguard Worker  ret void
81*9880d681SAndroid Build Coastguard Worker}
82*9880d681SAndroid Build Coastguard Worker
83*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}no_udiv24_u23_u24_i32:
84*9880d681SAndroid Build Coastguard Worker; SI: v_rcp_iflag
85*9880d681SAndroid Build Coastguard Worker; SI-NOT v_rcp_f32
86*9880d681SAndroid Build Coastguard Worker; EG-NOT: RECIP_IEEE
87*9880d681SAndroid Build Coastguard Workerdefine void @no_udiv24_u23_u24_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) {
88*9880d681SAndroid Build Coastguard Worker  %den_ptr = getelementptr i32, i32 addrspace(1)* %in, i32 1
89*9880d681SAndroid Build Coastguard Worker  %num = load i32, i32 addrspace(1) * %in, align 4
90*9880d681SAndroid Build Coastguard Worker  %den = load i32, i32 addrspace(1) * %den_ptr, align 4
91*9880d681SAndroid Build Coastguard Worker  %num.i23.0 = shl i32 %num, 9
92*9880d681SAndroid Build Coastguard Worker  %den.i24.0 = shl i32 %den, 8
93*9880d681SAndroid Build Coastguard Worker  %num.i23 = lshr i32 %num.i23.0, 9
94*9880d681SAndroid Build Coastguard Worker  %den.i24 = lshr i32 %den.i24.0, 8
95*9880d681SAndroid Build Coastguard Worker  %result = udiv i32 %num.i23, %den.i24
96*9880d681SAndroid Build Coastguard Worker  store i32 %result, i32 addrspace(1)* %out, align 4
97*9880d681SAndroid Build Coastguard Worker  ret void
98*9880d681SAndroid Build Coastguard Worker}
99*9880d681SAndroid Build Coastguard Worker
100*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}no_udiv24_u24_u23_i32:
101*9880d681SAndroid Build Coastguard Worker; SI: v_rcp_iflag
102*9880d681SAndroid Build Coastguard Worker; SI-NOT v_rcp_f32
103*9880d681SAndroid Build Coastguard Worker; EG-NOT: RECIP_IEEE
104*9880d681SAndroid Build Coastguard Workerdefine void @no_udiv24_u24_u23_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) {
105*9880d681SAndroid Build Coastguard Worker  %den_ptr = getelementptr i32, i32 addrspace(1)* %in, i32 1
106*9880d681SAndroid Build Coastguard Worker  %num = load i32, i32 addrspace(1) * %in, align 4
107*9880d681SAndroid Build Coastguard Worker  %den = load i32, i32 addrspace(1) * %den_ptr, align 4
108*9880d681SAndroid Build Coastguard Worker  %num.i24.0 = shl i32 %num, 8
109*9880d681SAndroid Build Coastguard Worker  %den.i23.0 = shl i32 %den, 9
110*9880d681SAndroid Build Coastguard Worker  %num.i24 = lshr i32 %num.i24.0, 8
111*9880d681SAndroid Build Coastguard Worker  %den.i23 = lshr i32 %den.i23.0, 9
112*9880d681SAndroid Build Coastguard Worker  %result = udiv i32 %num.i24, %den.i23
113*9880d681SAndroid Build Coastguard Worker  store i32 %result, i32 addrspace(1)* %out, align 4
114*9880d681SAndroid Build Coastguard Worker  ret void
115*9880d681SAndroid Build Coastguard Worker}
116*9880d681SAndroid Build Coastguard Worker
117*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}udiv25_i32:
118*9880d681SAndroid Build Coastguard Worker; RCP_IFLAG is for URECIP in the full 32b alg
119*9880d681SAndroid Build Coastguard Worker; SI: v_rcp_iflag
120*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_rcp_f32
121*9880d681SAndroid Build Coastguard Worker
122*9880d681SAndroid Build Coastguard Worker; EG-NOT: UINT_TO_FLT
123*9880d681SAndroid Build Coastguard Worker; EG-NOT: RECIP_IEEE
124*9880d681SAndroid Build Coastguard Workerdefine void @udiv25_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) {
125*9880d681SAndroid Build Coastguard Worker  %den_ptr = getelementptr i32, i32 addrspace(1)* %in, i32 1
126*9880d681SAndroid Build Coastguard Worker  %num = load i32, i32 addrspace(1) * %in, align 4
127*9880d681SAndroid Build Coastguard Worker  %den = load i32, i32 addrspace(1) * %den_ptr, align 4
128*9880d681SAndroid Build Coastguard Worker  %num.i25.0 = shl i32 %num, 7
129*9880d681SAndroid Build Coastguard Worker  %den.i25.0 = shl i32 %den, 7
130*9880d681SAndroid Build Coastguard Worker  %num.i25 = lshr i32 %num.i25.0, 7
131*9880d681SAndroid Build Coastguard Worker  %den.i25 = lshr i32 %den.i25.0, 7
132*9880d681SAndroid Build Coastguard Worker  %result = udiv i32 %num.i25, %den.i25
133*9880d681SAndroid Build Coastguard Worker  store i32 %result, i32 addrspace(1)* %out, align 4
134*9880d681SAndroid Build Coastguard Worker  ret void
135*9880d681SAndroid Build Coastguard Worker}
136*9880d681SAndroid Build Coastguard Worker
137*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}test_no_udiv24_i32_1:
138*9880d681SAndroid Build Coastguard Worker; RCP_IFLAG is for URECIP in the full 32b alg
139*9880d681SAndroid Build Coastguard Worker; SI: v_rcp_iflag
140*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_rcp_f32
141*9880d681SAndroid Build Coastguard Worker
142*9880d681SAndroid Build Coastguard Worker; EG-NOT: UINT_TO_FLT
143*9880d681SAndroid Build Coastguard Worker; EG-NOT: RECIP_IEEE
144*9880d681SAndroid Build Coastguard Workerdefine void @test_no_udiv24_i32_1(i32 addrspace(1)* %out, i32 addrspace(1)* %in) {
145*9880d681SAndroid Build Coastguard Worker  %den_ptr = getelementptr i32, i32 addrspace(1)* %in, i32 1
146*9880d681SAndroid Build Coastguard Worker  %num = load i32, i32 addrspace(1) * %in, align 4
147*9880d681SAndroid Build Coastguard Worker  %den = load i32, i32 addrspace(1) * %den_ptr, align 4
148*9880d681SAndroid Build Coastguard Worker  %num.i24.0 = shl i32 %num, 8
149*9880d681SAndroid Build Coastguard Worker  %den.i24.0 = shl i32 %den, 7
150*9880d681SAndroid Build Coastguard Worker  %num.i24 = lshr i32 %num.i24.0, 8
151*9880d681SAndroid Build Coastguard Worker  %den.i24 = lshr i32 %den.i24.0, 7
152*9880d681SAndroid Build Coastguard Worker  %result = udiv i32 %num.i24, %den.i24
153*9880d681SAndroid Build Coastguard Worker  store i32 %result, i32 addrspace(1)* %out, align 4
154*9880d681SAndroid Build Coastguard Worker  ret void
155*9880d681SAndroid Build Coastguard Worker}
156*9880d681SAndroid Build Coastguard Worker
157*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}test_no_udiv24_i32_2:
158*9880d681SAndroid Build Coastguard Worker; RCP_IFLAG is for URECIP in the full 32b alg
159*9880d681SAndroid Build Coastguard Worker; SI: v_rcp_iflag
160*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_rcp_f32
161*9880d681SAndroid Build Coastguard Worker
162*9880d681SAndroid Build Coastguard Worker; EG-NOT: UINT_TO_FLT
163*9880d681SAndroid Build Coastguard Worker; EG-NOT: RECIP_IEEE
164*9880d681SAndroid Build Coastguard Workerdefine void @test_no_udiv24_i32_2(i32 addrspace(1)* %out, i32 addrspace(1)* %in) {
165*9880d681SAndroid Build Coastguard Worker  %den_ptr = getelementptr i32, i32 addrspace(1)* %in, i32 1
166*9880d681SAndroid Build Coastguard Worker  %num = load i32, i32 addrspace(1) * %in, align 4
167*9880d681SAndroid Build Coastguard Worker  %den = load i32, i32 addrspace(1) * %den_ptr, align 4
168*9880d681SAndroid Build Coastguard Worker  %num.i24.0 = shl i32 %num, 7
169*9880d681SAndroid Build Coastguard Worker  %den.i24.0 = shl i32 %den, 8
170*9880d681SAndroid Build Coastguard Worker  %num.i24 = lshr i32 %num.i24.0, 7
171*9880d681SAndroid Build Coastguard Worker  %den.i24 = lshr i32 %den.i24.0, 8
172*9880d681SAndroid Build Coastguard Worker  %result = udiv i32 %num.i24, %den.i24
173*9880d681SAndroid Build Coastguard Worker  store i32 %result, i32 addrspace(1)* %out, align 4
174*9880d681SAndroid Build Coastguard Worker  ret void
175*9880d681SAndroid Build Coastguard Worker}
176*9880d681SAndroid Build Coastguard Worker
177*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}urem24_i8:
178*9880d681SAndroid Build Coastguard Worker; SI: v_cvt_f32_ubyte
179*9880d681SAndroid Build Coastguard Worker; SI: v_cvt_f32_ubyte
180*9880d681SAndroid Build Coastguard Worker; SI: v_rcp_f32
181*9880d681SAndroid Build Coastguard Worker; SI: v_cvt_u32_f32
182*9880d681SAndroid Build Coastguard Worker
183*9880d681SAndroid Build Coastguard Worker; EG: UINT_TO_FLT
184*9880d681SAndroid Build Coastguard Worker; EG-DAG: UINT_TO_FLT
185*9880d681SAndroid Build Coastguard Worker; EG-DAG: RECIP_IEEE
186*9880d681SAndroid Build Coastguard Worker; EG: FLT_TO_UINT
187*9880d681SAndroid Build Coastguard Workerdefine void @urem24_i8(i8 addrspace(1)* %out, i8 addrspace(1)* %in) {
188*9880d681SAndroid Build Coastguard Worker  %den_ptr = getelementptr i8, i8 addrspace(1)* %in, i8 1
189*9880d681SAndroid Build Coastguard Worker  %num = load i8, i8 addrspace(1) * %in
190*9880d681SAndroid Build Coastguard Worker  %den = load i8, i8 addrspace(1) * %den_ptr
191*9880d681SAndroid Build Coastguard Worker  %result = urem i8 %num, %den
192*9880d681SAndroid Build Coastguard Worker  store i8 %result, i8 addrspace(1)* %out
193*9880d681SAndroid Build Coastguard Worker  ret void
194*9880d681SAndroid Build Coastguard Worker}
195*9880d681SAndroid Build Coastguard Worker
196*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}urem24_i16:
197*9880d681SAndroid Build Coastguard Worker; SI: v_cvt_f32_u32
198*9880d681SAndroid Build Coastguard Worker; SI: v_cvt_f32_u32
199*9880d681SAndroid Build Coastguard Worker; SI: v_rcp_f32
200*9880d681SAndroid Build Coastguard Worker; SI: v_cvt_u32_f32
201*9880d681SAndroid Build Coastguard Worker
202*9880d681SAndroid Build Coastguard Worker; EG: UINT_TO_FLT
203*9880d681SAndroid Build Coastguard Worker; EG-DAG: UINT_TO_FLT
204*9880d681SAndroid Build Coastguard Worker; EG-DAG: RECIP_IEEE
205*9880d681SAndroid Build Coastguard Worker; EG: FLT_TO_UINT
206*9880d681SAndroid Build Coastguard Workerdefine void @urem24_i16(i16 addrspace(1)* %out, i16 addrspace(1)* %in) {
207*9880d681SAndroid Build Coastguard Worker  %den_ptr = getelementptr i16, i16 addrspace(1)* %in, i16 1
208*9880d681SAndroid Build Coastguard Worker  %num = load i16, i16 addrspace(1) * %in, align 2
209*9880d681SAndroid Build Coastguard Worker  %den = load i16, i16 addrspace(1) * %den_ptr, align 2
210*9880d681SAndroid Build Coastguard Worker  %result = urem i16 %num, %den
211*9880d681SAndroid Build Coastguard Worker  store i16 %result, i16 addrspace(1)* %out, align 2
212*9880d681SAndroid Build Coastguard Worker  ret void
213*9880d681SAndroid Build Coastguard Worker}
214*9880d681SAndroid Build Coastguard Worker
215*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}urem24_i32:
216*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_rcp_f32
217*9880d681SAndroid Build Coastguard Worker; EG-NOT: RECIP_IEEE
218*9880d681SAndroid Build Coastguard Workerdefine void @urem24_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) {
219*9880d681SAndroid Build Coastguard Worker  %den_ptr = getelementptr i32, i32 addrspace(1)* %in, i32 1
220*9880d681SAndroid Build Coastguard Worker  %num = load i32, i32 addrspace(1) * %in, align 4
221*9880d681SAndroid Build Coastguard Worker  %den = load i32, i32 addrspace(1) * %den_ptr, align 4
222*9880d681SAndroid Build Coastguard Worker  %num.i24.0 = shl i32 %num, 8
223*9880d681SAndroid Build Coastguard Worker  %den.i24.0 = shl i32 %den, 8
224*9880d681SAndroid Build Coastguard Worker  %num.i24 = lshr i32 %num.i24.0, 8
225*9880d681SAndroid Build Coastguard Worker  %den.i24 = lshr i32 %den.i24.0, 8
226*9880d681SAndroid Build Coastguard Worker  %result = urem i32 %num.i24, %den.i24
227*9880d681SAndroid Build Coastguard Worker  store i32 %result, i32 addrspace(1)* %out, align 4
228*9880d681SAndroid Build Coastguard Worker  ret void
229*9880d681SAndroid Build Coastguard Worker}
230*9880d681SAndroid Build Coastguard Worker
231*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}urem25_i32:
232*9880d681SAndroid Build Coastguard Worker; RCP_IFLAG is for URECIP in the full 32b alg
233*9880d681SAndroid Build Coastguard Worker; SI: v_rcp_iflag
234*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_rcp_f32
235*9880d681SAndroid Build Coastguard Worker
236*9880d681SAndroid Build Coastguard Worker; EG-NOT: UINT_TO_FLT
237*9880d681SAndroid Build Coastguard Worker; EG-NOT: RECIP_IEEE
238*9880d681SAndroid Build Coastguard Workerdefine void @urem25_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) {
239*9880d681SAndroid Build Coastguard Worker  %den_ptr = getelementptr i32, i32 addrspace(1)* %in, i32 1
240*9880d681SAndroid Build Coastguard Worker  %num = load i32, i32 addrspace(1) * %in, align 4
241*9880d681SAndroid Build Coastguard Worker  %den = load i32, i32 addrspace(1) * %den_ptr, align 4
242*9880d681SAndroid Build Coastguard Worker  %num.i24.0 = shl i32 %num, 7
243*9880d681SAndroid Build Coastguard Worker  %den.i24.0 = shl i32 %den, 7
244*9880d681SAndroid Build Coastguard Worker  %num.i24 = lshr i32 %num.i24.0, 7
245*9880d681SAndroid Build Coastguard Worker  %den.i24 = lshr i32 %den.i24.0, 7
246*9880d681SAndroid Build Coastguard Worker  %result = urem i32 %num.i24, %den.i24
247*9880d681SAndroid Build Coastguard Worker  store i32 %result, i32 addrspace(1)* %out, align 4
248*9880d681SAndroid Build Coastguard Worker  ret void
249*9880d681SAndroid Build Coastguard Worker}
250*9880d681SAndroid Build Coastguard Worker
251*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}test_no_urem24_i32_1:
252*9880d681SAndroid Build Coastguard Worker; RCP_IFLAG is for URECIP in the full 32b alg
253*9880d681SAndroid Build Coastguard Worker; SI: v_rcp_iflag
254*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_rcp_f32
255*9880d681SAndroid Build Coastguard Worker
256*9880d681SAndroid Build Coastguard Worker; EG-NOT: UINT_TO_FLT
257*9880d681SAndroid Build Coastguard Worker; EG-NOT: RECIP_IEEE
258*9880d681SAndroid Build Coastguard Workerdefine void @test_no_urem24_i32_1(i32 addrspace(1)* %out, i32 addrspace(1)* %in) {
259*9880d681SAndroid Build Coastguard Worker  %den_ptr = getelementptr i32, i32 addrspace(1)* %in, i32 1
260*9880d681SAndroid Build Coastguard Worker  %num = load i32, i32 addrspace(1) * %in, align 4
261*9880d681SAndroid Build Coastguard Worker  %den = load i32, i32 addrspace(1) * %den_ptr, align 4
262*9880d681SAndroid Build Coastguard Worker  %num.i24.0 = shl i32 %num, 8
263*9880d681SAndroid Build Coastguard Worker  %den.i24.0 = shl i32 %den, 7
264*9880d681SAndroid Build Coastguard Worker  %num.i24 = lshr i32 %num.i24.0, 8
265*9880d681SAndroid Build Coastguard Worker  %den.i24 = lshr i32 %den.i24.0, 7
266*9880d681SAndroid Build Coastguard Worker  %result = urem i32 %num.i24, %den.i24
267*9880d681SAndroid Build Coastguard Worker  store i32 %result, i32 addrspace(1)* %out, align 4
268*9880d681SAndroid Build Coastguard Worker  ret void
269*9880d681SAndroid Build Coastguard Worker}
270*9880d681SAndroid Build Coastguard Worker
271*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}test_no_urem24_i32_2:
272*9880d681SAndroid Build Coastguard Worker; RCP_IFLAG is for URECIP in the full 32b alg
273*9880d681SAndroid Build Coastguard Worker; SI: v_rcp_iflag
274*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_rcp_f32
275*9880d681SAndroid Build Coastguard Worker
276*9880d681SAndroid Build Coastguard Worker; EG-NOT: UINT_TO_FLT
277*9880d681SAndroid Build Coastguard Worker; EG-NOT: RECIP_IEEE
278*9880d681SAndroid Build Coastguard Workerdefine void @test_no_urem24_i32_2(i32 addrspace(1)* %out, i32 addrspace(1)* %in) {
279*9880d681SAndroid Build Coastguard Worker  %den_ptr = getelementptr i32, i32 addrspace(1)* %in, i32 1
280*9880d681SAndroid Build Coastguard Worker  %num = load i32, i32 addrspace(1) * %in, align 4
281*9880d681SAndroid Build Coastguard Worker  %den = load i32, i32 addrspace(1) * %den_ptr, align 4
282*9880d681SAndroid Build Coastguard Worker  %num.i24.0 = shl i32 %num, 7
283*9880d681SAndroid Build Coastguard Worker  %den.i24.0 = shl i32 %den, 8
284*9880d681SAndroid Build Coastguard Worker  %num.i24 = lshr i32 %num.i24.0, 7
285*9880d681SAndroid Build Coastguard Worker  %den.i24 = lshr i32 %den.i24.0, 8
286*9880d681SAndroid Build Coastguard Worker  %result = urem i32 %num.i24, %den.i24
287*9880d681SAndroid Build Coastguard Worker  store i32 %result, i32 addrspace(1)* %out, align 4
288*9880d681SAndroid Build Coastguard Worker  ret void
289*9880d681SAndroid Build Coastguard Worker}
290*9880d681SAndroid Build Coastguard Worker
291*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}test_udiv24_u16_u23_i32:
292*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_rcp_f32
293*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_mov_b32 [[MASK:s[0-9]+]], 0x7fffff{{$}}
294*9880d681SAndroid Build Coastguard Worker; SI: v_and_b32_e32 v{{[0-9]+}}, [[MASK]],
295*9880d681SAndroid Build Coastguard Worker
296*9880d681SAndroid Build Coastguard Worker; EG: RECIP_IEEE
297*9880d681SAndroid Build Coastguard Workerdefine void @test_udiv24_u16_u23_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) {
298*9880d681SAndroid Build Coastguard Worker  %den_ptr = getelementptr i32, i32 addrspace(1)* %in, i32 1
299*9880d681SAndroid Build Coastguard Worker  %num = load i32, i32 addrspace(1) * %in, align 4
300*9880d681SAndroid Build Coastguard Worker  %den = load i32, i32 addrspace(1) * %den_ptr, align 4
301*9880d681SAndroid Build Coastguard Worker  %num.i16.0 = shl i32 %num, 16
302*9880d681SAndroid Build Coastguard Worker  %den.i23.0 = shl i32 %den, 9
303*9880d681SAndroid Build Coastguard Worker  %num.i16 = lshr i32 %num.i16.0, 16
304*9880d681SAndroid Build Coastguard Worker  %den.i23 = lshr i32 %den.i23.0, 9
305*9880d681SAndroid Build Coastguard Worker  %result = udiv i32 %num.i16, %den.i23
306*9880d681SAndroid Build Coastguard Worker  store i32 %result, i32 addrspace(1)* %out, align 4
307*9880d681SAndroid Build Coastguard Worker  ret void
308*9880d681SAndroid Build Coastguard Worker}
309*9880d681SAndroid Build Coastguard Worker
310*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}test_udiv24_u23_u16_i32:
311*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_rcp_f32
312*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_mov_b32 [[MASK:s[0-9]+]], 0x7fffff{{$}}
313*9880d681SAndroid Build Coastguard Worker; SI: v_and_b32_e32 v{{[0-9]+}}, [[MASK]],
314*9880d681SAndroid Build Coastguard Worker
315*9880d681SAndroid Build Coastguard Worker; EG: RECIP_IEEE
316*9880d681SAndroid Build Coastguard Workerdefine void @test_udiv24_u23_u16_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) {
317*9880d681SAndroid Build Coastguard Worker  %den_ptr = getelementptr i32, i32 addrspace(1)* %in, i32 1
318*9880d681SAndroid Build Coastguard Worker  %num = load i32, i32 addrspace(1) * %in, align 4
319*9880d681SAndroid Build Coastguard Worker  %den = load i32, i32 addrspace(1) * %den_ptr, align 4
320*9880d681SAndroid Build Coastguard Worker  %num.i23.0 = shl i32 %num, 9
321*9880d681SAndroid Build Coastguard Worker  %den.i16.0 = shl i32 %den, 16
322*9880d681SAndroid Build Coastguard Worker  %num.i23 = lshr i32 %num.i23.0, 9
323*9880d681SAndroid Build Coastguard Worker  %den.i16 = lshr i32 %den.i16.0, 16
324*9880d681SAndroid Build Coastguard Worker  %result = udiv i32 %num.i23, %den.i16
325*9880d681SAndroid Build Coastguard Worker  store i32 %result, i32 addrspace(1)* %out, align 4
326*9880d681SAndroid Build Coastguard Worker  ret void
327*9880d681SAndroid Build Coastguard Worker}
328