559 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 42; RUN: llc -mtriple=amdgcn-mesa-mesa3d -mcpu=hawaii < %s | FileCheck -check-prefix=GFX7 %s3 4declare void @f16_user(half) #05declare half @f16_result() #06 7declare void @v2f16_user(<2 x half>) #08declare <2 x half> @v2f16_result() #09 10declare void @v4f16_user(<4 x half>) #011declare <4 x half> @v4f16_result() #012 13declare void @v8f16_user(<8 x half>) #014declare <8 x half> @v8f16_result() #015 16define void @f16_arg(half %arg, ptr %ptr) #0 {17; GFX7-LABEL: f16_arg:18; GFX7: ; %bb.0:19; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)20; GFX7-NEXT: v_cvt_f16_f32_e32 v0, v021; GFX7-NEXT: v_and_b32_e32 v0, 0xffff, v022; GFX7-NEXT: v_cvt_f32_f16_e32 v0, v023; GFX7-NEXT: flat_store_dword v[1:2], v024; GFX7-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)25; GFX7-NEXT: s_setpc_b64 s[30:31]26 %fpext = call float @llvm.experimental.constrained.fpext.f32.f16(half %arg, metadata !"fpexcept.strict")27 store float %fpext, ptr %ptr28 ret void29}30 31define void @v2f16_arg(<2 x half> %arg, ptr %ptr) #0 {32; GFX7-LABEL: v2f16_arg:33; GFX7: ; %bb.0:34; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)35; GFX7-NEXT: v_cvt_f16_f32_e32 v0, v036; GFX7-NEXT: v_cvt_f16_f32_e32 v1, v137; GFX7-NEXT: v_and_b32_e32 v0, 0xffff, v038; GFX7-NEXT: v_cvt_f32_f16_e32 v4, v039; GFX7-NEXT: v_and_b32_e32 v0, 0xffff, v140; GFX7-NEXT: v_cvt_f32_f16_e32 v5, v041; GFX7-NEXT: v_add_i32_e32 v0, vcc, 4, v242; GFX7-NEXT: v_addc_u32_e32 v1, vcc, 0, v3, vcc43; GFX7-NEXT: flat_store_dword v[0:1], v544; GFX7-NEXT: flat_store_dword v[2:3], v445; GFX7-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)46; GFX7-NEXT: s_setpc_b64 s[30:31]47 %fpext = call <2 x float> @llvm.experimental.constrained.fpext.v2f32.v2f16(<2 x half> %arg, metadata !"fpexcept.strict")48 store <2 x float> %fpext, ptr %ptr49 ret void50}51 52define void @v3f16_arg(<3 x half> %arg, ptr %ptr) #0 {53; GFX7-LABEL: v3f16_arg:54; GFX7: ; %bb.0:55; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)56; GFX7-NEXT: v_cvt_f16_f32_e32 v0, v057; GFX7-NEXT: v_cvt_f16_f32_e32 v1, v158; GFX7-NEXT: v_cvt_f16_f32_e32 v2, v259; GFX7-NEXT: v_and_b32_e32 v0, 0xffff, v060; GFX7-NEXT: v_cvt_f32_f16_e32 v5, v061; GFX7-NEXT: v_and_b32_e32 v0, 0xffff, v162; GFX7-NEXT: v_cvt_f32_f16_e32 v6, v063; GFX7-NEXT: v_and_b32_e32 v0, 0xffff, v264; GFX7-NEXT: v_cvt_f32_f16_e32 v2, v065; GFX7-NEXT: v_add_i32_e32 v0, vcc, 8, v366; GFX7-NEXT: v_addc_u32_e32 v1, vcc, 0, v4, vcc67; GFX7-NEXT: flat_store_dword v[0:1], v268; GFX7-NEXT: v_add_i32_e32 v0, vcc, 4, v369; GFX7-NEXT: v_addc_u32_e32 v1, vcc, 0, v4, vcc70; GFX7-NEXT: flat_store_dword v[0:1], v671; GFX7-NEXT: flat_store_dword v[3:4], v572; GFX7-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)73; GFX7-NEXT: s_setpc_b64 s[30:31]74 %fpext = call <3 x float> @llvm.experimental.constrained.fpext.v3f32.v3f16(<3 x half> %arg, metadata !"fpexcept.strict")75 store <3 x float> %fpext, ptr %ptr76 ret void77}78 79define void @v4f16_arg(<4 x half> %arg, ptr %ptr) #0 {80; GFX7-LABEL: v4f16_arg:81; GFX7: ; %bb.0:82; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)83; GFX7-NEXT: v_cvt_f16_f32_e32 v0, v084; GFX7-NEXT: v_cvt_f16_f32_e32 v1, v185; GFX7-NEXT: v_and_b32_e32 v0, 0xffff, v086; GFX7-NEXT: v_cvt_f32_f16_e32 v6, v087; GFX7-NEXT: v_cvt_f16_f32_e32 v0, v288; GFX7-NEXT: v_cvt_f16_f32_e32 v2, v389; GFX7-NEXT: v_and_b32_e32 v1, 0xffff, v190; GFX7-NEXT: v_cvt_f32_f16_e32 v3, v191; GFX7-NEXT: v_and_b32_e32 v0, 0xffff, v092; GFX7-NEXT: v_cvt_f32_f16_e32 v7, v093; GFX7-NEXT: v_and_b32_e32 v0, 0xffff, v294; GFX7-NEXT: v_cvt_f32_f16_e32 v2, v095; GFX7-NEXT: v_add_i32_e32 v0, vcc, 12, v496; GFX7-NEXT: v_addc_u32_e32 v1, vcc, 0, v5, vcc97; GFX7-NEXT: flat_store_dword v[0:1], v298; GFX7-NEXT: v_add_i32_e32 v0, vcc, 8, v499; GFX7-NEXT: v_addc_u32_e32 v1, vcc, 0, v5, vcc100; GFX7-NEXT: flat_store_dword v[0:1], v7101; GFX7-NEXT: v_add_i32_e32 v0, vcc, 4, v4102; GFX7-NEXT: v_addc_u32_e32 v1, vcc, 0, v5, vcc103; GFX7-NEXT: flat_store_dword v[0:1], v3104; GFX7-NEXT: flat_store_dword v[4:5], v6105; GFX7-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)106; GFX7-NEXT: s_setpc_b64 s[30:31]107 %fpext = call <4 x float> @llvm.experimental.constrained.fpext.v4f32.v4f16(<4 x half> %arg, metadata !"fpexcept.strict")108 store <4 x float> %fpext, ptr %ptr109 ret void110}111 112define half @f16_return(float %arg) #0 {113; GFX7-LABEL: f16_return:114; GFX7: ; %bb.0:115; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)116; GFX7-NEXT: v_cvt_f16_f32_e32 v0, v0117; GFX7-NEXT: v_and_b32_e32 v0, 0xffff, v0118; GFX7-NEXT: v_cvt_f32_f16_e32 v0, v0119; GFX7-NEXT: s_setpc_b64 s[30:31]120 %fptrunc = call half @llvm.experimental.constrained.fptrunc.f16.f32(float %arg, metadata !"round.tonearest", metadata !"fpexcept.strict")121 ret half %fptrunc122}123 124define <2 x half> @v2f16_return(<2 x float> %arg) #0 {125; GFX7-LABEL: v2f16_return:126; GFX7: ; %bb.0:127; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)128; GFX7-NEXT: v_cvt_f16_f32_e32 v1, v1129; GFX7-NEXT: v_cvt_f16_f32_e32 v0, v0130; GFX7-NEXT: v_and_b32_e32 v1, 0xffff, v1131; GFX7-NEXT: v_and_b32_e32 v0, 0xffff, v0132; GFX7-NEXT: v_cvt_f32_f16_e32 v0, v0133; GFX7-NEXT: v_cvt_f32_f16_e32 v1, v1134; GFX7-NEXT: s_setpc_b64 s[30:31]135 %fptrunc = call <2 x half> @llvm.experimental.constrained.fptrunc.v2f16.v2f32(<2 x float> %arg, metadata !"round.tonearest", metadata !"fpexcept.strict")136 ret <2 x half> %fptrunc137}138 139define <3 x half> @v3f16_return(<3 x float> %arg) #0 {140; GFX7-LABEL: v3f16_return:141; GFX7: ; %bb.0:142; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)143; GFX7-NEXT: v_cvt_f16_f32_e32 v2, v2144; GFX7-NEXT: v_cvt_f16_f32_e32 v1, v1145; GFX7-NEXT: v_cvt_f16_f32_e32 v0, v0146; GFX7-NEXT: v_and_b32_e32 v2, 0xffff, v2147; GFX7-NEXT: v_and_b32_e32 v1, 0xffff, v1148; GFX7-NEXT: v_and_b32_e32 v0, 0xffff, v0149; GFX7-NEXT: v_cvt_f32_f16_e32 v0, v0150; GFX7-NEXT: v_cvt_f32_f16_e32 v1, v1151; GFX7-NEXT: v_cvt_f32_f16_e32 v2, v2152; GFX7-NEXT: s_setpc_b64 s[30:31]153 %fptrunc = call <3 x half> @llvm.experimental.constrained.fptrunc.v3f16.v3f32(<3 x float> %arg, metadata !"round.tonearest", metadata !"fpexcept.strict")154 ret <3 x half> %fptrunc155}156 157define <4 x half> @v4f16_return(<4 x float> %arg) #0 {158; GFX7-LABEL: v4f16_return:159; GFX7: ; %bb.0:160; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)161; GFX7-NEXT: v_cvt_f16_f32_e32 v3, v3162; GFX7-NEXT: v_cvt_f16_f32_e32 v2, v2163; GFX7-NEXT: v_cvt_f16_f32_e32 v1, v1164; GFX7-NEXT: v_cvt_f16_f32_e32 v0, v0165; GFX7-NEXT: v_and_b32_e32 v3, 0xffff, v3166; GFX7-NEXT: v_and_b32_e32 v2, 0xffff, v2167; GFX7-NEXT: v_and_b32_e32 v1, 0xffff, v1168; GFX7-NEXT: v_and_b32_e32 v0, 0xffff, v0169; GFX7-NEXT: v_cvt_f32_f16_e32 v0, v0170; GFX7-NEXT: v_cvt_f32_f16_e32 v1, v1171; GFX7-NEXT: v_cvt_f32_f16_e32 v2, v2172; GFX7-NEXT: v_cvt_f32_f16_e32 v3, v3173; GFX7-NEXT: s_setpc_b64 s[30:31]174 %fptrunc = call <4 x half> @llvm.experimental.constrained.fptrunc.v4f16.v4f32(<4 x float> %arg, metadata !"round.tonearest", metadata !"fpexcept.strict")175 ret <4 x half> %fptrunc176}177 178define void @outgoing_f16_arg(ptr %ptr) #0 {179; GFX7-LABEL: outgoing_f16_arg:180; GFX7: ; %bb.0:181; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)182; GFX7-NEXT: s_mov_b32 s16, s33183; GFX7-NEXT: s_mov_b32 s33, s32184; GFX7-NEXT: s_or_saveexec_b64 s[18:19], -1185; GFX7-NEXT: buffer_store_dword v40, off, s[0:3], s33 ; 4-byte Folded Spill186; GFX7-NEXT: s_mov_b64 exec, s[18:19]187; GFX7-NEXT: flat_load_ushort v0, v[0:1]188; GFX7-NEXT: v_writelane_b32 v40, s16, 2189; GFX7-NEXT: v_writelane_b32 v40, s30, 0190; GFX7-NEXT: s_mov_b32 s17, f16_user@abs32@hi191; GFX7-NEXT: s_mov_b32 s16, f16_user@abs32@lo192; GFX7-NEXT: s_addk_i32 s32, 0x400193; GFX7-NEXT: v_writelane_b32 v40, s31, 1194; GFX7-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)195; GFX7-NEXT: v_cvt_f32_f16_e32 v0, v0196; GFX7-NEXT: s_swappc_b64 s[30:31], s[16:17]197; GFX7-NEXT: v_readlane_b32 s31, v40, 1198; GFX7-NEXT: v_readlane_b32 s30, v40, 0199; GFX7-NEXT: s_mov_b32 s32, s33200; GFX7-NEXT: v_readlane_b32 s4, v40, 2201; GFX7-NEXT: s_or_saveexec_b64 s[6:7], -1202; GFX7-NEXT: buffer_load_dword v40, off, s[0:3], s33 ; 4-byte Folded Reload203; GFX7-NEXT: s_mov_b64 exec, s[6:7]204; GFX7-NEXT: s_mov_b32 s33, s4205; GFX7-NEXT: s_waitcnt vmcnt(0)206; GFX7-NEXT: s_setpc_b64 s[30:31]207 %val = load half, ptr %ptr208 call void @f16_user(half %val)209 ret void210}211 212define void @outgoing_v2f16_arg(ptr %ptr) #0 {213; GFX7-LABEL: outgoing_v2f16_arg:214; GFX7: ; %bb.0:215; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)216; GFX7-NEXT: s_mov_b32 s16, s33217; GFX7-NEXT: s_mov_b32 s33, s32218; GFX7-NEXT: s_or_saveexec_b64 s[18:19], -1219; GFX7-NEXT: buffer_store_dword v40, off, s[0:3], s33 ; 4-byte Folded Spill220; GFX7-NEXT: s_mov_b64 exec, s[18:19]221; GFX7-NEXT: flat_load_dword v1, v[0:1]222; GFX7-NEXT: v_writelane_b32 v40, s16, 2223; GFX7-NEXT: v_writelane_b32 v40, s30, 0224; GFX7-NEXT: s_mov_b32 s17, v2f16_user@abs32@hi225; GFX7-NEXT: s_mov_b32 s16, v2f16_user@abs32@lo226; GFX7-NEXT: s_addk_i32 s32, 0x400227; GFX7-NEXT: v_writelane_b32 v40, s31, 1228; GFX7-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)229; GFX7-NEXT: v_cvt_f32_f16_e32 v0, v1230; GFX7-NEXT: v_lshrrev_b32_e32 v1, 16, v1231; GFX7-NEXT: v_cvt_f32_f16_e32 v1, v1232; GFX7-NEXT: s_swappc_b64 s[30:31], s[16:17]233; GFX7-NEXT: v_readlane_b32 s31, v40, 1234; GFX7-NEXT: v_readlane_b32 s30, v40, 0235; GFX7-NEXT: s_mov_b32 s32, s33236; GFX7-NEXT: v_readlane_b32 s4, v40, 2237; GFX7-NEXT: s_or_saveexec_b64 s[6:7], -1238; GFX7-NEXT: buffer_load_dword v40, off, s[0:3], s33 ; 4-byte Folded Reload239; GFX7-NEXT: s_mov_b64 exec, s[6:7]240; GFX7-NEXT: s_mov_b32 s33, s4241; GFX7-NEXT: s_waitcnt vmcnt(0)242; GFX7-NEXT: s_setpc_b64 s[30:31]243 %val = load <2 x half>, ptr %ptr244 call void @v2f16_user(<2 x half> %val)245 ret void246}247 248define void @outgoing_f16_return(ptr %ptr) #0 {249; GFX7-LABEL: outgoing_f16_return:250; GFX7: ; %bb.0:251; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)252; GFX7-NEXT: s_mov_b32 s16, s33253; GFX7-NEXT: s_mov_b32 s33, s32254; GFX7-NEXT: s_or_saveexec_b64 s[18:19], -1255; GFX7-NEXT: buffer_store_dword v42, off, s[0:3], s33 offset:8 ; 4-byte Folded Spill256; GFX7-NEXT: s_mov_b64 exec, s[18:19]257; GFX7-NEXT: v_writelane_b32 v42, s16, 2258; GFX7-NEXT: v_writelane_b32 v42, s30, 0259; GFX7-NEXT: s_mov_b32 s17, f16_result@abs32@hi260; GFX7-NEXT: s_mov_b32 s16, f16_result@abs32@lo261; GFX7-NEXT: s_addk_i32 s32, 0x400262; GFX7-NEXT: buffer_store_dword v40, off, s[0:3], s33 offset:4 ; 4-byte Folded Spill263; GFX7-NEXT: buffer_store_dword v41, off, s[0:3], s33 ; 4-byte Folded Spill264; GFX7-NEXT: v_writelane_b32 v42, s31, 1265; GFX7-NEXT: v_mov_b32_e32 v41, v1266; GFX7-NEXT: v_mov_b32_e32 v40, v0267; GFX7-NEXT: s_swappc_b64 s[30:31], s[16:17]268; GFX7-NEXT: v_cvt_f16_f32_e32 v0, v0269; GFX7-NEXT: v_readlane_b32 s31, v42, 1270; GFX7-NEXT: v_readlane_b32 s30, v42, 0271; GFX7-NEXT: s_mov_b32 s32, s33272; GFX7-NEXT: v_and_b32_e32 v0, 0xffff, v0273; GFX7-NEXT: v_cvt_f32_f16_e32 v0, v0274; GFX7-NEXT: v_readlane_b32 s4, v42, 2275; GFX7-NEXT: v_cvt_f16_f32_e32 v0, v0276; GFX7-NEXT: flat_store_short v[40:41], v0277; GFX7-NEXT: buffer_load_dword v41, off, s[0:3], s33 ; 4-byte Folded Reload278; GFX7-NEXT: buffer_load_dword v40, off, s[0:3], s33 offset:4 ; 4-byte Folded Reload279; GFX7-NEXT: s_or_saveexec_b64 s[6:7], -1280; GFX7-NEXT: buffer_load_dword v42, off, s[0:3], s33 offset:8 ; 4-byte Folded Reload281; GFX7-NEXT: s_mov_b64 exec, s[6:7]282; GFX7-NEXT: s_mov_b32 s33, s4283; GFX7-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)284; GFX7-NEXT: s_setpc_b64 s[30:31]285 %val = call half @f16_result()286 store half %val, ptr %ptr287 ret void288}289 290define void @outgoing_v2f16_return(ptr %ptr) #0 {291; GFX7-LABEL: outgoing_v2f16_return:292; GFX7: ; %bb.0:293; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)294; GFX7-NEXT: s_mov_b32 s16, s33295; GFX7-NEXT: s_mov_b32 s33, s32296; GFX7-NEXT: s_or_saveexec_b64 s[18:19], -1297; GFX7-NEXT: buffer_store_dword v42, off, s[0:3], s33 offset:8 ; 4-byte Folded Spill298; GFX7-NEXT: s_mov_b64 exec, s[18:19]299; GFX7-NEXT: v_writelane_b32 v42, s16, 2300; GFX7-NEXT: v_writelane_b32 v42, s30, 0301; GFX7-NEXT: s_mov_b32 s17, v2f16_result@abs32@hi302; GFX7-NEXT: s_mov_b32 s16, v2f16_result@abs32@lo303; GFX7-NEXT: s_addk_i32 s32, 0x400304; GFX7-NEXT: buffer_store_dword v40, off, s[0:3], s33 offset:4 ; 4-byte Folded Spill305; GFX7-NEXT: buffer_store_dword v41, off, s[0:3], s33 ; 4-byte Folded Spill306; GFX7-NEXT: v_writelane_b32 v42, s31, 1307; GFX7-NEXT: v_mov_b32_e32 v41, v1308; GFX7-NEXT: v_mov_b32_e32 v40, v0309; GFX7-NEXT: s_swappc_b64 s[30:31], s[16:17]310; GFX7-NEXT: v_cvt_f16_f32_e32 v1, v1311; GFX7-NEXT: v_cvt_f16_f32_e32 v0, v0312; GFX7-NEXT: v_readlane_b32 s31, v42, 1313; GFX7-NEXT: v_readlane_b32 s30, v42, 0314; GFX7-NEXT: v_and_b32_e32 v1, 0xffff, v1315; GFX7-NEXT: v_cvt_f32_f16_e32 v1, v1316; GFX7-NEXT: v_and_b32_e32 v0, 0xffff, v0317; GFX7-NEXT: v_cvt_f32_f16_e32 v0, v0318; GFX7-NEXT: s_mov_b32 s32, s33319; GFX7-NEXT: v_cvt_f16_f32_e32 v1, v1320; GFX7-NEXT: v_readlane_b32 s4, v42, 2321; GFX7-NEXT: v_cvt_f16_f32_e32 v0, v0322; GFX7-NEXT: v_lshlrev_b32_e32 v1, 16, v1323; GFX7-NEXT: v_or_b32_e32 v0, v0, v1324; GFX7-NEXT: flat_store_dword v[40:41], v0325; GFX7-NEXT: buffer_load_dword v41, off, s[0:3], s33 ; 4-byte Folded Reload326; GFX7-NEXT: buffer_load_dword v40, off, s[0:3], s33 offset:4 ; 4-byte Folded Reload327; GFX7-NEXT: s_or_saveexec_b64 s[6:7], -1328; GFX7-NEXT: buffer_load_dword v42, off, s[0:3], s33 offset:8 ; 4-byte Folded Reload329; GFX7-NEXT: s_mov_b64 exec, s[6:7]330; GFX7-NEXT: s_mov_b32 s33, s4331; GFX7-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)332; GFX7-NEXT: s_setpc_b64 s[30:31]333 %val = call <2 x half> @v2f16_result()334 store <2 x half> %val, ptr %ptr335 ret void336}337 338define void @outgoing_v4f16_return(ptr %ptr) #0 {339; GFX7-LABEL: outgoing_v4f16_return:340; GFX7: ; %bb.0:341; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)342; GFX7-NEXT: s_mov_b32 s16, s33343; GFX7-NEXT: s_mov_b32 s33, s32344; GFX7-NEXT: s_or_saveexec_b64 s[18:19], -1345; GFX7-NEXT: buffer_store_dword v42, off, s[0:3], s33 offset:8 ; 4-byte Folded Spill346; GFX7-NEXT: s_mov_b64 exec, s[18:19]347; GFX7-NEXT: v_writelane_b32 v42, s16, 2348; GFX7-NEXT: v_writelane_b32 v42, s30, 0349; GFX7-NEXT: s_mov_b32 s17, v4f16_result@abs32@hi350; GFX7-NEXT: s_mov_b32 s16, v4f16_result@abs32@lo351; GFX7-NEXT: s_addk_i32 s32, 0x400352; GFX7-NEXT: buffer_store_dword v40, off, s[0:3], s33 offset:4 ; 4-byte Folded Spill353; GFX7-NEXT: buffer_store_dword v41, off, s[0:3], s33 ; 4-byte Folded Spill354; GFX7-NEXT: v_writelane_b32 v42, s31, 1355; GFX7-NEXT: v_mov_b32_e32 v41, v1356; GFX7-NEXT: v_mov_b32_e32 v40, v0357; GFX7-NEXT: s_swappc_b64 s[30:31], s[16:17]358; GFX7-NEXT: v_cvt_f16_f32_e32 v1, v1359; GFX7-NEXT: v_cvt_f16_f32_e32 v0, v0360; GFX7-NEXT: v_cvt_f16_f32_e32 v3, v3361; GFX7-NEXT: v_cvt_f16_f32_e32 v2, v2362; GFX7-NEXT: v_and_b32_e32 v1, 0xffff, v1363; GFX7-NEXT: v_cvt_f32_f16_e32 v1, v1364; GFX7-NEXT: v_and_b32_e32 v0, 0xffff, v0365; GFX7-NEXT: v_and_b32_e32 v3, 0xffff, v3366; GFX7-NEXT: v_cvt_f32_f16_e32 v0, v0367; GFX7-NEXT: v_cvt_f32_f16_e32 v3, v3368; GFX7-NEXT: v_and_b32_e32 v2, 0xffff, v2369; GFX7-NEXT: v_cvt_f32_f16_e32 v2, v2370; GFX7-NEXT: v_cvt_f16_f32_e32 v1, v1371; GFX7-NEXT: v_cvt_f16_f32_e32 v0, v0372; GFX7-NEXT: v_cvt_f16_f32_e32 v3, v3373; GFX7-NEXT: v_cvt_f16_f32_e32 v2, v2374; GFX7-NEXT: v_lshlrev_b32_e32 v1, 16, v1375; GFX7-NEXT: v_or_b32_e32 v4, v0, v1376; GFX7-NEXT: v_lshlrev_b32_e32 v0, 16, v3377; GFX7-NEXT: v_or_b32_e32 v2, v2, v0378; GFX7-NEXT: v_add_i32_e32 v0, vcc, 4, v40379; GFX7-NEXT: v_addc_u32_e32 v1, vcc, 0, v41, vcc380; GFX7-NEXT: flat_store_dword v[0:1], v2381; GFX7-NEXT: flat_store_dword v[40:41], v4382; GFX7-NEXT: buffer_load_dword v41, off, s[0:3], s33 ; 4-byte Folded Reload383; GFX7-NEXT: buffer_load_dword v40, off, s[0:3], s33 offset:4 ; 4-byte Folded Reload384; GFX7-NEXT: v_readlane_b32 s31, v42, 1385; GFX7-NEXT: v_readlane_b32 s30, v42, 0386; GFX7-NEXT: s_mov_b32 s32, s33387; GFX7-NEXT: v_readlane_b32 s4, v42, 2388; GFX7-NEXT: s_or_saveexec_b64 s[6:7], -1389; GFX7-NEXT: buffer_load_dword v42, off, s[0:3], s33 offset:8 ; 4-byte Folded Reload390; GFX7-NEXT: s_mov_b64 exec, s[6:7]391; GFX7-NEXT: s_mov_b32 s33, s4392; GFX7-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)393; GFX7-NEXT: s_setpc_b64 s[30:31]394 %val = call <4 x half> @v4f16_result()395 store <4 x half> %val, ptr %ptr396 ret void397}398 399define void @outgoing_v8f16_return(ptr %ptr) #0 {400; GFX7-LABEL: outgoing_v8f16_return:401; GFX7: ; %bb.0:402; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)403; GFX7-NEXT: s_mov_b32 s16, s33404; GFX7-NEXT: s_mov_b32 s33, s32405; GFX7-NEXT: s_or_saveexec_b64 s[18:19], -1406; GFX7-NEXT: buffer_store_dword v42, off, s[0:3], s33 offset:8 ; 4-byte Folded Spill407; GFX7-NEXT: s_mov_b64 exec, s[18:19]408; GFX7-NEXT: v_writelane_b32 v42, s16, 2409; GFX7-NEXT: v_writelane_b32 v42, s30, 0410; GFX7-NEXT: s_mov_b32 s17, v8f16_result@abs32@hi411; GFX7-NEXT: s_mov_b32 s16, v8f16_result@abs32@lo412; GFX7-NEXT: s_addk_i32 s32, 0x400413; GFX7-NEXT: buffer_store_dword v40, off, s[0:3], s33 offset:4 ; 4-byte Folded Spill414; GFX7-NEXT: buffer_store_dword v41, off, s[0:3], s33 ; 4-byte Folded Spill415; GFX7-NEXT: v_writelane_b32 v42, s31, 1416; GFX7-NEXT: v_mov_b32_e32 v41, v1417; GFX7-NEXT: v_mov_b32_e32 v40, v0418; GFX7-NEXT: s_swappc_b64 s[30:31], s[16:17]419; GFX7-NEXT: v_cvt_f16_f32_e32 v1, v1420; GFX7-NEXT: v_cvt_f16_f32_e32 v0, v0421; GFX7-NEXT: v_cvt_f16_f32_e32 v3, v3422; GFX7-NEXT: v_cvt_f16_f32_e32 v2, v2423; GFX7-NEXT: v_and_b32_e32 v1, 0xffff, v1424; GFX7-NEXT: v_cvt_f32_f16_e32 v1, v1425; GFX7-NEXT: v_and_b32_e32 v0, 0xffff, v0426; GFX7-NEXT: v_and_b32_e32 v3, 0xffff, v3427; GFX7-NEXT: v_cvt_f32_f16_e32 v0, v0428; GFX7-NEXT: v_cvt_f32_f16_e32 v3, v3429; GFX7-NEXT: v_and_b32_e32 v2, 0xffff, v2430; GFX7-NEXT: v_cvt_f32_f16_e32 v2, v2431; GFX7-NEXT: v_cvt_f16_f32_e32 v1, v1432; GFX7-NEXT: v_cvt_f16_f32_e32 v0, v0433; GFX7-NEXT: v_cvt_f16_f32_e32 v3, v3434; GFX7-NEXT: v_cvt_f16_f32_e32 v2, v2435; GFX7-NEXT: v_lshlrev_b32_e32 v1, 16, v1436; GFX7-NEXT: v_or_b32_e32 v8, v0, v1437; GFX7-NEXT: v_cvt_f16_f32_e32 v0, v5438; GFX7-NEXT: v_lshlrev_b32_e32 v1, 16, v3439; GFX7-NEXT: v_or_b32_e32 v2, v2, v1440; GFX7-NEXT: v_cvt_f16_f32_e32 v1, v4441; GFX7-NEXT: v_cvt_f16_f32_e32 v3, v7442; GFX7-NEXT: v_cvt_f16_f32_e32 v4, v6443; GFX7-NEXT: v_and_b32_e32 v0, 0xffff, v0444; GFX7-NEXT: v_cvt_f32_f16_e32 v0, v0445; GFX7-NEXT: v_and_b32_e32 v1, 0xffff, v1446; GFX7-NEXT: v_and_b32_e32 v3, 0xffff, v3447; GFX7-NEXT: v_cvt_f32_f16_e32 v1, v1448; GFX7-NEXT: v_cvt_f32_f16_e32 v3, v3449; GFX7-NEXT: v_and_b32_e32 v4, 0xffff, v4450; GFX7-NEXT: v_cvt_f32_f16_e32 v4, v4451; GFX7-NEXT: v_cvt_f16_f32_e32 v0, v0452; GFX7-NEXT: v_cvt_f16_f32_e32 v1, v1453; GFX7-NEXT: v_cvt_f16_f32_e32 v3, v3454; GFX7-NEXT: v_cvt_f16_f32_e32 v4, v4455; GFX7-NEXT: v_lshlrev_b32_e32 v0, 16, v0456; GFX7-NEXT: v_or_b32_e32 v5, v1, v0457; GFX7-NEXT: v_lshlrev_b32_e32 v0, 16, v3458; GFX7-NEXT: v_or_b32_e32 v3, v4, v0459; GFX7-NEXT: v_add_i32_e32 v0, vcc, 12, v40460; GFX7-NEXT: v_addc_u32_e32 v1, vcc, 0, v41, vcc461; GFX7-NEXT: flat_store_dword v[0:1], v3462; GFX7-NEXT: v_add_i32_e32 v0, vcc, 8, v40463; GFX7-NEXT: v_addc_u32_e32 v1, vcc, 0, v41, vcc464; GFX7-NEXT: flat_store_dword v[0:1], v5465; GFX7-NEXT: v_add_i32_e32 v0, vcc, 4, v40466; GFX7-NEXT: v_addc_u32_e32 v1, vcc, 0, v41, vcc467; GFX7-NEXT: flat_store_dword v[0:1], v2468; GFX7-NEXT: flat_store_dword v[40:41], v8469; GFX7-NEXT: buffer_load_dword v41, off, s[0:3], s33 ; 4-byte Folded Reload470; GFX7-NEXT: buffer_load_dword v40, off, s[0:3], s33 offset:4 ; 4-byte Folded Reload471; GFX7-NEXT: v_readlane_b32 s31, v42, 1472; GFX7-NEXT: v_readlane_b32 s30, v42, 0473; GFX7-NEXT: s_mov_b32 s32, s33474; GFX7-NEXT: v_readlane_b32 s4, v42, 2475; GFX7-NEXT: s_or_saveexec_b64 s[6:7], -1476; GFX7-NEXT: buffer_load_dword v42, off, s[0:3], s33 offset:8 ; 4-byte Folded Reload477; GFX7-NEXT: s_mov_b64 exec, s[6:7]478; GFX7-NEXT: s_mov_b32 s33, s4479; GFX7-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)480; GFX7-NEXT: s_setpc_b64 s[30:31]481 %val = call <8 x half> @v8f16_result()482 store <8 x half> %val, ptr %ptr483 ret void484}485 486define half @call_split_type_used_outside_block_v8f16() #0 {487; GFX7-LABEL: call_split_type_used_outside_block_v8f16:488; GFX7: ; %bb.0: ; %bb0489; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)490; GFX7-NEXT: s_mov_b32 s16, s33491; GFX7-NEXT: s_mov_b32 s33, s32492; GFX7-NEXT: s_or_saveexec_b64 s[18:19], -1493; GFX7-NEXT: buffer_store_dword v40, off, s[0:3], s33 ; 4-byte Folded Spill494; GFX7-NEXT: s_mov_b64 exec, s[18:19]495; GFX7-NEXT: v_writelane_b32 v40, s16, 2496; GFX7-NEXT: v_writelane_b32 v40, s30, 0497; GFX7-NEXT: s_mov_b32 s17, v8f16_result@abs32@hi498; GFX7-NEXT: s_mov_b32 s16, v8f16_result@abs32@lo499; GFX7-NEXT: s_addk_i32 s32, 0x400500; GFX7-NEXT: v_writelane_b32 v40, s31, 1501; GFX7-NEXT: s_swappc_b64 s[30:31], s[16:17]502; GFX7-NEXT: v_cvt_f16_f32_e32 v0, v0503; GFX7-NEXT: v_cvt_f16_f32_e32 v7, v7504; GFX7-NEXT: v_cvt_f16_f32_e32 v6, v6505; GFX7-NEXT: v_cvt_f16_f32_e32 v5, v5506; GFX7-NEXT: v_and_b32_e32 v0, 0xffff, v0507; GFX7-NEXT: v_cvt_f32_f16_e32 v0, v0508; GFX7-NEXT: v_cvt_f16_f32_e32 v4, v4509; GFX7-NEXT: v_cvt_f16_f32_e32 v3, v3510; GFX7-NEXT: v_cvt_f16_f32_e32 v2, v2511; GFX7-NEXT: v_cvt_f16_f32_e32 v1, v1512; GFX7-NEXT: v_cvt_f16_f32_e32 v0, v0513; GFX7-NEXT: v_and_b32_e32 v7, 0xffff, v7514; GFX7-NEXT: v_and_b32_e32 v6, 0xffff, v6515; GFX7-NEXT: v_and_b32_e32 v5, 0xffff, v5516; GFX7-NEXT: v_and_b32_e32 v4, 0xffff, v4517; GFX7-NEXT: v_and_b32_e32 v3, 0xffff, v3518; GFX7-NEXT: v_and_b32_e32 v2, 0xffff, v2519; GFX7-NEXT: v_and_b32_e32 v1, 0xffff, v1520; GFX7-NEXT: v_and_b32_e32 v0, 0xffff, v0521; GFX7-NEXT: v_cvt_f32_f16_e32 v7, v7522; GFX7-NEXT: v_cvt_f32_f16_e32 v6, v6523; GFX7-NEXT: v_cvt_f32_f16_e32 v5, v5524; GFX7-NEXT: v_cvt_f32_f16_e32 v4, v4525; GFX7-NEXT: v_cvt_f32_f16_e32 v3, v3526; GFX7-NEXT: v_cvt_f32_f16_e32 v2, v2527; GFX7-NEXT: v_cvt_f32_f16_e32 v1, v1528; GFX7-NEXT: v_cvt_f32_f16_e32 v0, v0529; GFX7-NEXT: v_readlane_b32 s31, v40, 1530; GFX7-NEXT: v_readlane_b32 s30, v40, 0531; GFX7-NEXT: s_mov_b32 s32, s33532; GFX7-NEXT: v_readlane_b32 s4, v40, 2533; GFX7-NEXT: s_or_saveexec_b64 s[6:7], -1534; GFX7-NEXT: buffer_load_dword v40, off, s[0:3], s33 ; 4-byte Folded Reload535; GFX7-NEXT: s_mov_b64 exec, s[6:7]536; GFX7-NEXT: s_mov_b32 s33, s4537; GFX7-NEXT: s_waitcnt vmcnt(0)538; GFX7-NEXT: s_setpc_b64 s[30:31]539bb0:540 %split.ret.type = call <8 x half> @v8f16_result()541 br label %bb1542 543bb1:544 %extract = extractelement <8 x half> %split.ret.type, i32 0545 ret half %extract546}547 548declare float @llvm.experimental.constrained.fpext.f32.f16(half, metadata) #0549declare <2 x float> @llvm.experimental.constrained.fpext.v2f32.v2f16(<2 x half>, metadata) #0550declare <3 x float> @llvm.experimental.constrained.fpext.v3f32.v3f16(<3 x half>, metadata) #0551declare <4 x float> @llvm.experimental.constrained.fpext.v4f32.v4f16(<4 x half>, metadata) #0552 553declare half @llvm.experimental.constrained.fptrunc.f16.f32(float, metadata, metadata) #0554declare <2 x half> @llvm.experimental.constrained.fptrunc.v2f16.v2f32(<2 x float>, metadata, metadata) #0555declare <3 x half> @llvm.experimental.constrained.fptrunc.v3f16.v3f32(<3 x float>, metadata, metadata) #0556declare <4 x half> @llvm.experimental.constrained.fptrunc.v4f16.v4f32(<4 x float>, metadata, metadata) #0557 558attributes #0 = { strictfp }559