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