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,
4154 // Special case for CPS which has a Mnemonic side token for possibly storing
6228 ARMOperand &Mnemonic = static_cast<ARMOperand &>(*Operands[0]);
6229 bool isFconst = Mnemonic.isToken() && (Mnemonic.getToken() == "fconstd" ||
6230 Mnemonic.getToken() == "fconsts");
6276 bool ARMAsmParser::parseOperand(OperandVector &Operands, StringRef Mnemonic) {
6282 ParseStatus ResTy = MatchOperandParserImpl(Operands, Mnemonic);
6299 bool ExpectLabel = Mnemonic == "b" || Mnemonic == "bl";
6309 if (Mnemonic == "vmrs" &&
6339 bool AllowOutOfBoundReg = Mnemonic == "vlldm" || Mnemonic == "vlstm";
6340 return parseRegisterList(Operands, !Mnemonic.starts_with("clr"), false,
6414 if (Mnemonic != "ldr") // only parse for ldr pseudo (e.g. ldr r0, =val)
6540 StringRef ARMAsmParser::splitMnemonic(StringRef Mnemonic, StringRef ExtraToken,
6554 if ((Mnemonic == "movs" && isThumb()) || Mnemonic == "teq" ||
6555 Mnemonic == "vceq" || Mnemonic == "svc" || Mnemonic == "mls" ||
6556 Mnemonic == "smmls" || Mnemonic == "vcls" || Mnemonic == "vmls" ||
6557 Mnemonic == "vnmls" || Mnemonic == "vacge" || Mnemonic == "vcge" ||
6558 Mnemonic == "vclt" || Mnemonic == "vacgt" || Mnemonic == "vaclt" ||
6559 Mnemonic == "vacle" || Mnemonic == "hlt" || Mnemonic == "vcgt" ||
6560 Mnemonic == "vcle" || Mnemonic == "smlal" || Mnemonic == "umaal" ||
6561 Mnemonic == "umlal" || Mnemonic == "vabal" || Mnemonic == "vmlal" ||
6562 Mnemonic == "vpadal" || Mnemonic == "vqdmlal" || Mnemonic == "fmuls" ||
6563 Mnemonic == "vmaxnm" || Mnemonic == "vminnm" || Mnemonic == "vcvta" ||
6564 Mnemonic == "vcvtn" || Mnemonic == "vcvtp" || Mnemonic == "vcvtm" ||
6565 Mnemonic == "vrinta" || Mnemonic == "vrintn" || Mnemonic == "vrintp" ||
6566 Mnemonic == "vrintm" || Mnemonic == "hvc" ||
6567 Mnemonic.starts_with("vsel") || Mnemonic == "vins" ||
6568 Mnemonic == "vmovx" || Mnemonic == "bxns" || Mnemonic == "blxns" ||
6569 Mnemonic == "vdot" || Mnemonic == "vmmla" || Mnemonic == "vudot" ||
6570 Mnemonic == "vsdot" || Mnemonic == "vcmla" || Mnemonic == "vcadd" ||
6571 Mnemonic == "vfmal" || Mnemonic == "vfmsl" || Mnemonic == "wls" ||
6572 Mnemonic == "le" || Mnemonic == "dls" || Mnemonic == "csel" ||
6573 Mnemonic == "csinc" || Mnemonic == "csinv" || Mnemonic == "csneg" ||
6574 Mnemonic == "cinc" || Mnemonic == "cinv" || Mnemonic == "cneg" ||
6575 Mnemonic == "cset" || Mnemonic == "csetm" || Mnemonic == "aut" ||
6576 Mnemonic == "pac" || Mnemonic == "pacbti" || Mnemonic == "bti")
6577 return Mnemonic;
6581 if (Mnemonic != "adcs" && Mnemonic != "bics" && Mnemonic != "movs" &&
6582 Mnemonic != "muls" && Mnemonic != "smlals" && Mnemonic != "smulls" &&
6583 Mnemonic != "umlals" && Mnemonic != "umulls" && Mnemonic != "lsls" &&
6584 Mnemonic != "sbcs" && Mnemonic != "rscs" &&
6586 (Mnemonic == "vmine" || Mnemonic == "vshle" || Mnemonic == "vshlt" ||
6587 Mnemonic == "vshllt" || Mnemonic == "vrshle" || Mnemonic == "vrshlt" ||
6588 Mnemonic == "vmvne" || Mnemonic == "vorne" || Mnemonic == "vnege" ||
6589 Mnemonic == "vnegt" || Mnemonic == "vmule" || Mnemonic == "vmult" ||
6590 Mnemonic == "vrintne" || Mnemonic == "vcmult" ||
6591 Mnemonic == "vcmule" || Mnemonic == "vpsele" || Mnemonic == "vpselt" ||
6592 Mnemonic.starts_with("vq")))) {
6593 unsigned CC = ARMCondCodeFromString(Mnemonic.substr(Mnemonic.size()-2));
6595 Mnemonic = Mnemonic.slice(0, Mnemonic.size() - 2);
6602 if (Mnemonic.ends_with("s") &&
6603 !(Mnemonic == "cps" || Mnemonic == "mls" || Mnemonic == "mrs" ||
6604 Mnemonic == "smmls" || Mnemonic == "vabs" || Mnemonic == "vcls" ||
6605 Mnemonic == "vmls" || Mnemonic == "vmrs" || Mnemonic == "vnmls" ||
6606 Mnemonic == "vqabs" || Mnemonic == "vrecps" || Mnemonic == "vrsqrts" ||
6607 Mnemonic == "srs" || Mnemonic == "flds" || Mnemonic == "fmrs" ||
6608 Mnemonic == "fsqrts" || Mnemonic == "fsubs" || Mnemonic == "fsts" ||
6609 Mnemonic == "fcpys" || Mnemonic == "fdivs" || Mnemonic == "fmuls" ||
6610 Mnemonic == "fcmps" || Mnemonic == "fcmpzs" || Mnemonic == "vfms" ||
6611 Mnemonic == "vfnms" || Mnemonic == "fconsts" || Mnemonic == "bxns" ||
6612 Mnemonic == "blxns" || Mnemonic == "vfmas" || Mnemonic == "vmlas" ||
6613 (Mnemonic == "movs" && isThumb()))) {
6614 Mnemonic = Mnemonic.slice(0, Mnemonic.size() - 1);
6620 if (Mnemonic.starts_with("cps")) {
6623 StringSwitch<unsigned>(Mnemonic.substr(Mnemonic.size()-2, 2))
6628 Mnemonic = Mnemonic.slice(0, Mnemonic.size()-2);
6633 if (isMnemonicVPTPredicable(Mnemonic, ExtraToken) && Mnemonic != "vmovlt" &&
6634 Mnemonic != "vshllt" && Mnemonic != "vrshrnt" && Mnemonic != "vshrnt" &&
6635 Mnemonic != "vqrshrunt" && Mnemonic != "vqshrunt" &&
6636 Mnemonic != "vqrshrnt" && Mnemonic != "vqshrnt" && Mnemonic != "vmullt" &&
6637 Mnemonic != "vqmovnt" && Mnemonic != "vqmovunt" &&
6638 Mnemonic != "vqmovnt" && Mnemonic != "vmovnt" && Mnemonic != "vqdmullt" &&
6639 Mnemonic != "vpnot" && Mnemonic != "vcvtt" && Mnemonic != "vcvt") {
6641 ARMVectorCondCodeFromString(Mnemonic.substr(Mnemonic.size() - 1));
6643 Mnemonic = Mnemonic.slice(0, Mnemonic.size()-1);
6646 return Mnemonic;
6650 if (Mnemonic.starts_with("it")) {
6651 ITMask = Mnemonic.slice(2, Mnemonic.size());
6652 Mnemonic = Mnemonic.slice(0, 2);
6655 if (Mnemonic.starts_with("vpst")) {
6656 ITMask = Mnemonic.slice(4, Mnemonic.size());
6657 Mnemonic = Mnemonic.slice(0, 4);
6658 } else if (Mnemonic.starts_with("vpt")) {
6659 ITMask = Mnemonic.slice(3, Mnemonic.size());
6660 Mnemonic = Mnemonic.slice(0, 3);
6663 return Mnemonic;
6670 void ARMAsmParser::getMnemonicAcceptInfo(StringRef Mnemonic,
6676 CanAcceptVPTPredicationCode = isMnemonicVPTPredicable(Mnemonic, ExtraToken);
6679 Mnemonic == "and" || Mnemonic == "lsl" || Mnemonic == "lsr" ||
6680 Mnemonic == "rrx" || Mnemonic == "ror" || Mnemonic == "sub" ||
6681 Mnemonic == "add" || Mnemonic == "adc" || Mnemonic == "mul" ||
6682 Mnemonic == "bic" || Mnemonic == "asr" || Mnemonic == "orr" ||
6683 Mnemonic == "mvn" || Mnemonic == "rsb" || Mnemonic == "rsc" ||
6684 Mnemonic == "orn" || Mnemonic == "sbc" || Mnemonic == "eor" ||
6685 Mnemonic == "neg" || Mnemonic == "vfm" || Mnemonic == "vfnm" ||
6687 (Mnemonic == "smull" || Mnemonic == "mov" || Mnemonic == "mla" ||
6688 Mnemonic == "smlal" || Mnemonic == "umlal" || Mnemonic == "umull"));
6690 if (Mnemonic == "bkpt" || Mnemonic == "cbnz" || Mnemonic == "setend" ||
6691 Mnemonic == "cps" || Mnemonic == "it" || Mnemonic == "cbz" ||
6692 Mnemonic == "trap" || Mnemonic == "hlt" || Mnemonic == "udf" ||
6693 Mnemonic.starts_with("crc32") || Mnemonic.starts_with("cps") ||
6694 Mnemonic.starts_with("vsel") || Mnemonic == "vmaxnm" ||
6695 Mnemonic == "vminnm" || Mnemonic == "vcvta" || Mnemonic == "vcvtn" ||
6696 Mnemonic == "vcvtp" || Mnemonic == "vcvtm" || Mnemonic == "vrinta" ||
6697 Mnemonic == "vrintn" || Mnemonic == "vrintp" || Mnemonic == "vrintm" ||
6698 Mnemonic.starts_with("aes") || Mnemonic == "hvc" ||
6699 Mnemonic == "setpan" || Mnemonic.starts_with("sha1") ||
6700 Mnemonic.starts_with("sha256") ||
6702 Mnemonic == "vmovx" || Mnemonic == "vins" || Mnemonic == "vudot" ||
6703 Mnemonic == "vsdot" || Mnemonic == "vcmla" || Mnemonic == "vcadd" ||
6704 Mnemonic == "vfmal" || Mnemonic == "vfmsl" || Mnemonic == "vfmat" ||
6705 Mnemonic == "vfmab" || Mnemonic == "vdot" || Mnemonic == "vmmla" ||
6706 Mnemonic == "sb" || Mnemonic == "ssbb" || Mnemonic == "pssbb" ||
6707 Mnemonic == "vsmmla" || Mnemonic == "vummla" || Mnemonic == "vusmmla" ||
6708 Mnemonic == "vusdot" || Mnemonic == "vsudot" || Mnemonic == "bfcsel" ||
6709 Mnemonic == "wls" || Mnemonic == "dls" || Mnemonic == "le" ||
6710 Mnemonic == "csel" || Mnemonic == "csinc" || Mnemonic == "csinv" ||
6711 Mnemonic == "csneg" || Mnemonic == "cinc" || Mnemonic == "cinv" ||
6712 Mnemonic == "cneg" || Mnemonic == "cset" || Mnemonic == "csetm" ||
6713 (hasCDE() && MS.isCDEInstr(Mnemonic) &&
6714 !MS.isITPredicableCDEInstr(Mnemonic)) ||
6715 Mnemonic.starts_with("vpt") || Mnemonic.starts_with("vpst") ||
6716 Mnemonic == "pac" || Mnemonic == "pacbti" || Mnemonic == "aut" ||
6717 Mnemonic == "bti" ||
6719 (Mnemonic.starts_with("vst2") || Mnemonic.starts_with("vld2") ||
6720 Mnemonic.starts_with("vst4") || Mnemonic.starts_with("vld4") ||
6721 Mnemonic.starts_with("wlstp") || Mnemonic.starts_with("dlstp") ||
6722 Mnemonic.starts_with("letp")))) {
6728 Mnemonic != "cdp2" && Mnemonic != "clrex" && Mnemonic != "mcr2" &&
6729 Mnemonic != "mcrr2" && Mnemonic != "mrc2" && Mnemonic != "mrrc2" &&
6730 Mnemonic != "dmb" && Mnemonic != "dfb" && Mnemonic != "dsb" &&
6731 Mnemonic != "isb" && Mnemonic != "pld" && Mnemonic != "pli" &&
6732 Mnemonic != "pldw" && Mnemonic != "ldc2" && Mnemonic != "ldc2l" &&
6733 Mnemonic != "stc2" && Mnemonic != "stc2l" && Mnemonic != "tsb" &&
6734 !Mnemonic.starts_with("rfe") && !Mnemonic.starts_with("srs");
6737 CanAcceptPredicationCode = Mnemonic != "movs";
6739 CanAcceptPredicationCode = Mnemonic != "nop" && Mnemonic != "movs";
6758 StringRef Mnemonic, ARMCC::CondCodes PredicationCode, bool CarrySetting,
6780 if (Mnemonic != "add")
6795 if (!(Mnemonic == "add" || Mnemonic == "sub" || Mnemonic == "and" ||
6796 Mnemonic == "eor" || Mnemonic == "lsl" || Mnemonic == "lsr" ||
6797 Mnemonic == "asr" || Mnemonic == "adc" || Mnemonic == "sbc" ||
6798 Mnemonic == "ror" || Mnemonic == "orr" || Mnemonic == "bic"))
6812 ((Mnemonic == "add" && Op4Reg != ARM::SP) ||
6813 Mnemonic == "and" || Mnemonic == "eor" ||
6814 Mnemonic == "adc" || Mnemonic == "orr")) {
6825 if (((Mnemonic == "add" && CarrySetting) || Mnemonic == "sub") &&
6831 if ((Mnemonic == "add" || Mnemonic == "sub") && LastOp->isImm0_7())
6864 StringRef Mnemonic, OperandVector &Operands, unsigned MnemonicOpsEndInd) {
6868 if (Mnemonic.starts_with("vld2") || Mnemonic.starts_with("vld4") ||
6869 Mnemonic.starts_with("vst2") || Mnemonic.starts_with("vst4"))
6872 if (Mnemonic.starts_with("vctp") || Mnemonic.starts_with("vpnot"))
6875 if (Mnemonic.starts_with("vmov") &&
6876 !(Mnemonic.starts_with("vmovl") || Mnemonic.starts_with("vmovn") ||
6877 Mnemonic.starts_with("vmovx"))) {
6905 static bool doesIgnoreDataTypeSuffix(StringRef Mnemonic, StringRef DT) {
6906 return Mnemonic.starts_with("vldm") || Mnemonic.starts_with("vstm");
6909 static void applyMnemonicAliases(StringRef &Mnemonic,
6922 void ARMAsmParser::fixupGNULDRDAlias(StringRef Mnemonic,
6925 if (Mnemonic != "ldrd" && Mnemonic != "strd" && Mnemonic != "ldrexd" &&
6926 Mnemonic != "strexd" && Mnemonic != "ldaexd" && Mnemonic != "stlexd")
6929 unsigned IdX = Mnemonic == "strexd" || Mnemonic == "stlexd"
6971 bool ARMAsmParser::CDEConvertDualRegOperand(StringRef Mnemonic,
6974 assert(MS.isCDEDualRegInstr(Mnemonic));
7079 StringRef Mnemonic = Name.slice(Start, Next);
7088 Mnemonic = splitMnemonic(Mnemonic, ExtraToken, PredicationCode, VPTPredicationCode,
7092 if (isThumbOne() && PredicationCode != ARMCC::AL && Mnemonic != "b") {
7096 Operands.push_back(ARMOperand::CreateToken(Mnemonic, NameLoc, *this));
7109 if (Mnemonic == "it" || Mnemonic.starts_with("vpt") ||
7110 Mnemonic.starts_with("vpst")) {
7111 SMLoc Loc = Mnemonic == "it" ? SMLoc::getFromPointer(NameLoc.getPointer() + 2) :
7112 Mnemonic == "vpt" ? SMLoc::getFromPointer(NameLoc.getPointer() + 3) :
7115 if (Mnemonic == "it")
7142 getMnemonicAcceptInfo(Mnemonic, ExtraToken, Name, CanAcceptCarrySet,
7148 return Error(NameLoc, "instruction '" + Mnemonic +
7154 return Error(NameLoc, "instruction '" + Mnemonic +
7161 return Error(NameLoc, "instruction '" + Mnemonic +
7167 SMLoc Loc = SMLoc::getFromPointer(NameLoc.getPointer() + Mnemonic.size());
7174 SMLoc Loc = SMLoc::getFromPointer(NameLoc.getPointer() + Mnemonic.size() +
7184 !(Mnemonic.starts_with("vcvt") && Mnemonic != "vcvta" &&
7185 Mnemonic != "vcvtn" && Mnemonic != "vcvtp" && Mnemonic != "vcvtm")) {
7186 SMLoc Loc = SMLoc::getFromPointer(NameLoc.getPointer() + Mnemonic.size() +
7197 } else if (Mnemonic == "cps" && isMClass()) {
7210 doesIgnoreDataTypeSuffix(Mnemonic, ExtraToken))
7229 // This marks the end of the LHS Mnemonic operators.
7237 if (parseOperand(Operands, Mnemonic)) {
7243 if (parseOperand(Operands, Mnemonic)) {
7252 tryConvertingToTwoOperandForm(Mnemonic, PredicationCode, CarrySetting,
7255 if (hasCDE() && MS.isCDEInstr(Mnemonic)) {
7263 if (MS.isCDEDualRegInstr(Mnemonic)) {
7265 CDEConvertDualRegOperand(Mnemonic, Operands, MnemonicOpsEndInd);
7272 if (!shouldOmitVectorPredicateOperand(Mnemonic, Operands,
7274 Mnemonic == "vmov" && PredicationCode == ARMCC::LT) {
7282 Mnemonic.size() - 1 + CarrySetting);
7287 } else if (Mnemonic == "vcvt" && PredicationCode == ARMCC::NE &&
7288 !shouldOmitVectorPredicateOperand(Mnemonic, Operands,
7298 Mnemonic.size() - 1 + CarrySetting);
7303 } else if (Mnemonic == "vmul" && PredicationCode == ARMCC::LT &&
7304 !shouldOmitVectorPredicateOperand(Mnemonic, Operands,
7314 } else if (Mnemonic.starts_with("vcvt") && !Mnemonic.starts_with("vcvta") &&
7315 !Mnemonic.starts_with("vcvtn") &&
7316 !Mnemonic.starts_with("vcvtp") &&
7317 !Mnemonic.starts_with("vcvtm")) {
7318 if (!shouldOmitVectorPredicateOperand(Mnemonic, Operands,
7326 if (Mnemonic.starts_with("vcvtt") && MnemonicOpsEndInd > 2) {
7337 Mnemonic = Mnemonic.substr(0, 4);
7339 ARMOperand::CreateToken(Mnemonic, MLoc, *this));
7343 Mnemonic.size() + CarrySetting);
7354 if (shouldOmitVectorPredicateOperand(Mnemonic, Operands,
7374 Mnemonic = Name.slice(0, Mnemonic.size() + 1);
7377 ARMOperand::CreateToken(Mnemonic, NameLoc, *this));
7383 // on the Mnemonic based checking to correctly figure out when to put
7386 if (!isThumb() && Mnemonic == "blx" &&
7392 fixupGNULDRDAlias(Mnemonic, Operands, MnemonicOpsEndInd);
7401 bool IsLoad = (Mnemonic == "ldrexd" || Mnemonic == "ldaexd");
7403 (Mnemonic == "ldrexd" || Mnemonic == "strexd" || Mnemonic == "ldaexd" ||
7404 Mnemonic == "stlexd")) {
7440 // so the Mnemonic is the original name "subs" and delete the predicate
7442 if (isThumbTwo() && Mnemonic == "sub" &&
13054 bool ARMAsmParser::isMnemonicVPTPredicable(StringRef Mnemonic,
13059 if (MS.isVPTPredicableCDEInstr(Mnemonic) ||
13060 (Mnemonic.starts_with("vldrh") && Mnemonic != "vldrhi") ||
13061 (Mnemonic.starts_with("vmov") &&
13064 (Mnemonic.starts_with("vrint") && Mnemonic != "vrintr") ||
13065 (Mnemonic.starts_with("vstrh") && Mnemonic != "vstrhi"))
13095 [&Mnemonic](const char *prefix) { return Mnemonic.starts_with(prefix); });