diff options
author | Chris Lattner <sabre@nondot.org> | 2007-01-16 06:39:48 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2007-01-16 06:39:48 +0000 |
commit | 03a6d96d320d5a0b689aeccca19a0510c4badfa9 (patch) | |
tree | a176b125fc4a4fc282129582b5df8c0fbb92b112 | |
parent | c4e664bb9d640e7b04f6fce23830dfb808895b31 (diff) |
add a note: we need whole-function selectiondags :)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@33252 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Target/README.txt | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/lib/Target/README.txt b/lib/Target/README.txt index 9ea0a91daf..2f6ecfacd1 100644 --- a/lib/Target/README.txt +++ b/lib/Target/README.txt @@ -387,3 +387,31 @@ void good(unsigned x) to enable further optimizations. //===---------------------------------------------------------------------===// + +Consider: + +typedef unsigned U32; +typedef unsigned long long U64; +int test (U32 *inst, U64 *regs) { + U64 effective_addr2; + U32 temp = *inst; + int r1 = (temp >> 20) & 0xf; + int b2 = (temp >> 16) & 0xf; + effective_addr2 = temp & 0xfff; + if (b2) effective_addr2 += regs[b2]; + b2 = (temp >> 12) & 0xf; + if (b2) effective_addr2 += regs[b2]; + effective_addr2 &= regs[4]; + if ((effective_addr2 & 3) == 0) + return 1; + return 0; +} + +Note that only the low 2 bits of effective_addr2 are used. On 32-bit systems, +we don't eliminate the computation of the top half of effective_addr2 because +we don't have whole-function selection dags. On x86, this means we use one +extra register for the function when effective_addr2 is declared as U64 than +when it is declared U32. + +//===---------------------------------------------------------------------===// + |