|
|
1.1 ! root 1: #include <u.h> ! 2: #include <libc.h> ! 3: #include <bio.h> ! 4: #include <ctype.h> ! 5: #define Extern extern ! 6: #include "parl.h" ! 7: #include "globl.h" ! 8: ! 9: int regmap[65]; ! 10: ! 11: void ! 12: reginit(void) ! 13: { ! 14: regmap[Retfreg]++; ! 15: regmap[Retireg]++; ! 16: regmap[Reglink]++; ! 17: regmap[Regtmp]++; ! 18: ! 19: privreg = Pregs; ! 20: } ! 21: ! 22: void ! 23: regcheck(void) ! 24: { ! 25: int r, e; ! 26: ! 27: e = 0; ! 28: for(r = Ireg; r < Maxireg; r++) ! 29: if(regmap[r]) { ! 30: switch(r) { ! 31: default: ! 32: print("R%d still used\n", r); ! 33: e++; ! 34: break; ! 35: case Retfreg: ! 36: case Retireg: ! 37: case Reglink: ! 38: case Regtmp: ! 39: break; ! 40: } ! 41: } ! 42: ! 43: for(r = Freg; r < Maxfreg; r++) ! 44: if(regmap[r] && (r != Retfreg || regmap[Retfreg] != 1)) { ! 45: print("F%d still used\n", r); ! 46: e++; ! 47: } ! 48: if(e) ! 49: fatal("regcheck %P", curfunc); ! 50: } ! 51: ! 52: void ! 53: reg(Node *n, Type *t, Node *use) ! 54: { ! 55: int r, j; ! 56: static int ireg; ! 57: ! 58: switch(t->type) { ! 59: default: ! 60: fatal("reg: bad type %T", t); ! 61: ! 62: case TINT: ! 63: case TUINT: ! 64: case TSINT: ! 65: case TSUINT: ! 66: case TCHAR: ! 67: case TIND: ! 68: case TCHANNEL: ! 69: if(use && use->type == OREGISTER && use->reg < Freg) { ! 70: r = use->reg; ! 71: break; ! 72: } ! 73: j = ireg+Ireg; ! 74: for(r = Ireg; r < Maxireg; r++) { ! 75: if(j >= Maxireg) ! 76: j = Ireg; ! 77: if(regmap[j] == 0) { ! 78: r = j; ! 79: break; ! 80: } ! 81: j++; ! 82: } ! 83: if(r >= Maxireg) ! 84: fatal("No int registers"); ! 85: break; ! 86: ! 87: case TFLOAT: ! 88: if(use && use->type == OREGISTER && use->reg >= Freg) { ! 89: r = use->reg; ! 90: break; ! 91: } ! 92: ! 93: j = ireg*2+Freg; ! 94: for(r = Freg; r < Maxfreg; r += 2) { ! 95: if(j >= Maxfreg) ! 96: j = Ireg; ! 97: if(regmap[j] == 0) { ! 98: r = j; ! 99: break; ! 100: } ! 101: j += 2; ! 102: } ! 103: if(r >= Maxfreg) ! 104: fatal("No float registers"); ! 105: break; ! 106: } ! 107: ireg++; ! 108: if(ireg > 5) ! 109: ireg = 0; ! 110: regmap[r]++; ! 111: n->reg = r; ! 112: n->type = OREGISTER; ! 113: n->islval = 11; ! 114: n->sun = 0; ! 115: n->t = t; ! 116: } ! 117: ! 118: Node* ! 119: regtmp(void) ! 120: { ! 121: Node *n; ! 122: int r; ! 123: ! 124: n = an(OREGISTER, ZeroN, ZeroN); ! 125: n->t = builtype[TINT]; ! 126: n->islval = 11; ! 127: n->sun = 0; ! 128: ! 129: for(r = Ireg; r < Maxireg; r++) ! 130: if(regmap[r] == 0) { ! 131: n->reg = r; ! 132: regmap[r]++; ! 133: return n; ! 134: } ! 135: fatal("No int registers"); ! 136: return ZeroN; ! 137: } ! 138: ! 139: Node* ! 140: regn(int nr) ! 141: { ! 142: Node *n; ! 143: ! 144: n = an(OREGISTER, ZeroN, ZeroN); ! 145: if(nr >= Freg) ! 146: n->t = builtype[TFLOAT]; ! 147: else ! 148: n->t = builtype[TINT]; ! 149: n->islval = 11; ! 150: n->sun = 0; ! 151: n->reg = nr; ! 152: return n; ! 153: } ! 154: ! 155: void ! 156: regret(Node *n, Type*t) ! 157: { ! 158: int r; ! 159: ! 160: switch(t->type) { ! 161: default: ! 162: fatal("regret: bad type %T", t); ! 163: ! 164: case TINT: ! 165: case TUINT: ! 166: case TSINT: ! 167: case TSUINT: ! 168: case TCHAR: ! 169: case TIND: ! 170: case TCHANNEL: ! 171: r = Retireg; ! 172: break; ! 173: ! 174: case TFLOAT: ! 175: r = Retfreg; ! 176: break; ! 177: } ! 178: regmap[r]++; ! 179: n->reg = r; ! 180: n->type = OREGISTER; ! 181: n->t = t; ! 182: } ! 183: ! 184: void ! 185: regfree(Node *n) ! 186: { ! 187: if(regmap[n->reg] <= 0) ! 188: fatal("regfree"); ! 189: ! 190: regmap[n->reg]--; ! 191: } ! 192: ! 193: /* ! 194: * look for a constant which fits in a sparc immediate ! 195: */ ! 196: int ! 197: immed(Node *n) ! 198: { ! 199: long ival; ! 200: ! 201: if(n->type != OCONST || n->t->type == TFLOAT) ! 202: return 0; ! 203: ! 204: ival = n->ival; ! 205: if(ival >= -(1<<12) && ival < (1<<12)) ! 206: return 1; ! 207: ! 208: return 0; ! 209: } ! 210: ! 211: /* ! 212: * Return the name of an activation argument ! 213: */ ! 214: Node* ! 215: atvnode(Type *t) ! 216: { ! 217: int o; ! 218: Node *n; ! 219: ! 220: n = an(OREGISTER, ZeroN, ZeroN); ! 221: n->reg = ratv.reg; ! 222: n->ival = 0; ! 223: n->t = at(TIND, t); ! 224: ! 225: o = align(ratv.ival, builtype[TINT]); ! 226: ratv.ival = o+t->size; ! 227: if(ratv.ival > maxframe) ! 228: maxframe = ratv.ival; ! 229: ! 230: /* Adjust offset within int for smaller types */ ! 231: switch(t->type) { ! 232: case TSINT: ! 233: case TSUINT: ! 234: o += Shortfoff; ! 235: break; ! 236: ! 237: case TCHAR: ! 238: o += Charfoff; ! 239: break; ! 240: } ! 241: ! 242: n = an(OADD, n, con(o)); ! 243: n->t = n->left->t; ! 244: n = an(OIND, n, ZeroN); ! 245: n->t = t; ! 246: ! 247: sucalc(n); ! 248: return n; ! 249: } ! 250: ! 251: /* ! 252: * Make a node to alias an argument ! 253: */ ! 254: Node* ! 255: argnode(Type *t) ! 256: { ! 257: Node *n; ! 258: int o; ! 259: ! 260: if(atv) ! 261: return atvnode(t); ! 262: ! 263: n = an(ONAME, ZeroN, ZeroN); ! 264: n->t = t; ! 265: n->ti = ati(t, Argument); ! 266: args = align(args, builtype[TINT]); ! 267: o = args; ! 268: ! 269: /* Adjust offset within int for smaller types */ ! 270: switch(t->type) { ! 271: case TSINT: ! 272: case TSUINT: ! 273: o += Shortfoff; ! 274: break; ! 275: ! 276: case TCHAR: ! 277: o += Charfoff; ! 278: break; ! 279: } ! 280: ! 281: n->ti->offset = o; ! 282: args += t->size; ! 283: ! 284: sucalc(n); ! 285: return n; ! 286: } ! 287: ! 288: Node* ! 289: paramnode(Type *t) ! 290: { ! 291: Node *n; ! 292: ! 293: USED(t); ! 294: ! 295: while(tip->class != Parameter) ! 296: tip = tip->dcllist; ! 297: ! 298: n = an(ONAME, ZeroN, ZeroN); ! 299: n->sym = tip->s; ! 300: n->ti = tip; ! 301: n->t = tip->t; ! 302: ! 303: /* for next time */ ! 304: tip = tip->dcllist; ! 305: ! 306: sucalc(n); ! 307: return n; ! 308: } ! 309: ! 310: /* ! 311: * Make a stack temporary node and allocate space in the frame ! 312: */ ! 313: Node* ! 314: stknode(Type *o) ! 315: { ! 316: Node *n; ! 317: char buf[10]; ! 318: ! 319: n = an(ONAME, ZeroN, ZeroN); ! 320: n->sym = malloc(sizeof(Sym)); ! 321: n->ti = ati(o, Automatic); ! 322: n->t = o; ! 323: ! 324: sprint(buf, ".t%d", stmp++); ! 325: n->sym->name = strdup(buf); ! 326: ! 327: /* Allocate the space */ ! 328: frame = align(frame, o); ! 329: frame += o->size; ! 330: ! 331: n->ti->offset = -frame; ! 332: sucalc(n); ! 333: return n; ! 334: } ! 335: ! 336: Node* ! 337: internnode(Type *o) ! 338: { ! 339: Node *n; ! 340: char buf[10]; ! 341: ! 342: n = an(ONAME, ZeroN, ZeroN); ! 343: n->sym = malloc(sizeof(Sym)); ! 344: n->t = at(o->type, 0); ! 345: n->t->class = Internal; ! 346: n->ti = ati(n->t, Internal); ! 347: ! 348: sprint(buf, ".i%d", stmp++); ! 349: n->sym->name = strdup(buf); ! 350: ! 351: n->ti->offset = 0; ! 352: sucalc(n); ! 353: ! 354: n->init = ZeroN; ! 355: gendata(n); ! 356: ! 357: return n; ! 358: } ! 359: ! 360: Node* ! 361: con(int i) ! 362: { ! 363: Node *c; ! 364: ! 365: c = an(OCONST, ZeroN, ZeroN); ! 366: c->t = builtype[TINT]; ! 367: c->ival = i; ! 368: ! 369: return c; ! 370: } ! 371: ! 372: Node* ! 373: conf(double d) ! 374: { ! 375: Node *c; ! 376: ! 377: c = an(OCONST, ZeroN, ZeroN); ! 378: c->t = builtype[TFLOAT]; ! 379: c->fval = d; ! 380: ! 381: return c; ! 382: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.