diff --git a/clang/include/clang/Basic/TargetBuiltins.h b/clang/include/clang/Basic/TargetBuiltins.h --- a/clang/include/clang/Basic/TargetBuiltins.h +++ b/clang/include/clang/Basic/TargetBuiltins.h @@ -247,6 +247,7 @@ bool isGatherPrefetch() const { return Flags & IsGatherPrefetch; } bool isReverseUSDOT() const { return Flags & ReverseUSDOT; } bool isUndef() const { return Flags & IsUndef; } + bool isTupleCreate() const { return Flags & IsTupleCreate; } uint64_t getBits() const { return Flags; } bool isFlagSet(uint64_t Flag) const { return Flags & Flag; } 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 @@ -200,6 +200,7 @@ def ReverseCompare : FlagType<0x20000000>; // Compare operands must be swapped. def ReverseUSDOT : FlagType<0x40000000>; // Unsigned/signed operands must be swapped. def IsUndef : FlagType<0x80000000>; // Codegen `undef` of given type. +def IsTupleCreate : FlagType<0x100000000>; // These must be kept in sync with the flags in include/clang/Basic/TargetBuiltins.h class ImmCheckType { @@ -1279,6 +1280,10 @@ def SVUNDEF_3 : SInst<"svundef3_{d}", "3", "csilUcUsUiUlhfd", MergeNone, "", [IsUndef]>; def SVUNDEF_4 : SInst<"svundef4_{d}", "4", "csilUcUsUiUlhfd", MergeNone, "", [IsUndef]>; +def SVCREATE_2 : SInst<"svcreate2[_{d}]", "2dd", "csilUcUsUiUlhfd", MergeNone, "aarch64_sve_tuple_create2", [IsTupleCreate]>; +def SVCREATE_3 : SInst<"svcreate3[_{d}]", "3ddd", "csilUcUsUiUlhfd", MergeNone, "aarch64_sve_tuple_create3", [IsTupleCreate]>; +def SVCREATE_4 : SInst<"svcreate4[_{d}]", "4dddd", "csilUcUsUiUlhfd", MergeNone, "aarch64_sve_tuple_create4", [IsTupleCreate]>; + //////////////////////////////////////////////////////////////////////////////// // SVE2 WhileGE/GT let ArchGuard = "defined(__ARM_FEATURE_SVE2)" in { diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -4646,7 +4646,7 @@ unsigned BuiltinID; unsigned LLVMIntrinsic; unsigned AltLLVMIntrinsic; - unsigned TypeModifier; + uint64_t TypeModifier; bool operator<(unsigned RHSBuiltinID) const { return BuiltinID < RHSBuiltinID; @@ -7998,9 +7998,8 @@ Ops.insert(Ops.begin(), SplatUndef); } -SmallVector -CodeGenFunction::getSVEOverloadTypes(SVETypeFlags TypeFlags, - ArrayRef Ops) { +SmallVector CodeGenFunction::getSVEOverloadTypes( + SVETypeFlags TypeFlags, llvm::Type *ResultType, ArrayRef Ops) { if (TypeFlags.isOverloadNone()) return {}; @@ -8015,6 +8014,9 @@ if (TypeFlags.isOverloadCvt()) return {Ops[0]->getType(), Ops.back()->getType()}; + if (TypeFlags.isTupleCreate()) + return {ResultType, Ops[0]->getType()}; + assert(TypeFlags.isOverloadDefault() && "Unexpected value for overloads"); return {DefaultType}; } @@ -8112,7 +8114,7 @@ } Function *F = CGM.getIntrinsic(Builtin->LLVMIntrinsic, - getSVEOverloadTypes(TypeFlags, Ops)); + getSVEOverloadTypes(TypeFlags, Ty, Ops)); Value *Call = Builder.CreateCall(F, Ops); // Predicate results must be converted to svbool_t. diff --git a/clang/lib/CodeGen/CodeGenFunction.h b/clang/lib/CodeGen/CodeGenFunction.h --- a/clang/lib/CodeGen/CodeGenFunction.h +++ b/clang/lib/CodeGen/CodeGenFunction.h @@ -3956,6 +3956,7 @@ llvm::Type *SVEBuiltinMemEltTy(SVETypeFlags TypeFlags); SmallVector getSVEOverloadTypes(SVETypeFlags TypeFlags, + llvm::Type *ReturnType, ArrayRef Ops); llvm::Type *getEltType(SVETypeFlags TypeFlags); llvm::ScalableVectorType *getSVEType(const SVETypeFlags &TypeFlags); diff --git a/clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_create2.c b/clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_create2.c new file mode 100644 --- /dev/null +++ b/clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_create2.c @@ -0,0 +1,99 @@ +// 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 + +svint8x2_t test_svcreate2_s8(svint8_t x0, svint8_t x1) +{ + // CHECK-LABEL: test_svcreate2_s8 + // CHECK: %[[CREATE:.*]] = call @llvm.aarch64.sve.tuple.create2.nxv32i8.nxv16i8( %x0, %x1) + // CHECK-NEXT: ret %[[CREATE]] + return SVE_ACLE_FUNC(svcreate2,_s8,,)(x0, x1); +} + +svint16x2_t test_svcreate2_s16(svint16_t x0, svint16_t x1) +{ + // CHECK-LABEL: test_svcreate2_s16 + // CHECK: %[[CREATE:.*]] = call @llvm.aarch64.sve.tuple.create2.nxv16i16.nxv8i16( %x0, %x1) + // CHECK-NEXT: ret %[[CREATE]] + return SVE_ACLE_FUNC(svcreate2,_s16,,)(x0, x1); +} + +svint32x2_t test_svcreate2_s32(svint32_t x0, svint32_t x1) +{ + // CHECK-LABEL: test_svcreate2_s32 + // CHECK: %[[CREATE:.*]] = call @llvm.aarch64.sve.tuple.create2.nxv8i32.nxv4i32( %x0, %x1) + // CHECK-NEXT: ret %[[CREATE]] + return SVE_ACLE_FUNC(svcreate2,_s32,,)(x0, x1); +} + +svint64x2_t test_svcreate2_s64(svint64_t x0, svint64_t x1) +{ + // CHECK-LABEL: test_svcreate2_s64 + // CHECK: %[[CREATE:.*]] = call @llvm.aarch64.sve.tuple.create2.nxv4i64.nxv2i64( %x0, %x1) + // CHECK-NEXT: ret %[[CREATE]] + return SVE_ACLE_FUNC(svcreate2,_s64,,)(x0, x1); +} + +svuint8x2_t test_svcreate2_u8(svuint8_t x0, svuint8_t x1) +{ + // CHECK-LABEL: test_svcreate2_u8 + // CHECK: %[[CREATE:.*]] = call @llvm.aarch64.sve.tuple.create2.nxv32i8.nxv16i8( %x0, %x1) + // CHECK-NEXT: ret %[[CREATE]] + return SVE_ACLE_FUNC(svcreate2,_u8,,)(x0, x1); +} + +svuint16x2_t test_svcreate2_u16(svuint16_t x0, svuint16_t x1) +{ + // CHECK-LABEL: test_svcreate2_u16 + // CHECK: %[[CREATE:.*]] = call @llvm.aarch64.sve.tuple.create2.nxv16i16.nxv8i16( %x0, %x1) + // CHECK-NEXT: ret %[[CREATE]] + return SVE_ACLE_FUNC(svcreate2,_u16,,)(x0, x1); +} + +svuint32x2_t test_svcreate2_u32(svuint32_t x0, svuint32_t x1) +{ + // CHECK-LABEL: test_svcreate2_u32 + // CHECK: %[[CREATE:.*]] = call @llvm.aarch64.sve.tuple.create2.nxv8i32.nxv4i32( %x0, %x1) + // CHECK-NEXT: ret %[[CREATE]] + return SVE_ACLE_FUNC(svcreate2,_u32,,)(x0, x1); +} + +svuint64x2_t test_svcreate2_u64(svuint64_t x0, svuint64_t x1) +{ + // CHECK-LABEL: test_svcreate2_u64 + // CHECK: %[[CREATE:.*]] = call @llvm.aarch64.sve.tuple.create2.nxv4i64.nxv2i64( %x0, %x1) + // CHECK-NEXT: ret %[[CREATE]] + return SVE_ACLE_FUNC(svcreate2,_u64,,)(x0, x1); +} + +svfloat16x2_t test_svcreate2_f16(svfloat16_t x0, svfloat16_t x1) +{ + // CHECK-LABEL: test_svcreate2_f16 + // CHECK: %[[CREATE:.*]] = call @llvm.aarch64.sve.tuple.create2.nxv16f16.nxv8f16( %x0, %x1) + // CHECK-NEXT: ret %[[CREATE]] + return SVE_ACLE_FUNC(svcreate2,_f16,,)(x0, x1); +} + +svfloat32x2_t test_svcreate2_f32(svfloat32_t x0, svfloat32_t x1) +{ + // CHECK-LABEL: test_svcreate2_f32 + // CHECK: %[[CREATE:.*]] = call @llvm.aarch64.sve.tuple.create2.nxv8f32.nxv4f32( %x0, %x1) + // CHECK-NEXT: ret %[[CREATE]] + return SVE_ACLE_FUNC(svcreate2,_f32,,)(x0, x1); +} + +svfloat64x2_t test_svcreate2_f64(svfloat64_t x0, svfloat64_t x1) +{ + // CHECK-LABEL: test_svcreate2_f64 + // CHECK: %[[CREATE:.*]] = call @llvm.aarch64.sve.tuple.create2.nxv4f64.nxv2f64( %x0, %x1) + // CHECK-NEXT: ret %[[CREATE]] + return SVE_ACLE_FUNC(svcreate2,_f64,,)(x0, x1); +} diff --git a/clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_create3.c b/clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_create3.c new file mode 100644 --- /dev/null +++ b/clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_create3.c @@ -0,0 +1,99 @@ +// 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 + +svint8x3_t test_svcreate3_s8(svint8_t x0, svint8_t x1, svint8_t x2) +{ + // CHECK-LABEL: test_svcreate3_s8 + // CHECK: %[[CREATE:.*]] = call @llvm.aarch64.sve.tuple.create3.nxv48i8.nxv16i8( %x0, %x1, %x2) + // CHECK-NEXT: ret %[[CREATE]] + return SVE_ACLE_FUNC(svcreate3,_s8,,)(x0, x1, x2); +} + +svint16x3_t test_svcreate3_s16(svint16_t x0, svint16_t x1, svint16_t x2) +{ + // CHECK-LABEL: test_svcreate3_s16 + // CHECK: %[[CREATE:.*]] = call @llvm.aarch64.sve.tuple.create3.nxv24i16.nxv8i16( %x0, %x1, %x2) + // CHECK-NEXT: ret %[[CREATE]] + return SVE_ACLE_FUNC(svcreate3,_s16,,)(x0, x1, x2); +} + +svint32x3_t test_svcreate3_s32(svint32_t x0, svint32_t x1, svint32_t x2) +{ + // CHECK-LABEL: test_svcreate3_s32 + // CHECK: %[[CREATE:.*]] = call @llvm.aarch64.sve.tuple.create3.nxv12i32.nxv4i32( %x0, %x1, %x2) + // CHECK-NEXT: ret %[[CREATE]] + return SVE_ACLE_FUNC(svcreate3,_s32,,)(x0, x1, x2); +} + +svint64x3_t test_svcreate3_s64(svint64_t x0, svint64_t x1, svint64_t x2) +{ + // CHECK-LABEL: test_svcreate3_s64 + // CHECK: %[[CREATE:.*]] = call @llvm.aarch64.sve.tuple.create3.nxv6i64.nxv2i64( %x0, %x1, %x2) + // CHECK-NEXT: ret %[[CREATE]] + return SVE_ACLE_FUNC(svcreate3,_s64,,)(x0, x1, x2); +} + +svuint8x3_t test_svcreate3_u8(svuint8_t x0, svuint8_t x1, svuint8_t x2) +{ + // CHECK-LABEL: test_svcreate3_u8 + // CHECK: %[[CREATE:.*]] = call @llvm.aarch64.sve.tuple.create3.nxv48i8.nxv16i8( %x0, %x1, %x2) + // CHECK-NEXT: ret %[[CREATE]] + return SVE_ACLE_FUNC(svcreate3,_u8,,)(x0, x1, x2); +} + +svuint16x3_t test_svcreate3_u16(svuint16_t x0, svuint16_t x1, svuint16_t x2) +{ + // CHECK-LABEL: test_svcreate3_u16 + // CHECK: %[[CREATE:.*]] = call @llvm.aarch64.sve.tuple.create3.nxv24i16.nxv8i16( %x0, %x1, %x2) + // CHECK-NEXT: ret %[[CREATE]] + return SVE_ACLE_FUNC(svcreate3,_u16,,)(x0, x1, x2); +} + +svuint32x3_t test_svcreate3_u32(svuint32_t x0, svuint32_t x1, svuint32_t x2) +{ + // CHECK-LABEL: test_svcreate3_u32 + // CHECK: %[[CREATE:.*]] = call @llvm.aarch64.sve.tuple.create3.nxv12i32.nxv4i32( %x0, %x1, %x2) + // CHECK-NEXT: ret %[[CREATE]] + return SVE_ACLE_FUNC(svcreate3,_u32,,)(x0, x1, x2); +} + +svuint64x3_t test_svcreate3_u64(svuint64_t x0, svuint64_t x1, svuint64_t x2) +{ + // CHECK-LABEL: test_svcreate3_u64 + // CHECK: %[[CREATE:.*]] = call @llvm.aarch64.sve.tuple.create3.nxv6i64.nxv2i64( %x0, %x1, %x2) + // CHECK-NEXT: ret %[[CREATE]] + return SVE_ACLE_FUNC(svcreate3,_u64,,)(x0, x1, x2); +} + +svfloat16x3_t test_svcreate3_f16(svfloat16_t x0, svfloat16_t x1, svfloat16_t x2) +{ + // CHECK-LABEL: test_svcreate3_f16 + // CHECK: %[[CREATE:.*]] = call @llvm.aarch64.sve.tuple.create3.nxv24f16.nxv8f16( %x0, %x1, %x2) + // CHECK-NEXT: ret %[[CREATE]] + return SVE_ACLE_FUNC(svcreate3,_f16,,)(x0, x1, x2); +} + +svfloat32x3_t test_svcreate3_f32(svfloat32_t x0, svfloat32_t x1, svfloat32_t x2) +{ + // CHECK-LABEL: test_svcreate3_f32 + // CHECK: %[[CREATE:.*]] = call @llvm.aarch64.sve.tuple.create3.nxv12f32.nxv4f32( %x0, %x1, %x2) + // CHECK-NEXT: ret %[[CREATE]] + return SVE_ACLE_FUNC(svcreate3,_f32,,)(x0, x1, x2); +} + +svfloat64x3_t test_svcreate3_f64(svfloat64_t x0, svfloat64_t x1, svfloat64_t x2) +{ + // CHECK-LABEL: test_svcreate3_f64 + // CHECK: %[[CREATE:.*]] = call @llvm.aarch64.sve.tuple.create3.nxv6f64.nxv2f64( %x0, %x1, %x2) + // CHECK-NEXT: ret %[[CREATE]] + return SVE_ACLE_FUNC(svcreate3,_f64,,)(x0, x1, x2); +} diff --git a/clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_create4.c b/clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_create4.c new file mode 100644 --- /dev/null +++ b/clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_create4.c @@ -0,0 +1,99 @@ +// 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 + +svint8x4_t test_svcreate4_s8(svint8_t x0, svint8_t x1, svint8_t x2, svint8_t x4) +{ + // CHECK-LABEL: test_svcreate4_s8 + // CHECK: %[[CREATE:.*]] = call @llvm.aarch64.sve.tuple.create4.nxv64i8.nxv16i8( %x0, %x1, %x2, %x4) + // CHECK-NEXT: ret %[[CREATE]] + return SVE_ACLE_FUNC(svcreate4,_s8,,)(x0, x1, x2, x4); +} + +svint16x4_t test_svcreate4_s16(svint16_t x0, svint16_t x1, svint16_t x2, svint16_t x4) +{ + // CHECK-LABEL: test_svcreate4_s16 + // CHECK: %[[CREATE:.*]] = call @llvm.aarch64.sve.tuple.create4.nxv32i16.nxv8i16( %x0, %x1, %x2, %x4) + // CHECK-NEXT: ret %[[CREATE]] + return SVE_ACLE_FUNC(svcreate4,_s16,,)(x0, x1, x2, x4); +} + +svint32x4_t test_svcreate4_s32(svint32_t x0, svint32_t x1, svint32_t x2, svint32_t x4) +{ + // CHECK-LABEL: test_svcreate4_s32 + // CHECK: %[[CREATE:.*]] = call @llvm.aarch64.sve.tuple.create4.nxv16i32.nxv4i32( %x0, %x1, %x2, %x4) + // CHECK-NEXT: ret %[[CREATE]] + return SVE_ACLE_FUNC(svcreate4,_s32,,)(x0, x1, x2, x4); +} + +svint64x4_t test_svcreate4_s64(svint64_t x0, svint64_t x1, svint64_t x2, svint64_t x4) +{ + // CHECK-LABEL: test_svcreate4_s64 + // CHECK: %[[CREATE:.*]] = call @llvm.aarch64.sve.tuple.create4.nxv8i64.nxv2i64( %x0, %x1, %x2, %x4) + // CHECK-NEXT: ret %[[CREATE]] + return SVE_ACLE_FUNC(svcreate4,_s64,,)(x0, x1, x2, x4); +} + +svuint8x4_t test_svcreate4_u8(svuint8_t x0, svuint8_t x1, svuint8_t x2, svuint8_t x4) +{ + // CHECK-LABEL: test_svcreate4_u8 + // CHECK: %[[CREATE:.*]] = call @llvm.aarch64.sve.tuple.create4.nxv64i8.nxv16i8( %x0, %x1, %x2, %x4) + // CHECK-NEXT: ret %[[CREATE]] + return SVE_ACLE_FUNC(svcreate4,_u8,,)(x0, x1, x2, x4); +} + +svuint16x4_t test_svcreate4_u16(svuint16_t x0, svuint16_t x1, svuint16_t x2, svuint16_t x4) +{ + // CHECK-LABEL: test_svcreate4_u16 + // CHECK: %[[CREATE:.*]] = call @llvm.aarch64.sve.tuple.create4.nxv32i16.nxv8i16( %x0, %x1, %x2, %x4) + // CHECK-NEXT: ret %[[CREATE]] + return SVE_ACLE_FUNC(svcreate4,_u16,,)(x0, x1, x2, x4); +} + +svuint32x4_t test_svcreate4_u32(svuint32_t x0, svuint32_t x1, svuint32_t x2, svuint32_t x4) +{ + // CHECK-LABEL: test_svcreate4_u32 + // CHECK: %[[CREATE:.*]] = call @llvm.aarch64.sve.tuple.create4.nxv16i32.nxv4i32( %x0, %x1, %x2, %x4) + // CHECK-NEXT: ret %[[CREATE]] + return SVE_ACLE_FUNC(svcreate4,_u32,,)(x0, x1, x2, x4); +} + +svuint64x4_t test_svcreate4_u64(svuint64_t x0, svuint64_t x1, svuint64_t x2, svuint64_t x4) +{ + // CHECK-LABEL: test_svcreate4_u64 + // CHECK: %[[CREATE:.*]] = call @llvm.aarch64.sve.tuple.create4.nxv8i64.nxv2i64( %x0, %x1, %x2, %x4) + // CHECK-NEXT: ret %[[CREATE]] + return SVE_ACLE_FUNC(svcreate4,_u64,,)(x0, x1, x2, x4); +} + +svfloat16x4_t test_svcreate4_f16(svfloat16_t x0, svfloat16_t x1, svfloat16_t x2, svfloat16_t x4) +{ + // CHECK-LABEL: test_svcreate4_f16 + // CHECK: %[[CREATE:.*]] = call @llvm.aarch64.sve.tuple.create4.nxv32f16.nxv8f16( %x0, %x1, %x2, %x4) + // CHECK-NEXT: ret %[[CREATE]] + return SVE_ACLE_FUNC(svcreate4,_f16,,)(x0, x1, x2, x4); +} + +svfloat32x4_t test_svcreate4_f32(svfloat32_t x0, svfloat32_t x1, svfloat32_t x2, svfloat32_t x4) +{ + // CHECK-LABEL: test_svcreate4_f32 + // CHECK: %[[CREATE:.*]] = call @llvm.aarch64.sve.tuple.create4.nxv16f32.nxv4f32( %x0, %x1, %x2, %x4) + // CHECK-NEXT: ret %[[CREATE]] + return SVE_ACLE_FUNC(svcreate4,_f32,,)(x0, x1, x2, x4); +} + +svfloat64x4_t test_svcreate4_f64(svfloat64_t x0, svfloat64_t x1, svfloat64_t x2, svfloat64_t x4) +{ + // CHECK-LABEL: test_svcreate4_f64 + // CHECK: %[[CREATE:.*]] = call @llvm.aarch64.sve.tuple.create4.nxv8f64.nxv2f64( %x0, %x1, %x2, %x4) + // CHECK-NEXT: ret %[[CREATE]] + return SVE_ACLE_FUNC(svcreate4,_f64,,)(x0, x1, x2, x4); +}