/* XXX should this go away now? */ int shtemp(NODE *p) { return 0; #if 0 int r; if (p->n_op == STARG ) p = p->n_left; switch (p->n_op) { case REG: return (!istreg(p->n_rval)); case OREG: r = p->n_rval; if (R2TEST(r)) { if (istreg(R2UPK1(r))) return(0); r = R2UPK2(r); } return (!istreg(r)); case UMUL: p = p->n_left; return (p->n_op != UMUL && shtemp(p)); } if (optype(p->n_op) != LTYPE) return(0); return(1); #endif }
int base(register NODE *p) { register int o = p->op; if( (o==ICON && p->name[0] != '\0')) return( 100 ); /* ie no base reg */ if( o==REG ) return( p->rval ); if( (o==PLUS || o==MINUS) && p->left->op == REG && p->right->op==ICON) return( p->left->rval ); if( o==OREG && !R2TEST(p->rval) && (p->type==INT || p->type==UNSIGNED || ISPTR(p->type)) ) return( p->rval + 0200*1 ); if( o==INCR && p->left->op==REG ) return( p->left->rval + 0200*2 ); if( o==ASG MINUS && p->left->op==REG) return( p->left->rval + 0200*4 ); if( o==UNARY MUL && p->left->op==INCR && p->left->left->op==REG && (p->type==INT || p->type==UNSIGNED || ISPTR(p->type)) ) return( p->left->left->rval + 0200*(1+2) ); return( -1 ); }
void adrput(FILE *io, NODE *p) { int r; /* output an address, with offsets, from p */ switch (p->n_op) { case NAME: if (getlval(p)) fprintf(io, CONFMT "%s", getlval(p), *p->n_name ? "+" : ""); if (p->n_name[0]) printf("%s", p->n_name); else comperr("adrput"); return; case OREG: r = p->n_rval; if (getlval(p)) fprintf(io, CONFMT "%s", getlval(p), *p->n_name ? "+" : ""); if (p->n_name[0]) printf("%s", p->n_name); if (R2TEST(r)) { int r1 = R2UPK1(r); int r2 = R2UPK2(r); int sh = R2UPK3(r); fprintf(io, "(%s,%s,%d)", r1 == MAXREGS ? "" : rnames[r1], r2 == MAXREGS ? "" : rnames[r2], sh); } else fprintf(io, "(%s)", rnames[p->n_rval]); return; case ICON: /* addressable value of the constant */ if (p->n_type == LONGLONG || p->n_type == ULONGLONG) { fprintf(io, "#" CONFMT, getlval(p) >> 32); } else {
/* * return true if shape is appropriate for the node p * * Return values: * SRNOPE Cannot match this shape. * SRDIR Direct match, may or may not traverse down. * SRREG Will match if put in a regster XXX - kill this? */ int tshape(NODE *p, int shape) { int o, mask; o = p->n_op; #ifdef PCC_DEBUG if (s2debug) printf("tshape(%p, %s) op = %s\n", p, prcook(shape), opst[o]); #endif if (shape & SPECIAL) { switch (shape) { case SZERO: case SONE: case SMONE: case SSCON: case SCCON: if (o != ICON || p->n_name[0]) return SRNOPE; if (getlval(p)== 0 && shape == SZERO) return SRDIR; if (getlval(p) == 1 && shape == SONE) return SRDIR; if (getlval(p) == -1 && shape == SMONE) return SRDIR; if (getlval(p) > -257 && getlval(p) < 256 && shape == SCCON) return SRDIR; if (getlval(p) > -32769 && getlval(p) < 32768 && shape == SSCON) return SRDIR; return SRNOPE; case SSOREG: /* non-indexed OREG */ if (o == OREG && !R2TEST(p->n_rval)) return SRDIR; return SRNOPE; default: return (special(p, shape)); } } if (shape & SANY) return SRDIR; if ((shape&INTEMP) && shtemp(p)) /* XXX remove? */ return SRDIR; if ((shape&SWADD) && (o==NAME||o==OREG)) if (BYTEOFF(getlval(p))) return SRNOPE; switch (o) { case NAME: if (shape & SNAME) return SRDIR; break; case ICON: case FCON: if (shape & SCON) return SRDIR; break; case FLD: if (shape & SFLD) return flshape(p->n_left); break; case CCODES: if (shape & SCC) return SRDIR; break; case REG: case TEMP: mask = PCLASS(p); if (shape & mask) return SRDIR; break; case OREG: if (shape & SOREG) return SRDIR; break; case UMUL: #if 0 if (shumul(p->n_left) & shape) return SROREG; /* Calls offstar to traverse down */ break; #else return shumul(p->n_left, shape); #endif } return SRNOPE; }