939 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -global-isel -mtriple=amdgcn-amd-amdpal -mcpu=tahiti -amdgpu-load-store-vectorizer=0 < %s | FileCheck -check-prefix=GFX6 %s3 4define i32 @v_bfe_i32_arg_arg_arg(i32 %src0, i32 %src1, i32 %src2) #0 {5; GFX6-LABEL: v_bfe_i32_arg_arg_arg:6; GFX6: ; %bb.0:7; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)8; GFX6-NEXT: v_bfe_i32 v0, v0, v1, v29; GFX6-NEXT: s_setpc_b64 s[30:31]10 %bfe_i32 = call i32 @llvm.amdgcn.sbfe.i32(i32 %src0, i32 %src1, i32 %src2)11 ret i32 %bfe_i3212}13 14define amdgpu_ps i32 @s_bfe_i32_arg_arg_arg(i32 inreg %src0, i32 inreg %src1, i32 inreg %src2) #0 {15; GFX6-LABEL: s_bfe_i32_arg_arg_arg:16; GFX6: ; %bb.0:17; GFX6-NEXT: s_and_b32 s1, s1, 6318; GFX6-NEXT: s_lshl_b32 s2, s2, 1619; GFX6-NEXT: s_or_b32 s1, s1, s220; GFX6-NEXT: s_bfe_i32 s0, s0, s121; GFX6-NEXT: ; return to shader part epilog22 %bfe_i32 = call i32 @llvm.amdgcn.sbfe.i32(i32 %src0, i32 %src1, i32 %src2)23 ret i32 %bfe_i3224}25 26; TODO: Need to expand this27; define i64 @v_bfe_i64_arg_arg_arg(i64 %src0, i32 %src1, i32 %src2) #0 {28; %bfe_i64 = call i32 @llvm.amdgcn.sbfe.i64(i32 %src0, i32 %src1, i32 %src2)29; ret i64 %bfe_i6430; }31 32define amdgpu_ps i64 @s_bfe_i64_arg_arg_arg(i64 inreg %src0, i32 inreg %src1, i32 inreg %src2) #0 {33; GFX6-LABEL: s_bfe_i64_arg_arg_arg:34; GFX6: ; %bb.0:35; GFX6-NEXT: s_and_b32 s2, s2, 6336; GFX6-NEXT: s_lshl_b32 s3, s3, 1637; GFX6-NEXT: s_or_b32 s2, s2, s338; GFX6-NEXT: s_bfe_i64 s[0:1], s[0:1], s239; GFX6-NEXT: ; return to shader part epilog40 %bfe_i32 = call i64 @llvm.amdgcn.sbfe.i64(i64 %src0, i32 %src1, i32 %src2)41 ret i64 %bfe_i3242}43 44define amdgpu_kernel void @bfe_i32_arg_arg_imm(ptr addrspace(1) %out, i32 %src0, i32 %src1) #0 {45; GFX6-LABEL: bfe_i32_arg_arg_imm:46; GFX6: ; %bb.0:47; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x048; GFX6-NEXT: s_waitcnt lgkmcnt(0)49; GFX6-NEXT: s_and_b32 s3, s3, 6350; GFX6-NEXT: s_or_b32 s3, s3, 0x7b000051; GFX6-NEXT: s_bfe_i32 s3, s2, s352; GFX6-NEXT: s_mov_b32 s2, -153; GFX6-NEXT: v_mov_b32_e32 v0, s354; GFX6-NEXT: s_mov_b32 s3, 0xf00055; GFX6-NEXT: buffer_store_dword v0, off, s[0:3], 056; GFX6-NEXT: s_endpgm57 %bfe_i32 = call i32 @llvm.amdgcn.sbfe.i32(i32 %src0, i32 %src1, i32 123)58 store i32 %bfe_i32, ptr addrspace(1) %out, align 459 ret void60}61 62define amdgpu_kernel void @bfe_i32_arg_imm_arg(ptr addrspace(1) %out, i32 %src0, i32 %src2) #0 {63; GFX6-LABEL: bfe_i32_arg_imm_arg:64; GFX6: ; %bb.0:65; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x066; GFX6-NEXT: s_waitcnt lgkmcnt(0)67; GFX6-NEXT: s_lshl_b32 s3, s3, 1668; GFX6-NEXT: s_or_b32 s3, 59, s369; GFX6-NEXT: s_bfe_i32 s3, s2, s370; GFX6-NEXT: s_mov_b32 s2, -171; GFX6-NEXT: v_mov_b32_e32 v0, s372; GFX6-NEXT: s_mov_b32 s3, 0xf00073; GFX6-NEXT: buffer_store_dword v0, off, s[0:3], 074; GFX6-NEXT: s_endpgm75 %bfe_i32 = call i32 @llvm.amdgcn.sbfe.i32(i32 %src0, i32 123, i32 %src2)76 store i32 %bfe_i32, ptr addrspace(1) %out, align 477 ret void78}79 80define amdgpu_kernel void @bfe_i32_imm_arg_arg(ptr addrspace(1) %out, i32 %src1, i32 %src2) #0 {81; GFX6-LABEL: bfe_i32_imm_arg_arg:82; GFX6: ; %bb.0:83; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x084; GFX6-NEXT: s_waitcnt lgkmcnt(0)85; GFX6-NEXT: s_and_b32 s4, s2, 6386; GFX6-NEXT: s_lshl_b32 s3, s3, 1687; GFX6-NEXT: s_or_b32 s3, s4, s388; GFX6-NEXT: s_bfe_i32 s3, 0x7b, s389; GFX6-NEXT: s_mov_b32 s2, -190; GFX6-NEXT: v_mov_b32_e32 v0, s391; GFX6-NEXT: s_mov_b32 s3, 0xf00092; GFX6-NEXT: buffer_store_dword v0, off, s[0:3], 093; GFX6-NEXT: s_endpgm94 %bfe_i32 = call i32 @llvm.amdgcn.sbfe.i32(i32 123, i32 %src1, i32 %src2)95 store i32 %bfe_i32, ptr addrspace(1) %out, align 496 ret void97}98 99define amdgpu_kernel void @v_bfe_print_arg(ptr addrspace(1) %out, ptr addrspace(1) %src0) #0 {100; GFX6-LABEL: v_bfe_print_arg:101; GFX6: ; %bb.0:102; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0103; GFX6-NEXT: s_waitcnt lgkmcnt(0)104; GFX6-NEXT: s_load_dword s3, s[2:3], 0x0105; GFX6-NEXT: s_mov_b32 s2, -1106; GFX6-NEXT: s_waitcnt lgkmcnt(0)107; GFX6-NEXT: s_bfe_i32 s3, s3, 0x80002108; GFX6-NEXT: v_mov_b32_e32 v0, s3109; GFX6-NEXT: s_mov_b32 s3, 0xf000110; GFX6-NEXT: buffer_store_dword v0, off, s[0:3], 0111; GFX6-NEXT: s_endpgm112 %load = load i32, ptr addrspace(1) %src0, align 4113 %bfe_i32 = call i32 @llvm.amdgcn.sbfe.i32(i32 %load, i32 2, i32 8)114 store i32 %bfe_i32, ptr addrspace(1) %out, align 4115 ret void116}117 118define amdgpu_kernel void @bfe_i32_arg_0_width_reg_offset(ptr addrspace(1) %out, i32 %src0, i32 %src1) #0 {119; GFX6-LABEL: bfe_i32_arg_0_width_reg_offset:120; GFX6: ; %bb.0:121; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0122; GFX6-NEXT: s_waitcnt lgkmcnt(0)123; GFX6-NEXT: s_and_b32 s3, s3, 63124; GFX6-NEXT: s_bfe_i32 s3, s2, s3125; GFX6-NEXT: s_mov_b32 s2, -1126; GFX6-NEXT: v_mov_b32_e32 v0, s3127; GFX6-NEXT: s_mov_b32 s3, 0xf000128; GFX6-NEXT: buffer_store_dword v0, off, s[0:3], 0129; GFX6-NEXT: s_endpgm130 %bfe_u32 = call i32 @llvm.amdgcn.sbfe.i32(i32 %src0, i32 %src1, i32 0)131 store i32 %bfe_u32, ptr addrspace(1) %out, align 4132 ret void133}134 135define amdgpu_kernel void @bfe_i32_arg_0_width_imm_offset(ptr addrspace(1) %out, i32 %src0, i32 %src1) #0 {136; GFX6-LABEL: bfe_i32_arg_0_width_imm_offset:137; GFX6: ; %bb.0:138; GFX6-NEXT: s_load_dword s3, s[4:5], 0x2139; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0140; GFX6-NEXT: s_mov_b32 s2, -1141; GFX6-NEXT: s_waitcnt lgkmcnt(0)142; GFX6-NEXT: s_bfe_i32 s3, s3, 8143; GFX6-NEXT: v_mov_b32_e32 v0, s3144; GFX6-NEXT: s_mov_b32 s3, 0xf000145; GFX6-NEXT: buffer_store_dword v0, off, s[0:3], 0146; GFX6-NEXT: s_endpgm147 %bfe_u32 = call i32 @llvm.amdgcn.sbfe.i32(i32 %src0, i32 8, i32 0)148 store i32 %bfe_u32, ptr addrspace(1) %out, align 4149 ret void150}151 152define amdgpu_kernel void @bfe_i32_test_6(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {153; GFX6-LABEL: bfe_i32_test_6:154; GFX6: ; %bb.0:155; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0156; GFX6-NEXT: s_waitcnt lgkmcnt(0)157; GFX6-NEXT: s_load_dword s3, s[2:3], 0x0158; GFX6-NEXT: s_mov_b32 s2, -1159; GFX6-NEXT: s_waitcnt lgkmcnt(0)160; GFX6-NEXT: s_lshl_b32 s3, s3, 31161; GFX6-NEXT: s_bfe_i32 s3, s3, 0x1f0001162; GFX6-NEXT: v_mov_b32_e32 v0, s3163; GFX6-NEXT: s_mov_b32 s3, 0xf000164; GFX6-NEXT: buffer_store_dword v0, off, s[0:3], 0165; GFX6-NEXT: s_endpgm166 %x = load i32, ptr addrspace(1) %in, align 4167 %shl = shl i32 %x, 31168 %bfe = call i32 @llvm.amdgcn.sbfe.i32(i32 %shl, i32 1, i32 31)169 store i32 %bfe, ptr addrspace(1) %out, align 4170 ret void171}172 173define amdgpu_kernel void @bfe_i32_test_7(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {174; GFX6-LABEL: bfe_i32_test_7:175; GFX6: ; %bb.0:176; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0177; GFX6-NEXT: s_waitcnt lgkmcnt(0)178; GFX6-NEXT: s_load_dword s3, s[2:3], 0x0179; GFX6-NEXT: s_mov_b32 s2, -1180; GFX6-NEXT: s_waitcnt lgkmcnt(0)181; GFX6-NEXT: s_lshl_b32 s3, s3, 31182; GFX6-NEXT: s_bfe_i32 s3, s3, 0x1f0000183; GFX6-NEXT: v_mov_b32_e32 v0, s3184; GFX6-NEXT: s_mov_b32 s3, 0xf000185; GFX6-NEXT: buffer_store_dword v0, off, s[0:3], 0186; GFX6-NEXT: s_endpgm187 %x = load i32, ptr addrspace(1) %in, align 4188 %shl = shl i32 %x, 31189 %bfe = call i32 @llvm.amdgcn.sbfe.i32(i32 %shl, i32 0, i32 31)190 store i32 %bfe, ptr addrspace(1) %out, align 4191 ret void192}193 194define amdgpu_kernel void @bfe_i32_test_8(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {195; GFX6-LABEL: bfe_i32_test_8:196; GFX6: ; %bb.0:197; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0198; GFX6-NEXT: s_waitcnt lgkmcnt(0)199; GFX6-NEXT: s_load_dword s3, s[2:3], 0x0200; GFX6-NEXT: s_mov_b32 s2, -1201; GFX6-NEXT: s_waitcnt lgkmcnt(0)202; GFX6-NEXT: s_lshl_b32 s3, s3, 31203; GFX6-NEXT: s_bfe_i32 s3, s3, 0x1001f204; GFX6-NEXT: v_mov_b32_e32 v0, s3205; GFX6-NEXT: s_mov_b32 s3, 0xf000206; GFX6-NEXT: buffer_store_dword v0, off, s[0:3], 0207; GFX6-NEXT: s_endpgm208 %x = load i32, ptr addrspace(1) %in, align 4209 %shl = shl i32 %x, 31210 %bfe = call i32 @llvm.amdgcn.sbfe.i32(i32 %shl, i32 31, i32 1)211 store i32 %bfe, ptr addrspace(1) %out, align 4212 ret void213}214 215define amdgpu_kernel void @bfe_i32_test_9(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {216; GFX6-LABEL: bfe_i32_test_9:217; GFX6: ; %bb.0:218; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0219; GFX6-NEXT: s_waitcnt lgkmcnt(0)220; GFX6-NEXT: s_load_dword s3, s[2:3], 0x0221; GFX6-NEXT: s_mov_b32 s2, -1222; GFX6-NEXT: s_waitcnt lgkmcnt(0)223; GFX6-NEXT: s_bfe_i32 s3, s3, 0x1001f224; GFX6-NEXT: v_mov_b32_e32 v0, s3225; GFX6-NEXT: s_mov_b32 s3, 0xf000226; GFX6-NEXT: buffer_store_dword v0, off, s[0:3], 0227; GFX6-NEXT: s_endpgm228 %x = load i32, ptr addrspace(1) %in, align 4229 %bfe = call i32 @llvm.amdgcn.sbfe.i32(i32 %x, i32 31, i32 1)230 store i32 %bfe, ptr addrspace(1) %out, align 4231 ret void232}233 234define amdgpu_kernel void @bfe_i32_test_10(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {235; GFX6-LABEL: bfe_i32_test_10:236; GFX6: ; %bb.0:237; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0238; GFX6-NEXT: s_waitcnt lgkmcnt(0)239; GFX6-NEXT: s_load_dword s3, s[2:3], 0x0240; GFX6-NEXT: s_mov_b32 s2, -1241; GFX6-NEXT: s_waitcnt lgkmcnt(0)242; GFX6-NEXT: s_bfe_i32 s3, s3, 0x1f0001243; GFX6-NEXT: v_mov_b32_e32 v0, s3244; GFX6-NEXT: s_mov_b32 s3, 0xf000245; GFX6-NEXT: buffer_store_dword v0, off, s[0:3], 0246; GFX6-NEXT: s_endpgm247 %x = load i32, ptr addrspace(1) %in, align 4248 %bfe = call i32 @llvm.amdgcn.sbfe.i32(i32 %x, i32 1, i32 31)249 store i32 %bfe, ptr addrspace(1) %out, align 4250 ret void251}252 253define amdgpu_kernel void @bfe_i32_test_11(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {254; GFX6-LABEL: bfe_i32_test_11:255; GFX6: ; %bb.0:256; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0257; GFX6-NEXT: s_waitcnt lgkmcnt(0)258; GFX6-NEXT: s_load_dword s3, s[2:3], 0x0259; GFX6-NEXT: s_mov_b32 s2, -1260; GFX6-NEXT: s_waitcnt lgkmcnt(0)261; GFX6-NEXT: s_bfe_i32 s3, s3, 0x180008262; GFX6-NEXT: v_mov_b32_e32 v0, s3263; GFX6-NEXT: s_mov_b32 s3, 0xf000264; GFX6-NEXT: buffer_store_dword v0, off, s[0:3], 0265; GFX6-NEXT: s_endpgm266 %x = load i32, ptr addrspace(1) %in, align 4267 %bfe = call i32 @llvm.amdgcn.sbfe.i32(i32 %x, i32 8, i32 24)268 store i32 %bfe, ptr addrspace(1) %out, align 4269 ret void270}271 272define amdgpu_kernel void @bfe_i32_test_12(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {273; GFX6-LABEL: bfe_i32_test_12:274; GFX6: ; %bb.0:275; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0276; GFX6-NEXT: s_waitcnt lgkmcnt(0)277; GFX6-NEXT: s_load_dword s3, s[2:3], 0x0278; GFX6-NEXT: s_mov_b32 s2, -1279; GFX6-NEXT: s_waitcnt lgkmcnt(0)280; GFX6-NEXT: s_bfe_i32 s3, s3, 0x80018281; GFX6-NEXT: v_mov_b32_e32 v0, s3282; GFX6-NEXT: s_mov_b32 s3, 0xf000283; GFX6-NEXT: buffer_store_dword v0, off, s[0:3], 0284; GFX6-NEXT: s_endpgm285 %x = load i32, ptr addrspace(1) %in, align 4286 %bfe = call i32 @llvm.amdgcn.sbfe.i32(i32 %x, i32 24, i32 8)287 store i32 %bfe, ptr addrspace(1) %out, align 4288 ret void289}290 291define amdgpu_kernel void @bfe_i32_test_13(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {292; GFX6-LABEL: bfe_i32_test_13:293; GFX6: ; %bb.0:294; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0295; GFX6-NEXT: s_waitcnt lgkmcnt(0)296; GFX6-NEXT: s_load_dword s3, s[2:3], 0x0297; GFX6-NEXT: s_mov_b32 s2, -1298; GFX6-NEXT: s_waitcnt lgkmcnt(0)299; GFX6-NEXT: s_ashr_i32 s3, s3, 31300; GFX6-NEXT: s_bfe_i32 s3, s3, 0x1001f301; GFX6-NEXT: v_mov_b32_e32 v0, s3302; GFX6-NEXT: s_mov_b32 s3, 0xf000303; GFX6-NEXT: buffer_store_dword v0, off, s[0:3], 0304; GFX6-NEXT: s_endpgm305 %x = load i32, ptr addrspace(1) %in, align 4306 %shl = ashr i32 %x, 31307 %bfe = call i32 @llvm.amdgcn.sbfe.i32(i32 %shl, i32 31, i32 1)308 store i32 %bfe, ptr addrspace(1) %out, align 4 ret void309}310 311define amdgpu_kernel void @bfe_i32_test_14(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {312; GFX6-LABEL: bfe_i32_test_14:313; GFX6: ; %bb.0:314; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0315; GFX6-NEXT: s_waitcnt lgkmcnt(0)316; GFX6-NEXT: s_load_dword s3, s[2:3], 0x0317; GFX6-NEXT: s_mov_b32 s2, -1318; GFX6-NEXT: s_waitcnt lgkmcnt(0)319; GFX6-NEXT: s_lshr_b32 s3, s3, 31320; GFX6-NEXT: s_bfe_i32 s3, s3, 0x1001f321; GFX6-NEXT: v_mov_b32_e32 v0, s3322; GFX6-NEXT: s_mov_b32 s3, 0xf000323; GFX6-NEXT: buffer_store_dword v0, off, s[0:3], 0324; GFX6-NEXT: s_endpgm325 %x = load i32, ptr addrspace(1) %in, align 4326 %shl = lshr i32 %x, 31327 %bfe = call i32 @llvm.amdgcn.sbfe.i32(i32 %shl, i32 31, i32 1)328 store i32 %bfe, ptr addrspace(1) %out, align 4 ret void329}330 331define amdgpu_kernel void @bfe_i32_constant_fold_test_0(ptr addrspace(1) %out) #0 {332; GFX6-LABEL: bfe_i32_constant_fold_test_0:333; GFX6: ; %bb.0:334; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0335; GFX6-NEXT: s_bfe_i32 s2, 0, 0336; GFX6-NEXT: v_mov_b32_e32 v0, s2337; GFX6-NEXT: s_mov_b32 s2, -1338; GFX6-NEXT: s_mov_b32 s3, 0xf000339; GFX6-NEXT: s_waitcnt lgkmcnt(0)340; GFX6-NEXT: buffer_store_dword v0, off, s[0:3], 0341; GFX6-NEXT: s_endpgm342 %bfe_i32 = call i32 @llvm.amdgcn.sbfe.i32(i32 0, i32 0, i32 0)343 store i32 %bfe_i32, ptr addrspace(1) %out, align 4344 ret void345}346 347define amdgpu_kernel void @bfe_i32_constant_fold_test_1(ptr addrspace(1) %out) #0 {348; GFX6-LABEL: bfe_i32_constant_fold_test_1:349; GFX6: ; %bb.0:350; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0351; GFX6-NEXT: s_bfe_i32 s2, 0x302e, 0352; GFX6-NEXT: v_mov_b32_e32 v0, s2353; GFX6-NEXT: s_mov_b32 s2, -1354; GFX6-NEXT: s_mov_b32 s3, 0xf000355; GFX6-NEXT: s_waitcnt lgkmcnt(0)356; GFX6-NEXT: buffer_store_dword v0, off, s[0:3], 0357; GFX6-NEXT: s_endpgm358 %bfe_i32 = call i32 @llvm.amdgcn.sbfe.i32(i32 12334, i32 0, i32 0)359 store i32 %bfe_i32, ptr addrspace(1) %out, align 4360 ret void361}362 363define amdgpu_kernel void @bfe_i32_constant_fold_test_2(ptr addrspace(1) %out) #0 {364; GFX6-LABEL: bfe_i32_constant_fold_test_2:365; GFX6: ; %bb.0:366; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0367; GFX6-NEXT: s_bfe_i32 s2, 0, 0x10000368; GFX6-NEXT: v_mov_b32_e32 v0, s2369; GFX6-NEXT: s_mov_b32 s2, -1370; GFX6-NEXT: s_mov_b32 s3, 0xf000371; GFX6-NEXT: s_waitcnt lgkmcnt(0)372; GFX6-NEXT: buffer_store_dword v0, off, s[0:3], 0373; GFX6-NEXT: s_endpgm374 %bfe_i32 = call i32 @llvm.amdgcn.sbfe.i32(i32 0, i32 0, i32 1)375 store i32 %bfe_i32, ptr addrspace(1) %out, align 4376 ret void377}378 379define amdgpu_kernel void @bfe_i32_constant_fold_test_3(ptr addrspace(1) %out) #0 {380; GFX6-LABEL: bfe_i32_constant_fold_test_3:381; GFX6: ; %bb.0:382; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0383; GFX6-NEXT: s_bfe_i32 s2, 1, 0x10000384; GFX6-NEXT: v_mov_b32_e32 v0, s2385; GFX6-NEXT: s_mov_b32 s2, -1386; GFX6-NEXT: s_mov_b32 s3, 0xf000387; GFX6-NEXT: s_waitcnt lgkmcnt(0)388; GFX6-NEXT: buffer_store_dword v0, off, s[0:3], 0389; GFX6-NEXT: s_endpgm390 %bfe_i32 = call i32 @llvm.amdgcn.sbfe.i32(i32 1, i32 0, i32 1)391 store i32 %bfe_i32, ptr addrspace(1) %out, align 4392 ret void393}394 395define amdgpu_kernel void @bfe_i32_constant_fold_test_4(ptr addrspace(1) %out) #0 {396; GFX6-LABEL: bfe_i32_constant_fold_test_4:397; GFX6: ; %bb.0:398; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0399; GFX6-NEXT: s_bfe_i32 s2, -1, 0x10000400; GFX6-NEXT: v_mov_b32_e32 v0, s2401; GFX6-NEXT: s_mov_b32 s2, -1402; GFX6-NEXT: s_mov_b32 s3, 0xf000403; GFX6-NEXT: s_waitcnt lgkmcnt(0)404; GFX6-NEXT: buffer_store_dword v0, off, s[0:3], 0405; GFX6-NEXT: s_endpgm406 %bfe_i32 = call i32 @llvm.amdgcn.sbfe.i32(i32 4294967295, i32 0, i32 1)407 store i32 %bfe_i32, ptr addrspace(1) %out, align 4408 ret void409}410 411define amdgpu_kernel void @bfe_i32_constant_fold_test_5(ptr addrspace(1) %out) #0 {412; GFX6-LABEL: bfe_i32_constant_fold_test_5:413; GFX6: ; %bb.0:414; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0415; GFX6-NEXT: s_mov_b32 s2, 0x10007416; GFX6-NEXT: s_bfe_i32 s2, 0x80, s2417; GFX6-NEXT: v_mov_b32_e32 v0, s2418; GFX6-NEXT: s_mov_b32 s2, -1419; GFX6-NEXT: s_mov_b32 s3, 0xf000420; GFX6-NEXT: s_waitcnt lgkmcnt(0)421; GFX6-NEXT: buffer_store_dword v0, off, s[0:3], 0422; GFX6-NEXT: s_endpgm423 %bfe_i32 = call i32 @llvm.amdgcn.sbfe.i32(i32 128, i32 7, i32 1)424 store i32 %bfe_i32, ptr addrspace(1) %out, align 4425 ret void426}427 428define amdgpu_kernel void @bfe_i32_constant_fold_test_6(ptr addrspace(1) %out) #0 {429; GFX6-LABEL: bfe_i32_constant_fold_test_6:430; GFX6: ; %bb.0:431; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0432; GFX6-NEXT: s_mov_b32 s2, 0x80000433; GFX6-NEXT: s_bfe_i32 s2, 0x80, s2434; GFX6-NEXT: v_mov_b32_e32 v0, s2435; GFX6-NEXT: s_mov_b32 s2, -1436; GFX6-NEXT: s_mov_b32 s3, 0xf000437; GFX6-NEXT: s_waitcnt lgkmcnt(0)438; GFX6-NEXT: buffer_store_dword v0, off, s[0:3], 0439; GFX6-NEXT: s_endpgm440 %bfe_i32 = call i32 @llvm.amdgcn.sbfe.i32(i32 128, i32 0, i32 8)441 store i32 %bfe_i32, ptr addrspace(1) %out, align 4442 ret void443}444 445define amdgpu_kernel void @bfe_i32_constant_fold_test_7(ptr addrspace(1) %out) #0 {446; GFX6-LABEL: bfe_i32_constant_fold_test_7:447; GFX6: ; %bb.0:448; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0449; GFX6-NEXT: s_mov_b32 s2, 0x80000450; GFX6-NEXT: s_bfe_i32 s2, 0x7f, s2451; GFX6-NEXT: v_mov_b32_e32 v0, s2452; GFX6-NEXT: s_mov_b32 s2, -1453; GFX6-NEXT: s_mov_b32 s3, 0xf000454; GFX6-NEXT: s_waitcnt lgkmcnt(0)455; GFX6-NEXT: buffer_store_dword v0, off, s[0:3], 0456; GFX6-NEXT: s_endpgm457 %bfe_i32 = call i32 @llvm.amdgcn.sbfe.i32(i32 127, i32 0, i32 8)458 store i32 %bfe_i32, ptr addrspace(1) %out, align 4459 ret void460}461 462define amdgpu_kernel void @bfe_i32_constant_fold_test_8(ptr addrspace(1) %out) #0 {463; GFX6-LABEL: bfe_i32_constant_fold_test_8:464; GFX6: ; %bb.0:465; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0466; GFX6-NEXT: s_mov_b32 s2, 0x80006467; GFX6-NEXT: s_bfe_i32 s2, 0x7f, s2468; GFX6-NEXT: v_mov_b32_e32 v0, s2469; GFX6-NEXT: s_mov_b32 s2, -1470; GFX6-NEXT: s_mov_b32 s3, 0xf000471; GFX6-NEXT: s_waitcnt lgkmcnt(0)472; GFX6-NEXT: buffer_store_dword v0, off, s[0:3], 0473; GFX6-NEXT: s_endpgm474 %bfe_i32 = call i32 @llvm.amdgcn.sbfe.i32(i32 127, i32 6, i32 8)475 store i32 %bfe_i32, ptr addrspace(1) %out, align 4476 ret void477}478 479define amdgpu_kernel void @bfe_i32_constant_fold_test_9(ptr addrspace(1) %out) #0 {480; GFX6-LABEL: bfe_i32_constant_fold_test_9:481; GFX6: ; %bb.0:482; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0483; GFX6-NEXT: s_mov_b32 s2, 0x80010484; GFX6-NEXT: s_bfe_i32 s2, 0x10000, s2485; GFX6-NEXT: v_mov_b32_e32 v0, s2486; GFX6-NEXT: s_mov_b32 s2, -1487; GFX6-NEXT: s_mov_b32 s3, 0xf000488; GFX6-NEXT: s_waitcnt lgkmcnt(0)489; GFX6-NEXT: buffer_store_dword v0, off, s[0:3], 0490; GFX6-NEXT: s_endpgm491 %bfe_i32 = call i32 @llvm.amdgcn.sbfe.i32(i32 65536, i32 16, i32 8)492 store i32 %bfe_i32, ptr addrspace(1) %out, align 4493 ret void494}495 496define amdgpu_kernel void @bfe_i32_constant_fold_test_10(ptr addrspace(1) %out) #0 {497; GFX6-LABEL: bfe_i32_constant_fold_test_10:498; GFX6: ; %bb.0:499; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0500; GFX6-NEXT: s_mov_b32 s2, 0x100010501; GFX6-NEXT: s_bfe_i32 s2, 0xffff, s2502; GFX6-NEXT: v_mov_b32_e32 v0, s2503; GFX6-NEXT: s_mov_b32 s2, -1504; GFX6-NEXT: s_mov_b32 s3, 0xf000505; GFX6-NEXT: s_waitcnt lgkmcnt(0)506; GFX6-NEXT: buffer_store_dword v0, off, s[0:3], 0507; GFX6-NEXT: s_endpgm508 %bfe_i32 = call i32 @llvm.amdgcn.sbfe.i32(i32 65535, i32 16, i32 16)509 store i32 %bfe_i32, ptr addrspace(1) %out, align 4510 ret void511}512 513define amdgpu_kernel void @bfe_i32_constant_fold_test_11(ptr addrspace(1) %out) #0 {514; GFX6-LABEL: bfe_i32_constant_fold_test_11:515; GFX6: ; %bb.0:516; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0517; GFX6-NEXT: s_mov_b32 s2, 0x40004518; GFX6-NEXT: s_bfe_i32 s2, 0xa0, s2519; GFX6-NEXT: v_mov_b32_e32 v0, s2520; GFX6-NEXT: s_mov_b32 s2, -1521; GFX6-NEXT: s_mov_b32 s3, 0xf000522; GFX6-NEXT: s_waitcnt lgkmcnt(0)523; GFX6-NEXT: buffer_store_dword v0, off, s[0:3], 0524; GFX6-NEXT: s_endpgm525 %bfe_i32 = call i32 @llvm.amdgcn.sbfe.i32(i32 160, i32 4, i32 4)526 store i32 %bfe_i32, ptr addrspace(1) %out, align 4527 ret void528}529 530define amdgpu_kernel void @bfe_i32_constant_fold_test_12(ptr addrspace(1) %out) #0 {531; GFX6-LABEL: bfe_i32_constant_fold_test_12:532; GFX6: ; %bb.0:533; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0534; GFX6-NEXT: s_mov_b32 s2, 0x1001f535; GFX6-NEXT: s_bfe_i32 s2, 0xa0, s2536; GFX6-NEXT: v_mov_b32_e32 v0, s2537; GFX6-NEXT: s_mov_b32 s2, -1538; GFX6-NEXT: s_mov_b32 s3, 0xf000539; GFX6-NEXT: s_waitcnt lgkmcnt(0)540; GFX6-NEXT: buffer_store_dword v0, off, s[0:3], 0541; GFX6-NEXT: s_endpgm542 %bfe_i32 = call i32 @llvm.amdgcn.sbfe.i32(i32 160, i32 31, i32 1)543 store i32 %bfe_i32, ptr addrspace(1) %out, align 4544 ret void545}546 547define amdgpu_kernel void @bfe_i32_constant_fold_test_13(ptr addrspace(1) %out) #0 {548; GFX6-LABEL: bfe_i32_constant_fold_test_13:549; GFX6: ; %bb.0:550; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0551; GFX6-NEXT: s_mov_b32 s2, 0x100010552; GFX6-NEXT: s_bfe_i32 s2, 0x1fffe, s2553; GFX6-NEXT: v_mov_b32_e32 v0, s2554; GFX6-NEXT: s_mov_b32 s2, -1555; GFX6-NEXT: s_mov_b32 s3, 0xf000556; GFX6-NEXT: s_waitcnt lgkmcnt(0)557; GFX6-NEXT: buffer_store_dword v0, off, s[0:3], 0558; GFX6-NEXT: s_endpgm559 %bfe_i32 = call i32 @llvm.amdgcn.sbfe.i32(i32 131070, i32 16, i32 16)560 store i32 %bfe_i32, ptr addrspace(1) %out, align 4561 ret void562}563 564define amdgpu_kernel void @bfe_i32_constant_fold_test_14(ptr addrspace(1) %out) #0 {565; GFX6-LABEL: bfe_i32_constant_fold_test_14:566; GFX6: ; %bb.0:567; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0568; GFX6-NEXT: s_mov_b32 s2, 0x1e0002569; GFX6-NEXT: s_bfe_i32 s2, 0xa0, s2570; GFX6-NEXT: v_mov_b32_e32 v0, s2571; GFX6-NEXT: s_mov_b32 s2, -1572; GFX6-NEXT: s_mov_b32 s3, 0xf000573; GFX6-NEXT: s_waitcnt lgkmcnt(0)574; GFX6-NEXT: buffer_store_dword v0, off, s[0:3], 0575; GFX6-NEXT: s_endpgm576 %bfe_i32 = call i32 @llvm.amdgcn.sbfe.i32(i32 160, i32 2, i32 30)577 store i32 %bfe_i32, ptr addrspace(1) %out, align 4578 ret void579}580 581define amdgpu_kernel void @bfe_i32_constant_fold_test_15(ptr addrspace(1) %out) #0 {582; GFX6-LABEL: bfe_i32_constant_fold_test_15:583; GFX6: ; %bb.0:584; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0585; GFX6-NEXT: s_mov_b32 s2, 0x1c0004586; GFX6-NEXT: s_bfe_i32 s2, 0xa0, s2587; GFX6-NEXT: v_mov_b32_e32 v0, s2588; GFX6-NEXT: s_mov_b32 s2, -1589; GFX6-NEXT: s_mov_b32 s3, 0xf000590; GFX6-NEXT: s_waitcnt lgkmcnt(0)591; GFX6-NEXT: buffer_store_dword v0, off, s[0:3], 0592; GFX6-NEXT: s_endpgm593 %bfe_i32 = call i32 @llvm.amdgcn.sbfe.i32(i32 160, i32 4, i32 28)594 store i32 %bfe_i32, ptr addrspace(1) %out, align 4595 ret void596}597 598define amdgpu_kernel void @bfe_i32_constant_fold_test_16(ptr addrspace(1) %out) #0 {599; GFX6-LABEL: bfe_i32_constant_fold_test_16:600; GFX6: ; %bb.0:601; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0602; GFX6-NEXT: s_bfe_i32 s2, -1, 0x70001603; GFX6-NEXT: v_mov_b32_e32 v0, s2604; GFX6-NEXT: s_mov_b32 s2, -1605; GFX6-NEXT: s_mov_b32 s3, 0xf000606; GFX6-NEXT: s_waitcnt lgkmcnt(0)607; GFX6-NEXT: buffer_store_dword v0, off, s[0:3], 0608; GFX6-NEXT: s_endpgm609 %bfe_i32 = call i32 @llvm.amdgcn.sbfe.i32(i32 4294967295, i32 1, i32 7)610 store i32 %bfe_i32, ptr addrspace(1) %out, align 4611 ret void612}613 614define amdgpu_kernel void @bfe_i32_constant_fold_test_17(ptr addrspace(1) %out) #0 {615; GFX6-LABEL: bfe_i32_constant_fold_test_17:616; GFX6: ; %bb.0:617; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0618; GFX6-NEXT: s_mov_b32 s2, 0x1f0001619; GFX6-NEXT: s_bfe_i32 s2, 0xff, s2620; GFX6-NEXT: v_mov_b32_e32 v0, s2621; GFX6-NEXT: s_mov_b32 s2, -1622; GFX6-NEXT: s_mov_b32 s3, 0xf000623; GFX6-NEXT: s_waitcnt lgkmcnt(0)624; GFX6-NEXT: buffer_store_dword v0, off, s[0:3], 0625; GFX6-NEXT: s_endpgm626 %bfe_i32 = call i32 @llvm.amdgcn.sbfe.i32(i32 255, i32 1, i32 31)627 store i32 %bfe_i32, ptr addrspace(1) %out, align 4628 ret void629}630 631define amdgpu_kernel void @bfe_i32_constant_fold_test_18(ptr addrspace(1) %out) #0 {632; GFX6-LABEL: bfe_i32_constant_fold_test_18:633; GFX6: ; %bb.0:634; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0635; GFX6-NEXT: s_mov_b32 s2, 0x1001f636; GFX6-NEXT: s_bfe_i32 s2, 0xff, s2637; GFX6-NEXT: v_mov_b32_e32 v0, s2638; GFX6-NEXT: s_mov_b32 s2, -1639; GFX6-NEXT: s_mov_b32 s3, 0xf000640; GFX6-NEXT: s_waitcnt lgkmcnt(0)641; GFX6-NEXT: buffer_store_dword v0, off, s[0:3], 0642; GFX6-NEXT: s_endpgm643 %bfe_i32 = call i32 @llvm.amdgcn.sbfe.i32(i32 255, i32 31, i32 1)644 store i32 %bfe_i32, ptr addrspace(1) %out, align 4645 ret void646}647 648define amdgpu_kernel void @bfe_sext_in_reg_i24(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {649; GFX6-LABEL: bfe_sext_in_reg_i24:650; GFX6: ; %bb.0:651; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0652; GFX6-NEXT: s_waitcnt lgkmcnt(0)653; GFX6-NEXT: s_load_dword s3, s[2:3], 0x0654; GFX6-NEXT: s_mov_b32 s2, -1655; GFX6-NEXT: s_waitcnt lgkmcnt(0)656; GFX6-NEXT: s_bfe_i32 s3, s3, 0x180000657; GFX6-NEXT: s_bfe_i32 s3, s3, 0x180000658; GFX6-NEXT: v_mov_b32_e32 v0, s3659; GFX6-NEXT: s_mov_b32 s3, 0xf000660; GFX6-NEXT: buffer_store_dword v0, off, s[0:3], 0661; GFX6-NEXT: s_endpgm662 %x = load i32, ptr addrspace(1) %in, align 4663 %bfe = call i32 @llvm.amdgcn.sbfe.i32(i32 %x, i32 0, i32 24)664 %shl = shl i32 %bfe, 8665 %ashr = ashr i32 %shl, 8666 store i32 %ashr, ptr addrspace(1) %out, align 4667 ret void668}669 670define amdgpu_kernel void @simplify_demanded_bfe_sdiv(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {671; GFX6-LABEL: simplify_demanded_bfe_sdiv:672; GFX6: ; %bb.0:673; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0674; GFX6-NEXT: s_waitcnt lgkmcnt(0)675; GFX6-NEXT: s_load_dword s3, s[2:3], 0x0676; GFX6-NEXT: s_mov_b32 s2, -1677; GFX6-NEXT: s_waitcnt lgkmcnt(0)678; GFX6-NEXT: s_bfe_i32 s3, s3, 0x100001679; GFX6-NEXT: s_ashr_i32 s4, s3, 31680; GFX6-NEXT: s_lshr_b32 s4, s4, 31681; GFX6-NEXT: s_add_i32 s3, s3, s4682; GFX6-NEXT: s_ashr_i32 s3, s3, 1683; GFX6-NEXT: v_mov_b32_e32 v0, s3684; GFX6-NEXT: s_mov_b32 s3, 0xf000685; GFX6-NEXT: buffer_store_dword v0, off, s[0:3], 0686; GFX6-NEXT: s_endpgm687 %src = load i32, ptr addrspace(1) %in, align 4688 %bfe = call i32 @llvm.amdgcn.sbfe.i32(i32 %src, i32 1, i32 16)689 %div = sdiv i32 %bfe, 2690 store i32 %div, ptr addrspace(1) %out, align 4691 ret void692}693 694define amdgpu_kernel void @bfe_0_width(ptr addrspace(1) %out, ptr addrspace(1) %ptr) #0 {695; GFX6-LABEL: bfe_0_width:696; GFX6: ; %bb.0:697; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0698; GFX6-NEXT: s_waitcnt lgkmcnt(0)699; GFX6-NEXT: s_load_dword s3, s[2:3], 0x0700; GFX6-NEXT: s_mov_b32 s2, -1701; GFX6-NEXT: s_waitcnt lgkmcnt(0)702; GFX6-NEXT: s_bfe_i32 s3, s3, 8703; GFX6-NEXT: v_mov_b32_e32 v0, s3704; GFX6-NEXT: s_mov_b32 s3, 0xf000705; GFX6-NEXT: buffer_store_dword v0, off, s[0:3], 0706; GFX6-NEXT: s_endpgm707 %load = load i32, ptr addrspace(1) %ptr, align 4708 %bfe = call i32 @llvm.amdgcn.sbfe.i32(i32 %load, i32 8, i32 0)709 store i32 %bfe, ptr addrspace(1) %out, align 4710 ret void711}712 713define amdgpu_kernel void @bfe_8_bfe_8(ptr addrspace(1) %out, ptr addrspace(1) %ptr) #0 {714; GFX6-LABEL: bfe_8_bfe_8:715; GFX6: ; %bb.0:716; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0717; GFX6-NEXT: s_waitcnt lgkmcnt(0)718; GFX6-NEXT: s_load_dword s3, s[2:3], 0x0719; GFX6-NEXT: s_mov_b32 s2, -1720; GFX6-NEXT: s_waitcnt lgkmcnt(0)721; GFX6-NEXT: s_bfe_i32 s3, s3, 0x80000722; GFX6-NEXT: s_bfe_i32 s3, s3, 0x80000723; GFX6-NEXT: v_mov_b32_e32 v0, s3724; GFX6-NEXT: s_mov_b32 s3, 0xf000725; GFX6-NEXT: buffer_store_dword v0, off, s[0:3], 0726; GFX6-NEXT: s_endpgm727 %load = load i32, ptr addrspace(1) %ptr, align 4728 %bfe0 = call i32 @llvm.amdgcn.sbfe.i32(i32 %load, i32 0, i32 8)729 %bfe1 = call i32 @llvm.amdgcn.sbfe.i32(i32 %bfe0, i32 0, i32 8)730 store i32 %bfe1, ptr addrspace(1) %out, align 4731 ret void732}733 734define amdgpu_kernel void @bfe_8_bfe_16(ptr addrspace(1) %out, ptr addrspace(1) %ptr) #0 {735; GFX6-LABEL: bfe_8_bfe_16:736; GFX6: ; %bb.0:737; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0738; GFX6-NEXT: s_waitcnt lgkmcnt(0)739; GFX6-NEXT: s_load_dword s3, s[2:3], 0x0740; GFX6-NEXT: s_mov_b32 s2, -1741; GFX6-NEXT: s_waitcnt lgkmcnt(0)742; GFX6-NEXT: s_bfe_i32 s3, s3, 0x80000743; GFX6-NEXT: s_bfe_i32 s3, s3, 0x100000744; GFX6-NEXT: v_mov_b32_e32 v0, s3745; GFX6-NEXT: s_mov_b32 s3, 0xf000746; GFX6-NEXT: buffer_store_dword v0, off, s[0:3], 0747; GFX6-NEXT: s_endpgm748 %load = load i32, ptr addrspace(1) %ptr, align 4749 %bfe0 = call i32 @llvm.amdgcn.sbfe.i32(i32 %load, i32 0, i32 8)750 %bfe1 = call i32 @llvm.amdgcn.sbfe.i32(i32 %bfe0, i32 0, i32 16)751 store i32 %bfe1, ptr addrspace(1) %out, align 4752 ret void753}754 755; This really should be folded into 1756define amdgpu_kernel void @bfe_16_bfe_8(ptr addrspace(1) %out, ptr addrspace(1) %ptr) #0 {757; GFX6-LABEL: bfe_16_bfe_8:758; GFX6: ; %bb.0:759; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0760; GFX6-NEXT: s_waitcnt lgkmcnt(0)761; GFX6-NEXT: s_load_dword s3, s[2:3], 0x0762; GFX6-NEXT: s_mov_b32 s2, -1763; GFX6-NEXT: s_waitcnt lgkmcnt(0)764; GFX6-NEXT: s_bfe_i32 s3, s3, 0x100000765; GFX6-NEXT: s_bfe_i32 s3, s3, 0x80000766; GFX6-NEXT: v_mov_b32_e32 v0, s3767; GFX6-NEXT: s_mov_b32 s3, 0xf000768; GFX6-NEXT: buffer_store_dword v0, off, s[0:3], 0769; GFX6-NEXT: s_endpgm770 %load = load i32, ptr addrspace(1) %ptr, align 4771 %bfe0 = call i32 @llvm.amdgcn.sbfe.i32(i32 %load, i32 0, i32 16)772 %bfe1 = call i32 @llvm.amdgcn.sbfe.i32(i32 %bfe0, i32 0, i32 8)773 store i32 %bfe1, ptr addrspace(1) %out, align 4774 ret void775}776 777; Make sure there isn't a redundant BFE778define amdgpu_kernel void @sext_in_reg_i8_to_i32_bfe(ptr addrspace(1) %out, i32 %a, i32 %b) #0 {779; GFX6-LABEL: sext_in_reg_i8_to_i32_bfe:780; GFX6: ; %bb.0:781; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0782; GFX6-NEXT: s_waitcnt lgkmcnt(0)783; GFX6-NEXT: s_add_i32 s3, s2, s3784; GFX6-NEXT: s_bfe_i32 s3, s3, 0x80000785; GFX6-NEXT: s_sext_i32_i8 s3, s3786; GFX6-NEXT: s_mov_b32 s2, -1787; GFX6-NEXT: v_mov_b32_e32 v0, s3788; GFX6-NEXT: s_mov_b32 s3, 0xf000789; GFX6-NEXT: buffer_store_dword v0, off, s[0:3], 0790; GFX6-NEXT: s_endpgm791 %c = add i32 %a, %b ; add to prevent folding into extload792 %bfe = call i32 @llvm.amdgcn.sbfe.i32(i32 %c, i32 0, i32 8)793 %shl = shl i32 %bfe, 24794 %ashr = ashr i32 %shl, 24795 store i32 %ashr, ptr addrspace(1) %out, align 4796 ret void797}798 799define amdgpu_kernel void @sext_in_reg_i8_to_i32_bfe_wrong(ptr addrspace(1) %out, i32 %a, i32 %b) #0 {800; GFX6-LABEL: sext_in_reg_i8_to_i32_bfe_wrong:801; GFX6: ; %bb.0:802; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0803; GFX6-NEXT: s_waitcnt lgkmcnt(0)804; GFX6-NEXT: s_add_i32 s3, s2, s3805; GFX6-NEXT: s_bfe_i32 s3, s3, 8806; GFX6-NEXT: s_sext_i32_i8 s3, s3807; GFX6-NEXT: s_mov_b32 s2, -1808; GFX6-NEXT: v_mov_b32_e32 v0, s3809; GFX6-NEXT: s_mov_b32 s3, 0xf000810; GFX6-NEXT: buffer_store_dword v0, off, s[0:3], 0811; GFX6-NEXT: s_endpgm812 %c = add i32 %a, %b ; add to prevent folding into extload813 %bfe = call i32 @llvm.amdgcn.sbfe.i32(i32 %c, i32 8, i32 0)814 %shl = shl i32 %bfe, 24815 %ashr = ashr i32 %shl, 24816 store i32 %ashr, ptr addrspace(1) %out, align 4817 ret void818}819 820define amdgpu_kernel void @sextload_i8_to_i32_bfe(ptr addrspace(1) %out, ptr addrspace(1) %ptr) #0 {821; GFX6-LABEL: sextload_i8_to_i32_bfe:822; GFX6: ; %bb.0:823; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0824; GFX6-NEXT: s_mov_b32 s6, -1825; GFX6-NEXT: s_mov_b32 s7, 0xf000826; GFX6-NEXT: s_waitcnt lgkmcnt(0)827; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3]828; GFX6-NEXT: buffer_load_sbyte v0, off, s[4:7], 0829; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7]830; GFX6-NEXT: s_waitcnt vmcnt(0)831; GFX6-NEXT: v_bfe_i32 v0, v0, 0, 8832; GFX6-NEXT: v_bfe_i32 v0, v0, 0, 8833; GFX6-NEXT: buffer_store_dword v0, off, s[0:3], 0834; GFX6-NEXT: s_endpgm835 %load = load i8, ptr addrspace(1) %ptr, align 1836 %sext = sext i8 %load to i32837 %bfe = call i32 @llvm.amdgcn.sbfe.i32(i32 %sext, i32 0, i32 8)838 %shl = shl i32 %bfe, 24839 %ashr = ashr i32 %shl, 24840 store i32 %ashr, ptr addrspace(1) %out, align 4841 ret void842}843 844define amdgpu_kernel void @sextload_i8_to_i32_bfe_0(ptr addrspace(1) %out, ptr addrspace(1) %ptr) #0 {845; GFX6-LABEL: sextload_i8_to_i32_bfe_0:846; GFX6: ; %bb.0:847; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0848; GFX6-NEXT: s_mov_b32 s6, -1849; GFX6-NEXT: s_mov_b32 s7, 0xf000850; GFX6-NEXT: s_waitcnt lgkmcnt(0)851; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3]852; GFX6-NEXT: buffer_load_sbyte v0, off, s[4:7], 0853; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7]854; GFX6-NEXT: s_waitcnt vmcnt(0)855; GFX6-NEXT: v_bfe_i32 v0, v0, 8, 0856; GFX6-NEXT: v_bfe_i32 v0, v0, 0, 8857; GFX6-NEXT: buffer_store_dword v0, off, s[0:3], 0858; GFX6-NEXT: s_endpgm859 %load = load i8, ptr addrspace(1) %ptr, align 1860 %sext = sext i8 %load to i32861 %bfe = call i32 @llvm.amdgcn.sbfe.i32(i32 %sext, i32 8, i32 0)862 %shl = shl i32 %bfe, 24863 %ashr = ashr i32 %shl, 24864 store i32 %ashr, ptr addrspace(1) %out, align 4865 ret void866}867 868define amdgpu_kernel void @sext_in_reg_i1_bfe_offset_0(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {869; GFX6-LABEL: sext_in_reg_i1_bfe_offset_0:870; GFX6: ; %bb.0:871; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0872; GFX6-NEXT: s_waitcnt lgkmcnt(0)873; GFX6-NEXT: s_load_dword s3, s[2:3], 0x0874; GFX6-NEXT: s_mov_b32 s2, -1875; GFX6-NEXT: s_waitcnt lgkmcnt(0)876; GFX6-NEXT: s_bfe_i32 s3, s3, 0x10000877; GFX6-NEXT: s_bfe_i32 s3, s3, 0x10000878; GFX6-NEXT: v_mov_b32_e32 v0, s3879; GFX6-NEXT: s_mov_b32 s3, 0xf000880; GFX6-NEXT: buffer_store_dword v0, off, s[0:3], 0881; GFX6-NEXT: s_endpgm882 %x = load i32, ptr addrspace(1) %in, align 4883 %shl = shl i32 %x, 31884 %shr = ashr i32 %shl, 31885 %bfe = call i32 @llvm.amdgcn.sbfe.i32(i32 %shr, i32 0, i32 1)886 store i32 %bfe, ptr addrspace(1) %out, align 4887 ret void888}889 890define amdgpu_kernel void @sext_in_reg_i1_bfe_offset_1(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {891; GFX6-LABEL: sext_in_reg_i1_bfe_offset_1:892; GFX6: ; %bb.0:893; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0894; GFX6-NEXT: s_waitcnt lgkmcnt(0)895; GFX6-NEXT: s_load_dword s3, s[2:3], 0x0896; GFX6-NEXT: s_mov_b32 s2, -1897; GFX6-NEXT: s_waitcnt lgkmcnt(0)898; GFX6-NEXT: s_bfe_i32 s3, s3, 0x20000899; GFX6-NEXT: s_bfe_i32 s3, s3, 0x10001900; GFX6-NEXT: v_mov_b32_e32 v0, s3901; GFX6-NEXT: s_mov_b32 s3, 0xf000902; GFX6-NEXT: buffer_store_dword v0, off, s[0:3], 0903; GFX6-NEXT: s_endpgm904 %x = load i32, ptr addrspace(1) %in, align 4905 %shl = shl i32 %x, 30906 %shr = ashr i32 %shl, 30907 %bfe = call i32 @llvm.amdgcn.sbfe.i32(i32 %shr, i32 1, i32 1)908 store i32 %bfe, ptr addrspace(1) %out, align 4909 ret void910}911 912define amdgpu_kernel void @sext_in_reg_i2_bfe_offset_1(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {913; GFX6-LABEL: sext_in_reg_i2_bfe_offset_1:914; GFX6: ; %bb.0:915; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0916; GFX6-NEXT: s_waitcnt lgkmcnt(0)917; GFX6-NEXT: s_load_dword s3, s[2:3], 0x0918; GFX6-NEXT: s_mov_b32 s2, -1919; GFX6-NEXT: s_waitcnt lgkmcnt(0)920; GFX6-NEXT: s_bfe_i32 s3, s3, 0x20000921; GFX6-NEXT: s_bfe_i32 s3, s3, 0x20001922; GFX6-NEXT: v_mov_b32_e32 v0, s3923; GFX6-NEXT: s_mov_b32 s3, 0xf000924; GFX6-NEXT: buffer_store_dword v0, off, s[0:3], 0925; GFX6-NEXT: s_endpgm926 %x = load i32, ptr addrspace(1) %in, align 4927 %shl = shl i32 %x, 30928 %shr = ashr i32 %shl, 30929 %bfe = call i32 @llvm.amdgcn.sbfe.i32(i32 %shr, i32 1, i32 2)930 store i32 %bfe, ptr addrspace(1) %out, align 4931 ret void932}933 934declare i32 @llvm.amdgcn.sbfe.i32(i32, i32, i32) #1935declare i64 @llvm.amdgcn.sbfe.i64(i64, i32, i32) #1936 937attributes #0 = { nounwind }938attributes #1 = { nounwind readnone }939