710 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=amdgcn -mcpu=gfx900 < %s | FileCheck -enable-var-scope --check-prefix=GFX9 %s3; RUN: llc -mtriple=amdgcn -mcpu=tonga < %s | FileCheck -enable-var-scope --check-prefix=VI %s4; RUN: llc -mtriple=amdgcn -mcpu=bonaire < %s | FileCheck -enable-var-scope --check-prefix=CI %s5; RUN: llc -mtriple=amdgcn -mcpu=gfx1010 < %s | FileCheck -enable-var-scope --check-prefix=GFX10 %s6; RUN: llc -mtriple=amdgcn -mcpu=gfx1100 < %s | FileCheck -enable-var-scope --check-prefix=GFX11 %s7 8define amdgpu_kernel void @s_lshr_v2i16(ptr addrspace(1) %out, <2 x i16> %lhs, <2 x i16> %rhs) #0 {9; GFX9-LABEL: s_lshr_v2i16:10; GFX9: ; %bb.0:11; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x2412; GFX9-NEXT: v_mov_b32_e32 v0, 013; GFX9-NEXT: s_waitcnt lgkmcnt(0)14; GFX9-NEXT: v_mov_b32_e32 v1, s215; GFX9-NEXT: v_pk_lshrrev_b16 v1, s3, v116; GFX9-NEXT: global_store_dword v0, v1, s[0:1]17; GFX9-NEXT: s_endpgm18;19; VI-LABEL: s_lshr_v2i16:20; VI: ; %bb.0:21; VI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x2422; VI-NEXT: s_waitcnt lgkmcnt(0)23; VI-NEXT: s_lshr_b32 s4, s3, 1624; VI-NEXT: s_lshr_b32 s5, s2, 1625; VI-NEXT: s_and_b32 s2, s2, 0xffff26; VI-NEXT: s_lshr_b32 s4, s5, s427; VI-NEXT: s_lshr_b32 s2, s2, s328; VI-NEXT: s_lshl_b32 s3, s4, 1629; VI-NEXT: s_or_b32 s2, s2, s330; VI-NEXT: v_mov_b32_e32 v0, s031; VI-NEXT: v_mov_b32_e32 v1, s132; VI-NEXT: v_mov_b32_e32 v2, s233; VI-NEXT: flat_store_dword v[0:1], v234; VI-NEXT: s_endpgm35;36; CI-LABEL: s_lshr_v2i16:37; CI: ; %bb.0:38; CI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x939; CI-NEXT: s_waitcnt lgkmcnt(0)40; CI-NEXT: s_mov_b64 s[4:5], s[2:3]41; CI-NEXT: s_and_b32 s6, s4, 0xffff42; CI-NEXT: s_lshr_b32 s4, s4, 1643; CI-NEXT: s_lshr_b32 s7, s5, 1644; CI-NEXT: s_lshr_b32 s4, s4, s745; CI-NEXT: s_lshl_b32 s4, s4, 1646; CI-NEXT: s_lshr_b32 s5, s6, s547; CI-NEXT: s_or_b32 s4, s5, s448; CI-NEXT: s_mov_b32 s3, 0xf00049; CI-NEXT: s_mov_b32 s2, -150; CI-NEXT: v_mov_b32_e32 v0, s451; CI-NEXT: buffer_store_dword v0, off, s[0:3], 052; CI-NEXT: s_endpgm53;54; GFX10-LABEL: s_lshr_v2i16:55; GFX10: ; %bb.0:56; GFX10-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x2457; GFX10-NEXT: v_mov_b32_e32 v0, 058; GFX10-NEXT: s_waitcnt lgkmcnt(0)59; GFX10-NEXT: v_pk_lshrrev_b16 v1, s3, s260; GFX10-NEXT: global_store_dword v0, v1, s[0:1]61; GFX10-NEXT: s_endpgm62;63; GFX11-LABEL: s_lshr_v2i16:64; GFX11: ; %bb.0:65; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x2466; GFX11-NEXT: v_mov_b32_e32 v0, 067; GFX11-NEXT: s_waitcnt lgkmcnt(0)68; GFX11-NEXT: v_pk_lshrrev_b16 v1, s3, s269; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]70; GFX11-NEXT: s_endpgm71 %result = lshr <2 x i16> %lhs, %rhs72 store <2 x i16> %result, ptr addrspace(1) %out73 ret void74}75 76define amdgpu_kernel void @v_lshr_v2i16(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {77; GFX9-LABEL: v_lshr_v2i16:78; GFX9: ; %bb.0:79; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x2480; GFX9-NEXT: v_lshlrev_b32_e32 v2, 2, v081; GFX9-NEXT: s_waitcnt lgkmcnt(0)82; GFX9-NEXT: global_load_dwordx2 v[0:1], v2, s[2:3]83; GFX9-NEXT: s_waitcnt vmcnt(0)84; GFX9-NEXT: v_pk_lshrrev_b16 v0, v1, v085; GFX9-NEXT: global_store_dword v2, v0, s[0:1]86; GFX9-NEXT: s_endpgm87;88; VI-LABEL: v_lshr_v2i16:89; VI: ; %bb.0:90; VI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x2491; VI-NEXT: v_lshlrev_b32_e32 v2, 2, v092; VI-NEXT: s_waitcnt lgkmcnt(0)93; VI-NEXT: v_mov_b32_e32 v1, s394; VI-NEXT: v_add_u32_e32 v0, vcc, s2, v295; VI-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc96; VI-NEXT: flat_load_dwordx2 v[0:1], v[0:1]97; VI-NEXT: v_mov_b32_e32 v3, s198; VI-NEXT: v_add_u32_e32 v2, vcc, s0, v299; VI-NEXT: v_addc_u32_e32 v3, vcc, 0, v3, vcc100; VI-NEXT: s_waitcnt vmcnt(0)101; VI-NEXT: v_lshrrev_b16_e32 v4, v1, v0102; VI-NEXT: v_lshrrev_b16_sdwa v0, v1, v0 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1103; VI-NEXT: v_or_b32_e32 v0, v4, v0104; VI-NEXT: flat_store_dword v[2:3], v0105; VI-NEXT: s_endpgm106;107; CI-LABEL: v_lshr_v2i16:108; CI: ; %bb.0:109; CI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9110; CI-NEXT: s_mov_b32 s7, 0xf000111; CI-NEXT: s_mov_b32 s6, 0112; CI-NEXT: v_lshlrev_b32_e32 v0, 2, v0113; CI-NEXT: v_mov_b32_e32 v1, 0114; CI-NEXT: s_waitcnt lgkmcnt(0)115; CI-NEXT: s_mov_b64 s[4:5], s[2:3]116; CI-NEXT: buffer_load_dwordx2 v[2:3], v[0:1], s[4:7], 0 addr64117; CI-NEXT: s_mov_b64 s[2:3], s[6:7]118; CI-NEXT: s_waitcnt vmcnt(0)119; CI-NEXT: v_lshrrev_b32_e32 v4, 16, v2120; CI-NEXT: v_and_b32_e32 v2, 0xffff, v2121; CI-NEXT: v_lshrrev_b32_e32 v5, 16, v3122; CI-NEXT: v_lshrrev_b32_e32 v2, v3, v2123; CI-NEXT: v_lshrrev_b32_e32 v3, v5, v4124; CI-NEXT: v_lshlrev_b32_e32 v3, 16, v3125; CI-NEXT: v_or_b32_e32 v2, v2, v3126; CI-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr64127; CI-NEXT: s_endpgm128;129; GFX10-LABEL: v_lshr_v2i16:130; GFX10: ; %bb.0:131; GFX10-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24132; GFX10-NEXT: v_lshlrev_b32_e32 v2, 2, v0133; GFX10-NEXT: s_waitcnt lgkmcnt(0)134; GFX10-NEXT: global_load_dwordx2 v[0:1], v2, s[2:3]135; GFX10-NEXT: s_waitcnt vmcnt(0)136; GFX10-NEXT: v_pk_lshrrev_b16 v0, v1, v0137; GFX10-NEXT: global_store_dword v2, v0, s[0:1]138; GFX10-NEXT: s_endpgm139;140; GFX11-LABEL: v_lshr_v2i16:141; GFX11: ; %bb.0:142; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x24143; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v0144; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)145; GFX11-NEXT: v_lshlrev_b32_e32 v2, 2, v0146; GFX11-NEXT: s_waitcnt lgkmcnt(0)147; GFX11-NEXT: global_load_b64 v[0:1], v2, s[2:3]148; GFX11-NEXT: s_waitcnt vmcnt(0)149; GFX11-NEXT: v_pk_lshrrev_b16 v0, v1, v0150; GFX11-NEXT: global_store_b32 v2, v0, s[0:1]151; GFX11-NEXT: s_endpgm152 %tid = call i32 @llvm.amdgcn.workitem.id.x()153 %tid.ext = sext i32 %tid to i64154 %in.gep = getelementptr inbounds <2 x i16>, ptr addrspace(1) %in, i64 %tid.ext155 %out.gep = getelementptr inbounds <2 x i16>, ptr addrspace(1) %out, i64 %tid.ext156 %b_ptr = getelementptr <2 x i16>, ptr addrspace(1) %in.gep, i32 1157 %a = load <2 x i16>, ptr addrspace(1) %in.gep158 %b = load <2 x i16>, ptr addrspace(1) %b_ptr159 %result = lshr <2 x i16> %a, %b160 store <2 x i16> %result, ptr addrspace(1) %out.gep161 ret void162}163 164define amdgpu_kernel void @lshr_v_s_v2i16(ptr addrspace(1) %out, ptr addrspace(1) %in, <2 x i16> %sgpr) #0 {165; GFX9-LABEL: lshr_v_s_v2i16:166; GFX9: ; %bb.0:167; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24168; GFX9-NEXT: s_load_dword s6, s[4:5], 0x34169; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0170; GFX9-NEXT: s_waitcnt lgkmcnt(0)171; GFX9-NEXT: global_load_dword v1, v0, s[2:3]172; GFX9-NEXT: s_waitcnt vmcnt(0)173; GFX9-NEXT: v_pk_lshrrev_b16 v1, s6, v1174; GFX9-NEXT: global_store_dword v0, v1, s[0:1]175; GFX9-NEXT: s_endpgm176;177; VI-LABEL: lshr_v_s_v2i16:178; VI: ; %bb.0:179; VI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24180; VI-NEXT: s_load_dword s4, s[4:5], 0x34181; VI-NEXT: v_lshlrev_b32_e32 v2, 2, v0182; VI-NEXT: s_waitcnt lgkmcnt(0)183; VI-NEXT: v_mov_b32_e32 v1, s3184; VI-NEXT: v_add_u32_e32 v0, vcc, s2, v2185; VI-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc186; VI-NEXT: flat_load_dword v3, v[0:1]187; VI-NEXT: v_mov_b32_e32 v1, s1188; VI-NEXT: s_lshr_b32 s1, s4, 16189; VI-NEXT: v_add_u32_e32 v0, vcc, s0, v2190; VI-NEXT: v_mov_b32_e32 v2, s1191; VI-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc192; VI-NEXT: s_waitcnt vmcnt(0)193; VI-NEXT: v_lshrrev_b16_e32 v4, s4, v3194; VI-NEXT: v_lshrrev_b16_sdwa v2, v2, v3 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1195; VI-NEXT: v_or_b32_e32 v2, v4, v2196; VI-NEXT: flat_store_dword v[0:1], v2197; VI-NEXT: s_endpgm198;199; CI-LABEL: lshr_v_s_v2i16:200; CI: ; %bb.0:201; CI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9202; CI-NEXT: s_load_dword s8, s[4:5], 0xd203; CI-NEXT: s_mov_b32 s7, 0xf000204; CI-NEXT: s_mov_b32 s6, 0205; CI-NEXT: v_lshlrev_b32_e32 v0, 2, v0206; CI-NEXT: s_waitcnt lgkmcnt(0)207; CI-NEXT: s_mov_b64 s[4:5], s[2:3]208; CI-NEXT: v_mov_b32_e32 v1, 0209; CI-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr64210; CI-NEXT: s_lshr_b32 s4, s8, 16211; CI-NEXT: s_mov_b64 s[2:3], s[6:7]212; CI-NEXT: s_waitcnt vmcnt(0)213; CI-NEXT: v_lshrrev_b32_e32 v3, 16, v2214; CI-NEXT: v_and_b32_e32 v2, 0xffff, v2215; CI-NEXT: v_lshrrev_b32_e32 v3, s4, v3216; CI-NEXT: v_lshrrev_b32_e32 v2, s8, v2217; CI-NEXT: v_lshlrev_b32_e32 v3, 16, v3218; CI-NEXT: v_or_b32_e32 v2, v2, v3219; CI-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr64220; CI-NEXT: s_endpgm221;222; GFX10-LABEL: lshr_v_s_v2i16:223; GFX10: ; %bb.0:224; GFX10-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24225; GFX10-NEXT: v_lshlrev_b32_e32 v0, 2, v0226; GFX10-NEXT: s_load_dword s4, s[4:5], 0x34227; GFX10-NEXT: s_waitcnt lgkmcnt(0)228; GFX10-NEXT: global_load_dword v1, v0, s[2:3]229; GFX10-NEXT: s_waitcnt vmcnt(0)230; GFX10-NEXT: v_pk_lshrrev_b16 v1, s4, v1231; GFX10-NEXT: global_store_dword v0, v1, s[0:1]232; GFX10-NEXT: s_endpgm233;234; GFX11-LABEL: lshr_v_s_v2i16:235; GFX11: ; %bb.0:236; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x24237; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v0238; GFX11-NEXT: s_load_b32 s4, s[4:5], 0x34239; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)240; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0241; GFX11-NEXT: s_waitcnt lgkmcnt(0)242; GFX11-NEXT: global_load_b32 v1, v0, s[2:3]243; GFX11-NEXT: s_waitcnt vmcnt(0)244; GFX11-NEXT: v_pk_lshrrev_b16 v1, s4, v1245; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]246; GFX11-NEXT: s_endpgm247 %tid = call i32 @llvm.amdgcn.workitem.id.x()248 %tid.ext = sext i32 %tid to i64249 %in.gep = getelementptr inbounds <2 x i16>, ptr addrspace(1) %in, i64 %tid.ext250 %out.gep = getelementptr inbounds <2 x i16>, ptr addrspace(1) %out, i64 %tid.ext251 %vgpr = load <2 x i16>, ptr addrspace(1) %in.gep252 %result = lshr <2 x i16> %vgpr, %sgpr253 store <2 x i16> %result, ptr addrspace(1) %out.gep254 ret void255}256 257define amdgpu_kernel void @lshr_s_v_v2i16(ptr addrspace(1) %out, ptr addrspace(1) %in, <2 x i16> %sgpr) #0 {258; GFX9-LABEL: lshr_s_v_v2i16:259; GFX9: ; %bb.0:260; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24261; GFX9-NEXT: s_load_dword s6, s[4:5], 0x34262; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0263; GFX9-NEXT: s_waitcnt lgkmcnt(0)264; GFX9-NEXT: global_load_dword v1, v0, s[2:3]265; GFX9-NEXT: s_waitcnt vmcnt(0)266; GFX9-NEXT: v_pk_lshrrev_b16 v1, v1, s6267; GFX9-NEXT: global_store_dword v0, v1, s[0:1]268; GFX9-NEXT: s_endpgm269;270; VI-LABEL: lshr_s_v_v2i16:271; VI: ; %bb.0:272; VI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24273; VI-NEXT: s_load_dword s4, s[4:5], 0x34274; VI-NEXT: v_lshlrev_b32_e32 v2, 2, v0275; VI-NEXT: s_waitcnt lgkmcnt(0)276; VI-NEXT: v_mov_b32_e32 v1, s3277; VI-NEXT: v_add_u32_e32 v0, vcc, s2, v2278; VI-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc279; VI-NEXT: flat_load_dword v3, v[0:1]280; VI-NEXT: v_mov_b32_e32 v1, s1281; VI-NEXT: s_lshr_b32 s1, s4, 16282; VI-NEXT: v_add_u32_e32 v0, vcc, s0, v2283; VI-NEXT: v_mov_b32_e32 v2, s1284; VI-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc285; VI-NEXT: s_waitcnt vmcnt(0)286; VI-NEXT: v_lshrrev_b16_e64 v4, v3, s4287; VI-NEXT: v_lshrrev_b16_sdwa v2, v3, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD288; VI-NEXT: v_or_b32_e32 v2, v4, v2289; VI-NEXT: flat_store_dword v[0:1], v2290; VI-NEXT: s_endpgm291;292; CI-LABEL: lshr_s_v_v2i16:293; CI: ; %bb.0:294; CI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9295; CI-NEXT: s_load_dword s8, s[4:5], 0xd296; CI-NEXT: s_mov_b32 s7, 0xf000297; CI-NEXT: s_mov_b32 s6, 0298; CI-NEXT: v_lshlrev_b32_e32 v0, 2, v0299; CI-NEXT: s_waitcnt lgkmcnt(0)300; CI-NEXT: s_mov_b64 s[4:5], s[2:3]301; CI-NEXT: v_mov_b32_e32 v1, 0302; CI-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr64303; CI-NEXT: s_lshr_b32 s4, s8, 16304; CI-NEXT: s_and_b32 s5, s8, 0xffff305; CI-NEXT: s_mov_b64 s[2:3], s[6:7]306; CI-NEXT: s_waitcnt vmcnt(0)307; CI-NEXT: v_lshrrev_b32_e32 v3, 16, v2308; CI-NEXT: v_lshr_b32_e32 v3, s4, v3309; CI-NEXT: v_lshr_b32_e32 v2, s5, v2310; CI-NEXT: v_lshlrev_b32_e32 v3, 16, v3311; CI-NEXT: v_or_b32_e32 v2, v2, v3312; CI-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr64313; CI-NEXT: s_endpgm314;315; GFX10-LABEL: lshr_s_v_v2i16:316; GFX10: ; %bb.0:317; GFX10-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24318; GFX10-NEXT: v_lshlrev_b32_e32 v0, 2, v0319; GFX10-NEXT: s_load_dword s4, s[4:5], 0x34320; GFX10-NEXT: s_waitcnt lgkmcnt(0)321; GFX10-NEXT: global_load_dword v1, v0, s[2:3]322; GFX10-NEXT: s_waitcnt vmcnt(0)323; GFX10-NEXT: v_pk_lshrrev_b16 v1, v1, s4324; GFX10-NEXT: global_store_dword v0, v1, s[0:1]325; GFX10-NEXT: s_endpgm326;327; GFX11-LABEL: lshr_s_v_v2i16:328; GFX11: ; %bb.0:329; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x24330; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v0331; GFX11-NEXT: s_load_b32 s4, s[4:5], 0x34332; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)333; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0334; GFX11-NEXT: s_waitcnt lgkmcnt(0)335; GFX11-NEXT: global_load_b32 v1, v0, s[2:3]336; GFX11-NEXT: s_waitcnt vmcnt(0)337; GFX11-NEXT: v_pk_lshrrev_b16 v1, v1, s4338; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]339; GFX11-NEXT: s_endpgm340 %tid = call i32 @llvm.amdgcn.workitem.id.x()341 %tid.ext = sext i32 %tid to i64342 %in.gep = getelementptr inbounds <2 x i16>, ptr addrspace(1) %in, i64 %tid.ext343 %out.gep = getelementptr inbounds <2 x i16>, ptr addrspace(1) %out, i64 %tid.ext344 %vgpr = load <2 x i16>, ptr addrspace(1) %in.gep345 %result = lshr <2 x i16> %sgpr, %vgpr346 store <2 x i16> %result, ptr addrspace(1) %out.gep347 ret void348}349 350define amdgpu_kernel void @lshr_imm_v_v2i16(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {351; GFX9-LABEL: lshr_imm_v_v2i16:352; GFX9: ; %bb.0:353; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24354; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0355; GFX9-NEXT: s_waitcnt lgkmcnt(0)356; GFX9-NEXT: global_load_dword v1, v0, s[2:3]357; GFX9-NEXT: s_waitcnt vmcnt(0)358; GFX9-NEXT: v_pk_lshrrev_b16 v1, v1, 8 op_sel_hi:[1,0]359; GFX9-NEXT: global_store_dword v0, v1, s[0:1]360; GFX9-NEXT: s_endpgm361;362; VI-LABEL: lshr_imm_v_v2i16:363; VI: ; %bb.0:364; VI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24365; VI-NEXT: v_lshlrev_b32_e32 v2, 2, v0366; VI-NEXT: v_mov_b32_e32 v4, 8367; VI-NEXT: s_waitcnt lgkmcnt(0)368; VI-NEXT: v_mov_b32_e32 v1, s3369; VI-NEXT: v_add_u32_e32 v0, vcc, s2, v2370; VI-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc371; VI-NEXT: flat_load_dword v3, v[0:1]372; VI-NEXT: v_mov_b32_e32 v1, s1373; VI-NEXT: v_add_u32_e32 v0, vcc, s0, v2374; VI-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc375; VI-NEXT: s_waitcnt vmcnt(0)376; VI-NEXT: v_lshrrev_b16_e64 v2, v3, 8377; VI-NEXT: v_lshrrev_b16_sdwa v3, v3, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD378; VI-NEXT: v_or_b32_e32 v2, v2, v3379; VI-NEXT: flat_store_dword v[0:1], v2380; VI-NEXT: s_endpgm381;382; CI-LABEL: lshr_imm_v_v2i16:383; CI: ; %bb.0:384; CI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9385; CI-NEXT: s_mov_b32 s7, 0xf000386; CI-NEXT: s_mov_b32 s6, 0387; CI-NEXT: v_lshlrev_b32_e32 v0, 2, v0388; CI-NEXT: v_mov_b32_e32 v1, 0389; CI-NEXT: s_waitcnt lgkmcnt(0)390; CI-NEXT: s_mov_b64 s[4:5], s[2:3]391; CI-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr64392; CI-NEXT: s_mov_b64 s[2:3], s[6:7]393; CI-NEXT: s_waitcnt vmcnt(0)394; CI-NEXT: v_lshrrev_b32_e32 v3, 16, v2395; CI-NEXT: v_lshr_b32_e32 v3, 8, v3396; CI-NEXT: v_lshr_b32_e32 v2, 8, v2397; CI-NEXT: v_lshlrev_b32_e32 v3, 16, v3398; CI-NEXT: v_or_b32_e32 v2, v2, v3399; CI-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr64400; CI-NEXT: s_endpgm401;402; GFX10-LABEL: lshr_imm_v_v2i16:403; GFX10: ; %bb.0:404; GFX10-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24405; GFX10-NEXT: v_lshlrev_b32_e32 v0, 2, v0406; GFX10-NEXT: s_waitcnt lgkmcnt(0)407; GFX10-NEXT: global_load_dword v1, v0, s[2:3]408; GFX10-NEXT: s_waitcnt vmcnt(0)409; GFX10-NEXT: v_pk_lshrrev_b16 v1, v1, 8 op_sel_hi:[1,0]410; GFX10-NEXT: global_store_dword v0, v1, s[0:1]411; GFX10-NEXT: s_endpgm412;413; GFX11-LABEL: lshr_imm_v_v2i16:414; GFX11: ; %bb.0:415; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x24416; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v0417; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)418; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0419; GFX11-NEXT: s_waitcnt lgkmcnt(0)420; GFX11-NEXT: global_load_b32 v1, v0, s[2:3]421; GFX11-NEXT: s_waitcnt vmcnt(0)422; GFX11-NEXT: v_pk_lshrrev_b16 v1, v1, 8 op_sel_hi:[1,0]423; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]424; GFX11-NEXT: s_endpgm425 %tid = call i32 @llvm.amdgcn.workitem.id.x()426 %tid.ext = sext i32 %tid to i64427 %in.gep = getelementptr inbounds <2 x i16>, ptr addrspace(1) %in, i64 %tid.ext428 %out.gep = getelementptr inbounds <2 x i16>, ptr addrspace(1) %out, i64 %tid.ext429 %vgpr = load <2 x i16>, ptr addrspace(1) %in.gep430 %result = lshr <2 x i16> <i16 8, i16 8>, %vgpr431 store <2 x i16> %result, ptr addrspace(1) %out.gep432 ret void433}434 435define amdgpu_kernel void @lshr_v_imm_v2i16(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {436; GFX9-LABEL: lshr_v_imm_v2i16:437; GFX9: ; %bb.0:438; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24439; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0440; GFX9-NEXT: s_waitcnt lgkmcnt(0)441; GFX9-NEXT: global_load_dword v1, v0, s[2:3]442; GFX9-NEXT: s_waitcnt vmcnt(0)443; GFX9-NEXT: v_pk_lshrrev_b16 v1, 8, v1 op_sel_hi:[0,1]444; GFX9-NEXT: global_store_dword v0, v1, s[0:1]445; GFX9-NEXT: s_endpgm446;447; VI-LABEL: lshr_v_imm_v2i16:448; VI: ; %bb.0:449; VI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24450; VI-NEXT: v_lshlrev_b32_e32 v2, 2, v0451; VI-NEXT: s_waitcnt lgkmcnt(0)452; VI-NEXT: v_mov_b32_e32 v1, s3453; VI-NEXT: v_add_u32_e32 v0, vcc, s2, v2454; VI-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc455; VI-NEXT: flat_load_dword v3, v[0:1]456; VI-NEXT: v_add_u32_e32 v0, vcc, s0, v2457; VI-NEXT: v_mov_b32_e32 v1, s1458; VI-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc459; VI-NEXT: s_waitcnt vmcnt(0)460; VI-NEXT: v_lshrrev_b32_e32 v2, 24, v3461; VI-NEXT: v_lshlrev_b32_e32 v2, 16, v2462; VI-NEXT: v_or_b32_sdwa v2, v3, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_1 src1_sel:DWORD463; VI-NEXT: flat_store_dword v[0:1], v2464; VI-NEXT: s_endpgm465;466; CI-LABEL: lshr_v_imm_v2i16:467; CI: ; %bb.0:468; CI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9469; CI-NEXT: s_mov_b32 s7, 0xf000470; CI-NEXT: s_mov_b32 s6, 0471; CI-NEXT: v_lshlrev_b32_e32 v0, 2, v0472; CI-NEXT: v_mov_b32_e32 v1, 0473; CI-NEXT: s_waitcnt lgkmcnt(0)474; CI-NEXT: s_mov_b64 s[4:5], s[2:3]475; CI-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr64476; CI-NEXT: s_mov_b64 s[2:3], s[6:7]477; CI-NEXT: s_waitcnt vmcnt(0)478; CI-NEXT: v_lshrrev_b32_e32 v2, 8, v2479; CI-NEXT: v_and_b32_e32 v2, 0xff00ff, v2480; CI-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr64481; CI-NEXT: s_endpgm482;483; GFX10-LABEL: lshr_v_imm_v2i16:484; GFX10: ; %bb.0:485; GFX10-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24486; GFX10-NEXT: v_lshlrev_b32_e32 v0, 2, v0487; GFX10-NEXT: s_waitcnt lgkmcnt(0)488; GFX10-NEXT: global_load_dword v1, v0, s[2:3]489; GFX10-NEXT: s_waitcnt vmcnt(0)490; GFX10-NEXT: v_pk_lshrrev_b16 v1, 8, v1 op_sel_hi:[0,1]491; GFX10-NEXT: global_store_dword v0, v1, s[0:1]492; GFX10-NEXT: s_endpgm493;494; GFX11-LABEL: lshr_v_imm_v2i16:495; GFX11: ; %bb.0:496; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x24497; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v0498; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)499; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0500; GFX11-NEXT: s_waitcnt lgkmcnt(0)501; GFX11-NEXT: global_load_b32 v1, v0, s[2:3]502; GFX11-NEXT: s_waitcnt vmcnt(0)503; GFX11-NEXT: v_pk_lshrrev_b16 v1, 8, v1 op_sel_hi:[0,1]504; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]505; GFX11-NEXT: s_endpgm506 %tid = call i32 @llvm.amdgcn.workitem.id.x()507 %tid.ext = sext i32 %tid to i64508 %in.gep = getelementptr inbounds <2 x i16>, ptr addrspace(1) %in, i64 %tid.ext509 %out.gep = getelementptr inbounds <2 x i16>, ptr addrspace(1) %out, i64 %tid.ext510 %vgpr = load <2 x i16>, ptr addrspace(1) %in.gep511 %result = lshr <2 x i16> %vgpr, <i16 8, i16 8>512 store <2 x i16> %result, ptr addrspace(1) %out.gep513 ret void514}515 516define amdgpu_kernel void @v_lshr_v4i16(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {517; GFX9-LABEL: v_lshr_v4i16:518; GFX9: ; %bb.0:519; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24520; GFX9-NEXT: v_lshlrev_b32_e32 v4, 3, v0521; GFX9-NEXT: s_waitcnt lgkmcnt(0)522; GFX9-NEXT: global_load_dwordx4 v[0:3], v4, s[2:3]523; GFX9-NEXT: s_waitcnt vmcnt(0)524; GFX9-NEXT: v_pk_lshrrev_b16 v1, v3, v1525; GFX9-NEXT: v_pk_lshrrev_b16 v0, v2, v0526; GFX9-NEXT: global_store_dwordx2 v4, v[0:1], s[0:1]527; GFX9-NEXT: s_endpgm528;529; VI-LABEL: v_lshr_v4i16:530; VI: ; %bb.0:531; VI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24532; VI-NEXT: v_lshlrev_b32_e32 v4, 3, v0533; VI-NEXT: s_waitcnt lgkmcnt(0)534; VI-NEXT: v_mov_b32_e32 v1, s3535; VI-NEXT: v_add_u32_e32 v0, vcc, s2, v4536; VI-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc537; VI-NEXT: flat_load_dwordx4 v[0:3], v[0:1]538; VI-NEXT: v_mov_b32_e32 v5, s1539; VI-NEXT: v_add_u32_e32 v4, vcc, s0, v4540; VI-NEXT: v_addc_u32_e32 v5, vcc, 0, v5, vcc541; VI-NEXT: s_waitcnt vmcnt(0)542; VI-NEXT: v_lshrrev_b16_e32 v6, v3, v1543; VI-NEXT: v_lshrrev_b16_sdwa v1, v3, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1544; VI-NEXT: v_lshrrev_b16_e32 v3, v2, v0545; VI-NEXT: v_lshrrev_b16_sdwa v0, v2, v0 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1546; VI-NEXT: v_or_b32_e32 v1, v6, v1547; VI-NEXT: v_or_b32_e32 v0, v3, v0548; VI-NEXT: flat_store_dwordx2 v[4:5], v[0:1]549; VI-NEXT: s_endpgm550;551; CI-LABEL: v_lshr_v4i16:552; CI: ; %bb.0:553; CI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9554; CI-NEXT: s_mov_b32 s7, 0xf000555; CI-NEXT: s_mov_b32 s6, 0556; CI-NEXT: v_lshlrev_b32_e32 v4, 3, v0557; CI-NEXT: v_mov_b32_e32 v5, 0558; CI-NEXT: s_waitcnt lgkmcnt(0)559; CI-NEXT: s_mov_b64 s[4:5], s[2:3]560; CI-NEXT: buffer_load_dwordx4 v[0:3], v[4:5], s[4:7], 0 addr64561; CI-NEXT: s_mov_b64 s[2:3], s[6:7]562; CI-NEXT: s_waitcnt vmcnt(0)563; CI-NEXT: v_lshrrev_b32_e32 v6, 16, v0564; CI-NEXT: v_and_b32_e32 v0, 0xffff, v0565; CI-NEXT: v_lshrrev_b32_e32 v7, 16, v1566; CI-NEXT: v_and_b32_e32 v1, 0xffff, v1567; CI-NEXT: v_lshrrev_b32_e32 v8, 16, v2568; CI-NEXT: v_lshrrev_b32_e32 v9, 16, v3569; CI-NEXT: v_lshrrev_b32_e32 v1, v3, v1570; CI-NEXT: v_lshrrev_b32_e32 v3, v9, v7571; CI-NEXT: v_lshrrev_b32_e32 v0, v2, v0572; CI-NEXT: v_lshrrev_b32_e32 v2, v8, v6573; CI-NEXT: v_lshlrev_b32_e32 v3, 16, v3574; CI-NEXT: v_lshlrev_b32_e32 v2, 16, v2575; CI-NEXT: v_or_b32_e32 v1, v1, v3576; CI-NEXT: v_or_b32_e32 v0, v0, v2577; CI-NEXT: buffer_store_dwordx2 v[0:1], v[4:5], s[0:3], 0 addr64578; CI-NEXT: s_endpgm579;580; GFX10-LABEL: v_lshr_v4i16:581; GFX10: ; %bb.0:582; GFX10-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24583; GFX10-NEXT: v_lshlrev_b32_e32 v4, 3, v0584; GFX10-NEXT: s_waitcnt lgkmcnt(0)585; GFX10-NEXT: global_load_dwordx4 v[0:3], v4, s[2:3]586; GFX10-NEXT: s_waitcnt vmcnt(0)587; GFX10-NEXT: v_pk_lshrrev_b16 v1, v3, v1588; GFX10-NEXT: v_pk_lshrrev_b16 v0, v2, v0589; GFX10-NEXT: global_store_dwordx2 v4, v[0:1], s[0:1]590; GFX10-NEXT: s_endpgm591;592; GFX11-LABEL: v_lshr_v4i16:593; GFX11: ; %bb.0:594; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x24595; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v0596; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)597; GFX11-NEXT: v_lshlrev_b32_e32 v4, 3, v0598; GFX11-NEXT: s_waitcnt lgkmcnt(0)599; GFX11-NEXT: global_load_b128 v[0:3], v4, s[2:3]600; GFX11-NEXT: s_waitcnt vmcnt(0)601; GFX11-NEXT: v_pk_lshrrev_b16 v1, v3, v1602; GFX11-NEXT: v_pk_lshrrev_b16 v0, v2, v0603; GFX11-NEXT: global_store_b64 v4, v[0:1], s[0:1]604; GFX11-NEXT: s_endpgm605 %tid = call i32 @llvm.amdgcn.workitem.id.x()606 %tid.ext = sext i32 %tid to i64607 %in.gep = getelementptr inbounds <4 x i16>, ptr addrspace(1) %in, i64 %tid.ext608 %out.gep = getelementptr inbounds <4 x i16>, ptr addrspace(1) %out, i64 %tid.ext609 %b_ptr = getelementptr <4 x i16>, ptr addrspace(1) %in.gep, i32 1610 %a = load <4 x i16>, ptr addrspace(1) %in.gep611 %b = load <4 x i16>, ptr addrspace(1) %b_ptr612 %result = lshr <4 x i16> %a, %b613 store <4 x i16> %result, ptr addrspace(1) %out.gep614 ret void615}616 617define amdgpu_kernel void @lshr_v_imm_v4i16(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {618; GFX9-LABEL: lshr_v_imm_v4i16:619; GFX9: ; %bb.0:620; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24621; GFX9-NEXT: v_lshlrev_b32_e32 v2, 3, v0622; GFX9-NEXT: s_waitcnt lgkmcnt(0)623; GFX9-NEXT: global_load_dwordx2 v[0:1], v2, s[2:3]624; GFX9-NEXT: s_waitcnt vmcnt(0)625; GFX9-NEXT: v_pk_lshrrev_b16 v1, 8, v1 op_sel_hi:[0,1]626; GFX9-NEXT: v_pk_lshrrev_b16 v0, 8, v0 op_sel_hi:[0,1]627; GFX9-NEXT: global_store_dwordx2 v2, v[0:1], s[0:1]628; GFX9-NEXT: s_endpgm629;630; VI-LABEL: lshr_v_imm_v4i16:631; VI: ; %bb.0:632; VI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24633; VI-NEXT: v_lshlrev_b32_e32 v2, 3, v0634; VI-NEXT: s_waitcnt lgkmcnt(0)635; VI-NEXT: v_mov_b32_e32 v1, s3636; VI-NEXT: v_add_u32_e32 v0, vcc, s2, v2637; VI-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc638; VI-NEXT: flat_load_dwordx2 v[0:1], v[0:1]639; VI-NEXT: v_mov_b32_e32 v3, s1640; VI-NEXT: v_add_u32_e32 v2, vcc, s0, v2641; VI-NEXT: v_addc_u32_e32 v3, vcc, 0, v3, vcc642; VI-NEXT: s_waitcnt vmcnt(0)643; VI-NEXT: v_lshrrev_b32_e32 v4, 24, v1644; VI-NEXT: v_lshrrev_b32_e32 v5, 24, v0645; VI-NEXT: v_lshlrev_b32_e32 v4, 16, v4646; VI-NEXT: v_lshlrev_b32_e32 v5, 16, v5647; VI-NEXT: v_or_b32_sdwa v1, v1, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_1 src1_sel:DWORD648; VI-NEXT: v_or_b32_sdwa v0, v0, v5 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_1 src1_sel:DWORD649; VI-NEXT: flat_store_dwordx2 v[2:3], v[0:1]650; VI-NEXT: s_endpgm651;652; CI-LABEL: lshr_v_imm_v4i16:653; CI: ; %bb.0:654; CI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9655; CI-NEXT: s_mov_b32 s7, 0xf000656; CI-NEXT: s_mov_b32 s6, 0657; CI-NEXT: v_lshlrev_b32_e32 v0, 3, v0658; CI-NEXT: v_mov_b32_e32 v1, 0659; CI-NEXT: s_waitcnt lgkmcnt(0)660; CI-NEXT: s_mov_b64 s[4:5], s[2:3]661; CI-NEXT: buffer_load_dwordx2 v[2:3], v[0:1], s[4:7], 0 addr64662; CI-NEXT: s_mov_b64 s[2:3], s[6:7]663; CI-NEXT: s_waitcnt vmcnt(0)664; CI-NEXT: v_lshrrev_b32_e32 v3, 8, v3665; CI-NEXT: v_lshrrev_b32_e32 v2, 8, v2666; CI-NEXT: v_and_b32_e32 v3, 0xff00ff, v3667; CI-NEXT: v_and_b32_e32 v2, 0xff00ff, v2668; CI-NEXT: buffer_store_dwordx2 v[2:3], v[0:1], s[0:3], 0 addr64669; CI-NEXT: s_endpgm670;671; GFX10-LABEL: lshr_v_imm_v4i16:672; GFX10: ; %bb.0:673; GFX10-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24674; GFX10-NEXT: v_lshlrev_b32_e32 v2, 3, v0675; GFX10-NEXT: s_waitcnt lgkmcnt(0)676; GFX10-NEXT: global_load_dwordx2 v[0:1], v2, s[2:3]677; GFX10-NEXT: s_waitcnt vmcnt(0)678; GFX10-NEXT: v_pk_lshrrev_b16 v1, 8, v1 op_sel_hi:[0,1]679; GFX10-NEXT: v_pk_lshrrev_b16 v0, 8, v0 op_sel_hi:[0,1]680; GFX10-NEXT: global_store_dwordx2 v2, v[0:1], s[0:1]681; GFX10-NEXT: s_endpgm682;683; GFX11-LABEL: lshr_v_imm_v4i16:684; GFX11: ; %bb.0:685; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x24686; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v0687; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)688; GFX11-NEXT: v_lshlrev_b32_e32 v2, 3, v0689; GFX11-NEXT: s_waitcnt lgkmcnt(0)690; GFX11-NEXT: global_load_b64 v[0:1], v2, s[2:3]691; GFX11-NEXT: s_waitcnt vmcnt(0)692; GFX11-NEXT: v_pk_lshrrev_b16 v1, 8, v1 op_sel_hi:[0,1]693; GFX11-NEXT: v_pk_lshrrev_b16 v0, 8, v0 op_sel_hi:[0,1]694; GFX11-NEXT: global_store_b64 v2, v[0:1], s[0:1]695; GFX11-NEXT: s_endpgm696 %tid = call i32 @llvm.amdgcn.workitem.id.x()697 %tid.ext = sext i32 %tid to i64698 %in.gep = getelementptr inbounds <4 x i16>, ptr addrspace(1) %in, i64 %tid.ext699 %out.gep = getelementptr inbounds <4 x i16>, ptr addrspace(1) %out, i64 %tid.ext700 %vgpr = load <4 x i16>, ptr addrspace(1) %in.gep701 %result = lshr <4 x i16> %vgpr, <i16 8, i16 8, i16 8, i16 8>702 store <4 x i16> %result, ptr addrspace(1) %out.gep703 ret void704}705 706declare i32 @llvm.amdgcn.workitem.id.x() #1707 708attributes #0 = { nounwind }709attributes #1 = { nounwind readnone }710