summaryrefslogtreecommitdiff
path: root/utils
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2009-07-30 17:37:43 +0000
committerDaniel Dunbar <daniel@zuster.org>2009-07-30 17:37:43 +0000
commitfe09b2098ac483f6d6ce6ea4ab237a9539bdb6b9 (patch)
treef84ede60d01bb0b508d25d0b779101a5e28c1e09 /utils
parente802f1c4c3c4d1e27117c66d428715d01fda385d (diff)
downloadllvm-fe09b2098ac483f6d6ce6ea4ab237a9539bdb6b9.tar.gz
llvm-fe09b2098ac483f6d6ce6ea4ab237a9539bdb6b9.tar.bz2
llvm-fe09b2098ac483f6d6ce6ea4ab237a9539bdb6b9.tar.xz
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')
-rw-r--r--utils/TableGen/AsmMatcherEmitter.cpp51
1 files changed, 51 insertions, 0 deletions
diff --git a/utils/TableGen/AsmMatcherEmitter.cpp b/utils/TableGen/AsmMatcherEmitter.cpp
index d00ff202ad..45a1c8622a 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";
+ }
}