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