From e55b536d7d810393f0a03c800e8263d83926090c Mon Sep 17 00:00:00 2001 From: Danilo Carvalho Grael Date: Wed, 6 Nov 2019 17:02:58 -0500 Subject: [AArch64][SVE] Add remaining patterns and intrinsics for add/sub/mad patterns Add pattern matching and intrinsics for the following instructions: predicated orr, eor, and, bic predicated mul, smulh, umulh, sdiv, udiv, sdivr, udivr predicated smax, umax, smin, umin, sabd, uabd mad, msb, mla, mls https://reviews.llvm.org/D69588 --- llvm/test/CodeGen/AArch64/sve-int-arith-pred.ll | 273 +++++++++++++++++++++++- llvm/test/CodeGen/AArch64/sve-int-div-pred.ll | 91 ++++++++ llvm/test/CodeGen/AArch64/sve-int-log-pred.ll | 140 ++++++++++++ llvm/test/CodeGen/AArch64/sve-int-mad-pred.ll | 199 +++++++++++++++++ llvm/test/CodeGen/AArch64/sve-int-mul-pred.ll | 134 ++++++++++++ 5 files changed, 832 insertions(+), 5 deletions(-) create mode 100644 llvm/test/CodeGen/AArch64/sve-int-div-pred.ll create mode 100644 llvm/test/CodeGen/AArch64/sve-int-log-pred.ll create mode 100644 llvm/test/CodeGen/AArch64/sve-int-mad-pred.ll create mode 100644 llvm/test/CodeGen/AArch64/sve-int-mul-pred.ll (limited to 'llvm/test/CodeGen') diff --git a/llvm/test/CodeGen/AArch64/sve-int-arith-pred.ll b/llvm/test/CodeGen/AArch64/sve-int-arith-pred.ll index 7f642e7a146..d0660e733d7 100644 --- a/llvm/test/CodeGen/AArch64/sve-int-arith-pred.ll +++ b/llvm/test/CodeGen/AArch64/sve-int-arith-pred.ll @@ -40,9 +40,6 @@ define @add_i64( %pg, %a, ret %out } - - - define @sub_i8( %pg, %a, %b) { ; CHECK-LABEL: sub_i8: ; CHECK: sub z0.b, p0/m, z0.b, z1.b @@ -83,8 +80,6 @@ define @sub_i64( %pg, %a, ret %out } - - define @subr_i8( %pg, %a, %b) { ; CHECK-LABEL: subr_i8: ; CHECK: subr z0.b, p0/m, z0.b, z1.b @@ -125,7 +120,245 @@ define @subr_i64( %pg, %a ret %out } +define @smax_i8( %pg, %a, %b) { +; CHECK-LABEL: smax_i8: +; CHECK: smax z0.b, p0/m, z0.b, z1.b +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.smax.nxv16i8( %pg, + %a, + %b) + ret %out +} + +define @smax_i16( %pg, %a, %b) { +; CHECK-LABEL: smax_i16: +; CHECK: smax z0.h, p0/m, z0.h, z1.h +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.smax.nxv8i16( %pg, + %a, + %b) + ret %out +} +define @smax_i32( %pg, %a, %b) { +; CHECK-LABEL: smax_i32: +; CHECK: smax z0.s, p0/m, z0.s, z1.s +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.smax.nxv4i32( %pg, + %a, + %b) + ret %out +} + +define @smax_i64( %pg, %a, %b) { +; CHECK-LABEL: smax_i64: +; CHECK: smax z0.d, p0/m, z0.d, z1.d +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.smax.nxv2i64( %pg, + %a, + %b) + ret %out +} + +define @umax_i8( %pg, %a, %b) { +; CHECK-LABEL: umax_i8: +; CHECK: umax z0.b, p0/m, z0.b, z1.b +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.umax.nxv16i8( %pg, + %a, + %b) + ret %out +} + +define @umax_i16( %pg, %a, %b) { +; CHECK-LABEL: umax_i16: +; CHECK: umax z0.h, p0/m, z0.h, z1.h +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.umax.nxv8i16( %pg, + %a, + %b) + ret %out +} + +define @umax_i32( %pg, %a, %b) { +; CHECK-LABEL: umax_i32: +; CHECK: umax z0.s, p0/m, z0.s, z1.s +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.umax.nxv4i32( %pg, + %a, + %b) + ret %out +} + +define @umax_i64( %pg, %a, %b) { +; CHECK-LABEL: umax_i64: +; CHECK: umax z0.d, p0/m, z0.d, z1.d +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.umax.nxv2i64( %pg, + %a, + %b) + ret %out +} + +define @smin_i8( %pg, %a, %b) { +; CHECK-LABEL: smin_i8: +; CHECK: smin z0.b, p0/m, z0.b, z1.b +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.smin.nxv16i8( %pg, + %a, + %b) + ret %out +} + +define @smin_i16( %pg, %a, %b) { +; CHECK-LABEL: smin_i16: +; CHECK: smin z0.h, p0/m, z0.h, z1.h +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.smin.nxv8i16( %pg, + %a, + %b) + ret %out +} + +define @smin_i32( %pg, %a, %b) { +; CHECK-LABEL: smin_i32: +; CHECK: smin z0.s, p0/m, z0.s, z1.s +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.smin.nxv4i32( %pg, + %a, + %b) + ret %out +} + +define @smin_i64( %pg, %a, %b) { +; CHECK-LABEL: smin_i64: +; CHECK: smin z0.d, p0/m, z0.d, z1.d +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.smin.nxv2i64( %pg, + %a, + %b) + ret %out +} + +define @umin_i8( %pg, %a, %b) { +; CHECK-LABEL: umin_i8: +; CHECK: umin z0.b, p0/m, z0.b, z1.b +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.umin.nxv16i8( %pg, + %a, + %b) + ret %out +} + +define @umin_i16( %pg, %a, %b) { +; CHECK-LABEL: umin_i16: +; CHECK: umin z0.h, p0/m, z0.h, z1.h +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.umin.nxv8i16( %pg, + %a, + %b) + ret %out +} + +define @umin_i32( %pg, %a, %b) { +; CHECK-LABEL: umin_i32: +; CHECK: umin z0.s, p0/m, z0.s, z1.s +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.umin.nxv4i32( %pg, + %a, + %b) + ret %out +} + +define @umin_i64( %pg, %a, %b) { +; CHECK-LABEL: umin_i64: +; CHECK: umin z0.d, p0/m, z0.d, z1.d +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.umin.nxv2i64( %pg, + %a, + %b) + ret %out +} + +define @sabd_i8( %pg, %a, %b) { +; CHECK-LABEL: sabd_i8: +; CHECK: sabd z0.b, p0/m, z0.b, z1.b +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.sabd.nxv16i8( %pg, + %a, + %b) + ret %out +} + +define @sabd_i16( %pg, %a, %b) { +; CHECK-LABEL: sabd_i16: +; CHECK: sabd z0.h, p0/m, z0.h, z1.h +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.sabd.nxv8i16( %pg, + %a, + %b) + ret %out +} + +define @sabd_i32( %pg, %a, %b) { +; CHECK-LABEL: sabd_i32: +; CHECK: sabd z0.s, p0/m, z0.s, z1.s +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.sabd.nxv4i32( %pg, + %a, + %b) + ret %out +} + +define @sabd_i64( %pg, %a, %b) { +; CHECK-LABEL: sabd_i64: +; CHECK: sabd z0.d, p0/m, z0.d, z1.d +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.sabd.nxv2i64( %pg, + %a, + %b) + ret %out +} + +define @uabd_i8( %pg, %a, %b) { +; CHECK-LABEL: uabd_i8: +; CHECK: uabd z0.b, p0/m, z0.b, z1.b +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.uabd.nxv16i8( %pg, + %a, + %b) + ret %out +} + +define @uabd_i16( %pg, %a, %b) { +; CHECK-LABEL: uabd_i16: +; CHECK: uabd z0.h, p0/m, z0.h, z1.h +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.uabd.nxv8i16( %pg, + %a, + %b) + ret %out +} + +define @uabd_i32( %pg, %a, %b) { +; CHECK-LABEL: uabd_i32: +; CHECK: uabd z0.s, p0/m, z0.s, z1.s +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.uabd.nxv4i32( %pg, + %a, + %b) + ret %out +} + +define @uabd_i64( %pg, %a, %b) { +; CHECK-LABEL: uabd_i64: +; CHECK: uabd z0.d, p0/m, z0.d, z1.d +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.uabd.nxv2i64( %pg, + %a, + %b) + ret %out +} declare @llvm.aarch64.sve.add.nxv16i8(, , ) declare @llvm.aarch64.sve.add.nxv8i16(, , ) @@ -141,3 +374,33 @@ declare @llvm.aarch64.sve.subr.nxv16i8(, < declare @llvm.aarch64.sve.subr.nxv8i16(, , ) declare @llvm.aarch64.sve.subr.nxv4i32(, , ) declare @llvm.aarch64.sve.subr.nxv2i64(, , ) + +declare @llvm.aarch64.sve.smax.nxv16i8(, , ) +declare @llvm.aarch64.sve.smax.nxv8i16(, , ) +declare @llvm.aarch64.sve.smax.nxv4i32(, , ) +declare @llvm.aarch64.sve.smax.nxv2i64(, , ) + +declare @llvm.aarch64.sve.umax.nxv16i8(, , ) +declare @llvm.aarch64.sve.umax.nxv8i16(, , ) +declare @llvm.aarch64.sve.umax.nxv4i32(, , ) +declare @llvm.aarch64.sve.umax.nxv2i64(, , ) + +declare @llvm.aarch64.sve.smin.nxv16i8(, , ) +declare @llvm.aarch64.sve.smin.nxv8i16(, , ) +declare @llvm.aarch64.sve.smin.nxv4i32(, , ) +declare @llvm.aarch64.sve.smin.nxv2i64(, , ) + +declare @llvm.aarch64.sve.umin.nxv16i8(, , ) +declare @llvm.aarch64.sve.umin.nxv8i16(, , ) +declare @llvm.aarch64.sve.umin.nxv4i32(, , ) +declare @llvm.aarch64.sve.umin.nxv2i64(, , ) + +declare @llvm.aarch64.sve.sabd.nxv16i8(, , ) +declare @llvm.aarch64.sve.sabd.nxv8i16(, , ) +declare @llvm.aarch64.sve.sabd.nxv4i32(, , ) +declare @llvm.aarch64.sve.sabd.nxv2i64(, , ) + +declare @llvm.aarch64.sve.uabd.nxv16i8(, , ) +declare @llvm.aarch64.sve.uabd.nxv8i16(, , ) +declare @llvm.aarch64.sve.uabd.nxv4i32(, , ) +declare @llvm.aarch64.sve.uabd.nxv2i64(, , ) diff --git a/llvm/test/CodeGen/AArch64/sve-int-div-pred.ll b/llvm/test/CodeGen/AArch64/sve-int-div-pred.ll new file mode 100644 index 00000000000..dd25f27ab4e --- /dev/null +++ b/llvm/test/CodeGen/AArch64/sve-int-div-pred.ll @@ -0,0 +1,91 @@ +; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve < %s | FileCheck %s + +define @sdiv_i32( %pg, %a, %b) { +; CHECK-LABEL: sdiv_i32: +; CHECK: sdiv z0.s, p0/m, z0.s, z1.s +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.sdiv.nxv4i32( %pg, + %a, + %b) + ret %out +} + +define @sdiv_i64( %pg, %a, %b) { +; CHECK-LABEL: sdiv_i64: +; CHECK: sdiv z0.d, p0/m, z0.d, z1.d +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.sdiv.nxv2i64( %pg, + %a, + %b) + ret %out +} + +define @udiv_i32( %pg, %a, %b) { +; CHECK-LABEL: udiv_i32: +; CHECK: udiv z0.s, p0/m, z0.s, z1.s +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.udiv.nxv4i32( %pg, + %a, + %b) + ret %out +} + +define @udiv_i64( %pg, %a, %b) { +; CHECK-LABEL: udiv_i64: +; CHECK: udiv z0.d, p0/m, z0.d, z1.d +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.udiv.nxv2i64( %pg, + %a, + %b) + ret %out +} + +define @sdivr_i32( %pg, %a, %b) { +; CHECK-LABEL: sdivr_i32: +; CHECK: sdivr z0.s, p0/m, z0.s, z1.s +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.sdivr.nxv4i32( %pg, + %a, + %b) + ret %out +} + +define @sdivr_i64( %pg, %a, %b) { +; CHECK-LABEL: sdivr_i64: +; CHECK: sdivr z0.d, p0/m, z0.d, z1.d +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.sdivr.nxv2i64( %pg, + %a, + %b) + ret %out +} + +define @udivr_i32( %pg, %a, %b) { +; CHECK-LABEL: udivr_i32: +; CHECK: udivr z0.s, p0/m, z0.s, z1.s +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.udivr.nxv4i32( %pg, + %a, + %b) + ret %out +} + +define @udivr_i64( %pg, %a, %b) { +; CHECK-LABEL: udivr_i64: +; CHECK: udivr z0.d, p0/m, z0.d, z1.d +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.udivr.nxv2i64( %pg, + %a, + %b) + ret %out +} + +declare @llvm.aarch64.sve.sdiv.nxv4i32(, , ) +declare @llvm.aarch64.sve.sdiv.nxv2i64(, , ) +declare @llvm.aarch64.sve.udiv.nxv4i32(, , ) +declare @llvm.aarch64.sve.udiv.nxv2i64(, , ) +declare @llvm.aarch64.sve.sdivr.nxv4i32(, , ) +declare @llvm.aarch64.sve.sdivr.nxv2i64(, , ) +declare @llvm.aarch64.sve.udivr.nxv4i32(, , ) +declare @llvm.aarch64.sve.udivr.nxv2i64(, , ) + diff --git a/llvm/test/CodeGen/AArch64/sve-int-log-pred.ll b/llvm/test/CodeGen/AArch64/sve-int-log-pred.ll new file mode 100644 index 00000000000..5e12981fd67 --- /dev/null +++ b/llvm/test/CodeGen/AArch64/sve-int-log-pred.ll @@ -0,0 +1,140 @@ +; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve < %s | FileCheck %s + +define @and_pred_i8( %pg, %a, %b) { +; CHECK-LABEL: and_pred_i8: +; CHECK: and z0.b, p0/m, z0.b, z1.b +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.and.nxv2i8( %pg, + %a, + %b) + ret %out +} + +define @and_pred_i16( %pg, %a, %b) { +; CHECK-LABEL: and_pred_i16: +; CHECK: and z0.h, p0/m, z0.h, z1.h +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.and.nxv2i16( %pg, + %a, + %b) + ret %out +} + + +define @and_pred_i32( %pg, %a, %b) { +; CHECK-LABEL: and_pred_i32: +; CHECK: and z0.s, p0/m, z0.s, z1.s +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.and.nxv2i32( %pg, + %a, + %b) + ret %out +} + +define @and_pred_i64( %pg, %a, %b) { +; CHECK-LABEL: and_pred_i64: +; CHECK: and z0.d, p0/m, z0.d, z1.d +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.and.nxv2i64( %pg, + %a, + %b) + ret %out +} + + +define @or_pred_i8( %pg, %a, %b) { +; CHECK-LABEL: or_pred_i8: +; CHECK: orr z0.b, p0/m, z0.b, z1.b +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.or.nxv2i8( %pg, + %a, + %b) + ret %out +} + +define @or_pred_i16( %pg, %a, %b) { +; CHECK-LABEL: or_pred_i16: +; CHECK: orr z0.h, p0/m, z0.h, z1.h +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.or.nxv2i16( %pg, + %a, + %b) + ret %out +} + + +define @or_pred_i32( %pg, %a, %b) { +; CHECK-LABEL: or_pred_i32: +; CHECK: orr z0.s, p0/m, z0.s, z1.s +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.or.nxv2i32( %pg, + %a, + %b) + ret %out +} + +define @or_pred_i64( %pg, %a, %b) { +; CHECK-LABEL: or_pred_i64: +; CHECK: orr z0.d, p0/m, z0.d, z1.d +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.or.nxv2i64( %pg, + %a, + %b) + ret %out +} + + +define @xor_pred_i8( %pg, %a, %b) { +; CHECK-LABEL: xor_pred_i8: +; CHECK: eor z0.b, p0/m, z0.b, z1.b +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.xor.nxv2i8( %pg, + %a, + %b) + ret %out +} + +define @xor_pred_i16( %pg, %a, %b) { +; CHECK-LABEL: xor_pred_i16: +; CHECK: eor z0.h, p0/m, z0.h, z1.h +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.xor.nxv2i16( %pg, + %a, + %b) + ret %out +} + + +define @xor_pred_i32( %pg, %a, %b) { +; CHECK-LABEL: xor_pred_i32: +; CHECK: eor z0.s, p0/m, z0.s, z1.s +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.xor.nxv2i32( %pg, + %a, + %b) + ret %out +} + +define @xor_pred_i64( %pg, %a, %b) { +; CHECK-LABEL: xor_pred_i64: +; CHECK: eor z0.d, p0/m, z0.d, z1.d +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.xor.nxv2i64( %pg, + %a, + %b) + ret %out +} + + +declare @llvm.aarch64.sve.and.nxv2i8(,,) +declare @llvm.aarch64.sve.and.nxv2i16(,,) +declare @llvm.aarch64.sve.and.nxv2i32(,,) +declare @llvm.aarch64.sve.and.nxv2i64(,,) +declare @llvm.aarch64.sve.or.nxv2i8(,,) +declare @llvm.aarch64.sve.or.nxv2i16(,,) +declare @llvm.aarch64.sve.or.nxv2i32(,,) +declare @llvm.aarch64.sve.or.nxv2i64(,,) +declare @llvm.aarch64.sve.xor.nxv2i8(,,) +declare @llvm.aarch64.sve.xor.nxv2i16(,,) +declare @llvm.aarch64.sve.xor.nxv2i32(,,) +declare @llvm.aarch64.sve.xor.nxv2i64(,,) diff --git a/llvm/test/CodeGen/AArch64/sve-int-mad-pred.ll b/llvm/test/CodeGen/AArch64/sve-int-mad-pred.ll new file mode 100644 index 00000000000..30dc76daa16 --- /dev/null +++ b/llvm/test/CodeGen/AArch64/sve-int-mad-pred.ll @@ -0,0 +1,199 @@ +; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve < %s | FileCheck %s + +define @mad_i8( %pg, %a, %b, %c) { +; CHECK-LABEL: mad_i8: +; CHECK: mad z0.b, p0/m, z1.b, z2.b +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.mad.nxv16i8( %pg, + %a, + %b, + %c) + ret %out +} + +define @mad_i16( %pg, %a, %b, %c) { +; CHECK-LABEL: mad_i16: +; CHECK: mad z0.h, p0/m, z1.h, z2.h +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.mad.nxv8i16( %pg, + %a, + %b, + %c) + ret %out +} + +define @mad_i32( %pg, %a, %b, %c) { +; CHECK-LABEL: mad_i32: +; CHECK: mad z0.s, p0/m, z1.s, z2.s +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.mad.nxv4i32( %pg, + %a, + %b, + %c) + ret %out +} + +define @mad_i64( %pg, %a, %b, %c) { +; CHECK-LABEL: mad_i64: +; CHECK: mad z0.d, p0/m, z1.d, z2.d +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.mad.nxv2i64( %pg, + %a, + %b, + %c) + ret %out +} + +define @msb_i8( %pg, %a, %b, %c) { +; CHECK-LABEL: msb_i8: +; CHECK: msb z0.b, p0/m, z1.b, z2.b +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.msb.nxv16i8( %pg, + %a, + %b, + %c) + ret %out +} + +define @msb_i16( %pg, %a, %b, %c) { +; CHECK-LABEL: msb_i16: +; CHECK: msb z0.h, p0/m, z1.h, z2.h +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.msb.nxv8i16( %pg, + %a, + %b, + %c) + ret %out +} + +define @msb_i32( %pg, %a, %b, %c) { +; CHECK-LABEL: msb_i32: +; CHECK: msb z0.s, p0/m, z1.s, z2.s +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.msb.nxv4i32( %pg, + %a, + %b, + %c) + ret %out +} + +define @msb_i64( %pg, %a, %b, %c) { +; CHECK-LABEL: msb_i64: +; CHECK: msb z0.d, p0/m, z1.d, z2.d +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.msb.nxv2i64( %pg, + %a, + %b, + %c) + ret %out +} + + +define @mla_i8( %pg, %a, %b, %c) { +; CHECK-LABEL: mla_i8: +; CHECK: mla z0.b, p0/m, z1.b, z2.b +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.mla.nxv16i8( %pg, + %a, + %b, + %c) + ret %out +} + +define @mla_i16( %pg, %a, %b, %c) { +; CHECK-LABEL: mla_i16: +; CHECK: mla z0.h, p0/m, z1.h, z2.h +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.mla.nxv8i16( %pg, + %a, + %b, + %c) + ret %out +} + +define @mla_i32( %pg, %a, %b, %c) { +; CHECK-LABEL: mla_i32: +; CHECK: mla z0.s, p0/m, z1.s, z2.s +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.mla.nxv4i32( %pg, + %a, + %b, + %c) + ret %out +} + +define @mla_i64( %pg, %a, %b, %c) { +; CHECK-LABEL: mla_i64: +; CHECK: mla z0.d, p0/m, z1.d, z2.d +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.mla.nxv2i64( %pg, + %a, + %b, + %c) + ret %out +} + + +define @mls_i8( %pg, %a, %b, %c) { +; CHECK-LABEL: mls_i8: +; CHECK: mls z0.b, p0/m, z1.b, z2.b +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.mls.nxv16i8( %pg, + %a, + %b, + %c) + ret %out +} + +define @mls_i16( %pg, %a, %b, %c) { +; CHECK-LABEL: mls_i16: +; CHECK: mls z0.h, p0/m, z1.h, z2.h +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.mls.nxv8i16( %pg, + %a, + %b, + %c) + ret %out +} + +define @mls_i32( %pg, %a, %b, %c) { +; CHECK-LABEL: mls_i32: +; CHECK: mls z0.s, p0/m, z1.s, z2.s +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.mls.nxv4i32( %pg, + %a, + %b, + %c) + ret %out +} + +define @mls_i64( %pg, %a, %b, %c) { +; CHECK-LABEL: mls_i64: +; CHECK: mls z0.d, p0/m, z1.d, z2.d +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.mls.nxv2i64( %pg, + %a, + %b, + %c) + ret %out +} + +declare @llvm.aarch64.sve.mad.nxv16i8(, ,,) +declare @llvm.aarch64.sve.mad.nxv8i16(, ,,) +declare @llvm.aarch64.sve.mad.nxv4i32(, ,,) +declare @llvm.aarch64.sve.mad.nxv2i64(, ,,) + +declare @llvm.aarch64.sve.msb.nxv16i8(, ,,) +declare @llvm.aarch64.sve.msb.nxv8i16(, ,,) +declare @llvm.aarch64.sve.msb.nxv4i32(, ,,) +declare @llvm.aarch64.sve.msb.nxv2i64(, ,,) + +declare @llvm.aarch64.sve.mla.nxv16i8(, ,,) +declare @llvm.aarch64.sve.mla.nxv8i16(, ,,) +declare @llvm.aarch64.sve.mla.nxv4i32(, ,,) +declare @llvm.aarch64.sve.mla.nxv2i64(, ,,) + +declare @llvm.aarch64.sve.mls.nxv16i8(, ,,) +declare @llvm.aarch64.sve.mls.nxv8i16(, ,,) +declare @llvm.aarch64.sve.mls.nxv4i32(, ,,) +declare @llvm.aarch64.sve.mls.nxv2i64(, ,,) diff --git a/llvm/test/CodeGen/AArch64/sve-int-mul-pred.ll b/llvm/test/CodeGen/AArch64/sve-int-mul-pred.ll new file mode 100644 index 00000000000..287a3372907 --- /dev/null +++ b/llvm/test/CodeGen/AArch64/sve-int-mul-pred.ll @@ -0,0 +1,134 @@ +; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve < %s | FileCheck %s + +define @mul_i8( %pg, %a, %b) { +; CHECK-LABEL: mul_i8: +; CHECK: mul z0.b, p0/m, z0.b, z1.b +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.mul.nxv16i8( %pg, + %a, + %b) + ret %out +} + +define @mul_i16( %pg, %a, %b) { +; CHECK-LABEL: mul_i16: +; CHECK: mul z0.h, p0/m, z0.h, z1.h +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.mul.nxv8i16( %pg, + %a, + %b) + ret %out +} + +define @mul_i32( %pg, %a, %b) { +; CHECK-LABEL: mul_i32: +; CHECK: mul z0.s, p0/m, z0.s, z1.s +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.mul.nxv4i32( %pg, + %a, + %b) + ret %out +} + +define @mul_i64( %pg, %a, %b) { +; CHECK-LABEL: mul_i64: +; CHECK: mul z0.d, p0/m, z0.d, z1.d +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.mul.nxv2i64( %pg, + %a, + %b) + ret %out +} + +define @smulh_i8( %pg, %a, %b) { +; CHECK-LABEL: smulh_i8: +; CHECK: smulh z0.b, p0/m, z0.b, z1.b +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.smulh.nxv16i8( %pg, + %a, + %b) + ret %out +} + +define @smulh_i16( %pg, %a, %b) { +; CHECK-LABEL: smulh_i16: +; CHECK: smulh z0.h, p0/m, z0.h, z1.h +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.smulh.nxv8i16( %pg, + %a, + %b) + ret %out +} + +define @smulh_i32( %pg, %a, %b) { +; CHECK-LABEL: smulh_i32: +; CHECK: smulh z0.s, p0/m, z0.s, z1.s +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.smulh.nxv4i32( %pg, + %a, + %b) + ret %out +} + +define @smulh_i64( %pg, %a, %b) { +; CHECK-LABEL: smulh_i64: +; CHECK: smulh z0.d, p0/m, z0.d, z1.d +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.smulh.nxv2i64( %pg, + %a, + %b) + ret %out +} + +define @umulh_i8( %pg, %a, %b) { +; CHECK-LABEL: umulh_i8: +; CHECK: umulh z0.b, p0/m, z0.b, z1.b +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.umulh.nxv16i8( %pg, + %a, + %b) + ret %out +} + +define @umulh_i16( %pg, %a, %b) { +; CHECK-LABEL: umulh_i16: +; CHECK: umulh z0.h, p0/m, z0.h, z1.h +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.umulh.nxv8i16( %pg, + %a, + %b) + ret %out +} + +define @umulh_i32( %pg, %a, %b) { +; CHECK-LABEL: umulh_i32: +; CHECK: umulh z0.s, p0/m, z0.s, z1.s +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.umulh.nxv4i32( %pg, + %a, + %b) + ret %out +} + +define @umulh_i64( %pg, %a, %b) { +; CHECK-LABEL: umulh_i64: +; CHECK: umulh z0.d, p0/m, z0.d, z1.d +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.umulh.nxv2i64( %pg, + %a, + %b) + ret %out +} + +declare @llvm.aarch64.sve.mul.nxv16i8(, , ) +declare @llvm.aarch64.sve.mul.nxv8i16(, , ) +declare @llvm.aarch64.sve.mul.nxv4i32(, , ) +declare @llvm.aarch64.sve.mul.nxv2i64(, , ) +declare @llvm.aarch64.sve.smulh.nxv16i8(, , ) +declare @llvm.aarch64.sve.smulh.nxv8i16(, , ) +declare @llvm.aarch64.sve.smulh.nxv4i32(, , ) +declare @llvm.aarch64.sve.smulh.nxv2i64(, , ) +declare @llvm.aarch64.sve.umulh.nxv16i8(, , ) +declare @llvm.aarch64.sve.umulh.nxv8i16(, , ) +declare @llvm.aarch64.sve.umulh.nxv4i32(, , ) +declare @llvm.aarch64.sve.umulh.nxv2i64(, , ) -- cgit v1.2.3