|
|
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.