Lines Matching defs:Mnemonic

187   bool isCDEInstr(StringRef Mnemonic) {
189 if (!Mnemonic.starts_with("cx") && !Mnemonic.starts_with("vcx"))
191 return CDE.count(Mnemonic);
196 bool isVPTPredicableCDEInstr(StringRef Mnemonic) {
197 if (!Mnemonic.starts_with("vcx"))
199 return CDEWithVPTSuffix.count(Mnemonic);
204 bool isITPredicableCDEInstr(StringRef Mnemonic) {
205 if (!Mnemonic.starts_with("cx"))
207 return Mnemonic.starts_with("cx1a") || Mnemonic.starts_with("cx1da") ||
208 Mnemonic.starts_with("cx2a") || Mnemonic.starts_with("cx2da") ||
209 Mnemonic.starts_with("cx3a") || Mnemonic.starts_with("cx3da");
214 bool isCDEDualRegInstr(StringRef Mnemonic) {
215 if (!Mnemonic.starts_with("cx"))
217 return Mnemonic == "cx1d" || Mnemonic == "cx1da" ||
218 Mnemonic == "cx2d" || Mnemonic == "cx2da" ||
219 Mnemonic == "cx3d" || Mnemonic == "cx3da";
224 for (StringRef Mnemonic: { "cx1", "cx1a", "cx1d", "cx1da",
227 CDE.insert(Mnemonic);
228 for (StringRef Mnemonic :
230 CDE.insert(Mnemonic);
231 CDEWithVPTSuffix.insert(Mnemonic);
232 CDEWithVPTSuffix.insert(std::string(Mnemonic) + "t");
233 CDEWithVPTSuffix.insert(std::string(Mnemonic) + "e");
452 bool parseOperand(OperandVector &, StringRef Mnemonic);
504 bool isMnemonicVPTPredicable(StringRef Mnemonic, StringRef ExtraToken);
505 StringRef splitMnemonic(StringRef Mnemonic, StringRef ExtraToken,
510 void getMnemonicAcceptInfo(StringRef Mnemonic, StringRef ExtraToken,
516 void tryConvertingToTwoOperandForm(StringRef Mnemonic,
521 bool CDEConvertDualRegOperand(StringRef Mnemonic, OperandVector &Operands,
664 bool shouldOmitVectorPredicateOperand(StringRef Mnemonic,
669 void fixupGNULDRDAlias(StringRef Mnemonic, OperandVector &Operands,
4158 // Special case for CPS which has a Mnemonic side token for possibly storing
6256 ARMOperand &Mnemonic = static_cast<ARMOperand &>(*Operands[0]);
6257 bool isFconst = Mnemonic.isToken() && (Mnemonic.getToken() == "fconstd" ||
6258 Mnemonic.getToken() == "fconsts");
6304 bool ARMAsmParser::parseOperand(OperandVector &Operands, StringRef Mnemonic) {
6310 ParseStatus ResTy = MatchOperandParserImpl(Operands, Mnemonic);
6327 bool ExpectLabel = Mnemonic == "b" || Mnemonic == "bl";
6337 if (Mnemonic == "vmrs" &&
6367 bool IsLazyLoadStore = Mnemonic == "vlldm" || Mnemonic == "vlstm";
6368 bool IsVSCCLRM = Mnemonic == "vscclrm";
6369 return parseRegisterList(Operands, !Mnemonic.starts_with("clr"), false,
6443 if (Mnemonic != "ldr") // only parse for ldr pseudo (e.g. ldr r0, =val)
6569 StringRef ARMAsmParser::splitMnemonic(StringRef Mnemonic, StringRef ExtraToken,
6583 if ((Mnemonic == "movs" && isThumb()) || Mnemonic == "teq" ||
6584 Mnemonic == "vceq" || Mnemonic == "svc" || Mnemonic == "mls" ||
6585 Mnemonic == "smmls" || Mnemonic == "vcls" || Mnemonic == "vmls" ||
6586 Mnemonic == "vnmls" || Mnemonic == "vacge" || Mnemonic == "vcge" ||
6587 Mnemonic == "vclt" || Mnemonic == "vacgt" || Mnemonic == "vaclt" ||
6588 Mnemonic == "vacle" || Mnemonic == "hlt" || Mnemonic == "vcgt" ||
6589 Mnemonic == "vcle" || Mnemonic == "smlal" || Mnemonic == "umaal" ||
6590 Mnemonic == "umlal" || Mnemonic == "vabal" || Mnemonic == "vmlal" ||
6591 Mnemonic == "vpadal" || Mnemonic == "vqdmlal" || Mnemonic == "fmuls" ||
6592 Mnemonic == "vmaxnm" || Mnemonic == "vminnm" || Mnemonic == "vcvta" ||
6593 Mnemonic == "vcvtn" || Mnemonic == "vcvtp" || Mnemonic == "vcvtm" ||
6594 Mnemonic == "vrinta" || Mnemonic == "vrintn" || Mnemonic == "vrintp" ||
6595 Mnemonic == "vrintm" || Mnemonic == "hvc" ||
6596 Mnemonic.starts_with("vsel") || Mnemonic == "vins" ||
6597 Mnemonic == "vmovx" || Mnemonic == "bxns" || Mnemonic == "blxns" ||
6598 Mnemonic == "vdot" || Mnemonic == "vmmla" || Mnemonic == "vudot" ||
6599 Mnemonic == "vsdot" || Mnemonic == "vcmla" || Mnemonic == "vcadd" ||
6600 Mnemonic == "vfmal" || Mnemonic == "vfmsl" || Mnemonic == "wls" ||
6601 Mnemonic == "le" || Mnemonic == "dls" || Mnemonic == "csel" ||
6602 Mnemonic == "csinc" || Mnemonic == "csinv" || Mnemonic == "csneg" ||
6603 Mnemonic == "cinc" || Mnemonic == "cinv" || Mnemonic == "cneg" ||
6604 Mnemonic == "cset" || Mnemonic == "csetm" || Mnemonic == "aut" ||
6605 Mnemonic == "pac" || Mnemonic == "pacbti" || Mnemonic == "bti")
6606 return Mnemonic;
6610 if (Mnemonic != "adcs" && Mnemonic != "bics" && Mnemonic != "movs" &&
6611 Mnemonic != "muls" && Mnemonic != "smlals" && Mnemonic != "smulls" &&
6612 Mnemonic != "umlals" && Mnemonic != "umulls" && Mnemonic != "lsls" &&
6613 Mnemonic != "sbcs" && Mnemonic != "rscs" &&
6615 (Mnemonic == "vmine" || Mnemonic == "vshle" || Mnemonic == "vshlt" ||
6616 Mnemonic == "vshllt" || Mnemonic == "vrshle" || Mnemonic == "vrshlt" ||
6617 Mnemonic == "vmvne" || Mnemonic == "vorne" || Mnemonic == "vnege" ||
6618 Mnemonic == "vnegt" || Mnemonic == "vmule" || Mnemonic == "vmult" ||
6619 Mnemonic == "vrintne" || Mnemonic == "vcmult" ||
6620 Mnemonic == "vcmule" || Mnemonic == "vpsele" || Mnemonic == "vpselt" ||
6621 Mnemonic.starts_with("vq")))) {
6622 unsigned CC = ARMCondCodeFromString(Mnemonic.substr(Mnemonic.size()-2));
6624 Mnemonic = Mnemonic.slice(0, Mnemonic.size() - 2);
6631 if (Mnemonic.ends_with("s") &&
6632 !(Mnemonic == "cps" || Mnemonic == "mls" || Mnemonic == "mrs" ||
6633 Mnemonic == "smmls" || Mnemonic == "vabs" || Mnemonic == "vcls" ||
6634 Mnemonic == "vmls" || Mnemonic == "vmrs" || Mnemonic == "vnmls" ||
6635 Mnemonic == "vqabs" || Mnemonic == "vrecps" || Mnemonic == "vrsqrts" ||
6636 Mnemonic == "srs" || Mnemonic == "flds" || Mnemonic == "fmrs" ||
6637 Mnemonic == "fsqrts" || Mnemonic == "fsubs" || Mnemonic == "fsts" ||
6638 Mnemonic == "fcpys" || Mnemonic == "fdivs" || Mnemonic == "fmuls" ||
6639 Mnemonic == "fcmps" || Mnemonic == "fcmpzs" || Mnemonic == "vfms" ||
6640 Mnemonic == "vfnms" || Mnemonic == "fconsts" || Mnemonic == "bxns" ||
6641 Mnemonic == "blxns" || Mnemonic == "vfmas" || Mnemonic == "vmlas" ||
6642 (Mnemonic == "movs" && isThumb()))) {
6643 Mnemonic = Mnemonic.slice(0, Mnemonic.size() - 1);
6649 if (Mnemonic.starts_with("cps")) {
6652 StringSwitch<unsigned>(Mnemonic.substr(Mnemonic.size()-2, 2))
6657 Mnemonic = Mnemonic.slice(0, Mnemonic.size()-2);
6662 if (isMnemonicVPTPredicable(Mnemonic, ExtraToken) && Mnemonic != "vmovlt" &&
6663 Mnemonic != "vshllt" && Mnemonic != "vrshrnt" && Mnemonic != "vshrnt" &&
6664 Mnemonic != "vqrshrunt" && Mnemonic != "vqshrunt" &&
6665 Mnemonic != "vqrshrnt" && Mnemonic != "vqshrnt" && Mnemonic != "vmullt" &&
6666 Mnemonic != "vqmovnt" && Mnemonic != "vqmovunt" && Mnemonic != "vmovnt" &&
6667 Mnemonic != "vqdmullt" && Mnemonic != "vpnot" && Mnemonic != "vcvtt" &&
6668 Mnemonic != "vcvt") {
6670 ARMVectorCondCodeFromString(Mnemonic.substr(Mnemonic.size() - 1));
6672 Mnemonic = Mnemonic.slice(0, Mnemonic.size()-1);
6675 return Mnemonic;
6679 if (Mnemonic.starts_with("it")) {
6680 ITMask = Mnemonic.substr(2);
6681 Mnemonic = Mnemonic.slice(0, 2);
6684 if (Mnemonic.starts_with("vpst")) {
6685 ITMask = Mnemonic.substr(4);
6686 Mnemonic = Mnemonic.slice(0, 4);
6687 } else if (Mnemonic.starts_with("vpt")) {
6688 ITMask = Mnemonic.substr(3);
6689 Mnemonic = Mnemonic.slice(0, 3);
6692 return Mnemonic;
6699 void ARMAsmParser::getMnemonicAcceptInfo(StringRef Mnemonic,
6705 CanAcceptVPTPredicationCode = isMnemonicVPTPredicable(Mnemonic, ExtraToken);
6708 Mnemonic == "and" || Mnemonic == "lsl" || Mnemonic == "lsr" ||
6709 Mnemonic == "rrx" || Mnemonic == "ror" || Mnemonic == "sub" ||
6710 Mnemonic == "add" || Mnemonic == "adc" || Mnemonic == "mul" ||
6711 Mnemonic == "bic" || Mnemonic == "asr" || Mnemonic == "orr" ||
6712 Mnemonic == "mvn" || Mnemonic == "rsb" || Mnemonic == "rsc" ||
6713 Mnemonic == "orn" || Mnemonic == "sbc" || Mnemonic == "eor" ||
6714 Mnemonic == "neg" || Mnemonic == "vfm" || Mnemonic == "vfnm" ||
6716 (Mnemonic == "smull" || Mnemonic == "mov" || Mnemonic == "mla" ||
6717 Mnemonic == "smlal" || Mnemonic == "umlal" || Mnemonic == "umull"));
6719 if (Mnemonic == "bkpt" || Mnemonic == "cbnz" || Mnemonic == "setend" ||
6720 Mnemonic == "cps" || Mnemonic == "it" || Mnemonic == "cbz" ||
6721 Mnemonic == "trap" || Mnemonic == "hlt" || Mnemonic == "udf" ||
6722 Mnemonic.starts_with("crc32") || Mnemonic.starts_with("cps") ||
6723 Mnemonic.starts_with("vsel") || Mnemonic == "vmaxnm" ||
6724 Mnemonic == "vminnm" || Mnemonic == "vcvta" || Mnemonic == "vcvtn" ||
6725 Mnemonic == "vcvtp" || Mnemonic == "vcvtm" || Mnemonic == "vrinta" ||
6726 Mnemonic == "vrintn" || Mnemonic == "vrintp" || Mnemonic == "vrintm" ||
6727 Mnemonic.starts_with("aes") || Mnemonic == "hvc" ||
6728 Mnemonic == "setpan" || Mnemonic.starts_with("sha1") ||
6729 Mnemonic.starts_with("sha256") ||
6731 Mnemonic == "vmovx" || Mnemonic == "vins" || Mnemonic == "vudot" ||
6732 Mnemonic == "vsdot" || Mnemonic == "vcmla" || Mnemonic == "vcadd" ||
6733 Mnemonic == "vfmal" || Mnemonic == "vfmsl" || Mnemonic == "vfmat" ||
6734 Mnemonic == "vfmab" || Mnemonic == "vdot" || Mnemonic == "vmmla" ||
6735 Mnemonic == "sb" || Mnemonic == "ssbb" || Mnemonic == "pssbb" ||
6736 Mnemonic == "vsmmla" || Mnemonic == "vummla" || Mnemonic == "vusmmla" ||
6737 Mnemonic == "vusdot" || Mnemonic == "vsudot" || Mnemonic == "bfcsel" ||
6738 Mnemonic == "wls" || Mnemonic == "dls" || Mnemonic == "le" ||
6739 Mnemonic == "csel" || Mnemonic == "csinc" || Mnemonic == "csinv" ||
6740 Mnemonic == "csneg" || Mnemonic == "cinc" || Mnemonic == "cinv" ||
6741 Mnemonic == "cneg" || Mnemonic == "cset" || Mnemonic == "csetm" ||
6742 (hasCDE() && MS.isCDEInstr(Mnemonic) &&
6743 !MS.isITPredicableCDEInstr(Mnemonic)) ||
6744 Mnemonic.starts_with("vpt") || Mnemonic.starts_with("vpst") ||
6745 Mnemonic == "pac" || Mnemonic == "pacbti" || Mnemonic == "aut" ||
6746 Mnemonic == "bti" ||
6748 (Mnemonic.starts_with("vst2") || Mnemonic.starts_with("vld2") ||
6749 Mnemonic.starts_with("vst4") || Mnemonic.starts_with("vld4") ||
6750 Mnemonic.starts_with("wlstp") || Mnemonic.starts_with("dlstp") ||
6751 Mnemonic.starts_with("letp")))) {
6757 Mnemonic != "cdp2" && Mnemonic != "clrex" && Mnemonic != "mcr2" &&
6758 Mnemonic != "mcrr2" && Mnemonic != "mrc2" && Mnemonic != "mrrc2" &&
6759 Mnemonic != "dmb" && Mnemonic != "dfb" && Mnemonic != "dsb" &&
6760 Mnemonic != "isb" && Mnemonic != "pld" && Mnemonic != "pli" &&
6761 Mnemonic != "pldw" && Mnemonic != "ldc2" && Mnemonic != "ldc2l" &&
6762 Mnemonic != "stc2" && Mnemonic != "stc2l" && Mnemonic != "tsb" &&
6763 !Mnemonic.starts_with("rfe") && !Mnemonic.starts_with("srs");
6766 CanAcceptPredicationCode = Mnemonic != "movs";
6768 CanAcceptPredicationCode = Mnemonic != "nop" && Mnemonic != "movs";
6787 StringRef Mnemonic, ARMCC::CondCodes PredicationCode, bool CarrySetting,
6809 if (Mnemonic != "add")
6824 if (!(Mnemonic == "add" || Mnemonic == "sub" || Mnemonic == "and" ||
6825 Mnemonic == "eor" || Mnemonic == "lsl" || Mnemonic == "lsr" ||
6826 Mnemonic == "asr" || Mnemonic == "adc" || Mnemonic == "sbc" ||
6827 Mnemonic == "ror" || Mnemonic == "orr" || Mnemonic == "bic"))
6841 ((Mnemonic == "add" && Op4Reg != ARM::SP) ||
6842 Mnemonic == "and" || Mnemonic == "eor" ||
6843 Mnemonic == "adc" || Mnemonic == "orr")) {
6854 if (((Mnemonic == "add" && CarrySetting) || Mnemonic == "sub") &&
6860 if ((Mnemonic == "add" || Mnemonic == "sub") && LastOp->isImm0_7())
6893 StringRef Mnemonic, OperandVector &Operands, unsigned MnemonicOpsEndInd) {
6897 if (Mnemonic.starts_with("vld2") || Mnemonic.starts_with("vld4") ||
6898 Mnemonic.starts_with("vst2") || Mnemonic.starts_with("vst4"))
6901 if (Mnemonic.starts_with("vctp") || Mnemonic.starts_with("vpnot"))
6904 if (Mnemonic.starts_with("vmov") &&
6905 !(Mnemonic.starts_with("vmovl") || Mnemonic.starts_with("vmovn") ||
6906 Mnemonic.starts_with("vmovx"))) {
6934 static bool doesIgnoreDataTypeSuffix(StringRef Mnemonic, StringRef DT) {
6935 return Mnemonic.starts_with("vldm") || Mnemonic.starts_with("vstm");
6938 static void applyMnemonicAliases(StringRef &Mnemonic,
6951 void ARMAsmParser::fixupGNULDRDAlias(StringRef Mnemonic,
6954 if (Mnemonic != "ldrd" && Mnemonic != "strd" && Mnemonic != "ldrexd" &&
6955 Mnemonic != "strexd" && Mnemonic != "ldaexd" && Mnemonic != "stlexd")
6958 unsigned IdX = Mnemonic == "strexd" || Mnemonic == "stlexd"
7000 bool ARMAsmParser::CDEConvertDualRegOperand(StringRef Mnemonic,
7003 assert(MS.isCDEDualRegInstr(Mnemonic));
7108 StringRef Mnemonic = Name.slice(Start, Next);
7117 Mnemonic = splitMnemonic(Mnemonic, ExtraToken, PredicationCode, VPTPredicationCode,
7121 if (isThumbOne() && PredicationCode != ARMCC::AL && Mnemonic != "b") {
7125 Operands.push_back(ARMOperand::CreateToken(Mnemonic, NameLoc, *this));
7138 if (Mnemonic == "it" || Mnemonic.starts_with("vpt") ||
7139 Mnemonic.starts_with("vpst")) {
7140 SMLoc Loc = Mnemonic == "it" ? SMLoc::getFromPointer(NameLoc.getPointer() + 2) :
7141 Mnemonic == "vpt" ? SMLoc::getFromPointer(NameLoc.getPointer() + 3) :
7144 if (Mnemonic == "it")
7171 getMnemonicAcceptInfo(Mnemonic, ExtraToken, Name, CanAcceptCarrySet,
7177 return Error(NameLoc, "instruction '" + Mnemonic +
7183 return Error(NameLoc, "instruction '" + Mnemonic +
7190 return Error(NameLoc, "instruction '" + Mnemonic +
7196 SMLoc Loc = SMLoc::getFromPointer(NameLoc.getPointer() + Mnemonic.size());
7203 SMLoc Loc = SMLoc::getFromPointer(NameLoc.getPointer() + Mnemonic.size() +
7213 !(Mnemonic.starts_with("vcvt") && Mnemonic != "vcvta" &&
7214 Mnemonic != "vcvtn" && Mnemonic != "vcvtp" && Mnemonic != "vcvtm")) {
7215 SMLoc Loc = SMLoc::getFromPointer(NameLoc.getPointer() + Mnemonic.size() +
7226 } else if (Mnemonic == "cps" && isMClass()) {
7239 doesIgnoreDataTypeSuffix(Mnemonic, ExtraToken))
7258 // This marks the end of the LHS Mnemonic operators.
7266 if (parseOperand(Operands, Mnemonic)) {
7272 if (parseOperand(Operands, Mnemonic)) {
7281 tryConvertingToTwoOperandForm(Mnemonic, PredicationCode, CarrySetting,
7284 if (hasCDE() && MS.isCDEInstr(Mnemonic)) {
7292 if (MS.isCDEDualRegInstr(Mnemonic)) {
7294 CDEConvertDualRegOperand(Mnemonic, Operands, MnemonicOpsEndInd);
7301 if (!shouldOmitVectorPredicateOperand(Mnemonic, Operands,
7303 Mnemonic == "vmov" && PredicationCode == ARMCC::LT) {
7311 Mnemonic.size() - 1 + CarrySetting);
7316 } else if (Mnemonic == "vcvt" && PredicationCode == ARMCC::NE &&
7317 !shouldOmitVectorPredicateOperand(Mnemonic, Operands,
7327 Mnemonic.size() - 1 + CarrySetting);
7332 } else if (Mnemonic == "vmul" && PredicationCode == ARMCC::LT &&
7333 !shouldOmitVectorPredicateOperand(Mnemonic, Operands,
7343 } else if (Mnemonic.starts_with("vcvt") && !Mnemonic.starts_with("vcvta") &&
7344 !Mnemonic.starts_with("vcvtn") &&
7345 !Mnemonic.starts_with("vcvtp") &&
7346 !Mnemonic.starts_with("vcvtm")) {
7347 if (!shouldOmitVectorPredicateOperand(Mnemonic, Operands,
7355 if (Mnemonic.starts_with("vcvtt") && MnemonicOpsEndInd > 2) {
7366 Mnemonic = Mnemonic.substr(0, 4);
7368 ARMOperand::CreateToken(Mnemonic, MLoc, *this));
7372 Mnemonic.size() + CarrySetting);
7383 if (shouldOmitVectorPredicateOperand(Mnemonic, Operands,
7403 Mnemonic = Name.slice(0, Mnemonic.size() + 1);
7406 ARMOperand::CreateToken(Mnemonic, NameLoc, *this));
7412 // on the Mnemonic based checking to correctly figure out when to put
7415 if (!isThumb() && Mnemonic == "blx" &&
7421 fixupGNULDRDAlias(Mnemonic, Operands, MnemonicOpsEndInd);
7430 bool IsLoad = (Mnemonic == "ldrexd" || Mnemonic == "ldaexd");
7432 (Mnemonic == "ldrexd" || Mnemonic == "strexd" || Mnemonic == "ldaexd" ||
7433 Mnemonic == "stlexd")) {
7469 // so the Mnemonic is the original name "subs" and delete the predicate
7471 if (isThumbTwo() && Mnemonic == "sub" &&
13109 bool ARMAsmParser::isMnemonicVPTPredicable(StringRef Mnemonic,
13114 if (MS.isVPTPredicableCDEInstr(Mnemonic) ||
13115 (Mnemonic.starts_with("vldrh") && Mnemonic != "vldrhi") ||
13116 (Mnemonic.starts_with("vmov") &&
13119 (Mnemonic.starts_with("vrint") && Mnemonic != "vrintr") ||
13120 (Mnemonic.starts_with("vstrh") && Mnemonic != "vstrhi"))
13148 return any_of(predicable_prefixes, [&Mnemonic](const char *prefix) {
13149 return Mnemonic.starts_with(prefix);