Copyright 1972 Bell Telephone Laboratories, Inc.
waste() /* waste space */
waste(waste(waste
),waste(waste
),waste(waste
));
waste(waste(waste
),waste(waste
),waste(waste
));
waste(waste(waste
),waste(waste
),waste(waste
));
waste(waste(waste
),waste(waste
),waste(waste
));
waste(waste(waste
),waste(waste
),waste(waste
));
waste(waste(waste
),waste(waste
),waste(waste
));
waste(waste(waste
),waste(waste
),waste(waste
));
waste(waste(waste
),waste(waste
),waste(waste
));
extern fout
, fin
, nerror
, line
;
extern getwrd
, rcexpr
, tmpfil
;
extern cctab
[], regtab
[], efftab
[], sptab
[];
int sp
[], c
, table
[], tabtab
[3][], tree
;
if((fin
=open(argv
[1],0))<0) {
error("Cant't find %s", argv
[1]);
if((fout
=creat(argv
[3],017))<0) {
error("Can't create %s", argv
[3]);
table
= tabtab
[getwrd()];
extern opdope
[], cctab
, maprel
;
int op
, d1
, d2
, t1
, t2
, p1
[], p2
[], dope
, cctab
[];
if (op
>=29) /* if not leaf */
if (((dope
=opdope
[op
])&01)!=0) { /* binary? */
if (d2
>d1
& (dope
&0100)!=0) /* commute? */
if (table
!=cctab
| (op
!=47&op
!=48)) { /* commute? */
if ((dope
&04)!=0) /* relation? */
*tree
= op
= maprel
[op
-60];
if (*table
++ == op
) goto foundop
;
if (d1
> (*mp
&077) | (*mp
>=0100)&(*p1
!=36))
if (notcompat(t1
, mp
[1]))
if ((opdope
[op
]&01)!=0 & p2
!=0) {
if (d2
> (mp
[2]&077) | (mp
[2]>=0100)&(*p2
!=36))
extern cexpr
, regtab
, cctab
, sptab
, printf
, error
;
if(*tree
== 103 | *tree
==104) {
(*tree
==103?jumpc
:cbranch
)(tree
[1],tree
[2],tree
[3],0);
modf
= isfloat(tree
)? 'f':0;
if (*tree
== 110) { /* force r0 */
if((r
=rcexpr(tree
[3], table
, reg
)) != 0)
printf("mov%c r%d,r0\n", modf
, r
);
if ((r
=cexpr(tree
, table
, reg
))>=0)
if((r
=cexpr(tree
, regtab
, reg
))>=0) {
printf("mov%c r%d,-(sp)\n", modf
, r
);
printf("tst%c r%d\n", modf
, r
);
error("No match for op %d", *tree
);
extern match
, nreg
, printf
, pname
, putchar
, regtab
;
extern sptab
, cctab
, rcexpr
, prins
, rlength
, popstk
;
extern collcon
, isn
, label
, branch
, cbranch
;
int p1
[], p2
[], c
, r
, p
[], otable
[], ctable
[], regtab
[], cctab
[];
if ((c
= *tree
)==100) { /* call */
while (*p2
==9) { /* comma */
r
=+ arlength((p
=p2
[4])[1]);
tree
[2] = r
; /* save arg length */
cbranch(tree
[3], c
=isn
++, 0, reg
);
rcexpr(tree
[4][3], table
, reg
);
reg
= rcexpr(tree
[4][4], table
, reg
);
if ((string
=match(tree
, table
, nreg
-reg
))==0)
if ((c
= *tree
)==43 | c
==73)
if (p
[1]==1) /* char type? */
if (tree
[3][1]==1 | tree
[4][1]==1)
if(collcon(p
) & ctable
!=sptab
)
rreg
= rcexpr(p
, ctable
, r
);
if (rreg
==r
| ctable
!=regtab
)
if (string
[-2]=='G') /* left operand */
if (oddreg(tree
, 0)==1) {
printf("mov r%d,r%d\n", rreg
, r
);
error("Register overflow: simplify expression");
tree
[0] = maprel
[(c
=tree
[0])-60];
printf("$%o", p1
[5]+p1
[4]);
case '^': /* for ++ -- */
case 23: /* float const */
case 5: /* auto, param */
error("Illegal structure reference");
error("pname called illegally");
case 35: /* & (non-automatic) */
case 21: /* short constant */
case 23: /* float const */
if (*p1
==20) /* name or offset name */
return(p
[2]<=nreg
? 20: 24);
if (st
==0) /* word, byte */
at
= 020; /* *int for **stuff */
error("No match' for op %d", op
);
if(*(p1
=p
[4])==21) { /* number */
if ((opdope
[t
[0]]&04)!=0) /* relational */
if ((rt
=t
[1])>=2 & rt
<=3)
if ((arl
=rlength(t
)) == 4)
maprel
[] 60, 61, 64, 65, 62, 63, 68, 69, 66, 67;