581 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=amdgcn--amdhsa -mcpu=gfx900 -mattr=-flat-for-global -denormal-fp-math=preserve-sign < %s | FileCheck -enable-var-scope --check-prefixes=GFX9 %s3; RUN: llc -mtriple=amdgcn--amdhsa -mcpu=fiji -mattr=-flat-for-global < %s | FileCheck -enable-var-scope -check-prefix=GFX803 %s4; RUN: llc -mtriple=amdgcn--amdhsa -mcpu=kaveri -mattr=-flat-for-global < %s | FileCheck -enable-var-scope -check-prefix=GFX7 %s5 6 7define amdgpu_kernel void @s_pack_v2i16(ptr addrspace(4) %in0, ptr addrspace(4) %in1) #0 {8; GFX9-LABEL: s_pack_v2i16:9; GFX9: ; %bb.0:10; GFX9-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x011; GFX9-NEXT: s_waitcnt lgkmcnt(0)12; GFX9-NEXT: s_load_dword s4, s[0:1], 0x013; GFX9-NEXT: s_load_dword s5, s[2:3], 0x014; GFX9-NEXT: s_waitcnt lgkmcnt(0)15; GFX9-NEXT: s_pack_ll_b32_b16 s0, s4, s516; GFX9-NEXT: ;;#ASMSTART17; GFX9-NEXT: ; use s018; GFX9-NEXT: ;;#ASMEND19; GFX9-NEXT: s_endpgm20;21; GFX803-LABEL: s_pack_v2i16:22; GFX803: ; %bb.0:23; GFX803-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x024; GFX803-NEXT: s_waitcnt lgkmcnt(0)25; GFX803-NEXT: s_load_dword s0, s[0:1], 0x026; GFX803-NEXT: s_load_dword s1, s[2:3], 0x027; GFX803-NEXT: s_waitcnt lgkmcnt(0)28; GFX803-NEXT: s_and_b32 s0, s0, 0xffff29; GFX803-NEXT: s_lshl_b32 s1, s1, 1630; GFX803-NEXT: s_or_b32 s0, s0, s131; GFX803-NEXT: ;;#ASMSTART32; GFX803-NEXT: ; use s033; GFX803-NEXT: ;;#ASMEND34; GFX803-NEXT: s_endpgm35;36; GFX7-LABEL: s_pack_v2i16:37; GFX7: ; %bb.0:38; GFX7-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x039; GFX7-NEXT: s_waitcnt lgkmcnt(0)40; GFX7-NEXT: s_load_dword s0, s[0:1], 0x041; GFX7-NEXT: s_load_dword s1, s[2:3], 0x042; GFX7-NEXT: s_waitcnt lgkmcnt(0)43; GFX7-NEXT: s_and_b32 s0, s0, 0xffff44; GFX7-NEXT: s_lshl_b32 s1, s1, 1645; GFX7-NEXT: s_or_b32 s0, s0, s146; GFX7-NEXT: ;;#ASMSTART47; GFX7-NEXT: ; use s048; GFX7-NEXT: ;;#ASMEND49; GFX7-NEXT: s_endpgm50 %val0 = load volatile i32, ptr addrspace(4) %in051 %val1 = load volatile i32, ptr addrspace(4) %in152 %lo = trunc i32 %val0 to i1653 %hi = trunc i32 %val1 to i1654 %vec.0 = insertelement <2 x i16> poison, i16 %lo, i32 055 %vec.1 = insertelement <2 x i16> %vec.0, i16 %hi, i32 156 %vec.i32 = bitcast <2 x i16> %vec.1 to i3257 58 call void asm sideeffect "; use $0", "s"(i32 %vec.i32) #059 ret void60}61 62define amdgpu_kernel void @s_pack_v2i16_imm_lo(ptr addrspace(4) %in1) #0 {63; GFX9-LABEL: s_pack_v2i16_imm_lo:64; GFX9: ; %bb.0:65; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x066; GFX9-NEXT: s_waitcnt lgkmcnt(0)67; GFX9-NEXT: s_load_dword s0, s[0:1], 0x068; GFX9-NEXT: s_waitcnt lgkmcnt(0)69; GFX9-NEXT: s_pack_ll_b32_b16 s0, 0x1c8, s070; GFX9-NEXT: ;;#ASMSTART71; GFX9-NEXT: ; use s072; GFX9-NEXT: ;;#ASMEND73; GFX9-NEXT: s_endpgm74;75; GFX803-LABEL: s_pack_v2i16_imm_lo:76; GFX803: ; %bb.0:77; GFX803-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x078; GFX803-NEXT: s_waitcnt lgkmcnt(0)79; GFX803-NEXT: s_load_dword s0, s[0:1], 0x080; GFX803-NEXT: s_waitcnt lgkmcnt(0)81; GFX803-NEXT: s_lshl_b32 s0, s0, 1682; GFX803-NEXT: s_or_b32 s0, s0, 0x1c883; GFX803-NEXT: ;;#ASMSTART84; GFX803-NEXT: ; use s085; GFX803-NEXT: ;;#ASMEND86; GFX803-NEXT: s_endpgm87;88; GFX7-LABEL: s_pack_v2i16_imm_lo:89; GFX7: ; %bb.0:90; GFX7-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x091; GFX7-NEXT: s_waitcnt lgkmcnt(0)92; GFX7-NEXT: s_load_dword s0, s[0:1], 0x093; GFX7-NEXT: s_waitcnt lgkmcnt(0)94; GFX7-NEXT: s_lshl_b32 s0, s0, 1695; GFX7-NEXT: s_or_b32 s0, s0, 0x1c896; GFX7-NEXT: ;;#ASMSTART97; GFX7-NEXT: ; use s098; GFX7-NEXT: ;;#ASMEND99; GFX7-NEXT: s_endpgm100 %val1 = load i32, ptr addrspace(4) %in1101 %hi = trunc i32 %val1 to i16102 %vec.0 = insertelement <2 x i16> poison, i16 456, i32 0103 %vec.1 = insertelement <2 x i16> %vec.0, i16 %hi, i32 1104 %vec.i32 = bitcast <2 x i16> %vec.1 to i32105 106 call void asm sideeffect "; use $0", "s"(i32 %vec.i32) #0107 ret void108}109 110define amdgpu_kernel void @s_pack_v2i16_imm_hi(ptr addrspace(4) %in0) #0 {111; GFX9-LABEL: s_pack_v2i16_imm_hi:112; GFX9: ; %bb.0:113; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0114; GFX9-NEXT: s_waitcnt lgkmcnt(0)115; GFX9-NEXT: s_load_dword s0, s[0:1], 0x0116; GFX9-NEXT: s_waitcnt lgkmcnt(0)117; GFX9-NEXT: s_pack_ll_b32_b16 s0, s0, 0x1c8118; GFX9-NEXT: ;;#ASMSTART119; GFX9-NEXT: ; use s0120; GFX9-NEXT: ;;#ASMEND121; GFX9-NEXT: s_endpgm122;123; GFX803-LABEL: s_pack_v2i16_imm_hi:124; GFX803: ; %bb.0:125; GFX803-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0126; GFX803-NEXT: s_waitcnt lgkmcnt(0)127; GFX803-NEXT: s_load_dword s0, s[0:1], 0x0128; GFX803-NEXT: s_waitcnt lgkmcnt(0)129; GFX803-NEXT: s_and_b32 s0, s0, 0xffff130; GFX803-NEXT: s_or_b32 s0, s0, 0x1c80000131; GFX803-NEXT: ;;#ASMSTART132; GFX803-NEXT: ; use s0133; GFX803-NEXT: ;;#ASMEND134; GFX803-NEXT: s_endpgm135;136; GFX7-LABEL: s_pack_v2i16_imm_hi:137; GFX7: ; %bb.0:138; GFX7-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0139; GFX7-NEXT: s_waitcnt lgkmcnt(0)140; GFX7-NEXT: s_load_dword s0, s[0:1], 0x0141; GFX7-NEXT: s_waitcnt lgkmcnt(0)142; GFX7-NEXT: s_and_b32 s0, s0, 0xffff143; GFX7-NEXT: s_or_b32 s0, s0, 0x1c80000144; GFX7-NEXT: ;;#ASMSTART145; GFX7-NEXT: ; use s0146; GFX7-NEXT: ;;#ASMEND147; GFX7-NEXT: s_endpgm148 %val0 = load i32, ptr addrspace(4) %in0149 %lo = trunc i32 %val0 to i16150 %vec.0 = insertelement <2 x i16> poison, i16 %lo, i32 0151 %vec.1 = insertelement <2 x i16> %vec.0, i16 456, i32 1152 %vec.i32 = bitcast <2 x i16> %vec.1 to i32153 154 call void asm sideeffect "; use $0", "s"(i32 %vec.i32) #0155 ret void156}157 158define amdgpu_kernel void @v_pack_v2i16(ptr addrspace(1) %in0, ptr addrspace(1) %in1) #0 {159; GFX9-LABEL: v_pack_v2i16:160; GFX9: ; %bb.0:161; GFX9-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0162; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0163; GFX9-NEXT: s_waitcnt lgkmcnt(0)164; GFX9-NEXT: global_load_dword v1, v0, s[0:1] glc165; GFX9-NEXT: s_waitcnt vmcnt(0)166; GFX9-NEXT: global_load_dword v2, v0, s[2:3] glc167; GFX9-NEXT: s_waitcnt vmcnt(0)168; GFX9-NEXT: s_mov_b32 s0, 0x5040100169; GFX9-NEXT: v_perm_b32 v0, v2, v1, s0170; GFX9-NEXT: ;;#ASMSTART171; GFX9-NEXT: ; use v0172; GFX9-NEXT: ;;#ASMEND173; GFX9-NEXT: s_endpgm174;175; GFX803-LABEL: v_pack_v2i16:176; GFX803: ; %bb.0:177; GFX803-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0178; GFX803-NEXT: v_lshlrev_b32_e32 v2, 2, v0179; GFX803-NEXT: s_add_i32 s12, s12, s17180; GFX803-NEXT: s_mov_b32 flat_scratch_lo, s13181; GFX803-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8182; GFX803-NEXT: s_waitcnt lgkmcnt(0)183; GFX803-NEXT: v_mov_b32_e32 v1, s1184; GFX803-NEXT: v_add_u32_e32 v0, vcc, s0, v2185; GFX803-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc186; GFX803-NEXT: v_mov_b32_e32 v3, s3187; GFX803-NEXT: v_add_u32_e32 v2, vcc, s2, v2188; GFX803-NEXT: v_addc_u32_e32 v3, vcc, 0, v3, vcc189; GFX803-NEXT: flat_load_dword v0, v[0:1] glc190; GFX803-NEXT: s_waitcnt vmcnt(0)191; GFX803-NEXT: flat_load_dword v1, v[2:3] glc192; GFX803-NEXT: s_waitcnt vmcnt(0)193; GFX803-NEXT: s_mov_b32 s0, 0x1000504194; GFX803-NEXT: v_perm_b32 v0, v0, v1, s0195; GFX803-NEXT: ;;#ASMSTART196; GFX803-NEXT: ; use v0197; GFX803-NEXT: ;;#ASMEND198; GFX803-NEXT: s_endpgm199;200; GFX7-LABEL: v_pack_v2i16:201; GFX7: ; %bb.0:202; GFX7-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0203; GFX7-NEXT: s_mov_b32 s7, 0x100f000204; GFX7-NEXT: s_mov_b32 s6, 0205; GFX7-NEXT: v_lshlrev_b32_e32 v0, 2, v0206; GFX7-NEXT: v_mov_b32_e32 v1, 0207; GFX7-NEXT: s_waitcnt lgkmcnt(0)208; GFX7-NEXT: s_mov_b64 s[4:5], s[0:1]209; GFX7-NEXT: s_mov_b64 s[0:1], s[2:3]210; GFX7-NEXT: s_mov_b64 s[2:3], s[6:7]211; GFX7-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr64 glc212; GFX7-NEXT: s_waitcnt vmcnt(0)213; GFX7-NEXT: buffer_load_dword v0, v[0:1], s[0:3], 0 addr64 glc214; GFX7-NEXT: s_waitcnt vmcnt(0)215; GFX7-NEXT: v_and_b32_e32 v1, 0xffff, v2216; GFX7-NEXT: v_lshlrev_b32_e32 v0, 16, v0217; GFX7-NEXT: v_or_b32_e32 v0, v1, v0218; GFX7-NEXT: ;;#ASMSTART219; GFX7-NEXT: ; use v0220; GFX7-NEXT: ;;#ASMEND221; GFX7-NEXT: s_endpgm222 %tid = call i32 @llvm.amdgcn.workitem.id.x()223 %tid.ext = sext i32 %tid to i64224 %in0.gep = getelementptr inbounds i32, ptr addrspace(1) %in0, i64 %tid.ext225 %in1.gep = getelementptr inbounds i32, ptr addrspace(1) %in1, i64 %tid.ext226 %val0 = load volatile i32, ptr addrspace(1) %in0.gep227 %val1 = load volatile i32, ptr addrspace(1) %in1.gep228 %lo = trunc i32 %val0 to i16229 %hi = trunc i32 %val1 to i16230 %vec.0 = insertelement <2 x i16> poison, i16 %lo, i32 0231 %vec.1 = insertelement <2 x i16> %vec.0, i16 %hi, i32 1232 %vec.i32 = bitcast <2 x i16> %vec.1 to i32233 call void asm sideeffect "; use $0", "v"(i32 %vec.i32) #0234 ret void235}236 237define amdgpu_kernel void @v_pack_v2i16_user(ptr addrspace(1) %in0, ptr addrspace(1) %in1) #0 {238; GFX9-LABEL: v_pack_v2i16_user:239; GFX9: ; %bb.0:240; GFX9-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0241; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0242; GFX9-NEXT: s_waitcnt lgkmcnt(0)243; GFX9-NEXT: global_load_dword v1, v0, s[0:1] glc244; GFX9-NEXT: s_waitcnt vmcnt(0)245; GFX9-NEXT: global_load_dword v2, v0, s[2:3] glc246; GFX9-NEXT: s_waitcnt vmcnt(0)247; GFX9-NEXT: s_mov_b32 s0, 0x5040100248; GFX9-NEXT: s_mov_b32 s3, 0xf000249; GFX9-NEXT: s_mov_b32 s2, -1250; GFX9-NEXT: v_perm_b32 v0, v2, v1, s0251; GFX9-NEXT: v_add_u32_e32 v0, 9, v0252; GFX9-NEXT: buffer_store_dword v0, off, s[0:3], 0253; GFX9-NEXT: s_waitcnt vmcnt(0)254; GFX9-NEXT: s_endpgm255;256; GFX803-LABEL: v_pack_v2i16_user:257; GFX803: ; %bb.0:258; GFX803-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0259; GFX803-NEXT: v_lshlrev_b32_e32 v2, 2, v0260; GFX803-NEXT: s_add_i32 s12, s12, s17261; GFX803-NEXT: s_mov_b32 flat_scratch_lo, s13262; GFX803-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8263; GFX803-NEXT: s_waitcnt lgkmcnt(0)264; GFX803-NEXT: v_mov_b32_e32 v1, s1265; GFX803-NEXT: v_add_u32_e32 v0, vcc, s0, v2266; GFX803-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc267; GFX803-NEXT: v_mov_b32_e32 v3, s3268; GFX803-NEXT: v_add_u32_e32 v2, vcc, s2, v2269; GFX803-NEXT: v_addc_u32_e32 v3, vcc, 0, v3, vcc270; GFX803-NEXT: flat_load_dword v0, v[0:1] glc271; GFX803-NEXT: s_waitcnt vmcnt(0)272; GFX803-NEXT: flat_load_dword v1, v[2:3] glc273; GFX803-NEXT: s_waitcnt vmcnt(0)274; GFX803-NEXT: s_mov_b32 s0, 0x1000504275; GFX803-NEXT: s_mov_b32 s3, 0x1100f000276; GFX803-NEXT: s_mov_b32 s2, -1277; GFX803-NEXT: v_perm_b32 v0, v0, v1, s0278; GFX803-NEXT: v_add_u32_e32 v0, vcc, 9, v0279; GFX803-NEXT: buffer_store_dword v0, off, s[0:3], 0280; GFX803-NEXT: s_waitcnt vmcnt(0)281; GFX803-NEXT: s_endpgm282;283; GFX7-LABEL: v_pack_v2i16_user:284; GFX7: ; %bb.0:285; GFX7-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0286; GFX7-NEXT: s_mov_b32 s6, 0287; GFX7-NEXT: s_mov_b32 s7, 0x100f000288; GFX7-NEXT: v_lshlrev_b32_e32 v0, 2, v0289; GFX7-NEXT: v_mov_b32_e32 v1, 0290; GFX7-NEXT: s_waitcnt lgkmcnt(0)291; GFX7-NEXT: s_mov_b64 s[4:5], s[0:1]292; GFX7-NEXT: s_mov_b64 s[0:1], s[2:3]293; GFX7-NEXT: s_mov_b64 s[2:3], s[6:7]294; GFX7-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr64 glc295; GFX7-NEXT: s_waitcnt vmcnt(0)296; GFX7-NEXT: buffer_load_dword v0, v[0:1], s[0:3], 0 addr64 glc297; GFX7-NEXT: s_waitcnt vmcnt(0)298; GFX7-NEXT: s_mov_b32 s6, -1299; GFX7-NEXT: v_and_b32_e32 v1, 0xffff, v2300; GFX7-NEXT: v_lshlrev_b32_e32 v0, 16, v0301; GFX7-NEXT: v_or_b32_e32 v0, v1, v0302; GFX7-NEXT: v_add_i32_e32 v0, vcc, 9, v0303; GFX7-NEXT: buffer_store_dword v0, off, s[4:7], 0304; GFX7-NEXT: s_waitcnt vmcnt(0)305; GFX7-NEXT: s_endpgm306 %tid = call i32 @llvm.amdgcn.workitem.id.x()307 %tid.ext = sext i32 %tid to i64308 %in0.gep = getelementptr inbounds i32, ptr addrspace(1) %in0, i64 %tid.ext309 %in1.gep = getelementptr inbounds i32, ptr addrspace(1) %in1, i64 %tid.ext310 %val0 = load volatile i32, ptr addrspace(1) %in0.gep311 %val1 = load volatile i32, ptr addrspace(1) %in1.gep312 %lo = trunc i32 %val0 to i16313 %hi = trunc i32 %val1 to i16314 %vec.0 = insertelement <2 x i16> poison, i16 %lo, i32 0315 %vec.1 = insertelement <2 x i16> %vec.0, i16 %hi, i32 1316 %vec.i32 = bitcast <2 x i16> %vec.1 to i32317 %foo = add i32 %vec.i32, 9318 store volatile i32 %foo, ptr addrspace(1) poison319 ret void320}321 322define amdgpu_kernel void @v_pack_v2i16_imm_lo(ptr addrspace(1) %in1) #0 {323; GFX9-LABEL: v_pack_v2i16_imm_lo:324; GFX9: ; %bb.0:325; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0326; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0327; GFX9-NEXT: v_mov_b32_e32 v1, 0x5040100328; GFX9-NEXT: s_waitcnt lgkmcnt(0)329; GFX9-NEXT: global_load_dword v0, v0, s[0:1] glc330; GFX9-NEXT: s_waitcnt vmcnt(0)331; GFX9-NEXT: s_movk_i32 s0, 0x7b332; GFX9-NEXT: v_perm_b32 v0, v0, s0, v1333; GFX9-NEXT: ;;#ASMSTART334; GFX9-NEXT: ; use v0335; GFX9-NEXT: ;;#ASMEND336; GFX9-NEXT: s_endpgm337;338; GFX803-LABEL: v_pack_v2i16_imm_lo:339; GFX803: ; %bb.0:340; GFX803-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0341; GFX803-NEXT: v_lshlrev_b32_e32 v0, 2, v0342; GFX803-NEXT: s_add_i32 s12, s12, s17343; GFX803-NEXT: s_mov_b32 flat_scratch_lo, s13344; GFX803-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8345; GFX803-NEXT: s_waitcnt lgkmcnt(0)346; GFX803-NEXT: v_mov_b32_e32 v1, s1347; GFX803-NEXT: v_add_u32_e32 v0, vcc, s0, v0348; GFX803-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc349; GFX803-NEXT: flat_load_dword v0, v[0:1] glc350; GFX803-NEXT: s_waitcnt vmcnt(0)351; GFX803-NEXT: v_lshlrev_b32_e32 v0, 16, v0352; GFX803-NEXT: v_or_b32_e32 v0, 0x7b, v0353; GFX803-NEXT: ;;#ASMSTART354; GFX803-NEXT: ; use v0355; GFX803-NEXT: ;;#ASMEND356; GFX803-NEXT: s_endpgm357;358; GFX7-LABEL: v_pack_v2i16_imm_lo:359; GFX7: ; %bb.0:360; GFX7-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0361; GFX7-NEXT: s_mov_b32 s3, 0x100f000362; GFX7-NEXT: s_mov_b32 s2, 0363; GFX7-NEXT: v_lshlrev_b32_e32 v0, 2, v0364; GFX7-NEXT: v_mov_b32_e32 v1, 0365; GFX7-NEXT: s_waitcnt lgkmcnt(0)366; GFX7-NEXT: buffer_load_dword v0, v[0:1], s[0:3], 0 addr64 glc367; GFX7-NEXT: s_waitcnt vmcnt(0)368; GFX7-NEXT: v_lshlrev_b32_e32 v0, 16, v0369; GFX7-NEXT: v_or_b32_e32 v0, 0x7b, v0370; GFX7-NEXT: ;;#ASMSTART371; GFX7-NEXT: ; use v0372; GFX7-NEXT: ;;#ASMEND373; GFX7-NEXT: s_endpgm374 %tid = call i32 @llvm.amdgcn.workitem.id.x()375 %tid.ext = sext i32 %tid to i64376 %in1.gep = getelementptr inbounds i32, ptr addrspace(1) %in1, i64 %tid.ext377 %val1 = load volatile i32, ptr addrspace(1) %in1.gep378 %hi = trunc i32 %val1 to i16379 %vec.0 = insertelement <2 x i16> poison, i16 123, i32 0380 %vec.1 = insertelement <2 x i16> %vec.0, i16 %hi, i32 1381 %vec.i32 = bitcast <2 x i16> %vec.1 to i32382 call void asm sideeffect "; use $0", "v"(i32 %vec.i32) #0383 ret void384}385 386define amdgpu_kernel void @v_pack_v2i16_inline_imm_lo(ptr addrspace(1) %in1) #0 {387; GFX9-LABEL: v_pack_v2i16_inline_imm_lo:388; GFX9: ; %bb.0:389; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0390; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0391; GFX9-NEXT: v_mov_b32_e32 v1, 0x5040100392; GFX9-NEXT: s_waitcnt lgkmcnt(0)393; GFX9-NEXT: global_load_dword v0, v0, s[0:1] glc394; GFX9-NEXT: s_waitcnt vmcnt(0)395; GFX9-NEXT: v_perm_b32 v0, v0, 64, v1396; GFX9-NEXT: ;;#ASMSTART397; GFX9-NEXT: ; use v0398; GFX9-NEXT: ;;#ASMEND399; GFX9-NEXT: s_endpgm400;401; GFX803-LABEL: v_pack_v2i16_inline_imm_lo:402; GFX803: ; %bb.0:403; GFX803-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0404; GFX803-NEXT: v_lshlrev_b32_e32 v0, 2, v0405; GFX803-NEXT: s_add_i32 s12, s12, s17406; GFX803-NEXT: s_mov_b32 flat_scratch_lo, s13407; GFX803-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8408; GFX803-NEXT: s_waitcnt lgkmcnt(0)409; GFX803-NEXT: v_mov_b32_e32 v1, s1410; GFX803-NEXT: v_add_u32_e32 v0, vcc, s0, v0411; GFX803-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc412; GFX803-NEXT: flat_load_dword v0, v[0:1] glc413; GFX803-NEXT: s_waitcnt vmcnt(0)414; GFX803-NEXT: v_lshlrev_b32_e32 v0, 16, v0415; GFX803-NEXT: v_or_b32_e32 v0, 64, v0416; GFX803-NEXT: ;;#ASMSTART417; GFX803-NEXT: ; use v0418; GFX803-NEXT: ;;#ASMEND419; GFX803-NEXT: s_endpgm420;421; GFX7-LABEL: v_pack_v2i16_inline_imm_lo:422; GFX7: ; %bb.0:423; GFX7-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0424; GFX7-NEXT: s_mov_b32 s3, 0x100f000425; GFX7-NEXT: s_mov_b32 s2, 0426; GFX7-NEXT: v_lshlrev_b32_e32 v0, 2, v0427; GFX7-NEXT: v_mov_b32_e32 v1, 0428; GFX7-NEXT: s_waitcnt lgkmcnt(0)429; GFX7-NEXT: buffer_load_dword v0, v[0:1], s[0:3], 0 addr64 glc430; GFX7-NEXT: s_waitcnt vmcnt(0)431; GFX7-NEXT: v_lshlrev_b32_e32 v0, 16, v0432; GFX7-NEXT: v_or_b32_e32 v0, 64, v0433; GFX7-NEXT: ;;#ASMSTART434; GFX7-NEXT: ; use v0435; GFX7-NEXT: ;;#ASMEND436; GFX7-NEXT: s_endpgm437 %tid = call i32 @llvm.amdgcn.workitem.id.x()438 %tid.ext = sext i32 %tid to i64439 %in1.gep = getelementptr inbounds i32, ptr addrspace(1) %in1, i64 %tid.ext440 %val1 = load volatile i32, ptr addrspace(1) %in1.gep441 %hi = trunc i32 %val1 to i16442 %vec.0 = insertelement <2 x i16> poison, i16 64, i32 0443 %vec.1 = insertelement <2 x i16> %vec.0, i16 %hi, i32 1444 %vec.i32 = bitcast <2 x i16> %vec.1 to i32445 call void asm sideeffect "; use $0", "v"(i32 %vec.i32) #0446 ret void447}448 449define amdgpu_kernel void @v_pack_v2i16_imm_hi(ptr addrspace(1) %in0) #0 {450; GFX9-LABEL: v_pack_v2i16_imm_hi:451; GFX9: ; %bb.0:452; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0453; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0454; GFX9-NEXT: v_mov_b32_e32 v1, 0x5040100455; GFX9-NEXT: s_waitcnt lgkmcnt(0)456; GFX9-NEXT: global_load_dword v0, v0, s[0:1] glc457; GFX9-NEXT: s_waitcnt vmcnt(0)458; GFX9-NEXT: s_movk_i32 s0, 0x7b459; GFX9-NEXT: v_perm_b32 v0, s0, v0, v1460; GFX9-NEXT: ;;#ASMSTART461; GFX9-NEXT: ; use v0462; GFX9-NEXT: ;;#ASMEND463; GFX9-NEXT: s_endpgm464;465; GFX803-LABEL: v_pack_v2i16_imm_hi:466; GFX803: ; %bb.0:467; GFX803-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0468; GFX803-NEXT: v_lshlrev_b32_e32 v0, 2, v0469; GFX803-NEXT: s_add_i32 s12, s12, s17470; GFX803-NEXT: s_mov_b32 flat_scratch_lo, s13471; GFX803-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8472; GFX803-NEXT: s_waitcnt lgkmcnt(0)473; GFX803-NEXT: v_mov_b32_e32 v1, s1474; GFX803-NEXT: v_add_u32_e32 v0, vcc, s0, v0475; GFX803-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc476; GFX803-NEXT: flat_load_dword v0, v[0:1] glc477; GFX803-NEXT: s_waitcnt vmcnt(0)478; GFX803-NEXT: v_mov_b32_e32 v1, 0x7b0000479; GFX803-NEXT: v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD480; GFX803-NEXT: ;;#ASMSTART481; GFX803-NEXT: ; use v0482; GFX803-NEXT: ;;#ASMEND483; GFX803-NEXT: s_endpgm484;485; GFX7-LABEL: v_pack_v2i16_imm_hi:486; GFX7: ; %bb.0:487; GFX7-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0488; GFX7-NEXT: s_mov_b32 s3, 0x100f000489; GFX7-NEXT: s_mov_b32 s2, 0490; GFX7-NEXT: v_lshlrev_b32_e32 v0, 2, v0491; GFX7-NEXT: v_mov_b32_e32 v1, 0492; GFX7-NEXT: s_waitcnt lgkmcnt(0)493; GFX7-NEXT: buffer_load_dword v0, v[0:1], s[0:3], 0 addr64 glc494; GFX7-NEXT: s_waitcnt vmcnt(0)495; GFX7-NEXT: v_and_b32_e32 v0, 0xffff, v0496; GFX7-NEXT: v_or_b32_e32 v0, 0x7b0000, v0497; GFX7-NEXT: ;;#ASMSTART498; GFX7-NEXT: ; use v0499; GFX7-NEXT: ;;#ASMEND500; GFX7-NEXT: s_endpgm501 %tid = call i32 @llvm.amdgcn.workitem.id.x()502 %tid.ext = sext i32 %tid to i64503 %in0.gep = getelementptr inbounds i32, ptr addrspace(1) %in0, i64 %tid.ext504 %val0 = load volatile i32, ptr addrspace(1) %in0.gep505 %lo = trunc i32 %val0 to i16506 %vec.0 = insertelement <2 x i16> poison, i16 %lo, i32 0507 %vec.1 = insertelement <2 x i16> %vec.0, i16 123, i32 1508 %vec.i32 = bitcast <2 x i16> %vec.1 to i32509 call void asm sideeffect "; use $0", "v"(i32 %vec.i32) #0510 ret void511}512 513define amdgpu_kernel void @v_pack_v2i16_inline_imm_hi(ptr addrspace(1) %in0) #0 {514; GFX9-LABEL: v_pack_v2i16_inline_imm_hi:515; GFX9: ; %bb.0:516; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0517; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0518; GFX9-NEXT: v_mov_b32_e32 v1, 0x5040100519; GFX9-NEXT: s_waitcnt lgkmcnt(0)520; GFX9-NEXT: global_load_dword v0, v0, s[0:1] glc521; GFX9-NEXT: s_waitcnt vmcnt(0)522; GFX9-NEXT: v_perm_b32 v0, 7, v0, v1523; GFX9-NEXT: ;;#ASMSTART524; GFX9-NEXT: ; use v0525; GFX9-NEXT: ;;#ASMEND526; GFX9-NEXT: s_endpgm527;528; GFX803-LABEL: v_pack_v2i16_inline_imm_hi:529; GFX803: ; %bb.0:530; GFX803-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0531; GFX803-NEXT: v_lshlrev_b32_e32 v0, 2, v0532; GFX803-NEXT: s_add_i32 s12, s12, s17533; GFX803-NEXT: s_mov_b32 flat_scratch_lo, s13534; GFX803-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8535; GFX803-NEXT: s_waitcnt lgkmcnt(0)536; GFX803-NEXT: v_mov_b32_e32 v1, s1537; GFX803-NEXT: v_add_u32_e32 v0, vcc, s0, v0538; GFX803-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc539; GFX803-NEXT: flat_load_dword v0, v[0:1] glc540; GFX803-NEXT: s_waitcnt vmcnt(0)541; GFX803-NEXT: v_mov_b32_e32 v1, 0x70000542; GFX803-NEXT: v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD543; GFX803-NEXT: ;;#ASMSTART544; GFX803-NEXT: ; use v0545; GFX803-NEXT: ;;#ASMEND546; GFX803-NEXT: s_endpgm547;548; GFX7-LABEL: v_pack_v2i16_inline_imm_hi:549; GFX7: ; %bb.0:550; GFX7-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0551; GFX7-NEXT: s_mov_b32 s3, 0x100f000552; GFX7-NEXT: s_mov_b32 s2, 0553; GFX7-NEXT: v_lshlrev_b32_e32 v0, 2, v0554; GFX7-NEXT: v_mov_b32_e32 v1, 0555; GFX7-NEXT: s_waitcnt lgkmcnt(0)556; GFX7-NEXT: buffer_load_dword v0, v[0:1], s[0:3], 0 addr64 glc557; GFX7-NEXT: s_waitcnt vmcnt(0)558; GFX7-NEXT: v_and_b32_e32 v0, 0xffff, v0559; GFX7-NEXT: v_or_b32_e32 v0, 0x70000, v0560; GFX7-NEXT: ;;#ASMSTART561; GFX7-NEXT: ; use v0562; GFX7-NEXT: ;;#ASMEND563; GFX7-NEXT: s_endpgm564 %tid = call i32 @llvm.amdgcn.workitem.id.x()565 %tid.ext = sext i32 %tid to i64566 %in0.gep = getelementptr inbounds i32, ptr addrspace(1) %in0, i64 %tid.ext567 %val0 = load volatile i32, ptr addrspace(1) %in0.gep568 %lo = trunc i32 %val0 to i16569 %vec.0 = insertelement <2 x i16> poison, i16 %lo, i32 0570 %vec.1 = insertelement <2 x i16> %vec.0, i16 7, i32 1571 %vec.i32 = bitcast <2 x i16> %vec.1 to i32572 call void asm sideeffect "; use $0", "v"(i32 %vec.i32) #0573 ret void574}575 576declare i32 @llvm.amdgcn.workitem.id.x() #1577 578attributes #0 = { nounwind }579attributes #1 = { nounwind readnone }580 581