R600: Add dag combine for BFE
[oota-llvm.git] / test / CodeGen / R600 / llvm.AMDGPU.bfe.i32.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 -show-mc-encoding -verify-machineinstrs < %s | FileCheck -check-prefix=EG -check-prefix=FUNC %s
3
4 declare i32 @llvm.AMDGPU.bfe.i32(i32, i32, i32) nounwind readnone
5
6 ; FUNC-LABEL: @bfe_i32_arg_arg_arg
7 ; SI: V_BFE_I32
8 ; EG: BFE_INT
9 ; EG: encoding: [{{[x0-9a-f]+,[x0-9a-f]+,[x0-9a-f]+,[x0-9a-f]+,[x0-9a-f]+}},0xac
10 define void @bfe_i32_arg_arg_arg(i32 addrspace(1)* %out, i32 %src0, i32 %src1, i32 %src2) nounwind {
11   %bfe_i32 = call i32 @llvm.AMDGPU.bfe.i32(i32 %src0, i32 %src1, i32 %src1) nounwind readnone
12   store i32 %bfe_i32, i32 addrspace(1)* %out, align 4
13   ret void
14 }
15
16 ; FUNC-LABEL: @bfe_i32_arg_arg_imm
17 ; SI: V_BFE_I32
18 ; EG: BFE_INT
19 define void @bfe_i32_arg_arg_imm(i32 addrspace(1)* %out, i32 %src0, i32 %src1) nounwind {
20   %bfe_i32 = call i32 @llvm.AMDGPU.bfe.i32(i32 %src0, i32 %src1, i32 123) nounwind readnone
21   store i32 %bfe_i32, i32 addrspace(1)* %out, align 4
22   ret void
23 }
24
25 ; FUNC-LABEL: @bfe_i32_arg_imm_arg
26 ; SI: V_BFE_I32
27 ; EG: BFE_INT
28 define void @bfe_i32_arg_imm_arg(i32 addrspace(1)* %out, i32 %src0, i32 %src2) nounwind {
29   %bfe_i32 = call i32 @llvm.AMDGPU.bfe.i32(i32 %src0, i32 123, i32 %src2) nounwind readnone
30   store i32 %bfe_i32, i32 addrspace(1)* %out, align 4
31   ret void
32 }
33
34 ; FUNC-LABEL: @bfe_i32_imm_arg_arg
35 ; SI: V_BFE_I32
36 ; EG: BFE_INT
37 define void @bfe_i32_imm_arg_arg(i32 addrspace(1)* %out, i32 %src1, i32 %src2) nounwind {
38   %bfe_i32 = call i32 @llvm.AMDGPU.bfe.i32(i32 123, i32 %src1, i32 %src2) nounwind readnone
39   store i32 %bfe_i32, i32 addrspace(1)* %out, align 4
40   ret void
41 }
42
43 ; FUNC-LABEL: @v_bfe_print_arg
44 ; SI: V_BFE_I32 v{{[0-9]+}}, v{{[0-9]+}}, 2, 8
45 define void @v_bfe_print_arg(i32 addrspace(1)* %out, i32 addrspace(1)* %src0) nounwind {
46   %load = load i32 addrspace(1)* %src0, align 4
47   %bfe_i32 = call i32 @llvm.AMDGPU.bfe.i32(i32 %load, i32 2, i32 8) nounwind readnone
48   store i32 %bfe_i32, i32 addrspace(1)* %out, align 4
49   ret void
50 }
51
52 ; FUNC-LABEL: @bfe_i32_arg_0_width_reg_offset
53 ; SI-NOT: BFE
54 ; SI: S_ENDPGM
55 ; EG-NOT: BFE
56 define void @bfe_i32_arg_0_width_reg_offset(i32 addrspace(1)* %out, i32 %src0, i32 %src1) nounwind {
57   %bfe_u32 = call i32 @llvm.AMDGPU.bfe.i32(i32 %src0, i32 %src1, i32 0) nounwind readnone
58   store i32 %bfe_u32, i32 addrspace(1)* %out, align 4
59   ret void
60 }
61
62 ; FUNC-LABEL: @bfe_i32_arg_0_width_imm_offset
63 ; SI-NOT: BFE
64 ; SI: S_ENDPGM
65 ; EG-NOT: BFE
66 define void @bfe_i32_arg_0_width_imm_offset(i32 addrspace(1)* %out, i32 %src0, i32 %src1) nounwind {
67   %bfe_u32 = call i32 @llvm.AMDGPU.bfe.i32(i32 %src0, i32 8, i32 0) nounwind readnone
68   store i32 %bfe_u32, i32 addrspace(1)* %out, align 4
69   ret void
70 }
71
72 ; FUNC-LABEL: @bfe_i32_constant_fold_test_0
73 ; SI-NOT: BFE
74 ; SI: V_MOV_B32_e32 [[VREG:v[0-9]+]], 0
75 ; SI: BUFFER_STORE_DWORD [[VREG]],
76 ; SI: S_ENDPGM
77 ; EG-NOT: BFE
78 define void @bfe_i32_constant_fold_test_0(i32 addrspace(1)* %out) nounwind {
79   %bfe_i32 = call i32 @llvm.AMDGPU.bfe.i32(i32 0, i32 0, i32 0) nounwind readnone
80   store i32 %bfe_i32, i32 addrspace(1)* %out, align 4
81   ret void
82 }
83
84 ; FUNC-LABEL: @bfe_i32_constant_fold_test_1
85 ; SI-NOT: BFE
86 ; SI: V_MOV_B32_e32 [[VREG:v[0-9]+]], 0
87 ; SI: BUFFER_STORE_DWORD [[VREG]],
88 ; SI: S_ENDPGM
89 ; EG-NOT: BFE
90 define void @bfe_i32_constant_fold_test_1(i32 addrspace(1)* %out) nounwind {
91   %bfe_i32 = call i32 @llvm.AMDGPU.bfe.i32(i32 12334, i32 0, i32 0) nounwind readnone
92   store i32 %bfe_i32, i32 addrspace(1)* %out, align 4
93   ret void
94 }
95
96 ; FUNC-LABEL: @bfe_i32_constant_fold_test_2
97 ; SI-NOT: BFE
98 ; SI: V_MOV_B32_e32 [[VREG:v[0-9]+]], 0
99 ; SI: BUFFER_STORE_DWORD [[VREG]],
100 ; SI: S_ENDPGM
101 ; EG-NOT: BFE
102 define void @bfe_i32_constant_fold_test_2(i32 addrspace(1)* %out) nounwind {
103   %bfe_i32 = call i32 @llvm.AMDGPU.bfe.i32(i32 0, i32 0, i32 1) nounwind readnone
104   store i32 %bfe_i32, i32 addrspace(1)* %out, align 4
105   ret void
106 }
107
108 ; FUNC-LABEL: @bfe_i32_constant_fold_test_3
109 ; SI-NOT: BFE
110 ; SI: V_MOV_B32_e32 [[VREG:v[0-9]+]], -1
111 ; SI: BUFFER_STORE_DWORD [[VREG]],
112 ; SI: S_ENDPGM
113 ; EG-NOT: BFE
114 define void @bfe_i32_constant_fold_test_3(i32 addrspace(1)* %out) nounwind {
115   %bfe_i32 = call i32 @llvm.AMDGPU.bfe.i32(i32 1, i32 0, i32 1) nounwind readnone
116   store i32 %bfe_i32, i32 addrspace(1)* %out, align 4
117   ret void
118 }
119
120 ; FUNC-LABEL: @bfe_i32_constant_fold_test_4
121 ; SI-NOT: BFE
122 ; SI: V_MOV_B32_e32 [[VREG:v[0-9]+]], -1
123 ; SI: BUFFER_STORE_DWORD [[VREG]],
124 ; SI: S_ENDPGM
125 ; EG-NOT: BFE
126 define void @bfe_i32_constant_fold_test_4(i32 addrspace(1)* %out) nounwind {
127   %bfe_i32 = call i32 @llvm.AMDGPU.bfe.i32(i32 4294967295, i32 0, i32 1) nounwind readnone
128   store i32 %bfe_i32, i32 addrspace(1)* %out, align 4
129   ret void
130 }
131
132 ; FUNC-LABEL: @bfe_i32_constant_fold_test_5
133 ; SI-NOT: BFE
134 ; SI: V_MOV_B32_e32 [[VREG:v[0-9]+]], -1
135 ; SI: BUFFER_STORE_DWORD [[VREG]],
136 ; SI: S_ENDPGM
137 ; EG-NOT: BFE
138 define void @bfe_i32_constant_fold_test_5(i32 addrspace(1)* %out) nounwind {
139   %bfe_i32 = call i32 @llvm.AMDGPU.bfe.i32(i32 128, i32 7, i32 1) nounwind readnone
140   store i32 %bfe_i32, i32 addrspace(1)* %out, align 4
141   ret void
142 }
143
144 ; FUNC-LABEL: @bfe_i32_constant_fold_test_6
145 ; SI-NOT: BFE
146 ; SI: V_MOV_B32_e32 [[VREG:v[0-9]+]], 0xffffff80
147 ; SI: BUFFER_STORE_DWORD [[VREG]],
148 ; SI: S_ENDPGM
149 ; EG-NOT: BFE
150 define void @bfe_i32_constant_fold_test_6(i32 addrspace(1)* %out) nounwind {
151   %bfe_i32 = call i32 @llvm.AMDGPU.bfe.i32(i32 128, i32 0, i32 8) nounwind readnone
152   store i32 %bfe_i32, i32 addrspace(1)* %out, align 4
153   ret void
154 }
155
156 ; FUNC-LABEL: @bfe_i32_constant_fold_test_7
157 ; SI-NOT: BFE
158 ; SI: V_MOV_B32_e32 [[VREG:v[0-9]+]], 0x7f
159 ; SI: BUFFER_STORE_DWORD [[VREG]],
160 ; SI: S_ENDPGM
161 ; EG-NOT: BFE
162 define void @bfe_i32_constant_fold_test_7(i32 addrspace(1)* %out) nounwind {
163   %bfe_i32 = call i32 @llvm.AMDGPU.bfe.i32(i32 127, i32 0, i32 8) nounwind readnone
164   store i32 %bfe_i32, i32 addrspace(1)* %out, align 4
165   ret void
166 }
167
168 ; FUNC-LABEL: @bfe_i32_constant_fold_test_8
169 ; SI-NOT: BFE
170 ; SI: V_MOV_B32_e32 [[VREG:v[0-9]+]], 1
171 ; SI: BUFFER_STORE_DWORD [[VREG]],
172 ; SI: S_ENDPGM
173 ; EG-NOT: BFE
174 define void @bfe_i32_constant_fold_test_8(i32 addrspace(1)* %out) nounwind {
175   %bfe_i32 = call i32 @llvm.AMDGPU.bfe.i32(i32 127, i32 6, i32 8) nounwind readnone
176   store i32 %bfe_i32, i32 addrspace(1)* %out, align 4
177   ret void
178 }
179
180 ; FUNC-LABEL: @bfe_i32_constant_fold_test_9
181 ; SI-NOT: BFE
182 ; SI: V_MOV_B32_e32 [[VREG:v[0-9]+]], 1
183 ; SI: BUFFER_STORE_DWORD [[VREG]],
184 ; SI: S_ENDPGM
185 ; EG-NOT: BFE
186 define void @bfe_i32_constant_fold_test_9(i32 addrspace(1)* %out) nounwind {
187   %bfe_i32 = call i32 @llvm.AMDGPU.bfe.i32(i32 65536, i32 16, i32 8) nounwind readnone
188   store i32 %bfe_i32, i32 addrspace(1)* %out, align 4
189   ret void
190 }
191
192 ; FUNC-LABEL: @bfe_i32_constant_fold_test_10
193 ; SI-NOT: BFE
194 ; SI: V_MOV_B32_e32 [[VREG:v[0-9]+]], 0
195 ; SI: BUFFER_STORE_DWORD [[VREG]],
196 ; SI: S_ENDPGM
197 ; EG-NOT: BFE
198 define void @bfe_i32_constant_fold_test_10(i32 addrspace(1)* %out) nounwind {
199   %bfe_i32 = call i32 @llvm.AMDGPU.bfe.i32(i32 65535, i32 16, i32 16) nounwind readnone
200   store i32 %bfe_i32, i32 addrspace(1)* %out, align 4
201   ret void
202 }
203
204 ; FUNC-LABEL: @bfe_i32_constant_fold_test_11
205 ; SI-NOT: BFE
206 ; SI: V_MOV_B32_e32 [[VREG:v[0-9]+]], -6
207 ; SI: BUFFER_STORE_DWORD [[VREG]],
208 ; SI: S_ENDPGM
209 ; EG-NOT: BFE
210 define void @bfe_i32_constant_fold_test_11(i32 addrspace(1)* %out) nounwind {
211   %bfe_i32 = call i32 @llvm.AMDGPU.bfe.i32(i32 160, i32 4, i32 4) nounwind readnone
212   store i32 %bfe_i32, i32 addrspace(1)* %out, align 4
213   ret void
214 }
215
216 ; FUNC-LABEL: @bfe_i32_constant_fold_test_12
217 ; SI-NOT: BFE
218 ; SI: V_MOV_B32_e32 [[VREG:v[0-9]+]], 0
219 ; SI: BUFFER_STORE_DWORD [[VREG]],
220 ; SI: S_ENDPGM
221 ; EG-NOT: BFE
222 define void @bfe_i32_constant_fold_test_12(i32 addrspace(1)* %out) nounwind {
223   %bfe_i32 = call i32 @llvm.AMDGPU.bfe.i32(i32 160, i32 31, i32 1) nounwind readnone
224   store i32 %bfe_i32, i32 addrspace(1)* %out, align 4
225   ret void
226 }
227
228 ; FUNC-LABEL: @bfe_i32_constant_fold_test_13
229 ; SI-NOT: BFE
230 ; SI: V_MOV_B32_e32 [[VREG:v[0-9]+]], 1
231 ; SI: BUFFER_STORE_DWORD [[VREG]],
232 ; SI: S_ENDPGM
233 ; EG-NOT: BFE
234 define void @bfe_i32_constant_fold_test_13(i32 addrspace(1)* %out) nounwind {
235   %bfe_i32 = call i32 @llvm.AMDGPU.bfe.i32(i32 131070, i32 16, i32 16) nounwind readnone
236   store i32 %bfe_i32, i32 addrspace(1)* %out, align 4
237   ret void
238 }
239
240 ; FUNC-LABEL: @bfe_i32_constant_fold_test_14
241 ; SI-NOT: BFE
242 ; SI: V_MOV_B32_e32 [[VREG:v[0-9]+]], 40
243 ; SI: BUFFER_STORE_DWORD [[VREG]],
244 ; SI: S_ENDPGM
245 ; EG-NOT: BFE
246 define void @bfe_i32_constant_fold_test_14(i32 addrspace(1)* %out) nounwind {
247   %bfe_i32 = call i32 @llvm.AMDGPU.bfe.i32(i32 160, i32 2, i32 30) nounwind readnone
248   store i32 %bfe_i32, i32 addrspace(1)* %out, align 4
249   ret void
250 }
251
252 ; FUNC-LABEL: @bfe_i32_constant_fold_test_15
253 ; SI-NOT: BFE
254 ; SI: V_MOV_B32_e32 [[VREG:v[0-9]+]], 10
255 ; SI: BUFFER_STORE_DWORD [[VREG]],
256 ; SI: S_ENDPGM
257 ; EG-NOT: BFE
258 define void @bfe_i32_constant_fold_test_15(i32 addrspace(1)* %out) nounwind {
259   %bfe_i32 = call i32 @llvm.AMDGPU.bfe.i32(i32 160, i32 4, i32 28) nounwind readnone
260   store i32 %bfe_i32, i32 addrspace(1)* %out, align 4
261   ret void
262 }
263
264 ; FUNC-LABEL: @bfe_i32_constant_fold_test_16
265 ; SI-NOT: BFE
266 ; SI: V_MOV_B32_e32 [[VREG:v[0-9]+]], -1
267 ; SI: BUFFER_STORE_DWORD [[VREG]],
268 ; SI: S_ENDPGM
269 ; EG-NOT: BFE
270 define void @bfe_i32_constant_fold_test_16(i32 addrspace(1)* %out) nounwind {
271   %bfe_i32 = call i32 @llvm.AMDGPU.bfe.i32(i32 4294967295, i32 1, i32 7) nounwind readnone
272   store i32 %bfe_i32, i32 addrspace(1)* %out, align 4
273   ret void
274 }
275
276 ; FUNC-LABEL: @bfe_i32_constant_fold_test_17
277 ; SI-NOT: BFE
278 ; SI: V_MOV_B32_e32 [[VREG:v[0-9]+]], 0x7f
279 ; SI: BUFFER_STORE_DWORD [[VREG]],
280 ; SI: S_ENDPGM
281 ; EG-NOT: BFE
282 define void @bfe_i32_constant_fold_test_17(i32 addrspace(1)* %out) nounwind {
283   %bfe_i32 = call i32 @llvm.AMDGPU.bfe.i32(i32 255, i32 1, i32 31) nounwind readnone
284   store i32 %bfe_i32, i32 addrspace(1)* %out, align 4
285   ret void
286 }
287
288 ; FUNC-LABEL: @bfe_i32_constant_fold_test_18
289 ; SI-NOT: BFE
290 ; SI: V_MOV_B32_e32 [[VREG:v[0-9]+]], 0
291 ; SI: BUFFER_STORE_DWORD [[VREG]],
292 ; SI: S_ENDPGM
293 ; EG-NOT: BFE
294 define void @bfe_i32_constant_fold_test_18(i32 addrspace(1)* %out) nounwind {
295   %bfe_i32 = call i32 @llvm.AMDGPU.bfe.i32(i32 255, i32 31, i32 1) nounwind readnone
296   store i32 %bfe_i32, i32 addrspace(1)* %out, align 4
297   ret void
298 }