* C object code improver-- second part
for (p
=first
.forw
; p
!=0; p
= p
->forw
) {
if ((r
= findrand(regs
[RT1
], flt
)) >= 0) {
if (r
== flt
+isreg(regs
[RT2
]) && p
->forw
->op
!=CBR
if (equstr(regs
[RT1
], "$0")) {
strcpy(regs
[RT1
], regs
[RT2
]);
p
->code
= copy(1, regs
[RT1
]);
savereg(r1
+flt
, regs
[r
+flt
]);
savereg(r
+flt
, regs
[RT2
]);
savereg(r1
+flt
, regs
[RT1
]);
setcon(regs
[RT1
], regs
[RT2
]);
if (p
->op
==BIC
&& (equstr(regs
[RT1
], "$-1") || equstr(regs
[RT1
], "$177777"))) {
strcpy(regs
[RT1
], regs
[RT2
]);
p
->code
= copy(1, regs
[RT1
]);
if ((p
->op
==BIC
|| p
->op
==BIS
) && equstr(regs
[RT1
], "$0")) {
if (p
->op
==DIV
&& (r
= isreg(regs
[RT2
])>=0))
if (p
->op
==CLR
&& flt
==0)
if ((r
= isreg(regs
[RT1
])) >= 0)
if (equstr(regs
[RT1
], ccloc
)) {
if (equstr(regs
[RT1
], "$-1") || equstr(regs
[RT1
], "$177777")) {
strcpy(regs
[RT1
], regs
[RT2
]);
p
->code
= copy(1, regs
[RT1
]);
} else if (equstr(regs
[RT2
], "$-1") || equstr(regs
[RT2
], "$177777")) {
p
->code
= copy(1, regs
[RT1
]);
if (equstr(regs
[RT1
], "$0")) {
p
->code
= copy(1, regs
[RT1
]);
} else if (equstr(regs
[RT2
], "$0")) {
strcpy(regs
[RT1
], regs
[RT2
]);
p
->code
= copy(1, regs
[RT1
]);
if (p
->back
->op
==TST
|| p
->back
->op
==CMP
) {
r
= compare(p
->subop
, findcon(RT1
), findcon(RT2
));
p
->back
->back
->forw
= p
->forw
;
p
->forw
->back
= p
->back
->back
;
register struct node
*p
, *p1
;
register struct node
*tp
;
for (p
=first
.forw
; p
!=0; p
= p
->forw
)
for (p
=first
.forw
; p
!=0; p
= p1
) {
if (p
->op
== CBR
&& p1
->op
==JBR
&& p
->ref
&& p1
->ref
&& abs(p
->refc
- p
->ref
->refc
) > abs(p1
->refc
- p1
->ref
->refc
)) {
p
->subop
= revbr
[p
->subop
];
register struct node
*p
, *p1
;
for (p
= &first
; (p1
= p
->forw
)!=0; p
= p1
) {
if (p
->op
==DEC
&& isreg(p
->code
)>=0
&& p1
->op
==CBR
&& p1
->subop
==JNE
) {
if (p
->refc
< p1
->ref
->refc
)
register struct node
*p1
;
for (p1
= p
->ref
; p1
&& p1
!=p
; p1
= p1
->forw
)
return(2 + adrlen(regs
[RT1
]) + adrlen(regs
[RT2
]));
if (*s
=='(' && *(s
+1)=='r')
if (*s
=='-' && *(s
+1)=='(')
register char *cp1
, *cp2
;
register struct node
*p1
;
if (p1
->op
!=p2
->op
|| p1
->subop
!=p2
->subop
)
if (p1
->op
>0 && p1
->op
<MOV
)
while (p
&& p
->op
==LABEL
)
if (sbrk(2000) == (char *)-1) {
fprintf(stderr
, "C Optimizer: out of space\n");
register char *p
, *s
, *sp
;
if (s
[0]=='(' && s
[1]=='r' && s
[2]<'5') {
for (i
=0; i
<NREG
+NREG
; i
++)
if (*regs
[i
]=='*' && equstr(s
, regs
[i
]+1))
while ((i
= findrand(s
, flt
)) >= 0)
if ((*s
=='(' && (*(s
+1)!='r' || *(s
+2)!='5')) || *s
++=='*') {
for (i
=0; i
<NREG
+NREG
; i
++) {
for (i
= flt
; i
<NREG
+flt
; i
++) {
if (s
[0]=='r' && s
[1]>='0' && s
[1]<='4' && s
[2]==0)
register struct node
*p
, *lp
;
for (p
=first
.forw
; p
!=0; p
= p
->forw
) {
if (*p1
=='-' && *(p1
+1)=='('
|| *p1
=='*' && *(p1
+1)=='-' && *(p1
+2)=='('
while (*p1
&& *p1
++!='r');
if (*p1
>='0' && *p1
<='4')
static char rt1
[50], rt2
[50];
r1
= findrand(regs
[RT2
], flt
);
r
= findrand(regs
[RT1
], flt
);
for (p1
= rt1
; *p1
++ = *p2
++;);
for (p2
= regs
[RT2
]; *p1
++ = *p2
++;);
p
->code
= copy(2, rt1
, rt2
);
register struct node
*p1
, *p2
;
if (lastseg
!= TEXT
&& lastseg
!= -1) {
p1
= (struct node
*)alloc(sizeof(first
));
for (p1
= first
.forw
; p1
!=0; p1
= p1
->forw
) {
while (p2
&& p2
->op
!=TEXT
)
p1
->back
->forw
= p2
->forw
;
data
.forw
->back
= &first
;
for (p1
= first
.forw
; p1
!=0; p1
= p1
->forw
) {
if (p1
->op
==TEXT
||p1
->op
==DATA
||p1
->op
==BSS
) {
if (p2
->op
==TEXT
||p2
->op
==DATA
||p2
->op
==BSS
)
if (p1
->op
== seg
|| p1
->forw
&&p1
->forw
->op
==seg
) {
p1
->back
->forw
= p1
->forw
;
p1
->forw
->back
= p1
->back
;
register struct node
*p1
;
if (compare(p1
->subop
, ap1
, ap2
)>0) {
register char *cp1
, *cp2
;
register unsigned n1
, n2
;
if (*cp1
++ != '$' || *cp2
++ != '$')
while (*cp2
>= '0' && *cp2
<= '7') {
while (*cp1
>= '0' && *cp1
<= '7') {
return((int)n1
<= (int)n2
);
return((int)n1
>= (int)n2
);
return((int)n1
< (int)n2
);
return((int)n1
> (int)n2
);
register char *cl
, *cv
, *p
;
if (*p
=='*' || *p
=='(' || *p
=='-'&&*(p
+1)=='(')
if (*--p
== '+' || *p
==')' && *--p
!= '5')