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 State.regs[ OP[1] ] = RdLo;
418 State.regs[ OP[2] >> 11 ] = RdHi;
423 /* end-sanitize-v850e */
425 /* Read a null terminated string from memory, return in a buffer */
433 while (sim_core_read_1 (STATE_CPU (sd, 0),
434 PC, sim_core_read_map, addr + nr) != 0)
436 buf = NZALLOC (char, nr + 1);
437 sim_read (simulator, addr, buf, nr);
441 /* Read a null terminated argument vector from memory, return in a
444 fetch_argv (sd, addr)
450 char **buf = xmalloc (max_nr * sizeof (char*));
453 unsigned32 a = sim_core_read_4 (STATE_CPU (sd, 0),
454 PC, sim_core_read_map, addr + nr * 4);
456 buf[nr] = fetch_str (sd, a);
458 if (nr == max_nr - 1)
461 buf = xrealloc (buf, max_nr * sizeof (char*));
473 unsigned long result;
475 result = load_mem (State.regs[30] + (OP[3] & 0x7f), 1);
477 /* start-sanitize-v850eq */
480 trace_input ("sld.bu", OP_LOAD16, 1);
481 State.regs[ OP[1] ] = result;
485 /* end-sanitize-v850eq */
486 trace_input ("sld.b", OP_LOAD16, 1);
488 State.regs[ OP[1] ] = EXTEND8 (result);
489 /* start-sanitize-v850eq */
491 /* end-sanitize-v850eq */
493 trace_output (OP_LOAD16);
502 unsigned long result;
504 result = load_mem (State.regs[30] + ((OP[3] & 0x7f) << 1), 2);
506 /* start-sanitize-v850eq */
509 trace_input ("sld.hu", OP_LOAD16, 2);
510 State.regs[ OP[1] ] = result;
514 /* end-sanitize-v850eq */
515 trace_input ("sld.h", OP_LOAD16, 2);
517 State.regs[ OP[1] ] = EXTEND16 (result);
518 /* start-sanitize-v850eq */
520 /* end-sanitize-v850eq */
522 trace_output (OP_LOAD16);
531 trace_input ("sld.w", OP_LOAD16, 4);
533 State.regs[ OP[1] ] = load_mem (State.regs[30] + ((OP[3] & 0x7f) << 1), 4);
535 trace_output (OP_LOAD16);
544 trace_input ("sst.b", OP_STORE16, 1);
546 store_mem (State.regs[30] + (OP[3] & 0x7f), 1, State.regs[ OP[1] ]);
548 trace_output (OP_STORE16);
557 trace_input ("sst.h", OP_STORE16, 2);
559 store_mem (State.regs[30] + ((OP[3] & 0x7f) << 1), 2, State.regs[ OP[1] ]);
561 trace_output (OP_STORE16);
570 trace_input ("sst.w", OP_STORE16, 4);
572 store_mem (State.regs[30] + ((OP[3] & 0x7e) << 1), 4, State.regs[ OP[1] ]);
574 trace_output (OP_STORE16);
585 trace_input ("ld.b", OP_LOAD32, 1);
587 adr = State.regs[ OP[0] ] + EXTEND16 (OP[2]);
589 State.regs[ OP[1] ] = EXTEND8 (load_mem (adr, 1));
591 trace_output (OP_LOAD32);
602 trace_input ("ld.h", OP_LOAD32, 2);
604 adr = State.regs[ OP[0] ] + EXTEND16 (OP[2]);
607 State.regs[ OP[1] ] = EXTEND16 (load_mem (adr, 2));
609 trace_output (OP_LOAD32);
620 trace_input ("ld.w", OP_LOAD32, 4);
622 adr = State.regs[ OP[0] ] + EXTEND16 (OP[2] & ~1);
625 State.regs[ OP[1] ] = load_mem (adr, 4);
627 trace_output (OP_LOAD32);
636 trace_input ("st.b", OP_STORE32, 1);
638 store_mem (State.regs[ OP[0] ] + EXTEND16 (OP[2]), 1, State.regs[ OP[1] ]);
640 trace_output (OP_STORE32);
651 trace_input ("st.h", OP_STORE32, 2);
653 adr = State.regs[ OP[0] ] + EXTEND16 (OP[2]);
656 store_mem (adr, 2, State.regs[ OP[1] ]);
658 trace_output (OP_STORE32);
669 trace_input ("st.w", OP_STORE32, 4);
671 adr = State.regs[ OP[0] ] + EXTEND16 (OP[2] & ~1);
674 store_mem (adr, 4, State.regs[ OP[1] ]);
676 trace_output (OP_STORE32);
684 trace_input ("Bcond", OP_COND_BR, 0);
685 trace_output (OP_COND_BR);
687 if (condition_met (code))
688 return SEXT9 (((OP[3] & 0x70) >> 3) | ((OP[3] & 0xf800) >> 7));
805 /* jarl/jr disp22, reg */
809 trace_input ("jarl/jr", OP_JUMP, 0);
812 State.regs[ OP[1] ] = PC + 4;
814 trace_output (OP_JUMP);
816 return SEXT22 (((OP[3] & 0x3f) << 16) | OP[2]);
823 unsigned int op0, op1, result, z, s, cy, ov;
825 trace_input ("add", OP_REG_REG, 0);
827 /* Compute the result. */
829 op0 = State.regs[ OP[0] ];
830 op1 = State.regs[ OP[1] ];
834 /* Compute the condition codes. */
836 s = (result & 0x80000000);
837 cy = (result < op0 || result < op1);
838 ov = ((op0 & 0x80000000) == (op1 & 0x80000000)
839 && (op0 & 0x80000000) != (result & 0x80000000));
841 /* Store the result and condition codes. */
842 State.regs[OP[1]] = result;
843 PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
844 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
845 | (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0));
846 trace_output (OP_REG_REG);
851 /* add sign_extend(imm5), reg */
855 unsigned int op0, op1, result, z, s, cy, ov;
858 trace_input ("add", OP_IMM_REG, 0);
860 /* Compute the result. */
861 temp = SEXT5 (OP[0]);
863 op1 = State.regs[OP[1]];
866 /* Compute the condition codes. */
868 s = (result & 0x80000000);
869 cy = (result < op0 || result < op1);
870 ov = ((op0 & 0x80000000) == (op1 & 0x80000000)
871 && (op0 & 0x80000000) != (result & 0x80000000));
873 /* Store the result and condition codes. */
874 State.regs[OP[1]] = result;
875 PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
876 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
877 | (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0));
878 trace_output (OP_IMM_REG);
883 /* addi sign_extend(imm16), reg, reg */
887 unsigned int op0, op1, result, z, s, cy, ov;
889 trace_input ("addi", OP_IMM_REG_REG, 0);
891 /* Compute the result. */
893 op0 = EXTEND16 (OP[2]);
894 op1 = State.regs[ OP[0] ];
897 /* Compute the condition codes. */
899 s = (result & 0x80000000);
900 cy = (result < op0 || result < op1);
901 ov = ((op0 & 0x80000000) == (op1 & 0x80000000)
902 && (op0 & 0x80000000) != (result & 0x80000000));
904 /* Store the result and condition codes. */
905 State.regs[OP[1]] = result;
906 PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
907 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
908 | (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0));
909 trace_output (OP_IMM_REG_REG);
918 unsigned int op0, op1, result, z, s, cy, ov;
920 trace_input ("sub", OP_REG_REG, 0);
921 /* Compute the result. */
922 op0 = State.regs[ OP[0] ];
923 op1 = State.regs[ OP[1] ];
926 /* Compute the condition codes. */
928 s = (result & 0x80000000);
930 ov = ((op1 & 0x80000000) != (op0 & 0x80000000)
931 && (op1 & 0x80000000) != (result & 0x80000000));
933 /* Store the result and condition codes. */
934 State.regs[OP[1]] = result;
935 PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
936 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
937 | (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0));
938 trace_output (OP_REG_REG);
943 /* subr reg1, reg2 */
947 unsigned int op0, op1, result, z, s, cy, ov;
949 trace_input ("subr", OP_REG_REG, 0);
950 /* Compute the result. */
951 op0 = State.regs[ OP[0] ];
952 op1 = State.regs[ OP[1] ];
955 /* Compute the condition codes. */
957 s = (result & 0x80000000);
959 ov = ((op0 & 0x80000000) != (op1 & 0x80000000)
960 && (op0 & 0x80000000) != (result & 0x80000000));
962 /* Store the result and condition codes. */
963 State.regs[OP[1]] = result;
964 PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
965 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
966 | (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0));
967 trace_output (OP_REG_REG);
973 /* mulh reg1, reg2 */
977 /* start-sanitize-v850e */
980 trace_input ("sxh", OP_REG, 0);
982 State.regs[ OP[0] ] = EXTEND16 (State.regs[ OP[0] ]);
984 trace_output (OP_REG);
987 /* end-sanitize-v850e */
989 trace_input ("mulh", OP_REG_REG, 0);
991 State.regs[ OP[1] ] = (EXTEND16 (State.regs[ OP[1] ]) * EXTEND16 (State.regs[ OP[0] ]));
993 trace_output (OP_REG_REG);
999 /* mulh sign_extend(imm5), reg2 */
1003 trace_input ("mulh", OP_IMM_REG, 0);
1005 State.regs[ OP[1] ] = EXTEND16 (State.regs[ OP[1] ]) * SEXT5 (OP[0]);
1007 trace_output (OP_IMM_REG);
1012 /* mulhi imm16, reg1, reg2 */
1016 trace_input ("mulhi", OP_IMM_REG_REG, 0);
1018 State.regs[ OP[1] ] = EXTEND16 (State.regs[ OP[0] ]) * EXTEND16 (OP[2]);
1020 trace_output (OP_IMM_REG_REG);
1025 /* divh reg1, reg2 */
1030 /* start-sanitize-v850e */
1035 trace_input ("switch", OP_REG, 0);
1037 adr = State.pc + 2 + (State.regs[ OP[0] ] << 1);
1038 State.pc = State.pc + 2 + (EXTEND16 (load_mem (adr, 2)) << 1);
1040 trace_output (OP_REG);
1043 /* end-sanitize-v850e */
1045 unsigned int op0, op1, result, ov, s, z;
1048 trace_input ("divh", OP_REG_REG, 0);
1050 /* Compute the result. */
1051 temp = EXTEND16 (State.regs[ OP[0] ]);
1053 op1 = State.regs[OP[1]];
1055 if (op0 == 0xffffffff && op1 == 0x80000000)
1057 result = 0x80000000;
1071 /* Compute the condition codes. */
1073 s = (result & 0x80000000);
1075 /* Store the result and condition codes. */
1076 State.regs[OP[1]] = result;
1077 PSW &= ~(PSW_Z | PSW_S | PSW_OV);
1078 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
1079 | (ov ? PSW_OV : 0));
1080 trace_output (OP_REG_REG);
1090 unsigned int op0, op1, result, z, s, cy, ov;
1092 trace_input ("cmp", OP_REG_REG_CMP, 0);
1093 /* Compute the result. */
1094 op0 = State.regs[ OP[0] ];
1095 op1 = State.regs[ OP[1] ];
1098 /* Compute the condition codes. */
1100 s = (result & 0x80000000);
1102 ov = ((op1 & 0x80000000) != (op0 & 0x80000000)
1103 && (op1 & 0x80000000) != (result & 0x80000000));
1105 /* Set condition codes. */
1106 PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
1107 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
1108 | (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0));
1109 trace_output (OP_REG_REG_CMP);
1114 /* cmp sign_extend(imm5), reg */
1118 unsigned int op0, op1, result, z, s, cy, ov;
1121 /* Compute the result. */
1122 trace_input ("cmp", OP_IMM_REG_CMP, 0);
1123 temp = SEXT5 (OP[0]);
1125 op1 = State.regs[OP[1]];
1128 /* Compute the condition codes. */
1130 s = (result & 0x80000000);
1132 ov = ((op1 & 0x80000000) != (op0 & 0x80000000)
1133 && (op1 & 0x80000000) != (result & 0x80000000));
1135 /* Set condition codes. */
1136 PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
1137 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
1138 | (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0));
1139 trace_output (OP_IMM_REG_CMP);
1144 /* setf cccc,reg2 */
1148 trace_input ("setf", OP_EX1, 0);
1150 State.regs[ OP[1] ] = condition_met (OP[0]);
1152 trace_output (OP_EX1);
1157 /* satadd reg,reg */
1161 unsigned int op0, op1, result, z, s, cy, ov, sat;
1163 trace_input ("satadd", OP_REG_REG, 0);
1164 /* Compute the result. */
1165 op0 = State.regs[ OP[0] ];
1166 op1 = State.regs[ OP[1] ];
1169 /* Compute the condition codes. */
1171 s = (result & 0x80000000);
1172 cy = (result < op0 || result < op1);
1173 ov = ((op0 & 0x80000000) == (op1 & 0x80000000)
1174 && (op0 & 0x80000000) != (result & 0x80000000));
1177 /* Store the result and condition codes. */
1178 State.regs[OP[1]] = result;
1179 PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
1180 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
1181 | (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0)
1182 | (sat ? PSW_SAT : 0));
1184 /* Handle saturated results. */
1186 State.regs[OP[1]] = 0x80000000;
1188 State.regs[OP[1]] = 0x7fffffff;
1189 trace_output (OP_REG_REG);
1194 /* satadd sign_extend(imm5), reg */
1198 unsigned int op0, op1, result, z, s, cy, ov, sat;
1202 trace_input ("satadd", OP_IMM_REG, 0);
1204 /* Compute the result. */
1205 temp = SEXT5 (OP[0]);
1207 op1 = State.regs[OP[1]];
1210 /* Compute the condition codes. */
1212 s = (result & 0x80000000);
1213 cy = (result < op0 || result < op1);
1214 ov = ((op0 & 0x80000000) == (op1 & 0x80000000)
1215 && (op0 & 0x80000000) != (result & 0x80000000));
1218 /* Store the result and condition codes. */
1219 State.regs[OP[1]] = result;
1220 PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
1221 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
1222 | (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0)
1223 | (sat ? PSW_SAT : 0));
1225 /* Handle saturated results. */
1227 State.regs[OP[1]] = 0x80000000;
1229 State.regs[OP[1]] = 0x7fffffff;
1230 trace_output (OP_IMM_REG);
1235 /* satsub reg1, reg2 */
1240 /* start-sanitize-v850e */
1243 trace_input ("sxb", OP_REG, 0);
1245 State.regs[ OP[0] ] = EXTEND8 (State.regs[ OP[0] ]);
1247 trace_output (OP_REG);
1250 /* end-sanitize-v850e */
1252 unsigned int op0, op1, result, z, s, cy, ov, sat;
1254 trace_input ("satsub", OP_REG_REG, 0);
1256 /* Compute the result. */
1257 op0 = State.regs[ OP[0] ];
1258 op1 = State.regs[ OP[1] ];
1261 /* Compute the condition codes. */
1263 s = (result & 0x80000000);
1265 ov = ((op1 & 0x80000000) != (op0 & 0x80000000)
1266 && (op1 & 0x80000000) != (result & 0x80000000));
1269 /* Store the result and condition codes. */
1270 State.regs[OP[1]] = result;
1271 PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
1272 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
1273 | (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0)
1274 | (sat ? PSW_SAT : 0));
1276 /* Handle saturated results. */
1278 State.regs[OP[1]] = 0x80000000;
1280 State.regs[OP[1]] = 0x7fffffff;
1281 trace_output (OP_REG_REG);
1287 /* satsubi sign_extend(imm16), reg */
1291 unsigned int op0, op1, result, z, s, cy, ov, sat;
1294 trace_input ("satsubi", OP_IMM_REG, 0);
1296 /* Compute the result. */
1297 temp = EXTEND16 (OP[2]);
1299 op1 = State.regs[ OP[0] ];
1302 /* Compute the condition codes. */
1304 s = (result & 0x80000000);
1306 ov = ((op1 & 0x80000000) != (op0 & 0x80000000)
1307 && (op1 & 0x80000000) != (result & 0x80000000));
1310 /* Store the result and condition codes. */
1311 State.regs[OP[1]] = result;
1312 PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
1313 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
1314 | (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0)
1315 | (sat ? PSW_SAT : 0));
1317 /* Handle saturated results. */
1319 State.regs[OP[1]] = 0x80000000;
1321 State.regs[OP[1]] = 0x7fffffff;
1322 trace_output (OP_IMM_REG);
1327 /* satsubr reg,reg */
1331 unsigned int op0, op1, result, z, s, cy, ov, sat;
1333 trace_input ("satsubr", OP_REG_REG, 0);
1335 /* Compute the result. */
1336 op0 = State.regs[ OP[0] ];
1337 op1 = State.regs[ OP[1] ];
1340 /* Compute the condition codes. */
1342 s = (result & 0x80000000);
1343 cy = (result < op0);
1344 ov = ((op1 & 0x80000000) != (op0 & 0x80000000)
1345 && (op1 & 0x80000000) != (result & 0x80000000));
1348 /* Store the result and condition codes. */
1349 State.regs[OP[1]] = result;
1350 PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
1351 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
1352 | (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0)
1353 | (sat ? PSW_SAT : 0));
1355 /* Handle saturated results. */
1357 State.regs[OP[1]] = 0x80000000;
1359 State.regs[OP[1]] = 0x7fffffff;
1360 trace_output (OP_REG_REG);
1369 unsigned int op0, op1, result, z, s;
1371 trace_input ("tst", OP_REG_REG_CMP, 0);
1373 /* Compute the result. */
1374 op0 = State.regs[ OP[0] ];
1375 op1 = State.regs[ OP[1] ];
1378 /* Compute the condition codes. */
1380 s = (result & 0x80000000);
1382 /* Store the condition codes. */
1383 PSW &= ~(PSW_Z | PSW_S | PSW_OV);
1384 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0));
1385 trace_output (OP_REG_REG_CMP);
1394 trace_input ("mov", OP_REG_REG_MOVE, 0);
1396 State.regs[ OP[1] ] = State.regs[ OP[0] ];
1398 trace_output (OP_REG_REG_MOVE);
1403 /* mov sign_extend(imm5), reg */
1408 /* start-sanitize-v850e */
1413 trace_input ("callt", OP_LOAD16, 1);
1418 adr = CTBP + ((OP[3] & 0x3f) << 1);
1420 PC = CTBP + load_mem (adr, 1);
1422 trace_output (OP_LOAD16);
1427 /* end-sanitize-v850e */
1429 int value = SEXT5 (OP[0]);
1431 trace_input ("mov", OP_IMM_REG_MOVE, 0);
1433 State.regs[ OP[1] ] = value;
1435 trace_output (OP_IMM_REG_MOVE);
1441 /* mov imm32, reg1 */
1442 /* movea sign_extend(imm16), reg, reg */
1446 /* start-sanitize-v850e */
1449 trace_input ("mov", OP_IMM_REG, 4);
1451 State.regs[ OP[0] ] = load_mem (PC + 2, 4);
1453 trace_output (OP_IMM_REG);
1458 /* end-sanitize-v850e */
1460 trace_input ("movea", OP_IMM_REG_REG, 0);
1462 State.regs[ OP[1] ] = State.regs[ OP[0] ] + EXTEND16 (OP[2]);
1464 trace_output (OP_IMM_REG_REG);
1470 /* dispose imm5, list12 [, reg1] */
1471 /* movhi imm16, reg, reg */
1475 /* start-sanitize-v850e */
1481 trace_input ("dispose", OP_PUSHPOP1, 0);
1483 SP += (OP[3] & 0x3e) << 1;
1485 /* Load the registers with lower number registers being retrieved from higher addresses. */
1487 if ((OP[3] & (1 << type1_regs[ i ])))
1489 State.regs[ 20 + i ] = load_mem (SP, 4);
1493 if ((OP[3] & 0x1f0000) != 0)
1495 PC = State.regs[ (OP[3] >> 16) & 0x1f];
1499 trace_output (OP_PUSHPOP1);
1502 /* end-sanitize-v850e */
1504 trace_input ("movhi", OP_UIMM_REG_REG, 16);
1506 State.regs[ OP[1] ] = State.regs[ OP[0] ] + (OP[2] << 16);
1508 trace_output (OP_UIMM_REG_REG);
1514 /* sar zero_extend(imm5),reg1 */
1518 unsigned int op0, op1, result, z, s, cy;
1520 trace_input ("sar", OP_IMM_REG, 0);
1522 op1 = State.regs[ OP[1] ];
1523 result = (signed)op1 >> op0;
1525 /* Compute the condition codes. */
1527 s = (result & 0x80000000);
1528 cy = (op1 & (1 << (op0 - 1)));
1530 /* Store the result and condition codes. */
1531 State.regs[ OP[1] ] = result;
1532 PSW &= ~(PSW_Z | PSW_S | PSW_OV | PSW_CY);
1533 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
1534 | (cy ? PSW_CY : 0));
1535 trace_output (OP_IMM_REG);
1540 /* sar reg1, reg2 */
1544 unsigned int op0, op1, result, z, s, cy;
1546 trace_input ("sar", OP_REG_REG, 0);
1548 op0 = State.regs[ OP[0] ] & 0x1f;
1549 op1 = State.regs[ OP[1] ];
1550 result = (signed)op1 >> op0;
1552 /* Compute the condition codes. */
1554 s = (result & 0x80000000);
1555 cy = (op1 & (1 << (op0 - 1)));
1557 /* Store the result and condition codes. */
1558 State.regs[OP[1]] = result;
1559 PSW &= ~(PSW_Z | PSW_S | PSW_OV | PSW_CY);
1560 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
1561 | (cy ? PSW_CY : 0));
1562 trace_output (OP_REG_REG);
1567 /* shl zero_extend(imm5),reg1 */
1571 unsigned int op0, op1, result, z, s, cy;
1573 trace_input ("shl", OP_IMM_REG, 0);
1575 op1 = State.regs[ OP[1] ];
1576 result = op1 << op0;
1578 /* Compute the condition codes. */
1580 s = (result & 0x80000000);
1581 cy = (op1 & (1 << (32 - op0)));
1583 /* Store the result and condition codes. */
1584 State.regs[OP[1]] = result;
1585 PSW &= ~(PSW_Z | PSW_S | PSW_OV | PSW_CY);
1586 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
1587 | (cy ? PSW_CY : 0));
1588 trace_output (OP_IMM_REG);
1593 /* shl reg1, reg2 */
1597 unsigned int op0, op1, result, z, s, cy;
1599 trace_input ("shl", OP_REG_REG, 0);
1600 op0 = State.regs[ OP[0] ] & 0x1f;
1601 op1 = State.regs[ OP[1] ];
1602 result = op1 << op0;
1604 /* Compute the condition codes. */
1606 s = (result & 0x80000000);
1607 cy = (op1 & (1 << (32 - op0)));
1609 /* Store the result and condition codes. */
1610 State.regs[OP[1]] = result;
1611 PSW &= ~(PSW_Z | PSW_S | PSW_OV | PSW_CY);
1612 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
1613 | (cy ? PSW_CY : 0));
1614 trace_output (OP_REG_REG);
1619 /* shr zero_extend(imm5),reg1 */
1623 unsigned int op0, op1, result, z, s, cy;
1625 trace_input ("shr", OP_IMM_REG, 0);
1627 op1 = State.regs[ OP[1] ];
1628 result = op1 >> op0;
1630 /* Compute the condition codes. */
1632 s = (result & 0x80000000);
1633 cy = (op1 & (1 << (op0 - 1)));
1635 /* Store the result and condition codes. */
1636 State.regs[OP[1]] = result;
1637 PSW &= ~(PSW_Z | PSW_S | PSW_OV | PSW_CY);
1638 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
1639 | (cy ? PSW_CY : 0));
1640 trace_output (OP_IMM_REG);
1645 /* shr reg1, reg2 */
1649 unsigned int op0, op1, result, z, s, cy;
1651 trace_input ("shr", OP_REG_REG, 0);
1652 op0 = State.regs[ OP[0] ] & 0x1f;
1653 op1 = State.regs[ OP[1] ];
1654 result = op1 >> op0;
1656 /* Compute the condition codes. */
1658 s = (result & 0x80000000);
1659 cy = (op1 & (1 << (op0 - 1)));
1661 /* Store the result and condition codes. */
1662 State.regs[OP[1]] = result;
1663 PSW &= ~(PSW_Z | PSW_S | PSW_OV | PSW_CY);
1664 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
1665 | (cy ? PSW_CY : 0));
1666 trace_output (OP_REG_REG);
1675 unsigned int op0, op1, result, z, s;
1677 trace_input ("or", OP_REG_REG, 0);
1679 /* Compute the result. */
1680 op0 = State.regs[ OP[0] ];
1681 op1 = State.regs[ OP[1] ];
1684 /* Compute the condition codes. */
1686 s = (result & 0x80000000);
1688 /* Store the result and condition codes. */
1689 State.regs[OP[1]] = result;
1690 PSW &= ~(PSW_Z | PSW_S | PSW_OV);
1691 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0));
1692 trace_output (OP_REG_REG);
1697 /* ori zero_extend(imm16), reg, reg */
1701 unsigned int op0, op1, result, z, s;
1703 trace_input ("ori", OP_UIMM_REG_REG, 0);
1705 op1 = State.regs[ OP[0] ];
1708 /* Compute the condition codes. */
1710 s = (result & 0x80000000);
1712 /* Store the result and condition codes. */
1713 State.regs[OP[1]] = result;
1714 PSW &= ~(PSW_Z | PSW_S | PSW_OV);
1715 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0));
1716 trace_output (OP_UIMM_REG_REG);
1725 unsigned int op0, op1, result, z, s;
1727 trace_input ("and", OP_REG_REG, 0);
1729 /* Compute the result. */
1730 op0 = State.regs[ OP[0] ];
1731 op1 = State.regs[ OP[1] ];
1734 /* Compute the condition codes. */
1736 s = (result & 0x80000000);
1738 /* Store the result and condition codes. */
1739 State.regs[OP[1]] = result;
1740 PSW &= ~(PSW_Z | PSW_S | PSW_OV);
1741 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0));
1742 trace_output (OP_REG_REG);
1747 /* andi zero_extend(imm16), reg, reg */
1751 unsigned int result, z;
1753 trace_input ("andi", OP_UIMM_REG_REG, 0);
1755 result = OP[2] & State.regs[ OP[0] ];
1757 /* Compute the condition codes. */
1760 /* Store the result and condition codes. */
1761 State.regs[ OP[1] ] = result;
1763 PSW &= ~(PSW_Z | PSW_S | PSW_OV);
1764 PSW |= (z ? PSW_Z : 0);
1766 trace_output (OP_UIMM_REG_REG);
1775 unsigned int op0, op1, result, z, s;
1777 trace_input ("xor", OP_REG_REG, 0);
1779 /* Compute the result. */
1780 op0 = State.regs[ OP[0] ];
1781 op1 = State.regs[ OP[1] ];
1784 /* Compute the condition codes. */
1786 s = (result & 0x80000000);
1788 /* Store the result and condition codes. */
1789 State.regs[OP[1]] = result;
1790 PSW &= ~(PSW_Z | PSW_S | PSW_OV);
1791 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0));
1792 trace_output (OP_REG_REG);
1797 /* xori zero_extend(imm16), reg, reg */
1801 unsigned int op0, op1, result, z, s;
1803 trace_input ("xori", OP_UIMM_REG_REG, 0);
1805 op1 = State.regs[ OP[0] ];
1808 /* Compute the condition codes. */
1810 s = (result & 0x80000000);
1812 /* Store the result and condition codes. */
1813 State.regs[OP[1]] = result;
1814 PSW &= ~(PSW_Z | PSW_S | PSW_OV);
1815 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0));
1816 trace_output (OP_UIMM_REG_REG);
1821 /* not reg1, reg2 */
1825 unsigned int op0, result, z, s;
1827 trace_input ("not", OP_REG_REG_MOVE, 0);
1828 /* Compute the result. */
1829 op0 = State.regs[ OP[0] ];
1832 /* Compute the condition codes. */
1834 s = (result & 0x80000000);
1836 /* Store the result and condition codes. */
1837 State.regs[OP[1]] = result;
1838 PSW &= ~(PSW_Z | PSW_S | PSW_OV);
1839 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0));
1840 trace_output (OP_REG_REG_MOVE);
1849 unsigned int op0, op1, op2;
1852 trace_input ("set1", OP_BIT, 0);
1853 op0 = State.regs[ OP[0] ];
1855 temp = EXTEND16 (OP[2]);
1857 temp = load_mem (op0 + op2, 1);
1859 if ((temp & (1 << op1)) == 0)
1862 store_mem (op0 + op2, 1, temp);
1863 trace_output (OP_BIT);
1872 unsigned int op0, op1, op2;
1875 trace_input ("not1", OP_BIT, 0);
1876 op0 = State.regs[ OP[0] ];
1878 temp = EXTEND16 (OP[2]);
1880 temp = load_mem (op0 + op2, 1);
1882 if ((temp & (1 << op1)) == 0)
1885 store_mem (op0 + op2, 1, temp);
1886 trace_output (OP_BIT);
1895 unsigned int op0, op1, op2;
1898 trace_input ("clr1", OP_BIT, 0);
1899 op0 = State.regs[ OP[0] ];
1901 temp = EXTEND16 (OP[2]);
1903 temp = load_mem (op0 + op2, 1);
1905 if ((temp & (1 << op1)) == 0)
1907 temp &= ~(1 << op1);
1908 store_mem (op0 + op2, 1, temp);
1909 trace_output (OP_BIT);
1918 unsigned int op0, op1, op2;
1921 trace_input ("tst1", OP_BIT, 0);
1922 op0 = State.regs[ OP[0] ];
1924 temp = EXTEND16 (OP[2]);
1926 temp = load_mem (op0 + op2, 1);
1928 if ((temp & (1 << op1)) == 0)
1930 trace_output (OP_BIT);
1939 sim_engine_halt (simulator, STATE_CPU (simulator, 0), NULL, PC,
1940 sim_stopped, SIGTRAP);
1948 trace_input ("di", OP_NONE, 0);
1950 trace_output (OP_NONE);
1959 trace_input ("ei", OP_NONE, 0);
1961 trace_output (OP_NONE);
1970 trace_input ("halt", OP_NONE, 0);
1971 /* FIXME this should put processor into a mode where NMI still handled */
1972 trace_output (OP_NONE);
1973 sim_engine_halt (simulator, STATE_CPU (simulator, 0), NULL, PC,
1974 sim_stopped, SIGTRAP);
1982 trace_input ("reti", OP_NONE, 0);
1983 trace_output (OP_NONE);
1985 /* Restore for NMI if only NP on, otherwise is interrupt or exception. */
1986 if ((PSW & (PSW_NP | PSW_EP)) == PSW_NP)
2004 trace_input ("trap", OP_TRAP, 0);
2005 trace_output (OP_TRAP);
2007 /* Trap 31 is used for simulating OS I/O functions */
2011 int save_errno = errno;
2014 /* Registers passed to trap 0 */
2016 #define FUNC State.regs[6] /* function number, return value */
2017 #define PARM1 State.regs[7] /* optional parm 1 */
2018 #define PARM2 State.regs[8] /* optional parm 2 */
2019 #define PARM3 State.regs[9] /* optional parm 3 */
2021 /* Registers set by trap 0 */
2023 #define RETVAL State.regs[10] /* return value */
2024 #define RETERR State.regs[11] /* return error code */
2026 /* Turn a pointer in a register into a pointer into real memory. */
2028 #define MEMPTR(x) (map (x))
2045 char *path = fetch_str (simulator, PARM1);
2046 char **argv = fetch_argv (simulator, PARM2);
2047 char **envp = fetch_argv (simulator, PARM3);
2048 RETVAL = execve (path, argv, envp);
2061 char *path = fetch_str (simulator, PARM1);
2062 char **argv = fetch_argv (simulator, PARM2);
2063 RETVAL = execv (path, argv);
2079 RETVAL = pipe (host_fd);
2080 SW (buf, host_fd[0]);
2081 buf += sizeof(uint16);
2082 SW (buf, host_fd[1]);
2094 RETVAL = wait (&status);
2104 char *buf = zalloc (PARM3);
2105 RETVAL = sim_io_read (simulator, PARM1, buf, PARM3);
2106 sim_write (simulator, PARM2, buf, PARM3);
2115 char *buf = zalloc (PARM3);
2116 sim_read (simulator, PARM2, buf, PARM3);
2118 RETVAL = sim_io_write_stdout (simulator, buf, PARM3);
2120 RETVAL = sim_io_write (simulator, PARM1, buf, PARM3);
2128 RETVAL = sim_io_lseek (simulator, PARM1, PARM2, PARM3);
2134 RETVAL = sim_io_close (simulator, PARM1);
2141 char *buf = fetch_str (simulator, PARM1);
2142 RETVAL = sim_io_open (simulator, buf, PARM2);
2150 if ((PARM1 & 0xffff0000) == 0xdead0000 && (PARM1 & 0xffff) != 0)
2151 /* get signal encoded by kill */
2152 sim_engine_halt (simulator, STATE_CPU (simulator, 0), NULL, PC,
2153 sim_signalled, PARM1 & 0xffff);
2154 else if (PARM1 == 0xdead)
2156 sim_engine_halt (simulator, STATE_CPU (simulator, 0), NULL, PC,
2157 sim_exited, SIGABRT);
2159 /* PARM1 has exit status */
2160 sim_engine_halt (simulator, STATE_CPU (simulator, 0), NULL, PC,
2165 #if !defined(__GO32__) && !defined(_WIN32)
2167 case SYS_stat: /* added at hmsi */
2168 /* stat system call */
2170 struct stat host_stat;
2172 char *path = fetch_str (simulator, PARM1);
2174 RETVAL = stat (path, &host_stat);
2179 /* Just wild-assed guesses. */
2180 store_mem (buf, 2, host_stat.st_dev);
2181 store_mem (buf + 2, 2, host_stat.st_ino);
2182 store_mem (buf + 4, 4, host_stat.st_mode);
2183 store_mem (buf + 8, 2, host_stat.st_nlink);
2184 store_mem (buf + 10, 2, host_stat.st_uid);
2185 store_mem (buf + 12, 2, host_stat.st_gid);
2186 store_mem (buf + 14, 2, host_stat.st_rdev);
2187 store_mem (buf + 16, 4, host_stat.st_size);
2188 store_mem (buf + 20, 4, host_stat.st_atime);
2189 store_mem (buf + 28, 4, host_stat.st_mtime);
2190 store_mem (buf + 36, 4, host_stat.st_ctime);
2200 char *path = fetch_str (simulator, PARM1);
2201 RETVAL = chown (path, PARM2, PARM3);
2212 char *path = fetch_str (simulator, PARM1);
2213 RETVAL = chmod (path, PARM2);
2225 RETVAL = time (&now);
2226 store_mem (PARM1, 4, now);
2232 #if !defined(__GO32__) && !defined(_WIN32)
2237 RETVAL = times (&tms);
2238 store_mem (PARM1, 4, tms.tms_utime);
2239 store_mem (PARM1 + 4, 4, tms.tms_stime);
2240 store_mem (PARM1 + 8, 4, tms.tms_cutime);
2241 store_mem (PARM1 + 12, 4, tms.tms_cstime);
2247 #ifdef SYS_gettimeofday
2248 #if !defined(__GO32__) && !defined(_WIN32)
2249 case SYS_gettimeofday:
2253 RETVAL = gettimeofday (&t, &tz);
2254 store_mem (PARM1, 4, t.tv_sec);
2255 store_mem (PARM1 + 4, 4, t.tv_usec);
2256 store_mem (PARM2, 4, tz.tz_minuteswest);
2257 store_mem (PARM2 + 4, 4, tz.tz_dsttime);
2267 /* Cast the second argument to void *, to avoid type mismatch
2268 if a prototype is present. */
2269 sim_io_error (simulator, "Utime not supported");
2270 /* RETVAL = utime (path, (void *) MEMPTR (PARM2)); */
2285 { /* Trap 0 -> 30 */
2290 ECR |= 0x40 + OP[0];
2291 /* Flag that we are now doing exception processing. */
2292 PSW |= PSW_EP | PSW_ID;
2293 PC = ((OP[0] < 0x10) ? 0x40 : 0x50) - 4;
2303 trace_input ("ldsr", OP_LDSR, 0);
2305 State.sregs[ OP[1] ] = State.regs[ OP[0] ];
2307 trace_output (OP_LDSR);
2316 trace_input ("stsr", OP_STSR, 0);
2318 State.regs[ OP[1] ] = State.sregs[ OP[0] ];
2320 trace_output (OP_STSR);
2325 /* start-sanitize-v850e */
2326 /* tst1 reg2, [reg1] */
2332 trace_input ("tst1", OP_BIT, 1);
2334 temp = load_mem (State.regs[ OP[0] ], 1);
2337 if ((temp & (1 << State.regs[ OP[1] & 0x7 ])) == 0)
2340 trace_output (OP_BIT);
2345 /* end-sanitize-v850e */
2346 /* start-sanitize-v850e */
2347 /* mulu reg1, reg2, reg3 */
2351 trace_input ("mulu", OP_REG_REG_REG, 0);
2353 Multiply64 (false, State.regs[ OP[0] ]);
2355 trace_output (OP_REG_REG_REG);
2360 /* end-sanitize-v850e */
2361 /* start-sanitize-v850e */
2363 #define BIT_CHANGE_OP( name, binop ) \
2365 unsigned int temp; \
2367 trace_input (name, OP_BIT_CHANGE, 0); \
2369 bit = 1 << State.regs[ OP[1] & 0x7 ]; \
2370 temp = load_mem (State.regs[ OP[0] ], 1); \
2373 if ((temp & bit) == 0) \
2377 store_mem (State.regs[ OP[0] ], 1, temp); \
2379 trace_output (OP_BIT_CHANGE); \
2383 /* clr1 reg2, [reg1] */
2387 BIT_CHANGE_OP ("clr1", &= ~ );
2390 /* not1 reg2, [reg1] */
2394 BIT_CHANGE_OP ("not1", ^= );
2401 BIT_CHANGE_OP ("set1", |= );
2408 trace_input ("sasf", OP_EX1, 0);
2410 State.regs[ OP[1] ] = (State.regs[ OP[1] ] << 1) | condition_met (OP[0]);
2412 trace_output (OP_EX1);
2416 /* end-sanitize-v850e */
2417 /* start-sanitize-v850eq */
2418 /* This function is courtesy of Sugimoto at NEC, via Seow Tan (Soew_Tan@el.nec.com) */
2423 unsigned long int als,
2424 unsigned long int sfi,
2425 unsigned long int * quotient_ptr,
2426 unsigned long int * remainder_ptr,
2427 boolean * overflow_ptr
2430 unsigned long ald = sfi >> (N - 1);
2431 unsigned long alo = als;
2436 unsigned int R1 = 1;
2437 unsigned int DBZ = (als == 0) ? 1 : 0;
2438 unsigned long alt = Q ? ~als : als;
2441 alo = ald + alt + Q;
2442 C = (((alt >> 31) & (ald >> 31))
2443 | (((alt >> 31) ^ (ald >> 31)) & (~alo >> 31)));
2446 R1 = (alo == 0) ? 0 : (R1 & Q);
2447 if ((S ^ (alo>>31)) && !C)
2452 sfi = (sfi << (32-N+1)) | Q;
2453 ald = (alo << 1) | (sfi >> 31);
2455 /* 2nd - N-1th Loop */
2456 for (i = 2; i < N; i++)
2458 alt = Q ? ~als : als;
2459 alo = ald + alt + Q;
2460 C = (((alt >> 31) & (ald >> 31))
2461 | (((alt >> 31) ^ (ald >> 31)) & (~alo >> 31)));
2464 R1 = (alo == 0) ? 0 : (R1 & Q);
2465 if ((S ^ (alo>>31)) && !C && !DBZ)
2470 sfi = (sfi << 1) | Q;
2471 ald = (alo << 1) | (sfi >> 31);
2475 alt = Q ? ~als : als;
2476 alo = ald + alt + Q;
2477 C = (((alt >> 31) & (ald >> 31))
2478 | (((alt >> 31) ^ (ald >> 31)) & (~alo >> 31)));
2481 R1 = (alo == 0) ? 0 : (R1 & Q);
2482 if ((S ^ (alo>>31)) && !C)
2487 * quotient_ptr = (sfi << 1) | Q;
2488 * remainder_ptr = Q ? alo : (alo + als);
2489 * overflow_ptr = DBZ | R1;
2492 /* This function is courtesy of Sugimoto at NEC, via Seow Tan (Soew_Tan@el.nec.com) */
2497 unsigned long int als,
2498 unsigned long int sfi,
2499 signed long int * quotient_ptr,
2500 signed long int * remainder_ptr,
2501 boolean * overflow_ptr
2504 unsigned long ald = (signed long) sfi >> (N - 1);
2505 unsigned long alo = als;
2506 unsigned int SS = als >> 31;
2507 unsigned int SD = sfi >> 31;
2508 unsigned int R1 = 1;
2510 unsigned int DBZ = als == 0 ? 1 : 0;
2511 unsigned int Q = ~(SS ^ SD) & 1;
2515 unsigned long alt = Q ? ~als : als;
2520 alo = ald + alt + Q;
2521 C = (((alt >> 31) & (ald >> 31))
2522 | (((alt >> 31) ^ (ald >> 31)) & (~alo >> 31)));
2524 R1 = (alo == 0) ? 0 : (R1 & (Q ^ (SS ^ SD)));
2526 sfi = (sfi << (32-N+1)) | Q;
2527 ald = (alo << 1) | (sfi >> 31);
2528 if ((alo >> 31) ^ (ald >> 31))
2533 /* 2nd - N-1th Loop */
2535 for (i = 2; i < N; i++)
2537 alt = Q ? ~als : als;
2538 alo = ald + alt + Q;
2539 C = (((alt >> 31) & (ald >> 31))
2540 | (((alt >> 31) ^ (ald >> 31)) & (~alo >> 31)));
2542 R1 = (alo == 0) ? 0 : (R1 & (Q ^ (SS ^ SD)));
2544 sfi = (sfi << 1) | Q;
2545 ald = (alo << 1) | (sfi >> 31);
2546 if ((alo >> 31) ^ (ald >> 31))
2553 alt = Q ? ~als : als;
2554 alo = ald + alt + Q;
2555 C = (((alt >> 31) & (ald >> 31))
2556 | (((alt >> 31) ^ (ald >> 31)) & (~alo >> 31)));
2558 R1 = (alo == 0) ? 0 : (R1 & (Q ^ (SS ^ SD)));
2559 sfi = (sfi << (32-N+1));
2565 alt = Q ? ~als : als;
2566 alo = ald + alt + Q;
2568 R1 = R1 & ((~alo >> 31) ^ SD);
2569 if ((alo != 0) && ((Q ^ (SS ^ SD)) ^ R1)) alo = ald;
2571 ald = sfi = (long) ((sfi >> 1) | (SS ^ SD) << 31) >> (32-N-1) | Q;
2573 ald = sfi = sfi | Q;
2575 OV = DBZ | ((alo == 0) ? 0 : R1);
2577 * remainder_ptr = alo;
2580 if (((alo != 0) && ((SS ^ SD) ^ R1))
2581 || ((alo == 0) && (SS ^ R1)))
2586 OV = (DBZ | R1) ? OV : ((alo >> 31) & (~ald >> 31));
2588 * quotient_ptr = alo;
2589 * overflow_ptr = OV;
2592 /* sdivun imm5, reg1, reg2, reg3 */
2596 unsigned long int quotient;
2597 unsigned long int remainder;
2598 unsigned long int divide_by;
2599 unsigned long int divide_this;
2600 boolean overflow = false;
2603 trace_input ("sdivun", OP_IMM_REG_REG_REG, 0);
2605 imm5 = 32 - ((OP[3] & 0x3c0000) >> 17);
2607 divide_by = State.regs[ OP[0] ];
2608 divide_this = State.regs[ OP[1] ] << imm5;
2610 divun (imm5, divide_by, divide_this, & quotient, & remainder, & overflow);
2612 State.regs[ OP[1] ] = quotient;
2613 State.regs[ OP[2] >> 11 ] = remainder;
2615 /* Set condition codes. */
2616 PSW &= ~(PSW_Z | PSW_S | PSW_OV);
2618 if (overflow) PSW |= PSW_OV;
2619 if (quotient == 0) PSW |= PSW_Z;
2620 if (quotient & 0x80000000) PSW |= PSW_S;
2622 trace_output (OP_IMM_REG_REG_REG);
2627 /* sdivn imm5, reg1, reg2, reg3 */
2631 signed long int quotient;
2632 signed long int remainder;
2633 signed long int divide_by;
2634 signed long int divide_this;
2635 boolean overflow = false;
2638 trace_input ("sdivn", OP_IMM_REG_REG_REG, 0);
2640 imm5 = 32 - ((OP[3] & 0x3c0000) >> 17);
2642 divide_by = State.regs[ OP[0] ];
2643 divide_this = State.regs[ OP[1] ] << imm5;
2645 divn (imm5, divide_by, divide_this, & quotient, & remainder, & overflow);
2647 State.regs[ OP[1] ] = quotient;
2648 State.regs[ OP[2] >> 11 ] = remainder;
2650 /* Set condition codes. */
2651 PSW &= ~(PSW_Z | PSW_S | PSW_OV);
2653 if (overflow) PSW |= PSW_OV;
2654 if (quotient == 0) PSW |= PSW_Z;
2655 if (quotient < 0) PSW |= PSW_S;
2657 trace_output (OP_IMM_REG_REG_REG);
2662 /* sdivhun imm5, reg1, reg2, reg3 */
2666 unsigned long int quotient;
2667 unsigned long int remainder;
2668 unsigned long int divide_by;
2669 unsigned long int divide_this;
2670 boolean overflow = false;
2673 trace_input ("sdivhun", OP_IMM_REG_REG_REG, 0);
2675 imm5 = 32 - ((OP[3] & 0x3c0000) >> 17);
2677 divide_by = State.regs[ OP[0] ] & 0xffff;
2678 divide_this = State.regs[ OP[1] ] << imm5;
2680 divun (imm5, divide_by, divide_this, & quotient, & remainder, & overflow);
2682 State.regs[ OP[1] ] = quotient;
2683 State.regs[ OP[2] >> 11 ] = remainder;
2685 /* Set condition codes. */
2686 PSW &= ~(PSW_Z | PSW_S | PSW_OV);
2688 if (overflow) PSW |= PSW_OV;
2689 if (quotient == 0) PSW |= PSW_Z;
2690 if (quotient & 0x80000000) PSW |= PSW_S;
2692 trace_output (OP_IMM_REG_REG_REG);
2697 /* sdivhn imm5, reg1, reg2, reg3 */
2701 signed long int quotient;
2702 signed long int remainder;
2703 signed long int divide_by;
2704 signed long int divide_this;
2705 boolean overflow = false;
2708 trace_input ("sdivhn", OP_IMM_REG_REG_REG, 0);
2710 imm5 = 32 - ((OP[3] & 0x3c0000) >> 17);
2712 divide_by = EXTEND16 (State.regs[ OP[0] ]);
2713 divide_this = State.regs[ OP[1] ] << imm5;
2715 divn (imm5, divide_by, divide_this, & quotient, & remainder, & overflow);
2717 State.regs[ OP[1] ] = quotient;
2718 State.regs[ OP[2] >> 11 ] = remainder;
2720 /* Set condition codes. */
2721 PSW &= ~(PSW_Z | PSW_S | PSW_OV);
2723 if (overflow) PSW |= PSW_OV;
2724 if (quotient == 0) PSW |= PSW_Z;
2725 if (quotient < 0) PSW |= PSW_S;
2727 trace_output (OP_IMM_REG_REG_REG);
2732 /* end-sanitize-v850eq */
2733 /* start-sanitize-v850e */
2734 /* divu reg1, reg2, reg3 */
2738 unsigned long int quotient;
2739 unsigned long int remainder;
2740 unsigned long int divide_by;
2741 unsigned long int divide_this;
2742 boolean overflow = false;
2744 trace_input ("divu", OP_REG_REG_REG, 0);
2746 /* Compute the result. */
2748 divide_by = State.regs[ OP[0] ];
2749 divide_this = State.regs[ OP[1] ];
2757 State.regs[ OP[1] ] = quotient = divide_this / divide_by;
2758 State.regs[ OP[2] >> 11 ] = remainder = divide_this % divide_by;
2760 /* Set condition codes. */
2761 PSW &= ~(PSW_Z | PSW_S | PSW_OV);
2763 if (overflow) PSW |= PSW_OV;
2764 if (quotient == 0) PSW |= PSW_Z;
2765 if (quotient & 0x80000000) PSW |= PSW_S;
2767 trace_output (OP_REG_REG_REG);
2772 /* end-sanitize-v850e */
2773 /* start-sanitize-v850e */
2774 /* div reg1, reg2, reg3 */
2778 signed long int quotient;
2779 signed long int remainder;
2780 signed long int divide_by;
2781 signed long int divide_this;
2782 boolean overflow = false;
2784 trace_input ("div", OP_REG_REG_REG, 0);
2786 /* Compute the result. */
2788 divide_by = State.regs[ OP[0] ];
2789 divide_this = State.regs[ OP[1] ];
2791 if (divide_by == 0 || (divide_by == -1 && divide_this == (1 << 31)))
2797 State.regs[ OP[1] ] = quotient = divide_this / divide_by;
2798 State.regs[ OP[2] >> 11 ] = remainder = divide_this % divide_by;
2800 /* Set condition codes. */
2801 PSW &= ~(PSW_Z | PSW_S | PSW_OV);
2803 if (overflow) PSW |= PSW_OV;
2804 if (quotient == 0) PSW |= PSW_Z;
2805 if (quotient < 0) PSW |= PSW_S;
2807 trace_output (OP_REG_REG_REG);
2812 /* end-sanitize-v850e */
2813 /* start-sanitize-v850e */
2814 /* divhu reg1, reg2, reg3 */
2818 unsigned long int quotient;
2819 unsigned long int remainder;
2820 unsigned long int divide_by;
2821 unsigned long int divide_this;
2822 boolean overflow = false;
2824 trace_input ("divhu", OP_REG_REG_REG, 0);
2826 /* Compute the result. */
2828 divide_by = State.regs[ OP[0] ] & 0xffff;
2829 divide_this = State.regs[ OP[1] ];
2837 State.regs[ OP[1] ] = quotient = divide_this / divide_by;
2838 State.regs[ OP[2] >> 11 ] = remainder = divide_this % divide_by;
2840 /* Set condition codes. */
2841 PSW &= ~(PSW_Z | PSW_S | PSW_OV);
2843 if (overflow) PSW |= PSW_OV;
2844 if (quotient == 0) PSW |= PSW_Z;
2845 if (quotient & 0x80000000) PSW |= PSW_S;
2847 trace_output (OP_REG_REG_REG);
2852 /* end-sanitize-v850e */
2853 /* start-sanitize-v850e */
2854 /* divh reg1, reg2, reg3 */
2858 signed long int quotient;
2859 signed long int remainder;
2860 signed long int divide_by;
2861 signed long int divide_this;
2862 boolean overflow = false;
2864 trace_input ("divh", OP_REG_REG_REG, 0);
2866 /* Compute the result. */
2868 divide_by = State.regs[ OP[0] ];
2869 divide_this = EXTEND16 (State.regs[ OP[1] ]);
2871 if (divide_by == 0 || (divide_by == -1 && divide_this == (1 << 31)))
2877 State.regs[ OP[1] ] = quotient = divide_this / divide_by;
2878 State.regs[ OP[2] >> 11 ] = remainder = divide_this % divide_by;
2880 /* Set condition codes. */
2881 PSW &= ~(PSW_Z | PSW_S | PSW_OV);
2883 if (overflow) PSW |= PSW_OV;
2884 if (quotient == 0) PSW |= PSW_Z;
2885 if (quotient < 0) PSW |= PSW_S;
2887 trace_output (OP_REG_REG_REG);
2892 /* end-sanitize-v850e */
2893 /* start-sanitize-v850e */
2894 /* mulu imm9, reg2, reg3 */
2898 trace_input ("mulu", OP_IMM_REG_REG, 0);
2900 Multiply64 (false, (OP[3] & 0x1f) | ((OP[3] >> 13) & 0x1e0));
2902 trace_output (OP_IMM_REG_REG);
2907 /* end-sanitize-v850e */
2908 /* start-sanitize-v850e */
2909 /* mul imm9, reg2, reg3 */
2913 trace_input ("mul", OP_IMM_REG_REG, 0);
2915 Multiply64 (true, (OP[3] & 0x1f) | ((OP[3] >> 13) & 0x1e0));
2917 trace_output (OP_IMM_REG_REG);
2922 /* end-sanitize-v850e */
2923 /* start-sanitize-v850e */
2924 /* cmov imm5, reg2, reg3 */
2928 trace_input ("cmov", OP_IMM_REG_REG, 0);
2930 State.regs[ OP[2] >> 11 ] = condition_met (OP[0]) ? SEXT5( OP[0] ) : State.regs[ OP[1] ];
2932 trace_output (OP_IMM_REG_REG);
2938 /* end-sanitize-v850e */
2939 /* start-sanitize-v850e */
2944 trace_input ("ctret", OP_NONE, 0);
2949 trace_output (OP_NONE);
2954 /* end-sanitize-v850e */
2955 /* start-sanitize-v850e */
2960 unsigned long value;
2962 trace_input ("hsw", OP_REG_REG3, 0);
2964 value = State.regs[ OP[ 1 ] ];
2966 value |= (State.regs[ OP[ 1 ] ] << 16);
2968 State.regs[ OP[2] >> 11 ] = value;
2970 PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
2972 if (value == 0) PSW |= PSW_Z;
2973 if (value & 0x80000000) PSW |= PSW_S;
2974 if (((value & 0xffff) == 0) || (value & 0xffff0000) == 0) PSW |= PSW_CY;
2976 trace_output (OP_REG_REG3);
2981 /* end-sanitize-v850e */
2982 /* start-sanitize-v850e */
2983 #define WORDHASNULLBYTE(x) (((x) - 0x01010101) & ~(x)&0x80808080)
2989 unsigned long value;
2991 trace_input ("bsw", OP_REG_REG3, 0);
2993 value = State.regs[ OP[ 1 ] ];
2995 value |= (State.regs[ OP[ 1 ] ] << 24);
2996 value |= ((State.regs[ OP[ 1 ] ] << 8) & 0x00ff0000);
2997 value |= ((State.regs[ OP[ 1 ] ] >> 8) & 0x0000ff00);
2999 State.regs[ OP[2] >> 11 ] = value;
3001 PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
3003 if (value == 0) PSW |= PSW_Z;
3004 if (value & 0x80000000) PSW |= PSW_S;
3005 if (WORDHASNULLBYTE (value)) PSW |= PSW_CY;
3007 trace_output (OP_REG_REG3);
3012 /* end-sanitize-v850e */
3013 /* start-sanitize-v850e */
3018 unsigned long value;
3020 trace_input ("bsh", OP_REG_REG3, 0);
3022 value = State.regs[ OP[ 1 ] ];
3024 value |= ((State.regs[ OP[ 1 ] ] << 8) & 0xff00ff00);
3025 value |= ((State.regs[ OP[ 1 ] ] >> 8) & 0x000000ff);
3027 State.regs[ OP[2] >> 11 ] = value;
3029 PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
3031 if (value == 0) PSW |= PSW_Z;
3032 if (value & 0x80000000) PSW |= PSW_S;
3033 if (((value & 0xff) == 0) || (value & 0x00ff) == 0) PSW |= PSW_CY;
3035 trace_output (OP_REG_REG3);
3040 /* end-sanitize-v850e */
3041 /* start-sanitize-v850e */
3048 trace_input ("ld.hu", OP_LOAD32, 2);
3050 adr = State.regs[ OP[0] ] + EXTEND16 (OP[2] & ~1);
3053 State.regs[ OP[1] ] = load_mem (adr, 2);
3055 trace_output (OP_LOAD32);
3060 /* end-sanitize-v850e */
3061 /* start-sanitize-v850e */
3068 trace_input ("ld.bu", OP_LOAD32, 1);
3070 adr = (State.regs[ OP[0] ]
3071 + (EXTEND16 (OP[2] & ~1) | ((OP[3] >> 5) & 1)));
3073 State.regs[ OP[1] ] = load_mem (adr, 1);
3075 trace_output (OP_LOAD32);
3080 /* prepare list12, imm5, imm32 */
3086 trace_input ("prepare", OP_PUSHPOP1, 0);
3088 /* Store the registers with lower number registers being placed at higher addresses. */
3089 for (i = 0; i < 12; i++)
3090 if ((OP[3] & (1 << type1_regs[ i ])))
3093 store_mem (SP, 4, State.regs[ 20 + i ]);
3096 SP -= (OP[3] & 0x3e) << 1;
3098 EP = load_mem (PC + 4, 4);
3100 trace_output (OP_PUSHPOP1);
3105 /* prepare list12, imm5, imm16-32 */
3111 trace_input ("prepare", OP_PUSHPOP1, 0);
3113 /* Store the registers with lower number registers being placed at higher addresses. */
3114 for (i = 0; i < 12; i++)
3115 if ((OP[3] & (1 << type1_regs[ i ])))
3118 store_mem (SP, 4, State.regs[ 20 + i ]);
3121 SP -= (OP[3] & 0x3e) << 1;
3123 EP = load_mem (PC + 4, 2) << 16;
3125 trace_output (OP_PUSHPOP1);
3130 /* prepare list12, imm5, imm16 */
3136 trace_input ("prepare", OP_PUSHPOP1, 0);
3138 /* Store the registers with lower number registers being placed at higher addresses. */
3139 for (i = 0; i < 12; i++)
3140 if ((OP[3] & (1 << type1_regs[ i ])))
3143 store_mem (SP, 4, State.regs[ 20 + i ]);
3146 SP -= (OP[3] & 0x3e) << 1;
3148 EP = EXTEND16 (load_mem (PC + 4, 2));
3150 trace_output (OP_PUSHPOP1);
3155 /* prepare list12, imm5, sp */
3161 trace_input ("prepare", OP_PUSHPOP1, 0);
3163 /* Store the registers with lower number registers being placed at higher addresses. */
3164 for (i = 0; i < 12; i++)
3165 if ((OP[3] & (1 << type1_regs[ i ])))
3168 store_mem (SP, 4, State.regs[ 20 + i ]);
3171 SP -= (OP[3] & 0x3e) << 1;
3175 trace_output (OP_PUSHPOP1);
3180 /* end-sanitize-v850e */
3181 /* start-sanitize-v850e */
3186 unsigned long result;
3188 result = load_mem (State.regs[30] + ((OP[3] & 0xf) << 1), 2);
3190 /* start-sanitize-v850eq */
3193 trace_input ("sld.h", OP_LOAD16, 2);
3194 State.regs[ OP[1] ] = EXTEND16 (result);
3198 /* end-sanitize-v850eq */
3199 trace_input ("sld.hu", OP_LOAD16, 2);
3201 State.regs[ OP[1] ] = result;
3202 /* start-sanitize-v850eq */
3204 /* end-sanitize-v850eq */
3206 trace_output (OP_LOAD16);
3211 /* end-sanitize-v850e */
3212 /* start-sanitize-v850e */
3213 /* cmov reg1, reg2, reg3 */
3217 trace_input ("cmov", OP_REG_REG_REG, 0);
3219 State.regs[ OP[2] >> 11 ] = condition_met (OP[0]) ? State.regs[ OP[0] ] : State.regs[ OP[1] ];
3221 trace_output (OP_REG_REG_REG);
3226 /* end-sanitize-v850e */
3227 /* start-sanitize-v850e */
3228 /* mul reg1, reg2, reg3 */
3232 trace_input ("mul", OP_REG_REG_REG, 0);
3234 Multiply64 (true, State.regs[ OP[0] ]);
3236 trace_output (OP_REG_REG_REG);
3241 /* end-sanitize-v850e */
3242 /* start-sanitize-v850eq */
3250 trace_input ("popmh", OP_PUSHPOP2, 0);
3252 if (OP[3] & (1 << 19))
3254 if ((PSW & PSW_NP) && ((PSW & PSW_EP) == 0))
3256 FEPSW = load_mem ( SP & ~ 3, 4);
3257 FEPC = load_mem ((SP + 4) & ~ 3, 4);
3261 EIPSW = load_mem ( SP & ~ 3, 4);
3262 EIPC = load_mem ((SP + 4) & ~ 3, 4);
3268 /* Load the registers with lower number registers being retrieved from higher addresses. */
3270 if ((OP[3] & (1 << type2_regs[ i ])))
3272 State.regs[ i + 16 ] = load_mem (SP & ~ 3, 4);
3276 trace_output (OP_PUSHPOP2);
3287 trace_input ("popml", OP_PUSHPOP3, 0);
3289 if (OP[3] & (1 << 19))
3291 if ((PSW & PSW_NP) && ((PSW & PSW_EP) == 0))
3293 FEPSW = load_mem ( SP & ~ 3, 4);
3294 FEPC = load_mem ((SP + 4) & ~ 3, 4);
3298 EIPSW = load_mem ( SP & ~ 3, 4);
3299 EIPC = load_mem ((SP + 4) & ~ 3, 4);
3305 if (OP[3] & (1 << 3))
3307 PSW = load_mem (SP & ~ 3, 4);
3311 /* Load the registers with lower number registers being retrieved from higher addresses. */
3313 if ((OP[3] & (1 << type3_regs[ i ])))
3315 State.regs[ i + 1 ] = load_mem (SP & ~ 3, 4);
3319 trace_output (OP_PUSHPOP2);
3330 trace_input ("pushmh", OP_PUSHPOP2, 0);
3332 /* Store the registers with lower number registers being placed at higher addresses. */
3333 for (i = 0; i < 16; i++)
3334 if ((OP[3] & (1 << type2_regs[ i ])))
3337 store_mem (SP & ~ 3, 4, State.regs[ i + 16 ]);
3340 if (OP[3] & (1 << 19))
3344 if ((PSW & PSW_NP) && ((PSW & PSW_EP) == 0))
3346 store_mem ((SP + 4) & ~ 3, 4, FEPC);
3347 store_mem ( SP & ~ 3, 4, FEPSW);
3351 store_mem ((SP + 4) & ~ 3, 4, EIPC);
3352 store_mem ( SP & ~ 3, 4, EIPSW);
3356 trace_output (OP_PUSHPOP2);
3361 /* end-sanitize-v850eq */