blob: 1d239af7aa4517ecde2e7d740c75fcda51ca6541 [file] [log] [blame]
Matt Arsenault4c537172014-03-31 18:21:18 +00001; RUN: llc -march=r600 -mcpu=SI -verify-machineinstrs < %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s
2; RUN: llc -march=r600 -mcpu=redwood -verify-machineinstrs < %s | FileCheck -check-prefix=EG -check-prefix=FUNC %s
3
4declare i32 @llvm.AMDGPU.bfe.u32(i32, i32, i32) nounwind readnone
5
Tom Stellard79243d92014-10-01 17:15:17 +00006; FUNC-LABEL: {{^}}bfe_u32_arg_arg_arg:
Matt Arsenault4c537172014-03-31 18:21:18 +00007; SI: V_BFE_U32
8; EG: BFE_UINT
9define void @bfe_u32_arg_arg_arg(i32 addrspace(1)* %out, i32 %src0, i32 %src1, i32 %src2) nounwind {
10 %bfe_u32 = call i32 @llvm.AMDGPU.bfe.u32(i32 %src0, i32 %src1, i32 %src1) nounwind readnone
11 store i32 %bfe_u32, i32 addrspace(1)* %out, align 4
12 ret void
13}
14
Tom Stellard79243d92014-10-01 17:15:17 +000015; FUNC-LABEL: {{^}}bfe_u32_arg_arg_imm:
Matt Arsenault4c537172014-03-31 18:21:18 +000016; SI: V_BFE_U32
17; EG: BFE_UINT
18define void @bfe_u32_arg_arg_imm(i32 addrspace(1)* %out, i32 %src0, i32 %src1) nounwind {
19 %bfe_u32 = call i32 @llvm.AMDGPU.bfe.u32(i32 %src0, i32 %src1, i32 123) nounwind readnone
20 store i32 %bfe_u32, i32 addrspace(1)* %out, align 4
21 ret void
22}
23
Tom Stellard79243d92014-10-01 17:15:17 +000024; FUNC-LABEL: {{^}}bfe_u32_arg_imm_arg:
Matt Arsenault4c537172014-03-31 18:21:18 +000025; SI: V_BFE_U32
26; EG: BFE_UINT
27define void @bfe_u32_arg_imm_arg(i32 addrspace(1)* %out, i32 %src0, i32 %src2) nounwind {
28 %bfe_u32 = call i32 @llvm.AMDGPU.bfe.u32(i32 %src0, i32 123, i32 %src2) nounwind readnone
29 store i32 %bfe_u32, i32 addrspace(1)* %out, align 4
30 ret void
31}
32
Tom Stellard79243d92014-10-01 17:15:17 +000033; FUNC-LABEL: {{^}}bfe_u32_imm_arg_arg:
Matt Arsenault4c537172014-03-31 18:21:18 +000034; SI: V_BFE_U32
35; EG: BFE_UINT
36define void @bfe_u32_imm_arg_arg(i32 addrspace(1)* %out, i32 %src1, i32 %src2) nounwind {
37 %bfe_u32 = call i32 @llvm.AMDGPU.bfe.u32(i32 123, i32 %src1, i32 %src2) nounwind readnone
38 store i32 %bfe_u32, i32 addrspace(1)* %out, align 4
39 ret void
40}
Matt Arsenault5565f65e2014-05-22 18:09:07 +000041
Tom Stellard79243d92014-10-01 17:15:17 +000042; FUNC-LABEL: {{^}}bfe_u32_arg_0_width_reg_offset:
Matt Arsenault5565f65e2014-05-22 18:09:07 +000043; SI-NOT: BFE
44; SI: S_ENDPGM
45; EG-NOT: BFE
46define void @bfe_u32_arg_0_width_reg_offset(i32 addrspace(1)* %out, i32 %src0, i32 %src1) nounwind {
47 %bfe_u32 = call i32 @llvm.AMDGPU.bfe.u32(i32 %src0, i32 %src1, i32 0) nounwind readnone
48 store i32 %bfe_u32, i32 addrspace(1)* %out, align 4
49 ret void
50}
51
Tom Stellard79243d92014-10-01 17:15:17 +000052; FUNC-LABEL: {{^}}bfe_u32_arg_0_width_imm_offset:
Matt Arsenault5565f65e2014-05-22 18:09:07 +000053; SI-NOT: BFE
54; SI: S_ENDPGM
55; EG-NOT: BFE
56define void @bfe_u32_arg_0_width_imm_offset(i32 addrspace(1)* %out, i32 %src0, i32 %src1) nounwind {
57 %bfe_u32 = call i32 @llvm.AMDGPU.bfe.u32(i32 %src0, i32 8, i32 0) nounwind readnone
58 store i32 %bfe_u32, i32 addrspace(1)* %out, align 4
59 ret void
60}
61
Tom Stellard79243d92014-10-01 17:15:17 +000062; FUNC-LABEL: {{^}}bfe_u32_zextload_i8:
Matt Arsenault5565f65e2014-05-22 18:09:07 +000063; SI: BUFFER_LOAD_UBYTE
64; SI-NOT: BFE
65; SI: S_ENDPGM
66define void @bfe_u32_zextload_i8(i32 addrspace(1)* %out, i8 addrspace(1)* %in) nounwind {
67 %load = load i8 addrspace(1)* %in
68 %ext = zext i8 %load to i32
69 %bfe = call i32 @llvm.AMDGPU.bfe.u32(i32 %ext, i32 0, i32 8)
70 store i32 %bfe, i32 addrspace(1)* %out, align 4
71 ret void
72}
73
Tom Stellard79243d92014-10-01 17:15:17 +000074; FUNC-LABEL: {{^}}bfe_u32_zext_in_reg_i8:
Matt Arsenault5565f65e2014-05-22 18:09:07 +000075; SI: BUFFER_LOAD_DWORD
76; SI: V_ADD_I32
77; SI-NEXT: V_AND_B32_e32
78; SI-NOT: BFE
79; SI: S_ENDPGM
80define void @bfe_u32_zext_in_reg_i8(i32 addrspace(1)* %out, i32 addrspace(1)* %in) nounwind {
81 %load = load i32 addrspace(1)* %in, align 4
82 %add = add i32 %load, 1
83 %ext = and i32 %add, 255
84 %bfe = call i32 @llvm.AMDGPU.bfe.u32(i32 %ext, i32 0, i32 8)
85 store i32 %bfe, i32 addrspace(1)* %out, align 4
86 ret void
87}
88
Tom Stellard79243d92014-10-01 17:15:17 +000089; FUNC-LABEL: {{^}}bfe_u32_zext_in_reg_i16:
Matt Arsenault5565f65e2014-05-22 18:09:07 +000090; SI: BUFFER_LOAD_DWORD
91; SI: V_ADD_I32
92; SI-NEXT: V_AND_B32_e32
93; SI-NOT: BFE
94; SI: S_ENDPGM
95define void @bfe_u32_zext_in_reg_i16(i32 addrspace(1)* %out, i32 addrspace(1)* %in) nounwind {
96 %load = load i32 addrspace(1)* %in, align 4
97 %add = add i32 %load, 1
98 %ext = and i32 %add, 65535
99 %bfe = call i32 @llvm.AMDGPU.bfe.u32(i32 %ext, i32 0, i32 16)
100 store i32 %bfe, i32 addrspace(1)* %out, align 4
101 ret void
102}
103
Tom Stellard79243d92014-10-01 17:15:17 +0000104; FUNC-LABEL: {{^}}bfe_u32_zext_in_reg_i8_offset_1:
Matt Arsenault5565f65e2014-05-22 18:09:07 +0000105; SI: BUFFER_LOAD_DWORD
106; SI: V_ADD_I32
107; SI: BFE
108; SI: S_ENDPGM
109define void @bfe_u32_zext_in_reg_i8_offset_1(i32 addrspace(1)* %out, i32 addrspace(1)* %in) nounwind {
110 %load = load i32 addrspace(1)* %in, align 4
111 %add = add i32 %load, 1
112 %ext = and i32 %add, 255
113 %bfe = call i32 @llvm.AMDGPU.bfe.u32(i32 %ext, i32 1, i32 8)
114 store i32 %bfe, i32 addrspace(1)* %out, align 4
115 ret void
116}
117
Tom Stellard79243d92014-10-01 17:15:17 +0000118; FUNC-LABEL: {{^}}bfe_u32_zext_in_reg_i8_offset_3:
Matt Arsenault5565f65e2014-05-22 18:09:07 +0000119; SI: BUFFER_LOAD_DWORD
120; SI: V_ADD_I32
121; SI-NEXT: V_AND_B32_e32 {{v[0-9]+}}, 0xf8
122; SI-NEXT: BFE
123; SI: S_ENDPGM
124define void @bfe_u32_zext_in_reg_i8_offset_3(i32 addrspace(1)* %out, i32 addrspace(1)* %in) nounwind {
125 %load = load i32 addrspace(1)* %in, align 4
126 %add = add i32 %load, 1
127 %ext = and i32 %add, 255
128 %bfe = call i32 @llvm.AMDGPU.bfe.u32(i32 %ext, i32 3, i32 8)
129 store i32 %bfe, i32 addrspace(1)* %out, align 4
130 ret void
131}
132
Tom Stellard79243d92014-10-01 17:15:17 +0000133; FUNC-LABEL: {{^}}bfe_u32_zext_in_reg_i8_offset_7:
Matt Arsenault5565f65e2014-05-22 18:09:07 +0000134; SI: BUFFER_LOAD_DWORD
135; SI: V_ADD_I32
136; SI-NEXT: V_AND_B32_e32 {{v[0-9]+}}, 0x80
137; SI-NEXT: BFE
138; SI: S_ENDPGM
139define void @bfe_u32_zext_in_reg_i8_offset_7(i32 addrspace(1)* %out, i32 addrspace(1)* %in) nounwind {
140 %load = load i32 addrspace(1)* %in, align 4
141 %add = add i32 %load, 1
142 %ext = and i32 %add, 255
143 %bfe = call i32 @llvm.AMDGPU.bfe.u32(i32 %ext, i32 7, i32 8)
144 store i32 %bfe, i32 addrspace(1)* %out, align 4
145 ret void
146}
147
Tom Stellard79243d92014-10-01 17:15:17 +0000148; FUNC-LABEL: {{^}}bfe_u32_zext_in_reg_i16_offset_8:
Matt Arsenault5565f65e2014-05-22 18:09:07 +0000149; SI: BUFFER_LOAD_DWORD
150; SI: V_ADD_I32
151; SI-NEXT: BFE
152; SI: S_ENDPGM
153define void @bfe_u32_zext_in_reg_i16_offset_8(i32 addrspace(1)* %out, i32 addrspace(1)* %in) nounwind {
154 %load = load i32 addrspace(1)* %in, align 4
155 %add = add i32 %load, 1
156 %ext = and i32 %add, 65535
157 %bfe = call i32 @llvm.AMDGPU.bfe.u32(i32 %ext, i32 8, i32 8)
158 store i32 %bfe, i32 addrspace(1)* %out, align 4
159 ret void
160}
161
Tom Stellard79243d92014-10-01 17:15:17 +0000162; FUNC-LABEL: {{^}}bfe_u32_test_1:
Matt Arsenault5565f65e2014-05-22 18:09:07 +0000163; SI: BUFFER_LOAD_DWORD
Matt Arsenault05e96f42014-05-22 18:09:12 +0000164; SI: V_AND_B32_e32 {{v[0-9]+}}, 1, {{v[0-9]+}}
Matt Arsenault5565f65e2014-05-22 18:09:07 +0000165; SI: S_ENDPGM
Matt Arsenault05e96f42014-05-22 18:09:12 +0000166; EG: AND_INT T{{[0-9]\.[XYZW]}}, T{{[0-9]\.[XYZW]}}, 1,
Matt Arsenault5565f65e2014-05-22 18:09:07 +0000167define void @bfe_u32_test_1(i32 addrspace(1)* %out, i32 addrspace(1)* %in) nounwind {
168 %x = load i32 addrspace(1)* %in, align 4
169 %bfe = call i32 @llvm.AMDGPU.bfe.u32(i32 %x, i32 0, i32 1)
170 store i32 %bfe, i32 addrspace(1)* %out, align 4
171 ret void
172}
173
174define void @bfe_u32_test_2(i32 addrspace(1)* %out, i32 addrspace(1)* %in) nounwind {
175 %x = load i32 addrspace(1)* %in, align 4
176 %shl = shl i32 %x, 31
177 %bfe = call i32 @llvm.AMDGPU.bfe.u32(i32 %shl, i32 0, i32 8)
178 store i32 %bfe, i32 addrspace(1)* %out, align 4
179 ret void
180}
181
182define void @bfe_u32_test_3(i32 addrspace(1)* %out, i32 addrspace(1)* %in) nounwind {
183 %x = load i32 addrspace(1)* %in, align 4
184 %shl = shl i32 %x, 31
185 %bfe = call i32 @llvm.AMDGPU.bfe.u32(i32 %shl, i32 0, i32 1)
186 store i32 %bfe, i32 addrspace(1)* %out, align 4
187 ret void
188}
189
Tom Stellard79243d92014-10-01 17:15:17 +0000190; FUNC-LABEL: {{^}}bfe_u32_test_4:
Matt Arsenault5565f65e2014-05-22 18:09:07 +0000191; SI-NOT: LSHL
192; SI-NOT: SHR
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
197define void @bfe_u32_test_4(i32 addrspace(1)* %out, i32 addrspace(1)* %in) nounwind {
198 %x = load i32 addrspace(1)* %in, align 4
199 %shl = shl i32 %x, 31
200 %shr = lshr i32 %shl, 31
201 %bfe = call i32 @llvm.AMDGPU.bfe.u32(i32 %shr, i32 31, i32 1)
202 store i32 %bfe, i32 addrspace(1)* %out, align 4
203 ret void
204}
205
Tom Stellard79243d92014-10-01 17:15:17 +0000206; FUNC-LABEL: {{^}}bfe_u32_test_5:
Matt Arsenault5565f65e2014-05-22 18:09:07 +0000207; SI: BUFFER_LOAD_DWORD
208; SI-NOT: LSHL
209; SI-NOT: SHR
210; SI: V_BFE_I32 {{v[0-9]+}}, {{v[0-9]+}}, 0, 1
211; SI: S_ENDPGM
212define void @bfe_u32_test_5(i32 addrspace(1)* %out, i32 addrspace(1)* %in) nounwind {
213 %x = load i32 addrspace(1)* %in, align 4
214 %shl = shl i32 %x, 31
215 %shr = ashr i32 %shl, 31
216 %bfe = call i32 @llvm.AMDGPU.bfe.u32(i32 %shr, i32 0, i32 1)
217 store i32 %bfe, i32 addrspace(1)* %out, align 4
218 ret void
219}
220
Tom Stellard79243d92014-10-01 17:15:17 +0000221; FUNC-LABEL: {{^}}bfe_u32_test_6:
Matt Arsenault5565f65e2014-05-22 18:09:07 +0000222; SI: V_LSHLREV_B32_e32 v{{[0-9]+}}, 31, v{{[0-9]+}}
Matt Arsenault05e96f42014-05-22 18:09:12 +0000223; SI: V_LSHRREV_B32_e32 v{{[0-9]+}}, 1, v{{[0-9]+}}
Matt Arsenault5565f65e2014-05-22 18:09:07 +0000224; SI: S_ENDPGM
225define void @bfe_u32_test_6(i32 addrspace(1)* %out, i32 addrspace(1)* %in) nounwind {
226 %x = load i32 addrspace(1)* %in, align 4
227 %shl = shl i32 %x, 31
228 %bfe = call i32 @llvm.AMDGPU.bfe.u32(i32 %shl, i32 1, i32 31)
229 store i32 %bfe, i32 addrspace(1)* %out, align 4
230 ret void
231}
232
Tom Stellard79243d92014-10-01 17:15:17 +0000233; FUNC-LABEL: {{^}}bfe_u32_test_7:
Matt Arsenault5565f65e2014-05-22 18:09:07 +0000234; SI: V_LSHLREV_B32_e32 v{{[0-9]+}}, 31, v{{[0-9]+}}
235; SI-NOT: BFE
236; SI: S_ENDPGM
237define void @bfe_u32_test_7(i32 addrspace(1)* %out, i32 addrspace(1)* %in) nounwind {
238 %x = load i32 addrspace(1)* %in, align 4
239 %shl = shl i32 %x, 31
240 %bfe = call i32 @llvm.AMDGPU.bfe.u32(i32 %shl, i32 0, i32 31)
241 store i32 %bfe, i32 addrspace(1)* %out, align 4
242 ret void
243}
244
Tom Stellard79243d92014-10-01 17:15:17 +0000245; FUNC-LABEL: {{^}}bfe_u32_test_8:
Matt Arsenault05e96f42014-05-22 18:09:12 +0000246; SI-NOT: BFE
247; SI: V_AND_B32_e32 {{v[0-9]+}}, 1, {{v[0-9]+}}
248; SI-NOT: BFE
Matt Arsenault5565f65e2014-05-22 18:09:07 +0000249; SI: S_ENDPGM
250define void @bfe_u32_test_8(i32 addrspace(1)* %out, i32 addrspace(1)* %in) nounwind {
251 %x = load i32 addrspace(1)* %in, align 4
252 %shl = shl i32 %x, 31
253 %bfe = call i32 @llvm.AMDGPU.bfe.u32(i32 %shl, i32 31, i32 1)
254 store i32 %bfe, i32 addrspace(1)* %out, align 4
255 ret void
256}
257
Tom Stellard79243d92014-10-01 17:15:17 +0000258; FUNC-LABEL: {{^}}bfe_u32_test_9:
Matt Arsenault05e96f42014-05-22 18:09:12 +0000259; SI-NOT: BFE
260; SI: V_LSHRREV_B32_e32 v{{[0-9]+}}, 31, v{{[0-9]+}}
261; SI-NOT: BFE
262; SI: S_ENDPGM
263define void @bfe_u32_test_9(i32 addrspace(1)* %out, i32 addrspace(1)* %in) nounwind {
264 %x = load i32 addrspace(1)* %in, align 4
265 %bfe = call i32 @llvm.AMDGPU.bfe.u32(i32 %x, i32 31, i32 1)
266 store i32 %bfe, i32 addrspace(1)* %out, align 4
267 ret void
268}
269
Tom Stellard79243d92014-10-01 17:15:17 +0000270; FUNC-LABEL: {{^}}bfe_u32_test_10:
Matt Arsenault05e96f42014-05-22 18:09:12 +0000271; SI-NOT: BFE
272; SI: V_LSHRREV_B32_e32 v{{[0-9]+}}, 1, v{{[0-9]+}}
273; SI-NOT: BFE
274; SI: S_ENDPGM
275define void @bfe_u32_test_10(i32 addrspace(1)* %out, i32 addrspace(1)* %in) nounwind {
276 %x = load i32 addrspace(1)* %in, align 4
277 %bfe = call i32 @llvm.AMDGPU.bfe.u32(i32 %x, i32 1, i32 31)
278 store i32 %bfe, i32 addrspace(1)* %out, align 4
279 ret void
280}
281
Tom Stellard79243d92014-10-01 17:15:17 +0000282; FUNC-LABEL: {{^}}bfe_u32_test_11:
Matt Arsenault05e96f42014-05-22 18:09:12 +0000283; SI-NOT: BFE
284; SI: V_LSHRREV_B32_e32 v{{[0-9]+}}, 8, v{{[0-9]+}}
285; SI-NOT: BFE
286; SI: S_ENDPGM
287define void @bfe_u32_test_11(i32 addrspace(1)* %out, i32 addrspace(1)* %in) nounwind {
288 %x = load i32 addrspace(1)* %in, align 4
289 %bfe = call i32 @llvm.AMDGPU.bfe.u32(i32 %x, i32 8, i32 24)
290 store i32 %bfe, i32 addrspace(1)* %out, align 4
291 ret void
292}
293
Tom Stellard79243d92014-10-01 17:15:17 +0000294; FUNC-LABEL: {{^}}bfe_u32_test_12:
Matt Arsenault05e96f42014-05-22 18:09:12 +0000295; SI-NOT: BFE
296; SI: V_LSHRREV_B32_e32 v{{[0-9]+}}, 24, v{{[0-9]+}}
297; SI-NOT: BFE
298; SI: S_ENDPGM
299define void @bfe_u32_test_12(i32 addrspace(1)* %out, i32 addrspace(1)* %in) nounwind {
300 %x = load i32 addrspace(1)* %in, align 4
301 %bfe = call i32 @llvm.AMDGPU.bfe.u32(i32 %x, i32 24, i32 8)
302 store i32 %bfe, i32 addrspace(1)* %out, align 4
303 ret void
304}
305
Tom Stellard79243d92014-10-01 17:15:17 +0000306; FUNC-LABEL: {{^}}bfe_u32_test_13:
Matt Arsenault05e96f42014-05-22 18:09:12 +0000307; V_ASHRREV_U32_e32 {{v[0-9]+}}, 31, {{v[0-9]+}}
308; SI-NOT: BFE
309; SI: S_ENDPGM
310define void @bfe_u32_test_13(i32 addrspace(1)* %out, i32 addrspace(1)* %in) nounwind {
311 %x = load i32 addrspace(1)* %in, align 4
312 %shl = ashr i32 %x, 31
313 %bfe = call i32 @llvm.AMDGPU.bfe.u32(i32 %shl, i32 31, i32 1)
314 store i32 %bfe, i32 addrspace(1)* %out, align 4 ret void
315}
316
Tom Stellard79243d92014-10-01 17:15:17 +0000317; FUNC-LABEL: {{^}}bfe_u32_test_14:
Matt Arsenault05e96f42014-05-22 18:09:12 +0000318; SI-NOT: LSHR
319; SI-NOT: BFE
320; SI: S_ENDPGM
321define void @bfe_u32_test_14(i32 addrspace(1)* %out, i32 addrspace(1)* %in) nounwind {
322 %x = load i32 addrspace(1)* %in, align 4
323 %shl = lshr i32 %x, 31
324 %bfe = call i32 @llvm.AMDGPU.bfe.u32(i32 %shl, i32 31, i32 1)
325 store i32 %bfe, i32 addrspace(1)* %out, align 4 ret void
326}
327
Tom Stellard79243d92014-10-01 17:15:17 +0000328; FUNC-LABEL: {{^}}bfe_u32_constant_fold_test_0:
Matt Arsenault5565f65e2014-05-22 18:09:07 +0000329; SI-NOT: BFE
330; SI: V_MOV_B32_e32 [[VREG:v[0-9]+]], 0
331; SI: BUFFER_STORE_DWORD [[VREG]],
332; SI: S_ENDPGM
333; EG-NOT: BFE
334define void @bfe_u32_constant_fold_test_0(i32 addrspace(1)* %out) nounwind {
335 %bfe_u32 = call i32 @llvm.AMDGPU.bfe.u32(i32 0, i32 0, i32 0) nounwind readnone
336 store i32 %bfe_u32, i32 addrspace(1)* %out, align 4
337 ret void
338}
339
Tom Stellard79243d92014-10-01 17:15:17 +0000340; FUNC-LABEL: {{^}}bfe_u32_constant_fold_test_1:
Matt Arsenault5565f65e2014-05-22 18:09:07 +0000341; SI-NOT: BFE
342; SI: V_MOV_B32_e32 [[VREG:v[0-9]+]], 0
343; SI: BUFFER_STORE_DWORD [[VREG]],
344; SI: S_ENDPGM
345; EG-NOT: BFE
346define void @bfe_u32_constant_fold_test_1(i32 addrspace(1)* %out) nounwind {
347 %bfe_u32 = call i32 @llvm.AMDGPU.bfe.u32(i32 12334, i32 0, i32 0) nounwind readnone
348 store i32 %bfe_u32, i32 addrspace(1)* %out, align 4
349 ret void
350}
351
Tom Stellard79243d92014-10-01 17:15:17 +0000352; FUNC-LABEL: {{^}}bfe_u32_constant_fold_test_2:
Matt Arsenault5565f65e2014-05-22 18:09:07 +0000353; SI-NOT: BFE
354; SI: V_MOV_B32_e32 [[VREG:v[0-9]+]], 0
355; SI: BUFFER_STORE_DWORD [[VREG]],
356; SI: S_ENDPGM
357; EG-NOT: BFE
358define void @bfe_u32_constant_fold_test_2(i32 addrspace(1)* %out) nounwind {
359 %bfe_u32 = call i32 @llvm.AMDGPU.bfe.u32(i32 0, i32 0, i32 1) nounwind readnone
360 store i32 %bfe_u32, i32 addrspace(1)* %out, align 4
361 ret void
362}
363
Tom Stellard79243d92014-10-01 17:15:17 +0000364; FUNC-LABEL: {{^}}bfe_u32_constant_fold_test_3:
Matt Arsenault5565f65e2014-05-22 18:09:07 +0000365; SI-NOT: BFE
366; SI: V_MOV_B32_e32 [[VREG:v[0-9]+]], 1
367; SI: BUFFER_STORE_DWORD [[VREG]],
368; SI: S_ENDPGM
369; EG-NOT: BFE
370define void @bfe_u32_constant_fold_test_3(i32 addrspace(1)* %out) nounwind {
371 %bfe_u32 = call i32 @llvm.AMDGPU.bfe.u32(i32 1, i32 0, i32 1) nounwind readnone
372 store i32 %bfe_u32, i32 addrspace(1)* %out, align 4
373 ret void
374}
375
Tom Stellard79243d92014-10-01 17:15:17 +0000376; FUNC-LABEL: {{^}}bfe_u32_constant_fold_test_4:
Matt Arsenault5565f65e2014-05-22 18:09:07 +0000377; SI-NOT: BFE
378; SI: V_MOV_B32_e32 [[VREG:v[0-9]+]], -1
379; SI: BUFFER_STORE_DWORD [[VREG]],
380; SI: S_ENDPGM
381; EG-NOT: BFE
382define void @bfe_u32_constant_fold_test_4(i32 addrspace(1)* %out) nounwind {
383 %bfe_u32 = call i32 @llvm.AMDGPU.bfe.u32(i32 4294967295, i32 0, i32 1) nounwind readnone
384 store i32 %bfe_u32, i32 addrspace(1)* %out, align 4
385 ret void
386}
387
Tom Stellard79243d92014-10-01 17:15:17 +0000388; FUNC-LABEL: {{^}}bfe_u32_constant_fold_test_5:
Matt Arsenault5565f65e2014-05-22 18:09:07 +0000389; SI-NOT: BFE
390; SI: V_MOV_B32_e32 [[VREG:v[0-9]+]], 1
391; SI: BUFFER_STORE_DWORD [[VREG]],
392; SI: S_ENDPGM
393; EG-NOT: BFE
394define void @bfe_u32_constant_fold_test_5(i32 addrspace(1)* %out) nounwind {
395 %bfe_u32 = call i32 @llvm.AMDGPU.bfe.u32(i32 128, i32 7, i32 1) nounwind readnone
396 store i32 %bfe_u32, i32 addrspace(1)* %out, align 4
397 ret void
398}
399
Tom Stellard79243d92014-10-01 17:15:17 +0000400; FUNC-LABEL: {{^}}bfe_u32_constant_fold_test_6:
Matt Arsenault5565f65e2014-05-22 18:09:07 +0000401; SI-NOT: BFE
402; SI: V_MOV_B32_e32 [[VREG:v[0-9]+]], 0x80
403; SI: BUFFER_STORE_DWORD [[VREG]],
404; SI: S_ENDPGM
405; EG-NOT: BFE
406define void @bfe_u32_constant_fold_test_6(i32 addrspace(1)* %out) nounwind {
407 %bfe_u32 = call i32 @llvm.AMDGPU.bfe.u32(i32 128, i32 0, i32 8) nounwind readnone
408 store i32 %bfe_u32, i32 addrspace(1)* %out, align 4
409 ret void
410}
411
Tom Stellard79243d92014-10-01 17:15:17 +0000412; FUNC-LABEL: {{^}}bfe_u32_constant_fold_test_7:
Matt Arsenault5565f65e2014-05-22 18:09:07 +0000413; SI-NOT: BFE
414; SI: V_MOV_B32_e32 [[VREG:v[0-9]+]], 0x7f
415; SI: BUFFER_STORE_DWORD [[VREG]],
416; SI: S_ENDPGM
417; EG-NOT: BFE
418define void @bfe_u32_constant_fold_test_7(i32 addrspace(1)* %out) nounwind {
419 %bfe_u32 = call i32 @llvm.AMDGPU.bfe.u32(i32 127, i32 0, i32 8) nounwind readnone
420 store i32 %bfe_u32, i32 addrspace(1)* %out, align 4
421 ret void
422}
423
Tom Stellard79243d92014-10-01 17:15:17 +0000424; FUNC-LABEL: {{^}}bfe_u32_constant_fold_test_8:
Matt Arsenault5565f65e2014-05-22 18:09:07 +0000425; SI-NOT: BFE
426; SI: V_MOV_B32_e32 [[VREG:v[0-9]+]], 1
427; SI: BUFFER_STORE_DWORD [[VREG]],
428; SI: S_ENDPGM
429; EG-NOT: BFE
430define void @bfe_u32_constant_fold_test_8(i32 addrspace(1)* %out) nounwind {
431 %bfe_u32 = call i32 @llvm.AMDGPU.bfe.u32(i32 127, i32 6, i32 8) nounwind readnone
432 store i32 %bfe_u32, i32 addrspace(1)* %out, align 4
433 ret void
434}
435
Tom Stellard79243d92014-10-01 17:15:17 +0000436; FUNC-LABEL: {{^}}bfe_u32_constant_fold_test_9:
Matt Arsenault5565f65e2014-05-22 18:09:07 +0000437; SI-NOT: BFE
438; SI: V_MOV_B32_e32 [[VREG:v[0-9]+]], 1
439; SI: BUFFER_STORE_DWORD [[VREG]],
440; SI: S_ENDPGM
441; EG-NOT: BFEfppppppppppppp
442define void @bfe_u32_constant_fold_test_9(i32 addrspace(1)* %out) nounwind {
443 %bfe_u32 = call i32 @llvm.AMDGPU.bfe.u32(i32 65536, i32 16, i32 8) nounwind readnone
444 store i32 %bfe_u32, i32 addrspace(1)* %out, align 4
445 ret void
446}
447
Tom Stellard79243d92014-10-01 17:15:17 +0000448; FUNC-LABEL: {{^}}bfe_u32_constant_fold_test_10:
Matt Arsenault5565f65e2014-05-22 18:09:07 +0000449; SI-NOT: BFE
450; SI: V_MOV_B32_e32 [[VREG:v[0-9]+]], 0
451; SI: BUFFER_STORE_DWORD [[VREG]],
452; SI: S_ENDPGM
453; EG-NOT: BFE
454define void @bfe_u32_constant_fold_test_10(i32 addrspace(1)* %out) nounwind {
455 %bfe_u32 = call i32 @llvm.AMDGPU.bfe.u32(i32 65535, i32 16, i32 16) nounwind readnone
456 store i32 %bfe_u32, i32 addrspace(1)* %out, align 4
457 ret void
458}
459
Tom Stellard79243d92014-10-01 17:15:17 +0000460; FUNC-LABEL: {{^}}bfe_u32_constant_fold_test_11:
Matt Arsenault5565f65e2014-05-22 18:09:07 +0000461; SI-NOT: BFE
462; SI: V_MOV_B32_e32 [[VREG:v[0-9]+]], 10
463; SI: BUFFER_STORE_DWORD [[VREG]],
464; SI: S_ENDPGM
465; EG-NOT: BFE
466define void @bfe_u32_constant_fold_test_11(i32 addrspace(1)* %out) nounwind {
467 %bfe_u32 = call i32 @llvm.AMDGPU.bfe.u32(i32 160, i32 4, i32 4) nounwind readnone
468 store i32 %bfe_u32, i32 addrspace(1)* %out, align 4
469 ret void
470}
471
Tom Stellard79243d92014-10-01 17:15:17 +0000472; FUNC-LABEL: {{^}}bfe_u32_constant_fold_test_12:
Matt Arsenault5565f65e2014-05-22 18:09:07 +0000473; SI-NOT: BFE
474; SI: V_MOV_B32_e32 [[VREG:v[0-9]+]], 0
475; SI: BUFFER_STORE_DWORD [[VREG]],
476; SI: S_ENDPGM
477; EG-NOT: BFE
478define void @bfe_u32_constant_fold_test_12(i32 addrspace(1)* %out) nounwind {
479 %bfe_u32 = call i32 @llvm.AMDGPU.bfe.u32(i32 160, i32 31, i32 1) nounwind readnone
480 store i32 %bfe_u32, i32 addrspace(1)* %out, align 4
481 ret void
482}
483
Tom Stellard79243d92014-10-01 17:15:17 +0000484; FUNC-LABEL: {{^}}bfe_u32_constant_fold_test_13:
Matt Arsenault5565f65e2014-05-22 18:09:07 +0000485; SI-NOT: BFE
486; SI: V_MOV_B32_e32 [[VREG:v[0-9]+]], 1
487; SI: BUFFER_STORE_DWORD [[VREG]],
488; SI: S_ENDPGM
489; EG-NOT: BFE
490define void @bfe_u32_constant_fold_test_13(i32 addrspace(1)* %out) nounwind {
491 %bfe_u32 = call i32 @llvm.AMDGPU.bfe.u32(i32 131070, i32 16, i32 16) nounwind readnone
492 store i32 %bfe_u32, i32 addrspace(1)* %out, align 4
493 ret void
494}
495
Tom Stellard79243d92014-10-01 17:15:17 +0000496; FUNC-LABEL: {{^}}bfe_u32_constant_fold_test_14:
Matt Arsenault5565f65e2014-05-22 18:09:07 +0000497; SI-NOT: BFE
498; SI: V_MOV_B32_e32 [[VREG:v[0-9]+]], 40
499; SI: BUFFER_STORE_DWORD [[VREG]],
500; SI: S_ENDPGM
501; EG-NOT: BFE
502define void @bfe_u32_constant_fold_test_14(i32 addrspace(1)* %out) nounwind {
503 %bfe_u32 = call i32 @llvm.AMDGPU.bfe.u32(i32 160, i32 2, i32 30) nounwind readnone
504 store i32 %bfe_u32, i32 addrspace(1)* %out, align 4
505 ret void
506}
507
Tom Stellard79243d92014-10-01 17:15:17 +0000508; FUNC-LABEL: {{^}}bfe_u32_constant_fold_test_15:
Matt Arsenault5565f65e2014-05-22 18:09:07 +0000509; SI-NOT: BFE
510; SI: V_MOV_B32_e32 [[VREG:v[0-9]+]], 10
511; SI: BUFFER_STORE_DWORD [[VREG]],
512; SI: S_ENDPGM
513; EG-NOT: BFE
514define void @bfe_u32_constant_fold_test_15(i32 addrspace(1)* %out) nounwind {
515 %bfe_u32 = call i32 @llvm.AMDGPU.bfe.u32(i32 160, i32 4, i32 28) nounwind readnone
516 store i32 %bfe_u32, i32 addrspace(1)* %out, align 4
517 ret void
518}
519
Tom Stellard79243d92014-10-01 17:15:17 +0000520; FUNC-LABEL: {{^}}bfe_u32_constant_fold_test_16:
Matt Arsenault5565f65e2014-05-22 18:09:07 +0000521; SI-NOT: BFE
522; SI: V_MOV_B32_e32 [[VREG:v[0-9]+]], 0x7f
523; SI: BUFFER_STORE_DWORD [[VREG]],
524; SI: S_ENDPGM
525; EG-NOT: BFE
526define void @bfe_u32_constant_fold_test_16(i32 addrspace(1)* %out) nounwind {
527 %bfe_u32 = call i32 @llvm.AMDGPU.bfe.u32(i32 4294967295, i32 1, i32 7) nounwind readnone
528 store i32 %bfe_u32, i32 addrspace(1)* %out, align 4
529 ret void
530}
Matt Arsenault05e96f42014-05-22 18:09:12 +0000531
Tom Stellard79243d92014-10-01 17:15:17 +0000532; FUNC-LABEL: {{^}}bfe_u32_constant_fold_test_17:
Matt Arsenault05e96f42014-05-22 18:09:12 +0000533; SI-NOT: BFE
534; SI: V_MOV_B32_e32 [[VREG:v[0-9]+]], 0x7f
535; SI: BUFFER_STORE_DWORD [[VREG]],
536; SI: S_ENDPGM
537; EG-NOT: BFE
538define void @bfe_u32_constant_fold_test_17(i32 addrspace(1)* %out) nounwind {
539 %bfe_u32 = call i32 @llvm.AMDGPU.bfe.u32(i32 255, i32 1, i32 31) nounwind readnone
540 store i32 %bfe_u32, i32 addrspace(1)* %out, align 4
541 ret void
542}
543
Tom Stellard79243d92014-10-01 17:15:17 +0000544; FUNC-LABEL: {{^}}bfe_u32_constant_fold_test_18:
Matt Arsenault05e96f42014-05-22 18:09:12 +0000545; SI-NOT: BFE
546; SI: V_MOV_B32_e32 [[VREG:v[0-9]+]], 0
547; SI: BUFFER_STORE_DWORD [[VREG]],
548; SI: S_ENDPGM
549; EG-NOT: BFE
550define void @bfe_u32_constant_fold_test_18(i32 addrspace(1)* %out) nounwind {
551 %bfe_u32 = call i32 @llvm.AMDGPU.bfe.u32(i32 255, i32 31, i32 1) nounwind readnone
552 store i32 %bfe_u32, i32 addrspace(1)* %out, align 4
553 ret void
554}
Matt Arsenault7b68fdf2014-10-15 17:58:34 +0000555
556; Make sure that SimplifyDemandedBits doesn't cause the and to be
557; reduced to the bits demanded by the bfe.
558
559; XXX: The operand to v_bfe_u32 could also just directly be the load register.
560; FUNC-LABEL: {{^}}simplify_bfe_u32_multi_use_arg:
561; SI: BUFFER_LOAD_DWORD [[ARG:v[0-9]+]]
562; SI: V_AND_B32_e32 [[AND:v[0-9]+]], 63, [[ARG]]
563; SI: V_BFE_U32 [[BFE:v[0-9]+]], [[AND]], 2, 2
564; SI-DAG: BUFFER_STORE_DWORD [[AND]]
565; SI-DAG: BUFFER_STORE_DWORD [[BFE]]
566; SI: S_ENDPGM
567define void @simplify_bfe_u32_multi_use_arg(i32 addrspace(1)* %out0,
568 i32 addrspace(1)* %out1,
569 i32 addrspace(1)* %in) nounwind {
570 %src = load i32 addrspace(1)* %in, align 4
571 %and = and i32 %src, 63
572 %bfe_u32 = call i32 @llvm.AMDGPU.bfe.u32(i32 %and, i32 2, i32 2) nounwind readnone
573 store i32 %bfe_u32, i32 addrspace(1)* %out0, align 4
574 store i32 %and, i32 addrspace(1)* %out1, align 4
575 ret void
576}