|
|
1.1 ! root 1: /* ! 2: * C compiler. ! 3: * Code driver (sel, out) ! 4: */ ! 5: #ifdef vax ! 6: #include "INC$LIB:cc1.h" ! 7: #else ! 8: #include "cc1.h" ! 9: #endif ! 10: ! 11: PREGSET curbusy; ! 12: PREGSET curxreg; ! 13: PREGSET maxbusy; ! 14: int nstorelist; ! 15: TREE *storelist[NSTORE]; ! 16: ! 17: /* ! 18: * Generate code for an ! 19: * expression. The argument `tp' is ! 20: * a pointer to a marked tree. ! 21: * The context is `c'. If `c' is MFLOW ! 22: * then `r' is a truth sense and `n' ! 23: * is a label. ! 24: */ ! 25: code(tp, c, s, n) ! 26: TREE *tp; ! 27: register s; ! 28: { ! 29: register TREE *ap; ! 30: ! 31: ap = tp; ! 32: walk(ap, amd); ! 33: #if !TINY ! 34: if (sflag) snapf("%W%E", "Before select", ap); ! 35: #endif ! 36: if (c != MFLOW) { ! 37: s = ANYR; ! 38: if (c == MSWITCH) { ! 39: s = SWREG; ! 40: c = MRVALUE; ! 41: } ! 42: if (c == MRETURN) { ! 43: s = pertype[ap->t_type].p_frreg; ! 44: c = pertype[ap->t_type].p_frcxt; ! 45: } ! 46: } ! 47: curtemp = maxauto; ! 48: curbusy = regbusy; ! 49: curxreg = 0; ! 50: nstorelist = 0; ! 51: if (code1(&tp, c, s) != 0) { ! 52: ap = tp; ! 53: #if !TINY ! 54: if (sflag) snapf("%W%E%W", "After select", ap, NULL); ! 55: #endif ! 56: output(ap, c, s, n); ! 57: } else ! 58: nomatch(tp); ! 59: } ! 60: ! 61: nomatch(tp) ! 62: TREE *tp; ! 63: { ! 64: #if !TINY ! 65: snapf("%W%E%W", "No match", tp, NULL); ! 66: if (! sflag) ! 67: #endif ! 68: cbotch("no match, op=%d", tp->t_op); ! 69: } ! 70: ! 71: /* ! 72: * Select the node pointed to by tpp ! 73: * and any stores generated by its selection. ! 74: * Prepend the store nodes onto tpp with ! 75: * COMMA's and store the result node into tpp. ! 76: * This routine makes side effects happen ! 77: * in the right places. ! 78: * A failure to select is fatal. ! 79: */ ! 80: code1(tpp, c, r) ! 81: TREE **tpp; ! 82: { ! 83: register TREE *ap; ! 84: int match; ! 85: PREGSET savbusy; ! 86: PREGSET savxreg; ! 87: int savstor; ! 88: ! 89: ap = *tpp; ! 90: match = 1; ! 91: savbusy = curbusy; ! 92: savxreg = curxreg; ! 93: savstor = nstorelist; ! 94: ! 95: #if !TINY ! 96: if (sflag > 1) snapf("%W%E", "Before code1", ap); ! 97: #endif ! 98: if (select(ap, c, r) == 0) { ! 99: /* nomatch(ap); */ ! 100: match = 0; ! 101: } ! 102: ! 103: if (savstor < nstorelist) { ! 104: register int i; ! 105: PREGSET used; ! 106: REGNAME rreg; ! 107: int type; ! 108: int size; ! 109: ! 110: used = ap->t_used; ! 111: rreg = ap->t_rreg; ! 112: type = ap->t_type; ! 113: size = ap->t_size; ! 114: for (i = savstor; i < nstorelist; i += 1) { ! 115: curbusy = savbusy; ! 116: curxreg = 0; ! 117: ap = storelist[i]; ! 118: if (select(ap, MEFFECT, ANYR) == 0) { ! 119: /* nomatch(ap); */ ! 120: match = 0; ! 121: } ! 122: #if !TINY ! 123: if (sflag > 2) ! 124: snapf("%W%E%W", "Stored node", ap, NULL); ! 125: #endif ! 126: used |= ap->t_used; ! 127: ap = leftnode(COMMA, ap, type, size); ! 128: ap->t_used = used; ! 129: ap->t_rreg = rreg; ! 130: ap->t_rp = *tpp; ! 131: *tpp = ap; ! 132: } ! 133: } ! 134: if (curtemp > maxtemp) ! 135: maxtemp = curtemp; ! 136: maxbusy |= ap->t_used; ! 137: curbusy = savbusy; ! 138: curxreg = savxreg; ! 139: nstorelist = savstor; ! 140: return (match); ! 141: } ! 142: ! 143:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.