@@ -1395,7 +1395,7 @@ class AMDGPUAsmParser : public MCTargetAsmParser {
13951395 MCRegister ParseRegList (RegisterKind &RegKind, unsigned &RegNum,
13961396 unsigned &RegWidth,
13971397 SmallVectorImpl<AsmToken> &Tokens);
1398- bool ParseRegRange (unsigned & Num, unsigned & Width);
1398+ bool ParseRegRange (unsigned & Num, unsigned & Width, unsigned &SubReg );
13991399 MCRegister getRegularReg (RegisterKind RegKind, unsigned RegNum,
14001400 unsigned SubReg, unsigned RegWidth, SMLoc Loc);
14011401
@@ -2857,7 +2857,8 @@ MCRegister AMDGPUAsmParser::getRegularReg(RegisterKind RegKind, unsigned RegNum,
28572857 return Reg;
28582858}
28592859
2860- bool AMDGPUAsmParser::ParseRegRange (unsigned &Num, unsigned &RegWidth) {
2860+ bool AMDGPUAsmParser::ParseRegRange (unsigned &Num, unsigned &RegWidth,
2861+ unsigned &SubReg) {
28612862 int64_t RegLo, RegHi;
28622863 if (!skipToken (AsmToken::LBrac, " missing register index" ))
28632864 return false ;
@@ -2894,8 +2895,20 @@ bool AMDGPUAsmParser::ParseRegRange(unsigned &Num, unsigned &RegWidth) {
28942895 return false ;
28952896 }
28962897
2898+ if (RegHi == RegLo) {
2899+ StringRef RegSuffix = getTokenStr ();
2900+ if (RegSuffix == " .l" ) {
2901+ SubReg = AMDGPU::lo16;
2902+ lex ();
2903+ } else if (RegSuffix == " .h" ) {
2904+ SubReg = AMDGPU::hi16;
2905+ lex ();
2906+ }
2907+ }
2908+
28972909 Num = static_cast <unsigned >(RegLo);
28982910 RegWidth = 32 * ((RegHi - RegLo) + 1 );
2911+
28992912 return true ;
29002913}
29012914
@@ -2949,7 +2962,7 @@ MCRegister AMDGPUAsmParser::ParseRegularReg(RegisterKind &RegKind,
29492962 RegWidth = 32 ;
29502963 } else {
29512964 // Range of registers: v[XX:YY]. ":YY" is optional.
2952- if (!ParseRegRange (RegNum, RegWidth))
2965+ if (!ParseRegRange (RegNum, RegWidth, SubReg ))
29532966 return MCRegister ();
29542967 }
29552968
0 commit comments