diff --git a/llvm/test/CodeGen/AArch64/sve-masked-int-arith.ll b/llvm/test/CodeGen/AArch64/sve-masked-int-arith.ll index e53239079fd87..b28f7e2d5f5a1 100644 --- a/llvm/test/CodeGen/AArch64/sve-masked-int-arith.ll +++ b/llvm/test/CodeGen/AArch64/sve-masked-int-arith.ll @@ -88,3 +88,115 @@ define @masked_sub_nxv2i64( %a, %a, %select ret %ret } + +; +; Masked multiply-add +; + +define @masked_mla_nxv16i8( %a, %b, %c, %mask) { +; CHECK-LABEL: masked_mla_nxv16i8: +; CHECK: // %bb.0: +; CHECK-NEXT: ptrue p1.b +; CHECK-NEXT: mul z1.b, p1/m, z1.b, z2.b +; CHECK-NEXT: add z0.b, p0/m, z0.b, z1.b +; CHECK-NEXT: ret + %mul = mul nsw %b, %c + %sel = select %mask, %mul, zeroinitializer + %add = add %a, %sel + ret %add +} + +define @masked_mla_nxv8i16( %a, %b, %c, %mask) { +; CHECK-LABEL: masked_mla_nxv8i16: +; CHECK: // %bb.0: +; CHECK-NEXT: ptrue p1.h +; CHECK-NEXT: mul z1.h, p1/m, z1.h, z2.h +; CHECK-NEXT: add z0.h, p0/m, z0.h, z1.h +; CHECK-NEXT: ret + %mul = mul nsw %b, %c + %sel = select %mask, %mul, zeroinitializer + %add = add %a, %sel + ret %add +} + +define @masked_mla_nxv4i32( %a, %b, %c, %mask) { +; CHECK-LABEL: masked_mla_nxv4i32: +; CHECK: // %bb.0: +; CHECK-NEXT: ptrue p1.s +; CHECK-NEXT: mul z1.s, p1/m, z1.s, z2.s +; CHECK-NEXT: add z0.s, p0/m, z0.s, z1.s +; CHECK-NEXT: ret + %mul = mul nsw %b, %c + %sel = select %mask, %mul, zeroinitializer + %add = add %a, %sel + ret %add +} + +define @masked_mla_nxv2i64( %a, %b, %c, %mask) { +; CHECK-LABEL: masked_mla_nxv2i64: +; CHECK: // %bb.0: +; CHECK-NEXT: ptrue p1.d +; CHECK-NEXT: mul z1.d, p1/m, z1.d, z2.d +; CHECK-NEXT: add z0.d, p0/m, z0.d, z1.d +; CHECK-NEXT: ret + %mul = mul nsw %b, %c + %sel = select %mask, %mul, zeroinitializer + %add = add %a, %sel + ret %add +} + +; +; Masked multiply-subtract +; + +define @masked_mls_nxv16i8( %a, %b, %c, %mask) { +; CHECK-LABEL: masked_mls_nxv16i8: +; CHECK: // %bb.0: +; CHECK-NEXT: ptrue p1.b +; CHECK-NEXT: mul z1.b, p1/m, z1.b, z2.b +; CHECK-NEXT: sub z0.b, p0/m, z0.b, z1.b +; CHECK-NEXT: ret + %mul = mul nsw %b, %c + %sel = select %mask, %mul, zeroinitializer + %sub = sub %a, %sel + ret %sub +} + +define @masked_mls_nxv8i16( %a, %b, %c, %mask) { +; CHECK-LABEL: masked_mls_nxv8i16: +; CHECK: // %bb.0: +; CHECK-NEXT: ptrue p1.h +; CHECK-NEXT: mul z1.h, p1/m, z1.h, z2.h +; CHECK-NEXT: sub z0.h, p0/m, z0.h, z1.h +; CHECK-NEXT: ret + %mul = mul nsw %b, %c + %sel = select %mask, %mul, zeroinitializer + %sub = sub %a, %sel + ret %sub +} + +define @masked_mls_nxv4i32( %a, %b, %c, %mask) { +; CHECK-LABEL: masked_mls_nxv4i32: +; CHECK: // %bb.0: +; CHECK-NEXT: ptrue p1.s +; CHECK-NEXT: mul z1.s, p1/m, z1.s, z2.s +; CHECK-NEXT: sub z0.s, p0/m, z0.s, z1.s +; CHECK-NEXT: ret + %mul = mul nsw %b, %c + %sel = select %mask, %mul, zeroinitializer + %sub = sub %a, %sel + ret %sub +} + +define @masked_mls_nxv2i64( %a, %b, %c, %mask) { +; CHECK-LABEL: masked_mls_nxv2i64: +; CHECK: // %bb.0: +; CHECK-NEXT: ptrue p1.d +; CHECK-NEXT: mul z1.d, p1/m, z1.d, z2.d +; CHECK-NEXT: sub z0.d, p0/m, z0.d, z1.d +; CHECK-NEXT: ret + %mul = mul nsw %b, %c + %sel = select %mask, %mul, zeroinitializer + %sub = sub %a, %sel + ret %sub +}