Skip to content

Commit 6dad29a

Browse files
[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
1 parent d4dd770 commit 6dad29a

File tree

10 files changed

+123
-7
lines changed

10 files changed

+123
-7
lines changed

clang/include/clang/Basic/AArch64SVEACLETypes.def

+16
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,17 @@
9797
SVE_TYPE(Name, Id, SingletonId)
9898
#endif
9999

100+
#ifndef AARCH64_VECTOR_TYPE
101+
#define AARCH64_VECTOR_TYPE(Name, MangledName, Id, SingletonId) \
102+
SVE_TYPE(Name, Id, SingletonId)
103+
#endif
104+
105+
#ifndef AARCH64_VECTOR_TYPE_MFLOAT
106+
#define AARCH64_VECTOR_TYPE_MFLOAT(Name, MangledName, Id, SingletonId, NumEls, ElBits, NF) \
107+
AARCH64_VECTOR_TYPE(Name, MangledName, Id, SingletonId)
108+
#endif
109+
110+
100111
//===- Vector point types -----------------------------------------------===//
101112

102113
SVE_VECTOR_TYPE_INT("__SVInt8_t", "__SVInt8_t", SveInt8, SveInt8Ty, 16, 8, 1, true)
@@ -190,11 +201,16 @@ SVE_PREDICATE_TYPE_ALL("__clang_svboolx4_t", "svboolx4_t", SveBoolx4, SveBoolx4T
190201

191202
SVE_OPAQUE_TYPE("__SVCount_t", "__SVCount_t", SveCount, SveCountTy)
192203

204+
AARCH64_VECTOR_TYPE_MFLOAT("__MFloat8x8_t", "__MFloat8x8_t", MFloat8x8, MFloat8x8Ty, 8, 8, 1)
205+
AARCH64_VECTOR_TYPE_MFLOAT("__MFloat8x16_t", "__MFloat8x16_t", MFloat8x16, MFloat8x16Ty, 16, 8, 1)
206+
193207
#undef SVE_VECTOR_TYPE
194208
#undef SVE_VECTOR_TYPE_BFLOAT
195209
#undef SVE_VECTOR_TYPE_FLOAT
196210
#undef SVE_VECTOR_TYPE_INT
197211
#undef SVE_PREDICATE_TYPE
198212
#undef SVE_PREDICATE_TYPE_ALL
199213
#undef SVE_OPAQUE_TYPE
214+
#undef AARCH64_VECTOR_TYPE_MFLOAT
215+
#undef AARCH64_VECTOR_TYPE
200216
#undef SVE_TYPE

clang/include/clang/Serialization/ASTBitCodes.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -1149,7 +1149,7 @@ enum PredefinedTypeIDs {
11491149
///
11501150
/// Type IDs for non-predefined types will start at
11511151
/// NUM_PREDEF_TYPE_IDs.
1152-
const unsigned NUM_PREDEF_TYPE_IDS = 509;
1152+
const unsigned NUM_PREDEF_TYPE_IDS = 511;
11531153

11541154
// Ensure we do not overrun the predefined types we reserved
11551155
// in the enum PredefinedTypeIDs above.

clang/lib/AST/ASTContext.cpp

+12
Original file line numberDiff line numberDiff line change
@@ -2239,6 +2239,12 @@ TypeInfo ASTContext::getTypeInfoImpl(const Type *T) const {
22392239
Width = 0; \
22402240
Align = 16; \
22412241
break;
2242+
#define AARCH64_VECTOR_TYPE_MFLOAT(Name, MangledName, Id, SingletonId, NumEls, \
2243+
ElBits, NF) \
2244+
case BuiltinType::Id: \
2245+
Width = NumEls * ElBits * NF; \
2246+
Align = NumEls * ElBits; \
2247+
break;
22422248
#include "clang/Basic/AArch64SVEACLETypes.def"
22432249
#define PPC_VECTOR_TYPE(Name, Id, Size) \
22442250
case BuiltinType::Id: \
@@ -4361,6 +4367,11 @@ ASTContext::getBuiltinVectorTypeInfo(const BuiltinType *Ty) const {
43614367
#define SVE_PREDICATE_TYPE_ALL(Name, MangledName, Id, SingletonId, NumEls, NF) \
43624368
case BuiltinType::Id: \
43634369
return {BoolTy, llvm::ElementCount::getScalable(NumEls), NF};
4370+
#define AARCH64_VECTOR_TYPE_MFLOAT(Name, MangledName, Id, SingletonId, NumEls, \
4371+
ElBits, NF) \
4372+
case BuiltinType::Id: \
4373+
return {getIntTypeForBitwidth(ElBits, false), \
4374+
llvm::ElementCount::getFixed(NumEls), NF};
43644375
#define SVE_OPAQUE_TYPE(Name, MangledName, Id, SingletonId)
43654376
#include "clang/Basic/AArch64SVEACLETypes.def"
43664377

@@ -4427,6 +4438,7 @@ QualType ASTContext::getScalableVectorType(QualType EltTy, unsigned NumElts,
44274438
if (EltTy->isBooleanType() && NumElts == (NumEls * NF) && NumFields == 1) \
44284439
return SingletonId;
44294440
#define SVE_OPAQUE_TYPE(Name, MangledName, Id, SingletonId)
4441+
#define AARCH64_VECTOR_TYPE(Name, MangledName, Id, SingletonId)
44304442
#include "clang/Basic/AArch64SVEACLETypes.def"
44314443
} else if (Target->hasRISCVVTypes()) {
44324444
uint64_t EltTySize = getTypeSize(EltTy);

clang/lib/AST/ItaniumMangle.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -3430,6 +3430,11 @@ void CXXNameMangler::mangleType(const BuiltinType *T) {
34303430
type_name = MangledName; \
34313431
Out << (type_name == Name ? "u" : "") << type_name.size() << type_name; \
34323432
break;
3433+
#define AARCH64_VECTOR_TYPE(Name, MangledName, Id, SingletonId) \
3434+
case BuiltinType::Id: \
3435+
type_name = MangledName; \
3436+
Out << (type_name == Name ? "u" : "") << type_name.size() << type_name; \
3437+
break;
34333438
#include "clang/Basic/AArch64SVEACLETypes.def"
34343439
#define PPC_VECTOR_TYPE(Name, Id, Size) \
34353440
case BuiltinType::Id: \

clang/lib/AST/Type.cpp

+12-2
Original file line numberDiff line numberDiff line change
@@ -2484,9 +2484,19 @@ bool Type::isSVESizelessBuiltinType() const {
24842484
if (const BuiltinType *BT = getAs<BuiltinType>()) {
24852485
switch (BT->getKind()) {
24862486
// SVE Types
2487-
#define SVE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
2487+
#define SVE_VECTOR_TYPE(Name, MangledName, Id, SingletonId) \
2488+
case BuiltinType::Id: \
2489+
return true;
2490+
#define SVE_OPAQUE_TYPE(Name, MangledName, Id, SingletonId) \
2491+
case BuiltinType::Id: \
2492+
return true;
2493+
#define SVE_PREDICATE_TYPE(Name, MangledName, Id, SingletonId) \
2494+
case BuiltinType::Id: \
2495+
return true;
2496+
#define AARCH64_VECTOR_TYPE(Name, MangledName, Id, SingletonId) \
2497+
case BuiltinType::Id: \
2498+
return false;
24882499
#include "clang/Basic/AArch64SVEACLETypes.def"
2489-
return true;
24902500
default:
24912501
return false;
24922502
}

clang/lib/CodeGen/CodeGenTypes.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -505,6 +505,8 @@ llvm::Type *CodeGenTypes::ConvertType(QualType T) {
505505
case BuiltinType::Id:
506506
#define SVE_PREDICATE_TYPE(Name, MangledName, Id, SingletonId) \
507507
case BuiltinType::Id:
508+
#define AARCH64_VECTOR_TYPE(Name, MangledName, Id, SingletonId) \
509+
case BuiltinType::Id:
508510
#define SVE_OPAQUE_TYPE(Name, MangledName, Id, SingletonId)
509511
#include "clang/Basic/AArch64SVEACLETypes.def"
510512
{

clang/test/CodeGen/arm-mfp8.c

+51
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5
2+
// 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
3+
// 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
4+
5+
// REQUIRES: aarch64-registered-target
6+
7+
8+
#include <arm_neon.h>
9+
10+
// CHECK-C-LABEL: define dso_local <16 x i8> @test_ret_mfloat8x16_t(
11+
// CHECK-C-SAME: <16 x i8> [[V:%.*]]) #[[ATTR0:[0-9]+]] {
12+
// CHECK-C-NEXT: [[ENTRY:.*:]]
13+
// CHECK-C-NEXT: [[V_ADDR:%.*]] = alloca <16 x i8>, align 16
14+
// CHECK-C-NEXT: store <16 x i8> [[V]], ptr [[V_ADDR]], align 16
15+
// CHECK-C-NEXT: [[TMP0:%.*]] = load <16 x i8>, ptr [[V_ADDR]], align 16
16+
// CHECK-C-NEXT: ret <16 x i8> [[TMP0]]
17+
//
18+
// CHECK-CXX-LABEL: define dso_local <16 x i8> @_Z21test_ret_mfloat8x16_tu14__MFloat8x16_t(
19+
// CHECK-CXX-SAME: <16 x i8> [[V:%.*]]) #[[ATTR0:[0-9]+]] {
20+
// CHECK-CXX-NEXT: [[ENTRY:.*:]]
21+
// CHECK-CXX-NEXT: [[V_ADDR:%.*]] = alloca <16 x i8>, align 16
22+
// CHECK-CXX-NEXT: store <16 x i8> [[V]], ptr [[V_ADDR]], align 16
23+
// CHECK-CXX-NEXT: [[TMP0:%.*]] = load <16 x i8>, ptr [[V_ADDR]], align 16
24+
// CHECK-CXX-NEXT: ret <16 x i8> [[TMP0]]
25+
//
26+
mfloat8x16_t test_ret_mfloat8x16_t(mfloat8x16_t v) {
27+
return v;
28+
}
29+
30+
// CHECK-C-LABEL: define dso_local <8 x i8> @test_ret_mfloat8x8_t(
31+
// CHECK-C-SAME: <8 x i8> [[V:%.*]]) #[[ATTR0]] {
32+
// CHECK-C-NEXT: [[ENTRY:.*:]]
33+
// CHECK-C-NEXT: [[V_ADDR:%.*]] = alloca <8 x i8>, align 8
34+
// CHECK-C-NEXT: store <8 x i8> [[V]], ptr [[V_ADDR]], align 8
35+
// CHECK-C-NEXT: [[TMP0:%.*]] = load <8 x i8>, ptr [[V_ADDR]], align 8
36+
// CHECK-C-NEXT: ret <8 x i8> [[TMP0]]
37+
//
38+
// CHECK-CXX-LABEL: define dso_local <8 x i8> @_Z20test_ret_mfloat8x8_tu13__MFloat8x8_t(
39+
// CHECK-CXX-SAME: <8 x i8> [[V:%.*]]) #[[ATTR0]] {
40+
// CHECK-CXX-NEXT: [[ENTRY:.*:]]
41+
// CHECK-CXX-NEXT: [[V_ADDR:%.*]] = alloca <8 x i8>, align 8
42+
// CHECK-CXX-NEXT: store <8 x i8> [[V]], ptr [[V_ADDR]], align 8
43+
// CHECK-CXX-NEXT: [[TMP0:%.*]] = load <8 x i8>, ptr [[V_ADDR]], align 8
44+
// CHECK-CXX-NEXT: ret <8 x i8> [[TMP0]]
45+
//
46+
mfloat8x8_t test_ret_mfloat8x8_t(mfloat8x8_t v) {
47+
return v;
48+
}
49+
50+
//// NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
51+
// CHECK: {{.*}}

clang/test/Modules/no-external-type-id.cppm

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ export module b;
2323
import a;
2424
export int b();
2525

26-
// CHECK: <DECL_FUNCTION {{.*}} op8=4088
26+
// CHECK: <DECL_FUNCTION {{.*}} op8=4104
2727
// CHECK: <TYPE_FUNCTION_PROTO
2828

2929
//--- a.v1.cppm

clang/test/Sema/arm-mfp8.cpp

+20-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
// RUN: %clang_cc1 -fsyntax-only -verify=sve -triple aarch64-arm-none-eabi \
2-
// RUN: -target-feature -fp8 -target-feature +sve %s
1+
// RUN: %clang_cc1 -fsyntax-only -verify=sve,neon -triple aarch64-arm-none-eabi \
2+
// RUN: -target-feature -fp8 -target-feature +sve -target-feature +neon %s
33

44
// REQUIRES: aarch64-registered-target
55

@@ -11,3 +11,21 @@ void test_vector_sve(svmfloat8_t a, svuint8_t c) {
1111
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}}
1212
}
1313

14+
15+
#include <arm_neon.h>
16+
17+
void test_vector(mfloat8x8_t a, mfloat8x16_t b, uint8x8_t c) {
18+
a + b; // neon-error {{invalid operands to binary expression ('mfloat8x8_t' (aka '__MFloat8x8_t') and 'mfloat8x16_t' (aka '__MFloat8x16_t'))}}
19+
a - b; // neon-error {{invalid operands to binary expression ('mfloat8x8_t' (aka '__MFloat8x8_t') and 'mfloat8x16_t' (aka '__MFloat8x16_t'))}}
20+
a * b; // neon-error {{invalid operands to binary expression ('mfloat8x8_t' (aka '__MFloat8x8_t') and 'mfloat8x16_t' (aka '__MFloat8x16_t'))}}
21+
a / b; // neon-error {{invalid operands to binary expression ('mfloat8x8_t' (aka '__MFloat8x8_t') and 'mfloat8x16_t' (aka '__MFloat8x16_t'))}}
22+
23+
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))}}
24+
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))}}
25+
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))}}
26+
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))}}
27+
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'))}}
28+
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'))}}
29+
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'))}}
30+
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'))}}
31+
}

clang/utils/TableGen/NeonEmitter.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ class Type {
149149
SInt,
150150
UInt,
151151
Poly,
152-
BFloat16,
152+
BFloat16
153153
};
154154
TypeKind Kind;
155155
bool Immediate, Constant, Pointer;
@@ -2588,6 +2588,8 @@ void NeonEmitter::runVectorTypes(raw_ostream &OS) {
25882588
OS << "typedef __fp16 float16_t;\n";
25892589

25902590
OS << "#if defined(__aarch64__) || defined(__arm64ec__)\n";
2591+
OS << "typedef __MFloat8x8_t mfloat8x8_t;\n";
2592+
OS << "typedef __MFloat8x16_t mfloat8x16_t;\n";
25912593
OS << "typedef double float64_t;\n";
25922594
OS << "#endif\n\n";
25932595

0 commit comments

Comments
 (0)