diff options
author | Daniel Dunbar <daniel@zuster.org> | 2009-07-30 17:37:43 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2009-07-30 17:37:43 +0000 |
commit | fe09b2098ac483f6d6ce6ea4ab237a9539bdb6b9 (patch) | |
tree | f84ede60d01bb0b508d25d0b779101a5e28c1e09 /utils/TableGen | |
parent | e802f1c4c3c4d1e27117c66d428715d01fda385d (diff) | |
download | external_llvm-fe09b2098ac483f6d6ce6ea4ab237a9539bdb6b9.zip external_llvm-fe09b2098ac483f6d6ce6ea4ab237a9539bdb6b9.tar.gz external_llvm-fe09b2098ac483f6d6ce6ea4ab237a9539bdb6b9.tar.bz2 |
Twines: Don't allow implicit conversion from integers, this is too tricky.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@77605 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils/TableGen')
-rw-r--r-- | utils/TableGen/AsmMatcherEmitter.cpp | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/utils/TableGen/AsmMatcherEmitter.cpp b/utils/TableGen/AsmMatcherEmitter.cpp index d00ff20..45a1c86 100644 --- a/utils/TableGen/AsmMatcherEmitter.cpp +++ b/utils/TableGen/AsmMatcherEmitter.cpp @@ -17,6 +17,32 @@ #include "Record.h" using namespace llvm; +static std::string FlattenVariants(const std::string &AsmString, + unsigned Index) { + StringRef Cur = AsmString; + std::string Res = ""; + + for (;;) { + std::pair<StringRef, StringRef> Split = Cur.split('{'); + + Res += Split.first; + if (Split.second.empty()) + break; + + std::pair<StringRef, StringRef> Inner = Cur.split('}'); + StringRef Selection = Inner.first; + for (unsigned i = 0; i != Index; ++i) + Selection = Selection.split('|').second; + Selection = Selection.split('|').first; + + Res += Selection; + + Cur = Inner.second; + } + + return Res; +} + void AsmMatcherEmitter::run(raw_ostream &OS) { CodeGenTarget Target; const std::vector<CodeGenRegister> &Registers = Target.getRegisters(); @@ -44,4 +70,29 @@ void AsmMatcherEmitter::run(raw_ostream &OS) { } OS << " return true;\n"; OS << "}\n"; + + // Emit the function to match instructions. + std::vector<const CodeGenInstruction*> NumberedInstructions; + Target.getInstructionsByEnumValue(NumberedInstructions); + + const std::map<std::string, CodeGenInstruction> &Instructions = + Target.getInstructions(); + for (std::map<std::string, CodeGenInstruction>::const_iterator + it = Instructions.begin(), ie = Instructions.end(); it != ie; ++it) { + const CodeGenInstruction &CGI = it->second; + + if (it->first != "SUB8rr") + continue; + + /* +def SUB8rr : I<0x28, MRMDestReg, (outs GR8:$dst), (ins GR8:$src1, GR8:$src2), + "sub{b}\t{$src2, $dst|$dst, $src2}", + [(set GR8:$dst, (sub GR8:$src1, GR8:$src2)), + (implicit EFLAGS)]>; + */ + + outs() << it->first << " " + << FlattenVariants(CGI.AsmString, 0) + << "\n"; + } } |