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 -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.u32(i32, i32, i32) nounwind readnone 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_u32_arg_arg_arg: 8*9880d681SAndroid Build Coastguard Worker; SI: v_bfe_u32 9*9880d681SAndroid Build Coastguard Worker; EG: BFE_UINT 10*9880d681SAndroid Build Coastguard Workerdefine void @bfe_u32_arg_arg_arg(i32 addrspace(1)* %out, i32 %src0, i32 %src1, i32 %src2) nounwind { 11*9880d681SAndroid Build Coastguard Worker %bfe_u32 = call i32 @llvm.AMDGPU.bfe.u32(i32 %src0, i32 %src1, i32 %src1) nounwind readnone 12*9880d681SAndroid Build Coastguard Worker store i32 %bfe_u32, i32 addrspace(1)* %out, align 4 13*9880d681SAndroid Build Coastguard Worker ret void 14*9880d681SAndroid Build Coastguard Worker} 15*9880d681SAndroid Build Coastguard Worker 16*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_u32_arg_arg_imm: 17*9880d681SAndroid Build Coastguard Worker; SI: v_bfe_u32 18*9880d681SAndroid Build Coastguard Worker; EG: BFE_UINT 19*9880d681SAndroid Build Coastguard Workerdefine void @bfe_u32_arg_arg_imm(i32 addrspace(1)* %out, i32 %src0, i32 %src1) nounwind { 20*9880d681SAndroid Build Coastguard Worker %bfe_u32 = call i32 @llvm.AMDGPU.bfe.u32(i32 %src0, i32 %src1, i32 123) nounwind readnone 21*9880d681SAndroid Build Coastguard Worker store i32 %bfe_u32, i32 addrspace(1)* %out, align 4 22*9880d681SAndroid Build Coastguard Worker ret void 23*9880d681SAndroid Build Coastguard Worker} 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_u32_arg_imm_arg: 26*9880d681SAndroid Build Coastguard Worker; SI: v_bfe_u32 27*9880d681SAndroid Build Coastguard Worker; EG: BFE_UINT 28*9880d681SAndroid Build Coastguard Workerdefine void @bfe_u32_arg_imm_arg(i32 addrspace(1)* %out, i32 %src0, i32 %src2) nounwind { 29*9880d681SAndroid Build Coastguard Worker %bfe_u32 = call i32 @llvm.AMDGPU.bfe.u32(i32 %src0, i32 123, i32 %src2) nounwind readnone 30*9880d681SAndroid Build Coastguard Worker store i32 %bfe_u32, i32 addrspace(1)* %out, align 4 31*9880d681SAndroid Build Coastguard Worker ret void 32*9880d681SAndroid Build Coastguard Worker} 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_u32_imm_arg_arg: 35*9880d681SAndroid Build Coastguard Worker; SI: v_bfe_u32 36*9880d681SAndroid Build Coastguard Worker; EG: BFE_UINT 37*9880d681SAndroid Build Coastguard Workerdefine void @bfe_u32_imm_arg_arg(i32 addrspace(1)* %out, i32 %src1, i32 %src2) nounwind { 38*9880d681SAndroid Build Coastguard Worker %bfe_u32 = call i32 @llvm.AMDGPU.bfe.u32(i32 123, i32 %src1, i32 %src2) nounwind readnone 39*9880d681SAndroid Build Coastguard Worker store i32 %bfe_u32, i32 addrspace(1)* %out, align 4 40*9880d681SAndroid Build Coastguard Worker ret void 41*9880d681SAndroid Build Coastguard Worker} 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_u32_arg_0_width_reg_offset: 44*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe 45*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 46*9880d681SAndroid Build Coastguard Worker; EG-NOT: BFE 47*9880d681SAndroid Build Coastguard Workerdefine void @bfe_u32_arg_0_width_reg_offset(i32 addrspace(1)* %out, i32 %src0, i32 %src1) nounwind { 48*9880d681SAndroid Build Coastguard Worker %bfe_u32 = call i32 @llvm.AMDGPU.bfe.u32(i32 %src0, i32 %src1, i32 0) nounwind readnone 49*9880d681SAndroid Build Coastguard Worker store i32 %bfe_u32, 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_u32_arg_0_width_imm_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_u32_arg_0_width_imm_offset(i32 addrspace(1)* %out, i32 %src0, i32 %src1) nounwind { 58*9880d681SAndroid Build Coastguard Worker %bfe_u32 = call i32 @llvm.AMDGPU.bfe.u32(i32 %src0, i32 8, 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_u32_zextload_i8: 64*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_ubyte 65*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe 66*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 67*9880d681SAndroid Build Coastguard Workerdefine void @bfe_u32_zextload_i8(i32 addrspace(1)* %out, i8 addrspace(1)* %in) nounwind { 68*9880d681SAndroid Build Coastguard Worker %load = load i8, i8 addrspace(1)* %in 69*9880d681SAndroid Build Coastguard Worker %ext = zext i8 %load to i32 70*9880d681SAndroid Build Coastguard Worker %bfe = call i32 @llvm.AMDGPU.bfe.u32(i32 %ext, i32 0, i32 8) 71*9880d681SAndroid Build Coastguard Worker store i32 %bfe, i32 addrspace(1)* %out, align 4 72*9880d681SAndroid Build Coastguard Worker ret void 73*9880d681SAndroid Build Coastguard Worker} 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_u32_zext_in_reg_i8: 76*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_dword 77*9880d681SAndroid Build Coastguard Worker; SI: v_add_i32 78*9880d681SAndroid Build Coastguard Worker; SI-NEXT: v_and_b32_e32 79*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe 80*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 81*9880d681SAndroid Build Coastguard Workerdefine void @bfe_u32_zext_in_reg_i8(i32 addrspace(1)* %out, i32 addrspace(1)* %in) nounwind { 82*9880d681SAndroid Build Coastguard Worker %load = load i32, i32 addrspace(1)* %in, align 4 83*9880d681SAndroid Build Coastguard Worker %add = add i32 %load, 1 84*9880d681SAndroid Build Coastguard Worker %ext = and i32 %add, 255 85*9880d681SAndroid Build Coastguard Worker %bfe = call i32 @llvm.AMDGPU.bfe.u32(i32 %ext, i32 0, i32 8) 86*9880d681SAndroid Build Coastguard Worker store i32 %bfe, i32 addrspace(1)* %out, align 4 87*9880d681SAndroid Build Coastguard Worker ret void 88*9880d681SAndroid Build Coastguard Worker} 89*9880d681SAndroid Build Coastguard Worker 90*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_u32_zext_in_reg_i16: 91*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_dword 92*9880d681SAndroid Build Coastguard Worker; SI: v_add_i32 93*9880d681SAndroid Build Coastguard Worker; SI-NEXT: v_and_b32_e32 94*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe 95*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 96*9880d681SAndroid Build Coastguard Workerdefine void @bfe_u32_zext_in_reg_i16(i32 addrspace(1)* %out, i32 addrspace(1)* %in) nounwind { 97*9880d681SAndroid Build Coastguard Worker %load = load i32, i32 addrspace(1)* %in, align 4 98*9880d681SAndroid Build Coastguard Worker %add = add i32 %load, 1 99*9880d681SAndroid Build Coastguard Worker %ext = and i32 %add, 65535 100*9880d681SAndroid Build Coastguard Worker %bfe = call i32 @llvm.AMDGPU.bfe.u32(i32 %ext, i32 0, i32 16) 101*9880d681SAndroid Build Coastguard Worker store i32 %bfe, i32 addrspace(1)* %out, align 4 102*9880d681SAndroid Build Coastguard Worker ret void 103*9880d681SAndroid Build Coastguard Worker} 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_u32_zext_in_reg_i8_offset_1: 106*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_dword 107*9880d681SAndroid Build Coastguard Worker; SI: v_add_i32 108*9880d681SAndroid Build Coastguard Worker; SI: bfe 109*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 110*9880d681SAndroid Build Coastguard Workerdefine void @bfe_u32_zext_in_reg_i8_offset_1(i32 addrspace(1)* %out, i32 addrspace(1)* %in) nounwind { 111*9880d681SAndroid Build Coastguard Worker %load = load i32, i32 addrspace(1)* %in, align 4 112*9880d681SAndroid Build Coastguard Worker %add = add i32 %load, 1 113*9880d681SAndroid Build Coastguard Worker %ext = and i32 %add, 255 114*9880d681SAndroid Build Coastguard Worker %bfe = call i32 @llvm.AMDGPU.bfe.u32(i32 %ext, i32 1, i32 8) 115*9880d681SAndroid Build Coastguard Worker store i32 %bfe, i32 addrspace(1)* %out, align 4 116*9880d681SAndroid Build Coastguard Worker ret void 117*9880d681SAndroid Build Coastguard Worker} 118*9880d681SAndroid Build Coastguard Worker 119*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_u32_zext_in_reg_i8_offset_3: 120*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_dword 121*9880d681SAndroid Build Coastguard Worker; SI: v_add_i32 122*9880d681SAndroid Build Coastguard Worker; SI-NEXT: v_and_b32_e32 {{v[0-9]+}}, 0xf8 123*9880d681SAndroid Build Coastguard Worker; SI-NEXT: bfe 124*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 125*9880d681SAndroid Build Coastguard Workerdefine void @bfe_u32_zext_in_reg_i8_offset_3(i32 addrspace(1)* %out, i32 addrspace(1)* %in) nounwind { 126*9880d681SAndroid Build Coastguard Worker %load = load i32, i32 addrspace(1)* %in, align 4 127*9880d681SAndroid Build Coastguard Worker %add = add i32 %load, 1 128*9880d681SAndroid Build Coastguard Worker %ext = and i32 %add, 255 129*9880d681SAndroid Build Coastguard Worker %bfe = call i32 @llvm.AMDGPU.bfe.u32(i32 %ext, i32 3, i32 8) 130*9880d681SAndroid Build Coastguard Worker store i32 %bfe, i32 addrspace(1)* %out, align 4 131*9880d681SAndroid Build Coastguard Worker ret void 132*9880d681SAndroid Build Coastguard Worker} 133*9880d681SAndroid Build Coastguard Worker 134*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_u32_zext_in_reg_i8_offset_7: 135*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_dword 136*9880d681SAndroid Build Coastguard Worker; SI: v_add_i32 137*9880d681SAndroid Build Coastguard Worker; SI-NEXT: v_and_b32_e32 {{v[0-9]+}}, 0x80 138*9880d681SAndroid Build Coastguard Worker; SI-NEXT: bfe 139*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 140*9880d681SAndroid Build Coastguard Workerdefine void @bfe_u32_zext_in_reg_i8_offset_7(i32 addrspace(1)* %out, i32 addrspace(1)* %in) nounwind { 141*9880d681SAndroid Build Coastguard Worker %load = load i32, i32 addrspace(1)* %in, align 4 142*9880d681SAndroid Build Coastguard Worker %add = add i32 %load, 1 143*9880d681SAndroid Build Coastguard Worker %ext = and i32 %add, 255 144*9880d681SAndroid Build Coastguard Worker %bfe = call i32 @llvm.AMDGPU.bfe.u32(i32 %ext, i32 7, i32 8) 145*9880d681SAndroid Build Coastguard Worker store i32 %bfe, i32 addrspace(1)* %out, align 4 146*9880d681SAndroid Build Coastguard Worker ret void 147*9880d681SAndroid Build Coastguard Worker} 148*9880d681SAndroid Build Coastguard Worker 149*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_u32_zext_in_reg_i16_offset_8: 150*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_dword 151*9880d681SAndroid Build Coastguard Worker; SI: v_add_i32 152*9880d681SAndroid Build Coastguard Worker; SI-NEXT: bfe 153*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 154*9880d681SAndroid Build Coastguard Workerdefine void @bfe_u32_zext_in_reg_i16_offset_8(i32 addrspace(1)* %out, i32 addrspace(1)* %in) nounwind { 155*9880d681SAndroid Build Coastguard Worker %load = load i32, i32 addrspace(1)* %in, align 4 156*9880d681SAndroid Build Coastguard Worker %add = add i32 %load, 1 157*9880d681SAndroid Build Coastguard Worker %ext = and i32 %add, 65535 158*9880d681SAndroid Build Coastguard Worker %bfe = call i32 @llvm.AMDGPU.bfe.u32(i32 %ext, i32 8, i32 8) 159*9880d681SAndroid Build Coastguard Worker store i32 %bfe, i32 addrspace(1)* %out, align 4 160*9880d681SAndroid Build Coastguard Worker ret void 161*9880d681SAndroid Build Coastguard Worker} 162*9880d681SAndroid Build Coastguard Worker 163*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_u32_test_1: 164*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_dword 165*9880d681SAndroid Build Coastguard Worker; SI: v_and_b32_e32 {{v[0-9]+}}, 1, {{v[0-9]+}} 166*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 167*9880d681SAndroid Build Coastguard Worker; EG: AND_INT T{{[0-9]\.[XYZW]}}, T{{[0-9]\.[XYZW]}}, 1, 168*9880d681SAndroid Build Coastguard Workerdefine void @bfe_u32_test_1(i32 addrspace(1)* %out, i32 addrspace(1)* %in) nounwind { 169*9880d681SAndroid Build Coastguard Worker %x = load i32, i32 addrspace(1)* %in, align 4 170*9880d681SAndroid Build Coastguard Worker %bfe = call i32 @llvm.AMDGPU.bfe.u32(i32 %x, i32 0, i32 1) 171*9880d681SAndroid Build Coastguard Worker store i32 %bfe, i32 addrspace(1)* %out, align 4 172*9880d681SAndroid Build Coastguard Worker ret void 173*9880d681SAndroid Build Coastguard Worker} 174*9880d681SAndroid Build Coastguard Worker 175*9880d681SAndroid Build Coastguard Workerdefine void @bfe_u32_test_2(i32 addrspace(1)* %out, i32 addrspace(1)* %in) nounwind { 176*9880d681SAndroid Build Coastguard Worker %x = load i32, i32 addrspace(1)* %in, align 4 177*9880d681SAndroid Build Coastguard Worker %shl = shl i32 %x, 31 178*9880d681SAndroid Build Coastguard Worker %bfe = call i32 @llvm.AMDGPU.bfe.u32(i32 %shl, i32 0, i32 8) 179*9880d681SAndroid Build Coastguard Worker store i32 %bfe, i32 addrspace(1)* %out, align 4 180*9880d681SAndroid Build Coastguard Worker ret void 181*9880d681SAndroid Build Coastguard Worker} 182*9880d681SAndroid Build Coastguard Worker 183*9880d681SAndroid Build Coastguard Workerdefine void @bfe_u32_test_3(i32 addrspace(1)* %out, i32 addrspace(1)* %in) nounwind { 184*9880d681SAndroid Build Coastguard Worker %x = load i32, i32 addrspace(1)* %in, align 4 185*9880d681SAndroid Build Coastguard Worker %shl = shl i32 %x, 31 186*9880d681SAndroid Build Coastguard Worker %bfe = call i32 @llvm.AMDGPU.bfe.u32(i32 %shl, i32 0, i32 1) 187*9880d681SAndroid Build Coastguard Worker store i32 %bfe, i32 addrspace(1)* %out, align 4 188*9880d681SAndroid Build Coastguard Worker ret void 189*9880d681SAndroid Build Coastguard Worker} 190*9880d681SAndroid Build Coastguard Worker 191*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_u32_test_4: 192*9880d681SAndroid Build Coastguard Worker; SI-NOT: lshl 193*9880d681SAndroid Build Coastguard Worker; SI-NOT: shr 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 Workerdefine void @bfe_u32_test_4(i32 addrspace(1)* %out, i32 addrspace(1)* %in) nounwind { 199*9880d681SAndroid Build Coastguard Worker %x = load i32, i32 addrspace(1)* %in, align 4 200*9880d681SAndroid Build Coastguard Worker %shl = shl i32 %x, 31 201*9880d681SAndroid Build Coastguard Worker %shr = lshr i32 %shl, 31 202*9880d681SAndroid Build Coastguard Worker %bfe = call i32 @llvm.AMDGPU.bfe.u32(i32 %shr, i32 31, i32 1) 203*9880d681SAndroid Build Coastguard Worker store i32 %bfe, i32 addrspace(1)* %out, align 4 204*9880d681SAndroid Build Coastguard Worker ret void 205*9880d681SAndroid Build Coastguard Worker} 206*9880d681SAndroid Build Coastguard Worker 207*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_u32_test_5: 208*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_dword 209*9880d681SAndroid Build Coastguard Worker; SI-NOT: lshl 210*9880d681SAndroid Build Coastguard Worker; SI-NOT: shr 211*9880d681SAndroid Build Coastguard Worker; SI: v_bfe_i32 {{v[0-9]+}}, {{v[0-9]+}}, 0, 1 212*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 213*9880d681SAndroid Build Coastguard Workerdefine void @bfe_u32_test_5(i32 addrspace(1)* %out, i32 addrspace(1)* %in) nounwind { 214*9880d681SAndroid Build Coastguard Worker %x = load i32, i32 addrspace(1)* %in, align 4 215*9880d681SAndroid Build Coastguard Worker %shl = shl i32 %x, 31 216*9880d681SAndroid Build Coastguard Worker %shr = ashr i32 %shl, 31 217*9880d681SAndroid Build Coastguard Worker %bfe = call i32 @llvm.AMDGPU.bfe.u32(i32 %shr, i32 0, i32 1) 218*9880d681SAndroid Build Coastguard Worker store i32 %bfe, i32 addrspace(1)* %out, align 4 219*9880d681SAndroid Build Coastguard Worker ret void 220*9880d681SAndroid Build Coastguard Worker} 221*9880d681SAndroid Build Coastguard Worker 222*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_u32_test_6: 223*9880d681SAndroid Build Coastguard Worker; SI: v_lshlrev_b32_e32 v{{[0-9]+}}, 31, v{{[0-9]+}} 224*9880d681SAndroid Build Coastguard Worker; SI: v_lshrrev_b32_e32 v{{[0-9]+}}, 1, v{{[0-9]+}} 225*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 226*9880d681SAndroid Build Coastguard Workerdefine void @bfe_u32_test_6(i32 addrspace(1)* %out, i32 addrspace(1)* %in) nounwind { 227*9880d681SAndroid Build Coastguard Worker %x = load i32, i32 addrspace(1)* %in, align 4 228*9880d681SAndroid Build Coastguard Worker %shl = shl i32 %x, 31 229*9880d681SAndroid Build Coastguard Worker %bfe = call i32 @llvm.AMDGPU.bfe.u32(i32 %shl, i32 1, i32 31) 230*9880d681SAndroid Build Coastguard Worker store i32 %bfe, i32 addrspace(1)* %out, align 4 231*9880d681SAndroid Build Coastguard Worker ret void 232*9880d681SAndroid Build Coastguard Worker} 233*9880d681SAndroid Build Coastguard Worker 234*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_u32_test_7: 235*9880d681SAndroid Build Coastguard Worker; SI: v_lshlrev_b32_e32 v{{[0-9]+}}, 31, v{{[0-9]+}} 236*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe 237*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 238*9880d681SAndroid Build Coastguard Workerdefine void @bfe_u32_test_7(i32 addrspace(1)* %out, i32 addrspace(1)* %in) nounwind { 239*9880d681SAndroid Build Coastguard Worker %x = load i32, i32 addrspace(1)* %in, align 4 240*9880d681SAndroid Build Coastguard Worker %shl = shl i32 %x, 31 241*9880d681SAndroid Build Coastguard Worker %bfe = call i32 @llvm.AMDGPU.bfe.u32(i32 %shl, i32 0, i32 31) 242*9880d681SAndroid Build Coastguard Worker store i32 %bfe, i32 addrspace(1)* %out, align 4 243*9880d681SAndroid Build Coastguard Worker ret void 244*9880d681SAndroid Build Coastguard Worker} 245*9880d681SAndroid Build Coastguard Worker 246*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_u32_test_8: 247*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe 248*9880d681SAndroid Build Coastguard Worker; SI: v_and_b32_e32 {{v[0-9]+}}, 1, {{v[0-9]+}} 249*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe 250*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 251*9880d681SAndroid Build Coastguard Workerdefine void @bfe_u32_test_8(i32 addrspace(1)* %out, i32 addrspace(1)* %in) nounwind { 252*9880d681SAndroid Build Coastguard Worker %x = load i32, i32 addrspace(1)* %in, align 4 253*9880d681SAndroid Build Coastguard Worker %shl = shl i32 %x, 31 254*9880d681SAndroid Build Coastguard Worker %bfe = call i32 @llvm.AMDGPU.bfe.u32(i32 %shl, i32 31, i32 1) 255*9880d681SAndroid Build Coastguard Worker store i32 %bfe, i32 addrspace(1)* %out, align 4 256*9880d681SAndroid Build Coastguard Worker ret void 257*9880d681SAndroid Build Coastguard Worker} 258*9880d681SAndroid Build Coastguard Worker 259*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_u32_test_9: 260*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe 261*9880d681SAndroid Build Coastguard Worker; SI: v_lshrrev_b32_e32 v{{[0-9]+}}, 31, v{{[0-9]+}} 262*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe 263*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 264*9880d681SAndroid Build Coastguard Workerdefine void @bfe_u32_test_9(i32 addrspace(1)* %out, i32 addrspace(1)* %in) nounwind { 265*9880d681SAndroid Build Coastguard Worker %x = load i32, i32 addrspace(1)* %in, align 4 266*9880d681SAndroid Build Coastguard Worker %bfe = call i32 @llvm.AMDGPU.bfe.u32(i32 %x, i32 31, i32 1) 267*9880d681SAndroid Build Coastguard Worker store i32 %bfe, i32 addrspace(1)* %out, align 4 268*9880d681SAndroid Build Coastguard Worker ret void 269*9880d681SAndroid Build Coastguard Worker} 270*9880d681SAndroid Build Coastguard Worker 271*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_u32_test_10: 272*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe 273*9880d681SAndroid Build Coastguard Worker; SI: v_lshrrev_b32_e32 v{{[0-9]+}}, 1, v{{[0-9]+}} 274*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe 275*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 276*9880d681SAndroid Build Coastguard Workerdefine void @bfe_u32_test_10(i32 addrspace(1)* %out, i32 addrspace(1)* %in) nounwind { 277*9880d681SAndroid Build Coastguard Worker %x = load i32, i32 addrspace(1)* %in, align 4 278*9880d681SAndroid Build Coastguard Worker %bfe = call i32 @llvm.AMDGPU.bfe.u32(i32 %x, i32 1, i32 31) 279*9880d681SAndroid Build Coastguard Worker store i32 %bfe, i32 addrspace(1)* %out, align 4 280*9880d681SAndroid Build Coastguard Worker ret void 281*9880d681SAndroid Build Coastguard Worker} 282*9880d681SAndroid Build Coastguard Worker 283*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_u32_test_11: 284*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe 285*9880d681SAndroid Build Coastguard Worker; SI: v_lshrrev_b32_e32 v{{[0-9]+}}, 8, v{{[0-9]+}} 286*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe 287*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 288*9880d681SAndroid Build Coastguard Workerdefine void @bfe_u32_test_11(i32 addrspace(1)* %out, i32 addrspace(1)* %in) nounwind { 289*9880d681SAndroid Build Coastguard Worker %x = load i32, i32 addrspace(1)* %in, align 4 290*9880d681SAndroid Build Coastguard Worker %bfe = call i32 @llvm.AMDGPU.bfe.u32(i32 %x, i32 8, i32 24) 291*9880d681SAndroid Build Coastguard Worker store i32 %bfe, i32 addrspace(1)* %out, align 4 292*9880d681SAndroid Build Coastguard Worker ret void 293*9880d681SAndroid Build Coastguard Worker} 294*9880d681SAndroid Build Coastguard Worker 295*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_u32_test_12: 296*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe 297*9880d681SAndroid Build Coastguard Worker; SI: v_lshrrev_b32_e32 v{{[0-9]+}}, 24, v{{[0-9]+}} 298*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe 299*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 300*9880d681SAndroid Build Coastguard Workerdefine void @bfe_u32_test_12(i32 addrspace(1)* %out, i32 addrspace(1)* %in) nounwind { 301*9880d681SAndroid Build Coastguard Worker %x = load i32, i32 addrspace(1)* %in, align 4 302*9880d681SAndroid Build Coastguard Worker %bfe = call i32 @llvm.AMDGPU.bfe.u32(i32 %x, i32 24, i32 8) 303*9880d681SAndroid Build Coastguard Worker store i32 %bfe, i32 addrspace(1)* %out, align 4 304*9880d681SAndroid Build Coastguard Worker ret void 305*9880d681SAndroid Build Coastguard Worker} 306*9880d681SAndroid Build Coastguard Worker 307*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_u32_test_13: 308*9880d681SAndroid Build Coastguard Worker; V_ASHRREV_U32_e32 {{v[0-9]+}}, 31, {{v[0-9]+}} 309*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe 310*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 311*9880d681SAndroid Build Coastguard Workerdefine void @bfe_u32_test_13(i32 addrspace(1)* %out, i32 addrspace(1)* %in) nounwind { 312*9880d681SAndroid Build Coastguard Worker %x = load i32, i32 addrspace(1)* %in, align 4 313*9880d681SAndroid Build Coastguard Worker %shl = ashr i32 %x, 31 314*9880d681SAndroid Build Coastguard Worker %bfe = call i32 @llvm.AMDGPU.bfe.u32(i32 %shl, i32 31, i32 1) 315*9880d681SAndroid Build Coastguard Worker store i32 %bfe, i32 addrspace(1)* %out, align 4 ret void 316*9880d681SAndroid Build Coastguard Worker} 317*9880d681SAndroid Build Coastguard Worker 318*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_u32_test_14: 319*9880d681SAndroid Build Coastguard Worker; SI-NOT: lshr 320*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe 321*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 322*9880d681SAndroid Build Coastguard Workerdefine void @bfe_u32_test_14(i32 addrspace(1)* %out, i32 addrspace(1)* %in) nounwind { 323*9880d681SAndroid Build Coastguard Worker %x = load i32, i32 addrspace(1)* %in, align 4 324*9880d681SAndroid Build Coastguard Worker %shl = lshr i32 %x, 31 325*9880d681SAndroid Build Coastguard Worker %bfe = call i32 @llvm.AMDGPU.bfe.u32(i32 %shl, i32 31, i32 1) 326*9880d681SAndroid Build Coastguard Worker store i32 %bfe, i32 addrspace(1)* %out, align 4 ret void 327*9880d681SAndroid Build Coastguard Worker} 328*9880d681SAndroid Build Coastguard Worker 329*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_u32_constant_fold_test_0: 330*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe 331*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[VREG:v[0-9]+]], 0 332*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[VREG]], 333*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 334*9880d681SAndroid Build Coastguard Worker; EG-NOT: BFE 335*9880d681SAndroid Build Coastguard Workerdefine void @bfe_u32_constant_fold_test_0(i32 addrspace(1)* %out) nounwind { 336*9880d681SAndroid Build Coastguard Worker %bfe_u32 = call i32 @llvm.AMDGPU.bfe.u32(i32 0, i32 0, i32 0) nounwind readnone 337*9880d681SAndroid Build Coastguard Worker store i32 %bfe_u32, i32 addrspace(1)* %out, align 4 338*9880d681SAndroid Build Coastguard Worker ret void 339*9880d681SAndroid Build Coastguard Worker} 340*9880d681SAndroid Build Coastguard Worker 341*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_u32_constant_fold_test_1: 342*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe 343*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[VREG:v[0-9]+]], 0 344*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[VREG]], 345*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 346*9880d681SAndroid Build Coastguard Worker; EG-NOT: BFE 347*9880d681SAndroid Build Coastguard Workerdefine void @bfe_u32_constant_fold_test_1(i32 addrspace(1)* %out) nounwind { 348*9880d681SAndroid Build Coastguard Worker %bfe_u32 = call i32 @llvm.AMDGPU.bfe.u32(i32 12334, i32 0, i32 0) nounwind readnone 349*9880d681SAndroid Build Coastguard Worker store i32 %bfe_u32, i32 addrspace(1)* %out, align 4 350*9880d681SAndroid Build Coastguard Worker ret void 351*9880d681SAndroid Build Coastguard Worker} 352*9880d681SAndroid Build Coastguard Worker 353*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_u32_constant_fold_test_2: 354*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe 355*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[VREG:v[0-9]+]], 0 356*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[VREG]], 357*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 358*9880d681SAndroid Build Coastguard Worker; EG-NOT: BFE 359*9880d681SAndroid Build Coastguard Workerdefine void @bfe_u32_constant_fold_test_2(i32 addrspace(1)* %out) nounwind { 360*9880d681SAndroid Build Coastguard Worker %bfe_u32 = call i32 @llvm.AMDGPU.bfe.u32(i32 0, i32 0, i32 1) nounwind readnone 361*9880d681SAndroid Build Coastguard Worker store i32 %bfe_u32, i32 addrspace(1)* %out, align 4 362*9880d681SAndroid Build Coastguard Worker ret void 363*9880d681SAndroid Build Coastguard Worker} 364*9880d681SAndroid Build Coastguard Worker 365*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_u32_constant_fold_test_3: 366*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe 367*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[VREG:v[0-9]+]], 1 368*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[VREG]], 369*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 370*9880d681SAndroid Build Coastguard Worker; EG-NOT: BFE 371*9880d681SAndroid Build Coastguard Workerdefine void @bfe_u32_constant_fold_test_3(i32 addrspace(1)* %out) nounwind { 372*9880d681SAndroid Build Coastguard Worker %bfe_u32 = call i32 @llvm.AMDGPU.bfe.u32(i32 1, i32 0, i32 1) nounwind readnone 373*9880d681SAndroid Build Coastguard Worker store i32 %bfe_u32, i32 addrspace(1)* %out, align 4 374*9880d681SAndroid Build Coastguard Worker ret void 375*9880d681SAndroid Build Coastguard Worker} 376*9880d681SAndroid Build Coastguard Worker 377*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_u32_constant_fold_test_4: 378*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe 379*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[VREG:v[0-9]+]], -1 380*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[VREG]], 381*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 382*9880d681SAndroid Build Coastguard Worker; EG-NOT: BFE 383*9880d681SAndroid Build Coastguard Workerdefine void @bfe_u32_constant_fold_test_4(i32 addrspace(1)* %out) nounwind { 384*9880d681SAndroid Build Coastguard Worker %bfe_u32 = call i32 @llvm.AMDGPU.bfe.u32(i32 4294967295, i32 0, i32 1) nounwind readnone 385*9880d681SAndroid Build Coastguard Worker store i32 %bfe_u32, i32 addrspace(1)* %out, align 4 386*9880d681SAndroid Build Coastguard Worker ret void 387*9880d681SAndroid Build Coastguard Worker} 388*9880d681SAndroid Build Coastguard Worker 389*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_u32_constant_fold_test_5: 390*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe 391*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[VREG:v[0-9]+]], 1 392*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[VREG]], 393*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 394*9880d681SAndroid Build Coastguard Worker; EG-NOT: BFE 395*9880d681SAndroid Build Coastguard Workerdefine void @bfe_u32_constant_fold_test_5(i32 addrspace(1)* %out) nounwind { 396*9880d681SAndroid Build Coastguard Worker %bfe_u32 = call i32 @llvm.AMDGPU.bfe.u32(i32 128, i32 7, i32 1) nounwind readnone 397*9880d681SAndroid Build Coastguard Worker store i32 %bfe_u32, i32 addrspace(1)* %out, align 4 398*9880d681SAndroid Build Coastguard Worker ret void 399*9880d681SAndroid Build Coastguard Worker} 400*9880d681SAndroid Build Coastguard Worker 401*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_u32_constant_fold_test_6: 402*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe 403*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[VREG:v[0-9]+]], 0x80 404*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[VREG]], 405*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 406*9880d681SAndroid Build Coastguard Worker; EG-NOT: BFE 407*9880d681SAndroid Build Coastguard Workerdefine void @bfe_u32_constant_fold_test_6(i32 addrspace(1)* %out) nounwind { 408*9880d681SAndroid Build Coastguard Worker %bfe_u32 = call i32 @llvm.AMDGPU.bfe.u32(i32 128, i32 0, i32 8) nounwind readnone 409*9880d681SAndroid Build Coastguard Worker store i32 %bfe_u32, i32 addrspace(1)* %out, align 4 410*9880d681SAndroid Build Coastguard Worker ret void 411*9880d681SAndroid Build Coastguard Worker} 412*9880d681SAndroid Build Coastguard Worker 413*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_u32_constant_fold_test_7: 414*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe 415*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[VREG:v[0-9]+]], 0x7f 416*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[VREG]], 417*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 418*9880d681SAndroid Build Coastguard Worker; EG-NOT: BFE 419*9880d681SAndroid Build Coastguard Workerdefine void @bfe_u32_constant_fold_test_7(i32 addrspace(1)* %out) nounwind { 420*9880d681SAndroid Build Coastguard Worker %bfe_u32 = call i32 @llvm.AMDGPU.bfe.u32(i32 127, i32 0, i32 8) nounwind readnone 421*9880d681SAndroid Build Coastguard Worker store i32 %bfe_u32, i32 addrspace(1)* %out, align 4 422*9880d681SAndroid Build Coastguard Worker ret void 423*9880d681SAndroid Build Coastguard Worker} 424*9880d681SAndroid Build Coastguard Worker 425*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_u32_constant_fold_test_8: 426*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe 427*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[VREG:v[0-9]+]], 1 428*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[VREG]], 429*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 430*9880d681SAndroid Build Coastguard Worker; EG-NOT: BFE 431*9880d681SAndroid Build Coastguard Workerdefine void @bfe_u32_constant_fold_test_8(i32 addrspace(1)* %out) nounwind { 432*9880d681SAndroid Build Coastguard Worker %bfe_u32 = call i32 @llvm.AMDGPU.bfe.u32(i32 127, i32 6, i32 8) nounwind readnone 433*9880d681SAndroid Build Coastguard Worker store i32 %bfe_u32, i32 addrspace(1)* %out, align 4 434*9880d681SAndroid Build Coastguard Worker ret void 435*9880d681SAndroid Build Coastguard Worker} 436*9880d681SAndroid Build Coastguard Worker 437*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_u32_constant_fold_test_9: 438*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe 439*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[VREG:v[0-9]+]], 1 440*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[VREG]], 441*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 442*9880d681SAndroid Build Coastguard Worker; EG-NOT: BFE 443*9880d681SAndroid Build Coastguard Workerdefine void @bfe_u32_constant_fold_test_9(i32 addrspace(1)* %out) nounwind { 444*9880d681SAndroid Build Coastguard Worker %bfe_u32 = call i32 @llvm.AMDGPU.bfe.u32(i32 65536, i32 16, i32 8) nounwind readnone 445*9880d681SAndroid Build Coastguard Worker store i32 %bfe_u32, i32 addrspace(1)* %out, align 4 446*9880d681SAndroid Build Coastguard Worker ret void 447*9880d681SAndroid Build Coastguard Worker} 448*9880d681SAndroid Build Coastguard Worker 449*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_u32_constant_fold_test_10: 450*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe 451*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[VREG:v[0-9]+]], 0 452*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[VREG]], 453*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 454*9880d681SAndroid Build Coastguard Worker; EG-NOT: BFE 455*9880d681SAndroid Build Coastguard Workerdefine void @bfe_u32_constant_fold_test_10(i32 addrspace(1)* %out) nounwind { 456*9880d681SAndroid Build Coastguard Worker %bfe_u32 = call i32 @llvm.AMDGPU.bfe.u32(i32 65535, i32 16, i32 16) nounwind readnone 457*9880d681SAndroid Build Coastguard Worker store i32 %bfe_u32, i32 addrspace(1)* %out, align 4 458*9880d681SAndroid Build Coastguard Worker ret void 459*9880d681SAndroid Build Coastguard Worker} 460*9880d681SAndroid Build Coastguard Worker 461*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_u32_constant_fold_test_11: 462*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe 463*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[VREG:v[0-9]+]], 10 464*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[VREG]], 465*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 466*9880d681SAndroid Build Coastguard Worker; EG-NOT: BFE 467*9880d681SAndroid Build Coastguard Workerdefine void @bfe_u32_constant_fold_test_11(i32 addrspace(1)* %out) nounwind { 468*9880d681SAndroid Build Coastguard Worker %bfe_u32 = call i32 @llvm.AMDGPU.bfe.u32(i32 160, i32 4, i32 4) nounwind readnone 469*9880d681SAndroid Build Coastguard Worker store i32 %bfe_u32, i32 addrspace(1)* %out, align 4 470*9880d681SAndroid Build Coastguard Worker ret void 471*9880d681SAndroid Build Coastguard Worker} 472*9880d681SAndroid Build Coastguard Worker 473*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_u32_constant_fold_test_12: 474*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe 475*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[VREG:v[0-9]+]], 0 476*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[VREG]], 477*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 478*9880d681SAndroid Build Coastguard Worker; EG-NOT: BFE 479*9880d681SAndroid Build Coastguard Workerdefine void @bfe_u32_constant_fold_test_12(i32 addrspace(1)* %out) nounwind { 480*9880d681SAndroid Build Coastguard Worker %bfe_u32 = call i32 @llvm.AMDGPU.bfe.u32(i32 160, i32 31, i32 1) nounwind readnone 481*9880d681SAndroid Build Coastguard Worker store i32 %bfe_u32, i32 addrspace(1)* %out, align 4 482*9880d681SAndroid Build Coastguard Worker ret void 483*9880d681SAndroid Build Coastguard Worker} 484*9880d681SAndroid Build Coastguard Worker 485*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_u32_constant_fold_test_13: 486*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe 487*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[VREG:v[0-9]+]], 1 488*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[VREG]], 489*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 490*9880d681SAndroid Build Coastguard Worker; EG-NOT: BFE 491*9880d681SAndroid Build Coastguard Workerdefine void @bfe_u32_constant_fold_test_13(i32 addrspace(1)* %out) nounwind { 492*9880d681SAndroid Build Coastguard Worker %bfe_u32 = call i32 @llvm.AMDGPU.bfe.u32(i32 131070, i32 16, i32 16) nounwind readnone 493*9880d681SAndroid Build Coastguard Worker store i32 %bfe_u32, i32 addrspace(1)* %out, align 4 494*9880d681SAndroid Build Coastguard Worker ret void 495*9880d681SAndroid Build Coastguard Worker} 496*9880d681SAndroid Build Coastguard Worker 497*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_u32_constant_fold_test_14: 498*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe 499*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[VREG:v[0-9]+]], 40 500*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[VREG]], 501*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 502*9880d681SAndroid Build Coastguard Worker; EG-NOT: BFE 503*9880d681SAndroid Build Coastguard Workerdefine void @bfe_u32_constant_fold_test_14(i32 addrspace(1)* %out) nounwind { 504*9880d681SAndroid Build Coastguard Worker %bfe_u32 = call i32 @llvm.AMDGPU.bfe.u32(i32 160, i32 2, i32 30) nounwind readnone 505*9880d681SAndroid Build Coastguard Worker store i32 %bfe_u32, i32 addrspace(1)* %out, align 4 506*9880d681SAndroid Build Coastguard Worker ret void 507*9880d681SAndroid Build Coastguard Worker} 508*9880d681SAndroid Build Coastguard Worker 509*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_u32_constant_fold_test_15: 510*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe 511*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[VREG:v[0-9]+]], 10 512*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[VREG]], 513*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 514*9880d681SAndroid Build Coastguard Worker; EG-NOT: BFE 515*9880d681SAndroid Build Coastguard Workerdefine void @bfe_u32_constant_fold_test_15(i32 addrspace(1)* %out) nounwind { 516*9880d681SAndroid Build Coastguard Worker %bfe_u32 = call i32 @llvm.AMDGPU.bfe.u32(i32 160, i32 4, i32 28) nounwind readnone 517*9880d681SAndroid Build Coastguard Worker store i32 %bfe_u32, i32 addrspace(1)* %out, align 4 518*9880d681SAndroid Build Coastguard Worker ret void 519*9880d681SAndroid Build Coastguard Worker} 520*9880d681SAndroid Build Coastguard Worker 521*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_u32_constant_fold_test_16: 522*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe 523*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[VREG:v[0-9]+]], 0x7f 524*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[VREG]], 525*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 526*9880d681SAndroid Build Coastguard Worker; EG-NOT: BFE 527*9880d681SAndroid Build Coastguard Workerdefine void @bfe_u32_constant_fold_test_16(i32 addrspace(1)* %out) nounwind { 528*9880d681SAndroid Build Coastguard Worker %bfe_u32 = call i32 @llvm.AMDGPU.bfe.u32(i32 4294967295, i32 1, i32 7) nounwind readnone 529*9880d681SAndroid Build Coastguard Worker store i32 %bfe_u32, i32 addrspace(1)* %out, align 4 530*9880d681SAndroid Build Coastguard Worker ret void 531*9880d681SAndroid Build Coastguard Worker} 532*9880d681SAndroid Build Coastguard Worker 533*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_u32_constant_fold_test_17: 534*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe 535*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[VREG:v[0-9]+]], 0x7f 536*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[VREG]], 537*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 538*9880d681SAndroid Build Coastguard Worker; EG-NOT: BFE 539*9880d681SAndroid Build Coastguard Workerdefine void @bfe_u32_constant_fold_test_17(i32 addrspace(1)* %out) nounwind { 540*9880d681SAndroid Build Coastguard Worker %bfe_u32 = call i32 @llvm.AMDGPU.bfe.u32(i32 255, i32 1, i32 31) nounwind readnone 541*9880d681SAndroid Build Coastguard Worker store i32 %bfe_u32, i32 addrspace(1)* %out, align 4 542*9880d681SAndroid Build Coastguard Worker ret void 543*9880d681SAndroid Build Coastguard Worker} 544*9880d681SAndroid Build Coastguard Worker 545*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_u32_constant_fold_test_18: 546*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe 547*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[VREG:v[0-9]+]], 0 548*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[VREG]], 549*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 550*9880d681SAndroid Build Coastguard Worker; EG-NOT: BFE 551*9880d681SAndroid Build Coastguard Workerdefine void @bfe_u32_constant_fold_test_18(i32 addrspace(1)* %out) nounwind { 552*9880d681SAndroid Build Coastguard Worker %bfe_u32 = call i32 @llvm.AMDGPU.bfe.u32(i32 255, i32 31, i32 1) nounwind readnone 553*9880d681SAndroid Build Coastguard Worker store i32 %bfe_u32, i32 addrspace(1)* %out, align 4 554*9880d681SAndroid Build Coastguard Worker ret void 555*9880d681SAndroid Build Coastguard Worker} 556*9880d681SAndroid Build Coastguard Worker 557*9880d681SAndroid Build Coastguard Worker; Make sure that SimplifyDemandedBits doesn't cause the and to be 558*9880d681SAndroid Build Coastguard Worker; reduced to the bits demanded by the bfe. 559*9880d681SAndroid Build Coastguard Worker 560*9880d681SAndroid Build Coastguard Worker; XXX: The operand to v_bfe_u32 could also just directly be the load register. 561*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}simplify_bfe_u32_multi_use_arg: 562*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_dword [[ARG:v[0-9]+]] 563*9880d681SAndroid Build Coastguard Worker; SI: v_and_b32_e32 [[AND:v[0-9]+]], 63, [[ARG]] 564*9880d681SAndroid Build Coastguard Worker; SI: v_bfe_u32 [[BFE:v[0-9]+]], [[AND]], 2, 2 565*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_store_dword [[AND]] 566*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_store_dword [[BFE]] 567*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 568*9880d681SAndroid Build Coastguard Workerdefine void @simplify_bfe_u32_multi_use_arg(i32 addrspace(1)* %out0, 569*9880d681SAndroid Build Coastguard Worker i32 addrspace(1)* %out1, 570*9880d681SAndroid Build Coastguard Worker i32 addrspace(1)* %in) nounwind { 571*9880d681SAndroid Build Coastguard Worker %src = load i32, i32 addrspace(1)* %in, align 4 572*9880d681SAndroid Build Coastguard Worker %and = and i32 %src, 63 573*9880d681SAndroid Build Coastguard Worker %bfe_u32 = call i32 @llvm.AMDGPU.bfe.u32(i32 %and, i32 2, i32 2) nounwind readnone 574*9880d681SAndroid Build Coastguard Worker store i32 %bfe_u32, i32 addrspace(1)* %out0, align 4 575*9880d681SAndroid Build Coastguard Worker store i32 %and, i32 addrspace(1)* %out1, align 4 576*9880d681SAndroid Build Coastguard Worker ret void 577*9880d681SAndroid Build Coastguard Worker} 578*9880d681SAndroid Build Coastguard Worker 579*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}lshr_and: 580*9880d681SAndroid Build Coastguard Worker; SI: s_bfe_u32 {{s[0-9]+}}, {{s[0-9]+}}, 0x30006 581*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword 582*9880d681SAndroid Build Coastguard Workerdefine void @lshr_and(i32 addrspace(1)* %out, i32 %a) nounwind { 583*9880d681SAndroid Build Coastguard Worker %b = lshr i32 %a, 6 584*9880d681SAndroid Build Coastguard Worker %c = and i32 %b, 7 585*9880d681SAndroid Build Coastguard Worker store i32 %c, i32 addrspace(1)* %out, align 8 586*9880d681SAndroid Build Coastguard Worker ret void 587*9880d681SAndroid Build Coastguard Worker} 588*9880d681SAndroid Build Coastguard Worker 589*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}v_lshr_and: 590*9880d681SAndroid Build Coastguard Worker; SI: v_bfe_u32 {{v[0-9]+}}, {{s[0-9]+}}, {{v[0-9]+}}, 3 591*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword 592*9880d681SAndroid Build Coastguard Workerdefine void @v_lshr_and(i32 addrspace(1)* %out, i32 %a, i32 %b) nounwind { 593*9880d681SAndroid Build Coastguard Worker %c = lshr i32 %a, %b 594*9880d681SAndroid Build Coastguard Worker %d = and i32 %c, 7 595*9880d681SAndroid Build Coastguard Worker store i32 %d, i32 addrspace(1)* %out, align 8 596*9880d681SAndroid Build Coastguard Worker ret void 597*9880d681SAndroid Build Coastguard Worker} 598*9880d681SAndroid Build Coastguard Worker 599*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}and_lshr: 600*9880d681SAndroid Build Coastguard Worker; SI: s_bfe_u32 {{s[0-9]+}}, {{s[0-9]+}}, 0x30006 601*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword 602*9880d681SAndroid Build Coastguard Workerdefine void @and_lshr(i32 addrspace(1)* %out, i32 %a) nounwind { 603*9880d681SAndroid Build Coastguard Worker %b = and i32 %a, 448 604*9880d681SAndroid Build Coastguard Worker %c = lshr i32 %b, 6 605*9880d681SAndroid Build Coastguard Worker store i32 %c, i32 addrspace(1)* %out, align 8 606*9880d681SAndroid Build Coastguard Worker ret void 607*9880d681SAndroid Build Coastguard Worker} 608*9880d681SAndroid Build Coastguard Worker 609*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}and_lshr2: 610*9880d681SAndroid Build Coastguard Worker; SI: s_bfe_u32 {{s[0-9]+}}, {{s[0-9]+}}, 0x30006 611*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword 612*9880d681SAndroid Build Coastguard Workerdefine void @and_lshr2(i32 addrspace(1)* %out, i32 %a) nounwind { 613*9880d681SAndroid Build Coastguard Worker %b = and i32 %a, 511 614*9880d681SAndroid Build Coastguard Worker %c = lshr i32 %b, 6 615*9880d681SAndroid Build Coastguard Worker store i32 %c, i32 addrspace(1)* %out, align 8 616*9880d681SAndroid Build Coastguard Worker ret void 617*9880d681SAndroid Build Coastguard Worker} 618*9880d681SAndroid Build Coastguard Worker 619*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}shl_lshr: 620*9880d681SAndroid Build Coastguard Worker; SI: s_bfe_u32 {{s[0-9]+}}, {{s[0-9]+}}, 0x150002 621*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword 622*9880d681SAndroid Build Coastguard Workerdefine void @shl_lshr(i32 addrspace(1)* %out, i32 %a) nounwind { 623*9880d681SAndroid Build Coastguard Worker %b = shl i32 %a, 9 624*9880d681SAndroid Build Coastguard Worker %c = lshr i32 %b, 11 625*9880d681SAndroid Build Coastguard Worker store i32 %c, i32 addrspace(1)* %out, align 8 626*9880d681SAndroid Build Coastguard Worker ret void 627*9880d681SAndroid Build Coastguard Worker} 628