diff --git a/clang/include/clang/Basic/arm_sve.td b/clang/include/clang/Basic/arm_sve.td --- a/clang/include/clang/Basic/arm_sve.td +++ b/clang/include/clang/Basic/arm_sve.td @@ -609,6 +609,23 @@ defm SVMULH_U : SInstZPZZ<"svmulh", "UcUsUiUl", "aarch64_sve_umulh">; defm SVSUB : SInstZPZZ<"svsub", "csilUcUsUiUl", "aarch64_sve_sub">; defm SVSUBR : SInstZPZZ<"svsubr", "csilUcUsUiUl", "aarch64_sve_subr">; + +//------------------------------------------------------------------------------ + +multiclass SInstZPZZZ flags=[]> { + def _M : SInst; + def _X : SInst; + def _Z : SInst; + + def _N_M : SInst; + def _N_X : SInst; + def _N_Z : SInst; +} + +defm SVMAD : SInstZPZZZ<"svmad", "csilUcUsUiUl", "aarch64_sve_mad">; +defm SVMLA : SInstZPZZZ<"svmla", "csilUcUsUiUl", "aarch64_sve_mla">; +defm SVMLS : SInstZPZZZ<"svmls", "csilUcUsUiUl", "aarch64_sve_mls">; +defm SVMSB : SInstZPZZZ<"svmsb", "csilUcUsUiUl", "aarch64_sve_msb">; //////////////////////////////////////////////////////////////////////////////// // Permutations and selection def SVEXT : SInst<"svext[_{d}]", "dddi", "csilUcUsUiUlhfd", MergeNone, "aarch64_sve_ext", [], [ImmCheck<2, ImmCheckExtract, 1>]>; @@ -696,9 +713,19 @@ def SVTMAD : SInst<"svtmad[_{d}]", "dddi", "hfd", MergeNone, "aarch64_sve_ftmad_x", [], [ImmCheck<2, ImmCheck0_7>]>; -def SVMLA_LANE : SInst<"svmla_lane[_{d}]", "ddddi", "hfd", MergeNone, "aarch64_sve_fmla_lane", [], [ImmCheck<3, ImmCheckLaneIndex, 2>]>; +defm SVMAD_F : SInstZPZZZ<"svmad", "hfd", "aarch64_sve_fmad">; +defm SVMLA_F : SInstZPZZZ<"svmla", "hfd", "aarch64_sve_fmla">; +defm SVMLS_F : SInstZPZZZ<"svmls", "hfd", "aarch64_sve_fmls">; +defm SVMSB_F : SInstZPZZZ<"svmsb", "hfd", "aarch64_sve_fmsb">; +defm SVNMAD_F : SInstZPZZZ<"svnmad", "hfd", "aarch64_sve_fnmad">; +defm SVNMLA_F : SInstZPZZZ<"svnmla", "hfd", "aarch64_sve_fnmla">; +defm SVNMLS_F : SInstZPZZZ<"svnmls", "hfd", "aarch64_sve_fnmls">; +defm SVNMSB_F : SInstZPZZZ<"svnmsb", "hfd", "aarch64_sve_fnmsb">; + def SVCMLA_LANE : SInst<"svcmla_lane[_{d}]", "ddddii", "hf", MergeNone, "aarch64_sve_fcmla_lane", [], [ImmCheck<3, ImmCheckLaneIndexCompRotate, 2>, ImmCheck<4, ImmCheckComplexRotAll90>]>; +def SVMLA_LANE : SInst<"svmla_lane[_{d}]", "ddddi", "hfd", MergeNone, "aarch64_sve_fmla_lane", [], [ImmCheck<3, ImmCheckLaneIndex, 2>]>; +def SVMLS_LANE : SInst<"svmls_lane[_{d}]", "ddddi", "hfd", MergeNone, "aarch64_sve_fmls_lane", [], [ImmCheck<3, ImmCheckLaneIndex, 2>]>; //////////////////////////////////////////////////////////////////////////////// // Floating-point comparisons diff --git a/clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_mad.c b/clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_mad.c new file mode 100644 --- /dev/null +++ b/clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_mad.c @@ -0,0 +1,646 @@ +// RUN: %clang_cc1 -D__ARM_FEATURE_SVE -triple aarch64-none-linux-gnu -target-feature +sve -fallow-half-arguments-and-returns -S -O1 -Werror -Wall -emit-llvm -o - %s | FileCheck %s +// RUN: %clang_cc1 -D__ARM_FEATURE_SVE -DSVE_OVERLOADED_FORMS -triple aarch64-none-linux-gnu -target-feature +sve -fallow-half-arguments-and-returns -S -O1 -Werror -Wall -emit-llvm -o - %s | FileCheck %s + +#include + +#ifdef SVE_OVERLOADED_FORMS +// A simple used,unused... macro, long enough to represent any SVE builtin. +#define SVE_ACLE_FUNC(A1,A2_UNUSED,A3,A4_UNUSED) A1##A3 +#else +#define SVE_ACLE_FUNC(A1,A2,A3,A4) A1##A2##A3##A4 +#endif + +svint8_t test_svmad_s8_z(svbool_t pg, svint8_t op1, svint8_t op2, svint8_t op3) +{ + // CHECK-LABEL: test_svmad_s8_z + // CHECK: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv16i8( %pg, %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mad.nxv16i8( %pg, %[[SEL]], %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_s8,_z,)(pg, op1, op2, op3); +} + +svint16_t test_svmad_s16_z(svbool_t pg, svint16_t op1, svint16_t op2, svint16_t op3) +{ + // CHECK-LABEL: test_svmad_s16_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv8i16( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mad.nxv8i16( %[[PG]], %[[SEL]], %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_s16,_z,)(pg, op1, op2, op3); +} + +svint32_t test_svmad_s32_z(svbool_t pg, svint32_t op1, svint32_t op2, svint32_t op3) +{ + // CHECK-LABEL: test_svmad_s32_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv4i32( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mad.nxv4i32( %[[PG]], %[[SEL]], %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_s32,_z,)(pg, op1, op2, op3); +} + +svint64_t test_svmad_s64_z(svbool_t pg, svint64_t op1, svint64_t op2, svint64_t op3) +{ + // CHECK-LABEL: test_svmad_s64_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv2i64( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mad.nxv2i64( %[[PG]], %[[SEL]], %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_s64,_z,)(pg, op1, op2, op3); +} + +svuint8_t test_svmad_u8_z(svbool_t pg, svuint8_t op1, svuint8_t op2, svuint8_t op3) +{ + // CHECK-LABEL: test_svmad_u8_z + // CHECK: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv16i8( %pg, %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mad.nxv16i8( %pg, %[[SEL]], %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_u8,_z,)(pg, op1, op2, op3); +} + +svuint16_t test_svmad_u16_z(svbool_t pg, svuint16_t op1, svuint16_t op2, svuint16_t op3) +{ + // CHECK-LABEL: test_svmad_u16_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv8i16( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mad.nxv8i16( %[[PG]], %[[SEL]], %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_u16,_z,)(pg, op1, op2, op3); +} + +svuint32_t test_svmad_u32_z(svbool_t pg, svuint32_t op1, svuint32_t op2, svuint32_t op3) +{ + // CHECK-LABEL: test_svmad_u32_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv4i32( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mad.nxv4i32( %[[PG]], %[[SEL]], %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_u32,_z,)(pg, op1, op2, op3); +} + +svuint64_t test_svmad_u64_z(svbool_t pg, svuint64_t op1, svuint64_t op2, svuint64_t op3) +{ + // CHECK-LABEL: test_svmad_u64_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv2i64( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mad.nxv2i64( %[[PG]], %[[SEL]], %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_u64,_z,)(pg, op1, op2, op3); +} + +svint8_t test_svmad_s8_m(svbool_t pg, svint8_t op1, svint8_t op2, svint8_t op3) +{ + // CHECK-LABEL: test_svmad_s8_m + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mad.nxv16i8( %pg, %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_s8,_m,)(pg, op1, op2, op3); +} + +svint16_t test_svmad_s16_m(svbool_t pg, svint16_t op1, svint16_t op2, svint16_t op3) +{ + // CHECK-LABEL: test_svmad_s16_m + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mad.nxv8i16( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_s16,_m,)(pg, op1, op2, op3); +} + +svint32_t test_svmad_s32_m(svbool_t pg, svint32_t op1, svint32_t op2, svint32_t op3) +{ + // CHECK-LABEL: test_svmad_s32_m + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mad.nxv4i32( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_s32,_m,)(pg, op1, op2, op3); +} + +svint64_t test_svmad_s64_m(svbool_t pg, svint64_t op1, svint64_t op2, svint64_t op3) +{ + // CHECK-LABEL: test_svmad_s64_m + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mad.nxv2i64( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_s64,_m,)(pg, op1, op2, op3); +} + +svuint8_t test_svmad_u8_m(svbool_t pg, svuint8_t op1, svuint8_t op2, svuint8_t op3) +{ + // CHECK-LABEL: test_svmad_u8_m + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mad.nxv16i8( %pg, %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_u8,_m,)(pg, op1, op2, op3); +} + +svuint16_t test_svmad_u16_m(svbool_t pg, svuint16_t op1, svuint16_t op2, svuint16_t op3) +{ + // CHECK-LABEL: test_svmad_u16_m + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mad.nxv8i16( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_u16,_m,)(pg, op1, op2, op3); +} + +svuint32_t test_svmad_u32_m(svbool_t pg, svuint32_t op1, svuint32_t op2, svuint32_t op3) +{ + // CHECK-LABEL: test_svmad_u32_m + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mad.nxv4i32( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_u32,_m,)(pg, op1, op2, op3); +} + +svuint64_t test_svmad_u64_m(svbool_t pg, svuint64_t op1, svuint64_t op2, svuint64_t op3) +{ + // CHECK-LABEL: test_svmad_u64_m + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mad.nxv2i64( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_u64,_m,)(pg, op1, op2, op3); +} + +svint8_t test_svmad_s8_x(svbool_t pg, svint8_t op1, svint8_t op2, svint8_t op3) +{ + // CHECK-LABEL: test_svmad_s8_x + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mad.nxv16i8( %pg, %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_s8,_x,)(pg, op1, op2, op3); +} + +svint16_t test_svmad_s16_x(svbool_t pg, svint16_t op1, svint16_t op2, svint16_t op3) +{ + // CHECK-LABEL: test_svmad_s16_x + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mad.nxv8i16( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_s16,_x,)(pg, op1, op2, op3); +} + +svint32_t test_svmad_s32_x(svbool_t pg, svint32_t op1, svint32_t op2, svint32_t op3) +{ + // CHECK-LABEL: test_svmad_s32_x + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mad.nxv4i32( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_s32,_x,)(pg, op1, op2, op3); +} + +svint64_t test_svmad_s64_x(svbool_t pg, svint64_t op1, svint64_t op2, svint64_t op3) +{ + // CHECK-LABEL: test_svmad_s64_x + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mad.nxv2i64( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_s64,_x,)(pg, op1, op2, op3); +} + +svuint8_t test_svmad_u8_x(svbool_t pg, svuint8_t op1, svuint8_t op2, svuint8_t op3) +{ + // CHECK-LABEL: test_svmad_u8_x + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mad.nxv16i8( %pg, %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_u8,_x,)(pg, op1, op2, op3); +} + +svuint16_t test_svmad_u16_x(svbool_t pg, svuint16_t op1, svuint16_t op2, svuint16_t op3) +{ + // CHECK-LABEL: test_svmad_u16_x + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mad.nxv8i16( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_u16,_x,)(pg, op1, op2, op3); +} + +svuint32_t test_svmad_u32_x(svbool_t pg, svuint32_t op1, svuint32_t op2, svuint32_t op3) +{ + // CHECK-LABEL: test_svmad_u32_x + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mad.nxv4i32( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_u32,_x,)(pg, op1, op2, op3); +} + +svuint64_t test_svmad_u64_x(svbool_t pg, svuint64_t op1, svuint64_t op2, svuint64_t op3) +{ + // CHECK-LABEL: test_svmad_u64_x + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mad.nxv2i64( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_u64,_x,)(pg, op1, op2, op3); +} + +svint8_t test_svmad_n_s8_z(svbool_t pg, svint8_t op1, svint8_t op2, int8_t op3) +{ + // CHECK-LABEL: test_svmad_n_s8_z + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv16i8(i8 %op3) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv16i8( %pg, %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mad.nxv16i8( %pg, %[[SEL]], %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_n_s8,_z,)(pg, op1, op2, op3); +} + +svint16_t test_svmad_n_s16_z(svbool_t pg, svint16_t op1, svint16_t op2, int16_t op3) +{ + // CHECK-LABEL: test_svmad_n_s16_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv8i16(i16 %op3) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv8i16( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mad.nxv8i16( %[[PG]], %[[SEL]], %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_n_s16,_z,)(pg, op1, op2, op3); +} + +svint32_t test_svmad_n_s32_z(svbool_t pg, svint32_t op1, svint32_t op2, int32_t op3) +{ + // CHECK-LABEL: test_svmad_n_s32_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv4i32(i32 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mad.nxv4i32( %[[PG]], %[[SEL]], %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_n_s32,_z,)(pg, op1, op2, op3); +} + +svint64_t test_svmad_n_s64_z(svbool_t pg, svint64_t op1, svint64_t op2, int64_t op3) +{ + // CHECK-LABEL: test_svmad_n_s64_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv2i64(i64 %op3) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv2i64( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mad.nxv2i64( %[[PG]], %[[SEL]], %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_n_s64,_z,)(pg, op1, op2, op3); +} + +svuint8_t test_svmad_n_u8_z(svbool_t pg, svuint8_t op1, svuint8_t op2, uint8_t op3) +{ + // CHECK-LABEL: test_svmad_n_u8_z + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv16i8(i8 %op3) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv16i8( %pg, %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mad.nxv16i8( %pg, %[[SEL]], %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_n_u8,_z,)(pg, op1, op2, op3); +} + +svuint16_t test_svmad_n_u16_z(svbool_t pg, svuint16_t op1, svuint16_t op2, uint16_t op3) +{ + // CHECK-LABEL: test_svmad_n_u16_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv8i16(i16 %op3) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv8i16( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mad.nxv8i16( %[[PG]], %[[SEL]], %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_n_u16,_z,)(pg, op1, op2, op3); +} + +svuint32_t test_svmad_n_u32_z(svbool_t pg, svuint32_t op1, svuint32_t op2, uint32_t op3) +{ + // CHECK-LABEL: test_svmad_n_u32_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv4i32(i32 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mad.nxv4i32( %[[PG]], %[[SEL]], %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_n_u32,_z,)(pg, op1, op2, op3); +} + +svuint64_t test_svmad_n_u64_z(svbool_t pg, svuint64_t op1, svuint64_t op2, uint64_t op3) +{ + // CHECK-LABEL: test_svmad_n_u64_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv2i64(i64 %op3) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv2i64( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mad.nxv2i64( %[[PG]], %[[SEL]], %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_n_u64,_z,)(pg, op1, op2, op3); +} + +svint8_t test_svmad_n_s8_m(svbool_t pg, svint8_t op1, svint8_t op2, int8_t op3) +{ + // CHECK-LABEL: test_svmad_n_s8_m + // CHECK: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv16i8(i8 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mad.nxv16i8( %pg, %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_n_s8,_m,)(pg, op1, op2, op3); +} + +svint16_t test_svmad_n_s16_m(svbool_t pg, svint16_t op1, svint16_t op2, int16_t op3) +{ + // CHECK-LABEL: test_svmad_n_s16_m + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv8i16(i16 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mad.nxv8i16( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_n_s16,_m,)(pg, op1, op2, op3); +} + +svint32_t test_svmad_n_s32_m(svbool_t pg, svint32_t op1, svint32_t op2, int32_t op3) +{ + // CHECK-LABEL: test_svmad_n_s32_m + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv4i32(i32 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mad.nxv4i32( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_n_s32,_m,)(pg, op1, op2, op3); +} + +svint64_t test_svmad_n_s64_m(svbool_t pg, svint64_t op1, svint64_t op2, int64_t op3) +{ + // CHECK-LABEL: test_svmad_n_s64_m + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv2i64(i64 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mad.nxv2i64( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_n_s64,_m,)(pg, op1, op2, op3); +} + +svuint8_t test_svmad_n_u8_m(svbool_t pg, svuint8_t op1, svuint8_t op2, uint8_t op3) +{ + // CHECK-LABEL: test_svmad_n_u8_m + // CHECK: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv16i8(i8 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mad.nxv16i8( %pg, %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_n_u8,_m,)(pg, op1, op2, op3); +} + +svuint16_t test_svmad_n_u16_m(svbool_t pg, svuint16_t op1, svuint16_t op2, uint16_t op3) +{ + // CHECK-LABEL: test_svmad_n_u16_m + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv8i16(i16 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mad.nxv8i16( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_n_u16,_m,)(pg, op1, op2, op3); +} + +svuint32_t test_svmad_n_u32_m(svbool_t pg, svuint32_t op1, svuint32_t op2, uint32_t op3) +{ + // CHECK-LABEL: test_svmad_n_u32_m + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv4i32(i32 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mad.nxv4i32( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_n_u32,_m,)(pg, op1, op2, op3); +} + +svuint64_t test_svmad_n_u64_m(svbool_t pg, svuint64_t op1, svuint64_t op2, uint64_t op3) +{ + // CHECK-LABEL: test_svmad_n_u64_m + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv2i64(i64 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mad.nxv2i64( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_n_u64,_m,)(pg, op1, op2, op3); +} + +svint8_t test_svmad_n_s8_x(svbool_t pg, svint8_t op1, svint8_t op2, int8_t op3) +{ + // CHECK-LABEL: test_svmad_n_s8_x + // CHECK: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv16i8(i8 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mad.nxv16i8( %pg, %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_n_s8,_x,)(pg, op1, op2, op3); +} + +svint16_t test_svmad_n_s16_x(svbool_t pg, svint16_t op1, svint16_t op2, int16_t op3) +{ + // CHECK-LABEL: test_svmad_n_s16_x + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv8i16(i16 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mad.nxv8i16( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_n_s16,_x,)(pg, op1, op2, op3); +} + +svint32_t test_svmad_n_s32_x(svbool_t pg, svint32_t op1, svint32_t op2, int32_t op3) +{ + // CHECK-LABEL: test_svmad_n_s32_x + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv4i32(i32 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mad.nxv4i32( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_n_s32,_x,)(pg, op1, op2, op3); +} + +svint64_t test_svmad_n_s64_x(svbool_t pg, svint64_t op1, svint64_t op2, int64_t op3) +{ + // CHECK-LABEL: test_svmad_n_s64_x + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv2i64(i64 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mad.nxv2i64( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_n_s64,_x,)(pg, op1, op2, op3); +} + +svuint8_t test_svmad_n_u8_x(svbool_t pg, svuint8_t op1, svuint8_t op2, uint8_t op3) +{ + // CHECK-LABEL: test_svmad_n_u8_x + // CHECK: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv16i8(i8 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mad.nxv16i8( %pg, %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_n_u8,_x,)(pg, op1, op2, op3); +} + +svuint16_t test_svmad_n_u16_x(svbool_t pg, svuint16_t op1, svuint16_t op2, uint16_t op3) +{ + // CHECK-LABEL: test_svmad_n_u16_x + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv8i16(i16 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mad.nxv8i16( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_n_u16,_x,)(pg, op1, op2, op3); +} + +svuint32_t test_svmad_n_u32_x(svbool_t pg, svuint32_t op1, svuint32_t op2, uint32_t op3) +{ + // CHECK-LABEL: test_svmad_n_u32_x + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv4i32(i32 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mad.nxv4i32( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_n_u32,_x,)(pg, op1, op2, op3); +} + +svuint64_t test_svmad_n_u64_x(svbool_t pg, svuint64_t op1, svuint64_t op2, uint64_t op3) +{ + // CHECK-LABEL: test_svmad_n_u64_x + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv2i64(i64 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mad.nxv2i64( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_n_u64,_x,)(pg, op1, op2, op3); +} + +svfloat16_t test_svmad_f16_z(svbool_t pg, svfloat16_t op1, svfloat16_t op2, svfloat16_t op3) +{ + // CHECK-LABEL: test_svmad_f16_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv8f16( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmad.nxv8f16( %[[PG]], %[[SEL]], %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_f16,_z,)(pg, op1, op2, op3); +} + +svfloat32_t test_svmad_f32_z(svbool_t pg, svfloat32_t op1, svfloat32_t op2, svfloat32_t op3) +{ + // CHECK-LABEL: test_svmad_f32_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv4f32( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmad.nxv4f32( %[[PG]], %[[SEL]], %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_f32,_z,)(pg, op1, op2, op3); +} + +svfloat64_t test_svmad_f64_z(svbool_t pg, svfloat64_t op1, svfloat64_t op2, svfloat64_t op3) +{ + // CHECK-LABEL: test_svmad_f64_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv2f64( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmad.nxv2f64( %[[PG]], %[[SEL]], %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_f64,_z,)(pg, op1, op2, op3); +} + +svfloat16_t test_svmad_f16_m(svbool_t pg, svfloat16_t op1, svfloat16_t op2, svfloat16_t op3) +{ + // CHECK-LABEL: test_svmad_f16_m + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmad.nxv8f16( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_f16,_m,)(pg, op1, op2, op3); +} + +svfloat32_t test_svmad_f32_m(svbool_t pg, svfloat32_t op1, svfloat32_t op2, svfloat32_t op3) +{ + // CHECK-LABEL: test_svmad_f32_m + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmad.nxv4f32( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_f32,_m,)(pg, op1, op2, op3); +} + +svfloat64_t test_svmad_f64_m(svbool_t pg, svfloat64_t op1, svfloat64_t op2, svfloat64_t op3) +{ + // CHECK-LABEL: test_svmad_f64_m + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmad.nxv2f64( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_f64,_m,)(pg, op1, op2, op3); +} + +svfloat16_t test_svmad_f16_x(svbool_t pg, svfloat16_t op1, svfloat16_t op2, svfloat16_t op3) +{ + // CHECK-LABEL: test_svmad_f16_x + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmad.nxv8f16( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_f16,_x,)(pg, op1, op2, op3); +} + +svfloat32_t test_svmad_f32_x(svbool_t pg, svfloat32_t op1, svfloat32_t op2, svfloat32_t op3) +{ + // CHECK-LABEL: test_svmad_f32_x + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmad.nxv4f32( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_f32,_x,)(pg, op1, op2, op3); +} + +svfloat64_t test_svmad_f64_x(svbool_t pg, svfloat64_t op1, svfloat64_t op2, svfloat64_t op3) +{ + // CHECK-LABEL: test_svmad_f64_x + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmad.nxv2f64( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_f64,_x,)(pg, op1, op2, op3); +} + +svfloat16_t test_svmad_n_f16_z(svbool_t pg, svfloat16_t op1, svfloat16_t op2, float16_t op3) +{ + // CHECK-LABEL: test_svmad_n_f16_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv8f16(half %op3) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv8f16( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmad.nxv8f16( %[[PG]], %[[SEL]], %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_n_f16,_z,)(pg, op1, op2, op3); +} + +svfloat32_t test_svmad_n_f32_z(svbool_t pg, svfloat32_t op1, svfloat32_t op2, float32_t op3) +{ + // CHECK-LABEL: test_svmad_n_f32_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv4f32(float %op3) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv4f32( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmad.nxv4f32( %[[PG]], %[[SEL]], %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_n_f32,_z,)(pg, op1, op2, op3); +} + +svfloat64_t test_svmad_n_f64_z(svbool_t pg, svfloat64_t op1, svfloat64_t op2, float64_t op3) +{ + // CHECK-LABEL: test_svmad_n_f64_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv2f64(double %op3) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv2f64( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmad.nxv2f64( %[[PG]], %[[SEL]], %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_n_f64,_z,)(pg, op1, op2, op3); +} + +svfloat16_t test_svmad_n_f16_m(svbool_t pg, svfloat16_t op1, svfloat16_t op2, float16_t op3) +{ + // CHECK-LABEL: test_svmad_n_f16_m + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv8f16(half %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmad.nxv8f16( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_n_f16,_m,)(pg, op1, op2, op3); +} + +svfloat32_t test_svmad_n_f32_m(svbool_t pg, svfloat32_t op1, svfloat32_t op2, float32_t op3) +{ + // CHECK-LABEL: test_svmad_n_f32_m + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv4f32(float %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmad.nxv4f32( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_n_f32,_m,)(pg, op1, op2, op3); +} + +svfloat64_t test_svmad_n_f64_m(svbool_t pg, svfloat64_t op1, svfloat64_t op2, float64_t op3) +{ + // CHECK-LABEL: test_svmad_n_f64_m + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv2f64(double %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmad.nxv2f64( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_n_f64,_m,)(pg, op1, op2, op3); +} + +svfloat16_t test_svmad_n_f16_x(svbool_t pg, svfloat16_t op1, svfloat16_t op2, float16_t op3) +{ + // CHECK-LABEL: test_svmad_n_f16_x + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv8f16(half %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmad.nxv8f16( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_n_f16,_x,)(pg, op1, op2, op3); +} + +svfloat32_t test_svmad_n_f32_x(svbool_t pg, svfloat32_t op1, svfloat32_t op2, float32_t op3) +{ + // CHECK-LABEL: test_svmad_n_f32_x + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv4f32(float %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmad.nxv4f32( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_n_f32,_x,)(pg, op1, op2, op3); +} + +svfloat64_t test_svmad_n_f64_x(svbool_t pg, svfloat64_t op1, svfloat64_t op2, float64_t op3) +{ + // CHECK-LABEL: test_svmad_n_f64_x + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv2f64(double %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmad.nxv2f64( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmad,_n_f64,_x,)(pg, op1, op2, op3); +} diff --git a/clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_mla.c b/clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_mla.c --- a/clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_mla.c +++ b/clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_mla.c @@ -10,6 +10,641 @@ #define SVE_ACLE_FUNC(A1,A2,A3,A4) A1##A2##A3##A4 #endif +svint8_t test_svmla_s8_z(svbool_t pg, svint8_t op1, svint8_t op2, svint8_t op3) +{ + // CHECK-LABEL: test_svmla_s8_z + // CHECK: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv16i8( %pg, %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mla.nxv16i8( %pg, %[[SEL]], %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_s8,_z,)(pg, op1, op2, op3); +} + +svint16_t test_svmla_s16_z(svbool_t pg, svint16_t op1, svint16_t op2, svint16_t op3) +{ + // CHECK-LABEL: test_svmla_s16_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv8i16( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mla.nxv8i16( %[[PG]], %[[SEL]], %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_s16,_z,)(pg, op1, op2, op3); +} + +svint32_t test_svmla_s32_z(svbool_t pg, svint32_t op1, svint32_t op2, svint32_t op3) +{ + // CHECK-LABEL: test_svmla_s32_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv4i32( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mla.nxv4i32( %[[PG]], %[[SEL]], %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_s32,_z,)(pg, op1, op2, op3); +} + +svint64_t test_svmla_s64_z(svbool_t pg, svint64_t op1, svint64_t op2, svint64_t op3) +{ + // CHECK-LABEL: test_svmla_s64_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv2i64( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mla.nxv2i64( %[[PG]], %[[SEL]], %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_s64,_z,)(pg, op1, op2, op3); +} + +svuint8_t test_svmla_u8_z(svbool_t pg, svuint8_t op1, svuint8_t op2, svuint8_t op3) +{ + // CHECK-LABEL: test_svmla_u8_z + // CHECK: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv16i8( %pg, %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mla.nxv16i8( %pg, %[[SEL]], %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_u8,_z,)(pg, op1, op2, op3); +} + +svuint16_t test_svmla_u16_z(svbool_t pg, svuint16_t op1, svuint16_t op2, svuint16_t op3) +{ + // CHECK-LABEL: test_svmla_u16_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv8i16( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mla.nxv8i16( %[[PG]], %[[SEL]], %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_u16,_z,)(pg, op1, op2, op3); +} + +svuint32_t test_svmla_u32_z(svbool_t pg, svuint32_t op1, svuint32_t op2, svuint32_t op3) +{ + // CHECK-LABEL: test_svmla_u32_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv4i32( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mla.nxv4i32( %[[PG]], %[[SEL]], %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_u32,_z,)(pg, op1, op2, op3); +} + +svuint64_t test_svmla_u64_z(svbool_t pg, svuint64_t op1, svuint64_t op2, svuint64_t op3) +{ + // CHECK-LABEL: test_svmla_u64_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv2i64( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mla.nxv2i64( %[[PG]], %[[SEL]], %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_u64,_z,)(pg, op1, op2, op3); +} + +svint8_t test_svmla_s8_m(svbool_t pg, svint8_t op1, svint8_t op2, svint8_t op3) +{ + // CHECK-LABEL: test_svmla_s8_m + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mla.nxv16i8( %pg, %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_s8,_m,)(pg, op1, op2, op3); +} + +svint16_t test_svmla_s16_m(svbool_t pg, svint16_t op1, svint16_t op2, svint16_t op3) +{ + // CHECK-LABEL: test_svmla_s16_m + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mla.nxv8i16( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_s16,_m,)(pg, op1, op2, op3); +} + +svint32_t test_svmla_s32_m(svbool_t pg, svint32_t op1, svint32_t op2, svint32_t op3) +{ + // CHECK-LABEL: test_svmla_s32_m + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mla.nxv4i32( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_s32,_m,)(pg, op1, op2, op3); +} + +svint64_t test_svmla_s64_m(svbool_t pg, svint64_t op1, svint64_t op2, svint64_t op3) +{ + // CHECK-LABEL: test_svmla_s64_m + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mla.nxv2i64( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_s64,_m,)(pg, op1, op2, op3); +} + +svuint8_t test_svmla_u8_m(svbool_t pg, svuint8_t op1, svuint8_t op2, svuint8_t op3) +{ + // CHECK-LABEL: test_svmla_u8_m + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mla.nxv16i8( %pg, %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_u8,_m,)(pg, op1, op2, op3); +} + +svuint16_t test_svmla_u16_m(svbool_t pg, svuint16_t op1, svuint16_t op2, svuint16_t op3) +{ + // CHECK-LABEL: test_svmla_u16_m + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mla.nxv8i16( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_u16,_m,)(pg, op1, op2, op3); +} + +svuint32_t test_svmla_u32_m(svbool_t pg, svuint32_t op1, svuint32_t op2, svuint32_t op3) +{ + // CHECK-LABEL: test_svmla_u32_m + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mla.nxv4i32( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_u32,_m,)(pg, op1, op2, op3); +} + +svuint64_t test_svmla_u64_m(svbool_t pg, svuint64_t op1, svuint64_t op2, svuint64_t op3) +{ + // CHECK-LABEL: test_svmla_u64_m + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mla.nxv2i64( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_u64,_m,)(pg, op1, op2, op3); +} + +svint8_t test_svmla_s8_x(svbool_t pg, svint8_t op1, svint8_t op2, svint8_t op3) +{ + // CHECK-LABEL: test_svmla_s8_x + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mla.nxv16i8( %pg, %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_s8,_x,)(pg, op1, op2, op3); +} + +svint16_t test_svmla_s16_x(svbool_t pg, svint16_t op1, svint16_t op2, svint16_t op3) +{ + // CHECK-LABEL: test_svmla_s16_x + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mla.nxv8i16( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_s16,_x,)(pg, op1, op2, op3); +} + +svint32_t test_svmla_s32_x(svbool_t pg, svint32_t op1, svint32_t op2, svint32_t op3) +{ + // CHECK-LABEL: test_svmla_s32_x + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mla.nxv4i32( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_s32,_x,)(pg, op1, op2, op3); +} + +svint64_t test_svmla_s64_x(svbool_t pg, svint64_t op1, svint64_t op2, svint64_t op3) +{ + // CHECK-LABEL: test_svmla_s64_x + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mla.nxv2i64( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_s64,_x,)(pg, op1, op2, op3); +} + +svuint8_t test_svmla_u8_x(svbool_t pg, svuint8_t op1, svuint8_t op2, svuint8_t op3) +{ + // CHECK-LABEL: test_svmla_u8_x + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mla.nxv16i8( %pg, %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_u8,_x,)(pg, op1, op2, op3); +} + +svuint16_t test_svmla_u16_x(svbool_t pg, svuint16_t op1, svuint16_t op2, svuint16_t op3) +{ + // CHECK-LABEL: test_svmla_u16_x + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mla.nxv8i16( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_u16,_x,)(pg, op1, op2, op3); +} + +svuint32_t test_svmla_u32_x(svbool_t pg, svuint32_t op1, svuint32_t op2, svuint32_t op3) +{ + // CHECK-LABEL: test_svmla_u32_x + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mla.nxv4i32( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_u32,_x,)(pg, op1, op2, op3); +} + +svuint64_t test_svmla_u64_x(svbool_t pg, svuint64_t op1, svuint64_t op2, svuint64_t op3) +{ + // CHECK-LABEL: test_svmla_u64_x + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mla.nxv2i64( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_u64,_x,)(pg, op1, op2, op3); +} + +svint8_t test_svmla_n_s8_z(svbool_t pg, svint8_t op1, svint8_t op2, int8_t op3) +{ + // CHECK-LABEL: test_svmla_n_s8_z + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv16i8(i8 %op3) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv16i8( %pg, %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mla.nxv16i8( %pg, %[[SEL]], %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_n_s8,_z,)(pg, op1, op2, op3); +} + +svint16_t test_svmla_n_s16_z(svbool_t pg, svint16_t op1, svint16_t op2, int16_t op3) +{ + // CHECK-LABEL: test_svmla_n_s16_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv8i16(i16 %op3) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv8i16( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mla.nxv8i16( %[[PG]], %[[SEL]], %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_n_s16,_z,)(pg, op1, op2, op3); +} + +svint32_t test_svmla_n_s32_z(svbool_t pg, svint32_t op1, svint32_t op2, int32_t op3) +{ + // CHECK-LABEL: test_svmla_n_s32_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv4i32(i32 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mla.nxv4i32( %[[PG]], %[[SEL]], %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_n_s32,_z,)(pg, op1, op2, op3); +} + +svint64_t test_svmla_n_s64_z(svbool_t pg, svint64_t op1, svint64_t op2, int64_t op3) +{ + // CHECK-LABEL: test_svmla_n_s64_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv2i64(i64 %op3) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv2i64( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mla.nxv2i64( %[[PG]], %[[SEL]], %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_n_s64,_z,)(pg, op1, op2, op3); +} + +svuint8_t test_svmla_n_u8_z(svbool_t pg, svuint8_t op1, svuint8_t op2, uint8_t op3) +{ + // CHECK-LABEL: test_svmla_n_u8_z + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv16i8(i8 %op3) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv16i8( %pg, %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mla.nxv16i8( %pg, %[[SEL]], %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_n_u8,_z,)(pg, op1, op2, op3); +} + +svuint16_t test_svmla_n_u16_z(svbool_t pg, svuint16_t op1, svuint16_t op2, uint16_t op3) +{ + // CHECK-LABEL: test_svmla_n_u16_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv8i16(i16 %op3) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv8i16( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mla.nxv8i16( %[[PG]], %[[SEL]], %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_n_u16,_z,)(pg, op1, op2, op3); +} + +svuint32_t test_svmla_n_u32_z(svbool_t pg, svuint32_t op1, svuint32_t op2, uint32_t op3) +{ + // CHECK-LABEL: test_svmla_n_u32_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv4i32(i32 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mla.nxv4i32( %[[PG]], %[[SEL]], %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_n_u32,_z,)(pg, op1, op2, op3); +} + +svuint64_t test_svmla_n_u64_z(svbool_t pg, svuint64_t op1, svuint64_t op2, uint64_t op3) +{ + // CHECK-LABEL: test_svmla_n_u64_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv2i64(i64 %op3) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv2i64( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mla.nxv2i64( %[[PG]], %[[SEL]], %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_n_u64,_z,)(pg, op1, op2, op3); +} + +svint8_t test_svmla_n_s8_m(svbool_t pg, svint8_t op1, svint8_t op2, int8_t op3) +{ + // CHECK-LABEL: test_svmla_n_s8_m + // CHECK: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv16i8(i8 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mla.nxv16i8( %pg, %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_n_s8,_m,)(pg, op1, op2, op3); +} + +svint16_t test_svmla_n_s16_m(svbool_t pg, svint16_t op1, svint16_t op2, int16_t op3) +{ + // CHECK-LABEL: test_svmla_n_s16_m + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv8i16(i16 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mla.nxv8i16( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_n_s16,_m,)(pg, op1, op2, op3); +} + +svint32_t test_svmla_n_s32_m(svbool_t pg, svint32_t op1, svint32_t op2, int32_t op3) +{ + // CHECK-LABEL: test_svmla_n_s32_m + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv4i32(i32 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mla.nxv4i32( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_n_s32,_m,)(pg, op1, op2, op3); +} + +svint64_t test_svmla_n_s64_m(svbool_t pg, svint64_t op1, svint64_t op2, int64_t op3) +{ + // CHECK-LABEL: test_svmla_n_s64_m + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv2i64(i64 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mla.nxv2i64( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_n_s64,_m,)(pg, op1, op2, op3); +} + +svuint8_t test_svmla_n_u8_m(svbool_t pg, svuint8_t op1, svuint8_t op2, uint8_t op3) +{ + // CHECK-LABEL: test_svmla_n_u8_m + // CHECK: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv16i8(i8 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mla.nxv16i8( %pg, %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_n_u8,_m,)(pg, op1, op2, op3); +} + +svuint16_t test_svmla_n_u16_m(svbool_t pg, svuint16_t op1, svuint16_t op2, uint16_t op3) +{ + // CHECK-LABEL: test_svmla_n_u16_m + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv8i16(i16 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mla.nxv8i16( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_n_u16,_m,)(pg, op1, op2, op3); +} + +svuint32_t test_svmla_n_u32_m(svbool_t pg, svuint32_t op1, svuint32_t op2, uint32_t op3) +{ + // CHECK-LABEL: test_svmla_n_u32_m + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv4i32(i32 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mla.nxv4i32( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_n_u32,_m,)(pg, op1, op2, op3); +} + +svuint64_t test_svmla_n_u64_m(svbool_t pg, svuint64_t op1, svuint64_t op2, uint64_t op3) +{ + // CHECK-LABEL: test_svmla_n_u64_m + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv2i64(i64 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mla.nxv2i64( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_n_u64,_m,)(pg, op1, op2, op3); +} + +svint8_t test_svmla_n_s8_x(svbool_t pg, svint8_t op1, svint8_t op2, int8_t op3) +{ + // CHECK-LABEL: test_svmla_n_s8_x + // CHECK: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv16i8(i8 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mla.nxv16i8( %pg, %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_n_s8,_x,)(pg, op1, op2, op3); +} + +svint16_t test_svmla_n_s16_x(svbool_t pg, svint16_t op1, svint16_t op2, int16_t op3) +{ + // CHECK-LABEL: test_svmla_n_s16_x + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv8i16(i16 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mla.nxv8i16( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_n_s16,_x,)(pg, op1, op2, op3); +} + +svint32_t test_svmla_n_s32_x(svbool_t pg, svint32_t op1, svint32_t op2, int32_t op3) +{ + // CHECK-LABEL: test_svmla_n_s32_x + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv4i32(i32 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mla.nxv4i32( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_n_s32,_x,)(pg, op1, op2, op3); +} + +svint64_t test_svmla_n_s64_x(svbool_t pg, svint64_t op1, svint64_t op2, int64_t op3) +{ + // CHECK-LABEL: test_svmla_n_s64_x + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv2i64(i64 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mla.nxv2i64( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_n_s64,_x,)(pg, op1, op2, op3); +} + +svuint8_t test_svmla_n_u8_x(svbool_t pg, svuint8_t op1, svuint8_t op2, uint8_t op3) +{ + // CHECK-LABEL: test_svmla_n_u8_x + // CHECK: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv16i8(i8 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mla.nxv16i8( %pg, %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_n_u8,_x,)(pg, op1, op2, op3); +} + +svuint16_t test_svmla_n_u16_x(svbool_t pg, svuint16_t op1, svuint16_t op2, uint16_t op3) +{ + // CHECK-LABEL: test_svmla_n_u16_x + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv8i16(i16 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mla.nxv8i16( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_n_u16,_x,)(pg, op1, op2, op3); +} + +svuint32_t test_svmla_n_u32_x(svbool_t pg, svuint32_t op1, svuint32_t op2, uint32_t op3) +{ + // CHECK-LABEL: test_svmla_n_u32_x + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv4i32(i32 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mla.nxv4i32( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_n_u32,_x,)(pg, op1, op2, op3); +} + +svuint64_t test_svmla_n_u64_x(svbool_t pg, svuint64_t op1, svuint64_t op2, uint64_t op3) +{ + // CHECK-LABEL: test_svmla_n_u64_x + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv2i64(i64 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mla.nxv2i64( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_n_u64,_x,)(pg, op1, op2, op3); +} + +svfloat16_t test_svmla_f16_z(svbool_t pg, svfloat16_t op1, svfloat16_t op2, svfloat16_t op3) +{ + // CHECK-LABEL: test_svmla_f16_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv8f16( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmla.nxv8f16( %[[PG]], %[[SEL]], %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_f16,_z,)(pg, op1, op2, op3); +} + +svfloat32_t test_svmla_f32_z(svbool_t pg, svfloat32_t op1, svfloat32_t op2, svfloat32_t op3) +{ + // CHECK-LABEL: test_svmla_f32_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv4f32( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmla.nxv4f32( %[[PG]], %[[SEL]], %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_f32,_z,)(pg, op1, op2, op3); +} + +svfloat64_t test_svmla_f64_z(svbool_t pg, svfloat64_t op1, svfloat64_t op2, svfloat64_t op3) +{ + // CHECK-LABEL: test_svmla_f64_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv2f64( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmla.nxv2f64( %[[PG]], %[[SEL]], %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_f64,_z,)(pg, op1, op2, op3); +} + +svfloat16_t test_svmla_f16_m(svbool_t pg, svfloat16_t op1, svfloat16_t op2, svfloat16_t op3) +{ + // CHECK-LABEL: test_svmla_f16_m + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmla.nxv8f16( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_f16,_m,)(pg, op1, op2, op3); +} + +svfloat32_t test_svmla_f32_m(svbool_t pg, svfloat32_t op1, svfloat32_t op2, svfloat32_t op3) +{ + // CHECK-LABEL: test_svmla_f32_m + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmla.nxv4f32( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_f32,_m,)(pg, op1, op2, op3); +} + +svfloat64_t test_svmla_f64_m(svbool_t pg, svfloat64_t op1, svfloat64_t op2, svfloat64_t op3) +{ + // CHECK-LABEL: test_svmla_f64_m + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmla.nxv2f64( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_f64,_m,)(pg, op1, op2, op3); +} + +svfloat16_t test_svmla_f16_x(svbool_t pg, svfloat16_t op1, svfloat16_t op2, svfloat16_t op3) +{ + // CHECK-LABEL: test_svmla_f16_x + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmla.nxv8f16( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_f16,_x,)(pg, op1, op2, op3); +} + +svfloat32_t test_svmla_f32_x(svbool_t pg, svfloat32_t op1, svfloat32_t op2, svfloat32_t op3) +{ + // CHECK-LABEL: test_svmla_f32_x + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmla.nxv4f32( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_f32,_x,)(pg, op1, op2, op3); +} + +svfloat64_t test_svmla_f64_x(svbool_t pg, svfloat64_t op1, svfloat64_t op2, svfloat64_t op3) +{ + // CHECK-LABEL: test_svmla_f64_x + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmla.nxv2f64( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_f64,_x,)(pg, op1, op2, op3); +} + +svfloat16_t test_svmla_n_f16_z(svbool_t pg, svfloat16_t op1, svfloat16_t op2, float16_t op3) +{ + // CHECK-LABEL: test_svmla_n_f16_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv8f16(half %op3) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv8f16( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmla.nxv8f16( %[[PG]], %[[SEL]], %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_n_f16,_z,)(pg, op1, op2, op3); +} + +svfloat32_t test_svmla_n_f32_z(svbool_t pg, svfloat32_t op1, svfloat32_t op2, float32_t op3) +{ + // CHECK-LABEL: test_svmla_n_f32_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv4f32(float %op3) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv4f32( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmla.nxv4f32( %[[PG]], %[[SEL]], %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_n_f32,_z,)(pg, op1, op2, op3); +} + +svfloat64_t test_svmla_n_f64_z(svbool_t pg, svfloat64_t op1, svfloat64_t op2, float64_t op3) +{ + // CHECK-LABEL: test_svmla_n_f64_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv2f64(double %op3) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv2f64( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmla.nxv2f64( %[[PG]], %[[SEL]], %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_n_f64,_z,)(pg, op1, op2, op3); +} + +svfloat16_t test_svmla_n_f16_m(svbool_t pg, svfloat16_t op1, svfloat16_t op2, float16_t op3) +{ + // CHECK-LABEL: test_svmla_n_f16_m + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv8f16(half %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmla.nxv8f16( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_n_f16,_m,)(pg, op1, op2, op3); +} + +svfloat32_t test_svmla_n_f32_m(svbool_t pg, svfloat32_t op1, svfloat32_t op2, float32_t op3) +{ + // CHECK-LABEL: test_svmla_n_f32_m + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv4f32(float %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmla.nxv4f32( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_n_f32,_m,)(pg, op1, op2, op3); +} + +svfloat64_t test_svmla_n_f64_m(svbool_t pg, svfloat64_t op1, svfloat64_t op2, float64_t op3) +{ + // CHECK-LABEL: test_svmla_n_f64_m + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv2f64(double %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmla.nxv2f64( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_n_f64,_m,)(pg, op1, op2, op3); +} + +svfloat16_t test_svmla_n_f16_x(svbool_t pg, svfloat16_t op1, svfloat16_t op2, float16_t op3) +{ + // CHECK-LABEL: test_svmla_n_f16_x + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv8f16(half %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmla.nxv8f16( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_n_f16,_x,)(pg, op1, op2, op3); +} + +svfloat32_t test_svmla_n_f32_x(svbool_t pg, svfloat32_t op1, svfloat32_t op2, float32_t op3) +{ + // CHECK-LABEL: test_svmla_n_f32_x + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv4f32(float %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmla.nxv4f32( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_n_f32,_x,)(pg, op1, op2, op3); +} + +svfloat64_t test_svmla_n_f64_x(svbool_t pg, svfloat64_t op1, svfloat64_t op2, float64_t op3) +{ + // CHECK-LABEL: test_svmla_n_f64_x + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv2f64(double %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmla.nxv2f64( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmla,_n_f64,_x,)(pg, op1, op2, op3); +} + svfloat16_t test_svmla_lane_f16(svfloat16_t op1, svfloat16_t op2, svfloat16_t op3) { // CHECK-LABEL: test_svmla_lane_f16 diff --git a/clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_mls.c b/clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_mls.c new file mode 100644 --- /dev/null +++ b/clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_mls.c @@ -0,0 +1,694 @@ +// RUN: %clang_cc1 -D__ARM_FEATURE_SVE -triple aarch64-none-linux-gnu -target-feature +sve -fallow-half-arguments-and-returns -S -O1 -Werror -Wall -emit-llvm -o - %s | FileCheck %s +// RUN: %clang_cc1 -D__ARM_FEATURE_SVE -DSVE_OVERLOADED_FORMS -triple aarch64-none-linux-gnu -target-feature +sve -fallow-half-arguments-and-returns -S -O1 -Werror -Wall -emit-llvm -o - %s | FileCheck %s + +#include + +#ifdef SVE_OVERLOADED_FORMS +// A simple used,unused... macro, long enough to represent any SVE builtin. +#define SVE_ACLE_FUNC(A1,A2_UNUSED,A3,A4_UNUSED) A1##A3 +#else +#define SVE_ACLE_FUNC(A1,A2,A3,A4) A1##A2##A3##A4 +#endif + +svint8_t test_svmls_s8_z(svbool_t pg, svint8_t op1, svint8_t op2, svint8_t op3) +{ + // CHECK-LABEL: test_svmls_s8_z + // CHECK: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv16i8( %pg, %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mls.nxv16i8( %pg, %[[SEL]], %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_s8,_z,)(pg, op1, op2, op3); +} + +svint16_t test_svmls_s16_z(svbool_t pg, svint16_t op1, svint16_t op2, svint16_t op3) +{ + // CHECK-LABEL: test_svmls_s16_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv8i16( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mls.nxv8i16( %[[PG]], %[[SEL]], %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_s16,_z,)(pg, op1, op2, op3); +} + +svint32_t test_svmls_s32_z(svbool_t pg, svint32_t op1, svint32_t op2, svint32_t op3) +{ + // CHECK-LABEL: test_svmls_s32_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv4i32( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mls.nxv4i32( %[[PG]], %[[SEL]], %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_s32,_z,)(pg, op1, op2, op3); +} + +svint64_t test_svmls_s64_z(svbool_t pg, svint64_t op1, svint64_t op2, svint64_t op3) +{ + // CHECK-LABEL: test_svmls_s64_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv2i64( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mls.nxv2i64( %[[PG]], %[[SEL]], %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_s64,_z,)(pg, op1, op2, op3); +} + +svuint8_t test_svmls_u8_z(svbool_t pg, svuint8_t op1, svuint8_t op2, svuint8_t op3) +{ + // CHECK-LABEL: test_svmls_u8_z + // CHECK: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv16i8( %pg, %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mls.nxv16i8( %pg, %[[SEL]], %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_u8,_z,)(pg, op1, op2, op3); +} + +svuint16_t test_svmls_u16_z(svbool_t pg, svuint16_t op1, svuint16_t op2, svuint16_t op3) +{ + // CHECK-LABEL: test_svmls_u16_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv8i16( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mls.nxv8i16( %[[PG]], %[[SEL]], %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_u16,_z,)(pg, op1, op2, op3); +} + +svuint32_t test_svmls_u32_z(svbool_t pg, svuint32_t op1, svuint32_t op2, svuint32_t op3) +{ + // CHECK-LABEL: test_svmls_u32_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv4i32( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mls.nxv4i32( %[[PG]], %[[SEL]], %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_u32,_z,)(pg, op1, op2, op3); +} + +svuint64_t test_svmls_u64_z(svbool_t pg, svuint64_t op1, svuint64_t op2, svuint64_t op3) +{ + // CHECK-LABEL: test_svmls_u64_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv2i64( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mls.nxv2i64( %[[PG]], %[[SEL]], %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_u64,_z,)(pg, op1, op2, op3); +} + +svint8_t test_svmls_s8_m(svbool_t pg, svint8_t op1, svint8_t op2, svint8_t op3) +{ + // CHECK-LABEL: test_svmls_s8_m + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mls.nxv16i8( %pg, %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_s8,_m,)(pg, op1, op2, op3); +} + +svint16_t test_svmls_s16_m(svbool_t pg, svint16_t op1, svint16_t op2, svint16_t op3) +{ + // CHECK-LABEL: test_svmls_s16_m + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mls.nxv8i16( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_s16,_m,)(pg, op1, op2, op3); +} + +svint32_t test_svmls_s32_m(svbool_t pg, svint32_t op1, svint32_t op2, svint32_t op3) +{ + // CHECK-LABEL: test_svmls_s32_m + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mls.nxv4i32( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_s32,_m,)(pg, op1, op2, op3); +} + +svint64_t test_svmls_s64_m(svbool_t pg, svint64_t op1, svint64_t op2, svint64_t op3) +{ + // CHECK-LABEL: test_svmls_s64_m + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mls.nxv2i64( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_s64,_m,)(pg, op1, op2, op3); +} + +svuint8_t test_svmls_u8_m(svbool_t pg, svuint8_t op1, svuint8_t op2, svuint8_t op3) +{ + // CHECK-LABEL: test_svmls_u8_m + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mls.nxv16i8( %pg, %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_u8,_m,)(pg, op1, op2, op3); +} + +svuint16_t test_svmls_u16_m(svbool_t pg, svuint16_t op1, svuint16_t op2, svuint16_t op3) +{ + // CHECK-LABEL: test_svmls_u16_m + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mls.nxv8i16( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_u16,_m,)(pg, op1, op2, op3); +} + +svuint32_t test_svmls_u32_m(svbool_t pg, svuint32_t op1, svuint32_t op2, svuint32_t op3) +{ + // CHECK-LABEL: test_svmls_u32_m + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mls.nxv4i32( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_u32,_m,)(pg, op1, op2, op3); +} + +svuint64_t test_svmls_u64_m(svbool_t pg, svuint64_t op1, svuint64_t op2, svuint64_t op3) +{ + // CHECK-LABEL: test_svmls_u64_m + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mls.nxv2i64( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_u64,_m,)(pg, op1, op2, op3); +} + +svint8_t test_svmls_s8_x(svbool_t pg, svint8_t op1, svint8_t op2, svint8_t op3) +{ + // CHECK-LABEL: test_svmls_s8_x + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mls.nxv16i8( %pg, %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_s8,_x,)(pg, op1, op2, op3); +} + +svint16_t test_svmls_s16_x(svbool_t pg, svint16_t op1, svint16_t op2, svint16_t op3) +{ + // CHECK-LABEL: test_svmls_s16_x + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mls.nxv8i16( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_s16,_x,)(pg, op1, op2, op3); +} + +svint32_t test_svmls_s32_x(svbool_t pg, svint32_t op1, svint32_t op2, svint32_t op3) +{ + // CHECK-LABEL: test_svmls_s32_x + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mls.nxv4i32( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_s32,_x,)(pg, op1, op2, op3); +} + +svint64_t test_svmls_s64_x(svbool_t pg, svint64_t op1, svint64_t op2, svint64_t op3) +{ + // CHECK-LABEL: test_svmls_s64_x + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mls.nxv2i64( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_s64,_x,)(pg, op1, op2, op3); +} + +svuint8_t test_svmls_u8_x(svbool_t pg, svuint8_t op1, svuint8_t op2, svuint8_t op3) +{ + // CHECK-LABEL: test_svmls_u8_x + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mls.nxv16i8( %pg, %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_u8,_x,)(pg, op1, op2, op3); +} + +svuint16_t test_svmls_u16_x(svbool_t pg, svuint16_t op1, svuint16_t op2, svuint16_t op3) +{ + // CHECK-LABEL: test_svmls_u16_x + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mls.nxv8i16( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_u16,_x,)(pg, op1, op2, op3); +} + +svuint32_t test_svmls_u32_x(svbool_t pg, svuint32_t op1, svuint32_t op2, svuint32_t op3) +{ + // CHECK-LABEL: test_svmls_u32_x + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mls.nxv4i32( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_u32,_x,)(pg, op1, op2, op3); +} + +svuint64_t test_svmls_u64_x(svbool_t pg, svuint64_t op1, svuint64_t op2, svuint64_t op3) +{ + // CHECK-LABEL: test_svmls_u64_x + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mls.nxv2i64( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_u64,_x,)(pg, op1, op2, op3); +} + +svint8_t test_svmls_n_s8_z(svbool_t pg, svint8_t op1, svint8_t op2, int8_t op3) +{ + // CHECK-LABEL: test_svmls_n_s8_z + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv16i8(i8 %op3) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv16i8( %pg, %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mls.nxv16i8( %pg, %[[SEL]], %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_n_s8,_z,)(pg, op1, op2, op3); +} + +svint16_t test_svmls_n_s16_z(svbool_t pg, svint16_t op1, svint16_t op2, int16_t op3) +{ + // CHECK-LABEL: test_svmls_n_s16_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv8i16(i16 %op3) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv8i16( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mls.nxv8i16( %[[PG]], %[[SEL]], %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_n_s16,_z,)(pg, op1, op2, op3); +} + +svint32_t test_svmls_n_s32_z(svbool_t pg, svint32_t op1, svint32_t op2, int32_t op3) +{ + // CHECK-LABEL: test_svmls_n_s32_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv4i32(i32 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mls.nxv4i32( %[[PG]], %[[SEL]], %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_n_s32,_z,)(pg, op1, op2, op3); +} + +svint64_t test_svmls_n_s64_z(svbool_t pg, svint64_t op1, svint64_t op2, int64_t op3) +{ + // CHECK-LABEL: test_svmls_n_s64_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv2i64(i64 %op3) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv2i64( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mls.nxv2i64( %[[PG]], %[[SEL]], %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_n_s64,_z,)(pg, op1, op2, op3); +} + +svuint8_t test_svmls_n_u8_z(svbool_t pg, svuint8_t op1, svuint8_t op2, uint8_t op3) +{ + // CHECK-LABEL: test_svmls_n_u8_z + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv16i8(i8 %op3) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv16i8( %pg, %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mls.nxv16i8( %pg, %[[SEL]], %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_n_u8,_z,)(pg, op1, op2, op3); +} + +svuint16_t test_svmls_n_u16_z(svbool_t pg, svuint16_t op1, svuint16_t op2, uint16_t op3) +{ + // CHECK-LABEL: test_svmls_n_u16_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv8i16(i16 %op3) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv8i16( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mls.nxv8i16( %[[PG]], %[[SEL]], %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_n_u16,_z,)(pg, op1, op2, op3); +} + +svuint32_t test_svmls_n_u32_z(svbool_t pg, svuint32_t op1, svuint32_t op2, uint32_t op3) +{ + // CHECK-LABEL: test_svmls_n_u32_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv4i32(i32 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mls.nxv4i32( %[[PG]], %[[SEL]], %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_n_u32,_z,)(pg, op1, op2, op3); +} + +svuint64_t test_svmls_n_u64_z(svbool_t pg, svuint64_t op1, svuint64_t op2, uint64_t op3) +{ + // CHECK-LABEL: test_svmls_n_u64_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv2i64(i64 %op3) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv2i64( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mls.nxv2i64( %[[PG]], %[[SEL]], %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_n_u64,_z,)(pg, op1, op2, op3); +} + +svint8_t test_svmls_n_s8_m(svbool_t pg, svint8_t op1, svint8_t op2, int8_t op3) +{ + // CHECK-LABEL: test_svmls_n_s8_m + // CHECK: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv16i8(i8 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mls.nxv16i8( %pg, %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_n_s8,_m,)(pg, op1, op2, op3); +} + +svint16_t test_svmls_n_s16_m(svbool_t pg, svint16_t op1, svint16_t op2, int16_t op3) +{ + // CHECK-LABEL: test_svmls_n_s16_m + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv8i16(i16 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mls.nxv8i16( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_n_s16,_m,)(pg, op1, op2, op3); +} + +svint32_t test_svmls_n_s32_m(svbool_t pg, svint32_t op1, svint32_t op2, int32_t op3) +{ + // CHECK-LABEL: test_svmls_n_s32_m + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv4i32(i32 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mls.nxv4i32( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_n_s32,_m,)(pg, op1, op2, op3); +} + +svint64_t test_svmls_n_s64_m(svbool_t pg, svint64_t op1, svint64_t op2, int64_t op3) +{ + // CHECK-LABEL: test_svmls_n_s64_m + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv2i64(i64 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mls.nxv2i64( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_n_s64,_m,)(pg, op1, op2, op3); +} + +svuint8_t test_svmls_n_u8_m(svbool_t pg, svuint8_t op1, svuint8_t op2, uint8_t op3) +{ + // CHECK-LABEL: test_svmls_n_u8_m + // CHECK: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv16i8(i8 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mls.nxv16i8( %pg, %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_n_u8,_m,)(pg, op1, op2, op3); +} + +svuint16_t test_svmls_n_u16_m(svbool_t pg, svuint16_t op1, svuint16_t op2, uint16_t op3) +{ + // CHECK-LABEL: test_svmls_n_u16_m + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv8i16(i16 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mls.nxv8i16( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_n_u16,_m,)(pg, op1, op2, op3); +} + +svuint32_t test_svmls_n_u32_m(svbool_t pg, svuint32_t op1, svuint32_t op2, uint32_t op3) +{ + // CHECK-LABEL: test_svmls_n_u32_m + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv4i32(i32 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mls.nxv4i32( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_n_u32,_m,)(pg, op1, op2, op3); +} + +svuint64_t test_svmls_n_u64_m(svbool_t pg, svuint64_t op1, svuint64_t op2, uint64_t op3) +{ + // CHECK-LABEL: test_svmls_n_u64_m + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv2i64(i64 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mls.nxv2i64( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_n_u64,_m,)(pg, op1, op2, op3); +} + +svint8_t test_svmls_n_s8_x(svbool_t pg, svint8_t op1, svint8_t op2, int8_t op3) +{ + // CHECK-LABEL: test_svmls_n_s8_x + // CHECK: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv16i8(i8 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mls.nxv16i8( %pg, %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_n_s8,_x,)(pg, op1, op2, op3); +} + +svint16_t test_svmls_n_s16_x(svbool_t pg, svint16_t op1, svint16_t op2, int16_t op3) +{ + // CHECK-LABEL: test_svmls_n_s16_x + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv8i16(i16 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mls.nxv8i16( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_n_s16,_x,)(pg, op1, op2, op3); +} + +svint32_t test_svmls_n_s32_x(svbool_t pg, svint32_t op1, svint32_t op2, int32_t op3) +{ + // CHECK-LABEL: test_svmls_n_s32_x + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv4i32(i32 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mls.nxv4i32( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_n_s32,_x,)(pg, op1, op2, op3); +} + +svint64_t test_svmls_n_s64_x(svbool_t pg, svint64_t op1, svint64_t op2, int64_t op3) +{ + // CHECK-LABEL: test_svmls_n_s64_x + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv2i64(i64 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mls.nxv2i64( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_n_s64,_x,)(pg, op1, op2, op3); +} + +svuint8_t test_svmls_n_u8_x(svbool_t pg, svuint8_t op1, svuint8_t op2, uint8_t op3) +{ + // CHECK-LABEL: test_svmls_n_u8_x + // CHECK: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv16i8(i8 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mls.nxv16i8( %pg, %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_n_u8,_x,)(pg, op1, op2, op3); +} + +svuint16_t test_svmls_n_u16_x(svbool_t pg, svuint16_t op1, svuint16_t op2, uint16_t op3) +{ + // CHECK-LABEL: test_svmls_n_u16_x + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv8i16(i16 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mls.nxv8i16( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_n_u16,_x,)(pg, op1, op2, op3); +} + +svuint32_t test_svmls_n_u32_x(svbool_t pg, svuint32_t op1, svuint32_t op2, uint32_t op3) +{ + // CHECK-LABEL: test_svmls_n_u32_x + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv4i32(i32 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mls.nxv4i32( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_n_u32,_x,)(pg, op1, op2, op3); +} + +svuint64_t test_svmls_n_u64_x(svbool_t pg, svuint64_t op1, svuint64_t op2, uint64_t op3) +{ + // CHECK-LABEL: test_svmls_n_u64_x + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv2i64(i64 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.mls.nxv2i64( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_n_u64,_x,)(pg, op1, op2, op3); +} + +svfloat16_t test_svmls_f16_z(svbool_t pg, svfloat16_t op1, svfloat16_t op2, svfloat16_t op3) +{ + // CHECK-LABEL: test_svmls_f16_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv8f16( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmls.nxv8f16( %[[PG]], %[[SEL]], %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_f16,_z,)(pg, op1, op2, op3); +} + +svfloat32_t test_svmls_f32_z(svbool_t pg, svfloat32_t op1, svfloat32_t op2, svfloat32_t op3) +{ + // CHECK-LABEL: test_svmls_f32_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv4f32( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmls.nxv4f32( %[[PG]], %[[SEL]], %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_f32,_z,)(pg, op1, op2, op3); +} + +svfloat64_t test_svmls_f64_z(svbool_t pg, svfloat64_t op1, svfloat64_t op2, svfloat64_t op3) +{ + // CHECK-LABEL: test_svmls_f64_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv2f64( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmls.nxv2f64( %[[PG]], %[[SEL]], %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_f64,_z,)(pg, op1, op2, op3); +} + +svfloat16_t test_svmls_f16_m(svbool_t pg, svfloat16_t op1, svfloat16_t op2, svfloat16_t op3) +{ + // CHECK-LABEL: test_svmls_f16_m + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmls.nxv8f16( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_f16,_m,)(pg, op1, op2, op3); +} + +svfloat32_t test_svmls_f32_m(svbool_t pg, svfloat32_t op1, svfloat32_t op2, svfloat32_t op3) +{ + // CHECK-LABEL: test_svmls_f32_m + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmls.nxv4f32( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_f32,_m,)(pg, op1, op2, op3); +} + +svfloat64_t test_svmls_f64_m(svbool_t pg, svfloat64_t op1, svfloat64_t op2, svfloat64_t op3) +{ + // CHECK-LABEL: test_svmls_f64_m + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmls.nxv2f64( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_f64,_m,)(pg, op1, op2, op3); +} + +svfloat16_t test_svmls_f16_x(svbool_t pg, svfloat16_t op1, svfloat16_t op2, svfloat16_t op3) +{ + // CHECK-LABEL: test_svmls_f16_x + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmls.nxv8f16( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_f16,_x,)(pg, op1, op2, op3); +} + +svfloat32_t test_svmls_f32_x(svbool_t pg, svfloat32_t op1, svfloat32_t op2, svfloat32_t op3) +{ + // CHECK-LABEL: test_svmls_f32_x + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmls.nxv4f32( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_f32,_x,)(pg, op1, op2, op3); +} + +svfloat64_t test_svmls_f64_x(svbool_t pg, svfloat64_t op1, svfloat64_t op2, svfloat64_t op3) +{ + // CHECK-LABEL: test_svmls_f64_x + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmls.nxv2f64( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_f64,_x,)(pg, op1, op2, op3); +} + +svfloat16_t test_svmls_n_f16_z(svbool_t pg, svfloat16_t op1, svfloat16_t op2, float16_t op3) +{ + // CHECK-LABEL: test_svmls_n_f16_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv8f16(half %op3) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv8f16( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmls.nxv8f16( %[[PG]], %[[SEL]], %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_n_f16,_z,)(pg, op1, op2, op3); +} + +svfloat32_t test_svmls_n_f32_z(svbool_t pg, svfloat32_t op1, svfloat32_t op2, float32_t op3) +{ + // CHECK-LABEL: test_svmls_n_f32_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv4f32(float %op3) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv4f32( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmls.nxv4f32( %[[PG]], %[[SEL]], %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_n_f32,_z,)(pg, op1, op2, op3); +} + +svfloat64_t test_svmls_n_f64_z(svbool_t pg, svfloat64_t op1, svfloat64_t op2, float64_t op3) +{ + // CHECK-LABEL: test_svmls_n_f64_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv2f64(double %op3) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv2f64( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmls.nxv2f64( %[[PG]], %[[SEL]], %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_n_f64,_z,)(pg, op1, op2, op3); +} + +svfloat16_t test_svmls_n_f16_m(svbool_t pg, svfloat16_t op1, svfloat16_t op2, float16_t op3) +{ + // CHECK-LABEL: test_svmls_n_f16_m + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv8f16(half %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmls.nxv8f16( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_n_f16,_m,)(pg, op1, op2, op3); +} + +svfloat32_t test_svmls_n_f32_m(svbool_t pg, svfloat32_t op1, svfloat32_t op2, float32_t op3) +{ + // CHECK-LABEL: test_svmls_n_f32_m + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv4f32(float %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmls.nxv4f32( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_n_f32,_m,)(pg, op1, op2, op3); +} + +svfloat64_t test_svmls_n_f64_m(svbool_t pg, svfloat64_t op1, svfloat64_t op2, float64_t op3) +{ + // CHECK-LABEL: test_svmls_n_f64_m + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv2f64(double %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmls.nxv2f64( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_n_f64,_m,)(pg, op1, op2, op3); +} + +svfloat16_t test_svmls_n_f16_x(svbool_t pg, svfloat16_t op1, svfloat16_t op2, float16_t op3) +{ + // CHECK-LABEL: test_svmls_n_f16_x + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv8f16(half %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmls.nxv8f16( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_n_f16,_x,)(pg, op1, op2, op3); +} + +svfloat32_t test_svmls_n_f32_x(svbool_t pg, svfloat32_t op1, svfloat32_t op2, float32_t op3) +{ + // CHECK-LABEL: test_svmls_n_f32_x + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv4f32(float %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmls.nxv4f32( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_n_f32,_x,)(pg, op1, op2, op3); +} + +svfloat64_t test_svmls_n_f64_x(svbool_t pg, svfloat64_t op1, svfloat64_t op2, float64_t op3) +{ + // CHECK-LABEL: test_svmls_n_f64_x + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv2f64(double %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmls.nxv2f64( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls,_n_f64,_x,)(pg, op1, op2, op3); +} + +svfloat16_t test_svmls_lane_f16(svfloat16_t op1, svfloat16_t op2, svfloat16_t op3) +{ + // CHECK-LABEL: test_svmls_lane_f16 + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmls.lane.nxv8f16( %op1, %op2, %op3, i32 0) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls_lane,_f16,,)(op1, op2, op3, 0); +} + +svfloat16_t test_svmls_lane_f16_1(svfloat16_t op1, svfloat16_t op2, svfloat16_t op3) +{ + // CHECK-LABEL: test_svmls_lane_f16_1 + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmls.lane.nxv8f16( %op1, %op2, %op3, i32 7) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls_lane,_f16,,)(op1, op2, op3, 7); +} + +svfloat32_t test_svmls_lane_f32(svfloat32_t op1, svfloat32_t op2, svfloat32_t op3) +{ + // CHECK-LABEL: test_svmls_lane_f32 + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmls.lane.nxv4f32( %op1, %op2, %op3, i32 0) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls_lane,_f32,,)(op1, op2, op3, 0); +} + +svfloat32_t test_svmls_lane_f32_1(svfloat32_t op1, svfloat32_t op2, svfloat32_t op3) +{ + // CHECK-LABEL: test_svmls_lane_f32_1 + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmls.lane.nxv4f32( %op1, %op2, %op3, i32 3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls_lane,_f32,,)(op1, op2, op3, 3); +} + +svfloat64_t test_svmls_lane_f64(svfloat64_t op1, svfloat64_t op2, svfloat64_t op3) +{ + // CHECK-LABEL: test_svmls_lane_f64 + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmls.lane.nxv2f64( %op1, %op2, %op3, i32 0) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls_lane,_f64,,)(op1, op2, op3, 0); +} + +svfloat64_t test_svmls_lane_f64_1(svfloat64_t op1, svfloat64_t op2, svfloat64_t op3) +{ + // CHECK-LABEL: test_svmls_lane_f64_1 + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmls.lane.nxv2f64( %op1, %op2, %op3, i32 1) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmls_lane,_f64,,)(op1, op2, op3, 1); +} diff --git a/clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_msb.c b/clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_msb.c new file mode 100644 --- /dev/null +++ b/clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_msb.c @@ -0,0 +1,646 @@ +// RUN: %clang_cc1 -D__ARM_FEATURE_SVE -triple aarch64-none-linux-gnu -target-feature +sve -fallow-half-arguments-and-returns -S -O1 -Werror -Wall -emit-llvm -o - %s | FileCheck %s +// RUN: %clang_cc1 -D__ARM_FEATURE_SVE -DSVE_OVERLOADED_FORMS -triple aarch64-none-linux-gnu -target-feature +sve -fallow-half-arguments-and-returns -S -O1 -Werror -Wall -emit-llvm -o - %s | FileCheck %s + +#include + +#ifdef SVE_OVERLOADED_FORMS +// A simple used,unused... macro, long enough to represent any SVE builtin. +#define SVE_ACLE_FUNC(A1,A2_UNUSED,A3,A4_UNUSED) A1##A3 +#else +#define SVE_ACLE_FUNC(A1,A2,A3,A4) A1##A2##A3##A4 +#endif + +svint8_t test_svmsb_s8_z(svbool_t pg, svint8_t op1, svint8_t op2, svint8_t op3) +{ + // CHECK-LABEL: test_svmsb_s8_z + // CHECK: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv16i8( %pg, %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.msb.nxv16i8( %pg, %[[SEL]], %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_s8,_z,)(pg, op1, op2, op3); +} + +svint16_t test_svmsb_s16_z(svbool_t pg, svint16_t op1, svint16_t op2, svint16_t op3) +{ + // CHECK-LABEL: test_svmsb_s16_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv8i16( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.msb.nxv8i16( %[[PG]], %[[SEL]], %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_s16,_z,)(pg, op1, op2, op3); +} + +svint32_t test_svmsb_s32_z(svbool_t pg, svint32_t op1, svint32_t op2, svint32_t op3) +{ + // CHECK-LABEL: test_svmsb_s32_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv4i32( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.msb.nxv4i32( %[[PG]], %[[SEL]], %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_s32,_z,)(pg, op1, op2, op3); +} + +svint64_t test_svmsb_s64_z(svbool_t pg, svint64_t op1, svint64_t op2, svint64_t op3) +{ + // CHECK-LABEL: test_svmsb_s64_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv2i64( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.msb.nxv2i64( %[[PG]], %[[SEL]], %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_s64,_z,)(pg, op1, op2, op3); +} + +svuint8_t test_svmsb_u8_z(svbool_t pg, svuint8_t op1, svuint8_t op2, svuint8_t op3) +{ + // CHECK-LABEL: test_svmsb_u8_z + // CHECK: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv16i8( %pg, %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.msb.nxv16i8( %pg, %[[SEL]], %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_u8,_z,)(pg, op1, op2, op3); +} + +svuint16_t test_svmsb_u16_z(svbool_t pg, svuint16_t op1, svuint16_t op2, svuint16_t op3) +{ + // CHECK-LABEL: test_svmsb_u16_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv8i16( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.msb.nxv8i16( %[[PG]], %[[SEL]], %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_u16,_z,)(pg, op1, op2, op3); +} + +svuint32_t test_svmsb_u32_z(svbool_t pg, svuint32_t op1, svuint32_t op2, svuint32_t op3) +{ + // CHECK-LABEL: test_svmsb_u32_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv4i32( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.msb.nxv4i32( %[[PG]], %[[SEL]], %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_u32,_z,)(pg, op1, op2, op3); +} + +svuint64_t test_svmsb_u64_z(svbool_t pg, svuint64_t op1, svuint64_t op2, svuint64_t op3) +{ + // CHECK-LABEL: test_svmsb_u64_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv2i64( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.msb.nxv2i64( %[[PG]], %[[SEL]], %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_u64,_z,)(pg, op1, op2, op3); +} + +svint8_t test_svmsb_s8_m(svbool_t pg, svint8_t op1, svint8_t op2, svint8_t op3) +{ + // CHECK-LABEL: test_svmsb_s8_m + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.msb.nxv16i8( %pg, %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_s8,_m,)(pg, op1, op2, op3); +} + +svint16_t test_svmsb_s16_m(svbool_t pg, svint16_t op1, svint16_t op2, svint16_t op3) +{ + // CHECK-LABEL: test_svmsb_s16_m + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.msb.nxv8i16( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_s16,_m,)(pg, op1, op2, op3); +} + +svint32_t test_svmsb_s32_m(svbool_t pg, svint32_t op1, svint32_t op2, svint32_t op3) +{ + // CHECK-LABEL: test_svmsb_s32_m + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.msb.nxv4i32( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_s32,_m,)(pg, op1, op2, op3); +} + +svint64_t test_svmsb_s64_m(svbool_t pg, svint64_t op1, svint64_t op2, svint64_t op3) +{ + // CHECK-LABEL: test_svmsb_s64_m + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.msb.nxv2i64( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_s64,_m,)(pg, op1, op2, op3); +} + +svuint8_t test_svmsb_u8_m(svbool_t pg, svuint8_t op1, svuint8_t op2, svuint8_t op3) +{ + // CHECK-LABEL: test_svmsb_u8_m + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.msb.nxv16i8( %pg, %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_u8,_m,)(pg, op1, op2, op3); +} + +svuint16_t test_svmsb_u16_m(svbool_t pg, svuint16_t op1, svuint16_t op2, svuint16_t op3) +{ + // CHECK-LABEL: test_svmsb_u16_m + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.msb.nxv8i16( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_u16,_m,)(pg, op1, op2, op3); +} + +svuint32_t test_svmsb_u32_m(svbool_t pg, svuint32_t op1, svuint32_t op2, svuint32_t op3) +{ + // CHECK-LABEL: test_svmsb_u32_m + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.msb.nxv4i32( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_u32,_m,)(pg, op1, op2, op3); +} + +svuint64_t test_svmsb_u64_m(svbool_t pg, svuint64_t op1, svuint64_t op2, svuint64_t op3) +{ + // CHECK-LABEL: test_svmsb_u64_m + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.msb.nxv2i64( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_u64,_m,)(pg, op1, op2, op3); +} + +svint8_t test_svmsb_s8_x(svbool_t pg, svint8_t op1, svint8_t op2, svint8_t op3) +{ + // CHECK-LABEL: test_svmsb_s8_x + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.msb.nxv16i8( %pg, %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_s8,_x,)(pg, op1, op2, op3); +} + +svint16_t test_svmsb_s16_x(svbool_t pg, svint16_t op1, svint16_t op2, svint16_t op3) +{ + // CHECK-LABEL: test_svmsb_s16_x + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.msb.nxv8i16( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_s16,_x,)(pg, op1, op2, op3); +} + +svint32_t test_svmsb_s32_x(svbool_t pg, svint32_t op1, svint32_t op2, svint32_t op3) +{ + // CHECK-LABEL: test_svmsb_s32_x + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.msb.nxv4i32( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_s32,_x,)(pg, op1, op2, op3); +} + +svint64_t test_svmsb_s64_x(svbool_t pg, svint64_t op1, svint64_t op2, svint64_t op3) +{ + // CHECK-LABEL: test_svmsb_s64_x + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.msb.nxv2i64( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_s64,_x,)(pg, op1, op2, op3); +} + +svuint8_t test_svmsb_u8_x(svbool_t pg, svuint8_t op1, svuint8_t op2, svuint8_t op3) +{ + // CHECK-LABEL: test_svmsb_u8_x + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.msb.nxv16i8( %pg, %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_u8,_x,)(pg, op1, op2, op3); +} + +svuint16_t test_svmsb_u16_x(svbool_t pg, svuint16_t op1, svuint16_t op2, svuint16_t op3) +{ + // CHECK-LABEL: test_svmsb_u16_x + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.msb.nxv8i16( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_u16,_x,)(pg, op1, op2, op3); +} + +svuint32_t test_svmsb_u32_x(svbool_t pg, svuint32_t op1, svuint32_t op2, svuint32_t op3) +{ + // CHECK-LABEL: test_svmsb_u32_x + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.msb.nxv4i32( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_u32,_x,)(pg, op1, op2, op3); +} + +svuint64_t test_svmsb_u64_x(svbool_t pg, svuint64_t op1, svuint64_t op2, svuint64_t op3) +{ + // CHECK-LABEL: test_svmsb_u64_x + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.msb.nxv2i64( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_u64,_x,)(pg, op1, op2, op3); +} + +svint8_t test_svmsb_n_s8_z(svbool_t pg, svint8_t op1, svint8_t op2, int8_t op3) +{ + // CHECK-LABEL: test_svmsb_n_s8_z + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv16i8(i8 %op3) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv16i8( %pg, %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.msb.nxv16i8( %pg, %[[SEL]], %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_n_s8,_z,)(pg, op1, op2, op3); +} + +svint16_t test_svmsb_n_s16_z(svbool_t pg, svint16_t op1, svint16_t op2, int16_t op3) +{ + // CHECK-LABEL: test_svmsb_n_s16_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv8i16(i16 %op3) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv8i16( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.msb.nxv8i16( %[[PG]], %[[SEL]], %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_n_s16,_z,)(pg, op1, op2, op3); +} + +svint32_t test_svmsb_n_s32_z(svbool_t pg, svint32_t op1, svint32_t op2, int32_t op3) +{ + // CHECK-LABEL: test_svmsb_n_s32_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv4i32(i32 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.msb.nxv4i32( %[[PG]], %[[SEL]], %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_n_s32,_z,)(pg, op1, op2, op3); +} + +svint64_t test_svmsb_n_s64_z(svbool_t pg, svint64_t op1, svint64_t op2, int64_t op3) +{ + // CHECK-LABEL: test_svmsb_n_s64_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv2i64(i64 %op3) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv2i64( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.msb.nxv2i64( %[[PG]], %[[SEL]], %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_n_s64,_z,)(pg, op1, op2, op3); +} + +svuint8_t test_svmsb_n_u8_z(svbool_t pg, svuint8_t op1, svuint8_t op2, uint8_t op3) +{ + // CHECK-LABEL: test_svmsb_n_u8_z + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv16i8(i8 %op3) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv16i8( %pg, %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.msb.nxv16i8( %pg, %[[SEL]], %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_n_u8,_z,)(pg, op1, op2, op3); +} + +svuint16_t test_svmsb_n_u16_z(svbool_t pg, svuint16_t op1, svuint16_t op2, uint16_t op3) +{ + // CHECK-LABEL: test_svmsb_n_u16_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv8i16(i16 %op3) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv8i16( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.msb.nxv8i16( %[[PG]], %[[SEL]], %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_n_u16,_z,)(pg, op1, op2, op3); +} + +svuint32_t test_svmsb_n_u32_z(svbool_t pg, svuint32_t op1, svuint32_t op2, uint32_t op3) +{ + // CHECK-LABEL: test_svmsb_n_u32_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv4i32(i32 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.msb.nxv4i32( %[[PG]], %[[SEL]], %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_n_u32,_z,)(pg, op1, op2, op3); +} + +svuint64_t test_svmsb_n_u64_z(svbool_t pg, svuint64_t op1, svuint64_t op2, uint64_t op3) +{ + // CHECK-LABEL: test_svmsb_n_u64_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv2i64(i64 %op3) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv2i64( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.msb.nxv2i64( %[[PG]], %[[SEL]], %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_n_u64,_z,)(pg, op1, op2, op3); +} + +svint8_t test_svmsb_n_s8_m(svbool_t pg, svint8_t op1, svint8_t op2, int8_t op3) +{ + // CHECK-LABEL: test_svmsb_n_s8_m + // CHECK: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv16i8(i8 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.msb.nxv16i8( %pg, %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_n_s8,_m,)(pg, op1, op2, op3); +} + +svint16_t test_svmsb_n_s16_m(svbool_t pg, svint16_t op1, svint16_t op2, int16_t op3) +{ + // CHECK-LABEL: test_svmsb_n_s16_m + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv8i16(i16 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.msb.nxv8i16( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_n_s16,_m,)(pg, op1, op2, op3); +} + +svint32_t test_svmsb_n_s32_m(svbool_t pg, svint32_t op1, svint32_t op2, int32_t op3) +{ + // CHECK-LABEL: test_svmsb_n_s32_m + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv4i32(i32 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.msb.nxv4i32( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_n_s32,_m,)(pg, op1, op2, op3); +} + +svint64_t test_svmsb_n_s64_m(svbool_t pg, svint64_t op1, svint64_t op2, int64_t op3) +{ + // CHECK-LABEL: test_svmsb_n_s64_m + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv2i64(i64 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.msb.nxv2i64( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_n_s64,_m,)(pg, op1, op2, op3); +} + +svuint8_t test_svmsb_n_u8_m(svbool_t pg, svuint8_t op1, svuint8_t op2, uint8_t op3) +{ + // CHECK-LABEL: test_svmsb_n_u8_m + // CHECK: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv16i8(i8 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.msb.nxv16i8( %pg, %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_n_u8,_m,)(pg, op1, op2, op3); +} + +svuint16_t test_svmsb_n_u16_m(svbool_t pg, svuint16_t op1, svuint16_t op2, uint16_t op3) +{ + // CHECK-LABEL: test_svmsb_n_u16_m + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv8i16(i16 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.msb.nxv8i16( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_n_u16,_m,)(pg, op1, op2, op3); +} + +svuint32_t test_svmsb_n_u32_m(svbool_t pg, svuint32_t op1, svuint32_t op2, uint32_t op3) +{ + // CHECK-LABEL: test_svmsb_n_u32_m + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv4i32(i32 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.msb.nxv4i32( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_n_u32,_m,)(pg, op1, op2, op3); +} + +svuint64_t test_svmsb_n_u64_m(svbool_t pg, svuint64_t op1, svuint64_t op2, uint64_t op3) +{ + // CHECK-LABEL: test_svmsb_n_u64_m + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv2i64(i64 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.msb.nxv2i64( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_n_u64,_m,)(pg, op1, op2, op3); +} + +svint8_t test_svmsb_n_s8_x(svbool_t pg, svint8_t op1, svint8_t op2, int8_t op3) +{ + // CHECK-LABEL: test_svmsb_n_s8_x + // CHECK: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv16i8(i8 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.msb.nxv16i8( %pg, %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_n_s8,_x,)(pg, op1, op2, op3); +} + +svint16_t test_svmsb_n_s16_x(svbool_t pg, svint16_t op1, svint16_t op2, int16_t op3) +{ + // CHECK-LABEL: test_svmsb_n_s16_x + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv8i16(i16 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.msb.nxv8i16( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_n_s16,_x,)(pg, op1, op2, op3); +} + +svint32_t test_svmsb_n_s32_x(svbool_t pg, svint32_t op1, svint32_t op2, int32_t op3) +{ + // CHECK-LABEL: test_svmsb_n_s32_x + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv4i32(i32 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.msb.nxv4i32( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_n_s32,_x,)(pg, op1, op2, op3); +} + +svint64_t test_svmsb_n_s64_x(svbool_t pg, svint64_t op1, svint64_t op2, int64_t op3) +{ + // CHECK-LABEL: test_svmsb_n_s64_x + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv2i64(i64 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.msb.nxv2i64( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_n_s64,_x,)(pg, op1, op2, op3); +} + +svuint8_t test_svmsb_n_u8_x(svbool_t pg, svuint8_t op1, svuint8_t op2, uint8_t op3) +{ + // CHECK-LABEL: test_svmsb_n_u8_x + // CHECK: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv16i8(i8 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.msb.nxv16i8( %pg, %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_n_u8,_x,)(pg, op1, op2, op3); +} + +svuint16_t test_svmsb_n_u16_x(svbool_t pg, svuint16_t op1, svuint16_t op2, uint16_t op3) +{ + // CHECK-LABEL: test_svmsb_n_u16_x + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv8i16(i16 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.msb.nxv8i16( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_n_u16,_x,)(pg, op1, op2, op3); +} + +svuint32_t test_svmsb_n_u32_x(svbool_t pg, svuint32_t op1, svuint32_t op2, uint32_t op3) +{ + // CHECK-LABEL: test_svmsb_n_u32_x + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv4i32(i32 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.msb.nxv4i32( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_n_u32,_x,)(pg, op1, op2, op3); +} + +svuint64_t test_svmsb_n_u64_x(svbool_t pg, svuint64_t op1, svuint64_t op2, uint64_t op3) +{ + // CHECK-LABEL: test_svmsb_n_u64_x + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv2i64(i64 %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.msb.nxv2i64( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_n_u64,_x,)(pg, op1, op2, op3); +} + +svfloat16_t test_svmsb_f16_z(svbool_t pg, svfloat16_t op1, svfloat16_t op2, svfloat16_t op3) +{ + // CHECK-LABEL: test_svmsb_f16_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv8f16( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmsb.nxv8f16( %[[PG]], %[[SEL]], %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_f16,_z,)(pg, op1, op2, op3); +} + +svfloat32_t test_svmsb_f32_z(svbool_t pg, svfloat32_t op1, svfloat32_t op2, svfloat32_t op3) +{ + // CHECK-LABEL: test_svmsb_f32_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv4f32( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmsb.nxv4f32( %[[PG]], %[[SEL]], %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_f32,_z,)(pg, op1, op2, op3); +} + +svfloat64_t test_svmsb_f64_z(svbool_t pg, svfloat64_t op1, svfloat64_t op2, svfloat64_t op3) +{ + // CHECK-LABEL: test_svmsb_f64_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv2f64( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmsb.nxv2f64( %[[PG]], %[[SEL]], %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_f64,_z,)(pg, op1, op2, op3); +} + +svfloat16_t test_svmsb_f16_m(svbool_t pg, svfloat16_t op1, svfloat16_t op2, svfloat16_t op3) +{ + // CHECK-LABEL: test_svmsb_f16_m + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmsb.nxv8f16( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_f16,_m,)(pg, op1, op2, op3); +} + +svfloat32_t test_svmsb_f32_m(svbool_t pg, svfloat32_t op1, svfloat32_t op2, svfloat32_t op3) +{ + // CHECK-LABEL: test_svmsb_f32_m + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmsb.nxv4f32( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_f32,_m,)(pg, op1, op2, op3); +} + +svfloat64_t test_svmsb_f64_m(svbool_t pg, svfloat64_t op1, svfloat64_t op2, svfloat64_t op3) +{ + // CHECK-LABEL: test_svmsb_f64_m + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmsb.nxv2f64( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_f64,_m,)(pg, op1, op2, op3); +} + +svfloat16_t test_svmsb_f16_x(svbool_t pg, svfloat16_t op1, svfloat16_t op2, svfloat16_t op3) +{ + // CHECK-LABEL: test_svmsb_f16_x + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmsb.nxv8f16( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_f16,_x,)(pg, op1, op2, op3); +} + +svfloat32_t test_svmsb_f32_x(svbool_t pg, svfloat32_t op1, svfloat32_t op2, svfloat32_t op3) +{ + // CHECK-LABEL: test_svmsb_f32_x + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmsb.nxv4f32( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_f32,_x,)(pg, op1, op2, op3); +} + +svfloat64_t test_svmsb_f64_x(svbool_t pg, svfloat64_t op1, svfloat64_t op2, svfloat64_t op3) +{ + // CHECK-LABEL: test_svmsb_f64_x + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmsb.nxv2f64( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_f64,_x,)(pg, op1, op2, op3); +} + +svfloat16_t test_svmsb_n_f16_z(svbool_t pg, svfloat16_t op1, svfloat16_t op2, float16_t op3) +{ + // CHECK-LABEL: test_svmsb_n_f16_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv8f16(half %op3) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv8f16( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmsb.nxv8f16( %[[PG]], %[[SEL]], %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_n_f16,_z,)(pg, op1, op2, op3); +} + +svfloat32_t test_svmsb_n_f32_z(svbool_t pg, svfloat32_t op1, svfloat32_t op2, float32_t op3) +{ + // CHECK-LABEL: test_svmsb_n_f32_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv4f32(float %op3) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv4f32( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmsb.nxv4f32( %[[PG]], %[[SEL]], %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_n_f32,_z,)(pg, op1, op2, op3); +} + +svfloat64_t test_svmsb_n_f64_z(svbool_t pg, svfloat64_t op1, svfloat64_t op2, float64_t op3) +{ + // CHECK-LABEL: test_svmsb_n_f64_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv2f64(double %op3) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv2f64( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmsb.nxv2f64( %[[PG]], %[[SEL]], %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_n_f64,_z,)(pg, op1, op2, op3); +} + +svfloat16_t test_svmsb_n_f16_m(svbool_t pg, svfloat16_t op1, svfloat16_t op2, float16_t op3) +{ + // CHECK-LABEL: test_svmsb_n_f16_m + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv8f16(half %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmsb.nxv8f16( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_n_f16,_m,)(pg, op1, op2, op3); +} + +svfloat32_t test_svmsb_n_f32_m(svbool_t pg, svfloat32_t op1, svfloat32_t op2, float32_t op3) +{ + // CHECK-LABEL: test_svmsb_n_f32_m + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv4f32(float %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmsb.nxv4f32( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_n_f32,_m,)(pg, op1, op2, op3); +} + +svfloat64_t test_svmsb_n_f64_m(svbool_t pg, svfloat64_t op1, svfloat64_t op2, float64_t op3) +{ + // CHECK-LABEL: test_svmsb_n_f64_m + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv2f64(double %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmsb.nxv2f64( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_n_f64,_m,)(pg, op1, op2, op3); +} + +svfloat16_t test_svmsb_n_f16_x(svbool_t pg, svfloat16_t op1, svfloat16_t op2, float16_t op3) +{ + // CHECK-LABEL: test_svmsb_n_f16_x + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv8f16(half %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmsb.nxv8f16( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_n_f16,_x,)(pg, op1, op2, op3); +} + +svfloat32_t test_svmsb_n_f32_x(svbool_t pg, svfloat32_t op1, svfloat32_t op2, float32_t op3) +{ + // CHECK-LABEL: test_svmsb_n_f32_x + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv4f32(float %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmsb.nxv4f32( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_n_f32,_x,)(pg, op1, op2, op3); +} + +svfloat64_t test_svmsb_n_f64_x(svbool_t pg, svfloat64_t op1, svfloat64_t op2, float64_t op3) +{ + // CHECK-LABEL: test_svmsb_n_f64_x + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv2f64(double %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fmsb.nxv2f64( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svmsb,_n_f64,_x,)(pg, op1, op2, op3); +} diff --git a/clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_nmad.c b/clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_nmad.c new file mode 100644 --- /dev/null +++ b/clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_nmad.c @@ -0,0 +1,188 @@ +// RUN: %clang_cc1 -D__ARM_FEATURE_SVE -triple aarch64-none-linux-gnu -target-feature +sve -fallow-half-arguments-and-returns -S -O1 -Werror -Wall -emit-llvm -o - %s | FileCheck %s +// RUN: %clang_cc1 -D__ARM_FEATURE_SVE -DSVE_OVERLOADED_FORMS -triple aarch64-none-linux-gnu -target-feature +sve -fallow-half-arguments-and-returns -S -O1 -Werror -Wall -emit-llvm -o - %s | FileCheck %s + +#include + +#ifdef SVE_OVERLOADED_FORMS +// A simple used,unused... macro, long enough to represent any SVE builtin. +#define SVE_ACLE_FUNC(A1,A2_UNUSED,A3,A4_UNUSED) A1##A3 +#else +#define SVE_ACLE_FUNC(A1,A2,A3,A4) A1##A2##A3##A4 +#endif + +svfloat16_t test_svnmad_f16_z(svbool_t pg, svfloat16_t op1, svfloat16_t op2, svfloat16_t op3) +{ + // CHECK-LABEL: test_svnmad_f16_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv8f16( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmad.nxv8f16( %[[PG]], %[[SEL]], %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmad,_f16,_z,)(pg, op1, op2, op3); +} + +svfloat32_t test_svnmad_f32_z(svbool_t pg, svfloat32_t op1, svfloat32_t op2, svfloat32_t op3) +{ + // CHECK-LABEL: test_svnmad_f32_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv4f32( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmad.nxv4f32( %[[PG]], %[[SEL]], %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmad,_f32,_z,)(pg, op1, op2, op3); +} + +svfloat64_t test_svnmad_f64_z(svbool_t pg, svfloat64_t op1, svfloat64_t op2, svfloat64_t op3) +{ + // CHECK-LABEL: test_svnmad_f64_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv2f64( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmad.nxv2f64( %[[PG]], %[[SEL]], %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmad,_f64,_z,)(pg, op1, op2, op3); +} + +svfloat16_t test_svnmad_f16_m(svbool_t pg, svfloat16_t op1, svfloat16_t op2, svfloat16_t op3) +{ + // CHECK-LABEL: test_svnmad_f16_m + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmad.nxv8f16( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmad,_f16,_m,)(pg, op1, op2, op3); +} + +svfloat32_t test_svnmad_f32_m(svbool_t pg, svfloat32_t op1, svfloat32_t op2, svfloat32_t op3) +{ + // CHECK-LABEL: test_svnmad_f32_m + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmad.nxv4f32( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmad,_f32,_m,)(pg, op1, op2, op3); +} + +svfloat64_t test_svnmad_f64_m(svbool_t pg, svfloat64_t op1, svfloat64_t op2, svfloat64_t op3) +{ + // CHECK-LABEL: test_svnmad_f64_m + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmad.nxv2f64( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmad,_f64,_m,)(pg, op1, op2, op3); +} + +svfloat16_t test_svnmad_f16_x(svbool_t pg, svfloat16_t op1, svfloat16_t op2, svfloat16_t op3) +{ + // CHECK-LABEL: test_svnmad_f16_x + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmad.nxv8f16( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmad,_f16,_x,)(pg, op1, op2, op3); +} + +svfloat32_t test_svnmad_f32_x(svbool_t pg, svfloat32_t op1, svfloat32_t op2, svfloat32_t op3) +{ + // CHECK-LABEL: test_svnmad_f32_x + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmad.nxv4f32( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmad,_f32,_x,)(pg, op1, op2, op3); +} + +svfloat64_t test_svnmad_f64_x(svbool_t pg, svfloat64_t op1, svfloat64_t op2, svfloat64_t op3) +{ + // CHECK-LABEL: test_svnmad_f64_x + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmad.nxv2f64( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmad,_f64,_x,)(pg, op1, op2, op3); +} + +svfloat16_t test_svnmad_n_f16_z(svbool_t pg, svfloat16_t op1, svfloat16_t op2, float16_t op3) +{ + // CHECK-LABEL: test_svnmad_n_f16_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv8f16(half %op3) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv8f16( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmad.nxv8f16( %[[PG]], %[[SEL]], %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmad,_n_f16,_z,)(pg, op1, op2, op3); +} + +svfloat32_t test_svnmad_n_f32_z(svbool_t pg, svfloat32_t op1, svfloat32_t op2, float32_t op3) +{ + // CHECK-LABEL: test_svnmad_n_f32_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv4f32(float %op3) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv4f32( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmad.nxv4f32( %[[PG]], %[[SEL]], %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmad,_n_f32,_z,)(pg, op1, op2, op3); +} + +svfloat64_t test_svnmad_n_f64_z(svbool_t pg, svfloat64_t op1, svfloat64_t op2, float64_t op3) +{ + // CHECK-LABEL: test_svnmad_n_f64_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv2f64(double %op3) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv2f64( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmad.nxv2f64( %[[PG]], %[[SEL]], %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmad,_n_f64,_z,)(pg, op1, op2, op3); +} + +svfloat16_t test_svnmad_n_f16_m(svbool_t pg, svfloat16_t op1, svfloat16_t op2, float16_t op3) +{ + // CHECK-LABEL: test_svnmad_n_f16_m + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv8f16(half %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmad.nxv8f16( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmad,_n_f16,_m,)(pg, op1, op2, op3); +} + +svfloat32_t test_svnmad_n_f32_m(svbool_t pg, svfloat32_t op1, svfloat32_t op2, float32_t op3) +{ + // CHECK-LABEL: test_svnmad_n_f32_m + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv4f32(float %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmad.nxv4f32( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmad,_n_f32,_m,)(pg, op1, op2, op3); +} + +svfloat64_t test_svnmad_n_f64_m(svbool_t pg, svfloat64_t op1, svfloat64_t op2, float64_t op3) +{ + // CHECK-LABEL: test_svnmad_n_f64_m + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv2f64(double %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmad.nxv2f64( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmad,_n_f64,_m,)(pg, op1, op2, op3); +} + +svfloat16_t test_svnmad_n_f16_x(svbool_t pg, svfloat16_t op1, svfloat16_t op2, float16_t op3) +{ + // CHECK-LABEL: test_svnmad_n_f16_x + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv8f16(half %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmad.nxv8f16( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmad,_n_f16,_x,)(pg, op1, op2, op3); +} + +svfloat32_t test_svnmad_n_f32_x(svbool_t pg, svfloat32_t op1, svfloat32_t op2, float32_t op3) +{ + // CHECK-LABEL: test_svnmad_n_f32_x + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv4f32(float %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmad.nxv4f32( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmad,_n_f32,_x,)(pg, op1, op2, op3); +} + +svfloat64_t test_svnmad_n_f64_x(svbool_t pg, svfloat64_t op1, svfloat64_t op2, float64_t op3) +{ + // CHECK-LABEL: test_svnmad_n_f64_x + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv2f64(double %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmad.nxv2f64( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmad,_n_f64,_x,)(pg, op1, op2, op3); +} diff --git a/clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_nmla.c b/clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_nmla.c new file mode 100644 --- /dev/null +++ b/clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_nmla.c @@ -0,0 +1,188 @@ +// RUN: %clang_cc1 -D__ARM_FEATURE_SVE -triple aarch64-none-linux-gnu -target-feature +sve -fallow-half-arguments-and-returns -S -O1 -Werror -Wall -emit-llvm -o - %s | FileCheck %s +// RUN: %clang_cc1 -D__ARM_FEATURE_SVE -DSVE_OVERLOADED_FORMS -triple aarch64-none-linux-gnu -target-feature +sve -fallow-half-arguments-and-returns -S -O1 -Werror -Wall -emit-llvm -o - %s | FileCheck %s + +#include + +#ifdef SVE_OVERLOADED_FORMS +// A simple used,unused... macro, long enough to represent any SVE builtin. +#define SVE_ACLE_FUNC(A1,A2_UNUSED,A3,A4_UNUSED) A1##A3 +#else +#define SVE_ACLE_FUNC(A1,A2,A3,A4) A1##A2##A3##A4 +#endif + +svfloat16_t test_svnmla_f16_z(svbool_t pg, svfloat16_t op1, svfloat16_t op2, svfloat16_t op3) +{ + // CHECK-LABEL: test_svnmla_f16_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv8f16( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmla.nxv8f16( %[[PG]], %[[SEL]], %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmla,_f16,_z,)(pg, op1, op2, op3); +} + +svfloat32_t test_svnmla_f32_z(svbool_t pg, svfloat32_t op1, svfloat32_t op2, svfloat32_t op3) +{ + // CHECK-LABEL: test_svnmla_f32_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv4f32( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmla.nxv4f32( %[[PG]], %[[SEL]], %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmla,_f32,_z,)(pg, op1, op2, op3); +} + +svfloat64_t test_svnmla_f64_z(svbool_t pg, svfloat64_t op1, svfloat64_t op2, svfloat64_t op3) +{ + // CHECK-LABEL: test_svnmla_f64_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv2f64( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmla.nxv2f64( %[[PG]], %[[SEL]], %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmla,_f64,_z,)(pg, op1, op2, op3); +} + +svfloat16_t test_svnmla_f16_m(svbool_t pg, svfloat16_t op1, svfloat16_t op2, svfloat16_t op3) +{ + // CHECK-LABEL: test_svnmla_f16_m + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmla.nxv8f16( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmla,_f16,_m,)(pg, op1, op2, op3); +} + +svfloat32_t test_svnmla_f32_m(svbool_t pg, svfloat32_t op1, svfloat32_t op2, svfloat32_t op3) +{ + // CHECK-LABEL: test_svnmla_f32_m + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmla.nxv4f32( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmla,_f32,_m,)(pg, op1, op2, op3); +} + +svfloat64_t test_svnmla_f64_m(svbool_t pg, svfloat64_t op1, svfloat64_t op2, svfloat64_t op3) +{ + // CHECK-LABEL: test_svnmla_f64_m + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmla.nxv2f64( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmla,_f64,_m,)(pg, op1, op2, op3); +} + +svfloat16_t test_svnmla_f16_x(svbool_t pg, svfloat16_t op1, svfloat16_t op2, svfloat16_t op3) +{ + // CHECK-LABEL: test_svnmla_f16_x + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmla.nxv8f16( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmla,_f16,_x,)(pg, op1, op2, op3); +} + +svfloat32_t test_svnmla_f32_x(svbool_t pg, svfloat32_t op1, svfloat32_t op2, svfloat32_t op3) +{ + // CHECK-LABEL: test_svnmla_f32_x + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmla.nxv4f32( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmla,_f32,_x,)(pg, op1, op2, op3); +} + +svfloat64_t test_svnmla_f64_x(svbool_t pg, svfloat64_t op1, svfloat64_t op2, svfloat64_t op3) +{ + // CHECK-LABEL: test_svnmla_f64_x + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmla.nxv2f64( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmla,_f64,_x,)(pg, op1, op2, op3); +} + +svfloat16_t test_svnmla_n_f16_z(svbool_t pg, svfloat16_t op1, svfloat16_t op2, float16_t op3) +{ + // CHECK-LABEL: test_svnmla_n_f16_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv8f16(half %op3) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv8f16( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmla.nxv8f16( %[[PG]], %[[SEL]], %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmla,_n_f16,_z,)(pg, op1, op2, op3); +} + +svfloat32_t test_svnmla_n_f32_z(svbool_t pg, svfloat32_t op1, svfloat32_t op2, float32_t op3) +{ + // CHECK-LABEL: test_svnmla_n_f32_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv4f32(float %op3) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv4f32( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmla.nxv4f32( %[[PG]], %[[SEL]], %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmla,_n_f32,_z,)(pg, op1, op2, op3); +} + +svfloat64_t test_svnmla_n_f64_z(svbool_t pg, svfloat64_t op1, svfloat64_t op2, float64_t op3) +{ + // CHECK-LABEL: test_svnmla_n_f64_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv2f64(double %op3) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv2f64( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmla.nxv2f64( %[[PG]], %[[SEL]], %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmla,_n_f64,_z,)(pg, op1, op2, op3); +} + +svfloat16_t test_svnmla_n_f16_m(svbool_t pg, svfloat16_t op1, svfloat16_t op2, float16_t op3) +{ + // CHECK-LABEL: test_svnmla_n_f16_m + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv8f16(half %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmla.nxv8f16( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmla,_n_f16,_m,)(pg, op1, op2, op3); +} + +svfloat32_t test_svnmla_n_f32_m(svbool_t pg, svfloat32_t op1, svfloat32_t op2, float32_t op3) +{ + // CHECK-LABEL: test_svnmla_n_f32_m + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv4f32(float %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmla.nxv4f32( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmla,_n_f32,_m,)(pg, op1, op2, op3); +} + +svfloat64_t test_svnmla_n_f64_m(svbool_t pg, svfloat64_t op1, svfloat64_t op2, float64_t op3) +{ + // CHECK-LABEL: test_svnmla_n_f64_m + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv2f64(double %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmla.nxv2f64( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmla,_n_f64,_m,)(pg, op1, op2, op3); +} + +svfloat16_t test_svnmla_n_f16_x(svbool_t pg, svfloat16_t op1, svfloat16_t op2, float16_t op3) +{ + // CHECK-LABEL: test_svnmla_n_f16_x + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv8f16(half %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmla.nxv8f16( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmla,_n_f16,_x,)(pg, op1, op2, op3); +} + +svfloat32_t test_svnmla_n_f32_x(svbool_t pg, svfloat32_t op1, svfloat32_t op2, float32_t op3) +{ + // CHECK-LABEL: test_svnmla_n_f32_x + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv4f32(float %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmla.nxv4f32( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmla,_n_f32,_x,)(pg, op1, op2, op3); +} + +svfloat64_t test_svnmla_n_f64_x(svbool_t pg, svfloat64_t op1, svfloat64_t op2, float64_t op3) +{ + // CHECK-LABEL: test_svnmla_n_f64_x + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv2f64(double %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmla.nxv2f64( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmla,_n_f64,_x,)(pg, op1, op2, op3); +} diff --git a/clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_nmls.c b/clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_nmls.c new file mode 100644 --- /dev/null +++ b/clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_nmls.c @@ -0,0 +1,188 @@ +// RUN: %clang_cc1 -D__ARM_FEATURE_SVE -triple aarch64-none-linux-gnu -target-feature +sve -fallow-half-arguments-and-returns -S -O1 -Werror -Wall -emit-llvm -o - %s | FileCheck %s +// RUN: %clang_cc1 -D__ARM_FEATURE_SVE -DSVE_OVERLOADED_FORMS -triple aarch64-none-linux-gnu -target-feature +sve -fallow-half-arguments-and-returns -S -O1 -Werror -Wall -emit-llvm -o - %s | FileCheck %s + +#include + +#ifdef SVE_OVERLOADED_FORMS +// A simple used,unused... macro, long enough to represent any SVE builtin. +#define SVE_ACLE_FUNC(A1,A2_UNUSED,A3,A4_UNUSED) A1##A3 +#else +#define SVE_ACLE_FUNC(A1,A2,A3,A4) A1##A2##A3##A4 +#endif + +svfloat16_t test_svnmls_f16_z(svbool_t pg, svfloat16_t op1, svfloat16_t op2, svfloat16_t op3) +{ + // CHECK-LABEL: test_svnmls_f16_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv8f16( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmls.nxv8f16( %[[PG]], %[[SEL]], %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmls,_f16,_z,)(pg, op1, op2, op3); +} + +svfloat32_t test_svnmls_f32_z(svbool_t pg, svfloat32_t op1, svfloat32_t op2, svfloat32_t op3) +{ + // CHECK-LABEL: test_svnmls_f32_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv4f32( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmls.nxv4f32( %[[PG]], %[[SEL]], %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmls,_f32,_z,)(pg, op1, op2, op3); +} + +svfloat64_t test_svnmls_f64_z(svbool_t pg, svfloat64_t op1, svfloat64_t op2, svfloat64_t op3) +{ + // CHECK-LABEL: test_svnmls_f64_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv2f64( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmls.nxv2f64( %[[PG]], %[[SEL]], %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmls,_f64,_z,)(pg, op1, op2, op3); +} + +svfloat16_t test_svnmls_f16_m(svbool_t pg, svfloat16_t op1, svfloat16_t op2, svfloat16_t op3) +{ + // CHECK-LABEL: test_svnmls_f16_m + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmls.nxv8f16( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmls,_f16,_m,)(pg, op1, op2, op3); +} + +svfloat32_t test_svnmls_f32_m(svbool_t pg, svfloat32_t op1, svfloat32_t op2, svfloat32_t op3) +{ + // CHECK-LABEL: test_svnmls_f32_m + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmls.nxv4f32( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmls,_f32,_m,)(pg, op1, op2, op3); +} + +svfloat64_t test_svnmls_f64_m(svbool_t pg, svfloat64_t op1, svfloat64_t op2, svfloat64_t op3) +{ + // CHECK-LABEL: test_svnmls_f64_m + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmls.nxv2f64( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmls,_f64,_m,)(pg, op1, op2, op3); +} + +svfloat16_t test_svnmls_f16_x(svbool_t pg, svfloat16_t op1, svfloat16_t op2, svfloat16_t op3) +{ + // CHECK-LABEL: test_svnmls_f16_x + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmls.nxv8f16( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmls,_f16,_x,)(pg, op1, op2, op3); +} + +svfloat32_t test_svnmls_f32_x(svbool_t pg, svfloat32_t op1, svfloat32_t op2, svfloat32_t op3) +{ + // CHECK-LABEL: test_svnmls_f32_x + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmls.nxv4f32( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmls,_f32,_x,)(pg, op1, op2, op3); +} + +svfloat64_t test_svnmls_f64_x(svbool_t pg, svfloat64_t op1, svfloat64_t op2, svfloat64_t op3) +{ + // CHECK-LABEL: test_svnmls_f64_x + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmls.nxv2f64( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmls,_f64,_x,)(pg, op1, op2, op3); +} + +svfloat16_t test_svnmls_n_f16_z(svbool_t pg, svfloat16_t op1, svfloat16_t op2, float16_t op3) +{ + // CHECK-LABEL: test_svnmls_n_f16_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv8f16(half %op3) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv8f16( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmls.nxv8f16( %[[PG]], %[[SEL]], %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmls,_n_f16,_z,)(pg, op1, op2, op3); +} + +svfloat32_t test_svnmls_n_f32_z(svbool_t pg, svfloat32_t op1, svfloat32_t op2, float32_t op3) +{ + // CHECK-LABEL: test_svnmls_n_f32_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv4f32(float %op3) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv4f32( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmls.nxv4f32( %[[PG]], %[[SEL]], %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmls,_n_f32,_z,)(pg, op1, op2, op3); +} + +svfloat64_t test_svnmls_n_f64_z(svbool_t pg, svfloat64_t op1, svfloat64_t op2, float64_t op3) +{ + // CHECK-LABEL: test_svnmls_n_f64_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv2f64(double %op3) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv2f64( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmls.nxv2f64( %[[PG]], %[[SEL]], %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmls,_n_f64,_z,)(pg, op1, op2, op3); +} + +svfloat16_t test_svnmls_n_f16_m(svbool_t pg, svfloat16_t op1, svfloat16_t op2, float16_t op3) +{ + // CHECK-LABEL: test_svnmls_n_f16_m + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv8f16(half %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmls.nxv8f16( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmls,_n_f16,_m,)(pg, op1, op2, op3); +} + +svfloat32_t test_svnmls_n_f32_m(svbool_t pg, svfloat32_t op1, svfloat32_t op2, float32_t op3) +{ + // CHECK-LABEL: test_svnmls_n_f32_m + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv4f32(float %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmls.nxv4f32( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmls,_n_f32,_m,)(pg, op1, op2, op3); +} + +svfloat64_t test_svnmls_n_f64_m(svbool_t pg, svfloat64_t op1, svfloat64_t op2, float64_t op3) +{ + // CHECK-LABEL: test_svnmls_n_f64_m + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv2f64(double %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmls.nxv2f64( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmls,_n_f64,_m,)(pg, op1, op2, op3); +} + +svfloat16_t test_svnmls_n_f16_x(svbool_t pg, svfloat16_t op1, svfloat16_t op2, float16_t op3) +{ + // CHECK-LABEL: test_svnmls_n_f16_x + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv8f16(half %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmls.nxv8f16( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmls,_n_f16,_x,)(pg, op1, op2, op3); +} + +svfloat32_t test_svnmls_n_f32_x(svbool_t pg, svfloat32_t op1, svfloat32_t op2, float32_t op3) +{ + // CHECK-LABEL: test_svnmls_n_f32_x + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv4f32(float %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmls.nxv4f32( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmls,_n_f32,_x,)(pg, op1, op2, op3); +} + +svfloat64_t test_svnmls_n_f64_x(svbool_t pg, svfloat64_t op1, svfloat64_t op2, float64_t op3) +{ + // CHECK-LABEL: test_svnmls_n_f64_x + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv2f64(double %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmls.nxv2f64( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmls,_n_f64,_x,)(pg, op1, op2, op3); +} diff --git a/clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_nmsb.c b/clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_nmsb.c new file mode 100644 --- /dev/null +++ b/clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_nmsb.c @@ -0,0 +1,188 @@ +// RUN: %clang_cc1 -D__ARM_FEATURE_SVE -triple aarch64-none-linux-gnu -target-feature +sve -fallow-half-arguments-and-returns -S -O1 -Werror -Wall -emit-llvm -o - %s | FileCheck %s +// RUN: %clang_cc1 -D__ARM_FEATURE_SVE -DSVE_OVERLOADED_FORMS -triple aarch64-none-linux-gnu -target-feature +sve -fallow-half-arguments-and-returns -S -O1 -Werror -Wall -emit-llvm -o - %s | FileCheck %s + +#include + +#ifdef SVE_OVERLOADED_FORMS +// A simple used,unused... macro, long enough to represent any SVE builtin. +#define SVE_ACLE_FUNC(A1,A2_UNUSED,A3,A4_UNUSED) A1##A3 +#else +#define SVE_ACLE_FUNC(A1,A2,A3,A4) A1##A2##A3##A4 +#endif + +svfloat16_t test_svnmsb_f16_z(svbool_t pg, svfloat16_t op1, svfloat16_t op2, svfloat16_t op3) +{ + // CHECK-LABEL: test_svnmsb_f16_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv8f16( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmsb.nxv8f16( %[[PG]], %[[SEL]], %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmsb,_f16,_z,)(pg, op1, op2, op3); +} + +svfloat32_t test_svnmsb_f32_z(svbool_t pg, svfloat32_t op1, svfloat32_t op2, svfloat32_t op3) +{ + // CHECK-LABEL: test_svnmsb_f32_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv4f32( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmsb.nxv4f32( %[[PG]], %[[SEL]], %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmsb,_f32,_z,)(pg, op1, op2, op3); +} + +svfloat64_t test_svnmsb_f64_z(svbool_t pg, svfloat64_t op1, svfloat64_t op2, svfloat64_t op3) +{ + // CHECK-LABEL: test_svnmsb_f64_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv2f64( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmsb.nxv2f64( %[[PG]], %[[SEL]], %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmsb,_f64,_z,)(pg, op1, op2, op3); +} + +svfloat16_t test_svnmsb_f16_m(svbool_t pg, svfloat16_t op1, svfloat16_t op2, svfloat16_t op3) +{ + // CHECK-LABEL: test_svnmsb_f16_m + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmsb.nxv8f16( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmsb,_f16,_m,)(pg, op1, op2, op3); +} + +svfloat32_t test_svnmsb_f32_m(svbool_t pg, svfloat32_t op1, svfloat32_t op2, svfloat32_t op3) +{ + // CHECK-LABEL: test_svnmsb_f32_m + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmsb.nxv4f32( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmsb,_f32,_m,)(pg, op1, op2, op3); +} + +svfloat64_t test_svnmsb_f64_m(svbool_t pg, svfloat64_t op1, svfloat64_t op2, svfloat64_t op3) +{ + // CHECK-LABEL: test_svnmsb_f64_m + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmsb.nxv2f64( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmsb,_f64,_m,)(pg, op1, op2, op3); +} + +svfloat16_t test_svnmsb_f16_x(svbool_t pg, svfloat16_t op1, svfloat16_t op2, svfloat16_t op3) +{ + // CHECK-LABEL: test_svnmsb_f16_x + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmsb.nxv8f16( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmsb,_f16,_x,)(pg, op1, op2, op3); +} + +svfloat32_t test_svnmsb_f32_x(svbool_t pg, svfloat32_t op1, svfloat32_t op2, svfloat32_t op3) +{ + // CHECK-LABEL: test_svnmsb_f32_x + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmsb.nxv4f32( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmsb,_f32,_x,)(pg, op1, op2, op3); +} + +svfloat64_t test_svnmsb_f64_x(svbool_t pg, svfloat64_t op1, svfloat64_t op2, svfloat64_t op3) +{ + // CHECK-LABEL: test_svnmsb_f64_x + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmsb.nxv2f64( %[[PG]], %op1, %op2, %op3) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmsb,_f64,_x,)(pg, op1, op2, op3); +} + +svfloat16_t test_svnmsb_n_f16_z(svbool_t pg, svfloat16_t op1, svfloat16_t op2, float16_t op3) +{ + // CHECK-LABEL: test_svnmsb_n_f16_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv8f16(half %op3) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv8f16( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmsb.nxv8f16( %[[PG]], %[[SEL]], %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmsb,_n_f16,_z,)(pg, op1, op2, op3); +} + +svfloat32_t test_svnmsb_n_f32_z(svbool_t pg, svfloat32_t op1, svfloat32_t op2, float32_t op3) +{ + // CHECK-LABEL: test_svnmsb_n_f32_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv4f32(float %op3) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv4f32( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmsb.nxv4f32( %[[PG]], %[[SEL]], %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmsb,_n_f32,_z,)(pg, op1, op2, op3); +} + +svfloat64_t test_svnmsb_n_f64_z(svbool_t pg, svfloat64_t op1, svfloat64_t op2, float64_t op3) +{ + // CHECK-LABEL: test_svnmsb_n_f64_z + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv2f64(double %op3) + // CHECK-DAG: %[[SEL:.*]] = call @llvm.aarch64.sve.sel.nxv2f64( %[[PG]], %op1, zeroinitializer) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmsb.nxv2f64( %[[PG]], %[[SEL]], %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmsb,_n_f64,_z,)(pg, op1, op2, op3); +} + +svfloat16_t test_svnmsb_n_f16_m(svbool_t pg, svfloat16_t op1, svfloat16_t op2, float16_t op3) +{ + // CHECK-LABEL: test_svnmsb_n_f16_m + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv8f16(half %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmsb.nxv8f16( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmsb,_n_f16,_m,)(pg, op1, op2, op3); +} + +svfloat32_t test_svnmsb_n_f32_m(svbool_t pg, svfloat32_t op1, svfloat32_t op2, float32_t op3) +{ + // CHECK-LABEL: test_svnmsb_n_f32_m + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv4f32(float %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmsb.nxv4f32( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmsb,_n_f32,_m,)(pg, op1, op2, op3); +} + +svfloat64_t test_svnmsb_n_f64_m(svbool_t pg, svfloat64_t op1, svfloat64_t op2, float64_t op3) +{ + // CHECK-LABEL: test_svnmsb_n_f64_m + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv2f64(double %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmsb.nxv2f64( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmsb,_n_f64,_m,)(pg, op1, op2, op3); +} + +svfloat16_t test_svnmsb_n_f16_x(svbool_t pg, svfloat16_t op1, svfloat16_t op2, float16_t op3) +{ + // CHECK-LABEL: test_svnmsb_n_f16_x + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv8f16(half %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmsb.nxv8f16( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmsb,_n_f16,_x,)(pg, op1, op2, op3); +} + +svfloat32_t test_svnmsb_n_f32_x(svbool_t pg, svfloat32_t op1, svfloat32_t op2, float32_t op3) +{ + // CHECK-LABEL: test_svnmsb_n_f32_x + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv4f32(float %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmsb.nxv4f32( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmsb,_n_f32,_x,)(pg, op1, op2, op3); +} + +svfloat64_t test_svnmsb_n_f64_x(svbool_t pg, svfloat64_t op1, svfloat64_t op2, float64_t op3) +{ + // CHECK-LABEL: test_svnmsb_n_f64_x + // CHECK-DAG: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK-DAG: %[[DUP:.*]] = call @llvm.aarch64.sve.dup.x.nxv2f64(double %op3) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.fnmsb.nxv2f64( %[[PG]], %op1, %op2, %[[DUP]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svnmsb,_n_f64,_x,)(pg, op1, op2, op3); +}