1027 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=GCN,GFX9,GFX9-SDAG %s3; RUN: llc -global-isel=1 -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx900 < %s | FileCheck -check-prefixes=GCN,GFX9,GFX9-GISEL %s4 5; RUN: llc -global-isel=0 -mtriple=amdgcn-mesa-mesa3d -mcpu=fiji < %s | FileCheck -check-prefixes=GCN,GFX8,GFX8-SDAG %s6; RUN: llc -global-isel=1 -mtriple=amdgcn-mesa-mesa3d -mcpu=fiji < %s | FileCheck -check-prefixes=GCN,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_fsub_f16_fpexcept_strict(half %x, half %y) #0 {22; GCN-LABEL: v_constained_fsub_f16_fpexcept_strict:23; GCN: ; %bb.0:24; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)25; GCN-NEXT: v_sub_f16_e32 v0, v0, v126; GCN-NEXT: s_setpc_b64 s[30:31]27;28; GFX10-LABEL: v_constained_fsub_f16_fpexcept_strict:29; GFX10: ; %bb.0:30; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)31; GFX10-NEXT: v_sub_f16_e32 v0, v0, v132; GFX10-NEXT: s_setpc_b64 s[30:31]33;34; GFX11-SDAG-TRUE16-LABEL: v_constained_fsub_f16_fpexcept_strict:35; GFX11-SDAG-TRUE16: ; %bb.0:36; GFX11-SDAG-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)37; GFX11-SDAG-TRUE16-NEXT: v_sub_f16_e32 v0.l, v0.l, v1.l38; GFX11-SDAG-TRUE16-NEXT: s_setpc_b64 s[30:31]39;40; GFX11-SDAG-FAKE16-LABEL: v_constained_fsub_f16_fpexcept_strict:41; GFX11-SDAG-FAKE16: ; %bb.0:42; GFX11-SDAG-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)43; GFX11-SDAG-FAKE16-NEXT: v_sub_f16_e32 v0, v0, v144; GFX11-SDAG-FAKE16-NEXT: s_setpc_b64 s[30:31]45;46; GFX11-GISEL-TRUE16-LABEL: v_constained_fsub_f16_fpexcept_strict:47; GFX11-GISEL-TRUE16: ; %bb.0:48; GFX11-GISEL-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)49; GFX11-GISEL-TRUE16-NEXT: v_sub_f16_e32 v0.l, v0.l, v1.l50; GFX11-GISEL-TRUE16-NEXT: s_setpc_b64 s[30:31]51;52; GFX11-GISEL-FAKE16-LABEL: v_constained_fsub_f16_fpexcept_strict:53; GFX11-GISEL-FAKE16: ; %bb.0:54; GFX11-GISEL-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)55; GFX11-GISEL-FAKE16-NEXT: v_sub_f16_e32 v0, v0, v156; GFX11-GISEL-FAKE16-NEXT: s_setpc_b64 s[30:31]57;58; GFX12-LABEL: v_constained_fsub_f16_fpexcept_strict:59; GFX12: ; %bb.0:60; GFX12-NEXT: s_wait_loadcnt_dscnt 0x061; GFX12-NEXT: s_wait_expcnt 0x062; GFX12-NEXT: s_wait_samplecnt 0x063; GFX12-NEXT: s_wait_bvhcnt 0x064; GFX12-NEXT: s_wait_kmcnt 0x065; GFX12-NEXT: v_sub_f16_e32 v0, v0, v166; GFX12-NEXT: s_setpc_b64 s[30:31]67 %val = call half @llvm.experimental.constrained.fsub.f16(half %x, half %y, metadata !"round.tonearest", metadata !"fpexcept.strict")68 ret half %val69}70 71define half @v_constained_fsub_f16_fpexcept_ignore(half %x, half %y) #0 {72; GCN-LABEL: v_constained_fsub_f16_fpexcept_ignore:73; GCN: ; %bb.0:74; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)75; GCN-NEXT: v_sub_f16_e32 v0, v0, v176; GCN-NEXT: s_setpc_b64 s[30:31]77;78; GFX10-LABEL: v_constained_fsub_f16_fpexcept_ignore:79; GFX10: ; %bb.0:80; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)81; GFX10-NEXT: v_sub_f16_e32 v0, v0, v182; GFX10-NEXT: s_setpc_b64 s[30:31]83;84; GFX11-SDAG-TRUE16-LABEL: v_constained_fsub_f16_fpexcept_ignore:85; GFX11-SDAG-TRUE16: ; %bb.0:86; GFX11-SDAG-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)87; GFX11-SDAG-TRUE16-NEXT: v_sub_f16_e32 v0.l, v0.l, v1.l88; GFX11-SDAG-TRUE16-NEXT: s_setpc_b64 s[30:31]89;90; GFX11-SDAG-FAKE16-LABEL: v_constained_fsub_f16_fpexcept_ignore:91; GFX11-SDAG-FAKE16: ; %bb.0:92; GFX11-SDAG-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)93; GFX11-SDAG-FAKE16-NEXT: v_sub_f16_e32 v0, v0, v194; GFX11-SDAG-FAKE16-NEXT: s_setpc_b64 s[30:31]95;96; GFX11-GISEL-TRUE16-LABEL: v_constained_fsub_f16_fpexcept_ignore:97; GFX11-GISEL-TRUE16: ; %bb.0:98; GFX11-GISEL-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)99; GFX11-GISEL-TRUE16-NEXT: v_sub_f16_e32 v0.l, v0.l, v1.l100; GFX11-GISEL-TRUE16-NEXT: s_setpc_b64 s[30:31]101;102; GFX11-GISEL-FAKE16-LABEL: v_constained_fsub_f16_fpexcept_ignore:103; GFX11-GISEL-FAKE16: ; %bb.0:104; GFX11-GISEL-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)105; GFX11-GISEL-FAKE16-NEXT: v_sub_f16_e32 v0, v0, v1106; GFX11-GISEL-FAKE16-NEXT: s_setpc_b64 s[30:31]107;108; GFX12-LABEL: v_constained_fsub_f16_fpexcept_ignore:109; GFX12: ; %bb.0:110; GFX12-NEXT: s_wait_loadcnt_dscnt 0x0111; GFX12-NEXT: s_wait_expcnt 0x0112; GFX12-NEXT: s_wait_samplecnt 0x0113; GFX12-NEXT: s_wait_bvhcnt 0x0114; GFX12-NEXT: s_wait_kmcnt 0x0115; GFX12-NEXT: v_sub_f16_e32 v0, v0, v1116; GFX12-NEXT: s_setpc_b64 s[30:31]117 %val = call half @llvm.experimental.constrained.fsub.f16(half %x, half %y, metadata !"round.tonearest", metadata !"fpexcept.ignore")118 ret half %val119}120 121define half @v_constained_fsub_f16_fpexcept_maytrap(half %x, half %y) #0 {122; GCN-LABEL: v_constained_fsub_f16_fpexcept_maytrap:123; GCN: ; %bb.0:124; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)125; GCN-NEXT: v_sub_f16_e32 v0, v0, v1126; GCN-NEXT: s_setpc_b64 s[30:31]127;128; GFX10-LABEL: v_constained_fsub_f16_fpexcept_maytrap:129; GFX10: ; %bb.0:130; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)131; GFX10-NEXT: v_sub_f16_e32 v0, v0, v1132; GFX10-NEXT: s_setpc_b64 s[30:31]133;134; GFX11-SDAG-TRUE16-LABEL: v_constained_fsub_f16_fpexcept_maytrap:135; GFX11-SDAG-TRUE16: ; %bb.0:136; GFX11-SDAG-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)137; GFX11-SDAG-TRUE16-NEXT: v_sub_f16_e32 v0.l, v0.l, v1.l138; GFX11-SDAG-TRUE16-NEXT: s_setpc_b64 s[30:31]139;140; GFX11-SDAG-FAKE16-LABEL: v_constained_fsub_f16_fpexcept_maytrap:141; GFX11-SDAG-FAKE16: ; %bb.0:142; GFX11-SDAG-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)143; GFX11-SDAG-FAKE16-NEXT: v_sub_f16_e32 v0, v0, v1144; GFX11-SDAG-FAKE16-NEXT: s_setpc_b64 s[30:31]145;146; GFX11-GISEL-TRUE16-LABEL: v_constained_fsub_f16_fpexcept_maytrap:147; GFX11-GISEL-TRUE16: ; %bb.0:148; GFX11-GISEL-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)149; GFX11-GISEL-TRUE16-NEXT: v_sub_f16_e32 v0.l, v0.l, v1.l150; GFX11-GISEL-TRUE16-NEXT: s_setpc_b64 s[30:31]151;152; GFX11-GISEL-FAKE16-LABEL: v_constained_fsub_f16_fpexcept_maytrap:153; GFX11-GISEL-FAKE16: ; %bb.0:154; GFX11-GISEL-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)155; GFX11-GISEL-FAKE16-NEXT: v_sub_f16_e32 v0, v0, v1156; GFX11-GISEL-FAKE16-NEXT: s_setpc_b64 s[30:31]157;158; GFX12-LABEL: v_constained_fsub_f16_fpexcept_maytrap:159; GFX12: ; %bb.0:160; GFX12-NEXT: s_wait_loadcnt_dscnt 0x0161; GFX12-NEXT: s_wait_expcnt 0x0162; GFX12-NEXT: s_wait_samplecnt 0x0163; GFX12-NEXT: s_wait_bvhcnt 0x0164; GFX12-NEXT: s_wait_kmcnt 0x0165; GFX12-NEXT: v_sub_f16_e32 v0, v0, v1166; GFX12-NEXT: s_setpc_b64 s[30:31]167 %val = call half @llvm.experimental.constrained.fsub.f16(half %x, half %y, metadata !"round.tonearest", metadata !"fpexcept.maytrap")168 ret half %val169}170 171define <2 x half> @v_constained_fsub_v2f16_fpexcept_strict(<2 x half> %x, <2 x half> %y) #0 {172; GFX9-SDAG-LABEL: v_constained_fsub_v2f16_fpexcept_strict:173; GFX9-SDAG: ; %bb.0:174; GFX9-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)175; GFX9-SDAG-NEXT: v_sub_f16_sdwa v2, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1176; GFX9-SDAG-NEXT: v_sub_f16_e32 v0, v0, v1177; GFX9-SDAG-NEXT: s_mov_b32 s4, 0x5040100178; GFX9-SDAG-NEXT: v_perm_b32 v0, v2, v0, s4179; GFX9-SDAG-NEXT: s_setpc_b64 s[30:31]180;181; GFX9-GISEL-LABEL: v_constained_fsub_v2f16_fpexcept_strict:182; GFX9-GISEL: ; %bb.0:183; GFX9-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)184; GFX9-GISEL-NEXT: v_pk_add_f16 v0, v0, v1 neg_lo:[0,1] neg_hi:[0,1]185; GFX9-GISEL-NEXT: s_setpc_b64 s[30:31]186;187; GFX8-SDAG-LABEL: v_constained_fsub_v2f16_fpexcept_strict:188; GFX8-SDAG: ; %bb.0:189; GFX8-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)190; GFX8-SDAG-NEXT: v_sub_f16_sdwa v2, v0, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1191; GFX8-SDAG-NEXT: v_sub_f16_e32 v0, v0, v1192; GFX8-SDAG-NEXT: v_or_b32_e32 v0, v0, v2193; GFX8-SDAG-NEXT: s_setpc_b64 s[30:31]194;195; GFX8-GISEL-LABEL: v_constained_fsub_v2f16_fpexcept_strict:196; GFX8-GISEL: ; %bb.0:197; GFX8-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)198; GFX8-GISEL-NEXT: v_xor_b32_e32 v1, 0x80008000, v1199; GFX8-GISEL-NEXT: v_add_f16_e32 v2, v0, v1200; 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_1201; GFX8-GISEL-NEXT: v_or_b32_e32 v0, v2, v0202; GFX8-GISEL-NEXT: s_setpc_b64 s[30:31]203;204; GFX10-SDAG-LABEL: v_constained_fsub_v2f16_fpexcept_strict:205; GFX10-SDAG: ; %bb.0:206; GFX10-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)207; GFX10-SDAG-NEXT: v_sub_f16_sdwa v2, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1208; GFX10-SDAG-NEXT: v_sub_f16_e32 v0, v0, v1209; GFX10-SDAG-NEXT: v_perm_b32 v0, v2, v0, 0x5040100210; GFX10-SDAG-NEXT: s_setpc_b64 s[30:31]211;212; GFX10-GISEL-LABEL: v_constained_fsub_v2f16_fpexcept_strict:213; GFX10-GISEL: ; %bb.0:214; GFX10-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)215; GFX10-GISEL-NEXT: v_pk_add_f16 v0, v0, v1 neg_lo:[0,1] neg_hi:[0,1]216; GFX10-GISEL-NEXT: s_setpc_b64 s[30:31]217;218; GFX11-SDAG-TRUE16-LABEL: v_constained_fsub_v2f16_fpexcept_strict:219; GFX11-SDAG-TRUE16: ; %bb.0:220; GFX11-SDAG-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)221; GFX11-SDAG-TRUE16-NEXT: v_sub_f16_e32 v0.h, v0.h, v1.h222; GFX11-SDAG-TRUE16-NEXT: v_sub_f16_e32 v0.l, v0.l, v1.l223; GFX11-SDAG-TRUE16-NEXT: s_setpc_b64 s[30:31]224;225; GFX11-SDAG-FAKE16-LABEL: v_constained_fsub_v2f16_fpexcept_strict:226; GFX11-SDAG-FAKE16: ; %bb.0:227; GFX11-SDAG-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)228; GFX11-SDAG-FAKE16-NEXT: v_lshrrev_b32_e32 v2, 16, v1229; GFX11-SDAG-FAKE16-NEXT: v_lshrrev_b32_e32 v3, 16, v0230; GFX11-SDAG-FAKE16-NEXT: v_sub_f16_e32 v0, v0, v1231; GFX11-SDAG-FAKE16-NEXT: v_sub_f16_e32 v2, v3, v2232; GFX11-SDAG-FAKE16-NEXT: v_perm_b32 v0, v2, v0, 0x5040100233; GFX11-SDAG-FAKE16-NEXT: s_setpc_b64 s[30:31]234;235; GFX11-GISEL-LABEL: v_constained_fsub_v2f16_fpexcept_strict:236; GFX11-GISEL: ; %bb.0:237; GFX11-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)238; GFX11-GISEL-NEXT: v_pk_add_f16 v0, v0, v1 neg_lo:[0,1] neg_hi:[0,1]239; GFX11-GISEL-NEXT: s_setpc_b64 s[30:31]240;241; GFX12-SDAG-LABEL: v_constained_fsub_v2f16_fpexcept_strict:242; GFX12-SDAG: ; %bb.0:243; GFX12-SDAG-NEXT: s_wait_loadcnt_dscnt 0x0244; GFX12-SDAG-NEXT: s_wait_expcnt 0x0245; GFX12-SDAG-NEXT: s_wait_samplecnt 0x0246; GFX12-SDAG-NEXT: s_wait_bvhcnt 0x0247; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0248; GFX12-SDAG-NEXT: v_lshrrev_b32_e32 v2, 16, v1249; GFX12-SDAG-NEXT: v_lshrrev_b32_e32 v3, 16, v0250; GFX12-SDAG-NEXT: v_sub_f16_e32 v0, v0, v1251; GFX12-SDAG-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)252; GFX12-SDAG-NEXT: v_sub_f16_e32 v2, v3, v2253; GFX12-SDAG-NEXT: v_perm_b32 v0, v2, v0, 0x5040100254; GFX12-SDAG-NEXT: s_setpc_b64 s[30:31]255;256; GFX12-GISEL-LABEL: v_constained_fsub_v2f16_fpexcept_strict:257; GFX12-GISEL: ; %bb.0:258; GFX12-GISEL-NEXT: s_wait_loadcnt_dscnt 0x0259; GFX12-GISEL-NEXT: s_wait_expcnt 0x0260; GFX12-GISEL-NEXT: s_wait_samplecnt 0x0261; GFX12-GISEL-NEXT: s_wait_bvhcnt 0x0262; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0263; GFX12-GISEL-NEXT: v_pk_add_f16 v0, v0, v1 neg_lo:[0,1] neg_hi:[0,1]264; GFX12-GISEL-NEXT: s_setpc_b64 s[30:31]265; GFX10PLUS-SDAG-LABEL: v_constained_fsub_v2f16_fpexcept_strict:266; GFX10PLUS-SDAG: ; %bb.0:267; GFX10PLUS-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)268; GFX10PLUS-SDAG-NEXT: v_lshrrev_b32_e32 v2, 16, v1269; GFX10PLUS-SDAG-NEXT: v_lshrrev_b32_e32 v3, 16, v0270; GFX10PLUS-SDAG-NEXT: v_sub_f16_e32 v0, v0, v1271; GFX10PLUS-SDAG-NEXT: v_sub_f16_e32 v2, v3, v2272; GFX10PLUS-SDAG-NEXT: v_perm_b32 v0, v2, v0, 0x5040100273; GFX10PLUS-SDAG-NEXT: s_setpc_b64 s[30:31]274; GFX10PLUS-GISEL-LABEL: v_constained_fsub_v2f16_fpexcept_strict:275; GFX10PLUS-GISEL: ; %bb.0:276; GFX10PLUS-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)277; GFX10PLUS-GISEL-NEXT: v_pk_add_f16 v0, v0, v1 neg_lo:[0,1] neg_hi:[0,1]278; GFX10PLUS-GISEL-NEXT: s_setpc_b64 s[30:31]279 %val = call <2 x half> @llvm.experimental.constrained.fsub.v2f16(<2 x half> %x, <2 x half> %y, metadata !"round.tonearest", metadata !"fpexcept.strict")280 ret <2 x half> %val281}282 283define <2 x half> @v_constained_fsub_v2f16_fpexcept_ignore(<2 x half> %x, <2 x half> %y) #0 {284; GFX9-SDAG-LABEL: v_constained_fsub_v2f16_fpexcept_ignore:285; GFX9-SDAG: ; %bb.0:286; GFX9-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)287; GFX9-SDAG-NEXT: v_sub_f16_sdwa v2, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1288; GFX9-SDAG-NEXT: v_sub_f16_e32 v0, v0, v1289; GFX9-SDAG-NEXT: s_mov_b32 s4, 0x5040100290; GFX9-SDAG-NEXT: v_perm_b32 v0, v2, v0, s4291; GFX9-SDAG-NEXT: s_setpc_b64 s[30:31]292;293; GFX9-GISEL-LABEL: v_constained_fsub_v2f16_fpexcept_ignore:294; GFX9-GISEL: ; %bb.0:295; GFX9-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)296; GFX9-GISEL-NEXT: v_pk_add_f16 v0, v0, v1 neg_lo:[0,1] neg_hi:[0,1]297; GFX9-GISEL-NEXT: s_setpc_b64 s[30:31]298;299; GFX8-SDAG-LABEL: v_constained_fsub_v2f16_fpexcept_ignore:300; GFX8-SDAG: ; %bb.0:301; GFX8-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)302; GFX8-SDAG-NEXT: v_sub_f16_sdwa v2, v0, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1303; GFX8-SDAG-NEXT: v_sub_f16_e32 v0, v0, v1304; GFX8-SDAG-NEXT: v_or_b32_e32 v0, v0, v2305; GFX8-SDAG-NEXT: s_setpc_b64 s[30:31]306;307; GFX8-GISEL-LABEL: v_constained_fsub_v2f16_fpexcept_ignore:308; GFX8-GISEL: ; %bb.0:309; GFX8-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)310; GFX8-GISEL-NEXT: v_xor_b32_e32 v1, 0x80008000, v1311; GFX8-GISEL-NEXT: v_add_f16_e32 v2, v0, v1312; 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_1313; GFX8-GISEL-NEXT: v_or_b32_e32 v0, v2, v0314; GFX8-GISEL-NEXT: s_setpc_b64 s[30:31]315;316; GFX10-SDAG-LABEL: v_constained_fsub_v2f16_fpexcept_ignore:317; GFX10-SDAG: ; %bb.0:318; GFX10-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)319; GFX10-SDAG-NEXT: v_sub_f16_sdwa v2, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1320; GFX10-SDAG-NEXT: v_sub_f16_e32 v0, v0, v1321; GFX10-SDAG-NEXT: v_perm_b32 v0, v2, v0, 0x5040100322; GFX10-SDAG-NEXT: s_setpc_b64 s[30:31]323;324; GFX10-GISEL-LABEL: v_constained_fsub_v2f16_fpexcept_ignore:325; GFX10-GISEL: ; %bb.0:326; GFX10-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)327; GFX10-GISEL-NEXT: v_pk_add_f16 v0, v0, v1 neg_lo:[0,1] neg_hi:[0,1]328; GFX10-GISEL-NEXT: s_setpc_b64 s[30:31]329;330; GFX11-SDAG-TRUE16-LABEL: v_constained_fsub_v2f16_fpexcept_ignore:331; GFX11-SDAG-TRUE16: ; %bb.0:332; GFX11-SDAG-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)333; GFX11-SDAG-TRUE16-NEXT: v_sub_f16_e32 v0.h, v0.h, v1.h334; GFX11-SDAG-TRUE16-NEXT: v_sub_f16_e32 v0.l, v0.l, v1.l335; GFX11-SDAG-TRUE16-NEXT: s_setpc_b64 s[30:31]336;337; GFX11-SDAG-FAKE16-LABEL: v_constained_fsub_v2f16_fpexcept_ignore:338; GFX11-SDAG-FAKE16: ; %bb.0:339; GFX11-SDAG-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)340; GFX11-SDAG-FAKE16-NEXT: v_lshrrev_b32_e32 v2, 16, v1341; GFX11-SDAG-FAKE16-NEXT: v_lshrrev_b32_e32 v3, 16, v0342; GFX11-SDAG-FAKE16-NEXT: v_sub_f16_e32 v0, v0, v1343; GFX11-SDAG-FAKE16-NEXT: v_sub_f16_e32 v2, v3, v2344; GFX11-SDAG-FAKE16-NEXT: v_perm_b32 v0, v2, v0, 0x5040100345; GFX11-SDAG-FAKE16-NEXT: s_setpc_b64 s[30:31]346;347; GFX11-GISEL-LABEL: v_constained_fsub_v2f16_fpexcept_ignore:348; GFX11-GISEL: ; %bb.0:349; GFX11-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)350; GFX11-GISEL-NEXT: v_pk_add_f16 v0, v0, v1 neg_lo:[0,1] neg_hi:[0,1]351; GFX11-GISEL-NEXT: s_setpc_b64 s[30:31]352;353; GFX12-SDAG-LABEL: v_constained_fsub_v2f16_fpexcept_ignore:354; GFX12-SDAG: ; %bb.0:355; GFX12-SDAG-NEXT: s_wait_loadcnt_dscnt 0x0356; GFX12-SDAG-NEXT: s_wait_expcnt 0x0357; GFX12-SDAG-NEXT: s_wait_samplecnt 0x0358; GFX12-SDAG-NEXT: s_wait_bvhcnt 0x0359; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0360; GFX12-SDAG-NEXT: v_lshrrev_b32_e32 v2, 16, v1361; GFX12-SDAG-NEXT: v_lshrrev_b32_e32 v3, 16, v0362; GFX12-SDAG-NEXT: v_sub_f16_e32 v0, v0, v1363; GFX12-SDAG-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)364; GFX12-SDAG-NEXT: v_sub_f16_e32 v2, v3, v2365; GFX12-SDAG-NEXT: v_perm_b32 v0, v2, v0, 0x5040100366; GFX12-SDAG-NEXT: s_setpc_b64 s[30:31]367;368; GFX12-GISEL-LABEL: v_constained_fsub_v2f16_fpexcept_ignore:369; GFX12-GISEL: ; %bb.0:370; GFX12-GISEL-NEXT: s_wait_loadcnt_dscnt 0x0371; GFX12-GISEL-NEXT: s_wait_expcnt 0x0372; GFX12-GISEL-NEXT: s_wait_samplecnt 0x0373; GFX12-GISEL-NEXT: s_wait_bvhcnt 0x0374; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0375; GFX12-GISEL-NEXT: v_pk_add_f16 v0, v0, v1 neg_lo:[0,1] neg_hi:[0,1]376; GFX12-GISEL-NEXT: s_setpc_b64 s[30:31]377; GFX10PLUS-SDAG-LABEL: v_constained_fsub_v2f16_fpexcept_ignore:378; GFX10PLUS-SDAG: ; %bb.0:379; GFX10PLUS-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)380; GFX10PLUS-SDAG-NEXT: v_lshrrev_b32_e32 v2, 16, v1381; GFX10PLUS-SDAG-NEXT: v_lshrrev_b32_e32 v3, 16, v0382; GFX10PLUS-SDAG-NEXT: v_sub_f16_e32 v0, v0, v1383; GFX10PLUS-SDAG-NEXT: v_sub_f16_e32 v2, v3, v2384; GFX10PLUS-SDAG-NEXT: v_perm_b32 v0, v2, v0, 0x5040100385; GFX10PLUS-SDAG-NEXT: s_setpc_b64 s[30:31]386; GFX10PLUS-GISEL-LABEL: v_constained_fsub_v2f16_fpexcept_ignore:387; GFX10PLUS-GISEL: ; %bb.0:388; GFX10PLUS-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)389; GFX10PLUS-GISEL-NEXT: v_pk_add_f16 v0, v0, v1 neg_lo:[0,1] neg_hi:[0,1]390; GFX10PLUS-GISEL-NEXT: s_setpc_b64 s[30:31]391 %val = call <2 x half> @llvm.experimental.constrained.fsub.v2f16(<2 x half> %x, <2 x half> %y, metadata !"round.tonearest", metadata !"fpexcept.ignore")392 ret <2 x half> %val393}394 395define <2 x half> @v_constained_fsub_v2f16_fpexcept_maytrap(<2 x half> %x, <2 x half> %y) #0 {396; GFX9-SDAG-LABEL: v_constained_fsub_v2f16_fpexcept_maytrap:397; GFX9-SDAG: ; %bb.0:398; GFX9-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)399; GFX9-SDAG-NEXT: v_sub_f16_sdwa v2, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1400; GFX9-SDAG-NEXT: v_sub_f16_e32 v0, v0, v1401; GFX9-SDAG-NEXT: s_mov_b32 s4, 0x5040100402; GFX9-SDAG-NEXT: v_perm_b32 v0, v2, v0, s4403; GFX9-SDAG-NEXT: s_setpc_b64 s[30:31]404;405; GFX9-GISEL-LABEL: v_constained_fsub_v2f16_fpexcept_maytrap:406; GFX9-GISEL: ; %bb.0:407; GFX9-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)408; GFX9-GISEL-NEXT: v_pk_add_f16 v0, v0, v1 neg_lo:[0,1] neg_hi:[0,1]409; GFX9-GISEL-NEXT: s_setpc_b64 s[30:31]410;411; GFX8-SDAG-LABEL: v_constained_fsub_v2f16_fpexcept_maytrap:412; GFX8-SDAG: ; %bb.0:413; GFX8-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)414; GFX8-SDAG-NEXT: v_sub_f16_sdwa v2, v0, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1415; GFX8-SDAG-NEXT: v_sub_f16_e32 v0, v0, v1416; GFX8-SDAG-NEXT: v_or_b32_e32 v0, v0, v2417; GFX8-SDAG-NEXT: s_setpc_b64 s[30:31]418;419; GFX8-GISEL-LABEL: v_constained_fsub_v2f16_fpexcept_maytrap:420; GFX8-GISEL: ; %bb.0:421; GFX8-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)422; GFX8-GISEL-NEXT: v_xor_b32_e32 v1, 0x80008000, v1423; GFX8-GISEL-NEXT: v_add_f16_e32 v2, v0, v1424; 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_1425; GFX8-GISEL-NEXT: v_or_b32_e32 v0, v2, v0426; GFX8-GISEL-NEXT: s_setpc_b64 s[30:31]427;428; GFX10-SDAG-LABEL: v_constained_fsub_v2f16_fpexcept_maytrap:429; GFX10-SDAG: ; %bb.0:430; GFX10-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)431; GFX10-SDAG-NEXT: v_sub_f16_sdwa v2, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1432; GFX10-SDAG-NEXT: v_sub_f16_e32 v0, v0, v1433; GFX10-SDAG-NEXT: v_perm_b32 v0, v2, v0, 0x5040100434; GFX10-SDAG-NEXT: s_setpc_b64 s[30:31]435;436; GFX10-GISEL-LABEL: v_constained_fsub_v2f16_fpexcept_maytrap:437; GFX10-GISEL: ; %bb.0:438; GFX10-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)439; GFX10-GISEL-NEXT: v_pk_add_f16 v0, v0, v1 neg_lo:[0,1] neg_hi:[0,1]440; GFX10-GISEL-NEXT: s_setpc_b64 s[30:31]441;442; GFX11-SDAG-TRUE16-LABEL: v_constained_fsub_v2f16_fpexcept_maytrap:443; GFX11-SDAG-TRUE16: ; %bb.0:444; GFX11-SDAG-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)445; GFX11-SDAG-TRUE16-NEXT: v_sub_f16_e32 v0.h, v0.h, v1.h446; GFX11-SDAG-TRUE16-NEXT: v_sub_f16_e32 v0.l, v0.l, v1.l447; GFX11-SDAG-TRUE16-NEXT: s_setpc_b64 s[30:31]448;449; GFX11-SDAG-FAKE16-LABEL: v_constained_fsub_v2f16_fpexcept_maytrap:450; GFX11-SDAG-FAKE16: ; %bb.0:451; GFX11-SDAG-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)452; GFX11-SDAG-FAKE16-NEXT: v_lshrrev_b32_e32 v2, 16, v1453; GFX11-SDAG-FAKE16-NEXT: v_lshrrev_b32_e32 v3, 16, v0454; GFX11-SDAG-FAKE16-NEXT: v_sub_f16_e32 v0, v0, v1455; GFX11-SDAG-FAKE16-NEXT: v_sub_f16_e32 v2, v3, v2456; GFX11-SDAG-FAKE16-NEXT: v_perm_b32 v0, v2, v0, 0x5040100457; GFX11-SDAG-FAKE16-NEXT: s_setpc_b64 s[30:31]458;459; GFX11-GISEL-LABEL: v_constained_fsub_v2f16_fpexcept_maytrap:460; GFX11-GISEL: ; %bb.0:461; GFX11-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)462; GFX11-GISEL-NEXT: v_pk_add_f16 v0, v0, v1 neg_lo:[0,1] neg_hi:[0,1]463; GFX11-GISEL-NEXT: s_setpc_b64 s[30:31]464;465; GFX12-SDAG-LABEL: v_constained_fsub_v2f16_fpexcept_maytrap:466; GFX12-SDAG: ; %bb.0:467; GFX12-SDAG-NEXT: s_wait_loadcnt_dscnt 0x0468; GFX12-SDAG-NEXT: s_wait_expcnt 0x0469; GFX12-SDAG-NEXT: s_wait_samplecnt 0x0470; GFX12-SDAG-NEXT: s_wait_bvhcnt 0x0471; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0472; GFX12-SDAG-NEXT: v_lshrrev_b32_e32 v2, 16, v1473; GFX12-SDAG-NEXT: v_lshrrev_b32_e32 v3, 16, v0474; GFX12-SDAG-NEXT: v_sub_f16_e32 v0, v0, v1475; GFX12-SDAG-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)476; GFX12-SDAG-NEXT: v_sub_f16_e32 v2, v3, v2477; GFX12-SDAG-NEXT: v_perm_b32 v0, v2, v0, 0x5040100478; GFX12-SDAG-NEXT: s_setpc_b64 s[30:31]479;480; GFX12-GISEL-LABEL: v_constained_fsub_v2f16_fpexcept_maytrap:481; GFX12-GISEL: ; %bb.0:482; GFX12-GISEL-NEXT: s_wait_loadcnt_dscnt 0x0483; GFX12-GISEL-NEXT: s_wait_expcnt 0x0484; GFX12-GISEL-NEXT: s_wait_samplecnt 0x0485; GFX12-GISEL-NEXT: s_wait_bvhcnt 0x0486; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0487; GFX12-GISEL-NEXT: v_pk_add_f16 v0, v0, v1 neg_lo:[0,1] neg_hi:[0,1]488; GFX12-GISEL-NEXT: s_setpc_b64 s[30:31]489; GFX10PLUS-SDAG-LABEL: v_constained_fsub_v2f16_fpexcept_maytrap:490; GFX10PLUS-SDAG: ; %bb.0:491; GFX10PLUS-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)492; GFX10PLUS-SDAG-NEXT: v_lshrrev_b32_e32 v2, 16, v1493; GFX10PLUS-SDAG-NEXT: v_lshrrev_b32_e32 v3, 16, v0494; GFX10PLUS-SDAG-NEXT: v_sub_f16_e32 v0, v0, v1495; GFX10PLUS-SDAG-NEXT: v_sub_f16_e32 v2, v3, v2496; GFX10PLUS-SDAG-NEXT: v_perm_b32 v0, v2, v0, 0x5040100497; GFX10PLUS-SDAG-NEXT: s_setpc_b64 s[30:31]498; GFX10PLUS-GISEL-LABEL: v_constained_fsub_v2f16_fpexcept_maytrap:499; GFX10PLUS-GISEL: ; %bb.0:500; GFX10PLUS-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)501; GFX10PLUS-GISEL-NEXT: v_pk_add_f16 v0, v0, v1 neg_lo:[0,1] neg_hi:[0,1]502; GFX10PLUS-GISEL-NEXT: s_setpc_b64 s[30:31]503 %val = call <2 x half> @llvm.experimental.constrained.fsub.v2f16(<2 x half> %x, <2 x half> %y, metadata !"round.tonearest", metadata !"fpexcept.maytrap")504 ret <2 x half> %val505}506 507define <3 x half> @v_constained_fsub_v3f16_fpexcept_strict(<3 x half> %x, <3 x half> %y) #0 {508; GFX9-SDAG-LABEL: v_constained_fsub_v3f16_fpexcept_strict:509; GFX9-SDAG: ; %bb.0:510; GFX9-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)511; GFX9-SDAG-NEXT: v_sub_f16_sdwa v4, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1512; GFX9-SDAG-NEXT: v_sub_f16_e32 v0, v0, v2513; GFX9-SDAG-NEXT: s_mov_b32 s4, 0x5040100514; GFX9-SDAG-NEXT: v_perm_b32 v0, v4, v0, s4515; GFX9-SDAG-NEXT: v_sub_f16_e32 v1, v1, v3516; GFX9-SDAG-NEXT: s_setpc_b64 s[30:31]517;518; GFX9-GISEL-LABEL: v_constained_fsub_v3f16_fpexcept_strict:519; GFX9-GISEL: ; %bb.0:520; GFX9-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)521; GFX9-GISEL-NEXT: v_sub_f16_e32 v4, v0, v2522; GFX9-GISEL-NEXT: v_sub_f16_sdwa v0, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1523; GFX9-GISEL-NEXT: v_sub_f16_e32 v1, v1, v3524; GFX9-GISEL-NEXT: v_lshl_or_b32 v0, v0, 16, v4525; GFX9-GISEL-NEXT: s_setpc_b64 s[30:31]526;527; GFX8-SDAG-LABEL: v_constained_fsub_v3f16_fpexcept_strict:528; GFX8-SDAG: ; %bb.0:529; GFX8-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)530; GFX8-SDAG-NEXT: v_sub_f16_sdwa v4, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1531; GFX8-SDAG-NEXT: v_sub_f16_e32 v0, v0, v2532; GFX8-SDAG-NEXT: v_or_b32_e32 v0, v0, v4533; GFX8-SDAG-NEXT: v_sub_f16_e32 v1, v1, v3534; GFX8-SDAG-NEXT: s_setpc_b64 s[30:31]535;536; GFX8-GISEL-LABEL: v_constained_fsub_v3f16_fpexcept_strict:537; GFX8-GISEL: ; %bb.0:538; GFX8-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)539; GFX8-GISEL-NEXT: v_sub_f16_e32 v4, v0, v2540; GFX8-GISEL-NEXT: v_sub_f16_sdwa v0, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1541; GFX8-GISEL-NEXT: v_sub_f16_e32 v1, v1, v3542; GFX8-GISEL-NEXT: v_or_b32_e32 v0, v4, v0543; GFX8-GISEL-NEXT: s_setpc_b64 s[30:31]544;545; GFX10-SDAG-LABEL: v_constained_fsub_v3f16_fpexcept_strict:546; GFX10-SDAG: ; %bb.0:547; GFX10-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)548; GFX10-SDAG-NEXT: v_sub_f16_sdwa v4, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1549; GFX10-SDAG-NEXT: v_sub_f16_e32 v0, v0, v2550; GFX10-SDAG-NEXT: v_sub_f16_e32 v1, v1, v3551; GFX10-SDAG-NEXT: v_perm_b32 v0, v4, v0, 0x5040100552; GFX10-SDAG-NEXT: s_setpc_b64 s[30:31]553;554; GFX10-GISEL-LABEL: v_constained_fsub_v3f16_fpexcept_strict:555; GFX10-GISEL: ; %bb.0:556; GFX10-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)557; GFX10-GISEL-NEXT: v_sub_f16_e32 v4, v0, v2558; GFX10-GISEL-NEXT: v_sub_f16_sdwa v0, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1559; GFX10-GISEL-NEXT: v_sub_f16_e32 v1, v1, v3560; GFX10-GISEL-NEXT: v_and_b32_e32 v2, 0xffff, v4561; GFX10-GISEL-NEXT: v_lshl_or_b32 v0, v0, 16, v2562; GFX10-GISEL-NEXT: s_setpc_b64 s[30:31]563;564; GFX11-SDAG-TRUE16-LABEL: v_constained_fsub_v3f16_fpexcept_strict:565; GFX11-SDAG-TRUE16: ; %bb.0:566; GFX11-SDAG-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)567; GFX11-SDAG-TRUE16-NEXT: v_sub_f16_e32 v0.h, v0.h, v2.h568; GFX11-SDAG-TRUE16-NEXT: v_sub_f16_e32 v0.l, v0.l, v2.l569; GFX11-SDAG-TRUE16-NEXT: v_sub_f16_e32 v1.l, v1.l, v3.l570; GFX11-SDAG-TRUE16-NEXT: s_setpc_b64 s[30:31]571;572; GFX11-SDAG-FAKE16-LABEL: v_constained_fsub_v3f16_fpexcept_strict:573; GFX11-SDAG-FAKE16: ; %bb.0:574; GFX11-SDAG-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)575; GFX11-SDAG-FAKE16-NEXT: v_lshrrev_b32_e32 v4, 16, v2576; GFX11-SDAG-FAKE16-NEXT: v_lshrrev_b32_e32 v5, 16, v0577; GFX11-SDAG-FAKE16-NEXT: v_sub_f16_e32 v0, v0, v2578; GFX11-SDAG-FAKE16-NEXT: v_sub_f16_e32 v1, v1, v3579; GFX11-SDAG-FAKE16-NEXT: v_sub_f16_e32 v2, v5, v4580; GFX11-SDAG-FAKE16-NEXT: v_perm_b32 v0, v2, v0, 0x5040100581; GFX11-SDAG-FAKE16-NEXT: s_setpc_b64 s[30:31]582;583; GFX11-GISEL-TRUE16-LABEL: v_constained_fsub_v3f16_fpexcept_strict:584; GFX11-GISEL-TRUE16: ; %bb.0:585; GFX11-GISEL-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)586; GFX11-GISEL-TRUE16-NEXT: v_sub_f16_e32 v0.l, v0.l, v2.l587; GFX11-GISEL-TRUE16-NEXT: v_sub_f16_e32 v0.h, v0.h, v2.h588; GFX11-GISEL-TRUE16-NEXT: v_sub_f16_e32 v1.l, v1.l, v3.l589; GFX11-GISEL-TRUE16-NEXT: s_setpc_b64 s[30:31]590;591; GFX11-GISEL-FAKE16-LABEL: v_constained_fsub_v3f16_fpexcept_strict:592; GFX11-GISEL-FAKE16: ; %bb.0:593; GFX11-GISEL-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)594; GFX11-GISEL-FAKE16-NEXT: v_lshrrev_b32_e32 v4, 16, v0595; GFX11-GISEL-FAKE16-NEXT: v_lshrrev_b32_e32 v5, 16, v2596; GFX11-GISEL-FAKE16-NEXT: v_sub_f16_e32 v0, v0, v2597; GFX11-GISEL-FAKE16-NEXT: v_sub_f16_e32 v1, v1, v3598; GFX11-GISEL-FAKE16-NEXT: v_sub_f16_e32 v2, v4, v5599; GFX11-GISEL-FAKE16-NEXT: v_and_b32_e32 v0, 0xffff, v0600; GFX11-GISEL-FAKE16-NEXT: v_lshl_or_b32 v0, v2, 16, v0601; GFX11-GISEL-FAKE16-NEXT: s_setpc_b64 s[30:31]602;603; GFX12-SDAG-LABEL: v_constained_fsub_v3f16_fpexcept_strict:604; GFX12-SDAG: ; %bb.0:605; GFX12-SDAG-NEXT: s_wait_loadcnt_dscnt 0x0606; GFX12-SDAG-NEXT: s_wait_expcnt 0x0607; GFX12-SDAG-NEXT: s_wait_samplecnt 0x0608; GFX12-SDAG-NEXT: s_wait_bvhcnt 0x0609; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0610; GFX12-SDAG-NEXT: v_lshrrev_b32_e32 v4, 16, v2611; GFX12-SDAG-NEXT: v_lshrrev_b32_e32 v5, 16, v0612; GFX12-SDAG-NEXT: v_sub_f16_e32 v0, v0, v2613; GFX12-SDAG-NEXT: v_sub_f16_e32 v1, v1, v3614; GFX12-SDAG-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_1)615; GFX12-SDAG-NEXT: v_sub_f16_e32 v2, v5, v4616; GFX12-SDAG-NEXT: v_perm_b32 v0, v2, v0, 0x5040100617; GFX12-SDAG-NEXT: s_setpc_b64 s[30:31]618;619; GFX12-GISEL-LABEL: v_constained_fsub_v3f16_fpexcept_strict:620; GFX12-GISEL: ; %bb.0:621; GFX12-GISEL-NEXT: s_wait_loadcnt_dscnt 0x0622; GFX12-GISEL-NEXT: s_wait_expcnt 0x0623; GFX12-GISEL-NEXT: s_wait_samplecnt 0x0624; GFX12-GISEL-NEXT: s_wait_bvhcnt 0x0625; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0626; GFX12-GISEL-NEXT: v_lshrrev_b32_e32 v4, 16, v0627; GFX12-GISEL-NEXT: v_lshrrev_b32_e32 v5, 16, v2628; GFX12-GISEL-NEXT: v_sub_f16_e32 v0, v0, v2629; GFX12-GISEL-NEXT: v_sub_f16_e32 v1, v1, v3630; GFX12-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_3)631; GFX12-GISEL-NEXT: v_sub_f16_e32 v2, v4, v5632; GFX12-GISEL-NEXT: v_and_b32_e32 v0, 0xffff, v0633; GFX12-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_1)634; GFX12-GISEL-NEXT: v_lshl_or_b32 v0, v2, 16, v0635; GFX12-GISEL-NEXT: s_setpc_b64 s[30:31]636; GFX10PLUS-SDAG-LABEL: v_constained_fsub_v3f16_fpexcept_strict:637; GFX10PLUS-SDAG: ; %bb.0:638; GFX10PLUS-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)639; GFX10PLUS-SDAG-NEXT: v_lshrrev_b32_e32 v4, 16, v2640; GFX10PLUS-SDAG-NEXT: v_lshrrev_b32_e32 v5, 16, v0641; GFX10PLUS-SDAG-NEXT: v_sub_f16_e32 v0, v0, v2642; GFX10PLUS-SDAG-NEXT: v_sub_f16_e32 v1, v1, v3643; GFX10PLUS-SDAG-NEXT: v_sub_f16_e32 v2, v5, v4644; GFX10PLUS-SDAG-NEXT: v_perm_b32 v0, v2, v0, 0x5040100645; GFX10PLUS-SDAG-NEXT: s_setpc_b64 s[30:31]646; GFX10PLUS-GISEL-LABEL: v_constained_fsub_v3f16_fpexcept_strict:647; GFX10PLUS-GISEL: ; %bb.0:648; GFX10PLUS-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)649; GFX10PLUS-GISEL-NEXT: v_lshrrev_b32_e32 v4, 16, v0650; GFX10PLUS-GISEL-NEXT: v_lshrrev_b32_e32 v5, 16, v2651; GFX10PLUS-GISEL-NEXT: v_sub_f16_e32 v0, v0, v2652; GFX10PLUS-GISEL-NEXT: v_sub_f16_e32 v1, v1, v3653; GFX10PLUS-GISEL-NEXT: v_sub_f16_e32 v2, v4, v5654; GFX10PLUS-GISEL-NEXT: v_and_b32_e32 v0, 0xffff, v0655; GFX10PLUS-GISEL-NEXT: v_lshl_or_b32 v0, v2, 16, v0656; GFX10PLUS-GISEL-NEXT: s_setpc_b64 s[30:31]657 %val = call <3 x half> @llvm.experimental.constrained.fsub.v3f16(<3 x half> %x, <3 x half> %y, metadata !"round.tonearest", metadata !"fpexcept.strict")658 ret <3 x half> %val659}660 661; FIXME: Scalarized662define <4 x half> @v_constained_fsub_v4f16_fpexcept_strict(<4 x half> %x, <4 x half> %y) #0 {663; GFX9-SDAG-LABEL: v_constained_fsub_v4f16_fpexcept_strict:664; GFX9-SDAG: ; %bb.0:665; GFX9-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)666; GFX9-SDAG-NEXT: v_sub_f16_sdwa v4, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1667; GFX9-SDAG-NEXT: v_sub_f16_sdwa v5, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1668; GFX9-SDAG-NEXT: v_sub_f16_e32 v1, v1, v3669; GFX9-SDAG-NEXT: v_sub_f16_e32 v0, v0, v2670; GFX9-SDAG-NEXT: s_mov_b32 s4, 0x5040100671; GFX9-SDAG-NEXT: v_perm_b32 v0, v5, v0, s4672; GFX9-SDAG-NEXT: v_perm_b32 v1, v4, v1, s4673; GFX9-SDAG-NEXT: s_setpc_b64 s[30:31]674;675; GFX9-GISEL-LABEL: v_constained_fsub_v4f16_fpexcept_strict:676; GFX9-GISEL: ; %bb.0:677; GFX9-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)678; GFX9-GISEL-NEXT: v_sub_f16_e32 v4, v0, v2679; GFX9-GISEL-NEXT: v_sub_f16_sdwa v0, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1680; GFX9-GISEL-NEXT: v_sub_f16_e32 v2, v1, v3681; GFX9-GISEL-NEXT: v_sub_f16_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1682; GFX9-GISEL-NEXT: v_lshl_or_b32 v0, v0, 16, v4683; GFX9-GISEL-NEXT: v_lshl_or_b32 v1, v1, 16, v2684; GFX9-GISEL-NEXT: s_setpc_b64 s[30:31]685;686; GFX8-SDAG-LABEL: v_constained_fsub_v4f16_fpexcept_strict:687; GFX8-SDAG: ; %bb.0:688; GFX8-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)689; GFX8-SDAG-NEXT: v_sub_f16_sdwa v4, v1, v3 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1690; GFX8-SDAG-NEXT: v_sub_f16_sdwa v5, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1691; GFX8-SDAG-NEXT: v_sub_f16_e32 v1, v1, v3692; GFX8-SDAG-NEXT: v_sub_f16_e32 v0, v0, v2693; GFX8-SDAG-NEXT: v_or_b32_e32 v0, v0, v5694; GFX8-SDAG-NEXT: v_or_b32_e32 v1, v1, v4695; GFX8-SDAG-NEXT: s_setpc_b64 s[30:31]696;697; GFX8-GISEL-LABEL: v_constained_fsub_v4f16_fpexcept_strict:698; GFX8-GISEL: ; %bb.0:699; GFX8-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)700; GFX8-GISEL-NEXT: v_sub_f16_e32 v4, v0, v2701; GFX8-GISEL-NEXT: v_sub_f16_sdwa v0, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1702; GFX8-GISEL-NEXT: v_sub_f16_e32 v2, v1, v3703; GFX8-GISEL-NEXT: v_sub_f16_sdwa v1, v1, v3 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1704; GFX8-GISEL-NEXT: v_or_b32_e32 v0, v4, v0705; GFX8-GISEL-NEXT: v_or_b32_e32 v1, v2, v1706; GFX8-GISEL-NEXT: s_setpc_b64 s[30:31]707;708; GFX10-SDAG-LABEL: v_constained_fsub_v4f16_fpexcept_strict:709; GFX10-SDAG: ; %bb.0:710; GFX10-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)711; GFX10-SDAG-NEXT: v_sub_f16_sdwa v4, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1712; GFX10-SDAG-NEXT: v_sub_f16_sdwa v5, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1713; GFX10-SDAG-NEXT: v_sub_f16_e32 v0, v0, v2714; GFX10-SDAG-NEXT: v_sub_f16_e32 v1, v1, v3715; GFX10-SDAG-NEXT: v_perm_b32 v0, v5, v0, 0x5040100716; GFX10-SDAG-NEXT: v_perm_b32 v1, v4, v1, 0x5040100717; GFX10-SDAG-NEXT: s_setpc_b64 s[30:31]718;719; GFX10-GISEL-LABEL: v_constained_fsub_v4f16_fpexcept_strict:720; GFX10-GISEL: ; %bb.0:721; GFX10-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)722; GFX10-GISEL-NEXT: v_sub_f16_e32 v4, v0, v2723; GFX10-GISEL-NEXT: v_sub_f16_e32 v5, v1, v3724; GFX10-GISEL-NEXT: v_sub_f16_sdwa v0, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1725; GFX10-GISEL-NEXT: v_sub_f16_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1726; GFX10-GISEL-NEXT: v_and_b32_e32 v2, 0xffff, v4727; GFX10-GISEL-NEXT: v_and_b32_e32 v3, 0xffff, v5728; GFX10-GISEL-NEXT: v_lshl_or_b32 v0, v0, 16, v2729; GFX10-GISEL-NEXT: v_lshl_or_b32 v1, v1, 16, v3730; GFX10-GISEL-NEXT: s_setpc_b64 s[30:31]731;732; GFX11-SDAG-TRUE16-LABEL: v_constained_fsub_v4f16_fpexcept_strict:733; GFX11-SDAG-TRUE16: ; %bb.0:734; GFX11-SDAG-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)735; GFX11-SDAG-TRUE16-NEXT: v_sub_f16_e32 v1.h, v1.h, v3.h736; GFX11-SDAG-TRUE16-NEXT: v_sub_f16_e32 v0.h, v0.h, v2.h737; GFX11-SDAG-TRUE16-NEXT: v_sub_f16_e32 v0.l, v0.l, v2.l738; GFX11-SDAG-TRUE16-NEXT: v_sub_f16_e32 v1.l, v1.l, v3.l739; GFX11-SDAG-TRUE16-NEXT: s_setpc_b64 s[30:31]740;741; GFX11-SDAG-FAKE16-LABEL: v_constained_fsub_v4f16_fpexcept_strict:742; GFX11-SDAG-FAKE16: ; %bb.0:743; GFX11-SDAG-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)744; GFX11-SDAG-FAKE16-NEXT: v_lshrrev_b32_e32 v4, 16, v3745; GFX11-SDAG-FAKE16-NEXT: v_lshrrev_b32_e32 v5, 16, v2746; GFX11-SDAG-FAKE16-NEXT: v_lshrrev_b32_e32 v6, 16, v0747; GFX11-SDAG-FAKE16-NEXT: v_lshrrev_b32_e32 v7, 16, v1748; GFX11-SDAG-FAKE16-NEXT: v_sub_f16_e32 v1, v1, v3749; GFX11-SDAG-FAKE16-NEXT: v_sub_f16_e32 v0, v0, v2750; GFX11-SDAG-FAKE16-NEXT: v_sub_f16_e32 v2, v6, v5751; GFX11-SDAG-FAKE16-NEXT: v_sub_f16_e32 v3, v7, v4752; GFX11-SDAG-FAKE16-NEXT: v_perm_b32 v0, v2, v0, 0x5040100753; GFX11-SDAG-FAKE16-NEXT: v_perm_b32 v1, v3, v1, 0x5040100754; GFX11-SDAG-FAKE16-NEXT: s_setpc_b64 s[30:31]755;756; GFX11-GISEL-TRUE16-LABEL: v_constained_fsub_v4f16_fpexcept_strict:757; GFX11-GISEL-TRUE16: ; %bb.0:758; GFX11-GISEL-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)759; GFX11-GISEL-TRUE16-NEXT: v_sub_f16_e32 v0.l, v0.l, v2.l760; GFX11-GISEL-TRUE16-NEXT: v_sub_f16_e32 v0.h, v0.h, v2.h761; GFX11-GISEL-TRUE16-NEXT: v_sub_f16_e32 v1.l, v1.l, v3.l762; GFX11-GISEL-TRUE16-NEXT: v_sub_f16_e32 v1.h, v1.h, v3.h763; GFX11-GISEL-TRUE16-NEXT: s_setpc_b64 s[30:31]764;765; GFX11-GISEL-FAKE16-LABEL: v_constained_fsub_v4f16_fpexcept_strict:766; GFX11-GISEL-FAKE16: ; %bb.0:767; GFX11-GISEL-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)768; GFX11-GISEL-FAKE16-NEXT: v_lshrrev_b32_e32 v4, 16, v0769; GFX11-GISEL-FAKE16-NEXT: v_lshrrev_b32_e32 v5, 16, v1770; GFX11-GISEL-FAKE16-NEXT: v_lshrrev_b32_e32 v6, 16, v2771; GFX11-GISEL-FAKE16-NEXT: v_lshrrev_b32_e32 v7, 16, v3772; GFX11-GISEL-FAKE16-NEXT: v_sub_f16_e32 v0, v0, v2773; GFX11-GISEL-FAKE16-NEXT: v_sub_f16_e32 v1, v1, v3774; GFX11-GISEL-FAKE16-NEXT: v_sub_f16_e32 v2, v4, v6775; GFX11-GISEL-FAKE16-NEXT: v_sub_f16_e32 v3, v5, v7776; GFX11-GISEL-FAKE16-NEXT: v_and_b32_e32 v0, 0xffff, v0777; GFX11-GISEL-FAKE16-NEXT: v_and_b32_e32 v1, 0xffff, v1778; GFX11-GISEL-FAKE16-NEXT: v_lshl_or_b32 v0, v2, 16, v0779; GFX11-GISEL-FAKE16-NEXT: v_lshl_or_b32 v1, v3, 16, v1780; GFX11-GISEL-FAKE16-NEXT: s_setpc_b64 s[30:31]781;782; GFX12-SDAG-LABEL: v_constained_fsub_v4f16_fpexcept_strict:783; GFX12-SDAG: ; %bb.0:784; GFX12-SDAG-NEXT: s_wait_loadcnt_dscnt 0x0785; GFX12-SDAG-NEXT: s_wait_expcnt 0x0786; GFX12-SDAG-NEXT: s_wait_samplecnt 0x0787; GFX12-SDAG-NEXT: s_wait_bvhcnt 0x0788; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0789; GFX12-SDAG-NEXT: v_lshrrev_b32_e32 v4, 16, v3790; GFX12-SDAG-NEXT: v_lshrrev_b32_e32 v5, 16, v2791; GFX12-SDAG-NEXT: v_lshrrev_b32_e32 v6, 16, v0792; GFX12-SDAG-NEXT: v_lshrrev_b32_e32 v7, 16, v1793; GFX12-SDAG-NEXT: v_sub_f16_e32 v1, v1, v3794; GFX12-SDAG-NEXT: v_sub_f16_e32 v0, v0, v2795; GFX12-SDAG-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)796; GFX12-SDAG-NEXT: v_sub_f16_e32 v2, v6, v5797; GFX12-SDAG-NEXT: v_sub_f16_e32 v3, v7, v4798; GFX12-SDAG-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)799; GFX12-SDAG-NEXT: v_perm_b32 v0, v2, v0, 0x5040100800; GFX12-SDAG-NEXT: v_perm_b32 v1, v3, v1, 0x5040100801; GFX12-SDAG-NEXT: s_setpc_b64 s[30:31]802;803; GFX12-GISEL-LABEL: v_constained_fsub_v4f16_fpexcept_strict:804; GFX12-GISEL: ; %bb.0:805; GFX12-GISEL-NEXT: s_wait_loadcnt_dscnt 0x0806; GFX12-GISEL-NEXT: s_wait_expcnt 0x0807; GFX12-GISEL-NEXT: s_wait_samplecnt 0x0808; GFX12-GISEL-NEXT: s_wait_bvhcnt 0x0809; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0810; GFX12-GISEL-NEXT: v_lshrrev_b32_e32 v4, 16, v0811; GFX12-GISEL-NEXT: v_lshrrev_b32_e32 v5, 16, v1812; GFX12-GISEL-NEXT: v_lshrrev_b32_e32 v6, 16, v2813; GFX12-GISEL-NEXT: v_lshrrev_b32_e32 v7, 16, v3814; GFX12-GISEL-NEXT: v_sub_f16_e32 v0, v0, v2815; GFX12-GISEL-NEXT: v_sub_f16_e32 v1, v1, v3816; GFX12-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)817; GFX12-GISEL-NEXT: v_sub_f16_e32 v2, v4, v6818; GFX12-GISEL-NEXT: v_sub_f16_e32 v3, v5, v7819; GFX12-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)820; GFX12-GISEL-NEXT: v_and_b32_e32 v0, 0xffff, v0821; GFX12-GISEL-NEXT: v_and_b32_e32 v1, 0xffff, v1822; GFX12-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)823; GFX12-GISEL-NEXT: v_lshl_or_b32 v0, v2, 16, v0824; GFX12-GISEL-NEXT: v_lshl_or_b32 v1, v3, 16, v1825; GFX12-GISEL-NEXT: s_setpc_b64 s[30:31]826; GFX10PLUS-SDAG-LABEL: v_constained_fsub_v4f16_fpexcept_strict:827; GFX10PLUS-SDAG: ; %bb.0:828; GFX10PLUS-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)829; GFX10PLUS-SDAG-NEXT: v_lshrrev_b32_e32 v4, 16, v3830; GFX10PLUS-SDAG-NEXT: v_lshrrev_b32_e32 v5, 16, v2831; GFX10PLUS-SDAG-NEXT: v_lshrrev_b32_e32 v6, 16, v0832; GFX10PLUS-SDAG-NEXT: v_lshrrev_b32_e32 v7, 16, v1833; GFX10PLUS-SDAG-NEXT: v_sub_f16_e32 v1, v1, v3834; GFX10PLUS-SDAG-NEXT: v_sub_f16_e32 v0, v0, v2835; GFX10PLUS-SDAG-NEXT: v_sub_f16_e32 v2, v6, v5836; GFX10PLUS-SDAG-NEXT: v_sub_f16_e32 v3, v7, v4837; GFX10PLUS-SDAG-NEXT: v_perm_b32 v0, v2, v0, 0x5040100838; GFX10PLUS-SDAG-NEXT: v_perm_b32 v1, v3, v1, 0x5040100839; GFX10PLUS-SDAG-NEXT: s_setpc_b64 s[30:31]840; GFX10PLUS-GISEL-LABEL: v_constained_fsub_v4f16_fpexcept_strict:841; GFX10PLUS-GISEL: ; %bb.0:842; GFX10PLUS-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)843; GFX10PLUS-GISEL-NEXT: v_lshrrev_b32_e32 v4, 16, v0844; GFX10PLUS-GISEL-NEXT: v_lshrrev_b32_e32 v5, 16, v1845; GFX10PLUS-GISEL-NEXT: v_lshrrev_b32_e32 v6, 16, v2846; GFX10PLUS-GISEL-NEXT: v_lshrrev_b32_e32 v7, 16, v3847; GFX10PLUS-GISEL-NEXT: v_sub_f16_e32 v0, v0, v2848; GFX10PLUS-GISEL-NEXT: v_sub_f16_e32 v1, v1, v3849; GFX10PLUS-GISEL-NEXT: v_sub_f16_e32 v2, v4, v6850; GFX10PLUS-GISEL-NEXT: v_sub_f16_e32 v3, v5, v7851; GFX10PLUS-GISEL-NEXT: v_and_b32_e32 v0, 0xffff, v0852; GFX10PLUS-GISEL-NEXT: v_and_b32_e32 v1, 0xffff, v1853; GFX10PLUS-GISEL-NEXT: v_lshl_or_b32 v0, v2, 16, v0854; GFX10PLUS-GISEL-NEXT: v_lshl_or_b32 v1, v3, 16, v1855; GFX10PLUS-GISEL-NEXT: s_setpc_b64 s[30:31]856 %val = call <4 x half> @llvm.experimental.constrained.fsub.v4f16(<4 x half> %x, <4 x half> %y, metadata !"round.tonearest", metadata !"fpexcept.strict")857 ret <4 x half> %val858}859 860define amdgpu_ps half @s_constained_fsub_f16_fpexcept_strict(half inreg %x, half inreg %y) #0 {861; GCN-LABEL: s_constained_fsub_f16_fpexcept_strict:862; GCN: ; %bb.0:863; GCN-NEXT: v_mov_b32_e32 v0, s3864; GCN-NEXT: v_sub_f16_e32 v0, s2, v0865; GCN-NEXT: ; return to shader part epilog866;867; GFX10-LABEL: s_constained_fsub_f16_fpexcept_strict:868; GFX10: ; %bb.0:869; GFX10-NEXT: v_sub_f16_e64 v0, s2, s3870; GFX10-NEXT: ; return to shader part epilog871;872; GFX11-SDAG-TRUE16-LABEL: s_constained_fsub_f16_fpexcept_strict:873; GFX11-SDAG-TRUE16: ; %bb.0:874; GFX11-SDAG-TRUE16-NEXT: v_sub_f16_e64 v0.l, s2, s3875; GFX11-SDAG-TRUE16-NEXT: ; return to shader part epilog876;877; GFX11-SDAG-FAKE16-LABEL: s_constained_fsub_f16_fpexcept_strict:878; GFX11-SDAG-FAKE16: ; %bb.0:879; GFX11-SDAG-FAKE16-NEXT: v_sub_f16_e64 v0, s2, s3880; GFX11-SDAG-FAKE16-NEXT: ; return to shader part epilog881;882; GFX11-GISEL-TRUE16-LABEL: s_constained_fsub_f16_fpexcept_strict:883; GFX11-GISEL-TRUE16: ; %bb.0:884; GFX11-GISEL-TRUE16-NEXT: v_sub_f16_e64 v0.l, s2, s3885; GFX11-GISEL-TRUE16-NEXT: ; return to shader part epilog886;887; GFX11-GISEL-FAKE16-LABEL: s_constained_fsub_f16_fpexcept_strict:888; GFX11-GISEL-FAKE16: ; %bb.0:889; GFX11-GISEL-FAKE16-NEXT: v_sub_f16_e64 v0, s2, s3890; GFX11-GISEL-FAKE16-NEXT: ; return to shader part epilog891;892; GFX12-LABEL: s_constained_fsub_f16_fpexcept_strict:893; GFX12: ; %bb.0:894; GFX12-NEXT: s_sub_f16 s0, s2, s3895; GFX12-NEXT: s_delay_alu instid0(SALU_CYCLE_3)896; GFX12-NEXT: v_mov_b32_e32 v0, s0897; GFX12-NEXT: ; return to shader part epilog898 %val = call half @llvm.experimental.constrained.fsub.f16(half %x, half %y, metadata !"round.tonearest", metadata !"fpexcept.strict")899 ret half %val900}901 902define amdgpu_ps <2 x half> @s_constained_fsub_v2f16_fpexcept_strict(<2 x half> inreg %x, <2 x half> inreg %y) #0 {903; GFX9-SDAG-LABEL: s_constained_fsub_v2f16_fpexcept_strict:904; GFX9-SDAG: ; %bb.0:905; GFX9-SDAG-NEXT: s_lshr_b32 s0, s3, 16906; GFX9-SDAG-NEXT: s_lshr_b32 s1, s2, 16907; GFX9-SDAG-NEXT: v_mov_b32_e32 v0, s0908; GFX9-SDAG-NEXT: v_mov_b32_e32 v1, s3909; GFX9-SDAG-NEXT: v_sub_f16_e32 v0, s1, v0910; GFX9-SDAG-NEXT: v_sub_f16_e32 v1, s2, v1911; GFX9-SDAG-NEXT: v_lshl_or_b32 v0, v0, 16, v1912; GFX9-SDAG-NEXT: ; return to shader part epilog913;914; GFX9-GISEL-LABEL: s_constained_fsub_v2f16_fpexcept_strict:915; GFX9-GISEL: ; %bb.0:916; GFX9-GISEL-NEXT: v_mov_b32_e32 v0, s3917; GFX9-GISEL-NEXT: v_pk_add_f16 v0, s2, v0 neg_lo:[0,1] neg_hi:[0,1]918; GFX9-GISEL-NEXT: ; return to shader part epilog919;920; GFX8-SDAG-LABEL: s_constained_fsub_v2f16_fpexcept_strict:921; GFX8-SDAG: ; %bb.0:922; GFX8-SDAG-NEXT: s_lshr_b32 s0, s3, 16923; GFX8-SDAG-NEXT: s_lshr_b32 s1, s2, 16924; GFX8-SDAG-NEXT: v_mov_b32_e32 v0, s0925; GFX8-SDAG-NEXT: v_mov_b32_e32 v1, s1926; GFX8-SDAG-NEXT: v_sub_f16_sdwa v0, v1, v0 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD927; GFX8-SDAG-NEXT: v_mov_b32_e32 v1, s3928; GFX8-SDAG-NEXT: v_sub_f16_e32 v1, s2, v1929; GFX8-SDAG-NEXT: v_or_b32_e32 v0, v1, v0930; GFX8-SDAG-NEXT: ; return to shader part epilog931;932; GFX8-GISEL-LABEL: s_constained_fsub_v2f16_fpexcept_strict:933; GFX8-GISEL: ; %bb.0:934; GFX8-GISEL-NEXT: s_xor_b32 s0, s3, 0x80008000935; GFX8-GISEL-NEXT: s_lshr_b32 s1, s2, 16936; GFX8-GISEL-NEXT: s_lshr_b32 s3, s0, 16937; GFX8-GISEL-NEXT: v_mov_b32_e32 v0, s0938; GFX8-GISEL-NEXT: v_mov_b32_e32 v1, s3939; GFX8-GISEL-NEXT: v_mov_b32_e32 v2, s1940; GFX8-GISEL-NEXT: v_add_f16_e32 v0, s2, v0941; GFX8-GISEL-NEXT: v_add_f16_sdwa v1, v2, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD942; GFX8-GISEL-NEXT: v_or_b32_e32 v0, v0, v1943; GFX8-GISEL-NEXT: ; return to shader part epilog944;945; GFX10-SDAG-LABEL: s_constained_fsub_v2f16_fpexcept_strict:946; GFX10-SDAG: ; %bb.0:947; GFX10-SDAG-NEXT: v_sub_f16_e64 v0, s2, s3948; GFX10-SDAG-NEXT: s_lshr_b32 s0, s3, 16949; GFX10-SDAG-NEXT: s_lshr_b32 s1, s2, 16950; GFX10-SDAG-NEXT: v_sub_f16_e64 v1, s1, s0951; GFX10-SDAG-NEXT: v_and_b32_e32 v0, 0xffff, v0952; GFX10-SDAG-NEXT: v_lshl_or_b32 v0, v1, 16, v0953; GFX10-SDAG-NEXT: ; return to shader part epilog954;955; GFX10-GISEL-LABEL: s_constained_fsub_v2f16_fpexcept_strict:956; GFX10-GISEL: ; %bb.0:957; GFX10-GISEL-NEXT: v_pk_add_f16 v0, s2, s3 neg_lo:[0,1] neg_hi:[0,1]958; GFX10-GISEL-NEXT: ; return to shader part epilog959;960; GFX11-SDAG-TRUE16-LABEL: s_constained_fsub_v2f16_fpexcept_strict:961; GFX11-SDAG-TRUE16: ; %bb.0:962; GFX11-SDAG-TRUE16-NEXT: s_lshr_b32 s0, s3, 16963; GFX11-SDAG-TRUE16-NEXT: s_lshr_b32 s1, s2, 16964; GFX11-SDAG-TRUE16-NEXT: v_sub_f16_e64 v0.l, s2, s3965; GFX11-SDAG-TRUE16-NEXT: v_sub_f16_e64 v0.h, s1, s0966; GFX11-SDAG-TRUE16-NEXT: ; return to shader part epilog967;968; GFX11-SDAG-FAKE16-LABEL: s_constained_fsub_v2f16_fpexcept_strict:969; GFX11-SDAG-FAKE16: ; %bb.0:970; GFX11-SDAG-FAKE16-NEXT: v_sub_f16_e64 v0, s2, s3971; GFX11-SDAG-FAKE16-NEXT: s_lshr_b32 s0, s3, 16972; GFX11-SDAG-FAKE16-NEXT: s_lshr_b32 s1, s2, 16973; GFX11-SDAG-FAKE16-NEXT: v_sub_f16_e64 v1, s1, s0974; GFX11-SDAG-FAKE16-NEXT: v_and_b32_e32 v0, 0xffff, v0975; GFX11-SDAG-FAKE16-NEXT: v_lshl_or_b32 v0, v1, 16, v0976; GFX11-SDAG-FAKE16-NEXT: ; return to shader part epilog977;978; GFX11-GISEL-LABEL: s_constained_fsub_v2f16_fpexcept_strict:979; GFX11-GISEL: ; %bb.0:980; GFX11-GISEL-NEXT: v_pk_add_f16 v0, s2, s3 neg_lo:[0,1] neg_hi:[0,1]981; GFX11-GISEL-NEXT: ; return to shader part epilog982;983; GFX12-SDAG-LABEL: s_constained_fsub_v2f16_fpexcept_strict:984; GFX12-SDAG: ; %bb.0:985; GFX12-SDAG-NEXT: s_lshr_b32 s0, s3, 16986; GFX12-SDAG-NEXT: s_lshr_b32 s1, s2, 16987; GFX12-SDAG-NEXT: s_delay_alu instid0(SALU_CYCLE_1) | instskip(SKIP_1) | instid1(SALU_CYCLE_3)988; GFX12-SDAG-NEXT: s_sub_f16 s0, s1, s0989; GFX12-SDAG-NEXT: s_sub_f16 s1, s2, s3990; GFX12-SDAG-NEXT: s_pack_ll_b32_b16 s0, s1, s0991; GFX12-SDAG-NEXT: s_delay_alu instid0(SALU_CYCLE_1)992; GFX12-SDAG-NEXT: v_mov_b32_e32 v0, s0993; GFX12-SDAG-NEXT: ; return to shader part epilog994;995; GFX12-GISEL-LABEL: s_constained_fsub_v2f16_fpexcept_strict:996; GFX12-GISEL: ; %bb.0:997; GFX12-GISEL-NEXT: v_pk_add_f16 v0, s2, s3 neg_lo:[0,1] neg_hi:[0,1]998; GFX12-GISEL-NEXT: ; return to shader part epilog999; GFX10PLUS-SDAG-LABEL: s_constained_fsub_v2f16_fpexcept_strict:1000; GFX10PLUS-SDAG: ; %bb.0:1001; GFX10PLUS-SDAG-NEXT: v_sub_f16_e64 v0, s2, s31002; GFX10PLUS-SDAG-NEXT: s_lshr_b32 s0, s3, 161003; GFX10PLUS-SDAG-NEXT: s_lshr_b32 s1, s2, 161004; GFX10PLUS-SDAG-NEXT: v_sub_f16_e64 v1, s1, s01005; GFX10PLUS-SDAG-NEXT: v_and_b32_e32 v0, 0xffff, v01006; GFX10PLUS-SDAG-NEXT: v_lshl_or_b32 v0, v1, 16, v01007; GFX10PLUS-SDAG-NEXT: ; return to shader part epilog1008; GFX10PLUS-GISEL-LABEL: s_constained_fsub_v2f16_fpexcept_strict:1009; GFX10PLUS-GISEL: ; %bb.0:1010; GFX10PLUS-GISEL-NEXT: v_pk_add_f16 v0, s2, s3 neg_lo:[0,1] neg_hi:[0,1]1011; GFX10PLUS-GISEL-NEXT: ; return to shader part epilog1012 %val = call <2 x half> @llvm.experimental.constrained.fsub.v2f16(<2 x half> %x, <2 x half> %y, metadata !"round.tonearest", metadata !"fpexcept.strict")1013 ret <2 x half> %val1014}1015 1016declare half @llvm.experimental.constrained.fsub.f16(half, half, metadata, metadata) #11017declare <2 x half> @llvm.experimental.constrained.fsub.v2f16(<2 x half>, <2 x half>, metadata, metadata) #11018declare <3 x half> @llvm.experimental.constrained.fsub.v3f16(<3 x half>, <3 x half>, metadata, metadata) #11019declare <4 x half> @llvm.experimental.constrained.fsub.v4f16(<4 x half>, <4 x half>, metadata, metadata) #11020 1021attributes #0 = { strictfp }1022attributes #1 = { inaccessiblememonly nounwind willreturn }1023;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:1024; GFX11: {{.*}}1025; GFX8: {{.*}}1026; GFX9: {{.*}}1027