]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - sim/cr16/simops.c
2fa60c5a6f200ae6f7e67de5e816e2c7ccf9d97c
[thirdparty/binutils-gdb.git] / sim / cr16 / simops.c
1 /* Simulation code for the CR16 processor.
2 Copyright (C) 2008-2014 Free Software Foundation, Inc.
3 Contributed by M Ranga Swami Reddy <MR.Swami.Reddy@nsc.com>
4
5 This file is part of GDB, the GNU debugger.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
10 any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
19
20
21 #include "config.h"
22
23 #include <signal.h>
24 #include <errno.h>
25 #include <sys/types.h>
26 #include <sys/stat.h>
27 #ifdef HAVE_UNISTD_H
28 #include <unistd.h>
29 #endif
30 #ifdef HAVE_STRING_H
31 #include <string.h>
32 #endif
33
34 #include "cr16_sim.h"
35 #include "simops.h"
36 #include "targ-vals.h"
37
38 extern char *strrchr ();
39
40 enum op_types {
41 OP_VOID,
42 OP_CONSTANT3,
43 OP_UCONSTANT3,
44 OP_CONSTANT4,
45 OP_CONSTANT4_1,
46 OP_CONSTANT5,
47 OP_CONSTANT6,
48 OP_CONSTANT16,
49 OP_UCONSTANT16,
50 OP_CONSTANT20,
51 OP_UCONSTANT20,
52 OP_CONSTANT32,
53 OP_UCONSTANT32,
54 OP_MEMREF,
55 OP_MEMREF2,
56 OP_MEMREF3,
57
58 OP_DISP5,
59 OP_DISP17,
60 OP_DISP25,
61 OP_DISPE9,
62 //OP_ABS20,
63 OP_ABS20_OUTPUT,
64 //OP_ABS24,
65 OP_ABS24_OUTPUT,
66
67 OP_R_BASE_DISPS16,
68 OP_R_BASE_DISP20,
69 OP_R_BASE_DISPS20,
70 OP_R_BASE_DISPE20,
71
72 OP_RP_BASE_DISPE0,
73 OP_RP_BASE_DISP4,
74 OP_RP_BASE_DISPE4,
75 OP_RP_BASE_DISP14,
76 OP_RP_BASE_DISP16,
77 OP_RP_BASE_DISP20,
78 OP_RP_BASE_DISPS20,
79 OP_RP_BASE_DISPE20,
80
81 OP_R_INDEX7_ABS20,
82 OP_R_INDEX8_ABS20,
83
84 OP_RP_INDEX_DISP0,
85 OP_RP_INDEX_DISP14,
86 OP_RP_INDEX_DISP20,
87 OP_RP_INDEX_DISPS20,
88
89 OP_REG,
90 OP_REGP,
91 OP_PROC_REG,
92 OP_PROC_REGP,
93 OP_COND,
94 OP_RA
95 };
96
97
98 enum {
99 PSR_MASK = (PSR_I_BIT
100 | PSR_P_BIT
101 | PSR_E_BIT
102 | PSR_N_BIT
103 | PSR_Z_BIT
104 | PSR_F_BIT
105 | PSR_U_BIT
106 | PSR_L_BIT
107 | PSR_T_BIT
108 | PSR_C_BIT),
109 /* The following bits in the PSR _can't_ be set by instructions such
110 as mvtc. */
111 PSR_HW_MASK = (PSR_MASK)
112 };
113
114 /* cond Code Condition True State
115 * EQ Equal Z flag is 1
116 * NE Not Equal Z flag is 0
117 * CS Carry Set C flag is 1
118 * CC Carry Clear C flag is 0
119 * HI Higher L flag is 1
120 * LS Lower or Same L flag is 0
121 * GT Greater Than N flag is 1
122 * LE Less Than or Equal To N flag is 0
123 * FS Flag Set F flag is 1
124 * FC Flag Clear F flag is 0
125 * LO Lower Z and L flags are 0
126 * HS Higher or Same Z or L flag is 1
127 * LT Less Than Z and N flags are 0
128 * GE Greater Than or Equal To Z or N flag is 1. */
129
130 int cond_stat(int cc)
131 {
132 switch (cc)
133 {
134 case 0: return PSR_Z; break;
135 case 1: return !PSR_Z; break;
136 case 2: return PSR_C; break;
137 case 3: return !PSR_C; break;
138 case 4: return PSR_L; break;
139 case 5: return !PSR_L; break;
140 case 6: return PSR_N; break;
141 case 7: return !PSR_N; break;
142 case 8: return PSR_F; break;
143 case 9: return !PSR_F; break;
144 case 10: return !PSR_Z && !PSR_L; break;
145 case 11: return PSR_Z || PSR_L; break;
146 case 12: return !PSR_Z && !PSR_N; break;
147 case 13: return PSR_Z || PSR_N; break;
148 case 14: return 1; break; /*ALWAYS. */
149 default:
150 // case NEVER: return false; break;
151 //case NO_COND_CODE:
152 //panic("Shouldn't have NO_COND_CODE in an actual instruction!");
153 return 0; break;
154 }
155 return 0;
156 }
157
158
159 creg_t
160 move_to_cr (int cr, creg_t mask, creg_t val, int psw_hw_p)
161 {
162 /* A MASK bit is set when the corresponding bit in the CR should
163 be left alone. */
164 /* This assumes that (VAL & MASK) == 0. */
165 switch (cr)
166 {
167 case PSR_CR:
168 if (psw_hw_p)
169 val &= PSR_HW_MASK;
170 #if 0
171 else
172 val &= PSR_MASK;
173 (*cr16_callback->printf_filtered)
174 (cr16_callback,
175 "ERROR at PC 0x%x: ST can only be set when FX is set.\n", PC);
176 State.exception = SIGILL;
177 #endif
178 /* keep an up-to-date psw around for tracing. */
179 State.trace.psw = (State.trace.psw & mask) | val;
180 break;
181 default:
182 break;
183 }
184 /* only issue an update if the register is being changed. */
185 if ((State.cregs[cr] & ~mask) != val)
186 SLOT_PEND_MASK (State.cregs[cr], mask, val);
187
188 return val;
189 }
190
191 #ifdef DEBUG
192 static void trace_input_func (char *name,
193 enum op_types in1,
194 enum op_types in2,
195 enum op_types in3);
196
197 #define trace_input(name, in1, in2, in3) do { if (cr16_debug) trace_input_func (name, in1, in2, in3); } while (0)
198
199 #ifndef SIZE_INSTRUCTION
200 #define SIZE_INSTRUCTION 8
201 #endif
202
203 #ifndef SIZE_OPERANDS
204 #define SIZE_OPERANDS 18
205 #endif
206
207 #ifndef SIZE_VALUES
208 #define SIZE_VALUES 13
209 #endif
210
211 #ifndef SIZE_LOCATION
212 #define SIZE_LOCATION 20
213 #endif
214
215 #ifndef SIZE_PC
216 #define SIZE_PC 4
217 #endif
218
219 #ifndef SIZE_LINE_NUMBER
220 #define SIZE_LINE_NUMBER 2
221 #endif
222
223 static void
224 trace_input_func (name, in1, in2, in3)
225 char *name;
226 enum op_types in1;
227 enum op_types in2;
228 enum op_types in3;
229 {
230 char *comma;
231 enum op_types in[3];
232 int i;
233 char buf[1024];
234 char *p;
235 long tmp;
236 char *type;
237 const char *filename;
238 const char *functionname;
239 unsigned int linenumber;
240 bfd_vma byte_pc;
241
242 if ((cr16_debug & DEBUG_TRACE) == 0)
243 return;
244
245 switch (State.ins_type)
246 {
247 default:
248 case INS_UNKNOWN: type = " ?"; break;
249 }
250
251 if ((cr16_debug & DEBUG_LINE_NUMBER) == 0)
252 (*cr16_callback->printf_filtered) (cr16_callback,
253 "0x%.*x %s: %-*s ",
254 SIZE_PC, (unsigned)PC,
255 type,
256 SIZE_INSTRUCTION, name);
257
258 else
259 {
260 buf[0] = '\0';
261 byte_pc = decode_pc ();
262 if (text && byte_pc >= text_start && byte_pc < text_end)
263 {
264 filename = (const char *)0;
265 functionname = (const char *)0;
266 linenumber = 0;
267 if (bfd_find_nearest_line (prog_bfd, text, (struct bfd_symbol **)0, byte_pc - text_start,
268 &filename, &functionname, &linenumber))
269 {
270 p = buf;
271 if (linenumber)
272 {
273 sprintf (p, "#%-*d ", SIZE_LINE_NUMBER, linenumber);
274 p += strlen (p);
275 }
276 else
277 {
278 sprintf (p, "%-*s ", SIZE_LINE_NUMBER+1, "---");
279 p += SIZE_LINE_NUMBER+2;
280 }
281
282 if (functionname)
283 {
284 sprintf (p, "%s ", functionname);
285 p += strlen (p);
286 }
287 else if (filename)
288 {
289 char *q = strrchr (filename, '/');
290 sprintf (p, "%s ", (q) ? q+1 : filename);
291 p += strlen (p);
292 }
293
294 if (*p == ' ')
295 *p = '\0';
296 }
297 }
298
299 (*cr16_callback->printf_filtered) (cr16_callback,
300 "0x%.*x %s: %-*.*s %-*s ",
301 SIZE_PC, (unsigned)PC,
302 type,
303 SIZE_LOCATION, SIZE_LOCATION, buf,
304 SIZE_INSTRUCTION, name);
305 }
306
307 in[0] = in1;
308 in[1] = in2;
309 in[2] = in3;
310 comma = "";
311 p = buf;
312 for (i = 0; i < 3; i++)
313 {
314 switch (in[i])
315 {
316 case OP_VOID:
317 break;
318
319 case OP_REG:
320 case OP_REGP:
321 sprintf (p, "%sr%d", comma, OP[i]);
322 p += strlen (p);
323 comma = ",";
324 break;
325
326 case OP_PROC_REG:
327 sprintf (p, "%scr%d", comma, OP[i]);
328 p += strlen (p);
329 comma = ",";
330 break;
331
332 case OP_CONSTANT16:
333 sprintf (p, "%s%d", comma, OP[i]);
334 p += strlen (p);
335 comma = ",";
336 break;
337
338 case OP_CONSTANT4:
339 sprintf (p, "%s%d", comma, SEXT4(OP[i]));
340 p += strlen (p);
341 comma = ",";
342 break;
343
344 case OP_CONSTANT3:
345 sprintf (p, "%s%d", comma, SEXT3(OP[i]));
346 p += strlen (p);
347 comma = ",";
348 break;
349
350 case OP_MEMREF:
351 sprintf (p, "%s@r%d", comma, OP[i]);
352 p += strlen (p);
353 comma = ",";
354 break;
355
356 case OP_MEMREF2:
357 sprintf (p, "%s@(%d,r%d)", comma, (int16)OP[i], OP[i+1]);
358 p += strlen (p);
359 comma = ",";
360 break;
361
362 case OP_MEMREF3:
363 sprintf (p, "%s@%d", comma, OP[i]);
364 p += strlen (p);
365 comma = ",";
366 break;
367 }
368 }
369
370 if ((cr16_debug & DEBUG_VALUES) == 0)
371 {
372 *p++ = '\n';
373 *p = '\0';
374 (*cr16_callback->printf_filtered) (cr16_callback, "%s", buf);
375 }
376 else
377 {
378 *p = '\0';
379 (*cr16_callback->printf_filtered) (cr16_callback, "%-*s", SIZE_OPERANDS, buf);
380
381 p = buf;
382 for (i = 0; i < 3; i++)
383 {
384 buf[0] = '\0';
385 switch (in[i])
386 {
387 case OP_VOID:
388 (*cr16_callback->printf_filtered) (cr16_callback, "%*s", SIZE_VALUES, "");
389 break;
390
391 case OP_REG:
392 (*cr16_callback->printf_filtered) (cr16_callback, "%*s0x%.4x", SIZE_VALUES-6, "",
393 (uint16) GPR (OP[i]));
394 break;
395
396 case OP_REGP:
397 tmp = (long)((((uint32) GPR (OP[i])) << 16) | ((uint32) GPR (OP[i] + 1)));
398 (*cr16_callback->printf_filtered) (cr16_callback, "%*s0x%.8lx", SIZE_VALUES-10, "", tmp);
399 break;
400
401 case OP_PROC_REG:
402 (*cr16_callback->printf_filtered) (cr16_callback, "%*s0x%.4x", SIZE_VALUES-6, "",
403 (uint16) CREG (OP[i]));
404 break;
405
406 case OP_CONSTANT16:
407 (*cr16_callback->printf_filtered) (cr16_callback, "%*s0x%.4x", SIZE_VALUES-6, "",
408 (uint16)OP[i]);
409 break;
410
411 case OP_CONSTANT4:
412 (*cr16_callback->printf_filtered) (cr16_callback, "%*s0x%.4x", SIZE_VALUES-6, "",
413 (uint16)SEXT4(OP[i]));
414 break;
415
416 case OP_CONSTANT3:
417 (*cr16_callback->printf_filtered) (cr16_callback, "%*s0x%.4x", SIZE_VALUES-6, "",
418 (uint16)SEXT3(OP[i]));
419 break;
420
421 case OP_MEMREF2:
422 (*cr16_callback->printf_filtered) (cr16_callback, "%*s0x%.4x", SIZE_VALUES-6, "",
423 (uint16)OP[i]);
424 (*cr16_callback->printf_filtered) (cr16_callback, "%*s0x%.4x", SIZE_VALUES-6, "",
425 (uint16)GPR (OP[i + 1]));
426 i++;
427 break;
428 }
429 }
430 }
431
432 (*cr16_callback->flush_stdout) (cr16_callback);
433 }
434
435 static void
436 do_trace_output_flush (void)
437 {
438 (*cr16_callback->flush_stdout) (cr16_callback);
439 }
440
441 static void
442 do_trace_output_finish (void)
443 {
444 (*cr16_callback->printf_filtered) (cr16_callback,
445 " F0=%d F1=%d C=%d\n",
446 (State.trace.psw & PSR_F_BIT) != 0,
447 (State.trace.psw & PSR_F_BIT) != 0,
448 (State.trace.psw & PSR_C_BIT) != 0);
449 (*cr16_callback->flush_stdout) (cr16_callback);
450 }
451
452 static void
453 trace_output_40 (uint64 val)
454 {
455 if ((cr16_debug & (DEBUG_TRACE | DEBUG_VALUES)) == (DEBUG_TRACE | DEBUG_VALUES))
456 {
457 (*cr16_callback->printf_filtered) (cr16_callback,
458 " :: %*s0x%.2x%.8lx",
459 SIZE_VALUES - 12,
460 "",
461 ((int)(val >> 32) & 0xff),
462 ((unsigned long) val) & 0xffffffff);
463 do_trace_output_finish ();
464 }
465 }
466
467 static void
468 trace_output_32 (uint32 val)
469 {
470 if ((cr16_debug & (DEBUG_TRACE | DEBUG_VALUES)) == (DEBUG_TRACE | DEBUG_VALUES))
471 {
472 (*cr16_callback->printf_filtered) (cr16_callback,
473 " :: %*s0x%.8x",
474 SIZE_VALUES - 10,
475 "",
476 (int) val);
477 do_trace_output_finish ();
478 }
479 }
480
481 static void
482 trace_output_16 (uint16 val)
483 {
484 if ((cr16_debug & (DEBUG_TRACE | DEBUG_VALUES)) == (DEBUG_TRACE | DEBUG_VALUES))
485 {
486 (*cr16_callback->printf_filtered) (cr16_callback,
487 " :: %*s0x%.4x",
488 SIZE_VALUES - 6,
489 "",
490 (int) val);
491 do_trace_output_finish ();
492 }
493 }
494
495 static void
496 trace_output_void ()
497 {
498 if ((cr16_debug & (DEBUG_TRACE | DEBUG_VALUES)) == (DEBUG_TRACE | DEBUG_VALUES))
499 {
500 (*cr16_callback->printf_filtered) (cr16_callback, "\n");
501 do_trace_output_flush ();
502 }
503 }
504
505 static void
506 trace_output_flag ()
507 {
508 if ((cr16_debug & (DEBUG_TRACE | DEBUG_VALUES)) == (DEBUG_TRACE | DEBUG_VALUES))
509 {
510 (*cr16_callback->printf_filtered) (cr16_callback,
511 " :: %*s",
512 SIZE_VALUES,
513 "");
514 do_trace_output_finish ();
515 }
516 }
517
518
519
520
521 #else
522 #define trace_input(NAME, IN1, IN2, IN3)
523 #define trace_output(RESULT)
524 #endif
525
526 /* addub. */
527 void
528 OP_2C_8 ()
529 {
530 uint8 tmp;
531 uint8 a = OP[0] & 0xff;
532 uint16 b = (GPR (OP[1])) & 0xff;
533 trace_input ("addub", OP_CONSTANT4_1, OP_REG, OP_VOID);
534 tmp = (a + b) & 0xff;
535 SET_GPR (OP[1], (tmp | ((GPR (OP[1])) & 0xff00)));
536 trace_output_16 (tmp);
537 }
538
539 /* addub. */
540 void
541 OP_2CB_C ()
542 {
543 uint16 tmp;
544 uint8 a = ((OP[0]) & 0xff), b = (GPR (OP[1])) & 0xff;
545 trace_input ("addub", OP_CONSTANT16, OP_REG, OP_VOID);
546 tmp = (a + b) & 0xff;
547 SET_GPR (OP[1], (tmp | ((GPR (OP[1])) & 0xff00)));
548 trace_output_16 (tmp);
549 }
550
551 /* addub. */
552 void
553 OP_2D_8 ()
554 {
555 uint8 a = (GPR (OP[0])) & 0xff;
556 uint8 b = (GPR (OP[1])) & 0xff;
557 uint16 tmp = (a + b) & 0xff;
558 trace_input ("addub", OP_REG, OP_REG, OP_VOID);
559 SET_GPR (OP[1], (tmp | ((GPR (OP[1])) & 0xff00)));
560 trace_output_16 (tmp);
561 }
562
563 /* adduw. */
564 void
565 OP_2E_8 ()
566 {
567 uint16 a = OP[0];
568 uint16 b = GPR (OP[1]);
569 uint16 tmp = (a + b);
570 trace_input ("adduw", OP_CONSTANT4_1, OP_REG, OP_VOID);
571 SET_GPR (OP[1], tmp);
572 trace_output_16 (tmp);
573 }
574
575 /* adduw. */
576 void
577 OP_2EB_C ()
578 {
579 uint16 a = OP[0];
580 uint16 b = GPR (OP[1]);
581 uint16 tmp = (a + b);
582 trace_input ("adduw", OP_CONSTANT16, OP_REG, OP_VOID);
583 SET_GPR (OP[1], tmp);
584 trace_output_16 (tmp);
585 }
586
587 /* adduw. */
588 void
589 OP_2F_8 ()
590 {
591 uint16 a = GPR (OP[0]);
592 uint16 b = GPR (OP[1]);
593 uint16 tmp = (a + b);
594 trace_input ("adduw", OP_REG, OP_REG, OP_VOID);
595 SET_GPR (OP[1], tmp);
596 trace_output_16 (tmp);
597 }
598
599 /* addb. */
600 void
601 OP_30_8 ()
602 {
603 uint8 a = OP[0];
604 uint8 b = (GPR (OP[1]) & 0xff);
605 trace_input ("addb", OP_CONSTANT4_1, OP_REG, OP_VOID);
606 uint16 tmp = (a + b) & 0xff;
607 SET_GPR (OP[1], (tmp | ((GPR (OP[1])) & 0xff00)));
608 SET_PSR_C (tmp > 0xFF);
609 SET_PSR_F (((a & 0x80) == (b & 0x80)) && ((b & 0x80) != (tmp & 0x80)));
610 trace_output_16 (tmp);
611 }
612
613 /* addb. */
614 void
615 OP_30B_C ()
616 {
617 uint8 a = (OP[0]) & 0xff;
618 uint8 b = (GPR (OP[1]) & 0xff);
619 trace_input ("addb", OP_CONSTANT16, OP_REG, OP_VOID);
620 uint16 tmp = (a + b) & 0xff;
621 SET_GPR (OP[1], (tmp | ((GPR (OP[1])) & 0xff00)));
622 SET_PSR_C (tmp > 0xFF);
623 SET_PSR_F (((a & 0x80) == (b & 0x80)) && ((b & 0x80) != (tmp & 0x80)));
624 trace_output_16 (tmp);
625 }
626
627 /* addb. */
628 void
629 OP_31_8 ()
630 {
631 uint8 a = (GPR (OP[0]) & 0xff);
632 uint8 b = (GPR (OP[1]) & 0xff);
633 trace_input ("addb", OP_REG, OP_REG, OP_VOID);
634 uint16 tmp = (a + b) & 0xff;
635 SET_GPR (OP[1], (tmp | ((GPR (OP[1])) & 0xff00)));
636 SET_PSR_C (tmp > 0xFF);
637 SET_PSR_F (((a & 0x80) == (b & 0x80)) && ((b & 0x80) != (tmp & 0x80)));
638 trace_output_16 (tmp);
639 }
640
641 /* addw. */
642 void
643 OP_32_8 ()
644 {
645 int16 a = OP[0];
646 uint16 tmp, b = GPR (OP[1]);
647 trace_input ("addw", OP_CONSTANT4_1, OP_REG, OP_VOID);
648 tmp = (a + b);
649 SET_GPR (OP[1], tmp);
650 SET_PSR_C (tmp > 0xFFFF);
651 SET_PSR_F (((a & 0x8000) == (b & 0x8000)) && ((b & 0x8000) != (tmp & 0x8000)));
652 trace_output_16 (tmp);
653 }
654
655 /* addw. */
656 void
657 OP_32B_C ()
658 {
659 int16 a = OP[0];
660 uint16 tmp, b = GPR (OP[1]);
661 tmp = (a + b);
662 trace_input ("addw", OP_CONSTANT16, OP_REG, OP_VOID);
663 SET_GPR (OP[1], tmp);
664 SET_PSR_C (tmp > 0xFFFF);
665 SET_PSR_F (((a & 0x8000) == (b & 0x8000)) && ((b & 0x8000) != (tmp & 0x8000)));
666 trace_output_16 (tmp);
667 }
668
669 /* addw. */
670 void
671 OP_33_8 ()
672 {
673 uint16 tmp, a = (GPR (OP[0])), b = (GPR (OP[1]));
674 trace_input ("addw", OP_REG, OP_REG, OP_VOID);
675 tmp = (a + b);
676 SET_GPR (OP[1], tmp);
677 SET_PSR_C (tmp > 0xFFFF);
678 SET_PSR_F (((a & 0x8000) == (b & 0x8000)) && ((b & 0x8000) != (tmp & 0x8000)));
679 trace_output_16 (tmp);
680 }
681
682 /* addcb. */
683 void
684 OP_34_8 ()
685 {
686 uint8 tmp, a = OP[0] & 0xff, b = (GPR (OP[1])) & 0xff;
687 trace_input ("addcb", OP_CONSTANT4_1, OP_REG, OP_REG);
688 tmp = (a + b + PSR_C) & 0xff;
689 SET_GPR (OP[1], (tmp | ((GPR (OP[1])) & 0xff00)));
690 SET_PSR_C (tmp > 0xFF);
691 SET_PSR_F (((a & 0x80) == (b & 0x80)) && ((b & 0x80) != (tmp & 0x80)));
692 trace_output_16 (tmp);
693 }
694
695 /* addcb. */
696 void
697 OP_34B_C ()
698 {
699 int8 a = OP[0] & 0xff;
700 uint8 b = (GPR (OP[1])) & 0xff;
701 trace_input ("addcb", OP_CONSTANT16, OP_REG, OP_VOID);
702 uint8 tmp = (a + b + PSR_C) & 0xff;
703 SET_GPR (OP[1], (tmp | ((GPR (OP[1])) & 0xff00)));
704 SET_PSR_C (tmp > 0xFF);
705 SET_PSR_F (((a & 0x80) == (b & 0x80)) && ((b & 0x80) != (tmp & 0x80)));
706 trace_output_16 (tmp);
707 }
708
709 /* addcb. */
710 void
711 OP_35_8 ()
712 {
713 uint8 a = (GPR (OP[0])) & 0xff;
714 uint8 b = (GPR (OP[1])) & 0xff;
715 trace_input ("addcb", OP_REG, OP_REG, OP_VOID);
716 uint8 tmp = (a + b + PSR_C) & 0xff;
717 SET_GPR (OP[1], (tmp | ((GPR (OP[1])) & 0xff00)));
718 SET_PSR_C (tmp > 0xFF);
719 SET_PSR_F (((a & 0x80) == (b & 0x80)) && ((b & 0x80) != (tmp & 0x80)));
720 trace_output_16 (tmp);
721 }
722
723 /* addcw. */
724 void
725 OP_36_8 ()
726 {
727 uint16 a = OP[0];
728 uint16 b = GPR (OP[1]);
729 trace_input ("addcw", OP_CONSTANT4_1, OP_REG, OP_VOID);
730 uint16 tmp = (a + b + PSR_C);
731 SET_GPR (OP[1], tmp);
732 SET_PSR_C (tmp > 0xFFFF);
733 SET_PSR_F (((a & 0x8000) == (b & 0x8000)) && ((b & 0x8000) != (tmp & 0x8000)));
734 trace_output_16 (tmp);
735 }
736
737 /* addcw. */
738 void
739 OP_36B_C ()
740 {
741 int16 a = OP[0];
742 uint16 b = GPR (OP[1]);
743 trace_input ("addcw", OP_CONSTANT16, OP_REG, OP_VOID);
744 uint16 tmp = (a + b + PSR_C);
745 SET_GPR (OP[1], tmp);
746 SET_PSR_C (tmp > 0xFFFF);
747 SET_PSR_F (((a & 0x8000) == (b & 0x8000)) && ((b & 0x8000) != (tmp & 0x8000)));
748 trace_output_16 (tmp);
749 }
750
751 /* addcw. */
752 void
753 OP_37_8 ()
754 {
755 uint16 a = GPR (OP[1]);
756 uint16 b = GPR (OP[1]);
757 trace_input ("addcw", OP_REG, OP_REG, OP_VOID);
758 uint16 tmp = (a + b + PSR_C);
759 SET_GPR (OP[1], tmp);
760 SET_PSR_C (tmp > 0xFFFF);
761 SET_PSR_F (((a & 0x8000) == (b & 0x8000)) && ((b & 0x8000) != (tmp & 0x8000)));
762 trace_output_16 (tmp);
763 }
764
765 /* addd. */
766 void
767 OP_60_8 ()
768 {
769 int16 a = (OP[0]);
770 uint32 b = GPR32 (OP[1]);
771 trace_input ("addd", OP_CONSTANT4_1, OP_REGP, OP_VOID);
772 uint32 tmp = (a + b);
773 SET_GPR32 (OP[1], tmp);
774 SET_PSR_C (tmp > 0xFFFFFFFF);
775 SET_PSR_F (((a & 0x80000000) == (b & 0x80000000)) && ((b & 0x80000000) != (tmp & 0x80000000)));
776 trace_output_32 (tmp);
777 }
778
779 /* addd. */
780 void
781 OP_60B_C ()
782 {
783 int32 a = (SEXT16(OP[0]));
784 uint32 b = GPR32 (OP[1]);
785 trace_input ("addd", OP_CONSTANT16, OP_REGP, OP_VOID);
786 uint32 tmp = (a + b);
787 SET_GPR32 (OP[1], tmp);
788 SET_PSR_C (tmp > 0xFFFFFFFF);
789 SET_PSR_F (((a & 0x80000000) == (b & 0x80000000)) && ((b & 0x80000000) != (tmp & 0x80000000)));
790 trace_output_32 (tmp);
791 }
792
793 /* addd. */
794 void
795 OP_61_8 ()
796 {
797 uint32 a = GPR32 (OP[0]);
798 uint32 b = GPR32 (OP[1]);
799 trace_input ("addd", OP_REGP, OP_REGP, OP_VOID);
800 uint32 tmp = (a + b);
801 SET_GPR32 (OP[1], tmp);
802 trace_output_32 (tmp);
803 SET_PSR_C (tmp > 0xFFFFFFFF);
804 SET_PSR_F (((a & 0x80000000) == (b & 0x80000000)) && ((b & 0x80000000) != (tmp & 0x80000000)));
805 }
806
807 /* addd. */
808 void
809 OP_4_8 ()
810 {
811 uint32 a = OP[0];
812 uint32 b = GPR32 (OP[1]);
813 uint32 tmp;
814 trace_input ("addd", OP_CONSTANT20, OP_REGP, OP_VOID);
815 tmp = (a + b);
816 SET_GPR32 (OP[1], tmp);
817 SET_PSR_C (tmp > 0xFFFFFFFF);
818 SET_PSR_F (((a & 0x80000000) == (b & 0x80000000)) && ((b & 0x80000000) != (tmp & 0x80000000)));
819 trace_output_32 (tmp);
820 }
821
822 /* addd. */
823 void
824 OP_2_C ()
825 {
826 int32 a = OP[0];
827 uint32 b = GPR32 (OP[1]);
828 uint32 tmp;
829 trace_input ("addd", OP_CONSTANT32, OP_REGP, OP_VOID);
830 tmp = (a + b);
831 SET_GPR32 (OP[1], tmp);
832 SET_PSR_C (tmp > 0xFFFFFFFF);
833 SET_PSR_F (((a & 0x80000000) == (b & 0x80000000)) && ((b & 0x80000000) != (tmp & 0x80000000)));
834 trace_output_32 (tmp);
835 }
836
837 /* andb. */
838 void
839 OP_20_8 ()
840 {
841 uint8 tmp, a = (OP[0]) & 0xff, b = (GPR (OP[1])) & 0xff;
842 trace_input ("andb", OP_CONSTANT4, OP_REG, OP_VOID);
843 tmp = a & b;
844 SET_GPR (OP[1], (tmp | ((GPR (OP[1])) & 0xff00)));
845 trace_output_16 (tmp);
846 }
847
848 /* andb. */
849 void
850 OP_20B_C ()
851 {
852 uint8 tmp, a = (OP[0]) & 0xff, b = (GPR (OP[1])) & 0xff;
853 trace_input ("andb", OP_CONSTANT16, OP_REG, OP_VOID);
854 tmp = a & b;
855 SET_GPR (OP[1], (tmp | ((GPR (OP[1])) & 0xff00)));
856 trace_output_16 (tmp);
857 }
858
859 /* andb. */
860 void
861 OP_21_8 ()
862 {
863 uint8 tmp, a = (GPR (OP[0])) & 0xff, b = (GPR (OP[1])) & 0xff;
864 trace_input ("andb", OP_REG, OP_REG, OP_VOID);
865 tmp = a & b;
866 SET_GPR (OP[1], (tmp | ((GPR (OP[1])) & 0xff00)));
867 trace_output_16 (tmp);
868 }
869
870 /* andw. */
871 void
872 OP_22_8 ()
873 {
874 uint16 tmp, a = OP[0], b = GPR (OP[1]);
875 trace_input ("andw", OP_CONSTANT4, OP_REG, OP_VOID);
876 tmp = a & b;
877 SET_GPR (OP[1], tmp);
878 trace_output_16 (tmp);
879 }
880
881 /* andw. */
882 void
883 OP_22B_C ()
884 {
885 uint16 tmp, a = OP[0], b = GPR (OP[1]);
886 trace_input ("andw", OP_CONSTANT16, OP_REG, OP_VOID);
887 tmp = a & b;
888 SET_GPR (OP[1], tmp);
889 trace_output_16 (tmp);
890 }
891
892 /* andw. */
893 void
894 OP_23_8 ()
895 {
896 uint16 tmp, a = GPR (OP[0]), b = GPR (OP[1]);
897 trace_input ("andw", OP_REG, OP_REG, OP_VOID);
898 tmp = a & b;
899 SET_GPR (OP[1], tmp);
900 trace_output_16 (tmp);
901 }
902
903 /* andd. */
904 void
905 OP_4_C ()
906 {
907 uint32 tmp, a = OP[0], b = GPR32 (OP[1]);
908 trace_input ("andd", OP_CONSTANT32, OP_REGP, OP_VOID);
909 tmp = a & b;
910 SET_GPR32 (OP[1], tmp);
911 trace_output_32 (tmp);
912 }
913
914 /* andd. */
915 void
916 OP_14B_14 ()
917 {
918 uint32 tmp, a = (GPR32 (OP[0])), b = (GPR32 (OP[1]));
919 trace_input ("andd", OP_REGP, OP_REGP, OP_VOID);
920 tmp = a & b;
921 SET_GPR32 (OP[1], tmp);
922 trace_output_32 (tmp);
923 }
924
925 /* ord. */
926 void
927 OP_5_C ()
928 {
929 uint32 tmp, a = (OP[0]), b = GPR32 (OP[1]);
930 trace_input ("ord", OP_CONSTANT32, OP_REG, OP_VOID);
931 tmp = a | b;
932 SET_GPR32 (OP[1], tmp);
933 trace_output_32 (tmp);
934 }
935
936 /* ord. */
937 void
938 OP_149_14 ()
939 {
940 uint32 tmp, a = GPR32 (OP[0]), b = GPR32 (OP[1]);
941 trace_input ("ord", OP_REGP, OP_REGP, OP_VOID);
942 tmp = a | b;
943 SET_GPR32 (OP[1], tmp);
944 trace_output_32 (tmp);
945 }
946
947 /* xord. */
948 void
949 OP_6_C ()
950 {
951 uint32 tmp, a = (OP[0]), b = GPR32 (OP[1]);
952 trace_input ("xord", OP_CONSTANT32, OP_REG, OP_VOID);
953 tmp = a ^ b;
954 SET_GPR32 (OP[1], tmp);
955 trace_output_32 (tmp);
956 }
957
958 /* xord. */
959 void
960 OP_14A_14 ()
961 {
962 uint32 tmp, a = GPR32 (OP[0]), b = GPR32 (OP[1]);
963 trace_input ("xord", OP_REGP, OP_REGP, OP_VOID);
964 tmp = a ^ b;
965 SET_GPR32 (OP[1], tmp);
966 trace_output_32 (tmp);
967 }
968
969
970 /* b. */
971 void
972 OP_1_4 ()
973 {
974 uint32 tmp, cc = cond_stat (OP[0]);
975 trace_input ("b", OP_CONSTANT4, OP_DISPE9, OP_VOID);
976 if (cc)
977 {
978 if (sign_flag)
979 tmp = (PC - (OP[1]));
980 else
981 tmp = (PC + (OP[1]));
982 /* If the resulting PC value is less than 0x00_0000 or greater
983 than 0xFF_FFFF, this instruction causes an IAD trap.*/
984
985 if ((tmp < 0x000000) || (tmp > 0xFFFFFF))
986 {
987 State.exception = SIG_CR16_BUS;
988 State.pc_changed = 1; /* Don't increment the PC. */
989 trace_output_void ();
990 return;
991 }
992 else
993 JMP (tmp);
994 }
995 sign_flag = 0; /* Reset sign_flag. */
996 trace_output_32 (tmp);
997 }
998
999 /* b. */
1000 void
1001 OP_18_8 ()
1002 {
1003 uint32 tmp, cc = cond_stat (OP[0]);
1004 trace_input ("b", OP_CONSTANT4, OP_DISP17, OP_VOID);
1005 if (cc)
1006 {
1007 if (sign_flag)
1008 tmp = (PC - OP[1]);
1009 else
1010 tmp = (PC + OP[1]);
1011 /* If the resulting PC value is less than 0x00_0000 or greater
1012 than 0xFF_FFFF, this instruction causes an IAD trap.*/
1013
1014 if ((tmp < 0x000000) || (tmp > 0xFFFFFF))
1015 {
1016 State.exception = SIG_CR16_BUS;
1017 State.pc_changed = 1; /* Don't increment the PC. */
1018 trace_output_void ();
1019 return;
1020 }
1021 else
1022 JMP (tmp);
1023 }
1024 sign_flag = 0; /* Reset sign_flag. */
1025 trace_output_32 (tmp);
1026 }
1027
1028 /* b. */
1029 void
1030 OP_10_10 ()
1031 {
1032 uint32 tmp, cc = cond_stat (OP[0]);
1033 trace_input ("b", OP_CONSTANT4, OP_DISP25, OP_VOID);
1034 if (cc)
1035 {
1036 if (sign_flag)
1037 tmp = (PC - (OP[1]));
1038 else
1039 tmp = (PC + (OP[1]));
1040 /* If the resulting PC value is less than 0x00_0000 or greater
1041 than 0xFF_FFFF, this instruction causes an IAD trap.*/
1042
1043 if ((tmp < 0x000000) || (tmp > 0xFFFFFF))
1044 {
1045 State.exception = SIG_CR16_BUS;
1046 State.pc_changed = 1; /* Don't increment the PC. */
1047 trace_output_void ();
1048 return;
1049 }
1050 else
1051 JMP (tmp);
1052 }
1053 sign_flag = 0; /* Reset sign_flag. */
1054 trace_output_32 (tmp);
1055 }
1056
1057 /* bal. */
1058 void
1059 OP_C0_8 ()
1060 {
1061 uint32 tmp;
1062 trace_input ("bal", OP_REG, OP_DISP17, OP_VOID);
1063 tmp = ((PC + 4) >> 1); /* Store PC in RA register. */
1064 SET_GPR32 (14, tmp);
1065 if (sign_flag)
1066 tmp = (PC - (OP[1]));
1067 else
1068 tmp = (PC + (OP[1]));
1069
1070 /* If the resulting PC value is less than 0x00_0000 or greater
1071 than 0xFF_FFFF, this instruction causes an IAD trap. */
1072
1073 if ((tmp < 0x000000) || (tmp > 0xFFFFFF))
1074 {
1075 State.exception = SIG_CR16_BUS;
1076 State.pc_changed = 1; /* Don't increment the PC. */
1077 trace_output_void ();
1078 return;
1079 }
1080 else
1081 JMP (tmp);
1082 sign_flag = 0; /* Reset sign_flag. */
1083 trace_output_32 (tmp);
1084 }
1085
1086
1087 /* bal. */
1088 void
1089 OP_102_14 ()
1090 {
1091 uint32 tmp;
1092 trace_input ("bal", OP_REGP, OP_DISP25, OP_VOID);
1093 tmp = (((PC) + 4) >> 1); /* Store PC in reg pair. */
1094 SET_GPR32 (OP[0], tmp);
1095 if (sign_flag)
1096 tmp = ((PC) - (OP[1]));
1097 else
1098 tmp = ((PC) + (OP[1]));
1099 /* If the resulting PC value is less than 0x00_0000 or greater
1100 than 0xFF_FFFF, this instruction causes an IAD trap.*/
1101
1102 if ((tmp < 0x000000) || (tmp > 0xFFFFFF))
1103 {
1104 State.exception = SIG_CR16_BUS;
1105 State.pc_changed = 1; /* Don't increment the PC. */
1106 trace_output_void ();
1107 return;
1108 }
1109 else
1110 JMP (tmp);
1111 sign_flag = 0; /* Reset sign_flag. */
1112 trace_output_32 (tmp);
1113 }
1114
1115 /* jal. */
1116 void
1117 OP_148_14 ()
1118 {
1119 uint32 tmp;
1120 trace_input ("jal", OP_REGP, OP_REGP, OP_VOID);
1121 SET_GPR32 (OP[0], (((PC) + 4) >> 1)); /* Store next PC in RA */
1122 tmp = GPR32 (OP[1]);
1123 tmp = SEXT24(tmp << 1);
1124 /* If the resulting PC value is less than 0x00_0000 or greater
1125 than 0xFF_FFFF, this instruction causes an IAD trap.*/
1126
1127 if ((tmp < 0x0) || (tmp > 0xFFFFFF))
1128 {
1129 State.exception = SIG_CR16_BUS;
1130 State.pc_changed = 1; /* Don't increment the PC. */
1131 trace_output_void ();
1132 return;
1133 }
1134 else
1135 JMP (tmp);
1136
1137 trace_output_32 (tmp);
1138 }
1139
1140
1141 /* jal. */
1142 void
1143 OP_D_C ()
1144 {
1145 uint32 tmp;
1146 trace_input ("jal", OP_REGP, OP_VOID, OP_VOID);
1147 SET_GPR32 (14, (((PC) + 2) >> 1)); /* Store next PC in RA */
1148 tmp = GPR32 (OP[0]);
1149 tmp = SEXT24(tmp << 1);
1150 /* If the resulting PC value is less than 0x00_0000 or greater
1151 than 0xFF_FFFF, this instruction causes an IAD trap.*/
1152
1153 if ((tmp < 0x0) || (tmp > 0xFFFFFF))
1154 {
1155 State.exception = SIG_CR16_BUS;
1156 State.pc_changed = 1; /* Don't increment the PC. */
1157 trace_output_void ();
1158 return;
1159 }
1160 else
1161 JMP (tmp);
1162
1163 trace_output_32 (tmp);
1164 }
1165
1166
1167 /* beq0b. */
1168 void
1169 OP_C_8 ()
1170 {
1171 uint32 addr;
1172 uint8 a = (GPR (OP[0]) & 0xFF);
1173 trace_input ("beq0b", OP_REG, OP_DISP5, OP_VOID);
1174 addr = OP[1];
1175 if (a == 0)
1176 {
1177 if (sign_flag)
1178 addr = (PC - OP[1]);
1179 else
1180 addr = (PC + OP[1]);
1181
1182 JMP (addr);
1183 }
1184 sign_flag = 0; /* Reset sign_flag. */
1185 trace_output_void ();
1186 }
1187
1188 /* bne0b. */
1189 void
1190 OP_D_8 ()
1191 {
1192 uint32 addr;
1193 uint8 a = (GPR (OP[0]) & 0xFF);
1194 trace_input ("bne0b", OP_REG, OP_DISP5, OP_VOID);
1195 addr = OP[1];
1196 if (a != 0)
1197 {
1198 if (sign_flag)
1199 addr = (PC - OP[1]);
1200 else
1201 addr = (PC + OP[1]);
1202
1203 JMP (addr);
1204 }
1205 sign_flag = 0; /* Reset sign_flag. */
1206 trace_output_void ();
1207 }
1208
1209 /* beq0w. */
1210 void
1211 OP_E_8()
1212 {
1213 uint32 addr;
1214 uint16 a = GPR (OP[0]);
1215 trace_input ("beq0w", OP_REG, OP_DISP5, OP_VOID);
1216 addr = OP[1];
1217 if (a == 0)
1218 {
1219 if (sign_flag)
1220 addr = (PC - OP[1]);
1221 else
1222 addr = (PC + OP[1]);
1223
1224 JMP (addr);
1225 }
1226 sign_flag = 0; /* Reset sign_flag. */
1227 trace_output_void ();
1228 }
1229
1230 /* bne0w. */
1231 void
1232 OP_F_8 ()
1233 {
1234 uint32 addr;
1235 uint16 a = GPR (OP[0]);
1236 trace_input ("bne0w", OP_REG, OP_DISP5, OP_VOID);
1237 addr = OP[1];
1238 if (a != 0)
1239 {
1240 if (sign_flag)
1241 addr = (PC - OP[1]);
1242 else
1243 addr = (PC + OP[1]);
1244
1245 JMP (addr);
1246 }
1247 sign_flag = 0; /* Reset sign_flag. */
1248 trace_output_void ();
1249 }
1250
1251
1252 /* jeq. */
1253 void
1254 OP_A0_C ()
1255 {
1256 uint32 tmp;
1257 trace_input ("jeq", OP_REGP, OP_VOID, OP_VOID);
1258 if ((PSR_Z) == 1)
1259 {
1260 tmp = (GPR32 (OP[0])) & 0x3fffff; /* Use only 0 - 22 bits. */
1261 JMP (tmp << 1); /* Set PC's 1 - 23 bits and clear 0th bit. */
1262 }
1263 trace_output_32 (tmp);
1264 }
1265
1266 /* jne. */
1267 void
1268 OP_A1_C ()
1269 {
1270 uint32 tmp;
1271 trace_input ("jne", OP_REGP, OP_VOID, OP_VOID);
1272 if ((PSR_Z) == 0)
1273 {
1274 tmp = (GPR32 (OP[0])) & 0x3fffff; /* Use only 0 - 22 bits. */
1275 JMP (tmp << 1); /* Set PC's 1 - 23 bits and clear 0th bit. */
1276 }
1277 trace_output_32 (tmp);
1278 }
1279
1280 /* jcs. */
1281 void
1282 OP_A2_C ()
1283 {
1284 uint32 tmp;
1285 trace_input ("jcs", OP_REGP, OP_VOID, OP_VOID);
1286 if ((PSR_C) == 1)
1287 {
1288 tmp = (GPR32 (OP[0])) & 0x3fffff; /* Use only 0 - 22 bits */
1289 JMP (tmp << 1); /* Set PC's 1 - 23 bits and clear 0th bit*/
1290 }
1291 trace_output_32 (tmp);
1292 }
1293
1294 /* jcc. */
1295 void
1296 OP_A3_C ()
1297 {
1298 uint32 tmp;
1299 trace_input ("jcc", OP_REGP, OP_VOID, OP_VOID);
1300 if ((PSR_C) == 0)
1301 {
1302 tmp = (GPR32 (OP[0])) & 0x3fffff; /* Use only 0 - 22 bits */
1303 JMP (tmp << 1); /* Set PC's 1 - 23 bits and clear 0th bit*/
1304 }
1305 trace_output_32 (tmp);
1306 }
1307
1308 /* jhi. */
1309 void
1310 OP_A4_C ()
1311 {
1312 uint32 tmp;
1313 trace_input ("jhi", OP_REGP, OP_VOID, OP_VOID);
1314 if ((PSR_L) == 1)
1315 {
1316 tmp = (GPR32 (OP[0])) & 0x3fffff; /* Use only 0 - 22 bits */
1317 JMP (tmp << 1); /* Set PC's 1 - 23 bits and clear 0th bit*/
1318 }
1319 trace_output_32 (tmp);
1320 }
1321
1322 /* jls. */
1323 void
1324 OP_A5_C ()
1325 {
1326 uint32 tmp;
1327 trace_input ("jls", OP_REGP, OP_VOID, OP_VOID);
1328 if ((PSR_L) == 0)
1329 {
1330 tmp = (GPR32 (OP[0])) & 0x3fffff; /* Use only 0 - 22 bits */
1331 JMP (tmp << 1); /* Set PC's 1 - 23 bits and clear 0th bit*/
1332 }
1333 trace_output_32 (tmp);
1334 }
1335
1336 /* jgt. */
1337 void
1338 OP_A6_C ()
1339 {
1340 uint32 tmp;
1341 trace_input ("jgt", OP_REGP, OP_VOID, OP_VOID);
1342 if ((PSR_N) == 1)
1343 {
1344 tmp = (GPR32 (OP[0])) & 0x3fffff; /* Use only 0 - 22 bits */
1345 JMP (tmp << 1); /* Set PC's 1 - 23 bits and clear 0th bit*/
1346 }
1347 trace_output_32 (tmp);
1348 }
1349
1350 /* jle. */
1351 void
1352 OP_A7_C ()
1353 {
1354 uint32 tmp;
1355 trace_input ("jle", OP_REGP, OP_VOID, OP_VOID);
1356 if ((PSR_N) == 0)
1357 {
1358 tmp = (GPR32 (OP[0])) & 0x3fffff; /* Use only 0 - 22 bits */
1359 JMP (tmp << 1); /* Set PC's 1 - 23 bits and clear 0th bit*/
1360 }
1361 trace_output_32 (tmp);
1362 }
1363
1364
1365 /* jfs. */
1366 void
1367 OP_A8_C ()
1368 {
1369 uint32 tmp;
1370 trace_input ("jfs", OP_REGP, OP_VOID, OP_VOID);
1371 if ((PSR_F) == 1)
1372 {
1373 tmp = (GPR32 (OP[0])) & 0x3fffff; /* Use only 0 - 22 bits */
1374 JMP (tmp << 1); /* Set PC's 1 - 23 bits and clear 0th bit*/
1375 }
1376 trace_output_32 (tmp);
1377 }
1378
1379 /* jfc. */
1380 void
1381 OP_A9_C ()
1382 {
1383 uint32 tmp;
1384 trace_input ("jfc", OP_REGP, OP_VOID, OP_VOID);
1385 if ((PSR_F) == 0)
1386 {
1387 tmp = (GPR32 (OP[0])) & 0x3fffff; /* Use only 0 - 22 bits */
1388 JMP (tmp << 1); /* Set PC's 1 - 23 bits and clear 0th bit*/
1389 }
1390 trace_output_32 (tmp);
1391 }
1392
1393 /* jlo. */
1394 void
1395 OP_AA_C ()
1396 {
1397 uint32 tmp;
1398 trace_input ("jlo", OP_REGP, OP_VOID, OP_VOID);
1399 if (((PSR_Z) == 0) & ((PSR_L) == 0))
1400 {
1401 tmp = (GPR32 (OP[0])) & 0x3fffff; /* Use only 0 - 22 bits */
1402 JMP (tmp << 1); /* Set PC's 1 - 23 bits and clear 0th bit*/
1403 }
1404 trace_output_32 (tmp);
1405 }
1406
1407 /* jhs. */
1408 void
1409 OP_AB_C ()
1410 {
1411 uint32 tmp;
1412 trace_input ("jhs", OP_REGP, OP_VOID, OP_VOID);
1413 if (((PSR_Z) == 1) | ((PSR_L) == 1))
1414 {
1415 tmp = (GPR32 (OP[0])) & 0x3fffff; /* Use only 0 - 22 bits */
1416 JMP (tmp << 1); /* Set PC's 1 - 23 bits and clear 0th bit*/
1417 }
1418 trace_output_32 (tmp);
1419 }
1420
1421 /* jlt. */
1422 void
1423 OP_AC_C ()
1424 {
1425 uint32 tmp;
1426 trace_input ("jlt", OP_REGP, OP_VOID, OP_VOID);
1427 if (((PSR_Z) == 0) & ((PSR_N) == 0))
1428 {
1429 tmp = (GPR32 (OP[0])) & 0x3fffff; /* Use only 0 - 22 bits */
1430 JMP (tmp << 1); /* Set PC's 1 - 23 bits and clear 0th bit*/
1431 }
1432 trace_output_32 (tmp);
1433 }
1434
1435 /* jge. */
1436 void
1437 OP_AD_C ()
1438 {
1439 uint32 tmp;
1440 trace_input ("jge", OP_REGP, OP_VOID, OP_VOID);
1441 if (((PSR_Z) == 1) | ((PSR_N) == 1))
1442 {
1443 tmp = (GPR32 (OP[0])) & 0x3fffff; /* Use only 0 - 22 bits */
1444 JMP (tmp << 1); /* Set PC's 1 - 23 bits and clear 0th bit*/
1445 }
1446 trace_output_32 (tmp);
1447 }
1448
1449 /* jump. */
1450 void
1451 OP_AE_C ()
1452 {
1453 uint32 tmp;
1454 trace_input ("jump", OP_REGP, OP_VOID, OP_VOID);
1455 tmp = GPR32 (OP[0]) /*& 0x3fffff*/; /* Use only 0 - 22 bits */
1456 JMP (tmp << 1); /* Set PC's 1 - 23 bits and clear 0th bit*/
1457 trace_output_32 (tmp);
1458 }
1459
1460 /* jusr. */
1461 void
1462 OP_AF_C ()
1463 {
1464 uint32 tmp;
1465 trace_input ("jusr", OP_REGP, OP_VOID, OP_VOID);
1466 tmp = (GPR32 (OP[0])) & 0x3fffff; /* Use only 0 - 22 bits */
1467 JMP (tmp << 1); /* Set PC's 1 - 23 bits and clear 0th bit*/
1468 SET_PSR_U(1);
1469 trace_output_32 (tmp);
1470 }
1471
1472 /* seq. */
1473 void
1474 OP_80_C ()
1475 {
1476 trace_input ("seq", OP_REG, OP_VOID, OP_VOID);
1477 if ((PSR_Z) == 1)
1478 SET_GPR (OP[0], 1);
1479 else
1480 SET_GPR (OP[0], 0);
1481 trace_output_void ();
1482 }
1483 /* sne. */
1484 void
1485 OP_81_C ()
1486 {
1487 trace_input ("sne", OP_REG, OP_VOID, OP_VOID);
1488 if ((PSR_Z) == 0)
1489 SET_GPR (OP[0], 1);
1490 else
1491 SET_GPR (OP[0], 0);
1492 trace_output_void ();
1493 }
1494
1495 /* scs. */
1496 void
1497 OP_82_C ()
1498 {
1499 trace_input ("scs", OP_REG, OP_VOID, OP_VOID);
1500 if ((PSR_C) == 1)
1501 SET_GPR (OP[0], 1);
1502 else
1503 SET_GPR (OP[0], 0);
1504 trace_output_void ();
1505 }
1506
1507 /* scc. */
1508 void
1509 OP_83_C ()
1510 {
1511 trace_input ("scc", OP_REG, OP_VOID, OP_VOID);
1512 if ((PSR_C) == 0)
1513 SET_GPR (OP[0], 1);
1514 else
1515 SET_GPR (OP[0], 0);
1516 trace_output_void ();
1517 }
1518
1519 /* shi. */
1520 void
1521 OP_84_C ()
1522 {
1523 trace_input ("shi", OP_REG, OP_VOID, OP_VOID);
1524 if ((PSR_L) == 1)
1525 SET_GPR (OP[0], 1);
1526 else
1527 SET_GPR (OP[0], 0);
1528 trace_output_void ();
1529 }
1530
1531 /* sls. */
1532 void
1533 OP_85_C ()
1534 {
1535 trace_input ("sls", OP_REG, OP_VOID, OP_VOID);
1536 if ((PSR_L) == 0)
1537 SET_GPR (OP[0], 1);
1538 else
1539 SET_GPR (OP[0], 0);
1540 trace_output_void ();
1541 }
1542
1543 /* sgt. */
1544 void
1545 OP_86_C ()
1546 {
1547 trace_input ("sgt", OP_REG, OP_VOID, OP_VOID);
1548 if ((PSR_N) == 1)
1549 SET_GPR (OP[0], 1);
1550 else
1551 SET_GPR (OP[0], 0);
1552 trace_output_void ();
1553 }
1554
1555 /* sle. */
1556 void
1557 OP_87_C ()
1558 {
1559 trace_input ("sle", OP_REG, OP_VOID, OP_VOID);
1560 if ((PSR_N) == 0)
1561 SET_GPR (OP[0], 1);
1562 else
1563 SET_GPR (OP[0], 0);
1564 trace_output_void ();
1565 }
1566
1567 /* sfs. */
1568 void
1569 OP_88_C ()
1570 {
1571 trace_input ("sfs", OP_REG, OP_VOID, OP_VOID);
1572 if ((PSR_F) == 1)
1573 SET_GPR (OP[0], 1);
1574 else
1575 SET_GPR (OP[0], 0);
1576 trace_output_void ();
1577 }
1578
1579 /* sfc. */
1580 void
1581 OP_89_C ()
1582 {
1583 trace_input ("sfc", OP_REG, OP_VOID, OP_VOID);
1584 if ((PSR_F) == 0)
1585 SET_GPR (OP[0], 1);
1586 else
1587 SET_GPR (OP[0], 0);
1588 trace_output_void ();
1589 }
1590
1591
1592 /* slo. */
1593 void
1594 OP_8A_C ()
1595 {
1596 trace_input ("slo", OP_REG, OP_VOID, OP_VOID);
1597 if (((PSR_Z) == 0) & ((PSR_L) == 0))
1598 SET_GPR (OP[0], 1);
1599 else
1600 SET_GPR (OP[0], 0);
1601 trace_output_void ();
1602 }
1603
1604 /* shs. */
1605 void
1606 OP_8B_C ()
1607 {
1608 trace_input ("shs", OP_REG, OP_VOID, OP_VOID);
1609 if ( ((PSR_Z) == 1) | ((PSR_L) == 1))
1610 SET_GPR (OP[0], 1);
1611 else
1612 SET_GPR (OP[0], 0);
1613 trace_output_void ();
1614 }
1615
1616 /* slt. */
1617 void
1618 OP_8C_C ()
1619 {
1620 trace_input ("slt", OP_REG, OP_VOID, OP_VOID);
1621 if (((PSR_Z) == 0) & ((PSR_N) == 0))
1622 SET_GPR (OP[0], 1);
1623 else
1624 SET_GPR (OP[0], 0);
1625 trace_output_void ();
1626 }
1627
1628 /* sge. */
1629 void
1630 OP_8D_C ()
1631 {
1632 trace_input ("sge", OP_REG, OP_VOID, OP_VOID);
1633 if (((PSR_Z) == 1) | ((PSR_N) == 1))
1634 SET_GPR (OP[0], 1);
1635 else
1636 SET_GPR (OP[0], 0);
1637 trace_output_void ();
1638 }
1639
1640 /* cbitb. */
1641 void
1642 OP_D7_9 ()
1643 {
1644 uint8 a = OP[0] & 0xff;
1645 uint32 addr = OP[1], tmp;
1646 trace_input ("cbitb", OP_CONSTANT4, OP_ABS20_OUTPUT, OP_VOID);
1647 tmp = RB (addr);
1648 SET_PSR_F (tmp & (1 << a));
1649 tmp = tmp & ~(1 << a);
1650 SB (addr, tmp);
1651 trace_output_32 (tmp);
1652 }
1653
1654 /* cbitb. */
1655 void
1656 OP_107_14 ()
1657 {
1658 uint8 a = OP[0] & 0xff;
1659 uint32 addr = OP[1], tmp;
1660 trace_input ("cbitb", OP_CONSTANT4, OP_ABS24_OUTPUT, OP_VOID);
1661 tmp = RB (addr);
1662 SET_PSR_F (tmp & (1 << a));
1663 tmp = tmp & ~(1 << a);
1664 SB (addr, tmp);
1665 trace_output_32 (tmp);
1666 }
1667
1668 /* cbitb. */
1669 void
1670 OP_68_8 ()
1671 {
1672 uint8 a = (OP[0]) & 0xff;
1673 uint32 addr = (GPR (OP[2])) + OP[1], tmp;
1674 trace_input ("cbitb", OP_CONSTANT4, OP_R_INDEX7_ABS20, OP_VOID);
1675 tmp = RB (addr);
1676 SET_PSR_F (tmp & (1 << a));
1677 tmp = tmp & ~(1 << a);
1678 SB (addr, tmp);
1679 trace_output_32 (addr);
1680 }
1681
1682 /* cbitb. */
1683 void
1684 OP_1AA_A ()
1685 {
1686 uint8 a = (OP[0]) & 0xff;
1687 uint32 addr = (GPR32 (OP[2])) + OP[1], tmp;
1688 trace_input ("cbitb", OP_CONSTANT4, OP_RP_INDEX_DISP14, OP_VOID);
1689 tmp = RB (addr);
1690 SET_PSR_F (tmp & (1 << a));
1691 tmp = tmp & ~(1 << a);
1692 SB (addr, tmp);
1693 trace_output_32 (addr);
1694 }
1695
1696 /* cbitb. */
1697 void
1698 OP_104_14 ()
1699 {
1700 uint8 a = (OP[0]) & 0xff;
1701 uint32 addr = (GPR (OP[2])) + OP[1], tmp;
1702 trace_input ("cbitb", OP_CONSTANT4, OP_R_BASE_DISPS20, OP_VOID);
1703 tmp = RB (addr);
1704 SET_PSR_F (tmp & (1 << a));
1705 tmp = tmp & ~(1 << a);
1706 SB (addr, tmp);
1707 trace_output_32 (addr);
1708 }
1709
1710 /* cbitb. */
1711 void
1712 OP_D4_9 ()
1713 {
1714 uint8 a = (OP[0]) & 0xff;
1715 uint32 addr = (GPR32 (OP[2])) + OP[1], tmp;
1716 trace_input ("cbitb", OP_CONSTANT4, OP_RP_INDEX_DISP0, OP_VOID);
1717 tmp = RB (addr);
1718 SET_PSR_F (tmp & (1 << a));
1719 tmp = tmp & ~(1 << a);
1720 SB (addr, tmp);
1721 trace_output_32 (addr);
1722 }
1723
1724 /* cbitb. */
1725 void
1726 OP_D6_9 ()
1727 {
1728 uint8 a = (OP[0]) & 0xff;
1729 uint32 addr = (GPR32 (OP[2])) + OP[1], tmp;
1730 trace_input ("cbitb", OP_CONSTANT4, OP_RP_BASE_DISP16, OP_VOID);
1731 tmp = RB (addr);
1732 SET_PSR_F (tmp & (1 << a));
1733 tmp = tmp & ~(1 << a);
1734 SB (addr, tmp);
1735 trace_output_32 (addr);
1736
1737 }
1738
1739 /* cbitb. */
1740 void
1741 OP_105_14 ()
1742 {
1743 uint8 a = (OP[0]) & 0xff;
1744 uint32 addr = (GPR32 (OP[2])) + OP[1], tmp;
1745 trace_input ("cbitb", OP_CONSTANT4, OP_RP_BASE_DISPS20, OP_VOID);
1746 tmp = RB (addr);
1747 SET_PSR_F (tmp & (1 << a));
1748 tmp = tmp & ~(1 << a);
1749 SB (addr, tmp);
1750 trace_output_32 (addr);
1751 }
1752
1753 /* cbitb. */
1754 void
1755 OP_106_14 ()
1756 {
1757 uint8 a = (OP[0]) & 0xff;
1758 uint32 addr = (GPR32 (OP[2])) + OP[1], tmp;
1759 trace_input ("cbitb", OP_CONSTANT4, OP_RP_INDEX_DISPS20, OP_VOID);
1760 tmp = RB (addr);
1761 SET_PSR_F (tmp & (1 << a));
1762 tmp = tmp & ~(1 << a);
1763 SB (addr, tmp);
1764 trace_output_32 (addr);
1765 }
1766
1767
1768 /* cbitw. */
1769 void
1770 OP_6F_8 ()
1771 {
1772 uint16 a = OP[0];
1773 uint32 addr = OP[1], tmp;
1774 trace_input ("cbitw", OP_CONSTANT4, OP_ABS20_OUTPUT, OP_VOID);
1775 tmp = RW (addr);
1776 SET_PSR_F (tmp & (1 << a));
1777 tmp = tmp & ~(1 << a);
1778 SW (addr, tmp);
1779 trace_output_32 (tmp);
1780 }
1781
1782 /* cbitw. */
1783 void
1784 OP_117_14 ()
1785 {
1786 uint16 a = OP[0];
1787 uint32 addr = OP[1], tmp;
1788 trace_input ("cbitw", OP_CONSTANT4, OP_ABS24_OUTPUT, OP_VOID);
1789 tmp = RW (addr);
1790 SET_PSR_F (tmp & (1 << a));
1791 tmp = tmp & ~(1 << a);
1792 SW (addr, tmp);
1793 trace_output_32 (tmp);
1794 }
1795
1796 /* cbitw. */
1797 void
1798 OP_36_7 ()
1799 {
1800 uint32 addr;
1801 uint16 a = (OP[0]), tmp;
1802 trace_input ("cbitw", OP_CONSTANT4, OP_R_INDEX8_ABS20, OP_VOID);
1803
1804 if (OP[1] == 0)
1805 addr = (GPR32 (12)) + OP[2];
1806 else
1807 addr = (GPR32 (13)) + OP[2];
1808
1809 tmp = RW (addr);
1810 SET_PSR_F (tmp & (1 << a));
1811 tmp = tmp & ~(1 << a);
1812 SW (addr, tmp);
1813 trace_output_32 (addr);
1814
1815 }
1816
1817 /* cbitw. */
1818 void
1819 OP_1AB_A ()
1820 {
1821 uint16 a = (OP[0]);
1822 uint32 addr = (GPR32 (OP[2])) + OP[1], tmp;
1823 trace_input ("cbitw", OP_CONSTANT4, OP_RP_INDEX_DISP14, OP_VOID);
1824 tmp = RW (addr);
1825 SET_PSR_F (tmp & (1 << a));
1826 tmp = tmp & ~(1 << a);
1827 SW (addr, tmp);
1828 trace_output_32 (addr);
1829 }
1830
1831 /* cbitw. */
1832 void
1833 OP_114_14 ()
1834 {
1835 uint16 a = (OP[0]);
1836 uint32 addr = (GPR (OP[2])) + OP[1], tmp;
1837 trace_input ("cbitw", OP_CONSTANT4, OP_R_BASE_DISPS20, OP_VOID);
1838 tmp = RW (addr);
1839 SET_PSR_F (tmp & (1 << a));
1840 tmp = tmp & ~(1 << a);
1841 SW (addr, tmp);
1842 trace_output_32 (addr);
1843 }
1844
1845
1846 /* cbitw. */
1847 void
1848 OP_6E_8 ()
1849 {
1850 uint16 a = (OP[0]);
1851 uint32 addr = (GPR32 (OP[2])) + OP[1], tmp;
1852 trace_input ("cbitw", OP_CONSTANT4, OP_RP_INDEX_DISP0, OP_VOID);
1853 tmp = RW (addr);
1854 SET_PSR_F (tmp & (1 << a));
1855 tmp = tmp & ~(1 << a);
1856 SW (addr, tmp);
1857 trace_output_32 (addr);
1858 }
1859
1860 /* cbitw. */
1861 void
1862 OP_69_8 ()
1863 {
1864 uint16 a = (OP[0]);
1865 uint32 addr = (GPR32 (OP[2])) + OP[1], tmp;
1866 trace_input ("cbitw", OP_CONSTANT4, OP_RP_BASE_DISP16, OP_VOID);
1867 tmp = RW (addr);
1868 SET_PSR_F (tmp & (1 << a));
1869 tmp = tmp & ~(1 << a);
1870 SW (addr, tmp);
1871 trace_output_32 (addr);
1872 }
1873
1874
1875 /* cbitw. */
1876 void
1877 OP_115_14 ()
1878 {
1879 uint16 a = (OP[0]);
1880 uint32 addr = (GPR32 (OP[2])) + OP[1], tmp;
1881 trace_input ("cbitw", OP_CONSTANT4, OP_RP_BASE_DISPS20, OP_VOID);
1882 tmp = RW (addr);
1883 SET_PSR_F (tmp & (1 << a));
1884 tmp = tmp & ~(1 << a);
1885 SW (addr, tmp);
1886 trace_output_32 (addr);
1887 }
1888
1889 /* cbitw. */
1890 void
1891 OP_116_14 ()
1892 {
1893 uint16 a = (OP[0]);
1894 uint32 addr = (GPR32 (OP[2])) + OP[1], tmp;
1895 trace_input ("cbitw", OP_CONSTANT4, OP_RP_INDEX_DISPS20, OP_VOID);
1896 tmp = RW (addr);
1897 SET_PSR_F (tmp & (1 << a));
1898 tmp = tmp & ~(1 << a);
1899 SW (addr, tmp);
1900 trace_output_32 (addr);
1901 }
1902
1903 /* sbitb. */
1904 void
1905 OP_E7_9 ()
1906 {
1907 uint8 a = OP[0] & 0xff;
1908 uint32 addr = OP[1], tmp;
1909 trace_input ("sbitb", OP_CONSTANT4, OP_ABS20_OUTPUT, OP_VOID);
1910 tmp = RB (addr);
1911 SET_PSR_F (tmp & (1 << a));
1912 tmp = tmp | (1 << a);
1913 SB (addr, tmp);
1914 trace_output_32 (tmp);
1915 }
1916
1917 /* sbitb. */
1918 void
1919 OP_10B_14 ()
1920 {
1921 uint8 a = OP[0] & 0xff;
1922 uint32 addr = OP[1], tmp;
1923 trace_input ("sbitb", OP_CONSTANT4, OP_ABS24_OUTPUT, OP_VOID);
1924 tmp = RB (addr);
1925 SET_PSR_F (tmp & (1 << a));
1926 tmp = tmp | (1 << a);
1927 SB (addr, tmp);
1928 trace_output_32 (tmp);
1929 }
1930
1931 /* sbitb. */
1932 void
1933 OP_70_8 ()
1934 {
1935 uint8 a = OP[0] & 0xff;
1936 uint32 addr = (GPR (OP[2])) + OP[1], tmp;
1937 trace_input ("sbitb", OP_CONSTANT4, OP_R_INDEX7_ABS20, OP_VOID);
1938 tmp = RB (addr);
1939 SET_PSR_F (tmp & (1 << a));
1940 tmp = tmp | (1 << a);
1941 SB (addr, tmp);
1942 trace_output_32 (tmp);
1943 }
1944
1945 /* sbitb. */
1946 void
1947 OP_1CA_A ()
1948 {
1949 uint8 a = OP[0] & 0xff;
1950 uint32 addr = (GPR32 (OP[2])) + OP[1], tmp;
1951 trace_input ("sbitb", OP_CONSTANT4, OP_RP_INDEX_DISP14, OP_VOID);
1952 tmp = RB (addr);
1953 SET_PSR_F (tmp & (1 << a));
1954 tmp = tmp | (1 << a);
1955 SB (addr, tmp);
1956 trace_output_32 (tmp);
1957 }
1958
1959 /* sbitb. */
1960 void
1961 OP_108_14 ()
1962 {
1963 uint8 a = OP[0] & 0xff;
1964 uint32 addr = (GPR (OP[2])) + OP[1], tmp;
1965 trace_input ("sbitb", OP_CONSTANT4, OP_R_BASE_DISPS20, OP_VOID);
1966 tmp = RB (addr);
1967 SET_PSR_F (tmp & (1 << a));
1968 tmp = tmp | (1 << a);
1969 SB (addr, tmp);
1970 trace_output_32 (tmp);
1971 }
1972
1973
1974 /* sbitb. */
1975 void
1976 OP_E4_9 ()
1977 {
1978 uint8 a = OP[0] & 0xff;
1979 uint32 addr = (GPR32 (OP[2])) + OP[1], tmp;
1980 trace_input ("sbitb", OP_CONSTANT4, OP_RP_INDEX_DISP0, OP_VOID);
1981 tmp = RB (addr);
1982 SET_PSR_F (tmp & (1 << a));
1983 tmp = tmp | (1 << a);
1984 SB (addr, tmp);
1985 trace_output_32 (tmp);
1986 }
1987
1988 /* sbitb. */
1989 void
1990 OP_E6_9 ()
1991 {
1992 uint8 a = OP[0] & 0xff;
1993 uint32 addr = (GPR32 (OP[2])) + OP[1], tmp;
1994 trace_input ("sbitb", OP_CONSTANT4, OP_RP_BASE_DISP16, OP_VOID);
1995 tmp = RB (addr);
1996 SET_PSR_F (tmp & (1 << a));
1997 tmp = tmp | (1 << a);
1998 SB (addr, tmp);
1999 trace_output_32 (tmp);
2000 }
2001
2002
2003 /* sbitb. */
2004 void
2005 OP_109_14 ()
2006 {
2007 uint8 a = OP[0] & 0xff;
2008 uint32 addr = (GPR32 (OP[2])) + OP[1], tmp;
2009 trace_input ("sbitb", OP_CONSTANT4, OP_RP_BASE_DISPS20, OP_VOID);
2010 tmp = RB (addr);
2011 SET_PSR_F (tmp & (1 << a));
2012 tmp = tmp | (1 << a);
2013 SB (addr, tmp);
2014 trace_output_32 (tmp);
2015 }
2016
2017
2018 /* sbitb. */
2019 void
2020 OP_10A_14 ()
2021 {
2022 uint8 a = OP[0] & 0xff;
2023 uint32 addr = (GPR32 (OP[2])) + OP[1], tmp;
2024 trace_input ("sbitb", OP_CONSTANT4, OP_RP_INDEX_DISPS20, OP_VOID);
2025 tmp = RB (addr);
2026 SET_PSR_F (tmp & (1 << a));
2027 tmp = tmp | (1 << a);
2028 SB (addr, tmp);
2029 trace_output_32 (tmp);
2030 }
2031
2032
2033 /* sbitw. */
2034 void
2035 OP_77_8 ()
2036 {
2037 uint16 a = OP[0];
2038 uint32 addr = OP[1], tmp;
2039 trace_input ("sbitw", OP_CONSTANT4, OP_ABS20_OUTPUT, OP_VOID);
2040 tmp = RW (addr);
2041 SET_PSR_F (tmp & (1 << a));
2042 tmp = tmp | (1 << a);
2043 SW (addr, tmp);
2044 trace_output_32 (tmp);
2045 }
2046
2047 /* sbitw. */
2048 void
2049 OP_11B_14 ()
2050 {
2051 uint16 a = OP[0];
2052 uint32 addr = OP[1], tmp;
2053 trace_input ("sbitw", OP_CONSTANT4, OP_ABS24_OUTPUT, OP_VOID);
2054 tmp = RW (addr);
2055 SET_PSR_F (tmp & (1 << a));
2056 tmp = tmp | (1 << a);
2057 SW (addr, tmp);
2058 trace_output_32 (tmp);
2059 }
2060
2061 /* sbitw. */
2062 void
2063 OP_3A_7 ()
2064 {
2065 uint32 addr;
2066 uint16 a = (OP[0]), tmp;
2067 trace_input ("sbitw", OP_CONSTANT4, OP_R_INDEX8_ABS20, OP_VOID);
2068
2069 if (OP[1] == 0)
2070 addr = (GPR32 (12)) + OP[2];
2071 else
2072 addr = (GPR32 (13)) + OP[2];
2073
2074 tmp = RW (addr);
2075 SET_PSR_F (tmp & (1 << a));
2076 tmp = tmp | (1 << a);
2077 SW (addr, tmp);
2078 trace_output_32 (addr);
2079 }
2080
2081 /* sbitw. */
2082 void
2083 OP_1CB_A ()
2084 {
2085 uint16 a = (OP[0]);
2086 uint32 addr = (GPR32 (OP[2])) + OP[1], tmp;
2087 trace_input ("sbitw", OP_CONSTANT4, OP_RP_INDEX_DISP14, OP_VOID);
2088 tmp = RW (addr);
2089 SET_PSR_F (tmp & (1 << a));
2090 tmp = tmp | (1 << a);
2091 SW (addr, tmp);
2092 trace_output_32 (addr);
2093 }
2094
2095 /* sbitw. */
2096 void
2097 OP_118_14 ()
2098 {
2099 uint16 a = (OP[0]);
2100 uint32 addr = (GPR (OP[2])) + OP[1], tmp;
2101 trace_input ("sbitw", OP_CONSTANT4, OP_R_BASE_DISPS20, OP_VOID);
2102 tmp = RW (addr);
2103 SET_PSR_F (tmp & (1 << a));
2104 tmp = tmp | (1 << a);
2105 SW (addr, tmp);
2106 trace_output_32 (addr);
2107 }
2108
2109 /* sbitw. */
2110 void
2111 OP_76_8 ()
2112 {
2113 uint16 a = (OP[0]);
2114 uint32 addr = (GPR32 (OP[2])) + OP[1], tmp;
2115 trace_input ("sbitw", OP_CONSTANT4, OP_RP_INDEX_DISP0, OP_VOID);
2116 tmp = RW (addr);
2117 SET_PSR_F (tmp & (1 << a));
2118 tmp = tmp | (1 << a);
2119 SW (addr, tmp);
2120 trace_output_32 (addr);
2121 }
2122
2123 /* sbitw. */
2124 void
2125 OP_71_8 ()
2126 {
2127 uint16 a = (OP[0]);
2128 uint32 addr = (GPR32 (OP[2])) + OP[1], tmp;
2129 trace_input ("sbitw", OP_CONSTANT4, OP_RP_BASE_DISP16, OP_VOID);
2130 tmp = RW (addr);
2131 SET_PSR_F (tmp & (1 << a));
2132 tmp = tmp | (1 << a);
2133 SW (addr, tmp);
2134 trace_output_32 (addr);
2135 }
2136
2137 /* sbitw. */
2138 void
2139 OP_119_14 ()
2140 {
2141 uint16 a = (OP[0]);
2142 uint32 addr = (GPR32 (OP[2])) + OP[1], tmp;
2143 trace_input ("sbitw", OP_CONSTANT4, OP_RP_BASE_DISPS20, OP_VOID);
2144 tmp = RW (addr);
2145 SET_PSR_F (tmp & (1 << a));
2146 tmp = tmp | (1 << a);
2147 SW (addr, tmp);
2148 trace_output_32 (addr);
2149 }
2150
2151 /* sbitw. */
2152 void
2153 OP_11A_14 ()
2154 {
2155 uint16 a = (OP[0]);
2156 uint32 addr = (GPR32 (OP[2])) + OP[1], tmp;
2157 trace_input ("sbitw", OP_CONSTANT4, OP_RP_INDEX_DISPS20, OP_VOID);
2158 tmp = RW (addr);
2159 SET_PSR_F (tmp & (1 << a));
2160 tmp = tmp | (1 << a);
2161 SW (addr, tmp);
2162 trace_output_32 (addr);
2163 }
2164
2165
2166 /* tbitb. */
2167 void
2168 OP_F7_9 ()
2169 {
2170 uint8 a = OP[0] & 0xff;
2171 uint32 addr = OP[1], tmp;
2172 trace_input ("tbitb", OP_CONSTANT4, OP_ABS20_OUTPUT, OP_VOID);
2173 tmp = RB (addr);
2174 SET_PSR_F (tmp & (1 << a));
2175 trace_output_32 (tmp);
2176 }
2177
2178 /* tbitb. */
2179 void
2180 OP_10F_14 ()
2181 {
2182 uint8 a = OP[0] & 0xff;
2183 uint32 addr = OP[1], tmp;
2184 trace_input ("tbitb", OP_CONSTANT4, OP_ABS24_OUTPUT, OP_VOID);
2185 tmp = RB (addr);
2186 SET_PSR_F (tmp & (1 << a));
2187 trace_output_32 (tmp);
2188 }
2189
2190 /* tbitb. */
2191 void
2192 OP_78_8 ()
2193 {
2194 uint8 a = (OP[0]) & 0xff;
2195 uint32 addr = (GPR (OP[2])) + OP[1], tmp;
2196 trace_input ("tbitb", OP_CONSTANT4, OP_R_INDEX7_ABS20, OP_VOID);
2197 tmp = RB (addr);
2198 SET_PSR_F (tmp & (1 << a));
2199 trace_output_32 (addr);
2200 }
2201
2202 /* tbitb. */
2203 void
2204 OP_1EA_A ()
2205 {
2206 uint8 a = (OP[0]) & 0xff;
2207 uint32 addr = (GPR32 (OP[2])) + OP[1], tmp;
2208 trace_input ("tbitb", OP_CONSTANT4, OP_RP_INDEX_DISP14, OP_VOID);
2209 tmp = RB (addr);
2210 SET_PSR_F (tmp & (1 << a));
2211 trace_output_32 (addr);
2212 }
2213
2214 /* tbitb. */
2215 void
2216 OP_10C_14 ()
2217 {
2218 uint8 a = (OP[0]) & 0xff;
2219 uint32 addr = (GPR (OP[2])) + OP[1], tmp;
2220 trace_input ("tbitb", OP_CONSTANT4, OP_R_BASE_DISPS20, OP_VOID);
2221 tmp = RB (addr);
2222 SET_PSR_F (tmp & (1 << a));
2223 trace_output_32 (addr);
2224 }
2225
2226 /* tbitb. */
2227 void
2228 OP_F4_9 ()
2229 {
2230 uint8 a = (OP[0]) & 0xff;
2231 uint32 addr = (GPR32 (OP[2])) + OP[1], tmp;
2232 trace_input ("tbitb", OP_CONSTANT4, OP_RP_INDEX_DISP0, OP_VOID);
2233 tmp = RB (addr);
2234 SET_PSR_F (tmp & (1 << a));
2235 trace_output_32 (addr);
2236 }
2237
2238 /* tbitb. */
2239 void
2240 OP_F6_9 ()
2241 {
2242 uint8 a = (OP[0]) & 0xff;
2243 uint32 addr = (GPR32 (OP[2])) + OP[1], tmp;
2244 trace_input ("tbitb", OP_CONSTANT4, OP_RP_BASE_DISP16, OP_VOID);
2245 tmp = RB (addr);
2246 SET_PSR_F (tmp & (1 << a));
2247 trace_output_32 (addr);
2248 }
2249
2250 /* tbitb. */
2251 void
2252 OP_10D_14 ()
2253 {
2254 uint8 a = (OP[0]) & 0xff;
2255 uint32 addr = (GPR32 (OP[2])) + OP[1], tmp;
2256 trace_input ("tbitb", OP_CONSTANT4, OP_RP_BASE_DISPS20, OP_VOID);
2257 tmp = RB (addr);
2258 SET_PSR_F (tmp & (1 << a));
2259 trace_output_32 (addr);
2260 }
2261
2262 /* tbitb. */
2263 void
2264 OP_10E_14 ()
2265 {
2266 uint8 a = (OP[0]) & 0xff;
2267 uint32 addr = (GPR32 (OP[2])) + OP[1], tmp;
2268 trace_input ("tbitb", OP_CONSTANT4, OP_RP_INDEX_DISPS20, OP_VOID);
2269 tmp = RB (addr);
2270 SET_PSR_F (tmp & (1 << a));
2271 trace_output_32 (addr);
2272 }
2273
2274
2275 /* tbitw. */
2276 void
2277 OP_7F_8 ()
2278 {
2279 uint16 a = OP[0];
2280 uint32 addr = OP[1], tmp;
2281 trace_input ("tbitw", OP_CONSTANT4, OP_ABS20_OUTPUT, OP_VOID);
2282 tmp = RW (addr);
2283 SET_PSR_F (tmp & (1 << a));
2284 trace_output_32 (tmp);
2285 }
2286
2287 /* tbitw. */
2288 void
2289 OP_11F_14 ()
2290 {
2291 uint16 a = OP[0];
2292 uint32 addr = OP[1], tmp;
2293 trace_input ("tbitw", OP_CONSTANT4, OP_ABS24_OUTPUT, OP_VOID);
2294 tmp = RW (addr);
2295 SET_PSR_F (tmp & (1 << a));
2296 trace_output_32 (tmp);
2297 }
2298
2299
2300 /* tbitw. */
2301 void
2302 OP_3E_7 ()
2303 {
2304 uint32 addr;
2305 uint16 a = (OP[0]), tmp;
2306 trace_input ("tbitw", OP_CONSTANT4, OP_R_INDEX8_ABS20, OP_VOID);
2307
2308 if (OP[1] == 0)
2309 addr = (GPR32 (12)) + OP[2];
2310 else
2311 addr = (GPR32 (13)) + OP[2];
2312
2313 tmp = RW (addr);
2314 SET_PSR_F (tmp & (1 << a));
2315 trace_output_32 (addr);
2316 }
2317
2318 /* tbitw. */
2319 void
2320 OP_1EB_A ()
2321 {
2322 uint16 a = (OP[0]);
2323 uint32 addr = (GPR32 (OP[2])) + OP[1], tmp;
2324 trace_input ("tbitw", OP_CONSTANT4, OP_RP_INDEX_DISP14, OP_VOID);
2325 tmp = RW (addr);
2326 SET_PSR_F (tmp & (1 << a));
2327 trace_output_32 (addr);
2328 }
2329
2330 /* tbitw. */
2331 void
2332 OP_11C_14 ()
2333 {
2334 uint16 a = (OP[0]);
2335 uint32 addr = (GPR (OP[2])) + OP[1], tmp;
2336 trace_input ("tbitw", OP_CONSTANT4, OP_R_BASE_DISPS20, OP_VOID);
2337 tmp = RW (addr);
2338 SET_PSR_F (tmp & (1 << a));
2339 trace_output_32 (addr);
2340 }
2341
2342 /* tbitw. */
2343 void
2344 OP_7E_8 ()
2345 {
2346 uint16 a = (OP[0]);
2347 uint32 addr = (GPR32 (OP[2])) + OP[1], tmp;
2348 trace_input ("tbitw", OP_CONSTANT4, OP_RP_INDEX_DISP0, OP_VOID);
2349 tmp = RW (addr);
2350 SET_PSR_F (tmp & (1 << a));
2351 trace_output_32 (addr);
2352 }
2353
2354 /* tbitw. */
2355 void
2356 OP_79_8 ()
2357 {
2358 uint16 a = (OP[0]);
2359 uint32 addr = (GPR32 (OP[2])) + OP[1], tmp;
2360 trace_input ("tbitw", OP_CONSTANT4, OP_RP_BASE_DISP16, OP_VOID);
2361 tmp = RW (addr);
2362 SET_PSR_F (tmp & (1 << a));
2363 trace_output_32 (addr);
2364 }
2365
2366 /* tbitw. */
2367 void
2368 OP_11D_14 ()
2369 {
2370 uint16 a = (OP[0]);
2371 uint32 addr = (GPR32 (OP[2])) + OP[1], tmp;
2372 trace_input ("tbitw", OP_CONSTANT4, OP_RP_BASE_DISPS20, OP_VOID);
2373 tmp = RW (addr);
2374 SET_PSR_F (tmp & (1 << a));
2375 trace_output_32 (addr);
2376 }
2377
2378
2379 /* tbitw. */
2380 void
2381 OP_11E_14 ()
2382 {
2383 uint16 a = (OP[0]);
2384 uint32 addr = (GPR32 (OP[2])) + OP[1], tmp;
2385 trace_input ("tbitw", OP_CONSTANT4, OP_RP_INDEX_DISPS20, OP_VOID);
2386 tmp = RW (addr);
2387 SET_PSR_F (tmp & (1 << a));
2388 trace_output_32 (addr);
2389 }
2390
2391
2392 /* tbit. */
2393 void
2394 OP_6_8 ()
2395 {
2396 uint16 a = OP[0];
2397 uint16 b = (GPR (OP[1]));
2398 trace_input ("tbit", OP_CONSTANT4, OP_REG, OP_VOID);
2399 SET_PSR_F (b & (1 << a));
2400 trace_output_16 (b);
2401 }
2402
2403 /* tbit. */
2404 void
2405 OP_7_8 ()
2406 {
2407 uint16 a = GPR (OP[0]);
2408 uint16 b = (GPR (OP[1]));
2409 trace_input ("tbit", OP_REG, OP_REG, OP_VOID);
2410 SET_PSR_F (b & (1 << a));
2411 trace_output_16 (b);
2412 }
2413
2414
2415 /* cmpb. */
2416 void
2417 OP_50_8 ()
2418 {
2419 uint8 a = (OP[0]) & 0xFF;
2420 uint8 b = (GPR (OP[1])) & 0xFF;
2421 trace_input ("cmpb", OP_CONSTANT4, OP_REG, OP_VOID);
2422 SET_PSR_Z (a == b);
2423 SET_PSR_N ((int8)a > (int8)b);
2424 SET_PSR_L (a > b);
2425 trace_output_flag ();
2426 }
2427
2428 /* cmpb. */
2429 void
2430 OP_50B_C ()
2431 {
2432 uint8 a = (OP[0]) & 0xFF;
2433 uint8 b = (GPR (OP[1])) & 0xFF;
2434 trace_input ("cmpb", OP_CONSTANT16, OP_REG, OP_VOID);
2435 SET_PSR_Z (a == b);
2436 SET_PSR_N ((int8)a > (int8)b);
2437 SET_PSR_L (a > b);
2438 trace_output_flag ();
2439 }
2440
2441 /* cmpb. */
2442 void
2443 OP_51_8 ()
2444 {
2445 uint8 a = (GPR (OP[0])) & 0xFF;
2446 uint8 b = (GPR (OP[1])) & 0xFF;
2447 trace_input ("cmpb", OP_REG, OP_REG, OP_VOID);
2448 SET_PSR_Z (a == b);
2449 SET_PSR_N ((int8)a > (int8)b);
2450 SET_PSR_L (a > b);
2451 trace_output_flag ();
2452 }
2453
2454 /* cmpw. */
2455 void
2456 OP_52_8 ()
2457 {
2458 uint16 a = (OP[0]);
2459 uint16 b = GPR (OP[1]);
2460 trace_input ("cmpw", OP_CONSTANT4, OP_REG, OP_VOID);
2461 SET_PSR_Z (a == b);
2462 SET_PSR_N ((int16)a > (int16)b);
2463 SET_PSR_L (a > b);
2464 trace_output_flag ();
2465 }
2466
2467 /* cmpw. */
2468 void
2469 OP_52B_C ()
2470 {
2471 uint16 a = (OP[0]);
2472 uint16 b = GPR (OP[1]);
2473 trace_input ("cmpw", OP_CONSTANT16, OP_REG, OP_VOID);
2474 SET_PSR_Z (a == b);
2475 SET_PSR_N ((int16)a > (int16)b);
2476 SET_PSR_L (a > b);
2477 trace_output_flag ();
2478 }
2479
2480 /* cmpw. */
2481 void
2482 OP_53_8 ()
2483 {
2484 uint16 a = GPR (OP[0]) ;
2485 uint16 b = GPR (OP[1]) ;
2486 trace_input ("cmpw", OP_REG, OP_REG, OP_VOID);
2487 SET_PSR_Z (a == b);
2488 SET_PSR_N ((int16)a > (int16)b);
2489 SET_PSR_L (a > b);
2490 trace_output_flag ();
2491 }
2492
2493 /* cmpd. */
2494 void
2495 OP_56_8 ()
2496 {
2497 uint32 a = (OP[0]);
2498 uint32 b = GPR32 (OP[1]);
2499 trace_input ("cmpd", OP_CONSTANT4, OP_REGP, OP_VOID);
2500 SET_PSR_Z (a == b);
2501 SET_PSR_N ((int32)a > (int32)b);
2502 SET_PSR_L (a > b);
2503 trace_output_flag ();
2504 }
2505
2506 /* cmpd. */
2507 void
2508 OP_56B_C ()
2509 {
2510 uint32 a = (SEXT16(OP[0]));
2511 uint32 b = GPR32 (OP[1]);
2512 trace_input ("cmpd", OP_CONSTANT16, OP_REGP, OP_VOID);
2513 SET_PSR_Z (a == b);
2514 SET_PSR_N ((int32)a > (int32)b);
2515 SET_PSR_L (a > b);
2516 trace_output_flag ();
2517 }
2518
2519 /* cmpd. */
2520 void
2521 OP_57_8 ()
2522 {
2523 uint32 a = GPR32 (OP[0]) ;
2524 uint32 b = GPR32 (OP[1]) ;
2525 trace_input ("cmpd", OP_REGP, OP_REGP, OP_VOID);
2526 SET_PSR_Z (a == b);
2527 SET_PSR_N ((int32)a > (int32)b);
2528 SET_PSR_L (a > b);
2529 trace_output_flag ();
2530 }
2531
2532 /* cmpd. */
2533 void
2534 OP_9_C()
2535 {
2536 uint32 a = (OP[0]);
2537 uint32 b = GPR32 (OP[1]);
2538 trace_input ("cmpd", OP_CONSTANT32, OP_REGP, OP_VOID);
2539 SET_PSR_Z (a == b);
2540 SET_PSR_N ((int32)a > (int32)b);
2541 SET_PSR_L (a > b);
2542 trace_output_flag ();
2543 }
2544
2545
2546 /* movb. */
2547 void
2548 OP_58_8 ()
2549 {
2550 uint8 tmp = OP[0] & 0xFF;
2551 trace_input ("movb", OP_CONSTANT4, OP_REG, OP_VOID);
2552 uint16 a = (GPR (OP[1])) & 0xFF00;
2553 SET_GPR (OP[1], (a | tmp));
2554 trace_output_16 (tmp);
2555 }
2556
2557 /* movb. */
2558 void
2559 OP_58B_C ()
2560 {
2561 uint8 tmp = OP[0] & 0xFF;
2562 trace_input ("movb", OP_CONSTANT16, OP_REG, OP_VOID);
2563 uint16 a = (GPR (OP[1])) & 0xFF00;
2564 SET_GPR (OP[1], (a | tmp));
2565 trace_output_16 (tmp);
2566 }
2567
2568 /* movb. */
2569 void
2570 OP_59_8 ()
2571 {
2572 uint8 tmp = (GPR (OP[0])) & 0xFF;
2573 trace_input ("movb", OP_REG, OP_REG, OP_VOID);
2574 uint16 a = (GPR (OP[1])) & 0xFF00;
2575 SET_GPR (OP[1], (a | tmp));
2576 trace_output_16 (tmp);
2577 }
2578
2579 /* movw. */
2580 void
2581 OP_5A_8 ()
2582 {
2583 uint16 tmp = OP[0];
2584 trace_input ("movw", OP_CONSTANT4_1, OP_REG, OP_VOID);
2585 SET_GPR (OP[1], (tmp & 0xffff));
2586 trace_output_16 (tmp);
2587 }
2588
2589 /* movw. */
2590 void
2591 OP_5AB_C ()
2592 {
2593 int16 tmp = OP[0];
2594 trace_input ("movw", OP_CONSTANT16, OP_REG, OP_VOID);
2595 SET_GPR (OP[1], (tmp & 0xffff));
2596 trace_output_16 (tmp);
2597 }
2598
2599 /* movw. */
2600 void
2601 OP_5B_8 ()
2602 {
2603 uint16 tmp = GPR (OP[0]);
2604 trace_input ("movw", OP_REG, OP_REGP, OP_VOID);
2605 uint32 a = GPR32 (OP[1]);
2606 a = (a & 0xffff0000) | tmp;
2607 SET_GPR32 (OP[1], a);
2608 trace_output_16 (tmp);
2609 }
2610
2611 /* movxb. */
2612 void
2613 OP_5C_8 ()
2614 {
2615 uint8 tmp = (GPR (OP[0])) & 0xFF;
2616 trace_input ("movxb", OP_REG, OP_REG, OP_VOID);
2617 SET_GPR (OP[1], ((SEXT8(tmp)) & 0xffff));
2618 trace_output_16 (tmp);
2619 }
2620
2621 /* movzb. */
2622 void
2623 OP_5D_8 ()
2624 {
2625 uint8 tmp = (GPR (OP[0])) & 0xFF;
2626 trace_input ("movzb", OP_REG, OP_REG, OP_VOID);
2627 SET_GPR (OP[1], tmp);
2628 trace_output_16 (tmp);
2629 }
2630
2631 /* movxw. */
2632 void
2633 OP_5E_8 ()
2634 {
2635 uint16 tmp = GPR (OP[0]);
2636 trace_input ("movxw", OP_REG, OP_REGP, OP_VOID);
2637 SET_GPR32 (OP[1], SEXT16(tmp));
2638 trace_output_16 (tmp);
2639 }
2640
2641 /* movzw. */
2642 void
2643 OP_5F_8 ()
2644 {
2645 uint16 tmp = GPR (OP[0]);
2646 trace_input ("movzw", OP_REG, OP_REGP, OP_VOID);
2647 SET_GPR32 (OP[1], (tmp & 0x0000FFFF));
2648 trace_output_16 (tmp);
2649 }
2650
2651 /* movd. */
2652 void
2653 OP_54_8 ()
2654 {
2655 int32 tmp = OP[0];
2656 trace_input ("movd", OP_CONSTANT4, OP_REGP, OP_VOID);
2657 SET_GPR32 (OP[1], tmp);
2658 trace_output_32 (tmp);
2659 }
2660
2661 /* movd. */
2662 void
2663 OP_54B_C ()
2664 {
2665 int32 tmp = SEXT16(OP[0]);
2666 trace_input ("movd", OP_CONSTANT16, OP_REGP, OP_VOID);
2667 SET_GPR32 (OP[1], tmp);
2668 trace_output_32 (tmp);
2669 }
2670
2671 /* movd. */
2672 void
2673 OP_55_8 ()
2674 {
2675 uint32 tmp = GPR32 (OP[0]);
2676 trace_input ("movd", OP_REGP, OP_REGP, OP_VOID);
2677 SET_GPR32 (OP[1], tmp);
2678 trace_output_32 (tmp);
2679 }
2680
2681 /* movd. */
2682 void
2683 OP_5_8 ()
2684 {
2685 uint32 tmp = OP[0];
2686 trace_input ("movd", OP_CONSTANT20, OP_REGP, OP_VOID);
2687 SET_GPR32 (OP[1], tmp);
2688 trace_output_32 (tmp);
2689 }
2690
2691 /* movd. */
2692 void
2693 OP_7_C ()
2694 {
2695 int32 tmp = OP[0];
2696 trace_input ("movd", OP_CONSTANT32, OP_REGP, OP_VOID);
2697 SET_GPR32 (OP[1], tmp);
2698 trace_output_32 (tmp);
2699 }
2700
2701 /* loadm. */
2702 void
2703 OP_14_D ()
2704 {
2705 uint32 addr = GPR (0);
2706 uint16 count = OP[0], reg = 2, tmp;
2707 trace_input ("loadm", OP_CONSTANT4, OP_VOID, OP_VOID);
2708 if ((addr & 1))
2709 {
2710 State.exception = SIG_CR16_BUS;
2711 State.pc_changed = 1; /* Don't increment the PC. */
2712 trace_output_void ();
2713 return;
2714 }
2715
2716 while (count)
2717 {
2718 tmp = RW (addr);
2719 SET_GPR (reg, tmp);
2720 addr +=2;
2721 --count;
2722 reg++;
2723 if (reg == 6) reg = 8;
2724 };
2725
2726 SET_GPR (0, addr);
2727 trace_output_void ();
2728 }
2729
2730
2731 /* loadmp. */
2732 void
2733 OP_15_D ()
2734 {
2735 uint32 addr = GPR32 (0);
2736 uint16 count = OP[0], reg = 2, tmp;
2737 trace_input ("loadm", OP_CONSTANT4, OP_VOID, OP_VOID);
2738 if ((addr & 1))
2739 {
2740 State.exception = SIG_CR16_BUS;
2741 State.pc_changed = 1; /* Don't increment the PC. */
2742 trace_output_void ();
2743 return;
2744 }
2745
2746 while (count)
2747 {
2748 tmp = RW (addr);
2749 SET_GPR (reg, tmp);
2750 addr +=2;
2751 --count;
2752 reg++;
2753 if (reg == 6) reg = 8;
2754 };
2755
2756 SET_GPR32 (0, addr);
2757 trace_output_void ();
2758 }
2759
2760
2761 /* loadb. */
2762 void
2763 OP_88_8 ()
2764 {
2765 /* loadb ABS20, REG
2766 * ADDR = zext24(abs20) | remap (ie 0xF00000)
2767 * REG = [ADDR]
2768 * NOTE: remap is
2769 * If (abs20 > 0xEFFFF) the resulting address is logically ORed
2770 * with 0xF00000 i.e. addresses from 1M-64k to 1M are re-mapped
2771 * by the core to 16M-64k to 16M. */
2772
2773 uint16 tmp, a = (GPR (OP[1])) & 0xFF00;
2774 uint32 addr = OP[0];
2775 trace_input ("loadb", OP_ABS20, OP_REG, OP_VOID);
2776 if (addr > 0xEFFFF) addr |= 0xF00000;
2777 tmp = (RB (addr));
2778 SET_GPR (OP[1], (a | tmp));
2779 trace_output_16 (tmp);
2780 }
2781
2782 /* loadb. */
2783 void
2784 OP_127_14 ()
2785 {
2786 /* loadb ABS24, REG
2787 * ADDR = abs24
2788 * REGR = [ADDR]. */
2789
2790 uint16 tmp, a = (GPR (OP[1])) & 0xFF00;
2791 uint32 addr = OP[0];
2792 trace_input ("loadb", OP_ABS24, OP_REG, OP_VOID);
2793 tmp = (RB (addr));
2794 SET_GPR (OP[1], (a | tmp));
2795 trace_output_16 (tmp);
2796 }
2797
2798 /* loadb. */
2799 void
2800 OP_45_7 ()
2801 {
2802 /* loadb [Rindex]ABS20 REG
2803 * ADDR = Rindex + zext24(disp20)
2804 * REGR = [ADDR]. */
2805
2806 uint32 addr;
2807 uint16 tmp, a = (GPR (OP[2])) & 0xFF00;
2808 trace_input ("loadb", OP_R_INDEX8_ABS20, OP_REG, OP_VOID);
2809
2810 if (OP[0] == 0)
2811 addr = (GPR32 (12)) + OP[1];
2812 else
2813 addr = (GPR32 (13)) + OP[1];
2814
2815 tmp = (RB (addr));
2816 SET_GPR (OP[2], (a | tmp));
2817 trace_output_16 (tmp);
2818 }
2819
2820
2821 /* loadb. */
2822 void
2823 OP_B_4 ()
2824 {
2825 /* loadb DIPS4(REGP) REG
2826 * ADDR = RPBASE + zext24(DISP4)
2827 * REG = [ADDR]. */
2828 uint16 tmp, a = (GPR (OP[2])) & 0xFF00;
2829 uint32 addr = (GPR32 (OP[1])) + OP[0];
2830 trace_input ("loadb", OP_RP_BASE_DISP4, OP_REG, OP_VOID);
2831 tmp = (RB (addr));
2832 SET_GPR (OP[2], (a | tmp));
2833 trace_output_16 (tmp);
2834 }
2835
2836 /* loadb. */
2837 void
2838 OP_BE_8 ()
2839 {
2840 /* loadb [Rindex]disp0(RPbasex) REG
2841 * ADDR = Rpbasex + Rindex
2842 * REGR = [ADDR] */
2843
2844 uint32 addr;
2845 uint16 tmp, a = (GPR (OP[3])) & 0xFF00;
2846 trace_input ("loadb", OP_RP_INDEX_DISP0, OP_REG, OP_VOID);
2847
2848 addr = (GPR32 (OP[2])) + OP[1];
2849
2850 if (OP[0] == 0)
2851 addr = (GPR32 (12)) + addr;
2852 else
2853 addr = (GPR32 (13)) + addr;
2854
2855 tmp = (RB (addr));
2856 SET_GPR (OP[3], (a | tmp));
2857 trace_output_16 (tmp);
2858 }
2859
2860 /* loadb. */
2861 void
2862 OP_219_A ()
2863 {
2864 /* loadb [Rindex]disp14(RPbasex) REG
2865 * ADDR = Rpbasex + Rindex + zext24(disp14)
2866 * REGR = [ADDR] */
2867
2868 uint32 addr;
2869 uint16 tmp, a = (GPR (OP[3])) & 0xFF00;
2870
2871 addr = (GPR32 (OP[2])) + OP[1];
2872
2873 if (OP[0] == 0)
2874 addr = (GPR32 (12)) + addr;
2875 else
2876 addr = (GPR32 (13)) + addr;
2877
2878 trace_input ("loadb", OP_RP_INDEX_DISP14, OP_REG, OP_VOID);
2879 tmp = (RB (addr));
2880 SET_GPR (OP[3], (a | tmp));
2881 trace_output_16 (tmp);
2882 }
2883
2884
2885 /* loadb. */
2886 void
2887 OP_184_14 ()
2888 {
2889 /* loadb DISPE20(REG) REG
2890 * zext24(Rbase) + zext24(dispe20)
2891 * REG = [ADDR] */
2892
2893 uint16 tmp,a = (GPR (OP[2])) & 0xFF00;
2894 uint32 addr = OP[0] + (GPR (OP[1]));
2895 trace_input ("loadb", OP_R_BASE_DISPE20, OP_REG, OP_VOID);
2896 tmp = (RB (addr));
2897 SET_GPR (OP[2], (a | tmp));
2898 trace_output_16 (tmp);
2899 }
2900
2901 /* loadb. */
2902 void
2903 OP_124_14 ()
2904 {
2905 /* loadb DISP20(REG) REG
2906 * ADDR = zext24(Rbase) + zext24(disp20)
2907 * REG = [ADDR] */
2908
2909 uint16 tmp,a = (GPR (OP[2])) & 0xFF00;
2910 uint32 addr = OP[0] + (GPR (OP[1]));
2911 trace_input ("loadb", OP_R_BASE_DISP20, OP_REG, OP_VOID);
2912 tmp = (RB (addr));
2913 SET_GPR (OP[2], (a | tmp));
2914 trace_output_16 (tmp);
2915 }
2916
2917 /* loadb. */
2918 void
2919 OP_BF_8 ()
2920 {
2921 /* loadb disp16(REGP) REG
2922 * ADDR = RPbase + zext24(disp16)
2923 * REGR = [ADDR] */
2924
2925 uint16 tmp,a = (GPR (OP[2])) & 0xFF00;
2926 uint32 addr = (GPR32 (OP[1])) + OP[0];
2927 trace_input ("loadb", OP_RP_BASE_DISP16, OP_REG, OP_VOID);
2928 tmp = (RB (addr));
2929 SET_GPR (OP[2], (a | tmp));
2930 trace_output_16 (tmp);
2931 }
2932
2933 /* loadb. */
2934 void
2935 OP_125_14 ()
2936 {
2937 /* loadb disp20(REGP) REG
2938 * ADDR = RPbase + zext24(disp20)
2939 * REGR = [ADDR] */
2940 uint16 tmp,a = (GPR (OP[2])) & 0xFF00;
2941 uint32 addr = (GPR32 (OP[1])) + OP[0];
2942 trace_input ("loadb", OP_RP_BASE_DISP20, OP_REG, OP_VOID);
2943 tmp = (RB (addr));
2944 SET_GPR (OP[2], (a | tmp));
2945 trace_output_16 (tmp);
2946 }
2947
2948
2949 /* loadb. */
2950 void
2951 OP_185_14 ()
2952 {
2953 /* loadb -disp20(REGP) REG
2954 * ADDR = RPbase + zext24(-disp20)
2955 * REGR = [ADDR] */
2956 uint16 tmp,a = (GPR (OP[2])) & 0xFF00;
2957 uint32 addr = (GPR32 (OP[1])) + OP[1];
2958 trace_input ("loadb", OP_RP_BASE_DISPE20, OP_REG, OP_VOID);
2959 tmp = (RB (addr));
2960 SET_GPR (OP[2], (a | tmp));
2961 trace_output_16 (tmp);
2962 }
2963
2964 /* loadb. */
2965 void
2966 OP_126_14 ()
2967 {
2968 /* loadb [Rindex]disp20(RPbasexb) REG
2969 * ADDR = RPbasex + Rindex + zext24(disp20)
2970 * REGR = [ADDR] */
2971
2972 uint32 addr;
2973 uint16 tmp, a = (GPR (OP[3])) & 0xFF00;
2974 trace_input ("loadb", OP_RP_INDEX_DISP20, OP_REG, OP_VOID);
2975
2976 addr = (GPR32 (OP[2])) + OP[1];
2977
2978 if (OP[0] == 0)
2979 addr = (GPR32 (12)) + addr;
2980 else
2981 addr = (GPR32 (13)) + addr;
2982
2983 tmp = (RB (addr));
2984 SET_GPR (OP[3], (a | tmp));
2985 trace_output_16 (tmp);
2986 }
2987
2988
2989 /* loadw. */
2990 void
2991 OP_89_8 ()
2992 {
2993 /* loadw ABS20, REG
2994 * ADDR = zext24(abs20) | remap
2995 * REGR = [ADDR]
2996 * NOTE: remap is
2997 * If (abs20 > 0xEFFFF) the resulting address is logically ORed
2998 * with 0xF00000 i.e. addresses from 1M-64k to 1M are re-mapped
2999 * by the core to 16M-64k to 16M. */
3000
3001 uint16 tmp;
3002 uint32 addr = OP[0];
3003 trace_input ("loadw", OP_ABS20, OP_REG, OP_VOID);
3004 if (addr > 0xEFFFF) addr |= 0xF00000;
3005 tmp = (RW (addr));
3006 SET_GPR (OP[1], tmp);
3007 trace_output_16 (tmp);
3008 }
3009
3010
3011 /* loadw. */
3012 void
3013 OP_12F_14 ()
3014 {
3015 /* loadw ABS24, REG
3016 * ADDR = abs24
3017 * REGR = [ADDR] */
3018 uint16 tmp;
3019 uint32 addr = OP[0];
3020 trace_input ("loadw", OP_ABS24, OP_REG, OP_VOID);
3021 tmp = (RW (addr));
3022 SET_GPR (OP[1], tmp);
3023 trace_output_16 (tmp);
3024 }
3025
3026 /* loadw. */
3027 void
3028 OP_47_7 ()
3029 {
3030 /* loadw [Rindex]ABS20 REG
3031 * ADDR = Rindex + zext24(disp20)
3032 * REGR = [ADDR] */
3033
3034 uint32 addr;
3035 uint16 tmp;
3036 trace_input ("loadw", OP_R_INDEX8_ABS20, OP_REG, OP_VOID);
3037
3038 if (OP[0] == 0)
3039 addr = (GPR32 (12)) + OP[1];
3040 else
3041 addr = (GPR32 (13)) + OP[1];
3042
3043 tmp = (RW (addr));
3044 SET_GPR (OP[2], tmp);
3045 trace_output_16 (tmp);
3046 }
3047
3048
3049 /* loadw. */
3050 void
3051 OP_9_4 ()
3052 {
3053 /* loadw DIPS4(REGP) REGP
3054 * ADDR = RPBASE + zext24(DISP4)
3055 * REGP = [ADDR]. */
3056 uint16 tmp;
3057 uint32 addr, a;
3058 trace_input ("loadw", OP_RP_BASE_DISP4, OP_REG, OP_VOID);
3059 addr = (GPR32 (OP[1])) + OP[0];
3060 tmp = (RW (addr));
3061 if (OP[2] > 11)
3062 {
3063 a = (GPR32 (OP[2])) & 0xffff0000;
3064 SET_GPR32 (OP[2], (a | tmp));
3065 }
3066 else
3067 SET_GPR (OP[2], tmp);
3068
3069 trace_output_16 (tmp);
3070 }
3071
3072
3073 /* loadw. */
3074 void
3075 OP_9E_8 ()
3076 {
3077 /* loadw [Rindex]disp0(RPbasex) REG
3078 * ADDR = Rpbasex + Rindex
3079 * REGR = [ADDR] */
3080
3081 uint32 addr;
3082 uint16 tmp;
3083 trace_input ("loadw", OP_RP_INDEX_DISP0, OP_REG, OP_VOID);
3084
3085 addr = (GPR32 (OP[2])) + OP[1];
3086
3087 if (OP[0] == 0)
3088 addr = (GPR32 (12)) + addr;
3089 else
3090 addr = (GPR32 (13)) + addr;
3091
3092 tmp = RW (addr);
3093 SET_GPR (OP[3], tmp);
3094 trace_output_16 (tmp);
3095 }
3096
3097
3098 /* loadw. */
3099 void
3100 OP_21B_A ()
3101 {
3102 /* loadw [Rindex]disp14(RPbasex) REG
3103 * ADDR = Rpbasex + Rindex + zext24(disp14)
3104 * REGR = [ADDR] */
3105
3106 uint32 addr;
3107 uint16 tmp;
3108 trace_input ("loadw", OP_RP_INDEX_DISP14, OP_REG, OP_VOID);
3109 addr = (GPR32 (OP[2])) + OP[1];
3110
3111 if (OP[0] == 0)
3112 addr = (GPR32 (12)) + addr;
3113 else
3114 addr = (GPR32 (13)) + addr;
3115
3116 tmp = (RW (addr));
3117 SET_GPR (OP[3], tmp);
3118 trace_output_16 (tmp);
3119 }
3120
3121 /* loadw. */
3122 void
3123 OP_18C_14 ()
3124 {
3125 /* loadw dispe20(REG) REGP
3126 * REGP = [DISPE20+[REG]] */
3127
3128 uint16 tmp;
3129 uint32 addr, a;
3130 trace_input ("loadw", OP_R_BASE_DISPE20, OP_REGP, OP_VOID);
3131 addr = OP[0] + (GPR (OP[1]));
3132 tmp = (RW (addr));
3133 if (OP[2] > 11)
3134 {
3135 a = (GPR32 (OP[2])) & 0xffff0000;
3136 SET_GPR32 (OP[2], (a | tmp));
3137 }
3138 else
3139 SET_GPR (OP[2], tmp);
3140
3141 trace_output_16 (tmp);
3142 }
3143
3144
3145 /* loadw. */
3146 void
3147 OP_12C_14 ()
3148 {
3149 /* loadw DISP20(REG) REGP
3150 * ADDR = zext24(Rbase) + zext24(disp20)
3151 * REGP = [ADDR] */
3152
3153 uint16 tmp;
3154 uint32 addr, a;
3155 trace_input ("loadw", OP_R_BASE_DISP20, OP_REGP, OP_VOID);
3156 addr = OP[0] + (GPR (OP[1]));
3157 tmp = (RW (addr));
3158 if (OP[2] > 11)
3159 {
3160 a = (GPR32 (OP[2])) & 0xffff0000;
3161 SET_GPR32 (OP[2], (a | tmp));
3162 }
3163 else
3164 SET_GPR (OP[2], tmp);
3165
3166 trace_output_16 (tmp);
3167 }
3168
3169 /* loadw. */
3170 void
3171 OP_9F_8 ()
3172 {
3173 /* loadw disp16(REGP) REGP
3174 * ADDR = RPbase + zext24(disp16)
3175 * REGP = [ADDR] */
3176 uint16 tmp;
3177 uint32 addr, a;
3178 trace_input ("loadw", OP_RP_BASE_DISP16, OP_REGP, OP_VOID);
3179 addr = (GPR32 (OP[1])) + OP[0];
3180 tmp = (RW (addr));
3181 if (OP[2] > 11)
3182 {
3183 a = (GPR32 (OP[2])) & 0xffff0000;
3184 SET_GPR32 (OP[2], (a | tmp));
3185 }
3186 else
3187 SET_GPR (OP[2], tmp);
3188
3189 trace_output_16 (tmp);
3190 }
3191
3192 /* loadw. */
3193 void
3194 OP_12D_14 ()
3195 {
3196 /* loadw disp20(REGP) REGP
3197 * ADDR = RPbase + zext24(disp20)
3198 * REGP = [ADDR] */
3199 uint16 tmp;
3200 uint32 addr, a;
3201 trace_input ("loadw", OP_RP_BASE_DISP20, OP_REG, OP_VOID);
3202 addr = (GPR32 (OP[1])) + OP[0];
3203 tmp = (RW (addr));
3204 if (OP[2] > 11)
3205 {
3206 a = (GPR32 (OP[2])) & 0xffff0000;
3207 SET_GPR32 (OP[2], (a | tmp));
3208 }
3209 else
3210 SET_GPR (OP[2], tmp);
3211
3212 trace_output_16 (tmp);
3213 }
3214
3215 /* loadw. */
3216 void
3217 OP_18D_14 ()
3218 {
3219 /* loadw -disp20(REGP) REG
3220 * ADDR = RPbase + zext24(-disp20)
3221 * REGR = [ADDR] */
3222
3223 uint16 tmp;
3224 uint32 addr, a;
3225 trace_input ("loadw", OP_RP_BASE_DISPE20, OP_REG, OP_VOID);
3226 addr = (GPR32 (OP[1])) + OP[0];
3227 tmp = (RB (addr));
3228 if (OP[2] > 11)
3229 {
3230 a = (GPR32 (OP[2])) & 0xffff0000;
3231 SET_GPR32 (OP[2], (a | tmp));
3232 }
3233 else
3234 SET_GPR (OP[2], tmp);
3235
3236 trace_output_16 (tmp);
3237 }
3238
3239
3240 /* loadw. */
3241 void
3242 OP_12E_14 ()
3243 {
3244 /* loadw [Rindex]disp20(RPbasexb) REG
3245 * ADDR = RPbasex + Rindex + zext24(disp20)
3246 * REGR = [ADDR] */
3247
3248 uint32 addr;
3249 uint16 tmp;
3250 trace_input ("loadw", OP_RP_INDEX_DISP20, OP_REG, OP_VOID);
3251
3252 if (OP[0] == 0)
3253 addr = (GPR32 (12)) + OP[1] + (GPR32 (OP[2]));
3254 else
3255 addr = (GPR32 (13)) + OP[1] + (GPR32 (OP[2]));
3256
3257 tmp = (RW (addr));
3258 SET_GPR (OP[3], tmp);
3259 trace_output_16 (tmp);
3260 }
3261
3262
3263 /* loadd. */
3264 void
3265 OP_87_8 ()
3266 {
3267 /* loadd ABS20, REGP
3268 * ADDR = zext24(abs20) | remap
3269 * REGP = [ADDR]
3270 * NOTE: remap is
3271 * If (abs20 > 0xEFFFF) the resulting address is logically ORed
3272 * with 0xF00000 i.e. addresses from 1M-64k to 1M are re-mapped
3273 * by the core to 16M-64k to 16M. */
3274
3275 uint32 addr, tmp;
3276 addr = OP[0];
3277 trace_input ("loadd", OP_ABS20, OP_REGP, OP_VOID);
3278 if (addr > 0xEFFFF) addr |= 0xF00000;
3279 tmp = RLW (addr);
3280 tmp = ((tmp << 16) & 0xffff)| ((tmp >> 16) & 0xffff);
3281 SET_GPR32 (OP[1], tmp);
3282 trace_output_32 (tmp);
3283 }
3284
3285 /* loadd. */
3286 void
3287 OP_12B_14 ()
3288 {
3289 /* loadd ABS24, REGP
3290 * ADDR = abs24
3291 * REGP = [ADDR] */
3292
3293 uint32 addr = OP[0];
3294 uint32 tmp;
3295 trace_input ("loadd", OP_ABS24, OP_REGP, OP_VOID);
3296 tmp = RLW (addr);
3297 tmp = ((tmp & 0xffff) << 16)| ((tmp >> 16) & 0xffff);
3298 SET_GPR32 (OP[1],tmp);
3299 trace_output_32 (tmp);
3300 }
3301
3302
3303 /* loadd. */
3304 void
3305 OP_46_7 ()
3306 {
3307 /* loadd [Rindex]ABS20 REGP
3308 * ADDR = Rindex + zext24(disp20)
3309 * REGP = [ADDR] */
3310
3311 uint32 addr, tmp;
3312 trace_input ("loadd", OP_R_INDEX8_ABS20, OP_REGP, OP_VOID);
3313
3314 if (OP[0] == 0)
3315 addr = (GPR32 (12)) + OP[1];
3316 else
3317 addr = (GPR32 (13)) + OP[1];
3318
3319 tmp = RLW (addr);
3320 tmp = ((tmp & 0xffff) << 16)| ((tmp >> 16) & 0xffff);
3321 SET_GPR32 (OP[2], tmp);
3322 trace_output_32 (tmp);
3323 }
3324
3325
3326 /* loadd. */
3327 void
3328 OP_A_4 ()
3329 {
3330 /* loadd dips4(regp) REGP
3331 * ADDR = Rpbase + zext24(disp4)
3332 * REGP = [ADDR] */
3333
3334 uint32 tmp, addr = (GPR32 (OP[1])) + OP[0];
3335 trace_input ("loadd", OP_RP_BASE_DISP4, OP_REGP, OP_VOID);
3336 tmp = RLW (addr);
3337 tmp = ((tmp & 0xffff) << 16)| ((tmp >> 16) & 0xffff);
3338 SET_GPR32 (OP[2], tmp);
3339 trace_output_32 (tmp);
3340 }
3341
3342
3343 /* loadd. */
3344 void
3345 OP_AE_8 ()
3346 {
3347 /* loadd [Rindex]disp0(RPbasex) REGP
3348 * ADDR = Rpbasex + Rindex
3349 * REGP = [ADDR] */
3350
3351 uint32 addr, tmp;
3352 trace_input ("loadd", OP_RP_INDEX_DISP0, OP_REGP, OP_VOID);
3353
3354 if (OP[0] == 0)
3355 addr = (GPR32 (12)) + (GPR32 (OP[2])) + OP[1];
3356 else
3357 addr = (GPR32 (13)) + (GPR32 (OP[2])) + OP[1];
3358
3359 tmp = RLW (addr);
3360 tmp = ((tmp & 0xffff) << 16)| ((tmp >> 16) & 0xffff);
3361 SET_GPR32 (OP[3], tmp);
3362 trace_output_32 (tmp);
3363 }
3364
3365
3366 /* loadd. */
3367 void
3368 OP_21A_A ()
3369 {
3370 /* loadd [Rindex]disp14(RPbasex) REGP
3371 * ADDR = Rpbasex + Rindex + zext24(disp14)
3372 * REGR = [ADDR] */
3373
3374 uint32 addr, tmp;
3375 trace_input ("loadd", OP_RP_INDEX_DISP14, OP_REGP, OP_VOID);
3376
3377 if (OP[0] == 0)
3378 addr = (GPR32 (12)) + OP[1] + (GPR32 (OP[2]));
3379 else
3380 addr = (GPR32 (13)) + OP[1] + (GPR32 (OP[2]));
3381
3382 tmp = RLW (addr);
3383 tmp = ((tmp & 0xffff) << 16)| ((tmp >> 16) & 0xffff);
3384 SET_GPR (OP[3],tmp);
3385 trace_output_32 (tmp);
3386 }
3387
3388
3389 /* loadd. */
3390 void
3391 OP_188_14 ()
3392 {
3393 /* loadd dispe20(REG) REG
3394 * zext24(Rbase) + zext24(dispe20)
3395 * REG = [ADDR] */
3396
3397 uint32 tmp, addr = OP[0] + (GPR (OP[1]));
3398 trace_input ("loadd", OP_R_BASE_DISPE20, OP_REGP, OP_VOID);
3399 tmp = RLW (addr);
3400 tmp = ((tmp & 0xffff) << 16)| ((tmp >> 16) & 0xffff);
3401 SET_GPR32 (OP[2], tmp);
3402 trace_output_32 (tmp);
3403 }
3404
3405
3406 /* loadd. */
3407 void
3408 OP_128_14 ()
3409 {
3410 /* loadd DISP20(REG) REG
3411 * ADDR = zext24(Rbase) + zext24(disp20)
3412 * REG = [ADDR] */
3413
3414 uint32 tmp, addr = OP[0] + (GPR (OP[1]));
3415 trace_input ("loadd", OP_R_BASE_DISP20, OP_REGP, OP_VOID);
3416 tmp = RLW (addr);
3417 tmp = ((tmp & 0xffff) << 16)| ((tmp >> 16) & 0xffff);
3418 SET_GPR32 (OP[2], tmp);
3419 trace_output_32 (tmp);
3420 }
3421
3422 /* loadd. */
3423 void
3424 OP_AF_8 ()
3425 {
3426 /* loadd disp16(REGP) REGP
3427 * ADDR = RPbase + zext24(disp16)
3428 * REGR = [ADDR] */
3429 uint32 tmp, addr = OP[0] + (GPR32 (OP[1]));
3430 trace_input ("loadd", OP_RP_BASE_DISP16, OP_REGP, OP_VOID);
3431 tmp = RLW (addr);
3432 tmp = ((tmp & 0xffff) << 16)| ((tmp >> 16) & 0xffff);
3433 SET_GPR32 (OP[2], tmp);
3434 trace_output_32 (tmp);
3435 }
3436
3437
3438 /* loadd. */
3439 void
3440 OP_129_14 ()
3441 {
3442 /* loadd disp20(REGP) REGP
3443 * ADDR = RPbase + zext24(disp20)
3444 * REGP = [ADDR] */
3445 uint32 tmp, addr = OP[0] + (GPR32 (OP[1]));
3446 trace_input ("loadd", OP_RP_BASE_DISP20, OP_REGP, OP_VOID);
3447 tmp = RLW (addr);
3448 tmp = ((tmp & 0xffff) << 16)| ((tmp >> 16) & 0xffff);
3449 SET_GPR32 (OP[2], tmp);
3450 trace_output_32 (tmp);
3451 }
3452
3453 /* loadd. */
3454 void
3455 OP_189_14 ()
3456 {
3457 /* loadd -disp20(REGP) REGP
3458 * ADDR = RPbase + zext24(-disp20)
3459 * REGP = [ADDR] */
3460
3461 uint32 tmp, addr = OP[0] + (GPR32 (OP[1]));
3462 trace_input ("loadd", OP_RP_BASE_DISPE20, OP_REGP, OP_VOID);
3463 tmp = RLW (addr);
3464 tmp = ((tmp & 0xffff) << 16)| ((tmp >> 16) & 0xffff);
3465 SET_GPR32 (OP[2], tmp);
3466 trace_output_32 (tmp);
3467 }
3468
3469 /* loadd. */
3470 void
3471 OP_12A_14 ()
3472 {
3473 /* loadd [Rindex]disp20(RPbasexb) REGP
3474 * ADDR = RPbasex + Rindex + zext24(disp20)
3475 * REGP = [ADDR] */
3476
3477 uint32 addr, tmp;
3478 trace_input ("loadd", OP_RP_INDEX_DISP20, OP_REGP, OP_VOID);
3479
3480 if (OP[0] == 0)
3481 addr = (GPR32 (12)) + OP[1] + (GPR32 (OP[2]));
3482 else
3483 addr = (GPR32 (13)) + OP[1] + (GPR32 (OP[2]));
3484
3485 tmp = RLW (addr);
3486 tmp = ((tmp << 16) & 0xffff)| ((tmp >> 16) & 0xffff);
3487 SET_GPR32 (OP[3], tmp);
3488 trace_output_32 (tmp);
3489 }
3490
3491
3492 /* storb. */
3493 void
3494 OP_C8_8 ()
3495 {
3496 /* storb REG, ABS20
3497 * ADDR = zext24(abs20) | remap
3498 * [ADDR] = REGR
3499 * NOTE: remap is
3500 * If (abs20 > 0xEFFFF) the resulting address is logically ORed
3501 * with 0xF00000 i.e. addresses from 1M-64k to 1M are re-mapped
3502 * by the core to 16M-64k to 16M. */
3503
3504 uint8 a = ((GPR (OP[0])) & 0xff);
3505 uint32 addr = OP[1];
3506 trace_input ("storb", OP_REG, OP_ABS20_OUTPUT, OP_VOID);
3507 SB (addr, a);
3508 trace_output_32 (addr);
3509 }
3510
3511 /* storb. */
3512 void
3513 OP_137_14 ()
3514 {
3515 /* storb REG, ABS24
3516 * ADDR = abs24
3517 * [ADDR] = REGR. */
3518
3519 uint8 a = ((GPR (OP[0])) & 0xff);
3520 uint32 addr = OP[1];
3521 trace_input ("storb", OP_REG, OP_ABS24_OUTPUT, OP_VOID);
3522 SB (addr, a);
3523 trace_output_32 (addr);
3524 }
3525
3526 /* storb. */
3527 void
3528 OP_65_7 ()
3529 {
3530 /* storb REG, [Rindex]ABS20
3531 * ADDR = Rindex + zext24(disp20)
3532 * [ADDR] = REGR */
3533
3534 uint32 addr;
3535 uint8 a = ((GPR (OP[0])) & 0xff);
3536 trace_input ("storb", OP_REG, OP_R_INDEX8_ABS20, OP_VOID);
3537
3538 if (OP[1] == 0)
3539 addr = (GPR32 (12)) + OP[2];
3540 else
3541 addr = (GPR32 (13)) + OP[2];
3542
3543 SB (addr, a);
3544 trace_output_32 (addr);
3545 }
3546
3547 /* storb. */
3548 void
3549 OP_F_4 ()
3550 {
3551 /* storb REG, DIPS4(REGP)
3552 * ADDR = RPBASE + zext24(DISP4)
3553 * [ADDR] = REG. */
3554
3555 uint16 a = ((GPR (OP[0])) & 0xff);
3556 trace_input ("storb", OP_REG, OP_RP_BASE_DISPE4, OP_VOID);
3557 uint32 addr = (GPR32 (OP[2])) + OP[1];
3558 SB (addr, a);
3559 trace_output_32 (addr);
3560 }
3561
3562 /* storb. */
3563 void
3564 OP_FE_8 ()
3565 {
3566 /* storb [Rindex]disp0(RPbasex) REG
3567 * ADDR = Rpbasex + Rindex
3568 * [ADDR] = REGR */
3569
3570 uint32 addr;
3571 uint8 a = ((GPR (OP[0])) & 0xff);
3572 trace_input ("storb", OP_REG, OP_RP_INDEX_DISP0, OP_VOID);
3573
3574 if (OP[1] == 0)
3575 addr = (GPR32 (12)) + (GPR32 (OP[3])) + OP[2];
3576 else
3577 addr = (GPR32 (13)) + (GPR32 (OP[3])) + OP[2];
3578
3579 SB (addr, a);
3580 trace_output_32 (addr);
3581 }
3582
3583 /* storb. */
3584 void
3585 OP_319_A ()
3586 {
3587 /* storb REG, [Rindex]disp14(RPbasex)
3588 * ADDR = Rpbasex + Rindex + zext24(disp14)
3589 * [ADDR] = REGR */
3590
3591 uint8 a = ((GPR (OP[0])) & 0xff);
3592 trace_input ("storb", OP_REG, OP_RP_INDEX_DISP14, OP_VOID);
3593 uint32 addr = (GPR32 (OP[2])) + OP[1];
3594 SB (addr, a);
3595 trace_output_32 (addr);
3596 }
3597
3598 /* storb. */
3599 void
3600 OP_194_14 ()
3601 {
3602 /* storb REG, DISPE20(REG)
3603 * zext24(Rbase) + zext24(dispe20)
3604 * [ADDR] = REG */
3605
3606 uint8 a = ((GPR (OP[0])) & 0xff);
3607 trace_input ("storb", OP_REG, OP_R_BASE_DISPE20, OP_VOID);
3608 uint32 addr = OP[1] + (GPR (OP[2]));
3609 SB (addr, a);
3610 trace_output_32 (addr);
3611 }
3612
3613 /* storb. */
3614 void
3615 OP_134_14 ()
3616 {
3617 /* storb REG, DISP20(REG)
3618 * ADDR = zext24(Rbase) + zext24(disp20)
3619 * [ADDR] = REG */
3620
3621 uint8 a = (GPR (OP[0]) & 0xff);
3622 trace_input ("storb", OP_REG, OP_R_BASE_DISPS20, OP_VOID);
3623 uint32 addr = OP[1] + (GPR (OP[2]));
3624 SB (addr, a);
3625 trace_output_32 (addr);
3626 }
3627
3628 /* storb. */
3629 void
3630 OP_FF_8 ()
3631 {
3632 /* storb REG, disp16(REGP)
3633 * ADDR = RPbase + zext24(disp16)
3634 * [ADDR] = REGP */
3635
3636 uint8 a = ((GPR (OP[0])) & 0xff);
3637 trace_input ("storb", OP_REG, OP_RP_BASE_DISP16, OP_VOID);
3638 uint32 addr = (GPR32 (OP[2])) + OP[1];
3639 SB (addr, a);
3640 trace_output_32 (addr);
3641 }
3642
3643 /* storb. */
3644 void
3645 OP_135_14 ()
3646 {
3647 /* storb REG, disp20(REGP)
3648 * ADDR = RPbase + zext24(disp20)
3649 * [ADDR] = REGP */
3650
3651 uint8 a = ((GPR (OP[0])) & 0xff);
3652 trace_input ("storb", OP_REG, OP_RP_BASE_DISPS20, OP_VOID);
3653 uint32 addr = (GPR32 (OP[2])) + OP[1];
3654 SB (addr, a);
3655 trace_output_32 (addr);
3656 }
3657
3658 /* storb. */
3659 void
3660 OP_195_14 ()
3661 {
3662 /* storb REG, -disp20(REGP)
3663 * ADDR = RPbase + zext24(-disp20)
3664 * [ADDR] = REGP */
3665
3666 uint8 a = (GPR (OP[0]) & 0xff);
3667 trace_input ("storb", OP_REG, OP_RP_BASE_DISPE20, OP_VOID);
3668 uint32 addr = (GPR32 (OP[2])) + OP[1];
3669 SB (addr, a);
3670 trace_output_32 (addr);
3671 }
3672
3673 /* storb. */
3674 void
3675 OP_136_14 ()
3676 {
3677 /* storb REG, [Rindex]disp20(RPbase)
3678 * ADDR = RPbasex + Rindex + zext24(disp20)
3679 * [ADDR] = REGP */
3680
3681 uint8 a = (GPR (OP[0])) & 0xff;
3682 trace_input ("storb", OP_REG, OP_RP_INDEX_DISPS20, OP_VOID);
3683 uint32 addr = (GPR32 (OP[2])) + OP[1];
3684 SB (addr, a);
3685 trace_output_32 (addr);
3686 }
3687
3688 /* STR_IMM instructions. */
3689 /* storb . */
3690 void
3691 OP_81_8 ()
3692 {
3693 uint8 a = (OP[0]) & 0xff;
3694 trace_input ("storb", OP_CONSTANT4, OP_ABS20_OUTPUT, OP_VOID);
3695 uint32 addr = OP[1];
3696 SB (addr, a);
3697 trace_output_32 (addr);
3698 }
3699
3700 /* storb. */
3701 void
3702 OP_123_14 ()
3703 {
3704 uint8 a = (OP[0]) & 0xff;
3705 trace_input ("storb", OP_CONSTANT4, OP_ABS24_OUTPUT, OP_VOID);
3706 uint32 addr = OP[1];
3707 SB (addr, a);
3708 trace_output_32 (addr);
3709 }
3710
3711 /* storb. */
3712 void
3713 OP_42_7 ()
3714 {
3715 uint32 addr;
3716 uint8 a = (OP[0]) & 0xff;
3717 trace_input ("storb", OP_CONSTANT4, OP_R_INDEX8_ABS20, OP_VOID);
3718
3719 if (OP[1] == 0)
3720 addr = (GPR32 (12)) + OP[2];
3721 else
3722 addr = (GPR32 (13)) + OP[2];
3723
3724 SB (addr, a);
3725 trace_output_32 (addr);
3726 }
3727
3728 /* storb. */
3729 void
3730 OP_218_A ()
3731 {
3732 uint8 a = (OP[0]) & 0xff;
3733 trace_input ("storb", OP_CONSTANT4, OP_RP_BASE_DISP14, OP_VOID);
3734 uint32 addr = (GPR32 (OP[2])) + OP[1];
3735 SB (addr, a);
3736 trace_output_32 (addr);
3737 }
3738
3739 /* storb. */
3740 void
3741 OP_82_8 ()
3742 {
3743 uint8 a = (OP[0]) & 0xff;
3744 trace_input ("storb", OP_CONSTANT4, OP_RP_INDEX_DISP0, OP_VOID);
3745 uint32 addr = (GPR32 (OP[2])) + OP[1];
3746 SB (addr, a);
3747 trace_output_32 (addr);
3748 }
3749
3750 /* storb. */
3751 void
3752 OP_120_14 ()
3753 {
3754 uint8 a = (OP[0]) & 0xff;
3755 trace_input ("storb", OP_CONSTANT4, OP_R_BASE_DISPS20, OP_VOID);
3756 uint32 addr = (GPR (OP[2])) + OP[1];
3757 SB (addr, a);
3758 trace_output_32 (addr);
3759 }
3760
3761 /* storb. */
3762 void
3763 OP_83_8 ()
3764 {
3765 uint8 a = (OP[0]) & 0xff;
3766 trace_input ("storb", OP_CONSTANT4, OP_RP_BASE_DISP16, OP_VOID);
3767 uint32 addr = (GPR32 (OP[2])) + OP[1];
3768 SB (addr, a);
3769 trace_output_32 (addr);
3770 }
3771
3772 /* storb. */
3773 void
3774 OP_121_14 ()
3775 {
3776 uint8 a = (OP[0]) & 0xff;
3777 trace_input ("storb", OP_CONSTANT4, OP_RP_BASE_DISPS20, OP_VOID);
3778 uint32 addr = (GPR32 (OP[2])) + OP[1];
3779 SB (addr, a);
3780 trace_output_32 (addr);
3781 }
3782
3783 /* storb. */
3784 void
3785 OP_122_14 ()
3786 {
3787 uint8 a = (OP[0]) & 0xff;
3788 trace_input ("storb", OP_CONSTANT4, OP_RP_INDEX_DISPS20, OP_VOID);
3789 uint32 addr = (GPR32 (OP[2])) + OP[1];
3790 SB (addr, a);
3791 trace_output_32 (addr);
3792 }
3793 /* endif for STR_IMM. */
3794
3795 /* storw . */
3796 void
3797 OP_C9_8 ()
3798 {
3799 uint16 a = GPR (OP[0]);
3800 trace_input ("storw", OP_REG, OP_ABS20_OUTPUT, OP_VOID);
3801 uint32 addr = OP[1];
3802 SW (addr, a);
3803 trace_output_32 (addr);
3804 }
3805
3806 /* storw. */
3807 void
3808 OP_13F_14 ()
3809 {
3810 uint16 a = GPR (OP[0]);
3811 trace_input ("storw", OP_REG, OP_ABS24_OUTPUT, OP_VOID);
3812 uint32 addr = OP[1];
3813 SW (addr, a);
3814 trace_output_32 (addr);
3815 }
3816
3817 /* storw. */
3818 void
3819 OP_67_7 ()
3820 {
3821 uint32 addr;
3822 uint16 a = GPR (OP[0]);
3823 trace_input ("storw", OP_REG, OP_R_INDEX8_ABS20, OP_VOID);
3824
3825 if (OP[1] == 0)
3826 addr = (GPR32 (12)) + OP[2];
3827 else
3828 addr = (GPR32 (13)) + OP[2];
3829
3830 SW (addr, a);
3831 trace_output_32 (addr);
3832 }
3833
3834
3835 /* storw. */
3836 void
3837 OP_D_4 ()
3838 {
3839 uint16 a = (GPR (OP[0]));
3840 trace_input ("storw", OP_REGP, OP_RP_BASE_DISPE4, OP_VOID);
3841 uint32 addr = (GPR32 (OP[2])) + OP[1];
3842 SW (addr, a);
3843 trace_output_32 (addr);
3844 }
3845
3846 /* storw. */
3847 void
3848 OP_DE_8 ()
3849 {
3850 uint16 a = GPR (OP[0]);
3851 trace_input ("storw", OP_REG, OP_RP_INDEX_DISP0, OP_VOID);
3852 uint32 addr = (GPR32 (OP[2])) + OP[1];
3853 SW (addr, a);
3854 trace_output_32 (addr);
3855 }
3856
3857 /* storw. */
3858 void
3859 OP_31B_A ()
3860 {
3861 uint16 a = GPR (OP[0]);
3862 trace_input ("storw", OP_REG, OP_RP_INDEX_DISP14, OP_VOID);
3863 uint32 addr = (GPR32 (OP[2])) + OP[1];
3864 SW (addr, a);
3865 trace_output_32 (addr);
3866 }
3867
3868 /* storw. */
3869 void
3870 OP_19C_14 ()
3871 {
3872 uint16 a = (GPR (OP[0]));
3873 trace_input ("storw", OP_REGP, OP_RP_BASE_DISPE20, OP_VOID);
3874 uint32 addr = (GPR32 (OP[2])) + OP[1];
3875 SW (addr, a);
3876 trace_output_32 (addr);
3877 }
3878
3879 /* storw. */
3880 void
3881 OP_13C_14 ()
3882 {
3883 uint16 a = (GPR (OP[0]));
3884 trace_input ("storw", OP_REG, OP_R_BASE_DISPS20, OP_VOID);
3885 uint32 addr = (GPR (OP[2])) + OP[1];
3886 SW (addr, a);
3887 trace_output_32 (addr);
3888 }
3889
3890 /* storw. */
3891 void
3892 OP_DF_8 ()
3893 {
3894 uint16 a = (GPR (OP[0]));
3895 trace_input ("storw", OP_REG, OP_RP_BASE_DISP16, OP_VOID);
3896 uint32 addr = (GPR32 (OP[2])) + OP[1];
3897 SW (addr, a);
3898 trace_output_32 (addr);
3899 }
3900
3901 /* storw. */
3902 void
3903 OP_13D_14 ()
3904 {
3905 uint16 a = (GPR (OP[0]));
3906 trace_input ("storw", OP_REG, OP_RP_BASE_DISPS20, OP_VOID);
3907 uint32 addr = (GPR32 (OP[2])) + OP[1];
3908 SW (addr, a);
3909 trace_output_32 (addr);
3910 }
3911
3912 /* storw. */
3913 void
3914 OP_19D_14 ()
3915 {
3916 uint16 a = (GPR (OP[0]));
3917 trace_input ("storw", OP_REG, OP_RP_BASE_DISPE20, OP_VOID);
3918 uint32 addr = (GPR32 (OP[2])) + OP[1];
3919 SW (addr, a);
3920 trace_output_32 (addr);
3921 }
3922
3923 /* storw. */
3924 void
3925 OP_13E_14 ()
3926 {
3927 uint16 a = (GPR (OP[0]));
3928 trace_input ("storw", OP_REG, OP_RP_INDEX_DISPS20, OP_VOID);
3929 uint32 addr = (GPR32 (OP[2])) + OP[1];
3930 SW (addr, a);
3931 trace_output_32 (addr);
3932 }
3933
3934 /* STORE-w IMM instruction *****/
3935 /* storw . */
3936 void
3937 OP_C1_8 ()
3938 {
3939 uint16 a = OP[0];
3940 trace_input ("storw", OP_CONSTANT4, OP_ABS20_OUTPUT, OP_VOID);
3941 uint32 addr = OP[1];
3942 SW (addr, a);
3943 trace_output_32 (addr);
3944 }
3945
3946 /* storw. */
3947 void
3948 OP_133_14 ()
3949 {
3950 uint16 a = OP[0];
3951 trace_input ("storw", OP_CONSTANT4, OP_ABS24_OUTPUT, OP_VOID);
3952 uint32 addr = OP[1];
3953 SW (addr, a);
3954 trace_output_32 (addr);
3955 }
3956
3957 /* storw. */
3958 void
3959 OP_62_7 ()
3960 {
3961 uint32 addr;
3962 uint16 a = OP[0];
3963 trace_input ("storw", OP_CONSTANT4, OP_R_INDEX8_ABS20, OP_VOID);
3964
3965 if (OP[1] == 0)
3966 addr = (GPR32 (12)) + OP[2];
3967 else
3968 addr = (GPR32 (13)) + OP[2];
3969
3970 SW (addr, a);
3971 trace_output_32 (addr);
3972 }
3973
3974 /* storw. */
3975 void
3976 OP_318_A ()
3977 {
3978 uint16 a = OP[0];
3979 trace_input ("storw", OP_CONSTANT4, OP_RP_BASE_DISP14, OP_VOID);
3980 uint32 addr = (GPR32 (OP[2])) + OP[1];
3981 SW (addr, a);
3982 trace_output_32 (addr);
3983 }
3984
3985 /* storw. */
3986 void
3987 OP_C2_8 ()
3988 {
3989 uint16 a = OP[0];
3990 trace_input ("storw", OP_CONSTANT4, OP_RP_INDEX_DISP0, OP_VOID);
3991 uint32 addr = (GPR32 (OP[2])) + OP[1];
3992 SW (addr, a);
3993 trace_output_32 (addr);
3994 }
3995
3996 /* storw. */
3997 void
3998 OP_130_14 ()
3999 {
4000 uint16 a = OP[0];
4001 trace_input ("storw", OP_CONSTANT4, OP_R_BASE_DISPS20, OP_VOID);
4002 uint32 addr = (GPR32 (OP[2])) + OP[1];
4003 SW (addr, a);
4004 trace_output_32 (addr);
4005 }
4006
4007 /* storw. */
4008 void
4009 OP_C3_8 ()
4010 {
4011 uint16 a = OP[0];
4012 trace_input ("storw", OP_CONSTANT4, OP_RP_BASE_DISP16, OP_VOID);
4013 uint32 addr = (GPR32 (OP[2])) + OP[1];
4014 SW (addr, a);
4015 trace_output_32 (addr);
4016 }
4017
4018
4019 /* storw. */
4020 void
4021 OP_131_14 ()
4022 {
4023 uint16 a = OP[0];
4024 trace_input ("storw", OP_CONSTANT4, OP_RP_BASE_DISPS20, OP_VOID);
4025 uint32 addr = (GPR32 (OP[2])) + OP[1];
4026 SW (addr, a);
4027 trace_output_32 (addr);
4028 }
4029
4030 /* storw. */
4031 void
4032 OP_132_14 ()
4033 {
4034 uint16 a = OP[0];
4035 trace_input ("storw", OP_CONSTANT4, OP_RP_INDEX_DISPS20, OP_VOID);
4036 uint32 addr = (GPR32 (OP[2])) + OP[1];
4037 SW (addr, a);
4038 trace_output_32 (addr);
4039 }
4040
4041
4042 /* stord. */
4043 void
4044 OP_C7_8 ()
4045 {
4046 uint32 a = GPR32 (OP[0]);
4047 trace_input ("stord", OP_REGP, OP_ABS20_OUTPUT, OP_VOID);
4048 uint32 addr = OP[1];
4049 SLW (addr, a);
4050 trace_output_32 (addr);
4051 }
4052
4053 /* stord. */
4054 void
4055 OP_13B_14 ()
4056 {
4057 uint32 a = GPR32 (OP[0]);
4058 trace_input ("stord", OP_REGP, OP_ABS24_OUTPUT, OP_VOID);
4059 uint32 addr = OP[1];
4060 SLW (addr, a);
4061 trace_output_32 (addr);
4062 }
4063
4064 /* stord. */
4065 void
4066 OP_66_7 ()
4067 {
4068 uint32 addr, a = GPR32 (OP[0]);
4069 trace_input ("stord", OP_REGP, OP_R_INDEX8_ABS20, OP_VOID);
4070
4071 if (OP[1] == 0)
4072 addr = (GPR32 (12)) + OP[2];
4073 else
4074 addr = (GPR32 (13)) + OP[2];
4075
4076 SLW (addr, a);
4077 trace_output_32 (addr);
4078 }
4079
4080 /* stord. */
4081 void
4082 OP_E_4 ()
4083 {
4084 uint32 a = GPR32 (OP[0]);
4085 trace_input ("stord", OP_REGP, OP_RP_BASE_DISPE4, OP_VOID);
4086 uint32 addr = (GPR32 (OP[2])) + OP[1];
4087 SLW (addr, a);
4088 trace_output_32 (addr);
4089 }
4090
4091 /* stord. */
4092 void
4093 OP_EE_8 ()
4094 {
4095 uint32 a = GPR32 (OP[0]);
4096 trace_input ("stord", OP_REGP, OP_RP_INDEX_DISP0, OP_VOID);
4097 uint32 addr = (GPR32 (OP[2])) + OP[1];
4098 SLW (addr, a);
4099 trace_output_32 (addr);
4100 }
4101
4102 /* stord. */
4103 void
4104 OP_31A_A ()
4105 {
4106 uint32 a = GPR32 (OP[0]);
4107 trace_input ("stord", OP_REGP, OP_RP_INDEX_DISP14, OP_VOID);
4108 uint32 addr = (GPR32 (OP[2])) + OP[1];
4109 SLW (addr, a);
4110 trace_output_32 (addr);
4111 }
4112
4113 /* stord. */
4114 void
4115 OP_198_14 ()
4116 {
4117 uint32 a = GPR32 (OP[0]);
4118 trace_input ("stord", OP_REGP, OP_R_BASE_DISPE20, OP_VOID);
4119 uint32 addr = (GPR32 (OP[2])) + OP[1];
4120 SLW (addr, a);
4121 trace_output_32 (addr);
4122 }
4123
4124 /* stord. */
4125 void
4126 OP_138_14 ()
4127 {
4128 uint32 a = GPR32 (OP[0]);
4129 trace_input ("stord", OP_REGP, OP_R_BASE_DISPS20, OP_VOID);
4130 uint32 addr = (GPR32 (OP[2])) + OP[1];
4131 SLW (addr, a);
4132 trace_output_32 (addr);
4133 }
4134
4135 /* stord. */
4136 void
4137 OP_EF_8 ()
4138 {
4139 uint32 a = GPR32 (OP[0]);
4140 trace_input ("stord", OP_REGP, OP_RP_BASE_DISP16, OP_VOID);
4141 uint32 addr = (GPR32 (OP[2])) + OP[1];
4142 SLW (addr, a);
4143 trace_output_32 (addr);
4144 }
4145
4146 /* stord. */
4147 void
4148 OP_139_14 ()
4149 {
4150 uint32 a = GPR32 (OP[0]);
4151 trace_input ("stord", OP_REGP, OP_RP_BASE_DISPS20, OP_VOID);
4152 uint32 addr = (GPR32 (OP[2])) + OP[1];
4153 SLW (addr, a);
4154 trace_output_32 (addr);
4155 }
4156
4157 /* stord. */
4158 void
4159 OP_199_14 ()
4160 {
4161 uint32 a = GPR32 (OP[0]);
4162 trace_input ("stord", OP_REGP, OP_RP_BASE_DISPE20, OP_VOID);
4163 uint32 addr = (GPR32 (OP[2])) + OP[1];
4164 SLW (addr, a);
4165 trace_output_32 (addr);
4166 }
4167
4168 /* stord. */
4169 void
4170 OP_13A_14 ()
4171 {
4172 uint32 a = GPR32 (OP[0]);
4173 trace_input ("stord", OP_REGP, OP_RP_INDEX_DISPS20, OP_VOID);
4174 uint32 addr = (GPR32 (OP[2])) + OP[1];
4175 SLW (addr, a);
4176 trace_output_32 (addr);
4177 }
4178
4179 /* macqu. */
4180 void
4181 OP_14D_14 ()
4182 {
4183 int32 tmp;
4184 int16 src1, src2;
4185 trace_input ("macuw", OP_REG, OP_REG, OP_REGP);
4186 src1 = GPR (OP[0]);
4187 src2 = GPR (OP[1]);
4188 tmp = src1 * src2;
4189 /*REVISIT FOR SATURATION and Q FORMAT. */
4190 SET_GPR32 (OP[2], tmp);
4191 trace_output_32 (tmp);
4192 }
4193
4194 /* macuw. */
4195 void
4196 OP_14E_14 ()
4197 {
4198 uint32 tmp;
4199 uint16 src1, src2;
4200 trace_input ("macuw", OP_REG, OP_REG, OP_REGP);
4201 src1 = GPR (OP[0]);
4202 src2 = GPR (OP[1]);
4203 tmp = src1 * src2;
4204 /*REVISIT FOR SATURATION. */
4205 SET_GPR32 (OP[2], tmp);
4206 trace_output_32 (tmp);
4207 }
4208
4209 /* macsw. */
4210 void
4211 OP_14F_14 ()
4212 {
4213 int32 tmp;
4214 int16 src1, src2;
4215 trace_input ("macsw", OP_REG, OP_REG, OP_REGP);
4216 src1 = GPR (OP[0]);
4217 src2 = GPR (OP[1]);
4218 tmp = src1 * src2;
4219 /*REVISIT FOR SATURATION. */
4220 SET_GPR32 (OP[2], tmp);
4221 trace_output_32 (tmp);
4222 }
4223
4224
4225 /* mulb. */
4226 void
4227 OP_64_8 ()
4228 {
4229 int16 tmp;
4230 int8 a = (OP[0]) & 0xff;
4231 int8 b = (GPR (OP[1])) & 0xff;
4232 trace_input ("mulb", OP_CONSTANT4_1, OP_REG, OP_VOID);
4233 tmp = (a * b) & 0xff;
4234 SET_GPR (OP[1], (tmp | ((GPR (OP[1])) & 0xff00)));
4235 trace_output_16 (tmp);
4236 }
4237
4238 /* mulb. */
4239 void
4240 OP_64B_C ()
4241 {
4242 int16 tmp;
4243 int8 a = (OP[0]) & 0xff, b = (GPR (OP[1])) & 0xff;
4244 trace_input ("mulb", OP_CONSTANT4, OP_REG, OP_VOID);
4245 tmp = (a * b) & 0xff;
4246 SET_GPR (OP[1], (tmp | ((GPR (OP[1])) & 0xff00)));
4247 trace_output_16 (tmp);
4248 }
4249
4250
4251 /* mulb. */
4252 void
4253 OP_65_8 ()
4254 {
4255 int16 tmp;
4256 int8 a = (GPR (OP[0])) & 0xff, b = (GPR (OP[1])) & 0xff;
4257 trace_input ("mulb", OP_REG, OP_REG, OP_VOID);
4258 tmp = (a * b) & 0xff;
4259 SET_GPR (OP[1], (tmp | ((GPR (OP[1])) & 0xff00)));
4260 trace_output_16 (tmp);
4261 }
4262
4263
4264 /* mulw. */
4265 void
4266 OP_66_8 ()
4267 {
4268 int32 tmp;
4269 uint16 a = OP[0];
4270 int16 b = (GPR (OP[1]));
4271 trace_input ("mulw", OP_CONSTANT4_1, OP_REG, OP_VOID);
4272 tmp = (a * b) & 0xffff;
4273 SET_GPR (OP[1], tmp);
4274 trace_output_32 (tmp);
4275 }
4276
4277 /* mulw. */
4278 void
4279 OP_66B_C ()
4280 {
4281 int32 tmp;
4282 int16 a = OP[0], b = (GPR (OP[1]));
4283 trace_input ("mulw", OP_CONSTANT4, OP_REG, OP_VOID);
4284 tmp = (a * b) & 0xffff;
4285 SET_GPR (OP[1], tmp);
4286 trace_output_32 (tmp);
4287 }
4288
4289
4290 /* mulw. */
4291 void
4292 OP_67_8 ()
4293 {
4294 int32 tmp;
4295 int16 a = (GPR (OP[0])), b = (GPR (OP[1]));
4296 trace_input ("mulw", OP_REG, OP_REG, OP_VOID);
4297 tmp = (a * b) & 0xffff;
4298 SET_GPR (OP[1], tmp);
4299 trace_output_32 (tmp);
4300 }
4301
4302
4303 /* mulsb. */
4304 void
4305 OP_B_8 ()
4306 {
4307 int16 tmp;
4308 int8 a = (GPR (OP[0])) & 0xff, b = (GPR (OP[1])) & 0xff;
4309 trace_input ("mulsb", OP_REG, OP_REG, OP_VOID);
4310 tmp = a * b;
4311 SET_GPR (OP[1], tmp);
4312 trace_output_32 (tmp);
4313 }
4314
4315 /* mulsw. */
4316 void
4317 OP_62_8 ()
4318 {
4319 int32 tmp;
4320 int16 a = (GPR (OP[0])), b = (GPR (OP[1]));
4321 trace_input ("mulsw", OP_REG, OP_REGP, OP_VOID);
4322 tmp = a * b;
4323 SET_GPR32 (OP[1], tmp);
4324 trace_output_32 (tmp);
4325 }
4326
4327 /* muluw. */
4328 void
4329 OP_63_8 ()
4330 {
4331 uint32 tmp;
4332 uint16 a = (GPR (OP[0])), b = (GPR (OP[1]));
4333 trace_input ("muluw", OP_REG, OP_REGP, OP_VOID);
4334 tmp = a * b;
4335 SET_GPR32 (OP[1], tmp);
4336 trace_output_32 (tmp);
4337 }
4338
4339
4340 /* nop. */
4341 void
4342 OP_2C00_10 ()
4343 {
4344 trace_input ("nop", OP_VOID, OP_VOID, OP_VOID);
4345
4346 #if 0
4347 State.exception = SIGTRAP;
4348 ins_type_counters[ (int)State.ins_type ]--; /* don't count nops as normal instructions */
4349 switch (State.ins_type)
4350 {
4351 default:
4352 ins_type_counters[ (int)INS_UNKNOWN ]++;
4353 break;
4354
4355 }
4356
4357 #endif
4358 trace_output_void ();
4359 }
4360
4361
4362 /* orb. */
4363 void
4364 OP_24_8 ()
4365 {
4366 uint8 tmp, a = (OP[0]) & 0xff, b = (GPR (OP[1])) & 0xff;
4367 trace_input ("orb", OP_CONSTANT4, OP_REG, OP_VOID);
4368 tmp = a | b;
4369 SET_GPR (OP[1], ((GPR (OP[1]) | tmp)));
4370 trace_output_16 (tmp);
4371 }
4372
4373 /* orb. */
4374 void
4375 OP_24B_C ()
4376 {
4377 uint8 tmp, a = (OP[0]) & 0xff, b = (GPR (OP[1])) & 0xff;
4378 trace_input ("orb", OP_CONSTANT16, OP_REG, OP_VOID);
4379 tmp = a | b;
4380 SET_GPR (OP[1], ((GPR (OP[1]) | tmp)));
4381 trace_output_16 (tmp);
4382 }
4383
4384 /* orb. */
4385 void
4386 OP_25_8 ()
4387 {
4388 uint8 tmp, a = (GPR (OP[0])) & 0xff, b = (GPR (OP[1])) & 0xff;
4389 trace_input ("orb", OP_REG, OP_REG, OP_VOID);
4390 tmp = a | b;
4391 SET_GPR (OP[1], ((GPR (OP[1]) | tmp)));
4392 trace_output_16 (tmp);
4393 }
4394
4395 /* orw. */
4396 void
4397 OP_26_8 ()
4398 {
4399 uint16 tmp, a = (OP[0]), b = (GPR (OP[1]));
4400 trace_input ("orw", OP_CONSTANT4, OP_REG, OP_VOID);
4401 tmp = a | b;
4402 SET_GPR (OP[1], tmp);
4403 trace_output_16 (tmp);
4404 }
4405
4406
4407 /* orw. */
4408 void
4409 OP_26B_C ()
4410 {
4411 uint16 tmp, a = (OP[0]), b = (GPR (OP[1]));
4412 trace_input ("orw", OP_CONSTANT16, OP_REG, OP_VOID);
4413 tmp = a | b;
4414 SET_GPR (OP[1], tmp);
4415 trace_output_16 (tmp);
4416 }
4417
4418 /* orw. */
4419 void
4420 OP_27_8 ()
4421 {
4422 uint16 tmp, a = (GPR (OP[0])), b = (GPR (OP[1]));
4423 trace_input ("orw", OP_REG, OP_REG, OP_VOID);
4424 tmp = a | b;
4425 SET_GPR (OP[1], tmp);
4426 trace_output_16 (tmp);
4427 }
4428
4429
4430 /* lshb. */
4431 void
4432 OP_13_9 ()
4433 {
4434 uint16 a = OP[0];
4435 uint16 tmp, b = (GPR (OP[1])) & 0xFF;
4436 trace_input ("lshb", OP_CONSTANT4, OP_REG, OP_VOID);
4437 /* A positive count specifies a shift to the left;
4438 * A negative count specifies a shift to the right. */
4439 if (sign_flag)
4440 tmp = b >> a;
4441 else
4442 tmp = b << a;
4443
4444 sign_flag = 0; /* Reset sign_flag. */
4445
4446 SET_GPR (OP[1], ((tmp & 0xFF) | ((GPR (OP[1])) & 0xFF00)));
4447 trace_output_16 (tmp);
4448 }
4449
4450 /* lshb. */
4451 void
4452 OP_44_8 ()
4453 {
4454 uint16 a = (GPR (OP[0])) & 0xff;
4455 uint16 tmp, b = (GPR (OP[1])) & 0xFF;
4456 trace_input ("lshb", OP_REG, OP_REG, OP_VOID);
4457 if (a & ((long)1 << 3))
4458 {
4459 sign_flag = 1;
4460 a = ~(a) + 1;
4461 }
4462 a = (unsigned int) (a & 0x7);
4463
4464 /* A positive count specifies a shift to the left;
4465 * A negative count specifies a shift to the right. */
4466 if (sign_flag)
4467 tmp = b >> a;
4468 else
4469 tmp = b << a;
4470
4471 sign_flag = 0; /* Reset sign_flag. */
4472 SET_GPR (OP[1], ((tmp & 0xFF) | ((GPR (OP[1])) & 0xFF00)));
4473 trace_output_16 (tmp);
4474 }
4475
4476 /* lshw. */
4477 void
4478 OP_46_8 ()
4479 {
4480 uint16 tmp, b = GPR (OP[1]);
4481 int16 a = GPR (OP[0]);
4482 trace_input ("lshw", OP_REG, OP_REG, OP_VOID);
4483 if (a & ((long)1 << 4))
4484 {
4485 sign_flag = 1;
4486 a = ~(a) + 1;
4487 }
4488 a = (unsigned int) (a & 0xf);
4489
4490 /* A positive count specifies a shift to the left;
4491 * A negative count specifies a shift to the right. */
4492 if (sign_flag)
4493 tmp = b >> a;
4494 else
4495 tmp = b << a;
4496
4497 sign_flag = 0; /* Reset sign_flag. */
4498 SET_GPR (OP[1], (tmp & 0xffff));
4499 trace_output_16 (tmp);
4500 }
4501
4502 /* lshw. */
4503 void
4504 OP_49_8 ()
4505 {
4506 uint16 tmp, b = GPR (OP[1]);
4507 uint16 a = OP[0];
4508 trace_input ("lshw", OP_CONSTANT5, OP_REG, OP_VOID);
4509 /* A positive count specifies a shift to the left;
4510 * A negative count specifies a shift to the right. */
4511 if (sign_flag)
4512 tmp = b >> a;
4513 else
4514 tmp = b << a;
4515
4516 sign_flag = 0; /* Reset sign_flag. */
4517 SET_GPR (OP[1], (tmp & 0xffff));
4518 trace_output_16 (tmp);
4519 }
4520
4521 /* lshd. */
4522 void
4523 OP_25_7 ()
4524 {
4525 uint32 tmp, b = GPR32 (OP[1]);
4526 uint16 a = OP[0];
4527 trace_input ("lshd", OP_CONSTANT6, OP_REGP, OP_VOID);
4528 /* A positive count specifies a shift to the left;
4529 * A negative count specifies a shift to the right. */
4530 if (sign_flag)
4531 tmp = b >> a;
4532 else
4533 tmp = b << a;
4534
4535 sign_flag = 0; /* Reset sign flag. */
4536
4537 SET_GPR32 (OP[1], tmp);
4538 trace_output_32 (tmp);
4539 }
4540
4541 /* lshd. */
4542 void
4543 OP_47_8 ()
4544 {
4545 uint32 tmp, b = GPR32 (OP[1]);
4546 uint16 a = GPR (OP[0]);
4547 trace_input ("lshd", OP_REG, OP_REGP, OP_VOID);
4548 if (a & ((long)1 << 5))
4549 {
4550 sign_flag = 1;
4551 a = ~(a) + 1;
4552 }
4553 a = (unsigned int) (a & 0x1f);
4554 /* A positive count specifies a shift to the left;
4555 * A negative count specifies a shift to the right. */
4556 if (sign_flag)
4557 tmp = b >> a;
4558 else
4559 tmp = b << a;
4560
4561 sign_flag = 0; /* Reset sign flag. */
4562
4563 SET_GPR32 (OP[1], tmp);
4564 trace_output_32 (tmp);
4565 }
4566
4567 /* ashub. */
4568 void
4569 OP_80_9 ()
4570 {
4571 uint16 a = OP[0];
4572 int8 tmp, b = (GPR (OP[1])) & 0xFF;
4573 trace_input ("ashub", OP_CONSTANT4, OP_REG, OP_VOID);
4574 /* A positive count specifies a shift to the left;
4575 * A negative count specifies a shift to the right. */
4576 if (sign_flag)
4577 tmp = b >> a;
4578 else
4579 tmp = b << a;
4580
4581 sign_flag = 0; /* Reset sign flag. */
4582
4583 SET_GPR (OP[1], ((tmp & 0xFF) | ((GPR (OP[1])) & 0xff00)));
4584 trace_output_16 (tmp);
4585 }
4586
4587 /* ashub. */
4588 void
4589 OP_81_9 ()
4590 {
4591 uint16 a = OP[0];
4592 int8 tmp, b = (GPR (OP[1])) & 0xFF;
4593 trace_input ("ashub", OP_CONSTANT4, OP_REG, OP_VOID);
4594 /* A positive count specifies a shift to the left;
4595 * A negative count specifies a shift to the right. */
4596 if (sign_flag)
4597 tmp = b >> a;
4598 else
4599 tmp = b << a;
4600
4601 sign_flag = 0; /* Reset sign flag. */
4602
4603 SET_GPR (OP[1], ((tmp & 0xFF) | ((GPR (OP[1])) & 0xFF00)));
4604 trace_output_16 (tmp);
4605 }
4606
4607
4608 /* ashub. */
4609 void
4610 OP_41_8 ()
4611 {
4612 int16 a = (GPR (OP[0]));
4613 int8 tmp, b = (GPR (OP[1])) & 0xFF;
4614 trace_input ("ashub", OP_REG, OP_REG, OP_VOID);
4615
4616 if (a & ((long)1 << 3))
4617 {
4618 sign_flag = 1;
4619 a = ~(a) + 1;
4620 }
4621 a = (unsigned int) (a & 0x7);
4622
4623 /* A positive count specifies a shift to the left;
4624 * A negative count specifies a shift to the right. */
4625 if (sign_flag)
4626 tmp = b >> a;
4627 else
4628 tmp = b << a;
4629
4630 sign_flag = 0; /* Reset sign flag. */
4631
4632 SET_GPR (OP[1], ((tmp & 0xFF) | ((GPR (OP[1])) & 0xFF00)));
4633 trace_output_16 (tmp);
4634 }
4635
4636
4637 /* ashuw. */
4638 void
4639 OP_42_8 ()
4640 {
4641 int16 tmp, b = GPR (OP[1]);
4642 uint16 a = OP[0];
4643 trace_input ("ashuw", OP_CONSTANT5, OP_REG, OP_VOID);
4644 /* A positive count specifies a shift to the left;
4645 * A negative count specifies a shift to the right. */
4646 if (sign_flag)
4647 tmp = b >> a;
4648 else
4649 tmp = b << a;
4650
4651 sign_flag = 0; /* Reset sign flag. */
4652
4653 SET_GPR (OP[1], (tmp & 0xffff));
4654 trace_output_16 (tmp);
4655 }
4656
4657 /* ashuw. */
4658 void
4659 OP_43_8 ()
4660 {
4661 int16 tmp, b = GPR (OP[1]);
4662 uint16 a = OP[0];
4663 trace_input ("ashuw", OP_CONSTANT5, OP_REG, OP_VOID);
4664 /* A positive count specifies a shift to the left;
4665 * A negative count specifies a shift to the right. */
4666 if (sign_flag)
4667 tmp = b >> a;
4668 else
4669 tmp = b << a;
4670
4671 sign_flag = 0; /* Reset sign flag. */
4672 SET_GPR (OP[1], (tmp & 0xffff));
4673 trace_output_16 (tmp);
4674 }
4675
4676 /* ashuw. */
4677 void
4678 OP_45_8 ()
4679 {
4680 int16 tmp;
4681 int16 a = GPR (OP[0]), b = GPR (OP[1]);
4682 trace_input ("ashuw", OP_REG, OP_REG, OP_VOID);
4683
4684 if (a & ((long)1 << 4))
4685 {
4686 sign_flag = 1;
4687 a = ~(a) + 1;
4688 }
4689 a = (unsigned int) (a & 0xf);
4690 /* A positive count specifies a shift to the left;
4691 * A negative count specifies a shift to the right. */
4692
4693 if (sign_flag)
4694 tmp = b >> a;
4695 else
4696 tmp = b << a;
4697
4698 sign_flag = 0; /* Reset sign flag. */
4699 SET_GPR (OP[1], (tmp & 0xffff));
4700 trace_output_16 (tmp);
4701 }
4702
4703 /* ashud. */
4704 void
4705 OP_26_7 ()
4706 {
4707 int32 tmp,b = GPR32 (OP[1]);
4708 uint32 a = OP[0];
4709 trace_input ("ashud", OP_CONSTANT6, OP_REGP, OP_VOID);
4710 /* A positive count specifies a shift to the left;
4711 * A negative count specifies a shift to the right. */
4712 if (sign_flag)
4713 tmp = b >> a;
4714 else
4715 tmp = b << a;
4716
4717 sign_flag = 0; /* Reset sign flag. */
4718 SET_GPR32 (OP[1], tmp);
4719 trace_output_32 (tmp);
4720 }
4721
4722 /* ashud. */
4723 void
4724 OP_27_7 ()
4725 {
4726 int32 tmp;
4727 int32 a = OP[0], b = GPR32 (OP[1]);
4728 trace_input ("ashud", OP_CONSTANT6, OP_REGP, OP_VOID);
4729 /* A positive count specifies a shift to the left;
4730 * A negative count specifies a shift to the right. */
4731 if (sign_flag)
4732 tmp = b >> a;
4733 else
4734 tmp = b << a;
4735
4736 sign_flag = 0; /* Reset sign flag. */
4737 SET_GPR32 (OP[1], tmp);
4738 trace_output_32 (tmp);
4739 }
4740
4741 /* ashud. */
4742 void
4743 OP_48_8 ()
4744 {
4745 int32 tmp;
4746 int32 a = GPR32 (OP[0]), b = GPR32 (OP[1]);
4747 trace_input ("ashud", OP_REGP, OP_REGP, OP_VOID);
4748
4749 if (a & ((long)1 << 5))
4750 {
4751 sign_flag = 1;
4752 a = ~(a) + 1;
4753 }
4754 a = (unsigned int) (a & 0x1f);
4755 /* A positive count specifies a shift to the left;
4756 * A negative count specifies a shift to the right. */
4757 if (sign_flag)
4758 tmp = b >> a;
4759 else
4760 tmp = b << a;
4761
4762 sign_flag = 0; /* Reset sign flag. */
4763 SET_GPR32 (OP[1], tmp);
4764 trace_output_32 (tmp);
4765 }
4766
4767
4768 /* storm. */
4769 void
4770 OP_16_D ()
4771 {
4772 uint32 addr = GPR (1);
4773 uint16 count = OP[0], reg = 2;
4774 trace_input ("storm", OP_CONSTANT4, OP_VOID, OP_VOID);
4775 if ((addr & 1))
4776 {
4777 State.exception = SIG_CR16_BUS;
4778 State.pc_changed = 1; /* Don't increment the PC. */
4779 trace_output_void ();
4780 return;
4781 }
4782
4783 while (count)
4784 {
4785 SW (addr, (GPR (reg)));
4786 addr +=2;
4787 --count;
4788 reg++;
4789 if (reg == 6) reg = 8;
4790 };
4791
4792 SET_GPR (1, addr);
4793
4794 trace_output_void ();
4795 }
4796
4797
4798 /* stormp. */
4799 void
4800 OP_17_D ()
4801 {
4802 uint32 addr = GPR32 (6);
4803 uint16 count = OP[0], reg = 2;
4804 trace_input ("stormp", OP_CONSTANT4, OP_VOID, OP_VOID);
4805 if ((addr & 1))
4806 {
4807 State.exception = SIG_CR16_BUS;
4808 State.pc_changed = 1; /* Don't increment the PC. */
4809 trace_output_void ();
4810 return;
4811 }
4812
4813 while (count)
4814 {
4815 SW (addr, (GPR (reg)));
4816 addr +=2;
4817 --count;
4818 reg++;
4819 if (reg == 6) reg = 8;
4820 };
4821
4822 SET_GPR32 (6, addr);
4823 trace_output_void ();
4824 }
4825
4826 /* subb. */
4827 void
4828 OP_38_8 ()
4829 {
4830 uint8 a = OP[0];
4831 uint8 b = (GPR (OP[1])) & 0xff;
4832 uint16 tmp = (~a + 1 + b) & 0xff;
4833 trace_input ("subb", OP_CONSTANT4, OP_REG, OP_VOID);
4834 /* see ../common/sim-alu.h for a more extensive discussion on how to
4835 compute the carry/overflow bits. */
4836 SET_PSR_C (tmp > 0xff);
4837 SET_PSR_F (((a & 0x80) != (b & 0x80)) && ((b & 0x80) != (tmp & 0x80)));
4838 SET_GPR (OP[1], (tmp | ((GPR (OP[1])) & 0xff00)));
4839 trace_output_16 (tmp);
4840 }
4841
4842 /* subb. */
4843 void
4844 OP_38B_C ()
4845 {
4846 uint8 a = OP[0] & 0xFF;
4847 uint8 b = (GPR (OP[1])) & 0xFF;
4848 uint16 tmp = (~a + 1 + b) & 0xFF;
4849 trace_input ("subb", OP_CONSTANT16, OP_REG, OP_VOID);
4850 /* see ../common/sim-alu.h for a more extensive discussion on how to
4851 compute the carry/overflow bits. */
4852 SET_PSR_C (tmp > 0xff);
4853 SET_PSR_F (((a & 0x80) != (b & 0x80)) && ((b & 0x80) != (tmp & 0x80)));
4854 SET_GPR (OP[1], (tmp | ((GPR (OP[1])) & 0xff00)));
4855 trace_output_16 (tmp);
4856 }
4857
4858 /* subb. */
4859 void
4860 OP_39_8 ()
4861 {
4862 uint8 a = (GPR (OP[0])) & 0xFF;
4863 uint8 b = (GPR (OP[1])) & 0xFF;
4864 uint16 tmp = (~a + 1 + b) & 0xff;
4865 trace_input ("subb", OP_REG, OP_REG, OP_VOID);
4866 /* see ../common/sim-alu.h for a more extensive discussion on how to
4867 compute the carry/overflow bits. */
4868 SET_PSR_C (tmp > 0xff);
4869 SET_PSR_F (((a & 0x80) != (b & 0x80)) && ((b & 0x80) != (tmp & 0x80)));
4870 SET_GPR (OP[1], (tmp | ((GPR (OP[1])) & 0xff00)));
4871 trace_output_16 (tmp);
4872 }
4873
4874 /* subw. */
4875 void
4876 OP_3A_8 ()
4877 {
4878 uint16 a = OP[0];
4879 uint16 b = GPR (OP[1]);
4880 uint16 tmp = (~a + 1 + b);
4881 trace_input ("subw", OP_CONSTANT4, OP_REG, OP_VOID);
4882 /* see ../common/sim-alu.h for a more extensive discussion on how to
4883 compute the carry/overflow bits. */
4884 SET_PSR_C (tmp > 0xffff);
4885 SET_PSR_F (((a & 0x8000) != (b & 0x8000)) && ((b & 0x8000) != (tmp & 0x8000)));
4886 SET_GPR (OP[1], tmp);
4887 trace_output_16 (tmp);
4888 }
4889
4890 /* subw. */
4891 void
4892 OP_3AB_C ()
4893 {
4894 uint16 a = OP[0];
4895 uint16 b = GPR (OP[1]);
4896 uint32 tmp = (~a + 1 + b);
4897 trace_input ("subw", OP_CONSTANT16, OP_REG, OP_VOID);
4898 /* see ../common/sim-alu.h for a more extensive discussion on how to
4899 compute the carry/overflow bits. */
4900 SET_PSR_C (tmp > 0xffff);
4901 SET_PSR_F (((a & 0x8000) != (b & 0x8000)) && ((b & 0x8000) != (tmp & 0x8000)));
4902 SET_GPR (OP[1], tmp & 0xffff);
4903 trace_output_16 (tmp);
4904 }
4905
4906 /* subw. */
4907 void
4908 OP_3B_8 ()
4909 {
4910 uint16 a = GPR (OP[0]);
4911 uint16 b = GPR (OP[1]);
4912 uint32 tmp = (~a + 1 + b);
4913 trace_input ("subw", OP_REG, OP_REG, OP_VOID);
4914 /* see ../common/sim-alu.h for a more extensive discussion on how to
4915 compute the carry/overflow bits. */
4916 SET_PSR_C (tmp > 0xffff);
4917 SET_PSR_F (((a & 0x8000) != (b & 0x8000)) && ((b & 0x8000) != (tmp & 0x8000)));
4918 SET_GPR (OP[1], tmp & 0xffff);
4919 trace_output_16 (tmp);
4920 }
4921
4922 /* subcb. */
4923 void
4924 OP_3C_8 ()
4925 {
4926 uint8 a = OP[0];
4927 uint8 b = (GPR (OP[1])) & 0xff;
4928 //uint16 tmp1 = a + 1;
4929 uint16 tmp1 = a + (PSR_C);
4930 uint16 tmp = (~tmp1 + 1 + b);
4931 trace_input ("subcb", OP_CONSTANT4, OP_REG, OP_VOID);
4932 /* see ../common/sim-alu.h for a more extensive discussion on how to
4933 compute the carry/overflow bits. */
4934 SET_PSR_C (tmp > 0xff);
4935 SET_PSR_F (((a & 0x80) != (b & 0x80)) && ((b & 0x80) != (tmp & 0x80)));
4936 SET_GPR (OP[1], tmp);
4937 trace_output_16 (tmp);
4938 }
4939
4940 /* subcb. */
4941 void
4942 OP_3CB_C ()
4943 {
4944 uint16 a = OP[0];
4945 uint16 b = (GPR (OP[1])) & 0xff;
4946 //uint16 tmp1 = a + 1;
4947 uint16 tmp1 = a + (PSR_C);
4948 uint16 tmp = (~tmp1 + 1 + b);
4949 trace_input ("subcb", OP_CONSTANT16, OP_REG, OP_VOID);
4950 /* see ../common/sim-alu.h for a more extensive discussion on how to
4951 compute the carry/overflow bits. */
4952 SET_PSR_C (tmp > 0xff);
4953 SET_PSR_F (((a & 0x80) != (b & 0x80)) && ((b & 0x80) != (tmp & 0x80)));
4954 SET_GPR (OP[1], tmp);
4955 trace_output_16 (tmp);
4956 }
4957
4958 /* subcb. */
4959 void
4960 OP_3D_8 ()
4961 {
4962 uint16 a = (GPR (OP[0])) & 0xff;
4963 uint16 b = (GPR (OP[1])) & 0xff;
4964 uint16 tmp1 = a + (PSR_C);
4965 uint16 tmp = (~tmp1 + 1 + b);
4966 trace_input ("subcb", OP_REG, OP_REG, OP_VOID);
4967 /* see ../common/sim-alu.h for a more extensive discussion on how to
4968 compute the carry/overflow bits. */
4969 SET_PSR_C (tmp > 0xff);
4970 SET_PSR_F (((a & 0x80) != (b & 0x80)) && ((b & 0x80) != (tmp & 0x80)));
4971 SET_GPR (OP[1], tmp);
4972 trace_output_16 (tmp);
4973 }
4974
4975 /* subcw. */
4976 void
4977 OP_3E_8 ()
4978 {
4979 uint16 a = OP[0], b = (GPR (OP[1]));
4980 uint16 tmp1 = a + (PSR_C);
4981 uint16 tmp = (~tmp1 + 1 + b);
4982 trace_input ("subcw", OP_CONSTANT4, OP_REG, OP_VOID);
4983 /* see ../common/sim-alu.h for a more extensive discussion on how to
4984 compute the carry/overflow bits. */
4985 SET_PSR_C (tmp > 0xffff);
4986 SET_PSR_F (((a & 0x8000) != (b & 0x8000)) && ((b & 0x8000) != (tmp & 0x8000)));
4987 SET_GPR (OP[1], tmp);
4988 trace_output_16 (tmp);
4989 }
4990
4991 /* subcw. */
4992 void
4993 OP_3EB_C ()
4994 {
4995 int16 a = OP[0];
4996 uint16 b = GPR (OP[1]);
4997 uint16 tmp1 = a + (PSR_C);
4998 uint16 tmp = (~tmp1 + 1 + b);
4999 trace_input ("subcw", OP_CONSTANT16, OP_REG, OP_VOID);
5000 /* see ../common/sim-alu.h for a more extensive discussion on how to
5001 compute the carry/overflow bits. */
5002 SET_PSR_C (tmp > 0xffff);
5003 SET_PSR_F (((a & 0x8000) != (b & 0x8000)) && ((b & 0x8000) != (tmp & 0x8000)));
5004 SET_GPR (OP[1], tmp);
5005 trace_output_16 (tmp);
5006 }
5007
5008 /* subcw. */
5009 void
5010 OP_3F_8 ()
5011 {
5012 uint16 a = (GPR (OP[0])), b = (GPR (OP[1]));
5013 uint16 tmp1 = a + (PSR_C);
5014 uint16 tmp = (~tmp1 + 1 + b);
5015 trace_input ("subcw", OP_REG, OP_REG, OP_VOID);
5016 /* see ../common/sim-alu.h for a more extensive discussion on how to
5017 compute the carry/overflow bits. */
5018 SET_PSR_C (tmp > 0xffff);
5019 SET_PSR_F (((a & 0x8000) != (b & 0x8000)) && ((b & 0x8000) != (tmp & 0x8000)));
5020 SET_GPR (OP[1], tmp);
5021 trace_output_16 (tmp);
5022 }
5023
5024 /* subd. */
5025 void
5026 OP_3_C ()
5027 {
5028 int32 a = OP[0];
5029 uint32 b = GPR32 (OP[1]);
5030 uint32 tmp = (~a + 1 + b);
5031 trace_input ("subd", OP_CONSTANT32, OP_REGP, OP_VOID);
5032 /* see ../common/sim-alu.h for a more extensive discussion on how to
5033 compute the carry/overflow bits. */
5034 SET_PSR_C (tmp > 0xffffffff);
5035 SET_PSR_F (((a & 0x80000000) != (b & 0x80000000)) &&
5036 ((b & 0x80000000) != (tmp & 0x80000000)));
5037 SET_GPR32 (OP[1], tmp);
5038 trace_output_32 (tmp);
5039 }
5040
5041 /* subd. */
5042 void
5043 OP_14C_14 ()
5044 {
5045 uint32 a = GPR32 (OP[0]);
5046 uint32 b = GPR32 (OP[1]);
5047 uint32 tmp = (~a + 1 + b);
5048 trace_input ("subd", OP_REGP, OP_REGP, OP_VOID);
5049 /* see ../common/sim-alu.h for a more extensive discussion on how to
5050 compute the carry/overflow bits. */
5051 SET_PSR_C (tmp > 0xffffffff);
5052 SET_PSR_F (((a & 0x80000000) != (b & 0x80000000)) &&
5053 ((b & 0x80000000) != (tmp & 0x80000000)));
5054 SET_GPR32 (OP[1], tmp);
5055 trace_output_32 (tmp);
5056 }
5057
5058 /* excp. */
5059 void
5060 OP_C_C ()
5061 {
5062 uint32 tmp;
5063 uint16 a;
5064 trace_input ("excp", OP_CONSTANT4, OP_VOID, OP_VOID);
5065 switch (OP[0])
5066 {
5067 default:
5068 #if (DEBUG & DEBUG_TRAP) == 0
5069 {
5070 #if 0
5071 uint16 vec = OP[0] + TRAP_VECTOR_START;
5072 SET_BPC (PC + 1);
5073 SET_BPSR (PSR);
5074 SET_PSR (PSR & PSR_SM_BIT);
5075 JMP (vec);
5076 break;
5077 #endif
5078 }
5079 #else /* if debugging use trap to print registers */
5080 {
5081 int i;
5082 static int first_time = 1;
5083
5084 if (first_time)
5085 {
5086 first_time = 0;
5087 (*cr16_callback->printf_filtered) (cr16_callback, "Trap # PC ");
5088 for (i = 0; i < 16; i++)
5089 (*cr16_callback->printf_filtered) (cr16_callback, " %sr%d", (i > 9) ? "" : " ", i);
5090 (*cr16_callback->printf_filtered) (cr16_callback, " a0 a1 f0 f1 c\n");
5091 }
5092
5093 (*cr16_callback->printf_filtered) (cr16_callback, "Trap %2d 0x%.4x:", (int)OP[0], (int)PC);
5094
5095 for (i = 0; i < 16; i++)
5096 (*cr16_callback->printf_filtered) (cr16_callback, " %.4x", (int) GPR (i));
5097
5098 for (i = 0; i < 2; i++)
5099 (*cr16_callback->printf_filtered) (cr16_callback, " %.2x%.8lx",
5100 ((int)(ACC (i) >> 32) & 0xff),
5101 ((unsigned long) ACC (i)) & 0xffffffff);
5102
5103 (*cr16_callback->printf_filtered) (cr16_callback, " %d %d %d\n",
5104 PSR_F != 0, PSR_F != 0, PSR_C != 0);
5105 (*cr16_callback->flush_stdout) (cr16_callback);
5106 break;
5107 }
5108 #endif
5109 case 8: /* new system call trap */
5110 /* Trap 8 is used for simulating low-level I/O */
5111 {
5112 unsigned32 result = 0;
5113 errno = 0;
5114
5115 /* Registers passed to trap 0. */
5116
5117 #define FUNC GPR (0) /* function number. */
5118 #define PARM1 GPR (2) /* optional parm 1. */
5119 #define PARM2 GPR (3) /* optional parm 2. */
5120 #define PARM3 GPR (4) /* optional parm 3. */
5121 #define PARM4 GPR (5) /* optional parm 4. */
5122
5123 /* Registers set by trap 0 */
5124
5125 #define RETVAL(X) do { result = (0xffff & (X));SET_GPR (0, result);} while (0)
5126 #define RETVAL32(X) do { result = (X); SET_GPR32 (0, result);} while (0)
5127 #define RETERR(X) SET_GPR (4, (X)) /* return error code. */
5128
5129 /* Turn a pointer in a register into a pointer into real memory. */
5130
5131 #define MEMPTR(x) ((char *)(dmem_addr(x)))
5132
5133 switch (FUNC)
5134 {
5135 #if !defined(__GO32__) && !defined(_WIN32)
5136 #ifdef TARGET_SYS_fork
5137 case TARGET_SYS_fork:
5138 trace_input ("<fork>", OP_VOID, OP_VOID, OP_VOID);
5139 RETVAL (fork ());
5140 trace_output_16 (result);
5141 break;
5142 #endif
5143
5144 #define getpid() 47
5145 case TARGET_SYS_getpid:
5146 trace_input ("<getpid>", OP_VOID, OP_VOID, OP_VOID);
5147 RETVAL (getpid ());
5148 trace_output_16 (result);
5149 break;
5150
5151 case TARGET_SYS_kill:
5152 trace_input ("<kill>", OP_REG, OP_REG, OP_VOID);
5153 if (PARM1 == getpid ())
5154 {
5155 trace_output_void ();
5156 State.exception = PARM2;
5157 }
5158 else
5159 {
5160 int os_sig = -1;
5161 switch (PARM2)
5162 {
5163 #ifdef SIGHUP
5164 case 1: os_sig = SIGHUP; break;
5165 #endif
5166 #ifdef SIGINT
5167 case 2: os_sig = SIGINT; break;
5168 #endif
5169 #ifdef SIGQUIT
5170 case 3: os_sig = SIGQUIT; break;
5171 #endif
5172 #ifdef SIGILL
5173 case 4: os_sig = SIGILL; break;
5174 #endif
5175 #ifdef SIGTRAP
5176 case 5: os_sig = SIGTRAP; break;
5177 #endif
5178 #ifdef SIGABRT
5179 case 6: os_sig = SIGABRT; break;
5180 #elif defined(SIGIOT)
5181 case 6: os_sig = SIGIOT; break;
5182 #endif
5183 #ifdef SIGEMT
5184 case 7: os_sig = SIGEMT; break;
5185 #endif
5186 #ifdef SIGFPE
5187 case 8: os_sig = SIGFPE; break;
5188 #endif
5189 #ifdef SIGKILL
5190 case 9: os_sig = SIGKILL; break;
5191 #endif
5192 #ifdef SIGBUS
5193 case 10: os_sig = SIGBUS; break;
5194 #endif
5195 #ifdef SIGSEGV
5196 case 11: os_sig = SIGSEGV; break;
5197 #endif
5198 #ifdef SIGSYS
5199 case 12: os_sig = SIGSYS; break;
5200 #endif
5201 #ifdef SIGPIPE
5202 case 13: os_sig = SIGPIPE; break;
5203 #endif
5204 #ifdef SIGALRM
5205 case 14: os_sig = SIGALRM; break;
5206 #endif
5207 #ifdef SIGTERM
5208 case 15: os_sig = SIGTERM; break;
5209 #endif
5210 #ifdef SIGURG
5211 case 16: os_sig = SIGURG; break;
5212 #endif
5213 #ifdef SIGSTOP
5214 case 17: os_sig = SIGSTOP; break;
5215 #endif
5216 #ifdef SIGTSTP
5217 case 18: os_sig = SIGTSTP; break;
5218 #endif
5219 #ifdef SIGCONT
5220 case 19: os_sig = SIGCONT; break;
5221 #endif
5222 #ifdef SIGCHLD
5223 case 20: os_sig = SIGCHLD; break;
5224 #elif defined(SIGCLD)
5225 case 20: os_sig = SIGCLD; break;
5226 #endif
5227 #ifdef SIGTTIN
5228 case 21: os_sig = SIGTTIN; break;
5229 #endif
5230 #ifdef SIGTTOU
5231 case 22: os_sig = SIGTTOU; break;
5232 #endif
5233 #ifdef SIGIO
5234 case 23: os_sig = SIGIO; break;
5235 #elif defined (SIGPOLL)
5236 case 23: os_sig = SIGPOLL; break;
5237 #endif
5238 #ifdef SIGXCPU
5239 case 24: os_sig = SIGXCPU; break;
5240 #endif
5241 #ifdef SIGXFSZ
5242 case 25: os_sig = SIGXFSZ; break;
5243 #endif
5244 #ifdef SIGVTALRM
5245 case 26: os_sig = SIGVTALRM; break;
5246 #endif
5247 #ifdef SIGPROF
5248 case 27: os_sig = SIGPROF; break;
5249 #endif
5250 #ifdef SIGWINCH
5251 case 28: os_sig = SIGWINCH; break;
5252 #endif
5253 #ifdef SIGLOST
5254 case 29: os_sig = SIGLOST; break;
5255 #endif
5256 #ifdef SIGUSR1
5257 case 30: os_sig = SIGUSR1; break;
5258 #endif
5259 #ifdef SIGUSR2
5260 case 31: os_sig = SIGUSR2; break;
5261 #endif
5262 }
5263
5264 if (os_sig == -1)
5265 {
5266 trace_output_void ();
5267 (*cr16_callback->printf_filtered) (cr16_callback, "Unknown signal %d\n", PARM2);
5268 (*cr16_callback->flush_stdout) (cr16_callback);
5269 State.exception = SIGILL;
5270 }
5271 else
5272 {
5273 RETVAL (kill (PARM1, PARM2));
5274 trace_output_16 (result);
5275 }
5276 }
5277 break;
5278
5279 #ifdef TARGET_SYS_execve
5280 case TARGET_SYS_execve:
5281 trace_input ("<execve>", OP_VOID, OP_VOID, OP_VOID);
5282 RETVAL (execve (MEMPTR (PARM1), (char **) MEMPTR (PARM2<<16|PARM3),
5283 (char **)MEMPTR (PARM4)));
5284 trace_output_16 (result);
5285 break;
5286 #endif
5287
5288 #ifdef TARGET_SYS_execv
5289 case TARGET_SYS_execv:
5290 trace_input ("<execv>", OP_VOID, OP_VOID, OP_VOID);
5291 RETVAL (execve (MEMPTR (PARM1), (char **) MEMPTR (PARM2), NULL));
5292 trace_output_16 (result);
5293 break;
5294 #endif
5295
5296 #ifdef TARGET_SYS_pipe
5297 case TARGET_SYS_pipe:
5298 {
5299 reg_t buf;
5300 int host_fd[2];
5301
5302 trace_input ("<pipe>", OP_VOID, OP_VOID, OP_VOID);
5303 buf = PARM1;
5304 RETVAL (pipe (host_fd));
5305 SW (buf, host_fd[0]);
5306 buf += sizeof(uint16);
5307 SW (buf, host_fd[1]);
5308 trace_output_16 (result);
5309 }
5310 break;
5311 #endif
5312
5313 #ifdef TARGET_SYS_wait
5314 case TARGET_SYS_wait:
5315 {
5316 int status;
5317 trace_input ("<wait>", OP_REG, OP_VOID, OP_VOID);
5318 RETVAL (wait (&status));
5319 if (PARM1)
5320 SW (PARM1, status);
5321 trace_output_16 (result);
5322 }
5323 break;
5324 #endif
5325 #else
5326 case TARGET_SYS_getpid:
5327 trace_input ("<getpid>", OP_VOID, OP_VOID, OP_VOID);
5328 RETVAL (1);
5329 trace_output_16 (result);
5330 break;
5331
5332 case TARGET_SYS_kill:
5333 trace_input ("<kill>", OP_REG, OP_REG, OP_VOID);
5334 trace_output_void ();
5335 State.exception = PARM2;
5336 break;
5337 #endif
5338
5339 case TARGET_SYS_read:
5340 trace_input ("<read>", OP_REG, OP_MEMREF, OP_REG);
5341 RETVAL (cr16_callback->read (cr16_callback, PARM1,
5342 MEMPTR (((unsigned long)PARM3 << 16)
5343 |((unsigned long)PARM2)), PARM4));
5344 trace_output_16 (result);
5345 break;
5346
5347 case TARGET_SYS_write:
5348 trace_input ("<write>", OP_REG, OP_MEMREF, OP_REG);
5349 RETVAL ((int)cr16_callback->write (cr16_callback, PARM1,
5350 MEMPTR (((unsigned long)PARM3 << 16) | PARM2), PARM4));
5351 trace_output_16 (result);
5352 break;
5353
5354 case TARGET_SYS_lseek:
5355 trace_input ("<lseek>", OP_REG, OP_REGP, OP_REG);
5356 RETVAL32 (cr16_callback->lseek (cr16_callback, PARM1,
5357 ((((long) PARM3) << 16) | PARM2),
5358 PARM4));
5359 trace_output_32 (result);
5360 break;
5361
5362 case TARGET_SYS_close:
5363 trace_input ("<close>", OP_REG, OP_VOID, OP_VOID);
5364 RETVAL (cr16_callback->close (cr16_callback, PARM1));
5365 trace_output_16 (result);
5366 break;
5367
5368 case TARGET_SYS_open:
5369 trace_input ("<open>", OP_MEMREF, OP_REG, OP_VOID);
5370 RETVAL32 (cr16_callback->open (cr16_callback,
5371 MEMPTR ((((unsigned long)PARM2)<<16)|PARM1),
5372 PARM3));
5373 trace_output_32 (result);
5374 break;
5375
5376 #ifdef TARGET_SYS_rename
5377 case TARGET_SYS_rename:
5378 trace_input ("<rename>", OP_MEMREF, OP_MEMREF, OP_VOID);
5379 RETVAL (cr16_callback->rename (cr16_callback,
5380 MEMPTR ((((unsigned long)PARM2)<<16) |PARM1),
5381 MEMPTR ((((unsigned long)PARM4)<<16) |PARM3)));
5382 trace_output_16 (result);
5383 break;
5384 #endif
5385
5386 case 0x408: /* REVISIT: Added a dummy getenv call. */
5387 trace_input ("<getenv>", OP_MEMREF, OP_MEMREF, OP_VOID);
5388 RETVAL32(NULL);
5389 trace_output_32 (result);
5390 break;
5391
5392 case TARGET_SYS_exit:
5393 trace_input ("<exit>", OP_VOID, OP_VOID, OP_VOID);
5394 State.exception = SIG_CR16_EXIT;
5395 trace_output_void ();
5396 break;
5397
5398 case TARGET_SYS_unlink:
5399 trace_input ("<unlink>", OP_MEMREF, OP_VOID, OP_VOID);
5400 RETVAL (cr16_callback->unlink (cr16_callback,
5401 MEMPTR (((unsigned long)PARM2<<16)|PARM1)));
5402 trace_output_16 (result);
5403 break;
5404
5405
5406 #ifdef TARGET_SYS_stat
5407 case TARGET_SYS_stat:
5408 trace_input ("<stat>", OP_VOID, OP_VOID, OP_VOID);
5409 /* stat system call. */
5410 {
5411 struct stat host_stat;
5412 reg_t buf;
5413
5414 RETVAL (stat (MEMPTR ((((unsigned long)PARM2) << 16)|PARM1), &host_stat));
5415
5416 buf = PARM2;
5417
5418 /* The hard-coded offsets and sizes were determined by using
5419 * the CR16 compiler on a test program that used struct stat.
5420 */
5421 SW (buf, host_stat.st_dev);
5422 SW (buf+2, host_stat.st_ino);
5423 SW (buf+4, host_stat.st_mode);
5424 SW (buf+6, host_stat.st_nlink);
5425 SW (buf+8, host_stat.st_uid);
5426 SW (buf+10, host_stat.st_gid);
5427 SW (buf+12, host_stat.st_rdev);
5428 SLW (buf+16, host_stat.st_size);
5429 SLW (buf+20, host_stat.st_atime);
5430 SLW (buf+28, host_stat.st_mtime);
5431 SLW (buf+36, host_stat.st_ctime);
5432 }
5433 trace_output_16 (result);
5434 break;
5435 #endif
5436
5437 #ifdef TARGET_SYS_chown
5438 case TARGET_SYS_chown:
5439 trace_input ("<chown>", OP_VOID, OP_VOID, OP_VOID);
5440 RETVAL (chown (MEMPTR (PARM1), PARM2, PARM3));
5441 trace_output_16 (result);
5442 break;
5443 #endif
5444
5445 case TARGET_SYS_chmod:
5446 trace_input ("<chmod>", OP_VOID, OP_VOID, OP_VOID);
5447 RETVAL (chmod (MEMPTR (PARM1), PARM2));
5448 trace_output_16 (result);
5449 break;
5450
5451 #ifdef TARGET_SYS_utime
5452 case TARGET_SYS_utime:
5453 trace_input ("<utime>", OP_REG, OP_REG, OP_REG);
5454 /* Cast the second argument to void *, to avoid type mismatch
5455 if a prototype is present. */
5456 RETVAL (utime (MEMPTR (PARM1), (void *) MEMPTR (PARM2)));
5457 trace_output_16 (result);
5458 break;
5459 #endif
5460
5461 #ifdef TARGET_SYS_time
5462 case TARGET_SYS_time:
5463 trace_input ("<time>", OP_VOID, OP_VOID, OP_REG);
5464 RETVAL32 (time (NULL));
5465 trace_output_32 (result);
5466 break;
5467 #endif
5468
5469 default:
5470 a = OP[0];
5471 switch (a)
5472 {
5473 case TRAP_BREAKPOINT:
5474 State.exception = SIGTRAP;
5475 tmp = (PC);
5476 JMP(tmp);
5477 trace_output_void ();
5478 break;
5479 case SIGTRAP: /* supervisor call ? */
5480 State.exception = SIG_CR16_EXIT;
5481 trace_output_void ();
5482 break;
5483 default:
5484 cr16_callback->error (cr16_callback, "Unknown syscall %d", FUNC);
5485 break;
5486 }
5487 }
5488 if ((uint16) result == (uint16) -1)
5489 RETERR (cr16_callback->get_errno(cr16_callback));
5490 else
5491 RETERR (0);
5492 break;
5493 }
5494 }
5495 }
5496
5497
5498 /* push. */
5499 void
5500 OP_3_9 ()
5501 {
5502 uint16 a = OP[0] + 1, b = OP[1], c = OP[2], i = 0;
5503 uint32 tmp, sp_addr = (GPR32 (15)) - (a * 2) - 4, is_regp = 0;
5504 trace_input ("push", OP_CONSTANT3, OP_REG, OP_REG);
5505
5506 for (; i < a; ++i)
5507 {
5508 if ((b+i) <= 11)
5509 {
5510 SW (sp_addr, (GPR (b+i)));
5511 sp_addr +=2;
5512 }
5513 else
5514 {
5515 if (is_regp == 0)
5516 tmp = (GPR32 (b+i));
5517 else
5518 tmp = (GPR32 (b+i-1));
5519
5520 if ((a-i) > 1)
5521 {
5522 SLW (sp_addr, tmp);
5523 sp_addr +=4;
5524 }
5525 else
5526 {
5527 SW (sp_addr, tmp);
5528 sp_addr +=2;
5529 }
5530 ++i;
5531 is_regp = 1;
5532 }
5533 }
5534
5535 sp_addr +=4;
5536
5537 /* Store RA address. */
5538 tmp = (GPR32 (14));
5539 SLW(sp_addr,tmp);
5540
5541 sp_addr = (GPR32 (15)) - (a * 2) - 4;
5542 SET_GPR32 (15, sp_addr); /* Update SP address. */
5543
5544 trace_output_void ();
5545 }
5546
5547 /* push. */
5548 void
5549 OP_1_8 ()
5550 {
5551 uint32 sp_addr, tmp, is_regp = 0;
5552 uint16 a = OP[0] + 1, b = OP[1], c = OP[2], i = 0;
5553 trace_input ("push", OP_CONSTANT3, OP_REG, OP_VOID);
5554
5555 if (c == 1)
5556 sp_addr = (GPR32 (15)) - (a * 2) - 4;
5557 else
5558 sp_addr = (GPR32 (15)) - (a * 2);
5559
5560 for (; i < a; ++i)
5561 {
5562 if ((b+i) <= 11)
5563 {
5564 SW (sp_addr, (GPR (b+i)));
5565 sp_addr +=2;
5566 }
5567 else
5568 {
5569 if (is_regp == 0)
5570 tmp = (GPR32 (b+i));
5571 else
5572 tmp = (GPR32 (b+i-1));
5573
5574 if ((a-i) > 1)
5575 {
5576 SLW (sp_addr, tmp);
5577 sp_addr +=4;
5578 }
5579 else
5580 {
5581 SW (sp_addr, tmp);
5582 sp_addr +=2;
5583 }
5584 ++i;
5585 is_regp = 1;
5586 }
5587 }
5588
5589 if (c == 1)
5590 {
5591 /* Store RA address. */
5592 tmp = (GPR32 (14));
5593 SLW(sp_addr,tmp);
5594 sp_addr = (GPR32 (15)) - (a * 2) - 4;
5595 }
5596 else
5597 sp_addr = (GPR32 (15)) - (a * 2);
5598
5599 SET_GPR32 (15, sp_addr); /* Update SP address. */
5600
5601 trace_output_void ();
5602 }
5603
5604
5605 /* push. */
5606 void
5607 OP_11E_10 ()
5608 {
5609 uint32 sp_addr = (GPR32 (15)), tmp;
5610 trace_input ("push", OP_VOID, OP_VOID, OP_VOID);
5611 tmp = (GPR32 (14));
5612 SLW(sp_addr-4,tmp); /* Store RA address. */
5613 SET_GPR32 (15, (sp_addr - 4)); /* Update SP address. */
5614 trace_output_void ();
5615 }
5616
5617
5618 /* pop. */
5619 void
5620 OP_5_9 ()
5621 {
5622 uint16 a = OP[0] + 1, b = OP[1], c = OP[2], i = 0;
5623 uint32 tmp, sp_addr = (GPR32 (15)), is_regp = 0;;
5624 trace_input ("pop", OP_CONSTANT3, OP_REG, OP_REG);
5625
5626 for (; i < a; ++i)
5627 {
5628 if ((b+i) <= 11)
5629 {
5630 SET_GPR ((b+i), RW(sp_addr));
5631 sp_addr +=2;
5632 }
5633 else
5634 {
5635 if ((a-i) > 1)
5636 {
5637 tmp = RLW(sp_addr);
5638 sp_addr +=4;
5639 }
5640 else
5641 {
5642 tmp = RW(sp_addr);
5643 sp_addr +=2;
5644
5645 if (is_regp == 0)
5646 tmp = (tmp << 16) | (GPR32 (b+i));
5647 else
5648 tmp = (tmp << 16) | (GPR32 (b+i-1));
5649 }
5650
5651 if (is_regp == 0)
5652 SET_GPR32 ((b+i), (((tmp & 0xffff) << 16)
5653 | ((tmp >> 16) & 0xffff)));
5654 else
5655 SET_GPR32 ((b+i-1), (((tmp & 0xffff) << 16)
5656 | ((tmp >> 16) & 0xffff)));
5657
5658 ++i;
5659 is_regp = 1;
5660 }
5661 }
5662
5663 tmp = RLW(sp_addr); /* store RA also. */
5664 SET_GPR32 (14, (((tmp & 0xffff) << 16)| ((tmp >> 16) & 0xffff)));
5665
5666 SET_GPR32 (15, (sp_addr + 4)); /* Update SP address. */
5667
5668 trace_output_void ();
5669 }
5670
5671 /* pop. */
5672 void
5673 OP_2_8 ()
5674 {
5675 uint16 a = OP[0] + 1, b = OP[1], c = OP[2], i = 0;
5676 uint32 tmp, sp_addr = (GPR32 (15)), is_regp = 0;
5677 trace_input ("pop", OP_CONSTANT3, OP_REG, OP_VOID);
5678
5679 for (; i < a; ++i)
5680 {
5681 if ((b+i) <= 11)
5682 {
5683 SET_GPR ((b+i), RW(sp_addr));
5684 sp_addr +=2;
5685 }
5686 else
5687 {
5688 if ((a-i) > 1)
5689 {
5690 tmp = RLW(sp_addr);
5691 sp_addr +=4;
5692 }
5693 else
5694 {
5695 tmp = RW(sp_addr);
5696 sp_addr +=2;
5697
5698 if (is_regp == 0)
5699 tmp = ((tmp << 16) & 0xffffffff) | (GPR32 (b+i));
5700 else
5701 tmp = ((tmp << 16) & 0xffffffff) | (GPR32 (b+i-1));
5702 }
5703
5704 if (is_regp == 0)
5705 SET_GPR32 ((b+i), (((tmp & 0xffff) << 16)| ((tmp >> 16) & 0xffff)));
5706 else
5707 SET_GPR32 ((b+i-1), (((tmp & 0xffff) << 16)| ((tmp >> 16) & 0xffff)));
5708 ++i;
5709 is_regp = 1;
5710 }
5711 }
5712
5713 if (c == 1)
5714 {
5715 tmp = RLW(sp_addr); /* Store RA Reg. */
5716 SET_GPR32 (14, (((tmp & 0xffff) << 16)| ((tmp >> 16) & 0xffff)));
5717 sp_addr +=4;
5718 }
5719
5720 SET_GPR32 (15, sp_addr); /* Update SP address. */
5721
5722 trace_output_void ();
5723 }
5724
5725 /* pop. */
5726 void
5727 OP_21E_10 ()
5728 {
5729 uint32 sp_addr = GPR32 (15);
5730 uint32 tmp;
5731 trace_input ("pop", OP_VOID, OP_VOID, OP_VOID);
5732
5733 tmp = RLW(sp_addr);
5734 SET_GPR32 (14, (((tmp & 0xffff) << 16)| ((tmp >> 16) & 0xffff)));
5735 SET_GPR32 (15, (sp_addr+4)); /* Update SP address. */
5736
5737 trace_output_void ();
5738 }
5739
5740 /* popret. */
5741 void
5742 OP_7_9 ()
5743 {
5744 uint16 a = OP[0], b = OP[1];
5745 trace_input ("popret", OP_CONSTANT3, OP_REG, OP_REG);
5746 OP_5_9 ();
5747 JMP(((GPR32(14)) << 1) & 0xffffff);
5748
5749 trace_output_void ();
5750 }
5751
5752 /* popret. */
5753 void
5754 OP_3_8 ()
5755 {
5756 uint16 a = OP[0], b = OP[1];
5757 trace_input ("popret", OP_CONSTANT3, OP_REG, OP_VOID);
5758 OP_2_8 ();
5759 JMP(((GPR32(14)) << 1) & 0xffffff);
5760
5761 trace_output_void ();
5762 }
5763
5764 /* popret. */
5765 void
5766 OP_31E_10 ()
5767 {
5768 uint32 tmp;
5769 trace_input ("popret", OP_VOID, OP_VOID, OP_VOID);
5770 OP_21E_10 ();
5771 tmp = (((GPR32(14)) << 1) & 0xffffff);
5772 /* If the resulting PC value is less than 0x00_0000 or greater
5773 than 0xFF_FFFF, this instruction causes an IAD trap.*/
5774
5775 if ((tmp < 0x0) || (tmp > 0xFFFFFF))
5776 {
5777 State.exception = SIG_CR16_BUS;
5778 State.pc_changed = 1; /* Don't increment the PC. */
5779 trace_output_void ();
5780 return;
5781 }
5782 else
5783 JMP (tmp);
5784
5785 trace_output_32 (tmp);
5786 }
5787
5788
5789 /* cinv[i]. */
5790 void
5791 OP_A_10 ()
5792 {
5793 trace_input ("cinv[i]", OP_VOID, OP_VOID, OP_VOID);
5794 SET_PSR_I (1);
5795 trace_output_void ();
5796 }
5797
5798 /* cinv[i,u]. */
5799 void
5800 OP_B_10 ()
5801 {
5802 trace_input ("cinv[i,u]", OP_VOID, OP_VOID, OP_VOID);
5803 SET_PSR_I (1);
5804 trace_output_void ();
5805 }
5806
5807 /* cinv[d]. */
5808 void
5809 OP_C_10 ()
5810 {
5811 trace_input ("cinv[d]", OP_VOID, OP_VOID, OP_VOID);
5812 SET_PSR_I (1);
5813 trace_output_void ();
5814 }
5815
5816 /* cinv[d,u]. */
5817 void
5818 OP_D_10 ()
5819 {
5820 trace_input ("cinv[i,u]", OP_VOID, OP_VOID, OP_VOID);
5821 SET_PSR_I (1);
5822 trace_output_void ();
5823 }
5824
5825 /* cinv[d,i]. */
5826 void
5827 OP_E_10 ()
5828 {
5829 trace_input ("cinv[d,i]", OP_VOID, OP_VOID, OP_VOID);
5830 SET_PSR_I (1);
5831 trace_output_void ();
5832 }
5833
5834 /* cinv[d,i,u]. */
5835 void
5836 OP_F_10 ()
5837 {
5838 trace_input ("cinv[d,i,u]", OP_VOID, OP_VOID, OP_VOID);
5839 SET_PSR_I (1);
5840 trace_output_void ();
5841 }
5842
5843 /* retx. */
5844 void
5845 OP_3_10 ()
5846 {
5847 trace_input ("retx", OP_VOID, OP_VOID, OP_VOID);
5848 SET_PSR_I (1);
5849 trace_output_void ();
5850 }
5851
5852 /* di. */
5853 void
5854 OP_4_10 ()
5855 {
5856 trace_input ("di", OP_VOID, OP_VOID, OP_VOID);
5857 SET_PSR_I (1);
5858 trace_output_void ();
5859 }
5860
5861 /* ei. */
5862 void
5863 OP_5_10 ()
5864 {
5865 trace_input ("ei", OP_VOID, OP_VOID, OP_VOID);
5866 SET_PSR_I (1);
5867 trace_output_void ();
5868 }
5869
5870 /* wait. */
5871 void
5872 OP_6_10 ()
5873 {
5874 trace_input ("wait", OP_VOID, OP_VOID, OP_VOID);
5875 State.exception = SIGTRAP;
5876 trace_output_void ();
5877 }
5878
5879 /* ewait. */
5880 void
5881 OP_7_10 ()
5882 {
5883 trace_input ("ewait", OP_VOID, OP_VOID, OP_VOID);
5884 SET_PSR_I (1);
5885 trace_output_void ();
5886 }
5887
5888 /* xorb. */
5889 void
5890 OP_28_8 ()
5891 {
5892 uint8 tmp, a = (OP[0]) & 0xff, b = (GPR (OP[1])) & 0xff;
5893 trace_input ("xorb", OP_CONSTANT4, OP_REG, OP_VOID);
5894 tmp = a ^ b;
5895 SET_GPR (OP[1], (tmp | ((GPR (OP[1])) & 0xff00)));
5896 trace_output_16 (tmp);
5897 }
5898
5899 /* xorb. */
5900 void
5901 OP_28B_C ()
5902 {
5903 uint8 tmp, a = (OP[0]) & 0xff, b = (GPR (OP[1])) & 0xff;
5904 trace_input ("xorb", OP_CONSTANT16, OP_REG, OP_VOID);
5905 tmp = a ^ b;
5906 SET_GPR (OP[1], (tmp | ((GPR (OP[1])) & 0xff00)));
5907 trace_output_16 (tmp);
5908 }
5909
5910 /* xorb. */
5911 void
5912 OP_29_8 ()
5913 {
5914 uint8 tmp, a = (GPR (OP[0])) & 0xff, b = (GPR (OP[1])) & 0xff;
5915 trace_input ("xorb", OP_REG, OP_REG, OP_VOID);
5916 tmp = a ^ b;
5917 SET_GPR (OP[1], (tmp | ((GPR (OP[1])) & 0xff00)));
5918 trace_output_16 (tmp);
5919 }
5920
5921 /* xorw. */
5922 void
5923 OP_2A_8 ()
5924 {
5925 uint16 tmp, a = (OP[0]), b = (GPR (OP[1]));
5926 trace_input ("xorw", OP_CONSTANT4, OP_REG, OP_VOID);
5927 tmp = a ^ b;
5928 SET_GPR (OP[1], tmp);
5929 trace_output_16 (tmp);
5930 }
5931
5932 /* xorw. */
5933 void
5934 OP_2AB_C ()
5935 {
5936 uint16 tmp, a = (OP[0]), b = (GPR (OP[1]));
5937 trace_input ("xorw", OP_CONSTANT16, OP_REG, OP_VOID);
5938 tmp = a ^ b;
5939 SET_GPR (OP[1], tmp);
5940 trace_output_16 (tmp);
5941 }
5942
5943 /* xorw. */
5944 void
5945 OP_2B_8 ()
5946 {
5947 uint16 tmp, a = (GPR (OP[0])), b = (GPR (OP[1]));
5948 trace_input ("xorw", OP_REG, OP_REG, OP_VOID);
5949 tmp = a ^ b;
5950 SET_GPR (OP[1], tmp);
5951 trace_output_16 (tmp);
5952 }
5953
5954 /*REVISIT FOR LPR/SPR . */
5955
5956 /* lpr. */
5957 void
5958 OP_140_14 ()
5959 {
5960 uint16 a = GPR (OP[0]);
5961 trace_input ("lpr", OP_REG, OP_REG, OP_VOID);
5962 SET_CREG (OP[1], a);
5963 trace_output_16 (a);
5964 }
5965
5966 /* lprd. */
5967 void
5968 OP_141_14 ()
5969 {
5970 uint32 a = GPR32 (OP[0]);
5971 trace_input ("lprd", OP_REGP, OP_REG, OP_VOID);
5972 SET_CREG (OP[1], a);
5973 trace_output_flag ();
5974 }
5975
5976 /* spr. */
5977 void
5978 OP_142_14 ()
5979 {
5980 uint16 a = CREG (OP[0]);
5981 trace_input ("spr", OP_REG, OP_REG, OP_VOID);
5982 SET_GPR (OP[1], a);
5983 trace_output_16 (a);
5984 }
5985
5986 /* sprd. */
5987 void
5988 OP_143_14 ()
5989 {
5990 uint32 a = CREG (OP[0]);
5991 trace_input ("sprd", OP_REGP, OP_REGP, OP_VOID);
5992 SET_GPR32 (OP[1], a);
5993 trace_output_32 (a);
5994 }
5995
5996 /* null. */
5997 void
5998 OP_0_20 ()
5999 {
6000 trace_input ("null", OP_VOID, OP_VOID, OP_VOID);
6001 State.exception = SIG_CR16_STOP;
6002 }