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