610 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --extra_scrub --version 52; RUN: llc -mtriple=amdgcn-- < %s | FileCheck -enable-var-scope -check-prefixes=GCN %s3; RUN: llc -mtriple=amdgcn-- -mcpu=tonga -mattr=-flat-for-global < %s | FileCheck -enable-var-scope -check-prefixes=GFX89 %s4; RUN: llc -mtriple=amdgcn-- -mcpu=gfx900 -mattr=-flat-for-global < %s | FileCheck -enable-var-scope -check-prefixes=GFX89 %s5 6define amdgpu_kernel void @extract_vector_elt_v2i16(ptr addrspace(1) %out, ptr addrspace(4) %vec.ptr) #0 {7;8; GCN-LABEL: extract_vector_elt_v2i16:9; GCN: ; %bb.0:10; GCN-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x911; GCN-NEXT: s_waitcnt lgkmcnt(0)12; GCN-NEXT: s_load_dword s4, s[2:3], 0x013; GCN-NEXT: s_mov_b32 s3, 0xf00014; GCN-NEXT: s_waitcnt lgkmcnt(0)15; GCN-NEXT: s_lshr_b32 s5, s4, 1616; GCN-NEXT: s_mov_b32 s2, -117; GCN-NEXT: v_mov_b32_e32 v0, s418; GCN-NEXT: v_mov_b32_e32 v1, s519; GCN-NEXT: buffer_store_short v1, off, s[0:3], 020; GCN-NEXT: buffer_store_short v0, off, s[0:3], 0 offset:2021; GCN-NEXT: s_endpgm22 %vec = load <2 x i16>, ptr addrspace(4) %vec.ptr23 %p0 = extractelement <2 x i16> %vec, i32 024 %p1 = extractelement <2 x i16> %vec, i32 125 %out1 = getelementptr i16, ptr addrspace(1) %out, i32 1026 store i16 %p1, ptr addrspace(1) %out, align 227 store i16 %p0, ptr addrspace(1) %out1, align 228 ret void29}30 31define amdgpu_kernel void @extract_vector_elt_v2i16_dynamic_sgpr(ptr addrspace(1) %out, ptr addrspace(4) %vec.ptr, [8 x i32], i32 %idx) #0 {32; GCN-LABEL: extract_vector_elt_v2i16_dynamic_sgpr:33; GCN: ; %bb.0:34; GCN-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x935; GCN-NEXT: s_load_dword s4, s[4:5], 0x1536; GCN-NEXT: s_waitcnt lgkmcnt(0)37; GCN-NEXT: s_load_dword s2, s[2:3], 0x038; GCN-NEXT: s_mov_b32 s3, 0xf00039; GCN-NEXT: s_lshl_b32 s4, s4, 440; GCN-NEXT: s_waitcnt lgkmcnt(0)41; GCN-NEXT: s_lshr_b32 s4, s2, s442; GCN-NEXT: s_mov_b32 s2, -143; GCN-NEXT: v_mov_b32_e32 v0, s444; GCN-NEXT: buffer_store_short v0, off, s[0:3], 045; GCN-NEXT: s_endpgm46;47; GFX89-LABEL: extract_vector_elt_v2i16_dynamic_sgpr:48; GFX89: ; %bb.0:49; GFX89-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x2450; GFX89-NEXT: s_load_dword s8, s[4:5], 0x5451; GFX89-NEXT: s_mov_b32 s7, 0xf00052; GFX89-NEXT: s_mov_b32 s6, -153; GFX89-NEXT: s_waitcnt lgkmcnt(0)54; GFX89-NEXT: s_load_dword s2, s[2:3], 0x055; GFX89-NEXT: s_mov_b32 s4, s056; GFX89-NEXT: s_lshl_b32 s0, s8, 457; GFX89-NEXT: s_mov_b32 s5, s158; GFX89-NEXT: s_waitcnt lgkmcnt(0)59; GFX89-NEXT: s_lshr_b32 s0, s2, s060; GFX89-NEXT: v_mov_b32_e32 v0, s061; GFX89-NEXT: buffer_store_short v0, off, s[4:7], 062; GFX89-NEXT: s_endpgm63 %vec = load <2 x i16>, ptr addrspace(4) %vec.ptr64 %elt = extractelement <2 x i16> %vec, i32 %idx65 store i16 %elt, ptr addrspace(1) %out, align 266 ret void67}68 69define amdgpu_kernel void @extract_vector_elt_v2i16_dynamic_vgpr(ptr addrspace(1) %out, ptr addrspace(4) %vec.ptr, ptr addrspace(1) %idx.ptr) #0 {70;71; GCN-LABEL: extract_vector_elt_v2i16_dynamic_vgpr:72; GCN: ; %bb.0:73; GCN-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x974; GCN-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0xd75; GCN-NEXT: s_mov_b32 s7, 0xf00076; GCN-NEXT: s_mov_b32 s6, 077; GCN-NEXT: v_lshlrev_b32_e32 v1, 2, v078; GCN-NEXT: v_mov_b32_e32 v2, 079; GCN-NEXT: s_waitcnt lgkmcnt(0)80; GCN-NEXT: buffer_load_dword v3, v[1:2], s[4:7], 0 addr64 glc81; GCN-NEXT: s_waitcnt vmcnt(0)82; GCN-NEXT: s_load_dword s2, s[2:3], 0x083; GCN-NEXT: s_mov_b64 s[4:5], s[0:1]84; GCN-NEXT: v_lshlrev_b32_e32 v1, 1, v085; GCN-NEXT: v_lshlrev_b32_e32 v0, 4, v386; GCN-NEXT: s_waitcnt lgkmcnt(0)87; GCN-NEXT: v_lshr_b32_e32 v0, s2, v088; GCN-NEXT: buffer_store_short v0, v[1:2], s[4:7], 0 addr6489; GCN-NEXT: s_endpgm90 %tid = call i32 @llvm.amdgcn.workitem.id.x()91 %tid.ext = sext i32 %tid to i6492 %gep = getelementptr inbounds i32, ptr addrspace(1) %idx.ptr, i64 %tid.ext93 %out.gep = getelementptr inbounds i16, ptr addrspace(1) %out, i64 %tid.ext94 %idx = load volatile i32, ptr addrspace(1) %gep95 %vec = load <2 x i16>, ptr addrspace(4) %vec.ptr96 %elt = extractelement <2 x i16> %vec, i32 %idx97 store i16 %elt, ptr addrspace(1) %out.gep, align 298 ret void99}100 101define amdgpu_kernel void @extract_vector_elt_v3i16(ptr addrspace(1) %out, <3 x i16> %foo) #0 {102;103;104;105;106; GCN-LABEL: extract_vector_elt_v3i16:107; GCN: ; %bb.0:108; GCN-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9109; GCN-NEXT: s_mov_b32 s7, 0xf000110; GCN-NEXT: s_mov_b32 s6, -1111; GCN-NEXT: s_waitcnt lgkmcnt(0)112; GCN-NEXT: s_mov_b32 s4, s0113; GCN-NEXT: s_mov_b32 s5, s1114; GCN-NEXT: v_mov_b32_e32 v0, s3115; GCN-NEXT: buffer_store_short v0, off, s[4:7], 0116; GCN-NEXT: s_waitcnt expcnt(0)117; GCN-NEXT: v_mov_b32_e32 v0, s2118; GCN-NEXT: buffer_store_short v0, off, s[4:7], 0 offset:2119; GCN-NEXT: s_endpgm120;121; GFX89-LABEL: extract_vector_elt_v3i16:122; GFX89: ; %bb.0:123; GFX89-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24124; GFX89-NEXT: s_mov_b32 s7, 0xf000125; GFX89-NEXT: s_mov_b32 s6, -1126; GFX89-NEXT: s_waitcnt lgkmcnt(0)127; GFX89-NEXT: s_mov_b32 s4, s0128; GFX89-NEXT: s_mov_b32 s5, s1129; GFX89-NEXT: v_mov_b32_e32 v0, s3130; GFX89-NEXT: buffer_store_short v0, off, s[4:7], 0131; GFX89-NEXT: v_mov_b32_e32 v0, s2132; GFX89-NEXT: buffer_store_short v0, off, s[4:7], 0 offset:2133; GFX89-NEXT: s_endpgm134 %p0 = extractelement <3 x i16> %foo, i32 0135 %p1 = extractelement <3 x i16> %foo, i32 2136 %out1 = getelementptr i16, ptr addrspace(1) %out, i32 1137 store i16 %p1, ptr addrspace(1) %out, align 2138 store i16 %p0, ptr addrspace(1) %out1, align 2139 ret void140}141 142define amdgpu_kernel void @extract_vector_elt_v4i16(ptr addrspace(1) %out, <4 x i16> %foo) #0 {143;144;145; GCN-LABEL: extract_vector_elt_v4i16:146; GCN: ; %bb.0:147; GCN-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9148; GCN-NEXT: s_mov_b32 s7, 0xf000149; GCN-NEXT: s_mov_b32 s6, -1150; GCN-NEXT: s_waitcnt lgkmcnt(0)151; GCN-NEXT: s_mov_b32 s4, s0152; GCN-NEXT: s_mov_b32 s5, s1153; GCN-NEXT: v_mov_b32_e32 v0, s3154; GCN-NEXT: buffer_store_short v0, off, s[4:7], 0155; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0)156; GCN-NEXT: v_mov_b32_e32 v0, s2157; GCN-NEXT: buffer_store_short v0, off, s[4:7], 0 offset:20158; GCN-NEXT: s_waitcnt vmcnt(0)159; GCN-NEXT: s_endpgm160;161; GFX89-LABEL: extract_vector_elt_v4i16:162; GFX89: ; %bb.0:163; GFX89-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24164; GFX89-NEXT: s_mov_b32 s7, 0xf000165; GFX89-NEXT: s_mov_b32 s6, -1166; GFX89-NEXT: s_waitcnt lgkmcnt(0)167; GFX89-NEXT: s_mov_b32 s4, s0168; GFX89-NEXT: s_mov_b32 s5, s1169; GFX89-NEXT: v_mov_b32_e32 v0, s3170; GFX89-NEXT: buffer_store_short v0, off, s[4:7], 0171; GFX89-NEXT: s_waitcnt vmcnt(0)172; GFX89-NEXT: v_mov_b32_e32 v0, s2173; GFX89-NEXT: buffer_store_short v0, off, s[4:7], 0 offset:20174; GFX89-NEXT: s_waitcnt vmcnt(0)175; GFX89-NEXT: s_endpgm176 %p0 = extractelement <4 x i16> %foo, i32 0177 %p1 = extractelement <4 x i16> %foo, i32 2178 %out1 = getelementptr i16, ptr addrspace(1) %out, i32 10179 store volatile i16 %p1, ptr addrspace(1) %out, align 2180 store volatile i16 %p0, ptr addrspace(1) %out1, align 2181 ret void182}183 184define amdgpu_kernel void @dynamic_extract_vector_elt_v3i16(ptr addrspace(1) %out, [8 x i32], <3 x i16> %foo, i32 %idx) #0 {185;186;187; GCN-LABEL: dynamic_extract_vector_elt_v3i16:188; GCN: ; %bb.0:189; GCN-NEXT: s_load_dword s2, s[4:5], 0x15190; GCN-NEXT: s_load_dwordx2 s[6:7], s[4:5], 0x13191; GCN-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x9192; GCN-NEXT: s_mov_b32 s3, 0xf000193; GCN-NEXT: s_waitcnt lgkmcnt(0)194; GCN-NEXT: s_lshl_b32 s2, s2, 4195; GCN-NEXT: s_lshr_b64 s[4:5], s[6:7], s2196; GCN-NEXT: s_mov_b32 s2, -1197; GCN-NEXT: v_mov_b32_e32 v0, s4198; GCN-NEXT: buffer_store_short v0, off, s[0:3], 0199; GCN-NEXT: s_endpgm200;201; GFX89-LABEL: dynamic_extract_vector_elt_v3i16:202; GFX89: ; %bb.0:203; GFX89-NEXT: s_load_dword s8, s[4:5], 0x54204; GFX89-NEXT: s_load_dwordx2 s[6:7], s[4:5], 0x4c205; GFX89-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x24206; GFX89-NEXT: s_mov_b32 s3, 0xf000207; GFX89-NEXT: s_mov_b32 s2, -1208; GFX89-NEXT: s_waitcnt lgkmcnt(0)209; GFX89-NEXT: s_lshl_b32 s4, s8, 4210; GFX89-NEXT: s_lshr_b64 s[4:5], s[6:7], s4211; GFX89-NEXT: v_mov_b32_e32 v0, s4212; GFX89-NEXT: buffer_store_short v0, off, s[0:3], 0213; GFX89-NEXT: s_endpgm214 %p0 = extractelement <3 x i16> %foo, i32 %idx215 %out1 = getelementptr i16, ptr addrspace(1) %out, i32 1216 store i16 %p0, ptr addrspace(1) %out217 ret void218}219 220define amdgpu_kernel void @v_insertelement_v4i16_dynamic_sgpr(ptr addrspace(1) %out, ptr addrspace(1) %in, i32 %idx) #0 {221;222;223;224; GCN-LABEL: v_insertelement_v4i16_dynamic_sgpr:225; GCN: ; %bb.0:226; GCN-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9227; GCN-NEXT: s_load_dword s8, s[4:5], 0xd228; GCN-NEXT: s_mov_b32 s7, 0xf000229; GCN-NEXT: s_mov_b32 s6, 0230; GCN-NEXT: v_lshlrev_b32_e32 v1, 3, v0231; GCN-NEXT: v_mov_b32_e32 v2, 0232; GCN-NEXT: s_waitcnt lgkmcnt(0)233; GCN-NEXT: s_mov_b64 s[4:5], s[2:3]234; GCN-NEXT: buffer_load_dwordx2 v[3:4], v[1:2], s[4:7], 0 addr64235; GCN-NEXT: s_mov_b64 s[2:3], s[6:7]236; GCN-NEXT: v_lshlrev_b32_e32 v1, 1, v0237; GCN-NEXT: s_lshl_b32 s4, s8, 4238; GCN-NEXT: s_waitcnt vmcnt(0)239; GCN-NEXT: v_lshr_b64 v[3:4], v[3:4], s4240; GCN-NEXT: buffer_store_short v3, v[1:2], s[0:3], 0 addr64241; GCN-NEXT: s_endpgm242 %tid = call i32 @llvm.amdgcn.workitem.id.x() #1243 %tid.ext = sext i32 %tid to i64244 %in.gep = getelementptr inbounds <4 x i16>, ptr addrspace(1) %in, i64 %tid.ext245 %out.gep = getelementptr inbounds i16, ptr addrspace(1) %out, i64 %tid.ext246 %vec = load <4 x i16>, ptr addrspace(1) %in.gep247 %vec.extract = extractelement <4 x i16> %vec, i32 %idx248 store i16 %vec.extract, ptr addrspace(1) %out.gep249 ret void250}251 252define amdgpu_kernel void @reduce_load_vector_v8i16_extract_01(ptr addrspace(4) %ptr) #0 {253;254;255;256;257; GCN-LABEL: reduce_load_vector_v8i16_extract_01:258; GCN: ; %bb.0:259; GCN-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x9260; GCN-NEXT: s_waitcnt lgkmcnt(0)261; GCN-NEXT: s_load_dword s0, s[0:1], 0x0262; GCN-NEXT: s_mov_b32 s3, 0xf000263; GCN-NEXT: s_mov_b32 s2, -1264; GCN-NEXT: s_waitcnt lgkmcnt(0)265; GCN-NEXT: s_lshr_b32 s1, s0, 16266; GCN-NEXT: v_mov_b32_e32 v0, s0267; GCN-NEXT: buffer_store_short v0, off, s[0:3], 0268; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0)269; GCN-NEXT: v_mov_b32_e32 v0, s1270; GCN-NEXT: buffer_store_short v0, off, s[0:3], 0271; GCN-NEXT: s_waitcnt vmcnt(0)272; GCN-NEXT: s_endpgm273;274; GFX89-LABEL: reduce_load_vector_v8i16_extract_01:275; GFX89: ; %bb.0:276; GFX89-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x24277; GFX89-NEXT: s_mov_b32 s3, 0xf000278; GFX89-NEXT: s_mov_b32 s2, -1279; GFX89-NEXT: s_waitcnt lgkmcnt(0)280; GFX89-NEXT: s_load_dword s0, s[0:1], 0x0281; GFX89-NEXT: s_waitcnt lgkmcnt(0)282; GFX89-NEXT: s_lshr_b32 s1, s0, 16283; GFX89-NEXT: v_mov_b32_e32 v0, s0284; GFX89-NEXT: buffer_store_short v0, off, s[0:3], 0285; GFX89-NEXT: s_waitcnt vmcnt(0)286; GFX89-NEXT: v_mov_b32_e32 v0, s1287; GFX89-NEXT: buffer_store_short v0, off, s[0:3], 0288; GFX89-NEXT: s_waitcnt vmcnt(0)289; GFX89-NEXT: s_endpgm290 %load = load <16 x i16>, ptr addrspace(4) %ptr291 %elt0 = extractelement <16 x i16> %load, i32 0292 %elt1 = extractelement <16 x i16> %load, i32 1293 store volatile i16 %elt0, ptr addrspace(1) poison, align 2294 store volatile i16 %elt1, ptr addrspace(1) poison, align 2295 ret void296}297 298define amdgpu_kernel void @reduce_load_vector_v8i16_extract_23(ptr addrspace(4) %ptr) #0 {299;300;301;302;303; GCN-LABEL: reduce_load_vector_v8i16_extract_23:304; GCN: ; %bb.0:305; GCN-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x9306; GCN-NEXT: s_waitcnt lgkmcnt(0)307; GCN-NEXT: s_load_dword s0, s[0:1], 0x1308; GCN-NEXT: s_mov_b32 s3, 0xf000309; GCN-NEXT: s_mov_b32 s2, -1310; GCN-NEXT: s_waitcnt lgkmcnt(0)311; GCN-NEXT: s_lshr_b32 s1, s0, 16312; GCN-NEXT: v_mov_b32_e32 v0, s0313; GCN-NEXT: buffer_store_short v0, off, s[0:3], 0314; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0)315; GCN-NEXT: v_mov_b32_e32 v0, s1316; GCN-NEXT: buffer_store_short v0, off, s[0:3], 0317; GCN-NEXT: s_waitcnt vmcnt(0)318; GCN-NEXT: s_endpgm319;320; GFX89-LABEL: reduce_load_vector_v8i16_extract_23:321; GFX89: ; %bb.0:322; GFX89-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x24323; GFX89-NEXT: s_mov_b32 s3, 0xf000324; GFX89-NEXT: s_mov_b32 s2, -1325; GFX89-NEXT: s_waitcnt lgkmcnt(0)326; GFX89-NEXT: s_load_dword s0, s[0:1], 0x4327; GFX89-NEXT: s_waitcnt lgkmcnt(0)328; GFX89-NEXT: s_lshr_b32 s1, s0, 16329; GFX89-NEXT: v_mov_b32_e32 v0, s0330; GFX89-NEXT: buffer_store_short v0, off, s[0:3], 0331; GFX89-NEXT: s_waitcnt vmcnt(0)332; GFX89-NEXT: v_mov_b32_e32 v0, s1333; GFX89-NEXT: buffer_store_short v0, off, s[0:3], 0334; GFX89-NEXT: s_waitcnt vmcnt(0)335; GFX89-NEXT: s_endpgm336 %load = load <16 x i16>, ptr addrspace(4) %ptr337 %elt2 = extractelement <16 x i16> %load, i32 2338 %elt3 = extractelement <16 x i16> %load, i32 3339 store volatile i16 %elt2, ptr addrspace(1) poison, align 2340 store volatile i16 %elt3, ptr addrspace(1) poison, align 2341 ret void342}343 344define amdgpu_kernel void @v_extractelement_v8i16_2(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {345;346;347;348; GCN-LABEL: v_extractelement_v8i16_2:349; GCN: ; %bb.0:350; GCN-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9351; GCN-NEXT: v_lshlrev_b32_e32 v1, 4, v0352; GCN-NEXT: s_mov_b32 s7, 0xf000353; GCN-NEXT: s_mov_b32 s6, 0354; GCN-NEXT: v_mov_b32_e32 v2, 0355; GCN-NEXT: s_mov_b64 s[10:11], s[6:7]356; GCN-NEXT: s_waitcnt lgkmcnt(0)357; GCN-NEXT: s_mov_b64 s[8:9], s[2:3]358; GCN-NEXT: buffer_load_dword v3, v[1:2], s[8:11], 0 addr64 offset:4359; GCN-NEXT: s_mov_b64 s[4:5], s[0:1]360; GCN-NEXT: v_lshlrev_b32_e32 v1, 1, v0361; GCN-NEXT: s_waitcnt vmcnt(0)362; GCN-NEXT: buffer_store_short v3, v[1:2], s[4:7], 0 addr64363; GCN-NEXT: s_endpgm364 %tid = call i32 @llvm.amdgcn.workitem.id.x() #1365 %tid.ext = sext i32 %tid to i64366 %in.gep = getelementptr inbounds <8 x i16>, ptr addrspace(1) %in, i64 %tid.ext367 %out.gep = getelementptr inbounds i16, ptr addrspace(1) %out, i64 %tid.ext368 %vec = load <8 x i16>, ptr addrspace(1) %in.gep369 %vec.extract = extractelement <8 x i16> %vec, i32 2370 store i16 %vec.extract, ptr addrspace(1) %out.gep371 ret void372}373 374define amdgpu_kernel void @v_extractelement_v8i16_6(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {375;376;377;378; GCN-LABEL: v_extractelement_v8i16_6:379; GCN: ; %bb.0:380; GCN-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9381; GCN-NEXT: v_lshlrev_b32_e32 v1, 4, v0382; GCN-NEXT: s_mov_b32 s7, 0xf000383; GCN-NEXT: s_mov_b32 s6, 0384; GCN-NEXT: v_mov_b32_e32 v2, 0385; GCN-NEXT: s_mov_b64 s[10:11], s[6:7]386; GCN-NEXT: s_waitcnt lgkmcnt(0)387; GCN-NEXT: s_mov_b64 s[8:9], s[2:3]388; GCN-NEXT: buffer_load_dword v3, v[1:2], s[8:11], 0 addr64 offset:12389; GCN-NEXT: s_mov_b64 s[4:5], s[0:1]390; GCN-NEXT: v_lshlrev_b32_e32 v1, 1, v0391; GCN-NEXT: s_waitcnt vmcnt(0)392; GCN-NEXT: buffer_store_short v3, v[1:2], s[4:7], 0 addr64393; GCN-NEXT: s_endpgm394 %tid = call i32 @llvm.amdgcn.workitem.id.x() #1395 %tid.ext = sext i32 %tid to i64396 %in.gep = getelementptr inbounds <8 x i16>, ptr addrspace(1) %in, i64 %tid.ext397 %out.gep = getelementptr inbounds i16, ptr addrspace(1) %out, i64 %tid.ext398 %vec = load <8 x i16>, ptr addrspace(1) %in.gep399 %vec.extract = extractelement <8 x i16> %vec, i32 6400 store i16 %vec.extract, ptr addrspace(1) %out.gep401 ret void402}403 404define amdgpu_kernel void @v_extractelement_v8i16_dynamic_sgpr(ptr addrspace(1) %out, ptr addrspace(1) %in, i32 %n) #0 {405;406;407;408; GCN-LABEL: v_extractelement_v8i16_dynamic_sgpr:409; GCN: ; %bb.0:410; GCN-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9411; GCN-NEXT: s_load_dword s8, s[4:5], 0xd412; GCN-NEXT: s_mov_b32 s7, 0xf000413; GCN-NEXT: s_mov_b32 s6, 0414; GCN-NEXT: v_lshlrev_b32_e32 v4, 4, v0415; GCN-NEXT: v_mov_b32_e32 v5, 0416; GCN-NEXT: s_waitcnt lgkmcnt(0)417; GCN-NEXT: s_mov_b64 s[4:5], s[2:3]418; GCN-NEXT: buffer_load_dwordx4 v[1:4], v[4:5], s[4:7], 0 addr64419; GCN-NEXT: v_lshlrev_b32_e32 v6, 1, v0420; GCN-NEXT: v_mov_b32_e32 v7, v5421; GCN-NEXT: s_mov_b64 s[2:3], s[6:7]422; GCN-NEXT: s_cmp_eq_u32 s8, 1423; GCN-NEXT: s_waitcnt vmcnt(0)424; GCN-NEXT: v_lshrrev_b32_e32 v0, 16, v1425; GCN-NEXT: s_cselect_b64 vcc, -1, 0426; GCN-NEXT: s_cmp_eq_u32 s8, 2427; GCN-NEXT: v_lshrrev_b32_e32 v5, 16, v2428; GCN-NEXT: v_lshrrev_b32_e32 v8, 16, v3429; GCN-NEXT: v_lshrrev_b32_e32 v9, 16, v4430; GCN-NEXT: v_cndmask_b32_e32 v0, v1, v0, vcc431; GCN-NEXT: s_cselect_b64 vcc, -1, 0432; GCN-NEXT: s_cmp_eq_u32 s8, 3433; GCN-NEXT: v_cndmask_b32_e32 v0, v0, v2, vcc434; GCN-NEXT: s_cselect_b64 vcc, -1, 0435; GCN-NEXT: s_cmp_eq_u32 s8, 4436; GCN-NEXT: v_cndmask_b32_e32 v0, v0, v5, vcc437; GCN-NEXT: s_cselect_b64 vcc, -1, 0438; GCN-NEXT: s_cmp_eq_u32 s8, 5439; GCN-NEXT: v_cndmask_b32_e32 v0, v0, v3, vcc440; GCN-NEXT: s_cselect_b64 vcc, -1, 0441; GCN-NEXT: s_cmp_eq_u32 s8, 6442; GCN-NEXT: v_cndmask_b32_e32 v0, v0, v8, vcc443; GCN-NEXT: s_cselect_b64 vcc, -1, 0444; GCN-NEXT: s_cmp_eq_u32 s8, 7445; GCN-NEXT: v_cndmask_b32_e32 v0, v0, v4, vcc446; GCN-NEXT: s_cselect_b64 vcc, -1, 0447; GCN-NEXT: v_cndmask_b32_e32 v0, v0, v9, vcc448; GCN-NEXT: buffer_store_short v0, v[6:7], s[0:3], 0 addr64449; GCN-NEXT: s_endpgm450 %tid = call i32 @llvm.amdgcn.workitem.id.x() #1451 %tid.ext = sext i32 %tid to i64452 %in.gep = getelementptr inbounds <8 x i16>, ptr addrspace(1) %in, i64 %tid.ext453 %out.gep = getelementptr inbounds i16, ptr addrspace(1) %out, i64 %tid.ext454 %vec = load <8 x i16>, ptr addrspace(1) %in.gep455 %vec.extract = extractelement <8 x i16> %vec, i32 %n456 store i16 %vec.extract, ptr addrspace(1) %out.gep457 ret void458}459 460define amdgpu_kernel void @v_extractelement_v16i16_2(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {461;462;463;464; GCN-LABEL: v_extractelement_v16i16_2:465; GCN: ; %bb.0:466; GCN-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9467; GCN-NEXT: v_lshlrev_b32_e32 v1, 5, v0468; GCN-NEXT: s_mov_b32 s7, 0xf000469; GCN-NEXT: s_mov_b32 s6, 0470; GCN-NEXT: v_mov_b32_e32 v2, 0471; GCN-NEXT: s_mov_b64 s[10:11], s[6:7]472; GCN-NEXT: s_waitcnt lgkmcnt(0)473; GCN-NEXT: s_mov_b64 s[8:9], s[2:3]474; GCN-NEXT: buffer_load_dword v3, v[1:2], s[8:11], 0 addr64 offset:4475; GCN-NEXT: s_mov_b64 s[4:5], s[0:1]476; GCN-NEXT: v_lshlrev_b32_e32 v1, 1, v0477; GCN-NEXT: s_waitcnt vmcnt(0)478; GCN-NEXT: buffer_store_short v3, v[1:2], s[4:7], 0 addr64479; GCN-NEXT: s_endpgm480 %tid = call i32 @llvm.amdgcn.workitem.id.x() #1481 %tid.ext = sext i32 %tid to i64482 %in.gep = getelementptr inbounds <16 x i16>, ptr addrspace(1) %in, i64 %tid.ext483 %out.gep = getelementptr inbounds i16, ptr addrspace(1) %out, i64 %tid.ext484 %vec = load <16 x i16>, ptr addrspace(1) %in.gep485 %vec.extract = extractelement <16 x i16> %vec, i32 2486 store i16 %vec.extract, ptr addrspace(1) %out.gep487 ret void488}489 490define amdgpu_kernel void @v_extractelement_v16i16_6(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {491;492;493;494; GCN-LABEL: v_extractelement_v16i16_6:495; GCN: ; %bb.0:496; GCN-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9497; GCN-NEXT: v_lshlrev_b32_e32 v1, 5, v0498; GCN-NEXT: s_mov_b32 s7, 0xf000499; GCN-NEXT: s_mov_b32 s6, 0500; GCN-NEXT: v_mov_b32_e32 v2, 0501; GCN-NEXT: s_mov_b64 s[10:11], s[6:7]502; GCN-NEXT: s_waitcnt lgkmcnt(0)503; GCN-NEXT: s_mov_b64 s[8:9], s[2:3]504; GCN-NEXT: buffer_load_dword v3, v[1:2], s[8:11], 0 addr64 offset:12505; GCN-NEXT: s_mov_b64 s[4:5], s[0:1]506; GCN-NEXT: v_lshlrev_b32_e32 v1, 1, v0507; GCN-NEXT: s_waitcnt vmcnt(0)508; GCN-NEXT: buffer_store_short v3, v[1:2], s[4:7], 0 addr64509; GCN-NEXT: s_endpgm510 %tid = call i32 @llvm.amdgcn.workitem.id.x() #1511 %tid.ext = sext i32 %tid to i64512 %in.gep = getelementptr inbounds <16 x i16>, ptr addrspace(1) %in, i64 %tid.ext513 %out.gep = getelementptr inbounds i16, ptr addrspace(1) %out, i64 %tid.ext514 %vec = load <16 x i16>, ptr addrspace(1) %in.gep515 %vec.extract = extractelement <16 x i16> %vec, i32 6516 store i16 %vec.extract, ptr addrspace(1) %out.gep517 ret void518}519 520define amdgpu_kernel void @v_extractelement_v16i16_dynamic_sgpr(ptr addrspace(1) %out, ptr addrspace(1) %in, i32 %n) #0 {521;522;523;524; GCN-LABEL: v_extractelement_v16i16_dynamic_sgpr:525; GCN: ; %bb.0:526; GCN-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9527; GCN-NEXT: s_load_dword s8, s[4:5], 0xd528; GCN-NEXT: s_mov_b32 s7, 0xf000529; GCN-NEXT: s_mov_b32 s6, 0530; GCN-NEXT: v_lshlrev_b32_e32 v5, 5, v0531; GCN-NEXT: v_mov_b32_e32 v6, 0532; GCN-NEXT: s_waitcnt lgkmcnt(0)533; GCN-NEXT: s_mov_b64 s[4:5], s[2:3]534; GCN-NEXT: buffer_load_dwordx4 v[1:4], v[5:6], s[4:7], 0 addr64535; GCN-NEXT: v_lshlrev_b32_e32 v9, 1, v0536; GCN-NEXT: v_mov_b32_e32 v10, v6537; GCN-NEXT: s_mov_b64 s[2:3], s[6:7]538; GCN-NEXT: buffer_load_dwordx4 v[5:8], v[5:6], s[4:7], 0 addr64 offset:16539; GCN-NEXT: s_cmp_eq_u32 s8, 1540; GCN-NEXT: s_waitcnt vmcnt(1)541; GCN-NEXT: v_lshrrev_b32_e32 v0, 16, v1542; GCN-NEXT: s_cselect_b64 vcc, -1, 0543; GCN-NEXT: s_cmp_eq_u32 s8, 2544; GCN-NEXT: v_lshrrev_b32_e32 v11, 16, v2545; GCN-NEXT: v_lshrrev_b32_e32 v12, 16, v3546; GCN-NEXT: v_lshrrev_b32_e32 v13, 16, v4547; GCN-NEXT: s_waitcnt vmcnt(0)548; GCN-NEXT: v_lshrrev_b32_e32 v14, 16, v5549; GCN-NEXT: v_lshrrev_b32_e32 v15, 16, v6550; GCN-NEXT: v_lshrrev_b32_e32 v16, 16, v7551; GCN-NEXT: v_lshrrev_b32_e32 v17, 16, v8552; GCN-NEXT: v_cndmask_b32_e32 v0, v1, v0, vcc553; GCN-NEXT: s_cselect_b64 vcc, -1, 0554; GCN-NEXT: s_cmp_eq_u32 s8, 3555; GCN-NEXT: v_cndmask_b32_e32 v0, v0, v2, vcc556; GCN-NEXT: s_cselect_b64 vcc, -1, 0557; GCN-NEXT: s_cmp_eq_u32 s8, 4558; GCN-NEXT: v_cndmask_b32_e32 v0, v0, v11, vcc559; GCN-NEXT: s_cselect_b64 vcc, -1, 0560; GCN-NEXT: s_cmp_eq_u32 s8, 5561; GCN-NEXT: v_cndmask_b32_e32 v0, v0, v3, vcc562; GCN-NEXT: s_cselect_b64 vcc, -1, 0563; GCN-NEXT: s_cmp_eq_u32 s8, 6564; GCN-NEXT: v_cndmask_b32_e32 v0, v0, v12, vcc565; GCN-NEXT: s_cselect_b64 vcc, -1, 0566; GCN-NEXT: s_cmp_eq_u32 s8, 7567; GCN-NEXT: v_cndmask_b32_e32 v0, v0, v4, vcc568; GCN-NEXT: s_cselect_b64 vcc, -1, 0569; GCN-NEXT: s_cmp_eq_u32 s8, 8570; GCN-NEXT: v_cndmask_b32_e32 v0, v0, v13, vcc571; GCN-NEXT: s_cselect_b64 vcc, -1, 0572; GCN-NEXT: s_cmp_eq_u32 s8, 9573; GCN-NEXT: v_cndmask_b32_e32 v0, v0, v5, vcc574; GCN-NEXT: s_cselect_b64 vcc, -1, 0575; GCN-NEXT: s_cmp_eq_u32 s8, 10576; GCN-NEXT: v_cndmask_b32_e32 v0, v0, v14, vcc577; GCN-NEXT: s_cselect_b64 vcc, -1, 0578; GCN-NEXT: s_cmp_eq_u32 s8, 11579; GCN-NEXT: v_cndmask_b32_e32 v0, v0, v6, vcc580; GCN-NEXT: s_cselect_b64 vcc, -1, 0581; GCN-NEXT: s_cmp_eq_u32 s8, 12582; GCN-NEXT: v_cndmask_b32_e32 v0, v0, v15, vcc583; GCN-NEXT: s_cselect_b64 vcc, -1, 0584; GCN-NEXT: s_cmp_eq_u32 s8, 13585; GCN-NEXT: v_cndmask_b32_e32 v0, v0, v7, vcc586; GCN-NEXT: s_cselect_b64 vcc, -1, 0587; GCN-NEXT: s_cmp_eq_u32 s8, 14588; GCN-NEXT: v_cndmask_b32_e32 v0, v0, v16, vcc589; GCN-NEXT: s_cselect_b64 vcc, -1, 0590; GCN-NEXT: s_cmp_eq_u32 s8, 15591; GCN-NEXT: v_cndmask_b32_e32 v0, v0, v8, vcc592; GCN-NEXT: s_cselect_b64 vcc, -1, 0593; GCN-NEXT: v_cndmask_b32_e32 v0, v0, v17, vcc594; GCN-NEXT: buffer_store_short v0, v[9:10], s[0:3], 0 addr64595; GCN-NEXT: s_endpgm596 %tid = call i32 @llvm.amdgcn.workitem.id.x() #1597 %tid.ext = sext i32 %tid to i64598 %in.gep = getelementptr inbounds <16 x i16>, ptr addrspace(1) %in, i64 %tid.ext599 %out.gep = getelementptr inbounds i16, ptr addrspace(1) %out, i64 %tid.ext600 %vec = load <16 x i16>, ptr addrspace(1) %in.gep601 %vec.extract = extractelement <16 x i16> %vec, i32 %n602 store i16 %vec.extract, ptr addrspace(1) %out.gep603 ret void604}605 606declare i32 @llvm.amdgcn.workitem.id.x() #1607 608attributes #0 = { nounwind }609attributes #1 = { nounwind readnone }610