mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-27 12:46:08 +00:00
[CLANG][AArch64]Add Neon vectors for mfloat8_t (#99865)
This patch adds these new vector sizes for neon: mfloat8x16_t and mfloat8x8_t According to the ARM ACLE PR#323[1]. [1] ARM-software/acle#323
This commit is contained in:
parent
d4dd770289
commit
6dad29aebc
@ -97,6 +97,17 @@
|
||||
SVE_TYPE(Name, Id, SingletonId)
|
||||
#endif
|
||||
|
||||
#ifndef AARCH64_VECTOR_TYPE
|
||||
#define AARCH64_VECTOR_TYPE(Name, MangledName, Id, SingletonId) \
|
||||
SVE_TYPE(Name, Id, SingletonId)
|
||||
#endif
|
||||
|
||||
#ifndef AARCH64_VECTOR_TYPE_MFLOAT
|
||||
#define AARCH64_VECTOR_TYPE_MFLOAT(Name, MangledName, Id, SingletonId, NumEls, ElBits, NF) \
|
||||
AARCH64_VECTOR_TYPE(Name, MangledName, Id, SingletonId)
|
||||
#endif
|
||||
|
||||
|
||||
//===- Vector point types -----------------------------------------------===//
|
||||
|
||||
SVE_VECTOR_TYPE_INT("__SVInt8_t", "__SVInt8_t", SveInt8, SveInt8Ty, 16, 8, 1, true)
|
||||
@ -190,6 +201,9 @@ SVE_PREDICATE_TYPE_ALL("__clang_svboolx4_t", "svboolx4_t", SveBoolx4, SveBoolx4T
|
||||
|
||||
SVE_OPAQUE_TYPE("__SVCount_t", "__SVCount_t", SveCount, SveCountTy)
|
||||
|
||||
AARCH64_VECTOR_TYPE_MFLOAT("__MFloat8x8_t", "__MFloat8x8_t", MFloat8x8, MFloat8x8Ty, 8, 8, 1)
|
||||
AARCH64_VECTOR_TYPE_MFLOAT("__MFloat8x16_t", "__MFloat8x16_t", MFloat8x16, MFloat8x16Ty, 16, 8, 1)
|
||||
|
||||
#undef SVE_VECTOR_TYPE
|
||||
#undef SVE_VECTOR_TYPE_BFLOAT
|
||||
#undef SVE_VECTOR_TYPE_FLOAT
|
||||
@ -197,4 +211,6 @@ SVE_OPAQUE_TYPE("__SVCount_t", "__SVCount_t", SveCount, SveCountTy)
|
||||
#undef SVE_PREDICATE_TYPE
|
||||
#undef SVE_PREDICATE_TYPE_ALL
|
||||
#undef SVE_OPAQUE_TYPE
|
||||
#undef AARCH64_VECTOR_TYPE_MFLOAT
|
||||
#undef AARCH64_VECTOR_TYPE
|
||||
#undef SVE_TYPE
|
||||
|
@ -1149,7 +1149,7 @@ enum PredefinedTypeIDs {
|
||||
///
|
||||
/// Type IDs for non-predefined types will start at
|
||||
/// NUM_PREDEF_TYPE_IDs.
|
||||
const unsigned NUM_PREDEF_TYPE_IDS = 509;
|
||||
const unsigned NUM_PREDEF_TYPE_IDS = 511;
|
||||
|
||||
// Ensure we do not overrun the predefined types we reserved
|
||||
// in the enum PredefinedTypeIDs above.
|
||||
|
@ -2239,6 +2239,12 @@ TypeInfo ASTContext::getTypeInfoImpl(const Type *T) const {
|
||||
Width = 0; \
|
||||
Align = 16; \
|
||||
break;
|
||||
#define AARCH64_VECTOR_TYPE_MFLOAT(Name, MangledName, Id, SingletonId, NumEls, \
|
||||
ElBits, NF) \
|
||||
case BuiltinType::Id: \
|
||||
Width = NumEls * ElBits * NF; \
|
||||
Align = NumEls * ElBits; \
|
||||
break;
|
||||
#include "clang/Basic/AArch64SVEACLETypes.def"
|
||||
#define PPC_VECTOR_TYPE(Name, Id, Size) \
|
||||
case BuiltinType::Id: \
|
||||
@ -4361,6 +4367,11 @@ ASTContext::getBuiltinVectorTypeInfo(const BuiltinType *Ty) const {
|
||||
#define SVE_PREDICATE_TYPE_ALL(Name, MangledName, Id, SingletonId, NumEls, NF) \
|
||||
case BuiltinType::Id: \
|
||||
return {BoolTy, llvm::ElementCount::getScalable(NumEls), NF};
|
||||
#define AARCH64_VECTOR_TYPE_MFLOAT(Name, MangledName, Id, SingletonId, NumEls, \
|
||||
ElBits, NF) \
|
||||
case BuiltinType::Id: \
|
||||
return {getIntTypeForBitwidth(ElBits, false), \
|
||||
llvm::ElementCount::getFixed(NumEls), NF};
|
||||
#define SVE_OPAQUE_TYPE(Name, MangledName, Id, SingletonId)
|
||||
#include "clang/Basic/AArch64SVEACLETypes.def"
|
||||
|
||||
@ -4427,6 +4438,7 @@ QualType ASTContext::getScalableVectorType(QualType EltTy, unsigned NumElts,
|
||||
if (EltTy->isBooleanType() && NumElts == (NumEls * NF) && NumFields == 1) \
|
||||
return SingletonId;
|
||||
#define SVE_OPAQUE_TYPE(Name, MangledName, Id, SingletonId)
|
||||
#define AARCH64_VECTOR_TYPE(Name, MangledName, Id, SingletonId)
|
||||
#include "clang/Basic/AArch64SVEACLETypes.def"
|
||||
} else if (Target->hasRISCVVTypes()) {
|
||||
uint64_t EltTySize = getTypeSize(EltTy);
|
||||
|
@ -3430,6 +3430,11 @@ void CXXNameMangler::mangleType(const BuiltinType *T) {
|
||||
type_name = MangledName; \
|
||||
Out << (type_name == Name ? "u" : "") << type_name.size() << type_name; \
|
||||
break;
|
||||
#define AARCH64_VECTOR_TYPE(Name, MangledName, Id, SingletonId) \
|
||||
case BuiltinType::Id: \
|
||||
type_name = MangledName; \
|
||||
Out << (type_name == Name ? "u" : "") << type_name.size() << type_name; \
|
||||
break;
|
||||
#include "clang/Basic/AArch64SVEACLETypes.def"
|
||||
#define PPC_VECTOR_TYPE(Name, Id, Size) \
|
||||
case BuiltinType::Id: \
|
||||
|
@ -2484,9 +2484,19 @@ bool Type::isSVESizelessBuiltinType() const {
|
||||
if (const BuiltinType *BT = getAs<BuiltinType>()) {
|
||||
switch (BT->getKind()) {
|
||||
// SVE Types
|
||||
#define SVE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
|
||||
#define SVE_VECTOR_TYPE(Name, MangledName, Id, SingletonId) \
|
||||
case BuiltinType::Id: \
|
||||
return true;
|
||||
#define SVE_OPAQUE_TYPE(Name, MangledName, Id, SingletonId) \
|
||||
case BuiltinType::Id: \
|
||||
return true;
|
||||
#define SVE_PREDICATE_TYPE(Name, MangledName, Id, SingletonId) \
|
||||
case BuiltinType::Id: \
|
||||
return true;
|
||||
#define AARCH64_VECTOR_TYPE(Name, MangledName, Id, SingletonId) \
|
||||
case BuiltinType::Id: \
|
||||
return false;
|
||||
#include "clang/Basic/AArch64SVEACLETypes.def"
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
@ -505,6 +505,8 @@ llvm::Type *CodeGenTypes::ConvertType(QualType T) {
|
||||
case BuiltinType::Id:
|
||||
#define SVE_PREDICATE_TYPE(Name, MangledName, Id, SingletonId) \
|
||||
case BuiltinType::Id:
|
||||
#define AARCH64_VECTOR_TYPE(Name, MangledName, Id, SingletonId) \
|
||||
case BuiltinType::Id:
|
||||
#define SVE_OPAQUE_TYPE(Name, MangledName, Id, SingletonId)
|
||||
#include "clang/Basic/AArch64SVEACLETypes.def"
|
||||
{
|
||||
|
51
clang/test/CodeGen/arm-mfp8.c
Normal file
51
clang/test/CodeGen/arm-mfp8.c
Normal file
@ -0,0 +1,51 @@
|
||||
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5
|
||||
// RUN: %clang_cc1 -emit-llvm -triple aarch64-arm-none-eabi -target-feature -fp8 -target-feature +neon -o - %s | FileCheck %s --check-prefixes=CHECK,CHECK-C
|
||||
// RUN: %clang_cc1 -emit-llvm -triple aarch64-arm-none-eabi -target-feature -fp8 -target-feature +neon -o - -x c++ %s | FileCheck %s --check-prefixes=CHECK,CHECK-CXX
|
||||
|
||||
// REQUIRES: aarch64-registered-target
|
||||
|
||||
|
||||
#include <arm_neon.h>
|
||||
|
||||
// CHECK-C-LABEL: define dso_local <16 x i8> @test_ret_mfloat8x16_t(
|
||||
// CHECK-C-SAME: <16 x i8> [[V:%.*]]) #[[ATTR0:[0-9]+]] {
|
||||
// CHECK-C-NEXT: [[ENTRY:.*:]]
|
||||
// CHECK-C-NEXT: [[V_ADDR:%.*]] = alloca <16 x i8>, align 16
|
||||
// CHECK-C-NEXT: store <16 x i8> [[V]], ptr [[V_ADDR]], align 16
|
||||
// CHECK-C-NEXT: [[TMP0:%.*]] = load <16 x i8>, ptr [[V_ADDR]], align 16
|
||||
// CHECK-C-NEXT: ret <16 x i8> [[TMP0]]
|
||||
//
|
||||
// CHECK-CXX-LABEL: define dso_local <16 x i8> @_Z21test_ret_mfloat8x16_tu14__MFloat8x16_t(
|
||||
// CHECK-CXX-SAME: <16 x i8> [[V:%.*]]) #[[ATTR0:[0-9]+]] {
|
||||
// CHECK-CXX-NEXT: [[ENTRY:.*:]]
|
||||
// CHECK-CXX-NEXT: [[V_ADDR:%.*]] = alloca <16 x i8>, align 16
|
||||
// CHECK-CXX-NEXT: store <16 x i8> [[V]], ptr [[V_ADDR]], align 16
|
||||
// CHECK-CXX-NEXT: [[TMP0:%.*]] = load <16 x i8>, ptr [[V_ADDR]], align 16
|
||||
// CHECK-CXX-NEXT: ret <16 x i8> [[TMP0]]
|
||||
//
|
||||
mfloat8x16_t test_ret_mfloat8x16_t(mfloat8x16_t v) {
|
||||
return v;
|
||||
}
|
||||
|
||||
// CHECK-C-LABEL: define dso_local <8 x i8> @test_ret_mfloat8x8_t(
|
||||
// CHECK-C-SAME: <8 x i8> [[V:%.*]]) #[[ATTR0]] {
|
||||
// CHECK-C-NEXT: [[ENTRY:.*:]]
|
||||
// CHECK-C-NEXT: [[V_ADDR:%.*]] = alloca <8 x i8>, align 8
|
||||
// CHECK-C-NEXT: store <8 x i8> [[V]], ptr [[V_ADDR]], align 8
|
||||
// CHECK-C-NEXT: [[TMP0:%.*]] = load <8 x i8>, ptr [[V_ADDR]], align 8
|
||||
// CHECK-C-NEXT: ret <8 x i8> [[TMP0]]
|
||||
//
|
||||
// CHECK-CXX-LABEL: define dso_local <8 x i8> @_Z20test_ret_mfloat8x8_tu13__MFloat8x8_t(
|
||||
// CHECK-CXX-SAME: <8 x i8> [[V:%.*]]) #[[ATTR0]] {
|
||||
// CHECK-CXX-NEXT: [[ENTRY:.*:]]
|
||||
// CHECK-CXX-NEXT: [[V_ADDR:%.*]] = alloca <8 x i8>, align 8
|
||||
// CHECK-CXX-NEXT: store <8 x i8> [[V]], ptr [[V_ADDR]], align 8
|
||||
// CHECK-CXX-NEXT: [[TMP0:%.*]] = load <8 x i8>, ptr [[V_ADDR]], align 8
|
||||
// CHECK-CXX-NEXT: ret <8 x i8> [[TMP0]]
|
||||
//
|
||||
mfloat8x8_t test_ret_mfloat8x8_t(mfloat8x8_t v) {
|
||||
return v;
|
||||
}
|
||||
|
||||
//// NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
|
||||
// CHECK: {{.*}}
|
@ -23,7 +23,7 @@ export module b;
|
||||
import a;
|
||||
export int b();
|
||||
|
||||
// CHECK: <DECL_FUNCTION {{.*}} op8=4088
|
||||
// CHECK: <DECL_FUNCTION {{.*}} op8=4104
|
||||
// CHECK: <TYPE_FUNCTION_PROTO
|
||||
|
||||
//--- a.v1.cppm
|
||||
|
@ -1,5 +1,5 @@
|
||||
// RUN: %clang_cc1 -fsyntax-only -verify=sve -triple aarch64-arm-none-eabi \
|
||||
// RUN: -target-feature -fp8 -target-feature +sve %s
|
||||
// RUN: %clang_cc1 -fsyntax-only -verify=sve,neon -triple aarch64-arm-none-eabi \
|
||||
// RUN: -target-feature -fp8 -target-feature +sve -target-feature +neon %s
|
||||
|
||||
// REQUIRES: aarch64-registered-target
|
||||
|
||||
@ -11,3 +11,21 @@ void test_vector_sve(svmfloat8_t a, svuint8_t c) {
|
||||
a / c; // sve-error {{cannot convert between vector type 'svuint8_t' (aka '__SVUint8_t') and vector type 'svmfloat8_t' (aka '__SVMfloat8_t') as implicit conversion would cause truncation}}
|
||||
}
|
||||
|
||||
|
||||
#include <arm_neon.h>
|
||||
|
||||
void test_vector(mfloat8x8_t a, mfloat8x16_t b, uint8x8_t c) {
|
||||
a + b; // neon-error {{invalid operands to binary expression ('mfloat8x8_t' (aka '__MFloat8x8_t') and 'mfloat8x16_t' (aka '__MFloat8x16_t'))}}
|
||||
a - b; // neon-error {{invalid operands to binary expression ('mfloat8x8_t' (aka '__MFloat8x8_t') and 'mfloat8x16_t' (aka '__MFloat8x16_t'))}}
|
||||
a * b; // neon-error {{invalid operands to binary expression ('mfloat8x8_t' (aka '__MFloat8x8_t') and 'mfloat8x16_t' (aka '__MFloat8x16_t'))}}
|
||||
a / b; // neon-error {{invalid operands to binary expression ('mfloat8x8_t' (aka '__MFloat8x8_t') and 'mfloat8x16_t' (aka '__MFloat8x16_t'))}}
|
||||
|
||||
a + c; // neon-error {{cannot convert between vector and non-scalar values ('mfloat8x8_t' (aka '__MFloat8x8_t') and 'uint8x8_t' (vector of 8 'uint8_t' values))}}
|
||||
a - c; // neon-error {{cannot convert between vector and non-scalar values ('mfloat8x8_t' (aka '__MFloat8x8_t') and 'uint8x8_t' (vector of 8 'uint8_t' values))}}
|
||||
a * c; // neon-error {{cannot convert between vector and non-scalar values ('mfloat8x8_t' (aka '__MFloat8x8_t') and 'uint8x8_t' (vector of 8 'uint8_t' values))}}
|
||||
a / c; // neon-error {{cannot convert between vector and non-scalar values ('mfloat8x8_t' (aka '__MFloat8x8_t') and 'uint8x8_t' (vector of 8 'uint8_t' values))}}
|
||||
c + b; // neon-error {{cannot convert between vector and non-scalar values ('uint8x8_t' (vector of 8 'uint8_t' values) and 'mfloat8x16_t' (aka '__MFloat8x16_t'))}}
|
||||
c - b; // neon-error {{cannot convert between vector and non-scalar values ('uint8x8_t' (vector of 8 'uint8_t' values) and 'mfloat8x16_t' (aka '__MFloat8x16_t'))}}
|
||||
c * b; // neon-error {{cannot convert between vector and non-scalar values ('uint8x8_t' (vector of 8 'uint8_t' values) and 'mfloat8x16_t' (aka '__MFloat8x16_t'))}}
|
||||
c / b; // neon-error {{cannot convert between vector and non-scalar values ('uint8x8_t' (vector of 8 'uint8_t' values) and 'mfloat8x16_t' (aka '__MFloat8x16_t'))}}
|
||||
}
|
||||
|
@ -149,7 +149,7 @@ private:
|
||||
SInt,
|
||||
UInt,
|
||||
Poly,
|
||||
BFloat16,
|
||||
BFloat16
|
||||
};
|
||||
TypeKind Kind;
|
||||
bool Immediate, Constant, Pointer;
|
||||
@ -2588,6 +2588,8 @@ void NeonEmitter::runVectorTypes(raw_ostream &OS) {
|
||||
OS << "typedef __fp16 float16_t;\n";
|
||||
|
||||
OS << "#if defined(__aarch64__) || defined(__arm64ec__)\n";
|
||||
OS << "typedef __MFloat8x8_t mfloat8x8_t;\n";
|
||||
OS << "typedef __MFloat8x16_t mfloat8x16_t;\n";
|
||||
OS << "typedef double float64_t;\n";
|
||||
OS << "#endif\n\n";
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user