1340 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=aarch64--linux-gnu -mattr=+sve < %s | FileCheck %s3 4define <vscale x 8 x half> @fmla_h_sel(<vscale x 8 x i1> %pred, <vscale x 8 x half> %acc, <vscale x 8 x half> %m1, <vscale x 8 x half> %m2) {5; CHECK-LABEL: fmla_h_sel:6; CHECK: // %bb.0:7; CHECK-NEXT: fmla z0.h, p0/m, z1.h, z2.h8; CHECK-NEXT: ret9 %mul = fmul contract <vscale x 8 x half> %m1, %m210 %add = fadd contract <vscale x 8 x half> %acc, %mul11 %res = select <vscale x 8 x i1> %pred, <vscale x 8 x half> %add, <vscale x 8 x half> %acc12 ret <vscale x 8 x half> %res13}14 15define <vscale x 4 x half> @fmla_hx4_sel(<vscale x 4 x i1> %pred, <vscale x 4 x half> %acc, <vscale x 4 x half> %m1, <vscale x 4 x half> %m2) {16; CHECK-LABEL: fmla_hx4_sel:17; CHECK: // %bb.0:18; CHECK-NEXT: fmla z0.h, p0/m, z1.h, z2.h19; CHECK-NEXT: ret20 %mul = fmul contract <vscale x 4 x half> %m1, %m221 %add = fadd contract <vscale x 4 x half> %acc, %mul22 %res = select <vscale x 4 x i1> %pred, <vscale x 4 x half> %add, <vscale x 4 x half> %acc23 ret <vscale x 4 x half> %res24}25 26define <vscale x 2 x half> @fmla_hx2_sel(<vscale x 2 x i1> %pred, <vscale x 2 x half> %acc, <vscale x 2 x half> %m1, <vscale x 2 x half> %m2) {27; CHECK-LABEL: fmla_hx2_sel:28; CHECK: // %bb.0:29; CHECK-NEXT: fmla z0.h, p0/m, z1.h, z2.h30; CHECK-NEXT: ret31 %mul = fmul contract <vscale x 2 x half> %m1, %m232 %add = fadd contract <vscale x 2 x half> %acc, %mul33 %res = select <vscale x 2 x i1> %pred, <vscale x 2 x half> %add, <vscale x 2 x half> %acc34 ret <vscale x 2 x half> %res35}36 37define <vscale x 4 x float> @fmla_s_sel(<vscale x 4 x i1> %pred, <vscale x 4 x float> %acc, <vscale x 4 x float> %m1, <vscale x 4 x float> %m2) {38; CHECK-LABEL: fmla_s_sel:39; CHECK: // %bb.0:40; CHECK-NEXT: fmla z0.s, p0/m, z1.s, z2.s41; CHECK-NEXT: ret42 %mul = fmul contract <vscale x 4 x float> %m1, %m243 %add = fadd contract <vscale x 4 x float> %acc, %mul44 %res = select <vscale x 4 x i1> %pred, <vscale x 4 x float> %add, <vscale x 4 x float> %acc45 ret <vscale x 4 x float> %res46}47 48define <vscale x 2 x float> @fmla_sx2_sel(<vscale x 2 x i1> %pred, <vscale x 2 x float> %acc, <vscale x 2 x float> %m1, <vscale x 2 x float> %m2) {49; CHECK-LABEL: fmla_sx2_sel:50; CHECK: // %bb.0:51; CHECK-NEXT: fmla z0.s, p0/m, z1.s, z2.s52; CHECK-NEXT: ret53 %mul = fmul contract <vscale x 2 x float> %m1, %m254 %add = fadd contract <vscale x 2 x float> %acc, %mul55 %res = select <vscale x 2 x i1> %pred, <vscale x 2 x float> %add, <vscale x 2 x float> %acc56 ret <vscale x 2 x float> %res57}58 59define <vscale x 2 x double> @fmla_d_sel(<vscale x 2 x i1> %pred, <vscale x 2 x double> %acc, <vscale x 2 x double> %m1, <vscale x 2 x double> %m2) {60; CHECK-LABEL: fmla_d_sel:61; CHECK: // %bb.0:62; CHECK-NEXT: fmla z0.d, p0/m, z1.d, z2.d63; CHECK-NEXT: ret64 %mul = fmul contract <vscale x 2 x double> %m1, %m265 %add = fadd contract <vscale x 2 x double> %acc, %mul66 %res = select <vscale x 2 x i1> %pred, <vscale x 2 x double> %add, <vscale x 2 x double> %acc67 ret <vscale x 2 x double> %res68}69 70define <vscale x 8 x half> @fmls_h_sel(<vscale x 8 x i1> %pred, <vscale x 8 x half> %acc, <vscale x 8 x half> %m1, <vscale x 8 x half> %m2) {71; CHECK-LABEL: fmls_h_sel:72; CHECK: // %bb.0:73; CHECK-NEXT: fmls z0.h, p0/m, z1.h, z2.h74; CHECK-NEXT: ret75 %mul = fmul contract <vscale x 8 x half> %m1, %m276 %sub = fsub contract <vscale x 8 x half> %acc, %mul77 %res = select <vscale x 8 x i1> %pred, <vscale x 8 x half> %sub, <vscale x 8 x half> %acc78 ret <vscale x 8 x half> %res79}80 81define <vscale x 4 x half> @fmls_hx4_sel(<vscale x 4 x i1> %pred, <vscale x 4 x half> %acc, <vscale x 4 x half> %m1, <vscale x 4 x half> %m2) {82; CHECK-LABEL: fmls_hx4_sel:83; CHECK: // %bb.0:84; CHECK-NEXT: fmls z0.h, p0/m, z1.h, z2.h85; CHECK-NEXT: ret86 %mul = fmul contract <vscale x 4 x half> %m1, %m287 %sub = fsub contract <vscale x 4 x half> %acc, %mul88 %res = select <vscale x 4 x i1> %pred, <vscale x 4 x half> %sub, <vscale x 4 x half> %acc89 ret <vscale x 4 x half> %res90}91 92define <vscale x 2 x half> @fmls_hx2_sel(<vscale x 2 x i1> %pred, <vscale x 2 x half> %acc, <vscale x 2 x half> %m1, <vscale x 2 x half> %m2) {93; CHECK-LABEL: fmls_hx2_sel:94; CHECK: // %bb.0:95; CHECK-NEXT: fmls z0.h, p0/m, z1.h, z2.h96; CHECK-NEXT: ret97 %mul = fmul contract <vscale x 2 x half> %m1, %m298 %sub = fsub contract <vscale x 2 x half> %acc, %mul99 %res = select <vscale x 2 x i1> %pred, <vscale x 2 x half> %sub, <vscale x 2 x half> %acc100 ret <vscale x 2 x half> %res101}102 103define <vscale x 4 x float> @fmls_s_sel(<vscale x 4 x i1> %pred, <vscale x 4 x float> %acc, <vscale x 4 x float> %m1, <vscale x 4 x float> %m2) {104; CHECK-LABEL: fmls_s_sel:105; CHECK: // %bb.0:106; CHECK-NEXT: fmls z0.s, p0/m, z1.s, z2.s107; CHECK-NEXT: ret108 %mul = fmul contract <vscale x 4 x float> %m1, %m2109 %sub = fsub contract <vscale x 4 x float> %acc, %mul110 %res = select <vscale x 4 x i1> %pred, <vscale x 4 x float> %sub, <vscale x 4 x float> %acc111 ret <vscale x 4 x float> %res112}113 114define <vscale x 2 x float> @fmls_sx2_sel(<vscale x 2 x i1> %pred, <vscale x 2 x float> %acc, <vscale x 2 x float> %m1, <vscale x 2 x float> %m2) {115; CHECK-LABEL: fmls_sx2_sel:116; CHECK: // %bb.0:117; CHECK-NEXT: fmls z0.s, p0/m, z1.s, z2.s118; CHECK-NEXT: ret119 %mul = fmul contract <vscale x 2 x float> %m1, %m2120 %sub = fsub contract <vscale x 2 x float> %acc, %mul121 %res = select <vscale x 2 x i1> %pred, <vscale x 2 x float> %sub, <vscale x 2 x float> %acc122 ret <vscale x 2 x float> %res123}124 125define <vscale x 2 x double> @fmls_d_sel(<vscale x 2 x i1> %pred, <vscale x 2 x double> %acc, <vscale x 2 x double> %m1, <vscale x 2 x double> %m2) {126; CHECK-LABEL: fmls_d_sel:127; CHECK: // %bb.0:128; CHECK-NEXT: fmls z0.d, p0/m, z1.d, z2.d129; CHECK-NEXT: ret130 %mul = fmul contract <vscale x 2 x double> %m1, %m2131 %sub = fsub contract <vscale x 2 x double> %acc, %mul132 %res = select <vscale x 2 x i1> %pred, <vscale x 2 x double> %sub, <vscale x 2 x double> %acc133 ret <vscale x 2 x double> %res134}135 136define <vscale x 8 x half> @fmad_h(<vscale x 8 x half> %m1, <vscale x 8 x half> %m2, <vscale x 8 x half> %acc) {137; CHECK-LABEL: fmad_h:138; CHECK: // %bb.0:139; CHECK-NEXT: ptrue p0.h140; CHECK-NEXT: fmad z0.h, p0/m, z1.h, z2.h141; CHECK-NEXT: ret142 %mul = fmul contract <vscale x 8 x half> %m1, %m2143 %res = fadd contract <vscale x 8 x half> %acc, %mul144 ret <vscale x 8 x half> %res145}146 147define <vscale x 4 x half> @fmad_hx4(<vscale x 4 x half> %m1, <vscale x 4 x half> %m2, <vscale x 4 x half> %acc) {148; CHECK-LABEL: fmad_hx4:149; CHECK: // %bb.0:150; CHECK-NEXT: ptrue p0.s151; CHECK-NEXT: fmad z0.h, p0/m, z1.h, z2.h152; CHECK-NEXT: ret153 %mul = fmul contract <vscale x 4 x half> %m1, %m2154 %res = fadd contract <vscale x 4 x half> %acc, %mul155 ret <vscale x 4 x half> %res156}157 158define <vscale x 2 x half> @fmad_hx2(<vscale x 2 x half> %m1, <vscale x 2 x half> %m2, <vscale x 2 x half> %acc) {159; CHECK-LABEL: fmad_hx2:160; CHECK: // %bb.0:161; CHECK-NEXT: ptrue p0.d162; CHECK-NEXT: fmad z0.h, p0/m, z1.h, z2.h163; CHECK-NEXT: ret164 %mul = fmul contract <vscale x 2 x half> %m1, %m2165 %res = fadd contract <vscale x 2 x half> %acc, %mul166 ret <vscale x 2 x half> %res167}168 169define <vscale x 4 x float> @fmad_s(<vscale x 4 x float> %m1, <vscale x 4 x float> %m2, <vscale x 4 x float> %acc) {170; CHECK-LABEL: fmad_s:171; CHECK: // %bb.0:172; CHECK-NEXT: ptrue p0.s173; CHECK-NEXT: fmad z0.s, p0/m, z1.s, z2.s174; CHECK-NEXT: ret175 %mul = fmul contract <vscale x 4 x float> %m1, %m2176 %res = fadd contract <vscale x 4 x float> %acc, %mul177 ret <vscale x 4 x float> %res178}179 180define <vscale x 2 x float> @fmad_sx2(<vscale x 2 x float> %m1, <vscale x 2 x float> %m2, <vscale x 2 x float> %acc) {181; CHECK-LABEL: fmad_sx2:182; CHECK: // %bb.0:183; CHECK-NEXT: ptrue p0.d184; CHECK-NEXT: fmad z0.s, p0/m, z1.s, z2.s185; CHECK-NEXT: ret186 %mul = fmul contract <vscale x 2 x float> %m1, %m2187 %res = fadd contract <vscale x 2 x float> %acc, %mul188 ret <vscale x 2 x float> %res189}190 191define <vscale x 2 x double> @fmad_d(<vscale x 2 x double> %m1, <vscale x 2 x double> %m2, <vscale x 2 x double> %acc) {192; CHECK-LABEL: fmad_d:193; CHECK: // %bb.0:194; CHECK-NEXT: ptrue p0.d195; CHECK-NEXT: fmad z0.d, p0/m, z1.d, z2.d196; CHECK-NEXT: ret197 %mul = fmul contract <vscale x 2 x double> %m1, %m2198 %res = fadd contract <vscale x 2 x double> %acc, %mul199 ret <vscale x 2 x double> %res200}201 202define <vscale x 8 x half> @fmla_h(<vscale x 8 x half> %acc, <vscale x 8 x half> %m1, <vscale x 8 x half> %m2) {203; CHECK-LABEL: fmla_h:204; CHECK: // %bb.0:205; CHECK-NEXT: ptrue p0.h206; CHECK-NEXT: fmla z0.h, p0/m, z1.h, z2.h207; CHECK-NEXT: ret208 %mul = fmul contract <vscale x 8 x half> %m1, %m2209 %res = fadd contract <vscale x 8 x half> %acc, %mul210 ret <vscale x 8 x half> %res211}212 213define <vscale x 4 x half> @fmla_hx4(<vscale x 4 x half> %acc, <vscale x 4 x half> %m1, <vscale x 4 x half> %m2) {214; CHECK-LABEL: fmla_hx4:215; CHECK: // %bb.0:216; CHECK-NEXT: ptrue p0.s217; CHECK-NEXT: fmla z0.h, p0/m, z1.h, z2.h218; CHECK-NEXT: ret219 %mul = fmul contract <vscale x 4 x half> %m1, %m2220 %res = fadd contract <vscale x 4 x half> %acc, %mul221 ret <vscale x 4 x half> %res222}223 224define <vscale x 2 x half> @fmla_hx2(<vscale x 2 x half> %acc, <vscale x 2 x half> %m1, <vscale x 2 x half> %m2) {225; CHECK-LABEL: fmla_hx2:226; CHECK: // %bb.0:227; CHECK-NEXT: ptrue p0.d228; CHECK-NEXT: fmla z0.h, p0/m, z1.h, z2.h229; CHECK-NEXT: ret230 %mul = fmul contract <vscale x 2 x half> %m1, %m2231 %res = fadd contract <vscale x 2 x half> %acc, %mul232 ret <vscale x 2 x half> %res233}234 235define <vscale x 4 x float> @fmla_s(<vscale x 4 x float> %acc, <vscale x 4 x float> %m1, <vscale x 4 x float> %m2) {236; CHECK-LABEL: fmla_s:237; CHECK: // %bb.0:238; CHECK-NEXT: ptrue p0.s239; CHECK-NEXT: fmla z0.s, p0/m, z1.s, z2.s240; CHECK-NEXT: ret241 %mul = fmul contract <vscale x 4 x float> %m1, %m2242 %res = fadd contract <vscale x 4 x float> %acc, %mul243 ret <vscale x 4 x float> %res244}245 246define <vscale x 2 x float> @fmla_sx2(<vscale x 2 x float> %acc, <vscale x 2 x float> %m1, <vscale x 2 x float> %m2) {247; CHECK-LABEL: fmla_sx2:248; CHECK: // %bb.0:249; CHECK-NEXT: ptrue p0.d250; CHECK-NEXT: fmla z0.s, p0/m, z1.s, z2.s251; CHECK-NEXT: ret252 %mul = fmul contract <vscale x 2 x float> %m1, %m2253 %res = fadd contract <vscale x 2 x float> %acc, %mul254 ret <vscale x 2 x float> %res255}256 257define <vscale x 2 x double> @fmla_d(<vscale x 2 x double> %acc, <vscale x 2 x double> %m1, <vscale x 2 x double> %m2) {258; CHECK-LABEL: fmla_d:259; CHECK: // %bb.0:260; CHECK-NEXT: ptrue p0.d261; CHECK-NEXT: fmla z0.d, p0/m, z1.d, z2.d262; CHECK-NEXT: ret263 %mul = fmul contract <vscale x 2 x double> %m1, %m2264 %res = fadd contract <vscale x 2 x double> %acc, %mul265 ret <vscale x 2 x double> %res266}267 268define <vscale x 8 x half> @fmls_h(<vscale x 8 x half> %acc, <vscale x 8 x half> %m1, <vscale x 8 x half> %m2) {269; CHECK-LABEL: fmls_h:270; CHECK: // %bb.0:271; CHECK-NEXT: ptrue p0.h272; CHECK-NEXT: fmls z0.h, p0/m, z1.h, z2.h273; CHECK-NEXT: ret274 %mul = fmul contract <vscale x 8 x half> %m1, %m2275 %res = fsub contract <vscale x 8 x half> %acc, %mul276 ret <vscale x 8 x half> %res277}278 279define <vscale x 4 x half> @fmls_hx4(<vscale x 4 x half> %acc, <vscale x 4 x half> %m1, <vscale x 4 x half> %m2) {280; CHECK-LABEL: fmls_hx4:281; CHECK: // %bb.0:282; CHECK-NEXT: ptrue p0.s283; CHECK-NEXT: fmls z0.h, p0/m, z1.h, z2.h284; CHECK-NEXT: ret285 %mul = fmul contract <vscale x 4 x half> %m1, %m2286 %res = fsub contract <vscale x 4 x half> %acc, %mul287 ret <vscale x 4 x half> %res288}289 290define <vscale x 2 x half> @fmls_hx2(<vscale x 2 x half> %acc, <vscale x 2 x half> %m1, <vscale x 2 x half> %m2) {291; CHECK-LABEL: fmls_hx2:292; CHECK: // %bb.0:293; CHECK-NEXT: ptrue p0.d294; CHECK-NEXT: fmls z0.h, p0/m, z1.h, z2.h295; CHECK-NEXT: ret296 %mul = fmul contract <vscale x 2 x half> %m1, %m2297 %res = fsub contract <vscale x 2 x half> %acc, %mul298 ret <vscale x 2 x half> %res299}300 301define <vscale x 4 x float> @fmls_s(<vscale x 4 x float> %acc, <vscale x 4 x float> %m1, <vscale x 4 x float> %m2) {302; CHECK-LABEL: fmls_s:303; CHECK: // %bb.0:304; CHECK-NEXT: ptrue p0.s305; CHECK-NEXT: fmls z0.s, p0/m, z1.s, z2.s306; CHECK-NEXT: ret307 %mul = fmul contract <vscale x 4 x float> %m1, %m2308 %res = fsub contract <vscale x 4 x float> %acc, %mul309 ret <vscale x 4 x float> %res310}311 312define <vscale x 2 x float> @fmls_sx2(<vscale x 2 x float> %acc, <vscale x 2 x float> %m1, <vscale x 2 x float> %m2) {313; CHECK-LABEL: fmls_sx2:314; CHECK: // %bb.0:315; CHECK-NEXT: ptrue p0.d316; CHECK-NEXT: fmls z0.s, p0/m, z1.s, z2.s317; CHECK-NEXT: ret318 %mul = fmul contract <vscale x 2 x float> %m1, %m2319 %res = fsub contract <vscale x 2 x float> %acc, %mul320 ret <vscale x 2 x float> %res321}322 323define <vscale x 2 x double> @fmls_d(<vscale x 2 x double> %acc, <vscale x 2 x double> %m1, <vscale x 2 x double> %m2) {324; CHECK-LABEL: fmls_d:325; CHECK: // %bb.0:326; CHECK-NEXT: ptrue p0.d327; CHECK-NEXT: fmls z0.d, p0/m, z1.d, z2.d328; CHECK-NEXT: ret329 %mul = fmul contract <vscale x 2 x double> %m1, %m2330 %res = fsub contract <vscale x 2 x double> %acc, %mul331 ret <vscale x 2 x double> %res332}333 334define <vscale x 8 x half> @fmsb_h(<vscale x 8 x half> %m1, <vscale x 8 x half> %m2, <vscale x 8 x half> %acc) {335; CHECK-LABEL: fmsb_h:336; CHECK: // %bb.0:337; CHECK-NEXT: ptrue p0.h338; CHECK-NEXT: fmsb z0.h, p0/m, z1.h, z2.h339; CHECK-NEXT: ret340 %mul = fmul contract <vscale x 8 x half> %m1, %m2341 %res = fsub contract <vscale x 8 x half> %acc, %mul342 ret <vscale x 8 x half> %res343}344 345define <vscale x 4 x half> @fmsb_hx4(<vscale x 4 x half> %m1, <vscale x 4 x half> %m2, <vscale x 4 x half> %acc) {346; CHECK-LABEL: fmsb_hx4:347; CHECK: // %bb.0:348; CHECK-NEXT: ptrue p0.s349; CHECK-NEXT: fmsb z0.h, p0/m, z1.h, z2.h350; CHECK-NEXT: ret351 %mul = fmul contract <vscale x 4 x half> %m1, %m2352 %res = fsub contract <vscale x 4 x half> %acc, %mul353 ret <vscale x 4 x half> %res354}355 356define <vscale x 2 x half> @fmsb_hx2(<vscale x 2 x half> %m1, <vscale x 2 x half> %m2, <vscale x 2 x half> %acc) {357; CHECK-LABEL: fmsb_hx2:358; CHECK: // %bb.0:359; CHECK-NEXT: ptrue p0.d360; CHECK-NEXT: fmsb z0.h, p0/m, z1.h, z2.h361; CHECK-NEXT: ret362 %mul = fmul contract <vscale x 2 x half> %m1, %m2363 %res = fsub contract <vscale x 2 x half> %acc, %mul364 ret <vscale x 2 x half> %res365}366 367define <vscale x 4 x float> @fmsb_s(<vscale x 4 x float> %m1, <vscale x 4 x float> %m2, <vscale x 4 x float> %acc) {368; CHECK-LABEL: fmsb_s:369; CHECK: // %bb.0:370; CHECK-NEXT: ptrue p0.s371; CHECK-NEXT: fmsb z0.s, p0/m, z1.s, z2.s372; CHECK-NEXT: ret373 %mul = fmul contract <vscale x 4 x float> %m1, %m2374 %res = fsub contract <vscale x 4 x float> %acc, %mul375 ret <vscale x 4 x float> %res376}377 378define <vscale x 2 x float> @fmsb_sx2(<vscale x 2 x float> %m1, <vscale x 2 x float> %m2, <vscale x 2 x float> %acc) {379; CHECK-LABEL: fmsb_sx2:380; CHECK: // %bb.0:381; CHECK-NEXT: ptrue p0.d382; CHECK-NEXT: fmsb z0.s, p0/m, z1.s, z2.s383; CHECK-NEXT: ret384 %mul = fmul contract <vscale x 2 x float> %m1, %m2385 %res = fsub contract <vscale x 2 x float> %acc, %mul386 ret <vscale x 2 x float> %res387}388 389define <vscale x 2 x double> @fmsb_d(<vscale x 2 x double> %m1, <vscale x 2 x double> %m2, <vscale x 2 x double> %acc) {390; CHECK-LABEL: fmsb_d:391; CHECK: // %bb.0:392; CHECK-NEXT: ptrue p0.d393; CHECK-NEXT: fmsb z0.d, p0/m, z1.d, z2.d394; CHECK-NEXT: ret395 %mul = fmul contract <vscale x 2 x double> %m1, %m2396 %res = fsub contract <vscale x 2 x double> %acc, %mul397 ret <vscale x 2 x double> %res398}399 400define <vscale x 8 x half> @fnmad_h(<vscale x 8 x half> %m1, <vscale x 8 x half> %m2, <vscale x 8 x half> %acc) {401; CHECK-LABEL: fnmad_h:402; CHECK: // %bb.0:403; CHECK-NEXT: ptrue p0.h404; CHECK-NEXT: fnmad z0.h, p0/m, z1.h, z2.h405; CHECK-NEXT: ret406 %neg_m1 = fneg contract <vscale x 8 x half> %m1407 %mul = fmul contract <vscale x 8 x half> %neg_m1, %m2408 %res = fsub contract <vscale x 8 x half> %mul, %acc409 ret <vscale x 8 x half> %res410}411 412define <vscale x 4 x half> @fnmad_hx4(<vscale x 4 x half> %m1, <vscale x 4 x half> %m2, <vscale x 4 x half> %acc) {413; CHECK-LABEL: fnmad_hx4:414; CHECK: // %bb.0:415; CHECK-NEXT: ptrue p0.s416; CHECK-NEXT: fnmad z0.h, p0/m, z1.h, z2.h417; CHECK-NEXT: ret418 %neg_m1 = fneg contract <vscale x 4 x half> %m1419 %mul = fmul contract <vscale x 4 x half> %neg_m1, %m2420 %res = fsub contract <vscale x 4 x half> %mul, %acc421 ret <vscale x 4 x half> %res422}423 424define <vscale x 2 x half> @fnmad_hx2(<vscale x 2 x half> %m1, <vscale x 2 x half> %m2, <vscale x 2 x half> %acc) {425; CHECK-LABEL: fnmad_hx2:426; CHECK: // %bb.0:427; CHECK-NEXT: ptrue p0.d428; CHECK-NEXT: fnmad z0.h, p0/m, z1.h, z2.h429; CHECK-NEXT: ret430 %neg_m1 = fneg contract <vscale x 2 x half> %m1431 %mul = fmul contract <vscale x 2 x half> %neg_m1, %m2432 %res = fsub contract <vscale x 2 x half> %mul, %acc433 ret <vscale x 2 x half> %res434}435 436define <vscale x 4 x float> @fnmad_s(<vscale x 4 x float> %m1, <vscale x 4 x float> %m2, <vscale x 4 x float> %acc) {437; CHECK-LABEL: fnmad_s:438; CHECK: // %bb.0:439; CHECK-NEXT: ptrue p0.s440; CHECK-NEXT: fnmad z0.s, p0/m, z1.s, z2.s441; CHECK-NEXT: ret442 %neg_m1 = fneg contract <vscale x 4 x float> %m1443 %mul = fmul contract <vscale x 4 x float> %neg_m1, %m2444 %res = fsub contract <vscale x 4 x float> %mul, %acc445 ret <vscale x 4 x float> %res446}447 448define <vscale x 2 x float> @fnmad_sx2(<vscale x 2 x float> %m1, <vscale x 2 x float> %m2, <vscale x 2 x float> %acc) {449; CHECK-LABEL: fnmad_sx2:450; CHECK: // %bb.0:451; CHECK-NEXT: ptrue p0.d452; CHECK-NEXT: fnmad z0.s, p0/m, z1.s, z2.s453; CHECK-NEXT: ret454 %neg_m1 = fneg contract <vscale x 2 x float> %m1455 %mul = fmul contract <vscale x 2 x float> %neg_m1, %m2456 %res = fsub contract <vscale x 2 x float> %mul, %acc457 ret <vscale x 2 x float> %res458}459 460define <vscale x 2 x double> @fnmad_d(<vscale x 2 x double> %m1, <vscale x 2 x double> %m2, <vscale x 2 x double> %acc) {461; CHECK-LABEL: fnmad_d:462; CHECK: // %bb.0:463; CHECK-NEXT: ptrue p0.d464; CHECK-NEXT: fnmad z0.d, p0/m, z1.d, z2.d465; CHECK-NEXT: ret466 %neg_m1 = fneg contract <vscale x 2 x double> %m1467 %mul = fmul contract <vscale x 2 x double> %neg_m1, %m2468 %res = fsub contract <vscale x 2 x double> %mul, %acc469 ret <vscale x 2 x double> %res470}471 472define <vscale x 8 x half> @fnmla_h(<vscale x 8 x half> %acc, <vscale x 8 x half> %m1, <vscale x 8 x half> %m2) {473; CHECK-LABEL: fnmla_h:474; CHECK: // %bb.0:475; CHECK-NEXT: ptrue p0.h476; CHECK-NEXT: fnmla z0.h, p0/m, z1.h, z2.h477; CHECK-NEXT: ret478 %neg_m1 = fneg contract <vscale x 8 x half> %m1479 %mul = fmul contract <vscale x 8 x half> %neg_m1, %m2480 %res = fsub contract <vscale x 8 x half> %mul, %acc481 ret <vscale x 8 x half> %res482}483 484define <vscale x 4 x half> @fnmla_hx4(<vscale x 4 x half> %acc, <vscale x 4 x half> %m1, <vscale x 4 x half> %m2) {485; CHECK-LABEL: fnmla_hx4:486; CHECK: // %bb.0:487; CHECK-NEXT: ptrue p0.s488; CHECK-NEXT: fnmla z0.h, p0/m, z1.h, z2.h489; CHECK-NEXT: ret490 %neg_m1 = fneg contract <vscale x 4 x half> %m1491 %mul = fmul contract <vscale x 4 x half> %neg_m1, %m2492 %res = fsub contract <vscale x 4 x half> %mul, %acc493 ret <vscale x 4 x half> %res494}495 496define <vscale x 2 x half> @fnmla_hx2(<vscale x 2 x half> %acc, <vscale x 2 x half> %m1, <vscale x 2 x half> %m2) {497; CHECK-LABEL: fnmla_hx2:498; CHECK: // %bb.0:499; CHECK-NEXT: ptrue p0.d500; CHECK-NEXT: fnmla z0.h, p0/m, z1.h, z2.h501; CHECK-NEXT: ret502 %neg_m1 = fneg contract <vscale x 2 x half> %m1503 %mul = fmul contract <vscale x 2 x half> %neg_m1, %m2504 %res = fsub contract <vscale x 2 x half> %mul, %acc505 ret <vscale x 2 x half> %res506}507 508define <vscale x 4 x float> @fnmla_s(<vscale x 4 x float> %acc, <vscale x 4 x float> %m1, <vscale x 4 x float> %m2) {509; CHECK-LABEL: fnmla_s:510; CHECK: // %bb.0:511; CHECK-NEXT: ptrue p0.s512; CHECK-NEXT: fnmla z0.s, p0/m, z1.s, z2.s513; CHECK-NEXT: ret514 %neg_m1 = fneg contract <vscale x 4 x float> %m1515 %mul = fmul contract <vscale x 4 x float> %neg_m1, %m2516 %res = fsub contract <vscale x 4 x float> %mul, %acc517 ret <vscale x 4 x float> %res518}519 520define <vscale x 2 x float> @fnmla_sx2(<vscale x 2 x float> %acc, <vscale x 2 x float> %m1, <vscale x 2 x float> %m2) {521; CHECK-LABEL: fnmla_sx2:522; CHECK: // %bb.0:523; CHECK-NEXT: ptrue p0.d524; CHECK-NEXT: fnmla z0.s, p0/m, z1.s, z2.s525; CHECK-NEXT: ret526 %neg_m1 = fneg contract <vscale x 2 x float> %m1527 %mul = fmul contract <vscale x 2 x float> %neg_m1, %m2528 %res = fsub contract <vscale x 2 x float> %mul, %acc529 ret <vscale x 2 x float> %res530}531 532define <vscale x 2 x double> @fnmla_d(<vscale x 2 x double> %acc, <vscale x 2 x double> %m1, <vscale x 2 x double> %m2) {533; CHECK-LABEL: fnmla_d:534; CHECK: // %bb.0:535; CHECK-NEXT: ptrue p0.d536; CHECK-NEXT: fnmla z0.d, p0/m, z1.d, z2.d537; CHECK-NEXT: ret538 %neg_m1 = fneg contract <vscale x 2 x double> %m1539 %mul = fmul contract <vscale x 2 x double> %neg_m1, %m2540 %res = fsub contract <vscale x 2 x double> %mul, %acc541 ret <vscale x 2 x double> %res542}543 544define <vscale x 8 x half> @fnmla_h_reversed(<vscale x 8 x half> %acc, <vscale x 8 x half> %m1, <vscale x 8 x half> %m2) {545; CHECK-LABEL: fnmla_h_reversed:546; CHECK: // %bb.0:547; CHECK-NEXT: ptrue p0.h548; CHECK-NEXT: fnmla z0.h, p0/m, z1.h, z2.h549; CHECK-NEXT: ret550 %mul = fmul contract <vscale x 8 x half> %m1, %m2551 %add = fadd contract <vscale x 8 x half> %mul, %acc552 %res = fneg contract nsz <vscale x 8 x half> %add553 ret <vscale x 8 x half> %res554}555 556define <vscale x 4 x half> @fnmla_hx4_reversed(<vscale x 4 x half> %acc, <vscale x 4 x half> %m1, <vscale x 4 x half> %m2) {557; CHECK-LABEL: fnmla_hx4_reversed:558; CHECK: // %bb.0:559; CHECK-NEXT: ptrue p0.s560; CHECK-NEXT: fnmla z0.h, p0/m, z1.h, z2.h561; CHECK-NEXT: ret562 %mul = fmul contract <vscale x 4 x half> %m1, %m2563 %add = fadd contract <vscale x 4 x half> %mul, %acc564 %res = fneg contract nsz <vscale x 4 x half> %add565 ret <vscale x 4 x half> %res566}567 568define <vscale x 2 x half> @fnmla_hx2_reversed(<vscale x 2 x half> %acc, <vscale x 2 x half> %m1, <vscale x 2 x half> %m2) {569; CHECK-LABEL: fnmla_hx2_reversed:570; CHECK: // %bb.0:571; CHECK-NEXT: ptrue p0.d572; CHECK-NEXT: fnmla z0.h, p0/m, z1.h, z2.h573; CHECK-NEXT: ret574 %mul = fmul contract <vscale x 2 x half> %m1, %m2575 %add = fadd contract <vscale x 2 x half> %mul, %acc576 %res = fneg contract nsz <vscale x 2 x half> %add577 ret <vscale x 2 x half> %res578}579 580define <vscale x 4 x float> @fnmla_s_reversed(<vscale x 4 x float> %acc, <vscale x 4 x float> %m1, <vscale x 4 x float> %m2) {581; CHECK-LABEL: fnmla_s_reversed:582; CHECK: // %bb.0:583; CHECK-NEXT: ptrue p0.s584; CHECK-NEXT: fnmla z0.s, p0/m, z1.s, z2.s585; CHECK-NEXT: ret586 %mul = fmul contract <vscale x 4 x float> %m1, %m2587 %add = fadd contract <vscale x 4 x float> %mul, %acc588 %res = fneg contract nsz <vscale x 4 x float> %add589 ret <vscale x 4 x float> %res590}591 592define <vscale x 2 x float> @fnmla_sx2_reversed(<vscale x 2 x float> %acc, <vscale x 2 x float> %m1, <vscale x 2 x float> %m2) {593; CHECK-LABEL: fnmla_sx2_reversed:594; CHECK: // %bb.0:595; CHECK-NEXT: ptrue p0.d596; CHECK-NEXT: fnmla z0.s, p0/m, z1.s, z2.s597; CHECK-NEXT: ret598 %mul = fmul contract <vscale x 2 x float> %m1, %m2599 %add = fadd contract <vscale x 2 x float> %mul, %acc600 %res = fneg contract nsz <vscale x 2 x float> %add601 ret <vscale x 2 x float> %res602}603 604define <vscale x 2 x double> @fnmla_d_reversed(<vscale x 2 x double> %acc, <vscale x 2 x double> %m1, <vscale x 2 x double> %m2) {605; CHECK-LABEL: fnmla_d_reversed:606; CHECK: // %bb.0:607; CHECK-NEXT: ptrue p0.d608; CHECK-NEXT: fnmla z0.d, p0/m, z1.d, z2.d609; CHECK-NEXT: ret610 %mul = fmul contract <vscale x 2 x double> %m1, %m2611 %add = fadd contract <vscale x 2 x double> %mul, %acc612 %res = fneg contract nsz <vscale x 2 x double> %add613 ret <vscale x 2 x double> %res614}615 616define <vscale x 8 x half> @signed_zeros_negtest_fnmla_h_reversed(<vscale x 8 x half> %acc, <vscale x 8 x half> %m1, <vscale x 8 x half> %m2) {617; CHECK-LABEL: signed_zeros_negtest_fnmla_h_reversed:618; CHECK: // %bb.0:619; CHECK-NEXT: ptrue p0.h620; CHECK-NEXT: fmla z0.h, p0/m, z1.h, z2.h621; CHECK-NEXT: fneg z0.h, p0/m, z0.h622; CHECK-NEXT: ret623 %mul = fmul contract <vscale x 8 x half> %m1, %m2624 %add = fadd contract <vscale x 8 x half> %mul, %acc625 %res = fneg contract <vscale x 8 x half> %add626 ret <vscale x 8 x half> %res627}628 629define <vscale x 4 x half> @signed_zeros_negtest_fnmla_hx4_reversed(<vscale x 4 x half> %acc, <vscale x 4 x half> %m1, <vscale x 4 x half> %m2) {630; CHECK-LABEL: signed_zeros_negtest_fnmla_hx4_reversed:631; CHECK: // %bb.0:632; CHECK-NEXT: ptrue p0.s633; CHECK-NEXT: fmla z0.h, p0/m, z1.h, z2.h634; CHECK-NEXT: fneg z0.h, p0/m, z0.h635; CHECK-NEXT: ret636 %mul = fmul contract <vscale x 4 x half> %m1, %m2637 %add = fadd contract <vscale x 4 x half> %mul, %acc638 %res = fneg contract <vscale x 4 x half> %add639 ret <vscale x 4 x half> %res640}641 642define <vscale x 2 x half> @signed_zeros_negtest_fnmla_hx2_reversed(<vscale x 2 x half> %acc, <vscale x 2 x half> %m1, <vscale x 2 x half> %m2) {643; CHECK-LABEL: signed_zeros_negtest_fnmla_hx2_reversed:644; CHECK: // %bb.0:645; CHECK-NEXT: ptrue p0.d646; CHECK-NEXT: fmla z0.h, p0/m, z1.h, z2.h647; CHECK-NEXT: fneg z0.h, p0/m, z0.h648; CHECK-NEXT: ret649 %mul = fmul contract <vscale x 2 x half> %m1, %m2650 %add = fadd contract <vscale x 2 x half> %mul, %acc651 %res = fneg contract <vscale x 2 x half> %add652 ret <vscale x 2 x half> %res653}654 655define <vscale x 4 x float> @signed_zeros_negtest_fnmla_s_reversed(<vscale x 4 x float> %acc, <vscale x 4 x float> %m1, <vscale x 4 x float> %m2) {656; CHECK-LABEL: signed_zeros_negtest_fnmla_s_reversed:657; CHECK: // %bb.0:658; CHECK-NEXT: ptrue p0.s659; CHECK-NEXT: fmla z0.s, p0/m, z1.s, z2.s660; CHECK-NEXT: fneg z0.s, p0/m, z0.s661; CHECK-NEXT: ret662 %mul = fmul contract <vscale x 4 x float> %m1, %m2663 %add = fadd contract <vscale x 4 x float> %mul, %acc664 %res = fneg contract <vscale x 4 x float> %add665 ret <vscale x 4 x float> %res666}667 668define <vscale x 2 x float> @signed_zeros_negtest_fnmla_sx2_reversed(<vscale x 2 x float> %acc, <vscale x 2 x float> %m1, <vscale x 2 x float> %m2) {669; CHECK-LABEL: signed_zeros_negtest_fnmla_sx2_reversed:670; CHECK: // %bb.0:671; CHECK-NEXT: ptrue p0.d672; CHECK-NEXT: fmla z0.s, p0/m, z1.s, z2.s673; CHECK-NEXT: fneg z0.s, p0/m, z0.s674; CHECK-NEXT: ret675 %mul = fmul contract <vscale x 2 x float> %m1, %m2676 %add = fadd contract <vscale x 2 x float> %mul, %acc677 %res = fneg contract <vscale x 2 x float> %add678 ret <vscale x 2 x float> %res679}680 681define <vscale x 2 x double> @signed_zeros_negtest_fnmla_d_reversed(<vscale x 2 x double> %acc, <vscale x 2 x double> %m1, <vscale x 2 x double> %m2) {682; CHECK-LABEL: signed_zeros_negtest_fnmla_d_reversed:683; CHECK: // %bb.0:684; CHECK-NEXT: ptrue p0.d685; CHECK-NEXT: fmla z0.d, p0/m, z1.d, z2.d686; CHECK-NEXT: fneg z0.d, p0/m, z0.d687; CHECK-NEXT: ret688 %mul = fmul contract <vscale x 2 x double> %m1, %m2689 %add = fadd contract <vscale x 2 x double> %mul, %acc690 %res = fneg contract <vscale x 2 x double> %add691 ret <vscale x 2 x double> %res692}693 694define <vscale x 8 x half> @fnmls_h(<vscale x 8 x half> %acc, <vscale x 8 x half> %m1, <vscale x 8 x half> %m2) {695; CHECK-LABEL: fnmls_h:696; CHECK: // %bb.0:697; CHECK-NEXT: ptrue p0.h698; CHECK-NEXT: fnmls z0.h, p0/m, z1.h, z2.h699; CHECK-NEXT: ret700 %mul = fmul contract <vscale x 8 x half> %m1, %m2701 %res = fsub contract <vscale x 8 x half> %mul, %acc702 ret <vscale x 8 x half> %res703}704 705define <vscale x 4 x half> @fnmls_hx4(<vscale x 4 x half> %acc, <vscale x 4 x half> %m1, <vscale x 4 x half> %m2) {706; CHECK-LABEL: fnmls_hx4:707; CHECK: // %bb.0:708; CHECK-NEXT: ptrue p0.s709; CHECK-NEXT: fnmls z0.h, p0/m, z1.h, z2.h710; CHECK-NEXT: ret711 %mul = fmul contract <vscale x 4 x half> %m1, %m2712 %res = fsub contract <vscale x 4 x half> %mul, %acc713 ret <vscale x 4 x half> %res714}715 716define <vscale x 2 x half> @fnmls_hx2(<vscale x 2 x half> %acc, <vscale x 2 x half> %m1, <vscale x 2 x half> %m2) {717; CHECK-LABEL: fnmls_hx2:718; CHECK: // %bb.0:719; CHECK-NEXT: ptrue p0.d720; CHECK-NEXT: fnmls z0.h, p0/m, z1.h, z2.h721; CHECK-NEXT: ret722 %mul = fmul contract <vscale x 2 x half> %m1, %m2723 %res = fsub contract <vscale x 2 x half> %mul, %acc724 ret <vscale x 2 x half> %res725}726 727define <vscale x 4 x float> @fnmls_s(<vscale x 4 x float> %acc, <vscale x 4 x float> %m1, <vscale x 4 x float> %m2) {728; CHECK-LABEL: fnmls_s:729; CHECK: // %bb.0:730; CHECK-NEXT: ptrue p0.s731; CHECK-NEXT: fnmls z0.s, p0/m, z1.s, z2.s732; CHECK-NEXT: ret733 %mul = fmul contract <vscale x 4 x float> %m1, %m2734 %res = fsub contract <vscale x 4 x float> %mul, %acc735 ret <vscale x 4 x float> %res736}737 738define <vscale x 2 x float> @fnmls_sx2(<vscale x 2 x float> %acc, <vscale x 2 x float> %m1, <vscale x 2 x float> %m2) {739; CHECK-LABEL: fnmls_sx2:740; CHECK: // %bb.0:741; CHECK-NEXT: ptrue p0.d742; CHECK-NEXT: fnmls z0.s, p0/m, z1.s, z2.s743; CHECK-NEXT: ret744 %mul = fmul contract <vscale x 2 x float> %m1, %m2745 %res = fsub contract <vscale x 2 x float> %mul, %acc746 ret <vscale x 2 x float> %res747}748 749define <vscale x 2 x double> @fnmls_d(<vscale x 2 x double> %acc, <vscale x 2 x double> %m1, <vscale x 2 x double> %m2) {750; CHECK-LABEL: fnmls_d:751; CHECK: // %bb.0:752; CHECK-NEXT: ptrue p0.d753; CHECK-NEXT: fnmls z0.d, p0/m, z1.d, z2.d754; CHECK-NEXT: ret755 %mul = fmul contract <vscale x 2 x double> %m1, %m2756 %res = fsub contract <vscale x 2 x double> %mul, %acc757 ret <vscale x 2 x double> %res758}759 760define <vscale x 8 x half> @fnmsb_h(<vscale x 8 x half> %m1, <vscale x 8 x half> %m2, <vscale x 8 x half> %acc) {761; CHECK-LABEL: fnmsb_h:762; CHECK: // %bb.0:763; CHECK-NEXT: ptrue p0.h764; CHECK-NEXT: fnmsb z0.h, p0/m, z1.h, z2.h765; CHECK-NEXT: ret766 %mul = fmul contract <vscale x 8 x half> %m1, %m2767 %res = fsub contract <vscale x 8 x half> %mul, %acc768 ret <vscale x 8 x half> %res769}770 771define <vscale x 4 x half> @fnmsb_hx4(<vscale x 4 x half> %m1, <vscale x 4 x half> %m2, <vscale x 4 x half> %acc) {772; CHECK-LABEL: fnmsb_hx4:773; CHECK: // %bb.0:774; CHECK-NEXT: ptrue p0.s775; CHECK-NEXT: fnmsb z0.h, p0/m, z1.h, z2.h776; CHECK-NEXT: ret777 %mul = fmul contract <vscale x 4 x half> %m1, %m2778 %res = fsub contract <vscale x 4 x half> %mul, %acc779 ret <vscale x 4 x half> %res780}781 782define <vscale x 2 x half> @fnmsb_hx2(<vscale x 2 x half> %m1, <vscale x 2 x half> %m2, <vscale x 2 x half> %acc) {783; CHECK-LABEL: fnmsb_hx2:784; CHECK: // %bb.0:785; CHECK-NEXT: ptrue p0.d786; CHECK-NEXT: fnmsb z0.h, p0/m, z1.h, z2.h787; CHECK-NEXT: ret788 %mul = fmul contract <vscale x 2 x half> %m1, %m2789 %res = fsub contract <vscale x 2 x half> %mul, %acc790 ret <vscale x 2 x half> %res791}792 793define <vscale x 4 x float> @fnmsb_s(<vscale x 4 x float> %m1, <vscale x 4 x float> %m2, <vscale x 4 x float> %acc) {794; CHECK-LABEL: fnmsb_s:795; CHECK: // %bb.0:796; CHECK-NEXT: ptrue p0.s797; CHECK-NEXT: fnmsb z0.s, p0/m, z1.s, z2.s798; CHECK-NEXT: ret799 %mul = fmul contract <vscale x 4 x float> %m1, %m2800 %res = fsub contract <vscale x 4 x float> %mul, %acc801 ret <vscale x 4 x float> %res802}803 804define <vscale x 2 x float> @fnmsb_sx2(<vscale x 2 x float> %m1, <vscale x 2 x float> %m2, <vscale x 2 x float> %acc) {805; CHECK-LABEL: fnmsb_sx2:806; CHECK: // %bb.0:807; CHECK-NEXT: ptrue p0.d808; CHECK-NEXT: fnmsb z0.s, p0/m, z1.s, z2.s809; CHECK-NEXT: ret810 %mul = fmul contract <vscale x 2 x float> %m1, %m2811 %res = fsub contract <vscale x 2 x float> %mul, %acc812 ret <vscale x 2 x float> %res813}814 815define <vscale x 2 x double> @fnmsb_d(<vscale x 2 x double> %m1, <vscale x 2 x double> %m2, <vscale x 2 x double> %acc) {816; CHECK-LABEL: fnmsb_d:817; CHECK: // %bb.0:818; CHECK-NEXT: ptrue p0.d819; CHECK-NEXT: fnmsb z0.d, p0/m, z1.d, z2.d820; CHECK-NEXT: ret821 %mul = fmul contract <vscale x 2 x double> %m1, %m2822 %res = fsub contract <vscale x 2 x double> %mul, %acc823 ret <vscale x 2 x double> %res824}825 826 827define <vscale x 8 x half> @fadd_h_sel(<vscale x 8 x half> %a, <vscale x 8 x half> %b, <vscale x 8 x i1> %mask) {828; CHECK-LABEL: fadd_h_sel:829; CHECK: // %bb.0:830; CHECK-NEXT: fadd z0.h, p0/m, z0.h, z1.h831; CHECK-NEXT: ret832 %sel = select <vscale x 8 x i1> %mask, <vscale x 8 x half> %b, <vscale x 8 x half> zeroinitializer833 %fadd = fadd nsz <vscale x 8 x half> %a, %sel834 ret <vscale x 8 x half> %fadd835}836 837define <vscale x 4 x float> @fadd_s_sel(<vscale x 4 x float> %a, <vscale x 4 x float> %b, <vscale x 4 x i1> %mask) {838; CHECK-LABEL: fadd_s_sel:839; CHECK: // %bb.0:840; CHECK-NEXT: fadd z0.s, p0/m, z0.s, z1.s841; CHECK-NEXT: ret842 %sel = select <vscale x 4 x i1> %mask, <vscale x 4 x float> %b, <vscale x 4 x float> zeroinitializer843 %fadd = fadd nsz <vscale x 4 x float> %a, %sel844 ret <vscale x 4 x float> %fadd845}846 847define <vscale x 2 x double> @fadd_d_sel(<vscale x 2 x double> %a, <vscale x 2 x double> %b, <vscale x 2 x i1> %mask) {848; CHECK-LABEL: fadd_d_sel:849; CHECK: // %bb.0:850; CHECK-NEXT: fadd z0.d, p0/m, z0.d, z1.d851; CHECK-NEXT: ret852 %sel = select <vscale x 2 x i1> %mask, <vscale x 2 x double> %b, <vscale x 2 x double> zeroinitializer853 %fadd = fadd nsz <vscale x 2 x double> %a, %sel854 ret <vscale x 2 x double> %fadd855}856 857define <vscale x 8 x half> @fsub_h_sel(<vscale x 8 x half> %a, <vscale x 8 x half> %b, <vscale x 8 x i1> %mask) {858; CHECK-LABEL: fsub_h_sel:859; CHECK: // %bb.0:860; CHECK-NEXT: fsub z0.h, p0/m, z0.h, z1.h861; CHECK-NEXT: ret862 %sel = select <vscale x 8 x i1> %mask, <vscale x 8 x half> %b, <vscale x 8 x half> zeroinitializer863 %fsub = fsub <vscale x 8 x half> %a, %sel864 ret <vscale x 8 x half> %fsub865}866 867define <vscale x 4 x float> @fsub_s_sel(<vscale x 4 x float> %a, <vscale x 4 x float> %b, <vscale x 4 x i1> %mask) {868; CHECK-LABEL: fsub_s_sel:869; CHECK: // %bb.0:870; CHECK-NEXT: fsub z0.s, p0/m, z0.s, z1.s871; CHECK-NEXT: ret872 %sel = select <vscale x 4 x i1> %mask, <vscale x 4 x float> %b, <vscale x 4 x float> zeroinitializer873 %fsub = fsub <vscale x 4 x float> %a, %sel874 ret <vscale x 4 x float> %fsub875}876 877define <vscale x 2 x double> @fsub_d_sel(<vscale x 2 x double> %a, <vscale x 2 x double> %b, <vscale x 2 x i1> %mask) {878; CHECK-LABEL: fsub_d_sel:879; CHECK: // %bb.0:880; CHECK-NEXT: fsub z0.d, p0/m, z0.d, z1.d881; CHECK-NEXT: ret882 %sel = select <vscale x 2 x i1> %mask, <vscale x 2 x double> %b, <vscale x 2 x double> zeroinitializer883 %fsub = fsub <vscale x 2 x double> %a, %sel884 ret <vscale x 2 x double> %fsub885}886 887 888 889define <vscale x 8 x half> @fadd_h_sel_negzero(<vscale x 8 x half> %a, <vscale x 8 x half> %b, <vscale x 8 x i1> %mask) {890; CHECK-LABEL: fadd_h_sel_negzero:891; CHECK: // %bb.0:892; CHECK-NEXT: fadd z0.h, p0/m, z0.h, z1.h893; CHECK-NEXT: ret894 %nz = fneg <vscale x 8 x half> zeroinitializer895 %sel = select <vscale x 8 x i1> %mask, <vscale x 8 x half> %b, <vscale x 8 x half> %nz896 %fadd = fadd <vscale x 8 x half> %a, %sel897 ret <vscale x 8 x half> %fadd898}899 900define <vscale x 4 x float> @fadd_s_sel_negzero(<vscale x 4 x float> %a, <vscale x 4 x float> %b, <vscale x 4 x i1> %mask) {901; CHECK-LABEL: fadd_s_sel_negzero:902; CHECK: // %bb.0:903; CHECK-NEXT: fadd z0.s, p0/m, z0.s, z1.s904; CHECK-NEXT: ret905 %nz = fneg <vscale x 4 x float> zeroinitializer906 %sel = select <vscale x 4 x i1> %mask, <vscale x 4 x float> %b, <vscale x 4 x float> %nz907 %fadd = fadd <vscale x 4 x float> %a, %sel908 ret <vscale x 4 x float> %fadd909}910 911define <vscale x 2 x double> @fadd_d_sel_negzero(<vscale x 2 x double> %a, <vscale x 2 x double> %b, <vscale x 2 x i1> %mask) {912; CHECK-LABEL: fadd_d_sel_negzero:913; CHECK: // %bb.0:914; CHECK-NEXT: fadd z0.d, p0/m, z0.d, z1.d915; CHECK-NEXT: ret916 %nz = fneg <vscale x 2 x double> zeroinitializer917 %sel = select <vscale x 2 x i1> %mask, <vscale x 2 x double> %b, <vscale x 2 x double> %nz918 %fadd = fadd <vscale x 2 x double> %a, %sel919 ret <vscale x 2 x double> %fadd920}921 922define <vscale x 8 x half> @fsub_h_sel_negzero(<vscale x 8 x half> %a, <vscale x 8 x half> %b, <vscale x 8 x i1> %mask) {923; CHECK-LABEL: fsub_h_sel_negzero:924; CHECK: // %bb.0:925; CHECK-NEXT: fsub z0.h, p0/m, z0.h, z1.h926; CHECK-NEXT: ret927 %nz = fneg <vscale x 8 x half> zeroinitializer928 %sel = select <vscale x 8 x i1> %mask, <vscale x 8 x half> %b, <vscale x 8 x half> %nz929 %fsub = fsub nsz <vscale x 8 x half> %a, %sel930 ret <vscale x 8 x half> %fsub931}932 933define <vscale x 4 x float> @fsub_s_sel_negzero(<vscale x 4 x float> %a, <vscale x 4 x float> %b, <vscale x 4 x i1> %mask) {934; CHECK-LABEL: fsub_s_sel_negzero:935; CHECK: // %bb.0:936; CHECK-NEXT: fsub z0.s, p0/m, z0.s, z1.s937; CHECK-NEXT: ret938 %nz = fneg <vscale x 4 x float> zeroinitializer939 %sel = select <vscale x 4 x i1> %mask, <vscale x 4 x float> %b, <vscale x 4 x float> %nz940 %fsub = fsub nsz <vscale x 4 x float> %a, %sel941 ret <vscale x 4 x float> %fsub942}943 944define <vscale x 2 x double> @fsub_d_sel_negzero(<vscale x 2 x double> %a, <vscale x 2 x double> %b, <vscale x 2 x i1> %mask) {945; CHECK-LABEL: fsub_d_sel_negzero:946; CHECK: // %bb.0:947; CHECK-NEXT: fsub z0.d, p0/m, z0.d, z1.d948; CHECK-NEXT: ret949 %nz = fneg <vscale x 2 x double> zeroinitializer950 %sel = select <vscale x 2 x i1> %mask, <vscale x 2 x double> %b, <vscale x 2 x double> %nz951 %fsub = fsub nsz <vscale x 2 x double> %a, %sel952 ret <vscale x 2 x double> %fsub953}954 955 956define <vscale x 8 x half> @fadd_sel_fmul_h(<vscale x 8 x half> %a, <vscale x 8 x half> %b, <vscale x 8 x half> %c, <vscale x 8 x i1> %mask) {957; CHECK-LABEL: fadd_sel_fmul_h:958; CHECK: // %bb.0:959; CHECK-NEXT: movi v3.2d, #0000000000000000960; CHECK-NEXT: fmul z1.h, z1.h, z2.h961; CHECK-NEXT: sel z1.h, p0, z1.h, z3.h962; CHECK-NEXT: fadd z0.h, z0.h, z1.h963; CHECK-NEXT: ret964 %fmul = fmul <vscale x 8 x half> %b, %c965 %sel = select <vscale x 8 x i1> %mask, <vscale x 8 x half> %fmul, <vscale x 8 x half> zeroinitializer966 %fadd = fadd contract <vscale x 8 x half> %a, %sel967 ret <vscale x 8 x half> %fadd968}969 970define <vscale x 4 x float> @fadd_sel_fmul_s(<vscale x 4 x float> %a, <vscale x 4 x float> %b, <vscale x 4 x float> %c, <vscale x 4 x i1> %mask) {971; CHECK-LABEL: fadd_sel_fmul_s:972; CHECK: // %bb.0:973; CHECK-NEXT: movi v3.2d, #0000000000000000974; CHECK-NEXT: fmul z1.s, z1.s, z2.s975; CHECK-NEXT: sel z1.s, p0, z1.s, z3.s976; CHECK-NEXT: fadd z0.s, z0.s, z1.s977; CHECK-NEXT: ret978 %fmul = fmul <vscale x 4 x float> %b, %c979 %sel = select <vscale x 4 x i1> %mask, <vscale x 4 x float> %fmul, <vscale x 4 x float> zeroinitializer980 %fadd = fadd contract <vscale x 4 x float> %a, %sel981 ret <vscale x 4 x float> %fadd982}983 984define <vscale x 2 x double> @fadd_sel_fmul_d(<vscale x 2 x double> %a, <vscale x 2 x double> %b, <vscale x 2 x double> %c, <vscale x 2 x i1> %mask) {985; CHECK-LABEL: fadd_sel_fmul_d:986; CHECK: // %bb.0:987; CHECK-NEXT: movi v3.2d, #0000000000000000988; CHECK-NEXT: fmul z1.d, z1.d, z2.d989; CHECK-NEXT: sel z1.d, p0, z1.d, z3.d990; CHECK-NEXT: fadd z0.d, z0.d, z1.d991; CHECK-NEXT: ret992 %fmul = fmul <vscale x 2 x double> %b, %c993 %sel = select <vscale x 2 x i1> %mask, <vscale x 2 x double> %fmul, <vscale x 2 x double> zeroinitializer994 %fadd = fadd contract <vscale x 2 x double> %a, %sel995 ret <vscale x 2 x double> %fadd996}997 998define <vscale x 8 x half> @fsub_sel_fmul_h(<vscale x 8 x half> %a, <vscale x 8 x half> %b, <vscale x 8 x half> %c, <vscale x 8 x i1> %mask) {999; CHECK-LABEL: fsub_sel_fmul_h:1000; CHECK: // %bb.0:1001; CHECK-NEXT: fmls z0.h, p0/m, z1.h, z2.h1002; CHECK-NEXT: ret1003 %fmul = fmul <vscale x 8 x half> %b, %c1004 %sel = select <vscale x 8 x i1> %mask, <vscale x 8 x half> %fmul, <vscale x 8 x half> zeroinitializer1005 %fsub = fsub contract <vscale x 8 x half> %a, %sel1006 ret <vscale x 8 x half> %fsub1007}1008 1009define <vscale x 4 x float> @fsub_sel_fmul_s(<vscale x 4 x float> %a, <vscale x 4 x float> %b, <vscale x 4 x float> %c, <vscale x 4 x i1> %mask) {1010; CHECK-LABEL: fsub_sel_fmul_s:1011; CHECK: // %bb.0:1012; CHECK-NEXT: fmls z0.s, p0/m, z1.s, z2.s1013; CHECK-NEXT: ret1014 %fmul = fmul <vscale x 4 x float> %b, %c1015 %sel = select <vscale x 4 x i1> %mask, <vscale x 4 x float> %fmul, <vscale x 4 x float> zeroinitializer1016 %fsub = fsub contract <vscale x 4 x float> %a, %sel1017 ret <vscale x 4 x float> %fsub1018}1019 1020define <vscale x 2 x double> @fsub_sel_fmul_d(<vscale x 2 x double> %a, <vscale x 2 x double> %b, <vscale x 2 x double> %c, <vscale x 2 x i1> %mask) {1021; CHECK-LABEL: fsub_sel_fmul_d:1022; CHECK: // %bb.0:1023; CHECK-NEXT: fmls z0.d, p0/m, z1.d, z2.d1024; CHECK-NEXT: ret1025 %fmul = fmul <vscale x 2 x double> %b, %c1026 %sel = select <vscale x 2 x i1> %mask, <vscale x 2 x double> %fmul, <vscale x 2 x double> zeroinitializer1027 %fsub = fsub contract <vscale x 2 x double> %a, %sel1028 ret <vscale x 2 x double> %fsub1029}1030 1031define <vscale x 8 x half> @fadd_sel_fmul_h_nsz(<vscale x 8 x half> %a, <vscale x 8 x half> %b, <vscale x 8 x half> %c, <vscale x 8 x i1> %mask) {1032; CHECK-LABEL: fadd_sel_fmul_h_nsz:1033; CHECK: // %bb.0:1034; CHECK-NEXT: fmla z0.h, p0/m, z1.h, z2.h1035; CHECK-NEXT: ret1036 %fmul = fmul <vscale x 8 x half> %b, %c1037 %sel = select <vscale x 8 x i1> %mask, <vscale x 8 x half> %fmul, <vscale x 8 x half> zeroinitializer1038 %fadd = fadd nsz contract <vscale x 8 x half> %a, %sel1039 ret <vscale x 8 x half> %fadd1040}1041 1042define <vscale x 4 x float> @fadd_sel_fmul_s_nsz(<vscale x 4 x float> %a, <vscale x 4 x float> %b, <vscale x 4 x float> %c, <vscale x 4 x i1> %mask) {1043; CHECK-LABEL: fadd_sel_fmul_s_nsz:1044; CHECK: // %bb.0:1045; CHECK-NEXT: fmla z0.s, p0/m, z1.s, z2.s1046; CHECK-NEXT: ret1047 %fmul = fmul <vscale x 4 x float> %b, %c1048 %sel = select <vscale x 4 x i1> %mask, <vscale x 4 x float> %fmul, <vscale x 4 x float> zeroinitializer1049 %fadd = fadd nsz contract <vscale x 4 x float> %a, %sel1050 ret <vscale x 4 x float> %fadd1051}1052 1053define <vscale x 2 x double> @fadd_sel_fmul_d_nsz(<vscale x 2 x double> %a, <vscale x 2 x double> %b, <vscale x 2 x double> %c, <vscale x 2 x i1> %mask) {1054; CHECK-LABEL: fadd_sel_fmul_d_nsz:1055; CHECK: // %bb.0:1056; CHECK-NEXT: fmla z0.d, p0/m, z1.d, z2.d1057; CHECK-NEXT: ret1058 %fmul = fmul <vscale x 2 x double> %b, %c1059 %sel = select <vscale x 2 x i1> %mask, <vscale x 2 x double> %fmul, <vscale x 2 x double> zeroinitializer1060 %fadd = fadd nsz contract <vscale x 2 x double> %a, %sel1061 ret <vscale x 2 x double> %fadd1062}1063 1064define <vscale x 8 x half> @fsub_sel_fmul_h_nsz(<vscale x 8 x half> %a, <vscale x 8 x half> %b, <vscale x 8 x half> %c, <vscale x 8 x i1> %mask) {1065; CHECK-LABEL: fsub_sel_fmul_h_nsz:1066; CHECK: // %bb.0:1067; CHECK-NEXT: fmls z0.h, p0/m, z1.h, z2.h1068; CHECK-NEXT: ret1069 %fmul = fmul <vscale x 8 x half> %b, %c1070 %sel = select <vscale x 8 x i1> %mask, <vscale x 8 x half> %fmul, <vscale x 8 x half> zeroinitializer1071 %fsub = fsub nsz contract <vscale x 8 x half> %a, %sel1072 ret <vscale x 8 x half> %fsub1073}1074 1075define <vscale x 4 x float> @fsub_sel_fmul_s_nsz(<vscale x 4 x float> %a, <vscale x 4 x float> %b, <vscale x 4 x float> %c, <vscale x 4 x i1> %mask) {1076; CHECK-LABEL: fsub_sel_fmul_s_nsz:1077; CHECK: // %bb.0:1078; CHECK-NEXT: fmls z0.s, p0/m, z1.s, z2.s1079; CHECK-NEXT: ret1080 %fmul = fmul <vscale x 4 x float> %b, %c1081 %sel = select <vscale x 4 x i1> %mask, <vscale x 4 x float> %fmul, <vscale x 4 x float> zeroinitializer1082 %fsub = fsub nsz contract <vscale x 4 x float> %a, %sel1083 ret <vscale x 4 x float> %fsub1084}1085 1086define <vscale x 2 x double> @fsub_sel_fmul_d_nsz(<vscale x 2 x double> %a, <vscale x 2 x double> %b, <vscale x 2 x double> %c, <vscale x 2 x i1> %mask) {1087; CHECK-LABEL: fsub_sel_fmul_d_nsz:1088; CHECK: // %bb.0:1089; CHECK-NEXT: fmls z0.d, p0/m, z1.d, z2.d1090; CHECK-NEXT: ret1091 %fmul = fmul <vscale x 2 x double> %b, %c1092 %sel = select <vscale x 2 x i1> %mask, <vscale x 2 x double> %fmul, <vscale x 2 x double> zeroinitializer1093 %fsub = fsub nsz contract <vscale x 2 x double> %a, %sel1094 ret <vscale x 2 x double> %fsub1095}1096 1097 1098define <vscale x 8 x half> @fadd_sel_fmul_h_negzero(<vscale x 8 x half> %a, <vscale x 8 x half> %b, <vscale x 8 x half> %c, <vscale x 8 x i1> %mask) {1099; CHECK-LABEL: fadd_sel_fmul_h_negzero:1100; CHECK: // %bb.0:1101; CHECK-NEXT: fmla z0.h, p0/m, z1.h, z2.h1102; CHECK-NEXT: ret1103 %fmul = fmul <vscale x 8 x half> %b, %c1104 %nz = fneg <vscale x 8 x half> zeroinitializer1105 %sel = select <vscale x 8 x i1> %mask, <vscale x 8 x half> %fmul, <vscale x 8 x half> %nz1106 %fadd = fadd contract <vscale x 8 x half> %a, %sel1107 ret <vscale x 8 x half> %fadd1108}1109 1110define <vscale x 4 x float> @fadd_sel_fmul_s_negzero(<vscale x 4 x float> %a, <vscale x 4 x float> %b, <vscale x 4 x float> %c, <vscale x 4 x i1> %mask) {1111; CHECK-LABEL: fadd_sel_fmul_s_negzero:1112; CHECK: // %bb.0:1113; CHECK-NEXT: fmla z0.s, p0/m, z1.s, z2.s1114; CHECK-NEXT: ret1115 %fmul = fmul <vscale x 4 x float> %b, %c1116 %nz = fneg <vscale x 4 x float> zeroinitializer1117 %sel = select <vscale x 4 x i1> %mask, <vscale x 4 x float> %fmul, <vscale x 4 x float> %nz1118 %fadd = fadd contract <vscale x 4 x float> %a, %sel1119 ret <vscale x 4 x float> %fadd1120}1121 1122define <vscale x 2 x double> @fadd_sel_fmul_d_negzero(<vscale x 2 x double> %a, <vscale x 2 x double> %b, <vscale x 2 x double> %c, <vscale x 2 x i1> %mask) {1123; CHECK-LABEL: fadd_sel_fmul_d_negzero:1124; CHECK: // %bb.0:1125; CHECK-NEXT: fmla z0.d, p0/m, z1.d, z2.d1126; CHECK-NEXT: ret1127 %fmul = fmul <vscale x 2 x double> %b, %c1128 %nz = fneg <vscale x 2 x double> zeroinitializer1129 %sel = select <vscale x 2 x i1> %mask, <vscale x 2 x double> %fmul, <vscale x 2 x double> %nz1130 %fadd = fadd contract <vscale x 2 x double> %a, %sel1131 ret <vscale x 2 x double> %fadd1132}1133 1134define <vscale x 8 x half> @fsub_sel_fmul_h_negzero(<vscale x 8 x half> %a, <vscale x 8 x half> %b, <vscale x 8 x half> %c, <vscale x 8 x i1> %mask) {1135; CHECK-LABEL: fsub_sel_fmul_h_negzero:1136; CHECK: // %bb.0:1137; CHECK-NEXT: dupm z3.h, #0x80001138; CHECK-NEXT: fmul z1.h, z1.h, z2.h1139; CHECK-NEXT: sel z1.h, p0, z1.h, z3.h1140; CHECK-NEXT: fsub z0.h, z0.h, z1.h1141; CHECK-NEXT: ret1142 %fmul = fmul <vscale x 8 x half> %b, %c1143 %nz = fneg <vscale x 8 x half> zeroinitializer1144 %sel = select <vscale x 8 x i1> %mask, <vscale x 8 x half> %fmul, <vscale x 8 x half> %nz1145 %fsub = fsub contract <vscale x 8 x half> %a, %sel1146 ret <vscale x 8 x half> %fsub1147}1148 1149define <vscale x 4 x float> @fsub_sel_fmul_s_negzero(<vscale x 4 x float> %a, <vscale x 4 x float> %b, <vscale x 4 x float> %c, <vscale x 4 x i1> %mask) {1150; CHECK-LABEL: fsub_sel_fmul_s_negzero:1151; CHECK: // %bb.0:1152; CHECK-NEXT: mov z3.s, #0x800000001153; CHECK-NEXT: fmul z1.s, z1.s, z2.s1154; CHECK-NEXT: sel z1.s, p0, z1.s, z3.s1155; CHECK-NEXT: fsub z0.s, z0.s, z1.s1156; CHECK-NEXT: ret1157 %fmul = fmul <vscale x 4 x float> %b, %c1158 %nz = fneg <vscale x 4 x float> zeroinitializer1159 %sel = select <vscale x 4 x i1> %mask, <vscale x 4 x float> %fmul, <vscale x 4 x float> %nz1160 %fsub = fsub contract <vscale x 4 x float> %a, %sel1161 ret <vscale x 4 x float> %fsub1162}1163 1164define <vscale x 2 x double> @fsub_sel_fmul_d_negzero(<vscale x 2 x double> %a, <vscale x 2 x double> %b, <vscale x 2 x double> %c, <vscale x 2 x i1> %mask) {1165; CHECK-LABEL: fsub_sel_fmul_d_negzero:1166; CHECK: // %bb.0:1167; CHECK-NEXT: mov z3.d, #0x80000000000000001168; CHECK-NEXT: fmul z1.d, z1.d, z2.d1169; CHECK-NEXT: sel z1.d, p0, z1.d, z3.d1170; CHECK-NEXT: fsub z0.d, z0.d, z1.d1171; CHECK-NEXT: ret1172 %fmul = fmul <vscale x 2 x double> %b, %c1173 %nz = fneg <vscale x 2 x double> zeroinitializer1174 %sel = select <vscale x 2 x i1> %mask, <vscale x 2 x double> %fmul, <vscale x 2 x double> %nz1175 %fsub = fsub contract <vscale x 2 x double> %a, %sel1176 ret <vscale x 2 x double> %fsub1177}1178 1179 1180 1181define <vscale x 8 x half> @fadd_sel_fmul_h_negzero_nsz(<vscale x 8 x half> %a, <vscale x 8 x half> %b, <vscale x 8 x half> %c, <vscale x 8 x i1> %mask) {1182; CHECK-LABEL: fadd_sel_fmul_h_negzero_nsz:1183; CHECK: // %bb.0:1184; CHECK-NEXT: fmla z0.h, p0/m, z1.h, z2.h1185; CHECK-NEXT: ret1186 %fmul = fmul <vscale x 8 x half> %b, %c1187 %nz = fneg <vscale x 8 x half> zeroinitializer1188 %sel = select <vscale x 8 x i1> %mask, <vscale x 8 x half> %fmul, <vscale x 8 x half> %nz1189 %fadd = fadd nsz contract <vscale x 8 x half> %a, %sel1190 ret <vscale x 8 x half> %fadd1191}1192 1193define <vscale x 4 x float> @fadd_sel_fmul_s_negzero_nsz(<vscale x 4 x float> %a, <vscale x 4 x float> %b, <vscale x 4 x float> %c, <vscale x 4 x i1> %mask) {1194; CHECK-LABEL: fadd_sel_fmul_s_negzero_nsz:1195; CHECK: // %bb.0:1196; CHECK-NEXT: fmla z0.s, p0/m, z1.s, z2.s1197; CHECK-NEXT: ret1198 %fmul = fmul <vscale x 4 x float> %b, %c1199 %nz = fneg <vscale x 4 x float> zeroinitializer1200 %sel = select <vscale x 4 x i1> %mask, <vscale x 4 x float> %fmul, <vscale x 4 x float> %nz1201 %fadd = fadd nsz contract <vscale x 4 x float> %a, %sel1202 ret <vscale x 4 x float> %fadd1203}1204 1205define <vscale x 2 x double> @fadd_sel_fmul_d_negzero_nsz(<vscale x 2 x double> %a, <vscale x 2 x double> %b, <vscale x 2 x double> %c, <vscale x 2 x i1> %mask) {1206; CHECK-LABEL: fadd_sel_fmul_d_negzero_nsz:1207; CHECK: // %bb.0:1208; CHECK-NEXT: fmla z0.d, p0/m, z1.d, z2.d1209; CHECK-NEXT: ret1210 %fmul = fmul <vscale x 2 x double> %b, %c1211 %nz = fneg <vscale x 2 x double> zeroinitializer1212 %sel = select <vscale x 2 x i1> %mask, <vscale x 2 x double> %fmul, <vscale x 2 x double> %nz1213 %fadd = fadd nsz contract <vscale x 2 x double> %a, %sel1214 ret <vscale x 2 x double> %fadd1215}1216 1217define <vscale x 8 x half> @fsub_sel_fmul_h_negzero_nsz(<vscale x 8 x half> %a, <vscale x 8 x half> %b, <vscale x 8 x half> %c, <vscale x 8 x i1> %mask) {1218; CHECK-LABEL: fsub_sel_fmul_h_negzero_nsz:1219; CHECK: // %bb.0:1220; CHECK-NEXT: fmls z0.h, p0/m, z1.h, z2.h1221; CHECK-NEXT: ret1222 %fmul = fmul <vscale x 8 x half> %b, %c1223 %nz = fneg <vscale x 8 x half> zeroinitializer1224 %sel = select <vscale x 8 x i1> %mask, <vscale x 8 x half> %fmul, <vscale x 8 x half> %nz1225 %fsub = fsub nsz contract <vscale x 8 x half> %a, %sel1226 ret <vscale x 8 x half> %fsub1227}1228 1229define <vscale x 4 x float> @fsub_sel_fmul_s_negzero_nsz(<vscale x 4 x float> %a, <vscale x 4 x float> %b, <vscale x 4 x float> %c, <vscale x 4 x i1> %mask) {1230; CHECK-LABEL: fsub_sel_fmul_s_negzero_nsz:1231; CHECK: // %bb.0:1232; CHECK-NEXT: fmls z0.s, p0/m, z1.s, z2.s1233; CHECK-NEXT: ret1234 %fmul = fmul <vscale x 4 x float> %b, %c1235 %nz = fneg <vscale x 4 x float> zeroinitializer1236 %sel = select <vscale x 4 x i1> %mask, <vscale x 4 x float> %fmul, <vscale x 4 x float> %nz1237 %fsub = fsub nsz contract <vscale x 4 x float> %a, %sel1238 ret <vscale x 4 x float> %fsub1239}1240 1241define <vscale x 2 x double> @fsub_sel_fmul_d_negzero_nsz(<vscale x 2 x double> %a, <vscale x 2 x double> %b, <vscale x 2 x double> %c, <vscale x 2 x i1> %mask) {1242; CHECK-LABEL: fsub_sel_fmul_d_negzero_nsz:1243; CHECK: // %bb.0:1244; CHECK-NEXT: fmls z0.d, p0/m, z1.d, z2.d1245; CHECK-NEXT: ret1246 %fmul = fmul <vscale x 2 x double> %b, %c1247 %nz = fneg <vscale x 2 x double> zeroinitializer1248 %sel = select <vscale x 2 x i1> %mask, <vscale x 2 x double> %fmul, <vscale x 2 x double> %nz1249 %fsub = fsub nsz contract <vscale x 2 x double> %a, %sel1250 ret <vscale x 2 x double> %fsub1251}1252 1253 1254 1255; Verify combine requires contract fast-math flag.1256define <vscale x 4 x float> @fadd_sel_fmul_no_contract_s(<vscale x 4 x float> %a, <vscale x 4 x float> %b, <vscale x 4 x float> %c, <vscale x 4 x i1> %mask) {1257; CHECK-LABEL: fadd_sel_fmul_no_contract_s:1258; CHECK: // %bb.0:1259; CHECK-NEXT: fmul z1.s, z1.s, z2.s1260; CHECK-NEXT: fadd z0.s, p0/m, z0.s, z1.s1261; CHECK-NEXT: ret1262 %fmul = fmul <vscale x 4 x float> %b, %c1263 %sel = select <vscale x 4 x i1> %mask, <vscale x 4 x float> %fmul, <vscale x 4 x float> zeroinitializer1264 %fadd = fadd nsz <vscale x 4 x float> %a, %sel1265 ret <vscale x 4 x float> %fadd1266}1267 1268define <vscale x 8 x half> @fma_sel_h_different_arg_order(<vscale x 8 x i1> %pred, <vscale x 8 x half> %m1, <vscale x 8 x half> %m2, <vscale x 8 x half> %acc) {1269; CHECK-LABEL: fma_sel_h_different_arg_order:1270; CHECK: // %bb.0:1271; CHECK-NEXT: fmla z2.h, p0/m, z0.h, z1.h1272; CHECK-NEXT: mov z0.d, z2.d1273; CHECK-NEXT: ret1274 %mul.add = call <vscale x 8 x half> @llvm.fma.nxv8f16(<vscale x 8 x half> %m1, <vscale x 8 x half> %m2, <vscale x 8 x half> %acc)1275 %masked.mul.add = select <vscale x 8 x i1> %pred, <vscale x 8 x half> %mul.add, <vscale x 8 x half> %acc1276 ret <vscale x 8 x half> %masked.mul.add1277}1278 1279define <vscale x 4 x float> @fma_sel_s_different_arg_order(<vscale x 4 x i1> %pred, <vscale x 4 x float> %m1, <vscale x 4 x float> %m2, <vscale x 4 x float> %acc) {1280; CHECK-LABEL: fma_sel_s_different_arg_order:1281; CHECK: // %bb.0:1282; CHECK-NEXT: fmla z2.s, p0/m, z0.s, z1.s1283; CHECK-NEXT: mov z0.d, z2.d1284; CHECK-NEXT: ret1285 %mul.add = call <vscale x 4 x float> @llvm.fma.nxv4f32(<vscale x 4 x float> %m1, <vscale x 4 x float> %m2, <vscale x 4 x float> %acc)1286 %masked.mul.add = select <vscale x 4 x i1> %pred, <vscale x 4 x float> %mul.add, <vscale x 4 x float> %acc1287 ret <vscale x 4 x float> %masked.mul.add1288}1289 1290define <vscale x 2 x double> @fma_sel_d_different_arg_order(<vscale x 2 x i1> %pred, <vscale x 2 x double> %m1, <vscale x 2 x double> %m2, <vscale x 2 x double> %acc) {1291; CHECK-LABEL: fma_sel_d_different_arg_order:1292; CHECK: // %bb.0:1293; CHECK-NEXT: fmla z2.d, p0/m, z0.d, z1.d1294; CHECK-NEXT: mov z0.d, z2.d1295; CHECK-NEXT: ret1296 %mul.add = call <vscale x 2 x double> @llvm.fma.nxv2f64(<vscale x 2 x double> %m1, <vscale x 2 x double> %m2, <vscale x 2 x double> %acc)1297 %masked.mul.add = select <vscale x 2 x i1> %pred, <vscale x 2 x double> %mul.add, <vscale x 2 x double> %acc1298 ret <vscale x 2 x double> %masked.mul.add1299}1300 1301define <vscale x 8 x half> @fnma_sel_h_different_arg_order(<vscale x 8 x i1> %pred, <vscale x 8 x half> %m1, <vscale x 8 x half> %m2, <vscale x 8 x half> %acc) {1302; CHECK-LABEL: fnma_sel_h_different_arg_order:1303; CHECK: // %bb.0:1304; CHECK-NEXT: fmls z2.h, p0/m, z0.h, z1.h1305; CHECK-NEXT: mov z0.d, z2.d1306; CHECK-NEXT: ret1307 %neg_m1 = fneg contract <vscale x 8 x half> %m11308 %mul.add = call <vscale x 8 x half> @llvm.fma.nxv8f16(<vscale x 8 x half> %neg_m1, <vscale x 8 x half> %m2, <vscale x 8 x half> %acc)1309 %masked.mul.add = select <vscale x 8 x i1> %pred, <vscale x 8 x half> %mul.add, <vscale x 8 x half> %acc1310 ret <vscale x 8 x half> %masked.mul.add1311}1312 1313define <vscale x 4 x float> @fnma_sel_s_different_arg_order(<vscale x 4 x i1> %pred, <vscale x 4 x float> %m1, <vscale x 4 x float> %m2, <vscale x 4 x float> %acc) {1314; CHECK-LABEL: fnma_sel_s_different_arg_order:1315; CHECK: // %bb.0:1316; CHECK-NEXT: fmls z2.s, p0/m, z0.s, z1.s1317; CHECK-NEXT: mov z0.d, z2.d1318; CHECK-NEXT: ret1319 %neg_m1 = fneg contract <vscale x 4 x float> %m11320 %mul.add = call <vscale x 4 x float> @llvm.fma.nxv4f32(<vscale x 4 x float> %neg_m1, <vscale x 4 x float> %m2, <vscale x 4 x float> %acc)1321 %masked.mul.add = select <vscale x 4 x i1> %pred, <vscale x 4 x float> %mul.add, <vscale x 4 x float> %acc1322 ret <vscale x 4 x float> %masked.mul.add1323}1324 1325define <vscale x 2 x double> @fnma_sel_d_different_arg_order(<vscale x 2 x i1> %pred, <vscale x 2 x double> %m1, <vscale x 2 x double> %m2, <vscale x 2 x double> %acc) {1326; CHECK-LABEL: fnma_sel_d_different_arg_order:1327; CHECK: // %bb.0:1328; CHECK-NEXT: fmls z2.d, p0/m, z0.d, z1.d1329; CHECK-NEXT: mov z0.d, z2.d1330; CHECK-NEXT: ret1331 %neg_m1 = fneg contract <vscale x 2 x double> %m11332 %mul.add = call <vscale x 2 x double> @llvm.fma.nxv2f64(<vscale x 2 x double> %neg_m1, <vscale x 2 x double> %m2, <vscale x 2 x double> %acc)1333 %masked.mul.add = select <vscale x 2 x i1> %pred, <vscale x 2 x double> %mul.add, <vscale x 2 x double> %acc1334 ret <vscale x 2 x double> %masked.mul.add1335}1336 1337declare <vscale x 8 x half> @llvm.fma.nxv8f16(<vscale x 8 x half>, <vscale x 8 x half>, <vscale x 8 x half>)1338declare <vscale x 4 x float> @llvm.fma.nxv4f32(<vscale x 4 x float>, <vscale x 4 x float>, <vscale x 4 x float>)1339declare <vscale x 2 x double> @llvm.fma.nxv2f64(<vscale x 2 x double>, <vscale x 2 x double>, <vscale x 2 x double>)1340