brintos

brintos / llvm-project-archived public Read only

0
0
Text · 14.8 KiB · f695526 Raw
333 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx900 < %s | FileCheck -check-prefixes=GCN,GFX9 %s3; RUN: llc -mtriple=amdgcn-mesa-mesa3d -mcpu=fiji < %s | FileCheck -check-prefixes=GCN,GFX8 %s4; RUN: llc -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1010 < %s | FileCheck -check-prefixes=GFX10 %s5; RUN: llc -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1100 -mattr=+real-true16 -amdgpu-enable-delay-alu=0 < %s | FileCheck -check-prefixes=GFX11,GFX11-TRUE16 %s6; RUN: llc -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1100 -mattr=-real-true16 -amdgpu-enable-delay-alu=0 < %s | FileCheck -check-prefixes=GFX11,GFX11-FAKE16 %s7 8define half @v_constained_fma_f16_fpexcept_strict(half %x, half %y, half %z) #0 {9; GCN-LABEL: v_constained_fma_f16_fpexcept_strict:10; GCN:       ; %bb.0:11; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)12; GCN-NEXT:    v_fma_f16 v0, v0, v1, v213; GCN-NEXT:    s_setpc_b64 s[30:31]14;15; GFX10-LABEL: v_constained_fma_f16_fpexcept_strict:16; GFX10:       ; %bb.0:17; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)18; GFX10-NEXT:    v_fma_f16 v0, v0, v1, v219; GFX10-NEXT:    s_setpc_b64 s[30:31]20;21; GFX11-TRUE16-LABEL: v_constained_fma_f16_fpexcept_strict:22; GFX11-TRUE16:       ; %bb.0:23; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)24; GFX11-TRUE16-NEXT:    v_fma_f16 v0.l, v0.l, v1.l, v2.l25; GFX11-TRUE16-NEXT:    s_setpc_b64 s[30:31]26;27; GFX11-FAKE16-LABEL: v_constained_fma_f16_fpexcept_strict:28; GFX11-FAKE16:       ; %bb.0:29; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)30; GFX11-FAKE16-NEXT:    v_fma_f16 v0, v0, v1, v231; GFX11-FAKE16-NEXT:    s_setpc_b64 s[30:31]32  %val = call half @llvm.experimental.constrained.fma.f16(half %x, half %y, half %z, metadata !"round.tonearest", metadata !"fpexcept.strict")33  ret half %val34}35 36define <2 x half> @v_constained_fma_v2f16_fpexcept_strict(<2 x half> %x, <2 x half> %y, <2 x half> %z) #0 {37; GFX9-LABEL: v_constained_fma_v2f16_fpexcept_strict:38; GFX9:       ; %bb.0:39; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)40; GFX9-NEXT:    v_pk_fma_f16 v0, v0, v1, v241; GFX9-NEXT:    s_setpc_b64 s[30:31]42;43; GFX8-LABEL: v_constained_fma_v2f16_fpexcept_strict:44; GFX8:       ; %bb.0:45; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)46; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 16, v247; GFX8-NEXT:    v_lshrrev_b32_e32 v4, 16, v148; GFX8-NEXT:    v_lshrrev_b32_e32 v5, 16, v049; GFX8-NEXT:    v_fma_f16 v3, v5, v4, v350; GFX8-NEXT:    v_lshlrev_b32_e32 v3, 16, v351; GFX8-NEXT:    v_fma_f16 v0, v0, v1, v252; GFX8-NEXT:    v_or_b32_e32 v0, v0, v353; GFX8-NEXT:    s_setpc_b64 s[30:31]54;55; GFX10-LABEL: v_constained_fma_v2f16_fpexcept_strict:56; GFX10:       ; %bb.0:57; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)58; GFX10-NEXT:    v_pk_fma_f16 v0, v0, v1, v259; GFX10-NEXT:    s_setpc_b64 s[30:31]60;61; GFX11-LABEL: v_constained_fma_v2f16_fpexcept_strict:62; GFX11:       ; %bb.0:63; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)64; GFX11-NEXT:    v_pk_fma_f16 v0, v0, v1, v265; GFX11-NEXT:    s_setpc_b64 s[30:31]66  %val = call <2 x half> @llvm.experimental.constrained.fma.v2f16(<2 x half> %x, <2 x half> %y, <2 x half> %z, metadata !"round.tonearest", metadata !"fpexcept.strict")67  ret <2 x half> %val68}69 70define <3 x half> @v_constained_fma_v3f16_fpexcept_strict(<3 x half> %x, <3 x half> %y, <3 x half> %z) #0 {71; GFX9-LABEL: v_constained_fma_v3f16_fpexcept_strict:72; GFX9:       ; %bb.0:73; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)74; GFX9-NEXT:    v_pk_fma_f16 v0, v0, v2, v475; GFX9-NEXT:    v_fma_f16 v1, v1, v3, v576; GFX9-NEXT:    s_setpc_b64 s[30:31]77;78; GFX8-LABEL: v_constained_fma_v3f16_fpexcept_strict:79; GFX8:       ; %bb.0:80; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)81; GFX8-NEXT:    v_lshrrev_b32_e32 v6, 16, v482; GFX8-NEXT:    v_lshrrev_b32_e32 v7, 16, v283; GFX8-NEXT:    v_lshrrev_b32_e32 v8, 16, v084; GFX8-NEXT:    v_fma_f16 v6, v8, v7, v685; GFX8-NEXT:    v_lshlrev_b32_e32 v6, 16, v686; GFX8-NEXT:    v_fma_f16 v0, v0, v2, v487; GFX8-NEXT:    v_or_b32_e32 v0, v0, v688; GFX8-NEXT:    v_fma_f16 v1, v1, v3, v589; GFX8-NEXT:    s_setpc_b64 s[30:31]90;91; GFX10-LABEL: v_constained_fma_v3f16_fpexcept_strict:92; GFX10:       ; %bb.0:93; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)94; GFX10-NEXT:    v_pk_fma_f16 v0, v0, v2, v495; GFX10-NEXT:    v_fma_f16 v1, v1, v3, v596; GFX10-NEXT:    s_setpc_b64 s[30:31]97;98; GFX11-TRUE16-LABEL: v_constained_fma_v3f16_fpexcept_strict:99; GFX11-TRUE16:       ; %bb.0:100; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)101; GFX11-TRUE16-NEXT:    v_fmac_f16_e32 v5.l, v1.l, v3.l102; GFX11-TRUE16-NEXT:    v_pk_fma_f16 v0, v0, v2, v4103; GFX11-TRUE16-NEXT:    v_mov_b32_e32 v1, v5104; GFX11-TRUE16-NEXT:    s_setpc_b64 s[30:31]105;106; GFX11-FAKE16-LABEL: v_constained_fma_v3f16_fpexcept_strict:107; GFX11-FAKE16:       ; %bb.0:108; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)109; GFX11-FAKE16-NEXT:    v_pk_fma_f16 v0, v0, v2, v4110; GFX11-FAKE16-NEXT:    v_fma_f16 v1, v1, v3, v5111; GFX11-FAKE16-NEXT:    s_setpc_b64 s[30:31]112  %val = call <3 x half> @llvm.experimental.constrained.fma.v3f16(<3 x half> %x, <3 x half> %y, <3 x half> %z, metadata !"round.tonearest", metadata !"fpexcept.strict")113  ret <3 x half> %val114}115 116define <4 x half> @v_constained_fma_v4f16_fpexcept_strict(<4 x half> %x, <4 x half> %y, <4 x half> %z) #0 {117; GFX9-LABEL: v_constained_fma_v4f16_fpexcept_strict:118; GFX9:       ; %bb.0:119; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)120; GFX9-NEXT:    v_lshrrev_b32_e32 v6, 16, v5121; GFX9-NEXT:    v_lshrrev_b32_e32 v7, 16, v3122; GFX9-NEXT:    v_lshrrev_b32_e32 v8, 16, v1123; GFX9-NEXT:    v_fma_f16 v6, v8, v7, v6124; GFX9-NEXT:    v_lshrrev_b32_e32 v7, 16, v4125; GFX9-NEXT:    v_lshrrev_b32_e32 v8, 16, v2126; GFX9-NEXT:    v_lshrrev_b32_e32 v9, 16, v0127; GFX9-NEXT:    v_fma_f16 v7, v9, v8, v7128; GFX9-NEXT:    v_fma_f16 v1, v1, v3, v5129; GFX9-NEXT:    v_fma_f16 v0, v0, v2, v4130; GFX9-NEXT:    s_mov_b32 s4, 0x5040100131; GFX9-NEXT:    v_perm_b32 v0, v7, v0, s4132; GFX9-NEXT:    v_perm_b32 v1, v6, v1, s4133; GFX9-NEXT:    s_setpc_b64 s[30:31]134;135; GFX8-LABEL: v_constained_fma_v4f16_fpexcept_strict:136; GFX8:       ; %bb.0:137; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)138; GFX8-NEXT:    v_lshrrev_b32_e32 v6, 16, v5139; GFX8-NEXT:    v_lshrrev_b32_e32 v7, 16, v3140; GFX8-NEXT:    v_lshrrev_b32_e32 v8, 16, v1141; GFX8-NEXT:    v_fma_f16 v6, v8, v7, v6142; GFX8-NEXT:    v_lshrrev_b32_e32 v7, 16, v4143; GFX8-NEXT:    v_lshrrev_b32_e32 v8, 16, v2144; GFX8-NEXT:    v_lshrrev_b32_e32 v9, 16, v0145; GFX8-NEXT:    v_fma_f16 v7, v9, v8, v7146; GFX8-NEXT:    v_fma_f16 v0, v0, v2, v4147; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 16, v7148; GFX8-NEXT:    v_fma_f16 v1, v1, v3, v5149; GFX8-NEXT:    v_or_b32_e32 v0, v0, v2150; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 16, v6151; GFX8-NEXT:    v_or_b32_e32 v1, v1, v2152; GFX8-NEXT:    s_setpc_b64 s[30:31]153;154; GFX10-LABEL: v_constained_fma_v4f16_fpexcept_strict:155; GFX10:       ; %bb.0:156; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)157; GFX10-NEXT:    v_lshrrev_b32_e32 v6, 16, v5158; GFX10-NEXT:    v_lshrrev_b32_e32 v7, 16, v3159; GFX10-NEXT:    v_lshrrev_b32_e32 v8, 16, v1160; GFX10-NEXT:    v_lshrrev_b32_e32 v9, 16, v4161; GFX10-NEXT:    v_lshrrev_b32_e32 v10, 16, v2162; GFX10-NEXT:    v_lshrrev_b32_e32 v11, 16, v0163; GFX10-NEXT:    v_fmac_f16_e32 v4, v0, v2164; GFX10-NEXT:    v_fmac_f16_e32 v6, v8, v7165; GFX10-NEXT:    v_fmac_f16_e32 v5, v1, v3166; GFX10-NEXT:    v_fmac_f16_e32 v9, v11, v10167; GFX10-NEXT:    v_perm_b32 v1, v6, v5, 0x5040100168; GFX10-NEXT:    v_perm_b32 v0, v9, v4, 0x5040100169; GFX10-NEXT:    s_setpc_b64 s[30:31]170;171; GFX11-TRUE16-LABEL: v_constained_fma_v4f16_fpexcept_strict:172; GFX11-TRUE16:       ; %bb.0:173; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)174; GFX11-TRUE16-NEXT:    v_fma_f16 v5.h, v1.h, v3.h, v5.h175; GFX11-TRUE16-NEXT:    v_fma_f16 v4.h, v0.h, v2.h, v4.h176; GFX11-TRUE16-NEXT:    v_fmac_f16_e32 v4.l, v0.l, v2.l177; GFX11-TRUE16-NEXT:    v_fmac_f16_e32 v5.l, v1.l, v3.l178; GFX11-TRUE16-NEXT:    v_dual_mov_b32 v0, v4 :: v_dual_mov_b32 v1, v5179; GFX11-TRUE16-NEXT:    s_setpc_b64 s[30:31]180;181; GFX11-FAKE16-LABEL: v_constained_fma_v4f16_fpexcept_strict:182; GFX11-FAKE16:       ; %bb.0:183; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)184; GFX11-FAKE16-NEXT:    v_lshrrev_b32_e32 v6, 16, v5185; GFX11-FAKE16-NEXT:    v_lshrrev_b32_e32 v7, 16, v3186; GFX11-FAKE16-NEXT:    v_lshrrev_b32_e32 v8, 16, v1187; GFX11-FAKE16-NEXT:    v_lshrrev_b32_e32 v9, 16, v4188; GFX11-FAKE16-NEXT:    v_lshrrev_b32_e32 v10, 16, v2189; GFX11-FAKE16-NEXT:    v_lshrrev_b32_e32 v11, 16, v0190; GFX11-FAKE16-NEXT:    v_fmac_f16_e32 v4, v0, v2191; GFX11-FAKE16-NEXT:    v_fmac_f16_e32 v6, v8, v7192; GFX11-FAKE16-NEXT:    v_fmac_f16_e32 v5, v1, v3193; GFX11-FAKE16-NEXT:    v_fmac_f16_e32 v9, v11, v10194; GFX11-FAKE16-NEXT:    v_perm_b32 v1, v6, v5, 0x5040100195; GFX11-FAKE16-NEXT:    v_perm_b32 v0, v9, v4, 0x5040100196; GFX11-FAKE16-NEXT:    s_setpc_b64 s[30:31]197  %val = call <4 x half> @llvm.experimental.constrained.fma.v4f16(<4 x half> %x, <4 x half> %y, <4 x half> %z, metadata !"round.tonearest", metadata !"fpexcept.strict")198  ret <4 x half> %val199}200 201define half @v_constained_fma_f16_fpexcept_strict_fneg(half %x, half %y, half %z) #0 {202; GCN-LABEL: v_constained_fma_f16_fpexcept_strict_fneg:203; GCN:       ; %bb.0:204; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)205; GCN-NEXT:    v_fma_f16 v0, v0, v1, -v2206; GCN-NEXT:    s_setpc_b64 s[30:31]207;208; GFX10-LABEL: v_constained_fma_f16_fpexcept_strict_fneg:209; GFX10:       ; %bb.0:210; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)211; GFX10-NEXT:    v_fma_f16 v0, v0, v1, -v2212; GFX10-NEXT:    s_setpc_b64 s[30:31]213;214; GFX11-TRUE16-LABEL: v_constained_fma_f16_fpexcept_strict_fneg:215; GFX11-TRUE16:       ; %bb.0:216; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)217; GFX11-TRUE16-NEXT:    v_fma_f16 v0.l, v0.l, v1.l, -v2.l218; GFX11-TRUE16-NEXT:    s_setpc_b64 s[30:31]219;220; GFX11-FAKE16-LABEL: v_constained_fma_f16_fpexcept_strict_fneg:221; GFX11-FAKE16:       ; %bb.0:222; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)223; GFX11-FAKE16-NEXT:    v_fma_f16 v0, v0, v1, -v2224; GFX11-FAKE16-NEXT:    s_setpc_b64 s[30:31]225  %neg.z = fneg half %z226  %val = call half @llvm.experimental.constrained.fma.f16(half %x, half %y, half %neg.z, metadata !"round.tonearest", metadata !"fpexcept.strict")227  ret half %val228}229 230define half @v_constained_fma_f16_fpexcept_strict_fneg_fneg(half %x, half %y, half %z) #0 {231; GCN-LABEL: v_constained_fma_f16_fpexcept_strict_fneg_fneg:232; GCN:       ; %bb.0:233; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)234; GCN-NEXT:    v_fma_f16 v0, -v0, -v1, v2235; GCN-NEXT:    s_setpc_b64 s[30:31]236;237; GFX10-LABEL: v_constained_fma_f16_fpexcept_strict_fneg_fneg:238; GFX10:       ; %bb.0:239; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)240; GFX10-NEXT:    v_fma_f16 v0, -v0, -v1, v2241; GFX10-NEXT:    s_setpc_b64 s[30:31]242;243; GFX11-TRUE16-LABEL: v_constained_fma_f16_fpexcept_strict_fneg_fneg:244; GFX11-TRUE16:       ; %bb.0:245; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)246; GFX11-TRUE16-NEXT:    v_fma_f16 v0.l, -v0.l, -v1.l, v2.l247; GFX11-TRUE16-NEXT:    s_setpc_b64 s[30:31]248;249; GFX11-FAKE16-LABEL: v_constained_fma_f16_fpexcept_strict_fneg_fneg:250; GFX11-FAKE16:       ; %bb.0:251; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)252; GFX11-FAKE16-NEXT:    v_fma_f16 v0, -v0, -v1, v2253; GFX11-FAKE16-NEXT:    s_setpc_b64 s[30:31]254  %neg.x = fneg half %x255  %neg.y = fneg half %y256  %val = call half @llvm.experimental.constrained.fma.f16(half %neg.x, half %neg.y, half %z, metadata !"round.tonearest", metadata !"fpexcept.strict")257  ret half %val258}259 260define half @v_constained_fma_f16_fpexcept_strict_fabs_fabs(half %x, half %y, half %z) #0 {261; GCN-LABEL: v_constained_fma_f16_fpexcept_strict_fabs_fabs:262; GCN:       ; %bb.0:263; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)264; GCN-NEXT:    v_fma_f16 v0, |v0|, |v1|, v2265; GCN-NEXT:    s_setpc_b64 s[30:31]266;267; GFX10-LABEL: v_constained_fma_f16_fpexcept_strict_fabs_fabs:268; GFX10:       ; %bb.0:269; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)270; GFX10-NEXT:    v_fma_f16 v0, |v0|, |v1|, v2271; GFX10-NEXT:    s_setpc_b64 s[30:31]272;273; GFX11-TRUE16-LABEL: v_constained_fma_f16_fpexcept_strict_fabs_fabs:274; GFX11-TRUE16:       ; %bb.0:275; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)276; GFX11-TRUE16-NEXT:    v_fma_f16 v0.l, |v0.l|, |v1.l|, v2.l277; GFX11-TRUE16-NEXT:    s_setpc_b64 s[30:31]278;279; GFX11-FAKE16-LABEL: v_constained_fma_f16_fpexcept_strict_fabs_fabs:280; GFX11-FAKE16:       ; %bb.0:281; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)282; GFX11-FAKE16-NEXT:    v_fma_f16 v0, |v0|, |v1|, v2283; GFX11-FAKE16-NEXT:    s_setpc_b64 s[30:31]284  %neg.x = call half @llvm.fabs.f16(half %x) #0285  %neg.y = call half @llvm.fabs.f16(half %y) #0286  %val = call half @llvm.experimental.constrained.fma.f16(half %neg.x, half %neg.y, half %z, metadata !"round.tonearest", metadata !"fpexcept.strict")287  ret half %val288}289 290define <2 x half> @v_constained_fma_v2f16_fpexcept_strict_fneg_fneg(<2 x half> %x, <2 x half> %y, <2 x half> %z) #0 {291; GFX9-LABEL: v_constained_fma_v2f16_fpexcept_strict_fneg_fneg:292; GFX9:       ; %bb.0:293; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)294; GFX9-NEXT:    v_pk_fma_f16 v0, v0, v1, v2 neg_lo:[1,1,0] neg_hi:[1,1,0]295; GFX9-NEXT:    s_setpc_b64 s[30:31]296;297; GFX8-LABEL: v_constained_fma_v2f16_fpexcept_strict_fneg_fneg:298; GFX8:       ; %bb.0:299; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)300; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 16, v2301; GFX8-NEXT:    v_lshrrev_b32_e32 v4, 16, v1302; GFX8-NEXT:    v_lshrrev_b32_e32 v5, 16, v0303; GFX8-NEXT:    v_fma_f16 v3, -v5, -v4, v3304; GFX8-NEXT:    v_lshlrev_b32_e32 v3, 16, v3305; GFX8-NEXT:    v_fma_f16 v0, -v0, -v1, v2306; GFX8-NEXT:    v_or_b32_e32 v0, v0, v3307; GFX8-NEXT:    s_setpc_b64 s[30:31]308;309; GFX10-LABEL: v_constained_fma_v2f16_fpexcept_strict_fneg_fneg:310; GFX10:       ; %bb.0:311; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)312; GFX10-NEXT:    v_pk_fma_f16 v0, v0, v1, v2 neg_lo:[1,1,0] neg_hi:[1,1,0]313; GFX10-NEXT:    s_setpc_b64 s[30:31]314;315; GFX11-LABEL: v_constained_fma_v2f16_fpexcept_strict_fneg_fneg:316; GFX11:       ; %bb.0:317; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)318; GFX11-NEXT:    v_pk_fma_f16 v0, v0, v1, v2 neg_lo:[1,1,0] neg_hi:[1,1,0]319; GFX11-NEXT:    s_setpc_b64 s[30:31]320  %neg.x = fneg <2 x half> %x321  %neg.y = fneg <2 x half> %y322  %val = call <2 x half> @llvm.experimental.constrained.fma.v2f16(<2 x half> %neg.x, <2 x half> %neg.y, <2 x half> %z, metadata !"round.tonearest", metadata !"fpexcept.strict")323  ret <2 x half> %val324}325 326declare half @llvm.fabs.f16(half)327declare half @llvm.experimental.constrained.fma.f16(half, half, half, metadata, metadata)328declare <2 x half> @llvm.experimental.constrained.fma.v2f16(<2 x half>, <2 x half>, <2 x half>, metadata, metadata)329declare <3 x half> @llvm.experimental.constrained.fma.v3f16(<3 x half>, <3 x half>, <3 x half>, metadata, metadata)330declare <4 x half> @llvm.experimental.constrained.fma.v4f16(<4 x half>, <4 x half>, <4 x half>, metadata, metadata)331 332attributes #0 = { strictfp }333