R600: Try to use lower types for 64bit division if possible
[oota-llvm.git] / test / CodeGen / R600 / sdivrem64.ll
1 ;RUN: llc -march=r600 -mcpu=SI -verify-machineinstrs < %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: {{^}}test_sdiv:
5 ;EG: RECIP_UINT
6 ;EG: LSHL {{.*}}, 1,
7 ;EG: BFE_UINT
8 ;EG: BFE_UINT
9 ;EG: BFE_UINT
10 ;EG: BFE_UINT
11 ;EG: BFE_UINT
12 ;EG: BFE_UINT
13 ;EG: BFE_UINT
14 ;EG: BFE_UINT
15 ;EG: BFE_UINT
16 ;EG: BFE_UINT
17 ;EG: BFE_UINT
18 ;EG: BFE_UINT
19 ;EG: BFE_UINT
20 ;EG: BFE_UINT
21 ;EG: BFE_UINT
22 ;EG: BFE_UINT
23 ;EG: BFE_UINT
24 ;EG: BFE_UINT
25 ;EG: BFE_UINT
26 ;EG: BFE_UINT
27 ;EG: BFE_UINT
28 ;EG: BFE_UINT
29 ;EG: BFE_UINT
30 ;EG: BFE_UINT
31 ;EG: BFE_UINT
32 ;EG: BFE_UINT
33 ;EG: BFE_UINT
34 ;EG: BFE_UINT
35 ;EG: BFE_UINT
36 ;EG: BFE_UINT
37
38 ;SI: v_bfe_u32
39 ;SI: v_bfe_u32
40 ;SI: v_bfe_u32
41 ;SI: v_bfe_u32
42 ;SI: v_bfe_u32
43 ;SI: v_bfe_u32
44 ;SI: v_bfe_u32
45 ;SI: v_bfe_u32
46 ;SI: v_bfe_u32
47 ;SI: v_bfe_u32
48 ;SI: v_bfe_u32
49 ;SI: v_bfe_u32
50 ;SI: v_bfe_u32
51 ;SI: v_bfe_u32
52 ;SI: v_bfe_u32
53 ;SI: v_bfe_u32
54 ;SI: v_bfe_u32
55 ;SI: v_bfe_u32
56 ;SI: v_bfe_u32
57 ;SI: v_bfe_u32
58 ;SI: v_bfe_u32
59 ;SI: v_bfe_u32
60 ;SI: v_bfe_u32
61 ;SI: v_bfe_u32
62 ;SI: v_bfe_u32
63 ;SI: v_bfe_u32
64 ;SI: v_bfe_u32
65 ;SI: v_bfe_u32
66 ;SI: v_bfe_u32
67 ;SI: v_bfe_u32
68 ;SI-NOT: v_mad_f32
69 ;SI-NOT: v_lshr_64
70 ;SI: s_endpgm
71 define void @test_sdiv(i64 addrspace(1)* %out, i64 %x, i64 %y) {
72   %result = sdiv i64 %x, %y
73   store i64 %result, i64 addrspace(1)* %out
74   ret void
75 }
76
77 ;FUNC-LABEL: {{^}}test_srem:
78 ;EG: RECIP_UINT
79 ;EG: BFE_UINT
80 ;EG: BFE_UINT
81 ;EG: BFE_UINT
82 ;EG: BFE_UINT
83 ;EG: BFE_UINT
84 ;EG: BFE_UINT
85 ;EG: BFE_UINT
86 ;EG: BFE_UINT
87 ;EG: BFE_UINT
88 ;EG: BFE_UINT
89 ;EG: BFE_UINT
90 ;EG: BFE_UINT
91 ;EG: BFE_UINT
92 ;EG: BFE_UINT
93 ;EG: BFE_UINT
94 ;EG: BFE_UINT
95 ;EG: BFE_UINT
96 ;EG: BFE_UINT
97 ;EG: BFE_UINT
98 ;EG: BFE_UINT
99 ;EG: BFE_UINT
100 ;EG: BFE_UINT
101 ;EG: BFE_UINT
102 ;EG: BFE_UINT
103 ;EG: BFE_UINT
104 ;EG: BFE_UINT
105 ;EG: BFE_UINT
106 ;EG: BFE_UINT
107 ;EG: BFE_UINT
108 ;EG: BFE_UINT
109 ;EG: AND_INT {{.*}}, 1,
110
111 ;SI: s_bfe_u32
112 ;SI: s_bfe_u32
113 ;SI: s_bfe_u32
114 ;SI: s_bfe_u32
115 ;SI: s_bfe_u32
116 ;SI: s_bfe_u32
117 ;SI: s_bfe_u32
118 ;SI: s_bfe_u32
119 ;SI: s_bfe_u32
120 ;SI: s_bfe_u32
121 ;SI: s_bfe_u32
122 ;SI: s_bfe_u32
123 ;SI: s_bfe_u32
124 ;SI: s_bfe_u32
125 ;SI: s_bfe_u32
126 ;SI: s_bfe_u32
127 ;SI: s_bfe_u32
128 ;SI: s_bfe_u32
129 ;SI: s_bfe_u32
130 ;SI: s_bfe_u32
131 ;SI: s_bfe_u32
132 ;SI: s_bfe_u32
133 ;SI: s_bfe_u32
134 ;SI: s_bfe_u32
135 ;SI: s_bfe_u32
136 ;SI: s_bfe_u32
137 ;SI: s_bfe_u32
138 ;SI: s_bfe_u32
139 ;SI: s_bfe_u32
140 ;SI: s_bfe_u32
141 ;SI-NOT: v_mad_f32
142 ;SI-NOT: v_lshr_64
143 ;SI: s_endpgm
144 define void @test_srem(i64 addrspace(1)* %out, i64 %x, i64 %y) {
145   %result = urem i64 %x, %y
146   store i64 %result, i64 addrspace(1)* %out
147   ret void
148 }
149
150 ;FUNC-LABEL: {{^}}test_sdiv3264:
151 ;EG: RECIP_UINT
152 ;EG-NOT: BFE_UINT
153
154 ;SI-NOT: s_bfe_u32
155 ;SI-NOT: v_mad_f32
156 ;SI-NOT: v_lshr_64
157 ;SI: s_endpgm
158 define void @test_sdiv3264(i64 addrspace(1)* %out, i64 %x, i64 %y) {
159   %1 = ashr i64 %x, 33
160   %2 = ashr i64 %y, 33
161   %result = sdiv i64 %1, %2
162   store i64 %result, i64 addrspace(1)* %out
163   ret void
164 }
165
166 ;FUNC-LABEL: {{^}}test_srem3264:
167 ;EG: RECIP_UINT
168 ;EG-NOT: BFE_UINT
169
170 ;SI-NOT: s_bfe_u32
171 ;SI-NOT: v_mad_f32
172 ;SI-NOT: v_lshr_64
173 ;SI: s_endpgm
174 define void @test_srem3264(i64 addrspace(1)* %out, i64 %x, i64 %y) {
175   %1 = ashr i64 %x, 33
176   %2 = ashr i64 %y, 33
177   %result = srem i64 %1, %2
178   store i64 %result, i64 addrspace(1)* %out
179   ret void
180 }
181
182 ;FUNC-LABEL: {{^}}test_sdiv2464:
183 ;EG: INT_TO_FLT
184 ;EG: INT_TO_FLT
185 ;EG: FLT_TO_INT
186 ;EG-NOT: RECIP_UINT
187 ;EG-NOT: BFE_UINT
188
189 ;SI-NOT: s_bfe_u32
190 ;SI: v_mad_f32
191 ;SI-NOT: v_lshr_64
192 ;SI: s_endpgm
193 define void @test_sdiv2464(i64 addrspace(1)* %out, i64 %x, i64 %y) {
194   %1 = ashr i64 %x, 40
195   %2 = ashr i64 %y, 40
196   %result = sdiv i64 %1, %2
197   store i64 %result, i64 addrspace(1)* %out
198   ret void
199 }
200
201 ;FUNC-LABEL: {{^}}test_srem2464:
202 ;EG: INT_TO_FLT
203 ;EG: INT_TO_FLT
204 ;EG: FLT_TO_INT
205 ;EG-NOT: RECIP_UINT
206 ;EG-NOT: BFE_UINT
207
208 ;SI-NOT: s_bfe_u32
209 ;SI: v_mad_f32
210 ;SI-NOT: v_lshr_64
211 ;SI: s_endpgm
212 define void @test_srem2464(i64 addrspace(1)* %out, i64 %x, i64 %y) {
213   %1 = ashr i64 %x, 40
214   %2 = ashr i64 %y, 40
215   %result = srem i64 %1, %2
216   store i64 %result, i64 addrspace(1)* %out
217   ret void
218 }