]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/kc/gc.h
abaco: cleanup, handle image/x-icon, don't use backspace as a hotkey, and remove...
[plan9front.git] / sys / src / cmd / kc / gc.h
1 #include        "../cc/cc.h"
2 #include        "../kc/k.out.h"
3
4 /*
5  * kc/sparc
6  * Sun sparc
7  */
8 #define SZ_CHAR         1
9 #define SZ_SHORT        2
10 #define SZ_INT          4
11 #define SZ_LONG         4
12 #define SZ_VLONG        8
13 #define SZ_IND          4
14 #define SZ_FLOAT        4
15 #define SZ_DOUBLE       8
16 #define FNX             100
17
18 typedef struct  Adr     Adr;
19 typedef struct  Prog    Prog;
20 typedef struct  Case    Case;
21 typedef struct  C1      C1;
22 typedef struct  Multab  Multab;
23 typedef struct  Hintab  Hintab;
24 typedef struct  Var     Var;
25 typedef struct  Reg     Reg;
26 typedef struct  Rgn     Rgn;
27
28 struct  Adr
29 {
30         long    offset;
31         double  dval;
32         char    sval[NSNAME];
33
34         Sym*    sym;
35         char    type;
36         char    reg;
37         char    name;
38         char    etype;
39 };
40 #define A       ((Adr*)0)
41
42 #define INDEXED 9
43 struct  Prog
44 {
45         Adr     from;
46         Adr     to;
47         Prog*   link;
48         long    lineno;
49         short   as;
50         char    reg;
51 };
52 #define P       ((Prog*)0)
53
54 struct  Case
55 {
56         Case*   link;
57         vlong   val;
58         long    label;
59         char    def;
60         char isv;
61 };
62 #define C       ((Case*)0)
63
64 struct  C1
65 {
66         vlong   val;
67         long    label;
68 };
69
70 struct  Multab
71 {
72         long    val;
73         char    code[20];
74 };
75
76 struct  Hintab
77 {
78         ushort  val;
79         char    hint[10];
80 };
81
82 struct  Var
83 {
84         long    offset;
85         Sym*    sym;
86         char    name;
87         char    etype;
88 };
89
90 struct  Reg
91 {
92         long    pc;
93         long    rpo;            /* reverse post ordering */
94
95         Bits    set;
96         Bits    use1;
97         Bits    use2;
98
99         Bits    refbehind;
100         Bits    refahead;
101         Bits    calbehind;
102         Bits    calahead;
103         Bits    regdiff;
104         Bits    act;
105
106         long    regu;
107         long    loop;           /* could be shorter */
108
109         Reg*    log5;
110         long    active;
111
112         Reg*    p1;
113         Reg*    p2;
114         Reg*    p2link;
115         Reg*    s1;
116         Reg*    s2;
117         Reg*    link;
118         Prog*   prog;
119 };
120 #define R       ((Reg*)0)
121
122 #define NRGN    600
123 struct  Rgn
124 {
125         Reg*    enter;
126         short   cost;
127         short   varno;
128         short   regno;
129 };
130
131 EXTERN  long    breakpc;
132 EXTERN  long    nbreak;
133 EXTERN  Case*   cases;
134 EXTERN  Node    constnode;
135 EXTERN  Node    fconstnode;
136 EXTERN  long    continpc;
137 EXTERN  long    curarg;
138 EXTERN  long    cursafe;
139 EXTERN  Prog*   firstp;
140 EXTERN  Prog*   lastp;
141 EXTERN  int     hintabsize;
142 EXTERN  long    maxargsafe;
143 EXTERN  Multab  multab[20];
144 EXTERN  int     mnstring;
145 EXTERN  Node*   nodrat;
146 EXTERN  Node*   nodret;
147 EXTERN  Node*   nodsafe;
148 EXTERN  long    nrathole;
149 EXTERN  long    nstring;
150 EXTERN  Prog*   p;
151 EXTERN  long    pc;
152 EXTERN  Node    regnode;
153 EXTERN  char    string[NSNAME];
154 EXTERN  Sym*    symrathole;
155 EXTERN  Node    znode;
156 EXTERN  Prog    zprog;
157 EXTERN  char    reg[NREG+NREG];
158 EXTERN  long    exregoffset;
159 EXTERN  long    exfregoffset;
160
161 #define BLOAD(r)        band(bnot(r->refbehind), r->refahead)
162 #define BSTORE(r)       band(bnot(r->calbehind), r->calahead)
163 #define LOAD(r)         (~r->refbehind.b[z] & r->refahead.b[z])
164 #define STORE(r)        (~r->calbehind.b[z] & r->calahead.b[z])
165
166 #define bset(a,n)       ((a).b[(n)/32]&(1L<<(n)%32))
167
168 #define CLOAD   5
169 #define CREF    5
170 #define CINF    1000
171 #define LOOP    3
172
173 EXTERN  Rgn     region[NRGN];
174 EXTERN  Rgn*    rgp;
175 EXTERN  int     nregion;
176 EXTERN  int     nvar;
177
178 EXTERN  Bits    externs;
179 EXTERN  Bits    params;
180 EXTERN  Bits    consts;
181 EXTERN  Bits    addrs;
182
183 EXTERN  long    regbits;
184 EXTERN  long    exregbits;
185
186 EXTERN  int     change;
187 EXTERN  int     suppress;
188
189 EXTERN  Reg*    firstr;
190 EXTERN  Reg*    lastr;
191 EXTERN  Reg     zreg;
192 EXTERN  Reg*    freer;
193 EXTERN  Var     var[NVAR];
194 EXTERN  long*   idom;
195 EXTERN  Reg**   rpo2r;
196 EXTERN  long    maxnr;
197
198 extern  char*   anames[];
199 extern  Hintab  hintab[];
200
201 /*
202  * sgen.c
203  */
204 void    codgen(Node*, Node*);
205 void    gen(Node*);
206 void    usedset(Node*, int);
207 void    noretval(int);
208 void    xcom(Node*);
209 int     bcomplex(Node*, Node*);
210
211 /*
212  * cgen.c
213  */
214 void    cgen(Node*, Node*);
215 void    reglcgen(Node*, Node*, Node*);
216 void    lcgen(Node*, Node*);
217 void    bcgen(Node*, int);
218 void    boolgen(Node*, int, Node*);
219 void    sugen(Node*, Node*, long);
220 void    layout(Node*, Node*, int, int, Node*);
221
222 /*
223  * txt.c
224  */
225 void    ginit(void);
226 void    gclean(void);
227 void    nextpc(void);
228 void    gargs(Node*, Node*, Node*);
229 void    garg1(Node*, Node*, Node*, int, Node**);
230 Node*   nodconst(long);
231 Node*   nod32const(vlong);
232 Node*   nodfconst(double);
233 void    nodreg(Node*, Node*, int);
234 void    regret(Node*, Node*);
235 void    regalloc(Node*, Node*, Node*);
236 void    regfree(Node*);
237 void    regialloc(Node*, Node*, Node*);
238 void    regsalloc(Node*, Node*);
239 void    regaalloc1(Node*, Node*);
240 void    regaalloc(Node*, Node*);
241 void    regind(Node*, Node*);
242 void    gprep(Node*, Node*);
243 void    raddr(Node*, Prog*);
244 void    naddr(Node*, Adr*);
245 void    gmove(Node*, Node*);
246 void    gins(int a, Node*, Node*);
247 void    gopcode(int, Node*, Node*, Node*);
248 int     samaddr(Node*, Node*);
249 void    gbranch(int);
250 void    patch(Prog*, long);
251 int     sconst(Node*);
252 int     sval(long);
253 void    gpseudo(int, Sym*, Node*);
254
255 /*
256  * swt.c
257  */
258 int     swcmp(const void*, const void*);
259 void    doswit(Node*);
260 void    swit1(C1*, int, long, Node*);
261 void    swit2(C1*, int, long, Node*, Node*);
262 void    casf(void);
263 void    bitload(Node*, Node*, Node*, Node*, Node*);
264 void    bitstore(Node*, Node*, Node*, Node*, Node*);
265 long    outstring(char*, long);
266 int     mulcon(Node*, Node*);
267 Multab* mulcon0(Node*, long);
268 int     mulcon1(Node*, long, Node*);
269 void    nullwarn(Node*, Node*);
270 void    sextern(Sym*, Node*, long, long);
271 void    gextern(Sym*, Node*, long, long);
272 void    outcode(void);
273 void    ieeedtod(Ieee*, double);
274
275 /*
276  * list
277  */
278 void    listinit(void);
279 int     Pconv(Fmt*);
280 int     Aconv(Fmt*);
281 int     Dconv(Fmt*);
282 int     Sconv(Fmt*);
283 int     Nconv(Fmt*);
284 int     Bconv(Fmt*);
285
286 /*
287  * reg.c
288  */
289 Reg*    rega(void);
290 int     rcmp(const void*, const void*);
291 void    regopt(Prog*);
292 void    addmove(Reg*, int, int, int);
293 Bits    mkvar(Adr*, int);
294 void    prop(Reg*, Bits, Bits);
295 void    loopit(Reg*, long);
296 void    synch(Reg*, Bits);
297 ulong   allreg(ulong, Rgn*);
298 void    paint1(Reg*, int);
299 ulong   paint2(Reg*, int);
300 void    paint3(Reg*, int, long, int);
301 void    addreg(Adr*, int);
302
303 /*
304  * peep.c
305  */
306 void    peep(void);
307 void    excise(Reg*);
308 Reg*    uniqp(Reg*);
309 Reg*    uniqs(Reg*);
310 int     regtyp(Adr*);
311 int     regzer(Adr*);
312 int     anyvar(Adr*);
313 int     subprop(Reg*);
314 int     copyprop(Reg*);
315 int     copy1(Adr*, Adr*, Reg*, int);
316 int     copyu(Prog*, Adr*, Adr*);
317
318 int     copyas(Adr*, Adr*);
319 int     copyau(Adr*, Adr*);
320 int     copyau1(Prog*, Adr*);
321 int     copysub(Adr*, Adr*, Adr*, int);
322 int     copysub1(Prog*, Adr*, Adr*, int);
323
324 long    RtoB(int);
325 long    FtoB(int);
326 int     BtoR(long);
327 int     BtoF(long);
328
329 /*
330  * com64.c
331  */
332 int     com64(Node*);
333 void    com64init(void);
334 void    bool64(Node*);
335
336 #pragma varargck        type    "A"     int
337 #pragma varargck        type    "B"     Bits
338 #pragma varargck        type    "D"     Adr*
339 #pragma varargck        type    "N"     Adr*
340 #pragma varargck        type    "P"     Prog*
341 #pragma varargck        type    "S"     char*