diff --git a/llvm/include/llvm/MC/MCAsmInfo.h b/llvm/include/llvm/MC/MCAsmInfo.h --- a/llvm/include/llvm/MC/MCAsmInfo.h +++ b/llvm/include/llvm/MC/MCAsmInfo.h @@ -445,6 +445,9 @@ // %hi(), and similar unary operators. bool HasMipsExpressions = false; + // If true, use Motorola-style integers in Assembly (ex. $0ac). + bool UseMotorolaIntegers = false; + // If true, emit function descriptor symbol on AIX. bool NeedsFunctionDescriptors = false; @@ -733,6 +736,7 @@ void setRelaxELFRelocations(bool V) { RelaxELFRelocations = V; } bool hasMipsExpressions() const { return HasMipsExpressions; } bool needsFunctionDescriptors() const { return NeedsFunctionDescriptors; } + bool shouldUseMotorolaIntegers() const { return UseMotorolaIntegers; } }; } // end namespace llvm diff --git a/llvm/lib/MC/MCParser/AsmLexer.cpp b/llvm/lib/MC/MCParser/AsmLexer.cpp --- a/llvm/lib/MC/MCParser/AsmLexer.cpp +++ b/llvm/lib/MC/MCParser/AsmLexer.cpp @@ -421,6 +421,32 @@ return intToken(Result, Value); } + // Motorola hex integers: $[0-0a-fA-F]+ + if (MAI.shouldUseMotorolaIntegers() && CurPtr[-1] == '$') { + const char *NumStart = CurPtr; + while (isHexDigit(CurPtr[0])) + ++CurPtr; + + APInt Result(128, 0); + if (StringRef(NumStart, CurPtr - NumStart).getAsInteger(16, Result)) + return ReturnError(TokStart, "invalid hexadecimal number"); + + return intToken(StringRef(TokStart, CurPtr - TokStart), Result); + } + + // Motorola binary integers: %[01]+ + if (MAI.shouldUseMotorolaIntegers() && CurPtr[-1] == '%') { + const char *NumStart = CurPtr; + while (*CurPtr == '0' || *CurPtr == '1') + ++CurPtr; + + APInt Result(128, 0); + if (StringRef(NumStart, CurPtr - NumStart).getAsInteger(2, Result)) + return ReturnError(TokStart, "invalid binary number"); + + return intToken(StringRef(TokStart, CurPtr - TokStart), Result); + } + // Decimal integer: [1-9][0-9]* if (CurPtr[-1] != '0' || CurPtr[0] == '.') { unsigned Radix = doHexLookAhead(CurPtr, 10, LexMasmIntegers); @@ -775,7 +801,13 @@ case '}': return AsmToken(AsmToken::RCurly, StringRef(TokStart, 1)); case '*': return AsmToken(AsmToken::Star, StringRef(TokStart, 1)); case ',': return AsmToken(AsmToken::Comma, StringRef(TokStart, 1)); - case '$': return AsmToken(AsmToken::Dollar, StringRef(TokStart, 1)); + case '$': + if (MAI.shouldUseMotorolaIntegers() && isDigit(CurPtr[1])) { + ++CurPtr; + return LexDigit(); + } + + return AsmToken(AsmToken::Dollar, StringRef(TokStart, 1)); case '@': return AsmToken(AsmToken::At, StringRef(TokStart, 1)); case '\\': return AsmToken(AsmToken::BackSlash, StringRef(TokStart, 1)); case '=': @@ -810,6 +842,11 @@ } return AsmToken(AsmToken::Exclaim, StringRef(TokStart, 1)); case '%': + if (MAI.shouldUseMotorolaIntegers() && (CurPtr[1] == '0' || CurPtr[1] == '1')) { + ++CurPtr; + return LexDigit(); + } + if (MAI.hasMipsExpressions()) { AsmToken::TokenKind Operator; unsigned OperatorLength;