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