Skip to content

Commit cb43021

Browse files
[CLANG]Add Scalable vectors for mfloat8_t (#101644)
This patch adds these new vector sizes for sve: svmfloat8_t According to the ARM ACLE PR#323[1]. [1] ARM-software/acle#323
1 parent 4cda28c commit cb43021

15 files changed

+92
-10
lines changed

clang/include/clang/Basic/AArch64SVEACLETypes.def

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,9 @@ SVE_VECTOR_TYPE_FLOAT("__SVFloat64_t", "__SVFloat64_t", SveFloat64, SveFloat64Ty
115115

116116
SVE_VECTOR_TYPE_BFLOAT("__SVBfloat16_t", "__SVBfloat16_t", SveBFloat16, SveBFloat16Ty, 8, 16, 1)
117117

118+
// This is a 8 bits opaque type.
119+
SVE_VECTOR_TYPE_INT("__SVMfloat8_t", "__SVMfloat8_t", SveMFloat8, SveMFloat8Ty, 16, 8, 1, false)
120+
118121
//
119122
// x2
120123
//

clang/include/clang/Basic/arm_sve_sme_incl.td

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,7 @@ def EltTyBool16 : EltType<10>;
162162
def EltTyBool32 : EltType<11>;
163163
def EltTyBool64 : EltType<12>;
164164
def EltTyBFloat16 : EltType<13>;
165+
def EltTyMFloat8 : EltType<14>;
165166

166167
class MemEltType<int val> {
167168
int Value = val;

clang/include/clang/Serialization/ASTBitCodes.h

Lines changed: 1 addition & 1 deletion
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 = 505;
1152+
const unsigned NUM_PREDEF_TYPE_IDS = 506;
11531153

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

clang/lib/AST/Type.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2525,6 +2525,7 @@ bool Type::isSveVLSBuiltinType() const {
25252525
case BuiltinType::SveBool:
25262526
case BuiltinType::SveBoolx2:
25272527
case BuiltinType::SveBoolx4:
2528+
case BuiltinType::SveMFloat8:
25282529
return true;
25292530
default:
25302531
return false;

clang/test/AST/ast-dump-aarch64-sve-types.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,9 @@
4545
// CHECK: TypedefDecl {{.*}} implicit __SVBfloat16_t '__SVBfloat16_t'
4646
// CHECK-NEXT: -BuiltinType {{.*}} '__SVBfloat16_t'
4747

48+
// CHECK: TypedefDecl {{.*}} implicit __SVMfloat8_t '__SVMfloat8_t'
49+
// CHECK-NEXT: -BuiltinType {{.*}} '__SVMfloat8_t'
50+
4851
// CHECK: TypedefDecl {{.*}} implicit __SVBool_t '__SVBool_t'
4952
// CHECK-NEXT: -BuiltinType {{.*}} '__SVBool_t'
5053

clang/test/CodeGen/aarch64-sve.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
// CHECK: %f16 = alloca <vscale x 8 x half>, align 16
1414
// CHECK: %f32 = alloca <vscale x 4 x float>, align 16
1515
// CHECK: %f64 = alloca <vscale x 2 x double>, align 16
16+
// CHECK: %mf8 = alloca <vscale x 16 x i8>, align 16
1617
// CHECK: %bf16 = alloca <vscale x 8 x bfloat>, align 16
1718
// CHECK: %b8 = alloca <vscale x 16 x i1>, align 2
1819

@@ -33,6 +34,7 @@ void test_locals(void) {
3334
__SVFloat32_t f32;
3435
__SVFloat64_t f64;
3536

37+
__SVMfloat8_t mf8;
3638
__SVBfloat16_t bf16;
3739

3840
__SVBool_t b8;

clang/test/CodeGenCXX/aarch64-mangle-sve-vectors.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ void f(__SVFloat16_t, __SVFloat16_t);
1717
void f(__SVFloat32_t, __SVFloat32_t);
1818
void f(__SVFloat64_t, __SVFloat64_t);
1919
void f(__SVBfloat16_t, __SVBfloat16_t);
20+
void f(__SVMfloat8_t, __SVMfloat8_t);
2021
void f(__SVBool_t, __SVBool_t);
2122
void f(__SVCount_t, __SVCount_t);
2223

@@ -150,6 +151,7 @@ void f(__clang_svboolx4_t, __clang_svboolx4_t);
150151
// CHECK-NEXT: call void @_Z1fu13__SVFloat16_tS_(<vscale x 8 x half> zeroinitializer, <vscale x 8 x half> zeroinitializer)
151152
// CHECK-NEXT: call void @_Z1fu13__SVFloat32_tS_(<vscale x 4 x float> zeroinitializer, <vscale x 4 x float> zeroinitializer)
152153
// CHECK-NEXT: call void @_Z1fu13__SVFloat64_tS_(<vscale x 2 x double> zeroinitializer, <vscale x 2 x double> zeroinitializer)
154+
// CHECK-NEXT: call void @_Z1fu13__SVMfloat8_tS_(<vscale x 16 x i8> zeroinitializer, <vscale x 16 x i8> zeroinitializer)
153155
// CHECK-NEXT: call void @_Z1fu14__SVBfloat16_tS_(<vscale x 8 x bfloat> zeroinitializer, <vscale x 8 x bfloat> zeroinitializer)
154156
// CHECK-NEXT: call void @_Z1fu10__SVBool_tS_(<vscale x 16 x i1> zeroinitializer, <vscale x 16 x i1> zeroinitializer)
155157
// CHECK-NEXT: call void @_Z1fu11__SVCount_tS_(target("aarch64.svcount") zeroinitializer, target("aarch64.svcount") zeroinitializer)
@@ -664,6 +666,7 @@ void f(__clang_svboolx4_t, __clang_svboolx4_t);
664666
// COMPAT_17-NEXT: call void @_Z1fu13__SVFloat16_tu13__SVFloat16_t(<vscale x 8 x half> zeroinitializer, <vscale x 8 x half> zeroinitializer)
665667
// COMPAT_17-NEXT: call void @_Z1fu13__SVFloat32_tu13__SVFloat32_t(<vscale x 4 x float> zeroinitializer, <vscale x 4 x float> zeroinitializer)
666668
// COMPAT_17-NEXT: call void @_Z1fu13__SVFloat64_tu13__SVFloat64_t(<vscale x 2 x double> zeroinitializer, <vscale x 2 x double> zeroinitializer)
669+
// COMPAT_17-NEXT: call void @_Z1fu13__SVMfloat8_tu13__SVMfloat8_t(<vscale x 16 x i8> zeroinitializer, <vscale x 16 x i8> zeroinitializer)
667670
// COMPAT_17-NEXT: call void @_Z1fu14__SVBFloat16_tu14__SVBFloat16_t(<vscale x 8 x bfloat> zeroinitializer, <vscale x 8 x bfloat> zeroinitializer)
668671
// COMPAT_17-NEXT: call void @_Z1fu10__SVBool_tu10__SVBool_t(<vscale x 16 x i1> zeroinitializer, <vscale x 16 x i1> zeroinitializer)
669672
// COMPAT_17-NEXT: call void @_Z1fu11__SVCount_tu11__SVCount_t(target("aarch64.svcount") zeroinitializer, target("aarch64.svcount") zeroinitializer)
@@ -1100,6 +1103,7 @@ void foo() {
11001103
f(__SVFloat16_t(), __SVFloat16_t());
11011104
f(__SVFloat32_t(), __SVFloat32_t());
11021105
f(__SVFloat64_t(), __SVFloat64_t());
1106+
f(__SVMfloat8_t(), __SVMfloat8_t());
11031107
f(__SVBfloat16_t(), __SVBfloat16_t());
11041108
f(__SVBool_t(), __SVBool_t());
11051109
f(__SVCount_t(), __SVCount_t());

clang/test/CodeGenCXX/aarch64-sve-typeinfo.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ auto &f64 = typeid(__SVFloat64_t);
2121

2222
auto &bf16 = typeid(__SVBfloat16_t);
2323

24+
auto &mf8 = typeid(__SVMfloat8_t);
25+
2426
auto &b8 = typeid(__SVBool_t);
2527
auto &c8 = typeid(__SVCount_t);
2628

@@ -60,6 +62,9 @@ auto &c8 = typeid(__SVCount_t);
6062
// CHECK-DAG: @_ZTSu14__SVBfloat16_t = {{.*}} c"u14__SVBfloat16_t\00"
6163
// CHECK-DAG: @_ZTIu14__SVBfloat16_t = {{.*}} @_ZTVN10__cxxabiv123__fundamental_type_infoE, {{.*}} @_ZTSu14__SVBfloat16_t
6264

65+
// CHECK-DAG: @_ZTSu13__SVMfloat8_t = {{.*}} c"u13__SVMfloat8_t\00"
66+
// CHECK-DAG: @_ZTIu13__SVMfloat8_t = {{.*}} @_ZTVN10__cxxabiv123__fundamental_type_infoE, {{.*}} @_ZTSu13__SVMfloat8_t
67+
6368
// CHECK-DAG: @_ZTSu10__SVBool_t = {{.*}} c"u10__SVBool_t\00"
6469
// CHECK-DAG: @_ZTIu10__SVBool_t = {{.*}} @_ZTVN10__cxxabiv123__fundamental_type_infoE, {{.*}} @_ZTSu10__SVBool_t
6570

clang/test/CodeGenCXX/aarch64-sve-vector-init.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
// CHECK-NEXT: [[U16:%.*]] = alloca <vscale x 8 x i16>, align 16
1313
// CHECK-NEXT: [[U32:%.*]] = alloca <vscale x 4 x i32>, align 16
1414
// CHECK-NEXT: [[U64:%.*]] = alloca <vscale x 2 x i64>, align 16
15+
// CHECK-NEXT: [[MF8:%.*]] = alloca <vscale x 16 x i8>, align 16
1516
// CHECK-NEXT: [[F16:%.*]] = alloca <vscale x 8 x half>, align 16
1617
// CHECK-NEXT: [[F32:%.*]] = alloca <vscale x 4 x float>, align 16
1718
// CHECK-NEXT: [[F64:%.*]] = alloca <vscale x 2 x double>, align 16
@@ -64,6 +65,7 @@
6465
// CHECK-NEXT: store <vscale x 8 x i16> zeroinitializer, ptr [[U16]], align 16
6566
// CHECK-NEXT: store <vscale x 4 x i32> zeroinitializer, ptr [[U32]], align 16
6667
// CHECK-NEXT: store <vscale x 2 x i64> zeroinitializer, ptr [[U64]], align 16
68+
// CHECK-NEXT: store <vscale x 16 x i8> zeroinitializer, ptr [[MF8]], align 16
6769
// CHECK-NEXT: store <vscale x 8 x half> zeroinitializer, ptr [[F16]], align 16
6870
// CHECK-NEXT: store <vscale x 4 x float> zeroinitializer, ptr [[F32]], align 16
6971
// CHECK-NEXT: store <vscale x 2 x double> zeroinitializer, ptr [[F64]], align 16
@@ -119,6 +121,7 @@ void test_locals(void) {
119121
__SVUint16_t u16{};
120122
__SVUint32_t u32{};
121123
__SVUint64_t u64{};
124+
__SVMfloat8_t mf8{};
122125
__SVFloat16_t f16{};
123126
__SVFloat32_t f32{};
124127
__SVFloat64_t f64{};
@@ -282,6 +285,20 @@ void test_copy_u64(__SVUint64_t a) {
282285
__SVUint64_t b{a};
283286
}
284287

288+
// CHECK-LABEL: define dso_local void @_Z13test_copy_mf8u13__SVMfloat8_t
289+
// CHECK-SAME: (<vscale x 16 x i8> [[A:%.*]]) #[[ATTR0]] {
290+
// CHECK-NEXT: entry:
291+
// CHECK-NEXT: [[A_ADDR:%.*]] = alloca <vscale x 16 x i8>, align 16
292+
// CHECK-NEXT: [[B:%.*]] = alloca <vscale x 16 x i8>, align 16
293+
// CHECK-NEXT: store <vscale x 16 x i8> [[A]], ptr [[A_ADDR]], align 16
294+
// CHECK-NEXT: [[TMP0:%.*]] = load <vscale x 16 x i8>, ptr [[A_ADDR]], align 16
295+
// CHECK-NEXT: store <vscale x 16 x i8> [[TMP0]], ptr [[B]], align 16
296+
// CHECK-NEXT: ret void
297+
//
298+
void test_copy_mf8(__SVMfloat8_t a) {
299+
__SVMfloat8_t b{a};
300+
}
301+
285302
// CHECK-LABEL: define dso_local void @_Z13test_copy_f16u13__SVFloat16_t
286303
// CHECK-SAME: (<vscale x 8 x half> [[A:%.*]]) #[[ATTR0]] {
287304
// CHECK-NEXT: entry:

clang/test/CodeGenObjC/aarch64-sve-types.m

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,5 +31,8 @@
3131
// CHECK: error: cannot yet @encode type __SVBfloat16_t
3232
const char bf16[] = @encode(__SVBfloat16_t);
3333

34+
// CHECK: error: cannot yet @encode type __SVMfloat8_t
35+
const char mf8[] = @encode(__SVMfloat8_t);
36+
3437
// CHECK: error: cannot yet @encode type __SVBool_t
3538
const char b8[] = @encode(__SVBool_t);

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

Lines changed: 1 addition & 1 deletion
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=4056
26+
// CHECK: <DECL_FUNCTION {{.*}} op8=4064
2727
// CHECK: <TYPE_FUNCTION_PROTO
2828

2929
//--- a.v1.cppm

clang/test/Sema/aarch64-sve-types.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ void f(void) {
3737
int size_bf16[sizeof(__SVBfloat16_t) == 0 ? 1 : -1]; // expected-error {{invalid application of 'sizeof' to sizeless type '__SVBfloat16_t'}}
3838
int align_bf16[__alignof__(__SVBfloat16_t) == 16 ? 1 : -1]; // expected-error {{invalid application of '__alignof' to sizeless type '__SVBfloat16_t'}}
3939

40+
int size_mf8[sizeof(__SVMfloat8_t) == 0 ? 1 : -1]; // expected-error {{invalid application of 'sizeof' to sizeless type '__SVMfloat8_t'}}
41+
int align_mf8[__alignof__(__SVMfloat8_t) == 16 ? 1 : -1]; // expected-error {{invalid application of '__alignof' to sizeless type '__SVMfloat8_t'}}
42+
4043
int size_b8[sizeof(__SVBool_t) == 0 ? 1 : -1]; // expected-error {{invalid application of 'sizeof' to sizeless type '__SVBool_t'}}
4144
int align_b8[__alignof__(__SVBool_t) == 2 ? 1 : -1]; // expected-error {{invalid application of '__alignof' to sizeless type '__SVBool_t'}}
4245
}

clang/test/Sema/arm-mfp8.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
// RUN: %clang_cc1 -fsyntax-only -verify=sve -triple aarch64-arm-none-eabi \
2+
// RUN: -target-feature -fp8 -target-feature +sve %s
3+
4+
// REQUIRES: aarch64-registered-target
5+
6+
#include <arm_sve.h>
7+
void test_vector_sve(svmfloat8_t a, svuint8_t c) {
8+
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}}
9+
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}}
10+
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}}
11+
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}}
12+
}
13+

clang/test/SemaObjC/aarch64-sve-types.m

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,7 @@ @interface foo
2020

2121
@property(nullable) __SVBfloat16_t bf16; // expected-error {{cannot be applied to non-pointer type}}
2222

23+
@property(nullable) __SVMfloat8_t mf8; // expected-error {{cannot be applied to non-pointer type}}
24+
2325
@property(nullable) __SVBool_t b8; // expected-error {{cannot be applied to non-pointer type}}
2426
@end

clang/utils/TableGen/SveEmitter.cpp

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ using TypeSpec = std::string;
5151

5252
namespace {
5353
class SVEType {
54-
bool Float, Signed, Immediate, Void, Constant, Pointer, BFloat;
54+
bool Float, Signed, Immediate, Void, Constant, Pointer, BFloat, MFloat;
5555
bool DefaultType, IsScalable, Predicate, PredicatePattern, PrefetchOp,
5656
Svcount;
5757
unsigned Bitwidth, ElementBitwidth, NumVectors;
@@ -61,10 +61,10 @@ class SVEType {
6161

6262
SVEType(StringRef TS, char CharMod, unsigned NumVectors = 1)
6363
: Float(false), Signed(true), Immediate(false), Void(false),
64-
Constant(false), Pointer(false), BFloat(false), DefaultType(false),
65-
IsScalable(true), Predicate(false), PredicatePattern(false),
66-
PrefetchOp(false), Svcount(false), Bitwidth(128), ElementBitwidth(~0U),
67-
NumVectors(NumVectors) {
64+
Constant(false), Pointer(false), BFloat(false), MFloat(false),
65+
DefaultType(false), IsScalable(true), Predicate(false),
66+
PredicatePattern(false), PrefetchOp(false), Svcount(false),
67+
Bitwidth(128), ElementBitwidth(~0U), NumVectors(NumVectors) {
6868
if (!TS.empty())
6969
applyTypespec(TS);
7070
applyModifier(CharMod);
@@ -82,11 +82,14 @@ class SVEType {
8282
bool isVector() const { return NumVectors > 0; }
8383
bool isScalableVector() const { return isVector() && IsScalable; }
8484
bool isFixedLengthVector() const { return isVector() && !IsScalable; }
85-
bool isChar() const { return ElementBitwidth == 8; }
85+
bool isChar() const { return ElementBitwidth == 8 && !MFloat; }
8686
bool isVoid() const { return Void && !Pointer; }
8787
bool isDefault() const { return DefaultType; }
88-
bool isFloat() const { return Float && !BFloat; }
89-
bool isBFloat() const { return BFloat && !Float; }
88+
bool isFloat() const { return Float && !BFloat && !MFloat; }
89+
bool isBFloat() const { return BFloat && !Float && !MFloat; }
90+
bool isMFloat() const {
91+
return MFloat && !BFloat && !Float;
92+
}
9093
bool isFloatingPoint() const { return Float || BFloat; }
9194
bool isInteger() const {
9295
return !isFloatingPoint() && !Predicate && !Svcount;
@@ -454,6 +457,9 @@ std::string SVEType::builtin_str() const {
454457
else if (isBFloat()) {
455458
assert(ElementBitwidth == 16 && "Not a valid BFloat.");
456459
S += "y";
460+
} else if (isMFloat()) {
461+
assert(ElementBitwidth == 8 && "Not a valid MFloat.");
462+
S += "m";
457463
}
458464

459465
if (!isFloatingPoint()) {
@@ -509,6 +515,8 @@ std::string SVEType::str() const {
509515
S += "bool";
510516
else if (isBFloat())
511517
S += "bfloat";
518+
else if (isMFloat())
519+
S += "mfloat";
512520
else
513521
S += "int";
514522

@@ -572,8 +580,16 @@ void SVEType::applyTypespec(StringRef TS) {
572580
case 'b':
573581
BFloat = true;
574582
Float = false;
583+
MFloat = false;
575584
ElementBitwidth = 16;
576585
break;
586+
case 'm':
587+
Signed = false;
588+
MFloat = true;
589+
Float = false;
590+
BFloat = false;
591+
ElementBitwidth = 8;
592+
break;
577593
default:
578594
llvm_unreachable("Unhandled type code!");
579595
}
@@ -1037,6 +1053,8 @@ std::string Intrinsic::replaceTemplatedArgs(std::string Name, TypeSpec TS,
10371053
TypeCode = 'b';
10381054
else if (T.isBFloat())
10391055
TypeCode = "bf";
1056+
else if (T.isMFloat())
1057+
TypeCode = "mfp";
10401058
else
10411059
TypeCode = 'f';
10421060
Ret.replace(Pos, NumChars, TypeCode + utostr(T.getElementSizeInBits()));
@@ -1130,6 +1148,11 @@ uint64_t SVEEmitter::encodeTypeFlags(const SVEType &T) {
11301148
return encodeEltType("EltTyBFloat16");
11311149
}
11321150

1151+
if (T.isMFloat()) {
1152+
assert(T.getElementSizeInBits() == 8 && "Not a valid MFloat.");
1153+
return encodeEltType("EltTyMFloat8");
1154+
}
1155+
11331156
if (T.isPredicateVector() || T.isSvcount()) {
11341157
switch (T.getElementSizeInBits()) {
11351158
case 8:
@@ -1305,6 +1328,8 @@ void SVEEmitter::createHeader(raw_ostream &OS) {
13051328
OS << "#include <arm_bf16.h>\n";
13061329
OS << "#include <arm_vector_types.h>\n";
13071330

1331+
OS << "typedef __SVMfloat8_t svmfloat8_t;\n\n";
1332+
13081333
OS << "typedef __SVFloat32_t svfloat32_t;\n";
13091334
OS << "typedef __SVFloat64_t svfloat64_t;\n";
13101335
OS << "typedef __clang_svint8x2_t svint8x2_t;\n";

0 commit comments

Comments
 (0)