--- cci/usr/src/lib/fc2/c21.c 2019/07/28 12:24:19 1.1 +++ cci/usr/src/lib/fc2/c21.c 2019/07/28 12:24:41 1.1.1.2 @@ -120,7 +120,8 @@ bmove() { p->code=copy(buf); p->op = MOVA; p->subop = BYTE; p->pop=0; } else #endif MOVAFASTER - if (*cp1++=='-' && 0<=(r=getnum(cp1))) { + if (*cp1++=='-' && 0==(r=getnum(cp1)) && + !checkexpr(cp1)) { p->op=ADD; p->pop=0; *--cp1='$'; p->code=cp1; } goto std; case ADD: @@ -162,7 +163,8 @@ bmove() { p->op = MOVA; p->subop = BYTE; p->pop=0; } else #endif MOVAFASTER - if (*cp1++=='-' && 0<=(r=getnum(cp1))) { + if (*cp1++=='-' && 0==(r=getnum(cp1)) && + !checkexpr(cp1)) { p->op=SUB; p->pop=0; *--cp1='$'; p->code=cp1; } /* fall thru ... */ @@ -510,7 +512,9 @@ ashadd: if(useacc == 0) useacc = p; goto std; - case TSTF: case PUSHD: + case TSTF: + break; + case PUSHD: if(ldmov(p)) { p = p->forw; break; @@ -901,6 +905,7 @@ register struct node *q; if(p->op == LDF) { if((s = dlsw(p->code)) == NULL) return(0); + strcpy(line, s); if(q->op == STF) { strcat(line, ","); @@ -950,12 +955,14 @@ char * dlsw(d) register char *d; { - register char *s, *t; + register char *s, *t, *c; register int r; static char lsw[C2_ASIZE]; if(d[0] == '*' || d[0] == '$') return(NULL); + if (((strncmp(d, "(r", 2)) == 0) && isdigit(d[2])) + return(NULL); t = lsw; if((r=isreg(d)) >= 0) sprintf(t, "r%d", r+1); @@ -965,8 +972,21 @@ dlsw(d) return(NULL); *t++ = '+'; *t++ = '4'; while(*t++ = *s) - if(*s++ == '[') + if(*s++ == '[' ) + { return(NULL); + } } return(lsw); } +checkexpr(p) +register char *p; +{ + + while(*p && *p != ','){ + if ((*p == '+' ) || (*p == '-')) + return(1); + *p++; + } + return(0); +}