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