xref: /netbsd-src/external/gpl3/gdb/dist/sim/v850/simops.c (revision 9616dacfef448e70e3fbbd865bddf60d54b656c5)
1 #include "sim-main.h"
2 #include "v850_sim.h"
3 #include "simops.h"
4 
5 #include <sys/types.h>
6 
7 #ifdef HAVE_UTIME_H
8 #include <utime.h>
9 #endif
10 
11 #ifdef HAVE_TIME_H
12 #include <time.h>
13 #endif
14 
15 #ifdef HAVE_UNISTD_H
16 #include <unistd.h>
17 #endif
18 
19 #ifdef HAVE_STRING_H
20 #include <string.h>
21 #else
22 #ifdef HAVE_STRINGS_H
23 #include <strings.h>
24 #endif
25 #endif
26 
27 #include "targ-vals.h"
28 
29 #include "libiberty.h"
30 
31 #include <errno.h>
32 #if !defined(__GO32__) && !defined(_WIN32)
33 #include <sys/stat.h>
34 #include <sys/times.h>
35 #include <sys/time.h>
36 #endif
37 
38 /* This is an array of the bit positions of registers r20 .. r31 in
39    that order in a prepare/dispose instruction.  */
40 int type1_regs[12] = { 27, 26, 25, 24, 31, 30, 29, 28, 23, 22, 0, 21 };
41 /* This is an array of the bit positions of registers r16 .. r31 in
42    that order in a push/pop instruction.  */
43 int type2_regs[16] = { 3, 2, 1, 0, 27, 26, 25, 24, 31, 30, 29, 28, 23, 22, 20, 21};
44 /* This is an array of the bit positions of registers r1 .. r15 in
45    that order in a push/pop instruction.  */
46 int type3_regs[15] = { 2, 1, 0, 27, 26, 25, 24, 31, 30, 29, 28, 23, 22, 20, 21};
47 
48 #ifdef DEBUG
49 #ifndef SIZE_INSTRUCTION
50 #define SIZE_INSTRUCTION 18
51 #endif
52 
53 #ifndef SIZE_VALUES
54 #define SIZE_VALUES 11
55 #endif
56 
57 
58 unsigned32   trace_values[3];
59 int          trace_num_values;
60 unsigned32   trace_pc;
61 const char * trace_name;
62 int          trace_module;
63 
64 
65 void
66 trace_input (char *name, enum op_types type, int size)
67 {
68   if (!TRACE_ALU_P (STATE_CPU (simulator, 0)))
69     return;
70 
71   trace_pc = PC;
72   trace_name = name;
73   trace_module = TRACE_ALU_IDX;
74 
75   switch (type)
76     {
77     default:
78     case OP_UNKNOWN:
79     case OP_NONE:
80     case OP_TRAP:
81       trace_num_values = 0;
82       break;
83 
84     case OP_REG:
85     case OP_REG_REG_MOVE:
86       trace_values[0] = State.regs[OP[0]];
87       trace_num_values = 1;
88       break;
89 
90     case OP_BIT_CHANGE:
91     case OP_REG_REG:
92     case OP_REG_REG_CMP:
93       trace_values[0] = State.regs[OP[1]];
94       trace_values[1] = State.regs[OP[0]];
95       trace_num_values = 2;
96       break;
97 
98     case OP_IMM_REG:
99     case OP_IMM_REG_CMP:
100       trace_values[0] = SEXT5 (OP[0]);
101       trace_values[1] = OP[1];
102       trace_num_values = 2;
103       break;
104 
105     case OP_IMM_REG_MOVE:
106       trace_values[0] = SEXT5 (OP[0]);
107       trace_num_values = 1;
108       break;
109 
110     case OP_COND_BR:
111       trace_values[0] = State.pc;
112       trace_values[1] = SEXT9 (OP[0]);
113       trace_values[2] = PSW;
114       trace_num_values = 3;
115       break;
116 
117     case OP_LOAD16:
118       trace_values[0] = OP[1] * size;
119       trace_values[1] = State.regs[30];
120       trace_num_values = 2;
121       break;
122 
123     case OP_STORE16:
124       trace_values[0] = State.regs[OP[0]];
125       trace_values[1] = OP[1] * size;
126       trace_values[2] = State.regs[30];
127       trace_num_values = 3;
128       break;
129 
130     case OP_LOAD32:
131       trace_values[0] = EXTEND16 (OP[2]);
132       trace_values[1] = State.regs[OP[0]];
133       trace_num_values = 2;
134       break;
135 
136     case OP_STORE32:
137       trace_values[0] = State.regs[OP[1]];
138       trace_values[1] = EXTEND16 (OP[2]);
139       trace_values[2] = State.regs[OP[0]];
140       trace_num_values = 3;
141       break;
142 
143     case OP_JUMP:
144       trace_values[0] = SEXT22 (OP[0]);
145       trace_values[1] = State.pc;
146       trace_num_values = 2;
147       break;
148 
149     case OP_IMM_REG_REG:
150       trace_values[0] = EXTEND16 (OP[0]) << size;
151       trace_values[1] = State.regs[OP[1]];
152       trace_num_values = 2;
153       break;
154 
155     case OP_IMM16_REG_REG:
156       trace_values[0] = EXTEND16 (OP[2]) << size;
157       trace_values[1] = State.regs[OP[1]];
158       trace_num_values = 2;
159       break;
160 
161     case OP_UIMM_REG_REG:
162       trace_values[0] = (OP[0] & 0xffff) << size;
163       trace_values[1] = State.regs[OP[1]];
164       trace_num_values = 2;
165       break;
166 
167     case OP_UIMM16_REG_REG:
168       trace_values[0] = (OP[2]) << size;
169       trace_values[1] = State.regs[OP[1]];
170       trace_num_values = 2;
171       break;
172 
173     case OP_BIT:
174       trace_num_values = 0;
175       break;
176 
177     case OP_EX1:
178       trace_values[0] = PSW;
179       trace_num_values = 1;
180       break;
181 
182     case OP_EX2:
183       trace_num_values = 0;
184       break;
185 
186     case OP_LDSR:
187       trace_values[0] = State.regs[OP[0]];
188       trace_num_values = 1;
189       break;
190 
191     case OP_STSR:
192       trace_values[0] = State.sregs[OP[1]];
193       trace_num_values = 1;
194     }
195 
196 }
197 
198 void
199 trace_result (int has_result, unsigned32 result)
200 {
201   char buf[1000];
202   char *chp;
203 
204   buf[0] = '\0';
205   chp = buf;
206 
207   /* write out the values saved during the trace_input call */
208   {
209     int i;
210     for (i = 0; i < trace_num_values; i++)
211       {
212 	sprintf (chp, "%*s0x%.8lx", SIZE_VALUES - 10, "",
213 		 (long) trace_values[i]);
214 	chp = strchr (chp, '\0');
215       }
216     while (i++ < 3)
217       {
218 	sprintf (chp, "%*s", SIZE_VALUES, "");
219 	chp = strchr (chp, '\0');
220       }
221   }
222 
223   /* append any result to the end of the buffer */
224   if (has_result)
225     sprintf (chp, " :: 0x%.8lx", (unsigned long) result);
226 
227   trace_generic (simulator, STATE_CPU (simulator, 0), trace_module, "%s", buf);
228 }
229 
230 void
231 trace_output (enum op_types result)
232 {
233   if (!TRACE_ALU_P (STATE_CPU (simulator, 0)))
234     return;
235 
236   switch (result)
237     {
238     default:
239     case OP_UNKNOWN:
240     case OP_NONE:
241     case OP_TRAP:
242     case OP_REG:
243     case OP_REG_REG_CMP:
244     case OP_IMM_REG_CMP:
245     case OP_COND_BR:
246     case OP_STORE16:
247     case OP_STORE32:
248     case OP_BIT:
249     case OP_EX2:
250       trace_result (0, 0);
251       break;
252 
253     case OP_LOAD16:
254     case OP_STSR:
255       trace_result (1, State.regs[OP[0]]);
256       break;
257 
258     case OP_REG_REG:
259     case OP_REG_REG_MOVE:
260     case OP_IMM_REG:
261     case OP_IMM_REG_MOVE:
262     case OP_LOAD32:
263     case OP_EX1:
264       trace_result (1, State.regs[OP[1]]);
265       break;
266 
267     case OP_IMM_REG_REG:
268     case OP_UIMM_REG_REG:
269     case OP_IMM16_REG_REG:
270     case OP_UIMM16_REG_REG:
271       trace_result (1, State.regs[OP[1]]);
272       break;
273 
274     case OP_JUMP:
275       if (OP[1] != 0)
276 	trace_result (1, State.regs[OP[1]]);
277       else
278 	trace_result (0, 0);
279       break;
280 
281     case OP_LDSR:
282       trace_result (1, State.sregs[OP[1]]);
283       break;
284     }
285 }
286 #endif
287 
288 
289 /* Returns 1 if the specific condition is met, returns 0 otherwise.  */
290 int
291 condition_met (unsigned code)
292 {
293   unsigned int psw = PSW;
294 
295   switch (code & 0xf)
296     {
297       case 0x0: return ((psw & PSW_OV) != 0);
298       case 0x1:	return ((psw & PSW_CY) != 0);
299       case 0x2:	return ((psw & PSW_Z) != 0);
300       case 0x3:	return ((((psw & PSW_CY) != 0) | ((psw & PSW_Z) != 0)) != 0);
301       case 0x4:	return ((psw & PSW_S) != 0);
302     /*case 0x5:	return 1;*/
303       case 0x6: return ((((psw & PSW_S) != 0) ^ ((psw & PSW_OV) != 0)) != 0);
304       case 0x7:	return (((((psw & PSW_S) != 0) ^ ((psw & PSW_OV) != 0)) || ((psw & PSW_Z) != 0)) != 0);
305       case 0x8:	return ((psw & PSW_OV) == 0);
306       case 0x9:	return ((psw & PSW_CY) == 0);
307       case 0xa:	return ((psw & PSW_Z) == 0);
308       case 0xb:	return ((((psw & PSW_CY) != 0) | ((psw & PSW_Z) != 0)) == 0);
309       case 0xc:	return ((psw & PSW_S) == 0);
310       case 0xd:	return ((psw & PSW_SAT) != 0);
311       case 0xe:	return ((((psw & PSW_S) != 0) ^ ((psw & PSW_OV) != 0)) == 0);
312       case 0xf:	return (((((psw & PSW_S) != 0) ^ ((psw & PSW_OV) != 0)) || ((psw & PSW_Z) != 0)) == 0);
313     }
314 
315   return 1;
316 }
317 
318 unsigned long
319 Add32 (unsigned long a1, unsigned long a2, int * carry)
320 {
321   unsigned long result = (a1 + a2);
322 
323   * carry = (result < a1);
324 
325   return result;
326 }
327 
328 static void
329 Multiply64 (int sign, unsigned long op0)
330 {
331   unsigned long op1;
332   unsigned long lo;
333   unsigned long mid1;
334   unsigned long mid2;
335   unsigned long hi;
336   unsigned long RdLo;
337   unsigned long RdHi;
338   int           carry;
339 
340   op1 = State.regs[ OP[1] ];
341 
342   if (sign)
343     {
344       /* Compute sign of result and adjust operands if necessary.  */
345 
346       sign = (op0 ^ op1) & 0x80000000;
347 
348       if (((signed long) op0) < 0)
349 	op0 = - op0;
350 
351       if (((signed long) op1) < 0)
352 	op1 = - op1;
353     }
354 
355   /* We can split the 32x32 into four 16x16 operations. This ensures
356      that we do not lose precision on 32bit only hosts: */
357   lo   = ( (op0        & 0xFFFF) *  (op1        & 0xFFFF));
358   mid1 = ( (op0        & 0xFFFF) * ((op1 >> 16) & 0xFFFF));
359   mid2 = (((op0 >> 16) & 0xFFFF) *  (op1        & 0xFFFF));
360   hi   = (((op0 >> 16) & 0xFFFF) * ((op1 >> 16) & 0xFFFF));
361 
362   /* We now need to add all of these results together, taking care
363      to propogate the carries from the additions: */
364   RdLo = Add32 (lo, (mid1 << 16), & carry);
365   RdHi = carry;
366   RdLo = Add32 (RdLo, (mid2 << 16), & carry);
367   RdHi += (carry + ((mid1 >> 16) & 0xFFFF) + ((mid2 >> 16) & 0xFFFF) + hi);
368 
369   if (sign)
370     {
371       /* Negate result if necessary.  */
372 
373       RdLo = ~ RdLo;
374       RdHi = ~ RdHi;
375       if (RdLo == 0xFFFFFFFF)
376 	{
377 	  RdLo = 0;
378 	  RdHi += 1;
379 	}
380       else
381 	RdLo += 1;
382     }
383 
384   /* Don't store into register 0.  */
385   if (OP[1])
386     State.regs[ OP[1]       ] = RdLo;
387   if (OP[2] >> 11)
388     State.regs[ OP[2] >> 11 ] = RdHi;
389 
390   return;
391 }
392 
393 
394 /* Read a null terminated string from memory, return in a buffer.  */
395 
396 static char *
397 fetch_str (SIM_DESC sd, address_word addr)
398 {
399   char *buf;
400   int nr = 0;
401 
402   while (sim_core_read_1 (STATE_CPU (sd, 0),
403 			  PC, read_map, addr + nr) != 0)
404     nr++;
405 
406   buf = NZALLOC (char, nr + 1);
407   sim_read (simulator, addr, (unsigned char *) buf, nr);
408 
409   return buf;
410 }
411 
412 /* Read a null terminated argument vector from memory, return in a
413    buffer.  */
414 
415 static char **
416 fetch_argv (SIM_DESC sd, address_word addr)
417 {
418   int max_nr = 64;
419   int nr = 0;
420   char **buf = xmalloc (max_nr * sizeof (char*));
421 
422   while (1)
423     {
424       unsigned32 a = sim_core_read_4 (STATE_CPU (sd, 0),
425 				      PC, read_map, addr + nr * 4);
426       if (a == 0) break;
427       buf[nr] = fetch_str (sd, a);
428       nr ++;
429       if (nr == max_nr - 1)
430 	{
431 	  max_nr += 50;
432 	  buf = xrealloc (buf, max_nr * sizeof (char*));
433 	}
434     }
435   buf[nr] = 0;
436   return buf;
437 }
438 
439 
440 /* sst.b */
441 int
442 OP_380 (void)
443 {
444   trace_input ("sst.b", OP_STORE16, 1);
445 
446   store_mem (State.regs[30] + (OP[3] & 0x7f), 1, State.regs[ OP[1] ]);
447 
448   trace_output (OP_STORE16);
449 
450   return 2;
451 }
452 
453 /* sst.h */
454 int
455 OP_480 (void)
456 {
457   trace_input ("sst.h", OP_STORE16, 2);
458 
459   store_mem (State.regs[30] + ((OP[3] & 0x7f) << 1), 2, State.regs[ OP[1] ]);
460 
461   trace_output (OP_STORE16);
462 
463   return 2;
464 }
465 
466 /* sst.w */
467 int
468 OP_501 (void)
469 {
470   trace_input ("sst.w", OP_STORE16, 4);
471 
472   store_mem (State.regs[30] + ((OP[3] & 0x7e) << 1), 4, State.regs[ OP[1] ]);
473 
474   trace_output (OP_STORE16);
475 
476   return 2;
477 }
478 
479 /* ld.b */
480 int
481 OP_700 (void)
482 {
483   int adr;
484 
485   trace_input ("ld.b", OP_LOAD32, 1);
486 
487   adr = State.regs[ OP[0] ] + EXTEND16 (OP[2]);
488 
489   State.regs[ OP[1] ] = EXTEND8 (load_mem (adr, 1));
490 
491   trace_output (OP_LOAD32);
492 
493   return 4;
494 }
495 
496 /* ld.h */
497 int
498 OP_720 (void)
499 {
500   int adr;
501 
502   trace_input ("ld.h", OP_LOAD32, 2);
503 
504   adr = State.regs[ OP[0] ] + EXTEND16 (OP[2]);
505   adr &= ~0x1;
506 
507   State.regs[ OP[1] ] = EXTEND16 (load_mem (adr, 2));
508 
509   trace_output (OP_LOAD32);
510 
511   return 4;
512 }
513 
514 /* ld.w */
515 int
516 OP_10720 (void)
517 {
518   int adr;
519 
520   trace_input ("ld.w", OP_LOAD32, 4);
521 
522   adr = State.regs[ OP[0] ] + EXTEND16 (OP[2] & ~1);
523   adr &= ~0x3;
524 
525   State.regs[ OP[1] ] = load_mem (adr, 4);
526 
527   trace_output (OP_LOAD32);
528 
529   return 4;
530 }
531 
532 /* st.b */
533 int
534 OP_740 (void)
535 {
536   trace_input ("st.b", OP_STORE32, 1);
537 
538   store_mem (State.regs[ OP[0] ] + EXTEND16 (OP[2]), 1, State.regs[ OP[1] ]);
539 
540   trace_output (OP_STORE32);
541 
542   return 4;
543 }
544 
545 /* st.h */
546 int
547 OP_760 (void)
548 {
549   int adr;
550 
551   trace_input ("st.h", OP_STORE32, 2);
552 
553   adr = State.regs[ OP[0] ] + EXTEND16 (OP[2]);
554   adr &= ~1;
555 
556   store_mem (adr, 2, State.regs[ OP[1] ]);
557 
558   trace_output (OP_STORE32);
559 
560   return 4;
561 }
562 
563 /* st.w */
564 int
565 OP_10760 (void)
566 {
567   int adr;
568 
569   trace_input ("st.w", OP_STORE32, 4);
570 
571   adr = State.regs[ OP[0] ] + EXTEND16 (OP[2] & ~1);
572   adr &= ~3;
573 
574   store_mem (adr, 4, State.regs[ OP[1] ]);
575 
576   trace_output (OP_STORE32);
577 
578   return 4;
579 }
580 
581 /* add reg, reg */
582 int
583 OP_1C0 (void)
584 {
585   unsigned int op0, op1, result, z, s, cy, ov;
586 
587   trace_input ("add", OP_REG_REG, 0);
588 
589   /* Compute the result.  */
590 
591   op0 = State.regs[ OP[0] ];
592   op1 = State.regs[ OP[1] ];
593 
594   result = op0 + op1;
595 
596   /* Compute the condition codes.  */
597   z = (result == 0);
598   s = (result & 0x80000000);
599   cy = (result < op0 || result < op1);
600   ov = ((op0 & 0x80000000) == (op1 & 0x80000000)
601 	&& (op0 & 0x80000000) != (result & 0x80000000));
602 
603   /* Store the result and condition codes.  */
604   State.regs[OP[1]] = result;
605   PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
606   PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
607 		     | (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0));
608   trace_output (OP_REG_REG);
609 
610   return 2;
611 }
612 
613 /* add sign_extend(imm5), reg */
614 int
615 OP_240 (void)
616 {
617   unsigned int op0, op1, result, z, s, cy, ov;
618   int temp;
619 
620   trace_input ("add", OP_IMM_REG, 0);
621 
622   /* Compute the result.  */
623   temp = SEXT5 (OP[0]);
624   op0 = temp;
625   op1 = State.regs[OP[1]];
626   result = op0 + op1;
627 
628   /* Compute the condition codes.  */
629   z = (result == 0);
630   s = (result & 0x80000000);
631   cy = (result < op0 || result < op1);
632   ov = ((op0 & 0x80000000) == (op1 & 0x80000000)
633 	&& (op0 & 0x80000000) != (result & 0x80000000));
634 
635   /* Store the result and condition codes.  */
636   State.regs[OP[1]] = result;
637   PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
638   PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
639 		| (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0));
640   trace_output (OP_IMM_REG);
641 
642   return 2;
643 }
644 
645 /* addi sign_extend(imm16), reg, reg */
646 int
647 OP_600 (void)
648 {
649   unsigned int op0, op1, result, z, s, cy, ov;
650 
651   trace_input ("addi", OP_IMM16_REG_REG, 0);
652 
653   /* Compute the result.  */
654 
655   op0 = EXTEND16 (OP[2]);
656   op1 = State.regs[ OP[0] ];
657   result = op0 + op1;
658 
659   /* Compute the condition codes.  */
660   z = (result == 0);
661   s = (result & 0x80000000);
662   cy = (result < op0 || result < op1);
663   ov = ((op0 & 0x80000000) == (op1 & 0x80000000)
664 	&& (op0 & 0x80000000) != (result & 0x80000000));
665 
666   /* Store the result and condition codes.  */
667   State.regs[OP[1]] = result;
668   PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
669   PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
670 		| (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0));
671   trace_output (OP_IMM16_REG_REG);
672 
673   return 4;
674 }
675 
676 /* sub reg1, reg2 */
677 int
678 OP_1A0 (void)
679 {
680   unsigned int op0, op1, result, z, s, cy, ov;
681 
682   trace_input ("sub", OP_REG_REG, 0);
683   /* Compute the result.  */
684   op0 = State.regs[ OP[0] ];
685   op1 = State.regs[ OP[1] ];
686   result = op1 - op0;
687 
688   /* Compute the condition codes.  */
689   z = (result == 0);
690   s = (result & 0x80000000);
691   cy = (op1 < op0);
692   ov = ((op1 & 0x80000000) != (op0 & 0x80000000)
693 	&& (op1 & 0x80000000) != (result & 0x80000000));
694 
695   /* Store the result and condition codes.  */
696   State.regs[OP[1]] = result;
697   PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
698   PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
699 		| (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0));
700   trace_output (OP_REG_REG);
701 
702   return 2;
703 }
704 
705 /* subr reg1, reg2 */
706 int
707 OP_180 (void)
708 {
709   unsigned int op0, op1, result, z, s, cy, ov;
710 
711   trace_input ("subr", OP_REG_REG, 0);
712   /* Compute the result.  */
713   op0 = State.regs[ OP[0] ];
714   op1 = State.regs[ OP[1] ];
715   result = op0 - op1;
716 
717   /* Compute the condition codes.  */
718   z = (result == 0);
719   s = (result & 0x80000000);
720   cy = (op0 < op1);
721   ov = ((op0 & 0x80000000) != (op1 & 0x80000000)
722 	&& (op0 & 0x80000000) != (result & 0x80000000));
723 
724   /* Store the result and condition codes.  */
725   State.regs[OP[1]] = result;
726   PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
727   PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
728 		| (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0));
729   trace_output (OP_REG_REG);
730 
731   return 2;
732 }
733 
734 /* sxh reg1 */
735 int
736 OP_E0 (void)
737 {
738   trace_input ("mulh", OP_REG_REG, 0);
739 
740   State.regs[ OP[1] ] = (EXTEND16 (State.regs[ OP[1] ]) * EXTEND16 (State.regs[ OP[0] ]));
741 
742   trace_output (OP_REG_REG);
743 
744   return 2;
745 }
746 
747 /* mulh sign_extend(imm5), reg2 */
748 int
749 OP_2E0 (void)
750 {
751   trace_input ("mulh", OP_IMM_REG, 0);
752 
753   State.regs[ OP[1] ] = EXTEND16 (State.regs[ OP[1] ]) * SEXT5 (OP[0]);
754 
755   trace_output (OP_IMM_REG);
756 
757   return 2;
758 }
759 
760 /* mulhi imm16, reg1, reg2 */
761 int
762 OP_6E0 (void)
763 {
764   trace_input ("mulhi", OP_IMM16_REG_REG, 0);
765 
766   State.regs[ OP[1] ] = EXTEND16 (State.regs[ OP[0] ]) * EXTEND16 (OP[2]);
767 
768   trace_output (OP_IMM16_REG_REG);
769 
770   return 4;
771 }
772 
773 /* cmp reg, reg */
774 int
775 OP_1E0 (void)
776 {
777   unsigned int op0, op1, result, z, s, cy, ov;
778 
779   trace_input ("cmp", OP_REG_REG_CMP, 0);
780   /* Compute the result.  */
781   op0 = State.regs[ OP[0] ];
782   op1 = State.regs[ OP[1] ];
783   result = op1 - op0;
784 
785   /* Compute the condition codes.  */
786   z = (result == 0);
787   s = (result & 0x80000000);
788   cy = (op1 < op0);
789   ov = ((op1 & 0x80000000) != (op0 & 0x80000000)
790 	&& (op1 & 0x80000000) != (result & 0x80000000));
791 
792   /* Set condition codes.  */
793   PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
794   PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
795 		| (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0));
796   trace_output (OP_REG_REG_CMP);
797 
798   return 2;
799 }
800 
801 /* cmp sign_extend(imm5), reg */
802 int
803 OP_260 (void)
804 {
805   unsigned int op0, op1, result, z, s, cy, ov;
806   int temp;
807 
808   /* Compute the result.  */
809   trace_input ("cmp", OP_IMM_REG_CMP, 0);
810   temp = SEXT5 (OP[0]);
811   op0 = temp;
812   op1 = State.regs[OP[1]];
813   result = op1 - op0;
814 
815   /* Compute the condition codes.  */
816   z = (result == 0);
817   s = (result & 0x80000000);
818   cy = (op1 < op0);
819   ov = ((op1 & 0x80000000) != (op0 & 0x80000000)
820 	&& (op1 & 0x80000000) != (result & 0x80000000));
821 
822   /* Set condition codes.  */
823   PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
824   PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
825 		| (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0));
826   trace_output (OP_IMM_REG_CMP);
827 
828   return 2;
829 }
830 
831 /* setf cccc,reg2 */
832 int
833 OP_7E0 (void)
834 {
835   trace_input ("setf", OP_EX1, 0);
836 
837   State.regs[ OP[1] ] = condition_met (OP[0]);
838 
839   trace_output (OP_EX1);
840 
841   return 4;
842 }
843 
844 /* satadd reg,reg */
845 int
846 OP_C0 (void)
847 {
848   unsigned int op0, op1, result, z, s, cy, ov, sat;
849 
850   trace_input ("satadd", OP_REG_REG, 0);
851   /* Compute the result.  */
852   op0 = State.regs[ OP[0] ];
853   op1 = State.regs[ OP[1] ];
854   result = op0 + op1;
855 
856   /* Compute the condition codes.  */
857   z = (result == 0);
858   s = (result & 0x80000000);
859   cy = (result < op0 || result < op1);
860   ov = ((op0 & 0x80000000) == (op1 & 0x80000000)
861 	&& (op0 & 0x80000000) != (result & 0x80000000));
862   sat = ov;
863 
864   /* Handle saturated results.  */
865   if (sat && s)
866     {
867       /* An overflow that results in a negative result implies that we
868 	 became too positive.  */
869       result = 0x7fffffff;
870       s = 0;
871     }
872   else if (sat)
873     {
874       /* Any other overflow must have thus been too negative.  */
875       result = 0x80000000;
876       s = 1;
877       z = 0;
878     }
879 
880   /* Store the result and condition codes.  */
881   State.regs[OP[1]] = result;
882   PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
883   PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
884 	  | (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0)
885 	  | (sat ? PSW_SAT : 0));
886 
887   trace_output (OP_REG_REG);
888 
889   return 2;
890 }
891 
892 /* satadd sign_extend(imm5), reg */
893 int
894 OP_220 (void)
895 {
896   unsigned int op0, op1, result, z, s, cy, ov, sat;
897 
898   int temp;
899 
900   trace_input ("satadd", OP_IMM_REG, 0);
901 
902   /* Compute the result.  */
903   temp = SEXT5 (OP[0]);
904   op0 = temp;
905   op1 = State.regs[OP[1]];
906   result = op0 + op1;
907 
908   /* Compute the condition codes.  */
909   z = (result == 0);
910   s = (result & 0x80000000);
911   cy = (result < op0 || result < op1);
912   ov = ((op0 & 0x80000000) == (op1 & 0x80000000)
913 	&& (op0 & 0x80000000) != (result & 0x80000000));
914   sat = ov;
915 
916   /* Handle saturated results.  */
917   if (sat && s)
918     {
919       /* An overflow that results in a negative result implies that we
920 	 became too positive.  */
921       result = 0x7fffffff;
922       s = 0;
923     }
924   else if (sat)
925     {
926       /* Any other overflow must have thus been too negative.  */
927       result = 0x80000000;
928       s = 1;
929       z = 0;
930     }
931 
932   /* Store the result and condition codes.  */
933   State.regs[OP[1]] = result;
934   PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
935   PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
936 		| (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0)
937 		| (sat ? PSW_SAT : 0));
938   trace_output (OP_IMM_REG);
939 
940   return 2;
941 }
942 
943 /* satsub reg1, reg2 */
944 int
945 OP_A0 (void)
946 {
947   unsigned int op0, op1, result, z, s, cy, ov, sat;
948 
949   trace_input ("satsub", OP_REG_REG, 0);
950 
951   /* Compute the result.  */
952   op0 = State.regs[ OP[0] ];
953   op1 = State.regs[ OP[1] ];
954   result = op1 - op0;
955 
956   /* Compute the condition codes.  */
957   z = (result == 0);
958   s = (result & 0x80000000);
959   cy = (op1 < op0);
960   ov = ((op1 & 0x80000000) != (op0 & 0x80000000)
961 	&& (op1 & 0x80000000) != (result & 0x80000000));
962   sat = ov;
963 
964   /* Handle saturated results.  */
965   if (sat && s)
966     {
967       /* An overflow that results in a negative result implies that we
968 	 became too positive.  */
969       result = 0x7fffffff;
970       s = 0;
971     }
972   else if (sat)
973     {
974       /* Any other overflow must have thus been too negative.  */
975       result = 0x80000000;
976       s = 1;
977       z = 0;
978     }
979 
980   /* Store the result and condition codes.  */
981   State.regs[OP[1]] = result;
982   PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
983   PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
984 	  | (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0)
985 	  | (sat ? PSW_SAT : 0));
986 
987   trace_output (OP_REG_REG);
988   return 2;
989 }
990 
991 /* satsubi sign_extend(imm16), reg */
992 int
993 OP_660 (void)
994 {
995   unsigned int op0, op1, result, z, s, cy, ov, sat;
996   int temp;
997 
998   trace_input ("satsubi", OP_IMM_REG, 0);
999 
1000   /* Compute the result.  */
1001   temp = EXTEND16 (OP[2]);
1002   op0 = temp;
1003   op1 = State.regs[ OP[0] ];
1004   result = op1 - op0;
1005 
1006   /* Compute the condition codes.  */
1007   z = (result == 0);
1008   s = (result & 0x80000000);
1009   cy = (op1 < op0);
1010   ov = ((op1 & 0x80000000) != (op0 & 0x80000000)
1011 	&& (op1 & 0x80000000) != (result & 0x80000000));
1012   sat = ov;
1013 
1014   /* Handle saturated results.  */
1015   if (sat && s)
1016     {
1017       /* An overflow that results in a negative result implies that we
1018 	 became too positive.  */
1019       result = 0x7fffffff;
1020       s = 0;
1021     }
1022   else if (sat)
1023     {
1024       /* Any other overflow must have thus been too negative.  */
1025       result = 0x80000000;
1026       s = 1;
1027       z = 0;
1028     }
1029 
1030   /* Store the result and condition codes.  */
1031   State.regs[OP[1]] = result;
1032   PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
1033   PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
1034 		| (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0)
1035 		| (sat ? PSW_SAT : 0));
1036 
1037   trace_output (OP_IMM_REG);
1038 
1039   return 4;
1040 }
1041 
1042 /* satsubr reg,reg */
1043 int
1044 OP_80 (void)
1045 {
1046   unsigned int op0, op1, result, z, s, cy, ov, sat;
1047 
1048   trace_input ("satsubr", OP_REG_REG, 0);
1049 
1050   /* Compute the result.  */
1051   op0 = State.regs[ OP[0] ];
1052   op1 = State.regs[ OP[1] ];
1053   result = op0 - op1;
1054 
1055   /* Compute the condition codes.  */
1056   z = (result == 0);
1057   s = (result & 0x80000000);
1058   cy = (op0 < op1);
1059   ov = ((op0 & 0x80000000) != (op1 & 0x80000000)
1060 	&& (op0 & 0x80000000) != (result & 0x80000000));
1061   sat = ov;
1062 
1063   /* Handle saturated results.  */
1064   if (sat && s)
1065     {
1066       /* An overflow that results in a negative result implies that we
1067 	 became too positive.  */
1068       result = 0x7fffffff;
1069       s = 0;
1070     }
1071   else if (sat)
1072     {
1073       /* Any other overflow must have thus been too negative.  */
1074       result = 0x80000000;
1075       s = 1;
1076       z = 0;
1077     }
1078 
1079   /* Store the result and condition codes.  */
1080   State.regs[OP[1]] = result;
1081   PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
1082   PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
1083 	  | (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0)
1084 	  | (sat ? PSW_SAT : 0));
1085 
1086   trace_output (OP_REG_REG);
1087 
1088   return 2;
1089 }
1090 
1091 /* tst reg,reg */
1092 int
1093 OP_160 (void)
1094 {
1095   unsigned int op0, op1, result, z, s;
1096 
1097   trace_input ("tst", OP_REG_REG_CMP, 0);
1098 
1099   /* Compute the result.  */
1100   op0 = State.regs[ OP[0] ];
1101   op1 = State.regs[ OP[1] ];
1102   result = op0 & op1;
1103 
1104   /* Compute the condition codes.  */
1105   z = (result == 0);
1106   s = (result & 0x80000000);
1107 
1108   /* Store the condition codes.  */
1109   PSW &= ~(PSW_Z | PSW_S | PSW_OV);
1110   PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0));
1111   trace_output (OP_REG_REG_CMP);
1112 
1113   return 2;
1114 }
1115 
1116 /* mov sign_extend(imm5), reg */
1117 int
1118 OP_200 (void)
1119 {
1120   int value = SEXT5 (OP[0]);
1121 
1122   trace_input ("mov", OP_IMM_REG_MOVE, 0);
1123 
1124   State.regs[ OP[1] ] = value;
1125 
1126   trace_output (OP_IMM_REG_MOVE);
1127 
1128   return 2;
1129 }
1130 
1131 /* movhi imm16, reg, reg */
1132 int
1133 OP_640 (void)
1134 {
1135   trace_input ("movhi", OP_UIMM16_REG_REG, 16);
1136 
1137   State.regs[ OP[1] ] = State.regs[ OP[0] ] + (OP[2] << 16);
1138 
1139   trace_output (OP_UIMM16_REG_REG);
1140 
1141   return 4;
1142 }
1143 
1144 /* sar zero_extend(imm5),reg1 */
1145 int
1146 OP_2A0 (void)
1147 {
1148   unsigned int op0, op1, result, z, s, cy;
1149 
1150   trace_input ("sar", OP_IMM_REG, 0);
1151   op0 = OP[0];
1152   op1 = State.regs[ OP[1] ];
1153   result = (signed)op1 >> op0;
1154 
1155   /* Compute the condition codes.  */
1156   z = (result == 0);
1157   s = (result & 0x80000000);
1158   cy = op0 ? (op1 & (1 << (op0 - 1))) : 0;
1159 
1160   /* Store the result and condition codes.  */
1161   State.regs[ OP[1] ] = result;
1162   PSW &= ~(PSW_Z | PSW_S | PSW_OV | PSW_CY);
1163   PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
1164 		| (cy ? PSW_CY : 0));
1165   trace_output (OP_IMM_REG);
1166 
1167   return 2;
1168 }
1169 
1170 /* sar reg1, reg2 */
1171 int
1172 OP_A007E0 (void)
1173 {
1174   unsigned int op0, op1, result, z, s, cy;
1175 
1176   trace_input ("sar", OP_REG_REG, 0);
1177 
1178   op0 = State.regs[ OP[0] ] & 0x1f;
1179   op1 = State.regs[ OP[1] ];
1180   result = (signed)op1 >> op0;
1181 
1182   /* Compute the condition codes.  */
1183   z = (result == 0);
1184   s = (result & 0x80000000);
1185   cy = op0 ? (op1 & (1 << (op0 - 1))) : 0;
1186 
1187   /* Store the result and condition codes.  */
1188   State.regs[OP[1]] = result;
1189   PSW &= ~(PSW_Z | PSW_S | PSW_OV | PSW_CY);
1190   PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
1191 		| (cy ? PSW_CY : 0));
1192   trace_output (OP_REG_REG);
1193 
1194   return 4;
1195 }
1196 
1197 /* shl zero_extend(imm5),reg1 */
1198 int
1199 OP_2C0 (void)
1200 {
1201   unsigned int op0, op1, result, z, s, cy;
1202 
1203   trace_input ("shl", OP_IMM_REG, 0);
1204   op0 = OP[0];
1205   op1 = State.regs[ OP[1] ];
1206   result = op1 << op0;
1207 
1208   /* Compute the condition codes.  */
1209   z = (result == 0);
1210   s = (result & 0x80000000);
1211   cy = op0 ? (op1 & (1 << (32 - op0))) : 0;
1212 
1213   /* Store the result and condition codes.  */
1214   State.regs[OP[1]] = result;
1215   PSW &= ~(PSW_Z | PSW_S | PSW_OV | PSW_CY);
1216   PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
1217 		| (cy ? PSW_CY : 0));
1218   trace_output (OP_IMM_REG);
1219 
1220   return 2;
1221 }
1222 
1223 /* shl reg1, reg2 */
1224 int
1225 OP_C007E0 (void)
1226 {
1227   unsigned int op0, op1, result, z, s, cy;
1228 
1229   trace_input ("shl", OP_REG_REG, 0);
1230   op0 = State.regs[ OP[0] ] & 0x1f;
1231   op1 = State.regs[ OP[1] ];
1232   result = op1 << op0;
1233 
1234   /* Compute the condition codes.  */
1235   z = (result == 0);
1236   s = (result & 0x80000000);
1237   cy = op0 ? (op1 & (1 << (32 - op0))) : 0;
1238 
1239   /* Store the result and condition codes.  */
1240   State.regs[OP[1]] = result;
1241   PSW &= ~(PSW_Z | PSW_S | PSW_OV | PSW_CY);
1242   PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
1243 		| (cy ? PSW_CY : 0));
1244   trace_output (OP_REG_REG);
1245 
1246   return 4;
1247 }
1248 
1249 /* shr zero_extend(imm5),reg1 */
1250 int
1251 OP_280 (void)
1252 {
1253   unsigned int op0, op1, result, z, s, cy;
1254 
1255   trace_input ("shr", OP_IMM_REG, 0);
1256   op0 = OP[0];
1257   op1 = State.regs[ OP[1] ];
1258   result = op1 >> op0;
1259 
1260   /* Compute the condition codes.  */
1261   z = (result == 0);
1262   s = (result & 0x80000000);
1263   cy = op0 ? (op1 & (1 << (op0 - 1))) : 0;
1264 
1265   /* Store the result and condition codes.  */
1266   State.regs[OP[1]] = result;
1267   PSW &= ~(PSW_Z | PSW_S | PSW_OV | PSW_CY);
1268   PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
1269 		| (cy ? PSW_CY : 0));
1270   trace_output (OP_IMM_REG);
1271 
1272   return 2;
1273 }
1274 
1275 /* shr reg1, reg2 */
1276 int
1277 OP_8007E0 (void)
1278 {
1279   unsigned int op0, op1, result, z, s, cy;
1280 
1281   trace_input ("shr", OP_REG_REG, 0);
1282   op0 = State.regs[ OP[0] ] & 0x1f;
1283   op1 = State.regs[ OP[1] ];
1284   result = op1 >> op0;
1285 
1286   /* Compute the condition codes.  */
1287   z = (result == 0);
1288   s = (result & 0x80000000);
1289   cy = op0 ? (op1 & (1 << (op0 - 1))) : 0;
1290 
1291   /* Store the result and condition codes.  */
1292   State.regs[OP[1]] = result;
1293   PSW &= ~(PSW_Z | PSW_S | PSW_OV | PSW_CY);
1294   PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
1295 		| (cy ? PSW_CY : 0));
1296   trace_output (OP_REG_REG);
1297 
1298   return 4;
1299 }
1300 
1301 /* or reg, reg */
1302 int
1303 OP_100 (void)
1304 {
1305   unsigned int op0, op1, result, z, s;
1306 
1307   trace_input ("or", OP_REG_REG, 0);
1308 
1309   /* Compute the result.  */
1310   op0 = State.regs[ OP[0] ];
1311   op1 = State.regs[ OP[1] ];
1312   result = op0 | op1;
1313 
1314   /* Compute the condition codes.  */
1315   z = (result == 0);
1316   s = (result & 0x80000000);
1317 
1318   /* Store the result and condition codes.  */
1319   State.regs[OP[1]] = result;
1320   PSW &= ~(PSW_Z | PSW_S | PSW_OV);
1321   PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0));
1322   trace_output (OP_REG_REG);
1323 
1324   return 2;
1325 }
1326 
1327 /* ori zero_extend(imm16), reg, reg */
1328 int
1329 OP_680 (void)
1330 {
1331   unsigned int op0, op1, result, z, s;
1332 
1333   trace_input ("ori", OP_UIMM16_REG_REG, 0);
1334   op0 = OP[2];
1335   op1 = State.regs[ OP[0] ];
1336   result = op0 | op1;
1337 
1338   /* Compute the condition codes.  */
1339   z = (result == 0);
1340   s = (result & 0x80000000);
1341 
1342   /* Store the result and condition codes.  */
1343   State.regs[OP[1]] = result;
1344   PSW &= ~(PSW_Z | PSW_S | PSW_OV);
1345   PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0));
1346   trace_output (OP_UIMM16_REG_REG);
1347 
1348   return 4;
1349 }
1350 
1351 /* and reg, reg */
1352 int
1353 OP_140 (void)
1354 {
1355   unsigned int op0, op1, result, z, s;
1356 
1357   trace_input ("and", OP_REG_REG, 0);
1358 
1359   /* Compute the result.  */
1360   op0 = State.regs[ OP[0] ];
1361   op1 = State.regs[ OP[1] ];
1362   result = op0 & op1;
1363 
1364   /* Compute the condition codes.  */
1365   z = (result == 0);
1366   s = (result & 0x80000000);
1367 
1368   /* Store the result and condition codes.  */
1369   State.regs[OP[1]] = result;
1370   PSW &= ~(PSW_Z | PSW_S | PSW_OV);
1371   PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0));
1372   trace_output (OP_REG_REG);
1373 
1374   return 2;
1375 }
1376 
1377 /* andi zero_extend(imm16), reg, reg */
1378 int
1379 OP_6C0 (void)
1380 {
1381   unsigned int result, z;
1382 
1383   trace_input ("andi", OP_UIMM16_REG_REG, 0);
1384 
1385   result = OP[2] & State.regs[ OP[0] ];
1386 
1387   /* Compute the condition codes.  */
1388   z = (result == 0);
1389 
1390   /* Store the result and condition codes.  */
1391   State.regs[ OP[1] ] = result;
1392 
1393   PSW &= ~(PSW_Z | PSW_S | PSW_OV);
1394   PSW |= (z ? PSW_Z : 0);
1395 
1396   trace_output (OP_UIMM16_REG_REG);
1397 
1398   return 4;
1399 }
1400 
1401 /* xor reg, reg */
1402 int
1403 OP_120 (void)
1404 {
1405   unsigned int op0, op1, result, z, s;
1406 
1407   trace_input ("xor", OP_REG_REG, 0);
1408 
1409   /* Compute the result.  */
1410   op0 = State.regs[ OP[0] ];
1411   op1 = State.regs[ OP[1] ];
1412   result = op0 ^ op1;
1413 
1414   /* Compute the condition codes.  */
1415   z = (result == 0);
1416   s = (result & 0x80000000);
1417 
1418   /* Store the result and condition codes.  */
1419   State.regs[OP[1]] = result;
1420   PSW &= ~(PSW_Z | PSW_S | PSW_OV);
1421   PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0));
1422   trace_output (OP_REG_REG);
1423 
1424   return 2;
1425 }
1426 
1427 /* xori zero_extend(imm16), reg, reg */
1428 int
1429 OP_6A0 (void)
1430 {
1431   unsigned int op0, op1, result, z, s;
1432 
1433   trace_input ("xori", OP_UIMM16_REG_REG, 0);
1434   op0 = OP[2];
1435   op1 = State.regs[ OP[0] ];
1436   result = op0 ^ op1;
1437 
1438   /* Compute the condition codes.  */
1439   z = (result == 0);
1440   s = (result & 0x80000000);
1441 
1442   /* Store the result and condition codes.  */
1443   State.regs[OP[1]] = result;
1444   PSW &= ~(PSW_Z | PSW_S | PSW_OV);
1445   PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0));
1446   trace_output (OP_UIMM16_REG_REG);
1447 
1448   return 4;
1449 }
1450 
1451 /* not reg1, reg2 */
1452 int
1453 OP_20 (void)
1454 {
1455   unsigned int op0, result, z, s;
1456 
1457   trace_input ("not", OP_REG_REG_MOVE, 0);
1458   /* Compute the result.  */
1459   op0 = State.regs[ OP[0] ];
1460   result = ~op0;
1461 
1462   /* Compute the condition codes.  */
1463   z = (result == 0);
1464   s = (result & 0x80000000);
1465 
1466   /* Store the result and condition codes.  */
1467   State.regs[OP[1]] = result;
1468   PSW &= ~(PSW_Z | PSW_S | PSW_OV);
1469   PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0));
1470   trace_output (OP_REG_REG_MOVE);
1471 
1472   return 2;
1473 }
1474 
1475 /* set1 */
1476 int
1477 OP_7C0 (void)
1478 {
1479   unsigned int op0, op1, op2;
1480   int temp;
1481 
1482   trace_input ("set1", OP_BIT, 0);
1483   op0 = State.regs[ OP[0] ];
1484   op1 = OP[1] & 0x7;
1485   temp = EXTEND16 (OP[2]);
1486   op2 = temp;
1487   temp = load_mem (op0 + op2, 1);
1488   PSW &= ~PSW_Z;
1489   if ((temp & (1 << op1)) == 0)
1490     PSW |= PSW_Z;
1491   temp |= (1 << op1);
1492   store_mem (op0 + op2, 1, temp);
1493   trace_output (OP_BIT);
1494 
1495   return 4;
1496 }
1497 
1498 /* not1 */
1499 int
1500 OP_47C0 (void)
1501 {
1502   unsigned int op0, op1, op2;
1503   int temp;
1504 
1505   trace_input ("not1", OP_BIT, 0);
1506   op0 = State.regs[ OP[0] ];
1507   op1 = OP[1] & 0x7;
1508   temp = EXTEND16 (OP[2]);
1509   op2 = temp;
1510   temp = load_mem (op0 + op2, 1);
1511   PSW &= ~PSW_Z;
1512   if ((temp & (1 << op1)) == 0)
1513     PSW |= PSW_Z;
1514   temp ^= (1 << op1);
1515   store_mem (op0 + op2, 1, temp);
1516   trace_output (OP_BIT);
1517 
1518   return 4;
1519 }
1520 
1521 /* clr1 */
1522 int
1523 OP_87C0 (void)
1524 {
1525   unsigned int op0, op1, op2;
1526   int temp;
1527 
1528   trace_input ("clr1", OP_BIT, 0);
1529   op0 = State.regs[ OP[0] ];
1530   op1 = OP[1] & 0x7;
1531   temp = EXTEND16 (OP[2]);
1532   op2 = temp;
1533   temp = load_mem (op0 + op2, 1);
1534   PSW &= ~PSW_Z;
1535   if ((temp & (1 << op1)) == 0)
1536     PSW |= PSW_Z;
1537   temp &= ~(1 << op1);
1538   store_mem (op0 + op2, 1, temp);
1539   trace_output (OP_BIT);
1540 
1541   return 4;
1542 }
1543 
1544 /* tst1 */
1545 int
1546 OP_C7C0 (void)
1547 {
1548   unsigned int op0, op1, op2;
1549   int temp;
1550 
1551   trace_input ("tst1", OP_BIT, 0);
1552   op0 = State.regs[ OP[0] ];
1553   op1 = OP[1] & 0x7;
1554   temp = EXTEND16 (OP[2]);
1555   op2 = temp;
1556   temp = load_mem (op0 + op2, 1);
1557   PSW &= ~PSW_Z;
1558   if ((temp & (1 << op1)) == 0)
1559     PSW |= PSW_Z;
1560   trace_output (OP_BIT);
1561 
1562   return 4;
1563 }
1564 
1565 /* di */
1566 int
1567 OP_16007E0 (void)
1568 {
1569   trace_input ("di", OP_NONE, 0);
1570   PSW |= PSW_ID;
1571   trace_output (OP_NONE);
1572 
1573   return 4;
1574 }
1575 
1576 /* ei */
1577 int
1578 OP_16087E0 (void)
1579 {
1580   trace_input ("ei", OP_NONE, 0);
1581   PSW &= ~PSW_ID;
1582   trace_output (OP_NONE);
1583 
1584   return 4;
1585 }
1586 
1587 /* halt */
1588 int
1589 OP_12007E0 (void)
1590 {
1591   trace_input ("halt", OP_NONE, 0);
1592   /* FIXME this should put processor into a mode where NMI still handled */
1593   trace_output (OP_NONE);
1594   sim_engine_halt (simulator, STATE_CPU (simulator, 0), NULL, PC,
1595 		   sim_stopped, SIM_SIGTRAP);
1596   return 0;
1597 }
1598 
1599 /* trap */
1600 int
1601 OP_10007E0 (void)
1602 {
1603   trace_input ("trap", OP_TRAP, 0);
1604   trace_output (OP_TRAP);
1605 
1606   /* Trap 31 is used for simulating OS I/O functions */
1607 
1608   if (OP[0] == 31)
1609     {
1610       int save_errno = errno;
1611       errno = 0;
1612 
1613 /* Registers passed to trap 0 */
1614 
1615 #define FUNC   State.regs[6]	/* function number, return value */
1616 #define PARM1  State.regs[7]	/* optional parm 1 */
1617 #define PARM2  State.regs[8]	/* optional parm 2 */
1618 #define PARM3  State.regs[9]	/* optional parm 3 */
1619 
1620 /* Registers set by trap 0 */
1621 
1622 #define RETVAL State.regs[10]	/* return value */
1623 #define RETERR State.regs[11]	/* return error code */
1624 
1625 /* Turn a pointer in a register into a pointer into real memory. */
1626 
1627 #define MEMPTR(x) (map (x))
1628 
1629       RETERR = 0;
1630 
1631       switch (FUNC)
1632 	{
1633 
1634 #ifdef HAVE_FORK
1635 #ifdef TARGET_SYS_fork
1636 	case TARGET_SYS_fork:
1637 	  RETVAL = fork ();
1638 	  RETERR = errno;
1639 	  break;
1640 #endif
1641 #endif
1642 
1643 #ifdef HAVE_EXECVE
1644 #ifdef TARGET_SYS_execv
1645 	case TARGET_SYS_execve:
1646 	  {
1647 	    char *path = fetch_str (simulator, PARM1);
1648 	    char **argv = fetch_argv (simulator, PARM2);
1649 	    char **envp = fetch_argv (simulator, PARM3);
1650 	    RETVAL = execve (path, argv, envp);
1651 	    free (path);
1652 	    freeargv (argv);
1653 	    freeargv (envp);
1654 	    RETERR = errno;
1655 	    break;
1656 	  }
1657 #endif
1658 #endif
1659 
1660 #if HAVE_EXECV
1661 #ifdef TARGET_SYS_execv
1662 	case TARGET_SYS_execv:
1663 	  {
1664 	    char *path = fetch_str (simulator, PARM1);
1665 	    char **argv = fetch_argv (simulator, PARM2);
1666 	    RETVAL = execv (path, argv);
1667 	    free (path);
1668 	    freeargv (argv);
1669 	    RETERR = errno;
1670 	    break;
1671 	  }
1672 #endif
1673 #endif
1674 
1675 #if 0
1676 #ifdef TARGET_SYS_pipe
1677 	case TARGET_SYS_pipe:
1678 	  {
1679 	    reg_t buf;
1680 	    int host_fd[2];
1681 
1682 	    buf = PARM1;
1683 	    RETVAL = pipe (host_fd);
1684 	    SW (buf, host_fd[0]);
1685 	    buf += sizeof (uint16);
1686 	    SW (buf, host_fd[1]);
1687 	    RETERR = errno;
1688 	  }
1689 	  break;
1690 #endif
1691 #endif
1692 
1693 #if 0
1694 #ifdef TARGET_SYS_wait
1695 	case TARGET_SYS_wait:
1696 	  {
1697 	    int status;
1698 
1699 	    RETVAL = wait (&status);
1700 	    SW (PARM1, status);
1701 	    RETERR = errno;
1702 	  }
1703 	  break;
1704 #endif
1705 #endif
1706 
1707 #ifdef TARGET_SYS_read
1708 	case TARGET_SYS_read:
1709 	  {
1710 	    char *buf = zalloc (PARM3);
1711 	    RETVAL = sim_io_read (simulator, PARM1, buf, PARM3);
1712 	    sim_write (simulator, PARM2, (unsigned char *) buf, PARM3);
1713 	    free (buf);
1714 	    if ((int) RETVAL < 0)
1715 	      RETERR = sim_io_get_errno (simulator);
1716 	    break;
1717 	  }
1718 #endif
1719 
1720 #ifdef TARGET_SYS_write
1721 	case TARGET_SYS_write:
1722 	  {
1723 	    char *buf = zalloc (PARM3);
1724 	    sim_read (simulator, PARM2, (unsigned char *) buf, PARM3);
1725 	    if (PARM1 == 1)
1726 	      RETVAL = sim_io_write_stdout (simulator, buf, PARM3);
1727 	    else
1728 	      RETVAL = sim_io_write (simulator, PARM1, buf, PARM3);
1729 	    free (buf);
1730 	    if ((int) RETVAL < 0)
1731 	      RETERR = sim_io_get_errno (simulator);
1732 	    break;
1733 	  }
1734 #endif
1735 
1736 #ifdef TARGET_SYS_lseek
1737 	case TARGET_SYS_lseek:
1738 	  RETVAL = sim_io_lseek (simulator, PARM1, PARM2, PARM3);
1739 	  if ((int) RETVAL < 0)
1740 	    RETERR = sim_io_get_errno (simulator);
1741 	  break;
1742 #endif
1743 
1744 #ifdef TARGET_SYS_close
1745 	case TARGET_SYS_close:
1746 	  RETVAL = sim_io_close (simulator, PARM1);
1747 	  if ((int) RETVAL < 0)
1748 	    RETERR = sim_io_get_errno (simulator);
1749 	  break;
1750 #endif
1751 
1752 #ifdef TARGET_SYS_open
1753 	case TARGET_SYS_open:
1754 	  {
1755 	    char *buf = fetch_str (simulator, PARM1);
1756 	    RETVAL = sim_io_open (simulator, buf, PARM2);
1757 	    free (buf);
1758 	    if ((int) RETVAL < 0)
1759 	      RETERR = sim_io_get_errno (simulator);
1760 	    break;
1761 	  }
1762 #endif
1763 
1764 #ifdef TARGET_SYS_exit
1765 	case TARGET_SYS_exit:
1766 	  if ((PARM1 & 0xffff0000) == 0xdead0000 && (PARM1 & 0xffff) != 0)
1767 	    /* get signal encoded by kill */
1768 	    sim_engine_halt (simulator, STATE_CPU (simulator, 0), NULL, PC,
1769 			     sim_signalled, PARM1 & 0xffff);
1770 	  else if (PARM1 == 0xdead)
1771 	    /* old libraries */
1772 	    sim_engine_halt (simulator, STATE_CPU (simulator, 0), NULL, PC,
1773 			     sim_stopped, SIM_SIGABRT);
1774 	  else
1775 	    /* PARM1 has exit status */
1776 	    sim_engine_halt (simulator, STATE_CPU (simulator, 0), NULL, PC,
1777 			     sim_exited, PARM1);
1778 	  break;
1779 #endif
1780 
1781 #ifdef TARGET_SYS_stat
1782 	case TARGET_SYS_stat:	/* added at hmsi */
1783 	  /* stat system call */
1784 	  {
1785 	    struct stat host_stat;
1786 	    reg_t buf;
1787 	    char *path = fetch_str (simulator, PARM1);
1788 
1789 	    RETVAL = sim_io_stat (simulator, path, &host_stat);
1790 
1791 	    free (path);
1792 	    buf = PARM2;
1793 
1794 	    /* Just wild-assed guesses.  */
1795 	    store_mem (buf, 2, host_stat.st_dev);
1796 	    store_mem (buf + 2, 2, host_stat.st_ino);
1797 	    store_mem (buf + 4, 4, host_stat.st_mode);
1798 	    store_mem (buf + 8, 2, host_stat.st_nlink);
1799 	    store_mem (buf + 10, 2, host_stat.st_uid);
1800 	    store_mem (buf + 12, 2, host_stat.st_gid);
1801 	    store_mem (buf + 14, 2, host_stat.st_rdev);
1802 	    store_mem (buf + 16, 4, host_stat.st_size);
1803 	    store_mem (buf + 20, 4, host_stat.st_atime);
1804 	    store_mem (buf + 28, 4, host_stat.st_mtime);
1805 	    store_mem (buf + 36, 4, host_stat.st_ctime);
1806 
1807 	    if ((int) RETVAL < 0)
1808 	      RETERR = sim_io_get_errno (simulator);
1809 	  }
1810 	  break;
1811 #endif
1812 
1813 #ifdef TARGET_SYS_fstat
1814 	case TARGET_SYS_fstat:
1815 	  /* fstat system call */
1816 	  {
1817 	    struct stat host_stat;
1818 	    reg_t buf;
1819 
1820 	    RETVAL = sim_io_fstat (simulator, PARM1, &host_stat);
1821 
1822 	    buf = PARM2;
1823 
1824 	    /* Just wild-assed guesses.  */
1825 	    store_mem (buf, 2, host_stat.st_dev);
1826 	    store_mem (buf + 2, 2, host_stat.st_ino);
1827 	    store_mem (buf + 4, 4, host_stat.st_mode);
1828 	    store_mem (buf + 8, 2, host_stat.st_nlink);
1829 	    store_mem (buf + 10, 2, host_stat.st_uid);
1830 	    store_mem (buf + 12, 2, host_stat.st_gid);
1831 	    store_mem (buf + 14, 2, host_stat.st_rdev);
1832 	    store_mem (buf + 16, 4, host_stat.st_size);
1833 	    store_mem (buf + 20, 4, host_stat.st_atime);
1834 	    store_mem (buf + 28, 4, host_stat.st_mtime);
1835 	    store_mem (buf + 36, 4, host_stat.st_ctime);
1836 
1837 	    if ((int) RETVAL < 0)
1838 	      RETERR = sim_io_get_errno (simulator);
1839 	  }
1840 	  break;
1841 #endif
1842 
1843 #ifdef TARGET_SYS_rename
1844 	case TARGET_SYS_rename:
1845 	  {
1846 	    char *oldpath = fetch_str (simulator, PARM1);
1847 	    char *newpath = fetch_str (simulator, PARM2);
1848 	    RETVAL = sim_io_rename (simulator, oldpath, newpath);
1849 	    free (oldpath);
1850 	    free (newpath);
1851 	    if ((int) RETVAL < 0)
1852 	      RETERR = sim_io_get_errno (simulator);
1853 	  }
1854 	  break;
1855 #endif
1856 
1857 #ifdef TARGET_SYS_unlink
1858 	case TARGET_SYS_unlink:
1859 	  {
1860 	    char *path = fetch_str (simulator, PARM1);
1861 	    RETVAL = sim_io_unlink (simulator, path);
1862 	    free (path);
1863 	    if ((int) RETVAL < 0)
1864 	      RETERR = sim_io_get_errno (simulator);
1865 	  }
1866 	  break;
1867 #endif
1868 
1869 #ifdef HAVE_CHOWN
1870 #ifdef TARGET_SYS_chown
1871 	case TARGET_SYS_chown:
1872 	  {
1873 	    char *path = fetch_str (simulator, PARM1);
1874 	    RETVAL = chown (path, PARM2, PARM3);
1875 	    free (path);
1876 	    RETERR = errno;
1877 	  }
1878 	  break;
1879 #endif
1880 #endif
1881 
1882 #if HAVE_CHMOD
1883 #ifdef TARGET_SYS_chmod
1884 	case TARGET_SYS_chmod:
1885 	  {
1886 	    char *path = fetch_str (simulator, PARM1);
1887 	    RETVAL = chmod (path, PARM2);
1888 	    free (path);
1889 	    RETERR = errno;
1890 	  }
1891 	  break;
1892 #endif
1893 #endif
1894 
1895 #ifdef TARGET_SYS_time
1896 #if HAVE_TIME
1897 	case TARGET_SYS_time:
1898 	  {
1899 	    time_t now;
1900 	    RETVAL = time (&now);
1901 	    store_mem (PARM1, 4, now);
1902 	    RETERR = errno;
1903 	  }
1904 	  break;
1905 #endif
1906 #endif
1907 
1908 #if !defined(__GO32__) && !defined(_WIN32)
1909 #ifdef TARGET_SYS_times
1910 	case TARGET_SYS_times:
1911 	  {
1912 	    struct tms tms;
1913 	    RETVAL = times (&tms);
1914 	    store_mem (PARM1, 4, tms.tms_utime);
1915 	    store_mem (PARM1 + 4, 4, tms.tms_stime);
1916 	    store_mem (PARM1 + 8, 4, tms.tms_cutime);
1917 	    store_mem (PARM1 + 12, 4, tms.tms_cstime);
1918 	    reterr = errno;
1919 	    break;
1920 	  }
1921 #endif
1922 #endif
1923 
1924 #ifdef TARGET_SYS_gettimeofday
1925 #if !defined(__GO32__) && !defined(_WIN32)
1926 	case TARGET_SYS_gettimeofday:
1927 	  {
1928 	    struct timeval t;
1929 	    struct timezone tz;
1930 	    RETVAL = gettimeofday (&t, &tz);
1931 	    store_mem (PARM1, 4, t.tv_sec);
1932 	    store_mem (PARM1 + 4, 4, t.tv_usec);
1933 	    store_mem (PARM2, 4, tz.tz_minuteswest);
1934 	    store_mem (PARM2 + 4, 4, tz.tz_dsttime);
1935 	    RETERR = errno;
1936 	    break;
1937 	  }
1938 #endif
1939 #endif
1940 
1941 #ifdef TARGET_SYS_utime
1942 #if HAVE_UTIME
1943 	case TARGET_SYS_utime:
1944 	  {
1945 	    /* Cast the second argument to void *, to avoid type mismatch
1946 	       if a prototype is present.  */
1947 	    sim_io_error (simulator, "Utime not supported");
1948 	    /* RETVAL = utime (path, (void *) MEMPTR (PARM2)); */
1949 	  }
1950 	  break;
1951 #endif
1952 #endif
1953 
1954 	default:
1955 	  abort ();
1956 	}
1957       errno = save_errno;
1958 
1959       return 4;
1960     }
1961   else
1962     {				/* Trap 0 -> 30 */
1963       EIPC = PC + 4;
1964       EIPSW = PSW;
1965       /* Mask out EICC */
1966       ECR &= 0xffff0000;
1967       ECR |= 0x40 + OP[0];
1968       /* Flag that we are now doing exception processing.  */
1969       PSW |= PSW_EP | PSW_ID;
1970       PC = (OP[0] < 0x10) ? 0x40 : 0x50;
1971 
1972       return 0;
1973     }
1974 }
1975 
1976 /* tst1 reg2, [reg1] */
1977 int
1978 OP_E607E0 (void)
1979 {
1980   int temp;
1981 
1982   trace_input ("tst1", OP_BIT, 1);
1983 
1984   temp = load_mem (State.regs[ OP[0] ], 1);
1985 
1986   PSW &= ~PSW_Z;
1987   if ((temp & (1 << (State.regs[ OP[1] ] & 0x7))) == 0)
1988     PSW |= PSW_Z;
1989 
1990   trace_output (OP_BIT);
1991 
1992   return 4;
1993 }
1994 
1995 /* mulu reg1, reg2, reg3 */
1996 int
1997 OP_22207E0 (void)
1998 {
1999   trace_input ("mulu", OP_REG_REG_REG, 0);
2000 
2001   Multiply64 (0, State.regs[ OP[0] ]);
2002 
2003   trace_output (OP_REG_REG_REG);
2004 
2005   return 4;
2006 }
2007 
2008 #define BIT_CHANGE_OP( name, binop )		\
2009   unsigned int bit;				\
2010   unsigned int temp;				\
2011   						\
2012   trace_input (name, OP_BIT_CHANGE, 0);		\
2013   						\
2014   bit  = 1 << (State.regs[ OP[1] ] & 0x7);	\
2015   temp = load_mem (State.regs[ OP[0] ], 1);	\
2016 						\
2017   PSW &= ~PSW_Z;				\
2018   if ((temp & bit) == 0)			\
2019     PSW |= PSW_Z;				\
2020   temp binop bit;				\
2021   						\
2022   store_mem (State.regs[ OP[0] ], 1, temp);	\
2023 	     					\
2024   trace_output (OP_BIT_CHANGE);			\
2025 	     					\
2026   return 4;
2027 
2028 /* clr1 reg2, [reg1] */
2029 int
2030 OP_E407E0 (void)
2031 {
2032   BIT_CHANGE_OP ("clr1", &= ~ );
2033 }
2034 
2035 /* not1 reg2, [reg1] */
2036 int
2037 OP_E207E0 (void)
2038 {
2039   BIT_CHANGE_OP ("not1", ^= );
2040 }
2041 
2042 /* set1 */
2043 int
2044 OP_E007E0 (void)
2045 {
2046   BIT_CHANGE_OP ("set1", |= );
2047 }
2048 
2049 /* sasf */
2050 int
2051 OP_20007E0 (void)
2052 {
2053   trace_input ("sasf", OP_EX1, 0);
2054 
2055   State.regs[ OP[1] ] = (State.regs[ OP[1] ] << 1) | condition_met (OP[0]);
2056 
2057   trace_output (OP_EX1);
2058 
2059   return 4;
2060 }
2061 
2062 /* This function is courtesy of Sugimoto at NEC, via Seow Tan
2063    (Soew_Tan@el.nec.com) */
2064 void
2065 divun
2066 (
2067   unsigned int       N,
2068   unsigned long int  als,
2069   unsigned long int  sfi,
2070   unsigned32 /*unsigned long int*/ *  quotient_ptr,
2071   unsigned32 /*unsigned long int*/ *  remainder_ptr,
2072   int *          overflow_ptr
2073 )
2074 {
2075   unsigned long   ald = sfi >> (N - 1);
2076   unsigned long   alo = als;
2077   unsigned int    Q   = 1;
2078   unsigned int    C;
2079   unsigned int    S   = 0;
2080   unsigned int    i;
2081   unsigned int    R1  = 1;
2082   unsigned int    DBZ = (als == 0) ? 1 : 0;
2083   unsigned long   alt = Q ? ~als : als;
2084 
2085   /* 1st Loop */
2086   alo = ald + alt + Q;
2087   C   = (((alt >> 31) & (ald >> 31))
2088 	 | (((alt >> 31) ^ (ald >> 31)) & (~alo >> 31)));
2089   C   = C ^ Q;
2090   Q   = ~(C ^ S) & 1;
2091   R1  = (alo == 0) ? 0 : (R1 & Q);
2092   if ((S ^ (alo>>31)) && !C)
2093     {
2094       DBZ = 1;
2095     }
2096   S   = alo >> 31;
2097   sfi = (sfi << (32-N+1)) | Q;
2098   ald = (alo << 1) | (sfi >> 31);
2099 
2100   /* 2nd - N-1th Loop */
2101   for (i = 2; i < N; i++)
2102     {
2103       alt = Q ? ~als : als;
2104       alo = ald + alt + Q;
2105       C   = (((alt >> 31) & (ald >> 31))
2106 	     | (((alt >> 31) ^ (ald >> 31)) & (~alo >> 31)));
2107       C   = C ^ Q;
2108       Q   = ~(C ^ S) & 1;
2109       R1  = (alo == 0) ? 0 : (R1 & Q);
2110       if ((S ^ (alo>>31)) && !C && !DBZ)
2111 	{
2112 	  DBZ = 1;
2113 	}
2114       S   = alo >> 31;
2115       sfi = (sfi << 1) | Q;
2116       ald = (alo << 1) | (sfi >> 31);
2117     }
2118 
2119   /* Nth Loop */
2120   alt = Q ? ~als : als;
2121   alo = ald + alt + Q;
2122   C   = (((alt >> 31) & (ald >> 31))
2123 	 | (((alt >> 31) ^ (ald >> 31)) & (~alo >> 31)));
2124   C   = C ^ Q;
2125   Q   = ~(C ^ S) & 1;
2126   R1  = (alo == 0) ? 0 : (R1 & Q);
2127   if ((S ^ (alo>>31)) && !C)
2128     {
2129       DBZ = 1;
2130     }
2131 
2132   * quotient_ptr  = (sfi << 1) | Q;
2133   * remainder_ptr = Q ? alo : (alo + als);
2134   * overflow_ptr  = DBZ | R1;
2135 }
2136 
2137 /* This function is courtesy of Sugimoto at NEC, via Seow Tan (Soew_Tan@el.nec.com) */
2138 void
2139 divn
2140 (
2141   unsigned int       N,
2142   unsigned long int  als,
2143   unsigned long int  sfi,
2144   signed32 /*signed long int*/ *  quotient_ptr,
2145   signed32 /*signed long int*/ *  remainder_ptr,
2146   int *          overflow_ptr
2147 )
2148 {
2149   unsigned long	  ald = (signed long) sfi >> (N - 1);
2150   unsigned long   alo = als;
2151   unsigned int    SS  = als >> 31;
2152   unsigned int	  SD  = sfi >> 31;
2153   unsigned int    R1  = 1;
2154   unsigned int    OV;
2155   unsigned int    DBZ = als == 0 ? 1 : 0;
2156   unsigned int    Q   = ~(SS ^ SD) & 1;
2157   unsigned int    C;
2158   unsigned int    S;
2159   unsigned int    i;
2160   unsigned long   alt = Q ? ~als : als;
2161 
2162 
2163   /* 1st Loop */
2164 
2165   alo = ald + alt + Q;
2166   C   = (((alt >> 31) & (ald >> 31))
2167 	 | (((alt >> 31) ^ (ald >> 31)) & (~alo >> 31)));
2168   Q   = C ^ SS;
2169   R1  = (alo == 0) ? 0 : (R1 & (Q ^ (SS ^ SD)));
2170   S   = alo >> 31;
2171   sfi = (sfi << (32-N+1)) | Q;
2172   ald = (alo << 1) | (sfi >> 31);
2173   if ((alo >> 31) ^ (ald >> 31))
2174     {
2175       DBZ = 1;
2176     }
2177 
2178   /* 2nd - N-1th Loop */
2179 
2180   for (i = 2; i < N; i++)
2181     {
2182       alt = Q ? ~als : als;
2183       alo = ald + alt + Q;
2184       C   = (((alt >> 31) & (ald >> 31))
2185 	     | (((alt >> 31) ^ (ald >> 31)) & (~alo >> 31)));
2186       Q   = C ^ SS;
2187       R1  = (alo == 0) ? 0 : (R1 & (Q ^ (SS ^ SD)));
2188       S   = alo >> 31;
2189       sfi = (sfi << 1) | Q;
2190       ald = (alo << 1) | (sfi >> 31);
2191       if ((alo >> 31) ^ (ald >> 31))
2192 	{
2193 	  DBZ = 1;
2194 	}
2195     }
2196 
2197   /* Nth Loop */
2198   alt = Q ? ~als : als;
2199   alo = ald + alt + Q;
2200   C   = (((alt >> 31) & (ald >> 31))
2201 	 | (((alt >> 31) ^ (ald >> 31)) & (~alo >> 31)));
2202   Q   = C ^ SS;
2203   R1  = (alo == 0) ? 0 : (R1 & (Q ^ (SS ^ SD)));
2204   sfi = (sfi << (32-N+1));
2205   ald = alo;
2206 
2207   /* End */
2208   if (alo != 0)
2209     {
2210       alt = Q ? ~als : als;
2211       alo = ald + alt + Q;
2212     }
2213   R1  = R1 & ((~alo >> 31) ^ SD);
2214   if ((alo != 0) && ((Q ^ (SS ^ SD)) ^ R1)) alo = ald;
2215   if (N != 32)
2216     ald = sfi = (long) ((sfi >> 1) | (SS ^ SD) << 31) >> (32-N-1) | Q;
2217   else
2218     ald = sfi = sfi | Q;
2219 
2220   OV = DBZ | ((alo == 0) ? 0 : R1);
2221 
2222   * remainder_ptr = alo;
2223 
2224   /* Adj */
2225   if (((alo != 0) && ((SS ^ SD) ^ R1))
2226       || ((alo == 0) && (SS ^ R1)))
2227     alo = ald + 1;
2228   else
2229     alo = ald;
2230 
2231   OV  = (DBZ | R1) ? OV : ((alo >> 31) & (~ald >> 31));
2232 
2233   * quotient_ptr  = alo;
2234   * overflow_ptr  = OV;
2235 }
2236 
2237 /* sdivun imm5, reg1, reg2, reg3 */
2238 int
2239 OP_1C207E0 (void)
2240 {
2241   unsigned32 /*unsigned long int*/  quotient;
2242   unsigned32 /*unsigned long int*/  remainder;
2243   unsigned long int  divide_by;
2244   unsigned long int  divide_this;
2245   int            overflow = 0;
2246   unsigned int       imm5;
2247 
2248   trace_input ("sdivun", OP_IMM_REG_REG_REG, 0);
2249 
2250   imm5 = 32 - ((OP[3] & 0x3c0000) >> 17);
2251 
2252   divide_by   = State.regs[ OP[0] ];
2253   divide_this = State.regs[ OP[1] ] << imm5;
2254 
2255   divun (imm5, divide_by, divide_this, & quotient, & remainder, & overflow);
2256 
2257   State.regs[ OP[1]       ] = quotient;
2258   State.regs[ OP[2] >> 11 ] = remainder;
2259 
2260   /* Set condition codes.  */
2261   PSW &= ~(PSW_Z | PSW_S | PSW_OV);
2262 
2263   if (overflow)      PSW |= PSW_OV;
2264   if (quotient == 0) PSW |= PSW_Z;
2265   if (quotient & 0x80000000) PSW |= PSW_S;
2266 
2267   trace_output (OP_IMM_REG_REG_REG);
2268 
2269   return 4;
2270 }
2271 
2272 /* sdivn imm5, reg1, reg2, reg3 */
2273 int
2274 OP_1C007E0 (void)
2275 {
2276   signed32 /*signed long int*/  quotient;
2277   signed32 /*signed long int*/  remainder;
2278   signed long int  divide_by;
2279   signed long int  divide_this;
2280   int          overflow = 0;
2281   unsigned int     imm5;
2282 
2283   trace_input ("sdivn", OP_IMM_REG_REG_REG, 0);
2284 
2285   imm5 = 32 - ((OP[3] & 0x3c0000) >> 17);
2286 
2287   divide_by   = (signed32) State.regs[ OP[0] ];
2288   divide_this = (signed32) (State.regs[ OP[1] ] << imm5);
2289 
2290   divn (imm5, divide_by, divide_this, & quotient, & remainder, & overflow);
2291 
2292   State.regs[ OP[1]       ] = quotient;
2293   State.regs[ OP[2] >> 11 ] = remainder;
2294 
2295   /* Set condition codes.  */
2296   PSW &= ~(PSW_Z | PSW_S | PSW_OV);
2297 
2298   if (overflow)      PSW |= PSW_OV;
2299   if (quotient == 0) PSW |= PSW_Z;
2300   if (quotient <  0) PSW |= PSW_S;
2301 
2302   trace_output (OP_IMM_REG_REG_REG);
2303 
2304   return 4;
2305 }
2306 
2307 /* sdivhun imm5, reg1, reg2, reg3 */
2308 int
2309 OP_18207E0 (void)
2310 {
2311   unsigned32 /*unsigned long int*/  quotient;
2312   unsigned32 /*unsigned long int*/  remainder;
2313   unsigned long int  divide_by;
2314   unsigned long int  divide_this;
2315   int            overflow = 0;
2316   unsigned int       imm5;
2317 
2318   trace_input ("sdivhun", OP_IMM_REG_REG_REG, 0);
2319 
2320   imm5 = 32 - ((OP[3] & 0x3c0000) >> 17);
2321 
2322   divide_by   = State.regs[ OP[0] ] & 0xffff;
2323   divide_this = State.regs[ OP[1] ] << imm5;
2324 
2325   divun (imm5, divide_by, divide_this, & quotient, & remainder, & overflow);
2326 
2327   State.regs[ OP[1]       ] = quotient;
2328   State.regs[ OP[2] >> 11 ] = remainder;
2329 
2330   /* Set condition codes.  */
2331   PSW &= ~(PSW_Z | PSW_S | PSW_OV);
2332 
2333   if (overflow)      PSW |= PSW_OV;
2334   if (quotient == 0) PSW |= PSW_Z;
2335   if (quotient & 0x80000000) PSW |= PSW_S;
2336 
2337   trace_output (OP_IMM_REG_REG_REG);
2338 
2339   return 4;
2340 }
2341 
2342 /* sdivhn imm5, reg1, reg2, reg3 */
2343 int
2344 OP_18007E0 (void)
2345 {
2346   signed32 /*signed long int*/  quotient;
2347   signed32 /*signed long int*/  remainder;
2348   signed long int  divide_by;
2349   signed long int  divide_this;
2350   int          overflow = 0;
2351   unsigned int     imm5;
2352 
2353   trace_input ("sdivhn", OP_IMM_REG_REG_REG, 0);
2354 
2355   imm5 = 32 - ((OP[3] & 0x3c0000) >> 17);
2356 
2357   divide_by   = EXTEND16 (State.regs[ OP[0] ]);
2358   divide_this = (signed32) (State.regs[ OP[1] ] << imm5);
2359 
2360   divn (imm5, divide_by, divide_this, & quotient, & remainder, & overflow);
2361 
2362   State.regs[ OP[1]       ] = quotient;
2363   State.regs[ OP[2] >> 11 ] = remainder;
2364 
2365   /* Set condition codes.  */
2366   PSW &= ~(PSW_Z | PSW_S | PSW_OV);
2367 
2368   if (overflow)      PSW |= PSW_OV;
2369   if (quotient == 0) PSW |= PSW_Z;
2370   if (quotient <  0) PSW |= PSW_S;
2371 
2372   trace_output (OP_IMM_REG_REG_REG);
2373 
2374   return 4;
2375 }
2376 
2377 /* divu  reg1, reg2, reg3 */
2378 int
2379 OP_2C207E0 (void)
2380 {
2381   unsigned long int quotient;
2382   unsigned long int remainder;
2383   unsigned long int divide_by;
2384   unsigned long int divide_this;
2385   int           overflow = 0;
2386 
2387   trace_input ("divu", OP_REG_REG_REG, 0);
2388 
2389   /* Compute the result.  */
2390 
2391   divide_by   = State.regs[ OP[0] ];
2392   divide_this = State.regs[ OP[1] ];
2393 
2394   if (divide_by == 0)
2395     {
2396       PSW |= PSW_OV;
2397     }
2398   else
2399     {
2400       State.regs[ OP[1]       ] = quotient  = divide_this / divide_by;
2401       State.regs[ OP[2] >> 11 ] = remainder = divide_this % divide_by;
2402 
2403       /* Set condition codes.  */
2404       PSW &= ~(PSW_Z | PSW_S | PSW_OV);
2405 
2406       if (overflow)      PSW |= PSW_OV;
2407       if (quotient == 0) PSW |= PSW_Z;
2408       if (quotient & 0x80000000) PSW |= PSW_S;
2409     }
2410 
2411   trace_output (OP_REG_REG_REG);
2412 
2413   return 4;
2414 }
2415 
2416 /* div  reg1, reg2, reg3 */
2417 int
2418 OP_2C007E0 (void)
2419 {
2420   signed long int quotient;
2421   signed long int remainder;
2422   signed long int divide_by;
2423   signed long int divide_this;
2424 
2425   trace_input ("div", OP_REG_REG_REG, 0);
2426 
2427   /* Compute the result.  */
2428 
2429   divide_by   = (signed32) State.regs[ OP[0] ];
2430   divide_this = State.regs[ OP[1] ];
2431 
2432   if (divide_by == 0)
2433     {
2434       PSW |= PSW_OV;
2435     }
2436   else if (divide_by == -1 && divide_this == (1L << 31))
2437     {
2438       PSW &= ~PSW_Z;
2439       PSW |= PSW_OV | PSW_S;
2440       State.regs[ OP[1] ] = (1 << 31);
2441       State.regs[ OP[2] >> 11 ] = 0;
2442     }
2443   else
2444     {
2445       divide_this = (signed32) divide_this;
2446       State.regs[ OP[1]       ] = quotient  = divide_this / divide_by;
2447       State.regs[ OP[2] >> 11 ] = remainder = divide_this % divide_by;
2448 
2449       /* Set condition codes.  */
2450       PSW &= ~(PSW_Z | PSW_S | PSW_OV);
2451 
2452       if (quotient == 0) PSW |= PSW_Z;
2453       if (quotient <  0) PSW |= PSW_S;
2454     }
2455 
2456   trace_output (OP_REG_REG_REG);
2457 
2458   return 4;
2459 }
2460 
2461 /* divhu  reg1, reg2, reg3 */
2462 int
2463 OP_28207E0 (void)
2464 {
2465   unsigned long int quotient;
2466   unsigned long int remainder;
2467   unsigned long int divide_by;
2468   unsigned long int divide_this;
2469   int           overflow = 0;
2470 
2471   trace_input ("divhu", OP_REG_REG_REG, 0);
2472 
2473   /* Compute the result.  */
2474 
2475   divide_by   = State.regs[ OP[0] ] & 0xffff;
2476   divide_this = State.regs[ OP[1] ];
2477 
2478   if (divide_by == 0)
2479     {
2480       PSW |= PSW_OV;
2481     }
2482   else
2483     {
2484       State.regs[ OP[1]       ] = quotient  = divide_this / divide_by;
2485       State.regs[ OP[2] >> 11 ] = remainder = divide_this % divide_by;
2486 
2487       /* Set condition codes.  */
2488       PSW &= ~(PSW_Z | PSW_S | PSW_OV);
2489 
2490       if (overflow)      PSW |= PSW_OV;
2491       if (quotient == 0) PSW |= PSW_Z;
2492       if (quotient & 0x80000000) PSW |= PSW_S;
2493     }
2494 
2495   trace_output (OP_REG_REG_REG);
2496 
2497   return 4;
2498 }
2499 
2500 /* divh  reg1, reg2, reg3 */
2501 int
2502 OP_28007E0 (void)
2503 {
2504   signed long int quotient;
2505   signed long int remainder;
2506   signed long int divide_by;
2507   signed long int divide_this;
2508   int         overflow = 0;
2509 
2510   trace_input ("divh", OP_REG_REG_REG, 0);
2511 
2512   /* Compute the result.  */
2513 
2514   divide_by  = EXTEND16 (State.regs[ OP[0] ]);
2515   divide_this = State.regs[ OP[1] ];
2516 
2517   if (divide_by == 0)
2518     {
2519       PSW |= PSW_OV;
2520     }
2521   else if (divide_by == -1 && divide_this == (1L << 31))
2522     {
2523       PSW &= ~PSW_Z;
2524       PSW |= PSW_OV | PSW_S;
2525       State.regs[ OP[1] ] = (1 << 31);
2526       State.regs[ OP[2] >> 11 ] = 0;
2527     }
2528   else
2529     {
2530       divide_this = (signed32) divide_this;
2531       State.regs[ OP[1]       ] = quotient  = divide_this / divide_by;
2532       State.regs[ OP[2] >> 11 ] = remainder = divide_this % divide_by;
2533 
2534       /* Set condition codes.  */
2535       PSW &= ~(PSW_Z | PSW_S | PSW_OV);
2536 
2537       if (quotient == 0) PSW |= PSW_Z;
2538       if (quotient <  0) PSW |= PSW_S;
2539     }
2540 
2541   trace_output (OP_REG_REG_REG);
2542 
2543   return 4;
2544 }
2545 
2546 /* mulu imm9, reg2, reg3 */
2547 int
2548 OP_24207E0 (void)
2549 {
2550   trace_input ("mulu", OP_IMM_REG_REG, 0);
2551 
2552   Multiply64 (0, (OP[3] & 0x1f) | ((OP[3] >> 13) & 0x1e0));
2553 
2554   trace_output (OP_IMM_REG_REG);
2555 
2556   return 4;
2557 }
2558 
2559 /* mul imm9, reg2, reg3 */
2560 int
2561 OP_24007E0 (void)
2562 {
2563   trace_input ("mul", OP_IMM_REG_REG, 0);
2564 
2565   Multiply64 (1, SEXT9 ((OP[3] & 0x1f) | ((OP[3] >> 13) & 0x1e0)));
2566 
2567   trace_output (OP_IMM_REG_REG);
2568 
2569   return 4;
2570 }
2571 
2572 /* ld.hu */
2573 int
2574 OP_107E0 (void)
2575 {
2576   int adr;
2577 
2578   trace_input ("ld.hu", OP_LOAD32, 2);
2579 
2580   adr = State.regs[ OP[0] ] + EXTEND16 (OP[2] & ~1);
2581   adr &= ~0x1;
2582 
2583   State.regs[ OP[1] ] = load_mem (adr, 2);
2584 
2585   trace_output (OP_LOAD32);
2586 
2587   return 4;
2588 }
2589 
2590 
2591 /* ld.bu */
2592 int
2593 OP_10780 (void)
2594 {
2595   int adr;
2596 
2597   trace_input ("ld.bu", OP_LOAD32, 1);
2598 
2599   adr = (State.regs[ OP[0] ]
2600 	 + (EXTEND16 (OP[2] & ~1) | ((OP[3] >> 5) & 1)));
2601 
2602   State.regs[ OP[1] ] = load_mem (adr, 1);
2603 
2604   trace_output (OP_LOAD32);
2605 
2606   return 4;
2607 }
2608 
2609 /* prepare list12, imm5, imm32 */
2610 int
2611 OP_1B0780 (void)
2612 {
2613   int  i;
2614 
2615   trace_input ("prepare", OP_PUSHPOP1, 0);
2616 
2617   /* Store the registers with lower number registers being placed at higher addresses.  */
2618   for (i = 0; i < 12; i++)
2619     if ((OP[3] & (1 << type1_regs[ i ])))
2620       {
2621 	SP -= 4;
2622 	store_mem (SP, 4, State.regs[ 20 + i ]);
2623       }
2624 
2625   SP -= (OP[3] & 0x3e) << 1;
2626 
2627   EP = load_mem (PC + 4, 4);
2628 
2629   trace_output (OP_PUSHPOP1);
2630 
2631   return 8;
2632 }
2633 
2634 /* prepare list12, imm5, imm16-32 */
2635 int
2636 OP_130780 (void)
2637 {
2638   int  i;
2639 
2640   trace_input ("prepare", OP_PUSHPOP1, 0);
2641 
2642   /* Store the registers with lower number registers being placed at higher addresses.  */
2643   for (i = 0; i < 12; i++)
2644     if ((OP[3] & (1 << type1_regs[ i ])))
2645       {
2646 	SP -= 4;
2647 	store_mem (SP, 4, State.regs[ 20 + i ]);
2648       }
2649 
2650   SP -= (OP[3] & 0x3e) << 1;
2651 
2652   EP = load_mem (PC + 4, 2) << 16;
2653 
2654   trace_output (OP_PUSHPOP1);
2655 
2656   return 6;
2657 }
2658 
2659 /* prepare list12, imm5, imm16 */
2660 int
2661 OP_B0780 (void)
2662 {
2663   int  i;
2664 
2665   trace_input ("prepare", OP_PUSHPOP1, 0);
2666 
2667   /* Store the registers with lower number registers being placed at higher addresses.  */
2668   for (i = 0; i < 12; i++)
2669     if ((OP[3] & (1 << type1_regs[ i ])))
2670       {
2671 	SP -= 4;
2672 	store_mem (SP, 4, State.regs[ 20 + i ]);
2673       }
2674 
2675   SP -= (OP[3] & 0x3e) << 1;
2676 
2677   EP = EXTEND16 (load_mem (PC + 4, 2));
2678 
2679   trace_output (OP_PUSHPOP1);
2680 
2681   return 6;
2682 }
2683 
2684 /* prepare list12, imm5, sp */
2685 int
2686 OP_30780 (void)
2687 {
2688   int  i;
2689 
2690   trace_input ("prepare", OP_PUSHPOP1, 0);
2691 
2692   /* Store the registers with lower number registers being placed at higher addresses.  */
2693   for (i = 0; i < 12; i++)
2694     if ((OP[3] & (1 << type1_regs[ i ])))
2695       {
2696 	SP -= 4;
2697 	store_mem (SP, 4, State.regs[ 20 + i ]);
2698       }
2699 
2700   SP -= (OP[3] & 0x3e) << 1;
2701 
2702   EP = SP;
2703 
2704   trace_output (OP_PUSHPOP1);
2705 
2706   return 4;
2707 }
2708 
2709 /* mul reg1, reg2, reg3 */
2710 int
2711 OP_22007E0 (void)
2712 {
2713   trace_input ("mul", OP_REG_REG_REG, 0);
2714 
2715   Multiply64 (1, State.regs[ OP[0] ]);
2716 
2717   trace_output (OP_REG_REG_REG);
2718 
2719   return 4;
2720 }
2721 
2722 /* popmh list18 */
2723 int
2724 OP_307F0 (void)
2725 {
2726   int i;
2727 
2728   trace_input ("popmh", OP_PUSHPOP2, 0);
2729 
2730   if (OP[3] & (1 << 19))
2731     {
2732       if ((PSW & PSW_NP) && ((PSW & PSW_EP) == 0))
2733 	{
2734 	  FEPSW = load_mem ( SP      & ~ 3, 4);
2735 	  FEPC  = load_mem ((SP + 4) & ~ 3, 4);
2736 	}
2737       else
2738 	{
2739 	  EIPSW = load_mem ( SP      & ~ 3, 4);
2740 	  EIPC  = load_mem ((SP + 4) & ~ 3, 4);
2741 	}
2742 
2743       SP += 8;
2744     }
2745 
2746   /* Load the registers with lower number registers being retrieved from higher addresses.  */
2747   for (i = 16; i--;)
2748     if ((OP[3] & (1 << type2_regs[ i ])))
2749       {
2750 	State.regs[ i + 16 ] = load_mem (SP & ~ 3, 4);
2751 	SP += 4;
2752       }
2753 
2754   trace_output (OP_PUSHPOP2);
2755 
2756   return 4;
2757 }
2758 
2759 /* popml lsit18 */
2760 int
2761 OP_107F0 (void)
2762 {
2763   int i;
2764 
2765   trace_input ("popml", OP_PUSHPOP3, 0);
2766 
2767   if (OP[3] & (1 << 19))
2768     {
2769       if ((PSW & PSW_NP) && ((PSW & PSW_EP) == 0))
2770 	{
2771 	  FEPSW = load_mem ( SP      & ~ 3, 4);
2772 	  FEPC =  load_mem ((SP + 4) & ~ 3, 4);
2773 	}
2774       else
2775 	{
2776 	  EIPSW = load_mem ( SP      & ~ 3, 4);
2777 	  EIPC  = load_mem ((SP + 4) & ~ 3, 4);
2778 	}
2779 
2780       SP += 8;
2781     }
2782 
2783   if (OP[3] & (1 << 3))
2784     {
2785       PSW = load_mem (SP & ~ 3, 4);
2786       SP += 4;
2787     }
2788 
2789   /* Load the registers with lower number registers being retrieved from higher addresses.  */
2790   for (i = 15; i--;)
2791     if ((OP[3] & (1 << type3_regs[ i ])))
2792       {
2793 	State.regs[ i + 1 ] = load_mem (SP & ~ 3, 4);
2794 	SP += 4;
2795       }
2796 
2797   trace_output (OP_PUSHPOP2);
2798 
2799   return 4;
2800 }
2801 
2802 /* pushmh list18 */
2803 int
2804 OP_307E0 (void)
2805 {
2806   int i;
2807 
2808   trace_input ("pushmh", OP_PUSHPOP2, 0);
2809 
2810   /* Store the registers with lower number registers being placed at higher addresses.  */
2811   for (i = 0; i < 16; i++)
2812     if ((OP[3] & (1 << type2_regs[ i ])))
2813       {
2814 	SP -= 4;
2815 	store_mem (SP & ~ 3, 4, State.regs[ i + 16 ]);
2816       }
2817 
2818   if (OP[3] & (1 << 19))
2819     {
2820       SP -= 8;
2821 
2822       if ((PSW & PSW_NP) && ((PSW & PSW_EP) == 0))
2823 	{
2824 	  store_mem ((SP + 4) & ~ 3, 4, FEPC);
2825 	  store_mem ( SP      & ~ 3, 4, FEPSW);
2826 	}
2827       else
2828 	{
2829 	  store_mem ((SP + 4) & ~ 3, 4, EIPC);
2830 	  store_mem ( SP      & ~ 3, 4, EIPSW);
2831 	}
2832     }
2833 
2834   trace_output (OP_PUSHPOP2);
2835 
2836   return 4;
2837 }
2838 
2839 /* V850E2R FPU functions */
2840 /*
2841   sim_fpu_status_invalid_snan = 1,				-V--- (sim spec.)
2842   sim_fpu_status_invalid_qnan = 2,				----- (sim spec.)
2843   sim_fpu_status_invalid_isi = 4, (inf - inf)			-V---
2844   sim_fpu_status_invalid_idi = 8, (inf / inf)			-V---
2845   sim_fpu_status_invalid_zdz = 16, (0 / 0)			-V---
2846   sim_fpu_status_invalid_imz = 32, (inf * 0)			-V---
2847   sim_fpu_status_invalid_cvi = 64, convert to integer		-V---
2848   sim_fpu_status_invalid_div0 = 128, (X / 0)			--Z--
2849   sim_fpu_status_invalid_cmp = 256, compare			----- (sim spec.)
2850   sim_fpu_status_invalid_sqrt = 512,				-V---
2851   sim_fpu_status_rounded = 1024,				I----
2852   sim_fpu_status_inexact = 2048,				I---- (sim spec.)
2853   sim_fpu_status_overflow = 4096,				I--O-
2854   sim_fpu_status_underflow = 8192,				I---U
2855   sim_fpu_status_denorm = 16384,				----U (sim spec.)
2856 */
2857 
2858 void
2859 update_fpsr (SIM_DESC sd, sim_fpu_status status, unsigned int mask, unsigned int double_op_p)
2860 {
2861   unsigned int fpsr = FPSR & mask;
2862 
2863   unsigned int flags = 0;
2864 
2865   if (fpsr & FPSR_XEI
2866       && ((status & (sim_fpu_status_rounded
2867 		     | sim_fpu_status_overflow
2868 		     | sim_fpu_status_inexact))
2869 	  || (status & sim_fpu_status_underflow
2870 	      && (fpsr & (FPSR_XEU | FPSR_XEI)) == 0
2871 	      && fpsr & FPSR_FS)))
2872     {
2873       flags |= FPSR_XCI | FPSR_XPI;
2874     }
2875 
2876   if (fpsr & FPSR_XEV
2877       && (status & (sim_fpu_status_invalid_isi
2878 		    | sim_fpu_status_invalid_imz
2879 		    | sim_fpu_status_invalid_zdz
2880 		    | sim_fpu_status_invalid_idi
2881 		    | sim_fpu_status_invalid_cvi
2882 		    | sim_fpu_status_invalid_sqrt
2883 		    | sim_fpu_status_invalid_snan)))
2884     {
2885       flags |= FPSR_XCV | FPSR_XPV;
2886     }
2887 
2888   if (fpsr & FPSR_XEZ
2889       && (status & sim_fpu_status_invalid_div0))
2890     {
2891       flags |= FPSR_XCV | FPSR_XPV;
2892     }
2893 
2894   if (fpsr & FPSR_XEO
2895       && (status & sim_fpu_status_overflow))
2896     {
2897       flags |= FPSR_XCO | FPSR_XPO;
2898     }
2899 
2900   if (((fpsr & FPSR_XEU) || (fpsr & FPSR_FS) == 0)
2901       && (status & (sim_fpu_status_underflow
2902 		    | sim_fpu_status_denorm)))
2903     {
2904       flags |= FPSR_XCU | FPSR_XPU;
2905     }
2906 
2907   if (flags)
2908     {
2909       FPSR &= ~FPSR_XC;
2910       FPSR |= flags;
2911 
2912       SignalExceptionFPE (sd, double_op_p);
2913     }
2914 }
2915 
2916 /* Exception.  */
2917 
2918 void
2919 SignalException (SIM_DESC sd)
2920 {
2921   if (MPM & MPM_AUE)
2922     {
2923       PSW = PSW & ~(PSW_NPV | PSW_DMP | PSW_IMP);
2924     }
2925 }
2926 
2927 void
2928 SignalExceptionFPE (SIM_DESC sd, unsigned int double_op_p)
2929 {
2930   if (((PSW & (PSW_NP|PSW_ID)) == 0)
2931       || !(FPSR & (double_op_p ? FPSR_DEM : FPSR_SEM)))
2932     {
2933       EIPC = PC;
2934       EIPSW = PSW;
2935       EIIC = (FPSR & (double_op_p ? FPSR_DEM : FPSR_SEM))
2936 	? 0x71 : 0x72;
2937       PSW |= (PSW_EP | PSW_ID);
2938       PC = 0x70;
2939 
2940       SignalException (sd);
2941     }
2942 }
2943 
2944 void
2945 check_invalid_snan (SIM_DESC sd, sim_fpu_status status, unsigned int double_op_p)
2946 {
2947   if ((FPSR & FPSR_XEI)
2948       && (status & sim_fpu_status_invalid_snan))
2949     {
2950       FPSR &= ~FPSR_XC;
2951       FPSR |= FPSR_XCV;
2952       FPSR |= FPSR_XPV;
2953       SignalExceptionFPE (sd, double_op_p);
2954     }
2955 }
2956 
2957 int
2958 v850_float_compare (SIM_DESC sd, int cmp, sim_fpu wop1, sim_fpu wop2, int double_op_p)
2959 {
2960   int result = -1;
2961 
2962   if (sim_fpu_is_nan (&wop1) || sim_fpu_is_nan (&wop2))
2963     {
2964       if (cmp & 0x8)
2965 	{
2966 	  if (FPSR & FPSR_XEV)
2967 	    {
2968 	      FPSR |= FPSR_XCV | FPSR_XPV;
2969 	      SignalExceptionFPE (sd, double_op_p);
2970 	    }
2971 	}
2972 
2973       switch (cmp)
2974 	{
2975 	case FPU_CMP_F:
2976 	  result = 0;
2977 	  break;
2978 	case FPU_CMP_UN:
2979 	  result = 1;
2980 	  break;
2981 	case FPU_CMP_EQ:
2982 	  result = 0;
2983 	  break;
2984 	case FPU_CMP_UEQ:
2985 	  result = 1;
2986 	  break;
2987 	case FPU_CMP_OLT:
2988 	  result = 0;
2989 	  break;
2990 	case FPU_CMP_ULT:
2991 	  result = 1;
2992 	  break;
2993 	case FPU_CMP_OLE:
2994 	  result = 0;
2995 	  break;
2996 	case FPU_CMP_ULE:
2997 	  result = 1;
2998 	  break;
2999 	case FPU_CMP_SF:
3000 	  result = 0;
3001 	  break;
3002 	case FPU_CMP_NGLE:
3003 	  result = 1;
3004 	  break;
3005 	case FPU_CMP_SEQ:
3006 	  result = 0;
3007 	  break;
3008 	case FPU_CMP_NGL:
3009 	  result = 1;
3010 	  break;
3011 	case FPU_CMP_LT:
3012 	  result = 0;
3013 	  break;
3014 	case FPU_CMP_NGE:
3015 	  result = 1;
3016 	  break;
3017 	case FPU_CMP_LE:
3018 	  result = 0;
3019 	  break;
3020 	case FPU_CMP_NGT:
3021 	  result = 1;
3022 	  break;
3023 	default:
3024 	  abort ();
3025 	}
3026     }
3027   else if (sim_fpu_is_infinity (&wop1) && sim_fpu_is_infinity (&wop2)
3028 	   && sim_fpu_sign (&wop1) == sim_fpu_sign (&wop2))
3029     {
3030       switch (cmp)
3031 	{
3032 	case FPU_CMP_F:
3033 	  result = 0;
3034 	  break;
3035 	case FPU_CMP_UN:
3036 	  result = 0;
3037 	  break;
3038 	case FPU_CMP_EQ:
3039 	  result = 1;
3040 	  break;
3041 	case FPU_CMP_UEQ:
3042 	  result = 1;
3043 	  break;
3044 	case FPU_CMP_OLT:
3045 	  result = 0;
3046 	  break;
3047 	case FPU_CMP_ULT:
3048 	  result = 0;
3049 	  break;
3050 	case FPU_CMP_OLE:
3051 	  result = 1;
3052 	  break;
3053 	case FPU_CMP_ULE:
3054 	  result = 1;
3055 	  break;
3056 	case FPU_CMP_SF:
3057 	  result = 0;
3058 	  break;
3059 	case FPU_CMP_NGLE:
3060 	  result = 0;
3061 	  break;
3062 	case FPU_CMP_SEQ:
3063 	  result = 1;
3064 	  break;
3065 	case FPU_CMP_NGL:
3066 	  result = 1;
3067 	  break;
3068 	case FPU_CMP_LT:
3069 	  result = 0;
3070 	  break;
3071 	case FPU_CMP_NGE:
3072 	  result = 0;
3073 	  break;
3074 	case FPU_CMP_LE:
3075 	  result = 1;
3076 	  break;
3077 	case FPU_CMP_NGT:
3078 	  result = 1;
3079 	  break;
3080 	default:
3081 	  abort ();
3082 	}
3083     }
3084   else
3085     {
3086       int gt = 0,lt = 0,eq = 0, status;
3087 
3088       status = sim_fpu_cmp (&wop1, &wop2);
3089 
3090       switch (status)
3091 	{
3092 	case SIM_FPU_IS_SNAN:
3093 	case SIM_FPU_IS_QNAN:
3094 	  abort ();
3095 	  break;
3096 
3097 	case SIM_FPU_IS_NINF:
3098 	  lt = 1;
3099 	  break;
3100 	case SIM_FPU_IS_PINF:
3101 	  gt = 1;
3102 	  break;
3103 	case SIM_FPU_IS_NNUMBER:
3104 	  lt = 1;
3105 	  break;
3106 	case SIM_FPU_IS_PNUMBER:
3107 	  gt = 1;
3108 	  break;
3109 	case SIM_FPU_IS_NDENORM:
3110 	  lt = 1;
3111 	  break;
3112 	case SIM_FPU_IS_PDENORM:
3113 	  gt = 1;
3114 	  break;
3115 	case SIM_FPU_IS_NZERO:
3116 	case SIM_FPU_IS_PZERO:
3117 	  eq = 1;
3118 	  break;
3119 	}
3120 
3121       switch (cmp)
3122 	{
3123 	case FPU_CMP_F:
3124 	  result = 0;
3125 	  break;
3126 	case FPU_CMP_UN:
3127 	  result = 0;
3128 	  break;
3129 	case FPU_CMP_EQ:
3130 	  result = eq;
3131 	  break;
3132 	case FPU_CMP_UEQ:
3133 	  result = eq;
3134 	  break;
3135 	case FPU_CMP_OLT:
3136 	  result = lt;
3137 	  break;
3138 	case FPU_CMP_ULT:
3139 	  result = lt;
3140 	  break;
3141 	case FPU_CMP_OLE:
3142 	  result = lt || eq;
3143 	  break;
3144 	case FPU_CMP_ULE:
3145 	  result = lt || eq;
3146 	  break;
3147 	case FPU_CMP_SF:
3148 	  result = 0;
3149 	  break;
3150 	case FPU_CMP_NGLE:
3151 	  result = 0;
3152 	  break;
3153 	case FPU_CMP_SEQ:
3154 	  result = eq;
3155 	  break;
3156 	case FPU_CMP_NGL:
3157 	  result = eq;
3158 	  break;
3159 	case FPU_CMP_LT:
3160 	  result = lt;
3161 	  break;
3162 	case FPU_CMP_NGE:
3163 	  result = lt;
3164 	  break;
3165 	case FPU_CMP_LE:
3166 	  result = lt || eq;
3167 	  break;
3168 	case FPU_CMP_NGT:
3169 	  result = lt || eq;
3170 	  break;
3171 	}
3172     }
3173 
3174   ASSERT (result != -1);
3175   return result;
3176 }
3177 
3178 void
3179 v850_div (SIM_DESC sd, unsigned int op0, unsigned int op1, unsigned int *op2p, unsigned int *op3p)
3180 {
3181   signed long int quotient;
3182   signed long int remainder;
3183   signed long int divide_by;
3184   signed long int divide_this;
3185   bfd_boolean     overflow = FALSE;
3186 
3187   /* Compute the result.  */
3188   divide_by   = op0;
3189   divide_this = op1;
3190 
3191   if (divide_by == 0 || (divide_by == -1 && divide_this == (1 << 31)))
3192     {
3193       overflow  = TRUE;
3194       divide_by = 1;
3195     }
3196 
3197   quotient  = divide_this / divide_by;
3198   remainder = divide_this % divide_by;
3199 
3200   /* Set condition codes.  */
3201   PSW &= ~(PSW_Z | PSW_S | PSW_OV);
3202 
3203   if (overflow)      PSW |= PSW_OV;
3204   if (quotient == 0) PSW |= PSW_Z;
3205   if (quotient <  0) PSW |= PSW_S;
3206 
3207   *op2p = quotient;
3208   *op3p = remainder;
3209 }
3210 
3211 void
3212 v850_divu (SIM_DESC sd, unsigned int op0, unsigned int op1, unsigned int *op2p, unsigned int *op3p)
3213 {
3214   unsigned long int quotient;
3215   unsigned long int remainder;
3216   unsigned long int divide_by;
3217   unsigned long int divide_this;
3218   bfd_boolean       overflow = FALSE;
3219 
3220   /* Compute the result.  */
3221 
3222   divide_by   = op0;
3223   divide_this = op1;
3224 
3225   if (divide_by == 0)
3226     {
3227       overflow = TRUE;
3228       divide_by  = 1;
3229     }
3230 
3231   quotient  = divide_this / divide_by;
3232   remainder = divide_this % divide_by;
3233 
3234   /* Set condition codes.  */
3235   PSW &= ~(PSW_Z | PSW_S | PSW_OV);
3236 
3237   if (overflow)      PSW |= PSW_OV;
3238   if (quotient == 0) PSW |= PSW_Z;
3239   if (quotient & 0x80000000) PSW |= PSW_S;
3240 
3241   *op2p = quotient;
3242   *op3p = remainder;
3243 }
3244 
3245 void
3246 v850_sar (SIM_DESC sd, unsigned int op0, unsigned int op1, unsigned int *op2p)
3247 {
3248   unsigned int result, z, s, cy;
3249 
3250   op0 &= 0x1f;
3251   result = (signed)op1 >> op0;
3252 
3253   /* Compute the condition codes.  */
3254   z = (result == 0);
3255   s = (result & 0x80000000);
3256   cy = (op1 & (1 << (op0 - 1)));
3257 
3258   /* Store the result and condition codes.  */
3259   PSW &= ~(PSW_Z | PSW_S | PSW_OV | PSW_CY);
3260   PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
3261 		| (cy ? PSW_CY : 0));
3262 
3263   *op2p = result;
3264 }
3265 
3266 void
3267 v850_shl (SIM_DESC sd, unsigned int op0, unsigned int op1, unsigned int *op2p)
3268 {
3269   unsigned int result, z, s, cy;
3270 
3271   op0 &= 0x1f;
3272   result = op1 << op0;
3273 
3274   /* Compute the condition codes.  */
3275   z = (result == 0);
3276   s = (result & 0x80000000);
3277   cy = (op1 & (1 << (32 - op0)));
3278 
3279   /* Store the result and condition codes.  */
3280   PSW &= ~(PSW_Z | PSW_S | PSW_OV | PSW_CY);
3281   PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
3282 		| (cy ? PSW_CY : 0));
3283 
3284   *op2p = result;
3285 }
3286 
3287 void
3288 v850_rotl (SIM_DESC sd, unsigned int amount, unsigned int src, unsigned int * dest)
3289 {
3290   unsigned int result, z, s, cy;
3291 
3292   amount &= 0x1f;
3293   result = src << amount;
3294   result |= src >> (32 - amount);
3295 
3296   /* Compute the condition codes.  */
3297   z = (result == 0);
3298   s = (result & 0x80000000);
3299   cy = ! (result & 1);
3300 
3301   /* Store the result and condition codes.  */
3302   PSW &= ~(PSW_Z | PSW_S | PSW_OV | PSW_CY);
3303   PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
3304 		| (cy ? PSW_CY : 0));
3305 
3306   * dest = result;
3307 }
3308 
3309 void
3310 v850_bins (SIM_DESC sd, unsigned int source, unsigned int lsb, unsigned int msb,
3311 	   unsigned int * dest)
3312 {
3313   unsigned int mask;
3314   unsigned int result, pos, width;
3315   unsigned int z, s;
3316 
3317   pos = lsb;
3318   width = (msb - lsb) + 1;
3319 
3320   mask = ~ (-(1 << width));
3321   source &= mask;
3322   mask <<= pos;
3323   result = (* dest) & ~ mask;
3324   result |= source << pos;
3325 
3326   /* Compute the condition codes.  */
3327   z = (result == 0);
3328   s = result & 0x80000000;
3329 
3330   /* Store the result and condition codes.  */
3331   PSW &= ~(PSW_Z | PSW_S | PSW_OV );
3332   PSW |= (z ? PSW_Z : 0) | (s ? PSW_S : 0);
3333 
3334   * dest = result;
3335 }
3336 
3337 void
3338 v850_shr (SIM_DESC sd, unsigned int op0, unsigned int op1, unsigned int *op2p)
3339 {
3340   unsigned int result, z, s, cy;
3341 
3342   op0 &=  0x1f;
3343   result = op1 >> op0;
3344 
3345   /* Compute the condition codes.  */
3346   z = (result == 0);
3347   s = (result & 0x80000000);
3348   cy = (op1 & (1 << (op0 - 1)));
3349 
3350   /* Store the result and condition codes.  */
3351   PSW &= ~(PSW_Z | PSW_S | PSW_OV | PSW_CY);
3352   PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
3353 		| (cy ? PSW_CY : 0));
3354 
3355   *op2p = result;
3356 }
3357 
3358 void
3359 v850_satadd (SIM_DESC sd, unsigned int op0, unsigned int op1, unsigned int *op2p)
3360 {
3361   unsigned int result, z, s, cy, ov, sat;
3362 
3363   result = op0 + op1;
3364 
3365   /* Compute the condition codes.  */
3366   z = (result == 0);
3367   s = (result & 0x80000000);
3368   cy = (result < op0 || result < op1);
3369   ov = ((op0 & 0x80000000) == (op1 & 0x80000000)
3370 	&& (op0 & 0x80000000) != (result & 0x80000000));
3371   sat = ov;
3372 
3373   /* Store the result and condition codes.  */
3374   PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
3375   PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
3376 	  | (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0)
3377 	  | (sat ? PSW_SAT : 0));
3378 
3379   /* Handle saturated results.  */
3380   if (sat && s)
3381     {
3382       result = 0x7fffffff;
3383       PSW &= ~PSW_S;
3384     }
3385   else if (sat)
3386     {
3387       result = 0x80000000;
3388       PSW |= PSW_S;
3389     }
3390 
3391   *op2p = result;
3392 }
3393 
3394 void
3395 v850_satsub (SIM_DESC sd, unsigned int op0, unsigned int op1, unsigned int *op2p)
3396 {
3397   unsigned int result, z, s, cy, ov, sat;
3398 
3399   /* Compute the result.  */
3400   result = op1 - op0;
3401 
3402   /* Compute the condition codes.  */
3403   z = (result == 0);
3404   s = (result & 0x80000000);
3405   cy = (op1 < op0);
3406   ov = ((op1 & 0x80000000) != (op0 & 0x80000000)
3407 	&& (op1 & 0x80000000) != (result & 0x80000000));
3408   sat = ov;
3409 
3410   /* Store the result and condition codes.  */
3411   PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
3412   PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
3413 	  | (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0)
3414 	  | (sat ? PSW_SAT : 0));
3415 
3416   /* Handle saturated results.  */
3417   if (sat && s)
3418     {
3419       result = 0x7fffffff;
3420       PSW &= ~PSW_S;
3421     }
3422   else if (sat)
3423     {
3424       result = 0x80000000;
3425       PSW |= PSW_S;
3426     }
3427 
3428   *op2p = result;
3429 }
3430 
3431 unsigned32
3432 load_data_mem (SIM_DESC  sd,
3433 	       SIM_ADDR  addr,
3434 	       int       len)
3435 {
3436   uint32 data;
3437 
3438   switch (len)
3439     {
3440     case 1:
3441       data = sim_core_read_unaligned_1 (STATE_CPU (sd, 0),
3442 					PC, read_map, addr);
3443       break;
3444     case 2:
3445       data = sim_core_read_unaligned_2 (STATE_CPU (sd, 0),
3446 					PC, read_map, addr);
3447       break;
3448     case 4:
3449       data = sim_core_read_unaligned_4 (STATE_CPU (sd, 0),
3450 					PC, read_map, addr);
3451       break;
3452     default:
3453       abort ();
3454     }
3455   return data;
3456 }
3457 
3458 void
3459 store_data_mem (SIM_DESC    sd,
3460 		SIM_ADDR    addr,
3461 		int         len,
3462 		unsigned32  data)
3463 {
3464   switch (len)
3465     {
3466     case 1:
3467       store_mem (addr, 1, data);
3468       break;
3469     case 2:
3470       store_mem (addr, 2, data);
3471       break;
3472     case 4:
3473       store_mem (addr, 4, data);
3474       break;
3475     default:
3476       abort ();
3477     }
3478 }
3479 
3480 int
3481 mpu_load_mem_test (SIM_DESC sd, unsigned int addr, int size, int base_reg)
3482 {
3483   int result = 1;
3484 
3485   if (PSW & PSW_DMP)
3486     {
3487       if (IPE0 && addr >= IPA2ADDR (IPA0L) && addr <= IPA2ADDR (IPA0L) && IPR0)
3488 	{
3489 	  /* text area */
3490 	}
3491       else if (IPE1 && addr >= IPA2ADDR (IPA1L) && addr <= IPA2ADDR (IPA1L) && IPR1)
3492 	{
3493 	  /* text area */
3494 	}
3495       else if (IPE2 && addr >= IPA2ADDR (IPA2L) && addr <= IPA2ADDR (IPA2L) && IPR2)
3496 	{
3497 	  /* text area */
3498 	}
3499       else if (IPE3 && addr >= IPA2ADDR (IPA3L) && addr <= IPA2ADDR (IPA3L) && IPR3)
3500 	{
3501 	  /* text area */
3502 	}
3503       else if (addr >= PPA2ADDR (PPA & ~PPM) && addr <= DPA2ADDR (PPA | PPM))
3504 	{
3505 	  /* preifarallel area */
3506 	}
3507       else if (addr >= PPA2ADDR (SPAL) && addr <= DPA2ADDR (SPAU))
3508 	{
3509 	  /* stack area */
3510 	}
3511       else if (DPE0 && addr >= DPA2ADDR (DPA0L) && addr <= DPA2ADDR (DPA0L) && DPR0
3512 	       && ((SPAL & SPAL_SPS) ? base_reg == SP_REGNO : 1))
3513 	{
3514 	  /* data area */
3515 	}
3516       else if (DPE1 && addr >= DPA2ADDR (DPA1L) && addr <= DPA2ADDR (DPA1L) && DPR1
3517 	       && ((SPAL & SPAL_SPS) ? base_reg == SP_REGNO : 1))
3518 	{
3519 	  /* data area */
3520 	}
3521       else if (DPE2 && addr >= DPA2ADDR (DPA2L) && addr <= DPA2ADDR (DPA2L) && DPR2
3522 	       && ((SPAL & SPAL_SPS) ? base_reg == SP_REGNO : 1))
3523 	{
3524 	  /* data area */
3525 	}
3526       else if (DPE3 && addr >= DPA2ADDR (DPA3L) && addr <= DPA2ADDR (DPA3L) && DPR3
3527 	       && ((SPAL & SPAL_SPS) ? base_reg == SP_REGNO : 1))
3528 	{
3529 	  /* data area */
3530 	}
3531       else
3532 	{
3533 	  VMECR &= ~(VMECR_VMW | VMECR_VMX);
3534 	  VMECR |= VMECR_VMR;
3535 	  VMADR = addr;
3536 	  VMTID = TID;
3537 	  FEIC = 0x431;
3538 
3539 	  PC = 0x30;
3540 
3541 	  SignalException (sd);
3542 	  result = 0;
3543 	}
3544     }
3545 
3546   return result;
3547 }
3548 
3549 int
3550 mpu_store_mem_test (SIM_DESC sd, unsigned int addr, int size, int base_reg)
3551 {
3552   int result = 1;
3553 
3554   if (PSW & PSW_DMP)
3555     {
3556       if (addr >= PPA2ADDR (PPA & ~PPM) && addr <= DPA2ADDR (PPA | PPM))
3557 	{
3558 	  /* preifarallel area */
3559 	}
3560       else if (addr >= PPA2ADDR (SPAL) && addr <= DPA2ADDR (SPAU))
3561 	{
3562 	  /* stack area */
3563 	}
3564       else if (DPE0 && addr >= DPA2ADDR (DPA0L) && addr <= DPA2ADDR (DPA0L) && DPW0
3565 	       && ((SPAL & SPAL_SPS) ? base_reg == SP_REGNO : 1))
3566 	{
3567 	  /* data area */
3568 	}
3569       else if (DPE1 && addr >= DPA2ADDR (DPA1L) && addr <= DPA2ADDR (DPA1L) && DPW1
3570 	       && ((SPAL & SPAL_SPS) ? base_reg == SP_REGNO : 1))
3571 	{
3572 	  /* data area */
3573 	}
3574       else if (DPE2 && addr >= DPA2ADDR (DPA2L) && addr <= DPA2ADDR (DPA2L) && DPW2
3575 	       && ((SPAL & SPAL_SPS) ? base_reg == SP_REGNO : 1))
3576 	{
3577 	  /* data area */
3578 	}
3579       else if (DPE3 && addr >= DPA2ADDR (DPA3L) && addr <= DPA2ADDR (DPA3L) && DPW3
3580 	       && ((SPAL & SPAL_SPS) ? base_reg == SP_REGNO : 1))
3581 	{
3582 	  /* data area */
3583 	}
3584       else
3585 	{
3586 	  if (addr >= PPA2ADDR (PPA & ~PPM) && addr <= DPA2ADDR (PPA | PPM))
3587 	    {
3588 	      FEIC = 0x432;
3589 	      VPTID = TID;
3590 	      VPADR = PC;
3591 #ifdef NOT_YET
3592 	      VIP_PP;
3593 	      VPECR;
3594 #endif
3595 	    }
3596 	  else
3597 	    {
3598 	      FEIC = 0x431;
3599 	      VMTID = TID;
3600 	      VMADR = VMECR;
3601 	      VMECR &= ~(VMECR_VMW | VMECR_VMX);
3602 	      VMECR |= VMECR_VMR;
3603 	      PC = 0x30;
3604 	    }
3605 	  result = 0;
3606 	}
3607     }
3608 
3609   return result;
3610 }
3611 
3612