From 35de49655023207a888c0469b24f39fc2e5eaa8a Mon Sep 17 00:00:00 2001 From: Sander de Smalen Date: Tue, 5 May 2020 13:46:45 +0100 Subject: [PATCH] [SveEmitter] Add builtins for svqdecp and svqincp This patch adds builtins for saturating increment/decrement by svcntp, in scalar and vector forms. --- clang/include/clang/Basic/arm_sve.td | 14 ++ .../aarch64-sve-intrinsics/acle_sve_qdecp.c | 205 ++++++++++++++++++ .../aarch64-sve-intrinsics/acle_sve_qincp.c | 205 ++++++++++++++++++ 3 files changed, 424 insertions(+) create mode 100644 clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_qdecp.c create mode 100644 clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_qincp.c diff --git a/clang/include/clang/Basic/arm_sve.td b/clang/include/clang/Basic/arm_sve.td index c0248a83f4ea2..4b43e02b33672 100644 --- a/clang/include/clang/Basic/arm_sve.td +++ b/clang/include/clang/Basic/arm_sve.td @@ -1221,6 +1221,20 @@ defm SVQINCW_U : SInst_SAT2<"svqincw", "aarch64_sve_uqincw", UnsignedWord>; defm SVQINCD_S : SInst_SAT2<"svqincd", "aarch64_sve_sqincd", SignedDoubleWord>; defm SVQINCD_U : SInst_SAT2<"svqincd", "aarch64_sve_uqincd", UnsignedDoubleWord>; +def SVQDECP_S : SInst<"svqdecp[_{d}]", "ddP", "sil", MergeNone, "aarch64_sve_sqdecp">; +def SVQDECP_U : SInst<"svqdecp[_{d}]", "ddP", "UsUiUl", MergeNone, "aarch64_sve_uqdecp">; +def SVQINCP_S : SInst<"svqincp[_{d}]", "ddP", "sil", MergeNone, "aarch64_sve_sqincp">; +def SVQINCP_U : SInst<"svqincp[_{d}]", "ddP", "UsUiUl", MergeNone, "aarch64_sve_uqincp">; + +def SVQDECP_N_S32 : SInst<"svqdecp[_n_s32]_{d}", "kkP", "PcPsPiPl", MergeNone, "aarch64_sve_sqdecp_n32">; +def SVQDECP_N_S64 : SInst<"svqdecp[_n_s64]_{d}", "llP", "PcPsPiPl", MergeNone, "aarch64_sve_sqdecp_n64">; +def SVQDECP_N_U32 : SInst<"svqdecp[_n_u32]_{d}", "mmP", "PcPsPiPl", MergeNone, "aarch64_sve_uqdecp_n32">; +def SVQDECP_N_U64 : SInst<"svqdecp[_n_u64]_{d}", "nnP", "PcPsPiPl", MergeNone, "aarch64_sve_uqdecp_n64">; +def SVQINCP_N_S32 : SInst<"svqincp[_n_s32]_{d}", "kkP", "PcPsPiPl", MergeNone, "aarch64_sve_sqincp_n32">; +def SVQINCP_N_S64 : SInst<"svqincp[_n_s64]_{d}", "llP", "PcPsPiPl", MergeNone, "aarch64_sve_sqincp_n64">; +def SVQINCP_N_U32 : SInst<"svqincp[_n_u32]_{d}", "mmP", "PcPsPiPl", MergeNone, "aarch64_sve_uqincp_n32">; +def SVQINCP_N_U64 : SInst<"svqincp[_n_u64]_{d}", "nnP", "PcPsPiPl", MergeNone, "aarch64_sve_uqincp_n64">; + //////////////////////////////////////////////////////////////////////////////// // SVE2 WhileGE/GT let ArchGuard = "defined(__ARM_FEATURE_SVE2)" in { diff --git a/clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_qdecp.c b/clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_qdecp.c new file mode 100644 index 0000000000000..14b1ebd1ff22b --- /dev/null +++ b/clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_qdecp.c @@ -0,0 +1,205 @@ +// 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 + +int32_t test_svqdecp_n_s32_b8(int32_t op, svbool_t pg) +{ + // CHECK-LABEL: test_svqdecp_n_s32_b8 + // CHECK: %[[INTRINSIC:.*]] = call i32 @llvm.aarch64.sve.sqdecp.n32.nxv16i1(i32 %op, %pg) + // CHECK: ret i32 %[[INTRINSIC]] + return SVE_ACLE_FUNC(svqdecp,_n_s32,_b8,)(op, pg); +} + +int32_t test_svqdecp_n_s32_b16(int32_t op, svbool_t pg) +{ + // CHECK-LABEL: test_svqdecp_n_s32_b16 + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call i32 @llvm.aarch64.sve.sqdecp.n32.nxv8i1(i32 %op, %[[PG]]) + // CHECK: ret i32 %[[INTRINSIC]] + return SVE_ACLE_FUNC(svqdecp,_n_s32,_b16,)(op, pg); +} + +int32_t test_svqdecp_n_s32_b32(int32_t op, svbool_t pg) +{ + // CHECK-LABEL: test_svqdecp_n_s32_b32 + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call i32 @llvm.aarch64.sve.sqdecp.n32.nxv4i1(i32 %op, %[[PG]]) + // CHECK: ret i32 %[[INTRINSIC]] + return SVE_ACLE_FUNC(svqdecp,_n_s32,_b32,)(op, pg); +} + +int32_t test_svqdecp_n_s32_b64(int32_t op, svbool_t pg) +{ + // CHECK-LABEL: test_svqdecp_n_s32_b64 + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call i32 @llvm.aarch64.sve.sqdecp.n32.nxv2i1(i32 %op, %[[PG]]) + // CHECK: ret i32 %[[INTRINSIC]] + return SVE_ACLE_FUNC(svqdecp,_n_s32,_b64,)(op, pg); +} + +int64_t test_svqdecp_n_s64_b8(int64_t op, svbool_t pg) +{ + // CHECK-LABEL: test_svqdecp_n_s64_b8 + // CHECK: %[[INTRINSIC:.*]] = call i64 @llvm.aarch64.sve.sqdecp.n64.nxv16i1(i64 %op, %pg) + // CHECK: ret i64 %[[INTRINSIC]] + return SVE_ACLE_FUNC(svqdecp,_n_s64,_b8,)(op, pg); +} + +int64_t test_svqdecp_n_s64_b16(int64_t op, svbool_t pg) +{ + // CHECK-LABEL: test_svqdecp_n_s64_b16 + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call i64 @llvm.aarch64.sve.sqdecp.n64.nxv8i1(i64 %op, %[[PG]]) + // CHECK: ret i64 %[[INTRINSIC]] + return SVE_ACLE_FUNC(svqdecp,_n_s64,_b16,)(op, pg); +} + +int64_t test_svqdecp_n_s64_b32(int64_t op, svbool_t pg) +{ + // CHECK-LABEL: test_svqdecp_n_s64_b32 + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call i64 @llvm.aarch64.sve.sqdecp.n64.nxv4i1(i64 %op, %[[PG]]) + // CHECK: ret i64 %[[INTRINSIC]] + return SVE_ACLE_FUNC(svqdecp,_n_s64,_b32,)(op, pg); +} + +int64_t test_svqdecp_n_s64_b64(int64_t op, svbool_t pg) +{ + // CHECK-LABEL: test_svqdecp_n_s64_b64 + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call i64 @llvm.aarch64.sve.sqdecp.n64.nxv2i1(i64 %op, %[[PG]]) + // CHECK: ret i64 %[[INTRINSIC]] + return SVE_ACLE_FUNC(svqdecp,_n_s64,_b64,)(op, pg); +} + +uint32_t test_svqdecp_n_u32_b8(uint32_t op, svbool_t pg) +{ + // CHECK-LABEL: test_svqdecp_n_u32_b8 + // CHECK: %[[INTRINSIC:.*]] = call i32 @llvm.aarch64.sve.uqdecp.n32.nxv16i1(i32 %op, %pg) + // CHECK: ret i32 %[[INTRINSIC]] + return SVE_ACLE_FUNC(svqdecp,_n_u32,_b8,)(op, pg); +} + +uint32_t test_svqdecp_n_u32_b16(uint32_t op, svbool_t pg) +{ + // CHECK-LABEL: test_svqdecp_n_u32_b16 + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call i32 @llvm.aarch64.sve.uqdecp.n32.nxv8i1(i32 %op, %[[PG]]) + // CHECK: ret i32 %[[INTRINSIC]] + return SVE_ACLE_FUNC(svqdecp,_n_u32,_b16,)(op, pg); +} + +uint32_t test_svqdecp_n_u32_b32(uint32_t op, svbool_t pg) +{ + // CHECK-LABEL: test_svqdecp_n_u32_b32 + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call i32 @llvm.aarch64.sve.uqdecp.n32.nxv4i1(i32 %op, %[[PG]]) + // CHECK: ret i32 %[[INTRINSIC]] + return SVE_ACLE_FUNC(svqdecp,_n_u32,_b32,)(op, pg); +} + +uint32_t test_svqdecp_n_u32_b64(uint32_t op, svbool_t pg) +{ + // CHECK-LABEL: test_svqdecp_n_u32_b64 + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call i32 @llvm.aarch64.sve.uqdecp.n32.nxv2i1(i32 %op, %[[PG]]) + // CHECK: ret i32 %[[INTRINSIC]] + return SVE_ACLE_FUNC(svqdecp,_n_u32,_b64,)(op, pg); +} + +uint64_t test_svqdecp_n_u64_b8(uint64_t op, svbool_t pg) +{ + // CHECK-LABEL: test_svqdecp_n_u64_b8 + // CHECK: %[[INTRINSIC:.*]] = call i64 @llvm.aarch64.sve.uqdecp.n64.nxv16i1(i64 %op, %pg) + // CHECK: ret i64 %[[INTRINSIC]] + return SVE_ACLE_FUNC(svqdecp,_n_u64,_b8,)(op, pg); +} + +uint64_t test_svqdecp_n_u64_b16(uint64_t op, svbool_t pg) +{ + // CHECK-LABEL: test_svqdecp_n_u64_b16 + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call i64 @llvm.aarch64.sve.uqdecp.n64.nxv8i1(i64 %op, %[[PG]]) + // CHECK: ret i64 %[[INTRINSIC]] + return SVE_ACLE_FUNC(svqdecp,_n_u64,_b16,)(op, pg); +} + +uint64_t test_svqdecp_n_u64_b32(uint64_t op, svbool_t pg) +{ + // CHECK-LABEL: test_svqdecp_n_u64_b32 + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call i64 @llvm.aarch64.sve.uqdecp.n64.nxv4i1(i64 %op, %[[PG]]) + // CHECK: ret i64 %[[INTRINSIC]] + return SVE_ACLE_FUNC(svqdecp,_n_u64,_b32,)(op, pg); +} + +uint64_t test_svqdecp_n_u64_b64(uint64_t op, svbool_t pg) +{ + // CHECK-LABEL: test_svqdecp_n_u64_b64 + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call i64 @llvm.aarch64.sve.uqdecp.n64.nxv2i1(i64 %op, %[[PG]]) + // CHECK: ret i64 %[[INTRINSIC]] + return SVE_ACLE_FUNC(svqdecp,_n_u64,_b64,)(op, pg); +} + +svint16_t test_svqdecp_s16(svint16_t op, svbool_t pg) +{ + // CHECK-LABEL: test_svqdecp_s16 + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.sqdecp.nxv8i16( %op, %[[PG]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svqdecp,_s16,,)(op, pg); +} + +svint32_t test_svqdecp_s32(svint32_t op, svbool_t pg) +{ + // CHECK-LABEL: test_svqdecp_s32 + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.sqdecp.nxv4i32( %op, %[[PG]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svqdecp,_s32,,)(op, pg); +} + +svint64_t test_svqdecp_s64(svint64_t op, svbool_t pg) +{ + // CHECK-LABEL: test_svqdecp_s64 + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.sqdecp.nxv2i64( %op, %[[PG]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svqdecp,_s64,,)(op, pg); +} + +svuint16_t test_svqdecp_u16(svuint16_t op, svbool_t pg) +{ + // CHECK-LABEL: test_svqdecp_u16 + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.uqdecp.nxv8i16( %op, %[[PG]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svqdecp,_u16,,)(op, pg); +} + +svuint32_t test_svqdecp_u32(svuint32_t op, svbool_t pg) +{ + // CHECK-LABEL: test_svqdecp_u32 + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.uqdecp.nxv4i32( %op, %[[PG]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svqdecp,_u32,,)(op, pg); +} + +svuint64_t test_svqdecp_u64(svuint64_t op, svbool_t pg) +{ + // CHECK-LABEL: test_svqdecp_u64 + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.uqdecp.nxv2i64( %op, %[[PG]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svqdecp,_u64,,)(op, pg); +} diff --git a/clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_qincp.c b/clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_qincp.c new file mode 100644 index 0000000000000..704e8405e2c62 --- /dev/null +++ b/clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_qincp.c @@ -0,0 +1,205 @@ +// 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 + +int32_t test_svqincp_n_s32_b8(int32_t op, svbool_t pg) +{ + // CHECK-LABEL: test_svqincp_n_s32_b8 + // CHECK: %[[INTRINSIC:.*]] = call i32 @llvm.aarch64.sve.sqincp.n32.nxv16i1(i32 %op, %pg) + // CHECK: ret i32 %[[INTRINSIC]] + return SVE_ACLE_FUNC(svqincp,_n_s32,_b8,)(op, pg); +} + +int32_t test_svqincp_n_s32_b16(int32_t op, svbool_t pg) +{ + // CHECK-LABEL: test_svqincp_n_s32_b16 + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call i32 @llvm.aarch64.sve.sqincp.n32.nxv8i1(i32 %op, %[[PG]]) + // CHECK: ret i32 %[[INTRINSIC]] + return SVE_ACLE_FUNC(svqincp,_n_s32,_b16,)(op, pg); +} + +int32_t test_svqincp_n_s32_b32(int32_t op, svbool_t pg) +{ + // CHECK-LABEL: test_svqincp_n_s32_b32 + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call i32 @llvm.aarch64.sve.sqincp.n32.nxv4i1(i32 %op, %[[PG]]) + // CHECK: ret i32 %[[INTRINSIC]] + return SVE_ACLE_FUNC(svqincp,_n_s32,_b32,)(op, pg); +} + +int32_t test_svqincp_n_s32_b64(int32_t op, svbool_t pg) +{ + // CHECK-LABEL: test_svqincp_n_s32_b64 + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call i32 @llvm.aarch64.sve.sqincp.n32.nxv2i1(i32 %op, %[[PG]]) + // CHECK: ret i32 %[[INTRINSIC]] + return SVE_ACLE_FUNC(svqincp,_n_s32,_b64,)(op, pg); +} + +int64_t test_svqincp_n_s64_b8(int64_t op, svbool_t pg) +{ + // CHECK-LABEL: test_svqincp_n_s64_b8 + // CHECK: %[[INTRINSIC:.*]] = call i64 @llvm.aarch64.sve.sqincp.n64.nxv16i1(i64 %op, %pg) + // CHECK: ret i64 %[[INTRINSIC]] + return SVE_ACLE_FUNC(svqincp,_n_s64,_b8,)(op, pg); +} + +int64_t test_svqincp_n_s64_b16(int64_t op, svbool_t pg) +{ + // CHECK-LABEL: test_svqincp_n_s64_b16 + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call i64 @llvm.aarch64.sve.sqincp.n64.nxv8i1(i64 %op, %[[PG]]) + // CHECK: ret i64 %[[INTRINSIC]] + return SVE_ACLE_FUNC(svqincp,_n_s64,_b16,)(op, pg); +} + +int64_t test_svqincp_n_s64_b32(int64_t op, svbool_t pg) +{ + // CHECK-LABEL: test_svqincp_n_s64_b32 + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call i64 @llvm.aarch64.sve.sqincp.n64.nxv4i1(i64 %op, %[[PG]]) + // CHECK: ret i64 %[[INTRINSIC]] + return SVE_ACLE_FUNC(svqincp,_n_s64,_b32,)(op, pg); +} + +int64_t test_svqincp_n_s64_b64(int64_t op, svbool_t pg) +{ + // CHECK-LABEL: test_svqincp_n_s64_b64 + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call i64 @llvm.aarch64.sve.sqincp.n64.nxv2i1(i64 %op, %[[PG]]) + // CHECK: ret i64 %[[INTRINSIC]] + return SVE_ACLE_FUNC(svqincp,_n_s64,_b64,)(op, pg); +} + +uint32_t test_svqincp_n_u32_b8(uint32_t op, svbool_t pg) +{ + // CHECK-LABEL: test_svqincp_n_u32_b8 + // CHECK: %[[INTRINSIC:.*]] = call i32 @llvm.aarch64.sve.uqincp.n32.nxv16i1(i32 %op, %pg) + // CHECK: ret i32 %[[INTRINSIC]] + return SVE_ACLE_FUNC(svqincp,_n_u32,_b8,)(op, pg); +} + +uint32_t test_svqincp_n_u32_b16(uint32_t op, svbool_t pg) +{ + // CHECK-LABEL: test_svqincp_n_u32_b16 + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call i32 @llvm.aarch64.sve.uqincp.n32.nxv8i1(i32 %op, %[[PG]]) + // CHECK: ret i32 %[[INTRINSIC]] + return SVE_ACLE_FUNC(svqincp,_n_u32,_b16,)(op, pg); +} + +uint32_t test_svqincp_n_u32_b32(uint32_t op, svbool_t pg) +{ + // CHECK-LABEL: test_svqincp_n_u32_b32 + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call i32 @llvm.aarch64.sve.uqincp.n32.nxv4i1(i32 %op, %[[PG]]) + // CHECK: ret i32 %[[INTRINSIC]] + return SVE_ACLE_FUNC(svqincp,_n_u32,_b32,)(op, pg); +} + +uint32_t test_svqincp_n_u32_b64(uint32_t op, svbool_t pg) +{ + // CHECK-LABEL: test_svqincp_n_u32_b64 + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call i32 @llvm.aarch64.sve.uqincp.n32.nxv2i1(i32 %op, %[[PG]]) + // CHECK: ret i32 %[[INTRINSIC]] + return SVE_ACLE_FUNC(svqincp,_n_u32,_b64,)(op, pg); +} + +uint64_t test_svqincp_n_u64_b8(uint64_t op, svbool_t pg) +{ + // CHECK-LABEL: test_svqincp_n_u64_b8 + // CHECK: %[[INTRINSIC:.*]] = call i64 @llvm.aarch64.sve.uqincp.n64.nxv16i1(i64 %op, %pg) + // CHECK: ret i64 %[[INTRINSIC]] + return SVE_ACLE_FUNC(svqincp,_n_u64,_b8,)(op, pg); +} + +uint64_t test_svqincp_n_u64_b16(uint64_t op, svbool_t pg) +{ + // CHECK-LABEL: test_svqincp_n_u64_b16 + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call i64 @llvm.aarch64.sve.uqincp.n64.nxv8i1(i64 %op, %[[PG]]) + // CHECK: ret i64 %[[INTRINSIC]] + return SVE_ACLE_FUNC(svqincp,_n_u64,_b16,)(op, pg); +} + +uint64_t test_svqincp_n_u64_b32(uint64_t op, svbool_t pg) +{ + // CHECK-LABEL: test_svqincp_n_u64_b32 + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call i64 @llvm.aarch64.sve.uqincp.n64.nxv4i1(i64 %op, %[[PG]]) + // CHECK: ret i64 %[[INTRINSIC]] + return SVE_ACLE_FUNC(svqincp,_n_u64,_b32,)(op, pg); +} + +uint64_t test_svqincp_n_u64_b64(uint64_t op, svbool_t pg) +{ + // CHECK-LABEL: test_svqincp_n_u64_b64 + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call i64 @llvm.aarch64.sve.uqincp.n64.nxv2i1(i64 %op, %[[PG]]) + // CHECK: ret i64 %[[INTRINSIC]] + return SVE_ACLE_FUNC(svqincp,_n_u64,_b64,)(op, pg); +} + +svint16_t test_svqincp_s16(svint16_t op, svbool_t pg) +{ + // CHECK-LABEL: test_svqincp_s16 + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.sqincp.nxv8i16( %op, %[[PG]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svqincp,_s16,,)(op, pg); +} + +svint32_t test_svqincp_s32(svint32_t op, svbool_t pg) +{ + // CHECK-LABEL: test_svqincp_s32 + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.sqincp.nxv4i32( %op, %[[PG]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svqincp,_s32,,)(op, pg); +} + +svint64_t test_svqincp_s64(svint64_t op, svbool_t pg) +{ + // CHECK-LABEL: test_svqincp_s64 + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.sqincp.nxv2i64( %op, %[[PG]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svqincp,_s64,,)(op, pg); +} + +svuint16_t test_svqincp_u16(svuint16_t op, svbool_t pg) +{ + // CHECK-LABEL: test_svqincp_u16 + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.uqincp.nxv8i16( %op, %[[PG]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svqincp,_u16,,)(op, pg); +} + +svuint32_t test_svqincp_u32(svuint32_t op, svbool_t pg) +{ + // CHECK-LABEL: test_svqincp_u32 + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.uqincp.nxv4i32( %op, %[[PG]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svqincp,_u32,,)(op, pg); +} + +svuint64_t test_svqincp_u64(svuint64_t op, svbool_t pg) +{ + // CHECK-LABEL: test_svqincp_u64 + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.uqincp.nxv2i64( %op, %[[PG]]) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svqincp,_u64,,)(op, pg); +}