summary |
tags |
clone url |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
2e47c80)
SCCS-vsn: old/pcc/c2.vax/c2.h 4.9
SCCS-vsn: old/pcc/c2.vax/c20.c 4.9
SCCS-vsn: old/pcc/c2.vax/c21.c 4.15
SCCS-vsn: old/pcc/c2.vax/c22.c 4.3
/*
* Header for object code improver
/*
* Header for object code improver
+ union {
+ struct {
+ char op_op;
+ char op_subop;
+ } un_op;
+ short un_combop;
+ } op_un;
short refc;
struct node *forw;
struct node *back;
short refc;
struct node *forw;
struct node *back;
-struct {
- short combop;
-};
+#define op op_un.un_op.op_op
+#define subop op_un.un_op.op_subop
+#define combop op_un.un_combop
char line[512];
struct node first;
char line[512];
struct node first;
int debug;
char *lasta;
char *lastr;
int debug;
char *lasta;
char *lastr;
#define RT4 15
#define LABHS 127
#define RT4 15
#define LABHS 127
-struct { char lbyte; };
-
char *copy();
long getnum();
struct node *codemove();
struct node *insertl();
struct node *nonlab();
char *copy();
long getnum();
struct node *codemove();
struct node *insertl();
struct node *nonlab();
+struct node *alloc();
+
+#ifdef notdef
+#define decref(p) \
+ ((p) && --(p)->refc <= 0 ? nrlab++, delnode(p) : 0)
+#define delnode(p) \
+ ((p)->back->forw = (p)->forw, (p)->forw->back = (p)->back)
+#endif notdef
-static char sccsid[] = "@(#)c20.c 4.8 (Berkeley) %G%";
+static char sccsid[] = "@(#)c20.c 4.9 (Berkeley) %G%";
#include "c2.h"
#include <stdio.h>
#include <ctype.h>
#include "c2.h"
#include <stdio.h>
#include <ctype.h>
char _sibuf[BUFSIZ], _sobuf[BUFSIZ];
char _sibuf[BUFSIZ], _sobuf[BUFSIZ];
int ioflag;
int fflag;
long isn = 2000000;
int ioflag;
int fflag;
long isn = 2000000;
long lgensym[10] =
{100000L,200000L,300000L,400000L,500000L,600000L,700000L,800000L,900000L,1000000L};
long lgensym[10] =
{100000L,200000L,300000L,400000L,500000L,600000L,700000L,800000L,900000L,1000000L};
+#define ALLOCSIZE 4096
+
struct node *
alloc(an)
{
register int n;
struct node *
alloc(an)
{
register int n;
+ register struct node *p;
n = an;
n+=sizeof(char *)-1;
n &= ~(sizeof(char *)-1);
if (lasta+n >= lastr) {
n = an;
n+=sizeof(char *)-1;
n &= ~(sizeof(char *)-1);
if (lasta+n >= lastr) {
- if (sbrk(2000) == -1) {
+ if ((int) sbrk(ALLOCSIZE) == -1) {
fprintf(stderr, "Optimizer: out of space\n");
exit(1);
}
fprintf(stderr, "Optimizer: out of space\n");
exit(1);
}
+ p = (struct node *) lasta;
}
setbuf(stdin, _sibuf);
setbuf(stdout, _sobuf);
}
setbuf(stdin, _sibuf);
setbuf(stdout, _sobuf);
- lasta = lastr = sbrk(2);
+ lasta = lastr = (char *) sbrk(2);
- lasta = firstr = lastr = alloc(0);
+ lasta = firstr = lastr = (char *) alloc(0);
maxiter = 0;
do {
isend = input();
maxiter = 0;
do {
isend = input();
input()
{
register struct node *p, *lastp;
input()
{
register struct node *p, *lastp;
- struct optab *op; register char *cp1;
+ struct optab *opp; register char *cp1;
static struct optab F77JSW = {".long", T(JSW,1)};
lastp = &first;
for (;;) {
top:
static struct optab F77JSW = {".long", T(JSW,1)};
lastp = &first;
for (;;) {
top:
- op = getline();
- if (debug && op==0) fprintf(stderr,"? %s\n",line);
- switch (op->opcode&0377) {
+ opp = getline();
+ if (debug && opp==0) fprintf(stderr,"? %s\n",line);
+ switch (opp->opcode&0377) {
case LABEL:
p = alloc(sizeof first);
case LABEL:
p = alloc(sizeof first);
case LGEN:
if (*curlp!='L' && !locuse(curlp)) goto std;
case LGEN:
if (*curlp!='L' && !locuse(curlp)) goto std;
- if (op->opcode==T(JBR,RET) || op->opcode==T(JBR,RSB)) goto std;
+ if (opp->opcode==T(JBR,RET) || opp->opcode==T(JBR,RSB)) goto std;
case CBR:
case JMP:
case JSW:
case SOBGEQ: case SOBGTR: case AOBLEQ: case AOBLSS: case ACB:
p = alloc(sizeof first);
case CBR:
case JMP:
case JSW:
case SOBGEQ: case SOBGTR: case AOBLEQ: case AOBLSS: case ACB:
p = alloc(sizeof first);
- p->combop = op->opcode; p->code=0; cp1=curlp;
+ p->combop = opp->opcode; p->code=0; cp1=curlp;
if ((!isdigit(*cp1) || 0==(p->labno=locuse(cp1))) &&
(*cp1!='L' || 0==(p->labno = getnum(cp1+1)))) {/* jbs, etc.? */
while (*cp1++); while (*--cp1!=',' && cp1!=curlp);
if ((!isdigit(*cp1) || 0==(p->labno=locuse(cp1))) &&
(*cp1!='L' || 0==(p->labno = getnum(cp1+1)))) {/* jbs, etc.? */
while (*cp1++); while (*--cp1!=',' && cp1!=curlp);
case MOVA:
p=alloc(sizeof first);
case MOVA:
p=alloc(sizeof first);
- p->combop=op->opcode; p->code=0; cp1=curlp+1;
+ p->combop=opp->opcode; p->code=0; cp1=curlp+1;
if (cp1[-1]=='L' || isdigit(cp1[-1])) {
while (*cp1++!=','); *--cp1=0;
if (0!=(p->labno=locuse(curlp)) ||
if (cp1[-1]=='L' || isdigit(cp1[-1])) {
while (*cp1++!=','); *--cp1=0;
if (0!=(p->labno=locuse(curlp)) ||
case BSS:
case DATA:
for (;;) {
case BSS:
case DATA:
for (;;) {
- printf("%s%c",line,(op->opcode==LABEL ? ':' : '\n'));
- if (op->opcode==TEXT) goto top;
- if (END==(op=getline())->opcode) {/* dangling .data is bad for you */
+ printf("%s%c",line,(opp->opcode==LABEL ? ':' : '\n'));
+ if (opp->opcode==TEXT) goto top;
+ if (END==(opp=getline())->opcode) {/* dangling .data is bad for you */
printf(".text\n");
break;
}
printf(".text\n");
break;
}
std:
default:
p = alloc(sizeof first);
std:
default:
p = alloc(sizeof first);
- p->combop = op->opcode;
+ p->combop = opp->opcode;
p->labno = 0;
p->code = copy(curlp);
break;
p->labno = 0;
p->code = copy(curlp);
break;
}
p->forw = 0;
p->back = lastp;
}
p->forw = 0;
p->back = lastp;
lastp->forw = p;
lastp = p;
p->ref = 0;
if (p->op==CASE) {
char *lp; int ncase;
lp=curlp; while (*lp++); while (*--lp!='$'); ncase=getnum(lp+1);
lastp->forw = p;
lastp = p;
p->ref = 0;
if (p->op==CASE) {
char *lp; int ncase;
lp=curlp; while (*lp++); while (*--lp!='$'); ncase=getnum(lp+1);
- if (LABEL!=(getline())->opcode) abort(-2);
+ if (LABEL!=(getline())->opcode) {
+ fprintf(stderr, "c2: garbled 'case' instruction\n");
+ exit(-2);
+ }
- if (WGEN!=(getline())->opcode) abort(-3);
+ if (WGEN!=(getline())->opcode) {
+ fprintf(stderr, "c2: garbled 'case' instruction\n");
+ exit(-3);
+ }
p = alloc(sizeof first); p->combop = JSW; p->code = 0;
lp=curlp; while(*lp++!='-'); *--lp=0; p->labno=getnum(curlp+1);
if (isn<=p->labno) isn=1+p->labno;
p = alloc(sizeof first); p->combop = JSW; p->code = 0;
lp=curlp; while(*lp++!='-'); *--lp=0; p->labno=getnum(curlp+1);
if (isn<=p->labno) isn=1+p->labno;
p->ref = 0; p->pop=0;
} while (--ncase>=0);
}
p->ref = 0; p->pop=0;
} while (--ncase>=0);
}
locuse(p)
register char *p;
{
locuse(p)
register char *p;
{
- register c; int neg; register long n;
-
if (!isdigit(p[0]) || p[1] != 'f' && p[1] != 'b' || p[2]) return(0);
return (lgensym[p[0] - '0'] - (p[1] == 'b'));
}
if (!isdigit(p[0]) || p[1] != 'f' && p[1] != 'b' || p[2]) return(0);
return (lgensym[p[0] - '0'] - (p[1] == 'b'));
}
+ onp = np = (char *) alloc(n);
p = ap;
while (*np++ = *p++);
if (na>1) {
p = ap;
while (*np++ = *p++);
if (na>1) {
register struct optab *optp, **ophp;
register int i,t;
register struct optab *optp, **ophp;
register int i,t;
- for(i=NREG+5;--i>=0;) regs[i]=alloc(C2_ASIZE);
+ for(i=NREG+5;--i>=0;) regs[i]=(char *) alloc(C2_ASIZE);
for (optp = optab; optp->opstring[0]; optp++) {
t=7; i=0; while (--t>=0) i+= i+optp->opstring[t];
ophp = &ophash[i % OPHS];
for (optp = optab; optp->opstring[0]; optp++) {
t=7; i=0; while (--t>=0) i+= i+optp->opstring[t];
ophp = &ophash[i % OPHS];
- register struct node *p, *lp;
+ register struct node *p, *lp, *tp;
struct node *labhash[LABHS];
register struct node **hp;
struct node *labhash[LABHS];
register struct node **hp;
- hp = nonlab(lp)->back;
- if (hp!=lp) {
- p->labno = hp->labno;
- lp = hp;
+ tp = nonlab(lp)->back;
+ if (tp!=lp) {
+ p->labno = tp->labno;
+ lp = tp;
}
p->ref = lp;
lp->refc++;
}
p->ref = lp;
lp->refc++;
register struct node *p1;
{
register struct node *p2, *p3;
register struct node *p1;
{
register struct node *p2, *p3;
for (;;) {
while ((p1 = p1->back) && p1->op==LABEL);
while ((p2 = p2->back) && p2->op==LABEL);
if (!equop(p1, p2) || p1==p2)
for (;;) {
while ((p1 = p1->back) && p1->op==LABEL);
while ((p2 = p2->back) && p2->op==LABEL);
if (!equop(p1, p2) || p1==p2)
p3 = insertl(p2);
p1->combop = JBR;
p1->pop=0;
p1->ref = p3;
p1->labno = p3->labno;
p1->code = 0;
p3 = insertl(p2);
p1->combop = JBR;
p1->pop=0;
p1->ref = p3;
p1->labno = p3->labno;
p1->code = 0;
nxjump++;
nchange++;
}
}
struct node *
nxjump++;
nchange++;
}
}
struct node *
-insertl(op)
-register struct node *op;
+insertl(np)
+register struct node *np;
{
register struct node *lp;
{
register struct node *lp;
- if (op->op == LABEL) {
- op->refc++;
- return(op);
+ if (np->op == LABEL) {
+ np->refc++;
+ return(np);
- if (op->back->op == LABEL) {
- op = op->back;
- op->refc++;
- return(op);
+ if (np->back->op == LABEL) {
+ np = np->back;
+ np->refc++;
+ return(np);
}
lp = alloc(sizeof first);
lp->combop = LABEL;
}
lp = alloc(sizeof first);
lp->combop = LABEL;
lp->ref = 0;
lp->code = 0;
lp->refc = 1;
lp->ref = 0;
lp->code = 0;
lp->refc = 1;
- lp->back = op->back;
- lp->forw = op;
- op->back->forw = lp;
- op->back = lp;
+ lp->back = np->back;
+ lp->forw = np;
+ np->back->forw = lp;
+ np->back = lp;
-static char sccsid[] = "@(#)c21.c 4.14 %G%";
+#ifndef lint
+static char sccsid[] = "@(#)c21.c 4.15 %G%";
+#endif
/* char C21[] = {"@(#)c21.c 1.83 80/10/16 21:18:22 JFR"}; /* sccs ident */
/*
/* char C21[] = {"@(#)c21.c 1.83 80/10/16 21:18:22 JFR"}; /* sccs ident */
/*
struct node *bflow();
struct node *bicopt();
char *findcon();
struct node *bflow();
struct node *bicopt();
char *findcon();
redun3(p,split) register struct node *p; int split; {
/* check for 3 addr instr which should be 2 addr */
redun3(p,split) register struct node *p; int split; {
/* check for 3 addr instr which should be 2 addr */
if (regs[RT1][0] != '$') goto std;
if ((shcnt = getnum(®s[RT1][1])) < 1 || shcnt > 3) goto std;
if ((shfrom = isreg(regs[RT2])) >= 0)
if (regs[RT1][0] != '$') goto std;
if ((shcnt = getnum(®s[RT1][1])) < 1 || shcnt > 3) goto std;
if ((shfrom = isreg(regs[RT2])) >= 0)
- regfrom = copy(regs[RT2],"]");
+ regfrom = copy(regs[RT2]);
if ((shto = isreg(regs[RT3])) >= 0 && shto<NUSE)
{
int regnum;
if ((shto = isreg(regs[RT3])) >= 0 && shto<NUSE)
{
int regnum;
uses[shto] = NULL; splitrand(pf);
cp2=regs[RT1]; while (*cp2++!='[');
cp1=regfrom; while (*cp2++= *cp1++);
uses[shto] = NULL; splitrand(pf);
cp2=regs[RT1]; while (*cp2++!='[');
cp1=regfrom; while (*cp2++= *cp1++);
+ *--cp2 = ']';
+ *++cp2 = '\0';
- register struct node *p, *lastp;
+ register struct node *p;
register int r;
int r1;
clearreg();
for (p=first.forw; p!=0; p = p->forw) {
register int r;
int r1;
clearreg();
for (p=first.forw; p!=0; p = p->forw) {
if (debug) {
if (*conloc) {
r1=conval[0];
if (debug) {
if (*conloc) {
r1=conval[0];
if (0<=(r2=isreg(lastrand)) && r2<NUSE) {
uses[r2]=uses[r]; uses[r]=0;
}
if (0<=(r2=isreg(lastrand)) && r2<NUSE) {
uses[r2]=uses[r]; uses[r]=0;
}
newcode(p); redunm++; flow=r;
} else if (p->op==MOV && p->forw->op!=EXTV && p->forw->op!=EXTZV) {
/* superfluous fetch */
newcode(p); redunm++; flow=r;
} else if (p->op==MOV && p->forw->op!=EXTV && p->forw->op!=EXTZV) {
/* superfluous fetch */
if (0<=(r2=isreg(src)) && r2<NUSE) {
uses[r2]=uses[r]; uses[r]=0;
}
if (0<=(r2=isreg(src)) && r2<NUSE) {
uses[r2]=uses[r]; uses[r]=0;
}
newcode(p); redunm++; flow=r;
} else splitrand(p);
}
newcode(p); redunm++; flow=r;
} else splitrand(p);
}
- if (0<=(r=flow)) {olduse=uses[r]; uses[r]=0; *(short *)(regs[r])=0;}
+ if (0<=(r=flow)) {
+ olduse=uses[r];
+ uses[r]=0;
+ regs[r][0]=regs[r][1]=0;
+ }
/* these two are here, rather than in bmove(),
/* because I decided that it was better to go for 3-address code
/* (save time) rather than fancy jbxx (save 1 byte)
/* on sequences like bisl2 $64,r0; movl r0,foo
*/
if (p->op==BIC) {p=bicopt(p); splitrand(p); lastrand=byondrd(p);}
/* these two are here, rather than in bmove(),
/* because I decided that it was better to go for 3-address code
/* (save time) rather than fancy jbxx (save 1 byte)
/* on sequences like bisl2 $64,r0; movl r0,foo
*/
if (p->op==BIC) {p=bicopt(p); splitrand(p); lastrand=byondrd(p);}
- if (p->op==BIS) {bixprep(p,JBSS); lastrand=byondrd(p);}
+ if (p->op==BIS) {(void) bixprep(p,JBSS); lastrand=byondrd(p);}
/* now look for 'read' or 'modify' (read & write) uses */
preg=regs+RT1;
while (*(cp1= *preg++)) {
/* now look for 'read' or 'modify' (read & write) uses */
preg=regs+RT1;
while (*(cp1= *preg++)) {
}
isfield(n) register long n; {/* -1 -> no; else -> position of low bit */
}
isfield(n) register long n; {/* -1 -> no; else -> position of low bit */
- register int pos; register long t;
+ register int p; register long t;
t= ((n-1)|n) +1;
if (n!=0 && (0==t || 0<=ispow2(t))) {
t= ((n-1)|n) +1;
if (n!=0 && (0==t || 0<=ispow2(t))) {
- pos=0; while(!(n&1)) {n >>= 1; ++pos;} return(pos);
+ p=0; while(!(n&1)) {n >>= 1; ++p;} return(p);
*/
register char *cp1,*cp2; int r;
char src[C2_ASIZE];
*/
register char *cp1,*cp2; int r;
char src[C2_ASIZE];
if (!bixprep(p,JBCC)) return(p);
if (f==0) {/* the BIC isolates low order bits */
siz=pos; pos=0;
if (!bixprep(p,JBCC)) return(p);
if (f==0) {/* the BIC isolates low order bits */
siz=pos; pos=0;
* However, if the CVT is from a float or
* double, forget it!
*/
* However, if the CVT is from a float or
* double, forget it!
*/
- subop = p->back->subop&0xF; /* type of LHS of CVT/MOVZ */
+ sop = p->back->subop&0xF; /* type of LHS of CVT/MOVZ */
if (equstr(src,cp2) && okio(cp1)
if (equstr(src,cp2) && okio(cp1)
- && subop != FFLOAT && subop != DFLOAT
- && subop != GFLOAT && subop != HFLOAT
- && ((!indexa(cp1) && !autoid(cp1)) || lhssiz == subop)
+ && sop != FFLOAT && sop != DFLOAT
+ && sop != GFLOAT && sop != HFLOAT
+ && ((!indexa(cp1) && !autoid(cp1)) || lhssiz == sop)
&& 0<=(r=isreg(cp2)) && r<NUSE
&& 0<=(r=isreg(cp2)) && r<NUSE
- && bitsize[subop]>=(pos+siz)
+ && bitsize[sop]>=(pos+siz)
&& bitsize[p->back->subop>>4]>=(pos+siz)) {/* good CVT */
cp1=regs[RT1]; cp2=src; while (*cp2++= *cp1++);
delnode(p->back);
&& bitsize[p->back->subop>>4]>=(pos+siz)) {/* good CVT */
cp1=regs[RT1]; cp2=src; while (*cp2++= *cp1++);
delnode(p->back);
jumpsw()
{
register struct node *p, *p1;
jumpsw()
{
register struct node *p, *p1;
+ register struct node *tp;
+ long tl;
+ char *tcp;
+ int ti;
nj = 0;
for (p=first.forw; p!=0; p = p->forw)
nj = 0;
for (p=first.forw; p!=0; p = p->forw)
for (p=first.forw; p!=0; p = p1) {
p1 = p->forw;
if (p->op == CBR && p1->op==JBR && p->ref && p1->ref
for (p=first.forw; p!=0; p = p1) {
p1 = p->forw;
if (p->op == CBR && p1->op==JBR && p->ref && p1->ref
continue;
p->subop = revbr[p->subop];
p->pop=0;
continue;
p->subop = revbr[p->subop];
p->pop=0;
- p->ref = t;
- t = p1->labno;
+ p->ref = tp;
+ tl = p1->labno;
#ifdef COPYCODE
if (p->labno == 0) {
#ifdef COPYCODE
if (p->labno == 0) {
- t = p1->code; p1->code = p->code; p->code = t;
+ tcp = p1->code;
+ p1->code = p->code;
+ p->code = tcp;
-abs(x)
-{
- return(x<0? -x: x);
-}
-
equop(p1, p2)
register struct node *p1;
struct node *p2;
equop(p1, p2)
register struct node *p1;
struct node *p2;
return(0);
if (p1->op>0 && p1->op<MOV)
return(0);
return(0);
if (p1->op>0 && p1->op<MOV)
return(0);
+ switch (p1->combop) {
+ case EROU: case JSW: case TEXT: case DATA:
+ case BSS: case ALIGN: case WGEN: case END:
+ /*
+ * Consider all pseudo-ops to be unique.
+ */
+ return(0);
+ }
if (p1->op==MOVA && p1->labno!=p2->labno) return(0);
cp1 = p1->code;
cp2 = p2->code;
if (p1->op==MOVA && p1->labno!=p2->labno) return(0);
cp1 = p1->code;
cp2 = p2->code;
delnode(p) register struct node *p; {
p->back->forw = p->forw;
p->forw->back = p->back;
}
delnode(p) register struct node *p; {
p->back->forw = p->forw;
p->forw->back = p->back;
}
decref(p)
register struct node *p;
{
decref(p)
register struct node *p;
{
- register short **i;
- for (i=regs+NREG; i>regs;) **--i=0;
- conloc[0] = 0; ccloc[0] = 0;
+ register char **i;
+ for (i=regs; i<regs+NREG; ++i) {
+ **i = 0;
+ *(*i+1) = 0;
+ }
+ conloc[0] = 0;
+ ccloc[0] = 0;
- source(s); /* handle addressing side effects */
+ (void) source(s); /* handle addressing side effects */
if (!natural(s)) {
/* wild store, everything except constants vanishes */
for (i=NREG; --i>=0;)
if (!natural(s)) {
/* wild store, everything except constants vanishes */
for (i=NREG; --i>=0;)
- if (regs[i][1] != '$') *(short *)(regs[i]) = 0;
+ if (regs[i][1] != '$')
+ regs[i][0] = regs[i][1] = 0;
conloc[0] = 0; ccloc[0] = 0;
return;
}
if ((i = isreg(s)) >= 0) {
conloc[0] = 0; ccloc[0] = 0;
return;
}
if ((i = isreg(s)) >= 0) {
- *(short *)(regs[i]) = 0; /* if register destination, that reg is a goner */
+ /* if register destination, that reg is a goner */
+ regs[i][0] = regs[i][1] = 0;
switch(type & 0xF){
case DFLOAT: /* clobber two at once */
/*FALLTHROUGH*/
case GFLOAT:
switch(type & 0xF){
case DFLOAT: /* clobber two at once */
/*FALLTHROUGH*/
case GFLOAT:
- *(short *)(regs[i+1]) = 0;
+ regs[i+1][0] = regs[i+1][1] = 0;
break;
case HFLOAT: /* clobber four at once */
break;
case HFLOAT: /* clobber four at once */
- *(short *)(regs[i+1]) = 0;
- *(short *)(regs[i+2]) = 0;
- *(short *)(regs[i+3]) = 0;
+ regs[i+1][0] = regs[i+1][1] = 0;
+ regs[i+2][0] = regs[i+2][1] = 0;
+ regs[i+3][0] = regs[i+3][1] = 0;
break;
}
switch((type>>4)&0xF){
case DFLOAT: /* clobber two at once */
/*FALLTHROUGH*/
case GFLOAT:
break;
}
switch((type>>4)&0xF){
case DFLOAT: /* clobber two at once */
/*FALLTHROUGH*/
case GFLOAT:
- *(short *)(regs[i+1]) = 0;
+ regs[i+1][0] = regs[i+1][1] = 0;
break;
case HFLOAT: /* clobber four at once */
break;
case HFLOAT: /* clobber four at once */
- *(short *)(regs[i+1]) = 0;
- *(short *)(regs[i+2]) = 0;
- *(short *)(regs[i+3]) = 0;
+ regs[i+1][0] = regs[i+1][1] = 0;
+ regs[i+2][0] = regs[i+2][1] = 0;
+ regs[i+3][0] = regs[i+3][1] = 0;
- /*
- if (DFLOAT==(type&0xF) || DFLOAT==((type>>4)&0xF))
- *(short *)(regs[i+1]) = 0;
- */
}
for (i=NREG; --i>=0;)
if (regs[i][1]=='*' && equstr(s, regs[i]+2))
}
for (i=NREG; --i>=0;)
if (regs[i][1]=='*' && equstr(s, regs[i]+2))
- *(short *)(regs[i]) = 0; /* previous indirection through destination is invalid */
+ regs[i][0] = regs[i][1] = 0; /* previous indirection through destination is invalid */
while ((i = findrand(s,0)) >= 0) /* previous values of destination are invalid */
while ((i = findrand(s,0)) >= 0) /* previous values of destination are invalid */
- *(short *)(regs[i]) = 0;
+ regs[i][0] = regs[i][1] = 0;
if (*conloc && equstr(conloc, s))
conloc[0] = 0;
setcc(s, type); /* natural destinations set condition codes */
if (*conloc && equstr(conloc, s))
conloc[0] = 0;
setcc(s, type); /* natural destinations set condition codes */
lp = &first;
for (p=first.forw; p!=0; p = p->forw) {
lp = &first;
for (p=first.forw; p!=0; p = p->forw) {
- if (p->back != lp)
- abort(-1);
+ if (p->back != lp) {
+ fprintf(stderr, "c2: failed internal consistency check -- help!\n");
+ exit(-1);
+ }
|| *(p2-2)=='+') {
while (*p1 && *p1++!='r');
if (isdigit(*p1++))
|| *(p2-2)=='+') {
while (*p1 && *p1++!='r');
if (isdigit(*p1++))
- if (isdigit(*p1)) *(short *)(regs[10+*p1-'0'])=0;
- else *(short *)(regs[*--p1-'0'])=0;
+ if (isdigit(*p1))
+ regs[10+*p1-'0'][0] = regs[10+*p1-'0'][1] = 0;
+ else {
+ --p1;
+ regs[*p1-'0'][0] = regs[*p1-'0'][1] = 0;
+ }
struct node *p;
{
register r;
struct node *p;
{
register r;
- register char *p1, *p2;
char **preg; int nrepl;
preg=regs+RT1; nrepl=0;
char **preg; int nrepl;
preg=regs+RT1; nrepl=0;
+compare(opc, acp1, acp2)
char *acp1, *acp2;
{
register char *cp1, *cp2;
char *acp1, *acp2;
{
register char *cp1, *cp2;
if (*cp1++ != *cp2)
return(0);
} while (*cp2++);
if (*cp1++ != *cp2)
return(0);
} while (*cp2++);
- cp1 = n1;
- cp2 = n2;
- switch(op) {
- return(((int)cp1) <= ((int)cp2));
- return(((int)cp1) >= ((int)cp2));
- return(((int)cp1) < ((int)cp2));
- return(((int)cp1) > ((int)cp2));
+ return((unsigned) n1 < (unsigned) n2);
+ return((unsigned) n1 > (unsigned) n2);
+ return((unsigned) n1 <= (unsigned) n2);
+ return((unsigned) n1 >= (unsigned) n2);
-static char sccsid[] = "@(#)c22.c 4.2 %G%";
+#ifndef lint
+static char sccsid[] = "@(#)c22.c 4.3 %G%";
+#endif
+
-/* char c22[] = "@(#)c22.c 4.2 %G%"; */
#define readonly
readonly char revbr[] = {
#define readonly
readonly char revbr[] = {