From c621ae7bba11f98163633bc6dde41f9e8a326a78 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sat, 2 Jun 2007 18:45:14 +0000 Subject: [PATCH] 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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@37400 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/ARM/README-Thumb.txt | 83 ++++++++++++++++++++++++++------- 1 file changed, 66 insertions(+), 17 deletions(-) diff --git a/lib/Target/ARM/README-Thumb.txt b/lib/Target/ARM/README-Thumb.txt index 63bc004552c..380097d186c 100644 --- a/lib/Target/ARM/README-Thumb.txt +++ b/lib/Target/ARM/README-Thumb.txt @@ -67,25 +67,9 @@ LPCRELL0: //===---------------------------------------------------------------------===// -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 @@ entry.ce: ; preds = %newFuncRoot 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 @@ L12: .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 + //===---------------------------------------------------------------------===//