xref: /aosp_15_r20/external/llvm/test/CodeGen/AMDGPU/llvm.AMDGPU.bfe.i32.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -mcpu=SI -verify-machineinstrs < %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s
2*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s
3*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=r600 -mcpu=redwood -show-mc-encoding -verify-machineinstrs < %s | FileCheck -check-prefix=EG -check-prefix=FUNC %s
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.AMDGPU.bfe.i32(i32, i32, i32) nounwind readnone
6*9880d681SAndroid Build Coastguard Worker
7*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_i32_arg_arg_arg:
8*9880d681SAndroid Build Coastguard Worker; SI: v_bfe_i32
9*9880d681SAndroid Build Coastguard Worker; EG: BFE_INT
10*9880d681SAndroid Build Coastguard Worker; EG: encoding: [{{[x0-9a-f]+,[x0-9a-f]+,[x0-9a-f]+,[x0-9a-f]+,[x0-9a-f]+}},0xac
11*9880d681SAndroid Build Coastguard Workerdefine void @bfe_i32_arg_arg_arg(i32 addrspace(1)* %out, i32 %src0, i32 %src1, i32 %src2) nounwind {
12*9880d681SAndroid Build Coastguard Worker  %bfe_i32 = call i32 @llvm.AMDGPU.bfe.i32(i32 %src0, i32 %src1, i32 %src1) nounwind readnone
13*9880d681SAndroid Build Coastguard Worker  store i32 %bfe_i32, i32 addrspace(1)* %out, align 4
14*9880d681SAndroid Build Coastguard Worker  ret void
15*9880d681SAndroid Build Coastguard Worker}
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_i32_arg_arg_imm:
18*9880d681SAndroid Build Coastguard Worker; SI: v_bfe_i32
19*9880d681SAndroid Build Coastguard Worker; EG: BFE_INT
20*9880d681SAndroid Build Coastguard Workerdefine void @bfe_i32_arg_arg_imm(i32 addrspace(1)* %out, i32 %src0, i32 %src1) nounwind {
21*9880d681SAndroid Build Coastguard Worker  %bfe_i32 = call i32 @llvm.AMDGPU.bfe.i32(i32 %src0, i32 %src1, i32 123) nounwind readnone
22*9880d681SAndroid Build Coastguard Worker  store i32 %bfe_i32, i32 addrspace(1)* %out, align 4
23*9880d681SAndroid Build Coastguard Worker  ret void
24*9880d681SAndroid Build Coastguard Worker}
25*9880d681SAndroid Build Coastguard Worker
26*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_i32_arg_imm_arg:
27*9880d681SAndroid Build Coastguard Worker; SI: v_bfe_i32
28*9880d681SAndroid Build Coastguard Worker; EG: BFE_INT
29*9880d681SAndroid Build Coastguard Workerdefine void @bfe_i32_arg_imm_arg(i32 addrspace(1)* %out, i32 %src0, i32 %src2) nounwind {
30*9880d681SAndroid Build Coastguard Worker  %bfe_i32 = call i32 @llvm.AMDGPU.bfe.i32(i32 %src0, i32 123, i32 %src2) nounwind readnone
31*9880d681SAndroid Build Coastguard Worker  store i32 %bfe_i32, i32 addrspace(1)* %out, align 4
32*9880d681SAndroid Build Coastguard Worker  ret void
33*9880d681SAndroid Build Coastguard Worker}
34*9880d681SAndroid Build Coastguard Worker
35*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_i32_imm_arg_arg:
36*9880d681SAndroid Build Coastguard Worker; SI: v_bfe_i32
37*9880d681SAndroid Build Coastguard Worker; EG: BFE_INT
38*9880d681SAndroid Build Coastguard Workerdefine void @bfe_i32_imm_arg_arg(i32 addrspace(1)* %out, i32 %src1, i32 %src2) nounwind {
39*9880d681SAndroid Build Coastguard Worker  %bfe_i32 = call i32 @llvm.AMDGPU.bfe.i32(i32 123, i32 %src1, i32 %src2) nounwind readnone
40*9880d681SAndroid Build Coastguard Worker  store i32 %bfe_i32, i32 addrspace(1)* %out, align 4
41*9880d681SAndroid Build Coastguard Worker  ret void
42*9880d681SAndroid Build Coastguard Worker}
43*9880d681SAndroid Build Coastguard Worker
44*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}v_bfe_print_arg:
45*9880d681SAndroid Build Coastguard Worker; SI: v_bfe_i32 v{{[0-9]+}}, v{{[0-9]+}}, 2, 8
46*9880d681SAndroid Build Coastguard Workerdefine void @v_bfe_print_arg(i32 addrspace(1)* %out, i32 addrspace(1)* %src0) nounwind {
47*9880d681SAndroid Build Coastguard Worker  %load = load i32, i32 addrspace(1)* %src0, align 4
48*9880d681SAndroid Build Coastguard Worker  %bfe_i32 = call i32 @llvm.AMDGPU.bfe.i32(i32 %load, i32 2, i32 8) nounwind readnone
49*9880d681SAndroid Build Coastguard Worker  store i32 %bfe_i32, i32 addrspace(1)* %out, align 4
50*9880d681SAndroid Build Coastguard Worker  ret void
51*9880d681SAndroid Build Coastguard Worker}
52*9880d681SAndroid Build Coastguard Worker
53*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_i32_arg_0_width_reg_offset:
54*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe
55*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
56*9880d681SAndroid Build Coastguard Worker; EG-NOT: BFE
57*9880d681SAndroid Build Coastguard Workerdefine void @bfe_i32_arg_0_width_reg_offset(i32 addrspace(1)* %out, i32 %src0, i32 %src1) nounwind {
58*9880d681SAndroid Build Coastguard Worker  %bfe_u32 = call i32 @llvm.AMDGPU.bfe.i32(i32 %src0, i32 %src1, i32 0) nounwind readnone
59*9880d681SAndroid Build Coastguard Worker  store i32 %bfe_u32, i32 addrspace(1)* %out, align 4
60*9880d681SAndroid Build Coastguard Worker  ret void
61*9880d681SAndroid Build Coastguard Worker}
62*9880d681SAndroid Build Coastguard Worker
63*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_i32_arg_0_width_imm_offset:
64*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe
65*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
66*9880d681SAndroid Build Coastguard Worker; EG-NOT: BFE
67*9880d681SAndroid Build Coastguard Workerdefine void @bfe_i32_arg_0_width_imm_offset(i32 addrspace(1)* %out, i32 %src0, i32 %src1) nounwind {
68*9880d681SAndroid Build Coastguard Worker  %bfe_u32 = call i32 @llvm.AMDGPU.bfe.i32(i32 %src0, i32 8, i32 0) nounwind readnone
69*9880d681SAndroid Build Coastguard Worker  store i32 %bfe_u32, i32 addrspace(1)* %out, align 4
70*9880d681SAndroid Build Coastguard Worker  ret void
71*9880d681SAndroid Build Coastguard Worker}
72*9880d681SAndroid Build Coastguard Worker
73*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_i32_test_6:
74*9880d681SAndroid Build Coastguard Worker; SI: v_lshlrev_b32_e32 v{{[0-9]+}}, 31, v{{[0-9]+}}
75*9880d681SAndroid Build Coastguard Worker; SI: v_ashrrev_i32_e32 v{{[0-9]+}}, 1, v{{[0-9]+}}
76*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
77*9880d681SAndroid Build Coastguard Workerdefine void @bfe_i32_test_6(i32 addrspace(1)* %out, i32 addrspace(1)* %in) nounwind {
78*9880d681SAndroid Build Coastguard Worker  %x = load i32, i32 addrspace(1)* %in, align 4
79*9880d681SAndroid Build Coastguard Worker  %shl = shl i32 %x, 31
80*9880d681SAndroid Build Coastguard Worker  %bfe = call i32 @llvm.AMDGPU.bfe.i32(i32 %shl, i32 1, i32 31)
81*9880d681SAndroid Build Coastguard Worker  store i32 %bfe, i32 addrspace(1)* %out, align 4
82*9880d681SAndroid Build Coastguard Worker  ret void
83*9880d681SAndroid Build Coastguard Worker}
84*9880d681SAndroid Build Coastguard Worker
85*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_i32_test_7:
86*9880d681SAndroid Build Coastguard Worker; SI-NOT: shl
87*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe
88*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[VREG:v[0-9]+]], 0
89*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[VREG]],
90*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
91*9880d681SAndroid Build Coastguard Workerdefine void @bfe_i32_test_7(i32 addrspace(1)* %out, i32 addrspace(1)* %in) nounwind {
92*9880d681SAndroid Build Coastguard Worker  %x = load i32, i32 addrspace(1)* %in, align 4
93*9880d681SAndroid Build Coastguard Worker  %shl = shl i32 %x, 31
94*9880d681SAndroid Build Coastguard Worker  %bfe = call i32 @llvm.AMDGPU.bfe.i32(i32 %shl, i32 0, i32 31)
95*9880d681SAndroid Build Coastguard Worker  store i32 %bfe, i32 addrspace(1)* %out, align 4
96*9880d681SAndroid Build Coastguard Worker  ret void
97*9880d681SAndroid Build Coastguard Worker}
98*9880d681SAndroid Build Coastguard Worker
99*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_i32_test_8:
100*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_dword
101*9880d681SAndroid Build Coastguard Worker; SI: v_bfe_i32 v{{[0-9]+}}, v{{[0-9]+}}, 0, 1
102*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
103*9880d681SAndroid Build Coastguard Workerdefine void @bfe_i32_test_8(i32 addrspace(1)* %out, i32 addrspace(1)* %in) nounwind {
104*9880d681SAndroid Build Coastguard Worker  %x = load i32, i32 addrspace(1)* %in, align 4
105*9880d681SAndroid Build Coastguard Worker  %shl = shl i32 %x, 31
106*9880d681SAndroid Build Coastguard Worker  %bfe = call i32 @llvm.AMDGPU.bfe.i32(i32 %shl, i32 31, i32 1)
107*9880d681SAndroid Build Coastguard Worker  store i32 %bfe, i32 addrspace(1)* %out, align 4
108*9880d681SAndroid Build Coastguard Worker  ret void
109*9880d681SAndroid Build Coastguard Worker}
110*9880d681SAndroid Build Coastguard Worker
111*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_i32_test_9:
112*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe
113*9880d681SAndroid Build Coastguard Worker; SI: v_ashrrev_i32_e32 v{{[0-9]+}}, 31, v{{[0-9]+}}
114*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe
115*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
116*9880d681SAndroid Build Coastguard Workerdefine void @bfe_i32_test_9(i32 addrspace(1)* %out, i32 addrspace(1)* %in) nounwind {
117*9880d681SAndroid Build Coastguard Worker  %x = load i32, i32 addrspace(1)* %in, align 4
118*9880d681SAndroid Build Coastguard Worker  %bfe = call i32 @llvm.AMDGPU.bfe.i32(i32 %x, i32 31, i32 1)
119*9880d681SAndroid Build Coastguard Worker  store i32 %bfe, i32 addrspace(1)* %out, align 4
120*9880d681SAndroid Build Coastguard Worker  ret void
121*9880d681SAndroid Build Coastguard Worker}
122*9880d681SAndroid Build Coastguard Worker
123*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_i32_test_10:
124*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe
125*9880d681SAndroid Build Coastguard Worker; SI: v_ashrrev_i32_e32 v{{[0-9]+}}, 1, v{{[0-9]+}}
126*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe
127*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
128*9880d681SAndroid Build Coastguard Workerdefine void @bfe_i32_test_10(i32 addrspace(1)* %out, i32 addrspace(1)* %in) nounwind {
129*9880d681SAndroid Build Coastguard Worker  %x = load i32, i32 addrspace(1)* %in, align 4
130*9880d681SAndroid Build Coastguard Worker  %bfe = call i32 @llvm.AMDGPU.bfe.i32(i32 %x, i32 1, i32 31)
131*9880d681SAndroid Build Coastguard Worker  store i32 %bfe, i32 addrspace(1)* %out, align 4
132*9880d681SAndroid Build Coastguard Worker  ret void
133*9880d681SAndroid Build Coastguard Worker}
134*9880d681SAndroid Build Coastguard Worker
135*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_i32_test_11:
136*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe
137*9880d681SAndroid Build Coastguard Worker; SI: v_ashrrev_i32_e32 v{{[0-9]+}}, 8, v{{[0-9]+}}
138*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe
139*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
140*9880d681SAndroid Build Coastguard Workerdefine void @bfe_i32_test_11(i32 addrspace(1)* %out, i32 addrspace(1)* %in) nounwind {
141*9880d681SAndroid Build Coastguard Worker  %x = load i32, i32 addrspace(1)* %in, align 4
142*9880d681SAndroid Build Coastguard Worker  %bfe = call i32 @llvm.AMDGPU.bfe.i32(i32 %x, i32 8, i32 24)
143*9880d681SAndroid Build Coastguard Worker  store i32 %bfe, i32 addrspace(1)* %out, align 4
144*9880d681SAndroid Build Coastguard Worker  ret void
145*9880d681SAndroid Build Coastguard Worker}
146*9880d681SAndroid Build Coastguard Worker
147*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_i32_test_12:
148*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe
149*9880d681SAndroid Build Coastguard Worker; SI: v_ashrrev_i32_e32 v{{[0-9]+}}, 24, v{{[0-9]+}}
150*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe
151*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
152*9880d681SAndroid Build Coastguard Workerdefine void @bfe_i32_test_12(i32 addrspace(1)* %out, i32 addrspace(1)* %in) nounwind {
153*9880d681SAndroid Build Coastguard Worker  %x = load i32, i32 addrspace(1)* %in, align 4
154*9880d681SAndroid Build Coastguard Worker  %bfe = call i32 @llvm.AMDGPU.bfe.i32(i32 %x, i32 24, i32 8)
155*9880d681SAndroid Build Coastguard Worker  store i32 %bfe, i32 addrspace(1)* %out, align 4
156*9880d681SAndroid Build Coastguard Worker  ret void
157*9880d681SAndroid Build Coastguard Worker}
158*9880d681SAndroid Build Coastguard Worker
159*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_i32_test_13:
160*9880d681SAndroid Build Coastguard Worker; SI: v_ashrrev_i32_e32 {{v[0-9]+}}, 31, {{v[0-9]+}}
161*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe
162*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
163*9880d681SAndroid Build Coastguard Workerdefine void @bfe_i32_test_13(i32 addrspace(1)* %out, i32 addrspace(1)* %in) nounwind {
164*9880d681SAndroid Build Coastguard Worker  %x = load i32, i32 addrspace(1)* %in, align 4
165*9880d681SAndroid Build Coastguard Worker  %shl = ashr i32 %x, 31
166*9880d681SAndroid Build Coastguard Worker  %bfe = call i32 @llvm.AMDGPU.bfe.i32(i32 %shl, i32 31, i32 1)
167*9880d681SAndroid Build Coastguard Worker  store i32 %bfe, i32 addrspace(1)* %out, align 4 ret void
168*9880d681SAndroid Build Coastguard Worker}
169*9880d681SAndroid Build Coastguard Worker
170*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_i32_test_14:
171*9880d681SAndroid Build Coastguard Worker; SI-NOT: lshr
172*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe
173*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
174*9880d681SAndroid Build Coastguard Workerdefine void @bfe_i32_test_14(i32 addrspace(1)* %out, i32 addrspace(1)* %in) nounwind {
175*9880d681SAndroid Build Coastguard Worker  %x = load i32, i32 addrspace(1)* %in, align 4
176*9880d681SAndroid Build Coastguard Worker  %shl = lshr i32 %x, 31
177*9880d681SAndroid Build Coastguard Worker  %bfe = call i32 @llvm.AMDGPU.bfe.i32(i32 %shl, i32 31, i32 1)
178*9880d681SAndroid Build Coastguard Worker  store i32 %bfe, i32 addrspace(1)* %out, align 4 ret void
179*9880d681SAndroid Build Coastguard Worker}
180*9880d681SAndroid Build Coastguard Worker
181*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_i32_constant_fold_test_0:
182*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe
183*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[VREG:v[0-9]+]], 0
184*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[VREG]],
185*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
186*9880d681SAndroid Build Coastguard Worker; EG-NOT: BFE
187*9880d681SAndroid Build Coastguard Workerdefine void @bfe_i32_constant_fold_test_0(i32 addrspace(1)* %out) nounwind {
188*9880d681SAndroid Build Coastguard Worker  %bfe_i32 = call i32 @llvm.AMDGPU.bfe.i32(i32 0, i32 0, i32 0) nounwind readnone
189*9880d681SAndroid Build Coastguard Worker  store i32 %bfe_i32, i32 addrspace(1)* %out, align 4
190*9880d681SAndroid Build Coastguard Worker  ret void
191*9880d681SAndroid Build Coastguard Worker}
192*9880d681SAndroid Build Coastguard Worker
193*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_i32_constant_fold_test_1:
194*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe
195*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[VREG:v[0-9]+]], 0
196*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[VREG]],
197*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
198*9880d681SAndroid Build Coastguard Worker; EG-NOT: BFE
199*9880d681SAndroid Build Coastguard Workerdefine void @bfe_i32_constant_fold_test_1(i32 addrspace(1)* %out) nounwind {
200*9880d681SAndroid Build Coastguard Worker  %bfe_i32 = call i32 @llvm.AMDGPU.bfe.i32(i32 12334, i32 0, i32 0) nounwind readnone
201*9880d681SAndroid Build Coastguard Worker  store i32 %bfe_i32, i32 addrspace(1)* %out, align 4
202*9880d681SAndroid Build Coastguard Worker  ret void
203*9880d681SAndroid Build Coastguard Worker}
204*9880d681SAndroid Build Coastguard Worker
205*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_i32_constant_fold_test_2:
206*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe
207*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[VREG:v[0-9]+]], 0
208*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[VREG]],
209*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
210*9880d681SAndroid Build Coastguard Worker; EG-NOT: BFE
211*9880d681SAndroid Build Coastguard Workerdefine void @bfe_i32_constant_fold_test_2(i32 addrspace(1)* %out) nounwind {
212*9880d681SAndroid Build Coastguard Worker  %bfe_i32 = call i32 @llvm.AMDGPU.bfe.i32(i32 0, i32 0, i32 1) nounwind readnone
213*9880d681SAndroid Build Coastguard Worker  store i32 %bfe_i32, i32 addrspace(1)* %out, align 4
214*9880d681SAndroid Build Coastguard Worker  ret void
215*9880d681SAndroid Build Coastguard Worker}
216*9880d681SAndroid Build Coastguard Worker
217*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_i32_constant_fold_test_3:
218*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe
219*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[VREG:v[0-9]+]], -1
220*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[VREG]],
221*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
222*9880d681SAndroid Build Coastguard Worker; EG-NOT: BFE
223*9880d681SAndroid Build Coastguard Workerdefine void @bfe_i32_constant_fold_test_3(i32 addrspace(1)* %out) nounwind {
224*9880d681SAndroid Build Coastguard Worker  %bfe_i32 = call i32 @llvm.AMDGPU.bfe.i32(i32 1, i32 0, i32 1) nounwind readnone
225*9880d681SAndroid Build Coastguard Worker  store i32 %bfe_i32, i32 addrspace(1)* %out, align 4
226*9880d681SAndroid Build Coastguard Worker  ret void
227*9880d681SAndroid Build Coastguard Worker}
228*9880d681SAndroid Build Coastguard Worker
229*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_i32_constant_fold_test_4:
230*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe
231*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[VREG:v[0-9]+]], -1
232*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[VREG]],
233*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
234*9880d681SAndroid Build Coastguard Worker; EG-NOT: BFE
235*9880d681SAndroid Build Coastguard Workerdefine void @bfe_i32_constant_fold_test_4(i32 addrspace(1)* %out) nounwind {
236*9880d681SAndroid Build Coastguard Worker  %bfe_i32 = call i32 @llvm.AMDGPU.bfe.i32(i32 4294967295, i32 0, i32 1) nounwind readnone
237*9880d681SAndroid Build Coastguard Worker  store i32 %bfe_i32, i32 addrspace(1)* %out, align 4
238*9880d681SAndroid Build Coastguard Worker  ret void
239*9880d681SAndroid Build Coastguard Worker}
240*9880d681SAndroid Build Coastguard Worker
241*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_i32_constant_fold_test_5:
242*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe
243*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[VREG:v[0-9]+]], -1
244*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[VREG]],
245*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
246*9880d681SAndroid Build Coastguard Worker; EG-NOT: BFE
247*9880d681SAndroid Build Coastguard Workerdefine void @bfe_i32_constant_fold_test_5(i32 addrspace(1)* %out) nounwind {
248*9880d681SAndroid Build Coastguard Worker  %bfe_i32 = call i32 @llvm.AMDGPU.bfe.i32(i32 128, i32 7, i32 1) nounwind readnone
249*9880d681SAndroid Build Coastguard Worker  store i32 %bfe_i32, i32 addrspace(1)* %out, align 4
250*9880d681SAndroid Build Coastguard Worker  ret void
251*9880d681SAndroid Build Coastguard Worker}
252*9880d681SAndroid Build Coastguard Worker
253*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_i32_constant_fold_test_6:
254*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe
255*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[VREG:v[0-9]+]], 0xffffff80
256*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[VREG]],
257*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
258*9880d681SAndroid Build Coastguard Worker; EG-NOT: BFE
259*9880d681SAndroid Build Coastguard Workerdefine void @bfe_i32_constant_fold_test_6(i32 addrspace(1)* %out) nounwind {
260*9880d681SAndroid Build Coastguard Worker  %bfe_i32 = call i32 @llvm.AMDGPU.bfe.i32(i32 128, i32 0, i32 8) nounwind readnone
261*9880d681SAndroid Build Coastguard Worker  store i32 %bfe_i32, i32 addrspace(1)* %out, align 4
262*9880d681SAndroid Build Coastguard Worker  ret void
263*9880d681SAndroid Build Coastguard Worker}
264*9880d681SAndroid Build Coastguard Worker
265*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_i32_constant_fold_test_7:
266*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe
267*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[VREG:v[0-9]+]], 0x7f
268*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[VREG]],
269*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
270*9880d681SAndroid Build Coastguard Worker; EG-NOT: BFE
271*9880d681SAndroid Build Coastguard Workerdefine void @bfe_i32_constant_fold_test_7(i32 addrspace(1)* %out) nounwind {
272*9880d681SAndroid Build Coastguard Worker  %bfe_i32 = call i32 @llvm.AMDGPU.bfe.i32(i32 127, i32 0, i32 8) nounwind readnone
273*9880d681SAndroid Build Coastguard Worker  store i32 %bfe_i32, i32 addrspace(1)* %out, align 4
274*9880d681SAndroid Build Coastguard Worker  ret void
275*9880d681SAndroid Build Coastguard Worker}
276*9880d681SAndroid Build Coastguard Worker
277*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_i32_constant_fold_test_8:
278*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe
279*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[VREG:v[0-9]+]], 1
280*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[VREG]],
281*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
282*9880d681SAndroid Build Coastguard Worker; EG-NOT: BFE
283*9880d681SAndroid Build Coastguard Workerdefine void @bfe_i32_constant_fold_test_8(i32 addrspace(1)* %out) nounwind {
284*9880d681SAndroid Build Coastguard Worker  %bfe_i32 = call i32 @llvm.AMDGPU.bfe.i32(i32 127, i32 6, i32 8) nounwind readnone
285*9880d681SAndroid Build Coastguard Worker  store i32 %bfe_i32, i32 addrspace(1)* %out, align 4
286*9880d681SAndroid Build Coastguard Worker  ret void
287*9880d681SAndroid Build Coastguard Worker}
288*9880d681SAndroid Build Coastguard Worker
289*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_i32_constant_fold_test_9:
290*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe
291*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[VREG:v[0-9]+]], 1
292*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[VREG]],
293*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
294*9880d681SAndroid Build Coastguard Worker; EG-NOT: BFE
295*9880d681SAndroid Build Coastguard Workerdefine void @bfe_i32_constant_fold_test_9(i32 addrspace(1)* %out) nounwind {
296*9880d681SAndroid Build Coastguard Worker  %bfe_i32 = call i32 @llvm.AMDGPU.bfe.i32(i32 65536, i32 16, i32 8) nounwind readnone
297*9880d681SAndroid Build Coastguard Worker  store i32 %bfe_i32, i32 addrspace(1)* %out, align 4
298*9880d681SAndroid Build Coastguard Worker  ret void
299*9880d681SAndroid Build Coastguard Worker}
300*9880d681SAndroid Build Coastguard Worker
301*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_i32_constant_fold_test_10:
302*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe
303*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[VREG:v[0-9]+]], 0
304*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[VREG]],
305*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
306*9880d681SAndroid Build Coastguard Worker; EG-NOT: BFE
307*9880d681SAndroid Build Coastguard Workerdefine void @bfe_i32_constant_fold_test_10(i32 addrspace(1)* %out) nounwind {
308*9880d681SAndroid Build Coastguard Worker  %bfe_i32 = call i32 @llvm.AMDGPU.bfe.i32(i32 65535, i32 16, i32 16) nounwind readnone
309*9880d681SAndroid Build Coastguard Worker  store i32 %bfe_i32, i32 addrspace(1)* %out, align 4
310*9880d681SAndroid Build Coastguard Worker  ret void
311*9880d681SAndroid Build Coastguard Worker}
312*9880d681SAndroid Build Coastguard Worker
313*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_i32_constant_fold_test_11:
314*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe
315*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[VREG:v[0-9]+]], -6
316*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[VREG]],
317*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
318*9880d681SAndroid Build Coastguard Worker; EG-NOT: BFE
319*9880d681SAndroid Build Coastguard Workerdefine void @bfe_i32_constant_fold_test_11(i32 addrspace(1)* %out) nounwind {
320*9880d681SAndroid Build Coastguard Worker  %bfe_i32 = call i32 @llvm.AMDGPU.bfe.i32(i32 160, i32 4, i32 4) nounwind readnone
321*9880d681SAndroid Build Coastguard Worker  store i32 %bfe_i32, i32 addrspace(1)* %out, align 4
322*9880d681SAndroid Build Coastguard Worker  ret void
323*9880d681SAndroid Build Coastguard Worker}
324*9880d681SAndroid Build Coastguard Worker
325*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_i32_constant_fold_test_12:
326*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe
327*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[VREG:v[0-9]+]], 0
328*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[VREG]],
329*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
330*9880d681SAndroid Build Coastguard Worker; EG-NOT: BFE
331*9880d681SAndroid Build Coastguard Workerdefine void @bfe_i32_constant_fold_test_12(i32 addrspace(1)* %out) nounwind {
332*9880d681SAndroid Build Coastguard Worker  %bfe_i32 = call i32 @llvm.AMDGPU.bfe.i32(i32 160, i32 31, i32 1) nounwind readnone
333*9880d681SAndroid Build Coastguard Worker  store i32 %bfe_i32, i32 addrspace(1)* %out, align 4
334*9880d681SAndroid Build Coastguard Worker  ret void
335*9880d681SAndroid Build Coastguard Worker}
336*9880d681SAndroid Build Coastguard Worker
337*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_i32_constant_fold_test_13:
338*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe
339*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[VREG:v[0-9]+]], 1
340*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[VREG]],
341*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
342*9880d681SAndroid Build Coastguard Worker; EG-NOT: BFE
343*9880d681SAndroid Build Coastguard Workerdefine void @bfe_i32_constant_fold_test_13(i32 addrspace(1)* %out) nounwind {
344*9880d681SAndroid Build Coastguard Worker  %bfe_i32 = call i32 @llvm.AMDGPU.bfe.i32(i32 131070, i32 16, i32 16) nounwind readnone
345*9880d681SAndroid Build Coastguard Worker  store i32 %bfe_i32, i32 addrspace(1)* %out, align 4
346*9880d681SAndroid Build Coastguard Worker  ret void
347*9880d681SAndroid Build Coastguard Worker}
348*9880d681SAndroid Build Coastguard Worker
349*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_i32_constant_fold_test_14:
350*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe
351*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[VREG:v[0-9]+]], 40
352*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[VREG]],
353*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
354*9880d681SAndroid Build Coastguard Worker; EG-NOT: BFE
355*9880d681SAndroid Build Coastguard Workerdefine void @bfe_i32_constant_fold_test_14(i32 addrspace(1)* %out) nounwind {
356*9880d681SAndroid Build Coastguard Worker  %bfe_i32 = call i32 @llvm.AMDGPU.bfe.i32(i32 160, i32 2, i32 30) nounwind readnone
357*9880d681SAndroid Build Coastguard Worker  store i32 %bfe_i32, i32 addrspace(1)* %out, align 4
358*9880d681SAndroid Build Coastguard Worker  ret void
359*9880d681SAndroid Build Coastguard Worker}
360*9880d681SAndroid Build Coastguard Worker
361*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_i32_constant_fold_test_15:
362*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe
363*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[VREG:v[0-9]+]], 10
364*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[VREG]],
365*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
366*9880d681SAndroid Build Coastguard Worker; EG-NOT: BFE
367*9880d681SAndroid Build Coastguard Workerdefine void @bfe_i32_constant_fold_test_15(i32 addrspace(1)* %out) nounwind {
368*9880d681SAndroid Build Coastguard Worker  %bfe_i32 = call i32 @llvm.AMDGPU.bfe.i32(i32 160, i32 4, i32 28) nounwind readnone
369*9880d681SAndroid Build Coastguard Worker  store i32 %bfe_i32, i32 addrspace(1)* %out, align 4
370*9880d681SAndroid Build Coastguard Worker  ret void
371*9880d681SAndroid Build Coastguard Worker}
372*9880d681SAndroid Build Coastguard Worker
373*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_i32_constant_fold_test_16:
374*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe
375*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[VREG:v[0-9]+]], -1
376*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[VREG]],
377*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
378*9880d681SAndroid Build Coastguard Worker; EG-NOT: BFE
379*9880d681SAndroid Build Coastguard Workerdefine void @bfe_i32_constant_fold_test_16(i32 addrspace(1)* %out) nounwind {
380*9880d681SAndroid Build Coastguard Worker  %bfe_i32 = call i32 @llvm.AMDGPU.bfe.i32(i32 4294967295, i32 1, i32 7) nounwind readnone
381*9880d681SAndroid Build Coastguard Worker  store i32 %bfe_i32, i32 addrspace(1)* %out, align 4
382*9880d681SAndroid Build Coastguard Worker  ret void
383*9880d681SAndroid Build Coastguard Worker}
384*9880d681SAndroid Build Coastguard Worker
385*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_i32_constant_fold_test_17:
386*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe
387*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[VREG:v[0-9]+]], 0x7f
388*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[VREG]],
389*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
390*9880d681SAndroid Build Coastguard Worker; EG-NOT: BFE
391*9880d681SAndroid Build Coastguard Workerdefine void @bfe_i32_constant_fold_test_17(i32 addrspace(1)* %out) nounwind {
392*9880d681SAndroid Build Coastguard Worker  %bfe_i32 = call i32 @llvm.AMDGPU.bfe.i32(i32 255, i32 1, i32 31) nounwind readnone
393*9880d681SAndroid Build Coastguard Worker  store i32 %bfe_i32, i32 addrspace(1)* %out, align 4
394*9880d681SAndroid Build Coastguard Worker  ret void
395*9880d681SAndroid Build Coastguard Worker}
396*9880d681SAndroid Build Coastguard Worker
397*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_i32_constant_fold_test_18:
398*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe
399*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[VREG:v[0-9]+]], 0
400*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[VREG]],
401*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
402*9880d681SAndroid Build Coastguard Worker; EG-NOT: BFE
403*9880d681SAndroid Build Coastguard Workerdefine void @bfe_i32_constant_fold_test_18(i32 addrspace(1)* %out) nounwind {
404*9880d681SAndroid Build Coastguard Worker  %bfe_i32 = call i32 @llvm.AMDGPU.bfe.i32(i32 255, i32 31, i32 1) nounwind readnone
405*9880d681SAndroid Build Coastguard Worker  store i32 %bfe_i32, i32 addrspace(1)* %out, align 4
406*9880d681SAndroid Build Coastguard Worker  ret void
407*9880d681SAndroid Build Coastguard Worker}
408*9880d681SAndroid Build Coastguard Worker
409*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_sext_in_reg_i24:
410*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_dword [[LOAD:v[0-9]+]],
411*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_lshl
412*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_ashr
413*9880d681SAndroid Build Coastguard Worker; SI: v_bfe_i32 [[BFE:v[0-9]+]], [[LOAD]], 0, 24
414*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[BFE]],
415*9880d681SAndroid Build Coastguard Workerdefine void @bfe_sext_in_reg_i24(i32 addrspace(1)* %out, i32 addrspace(1)* %in) nounwind {
416*9880d681SAndroid Build Coastguard Worker  %x = load i32, i32 addrspace(1)* %in, align 4
417*9880d681SAndroid Build Coastguard Worker  %bfe = call i32 @llvm.AMDGPU.bfe.i32(i32 %x, i32 0, i32 24)
418*9880d681SAndroid Build Coastguard Worker  %shl = shl i32 %bfe, 8
419*9880d681SAndroid Build Coastguard Worker  %ashr = ashr i32 %shl, 8
420*9880d681SAndroid Build Coastguard Worker  store i32 %ashr, i32 addrspace(1)* %out, align 4
421*9880d681SAndroid Build Coastguard Worker  ret void
422*9880d681SAndroid Build Coastguard Worker}
423*9880d681SAndroid Build Coastguard Worker
424*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: @simplify_demanded_bfe_sdiv
425*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_dword [[LOAD:v[0-9]+]]
426*9880d681SAndroid Build Coastguard Worker; SI: v_bfe_i32 [[BFE:v[0-9]+]], [[LOAD]], 1, 16
427*9880d681SAndroid Build Coastguard Worker; SI: v_lshrrev_b32_e32 [[TMP0:v[0-9]+]], 31, [[BFE]]
428*9880d681SAndroid Build Coastguard Worker; SI: v_add_i32_e32 [[TMP1:v[0-9]+]], vcc, [[TMP0]], [[BFE]]
429*9880d681SAndroid Build Coastguard Worker; SI: v_ashrrev_i32_e32 [[TMP2:v[0-9]+]], 1, [[TMP1]]
430*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[TMP2]]
431*9880d681SAndroid Build Coastguard Workerdefine void @simplify_demanded_bfe_sdiv(i32 addrspace(1)* %out, i32 addrspace(1)* %in) nounwind {
432*9880d681SAndroid Build Coastguard Worker  %src = load i32, i32 addrspace(1)* %in, align 4
433*9880d681SAndroid Build Coastguard Worker  %bfe = call i32 @llvm.AMDGPU.bfe.i32(i32 %src, i32 1, i32 16) nounwind readnone
434*9880d681SAndroid Build Coastguard Worker  %div = sdiv i32 %bfe, 2
435*9880d681SAndroid Build Coastguard Worker  store i32 %div, i32 addrspace(1)* %out, align 4
436*9880d681SAndroid Build Coastguard Worker  ret void
437*9880d681SAndroid Build Coastguard Worker}
438