|
|
1.1 ! root 1: typedef long Type; ! 2: ! 3: /* ! 4: * Little-endian byte and bit order of bbc.h. ! 5: * See comment there for general explanation. ! 6: * Differences: 'left' and 'right' shifts in the abstract ! 7: * machine are in screen direction, so turn into right and left shifts her; ! 8: * any 'offset' arguments are here taken to mean offset from the low order ! 9: * end of the word. ! 10: */ ! 11: enum ! 12: { ! 13: field, /* arg = field mask */ ! 14: lsha_RsRt, ! 15: lshb_RsRt, ! 16: lsh_RsRd, /* arg = shift amount */ ! 17: lsh_RtRt, /* arg = shift amount */ ! 18: lsha_RtRt, ! 19: lsha_RtRu, ! 20: lshb_RtRu, ! 21: rsha_RsRt, ! 22: rshb_RsRt, ! 23: rsha_RtRu, ! 24: rshb_RtRu, ! 25: orlsha_RsRt, ! 26: orlshb_RsRt, ! 27: orlsh_RsRd, /* arg = shift amount */ ! 28: orrsha_RsRt, ! 29: orrshb_RsRt, ! 30: orrsha_RtRu, ! 31: orrshb_RtRu, ! 32: or_RsRd, ! 33: add_As, /* arg = add amount */ ! 34: add_Ad, /* arg = add amount */ ! 35: initsd, /* arg1 = value for As; arg2 = value for Ad */ ! 36: ilabel, /* arg = inner loop count value for Ri */ ! 37: olabel, /* arg = outer loop count value for Ro */ ! 38: iloop, /* arg = pointer to beginning of inner loop */ ! 39: oloop, /* arg = pointer to beginning of outer loop */ ! 40: rts, ! 41: load_Rd_P, ! 42: load_Rs_P, ! 43: load_Rt_P, ! 44: load_Ru_P, ! 45: load_Rd_D, ! 46: load_Rs_D, ! 47: load_Rt_D, ! 48: load_Rd, ! 49: load_Rs, ! 50: load_Rt, ! 51: fetch_Rd_P, ! 52: fetch_Rd_D, ! 53: fetch_Rd, ! 54: store_Rs_P, ! 55: store_Rs_D, ! 56: store_Rs, ! 57: inittab, /* arg1 = table addr; arg2 = entry size (bytes) */ ! 58: initsh, /* arg1 = shift amount a, arg2 = shift amount b */ ! 59: table_RdRt, /* arg1 = offset, arg2 = nbits */ ! 60: table_RsRt, /* arg1 = offset, arg2 = nbits */ ! 61: assemble, /* arg1 = offset, arg2 = nbits */ ! 62: Ozero, ! 63: ODnorS, ! 64: ODandnotS, ! 65: OnotS, ! 66: OnotDandS, ! 67: OnotD, ! 68: ODxorS, ! 69: ODnandS, ! 70: ODandS, ! 71: ODxnorS, ! 72: OD, ! 73: ODornotS, ! 74: OnotDorS, ! 75: ODorS, ! 76: OF, ! 77: }; ! 78: ! 79: #define Ofield(c) *p++ = field; *p++ = (c) ! 80: #define Olsha_RsRt *p++ = lsha_RsRt ! 81: #define Olshb_RsRt *p++ = lshb_RsRt ! 82: #define Olsh_RsRd(c) *p++ = lsh_RsRd; *p++ = (c) ! 83: #define Olsh_RtRt(c) *p++ = lsh_RtRt; *p++ = (c) ! 84: #define Olsha_RtRt *p++ = lsha_RtRt ! 85: #define Olsha_RtRu *p++ = lsha_RtRu ! 86: #define Olshb_RtRu *p++ = lshb_RtRu ! 87: #define Orsha_RsRt *p++ = rsha_RsRt ! 88: #define Orshb_RsRt *p++ = rshb_RsRt ! 89: #define Orsha_RtRu *p++ = rsha_RtRu ! 90: #define Orshb_RtRu *p++ = rshb_RtRu ! 91: #define Oorlsha_RsRt *p++ = orlsha_RsRt ! 92: #define Oorlshb_RsRt *p++ = orlshb_RsRt ! 93: #define Oorlsh_RsRd(c) *p++ = orlsh_RsRd; *p++ = (c) ! 94: #define Oorrsha_RsRt *p++ = orrsha_RsRt ! 95: #define Oorrshb_RsRt *p++ = orrshb_RsRt ! 96: #define Oorrsha_RtRu *p++ = orrsha_RtRu ! 97: #define Oorrshb_RtRu *p++ = orrshb_RtRu ! 98: #define Oor_RsRd *p++ = or_RsRd ! 99: #define Add_As(c) *p++ = add_As; *p++ = (c) ! 100: #define Add_Ad(c) *p++ = add_Ad; *p++ = (c) ! 101: #define Initsd(s,d) *p++ = initsd; *p++ = ((ulong)(s)); *p++ = ((ulong)(d)) ! 102: #define Initsh(a,b) *p++ = initsh; *p++ = (a); *p++ = (b) ! 103: #define Extrainit ! 104: #define Ilabel(c) *p++ = ilabel; *p++ = (c) ! 105: #define Olabel(c) *p++ = olabel; *p++ = (c) ! 106: #define Iloop(lp) *p++ = iloop; *p++ = ((ulong)(lp)) ! 107: #define Oloop(lp) *p++ = oloop; *p++ = ((ulong)(lp)) ! 108: #define Orts *p++ = rts ! 109: #define Load_Rs_P *p++ = load_Rs_P ! 110: #define Load_Rt_P *p++ = load_Rt_P ! 111: #define Loadzx_Rt_P *p++ = load_Rt_P ! 112: #define Loador_Rt_P *p++ = load_Rt_P ! 113: #define Load_Ru_P *p++ = load_Ru_P ! 114: #define Load_Rd_D(f) *p++ = load_Rd_D ! 115: #define Load_Rs_D(f) *p++ = load_Rs_D ! 116: #define Load_Rt_D(f) *p++ = load_Rt_D ! 117: #define Loadzx_Rt_D(f) *p++ = load_Rt_D ! 118: #define Load_Rd(f) *p++ = load_Rd ! 119: #define Load_Rs(f) *p++ = load_Rs ! 120: #define Load_Rt(f) *p++ = load_Rt ! 121: #define Loadzx_Rt(f) *p++ = load_Rt ! 122: #define Fetch_Rd_P(f) *p++ = fetch_Rd_P ! 123: #define Fetch_Rd_D(f) *p++ = fetch_Rd_D ! 124: #define Fetch_Rd(f) *p++ = fetch_Rd ! 125: #define Store_Rs_P *p++ = store_Rs_P ! 126: #define Store_Rs_D *p++ = store_Rs_D ! 127: #define Store_Rs *p++ = store_Rs ! 128: #define Nop ! 129: #define Inittab(t,s) *p++ = inittab; *p++ = ((ulong)(t)); *p++ = (s) ! 130: #define Table_RdRt(o,n,l) *p++ = table_RdRt; *p++ = (o); *p++ = (n) ! 131: #define Table_RsRt(o,n,l) *p++ = table_RsRt; *p++ = (o); *p++ = (n) ! 132: #define Assemble(o,n) *p++ = assemble; *p++ = (o); *p++ = (n) ! 133: #define Assemblex(o,n) *p++ = assemble; *p++ = (o); *p++ = (n) ! 134: ! 135: #define Execandfree(memstart,onstack) \ ! 136: interpret(memstart); \ ! 137: if(!onstack) \ ! 138: bbfree(memstart, (p-memstart) * sizeof(Type)); ! 139: ! 140: ! 141: /* ! 142: * Emitop can assume that fi points at &fstr[op].instr, and ! 143: * that fin contains fstr[op].n, where op is the desired ! 144: * bitblt opcode as declared in gnot.h ! 145: */ ! 146: ! 147: #define Emitop if(fin) *p++ = *fi; ! 148: ! 149: typedef struct Fstr ! 150: { ! 151: char fetchs; ! 152: char fetchd; ! 153: short n; ! 154: Type instr[1]; ! 155: } Fstr; ! 156: ! 157: Fstr fstr[16] = ! 158: { ! 159: [0] 0,0,1, /* Zero */ ! 160: {Ozero}, ! 161: ! 162: [1] 1,1,1, /* DnorS */ ! 163: {ODnorS}, ! 164: ! 165: [2] 1,1,1, /* DandnotS */ ! 166: {ODandnotS}, ! 167: ! 168: [3] 1,0,1, /* notS */ ! 169: {OnotS}, ! 170: ! 171: [4] 1,1,1, /* notDandS */ ! 172: {OnotDandS}, ! 173: ! 174: [5] 0,1,1, /* notD */ ! 175: {OnotD}, ! 176: ! 177: [6] 1,1,1, /* DxorS */ ! 178: {ODxorS}, ! 179: ! 180: [7] 1,1,1, /* DnandS */ ! 181: {ODnandS}, ! 182: ! 183: [8] 1,1,1, /* DandS */ ! 184: {ODandS}, ! 185: ! 186: [9] 1,1,1, /* DxnorS */ ! 187: {ODxnorS}, ! 188: ! 189: [10] 0,1,1, /* D */ ! 190: {OD}, ! 191: ! 192: [11] 1,1,1, /* DornotS */ ! 193: {ODornotS}, ! 194: ! 195: [12] 1,0,0, /* S */ ! 196: {0}, ! 197: ! 198: [13] 1,1,1, /* notDorS */ ! 199: {OnotDorS}, ! 200: ! 201: [14] 1,1,1, /* DorS */ ! 202: {ODorS}, ! 203: ! 204: [15] 0,0,1, /* F */ ! 205: {OF}, ! 206: }; ! 207: ! 208: #include "tabs.h" ! 209: static uchar *tabs[4][4] = ! 210: { ! 211: { 0, (uchar*)tab01l, (uchar*)tab02l, (uchar*)tab03l}, ! 212: {(uchar*)tab10l, 0, (uchar*)tab12l, (uchar*)tab13l}, ! 213: {(uchar*)tab20l, (uchar*)tab21l, 0, (uchar*)tab23l}, ! 214: {(uchar*)tab30l, (uchar*)tab31l, (uchar*)tab32l, 0}, ! 215: }; ! 216: ! 217: static uchar tabosiz[4][4] = /* size in bytes of entries */ ! 218: { ! 219: { 0, 2, 4, 4}, ! 220: { 1, 0, 2, 4}, ! 221: { 1, 1, 0, 2}, ! 222: { 1, 1, 1, 0}, ! 223: }; ! 224: ! 225: enum { ! 226: Progmax = 800, /* max number of words in a bitblt prog */ ! 227: Progmaxnoconv = 50, /* max number of words when no conversion */ ! 228: }; ! 229: ! 230: static void ! 231: interpret(Type *pc) ! 232: { ! 233: ulong *As, *Ad; ! 234: ulong Rs, Rd, Rt, Ru; ! 235: long Ri, Ro; ! 236: ulong *AT; ! 237: int osiz, sha, shb, tmp; ! 238: ! 239: #ifdef TEST ! 240: ulong *Aslow, *Ashigh, *Adlow, *Adhigh; ! 241: void prprog(void); ! 242: ! 243: Rs = lrand(); ! 244: Rd = lrand(); ! 245: Rt = lrand(); ! 246: Ru = lrand(); ! 247: Ri = lrand(); ! 248: Ro = lrand(); ! 249: sha = lrand(); ! 250: shb = lrand(); ! 251: As = 0; ! 252: Ad = 0; ! 253: AT = 0; ! 254: Aslow = gaddr(cursm, curr.min); ! 255: Ashigh = gaddr(cursm, sub(curr.max, Pt(1,1))); ! 256: Adlow = gaddr(curdm, curpt); ! 257: Adhigh = gaddr(curdm, sub(add(curpt, sub(curr.max,curr.min)),Pt(1,1))); ! 258: #endif ! 259: ! 260: loop: ! 261: #ifdef TEST ! 262: switch(*pc) { ! 263: case load_Rd_P: ! 264: case load_Rs_P: ! 265: case load_Rt_P: ! 266: case load_Ru_P: ! 267: case load_Rd: ! 268: case load_Rs: ! 269: case load_Rt: ! 270: if(As < Aslow || As > Ashigh){ ! 271: print("load from bad As %ux\n", As); ! 272: errplace: ! 273: print("src bitmap base %ux zero %d width %d r %d %d %d %d\n", ! 274: cursm->base, cursm->zero, cursm->width, ! 275: cursm->r.min.x, cursm->r.min.y, ! 276: cursm->r.max.x, cursm->r.max.y); ! 277: print("dst bitmap base %ux zero %d width %d r %d %d %d %d\n", ! 278: curdm->base, curdm->zero, curdm->width, ! 279: curdm->r.min.x, curdm->r.min.y, ! 280: curdm->r.max.x, curdm->r.max.y); ! 281: print("p %d %d r %d %d %d %d f %d\n", ! 282: curpt.x, curpt.y, curr.min.x, curr.min.y, ! 283: curr.max.x, curr.max.y, curf); ! 284: prprog(); ! 285: exits("fail"); ! 286: } ! 287: break; ! 288: case load_Rd_D: ! 289: case load_Rs_D: ! 290: case load_Rt_D: ! 291: if(As-1 < Aslow || As-1 > Ashigh){ ! 292: print("load from bad As-1 %ux\n", As-1); ! 293: goto errplace; ! 294: } ! 295: break; ! 296: case fetch_Rd_P: ! 297: case fetch_Rd: ! 298: if(Ad < Adlow || Ad > Adhigh){ ! 299: print("fetch from bad Ad %ux\n", Ad); ! 300: goto errplace; ! 301: } ! 302: break; ! 303: case store_Rs_P: ! 304: case store_Rs: ! 305: if(Ad < Adlow || Ad > Adhigh){ ! 306: print("store to bad Ad %ux\n", Ad); ! 307: goto errplace; ! 308: } ! 309: break; ! 310: case fetch_Rd_D: ! 311: case store_Rs_D: ! 312: if(Ad-1 < Adlow || Ad-1 > Adhigh){ ! 313: print("fetch from bad Ad-1 %ux\n", Ad-1); ! 314: prprog(); ! 315: } ! 316: break; ! 317: } ! 318: #endif ! 319: switch(*pc++) { ! 320: default: ! 321: #ifdef TEST ! 322: print("unknown opcode %d\n", pc[-1]); ! 323: goto errplace; ! 324: #else ! 325: return; ! 326: #endif ! 327: case field: ! 328: /* Rs gets Rd where mask bits are 0s, Rs where mask bits are 1s */ ! 329: Rs = ((Rs ^ Rd) & *pc++) ^ Rd; ! 330: break; ! 331: ! 332: case lsha_RsRt: ! 333: Rs = Rt >> sha; ! 334: break; ! 335: ! 336: case lshb_RsRt: ! 337: Rs = Rt >> shb; ! 338: break; ! 339: ! 340: case lsh_RsRd: ! 341: Rs = Rd >> *pc++; ! 342: break; ! 343: ! 344: case lsh_RtRt: /* arg = shift amount */ ! 345: Rt >>= *pc++; ! 346: break; ! 347: ! 348: case lsha_RtRt: ! 349: Rt >>= sha; ! 350: break; ! 351: ! 352: case lsha_RtRu: ! 353: Rt = Ru >> sha; ! 354: break; ! 355: ! 356: case lshb_RtRu: ! 357: Rt = Ru >> shb; ! 358: break; ! 359: ! 360: case rsha_RsRt: ! 361: Rs = Rt << sha; ! 362: break; ! 363: ! 364: case rshb_RsRt: ! 365: Rs = Rt << shb; ! 366: break; ! 367: ! 368: case rsha_RtRu: ! 369: Rt = Ru << sha; ! 370: break; ! 371: ! 372: case rshb_RtRu: ! 373: Rt = Ru << shb; ! 374: break; ! 375: ! 376: case orlsha_RsRt: ! 377: Rs |= Rt >> sha; ! 378: break; ! 379: ! 380: case orlshb_RsRt: ! 381: Rs |= Rt >> shb; ! 382: break; ! 383: ! 384: case orlsh_RsRd: /* arg = shift amount */ ! 385: Rs |= Rd >> *pc++; ! 386: break; ! 387: ! 388: case orrsha_RsRt: ! 389: Rs |= Rt << sha; ! 390: break; ! 391: ! 392: case orrshb_RsRt: ! 393: Rs |= Rt << shb; ! 394: break; ! 395: ! 396: case orrsha_RtRu: ! 397: Rt |= Ru << sha; ! 398: break; ! 399: ! 400: case orrshb_RtRu: ! 401: Rt |= Ru << shb; ! 402: break; ! 403: ! 404: case or_RsRd: ! 405: Rs |= Rd; ! 406: break; ! 407: ! 408: case add_As: ! 409: As = (ulong*)((char*)As + (long)*pc++); ! 410: break; ! 411: ! 412: case add_Ad: ! 413: Ad = (ulong*)((char*)Ad + (long)*pc++); ! 414: break; ! 415: ! 416: case initsd: ! 417: As = (ulong*)pc[0]; ! 418: Ad = (ulong*)pc[1]; ! 419: pc += 2; ! 420: break; ! 421: ! 422: case ilabel: ! 423: /* initialize inner loop count */ ! 424: Ri = *pc++; ! 425: break; ! 426: ! 427: case olabel: ! 428: /* initialize outer loop count */ ! 429: Ro = *pc++; ! 430: break; ! 431: ! 432: case iloop: ! 433: /* decrement inner loop count, loop back if still positive */ ! 434: Ri--; ! 435: if(Ri > 0) { ! 436: pc = (Type*)pc[0]; ! 437: break; ! 438: } ! 439: pc++; ! 440: break; ! 441: ! 442: case oloop: ! 443: /* decrement outer loop count, loop back if still positive */ ! 444: Ro--; ! 445: if(Ro > 0) { ! 446: pc = (Type*)pc[0]; ! 447: break; ! 448: } ! 449: pc++; ! 450: break; ! 451: ! 452: case rts: ! 453: return; ! 454: ! 455: case load_Rd_P: ! 456: Rd = *As++; ! 457: break; ! 458: ! 459: case load_Rs_P: ! 460: Rs = *As++; ! 461: break; ! 462: ! 463: case load_Rt_P: ! 464: Rt = *As++; ! 465: break; ! 466: ! 467: case load_Ru_P: ! 468: Ru = *As++; ! 469: break; ! 470: ! 471: case load_Rd_D: ! 472: Rd = *--As; ! 473: break; ! 474: ! 475: case load_Rs_D: ! 476: Rs = *--As; ! 477: break; ! 478: ! 479: case load_Rt_D: ! 480: Rt = *--As; ! 481: break; ! 482: ! 483: case load_Rd: ! 484: Rd = *As; ! 485: break; ! 486: ! 487: case load_Rs: ! 488: Rs = *As; ! 489: break; ! 490: ! 491: case load_Rt: ! 492: Rt = *As; ! 493: break; ! 494: ! 495: case fetch_Rd_P: ! 496: Rd = *Ad++; ! 497: break; ! 498: ! 499: case fetch_Rd_D: ! 500: Rd = *--Ad; ! 501: break; ! 502: ! 503: case fetch_Rd: ! 504: Rd = *Ad; ! 505: break; ! 506: ! 507: case store_Rs_P: ! 508: *Ad++ = Rs; ! 509: break; ! 510: ! 511: case store_Rs_D: ! 512: *--Ad = Rs; ! 513: break; ! 514: ! 515: case store_Rs: ! 516: *Ad = Rs; ! 517: break; ! 518: ! 519: case inittab: ! 520: AT = (ulong*)pc[0]; ! 521: osiz = (long)pc[1]; ! 522: pc += 2; ! 523: break; ! 524: ! 525: case initsh: ! 526: sha = (long)pc[0]; ! 527: shb = (long)pc[1]; ! 528: pc += 2; ! 529: break; ! 530: ! 531: case table_RdRt: ! 532: /* ! 533: * Starting at offset arg1 in Rt, take arg2 bits, ! 534: * and use it to look up in table AT, putting answer in Rd ! 535: */ ! 536: Rd = (Rt >> ((long)pc[0])) & ((1<<((long)pc[1]))-1); ! 537: Rd = AT[Rd]; ! 538: pc += 2; ! 539: break; ! 540: ! 541: case table_RsRt: ! 542: /* like table_RdRt, but answer goes in Rs */ ! 543: tmp = (long)pc[1]; ! 544: Rs = (Rt >> ((long)pc[0])) & ((1<<((long)pc[1]))-1); ! 545: Rs = AT[Rs]; ! 546: pc += 2; ! 547: break; ! 548: ! 549: ! 550: case assemble: ! 551: /* ! 552: * Move high arg2 bits of Rd into offset arg1 in Rs. ! 553: * Can assume that low bits of Rd are zero, ! 554: * and target field of Rs is zero if offset != 0 ! 555: */ ! 556: tmp = (long)pc[0]; ! 557: if(tmp == 0) ! 558: Rs = Rd >> (32-pc[1]); ! 559: else ! 560: Rs |= Rd >> (32-(tmp+pc[1])); ! 561: pc += 2; ! 562: break; ! 563: ! 564: case Ozero: ! 565: Rs = 0; ! 566: break; ! 567: ! 568: case ODnorS: ! 569: Rs = ~(Rd|Rs); ! 570: break; ! 571: ! 572: case ODandnotS: ! 573: Rs = Rd & ~Rs; ! 574: break; ! 575: ! 576: case OnotS: ! 577: Rs = ~Rs; ! 578: break; ! 579: ! 580: case OnotDandS: ! 581: Rs = ~Rd & Rs; ! 582: break; ! 583: ! 584: case OnotD: ! 585: Rs = ~Rd; ! 586: break; ! 587: ! 588: case ODxorS: ! 589: Rs ^= Rd; ! 590: break; ! 591: ! 592: case ODnandS: ! 593: Rs = ~(Rd & Rs); ! 594: break; ! 595: ! 596: case ODandS: ! 597: Rs &= Rd; ! 598: break; ! 599: ! 600: case ODxnorS: ! 601: Rs = ~(Rd ^ Rs); ! 602: break; ! 603: ! 604: case OD: ! 605: Rs = Rd; ! 606: break; ! 607: ! 608: case ODornotS: ! 609: Rs = Rd | ~Rs; ! 610: break; ! 611: ! 612: case OnotDorS: ! 613: Rs |= ~Rd; ! 614: break; ! 615: ! 616: case ODorS: ! 617: Rs |= Rd; ! 618: break; ! 619: ! 620: case OF: ! 621: Rs = ~0L; ! 622: break; ! 623: } ! 624: goto loop; ! 625: } ! 626: ! 627: #ifdef TEST ! 628: void ! 629: prprog(void) ! 630: { ! 631: int osiz; ! 632: Type *pc; ! 633: pc = (Type *)mem; ! 634: ! 635: loop: ! 636: switch(*pc++) { ! 637: default: ! 638: print("unknown opcode %d\n", pc[-1]); ! 639: exits("unknown opcode"); ! 640: case field: ! 641: print("Rs = ((Rs ^ Rd) & 0x%lux) ^ Rd\n", *pc++); ! 642: break; ! 643: ! 644: case lsha_RsRt: ! 645: print("Rs = Rt >> sha\n"); ! 646: break; ! 647: ! 648: case lshb_RsRt: ! 649: print("Rs = Rt >> shb\n"); ! 650: break; ! 651: ! 652: case lsh_RsRd: ! 653: print("Rs = Rd >> %d\n", *pc++); ! 654: break; ! 655: ! 656: case lsh_RtRt: ! 657: print("Rt >>= %d\n", *pc++); ! 658: break; ! 659: ! 660: case lsha_RtRt: ! 661: print("Rt >>= sha\n"); ! 662: break; ! 663: ! 664: case lsha_RtRu: ! 665: print("Rt = Ru >> sha\n"); ! 666: break; ! 667: ! 668: case lshb_RtRu: ! 669: print("Rt = Ru >> shb\n"); ! 670: break; ! 671: ! 672: case rsha_RsRt: ! 673: print("Rs = Rt << sha\n"); ! 674: break; ! 675: ! 676: case rshb_RsRt: ! 677: print("Rs = Rt << shb\n"); ! 678: break; ! 679: ! 680: case rsha_RtRu: ! 681: print("Rt = Ru << sha\n"); ! 682: break; ! 683: ! 684: case rshb_RtRu: ! 685: print("Rt = Ru << shb\n"); ! 686: break; ! 687: ! 688: case orlsha_RsRt: ! 689: print("Rs |= Rt >> sha\n"); ! 690: break; ! 691: ! 692: case orlshb_RsRt: ! 693: print("Rs |= Rt >> shb\n"); ! 694: break; ! 695: ! 696: case orlsh_RsRd: ! 697: print("Rs |= Rd >> %d\n", *pc++); ! 698: break; ! 699: ! 700: case orrsha_RsRt: ! 701: print("Rs |= Rt << sha\n"); ! 702: break; ! 703: ! 704: case orrshb_RsRt: ! 705: print("Rs |= Rt << shb\n"); ! 706: break; ! 707: ! 708: case orrsha_RtRu: ! 709: print("Rt |= Ru << sha\n"); ! 710: break; ! 711: ! 712: case orrshb_RtRu: ! 713: print("Rt |= Ru << shb\n"); ! 714: break; ! 715: ! 716: case or_RsRd: ! 717: print("Rs |= Rd\n"); ! 718: break; ! 719: ! 720: case add_As: ! 721: print("As += %d\n", (long)*pc++); ! 722: break; ! 723: ! 724: case add_Ad: ! 725: print("Ad += %d\n", (long)*pc++); ! 726: break; ! 727: ! 728: case initsd: ! 729: print("As = 0x%lux\n", (ulong*)pc[0]); ! 730: print("Ad = 0x%lux\n", (ulong*)pc[1]); ! 731: pc += 2; ! 732: break; ! 733: ! 734: case ilabel: ! 735: print("Ri = %d\n", *pc++); ! 736: break; ! 737: ! 738: case olabel: ! 739: print("Ro = %d\n", *pc++); ! 740: break; ! 741: ! 742: case iloop: ! 743: print("if(--Ri > 0) goto 0x%lux\n", *pc++); ! 744: break; ! 745: ! 746: case oloop: ! 747: print("if(--Ro > 0) goto 0x%lux\n", *pc++); ! 748: break; ! 749: ! 750: case rts: ! 751: print("return\n"); ! 752: return; ! 753: ! 754: case load_Rd_P: ! 755: print("Rd = *As++\n"); ! 756: break; ! 757: ! 758: case load_Rs_P: ! 759: print("Rs = *As++\n"); ! 760: break; ! 761: ! 762: case load_Rt_P: ! 763: print("Rt = *As++\n"); ! 764: break; ! 765: ! 766: case load_Ru_P: ! 767: print("Ru = *As++\n"); ! 768: break; ! 769: ! 770: case load_Rd_D: ! 771: print("Rd = *--As\n"); ! 772: break; ! 773: ! 774: case load_Rs_D: ! 775: print("Rs = *--As\n"); ! 776: break; ! 777: ! 778: case load_Rt_D: ! 779: print("Rt = *--As\n"); ! 780: break; ! 781: ! 782: case load_Rd: ! 783: print("Rd = *As\n"); ! 784: break; ! 785: ! 786: case load_Rs: ! 787: print("Rs = *As\n"); ! 788: break; ! 789: ! 790: case load_Rt: ! 791: print("Rt = *As\n"); ! 792: break; ! 793: ! 794: case fetch_Rd_P: ! 795: print("Rd = *Ad++\n"); ! 796: break; ! 797: ! 798: case fetch_Rd_D: ! 799: print("Rd = *--Ad\n"); ! 800: break; ! 801: ! 802: case fetch_Rd: ! 803: print("Rd = *Ad\n"); ! 804: break; ! 805: ! 806: case store_Rs_P: ! 807: print("*Ad++ = Rs\n"); ! 808: break; ! 809: ! 810: case store_Rs_D: ! 811: print("*--Ad = Rs\n"); ! 812: break; ! 813: ! 814: case store_Rs: ! 815: print("*Ad = Rs\n"); ! 816: break; ! 817: ! 818: case inittab: ! 819: print("AT = 0x%lux (%d byte entries)\n", pc[0],pc[1]); ! 820: osiz = pc[1]; ! 821: pc += 2; ! 822: break; ! 823: ! 824: case initsh: ! 825: print("sha = %d\n", (long)pc[0]); ! 826: print("shb = %d\n", (long)pc[1]); ! 827: pc += 2; ! 828: break; ! 829: ! 830: case table_RdRt: ! 831: switch(osiz){ ! 832: case 1: ! 833: print("Rd = ((char*)AT)[Rt{%d..%d}]\n", pc[0], pc[0]+pc[1]-1); ! 834: break; ! 835: case 2: ! 836: print("Rd = ((short*)AT)[Rt{%d..%d}]\n", pc[0], pc[0]+pc[1]-1); ! 837: break; ! 838: case 4: ! 839: print("Rd = ((long*)AT)[Rt{%d..%d}]\n", pc[0], pc[0]+pc[1]-1); ! 840: break; ! 841: default: ! 842: print("bad osiz for table_RdRt\n"); ! 843: } ! 844: pc += 2; ! 845: break; ! 846: ! 847: case table_RsRt: ! 848: switch(osiz){ ! 849: case 1: ! 850: print("Rs = ((char*)AT)[Rt{%d..%d}]\n", pc[0], pc[0]+pc[1]-1); ! 851: break; ! 852: case 2: ! 853: print("Rs = ((short*)AT)[Rt{%d..%d}]\n", pc[0], pc[0]+pc[1]-1); ! 854: break; ! 855: case 4: ! 856: print("Rs = ((long*)AT)[Rt{%d..%d}]\n", pc[0], pc[0]+pc[1]-1); ! 857: break; ! 858: default: ! 859: print("bad osiz for table_RdRt\n"); ! 860: } ! 861: pc += 2; ! 862: break; ! 863: ! 864: case assemble: ! 865: /* ! 866: * Move low arg2 bits of Rd into offset arg1 in Rs. ! 867: * Can assume that high bits of Rd are zero, ! 868: * and target field of Rs is zero if offset != 0 ! 869: */ ! 870: if(pc[0] == 0) ! 871: print("Rs = Rd >> %d\n", (32-(long)pc[1])); ! 872: else ! 873: print("Rs |= Rd >> %d\n", (32-((long)pc[0]+(long)pc[1]))); ! 874: pc += 2; ! 875: break; ! 876: ! 877: case Ozero: ! 878: print("Rs = 0\n"); ! 879: break; ! 880: ! 881: case ODnorS: ! 882: print("Rs = ~(Rd|Rs)\n"); ! 883: break; ! 884: ! 885: case ODandnotS: ! 886: print("Rs = Rd & ~Rs\n"); ! 887: break; ! 888: ! 889: case OnotS: ! 890: print("Rs = ~Rs\n"); ! 891: break; ! 892: ! 893: case OnotDandS: ! 894: print("Rs = ~Rd & Rs\n"); ! 895: break; ! 896: ! 897: case OnotD: ! 898: print("Rs = ~Rd\n"); ! 899: break; ! 900: ! 901: case ODxorS: ! 902: print("Rs ^= Rd\n"); ! 903: break; ! 904: ! 905: case ODnandS: ! 906: print("Rs = ~(Rd & Rs)\n"); ! 907: break; ! 908: ! 909: case ODandS: ! 910: print("Rs &= Rd\n"); ! 911: break; ! 912: ! 913: case ODxnorS: ! 914: print("Rs = ~(Rd ^ Rs)\n"); ! 915: break; ! 916: ! 917: case OD: ! 918: print("Rs = Rd\n"); ! 919: break; ! 920: ! 921: case ODornotS: ! 922: print("Rs = Rd | ~Rs\n"); ! 923: break; ! 924: ! 925: case OnotDorS: ! 926: print("Rs |= ~Rd\n"); ! 927: break; ! 928: ! 929: case ODorS: ! 930: print("Rs |= Rd\n"); ! 931: break; ! 932: ! 933: case OF: ! 934: print("Rs = ~0L\n"); ! 935: break; ! 936: } ! 937: goto loop; ! 938: } ! 939: #endif ! 940:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.