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