ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/cebix/BasiliskII/src/uae_cpu/gencpu.c
Revision: 1.25
Committed: 2007-06-30T08:00:31Z (17 years, 1 month ago) by gbeauche
Content type: text/plain
Branch: MAIN
Changes since 1.24: +38 -6 lines
Log Message:
Fix xBCD instruction for 68040 emulation: the NV flags shall not be affected.

File Contents

# Content
1 /*
2 * UAE - The Un*x Amiga Emulator
3 *
4 * MC68000 emulation generator
5 *
6 * This is a fairly stupid program that generates a lot of case labels that
7 * can be #included in a switch statement.
8 * As an alternative, it can generate functions that handle specific
9 * MC68000 instructions, plus a prototype header file and a function pointer
10 * array to look up the function for an opcode.
11 * Error checking is bad, an illegal table68k file will cause the program to
12 * call abort().
13 * The generated code is sometimes sub-optimal, an optimizing compiler should
14 * take care of this.
15 *
16 * Copyright 1995, 1996 Bernd Schmidt
17 */
18
19 #include <ctype.h>
20 #include <stdio.h>
21 #include <stdlib.h>
22 #include <string.h>
23
24 #include "sysdeps.h"
25 #include "readcpu.h"
26
27 #if defined(SPARC_V8_ASSEMBLY) || defined(SPARC_V9_ASSEMBLY)
28 #define SPARC_ASSEMBLY 0
29 #endif
30
31 #define BOOL_TYPE "int"
32
33 /* Define the minimal 680x0 where NV flags are not affected by xBCD instructions. */
34 #define xBCD_KEEPS_NV_FLAGS 4
35
36 static FILE *headerfile;
37 static FILE *stblfile;
38
39 static int using_prefetch;
40 static int using_exception_3;
41 static int cpu_level;
42
43 /* For the current opcode, the next lower level that will have different code.
44 * Initialized to -1 for each opcode. If it remains unchanged, indicates we
45 * are done with that opcode. */
46 static int next_cpu_level;
47
48 static int *opcode_map;
49 static int *opcode_next_clev;
50 static int *opcode_last_postfix;
51 static unsigned long *counts;
52
53 static void read_counts (void)
54 {
55 FILE *file;
56 unsigned long opcode, count, total;
57 char name[20];
58 int nr = 0;
59 memset (counts, 0, 65536 * sizeof *counts);
60
61 file = fopen ("frequent.68k", "r");
62 if (file) {
63 fscanf (file, "Total: %lu\n", &total);
64 while (fscanf (file, "%lx: %lu %s\n", &opcode, &count, name) == 3) {
65 opcode_next_clev[nr] = 4;
66 opcode_last_postfix[nr] = -1;
67 opcode_map[nr++] = opcode;
68 counts[opcode] = count;
69 }
70 fclose (file);
71 }
72 if (nr == nr_cpuop_funcs)
73 return;
74 for (opcode = 0; opcode < 0x10000; opcode++) {
75 if (table68k[opcode].handler == -1 && table68k[opcode].mnemo != i_ILLG
76 && counts[opcode] == 0)
77 {
78 opcode_next_clev[nr] = 4;
79 opcode_last_postfix[nr] = -1;
80 opcode_map[nr++] = opcode;
81 counts[opcode] = count;
82 }
83 }
84 if (nr != nr_cpuop_funcs)
85 abort ();
86 }
87
88 static char endlabelstr[80];
89 static int endlabelno = 0;
90 static int need_endlabel;
91
92 static int n_braces = 0;
93 static int m68k_pc_offset = 0;
94 static int insn_n_cycles;
95
96 static void start_brace (void)
97 {
98 n_braces++;
99 printf ("{");
100 }
101
102 static void close_brace (void)
103 {
104 assert (n_braces > 0);
105 n_braces--;
106 printf ("}");
107 }
108
109 static void finish_braces (void)
110 {
111 while (n_braces > 0)
112 close_brace ();
113 }
114
115 static void pop_braces (int to)
116 {
117 while (n_braces > to)
118 close_brace ();
119 }
120
121 static int bit_size (int size)
122 {
123 switch (size) {
124 case sz_byte: return 8;
125 case sz_word: return 16;
126 case sz_long: return 32;
127 default: abort ();
128 }
129 return 0;
130 }
131
132 static const char *bit_mask (int size)
133 {
134 switch (size) {
135 case sz_byte: return "0xff";
136 case sz_word: return "0xffff";
137 case sz_long: return "0xffffffff";
138 default: abort ();
139 }
140 return 0;
141 }
142
143 static const char *gen_nextilong (void)
144 {
145 static char buffer[80];
146 int r = m68k_pc_offset;
147 m68k_pc_offset += 4;
148
149 insn_n_cycles += 4;
150
151 if (using_prefetch)
152 sprintf (buffer, "get_ilong_prefetch(%d)", r);
153 else
154 sprintf (buffer, "get_ilong(%d)", r);
155 return buffer;
156 }
157
158 static const char *gen_nextiword (void)
159 {
160 static char buffer[80];
161 int r = m68k_pc_offset;
162 m68k_pc_offset += 2;
163
164 insn_n_cycles += 2;
165
166 if (using_prefetch)
167 sprintf (buffer, "get_iword_prefetch(%d)", r);
168 else
169 sprintf (buffer, "get_iword(%d)", r);
170 return buffer;
171 }
172
173 static const char *gen_nextibyte (void)
174 {
175 static char buffer[80];
176 int r = m68k_pc_offset;
177 m68k_pc_offset += 2;
178
179 insn_n_cycles += 2;
180
181 if (using_prefetch)
182 sprintf (buffer, "get_ibyte_prefetch(%d)", r);
183 else
184 sprintf (buffer, "get_ibyte(%d)", r);
185 return buffer;
186 }
187
188 static void fill_prefetch_0 (void)
189 {
190 if (using_prefetch)
191 printf ("fill_prefetch_0 ();\n");
192 }
193
194 static void fill_prefetch_2 (void)
195 {
196 if (using_prefetch)
197 printf ("fill_prefetch_2 ();\n");
198 }
199
200 static void swap_opcode (void)
201 {
202 printf ("#ifdef HAVE_GET_WORD_UNSWAPPED\n");
203 printf ("\topcode = ((opcode << 8) & 0xFF00) | ((opcode >> 8) & 0xFF);\n");
204 printf ("#endif\n");
205 }
206
207 static void sync_m68k_pc (void)
208 {
209 if (m68k_pc_offset == 0)
210 return;
211 printf ("m68k_incpc(%d);\n", m68k_pc_offset);
212 switch (m68k_pc_offset) {
213 case 0:
214 /*fprintf (stderr, "refilling prefetch at 0\n"); */
215 break;
216 case 2:
217 fill_prefetch_2 ();
218 break;
219 default:
220 fill_prefetch_0 ();
221 break;
222 }
223 m68k_pc_offset = 0;
224 }
225
226 /* getv == 1: fetch data; getv != 0: check for odd address. If movem != 0,
227 * the calling routine handles Apdi and Aipi modes.
228 * gb-- movem == 2 means the same thing but for a MOVE16 instruction */
229 static void genamode (amodes mode, char *reg, wordsizes size, char *name, int getv, int movem)
230 {
231 start_brace ();
232 switch (mode) {
233 case Dreg:
234 if (movem)
235 abort ();
236 if (getv == 1)
237 switch (size) {
238 case sz_byte:
239 #if defined(AMIGA) && !defined(WARPUP)
240 /* sam: I don't know why gcc.2.7.2.1 produces a code worse */
241 /* if it is not done like that: */
242 printf ("\tuae_s8 %s = ((uae_u8*)&m68k_dreg(regs, %s))[3];\n", name, reg);
243 #else
244 printf ("\tuae_s8 %s = m68k_dreg(regs, %s);\n", name, reg);
245 #endif
246 break;
247 case sz_word:
248 #if defined(AMIGA) && !defined(WARPUP)
249 printf ("\tuae_s16 %s = ((uae_s16*)&m68k_dreg(regs, %s))[1];\n", name, reg);
250 #else
251 printf ("\tuae_s16 %s = m68k_dreg(regs, %s);\n", name, reg);
252 #endif
253 break;
254 case sz_long:
255 printf ("\tuae_s32 %s = m68k_dreg(regs, %s);\n", name, reg);
256 break;
257 default:
258 abort ();
259 }
260 return;
261 case Areg:
262 if (movem)
263 abort ();
264 if (getv == 1)
265 switch (size) {
266 case sz_word:
267 printf ("\tuae_s16 %s = m68k_areg(regs, %s);\n", name, reg);
268 break;
269 case sz_long:
270 printf ("\tuae_s32 %s = m68k_areg(regs, %s);\n", name, reg);
271 break;
272 default:
273 abort ();
274 }
275 return;
276 case Aind:
277 printf ("\tuaecptr %sa = m68k_areg(regs, %s);\n", name, reg);
278 break;
279 case Aipi:
280 printf ("\tuaecptr %sa = m68k_areg(regs, %s);\n", name, reg);
281 break;
282 case Apdi:
283 switch (size) {
284 case sz_byte:
285 if (movem)
286 printf ("\tuaecptr %sa = m68k_areg(regs, %s);\n", name, reg);
287 else
288 printf ("\tuaecptr %sa = m68k_areg(regs, %s) - areg_byteinc[%s];\n", name, reg, reg);
289 break;
290 case sz_word:
291 printf ("\tuaecptr %sa = m68k_areg(regs, %s) - %d;\n", name, reg, movem ? 0 : 2);
292 break;
293 case sz_long:
294 printf ("\tuaecptr %sa = m68k_areg(regs, %s) - %d;\n", name, reg, movem ? 0 : 4);
295 break;
296 default:
297 abort ();
298 }
299 break;
300 case Ad16:
301 printf ("\tuaecptr %sa = m68k_areg(regs, %s) + (uae_s32)(uae_s16)%s;\n", name, reg, gen_nextiword ());
302 break;
303 case Ad8r:
304 if (cpu_level > 1) {
305 if (next_cpu_level < 1)
306 next_cpu_level = 1;
307 sync_m68k_pc ();
308 start_brace ();
309 printf ("\tuaecptr %sa = get_disp_ea_020(m68k_areg(regs, %s), next_iword());\n", name, reg);
310 } else
311 printf ("\tuaecptr %sa = get_disp_ea_000(m68k_areg(regs, %s), %s);\n", name, reg, gen_nextiword ());
312
313 break;
314 case PC16:
315 printf ("\tuaecptr %sa = m68k_getpc () + %d;\n", name, m68k_pc_offset);
316 printf ("\t%sa += (uae_s32)(uae_s16)%s;\n", name, gen_nextiword ());
317 break;
318 case PC8r:
319 if (cpu_level > 1) {
320 if (next_cpu_level < 1)
321 next_cpu_level = 1;
322 sync_m68k_pc ();
323 start_brace ();
324 printf ("\tuaecptr tmppc = m68k_getpc();\n");
325 printf ("\tuaecptr %sa = get_disp_ea_020(tmppc, next_iword());\n", name);
326 } else {
327 printf ("\tuaecptr tmppc = m68k_getpc() + %d;\n", m68k_pc_offset);
328 printf ("\tuaecptr %sa = get_disp_ea_000(tmppc, %s);\n", name, gen_nextiword ());
329 }
330
331 break;
332 case absw:
333 printf ("\tuaecptr %sa = (uae_s32)(uae_s16)%s;\n", name, gen_nextiword ());
334 break;
335 case absl:
336 printf ("\tuaecptr %sa = %s;\n", name, gen_nextilong ());
337 break;
338 case imm:
339 if (getv != 1)
340 abort ();
341 switch (size) {
342 case sz_byte:
343 printf ("\tuae_s8 %s = %s;\n", name, gen_nextibyte ());
344 break;
345 case sz_word:
346 printf ("\tuae_s16 %s = %s;\n", name, gen_nextiword ());
347 break;
348 case sz_long:
349 printf ("\tuae_s32 %s = %s;\n", name, gen_nextilong ());
350 break;
351 default:
352 abort ();
353 }
354 return;
355 case imm0:
356 if (getv != 1)
357 abort ();
358 printf ("\tuae_s8 %s = %s;\n", name, gen_nextibyte ());
359 return;
360 case imm1:
361 if (getv != 1)
362 abort ();
363 printf ("\tuae_s16 %s = %s;\n", name, gen_nextiword ());
364 return;
365 case imm2:
366 if (getv != 1)
367 abort ();
368 printf ("\tuae_s32 %s = %s;\n", name, gen_nextilong ());
369 return;
370 case immi:
371 if (getv != 1)
372 abort ();
373 printf ("\tuae_u32 %s = %s;\n", name, reg);
374 return;
375 default:
376 abort ();
377 }
378
379 /* We get here for all non-reg non-immediate addressing modes to
380 * actually fetch the value. */
381
382 if (using_exception_3 && getv != 0 && size != sz_byte) {
383 printf ("\tif ((%sa & 1) != 0) {\n", name);
384 printf ("\t\tlast_fault_for_exception_3 = %sa;\n", name);
385 printf ("\t\tlast_op_for_exception_3 = opcode;\n");
386 printf ("\t\tlast_addr_for_exception_3 = m68k_getpc() + %d;\n", m68k_pc_offset);
387 printf ("\t\tException(3, 0);\n");
388 printf ("\t\tgoto %s;\n", endlabelstr);
389 printf ("\t}\n");
390 need_endlabel = 1;
391 start_brace ();
392 }
393
394 if (getv == 1) {
395 switch (size) {
396 case sz_byte: insn_n_cycles += 2; break;
397 case sz_word: insn_n_cycles += 2; break;
398 case sz_long: insn_n_cycles += 4; break;
399 default: abort ();
400 }
401 start_brace ();
402 switch (size) {
403 case sz_byte: printf ("\tuae_s8 %s = get_byte(%sa);\n", name, name); break;
404 case sz_word: printf ("\tuae_s16 %s = get_word(%sa);\n", name, name); break;
405 case sz_long: printf ("\tuae_s32 %s = get_long(%sa);\n", name, name); break;
406 default: abort ();
407 }
408 }
409
410 /* We now might have to fix up the register for pre-dec or post-inc
411 * addressing modes. */
412 if (!movem)
413 switch (mode) {
414 case Aipi:
415 switch (size) {
416 case sz_byte:
417 printf ("\tm68k_areg(regs, %s) += areg_byteinc[%s];\n", reg, reg);
418 break;
419 case sz_word:
420 printf ("\tm68k_areg(regs, %s) += 2;\n", reg);
421 break;
422 case sz_long:
423 printf ("\tm68k_areg(regs, %s) += 4;\n", reg);
424 break;
425 default:
426 abort ();
427 }
428 break;
429 case Apdi:
430 printf ("\tm68k_areg (regs, %s) = %sa;\n", reg, name);
431 break;
432 default:
433 break;
434 }
435 }
436
437 static void genastore (char *from, amodes mode, char *reg, wordsizes size, char *to)
438 {
439 switch (mode) {
440 case Dreg:
441 switch (size) {
442 case sz_byte:
443 printf ("\tm68k_dreg(regs, %s) = (m68k_dreg(regs, %s) & ~0xff) | ((%s) & 0xff);\n", reg, reg, from);
444 break;
445 case sz_word:
446 printf ("\tm68k_dreg(regs, %s) = (m68k_dreg(regs, %s) & ~0xffff) | ((%s) & 0xffff);\n", reg, reg, from);
447 break;
448 case sz_long:
449 printf ("\tm68k_dreg(regs, %s) = (%s);\n", reg, from);
450 break;
451 default:
452 abort ();
453 }
454 break;
455 case Areg:
456 switch (size) {
457 case sz_word:
458 fprintf (stderr, "Foo\n");
459 printf ("\tm68k_areg(regs, %s) = (uae_s32)(uae_s16)(%s);\n", reg, from);
460 break;
461 case sz_long:
462 printf ("\tm68k_areg(regs, %s) = (%s);\n", reg, from);
463 break;
464 default:
465 abort ();
466 }
467 break;
468 case Aind:
469 case Aipi:
470 case Apdi:
471 case Ad16:
472 case Ad8r:
473 case absw:
474 case absl:
475 case PC16:
476 case PC8r:
477 if (using_prefetch)
478 sync_m68k_pc ();
479 switch (size) {
480 case sz_byte:
481 insn_n_cycles += 2;
482 printf ("\tput_byte(%sa,%s);\n", to, from);
483 break;
484 case sz_word:
485 insn_n_cycles += 2;
486 if (cpu_level < 2 && (mode == PC16 || mode == PC8r))
487 abort ();
488 printf ("\tput_word(%sa,%s);\n", to, from);
489 break;
490 case sz_long:
491 insn_n_cycles += 4;
492 if (cpu_level < 2 && (mode == PC16 || mode == PC8r))
493 abort ();
494 printf ("\tput_long(%sa,%s);\n", to, from);
495 break;
496 default:
497 abort ();
498 }
499 break;
500 case imm:
501 case imm0:
502 case imm1:
503 case imm2:
504 case immi:
505 abort ();
506 break;
507 default:
508 abort ();
509 }
510 }
511
512 static void genmovemel (uae_u16 opcode)
513 {
514 char getcode[100];
515 int size = table68k[opcode].size == sz_long ? 4 : 2;
516
517 if (table68k[opcode].size == sz_long) {
518 strcpy (getcode, "get_long(srca)");
519 } else {
520 strcpy (getcode, "(uae_s32)(uae_s16)get_word(srca)");
521 }
522
523 printf ("\tuae_u16 mask = %s;\n", gen_nextiword ());
524 printf ("\tunsigned int dmask = mask & 0xff, amask = (mask >> 8) & 0xff;\n");
525 genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "src", 2, 1);
526 start_brace ();
527 printf ("\twhile (dmask) { m68k_dreg(regs, movem_index1[dmask]) = %s; srca += %d; dmask = movem_next[dmask]; }\n",
528 getcode, size);
529 printf ("\twhile (amask) { m68k_areg(regs, movem_index1[amask]) = %s; srca += %d; amask = movem_next[amask]; }\n",
530 getcode, size);
531
532 if (table68k[opcode].dmode == Aipi)
533 printf ("\tm68k_areg(regs, dstreg) = srca;\n");
534 }
535
536 static void genmovemle (uae_u16 opcode)
537 {
538 char putcode[100];
539 int size = table68k[opcode].size == sz_long ? 4 : 2;
540 if (table68k[opcode].size == sz_long) {
541 strcpy (putcode, "put_long(srca,");
542 } else {
543 strcpy (putcode, "put_word(srca,");
544 }
545
546 printf ("\tuae_u16 mask = %s;\n", gen_nextiword ());
547 genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "src", 2, 1);
548 if (using_prefetch)
549 sync_m68k_pc ();
550
551 start_brace ();
552 if (table68k[opcode].dmode == Apdi) {
553 printf ("\tuae_u16 amask = mask & 0xff, dmask = (mask >> 8) & 0xff;\n");
554 printf ("\twhile (amask) { srca -= %d; %s m68k_areg(regs, movem_index2[amask])); amask = movem_next[amask]; }\n",
555 size, putcode);
556 printf ("\twhile (dmask) { srca -= %d; %s m68k_dreg(regs, movem_index2[dmask])); dmask = movem_next[dmask]; }\n",
557 size, putcode);
558 printf ("\tm68k_areg(regs, dstreg) = srca;\n");
559 } else {
560 printf ("\tuae_u16 dmask = mask & 0xff, amask = (mask >> 8) & 0xff;\n");
561 printf ("\twhile (dmask) { %s m68k_dreg(regs, movem_index1[dmask])); srca += %d; dmask = movem_next[dmask]; }\n",
562 putcode, size);
563 printf ("\twhile (amask) { %s m68k_areg(regs, movem_index1[amask])); srca += %d; amask = movem_next[amask]; }\n",
564 putcode, size);
565 }
566 }
567
568 static void duplicate_carry (void)
569 {
570 printf ("\tCOPY_CARRY;\n");
571 }
572
573 typedef enum {
574 flag_logical_noclobber, flag_logical, flag_add, flag_sub, flag_cmp, flag_addx, flag_subx, flag_z, flag_zn,
575 flag_av, flag_sv
576 } flagtypes;
577
578 static void genflags_normal (flagtypes type, wordsizes size, char *value, char *src, char *dst)
579 {
580 char vstr[100], sstr[100], dstr[100];
581 char usstr[100], udstr[100];
582 char unsstr[100], undstr[100];
583
584 switch (size) {
585 case sz_byte:
586 strcpy (vstr, "((uae_s8)(");
587 strcpy (usstr, "((uae_u8)(");
588 break;
589 case sz_word:
590 strcpy (vstr, "((uae_s16)(");
591 strcpy (usstr, "((uae_u16)(");
592 break;
593 case sz_long:
594 strcpy (vstr, "((uae_s32)(");
595 strcpy (usstr, "((uae_u32)(");
596 break;
597 default:
598 abort ();
599 }
600 strcpy (unsstr, usstr);
601
602 strcpy (sstr, vstr);
603 strcpy (dstr, vstr);
604 strcat (vstr, value);
605 strcat (vstr, "))");
606 strcat (dstr, dst);
607 strcat (dstr, "))");
608 strcat (sstr, src);
609 strcat (sstr, "))");
610
611 strcpy (udstr, usstr);
612 strcat (udstr, dst);
613 strcat (udstr, "))");
614 strcat (usstr, src);
615 strcat (usstr, "))");
616
617 strcpy (undstr, unsstr);
618 strcat (unsstr, "-");
619 strcat (undstr, "~");
620 strcat (undstr, dst);
621 strcat (undstr, "))");
622 strcat (unsstr, src);
623 strcat (unsstr, "))");
624
625 switch (type) {
626 case flag_logical_noclobber:
627 case flag_logical:
628 case flag_z:
629 case flag_zn:
630 case flag_av:
631 case flag_sv:
632 case flag_addx:
633 case flag_subx:
634 break;
635
636 case flag_add:
637 start_brace ();
638 printf ("uae_u32 %s = %s + %s;\n", value, dstr, sstr);
639 break;
640 case flag_sub:
641 case flag_cmp:
642 start_brace ();
643 printf ("uae_u32 %s = %s - %s;\n", value, dstr, sstr);
644 break;
645 }
646
647 switch (type) {
648 case flag_logical_noclobber:
649 case flag_logical:
650 case flag_z:
651 case flag_zn:
652 break;
653
654 case flag_add:
655 case flag_sub:
656 case flag_addx:
657 case flag_subx:
658 case flag_cmp:
659 case flag_av:
660 case flag_sv:
661 start_brace ();
662 printf ("\t" BOOL_TYPE " flgs = %s < 0;\n", sstr);
663 printf ("\t" BOOL_TYPE " flgo = %s < 0;\n", dstr);
664 printf ("\t" BOOL_TYPE " flgn = %s < 0;\n", vstr);
665 break;
666 }
667
668 switch (type) {
669 case flag_logical:
670 printf ("\tCLEAR_CZNV;\n");
671 printf ("\tSET_ZFLG (%s == 0);\n", vstr);
672 printf ("\tSET_NFLG (%s < 0);\n", vstr);
673 break;
674 case flag_logical_noclobber:
675 printf ("\tSET_ZFLG (%s == 0);\n", vstr);
676 printf ("\tSET_NFLG (%s < 0);\n", vstr);
677 break;
678 case flag_av:
679 printf ("\tSET_VFLG ((flgs ^ flgn) & (flgo ^ flgn));\n");
680 break;
681 case flag_sv:
682 printf ("\tSET_VFLG ((flgs ^ flgo) & (flgn ^ flgo));\n");
683 break;
684 case flag_z:
685 printf ("\tSET_ZFLG (GET_ZFLG & (%s == 0));\n", vstr);
686 break;
687 case flag_zn:
688 printf ("\tSET_ZFLG (GET_ZFLG & (%s == 0));\n", vstr);
689 printf ("\tSET_NFLG (%s < 0);\n", vstr);
690 break;
691 case flag_add:
692 printf ("\tSET_ZFLG (%s == 0);\n", vstr);
693 printf ("\tSET_VFLG ((flgs ^ flgn) & (flgo ^ flgn));\n");
694 printf ("\tSET_CFLG (%s < %s);\n", undstr, usstr);
695 duplicate_carry ();
696 printf ("\tSET_NFLG (flgn != 0);\n");
697 break;
698 case flag_sub:
699 printf ("\tSET_ZFLG (%s == 0);\n", vstr);
700 printf ("\tSET_VFLG ((flgs ^ flgo) & (flgn ^ flgo));\n");
701 printf ("\tSET_CFLG (%s > %s);\n", usstr, udstr);
702 duplicate_carry ();
703 printf ("\tSET_NFLG (flgn != 0);\n");
704 break;
705 case flag_addx:
706 printf ("\tSET_VFLG ((flgs ^ flgn) & (flgo ^ flgn));\n"); /* minterm SON: 0x42 */
707 printf ("\tSET_CFLG (flgs ^ ((flgs ^ flgo) & (flgo ^ flgn)));\n"); /* minterm SON: 0xD4 */
708 duplicate_carry ();
709 break;
710 case flag_subx:
711 printf ("\tSET_VFLG ((flgs ^ flgo) & (flgo ^ flgn));\n"); /* minterm SON: 0x24 */
712 printf ("\tSET_CFLG (flgs ^ ((flgs ^ flgn) & (flgo ^ flgn)));\n"); /* minterm SON: 0xB2 */
713 duplicate_carry ();
714 break;
715 case flag_cmp:
716 printf ("\tSET_ZFLG (%s == 0);\n", vstr);
717 printf ("\tSET_VFLG ((flgs != flgo) && (flgn != flgo));\n");
718 printf ("\tSET_CFLG (%s > %s);\n", usstr, udstr);
719 printf ("\tSET_NFLG (flgn != 0);\n");
720 break;
721 }
722 }
723
724 static void genflags (flagtypes type, wordsizes size, char *value, char *src, char *dst)
725 {
726 /* Temporarily deleted 68k/ARM flag optimizations. I'd prefer to have
727 them in the appropriate m68k.h files and use just one copy of this
728 code here. The API can be changed if necessary. */
729 #ifdef OPTIMIZED_FLAGS
730 switch (type) {
731 case flag_add:
732 case flag_sub:
733 start_brace ();
734 printf ("\tuae_u32 %s;\n", value);
735 break;
736 default:
737 break;
738 }
739
740 /* At least some of those casts are fairly important! */
741 switch (type) {
742 case flag_logical_noclobber:
743 printf ("\t{uae_u32 oldcznv = GET_CZNV & ~(FLAGVAL_Z | FLAGVAL_N);\n");
744 if (strcmp (value, "0") == 0) {
745 printf ("\tSET_CZNV (olcznv | FLAGVAL_Z);\n");
746 } else {
747 switch (size) {
748 case sz_byte: printf ("\toptflag_testb ((uae_s8)(%s));\n", value); break;
749 case sz_word: printf ("\toptflag_testw ((uae_s16)(%s));\n", value); break;
750 case sz_long: printf ("\toptflag_testl ((uae_s32)(%s));\n", value); break;
751 }
752 printf ("\tIOR_CZNV (oldcznv);\n");
753 }
754 printf ("\t}\n");
755 return;
756
757 case flag_logical:
758 if (strcmp (value, "0") == 0) {
759 printf ("\tSET_CZNV (FLAGVAL_Z);\n");
760 } else {
761 switch (size) {
762 case sz_byte: printf ("\toptflag_testb ((uae_s8)(%s));\n", value); break;
763 case sz_word: printf ("\toptflag_testw ((uae_s16)(%s));\n", value); break;
764 case sz_long: printf ("\toptflag_testl ((uae_s32)(%s));\n", value); break;
765 }
766 }
767 return;
768
769 case flag_add:
770 switch (size) {
771 case sz_byte: printf ("\toptflag_addb (%s, (uae_s8)(%s), (uae_s8)(%s));\n", value, src, dst); break;
772 case sz_word: printf ("\toptflag_addw (%s, (uae_s16)(%s), (uae_s16)(%s));\n", value, src, dst); break;
773 case sz_long: printf ("\toptflag_addl (%s, (uae_s32)(%s), (uae_s32)(%s));\n", value, src, dst); break;
774 }
775 return;
776
777 case flag_sub:
778 switch (size) {
779 case sz_byte: printf ("\toptflag_subb (%s, (uae_s8)(%s), (uae_s8)(%s));\n", value, src, dst); break;
780 case sz_word: printf ("\toptflag_subw (%s, (uae_s16)(%s), (uae_s16)(%s));\n", value, src, dst); break;
781 case sz_long: printf ("\toptflag_subl (%s, (uae_s32)(%s), (uae_s32)(%s));\n", value, src, dst); break;
782 }
783 return;
784
785 case flag_cmp:
786 switch (size) {
787 case sz_byte: printf ("\toptflag_cmpb ((uae_s8)(%s), (uae_s8)(%s));\n", src, dst); break;
788 case sz_word: printf ("\toptflag_cmpw ((uae_s16)(%s), (uae_s16)(%s));\n", src, dst); break;
789 case sz_long: printf ("\toptflag_cmpl ((uae_s32)(%s), (uae_s32)(%s));\n", src, dst); break;
790 }
791 return;
792
793 default:
794 break;
795 }
796 #endif
797 genflags_normal (type, size, value, src, dst);
798 }
799
800 static void force_range_for_rox (const char *var, wordsizes size)
801 {
802 /* Could do a modulo operation here... which one is faster? */
803 switch (size) {
804 case sz_long:
805 printf ("\tif (%s >= 33) %s -= 33;\n", var, var);
806 break;
807 case sz_word:
808 printf ("\tif (%s >= 34) %s -= 34;\n", var, var);
809 printf ("\tif (%s >= 17) %s -= 17;\n", var, var);
810 break;
811 case sz_byte:
812 printf ("\tif (%s >= 36) %s -= 36;\n", var, var);
813 printf ("\tif (%s >= 18) %s -= 18;\n", var, var);
814 printf ("\tif (%s >= 9) %s -= 9;\n", var, var);
815 break;
816 }
817 }
818
819 static const char *cmask (wordsizes size)
820 {
821 switch (size) {
822 case sz_byte: return "0x80";
823 case sz_word: return "0x8000";
824 case sz_long: return "0x80000000";
825 default: abort ();
826 }
827 }
828
829 static int source_is_imm1_8 (struct instr *i)
830 {
831 return i->stype == 3;
832 }
833
834 static void gen_opcode (unsigned long int opcode)
835 {
836 struct instr *curi = table68k + opcode;
837 insn_n_cycles = 2;
838
839 start_brace ();
840 #if 0
841 printf ("uae_u8 *m68k_pc = regs.pc_p;\n");
842 #endif
843 m68k_pc_offset = 2;
844 switch (curi->plev) {
845 case 0: /* not privileged */
846 break;
847 case 1: /* unprivileged only on 68000 */
848 if (cpu_level == 0)
849 break;
850 if (next_cpu_level < 0)
851 next_cpu_level = 0;
852
853 /* fall through */
854 case 2: /* priviledged */
855 printf ("if (!regs.s) { Exception(8,0); goto %s; }\n", endlabelstr);
856 need_endlabel = 1;
857 start_brace ();
858 break;
859 case 3: /* privileged if size == word */
860 if (curi->size == sz_byte)
861 break;
862 printf ("if (!regs.s) { Exception(8,0); goto %s; }\n", endlabelstr);
863 need_endlabel = 1;
864 start_brace ();
865 break;
866 }
867 switch (curi->mnemo) {
868 case i_OR:
869 case i_AND:
870 case i_EOR:
871 genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
872 genamode (curi->dmode, "dstreg", curi->size, "dst", 1, 0);
873 printf ("\tsrc %c= dst;\n", curi->mnemo == i_OR ? '|' : curi->mnemo == i_AND ? '&' : '^');
874 genflags (flag_logical, curi->size, "src", "", "");
875 genastore ("src", curi->dmode, "dstreg", curi->size, "dst");
876 break;
877 case i_ORSR:
878 case i_EORSR:
879 printf ("\tMakeSR();\n");
880 genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
881 if (curi->size == sz_byte) {
882 printf ("\tsrc &= 0xFF;\n");
883 }
884 printf ("\tregs.sr %c= src;\n", curi->mnemo == i_EORSR ? '^' : '|');
885 printf ("\tMakeFromSR();\n");
886 break;
887 case i_ANDSR:
888 printf ("\tMakeSR();\n");
889 genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
890 if (curi->size == sz_byte) {
891 printf ("\tsrc |= 0xFF00;\n");
892 }
893 printf ("\tregs.sr &= src;\n");
894 printf ("\tMakeFromSR();\n");
895 break;
896 case i_SUB:
897 genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
898 genamode (curi->dmode, "dstreg", curi->size, "dst", 1, 0);
899 start_brace ();
900 genflags (flag_sub, curi->size, "newv", "src", "dst");
901 genastore ("newv", curi->dmode, "dstreg", curi->size, "dst");
902 break;
903 case i_SUBA:
904 genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
905 genamode (curi->dmode, "dstreg", sz_long, "dst", 1, 0);
906 start_brace ();
907 printf ("\tuae_u32 newv = dst - src;\n");
908 genastore ("newv", curi->dmode, "dstreg", sz_long, "dst");
909 break;
910 case i_SUBX:
911 genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
912 genamode (curi->dmode, "dstreg", curi->size, "dst", 1, 0);
913 start_brace ();
914 printf ("\tuae_u32 newv = dst - src - (GET_XFLG ? 1 : 0);\n");
915 genflags (flag_subx, curi->size, "newv", "src", "dst");
916 genflags (flag_zn, curi->size, "newv", "", "");
917 genastore ("newv", curi->dmode, "dstreg", curi->size, "dst");
918 break;
919 case i_SBCD:
920 genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
921 genamode (curi->dmode, "dstreg", curi->size, "dst", 1, 0);
922 start_brace ();
923 printf ("\tuae_u16 newv_lo = (dst & 0xF) - (src & 0xF) - (GET_XFLG ? 1 : 0);\n");
924 printf ("\tuae_u16 newv_hi = (dst & 0xF0) - (src & 0xF0);\n");
925 printf ("\tuae_u16 newv, tmp_newv;\n");
926 printf ("\tint bcd = 0;\n");
927 printf ("\tnewv = tmp_newv = newv_hi + newv_lo;\n");
928 printf ("\tif (newv_lo & 0xF0) { newv -= 6; bcd = 6; };\n");
929 printf ("\tif ((((dst & 0xFF) - (src & 0xFF) - (GET_XFLG ? 1 : 0)) & 0x100) > 0xFF) { newv -= 0x60; }\n");
930 printf ("\tSET_CFLG ((((dst & 0xFF) - (src & 0xFF) - bcd - (GET_XFLG ? 1 : 0)) & 0x300) > 0xFF);\n");
931 duplicate_carry ();
932 /* Manual says bits NV are undefined though a real 68040 don't change them */
933 if (cpu_level >= xBCD_KEEPS_NV_FLAGS) {
934 if (next_cpu_level < xBCD_KEEPS_NV_FLAGS)
935 next_cpu_level = xBCD_KEEPS_NV_FLAGS - 1;
936 genflags (flag_z, curi->size, "newv", "", "");
937 }
938 else {
939 genflags (flag_zn, curi->size, "newv", "", "");
940 printf ("\tSET_VFLG ((tmp_newv & 0x80) != 0 && (newv & 0x80) == 0);\n");
941 }
942 genastore ("newv", curi->dmode, "dstreg", curi->size, "dst");
943 break;
944 case i_ADD:
945 genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
946 genamode (curi->dmode, "dstreg", curi->size, "dst", 1, 0);
947 start_brace ();
948 genflags (flag_add, curi->size, "newv", "src", "dst");
949 genastore ("newv", curi->dmode, "dstreg", curi->size, "dst");
950 break;
951 case i_ADDA:
952 genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
953 genamode (curi->dmode, "dstreg", sz_long, "dst", 1, 0);
954 start_brace ();
955 printf ("\tuae_u32 newv = dst + src;\n");
956 genastore ("newv", curi->dmode, "dstreg", sz_long, "dst");
957 break;
958 case i_ADDX:
959 genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
960 genamode (curi->dmode, "dstreg", curi->size, "dst", 1, 0);
961 start_brace ();
962 printf ("\tuae_u32 newv = dst + src + (GET_XFLG ? 1 : 0);\n");
963 genflags (flag_addx, curi->size, "newv", "src", "dst");
964 genflags (flag_zn, curi->size, "newv", "", "");
965 genastore ("newv", curi->dmode, "dstreg", curi->size, "dst");
966 break;
967 case i_ABCD:
968 genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
969 genamode (curi->dmode, "dstreg", curi->size, "dst", 1, 0);
970 start_brace ();
971 printf ("\tuae_u16 newv_lo = (src & 0xF) + (dst & 0xF) + (GET_XFLG ? 1 : 0);\n");
972 printf ("\tuae_u16 newv_hi = (src & 0xF0) + (dst & 0xF0);\n");
973 printf ("\tuae_u16 newv, tmp_newv;\n");
974 printf ("\tint cflg;\n");
975 printf ("\tnewv = tmp_newv = newv_hi + newv_lo;\n");
976 printf ("\tif (newv_lo > 9) { newv += 6; }\n");
977 printf ("\tcflg = (newv & 0x3F0) > 0x90;\n");
978 printf ("\tif (cflg) newv += 0x60;\n");
979 printf ("\tSET_CFLG (cflg);\n");
980 duplicate_carry ();
981 /* Manual says bits NV are undefined though a real 68040 don't change them */
982 if (cpu_level >= xBCD_KEEPS_NV_FLAGS) {
983 if (next_cpu_level < xBCD_KEEPS_NV_FLAGS)
984 next_cpu_level = xBCD_KEEPS_NV_FLAGS - 1;
985 genflags (flag_z, curi->size, "newv", "", "");
986 }
987 else {
988 genflags (flag_zn, curi->size, "newv", "", "");
989 printf ("\tSET_VFLG ((tmp_newv & 0x80) == 0 && (newv & 0x80) != 0);\n");
990 }
991 genastore ("newv", curi->dmode, "dstreg", curi->size, "dst");
992 break;
993 case i_NEG:
994 genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
995 start_brace ();
996 genflags (flag_sub, curi->size, "dst", "src", "0");
997 genastore ("dst", curi->smode, "srcreg", curi->size, "src");
998 break;
999 case i_NEGX:
1000 genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
1001 start_brace ();
1002 printf ("\tuae_u32 newv = 0 - src - (GET_XFLG ? 1 : 0);\n");
1003 genflags (flag_subx, curi->size, "newv", "src", "0");
1004 genflags (flag_zn, curi->size, "newv", "", "");
1005 genastore ("newv", curi->smode, "srcreg", curi->size, "src");
1006 break;
1007 case i_NBCD:
1008 genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
1009 start_brace ();
1010 printf ("\tuae_u16 newv_lo = - (src & 0xF) - (GET_XFLG ? 1 : 0);\n");
1011 printf ("\tuae_u16 newv_hi = - (src & 0xF0);\n");
1012 printf ("\tuae_u16 newv;\n");
1013 printf ("\tint cflg;\n");
1014 printf ("\tif (newv_lo > 9) { newv_lo -= 6; }\n");
1015 printf ("\tnewv = newv_hi + newv_lo;\n");
1016 printf ("\tcflg = (newv & 0x1F0) > 0x90;\n");
1017 printf ("\tif (cflg) newv -= 0x60;\n");
1018 printf ("\tSET_CFLG (cflg);\n");
1019 duplicate_carry();
1020 /* Manual says bits NV are undefined though a real 68040 don't change them */
1021 if (cpu_level >= xBCD_KEEPS_NV_FLAGS) {
1022 if (next_cpu_level < xBCD_KEEPS_NV_FLAGS)
1023 next_cpu_level = xBCD_KEEPS_NV_FLAGS - 1;
1024 genflags (flag_z, curi->size, "newv", "", "");
1025 }
1026 else {
1027 genflags (flag_zn, curi->size, "newv", "", "");
1028 }
1029 genastore ("newv", curi->smode, "srcreg", curi->size, "src");
1030 break;
1031 case i_CLR:
1032 genamode (curi->smode, "srcreg", curi->size, "src", 2, 0);
1033 genflags (flag_logical, curi->size, "0", "", "");
1034 genastore ("0", curi->smode, "srcreg", curi->size, "src");
1035 break;
1036 case i_NOT:
1037 genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
1038 start_brace ();
1039 printf ("\tuae_u32 dst = ~src;\n");
1040 genflags (flag_logical, curi->size, "dst", "", "");
1041 genastore ("dst", curi->smode, "srcreg", curi->size, "src");
1042 break;
1043 case i_TST:
1044 genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
1045 genflags (flag_logical, curi->size, "src", "", "");
1046 break;
1047 case i_BTST:
1048 genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
1049 genamode (curi->dmode, "dstreg", curi->size, "dst", 1, 0);
1050 if (curi->size == sz_byte)
1051 printf ("\tsrc &= 7;\n");
1052 else
1053 printf ("\tsrc &= 31;\n");
1054 printf ("\tSET_ZFLG (1 ^ ((dst >> src) & 1));\n");
1055 break;
1056 case i_BCHG:
1057 genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
1058 genamode (curi->dmode, "dstreg", curi->size, "dst", 1, 0);
1059 if (curi->size == sz_byte)
1060 printf ("\tsrc &= 7;\n");
1061 else
1062 printf ("\tsrc &= 31;\n");
1063 printf ("\tdst ^= (1 << src);\n");
1064 printf ("\tSET_ZFLG (((uae_u32)dst & (1 << src)) >> src);\n");
1065 genastore ("dst", curi->dmode, "dstreg", curi->size, "dst");
1066 break;
1067 case i_BCLR:
1068 genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
1069 genamode (curi->dmode, "dstreg", curi->size, "dst", 1, 0);
1070 if (curi->size == sz_byte)
1071 printf ("\tsrc &= 7;\n");
1072 else
1073 printf ("\tsrc &= 31;\n");
1074 printf ("\tSET_ZFLG (1 ^ ((dst >> src) & 1));\n");
1075 printf ("\tdst &= ~(1 << src);\n");
1076 genastore ("dst", curi->dmode, "dstreg", curi->size, "dst");
1077 break;
1078 case i_BSET:
1079 genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
1080 genamode (curi->dmode, "dstreg", curi->size, "dst", 1, 0);
1081 if (curi->size == sz_byte)
1082 printf ("\tsrc &= 7;\n");
1083 else
1084 printf ("\tsrc &= 31;\n");
1085 printf ("\tSET_ZFLG (1 ^ ((dst >> src) & 1));\n");
1086 printf ("\tdst |= (1 << src);\n");
1087 genastore ("dst", curi->dmode, "dstreg", curi->size, "dst");
1088 break;
1089 case i_CMPM:
1090 case i_CMP:
1091 genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
1092 genamode (curi->dmode, "dstreg", curi->size, "dst", 1, 0);
1093 start_brace ();
1094 genflags (flag_cmp, curi->size, "newv", "src", "dst");
1095 break;
1096 case i_CMPA:
1097 genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
1098 genamode (curi->dmode, "dstreg", sz_long, "dst", 1, 0);
1099 start_brace ();
1100 genflags (flag_cmp, sz_long, "newv", "src", "dst");
1101 break;
1102 /* The next two are coded a little unconventional, but they are doing
1103 * weird things... */
1104 case i_MVPRM:
1105 genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
1106
1107 printf ("\tuaecptr memp = m68k_areg(regs, dstreg) + (uae_s32)(uae_s16)%s;\n", gen_nextiword ());
1108 if (curi->size == sz_word) {
1109 printf ("\tput_byte(memp, src >> 8); put_byte(memp + 2, src);\n");
1110 } else {
1111 printf ("\tput_byte(memp, src >> 24); put_byte(memp + 2, src >> 16);\n");
1112 printf ("\tput_byte(memp + 4, src >> 8); put_byte(memp + 6, src);\n");
1113 }
1114 break;
1115 case i_MVPMR:
1116 printf ("\tuaecptr memp = m68k_areg(regs, srcreg) + (uae_s32)(uae_s16)%s;\n", gen_nextiword ());
1117 genamode (curi->dmode, "dstreg", curi->size, "dst", 2, 0);
1118 if (curi->size == sz_word) {
1119 printf ("\tuae_u16 val = (get_byte(memp) << 8) + get_byte(memp + 2);\n");
1120 } else {
1121 printf ("\tuae_u32 val = (get_byte(memp) << 24) + (get_byte(memp + 2) << 16)\n");
1122 printf (" + (get_byte(memp + 4) << 8) + get_byte(memp + 6);\n");
1123 }
1124 genastore ("val", curi->dmode, "dstreg", curi->size, "dst");
1125 break;
1126 case i_MOVE:
1127 genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
1128 genamode (curi->dmode, "dstreg", curi->size, "dst", 2, 0);
1129 genflags (flag_logical, curi->size, "src", "", "");
1130 genastore ("src", curi->dmode, "dstreg", curi->size, "dst");
1131 break;
1132 case i_MOVEA:
1133 genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
1134 genamode (curi->dmode, "dstreg", curi->size, "dst", 2, 0);
1135 if (curi->size == sz_word) {
1136 printf ("\tuae_u32 val = (uae_s32)(uae_s16)src;\n");
1137 } else {
1138 printf ("\tuae_u32 val = src;\n");
1139 }
1140 genastore ("val", curi->dmode, "dstreg", sz_long, "dst");
1141 break;
1142 case i_MVSR2:
1143 genamode (curi->smode, "srcreg", sz_word, "src", 2, 0);
1144 printf ("\tMakeSR();\n");
1145 if (curi->size == sz_byte)
1146 genastore ("regs.sr & 0xff", curi->smode, "srcreg", sz_word, "src");
1147 else
1148 genastore ("regs.sr", curi->smode, "srcreg", sz_word, "src");
1149 break;
1150 case i_MV2SR:
1151 genamode (curi->smode, "srcreg", sz_word, "src", 1, 0);
1152 if (curi->size == sz_byte)
1153 printf ("\tMakeSR();\n\tregs.sr &= 0xFF00;\n\tregs.sr |= src & 0xFF;\n");
1154 else {
1155 printf ("\tregs.sr = src;\n");
1156 }
1157 printf ("\tMakeFromSR();\n");
1158 break;
1159 case i_SWAP:
1160 genamode (curi->smode, "srcreg", sz_long, "src", 1, 0);
1161 start_brace ();
1162 printf ("\tuae_u32 dst = ((src >> 16)&0xFFFF) | ((src&0xFFFF)<<16);\n");
1163 genflags (flag_logical, sz_long, "dst", "", "");
1164 genastore ("dst", curi->smode, "srcreg", sz_long, "src");
1165 break;
1166 case i_EXG:
1167 genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
1168 genamode (curi->dmode, "dstreg", curi->size, "dst", 1, 0);
1169 genastore ("dst", curi->smode, "srcreg", curi->size, "src");
1170 genastore ("src", curi->dmode, "dstreg", curi->size, "dst");
1171 break;
1172 case i_EXT:
1173 genamode (curi->smode, "srcreg", sz_long, "src", 1, 0);
1174 start_brace ();
1175 switch (curi->size) {
1176 case sz_byte: printf ("\tuae_u32 dst = (uae_s32)(uae_s8)src;\n"); break;
1177 case sz_word: printf ("\tuae_u16 dst = (uae_s16)(uae_s8)src;\n"); break;
1178 case sz_long: printf ("\tuae_u32 dst = (uae_s32)(uae_s16)src;\n"); break;
1179 default: abort ();
1180 }
1181 genflags (flag_logical,
1182 curi->size == sz_word ? sz_word : sz_long, "dst", "", "");
1183 genastore ("dst", curi->smode, "srcreg",
1184 curi->size == sz_word ? sz_word : sz_long, "src");
1185 break;
1186 case i_MVMEL:
1187 genmovemel (opcode);
1188 break;
1189 case i_MVMLE:
1190 genmovemle (opcode);
1191 break;
1192 case i_TRAP:
1193 genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
1194 sync_m68k_pc ();
1195 printf ("\tException(src+32,0);\n");
1196 m68k_pc_offset = 0;
1197 break;
1198 case i_MVR2USP:
1199 genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
1200 printf ("\tregs.usp = src;\n");
1201 break;
1202 case i_MVUSP2R:
1203 genamode (curi->smode, "srcreg", curi->size, "src", 2, 0);
1204 genastore ("regs.usp", curi->smode, "srcreg", curi->size, "src");
1205 break;
1206 case i_RESET:
1207 break;
1208 case i_NOP:
1209 break;
1210 case i_STOP:
1211 genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
1212 printf ("\tregs.sr = src;\n");
1213 printf ("\tMakeFromSR();\n");
1214 printf ("\tm68k_setstopped(1);\n");
1215 break;
1216 case i_RTE:
1217 if (cpu_level == 0) {
1218 genamode (Aipi, "7", sz_word, "sr", 1, 0);
1219 genamode (Aipi, "7", sz_long, "pc", 1, 0);
1220 printf ("\tregs.sr = sr; m68k_setpc_rte(pc);\n");
1221 fill_prefetch_0 ();
1222 printf ("\tMakeFromSR();\n");
1223 } else {
1224 int old_brace_level = n_braces;
1225 if (next_cpu_level < 0)
1226 next_cpu_level = 0;
1227 printf ("\tuae_u16 newsr; uae_u32 newpc; for (;;) {\n");
1228 genamode (Aipi, "7", sz_word, "sr", 1, 0);
1229 genamode (Aipi, "7", sz_long, "pc", 1, 0);
1230 genamode (Aipi, "7", sz_word, "format", 1, 0);
1231 printf ("\tnewsr = sr; newpc = pc;\n");
1232 printf ("\tif ((format & 0xF000) == 0x0000) { break; }\n");
1233 printf ("\telse if ((format & 0xF000) == 0x1000) { ; }\n");
1234 printf ("\telse if ((format & 0xF000) == 0x2000) { m68k_areg(regs, 7) += 4; break; }\n");
1235 /* gb-- the next two lines are deleted in Bernie's gencpu.c */
1236 printf ("\telse if ((format & 0xF000) == 0x3000) { m68k_areg(regs, 7) += 4; break; }\n");
1237 printf ("\telse if ((format & 0xF000) == 0x7000) { m68k_areg(regs, 7) += 52; break; }\n");
1238 printf ("\telse if ((format & 0xF000) == 0x8000) { m68k_areg(regs, 7) += 50; break; }\n");
1239 printf ("\telse if ((format & 0xF000) == 0x9000) { m68k_areg(regs, 7) += 12; break; }\n");
1240 printf ("\telse if ((format & 0xF000) == 0xa000) { m68k_areg(regs, 7) += 24; break; }\n");
1241 printf ("\telse if ((format & 0xF000) == 0xb000) { m68k_areg(regs, 7) += 84; break; }\n");
1242 printf ("\telse { Exception(14,0); goto %s; }\n", endlabelstr);
1243 printf ("\tregs.sr = newsr; MakeFromSR();\n}\n");
1244 pop_braces (old_brace_level);
1245 printf ("\tregs.sr = newsr; MakeFromSR();\n");
1246 printf ("\tm68k_setpc_rte(newpc);\n");
1247 fill_prefetch_0 ();
1248 need_endlabel = 1;
1249 }
1250 /* PC is set and prefetch filled. */
1251 m68k_pc_offset = 0;
1252 break;
1253 case i_RTD:
1254 genamode (Aipi, "7", sz_long, "pc", 1, 0);
1255 genamode (curi->smode, "srcreg", curi->size, "offs", 1, 0);
1256 printf ("\tm68k_areg(regs, 7) += offs;\n");
1257 printf ("\tm68k_setpc_rte(pc);\n");
1258 fill_prefetch_0 ();
1259 /* PC is set and prefetch filled. */
1260 m68k_pc_offset = 0;
1261 break;
1262 case i_LINK:
1263 genamode (Apdi, "7", sz_long, "old", 2, 0);
1264 genamode (curi->smode, "srcreg", sz_long, "src", 1, 0);
1265 genastore ("src", Apdi, "7", sz_long, "old");
1266 genastore ("m68k_areg(regs, 7)", curi->smode, "srcreg", sz_long, "src");
1267 genamode (curi->dmode, "dstreg", curi->size, "offs", 1, 0);
1268 printf ("\tm68k_areg(regs, 7) += offs;\n");
1269 break;
1270 case i_UNLK:
1271 genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
1272 printf ("\tm68k_areg(regs, 7) = src;\n");
1273 genamode (Aipi, "7", sz_long, "old", 1, 0);
1274 genastore ("old", curi->smode, "srcreg", curi->size, "src");
1275 break;
1276 case i_RTS:
1277 printf ("\tm68k_do_rts();\n");
1278 fill_prefetch_0 ();
1279 m68k_pc_offset = 0;
1280 break;
1281 case i_TRAPV:
1282 sync_m68k_pc ();
1283 printf ("\tif (GET_VFLG) { Exception(7,m68k_getpc()); goto %s; }\n", endlabelstr);
1284 need_endlabel = 1;
1285 break;
1286 case i_RTR:
1287 printf ("\tMakeSR();\n");
1288 genamode (Aipi, "7", sz_word, "sr", 1, 0);
1289 genamode (Aipi, "7", sz_long, "pc", 1, 0);
1290 printf ("\tregs.sr &= 0xFF00; sr &= 0xFF;\n");
1291 printf ("\tregs.sr |= sr; m68k_setpc(pc);\n");
1292 fill_prefetch_0 ();
1293 printf ("\tMakeFromSR();\n");
1294 m68k_pc_offset = 0;
1295 break;
1296 case i_JSR:
1297 genamode (curi->smode, "srcreg", curi->size, "src", 0, 0);
1298 printf ("\tm68k_do_jsr(m68k_getpc() + %d, srca);\n", m68k_pc_offset);
1299 fill_prefetch_0 ();
1300 m68k_pc_offset = 0;
1301 break;
1302 case i_JMP:
1303 genamode (curi->smode, "srcreg", curi->size, "src", 0, 0);
1304 printf ("\tm68k_setpc(srca);\n");
1305 fill_prefetch_0 ();
1306 m68k_pc_offset = 0;
1307 break;
1308 case i_BSR:
1309 genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
1310 printf ("\tuae_s32 s = (uae_s32)src + 2;\n");
1311 if (using_exception_3) {
1312 printf ("\tif (src & 1) {\n");
1313 printf ("\tlast_addr_for_exception_3 = m68k_getpc() + 2;\n");
1314 printf ("\t\tlast_fault_for_exception_3 = m68k_getpc() + s;\n");
1315 printf ("\t\tlast_op_for_exception_3 = opcode; Exception(3,0); goto %s;\n", endlabelstr);
1316 printf ("\t}\n");
1317 need_endlabel = 1;
1318 }
1319 printf ("\tm68k_do_bsr(m68k_getpc() + %d, s);\n", m68k_pc_offset);
1320 fill_prefetch_0 ();
1321 m68k_pc_offset = 0;
1322 break;
1323 case i_Bcc:
1324 if (0 && !using_prefetch && !using_exception_3 && (cpu_level >= 2)) {
1325 /* gb-- variant probably more favorable to compiler optimizations
1326 also assumes no prefetch buffer is used
1327 Hmm, that would make sense with processors capable of conditional moves */
1328 if (curi->size == sz_long && next_cpu_level < 1)
1329 next_cpu_level = 1;
1330 genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
1331 printf ("\tm68k_incpc (cctrue(%d) ? ((uae_s32)src + 2) : %d);\n", curi->cc, m68k_pc_offset);
1332 m68k_pc_offset = 0;
1333 }
1334 else {
1335 /* original code for branch instructions */
1336 if (curi->size == sz_long) {
1337 if (cpu_level < 2) {
1338 printf ("\tm68k_incpc(2);\n");
1339 printf ("\tif (!cctrue(%d)) goto %s;\n", curi->cc, endlabelstr);
1340 printf ("\t\tlast_addr_for_exception_3 = m68k_getpc() + 2;\n");
1341 printf ("\t\tlast_fault_for_exception_3 = m68k_getpc() + 1;\n");
1342 printf ("\t\tlast_op_for_exception_3 = opcode; Exception(3,0); goto %s;\n", endlabelstr);
1343 need_endlabel = 1;
1344 } else {
1345 if (next_cpu_level < 1)
1346 next_cpu_level = 1;
1347 }
1348 }
1349 genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
1350 printf ("\tif (!cctrue(%d)) goto didnt_jump;\n", curi->cc);
1351 if (using_exception_3) {
1352 printf ("\tif (src & 1) {\n");
1353 printf ("\t\tlast_addr_for_exception_3 = m68k_getpc() + 2;\n");
1354 printf ("\t\tlast_fault_for_exception_3 = m68k_getpc() + 2 + (uae_s32)src;\n");
1355 printf ("\t\tlast_op_for_exception_3 = opcode; Exception(3,0); goto %s;\n", endlabelstr);
1356 printf ("\t}\n");
1357 need_endlabel = 1;
1358 }
1359 printf ("\tm68k_incpc ((uae_s32)src + 2);\n");
1360 fill_prefetch_0 ();
1361 printf ("return;\n");
1362 printf ("didnt_jump:;\n");
1363 need_endlabel = 1;
1364 }
1365 break;
1366 case i_LEA:
1367 genamode (curi->smode, "srcreg", curi->size, "src", 0, 0);
1368 genamode (curi->dmode, "dstreg", curi->size, "dst", 2, 0);
1369 genastore ("srca", curi->dmode, "dstreg", curi->size, "dst");
1370 break;
1371 case i_PEA:
1372 genamode (curi->smode, "srcreg", curi->size, "src", 0, 0);
1373 genamode (Apdi, "7", sz_long, "dst", 2, 0);
1374 genastore ("srca", Apdi, "7", sz_long, "dst");
1375 break;
1376 case i_DBcc:
1377 genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
1378 genamode (curi->dmode, "dstreg", curi->size, "offs", 1, 0);
1379
1380 printf ("\tif (!cctrue(%d)) {\n", curi->cc);
1381 genastore ("(src-1)", curi->smode, "srcreg", curi->size, "src");
1382
1383 printf ("\t\tif (src) {\n");
1384 if (using_exception_3) {
1385 printf ("\t\t\tif (offs & 1) {\n");
1386 printf ("\t\t\tlast_addr_for_exception_3 = m68k_getpc() + 2;\n");
1387 printf ("\t\t\tlast_fault_for_exception_3 = m68k_getpc() + 2 + (uae_s32)offs + 2;\n");
1388 printf ("\t\t\tlast_op_for_exception_3 = opcode; Exception(3,0); goto %s;\n", endlabelstr);
1389 printf ("\t\t}\n");
1390 need_endlabel = 1;
1391 }
1392 printf ("\t\t\tm68k_incpc((uae_s32)offs + 2);\n");
1393 fill_prefetch_0 ();
1394 printf ("return;\n");
1395 printf ("\t\t}\n");
1396 printf ("\t}\n");
1397 need_endlabel = 1;
1398 break;
1399 case i_Scc:
1400 genamode (curi->smode, "srcreg", curi->size, "src", 2, 0);
1401 start_brace ();
1402 printf ("\tint val = cctrue(%d) ? 0xff : 0;\n", curi->cc);
1403 genastore ("val", curi->smode, "srcreg", curi->size, "src");
1404 break;
1405 case i_DIVU:
1406 printf ("\tuaecptr oldpc = m68k_getpc();\n");
1407 genamode (curi->smode, "srcreg", sz_word, "src", 1, 0);
1408 genamode (curi->dmode, "dstreg", sz_long, "dst", 1, 0);
1409 sync_m68k_pc ();
1410 /* Clear V flag when dividing by zero - Alcatraz Odyssey demo depends
1411 * on this (actually, it's doing a DIVS). */
1412 printf ("\tif (src == 0) { SET_VFLG (0); Exception (5, oldpc); goto %s; } else {\n", endlabelstr);
1413 printf ("\tuae_u32 newv = (uae_u32)dst / (uae_u32)(uae_u16)src;\n");
1414 printf ("\tuae_u32 rem = (uae_u32)dst %% (uae_u32)(uae_u16)src;\n");
1415 /* The N flag appears to be set each time there is an overflow.
1416 * Weird. */
1417 printf ("\tif (newv > 0xffff) { SET_VFLG (1); SET_NFLG (1); SET_CFLG (0); } else\n\t{\n");
1418 genflags (flag_logical, sz_word, "newv", "", "");
1419 printf ("\tnewv = (newv & 0xffff) | ((uae_u32)rem << 16);\n");
1420 genastore ("newv", curi->dmode, "dstreg", sz_long, "dst");
1421 printf ("\t}\n");
1422 printf ("\t}\n");
1423 insn_n_cycles += 68;
1424 need_endlabel = 1;
1425 break;
1426 case i_DIVS:
1427 printf ("\tuaecptr oldpc = m68k_getpc();\n");
1428 genamode (curi->smode, "srcreg", sz_word, "src", 1, 0);
1429 genamode (curi->dmode, "dstreg", sz_long, "dst", 1, 0);
1430 sync_m68k_pc ();
1431 printf ("\tif (src == 0) { SET_VFLG (0); Exception(5,oldpc); goto %s; } else {\n", endlabelstr);
1432 printf ("\tuae_s32 newv = (uae_s32)dst / (uae_s32)(uae_s16)src;\n");
1433 printf ("\tuae_u16 rem = (uae_s32)dst %% (uae_s32)(uae_s16)src;\n");
1434 printf ("\tif ((newv & 0xffff8000) != 0 && (newv & 0xffff8000) != 0xffff8000) { SET_VFLG (1); SET_NFLG (1); SET_CFLG (0); } else\n\t{\n");
1435 printf ("\tif (((uae_s16)rem < 0) != ((uae_s32)dst < 0)) rem = -rem;\n");
1436 genflags (flag_logical, sz_word, "newv", "", "");
1437 printf ("\tnewv = (newv & 0xffff) | ((uae_u32)rem << 16);\n");
1438 genastore ("newv", curi->dmode, "dstreg", sz_long, "dst");
1439 printf ("\t}\n");
1440 printf ("\t}\n");
1441 insn_n_cycles += 72;
1442 need_endlabel = 1;
1443 break;
1444 case i_MULU:
1445 genamode (curi->smode, "srcreg", sz_word, "src", 1, 0);
1446 genamode (curi->dmode, "dstreg", sz_word, "dst", 1, 0);
1447 start_brace ();
1448 printf ("\tuae_u32 newv = (uae_u32)(uae_u16)dst * (uae_u32)(uae_u16)src;\n");
1449 genflags (flag_logical, sz_long, "newv", "", "");
1450 genastore ("newv", curi->dmode, "dstreg", sz_long, "dst");
1451 insn_n_cycles += 32;
1452 break;
1453 case i_MULS:
1454 genamode (curi->smode, "srcreg", sz_word, "src", 1, 0);
1455 genamode (curi->dmode, "dstreg", sz_word, "dst", 1, 0);
1456 start_brace ();
1457 printf ("\tuae_u32 newv = (uae_s32)(uae_s16)dst * (uae_s32)(uae_s16)src;\n");
1458 genflags (flag_logical, sz_long, "newv", "", "");
1459 genastore ("newv", curi->dmode, "dstreg", sz_long, "dst");
1460 insn_n_cycles += 32;
1461 break;
1462 case i_CHK:
1463 printf ("\tuaecptr oldpc = m68k_getpc();\n");
1464 genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
1465 genamode (curi->dmode, "dstreg", curi->size, "dst", 1, 0);
1466 printf ("\tif ((uae_s32)dst < 0) { SET_NFLG (1); Exception(6,oldpc); goto %s; }\n", endlabelstr);
1467 printf ("\telse if (dst > src) { SET_NFLG (0); Exception(6,oldpc); goto %s; }\n", endlabelstr);
1468 need_endlabel = 1;
1469 break;
1470
1471 case i_CHK2:
1472 printf ("\tuaecptr oldpc = m68k_getpc();\n");
1473 genamode (curi->smode, "srcreg", curi->size, "extra", 1, 0);
1474 genamode (curi->dmode, "dstreg", curi->size, "dst", 2, 0);
1475 printf ("\t{uae_s32 upper,lower,reg = regs.regs[(extra >> 12) & 15];\n");
1476 switch (curi->size) {
1477 case sz_byte:
1478 printf ("\tlower=(uae_s32)(uae_s8)get_byte(dsta); upper = (uae_s32)(uae_s8)get_byte(dsta+1);\n");
1479 printf ("\tif ((extra & 0x8000) == 0) reg = (uae_s32)(uae_s8)reg;\n");
1480 break;
1481 case sz_word:
1482 printf ("\tlower=(uae_s32)(uae_s16)get_word(dsta); upper = (uae_s32)(uae_s16)get_word(dsta+2);\n");
1483 printf ("\tif ((extra & 0x8000) == 0) reg = (uae_s32)(uae_s16)reg;\n");
1484 break;
1485 case sz_long:
1486 printf ("\tlower=get_long(dsta); upper = get_long(dsta+4);\n");
1487 break;
1488 default:
1489 abort ();
1490 }
1491 printf ("\tSET_ZFLG (upper == reg || lower == reg);\n");
1492 printf ("\tSET_CFLG_ALWAYS (lower <= upper ? reg < lower || reg > upper : reg > upper || reg < lower);\n");
1493 printf ("\tif ((extra & 0x800) && GET_CFLG) { Exception(6,oldpc); goto %s; }\n}\n", endlabelstr);
1494 need_endlabel = 1;
1495 break;
1496
1497 case i_ASR:
1498 genamode (curi->smode, "srcreg", curi->size, "cnt", 1, 0);
1499 genamode (curi->dmode, "dstreg", curi->size, "data", 1, 0);
1500 start_brace ();
1501 switch (curi->size) {
1502 case sz_byte: printf ("\tuae_u32 val = (uae_u8)data;\n"); break;
1503 case sz_word: printf ("\tuae_u32 val = (uae_u16)data;\n"); break;
1504 case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1505 default: abort ();
1506 }
1507 printf ("\tuae_u32 sign = (%s & val) >> %d;\n", cmask (curi->size), bit_size (curi->size) - 1);
1508 printf ("\tcnt &= 63;\n");
1509 printf ("\tCLEAR_CZNV;\n");
1510 printf ("\tif (cnt >= %d) {\n", bit_size (curi->size));
1511 printf ("\t\tval = %s & (uae_u32)-sign;\n", bit_mask (curi->size));
1512 printf ("\t\tSET_CFLG (sign);\n");
1513 duplicate_carry ();
1514 if (source_is_imm1_8 (curi))
1515 printf ("\t} else {\n");
1516 else
1517 printf ("\t} else if (cnt > 0) {\n");
1518 printf ("\t\tval >>= cnt - 1;\n");
1519 printf ("\t\tSET_CFLG (val & 1);\n");
1520 duplicate_carry ();
1521 printf ("\t\tval >>= 1;\n");
1522 printf ("\t\tval |= (%s << (%d - cnt)) & (uae_u32)-sign;\n",
1523 bit_mask (curi->size),
1524 bit_size (curi->size));
1525 printf ("\t\tval &= %s;\n", bit_mask (curi->size));
1526 printf ("\t}\n");
1527 genflags (flag_logical_noclobber, curi->size, "val", "", "");
1528 genastore ("val", curi->dmode, "dstreg", curi->size, "data");
1529 break;
1530 case i_ASL:
1531 genamode (curi->smode, "srcreg", curi->size, "cnt", 1, 0);
1532 genamode (curi->dmode, "dstreg", curi->size, "data", 1, 0);
1533 start_brace ();
1534 switch (curi->size) {
1535 case sz_byte: printf ("\tuae_u32 val = (uae_u8)data;\n"); break;
1536 case sz_word: printf ("\tuae_u32 val = (uae_u16)data;\n"); break;
1537 case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1538 default: abort ();
1539 }
1540 printf ("\tcnt &= 63;\n");
1541 printf ("\tCLEAR_CZNV;\n");
1542 printf ("\tif (cnt >= %d) {\n", bit_size (curi->size));
1543 printf ("\t\tSET_VFLG (val != 0);\n");
1544 printf ("\t\tSET_CFLG (cnt == %d ? val & 1 : 0);\n",
1545 bit_size (curi->size));
1546 duplicate_carry ();
1547 printf ("\t\tval = 0;\n");
1548 if (source_is_imm1_8 (curi))
1549 printf ("\t} else {\n");
1550 else
1551 printf ("\t} else if (cnt > 0) {\n");
1552 printf ("\t\tuae_u32 mask = (%s << (%d - cnt)) & %s;\n",
1553 bit_mask (curi->size),
1554 bit_size (curi->size) - 1,
1555 bit_mask (curi->size));
1556 printf ("\t\tSET_VFLG ((val & mask) != mask && (val & mask) != 0);\n");
1557 printf ("\t\tval <<= cnt - 1;\n");
1558 printf ("\t\tSET_CFLG ((val & %s) >> %d);\n", cmask (curi->size), bit_size (curi->size) - 1);
1559 duplicate_carry ();
1560 printf ("\t\tval <<= 1;\n");
1561 printf ("\t\tval &= %s;\n", bit_mask (curi->size));
1562 printf ("\t}\n");
1563 genflags (flag_logical_noclobber, curi->size, "val", "", "");
1564 genastore ("val", curi->dmode, "dstreg", curi->size, "data");
1565 break;
1566 case i_LSR:
1567 genamode (curi->smode, "srcreg", curi->size, "cnt", 1, 0);
1568 genamode (curi->dmode, "dstreg", curi->size, "data", 1, 0);
1569 start_brace ();
1570 switch (curi->size) {
1571 case sz_byte: printf ("\tuae_u32 val = (uae_u8)data;\n"); break;
1572 case sz_word: printf ("\tuae_u32 val = (uae_u16)data;\n"); break;
1573 case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1574 default: abort ();
1575 }
1576 printf ("\tcnt &= 63;\n");
1577 printf ("\tCLEAR_CZNV;\n");
1578 printf ("\tif (cnt >= %d) {\n", bit_size (curi->size));
1579 printf ("\t\tSET_CFLG ((cnt == %d) & (val >> %d));\n",
1580 bit_size (curi->size), bit_size (curi->size) - 1);
1581 duplicate_carry ();
1582 printf ("\t\tval = 0;\n");
1583 if (source_is_imm1_8 (curi))
1584 printf ("\t} else {\n");
1585 else
1586 printf ("\t} else if (cnt > 0) {\n");
1587 printf ("\t\tval >>= cnt - 1;\n");
1588 printf ("\t\tSET_CFLG (val & 1);\n");
1589 duplicate_carry ();
1590 printf ("\t\tval >>= 1;\n");
1591 printf ("\t}\n");
1592 genflags (flag_logical_noclobber, curi->size, "val", "", "");
1593 genastore ("val", curi->dmode, "dstreg", curi->size, "data");
1594 break;
1595 case i_LSL:
1596 genamode (curi->smode, "srcreg", curi->size, "cnt", 1, 0);
1597 genamode (curi->dmode, "dstreg", curi->size, "data", 1, 0);
1598 start_brace ();
1599 switch (curi->size) {
1600 case sz_byte: printf ("\tuae_u32 val = (uae_u8)data;\n"); break;
1601 case sz_word: printf ("\tuae_u32 val = (uae_u16)data;\n"); break;
1602 case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1603 default: abort ();
1604 }
1605 printf ("\tcnt &= 63;\n");
1606 printf ("\tCLEAR_CZNV;\n");
1607 printf ("\tif (cnt >= %d) {\n", bit_size (curi->size));
1608 printf ("\t\tSET_CFLG (cnt == %d ? val & 1 : 0);\n",
1609 bit_size (curi->size));
1610 duplicate_carry ();
1611 printf ("\t\tval = 0;\n");
1612 if (source_is_imm1_8 (curi))
1613 printf ("\t} else {\n");
1614 else
1615 printf ("\t} else if (cnt > 0) {\n");
1616 printf ("\t\tval <<= (cnt - 1);\n");
1617 printf ("\t\tSET_CFLG ((val & %s) >> %d);\n", cmask (curi->size), bit_size (curi->size) - 1);
1618 duplicate_carry ();
1619 printf ("\t\tval <<= 1;\n");
1620 printf ("\tval &= %s;\n", bit_mask (curi->size));
1621 printf ("\t}\n");
1622 genflags (flag_logical_noclobber, curi->size, "val", "", "");
1623 genastore ("val", curi->dmode, "dstreg", curi->size, "data");
1624 break;
1625 case i_ROL:
1626 genamode (curi->smode, "srcreg", curi->size, "cnt", 1, 0);
1627 genamode (curi->dmode, "dstreg", curi->size, "data", 1, 0);
1628 start_brace ();
1629 switch (curi->size) {
1630 case sz_byte: printf ("\tuae_u32 val = (uae_u8)data;\n"); break;
1631 case sz_word: printf ("\tuae_u32 val = (uae_u16)data;\n"); break;
1632 case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1633 default: abort ();
1634 }
1635 printf ("\tcnt &= 63;\n");
1636 printf ("\tCLEAR_CZNV;\n");
1637 if (source_is_imm1_8 (curi))
1638 printf ("{");
1639 else
1640 printf ("\tif (cnt > 0) {\n");
1641 printf ("\tuae_u32 loval;\n");
1642 printf ("\tcnt &= %d;\n", bit_size (curi->size) - 1);
1643 printf ("\tloval = val >> (%d - cnt);\n", bit_size (curi->size));
1644 printf ("\tval <<= cnt;\n");
1645 printf ("\tval |= loval;\n");
1646 printf ("\tval &= %s;\n", bit_mask (curi->size));
1647 printf ("\tSET_CFLG (val & 1);\n");
1648 printf ("}\n");
1649 genflags (flag_logical_noclobber, curi->size, "val", "", "");
1650 genastore ("val", curi->dmode, "dstreg", curi->size, "data");
1651 break;
1652 case i_ROR:
1653 genamode (curi->smode, "srcreg", curi->size, "cnt", 1, 0);
1654 genamode (curi->dmode, "dstreg", curi->size, "data", 1, 0);
1655 start_brace ();
1656 switch (curi->size) {
1657 case sz_byte: printf ("\tuae_u32 val = (uae_u8)data;\n"); break;
1658 case sz_word: printf ("\tuae_u32 val = (uae_u16)data;\n"); break;
1659 case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1660 default: abort ();
1661 }
1662 printf ("\tcnt &= 63;\n");
1663 printf ("\tCLEAR_CZNV;\n");
1664 if (source_is_imm1_8 (curi))
1665 printf ("{");
1666 else
1667 printf ("\tif (cnt > 0) {");
1668 printf ("\tuae_u32 hival;\n");
1669 printf ("\tcnt &= %d;\n", bit_size (curi->size) - 1);
1670 printf ("\thival = val << (%d - cnt);\n", bit_size (curi->size));
1671 printf ("\tval >>= cnt;\n");
1672 printf ("\tval |= hival;\n");
1673 printf ("\tval &= %s;\n", bit_mask (curi->size));
1674 printf ("\tSET_CFLG ((val & %s) >> %d);\n", cmask (curi->size), bit_size (curi->size) - 1);
1675 printf ("\t}\n");
1676 genflags (flag_logical_noclobber, curi->size, "val", "", "");
1677 genastore ("val", curi->dmode, "dstreg", curi->size, "data");
1678 break;
1679 case i_ROXL:
1680 genamode (curi->smode, "srcreg", curi->size, "cnt", 1, 0);
1681 genamode (curi->dmode, "dstreg", curi->size, "data", 1, 0);
1682 start_brace ();
1683 switch (curi->size) {
1684 case sz_byte: printf ("\tuae_u32 val = (uae_u8)data;\n"); break;
1685 case sz_word: printf ("\tuae_u32 val = (uae_u16)data;\n"); break;
1686 case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1687 default: abort ();
1688 }
1689 printf ("\tcnt &= 63;\n");
1690 printf ("\tCLEAR_CZNV;\n");
1691 if (source_is_imm1_8 (curi))
1692 printf ("{");
1693 else {
1694 force_range_for_rox ("cnt", curi->size);
1695 printf ("\tif (cnt > 0) {\n");
1696 }
1697 printf ("\tcnt--;\n");
1698 printf ("\t{\n\tuae_u32 carry;\n");
1699 printf ("\tuae_u32 loval = val >> (%d - cnt);\n", bit_size (curi->size) - 1);
1700 printf ("\tcarry = loval & 1;\n");
1701 printf ("\tval = (((val << 1) | GET_XFLG) << cnt) | (loval >> 1);\n");
1702 printf ("\tSET_XFLG (carry);\n");
1703 printf ("\tval &= %s;\n", bit_mask (curi->size));
1704 printf ("\t} }\n");
1705 printf ("\tSET_CFLG (GET_XFLG);\n");
1706 genflags (flag_logical_noclobber, curi->size, "val", "", "");
1707 genastore ("val", curi->dmode, "dstreg", curi->size, "data");
1708 break;
1709 case i_ROXR:
1710 genamode (curi->smode, "srcreg", curi->size, "cnt", 1, 0);
1711 genamode (curi->dmode, "dstreg", curi->size, "data", 1, 0);
1712 start_brace ();
1713 switch (curi->size) {
1714 case sz_byte: printf ("\tuae_u32 val = (uae_u8)data;\n"); break;
1715 case sz_word: printf ("\tuae_u32 val = (uae_u16)data;\n"); break;
1716 case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1717 default: abort ();
1718 }
1719 printf ("\tcnt &= 63;\n");
1720 printf ("\tCLEAR_CZNV;\n");
1721 if (source_is_imm1_8 (curi))
1722 printf ("{");
1723 else {
1724 force_range_for_rox ("cnt", curi->size);
1725 printf ("\tif (cnt > 0) {\n");
1726 }
1727 printf ("\tcnt--;\n");
1728 printf ("\t{\n\tuae_u32 carry;\n");
1729 printf ("\tuae_u32 hival = (val << 1) | GET_XFLG;\n");
1730 printf ("\thival <<= (%d - cnt);\n", bit_size (curi->size) - 1);
1731 printf ("\tval >>= cnt;\n");
1732 printf ("\tcarry = val & 1;\n");
1733 printf ("\tval >>= 1;\n");
1734 printf ("\tval |= hival;\n");
1735 printf ("\tSET_XFLG (carry);\n");
1736 printf ("\tval &= %s;\n", bit_mask (curi->size));
1737 printf ("\t} }\n");
1738 printf ("\tSET_CFLG (GET_XFLG);\n");
1739 genflags (flag_logical_noclobber, curi->size, "val", "", "");
1740 genastore ("val", curi->dmode, "dstreg", curi->size, "data");
1741 break;
1742 case i_ASRW:
1743 genamode (curi->smode, "srcreg", curi->size, "data", 1, 0);
1744 start_brace ();
1745 switch (curi->size) {
1746 case sz_byte: printf ("\tuae_u32 val = (uae_u8)data;\n"); break;
1747 case sz_word: printf ("\tuae_u32 val = (uae_u16)data;\n"); break;
1748 case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1749 default: abort ();
1750 }
1751 printf ("\tuae_u32 sign = %s & val;\n", cmask (curi->size));
1752 printf ("\tuae_u32 cflg = val & 1;\n");
1753 printf ("\tval = (val >> 1) | sign;\n");
1754 genflags (flag_logical, curi->size, "val", "", "");
1755 printf ("\tSET_CFLG (cflg);\n");
1756 duplicate_carry ();
1757 genastore ("val", curi->smode, "srcreg", curi->size, "data");
1758 break;
1759 case i_ASLW:
1760 genamode (curi->smode, "srcreg", curi->size, "data", 1, 0);
1761 start_brace ();
1762 switch (curi->size) {
1763 case sz_byte: printf ("\tuae_u32 val = (uae_u8)data;\n"); break;
1764 case sz_word: printf ("\tuae_u32 val = (uae_u16)data;\n"); break;
1765 case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1766 default: abort ();
1767 }
1768 printf ("\tuae_u32 sign = %s & val;\n", cmask (curi->size));
1769 printf ("\tuae_u32 sign2;\n");
1770 printf ("\tval <<= 1;\n");
1771 genflags (flag_logical, curi->size, "val", "", "");
1772 printf ("\tsign2 = %s & val;\n", cmask (curi->size));
1773 printf ("\tSET_CFLG (sign != 0);\n");
1774 duplicate_carry ();
1775
1776 printf ("\tSET_VFLG (GET_VFLG | (sign2 != sign));\n");
1777 genastore ("val", curi->smode, "srcreg", curi->size, "data");
1778 break;
1779 case i_LSRW:
1780 genamode (curi->smode, "srcreg", curi->size, "data", 1, 0);
1781 start_brace ();
1782 switch (curi->size) {
1783 case sz_byte: printf ("\tuae_u32 val = (uae_u8)data;\n"); break;
1784 case sz_word: printf ("\tuae_u32 val = (uae_u16)data;\n"); break;
1785 case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1786 default: abort ();
1787 }
1788 printf ("\tuae_u32 carry = val & 1;\n");
1789 printf ("\tval >>= 1;\n");
1790 genflags (flag_logical, curi->size, "val", "", "");
1791 printf ("SET_CFLG (carry);\n");
1792 duplicate_carry ();
1793 genastore ("val", curi->smode, "srcreg", curi->size, "data");
1794 break;
1795 case i_LSLW:
1796 genamode (curi->smode, "srcreg", curi->size, "data", 1, 0);
1797 start_brace ();
1798 switch (curi->size) {
1799 case sz_byte: printf ("\tuae_u8 val = data;\n"); break;
1800 case sz_word: printf ("\tuae_u16 val = data;\n"); break;
1801 case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1802 default: abort ();
1803 }
1804 printf ("\tuae_u32 carry = val & %s;\n", cmask (curi->size));
1805 printf ("\tval <<= 1;\n");
1806 genflags (flag_logical, curi->size, "val", "", "");
1807 printf ("SET_CFLG (carry >> %d);\n", bit_size (curi->size) - 1);
1808 duplicate_carry ();
1809 genastore ("val", curi->smode, "srcreg", curi->size, "data");
1810 break;
1811 case i_ROLW:
1812 genamode (curi->smode, "srcreg", curi->size, "data", 1, 0);
1813 start_brace ();
1814 switch (curi->size) {
1815 case sz_byte: printf ("\tuae_u8 val = data;\n"); break;
1816 case sz_word: printf ("\tuae_u16 val = data;\n"); break;
1817 case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1818 default: abort ();
1819 }
1820 printf ("\tuae_u32 carry = val & %s;\n", cmask (curi->size));
1821 printf ("\tval <<= 1;\n");
1822 printf ("\tif (carry) val |= 1;\n");
1823 genflags (flag_logical, curi->size, "val", "", "");
1824 printf ("SET_CFLG (carry >> %d);\n", bit_size (curi->size) - 1);
1825 genastore ("val", curi->smode, "srcreg", curi->size, "data");
1826 break;
1827 case i_RORW:
1828 genamode (curi->smode, "srcreg", curi->size, "data", 1, 0);
1829 start_brace ();
1830 switch (curi->size) {
1831 case sz_byte: printf ("\tuae_u8 val = data;\n"); break;
1832 case sz_word: printf ("\tuae_u16 val = data;\n"); break;
1833 case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1834 default: abort ();
1835 }
1836 printf ("\tuae_u32 carry = val & 1;\n");
1837 printf ("\tval >>= 1;\n");
1838 printf ("\tif (carry) val |= %s;\n", cmask (curi->size));
1839 genflags (flag_logical, curi->size, "val", "", "");
1840 printf ("SET_CFLG (carry);\n");
1841 genastore ("val", curi->smode, "srcreg", curi->size, "data");
1842 break;
1843 case i_ROXLW:
1844 genamode (curi->smode, "srcreg", curi->size, "data", 1, 0);
1845 start_brace ();
1846 switch (curi->size) {
1847 case sz_byte: printf ("\tuae_u8 val = data;\n"); break;
1848 case sz_word: printf ("\tuae_u16 val = data;\n"); break;
1849 case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1850 default: abort ();
1851 }
1852 printf ("\tuae_u32 carry = val & %s;\n", cmask (curi->size));
1853 printf ("\tval <<= 1;\n");
1854 printf ("\tif (GET_XFLG) val |= 1;\n");
1855 genflags (flag_logical, curi->size, "val", "", "");
1856 printf ("SET_CFLG (carry >> %d);\n", bit_size (curi->size) - 1);
1857 duplicate_carry ();
1858 genastore ("val", curi->smode, "srcreg", curi->size, "data");
1859 break;
1860 case i_ROXRW:
1861 genamode (curi->smode, "srcreg", curi->size, "data", 1, 0);
1862 start_brace ();
1863 switch (curi->size) {
1864 case sz_byte: printf ("\tuae_u8 val = data;\n"); break;
1865 case sz_word: printf ("\tuae_u16 val = data;\n"); break;
1866 case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1867 default: abort ();
1868 }
1869 printf ("\tuae_u32 carry = val & 1;\n");
1870 printf ("\tval >>= 1;\n");
1871 printf ("\tif (GET_XFLG) val |= %s;\n", cmask (curi->size));
1872 genflags (flag_logical, curi->size, "val", "", "");
1873 printf ("SET_CFLG (carry);\n");
1874 duplicate_carry ();
1875 genastore ("val", curi->smode, "srcreg", curi->size, "data");
1876 break;
1877 case i_MOVEC2:
1878 genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
1879 start_brace ();
1880 printf ("\tint regno = (src >> 12) & 15;\n");
1881 printf ("\tuae_u32 *regp = regs.regs + regno;\n");
1882 printf ("\tif (! m68k_movec2(src & 0xFFF, regp)) goto %s;\n", endlabelstr);
1883 break;
1884 case i_MOVE2C:
1885 genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
1886 start_brace ();
1887 printf ("\tint regno = (src >> 12) & 15;\n");
1888 printf ("\tuae_u32 *regp = regs.regs + regno;\n");
1889 printf ("\tif (! m68k_move2c(src & 0xFFF, regp)) goto %s;\n", endlabelstr);
1890 break;
1891 case i_CAS:
1892 {
1893 int old_brace_level;
1894 genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
1895 genamode (curi->dmode, "dstreg", curi->size, "dst", 1, 0);
1896 start_brace ();
1897 printf ("\tint ru = (src >> 6) & 7;\n");
1898 printf ("\tint rc = src & 7;\n");
1899 genflags (flag_cmp, curi->size, "newv", "m68k_dreg(regs, rc)", "dst");
1900 printf ("\tif (GET_ZFLG)");
1901 old_brace_level = n_braces;
1902 start_brace ();
1903 genastore ("(m68k_dreg(regs, ru))", curi->dmode, "dstreg", curi->size, "dst");
1904 pop_braces (old_brace_level);
1905 printf ("else");
1906 start_brace ();
1907 printf ("m68k_dreg(regs, rc) = dst;\n");
1908 pop_braces (old_brace_level);
1909 }
1910 break;
1911 case i_CAS2:
1912 genamode (curi->smode, "srcreg", curi->size, "extra", 1, 0);
1913 printf ("\tuae_u32 rn1 = regs.regs[(extra >> 28) & 15];\n");
1914 printf ("\tuae_u32 rn2 = regs.regs[(extra >> 12) & 15];\n");
1915 if (curi->size == sz_word) {
1916 int old_brace_level = n_braces;
1917 printf ("\tuae_u16 dst1 = get_word(rn1), dst2 = get_word(rn2);\n");
1918 genflags (flag_cmp, curi->size, "newv", "m68k_dreg(regs, (extra >> 16) & 7)", "dst1");
1919 printf ("\tif (GET_ZFLG) {\n");
1920 genflags (flag_cmp, curi->size, "newv", "m68k_dreg(regs, extra & 7)", "dst2");
1921 printf ("\tif (GET_ZFLG) {\n");
1922 printf ("\tput_word(rn1, m68k_dreg(regs, (extra >> 22) & 7));\n");
1923 printf ("\tput_word(rn1, m68k_dreg(regs, (extra >> 6) & 7));\n");
1924 printf ("\t}}\n");
1925 pop_braces (old_brace_level);
1926 printf ("\tif (! GET_ZFLG) {\n");
1927 printf ("\tm68k_dreg(regs, (extra >> 22) & 7) = (m68k_dreg(regs, (extra >> 22) & 7) & ~0xffff) | (dst1 & 0xffff);\n");
1928 printf ("\tm68k_dreg(regs, (extra >> 6) & 7) = (m68k_dreg(regs, (extra >> 6) & 7) & ~0xffff) | (dst2 & 0xffff);\n");
1929 printf ("\t}\n");
1930 } else {
1931 int old_brace_level = n_braces;
1932 printf ("\tuae_u32 dst1 = get_long(rn1), dst2 = get_long(rn2);\n");
1933 genflags (flag_cmp, curi->size, "newv", "m68k_dreg(regs, (extra >> 16) & 7)", "dst1");
1934 printf ("\tif (GET_ZFLG) {\n");
1935 genflags (flag_cmp, curi->size, "newv", "m68k_dreg(regs, extra & 7)", "dst2");
1936 printf ("\tif (GET_ZFLG) {\n");
1937 printf ("\tput_long(rn1, m68k_dreg(regs, (extra >> 22) & 7));\n");
1938 printf ("\tput_long(rn1, m68k_dreg(regs, (extra >> 6) & 7));\n");
1939 printf ("\t}}\n");
1940 pop_braces (old_brace_level);
1941 printf ("\tif (! GET_ZFLG) {\n");
1942 printf ("\tm68k_dreg(regs, (extra >> 22) & 7) = dst1;\n");
1943 printf ("\tm68k_dreg(regs, (extra >> 6) & 7) = dst2;\n");
1944 printf ("\t}\n");
1945 }
1946 break;
1947 case i_MOVES: /* ignore DFC and SFC because we have no MMU */
1948 {
1949 int old_brace_level;
1950 genamode (curi->smode, "srcreg", curi->size, "extra", 1, 0);
1951 printf ("\tif (extra & 0x800)\n");
1952 old_brace_level = n_braces;
1953 start_brace ();
1954 printf ("\tuae_u32 src = regs.regs[(extra >> 12) & 15];\n");
1955 genamode (curi->dmode, "dstreg", curi->size, "dst", 2, 0);
1956 genastore ("src", curi->dmode, "dstreg", curi->size, "dst");
1957 pop_braces (old_brace_level);
1958 printf ("else");
1959 start_brace ();
1960 genamode (curi->dmode, "dstreg", curi->size, "src", 1, 0);
1961 printf ("\tif (extra & 0x8000) {\n");
1962 switch (curi->size) {
1963 case sz_byte: printf ("\tm68k_areg(regs, (extra >> 12) & 7) = (uae_s32)(uae_s8)src;\n"); break;
1964 case sz_word: printf ("\tm68k_areg(regs, (extra >> 12) & 7) = (uae_s32)(uae_s16)src;\n"); break;
1965 case sz_long: printf ("\tm68k_areg(regs, (extra >> 12) & 7) = src;\n"); break;
1966 default: abort ();
1967 }
1968 printf ("\t} else {\n");
1969 genastore ("src", Dreg, "(extra >> 12) & 7", curi->size, "");
1970 printf ("\t}\n");
1971 pop_braces (old_brace_level);
1972 }
1973 break;
1974 case i_BKPT: /* only needed for hardware emulators */
1975 sync_m68k_pc ();
1976 printf ("\top_illg(opcode);\n");
1977 break;
1978 case i_CALLM: /* not present in 68030 */
1979 sync_m68k_pc ();
1980 printf ("\top_illg(opcode);\n");
1981 break;
1982 case i_RTM: /* not present in 68030 */
1983 sync_m68k_pc ();
1984 printf ("\top_illg(opcode);\n");
1985 break;
1986 case i_TRAPcc:
1987 if (curi->smode != am_unknown && curi->smode != am_illg)
1988 genamode (curi->smode, "srcreg", curi->size, "dummy", 1, 0);
1989 printf ("\tif (cctrue(%d)) { Exception(7,m68k_getpc()); goto %s; }\n", curi->cc, endlabelstr);
1990 need_endlabel = 1;
1991 break;
1992 case i_DIVL:
1993 sync_m68k_pc ();
1994 start_brace ();
1995 printf ("\tuaecptr oldpc = m68k_getpc();\n");
1996 genamode (curi->smode, "srcreg", curi->size, "extra", 1, 0);
1997 genamode (curi->dmode, "dstreg", curi->size, "dst", 1, 0);
1998 sync_m68k_pc ();
1999 printf ("\tm68k_divl(opcode, dst, extra, oldpc);\n");
2000 break;
2001 case i_MULL:
2002 genamode (curi->smode, "srcreg", curi->size, "extra", 1, 0);
2003 genamode (curi->dmode, "dstreg", curi->size, "dst", 1, 0);
2004 sync_m68k_pc ();
2005 printf ("\tm68k_mull(opcode, dst, extra);\n");
2006 break;
2007 case i_BFTST:
2008 case i_BFEXTU:
2009 case i_BFCHG:
2010 case i_BFEXTS:
2011 case i_BFCLR:
2012 case i_BFFFO:
2013 case i_BFSET:
2014 case i_BFINS:
2015 genamode (curi->smode, "srcreg", curi->size, "extra", 1, 0);
2016 genamode (curi->dmode, "dstreg", sz_long, "dst", 2, 0);
2017 start_brace ();
2018 printf ("\tuae_s32 offset = extra & 0x800 ? m68k_dreg(regs, (extra >> 6) & 7) : (extra >> 6) & 0x1f;\n");
2019 printf ("\tint width = (((extra & 0x20 ? m68k_dreg(regs, extra & 7) : extra) -1) & 0x1f) +1;\n");
2020 if (curi->dmode == Dreg) {
2021 printf ("\tuae_u32 tmp = m68k_dreg(regs, dstreg) << (offset & 0x1f);\n");
2022 } else {
2023 printf ("\tuae_u32 tmp,bf0,bf1;\n");
2024 printf ("\tdsta += (offset >> 3) | (offset & 0x80000000 ? ~0x1fffffff : 0);\n");
2025 printf ("\tbf0 = get_long(dsta);bf1 = get_byte(dsta+4) & 0xff;\n");
2026 printf ("\ttmp = (bf0 << (offset & 7)) | (bf1 >> (8 - (offset & 7)));\n");
2027 }
2028 printf ("\ttmp >>= (32 - width);\n");
2029 printf ("\tSET_NFLG_ALWAYS (tmp & (1 << (width-1)) ? 1 : 0);\n");
2030 printf ("\tSET_ZFLG (tmp == 0); SET_VFLG (0); SET_CFLG (0);\n");
2031 switch (curi->mnemo) {
2032 case i_BFTST:
2033 break;
2034 case i_BFEXTU:
2035 printf ("\tm68k_dreg(regs, (extra >> 12) & 7) = tmp;\n");
2036 break;
2037 case i_BFCHG:
2038 printf ("\ttmp = ~tmp;\n");
2039 break;
2040 case i_BFEXTS:
2041 printf ("\tif (GET_NFLG) tmp |= width == 32 ? 0 : (-1 << width);\n");
2042 printf ("\tm68k_dreg(regs, (extra >> 12) & 7) = tmp;\n");
2043 break;
2044 case i_BFCLR:
2045 printf ("\ttmp = 0;\n");
2046 break;
2047 case i_BFFFO:
2048 printf ("\t{ uae_u32 mask = 1 << (width-1);\n");
2049 printf ("\twhile (mask) { if (tmp & mask) break; mask >>= 1; offset++; }}\n");
2050 printf ("\tm68k_dreg(regs, (extra >> 12) & 7) = offset;\n");
2051 break;
2052 case i_BFSET:
2053 printf ("\ttmp = 0xffffffff;\n");
2054 break;
2055 case i_BFINS:
2056 printf ("\ttmp = m68k_dreg(regs, (extra >> 12) & 7);\n");
2057 printf ("\tSET_NFLG_ALWAYS (tmp & (1 << (width - 1)) ? 1 : 0);\n");
2058 printf ("\tSET_ZFLG (tmp == 0);\n");
2059 break;
2060 default:
2061 break;
2062 }
2063 if (curi->mnemo == i_BFCHG
2064 || curi->mnemo == i_BFCLR
2065 || curi->mnemo == i_BFSET
2066 || curi->mnemo == i_BFINS)
2067 {
2068 printf ("\ttmp <<= (32 - width);\n");
2069 if (curi->dmode == Dreg) {
2070 printf ("\tm68k_dreg(regs, dstreg) = (m68k_dreg(regs, dstreg) & ((offset & 0x1f) == 0 ? 0 :\n");
2071 printf ("\t\t(0xffffffff << (32 - (offset & 0x1f))))) |\n");
2072 printf ("\t\t(tmp >> (offset & 0x1f)) |\n");
2073 printf ("\t\t(((offset & 0x1f) + width) >= 32 ? 0 :\n");
2074 printf (" (m68k_dreg(regs, dstreg) & ((uae_u32)0xffffffff >> ((offset & 0x1f) + width))));\n");
2075 } else {
2076 printf ("\tbf0 = (bf0 & (0xff000000 << (8 - (offset & 7)))) |\n");
2077 printf ("\t\t(tmp >> (offset & 7)) |\n");
2078 printf ("\t\t(((offset & 7) + width) >= 32 ? 0 :\n");
2079 printf ("\t\t (bf0 & ((uae_u32)0xffffffff >> ((offset & 7) + width))));\n");
2080 printf ("\tput_long(dsta,bf0 );\n");
2081 printf ("\tif (((offset & 7) + width) > 32) {\n");
2082 printf ("\t\tbf1 = (bf1 & (0xff >> (width - 32 + (offset & 7)))) |\n");
2083 printf ("\t\t\t(tmp << (8 - (offset & 7)));\n");
2084 printf ("\t\tput_byte(dsta+4,bf1);\n");
2085 printf ("\t}\n");
2086 }
2087 }
2088 break;
2089 case i_PACK:
2090 if (curi->smode == Dreg) {
2091 printf ("\tuae_u16 val = m68k_dreg(regs, srcreg) + %s;\n", gen_nextiword ());
2092 printf ("\tm68k_dreg(regs, dstreg) = (m68k_dreg(regs, dstreg) & 0xffffff00) | ((val >> 4) & 0xf0) | (val & 0xf);\n");
2093 } else {
2094 printf ("\tuae_u16 val;\n");
2095 printf ("\tm68k_areg(regs, srcreg) -= areg_byteinc[srcreg];\n");
2096 printf ("\tval = (uae_u16)get_byte(m68k_areg(regs, srcreg));\n");
2097 printf ("\tm68k_areg(regs, srcreg) -= areg_byteinc[srcreg];\n");
2098 printf ("\tval = (val | ((uae_u16)get_byte(m68k_areg(regs, srcreg)) << 8)) + %s;\n", gen_nextiword ());
2099 printf ("\tm68k_areg(regs, dstreg) -= areg_byteinc[dstreg];\n");
2100 printf ("\tput_byte(m68k_areg(regs, dstreg),((val >> 4) & 0xf0) | (val & 0xf));\n");
2101 }
2102 break;
2103 case i_UNPK:
2104 if (curi->smode == Dreg) {
2105 printf ("\tuae_u16 val = m68k_dreg(regs, srcreg);\n");
2106 printf ("\tval = (((val << 4) & 0xf00) | (val & 0xf)) + %s;\n", gen_nextiword ());
2107 printf ("\tm68k_dreg(regs, dstreg) = (m68k_dreg(regs, dstreg) & 0xffff0000) | (val & 0xffff);\n");
2108 } else {
2109 printf ("\tuae_u16 val;\n");
2110 printf ("\tm68k_areg(regs, srcreg) -= areg_byteinc[srcreg];\n");
2111 printf ("\tval = (uae_u16)get_byte(m68k_areg(regs, srcreg));\n");
2112 printf ("\tval = (((val << 4) & 0xf00) | (val & 0xf)) + %s;\n", gen_nextiword ());
2113 printf ("\tm68k_areg(regs, dstreg) -= areg_byteinc[dstreg];\n");
2114 printf ("\tput_byte(m68k_areg(regs, dstreg),val);\n");
2115 printf ("\tm68k_areg(regs, dstreg) -= areg_byteinc[dstreg];\n");
2116 printf ("\tput_byte(m68k_areg(regs, dstreg),val >> 8);\n");
2117 }
2118 break;
2119 case i_TAS:
2120 genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
2121 genflags (flag_logical, curi->size, "src", "", "");
2122 printf ("\tsrc |= 0x80;\n");
2123 genastore ("src", curi->smode, "srcreg", curi->size, "src");
2124 break;
2125 case i_FPP:
2126 genamode (curi->smode, "srcreg", curi->size, "extra", 1, 0);
2127 sync_m68k_pc ();
2128 swap_opcode ();
2129 printf ("\tfpuop_arithmetic(opcode, extra);\n");
2130 break;
2131 case i_FDBcc:
2132 genamode (curi->smode, "srcreg", curi->size, "extra", 1, 0);
2133 sync_m68k_pc ();
2134 swap_opcode ();
2135 printf ("\tfpuop_dbcc(opcode, extra);\n");
2136 break;
2137 case i_FScc:
2138 genamode (curi->smode, "srcreg", curi->size, "extra", 1, 0);
2139 sync_m68k_pc ();
2140 swap_opcode ();
2141 printf ("\tfpuop_scc(opcode,extra);\n");
2142 break;
2143 case i_FTRAPcc:
2144 sync_m68k_pc ();
2145 start_brace ();
2146 printf ("\tuaecptr oldpc = m68k_getpc();\n");
2147 if (curi->smode != am_unknown && curi->smode != am_illg)
2148 genamode (curi->smode, "srcreg", curi->size, "dummy", 1, 0);
2149 sync_m68k_pc ();
2150 swap_opcode ();
2151 printf ("\tfpuop_trapcc(opcode,oldpc);\n");
2152 break;
2153 case i_FBcc:
2154 sync_m68k_pc ();
2155 start_brace ();
2156 printf ("\tuaecptr pc = m68k_getpc();\n");
2157 genamode (curi->dmode, "srcreg", curi->size, "extra", 1, 0);
2158 sync_m68k_pc ();
2159 swap_opcode ();
2160 printf ("\tfpuop_bcc(opcode,pc,extra);\n");
2161 break;
2162 case i_FSAVE:
2163 sync_m68k_pc ();
2164 swap_opcode ();
2165 printf ("\tfpuop_save(opcode);\n");
2166 break;
2167 case i_FRESTORE:
2168 sync_m68k_pc ();
2169 swap_opcode ();
2170 printf ("\tfpuop_restore(opcode);\n");
2171 break;
2172 case i_CINVL:
2173 case i_CINVP:
2174 case i_CINVA:
2175 /* gb-- srcreg now contains the cache field */
2176 printf ("\tif (srcreg&0x2)\n");
2177 printf ("\t\tflush_icache(%d);\n", 30 + ((opcode >> 3) & 3));
2178 break;
2179 case i_CPUSHL:
2180 case i_CPUSHP:
2181 case i_CPUSHA:
2182 /* gb-- srcreg now contains the cache field */
2183 printf ("\tif (srcreg&0x2)\n");
2184 printf ("\t\tflush_icache(%d);\n", 40 + ((opcode >> 3) & 3));
2185 break;
2186 case i_MOVE16:
2187 if ((opcode & 0xfff8) == 0xf620) {
2188 /* MOVE16 (Ax)+,(Ay)+ */
2189 printf ("\tuaecptr mems = m68k_areg(regs, srcreg) & ~15, memd;\n");
2190 printf ("\tdstreg = (%s >> 12) & 7;\n", gen_nextiword());
2191 printf ("\tmemd = m68k_areg(regs, dstreg) & ~15;\n");
2192 printf ("\tput_long(memd, get_long(mems));\n");
2193 printf ("\tput_long(memd+4, get_long(mems+4));\n");
2194 printf ("\tput_long(memd+8, get_long(mems+8));\n");
2195 printf ("\tput_long(memd+12, get_long(mems+12));\n");
2196 printf ("\tif (srcreg != dstreg)\n");
2197 printf ("\tm68k_areg(regs, srcreg) += 16;\n");
2198 printf ("\tm68k_areg(regs, dstreg) += 16;\n");
2199 }
2200 else {
2201 /* Other variants */
2202 genamode (curi->smode, "srcreg", curi->size, "mems", 0, 2);
2203 genamode (curi->dmode, "dstreg", curi->size, "memd", 0, 2);
2204 printf ("\tmemsa &= ~15;\n");
2205 printf ("\tmemda &= ~15;\n");
2206 printf ("\tput_long(memda, get_long(memsa));\n");
2207 printf ("\tput_long(memda+4, get_long(memsa+4));\n");
2208 printf ("\tput_long(memda+8, get_long(memsa+8));\n");
2209 printf ("\tput_long(memda+12, get_long(memsa+12));\n");
2210 if ((opcode & 0xfff8) == 0xf600)
2211 printf ("\tm68k_areg(regs, srcreg) += 16;\n");
2212 else if ((opcode & 0xfff8) == 0xf608)
2213 printf ("\tm68k_areg(regs, dstreg) += 16;\n");
2214 }
2215 break;
2216 case i_MMUOP:
2217 genamode (curi->smode, "srcreg", curi->size, "extra", 1, 0);
2218 sync_m68k_pc ();
2219 swap_opcode ();
2220 printf ("\tmmu_op(opcode,extra);\n");
2221 break;
2222
2223 case i_EMULOP_RETURN:
2224 printf ("\tm68k_emulop_return();\n");
2225 m68k_pc_offset = 0;
2226 break;
2227
2228 case i_EMULOP:
2229 printf ("\n");
2230 swap_opcode ();
2231 printf ("\tm68k_emulop(opcode);\n");
2232 break;
2233
2234 default:
2235 abort ();
2236 break;
2237 }
2238 finish_braces ();
2239 sync_m68k_pc ();
2240 }
2241
2242 static void generate_includes (FILE * f)
2243 {
2244 fprintf (f, "#include \"sysdeps.h\"\n");
2245
2246 fprintf (f, "#include \"m68k.h\"\n");
2247 fprintf (f, "#include \"memory.h\"\n");
2248 fprintf (f, "#include \"readcpu.h\"\n");
2249 fprintf (f, "#include \"newcpu.h\"\n");
2250 fprintf (f, "#include \"compiler/compemu.h\"\n");
2251 fprintf (f, "#include \"fpu/fpu.h\"\n");
2252 fprintf (f, "#include \"cputbl.h\"\n");
2253
2254 fprintf (f, "#define SET_CFLG_ALWAYS(x) SET_CFLG(x)\n");
2255 fprintf (f, "#define SET_NFLG_ALWAYS(x) SET_NFLG(x)\n");
2256 fprintf (f, "#define CPUFUNC_FF(x) x##_ff\n");
2257 fprintf (f, "#define CPUFUNC_NF(x) x##_nf\n");
2258 fprintf (f, "#define CPUFUNC(x) CPUFUNC_FF(x)\n");
2259
2260 fprintf (f, "#ifdef NOFLAGS\n");
2261 fprintf (f, "# include \"noflags.h\"\n");
2262 fprintf (f, "#endif\n");
2263 }
2264
2265 static int postfix;
2266
2267 static void generate_one_opcode (int rp)
2268 {
2269 uae_u16 smsk, dmsk;
2270 long int opcode = opcode_map[rp];
2271 const char *opcode_str;
2272
2273 if (table68k[opcode].mnemo == i_ILLG
2274 || table68k[opcode].clev > cpu_level)
2275 return;
2276
2277 if (table68k[opcode].handler != -1)
2278 return;
2279
2280 opcode_str = get_instruction_string (opcode);
2281
2282 if (opcode_next_clev[rp] != cpu_level) {
2283 if (table68k[opcode].flagdead == 0)
2284 /* force to the "ff" variant since the instruction doesn't set at all the condition codes */
2285 fprintf (stblfile, "{ CPUFUNC_FF(op_%lx_%d), 0, %ld }, /* %s */\n", opcode, opcode_last_postfix[rp],
2286 opcode, opcode_str);
2287 else
2288 fprintf (stblfile, "{ CPUFUNC(op_%lx_%d), 0, %ld }, /* %s */\n", opcode, opcode_last_postfix[rp],
2289 opcode, opcode_str);
2290 return;
2291 }
2292
2293 if (table68k[opcode].flagdead == 0)
2294 /* force to the "ff" variant since the instruction doesn't set at all the condition codes */
2295 fprintf (stblfile, "{ CPUFUNC_FF(op_%lx_%d), 0, %ld }, /* %s */\n", opcode, postfix, opcode, opcode_str);
2296 else
2297 fprintf (stblfile, "{ CPUFUNC(op_%lx_%d), 0, %ld }, /* %s */\n", opcode, postfix, opcode, opcode_str);
2298
2299 fprintf (headerfile, "extern cpuop_func op_%lx_%d_nf;\n", opcode, postfix);
2300 fprintf (headerfile, "extern cpuop_func op_%lx_%d_ff;\n", opcode, postfix);
2301
2302 /* gb-- The "nf" variant for an instruction that doesn't set the condition
2303 codes at all is the same as the "ff" variant, so we don't need the "nf"
2304 variant to be compiled since it is mapped to the "ff" variant in the
2305 smalltbl. */
2306 if (table68k[opcode].flagdead == 0)
2307 printf ("#ifndef NOFLAGS\n");
2308
2309 printf ("void REGPARAM2 CPUFUNC(op_%lx_%d)(uae_u32 opcode) /* %s */\n{\n", opcode, postfix, opcode_str);
2310 printf ("\tcpuop_begin();\n");
2311
2312 switch (table68k[opcode].stype) {
2313 case 0: smsk = 7; break;
2314 case 1: smsk = 255; break;
2315 case 2: smsk = 15; break;
2316 case 3: smsk = 7; break;
2317 case 4: smsk = 7; break;
2318 case 5: smsk = 63; break;
2319 case 6: smsk = 255; break;
2320 case 7: smsk = 3; break;
2321 default: abort ();
2322 }
2323 dmsk = 7;
2324
2325 next_cpu_level = -1;
2326 if (table68k[opcode].suse
2327 && table68k[opcode].smode != imm && table68k[opcode].smode != imm0
2328 && table68k[opcode].smode != imm1 && table68k[opcode].smode != imm2
2329 && table68k[opcode].smode != absw && table68k[opcode].smode != absl
2330 && table68k[opcode].smode != PC8r && table68k[opcode].smode != PC16
2331 /* gb-- We don't want to fetch the EmulOp code since the EmulOp()
2332 routine uses the whole opcode value. Maybe all the EmulOps
2333 could be expanded out but I don't think it is an improvement */
2334 && table68k[opcode].stype != 6
2335 )
2336 {
2337 if (table68k[opcode].spos == -1) {
2338 if (((int) table68k[opcode].sreg) >= 128)
2339 printf ("\tuae_u32 srcreg = (uae_s32)(uae_s8)%d;\n", (int) table68k[opcode].sreg);
2340 else
2341 printf ("\tuae_u32 srcreg = %d;\n", (int) table68k[opcode].sreg);
2342 } else {
2343 char source[100];
2344 int pos = table68k[opcode].spos;
2345
2346 #if 0
2347 /* Check that we can do the little endian optimization safely. */
2348 if (pos < 8 && (smsk >> (8 - pos)) != 0)
2349 abort ();
2350 #endif
2351 printf ("#ifdef HAVE_GET_WORD_UNSWAPPED\n");
2352
2353 if (pos < 8 && (smsk >> (8 - pos)) != 0)
2354 sprintf (source, "(((opcode >> %d) | (opcode << %d)) & %d)",
2355 pos ^ 8, 8 - pos, dmsk);
2356 else if (pos != 8)
2357 sprintf (source, "((opcode >> %d) & %d)", pos ^ 8, smsk);
2358 else
2359 sprintf (source, "(opcode & %d)", smsk);
2360
2361 if (table68k[opcode].stype == 3)
2362 printf ("\tuae_u32 srcreg = imm8_table[%s];\n", source);
2363 else if (table68k[opcode].stype == 1)
2364 printf ("\tuae_u32 srcreg = (uae_s32)(uae_s8)%s;\n", source);
2365 else
2366 printf ("\tuae_u32 srcreg = %s;\n", source);
2367
2368 printf ("#else\n");
2369
2370 if (pos)
2371 sprintf (source, "((opcode >> %d) & %d)", pos, smsk);
2372 else
2373 sprintf (source, "(opcode & %d)", smsk);
2374
2375 if (table68k[opcode].stype == 3)
2376 printf ("\tuae_u32 srcreg = imm8_table[%s];\n", source);
2377 else if (table68k[opcode].stype == 1)
2378 printf ("\tuae_u32 srcreg = (uae_s32)(uae_s8)%s;\n", source);
2379 else
2380 printf ("\tuae_u32 srcreg = %s;\n", source);
2381
2382 printf ("#endif\n");
2383 }
2384 }
2385 if (table68k[opcode].duse
2386 /* Yes, the dmode can be imm, in case of LINK or DBcc */
2387 && table68k[opcode].dmode != imm && table68k[opcode].dmode != imm0
2388 && table68k[opcode].dmode != imm1 && table68k[opcode].dmode != imm2
2389 && table68k[opcode].dmode != absw && table68k[opcode].dmode != absl)
2390 {
2391 if (table68k[opcode].dpos == -1) {
2392 if (((int) table68k[opcode].dreg) >= 128)
2393 printf ("\tuae_u32 dstreg = (uae_s32)(uae_s8)%d;\n", (int) table68k[opcode].dreg);
2394 else
2395 printf ("\tuae_u32 dstreg = %d;\n", (int) table68k[opcode].dreg);
2396 } else {
2397 int pos = table68k[opcode].dpos;
2398 #if 0
2399 /* Check that we can do the little endian optimization safely. */
2400 if (pos < 8 && (dmsk >> (8 - pos)) != 0)
2401 abort ();
2402 #endif
2403 printf ("#ifdef HAVE_GET_WORD_UNSWAPPED\n");
2404
2405 if (pos < 8 && (dmsk >> (8 - pos)) != 0)
2406 printf ("\tuae_u32 dstreg = ((opcode >> %d) | (opcode << %d)) & %d;\n",
2407 pos ^ 8, 8 - pos, dmsk);
2408 else if (pos != 8)
2409 printf ("\tuae_u32 dstreg = (opcode >> %d) & %d;\n",
2410 pos ^ 8, dmsk);
2411 else
2412 printf ("\tuae_u32 dstreg = opcode & %d;\n", dmsk);
2413
2414 printf ("#else\n");
2415
2416 if (pos)
2417 printf ("\tuae_u32 dstreg = (opcode >> %d) & %d;\n",
2418 pos, dmsk);
2419 else
2420 printf ("\tuae_u32 dstreg = opcode & %d;\n", dmsk);
2421
2422 printf ("#endif\n");
2423 }
2424 }
2425 need_endlabel = 0;
2426 endlabelno++;
2427 sprintf (endlabelstr, "endlabel%d", endlabelno);
2428 gen_opcode (opcode);
2429 if (need_endlabel)
2430 printf ("%s: ;\n", endlabelstr);
2431 printf ("\tcpuop_end();\n");
2432 printf ("}\n");
2433 if (table68k[opcode].flagdead == 0)
2434 printf ("\n#endif\n");
2435 opcode_next_clev[rp] = next_cpu_level;
2436 opcode_last_postfix[rp] = postfix;
2437 }
2438
2439 static void generate_func (void)
2440 {
2441 int i, j, rp;
2442
2443 using_prefetch = 0;
2444 using_exception_3 = 0;
2445 #if !USE_PREFETCH_BUFFER
2446 /* gb-- No need for a prefetch buffer, nor exception 3 handling */
2447 /* Anyway, Basilisk2 does not use the op_smalltbl_5 table... */
2448 for (i = 0; i <= 4; i++) {
2449 #else
2450 for (i = 0; i < 6; i++) {
2451 #endif
2452 cpu_level = 4 - i;
2453 if (i == 5) {
2454 cpu_level = 0;
2455 using_prefetch = 1;
2456 using_exception_3 = 1;
2457 for (rp = 0; rp < nr_cpuop_funcs; rp++)
2458 opcode_next_clev[rp] = 0;
2459 }
2460 postfix = i;
2461 fprintf (stblfile, "struct cputbl CPUFUNC(op_smalltbl_%d)[] = {\n", postfix);
2462
2463 /* sam: this is for people with low memory (eg. me :)) */
2464 printf ("\n"
2465 "#if !defined(PART_1) && !defined(PART_2) && "
2466 "!defined(PART_3) && !defined(PART_4) && "
2467 "!defined(PART_5) && !defined(PART_6) && "
2468 "!defined(PART_7) && !defined(PART_8)"
2469 "\n"
2470 "#define PART_1 1\n"
2471 "#define PART_2 1\n"
2472 "#define PART_3 1\n"
2473 "#define PART_4 1\n"
2474 "#define PART_5 1\n"
2475 "#define PART_6 1\n"
2476 "#define PART_7 1\n"
2477 "#define PART_8 1\n"
2478 "#endif\n\n");
2479
2480 rp = 0;
2481 for(j=1;j<=8;++j) {
2482 int k = (j*nr_cpuop_funcs)/8;
2483 printf ("#ifdef PART_%d\n",j);
2484 for (; rp < k; rp++)
2485 generate_one_opcode (rp);
2486 printf ("#endif\n\n");
2487 }
2488
2489 fprintf (stblfile, "{ 0, 0, 0 }};\n");
2490 }
2491 }
2492
2493 int main (int argc, char **argv)
2494 {
2495 FILE *out;
2496 read_table68k ();
2497 do_merges ();
2498
2499 opcode_map = (int *) malloc (sizeof (int) * nr_cpuop_funcs);
2500 opcode_last_postfix = (int *) malloc (sizeof (int) * nr_cpuop_funcs);
2501 opcode_next_clev = (int *) malloc (sizeof (int) * nr_cpuop_funcs);
2502 counts = (unsigned long *) malloc (65536 * sizeof (unsigned long));
2503 read_counts ();
2504
2505 /* It would be a lot nicer to put all in one file (we'd also get rid of
2506 * cputbl.h that way), but cpuopti can't cope. That could be fixed, but
2507 * I don't dare to touch the 68k version. */
2508
2509 headerfile = fopen ("cputbl.h", "w");
2510 stblfile = fopen ("cpustbl.cpp", "w");
2511 out = freopen ("cpuemu.cpp", "w", stdout);
2512
2513 generate_includes (stdout);
2514 generate_includes (stblfile);
2515
2516 generate_func ();
2517
2518 free (table68k);
2519 fclose (headerfile);
2520 fclose (stblfile);
2521 fflush (out);
2522 return 0;
2523 }