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