1616#include " llvm/ADT/APSInt.h"
1717#include " llvm/ADT/ArrayRef.h"
1818#include " llvm/ADT/DenseMap.h"
19+ #include " llvm/ADT/SmallSet.h"
1920#include " llvm/ADT/SmallVector.h"
2021#include " llvm/ADT/StringMap.h"
2122#include " llvm/ADT/StringRef.h"
@@ -1923,13 +1924,19 @@ static bool verifyAddrSpace(uint64_t AddrSpace) {
19231924}
19241925
19251926bool MIParser::parseLowLevelType (StringRef::iterator Loc, LLT &Ty) {
1926- if (Token.range ().front () == ' s' || Token.range ().front () == ' p' ) {
1927+ if (Token.range ().front () == ' s' || Token.range ().front () == ' i ' || Token. range (). front () == ' f ' || Token. range (). front () == ' p' ) {
19271928 StringRef SizeStr = Token.range ().drop_front ();
19281929 if (SizeStr.size () == 0 || !llvm::all_of (SizeStr, isdigit))
1929- return error (" expected integers after 's'/'p' type character" );
1930+ return error (" expected integers after 's'/'i'/'f'/'p' type character" );
1931+ }
1932+
1933+ if (Token.range ().substr (0 ,2 ) == " bf" ) {
1934+ StringRef SizeStr = Token.range ().drop_front (2 );
1935+ if (SizeStr.size () == 0 || !llvm::all_of (SizeStr, isdigit))
1936+ return error (" expected integers after 'bf' type string" );
19301937 }
19311938
1932- if (Token.range ().front () == ' s' ) {
1939+ if (Token.range ().front () == ' s' || Token. range (). front () == ' i ' ) {
19331940 auto ScalarSize = APSInt (Token.range ().drop_front ()).getZExtValue ();
19341941 if (ScalarSize) {
19351942 if (!verifyScalarSize (ScalarSize))
@@ -1949,6 +1956,20 @@ bool MIParser::parseLowLevelType(StringRef::iterator Loc, LLT &Ty) {
19491956 Ty = LLT::pointer (AS, DL.getPointerSizeInBits (AS));
19501957 lex ();
19511958 return false ;
1959+ } else if (Token.range ().front () == ' f' ) {
1960+ auto ScalarSize = APSInt (Token.range ().drop_front ()).getZExtValue ();
1961+ if (!ScalarSize || !verifyScalarSize (ScalarSize))
1962+ return error (" invalid size for scalar type" );
1963+ Ty = LLT::floatingPoint (ScalarSize, LLT::FPInfo::IEEE_FLOAT);
1964+ lex ();
1965+ return false ;
1966+ } else if (Token.range ().substr (0 , 2 ) == " bf" ) {
1967+ auto ScalarSize = APSInt (Token.range ().drop_front (2 )).getZExtValue ();
1968+ if (!ScalarSize || !verifyScalarSize (ScalarSize))
1969+ return error (" invalid size for scalar type" );
1970+ Ty = LLT::floatingPoint (ScalarSize, LLT::FPInfo::VARIANT_FLOAT_1);
1971+ lex ();
1972+ return false ;
19521973 }
19531974
19541975 // Now we're looking for a vector.
@@ -1985,14 +2006,16 @@ bool MIParser::parseLowLevelType(StringRef::iterator Loc, LLT &Ty) {
19852006 return GetError ();
19862007 lex ();
19872008
1988- if (Token.range ().front () != ' s' && Token.range ().front () != ' p' )
2009+ if (Token.range ().front () != ' s' && Token.range ().front () != ' i' &&
2010+ Token.range ().front () != ' f' && Token.range ().front () != ' p' &&
2011+ Token.range ().substr (0 , 2 ) != " bf" )
19892012 return GetError ();
19902013
19912014 StringRef SizeStr = Token.range ().drop_front ();
19922015 if (SizeStr.size () == 0 || !llvm::all_of (SizeStr, isdigit))
1993- return error (" expected integers after 's'/'p' type character" );
2016+ return error (" expected integers after 's'/'i'/'f'/' p' type character" );
19942017
1995- if (Token.range ().front () == ' s' ) {
2018+ if (Token.range ().front () == ' s' || Token. range (). front () == ' i ' ) {
19962019 auto ScalarSize = APSInt (Token.range ().drop_front ()).getZExtValue ();
19972020 if (!verifyScalarSize (ScalarSize))
19982021 return error (" invalid size for scalar element in vector" );
@@ -2004,6 +2027,16 @@ bool MIParser::parseLowLevelType(StringRef::iterator Loc, LLT &Ty) {
20042027 return error (" invalid address space number" );
20052028
20062029 Ty = LLT::pointer (AS, DL.getPointerSizeInBits (AS));
2030+ } else if (Token.range ().front () == ' f' ) {
2031+ auto ScalarSize = APSInt (Token.range ().drop_front ()).getZExtValue ();
2032+ if (!verifyScalarSize (ScalarSize))
2033+ return error (" invalid size for float element in vector" );
2034+ Ty = LLT::floatingPoint (ScalarSize, LLT::FPInfo::IEEE_FLOAT);
2035+ } else if (Token.range ().substr (0 , 2 ) == " bf" ) {
2036+ auto ScalarSize = APSInt (Token.range ().drop_front ()).getZExtValue ();
2037+ if (!verifyScalarSize (ScalarSize))
2038+ return error (" invalid size for bfloat element in vector" );
2039+ Ty = LLT::floatingPoint (ScalarSize, LLT::FPInfo::VARIANT_FLOAT_1);
20072040 } else
20082041 return GetError ();
20092042 lex ();
@@ -2021,12 +2054,12 @@ bool MIParser::parseTypedImmediateOperand(MachineOperand &Dest) {
20212054 assert (Token.is (MIToken::Identifier));
20222055 StringRef TypeStr = Token.range ();
20232056 if (TypeStr.front () != ' i' && TypeStr.front () != ' s' &&
2024- TypeStr.front () != ' p' )
2057+ TypeStr.front () != ' p' && TypeStr. front () != ' f ' && TypeStr. substr ( 0 , 2 ) != " bf " )
20252058 return error (
2026- " a typed immediate operand should start with one of 'i', 's', or 'p'" );
2059+ " a typed immediate operand should start with one of 'i', 's','f','bf', or 'p'" );
20272060 StringRef SizeStr = Token.range ().drop_front ();
20282061 if (SizeStr.size () == 0 || !llvm::all_of (SizeStr, isdigit))
2029- return error (" expected integers after 'i'/'s'/'p' type character" );
2062+ return error (" expected integers after 'i'/'s'/'f'/'bf'/' p' type character" );
20302063
20312064 auto Loc = Token.location ();
20322065 lex ();
0 commit comments