|
|
1.1 root 1: /*****************************************************************************/
2: /* Generator - Sega Genesis emulation - (c) James Ponder 1997-1998 */
3: /*****************************************************************************/
4: /* */
5: /* def68k.c */
6: /* */
7: /*****************************************************************************/
8:
9: #include <errno.h>
10: #include <stdio.h>
11: #include <string.h>
12: #include <ctype.h>
13: #include <stdlib.h>
14:
15: #include "generator.h"
16:
17: #define BUFLEN 1024
18: #define FNAME_CPUDEF "def68k.def"
19: #define FNAME_OUTIIBS "out/def68k-iibs.h"
20: #define FNAME_OUTFUNCS "out/def68k-funcs.h"
21: #define FNAME_OUTPROTO "out/def68k-proto.h"
22:
23: typedef enum {
24: bit0, bit1, bitz, bite, bitE, bitf, bitF, biti, bitn, bitN, bitc, bitv
25: } t_bit;
26:
27: /* file-scope global variables */
28:
29: static int total = 0;
30:
31: /* private functions for forward references */
32:
33: void procline(char *line, int lineno, FILE *outiibs, FILE *outfuncs,
34: FILE *outproto);
35: int clocks_ea(t_datatype type);
36: int clocks_eacalc(t_datatype type, t_size size);
37: int clocks_eafetch(t_datatype type, t_size size);
38: int clocks_standard(t_datatype stype, t_datatype dtype, t_size size);
39: int clocks_single(t_datatype type, t_size size);
40:
41: /* program entry routine */
42:
43: int main(int argc, char *argv[])
44: {
45: FILE *input, *outiibs, *outfuncs, *outproto;
46: char buf[BUFLEN], *p;
47: int lineno = 0;
48:
49: /* open output files and write headers */
50:
51: if ((outiibs = fopen(FNAME_OUTIIBS, "w")) == NULL) {
52: perror("fopen outiibs");
53: exit(1);
54: }
55: fprintf(outiibs, "/* automatically generated by def68k.c */\n\n");
56: fprintf(outiibs, "t_iib iibs[] = {\n");
57: fprintf(outiibs, " /* mask, bits, mnemonic, { priv, endblk, zero, ");
58: fprintf(outiibs, "used, set },\n");
59: fprintf(outiibs, " size, stype, dtype, sbitpos, dbitpos, immvalue, ");
60: fprintf(outiibs, "cc, funcnum */\n");
61:
62: if ((outfuncs = fopen(FNAME_OUTFUNCS, "w")) == NULL) {
63: perror("fopen outfuncs");
64: exit(1);
65: }
66: fprintf(outfuncs, "/* automatically generated by def68k.c */\n\n");
67: fprintf(outfuncs, "void (*cpu68k_funcindex[])(t_ipc *ipc) = {\n");
68: fprintf(outfuncs, " /* function */\n");
69:
70: if ((outproto = fopen(FNAME_OUTPROTO, "w")) == NULL) {
71: perror("fopen outproto");
72: exit(1);
73: }
74: fprintf(outproto, "/* automatically generated by def68k.c */\n\n");
75:
76: /* open input file */
77:
78: if ((input = fopen(FNAME_CPUDEF, "r")) == NULL) {
79: perror("fopen input");
80: exit(1);
81: }
82:
83: /* loop until end of file */
84:
85: printf("Writing CPU definitions... ");
86: fflush(stdout);
87:
88: while (!feof(input)) {
89: /* use unix line numbering from 1 */
90: lineno++;
91: /* read a line */
92: if (ferror(input)) {
93: break;
94: }
95: if (fgets(buf, BUFLEN, input) == NULL) {
96: break;
97: /* huh? why does this cause fgets to say 'Unknown error'?! */
98: perror("fgets");
99: exit(1);
100: }
101: /* remove newline */
102: buf[strlen(buf)-1] = '\0';
103: /* remove comment */
104: if ((p = strchr(buf, ';')) != NULL) {
105: *p = '\0';
106: }
107: /* remove leading spaces */
108: p = buf;
109: while (*p == ' ')
110: p++;
111: /* blank line? */
112: if (!*p)
113: continue;
114: /* process line */
115: procline(buf, lineno, outiibs, outfuncs, outproto);
116: }
117:
118: /* close input */
119:
120: if (fclose(input)) {
121: perror("fclose input");
122: exit(1);
123: }
124:
125: /* output footer */
126:
127: fprintf(outiibs, " { 0, 0, 0, { 0, 0, 0, 0, 0 }, "
128: "0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }\n");
129: fprintf(outiibs, "};\n");
130: fprintf(outiibs, "int iibs_num = %d;\n", total);
131:
132: fprintf(outfuncs, "};\n");
133:
134: /* close outputs */
135:
136: if (fclose(outiibs)) {
137: perror("fclose outiibs");
138: exit(1);
139: }
140: if (fclose(outfuncs)) {
141: perror("fclose outfuncs");
142: exit(1);
143: }
144: if (fclose(outproto)) {
145: perror("fclose outproto");
146: exit(1);
147: }
148:
149: printf("done.\n");
150: fflush(stdout);
151:
152: return(0);
153: }
154:
155: /* process a line */
156:
157: void procline(char *line, int lineno, FILE *outiibs, FILE *outfuncs,
158: FILE *outproto) {
159: int i;
160: char *p;
161: t_bit bit = bit0, lastbit = bit0;
162: int start[16] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };
163: int num[16] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };
164: char mnemonic[16], *m;
165: int setting;
166: int clocks;
167:
168: /* parameters to fill in about instruction */
169: int mnemonic_num;
170: uint16 mask = 0, bits = 0; /* see struct t_iib for details on */
171: int priv = 0, endblk = 0; /* these variables */
172: int imm_notzero = 0;
173: int used = 0, set = 0;
174: t_size isize = sz_none;
175: int expand_s_immsize = 0, expand_s_ea_e = 0;
176: int expand_d_ea_e = 0, expand_d_ea_f = 0;
177: t_datatype dtype = dt_Ill;
178: t_datatype stype = dt_Ill;
179: int e[16] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };
180: int f[16] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };
181: int immvalue = 0;
182: int sbitpos = 0, dbitpos = 0;
183:
184: p = line;
185:
186: /* bitpattern */
187:
188: for (i = 15; i >= 0; i--) {
189: while (*p == ' ')
190: p++;
191:
192: switch(*p) {
193: case '0': bit = bit0; mask |= 1<<i; break;
194: case '1': bit = bit1; mask |= 1<<i; bits |= 1<<i; break;
195: case 'z': bit = bitz; break;
196: case 'e': bit = bite; break;
197: case 'E': bit = bitE; break;
198: case 'f': bit = bitf; break;
199: case 'F': bit = bitF; break;
200: case 'n': bit = bitn; break;
201: case 'N': bit = bitN; break;
202: case 'i': bit = biti; break;
203: case 'c': bit = bitc; break;
204: case 'V': bit = bitv; break;
205: default:
206: fprintf(stderr, "%d: unknown char %c in bitpattern\n", lineno, *p);
207: exit(1);
208: }
209:
210: if (*p != '0' && *p != '1') {
211: if (num[bit]) {
212: /* we've seen this bit before, make sure the last bit was the same */
213: if (bit < 15 && bit != lastbit) {
214: fprintf(stderr, "%d: Non contiguous bits of %c\n", lineno, *p);
215: exit(1);
216: }
217: }
218: /* we're looping down, so the last time start[bit] is set is the start */
219: start[bit] = i;
220: /* record how many of these bits there are */
221: num[bit]++;
222: }
223: p++;
224: lastbit = bit;
225: }
226: /* skip spaces and skip tab to get to next field */
227: while (*p == ' ')
228: p++;
229: if (*p++ != '\t') {
230: fprintf(stderr, "%d: Tab not found at end of bitpattern\n", lineno);
231: exit(1);
232: }
233:
234: /* misc flags */
235:
236: if (*p == '0') {
237: priv = 0;
238: } else if (*p == '1') {
239: priv = 1;
240: } else {
241: fprintf(stderr, "%d: Priv flag not 0 or 1\n", lineno);
242: exit(1);
243: }
244: p++;
245: /* skip spaces to next field */
246: while (*p == ' ')
247: p++;
248: if (*p == '0') {
249: endblk = 0;
250: } else if (*p == '1') {
251: endblk = 1;
252: } else {
253: fprintf(stderr, "%d: End-block flag not 0 or 1\n", lineno);
254: exit(1);
255: }
256: p++;
257: /* skip spaces and skip tab to get to next field */
258: while (*p == ' ')
259: p++;
260: if (*p++ != '\t') {
261: fprintf(stderr, "%d: Tab not found at end of flags\n", lineno);
262: exit(1);
263: }
264:
265: /* used flags */
266:
267: for (i = 0; i < 5; i++) {
268: while (*p == ' ')
269: p++;
270: switch(*p++) {
271: case '-': break;
272: case 'x': break;
273: case 'X': used |= 1<<i; break;
274: case 'N': used |= 1<<i; break;
275: case 'Z': used |= 1<<i; break;
276: case 'V': used |= 1<<i; break;
277: case 'C': used |= 1<<i; break;
278: case '0': used |= 1<<i; break;
279: case '1': used |= 1<<i; break;
280: default:
281: fprintf(stderr, "%d: Did not understand used flag %d\n", lineno, i);
282: exit(1);
283: }
284: }
285: /* skip spaces and skip tab to get to next field */
286: while (*p == ' ')
287: p++;
288: if (*p++ != '\t') {
289: fprintf(stderr, "%d: Tab not found at end of used flags\n", lineno);
290: exit(1);
291: }
292:
293: /* set flags */
294:
295: for (i = 0; i < 5; i++) {
296: while (*p == ' ')
297: p++;
298: switch(*p++) {
299: case '-': break;
300: case 'x': break;
301: case 'X': set |= 1<<i; break;
302: case 'N': set |= 1<<i; break;
303: case 'Z': set |= 1<<i; break;
304: case 'V': set |= 1<<i; break;
305: case 'C': set |= 1<<i; break;
306: case '0': set |= 1<<i; break;
307: case '1': set |= 1<<i; break;
308: default:
309: fprintf(stderr, "%d: Did not understand set flag %d\n", lineno, i);
310: exit(1);
311: }
312: }
313: /* skip spaces and skip tab to get to next field */
314: while (*p == ' ')
315: p++;
316: if (*p++ != '\t') {
317: fprintf(stderr, "%d: Tab not found at end of set flags\n", lineno);
318: exit(1);
319: }
320:
321: /* mnemonic */
322:
323: m = mnemonic;
324: while (*p && (*p != '.') && (*p != ' ') && (*p != '\t')) {
325: *m++ = *p++;
326: }
327: if (*p == '\t') {
328: fprintf(stderr, "%d: Incorrect number of fields - extra tab found\n",
329: lineno);
330: exit(1);
331: }
332: *m = '\0';
333: for (mnemonic_num = 0; *mnemonic_table[mnemonic_num].name; mnemonic_num++)
334: if (!strcmp(mnemonic_table[mnemonic_num].name, mnemonic))
335: break;
336: if (!*mnemonic_table[mnemonic_num].name) {
337: fprintf(stderr, "%d: Unknown mnemonic '%s'\n", lineno, mnemonic);
338: exit(1);
339: }
340: /* set defaults for isize */
341: isize = sz_none;
342: if (*p == '.') {
343: switch(*++p) {
344: case 'B': isize = sz_byte; break;
345: case 'W': isize = sz_word; break;
346: case 'L': isize = sz_long; break;
347: case 'z':
348: if (!num[bitz]) {
349: fprintf(stderr, "%d: 'z' given as size but no 'z' in bit pattern\n",
350: lineno);
351: exit(1);
352: }
353: /* size will be set automatically later */
354: break;
355: default:
356: fprintf(stderr, "%d: Unknown size '%c' after mnemonic\n",
357: lineno, *p);
358: exit(1);
359: }
360: p++;
361: } else {
362: /* instruction is not sized */
363: if (num[bitz]) {
364: /* oh, perhaps it is but it's a mistake */
365: fprintf(stderr, "%d: 'z's in bit pattern but no .z after mnemonic\n",
366: lineno);
367: exit(1);
368: }
369: }
370: while (*p == ' ')
371: p++;
372: if (*p == '\0') {
373: /* no source and destination information given */
374: if (num[bite] || num[bitE] || num[bitf] || num[bitF] ||
375: num[biti] || num[bitn] || num[bitN] || num[bitv]) {
376: fprintf(stderr, "%d: No information given after mnemonic\n", lineno);
377: exit(1);
378: }
379: } else {
380: switch(*p++) {
381: case 'n':
382: case 'N':
383: if (*(p-1) == 'n') {
384: sbitpos = start[bitn];
385: } else {
386: sbitpos = start[bitN];
387: }
388: if (*p++ != '(') {
389: fprintf(stderr, "%d: missing qualifier for n()\n", lineno);
390: exit(1);
391: }
392: if (!strncmp(p, "Dreg", 4)) { stype = dt_Dreg; p = p+4;
393: } else if (!strncmp(p, "Areg", 4)) { stype = dt_Areg; p = p+4;
394: } else if (!strncmp(p, "Aind", 4)) { stype = dt_Aind; p = p+4;
395: } else if (!strncmp(p, "Ainc", 4)) { stype = dt_Ainc; p = p+4;
396: } else if (!strncmp(p, "Adec", 4)) { stype = dt_Adec; p = p+4;
397: } else if (!strncmp(p, "Adis", 4)) { stype = dt_Adis; p = p+4;
398: } else if (!strncmp(p, "Aidx", 4)) { stype = dt_Aidx; p = p+4;
399: } else if (!strncmp(p, "AbsW", 4)) { stype = dt_AbsW; p = p+4;
400: } else if (!strncmp(p, "AbsL", 4)) { stype = dt_AbsL; p = p+4;
401: } else if (!strncmp(p, "Pdis", 4)) { stype = dt_Pdis; p = p+4;
402: } else if (!strncmp(p, "Pidx", 4)) { stype = dt_Pidx; p = p+4;
403: } else {
404: fprintf(stderr, "%d: unknown qualifier for n()\n", lineno);
405: exit(1);
406: }
407: if (*p++ != ')') {
408: fprintf(stderr, "%d: unknown qualifier for n()\n", lineno);
409: exit(1);
410: }
411: break;
412: case '#':
413: switch(*p++) {
414: case 'B': stype = dt_ImmB; break;
415: case 'W': stype = dt_ImmW; break;
416: case 'L': stype = dt_ImmL; break;
417: case 'z': expand_s_immsize = 1; break;
418: case 's':
419: if (num[biti] != 8) {
420: fprintf(stderr, "%d: sign extend not from 8 bits\n", lineno);
421: exit(1);
422: }
423: stype = dt_Imm8s;
424: break;
425: case 'i':
426: switch (num[biti]) {
427: case 3: stype = dt_Imm3; break;
428: case 4: stype = dt_Imm4; break;
429: case 8: stype = dt_Imm8; break;
430: default:
431: fprintf(stderr, "%d: unknown immediate data size or bad dimension\n",
432: lineno);
433: exit(1);
434: }
435: sbitpos = start[biti];
436: break;
437: case 'I':
438: imm_notzero = 1;
439: switch (num[biti]) {
440: case 3: stype = dt_Imm3; break;
441: case 4: stype = dt_Imm4; break;
442: case 8: stype = dt_Imm8; break;
443: default:
444: fprintf(stderr, "%d: unknown immediate data size or bad dimension\n",
445: lineno);
446: exit(1);
447: }
448: sbitpos = start[biti];
449: break;
450: case 'V':
451: stype = dt_ImmV;
452: sbitpos = start[bitv];
453: break;
454: default:
455: p--;
456: if (isdigit((int)*p)) {
457: immvalue = strtol(p, &p, 10);
458: stype = dt_ImmS;
459: } else {
460: fprintf(stderr, "%d: unknown source immediate type #%c\n",
461: lineno, *(p-1));
462: exit(1);
463: }
464: }
465: break;
466: case 'e':
467: expand_s_ea_e = 1;
468:
469: if (*p++ != '(') {
470: fprintf(stderr, "%d: missing qualifier for EA\n", lineno);
471: exit(1);
472: }
473: do {
474: setting = 1;
475: if (*p == '-') {
476: p++;
477: setting = 0;
478: }
479: if (!strncmp(p, "*", 1)) {
480: e[ea_Dreg] = e[ea_Areg] = e[ea_Aind] = e[ea_Ainc] = setting;
481: e[ea_Adec] = e[ea_Adis] = e[ea_Aidx] = e[ea_AbsW] = setting;
482: e[ea_AbsL] = e[ea_Pdis] = e[ea_Pidx] = e[ea_Imm] = setting;
483: p = p+1;
484: } else if (!strncmp(p, "Regs", 4)) {
485: e[ea_Dreg] = e[ea_Areg] = setting;
486: p = p+4;
487: } else if (!strncmp(p, "PC", 2)) {
488: e[ea_Pdis] = e[ea_Pidx] = setting;
489: p = p+2;
490: } else if (!strncmp(p, "Amod", 4)) {
491: e[ea_Ainc] = e[ea_Adec] = setting;
492: p = p+4;
493: } else if (!strncmp(p, "Dreg", 4)) { e[ea_Dreg] = setting; p = p+4;
494: } else if (!strncmp(p, "Areg", 4)) { e[ea_Areg] = setting; p = p+4;
495: } else if (!strncmp(p, "Aind", 4)) { e[ea_Aind] = setting; p = p+4;
496: } else if (!strncmp(p, "Ainc", 4)) { e[ea_Ainc] = setting; p = p+4;
497: } else if (!strncmp(p, "Adec", 4)) { e[ea_Adec] = setting; p = p+4;
498: } else if (!strncmp(p, "Adis", 4)) { e[ea_Adis] = setting; p = p+4;
499: } else if (!strncmp(p, "Aidx", 4)) { e[ea_Aidx] = setting; p = p+4;
500: } else if (!strncmp(p, "AbsW", 4)) { e[ea_AbsW] = setting; p = p+4;
501: } else if (!strncmp(p, "AbsL", 4)) { e[ea_AbsL] = setting; p = p+4;
502: } else if (!strncmp(p, "Pdis", 4)) { e[ea_Pdis] = setting; p = p+4;
503: } else if (!strncmp(p, "Pidx", 4)) { e[ea_Pidx] = setting; p = p+4;
504: } else if (!strncmp(p, "Imm", 3)) { e[ea_Imm] = setting; p = p+3;
505: } else {
506: fprintf(stderr, "%d: unknown qualifier for EA\n", lineno);
507: exit(1);
508: }
509: } while (*p++ == ',');
510: if (*(p-1) != ')') {
511: fprintf(stderr, "%d: unknown qualifier for EA\n", lineno);
512: exit(1);
513: }
514: break;
515: default:
516: fprintf(stderr, "%d: did not understand source operand\n", lineno);
517: exit(1);
518: }
519: if (*p == ',') {
520: /* there is a destination part */
521: p++;
522: switch(*p++) {
523: case 'n':
524: case 'N':
525: if (*(p-1) == 'n') {
526: dbitpos = start[bitn];
527: } else {
528: dbitpos = start[bitN];
529: }
530: if (*p++ != '(') {
531: fprintf(stderr, "%d: missing qualifier for n()\n", lineno);
532: exit(1);
533: }
534: if (!strncmp(p, "Dreg", 4)) { dtype = dt_Dreg; p = p+4;
535: } else if (!strncmp(p, "Areg", 4)) { dtype = dt_Areg; p = p+4;
536: } else if (!strncmp(p, "Aind", 4)) { dtype = dt_Aind; p = p+4;
537: } else if (!strncmp(p, "Ainc", 4)) { dtype = dt_Ainc; p = p+4;
538: } else if (!strncmp(p, "Adec", 4)) { dtype = dt_Adec; p = p+4;
539: } else if (!strncmp(p, "Adis", 4)) { dtype = dt_Adis; p = p+4;
540: } else if (!strncmp(p, "Aidx", 4)) { dtype = dt_Aidx; p = p+4;
541: } else if (!strncmp(p, "AbsW", 4)) { dtype = dt_AbsW; p = p+4;
542: } else if (!strncmp(p, "AbsL", 4)) { dtype = dt_AbsL; p = p+4;
543: } else if (!strncmp(p, "Pdis", 4)) { dtype = dt_Pdis; p = p+4;
544: } else if (!strncmp(p, "Pidx", 4)) { dtype = dt_Pidx; p = p+4;
545: } else {
546: fprintf(stderr, "%d: unknown qualifier for n()\n", lineno);
547: exit(1);
548: }
549: if (*p++ != ')') {
550: fprintf(stderr, "%d: unknown qualifier for n()\n", lineno);
551: exit(1);
552: }
553: break;
554: case 'e':
555: expand_d_ea_e = 1;
556:
557: if (*p++ != '(') {
558: fprintf(stderr, "%d: missing qualifier for EA\n", lineno);
559: exit(1);
560: }
561: do {
562: setting = 1;
563: if (*p == '-') {
564: p++;
565: setting = 0;
566: }
567: if (!strncmp(p, "*", 1)) {
568: e[ea_Dreg] = e[ea_Areg] = e[ea_Aind] = e[ea_Ainc] = setting;
569: e[ea_Adec] = e[ea_Adis] = e[ea_Aidx] = e[ea_AbsW] = setting;
570: e[ea_AbsL] = e[ea_Pdis] = e[ea_Pidx] = e[ea_Imm] = setting;
571: p = p+1;
572: } else if (!strncmp(p, "Regs", 4)) {
573: e[ea_Dreg] = e[ea_Areg] = setting;
574: p = p+4;
575: } else if (!strncmp(p, "PC", 2)) {
576: e[ea_Pdis] = e[ea_Pidx] = setting;
577: p = p+2;
578: } else if (!strncmp(p, "Amod", 4)) {
579: e[ea_Ainc] = e[ea_Adec] = setting;
580: p = p+4;
581: } else if (!strncmp(p, "Dreg", 4)) { e[ea_Dreg] = setting; p = p+4;
582: } else if (!strncmp(p, "Areg", 4)) { e[ea_Areg] = setting; p = p+4;
583: } else if (!strncmp(p, "Aind", 4)) { e[ea_Aind] = setting; p = p+4;
584: } else if (!strncmp(p, "Ainc", 4)) { e[ea_Ainc] = setting; p = p+4;
585: } else if (!strncmp(p, "Adec", 4)) { e[ea_Adec] = setting; p = p+4;
586: } else if (!strncmp(p, "Adis", 4)) { e[ea_Adis] = setting; p = p+4;
587: } else if (!strncmp(p, "Aidx", 4)) { e[ea_Aidx] = setting; p = p+4;
588: } else if (!strncmp(p, "AbsW", 4)) { e[ea_AbsW] = setting; p = p+4;
589: } else if (!strncmp(p, "AbsL", 4)) { e[ea_AbsL] = setting; p = p+4;
590: } else if (!strncmp(p, "Pdis", 4)) { e[ea_Pdis] = setting; p = p+4;
591: } else if (!strncmp(p, "Pidx", 4)) { e[ea_Pidx] = setting; p = p+4;
592: } else if (!strncmp(p, "Imm", 3)) { e[ea_Imm] = setting; p = p+3;
593: } else {
594: fprintf(stderr, "%d: unknown qualifier for EA\n", lineno);
595: exit(1);
596: }
597: } while (*p++ == ',');
598: if (*(p-1) != ')') {
599: fprintf(stderr, "%d: unknown qualifier for EA\n", lineno);
600: exit(1);
601: }
602: break;
603: case 'f':
604: expand_d_ea_f = 1;
605:
606: if (*p++ != '(') {
607: fprintf(stderr, "%d: missing qualifier for EA\n", lineno);
608: exit(1);
609: }
610: do {
611: setting = 1;
612: if (*p == '-') {
613: p++;
614: setting = 0;
615: }
616: if (!strncmp(p, "*", 1)) {
617: f[ea_Dreg] = f[ea_Areg] = f[ea_Aind] = f[ea_Ainc] = setting;
618: f[ea_Adec] = f[ea_Adis] = f[ea_Aidx] = f[ea_AbsW] = setting;
619: f[ea_AbsL] = f[ea_Pdis] = f[ea_Pidx] = f[ea_Imm] = setting;
620: p = p+1;
621: } else if (!strncmp(p, "Regs", 4)) {
622: f[ea_Dreg] = f[ea_Areg] = setting;
623: p = p+4;
624: } else if (!strncmp(p, "PC", 2)) {
625: f[ea_Pdis] = f[ea_Pidx] = setting;
626: p = p+2;
627: } else if (!strncmp(p, "Amod", 4)) {
628: f[ea_Ainc] = f[ea_Adec] = setting;
629: p = p+4;
630: } else if (!strncmp(p, "Dreg", 4)) { f[ea_Dreg] = setting; p = p+4;
631: } else if (!strncmp(p, "Areg", 4)) { f[ea_Areg] = setting; p = p+4;
632: } else if (!strncmp(p, "Aind", 4)) { f[ea_Aind] = setting; p = p+4;
633: } else if (!strncmp(p, "Ainc", 4)) { f[ea_Ainc] = setting; p = p+4;
634: } else if (!strncmp(p, "Adec", 4)) { f[ea_Adec] = setting; p = p+4;
635: } else if (!strncmp(p, "Adis", 4)) { f[ea_Adis] = setting; p = p+4;
636: } else if (!strncmp(p, "Aidx", 4)) { f[ea_Aidx] = setting; p = p+4;
637: } else if (!strncmp(p, "AbsW", 4)) { f[ea_AbsW] = setting; p = p+4;
638: } else if (!strncmp(p, "AbsL", 4)) { f[ea_AbsL] = setting; p = p+4;
639: } else if (!strncmp(p, "Pdis", 4)) { f[ea_Pdis] = setting; p = p+4;
640: } else if (!strncmp(p, "Pidx", 4)) { f[ea_Pidx] = setting; p = p+4;
641: } else if (!strncmp(p, "Imm", 3)) { f[ea_Imm] = setting; p = p+3;
642: } else {
643: fprintf(stderr, "%d: unknown qualifier for EA\n", lineno);
644: exit(1);
645: }
646: } while (*p++ == ',');
647: if (*(p-1) != ')') {
648: fprintf(stderr, "%d: unknown qualifier for EA\n", lineno);
649: exit(1);
650: }
651: break;
652: default:
653: fprintf(stderr, "%d: did not understand dest operand\n", lineno);
654: exit(1);
655: }
656: }
657: }
658: if (*p != '\0') {
659: fprintf(stderr, "%d: no end-of-line found at end of line\n", lineno);
660: exit(1);
661: }
662:
663: /* checks */
664:
665: if (expand_d_ea_e) {
666: if (e[ea_Imm]) {
667: fprintf(stderr, "%d: Immediate data not allowed as dest\n", lineno);
668: exit(1);
669: }
670: }
671:
672: if (expand_d_ea_f) {
673: if (f[ea_Imm]) {
674: fprintf(stderr, "%d: Immediate data not allowed as dest\n", lineno);
675: exit(1);
676: }
677: }
678:
679: if ((num[bite] && !num[bitE]) || (num[bitE] && !num[bite])) {
680: fprintf(stderr, "%d: There must be both eee and EEE\n", lineno);
681: exit(1);
682: }
683:
684: if ((num[bitf] && !num[bitF]) || (num[bitF] && !num[bitf])) {
685: fprintf(stderr, "%d: There must be both fff and FFF\n", lineno);
686: exit(1);
687: }
688:
689: if (num[bitf] && !expand_d_ea_f) {
690: fprintf(stderr, "%d: EA 'f' found but not used in description!\n", lineno);
691: exit(1);
692: }
693:
694: if (num[bite] && expand_d_ea_e && expand_s_ea_e) {
695: fprintf(stderr, "%d: EA used as both source and destination!\n", lineno);
696: exit(1);
697: }
698:
699: /* ok, now write to the output a structure for each line we're going to
700: do a CPU emulation routine for - this means we will expand anything
701: that might require control flow statements, e.g. EA and size bit
702: sections but not registers and immediate data that can be done in a
703: single instruction-wide '&' (and) statement. */
704:
705: /* convert size/EA bits to static */
706:
707: {
708: t_size size;
709: t_datatype ea_e;
710: t_datatype ea_f;
711: int skip;
712: int cc;
713: int wordlen, type;
714:
715: /* loop through 3 different sizes or just once if no size to loop on */
716:
717: for (size = isize;
718: (size == isize) || (num[bitz] && (size <= sz_long)); size++) {
719:
720: /* loop through 'e' EA or just once if no EA 'e' to loop on */
721:
722: for (ea_e = ea_Dreg;
723: (ea_e == ea_Dreg) || (num[bite] && (ea_e <= ea_Imm)); ea_e++) {
724:
725: /* loop through 'f' EA or just once if no EA 'e' to loop on */
726:
727: for (ea_f = ea_Dreg;
728: (ea_f == ea_Dreg) || (num[bitf] && (ea_f <= ea_Imm)); ea_f++) {
729:
730: for (cc = 0; (cc == 0) || (num[bitc] && (cc < 16)); cc++) {
731:
732: if (cc == 1)
733: continue;
734:
735: if ((size == sz_none) && num[bitz])
736: continue;
737:
738: /* deal with size */
739:
740: if (num[bitz]) {
741: /* set mask where zz is */
742: mask |= (3<<start[bitz]);
743: /* clear bits where zz is */
744: bits &= ~(3<<start[bitz]);
745: /* set correct value into where zz is */
746: switch (size) {
747: case sz_byte: break;
748: case sz_word: bits |= (1<<start[bitz]); break;
749: case sz_long: bits |= (2<<start[bitz]); break;
750: default:
751: printf("%d: Invalid size\n", lineno);
752: continue;
753: }
754: if (expand_s_immsize) {
755: /* source immediate data depends on size of instruction */
756: switch (size) {
757: case sz_byte: stype = dt_ImmB; break;
758: case sz_word: stype = dt_ImmW; break;
759: case sz_long: stype = dt_ImmL; break;
760: default:
761: printf("%d: Invalid size\n", lineno);
762: exit(1);
763: }
764: }
765: }
766:
767: /* deal with cc */
768:
769: if (num[bitc]) {
770: /* set mask where cccc is */
771: mask |= (15<<start[bitc]);
772: /* clear bits where cccc is */
773: bits &= ~(15<<start[bitc]);
774: /* set correct value into where cccc is */
775: bits |= cc<<start[bitc];
776: }
777:
778: /* deal with EA 'e' when used as source */
779:
780: if (num[bite] && expand_s_ea_e) {
781: if (!e[ea_e]) {
782: /* this has been disabled using -Axyz */
783: continue;
784: }
785: /* clear everything */
786: mask |= (7<<start[bite]); /* set mask for eee */
787: mask &= ~(7<<start[bitE]); /* clear mask for EEE */
788: bits &= ~(7<<start[bite]); /* clear bits in eee */
789: bits &= ~(7<<start[bitE]); /* clear bits in EEE */
790: if (ea_e <= ea_Aidx) {
791: /* ea mode with register in second part */
792: bits |= (ea_e<<start[bite]);
793: switch (ea_e) {
794: case ea_Dreg: stype = dt_Dreg; sbitpos = start[bitE]; break;
795: case ea_Areg: stype = dt_Areg; sbitpos = start[bitE]; break;
796: case ea_Aind: stype = dt_Aind; sbitpos = start[bitE]; break;
797: case ea_Ainc: stype = dt_Ainc; sbitpos = start[bitE]; break;
798: case ea_Adec: stype = dt_Adec; sbitpos = start[bitE]; break;
799: case ea_Adis: stype = dt_Adis; sbitpos = start[bitE]; break;
800: case ea_Aidx: stype = dt_Aidx; sbitpos = start[bitE]; break;
801: default: abort();
802: }
803: } else {
804: bits |= (7<<start[bite]); /* eee should be 111 */
805: mask |= (7<<start[bitE]);
806: switch (ea_e) {
807: case ea_AbsW: stype = dt_AbsW; bits |= (0<<start[bitE]); break;
808: case ea_AbsL: stype = dt_AbsL; bits |= (1<<start[bitE]); break;
809: case ea_Pdis: stype = dt_Pdis; bits |= (2<<start[bitE]); break;
810: case ea_Pidx: stype = dt_Pidx; bits |= (3<<start[bitE]); break;
811: case ea_Imm:
812: bits |= (4<<start[bitE]);
813: switch (size) {
814: case sz_byte: stype = dt_ImmB; break;
815: case sz_word: stype = dt_ImmW; break;
816: case sz_long: stype = dt_ImmL; break;
817: default:
818: printf("%d: Invalid size\n", lineno);
819: exit(1);
820: }
821: break;
822: default: abort();
823: }
824: }
825: }
826:
827: /* deal with EA 'e' when used as destination */
828:
829: if (num[bite] && expand_d_ea_e) {
830: if (!e[ea_e]) {
831: /* this has been disabled using -Axyz */
832: continue;
833: }
834: /* clear everything */
835: mask |= (7<<start[bite]); /* set mask for eee */
836: mask &= ~(7<<start[bitE]); /* clear mask for EEE */
837: bits &= ~(7<<start[bite]); /* clear bits in eee */
838: bits &= ~(7<<start[bitE]); /* clear bits in EEE */
839: if (ea_e <= ea_Aidx) {
840: /* ea mode with register in second part */
841: bits |= (ea_e<<start[bite]);
842: switch (ea_e) {
843: case ea_Dreg: dtype = dt_Dreg; dbitpos = start[bitE]; break;
844: case ea_Areg: dtype = dt_Areg; dbitpos = start[bitE]; break;
845: case ea_Aind: dtype = dt_Aind; dbitpos = start[bitE]; break;
846: case ea_Ainc: dtype = dt_Ainc; dbitpos = start[bitE]; break;
847: case ea_Adec: dtype = dt_Adec; dbitpos = start[bitE]; break;
848: case ea_Adis: dtype = dt_Adis; dbitpos = start[bitE]; break;
849: case ea_Aidx: dtype = dt_Aidx; dbitpos = start[bitE]; break;
850: default: abort();
851: }
852: } else {
853: bits |= (7<<start[bite]); /* eee should be 111 */
854: mask |= (7<<start[bitE]);
855: switch (ea_e) {
856: case ea_AbsW: dtype = dt_AbsW; bits |= (0<<start[bitE]); break;
857: case ea_AbsL: dtype = dt_AbsL; bits |= (1<<start[bitE]); break;
858: case ea_Pdis: dtype = dt_Pdis; bits |= (2<<start[bitE]); break;
859: case ea_Pidx: dtype = dt_Pidx; bits |= (3<<start[bitE]); break;
860: case ea_Imm:
861: bits |= (4<<start[bitE]);
862: switch (size) {
863: case sz_byte: dtype = dt_ImmB; break;
864: case sz_word: dtype = dt_ImmW; break;
865: case sz_long: dtype = dt_ImmL; break;
866: default:
867: printf("%d: Invalid size\n", lineno);
868: exit(1);
869: }
870: break;
871: default: abort();
872: }
873: }
874: }
875:
876: /* deal with EA 'f' when used as destination */
877:
878: if (num[bitf] && expand_d_ea_f) {
879: if (!f[ea_f]) {
880: /* this has been disabled using -Axyz */
881: continue;
882: }
883: /* clear everything */
884: mask |= (7<<start[bitf]); /* set mask for fff */
885: mask &= ~(7<<start[bitF]); /* clear mask for FFF */
886: bits &= ~(7<<start[bitf]); /* clear bits in fff */
887: bits &= ~(7<<start[bitF]); /* clear bits in FFF */
888: if (ea_f <= ea_Aidx) {
889: /* ea mode with register in second part */
890: bits |= (ea_f<<start[bitf]);
891: switch (ea_f) {
892: case ea_Dreg: dtype = dt_Dreg; dbitpos = start[bitF]; break;
893: case ea_Areg: dtype = dt_Areg; dbitpos = start[bitF]; break;
894: case ea_Aind: dtype = dt_Aind; dbitpos = start[bitF]; break;
895: case ea_Ainc: dtype = dt_Ainc; dbitpos = start[bitF]; break;
896: case ea_Adec: dtype = dt_Adec; dbitpos = start[bitF]; break;
897: case ea_Adis: dtype = dt_Adis; dbitpos = start[bitF]; break;
898: case ea_Aidx: dtype = dt_Aidx; dbitpos = start[bitF]; break;
899: default: abort();
900: }
901: } else {
902: bits |= (7<<start[bitf]); /* eee should be 111 */
903: mask |= (7<<start[bitF]);
904: switch (ea_f) {
905: case ea_AbsW: dtype = dt_AbsW; bits |= (0<<start[bitF]); break;
906: case ea_AbsL: dtype = dt_AbsL; bits |= (1<<start[bitF]); break;
907: case ea_Pdis: dtype = dt_Pdis; bits |= (2<<start[bitF]); break;
908: case ea_Pidx: dtype = dt_Pidx; bits |= (3<<start[bitF]); break;
909: case ea_Imm:
910: bits |= (4<<start[bitF]);
911: switch (size) {
912: case sz_byte: dtype = dt_ImmB; break;
913: case sz_word: dtype = dt_ImmW; break;
914: case sz_long: dtype = dt_ImmL; break;
915: default:
916: printf("%d: Invalid size\n", lineno);
917: exit(1);
918: }
919: break;
920: default: abort();
921: }
922: }
923: }
924:
925: wordlen = 1;
926: for (type = 0; type < 2; type++) {
927: switch(type ? stype : dtype) {
928: case dt_Ill:
929: case dt_Dreg:
930: case dt_Areg:
931: case dt_Aind:
932: case dt_Ainc:
933: case dt_Adec:
934: break;
935: case dt_Adis:
936: case dt_Aidx:
937: case dt_AbsW:
938: case dt_Pdis:
939: case dt_Pidx:
940: case dt_ImmB:
941: case dt_ImmW:
942: wordlen++;
943: break;
944: case dt_AbsL:
945: case dt_ImmL:
946: wordlen+= 2;
947: break;
948: case dt_ImmS:
949: case dt_Imm3:
950: case dt_Imm4:
951: case dt_Imm8:
952: case dt_Imm8s:
953: case dt_ImmV:
954: break;
955: default:
956: printf("%d: Invalid type\n", lineno);
957: exit(1);
958: }
959: }
960:
961: clocks = -1;
962:
963: switch(mnemonic_num) {
964: case i_OR:
965: case i_AND:
966: case i_EOR:
967: clocks = 4;
968: clocks+= clocks_eacalc(stype, size);
969: clocks+= clocks_eafetch(stype, size);
970: clocks+= clocks_eacalc(dtype, size);
971: clocks+= clocks_eafetch(dtype, size);
972: clocks+= clocks_standard(stype, dtype, size);
973: break;
974: case i_ORSR:
975: case i_ANDSR:
976: case i_EORSR:
977: clocks = 20;
978: break;
979: case i_SUB:
980: case i_SUBA:
981: case i_ADD:
982: case i_ADDA:
983: clocks = 4;
984: clocks+= clocks_eacalc(stype, size);
985: clocks+= clocks_eafetch(stype, size);
986: clocks+= clocks_eacalc(dtype, size);
987: clocks+= clocks_eafetch(dtype, size);
988: clocks+= clocks_standard(stype, dtype, size);
989: break;
990: case i_SUBX:
991: case i_ADDX:
992: if (stype == dt_Dreg) {
993: if (size != sz_long) {
994: clocks = 4;
995: } else {
996: clocks = 8;
997: }
998: } else {
999: if (size != sz_long) {
1000: clocks = 18;
1001: } else {
1002: clocks = 30;
1003: }
1004: }
1005: break;
1006: case i_MULU:
1007: case i_MULS:
1008: clocks = 54;
1009: clocks+= clocks_eacalc(stype, size);
1010: clocks+= clocks_eafetch(stype, size);
1011: break;
1012: case i_CMP:
1013: case i_CMPA:
1014: if (dtype == dt_Areg) {
1015: clocks = 6;
1016: } else {
1017: if (size != sz_long) {
1018: clocks = 4;
1019: } else {
1020: clocks = 6;
1021: }
1022: }
1023: clocks+= clocks_eacalc(stype, size);
1024: clocks+= clocks_eafetch(stype, size);
1025: break;
1026: case i_BTST:
1027: if (stype == dt_Dreg) {
1028: /* dynamic */
1029: if (dtype == dt_Dreg) {
1030: clocks = 6;
1031: } else {
1032: clocks = 4;
1033: }
1034: } else {
1035: /* static */
1036: if (dtype == dt_Dreg) {
1037: clocks = 10;
1038: } else {
1039: clocks = 8;
1040: }
1041: }
1042: clocks+= clocks_eacalc(dtype, size);
1043: clocks+= clocks_eafetch(dtype, size);
1044: break;
1045: case i_BCHG:
1046: case i_BSET:
1047: if (stype == dt_Dreg) {
1048: /* dynamic */
1049: clocks = 8;
1050: } else {
1051: /* static */
1052: clocks = 12;
1053: }
1054: clocks+= clocks_eacalc(dtype, size);
1055: clocks+= clocks_eafetch(dtype, size);
1056: break;
1057: case i_BCLR:
1058: if (stype == dt_Dreg) {
1059: /* dynamic */
1060: if (dtype == dt_Dreg) {
1061: clocks = 10;
1062: } else {
1063: clocks = 8;
1064: }
1065: } else {
1066: /* static */
1067: if (dtype == dt_Dreg) {
1068: clocks = 14;
1069: } else {
1070: clocks = 12;
1071: }
1072: }
1073: clocks+= clocks_eacalc(dtype, size);
1074: clocks+= clocks_eafetch(dtype, size);
1075: break;
1076: case i_MOVE:
1077: case i_MOVEA:
1078: clocks = 4;
1079: clocks+= clocks_eacalc(stype, size);
1080: clocks+= clocks_eafetch(stype, size);
1081: clocks+= clocks_eacalc(dtype, size);
1082: clocks+= clocks_eafetch(dtype, size);
1083: break;
1084: case i_MOVEPRM:
1085: case i_MOVEPMR:
1086: if (size == sz_long) {
1087: clocks = 24;
1088: } else {
1089: clocks = 16;
1090: }
1091: break;
1092: case i_MOVEFSR:
1093: if (stype == dt_Dreg) {
1094: clocks = 6;
1095: } else {
1096: clocks = 8;
1097: }
1098: clocks+= clocks_eacalc(stype, size);
1099: clocks+= clocks_eafetch(stype, size);
1100: break;
1101: case i_MOVETSR:
1102: clocks = 12;
1103: clocks+= clocks_eacalc(stype, size);
1104: clocks+= clocks_eafetch(stype, size);
1105: break;
1106: case i_MOVEMMR:
1107: clocks = 20;
1108: break;
1109: case i_MOVEMRM:
1110: clocks = 16;
1111: break;
1112: case i_MOVETUSP:
1113: case i_MOVEFUSP:
1114: clocks = 4;
1115: case i_NEG:
1116: case i_NEGX:
1117: case i_CLR:
1118: case i_NOT:
1119: clocks = clocks_single(stype, size);
1120: clocks+= clocks_eacalc(stype, size);
1121: clocks+= clocks_eafetch(stype, size);
1122: break;
1123: case i_ABCD:
1124: case i_SBCD:
1125: if (stype == dt_Dreg) {
1126: clocks = 6;
1127: } else {
1128: clocks = 18;
1129: }
1130: break;
1131: case i_NBCD:
1132: if (stype == dt_Dreg || stype == dt_Areg) {
1133: clocks = 6;
1134: } else {
1135: clocks = 8;
1136: clocks+= clocks_eacalc(stype, size);
1137: clocks+= clocks_eafetch(stype, size);
1138: }
1139: break;
1140: case i_SWAP:
1141: clocks = 4;
1142: break;
1143: case i_PEA:
1144: clocks = 8;
1145: clocks+= clocks_eacalc(stype, size);
1146: clocks+= clocks_eafetch(stype, size);
1147: break;
1148: case i_LEA:
1149: clocks = 4;
1150: clocks+= clocks_eacalc(stype, size);
1151: break;
1152: case i_EXT:
1153: clocks = 4;
1154: break;
1155: case i_EXG:
1156: clocks = 6;
1157: break;
1158: case i_TST:
1159: clocks = 4;
1160: clocks+= clocks_eacalc(stype, size);
1161: clocks+= clocks_eafetch(stype, size);
1162: break;
1163: case i_TAS:
1164: if (stype == dt_Dreg || stype == dt_Areg) {
1165: clocks = 4;
1166: } else {
1167: clocks = 10;
1168: }
1169: break;
1170: case i_CHK:
1171: clocks = 10;
1172: clocks+= clocks_eacalc(stype, size);
1173: clocks+= clocks_eafetch(stype, size);
1174: break;
1175: case i_TRAPV:
1176: clocks = 4;
1177: break;
1178: case i_TRAP:
1179: clocks = 4; /* exception */
1180: break;
1181: case i_RESET:
1182: clocks = 132;
1183: break;
1184: case i_NOP:
1185: clocks = 4;
1186: break;
1187: case i_STOP:
1188: clocks = 4;
1189: break;
1190: case i_LINK:
1191: clocks = 16;
1192: break;
1193: case i_UNLK:
1194: clocks = 12;
1195: break;
1196: case i_RTE:
1197: clocks = 20;
1198: break;
1199: case i_RTS:
1200: clocks = 16;
1201: break;
1202: case i_RTR:
1203: clocks = 20;
1204: break;
1205: case i_JSR:
1206: clocks = 16;
1207: clocks+= clocks_eacalc(stype, size);
1208: break;
1209: case i_JMP:
1210: clocks = 8;
1211: clocks+= clocks_eacalc(stype, size);
1212: break;
1213: case i_Scc:
1214: if (stype == dt_Dreg || stype == dt_Areg) {
1215: clocks = 4;
1216: } else {
1217: clocks = 8;
1218: clocks+= clocks_eacalc(stype, size);
1219: clocks+= clocks_eafetch(stype, size);
1220: }
1221: break;
1222: case i_SF:
1223: if (stype == dt_Dreg || stype == dt_Areg) {
1224: clocks = 4;
1225: } else {
1226: clocks = 8;
1227: clocks+= clocks_eacalc(stype, size);
1228: clocks+= clocks_eafetch(stype, size);
1229: }
1230: break;
1231: case i_DBcc:
1232: case i_DBRA:
1233: clocks = 10;
1234: break;
1235: case i_Bcc:
1236: if (size == sz_byte) {
1237: clocks = 8;
1238: } else {
1239: clocks = 10;
1240: }
1241: break;
1242: case i_BSR:
1243: clocks = 18;
1244: break;
1245: case i_DIVU:
1246: clocks = 140;
1247: clocks+= clocks_eacalc(stype, size);
1248: clocks+= clocks_eafetch(stype, size);
1249: break;
1250: case i_DIVS:
1251: clocks = 128;
1252: clocks+= clocks_eacalc(stype, size);
1253: clocks+= clocks_eafetch(stype, size);
1254: break;
1255: case i_ASR:
1256: case i_LSR:
1257: case i_ROXR:
1258: case i_ROR:
1259: case i_ASL:
1260: case i_LSL:
1261: case i_ROXL:
1262: case i_ROL:
1263: clocks = 8;
1264: clocks+= clocks_eacalc(dtype, size);
1265: clocks+= clocks_eafetch(dtype, size);
1266: break;
1267: case i_ILLG:
1268: clocks = 0;
1269: break;
1270: case i_LINE10:
1271: case i_LINE15:
1272: clocks = 4; /* exception */
1273: break;
1274: default:
1275: printf("%d: Invalid mnemonic type\n", lineno);
1276: exit(1);
1277: }
1278:
1279: if (clocks == -1) {
1280: printf("%d: Clocks not found\n", lineno);
1281: exit(1);
1282: }
1283:
1284: /* write output lines */
1285:
1286: fprintf(outiibs, " { 0x%x, 0x%x, %d, { %d, %d, %d, %d, %d }, ",
1287: mask, bits, mnemonic_num, priv, endblk, imm_notzero, used,
1288: set);
1289: fprintf(outiibs, "%d, %d, %d, %d, %d, %d, %d, %d, %d, %d},\n",
1290: size, stype, dtype, sbitpos, dbitpos, immvalue,
1291: cc, total, wordlen, clocks);
1292: fprintf(outiibs, "%60s/* %s */\n", "", mnemonic);
1293: if (set == 0) {
1294: fprintf(outfuncs, " cpu_op_%ia, /* %s */\n", total, mnemonic);
1295: fprintf(outfuncs, " cpu_op_%ia, /* %s */\n", total, mnemonic);
1296: fprintf(outproto, "extern void cpu_op_%ia("
1297: "t_ipc *ipc); /* %s */\n", total, mnemonic);
1298: } else {
1299: fprintf(outfuncs, " cpu_op_%ia, /* %s - normal */\n", total,
1300: mnemonic);
1301: fprintf(outfuncs, " cpu_op_%ib, /* %s - no flags */\n", total,
1302: mnemonic);
1303: fprintf(outproto, "extern void cpu_op_%ia("
1304: "t_ipc *ipc); /* %s */\n", total, mnemonic);
1305: fprintf(outproto, "extern void cpu_op_%ib("
1306: "t_ipc *ipc); /* %s */\n", total, mnemonic);
1307: }
1308:
1309: total++;
1310:
1311: } /* cc */
1312: } /* ea_f */
1313: } /* ea_e */
1314: } /* size */
1315: } /* block */
1316: }
1317:
1318: int clocks_eacalc(t_datatype type, t_size size)
1319: {
1320: switch(type) {
1321: case dt_Dreg:
1322: case dt_Areg:
1323: break;
1324: case dt_Aind:
1325: case dt_Ainc:
1326: break;
1327: case dt_Adec:
1328: return 2;
1329: case dt_Adis:
1330: return 4;
1331: case dt_Aidx:
1332: return 6;
1333: case dt_AbsW:
1334: return 4;
1335: case dt_AbsL:
1336: return 8;
1337: case dt_Pdis:
1338: return 4;
1339: case dt_Pidx:
1340: return 6;
1341: case dt_ImmB:
1342: case dt_ImmW:
1343: case dt_ImmL:
1344: break;
1345: case dt_ImmS:
1346: case dt_Imm3:
1347: case dt_Imm4:
1348: case dt_Imm8:
1349: case dt_Imm8s:
1350: case dt_Ill:
1351: break;
1352: default:
1353: printf("Invalid type for clocks\n");
1354: exit(1);
1355: }
1356: return 0;
1357: }
1358:
1359: int clocks_eafetch(t_datatype type, t_size size)
1360: {
1361: switch(type) {
1362: case dt_Dreg:
1363: case dt_Areg:
1364: break;
1365: case dt_Aind:
1366: case dt_Ainc:
1367: case dt_Adec:
1368: case dt_Adis:
1369: case dt_Aidx:
1370: case dt_AbsW:
1371: case dt_AbsL:
1372: case dt_Pdis:
1373: case dt_Pidx:
1374: case dt_ImmB:
1375: case dt_ImmW:
1376: case dt_ImmL:
1377: if (size == sz_long)
1378: return 8;
1379: else
1380: return 4;
1381: break;
1382: case dt_ImmS:
1383: case dt_Imm3:
1384: case dt_Imm4:
1385: case dt_Imm8:
1386: case dt_Imm8s:
1387: case dt_Ill:
1388: break;
1389: default:
1390: printf("Invalid type for clocks\n");
1391: exit(1);
1392: }
1393: return 0;
1394: }
1395:
1396: int clocks_standard(t_datatype stype, t_datatype dtype, t_size size)
1397: {
1398: int stype_imm = (stype == dt_ImmB) || (stype == dt_ImmW) ||
1399: (stype == dt_ImmL) || (stype == dt_Imm3) || (stype == dt_Imm4) ||
1400: (stype == dt_Imm8) || (stype == dt_Imm8s) || (stype == dt_ImmS);
1401:
1402: if (stype_imm) {
1403: if (dtype == dt_Areg) {
1404: return 4;
1405: } else if (dtype == dt_Dreg) {
1406: if (size != sz_long) {
1407: return 0;
1408: } else {
1409: return 4;
1410: }
1411: } else {
1412: if (size != sz_long) {
1413: return 4;
1414: } else {
1415: return 8;
1416: }
1417: }
1418: }
1419:
1420: if (dtype == dt_Areg) {
1421: if (size != sz_long) {
1422: return 4;
1423: } else {
1424: if (stype == dt_Dreg || stype_imm) {
1425: return 4;
1426: } else {
1427: return 2;
1428: }
1429: }
1430: } else if (dtype == dt_Dreg) {
1431: if (size != sz_long) {
1432: return 0;
1433: } else {
1434: if (stype == dt_Dreg || stype_imm) {
1435: return 4;
1436: } else {
1437: return 2;
1438: }
1439: }
1440: } else if (stype == dt_Dreg) {
1441: if (size != sz_long) {
1442: return 4;
1443: } else {
1444: return 8;
1445: }
1446: } else {
1447: printf("Error %d %d.\n", stype, dtype);
1448: exit(1);
1449: }
1450: }
1451:
1452: int clocks_single(t_datatype type, t_size size)
1453: {
1454: if (type == dt_Dreg || type == dt_Areg) {
1455: if (size != sz_long) {
1456: return 4;
1457: } else {
1458: return 6;
1459: }
1460: } else {
1461: if (size != sz_long) {
1462: return 8;
1463: } else {
1464: return 12;
1465: }
1466: }
1467: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.