658 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 --check-prefixes=GFX9 %s3; RUN: llc -mtriple=amdgcn--amdhsa -mcpu=fiji -mattr=-flat-for-global < %s | FileCheck -check-prefix=GFX8 %s4; RUN: llc -mtriple=amdgcn--amdhsa -mcpu=kaveri -mattr=-flat-for-global < %s | FileCheck -check-prefix=GFX7 %s5 6 7define amdgpu_kernel void @s_pack_v2f16(ptr addrspace(4) %in0, ptr addrspace(4) %in1) #0 {8; GFX9-LABEL: s_pack_v2f16: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; GFX8-LABEL: s_pack_v2f16:22; GFX8: ; %bb.0:23; GFX8-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x024; GFX8-NEXT: s_waitcnt lgkmcnt(0)25; GFX8-NEXT: s_load_dword s0, s[0:1], 0x026; GFX8-NEXT: s_load_dword s1, s[2:3], 0x027; GFX8-NEXT: s_waitcnt lgkmcnt(0)28; GFX8-NEXT: s_and_b32 s0, s0, 0xffff29; GFX8-NEXT: s_lshl_b32 s1, s1, 1630; GFX8-NEXT: s_or_b32 s0, s0, s131; GFX8-NEXT: ;;#ASMSTART32; GFX8-NEXT: ; use s033; GFX8-NEXT: ;;#ASMEND34; GFX8-NEXT: s_endpgm35;36; GFX7-LABEL: s_pack_v2f16: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.i = trunc i32 %val0 to i1653 %hi.i = trunc i32 %val1 to i1654 %lo = bitcast i16 %lo.i to half55 %hi = bitcast i16 %hi.i to half56 %vec.0 = insertelement <2 x half> poison, half %lo, i32 057 %vec.1 = insertelement <2 x half> %vec.0, half %hi, i32 158 %vec.i32 = bitcast <2 x half> %vec.1 to i3259 60 call void asm sideeffect "; use $0", "s"(i32 %vec.i32) #061 ret void62}63 64define amdgpu_kernel void @s_pack_v2f16_imm_lo(ptr addrspace(4) %in1) #0 {65; GFX9-LABEL: s_pack_v2f16_imm_lo:66; GFX9: ; %bb.0:67; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x068; GFX9-NEXT: s_waitcnt lgkmcnt(0)69; GFX9-NEXT: s_load_dword s0, s[0:1], 0x070; GFX9-NEXT: s_waitcnt lgkmcnt(0)71; GFX9-NEXT: s_pack_ll_b32_b16 s0, 0x1234, s072; GFX9-NEXT: ;;#ASMSTART73; GFX9-NEXT: ; use s074; GFX9-NEXT: ;;#ASMEND75; GFX9-NEXT: s_endpgm76;77; GFX8-LABEL: s_pack_v2f16_imm_lo:78; GFX8: ; %bb.0:79; GFX8-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x080; GFX8-NEXT: s_waitcnt lgkmcnt(0)81; GFX8-NEXT: s_load_dword s0, s[0:1], 0x082; GFX8-NEXT: s_waitcnt lgkmcnt(0)83; GFX8-NEXT: s_lshl_b32 s0, s0, 1684; GFX8-NEXT: s_or_b32 s0, s0, 0x123485; GFX8-NEXT: ;;#ASMSTART86; GFX8-NEXT: ; use s087; GFX8-NEXT: ;;#ASMEND88; GFX8-NEXT: s_endpgm89;90; GFX7-LABEL: s_pack_v2f16_imm_lo:91; GFX7: ; %bb.0:92; GFX7-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x093; GFX7-NEXT: s_waitcnt lgkmcnt(0)94; GFX7-NEXT: s_load_dword s0, s[0:1], 0x095; GFX7-NEXT: s_waitcnt lgkmcnt(0)96; GFX7-NEXT: s_lshl_b32 s0, s0, 1697; GFX7-NEXT: s_or_b32 s0, s0, 0x123498; GFX7-NEXT: ;;#ASMSTART99; GFX7-NEXT: ; use s0100; GFX7-NEXT: ;;#ASMEND101; GFX7-NEXT: s_endpgm102 %val1 = load i32, ptr addrspace(4) %in1103 %hi.i = trunc i32 %val1 to i16104 %hi = bitcast i16 %hi.i to half105 %vec.0 = insertelement <2 x half> poison, half 0xH1234, i32 0106 %vec.1 = insertelement <2 x half> %vec.0, half %hi, i32 1107 %vec.i32 = bitcast <2 x half> %vec.1 to i32108 109 call void asm sideeffect "; use $0", "s"(i32 %vec.i32) #0110 ret void111}112 113define amdgpu_kernel void @s_pack_v2f16_imm_hi(ptr addrspace(4) %in0) #0 {114; GFX9-LABEL: s_pack_v2f16_imm_hi:115; GFX9: ; %bb.0:116; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0117; GFX9-NEXT: s_waitcnt lgkmcnt(0)118; GFX9-NEXT: s_load_dword s0, s[0:1], 0x0119; GFX9-NEXT: s_waitcnt lgkmcnt(0)120; GFX9-NEXT: s_pack_ll_b32_b16 s0, s0, 0x1234121; GFX9-NEXT: ;;#ASMSTART122; GFX9-NEXT: ; use s0123; GFX9-NEXT: ;;#ASMEND124; GFX9-NEXT: s_endpgm125;126; GFX8-LABEL: s_pack_v2f16_imm_hi:127; GFX8: ; %bb.0:128; GFX8-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0129; GFX8-NEXT: s_waitcnt lgkmcnt(0)130; GFX8-NEXT: s_load_dword s0, s[0:1], 0x0131; GFX8-NEXT: s_waitcnt lgkmcnt(0)132; GFX8-NEXT: s_and_b32 s0, s0, 0xffff133; GFX8-NEXT: s_or_b32 s0, s0, 0x12340000134; GFX8-NEXT: ;;#ASMSTART135; GFX8-NEXT: ; use s0136; GFX8-NEXT: ;;#ASMEND137; GFX8-NEXT: s_endpgm138;139; GFX7-LABEL: s_pack_v2f16_imm_hi:140; GFX7: ; %bb.0:141; GFX7-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0142; GFX7-NEXT: s_waitcnt lgkmcnt(0)143; GFX7-NEXT: s_load_dword s0, s[0:1], 0x0144; GFX7-NEXT: s_waitcnt lgkmcnt(0)145; GFX7-NEXT: s_and_b32 s0, s0, 0xffff146; GFX7-NEXT: s_or_b32 s0, s0, 0x12340000147; GFX7-NEXT: ;;#ASMSTART148; GFX7-NEXT: ; use s0149; GFX7-NEXT: ;;#ASMEND150; GFX7-NEXT: s_endpgm151 %val0 = load i32, ptr addrspace(4) %in0152 %lo.i = trunc i32 %val0 to i16153 %lo = bitcast i16 %lo.i to half154 %vec.0 = insertelement <2 x half> poison, half %lo, i32 0155 %vec.1 = insertelement <2 x half> %vec.0, half 0xH1234, i32 1156 %vec.i32 = bitcast <2 x half> %vec.1 to i32157 158 call void asm sideeffect "; use $0", "s"(i32 %vec.i32) #0159 ret void160}161 162define amdgpu_kernel void @v_pack_v2f16(ptr addrspace(1) %in0, ptr addrspace(1) %in1) #0 {163; GFX9-LABEL: v_pack_v2f16:164; GFX9: ; %bb.0:165; GFX9-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0166; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0167; GFX9-NEXT: s_waitcnt lgkmcnt(0)168; GFX9-NEXT: global_load_dword v1, v0, s[0:1] glc169; GFX9-NEXT: s_waitcnt vmcnt(0)170; GFX9-NEXT: global_load_dword v2, v0, s[2:3] glc171; GFX9-NEXT: s_waitcnt vmcnt(0)172; GFX9-NEXT: s_mov_b32 s0, 0x5040100173; GFX9-NEXT: v_perm_b32 v0, v2, v1, s0174; GFX9-NEXT: ;;#ASMSTART175; GFX9-NEXT: ; use v0176; GFX9-NEXT: ;;#ASMEND177; GFX9-NEXT: s_endpgm178;179; GFX8-LABEL: v_pack_v2f16:180; GFX8: ; %bb.0:181; GFX8-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0182; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v0183; GFX8-NEXT: s_add_i32 s12, s12, s17184; GFX8-NEXT: s_mov_b32 flat_scratch_lo, s13185; GFX8-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8186; GFX8-NEXT: s_waitcnt lgkmcnt(0)187; GFX8-NEXT: v_mov_b32_e32 v1, s1188; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2189; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc190; GFX8-NEXT: v_mov_b32_e32 v3, s3191; GFX8-NEXT: v_add_u32_e32 v2, vcc, s2, v2192; GFX8-NEXT: v_addc_u32_e32 v3, vcc, 0, v3, vcc193; GFX8-NEXT: flat_load_dword v0, v[0:1] glc194; GFX8-NEXT: s_waitcnt vmcnt(0)195; GFX8-NEXT: flat_load_dword v1, v[2:3] glc196; GFX8-NEXT: s_waitcnt vmcnt(0)197; GFX8-NEXT: s_mov_b32 s0, 0x1000504198; GFX8-NEXT: v_perm_b32 v0, v0, v1, s0199; GFX8-NEXT: ;;#ASMSTART200; GFX8-NEXT: ; use v0201; GFX8-NEXT: ;;#ASMEND202; GFX8-NEXT: s_endpgm203;204; GFX7-LABEL: v_pack_v2f16:205; GFX7: ; %bb.0:206; GFX7-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0207; GFX7-NEXT: s_mov_b32 s7, 0x100f000208; GFX7-NEXT: s_mov_b32 s6, 0209; GFX7-NEXT: v_lshlrev_b32_e32 v0, 2, v0210; GFX7-NEXT: v_mov_b32_e32 v1, 0211; GFX7-NEXT: s_waitcnt lgkmcnt(0)212; GFX7-NEXT: s_mov_b64 s[4:5], s[0:1]213; GFX7-NEXT: s_mov_b64 s[0:1], s[2:3]214; GFX7-NEXT: s_mov_b64 s[2:3], s[6:7]215; GFX7-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr64 glc216; GFX7-NEXT: s_waitcnt vmcnt(0)217; GFX7-NEXT: buffer_load_dword v0, v[0:1], s[0:3], 0 addr64 glc218; GFX7-NEXT: s_waitcnt vmcnt(0)219; GFX7-NEXT: v_and_b32_e32 v1, 0xffff, v2220; GFX7-NEXT: v_lshlrev_b32_e32 v0, 16, v0221; GFX7-NEXT: v_or_b32_e32 v0, v1, v0222; GFX7-NEXT: ;;#ASMSTART223; GFX7-NEXT: ; use v0224; GFX7-NEXT: ;;#ASMEND225; GFX7-NEXT: s_endpgm226 %tid = call i32 @llvm.amdgcn.workitem.id.x()227 %tid.ext = sext i32 %tid to i64228 %in0.gep = getelementptr inbounds i32, ptr addrspace(1) %in0, i64 %tid.ext229 %in1.gep = getelementptr inbounds i32, ptr addrspace(1) %in1, i64 %tid.ext230 %val0 = load volatile i32, ptr addrspace(1) %in0.gep231 %val1 = load volatile i32, ptr addrspace(1) %in1.gep232 %lo.i = trunc i32 %val0 to i16233 %hi.i = trunc i32 %val1 to i16234 %lo = bitcast i16 %lo.i to half235 %hi = bitcast i16 %hi.i to half236 %vec.0 = insertelement <2 x half> poison, half %lo, i32 0237 %vec.1 = insertelement <2 x half> %vec.0, half %hi, i32 1238 %vec.i32 = bitcast <2 x half> %vec.1 to i32239 call void asm sideeffect "; use $0", "v"(i32 %vec.i32) #0240 ret void241}242 243define amdgpu_kernel void @v_pack_v2f16_user(ptr addrspace(1) %in0, ptr addrspace(1) %in1) #0 {244; GFX9-LABEL: v_pack_v2f16_user:245; GFX9: ; %bb.0:246; GFX9-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0247; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0248; GFX9-NEXT: s_waitcnt lgkmcnt(0)249; GFX9-NEXT: global_load_dword v1, v0, s[0:1] glc250; GFX9-NEXT: s_waitcnt vmcnt(0)251; GFX9-NEXT: global_load_dword v2, v0, s[2:3] glc252; GFX9-NEXT: s_waitcnt vmcnt(0)253; GFX9-NEXT: s_mov_b32 s0, 0x5040100254; GFX9-NEXT: s_mov_b32 s3, 0xf000255; GFX9-NEXT: s_mov_b32 s2, -1256; GFX9-NEXT: v_perm_b32 v0, v2, v1, s0257; GFX9-NEXT: v_add_u32_e32 v0, 9, v0258; GFX9-NEXT: buffer_store_dword v0, off, s[0:3], 0259; GFX9-NEXT: s_waitcnt vmcnt(0)260; GFX9-NEXT: s_endpgm261;262; GFX8-LABEL: v_pack_v2f16_user:263; GFX8: ; %bb.0:264; GFX8-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0265; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v0266; GFX8-NEXT: s_add_i32 s12, s12, s17267; GFX8-NEXT: s_mov_b32 flat_scratch_lo, s13268; GFX8-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8269; GFX8-NEXT: s_waitcnt lgkmcnt(0)270; GFX8-NEXT: v_mov_b32_e32 v1, s1271; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2272; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc273; GFX8-NEXT: v_mov_b32_e32 v3, s3274; GFX8-NEXT: v_add_u32_e32 v2, vcc, s2, v2275; GFX8-NEXT: v_addc_u32_e32 v3, vcc, 0, v3, vcc276; GFX8-NEXT: flat_load_dword v0, v[0:1] glc277; GFX8-NEXT: s_waitcnt vmcnt(0)278; GFX8-NEXT: flat_load_dword v1, v[2:3] glc279; GFX8-NEXT: s_waitcnt vmcnt(0)280; GFX8-NEXT: s_mov_b32 s0, 0x1000504281; GFX8-NEXT: s_mov_b32 s3, 0x1100f000282; GFX8-NEXT: s_mov_b32 s2, -1283; GFX8-NEXT: v_perm_b32 v0, v0, v1, s0284; GFX8-NEXT: v_add_u32_e32 v0, vcc, 9, v0285; GFX8-NEXT: buffer_store_dword v0, off, s[0:3], 0286; GFX8-NEXT: s_waitcnt vmcnt(0)287; GFX8-NEXT: s_endpgm288;289; GFX7-LABEL: v_pack_v2f16_user:290; GFX7: ; %bb.0:291; GFX7-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0292; GFX7-NEXT: s_mov_b32 s6, 0293; GFX7-NEXT: s_mov_b32 s7, 0x100f000294; GFX7-NEXT: v_lshlrev_b32_e32 v0, 2, v0295; GFX7-NEXT: v_mov_b32_e32 v1, 0296; GFX7-NEXT: s_waitcnt lgkmcnt(0)297; GFX7-NEXT: s_mov_b64 s[4:5], s[0:1]298; GFX7-NEXT: s_mov_b64 s[0:1], s[2:3]299; GFX7-NEXT: s_mov_b64 s[2:3], s[6:7]300; GFX7-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr64 glc301; GFX7-NEXT: s_waitcnt vmcnt(0)302; GFX7-NEXT: buffer_load_dword v0, v[0:1], s[0:3], 0 addr64 glc303; GFX7-NEXT: s_waitcnt vmcnt(0)304; GFX7-NEXT: s_mov_b32 s6, -1305; GFX7-NEXT: v_and_b32_e32 v1, 0xffff, v2306; GFX7-NEXT: v_lshlrev_b32_e32 v0, 16, v0307; GFX7-NEXT: v_or_b32_e32 v0, v1, v0308; GFX7-NEXT: v_add_i32_e32 v0, vcc, 9, v0309; GFX7-NEXT: buffer_store_dword v0, off, s[4:7], 0310; GFX7-NEXT: s_waitcnt vmcnt(0)311; GFX7-NEXT: s_endpgm312 %tid = call i32 @llvm.amdgcn.workitem.id.x()313 %tid.ext = sext i32 %tid to i64314 %in0.gep = getelementptr inbounds i32, ptr addrspace(1) %in0, i64 %tid.ext315 %in1.gep = getelementptr inbounds i32, ptr addrspace(1) %in1, i64 %tid.ext316 %val0 = load volatile i32, ptr addrspace(1) %in0.gep317 %val1 = load volatile i32, ptr addrspace(1) %in1.gep318 %lo.i = trunc i32 %val0 to i16319 %hi.i = trunc i32 %val1 to i16320 %lo = bitcast i16 %lo.i to half321 %hi = bitcast i16 %hi.i to half322 %vec.0 = insertelement <2 x half> poison, half %lo, i32 0323 %vec.1 = insertelement <2 x half> %vec.0, half %hi, i32 1324 %vec.i32 = bitcast <2 x half> %vec.1 to i32325 %foo = add i32 %vec.i32, 9326 store volatile i32 %foo, ptr addrspace(1) poison327 ret void328}329 330define amdgpu_kernel void @v_pack_v2f16_imm_lo(ptr addrspace(1) %in1) #0 {331; GFX9-LABEL: v_pack_v2f16_imm_lo:332; GFX9: ; %bb.0:333; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0334; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0335; GFX9-NEXT: v_mov_b32_e32 v1, 0x5040100336; GFX9-NEXT: s_waitcnt lgkmcnt(0)337; GFX9-NEXT: global_load_dword v0, v0, s[0:1] glc338; GFX9-NEXT: s_waitcnt vmcnt(0)339; GFX9-NEXT: s_movk_i32 s0, 0x1234340; GFX9-NEXT: v_perm_b32 v0, v0, s0, v1341; GFX9-NEXT: ;;#ASMSTART342; GFX9-NEXT: ; use v0343; GFX9-NEXT: ;;#ASMEND344; GFX9-NEXT: s_endpgm345;346; GFX8-LABEL: v_pack_v2f16_imm_lo:347; GFX8: ; %bb.0:348; GFX8-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0349; GFX8-NEXT: v_lshlrev_b32_e32 v0, 2, v0350; GFX8-NEXT: s_add_i32 s12, s12, s17351; GFX8-NEXT: s_mov_b32 flat_scratch_lo, s13352; GFX8-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8353; GFX8-NEXT: s_waitcnt lgkmcnt(0)354; GFX8-NEXT: v_mov_b32_e32 v1, s1355; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v0356; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc357; GFX8-NEXT: flat_load_dword v0, v[0:1] glc358; GFX8-NEXT: s_waitcnt vmcnt(0)359; GFX8-NEXT: v_lshlrev_b32_e32 v0, 16, v0360; GFX8-NEXT: v_or_b32_e32 v0, 0x1234, v0361; GFX8-NEXT: ;;#ASMSTART362; GFX8-NEXT: ; use v0363; GFX8-NEXT: ;;#ASMEND364; GFX8-NEXT: s_endpgm365;366; GFX7-LABEL: v_pack_v2f16_imm_lo:367; GFX7: ; %bb.0:368; GFX7-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0369; GFX7-NEXT: s_mov_b32 s3, 0x100f000370; GFX7-NEXT: s_mov_b32 s2, 0371; GFX7-NEXT: v_lshlrev_b32_e32 v0, 2, v0372; GFX7-NEXT: v_mov_b32_e32 v1, 0373; GFX7-NEXT: s_waitcnt lgkmcnt(0)374; GFX7-NEXT: buffer_load_dword v0, v[0:1], s[0:3], 0 addr64 glc375; GFX7-NEXT: s_waitcnt vmcnt(0)376; GFX7-NEXT: v_lshlrev_b32_e32 v0, 16, v0377; GFX7-NEXT: v_or_b32_e32 v0, 0x1234, v0378; GFX7-NEXT: ;;#ASMSTART379; GFX7-NEXT: ; use v0380; GFX7-NEXT: ;;#ASMEND381; GFX7-NEXT: s_endpgm382 %tid = call i32 @llvm.amdgcn.workitem.id.x()383 %tid.ext = sext i32 %tid to i64384 %in1.gep = getelementptr inbounds i32, ptr addrspace(1) %in1, i64 %tid.ext385 %val1 = load volatile i32, ptr addrspace(1) %in1.gep386 %hi.i = trunc i32 %val1 to i16387 %hi = bitcast i16 %hi.i to half388 %vec.0 = insertelement <2 x half> poison, half 0xH1234, i32 0389 %vec.1 = insertelement <2 x half> %vec.0, half %hi, i32 1390 %vec.i32 = bitcast <2 x half> %vec.1 to i32391 call void asm sideeffect "; use $0", "v"(i32 %vec.i32) #0392 ret void393}394 395define amdgpu_kernel void @v_pack_v2f16_inline_imm_lo(ptr addrspace(1) %in1) #0 {396; GFX9-LABEL: v_pack_v2f16_inline_imm_lo:397; GFX9: ; %bb.0:398; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0399; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0400; GFX9-NEXT: v_mov_b32_e32 v1, 0x5040100401; GFX9-NEXT: s_waitcnt lgkmcnt(0)402; GFX9-NEXT: global_load_dword v0, v0, s[0:1] glc403; GFX9-NEXT: s_waitcnt vmcnt(0)404; GFX9-NEXT: s_movk_i32 s0, 0x4400405; GFX9-NEXT: v_perm_b32 v0, v0, s0, v1406; GFX9-NEXT: ;;#ASMSTART407; GFX9-NEXT: ; use v0408; GFX9-NEXT: ;;#ASMEND409; GFX9-NEXT: s_endpgm410;411; GFX8-LABEL: v_pack_v2f16_inline_imm_lo:412; GFX8: ; %bb.0:413; GFX8-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0414; GFX8-NEXT: v_lshlrev_b32_e32 v0, 2, v0415; GFX8-NEXT: s_add_i32 s12, s12, s17416; GFX8-NEXT: s_mov_b32 flat_scratch_lo, s13417; GFX8-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8418; GFX8-NEXT: s_waitcnt lgkmcnt(0)419; GFX8-NEXT: v_mov_b32_e32 v1, s1420; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v0421; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc422; GFX8-NEXT: flat_load_dword v0, v[0:1] glc423; GFX8-NEXT: s_waitcnt vmcnt(0)424; GFX8-NEXT: v_lshlrev_b32_e32 v0, 16, v0425; GFX8-NEXT: v_or_b32_e32 v0, 0x4400, v0426; GFX8-NEXT: ;;#ASMSTART427; GFX8-NEXT: ; use v0428; GFX8-NEXT: ;;#ASMEND429; GFX8-NEXT: s_endpgm430;431; GFX7-LABEL: v_pack_v2f16_inline_imm_lo:432; GFX7: ; %bb.0:433; GFX7-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0434; GFX7-NEXT: s_mov_b32 s3, 0x100f000435; GFX7-NEXT: s_mov_b32 s2, 0436; GFX7-NEXT: v_lshlrev_b32_e32 v0, 2, v0437; GFX7-NEXT: v_mov_b32_e32 v1, 0438; GFX7-NEXT: s_waitcnt lgkmcnt(0)439; GFX7-NEXT: buffer_load_dword v0, v[0:1], s[0:3], 0 addr64 glc440; GFX7-NEXT: s_waitcnt vmcnt(0)441; GFX7-NEXT: v_lshlrev_b32_e32 v0, 16, v0442; GFX7-NEXT: v_or_b32_e32 v0, 0x4400, v0443; GFX7-NEXT: ;;#ASMSTART444; GFX7-NEXT: ; use v0445; GFX7-NEXT: ;;#ASMEND446; GFX7-NEXT: s_endpgm447 %tid = call i32 @llvm.amdgcn.workitem.id.x()448 %tid.ext = sext i32 %tid to i64449 %in1.gep = getelementptr inbounds i32, ptr addrspace(1) %in1, i64 %tid.ext450 %val1 = load volatile i32, ptr addrspace(1) %in1.gep451 %hi.i = trunc i32 %val1 to i16452 %hi = bitcast i16 %hi.i to half453 %vec.0 = insertelement <2 x half> poison, half 4.0, i32 0454 %vec.1 = insertelement <2 x half> %vec.0, half %hi, i32 1455 %vec.i32 = bitcast <2 x half> %vec.1 to i32456 call void asm sideeffect "; use $0", "v"(i32 %vec.i32) #0457 ret void458}459 460define amdgpu_kernel void @v_pack_v2f16_imm_hi(ptr addrspace(1) %in0) #0 {461; GFX9-LABEL: v_pack_v2f16_imm_hi:462; GFX9: ; %bb.0:463; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0464; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0465; GFX9-NEXT: v_mov_b32_e32 v1, 0x5040100466; GFX9-NEXT: s_waitcnt lgkmcnt(0)467; GFX9-NEXT: global_load_dword v0, v0, s[0:1] glc468; GFX9-NEXT: s_waitcnt vmcnt(0)469; GFX9-NEXT: s_movk_i32 s0, 0x1234470; GFX9-NEXT: v_perm_b32 v0, s0, v0, v1471; GFX9-NEXT: ;;#ASMSTART472; GFX9-NEXT: ; use v0473; GFX9-NEXT: ;;#ASMEND474; GFX9-NEXT: s_endpgm475;476; GFX8-LABEL: v_pack_v2f16_imm_hi:477; GFX8: ; %bb.0:478; GFX8-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0479; GFX8-NEXT: v_lshlrev_b32_e32 v0, 2, v0480; GFX8-NEXT: s_add_i32 s12, s12, s17481; GFX8-NEXT: s_mov_b32 flat_scratch_lo, s13482; GFX8-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8483; GFX8-NEXT: s_waitcnt lgkmcnt(0)484; GFX8-NEXT: v_mov_b32_e32 v1, s1485; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v0486; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc487; GFX8-NEXT: flat_load_dword v0, v[0:1] glc488; GFX8-NEXT: s_waitcnt vmcnt(0)489; GFX8-NEXT: v_mov_b32_e32 v1, 0x12340000490; GFX8-NEXT: v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD491; GFX8-NEXT: ;;#ASMSTART492; GFX8-NEXT: ; use v0493; GFX8-NEXT: ;;#ASMEND494; GFX8-NEXT: s_endpgm495;496; GFX7-LABEL: v_pack_v2f16_imm_hi:497; GFX7: ; %bb.0:498; GFX7-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0499; GFX7-NEXT: s_mov_b32 s3, 0x100f000500; GFX7-NEXT: s_mov_b32 s2, 0501; GFX7-NEXT: v_lshlrev_b32_e32 v0, 2, v0502; GFX7-NEXT: v_mov_b32_e32 v1, 0503; GFX7-NEXT: s_waitcnt lgkmcnt(0)504; GFX7-NEXT: buffer_load_dword v0, v[0:1], s[0:3], 0 addr64 glc505; GFX7-NEXT: s_waitcnt vmcnt(0)506; GFX7-NEXT: v_and_b32_e32 v0, 0xffff, v0507; GFX7-NEXT: v_or_b32_e32 v0, 0x12340000, v0508; GFX7-NEXT: ;;#ASMSTART509; GFX7-NEXT: ; use v0510; GFX7-NEXT: ;;#ASMEND511; GFX7-NEXT: s_endpgm512 %tid = call i32 @llvm.amdgcn.workitem.id.x()513 %tid.ext = sext i32 %tid to i64514 %in0.gep = getelementptr inbounds i32, ptr addrspace(1) %in0, i64 %tid.ext515 %val0 = load volatile i32, ptr addrspace(1) %in0.gep516 %lo.i = trunc i32 %val0 to i16517 %lo = bitcast i16 %lo.i to half518 %vec.0 = insertelement <2 x half> poison, half %lo, i32 0519 %vec.1 = insertelement <2 x half> %vec.0, half 0xH1234, i32 1520 %vec.i32 = bitcast <2 x half> %vec.1 to i32521 call void asm sideeffect "; use $0", "v"(i32 %vec.i32) #0522 ret void523}524 525define amdgpu_kernel void @v_pack_v2f16_inline_f16imm_hi(ptr addrspace(1) %in0) #0 {526; GFX9-LABEL: v_pack_v2f16_inline_f16imm_hi:527; GFX9: ; %bb.0:528; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0529; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0530; GFX9-NEXT: v_mov_b32_e32 v1, 0x5040100531; GFX9-NEXT: s_waitcnt lgkmcnt(0)532; GFX9-NEXT: global_load_dword v0, v0, s[0:1] glc533; GFX9-NEXT: s_waitcnt vmcnt(0)534; GFX9-NEXT: s_movk_i32 s0, 0x3c00535; GFX9-NEXT: v_perm_b32 v0, s0, v0, v1536; GFX9-NEXT: ;;#ASMSTART537; GFX9-NEXT: ; use v0538; GFX9-NEXT: ;;#ASMEND539; GFX9-NEXT: s_endpgm540;541; GFX8-LABEL: v_pack_v2f16_inline_f16imm_hi:542; GFX8: ; %bb.0:543; GFX8-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0544; GFX8-NEXT: v_lshlrev_b32_e32 v0, 2, v0545; GFX8-NEXT: s_add_i32 s12, s12, s17546; GFX8-NEXT: s_mov_b32 flat_scratch_lo, s13547; GFX8-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8548; GFX8-NEXT: s_waitcnt lgkmcnt(0)549; GFX8-NEXT: v_mov_b32_e32 v1, s1550; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v0551; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc552; GFX8-NEXT: flat_load_dword v0, v[0:1] glc553; GFX8-NEXT: s_waitcnt vmcnt(0)554; GFX8-NEXT: v_bfrev_b32_e32 v1, 60555; GFX8-NEXT: v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD556; GFX8-NEXT: ;;#ASMSTART557; GFX8-NEXT: ; use v0558; GFX8-NEXT: ;;#ASMEND559; GFX8-NEXT: s_endpgm560;561; GFX7-LABEL: v_pack_v2f16_inline_f16imm_hi:562; GFX7: ; %bb.0:563; GFX7-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0564; GFX7-NEXT: s_mov_b32 s3, 0x100f000565; GFX7-NEXT: s_mov_b32 s2, 0566; GFX7-NEXT: v_lshlrev_b32_e32 v0, 2, v0567; GFX7-NEXT: v_mov_b32_e32 v1, 0568; GFX7-NEXT: s_waitcnt lgkmcnt(0)569; GFX7-NEXT: buffer_load_dword v0, v[0:1], s[0:3], 0 addr64 glc570; GFX7-NEXT: s_waitcnt vmcnt(0)571; GFX7-NEXT: v_and_b32_e32 v0, 0xffff, v0572; GFX7-NEXT: v_or_b32_e32 v0, 0x3c000000, v0573; GFX7-NEXT: ;;#ASMSTART574; GFX7-NEXT: ; use v0575; GFX7-NEXT: ;;#ASMEND576; GFX7-NEXT: s_endpgm577 %tid = call i32 @llvm.amdgcn.workitem.id.x()578 %tid.ext = sext i32 %tid to i64579 %in0.gep = getelementptr inbounds i32, ptr addrspace(1) %in0, i64 %tid.ext580 %val0 = load volatile i32, ptr addrspace(1) %in0.gep581 %lo.i = trunc i32 %val0 to i16582 %lo = bitcast i16 %lo.i to half583 %vec.0 = insertelement <2 x half> poison, half %lo, i32 0584 %vec.1 = insertelement <2 x half> %vec.0, half 1.0, i32 1585 %vec.i32 = bitcast <2 x half> %vec.1 to i32586 call void asm sideeffect "; use $0", "v"(i32 %vec.i32) #0587 ret void588}589 590define amdgpu_kernel void @v_pack_v2f16_inline_imm_hi(ptr addrspace(1) %in0) #0 {591; GFX9-LABEL: v_pack_v2f16_inline_imm_hi:592; GFX9: ; %bb.0:593; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0594; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0595; GFX9-NEXT: v_mov_b32_e32 v1, 0x5040100596; GFX9-NEXT: s_waitcnt lgkmcnt(0)597; GFX9-NEXT: global_load_dword v0, v0, s[0:1] glc598; GFX9-NEXT: s_waitcnt vmcnt(0)599; GFX9-NEXT: v_perm_b32 v0, 64, v0, v1600; GFX9-NEXT: ;;#ASMSTART601; GFX9-NEXT: ; use v0602; GFX9-NEXT: ;;#ASMEND603; GFX9-NEXT: s_endpgm604;605; GFX8-LABEL: v_pack_v2f16_inline_imm_hi:606; GFX8: ; %bb.0:607; GFX8-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0608; GFX8-NEXT: v_lshlrev_b32_e32 v0, 2, v0609; GFX8-NEXT: s_add_i32 s12, s12, s17610; GFX8-NEXT: s_mov_b32 flat_scratch_lo, s13611; GFX8-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8612; GFX8-NEXT: s_waitcnt lgkmcnt(0)613; GFX8-NEXT: v_mov_b32_e32 v1, s1614; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v0615; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc616; GFX8-NEXT: flat_load_dword v0, v[0:1] glc617; GFX8-NEXT: s_waitcnt vmcnt(0)618; GFX8-NEXT: v_mov_b32_e32 v1, 0x400000619; GFX8-NEXT: v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD620; GFX8-NEXT: ;;#ASMSTART621; GFX8-NEXT: ; use v0622; GFX8-NEXT: ;;#ASMEND623; GFX8-NEXT: s_endpgm624;625; GFX7-LABEL: v_pack_v2f16_inline_imm_hi:626; GFX7: ; %bb.0:627; GFX7-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0628; GFX7-NEXT: s_mov_b32 s3, 0x100f000629; GFX7-NEXT: s_mov_b32 s2, 0630; GFX7-NEXT: v_lshlrev_b32_e32 v0, 2, v0631; GFX7-NEXT: v_mov_b32_e32 v1, 0632; GFX7-NEXT: s_waitcnt lgkmcnt(0)633; GFX7-NEXT: buffer_load_dword v0, v[0:1], s[0:3], 0 addr64 glc634; GFX7-NEXT: s_waitcnt vmcnt(0)635; GFX7-NEXT: v_and_b32_e32 v0, 0xffff, v0636; GFX7-NEXT: v_or_b32_e32 v0, 0x400000, v0637; GFX7-NEXT: ;;#ASMSTART638; GFX7-NEXT: ; use v0639; GFX7-NEXT: ;;#ASMEND640; GFX7-NEXT: s_endpgm641 %tid = call i32 @llvm.amdgcn.workitem.id.x()642 %tid.ext = sext i32 %tid to i64643 %in0.gep = getelementptr inbounds i32, ptr addrspace(1) %in0, i64 %tid.ext644 %val0 = load volatile i32, ptr addrspace(1) %in0.gep645 %lo.i = trunc i32 %val0 to i16646 %lo = bitcast i16 %lo.i to half647 %vec.0 = insertelement <2 x half> poison, half %lo, i32 0648 %vec.1 = insertelement <2 x half> %vec.0, half 0xH0040, i32 1649 %vec.i32 = bitcast <2 x half> %vec.1 to i32650 call void asm sideeffect "; use $0", "v"(i32 %vec.i32) #0651 ret void652}653 654declare i32 @llvm.amdgcn.workitem.id.x() #1655 656attributes #0 = { nounwind }657attributes #1 = { nounwind readnone }658