blob: 219c662b7efef30ea9cf137053f88b72d158c253 [file] [log] [blame]
Jan Veselye5ca27d2014-08-12 17:31:20 +00001; RUN: llc -march=r600 -mcpu=SI < %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s
2; RUN: llc -march=r600 -mcpu=redwood < %s | FileCheck -check-prefix=EG -check-prefix=FUNC %s
3
4; FUNC-LABEL: @udiv24_i8
5; SI: V_CVT_F32_UBYTE
6; SI: V_CVT_F32_UBYTE
7; SI: V_RCP_F32
8; SI: V_CVT_U32_F32
9
10; EG: UINT_TO_FLT
11; EG-DAG: UINT_TO_FLT
12; EG-DAG: RECIP_IEEE
13; EG: FLT_TO_UINT
14define void @udiv24_i8(i8 addrspace(1)* %out, i8 addrspace(1)* %in) {
15 %den_ptr = getelementptr i8 addrspace(1)* %in, i8 1
16 %num = load i8 addrspace(1) * %in
17 %den = load i8 addrspace(1) * %den_ptr
18 %result = udiv i8 %num, %den
19 store i8 %result, i8 addrspace(1)* %out
20 ret void
21}
22
23; FUNC-LABEL: @udiv24_i16
24; SI: V_CVT_F32_U32
25; SI: V_CVT_F32_U32
26; SI: V_RCP_F32
27; SI: V_CVT_U32_F32
28
29; EG: UINT_TO_FLT
30; EG-DAG: UINT_TO_FLT
31; EG-DAG: RECIP_IEEE
32; EG: FLT_TO_UINT
33define void @udiv24_i16(i16 addrspace(1)* %out, i16 addrspace(1)* %in) {
34 %den_ptr = getelementptr i16 addrspace(1)* %in, i16 1
35 %num = load i16 addrspace(1) * %in, align 2
36 %den = load i16 addrspace(1) * %den_ptr, align 2
37 %result = udiv i16 %num, %den
38 store i16 %result, i16 addrspace(1)* %out, align 2
39 ret void
40}
41
42; FUNC-LABEL: @udiv24_i32
43; SI: V_CVT_F32_U32
44; SI-DAG: V_CVT_F32_U32
45; SI-DAG: V_RCP_F32
46; SI: V_CVT_U32_F32
47
48; EG: UINT_TO_FLT
49; EG-DAG: UINT_TO_FLT
50; EG-DAG: RECIP_IEEE
51; EG: FLT_TO_UINT
52define void @udiv24_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) {
53 %den_ptr = getelementptr i32 addrspace(1)* %in, i32 1
54 %num = load i32 addrspace(1) * %in, align 4
55 %den = load i32 addrspace(1) * %den_ptr, align 4
56 %num.i24.0 = shl i32 %num, 8
57 %den.i24.0 = shl i32 %den, 8
58 %num.i24 = lshr i32 %num.i24.0, 8
59 %den.i24 = lshr i32 %den.i24.0, 8
60 %result = udiv i32 %num.i24, %den.i24
61 store i32 %result, i32 addrspace(1)* %out, align 4
62 ret void
63}
64
65; FUNC-LABEL: @udiv25_i32
66; RCP_IFLAG is for URECIP in the full 32b alg
67; SI: V_RCP_IFLAG
68; SI-NOT: V_RCP_F32
69
70; EG-NOT: UINT_TO_FLT
71; EG-NOT: RECIP_IEEE
72define void @udiv25_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) {
73 %den_ptr = getelementptr i32 addrspace(1)* %in, i32 1
74 %num = load i32 addrspace(1) * %in, align 4
75 %den = load i32 addrspace(1) * %den_ptr, align 4
76 %num.i24.0 = shl i32 %num, 7
77 %den.i24.0 = shl i32 %den, 7
78 %num.i24 = lshr i32 %num.i24.0, 7
79 %den.i24 = lshr i32 %den.i24.0, 7
80 %result = udiv i32 %num.i24, %den.i24
81 store i32 %result, i32 addrspace(1)* %out, align 4
82 ret void
83}
84
85; FUNC-LABEL: @test_no_udiv24_i32_1
86; RCP_IFLAG is for URECIP in the full 32b alg
87; SI: V_RCP_IFLAG
88; SI-NOT: V_RCP_F32
89
90; EG-NOT: UINT_TO_FLT
91; EG-NOT: RECIP_IEEE
92define void @test_no_udiv24_i32_1(i32 addrspace(1)* %out, i32 addrspace(1)* %in) {
93 %den_ptr = getelementptr i32 addrspace(1)* %in, i32 1
94 %num = load i32 addrspace(1) * %in, align 4
95 %den = load i32 addrspace(1) * %den_ptr, align 4
96 %num.i24.0 = shl i32 %num, 8
97 %den.i24.0 = shl i32 %den, 7
98 %num.i24 = lshr i32 %num.i24.0, 8
99 %den.i24 = lshr i32 %den.i24.0, 7
100 %result = udiv i32 %num.i24, %den.i24
101 store i32 %result, i32 addrspace(1)* %out, align 4
102 ret void
103}
104
105; FUNC-LABEL: @test_no_udiv24_i32_2
106; RCP_IFLAG is for URECIP in the full 32b alg
107; SI: V_RCP_IFLAG
108; SI-NOT: V_RCP_F32
109
110; EG-NOT: UINT_TO_FLT
111; EG-NOT: RECIP_IEEE
112define void @test_no_udiv24_i32_2(i32 addrspace(1)* %out, i32 addrspace(1)* %in) {
113 %den_ptr = getelementptr i32 addrspace(1)* %in, i32 1
114 %num = load i32 addrspace(1) * %in, align 4
115 %den = load i32 addrspace(1) * %den_ptr, align 4
116 %num.i24.0 = shl i32 %num, 7
117 %den.i24.0 = shl i32 %den, 8
118 %num.i24 = lshr i32 %num.i24.0, 7
119 %den.i24 = lshr i32 %den.i24.0, 8
120 %result = udiv i32 %num.i24, %den.i24
121 store i32 %result, i32 addrspace(1)* %out, align 4
122 ret void
123}
124
125; FUNC-LABEL: @urem24_i8
126; SI: V_CVT_F32_UBYTE
127; SI: V_CVT_F32_UBYTE
128; SI: V_RCP_F32
129; SI: V_CVT_U32_F32
130
131; EG: UINT_TO_FLT
132; EG-DAG: UINT_TO_FLT
133; EG-DAG: RECIP_IEEE
134; EG: FLT_TO_UINT
135define void @urem24_i8(i8 addrspace(1)* %out, i8 addrspace(1)* %in) {
136 %den_ptr = getelementptr i8 addrspace(1)* %in, i8 1
137 %num = load i8 addrspace(1) * %in
138 %den = load i8 addrspace(1) * %den_ptr
139 %result = urem i8 %num, %den
140 store i8 %result, i8 addrspace(1)* %out
141 ret void
142}
143
144; FUNC-LABEL: @urem24_i16
145; SI: V_CVT_F32_U32
146; SI: V_CVT_F32_U32
147; SI: V_RCP_F32
148; SI: V_CVT_U32_F32
149
150; EG: UINT_TO_FLT
151; EG-DAG: UINT_TO_FLT
152; EG-DAG: RECIP_IEEE
153; EG: FLT_TO_UINT
154define void @urem24_i16(i16 addrspace(1)* %out, i16 addrspace(1)* %in) {
155 %den_ptr = getelementptr i16 addrspace(1)* %in, i16 1
156 %num = load i16 addrspace(1) * %in, align 2
157 %den = load i16 addrspace(1) * %den_ptr, align 2
158 %result = urem i16 %num, %den
159 store i16 %result, i16 addrspace(1)* %out, align 2
160 ret void
161}
162
163; FUNC-LABEL: @urem24_i32
164; SI: V_CVT_F32_U32
165; SI: V_CVT_F32_U32
166; SI: V_RCP_F32
167; SI: V_CVT_U32_F32
168
169; EG: UINT_TO_FLT
170; EG-DAG: UINT_TO_FLT
171; EG-DAG: RECIP_IEEE
172; EG: FLT_TO_UINT
173define void @urem24_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) {
174 %den_ptr = getelementptr i32 addrspace(1)* %in, i32 1
175 %num = load i32 addrspace(1) * %in, align 4
176 %den = load i32 addrspace(1) * %den_ptr, align 4
177 %num.i24.0 = shl i32 %num, 8
178 %den.i24.0 = shl i32 %den, 8
179 %num.i24 = lshr i32 %num.i24.0, 8
180 %den.i24 = lshr i32 %den.i24.0, 8
181 %result = urem i32 %num.i24, %den.i24
182 store i32 %result, i32 addrspace(1)* %out, align 4
183 ret void
184}
185
186; FUNC-LABEL: @urem25_i32
187; RCP_IFLAG is for URECIP in the full 32b alg
188; SI: V_RCP_IFLAG
189; SI-NOT: V_RCP_F32
190
191; EG-NOT: UINT_TO_FLT
192; EG-NOT: RECIP_IEEE
193define void @urem25_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) {
194 %den_ptr = getelementptr i32 addrspace(1)* %in, i32 1
195 %num = load i32 addrspace(1) * %in, align 4
196 %den = load i32 addrspace(1) * %den_ptr, align 4
197 %num.i24.0 = shl i32 %num, 7
198 %den.i24.0 = shl i32 %den, 7
199 %num.i24 = lshr i32 %num.i24.0, 7
200 %den.i24 = lshr i32 %den.i24.0, 7
201 %result = urem i32 %num.i24, %den.i24
202 store i32 %result, i32 addrspace(1)* %out, align 4
203 ret void
204}
205
206; FUNC-LABEL: @test_no_urem24_i32_1
207; RCP_IFLAG is for URECIP in the full 32b alg
208; SI: V_RCP_IFLAG
209; SI-NOT: V_RCP_F32
210
211; EG-NOT: UINT_TO_FLT
212; EG-NOT: RECIP_IEEE
213define void @test_no_urem24_i32_1(i32 addrspace(1)* %out, i32 addrspace(1)* %in) {
214 %den_ptr = getelementptr i32 addrspace(1)* %in, i32 1
215 %num = load i32 addrspace(1) * %in, align 4
216 %den = load i32 addrspace(1) * %den_ptr, align 4
217 %num.i24.0 = shl i32 %num, 8
218 %den.i24.0 = shl i32 %den, 7
219 %num.i24 = lshr i32 %num.i24.0, 8
220 %den.i24 = lshr i32 %den.i24.0, 7
221 %result = urem i32 %num.i24, %den.i24
222 store i32 %result, i32 addrspace(1)* %out, align 4
223 ret void
224}
225
226; FUNC-LABEL: @test_no_urem24_i32_2
227; RCP_IFLAG is for URECIP in the full 32b alg
228; SI: V_RCP_IFLAG
229; SI-NOT: V_RCP_F32
230
231; EG-NOT: UINT_TO_FLT
232; EG-NOT: RECIP_IEEE
233define void @test_no_urem24_i32_2(i32 addrspace(1)* %out, i32 addrspace(1)* %in) {
234 %den_ptr = getelementptr i32 addrspace(1)* %in, i32 1
235 %num = load i32 addrspace(1) * %in, align 4
236 %den = load i32 addrspace(1) * %den_ptr, align 4
237 %num.i24.0 = shl i32 %num, 7
238 %den.i24.0 = shl i32 %den, 8
239 %num.i24 = lshr i32 %num.i24.0, 7
240 %den.i24 = lshr i32 %den.i24.0, 8
241 %result = urem i32 %num.i24, %den.i24
242 store i32 %result, i32 addrspace(1)* %out, align 4
243 ret void
244}