diff options
author | Chris Lattner <sabre@nondot.org> | 2011-04-18 06:22:33 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2011-04-18 06:22:33 +0000 |
commit | 1518afddea6c0a4275a9ac64a9ffe2b6b4c0600a (patch) | |
tree | f09998e754d0346e63168c3547b3d67c2c9fc880 /utils/TableGen/CodeGenDAGPatterns.h | |
parent | 1023643d501b4375b261eb5449a2bb0195f49780 (diff) |
Implement major new fastisel functionality: the matcher can now handle immediates with
value constraints on them (when defined as ImmLeaf's). This is particularly important
for X86-64, where almost all reg/imm instructions take a i64immSExt32 immediate operand,
which has a value constraint. Before this patch we ended up iseling the examples into
such amazing code as:
movabsq $7, %rax
imulq %rax, %rdi
movq %rdi, %rax
ret
now we produce:
imulq $7, %rdi, %rax
ret
This dramatically shrinks the generated code at -O0 on x86-64.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@129691 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils/TableGen/CodeGenDAGPatterns.h')
-rw-r--r-- | utils/TableGen/CodeGenDAGPatterns.h | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/utils/TableGen/CodeGenDAGPatterns.h b/utils/TableGen/CodeGenDAGPatterns.h index b113a59e4a..e4e8574bbc 100644 --- a/utils/TableGen/CodeGenDAGPatterns.h +++ b/utils/TableGen/CodeGenDAGPatterns.h @@ -257,6 +257,17 @@ public: /// isAlwaysTrue - Return true if this is a noop predicate. bool isAlwaysTrue() const; + bool isImmediatePattern() const { return !getImmCode().empty(); } + + /// getImmediatePredicateCode - Return the code that evaluates this pattern if + /// this is an immediate predicate. It is an error to call this on a + /// non-immediate pattern. + std::string getImmediatePredicateCode() const { + std::string Result = getImmCode(); + assert(!Result.empty() && "Isn't an immediate pattern!"); + return Result; + } + bool operator==(const TreePredicateFn &RHS) const { return PatFragRec == RHS.PatFragRec; |