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