char revbr
[] { JNE
, JEQ
, JGT
, JLT
, JGE
, JLE
, JHIS
, JLOS
, JHI
, JLO
};
register int niter
, maxiter
, isend
;
if (argc
>1 && argv
[1][0]=='+') {
if (argc
>1 && argv
[1][0]=='-') {
if (freopen(argv
[1], "r", stdin
) == NULL
) {
fprintf(stderr
, "C2: can't find %s\n", argv
[1]);
if (freopen(argv
[2], "w", stdout
) == NULL
) {
fprintf(stderr
, "C2: can't create %s\n", argv
[2]);
lasta
= firstr
= lastr
= sbrk(2);
} while (nchange
|| jumpsw());
fprintf(stderr
, "%d iterations\n", maxiter
);
fprintf(stderr
, "%d jumps to jumps\n", nbrbr
);
fprintf(stderr
, "%d inst. after jumps\n", iaftbr
);
fprintf(stderr
, "%d jumps to .+2\n", njp1
);
fprintf(stderr
, "%d redundant labels\n", nrlab
);
fprintf(stderr
, "%d cross-jumps\n", nxjump
);
fprintf(stderr
, "%d code motions\n", ncmot
);
fprintf(stderr
, "%d branches reversed\n", nrevbr
);
fprintf(stderr
, "%d redundant moves\n", redunm
);
fprintf(stderr
, "%d simplified addresses\n", nsaddr
);
fprintf(stderr
, "%d loops inverted\n", loopiv
);
fprintf(stderr
, "%d redundant jumps\n", nredunj
);
fprintf(stderr
, "%d common seqs before jmp's\n", ncomj
);
fprintf(stderr
, "%d skips over jumps\n", nskip
);
fprintf(stderr
, "%d sob's added\n", nsob
);
fprintf(stderr
, "%d redundant tst's\n", nrtst
);
fprintf(stderr
, "%d literals eliminated\n", nlit
);
fprintf(stderr
, "%dK core\n", (((int)lastr
+01777)>>10)&077);
register struct node
*p
, *lastp
;
p
= (struct node
*)alloc(sizeof first
);
p
->labno
= getnum(line
+1);
p
= (struct node
*)alloc(sizeof first
);
if (*curlp
=='L' && (p
->labno
= getnum(curlp
+1)))
p
->code
= copy(1, curlp
);
p
= (struct node
*)alloc(sizeof first
);
p
->code
= copy(1, curlp
);
while ((c
= getchar())==' ' || c
=='\t')
if (lp
>= &line
[LSIZE
-2]) {
fprintf(stderr
, "C2: Sorry, input line too long\n");
} while ((c
= getchar()) != EOF
);
while ((c
= *p
++) >= '0' && c
<= '9')
register struct optab
*oper
;
while (t
= t
->forw
) switch (t
->op
) {
printf("L%d:", t
->labno
);
if ((byte
= t
->subop
) == BYTE
)
for (oper
= optab
; oper
->opstring
!=0; oper
++)
if ((oper
->opcode
&0377) == t
->op
&& (oper
->opcode
>>8) == t
->subop
) {
printf("%s", oper
->opstring
);
printf("\t%s\n", t
->code
);
} else if (t
->op
==JBR
|| t
->op
==CBR
)
printf("\tL%d\n", t
->labno
);
printf("L%d\n", t
->labno
);
printf("sob %s", t
->code
);
printf(",L%d", t
->labno
);
* Notice addresses of the form
* and replace them with (pc),xx(r)
* -- Thanx and a tip of the Hatlo hat to Bliss-11.
if (*--c1
!='(' || *--c2
!=',')
t
->code
= copy(2, "(pc)", c2s
);
register struct optab
*optp
, **ophp
;
for (optp
= optab
; p
= optp
->opstring
; optp
++) {
ophp
= &ophash
[(((p
[0]<<3)+(p
[1]<<1)+p
[2])&077777) % OPHS
];
if (ophp
> &ophash
[OPHS
])
register struct optab
*optp
;
for (lp
= line
; *lp
&& *lp
!=' ' && *lp
!='\t';)
while (*lp
=='\t' || *lp
==' ')
ophp
= &ophash
[(((tmpop
[0]<<3)+(tmpop
[1]<<1)+tmpop
[2])&077777) % OPHS
];
if (*lp
++=='b' && *lp
++==0 && *--np
==0)
return(optp
->opcode
+ (BYTE
<<8));
if (ophp
>= &ophash
[OPHS
])
if (*lp
<'0' || *lp
++>'9')
register struct node
*p
, *lp
;
static struct node
*labhash
[LABHS
];
register struct node
**hp
, *tp
;
for (hp
= labhash
; hp
< &labhash
[LABHS
];)
for (p
= first
.forw
; p
!=0; p
= p
->forw
)
labhash
[p
->labno
% LABHS
] = p
;
for (p
= first
.forw
; p
!=0; p
= p
->forw
) {
if (p
->op
==JBR
|| p
->op
==CBR
|| p
->op
==JSW
) {
lp
= labhash
[p
->labno
% LABHS
];
if (lp
==0 || p
->labno
!=lp
->labno
)
for (lp
= first
.forw
; lp
!=0; lp
= lp
->forw
) {
if (lp
->op
==LABEL
&& p
->labno
==lp
->labno
)
for (p
= first
.forw
; p
!=0; p
= p
->forw
)
if (p
->op
==LABEL
&& p
->refc
==0
&& (lp
= nonlab(p
))->op
&& lp
->op
!=JSW
)
register struct node
*p
, *rp
, *p1
;
for (p
= first
.forw
; p
!=0; p
= p
->forw
) {
if ((p
->op
==JBR
||p
->op
==CBR
||p
->op
==JSW
) && p
->ref
) {
if (rp
->op
==JBR
&& rp
->labno
&& p
->labno
!=rp
->labno
) {
if (p
->op
==CBR
&& (p1
= p
->forw
)->op
==JBR
) {
p
->subop
= revbr
[p
->subop
];
if (p
->op
==JBR
|| p
->op
==JMP
) {
while (p
->forw
&& p
->forw
->op
!=LABEL
&& p
->forw
->op
!=EROU
&& p
->forw
->op
!=END
&& p
->forw
->op
!=0 && p
->forw
->op
!=DATA
) {
while (rp
&& rp
->op
==LABEL
) {
if (p
->op
==JBR
|| p
->op
==JMP
) {
register struct node
*p1
;
register struct node
*p2
, *p3
;
while ((p1
= p1
->back
) && p1
->op
==LABEL
);
while ((p2
= p2
->back
) && p2
->op
==LABEL
);
if (!equop(p1
, p2
) || p1
==p2
)
register struct node
*oldp
;
register struct node
*lp
;
if (oldp
->back
->op
== LABEL
) {
lp
= (struct node
*)alloc(sizeof first
);
register struct node
*p1
, *p2
, *p3
;
if (p1
->op
!=JBR
|| (p2
= p1
->ref
)==0)
if ((p2
= p2
->back
) == 0)
if (p2
->op
!=JBR
&& p2
->op
!=JMP
)
if (p3
->op
==JBR
|| p3
->op
==JMP
) {
p2
->back
->forw
= p3
->forw
;
p3
->forw
->back
= p2
->back
;
if ((p3
= p3
->forw
) == 0 || p3
==p1
|| --n
==0)
} while (p3
->op
!=CBR
|| p3
->labno
!=p1
->forw
->labno
);
if ((p1
= p1
->back
) == 0)
p3
->subop
= revbr
[p3
->subop
];
register struct node
*p1
, *p2
, *p3
;
for (p1
= first
.forw
; p1
!=0; p1
= p1
->forw
)
if (p1
->op
==JBR
&& (p2
= p1
->ref
) && p2
->refc
> 1)
for (p3
= p1
->forw
; p3
!=0; p3
= p3
->forw
)
if (p3
->op
==JBR
&& p3
->ref
== p2
)
register struct node
*p1
, *p2
, *p3
;
while ((p1
= p1
->back
) && p1
->op
==LABEL
);
p2
->back
->forw
= p2
->forw
;
p2
->forw
->back
= p2
->back
;