4 #include "../7c/7.out.h"
10 #define LIBNAMELEN 300
12 void addlibpath(char*);
13 int fileexists(char*);
17 typedef struct Adr Adr;
18 typedef struct Autom Auto;
19 typedef struct Count Count;
20 typedef struct Ieee Ieee;
21 typedef struct Prog Prog;
22 typedef struct Sym Sym;
23 typedef struct Mask Mask;
24 typedef struct Optab Optab;
25 typedef struct Oprang Oprang;
26 typedef uchar Opcross[32][2][32];
30 #define TNAME (curtext&&curtext->from.sym?curtext->from.sym->name:noname)
51 #define offset u0.u0offset
52 #define sval u0.u0sval
53 #define ieee u0.u0ieee
55 #define autom u1.u1autom
61 Adr from3; /* third register operand */
77 #define regused u0.u0regused
78 #define forwd u0.u0forwd
94 #define SIGNINTERN (1729*325*1729) /* signature of internal functions such as _div */
150 C_RSP, /* D_REG or D_SP */
151 C_SHIFT, /* D_SHIFT: shift type, amount, value */
152 C_EXTREG, /* D_EXTREG: reg, ext type, shift */
157 C_ZCON, /* 0 (matching C_REG, not C_RSP, allowing REGZERO) */
158 C_ADDCON0, /* 12-bit unsigned, unshifted */
159 C_ADDCON, /* 12-bit unsigned, shifted left by 0 or 12 */
160 C_MOVCON, /* generated by a 16-bit constant, optionally inverted and/or shifted by multiple of 16 */
161 C_BITCON, /* bimm32/bimm64 */
162 C_BITCON32, /* bimm32 */
163 C_BITCON64, /* bimm64 */
164 C_ABCON, /* could be C_ADDCON or C_BITCON */
165 C_MBCON, /* could be C_MOVCON or C_BITCON */
166 C_LCON, /* 32-bit constant */
167 C_FCON, /* floating-point constant */
168 C_VCON, /* 64-bit constant */
170 C_AACON, /* ADDCON offset in auto constant $a(FP) */
171 C_LACON, /* 32-bit offset in auto constant $a(FP) */
173 C_AECON, /* ADDCON offset in extern constant $e(SB) */
178 C_NPAUTO, /* -512 <= x < 0, 0 mod 8 */
179 C_NSAUTO, /* -256 <= x < 0 */
180 C_PSAUTO, /* 0 to 255 */
181 C_PPAUTO, /* 0 to 504, 0 mod 8 */
182 C_UAUTO4K, /* 0 to 4095 */
183 C_UAUTO8K, /* 0 to 8190, 0 mod 2 */
184 C_UAUTO16K, /* 0 to 16380, 0 mod 4 */
185 C_UAUTO32K, /* 0 to 32760, 0 mod 8 */
186 C_UAUTO64K, /* 0 to 65520, 0 mod 16 */
187 C_LAUTO, /* any other 32-bit constant */
189 C_SEXT1, /* 0 to 4095, direct */
190 C_SEXT2, /* 0 to 8190 */
191 C_SEXT4, /* 0 to 16380 */
192 C_SEXT8, /* 0 to 32760 */
193 C_SEXT16, /* 0 to 65520 */
196 C_NPOREG, /* mirror NPAUTO etc, except for ZOREG */
208 C_ADDR, /* relocatable address for dynamic loading */
209 C_ROFF, /* register offset (inc register extended) */
216 C_NCLASS, /* must be last */
230 Roffset = 22, /* no. bits for offset in relocation address */
231 Rindex = 10, /* no. bits for index in relocation address */
233 STACKALIGN = 16, /* alignment of stack */
234 PCSZ= 8, /* size of PC */
244 MAXHIST = 20, /* limit of path elements for history symbols */
251 uchar obuf[MAXIO]; /* output buffer */
252 uchar ibuf[MAXIO]; /* input buffer */
260 EXTERN long HEADR; /* length of header */
261 EXTERN int HEADTYPE; /* type of header */
262 EXTERN long INITDAT; /* data location */
263 EXTERN long INITRND; /* data round above text location */
264 EXTERN long INITTEXT; /* text location */
265 EXTERN long INITTEXTP; /* text location (physical) */
266 EXTERN char* INITENTRY; /* entry point */
267 EXTERN long autosize;
273 EXTERN Auto* curauto;
274 EXTERN Auto* curhist;
276 EXTERN Prog* curtext;
279 EXTERN char debug[128];
283 EXTERN char fnuxi4[4];
284 EXTERN char fnuxi8[8];
285 EXTERN char inuxi1[1];
286 EXTERN char inuxi2[2];
287 EXTERN char inuxi4[4];
288 EXTERN uchar inuxi8[8];
290 EXTERN Sym* hash[NHASH];
291 EXTERN Sym* histfrog[MAXHIST];
292 EXTERN int histfrogp;
296 EXTERN char* library[50];
297 EXTERN char* libraryobj[50];
301 EXTERN char literal[32];
305 EXTERN vlong instoffset;
306 EXTERN Opcross opcross[8];
307 EXTERN char* outfile;
309 EXTERN uchar repop[ALAST];
312 EXTERN vlong textsize;
313 EXTERN uintptr thunk;
315 EXTERN char xcmp[C_NCLASS][C_NCLASS];
316 EXTERN int xrefresolv;
320 EXTERN int doexp, dlm;
321 EXTERN int imports, nimports;
322 EXTERN int exports, nexports;
328 extern char* anames[];
329 extern char* cnames[];
330 extern Optab optab[];
335 #pragma varargck argpos diag 1
337 #pragma varargck type "A" int
338 #pragma varargck type "A" uint
339 #pragma varargck type "C" int
340 #pragma varargck type "D" Adr*
341 #pragma varargck type "N" Adr*
342 #pragma varargck type "P" Prog*
343 #pragma varargck type "S" char*
354 void addpool(Prog*, Adr*);
355 vlong atolwhex(char*);
359 void asmout(Prog*, Optab*);
361 Prog* brchain(Prog*);
364 void buildrep(int, int);
366 void ckoff(Sym*, long);
367 int chipfloat(Ieee*);
371 void datblk(long, long, int);
372 void diag(char*, ...);
376 void dynreloc(Sym*, long, int);
377 vlong entryvalue(void);
378 void errorexit(void);
382 void histtoauto(void);
385 double ieeedtod(Ieee*);
386 long ieeedtof(Ieee*);
388 void ldobj(int, long, char*);
393 Sym* lookup(char*, int);
403 vlong offsetshift(vlong, int);
404 Optab* oplook(Prog*);
409 void putsymb(char*, int, vlong, int);
410 void readundefs(char*, int);
413 vlong rnd(vlong, long);
419 Mask* findmask(uvlong);
420 void xdefine(char*, int, long);
425 #pragma varargck type "R" int
428 #define isbranch(a) ((a) == AB)
429 #define iscall(a) ((a) == ABL)
430 #define isreturn(a) ((a) == ARETURN || (a) == ARET || (a) == AERET)
431 #define branchop() AB
432 #define canfollow(a) ((a) != ATEXT && (a) != ABCASE)