61#define DEBUG_TYPE "mcasmparser"
66 "mwarn-missing-parenthesis",
67 cl::desc(
"Warn for missing parenthesis around predicate registers"),
70 "merror-missing-parenthesis",
71 cl::desc(
"Error for missing parenthesis around predicate registers"),
74 "mwarn-sign-mismatch",
75 cl::desc(
"Warn for mismatching a signed and unsigned value"),
78 "mwarn-noncontigious-register",
81 "merror-noncontigious-register",
82 cl::desc(
"Error for register names that aren't contigious"),
100 MCAsmParser &getParser()
const {
return Parser; }
101 MCAssembler *getAssembler()
const {
102 MCAssembler *Assembler =
nullptr;
104 if (!Parser.getStreamer().hasRawTextSupport()) {
105 MCELFStreamer *MES =
static_cast<MCELFStreamer *
>(&Parser.getStreamer());
111 AsmLexer &getLexer()
const {
return Parser.getLexer(); }
113 bool equalIsAsmAssignment()
override {
return false; }
114 bool isLabel(AsmToken &Token)
override;
117 void Warning(SMLoc L,
const Twine &Msg) { Parser.Warning(L, Msg); }
118 bool Error(SMLoc L,
const Twine &Msg) {
return Parser.Error(L, Msg); }
119 bool ParseDirectiveFalign(
unsigned Size, SMLoc L);
121 bool parseRegister(MCRegister &
Reg, SMLoc &StartLoc, SMLoc &EndLoc)
override;
122 ParseStatus tryParseRegister(MCRegister &
Reg, SMLoc &StartLoc,
123 SMLoc &EndLoc)
override;
124 bool ParseDirectiveSubsection(SMLoc L);
125 bool ParseDirectiveComm(
bool IsLocal, SMLoc L);
127 bool parseDirectiveAttribute(SMLoc L);
129 bool RegisterMatchesArch(MCRegister MatchNum)
const;
131 bool matchBundleOptions();
132 bool handleNoncontigiousRegister(
bool Contigious, SMLoc &Loc);
133 bool finishBundle(SMLoc IDLoc, MCStreamer &Out);
134 void canonicalizeImmediates(MCInst &MCI);
135 bool matchOneInstruction(MCInst &MCB, SMLoc IDLoc,
137 bool MatchingInlineAsm);
138 void eatToEndOfPacket();
139 bool matchAndEmitInstruction(SMLoc IDLoc,
unsigned &Opcode,
142 bool MatchingInlineAsm)
override;
144 unsigned validateTargetOperandClass(MCParsedAsmOperand &
Op,
145 unsigned Kind)
override;
146 bool OutOfRange(SMLoc IDLoc,
long long Val,
long long Max);
147 int processInstruction(MCInst &Inst,
OperandVector const &Operands,
150 MCRegister matchRegister(StringRef Name);
155#define GET_ASSEMBLER_HEADER
156#include "HexagonGenAsmMatcher.inc"
165 setAvailableFeatures(ComputeAvailableFeatures(getSTI().getFeatureBits()));
174 getTargetStreamer().emitTargetAttributes(*STI);
182 bool parseExpression(MCExpr
const *&Expr);
184 bool parseInstruction(ParseInstructionInfo &Info, StringRef Name,
189 bool parseInstruction(ParseInstructionInfo &Info, StringRef Name, AsmToken
ID,
192 bool ParseDirective(AsmToken DirectiveID)
override;
198 enum KindTy { Token, Immediate, Register } Kind;
201 SMLoc StartLoc, EndLoc;
222 HexagonOperand(KindTy K, MCContext &Context) : Kind(
K), Context(Context) {}
225 HexagonOperand(
const HexagonOperand &o)
226 : MCParsedAsmOperand(), Context(
o.Context) {
228 StartLoc =
o.StartLoc;
244 SMLoc getStartLoc()
const override {
return StartLoc; }
247 SMLoc getEndLoc()
const override {
return EndLoc; }
249 MCRegister
getReg()
const override {
250 assert(Kind == Register &&
"Invalid access!");
254 const MCExpr *
getImm()
const {
255 assert(Kind == Immediate &&
"Invalid access!");
259 bool isToken()
const override {
return Kind == Token; }
260 bool isImm()
const override {
return Kind == Immediate; }
262 bool isReg()
const override {
return Kind == Register; }
264 bool CheckImmRange(
int immBits,
int zeroBits,
bool isSigned,
265 bool isRelocatable,
bool Extendable)
const {
266 if (Kind == Immediate) {
271 if (myMCExpr->evaluateAsAbsolute(Res)) {
272 int bits = immBits + zeroBits;
275 if (Res & ((1 << zeroBits) - 1))
278 if (Res < (1LL << (bits - 1)) && Res >= -(1LL << (bits - 1)))
284 return ((uint64_t)Res < (uint64_t)(1ULL << bits));
286 const int64_t high_bit_set = 1ULL << 63;
287 const uint64_t
mask = (high_bit_set >> (63 - bits));
288 return (((uint64_t)Res &
mask) ==
mask);
300 bool isa30_2Imm()
const {
return CheckImmRange(30, 2,
true,
true,
true); }
301 bool isb30_2Imm()
const {
return CheckImmRange(30, 2,
true,
true,
true); }
302 bool isb15_2Imm()
const {
return CheckImmRange(15, 2,
true,
true,
false); }
303 bool isb13_2Imm()
const {
return CheckImmRange(13, 2,
true,
true,
false); }
305 bool ism32_0Imm()
const {
return true; }
307 bool isf32Imm()
const {
return false; }
308 bool isf64Imm()
const {
return false; }
309 bool iss32_0Imm()
const {
return true; }
310 bool iss31_1Imm()
const {
return true; }
311 bool iss30_2Imm()
const {
return true; }
312 bool iss29_3Imm()
const {
return true; }
313 bool iss27_2Imm()
const {
return CheckImmRange(27, 2,
true,
true,
false); }
314 bool iss10_0Imm()
const {
return CheckImmRange(10, 0,
true,
false,
false); }
315 bool iss10_6Imm()
const {
return CheckImmRange(10, 6,
true,
false,
false); }
316 bool iss9_0Imm()
const {
return CheckImmRange(9, 0,
true,
false,
false); }
317 bool iss8_0Imm()
const {
return CheckImmRange(8, 0,
true,
false,
false); }
318 bool iss8_0Imm64()
const {
return CheckImmRange(8, 0,
true,
true,
false); }
319 bool iss7_0Imm()
const {
return CheckImmRange(7, 0,
true,
false,
false); }
320 bool iss6_0Imm()
const {
return CheckImmRange(6, 0,
true,
false,
false); }
321 bool iss6_3Imm()
const {
return CheckImmRange(6, 3,
true,
false,
false); }
322 bool iss4_0Imm()
const {
return CheckImmRange(4, 0,
true,
false,
false); }
323 bool iss4_1Imm()
const {
return CheckImmRange(4, 1,
true,
false,
false); }
324 bool iss4_2Imm()
const {
return CheckImmRange(4, 2,
true,
false,
false); }
325 bool iss4_3Imm()
const {
return CheckImmRange(4, 3,
true,
false,
false); }
326 bool iss3_0Imm()
const {
return CheckImmRange(3, 0,
true,
false,
false); }
328 bool isu64_0Imm()
const {
return CheckImmRange(64, 0,
false,
true,
true); }
329 bool isu32_0Imm()
const {
return true; }
330 bool isu31_1Imm()
const {
return true; }
331 bool isu30_2Imm()
const {
return true; }
332 bool isu29_3Imm()
const {
return true; }
333 bool isu26_6Imm()
const {
return CheckImmRange(26, 6,
false,
true,
false); }
334 bool isu16_0Imm()
const {
return CheckImmRange(16, 0,
false,
true,
false); }
335 bool isu16_1Imm()
const {
return CheckImmRange(16, 1,
false,
true,
false); }
336 bool isu16_2Imm()
const {
return CheckImmRange(16, 2,
false,
true,
false); }
337 bool isu16_3Imm()
const {
return CheckImmRange(16, 3,
false,
true,
false); }
338 bool isu11_3Imm()
const {
return CheckImmRange(11, 3,
false,
false,
false); }
339 bool isu10_0Imm()
const {
return CheckImmRange(10, 0,
false,
false,
false); }
340 bool isu9_0Imm()
const {
return CheckImmRange(9, 0,
false,
false,
false); }
341 bool isu8_0Imm()
const {
return CheckImmRange(8, 0,
false,
false,
false); }
342 bool isu7_0Imm()
const {
return CheckImmRange(7, 0,
false,
false,
false); }
343 bool isu6_0Imm()
const {
return CheckImmRange(6, 0,
false,
false,
false); }
344 bool isu6_1Imm()
const {
return CheckImmRange(6, 1,
false,
false,
false); }
345 bool isu6_2Imm()
const {
return CheckImmRange(6, 2,
false,
false,
false); }
346 bool isu6_3Imm()
const {
return CheckImmRange(6, 3,
false,
false,
false); }
347 bool isu5_0Imm()
const {
return CheckImmRange(5, 0,
false,
false,
false); }
348 bool isu5_2Imm()
const {
return CheckImmRange(5, 2,
false,
false,
false); }
349 bool isu5_3Imm()
const {
return CheckImmRange(5, 3,
false,
false,
false); }
350 bool isu4_0Imm()
const {
return CheckImmRange(4, 0,
false,
false,
false); }
351 bool isu4_2Imm()
const {
return CheckImmRange(4, 2,
false,
false,
false); }
352 bool isu3_0Imm()
const {
return CheckImmRange(3, 0,
false,
false,
false); }
353 bool isu3_1Imm()
const {
return CheckImmRange(3, 1,
false,
false,
false); }
354 bool isu2_0Imm()
const {
return CheckImmRange(2, 0,
false,
false,
false); }
355 bool isu1_0Imm()
const {
return CheckImmRange(1, 0,
false,
false,
false); }
357 bool isn1Const()
const {
365 bool issgp10Const()
const {
368 return getReg() == Hexagon::SGP1_0;
370 bool iss11_0Imm()
const {
371 return CheckImmRange(11 + 26, 0,
true,
true,
true);
373 bool iss11_1Imm()
const {
374 return CheckImmRange(11 + 26, 1,
true,
true,
true);
376 bool iss11_2Imm()
const {
377 return CheckImmRange(11 + 26, 2,
true,
true,
true);
379 bool iss11_3Imm()
const {
380 return CheckImmRange(11 + 26, 3,
true,
true,
true);
382 bool isu32_0MustExt()
const {
return isImm(); }
384 void addRegOperands(MCInst &Inst,
unsigned N)
const {
385 assert(
N == 1 &&
"Invalid number of operands!");
389 void addImmOperands(MCInst &Inst,
unsigned N)
const {
390 assert(
N == 1 &&
"Invalid number of operands!");
394 void addSignedImmOperands(MCInst &Inst,
unsigned N)
const {
395 assert(
N == 1 &&
"Invalid number of operands!");
396 HexagonMCExpr *Expr =
406 if ((Extended < 0) != (
Value < 0))
413 void addn1ConstOperands(MCInst &Inst,
unsigned N)
const {
414 addImmOperands(Inst,
N);
416 void addsgp10ConstOperands(MCInst &Inst,
unsigned N)
const {
417 addRegOperands(Inst,
N);
421 assert(Kind == Token &&
"Invalid access!");
422 return StringRef(Tok.Data, Tok.Length);
425 void print(raw_ostream &OS,
const MCAsmInfo &MAI)
const override;
427 static std::unique_ptr<HexagonOperand> CreateToken(MCContext &Context,
428 StringRef Str, SMLoc S) {
429 HexagonOperand *
Op =
new HexagonOperand(Token, Context);
430 Op->Tok.Data = Str.data();
431 Op->Tok.Length = Str.size();
434 return std::unique_ptr<HexagonOperand>(
Op);
437 static std::unique_ptr<HexagonOperand>
438 CreateReg(MCContext &Context, MCRegister
Reg, SMLoc S, SMLoc
E) {
439 HexagonOperand *
Op =
new HexagonOperand(Register, Context);
440 Op->Reg.RegNum =
Reg;
443 return std::unique_ptr<HexagonOperand>(
Op);
446 static std::unique_ptr<HexagonOperand>
447 CreateImm(MCContext &Context,
const MCExpr *Val, SMLoc S, SMLoc
E) {
448 HexagonOperand *
Op =
new HexagonOperand(Immediate, Context);
452 return std::unique_ptr<HexagonOperand>(
Op);
473bool HexagonAsmParser::finishBundle(SMLoc IDLoc, MCStreamer &Out) {
481 const MCRegisterInfo *RI =
getContext().getRegisterInfo();
482 MCSubtargetInfo
const &STI = getSTI();
484 MCInst OrigBundle = MCB;
507bool HexagonAsmParser::matchBundleOptions() {
508 MCAsmParser &Parser = getParser();
513 char const *MemNoShuffMsg =
514 "invalid instruction packet: mem_noshuf specifier not "
515 "supported with this architecture";
526 if (getSTI().hasFeature(Hexagon::FeatureMemNoShuf))
529 return getParser().Error(IDLoc, MemNoShuffMsg);
533 return getParser().Error(IDLoc, llvm::Twine(
"'") + Option +
534 "' is not a valid bundle option");
542void HexagonAsmParser::canonicalizeImmediates(MCInst &MCI) {
545 for (MCOperand &
I : MCI)
547 int64_t
Value(
I.getImm());
553 Warning(MCI.getLoc(),
"Signed/Unsigned mismatch");
559bool HexagonAsmParser::matchOneInstruction(MCInst &MCI, SMLoc IDLoc,
562 bool MatchingInlineAsm) {
565 MatchInstructionImpl(InstOperands, MCI, ErrorInfo, MatchingInlineAsm);
566 if (result == Match_Success) {
568 canonicalizeImmediates(MCI);
569 result = processInstruction(MCI, InstOperands, IDLoc);
587 case Match_MissingFeature:
588 return Error(IDLoc,
"invalid instruction");
589 case Match_MnemonicFail:
590 return Error(IDLoc,
"unrecognized instruction");
591 case Match_InvalidOperand:
593 case Match_InvalidTiedOperand:
594 SMLoc ErrorLoc = IDLoc;
595 if (ErrorInfo != ~0U) {
596 if (ErrorInfo >= InstOperands.
size())
597 return Error(IDLoc,
"too few operands for instruction");
599 ErrorLoc = (
static_cast<HexagonOperand *
>(InstOperands[ErrorInfo].get()))
601 if (ErrorLoc == SMLoc())
604 return Error(ErrorLoc,
"invalid operand for instruction");
609void HexagonAsmParser::eatToEndOfPacket() {
611 AsmLexer &Lexer = getLexer();
618bool HexagonAsmParser::matchAndEmitInstruction(SMLoc IDLoc,
unsigned &Opcode,
622 bool MatchingInlineAsm) {
627 HexagonOperand &FirstOperand =
static_cast<HexagonOperand &
>(*Operands[0]);
628 if (FirstOperand.isToken() && FirstOperand.getToken() ==
"{") {
629 assert(Operands.
size() == 1 &&
"Brackets should be by themselves");
631 getParser().Error(IDLoc,
"Already in a packet");
638 if (FirstOperand.isToken() && FirstOperand.getToken() ==
"}") {
639 assert(Operands.
size() == 1 &&
"Brackets should be by themselves");
641 getParser().Error(IDLoc,
"Not in a packet");
645 if (matchBundleOptions())
647 return finishBundle(IDLoc, Out);
649 MCInst *SubInst = getParser().getContext().createMCInst();
650 if (matchOneInstruction(*SubInst, IDLoc, Operands, ErrorInfo,
651 MatchingInlineAsm)) {
657 getParser().
getContext(), MII, MCB, *SubInst);
660 return finishBundle(IDLoc, Out);
666bool HexagonAsmParser::parseDirectiveAttribute(SMLoc L) {
667 MCAsmParser &Parser = getParser();
675 return Error(TagLoc,
"attribute name not recognized: " + Name);
679 const MCExpr *AttrExpr;
686 if (check(!CE, TagLoc,
"expected numeric constant"))
689 Tag =
CE->getValue();
696 int64_t IntegerValue = 0;
698 const MCExpr *ValueExpr;
704 return Error(ValueExprLoc,
"expected numeric constant");
705 IntegerValue =
CE->getValue();
710 getTargetStreamer().emitAttribute(
Tag, IntegerValue);
715bool HexagonAsmParser::ParseDirective(AsmToken DirectiveID) {
717 if (IDVal.
lower() ==
".falign")
718 return ParseDirectiveFalign(256, DirectiveID.
getLoc());
719 if ((IDVal.
lower() ==
".lcomm") || (IDVal.
lower() ==
".lcommon"))
720 return ParseDirectiveComm(
true, DirectiveID.
getLoc());
721 if ((IDVal.
lower() ==
".comm") || (IDVal.
lower() ==
".common"))
722 return ParseDirectiveComm(
false, DirectiveID.
getLoc());
723 if (IDVal.
lower() ==
".subsection")
724 return ParseDirectiveSubsection(DirectiveID.
getLoc());
725 if (IDVal ==
".attribute")
726 return parseDirectiveAttribute(DirectiveID.
getLoc());
730bool HexagonAsmParser::ParseDirectiveSubsection(SMLoc L) {
731 const MCExpr *Subsection =
nullptr;
735 "Invalid subsection directive");
736 getParser().parseExpression(Subsection);
738 if (!Subsection->evaluateAsAbsolute(Res))
739 return Error(L,
"Cannot evaluate subsection number");
742 return TokError(
"unexpected token in directive");
748 if ((Res < 0) && (Res > -8193))
750 getStreamer().switchSection(getStreamer().getCurrentSectionOnly(), Res);
755bool HexagonAsmParser::ParseDirectiveFalign(
unsigned Size, SMLoc L) {
757 int64_t MaxBytesToFill = 15;
765 if (!getParser().parseExpression(
Value)) {
768 uint64_t IntValue = MCE->getValue();
770 return Error(ExprLoc,
"literal value out of range (256) for falign");
771 MaxBytesToFill = IntValue;
774 return Error(ExprLoc,
"not a valid expression for falign directive");
778 getTargetStreamer().emitFAlign(16, MaxBytesToFill);
790bool HexagonAsmParser::ParseDirectiveComm(
bool IsLocal, SMLoc Loc) {
793 if (getStreamer().hasRawTextSupport())
797 if (getParser().parseIdentifier(Name))
798 return TokError(
"expected identifier in directive");
803 return TokError(
"unexpected token in directive");
807 SMLoc SizeLoc = getLexer().getLoc();
808 if (getParser().parseAbsoluteExpression(
Size))
812 SMLoc ByteAlignmentLoc;
815 ByteAlignmentLoc = getLexer().getLoc();
816 if (getParser().parseAbsoluteExpression(ByteAlignment))
819 return Error(ByteAlignmentLoc,
"alignment must be a power of 2");
822 int64_t AccessAlignment = 0;
826 SMLoc AccessAlignmentLoc;
828 AccessAlignmentLoc = getLexer().getLoc();
829 if (getParser().parseAbsoluteExpression(AccessAlignment))
833 return Error(AccessAlignmentLoc,
"access alignment must be a power of 2");
837 return TokError(
"unexpected token in '.comm' or '.lcomm' directive");
844 return Error(SizeLoc,
"invalid '.comm' or '.lcomm' directive size, can't "
845 "be less than zero");
850 if (ByteAlignment < 0)
851 return Error(ByteAlignmentLoc,
"invalid '.comm' or '.lcomm' directive "
852 "alignment, can't be less than zero");
855 return Error(Loc,
"invalid symbol redefinition");
857 HexagonMCELFStreamer &HexagonELFStreamer =
858 static_cast<HexagonMCELFStreamer &
>(getStreamer());
861 Sym,
Size,
Align(ByteAlignment), AccessAlignment);
871bool HexagonAsmParser::RegisterMatchesArch(MCRegister MatchNum)
const {
872 if (HexagonMCRegisterClasses[Hexagon::V62RegsRegClassID].
contains(MatchNum))
873 if (!getSTI().hasFeature(Hexagon::ArchV62))
886#define GET_MATCHER_IMPLEMENTATION
887#define GET_REGISTER_MATCHER
888#include "HexagonGenAsmMatcher.inc"
892 if (Index >= Operands.
size())
897 return static_cast<HexagonOperand &
>(Operand).
getToken().equals_insensitive(
909bool HexagonAsmParser::splitIdentifier(
OperandVector &Operands) {
910 AsmToken
const &Token = getParser().getTok();
912 SMLoc Loc = Token.
getLoc();
915 std::pair<StringRef, StringRef> HeadTail =
String.split(
'.');
916 if (!HeadTail.first.empty())
918 HexagonOperand::CreateToken(
getContext(), HeadTail.first, Loc));
919 if (!HeadTail.second.empty())
920 Operands.
push_back(HexagonOperand::CreateToken(
923 }
while (!
String.empty());
927bool HexagonAsmParser::parseOperand(
OperandVector &Operands) {
931 AsmLexer &Lexer = getLexer();
932 if (!parseRegister(
Register, Begin, End)) {
943 Warning(Begin,
"Missing parenthesis around predicate register");
944 static char const *LParen =
"(";
945 static char const *RParen =
")";
947 HexagonOperand::CreateToken(
getContext(), LParen, Begin));
950 const AsmToken &MaybeDotNew = Lexer.
getTok();
951 if (MaybeDotNew.
is(AsmToken::TokenKind::Identifier) &&
953 splitIdentifier(Operands);
955 HexagonOperand::CreateToken(
getContext(), RParen, Begin));
961 Warning(Begin,
"Missing parenthesis around predicate register");
962 static char const *LParen =
"(";
963 static char const *RParen =
")";
964 Operands.
insert(Operands.
end() - 1, HexagonOperand::CreateToken(
968 const AsmToken &MaybeDotNew = Lexer.
getTok();
969 if (MaybeDotNew.
is(AsmToken::TokenKind::Identifier) &&
971 splitIdentifier(Operands);
973 HexagonOperand::CreateToken(
getContext(), RParen, Begin));
982 return splitIdentifier(Operands);
985bool HexagonAsmParser::isLabel(AsmToken &Token) {
986 AsmLexer &Lexer = getLexer();
987 AsmToken
const &Second = Lexer.
getTok();
988 AsmToken Third = Lexer.
peekTok();
990 if (Token.
is(AsmToken::TokenKind::LCurly) ||
991 Token.
is(AsmToken::TokenKind::RCurly))
997 if (!Token.
is(AsmToken::TokenKind::Identifier))
999 if (!matchRegister(
String.lower()))
1004 std::string Collapsed = std::string(Raw);
1006 StringRef Whole = Collapsed;
1007 std::pair<StringRef, StringRef> DotSplit = Whole.
split(
'.');
1008 if (!matchRegister(DotSplit.first.lower()))
1017bool HexagonAsmParser::handleNoncontigiousRegister(
bool Contigious,
1020 Error(Loc,
"Register name is not contigious");
1024 Warning(Loc,
"Register name is not contigious");
1028bool HexagonAsmParser::parseRegister(MCRegister &
Reg, SMLoc &StartLoc,
1030 return !tryParseRegister(
Reg, StartLoc, EndLoc).isSuccess();
1033ParseStatus HexagonAsmParser::tryParseRegister(MCRegister &
Reg, SMLoc &StartLoc,
1035 AsmLexer &Lexer = getLexer();
1036 StartLoc = getLexer().getLoc();
1040 bool NeededWorkaround =
false;
1042 AsmToken
const &Token = Lexer.
getTok();
1043 RawString = StringRef(RawString.data(), Token.
getString().
data() -
1049 Lookahead.
back().getString().data() +
1050 Lookahead.
back().getString().size();
1056 Again = (Contigious &&
Type) || (Workaround &&
Type);
1057 NeededWorkaround = NeededWorkaround || (Again && !(Contigious &&
Type));
1059 std::string Collapsed = std::string(RawString);
1061 StringRef FullString = Collapsed;
1062 std::pair<StringRef, StringRef> DotSplit = FullString.
split(
'.');
1063 MCRegister DotReg = matchRegister(DotSplit.first.lower());
1064 if (DotReg && RegisterMatchesArch(DotReg)) {
1065 if (DotSplit.second.empty()) {
1068 if (handleNoncontigiousRegister(!NeededWorkaround, StartLoc))
1073 size_t First = RawString.find(
'.');
1074 StringRef DotString (RawString.data() +
First, RawString.size() -
First);
1077 if (handleNoncontigiousRegister(!NeededWorkaround, StartLoc))
1082 std::pair<StringRef, StringRef> ColonSplit = StringRef(FullString).split(
':');
1083 MCRegister ColonReg = matchRegister(ColonSplit.first.lower());
1084 if (ColonReg && RegisterMatchesArch(DotReg)) {
1090 if (handleNoncontigiousRegister(!NeededWorkaround, StartLoc))
1094 while (!Lookahead.
empty()) {
1100bool HexagonAsmParser::implicitExpressionLocation(
OperandVector &Operands) {
1114bool HexagonAsmParser::parseExpression(MCExpr
const *&Expr) {
1116 AsmLexer &Lexer = getLexer();
1118 static char const *
Comma =
",";
1122 switch (Tokens.
back().getKind()) {
1123 case AsmToken::TokenKind::Hash:
1124 if (Tokens.
size() > 1)
1125 if ((Tokens.
end() - 2)->getKind() == AsmToken::TokenKind::Plus) {
1127 AsmToken(AsmToken::TokenKind::Comma, Comma));
1131 case AsmToken::TokenKind::RCurly:
1132 case AsmToken::TokenKind::EndOfStatement:
1133 case AsmToken::TokenKind::Eof:
1140 while (!Tokens.
empty()) {
1144 SMLoc Loc = Lexer.
getLoc();
1145 return getParser().parseExpression(Expr, Loc);
1148bool HexagonAsmParser::parseExpressionOrOperand(
OperandVector &Operands) {
1149 if (implicitExpressionLocation(Operands)) {
1150 MCAsmParser &Parser = getParser();
1152 MCExpr
const *Expr =
nullptr;
1153 bool Error = parseExpression(Expr);
1157 HexagonOperand::CreateImm(
getContext(), Expr, Loc, Loc));
1160 return parseOperand(Operands);
1164bool HexagonAsmParser::parseInstruction(
OperandVector &Operands) {
1165 MCAsmParser &Parser = getParser();
1166 AsmLexer &Lexer = getLexer();
1168 AsmToken
const &Token = Parser.
getTok();
1176 if (!Operands.
empty())
1178 Operands.
push_back(HexagonOperand::CreateToken(
1184 if (Operands.
empty()) {
1185 Operands.
push_back(HexagonOperand::CreateToken(
1201 Operands.
push_back(HexagonOperand::CreateToken(
1203 Operands.
push_back(HexagonOperand::CreateToken(
1209 bool MustNotExtend =
false;
1210 bool ImplicitExpression = implicitExpressionLocation(Operands);
1211 SMLoc ExprLoc = Lexer.
getLoc();
1212 if (!ImplicitExpression)
1213 Operands.
push_back(HexagonOperand::CreateToken(
1216 bool MustExtend =
false;
1217 bool HiOnly =
false;
1218 bool LoOnly =
false;
1222 }
else if (ImplicitExpression)
1223 MustNotExtend =
true;
1224 AsmToken
const &Token = Parser.
getTok();
1227 if (
String.lower() ==
"hi") {
1229 }
else if (
String.lower() ==
"lo") {
1232 if (HiOnly || LoOnly) {
1233 AsmToken LParen = Lexer.
peekTok();
1242 MCExpr
const *Expr =
nullptr;
1243 if (parseExpression(Expr))
1248 if (Expr->evaluateAsAbsolute(
Value)) {
1252 if (HiOnly || LoOnly)
1258 if (!
Value.isAbsolute()) {
1263 MustNotExtend = !MustExtend;
1274 std::unique_ptr<HexagonOperand> Operand =
1275 HexagonOperand::CreateImm(
getContext(), Expr, ExprLoc, ExprLoc);
1282 if (parseExpressionOrOperand(Operands))
1287bool HexagonAsmParser::parseInstruction(ParseInstructionInfo &Info,
1288 StringRef Name, AsmToken
ID,
1290 getLexer().UnLex(
ID);
1291 return parseInstruction(Operands);
1307unsigned HexagonAsmParser::validateTargetOperandClass(MCParsedAsmOperand &AsmOp,
1309 HexagonOperand *
Op =
static_cast<HexagonOperand *
>(&AsmOp);
1314 return Op->isImm() &&
Op->Imm.Val->evaluateAsAbsolute(
Value) &&
Value == 0
1316 : Match_InvalidOperand;
1320 return Op->isImm() &&
Op->Imm.Val->evaluateAsAbsolute(
Value) &&
Value == 1
1322 : Match_InvalidOperand;
1325 if (
Op->Kind == HexagonOperand::Token && Kind != InvalidMatchClass) {
1326 StringRef myStringRef = StringRef(
Op->Tok.Data,
Op->Tok.Length);
1327 if (matchTokenString(myStringRef.
lower()) == (MatchClassKind)Kind)
1328 return Match_Success;
1329 if (matchTokenString(myStringRef.
upper()) == (MatchClassKind)Kind)
1330 return Match_Success;
1337 return Match_InvalidOperand;
1341bool HexagonAsmParser::OutOfRange(SMLoc IDLoc,
long long Val,
long long Max) {
1343 raw_string_ostream ES(errStr);
1344 ES <<
"value " << Val <<
"(" <<
format_hex(Val, 0) <<
") out of range: ";
1348 ES <<
Max <<
"-" << (-
Max - 1);
1352int HexagonAsmParser::processInstruction(MCInst &Inst,
1355 MCContext &
Context = getParser().getContext();
1356 const MCRegisterInfo *RI =
getContext().getRegisterInfo();
1357 const std::string r =
"r";
1358 const std::string Colon =
":";
1359 using RegPairVals = std::pair<unsigned, unsigned>;
1360 auto GetRegPair = [
this, r](RegPairVals RegPair) {
1361 const std::string R1 = r +
utostr(RegPair.first);
1362 const std::string
R2 = r +
utostr(RegPair.second);
1364 return std::make_pair(matchRegister(R1), matchRegister(
R2));
1366 auto GetScalarRegs = [RI, GetRegPair](MCRegister RegPair) {
1368 const RegPairVals RegPair_ = std::make_pair(
Lower + 1,
Lower);
1370 return GetRegPair(RegPair_);
1372 auto GetVecRegs = [GetRegPair](MCRegister VecRegPair) {
1373 const RegPairVals RegPair =
1376 return GetRegPair(RegPair);
1379 bool is32bit =
false;
1383 SMDiagnostic Diag = getSourceManager().GetMessage(
1385 "Found pseudo instruction with no expansion");
1391 case Hexagon::J2_trap1:
1392 if (!getSTI().hasFeature(Hexagon::ArchV65)) {
1395 if (Rx.
getReg() != Hexagon::R0 || Ry.
getReg() != Hexagon::R0) {
1396 Error(IDLoc,
"trap1 can only have register r0 as operand");
1397 return Match_InvalidOperand;
1402 case Hexagon::A2_iconst: {
1414 case Hexagon::M4_mpyrr_addr:
1415 case Hexagon::S4_addi_asl_ri:
1416 case Hexagon::S4_addi_lsr_ri:
1417 case Hexagon::S4_andi_asl_ri:
1418 case Hexagon::S4_andi_lsr_ri:
1419 case Hexagon::S4_ori_asl_ri:
1420 case Hexagon::S4_ori_lsr_ri:
1421 case Hexagon::S4_or_andix:
1422 case Hexagon::S4_subi_asl_ri:
1423 case Hexagon::S4_subi_lsr_ri: {
1427 return Match_InvalidOperand;
1431 case Hexagon::C2_cmpgei: {
1441 case Hexagon::C2_cmpgeui: {
1467 case Hexagon::A2_tfrp: {
1469 const std::pair<MCRegister, MCRegister> RegPair =
1470 GetScalarRegs(MO.
getReg());
1471 MO.
setReg(RegPair.first);
1477 case Hexagon::A2_tfrpt:
1478 case Hexagon::A2_tfrpf: {
1480 const std::pair<MCRegister, MCRegister> RegPair =
1481 GetScalarRegs(MO.
getReg());
1482 MO.
setReg(RegPair.first);
1485 ? Hexagon::C2_ccombinewt
1486 : Hexagon::C2_ccombinewf);
1489 case Hexagon::A2_tfrptnew:
1490 case Hexagon::A2_tfrpfnew: {
1492 const std::pair<MCRegister, MCRegister> RegPair =
1493 GetScalarRegs(MO.
getReg());
1494 MO.
setReg(RegPair.first);
1497 ? Hexagon::C2_ccombinewnewt
1498 : Hexagon::C2_ccombinewnewf);
1503 case Hexagon::V6_vassignp: {
1505 const std::pair<MCRegister, MCRegister> RegPair = GetVecRegs(MO.
getReg());
1506 MO.
setReg(RegPair.first);
1513 case Hexagon::CONST32:
1517 case Hexagon::CONST64:
1520 MCELFStreamer *MES =
static_cast<MCELFStreamer *
>(&Parser.
getStreamer());
1527 std::string myCharStr;
1528 MCSectionELF *mySection;
1538 myCharStr = StringRef(
".gnu.linkonce.l4.CONST_00000000")
1539 .drop_back(myImmStr.size())
1544 myCharStr = StringRef(
".gnu.linkonce.l8.CONST_0000000000000000")
1545 .drop_back(myImmStr.size())
1552 }
else if (MO_1.
isExpr()) {
1554 myCharStr =
".lita";
1561 unsigned byteSize = is32bit ? 4 : 8;
1570 Sym =
getContext().getOrCreateSymbol(StringRef(myCharStr.c_str() + 16));
1572 getStreamer().emitLabel(Sym);
1573 getStreamer().emitSymbolAttribute(Sym,
MCSA_Global);
1576 }
else if (MO_1.
isExpr()) {
1577 const char *StringStart =
nullptr;
1578 const char *StringEnd =
nullptr;
1579 if (*Operands[4]->getStartLoc().
getPointer() ==
'#') {
1580 StringStart = Operands[5]->getStartLoc().getPointer();
1581 StringEnd = Operands[6]->getStartLoc().getPointer();
1583 StringStart = Operands[4]->getStartLoc().getPointer();
1584 StringEnd = Operands[5]->getStartLoc().getPointer();
1587 unsigned size = StringEnd - StringStart;
1588 std::string DotConst =
".CONST_";
1589 Sym =
getContext().getOrCreateSymbol(DotConst +
1590 StringRef(StringStart,
size));
1594 getStreamer().emitLabel(Sym);
1595 getStreamer().emitSymbolAttribute(Sym,
MCSA_Local);
1596 getStreamer().emitValue(MO_1.
getExpr(), 4);
1606 TmpInst.
setOpcode(Hexagon::L2_loadrigp);
1608 TmpInst.
setOpcode(Hexagon::L2_loadrdgp);
1619 case Hexagon::A2_tfrpi: {
1631 case Hexagon::TFRI64_V4: {
1638 OutOfRange(IDLoc, s8, -128);
1656 case Hexagon::TFRI64_V2_ext: {
1663 if (s8 < -128 || s8 > 127)
1664 OutOfRange(IDLoc, s8, -128);
1671 case Hexagon::A4_combineii: {
1677 if (s8 < -128 || s8 > 127)
1678 OutOfRange(IDLoc, s8, -128);
1685 case Hexagon::S2_tableidxb_goodsyntax:
1689 case Hexagon::S2_tableidxh_goodsyntax: {
1699 TmpInst.
setOpcode(Hexagon::S2_tableidxh);
1709 case Hexagon::S2_tableidxw_goodsyntax: {
1719 TmpInst.
setOpcode(Hexagon::S2_tableidxw);
1729 case Hexagon::S2_tableidxd_goodsyntax: {
1739 TmpInst.
setOpcode(Hexagon::S2_tableidxd);
1749 case Hexagon::M2_mpyui:
1752 case Hexagon::M2_mpysmi: {
1758 MCExpr
const &Expr = *
Imm.getExpr();
1761 return Match_InvalidOperand;
1764 return Match_InvalidOperand;
1778 case Hexagon::S2_asr_i_r_rnd_goodsyntax: {
1784 return Match_InvalidOperand;
1796 TmpInst.
setOpcode(Hexagon::S2_asr_i_r_rnd);
1807 case Hexagon::S2_asr_i_p_rnd_goodsyntax: {
1814 return Match_InvalidOperand;
1818 std::string R1 = r +
utostr(RegPairNum + 1);
1820 Rss.
setReg(matchRegister(Reg1));
1822 std::string
R2 = r +
utostr(RegPairNum);
1824 TmpInst.
setOpcode(Hexagon::A2_combinew);
1834 Inst.
setOpcode(Hexagon::S2_asr_i_p_rnd);
1839 case Hexagon::A4_boundscheck: {
1843 Inst.
setOpcode(Hexagon::A4_boundscheck_hi);
1845 StringRef RegPair =
Name;
1846 Rs.
setReg(matchRegister(RegPair));
1848 Inst.
setOpcode(Hexagon::A4_boundscheck_lo);
1850 StringRef RegPair =
Name;
1851 Rs.
setReg(matchRegister(RegPair));
1856 case Hexagon::A2_addsp: {
1862 StringRef RegPair =
Name;
1863 Rs.
setReg(matchRegister(RegPair));
1867 StringRef RegPair =
Name;
1868 Rs.
setReg(matchRegister(RegPair));
1873 case Hexagon::M2_vrcmpys_s1: {
1877 Inst.
setOpcode(Hexagon::M2_vrcmpys_s1_h);
1879 StringRef RegPair =
Name;
1880 Rt.
setReg(matchRegister(RegPair));
1882 Inst.
setOpcode(Hexagon::M2_vrcmpys_s1_l);
1884 StringRef RegPair =
Name;
1885 Rt.
setReg(matchRegister(RegPair));
1890 case Hexagon::M2_vrcmpys_acc_s1: {
1897 TmpInst.
setOpcode(Hexagon::M2_vrcmpys_acc_s1_h);
1899 StringRef RegPair =
Name;
1900 Rt.
setReg(matchRegister(RegPair));
1902 TmpInst.
setOpcode(Hexagon::M2_vrcmpys_acc_s1_l);
1904 StringRef RegPair =
Name;
1905 Rt.
setReg(matchRegister(RegPair));
1916 case Hexagon::M2_vrcmpys_s1rp: {
1920 Inst.
setOpcode(Hexagon::M2_vrcmpys_s1rp_h);
1922 StringRef RegPair =
Name;
1923 Rt.
setReg(matchRegister(RegPair));
1925 Inst.
setOpcode(Hexagon::M2_vrcmpys_s1rp_l);
1927 StringRef RegPair =
Name;
1928 Rt.
setReg(matchRegister(RegPair));
1933 case Hexagon::S5_asrhub_rnd_sat_goodsyntax: {
1938 return Match_InvalidOperand;
1946 Inst.
setOpcode(Hexagon::S5_asrhub_rnd_sat);
1951 case Hexagon::S5_vasrhrnd_goodsyntax: {
1958 return Match_InvalidOperand;
1962 std::string R1 = r +
utostr(RegPairNum + 1);
1964 Rss.
setReg(matchRegister(Reg1));
1966 std::string
R2 = r +
utostr(RegPairNum);
1968 TmpInst.
setOpcode(Hexagon::A2_combinew);
1983 case Hexagon::A2_not: {
1995 case Hexagon::PS_loadrubabs:
1999 case Hexagon::PS_loadrbabs:
2003 case Hexagon::PS_loadruhabs:
2007 case Hexagon::PS_loadrhabs:
2011 case Hexagon::PS_loadriabs:
2015 case Hexagon::PS_loadrdabs:
2019 case Hexagon::PS_storerbabs:
2023 case Hexagon::PS_storerhabs:
2027 case Hexagon::PS_storerfabs:
2031 case Hexagon::PS_storeriabs:
2035 case Hexagon::PS_storerdabs:
2039 case Hexagon::PS_storerbnewabs:
2041 Inst.
setOpcode(Hexagon::S2_storerbnewgp);
2043 case Hexagon::PS_storerhnewabs:
2045 Inst.
setOpcode(Hexagon::S2_storerhnewgp);
2047 case Hexagon::PS_storerinewabs:
2049 Inst.
setOpcode(Hexagon::S2_storerinewgp);
2051 case Hexagon::A2_zxtb: {
2059 return Match_Success;
2062MCRegister HexagonAsmParser::matchRegister(StringRef Name) {
static MCRegister MatchRegisterName(StringRef Name)
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static bool isNot(const MachineRegisterInfo &MRI, const MachineInstr &MI)
static MCRegister MatchRegisterAltName(StringRef Name)
Maps from the set of all alternative registernames to a register number.
static size_t byteSize(BTF::CommonType *Type)
static constexpr unsigned long long mask(BlockVerifier::State S)
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
#define LLVM_EXTERNAL_VISIBILITY
static bool isSigned(unsigned Opcode)
static cl::opt< bool > WarnSignedMismatch("mwarn-sign-mismatch", cl::desc("Warn for mismatching a signed and unsigned value"), cl::init(false))
static cl::opt< bool > ErrorMissingParenthesis("merror-missing-parenthesis", cl::desc("Error for missing parenthesis around predicate registers"), cl::init(false))
LLVM_ABI LLVM_EXTERNAL_VISIBILITY void LLVMInitializeHexagonAsmParser()
Force static initialization.
static cl::opt< bool > WarnNoncontigiousRegister("mwarn-noncontigious-register", cl::desc("Warn for register names that aren't contigious"), cl::init(true))
static cl::opt< bool > ErrorNoncontigiousRegister("merror-noncontigious-register", cl::desc("Error for register names that aren't contigious"), cl::init(false))
static bool previousEqual(OperandVector &Operands, size_t Index, StringRef String)
static MCInst makeCombineInst(int opCode, MCOperand &Rdd, MCOperand &MO1, MCOperand &MO2)
static bool previousIsLoop(OperandVector &Operands, size_t Index)
static cl::opt< bool > WarnMissingParenthesis("mwarn-missing-parenthesis", cl::desc("Warn for missing parenthesis around predicate registers"), cl::init(true))
static cl::opt< bool > AddBuildAttributes("hexagon-add-build-attributes")
Value * getPointer(Value *Ptr)
Promote Memory to Register
static MCRegister getReg(const MCDisassembler *D, unsigned RC, unsigned RegNo)
static bool isReg(const MCInst &MI, unsigned OpNo)
static bool contains(SmallPtrSetImpl< ConstantExpr * > &Cache, ConstantExpr *Expr, Constant *C)
This file defines the SmallVector class.
SMLoc getLoc() const
Get the current source location.
const AsmToken peekTok(bool ShouldSkipSpace=true)
Look ahead at the next token to be lexed.
void UnLex(AsmToken const &Token)
const AsmToken & getTok() const
Get the current (last) lexed token.
bool is(AsmToken::TokenKind K) const
Check if the current token has kind K.
const AsmToken & Lex()
Consume the next token from the input stream and return it.
LLVM_ABI SMLoc getLoc() const
StringRef getString() const
Get the string for the current token, this includes all characters (for example, the quotes on string...
bool is(TokenKind K) const
TokenKind getKind() const
StringRef getIdentifier() const
Get the identifier string for the current token, which should be an identifier or a string.
void HexagonMCEmitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size, Align ByteAlignment, unsigned AccessSize)
void HexagonMCEmitCommonSymbol(MCSymbol *Symbol, uint64_t Size, Align ByteAlignment, unsigned AccessSize)
void setMustNotExtend(bool Val=true)
bool mustNotExtend() const
static HexagonMCExpr * create(MCExpr const *Expr, MCContext &Ctx)
void setMustExtend(bool Val=true)
void setSignMismatch(bool Val=true)
This class is intended to be used as a base class for asm properties and features specific to the tar...
void printExpr(raw_ostream &, const MCExpr &) const
virtual void Initialize(MCAsmParser &Parser)
Initialize the extension for parsing using the given Parser.
Generic assembler parser interface, for use by target specific assembly parsers.
virtual bool parseExpression(const MCExpr *&Res, SMLoc &EndLoc)=0
Parse an arbitrary expression.
const AsmToken & getTok() const
Get the current AsmToken from the stream.
virtual const AsmToken & Lex()=0
Get the next AsmToken in the stream, possibly handling file inclusion first.
virtual void addAliasForDirective(StringRef Directive, StringRef Alias)=0
virtual bool printError(SMLoc L, const Twine &Msg, SMRange Range={})=0
Emit an error at the location L, with the message Msg.
MCStreamer & getStreamer()
static const MCBinaryExpr * createLShr(const MCExpr *LHS, const MCExpr *RHS, MCContext &Ctx)
static const MCBinaryExpr * createAnd(const MCExpr *LHS, const MCExpr *RHS, MCContext &Ctx)
static const MCBinaryExpr * createSub(const MCExpr *LHS, const MCExpr *RHS, MCContext &Ctx)
static LLVM_ABI const MCConstantExpr * create(int64_t Value, MCContext &Ctx, bool PrintInHex=false, unsigned SizeInBytes=0)
LLVM_ABI bool evaluateAsRelocatable(MCValue &Res, const MCAssembler *Asm) const
Try to evaluate the expression to a relocatable value, i.e.
@ Unary
Unary expressions.
@ SymbolRef
References to labels and assigned expressions.
@ Binary
Binary expressions.
LLVM_ABI bool evaluateAsAbsolute(int64_t &Res) const
Try to evaluate the expression to an absolute value.
Instances of this class represent a single low-level machine instruction.
unsigned getOpcode() const
LLVM_ABI void dump_pretty(raw_ostream &OS, const MCInstPrinter *Printer=nullptr, StringRef Separator=" ", const MCContext *Ctx=nullptr) const
Dump the MCInst as prettily as possible using the additional MC structures, if given.
void addOperand(const MCOperand Op)
void setOpcode(unsigned Op)
const MCOperand & getOperand(unsigned i) const
Interface to description of machine instruction set.
MCAssembler & getAssembler()
Instances of this class represent operands of the MCInst class.
static MCOperand createExpr(const MCExpr *Val)
void setExpr(const MCExpr *Val)
static MCOperand createReg(MCRegister Reg)
static MCOperand createImm(int64_t Val)
void setReg(MCRegister Reg)
Set the register number.
MCRegister getReg() const
Returns the register number.
const MCExpr * getExpr() const
static MCOperand createInst(const MCInst *Val)
MCParsedAsmOperand - This abstract class represents a source-level assembly instruction operand.
virtual bool isToken() const =0
isToken - Is this a token operand?
uint16_t getEncodingValue(MCRegister Reg) const
Returns the encoding for Reg.
constexpr unsigned id() const
virtual bool popSection()
Restore the current and previous section from the section stack.
virtual void emitInstruction(const MCInst &Inst, const MCSubtargetInfo &STI)
Emit the given Instruction into the current section.
virtual bool hasRawTextSupport() const
Return true if this asm streamer supports emitting unformatted text to the .s file with EmitRawText.
MCTargetStreamer * getTargetStreamer()
void pushSection()
Save the current and previous section on the section stack.
virtual void switchSection(MCSection *Section, uint32_t Subsec=0)
Set the current section where code is being emitted to Section.
Generic base class for all target subtargets.
static const MCSymbolRefExpr * create(const MCSymbol *Symbol, MCContext &Ctx, SMLoc Loc=SMLoc())
bool isUndefined() const
isUndefined - Check if this symbol undefined (i.e., implicitly defined).
MCTargetAsmParser - Generic interface to target specific assembly parsers.
Target specific streamer interface.
MCStreamer & getStreamer()
static constexpr StatusTy Success
static constexpr StatusTy NoMatch
LLVM_ABI void print(const char *ProgName, raw_ostream &S, bool ShowColors=true, bool ShowKindLabel=true, bool ShowLocation=true) const
reference emplace_back(ArgTypes &&... Args)
iterator insert(iterator I, T &&Elt)
void push_back(const T &Elt)
StringRef - Represent a constant reference to a string, i.e.
std::pair< StringRef, StringRef > split(char Separator) const
Split into two substrings around the first occurrence of a separator character.
constexpr StringRef substr(size_t Start, size_t N=npos) const
Return a reference to the substring from [Start, Start + N).
LLVM_ABI std::string upper() const
Convert the given ASCII string to uppercase.
constexpr size_t size() const
size - Get the string size.
constexpr const char * data() const
data - Get a pointer to the start of the string (which may not be null terminated).
LLVM_ABI std::string lower() const
bool equals_insensitive(StringRef RHS) const
Check for string equality, ignoring case.
LLVM_ABI int compare_insensitive(StringRef RHS) const
Compare two strings, ignoring case.
This class implements an extremely fast bulk output stream that can only output to a stream.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
LLVM_ABI std::optional< unsigned > attrTypeFromString(StringRef tag, TagNameMap tagNameMap)
LLVM_ABI const TagNameMap & getHexagonAttributeTags()
std::pair< unsigned, unsigned > GetVecRegPairIndices(MCRegister VecRegPair)
Returns an ordered pair of the constituent register ordinals for each of the elements of VecRegPair.
void setOuterLoop(MCInst &MCI)
bool isOuterLoop(MCInst const &MCI)
size_t bundleSize(MCInst const &MCI)
void setS27_2_reloc(MCExpr const &Expr, bool Val=true)
void setInnerLoop(MCInst &MCI)
MCInstrDesc const & getDesc(MCInstrInfo const &MCII, MCInst const &MCI)
void setMemReorderDisabled(MCInst &MCI)
bool isBundle(MCInst const &MCI)
MCExpr const & getExpr(MCExpr const &Expr)
bool isInnerLoop(MCInst const &MCI)
bool canonicalizePacket(MCInstrInfo const &MCII, MCSubtargetInfo const &STI, MCContext &Context, MCInst &MCB, HexagonMCChecker *Checker, bool AttemptCompatibility=false)
void setMustNotExtend(MCExpr const &Expr, bool Val=true)
void extendIfNeeded(MCContext &Context, MCInstrInfo const &MCII, MCInst &MCB, MCInst const &MCI)
bool mustExtend(MCExpr const &Expr)
void setMustExtend(MCExpr const &Expr, bool Val=true)
@ CE
Windows NT (Windows on ARM)
bool isPseudo(uint64_t TSFlags)
initializer< Ty > init(const Ty &Val)
Context & getContext() const
This is an optimization pass for GlobalISel generic memory operations.
FunctionAddr VTableAddr Value
Printable print(const GCNRegPressure &RP, const GCNSubtarget *ST=nullptr, unsigned DynamicVGPRBlockSize=0)
auto size(R &&Range, std::enable_if_t< std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits< decltype(Range.begin())>::iterator_category >::value, void > *=nullptr)
Get the size of a range.
constexpr bool isInt(int64_t x)
Checks if an integer fits into the given bit width.
static bool isMem(const MachineInstr &MI, unsigned Op)
LLVM_ABI std::pair< StringRef, StringRef > getToken(StringRef Source, StringRef Delimiters=" \t\n\v\f\r")
getToken - This function extracts one token from source, ignoring any leading characters that appear ...
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
constexpr bool isUIntN(unsigned N, uint64_t x)
Checks if an unsigned integer fits into the given (dynamic) bit width.
std::string utohexstr(uint64_t X, bool LowerCase=false, unsigned Width=0)
std::string utostr(uint64_t X, bool isNeg=false)
constexpr bool isPowerOf2_64(uint64_t Value)
Return true if the argument is a power of two > 0 (64 bit edition.)
Target & getTheHexagonTarget()
SmallVectorImpl< std::unique_ptr< MCParsedAsmOperand > > OperandVector
MachineInstr * getImm(const MachineOperand &MO, const MachineRegisterInfo *MRI)
constexpr uint32_t Hi_32(uint64_t Value)
Return the high 32 bits of a 64 bit value.
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
constexpr uint32_t Lo_32(uint64_t Value)
Return the low 32 bits of a 64 bit value.
FormattedNumber format_hex(uint64_t N, unsigned Width, bool Upper=false)
format_hex - Output N as a fixed width hexadecimal.
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
DWARFExpression::Operation Op
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
void erase_if(Container &C, UnaryPredicate P)
Provide a container algorithm similar to C++ Library Fundamentals v2's erase_if which is equivalent t...
constexpr bool isIntN(unsigned N, int64_t x)
Checks if an signed integer fits into the given (dynamic) bit width.
bool isSpace(char C)
Checks whether character C is whitespace in the "C" locale.
constexpr int64_t SignExtend64(uint64_t x)
Sign-extend the number in the bottom B bits of X to a 64-bit integer.
@ MCSA_Global
.type _foo, @gnu_unique_object
RegisterMCAsmParser - Helper template for registering a target specific assembly parser,...