719 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -global-isel=0 -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx900 < %s | FileCheck -check-prefixes=GFX9,GFX9-SDAG %s3; RUN: llc -global-isel=1 -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx900 < %s | FileCheck -check-prefixes=GFX9,GFX9-GISEL %s4 5; RUN: llc -global-isel=0 -mtriple=amdgcn-mesa-mesa3d -mcpu=fiji < %s | FileCheck -check-prefixes=GFX8,GFX8-SDAG %s6; RUN: llc -global-isel=1 -mtriple=amdgcn-mesa-mesa3d -mcpu=fiji < %s | FileCheck -check-prefixes=GFX8,GFX8-GISEL %s7 8; RUN: llc -global-isel=0 -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1010 < %s | FileCheck -check-prefixes=GFX10,GFX10-SDAG %s9; RUN: llc -global-isel=1 -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1010 < %s | FileCheck -check-prefixes=GFX10,GFX10-GISEL %s10 11; RUN: llc -global-isel=0 -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1100 -mattr=+real-true16 -amdgpu-enable-delay-alu=0 < %s | FileCheck -check-prefixes=GFX11,GFX11-SDAG-TRUE16 %s12; RUN: llc -global-isel=0 -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1100 -mattr=-real-true16 -amdgpu-enable-delay-alu=0 < %s | FileCheck -check-prefixes=GFX11,GFX11-SDAG-FAKE16 %s13; RUN: llc -global-isel=1 -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1100 -mattr=+real-true16 -amdgpu-enable-delay-alu=0 < %s | FileCheck -check-prefixes=GFX11,GFX11-GISEL,GFX11-GISEL-TRUE16 %s14; RUN: llc -global-isel=1 -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1100 -mattr=-real-true16 -amdgpu-enable-delay-alu=0 < %s | FileCheck -check-prefixes=GFX11,GFX11-GISEL,GFX11-GISEL-FAKE16 %s15 16; RUN: llc -global-isel=0 -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1200 < %s | FileCheck -check-prefixes=GFX12,GFX12-SDAG %s17; RUN: llc -global-isel=1 -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1200 < %s | FileCheck -check-prefixes=GFX12,GFX12-GISEL %s18 19; FIXME: promotion not handled without f16 insts20 21define half @v_constained_fadd_f16_fpexcept_strict(half %x, half %y) #0 {22; GFX9-LABEL: v_constained_fadd_f16_fpexcept_strict:23; GFX9: ; %bb.0:24; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)25; GFX9-NEXT: v_add_f16_e32 v0, v0, v126; GFX9-NEXT: s_setpc_b64 s[30:31]27;28; GFX8-LABEL: v_constained_fadd_f16_fpexcept_strict:29; GFX8: ; %bb.0:30; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)31; GFX8-NEXT: v_add_f16_e32 v0, v0, v132; GFX8-NEXT: s_setpc_b64 s[30:31]33;34; GFX10-LABEL: v_constained_fadd_f16_fpexcept_strict:35; GFX10: ; %bb.0:36; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)37; GFX10-NEXT: v_add_f16_e32 v0, v0, v138; GFX10-NEXT: s_setpc_b64 s[30:31]39;40; GFX11-SDAG-TRUE16-LABEL: v_constained_fadd_f16_fpexcept_strict:41; GFX11-SDAG-TRUE16: ; %bb.0:42; GFX11-SDAG-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)43; GFX11-SDAG-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v1.l44; GFX11-SDAG-TRUE16-NEXT: s_setpc_b64 s[30:31]45;46; GFX11-SDAG-FAKE16-LABEL: v_constained_fadd_f16_fpexcept_strict:47; GFX11-SDAG-FAKE16: ; %bb.0:48; GFX11-SDAG-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)49; GFX11-SDAG-FAKE16-NEXT: v_add_f16_e32 v0, v0, v150; GFX11-SDAG-FAKE16-NEXT: s_setpc_b64 s[30:31]51;52; GFX11-GISEL-TRUE16-LABEL: v_constained_fadd_f16_fpexcept_strict:53; GFX11-GISEL-TRUE16: ; %bb.0:54; GFX11-GISEL-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)55; GFX11-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v1.l56; GFX11-GISEL-TRUE16-NEXT: s_setpc_b64 s[30:31]57;58; GFX11-GISEL-FAKE16-LABEL: v_constained_fadd_f16_fpexcept_strict:59; GFX11-GISEL-FAKE16: ; %bb.0:60; GFX11-GISEL-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)61; GFX11-GISEL-FAKE16-NEXT: v_add_f16_e32 v0, v0, v162; GFX11-GISEL-FAKE16-NEXT: s_setpc_b64 s[30:31]63;64; GFX12-LABEL: v_constained_fadd_f16_fpexcept_strict:65; GFX12: ; %bb.0:66; GFX12-NEXT: s_wait_loadcnt_dscnt 0x067; GFX12-NEXT: s_wait_expcnt 0x068; GFX12-NEXT: s_wait_samplecnt 0x069; GFX12-NEXT: s_wait_bvhcnt 0x070; GFX12-NEXT: s_wait_kmcnt 0x071; GFX12-NEXT: v_add_f16_e32 v0, v0, v172; GFX12-NEXT: s_setpc_b64 s[30:31]73 %val = call half @llvm.experimental.constrained.fadd.f16(half %x, half %y, metadata !"round.tonearest", metadata !"fpexcept.strict")74 ret half %val75}76 77define half @v_constained_fadd_f16_fpexcept_ignore(half %x, half %y) #0 {78; GFX9-LABEL: v_constained_fadd_f16_fpexcept_ignore:79; GFX9: ; %bb.0:80; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)81; GFX9-NEXT: v_add_f16_e32 v0, v0, v182; GFX9-NEXT: s_setpc_b64 s[30:31]83;84; GFX8-LABEL: v_constained_fadd_f16_fpexcept_ignore:85; GFX8: ; %bb.0:86; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)87; GFX8-NEXT: v_add_f16_e32 v0, v0, v188; GFX8-NEXT: s_setpc_b64 s[30:31]89;90; GFX10-LABEL: v_constained_fadd_f16_fpexcept_ignore:91; GFX10: ; %bb.0:92; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)93; GFX10-NEXT: v_add_f16_e32 v0, v0, v194; GFX10-NEXT: s_setpc_b64 s[30:31]95;96; GFX11-SDAG-TRUE16-LABEL: v_constained_fadd_f16_fpexcept_ignore:97; GFX11-SDAG-TRUE16: ; %bb.0:98; GFX11-SDAG-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)99; GFX11-SDAG-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v1.l100; GFX11-SDAG-TRUE16-NEXT: s_setpc_b64 s[30:31]101;102; GFX11-SDAG-FAKE16-LABEL: v_constained_fadd_f16_fpexcept_ignore:103; GFX11-SDAG-FAKE16: ; %bb.0:104; GFX11-SDAG-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)105; GFX11-SDAG-FAKE16-NEXT: v_add_f16_e32 v0, v0, v1106; GFX11-SDAG-FAKE16-NEXT: s_setpc_b64 s[30:31]107;108; GFX11-GISEL-TRUE16-LABEL: v_constained_fadd_f16_fpexcept_ignore:109; GFX11-GISEL-TRUE16: ; %bb.0:110; GFX11-GISEL-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)111; GFX11-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v1.l112; GFX11-GISEL-TRUE16-NEXT: s_setpc_b64 s[30:31]113;114; GFX11-GISEL-FAKE16-LABEL: v_constained_fadd_f16_fpexcept_ignore:115; GFX11-GISEL-FAKE16: ; %bb.0:116; GFX11-GISEL-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)117; GFX11-GISEL-FAKE16-NEXT: v_add_f16_e32 v0, v0, v1118; GFX11-GISEL-FAKE16-NEXT: s_setpc_b64 s[30:31]119;120; GFX12-LABEL: v_constained_fadd_f16_fpexcept_ignore:121; GFX12: ; %bb.0:122; GFX12-NEXT: s_wait_loadcnt_dscnt 0x0123; GFX12-NEXT: s_wait_expcnt 0x0124; GFX12-NEXT: s_wait_samplecnt 0x0125; GFX12-NEXT: s_wait_bvhcnt 0x0126; GFX12-NEXT: s_wait_kmcnt 0x0127; GFX12-NEXT: v_add_f16_e32 v0, v0, v1128; GFX12-NEXT: s_setpc_b64 s[30:31]129; GFX11-TRUE16-LABEL: v_constained_fadd_f16_fpexcept_ignore:130; GFX11-TRUE16: ; %bb.0:131; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)132; GFX11-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v1.l133; GFX11-TRUE16-NEXT: s_setpc_b64 s[30:31]134; GFX11-FAKE16-LABEL: v_constained_fadd_f16_fpexcept_ignore:135; GFX11-FAKE16: ; %bb.0:136; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)137; GFX11-FAKE16-NEXT: v_add_f16_e32 v0, v0, v1138; GFX11-FAKE16-NEXT: s_setpc_b64 s[30:31]139 %val = call half @llvm.experimental.constrained.fadd.f16(half %x, half %y, metadata !"round.tonearest", metadata !"fpexcept.ignore")140 ret half %val141}142 143define half @v_constained_fadd_f16_fpexcept_maytrap(half %x, half %y) #0 {144; GFX9-LABEL: v_constained_fadd_f16_fpexcept_maytrap:145; GFX9: ; %bb.0:146; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)147; GFX9-NEXT: v_add_f16_e32 v0, v0, v1148; GFX9-NEXT: s_setpc_b64 s[30:31]149;150; GFX8-LABEL: v_constained_fadd_f16_fpexcept_maytrap:151; GFX8: ; %bb.0:152; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)153; GFX8-NEXT: v_add_f16_e32 v0, v0, v1154; GFX8-NEXT: s_setpc_b64 s[30:31]155;156; GFX10-LABEL: v_constained_fadd_f16_fpexcept_maytrap:157; GFX10: ; %bb.0:158; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)159; GFX10-NEXT: v_add_f16_e32 v0, v0, v1160; GFX10-NEXT: s_setpc_b64 s[30:31]161;162; GFX11-SDAG-TRUE16-LABEL: v_constained_fadd_f16_fpexcept_maytrap:163; GFX11-SDAG-TRUE16: ; %bb.0:164; GFX11-SDAG-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)165; GFX11-SDAG-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v1.l166; GFX11-SDAG-TRUE16-NEXT: s_setpc_b64 s[30:31]167;168; GFX11-SDAG-FAKE16-LABEL: v_constained_fadd_f16_fpexcept_maytrap:169; GFX11-SDAG-FAKE16: ; %bb.0:170; GFX11-SDAG-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)171; GFX11-SDAG-FAKE16-NEXT: v_add_f16_e32 v0, v0, v1172; GFX11-SDAG-FAKE16-NEXT: s_setpc_b64 s[30:31]173;174; GFX11-GISEL-TRUE16-LABEL: v_constained_fadd_f16_fpexcept_maytrap:175; GFX11-GISEL-TRUE16: ; %bb.0:176; GFX11-GISEL-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)177; GFX11-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v1.l178; GFX11-GISEL-TRUE16-NEXT: s_setpc_b64 s[30:31]179;180; GFX11-GISEL-FAKE16-LABEL: v_constained_fadd_f16_fpexcept_maytrap:181; GFX11-GISEL-FAKE16: ; %bb.0:182; GFX11-GISEL-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)183; GFX11-GISEL-FAKE16-NEXT: v_add_f16_e32 v0, v0, v1184; GFX11-GISEL-FAKE16-NEXT: s_setpc_b64 s[30:31]185;186; GFX12-LABEL: v_constained_fadd_f16_fpexcept_maytrap:187; GFX12: ; %bb.0:188; GFX12-NEXT: s_wait_loadcnt_dscnt 0x0189; GFX12-NEXT: s_wait_expcnt 0x0190; GFX12-NEXT: s_wait_samplecnt 0x0191; GFX12-NEXT: s_wait_bvhcnt 0x0192; GFX12-NEXT: s_wait_kmcnt 0x0193; GFX12-NEXT: v_add_f16_e32 v0, v0, v1194; GFX12-NEXT: s_setpc_b64 s[30:31]195; GFX11-TRUE16-LABEL: v_constained_fadd_f16_fpexcept_maytrap:196; GFX11-TRUE16: ; %bb.0:197; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)198; GFX11-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v1.l199; GFX11-TRUE16-NEXT: s_setpc_b64 s[30:31]200; GFX11-FAKE16-LABEL: v_constained_fadd_f16_fpexcept_maytrap:201; GFX11-FAKE16: ; %bb.0:202; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)203; GFX11-FAKE16-NEXT: v_add_f16_e32 v0, v0, v1204; GFX11-FAKE16-NEXT: s_setpc_b64 s[30:31]205 %val = call half @llvm.experimental.constrained.fadd.f16(half %x, half %y, metadata !"round.tonearest", metadata !"fpexcept.maytrap")206 ret half %val207}208 209define <2 x half> @v_constained_fadd_v2f16_fpexcept_strict(<2 x half> %x, <2 x half> %y) #0 {210; GFX9-LABEL: v_constained_fadd_v2f16_fpexcept_strict:211; GFX9: ; %bb.0:212; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)213; GFX9-NEXT: v_pk_add_f16 v0, v0, v1214; GFX9-NEXT: s_setpc_b64 s[30:31]215;216; GFX8-SDAG-LABEL: v_constained_fadd_v2f16_fpexcept_strict:217; GFX8-SDAG: ; %bb.0:218; GFX8-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)219; GFX8-SDAG-NEXT: v_add_f16_sdwa v2, v0, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1220; GFX8-SDAG-NEXT: v_add_f16_e32 v0, v0, v1221; GFX8-SDAG-NEXT: v_or_b32_e32 v0, v0, v2222; GFX8-SDAG-NEXT: s_setpc_b64 s[30:31]223;224; GFX8-GISEL-LABEL: v_constained_fadd_v2f16_fpexcept_strict:225; GFX8-GISEL: ; %bb.0:226; GFX8-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)227; GFX8-GISEL-NEXT: v_add_f16_e32 v2, v0, v1228; GFX8-GISEL-NEXT: v_add_f16_sdwa v0, v0, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1229; GFX8-GISEL-NEXT: v_or_b32_e32 v0, v2, v0230; GFX8-GISEL-NEXT: s_setpc_b64 s[30:31]231;232; GFX10-LABEL: v_constained_fadd_v2f16_fpexcept_strict:233; GFX10: ; %bb.0:234; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)235; GFX10-NEXT: v_pk_add_f16 v0, v0, v1236; GFX10-NEXT: s_setpc_b64 s[30:31]237;238; GFX11-LABEL: v_constained_fadd_v2f16_fpexcept_strict:239; GFX11: ; %bb.0:240; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)241; GFX11-NEXT: v_pk_add_f16 v0, v0, v1242; GFX11-NEXT: s_setpc_b64 s[30:31]243;244; GFX12-LABEL: v_constained_fadd_v2f16_fpexcept_strict:245; GFX12: ; %bb.0:246; GFX12-NEXT: s_wait_loadcnt_dscnt 0x0247; GFX12-NEXT: s_wait_expcnt 0x0248; GFX12-NEXT: s_wait_samplecnt 0x0249; GFX12-NEXT: s_wait_bvhcnt 0x0250; GFX12-NEXT: s_wait_kmcnt 0x0251; GFX12-NEXT: v_pk_add_f16 v0, v0, v1252; GFX12-NEXT: s_setpc_b64 s[30:31]253 %val = call <2 x half> @llvm.experimental.constrained.fadd.v2f16(<2 x half> %x, <2 x half> %y, metadata !"round.tonearest", metadata !"fpexcept.strict")254 ret <2 x half> %val255}256 257define <2 x half> @v_constained_fadd_v2f16_fpexcept_ignore(<2 x half> %x, <2 x half> %y) #0 {258; GFX9-LABEL: v_constained_fadd_v2f16_fpexcept_ignore:259; GFX9: ; %bb.0:260; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)261; GFX9-NEXT: v_pk_add_f16 v0, v0, v1262; GFX9-NEXT: s_setpc_b64 s[30:31]263;264; GFX8-SDAG-LABEL: v_constained_fadd_v2f16_fpexcept_ignore:265; GFX8-SDAG: ; %bb.0:266; GFX8-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)267; GFX8-SDAG-NEXT: v_add_f16_sdwa v2, v0, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1268; GFX8-SDAG-NEXT: v_add_f16_e32 v0, v0, v1269; GFX8-SDAG-NEXT: v_or_b32_e32 v0, v0, v2270; GFX8-SDAG-NEXT: s_setpc_b64 s[30:31]271;272; GFX8-GISEL-LABEL: v_constained_fadd_v2f16_fpexcept_ignore:273; GFX8-GISEL: ; %bb.0:274; GFX8-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)275; GFX8-GISEL-NEXT: v_add_f16_e32 v2, v0, v1276; GFX8-GISEL-NEXT: v_add_f16_sdwa v0, v0, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1277; GFX8-GISEL-NEXT: v_or_b32_e32 v0, v2, v0278; GFX8-GISEL-NEXT: s_setpc_b64 s[30:31]279;280; GFX10-LABEL: v_constained_fadd_v2f16_fpexcept_ignore:281; GFX10: ; %bb.0:282; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)283; GFX10-NEXT: v_pk_add_f16 v0, v0, v1284; GFX10-NEXT: s_setpc_b64 s[30:31]285;286; GFX11-LABEL: v_constained_fadd_v2f16_fpexcept_ignore:287; GFX11: ; %bb.0:288; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)289; GFX11-NEXT: v_pk_add_f16 v0, v0, v1290; GFX11-NEXT: s_setpc_b64 s[30:31]291;292; GFX12-LABEL: v_constained_fadd_v2f16_fpexcept_ignore:293; GFX12: ; %bb.0:294; GFX12-NEXT: s_wait_loadcnt_dscnt 0x0295; GFX12-NEXT: s_wait_expcnt 0x0296; GFX12-NEXT: s_wait_samplecnt 0x0297; GFX12-NEXT: s_wait_bvhcnt 0x0298; GFX12-NEXT: s_wait_kmcnt 0x0299; GFX12-NEXT: v_pk_add_f16 v0, v0, v1300; GFX12-NEXT: s_setpc_b64 s[30:31]301 %val = call <2 x half> @llvm.experimental.constrained.fadd.v2f16(<2 x half> %x, <2 x half> %y, metadata !"round.tonearest", metadata !"fpexcept.ignore")302 ret <2 x half> %val303}304 305define <2 x half> @v_constained_fadd_v2f16_fpexcept_maytrap(<2 x half> %x, <2 x half> %y) #0 {306; GFX9-LABEL: v_constained_fadd_v2f16_fpexcept_maytrap:307; GFX9: ; %bb.0:308; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)309; GFX9-NEXT: v_pk_add_f16 v0, v0, v1310; GFX9-NEXT: s_setpc_b64 s[30:31]311;312; GFX8-SDAG-LABEL: v_constained_fadd_v2f16_fpexcept_maytrap:313; GFX8-SDAG: ; %bb.0:314; GFX8-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)315; GFX8-SDAG-NEXT: v_add_f16_sdwa v2, v0, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1316; GFX8-SDAG-NEXT: v_add_f16_e32 v0, v0, v1317; GFX8-SDAG-NEXT: v_or_b32_e32 v0, v0, v2318; GFX8-SDAG-NEXT: s_setpc_b64 s[30:31]319;320; GFX8-GISEL-LABEL: v_constained_fadd_v2f16_fpexcept_maytrap:321; GFX8-GISEL: ; %bb.0:322; GFX8-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)323; GFX8-GISEL-NEXT: v_add_f16_e32 v2, v0, v1324; GFX8-GISEL-NEXT: v_add_f16_sdwa v0, v0, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1325; GFX8-GISEL-NEXT: v_or_b32_e32 v0, v2, v0326; GFX8-GISEL-NEXT: s_setpc_b64 s[30:31]327;328; GFX10-LABEL: v_constained_fadd_v2f16_fpexcept_maytrap:329; GFX10: ; %bb.0:330; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)331; GFX10-NEXT: v_pk_add_f16 v0, v0, v1332; GFX10-NEXT: s_setpc_b64 s[30:31]333;334; GFX11-LABEL: v_constained_fadd_v2f16_fpexcept_maytrap:335; GFX11: ; %bb.0:336; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)337; GFX11-NEXT: v_pk_add_f16 v0, v0, v1338; GFX11-NEXT: s_setpc_b64 s[30:31]339;340; GFX12-LABEL: v_constained_fadd_v2f16_fpexcept_maytrap:341; GFX12: ; %bb.0:342; GFX12-NEXT: s_wait_loadcnt_dscnt 0x0343; GFX12-NEXT: s_wait_expcnt 0x0344; GFX12-NEXT: s_wait_samplecnt 0x0345; GFX12-NEXT: s_wait_bvhcnt 0x0346; GFX12-NEXT: s_wait_kmcnt 0x0347; GFX12-NEXT: v_pk_add_f16 v0, v0, v1348; GFX12-NEXT: s_setpc_b64 s[30:31]349 %val = call <2 x half> @llvm.experimental.constrained.fadd.v2f16(<2 x half> %x, <2 x half> %y, metadata !"round.tonearest", metadata !"fpexcept.maytrap")350 ret <2 x half> %val351}352 353define <3 x half> @v_constained_fadd_v3f16_fpexcept_strict(<3 x half> %x, <3 x half> %y) #0 {354; GFX9-SDAG-LABEL: v_constained_fadd_v3f16_fpexcept_strict:355; GFX9-SDAG: ; %bb.0:356; GFX9-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)357; GFX9-SDAG-NEXT: v_pk_add_f16 v0, v0, v2358; GFX9-SDAG-NEXT: v_add_f16_e32 v1, v1, v3359; GFX9-SDAG-NEXT: s_setpc_b64 s[30:31]360;361; GFX9-GISEL-LABEL: v_constained_fadd_v3f16_fpexcept_strict:362; GFX9-GISEL: ; %bb.0:363; GFX9-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)364; GFX9-GISEL-NEXT: v_pk_add_f16 v0, v0, v2365; GFX9-GISEL-NEXT: v_pk_add_f16 v1, v1, v3366; GFX9-GISEL-NEXT: s_setpc_b64 s[30:31]367;368; GFX8-SDAG-LABEL: v_constained_fadd_v3f16_fpexcept_strict:369; GFX8-SDAG: ; %bb.0:370; GFX8-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)371; GFX8-SDAG-NEXT: v_add_f16_sdwa v4, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1372; GFX8-SDAG-NEXT: v_add_f16_e32 v0, v0, v2373; GFX8-SDAG-NEXT: v_or_b32_e32 v0, v0, v4374; GFX8-SDAG-NEXT: v_add_f16_e32 v1, v1, v3375; GFX8-SDAG-NEXT: s_setpc_b64 s[30:31]376;377; GFX8-GISEL-LABEL: v_constained_fadd_v3f16_fpexcept_strict:378; GFX8-GISEL: ; %bb.0:379; GFX8-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)380; GFX8-GISEL-NEXT: v_add_f16_e32 v4, v0, v2381; GFX8-GISEL-NEXT: v_add_f16_sdwa v0, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1382; GFX8-GISEL-NEXT: v_add_f16_e32 v1, v1, v3383; GFX8-GISEL-NEXT: v_or_b32_e32 v0, v4, v0384; GFX8-GISEL-NEXT: s_setpc_b64 s[30:31]385;386; GFX10-SDAG-LABEL: v_constained_fadd_v3f16_fpexcept_strict:387; GFX10-SDAG: ; %bb.0:388; GFX10-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)389; GFX10-SDAG-NEXT: v_pk_add_f16 v0, v0, v2390; GFX10-SDAG-NEXT: v_add_f16_e32 v1, v1, v3391; GFX10-SDAG-NEXT: s_setpc_b64 s[30:31]392;393; GFX10-GISEL-LABEL: v_constained_fadd_v3f16_fpexcept_strict:394; GFX10-GISEL: ; %bb.0:395; GFX10-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)396; GFX10-GISEL-NEXT: v_pk_add_f16 v0, v0, v2397; GFX10-GISEL-NEXT: v_pk_add_f16 v1, v1, v3398; GFX10-GISEL-NEXT: s_setpc_b64 s[30:31]399;400; GFX11-SDAG-TRUE16-LABEL: v_constained_fadd_v3f16_fpexcept_strict:401; GFX11-SDAG-TRUE16: ; %bb.0:402; GFX11-SDAG-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)403; GFX11-SDAG-TRUE16-NEXT: v_pk_add_f16 v0, v0, v2404; GFX11-SDAG-TRUE16-NEXT: v_add_f16_e32 v1.l, v1.l, v3.l405; GFX11-SDAG-TRUE16-NEXT: s_setpc_b64 s[30:31]406;407; GFX11-SDAG-FAKE16-LABEL: v_constained_fadd_v3f16_fpexcept_strict:408; GFX11-SDAG-FAKE16: ; %bb.0:409; GFX11-SDAG-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)410; GFX11-SDAG-FAKE16-NEXT: v_pk_add_f16 v0, v0, v2411; GFX11-SDAG-FAKE16-NEXT: v_add_f16_e32 v1, v1, v3412; GFX11-SDAG-FAKE16-NEXT: s_setpc_b64 s[30:31]413;414; GFX11-GISEL-LABEL: v_constained_fadd_v3f16_fpexcept_strict:415; GFX11-GISEL: ; %bb.0:416; GFX11-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)417; GFX11-GISEL-NEXT: v_pk_add_f16 v0, v0, v2418; GFX11-GISEL-NEXT: v_pk_add_f16 v1, v1, v3419; GFX11-GISEL-NEXT: s_setpc_b64 s[30:31]420;421; GFX12-SDAG-LABEL: v_constained_fadd_v3f16_fpexcept_strict:422; GFX12-SDAG: ; %bb.0:423; GFX12-SDAG-NEXT: s_wait_loadcnt_dscnt 0x0424; GFX12-SDAG-NEXT: s_wait_expcnt 0x0425; GFX12-SDAG-NEXT: s_wait_samplecnt 0x0426; GFX12-SDAG-NEXT: s_wait_bvhcnt 0x0427; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0428; GFX12-SDAG-NEXT: v_pk_add_f16 v0, v0, v2429; GFX12-SDAG-NEXT: v_add_f16_e32 v1, v1, v3430; GFX12-SDAG-NEXT: s_setpc_b64 s[30:31]431;432; GFX12-GISEL-LABEL: v_constained_fadd_v3f16_fpexcept_strict:433; GFX12-GISEL: ; %bb.0:434; GFX12-GISEL-NEXT: s_wait_loadcnt_dscnt 0x0435; GFX12-GISEL-NEXT: s_wait_expcnt 0x0436; GFX12-GISEL-NEXT: s_wait_samplecnt 0x0437; GFX12-GISEL-NEXT: s_wait_bvhcnt 0x0438; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0439; GFX12-GISEL-NEXT: v_pk_add_f16 v0, v0, v2440; GFX12-GISEL-NEXT: v_pk_add_f16 v1, v1, v3441; GFX12-GISEL-NEXT: s_setpc_b64 s[30:31]442; GFX11-TRUE16-LABEL: v_constained_fadd_v3f16_fpexcept_strict:443; GFX11-TRUE16: ; %bb.0:444; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)445; GFX11-TRUE16-NEXT: v_pk_add_f16 v0, v0, v2446; GFX11-TRUE16-NEXT: v_add_f16_e32 v1.l, v1.l, v3.l447; GFX11-TRUE16-NEXT: s_setpc_b64 s[30:31]448; GFX11-FAKE16-LABEL: v_constained_fadd_v3f16_fpexcept_strict:449; GFX11-FAKE16: ; %bb.0:450; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)451; GFX11-FAKE16-NEXT: v_pk_add_f16 v0, v0, v2452; GFX11-FAKE16-NEXT: v_add_f16_e32 v1, v1, v3453; GFX11-FAKE16-NEXT: s_setpc_b64 s[30:31]454 %val = call <3 x half> @llvm.experimental.constrained.fadd.v3f16(<3 x half> %x, <3 x half> %y, metadata !"round.tonearest", metadata !"fpexcept.strict")455 ret <3 x half> %val456}457 458; FIXME: Scalarized459define <4 x half> @v_constained_fadd_v4f16_fpexcept_strict(<4 x half> %x, <4 x half> %y) #0 {460; GFX9-SDAG-LABEL: v_constained_fadd_v4f16_fpexcept_strict:461; GFX9-SDAG: ; %bb.0:462; GFX9-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)463; GFX9-SDAG-NEXT: v_add_f16_sdwa v4, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1464; GFX9-SDAG-NEXT: v_add_f16_sdwa v5, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1465; GFX9-SDAG-NEXT: v_add_f16_e32 v1, v1, v3466; GFX9-SDAG-NEXT: v_add_f16_e32 v0, v0, v2467; GFX9-SDAG-NEXT: s_mov_b32 s4, 0x5040100468; GFX9-SDAG-NEXT: v_perm_b32 v0, v5, v0, s4469; GFX9-SDAG-NEXT: v_perm_b32 v1, v4, v1, s4470; GFX9-SDAG-NEXT: s_setpc_b64 s[30:31]471;472; GFX9-GISEL-LABEL: v_constained_fadd_v4f16_fpexcept_strict:473; GFX9-GISEL: ; %bb.0:474; GFX9-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)475; GFX9-GISEL-NEXT: v_pk_add_f16 v0, v0, v2476; GFX9-GISEL-NEXT: v_pk_add_f16 v1, v1, v3477; GFX9-GISEL-NEXT: s_setpc_b64 s[30:31]478;479; GFX8-SDAG-LABEL: v_constained_fadd_v4f16_fpexcept_strict:480; GFX8-SDAG: ; %bb.0:481; GFX8-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)482; GFX8-SDAG-NEXT: v_add_f16_sdwa v4, v1, v3 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1483; GFX8-SDAG-NEXT: v_add_f16_sdwa v5, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1484; GFX8-SDAG-NEXT: v_add_f16_e32 v1, v1, v3485; GFX8-SDAG-NEXT: v_add_f16_e32 v0, v0, v2486; GFX8-SDAG-NEXT: v_or_b32_e32 v0, v0, v5487; GFX8-SDAG-NEXT: v_or_b32_e32 v1, v1, v4488; GFX8-SDAG-NEXT: s_setpc_b64 s[30:31]489;490; GFX8-GISEL-LABEL: v_constained_fadd_v4f16_fpexcept_strict:491; GFX8-GISEL: ; %bb.0:492; GFX8-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)493; GFX8-GISEL-NEXT: v_add_f16_e32 v4, v0, v2494; GFX8-GISEL-NEXT: v_add_f16_sdwa v0, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1495; GFX8-GISEL-NEXT: v_add_f16_e32 v2, v1, v3496; GFX8-GISEL-NEXT: v_add_f16_sdwa v1, v1, v3 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1497; GFX8-GISEL-NEXT: v_or_b32_e32 v0, v4, v0498; GFX8-GISEL-NEXT: v_or_b32_e32 v1, v2, v1499; GFX8-GISEL-NEXT: s_setpc_b64 s[30:31]500;501; GFX10-SDAG-LABEL: v_constained_fadd_v4f16_fpexcept_strict:502; GFX10-SDAG: ; %bb.0:503; GFX10-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)504; GFX10-SDAG-NEXT: v_add_f16_sdwa v4, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1505; GFX10-SDAG-NEXT: v_add_f16_sdwa v5, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1506; GFX10-SDAG-NEXT: v_add_f16_e32 v0, v0, v2507; GFX10-SDAG-NEXT: v_add_f16_e32 v1, v1, v3508; GFX10-SDAG-NEXT: v_perm_b32 v0, v5, v0, 0x5040100509; GFX10-SDAG-NEXT: v_perm_b32 v1, v4, v1, 0x5040100510; GFX10-SDAG-NEXT: s_setpc_b64 s[30:31]511;512; GFX10-GISEL-LABEL: v_constained_fadd_v4f16_fpexcept_strict:513; GFX10-GISEL: ; %bb.0:514; GFX10-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)515; GFX10-GISEL-NEXT: v_pk_add_f16 v0, v0, v2516; GFX10-GISEL-NEXT: v_pk_add_f16 v1, v1, v3517; GFX10-GISEL-NEXT: s_setpc_b64 s[30:31]518;519; GFX11-SDAG-TRUE16-LABEL: v_constained_fadd_v4f16_fpexcept_strict:520; GFX11-SDAG-TRUE16: ; %bb.0:521; GFX11-SDAG-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)522; GFX11-SDAG-TRUE16-NEXT: v_add_f16_e32 v1.h, v1.h, v3.h523; GFX11-SDAG-TRUE16-NEXT: v_add_f16_e32 v0.h, v0.h, v2.h524; GFX11-SDAG-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v2.l525; GFX11-SDAG-TRUE16-NEXT: v_add_f16_e32 v1.l, v1.l, v3.l526; GFX11-SDAG-TRUE16-NEXT: s_setpc_b64 s[30:31]527;528; GFX11-SDAG-FAKE16-LABEL: v_constained_fadd_v4f16_fpexcept_strict:529; GFX11-SDAG-FAKE16: ; %bb.0:530; GFX11-SDAG-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)531; GFX11-SDAG-FAKE16-NEXT: v_lshrrev_b32_e32 v4, 16, v3532; GFX11-SDAG-FAKE16-NEXT: v_lshrrev_b32_e32 v5, 16, v2533; GFX11-SDAG-FAKE16-NEXT: v_lshrrev_b32_e32 v6, 16, v0534; GFX11-SDAG-FAKE16-NEXT: v_lshrrev_b32_e32 v7, 16, v1535; GFX11-SDAG-FAKE16-NEXT: v_add_f16_e32 v1, v1, v3536; GFX11-SDAG-FAKE16-NEXT: v_add_f16_e32 v0, v0, v2537; GFX11-SDAG-FAKE16-NEXT: v_add_f16_e32 v2, v6, v5538; GFX11-SDAG-FAKE16-NEXT: v_add_f16_e32 v3, v7, v4539; GFX11-SDAG-FAKE16-NEXT: v_perm_b32 v0, v2, v0, 0x5040100540; GFX11-SDAG-FAKE16-NEXT: v_perm_b32 v1, v3, v1, 0x5040100541; GFX11-SDAG-FAKE16-NEXT: s_setpc_b64 s[30:31]542;543; GFX11-GISEL-LABEL: v_constained_fadd_v4f16_fpexcept_strict:544; GFX11-GISEL: ; %bb.0:545; GFX11-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)546; GFX11-GISEL-NEXT: v_pk_add_f16 v0, v0, v2547; GFX11-GISEL-NEXT: v_pk_add_f16 v1, v1, v3548; GFX11-GISEL-NEXT: s_setpc_b64 s[30:31]549;550; GFX12-SDAG-LABEL: v_constained_fadd_v4f16_fpexcept_strict:551; GFX12-SDAG: ; %bb.0:552; GFX12-SDAG-NEXT: s_wait_loadcnt_dscnt 0x0553; GFX12-SDAG-NEXT: s_wait_expcnt 0x0554; GFX12-SDAG-NEXT: s_wait_samplecnt 0x0555; GFX12-SDAG-NEXT: s_wait_bvhcnt 0x0556; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0557; GFX12-SDAG-NEXT: v_lshrrev_b32_e32 v4, 16, v3558; GFX12-SDAG-NEXT: v_lshrrev_b32_e32 v5, 16, v2559; GFX12-SDAG-NEXT: v_lshrrev_b32_e32 v6, 16, v0560; GFX12-SDAG-NEXT: v_lshrrev_b32_e32 v7, 16, v1561; GFX12-SDAG-NEXT: v_add_f16_e32 v1, v1, v3562; GFX12-SDAG-NEXT: v_add_f16_e32 v0, v0, v2563; GFX12-SDAG-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)564; GFX12-SDAG-NEXT: v_add_f16_e32 v2, v6, v5565; GFX12-SDAG-NEXT: v_add_f16_e32 v3, v7, v4566; GFX12-SDAG-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)567; GFX12-SDAG-NEXT: v_perm_b32 v0, v2, v0, 0x5040100568; GFX12-SDAG-NEXT: v_perm_b32 v1, v3, v1, 0x5040100569; GFX12-SDAG-NEXT: s_setpc_b64 s[30:31]570;571; GFX12-GISEL-LABEL: v_constained_fadd_v4f16_fpexcept_strict:572; GFX12-GISEL: ; %bb.0:573; GFX12-GISEL-NEXT: s_wait_loadcnt_dscnt 0x0574; GFX12-GISEL-NEXT: s_wait_expcnt 0x0575; GFX12-GISEL-NEXT: s_wait_samplecnt 0x0576; GFX12-GISEL-NEXT: s_wait_bvhcnt 0x0577; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0578; GFX12-GISEL-NEXT: v_pk_add_f16 v0, v0, v2579; GFX12-GISEL-NEXT: v_pk_add_f16 v1, v1, v3580; GFX12-GISEL-NEXT: s_setpc_b64 s[30:31]581; GFX11-TRUE16-LABEL: v_constained_fadd_v4f16_fpexcept_strict:582; GFX11-TRUE16: ; %bb.0:583; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)584; GFX11-TRUE16-NEXT: v_add_f16_e32 v1.h, v1.h, v3.h585; GFX11-TRUE16-NEXT: v_add_f16_e32 v0.h, v0.h, v2.h586; GFX11-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v2.l587; GFX11-TRUE16-NEXT: v_add_f16_e32 v1.l, v1.l, v3.l588; GFX11-TRUE16-NEXT: s_setpc_b64 s[30:31]589; GFX11-FAKE16-LABEL: v_constained_fadd_v4f16_fpexcept_strict:590; GFX11-FAKE16: ; %bb.0:591; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)592; GFX11-FAKE16-NEXT: v_lshrrev_b32_e32 v4, 16, v3593; GFX11-FAKE16-NEXT: v_lshrrev_b32_e32 v5, 16, v2594; GFX11-FAKE16-NEXT: v_lshrrev_b32_e32 v6, 16, v0595; GFX11-FAKE16-NEXT: v_lshrrev_b32_e32 v7, 16, v1596; GFX11-FAKE16-NEXT: v_add_f16_e32 v1, v1, v3597; GFX11-FAKE16-NEXT: v_add_f16_e32 v0, v0, v2598; GFX11-FAKE16-NEXT: v_add_f16_e32 v2, v6, v5599; GFX11-FAKE16-NEXT: v_add_f16_e32 v3, v7, v4600; GFX11-FAKE16-NEXT: v_perm_b32 v0, v2, v0, 0x5040100601; GFX11-FAKE16-NEXT: v_perm_b32 v1, v3, v1, 0x5040100602; GFX11-FAKE16-NEXT: s_setpc_b64 s[30:31]603 %val = call <4 x half> @llvm.experimental.constrained.fadd.v4f16(<4 x half> %x, <4 x half> %y, metadata !"round.tonearest", metadata !"fpexcept.strict")604 ret <4 x half> %val605}606 607define amdgpu_ps half @s_constained_fadd_f16_fpexcept_strict(half inreg %x, half inreg %y) #0 {608; GFX9-LABEL: s_constained_fadd_f16_fpexcept_strict:609; GFX9: ; %bb.0:610; GFX9-NEXT: v_mov_b32_e32 v0, s3611; GFX9-NEXT: v_add_f16_e32 v0, s2, v0612; GFX9-NEXT: ; return to shader part epilog613;614; GFX8-LABEL: s_constained_fadd_f16_fpexcept_strict:615; GFX8: ; %bb.0:616; GFX8-NEXT: v_mov_b32_e32 v0, s3617; GFX8-NEXT: v_add_f16_e32 v0, s2, v0618; GFX8-NEXT: ; return to shader part epilog619;620; GFX10-LABEL: s_constained_fadd_f16_fpexcept_strict:621; GFX10: ; %bb.0:622; GFX10-NEXT: v_add_f16_e64 v0, s2, s3623; GFX10-NEXT: ; return to shader part epilog624;625; GFX11-SDAG-TRUE16-LABEL: s_constained_fadd_f16_fpexcept_strict:626; GFX11-SDAG-TRUE16: ; %bb.0:627; GFX11-SDAG-TRUE16-NEXT: v_add_f16_e64 v0.l, s2, s3628; GFX11-SDAG-TRUE16-NEXT: ; return to shader part epilog629;630; GFX11-SDAG-FAKE16-LABEL: s_constained_fadd_f16_fpexcept_strict:631; GFX11-SDAG-FAKE16: ; %bb.0:632; GFX11-SDAG-FAKE16-NEXT: v_add_f16_e64 v0, s2, s3633; GFX11-SDAG-FAKE16-NEXT: ; return to shader part epilog634;635; GFX11-GISEL-TRUE16-LABEL: s_constained_fadd_f16_fpexcept_strict:636; GFX11-GISEL-TRUE16: ; %bb.0:637; GFX11-GISEL-TRUE16-NEXT: v_add_f16_e64 v0.l, s2, s3638; GFX11-GISEL-TRUE16-NEXT: ; return to shader part epilog639;640; GFX11-GISEL-FAKE16-LABEL: s_constained_fadd_f16_fpexcept_strict:641; GFX11-GISEL-FAKE16: ; %bb.0:642; GFX11-GISEL-FAKE16-NEXT: v_add_f16_e64 v0, s2, s3643; GFX11-GISEL-FAKE16-NEXT: ; return to shader part epilog644;645; GFX12-LABEL: s_constained_fadd_f16_fpexcept_strict:646; GFX12: ; %bb.0:647; GFX12-NEXT: s_add_f16 s0, s2, s3648; GFX12-NEXT: s_delay_alu instid0(SALU_CYCLE_3)649; GFX12-NEXT: v_mov_b32_e32 v0, s0650; GFX12-NEXT: ; return to shader part epilog651; GFX11-TRUE16-LABEL: s_constained_fadd_f16_fpexcept_strict:652; GFX11-TRUE16: ; %bb.0:653; GFX11-TRUE16-NEXT: v_add_f16_e64 v0.l, s2, s3654; GFX11-TRUE16-NEXT: ; return to shader part epilog655; GFX11-FAKE16-LABEL: s_constained_fadd_f16_fpexcept_strict:656; GFX11-FAKE16: ; %bb.0:657; GFX11-FAKE16-NEXT: v_add_f16_e64 v0, s2, s3658; GFX11-FAKE16-NEXT: ; return to shader part epilog659 %val = call half @llvm.experimental.constrained.fadd.f16(half %x, half %y, metadata !"round.tonearest", metadata !"fpexcept.strict")660 ret half %val661}662 663define amdgpu_ps <2 x half> @s_constained_fadd_v2f16_fpexcept_strict(<2 x half> inreg %x, <2 x half> inreg %y) #0 {664; GFX9-LABEL: s_constained_fadd_v2f16_fpexcept_strict:665; GFX9: ; %bb.0:666; GFX9-NEXT: v_mov_b32_e32 v0, s3667; GFX9-NEXT: v_pk_add_f16 v0, s2, v0668; GFX9-NEXT: ; return to shader part epilog669;670; GFX8-SDAG-LABEL: s_constained_fadd_v2f16_fpexcept_strict:671; GFX8-SDAG: ; %bb.0:672; GFX8-SDAG-NEXT: s_lshr_b32 s0, s3, 16673; GFX8-SDAG-NEXT: s_lshr_b32 s1, s2, 16674; GFX8-SDAG-NEXT: v_mov_b32_e32 v0, s0675; GFX8-SDAG-NEXT: v_mov_b32_e32 v1, s1676; GFX8-SDAG-NEXT: v_add_f16_sdwa v0, v1, v0 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD677; GFX8-SDAG-NEXT: v_mov_b32_e32 v1, s3678; GFX8-SDAG-NEXT: v_add_f16_e32 v1, s2, v1679; GFX8-SDAG-NEXT: v_or_b32_e32 v0, v1, v0680; GFX8-SDAG-NEXT: ; return to shader part epilog681;682; GFX8-GISEL-LABEL: s_constained_fadd_v2f16_fpexcept_strict:683; GFX8-GISEL: ; %bb.0:684; GFX8-GISEL-NEXT: s_lshr_b32 s0, s2, 16685; GFX8-GISEL-NEXT: s_lshr_b32 s1, s3, 16686; GFX8-GISEL-NEXT: v_mov_b32_e32 v0, s3687; GFX8-GISEL-NEXT: v_mov_b32_e32 v1, s1688; GFX8-GISEL-NEXT: v_mov_b32_e32 v2, s0689; GFX8-GISEL-NEXT: v_add_f16_e32 v0, s2, v0690; GFX8-GISEL-NEXT: v_add_f16_sdwa v1, v2, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD691; GFX8-GISEL-NEXT: v_or_b32_e32 v0, v0, v1692; GFX8-GISEL-NEXT: ; return to shader part epilog693;694; GFX10-LABEL: s_constained_fadd_v2f16_fpexcept_strict:695; GFX10: ; %bb.0:696; GFX10-NEXT: v_pk_add_f16 v0, s2, s3697; GFX10-NEXT: ; return to shader part epilog698;699; GFX11-LABEL: s_constained_fadd_v2f16_fpexcept_strict:700; GFX11: ; %bb.0:701; GFX11-NEXT: v_pk_add_f16 v0, s2, s3702; GFX11-NEXT: ; return to shader part epilog703;704; GFX12-LABEL: s_constained_fadd_v2f16_fpexcept_strict:705; GFX12: ; %bb.0:706; GFX12-NEXT: v_pk_add_f16 v0, s2, s3707; GFX12-NEXT: ; return to shader part epilog708 %val = call <2 x half> @llvm.experimental.constrained.fadd.v2f16(<2 x half> %x, <2 x half> %y, metadata !"round.tonearest", metadata !"fpexcept.strict")709 ret <2 x half> %val710}711 712declare half @llvm.experimental.constrained.fadd.f16(half, half, metadata, metadata) #1713declare <2 x half> @llvm.experimental.constrained.fadd.v2f16(<2 x half>, <2 x half>, metadata, metadata) #1714declare <3 x half> @llvm.experimental.constrained.fadd.v3f16(<3 x half>, <3 x half>, metadata, metadata) #1715declare <4 x half> @llvm.experimental.constrained.fadd.v4f16(<4 x half>, <4 x half>, metadata, metadata) #1716 717attributes #0 = { strictfp }718attributes #1 = { inaccessiblememonly nounwind willreturn }719