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