191ab7a4cf203f60448854009586f1cb7d265847
[oota-llvm.git] / test / CodeGen / R600 / udivrem24.ll
1 ; 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
14 define 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
33 define 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
52 define 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
72 define 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
92 define 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
112 define 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
135 define 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
154 define 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
173 define 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
193 define 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
213 define 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
233 define 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 }