[llvm-commits] CVS: llvm/lib/Target/ARM/README-Thumb.txt
Chris Lattner
sabre at nondot.org
Sat Jun 2 11:45:36 PDT 2007
Changes in directory llvm/lib/Target/ARM:
README-Thumb.txt updated: 1.10 -> 1.11
---
Log message:
update this entry, now that Anton implemented shift/and lowering for
switches. There is one really easy isel thing here with tst we are not
getting.
---
Diffs of the changes: (+66 -17)
README-Thumb.txt | 83 +++++++++++++++++++++++++++++++++++++++++++------------
1 files changed, 66 insertions(+), 17 deletions(-)
Index: llvm/lib/Target/ARM/README-Thumb.txt
diff -u llvm/lib/Target/ARM/README-Thumb.txt:1.10 llvm/lib/Target/ARM/README-Thumb.txt:1.11
--- llvm/lib/Target/ARM/README-Thumb.txt:1.10 Thu Mar 29 16:40:13 2007
+++ llvm/lib/Target/ARM/README-Thumb.txt Sat Jun 2 13:45:14 2007
@@ -67,25 +67,9 @@
//===---------------------------------------------------------------------===//
-We compiles the following using a jump table.
+We compiles the following:
define i16 @func_entry_2E_ce(i32 %i) {
-newFuncRoot:
- br label %entry.ce
-
-bb12.exitStub: ; preds = %entry.ce
- ret i16 0
-
-bb4.exitStub: ; preds = %entry.ce, %entry.ce, %entry.ce
- ret i16 1
-
-bb9.exitStub: ; preds = %entry.ce, %entry.ce, %entry.ce
- ret i16 2
-
-bb.exitStub: ; preds = %entry.ce
- ret i16 3
-
-entry.ce: ; preds = %newFuncRoot
switch i32 %i, label %bb12.exitStub [
i32 0, label %bb4.exitStub
i32 1, label %bb9.exitStub
@@ -95,8 +79,58 @@
i32 8, label %bb.exitStub
i32 9, label %bb9.exitStub
]
+
+bb12.exitStub:
+ ret i16 0
+
+bb4.exitStub:
+ ret i16 1
+
+bb9.exitStub:
+ ret i16 2
+
+bb.exitStub:
+ ret i16 3
}
+into:
+
+_func_entry_2E_ce:
+ mov r2, #1
+ lsl r2, r0
+ cmp r0, #9
+ bhi LBB1_4 @bb12.exitStub
+LBB1_1: @newFuncRoot
+ mov r1, #13
+ tst r2, r1
+ bne LBB1_5 @bb4.exitStub
+LBB1_2: @newFuncRoot
+ ldr r1, LCPI1_0
+ tst r2, r1
+ bne LBB1_6 @bb9.exitStub
+LBB1_3: @newFuncRoot
+ mov r1, #1
+ lsl r1, r1, #8
+ tst r2, r1
+ bne LBB1_7 @bb.exitStub
+LBB1_4: @bb12.exitStub
+ mov r0, #0
+ bx lr
+LBB1_5: @bb4.exitStub
+ mov r0, #1
+ bx lr
+LBB1_6: @bb9.exitStub
+ mov r0, #2
+ bx lr
+LBB1_7: @bb.exitStub
+ mov r0, #3
+ bx lr
+LBB1_8:
+ .align 2
+LCPI1_0:
+ .long 642
+
+
gcc compiles to:
cmp r0, #9
@@ -124,6 +158,21 @@
.align 2
L11:
.long 642
+
+
+GCC is doing a couple of clever things here:
+ 1. It is predicating one of the returns. This isn't a clear win though: in
+ cases where that return isn't taken, it is replacing one condbranch with
+ two 'ne' predicated instructions.
+ 2. It is sinking the shift of "1 << i" into the tst, and using ands instead of
+ tst. This will probably require whole function isel.
+ 3. GCC emits:
+ tst r1, #256
+ we emit:
+ mov r1, #1
+ lsl r1, r1, #8
+ tst r2, r1
+
//===---------------------------------------------------------------------===//
More information about the llvm-commits
mailing list