void PredicateExpander::expandCheckOpcode(formatted_raw_ostream &OS, const RecVec &Opcodes) { assert(!Opcodes.empty() && "Expected at least one opcode to check!"); bool First = true; if (Opcodes.size() == 1) { OS << "( "; expandCheckOpcode(OS, Opcodes[0]); OS << " )"; return; } OS << '('; increaseIndentLevel(); for (const Record *Rec : Opcodes) { OS << '\n'; OS.PadToColumn(getIndentLevel() * 2); if (!First) OS << (shouldNegate() ? "&& " : "|| "); expandCheckOpcode(OS, Rec); First = false; } OS << '\n'; decreaseIndentLevel(); OS.PadToColumn(getIndentLevel() * 2); OS << ')'; }
void PredicateExpander::expandPredicateSequence(formatted_raw_ostream &OS, const RecVec &Sequence, bool IsCheckAll) { assert(!Sequence.empty() && "Found an invalid empty predicate set!"); if (Sequence.size() == 1) return expandPredicate(OS, Sequence[0]); // Okay, there is more than one predicate in the set. bool First = true; OS << (shouldNegate() ? "!(" : "("); increaseIndentLevel(); bool OldValue = shouldNegate(); setNegatePredicate(false); for (const Record *Rec : Sequence) { OS << '\n'; OS.PadToColumn(getIndentLevel() * 2); if (!First) OS << (IsCheckAll ? "&& " : "|| "); expandPredicate(OS, Rec); First = false; } OS << '\n'; decreaseIndentLevel(); OS.PadToColumn(getIndentLevel() * 2); OS << ')'; setNegatePredicate(OldValue); }
void getNoteLength() { if (currentLine >= (int)lines.size()) { noteLength = 0; return; } //if (isHeaderLine(currentLine)) { //Read until 2 blank lines } int indent = getIndentLevel(lines[currentLine]); int line = currentLine + 1; while (line < (int)lines.size()) { if ( indent < getIndentLevel(lines[line]) ) { ++line; } else if ( isSymbolLine(line) && (indent == getIndentLevel(lines[line]))) { ++line; } else { break; } } if (NEWLINE_AFTER_NOTE && lines[line].empty()) { ++line; } noteLength = line - currentLine; }
void PredicateExpander::expandPredicate(formatted_raw_ostream &OS, const Record *Rec) { OS.flush(); unsigned ColNum = getIndentLevel() * 2; if (OS.getColumn() < ColNum) OS.PadToColumn(ColNum); if (Rec->isSubClassOf("MCTrue")) { if (shouldNegate()) return expandFalse(OS); return expandTrue(OS); } if (Rec->isSubClassOf("MCFalse")) { if (shouldNegate()) return expandTrue(OS); return expandFalse(OS); } if (Rec->isSubClassOf("CheckNot")) { flipNegatePredicate(); expandPredicate(OS, Rec->getValueAsDef("Pred")); flipNegatePredicate(); return; } if (Rec->isSubClassOf("CheckIsRegOperand")) return expandCheckIsRegOperand(OS, Rec->getValueAsInt("OpIndex")); if (Rec->isSubClassOf("CheckIsImmOperand")) return expandCheckIsImmOperand(OS, Rec->getValueAsInt("OpIndex")); if (Rec->isSubClassOf("CheckRegOperand")) return expandCheckRegOperand(OS, Rec->getValueAsInt("OpIndex"), Rec->getValueAsDef("Reg")); if (Rec->isSubClassOf("CheckInvalidRegOperand")) return expandCheckInvalidRegOperand(OS, Rec->getValueAsInt("OpIndex")); if (Rec->isSubClassOf("CheckImmOperand")) return expandCheckImmOperand(OS, Rec->getValueAsInt("OpIndex"), Rec->getValueAsInt("ImmVal")); if (Rec->isSubClassOf("CheckImmOperand_s")) return expandCheckImmOperand(OS, Rec->getValueAsInt("OpIndex"), Rec->getValueAsString("ImmVal")); if (Rec->isSubClassOf("CheckSameRegOperand")) return expandCheckSameRegOperand(OS, Rec->getValueAsInt("FirstIndex"), Rec->getValueAsInt("SecondIndex")); if (Rec->isSubClassOf("CheckNumOperands")) return expandCheckNumOperands(OS, Rec->getValueAsInt("NumOps")); if (Rec->isSubClassOf("CheckPseudo")) return expandCheckPseudo(OS, Rec->getValueAsListOfDefs("ValidOpcodes")); if (Rec->isSubClassOf("CheckOpcode")) return expandCheckOpcode(OS, Rec->getValueAsListOfDefs("ValidOpcodes")); if (Rec->isSubClassOf("CheckAll")) return expandPredicateSequence(OS, Rec->getValueAsListOfDefs("Predicates"), /* AllOf */ true); if (Rec->isSubClassOf("CheckAny")) return expandPredicateSequence(OS, Rec->getValueAsListOfDefs("Predicates"), /* AllOf */ false); if (Rec->isSubClassOf("CheckFunctionPredicate")) return expandCheckFunctionPredicate( OS, Rec->getValueAsString("MCInstFnName"), Rec->getValueAsString("MachineInstrFnName")); if (Rec->isSubClassOf("CheckNonPortable")) return expandCheckNonPortable(OS, Rec->getValueAsString("CodeBlock")); if (Rec->isSubClassOf("TIIPredicate")) return expandTIIFunctionCall(OS, Rec->getValueAsString("TargetName"), Rec->getValueAsString("FunctionName")); llvm_unreachable("No known rules to expand this MCInstPredicate"); }