30 /* FIXME - should be including a version of syscall.h that does not
31 pollute the name space */
32 #include "../../libgloss/v850/sys/syscall.h"
34 #include "libiberty.h"
37 #if !defined(__GO32__) && !defined(_WIN32)
39 #include <sys/times.h>
43 /* start-sanitize-v850e */
44 /* This is an array of the bit positions of registers r20 .. r31 in
45 that order in a prepare/dispose instruction. */
46 int type1_regs[12] = { 27, 26, 25, 24, 31, 30, 29, 28, 23, 22, 0, 21 };
47 /* end-sanitize-v850e */
48 /* start-sanitize-v850eq */
49 /* This is an array of the bit positions of registers r16 .. r31 in
50 that order in a push/pop instruction. */
51 int type2_regs[16] = { 3, 2, 1, 0, 27, 26, 25, 24, 31, 30, 29, 28, 23, 22, 20, 21};
52 /* This is an array of the bit positions of registers r1 .. r15 in
53 that order in a push/pop instruction. */
54 int type3_regs[15] = { 2, 1, 0, 27, 26, 25, 24, 31, 30, 29, 28, 23, 22, 20, 21};
55 /* end-sanitize-v850eq */
58 #ifndef SIZE_INSTRUCTION
59 #define SIZE_INSTRUCTION 6
63 #define SIZE_OPERANDS 16
67 #define SIZE_VALUES 11
71 #define SIZE_LOCATION 40
76 trace_input (name, type, size)
86 const char *functionname;
87 unsigned int linenumber;
89 if (!TRACE_ALU_P (STATE_CPU (simulator, 0)))
94 if (STATE_TEXT_SECTION (simulator)
95 && PC >= STATE_TEXT_START (simulator)
96 && PC < STATE_TEXT_END (simulator))
98 filename = (const char *)0;
99 functionname = (const char *)0;
101 if (bfd_find_nearest_line (STATE_PROG_BFD (simulator),
102 STATE_TEXT_SECTION (simulator),
103 (struct symbol_cache_entry **)0,
104 PC - STATE_TEXT_START (simulator),
105 &filename, &functionname, &linenumber))
110 sprintf (p, "Line %5d ", linenumber);
116 sprintf (p, "Func %s ", functionname);
121 char *q = (char *) strrchr (filename, '/');
122 sprintf (p, "File %s ", (q) ? q+1 : filename);
131 trace_printf (simulator, STATE_CPU (simulator, 0),
132 "0x%.8x: %-*.*s %-*s",
134 SIZE_LOCATION, SIZE_LOCATION, buf,
135 SIZE_INSTRUCTION, name);
147 case OP_REG_REG_MOVE:
148 values[0] = State.regs[OP[0]];
152 /* start-sanitize-v850e */
154 /* end-sanitize-v850e */
157 values[0] = State.regs[OP[1]];
158 values[1] = State.regs[OP[0]];
164 values[0] = SEXT5 (OP[0]);
169 case OP_IMM_REG_MOVE:
170 values[0] = SEXT5 (OP[0]);
175 values[0] = State.pc;
176 values[1] = SEXT9 (OP[0]);
182 values[0] = OP[1] * size;
183 values[1] = State.regs[30];
188 values[0] = State.regs[OP[0]];
189 values[1] = OP[1] * size;
190 values[2] = State.regs[30];
195 values[0] = EXTEND16 (OP[2]);
196 values[1] = State.regs[OP[0]];
201 values[0] = State.regs[OP[1]];
202 values[1] = EXTEND16 (OP[2]);
203 values[2] = State.regs[OP[0]];
208 values[0] = SEXT22 (OP[0]);
209 values[1] = State.pc;
214 values[0] = EXTEND16 (OP[0]) << size;
215 values[1] = State.regs[OP[1]];
219 case OP_UIMM_REG_REG:
220 values[0] = (OP[0] & 0xffff) << size;
221 values[1] = State.regs[OP[1]];
239 values[0] = State.regs[OP[0]];
244 values[0] = State.sregs[OP[1]];
248 for (i = 0; i < num_values; i++)
249 trace_printf (simulator, STATE_CPU (simulator, 0),
250 "%*s0x%.8lx", SIZE_VALUES - 10, "", values[i]);
253 trace_printf (simulator, STATE_CPU (simulator, 0),
254 "%*s", SIZE_VALUES, "");
258 trace_output (result)
259 enum op_types result;
261 if (TRACE_ALU_P (STATE_CPU (simulator, 0)))
281 trace_printf (simulator, STATE_CPU (simulator, 0),
282 " :: 0x%.8lx", (unsigned long)State.regs[OP[0]]);
286 case OP_REG_REG_MOVE:
288 case OP_IMM_REG_MOVE:
291 trace_printf (simulator, STATE_CPU (simulator, 0),
292 " :: 0x%.8lx", (unsigned long)State.regs[OP[1]]);
296 case OP_UIMM_REG_REG:
297 trace_printf (simulator, STATE_CPU (simulator, 0),
298 " :: 0x%.8lx", (unsigned long)State.regs[OP[2]]);
303 trace_printf (simulator, STATE_CPU (simulator, 0),
304 " :: 0x%.8lx", (unsigned long)State.regs[OP[1]]);
308 trace_printf (simulator, STATE_CPU (simulator, 0),
309 " :: 0x%.8lx", (unsigned long)State.sregs[OP[1]]);
313 trace_printf (simulator, STATE_CPU (simulator, 0),
321 /* Returns 1 if the specific condition is met, returns 0 otherwise. */
323 condition_met (unsigned code)
325 unsigned int psw = PSW;
329 case 0x0: return ((psw & PSW_OV) != 0);
330 case 0x1: return ((psw & PSW_CY) != 0);
331 case 0x2: return ((psw & PSW_Z) != 0);
332 case 0x3: return ((((psw & PSW_CY) != 0) | ((psw & PSW_Z) != 0)) != 0);
333 case 0x4: return ((psw & PSW_S) != 0);
334 /*case 0x5: return 1;*/
335 case 0x6: return ((((psw & PSW_S) != 0) ^ ((psw & PSW_OV) != 0)) != 0);
336 case 0x7: return (((((psw & PSW_S) != 0) ^ ((psw & PSW_OV) != 0)) || ((psw & PSW_Z) != 0)) != 0);
337 case 0x8: return ((psw & PSW_OV) == 0);
338 case 0x9: return ((psw & PSW_CY) == 0);
339 case 0xa: return ((psw & PSW_Z) == 0);
340 case 0xb: return ((((psw & PSW_CY) != 0) | ((psw & PSW_Z) != 0)) == 0);
341 case 0xc: return ((psw & PSW_S) == 0);
342 case 0xd: return ((psw & PSW_SAT) != 0);
343 case 0xe: return ((((psw & PSW_S) != 0) ^ ((psw & PSW_OV) != 0)) == 0);
344 case 0xf: return (((((psw & PSW_S) != 0) ^ ((psw & PSW_OV) != 0)) || ((psw & PSW_Z) != 0)) == 0);
349 /* start-sanitize-v850e */
352 Add32 (unsigned long a1, unsigned long a2, int * carry)
354 unsigned long result = (a1 + a2);
356 * carry = (result < a1);
362 Multiply64 (boolean sign, unsigned long op0)
373 op1 = State.regs[ OP[1] ];
377 /* Compute sign of result and adjust operands if necessary. */
379 sign = (op0 ^ op1) & 0x80000000;
381 if (((signed long) op0) < 0)
384 if (((signed long) op1) < 0)
388 /* We can split the 32x32 into four 16x16 operations. This ensures
389 that we do not lose precision on 32bit only hosts: */
390 lo = ( (op0 & 0xFFFF) * (op1 & 0xFFFF));
391 mid1 = ( (op0 & 0xFFFF) * ((op1 >> 16) & 0xFFFF));
392 mid2 = (((op0 >> 16) & 0xFFFF) * (op1 & 0xFFFF));
393 hi = (((op0 >> 16) & 0xFFFF) * ((op1 >> 16) & 0xFFFF));
395 /* We now need to add all of these results together, taking care
396 to propogate the carries from the additions: */
397 RdLo = Add32 (lo, (mid1 << 16), & carry);
399 RdLo = Add32 (RdLo, (mid2 << 16), & carry);
400 RdHi += (carry + ((mid1 >> 16) & 0xFFFF) + ((mid2 >> 16) & 0xFFFF) + hi);
404 /* Negate result if necessary. */
408 if (RdLo == 0xFFFFFFFF)
417 /* Don't store into register 0. */
419 State.regs[ OP[1] ] = RdLo;
421 State.regs[ OP[2] >> 11 ] = RdHi;
426 /* end-sanitize-v850e */
428 /* Read a null terminated string from memory, return in a buffer */
436 while (sim_core_read_1 (STATE_CPU (sd, 0),
437 PC, sim_core_read_map, addr + nr) != 0)
439 buf = NZALLOC (char, nr + 1);
440 sim_read (simulator, addr, buf, nr);
444 /* Read a null terminated argument vector from memory, return in a
447 fetch_argv (sd, addr)
453 char **buf = xmalloc (max_nr * sizeof (char*));
456 unsigned32 a = sim_core_read_4 (STATE_CPU (sd, 0),
457 PC, sim_core_read_map, addr + nr * 4);
459 buf[nr] = fetch_str (sd, a);
461 if (nr == max_nr - 1)
464 buf = xrealloc (buf, max_nr * sizeof (char*));
476 unsigned long result;
478 result = load_mem (State.regs[30] + (OP[3] & 0x7f), 1);
480 /* start-sanitize-v850eq */
483 trace_input ("sld.bu", OP_LOAD16, 1);
484 State.regs[ OP[1] ] = result;
488 /* end-sanitize-v850eq */
489 trace_input ("sld.b", OP_LOAD16, 1);
491 State.regs[ OP[1] ] = EXTEND8 (result);
492 /* start-sanitize-v850eq */
494 /* end-sanitize-v850eq */
496 trace_output (OP_LOAD16);
505 unsigned long result;
507 result = load_mem (State.regs[30] + ((OP[3] & 0x7f) << 1), 2);
509 /* start-sanitize-v850eq */
512 trace_input ("sld.hu", OP_LOAD16, 2);
513 State.regs[ OP[1] ] = result;
517 /* end-sanitize-v850eq */
518 trace_input ("sld.h", OP_LOAD16, 2);
520 State.regs[ OP[1] ] = EXTEND16 (result);
521 /* start-sanitize-v850eq */
523 /* end-sanitize-v850eq */
525 trace_output (OP_LOAD16);
534 trace_input ("sld.w", OP_LOAD16, 4);
536 State.regs[ OP[1] ] = load_mem (State.regs[30] + ((OP[3] & 0x7f) << 1), 4);
538 trace_output (OP_LOAD16);
547 trace_input ("sst.b", OP_STORE16, 1);
549 store_mem (State.regs[30] + (OP[3] & 0x7f), 1, State.regs[ OP[1] ]);
551 trace_output (OP_STORE16);
560 trace_input ("sst.h", OP_STORE16, 2);
562 store_mem (State.regs[30] + ((OP[3] & 0x7f) << 1), 2, State.regs[ OP[1] ]);
564 trace_output (OP_STORE16);
573 trace_input ("sst.w", OP_STORE16, 4);
575 store_mem (State.regs[30] + ((OP[3] & 0x7e) << 1), 4, State.regs[ OP[1] ]);
577 trace_output (OP_STORE16);
588 trace_input ("ld.b", OP_LOAD32, 1);
590 adr = State.regs[ OP[0] ] + EXTEND16 (OP[2]);
592 State.regs[ OP[1] ] = EXTEND8 (load_mem (adr, 1));
594 trace_output (OP_LOAD32);
605 trace_input ("ld.h", OP_LOAD32, 2);
607 adr = State.regs[ OP[0] ] + EXTEND16 (OP[2]);
610 State.regs[ OP[1] ] = EXTEND16 (load_mem (adr, 2));
612 trace_output (OP_LOAD32);
623 trace_input ("ld.w", OP_LOAD32, 4);
625 adr = State.regs[ OP[0] ] + EXTEND16 (OP[2] & ~1);
628 State.regs[ OP[1] ] = load_mem (adr, 4);
630 trace_output (OP_LOAD32);
639 trace_input ("st.b", OP_STORE32, 1);
641 store_mem (State.regs[ OP[0] ] + EXTEND16 (OP[2]), 1, State.regs[ OP[1] ]);
643 trace_output (OP_STORE32);
654 trace_input ("st.h", OP_STORE32, 2);
656 adr = State.regs[ OP[0] ] + EXTEND16 (OP[2]);
659 store_mem (adr, 2, State.regs[ OP[1] ]);
661 trace_output (OP_STORE32);
672 trace_input ("st.w", OP_STORE32, 4);
674 adr = State.regs[ OP[0] ] + EXTEND16 (OP[2] & ~1);
677 store_mem (adr, 4, State.regs[ OP[1] ]);
679 trace_output (OP_STORE32);
687 trace_input ("Bcond", OP_COND_BR, 0);
688 trace_output (OP_COND_BR);
690 if (condition_met (code))
691 return SEXT9 (((OP[3] & 0x70) >> 3) | ((OP[3] & 0xf800) >> 7));
808 /* jarl/jr disp22, reg */
812 trace_input ("jarl/jr", OP_JUMP, 0);
815 State.regs[ OP[1] ] = PC + 4;
817 trace_output (OP_JUMP);
819 return SEXT22 (((OP[3] & 0x3f) << 16) | OP[2]);
826 unsigned int op0, op1, result, z, s, cy, ov;
828 trace_input ("add", OP_REG_REG, 0);
830 /* Compute the result. */
832 op0 = State.regs[ OP[0] ];
833 op1 = State.regs[ OP[1] ];
837 /* Compute the condition codes. */
839 s = (result & 0x80000000);
840 cy = (result < op0 || result < op1);
841 ov = ((op0 & 0x80000000) == (op1 & 0x80000000)
842 && (op0 & 0x80000000) != (result & 0x80000000));
844 /* Store the result and condition codes. */
845 State.regs[OP[1]] = result;
846 PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
847 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
848 | (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0));
849 trace_output (OP_REG_REG);
854 /* add sign_extend(imm5), reg */
858 unsigned int op0, op1, result, z, s, cy, ov;
861 trace_input ("add", OP_IMM_REG, 0);
863 /* Compute the result. */
864 temp = SEXT5 (OP[0]);
866 op1 = State.regs[OP[1]];
869 /* Compute the condition codes. */
871 s = (result & 0x80000000);
872 cy = (result < op0 || result < op1);
873 ov = ((op0 & 0x80000000) == (op1 & 0x80000000)
874 && (op0 & 0x80000000) != (result & 0x80000000));
876 /* Store the result and condition codes. */
877 State.regs[OP[1]] = result;
878 PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
879 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
880 | (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0));
881 trace_output (OP_IMM_REG);
886 /* addi sign_extend(imm16), reg, reg */
890 unsigned int op0, op1, result, z, s, cy, ov;
892 trace_input ("addi", OP_IMM_REG_REG, 0);
894 /* Compute the result. */
896 op0 = EXTEND16 (OP[2]);
897 op1 = State.regs[ OP[0] ];
900 /* Compute the condition codes. */
902 s = (result & 0x80000000);
903 cy = (result < op0 || result < op1);
904 ov = ((op0 & 0x80000000) == (op1 & 0x80000000)
905 && (op0 & 0x80000000) != (result & 0x80000000));
907 /* Store the result and condition codes. */
908 State.regs[OP[1]] = result;
909 PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
910 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
911 | (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0));
912 trace_output (OP_IMM_REG_REG);
921 unsigned int op0, op1, result, z, s, cy, ov;
923 trace_input ("sub", OP_REG_REG, 0);
924 /* Compute the result. */
925 op0 = State.regs[ OP[0] ];
926 op1 = State.regs[ OP[1] ];
929 /* Compute the condition codes. */
931 s = (result & 0x80000000);
933 ov = ((op1 & 0x80000000) != (op0 & 0x80000000)
934 && (op1 & 0x80000000) != (result & 0x80000000));
936 /* Store the result and condition codes. */
937 State.regs[OP[1]] = result;
938 PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
939 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
940 | (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0));
941 trace_output (OP_REG_REG);
946 /* subr reg1, reg2 */
950 unsigned int op0, op1, result, z, s, cy, ov;
952 trace_input ("subr", OP_REG_REG, 0);
953 /* Compute the result. */
954 op0 = State.regs[ OP[0] ];
955 op1 = State.regs[ OP[1] ];
958 /* Compute the condition codes. */
960 s = (result & 0x80000000);
962 ov = ((op0 & 0x80000000) != (op1 & 0x80000000)
963 && (op0 & 0x80000000) != (result & 0x80000000));
965 /* Store the result and condition codes. */
966 State.regs[OP[1]] = result;
967 PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
968 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
969 | (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0));
970 trace_output (OP_REG_REG);
976 /* mulh reg1, reg2 */
980 /* start-sanitize-v850e */
983 trace_input ("sxh", OP_REG, 0);
985 State.regs[ OP[0] ] = EXTEND16 (State.regs[ OP[0] ]);
987 trace_output (OP_REG);
990 /* end-sanitize-v850e */
992 trace_input ("mulh", OP_REG_REG, 0);
994 State.regs[ OP[1] ] = (EXTEND16 (State.regs[ OP[1] ]) * EXTEND16 (State.regs[ OP[0] ]));
996 trace_output (OP_REG_REG);
1002 /* mulh sign_extend(imm5), reg2 */
1006 trace_input ("mulh", OP_IMM_REG, 0);
1008 State.regs[ OP[1] ] = EXTEND16 (State.regs[ OP[1] ]) * SEXT5 (OP[0]);
1010 trace_output (OP_IMM_REG);
1015 /* mulhi imm16, reg1, reg2 */
1019 trace_input ("mulhi", OP_IMM_REG_REG, 0);
1021 State.regs[ OP[1] ] = EXTEND16 (State.regs[ OP[0] ]) * EXTEND16 (OP[2]);
1023 trace_output (OP_IMM_REG_REG);
1028 /* divh reg1, reg2 */
1033 /* start-sanitize-v850e */
1038 trace_input ("switch", OP_REG, 0);
1040 adr = State.pc + 2 + (State.regs[ OP[0] ] << 1);
1041 State.pc = State.pc + 2 + (EXTEND16 (load_mem (adr, 2)) << 1);
1043 trace_output (OP_REG);
1046 /* end-sanitize-v850e */
1048 unsigned int op0, op1, result, ov, s, z;
1051 trace_input ("divh", OP_REG_REG, 0);
1053 /* Compute the result. */
1054 temp = EXTEND16 (State.regs[ OP[0] ]);
1056 op1 = State.regs[OP[1]];
1058 if (op0 == 0xffffffff && op1 == 0x80000000)
1060 result = 0x80000000;
1074 /* Compute the condition codes. */
1076 s = (result & 0x80000000);
1078 /* Store the result and condition codes. */
1079 State.regs[OP[1]] = result;
1080 PSW &= ~(PSW_Z | PSW_S | PSW_OV);
1081 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
1082 | (ov ? PSW_OV : 0));
1083 trace_output (OP_REG_REG);
1093 unsigned int op0, op1, result, z, s, cy, ov;
1095 trace_input ("cmp", OP_REG_REG_CMP, 0);
1096 /* Compute the result. */
1097 op0 = State.regs[ OP[0] ];
1098 op1 = State.regs[ OP[1] ];
1101 /* Compute the condition codes. */
1103 s = (result & 0x80000000);
1105 ov = ((op1 & 0x80000000) != (op0 & 0x80000000)
1106 && (op1 & 0x80000000) != (result & 0x80000000));
1108 /* Set condition codes. */
1109 PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
1110 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
1111 | (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0));
1112 trace_output (OP_REG_REG_CMP);
1117 /* cmp sign_extend(imm5), reg */
1121 unsigned int op0, op1, result, z, s, cy, ov;
1124 /* Compute the result. */
1125 trace_input ("cmp", OP_IMM_REG_CMP, 0);
1126 temp = SEXT5 (OP[0]);
1128 op1 = State.regs[OP[1]];
1131 /* Compute the condition codes. */
1133 s = (result & 0x80000000);
1135 ov = ((op1 & 0x80000000) != (op0 & 0x80000000)
1136 && (op1 & 0x80000000) != (result & 0x80000000));
1138 /* Set condition codes. */
1139 PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
1140 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
1141 | (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0));
1142 trace_output (OP_IMM_REG_CMP);
1147 /* setf cccc,reg2 */
1151 trace_input ("setf", OP_EX1, 0);
1153 State.regs[ OP[1] ] = condition_met (OP[0]);
1155 trace_output (OP_EX1);
1160 /* satadd reg,reg */
1164 unsigned int op0, op1, result, z, s, cy, ov, sat;
1166 trace_input ("satadd", OP_REG_REG, 0);
1167 /* Compute the result. */
1168 op0 = State.regs[ OP[0] ];
1169 op1 = State.regs[ OP[1] ];
1172 /* Compute the condition codes. */
1174 s = (result & 0x80000000);
1175 cy = (result < op0 || result < op1);
1176 ov = ((op0 & 0x80000000) == (op1 & 0x80000000)
1177 && (op0 & 0x80000000) != (result & 0x80000000));
1180 /* Store the result and condition codes. */
1181 State.regs[OP[1]] = result;
1182 PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
1183 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
1184 | (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0)
1185 | (sat ? PSW_SAT : 0));
1187 /* Handle saturated results. */
1189 State.regs[OP[1]] = 0x80000000;
1191 State.regs[OP[1]] = 0x7fffffff;
1192 trace_output (OP_REG_REG);
1197 /* satadd sign_extend(imm5), reg */
1201 unsigned int op0, op1, result, z, s, cy, ov, sat;
1205 trace_input ("satadd", OP_IMM_REG, 0);
1207 /* Compute the result. */
1208 temp = SEXT5 (OP[0]);
1210 op1 = State.regs[OP[1]];
1213 /* Compute the condition codes. */
1215 s = (result & 0x80000000);
1216 cy = (result < op0 || result < op1);
1217 ov = ((op0 & 0x80000000) == (op1 & 0x80000000)
1218 && (op0 & 0x80000000) != (result & 0x80000000));
1221 /* Store the result and condition codes. */
1222 State.regs[OP[1]] = result;
1223 PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
1224 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
1225 | (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0)
1226 | (sat ? PSW_SAT : 0));
1228 /* Handle saturated results. */
1230 State.regs[OP[1]] = 0x80000000;
1232 State.regs[OP[1]] = 0x7fffffff;
1233 trace_output (OP_IMM_REG);
1238 /* satsub reg1, reg2 */
1243 /* start-sanitize-v850e */
1246 trace_input ("sxb", OP_REG, 0);
1248 State.regs[ OP[0] ] = EXTEND8 (State.regs[ OP[0] ]);
1250 trace_output (OP_REG);
1253 /* end-sanitize-v850e */
1255 unsigned int op0, op1, result, z, s, cy, ov, sat;
1257 trace_input ("satsub", OP_REG_REG, 0);
1259 /* Compute the result. */
1260 op0 = State.regs[ OP[0] ];
1261 op1 = State.regs[ OP[1] ];
1264 /* Compute the condition codes. */
1266 s = (result & 0x80000000);
1268 ov = ((op1 & 0x80000000) != (op0 & 0x80000000)
1269 && (op1 & 0x80000000) != (result & 0x80000000));
1272 /* Store the result and condition codes. */
1273 State.regs[OP[1]] = result;
1274 PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
1275 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
1276 | (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0)
1277 | (sat ? PSW_SAT : 0));
1279 /* Handle saturated results. */
1281 State.regs[OP[1]] = 0x80000000;
1283 State.regs[OP[1]] = 0x7fffffff;
1284 trace_output (OP_REG_REG);
1290 /* satsubi sign_extend(imm16), reg */
1294 unsigned int op0, op1, result, z, s, cy, ov, sat;
1297 trace_input ("satsubi", OP_IMM_REG, 0);
1299 /* Compute the result. */
1300 temp = EXTEND16 (OP[2]);
1302 op1 = State.regs[ OP[0] ];
1305 /* Compute the condition codes. */
1307 s = (result & 0x80000000);
1309 ov = ((op1 & 0x80000000) != (op0 & 0x80000000)
1310 && (op1 & 0x80000000) != (result & 0x80000000));
1313 /* Store the result and condition codes. */
1314 State.regs[OP[1]] = result;
1315 PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
1316 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
1317 | (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0)
1318 | (sat ? PSW_SAT : 0));
1320 /* Handle saturated results. */
1322 State.regs[OP[1]] = 0x80000000;
1324 State.regs[OP[1]] = 0x7fffffff;
1325 trace_output (OP_IMM_REG);
1330 /* satsubr reg,reg */
1334 unsigned int op0, op1, result, z, s, cy, ov, sat;
1336 trace_input ("satsubr", OP_REG_REG, 0);
1338 /* Compute the result. */
1339 op0 = State.regs[ OP[0] ];
1340 op1 = State.regs[ OP[1] ];
1343 /* Compute the condition codes. */
1345 s = (result & 0x80000000);
1346 cy = (result < op0);
1347 ov = ((op1 & 0x80000000) != (op0 & 0x80000000)
1348 && (op1 & 0x80000000) != (result & 0x80000000));
1351 /* Store the result and condition codes. */
1352 State.regs[OP[1]] = result;
1353 PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
1354 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
1355 | (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0)
1356 | (sat ? PSW_SAT : 0));
1358 /* Handle saturated results. */
1360 State.regs[OP[1]] = 0x80000000;
1362 State.regs[OP[1]] = 0x7fffffff;
1363 trace_output (OP_REG_REG);
1372 unsigned int op0, op1, result, z, s;
1374 trace_input ("tst", OP_REG_REG_CMP, 0);
1376 /* Compute the result. */
1377 op0 = State.regs[ OP[0] ];
1378 op1 = State.regs[ OP[1] ];
1381 /* Compute the condition codes. */
1383 s = (result & 0x80000000);
1385 /* Store the condition codes. */
1386 PSW &= ~(PSW_Z | PSW_S | PSW_OV);
1387 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0));
1388 trace_output (OP_REG_REG_CMP);
1397 trace_input ("mov", OP_REG_REG_MOVE, 0);
1399 State.regs[ OP[1] ] = State.regs[ OP[0] ];
1401 trace_output (OP_REG_REG_MOVE);
1406 /* mov sign_extend(imm5), reg */
1411 /* start-sanitize-v850e */
1416 trace_input ("callt", OP_LOAD16, 1);
1421 adr = CTBP + ((OP[3] & 0x3f) << 1);
1423 PC = CTBP + load_mem (adr, 1);
1425 trace_output (OP_LOAD16);
1430 /* end-sanitize-v850e */
1432 int value = SEXT5 (OP[0]);
1434 trace_input ("mov", OP_IMM_REG_MOVE, 0);
1436 State.regs[ OP[1] ] = value;
1438 trace_output (OP_IMM_REG_MOVE);
1444 /* mov imm32, reg1 */
1445 /* movea sign_extend(imm16), reg, reg */
1449 /* start-sanitize-v850e */
1452 trace_input ("mov", OP_IMM_REG, 4);
1454 State.regs[ OP[0] ] = load_mem (PC + 2, 4);
1456 trace_output (OP_IMM_REG);
1461 /* end-sanitize-v850e */
1463 trace_input ("movea", OP_IMM_REG_REG, 0);
1465 State.regs[ OP[1] ] = State.regs[ OP[0] ] + EXTEND16 (OP[2]);
1467 trace_output (OP_IMM_REG_REG);
1473 /* dispose imm5, list12 [, reg1] */
1474 /* movhi imm16, reg, reg */
1478 /* start-sanitize-v850e */
1484 trace_input ("dispose", OP_PUSHPOP1, 0);
1486 SP += (OP[3] & 0x3e) << 1;
1488 /* Load the registers with lower number registers being retrieved from higher addresses. */
1490 if ((OP[3] & (1 << type1_regs[ i ])))
1492 State.regs[ 20 + i ] = load_mem (SP, 4);
1496 if ((OP[3] & 0x1f0000) != 0)
1498 PC = State.regs[ (OP[3] >> 16) & 0x1f];
1502 trace_output (OP_PUSHPOP1);
1505 /* end-sanitize-v850e */
1507 trace_input ("movhi", OP_UIMM_REG_REG, 16);
1509 State.regs[ OP[1] ] = State.regs[ OP[0] ] + (OP[2] << 16);
1511 trace_output (OP_UIMM_REG_REG);
1517 /* sar zero_extend(imm5),reg1 */
1521 unsigned int op0, op1, result, z, s, cy;
1523 trace_input ("sar", OP_IMM_REG, 0);
1525 op1 = State.regs[ OP[1] ];
1526 result = (signed)op1 >> op0;
1528 /* Compute the condition codes. */
1530 s = (result & 0x80000000);
1531 cy = (op1 & (1 << (op0 - 1)));
1533 /* Store the result and condition codes. */
1534 State.regs[ OP[1] ] = result;
1535 PSW &= ~(PSW_Z | PSW_S | PSW_OV | PSW_CY);
1536 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
1537 | (cy ? PSW_CY : 0));
1538 trace_output (OP_IMM_REG);
1543 /* sar reg1, reg2 */
1547 unsigned int op0, op1, result, z, s, cy;
1549 trace_input ("sar", OP_REG_REG, 0);
1551 op0 = State.regs[ OP[0] ] & 0x1f;
1552 op1 = State.regs[ OP[1] ];
1553 result = (signed)op1 >> op0;
1555 /* Compute the condition codes. */
1557 s = (result & 0x80000000);
1558 cy = (op1 & (1 << (op0 - 1)));
1560 /* Store the result and condition codes. */
1561 State.regs[OP[1]] = result;
1562 PSW &= ~(PSW_Z | PSW_S | PSW_OV | PSW_CY);
1563 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
1564 | (cy ? PSW_CY : 0));
1565 trace_output (OP_REG_REG);
1570 /* shl zero_extend(imm5),reg1 */
1574 unsigned int op0, op1, result, z, s, cy;
1576 trace_input ("shl", OP_IMM_REG, 0);
1578 op1 = State.regs[ OP[1] ];
1579 result = op1 << op0;
1581 /* Compute the condition codes. */
1583 s = (result & 0x80000000);
1584 cy = (op1 & (1 << (32 - op0)));
1586 /* Store the result and condition codes. */
1587 State.regs[OP[1]] = result;
1588 PSW &= ~(PSW_Z | PSW_S | PSW_OV | PSW_CY);
1589 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
1590 | (cy ? PSW_CY : 0));
1591 trace_output (OP_IMM_REG);
1596 /* shl reg1, reg2 */
1600 unsigned int op0, op1, result, z, s, cy;
1602 trace_input ("shl", OP_REG_REG, 0);
1603 op0 = State.regs[ OP[0] ] & 0x1f;
1604 op1 = State.regs[ OP[1] ];
1605 result = op1 << op0;
1607 /* Compute the condition codes. */
1609 s = (result & 0x80000000);
1610 cy = (op1 & (1 << (32 - op0)));
1612 /* Store the result and condition codes. */
1613 State.regs[OP[1]] = result;
1614 PSW &= ~(PSW_Z | PSW_S | PSW_OV | PSW_CY);
1615 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
1616 | (cy ? PSW_CY : 0));
1617 trace_output (OP_REG_REG);
1622 /* shr zero_extend(imm5),reg1 */
1626 unsigned int op0, op1, result, z, s, cy;
1628 trace_input ("shr", OP_IMM_REG, 0);
1630 op1 = State.regs[ OP[1] ];
1631 result = op1 >> op0;
1633 /* Compute the condition codes. */
1635 s = (result & 0x80000000);
1636 cy = (op1 & (1 << (op0 - 1)));
1638 /* Store the result and condition codes. */
1639 State.regs[OP[1]] = result;
1640 PSW &= ~(PSW_Z | PSW_S | PSW_OV | PSW_CY);
1641 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
1642 | (cy ? PSW_CY : 0));
1643 trace_output (OP_IMM_REG);
1648 /* shr reg1, reg2 */
1652 unsigned int op0, op1, result, z, s, cy;
1654 trace_input ("shr", OP_REG_REG, 0);
1655 op0 = State.regs[ OP[0] ] & 0x1f;
1656 op1 = State.regs[ OP[1] ];
1657 result = op1 >> op0;
1659 /* Compute the condition codes. */
1661 s = (result & 0x80000000);
1662 cy = (op1 & (1 << (op0 - 1)));
1664 /* Store the result and condition codes. */
1665 State.regs[OP[1]] = result;
1666 PSW &= ~(PSW_Z | PSW_S | PSW_OV | PSW_CY);
1667 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
1668 | (cy ? PSW_CY : 0));
1669 trace_output (OP_REG_REG);
1678 unsigned int op0, op1, result, z, s;
1680 trace_input ("or", OP_REG_REG, 0);
1682 /* Compute the result. */
1683 op0 = State.regs[ OP[0] ];
1684 op1 = State.regs[ OP[1] ];
1687 /* Compute the condition codes. */
1689 s = (result & 0x80000000);
1691 /* Store the result and condition codes. */
1692 State.regs[OP[1]] = result;
1693 PSW &= ~(PSW_Z | PSW_S | PSW_OV);
1694 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0));
1695 trace_output (OP_REG_REG);
1700 /* ori zero_extend(imm16), reg, reg */
1704 unsigned int op0, op1, result, z, s;
1706 trace_input ("ori", OP_UIMM_REG_REG, 0);
1708 op1 = State.regs[ OP[0] ];
1711 /* Compute the condition codes. */
1713 s = (result & 0x80000000);
1715 /* Store the result and condition codes. */
1716 State.regs[OP[1]] = result;
1717 PSW &= ~(PSW_Z | PSW_S | PSW_OV);
1718 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0));
1719 trace_output (OP_UIMM_REG_REG);
1728 unsigned int op0, op1, result, z, s;
1730 trace_input ("and", OP_REG_REG, 0);
1732 /* Compute the result. */
1733 op0 = State.regs[ OP[0] ];
1734 op1 = State.regs[ OP[1] ];
1737 /* Compute the condition codes. */
1739 s = (result & 0x80000000);
1741 /* Store the result and condition codes. */
1742 State.regs[OP[1]] = result;
1743 PSW &= ~(PSW_Z | PSW_S | PSW_OV);
1744 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0));
1745 trace_output (OP_REG_REG);
1750 /* andi zero_extend(imm16), reg, reg */
1754 unsigned int result, z;
1756 trace_input ("andi", OP_UIMM_REG_REG, 0);
1758 result = OP[2] & State.regs[ OP[0] ];
1760 /* Compute the condition codes. */
1763 /* Store the result and condition codes. */
1764 State.regs[ OP[1] ] = result;
1766 PSW &= ~(PSW_Z | PSW_S | PSW_OV);
1767 PSW |= (z ? PSW_Z : 0);
1769 trace_output (OP_UIMM_REG_REG);
1778 unsigned int op0, op1, result, z, s;
1780 trace_input ("xor", OP_REG_REG, 0);
1782 /* Compute the result. */
1783 op0 = State.regs[ OP[0] ];
1784 op1 = State.regs[ OP[1] ];
1787 /* Compute the condition codes. */
1789 s = (result & 0x80000000);
1791 /* Store the result and condition codes. */
1792 State.regs[OP[1]] = result;
1793 PSW &= ~(PSW_Z | PSW_S | PSW_OV);
1794 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0));
1795 trace_output (OP_REG_REG);
1800 /* xori zero_extend(imm16), reg, reg */
1804 unsigned int op0, op1, result, z, s;
1806 trace_input ("xori", OP_UIMM_REG_REG, 0);
1808 op1 = State.regs[ OP[0] ];
1811 /* Compute the condition codes. */
1813 s = (result & 0x80000000);
1815 /* Store the result and condition codes. */
1816 State.regs[OP[1]] = result;
1817 PSW &= ~(PSW_Z | PSW_S | PSW_OV);
1818 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0));
1819 trace_output (OP_UIMM_REG_REG);
1824 /* not reg1, reg2 */
1828 unsigned int op0, result, z, s;
1830 trace_input ("not", OP_REG_REG_MOVE, 0);
1831 /* Compute the result. */
1832 op0 = State.regs[ OP[0] ];
1835 /* Compute the condition codes. */
1837 s = (result & 0x80000000);
1839 /* Store the result and condition codes. */
1840 State.regs[OP[1]] = result;
1841 PSW &= ~(PSW_Z | PSW_S | PSW_OV);
1842 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0));
1843 trace_output (OP_REG_REG_MOVE);
1852 unsigned int op0, op1, op2;
1855 trace_input ("set1", OP_BIT, 0);
1856 op0 = State.regs[ OP[0] ];
1858 temp = EXTEND16 (OP[2]);
1860 temp = load_mem (op0 + op2, 1);
1862 if ((temp & (1 << op1)) == 0)
1865 store_mem (op0 + op2, 1, temp);
1866 trace_output (OP_BIT);
1875 unsigned int op0, op1, op2;
1878 trace_input ("not1", OP_BIT, 0);
1879 op0 = State.regs[ OP[0] ];
1881 temp = EXTEND16 (OP[2]);
1883 temp = load_mem (op0 + op2, 1);
1885 if ((temp & (1 << op1)) == 0)
1888 store_mem (op0 + op2, 1, temp);
1889 trace_output (OP_BIT);
1898 unsigned int op0, op1, op2;
1901 trace_input ("clr1", OP_BIT, 0);
1902 op0 = State.regs[ OP[0] ];
1904 temp = EXTEND16 (OP[2]);
1906 temp = load_mem (op0 + op2, 1);
1908 if ((temp & (1 << op1)) == 0)
1910 temp &= ~(1 << op1);
1911 store_mem (op0 + op2, 1, temp);
1912 trace_output (OP_BIT);
1921 unsigned int op0, op1, op2;
1924 trace_input ("tst1", OP_BIT, 0);
1925 op0 = State.regs[ OP[0] ];
1927 temp = EXTEND16 (OP[2]);
1929 temp = load_mem (op0 + op2, 1);
1931 if ((temp & (1 << op1)) == 0)
1933 trace_output (OP_BIT);
1942 sim_engine_halt (simulator, STATE_CPU (simulator, 0), NULL, PC,
1943 sim_stopped, SIGTRAP);
1951 trace_input ("di", OP_NONE, 0);
1953 trace_output (OP_NONE);
1962 trace_input ("ei", OP_NONE, 0);
1964 trace_output (OP_NONE);
1973 trace_input ("halt", OP_NONE, 0);
1974 /* FIXME this should put processor into a mode where NMI still handled */
1975 trace_output (OP_NONE);
1976 sim_engine_halt (simulator, STATE_CPU (simulator, 0), NULL, PC,
1977 sim_stopped, SIGTRAP);
1985 trace_input ("reti", OP_NONE, 0);
1986 trace_output (OP_NONE);
1988 /* Restore for NMI if only NP on, otherwise is interrupt or exception. */
1989 if ((PSW & (PSW_NP | PSW_EP)) == PSW_NP)
2007 trace_input ("trap", OP_TRAP, 0);
2008 trace_output (OP_TRAP);
2010 /* Trap 31 is used for simulating OS I/O functions */
2014 int save_errno = errno;
2017 /* Registers passed to trap 0 */
2019 #define FUNC State.regs[6] /* function number, return value */
2020 #define PARM1 State.regs[7] /* optional parm 1 */
2021 #define PARM2 State.regs[8] /* optional parm 2 */
2022 #define PARM3 State.regs[9] /* optional parm 3 */
2024 /* Registers set by trap 0 */
2026 #define RETVAL State.regs[10] /* return value */
2027 #define RETERR State.regs[11] /* return error code */
2029 /* Turn a pointer in a register into a pointer into real memory. */
2031 #define MEMPTR(x) (map (x))
2048 char *path = fetch_str (simulator, PARM1);
2049 char **argv = fetch_argv (simulator, PARM2);
2050 char **envp = fetch_argv (simulator, PARM3);
2051 RETVAL = execve (path, argv, envp);
2064 char *path = fetch_str (simulator, PARM1);
2065 char **argv = fetch_argv (simulator, PARM2);
2066 RETVAL = execv (path, argv);
2082 RETVAL = pipe (host_fd);
2083 SW (buf, host_fd[0]);
2084 buf += sizeof(uint16);
2085 SW (buf, host_fd[1]);
2097 RETVAL = wait (&status);
2107 char *buf = zalloc (PARM3);
2108 RETVAL = sim_io_read (simulator, PARM1, buf, PARM3);
2109 sim_write (simulator, PARM2, buf, PARM3);
2118 char *buf = zalloc (PARM3);
2119 sim_read (simulator, PARM2, buf, PARM3);
2121 RETVAL = sim_io_write_stdout (simulator, buf, PARM3);
2123 RETVAL = sim_io_write (simulator, PARM1, buf, PARM3);
2131 RETVAL = sim_io_lseek (simulator, PARM1, PARM2, PARM3);
2137 RETVAL = sim_io_close (simulator, PARM1);
2144 char *buf = fetch_str (simulator, PARM1);
2145 RETVAL = sim_io_open (simulator, buf, PARM2);
2153 if ((PARM1 & 0xffff0000) == 0xdead0000 && (PARM1 & 0xffff) != 0)
2154 /* get signal encoded by kill */
2155 sim_engine_halt (simulator, STATE_CPU (simulator, 0), NULL, PC,
2156 sim_signalled, PARM1 & 0xffff);
2157 else if (PARM1 == 0xdead)
2159 sim_engine_halt (simulator, STATE_CPU (simulator, 0), NULL, PC,
2160 sim_exited, SIGABRT);
2162 /* PARM1 has exit status */
2163 sim_engine_halt (simulator, STATE_CPU (simulator, 0), NULL, PC,
2168 #if !defined(__GO32__) && !defined(_WIN32)
2170 case SYS_stat: /* added at hmsi */
2171 /* stat system call */
2173 struct stat host_stat;
2175 char *path = fetch_str (simulator, PARM1);
2177 RETVAL = stat (path, &host_stat);
2182 /* Just wild-assed guesses. */
2183 store_mem (buf, 2, host_stat.st_dev);
2184 store_mem (buf + 2, 2, host_stat.st_ino);
2185 store_mem (buf + 4, 4, host_stat.st_mode);
2186 store_mem (buf + 8, 2, host_stat.st_nlink);
2187 store_mem (buf + 10, 2, host_stat.st_uid);
2188 store_mem (buf + 12, 2, host_stat.st_gid);
2189 store_mem (buf + 14, 2, host_stat.st_rdev);
2190 store_mem (buf + 16, 4, host_stat.st_size);
2191 store_mem (buf + 20, 4, host_stat.st_atime);
2192 store_mem (buf + 28, 4, host_stat.st_mtime);
2193 store_mem (buf + 36, 4, host_stat.st_ctime);
2203 char *path = fetch_str (simulator, PARM1);
2204 RETVAL = chown (path, PARM2, PARM3);
2215 char *path = fetch_str (simulator, PARM1);
2216 RETVAL = chmod (path, PARM2);
2228 RETVAL = time (&now);
2229 store_mem (PARM1, 4, now);
2235 #if !defined(__GO32__) && !defined(_WIN32)
2240 RETVAL = times (&tms);
2241 store_mem (PARM1, 4, tms.tms_utime);
2242 store_mem (PARM1 + 4, 4, tms.tms_stime);
2243 store_mem (PARM1 + 8, 4, tms.tms_cutime);
2244 store_mem (PARM1 + 12, 4, tms.tms_cstime);
2250 #ifdef SYS_gettimeofday
2251 #if !defined(__GO32__) && !defined(_WIN32)
2252 case SYS_gettimeofday:
2256 RETVAL = gettimeofday (&t, &tz);
2257 store_mem (PARM1, 4, t.tv_sec);
2258 store_mem (PARM1 + 4, 4, t.tv_usec);
2259 store_mem (PARM2, 4, tz.tz_minuteswest);
2260 store_mem (PARM2 + 4, 4, tz.tz_dsttime);
2270 /* Cast the second argument to void *, to avoid type mismatch
2271 if a prototype is present. */
2272 sim_io_error (simulator, "Utime not supported");
2273 /* RETVAL = utime (path, (void *) MEMPTR (PARM2)); */
2288 { /* Trap 0 -> 30 */
2293 ECR |= 0x40 + OP[0];
2294 /* Flag that we are now doing exception processing. */
2295 PSW |= PSW_EP | PSW_ID;
2296 PC = ((OP[0] < 0x10) ? 0x40 : 0x50) - 4;
2306 trace_input ("ldsr", OP_LDSR, 0);
2308 State.sregs[ OP[1] ] = State.regs[ OP[0] ];
2310 trace_output (OP_LDSR);
2319 trace_input ("stsr", OP_STSR, 0);
2321 State.regs[ OP[1] ] = State.sregs[ OP[0] ];
2323 trace_output (OP_STSR);
2328 /* start-sanitize-v850e */
2329 /* tst1 reg2, [reg1] */
2335 trace_input ("tst1", OP_BIT, 1);
2337 temp = load_mem (State.regs[ OP[0] ], 1);
2340 if ((temp & (1 << State.regs[ OP[1] & 0x7 ])) == 0)
2343 trace_output (OP_BIT);
2348 /* end-sanitize-v850e */
2349 /* start-sanitize-v850e */
2350 /* mulu reg1, reg2, reg3 */
2354 trace_input ("mulu", OP_REG_REG_REG, 0);
2356 Multiply64 (false, State.regs[ OP[0] ]);
2358 trace_output (OP_REG_REG_REG);
2363 /* end-sanitize-v850e */
2364 /* start-sanitize-v850e */
2366 #define BIT_CHANGE_OP( name, binop ) \
2368 unsigned int temp; \
2370 trace_input (name, OP_BIT_CHANGE, 0); \
2372 bit = 1 << State.regs[ OP[1] & 0x7 ]; \
2373 temp = load_mem (State.regs[ OP[0] ], 1); \
2376 if ((temp & bit) == 0) \
2380 store_mem (State.regs[ OP[0] ], 1, temp); \
2382 trace_output (OP_BIT_CHANGE); \
2386 /* clr1 reg2, [reg1] */
2390 BIT_CHANGE_OP ("clr1", &= ~ );
2393 /* not1 reg2, [reg1] */
2397 BIT_CHANGE_OP ("not1", ^= );
2404 BIT_CHANGE_OP ("set1", |= );
2411 trace_input ("sasf", OP_EX1, 0);
2413 State.regs[ OP[1] ] = (State.regs[ OP[1] ] << 1) | condition_met (OP[0]);
2415 trace_output (OP_EX1);
2419 /* end-sanitize-v850e */
2420 /* start-sanitize-v850eq */
2421 /* This function is courtesy of Sugimoto at NEC, via Seow Tan (Soew_Tan@el.nec.com) */
2426 unsigned long int als,
2427 unsigned long int sfi,
2428 unsigned long int * quotient_ptr,
2429 unsigned long int * remainder_ptr,
2430 boolean * overflow_ptr
2433 unsigned long ald = sfi >> (N - 1);
2434 unsigned long alo = als;
2439 unsigned int R1 = 1;
2440 unsigned int DBZ = (als == 0) ? 1 : 0;
2441 unsigned long alt = Q ? ~als : als;
2444 alo = ald + alt + Q;
2445 C = (((alt >> 31) & (ald >> 31))
2446 | (((alt >> 31) ^ (ald >> 31)) & (~alo >> 31)));
2449 R1 = (alo == 0) ? 0 : (R1 & Q);
2450 if ((S ^ (alo>>31)) && !C)
2455 sfi = (sfi << (32-N+1)) | Q;
2456 ald = (alo << 1) | (sfi >> 31);
2458 /* 2nd - N-1th Loop */
2459 for (i = 2; i < N; i++)
2461 alt = Q ? ~als : als;
2462 alo = ald + alt + Q;
2463 C = (((alt >> 31) & (ald >> 31))
2464 | (((alt >> 31) ^ (ald >> 31)) & (~alo >> 31)));
2467 R1 = (alo == 0) ? 0 : (R1 & Q);
2468 if ((S ^ (alo>>31)) && !C && !DBZ)
2473 sfi = (sfi << 1) | Q;
2474 ald = (alo << 1) | (sfi >> 31);
2478 alt = Q ? ~als : als;
2479 alo = ald + alt + Q;
2480 C = (((alt >> 31) & (ald >> 31))
2481 | (((alt >> 31) ^ (ald >> 31)) & (~alo >> 31)));
2484 R1 = (alo == 0) ? 0 : (R1 & Q);
2485 if ((S ^ (alo>>31)) && !C)
2490 * quotient_ptr = (sfi << 1) | Q;
2491 * remainder_ptr = Q ? alo : (alo + als);
2492 * overflow_ptr = DBZ | R1;
2495 /* This function is courtesy of Sugimoto at NEC, via Seow Tan (Soew_Tan@el.nec.com) */
2500 unsigned long int als,
2501 unsigned long int sfi,
2502 signed long int * quotient_ptr,
2503 signed long int * remainder_ptr,
2504 boolean * overflow_ptr
2507 unsigned long ald = (signed long) sfi >> (N - 1);
2508 unsigned long alo = als;
2509 unsigned int SS = als >> 31;
2510 unsigned int SD = sfi >> 31;
2511 unsigned int R1 = 1;
2513 unsigned int DBZ = als == 0 ? 1 : 0;
2514 unsigned int Q = ~(SS ^ SD) & 1;
2518 unsigned long alt = Q ? ~als : als;
2523 alo = ald + alt + Q;
2524 C = (((alt >> 31) & (ald >> 31))
2525 | (((alt >> 31) ^ (ald >> 31)) & (~alo >> 31)));
2527 R1 = (alo == 0) ? 0 : (R1 & (Q ^ (SS ^ SD)));
2529 sfi = (sfi << (32-N+1)) | Q;
2530 ald = (alo << 1) | (sfi >> 31);
2531 if ((alo >> 31) ^ (ald >> 31))
2536 /* 2nd - N-1th Loop */
2538 for (i = 2; i < N; i++)
2540 alt = Q ? ~als : als;
2541 alo = ald + alt + Q;
2542 C = (((alt >> 31) & (ald >> 31))
2543 | (((alt >> 31) ^ (ald >> 31)) & (~alo >> 31)));
2545 R1 = (alo == 0) ? 0 : (R1 & (Q ^ (SS ^ SD)));
2547 sfi = (sfi << 1) | Q;
2548 ald = (alo << 1) | (sfi >> 31);
2549 if ((alo >> 31) ^ (ald >> 31))
2556 alt = Q ? ~als : als;
2557 alo = ald + alt + Q;
2558 C = (((alt >> 31) & (ald >> 31))
2559 | (((alt >> 31) ^ (ald >> 31)) & (~alo >> 31)));
2561 R1 = (alo == 0) ? 0 : (R1 & (Q ^ (SS ^ SD)));
2562 sfi = (sfi << (32-N+1));
2568 alt = Q ? ~als : als;
2569 alo = ald + alt + Q;
2571 R1 = R1 & ((~alo >> 31) ^ SD);
2572 if ((alo != 0) && ((Q ^ (SS ^ SD)) ^ R1)) alo = ald;
2574 ald = sfi = (long) ((sfi >> 1) | (SS ^ SD) << 31) >> (32-N-1) | Q;
2576 ald = sfi = sfi | Q;
2578 OV = DBZ | ((alo == 0) ? 0 : R1);
2580 * remainder_ptr = alo;
2583 if (((alo != 0) && ((SS ^ SD) ^ R1))
2584 || ((alo == 0) && (SS ^ R1)))
2589 OV = (DBZ | R1) ? OV : ((alo >> 31) & (~ald >> 31));
2591 * quotient_ptr = alo;
2592 * overflow_ptr = OV;
2595 /* sdivun imm5, reg1, reg2, reg3 */
2599 unsigned long int quotient;
2600 unsigned long int remainder;
2601 unsigned long int divide_by;
2602 unsigned long int divide_this;
2603 boolean overflow = false;
2606 trace_input ("sdivun", OP_IMM_REG_REG_REG, 0);
2608 imm5 = 32 - ((OP[3] & 0x3c0000) >> 17);
2610 divide_by = State.regs[ OP[0] ];
2611 divide_this = State.regs[ OP[1] ] << imm5;
2613 divun (imm5, divide_by, divide_this, & quotient, & remainder, & overflow);
2615 State.regs[ OP[1] ] = quotient;
2616 State.regs[ OP[2] >> 11 ] = remainder;
2618 /* Set condition codes. */
2619 PSW &= ~(PSW_Z | PSW_S | PSW_OV);
2621 if (overflow) PSW |= PSW_OV;
2622 if (quotient == 0) PSW |= PSW_Z;
2623 if (quotient & 0x80000000) PSW |= PSW_S;
2625 trace_output (OP_IMM_REG_REG_REG);
2630 /* sdivn imm5, reg1, reg2, reg3 */
2634 signed long int quotient;
2635 signed long int remainder;
2636 signed long int divide_by;
2637 signed long int divide_this;
2638 boolean overflow = false;
2641 trace_input ("sdivn", OP_IMM_REG_REG_REG, 0);
2643 imm5 = 32 - ((OP[3] & 0x3c0000) >> 17);
2645 divide_by = State.regs[ OP[0] ];
2646 divide_this = State.regs[ OP[1] ] << imm5;
2648 divn (imm5, divide_by, divide_this, & quotient, & remainder, & overflow);
2650 State.regs[ OP[1] ] = quotient;
2651 State.regs[ OP[2] >> 11 ] = remainder;
2653 /* Set condition codes. */
2654 PSW &= ~(PSW_Z | PSW_S | PSW_OV);
2656 if (overflow) PSW |= PSW_OV;
2657 if (quotient == 0) PSW |= PSW_Z;
2658 if (quotient < 0) PSW |= PSW_S;
2660 trace_output (OP_IMM_REG_REG_REG);
2665 /* sdivhun imm5, reg1, reg2, reg3 */
2669 unsigned long int quotient;
2670 unsigned long int remainder;
2671 unsigned long int divide_by;
2672 unsigned long int divide_this;
2673 boolean overflow = false;
2676 trace_input ("sdivhun", OP_IMM_REG_REG_REG, 0);
2678 imm5 = 32 - ((OP[3] & 0x3c0000) >> 17);
2680 divide_by = State.regs[ OP[0] ] & 0xffff;
2681 divide_this = State.regs[ OP[1] ] << imm5;
2683 divun (imm5, divide_by, divide_this, & quotient, & remainder, & overflow);
2685 State.regs[ OP[1] ] = quotient;
2686 State.regs[ OP[2] >> 11 ] = remainder;
2688 /* Set condition codes. */
2689 PSW &= ~(PSW_Z | PSW_S | PSW_OV);
2691 if (overflow) PSW |= PSW_OV;
2692 if (quotient == 0) PSW |= PSW_Z;
2693 if (quotient & 0x80000000) PSW |= PSW_S;
2695 trace_output (OP_IMM_REG_REG_REG);
2700 /* sdivhn imm5, reg1, reg2, reg3 */
2704 signed long int quotient;
2705 signed long int remainder;
2706 signed long int divide_by;
2707 signed long int divide_this;
2708 boolean overflow = false;
2711 trace_input ("sdivhn", OP_IMM_REG_REG_REG, 0);
2713 imm5 = 32 - ((OP[3] & 0x3c0000) >> 17);
2715 divide_by = EXTEND16 (State.regs[ OP[0] ]);
2716 divide_this = State.regs[ OP[1] ] << imm5;
2718 divn (imm5, divide_by, divide_this, & quotient, & remainder, & overflow);
2720 State.regs[ OP[1] ] = quotient;
2721 State.regs[ OP[2] >> 11 ] = remainder;
2723 /* Set condition codes. */
2724 PSW &= ~(PSW_Z | PSW_S | PSW_OV);
2726 if (overflow) PSW |= PSW_OV;
2727 if (quotient == 0) PSW |= PSW_Z;
2728 if (quotient < 0) PSW |= PSW_S;
2730 trace_output (OP_IMM_REG_REG_REG);
2735 /* end-sanitize-v850eq */
2736 /* start-sanitize-v850e */
2737 /* divu reg1, reg2, reg3 */
2741 unsigned long int quotient;
2742 unsigned long int remainder;
2743 unsigned long int divide_by;
2744 unsigned long int divide_this;
2745 boolean overflow = false;
2747 trace_input ("divu", OP_REG_REG_REG, 0);
2749 /* Compute the result. */
2751 divide_by = State.regs[ OP[0] ];
2752 divide_this = State.regs[ OP[1] ];
2760 State.regs[ OP[1] ] = quotient = divide_this / divide_by;
2761 State.regs[ OP[2] >> 11 ] = remainder = divide_this % divide_by;
2763 /* Set condition codes. */
2764 PSW &= ~(PSW_Z | PSW_S | PSW_OV);
2766 if (overflow) PSW |= PSW_OV;
2767 if (quotient == 0) PSW |= PSW_Z;
2768 if (quotient & 0x80000000) PSW |= PSW_S;
2770 trace_output (OP_REG_REG_REG);
2775 /* end-sanitize-v850e */
2776 /* start-sanitize-v850e */
2777 /* div reg1, reg2, reg3 */
2781 signed long int quotient;
2782 signed long int remainder;
2783 signed long int divide_by;
2784 signed long int divide_this;
2785 boolean overflow = false;
2787 trace_input ("div", OP_REG_REG_REG, 0);
2789 /* Compute the result. */
2791 divide_by = State.regs[ OP[0] ];
2792 divide_this = State.regs[ OP[1] ];
2794 if (divide_by == 0 || (divide_by == -1 && divide_this == (1 << 31)))
2800 State.regs[ OP[1] ] = quotient = divide_this / divide_by;
2801 State.regs[ OP[2] >> 11 ] = remainder = divide_this % divide_by;
2803 /* Set condition codes. */
2804 PSW &= ~(PSW_Z | PSW_S | PSW_OV);
2806 if (overflow) PSW |= PSW_OV;
2807 if (quotient == 0) PSW |= PSW_Z;
2808 if (quotient < 0) PSW |= PSW_S;
2810 trace_output (OP_REG_REG_REG);
2815 /* end-sanitize-v850e */
2816 /* start-sanitize-v850e */
2817 /* divhu reg1, reg2, reg3 */
2821 unsigned long int quotient;
2822 unsigned long int remainder;
2823 unsigned long int divide_by;
2824 unsigned long int divide_this;
2825 boolean overflow = false;
2827 trace_input ("divhu", OP_REG_REG_REG, 0);
2829 /* Compute the result. */
2831 divide_by = State.regs[ OP[0] ] & 0xffff;
2832 divide_this = State.regs[ OP[1] ];
2840 State.regs[ OP[1] ] = quotient = divide_this / divide_by;
2841 State.regs[ OP[2] >> 11 ] = remainder = divide_this % divide_by;
2843 /* Set condition codes. */
2844 PSW &= ~(PSW_Z | PSW_S | PSW_OV);
2846 if (overflow) PSW |= PSW_OV;
2847 if (quotient == 0) PSW |= PSW_Z;
2848 if (quotient & 0x80000000) PSW |= PSW_S;
2850 trace_output (OP_REG_REG_REG);
2855 /* end-sanitize-v850e */
2856 /* start-sanitize-v850e */
2857 /* divh reg1, reg2, reg3 */
2861 signed long int quotient;
2862 signed long int remainder;
2863 signed long int divide_by;
2864 signed long int divide_this;
2865 boolean overflow = false;
2867 trace_input ("divh", OP_REG_REG_REG, 0);
2869 /* Compute the result. */
2871 divide_by = State.regs[ OP[0] ];
2872 divide_this = EXTEND16 (State.regs[ OP[1] ]);
2874 if (divide_by == 0 || (divide_by == -1 && divide_this == (1 << 31)))
2880 State.regs[ OP[1] ] = quotient = divide_this / divide_by;
2881 State.regs[ OP[2] >> 11 ] = remainder = divide_this % divide_by;
2883 /* Set condition codes. */
2884 PSW &= ~(PSW_Z | PSW_S | PSW_OV);
2886 if (overflow) PSW |= PSW_OV;
2887 if (quotient == 0) PSW |= PSW_Z;
2888 if (quotient < 0) PSW |= PSW_S;
2890 trace_output (OP_REG_REG_REG);
2895 /* end-sanitize-v850e */
2896 /* start-sanitize-v850e */
2897 /* mulu imm9, reg2, reg3 */
2901 trace_input ("mulu", OP_IMM_REG_REG, 0);
2903 Multiply64 (false, (OP[3] & 0x1f) | ((OP[3] >> 13) & 0x1e0));
2905 trace_output (OP_IMM_REG_REG);
2910 /* end-sanitize-v850e */
2911 /* start-sanitize-v850e */
2912 /* mul imm9, reg2, reg3 */
2916 trace_input ("mul", OP_IMM_REG_REG, 0);
2918 Multiply64 (true, (OP[3] & 0x1f) | ((OP[3] >> 13) & 0x1e0));
2920 trace_output (OP_IMM_REG_REG);
2925 /* end-sanitize-v850e */
2926 /* start-sanitize-v850e */
2927 /* cmov imm5, reg2, reg3 */
2931 trace_input ("cmov", OP_IMM_REG_REG, 0);
2933 State.regs[ OP[2] >> 11 ] = condition_met (OP[0]) ? SEXT5( OP[0] ) : State.regs[ OP[1] ];
2935 trace_output (OP_IMM_REG_REG);
2941 /* end-sanitize-v850e */
2942 /* start-sanitize-v850e */
2947 trace_input ("ctret", OP_NONE, 0);
2952 trace_output (OP_NONE);
2957 /* end-sanitize-v850e */
2958 /* start-sanitize-v850e */
2963 unsigned long value;
2965 trace_input ("hsw", OP_REG_REG3, 0);
2967 value = State.regs[ OP[ 1 ] ];
2969 value |= (State.regs[ OP[ 1 ] ] << 16);
2971 State.regs[ OP[2] >> 11 ] = value;
2973 PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
2975 if (value == 0) PSW |= PSW_Z;
2976 if (value & 0x80000000) PSW |= PSW_S;
2977 if (((value & 0xffff) == 0) || (value & 0xffff0000) == 0) PSW |= PSW_CY;
2979 trace_output (OP_REG_REG3);
2984 /* end-sanitize-v850e */
2985 /* start-sanitize-v850e */
2986 #define WORDHASNULLBYTE(x) (((x) - 0x01010101) & ~(x)&0x80808080)
2992 unsigned long value;
2994 trace_input ("bsw", OP_REG_REG3, 0);
2996 value = State.regs[ OP[ 1 ] ];
2998 value |= (State.regs[ OP[ 1 ] ] << 24);
2999 value |= ((State.regs[ OP[ 1 ] ] << 8) & 0x00ff0000);
3000 value |= ((State.regs[ OP[ 1 ] ] >> 8) & 0x0000ff00);
3002 State.regs[ OP[2] >> 11 ] = value;
3004 PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
3006 if (value == 0) PSW |= PSW_Z;
3007 if (value & 0x80000000) PSW |= PSW_S;
3008 if (WORDHASNULLBYTE (value)) PSW |= PSW_CY;
3010 trace_output (OP_REG_REG3);
3015 /* end-sanitize-v850e */
3016 /* start-sanitize-v850e */
3021 unsigned long value;
3023 trace_input ("bsh", OP_REG_REG3, 0);
3025 value = State.regs[ OP[ 1 ] ];
3027 value |= ((State.regs[ OP[ 1 ] ] << 8) & 0xff00ff00);
3028 value |= ((State.regs[ OP[ 1 ] ] >> 8) & 0x000000ff);
3030 State.regs[ OP[2] >> 11 ] = value;
3032 PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
3034 if (value == 0) PSW |= PSW_Z;
3035 if (value & 0x80000000) PSW |= PSW_S;
3036 if (((value & 0xff) == 0) || (value & 0x00ff) == 0) PSW |= PSW_CY;
3038 trace_output (OP_REG_REG3);
3043 /* end-sanitize-v850e */
3044 /* start-sanitize-v850e */
3051 trace_input ("ld.hu", OP_LOAD32, 2);
3053 adr = State.regs[ OP[0] ] + EXTEND16 (OP[2] & ~1);
3056 State.regs[ OP[1] ] = load_mem (adr, 2);
3058 trace_output (OP_LOAD32);
3063 /* end-sanitize-v850e */
3064 /* start-sanitize-v850e */
3071 trace_input ("ld.bu", OP_LOAD32, 1);
3073 adr = (State.regs[ OP[0] ]
3074 + (EXTEND16 (OP[2] & ~1) | ((OP[3] >> 5) & 1)));
3076 State.regs[ OP[1] ] = load_mem (adr, 1);
3078 trace_output (OP_LOAD32);
3083 /* prepare list12, imm5, imm32 */
3089 trace_input ("prepare", OP_PUSHPOP1, 0);
3091 /* Store the registers with lower number registers being placed at higher addresses. */
3092 for (i = 0; i < 12; i++)
3093 if ((OP[3] & (1 << type1_regs[ i ])))
3096 store_mem (SP, 4, State.regs[ 20 + i ]);
3099 SP -= (OP[3] & 0x3e) << 1;
3101 EP = load_mem (PC + 4, 4);
3103 trace_output (OP_PUSHPOP1);
3108 /* prepare list12, imm5, imm16-32 */
3114 trace_input ("prepare", OP_PUSHPOP1, 0);
3116 /* Store the registers with lower number registers being placed at higher addresses. */
3117 for (i = 0; i < 12; i++)
3118 if ((OP[3] & (1 << type1_regs[ i ])))
3121 store_mem (SP, 4, State.regs[ 20 + i ]);
3124 SP -= (OP[3] & 0x3e) << 1;
3126 EP = load_mem (PC + 4, 2) << 16;
3128 trace_output (OP_PUSHPOP1);
3133 /* prepare list12, imm5, imm16 */
3139 trace_input ("prepare", OP_PUSHPOP1, 0);
3141 /* Store the registers with lower number registers being placed at higher addresses. */
3142 for (i = 0; i < 12; i++)
3143 if ((OP[3] & (1 << type1_regs[ i ])))
3146 store_mem (SP, 4, State.regs[ 20 + i ]);
3149 SP -= (OP[3] & 0x3e) << 1;
3151 EP = EXTEND16 (load_mem (PC + 4, 2));
3153 trace_output (OP_PUSHPOP1);
3158 /* prepare list12, imm5, sp */
3164 trace_input ("prepare", OP_PUSHPOP1, 0);
3166 /* Store the registers with lower number registers being placed at higher addresses. */
3167 for (i = 0; i < 12; i++)
3168 if ((OP[3] & (1 << type1_regs[ i ])))
3171 store_mem (SP, 4, State.regs[ 20 + i ]);
3174 SP -= (OP[3] & 0x3e) << 1;
3178 trace_output (OP_PUSHPOP1);
3183 /* end-sanitize-v850e */
3184 /* start-sanitize-v850e */
3189 unsigned long result;
3191 result = load_mem (State.regs[30] + ((OP[3] & 0xf) << 1), 2);
3193 /* start-sanitize-v850eq */
3196 trace_input ("sld.h", OP_LOAD16, 2);
3197 State.regs[ OP[1] ] = EXTEND16 (result);
3201 /* end-sanitize-v850eq */
3202 trace_input ("sld.hu", OP_LOAD16, 2);
3204 State.regs[ OP[1] ] = result;
3205 /* start-sanitize-v850eq */
3207 /* end-sanitize-v850eq */
3209 trace_output (OP_LOAD16);
3214 /* end-sanitize-v850e */
3215 /* start-sanitize-v850e */
3216 /* cmov reg1, reg2, reg3 */
3220 trace_input ("cmov", OP_REG_REG_REG, 0);
3222 State.regs[ OP[2] >> 11 ] = condition_met (OP[0]) ? State.regs[ OP[0] ] : State.regs[ OP[1] ];
3224 trace_output (OP_REG_REG_REG);
3229 /* end-sanitize-v850e */
3230 /* start-sanitize-v850e */
3231 /* mul reg1, reg2, reg3 */
3235 trace_input ("mul", OP_REG_REG_REG, 0);
3237 Multiply64 (true, State.regs[ OP[0] ]);
3239 trace_output (OP_REG_REG_REG);
3244 /* end-sanitize-v850e */
3245 /* start-sanitize-v850eq */
3253 trace_input ("popmh", OP_PUSHPOP2, 0);
3255 if (OP[3] & (1 << 19))
3257 if ((PSW & PSW_NP) && ((PSW & PSW_EP) == 0))
3259 FEPSW = load_mem ( SP & ~ 3, 4);
3260 FEPC = load_mem ((SP + 4) & ~ 3, 4);
3264 EIPSW = load_mem ( SP & ~ 3, 4);
3265 EIPC = load_mem ((SP + 4) & ~ 3, 4);
3271 /* Load the registers with lower number registers being retrieved from higher addresses. */
3273 if ((OP[3] & (1 << type2_regs[ i ])))
3275 State.regs[ i + 16 ] = load_mem (SP & ~ 3, 4);
3279 trace_output (OP_PUSHPOP2);
3290 trace_input ("popml", OP_PUSHPOP3, 0);
3292 if (OP[3] & (1 << 19))
3294 if ((PSW & PSW_NP) && ((PSW & PSW_EP) == 0))
3296 FEPSW = load_mem ( SP & ~ 3, 4);
3297 FEPC = load_mem ((SP + 4) & ~ 3, 4);
3301 EIPSW = load_mem ( SP & ~ 3, 4);
3302 EIPC = load_mem ((SP + 4) & ~ 3, 4);
3308 if (OP[3] & (1 << 3))
3310 PSW = load_mem (SP & ~ 3, 4);
3314 /* Load the registers with lower number registers being retrieved from higher addresses. */
3316 if ((OP[3] & (1 << type3_regs[ i ])))
3318 State.regs[ i + 1 ] = load_mem (SP & ~ 3, 4);
3322 trace_output (OP_PUSHPOP2);
3333 trace_input ("pushmh", OP_PUSHPOP2, 0);
3335 /* Store the registers with lower number registers being placed at higher addresses. */
3336 for (i = 0; i < 16; i++)
3337 if ((OP[3] & (1 << type2_regs[ i ])))
3340 store_mem (SP & ~ 3, 4, State.regs[ i + 16 ]);
3343 if (OP[3] & (1 << 19))
3347 if ((PSW & PSW_NP) && ((PSW & PSW_EP) == 0))
3349 store_mem ((SP + 4) & ~ 3, 4, FEPC);
3350 store_mem ( SP & ~ 3, 4, FEPSW);
3354 store_mem ((SP + 4) & ~ 3, 4, EIPC);
3355 store_mem ( SP & ~ 3, 4, EIPSW);
3359 trace_output (OP_PUSHPOP2);
3364 /* end-sanitize-v850eq */