@@ -51,7 +51,7 @@ using TypeSpec = std::string;
5151
5252namespace {
5353class 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);
@@ -87,6 +87,10 @@ class SVEType {
8787 bool isDefault () const { return DefaultType; }
8888 bool isFloat () const { return Float && !BFloat; }
8989 bool isBFloat () const { return BFloat && !Float; }
90+ bool isMFloat () const {
91+ return MFloat && !BFloat && !Float;
92+ ;
93+ }
9094 bool isFloatingPoint () const { return Float || BFloat; }
9195 bool isInteger () const {
9296 return !isFloatingPoint () && !Predicate && !Svcount;
@@ -454,6 +458,8 @@ std::string SVEType::builtin_str() const {
454458 else if (isBFloat ()) {
455459 assert (ElementBitwidth == 16 && " Not a valid BFloat." );
456460 S += " y" ;
461+ } else if (isMFloat ()) {
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
@@ -574,6 +582,12 @@ void SVEType::applyTypespec(StringRef TS) {
574582 Float = false ;
575583 ElementBitwidth = 16 ;
576584 break ;
585+ case ' m' :
586+ MFloat = true ;
587+ Float = false ;
588+ BFloat = false ;
589+ ElementBitwidth = 8 ;
590+ break ;
577591 default :
578592 llvm_unreachable (" Unhandled type code!" );
579593 }
@@ -1026,6 +1040,8 @@ std::string Intrinsic::replaceTemplatedArgs(std::string Name, TypeSpec TS,
10261040 TypeCode = ' b' ;
10271041 else if (T.isBFloat ())
10281042 TypeCode = " bf" ;
1043+ else if (T.isMFloat ())
1044+ TypeCode = " mfp" ;
10291045 else
10301046 TypeCode = ' f' ;
10311047 Ret.replace (Pos, NumChars, TypeCode + utostr (T.getElementSizeInBits ()));
@@ -1119,6 +1135,11 @@ uint64_t SVEEmitter::encodeTypeFlags(const SVEType &T) {
11191135 return encodeEltType (" EltTyBFloat16" );
11201136 }
11211137
1138+ if (T.isMFloat ()) {
1139+ assert (T.getElementSizeInBits () == 8 && " Not a valid MFloat." );
1140+ return encodeEltType (" EltTyMFloat8" );
1141+ }
1142+
11221143 if (T.isPredicateVector () || T.isSvcount ()) {
11231144 switch (T.getElementSizeInBits ()) {
11241145 case 8 :
@@ -1296,6 +1317,8 @@ void SVEEmitter::createHeader(raw_ostream &OS) {
12961317 OS << " #include <arm_bf16.h>\n " ;
12971318 OS << " #include <arm_vector_types.h>\n " ;
12981319
1320+ OS << " typedef __SVMfloat8_t svmfloat8_t;\n\n " ;
1321+
12991322 OS << " typedef __SVFloat32_t svfloat32_t;\n " ;
13001323 OS << " typedef __SVFloat64_t svfloat64_t;\n " ;
13011324 OS << " typedef __clang_svint8x2_t svint8x2_t;\n " ;
0 commit comments