@@ -67,7 +67,7 @@ class ImmCheck {
6767};
6868
6969class SVEType {
70- bool Float, Signed, Immediate, Void, Constant, Pointer, BFloat;
70+ bool Float, Signed, Immediate, Void, Constant, Pointer, BFloat, MFloat ;
7171 bool DefaultType, IsScalable, Predicate, PredicatePattern, PrefetchOp,
7272 Svcount;
7373 unsigned Bitwidth, ElementBitwidth, NumVectors;
@@ -77,10 +77,10 @@ class SVEType {
7777
7878 SVEType (StringRef TS, char CharMod, unsigned NumVectors = 1 )
7979 : Float(false ), Signed(true ), Immediate(false ), Void(false ),
80- Constant (false ), Pointer(false ), BFloat(false ), DefaultType (false ),
81- IsScalable( true ), Predicate( false ), PredicatePattern (false ),
82- PrefetchOp (false ), Svcount (false ), Bitwidth( 128 ), ElementBitwidth(~ 0U ),
83- NumVectors(NumVectors) {
80+ Constant (false ), Pointer(false ), BFloat(false ), MFloat (false ),
81+ DefaultType( false ), IsScalable( true ), Predicate (false ),
82+ PredicatePattern (false ), PrefetchOp (false ), Svcount( false ),
83+ Bitwidth( 128 ), ElementBitwidth(~ 0U ), NumVectors(NumVectors) {
8484 if (!TS.empty ())
8585 applyTypespec (TS);
8686 applyModifier (CharMod);
@@ -103,6 +103,10 @@ class SVEType {
103103 bool isDefault () const { return DefaultType; }
104104 bool isFloat () const { return Float && !BFloat; }
105105 bool isBFloat () const { return BFloat && !Float; }
106+ bool isMFloat () const {
107+ return MFloat && !BFloat && !Float;
108+ ;
109+ }
106110 bool isFloatingPoint () const { return Float || BFloat; }
107111 bool isInteger () const {
108112 return !isFloatingPoint () && !Predicate && !Svcount;
@@ -447,6 +451,8 @@ std::string SVEType::builtin_str() const {
447451 else if (isBFloat ()) {
448452 assert (ElementBitwidth == 16 && " Not a valid BFloat." );
449453 S += " y" ;
454+ } else if (isMFloat ()) {
455+ S += " m" ;
450456 }
451457
452458 if (!isFloatingPoint ()) {
@@ -502,6 +508,8 @@ std::string SVEType::str() const {
502508 S += " bool" ;
503509 else if (isBFloat ())
504510 S += " bfloat" ;
511+ else if (isMFloat ())
512+ S += " mfloat" ;
505513 else
506514 S += " int" ;
507515
@@ -567,6 +575,12 @@ void SVEType::applyTypespec(StringRef TS) {
567575 Float = false ;
568576 ElementBitwidth = 16 ;
569577 break ;
578+ case ' m' :
579+ MFloat = true ;
580+ Float = false ;
581+ BFloat = false ;
582+ ElementBitwidth = 8 ;
583+ break ;
570584 default :
571585 llvm_unreachable (" Unhandled type code!" );
572586 }
@@ -1018,6 +1032,8 @@ std::string Intrinsic::replaceTemplatedArgs(std::string Name, TypeSpec TS,
10181032 TypeCode = ' b' ;
10191033 else if (T.isBFloat ())
10201034 TypeCode = " bf" ;
1035+ else if (T.isMFloat ())
1036+ TypeCode = " mfp" ;
10211037 else
10221038 TypeCode = ' f' ;
10231039 Ret.replace (Pos, NumChars, TypeCode + utostr (T.getElementSizeInBits ()));
@@ -1111,6 +1127,11 @@ uint64_t SVEEmitter::encodeTypeFlags(const SVEType &T) {
11111127 return encodeEltType (" EltTyBFloat16" );
11121128 }
11131129
1130+ if (T.isMFloat ()) {
1131+ assert (T.getElementSizeInBits () == 8 && " Not a valid MFloat." );
1132+ return encodeEltType (" EltTyMFloat8" );
1133+ }
1134+
11141135 if (T.isPredicateVector () || T.isSvcount ()) {
11151136 switch (T.getElementSizeInBits ()) {
11161137 case 8 :
@@ -1288,6 +1309,8 @@ void SVEEmitter::createHeader(raw_ostream &OS) {
12881309 OS << " #include <arm_bf16.h>\n " ;
12891310 OS << " #include <arm_vector_types.h>\n " ;
12901311
1312+ OS << " typedef __SVMfloat8_t svmfloat8_t;\n\n " ;
1313+
12911314 OS << " typedef __SVFloat32_t svfloat32_t;\n " ;
12921315 OS << " typedef __SVFloat64_t svfloat64_t;\n " ;
12931316 OS << " typedef __clang_svint8x2_t svint8x2_t;\n " ;
0 commit comments