59#define DEBUG_TYPE "mcasmparser"
64 "mwarn-missing-parenthesis",
65 cl::desc(
"Warn for missing parenthesis around predicate registers"),
68 "merror-missing-parenthesis",
69 cl::desc(
"Error for missing parenthesis around predicate registers"),
72 "mwarn-sign-mismatch",
73 cl::desc(
"Warn for mismatching a signed and unsigned value"),
76 "mwarn-noncontigious-register",
79 "merror-noncontigious-register",
80 cl::desc(
"Error for register names that aren't contigious"),
116 bool ParseDirectiveFalign(
unsigned Size,
SMLoc L);
120 SMLoc &EndLoc)
override;
121 bool ParseDirectiveSubsection(
SMLoc L);
122 bool ParseDirectiveComm(
bool IsLocal,
SMLoc L);
124 bool parseDirectiveAttribute(
SMLoc L);
126 bool RegisterMatchesArch(
MCRegister MatchNum)
const;
128 bool matchBundleOptions();
129 bool handleNoncontigiousRegister(
bool Contigious,
SMLoc &Loc);
131 void canonicalizeImmediates(
MCInst &MCI);
134 bool MatchingInlineAsm);
135 void eatToEndOfPacket();
139 bool MatchingInlineAsm)
override;
142 unsigned Kind)
override;
143 bool OutOfRange(
SMLoc IDLoc,
long long Val,
long long Max);
152#define GET_ASSEMBLER_HEADER
153#include "HexagonGenAsmMatcher.inc"
172 getTargetStreamer().emitTargetAttributes(*STI);
180 bool parseExpression(
MCExpr const *&Expr);
199 SMLoc StartLoc, EndLoc;
220 HexagonOperand(KindTy K,
MCContext &Context) :
Kind(
K), Context(Context) {}
223 HexagonOperand(
const HexagonOperand &o)
226 StartLoc =
o.StartLoc;
242 SMLoc getStartLoc()
const override {
return StartLoc; }
245 SMLoc getEndLoc()
const override {
return EndLoc; }
252 const MCExpr *getImm()
const {
253 assert(Kind == Immediate &&
"Invalid access!");
257 bool isToken()
const override {
return Kind == Token; }
258 bool isImm()
const override {
return Kind == Immediate; }
262 bool CheckImmRange(
int immBits,
int zeroBits,
bool isSigned,
263 bool isRelocatable,
bool Extendable)
const {
264 if (Kind == Immediate) {
269 if (myMCExpr->evaluateAsAbsolute(Res)) {
270 int bits = immBits + zeroBits;
273 if (Res & ((1 << zeroBits) - 1))
276 if (Res < (1LL << (bits - 1)) && Res >= -(1LL << (bits - 1)))
284 const int64_t high_bit_set = 1ULL << 63;
298 bool isa30_2Imm()
const {
return CheckImmRange(30, 2,
true,
true,
true); }
299 bool isb30_2Imm()
const {
return CheckImmRange(30, 2,
true,
true,
true); }
300 bool isb15_2Imm()
const {
return CheckImmRange(15, 2,
true,
true,
false); }
301 bool isb13_2Imm()
const {
return CheckImmRange(13, 2,
true,
true,
false); }
303 bool ism32_0Imm()
const {
return true; }
305 bool isf32Imm()
const {
return false; }
306 bool isf64Imm()
const {
return false; }
307 bool iss32_0Imm()
const {
return true; }
308 bool iss31_1Imm()
const {
return true; }
309 bool iss30_2Imm()
const {
return true; }
310 bool iss29_3Imm()
const {
return true; }
311 bool iss27_2Imm()
const {
return CheckImmRange(27, 2,
true,
true,
false); }
312 bool iss10_0Imm()
const {
return CheckImmRange(10, 0,
true,
false,
false); }
313 bool iss10_6Imm()
const {
return CheckImmRange(10, 6,
true,
false,
false); }
314 bool iss9_0Imm()
const {
return CheckImmRange(9, 0,
true,
false,
false); }
315 bool iss8_0Imm()
const {
return CheckImmRange(8, 0,
true,
false,
false); }
316 bool iss8_0Imm64()
const {
return CheckImmRange(8, 0,
true,
true,
false); }
317 bool iss7_0Imm()
const {
return CheckImmRange(7, 0,
true,
false,
false); }
318 bool iss6_0Imm()
const {
return CheckImmRange(6, 0,
true,
false,
false); }
319 bool iss6_3Imm()
const {
return CheckImmRange(6, 3,
true,
false,
false); }
320 bool iss4_0Imm()
const {
return CheckImmRange(4, 0,
true,
false,
false); }
321 bool iss4_1Imm()
const {
return CheckImmRange(4, 1,
true,
false,
false); }
322 bool iss4_2Imm()
const {
return CheckImmRange(4, 2,
true,
false,
false); }
323 bool iss4_3Imm()
const {
return CheckImmRange(4, 3,
true,
false,
false); }
324 bool iss3_0Imm()
const {
return CheckImmRange(3, 0,
true,
false,
false); }
326 bool isu64_0Imm()
const {
return CheckImmRange(64, 0,
false,
true,
true); }
327 bool isu32_0Imm()
const {
return true; }
328 bool isu31_1Imm()
const {
return true; }
329 bool isu30_2Imm()
const {
return true; }
330 bool isu29_3Imm()
const {
return true; }
331 bool isu26_6Imm()
const {
return CheckImmRange(26, 6,
false,
true,
false); }
332 bool isu16_0Imm()
const {
return CheckImmRange(16, 0,
false,
true,
false); }
333 bool isu16_1Imm()
const {
return CheckImmRange(16, 1,
false,
true,
false); }
334 bool isu16_2Imm()
const {
return CheckImmRange(16, 2,
false,
true,
false); }
335 bool isu16_3Imm()
const {
return CheckImmRange(16, 3,
false,
true,
false); }
336 bool isu11_3Imm()
const {
return CheckImmRange(11, 3,
false,
false,
false); }
337 bool isu10_0Imm()
const {
return CheckImmRange(10, 0,
false,
false,
false); }
338 bool isu9_0Imm()
const {
return CheckImmRange(9, 0,
false,
false,
false); }
339 bool isu8_0Imm()
const {
return CheckImmRange(8, 0,
false,
false,
false); }
340 bool isu7_0Imm()
const {
return CheckImmRange(7, 0,
false,
false,
false); }
341 bool isu6_0Imm()
const {
return CheckImmRange(6, 0,
false,
false,
false); }
342 bool isu6_1Imm()
const {
return CheckImmRange(6, 1,
false,
false,
false); }
343 bool isu6_2Imm()
const {
return CheckImmRange(6, 2,
false,
false,
false); }
344 bool isu6_3Imm()
const {
return CheckImmRange(6, 3,
false,
false,
false); }
345 bool isu5_0Imm()
const {
return CheckImmRange(5, 0,
false,
false,
false); }
346 bool isu5_2Imm()
const {
return CheckImmRange(5, 2,
false,
false,
false); }
347 bool isu5_3Imm()
const {
return CheckImmRange(5, 3,
false,
false,
false); }
348 bool isu4_0Imm()
const {
return CheckImmRange(4, 0,
false,
false,
false); }
349 bool isu4_2Imm()
const {
return CheckImmRange(4, 2,
false,
false,
false); }
350 bool isu3_0Imm()
const {
return CheckImmRange(3, 0,
false,
false,
false); }
351 bool isu3_1Imm()
const {
return CheckImmRange(3, 1,
false,
false,
false); }
352 bool isu2_0Imm()
const {
return CheckImmRange(2, 0,
false,
false,
false); }
353 bool isu1_0Imm()
const {
return CheckImmRange(1, 0,
false,
false,
false); }
355 bool isn1Const()
const {
359 if (!getImm()->evaluateAsAbsolute(
Value))
363 bool issgp10Const()
const {
366 return getReg() == Hexagon::SGP1_0;
368 bool iss11_0Imm()
const {
369 return CheckImmRange(11 + 26, 0,
true,
true,
true);
371 bool iss11_1Imm()
const {
372 return CheckImmRange(11 + 26, 1,
true,
true,
true);
374 bool iss11_2Imm()
const {
375 return CheckImmRange(11 + 26, 2,
true,
true,
true);
377 bool iss11_3Imm()
const {
378 return CheckImmRange(11 + 26, 3,
true,
true,
true);
380 bool isu32_0MustExt()
const {
return isImm(); }
382 void addRegOperands(
MCInst &Inst,
unsigned N)
const {
383 assert(
N == 1 &&
"Invalid number of operands!");
387 void addImmOperands(
MCInst &Inst,
unsigned N)
const {
388 assert(
N == 1 &&
"Invalid number of operands!");
392 void addSignedImmOperands(
MCInst &Inst,
unsigned N)
const {
393 assert(
N == 1 &&
"Invalid number of operands!");
404 if ((Extended < 0) != (
Value < 0))
411 void addn1ConstOperands(
MCInst &Inst,
unsigned N)
const {
412 addImmOperands(Inst,
N);
414 void addsgp10ConstOperands(
MCInst &Inst,
unsigned N)
const {
415 addRegOperands(Inst,
N);
419 assert(Kind == Token &&
"Invalid access!");
425 static std::unique_ptr<HexagonOperand> CreateToken(
MCContext &Context,
427 HexagonOperand *
Op =
new HexagonOperand(Token, Context);
428 Op->Tok.Data = Str.data();
429 Op->Tok.Length = Str.size();
432 return std::unique_ptr<HexagonOperand>(
Op);
435 static std::unique_ptr<HexagonOperand>
437 HexagonOperand *
Op =
new HexagonOperand(
Register, Context);
438 Op->Reg.RegNum =
Reg;
441 return std::unique_ptr<HexagonOperand>(
Op);
444 static std::unique_ptr<HexagonOperand>
446 HexagonOperand *
Op =
new HexagonOperand(Immediate, Context);
450 return std::unique_ptr<HexagonOperand>(
Op);
459 getImm()->print(
OS,
nullptr);
466 OS <<
"'" << getToken() <<
"'";
486 MII, STI, getContext(), MCB, &
Check,
true);
505bool HexagonAsmParser::matchBundleOptions() {
511 char const *MemNoShuffMsg =
512 "invalid instruction packet: mem_noshuf specifier not "
513 "supported with this architecture";
516 if (
Option.compare_insensitive(
"endloop01") == 0) {
519 }
else if (
Option.compare_insensitive(
"endloop0") == 0) {
521 }
else if (
Option.compare_insensitive(
"endloop1") == 0) {
523 }
else if (
Option.compare_insensitive(
"mem_noshuf") == 0) {
524 if (getSTI().hasFeature(Hexagon::FeatureMemNoShuf))
527 return getParser().Error(IDLoc, MemNoShuffMsg);
528 }
else if (
Option.compare_insensitive(
"mem_no_order") == 0) {
531 return getParser().Error(IDLoc,
llvm::Twine(
"'") + Option +
532 "' is not a valid bundle option");
540void HexagonAsmParser::canonicalizeImmediates(
MCInst &MCI) {
545 int64_t
Value(
I.getImm());
549 if (
I.isExpr() && cast<HexagonMCExpr>(
I.getExpr())->signMismatch() &&
551 Warning(MCI.getLoc(),
"Signed/Unsigned mismatch");
557bool HexagonAsmParser::matchOneInstruction(
MCInst &MCI,
SMLoc IDLoc,
560 bool MatchingInlineAsm) {
563 MatchInstructionImpl(InstOperands, MCI,
ErrorInfo, MatchingInlineAsm);
564 if (result == Match_Success) {
566 canonicalizeImmediates(MCI);
567 result = processInstruction(MCI, InstOperands, IDLoc);
585 case Match_MissingFeature:
586 return Error(IDLoc,
"invalid instruction");
587 case Match_MnemonicFail:
588 return Error(IDLoc,
"unrecognized instruction");
589 case Match_InvalidOperand:
591 case Match_InvalidTiedOperand:
592 SMLoc ErrorLoc = IDLoc;
595 return Error(IDLoc,
"too few operands for instruction");
597 ErrorLoc = (
static_cast<HexagonOperand *
>(InstOperands[
ErrorInfo].get()))
599 if (ErrorLoc ==
SMLoc())
602 return Error(ErrorLoc,
"invalid operand for instruction");
607void HexagonAsmParser::eatToEndOfPacket() {
616bool HexagonAsmParser::matchAndEmitInstruction(
SMLoc IDLoc,
unsigned &Opcode,
620 bool MatchingInlineAsm) {
625 HexagonOperand &FirstOperand =
static_cast<HexagonOperand &
>(*
Operands[0]);
626 if (FirstOperand.isToken() && FirstOperand.getToken() ==
"{") {
627 assert(
Operands.size() == 1 &&
"Brackets should be by themselves");
629 getParser().Error(IDLoc,
"Already in a packet");
636 if (FirstOperand.isToken() && FirstOperand.getToken() ==
"}") {
637 assert(
Operands.size() == 1 &&
"Brackets should be by themselves");
639 getParser().Error(IDLoc,
"Not in a packet");
643 if (matchBundleOptions())
645 return finishBundle(IDLoc, Out);
647 MCInst *SubInst = getParser().getContext().createMCInst();
649 MatchingInlineAsm)) {
655 getParser().getContext(), MII, MCB, *SubInst);
658 return finishBundle(IDLoc, Out);
664bool HexagonAsmParser::parseDirectiveAttribute(
SMLoc L) {
673 return Error(TagLoc,
"attribute name not recognized: " +
Name);
684 if (check(!CE, TagLoc,
"expected numeric constant"))
687 Tag =
CE->getValue();
694 int64_t IntegerValue = 0;
702 return Error(ValueExprLoc,
"expected numeric constant");
703 IntegerValue =
CE->getValue();
708 getTargetStreamer().emitAttribute(Tag, IntegerValue);
713bool HexagonAsmParser::ParseDirective(
AsmToken DirectiveID) {
715 if (IDVal.
lower() ==
".falign")
716 return ParseDirectiveFalign(256, DirectiveID.
getLoc());
717 if ((IDVal.
lower() ==
".lcomm") || (IDVal.
lower() ==
".lcommon"))
718 return ParseDirectiveComm(
true, DirectiveID.
getLoc());
719 if ((IDVal.
lower() ==
".comm") || (IDVal.
lower() ==
".common"))
720 return ParseDirectiveComm(
false, DirectiveID.
getLoc());
721 if (IDVal.
lower() ==
".subsection")
722 return ParseDirectiveSubsection(DirectiveID.
getLoc());
723 if (IDVal ==
".attribute")
724 return parseDirectiveAttribute(DirectiveID.
getLoc());
728bool HexagonAsmParser::ParseDirectiveSubsection(
SMLoc L) {
729 const MCExpr *Subsection =
nullptr;
733 "Invalid subsection directive");
734 getParser().parseExpression(Subsection);
736 if (!Subsection->evaluateAsAbsolute(Res))
737 return Error(L,
"Cannot evaluate subsection number");
740 return TokError(
"unexpected token in directive");
746 if ((Res < 0) && (Res > -8193))
748 getStreamer().switchSection(getStreamer().getCurrentSectionOnly(), Res);
753bool HexagonAsmParser::ParseDirectiveFalign(
unsigned Size,
SMLoc L) {
755 int64_t MaxBytesToFill = 15;
763 if (!getParser().parseExpression(
Value)) {
765 auto *MCE = cast<MCConstantExpr>(
Value);
766 uint64_t IntValue = MCE->getValue();
768 return Error(ExprLoc,
"literal value out of range (256) for falign");
769 MaxBytesToFill = IntValue;
772 return Error(ExprLoc,
"not a valid expression for falign directive");
776 getTargetStreamer().emitFAlign(16, MaxBytesToFill);
788bool HexagonAsmParser::ParseDirectiveComm(
bool IsLocal,
SMLoc Loc) {
791 if (getStreamer().hasRawTextSupport())
795 if (getParser().parseIdentifier(
Name))
796 return TokError(
"expected identifier in directive");
801 return TokError(
"unexpected token in directive");
805 SMLoc SizeLoc = getLexer().getLoc();
806 if (getParser().parseAbsoluteExpression(
Size))
810 SMLoc ByteAlignmentLoc;
813 ByteAlignmentLoc = getLexer().getLoc();
814 if (getParser().parseAbsoluteExpression(ByteAlignment))
817 return Error(ByteAlignmentLoc,
"alignment must be a power of 2");
820 int64_t AccessAlignment = 0;
824 SMLoc AccessAlignmentLoc;
826 AccessAlignmentLoc = getLexer().getLoc();
827 if (getParser().parseAbsoluteExpression(AccessAlignment))
831 return Error(AccessAlignmentLoc,
"access alignment must be a power of 2");
835 return TokError(
"unexpected token in '.comm' or '.lcomm' directive");
842 return Error(SizeLoc,
"invalid '.comm' or '.lcomm' directive size, can't "
843 "be less than zero");
848 if (ByteAlignment < 0)
849 return Error(ByteAlignmentLoc,
"invalid '.comm' or '.lcomm' directive "
850 "alignment, can't be less than zero");
852 if (!
Sym->isUndefined())
853 return Error(Loc,
"invalid symbol redefinition");
869bool HexagonAsmParser::RegisterMatchesArch(
MCRegister MatchNum)
const {
870 if (HexagonMCRegisterClasses[Hexagon::V62RegsRegClassID].
contains(MatchNum))
871 if (!getSTI().hasFeature(Hexagon::ArchV62))
883#define GET_MATCHER_IMPLEMENTATION
884#define GET_REGISTER_MATCHER
885#include "HexagonGenAsmMatcher.inc"
894 return static_cast<HexagonOperand &
>(Operand).getToken().equals_insensitive(
907 AsmToken const &Token = getParser().getTok();
912 std::pair<StringRef, StringRef> HeadTail =
String.split(
'.');
913 if (!HeadTail.first.empty())
915 HexagonOperand::CreateToken(getContext(), HeadTail.first, Loc));
916 if (!HeadTail.second.empty())
917 Operands.push_back(HexagonOperand::CreateToken(
918 getContext(),
String.substr(HeadTail.first.size(), 1), Loc));
920 }
while (!
String.empty());
940 Warning(Begin,
"Missing parenthesis around predicate register");
941 static char const *LParen =
"(";
942 static char const *RParen =
")";
944 HexagonOperand::CreateToken(getContext(), LParen, Begin));
946 HexagonOperand::CreateReg(getContext(),
Register, Begin,
End));
948 if (MaybeDotNew.
is(AsmToken::TokenKind::Identifier) &&
952 HexagonOperand::CreateToken(getContext(), RParen, Begin));
958 Warning(Begin,
"Missing parenthesis around predicate register");
959 static char const *LParen =
"(";
960 static char const *RParen =
")";
962 getContext(), LParen, Begin));
964 HexagonOperand::CreateReg(getContext(),
Register, Begin,
End));
966 if (MaybeDotNew.
is(AsmToken::TokenKind::Identifier) &&
970 HexagonOperand::CreateToken(getContext(), RParen, Begin));
976 HexagonOperand::CreateReg(getContext(),
Register, Begin,
End));
982bool HexagonAsmParser::isLabel(
AsmToken &Token) {
987 if (Token.
is(AsmToken::TokenKind::LCurly) ||
988 Token.
is(AsmToken::TokenKind::RCurly))
994 if (!Token.
is(AsmToken::TokenKind::Identifier))
996 if (!matchRegister(
String.lower()))
1001 std::string Collapsed = std::string(Raw);
1004 std::pair<StringRef, StringRef> DotSplit = Whole.
split(
'.');
1005 if (!matchRegister(DotSplit.first.lower()))
1010bool HexagonAsmParser::handleNoncontigiousRegister(
bool Contigious,
1013 Error(Loc,
"Register name is not contigious");
1017 Warning(Loc,
"Register name is not contigious");
1023 return !tryParseRegister(
Reg, StartLoc, EndLoc).isSuccess();
1029 StartLoc = getLexer().getLoc();
1033 bool NeededWorkaround =
false;
1042 Lookahead.
back().getString().data() +
1043 Lookahead.
back().getString().size();
1049 Again = (Contigious &&
Type) || (Workaround &&
Type);
1050 NeededWorkaround = NeededWorkaround || (Again && !(Contigious &&
Type));
1052 std::string Collapsed = std::string(RawString);
1055 std::pair<StringRef, StringRef> DotSplit = FullString.
split(
'.');
1056 MCRegister DotReg = matchRegister(DotSplit.first.lower());
1057 if (DotReg && RegisterMatchesArch(DotReg)) {
1058 if (DotSplit.second.empty()) {
1061 if (handleNoncontigiousRegister(!NeededWorkaround, StartLoc))
1066 size_t First = RawString.find(
'.');
1070 if (handleNoncontigiousRegister(!NeededWorkaround, StartLoc))
1075 std::pair<StringRef, StringRef> ColonSplit =
StringRef(FullString).
split(
':');
1076 MCRegister ColonReg = matchRegister(ColonSplit.first.lower());
1077 if (ColonReg && RegisterMatchesArch(DotReg)) {
1083 if (handleNoncontigiousRegister(!NeededWorkaround, StartLoc))
1087 while (!Lookahead.
empty()) {
1107bool HexagonAsmParser::parseExpression(
MCExpr const *&Expr) {
1111 static char const *
Comma =
",";
1115 switch (Tokens.
back().getKind()) {
1116 case AsmToken::TokenKind::Hash:
1117 if (Tokens.
size() > 1)
1118 if ((Tokens.
end() - 2)->getKind() == AsmToken::TokenKind::Plus) {
1120 AsmToken(AsmToken::TokenKind::Comma, Comma));
1124 case AsmToken::TokenKind::RCurly:
1125 case AsmToken::TokenKind::EndOfStatement:
1126 case AsmToken::TokenKind::Eof:
1133 while (!Tokens.
empty()) {
1138 return getParser().parseExpression(Expr, Loc);
1142 if (implicitExpressionLocation(
Operands)) {
1145 MCExpr const *Expr =
nullptr;
1146 bool Error = parseExpression(Expr);
1150 HexagonOperand::CreateImm(getContext(), Expr, Loc, Loc));
1171 Operands.push_back(HexagonOperand::CreateToken(
1178 Operands.push_back(HexagonOperand::CreateToken(
1194 Operands.push_back(HexagonOperand::CreateToken(
1196 Operands.push_back(HexagonOperand::CreateToken(
1202 bool MustNotExtend =
false;
1203 bool ImplicitExpression = implicitExpressionLocation(
Operands);
1205 if (!ImplicitExpression)
1206 Operands.push_back(HexagonOperand::CreateToken(
1209 bool MustExtend =
false;
1210 bool HiOnly =
false;
1211 bool LoOnly =
false;
1215 }
else if (ImplicitExpression)
1216 MustNotExtend =
true;
1220 if (
String.lower() ==
"hi") {
1222 }
else if (
String.lower() ==
"lo") {
1225 if (HiOnly || LoOnly) {
1235 MCExpr const *Expr =
nullptr;
1236 if (parseExpression(Expr))
1241 if (Expr->evaluateAsAbsolute(
Value)) {
1245 if (HiOnly || LoOnly)
1251 if (!
Value.isAbsolute()) {
1252 switch (
Value.getAccessVariant()) {
1253 case MCSymbolRefExpr::VariantKind::VK_TPREL:
1254 case MCSymbolRefExpr::VariantKind::VK_DTPREL:
1256 MustNotExtend = !MustExtend;
1267 std::unique_ptr<HexagonOperand> Operand =
1268 HexagonOperand::CreateImm(getContext(), Expr, ExprLoc, ExprLoc);
1269 Operands.push_back(std::move(Operand));
1275 if (parseExpressionOrOperand(
Operands))
1283 getLexer().UnLex(
ID);
1302 HexagonOperand *
Op =
static_cast<HexagonOperand *
>(&AsmOp);
1307 return Op->isImm() &&
Op->Imm.Val->evaluateAsAbsolute(
Value) &&
Value == 0
1309 : Match_InvalidOperand;
1313 return Op->isImm() &&
Op->Imm.Val->evaluateAsAbsolute(
Value) &&
Value == 1
1315 : Match_InvalidOperand;
1318 if (
Op->Kind == HexagonOperand::Token && Kind != InvalidMatchClass) {
1320 if (matchTokenString(myStringRef.
lower()) == (MatchClassKind)Kind)
1321 return Match_Success;
1322 if (matchTokenString(myStringRef.
upper()) == (MatchClassKind)Kind)
1323 return Match_Success;
1330 return Match_InvalidOperand;
1334bool HexagonAsmParser::OutOfRange(
SMLoc IDLoc,
long long Val,
long long Max) {
1337 ES <<
"value " << Val <<
"(" <<
format_hex(Val, 0) <<
") out of range: ";
1341 ES <<
Max <<
"-" << (-
Max - 1);
1345int HexagonAsmParser::processInstruction(
MCInst &Inst,
1348 MCContext &Context = getParser().getContext();
1350 const std::string r =
"r";
1351 const std::string
v =
"v";
1352 const std::string Colon =
":";
1353 using RegPairVals = std::pair<unsigned, unsigned>;
1354 auto GetRegPair = [
this, r](RegPairVals RegPair) {
1355 const std::string R1 = r + utostr(RegPair.first);
1356 const std::string
R2 = r + utostr(RegPair.second);
1358 return std::make_pair(matchRegister(R1), matchRegister(
R2));
1360 auto GetScalarRegs = [RI, GetRegPair](
MCRegister RegPair) {
1362 const RegPairVals RegPair_ = std::make_pair(
Lower + 1,
Lower);
1364 return GetRegPair(RegPair_);
1366 auto GetVecRegs = [GetRegPair](
MCRegister VecRegPair) {
1367 const RegPairVals RegPair =
1370 return GetRegPair(RegPair);
1373 bool is32bit =
false;
1379 "Found pseudo instruction with no expansion");
1385 case Hexagon::J2_trap1:
1386 if (!getSTI().hasFeature(Hexagon::ArchV65)) {
1389 if (Rx.
getReg() != Hexagon::R0 || Ry.
getReg() != Hexagon::R0) {
1390 Error(IDLoc,
"trap1 can only have register r0 as operand");
1391 return Match_InvalidOperand;
1396 case Hexagon::A2_iconst: {
1408 case Hexagon::M4_mpyrr_addr:
1409 case Hexagon::S4_addi_asl_ri:
1410 case Hexagon::S4_addi_lsr_ri:
1411 case Hexagon::S4_andi_asl_ri:
1412 case Hexagon::S4_andi_lsr_ri:
1413 case Hexagon::S4_ori_asl_ri:
1414 case Hexagon::S4_ori_lsr_ri:
1415 case Hexagon::S4_or_andix:
1416 case Hexagon::S4_subi_asl_ri:
1417 case Hexagon::S4_subi_lsr_ri: {
1421 return Match_InvalidOperand;
1425 case Hexagon::C2_cmpgei: {
1435 case Hexagon::C2_cmpgeui: {
1461 case Hexagon::A2_tfrp: {
1463 const std::pair<MCRegister, MCRegister> RegPair =
1464 GetScalarRegs(MO.
getReg());
1465 MO.
setReg(RegPair.first);
1471 case Hexagon::A2_tfrpt:
1472 case Hexagon::A2_tfrpf: {
1474 const std::pair<MCRegister, MCRegister> RegPair =
1475 GetScalarRegs(MO.
getReg());
1476 MO.
setReg(RegPair.first);
1479 ? Hexagon::C2_ccombinewt
1480 : Hexagon::C2_ccombinewf);
1483 case Hexagon::A2_tfrptnew:
1484 case Hexagon::A2_tfrpfnew: {
1486 const std::pair<MCRegister, MCRegister> RegPair =
1487 GetScalarRegs(MO.
getReg());
1488 MO.
setReg(RegPair.first);
1491 ? Hexagon::C2_ccombinewnewt
1492 : Hexagon::C2_ccombinewnewf);
1497 case Hexagon::V6_vassignp: {
1499 const std::pair<MCRegister, MCRegister> RegPair = GetVecRegs(MO.
getReg());
1500 MO.
setReg(RegPair.first);
1507 case Hexagon::CONST32:
1511 case Hexagon::CONST64:
1521 std::string myCharStr;
1531 std::string myImmStr = utohexstr(
static_cast<uint32_t>(
Value));
1532 myCharStr =
StringRef(
".gnu.linkonce.l4.CONST_00000000")
1537 std::string myImmStr = utohexstr(
Value);
1538 myCharStr =
StringRef(
".gnu.linkonce.l8.CONST_0000000000000000")
1546 }
else if (MO_1.
isExpr()) {
1548 myCharStr =
".lita";
1555 unsigned byteSize = is32bit ? 4 : 8;
1564 Sym = getContext().getOrCreateSymbol(
StringRef(myCharStr.c_str() + 16));
1565 if (
Sym->isUndefined()) {
1566 getStreamer().emitLabel(
Sym);
1570 }
else if (MO_1.
isExpr()) {
1571 const char *StringStart =
nullptr;
1572 const char *StringEnd =
nullptr;
1573 if (*
Operands[4]->getStartLoc().getPointer() ==
'#') {
1574 StringStart =
Operands[5]->getStartLoc().getPointer();
1575 StringEnd =
Operands[6]->getStartLoc().getPointer();
1577 StringStart =
Operands[4]->getStartLoc().getPointer();
1578 StringEnd =
Operands[5]->getStartLoc().getPointer();
1581 unsigned size = StringEnd - StringStart;
1582 std::string DotConst =
".CONST_";
1583 Sym = getContext().getOrCreateSymbol(DotConst +
1586 if (
Sym->isUndefined()) {
1588 getStreamer().emitLabel(
Sym);
1590 getStreamer().emitValue(MO_1.
getExpr(), 4);
1600 TmpInst.
setOpcode(Hexagon::L2_loadrigp);
1602 TmpInst.
setOpcode(Hexagon::L2_loadrdgp);
1613 case Hexagon::A2_tfrpi: {
1625 case Hexagon::TFRI64_V4: {
1632 OutOfRange(IDLoc, s8, -128);
1650 case Hexagon::TFRI64_V2_ext: {
1657 if (s8 < -128 || s8 > 127)
1658 OutOfRange(IDLoc, s8, -128);
1665 case Hexagon::A4_combineii: {
1671 if (s8 < -128 || s8 > 127)
1672 OutOfRange(IDLoc, s8, -128);
1679 case Hexagon::S2_tableidxb_goodsyntax:
1683 case Hexagon::S2_tableidxh_goodsyntax: {
1693 TmpInst.
setOpcode(Hexagon::S2_tableidxh);
1703 case Hexagon::S2_tableidxw_goodsyntax: {
1713 TmpInst.
setOpcode(Hexagon::S2_tableidxw);
1723 case Hexagon::S2_tableidxd_goodsyntax: {
1733 TmpInst.
setOpcode(Hexagon::S2_tableidxd);
1743 case Hexagon::M2_mpyui:
1746 case Hexagon::M2_mpysmi: {
1755 return Match_InvalidOperand;
1758 return Match_InvalidOperand;
1759 if (Value < 0 && Value > -256) {
1772 case Hexagon::S2_asr_i_r_rnd_goodsyntax: {
1778 return Match_InvalidOperand;
1790 TmpInst.
setOpcode(Hexagon::S2_asr_i_r_rnd);
1801 case Hexagon::S2_asr_i_p_rnd_goodsyntax: {
1808 return Match_InvalidOperand;
1812 std::string R1 = r + utostr(RegPairNum + 1);
1814 Rss.
setReg(matchRegister(Reg1));
1816 std::string
R2 = r + utostr(RegPairNum);
1818 TmpInst.
setOpcode(Hexagon::A2_combinew);
1828 Inst.
setOpcode(Hexagon::S2_asr_i_p_rnd);
1833 case Hexagon::A4_boundscheck: {
1837 Inst.
setOpcode(Hexagon::A4_boundscheck_hi);
1838 std::string
Name = r + utostr(RegNum) + Colon + utostr(RegNum - 1);
1840 Rs.
setReg(matchRegister(RegPair));
1842 Inst.
setOpcode(Hexagon::A4_boundscheck_lo);
1843 std::string
Name = r + utostr(RegNum + 1) + Colon + utostr(RegNum);
1845 Rs.
setReg(matchRegister(RegPair));
1850 case Hexagon::A2_addsp: {
1855 std::string
Name = r + utostr(RegNum) + Colon + utostr(RegNum - 1);
1857 Rs.
setReg(matchRegister(RegPair));
1860 std::string
Name = r + utostr(RegNum + 1) + Colon + utostr(RegNum);
1862 Rs.
setReg(matchRegister(RegPair));
1867 case Hexagon::M2_vrcmpys_s1: {
1871 Inst.
setOpcode(Hexagon::M2_vrcmpys_s1_h);
1872 std::string
Name = r + utostr(RegNum) + Colon + utostr(RegNum - 1);
1874 Rt.
setReg(matchRegister(RegPair));
1876 Inst.
setOpcode(Hexagon::M2_vrcmpys_s1_l);
1877 std::string
Name = r + utostr(RegNum + 1) + Colon + utostr(RegNum);
1879 Rt.
setReg(matchRegister(RegPair));
1884 case Hexagon::M2_vrcmpys_acc_s1: {
1891 TmpInst.
setOpcode(Hexagon::M2_vrcmpys_acc_s1_h);
1892 std::string
Name = r + utostr(RegNum) + Colon + utostr(RegNum - 1);
1894 Rt.
setReg(matchRegister(RegPair));
1896 TmpInst.
setOpcode(Hexagon::M2_vrcmpys_acc_s1_l);
1897 std::string
Name = r + utostr(RegNum + 1) + Colon + utostr(RegNum);
1899 Rt.
setReg(matchRegister(RegPair));
1910 case Hexagon::M2_vrcmpys_s1rp: {
1914 Inst.
setOpcode(Hexagon::M2_vrcmpys_s1rp_h);
1915 std::string
Name = r + utostr(RegNum) + Colon + utostr(RegNum - 1);
1917 Rt.
setReg(matchRegister(RegPair));
1919 Inst.
setOpcode(Hexagon::M2_vrcmpys_s1rp_l);
1920 std::string
Name = r + utostr(RegNum + 1) + Colon + utostr(RegNum);
1922 Rt.
setReg(matchRegister(RegPair));
1927 case Hexagon::S5_asrhub_rnd_sat_goodsyntax: {
1932 return Match_InvalidOperand;
1940 Inst.
setOpcode(Hexagon::S5_asrhub_rnd_sat);
1945 case Hexagon::S5_vasrhrnd_goodsyntax: {
1952 return Match_InvalidOperand;
1956 std::string R1 = r + utostr(RegPairNum + 1);
1958 Rss.
setReg(matchRegister(Reg1));
1960 std::string
R2 = r + utostr(RegPairNum);
1962 TmpInst.
setOpcode(Hexagon::A2_combinew);
1977 case Hexagon::A2_not: {
1989 case Hexagon::PS_loadrubabs:
1993 case Hexagon::PS_loadrbabs:
1997 case Hexagon::PS_loadruhabs:
2001 case Hexagon::PS_loadrhabs:
2005 case Hexagon::PS_loadriabs:
2009 case Hexagon::PS_loadrdabs:
2013 case Hexagon::PS_storerbabs:
2017 case Hexagon::PS_storerhabs:
2021 case Hexagon::PS_storerfabs:
2025 case Hexagon::PS_storeriabs:
2029 case Hexagon::PS_storerdabs:
2033 case Hexagon::PS_storerbnewabs:
2035 Inst.
setOpcode(Hexagon::S2_storerbnewgp);
2037 case Hexagon::PS_storerhnewabs:
2039 Inst.
setOpcode(Hexagon::S2_storerhnewgp);
2041 case Hexagon::PS_storerinewabs:
2043 Inst.
setOpcode(Hexagon::S2_storerinewgp);
2045 case Hexagon::A2_zxtb: {
2053 return Match_Success;
static MCRegister MatchRegisterName(StringRef Name)
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 void print(raw_ostream &Out, object::Archive::Kind Kind, T Val)
static size_t byteSize(BTF::CommonType *Type)
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
Analysis containing CSE Info
#define LLVM_EXTERNAL_VISIBILITY
static GCMetadataPrinterRegistry::Add< ErlangGCPrinter > X("erlang", "erlang-compatible garbage collector")
static bool isSigned(unsigned int 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 > WarnNoncontigiousRegister("mwarn-noncontigious-register", cl::desc("Warn for register names that arent contigious"), cl::init(true))
static cl::opt< bool > ErrorMissingParenthesis("merror-missing-parenthesis", cl::desc("Error for missing parenthesis around predicate registers"), cl::init(false))
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)
LLVM_EXTERNAL_VISIBILITY void LLVMInitializeHexagonAsmParser()
Force static initialization.
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")
mir Rename Register Operands
static unsigned getReg(const MCDisassembler *D, unsigned RC, unsigned RegNo)
static bool isReg(const MCInst &MI, unsigned OpNo)
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
static bool isImm(const MachineOperand &MO, MachineRegisterInfo *MRI)
static bool contains(SmallPtrSetImpl< ConstantExpr * > &Cache, ConstantExpr *Expr, Constant *C)
This file defines the SmallVector class.
Target independent representation for an assembler token.
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.
This class represents an Operation in the Expression.
Base class for user error types.
Lightweight error class with error context and mandatory checking.
Check for a valid bundle.
void HexagonMCEmitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size, Align ByteAlignment, unsigned AccessSize)
void HexagonMCEmitCommonSymbol(MCSymbol *Symbol, uint64_t Size, Align ByteAlignment, unsigned AccessSize)
bool mustNotExtend() const
static HexagonMCExpr * create(MCExpr const *Expr, MCContext &Ctx)
Generic assembler lexer interface, for use by target specific assembly lexers.
void UnLex(AsmToken const &Token)
const AsmToken peekTok(bool ShouldSkipSpace=true)
Look ahead at the next token to be lexed.
SMLoc getLoc() const
Get the current source location.
const AsmToken & getTok() const
Get the current (last) lexed token.
const AsmToken & Lex()
Consume the next token from the input stream and return it.
bool is(AsmToken::TokenKind K) const
Check if the current token has kind K.
virtual void Initialize(MCAsmParser &Parser)
Initialize the extension for parsing using the given Parser.
MCAsmParser & getParser()
Generic assembler parser interface, for use by target specific assembly parsers.
virtual bool printError(SMLoc L, const Twine &Msg, SMRange Range=std::nullopt)=0
Emit an error at the location L, with the message Msg.
virtual MCStreamer & getStreamer()=0
Return the output streamer for the assembler.
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 MCAsmLexer & getLexer()=0
virtual bool Warning(SMLoc L, const Twine &Msg, SMRange Range=std::nullopt)=0
Emit a warning at the location L, with the message Msg.
virtual void addAliasForDirective(StringRef Directive, StringRef Alias)=0
virtual MCContext & getContext()=0
bool Error(SMLoc L, const Twine &Msg, SMRange Range=std::nullopt)
Return an error at the location L, with the message Msg.
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 const MCConstantExpr * create(int64_t Value, MCContext &Ctx, bool PrintInHex=false, unsigned SizeInBytes=0)
Context object for machine code objects.
Base class for the full range of assembler expressions which are needed for parsing.
bool evaluateAsAbsolute(int64_t &Res, const MCAssembler &Asm, const SectionAddrMap &Addrs) const
Try to evaluate the expression to an absolute value.
@ Unary
Unary expressions.
@ SymbolRef
References to labels and assigned expressions.
@ Binary
Binary expressions.
bool evaluateAsRelocatable(MCValue &Res, const MCAssembler *Asm, const MCFixup *Fixup) const
Try to evaluate the expression to a relocatable value, i.e.
Instances of this class represent a single low-level machine instruction.
void dump_pretty(raw_ostream &OS, const MCInstPrinter *Printer=nullptr, StringRef Separator=" ", const MCRegisterInfo *RegInfo=nullptr) const
Dump the MCInst as prettily as possible using the additional MC structures, if given.
unsigned getOpcode() const
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?
MCRegisterInfo base class - We assume that the target defines a static array of MCRegisterDesc object...
uint16_t getEncodingValue(MCRegister Reg) const
Returns the encoding for Reg.
Wrapper class representing physical registers. Should be passed by value.
This represents a section on linux, lots of unix variants and some bare metal systems.
Streaming machine code generation interface.
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)
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
MCTargetAsmParser - Generic interface to target specific assembly parsers.
virtual bool parseInstruction(ParseInstructionInfo &Info, StringRef Name, SMLoc NameLoc, OperandVector &Operands)=0
Parse one assembly instruction.
virtual bool equalIsAsmAssignment()
virtual bool parseRegister(MCRegister &Reg, SMLoc &StartLoc, SMLoc &EndLoc)=0
virtual bool ParseDirective(AsmToken DirectiveID)
ParseDirective - Parse a target specific assembler directive This method is deprecated,...
virtual ParseStatus tryParseRegister(MCRegister &Reg, SMLoc &StartLoc, SMLoc &EndLoc)=0
tryParseRegister - parse one register if possible
virtual bool matchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode, OperandVector &Operands, MCStreamer &Out, uint64_t &ErrorInfo, bool MatchingInlineAsm)=0
Recognize a series of operands of a parsed instruction as an actual MCInst and emit it to the specifi...
virtual bool isLabel(AsmToken &Token)
void setAvailableFeatures(const FeatureBitset &Value)
const MCSubtargetInfo & getSTI() const
virtual unsigned validateTargetOperandClass(MCParsedAsmOperand &Op, unsigned Kind)
Allow a target to add special case operand matching for things that tblgen doesn't/can't handle effec...
Target specific streamer interface.
MCStreamer & getStreamer()
This represents an "assembler immediate".
Ternary parse status returned by various parse* methods.
static constexpr StatusTy Success
static constexpr StatusTy NoMatch
Wrapper class representing virtual and physical registers.
constexpr unsigned id() const
Instances of this class encapsulate one diagnostic report, allowing printing to a raw_ostream as a ca...
void print(const char *ProgName, raw_ostream &S, bool ShowColors=true, bool ShowKindLabel=true, bool ShowLocation=true) const
Represents a location in source code.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
reference emplace_back(ArgTypes &&... Args)
iterator insert(iterator I, T &&Elt)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
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.
std::string str() const
str - Get the contents as an std::string.
constexpr StringRef substr(size_t Start, size_t N=npos) const
Return a reference to the substring from [Start, Start + N).
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).
std::string lower() const
StringRef drop_back(size_t N=1) const
Return a StringRef equal to 'this' but with the last N elements dropped.
bool equals_insensitive(StringRef RHS) const
Check for string equality, ignoring case.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
The instances of the Type class are immutable: once they are created, they are never changed.
LLVM Value Representation.
This class implements an extremely fast bulk output stream that can only output to a stream.
A raw_ostream that writes to an std::string.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
std::optional< unsigned > attrTypeFromString(StringRef tag, TagNameMap tagNameMap)
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)
This is an optimization pass for GlobalISel generic memory operations.
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.
bool isUIntN(unsigned N, uint64_t x)
Checks if an unsigned integer fits into the given (dynamic) bit width.
static bool isMem(const MachineInstr &MI, unsigned Op)
constexpr bool isPowerOf2_64(uint64_t Value)
Return true if the argument is a power of two > 0 (64 bit edition.)
Target & getTheHexagonTarget()
constexpr uint32_t Hi_32(uint64_t Value)
Return the high 32 bits of a 64 bit value.
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
void report_fatal_error(Error Err, bool gen_crash_diag=true)
Report a serious error, calling any installed error handler.
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.
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.
bool isIntN(unsigned N, int64_t x)
Checks if an signed integer fits into the given (dynamic) bit width.
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 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
auto mask(ShuffFunc S, unsigned Length, OptArgs... args) -> MaskT
This struct is a compact representation of a valid (non-zero power of two) alignment.
RegisterMCAsmParser - Helper template for registering a target specific assembly parser,...