/* * Do the actual conversion of offstar-found OREGs into real OREGs. */ void myormake(NODE *p) { NODE *q = p->n_left; if (x2debug) { printf("myormake(%p)\n", p); fwalk(p, e2print, 0); } if (inctree(q)) { if (q->n_left->n_left->n_op == TEMP) return; p->n_op = OREG; p->n_lval = 0; /* Add support for index offset */ p->n_rval = R2PACK(regno(q->n_left->n_left), 0, 1); tfree(q); return; } if (q->n_op != OREG) return; p->n_op = OREG; p->n_lval = q->n_lval; p->n_rval = R2PACK(q->n_rval, 0, 0); nfree(q); }
/* * Do the actual conversion of offstar-found OREGs into real OREGs. * For simple OREGs conversion should already be done. */ void myormake(NODE *q) { static int shtbl[] = { 1,2,4,8 }; NODE *p, *r; CONSZ c = 0; int r1, r2, sh; int mkconv = 0; char *n = ""; #define risreg(p) (p->n_op == REG) if (x2debug) { printf("myormake(%p)\n", q); fwalk(q, e2print, 0); } r1 = r2 = MAXREGS; sh = 1; r = p = q->n_left; if ((p->n_op == PLUS || p->n_op == MINUS) && p->n_left->n_op == ICON) { c = p->n_left->n_lval; n = p->n_left->n_name; p = p->n_right; } if (p->n_op == PLUS && risreg(p->n_left)) { r1 = regno(p->n_left); p = p->n_right; } if (findls(p, 1)) { if (p->n_op == SCONV) p = p->n_left; sh = shtbl[(int)p->n_right->n_lval]; r2 = regno(p->n_left); mkconv = 1; } else if (risreg(p)) { r2 = regno(p); mkconv = 1; } //else // comperr("bad myormake tree"); if (mkconv == 0) return; q->n_op = OREG; q->n_lval = c; q->n_rval = R2PACK(r1, r2, sh); q->n_name = n; tfree(r); if (x2debug) { printf("myormake converted %p\n", q); fwalk(q, e2print, 0); } }
/* * Do the actual conversion of offstar-found OREGs into real OREGs. */ void myormake(NODE *q) { NODE *p, *r; if (x2debug) printf("myormake(%p)\n", q); p = q->n_left; if (p->n_op == PLUS && (r = p->n_right)->n_op == LS && r->n_right->n_op == ICON && getlval(r->n_right) == 2 && p->n_left->n_op == REG && r->n_left->n_op == REG) { q->n_op = OREG; setlval(q, 0); q->n_rval = R2PACK(p->n_left->n_rval, r->n_left->n_rval, 0); tfree(p); } }