; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py ; RUN: llc -mtriple=aarch64--linux-gnu -mattr=+sve < %s | FileCheck %s define @fmla_h_sel( %pred, %acc, %m1, %m2) { ; CHECK-LABEL: fmla_h_sel: ; CHECK: // %bb.0: ; CHECK-NEXT: fmla z0.h, p0/m, z1.h, z2.h ; CHECK-NEXT: ret %mul = fmul contract %m1, %m2 %add = fadd contract %acc, %mul %res = select %pred, %add, %acc ret %res } define @fmla_hx4_sel( %pred, %acc, %m1, %m2) { ; CHECK-LABEL: fmla_hx4_sel: ; CHECK: // %bb.0: ; CHECK-NEXT: fmla z0.h, p0/m, z1.h, z2.h ; CHECK-NEXT: ret %mul = fmul contract %m1, %m2 %add = fadd contract %acc, %mul %res = select %pred, %add, %acc ret %res } define @fmla_hx2_sel( %pred, %acc, %m1, %m2) { ; CHECK-LABEL: fmla_hx2_sel: ; CHECK: // %bb.0: ; CHECK-NEXT: fmla z0.h, p0/m, z1.h, z2.h ; CHECK-NEXT: ret %mul = fmul contract %m1, %m2 %add = fadd contract %acc, %mul %res = select %pred, %add, %acc ret %res } define @fmla_s_sel( %pred, %acc, %m1, %m2) { ; CHECK-LABEL: fmla_s_sel: ; CHECK: // %bb.0: ; CHECK-NEXT: fmla z0.s, p0/m, z1.s, z2.s ; CHECK-NEXT: ret %mul = fmul contract %m1, %m2 %add = fadd contract %acc, %mul %res = select %pred, %add, %acc ret %res } define @fmla_sx2_sel( %pred, %acc, %m1, %m2) { ; CHECK-LABEL: fmla_sx2_sel: ; CHECK: // %bb.0: ; CHECK-NEXT: fmla z0.s, p0/m, z1.s, z2.s ; CHECK-NEXT: ret %mul = fmul contract %m1, %m2 %add = fadd contract %acc, %mul %res = select %pred, %add, %acc ret %res } define @fmla_d_sel( %pred, %acc, %m1, %m2) { ; CHECK-LABEL: fmla_d_sel: ; CHECK: // %bb.0: ; CHECK-NEXT: fmla z0.d, p0/m, z1.d, z2.d ; CHECK-NEXT: ret %mul = fmul contract %m1, %m2 %add = fadd contract %acc, %mul %res = select %pred, %add, %acc ret %res } define @fmls_h_sel( %pred, %acc, %m1, %m2) { ; CHECK-LABEL: fmls_h_sel: ; CHECK: // %bb.0: ; CHECK-NEXT: fmls z0.h, p0/m, z1.h, z2.h ; CHECK-NEXT: ret %mul = fmul contract %m1, %m2 %sub = fsub contract %acc, %mul %res = select %pred, %sub, %acc ret %res } define @fmls_hx4_sel( %pred, %acc, %m1, %m2) { ; CHECK-LABEL: fmls_hx4_sel: ; CHECK: // %bb.0: ; CHECK-NEXT: fmls z0.h, p0/m, z1.h, z2.h ; CHECK-NEXT: ret %mul = fmul contract %m1, %m2 %sub = fsub contract %acc, %mul %res = select %pred, %sub, %acc ret %res } define @fmls_hx2_sel( %pred, %acc, %m1, %m2) { ; CHECK-LABEL: fmls_hx2_sel: ; CHECK: // %bb.0: ; CHECK-NEXT: fmls z0.h, p0/m, z1.h, z2.h ; CHECK-NEXT: ret %mul = fmul contract %m1, %m2 %sub = fsub contract %acc, %mul %res = select %pred, %sub, %acc ret %res } define @fmls_s_sel( %pred, %acc, %m1, %m2) { ; CHECK-LABEL: fmls_s_sel: ; CHECK: // %bb.0: ; CHECK-NEXT: fmls z0.s, p0/m, z1.s, z2.s ; CHECK-NEXT: ret %mul = fmul contract %m1, %m2 %sub = fsub contract %acc, %mul %res = select %pred, %sub, %acc ret %res } define @fmls_sx2_sel( %pred, %acc, %m1, %m2) { ; CHECK-LABEL: fmls_sx2_sel: ; CHECK: // %bb.0: ; CHECK-NEXT: fmls z0.s, p0/m, z1.s, z2.s ; CHECK-NEXT: ret %mul = fmul contract %m1, %m2 %sub = fsub contract %acc, %mul %res = select %pred, %sub, %acc ret %res } define @fmls_d_sel( %pred, %acc, %m1, %m2) { ; CHECK-LABEL: fmls_d_sel: ; CHECK: // %bb.0: ; CHECK-NEXT: fmls z0.d, p0/m, z1.d, z2.d ; CHECK-NEXT: ret %mul = fmul contract %m1, %m2 %sub = fsub contract %acc, %mul %res = select %pred, %sub, %acc ret %res } define @fmad_h( %m1, %m2, %acc) { ; CHECK-LABEL: fmad_h: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.h ; CHECK-NEXT: fmad z0.h, p0/m, z1.h, z2.h ; CHECK-NEXT: ret %mul = fmul contract %m1, %m2 %res = fadd contract %acc, %mul ret %res } define @fmad_hx4( %m1, %m2, %acc) { ; CHECK-LABEL: fmad_hx4: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fmad z0.h, p0/m, z1.h, z2.h ; CHECK-NEXT: ret %mul = fmul contract %m1, %m2 %res = fadd contract %acc, %mul ret %res } define @fmad_hx2( %m1, %m2, %acc) { ; CHECK-LABEL: fmad_hx2: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d ; CHECK-NEXT: fmad z0.h, p0/m, z1.h, z2.h ; CHECK-NEXT: ret %mul = fmul contract %m1, %m2 %res = fadd contract %acc, %mul ret %res } define @fmad_s( %m1, %m2, %acc) { ; CHECK-LABEL: fmad_s: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fmad z0.s, p0/m, z1.s, z2.s ; CHECK-NEXT: ret %mul = fmul contract %m1, %m2 %res = fadd contract %acc, %mul ret %res } define @fmad_sx2( %m1, %m2, %acc) { ; CHECK-LABEL: fmad_sx2: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d ; CHECK-NEXT: fmad z0.s, p0/m, z1.s, z2.s ; CHECK-NEXT: ret %mul = fmul contract %m1, %m2 %res = fadd contract %acc, %mul ret %res } define @fmad_d( %m1, %m2, %acc) { ; CHECK-LABEL: fmad_d: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d ; CHECK-NEXT: fmad z0.d, p0/m, z1.d, z2.d ; CHECK-NEXT: ret %mul = fmul contract %m1, %m2 %res = fadd contract %acc, %mul ret %res } define @fmla_h( %acc, %m1, %m2) { ; CHECK-LABEL: fmla_h: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.h ; CHECK-NEXT: fmla z0.h, p0/m, z1.h, z2.h ; CHECK-NEXT: ret %mul = fmul contract %m1, %m2 %res = fadd contract %acc, %mul ret %res } define @fmla_hx4( %acc, %m1, %m2) { ; CHECK-LABEL: fmla_hx4: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fmla z0.h, p0/m, z1.h, z2.h ; CHECK-NEXT: ret %mul = fmul contract %m1, %m2 %res = fadd contract %acc, %mul ret %res } define @fmla_hx2( %acc, %m1, %m2) { ; CHECK-LABEL: fmla_hx2: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d ; CHECK-NEXT: fmla z0.h, p0/m, z1.h, z2.h ; CHECK-NEXT: ret %mul = fmul contract %m1, %m2 %res = fadd contract %acc, %mul ret %res } define @fmla_s( %acc, %m1, %m2) { ; CHECK-LABEL: fmla_s: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fmla z0.s, p0/m, z1.s, z2.s ; CHECK-NEXT: ret %mul = fmul contract %m1, %m2 %res = fadd contract %acc, %mul ret %res } define @fmla_sx2( %acc, %m1, %m2) { ; CHECK-LABEL: fmla_sx2: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d ; CHECK-NEXT: fmla z0.s, p0/m, z1.s, z2.s ; CHECK-NEXT: ret %mul = fmul contract %m1, %m2 %res = fadd contract %acc, %mul ret %res } define @fmla_d( %acc, %m1, %m2) { ; CHECK-LABEL: fmla_d: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d ; CHECK-NEXT: fmla z0.d, p0/m, z1.d, z2.d ; CHECK-NEXT: ret %mul = fmul contract %m1, %m2 %res = fadd contract %acc, %mul ret %res } define @fmls_h( %acc, %m1, %m2) { ; CHECK-LABEL: fmls_h: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.h ; CHECK-NEXT: fmls z0.h, p0/m, z1.h, z2.h ; CHECK-NEXT: ret %mul = fmul contract %m1, %m2 %res = fsub contract %acc, %mul ret %res } define @fmls_hx4( %acc, %m1, %m2) { ; CHECK-LABEL: fmls_hx4: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fmls z0.h, p0/m, z1.h, z2.h ; CHECK-NEXT: ret %mul = fmul contract %m1, %m2 %res = fsub contract %acc, %mul ret %res } define @fmls_hx2( %acc, %m1, %m2) { ; CHECK-LABEL: fmls_hx2: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d ; CHECK-NEXT: fmls z0.h, p0/m, z1.h, z2.h ; CHECK-NEXT: ret %mul = fmul contract %m1, %m2 %res = fsub contract %acc, %mul ret %res } define @fmls_s( %acc, %m1, %m2) { ; CHECK-LABEL: fmls_s: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fmls z0.s, p0/m, z1.s, z2.s ; CHECK-NEXT: ret %mul = fmul contract %m1, %m2 %res = fsub contract %acc, %mul ret %res } define @fmls_sx2( %acc, %m1, %m2) { ; CHECK-LABEL: fmls_sx2: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d ; CHECK-NEXT: fmls z0.s, p0/m, z1.s, z2.s ; CHECK-NEXT: ret %mul = fmul contract %m1, %m2 %res = fsub contract %acc, %mul ret %res } define @fmls_d( %acc, %m1, %m2) { ; CHECK-LABEL: fmls_d: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d ; CHECK-NEXT: fmls z0.d, p0/m, z1.d, z2.d ; CHECK-NEXT: ret %mul = fmul contract %m1, %m2 %res = fsub contract %acc, %mul ret %res } define @fmsb_h( %m1, %m2, %acc) { ; CHECK-LABEL: fmsb_h: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.h ; CHECK-NEXT: fmsb z0.h, p0/m, z1.h, z2.h ; CHECK-NEXT: ret %mul = fmul contract %m1, %m2 %res = fsub contract %acc, %mul ret %res } define @fmsb_hx4( %m1, %m2, %acc) { ; CHECK-LABEL: fmsb_hx4: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fmsb z0.h, p0/m, z1.h, z2.h ; CHECK-NEXT: ret %mul = fmul contract %m1, %m2 %res = fsub contract %acc, %mul ret %res } define @fmsb_hx2( %m1, %m2, %acc) { ; CHECK-LABEL: fmsb_hx2: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d ; CHECK-NEXT: fmsb z0.h, p0/m, z1.h, z2.h ; CHECK-NEXT: ret %mul = fmul contract %m1, %m2 %res = fsub contract %acc, %mul ret %res } define @fmsb_s( %m1, %m2, %acc) { ; CHECK-LABEL: fmsb_s: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fmsb z0.s, p0/m, z1.s, z2.s ; CHECK-NEXT: ret %mul = fmul contract %m1, %m2 %res = fsub contract %acc, %mul ret %res } define @fmsb_sx2( %m1, %m2, %acc) { ; CHECK-LABEL: fmsb_sx2: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d ; CHECK-NEXT: fmsb z0.s, p0/m, z1.s, z2.s ; CHECK-NEXT: ret %mul = fmul contract %m1, %m2 %res = fsub contract %acc, %mul ret %res } define @fmsb_d( %m1, %m2, %acc) { ; CHECK-LABEL: fmsb_d: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d ; CHECK-NEXT: fmsb z0.d, p0/m, z1.d, z2.d ; CHECK-NEXT: ret %mul = fmul contract %m1, %m2 %res = fsub contract %acc, %mul ret %res } define @fnmad_h( %m1, %m2, %acc) { ; CHECK-LABEL: fnmad_h: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.h ; CHECK-NEXT: fnmad z0.h, p0/m, z1.h, z2.h ; CHECK-NEXT: ret %neg_m1 = fneg contract %m1 %mul = fmul contract %neg_m1, %m2 %res = fsub contract %mul, %acc ret %res } define @fnmad_hx4( %m1, %m2, %acc) { ; CHECK-LABEL: fnmad_hx4: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fnmad z0.h, p0/m, z1.h, z2.h ; CHECK-NEXT: ret %neg_m1 = fneg contract %m1 %mul = fmul contract %neg_m1, %m2 %res = fsub contract %mul, %acc ret %res } define @fnmad_hx2( %m1, %m2, %acc) { ; CHECK-LABEL: fnmad_hx2: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d ; CHECK-NEXT: fnmad z0.h, p0/m, z1.h, z2.h ; CHECK-NEXT: ret %neg_m1 = fneg contract %m1 %mul = fmul contract %neg_m1, %m2 %res = fsub contract %mul, %acc ret %res } define @fnmad_s( %m1, %m2, %acc) { ; CHECK-LABEL: fnmad_s: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fnmad z0.s, p0/m, z1.s, z2.s ; CHECK-NEXT: ret %neg_m1 = fneg contract %m1 %mul = fmul contract %neg_m1, %m2 %res = fsub contract %mul, %acc ret %res } define @fnmad_sx2( %m1, %m2, %acc) { ; CHECK-LABEL: fnmad_sx2: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d ; CHECK-NEXT: fnmad z0.s, p0/m, z1.s, z2.s ; CHECK-NEXT: ret %neg_m1 = fneg contract %m1 %mul = fmul contract %neg_m1, %m2 %res = fsub contract %mul, %acc ret %res } define @fnmad_d( %m1, %m2, %acc) { ; CHECK-LABEL: fnmad_d: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d ; CHECK-NEXT: fnmad z0.d, p0/m, z1.d, z2.d ; CHECK-NEXT: ret %neg_m1 = fneg contract %m1 %mul = fmul contract %neg_m1, %m2 %res = fsub contract %mul, %acc ret %res } define @fnmla_h( %acc, %m1, %m2) { ; CHECK-LABEL: fnmla_h: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.h ; CHECK-NEXT: fnmla z0.h, p0/m, z1.h, z2.h ; CHECK-NEXT: ret %neg_m1 = fneg contract %m1 %mul = fmul contract %neg_m1, %m2 %res = fsub contract %mul, %acc ret %res } define @fnmla_hx4( %acc, %m1, %m2) { ; CHECK-LABEL: fnmla_hx4: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fnmla z0.h, p0/m, z1.h, z2.h ; CHECK-NEXT: ret %neg_m1 = fneg contract %m1 %mul = fmul contract %neg_m1, %m2 %res = fsub contract %mul, %acc ret %res } define @fnmla_hx2( %acc, %m1, %m2) { ; CHECK-LABEL: fnmla_hx2: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d ; CHECK-NEXT: fnmla z0.h, p0/m, z1.h, z2.h ; CHECK-NEXT: ret %neg_m1 = fneg contract %m1 %mul = fmul contract %neg_m1, %m2 %res = fsub contract %mul, %acc ret %res } define @fnmla_s( %acc, %m1, %m2) { ; CHECK-LABEL: fnmla_s: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fnmla z0.s, p0/m, z1.s, z2.s ; CHECK-NEXT: ret %neg_m1 = fneg contract %m1 %mul = fmul contract %neg_m1, %m2 %res = fsub contract %mul, %acc ret %res } define @fnmla_sx2( %acc, %m1, %m2) { ; CHECK-LABEL: fnmla_sx2: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d ; CHECK-NEXT: fnmla z0.s, p0/m, z1.s, z2.s ; CHECK-NEXT: ret %neg_m1 = fneg contract %m1 %mul = fmul contract %neg_m1, %m2 %res = fsub contract %mul, %acc ret %res } define @fnmla_d( %acc, %m1, %m2) { ; CHECK-LABEL: fnmla_d: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d ; CHECK-NEXT: fnmla z0.d, p0/m, z1.d, z2.d ; CHECK-NEXT: ret %neg_m1 = fneg contract %m1 %mul = fmul contract %neg_m1, %m2 %res = fsub contract %mul, %acc ret %res } define @fnmla_h_reversed( %acc, %m1, %m2) { ; CHECK-LABEL: fnmla_h_reversed: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.h ; CHECK-NEXT: fnmla z0.h, p0/m, z1.h, z2.h ; CHECK-NEXT: ret %mul = fmul contract %m1, %m2 %add = fadd contract %mul, %acc %res = fneg contract nsz %add ret %res } define @fnmla_hx4_reversed( %acc, %m1, %m2) { ; CHECK-LABEL: fnmla_hx4_reversed: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fnmla z0.h, p0/m, z1.h, z2.h ; CHECK-NEXT: ret %mul = fmul contract %m1, %m2 %add = fadd contract %mul, %acc %res = fneg contract nsz %add ret %res } define @fnmla_hx2_reversed( %acc, %m1, %m2) { ; CHECK-LABEL: fnmla_hx2_reversed: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d ; CHECK-NEXT: fnmla z0.h, p0/m, z1.h, z2.h ; CHECK-NEXT: ret %mul = fmul contract %m1, %m2 %add = fadd contract %mul, %acc %res = fneg contract nsz %add ret %res } define @fnmla_s_reversed( %acc, %m1, %m2) { ; CHECK-LABEL: fnmla_s_reversed: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fnmla z0.s, p0/m, z1.s, z2.s ; CHECK-NEXT: ret %mul = fmul contract %m1, %m2 %add = fadd contract %mul, %acc %res = fneg contract nsz %add ret %res } define @fnmla_sx2_reversed( %acc, %m1, %m2) { ; CHECK-LABEL: fnmla_sx2_reversed: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d ; CHECK-NEXT: fnmla z0.s, p0/m, z1.s, z2.s ; CHECK-NEXT: ret %mul = fmul contract %m1, %m2 %add = fadd contract %mul, %acc %res = fneg contract nsz %add ret %res } define @fnmla_d_reversed( %acc, %m1, %m2) { ; CHECK-LABEL: fnmla_d_reversed: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d ; CHECK-NEXT: fnmla z0.d, p0/m, z1.d, z2.d ; CHECK-NEXT: ret %mul = fmul contract %m1, %m2 %add = fadd contract %mul, %acc %res = fneg contract nsz %add ret %res } define @signed_zeros_negtest_fnmla_h_reversed( %acc, %m1, %m2) { ; CHECK-LABEL: signed_zeros_negtest_fnmla_h_reversed: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.h ; CHECK-NEXT: fmla z0.h, p0/m, z1.h, z2.h ; CHECK-NEXT: fneg z0.h, p0/m, z0.h ; CHECK-NEXT: ret %mul = fmul contract %m1, %m2 %add = fadd contract %mul, %acc %res = fneg contract %add ret %res } define @signed_zeros_negtest_fnmla_hx4_reversed( %acc, %m1, %m2) { ; CHECK-LABEL: signed_zeros_negtest_fnmla_hx4_reversed: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fmla z0.h, p0/m, z1.h, z2.h ; CHECK-NEXT: fneg z0.h, p0/m, z0.h ; CHECK-NEXT: ret %mul = fmul contract %m1, %m2 %add = fadd contract %mul, %acc %res = fneg contract %add ret %res } define @signed_zeros_negtest_fnmla_hx2_reversed( %acc, %m1, %m2) { ; CHECK-LABEL: signed_zeros_negtest_fnmla_hx2_reversed: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d ; CHECK-NEXT: fmla z0.h, p0/m, z1.h, z2.h ; CHECK-NEXT: fneg z0.h, p0/m, z0.h ; CHECK-NEXT: ret %mul = fmul contract %m1, %m2 %add = fadd contract %mul, %acc %res = fneg contract %add ret %res } define @signed_zeros_negtest_fnmla_s_reversed( %acc, %m1, %m2) { ; CHECK-LABEL: signed_zeros_negtest_fnmla_s_reversed: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fmla z0.s, p0/m, z1.s, z2.s ; CHECK-NEXT: fneg z0.s, p0/m, z0.s ; CHECK-NEXT: ret %mul = fmul contract %m1, %m2 %add = fadd contract %mul, %acc %res = fneg contract %add ret %res } define @signed_zeros_negtest_fnmla_sx2_reversed( %acc, %m1, %m2) { ; CHECK-LABEL: signed_zeros_negtest_fnmla_sx2_reversed: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d ; CHECK-NEXT: fmla z0.s, p0/m, z1.s, z2.s ; CHECK-NEXT: fneg z0.s, p0/m, z0.s ; CHECK-NEXT: ret %mul = fmul contract %m1, %m2 %add = fadd contract %mul, %acc %res = fneg contract %add ret %res } define @signed_zeros_negtest_fnmla_d_reversed( %acc, %m1, %m2) { ; CHECK-LABEL: signed_zeros_negtest_fnmla_d_reversed: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d ; CHECK-NEXT: fmla z0.d, p0/m, z1.d, z2.d ; CHECK-NEXT: fneg z0.d, p0/m, z0.d ; CHECK-NEXT: ret %mul = fmul contract %m1, %m2 %add = fadd contract %mul, %acc %res = fneg contract %add ret %res } define @fnmls_h( %acc, %m1, %m2) { ; CHECK-LABEL: fnmls_h: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.h ; CHECK-NEXT: fnmls z0.h, p0/m, z1.h, z2.h ; CHECK-NEXT: ret %mul = fmul contract %m1, %m2 %res = fsub contract %mul, %acc ret %res } define @fnmls_hx4( %acc, %m1, %m2) { ; CHECK-LABEL: fnmls_hx4: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fnmls z0.h, p0/m, z1.h, z2.h ; CHECK-NEXT: ret %mul = fmul contract %m1, %m2 %res = fsub contract %mul, %acc ret %res } define @fnmls_hx2( %acc, %m1, %m2) { ; CHECK-LABEL: fnmls_hx2: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d ; CHECK-NEXT: fnmls z0.h, p0/m, z1.h, z2.h ; CHECK-NEXT: ret %mul = fmul contract %m1, %m2 %res = fsub contract %mul, %acc ret %res } define @fnmls_s( %acc, %m1, %m2) { ; CHECK-LABEL: fnmls_s: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fnmls z0.s, p0/m, z1.s, z2.s ; CHECK-NEXT: ret %mul = fmul contract %m1, %m2 %res = fsub contract %mul, %acc ret %res } define @fnmls_sx2( %acc, %m1, %m2) { ; CHECK-LABEL: fnmls_sx2: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d ; CHECK-NEXT: fnmls z0.s, p0/m, z1.s, z2.s ; CHECK-NEXT: ret %mul = fmul contract %m1, %m2 %res = fsub contract %mul, %acc ret %res } define @fnmls_d( %acc, %m1, %m2) { ; CHECK-LABEL: fnmls_d: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d ; CHECK-NEXT: fnmls z0.d, p0/m, z1.d, z2.d ; CHECK-NEXT: ret %mul = fmul contract %m1, %m2 %res = fsub contract %mul, %acc ret %res } define @fnmsb_h( %m1, %m2, %acc) { ; CHECK-LABEL: fnmsb_h: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.h ; CHECK-NEXT: fnmsb z0.h, p0/m, z1.h, z2.h ; CHECK-NEXT: ret %mul = fmul contract %m1, %m2 %res = fsub contract %mul, %acc ret %res } define @fnmsb_hx4( %m1, %m2, %acc) { ; CHECK-LABEL: fnmsb_hx4: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fnmsb z0.h, p0/m, z1.h, z2.h ; CHECK-NEXT: ret %mul = fmul contract %m1, %m2 %res = fsub contract %mul, %acc ret %res } define @fnmsb_hx2( %m1, %m2, %acc) { ; CHECK-LABEL: fnmsb_hx2: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d ; CHECK-NEXT: fnmsb z0.h, p0/m, z1.h, z2.h ; CHECK-NEXT: ret %mul = fmul contract %m1, %m2 %res = fsub contract %mul, %acc ret %res } define @fnmsb_s( %m1, %m2, %acc) { ; CHECK-LABEL: fnmsb_s: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fnmsb z0.s, p0/m, z1.s, z2.s ; CHECK-NEXT: ret %mul = fmul contract %m1, %m2 %res = fsub contract %mul, %acc ret %res } define @fnmsb_sx2( %m1, %m2, %acc) { ; CHECK-LABEL: fnmsb_sx2: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d ; CHECK-NEXT: fnmsb z0.s, p0/m, z1.s, z2.s ; CHECK-NEXT: ret %mul = fmul contract %m1, %m2 %res = fsub contract %mul, %acc ret %res } define @fnmsb_d( %m1, %m2, %acc) { ; CHECK-LABEL: fnmsb_d: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d ; CHECK-NEXT: fnmsb z0.d, p0/m, z1.d, z2.d ; CHECK-NEXT: ret %mul = fmul contract %m1, %m2 %res = fsub contract %mul, %acc ret %res } define @fadd_h_sel( %a, %b, %mask) { ; CHECK-LABEL: fadd_h_sel: ; CHECK: // %bb.0: ; CHECK-NEXT: fadd z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret %sel = select %mask, %b, zeroinitializer %fadd = fadd nsz %a, %sel ret %fadd } define @fadd_s_sel( %a, %b, %mask) { ; CHECK-LABEL: fadd_s_sel: ; CHECK: // %bb.0: ; CHECK-NEXT: fadd z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret %sel = select %mask, %b, zeroinitializer %fadd = fadd nsz %a, %sel ret %fadd } define @fadd_d_sel( %a, %b, %mask) { ; CHECK-LABEL: fadd_d_sel: ; CHECK: // %bb.0: ; CHECK-NEXT: fadd z0.d, p0/m, z0.d, z1.d ; CHECK-NEXT: ret %sel = select %mask, %b, zeroinitializer %fadd = fadd nsz %a, %sel ret %fadd } define @fsub_h_sel( %a, %b, %mask) { ; CHECK-LABEL: fsub_h_sel: ; CHECK: // %bb.0: ; CHECK-NEXT: fsub z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret %sel = select %mask, %b, zeroinitializer %fsub = fsub %a, %sel ret %fsub } define @fsub_s_sel( %a, %b, %mask) { ; CHECK-LABEL: fsub_s_sel: ; CHECK: // %bb.0: ; CHECK-NEXT: fsub z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret %sel = select %mask, %b, zeroinitializer %fsub = fsub %a, %sel ret %fsub } define @fsub_d_sel( %a, %b, %mask) { ; CHECK-LABEL: fsub_d_sel: ; CHECK: // %bb.0: ; CHECK-NEXT: fsub z0.d, p0/m, z0.d, z1.d ; CHECK-NEXT: ret %sel = select %mask, %b, zeroinitializer %fsub = fsub %a, %sel ret %fsub } define @fadd_h_sel_negzero( %a, %b, %mask) { ; CHECK-LABEL: fadd_h_sel_negzero: ; CHECK: // %bb.0: ; CHECK-NEXT: fadd z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret %nz = fneg zeroinitializer %sel = select %mask, %b, %nz %fadd = fadd %a, %sel ret %fadd } define @fadd_s_sel_negzero( %a, %b, %mask) { ; CHECK-LABEL: fadd_s_sel_negzero: ; CHECK: // %bb.0: ; CHECK-NEXT: fadd z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret %nz = fneg zeroinitializer %sel = select %mask, %b, %nz %fadd = fadd %a, %sel ret %fadd } define @fadd_d_sel_negzero( %a, %b, %mask) { ; CHECK-LABEL: fadd_d_sel_negzero: ; CHECK: // %bb.0: ; CHECK-NEXT: fadd z0.d, p0/m, z0.d, z1.d ; CHECK-NEXT: ret %nz = fneg zeroinitializer %sel = select %mask, %b, %nz %fadd = fadd %a, %sel ret %fadd } define @fsub_h_sel_negzero( %a, %b, %mask) { ; CHECK-LABEL: fsub_h_sel_negzero: ; CHECK: // %bb.0: ; CHECK-NEXT: fsub z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret %nz = fneg zeroinitializer %sel = select %mask, %b, %nz %fsub = fsub nsz %a, %sel ret %fsub } define @fsub_s_sel_negzero( %a, %b, %mask) { ; CHECK-LABEL: fsub_s_sel_negzero: ; CHECK: // %bb.0: ; CHECK-NEXT: fsub z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret %nz = fneg zeroinitializer %sel = select %mask, %b, %nz %fsub = fsub nsz %a, %sel ret %fsub } define @fsub_d_sel_negzero( %a, %b, %mask) { ; CHECK-LABEL: fsub_d_sel_negzero: ; CHECK: // %bb.0: ; CHECK-NEXT: fsub z0.d, p0/m, z0.d, z1.d ; CHECK-NEXT: ret %nz = fneg zeroinitializer %sel = select %mask, %b, %nz %fsub = fsub nsz %a, %sel ret %fsub } define @fadd_sel_fmul_h( %a, %b, %c, %mask) { ; CHECK-LABEL: fadd_sel_fmul_h: ; CHECK: // %bb.0: ; CHECK-NEXT: fmul z1.h, z1.h, z2.h ; CHECK-NEXT: mov z2.h, #0 // =0x0 ; CHECK-NEXT: sel z1.h, p0, z1.h, z2.h ; CHECK-NEXT: fadd z0.h, z0.h, z1.h ; CHECK-NEXT: ret %fmul = fmul %b, %c %sel = select %mask, %fmul, zeroinitializer %fadd = fadd contract %a, %sel ret %fadd } define @fadd_sel_fmul_s( %a, %b, %c, %mask) { ; CHECK-LABEL: fadd_sel_fmul_s: ; CHECK: // %bb.0: ; CHECK-NEXT: fmul z1.s, z1.s, z2.s ; CHECK-NEXT: mov z2.s, #0 // =0x0 ; CHECK-NEXT: sel z1.s, p0, z1.s, z2.s ; CHECK-NEXT: fadd z0.s, z0.s, z1.s ; CHECK-NEXT: ret %fmul = fmul %b, %c %sel = select %mask, %fmul, zeroinitializer %fadd = fadd contract %a, %sel ret %fadd } define @fadd_sel_fmul_d( %a, %b, %c, %mask) { ; CHECK-LABEL: fadd_sel_fmul_d: ; CHECK: // %bb.0: ; CHECK-NEXT: fmul z1.d, z1.d, z2.d ; CHECK-NEXT: mov z2.d, #0 // =0x0 ; CHECK-NEXT: sel z1.d, p0, z1.d, z2.d ; CHECK-NEXT: fadd z0.d, z0.d, z1.d ; CHECK-NEXT: ret %fmul = fmul %b, %c %sel = select %mask, %fmul, zeroinitializer %fadd = fadd contract %a, %sel ret %fadd } define @fsub_sel_fmul_h( %a, %b, %c, %mask) { ; CHECK-LABEL: fsub_sel_fmul_h: ; CHECK: // %bb.0: ; CHECK-NEXT: fmls z0.h, p0/m, z1.h, z2.h ; CHECK-NEXT: ret %fmul = fmul %b, %c %sel = select %mask, %fmul, zeroinitializer %fsub = fsub contract %a, %sel ret %fsub } define @fsub_sel_fmul_s( %a, %b, %c, %mask) { ; CHECK-LABEL: fsub_sel_fmul_s: ; CHECK: // %bb.0: ; CHECK-NEXT: fmls z0.s, p0/m, z1.s, z2.s ; CHECK-NEXT: ret %fmul = fmul %b, %c %sel = select %mask, %fmul, zeroinitializer %fsub = fsub contract %a, %sel ret %fsub } define @fsub_sel_fmul_d( %a, %b, %c, %mask) { ; CHECK-LABEL: fsub_sel_fmul_d: ; CHECK: // %bb.0: ; CHECK-NEXT: fmls z0.d, p0/m, z1.d, z2.d ; CHECK-NEXT: ret %fmul = fmul %b, %c %sel = select %mask, %fmul, zeroinitializer %fsub = fsub contract %a, %sel ret %fsub } define @fadd_sel_fmul_h_nsz( %a, %b, %c, %mask) { ; CHECK-LABEL: fadd_sel_fmul_h_nsz: ; CHECK: // %bb.0: ; CHECK-NEXT: fmla z0.h, p0/m, z1.h, z2.h ; CHECK-NEXT: ret %fmul = fmul %b, %c %sel = select %mask, %fmul, zeroinitializer %fadd = fadd nsz contract %a, %sel ret %fadd } define @fadd_sel_fmul_s_nsz( %a, %b, %c, %mask) { ; CHECK-LABEL: fadd_sel_fmul_s_nsz: ; CHECK: // %bb.0: ; CHECK-NEXT: fmla z0.s, p0/m, z1.s, z2.s ; CHECK-NEXT: ret %fmul = fmul %b, %c %sel = select %mask, %fmul, zeroinitializer %fadd = fadd nsz contract %a, %sel ret %fadd } define @fadd_sel_fmul_d_nsz( %a, %b, %c, %mask) { ; CHECK-LABEL: fadd_sel_fmul_d_nsz: ; CHECK: // %bb.0: ; CHECK-NEXT: fmla z0.d, p0/m, z1.d, z2.d ; CHECK-NEXT: ret %fmul = fmul %b, %c %sel = select %mask, %fmul, zeroinitializer %fadd = fadd nsz contract %a, %sel ret %fadd } define @fsub_sel_fmul_h_nsz( %a, %b, %c, %mask) { ; CHECK-LABEL: fsub_sel_fmul_h_nsz: ; CHECK: // %bb.0: ; CHECK-NEXT: fmls z0.h, p0/m, z1.h, z2.h ; CHECK-NEXT: ret %fmul = fmul %b, %c %sel = select %mask, %fmul, zeroinitializer %fsub = fsub nsz contract %a, %sel ret %fsub } define @fsub_sel_fmul_s_nsz( %a, %b, %c, %mask) { ; CHECK-LABEL: fsub_sel_fmul_s_nsz: ; CHECK: // %bb.0: ; CHECK-NEXT: fmls z0.s, p0/m, z1.s, z2.s ; CHECK-NEXT: ret %fmul = fmul %b, %c %sel = select %mask, %fmul, zeroinitializer %fsub = fsub nsz contract %a, %sel ret %fsub } define @fsub_sel_fmul_d_nsz( %a, %b, %c, %mask) { ; CHECK-LABEL: fsub_sel_fmul_d_nsz: ; CHECK: // %bb.0: ; CHECK-NEXT: fmls z0.d, p0/m, z1.d, z2.d ; CHECK-NEXT: ret %fmul = fmul %b, %c %sel = select %mask, %fmul, zeroinitializer %fsub = fsub nsz contract %a, %sel ret %fsub } define @fadd_sel_fmul_h_negzero( %a, %b, %c, %mask) { ; CHECK-LABEL: fadd_sel_fmul_h_negzero: ; CHECK: // %bb.0: ; CHECK-NEXT: fmla z0.h, p0/m, z1.h, z2.h ; CHECK-NEXT: ret %fmul = fmul %b, %c %nz = fneg zeroinitializer %sel = select %mask, %fmul, %nz %fadd = fadd contract %a, %sel ret %fadd } define @fadd_sel_fmul_s_negzero( %a, %b, %c, %mask) { ; CHECK-LABEL: fadd_sel_fmul_s_negzero: ; CHECK: // %bb.0: ; CHECK-NEXT: fmla z0.s, p0/m, z1.s, z2.s ; CHECK-NEXT: ret %fmul = fmul %b, %c %nz = fneg zeroinitializer %sel = select %mask, %fmul, %nz %fadd = fadd contract %a, %sel ret %fadd } define @fadd_sel_fmul_d_negzero( %a, %b, %c, %mask) { ; CHECK-LABEL: fadd_sel_fmul_d_negzero: ; CHECK: // %bb.0: ; CHECK-NEXT: fmla z0.d, p0/m, z1.d, z2.d ; CHECK-NEXT: ret %fmul = fmul %b, %c %nz = fneg zeroinitializer %sel = select %mask, %fmul, %nz %fadd = fadd contract %a, %sel ret %fadd } define @fsub_sel_fmul_h_negzero( %a, %b, %c, %mask) { ; CHECK-LABEL: fsub_sel_fmul_h_negzero: ; CHECK: // %bb.0: ; CHECK-NEXT: mov w8, #32768 // =0x8000 ; CHECK-NEXT: fmul z1.h, z1.h, z2.h ; CHECK-NEXT: mov z2.h, w8 ; CHECK-NEXT: sel z1.h, p0, z1.h, z2.h ; CHECK-NEXT: fsub z0.h, z0.h, z1.h ; CHECK-NEXT: ret %fmul = fmul %b, %c %nz = fneg zeroinitializer %sel = select %mask, %fmul, %nz %fsub = fsub contract %a, %sel ret %fsub } define @fsub_sel_fmul_s_negzero( %a, %b, %c, %mask) { ; CHECK-LABEL: fsub_sel_fmul_s_negzero: ; CHECK: // %bb.0: ; CHECK-NEXT: mov w8, #-2147483648 // =0x80000000 ; CHECK-NEXT: fmul z1.s, z1.s, z2.s ; CHECK-NEXT: mov z2.s, w8 ; CHECK-NEXT: sel z1.s, p0, z1.s, z2.s ; CHECK-NEXT: fsub z0.s, z0.s, z1.s ; CHECK-NEXT: ret %fmul = fmul %b, %c %nz = fneg zeroinitializer %sel = select %mask, %fmul, %nz %fsub = fsub contract %a, %sel ret %fsub } define @fsub_sel_fmul_d_negzero( %a, %b, %c, %mask) { ; CHECK-LABEL: fsub_sel_fmul_d_negzero: ; CHECK: // %bb.0: ; CHECK-NEXT: mov x8, #-9223372036854775808 // =0x8000000000000000 ; CHECK-NEXT: fmul z1.d, z1.d, z2.d ; CHECK-NEXT: mov z2.d, x8 ; CHECK-NEXT: sel z1.d, p0, z1.d, z2.d ; CHECK-NEXT: fsub z0.d, z0.d, z1.d ; CHECK-NEXT: ret %fmul = fmul %b, %c %nz = fneg zeroinitializer %sel = select %mask, %fmul, %nz %fsub = fsub contract %a, %sel ret %fsub } define @fadd_sel_fmul_h_negzero_nsz( %a, %b, %c, %mask) { ; CHECK-LABEL: fadd_sel_fmul_h_negzero_nsz: ; CHECK: // %bb.0: ; CHECK-NEXT: fmla z0.h, p0/m, z1.h, z2.h ; CHECK-NEXT: ret %fmul = fmul %b, %c %nz = fneg zeroinitializer %sel = select %mask, %fmul, %nz %fadd = fadd nsz contract %a, %sel ret %fadd } define @fadd_sel_fmul_s_negzero_nsz( %a, %b, %c, %mask) { ; CHECK-LABEL: fadd_sel_fmul_s_negzero_nsz: ; CHECK: // %bb.0: ; CHECK-NEXT: fmla z0.s, p0/m, z1.s, z2.s ; CHECK-NEXT: ret %fmul = fmul %b, %c %nz = fneg zeroinitializer %sel = select %mask, %fmul, %nz %fadd = fadd nsz contract %a, %sel ret %fadd } define @fadd_sel_fmul_d_negzero_nsz( %a, %b, %c, %mask) { ; CHECK-LABEL: fadd_sel_fmul_d_negzero_nsz: ; CHECK: // %bb.0: ; CHECK-NEXT: fmla z0.d, p0/m, z1.d, z2.d ; CHECK-NEXT: ret %fmul = fmul %b, %c %nz = fneg zeroinitializer %sel = select %mask, %fmul, %nz %fadd = fadd nsz contract %a, %sel ret %fadd } define @fsub_sel_fmul_h_negzero_nsz( %a, %b, %c, %mask) { ; CHECK-LABEL: fsub_sel_fmul_h_negzero_nsz: ; CHECK: // %bb.0: ; CHECK-NEXT: fmls z0.h, p0/m, z1.h, z2.h ; CHECK-NEXT: ret %fmul = fmul %b, %c %nz = fneg zeroinitializer %sel = select %mask, %fmul, %nz %fsub = fsub nsz contract %a, %sel ret %fsub } define @fsub_sel_fmul_s_negzero_nsz( %a, %b, %c, %mask) { ; CHECK-LABEL: fsub_sel_fmul_s_negzero_nsz: ; CHECK: // %bb.0: ; CHECK-NEXT: fmls z0.s, p0/m, z1.s, z2.s ; CHECK-NEXT: ret %fmul = fmul %b, %c %nz = fneg zeroinitializer %sel = select %mask, %fmul, %nz %fsub = fsub nsz contract %a, %sel ret %fsub } define @fsub_sel_fmul_d_negzero_nsz( %a, %b, %c, %mask) { ; CHECK-LABEL: fsub_sel_fmul_d_negzero_nsz: ; CHECK: // %bb.0: ; CHECK-NEXT: fmls z0.d, p0/m, z1.d, z2.d ; CHECK-NEXT: ret %fmul = fmul %b, %c %nz = fneg zeroinitializer %sel = select %mask, %fmul, %nz %fsub = fsub nsz contract %a, %sel ret %fsub } ; Verify combine requires contract fast-math flag. define @fadd_sel_fmul_no_contract_s( %a, %b, %c, %mask) { ; CHECK-LABEL: fadd_sel_fmul_no_contract_s: ; CHECK: // %bb.0: ; CHECK-NEXT: fmul z1.s, z1.s, z2.s ; CHECK-NEXT: fadd z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret %fmul = fmul %b, %c %sel = select %mask, %fmul, zeroinitializer %fadd = fadd nsz %a, %sel ret %fadd } define @fma_sel_h_different_arg_order( %pred, %m1, %m2, %acc) { ; CHECK-LABEL: fma_sel_h_different_arg_order: ; CHECK: // %bb.0: ; CHECK-NEXT: fmla z2.h, p0/m, z0.h, z1.h ; CHECK-NEXT: mov z0.d, z2.d ; CHECK-NEXT: ret %mul.add = call @llvm.fma.nxv8f16( %m1, %m2, %acc) %masked.mul.add = select %pred, %mul.add, %acc ret %masked.mul.add } define @fma_sel_s_different_arg_order( %pred, %m1, %m2, %acc) { ; CHECK-LABEL: fma_sel_s_different_arg_order: ; CHECK: // %bb.0: ; CHECK-NEXT: fmla z2.s, p0/m, z0.s, z1.s ; CHECK-NEXT: mov z0.d, z2.d ; CHECK-NEXT: ret %mul.add = call @llvm.fma.nxv4f32( %m1, %m2, %acc) %masked.mul.add = select %pred, %mul.add, %acc ret %masked.mul.add } define @fma_sel_d_different_arg_order( %pred, %m1, %m2, %acc) { ; CHECK-LABEL: fma_sel_d_different_arg_order: ; CHECK: // %bb.0: ; CHECK-NEXT: fmla z2.d, p0/m, z0.d, z1.d ; CHECK-NEXT: mov z0.d, z2.d ; CHECK-NEXT: ret %mul.add = call @llvm.fma.nxv2f64( %m1, %m2, %acc) %masked.mul.add = select %pred, %mul.add, %acc ret %masked.mul.add } define @fnma_sel_h_different_arg_order( %pred, %m1, %m2, %acc) { ; CHECK-LABEL: fnma_sel_h_different_arg_order: ; CHECK: // %bb.0: ; CHECK-NEXT: fmls z2.h, p0/m, z0.h, z1.h ; CHECK-NEXT: mov z0.d, z2.d ; CHECK-NEXT: ret %neg_m1 = fneg contract %m1 %mul.add = call @llvm.fma.nxv8f16( %neg_m1, %m2, %acc) %masked.mul.add = select %pred, %mul.add, %acc ret %masked.mul.add } define @fnma_sel_s_different_arg_order( %pred, %m1, %m2, %acc) { ; CHECK-LABEL: fnma_sel_s_different_arg_order: ; CHECK: // %bb.0: ; CHECK-NEXT: fmls z2.s, p0/m, z0.s, z1.s ; CHECK-NEXT: mov z0.d, z2.d ; CHECK-NEXT: ret %neg_m1 = fneg contract %m1 %mul.add = call @llvm.fma.nxv4f32( %neg_m1, %m2, %acc) %masked.mul.add = select %pred, %mul.add, %acc ret %masked.mul.add } define @fnma_sel_d_different_arg_order( %pred, %m1, %m2, %acc) { ; CHECK-LABEL: fnma_sel_d_different_arg_order: ; CHECK: // %bb.0: ; CHECK-NEXT: fmls z2.d, p0/m, z0.d, z1.d ; CHECK-NEXT: mov z0.d, z2.d ; CHECK-NEXT: ret %neg_m1 = fneg contract %m1 %mul.add = call @llvm.fma.nxv2f64( %neg_m1, %m2, %acc) %masked.mul.add = select %pred, %mul.add, %acc ret %masked.mul.add } declare @llvm.fma.nxv8f16(, , ) declare @llvm.fma.nxv4f32(, , ) declare @llvm.fma.nxv2f64(, , )