Regenerate configure in sim
[external/binutils.git] / sim / d10v / simops.c
1 #include "config.h"
2
3 #include <signal.h>
4 #include <errno.h>
5 #include <sys/types.h>
6 #include <sys/stat.h>
7 #ifdef HAVE_UNISTD_H
8 #include <unistd.h>
9 #endif
10 #ifdef HAVE_STRING_H
11 #include <string.h>
12 #endif
13
14 #include "sim-main.h"
15 #include "simops.h"
16 #include "targ-vals.h"
17
18 enum op_types {
19   OP_VOID,
20   OP_REG,
21   OP_REG_OUTPUT,
22   OP_DREG,
23   OP_DREG_OUTPUT,
24   OP_ACCUM,
25   OP_ACCUM_OUTPUT,
26   OP_ACCUM_REVERSE,
27   OP_CR,
28   OP_CR_OUTPUT,
29   OP_CR_REVERSE,
30   OP_FLAG,
31   OP_FLAG_OUTPUT,
32   OP_CONSTANT16,
33   OP_CONSTANT8,
34   OP_CONSTANT3,
35   OP_CONSTANT4,
36   OP_MEMREF,
37   OP_MEMREF2,
38   OP_MEMREF3,
39   OP_POSTDEC,
40   OP_POSTINC,
41   OP_PREDEC,
42   OP_R0,
43   OP_R1,
44   OP_R2,
45 };
46
47
48 enum {
49   PSW_MASK = (PSW_SM_BIT
50               | PSW_EA_BIT
51               | PSW_DB_BIT
52               | PSW_IE_BIT
53               | PSW_RP_BIT
54               | PSW_MD_BIT
55               | PSW_FX_BIT
56               | PSW_ST_BIT
57               | PSW_F0_BIT
58               | PSW_F1_BIT
59               | PSW_C_BIT),
60   /* The following bits in the PSW _can't_ be set by instructions such
61      as mvtc. */
62   PSW_HW_MASK = (PSW_MASK | PSW_DM_BIT)
63 };
64
65 reg_t
66 move_to_cr (int cr, reg_t mask, reg_t val, int psw_hw_p)
67 {
68   /* A MASK bit is set when the corresponding bit in the CR should
69      be left alone */
70   /* This assumes that (VAL & MASK) == 0 */
71   switch (cr)
72     {
73     case PSW_CR:
74       if (psw_hw_p)
75         val &= PSW_HW_MASK;
76       else
77         val &= PSW_MASK;
78       if ((mask & PSW_SM_BIT) == 0)
79         {
80           int new_psw_sm = (val & PSW_SM_BIT) != 0;
81           /* save old SP */
82           SET_HELD_SP (PSW_SM, GPR (SP_IDX));
83           if (PSW_SM != new_psw_sm)
84             /* restore new SP */
85             SET_GPR (SP_IDX, HELD_SP (new_psw_sm));
86         }
87       if ((mask & (PSW_ST_BIT | PSW_FX_BIT)) == 0)
88         {
89           if (val & PSW_ST_BIT && !(val & PSW_FX_BIT))
90             {
91               (*d10v_callback->printf_filtered)
92                 (d10v_callback,
93                  "ERROR at PC 0x%x: ST can only be set when FX is set.\n",
94                  PC<<2);
95               State.exception = SIGILL;
96             }
97         }
98       /* keep an up-to-date psw around for tracing */
99       State.trace.psw = (State.trace.psw & mask) | val;
100       break;
101     case BPSW_CR:
102     case DPSW_CR:
103       /* Just like PSW, mask things like DM out. */
104       if (psw_hw_p)
105         val &= PSW_HW_MASK;
106       else
107         val &= PSW_MASK;
108       break;
109     case MOD_S_CR:
110     case MOD_E_CR:
111       val &= ~1;
112       break;
113     default:
114       break;
115     }
116   /* only issue an update if the register is being changed */
117   if ((State.cregs[cr] & ~mask) != val)
118     SLOT_PEND_MASK (State.cregs[cr], mask, val);
119   return val;
120 }
121
122 #ifdef DEBUG
123 static void trace_input_func (const char *name,
124                               enum op_types in1,
125                               enum op_types in2,
126                               enum op_types in3);
127
128 #define trace_input(name, in1, in2, in3) do { if (d10v_debug) trace_input_func (name, in1, in2, in3); } while (0)
129
130 #ifndef SIZE_INSTRUCTION
131 #define SIZE_INSTRUCTION 8
132 #endif
133
134 #ifndef SIZE_OPERANDS
135 #define SIZE_OPERANDS 18
136 #endif
137
138 #ifndef SIZE_VALUES
139 #define SIZE_VALUES 13
140 #endif
141
142 #ifndef SIZE_LOCATION
143 #define SIZE_LOCATION 20
144 #endif
145
146 #ifndef SIZE_PC
147 #define SIZE_PC 6
148 #endif
149
150 #ifndef SIZE_LINE_NUMBER
151 #define SIZE_LINE_NUMBER 4
152 #endif
153
154 static void
155 trace_input_func (const char *name, enum op_types in1, enum op_types in2, enum op_types in3)
156 {
157   char *comma;
158   enum op_types in[3];
159   int i;
160   char buf[1024];
161   char *p;
162   long tmp;
163   char *type;
164   const char *filename;
165   const char *functionname;
166   unsigned int linenumber;
167   bfd_vma byte_pc;
168
169   if ((d10v_debug & DEBUG_TRACE) == 0)
170     return;
171
172   switch (State.ins_type)
173     {
174     default:
175     case INS_UNKNOWN:           type = " ?"; break;
176     case INS_LEFT:              type = " L"; break;
177     case INS_RIGHT:             type = " R"; break;
178     case INS_LEFT_PARALLEL:     type = "*L"; break;
179     case INS_RIGHT_PARALLEL:    type = "*R"; break;
180     case INS_LEFT_COND_TEST:    type = "?L"; break;
181     case INS_RIGHT_COND_TEST:   type = "?R"; break;
182     case INS_LEFT_COND_EXE:     type = "&L"; break;
183     case INS_RIGHT_COND_EXE:    type = "&R"; break;
184     case INS_LONG:              type = " B"; break;
185     }
186
187   if ((d10v_debug & DEBUG_LINE_NUMBER) == 0)
188     (*d10v_callback->printf_filtered) (d10v_callback,
189                                        "0x%.*x %s: %-*s ",
190                                        SIZE_PC, (unsigned)PC,
191                                        type,
192                                        SIZE_INSTRUCTION, name);
193
194   else
195     {
196       extern SIM_DESC trace_sd;
197
198       buf[0] = '\0';
199       byte_pc = PC;
200       if (STATE_TEXT_SECTION (trace_sd)
201           && byte_pc >= STATE_TEXT_START (trace_sd)
202           && byte_pc < STATE_TEXT_END (trace_sd))
203         {
204           filename = (const char *)0;
205           functionname = (const char *)0;
206           linenumber = 0;
207           if (bfd_find_nearest_line (STATE_PROG_BFD (trace_sd),
208                                      STATE_TEXT_SECTION (trace_sd),
209                                      (struct bfd_symbol **)0,
210                                      byte_pc - STATE_TEXT_START (trace_sd),
211                                      &filename, &functionname, &linenumber))
212             {
213               p = buf;
214               if (linenumber)
215                 {
216                   sprintf (p, "#%-*d ", SIZE_LINE_NUMBER, linenumber);
217                   p += strlen (p);
218                 }
219               else
220                 {
221                   sprintf (p, "%-*s ", SIZE_LINE_NUMBER+1, "---");
222                   p += SIZE_LINE_NUMBER+2;
223                 }
224
225               if (functionname)
226                 {
227                   sprintf (p, "%s ", functionname);
228                   p += strlen (p);
229                 }
230               else if (filename)
231                 {
232                   char *q = strrchr (filename, '/');
233                   sprintf (p, "%s ", (q) ? q+1 : filename);
234                   p += strlen (p);
235                 }
236
237               if (*p == ' ')
238                 *p = '\0';
239             }
240         }
241
242       (*d10v_callback->printf_filtered) (d10v_callback,
243                                          "0x%.*x %s: %-*.*s %-*s ",
244                                          SIZE_PC, (unsigned)PC,
245                                          type,
246                                          SIZE_LOCATION, SIZE_LOCATION, buf,
247                                          SIZE_INSTRUCTION, name);
248     }
249
250   in[0] = in1;
251   in[1] = in2;
252   in[2] = in3;
253   comma = "";
254   p = buf;
255   for (i = 0; i < 3; i++)
256     {
257       switch (in[i])
258         {
259         case OP_VOID:
260         case OP_R0:
261         case OP_R1:
262         case OP_R2:
263           break;
264
265         case OP_REG:
266         case OP_REG_OUTPUT:
267         case OP_DREG:
268         case OP_DREG_OUTPUT:
269           sprintf (p, "%sr%d", comma, OP[i]);
270           p += strlen (p);
271           comma = ",";
272           break;
273
274         case OP_CR:
275         case OP_CR_OUTPUT:
276         case OP_CR_REVERSE:
277           sprintf (p, "%scr%d", comma, OP[i]);
278           p += strlen (p);
279           comma = ",";
280           break;
281
282         case OP_ACCUM:
283         case OP_ACCUM_OUTPUT:
284         case OP_ACCUM_REVERSE:
285           sprintf (p, "%sa%d", comma, OP[i]);
286           p += strlen (p);
287           comma = ",";
288           break;
289
290         case OP_CONSTANT16:
291           sprintf (p, "%s%d", comma, OP[i]);
292           p += strlen (p);
293           comma = ",";
294           break;
295
296         case OP_CONSTANT8:
297           sprintf (p, "%s%d", comma, SEXT8(OP[i]));
298           p += strlen (p);
299           comma = ",";
300           break;
301
302         case OP_CONSTANT4:
303           sprintf (p, "%s%d", comma, SEXT4(OP[i]));
304           p += strlen (p);
305           comma = ",";
306           break;
307
308         case OP_CONSTANT3:
309           sprintf (p, "%s%d", comma, SEXT3(OP[i]));
310           p += strlen (p);
311           comma = ",";
312           break;
313
314         case OP_MEMREF:
315           sprintf (p, "%s@r%d", comma, OP[i]);
316           p += strlen (p);
317           comma = ",";
318           break;
319
320         case OP_MEMREF2:
321           sprintf (p, "%s@(%d,r%d)", comma, (int16)OP[i], OP[i+1]);
322           p += strlen (p);
323           comma = ",";
324           break;
325
326         case OP_MEMREF3:
327           sprintf (p, "%s@%d", comma, OP[i]);
328           p += strlen (p);
329           comma = ",";
330           break;
331
332         case OP_POSTINC:
333           sprintf (p, "%s@r%d+", comma, OP[i]);
334           p += strlen (p);
335           comma = ",";
336           break;
337
338         case OP_POSTDEC:
339           sprintf (p, "%s@r%d-", comma, OP[i]);
340           p += strlen (p);
341           comma = ",";
342           break;
343
344         case OP_PREDEC:
345           sprintf (p, "%s@-r%d", comma, OP[i]);
346           p += strlen (p);
347           comma = ",";
348           break;
349
350         case OP_FLAG:
351         case OP_FLAG_OUTPUT:
352           if (OP[i] == 0)
353             sprintf (p, "%sf0", comma);
354
355           else if (OP[i] == 1)
356             sprintf (p, "%sf1", comma);
357
358           else
359             sprintf (p, "%sc", comma);
360
361           p += strlen (p);
362           comma = ",";
363           break;
364         }
365     }
366
367   if ((d10v_debug & DEBUG_VALUES) == 0)
368     {
369       *p++ = '\n';
370       *p = '\0';
371       (*d10v_callback->printf_filtered) (d10v_callback, "%s", buf);
372     }
373   else
374     {
375       *p = '\0';
376       (*d10v_callback->printf_filtered) (d10v_callback, "%-*s", SIZE_OPERANDS, buf);
377
378       p = buf;
379       for (i = 0; i < 3; i++)
380         {
381           buf[0] = '\0';
382           switch (in[i])
383             {
384             case OP_VOID:
385               (*d10v_callback->printf_filtered) (d10v_callback, "%*s", SIZE_VALUES, "");
386               break;
387
388             case OP_REG_OUTPUT:
389             case OP_DREG_OUTPUT:
390             case OP_CR_OUTPUT:
391             case OP_ACCUM_OUTPUT:
392             case OP_FLAG_OUTPUT:
393               (*d10v_callback->printf_filtered) (d10v_callback, "%*s", SIZE_VALUES, "---");
394               break;
395
396             case OP_REG:
397             case OP_MEMREF:
398             case OP_POSTDEC:
399             case OP_POSTINC:
400             case OP_PREDEC:
401               (*d10v_callback->printf_filtered) (d10v_callback, "%*s0x%.4x", SIZE_VALUES-6, "",
402                                                  (uint16) GPR (OP[i]));
403               break;
404
405             case OP_MEMREF3:
406               (*d10v_callback->printf_filtered) (d10v_callback, "%*s0x%.4x", SIZE_VALUES-6, "", (uint16) OP[i]);
407               break;
408
409             case OP_DREG:
410               tmp = (long)((((uint32) GPR (OP[i])) << 16) | ((uint32) GPR (OP[i] + 1)));
411               (*d10v_callback->printf_filtered) (d10v_callback, "%*s0x%.8lx", SIZE_VALUES-10, "", tmp);
412               break;
413
414             case OP_CR:
415             case OP_CR_REVERSE:
416               (*d10v_callback->printf_filtered) (d10v_callback, "%*s0x%.4x", SIZE_VALUES-6, "",
417                                                  (uint16) CREG (OP[i]));
418               break;
419
420             case OP_ACCUM:
421             case OP_ACCUM_REVERSE:
422               (*d10v_callback->printf_filtered) (d10v_callback, "%*s0x%.2x%.8lx", SIZE_VALUES-12, "",
423                                                  ((int)(ACC (OP[i]) >> 32) & 0xff),
424                                                  ((unsigned long) ACC (OP[i])) & 0xffffffff);
425               break;
426
427             case OP_CONSTANT16:
428               (*d10v_callback->printf_filtered) (d10v_callback, "%*s0x%.4x", SIZE_VALUES-6, "",
429                                                  (uint16)OP[i]);
430               break;
431
432             case OP_CONSTANT4:
433               (*d10v_callback->printf_filtered) (d10v_callback, "%*s0x%.4x", SIZE_VALUES-6, "",
434                                                  (uint16)SEXT4(OP[i]));
435               break;
436
437             case OP_CONSTANT8:
438               (*d10v_callback->printf_filtered) (d10v_callback, "%*s0x%.4x", SIZE_VALUES-6, "",
439                                                  (uint16)SEXT8(OP[i]));
440               break;
441
442             case OP_CONSTANT3:
443               (*d10v_callback->printf_filtered) (d10v_callback, "%*s0x%.4x", SIZE_VALUES-6, "",
444                                                  (uint16)SEXT3(OP[i]));
445               break;
446
447             case OP_FLAG:
448               if (OP[i] == 0)
449                 (*d10v_callback->printf_filtered) (d10v_callback, "%*sF0 = %d", SIZE_VALUES-6, "",
450                                                    PSW_F0 != 0);
451
452               else if (OP[i] == 1)
453                 (*d10v_callback->printf_filtered) (d10v_callback, "%*sF1 = %d", SIZE_VALUES-6, "",
454                                                    PSW_F1 != 0);
455
456               else
457                 (*d10v_callback->printf_filtered) (d10v_callback, "%*sC = %d", SIZE_VALUES-5, "",
458                                                    PSW_C != 0);
459
460               break;
461
462             case OP_MEMREF2:
463               (*d10v_callback->printf_filtered) (d10v_callback, "%*s0x%.4x", SIZE_VALUES-6, "",
464                                                  (uint16)OP[i]);
465               (*d10v_callback->printf_filtered) (d10v_callback, "%*s0x%.4x", SIZE_VALUES-6, "",
466                                                  (uint16)GPR (OP[i + 1]));
467               i++;
468               break;
469
470             case OP_R0:
471               (*d10v_callback->printf_filtered) (d10v_callback, "%*s0x%.4x", SIZE_VALUES-6, "",
472                                                  (uint16) GPR (0));
473               break;
474
475             case OP_R1:
476               (*d10v_callback->printf_filtered) (d10v_callback, "%*s0x%.4x", SIZE_VALUES-6, "",
477                                                  (uint16) GPR (1));
478               break;
479
480             case OP_R2:
481               (*d10v_callback->printf_filtered) (d10v_callback, "%*s0x%.4x", SIZE_VALUES-6, "",
482                                                  (uint16) GPR (2));
483               break;
484
485             }
486         }
487     }
488
489   (*d10v_callback->flush_stdout) (d10v_callback);
490 }
491
492 static void
493 do_trace_output_flush (void)
494 {
495   (*d10v_callback->flush_stdout) (d10v_callback);
496 }
497
498 static void
499 do_trace_output_finish (void)
500 {
501   (*d10v_callback->printf_filtered) (d10v_callback,
502                                      " F0=%d F1=%d C=%d\n",
503                                      (State.trace.psw & PSW_F0_BIT) != 0,
504                                      (State.trace.psw & PSW_F1_BIT) != 0,
505                                      (State.trace.psw & PSW_C_BIT) != 0);
506   (*d10v_callback->flush_stdout) (d10v_callback);
507 }
508
509 static void
510 trace_output_40 (uint64 val)
511 {
512   if ((d10v_debug & (DEBUG_TRACE | DEBUG_VALUES)) == (DEBUG_TRACE | DEBUG_VALUES))
513     {
514       (*d10v_callback->printf_filtered) (d10v_callback,
515                                          " :: %*s0x%.2x%.8lx",
516                                          SIZE_VALUES - 12,
517                                          "",
518                                          ((int)(val >> 32) & 0xff),
519                                          ((unsigned long) val) & 0xffffffff);
520       do_trace_output_finish ();
521     }
522 }
523
524 static void
525 trace_output_32 (uint32 val)
526 {
527   if ((d10v_debug & (DEBUG_TRACE | DEBUG_VALUES)) == (DEBUG_TRACE | DEBUG_VALUES))
528     {
529       (*d10v_callback->printf_filtered) (d10v_callback,
530                                          " :: %*s0x%.8x",
531                                          SIZE_VALUES - 10,
532                                          "",
533                                          (int) val);
534       do_trace_output_finish ();
535     }
536 }
537
538 static void
539 trace_output_16 (uint16 val)
540 {
541   if ((d10v_debug & (DEBUG_TRACE | DEBUG_VALUES)) == (DEBUG_TRACE | DEBUG_VALUES))
542     {
543       (*d10v_callback->printf_filtered) (d10v_callback,
544                                          " :: %*s0x%.4x",
545                                          SIZE_VALUES - 6,
546                                          "",
547                                          (int) val);
548       do_trace_output_finish ();
549     }
550 }
551
552 static void
553 trace_output_void (void)
554 {
555   if ((d10v_debug & (DEBUG_TRACE | DEBUG_VALUES)) == (DEBUG_TRACE | DEBUG_VALUES))
556     {
557       (*d10v_callback->printf_filtered) (d10v_callback, "\n");
558       do_trace_output_flush ();
559     }
560 }
561
562 static void
563 trace_output_flag (void)
564 {
565   if ((d10v_debug & (DEBUG_TRACE | DEBUG_VALUES)) == (DEBUG_TRACE | DEBUG_VALUES))
566     {
567       (*d10v_callback->printf_filtered) (d10v_callback,
568                                          " :: %*s",
569                                          SIZE_VALUES,
570                                          "");
571       do_trace_output_finish ();
572     }
573 }
574
575
576
577
578 #else
579 #define trace_input(NAME, IN1, IN2, IN3)
580 #define trace_output(RESULT)
581 #endif
582
583 /* abs */
584 void
585 OP_4607 (void)
586 {
587   int16 tmp;
588   trace_input ("abs", OP_REG, OP_VOID, OP_VOID);
589   SET_PSW_F1 (PSW_F0);
590   tmp = GPR(OP[0]);
591   if (tmp < 0)
592     {
593       tmp = - tmp;
594       SET_PSW_F0 (1);
595     }
596   else
597     SET_PSW_F0 (0);
598   SET_GPR (OP[0], tmp);
599   trace_output_16 (tmp);
600 }
601
602 /* abs */
603 void
604 OP_5607 (void)
605 {
606   int64 tmp;
607   trace_input ("abs", OP_ACCUM, OP_VOID, OP_VOID);
608   SET_PSW_F1 (PSW_F0);
609
610   tmp = SEXT40 (ACC (OP[0]));
611   if (tmp < 0 )
612     {
613       tmp = - tmp;
614       if (PSW_ST)
615         {
616           if (tmp > SEXT40(MAX32))
617             tmp = (MAX32);
618           else if (tmp < SEXT40(MIN32))
619             tmp = (MIN32);
620           else
621             tmp = (tmp & MASK40);
622         }
623       else
624         tmp = (tmp & MASK40);
625       SET_PSW_F0 (1);
626     }
627   else
628     {
629       tmp = (tmp & MASK40);
630       SET_PSW_F0 (0);
631     }
632   SET_ACC (OP[0], tmp);
633   trace_output_40 (tmp);
634 }
635
636 /* add */
637 void
638 OP_200 (void)
639 {
640   uint16 a = GPR (OP[0]);
641   uint16 b = GPR (OP[1]);
642   uint16 tmp = (a + b);
643   trace_input ("add", OP_REG, OP_REG, OP_VOID);
644   SET_PSW_C (a > tmp);
645   SET_GPR (OP[0], tmp);
646   trace_output_16 (tmp);
647 }
648
649 /* add */
650 void
651 OP_1201 (void)
652 {
653   int64 tmp;
654   tmp = SEXT40(ACC (OP[0])) + (SEXT16 (GPR (OP[1])) << 16 | GPR (OP[1] + 1));
655
656   trace_input ("add", OP_ACCUM, OP_REG, OP_VOID);
657   if (PSW_ST)
658     {
659       if (tmp > SEXT40(MAX32))
660         tmp = (MAX32);
661       else if (tmp < SEXT40(MIN32))
662         tmp = (MIN32);
663       else
664         tmp = (tmp & MASK40);
665     }
666   else
667     tmp = (tmp & MASK40);
668   SET_ACC (OP[0], tmp);
669   trace_output_40 (tmp);
670 }
671
672 /* add */
673 void
674 OP_1203 (void)
675 {
676   int64 tmp;
677   tmp = SEXT40(ACC (OP[0])) + SEXT40(ACC (OP[1]));
678
679   trace_input ("add", OP_ACCUM, OP_ACCUM, OP_VOID);
680   if (PSW_ST)
681     {
682       if (tmp > SEXT40(MAX32))
683         tmp = (MAX32);
684       else if (tmp < SEXT40(MIN32))
685         tmp = (MIN32);
686       else
687         tmp = (tmp & MASK40);
688     }
689   else
690     tmp = (tmp & MASK40);
691   SET_ACC (OP[0], tmp);
692   trace_output_40 (tmp);
693 }
694
695 /* add2w */
696 void
697 OP_1200 (void)
698 {
699   uint32 tmp;
700   uint32 a = (GPR (OP[0])) << 16 | GPR (OP[0] + 1);
701   uint32 b = (GPR (OP[1])) << 16 | GPR (OP[1] + 1);
702   trace_input ("add2w", OP_DREG, OP_DREG, OP_VOID);
703   tmp = a + b;
704   SET_PSW_C (tmp < a);
705   SET_GPR (OP[0] + 0, (tmp >> 16));
706   SET_GPR (OP[0] + 1, (tmp & 0xFFFF));
707   trace_output_32 (tmp);
708 }
709
710 /* add3 */
711 void
712 OP_1000000 (void)
713 {
714   uint16 a = GPR (OP[1]);
715   uint16 b = OP[2];
716   uint16 tmp = (a + b);
717   trace_input ("add3", OP_REG_OUTPUT, OP_REG, OP_CONSTANT16);
718   SET_PSW_C (tmp < a);
719   SET_GPR (OP[0], tmp);
720   trace_output_16 (tmp);
721 }
722
723 /* addac3 */
724 void
725 OP_17000200 (void)
726 {
727   int64 tmp;
728   tmp = SEXT40(ACC (OP[2])) + SEXT40 ((GPR (OP[1]) << 16) | GPR (OP[1] + 1));
729
730   trace_input ("addac3", OP_DREG_OUTPUT, OP_DREG, OP_ACCUM);
731   SET_GPR (OP[0] + 0, ((tmp >> 16) & 0xffff));
732   SET_GPR (OP[0] + 1, (tmp & 0xffff));
733   trace_output_32 (tmp);
734 }
735
736 /* addac3 */
737 void
738 OP_17000202 (void)
739 {
740   int64 tmp;
741   tmp = SEXT40(ACC (OP[1])) + SEXT40(ACC (OP[2]));
742
743   trace_input ("addac3", OP_DREG_OUTPUT, OP_ACCUM, OP_ACCUM);
744   SET_GPR (OP[0] + 0, (tmp >> 16) & 0xffff);
745   SET_GPR (OP[0] + 1, tmp & 0xffff);
746   trace_output_32 (tmp);
747 }
748
749 /* addac3s */
750 void
751 OP_17001200 (void)
752 {
753   int64 tmp;
754   SET_PSW_F1 (PSW_F0);
755
756   trace_input ("addac3s", OP_DREG_OUTPUT, OP_DREG, OP_ACCUM);
757   tmp = SEXT40 (ACC (OP[2])) + SEXT40 ((GPR (OP[1]) << 16) | GPR (OP[1] + 1));
758   if (tmp > SEXT40(MAX32))
759     {
760       tmp = (MAX32);
761       SET_PSW_F0 (1);
762     }      
763   else if (tmp < SEXT40(MIN32))
764     {
765       tmp = (MIN32);
766       SET_PSW_F0 (1);
767     }      
768   else
769     {
770       SET_PSW_F0 (0);
771     }      
772   SET_GPR (OP[0] + 0, (tmp >> 16) & 0xffff);
773   SET_GPR (OP[0] + 1, (tmp & 0xffff));
774   trace_output_32 (tmp);
775 }
776
777 /* addac3s */
778 void
779 OP_17001202 (void)
780 {
781   int64 tmp;
782   SET_PSW_F1 (PSW_F0);
783
784   trace_input ("addac3s", OP_DREG_OUTPUT, OP_ACCUM, OP_ACCUM);
785   tmp = SEXT40(ACC (OP[1])) + SEXT40(ACC (OP[2]));
786   if (tmp > SEXT40(MAX32))
787     {
788       tmp = (MAX32);
789       SET_PSW_F0 (1);
790     }      
791   else if (tmp < SEXT40(MIN32))
792     {
793       tmp = (MIN32);
794       SET_PSW_F0 (1);
795     }      
796   else
797     {
798       SET_PSW_F0 (0);
799     }      
800   SET_GPR (OP[0] + 0, (tmp >> 16) & 0xffff);
801   SET_GPR (OP[0] + 1, (tmp & 0xffff));
802   trace_output_32 (tmp);
803 }
804
805 /* addi */
806 void
807 OP_201 (void)
808 {
809   uint16 a = GPR (OP[0]);
810   uint16 b;
811   uint16 tmp;
812   if (OP[1] == 0)
813     OP[1] = 16;
814   b = OP[1];
815   tmp = (a + b);
816   trace_input ("addi", OP_REG, OP_CONSTANT16, OP_VOID);
817   SET_PSW_C (tmp < a);
818   SET_GPR (OP[0], tmp);
819   trace_output_16 (tmp);
820 }
821
822 /* and */
823 void
824 OP_C00 (void)
825 {
826   uint16 tmp = GPR (OP[0]) & GPR (OP[1]);
827   trace_input ("and", OP_REG, OP_REG, OP_VOID);
828   SET_GPR (OP[0], tmp);
829   trace_output_16 (tmp);
830 }
831
832 /* and3 */
833 void
834 OP_6000000 (void)
835 {
836   uint16 tmp = GPR (OP[1]) & OP[2];
837   trace_input ("and3", OP_REG_OUTPUT, OP_REG, OP_CONSTANT16);
838   SET_GPR (OP[0], tmp);
839   trace_output_16 (tmp);
840 }
841
842 /* bclri */
843 void
844 OP_C01 (void)
845 {
846   int16 tmp;
847   trace_input ("bclri", OP_REG, OP_CONSTANT16, OP_VOID);
848   tmp = (GPR (OP[0]) &~(0x8000 >> OP[1]));
849   SET_GPR (OP[0], tmp);
850   trace_output_16 (tmp);
851 }
852
853 /* bl.s */
854 void
855 OP_4900 (void)
856 {
857   trace_input ("bl.s", OP_CONSTANT8, OP_R0, OP_R1);
858   SET_GPR (13, PC + 1);
859   JMP( PC + SEXT8 (OP[0]));
860   trace_output_void ();
861 }
862
863 /* bl.l */
864 void
865 OP_24800000 (void)
866 {
867   trace_input ("bl.l", OP_CONSTANT16, OP_R0, OP_R1);
868   SET_GPR (13, (PC + 1));
869   JMP (PC + OP[0]);
870   trace_output_void ();
871 }
872
873 /* bnoti */
874 void
875 OP_A01 (void)
876 {
877   int16 tmp;
878   trace_input ("bnoti", OP_REG, OP_CONSTANT16, OP_VOID);
879   tmp = (GPR (OP[0]) ^ (0x8000 >> OP[1]));
880   SET_GPR (OP[0], tmp);
881   trace_output_16 (tmp);
882 }
883
884 /* bra.s */
885 void
886 OP_4800 (void)
887 {
888   trace_input ("bra.s", OP_CONSTANT8, OP_VOID, OP_VOID);
889   JMP (PC + SEXT8 (OP[0]));
890   trace_output_void ();
891 }
892
893 /* bra.l */
894 void
895 OP_24000000 (void)
896 {
897   trace_input ("bra.l", OP_CONSTANT16, OP_VOID, OP_VOID);
898   JMP (PC + OP[0]);
899   trace_output_void ();
900 }
901
902 /* brf0f.s */
903 void
904 OP_4A00 (void)
905 {
906   trace_input ("brf0f.s", OP_CONSTANT8, OP_VOID, OP_VOID);
907   if (!PSW_F0)
908     JMP (PC + SEXT8 (OP[0]));
909   trace_output_flag ();
910 }
911
912 /* brf0f.l */
913 void
914 OP_25000000 (void)
915 {
916   trace_input ("brf0f.l", OP_CONSTANT16, OP_VOID, OP_VOID);
917   if (!PSW_F0)
918     JMP (PC + OP[0]);
919   trace_output_flag ();
920 }
921
922 /* brf0t.s */
923 void
924 OP_4B00 (void)
925 {
926   trace_input ("brf0t.s", OP_CONSTANT8, OP_VOID, OP_VOID);
927   if (PSW_F0)
928     JMP (PC + SEXT8 (OP[0]));
929   trace_output_flag ();
930 }
931
932 /* brf0t.l */
933 void
934 OP_25800000 (void)
935 {
936   trace_input ("brf0t.l", OP_CONSTANT16, OP_VOID, OP_VOID);
937   if (PSW_F0)
938     JMP (PC + OP[0]);
939   trace_output_flag ();
940 }
941
942 /* bseti */
943 void
944 OP_801 (void)
945 {
946   int16 tmp;
947   trace_input ("bseti", OP_REG, OP_CONSTANT16, OP_VOID);
948   tmp = (GPR (OP[0]) | (0x8000 >> OP[1]));
949   SET_GPR (OP[0], tmp);
950   trace_output_16 (tmp);
951 }
952
953 /* btsti */
954 void
955 OP_E01 (void)
956 {
957   trace_input ("btsti", OP_REG, OP_CONSTANT16, OP_VOID);
958   SET_PSW_F1 (PSW_F0);
959   SET_PSW_F0 ((GPR (OP[0]) & (0x8000 >> OP[1])) ? 1 : 0);
960   trace_output_flag ();
961 }
962
963 /* clrac */
964 void
965 OP_5601 (void)
966 {
967   trace_input ("clrac", OP_ACCUM_OUTPUT, OP_VOID, OP_VOID);
968   SET_ACC (OP[0], 0);
969   trace_output_40 (0);
970 }
971
972 /* cmp */
973 void
974 OP_600 (void)
975 {
976   trace_input ("cmp", OP_REG, OP_REG, OP_VOID);
977   SET_PSW_F1 (PSW_F0);
978   SET_PSW_F0 (((int16)(GPR (OP[0])) < (int16)(GPR (OP[1]))) ? 1 : 0);
979   trace_output_flag ();
980 }
981
982 /* cmp */
983 void
984 OP_1603 (void)
985 {
986   trace_input ("cmp", OP_ACCUM, OP_ACCUM, OP_VOID);
987   SET_PSW_F1 (PSW_F0);
988   SET_PSW_F0 ((SEXT40(ACC (OP[0])) < SEXT40(ACC (OP[1]))) ? 1 : 0);
989   trace_output_flag ();
990 }
991
992 /* cmpeq */
993 void
994 OP_400 (void)
995 {
996   trace_input ("cmpeq", OP_REG, OP_REG, OP_VOID);
997   SET_PSW_F1 (PSW_F0);
998   SET_PSW_F0 ((GPR (OP[0]) == GPR (OP[1])) ? 1 : 0);
999   trace_output_flag ();
1000 }
1001
1002 /* cmpeq */
1003 void
1004 OP_1403 (void)
1005 {
1006   trace_input ("cmpeq", OP_ACCUM, OP_ACCUM, OP_VOID);
1007   SET_PSW_F1 (PSW_F0);
1008   SET_PSW_F0 (((ACC (OP[0]) & MASK40) == (ACC (OP[1]) & MASK40)) ? 1 : 0);
1009   trace_output_flag ();
1010 }
1011
1012 /* cmpeqi.s */
1013 void
1014 OP_401 (void)
1015 {
1016   trace_input ("cmpeqi.s", OP_REG, OP_CONSTANT4, OP_VOID);
1017   SET_PSW_F1 (PSW_F0);
1018   SET_PSW_F0 ((GPR (OP[0]) == (reg_t) SEXT4 (OP[1])) ? 1 : 0);  
1019   trace_output_flag ();
1020 }
1021
1022 /* cmpeqi.l */
1023 void
1024 OP_2000000 (void)
1025 {
1026   trace_input ("cmpeqi.l", OP_REG, OP_CONSTANT16, OP_VOID);
1027   SET_PSW_F1 (PSW_F0);
1028   SET_PSW_F0 ((GPR (OP[0]) == (reg_t)OP[1]) ? 1 : 0);  
1029   trace_output_flag ();
1030 }
1031
1032 /* cmpi.s */
1033 void
1034 OP_601 (void)
1035 {
1036   trace_input ("cmpi.s", OP_REG, OP_CONSTANT4, OP_VOID);
1037   SET_PSW_F1 (PSW_F0);
1038   SET_PSW_F0 (((int16)(GPR (OP[0])) < (int16)SEXT4(OP[1])) ? 1 : 0);  
1039   trace_output_flag ();
1040 }
1041
1042 /* cmpi.l */
1043 void
1044 OP_3000000 (void)
1045 {
1046   trace_input ("cmpi.l", OP_REG, OP_CONSTANT16, OP_VOID);
1047   SET_PSW_F1 (PSW_F0);
1048   SET_PSW_F0 (((int16)(GPR (OP[0])) < (int16)(OP[1])) ? 1 : 0);  
1049   trace_output_flag ();
1050 }
1051
1052 /* cmpu */
1053 void
1054 OP_4600 (void)
1055 {
1056   trace_input ("cmpu", OP_REG, OP_REG, OP_VOID);
1057   SET_PSW_F1 (PSW_F0);
1058   SET_PSW_F0 ((GPR (OP[0]) < GPR (OP[1])) ? 1 : 0);  
1059   trace_output_flag ();
1060 }
1061
1062 /* cmpui */
1063 void
1064 OP_23000000 (void)
1065 {
1066   trace_input ("cmpui", OP_REG, OP_CONSTANT16, OP_VOID);
1067   SET_PSW_F1 (PSW_F0);
1068   SET_PSW_F0 ((GPR (OP[0]) < (reg_t)OP[1]) ? 1 : 0);  
1069   trace_output_flag ();
1070 }
1071
1072 /* cpfg */
1073 void
1074 OP_4E09 (void)
1075 {
1076   uint8 val;
1077   
1078   trace_input ("cpfg", OP_FLAG_OUTPUT, OP_FLAG, OP_VOID);
1079   
1080   if (OP[1] == 0)
1081     val = PSW_F0;
1082   else if (OP[1] == 1)
1083     val = PSW_F1;
1084   else
1085     val = PSW_C;
1086   if (OP[0] == 0)
1087     SET_PSW_F0 (val);
1088   else
1089     SET_PSW_F1 (val);
1090
1091   trace_output_flag ();
1092 }
1093
1094 /* cpfg */
1095 void
1096 OP_4E0F (void)
1097 {
1098   uint8 val;
1099   
1100   trace_input ("cpfg", OP_FLAG_OUTPUT, OP_FLAG, OP_VOID);
1101   
1102   if (OP[1] == 0)
1103     val = PSW_F0;
1104   else if (OP[1] == 1)
1105     val = PSW_F1;
1106   else
1107     val = PSW_C;
1108   if (OP[0] == 0)
1109     SET_PSW_F0 (val);
1110   else
1111     SET_PSW_F1 (val);
1112
1113   trace_output_flag ();
1114 }
1115
1116 /* dbt */
1117 void
1118 OP_5F20 (void)
1119 {
1120   /* d10v_callback->printf_filtered(d10v_callback, "***** DBT *****  PC=%x\n",PC); */
1121
1122   /* GDB uses the instruction pair ``dbt || nop'' as a break-point.
1123      The conditional below is for either of the instruction pairs
1124      ``dbt -> XXX'' or ``dbt <- XXX'' and treats them as as cases
1125      where the dbt instruction should be interpreted.
1126
1127      The module `sim-break' provides a more effective mechanism for
1128      detecting GDB planted breakpoints.  The code below may,
1129      eventually, be changed to use that mechanism. */
1130
1131   if (State.ins_type == INS_LEFT
1132       || State.ins_type == INS_RIGHT)
1133     {
1134       trace_input ("dbt", OP_VOID, OP_VOID, OP_VOID);
1135       SET_DPC (PC + 1);
1136       SET_DPSW (PSW);
1137       SET_HW_PSW (PSW_DM_BIT | (PSW & (PSW_F0_BIT | PSW_F1_BIT | PSW_C_BIT)));
1138       JMP (DBT_VECTOR_START);
1139       trace_output_void ();
1140     }
1141   else
1142     {
1143       State.exception = SIGTRAP;
1144     }
1145 }
1146
1147 /* divs */
1148 void
1149 OP_14002800 (void)
1150 {
1151   uint16 foo, tmp, tmpf;
1152   uint16 hi;
1153   uint16 lo;
1154
1155   trace_input ("divs", OP_DREG, OP_REG, OP_VOID);
1156   foo = (GPR (OP[0]) << 1) | (GPR (OP[0] + 1) >> 15);
1157   tmp = (int16)foo - (int16)(GPR (OP[1]));
1158   tmpf = (foo >= GPR (OP[1])) ? 1 : 0;
1159   hi = ((tmpf == 1) ? tmp : foo);
1160   lo = ((GPR (OP[0] + 1) << 1) | tmpf);
1161   SET_GPR (OP[0] + 0, hi);
1162   SET_GPR (OP[0] + 1, lo);
1163   trace_output_32 (((uint32) hi << 16) | lo);
1164 }
1165
1166 /* exef0f */
1167 void
1168 OP_4E04 (void)
1169 {
1170   trace_input ("exef0f", OP_VOID, OP_VOID, OP_VOID);
1171   State.exe = (PSW_F0 == 0);
1172   trace_output_flag ();
1173 }
1174
1175 /* exef0t */
1176 void
1177 OP_4E24 (void)
1178 {
1179   trace_input ("exef0t", OP_VOID, OP_VOID, OP_VOID);
1180   State.exe = (PSW_F0 != 0);
1181   trace_output_flag ();
1182 }
1183
1184 /* exef1f */
1185 void
1186 OP_4E40 (void)
1187 {
1188   trace_input ("exef1f", OP_VOID, OP_VOID, OP_VOID);
1189   State.exe = (PSW_F1 == 0);
1190   trace_output_flag ();
1191 }
1192
1193 /* exef1t */
1194 void
1195 OP_4E42 (void)
1196 {
1197   trace_input ("exef1t", OP_VOID, OP_VOID, OP_VOID);
1198   State.exe = (PSW_F1 != 0);
1199   trace_output_flag ();
1200 }
1201
1202 /* exefaf */
1203 void
1204 OP_4E00 (void)
1205 {
1206   trace_input ("exefaf", OP_VOID, OP_VOID, OP_VOID);
1207   State.exe = (PSW_F0 == 0) & (PSW_F1 == 0);
1208   trace_output_flag ();
1209 }
1210
1211 /* exefat */
1212 void
1213 OP_4E02 (void)
1214 {
1215   trace_input ("exefat", OP_VOID, OP_VOID, OP_VOID);
1216   State.exe = (PSW_F0 == 0) & (PSW_F1 != 0);
1217   trace_output_flag ();
1218 }
1219
1220 /* exetaf */
1221 void
1222 OP_4E20 (void)
1223 {
1224   trace_input ("exetaf", OP_VOID, OP_VOID, OP_VOID);
1225   State.exe = (PSW_F0 != 0) & (PSW_F1 == 0);
1226   trace_output_flag ();
1227 }
1228
1229 /* exetat */
1230 void
1231 OP_4E22 (void)
1232 {
1233   trace_input ("exetat", OP_VOID, OP_VOID, OP_VOID);
1234   State.exe = (PSW_F0 != 0) & (PSW_F1 != 0);
1235   trace_output_flag ();
1236 }
1237
1238 /* exp */
1239 void
1240 OP_15002A00 (void)
1241 {
1242   uint32 tmp, foo;
1243   int i;
1244
1245   trace_input ("exp", OP_REG_OUTPUT, OP_DREG, OP_VOID);
1246   if (((int16)GPR (OP[1])) >= 0)
1247     tmp = (GPR (OP[1]) << 16) | GPR (OP[1] + 1);
1248   else
1249     tmp = ~((GPR (OP[1]) << 16) | GPR (OP[1] + 1));
1250   
1251   foo = 0x40000000;
1252   for (i=1;i<17;i++)
1253     {
1254       if (tmp & foo)
1255         {
1256           SET_GPR (OP[0], (i - 1));
1257           trace_output_16 (i - 1);
1258           return;
1259         }
1260       foo >>= 1;
1261     }
1262   SET_GPR (OP[0], 16);
1263   trace_output_16 (16);
1264 }
1265
1266 /* exp */
1267 void
1268 OP_15002A02 (void)
1269 {
1270   int64 tmp, foo;
1271   int i;
1272
1273   trace_input ("exp", OP_REG_OUTPUT, OP_ACCUM, OP_VOID);
1274   tmp = SEXT40(ACC (OP[1]));
1275   if (tmp < 0)
1276     tmp = ~tmp & MASK40;
1277   
1278   foo = 0x4000000000LL;
1279   for (i=1;i<25;i++)
1280     {
1281       if (tmp & foo)
1282         {
1283           SET_GPR (OP[0], i - 9);
1284           trace_output_16 (i - 9);
1285           return;
1286         }
1287       foo >>= 1;
1288     }
1289   SET_GPR (OP[0], 16);
1290   trace_output_16 (16);
1291 }
1292
1293 /* jl */
1294 void
1295 OP_4D00 (void)
1296 {
1297   trace_input ("jl", OP_REG, OP_R0, OP_R1);
1298   SET_GPR (13, PC + 1);
1299   JMP (GPR (OP[0]));
1300   trace_output_void ();
1301 }
1302
1303 /* jmp */
1304 void
1305 OP_4C00 (void)
1306 {
1307   trace_input ("jmp", OP_REG,
1308                (OP[0] == 13) ? OP_R0 : OP_VOID,
1309                (OP[0] == 13) ? OP_R1 : OP_VOID);
1310
1311   JMP (GPR (OP[0]));
1312   trace_output_void ();
1313 }
1314
1315 /* ld */
1316 void
1317 OP_30000000 (void)
1318 {
1319   uint16 tmp;
1320   uint16 addr = OP[1] + GPR (OP[2]);
1321   trace_input ("ld", OP_REG_OUTPUT, OP_MEMREF2, OP_VOID);
1322   if ((addr & 1))
1323     {
1324       State.exception = SIG_D10V_BUS;
1325       State.pc_changed = 1; /* Don't increment the PC. */
1326       trace_output_void ();
1327       return;
1328     }
1329   tmp = RW (addr);
1330   SET_GPR (OP[0], tmp);
1331   trace_output_16 (tmp);
1332 }
1333
1334 /* ld */
1335 void
1336 OP_6401 (void)
1337 {
1338   uint16 tmp;
1339   uint16 addr = GPR (OP[1]);
1340   trace_input ("ld", OP_REG_OUTPUT, OP_POSTDEC, OP_VOID);
1341   if ((addr & 1))
1342     {
1343       State.exception = SIG_D10V_BUS;
1344       State.pc_changed = 1; /* Don't increment the PC. */
1345       trace_output_void ();
1346       return;
1347     }
1348   tmp = RW (addr);
1349   SET_GPR (OP[0], tmp);
1350   if (OP[0] != OP[1])
1351     INC_ADDR (OP[1], -2);
1352   trace_output_16 (tmp);
1353 }
1354
1355 /* ld */
1356 void
1357 OP_6001 (void)
1358 {
1359   uint16 tmp;
1360   uint16 addr = GPR (OP[1]);
1361   trace_input ("ld", OP_REG_OUTPUT, OP_POSTINC, OP_VOID);
1362   if ((addr & 1))
1363     {
1364       State.exception = SIG_D10V_BUS;
1365       State.pc_changed = 1; /* Don't increment the PC. */
1366       trace_output_void ();
1367       return;
1368     }
1369   tmp = RW (addr);
1370   SET_GPR (OP[0], tmp);
1371   if (OP[0] != OP[1])
1372     INC_ADDR (OP[1], 2);
1373   trace_output_16 (tmp);
1374 }
1375
1376 /* ld */
1377 void
1378 OP_6000 (void)
1379 {
1380   uint16 tmp;
1381   uint16 addr = GPR (OP[1]);
1382   trace_input ("ld", OP_REG_OUTPUT, OP_MEMREF, OP_VOID);
1383   if ((addr & 1))
1384     {
1385       State.exception = SIG_D10V_BUS;
1386       State.pc_changed = 1; /* Don't increment the PC. */
1387       trace_output_void ();
1388       return;
1389     }
1390   tmp = RW (addr);
1391   SET_GPR (OP[0], tmp);
1392   trace_output_16 (tmp);
1393 }
1394
1395 /* ld */
1396 void
1397 OP_32010000 (void)
1398 {
1399   uint16 tmp;
1400   uint16 addr = OP[1];
1401   trace_input ("ld", OP_REG_OUTPUT, OP_MEMREF3, OP_VOID);
1402   if ((addr & 1))
1403     {
1404       State.exception = SIG_D10V_BUS;
1405       State.pc_changed = 1; /* Don't increment the PC. */
1406       trace_output_void ();
1407       return;
1408     }
1409   tmp = RW (addr);
1410   SET_GPR (OP[0], tmp);
1411   trace_output_16 (tmp);
1412 }
1413
1414 /* ld2w */
1415 void
1416 OP_31000000 (void)
1417 {
1418   int32 tmp;
1419   uint16 addr = OP[1] + GPR (OP[2]);
1420   trace_input ("ld2w", OP_REG_OUTPUT, OP_MEMREF2, OP_VOID);
1421   if ((addr & 1))
1422     {
1423       State.exception = SIG_D10V_BUS;
1424       State.pc_changed = 1; /* Don't increment the PC. */
1425       trace_output_void ();
1426       return;
1427     }
1428   tmp = RLW (addr);
1429   SET_GPR32 (OP[0], tmp);
1430   trace_output_32 (tmp);
1431 }
1432
1433 /* ld2w */
1434 void
1435 OP_6601 (void)
1436 {
1437   uint16 addr = GPR (OP[1]);
1438   int32 tmp;
1439   trace_input ("ld2w", OP_REG_OUTPUT, OP_POSTDEC, OP_VOID);
1440   if ((addr & 1))
1441     {
1442       State.exception = SIG_D10V_BUS;
1443       State.pc_changed = 1; /* Don't increment the PC. */
1444       trace_output_void ();
1445       return;
1446     }
1447   tmp = RLW (addr);
1448   SET_GPR32 (OP[0], tmp);
1449   if (OP[0] != OP[1] && ((OP[0] + 1) != OP[1]))
1450     INC_ADDR (OP[1], -4);
1451   trace_output_32 (tmp);
1452 }
1453
1454 /* ld2w */
1455 void
1456 OP_6201 (void)
1457 {
1458   int32 tmp;
1459   uint16 addr = GPR (OP[1]);
1460   trace_input ("ld2w", OP_REG_OUTPUT, OP_POSTINC, OP_VOID);
1461   if ((addr & 1))
1462     {
1463       State.exception = SIG_D10V_BUS;
1464       State.pc_changed = 1; /* Don't increment the PC. */
1465       trace_output_void ();
1466       return;
1467     }
1468   tmp = RLW (addr);
1469   SET_GPR32 (OP[0], tmp);
1470   if (OP[0] != OP[1] && ((OP[0] + 1) != OP[1]))
1471     INC_ADDR (OP[1], 4);
1472   trace_output_32 (tmp);
1473 }
1474
1475 /* ld2w */
1476 void
1477 OP_6200 (void)
1478 {
1479   uint16 addr = GPR (OP[1]);
1480   int32 tmp;
1481   trace_input ("ld2w", OP_REG_OUTPUT, OP_MEMREF, OP_VOID);
1482   if ((addr & 1))
1483     {
1484       State.exception = SIG_D10V_BUS;
1485       State.pc_changed = 1; /* Don't increment the PC. */
1486       trace_output_void ();
1487       return;
1488     }
1489   tmp = RLW (addr);
1490   SET_GPR32 (OP[0], tmp);
1491   trace_output_32 (tmp);
1492 }
1493
1494 /* ld2w */
1495 void
1496 OP_33010000 (void)
1497 {
1498   int32 tmp;
1499   uint16 addr = OP[1];
1500   trace_input ("ld2w", OP_REG_OUTPUT, OP_MEMREF3, OP_VOID);
1501   if ((addr & 1))
1502     {
1503       State.exception = SIG_D10V_BUS;
1504       State.pc_changed = 1; /* Don't increment the PC. */
1505       trace_output_void ();
1506       return;
1507     }
1508   tmp = RLW (addr);
1509   SET_GPR32 (OP[0], tmp);
1510   trace_output_32 (tmp);
1511 }
1512
1513 /* ldb */
1514 void
1515 OP_38000000 (void)
1516 {
1517   int16 tmp;
1518   trace_input ("ldb", OP_REG_OUTPUT, OP_MEMREF2, OP_VOID);
1519   tmp = SEXT8 (RB (OP[1] + GPR (OP[2])));
1520   SET_GPR (OP[0], tmp);
1521   trace_output_16 (tmp);
1522 }
1523
1524 /* ldb */
1525 void
1526 OP_7000 (void)
1527 {
1528   int16 tmp;
1529   trace_input ("ldb", OP_REG_OUTPUT, OP_MEMREF, OP_VOID);
1530   tmp = SEXT8 (RB (GPR (OP[1])));
1531   SET_GPR (OP[0], tmp);
1532   trace_output_16 (tmp);
1533 }
1534
1535 /* ldi.s */
1536 void
1537 OP_4001 (void)
1538 {
1539   int16 tmp;
1540   trace_input ("ldi.s", OP_REG_OUTPUT, OP_CONSTANT4, OP_VOID);
1541   tmp = SEXT4 (OP[1]);
1542   SET_GPR (OP[0], tmp);
1543   trace_output_16 (tmp);
1544 }
1545
1546 /* ldi.l */
1547 void
1548 OP_20000000 (void)
1549 {
1550   int16 tmp;
1551   trace_input ("ldi.l", OP_REG_OUTPUT, OP_CONSTANT16, OP_VOID);
1552   tmp = OP[1];
1553   SET_GPR (OP[0], tmp);
1554   trace_output_16 (tmp);
1555 }
1556
1557 /* ldub */
1558 void
1559 OP_39000000 (void)
1560 {
1561   int16 tmp;
1562   trace_input ("ldub", OP_REG_OUTPUT, OP_MEMREF2, OP_VOID);
1563   tmp = RB (OP[1] + GPR (OP[2]));
1564   SET_GPR (OP[0], tmp);
1565   trace_output_16 (tmp);
1566 }
1567
1568 /* ldub */
1569 void
1570 OP_7200 (void)
1571 {
1572   int16 tmp;
1573   trace_input ("ldub", OP_REG_OUTPUT, OP_MEMREF, OP_VOID);
1574   tmp = RB (GPR (OP[1]));
1575   SET_GPR (OP[0], tmp);
1576   trace_output_16 (tmp);
1577 }
1578
1579 /* mac */
1580 void
1581 OP_2A00 (void)
1582 {
1583   int64 tmp;
1584
1585   trace_input ("mac", OP_ACCUM, OP_REG, OP_REG);
1586   tmp = SEXT40 ((int16)(GPR (OP[1])) * (int16)(GPR (OP[2])));
1587
1588   if (PSW_FX)
1589     tmp = SEXT40( (tmp << 1) & MASK40);
1590
1591   if (PSW_ST && tmp > SEXT40(MAX32))
1592     tmp = (MAX32);
1593
1594   tmp += SEXT40 (ACC (OP[0]));
1595   if (PSW_ST)
1596     {
1597       if (tmp > SEXT40(MAX32))
1598         tmp = (MAX32);
1599       else if (tmp < SEXT40(MIN32))
1600         tmp = (MIN32);
1601       else
1602         tmp = (tmp & MASK40);
1603     }
1604   else
1605     tmp = (tmp & MASK40);
1606   SET_ACC (OP[0], tmp);
1607   trace_output_40 (tmp);
1608 }
1609
1610 /* macsu */
1611 void
1612 OP_1A00 (void)
1613 {
1614   int64 tmp;
1615
1616   trace_input ("macsu", OP_ACCUM, OP_REG, OP_REG);
1617   tmp = SEXT40 ((int16) GPR (OP[1]) * GPR (OP[2]));
1618   if (PSW_FX)
1619     tmp = SEXT40 ((tmp << 1) & MASK40);
1620   tmp = ((SEXT40 (ACC (OP[0])) + tmp) & MASK40);
1621   SET_ACC (OP[0], tmp);
1622   trace_output_40 (tmp);
1623 }
1624
1625 /* macu */
1626 void
1627 OP_3A00 (void)
1628 {
1629   uint64 tmp;
1630   uint32 src1;
1631   uint32 src2;
1632
1633   trace_input ("macu", OP_ACCUM, OP_REG, OP_REG);
1634   src1 = (uint16) GPR (OP[1]);
1635   src2 = (uint16) GPR (OP[2]);
1636   tmp = src1 * src2;
1637   if (PSW_FX)
1638     tmp = (tmp << 1);
1639   tmp = ((ACC (OP[0]) + tmp) & MASK40);
1640   SET_ACC (OP[0], tmp);
1641   trace_output_40 (tmp);
1642 }
1643
1644 /* max */
1645 void
1646 OP_2600 (void)
1647 {
1648   int16 tmp;
1649   trace_input ("max", OP_REG, OP_REG, OP_VOID);
1650   SET_PSW_F1 (PSW_F0);
1651   if ((int16) GPR (OP[1]) > (int16)GPR (OP[0]))
1652     {
1653       tmp = GPR (OP[1]);
1654       SET_PSW_F0 (1);
1655     }
1656   else
1657     {
1658       tmp = GPR (OP[0]);
1659       SET_PSW_F0 (0);    
1660     }
1661   SET_GPR (OP[0], tmp);
1662   trace_output_16 (tmp);
1663 }
1664
1665 /* max */
1666 void
1667 OP_3600 (void)
1668 {
1669   int64 tmp;
1670
1671   trace_input ("max", OP_ACCUM, OP_DREG, OP_VOID);
1672   SET_PSW_F1 (PSW_F0);
1673   tmp = SEXT16 (GPR (OP[1])) << 16 | GPR (OP[1] + 1);
1674   if (tmp > SEXT40 (ACC (OP[0])))
1675     {
1676       tmp = (tmp & MASK40);
1677       SET_PSW_F0 (1);
1678     }
1679   else
1680     {
1681       tmp = ACC (OP[0]);
1682       SET_PSW_F0 (0);
1683     }
1684   SET_ACC (OP[0], tmp);
1685   trace_output_40 (tmp);
1686 }
1687
1688 /* max */
1689 void
1690 OP_3602 (void)
1691 {
1692   int64 tmp;
1693   trace_input ("max", OP_ACCUM, OP_ACCUM, OP_VOID);
1694   SET_PSW_F1 (PSW_F0);
1695   if (SEXT40 (ACC (OP[1])) > SEXT40 (ACC (OP[0])))
1696     {
1697       tmp = ACC (OP[1]);
1698       SET_PSW_F0 (1);
1699     }
1700   else
1701     {
1702       tmp = ACC (OP[0]);
1703       SET_PSW_F0 (0);
1704     }
1705   SET_ACC (OP[0], tmp);
1706   trace_output_40 (tmp);
1707 }
1708
1709
1710 /* min */
1711 void
1712 OP_2601 (void)
1713 {
1714   int16 tmp;
1715   trace_input ("min", OP_REG, OP_REG, OP_VOID);
1716   SET_PSW_F1 (PSW_F0);
1717   if ((int16)GPR (OP[1]) < (int16)GPR (OP[0]))
1718     {
1719       tmp = GPR (OP[1]);
1720       SET_PSW_F0 (1);
1721     }
1722   else
1723     {
1724       tmp = GPR (OP[0]);
1725       SET_PSW_F0 (0);    
1726     }
1727   SET_GPR (OP[0], tmp);
1728   trace_output_16 (tmp);
1729 }
1730
1731 /* min */
1732 void
1733 OP_3601 (void)
1734 {
1735   int64 tmp;
1736
1737   trace_input ("min", OP_ACCUM, OP_DREG, OP_VOID);
1738   SET_PSW_F1 (PSW_F0);
1739   tmp = SEXT16 (GPR (OP[1])) << 16 | GPR (OP[1] + 1);
1740   if (tmp < SEXT40(ACC (OP[0])))
1741     {
1742       tmp = (tmp & MASK40);
1743       SET_PSW_F0 (1);
1744     }
1745   else
1746     {
1747       tmp = ACC (OP[0]);
1748       SET_PSW_F0 (0);
1749     }
1750   SET_ACC (OP[0], tmp);
1751   trace_output_40 (tmp);
1752 }
1753
1754 /* min */
1755 void
1756 OP_3603 (void)
1757 {
1758   int64 tmp;
1759   trace_input ("min", OP_ACCUM, OP_ACCUM, OP_VOID);
1760   SET_PSW_F1 (PSW_F0);
1761   if (SEXT40(ACC (OP[1])) < SEXT40(ACC (OP[0])))
1762     {
1763       tmp = ACC (OP[1]);
1764       SET_PSW_F0 (1);
1765     }
1766   else
1767     {
1768       tmp = ACC (OP[0]);
1769       SET_PSW_F0 (0);
1770     }
1771   SET_ACC (OP[0], tmp);
1772   trace_output_40 (tmp);
1773 }
1774
1775 /* msb */
1776 void
1777 OP_2800 (void)
1778 {
1779   int64 tmp;
1780
1781   trace_input ("msb", OP_ACCUM, OP_REG, OP_REG);
1782   tmp = SEXT40 ((int16)(GPR (OP[1])) * (int16)(GPR (OP[2])));
1783
1784   if (PSW_FX)
1785     tmp = SEXT40 ((tmp << 1) & MASK40);
1786
1787   if (PSW_ST && tmp > SEXT40(MAX32))
1788     tmp = (MAX32);
1789
1790   tmp = SEXT40(ACC (OP[0])) - tmp;
1791   if (PSW_ST)
1792     {
1793       if (tmp > SEXT40(MAX32))
1794         tmp = (MAX32);
1795       else if (tmp < SEXT40(MIN32))
1796         tmp = (MIN32);
1797       else
1798         tmp = (tmp & MASK40);
1799     }
1800   else
1801     {
1802       tmp = (tmp & MASK40);
1803     }
1804   SET_ACC (OP[0], tmp);
1805   trace_output_40 (tmp);
1806 }
1807
1808 /* msbsu */
1809 void
1810 OP_1800 (void)
1811 {
1812   int64 tmp;
1813
1814   trace_input ("msbsu", OP_ACCUM, OP_REG, OP_REG);
1815   tmp = SEXT40 ((int16)GPR (OP[1]) * GPR (OP[2]));
1816   if (PSW_FX)
1817     tmp = SEXT40( (tmp << 1) & MASK40);
1818   tmp = ((SEXT40 (ACC (OP[0])) - tmp) & MASK40);
1819   SET_ACC (OP[0], tmp);
1820   trace_output_40 (tmp);
1821 }
1822
1823 /* msbu */
1824 void
1825 OP_3800 (void)
1826 {
1827   uint64 tmp;
1828   uint32 src1;
1829   uint32 src2;
1830
1831   trace_input ("msbu", OP_ACCUM, OP_REG, OP_REG);
1832   src1 = (uint16) GPR (OP[1]);
1833   src2 = (uint16) GPR (OP[2]);
1834   tmp = src1 * src2;
1835   if (PSW_FX)
1836     tmp = (tmp << 1);
1837   tmp = ((ACC (OP[0]) - tmp) & MASK40);
1838   SET_ACC (OP[0], tmp);
1839   trace_output_40 (tmp);
1840 }
1841
1842 /* mul */
1843 void
1844 OP_2E00 (void)
1845 {
1846   int16 tmp;
1847   trace_input ("mul", OP_REG, OP_REG, OP_VOID);
1848   tmp = GPR (OP[0]) * GPR (OP[1]);
1849   SET_GPR (OP[0], tmp);
1850   trace_output_16 (tmp);
1851 }
1852
1853 /* mulx */
1854 void
1855 OP_2C00 (void)
1856 {
1857   int64 tmp;
1858
1859   trace_input ("mulx", OP_ACCUM_OUTPUT, OP_REG, OP_REG);
1860   tmp = SEXT40 ((int16)(GPR (OP[1])) * (int16)(GPR (OP[2])));
1861
1862   if (PSW_FX)
1863     tmp = SEXT40 ((tmp << 1) & MASK40);
1864
1865   if (PSW_ST && tmp > SEXT40(MAX32))
1866     tmp = (MAX32);
1867   else
1868     tmp = (tmp & MASK40);
1869   SET_ACC (OP[0], tmp);
1870   trace_output_40 (tmp);
1871 }
1872
1873 /* mulxsu */
1874 void
1875 OP_1C00 (void)
1876 {
1877   int64 tmp;
1878
1879   trace_input ("mulxsu", OP_ACCUM_OUTPUT, OP_REG, OP_REG);
1880   tmp = SEXT40 ((int16)(GPR (OP[1])) * GPR (OP[2]));
1881
1882   if (PSW_FX)
1883     tmp <<= 1;
1884   tmp = (tmp & MASK40);
1885   SET_ACC (OP[0], tmp);
1886   trace_output_40 (tmp);
1887 }
1888
1889 /* mulxu */
1890 void
1891 OP_3C00 (void)
1892 {
1893   uint64 tmp;
1894   uint32 src1;
1895   uint32 src2;
1896
1897   trace_input ("mulxu", OP_ACCUM_OUTPUT, OP_REG, OP_REG);
1898   src1 = (uint16) GPR (OP[1]);
1899   src2 = (uint16) GPR (OP[2]);
1900   tmp = src1 * src2;
1901   if (PSW_FX)
1902     tmp <<= 1;
1903   tmp = (tmp & MASK40);
1904   SET_ACC (OP[0], tmp);
1905   trace_output_40 (tmp);
1906 }
1907
1908 /* mv */
1909 void
1910 OP_4000 (void)
1911 {
1912   int16 tmp;
1913   trace_input ("mv", OP_REG_OUTPUT, OP_REG, OP_VOID);
1914   tmp = GPR (OP[1]);
1915   SET_GPR (OP[0], tmp);
1916   trace_output_16 (tmp);
1917 }
1918
1919 /* mv2w */
1920 void
1921 OP_5000 (void)
1922 {
1923   int32 tmp;
1924   trace_input ("mv2w", OP_DREG_OUTPUT, OP_DREG, OP_VOID);
1925   tmp = GPR32 (OP[1]);
1926   SET_GPR32 (OP[0], tmp);
1927   trace_output_32 (tmp);
1928 }
1929
1930 /* mv2wfac */
1931 void
1932 OP_3E00 (void)
1933 {
1934   int32 tmp;
1935   trace_input ("mv2wfac", OP_DREG_OUTPUT, OP_ACCUM, OP_VOID);
1936   tmp = ACC (OP[1]);
1937   SET_GPR32 (OP[0], tmp);
1938   trace_output_32 (tmp);
1939 }
1940
1941 /* mv2wtac */
1942 void
1943 OP_3E01 (void)
1944 {
1945   int64 tmp;
1946   trace_input ("mv2wtac", OP_DREG, OP_ACCUM_OUTPUT, OP_VOID);
1947   tmp = ((SEXT16 (GPR (OP[0])) << 16 | GPR (OP[0] + 1)) & MASK40);
1948   SET_ACC (OP[1], tmp);
1949   trace_output_40 (tmp);
1950 }
1951
1952 /* mvac */
1953 void
1954 OP_3E03 (void)
1955 {
1956   int64 tmp;
1957   trace_input ("mvac", OP_ACCUM_OUTPUT, OP_ACCUM, OP_VOID);
1958   tmp = ACC (OP[1]);
1959   SET_ACC (OP[0], tmp);
1960   trace_output_40 (tmp);
1961 }
1962
1963 /* mvb */
1964 void
1965 OP_5400 (void)
1966 {
1967   int16 tmp;
1968   trace_input ("mvb", OP_REG_OUTPUT, OP_REG, OP_VOID);
1969   tmp = SEXT8 (GPR (OP[1]) & 0xff);
1970   SET_GPR (OP[0], tmp);
1971   trace_output_16 (tmp);
1972 }
1973
1974 /* mvf0f */
1975 void
1976 OP_4400 (void)
1977 {
1978   int16 tmp;
1979   trace_input ("mvf0f", OP_REG_OUTPUT, OP_REG, OP_VOID);
1980   if (PSW_F0 == 0)
1981     {
1982       tmp = GPR (OP[1]);
1983       SET_GPR (OP[0], tmp);
1984     }
1985   else
1986     tmp = GPR (OP[0]);
1987   trace_output_16 (tmp);
1988 }
1989
1990 /* mvf0t */
1991 void
1992 OP_4401 (void)
1993 {
1994   int16 tmp;
1995   trace_input ("mvf0t", OP_REG_OUTPUT, OP_REG, OP_VOID);
1996   if (PSW_F0)
1997     {
1998       tmp = GPR (OP[1]);
1999       SET_GPR (OP[0], tmp);
2000     }
2001   else
2002     tmp = GPR (OP[0]);
2003   trace_output_16 (tmp);
2004 }
2005
2006 /* mvfacg */
2007 void
2008 OP_1E04 (void)
2009 {
2010   int16 tmp;
2011   trace_input ("mvfacg", OP_REG_OUTPUT, OP_ACCUM, OP_VOID);
2012   tmp = ((ACC (OP[1]) >> 32) & 0xff);
2013   SET_GPR (OP[0], tmp);
2014   trace_output_16 (tmp);
2015 }
2016
2017 /* mvfachi */
2018 void
2019 OP_1E00 (void)
2020 {
2021   int16 tmp;
2022   trace_input ("mvfachi", OP_REG_OUTPUT, OP_ACCUM, OP_VOID);
2023   tmp = (ACC (OP[1]) >> 16);  
2024   SET_GPR (OP[0], tmp);  
2025   trace_output_16 (tmp);
2026 }
2027
2028 /* mvfaclo */
2029 void
2030 OP_1E02 (void)
2031 {
2032   int16 tmp;
2033   trace_input ("mvfaclo", OP_REG_OUTPUT, OP_ACCUM, OP_VOID);
2034   tmp = ACC (OP[1]);
2035   SET_GPR (OP[0], tmp);
2036   trace_output_16 (tmp);
2037 }
2038
2039 /* mvfc */
2040 void
2041 OP_5200 (void)
2042 {
2043   int16 tmp;
2044   trace_input ("mvfc", OP_REG_OUTPUT, OP_CR, OP_VOID);
2045   tmp = CREG (OP[1]);
2046   SET_GPR (OP[0], tmp);
2047   trace_output_16 (tmp);
2048 }
2049
2050 /* mvtacg */
2051 void
2052 OP_1E41 (void)
2053 {
2054   int64 tmp;
2055   trace_input ("mvtacg", OP_REG, OP_ACCUM, OP_VOID);
2056   tmp = ((ACC (OP[1]) & MASK32)
2057          | ((int64)(GPR (OP[0]) & 0xff) << 32));
2058   SET_ACC (OP[1], tmp);
2059   trace_output_40 (tmp);
2060 }
2061
2062 /* mvtachi */
2063 void
2064 OP_1E01 (void)
2065 {
2066   uint64 tmp;
2067   trace_input ("mvtachi", OP_REG, OP_ACCUM, OP_VOID);
2068   tmp = ACC (OP[1]) & 0xffff;
2069   tmp = ((SEXT16 (GPR (OP[0])) << 16 | tmp) & MASK40);
2070   SET_ACC (OP[1], tmp);
2071   trace_output_40 (tmp);
2072 }
2073
2074 /* mvtaclo */
2075 void
2076 OP_1E21 (void)
2077 {
2078   int64 tmp;
2079   trace_input ("mvtaclo", OP_REG, OP_ACCUM, OP_VOID);
2080   tmp = ((SEXT16 (GPR (OP[0]))) & MASK40);
2081   SET_ACC (OP[1], tmp);
2082   trace_output_40 (tmp);
2083 }
2084
2085 /* mvtc */
2086 void
2087 OP_5600 (void)
2088 {
2089   int16 tmp;
2090   trace_input ("mvtc", OP_REG, OP_CR_OUTPUT, OP_VOID);
2091   tmp = GPR (OP[0]);
2092   tmp = SET_CREG (OP[1], tmp);
2093   trace_output_16 (tmp);
2094 }
2095
2096 /* mvub */
2097 void
2098 OP_5401 (void)
2099 {
2100   int16 tmp;
2101   trace_input ("mvub", OP_REG_OUTPUT, OP_REG, OP_VOID);
2102   tmp = (GPR (OP[1]) & 0xff);
2103   SET_GPR (OP[0], tmp);
2104   trace_output_16 (tmp);
2105 }
2106
2107 /* neg */
2108 void
2109 OP_4605 (void)
2110 {
2111   int16 tmp;
2112   trace_input ("neg", OP_REG, OP_VOID, OP_VOID);
2113   tmp = - GPR (OP[0]);
2114   SET_GPR (OP[0], tmp);
2115   trace_output_16 (tmp);
2116 }
2117
2118 /* neg */
2119 void
2120 OP_5605 (void)
2121 {
2122   int64 tmp;
2123
2124   trace_input ("neg", OP_ACCUM, OP_VOID, OP_VOID);
2125   tmp = -SEXT40(ACC (OP[0]));
2126   if (PSW_ST)
2127     {
2128       if (tmp > SEXT40(MAX32))
2129         tmp = (MAX32);
2130       else if (tmp < SEXT40(MIN32))
2131         tmp = (MIN32);
2132       else
2133         tmp = (tmp & MASK40);
2134     }
2135   else
2136     tmp = (tmp & MASK40);
2137   SET_ACC (OP[0], tmp);
2138   trace_output_40 (tmp);
2139 }
2140
2141
2142 /* nop */
2143 void
2144 OP_5E00 (void)
2145 {
2146   trace_input ("nop", OP_VOID, OP_VOID, OP_VOID);
2147
2148   ins_type_counters[ (int)State.ins_type ]--;   /* don't count nops as normal instructions */
2149   switch (State.ins_type)
2150     {
2151     default:
2152       ins_type_counters[ (int)INS_UNKNOWN ]++;
2153       break;
2154
2155     case INS_LEFT_PARALLEL:
2156       /* Don't count a parallel op that includes a NOP as a true parallel op */
2157       ins_type_counters[ (int)INS_RIGHT_PARALLEL ]--;
2158       ins_type_counters[ (int)INS_RIGHT ]++;
2159       ins_type_counters[ (int)INS_LEFT_NOPS ]++;
2160       break;
2161
2162     case INS_LEFT:
2163     case INS_LEFT_COND_EXE:
2164       ins_type_counters[ (int)INS_LEFT_NOPS ]++;
2165       break;
2166
2167     case INS_RIGHT_PARALLEL:
2168       /* Don't count a parallel op that includes a NOP as a true parallel op */
2169       ins_type_counters[ (int)INS_LEFT_PARALLEL ]--;
2170       ins_type_counters[ (int)INS_LEFT ]++;
2171       ins_type_counters[ (int)INS_RIGHT_NOPS ]++;
2172       break;
2173
2174     case INS_RIGHT:
2175     case INS_RIGHT_COND_EXE:
2176       ins_type_counters[ (int)INS_RIGHT_NOPS ]++;
2177       break;
2178     }
2179
2180   trace_output_void ();
2181 }
2182
2183 /* not */
2184 void
2185 OP_4603 (void)
2186 {
2187   int16 tmp;
2188   trace_input ("not", OP_REG, OP_VOID, OP_VOID);
2189   tmp = ~GPR (OP[0]);  
2190   SET_GPR (OP[0], tmp);  
2191   trace_output_16 (tmp);
2192 }
2193
2194 /* or */
2195 void
2196 OP_800 (void)
2197 {
2198   int16 tmp;
2199   trace_input ("or", OP_REG, OP_REG, OP_VOID);
2200   tmp = (GPR (OP[0]) | GPR (OP[1]));
2201   SET_GPR (OP[0], tmp);
2202   trace_output_16 (tmp);
2203 }
2204
2205 /* or3 */
2206 void
2207 OP_4000000 (void)
2208 {
2209   int16 tmp;
2210   trace_input ("or3", OP_REG_OUTPUT, OP_REG, OP_CONSTANT16);
2211   tmp = (GPR (OP[1]) | OP[2]);
2212   SET_GPR (OP[0], tmp);
2213   trace_output_16 (tmp);
2214 }
2215
2216 /* rac */
2217 void
2218 OP_5201 (void)
2219 {
2220   int64 tmp;
2221   int shift = SEXT3 (OP[2]);
2222
2223   trace_input ("rac", OP_DREG_OUTPUT, OP_ACCUM, OP_CONSTANT3);
2224   if (OP[1] != 0)
2225     {
2226       (*d10v_callback->printf_filtered) (d10v_callback,
2227                                          "ERROR at PC 0x%x: instruction only valid for A0\n",
2228                                          PC<<2);
2229       State.exception = SIGILL;
2230     }
2231
2232   SET_PSW_F1 (PSW_F0);
2233   tmp = SEXT56 ((ACC (0) << 16) | (ACC (1) & 0xffff));
2234   if (shift >=0)
2235     tmp <<= shift;
2236   else
2237     tmp >>= -shift;
2238   tmp += 0x8000;
2239   tmp >>= 16; /* look at bits 0:43 */
2240   if (tmp > SEXT44 (SIGNED64 (0x0007fffffff)))
2241     {
2242       tmp = 0x7fffffff;
2243       SET_PSW_F0 (1);
2244     } 
2245   else if (tmp < SEXT44 (SIGNED64 (0xfff80000000)))
2246     {
2247       tmp = 0x80000000;
2248       SET_PSW_F0 (1);
2249     } 
2250   else
2251     {
2252       SET_PSW_F0 (0);
2253     }
2254   SET_GPR32 (OP[0], tmp);
2255   trace_output_32 (tmp);
2256 }
2257
2258 /* rachi */
2259 void
2260 OP_4201 (void)
2261 {
2262   signed64 tmp;
2263   int shift = SEXT3 (OP[2]);
2264
2265   trace_input ("rachi", OP_REG_OUTPUT, OP_ACCUM, OP_CONSTANT3);
2266   SET_PSW_F1 (PSW_F0);
2267   if (shift >=0)
2268     tmp = SEXT40 (ACC (OP[1])) << shift;
2269   else
2270     tmp = SEXT40 (ACC (OP[1])) >> -shift;
2271   tmp += 0x8000;
2272
2273   if (tmp > SEXT44 (SIGNED64 (0x0007fffffff)))
2274     {
2275       tmp = 0x7fff;
2276       SET_PSW_F0 (1);
2277     }
2278   else if (tmp < SEXT44 (SIGNED64 (0xfff80000000)))
2279     {
2280       tmp = 0x8000;
2281       SET_PSW_F0 (1);
2282     }
2283   else
2284     {
2285       tmp = (tmp >> 16);
2286       SET_PSW_F0 (0);
2287     }
2288   SET_GPR (OP[0], tmp);
2289   trace_output_16 (tmp);
2290 }
2291
2292 /* rep */
2293 void
2294 OP_27000000 (void)
2295 {
2296   trace_input ("rep", OP_REG, OP_CONSTANT16, OP_VOID);
2297   SET_RPT_S (PC + 1);
2298   SET_RPT_E (PC + OP[1]);
2299   SET_RPT_C (GPR (OP[0]));
2300   SET_PSW_RP (1);
2301   if (GPR (OP[0]) == 0)
2302     {
2303       (*d10v_callback->printf_filtered) (d10v_callback, "ERROR: rep with count=0 is illegal.\n");
2304       State.exception = SIGILL;
2305     }
2306   if (OP[1] < 4)
2307     {
2308       (*d10v_callback->printf_filtered) (d10v_callback, "ERROR: rep must include at least 4 instructions.\n");
2309       State.exception = SIGILL;
2310     }
2311   trace_output_void ();
2312 }
2313
2314 /* repi */
2315 void
2316 OP_2F000000 (void)
2317 {
2318   trace_input ("repi", OP_CONSTANT16, OP_CONSTANT16, OP_VOID);
2319   SET_RPT_S (PC + 1);
2320   SET_RPT_E (PC + OP[1]);
2321   SET_RPT_C (OP[0]);
2322   SET_PSW_RP (1);
2323   if (OP[0] == 0)
2324     {
2325       (*d10v_callback->printf_filtered) (d10v_callback, "ERROR: repi with count=0 is illegal.\n");
2326       State.exception = SIGILL;
2327     }
2328   if (OP[1] < 4)
2329     {
2330       (*d10v_callback->printf_filtered) (d10v_callback, "ERROR: repi must include at least 4 instructions.\n");
2331       State.exception = SIGILL;
2332     }
2333   trace_output_void ();
2334 }
2335
2336 /* rtd */
2337 void
2338 OP_5F60 (void)
2339 {
2340   trace_input ("rtd", OP_VOID, OP_VOID, OP_VOID);
2341   SET_CREG (PSW_CR, DPSW);
2342   JMP(DPC);
2343   trace_output_void ();
2344 }
2345
2346 /* rte */
2347 void
2348 OP_5F40 (void)
2349 {
2350   trace_input ("rte", OP_VOID, OP_VOID, OP_VOID);
2351   SET_CREG (PSW_CR, BPSW);
2352   JMP(BPC);
2353   trace_output_void ();
2354 }
2355
2356 /* sac */
2357 void OP_5209 (void)
2358 {
2359   int64 tmp;
2360
2361   trace_input ("sac", OP_REG_OUTPUT, OP_ACCUM, OP_VOID);
2362
2363   tmp = SEXT40(ACC (OP[1]));
2364
2365   SET_PSW_F1 (PSW_F0);
2366
2367   if (tmp > SEXT40(MAX32))
2368     {
2369       tmp = (MAX32);
2370       SET_PSW_F0 (1);
2371     }
2372   else if (tmp < SEXT40(MIN32))
2373     {
2374       tmp = 0x80000000;
2375       SET_PSW_F0 (1);
2376     }
2377   else
2378     {
2379       tmp = (tmp & MASK32);
2380       SET_PSW_F0 (0);
2381     }
2382
2383   SET_GPR32 (OP[0], tmp);
2384
2385   trace_output_40 (tmp);
2386 }
2387
2388 /* sachi */
2389 void
2390 OP_4209 (void)
2391 {
2392   int64 tmp;
2393
2394   trace_input ("sachi", OP_REG_OUTPUT, OP_ACCUM, OP_VOID);
2395
2396   tmp = SEXT40(ACC (OP[1]));
2397
2398   SET_PSW_F1 (PSW_F0);
2399
2400   if (tmp > SEXT40(MAX32))
2401     {
2402       tmp = 0x7fff;
2403       SET_PSW_F0 (1);
2404     }
2405   else if (tmp < SEXT40(MIN32))
2406     {
2407       tmp = 0x8000;
2408       SET_PSW_F0 (1);
2409     }
2410   else
2411     {
2412       tmp >>= 16;
2413       SET_PSW_F0 (0);
2414     }
2415
2416   SET_GPR (OP[0], tmp);
2417
2418   trace_output_16 (OP[0]);
2419 }
2420
2421 /* sadd */
2422 void
2423 OP_1223 (void)
2424 {
2425   int64 tmp;
2426
2427   trace_input ("sadd", OP_ACCUM, OP_ACCUM, OP_VOID);
2428   tmp = SEXT40(ACC (OP[0])) + (SEXT40(ACC (OP[1])) >> 16);
2429   if (PSW_ST)
2430     {
2431       if (tmp > SEXT40(MAX32))
2432         tmp = (MAX32);
2433       else if (tmp < SEXT40(MIN32))
2434         tmp = (MIN32);
2435       else
2436         tmp = (tmp & MASK40);
2437     }
2438   else
2439     tmp = (tmp & MASK40);
2440   SET_ACC (OP[0], tmp);
2441   trace_output_40 (tmp);
2442 }
2443
2444 /* setf0f */
2445 void
2446 OP_4611 (void)
2447 {
2448   int16 tmp;
2449   trace_input ("setf0f", OP_REG_OUTPUT, OP_VOID, OP_VOID);
2450   tmp = ((PSW_F0 == 0) ? 1 : 0);
2451   SET_GPR (OP[0], tmp);
2452   trace_output_16 (tmp);
2453 }
2454
2455 /* setf0t */
2456 void
2457 OP_4613 (void)
2458 {
2459   int16 tmp;
2460   trace_input ("setf0t", OP_REG_OUTPUT, OP_VOID, OP_VOID);
2461   tmp = ((PSW_F0 == 1) ? 1 : 0);
2462   SET_GPR (OP[0], tmp);
2463   trace_output_16 (tmp);
2464 }
2465
2466 /* slae */
2467 void
2468 OP_3220 (void)
2469 {
2470   int64 tmp;
2471   int16 reg;
2472
2473   trace_input ("slae", OP_ACCUM, OP_REG, OP_VOID);
2474
2475   reg = SEXT16 (GPR (OP[1]));
2476
2477   if (reg >= 17 || reg <= -17)
2478     {
2479       (*d10v_callback->printf_filtered) (d10v_callback, "ERROR: shift value %d too large.\n", reg);
2480       State.exception = SIGILL;
2481       return;
2482     }
2483
2484   tmp = SEXT40 (ACC (OP[0]));
2485
2486   if (PSW_ST && (tmp < SEXT40 (MIN32) || tmp > SEXT40 (MAX32)))
2487     {
2488       (*d10v_callback->printf_filtered) (d10v_callback, "ERROR: accumulator value 0x%.2x%.8lx out of range\n", ((int)(tmp >> 32) & 0xff), ((unsigned long) tmp) & 0xffffffff);
2489       State.exception = SIGILL;
2490       return;
2491     }
2492
2493   if (reg >= 0 && reg <= 16)
2494     {
2495       tmp = SEXT56 ((SEXT56 (tmp)) << (GPR (OP[1])));
2496       if (PSW_ST)
2497         {
2498           if (tmp > SEXT40(MAX32))
2499             tmp = (MAX32);
2500           else if (tmp < SEXT40(MIN32))
2501             tmp = (MIN32);
2502           else
2503             tmp = (tmp & MASK40);
2504         }
2505       else
2506         tmp = (tmp & MASK40);
2507     }
2508   else
2509     {
2510       tmp = (SEXT40 (ACC (OP[0]))) >> (-GPR (OP[1]));
2511     }
2512
2513   SET_ACC(OP[0], tmp);
2514
2515   trace_output_40(tmp);
2516 }
2517
2518 /* sleep */
2519 void
2520 OP_5FC0 (void)
2521 {
2522   trace_input ("sleep", OP_VOID, OP_VOID, OP_VOID);
2523   SET_PSW_IE (1);
2524   trace_output_void ();
2525 }
2526
2527 /* sll */
2528 void
2529 OP_2200 (void)
2530 {
2531   int16 tmp;
2532   trace_input ("sll", OP_REG, OP_REG, OP_VOID);
2533   tmp = (GPR (OP[0]) << (GPR (OP[1]) & 0xf));
2534   SET_GPR (OP[0], tmp);
2535   trace_output_16 (tmp);
2536 }
2537
2538 /* sll */
2539 void
2540 OP_3200 (void)
2541 {
2542   int64 tmp;
2543   trace_input ("sll", OP_ACCUM, OP_REG, OP_VOID);
2544   if ((GPR (OP[1]) & 31) <= 16)
2545     tmp = SEXT40 (ACC (OP[0])) << (GPR (OP[1]) & 31);
2546   else
2547     {
2548       (*d10v_callback->printf_filtered) (d10v_callback, "ERROR: shift value %d too large.\n", GPR (OP[1]) & 31);
2549       State.exception = SIGILL;
2550       return;
2551     }
2552
2553   if (PSW_ST)
2554     {
2555       if (tmp > SEXT40(MAX32))
2556         tmp = (MAX32);
2557       else if (tmp < SEXT40(MIN32))
2558         tmp = (MIN32);
2559       else
2560         tmp = (tmp & MASK40);
2561     }
2562   else
2563     tmp = (tmp & MASK40);
2564   SET_ACC (OP[0], tmp);
2565   trace_output_40 (tmp);
2566 }
2567
2568 /* slli */
2569 void
2570 OP_2201 (void)
2571 {
2572   int16 tmp;
2573   trace_input ("slli", OP_REG, OP_CONSTANT16, OP_VOID);
2574   tmp = (GPR (OP[0]) << OP[1]);
2575   SET_GPR (OP[0], tmp);
2576   trace_output_16 (tmp);
2577 }
2578
2579 /* slli */
2580 void
2581 OP_3201 (void)
2582 {
2583   int64 tmp;
2584
2585   if (OP[1] == 0)
2586     OP[1] = 16;
2587
2588   trace_input ("slli", OP_ACCUM, OP_CONSTANT16, OP_VOID);
2589   tmp = SEXT40(ACC (OP[0])) << OP[1];
2590
2591   if (PSW_ST)
2592     {
2593       if (tmp > SEXT40(MAX32))
2594         tmp = (MAX32);
2595       else if (tmp < SEXT40(MIN32))
2596         tmp = (MIN32);
2597       else
2598         tmp = (tmp & MASK40);
2599     }
2600   else
2601     tmp = (tmp & MASK40);
2602   SET_ACC (OP[0], tmp);
2603   trace_output_40 (tmp);
2604 }
2605
2606 /* slx */
2607 void
2608 OP_460B (void)
2609 {
2610   int16 tmp;
2611   trace_input ("slx", OP_REG, OP_VOID, OP_VOID);
2612   tmp = ((GPR (OP[0]) << 1) | PSW_F0);
2613   SET_GPR (OP[0], tmp);
2614   trace_output_16 (tmp);
2615 }
2616
2617 /* sra */
2618 void
2619 OP_2400 (void)
2620 {
2621   int16 tmp;
2622   trace_input ("sra", OP_REG, OP_REG, OP_VOID);
2623   tmp = (((int16)(GPR (OP[0]))) >> (GPR (OP[1]) & 0xf));
2624   SET_GPR (OP[0], tmp);
2625   trace_output_16 (tmp);
2626 }
2627
2628 /* sra */
2629 void
2630 OP_3400 (void)
2631 {
2632   trace_input ("sra", OP_ACCUM, OP_REG, OP_VOID);
2633   if ((GPR (OP[1]) & 31) <= 16)
2634     {
2635       int64 tmp = ((SEXT40(ACC (OP[0])) >> (GPR (OP[1]) & 31)) & MASK40);
2636       SET_ACC (OP[0], tmp);
2637       trace_output_40 (tmp);
2638     }
2639   else
2640     {
2641       (*d10v_callback->printf_filtered) (d10v_callback, "ERROR: shift value %d too large.\n", GPR (OP[1]) & 31);
2642       State.exception = SIGILL;
2643       return;
2644     }
2645 }
2646
2647 /* srai */
2648 void
2649 OP_2401 (void)
2650 {
2651   int16 tmp;
2652   trace_input ("srai", OP_REG, OP_CONSTANT16, OP_VOID);
2653   tmp = (((int16)(GPR (OP[0]))) >> OP[1]);
2654   SET_GPR (OP[0], tmp);
2655   trace_output_16 (tmp);
2656 }
2657
2658 /* srai */
2659 void
2660 OP_3401 (void)
2661 {
2662   int64 tmp;
2663   if (OP[1] == 0)
2664     OP[1] = 16;
2665
2666   trace_input ("srai", OP_ACCUM, OP_CONSTANT16, OP_VOID);
2667   tmp = ((SEXT40(ACC (OP[0])) >> OP[1]) & MASK40);
2668   SET_ACC (OP[0], tmp);
2669   trace_output_40 (tmp);
2670 }
2671
2672 /* srl */
2673 void
2674 OP_2000 (void)
2675 {
2676   int16 tmp;
2677   trace_input ("srl", OP_REG, OP_REG, OP_VOID);
2678   tmp = (GPR (OP[0]) >>  (GPR (OP[1]) & 0xf));
2679   SET_GPR (OP[0], tmp);
2680   trace_output_16 (tmp);
2681 }
2682
2683 /* srl */
2684 void
2685 OP_3000 (void)
2686 {
2687   trace_input ("srl", OP_ACCUM, OP_REG, OP_VOID);
2688   if ((GPR (OP[1]) & 31) <= 16)
2689     {
2690       int64 tmp = ((uint64)((ACC (OP[0]) & MASK40) >> (GPR (OP[1]) & 31)));
2691       SET_ACC (OP[0], tmp);
2692       trace_output_40 (tmp);
2693     }
2694   else
2695     {
2696       (*d10v_callback->printf_filtered) (d10v_callback, "ERROR: shift value %d too large.\n", GPR (OP[1]) & 31);
2697       State.exception = SIGILL;
2698       return;
2699     }
2700
2701 }
2702
2703 /* srli */
2704 void
2705 OP_2001 (void)
2706 {
2707   int16 tmp;
2708   trace_input ("srli", OP_REG, OP_CONSTANT16, OP_VOID);
2709   tmp = (GPR (OP[0]) >> OP[1]);
2710   SET_GPR (OP[0], tmp);
2711   trace_output_16 (tmp);
2712 }
2713
2714 /* srli */
2715 void
2716 OP_3001 (void)
2717 {
2718   int64 tmp;
2719   if (OP[1] == 0)
2720     OP[1] = 16;
2721
2722   trace_input ("srli", OP_ACCUM, OP_CONSTANT16, OP_VOID);
2723   tmp = ((uint64)(ACC (OP[0]) & MASK40) >> OP[1]);
2724   SET_ACC (OP[0], tmp);
2725   trace_output_40 (tmp);
2726 }
2727
2728 /* srx */
2729 void
2730 OP_4609 (void)
2731 {
2732   uint16 tmp;
2733   trace_input ("srx", OP_REG, OP_VOID, OP_VOID);
2734   tmp = PSW_F0 << 15;
2735   tmp = ((GPR (OP[0]) >> 1) | tmp);
2736   SET_GPR (OP[0], tmp);
2737   trace_output_16 (tmp);
2738 }
2739
2740 /* st */
2741 void
2742 OP_34000000 (void)
2743 {
2744   uint16 addr = OP[1] + GPR (OP[2]);
2745   trace_input ("st", OP_REG, OP_MEMREF2, OP_VOID);
2746   if ((addr & 1))
2747     {
2748       State.exception = SIG_D10V_BUS;
2749       State.pc_changed = 1; /* Don't increment the PC. */
2750       trace_output_void ();
2751       return;
2752     }
2753   SW (addr, GPR (OP[0]));
2754   trace_output_void ();
2755 }
2756
2757 /* st */
2758 void
2759 OP_6800 (void)
2760 {
2761   uint16 addr = GPR (OP[1]);
2762   trace_input ("st", OP_REG, OP_MEMREF, OP_VOID);
2763   if ((addr & 1))
2764     {
2765       State.exception = SIG_D10V_BUS;
2766       State.pc_changed = 1; /* Don't increment the PC. */
2767       trace_output_void ();
2768       return;
2769     }
2770   SW (addr, GPR (OP[0]));
2771   trace_output_void ();
2772 }
2773
2774 /* st */
2775 /* st Rsrc1,@-SP */
2776 void
2777 OP_6C1F (void)
2778 {
2779   uint16 addr = GPR (OP[1]) - 2;
2780   trace_input ("st", OP_REG, OP_PREDEC, OP_VOID);
2781   if (OP[1] != 15)
2782     {
2783       (*d10v_callback->printf_filtered) (d10v_callback, "ERROR: cannot pre-decrement any registers but r15 (SP).\n");
2784       State.exception = SIGILL;
2785       return;
2786     }
2787   if ((addr & 1))
2788     {
2789       State.exception = SIG_D10V_BUS;
2790       State.pc_changed = 1; /* Don't increment the PC. */
2791       trace_output_void ();
2792       return;
2793     }
2794   SW (addr, GPR (OP[0]));
2795   SET_GPR (OP[1], addr);
2796   trace_output_void ();
2797 }
2798
2799 /* st */
2800 void
2801 OP_6801 (void)
2802 {
2803   uint16 addr = GPR (OP[1]);
2804   trace_input ("st", OP_REG, OP_POSTINC, OP_VOID);
2805   if ((addr & 1))
2806     {
2807       State.exception = SIG_D10V_BUS;
2808       State.pc_changed = 1; /* Don't increment the PC. */
2809       trace_output_void ();
2810       return;
2811     }
2812   SW (addr, GPR (OP[0]));
2813   INC_ADDR (OP[1], 2);
2814   trace_output_void ();
2815 }
2816
2817 /* st */
2818 void
2819 OP_6C01 (void)
2820 {
2821   uint16 addr = GPR (OP[1]);
2822   trace_input ("st", OP_REG, OP_POSTDEC, OP_VOID);
2823   if ( OP[1] == 15 )
2824     {
2825       (*d10v_callback->printf_filtered) (d10v_callback, "ERROR: cannot post-decrement register r15 (SP).\n");
2826       State.exception = SIGILL;
2827       return;
2828     }
2829   if ((addr & 1))
2830     {
2831       State.exception = SIG_D10V_BUS;
2832       State.pc_changed = 1; /* Don't increment the PC. */
2833       trace_output_void ();
2834       return;
2835     }
2836   SW (addr, GPR (OP[0]));
2837   INC_ADDR (OP[1], -2);
2838   trace_output_void ();
2839 }
2840
2841 /* st */
2842 void
2843 OP_36010000 (void)
2844 {
2845   uint16 addr = OP[1];
2846   trace_input ("st", OP_REG, OP_MEMREF3, OP_VOID);
2847   if ((addr & 1))
2848     {
2849       State.exception = SIG_D10V_BUS;
2850       State.pc_changed = 1; /* Don't increment the PC. */
2851       trace_output_void ();
2852       return;
2853     }
2854   SW (addr, GPR (OP[0]));
2855   trace_output_void ();
2856 }
2857
2858 /* st2w */
2859 void
2860 OP_35000000 (void)
2861 {
2862   uint16 addr = GPR (OP[2])+ OP[1];
2863   trace_input ("st2w", OP_DREG, OP_MEMREF2, OP_VOID);
2864   if ((addr & 1))
2865     {
2866       State.exception = SIG_D10V_BUS;
2867       State.pc_changed = 1; /* Don't increment the PC. */
2868       trace_output_void ();
2869       return;
2870     }
2871   SW (addr + 0, GPR (OP[0] + 0));
2872   SW (addr + 2, GPR (OP[0] + 1));
2873   trace_output_void ();
2874 }
2875
2876 /* st2w */
2877 void
2878 OP_6A00 (void)
2879 {
2880   uint16 addr = GPR (OP[1]);
2881   trace_input ("st2w", OP_DREG, OP_MEMREF, OP_VOID);
2882   if ((addr & 1))
2883     {
2884       State.exception = SIG_D10V_BUS;
2885       State.pc_changed = 1; /* Don't increment the PC. */
2886       trace_output_void ();
2887       return;
2888     }
2889   SW (addr + 0, GPR (OP[0] + 0));
2890   SW (addr + 2, GPR (OP[0] + 1));
2891   trace_output_void ();
2892 }
2893
2894 /* st2w */
2895 void
2896 OP_6E1F (void)
2897 {
2898   uint16 addr = GPR (OP[1]) - 4;
2899   trace_input ("st2w", OP_DREG, OP_PREDEC, OP_VOID);
2900   if ( OP[1] != 15 )
2901     {
2902       (*d10v_callback->printf_filtered) (d10v_callback, "ERROR: cannot pre-decrement any registers but r15 (SP).\n");
2903       State.exception = SIGILL;
2904       return;
2905     }
2906   if ((addr & 1))
2907     {
2908       State.exception = SIG_D10V_BUS;
2909       State.pc_changed = 1; /* Don't increment the PC. */
2910       trace_output_void ();
2911       return;
2912     }
2913   SW (addr + 0, GPR (OP[0] + 0));
2914   SW (addr + 2, GPR (OP[0] + 1));
2915   SET_GPR (OP[1], addr);
2916   trace_output_void ();
2917 }
2918
2919 /* st2w */
2920 void
2921 OP_6A01 (void)
2922 {
2923   uint16 addr = GPR (OP[1]);
2924   trace_input ("st2w", OP_DREG, OP_POSTINC, OP_VOID);
2925   if ((addr & 1))
2926     {
2927       State.exception = SIG_D10V_BUS;
2928       State.pc_changed = 1; /* Don't increment the PC. */
2929       trace_output_void ();
2930       return;
2931     }
2932   SW (addr + 0, GPR (OP[0] + 0));
2933   SW (addr + 2, GPR (OP[0] + 1));
2934   INC_ADDR (OP[1], 4);
2935   trace_output_void ();
2936 }
2937
2938 /* st2w */
2939 void
2940 OP_6E01 (void)
2941 {
2942   uint16 addr = GPR (OP[1]);
2943   trace_input ("st2w", OP_DREG, OP_POSTDEC, OP_VOID);
2944   if ( OP[1] == 15 )
2945     {
2946       (*d10v_callback->printf_filtered) (d10v_callback, "ERROR: cannot post-decrement register r15 (SP).\n");
2947       State.exception = SIGILL;
2948       return;
2949     }
2950   if ((addr & 1))
2951     {
2952       State.exception = SIG_D10V_BUS;
2953       State.pc_changed = 1; /* Don't increment the PC. */
2954       trace_output_void ();
2955       return;
2956     }
2957   SW (addr + 0, GPR (OP[0] + 0));
2958   SW (addr + 2, GPR (OP[0] + 1));
2959   INC_ADDR (OP[1], -4);
2960   trace_output_void ();
2961 }
2962
2963 /* st2w */
2964 void
2965 OP_37010000 (void)
2966 {
2967   uint16 addr = OP[1];
2968   trace_input ("st2w", OP_DREG, OP_MEMREF3, OP_VOID);
2969   if ((addr & 1))
2970     {
2971       State.exception = SIG_D10V_BUS;
2972       State.pc_changed = 1; /* Don't increment the PC. */
2973       trace_output_void ();
2974       return;
2975     }
2976   SW (addr + 0, GPR (OP[0] + 0));
2977   SW (addr + 2, GPR (OP[0] + 1));
2978   trace_output_void ();
2979 }
2980
2981 /* stb */
2982 void
2983 OP_3C000000 (void)
2984 {
2985   trace_input ("stb", OP_REG, OP_MEMREF2, OP_VOID);
2986   SB (GPR (OP[2]) + OP[1], GPR (OP[0]));
2987   trace_output_void ();
2988 }
2989
2990 /* stb */
2991 void
2992 OP_7800 (void)
2993 {
2994   trace_input ("stb", OP_REG, OP_MEMREF, OP_VOID);
2995   SB (GPR (OP[1]), GPR (OP[0]));
2996   trace_output_void ();
2997 }
2998
2999 /* stop */
3000 void
3001 OP_5FE0 (void)
3002 {
3003   trace_input ("stop", OP_VOID, OP_VOID, OP_VOID);
3004   State.exception = SIG_D10V_STOP;
3005   trace_output_void ();
3006 }
3007
3008 /* sub */
3009 void
3010 OP_0 (void)
3011 {
3012   uint16 a = GPR (OP[0]);
3013   uint16 b = GPR (OP[1]);
3014   uint16 tmp = (a - b);
3015   trace_input ("sub", OP_REG, OP_REG, OP_VOID);
3016   /* see ../common/sim-alu.h for a more extensive discussion on how to
3017      compute the carry/overflow bits. */
3018   SET_PSW_C (a >= b);
3019   SET_GPR (OP[0], tmp);
3020   trace_output_16 (tmp);
3021 }
3022
3023 /* sub */
3024 void
3025 OP_1001 (void)
3026 {
3027   int64 tmp;
3028
3029   trace_input ("sub", OP_ACCUM, OP_DREG, OP_VOID);
3030   tmp = SEXT40(ACC (OP[0])) - (SEXT16 (GPR (OP[1])) << 16 | GPR (OP[1] + 1));
3031   if (PSW_ST)
3032     {
3033       if (tmp > SEXT40(MAX32))
3034         tmp = (MAX32);
3035       else if (tmp < SEXT40(MIN32))
3036         tmp = (MIN32);
3037       else
3038         tmp = (tmp & MASK40);
3039     }
3040   else
3041     tmp = (tmp & MASK40);
3042   SET_ACC (OP[0], tmp);
3043
3044   trace_output_40 (tmp);
3045 }
3046
3047 /* sub */
3048
3049 void
3050 OP_1003 (void)
3051 {
3052   int64 tmp;
3053
3054   trace_input ("sub", OP_ACCUM, OP_ACCUM, OP_VOID);
3055   tmp = SEXT40(ACC (OP[0])) - SEXT40(ACC (OP[1]));
3056   if (PSW_ST)
3057     {
3058       if (tmp > SEXT40(MAX32))
3059         tmp = (MAX32);
3060       else if (tmp < SEXT40(MIN32))
3061         tmp = (MIN32);
3062       else
3063         tmp = (tmp & MASK40);
3064     }
3065   else
3066     tmp = (tmp & MASK40);
3067   SET_ACC (OP[0], tmp);
3068
3069   trace_output_40 (tmp);
3070 }
3071
3072 /* sub2w */
3073 void
3074 OP_1000 (void)
3075 {
3076   uint32 tmp, a, b;
3077
3078   trace_input ("sub2w", OP_DREG, OP_DREG, OP_VOID);
3079   a = (uint32)((GPR (OP[0]) << 16) | GPR (OP[0] + 1));
3080   b = (uint32)((GPR (OP[1]) << 16) | GPR (OP[1] + 1));
3081   /* see ../common/sim-alu.h for a more extensive discussion on how to
3082      compute the carry/overflow bits */
3083   tmp = a - b;
3084   SET_PSW_C (a >= b);
3085   SET_GPR32 (OP[0], tmp);
3086   trace_output_32 (tmp);
3087 }
3088
3089 /* subac3 */
3090 void
3091 OP_17000000 (void)
3092 {
3093   int64 tmp;
3094
3095   trace_input ("subac3", OP_DREG_OUTPUT, OP_DREG, OP_ACCUM);
3096   tmp = SEXT40 ((GPR (OP[1]) << 16) | GPR (OP[1] + 1)) - SEXT40 (ACC (OP[2]));
3097   SET_GPR32 (OP[0], tmp);
3098   trace_output_32 (tmp);
3099 }
3100
3101 /* subac3 */
3102 void
3103 OP_17000002 (void)
3104 {
3105   int64 tmp;
3106
3107   trace_input ("subac3", OP_DREG_OUTPUT, OP_ACCUM, OP_ACCUM);
3108   tmp = SEXT40 (ACC (OP[1])) - SEXT40(ACC (OP[2]));
3109   SET_GPR32 (OP[0], tmp);
3110   trace_output_32 (tmp);
3111 }
3112
3113 /* subac3s */
3114 void
3115 OP_17001000 (void)
3116 {
3117   int64 tmp;
3118
3119   trace_input ("subac3s", OP_DREG_OUTPUT, OP_DREG, OP_ACCUM);
3120   SET_PSW_F1 (PSW_F0);
3121   tmp = SEXT40 ((GPR (OP[1]) << 16) | GPR (OP[1] + 1)) - SEXT40(ACC (OP[2]));
3122   if (tmp > SEXT40(MAX32))
3123     {
3124       tmp = (MAX32);
3125       SET_PSW_F0 (1);
3126     }      
3127   else if (tmp < SEXT40(MIN32))
3128     {
3129       tmp = (MIN32);
3130       SET_PSW_F0 (1);
3131     }      
3132   else
3133     {
3134       SET_PSW_F0 (0);
3135     }      
3136   SET_GPR32 (OP[0], tmp);
3137   trace_output_32 (tmp);
3138 }
3139
3140 /* subac3s */
3141 void
3142 OP_17001002 (void)
3143 {
3144   int64 tmp;
3145
3146   trace_input ("subac3s", OP_DREG_OUTPUT, OP_ACCUM, OP_ACCUM);
3147   SET_PSW_F1 (PSW_F0);
3148   tmp = SEXT40(ACC (OP[1])) - SEXT40(ACC (OP[2]));
3149   if (tmp > SEXT40(MAX32))
3150     {
3151       tmp = (MAX32);
3152       SET_PSW_F0 (1);
3153     }      
3154   else if (tmp < SEXT40(MIN32))
3155     {
3156       tmp = (MIN32);
3157       SET_PSW_F0 (1);
3158     }      
3159   else
3160     {
3161       SET_PSW_F0 (0);
3162     }      
3163   SET_GPR32 (OP[0], tmp);
3164   trace_output_32 (tmp);
3165 }
3166
3167 /* subi */
3168 void
3169 OP_1 (void)
3170 {
3171   unsigned tmp;
3172   if (OP[1] == 0)
3173     OP[1] = 16;
3174
3175   trace_input ("subi", OP_REG, OP_CONSTANT16, OP_VOID);
3176   /* see ../common/sim-alu.h for a more extensive discussion on how to
3177      compute the carry/overflow bits. */
3178   /* since OP[1] is never <= 0, -OP[1] == ~OP[1]+1 can never overflow */
3179   tmp = ((unsigned)(unsigned16) GPR (OP[0])
3180          + (unsigned)(unsigned16) ( - OP[1]));
3181   SET_PSW_C (tmp >= (1 << 16));
3182   SET_GPR (OP[0], tmp);
3183   trace_output_16 (tmp);
3184 }
3185
3186 /* trap */
3187 void
3188 OP_5F00 (void)
3189 {
3190   trace_input ("trap", OP_CONSTANT4, OP_VOID, OP_VOID);
3191   trace_output_void ();
3192
3193   switch (OP[0])
3194     {
3195     default:
3196 #if (DEBUG & DEBUG_TRAP) == 0
3197       {
3198         uint16 vec = OP[0] + TRAP_VECTOR_START;
3199         SET_BPC (PC + 1);
3200         SET_BPSW (PSW);
3201         SET_PSW (PSW & PSW_SM_BIT);
3202         JMP (vec);
3203         break;
3204       }
3205 #else                   /* if debugging use trap to print registers */
3206       {
3207         int i;
3208         static int first_time = 1;
3209
3210         if (first_time)
3211           {
3212             first_time = 0;
3213             (*d10v_callback->printf_filtered) (d10v_callback, "Trap  #     PC ");
3214             for (i = 0; i < 16; i++)
3215               (*d10v_callback->printf_filtered) (d10v_callback, "  %sr%d", (i > 9) ? "" : " ", i);
3216             (*d10v_callback->printf_filtered) (d10v_callback, "         a0         a1 f0 f1 c\n");
3217           }
3218
3219         (*d10v_callback->printf_filtered) (d10v_callback, "Trap %2d 0x%.4x:", (int)OP[0], (int)PC);
3220
3221         for (i = 0; i < 16; i++)
3222           (*d10v_callback->printf_filtered) (d10v_callback, " %.4x", (int) GPR (i));
3223
3224         for (i = 0; i < 2; i++)
3225           (*d10v_callback->printf_filtered) (d10v_callback, " %.2x%.8lx",
3226                                              ((int)(ACC (i) >> 32) & 0xff),
3227                                              ((unsigned long) ACC (i)) & 0xffffffff);
3228
3229         (*d10v_callback->printf_filtered) (d10v_callback, "  %d  %d %d\n",
3230                                            PSW_F0 != 0, PSW_F1 != 0, PSW_C != 0);
3231         (*d10v_callback->flush_stdout) (d10v_callback);
3232         break;
3233       }
3234 #endif
3235     case 15:                    /* new system call trap */
3236       /* Trap 15 is used for simulating low-level I/O */
3237       {
3238         unsigned32 result = 0;
3239         errno = 0;
3240
3241 /* Registers passed to trap 0 */
3242
3243 #define FUNC   GPR (4)  /* function number */
3244 #define PARM1  GPR (0)  /* optional parm 1 */
3245 #define PARM2  GPR (1)  /* optional parm 2 */
3246 #define PARM3  GPR (2)  /* optional parm 3 */
3247 #define PARM4  GPR (3)  /* optional parm 3 */
3248
3249 /* Registers set by trap 0 */
3250
3251 #define RETVAL(X)   do { result = (X); SET_GPR (0, result); } while (0)
3252 #define RETVAL32(X) do { result = (X); SET_GPR (0, result >> 16); SET_GPR (1, result); } while (0)
3253 #define RETERR(X) SET_GPR (4, (X))              /* return error code */
3254
3255 /* Turn a pointer in a register into a pointer into real memory. */
3256
3257 #define MEMPTR(x) ((char *)(dmem_addr(x)))
3258
3259         switch (FUNC)
3260           {
3261 #if !defined(__GO32__) && !defined(_WIN32)
3262           case TARGET_SYS_fork:
3263             trace_input ("<fork>", OP_VOID, OP_VOID, OP_VOID);
3264             RETVAL (fork ());
3265             trace_output_16 (result);
3266             break;
3267
3268 #define getpid() 47
3269           case TARGET_SYS_getpid:
3270             trace_input ("<getpid>", OP_VOID, OP_VOID, OP_VOID);
3271             RETVAL (getpid ());
3272             trace_output_16 (result);
3273             break;
3274
3275           case TARGET_SYS_kill:
3276             trace_input ("<kill>", OP_R0, OP_R1, OP_VOID);
3277             if (PARM1 == getpid ())
3278               {
3279                 trace_output_void ();
3280                 State.exception = PARM2;
3281               }
3282             else
3283               {
3284                 int os_sig = -1;
3285                 switch (PARM2)
3286                   {
3287 #ifdef SIGHUP
3288                   case 1: os_sig = SIGHUP;      break;
3289 #endif
3290 #ifdef SIGINT
3291                   case 2: os_sig = SIGINT;      break;
3292 #endif
3293 #ifdef SIGQUIT
3294                   case 3: os_sig = SIGQUIT;     break;
3295 #endif
3296 #ifdef SIGILL
3297                   case 4: os_sig = SIGILL;      break;
3298 #endif
3299 #ifdef SIGTRAP
3300                   case 5: os_sig = SIGTRAP;     break;
3301 #endif
3302 #ifdef SIGABRT
3303                   case 6: os_sig = SIGABRT;     break;
3304 #elif defined(SIGIOT)
3305                   case 6: os_sig = SIGIOT;      break;
3306 #endif
3307 #ifdef SIGEMT
3308                   case 7: os_sig = SIGEMT;      break;
3309 #endif
3310 #ifdef SIGFPE
3311                   case 8: os_sig = SIGFPE;      break;
3312 #endif
3313 #ifdef SIGKILL
3314                   case 9: os_sig = SIGKILL;     break;
3315 #endif
3316 #ifdef SIGBUS
3317                   case 10: os_sig = SIGBUS;     break;
3318 #endif
3319 #ifdef SIGSEGV
3320                   case 11: os_sig = SIGSEGV;    break;
3321 #endif
3322 #ifdef SIGSYS
3323                   case 12: os_sig = SIGSYS;     break;
3324 #endif
3325 #ifdef SIGPIPE
3326                   case 13: os_sig = SIGPIPE;    break;
3327 #endif
3328 #ifdef SIGALRM
3329                   case 14: os_sig = SIGALRM;    break;
3330 #endif
3331 #ifdef SIGTERM
3332                   case 15: os_sig = SIGTERM;    break;
3333 #endif
3334 #ifdef SIGURG
3335                   case 16: os_sig = SIGURG;     break;
3336 #endif
3337 #ifdef SIGSTOP
3338                   case 17: os_sig = SIGSTOP;    break;
3339 #endif
3340 #ifdef SIGTSTP
3341                   case 18: os_sig = SIGTSTP;    break;
3342 #endif
3343 #ifdef SIGCONT
3344                   case 19: os_sig = SIGCONT;    break;
3345 #endif
3346 #ifdef SIGCHLD
3347                   case 20: os_sig = SIGCHLD;    break;
3348 #elif defined(SIGCLD)
3349                   case 20: os_sig = SIGCLD;     break;
3350 #endif
3351 #ifdef SIGTTIN
3352                   case 21: os_sig = SIGTTIN;    break;
3353 #endif
3354 #ifdef SIGTTOU
3355                   case 22: os_sig = SIGTTOU;    break;
3356 #endif
3357 #ifdef SIGIO
3358                   case 23: os_sig = SIGIO;      break;
3359 #elif defined (SIGPOLL)
3360                   case 23: os_sig = SIGPOLL;    break;
3361 #endif
3362 #ifdef SIGXCPU
3363                   case 24: os_sig = SIGXCPU;    break;
3364 #endif
3365 #ifdef SIGXFSZ
3366                   case 25: os_sig = SIGXFSZ;    break;
3367 #endif
3368 #ifdef SIGVTALRM
3369                   case 26: os_sig = SIGVTALRM;  break;
3370 #endif
3371 #ifdef SIGPROF
3372                   case 27: os_sig = SIGPROF;    break;
3373 #endif
3374 #ifdef SIGWINCH
3375                   case 28: os_sig = SIGWINCH;   break;
3376 #endif
3377 #ifdef SIGLOST
3378                   case 29: os_sig = SIGLOST;    break;
3379 #endif
3380 #ifdef SIGUSR1
3381                   case 30: os_sig = SIGUSR1;    break;
3382 #endif
3383 #ifdef SIGUSR2
3384                   case 31: os_sig = SIGUSR2;    break;
3385 #endif
3386                   }
3387
3388                 if (os_sig == -1)
3389                   {
3390                     trace_output_void ();
3391                     (*d10v_callback->printf_filtered) (d10v_callback, "Unknown signal %d\n", PARM2);
3392                     (*d10v_callback->flush_stdout) (d10v_callback);
3393                     State.exception = SIGILL;
3394                   }
3395                 else
3396                   {
3397                     RETVAL (kill (PARM1, PARM2));
3398                     trace_output_16 (result);
3399                   }
3400               }
3401             break;
3402
3403           case TARGET_SYS_execve:
3404             trace_input ("<execve>", OP_R0, OP_R1, OP_R2);
3405             RETVAL (execve (MEMPTR (PARM1), (char **) MEMPTR (PARM2),
3406                              (char **)MEMPTR (PARM3)));
3407             trace_output_16 (result);
3408             break;
3409
3410 #ifdef TARGET_SYS_execv
3411           case TARGET_SYS_execv:
3412             trace_input ("<execv>", OP_R0, OP_R1, OP_VOID);
3413             RETVAL (execve (MEMPTR (PARM1), (char **) MEMPTR (PARM2), NULL));
3414             trace_output_16 (result);
3415             break;
3416 #endif
3417
3418           case TARGET_SYS_pipe:
3419             {
3420               reg_t buf;
3421               int host_fd[2];
3422
3423               trace_input ("<pipe>", OP_R0, OP_VOID, OP_VOID);
3424               buf = PARM1;
3425               RETVAL (pipe (host_fd));
3426               SW (buf, host_fd[0]);
3427               buf += sizeof(uint16);
3428               SW (buf, host_fd[1]);
3429               trace_output_16 (result);
3430             }
3431           break;
3432
3433 #if 0
3434 #ifdef TARGET_SYS_wait
3435           case TARGET_SYS_wait:
3436             {
3437               int status;
3438               trace_input ("<wait>", OP_R0, OP_VOID, OP_VOID);
3439               RETVAL (wait (&status));
3440               if (PARM1)
3441                 SW (PARM1, status);
3442               trace_output_16 (result);
3443             }
3444           break;
3445 #endif
3446 #endif
3447 #else
3448           case TARGET_SYS_getpid:
3449             trace_input ("<getpid>", OP_VOID, OP_VOID, OP_VOID);
3450             RETVAL (1);
3451             trace_output_16 (result);
3452             break;
3453
3454           case TARGET_SYS_kill:
3455             trace_input ("<kill>", OP_REG, OP_REG, OP_VOID);
3456             trace_output_void ();
3457             State.exception = PARM2;
3458             break;
3459 #endif
3460
3461           case TARGET_SYS_read:
3462             trace_input ("<read>", OP_R0, OP_R1, OP_R2);
3463             RETVAL (d10v_callback->read (d10v_callback, PARM1, MEMPTR (PARM2),
3464                                           PARM3));
3465             trace_output_16 (result);
3466             break;
3467
3468           case TARGET_SYS_write:
3469             trace_input ("<write>", OP_R0, OP_R1, OP_R2);
3470             if (PARM1 == 1)
3471               RETVAL ((int)d10v_callback->write_stdout (d10v_callback,
3472                                                          MEMPTR (PARM2), PARM3));
3473             else
3474               RETVAL ((int)d10v_callback->write (d10v_callback, PARM1,
3475                                                   MEMPTR (PARM2), PARM3));
3476             trace_output_16 (result);
3477             break;
3478
3479           case TARGET_SYS_lseek:
3480             trace_input ("<lseek>", OP_R0, OP_R1, OP_R2);
3481             RETVAL32 (d10v_callback->lseek (d10v_callback, PARM1,
3482                                             ((((unsigned long) PARM2) << 16)
3483                                              || (unsigned long) PARM3),
3484                                             PARM4));
3485             trace_output_32 (result);
3486             break;
3487
3488           case TARGET_SYS_close:
3489             trace_input ("<close>", OP_R0, OP_VOID, OP_VOID);
3490             RETVAL (d10v_callback->close (d10v_callback, PARM1));
3491             trace_output_16 (result);
3492             break;
3493
3494           case TARGET_SYS_open:
3495             trace_input ("<open>", OP_R0, OP_R1, OP_R2);
3496             RETVAL (d10v_callback->open (d10v_callback, MEMPTR (PARM1), PARM2));
3497             trace_output_16 (result);
3498             break;
3499
3500           case TARGET_SYS_exit:
3501             trace_input ("<exit>", OP_R0, OP_VOID, OP_VOID);
3502             State.exception = SIG_D10V_EXIT;
3503             trace_output_void ();
3504             break;
3505
3506 #ifdef TARGET_SYS_stat
3507           case TARGET_SYS_stat:
3508             trace_input ("<stat>", OP_R0, OP_R1, OP_VOID);
3509             /* stat system call */
3510             {
3511               struct stat host_stat;
3512               reg_t buf;
3513
3514               RETVAL (stat (MEMPTR (PARM1), &host_stat));
3515
3516               buf = PARM2;
3517
3518               /* The hard-coded offsets and sizes were determined by using
3519                * the D10V compiler on a test program that used struct stat.
3520                */
3521               SW  (buf,    host_stat.st_dev);
3522               SW  (buf+2,  host_stat.st_ino);
3523               SW  (buf+4,  host_stat.st_mode);
3524               SW  (buf+6,  host_stat.st_nlink);
3525               SW  (buf+8,  host_stat.st_uid);
3526               SW  (buf+10, host_stat.st_gid);
3527               SW  (buf+12, host_stat.st_rdev);
3528               SLW (buf+16, host_stat.st_size);
3529               SLW (buf+20, host_stat.st_atime);
3530               SLW (buf+28, host_stat.st_mtime);
3531               SLW (buf+36, host_stat.st_ctime);
3532             }
3533             trace_output_16 (result);
3534             break;
3535 #endif
3536
3537           case TARGET_SYS_chown:
3538             trace_input ("<chown>", OP_R0, OP_R1, OP_R2);
3539             RETVAL (chown (MEMPTR (PARM1), PARM2, PARM3));
3540             trace_output_16 (result);
3541             break;
3542
3543           case TARGET_SYS_chmod:
3544             trace_input ("<chmod>", OP_R0, OP_R1, OP_R2);
3545             RETVAL (chmod (MEMPTR (PARM1), PARM2));
3546             trace_output_16 (result);
3547             break;
3548
3549 #if 0
3550 #ifdef TARGET_SYS_utime
3551           case TARGET_SYS_utime:
3552             trace_input ("<utime>", OP_R0, OP_R1, OP_R2);
3553             /* Cast the second argument to void *, to avoid type mismatch
3554                if a prototype is present.  */
3555             RETVAL (utime (MEMPTR (PARM1), (void *) MEMPTR (PARM2)));
3556             trace_output_16 (result);
3557             break;
3558 #endif
3559 #endif
3560
3561 #if 0
3562 #ifdef TARGET_SYS_time
3563           case TARGET_SYS_time:
3564             trace_input ("<time>", OP_R0, OP_R1, OP_R2);
3565             RETVAL32 (time (PARM1 ? MEMPTR (PARM1) : NULL));
3566             trace_output_32 (result);
3567             break;
3568 #endif
3569 #endif
3570             
3571           default:
3572             d10v_callback->error (d10v_callback, "Unknown syscall %d", FUNC);
3573           }
3574         if ((uint16) result == (uint16) -1)
3575           RETERR (d10v_callback->get_errno(d10v_callback));
3576         else
3577           RETERR (0);
3578         break;
3579       }
3580     }
3581 }
3582
3583 /* tst0i */
3584 void
3585 OP_7000000 (void)
3586 {
3587   trace_input ("tst0i", OP_REG, OP_CONSTANT16, OP_VOID);
3588   SET_PSW_F1 (PSW_F0);;
3589   SET_PSW_F0 ((GPR (OP[0]) & OP[1]) ? 1 : 0);
3590   trace_output_flag ();
3591 }
3592
3593 /* tst1i */
3594 void
3595 OP_F000000 (void)
3596 {
3597   trace_input ("tst1i", OP_REG, OP_CONSTANT16, OP_VOID);
3598   SET_PSW_F1 (PSW_F0);
3599   SET_PSW_F0 ((~(GPR (OP[0])) & OP[1]) ? 1 : 0);
3600   trace_output_flag ();
3601 }
3602
3603 /* wait */
3604 void
3605 OP_5F80 (void)
3606 {
3607   trace_input ("wait", OP_VOID, OP_VOID, OP_VOID);
3608   SET_PSW_IE (1);
3609   trace_output_void ();
3610 }
3611
3612 /* xor */
3613 void
3614 OP_A00 (void)
3615 {
3616   int16 tmp;
3617   trace_input ("xor", OP_REG, OP_REG, OP_VOID);
3618   tmp = (GPR (OP[0]) ^ GPR (OP[1]));
3619   SET_GPR (OP[0], tmp);
3620   trace_output_16 (tmp);
3621 }
3622
3623 /* xor3 */
3624 void
3625 OP_5000000 (void)
3626 {
3627   int16 tmp;
3628   trace_input ("xor3", OP_REG_OUTPUT, OP_REG, OP_CONSTANT16);
3629   tmp = (GPR (OP[1]) ^ OP[2]);
3630   SET_GPR (OP[0], tmp);
3631   trace_output_16 (tmp);
3632 }