664 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=GFX10PLUS,GFX10,GFX10-SDAG %s9; RUN: llc -global-isel=1 -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1010 < %s | FileCheck -check-prefixes=GFX10PLUS,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=GFX10PLUS,GFX11,GFX11-SDAG,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=GFX10PLUS,GFX11,GFX11-SDAG,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=GFX10PLUS,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=GFX10PLUS,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_fmul_f16_fpexcept_strict(half %x, half %y) #0 {22; GCN-LABEL: v_constained_fmul_f16_fpexcept_strict:23; GCN: ; %bb.0:24; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)25; GCN-NEXT: v_mul_f16_e32 v0, v0, v126; GCN-NEXT: s_setpc_b64 s[30:31]27;28; GFX10-LABEL: v_constained_fmul_f16_fpexcept_strict:29; GFX10: ; %bb.0:30; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)31; GFX10-NEXT: v_mul_f16_e32 v0, v0, v132; GFX10-NEXT: s_setpc_b64 s[30:31]33;34; GFX11-SDAG-TRUE16-LABEL: v_constained_fmul_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_mul_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_fmul_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_mul_f16_e32 v0, v0, v144; GFX11-SDAG-FAKE16-NEXT: s_setpc_b64 s[30:31]45;46; GFX11-GISEL-TRUE16-LABEL: v_constained_fmul_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_mul_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_fmul_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_mul_f16_e32 v0, v0, v156; GFX11-GISEL-FAKE16-NEXT: s_setpc_b64 s[30:31]57;58; GFX12-LABEL: v_constained_fmul_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_mul_f16_e32 v0, v0, v166; GFX12-NEXT: s_setpc_b64 s[30:31]67; GFX1-GISEL-TRUE16-LABEL: v_constained_fmul_f16_fpexcept_strict:68; GFX1-GISEL-TRUE16: ; %bb.0:69; GFX1-GISEL-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)70; GFX1-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v1.l71; GFX1-GISEL-TRUE16-NEXT: s_setpc_b64 s[30:31]72; GFX1-GISEL-FAKE16-LABEL: v_constained_fmul_f16_fpexcept_strict:73; GFX1-GISEL-FAKE16: ; %bb.0:74; GFX1-GISEL-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)75; GFX1-GISEL-FAKE16-NEXT: v_mul_f16_e32 v0, v0, v176; GFX1-GISEL-FAKE16-NEXT: s_setpc_b64 s[30:31]77 %val = call half @llvm.experimental.constrained.fmul.f16(half %x, half %y, metadata !"round.tonearest", metadata !"fpexcept.strict")78 ret half %val79}80 81define half @v_constained_fmul_f16_fpexcept_ignore(half %x, half %y) #0 {82; GCN-LABEL: v_constained_fmul_f16_fpexcept_ignore:83; GCN: ; %bb.0:84; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)85; GCN-NEXT: v_mul_f16_e32 v0, v0, v186; GCN-NEXT: s_setpc_b64 s[30:31]87;88; GFX10-LABEL: v_constained_fmul_f16_fpexcept_ignore:89; GFX10: ; %bb.0:90; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)91; GFX10-NEXT: v_mul_f16_e32 v0, v0, v192; GFX10-NEXT: s_setpc_b64 s[30:31]93;94; GFX11-SDAG-TRUE16-LABEL: v_constained_fmul_f16_fpexcept_ignore:95; GFX11-SDAG-TRUE16: ; %bb.0:96; GFX11-SDAG-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)97; GFX11-SDAG-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v1.l98; GFX11-SDAG-TRUE16-NEXT: s_setpc_b64 s[30:31]99;100; GFX11-SDAG-FAKE16-LABEL: v_constained_fmul_f16_fpexcept_ignore:101; GFX11-SDAG-FAKE16: ; %bb.0:102; GFX11-SDAG-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)103; GFX11-SDAG-FAKE16-NEXT: v_mul_f16_e32 v0, v0, v1104; GFX11-SDAG-FAKE16-NEXT: s_setpc_b64 s[30:31]105;106; GFX11-GISEL-TRUE16-LABEL: v_constained_fmul_f16_fpexcept_ignore:107; GFX11-GISEL-TRUE16: ; %bb.0:108; GFX11-GISEL-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)109; GFX11-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v1.l110; GFX11-GISEL-TRUE16-NEXT: s_setpc_b64 s[30:31]111;112; GFX11-GISEL-FAKE16-LABEL: v_constained_fmul_f16_fpexcept_ignore:113; GFX11-GISEL-FAKE16: ; %bb.0:114; GFX11-GISEL-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)115; GFX11-GISEL-FAKE16-NEXT: v_mul_f16_e32 v0, v0, v1116; GFX11-GISEL-FAKE16-NEXT: s_setpc_b64 s[30:31]117;118; GFX12-LABEL: v_constained_fmul_f16_fpexcept_ignore:119; GFX12: ; %bb.0:120; GFX12-NEXT: s_wait_loadcnt_dscnt 0x0121; GFX12-NEXT: s_wait_expcnt 0x0122; GFX12-NEXT: s_wait_samplecnt 0x0123; GFX12-NEXT: s_wait_bvhcnt 0x0124; GFX12-NEXT: s_wait_kmcnt 0x0125; GFX12-NEXT: v_mul_f16_e32 v0, v0, v1126; GFX12-NEXT: s_setpc_b64 s[30:31]127; GFX1-GISEL-TRUE16-LABEL: v_constained_fmul_f16_fpexcept_ignore:128; GFX1-GISEL-TRUE16: ; %bb.0:129; GFX1-GISEL-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)130; GFX1-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v1.l131; GFX1-GISEL-TRUE16-NEXT: s_setpc_b64 s[30:31]132; GFX1-GISEL-FAKE16-LABEL: v_constained_fmul_f16_fpexcept_ignore:133; GFX1-GISEL-FAKE16: ; %bb.0:134; GFX1-GISEL-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)135; GFX1-GISEL-FAKE16-NEXT: v_mul_f16_e32 v0, v0, v1136; GFX1-GISEL-FAKE16-NEXT: s_setpc_b64 s[30:31]137 %val = call half @llvm.experimental.constrained.fmul.f16(half %x, half %y, metadata !"round.tonearest", metadata !"fpexcept.ignore")138 ret half %val139}140 141define half @v_constained_fmul_f16_fpexcept_maytrap(half %x, half %y) #0 {142; GCN-LABEL: v_constained_fmul_f16_fpexcept_maytrap:143; GCN: ; %bb.0:144; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)145; GCN-NEXT: v_mul_f16_e32 v0, v0, v1146; GCN-NEXT: s_setpc_b64 s[30:31]147;148; GFX10-LABEL: v_constained_fmul_f16_fpexcept_maytrap:149; GFX10: ; %bb.0:150; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)151; GFX10-NEXT: v_mul_f16_e32 v0, v0, v1152; GFX10-NEXT: s_setpc_b64 s[30:31]153;154; GFX11-SDAG-TRUE16-LABEL: v_constained_fmul_f16_fpexcept_maytrap:155; GFX11-SDAG-TRUE16: ; %bb.0:156; GFX11-SDAG-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)157; GFX11-SDAG-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v1.l158; GFX11-SDAG-TRUE16-NEXT: s_setpc_b64 s[30:31]159;160; GFX11-SDAG-FAKE16-LABEL: v_constained_fmul_f16_fpexcept_maytrap:161; GFX11-SDAG-FAKE16: ; %bb.0:162; GFX11-SDAG-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)163; GFX11-SDAG-FAKE16-NEXT: v_mul_f16_e32 v0, v0, v1164; GFX11-SDAG-FAKE16-NEXT: s_setpc_b64 s[30:31]165;166; GFX11-GISEL-TRUE16-LABEL: v_constained_fmul_f16_fpexcept_maytrap:167; GFX11-GISEL-TRUE16: ; %bb.0:168; GFX11-GISEL-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)169; GFX11-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v1.l170; GFX11-GISEL-TRUE16-NEXT: s_setpc_b64 s[30:31]171;172; GFX11-GISEL-FAKE16-LABEL: v_constained_fmul_f16_fpexcept_maytrap:173; GFX11-GISEL-FAKE16: ; %bb.0:174; GFX11-GISEL-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)175; GFX11-GISEL-FAKE16-NEXT: v_mul_f16_e32 v0, v0, v1176; GFX11-GISEL-FAKE16-NEXT: s_setpc_b64 s[30:31]177;178; GFX12-LABEL: v_constained_fmul_f16_fpexcept_maytrap:179; GFX12: ; %bb.0:180; GFX12-NEXT: s_wait_loadcnt_dscnt 0x0181; GFX12-NEXT: s_wait_expcnt 0x0182; GFX12-NEXT: s_wait_samplecnt 0x0183; GFX12-NEXT: s_wait_bvhcnt 0x0184; GFX12-NEXT: s_wait_kmcnt 0x0185; GFX12-NEXT: v_mul_f16_e32 v0, v0, v1186; GFX12-NEXT: s_setpc_b64 s[30:31]187; GFX1-GISEL-TRUE16-LABEL: v_constained_fmul_f16_fpexcept_maytrap:188; GFX1-GISEL-TRUE16: ; %bb.0:189; GFX1-GISEL-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)190; GFX1-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v1.l191; GFX1-GISEL-TRUE16-NEXT: s_setpc_b64 s[30:31]192; GFX1-GISEL-FAKE16-LABEL: v_constained_fmul_f16_fpexcept_maytrap:193; GFX1-GISEL-FAKE16: ; %bb.0:194; GFX1-GISEL-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)195; GFX1-GISEL-FAKE16-NEXT: v_mul_f16_e32 v0, v0, v1196; GFX1-GISEL-FAKE16-NEXT: s_setpc_b64 s[30:31]197 %val = call half @llvm.experimental.constrained.fmul.f16(half %x, half %y, metadata !"round.tonearest", metadata !"fpexcept.maytrap")198 ret half %val199}200 201define <2 x half> @v_constained_fmul_v2f16_fpexcept_strict(<2 x half> %x, <2 x half> %y) #0 {202; GFX9-LABEL: v_constained_fmul_v2f16_fpexcept_strict:203; GFX9: ; %bb.0:204; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)205; GFX9-NEXT: v_pk_mul_f16 v0, v0, v1206; GFX9-NEXT: s_setpc_b64 s[30:31]207;208; GFX8-SDAG-LABEL: v_constained_fmul_v2f16_fpexcept_strict:209; GFX8-SDAG: ; %bb.0:210; GFX8-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)211; GFX8-SDAG-NEXT: v_mul_f16_sdwa v2, v0, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1212; GFX8-SDAG-NEXT: v_mul_f16_e32 v0, v0, v1213; GFX8-SDAG-NEXT: v_or_b32_e32 v0, v0, v2214; GFX8-SDAG-NEXT: s_setpc_b64 s[30:31]215;216; GFX8-GISEL-LABEL: v_constained_fmul_v2f16_fpexcept_strict:217; GFX8-GISEL: ; %bb.0:218; GFX8-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)219; GFX8-GISEL-NEXT: v_mul_f16_e32 v2, v0, v1220; GFX8-GISEL-NEXT: v_mul_f16_sdwa v0, v0, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1221; GFX8-GISEL-NEXT: v_or_b32_e32 v0, v2, v0222; GFX8-GISEL-NEXT: s_setpc_b64 s[30:31]223;224; GFX10PLUS-LABEL: v_constained_fmul_v2f16_fpexcept_strict:225; GFX10PLUS: ; %bb.0:226; GFX10PLUS-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)227; GFX10PLUS-NEXT: v_pk_mul_f16 v0, v0, v1228; GFX10PLUS-NEXT: s_setpc_b64 s[30:31]229;230; GFX12-LABEL: v_constained_fmul_v2f16_fpexcept_strict:231; GFX12: ; %bb.0:232; GFX12-NEXT: s_wait_loadcnt_dscnt 0x0233; GFX12-NEXT: s_wait_expcnt 0x0234; GFX12-NEXT: s_wait_samplecnt 0x0235; GFX12-NEXT: s_wait_bvhcnt 0x0236; GFX12-NEXT: s_wait_kmcnt 0x0237; GFX12-NEXT: v_pk_mul_f16 v0, v0, v1238; GFX12-NEXT: s_setpc_b64 s[30:31]239 %val = call <2 x half> @llvm.experimental.constrained.fmul.v2f16(<2 x half> %x, <2 x half> %y, metadata !"round.tonearest", metadata !"fpexcept.strict")240 ret <2 x half> %val241}242 243define <2 x half> @v_constained_fmul_v2f16_fpexcept_ignore(<2 x half> %x, <2 x half> %y) #0 {244; GFX9-LABEL: v_constained_fmul_v2f16_fpexcept_ignore:245; GFX9: ; %bb.0:246; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)247; GFX9-NEXT: v_pk_mul_f16 v0, v0, v1248; GFX9-NEXT: s_setpc_b64 s[30:31]249;250; GFX8-SDAG-LABEL: v_constained_fmul_v2f16_fpexcept_ignore:251; GFX8-SDAG: ; %bb.0:252; GFX8-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)253; GFX8-SDAG-NEXT: v_mul_f16_sdwa v2, v0, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1254; GFX8-SDAG-NEXT: v_mul_f16_e32 v0, v0, v1255; GFX8-SDAG-NEXT: v_or_b32_e32 v0, v0, v2256; GFX8-SDAG-NEXT: s_setpc_b64 s[30:31]257;258; GFX8-GISEL-LABEL: v_constained_fmul_v2f16_fpexcept_ignore:259; GFX8-GISEL: ; %bb.0:260; GFX8-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)261; GFX8-GISEL-NEXT: v_mul_f16_e32 v2, v0, v1262; GFX8-GISEL-NEXT: v_mul_f16_sdwa v0, v0, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1263; GFX8-GISEL-NEXT: v_or_b32_e32 v0, v2, v0264; GFX8-GISEL-NEXT: s_setpc_b64 s[30:31]265;266; GFX10PLUS-LABEL: v_constained_fmul_v2f16_fpexcept_ignore:267; GFX10PLUS: ; %bb.0:268; GFX10PLUS-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)269; GFX10PLUS-NEXT: v_pk_mul_f16 v0, v0, v1270; GFX10PLUS-NEXT: s_setpc_b64 s[30:31]271;272; GFX12-LABEL: v_constained_fmul_v2f16_fpexcept_ignore:273; GFX12: ; %bb.0:274; GFX12-NEXT: s_wait_loadcnt_dscnt 0x0275; GFX12-NEXT: s_wait_expcnt 0x0276; GFX12-NEXT: s_wait_samplecnt 0x0277; GFX12-NEXT: s_wait_bvhcnt 0x0278; GFX12-NEXT: s_wait_kmcnt 0x0279; GFX12-NEXT: v_pk_mul_f16 v0, v0, v1280; GFX12-NEXT: s_setpc_b64 s[30:31]281 %val = call <2 x half> @llvm.experimental.constrained.fmul.v2f16(<2 x half> %x, <2 x half> %y, metadata !"round.tonearest", metadata !"fpexcept.ignore")282 ret <2 x half> %val283}284 285define <2 x half> @v_constained_fmul_v2f16_fpexcept_maytrap(<2 x half> %x, <2 x half> %y) #0 {286; GFX9-LABEL: v_constained_fmul_v2f16_fpexcept_maytrap:287; GFX9: ; %bb.0:288; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)289; GFX9-NEXT: v_pk_mul_f16 v0, v0, v1290; GFX9-NEXT: s_setpc_b64 s[30:31]291;292; GFX8-SDAG-LABEL: v_constained_fmul_v2f16_fpexcept_maytrap:293; GFX8-SDAG: ; %bb.0:294; GFX8-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)295; GFX8-SDAG-NEXT: v_mul_f16_sdwa v2, v0, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1296; GFX8-SDAG-NEXT: v_mul_f16_e32 v0, v0, v1297; GFX8-SDAG-NEXT: v_or_b32_e32 v0, v0, v2298; GFX8-SDAG-NEXT: s_setpc_b64 s[30:31]299;300; GFX8-GISEL-LABEL: v_constained_fmul_v2f16_fpexcept_maytrap:301; GFX8-GISEL: ; %bb.0:302; GFX8-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)303; GFX8-GISEL-NEXT: v_mul_f16_e32 v2, v0, v1304; GFX8-GISEL-NEXT: v_mul_f16_sdwa v0, v0, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1305; GFX8-GISEL-NEXT: v_or_b32_e32 v0, v2, v0306; GFX8-GISEL-NEXT: s_setpc_b64 s[30:31]307;308; GFX10PLUS-LABEL: v_constained_fmul_v2f16_fpexcept_maytrap:309; GFX10PLUS: ; %bb.0:310; GFX10PLUS-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)311; GFX10PLUS-NEXT: v_pk_mul_f16 v0, v0, v1312; GFX10PLUS-NEXT: s_setpc_b64 s[30:31]313;314; GFX12-LABEL: v_constained_fmul_v2f16_fpexcept_maytrap:315; GFX12: ; %bb.0:316; GFX12-NEXT: s_wait_loadcnt_dscnt 0x0317; GFX12-NEXT: s_wait_expcnt 0x0318; GFX12-NEXT: s_wait_samplecnt 0x0319; GFX12-NEXT: s_wait_bvhcnt 0x0320; GFX12-NEXT: s_wait_kmcnt 0x0321; GFX12-NEXT: v_pk_mul_f16 v0, v0, v1322; GFX12-NEXT: s_setpc_b64 s[30:31]323 %val = call <2 x half> @llvm.experimental.constrained.fmul.v2f16(<2 x half> %x, <2 x half> %y, metadata !"round.tonearest", metadata !"fpexcept.maytrap")324 ret <2 x half> %val325}326 327define <3 x half> @v_constained_fmul_v3f16_fpexcept_strict(<3 x half> %x, <3 x half> %y) #0 {328; GFX9-SDAG-LABEL: v_constained_fmul_v3f16_fpexcept_strict:329; GFX9-SDAG: ; %bb.0:330; GFX9-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)331; GFX9-SDAG-NEXT: v_pk_mul_f16 v0, v0, v2332; GFX9-SDAG-NEXT: v_mul_f16_e32 v1, v1, v3333; GFX9-SDAG-NEXT: s_setpc_b64 s[30:31]334;335; GFX9-GISEL-LABEL: v_constained_fmul_v3f16_fpexcept_strict:336; GFX9-GISEL: ; %bb.0:337; GFX9-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)338; GFX9-GISEL-NEXT: v_pk_mul_f16 v0, v0, v2339; GFX9-GISEL-NEXT: v_pk_mul_f16 v1, v1, v3340; GFX9-GISEL-NEXT: s_setpc_b64 s[30:31]341;342; GFX8-SDAG-LABEL: v_constained_fmul_v3f16_fpexcept_strict:343; GFX8-SDAG: ; %bb.0:344; GFX8-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)345; GFX8-SDAG-NEXT: v_mul_f16_sdwa v4, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1346; GFX8-SDAG-NEXT: v_mul_f16_e32 v0, v0, v2347; GFX8-SDAG-NEXT: v_or_b32_e32 v0, v0, v4348; GFX8-SDAG-NEXT: v_mul_f16_e32 v1, v1, v3349; GFX8-SDAG-NEXT: s_setpc_b64 s[30:31]350;351; GFX8-GISEL-LABEL: v_constained_fmul_v3f16_fpexcept_strict:352; GFX8-GISEL: ; %bb.0:353; GFX8-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)354; GFX8-GISEL-NEXT: v_mul_f16_e32 v4, v0, v2355; GFX8-GISEL-NEXT: v_mul_f16_sdwa v0, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1356; GFX8-GISEL-NEXT: v_mul_f16_e32 v1, v1, v3357; GFX8-GISEL-NEXT: v_or_b32_e32 v0, v4, v0358; GFX8-GISEL-NEXT: s_setpc_b64 s[30:31]359;360; GFX10-SDAG-LABEL: v_constained_fmul_v3f16_fpexcept_strict:361; GFX10-SDAG: ; %bb.0:362; GFX10-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)363; GFX10-SDAG-NEXT: v_pk_mul_f16 v0, v0, v2364; GFX10-SDAG-NEXT: v_mul_f16_e32 v1, v1, v3365; GFX10-SDAG-NEXT: s_setpc_b64 s[30:31]366;367; GFX10-GISEL-LABEL: v_constained_fmul_v3f16_fpexcept_strict:368; GFX10-GISEL: ; %bb.0:369; GFX10-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)370; GFX10-GISEL-NEXT: v_pk_mul_f16 v0, v0, v2371; GFX10-GISEL-NEXT: v_pk_mul_f16 v1, v1, v3372; GFX10-GISEL-NEXT: s_setpc_b64 s[30:31]373;374; GFX11-SDAG-TRUE16-LABEL: v_constained_fmul_v3f16_fpexcept_strict:375; GFX11-SDAG-TRUE16: ; %bb.0:376; GFX11-SDAG-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)377; GFX11-SDAG-TRUE16-NEXT: v_pk_mul_f16 v0, v0, v2378; GFX11-SDAG-TRUE16-NEXT: v_mul_f16_e32 v1.l, v1.l, v3.l379; GFX11-SDAG-TRUE16-NEXT: s_setpc_b64 s[30:31]380;381; GFX11-SDAG-FAKE16-LABEL: v_constained_fmul_v3f16_fpexcept_strict:382; GFX11-SDAG-FAKE16: ; %bb.0:383; GFX11-SDAG-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)384; GFX11-SDAG-FAKE16-NEXT: v_pk_mul_f16 v0, v0, v2385; GFX11-SDAG-FAKE16-NEXT: v_mul_f16_e32 v1, v1, v3386; GFX11-SDAG-FAKE16-NEXT: s_setpc_b64 s[30:31]387;388; GFX11-GISEL-LABEL: v_constained_fmul_v3f16_fpexcept_strict:389; GFX11-GISEL: ; %bb.0:390; GFX11-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)391; GFX11-GISEL-NEXT: v_pk_mul_f16 v0, v0, v2392; GFX11-GISEL-NEXT: v_pk_mul_f16 v1, v1, v3393; GFX11-GISEL-NEXT: s_setpc_b64 s[30:31]394;395; GFX12-SDAG-LABEL: v_constained_fmul_v3f16_fpexcept_strict:396; GFX12-SDAG: ; %bb.0:397; GFX12-SDAG-NEXT: s_wait_loadcnt_dscnt 0x0398; GFX12-SDAG-NEXT: s_wait_expcnt 0x0399; GFX12-SDAG-NEXT: s_wait_samplecnt 0x0400; GFX12-SDAG-NEXT: s_wait_bvhcnt 0x0401; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0402; GFX12-SDAG-NEXT: v_pk_mul_f16 v0, v0, v2403; GFX12-SDAG-NEXT: v_mul_f16_e32 v1, v1, v3404; GFX12-SDAG-NEXT: s_setpc_b64 s[30:31]405;406; GFX12-GISEL-LABEL: v_constained_fmul_v3f16_fpexcept_strict:407; GFX12-GISEL: ; %bb.0:408; GFX12-GISEL-NEXT: s_wait_loadcnt_dscnt 0x0409; GFX12-GISEL-NEXT: s_wait_expcnt 0x0410; GFX12-GISEL-NEXT: s_wait_samplecnt 0x0411; GFX12-GISEL-NEXT: s_wait_bvhcnt 0x0412; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0413; GFX12-GISEL-NEXT: v_pk_mul_f16 v0, v0, v2414; GFX12-GISEL-NEXT: v_pk_mul_f16 v1, v1, v3415; GFX12-GISEL-NEXT: s_setpc_b64 s[30:31]416; GFX1-GISEL-LABEL: v_constained_fmul_v3f16_fpexcept_strict:417; GFX1-GISEL: ; %bb.0:418; GFX1-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)419; GFX1-GISEL-NEXT: v_pk_mul_f16 v0, v0, v2420; GFX1-GISEL-NEXT: v_pk_mul_f16 v1, v1, v3421; GFX1-GISEL-NEXT: s_setpc_b64 s[30:31]422 %val = call <3 x half> @llvm.experimental.constrained.fmul.v3f16(<3 x half> %x, <3 x half> %y, metadata !"round.tonearest", metadata !"fpexcept.strict")423 ret <3 x half> %val424}425 426; FIXME: Scalarized427define <4 x half> @v_constained_fmul_v4f16_fpexcept_strict(<4 x half> %x, <4 x half> %y) #0 {428; GFX9-SDAG-LABEL: v_constained_fmul_v4f16_fpexcept_strict:429; GFX9-SDAG: ; %bb.0:430; GFX9-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)431; GFX9-SDAG-NEXT: v_mul_f16_sdwa v4, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1432; GFX9-SDAG-NEXT: v_mul_f16_sdwa v5, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1433; GFX9-SDAG-NEXT: v_mul_f16_e32 v1, v1, v3434; GFX9-SDAG-NEXT: v_mul_f16_e32 v0, v0, v2435; GFX9-SDAG-NEXT: s_mov_b32 s4, 0x5040100436; GFX9-SDAG-NEXT: v_perm_b32 v0, v5, v0, s4437; GFX9-SDAG-NEXT: v_perm_b32 v1, v4, v1, s4438; GFX9-SDAG-NEXT: s_setpc_b64 s[30:31]439;440; GFX9-GISEL-LABEL: v_constained_fmul_v4f16_fpexcept_strict:441; GFX9-GISEL: ; %bb.0:442; GFX9-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)443; GFX9-GISEL-NEXT: v_pk_mul_f16 v0, v0, v2444; GFX9-GISEL-NEXT: v_pk_mul_f16 v1, v1, v3445; GFX9-GISEL-NEXT: s_setpc_b64 s[30:31]446;447; GFX8-SDAG-LABEL: v_constained_fmul_v4f16_fpexcept_strict:448; GFX8-SDAG: ; %bb.0:449; GFX8-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)450; GFX8-SDAG-NEXT: v_mul_f16_sdwa v4, v1, v3 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1451; GFX8-SDAG-NEXT: v_mul_f16_sdwa v5, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1452; GFX8-SDAG-NEXT: v_mul_f16_e32 v1, v1, v3453; GFX8-SDAG-NEXT: v_mul_f16_e32 v0, v0, v2454; GFX8-SDAG-NEXT: v_or_b32_e32 v0, v0, v5455; GFX8-SDAG-NEXT: v_or_b32_e32 v1, v1, v4456; GFX8-SDAG-NEXT: s_setpc_b64 s[30:31]457;458; GFX8-GISEL-LABEL: v_constained_fmul_v4f16_fpexcept_strict:459; GFX8-GISEL: ; %bb.0:460; GFX8-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)461; GFX8-GISEL-NEXT: v_mul_f16_e32 v4, v0, v2462; GFX8-GISEL-NEXT: v_mul_f16_sdwa v0, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1463; GFX8-GISEL-NEXT: v_mul_f16_e32 v2, v1, v3464; GFX8-GISEL-NEXT: v_mul_f16_sdwa v1, v1, v3 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1465; GFX8-GISEL-NEXT: v_or_b32_e32 v0, v4, v0466; GFX8-GISEL-NEXT: v_or_b32_e32 v1, v2, v1467; GFX8-GISEL-NEXT: s_setpc_b64 s[30:31]468;469; GFX10-SDAG-LABEL: v_constained_fmul_v4f16_fpexcept_strict:470; GFX10-SDAG: ; %bb.0:471; GFX10-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)472; GFX10-SDAG-NEXT: v_mul_f16_sdwa v4, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1473; GFX10-SDAG-NEXT: v_mul_f16_sdwa v5, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1474; GFX10-SDAG-NEXT: v_mul_f16_e32 v0, v0, v2475; GFX10-SDAG-NEXT: v_mul_f16_e32 v1, v1, v3476; GFX10-SDAG-NEXT: v_perm_b32 v0, v5, v0, 0x5040100477; GFX10-SDAG-NEXT: v_perm_b32 v1, v4, v1, 0x5040100478; GFX10-SDAG-NEXT: s_setpc_b64 s[30:31]479;480; GFX10-GISEL-LABEL: v_constained_fmul_v4f16_fpexcept_strict:481; GFX10-GISEL: ; %bb.0:482; GFX10-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)483; GFX10-GISEL-NEXT: v_pk_mul_f16 v0, v0, v2484; GFX10-GISEL-NEXT: v_pk_mul_f16 v1, v1, v3485; GFX10-GISEL-NEXT: s_setpc_b64 s[30:31]486;487; GFX11-SDAG-TRUE16-LABEL: v_constained_fmul_v4f16_fpexcept_strict:488; GFX11-SDAG-TRUE16: ; %bb.0:489; GFX11-SDAG-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)490; GFX11-SDAG-TRUE16-NEXT: v_mul_f16_e32 v1.h, v1.h, v3.h491; GFX11-SDAG-TRUE16-NEXT: v_mul_f16_e32 v0.h, v0.h, v2.h492; GFX11-SDAG-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v2.l493; GFX11-SDAG-TRUE16-NEXT: v_mul_f16_e32 v1.l, v1.l, v3.l494; GFX11-SDAG-TRUE16-NEXT: s_setpc_b64 s[30:31]495;496; GFX11-SDAG-FAKE16-LABEL: v_constained_fmul_v4f16_fpexcept_strict:497; GFX11-SDAG-FAKE16: ; %bb.0:498; GFX11-SDAG-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)499; GFX11-SDAG-FAKE16-NEXT: v_lshrrev_b32_e32 v4, 16, v3500; GFX11-SDAG-FAKE16-NEXT: v_lshrrev_b32_e32 v5, 16, v2501; GFX11-SDAG-FAKE16-NEXT: v_lshrrev_b32_e32 v6, 16, v0502; GFX11-SDAG-FAKE16-NEXT: v_lshrrev_b32_e32 v7, 16, v1503; GFX11-SDAG-FAKE16-NEXT: v_mul_f16_e32 v1, v1, v3504; GFX11-SDAG-FAKE16-NEXT: v_mul_f16_e32 v0, v0, v2505; GFX11-SDAG-FAKE16-NEXT: v_mul_f16_e32 v2, v6, v5506; GFX11-SDAG-FAKE16-NEXT: v_mul_f16_e32 v3, v7, v4507; GFX11-SDAG-FAKE16-NEXT: v_perm_b32 v0, v2, v0, 0x5040100508; GFX11-SDAG-FAKE16-NEXT: v_perm_b32 v1, v3, v1, 0x5040100509; GFX11-SDAG-FAKE16-NEXT: s_setpc_b64 s[30:31]510;511; GFX11-GISEL-LABEL: v_constained_fmul_v4f16_fpexcept_strict:512; GFX11-GISEL: ; %bb.0:513; GFX11-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)514; GFX11-GISEL-NEXT: v_pk_mul_f16 v0, v0, v2515; GFX11-GISEL-NEXT: v_pk_mul_f16 v1, v1, v3516; GFX11-GISEL-NEXT: s_setpc_b64 s[30:31]517;518; GFX12-SDAG-LABEL: v_constained_fmul_v4f16_fpexcept_strict:519; GFX12-SDAG: ; %bb.0:520; GFX12-SDAG-NEXT: s_wait_loadcnt_dscnt 0x0521; GFX12-SDAG-NEXT: s_wait_expcnt 0x0522; GFX12-SDAG-NEXT: s_wait_samplecnt 0x0523; GFX12-SDAG-NEXT: s_wait_bvhcnt 0x0524; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0525; GFX12-SDAG-NEXT: v_lshrrev_b32_e32 v4, 16, v3526; GFX12-SDAG-NEXT: v_lshrrev_b32_e32 v5, 16, v2527; GFX12-SDAG-NEXT: v_lshrrev_b32_e32 v6, 16, v0528; GFX12-SDAG-NEXT: v_lshrrev_b32_e32 v7, 16, v1529; GFX12-SDAG-NEXT: v_mul_f16_e32 v1, v1, v3530; GFX12-SDAG-NEXT: v_mul_f16_e32 v0, v0, v2531; GFX12-SDAG-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)532; GFX12-SDAG-NEXT: v_mul_f16_e32 v2, v6, v5533; GFX12-SDAG-NEXT: v_mul_f16_e32 v3, v7, v4534; GFX12-SDAG-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)535; GFX12-SDAG-NEXT: v_perm_b32 v0, v2, v0, 0x5040100536; GFX12-SDAG-NEXT: v_perm_b32 v1, v3, v1, 0x5040100537; GFX12-SDAG-NEXT: s_setpc_b64 s[30:31]538;539; GFX12-GISEL-LABEL: v_constained_fmul_v4f16_fpexcept_strict:540; GFX12-GISEL: ; %bb.0:541; GFX12-GISEL-NEXT: s_wait_loadcnt_dscnt 0x0542; GFX12-GISEL-NEXT: s_wait_expcnt 0x0543; GFX12-GISEL-NEXT: s_wait_samplecnt 0x0544; GFX12-GISEL-NEXT: s_wait_bvhcnt 0x0545; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0546; GFX12-GISEL-NEXT: v_pk_mul_f16 v0, v0, v2547; GFX12-GISEL-NEXT: v_pk_mul_f16 v1, v1, v3548; GFX12-GISEL-NEXT: s_setpc_b64 s[30:31]549; GFX1-GISEL-LABEL: v_constained_fmul_v4f16_fpexcept_strict:550; GFX1-GISEL: ; %bb.0:551; GFX1-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)552; GFX1-GISEL-NEXT: v_pk_mul_f16 v0, v0, v2553; GFX1-GISEL-NEXT: v_pk_mul_f16 v1, v1, v3554; GFX1-GISEL-NEXT: s_setpc_b64 s[30:31]555 %val = call <4 x half> @llvm.experimental.constrained.fmul.v4f16(<4 x half> %x, <4 x half> %y, metadata !"round.tonearest", metadata !"fpexcept.strict")556 ret <4 x half> %val557}558 559define amdgpu_ps half @s_constained_fmul_f16_fpexcept_strict(half inreg %x, half inreg %y) #0 {560; GCN-LABEL: s_constained_fmul_f16_fpexcept_strict:561; GCN: ; %bb.0:562; GCN-NEXT: v_mov_b32_e32 v0, s3563; GCN-NEXT: v_mul_f16_e32 v0, s2, v0564; GCN-NEXT: ; return to shader part epilog565;566; GFX10-LABEL: s_constained_fmul_f16_fpexcept_strict:567; GFX10: ; %bb.0:568; GFX10-NEXT: v_mul_f16_e64 v0, s2, s3569; GFX10-NEXT: ; return to shader part epilog570;571; GFX11-SDAG-TRUE16-LABEL: s_constained_fmul_f16_fpexcept_strict:572; GFX11-SDAG-TRUE16: ; %bb.0:573; GFX11-SDAG-TRUE16-NEXT: v_mul_f16_e64 v0.l, s2, s3574; GFX11-SDAG-TRUE16-NEXT: ; return to shader part epilog575;576; GFX11-SDAG-FAKE16-LABEL: s_constained_fmul_f16_fpexcept_strict:577; GFX11-SDAG-FAKE16: ; %bb.0:578; GFX11-SDAG-FAKE16-NEXT: v_mul_f16_e64 v0, s2, s3579; GFX11-SDAG-FAKE16-NEXT: ; return to shader part epilog580;581; GFX11-GISEL-TRUE16-LABEL: s_constained_fmul_f16_fpexcept_strict:582; GFX11-GISEL-TRUE16: ; %bb.0:583; GFX11-GISEL-TRUE16-NEXT: v_mul_f16_e64 v0.l, s2, s3584; GFX11-GISEL-TRUE16-NEXT: ; return to shader part epilog585;586; GFX11-GISEL-FAKE16-LABEL: s_constained_fmul_f16_fpexcept_strict:587; GFX11-GISEL-FAKE16: ; %bb.0:588; GFX11-GISEL-FAKE16-NEXT: v_mul_f16_e64 v0, s2, s3589; GFX11-GISEL-FAKE16-NEXT: ; return to shader part epilog590;591; GFX12-LABEL: s_constained_fmul_f16_fpexcept_strict:592; GFX12: ; %bb.0:593; GFX12-NEXT: s_mul_f16 s0, s2, s3594; GFX12-NEXT: s_delay_alu instid0(SALU_CYCLE_3)595; GFX12-NEXT: v_mov_b32_e32 v0, s0596; GFX12-NEXT: ; return to shader part epilog597; GFX1-GISEL-TRUE16-LABEL: s_constained_fmul_f16_fpexcept_strict:598; GFX1-GISEL-TRUE16: ; %bb.0:599; GFX1-GISEL-TRUE16-NEXT: v_mul_f16_e64 v0.l, s2, s3600; GFX1-GISEL-TRUE16-NEXT: ; return to shader part epilog601; GFX1-GISEL-FAKE16-LABEL: s_constained_fmul_f16_fpexcept_strict:602; GFX1-GISEL-FAKE16: ; %bb.0:603; GFX1-GISEL-FAKE16-NEXT: v_mul_f16_e64 v0, s2, s3604; GFX1-GISEL-FAKE16-NEXT: ; return to shader part epilog605 %val = call half @llvm.experimental.constrained.fmul.f16(half %x, half %y, metadata !"round.tonearest", metadata !"fpexcept.strict")606 ret half %val607}608 609define amdgpu_ps <2 x half> @s_constained_fmul_v2f16_fpexcept_strict(<2 x half> inreg %x, <2 x half> inreg %y) #0 {610; GFX9-LABEL: s_constained_fmul_v2f16_fpexcept_strict:611; GFX9: ; %bb.0:612; GFX9-NEXT: v_mov_b32_e32 v0, s3613; GFX9-NEXT: v_pk_mul_f16 v0, s2, v0614; GFX9-NEXT: ; return to shader part epilog615;616; GFX8-SDAG-LABEL: s_constained_fmul_v2f16_fpexcept_strict:617; GFX8-SDAG: ; %bb.0:618; GFX8-SDAG-NEXT: s_lshr_b32 s0, s3, 16619; GFX8-SDAG-NEXT: s_lshr_b32 s1, s2, 16620; GFX8-SDAG-NEXT: v_mov_b32_e32 v0, s0621; GFX8-SDAG-NEXT: v_mov_b32_e32 v1, s1622; GFX8-SDAG-NEXT: v_mul_f16_sdwa v0, v1, v0 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD623; GFX8-SDAG-NEXT: v_mov_b32_e32 v1, s3624; GFX8-SDAG-NEXT: v_mul_f16_e32 v1, s2, v1625; GFX8-SDAG-NEXT: v_or_b32_e32 v0, v1, v0626; GFX8-SDAG-NEXT: ; return to shader part epilog627;628; GFX8-GISEL-LABEL: s_constained_fmul_v2f16_fpexcept_strict:629; GFX8-GISEL: ; %bb.0:630; GFX8-GISEL-NEXT: s_lshr_b32 s0, s2, 16631; GFX8-GISEL-NEXT: s_lshr_b32 s1, s3, 16632; GFX8-GISEL-NEXT: v_mov_b32_e32 v0, s3633; GFX8-GISEL-NEXT: v_mov_b32_e32 v1, s1634; GFX8-GISEL-NEXT: v_mov_b32_e32 v2, s0635; GFX8-GISEL-NEXT: v_mul_f16_e32 v0, s2, v0636; GFX8-GISEL-NEXT: v_mul_f16_sdwa v1, v2, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD637; GFX8-GISEL-NEXT: v_or_b32_e32 v0, v0, v1638; GFX8-GISEL-NEXT: ; return to shader part epilog639;640; GFX10PLUS-LABEL: s_constained_fmul_v2f16_fpexcept_strict:641; GFX10PLUS: ; %bb.0:642; GFX10PLUS-NEXT: v_pk_mul_f16 v0, s2, s3643; GFX10PLUS-NEXT: ; return to shader part epilog644;645; GFX12-LABEL: s_constained_fmul_v2f16_fpexcept_strict:646; GFX12: ; %bb.0:647; GFX12-NEXT: v_pk_mul_f16 v0, s2, s3648; GFX12-NEXT: ; return to shader part epilog649 %val = call <2 x half> @llvm.experimental.constrained.fmul.v2f16(<2 x half> %x, <2 x half> %y, metadata !"round.tonearest", metadata !"fpexcept.strict")650 ret <2 x half> %val651}652 653declare half @llvm.experimental.constrained.fmul.f16(half, half, metadata, metadata) #1654declare <2 x half> @llvm.experimental.constrained.fmul.v2f16(<2 x half>, <2 x half>, metadata, metadata) #1655declare <3 x half> @llvm.experimental.constrained.fmul.v3f16(<3 x half>, <3 x half>, metadata, metadata) #1656declare <4 x half> @llvm.experimental.constrained.fmul.v4f16(<4 x half>, <4 x half>, metadata, metadata) #1657 658attributes #0 = { strictfp }659attributes #1 = { inaccessiblememonly nounwind willreturn }660;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:661; GFX11: {{.*}}662; GFX11-SDAG: {{.*}}663; GFX8: {{.*}}664