jump table note
[oota-llvm.git] / lib / Target / Alpha / README.txt
1 Fix jump table support.  currently it uses 64bit absolute address. 
2 gcc uses gprel32.  This way I won't keep fighting Evan as he keeps
3 breaking 64bit entries in jump tables...
4
5 #include <string.h>
6 #include <setjmp.h>
7
8 int main(int x, char** y)
9 {
10 char* foo;
11 switch(x) {
12 case 1:
13 foo = "1";
14 break;
15 case 2:
16 foo = "2";
17 break;
18 case 3:
19 foo = "3";
20 break;
21 case 4:
22 foo = "4";
23 break;
24 case 5:
25 foo = "5";
26 break;
27 case 6:
28 foo = "6";
29 break;
30 case 7:
31 foo = "7";
32 break;
33 case 8:
34 foo = "8";
35 break;
36 };
37 print(foo);
38 return 0;
39
40 }
41
42
43         .set noreorder
44         .set volatile
45         .set noat
46         .set nomacro
47         .section        .rodata.str1.1,"aMS",@progbits,1
48 $LC6:
49         .ascii "7\0"
50 $LC7:
51         .ascii "8\0"
52 $LC0:
53         .ascii "1\0"
54 $LC1:
55         .ascii "2\0"
56 $LC2:
57         .ascii "3\0"
58 $LC3:
59         .ascii "4\0"
60 $LC4:
61         .ascii "5\0"
62 $LC5:
63         .ascii "6\0"
64         .text
65         .align 2
66         .align 4
67         .globl main
68         .ent main
69 main:
70         .frame $30,16,$26,0
71         .mask 0x4000000,-16
72         ldah $29,0($27)         !gpdisp!1
73         lda $29,0($29)          !gpdisp!1
74 $main..ng:
75         zapnot $16,15,$16
76         lda $30,-16($30)
77         cmpule $16,8,$1
78         stq $26,0($30)
79         .prologue 1
80         beq $1,$L2
81         ldah $6,$L11($29)               !gprelhigh
82         lda $5,$L11($6)         !gprellow
83         s4addq $16,$5,$0
84         ldl $2,0($0)
85         addq $29,$2,$3
86         jmp $31,($3),$L2
87         .section        .rodata
88         .align 2
89         .align 2
90 $L11:
91         .gprel32 $L2
92         .gprel32 $L3
93         .gprel32 $L4
94         .gprel32 $L5
95         .gprel32 $L6
96         .gprel32 $L7
97         .gprel32 $L8
98         .gprel32 $L9
99         .gprel32 $L10
100         .text
101 $L9:
102         ldah $20,$LC6($29)              !gprelhigh
103         lda $4,$LC6($20)                !gprellow
104         .align 4
105 $L2:
106         mov $4,$16
107         ldq $27,print($29)              !literal!2
108         jsr $26,($27),print             !lituse_jsr!2
109         ldah $29,0($26)         !gpdisp!3
110         mov $31,$0
111         bis $31,$31,$31
112         lda $29,0($29)          !gpdisp!3
113         ldq $26,0($30)
114         lda $30,16($30)
115         ret $31,($26),1
116 $L10:
117         ldah $21,$LC7($29)              !gprelhigh
118         lda $4,$LC7($21)                !gprellow
119         br $31,$L2
120 $L3:
121         ldah $7,$LC0($29)               !gprelhigh
122         lda $4,$LC0($7)         !gprellow
123         br $31,$L2
124 $L4:
125         ldah $8,$LC1($29)               !gprelhigh
126         lda $4,$LC1($8)         !gprellow
127         br $31,$L2
128 $L5:
129         ldah $16,$LC2($29)              !gprelhigh
130         lda $4,$LC2($16)                !gprellow
131         br $31,$L2
132 $L6:
133         ldah $17,$LC3($29)              !gprelhigh
134         lda $4,$LC3($17)                !gprellow
135         br $31,$L2
136 $L7:
137         ldah $18,$LC4($29)              !gprelhigh
138         lda $4,$LC4($18)                !gprellow
139         br $31,$L2
140 $L8:
141         ldah $19,$LC5($29)              !gprelhigh
142         lda $4,$LC5($19)                !gprellow
143         br $31,$L2
144         .end main
145         .section        .note.GNU-stack,"",@progbits
146         .ident  "GCC: (GNU) 3.4.4 20050314 (prerelease) (Debian 3.4.3-13)"
147
148
149
150
151 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
152 Fix Ordered/Unordered FP stuff
153
154
155 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
156 improve bytezap opertunities
157 ulong %foo(ulong %y) {
158 entry:
159         %tmp = and ulong %y,  65535
160         %tmp2 = shr ulong %tmp,  ubyte 3
161         ret ulong %tmp2
162 }
163
164
165 compiles to a 3 instruction sequence without instcombine
166         zapnot $16,3,$0
167         srl $0,3,$0
168         ret $31,($26),1
169  
170 After instcombine you get
171 ulong %foo(ulong %y) {
172 entry:
173         %tmp = shr ulong %y, ubyte 3            ; <ulong> [#uses=1]
174         %tmp2 = and ulong %tmp, 8191            ; <ulong> [#uses=1]
175         ret ulong %tmp2
176 }
177
178 which compiles to
179         lda $0,8191($31)
180         srl $16,3,$1
181         and $1,$0,$0
182         ret $31,($26),1
183