summaryrefslogtreecommitdiff
path: root/utils/2l
diff options
context:
space:
mode:
Diffstat (limited to 'utils/2l')
-rw-r--r--utils/2l/Nt.c77
-rw-r--r--utils/2l/Plan9.c57
-rw-r--r--utils/2l/Posix.c80
-rw-r--r--utils/2l/asm.c1569
-rw-r--r--utils/2l/l.h263
-rw-r--r--utils/2l/list.c395
-rw-r--r--utils/2l/mkfile26
-rw-r--r--utils/2l/obj.c1402
-rw-r--r--utils/2l/optab.c444
-rw-r--r--utils/2l/pass.c538
-rw-r--r--utils/2l/span.c551
11 files changed, 0 insertions, 5402 deletions
diff --git a/utils/2l/Nt.c b/utils/2l/Nt.c
deleted file mode 100644
index 2efff499..00000000
--- a/utils/2l/Nt.c
+++ /dev/null
@@ -1,77 +0,0 @@
-#include <windows.h>
-#include "l.h"
-
-/*
- * fake malloc
- */
-void*
-malloc(uint n)
-{
- void *p;
-
- while(n & 7)
- n++;
- while(nhunk < n)
- gethunk();
- p = hunk;
- nhunk -= n;
- hunk += n;
- return p;
-}
-
-void
-free(void *p)
-{
- USED(p);
-}
-
-void*
-calloc(uint m, uint n)
-{
- void *p;
-
- n *= m;
- p = malloc(n);
- memset(p, 0, n);
- return p;
-}
-
-void*
-realloc(void *p, uint n)
-{
- void *new;
-
- new = malloc(n);
- if(new && p)
- memmove(new, p, n);
- return new;
-}
-
-#define Chunk (1*1024*1024)
-
-void*
-mysbrk(ulong size)
-{
- void *v;
- static int chunk;
- static uchar *brk;
-
- if(chunk < size) {
- chunk = Chunk;
- if(chunk < size)
- chunk = Chunk + size;
- brk = VirtualAlloc(NULL, chunk, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
- if(brk == 0)
- return (void*)-1;
- }
- v = brk;
- chunk -= size;
- brk += size;
- return v;
-}
-
-double
-cputime(void)
-{
- return ((double)0);
-}
diff --git a/utils/2l/Plan9.c b/utils/2l/Plan9.c
deleted file mode 100644
index f4cf23f4..00000000
--- a/utils/2l/Plan9.c
+++ /dev/null
@@ -1,57 +0,0 @@
-#include "l.h"
-
-/*
- * fake malloc
- */
-void*
-malloc(ulong n)
-{
- void *p;
-
- while(n & 7)
- n++;
- while(nhunk < n)
- gethunk();
- p = hunk;
- nhunk -= n;
- hunk += n;
- return p;
-}
-
-void
-free(void *p)
-{
- USED(p);
-}
-
-void*
-calloc(ulong m, ulong n)
-{
- void *p;
-
- n *= m;
- p = malloc(n);
- memset(p, 0, n);
- return p;
-}
-
-void*
-realloc(void *p, ulong n)
-{
- USED(p);
- USED(n);
- fprint(2, "realloc called\n");
- abort();
- return 0;
-}
-
-void*
-mysbrk(ulong size)
-{
- return sbrk(size);
-}
-
-void
-setmalloctag(void*, ulong)
-{
-}
diff --git a/utils/2l/Posix.c b/utils/2l/Posix.c
deleted file mode 100644
index aa5d9551..00000000
--- a/utils/2l/Posix.c
+++ /dev/null
@@ -1,80 +0,0 @@
-#include "l.h"
-#include <sys/types.h>
-#include <sys/times.h>
-#undef getwd
-#include <unistd.h> /* For sysconf() and _SC_CLK_TCK */
-
-/*
- * fake malloc
- */
-void*
-malloc(size_t n)
-{
- void *p;
-
- while(n & 7)
- n++;
- while(nhunk < n)
- gethunk();
- p = hunk;
- nhunk -= n;
- hunk += n;
- return p;
-}
-
-void
-free(void *p)
-{
- USED(p);
-}
-
-void*
-calloc(size_t m, size_t n)
-{
- void *p;
-
- n *= m;
- p = malloc(n);
- memset(p, 0, n);
- return p;
-}
-
-void*
-realloc(void *p, size_t n)
-{
- fprint(2, "realloc called\n", p, n);
- abort();
- return 0;
-}
-
-double
-cputime(void)
-{
-
- struct tms tmbuf;
- double ret_val;
-
- /*
- * times() only fials if &tmbuf is invalid.
- */
- (void)times(&tmbuf);
- /*
- * Return the total time (in system clock ticks)
- * spent in user code and system
- * calls by both the calling process and its children.
- */
- ret_val = (double)(tmbuf.tms_utime + tmbuf.tms_stime +
- tmbuf.tms_cutime + tmbuf.tms_cstime);
- /*
- * Convert to seconds.
- */
- ret_val *= sysconf(_SC_CLK_TCK);
- return ret_val;
-
-}
-
-void*
-mysbrk(ulong size)
-{
- return (void*)sbrk(size);
-}
diff --git a/utils/2l/asm.c b/utils/2l/asm.c
deleted file mode 100644
index 10129e98..00000000
--- a/utils/2l/asm.c
+++ /dev/null
@@ -1,1569 +0,0 @@
-#include "l.h"
-
-short opa[20];
-short *op;
-
-long
-entryvalue(void)
-{
- char *a;
- Sym *s;
-
- a = INITENTRY;
- if(*a >= '0' && *a <= '9')
- return atolwhex(a);
- s = lookup(a, 0);
- if(s->type == 0)
- return INITTEXT;
- if(s->type != STEXT)
- diag("entry not text: %s", s->name);
- return s->value;
-}
-
-void
-asmb(void)
-{
- Prog *p;
- long v;
- int a;
- short *op1;
-
- if(debug['v'])
- Bprint(&bso, "%5.2f asmb\n", cputime());
- Bflush(&bso);
-
- seek(cout, HEADR, 0);
- pc = INITTEXT;
- curp = firstp;
- for(p = firstp; p != P; p = p->link) {
- if(p->as == ATEXT)
- curtext = p;
- if(p->pc != pc) {
- if(!debug['a'])
- print("%P\n", curp);
- diag("phase error %lux sb %lux in %s", p->pc, pc, TNAME);
- pc = p->pc;
- }
- curp = p;
- if(debug['a'])
- Bprint(&bso, "%lux:%P\n", pc, curp);
- asmins(p);
- if(cbc < sizeof(opa))
- cflush();
- for(op1 = opa; op1 < op; op1++) {
- a = *op1;
- *cbp++ = a >> 8;
- *cbp++ = a;
- }
- a = 2*(op - opa);
- pc += a;
- cbc -= a;
- if(debug['a']) {
- for(op1 = opa; op1 < op; op1++)
- if(op1 == opa)
- Bprint(&bso, "\t\t%4ux", *op1 & 0xffff);
- else
- Bprint(&bso, " %4ux", *op1 & 0xffff);
- if(op != opa)
- Bprint(&bso, "\n");
- }
- }
- cflush();
- switch(HEADTYPE) {
- case 0: /* this is garbage */
- seek(cout, rnd(HEADR+textsize, 8192), 0);
- break;
- case 1: /* plan9 boot data goes into text */
- seek(cout, rnd(HEADR+textsize, INITRND), 0);
- break;
- case 2: /* plan 9 */
- seek(cout, HEADR+textsize, 0);
- break;
- case 3: /* next boot */
- seek(cout, HEADR+rnd(textsize, INITRND), 0);
- break;
- case 4: /* preprocess pilot */
- seek(cout, HEADR+textsize, 0);
- break;
- }
-
- if(debug['v'])
- Bprint(&bso, "%5.2f datblk\n", cputime());
- Bflush(&bso);
-
- for(v = 0; v < datsize; v += sizeof(buf)-100) {
- if(datsize-v > sizeof(buf)-100)
- datblk(v, sizeof(buf)-100);
- else
- datblk(v, datsize-v);
- }
-
- symsize = 0;
- spsize = 0;
- lcsize = 0;
-
- Bflush(&bso);
-
- switch(HEADTYPE) {
- default:
- seek(cout, rnd(HEADR+textsize, 8192)+datsize, 0);
- break;
- case 1: /* plan9 boot data goes into text */
- seek(cout, rnd(HEADR+textsize, INITRND)+datsize, 0);
- break;
- case 2: /* plan 9 */
- seek(cout, HEADR+textsize+datsize, 0);
- break;
- case 3: /* next boot */
- seek(cout, HEADR+rnd(textsize, INITRND)+datsize, 0);
- break;
- }
- if(!debug['s']) {
- if(debug['v'])
- Bprint(&bso, "%5.2f sym\n", cputime());
- asmsym();
- }
- Bflush(&bso);
- if(!debug['s']) {
- if(debug['v'])
- Bprint(&bso, "%5.2f sp\n", cputime());
- asmsp();
- }
- Bflush(&bso);
- if(!debug['s']) {
- if(debug['v'])
- Bprint(&bso, "%5.2f pc\n", cputime());
- asmlc();
- }
- cflush();
-
- if(debug['v'])
- Bprint(&bso, "%5.2f headr\n", cputime());
- Bflush(&bso);
- seek(cout, 0L, 0);
- switch(HEADTYPE) {
- default:
- lput(0x160L<<16); /* magic and sections */
- lput(0L); /* time and date */
- lput(rnd(HEADR+textsize, 4096)+datsize);
- lput(symsize); /* nsyms */
- lput((0x38L<<16)|7L); /* size of optional hdr and flags */
- lput((0413<<16)|0437L); /* magic and version */
- lput(rnd(HEADR+textsize, 4096)); /* sizes */
- lput(datsize);
- lput(bsssize);
- lput(entryvalue()); /* va of entry */
- lput(INITTEXT-HEADR); /* va of base of text */
- lput(INITDAT); /* va of base of data */
- lput(INITDAT+datsize); /* va of base of bss */
- lput(~0L); /* gp reg mask */
- lput(0L);
- lput(0L);
- lput(0L);
- lput(0L);
- lput(~0L); /* gp value ?? */
- break;
- case 1: /* plan9 boot data goes into text */
- lput(0407); /* magic */
- lput(rnd(HEADR+textsize, INITRND)-HEADR+datsize); /* sizes */
- lput(0);
- lput(bsssize);
- lput(symsize); /* nsyms */
- lput(entryvalue()); /* va of entry */
- lput(spsize); /* sp offsets */
- lput(lcsize); /* line offsets */
- break;
- case 2: /* plan 9 */
- lput(0407); /* magic */
- lput(textsize); /* sizes */
- lput(datsize);
- lput(bsssize);
- lput(symsize); /* nsyms */
- lput(entryvalue()); /* va of entry */
- lput(spsize); /* sp offsets */
- lput(lcsize); /* line offsets */
- break;
- case 3: /* next boot */
- /* header */
- lput(0xfeedfaceL); /* magic */
- lput(6); /* 68040 */
- lput(1); /* more 68040 */
- lput(5); /* file type 'boot' */
- lput(HEADTYPE); /* number commands */
- lput(HEADR-7*4); /* sizeof commands */
- lput(1); /* no undefineds */
- /* command 1 text */
- lput(1); /* command = 'segment' */
- lput(124); /* command size */
- s16put("__TEXT");
- /* botch?? entryvalue() */
- lput(INITTEXT); /* va of start */
- lput(rnd(textsize, 8192)); /* va size */
- lput(HEADR); /* file offset */
- lput(rnd(textsize, 8192)); /* file size */
- lput(7); /* max prot */
- lput(7); /* init prot */
- lput(1); /* number of sections */
- lput(0); /* flags */
- /* text section */
- s16put("__text");
- s16put("__TEXT");
- /* botch?? entryvalue() */
- lput(INITTEXT); /* va of start */
- lput(textsize); /* va size */
- lput(HEADR); /* file offset */
- lput(2); /* align */
- lput(0); /* reloff */
- lput(0); /* nreloc */
- lput(0); /* flags */
- lput(0); /* reserved1 */
- lput(0); /* reserved2 */
- /* command 1 data */
- lput(1); /* command = 'segment' */
- lput(192); /* command size */
- s16put("__DATA");
- lput(INITDAT); /* va of start */
- lput(rnd(datsize, 8192)); /* va size */
- lput(HEADR+rnd(textsize, 8192)); /* file offset */
- lput(rnd(datsize, 8192)); /* file size */
- lput(7); /* max prot */
- lput(7); /* init prot */
- lput(2); /* number of sections */
- lput(0); /* flags */
- /* data section */
- s16put("__data");
- s16put("__DATA");
- lput(INITDAT); /* va of start */
- lput(datsize); /* va size */
- lput(HEADR+rnd(textsize, 8192)); /* file offset */
- lput(2); /* align */
- lput(0); /* reloff */
- lput(0); /* nreloc */
- lput(0); /* flags */
- lput(0); /* reserved1 */
- lput(0); /* reserved2 */
- /* bss section */
- s16put("__bss");
- s16put("__DATA");
- lput(INITDAT+datsize); /* va of start */
- lput(bsssize); /* va size */
- lput(0); /* file offset */
- lput(2); /* align */
- lput(0); /* reloff */
- lput(0); /* nreloc */
- lput(1); /* flags = zero fill */
- lput(0); /* reserved1 */
- lput(0); /* reserved2 */
- /* command 2 symbol */
- lput(2); /* command = 'symbol' */
- lput(24); /* command size */
- lput(HEADR+rnd(textsize, INITRND)
- +datsize); /* symoff */
- lput(symsize); /* nsyms */
- lput(spsize); /* sp offsets */
- lput(lcsize); /* line offsets */
- break;
- }
- cflush();
-}
-
-void
-asmins(Prog *p)
-{
- Optab *o;
- int t, a, b;
- long v;
- Prog *q;
-
- op = opa + 1;
- if(special[p->from.type])
- switch(p->from.type) {
-
- case D_CCR:
- if(p->as != AMOVW)
- goto bad;
- a = asmea(p, &p->to);
- if((a & 0170) == 010)
- goto bad;
- opa[0] = 0x42c0 | a; /* mov from ccr */
- return;
-
- case D_SR:
- if(p->as != AMOVW)
- goto bad;
- a = asmea(p, &p->to);
- if((a & 0170) == 010)
- goto bad;
- opa[0] = 0x40c0 | a; /* mov from sr */
- return;
-
- case D_USP:
- if(p->as != AMOVL)
- goto bad;
- a = asmea(p, &p->to);
- if((a & 0170) == 010) {
- opa[0] = 0x4e68|(a&7); /* mov usp An */
- return;
- }
- t = 0x800;
- goto movec1;
-
- case D_SFC:
- t = 0x000;
- goto movec1;
-
- case D_DFC:
- t = 0x001;
- goto movec1;
-
- case D_CACR:
- t = 0x002;
- goto movec1;
-
- case D_TC:
- t = 0x003;
- goto movec1;
-
- case D_ITT0:
- t = 0x004;
- goto movec1;
-
- case D_ITT1:
- t = 0x005;
- goto movec1;
-
- case D_DTT0:
- t = 0x006;
- goto movec1;
-
- case D_DTT1:
- t = 0x007;
- goto movec1;
-
- case D_VBR:
- t = 0x801;
- goto movec1;
-
- case D_CAAR:
- t = 0x802;
- goto movec1;
-
- case D_MSP:
- t = 0x803;
- goto movec1;
-
- case D_ISP:
- t = 0x804;
- goto movec1;
-
- case D_MMUSR:
- t = 0x805;
- goto movec1;
-
- case D_URP:
- t = 0x806;
- goto movec1;
-
- case D_SRP:
- t = 0x807;
- goto movec1;
-
- movec1:
- if(p->as != AMOVL)
- goto bad;
- opa[0] = 0x4e7a; /* mov spc Dn */
- a = asmea(p, &p->to);
- b = a & 0170;
- if(b == 0 || b == 010) {
- *op++ = (a<<12) | t;
- return;
- }
- goto bad;
-
- case D_FPCR:
- t = 0xb000;
- goto movec3;
-
- case D_FPSR:
- t = 0xa800;
- goto movec3;
-
- case D_FPIAR:
- t = 0xa400;
-
- movec3:
- if(p->as != AMOVL)
- goto bad;
- op++;
- a = asmea(p, &p->to);
- opa[0] = optab[AFMOVEL].opcode0 | a;
- opa[1] = t;
- return;
- }
- if(special[p->to.type])
- switch(p->to.type) {
-
- case D_CCR:
- if(p->as != AMOVW) /* botch, needs and, eor etc. */
- goto bad;
- a = asmea(p, &p->from);
- if((a & 0170) == 010)
- goto bad;
- opa[0] = 0x44c0 | a; /* mov to ccr */
- return;
-
- case D_SR:
- if(p->as != AMOVW) /* botch, needs and, eor etc. */
- goto bad;
- a = asmea(p, &p->from);
- if((a & 0170) == 010)
- goto bad;
- opa[0] = 0x46c0 | a; /* mov to sr */
- return;
-
- case D_USP:
- if(p->as != AMOVL)
- goto bad;
- a = asmea(p, &p->from);
- if((a & 0170) == 010) {
- opa[0] = 0x4e60|(a&7); /* mov An usp */
- return;
- }
- t = 0x800;
- goto movec2;
-
- case D_SFC:
- t = 0x000;
- goto movec2;
-
- case D_DFC:
- t = 0x001;
- goto movec2;
-
- case D_CACR:
- t = 0x002;
- goto movec2;
-
- case D_TC:
- t = 0x003;
- goto movec2;
-
- case D_ITT0:
- t = 0x004;
- goto movec2;
-
- case D_ITT1:
- t = 0x005;
- goto movec2;
-
- case D_DTT0:
- t = 0x006;
- goto movec2;
-
- case D_DTT1:
- t = 0x007;
- goto movec2;
-
- case D_VBR:
- t = 0x801;
- goto movec2;
-
- case D_CAAR:
- t = 0x802;
- goto movec2;
-
- case D_MSP:
- t = 0x803;
- goto movec2;
-
- case D_ISP:
- t = 0x804;
- goto movec2;
-
- case D_MMUSR:
- t = 0x805;
- goto movec2;
-
- case D_URP:
- t = 0x806;
- goto movec2;
-
- case D_SRP:
- t = 0x807;
- goto movec2;
-
- movec2:
- if(p->as != AMOVL)
- goto bad;
- opa[0] = 0x4e7b; /* mov Dn spc */
- a = asmea(p, &p->from);
- b = a & 0170;
- if(b == 0 || b == 010) {
- *op++ = (a<<12) | t;
- return;
- }
- goto bad;
-
- case D_FPCR:
- t = 0x9000;
- goto movec4;
-
- case D_FPSR:
- t = 0x8800;
- goto movec4;
-
- case D_FPIAR:
- t = 0x8400;
-
- movec4:
- if(p->as != AMOVL)
- goto bad;
- op++;
- a = asmea(p, &p->from);
- opa[0] = optab[AFMOVEL].opcode0 | a;
- opa[1] = t;
- return;
- }
-
- o = &optab[p->as];
- t = o->opcode0;
- switch(o->optype) {
- case 0: /* pseudo ops */
- if(p->as != ATEXT && p->as != ANOP) {
- if(!debug['a'])
- print("%P\n", p);
- diag("unimplemented instruction in %s", TNAME);
- return;
- }
- op = opa;
- return;
-
- case 1: /* branches */
- if(p->to.type != D_BRANCH)
- goto bad;
- a = asmea(p, &p->to);
- /* hack to turn 3-word bsr into 2-word jsr */
- if(a == 0xff && p->as == ABSR &&
- p->pcond->pc < 32768L && p->pcond->pc >= 0) {
- op = opa + 1;
- t = o->opcode1;
- *op++ = p->pcond->pc;
- break;
- }
- t |= a;
- break;
-
- case 2: /* move */
- a = asmea(p, &p->from);
- b = asmea(p, &p->to);
- if((a & 0170) == 0110) { /* src quick */
- t = o->opcode1;
- if((b & 0170) != 0)
- goto bad;
- t |= a >> 7;
- t |= b << 9;
- break;
- }
- t |= a;
- t |= (b&7) << 9;
- t |= (b&070) << 3;
- break;
-
- case 3: /* add */
- a = asmea(p, &p->from);
- b = asmea(p, &p->to);
- if((a & 0170) == 0110) { /* src quick */
- t = o->opcode1;
- t |= (a&01600) << 2;
- t |= b;
- break;
- }
- if((b & 0170) == 0) { /* dst Dn */
- t |= a;
- t |= (b & 7) << 9;
- break;
- }
- if((b & 0170) == 010) { /* dst An */
- if((t & 0xc0) == 0)
- goto bad;
- t = o->opcode2;
- t |= a;
- t |= (b & 7) << 9;
- break;
- }
- if((a & 0170) == 0) { /* src Dn */
- t |= 0x100;
- t |= (a & 7) << 9;
- t |= b;
- break;
- }
- if((a & 0177) == 074) { /* src immed */
- t = o->opcode3;
- t |= b;
- break;
- }
- goto bad;
-
- case 4: /* no operands */
- break;
-
- case 5: /* tst */
- t |= asmea(p, &p->to);
- if((t&0170) == 010)
- goto bad;
- break;
-
- case 6: /* lea */
- a = asmea(p, &p->from);
- b = asmea(p, &p->to);
- if((b & 0170) != 010)
- goto bad;
- t |= a;
- t |= (b & 7) << 9;
- break;
-
- case 7: /* cmp */
- b = asmea(p, &p->to);
- a = asmea(p, &p->from);
- if((a & 0170) == 010) { /* dst An */
- t = o->opcode1;
- if(t == 0) /* cmpb illegal */
- goto bad;
- t |= 0xc0;
- t |= b;
- t |= (a & 7) << 9;
- break;
- }
- if((b & 0177) == 074) { /* src immed */
- t = o->opcode2;
- t |= a;
- break;
- }
- if((a & 0170) == 0) { /* dst Dn */
- t |= b;
- t |= (a&7) << 9;
- break;
- }
- if((b&0170) == 030 && (a&0170) == 030) { /* (A)+,(A)+ */
- t = o->opcode3;
- t |= b & 7;
- t |= (a & 7) << 9;
- break;
- }
- goto bad;
-
- case 8: /* svc */
- *op++ = optab[ARTS].opcode0;
- break;
-
- case 9: /* and */
- a = asmea(p, &p->from);
- b = asmea(p, &p->to);
- if((a & 0170) == 010)
- goto bad;
- if((b & 0170) == 0) { /* dst Dn */
- t |= a;
- t |= (b&7) << 9;
- break;
- }
- if((a & 0170) == 0) { /* src Dn */
- t = o->opcode1;
- t |= b;
- t |= (a&7) << 9;
- break;
- }
- if((a & 0177) == 074) { /* src immed */
- t = o->opcode2;
- t |= b;
- break;
- }
- goto bad;
-
- case 10: /* eor */
- a = asmea(p, &p->from);
- b = asmea(p, &p->to);
- if((a & 0170) == 010)
- goto bad;
- if((a & 0170) == 0) { /* src Dn */
- t |= b;
- t |= (a&7) << 9;
- break;
- }
- if((a & 0177) == 074) { /* src immed */
- t = o->opcode1;
- t |= b;
- break;
- }
- goto bad;
-
- case 11: /* ext */
- b = asmea(p, &p->to);
- if((b & 0170) == 0) { /* dst Dn */
- t |= b;
- break;
- }
- goto bad;
-
- case 12: /* shift */
- a = asmea(p, &p->from);
- b = asmea(p, &p->to);
- if((b & 0170) == 0) { /* dst Dn */
- if((a & 0177) == 0110) { /* src quick */
- t |= (a & 01600) << 2;
- t |= b;
- break;
- }
- if((a & 0170) == 0) { /* src Dn */
- t |= 0x20;
- t |= a << 9;
- t |= b;
- break;
- }
- goto bad;
- }
- goto bad;
-
- case 13: /* mul, div short */
- a = asmea(p, &p->from);
- b = asmea(p, &p->to);
- if((b & 0170) == 0) { /* dst Dn */
- if((a & 0170) == 010)
- goto bad;
- t |= a;
- t |= b << 9;
- break;
- }
- goto bad;
-
- case 14: /* mul, div long */
- *op++ = o->opcode1;
- a = asmea(p, &p->from);
- b = asmea(p, &p->to);
- if((b & 0170) == 0) { /* dst Dn */
- if((a & 0170) == 010)
- goto bad;
- t |= a;
- opa[1] |= b << 12;
- opa[1] |= b+1;
- break;
- }
- goto bad;
-
- case 15: /* dec and branch */
- if(p->to.type != D_BRANCH)
- goto bad;
- v = p->pcond->pc - p->pc - 2;
- if(v < -32768L || v >= 32768L)
- goto bad;
- *op++ = v;
- a = asmea(p, &p->from);
- if((a & 0170) != 0)
- goto bad;
- t |= a;
- break;
-
- case 16: /* fmove */
- *op++ = o->opcode1;
- a = asmea(p, &p->from);
- b = asmea(p, &p->to);
- if((a & 0170) == 0100) { /* src Fn */
- if((b & 0170) == 0100) { /* both Fn */
- opa[1] |= (a&7) << 10;
- opa[1] |= (b&7) << 7;
- break;
- }
- t |= b;
- opa[1] = o->opcode2;
- opa[1] |= (a&7) << 7;
- break;
- }
- if((b & 0170) != 0100) /* dst Fn */
- goto bad;
- t |= a;
- opa[1] = o->opcode3;
- opa[1] |= (b&7) << 7;
- break;
-
- case 17: /* floating ea,Fn */
- *op++ = o->opcode1;
- a = asmea(p, &p->from);
- b = asmea(p, &p->to);
- if((b & 0170) != 0100) /* dst Fn */
- goto bad;
- if((a & 0170) == 0100) { /* both Fn */
- opa[1] |= (a&7) << 10;
- opa[1] |= (b&7) << 7;
- break;
- }
- t |= a;
- opa[1] = o->opcode2;
- opa[1] |= (b&7) << 7;
- break;
-
- case 18: /* floating branchs */
- if(p->to.type != D_BRANCH)
- goto bad;
- v = p->pcond->pc - p->pc - 2;
- if(v < -32768L || v >= 32768L)
- goto bad;
- *op++ = v;
- break;
-
- case 19: /* floating dec and branch */
- if(p->to.type != D_BRANCH)
- goto bad;
- *op++ = o->opcode1;
- v = p->pcond->pc - p->pc - 2;
- if(v < -32768L || v >= 32768L)
- goto bad;
- *op++ = v;
- a = asmea(p, &p->from);
- if((a & 0170) != 0)
- goto bad;
- t |= a;
- break;
-
- case 20: /* ftst ea */
- *op++ = o->opcode1;
- if(p->from.type != D_NONE)
- goto bad;
- a = asmea(p, &p->to);
- if((a & 0170) == 0100) { /* Fn */
- opa[1] |= (a&7) << 10;
- break;
- }
- t |= a;
- opa[1] = o->opcode2;
- break;
-
- case 21: /* fneg */
- *op++ = o->opcode1;
- if(p->from.type == D_NONE) {
- b = asmea(p, &p->to);
- a = b;
- } else {
- a = asmea(p, &p->from);
- b = asmea(p, &p->to);
- }
- if((b & 0170) != 0100) /* dst Fn */
- goto bad;
- if((a & 0170) == 0100) { /* both Fn */
- opa[1] |= (a&7) << 10;
- opa[1] |= (b&7) << 7;
- break;
- }
- t |= a;
- opa[1] = o->opcode2;
- opa[1] |= (b&7) << 7;
- break;
-
- case 22: /* floating cmp Fn,ea */
- *op++ = o->opcode1;
- a = asmea(p, &p->from);
- b = asmea(p, &p->to);
- if((a & 0170) != 0100) /* dst Fn */
- goto bad;
- if((b & 0170) == 0100) { /* both Fn */
- opa[1] |= (b&7) << 10;
- opa[1] |= (a&7) << 7;
- break;
- }
- t |= b;
- opa[1] = o->opcode2;
- opa[1] |= (a&7) << 7;
- break;
-
- case 23: /* word, long */
- op = opa;
- a = asmea(p, &p->to);
- if(a == ((7<<3)|4))
- return;
- if(a == ((7<<3)|1)) {
- if(p->as == AWORD) {
- op = opa;
- *op++ = opa[1];
- }
- return;
- }
- if(a == ((7<<3)|0)) {
- if(p->as == ALONG) {
- *op++ = opa[0];
- opa[0] = 0;
- }
- return;
- }
- goto bad;
-
- case 24: /* bit field */
- a = ((p->to.field&31)<<6) | (p->from.field&31);
- if(p->as == ABFINS) {
- b = asmea(p, &p->from);
- if((b&0170) != 0)
- goto bad;
- a |= b<<12;
- *op++ = a;
- a = asmea(p, &p->to);
- } else {
- if(p->to.type != D_NONE) {
- b = asmea(p, &p->to);
- if((b&0170) != 0)
- goto bad;
- a |= b<<12;
- }
- *op++ = a;
- a = asmea(p, &p->from);
- }
- t |= a;
- a &= 0170;
- if(a == 010 || a == 030 || a == 040 || a == 074)
- goto bad;
- break;
-
- case 25: /* movem */
- if(p->from.type == D_CONST) { /* registers -> memory */
- asmea(p, &p->from);
- a = asmea(p, &p->to);
- if(a == 074)
- goto bad;
- b = a & 0170;
- if(b == 000 || b == 010 || b == 030)
- goto bad;
- t |= a;
- break;
- }
- if(p->to.type == D_CONST) { /* memory -> registers */
- t |= 0x400;
- asmea(p, &p->to);
- a = asmea(p, &p->from);
- if(a == 074)
- goto bad;
- b = a & 0170;
- if(b == 000 || b == 010 || b == 040)
- goto bad;
- t |= a;
- break;
- }
- goto bad;
-
- case 26: /* chk */
- a = asmea(p, &p->from);
- if((a&0170) == 010)
- goto bad;
- b = asmea(p, &p->to);
- if((b&0170) != 0)
- goto bad;
- t |= a;
- t |= b<<9;
- break;
-
- case 27: /* btst */
- a = asmea(p, &p->from);
- if(a == 074) {
- t = o->opcode1;
- } else
- if((a&0170) != 0)
- goto bad;
- b = asmea(p, &p->to);
- if(b == 074 || (b&0170) == 010)
- goto bad;
- t |= b;
- break;
-
- case 28: /* fmovem */
- if(p->from.type == D_CONST) { /* registers -> memory */
- b = p->from.offset & 0xff;
- b |= 0xf000; /* control or postinc */
- *op++ = b;
- a = asmea(p, &p->to);
- if(a == 074)
- goto bad;
- b = a & 0170;
- if(b == 000 || b == 010 || b == 030)
- goto bad;
- if(b == 040)
- op[-1] &= ~0x1000; /* predec */
- t |= a;
- break;
- }
- if(p->to.type == D_CONST) { /* memory -> registers */
- b = p->to.offset & 0xff;
- b |= 0xd000; /* control or postinc */
- *op++ = b;
- a = asmea(p, &p->from);
- if(a == 074)
- goto bad;
- b = a & 0170;
- if(b == 000 || b == 010 || b == 040)
- goto bad;
- t |= a;
- break;
- }
- goto bad;
-
- case 29: /* fmovemc */
- if(p->from.type == D_CONST) { /* registers -> memory */
- b = (p->from.offset & 0x7) << 10;
- b |= 0xa000;
- *op++ = b;
- a = asmea(p, &p->to);
- if(a == 074)
- goto bad;
- b = a & 0170;
- if(b == 000 || b == 010 || b == 030)
- goto bad;
- t |= a;
- break;
- }
- if(p->to.type == D_CONST) { /* memory -> registers */
- b = (p->to.offset & 0x7) << 10;
- b |= 0x8000;
- *op++ = b;
- a = asmea(p, &p->from);
- if(a == 074)
- goto bad;
- b = a & 0170;
- if(b == 000 || b == 010 || b == 040)
- goto bad;
- t |= a;
- break;
- }
- goto bad;
-
- case 30: /* trap */
- if(p->to.type == D_CONST) {
- t |= p->to.offset & 0xf;
- break;
- }
- goto bad;
-
- case 31: /* chk2, cmp2 */
- b = asmea(p, &p->to);
- a = b & 0170;
- if(a == 000 || a == 010) {
- *op++ = o->opcode1 | (b << 12);
- t |= asmea(p, &p->from);
- break;
- }
- goto bad;
-
- case 32: /* casew */
- /* jmp (0,pc,r0.w*1) */
- casepc = p->pc;
- *op++ = o->opcode1;
- break;
-
- case 33: /* bcase */
- q = copyp(p);
- q->as = ADATA;
- q->to.type = D_CONST;
- q->to.offset = p->pcond->pc - casepc - 2;
- q->from.displace = 2;
- q->link = datap;
- datap = q;
- if(debug['a'])
- Bprint(&bso, "%P\n", q);
- op = opa;
- return;
-
- case 34: /* moves */
- op++;
- a = asmea(p, &p->from);
- b = a & 0170;
- if(b == 0 || b == 010) {
- opa[1] = (a << 12) | 0x800;
- b = asmea(p, &p->to);
- a = b & 0170;
- if(a == 0 || a == 010)
- goto bad;
- t |= b;
- break;
- }
- t |= a;
- b = asmea(p, &p->to);
- a = b & 0170;
- if(a != 0 && a != 010)
- goto bad;
- opa[1] = (b << 12);
- break;
-
- case 35: /* swap */
- a = asmea(p, &p->to);
- if((a & 0170) == 0) {
- t |= a;
- break;
- }
- goto bad;
- }
- opa[0] = t;
- return;
-
-bad:
- if(!debug['a'])
- print("%P\n", p);
- diag("bad combination of addressing in %s", TNAME);
- opa[0] = 0;
-}
-
-int
-asmea(Prog *p, Adr *a)
-{
- Optab *o;
- int f, t, r, i;
- short *top;
- long v;
-
- if(a->index != D_NONE)
- goto index;
- t = a->type;
- r = simple[t];
- v = a->offset;
- if(r != 0177) {
- if(v == 0)
- return r;
- if((r & 070) != 020)
- return r;
- if(v >= -32768L && v < 32768L) {
- *op++ = v;
- return t-D_A0-I_INDIR+050; /* d(Ax) */
- }
- *op++ = 0x170; /* is, no indirect */
- *op++ = v>>16;
- *op++ = v;
- return t-D_A0-I_INDIR+060; /* (d,Ax) */
- }
- f = 0;
- if(a == &p->from)
- f++;
- o = &optab[p->as];
- switch(t) {
- case D_TOS:
- if(f) {
- if(o->srcsp)
- return (3<<3) | 7; /* (A7)+ */
- } else
- if(o->dstsp)
- return (4<<3) | 7; /* -(A7) */
- return (2<<3) | 7; /* (A7) */
-
- case D_BRANCH:
- v = p->pcond->pc - p->pc - 2;
- if(v < -32768L || v >= 32768L) {
- *op++ = v>>16;
- *op++ = v;
- return 0xff;
- }
- if(v < -128 || v >= 128 || p->mark == 4) {
- *op++ = v;
- return 0;
- }
- return v & 0xff;
-
- case I_ADDR|D_STATIC:
- case I_ADDR|D_EXTERN:
- t = a->sym->type;
- if(t == 0 || t == SXREF) {
- diag("undefined external: %s in %s",
- a->sym->name, TNAME);
- a->sym->type = SDATA;
- }
- v = a->sym->value + a->offset;
- if(t != STEXT)
- v += INITDAT;
-
- case D_CONST:
- switch(f? o->srcsp: o->dstsp) {
- case 4:
- *op++ = v>>16;
-
- case 2:
- *op++ = v;
- break;
-
- default:
- diag("unknown srcsp asmea in %s", TNAME);
- }
- return (7<<3) | 4;
-
- case D_FCONST:
- r = f? o->srcsp: o->dstsp;
- for(i=0; i<r; i++)
- ((char*)op)[i] = gnuxi(&a->ieee, i, r);
- op += r/2;
- return (7<<3) | 4;
-
- case D_QUICK:
- v = a->offset & 0xff;
- return 0110 | (v<<7);
-
- case D_STACK:
- case D_AUTO:
- case D_PARAM:
- if(v == 0)
- return (2<<3) | 7; /* (A7) */
- if(v >= -32768L && v < 32768L) {
- *op++ = v;
- return (5<<3) | 7; /* d(A7) */
- }
- *op++ = 0x170; /* is, no indirect */
- *op++ = v>>16;
- *op++ = v;
- return (6<<3) | 7; /* (d,A7) */
-
- case I_INDIR|D_CONST:
- goto adr;
-
- case D_STATIC:
- case D_EXTERN:
- t = a->sym->type;
- if(t == 0 || t == SXREF) {
- diag("undefined external: %s in %s",
- a->sym->name, TNAME);
- a->sym->type = SDATA;
- }
- if(t == STEXT) {
- v = a->sym->value + a->offset;
- *op++ = v>>16;
- *op++ = v;
- return (7<<3) | 1;
- }
- v = a->sym->value + a->offset - A6OFFSET;
- if(debug['6']) {
- v += INITDAT + A6OFFSET;
- goto adr;
- }
- if(v == 0)
- return (2<<3) | 6;
- if(v >= -32768L && v < 32768L) {
- *op++ = v;
- return (5<<3) | 6;
- }
- v += INITDAT + A6OFFSET;
-
- adr:
- if(v >= -32768L && v < 32768L) {
- *op++ = v;
- return (7<<3) | 0;
- }
- *op++ = v>>16;
- *op++ = v;
- return (7<<3) | 1;
- }
- if(!debug['a'])
- print("%P\n", p);
- diag("unknown addressing mode: %d in %s", t, TNAME);
- return 0;
-
-index:
- top = op++;
- t = a->index & D_MASK;
- f = (a->scale & 7) << 9; /* w/l scale */
- f |= (t & 7) << 12; /* register */
- if(t < D_R0 || t >= D_R0+8) {
- if(t >= D_A0 && t < D_A0+8) {
- f |= 0x8000; /* d/a */
- } else
- if(t == D_NONE)
- f = 0x40; /* is */
- else
- goto bad;
- }
-
- t = a->type;
- r = t & 7;
- v = a->offset;
- if(t < (I_INDIR|D_A0) || t >= (I_INDIR|(D_A0+8)))
- switch(t) {
- default:
- goto bad;
-
- case I_INDIR|D_NONE:
- f |= 0x80; /* bs */
- r = 0;
- break;
-
- case D_AUTO:
- case D_PARAM:
- case D_STACK:
- r = 7;
- break;
-
- case D_STATIC:
- case D_EXTERN:
- t = a->sym->type;
- if(t == 0 || t == SXREF) {
- diag("undefined external: %s in %s",
- a->sym->name, TNAME);
- a->sym->type = SDATA;
- }
- r = 6;
- v += a->sym->value - A6OFFSET;
- if(t == STEXT) {
- f |= 0x80; /* bs */
- r = 0;
- v += A6OFFSET;
- goto bdlong;
- }
- if(debug['6']) {
- f |= 0x80; /* bs */
- r = 0;
- v += INITDAT + A6OFFSET;
- }
- }
- if(v == 0)
- f |= 0x10; /* bd size = null */
- else
- if(v >= -32768L && v < 32768L) {
- f |= 0x20; /* bd size = word */
- *op++ = v;
- } else {
- bdlong:
- f |= 0x30; /* bd size = long */
- *op++ = v>>16;
- *op++ = v;
- }
- v = a->displace;
- t = a->index & I_MASK;
- if(t != I_INDEX1) { /* non-memory index */
- if(t == I_INDEX2)
- f |= 5; /* post indexing */
- else
- if(t == I_INDEX3)
- f |= 1; /* pre indexing */
- else
- goto bad;
- }
- if(v != 0) {
- if(v >= -32768L && v < 32768L) {
- f++; /* is size = word */
- *op++ = v;
- } else {
- f += 2; /* is size = long */
- *op++ = v>>16;
- *op++ = v;
- }
- }
- *top = f | 0x100;
- return (6<<3) | r;
-
-bad:
- if(!debug['a'])
- print("%P\n", p);
- diag("bad operand in %s", TNAME);
- return 0;
-}
-
-void
-lput(long l)
-{
-
- CPUT(l>>24)
- CPUT(l>>16)
- CPUT(l>>8)
- CPUT(l)
-}
-
-void
-s16put(char *n)
-{
- char name[16];
- int i;
-
- strncpy(name, n, sizeof(name));
- for(i=0; i<sizeof(name); i++)
- CPUT(name[i])
-}
-
-void
-cflush(void)
-{
- int n;
-
- n = sizeof(buf.cbuf) - cbc;
- if(n)
- write(cout, buf.cbuf, n);
- cbp = buf.cbuf;
- cbc = sizeof(buf.cbuf);
-}
-
-void
-datblk(long s, long n)
-{
- Prog *p;
- char *cast;
- long l, fl, j;
- int i, c;
-
- memset(buf.dbuf, 0, n+100);
- for(p = datap; p != P; p = p->link) {
- curp = p;
- l = p->from.sym->value + p->from.offset - s;
- c = p->from.displace;
- i = 0;
- if(l < 0) {
- if(l+c <= 0)
- continue;
- while(l < 0) {
- l++;
- i++;
- }
- }
- if(l >= n)
- continue;
- for(j=l+(c-i)-1; j>=l; j--)
- if(buf.dbuf[j]) {
- print("%P\n", p);
- diag("multiple initialization");
- break;
- }
- switch(p->to.type) {
- case D_FCONST:
- switch(c) {
- default:
- case 4:
- fl = ieeedtof(&p->to.ieee);
- cast = (char*)&fl;
- if(debug['a'] && i == 0) {
- Bprint(&bso, "%lux:%P\n\t\t", l+s+INITDAT, curp);
- for(j=0; j<c; j++)
- Bprint(&bso, "%.2ux", cast[fnuxi8[j+4]] & 0xff);
- Bprint(&bso, "\n");
- }
- for(; i<c; i++) {
- buf.dbuf[l] = cast[fnuxi8[i+4]];
- l++;
- }
- break;
- case 8:
- cast = (char*)&p->to.ieee;
- if(debug['a'] && i == 0) {
- Bprint(&bso, "%lux:%P\n\t\t", l+s+INITDAT, curp);
- for(j=0; j<c; j++)
- Bprint(&bso, "%.2ux", cast[fnuxi8[j]] & 0xff);
- Bprint(&bso, "\n");
- }
- for(; i<c; i++) {
- buf.dbuf[l] = cast[fnuxi8[i]];
- l++;
- }
- break;
- }
- break;
-
- case D_SCONST:
- if(debug['a'] && i == 0) {
- Bprint(&bso, "%lux:%P\n\t\t", l+s+INITDAT, curp);
- for(j=0; j<c; j++)
- Bprint(&bso, "%.2ux", p->to.scon[j] & 0xff);
- Bprint(&bso, "\n");
- }
- for(; i<c; i++) {
- buf.dbuf[l] = p->to.scon[i];
- l++;
- }
- break;
- default:
- fl = p->to.offset;
- if(p->to.sym) {
- if(p->to.sym->type == STEXT)
- fl += p->to.sym->value;
- if(p->to.sym->type == SDATA)
- fl += p->to.sym->value + INITDAT;
- if(p->to.sym->type == SBSS)
- fl += p->to.sym->value + INITDAT;
- }
-
- cast = (char*)&fl;
- switch(c) {
- default:
- diag("bad nuxi %d %d\n%P", c, i, curp);
- break;
- case 1:
- if(debug['a'] && i == 0) {
- Bprint(&bso, "%lux:%P\n\t\t", l+s+INITDAT, curp);
- for(j=0; j<c; j++)
- Bprint(&bso, "%.2ux",cast[inuxi1[j]] & 0xff);
- Bprint(&bso, "\n");
- }
- for(; i<c; i++) {
- buf.dbuf[l] = cast[inuxi1[i]];
- l++;
- }
- break;
- case 2:
- if(debug['a'] && i == 0) {
- Bprint(&bso, "%lux:%P\n\t\t", l+s+INITDAT, curp);
- for(j=0; j<c; j++)
- Bprint(&bso, "%.2ux",cast[inuxi2[j]] & 0xff);
- Bprint(&bso, "\n");
- }
- for(; i<c; i++) {
- buf.dbuf[l] = cast[inuxi2[i]];
- l++;
- }
- break;
- case 4:
- if(debug['a'] && i == 0) {
- Bprint(&bso, "%lux:%P\n\t\t", l+s+INITDAT, curp);
- for(j=0; j<c; j++)
- Bprint(&bso, "%.2ux",cast[inuxi4[j]] & 0xff);
- Bprint(&bso, "\n");
- }
- for(; i<c; i++) {
- buf.dbuf[l] = cast[inuxi4[i]];
- l++;
- }
- break;
- }
- break;
- }
- }
- write(cout, buf.dbuf, n);
-}
-
-int
-gnuxi(Ieee *d, int i, int c)
-{
- char *p;
- long l;
-
- switch(c) {
- default:
- diag("bad nuxi %d %d\n%P", c, i, curp);
- return 0;
-
- /*
- * 2301 vax
- * 0123 68k
- */
- case 4:
- l = ieeedtof(d);
- p = (char*)&l;
- i = gnuxi8[i+4];
- break;
-
- /*
- * 67452301 vax
- * 45670123 68k
- */
- case 8:
- p = (char*)d;
- i = gnuxi8[i];
- break;
- }
- return p[i];
-}
-
-long
-rnd(long v, long r)
-{
- long c;
-
- if(r <= 0)
- return v;
- v += r - 1;
- c = v % r;
- if(c < 0)
- c += r;
- v -= c;
- return v;
-}
diff --git a/utils/2l/l.h b/utils/2l/l.h
deleted file mode 100644
index 8b03604c..00000000
--- a/utils/2l/l.h
+++ /dev/null
@@ -1,263 +0,0 @@
-#include <lib9.h>
-#include <bio.h>
-#include "../2c/2.out.h"
-
-#ifndef EXTERN
-#define EXTERN extern
-#endif
-
-#define P ((Prog*)0)
-#define S ((Sym*)0)
-#define TNAME (curtext?curtext->from.sym->name:noname)
-#define CPUT(c)\
- { *cbp++ = c;\
- if(--cbc <= 0)\
- cflush(); }
-
-typedef struct Adr Adr;
-typedef struct Prog Prog;
-typedef struct Sym Sym;
-typedef struct Auto Auto;
-typedef struct Optab Optab;
-
-struct Adr
-{
- short type;
- short index;
- union
- {
- struct
- {
- long u0displace;
- long u0offset;
- } s0;
- char u0scon[8];
- Prog *u0cond; /* not used, but should be D_BRANCH */
- Ieee u0ieee;
- } u0;
- union
- {
- Auto* u1autom;
- Sym* u1sym;
- } u1;
- uchar field;
- uchar scale;
-};
-
-#define displace u0.s0.u0displace
-#define offset u0.s0.u0offset
-#define scon u0.u0scon
-#define cond u0.u0cond
-#define ieee u0.u0ieee
-
-#define autom u1.u1autom
-#define sym u1.u1sym
-
-struct Prog
-{
- Adr from;
- Adr to;
- union
- {
- long u0stkoff;
- Prog *u0forwd;
- } u0;
- Prog* link;
- Prog* pcond; /* work on this */
- long pc;
- long line;
- short as;
- uchar mark; /* work on these */
- uchar back;
-};
-
-#define stkoff u0.u0stkoff
-#define forwd u0.u0forwd
-
-struct Auto
-{
- Sym* asym;
- Auto* link;
- long aoffset;
- short type;
-};
-struct Sym
-{
- char *name;
- short type;
- short version;
- short become;
- short frame;
- long value;
- Sym* link;
-};
-struct Optab
-{
- short as;
- short fas;
- short srcsp;
- short dstsp;
- ushort optype;
- ushort opcode0;
- ushort opcode1;
- ushort opcode2;
- ushort opcode3;
-};
-
-enum
-{
- STEXT = 1,
- SDATA,
- SBSS,
- SDATA1,
- SXREF,
- SAUTO,
- SPARAM,
- SFILE,
- NHASH = 10007,
- NHUNK = 100000,
- MINSIZ = 4,
- STRINGSZ = 200,
- MAXIO = 8192,
- MAXHIST = 20, /* limit of path elements for history symbols */
- A6OFFSET = 32766
-};
-
-EXTERN union
-{
- struct
- {
- char obuf[MAXIO]; /* output buffer */
- uchar ibuf[MAXIO]; /* input buffer */
- } u;
- char dbuf[1];
-} buf;
-
-#define cbuf u.obuf
-#define xbuf u.ibuf
-
-EXTERN long HEADR;
-EXTERN long HEADTYPE;
-EXTERN long INITDAT;
-EXTERN long INITRND;
-EXTERN long INITTEXT;
-EXTERN char* INITENTRY; /* entry point */
-EXTERN Biobuf bso;
-EXTERN long bsssize;
-EXTERN long casepc;
-EXTERN int cbc;
-EXTERN char* cbp;
-EXTERN int cout;
-EXTERN Auto* curauto;
-EXTERN Auto* curhist;
-EXTERN Prog* curp;
-EXTERN Prog* curtext;
-EXTERN Prog* datap;
-EXTERN long datsize;
-EXTERN char debug[128];
-EXTERN Prog* etextp;
-EXTERN Prog* firstp;
-EXTERN char fnuxi8[8];
-EXTERN char gnuxi8[8];
-EXTERN Sym* hash[NHASH];
-EXTERN Sym* histfrog[MAXHIST];
-EXTERN int histfrogp;
-EXTERN int histgen;
-EXTERN char* library[50];
-EXTERN char* libraryobj[50];
-EXTERN int libraryp;
-EXTERN int xrefresolv;
-EXTERN char* hunk;
-EXTERN char inuxi1[1];
-EXTERN char inuxi2[2];
-EXTERN char inuxi4[4];
-EXTERN Prog* lastp;
-EXTERN long lcsize;
-EXTERN long ncase;
-EXTERN long ndata;
-EXTERN int nerrors;
-EXTERN long nhunk;
-EXTERN long nsymbol;
-EXTERN char* noname;
-EXTERN short* op;
-EXTERN char* outfile;
-EXTERN long pc;
-EXTERN char simple[I_MASK];
-EXTERN char special[I_MASK];
-EXTERN long spsize;
-EXTERN Sym* symlist;
-EXTERN long symsize;
-EXTERN Prog* textp;
-EXTERN long textsize;
-EXTERN long thunk;
-EXTERN int version;
-EXTERN Prog zprg;
-
-extern Optab optab[];
-extern char mmsize[];
-extern char* anames[];
-
-#pragma varargck type "A" int
-#pragma varargck type "D" Adr*
-#pragma varargck type "P" Prog*
-#pragma varargck type "R" int
-#pragma varargck type "S" char*
-
-int Aconv(Fmt*);
-int Dconv(Fmt*);
-int Pconv(Fmt*);
-int Rconv(Fmt*);
-int Sconv(Fmt*);
-int Xconv(Fmt*);
-void addhist(long, int);
-int andsize(Prog*, Adr*);
-Prog* appendp(Prog*);
-void asmb(void);
-int asmea(Prog*, Adr*);
-void asmins(Prog*);
-void asmlc(void);
-void asmsp(void);
-void asmsym(void);
-long atolwhex(char*);
-Prog* brchain(Prog*);
-Prog* brloop(Prog*);
-void cflush(void);
-Prog* copyp(Prog*);
-double cputime(void);
-void datblk(long, long);
-void diag(char*, ...);
-void dodata(void);
-void doprof1(void);
-void doprof2(void);
-void dostkoff(void);
-long entryvalue(void);
-void errorexit(void);
-int find1(long, int);
-int find2(long, int);
-void follow(void);
-void gethunk(void);
-int gnuxi(Ieee*, int, int);
-void histtoauto(void);
-double ieeedtod(Ieee*);
-long ieeedtof(Ieee*);
-void ldobj(int, long, char*);
-void loadlib(void);
-void listinit(void);
-Sym* lookup(char*, int);
-void lput(long);
-void main(int, char*[]);
-void mkfwd(void);
-void* mysbrk(ulong);
-void nuxiinit(void);
-void objfile(char*);
-void patch(void);
-Prog* prg(void);
-int relinv(int);
-long reuse(Prog*, Sym*);
-long rnd(long, long);
-void s16put(char*);
-void span(void);
-void undef(void);
-void xdefine(char*, int, long);
-void xfol(Prog*);
-int zaddr(uchar*, Adr*, Sym*[]);
diff --git a/utils/2l/list.c b/utils/2l/list.c
deleted file mode 100644
index 1ebf488e..00000000
--- a/utils/2l/list.c
+++ /dev/null
@@ -1,395 +0,0 @@
-#include "l.h"
-
-void
-listinit(void)
-{
-
- fmtinstall('R', Rconv);
- fmtinstall('A', Aconv);
- fmtinstall('D', Dconv);
- fmtinstall('S', Sconv);
- fmtinstall('P', Pconv);
-}
-
-static Prog *bigP;
-
-int
-Pconv(Fmt *fp)
-{
- char str[STRINGSZ], s[20];
- Prog *p;
-
- p = va_arg(fp->args, Prog*);
- bigP = p;
- sprint(str, "(%ld) %A %D,%D",
- p->line, p->as, &p->from, &p->to);
- if(p->from.field) {
- sprint(s, ",%d,%d", p->to.field, p->from.field);
- strcat(str, s);
- }
- bigP = P;
- return fmtstrcpy(fp, str);
-}
-
-int
-Aconv(Fmt *fp)
-{
-
- return fmtstrcpy(fp, anames[va_arg(fp->args, int)]);
-}
-
-int
-Xconv(Fmt *fp)
-{
- char str[20], s[10];
- int i0, i1;
-
- str[0] = 0;
- i0 = va_arg(fp->args, int) & D_MASK;
- i1 = va_arg(fp->args, int);
- if(i0 != D_NONE) {
- sprint(str, "(%R.", i0);
- sprint(s, "%c*%c)",
- "WWWWLLLL"[i1],
- "12481248"[i1]);
- strcat(str, s);
- }
- return fmtstrcpy(fp, str);
-}
-
-int
-Dconv(Fmt *fp)
-{
- char str[40], s[20];
- Adr *a;
- int i, j;
- long d;
-
- a = va_arg(fp->args, Adr*);
- i = a->index;
- if(i != D_NONE) {
- a->index = D_NONE;
- d = a->displace;
- a->displace = 0;
- switch(i & I_MASK) {
- default:
- sprint(str, "???%ld(%D)", d, a);
- break;
-
- case I_INDEX1:
- sprint(str, "%D", a);
- break;
-
- case I_INDEX2:
- if(d)
- sprint(str, "%ld(%D)", d, a);
- else
- sprint(str, "(%D)", a);
- break;
-
- case I_INDEX3:
- if(d)
- sprint(str, "%ld(%D", d, a);
- else
- sprint(str, "(%D", a);
- break;
- }
-
- if(i != D_NONE) {
- j = a->scale & 7;
- sprint(strchr(str,0), "(%R.", i);
- sprint(strchr(str,0), "%c*%c)",
- "WWWWLLLL"[j],
- "12481248"[j]);
- }
- if((i & I_MASK) == I_INDEX3)
- strcat(str, ")");
- a->displace = d;
- a->index = i;
- goto out;
- }
- i = a->type;
- j = i & I_MASK;
- if(j) {
- a->type = i & D_MASK;
- d = a->offset;
- a->offset = 0;
- switch(j) {
- case I_INDINC:
- sprint(str, "(%D)+", a);
- break;
-
- case I_INDDEC:
- sprint(str, "-(%D)", a);
- break;
-
- case I_INDIR:
- if(d)
- sprint(str, "%ld(%D)", d, a);
- else
- sprint(str, "(%D)", a);
- break;
-
- case I_ADDR:
- a->offset = d;
- sprint(str, "$%D", a);
- break;
- }
- a->type = i;
- a->offset = d;
- goto out;
- }
- switch(i) {
-
- default:
- sprint(str, "%R", i);
- break;
-
- case D_NONE:
- str[0] = 0;
- break;
-
- case D_BRANCH:
- if(bigP != P && bigP->pcond != P)
- if(a->sym != S)
- sprint(str, "%lux+%s", bigP->pcond->pc,
- a->sym->name);
- else
- sprint(str, "%lux", bigP->pcond->pc);
- else
- sprint(str, "%ld(PC)", a->offset);
- break;
-
- case D_EXTERN:
- sprint(str, "%s+%ld(SB)", a->sym->name, a->offset);
- break;
-
- case D_STATIC:
- sprint(str, "%s<%d>+%ld(SB)", a->sym->name,
- a->sym->version, a->offset);
- break;
-
- case D_AUTO:
- sprint(str, "%s+%ld(SP)", a->sym->name, a->offset);
- break;
-
- case D_PARAM:
- if(a->sym)
- sprint(str, "%s+%ld(FP)", a->sym->name, a->offset);
- else
- sprint(str, "%ld(FP)", a->offset);
- break;
-
- case D_CONST:
- sprint(str, "$%ld", a->offset);
- break;
-
- case D_STACK:
- sprint(str, "TOS+%ld", a->offset);
- break;
-
- case D_QUICK:
- sprint(str, "$Q%ld", a->offset);
- break;
-
- case D_FCONST:
- sprint(str, "$(%.8lux,%.8lux)", a->ieee.h, a->ieee.l);
- goto out;
-
- case D_SCONST:
- sprint(str, "$\"%S\"", a->scon);
- goto out;
- }
- if(a->displace) {
- sprint(s, "/%ld", a->displace);
- strcat(str, s);
- }
-out:
- return fmtstrcpy(fp, str);
-}
-
-int
-Rconv(Fmt *fp)
-{
- char str[20];
- int r;
-
- r = va_arg(fp->args, int);
- if(r >= D_R0 && r < D_R0+NREG)
- sprint(str, "R%d", r-D_R0);
- else
- if(r >= D_A0 && r < D_A0+NREG)
- sprint(str, "A%d", r-D_A0);
- else
- if(r >= D_F0 && r < D_F0+NREG)
- sprint(str, "F%d", r-D_F0);
- else
- switch(r) {
-
- default:
- sprint(str, "gok(%d)", r);
- break;
-
- case D_NONE:
- sprint(str, "NONE");
- break;
-
- case D_TOS:
- sprint(str, "TOS");
- break;
-
- case D_CCR:
- sprint(str, "CCR");
- break;
-
- case D_SR:
- sprint(str, "SR");
- break;
-
- case D_SFC:
- sprint(str, "SFC");
- break;
-
- case D_DFC:
- sprint(str, "DFC");
- break;
-
- case D_CACR:
- sprint(str, "CACR");
- break;
-
- case D_USP:
- sprint(str, "USP");
- break;
-
- case D_VBR:
- sprint(str, "VBR");
- break;
-
- case D_CAAR:
- sprint(str, "CAAR");
- break;
-
- case D_MSP:
- sprint(str, "MSP");
- break;
-
- case D_ISP:
- sprint(str, "ISP");
- break;
-
- case D_FPCR:
- sprint(str, "FPCR");
- break;
-
- case D_FPSR:
- sprint(str, "FPSR");
- break;
-
- case D_FPIAR:
- sprint(str, "FPIAR");
- break;
-
- case D_TREE:
- sprint(str, "TREE");
- break;
-
- case D_TC:
- sprint(str, "TC");
- break;
-
- case D_ITT0:
- sprint(str, "ITT0");
- break;
-
- case D_ITT1:
- sprint(str, "ITT1");
- break;
-
- case D_DTT0:
- sprint(str, "DTT0");
- break;
-
- case D_DTT1:
- sprint(str, "DTT1");
- break;
-
- case D_MMUSR:
- sprint(str, "MMUSR");
- break;
- case D_URP:
- sprint(str, "URP");
- break;
-
- case D_SRP:
- sprint(str, "SRP");
- break;
- }
- return fmtstrcpy(fp, str);
-}
-
-int
-Sconv(Fmt *fp)
-{
- int i, c;
- char str[30], *p, *a;
-
- a = va_arg(fp->args, char*);
- p = str;
- for(i=0; i<sizeof(double); i++) {
- c = a[i] & 0xff;
- if(c >= 'a' && c <= 'z' ||
- c >= 'A' && c <= 'Z' ||
- c >= '0' && c <= '9') {
- *p++ = c;
- continue;
- }
- *p++ = '\\';
- switch(c) {
- default:
- if(c < 040 || c >= 0177)
- break; /* not portable */
- p[-1] = c;
- continue;
- case 0:
- *p++ = 'z';
- continue;
- case '\\':
- case '"':
- *p++ = c;
- continue;
- case '\n':
- *p++ = 'n';
- continue;
- case '\t':
- *p++ = 't';
- continue;
- }
- *p++ = (c>>6) + '0';
- *p++ = ((c>>3) & 7) + '0';
- *p++ = (c & 7) + '0';
- }
- *p = 0;
- return fmtstrcpy(fp, str);
-}
-
-void
-diag(char *fmt, ...)
-{
- char buf[STRINGSZ], *tn;
- va_list arg;
-
- tn = "??none??";
- if(curtext != P && curtext->from.sym != S)
- tn = curtext->from.sym->name;
- va_start(arg, fmt);
- vseprint(buf, buf+sizeof(buf), fmt, arg);
- va_end(arg);
- print("%s: %s\n", tn, buf);
-
- nerrors++;
- if(nerrors > 10) {
- print("too many errors\n");
- errorexit();
- }
-}
diff --git a/utils/2l/mkfile b/utils/2l/mkfile
deleted file mode 100644
index c52b5ce7..00000000
--- a/utils/2l/mkfile
+++ /dev/null
@@ -1,26 +0,0 @@
-<../../mkconfig
-
-TARG=2l
-OFILES=\
- asm.$O\
- obj.$O\
- optab.$O\
- pass.$O\
- span.$O\
- list.$O\
- enam.$O\
- $TARGMODEL.$O\
-
-HFILES=\
- l.h\
- ../2c/2.out.h\
- ../include/ar.h\
-
-LIBS=bio 9
-BIN=$ROOT/$OBJDIR/bin
-<$ROOT/mkfiles/mkone-$SHELLTYPE
-
-CFLAGS= $CFLAGS -I ../include
-
-enam.$O: ../2c/enam.c
- $CC $CFLAGS ../2c/enam.c
diff --git a/utils/2l/obj.c b/utils/2l/obj.c
deleted file mode 100644
index 9cc85565..00000000
--- a/utils/2l/obj.c
+++ /dev/null
@@ -1,1402 +0,0 @@
-#define EXTERN
-#include "l.h"
-#include <ar.h>
-
-#ifndef DEFAULT
-#define DEFAULT '9'
-#endif
-
-char *noname = "<none>";
-char symname[] = SYMDEF;
-char thechar = '2';
-char *thestring = "68020";
-
-/*
- * -H0 -T0x40004C -D0x10000000 is garbage unix
- * -H1 -T0x80020000 -R4 is garbage format
- * -H2 -T8224 -R8192 is plan9 format
- * -H3 -Tx -Rx is next boot
- */
-
-void
-main(int argc, char *argv[])
-{
- int i, c;
- char *a;
-
- Binit(&bso, 1, OWRITE);
- cout = -1;
- listinit();
- memset(debug, 0, sizeof(debug));
- nerrors = 0;
- outfile = "2.out";
- HEADTYPE = -1;
- INITTEXT = -1;
- INITDAT = -1;
- INITRND = -1;
- INITENTRY = 0;
-
- ARGBEGIN {
- default:
- c = ARGC();
- if(c >= 0 && c < sizeof(debug))
- debug[c]++;
- break;
- case 'o': /* output to (next arg) */
- outfile = ARGF();
- break;
- case 'E':
- a = ARGF();
- if(a)
- INITENTRY = a;
- break;
- case 'H':
- a = ARGF();
- if(a)
- HEADTYPE = atolwhex(a);
- break;
- case 'T':
- a = ARGF();
- if(a)
- INITTEXT = atolwhex(a);
- break;
- case 'D':
- a = ARGF();
- if(a)
- INITDAT = atolwhex(a);
- break;
- case 'R':
- a = ARGF();
- if(a)
- INITRND = atolwhex(a);
- break;
- } ARGEND
-
- USED(argc);
-
- if(*argv == 0) {
- diag("usage: 2l [-options] objects");
- errorexit();
- }
- if(!debug['9'] && !debug['U'] && !debug['B'])
- debug[DEFAULT] = 1;
- if(HEADTYPE == -1) {
- if(debug['U'])
- HEADTYPE = 2;
- if(debug['B'])
- HEADTYPE = 2;
- if(debug['9'])
- HEADTYPE = 2;
- }
- if(INITDAT != -1 && INITRND == -1)
- INITRND = 0;
- switch(HEADTYPE) {
- default:
- diag("unknown -H option %d", HEADTYPE);
- errorexit();
-
- case 0: /* this is garbage */
- HEADR = 20L+56L;
- if(INITTEXT == -1)
- INITTEXT = 0x40004CL;
- if(INITDAT == -1)
- INITDAT = 0x10000000L;
- if(INITDAT != 0 && INITRND == -1)
- INITRND = 0;
- if(INITRND == -1)
- INITRND = 0;
- break;
- case 1: /* plan9 boot data goes into text */
- HEADR = 32L;
- if(INITTEXT == -1)
- INITTEXT = 8224;
- if(INITDAT == -1)
- INITDAT = 0;
- if(INITDAT != 0 && INITRND == -1)
- INITRND = 0;
- if(INITRND == -1)
- INITRND = 8192;
- break;
- case 2: /* plan 9 */
- HEADR = 32L;
- if(INITTEXT == -1)
- INITTEXT = 8224;
- if(INITDAT == -1)
- INITDAT = 0;
- if(INITDAT != 0 && INITRND == -1)
- INITRND = 0;
- if(INITRND == -1)
- INITRND = 8192;
- break;
- case 3: /* next boot */
- HEADR = 28+124+192+24;
- if(INITTEXT == -1)
- INITTEXT = 0x04002000;
- if(INITDAT == -1)
- INITDAT = 0;
- if(INITDAT != 0 && INITRND == -1)
- INITRND = 0;
- if(INITRND == -1)
- INITRND = 8192L;
- break;
- case 4: /* preprocess pilot */
- HEADR = 32L;
- if(INITTEXT == -1)
- INITTEXT = 0;
- if(INITDAT == -1)
- INITDAT = 0;
- if(INITDAT != 0 && INITRND == -1)
- INITRND = 0;
- if(INITRND == -1)
- INITRND = 32;
- break;
- }
- if(INITDAT != 0 && INITRND != 0)
- print("warning: -D0x%lux is ignored because of -R0x%lux\n",
- INITDAT, INITRND);
- if(debug['v'])
- Bprint(&bso, "HEADER = -H0x%ld -T0x%lux -D0x%lux -R0x%lux\n",
- HEADTYPE, INITTEXT, INITDAT, INITRND);
- Bflush(&bso);
- for(i=1; optab[i].as; i++)
- if(i != optab[i].as) {
- diag("phase error in optab: %d", i);
- errorexit();
- }
-
- zprg.link = P;
- zprg.pcond = P;
- zprg.back = 2;
- zprg.as = AGOK;
- zprg.from.type = D_NONE;
- zprg.from.index = D_NONE;
- zprg.to = zprg.from;
-
- memset(special, 0, sizeof(special));
- special[D_CCR] = 1;
- special[D_SR] = 1;
- special[D_SFC] = 1;
- special[D_CACR] = 1;
- special[D_USP] = 1;
- special[D_VBR] = 1;
- special[D_CAAR] = 1;
- special[D_MSP] = 1;
- special[D_ISP] = 1;
- special[D_DFC] = 1;
- special[D_FPCR] = 1;
- special[D_FPSR] = 1;
- special[D_FPIAR] = 1;
- special[D_TC] = 1;
- special[D_ITT0] = 1;
- special[D_ITT1] = 1;
- special[D_DTT0] = 1;
- special[D_DTT1] = 1;
- special[D_MMUSR] = 1;
- special[D_URP] = 1;
- special[D_SRP] = 1;
- memset(simple, 0177, sizeof(simple));
- for(i=0; i<8; i++) {
- simple[D_R0+i] = i;
- simple[D_F0+i] = i+0100;
- simple[D_A0+i] = i+010;
- simple[D_A0+I_INDIR+i] = i+020;
- simple[D_A0+I_INDINC+i] = i+030;
- simple[D_A0+I_INDDEC+i] = i+040;
- }
- nuxiinit();
- histgen = 0;
- textp = P;
- datap = P;
- pc = 0;
- cout = create(outfile, 1, 0775);
- if(cout < 0) {
- diag("cannot create %s", outfile);
- errorexit();
- }
- version = 0;
- cbp = buf.cbuf;
- cbc = sizeof(buf.cbuf);
- firstp = prg();
- lastp = firstp;
-
- if(INITENTRY == 0) {
- INITENTRY = "_main";
- if(debug['p'])
- INITENTRY = "_mainp";
- if(!debug['l'])
- lookup(INITENTRY, 0)->type = SXREF;
- } else
- lookup(INITENTRY, 0)->type = SXREF;
-
- while(*argv)
- objfile(*argv++);
- if(!debug['l'])
- loadlib();
- firstp = firstp->link;
- if(firstp == P)
- errorexit();
- patch();
- if(debug['p'])
- if(debug['1'])
- doprof1();
- else
- doprof2();
- follow();
- dodata();
- dostkoff();
- span();
- asmb();
- undef();
- if(debug['v']) {
- Bprint(&bso, "%5.2f cpu time\n", cputime());
- Bprint(&bso, "%ld+%ld = %ld data statements\n",
- ndata, ncase, ndata+ncase);
- Bprint(&bso, "%ld symbols\n", nsymbol);
- Bprint(&bso, "%ld memory used\n", thunk);
- Bprint(&bso, "%d sizeof adr\n", sizeof(Adr));
- Bprint(&bso, "%d sizeof prog\n", sizeof(Prog));
- }
- Bflush(&bso);
-
- errorexit();
-}
-
-void
-loadlib(void)
-{
- int i;
- long h;
- Sym *s;
-
-loop:
- xrefresolv = 0;
- for(i=0; i<libraryp; i++) {
- if(debug['v'])
- Bprint(&bso, "%5.2f autolib: %s (from %s)\n", cputime(), library[i], libraryobj[i]);
- objfile(library[i]);
- }
- if(xrefresolv)
- for(h=0; h<nelem(hash); h++)
- for(s = hash[h]; s != S; s = s->link)
- if(s->type == SXREF)
- goto loop;
-}
-
-void
-errorexit(void)
-{
-
- Bflush(&bso);
- if(nerrors) {
- if(cout >= 0)
- remove(outfile);
- exits("error");
- }
- exits(0);
-}
-
-void
-objfile(char *file)
-{
- long off, esym, cnt, l;
- int f, work;
- Sym *s;
- char magbuf[SARMAG];
- char name[100], pname[150];
- struct ar_hdr arhdr;
- char *e, *start, *stop;
-
- if(file[0] == '-' && file[1] == 'l') {
- if(debug['9'])
- sprint(name, "/%s/lib/lib", thestring);
- else
- sprint(name, "/usr/%clib/lib", thechar);
- strcat(name, file+2);
- strcat(name, ".a");
- file = name;
- }
- if(debug['v'])
- Bprint(&bso, "%5.2f ldobj: %s\n", cputime(), file);
- Bflush(&bso);
- f = open(file, 0);
- if(f < 0) {
- diag("cannot open file: %s", file);
- errorexit();
- }
- l = read(f, magbuf, SARMAG);
- if(l != SARMAG || strncmp(magbuf, ARMAG, SARMAG)){
- /* load it as a regular file */
- l = seek(f, 0L, 2);
- seek(f, 0L, 0);
- ldobj(f, l, file);
- close(f);
- return;
- }
-
- l = read(f, &arhdr, SAR_HDR);
- if(l != SAR_HDR) {
- diag("%s: short read on archive file symbol header", file);
- goto out;
- }
- if(strncmp(arhdr.name, symname, strlen(symname))) {
- diag("%s: first entry not symbol header", file);
- goto out;
- }
-
- esym = SARMAG + SAR_HDR + atolwhex(arhdr.size);
- off = SARMAG + SAR_HDR;
-
- /*
- * just bang the whole symbol file into memory
- */
- seek(f, off, 0);
- cnt = esym - off;
- start = malloc(cnt + 10);
- cnt = read(f, start, cnt);
- if(cnt <= 0){
- close(f);
- return;
- }
- stop = &start[cnt];
- memset(stop, 0, 10);
-
- work = 1;
- while(work){
- if(debug['v'])
- Bprint(&bso, "%5.2f library pass: %s\n", cputime(), file);
- Bflush(&bso);
- work = 0;
- for(e = start; e < stop; e = strchr(e+5, 0) + 1) {
- s = lookup(e+5, 0);
- if(s->type != SXREF)
- continue;
- sprint(pname, "%s(%s)", file, s->name);
- if(debug['v'])
- Bprint(&bso, "%5.2f library: %s\n", cputime(), pname);
- Bflush(&bso);
- l = e[1] & 0xff;
- l |= (e[2] & 0xff) << 8;
- l |= (e[3] & 0xff) << 16;
- l |= (e[4] & 0xff) << 24;
- seek(f, l, 0);
- l = read(f, &arhdr, SAR_HDR);
- if(l != SAR_HDR)
- goto bad;
- if(strncmp(arhdr.fmag, ARFMAG, sizeof(arhdr.fmag)))
- goto bad;
- l = atolwhex(arhdr.size);
- ldobj(f, l, pname);
- if(s->type == SXREF) {
- diag("%s: failed to load: %s", file, s->name);
- errorexit();
- }
- work = 1;
- xrefresolv = 1;
- }
- }
- return;
-
-bad:
- diag("%s: bad or out of date archive", file);
-out:
- close(f);
-}
-
-int
-zaddr(uchar *p, Adr *a, Sym *h[])
-{
- int c, t, i;
- long l;
- Sym *s;
- Auto *u;
-
- t = p[0];
-
- /*
- * first try the high-time formats
- */
- if(t == 0) {
- a->index = D_NONE;
- a->type = p[1];
- return 2;
- }
- if(t == T_OFFSET) {
- a->index = D_NONE;
- a->offset = p[1] | (p[2]<<8) | (p[3]<<16) | (p[4]<<24);
- a->type = p[5];
- return 6;
- }
- if(t == (T_OFFSET|T_SYM)) {
- a->index = D_NONE;
- a->offset = p[1] | (p[2]<<8) | (p[3]<<16) | (p[4]<<24);
- s = h[p[5]];
- a->sym = s;
- a->type = p[6];
- c = 7;
- goto dosym;
- }
- if(t == T_SYM) {
- a->index = D_NONE;
- s = h[p[1]];
- a->sym = s;
- a->type = p[2];
- c = 3;
- goto dosym;
- }
- if(t == (T_INDEX|T_OFFSET|T_SYM)) {
- a->index = p[1] | (p[2]<<8);
- a->scale = p[3];
- a->displace = p[4] | (p[5]<<8) | (p[6]<<16) | (p[7]<<24);
- a->offset = p[8] | (p[9]<<8) | (p[10]<<16) | (p[11]<<24);
- s = h[p[12]];
- a->sym = s;
- a->type = p[13];
- c = 14;
- goto dosym;
- }
-
- /*
- * now do it the hard way
- */
- c = 1;
- a->index = D_NONE;
- if(t & T_FIELD) {
- a->field = p[c] | (p[c+1]<<8);
- c += 2;
- }
- if(t & T_INDEX) {
- a->index = p[c] | (p[c+1]<<8);
- a->scale = p[c+2];
- a->displace = p[c+3] | (p[c+4]<<8) | (p[c+5]<<16) | (p[c+6]<<24);
- c += 7;
- }
- if(t & T_OFFSET) {
- a->offset = p[c] | (p[c+1]<<8) | (p[c+2]<<16) | (p[c+3]<<24);
- c += 4;
- }
- if(t & T_SYM) {
- a->sym = h[p[c]];
- c += 1;
- }
- if(t & T_FCONST) {
- a->ieee.l = p[c] | (p[c+1]<<8) | (p[c+2]<<16) | (p[c+3]<<24);
- a->ieee.h = p[c+4] | (p[c+5]<<8) | (p[c+6]<<16) | (p[c+7]<<24);
- c += 8;
- a->type = D_FCONST;
- } else
- if(t & T_SCONST) {
- for(i=0; i<NSNAME; i++)
- a->scon[i] = p[c+i];
- c += NSNAME;
- a->type = D_SCONST;
- } else
- if(t & T_TYPE) {
- a->type = p[c] | (p[c+1]<<8);
- c += 2;
- } else {
- a->type = p[c];
- c++;
- }
- s = a->sym;
- if(s == S)
- return c;
-
-dosym:
- t = a->type & D_MASK;
- if(t != D_AUTO && t != D_PARAM)
- return c;
- l = a->offset;
- for(u=curauto; u; u=u->link) {
- if(u->asym == s)
- if(u->type == t) {
- if(u->aoffset > l)
- u->aoffset = l;
- return c;
- }
- }
-
- while(nhunk < sizeof(Auto))
- gethunk();
- u = (Auto*)hunk;
- nhunk -= sizeof(Auto);
- hunk += sizeof(Auto);
-
- u->link = curauto;
- curauto = u;
- u->asym = s;
- u->aoffset = l;
- u->type = t;
- return c;
-}
-
-void
-addlib(char *obj)
-{
- char name[1024], comp[256], *p;
- int i;
-
- if(histfrogp <= 0)
- return;
-
- if(histfrog[0]->name[1] == '/') {
- sprint(name, "");
- i = 1;
- } else
- if(histfrog[0]->name[1] == '.') {
- sprint(name, ".");
- i = 0;
- } else {
- if(debug['9'])
- sprint(name, "/%s/lib", thestring);
- else
- sprint(name, "/usr/%clib", thechar);
- i = 0;
- }
-
- for(; i<histfrogp; i++) {
- snprint(comp, sizeof comp, histfrog[i]->name+1);
- for(;;) {
- p = strstr(comp, "$O");
- if(p == 0)
- break;
- memmove(p+1, p+2, strlen(p+2)+1);
- p[0] = thechar;
- }
- for(;;) {
- p = strstr(comp, "$M");
- if(p == 0)
- break;
- if(strlen(comp)+strlen(thestring)-2+1 >= sizeof comp) {
- diag("library component too long");
- return;
- }
- memmove(p+strlen(thestring), p+2, strlen(p+2)+1);
- memmove(p, thestring, strlen(thestring));
- }
- if(strlen(name) + strlen(comp) + 3 >= sizeof(name)) {
- diag("library component too long");
- return;
- }
- strcat(name, "/");
- strcat(name, comp);
- }
- for(i=0; i<libraryp; i++)
- if(strcmp(name, library[i]) == 0)
- return;
- if(libraryp == nelem(library)){
- diag("too many autolibs; skipping %s", name);
- return;
- }
-
- p = malloc(strlen(name) + 1);
- strcpy(p, name);
- library[libraryp] = p;
- p = malloc(strlen(obj) + 1);
- strcpy(p, obj);
- libraryobj[libraryp] = p;
- libraryp++;
-}
-void
-addhist(long line, int type)
-{
- Auto *u;
- Sym *s;
- int i, j, k;
-
- u = malloc(sizeof(Auto));
- s = malloc(sizeof(Sym));
- s->name = malloc(2*(histfrogp+1) + 1);
-
- u->asym = s;
- u->type = type;
- u->aoffset = line;
- u->link = curhist;
- curhist = u;
-
- j = 1;
- for(i=0; i<histfrogp; i++) {
- k = histfrog[i]->value;
- s->name[j+0] = k>>8;
- s->name[j+1] = k;
- j += 2;
- }
-}
-
-void
-histtoauto(void)
-{
- Auto *l;
-
- while(l = curhist) {
- curhist = l->link;
- l->link = curauto;
- curauto = l;
- }
-}
-
-void
-collapsefrog(Sym *s)
-{
- int i;
-
- /*
- * bad encoding of path components only allows
- * MAXHIST components. if there is an overflow,
- * first try to collapse xxx/..
- */
- for(i=1; i<histfrogp; i++)
- if(strcmp(histfrog[i]->name+1, "..") == 0) {
- memmove(histfrog+i-1, histfrog+i+1,
- (histfrogp-i-1)*sizeof(histfrog[0]));
- histfrogp--;
- goto out;
- }
-
- /*
- * next try to collapse .
- */
- for(i=0; i<histfrogp; i++)
- if(strcmp(histfrog[i]->name+1, ".") == 0) {
- memmove(histfrog+i, histfrog+i+1,
- (histfrogp-i-1)*sizeof(histfrog[0]));
- goto out;
- }
-
- /*
- * last chance, just truncate from front
- */
- memmove(histfrog+0, histfrog+1,
- (histfrogp-1)*sizeof(histfrog[0]));
-
-out:
- histfrog[histfrogp-1] = s;
-}
-
-uchar*
-readsome(int f, uchar *buf, uchar *good, uchar *stop, int max)
-{
- int n;
-
- n = stop - good;
- memmove(buf, good, stop - good);
- stop = buf + n;
- n = MAXIO - n;
- if(n > max)
- n = max;
- n = read(f, stop, n);
- if(n <= 0)
- return 0;
- return stop + n;
-}
-
-void
-ldobj(int f, long c, char *pn)
-{
- Prog *p;
- Sym *h[NSYM], *s;
- int v, o, r;
- long ipc, lv;
- double dv;
- uchar *bloc, *bsize, *stop;
-
- bsize = buf.xbuf;
- bloc = buf.xbuf;
-
-newloop:
- memset(h, 0, sizeof(h));
- version++;
- histfrogp = 0;
- ipc = pc;
-
-loop:
- if(c <= 0)
- goto eof;
- r = bsize - bloc;
- if(r < 100 && r < c) { /* enough for largest prog */
- bsize = readsome(f, buf.xbuf, bloc, bsize, c);
- if(bsize == 0)
- goto eof;
- bloc = buf.xbuf;
- goto loop;
- }
- o = bloc[0] | (bloc[1] << 8);
- if(o <= AXXX || o >= ALAST) {
- if(o < 0)
- goto eof;
- diag("%s: opcode out of range %d", pn, o);
- print(" probably not a .2 file\n");
- errorexit();
- }
-
- if(o == ANAME || o == ASIGNAME) {
- if(o == ASIGNAME) {
- bloc += 4;
- c -= 4;
- }
- stop = memchr(&bloc[4], 0, bsize-&bloc[4]);
- if(stop == 0){
- bsize = readsome(f, buf.xbuf, bloc, bsize, c);
- if(bsize == 0)
- goto eof;
- bloc = buf.xbuf;
- stop = memchr(&bloc[4], 0, bsize-&bloc[4]);
- if(stop == 0){
- fprint(2, "%s: name too long\n", pn);
- errorexit();
- }
- }
- v = bloc[2]; /* type */
- o = bloc[3]; /* sym */
- bloc += 4;
- c -= 4;
-
- r = 0;
- if(v == D_STATIC)
- r = version;
- s = lookup((char*)bloc, r);
- c -= &stop[1] - bloc;
- bloc = stop + 1;
-
- if(debug['W'])
- print(" ANAME %s\n", s->name);
- h[o] = s;
- if((v == D_EXTERN || v == D_STATIC) && s->type == 0)
- s->type = SXREF;
- if(v == D_FILE) {
- if(s->type != SFILE) {
- histgen++;
- s->type = SFILE;
- s->value = histgen;
- }
- if(histfrogp < MAXHIST) {
- histfrog[histfrogp] = s;
- histfrogp++;
- } else
- collapsefrog(s);
- }
- goto loop;
- }
-
- while(nhunk < sizeof(Prog))
- gethunk();
- p = (Prog*)hunk;
- nhunk -= sizeof(Prog);
- hunk += sizeof(Prog);
-
- p->as = o;
- p->line = bloc[2] | (bloc[3] << 8) | (bloc[4] << 16) | (bloc[5] << 24);
- p->back = 2;
- r = zaddr(bloc+6, &p->from, h) + 6;
- r += zaddr(bloc+r, &p->to, h);
- bloc += r;
- c -= r;
-
- if(debug['W'])
- print("%P\n", p);
-
- switch(p->as) {
- case AHISTORY:
- if(p->to.offset == -1) {
- addlib(pn);
- histfrogp = 0;
- goto loop;
- }
- addhist(p->line, D_FILE); /* 'z' */
- if(p->to.offset)
- addhist(p->to.offset, D_FILE1); /* 'Z' */
- histfrogp = 0;
- goto loop;
-
- case AEND:
- histtoauto();
- if(curtext != P)
- curtext->to.autom = curauto;
- curauto = 0;
- curtext = P;
- if(c)
- goto newloop;
- return;
-
- case AGLOBL:
- s = p->from.sym;
- if(s->type == 0 || s->type == SXREF) {
- s->type = SBSS;
- s->value = 0;
- }
- if(s->type != SBSS) {
- diag("%s: redefinition: %s in %s",
- pn, s->name, TNAME);
- s->type = SBSS;
- s->value = 0;
- }
- if(p->to.offset > s->value)
- s->value = p->to.offset;
- goto loop;
-
- case ABCASE:
- ncase++;
- goto casdef;
-
- case ADATA:
- p->link = datap;
- datap = p;
- ndata++;
- goto loop;
-
- case AGOK:
- diag("%s: unknown opcode in %s", pn, TNAME);
- pc++;
- goto loop;
-
- case ATEXT:
- if(curtext != P) {
- histtoauto();
- curtext->to.autom = curauto;
- curauto = 0;
- }
- curtext = p;
- lastp->link = p;
- lastp = p;
- p->pc = pc;
- s = p->from.sym;
- if(s->type != 0 && s->type != SXREF)
- diag("%s: redefinition: %s", pn, s->name);
- s->type = STEXT;
- s->value = p->pc;
- pc++;
- p->pcond = P;
- if(textp == P) {
- textp = p;
- etextp = p;
- goto loop;
- }
- etextp->pcond = p;
- etextp = p;
- goto loop;
-
- case AJSR:
- p->as = ABSR;
-
- case ABSR:
- if(p->to.index != D_NONE)
- p->as = AJSR;
- if(p->to.type != D_EXTERN && p->to.type != D_STATIC)
- p->as = AJSR;
- goto casdef;
-
- case AMOVL:
- case AMOVB:
- case AMOVW:
- if(p->from.type != D_CONST)
- goto casdef;
- lv = p->from.offset;
- if(lv >= -128 && lv < 128)
- if(p->to.type >= D_R0 && p->to.type < D_R0+8)
- if(p->to.index == D_NONE) {
- p->from.type = D_QUICK;
- goto casdef;
- }
-
- if(lv >= -0x7fff && lv <= 0x7fff)
- if(p->to.type >= D_A0 && p->to.type < D_A0+8)
- if(p->to.index == D_NONE)
- if(p->as == AMOVL)
- p->as = AMOVW;
- goto casdef;
-
- case AADDB:
- case AADDL:
- case AADDW:
- if(p->from.type != D_CONST)
- goto casdef;
- lv = p->from.offset;
- if(lv < 0) {
- lv = -lv;
- p->from.offset = lv;
- if(p->as == AADDB)
- p->as = ASUBB;
- else
- if(p->as == AADDW)
- p->as = ASUBW;
- else
- if(p->as == AADDL)
- p->as = ASUBL;
- }
- if(lv > 0)
- if(lv <= 8)
- p->from.type = D_QUICK;
- goto casdef;
-
- case ASUBB:
- case ASUBL:
- case ASUBW:
- if(p->from.type != D_CONST)
- goto casdef;
- lv = p->from.offset;
- if(lv < 0) {
- lv = -lv;
- p->from.offset = lv;
- if(p->as == ASUBB)
- p->as = AADDB;
- else
- if(p->as == ASUBW)
- p->as = AADDW;
- else
- if(p->as == ASUBL)
- p->as = AADDL;
- }
- if(lv > 0)
- if(lv <= 8)
- p->from.type = D_QUICK;
- goto casdef;
-
- case AROTRB:
- case AROTRL:
- case AROTRW:
- case AROTLB:
- case AROTLL:
- case AROTLW:
-
- case AASLB:
- case AASLL:
- case AASLW:
- case AASRB:
- case AASRL:
- case AASRW:
- case ALSLB:
- case ALSLL:
- case ALSLW:
- case ALSRB:
- case ALSRL:
- case ALSRW:
- if(p->from.type == D_CONST)
- if(p->from.offset > 0)
- if(p->from.offset <= 8)
- p->from.type = D_QUICK;
- goto casdef;
-
- case ATSTL:
- if(p->to.type >= D_A0 && p->to.type < D_A0+8) {
- p->as = ACMPW;
- p->from = p->to;
- p->to.type = D_CONST;
- p->to.offset = 0;
- }
- goto casdef;
-
- case ACMPL:
- if(p->to.type != D_CONST)
- goto casdef;
- lv = p->to.offset;
- if(lv >= -0x7fff && lv <= 0x7fff)
- if(p->from.type >= D_A0 && p->from.type < D_A0+8)
- if(p->from.index == D_NONE)
- p->as = ACMPW;
- goto casdef;
-
- case ACLRL:
- if(p->to.type >= D_A0 && p->to.type < D_A0+8) {
- p->as = AMOVW;
- p->from.type = D_CONST;
- p->from.offset = 0;
- }
- goto casdef;
-
- casdef:
- default:
- if(p->from.type == D_FCONST)
- if(optab[p->as].fas != AXXX) {
- dv = ieeedtod(&p->from.ieee);
- if(dv >= -(1L<<30) && dv <= (1L<<30)) {
- lv = dv;
- if(lv == dv) {
- p->as = optab[p->as].fas;
- p->from.type = D_CONST;
- p->from.offset = lv;
- p->from.displace = 0;
- }
- }
- }
- if(p->to.type == D_BRANCH)
- p->to.offset += ipc;
- lastp->link = p;
- lastp = p;
- p->pc = pc;
- pc++;
- goto loop;
- }
- /* not reached */
-
-eof:
- diag("%s: truncated object file in %s", pn, TNAME);
-}
-
-Sym*
-lookup(char *symb, int v)
-{
- Sym *s;
- char *p;
- long h;
- int l, c;
-
- h = v;
- for(p=symb; c = *p; p++)
- h = h+h+h + c;
- l = (p - symb) + 1;
- if(h < 0)
- h = ~h;
- h %= NHASH;
- for(s = hash[h]; s != S; s = s->link)
- if(s->version == v)
- if(memcmp(s->name, symb, l) == 0)
- return s;
-
- while(nhunk < sizeof(Sym))
- gethunk();
- s = (Sym*)hunk;
- nhunk -= sizeof(Sym);
- hunk += sizeof(Sym);
-
- s->name = malloc(l + 1);
- memmove(s->name, symb, l);
-
- s->link = hash[h];
- s->type = 0;
- s->version = v;
- s->value = 0;
- hash[h] = s;
- nsymbol++;
- return s;
-}
-
-Prog*
-prg(void)
-{
- Prog *p;
-
- while(nhunk < sizeof(Prog))
- gethunk();
- p = (Prog*)hunk;
- nhunk -= sizeof(Prog);
- hunk += sizeof(Prog);
-
- *p = zprg;
- return p;
-}
-
-Prog*
-copyp(Prog *q)
-{
- Prog *p;
-
- p = prg();
- *p = *q;
- return p;
-}
-
-Prog*
-appendp(Prog *q)
-{
- Prog *p;
-
- p = prg();
- p->link = q->link;
- q->link = p;
- p->line = q->line;
- return p;
-}
-
-void
-gethunk(void)
-{
- char *h;
- long nh;
-
- nh = NHUNK;
- if(thunk >= 5L*NHUNK) {
- nh = 5L*NHUNK;
- if(thunk >= 25L*NHUNK)
- nh = 25L*NHUNK;
- }
- h = mysbrk(nh);
- if(h == (char*)-1) {
- diag("out of memory");
- errorexit();
- }
- hunk = h;
- nhunk = nh;
- thunk += nh;
-}
-
-void
-doprof1(void)
-{
- Sym *s;
- long n;
- Prog *p, *q;
-
- if(debug['v'])
- Bprint(&bso, "%5.2f profile 1\n", cputime());
- Bflush(&bso);
- s = lookup("__mcount", 0);
- n = 1;
- for(p = firstp->link; p != P; p = p->link) {
- if(p->as == ATEXT) {
- q = prg();
- q->as = AADDL;
- q->line = p->line;
- q->pc = p->pc;
- q->link = p->link;
- p->link = q;
- q->from.type = D_CONST;
- q->from.offset = 1;
- q->to.type = D_EXTERN;
- q->to.sym = s;
- q->to.offset = n*4 + 4;
-
- q = prg();
- q->as = ADATA;
- q->line = p->line;
- q->link = datap;
- datap = q;
- q->from.type = D_EXTERN;
- q->from.sym = s;
- q->from.offset = n*4;
- q->from.displace = 4;
- q->to.type = D_EXTERN;
- q->to.sym = p->from.sym;
- n += 2;
- continue;
- }
- }
- q = prg();
- q->line = 0;
- q->as = ADATA;
- q->link = datap;
- datap = q;
- q->from.type = D_EXTERN;
- q->from.sym = s;
- q->from.displace = 4;
- q->to.type = D_CONST;
- q->to.offset = n;
- s->type = SBSS;
- s->value = n*4;
-}
-
-void
-doprof2(void)
-{
- Sym *s2, *s4;
- Prog *p, *q, *ps2, *ps4;
-
- if(debug['v'])
- Bprint(&bso, "%5.2f profile 2\n", cputime());
- Bflush(&bso);
- s2 = lookup("_profin", 0);
- s4 = lookup("_profout", 0);
- if(s2->type != STEXT || s4->type != STEXT) {
- diag("_profin/_profout not defined");
- return;
- }
-
- ps2 = P;
- ps4 = P;
- for(p = firstp; p != P; p = p->link) {
- if(p->as == ATEXT) {
- if(p->from.sym == s2) {
- ps2 = p;
- p->from.displace = 1;
- }
- if(p->from.sym == s4) {
- ps4 = p;
- p->from.displace = 1;
- }
- }
- }
- for(p = firstp; p != P; p = p->link) {
- if(p->as == ATEXT) {
- if(p->from.displace != 0) {
- for(;;) {
- q = p->link;
- if(q == P)
- break;
- if(q->as == ATEXT)
- break;
- p = q;
- }
- continue;
- }
-
- q = prg();
- q->line = p->line;
- q->pc = p->pc;
- q->link = p->link;
- p->link = q;
- p = q;
- p->as = ABSR;
- p->to.type = D_BRANCH;
- p->pcond = ps2;
- p->to.sym = s2;
-
- continue;
- }
- if(p->as == ARTS) {
- /*
- * RTS
- */
- q = prg();
- q->as = ARTS;
- q->from = p->from;
- q->to = p->to;
- q->link = p->link;
- p->link = q;
-
- /*
- * BSR profout
- */
- p->as = ABSR;
- p->from = zprg.from;
- p->to = zprg.to;
- p->to.type = D_BRANCH;
- p->pcond = ps4;
- p->to.sym = s4;
-
- p = q;
-
- continue;
- }
- }
-}
-
-long
-reuse(Prog *r, Sym *s)
-{
- Prog *p;
-
-
- if(r == P)
- return 0;
- for(p = datap; p != r; p = p->link)
- if(p->to.sym == s)
- return p->from.offset;
- return 0;
-}
-
-void
-nuxiinit(void)
-{
- int i, c;
-
- for(i=0; i<4; i++) {
- c = find1(0x01020304L, i+1);
- if(i >= 2)
- inuxi2[i-2] = c;
- if(i >= 3)
- inuxi1[i-3] = c;
- inuxi4[i] = c;
- fnuxi8[i] = c+4;
- fnuxi8[i+4] = c;
- c = find2(0x01020304L, i+1);
- gnuxi8[i] = c+4;
- gnuxi8[i+4] = c;
- }
- if(debug['v']) {
- Bprint(&bso, "inuxi = ");
- for(i=0; i<1; i++)
- Bprint(&bso, "%d", inuxi1[i]);
- Bprint(&bso, " ");
- for(i=0; i<2; i++)
- Bprint(&bso, "%d", inuxi2[i]);
- Bprint(&bso, " ");
- for(i=0; i<4; i++)
- Bprint(&bso, "%d", inuxi4[i]);
- Bprint(&bso, "\n[fg]nuxi = ");
- for(i=0; i<8; i++)
- Bprint(&bso, "%d", fnuxi8[i]);
- Bprint(&bso, " ");
- for(i=0; i<8; i++)
- Bprint(&bso, "%d", gnuxi8[i]);
- Bprint(&bso, "\n");
- }
- Bflush(&bso);
-}
-
-int
-find1(long l, int c)
-{
- char *p;
- int i;
-
- p = (char*)&l;
- for(i=0; i<4; i++)
- if(*p++ == c)
- return i;
- return 0;
-}
-
-int
-find2(long l, int c)
-{
- short *p;
- int i;
-
- p = (short*)&l;
- for(i=0; i<4; i+=2) {
- if(((*p >> 8) & 0xff) == c)
- return i;
- if((*p++ & 0xff) == c)
- return i+1;
- }
- return 0;
-}
-
-long
-ieeedtof(Ieee *e)
-{
- int exp;
- long v;
-
- if(e->h == 0)
- return 0;
- exp = (e->h>>20) & ((1L<<11)-1L);
- exp -= (1L<<10) - 2L;
- v = (e->h & 0xfffffL) << 3;
- v |= (e->l >> 29) & 0x7L;
- if((e->l >> 28) & 1) {
- v++;
- if(v & 0x800000L) {
- v = (v & 0x7fffffL) >> 1;
- exp++;
- }
- }
- if(exp <= -126 || exp >= 130)
- diag("double fp to single fp overflow");
- v |= ((exp + 126) & 0xffL) << 23;
- v |= e->h & 0x80000000L;
- return v;
-}
-
-double
-ieeedtod(Ieee *ieeep)
-{
- Ieee e;
- double fr;
- int exp;
-
- if(ieeep->h & (1L<<31)) {
- e.h = ieeep->h & ~(1L<<31);
- e.l = ieeep->l;
- return -ieeedtod(&e);
- }
- if(ieeep->l == 0 && ieeep->h == 0)
- return 0;
- fr = ieeep->l & ((1L<<16)-1L);
- fr /= 1L<<16;
- fr += (ieeep->l>>16) & ((1L<<16)-1L);
- fr /= 1L<<16;
- fr += (ieeep->h & (1L<<20)-1L) | (1L<<20);
- fr /= 1L<<21;
- exp = (ieeep->h>>20) & ((1L<<11)-1L);
- exp -= (1L<<10) - 2L;
- return ldexp(fr, exp);
-}
diff --git a/utils/2l/optab.c b/utils/2l/optab.c
deleted file mode 100644
index 9f4527b7..00000000
--- a/utils/2l/optab.c
+++ /dev/null
@@ -1,444 +0,0 @@
-#include "l.h"
-
-#define X1 0
-#define X2 0
-#define X3 0
-#define C 0xf200
-
-Optab optab[] =
-/* as, fas, srcsp, dstsp, optype, opcode */
-{
- { AXXX },
- { AABCD, AXXX, X1, X2, X3, 0x4e71 },
- { AADDB, AXXX, 2, 0, 3, 0xd000, 0x5000, 0, 0x0600 },
- { AADDL, AXXX, 4, 0, 3, 0xd080, 0x5080, 0xd1c0, 0x0680 },
- { AADDW, AXXX, 2, 0, 3, 0xd040, 0x5040, 0xd0c0, 0x0640 },
- { AADDXB },
- { AADDXL },
- { AADDXW },
- { AADJSP },
- { AANDB, AXXX, 2, 0, 9, 0xc000, 0xc100, 0x0200 },
- { AANDL, AXXX, 4, 0, 9, 0xc080, 0xc180, 0x0280 },
- { AANDW, AXXX, 2, 0, 9, 0xc040, 0xc140, 0x0240 },
- { AASLB, AXXX, 0, 2, 12, 0xe100 },
- { AASLL, AXXX, 0, 4, 12, 0xe180 },
- { AASLW, AXXX, 0, 2, 12, 0xe140 },
- { AASRB, AXXX, 0, 2, 12, 0xe000 },
- { AASRL, AXXX, 0, 4, 12, 0xe080 },
- { AASRW, AXXX, 0, 2, 12, 0xe040 },
- { ABCASE, AXXX, 0, 0, 33 },
- { ABCC, AXXX, 0, 0, 1, 0x6400 },
- { ABCHG, AXXX, 2, 2, 27, 0x0140, 0x0840 },
- { ABCLR, AXXX, 2, 2, 27, 0x0180, 0x0880 },
- { ABCS, AXXX, 0, 0, 1, 0x6500 },
- { ABEQ, AXXX, 0, 0, 1, 0x6700 },
- { ABFCHG, AXXX, 0, 0, 24, 0xeac0 },
- { ABFCLR, AXXX, 0, 0, 24, 0xecc0 },
- { ABFEXTS, AXXX, 0, 0, 24, 0xebc0 },
- { ABFEXTU, AXXX, 0, 0, 24, 0xe9c0 },
- { ABFFFO, AXXX, 0, 0, 24, 0xedc0 },
- { ABFINS, AXXX, 0, 0, 24, 0xefc0 },
- { ABFSET, AXXX, 0, 0, 24, 0xeec0 },
- { ABFTST, AXXX, 0, 0, 24, 0xe8c0 },
- { ABGE, AXXX, 0, 0, 1, 0x6c00 },
- { ABGT, AXXX, 0, 0, 1, 0x6e00 },
- { ABHI, AXXX, 0, 0, 1, 0x6200 },
- { ABKPT },
- { ABLE, AXXX, 0, 0, 1, 0x6f00 },
- { ABLS, AXXX, 0, 0, 1, 0x6300 },
- { ABLT, AXXX, 0, 0, 1, 0x6d00 },
- { ABMI, AXXX, 0, 0, 1, 0x6b00 },
- { ABNE, AXXX, 0, 0, 1, 0x6600 },
- { ABPL, AXXX, 0, 0, 1, 0x6a00 },
- { ABRA, AXXX, 0, 0, 1, 0x6000 },
- { ABSET, AXXX, 2, 2, 27, 0x01c0, 0x08c0 },
- { ABSR, AXXX, 0, 0, 1, 0x6100, 0x4eb8 },
- { ABTST, AXXX, 2, 2, 27, 0x0100, 0x0800 },
- { ABVC, AXXX, 0, 0, 1, 0x6800 },
- { ABVS, AXXX, 0, 0, 1, 0x6900 },
- { ACALLM },
- { ACAS2B },
- { ACAS2L },
- { ACAS2W },
- { ACASB },
- { ACASEW, AXXX, 0, 0, 32, 0x4efb, 0 },
- { ACASL },
- { ACASW },
- { ACHK2B, AXXX, 2, 0, 31, 0x00c0, 0x0800 },
- { ACHK2L, AXXX, 4, 0, 31, 0x04c0, 0x0800 },
- { ACHK2W, AXXX, 2, 0, 31, 0x02c0, 0x0800 },
- { ACHKL, AXXX, 4, 4, 26, 0x4100 },
- { ACHKW, AXXX, 2, 2, 26, 0x4180 },
- { ACLRB, AXXX, 0, -2, 5, 0x4200 },
- { ACLRL, AXXX, 0, -4, 5, 0x4280 },
- { ACLRW, AXXX, 0, -2, 5, 0x4240 },
- { ACMP2B, AXXX, 2, 0, 31, 0x00c0, 0x0000 },
- { ACMP2L, AXXX, 4, 0, 31, 0x04c0, 0x0000 },
- { ACMP2W, AXXX, 2, 0, 31, 0x02c0, 0x0000 },
- { ACMPB, AXXX, 2, 2, 7, 0xb000, 0, 0x0c00, 0xb108 },
- { ACMPL, AXXX, 4, 4, 7, 0xb080, 0xb100, 0x0c80, 0xb188 },
- { ACMPW, AXXX, 2, 2, 7, 0xb040, 0xb080, 0x0c40, 0xb148 },
- { ADATA },
- { ADBCC, AXXX, 0, 0, 15, 0x54c8 },
- { ADBCS, AXXX, 0, 0, 15, 0x55c8 },
- { ADBEQ, AXXX, 0, 0, 15, 0x57c8 },
- { ADBF, AXXX, 0, 0, 15, 0x51c8 },
- { ADBGE, AXXX, 0, 0, 15, 0x5cc8 },
- { ADBGT, AXXX, 0, 0, 15, 0x5ec8 },
- { ADBHI, AXXX, 0, 0, 15, 0x52c8 },
- { ADBLE, AXXX, 0, 0, 15, 0x5fc8 },
- { ADBLS, AXXX, 0, 0, 15, 0x53c8 },
- { ADBLT, AXXX, 0, 0, 15, 0x5dc8 },
- { ADBMI, AXXX, 0, 0, 15, 0x5bc8 },
- { ADBNE, AXXX, 0, 0, 15, 0x56c8 },
- { ADBPL, AXXX, 0, 0, 15, 0x5ac8 },
- { ADBT, AXXX, 0, 0, 15, 0x50c8 },
- { ADBVC, AXXX, 0, 0, 15, 0x58c8 },
- { ADBVS, AXXX, 0, 0, 15, 0x59c8 },
- { ADIVSL, AXXX, 4, 0, 14, 0x4c40, 0x0800 },
- { ADIVSW, AXXX, 2, 0, 13, 0x81c0 },
- { ADIVUL, AXXX, 4, 0, 14, 0x4c40, 0x0000 },
- { ADIVUW, AXXX, 2, 0, 13, 0x80c0 },
- { AEND },
- { AEORB, AXXX, 2, 0, 10, 0xb100, 0x0a00 },
- { AEORL, AXXX, 4, 0, 10, 0xb180, 0x0a80 },
- { AEORW, AXXX, 2, 0, 10, 0xb140, 0x0a40 },
- { AEXG },
- { AEXTBL, AXXX, 0, 0, 11, 0x49c0 },
- { AEXTBW, AXXX, 0, 0, 11, 0x4880 },
- { AEXTWL, AXXX, 0, 0, 11, 0x48c0 },
- { AFABSB, AXXX, 2, 0, 17, C, 0x0018, 0x5818 },
- { AFABSD, AFABSL, 8, 0, 17, C, 0x0018, 0x5418 },
- { AFABSF, AFABSL, 4, 0, 17, C, 0x0018, 0x4418 },
- { AFABSL, AXXX, 4, 0, 17, C, 0x0018, 0x4018 },
- { AFABSW, AXXX, 2, 0, 17, C, 0x0018, 0x5018 },
- { AFACOSB, AXXX, 2, 0, 17, C, 0x001c, 0x581c },
- { AFACOSD, AFACOSL, 8, 0, 17, C, 0x001c, 0x541c },
- { AFACOSF, AFACOSL, 4, 0, 17, C, 0x001c, 0x441c },
- { AFACOSL, AXXX, 4, 0, 17, C, 0x001c, 0x401c },
- { AFACOSW, AXXX, 2, 0, 17, C, 0x001c, 0x501c },
- { AFADDB, AXXX, 2, 0, 17, C, 0x0022, 0x5822 },
- { AFADDD, AFADDL, 8, 0, 17, C, 0x0022, 0x5422 },
- { AFADDF, AFADDL, 4, 0, 17, C, 0x0022, 0x4422 },
- { AFADDL, AXXX, 4, 0, 17, C, 0x0022, 0x4022 },
- { AFADDW, AXXX, 2, 0, 17, C, 0x0022, 0x5022 },
- { AFASINB, AXXX, 2, 0, 17, C, 0x000c, 0x580c },
- { AFASIND, AFASINL, 8, 0, 17, C, 0x000c, 0x540c },
- { AFASINF, AFASINL, 4, 0, 17, C, 0x000c, 0x440c },
- { AFASINL, AXXX, 4, 0, 17, C, 0x000c, 0x400c },
- { AFASINW, AXXX, 2, 0, 17, C, 0x000c, 0x500c },
- { AFATANB, AXXX, 2, 0, 17, C, 0x000a, 0x580a },
- { AFATAND, AFATANL, 8, 0, 17, C, 0x000a, 0x540a },
- { AFATANF, AFATANL, 4, 0, 17, C, 0x000a, 0x440a },
- { AFATANHB, AXXX, 2, 0, 17, C, 0x000d, 0x580d },
- { AFATANHD, AFATANHL, 8, 0, 17, C, 0x000d, 0x540d },
- { AFATANHF, AFATANHL, 4, 0, 17, C, 0x000d, 0x440d },
- { AFATANHL, AXXX, 4, 0, 17, C, 0x000d, 0x400d },
- { AFATANHW, AXXX, 2, 0, 17, C, 0x000d, 0x500d },
- { AFATANL, AXXX, 4, 0, 17, C, 0x000a, 0x400a },
- { AFATANW, AXXX, 2, 0, 17, C, 0x000a, 0x500a },
- { AFBEQ, AXXX, 0, 0, 18, C+0x81 },
- { AFBF, AXXX, 0, 0, 18, C+0x8f },
- { AFBGE, AXXX, 0, 0, 18, C+0x93 },
- { AFBGT, AXXX, 0, 0, 18, C+0x92 },
- { AFBLE, AXXX, 0, 0, 18, C+0x95 },
- { AFBLT, AXXX, 0, 0, 18, C+0x94 },
- { AFBNE, AXXX, 0, 0, 18, C+0x8e },
- { AFBT, AXXX, 0, 0, 18, C+0x80 },
- { AFCMPB, AXXX, 0, 2, 22, C, 0x0038, 0x5838 },
- { AFCMPD, AFCMPL, 0, 8, 22, C, 0x0038, 0x5438 },
- { AFCMPF, AFCMPL, 0, 4, 22, C, 0x0038, 0x4438 },
- { AFCMPL, AXXX, 0, 4, 22, C, 0x0038, 0x4038 },
- { AFCMPW, AXXX, 0, 2, 22, C, 0x0038, 0x5038 },
- { AFCOSB, AXXX, 2, 0, 17, C, 0x001d, 0x581d },
- { AFCOSD, AFCOSL, 8, 0, 17, C, 0x001d, 0x541d },
- { AFCOSF, AFCOSL, 4, 0, 17, C, 0x001d, 0x441d },
- { AFCOSHB, AXXX, 2, 0, 17, C, 0x0019, 0x5819 },
- { AFCOSHD, AFCOSHL, 8, 0, 17, C, 0x0019, 0x5419 },
- { AFCOSHF, AFCOSHL, 4, 0, 17, C, 0x0019, 0x4419 },
- { AFCOSHL, AXXX, 4, 0, 17, C, 0x0019, 0x4019 },
- { AFCOSHW, AXXX, 2, 0, 17, C, 0x0019, 0x5019 },
- { AFCOSL, AXXX, 4, 0, 17, C, 0x001d, 0x401d },
- { AFCOSW, AXXX, 2, 0, 17, C, 0x001d, 0x501d },
- { AFDBEQ, AXXX, 0, 0, 19, C+0x48, 0x01 },
- { AFDBF, AXXX, 0, 0, 19, C+0x48, 0x0f },
- { AFDBGE, AXXX, 0, 0, 19, C+0x48, 0x13 },
- { AFDBGT, AXXX, 0, 0, 19, C+0x48, 0x12 },
- { AFDBLE, AXXX, 0, 0, 19, C+0x48, 0x15 },
- { AFDBLT, AXXX, 0, 0, 19, C+0x48, 0x14 },
- { AFDBNE, AXXX, 0, 0, 19, C+0x48, 0x0e },
- { AFDBT, AXXX, 0, 0, 19, C+0x48, 0x00 },
- { AFDIVB, AXXX, 2, 0, 17, C, 0x0020, 0x5820 },
- { AFDIVD, AFDIVL, 8, 0, 17, C, 0x0020, 0x5420 },
- { AFDIVF, AFDIVL, 4, 0, 17, C, 0x0020, 0x4420 },
- { AFDIVL, AXXX, 4, 0, 17, C, 0x0020, 0x4020 },
- { AFDIVW, AXXX, 2, 0, 17, C, 0x0020, 0x5020 },
- { AFETOXB, AXXX, 2, 0, 17, C, 0x0010, 0x5810 },
- { AFETOXD, AFETOXL, 8, 0, 17, C, 0x0010, 0x5410 },
- { AFETOXF, AFETOXL, 4, 0, 17, C, 0x0010, 0x4410 },
- { AFETOXL, AXXX, 4, 0, 17, C, 0x0010, 0x4010 },
- { AFETOXM1B, AXXX, 2, 0, 17, C, 0x0008, 0x5808 },
- { AFETOXM1D, AFETOXM1L, 8, 0, 17, C, 0x0008, 0x5408 },
- { AFETOXM1F, AFETOXM1L, 4, 0, 17, C, 0x0008, 0x4408 },
- { AFETOXM1L, AXXX, 4, 0, 17, C, 0x0008, 0x4008 },
- { AFETOXM1W, AXXX, 2, 0, 17, C, 0x0008, 0x5008 },
- { AFETOXW, AXXX, 2, 0, 17, C, 0x0010, 0x5010 },
- { AFGETEXPB, AXXX, 2, 0, 17, C, 0x001e, 0x581e },
- { AFGETEXPD, AFGETEXPL, 8, 0, 17, C, 0x001e, 0x541e },
- { AFGETEXPF, AFGETEXPL, 4, 0, 17, C, 0x001e, 0x441e },
- { AFGETEXPL, AXXX, 4, 0, 17, C, 0x001e, 0x401e },
- { AFGETEXPW, AXXX, 2, 0, 17, C, 0x001e, 0x501e },
- { AFGETMANB, AXXX, 2, 0, 17, C, 0x001f, 0x581f },
- { AFGETMAND, AFGETMANL, 8, 0, 17, C, 0x001f, 0x541f },
- { AFGETMANF, AFGETMANL, 4, 0, 17, C, 0x001f, 0x441f },
- { AFGETMANL, AXXX, 4, 0, 17, C, 0x001f, 0x401f },
- { AFGETMANW, AXXX, 2, 0, 17, C, 0x001f, 0x501f },
- { AFINTB, AXXX, 2, 0, 17, C, 0x0001, 0x5801 },
- { AFINTD, AFINTL, 8, 0, 17, C, 0x0001, 0x5401 },
- { AFINTF, AFINTL, 4, 0, 17, C, 0x0001, 0x4401 },
- { AFINTL, AXXX, 4, 0, 17, C, 0x0001, 0x4001 },
- { AFINTRZB, AXXX, 2, 0, 17, C, 0x0003, 0x5803 },
- { AFINTRZD, AFINTRZL, 8, 0, 17, C, 0x0003, 0x5403 },
- { AFINTRZF, AFINTRZL, 4, 0, 17, C, 0x0003, 0x4403 },
- { AFINTRZL, AXXX, 4, 0, 17, C, 0x0003, 0x4003 },
- { AFINTRZW, AXXX, 2, 0, 17, C, 0x0003, 0x5003 },
- { AFINTW, AXXX, 2, 0, 17, C, 0x0001, 0x5001 },
- { AFLOG10B, AXXX, 2, 0, 17, C, 0x0015, 0x5815 },
- { AFLOG10D, AFLOG10L, 8, 0, 17, C, 0x0015, 0x5415 },
- { AFLOG10F, AFLOG10L, 4, 0, 17, C, 0x0015, 0x4415 },
- { AFLOG10L, AXXX, 4, 0, 17, C, 0x0015, 0x4015 },
- { AFLOG10W, AXXX, 2, 0, 17, C, 0x0015, 0x5015 },
- { AFLOG2B, AXXX, 2, 0, 17, C, 0x0016, 0x5816 },
- { AFLOG2D, AFLOG2L, 8, 0, 17, C, 0x0016, 0x5416 },
- { AFLOG2F, AFLOG2L, 4, 0, 17, C, 0x0016, 0x4416 },
- { AFLOG2L, AXXX, 4, 0, 17, C, 0x0016, 0x4016 },
- { AFLOG2W, AXXX, 2, 0, 17, C, 0x0016, 0x5016 },
- { AFLOGNB, AXXX, 2, 0, 17, C, 0x0014, 0x5814 },
- { AFLOGND, AFLOGNL, 8, 0, 17, C, 0x0014, 0x5414 },
- { AFLOGNF, AFLOGNL, 4, 0, 17, C, 0x0014, 0x4414 },
- { AFLOGNL, AXXX, 4, 0, 17, C, 0x0014, 0x4014 },
- { AFLOGNP1B, AXXX, 2, 0, 17, C, 0x0006, 0x5806 },
- { AFLOGNP1D, AFLOGNP1L, 8, 0, 17, C, 0x0006, 0x5406 },
- { AFLOGNP1F, AFLOGNP1L, 4, 0, 17, C, 0x0006, 0x4406 },
- { AFLOGNP1L, AXXX, 4, 0, 17, C, 0x0006, 0x4006 },
- { AFLOGNP1W, AXXX, 2, 0, 17, C, 0x0006, 0x5006 },
- { AFLOGNW, AXXX, 2, 0, 17, C, 0x0014, 0x5014 },
- { AFMODB, AXXX, 2, 0, 17, C, 0x0021, 0x5821 },
- { AFMODD, AFMODL, 8, 0, 17, C, 0x0021, 0x5421 },
- { AFMODF, AFMODL, 4, 0, 17, C, 0x0021, 0x4421 },
- { AFMODL, AXXX, 4, 0, 17, C, 0x0021, 0x4021 },
- { AFMODW, AXXX, 2, 0, 17, C, 0x0021, 0x5021 },
- { AFMOVEB, AXXX, 2, -2, 16, C, 0x0000, 0x7800, 0x5800 },
- { AFMOVED, AFMOVEL, 8, -8, 16, C, 0x0000, 0x7400, 0x5400 },
- { AFMOVEF, AFMOVEL, 4, -4, 16, C, 0x0000, 0x6400, 0x4400 },
- { AFMOVEL, AXXX, 4, -4, 16, C, 0x0000, 0x6000, 0x4000 },
- { AFMOVEM, AXXX, 2, 2, 28, C },
- { AFMOVEMC, AXXX, 2, 2, 29, C },
- { AFMOVEW, AXXX, 2, -2, 16, C, 0x0000, 0x7000, 0x5000 },
- { AFMULB, AXXX, 2, 0, 17, C, 0x0023, 0x5823 },
- { AFMULD, AFMULL, 8, 0, 17, C, 0x0023, 0x5423 },
- { AFMULF, AFMULL, 4, 0, 17, C, 0x0023, 0x4423 },
- { AFMULL, AXXX, 4, 0, 17, C, 0x0023, 0x4023 },
- { AFMULW, AXXX, 2, 0, 17, C, 0x0023, 0x5023 },
- { AFNEGB, AXXX, 2, 0, 21, C, 0x001a, 0x581a },
- { AFNEGD, AFNEGL, 8, 0, 21, C, 0x001a, 0x541a },
- { AFNEGF, AFNEGL, 4, 0, 21, C, 0x001a, 0x441a },
- { AFNEGL, AXXX, 4, 0, 21, C, 0x001a, 0x401a },
- { AFNEGW, AXXX, 2, 0, 21, C, 0x001a, 0x501a },
- { AFREMB, AXXX, 2, 0, 17, C, 0x0025, 0x5825 },
- { AFREMD, AFREML, 8, 0, 17, C, 0x0025, 0x5425 },
- { AFREMF, AFREML, 4, 0, 17, C, 0x0025, 0x4425 },
- { AFREML, AXXX, 4, 0, 17, C, 0x0025, 0x4025 },
- { AFREMW, AXXX, 2, 0, 17, C, 0x0025, 0x5025 },
- { AFRESTORE, AXXX, 0, 2, 5, C+0x0140 },
- { AFSAVE, AXXX, 0, 2, 5, C+0x0100 },
- { AFSCALEB, AXXX, 2, 0, 17, C, 0x0026, 0x5826 },
- { AFSCALED, AFSCALEL, 8, 0, 17, C, 0x0026, 0x5426 },
- { AFSCALEF, AFSCALEL, 4, 0, 17, C, 0x0026, 0x4426 },
- { AFSCALEL, AXXX, 4, 0, 17, C, 0x0026, 0x4026 },
- { AFSCALEW, AXXX, 2, 0, 17, C, 0x0026, 0x5026 },
- { AFSEQ, AXXX, X1, X2, X3, 0xffff },
- { AFSF, AXXX, 4, X2, X3, 0xffff },
- { AFSGE, AXXX, X1, X2, X3, 0xffff },
- { AFSGT, AXXX, X1, X2, X3, 0xffff },
- { AFSINB, AXXX, 2, 0, 17, C, 0x000e, 0x580e },
- { AFSIND, AFSINL, 8, 0, 17, C, 0x000e, 0x540e },
- { AFSINF, AFSINL, 4, 0, 17, C, 0x000e, 0x440e },
- { AFSINHB, AXXX, 2, 0, 17, C, 0x0002, 0x5802 },
- { AFSINHD, AFSINHL, 8, 0, 17, C, 0x0002, 0x5402 },
- { AFSINHF, AFSINHL, 4, 0, 17, C, 0x0002, 0x4402 },
- { AFSINHL, AXXX, 4, 0, 17, C, 0x0002, 0x4002 },
- { AFSINHW, AXXX, 2, 0, 17, C, 0x0002, 0x5002 },
- { AFSINL, AXXX, 4, 0, 17, C, 0x000e, 0x400e },
- { AFSINW, AXXX, 2, 0, 17, C, 0x000e, 0x500e },
- { AFSLE, AXXX, X1, X2, X3, 0xffff },
- { AFSLT, AXXX, X1, X2, X3, 0xffff },
- { AFSNE, AXXX, X1, X2, X3, 0xffff },
- { AFSQRTB, AXXX, 2, 0, 17, C, 0x0004, 0x5804 },
- { AFSQRTD, AFSQRTL, 8, 0, 17, C, 0x0004, 0x5404 },
- { AFSQRTF, AFSQRTL, 4, 0, 17, C, 0x0004, 0x4404 },
- { AFSQRTL, AXXX, 4, 0, 17, C, 0x0004, 0x4004 },
- { AFSQRTW, AXXX, 2, 0, 17, C, 0x0004, 0x5004 },
- { AFST, AXXX, X1, X2, X3, 0xffff },
- { AFSUBB, AXXX, 2, 0, 17, C, 0x0028, 0x5828 },
- { AFSUBD, AFSUBL, 8, 0, 17, C, 0x0028, 0x5428 },
- { AFSUBF, AFSUBL, 4, 0, 17, C, 0x0028, 0x4428 },
- { AFSUBL, AXXX, 4, 0, 17, C, 0x0028, 0x4028 },
- { AFSUBW, AXXX, 2, 0, 17, C, 0x0028, 0x5028 },
- { AFTANB, AXXX, 2, 0, 17, C, 0x000f, 0x580f },
- { AFTAND, AFTANL, 8, 0, 17, C, 0x000f, 0x540f },
- { AFTANF, AFTANL, 4, 0, 17, C, 0x000f, 0x440f },
- { AFTANHB, AXXX, 2, 0, 17, C, 0x0009, 0x5809 },
- { AFTANHD, AFTANHL, 8, 0, 17, C, 0x0009, 0x5409 },
- { AFTANHF, AFTANHL, 4, 0, 17, C, 0x0009, 0x4409 },
- { AFTANHL, AXXX, 4, 0, 17, C, 0x0009, 0x4009 },
- { AFTANHW, AXXX, 2, 0, 17, C, 0x0009, 0x5009 },
- { AFTANL, AXXX, 4, 0, 17, C, 0x000f, 0x400f },
- { AFTANW, AXXX, 2, 0, 17, C, 0x000f, 0x500f },
- { AFTENTOXB, AXXX, 2, 0, 17, C, 0x0012, 0x5812 },
- { AFTENTOXD, AFTENTOXL, 8, 0, 17, C, 0x0012, 0x5412 },
- { AFTENTOXF, AFTENTOXL, 4, 0, 17, C, 0x0012, 0x4412 },
- { AFTENTOXL, AXXX, 4, 0, 17, C, 0x0012, 0x4012 },
- { AFTENTOXW, AXXX, 2, 0, 17, C, 0x0012, 0x5012 },
- { AFTSTB, AXXX, 0, 2, 20, C, 0x003a, 0x583a },
- { AFTSTD, AFTSTL, 0, 8, 20, C, 0x003a, 0x543a },
- { AFTSTF, AFTSTL, 0, 4, 20, C, 0x003a, 0x443a },
- { AFTSTL, AXXX, 0, 4, 20, C, 0x003a, 0x403a },
- { AFTSTW, AXXX, 0, 2, 20, C, 0x003a, 0x503a },
- { AFTWOTOXB, AXXX, 2, 0, 17, C, 0x0011, 0x5811 },
- { AFTWOTOXD, AFTWOTOXL, 8, 0, 17, C, 0x0011, 0x5411 },
- { AFTWOTOXF, AFTWOTOXL, 4, 0, 17, C, 0x0011, 0x4411 },
- { AFTWOTOXL, AXXX, 4, 0, 17, C, 0x0011, 0x4011 },
- { AFTWOTOXW, AXXX, 2, 0, 17, C, 0x0011, 0x5011 },
- { AGLOBL },
- { AGOK },
- { AHISTORY },
- { AILLEG, AXXX, 0, 0, 4, 0x4efc },
- { AINSTR },
- { AJMP, AXXX, 0, 0, 5, 0x4ec0 },
- { AJSR, AXXX, 0, 0, 5, 0x4e80 },
- { ALEA, AXXX, 0, 0, 6, 0x41c0 },
- { ALINKL },
- { ALINKW },
- { ALOCATE },
- { ALONG, AXXX, 0, 4, 23 },
- { ALSLB, AXXX, 0, 2, 12, 0xe108 },
- { ALSLL, AXXX, 0, 4, 12, 0xe188 },
- { ALSLW, AXXX, 0, 2, 12, 0xe148 },
- { ALSRB, AXXX, 0, 2, 12, 0xe008 },
- { ALSRL, AXXX, 0, 4, 12, 0xe088 },
- { ALSRW, AXXX, 0, 2, 12, 0xe048 },
- { AMOVB, AXXX, 2, -2, 2, 0x1000, 0x7000 },
- { AMOVEM, AXXX, 2, 2, 25, 0x48c0 },
- { AMOVEPL },
- { AMOVEPW },
- { AMOVESB, AXXX, 2, -2, 34, 0xe00 },
- { AMOVESL, AXXX, 4, -4, 34, 0xe80 },
- { AMOVESW, AXXX, 2, -2, 34, 0xe40 },
- { AMOVL, AXXX, 4, -4, 2, 0x2000, 0x7000 },
- { AMOVW, AXXX, 2, -2, 2, 0x3000, 0x7000 },
- { AMULSL, AXXX, 4, 0, 14, 0x4c00, 0x0800 },
- { AMULSW, AXXX, 2, 0, 13, 0xc1c0 },
- { AMULUL, AXXX, 4, 0, 14, 0x4c00, 0x0000 },
- { AMULUW, AXXX, 2, 0, 13, 0xc0c0 },
- { ANAME },
- { ANBCD },
- { ANEGB, AXXX, 0, 0, 5, 0x4400 },
- { ANEGL, AXXX, 0, 0, 5, 0x4480 },
- { ANEGW, AXXX, 0, 0, 5, 0x4440 },
- { ANEGXB },
- { ANEGXL },
- { ANEGXW },
- { ANOP },
- { ANOTB, AXXX, 0, 0, 5, 0x4600 },
- { ANOTL, AXXX, 0, 0, 5, 0x4680 },
- { ANOTW, AXXX, 0, 0, 5, 0x4640 },
- { AORB, AXXX, 2, 0, 9, 0x8000, 0x8100, 0x0000 },
- { AORL, AXXX, 4, 0, 9, 0x8080, 0x8180, 0x0080 },
- { AORW, AXXX, 2, 0, 9, 0x8040, 0x8140, 0x0040 },
- { APACK },
- { APEA, AXXX, 0, 0, 5, 0x4840 },
- { ARESET },
- { AROTLB, AXXX, 0, 2, 12, 0xe118 },
- { AROTLL, AXXX, 0, 4, 12, 0xe198 },
- { AROTLW, AXXX, 0, 2, 12, 0xe158 },
- { AROTRB, AXXX, 0, 2, 12, 0xe018 },
- { AROTRL, AXXX, 0, 4, 12, 0xe098 },
- { AROTRW, AXXX, 0, 2, 12, 0xe058 },
- { AROXLB },
- { AROXLL },
- { AROXLW },
- { AROXRB },
- { AROXRL },
- { AROXRW },
- { ARTD },
- { ARTE, AXXX, 0, 0, 4, 0x4e73 },
- { ARTM },
- { ARTR },
- { ARTS, AXXX, 0, 0, 4, 0x4e75 },
- { ASBCD },
- { ASCC },
- { ASCS },
- { ASEQ },
- { ASF },
- { ASGE },
- { ASGT },
- { ASHI },
- { ASLE },
- { ASLS },
- { ASLT },
- { ASMI },
- { ASNE },
- { ASPL },
- { AST },
- { ASTOP },
- { ASUBB, AXXX, 2, 0, 3, 0x9000, 0x5100, 0, 0x0400 },
- { ASUBL, AXXX, 4, 0, 3, 0x9080, 0x5180, 0x91c0, 0x0480 },
- { ASUBW, AXXX, 2, 0, 3, 0x9040, 0x5140, 0x90c0, 0x0440 },
- { ASUBXB },
- { ASUBXL },
- { ASUBXW },
- { ASVC },
- { ASVS },
- { ASWAP, AXXX, 0, 0, 35, 0x4840 },
- { ASYS, AXXX, 0, 2, 8, 0x4e40 },
- { ATAS, AXXX, 0, 2, 5, 0x4ac0 },
- { ATEXT },
- { ATRAP, AXXX, 0, 0, 30, 0x4e40 },
- { ATRAPCC, AXXX, 0, 0, 4, 0x54fc },
- { ATRAPCS, AXXX, 0, 0, 4, 0x55fc },
- { ATRAPEQ, AXXX, 0, 0, 4, 0x57fc },
- { ATRAPF, AXXX, 0, 0, 4, 0x51fc },
- { ATRAPGE, AXXX, 0, 0, 4, 0x5cfc },
- { ATRAPGT, AXXX, 0, 0, 4, 0x5efc },
- { ATRAPHI, AXXX, 0, 0, 4, 0x52fc },
- { ATRAPLE, AXXX, 0, 0, 4, 0x5ffc },
- { ATRAPLS, AXXX, 0, 0, 4, 0x53fc },
- { ATRAPLT, AXXX, 0, 0, 4, 0x5dfc },
- { ATRAPMI, AXXX, 0, 0, 4, 0x5bfc },
- { ATRAPNE, AXXX, 0, 0, 4, 0x56fc },
- { ATRAPPL, AXXX, 0, 0, 4, 0x5afc },
- { ATRAPT, AXXX, 0, 0, 4, 0x50fc },
- { ATRAPV, AXXX, 0, 0, 4, 0x4e76 },
- { ATRAPVC, AXXX, 0, 0, 4, 0x58fc },
- { ATRAPVS, AXXX, 0, 0, 4, 0x59fc },
- { ATSTB, AXXX, 0, 2, 5, 0x4a00 },
- { ATSTL, AXXX, 0, 4, 5, 0x4a80 },
- { ATSTW, AXXX, 0, 2, 5, 0x4a40 },
- { AUNLK },
- { AUNPK },
- { AWORD, AXXX, 0, 2, 23 },
- { AXXX }
-};
-
-char mmsize[] =
-{
- /* 0 */ 0, 2, 2, 2, 2,
- /* 5 */ 2, 2, 2, 4, 2,
- /* 10 */ 2, 2, 2, 2, 4,
- /* 15 */ 4, 4, 4, 4, 6,
- /* 20 */ 4, 4, 4, 0, 4,
- /* 25 */ 2, 2, 2, 2, 2,
- /* 30 */ 2, 4, 4, 0, 4,
- /* 35 */ 2, 0, 0, 0, 0,
-};
diff --git a/utils/2l/pass.c b/utils/2l/pass.c
deleted file mode 100644
index d429494e..00000000
--- a/utils/2l/pass.c
+++ /dev/null
@@ -1,538 +0,0 @@
-#include "l.h"
-
-void
-dodata(void)
-{
- int i;
- Sym *s;
- Prog *p;
- long t, u;
-
- if(debug['v'])
- Bprint(&bso, "%5.2f dodata\n", cputime());
- Bflush(&bso);
- for(p = datap; p != P; p = p->link) {
- s = p->from.sym;
- if(s->type == SBSS)
- s->type = SDATA;
- if(s->type != SDATA)
- diag("initialize non-data (%d): %s\n%P",
- s->type, s->name, p);
- t = p->from.offset + p->from.displace;
- if(t > s->value)
- diag("initialize bounds (%ld): %s\n%P",
- s->value, s->name, p);
- }
-
- /* allocate small guys */
- datsize = 0;
- for(i=0; i<NHASH; i++)
- for(s = hash[i]; s != S; s = s->link) {
- if(s->type != SDATA)
- if(s->type != SBSS)
- continue;
- t = s->value;
- if(t == 0) {
- diag("%s: no size", s->name);
- t = 1;
- }
- t = rnd(t, 4);;
- s->value = t;
- if(t > MINSIZ)
- continue;
- s->value = datsize;
- datsize += t;
- s->type = SDATA1;
- }
-
- /* allocate the rest of the data */
- for(i=0; i<NHASH; i++)
- for(s = hash[i]; s != S; s = s->link) {
- if(s->type != SDATA) {
- if(s->type == SDATA1)
- s->type = SDATA;
- continue;
- }
- t = s->value;
- s->value = datsize;
- datsize += t;
- }
-
- if(debug['j']) {
- /*
- * pad data with bss that fits up to next
- * 8k boundary, then push data to 8k
- */
- u = rnd(datsize, 8192);
- u -= datsize;
- for(i=0; i<NHASH; i++)
- for(s = hash[i]; s != S; s = s->link) {
- if(s->type != SBSS)
- continue;
- t = s->value;
- if(t > u)
- continue;
- u -= t;
- s->value = datsize;
- s->type = SDATA;
- datsize += t;
- }
- datsize += u;
- }
-
- /* now the bss */
- bsssize = 0;
- for(i=0; i<NHASH; i++)
- for(s = hash[i]; s != S; s = s->link) {
- if(s->type != SBSS)
- continue;
- t = s->value;
- s->value = bsssize + datsize;
- bsssize += t;
- }
- xdefine("bdata", SDATA, 0L);
- xdefine("edata", SDATA, datsize);
- xdefine("end", SBSS, datsize+bsssize);
-}
-
-Prog*
-brchain(Prog *p)
-{
- int i;
-
- for(i=0; i<20; i++) {
- if(p == P || p->as != ABRA)
- return p;
- p = p->pcond;
- }
- return P;
-}
-
-void
-follow(void)
-{
- Prog *p;
- long o;
- Sym *s;
-
- if(debug['v'])
- Bprint(&bso, "%5.2f follow\n", cputime());
- Bflush(&bso);
- firstp = prg();
- lastp = firstp;
- xfol(textp);
- lastp->link = P;
- firstp = firstp->link;
- o = 0; /* set */
- for(p = firstp; p != P; p = p->link) {
- if(p->as == ATEXT)
- curtext = p;
- if(p->as == ABCASE) { /* initialization for dodata */
- s = p->from.sym;
- if(s->type == SBSS)
- s->type = SDATA;
- if(s->type != SDATA)
- diag("BCASE of non-data: %s in %s\n%P",
- s->name, TNAME, p);
- }
-
- p->stkoff = -1; /* initialization for stkoff */
- if(p->as == ATEXT) {
- p->stkoff = 0;
- o = p->to.offset;
- continue;
- }
- if(p->as == AADJSP && p->from.offset == 0) {
- p->stkoff = o;
- continue;
- }
- }
-}
-
-void
-xfol(Prog *p)
-{
- Prog *q;
- int i;
- enum as a;
-
-loop:
- if(p == P)
- return;
- if(p->as == ATEXT)
- curtext = p;
- if(p->as == ABRA)
- if((q = p->pcond) != P) {
- p->mark = 1;
- p = q;
- if(p->mark == 0)
- goto loop;
- }
- if(p->mark) {
- /* copy up to 4 instructions to avoid branch */
- for(i=0,q=p; i<4; i++,q=q->link) {
- if(q == P)
- break;
- if(q == lastp)
- break;
- a = q->as;
- if(a == ANOP) {
- i--;
- continue;
- }
- if(a == ABRA || a == ARTS || a == ARTE)
- break;
- if(q->pcond == P || q->pcond->mark)
- continue;
- if(a == ABSR || a == ABCASE || a == ADBF)
- continue;
- for(;;) {
- if(p->as == ANOP) {
- p = p->link;
- continue;
- }
- q = copyp(p);
- p = p->link;
- q->mark = 1;
- lastp->link = q;
- lastp = q;
- if(q->as != a || q->pcond == P || q->pcond->mark)
- continue;
- q->as = relinv(q->as);
- p = q->pcond;
- q->pcond = q->link;
- q->link = p;
- xfol(q->link);
- p = q->link;
- if(p->mark)
- return;
- goto loop;
- }
- } /* */
- q = prg();
- q->as = ABRA;
- q->line = p->line;
- q->to.type = D_BRANCH;
- q->to.offset = p->pc;
- q->pcond = p;
- p = q;
- }
- p->mark = 1;
- lastp->link = p;
- lastp = p;
- a = p->as;
- if(a == ARTS || a == ABRA || a == ARTE)
- return;
- if(p->pcond != P)
- if(a != ABSR) {
- q = brchain(p->link);
- if(q != P && q->mark)
- if(a != ABCASE && a != ADBF) {
- p->as = relinv(a);
- p->link = p->pcond;
- p->pcond = q;
- }
- xfol(p->link);
- q = brchain(p->pcond);
- if(q->mark) {
- p->pcond = q;
- return;
- }
- p = q;
- goto loop;
- }
- p = p->link;
- goto loop;
-}
-
-int
-relinv(int a)
-{
-
- switch(a) {
- case ABEQ: return ABNE;
- case ABNE: return ABEQ;
- case ABLE: return ABGT;
- case ABLS: return ABHI;
- case ABLT: return ABGE;
- case ABMI: return ABPL;
- case ABGE: return ABLT;
- case ABPL: return ABMI;
- case ABGT: return ABLE;
- case ABHI: return ABLS;
- case ABCS: return ABCC;
- case ABCC: return ABCS;
- case AFBEQ: return AFBNE;
- case AFBF: return AFBT;
- case AFBGE: return AFBLT;
- case AFBGT: return AFBLE;
- case AFBLE: return AFBGT;
- case AFBLT: return AFBGE;
- case AFBNE: return AFBEQ;
- case AFBT: return AFBF;
- }
- diag("unknown relation: %s in %s", anames[a], TNAME);
- return a;
-}
-
-void
-patch(void)
-{
- long c;
- Prog *p, *q;
- Sym *s;
- long vexit;
-
- if(debug['v'])
- Bprint(&bso, "%5.2f mkfwd\n", cputime());
- Bflush(&bso);
- mkfwd();
- if(debug['v'])
- Bprint(&bso, "%5.2f patch\n", cputime());
- Bflush(&bso);
- s = lookup("exit", 0);
- vexit = s->value;
- for(p = firstp; p != P; p = p->link) {
- if(p->as == ATEXT)
- curtext = p;
- if((p->as == ABSR || p->as == ARTS) && p->to.sym != S) {
- s = p->to.sym;
- if(s->type != STEXT) {
- diag("undefined: %s in %s", s->name, TNAME);
- s->type = STEXT;
- s->value = vexit;
- }
- p->to.offset = s->value;
- p->to.type = D_BRANCH;
- }
- if(p->to.type != D_BRANCH)
- continue;
- c = p->to.offset;
- for(q = firstp; q != P;) {
- if(q->forwd != P)
- if(c >= q->forwd->pc) {
- q = q->forwd;
- continue;
- }
- if(c == q->pc)
- break;
- q = q->link;
- }
- if(q == P) {
- diag("branch out of range in %s\n%P", TNAME, p);
- p->to.type = D_NONE;
- }
- p->pcond = q;
- }
-
- for(p = firstp; p != P; p = p->link) {
- if(p->as == ATEXT)
- curtext = p;
- p->mark = 0; /* initialization for follow */
- if(p->pcond != P) {
- p->pcond = brloop(p->pcond);
- if(p->pcond != P)
- if(p->to.type == D_BRANCH)
- p->to.offset = p->pcond->pc;
- }
- }
-}
-
-#define LOG 5
-void
-mkfwd(void)
-{
- Prog *p;
- int i;
- long dwn[LOG], cnt[LOG];
- Prog *lst[LOG];
-
- for(i=0; i<LOG; i++) {
- if(i == 0)
- cnt[i] = 1; else
- cnt[i] = LOG * cnt[i-1];
- dwn[i] = 1;
- lst[i] = P;
- }
- i = 0;
- for(p = firstp; p != P; p = p->link) {
- if(p->as == ATEXT)
- curtext = p;
- i--;
- if(i < 0)
- i = LOG-1;
- p->forwd = P;
- dwn[i]--;
- if(dwn[i] <= 0) {
- dwn[i] = cnt[i];
- if(lst[i] != P)
- lst[i]->forwd = p;
- lst[i] = p;
- }
- }
-}
-
-Prog*
-brloop(Prog *p)
-{
- int c;
- Prog *q;
-
- c = 0;
- for(q = p; q != P; q = q->pcond) {
- if(q->as != ABRA)
- break;
- c++;
- if(c >= 5000)
- return P;
- }
- return q;
-}
-
-void
-dostkoff(void)
-{
- Prog *p, *q;
- long s, t;
- int a;
- Optab *o;
-
- if(debug['v'])
- Bprint(&bso, "%5.2f stkoff\n", cputime());
- Bflush(&bso);
- s = 0;
- for(p = firstp; p != P; p = p->link) {
- if(p->as == ATEXT) {
- curtext = p;
- s = p->to.offset;
- if(s == 0)
- continue;
- p = appendp(p);
- p->as = AADJSP;
- p->from.type = D_CONST;
- p->from.offset = s;
- p->stkoff = 0;
- continue;
- }
- for(q = p; q != P; q = q->pcond) {
- if(q->as == ATEXT)
- break;
- if(q->stkoff >= 0)
- if(q->stkoff != s)
- diag("stack offset %ld is %ld sb %ld in %s\n%P",
- q->pc, q->stkoff, s, q, TNAME, p);
- q->stkoff = s;
- }
- o = &optab[p->as];
- if(p->to.type == D_TOS)
- s -= o->dstsp;
- if(p->from.type == D_TOS)
- s -= o->srcsp;
- if(p->as == AADJSP)
- s += p->from.offset;
- if(p->as == APEA)
- s += 4;
- for(q = p->link; q != P; q = q->pcond) {
- if(q->as == ATEXT) {
- q = P;
- break;
- }
- if(q->stkoff >= 0)
- break;
- }
- if(q == P || q->stkoff == s)
- continue;
- if(p->as == ABRA || p->as == ARTS || p->as == ARTE) {
- s = q->stkoff;
- continue;
- }
- if(p->link->as == ABCASE)
- diag("BCASE with stack offset in %s", TNAME);
- t = q->stkoff - s;
- s = q->stkoff;
- p = appendp(p);
- p->as = AADJSP;
- p->stkoff = s - t;
- p->from.type = D_CONST;
- p->from.offset = t;
- }
-
- for(p = firstp; p != P; p = p->link) {
- if(p->as == ATEXT)
- curtext = p;
- a = p->from.type & D_MASK;
- if(a == D_AUTO)
- p->from.offset += p->stkoff;
- if(a == D_PARAM)
- p->from.offset += p->stkoff + 4;
- a = p->to.type & D_MASK;
- if(a == D_AUTO)
- p->to.offset += p->stkoff;
- if(a == D_PARAM)
- p->to.offset += p->stkoff + 4;
- if(p->as != ARTS)
- continue;
- if(p->stkoff == 0)
- continue;
- q = p;
- p = appendp(p);
- p->as = ARTS;
- p->stkoff = 0;
-
- q->as = AADJSP;
- q->from.type = D_CONST;
- q->from.offset = -q->stkoff;
- }
-}
-
-long
-atolwhex(char *s)
-{
- long n;
- int f;
-
- n = 0;
- f = 0;
- while(*s == ' ' || *s == '\t')
- s++;
- if(*s == '-' || *s == '+') {
- if(*s++ == '-')
- f = 1;
- while(*s == ' ' || *s == '\t')
- s++;
- }
- if(s[0]=='0' && s[1]){
- if(s[1]=='x' || s[1]=='X'){
- s += 2;
- for(;;){
- if(*s >= '0' && *s <= '9')
- n = n*16 + *s++ - '0';
- else if(*s >= 'a' && *s <= 'f')
- n = n*16 + *s++ - 'a' + 10;
- else if(*s >= 'A' && *s <= 'F')
- n = n*16 + *s++ - 'A' + 10;
- else
- break;
- }
- } else
- while(*s >= '0' && *s <= '7')
- n = n*8 + *s++ - '0';
- } else
- while(*s >= '0' && *s <= '9')
- n = n*10 + *s++ - '0';
- if(f)
- n = -n;
- return n;
-}
-
-void
-undef(void)
-{
- int i;
- Sym *s;
-
- for(i=0; i<NHASH; i++)
- for(s = hash[i]; s != S; s = s->link)
- if(s->type == SXREF)
- diag("%s: not defined", s->name);
-}
diff --git a/utils/2l/span.c b/utils/2l/span.c
deleted file mode 100644
index 45fc23ad..00000000
--- a/utils/2l/span.c
+++ /dev/null
@@ -1,551 +0,0 @@
-#include "l.h"
-
-void
-span(void)
-{
- Prog *p, *q;
- long v, c, idat;
- Optab *o;
- int m, n;
-
- xdefine("etext", STEXT, 0L);
- xdefine("a6base", STEXT, 0L);
- idat = INITDAT;
- for(p = firstp; p != P; p = p->link) {
- if(p->as == ATEXT)
- curtext = p;
- n = 0;
- if((q = p->pcond) != P)
- if(q->back != 2)
- n = 1;
- p->back = n;
- if(p->as == AADJSP) {
- p->to.type = D_A0+7;
- v = -p->from.offset;
- p->from.offset = v;
- if((v < -8 && v >= -32768L) || (v > 8 && v < 32768L)) {
- p->as = ALEA;
- p->from.type = I_INDIR | (D_A0+7);
- continue;
- }
- p->as = AADDL;
- if(v < 0) {
- p->as = ASUBL;
- v = -v;
- p->from.offset = v;
- }
- if(v >= 0 && v <= 8)
- p->from.type = D_QUICK;
- if(v == 0)
- p->as = ANOP;
- }
- }
- n = 0;
-
-start:
- if(debug['v'])
- Bprint(&bso, "%5.2f span\n", cputime());
- Bflush(&bso);
- c = INITTEXT;
- for(p = firstp; p != P; p = p->link) {
- if(p->as == ATEXT)
- curtext = p;
- o = &optab[p->as];
- p->pc = c;
- m = mmsize[o->optype];
- if(m == 0) {
- if(p->as == AWORD)
- m = 2;
- if(p->as == ALONG)
- m = 4;
- p->mark = m;
- c += m;
- continue;
- }
- if(p->from.type != D_NONE)
- m += andsize(p, &p->from);
- if(p->to.type == D_BRANCH) {
- if(p->pcond == P)
- p->pcond = p;
- c += m;
- if(m == 2)
- m |= 0100;
- p->mark = m;
- continue;
- }
- if(p->to.type != D_NONE)
- m += andsize(p, &p->to);
- p->mark = m;
- c += m;
- }
-
-loop:
- n++;
- if(debug['v'])
- Bprint(&bso, "%5.2f span %d\n", cputime(), n);
- Bflush(&bso);
- if(n > 60) {
- diag("span must be looping");
- errorexit();
- }
- c = INITTEXT;
- for(p = firstp; p != P; p = p->link) {
- if(p->as == ATEXT)
- curtext = p;
- if((m = p->mark) & 0100) {
- q = p->pcond;
- v = q->pc - 2;
- if(p->back)
- v -= c;
- else
- v -= p->pc;
- p->pc = c;
- if(v < -32768L || v >= 32768L) {
- if(p->as == ABSR && q->pc < 32768L && q->pc >= 0)
- c += 4;
- else
- c += 6;
- } else
- if(v < -128 || v >= 128)
- c += 4;
- else
- if(v == 0) {
- c += 4;
- p->mark = 4;
- } else
- c += 2;
- continue;
- }
- p->pc = c;
- c += m;
- }
- if(c != textsize) {
- textsize = c;
- goto loop;
- }
- if(INITRND)
- INITDAT = rnd(c, INITRND);
- if(INITDAT != idat) {
- idat = INITDAT;
- goto start;
- }
- xdefine("etext", STEXT, c);
- xdefine("a6base", STEXT, INITDAT+A6OFFSET);
- if(debug['v'])
- Bprint(&bso, "etext = %lux\n", c);
- Bflush(&bso);
- for(p = textp; p != P; p = p->pcond)
- p->from.sym->value = p->pc;
- textsize = c - INITTEXT;
-}
-
-void
-xdefine(char *p, int t, long v)
-{
- Sym *s;
-
- s = lookup(p, 0);
- if(s->type == 0 || s->type == SXREF) {
- s->type = t;
- s->value = v;
- }
- if(s->type == STEXT && s->value == 0)
- s->value = v;
-}
-
-int
-andsize(Prog *p, Adr *ap)
-{
- int t, n;
- long v;
- Optab *o;
-
- t = ap->type;
- if(ap->index != D_NONE) {
- n = 2;
- v = ap->displace;
- if(v != 0) {
- n += 2;
- if(v < -32768L || v >= 32768L)
- n += 2;
- }
- switch(t) {
- default:
- v = ap->offset;
- break;
-
- case D_STATIC:
- case D_EXTERN:
- if(ap->sym->type == STEXT)
- return n+4; /* see below */
- v = ap->sym->value + ap->offset - A6OFFSET;
- if(debug['6'])
- v += INITDAT + A6OFFSET;
- }
- if(v != 0) {
- n += 2;
- if(v < -32768L || v >= 32768L)
- n += 2;
- }
- return n;
- }
- n = simple[t];
- if(n != 0177) {
- v = ap->offset;
- if(v == 0)
- return 0;
- if((n&070) != 020) /* D_INDIR */
- return 0;
- if(v == 0)
- return 0;
- if(v < -32768L || v >= 32768L)
- return 6; /* switch to index1 mode */
- return 2;
- }
- if((t&I_MASK) == I_ADDR)
- t = D_CONST;
- switch(t) {
-
- default:
- return 0;
-
- case D_STACK:
- case D_AUTO:
- case D_PARAM:
- v = ap->offset;
- if(v == 0)
- return 0;
- if(v < -32768L || v >= 32768L)
- return 6; /* switch to index1 mode */
- return 2;
-
- case I_INDIR|D_CONST:
- v = ap->offset;
- goto adr;
-
- case D_STATIC:
- case D_EXTERN:
- if(ap->sym->type == STEXT)
- return 4; /* too slow to get back into namelist */
- v = ap->sym->value + ap->offset - A6OFFSET;
- if(debug['6']) {
- v += INITDAT + A6OFFSET;
- goto adr;
- }
- if(v == 0)
- return 0;
-
- adr:
- if(v < -32768L || v >= 32768L)
- return 4;
- return 2;
-
- case D_CONST:
- case D_FCONST:
- o = &optab[p->as];
- if(ap == &(p->from))
- return o->srcsp;
- return o->dstsp;
-
- case D_CCR:
- case D_SR:
- if(p->as == AMOVW)
- return 0;
- return 2;
-
- case D_USP:
- t = p->from.type;
- if(t >= D_A0 && t <= D_A0+8)
- return 0;
- t = p->to.type;
- if(t >= D_A0 && t <= D_A0+8)
- return 0;
-
- case D_SFC:
- case D_DFC:
- case D_CACR:
- case D_VBR:
- case D_CAAR:
- case D_MSP:
- case D_ISP:
- case D_FPCR:
- case D_FPSR:
- case D_FPIAR:
- case D_TC:
- case D_ITT0:
- case D_ITT1:
- case D_DTT0:
- case D_DTT1:
- case D_MMUSR:
- case D_URP:
- case D_SRP:
- return 2;
- }
-}
-
-void
-putsymb(Sym *s, int t, long v)
-{
- int i, f;
- char *n;
-
- n = s->name;
- if(t == 'f')
- n++;
- lput(v);
- if(s->version)
- t += 'a' - 'A';
- CPUT(t+0x80); /* 0x80 is variable length */
-
- if(t == 'Z' || t == 'z') {
- CPUT(n[0]);
- for(i=1; n[i] != 0 || n[i+1] != 0; i += 2) {
- CPUT(n[i]);
- CPUT(n[i+1]);
- }
- CPUT(0);
- CPUT(0);
- i++;
- }
- else {
- for(i=0; n[i]; i++)
- CPUT(n[i]);
- CPUT(0);
- }
- symsize += 4 + 1 + i + 1;
-
- if(debug['n']) {
- if(t == 'z' || t == 'Z') {
- Bprint(&bso, "%c %.8lux ", t, v);
- for(i=1; n[i] != 0 || n[i+1] != 0; i+=2) {
- f = ((n[i]&0xff) << 8) | (n[i+1]&0xff);
- Bprint(&bso, "/%x", f);
- }
- Bprint(&bso, "\n");
- return;
- }
- if(s->version)
- Bprint(&bso, "%c %.8lux %s<%d>\n", t, v, n, s->version);
- else
- Bprint(&bso, "%c %.8lux %s\n", t, v, n);
- }
-}
-
-void
-asmsym(void)
-{
- Prog *p;
- Auto *a;
- Sym *s;
- int h;
-
- s = lookup("etext", 0);
- if(s->type == STEXT)
- putsymb(s, 'T', s->value);
- s = lookup("a6base", 0);
- if(s->type == STEXT)
- putsymb(s, 'D', s->value);
-
- for(h=0; h<NHASH; h++)
- for(s=hash[h]; s!=S; s=s->link)
- switch(s->type) {
- case SDATA:
- putsymb(s, 'D', s->value+INITDAT);
- continue;
-
- case SBSS:
- putsymb(s, 'B', s->value+INITDAT);
- continue;
-
- case SFILE:
- putsymb(s, 'f', s->value);
- continue;
- }
-
- for(p=textp; p!=P; p=p->pcond) {
- s = p->from.sym;
- if(s->type != STEXT)
- continue;
-
- /* filenames first */
- for(a=p->to.autom; a; a=a->link)
- if(a->type == D_FILE)
- putsymb(a->asym, 'z', a->aoffset);
- else
- if(a->type == D_FILE1)
- putsymb(a->asym, 'Z', a->aoffset);
-
- putsymb(s, 'T', s->value);
-
- /* auto and param after */
- for(a=p->to.autom; a; a=a->link)
- if(a->type == D_AUTO)
- putsymb(a->asym, 'a', -a->aoffset);
- else
- if(a->type == D_PARAM)
- putsymb(a->asym, 'p', a->aoffset);
- }
- if(debug['v'] || debug['n'])
- Bprint(&bso, "symsize = %lud\n", symsize);
- Bflush(&bso);
-}
-
-#define MINLC 2
-void
-asmsp(void)
-{
- long oldpc, oldsp;
- Prog *p;
- int s;
- long v;
-
- oldpc = INITTEXT;
- oldsp = 0;
- for(p = firstp; p != P; p = p->link) {
- if(p->stkoff == oldsp || p->as == ATEXT || p->as == ANOP) {
- if(p->as == ATEXT)
- curtext = p;
- if(debug['G'])
- Bprint(&bso, "%6lux %4ld%P\n",
- p->pc, p->stkoff, p);
- continue;
- }
- if(debug['G'])
- Bprint(&bso, "\t\t%6ld", spsize);
- v = (p->pc - oldpc) / MINLC;
- while(v) {
- s = 127;
- if(v < 127)
- s = v;
- CPUT(s+128); /* 129-255 +pc */
- if(debug['G'])
- Bprint(&bso, " pc+%d*2(%d)", s, s+128);
- v -= s;
- spsize++;
- }
- v = p->stkoff - oldsp;
- oldsp = p->stkoff;
- oldpc = p->pc + MINLC;
- if(v & 3 || v > 64L*4L || v < -64L*4L) {
- CPUT(0); /* 0 vvvv +sp */
- lput(v);
- if(debug['G']) {
- if(v > 0)
- Bprint(&bso, " sp+%ld*1(%d,%ld)\n",
- v, 0, v);
- else
- Bprint(&bso, " sp%ld*1(%d,%ld)\n",
- v, 0, v);
- Bprint(&bso, "%6lux %4ld%P\n",
- p->pc, p->stkoff, p);
- }
- spsize += 5;
- continue;
- }
- s = v/4;
- if(s > 0) {
- CPUT(0+s); /* 1-64 +sp */
- if(debug['G']) {
- Bprint(&bso, " sp+%d*4(%d)\n", s, 0+s);
- Bprint(&bso, "%6lux %4ld%P\n",
- p->pc, p->stkoff, p);
- }
- } else {
- CPUT(64-s); /* 65-128 -sp */
- if(debug['G']) {
- Bprint(&bso, " sp%d*4(%d)\n", s, 64-s);
- Bprint(&bso, "%6lux %4ld%P\n",
- p->pc, p->stkoff, p);
- }
- }
- spsize++;
- }
- while(spsize & 1) {
- s = 129;
- CPUT(s);
- spsize++;
- }
- if(debug['v'] || debug['G'])
- Bprint(&bso, "stsize = %ld\n", spsize);
- Bflush(&bso);
-}
-
-void
-asmlc(void)
-{
- long oldpc, oldlc;
- Prog *p;
- long v, s;
-
- oldpc = INITTEXT;
- oldlc = 0;
- for(p = firstp; p != P; p = p->link) {
- if(p->line == oldlc || p->as == ATEXT || p->as == ANOP) {
- if(p->as == ATEXT)
- curtext = p;
- if(debug['L'])
- Bprint(&bso, "%6lux %P\n",
- p->pc, p);
- continue;
- }
- if(debug['L'])
- Bprint(&bso, "\t\t%6ld", lcsize);
- v = (p->pc - oldpc) / MINLC;
- while(v) {
- s = 127;
- if(v < 127)
- s = v;
- CPUT(s+128); /* 129-255 +pc */
- if(debug['L'])
- Bprint(&bso, " pc+%ld*%d(%ld)", s, MINLC, s+128);
- v -= s;
- lcsize++;
- }
- s = p->line - oldlc;
- oldlc = p->line;
- oldpc = p->pc + MINLC;
- if(s > 64 || s < -64) {
- CPUT(0); /* 0 vv +lc */
- CPUT(s>>24);
- CPUT(s>>16);
- CPUT(s>>8);
- CPUT(s);
- if(debug['L']) {
- if(s > 0)
- Bprint(&bso, " lc+%ld(%d,%ld)\n",
- s, 0, s);
- else
- Bprint(&bso, " lc%ld(%d,%ld)\n",
- s, 0, s);
- Bprint(&bso, "%6lux %P\n",
- p->pc, p);
- }
- lcsize += 5;
- continue;
- }
- if(s > 0) {
- CPUT(0+s); /* 1-64 +lc */
- if(debug['L']) {
- Bprint(&bso, " lc+%ld(%ld)\n", s, 0+s);
- Bprint(&bso, "%6lux %P\n",
- p->pc, p);
- }
- } else {
- CPUT(64-s); /* 65-128 -lc */
- if(debug['L']) {
- Bprint(&bso, " lc%ld(%ld)\n", s, 64-s);
- Bprint(&bso, "%6lux %P\n",
- p->pc, p);
- }
- }
- lcsize++;
- }
- while(lcsize & 1) {
- s = 129;
- CPUT(s);
- lcsize++;
- }
- if(debug['v'] || debug['L'])
- Bprint(&bso, "lcsize = %ld\n", lcsize);
- Bflush(&bso);
-}