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"
35 #include "libiberty.h"
38 #if !defined(__GO32__) && !defined(_WIN32)
40 #include <sys/times.h>
44 /* start-sanitize-v850e */
45 /* This is an array of the bit positions of registers r20 .. r31 in that order in a prepare/dispose instruction. */
46 static 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 that order in a push/pop instruction. */
50 static int type2_regs[16] = { 3, 2, 1, 0, 27, 26, 25, 24, 31, 30, 29, 28, 23, 22, 20, 21};
51 /* This is an array of the bit positions of registers r1 .. r15 in that order in a push/pop instruction. */
52 static int type3_regs[15] = { 2, 1, 0, 27, 26, 25, 24, 31, 30, 29, 28, 23, 22, 20, 21};
53 /* end-sanitize-v850eq */
56 #ifndef SIZE_INSTRUCTION
57 #define SIZE_INSTRUCTION 6
61 #define SIZE_OPERANDS 16
65 #define SIZE_VALUES 11
69 #define SIZE_LOCATION 40
74 trace_input (name, type, size)
84 const char *functionname;
85 unsigned int linenumber;
87 if (!TRACE_ALU_P (STATE_CPU (simulator, 0)))
92 if (STATE_TEXT_SECTION (simulator)
93 && PC >= STATE_TEXT_START (simulator)
94 && PC < STATE_TEXT_END (simulator))
96 filename = (const char *)0;
97 functionname = (const char *)0;
99 if (bfd_find_nearest_line (STATE_PROG_BFD (simulator),
100 STATE_TEXT_SECTION (simulator),
101 (struct symbol_cache_entry **)0,
102 PC - STATE_TEXT_START (simulator),
103 &filename, &functionname, &linenumber))
108 sprintf (p, "Line %5d ", linenumber);
114 sprintf (p, "Func %s ", functionname);
119 char *q = (char *) strrchr (filename, '/');
120 sprintf (p, "File %s ", (q) ? q+1 : filename);
129 trace_printf (simulator, STATE_CPU (simulator, 0),
130 "0x%.8x: %-*.*s %-*s",
132 SIZE_LOCATION, SIZE_LOCATION, buf,
133 SIZE_INSTRUCTION, name);
145 case OP_REG_REG_MOVE:
146 values[0] = State.regs[OP[0]];
150 /* start-sanitize-v850e */
152 /* end-sanitize-v850e */
155 values[0] = State.regs[OP[1]];
156 values[1] = State.regs[OP[0]];
162 values[0] = SEXT5 (OP[0]);
167 case OP_IMM_REG_MOVE:
168 values[0] = SEXT5 (OP[0]);
173 values[0] = State.pc;
174 values[1] = SEXT9 (OP[0]);
180 values[0] = OP[1] * size;
181 values[1] = State.regs[30];
186 values[0] = State.regs[OP[0]];
187 values[1] = OP[1] * size;
188 values[2] = State.regs[30];
193 values[0] = EXTEND16 (OP[2]);
194 values[1] = State.regs[OP[0]];
199 values[0] = State.regs[OP[1]];
200 values[1] = EXTEND16 (OP[2]);
201 values[2] = State.regs[OP[0]];
206 values[0] = SEXT22 (OP[0]);
207 values[1] = State.pc;
212 values[0] = EXTEND16 (OP[0]) << size;
213 values[1] = State.regs[OP[1]];
217 case OP_UIMM_REG_REG:
218 values[0] = (OP[0] & 0xffff) << size;
219 values[1] = State.regs[OP[1]];
237 values[0] = State.regs[OP[0]];
242 values[0] = State.sregs[OP[1]];
246 for (i = 0; i < num_values; i++)
247 trace_printf (simulator, STATE_CPU (simulator, 0),
248 "%*s0x%.8lx", SIZE_VALUES - 10, "", values[i]);
251 trace_printf (simulator, STATE_CPU (simulator, 0),
252 "%*s", SIZE_VALUES, "");
256 trace_output (result)
257 enum op_types result;
259 if (TRACE_ALU_P (STATE_CPU (simulator, 0)))
279 trace_printf (simulator, STATE_CPU (simulator, 0),
280 " :: 0x%.8lx", (unsigned long)State.regs[OP[0]]);
284 case OP_REG_REG_MOVE:
286 case OP_IMM_REG_MOVE:
289 trace_printf (simulator, STATE_CPU (simulator, 0),
290 " :: 0x%.8lx", (unsigned long)State.regs[OP[1]]);
294 case OP_UIMM_REG_REG:
295 trace_printf (simulator, STATE_CPU (simulator, 0),
296 " :: 0x%.8lx", (unsigned long)State.regs[OP[2]]);
301 trace_printf (simulator, STATE_CPU (simulator, 0),
302 " :: 0x%.8lx", (unsigned long)State.regs[OP[1]]);
306 trace_printf (simulator, STATE_CPU (simulator, 0),
307 " :: 0x%.8lx", (unsigned long)State.sregs[OP[1]]);
311 trace_printf (simulator, STATE_CPU (simulator, 0),
319 /* Returns 1 if the specific condition is met, returns 0 otherwise. */
321 condition_met (unsigned code)
323 unsigned int psw = PSW;
327 case 0x0: return ((psw & PSW_OV) != 0);
328 case 0x1: return ((psw & PSW_CY) != 0);
329 case 0x2: return ((psw & PSW_Z) != 0);
330 case 0x3: return ((((psw & PSW_CY) != 0) | ((psw & PSW_Z) != 0)) != 0);
331 case 0x4: return ((psw & PSW_S) != 0);
332 /*case 0x5: return 1;*/
333 case 0x6: return ((((psw & PSW_S) != 0) ^ ((psw & PSW_OV) != 0)) != 0);
334 case 0x7: return (((((psw & PSW_S) != 0) ^ ((psw & PSW_OV) != 0)) || ((psw & PSW_Z) != 0)) != 0);
335 case 0x8: return ((psw & PSW_OV) == 0);
336 case 0x9: return ((psw & PSW_CY) == 0);
337 case 0xa: return ((psw & PSW_Z) == 0);
338 case 0xb: return ((((psw & PSW_CY) != 0) | ((psw & PSW_Z) != 0)) == 0);
339 case 0xc: return ((psw & PSW_S) == 0);
340 case 0xd: return ((psw & PSW_SAT) != 0);
341 case 0xe: return ((((psw & PSW_S) != 0) ^ ((psw & PSW_OV) != 0)) == 0);
342 case 0xf: return (((((psw & PSW_S) != 0) ^ ((psw & PSW_OV) != 0)) || ((psw & PSW_Z) != 0)) == 0);
347 /* start-sanitize-v850e */
350 Add32 (unsigned long a1, unsigned long a2, int * carry)
352 unsigned long result = (a1 + a2);
354 * carry = (result < a1);
360 Multiply64 (boolean sign, unsigned long op0)
371 op1 = State.regs[ OP[1] ];
375 /* Compute sign of result and adjust operands if necessary. */
377 sign = (op0 ^ op1) & 0x80000000;
379 if (((signed long) op0) < 0)
382 if (((signed long) op1) < 0)
386 /* We can split the 32x32 into four 16x16 operations. This ensures
387 that we do not lose precision on 32bit only hosts: */
388 lo = ( (op0 & 0xFFFF) * (op1 & 0xFFFF));
389 mid1 = ( (op0 & 0xFFFF) * ((op1 >> 16) & 0xFFFF));
390 mid2 = (((op0 >> 16) & 0xFFFF) * (op1 & 0xFFFF));
391 hi = (((op0 >> 16) & 0xFFFF) * ((op1 >> 16) & 0xFFFF));
393 /* We now need to add all of these results together, taking care
394 to propogate the carries from the additions: */
395 RdLo = Add32 (lo, (mid1 << 16), & carry);
397 RdLo = Add32 (RdLo, (mid2 << 16), & carry);
398 RdHi += (carry + ((mid1 >> 16) & 0xFFFF) + ((mid2 >> 16) & 0xFFFF) + hi);
402 /* Negate result if necessary. */
406 if (RdLo == 0xFFFFFFFF)
415 State.regs[ OP[1] ] = RdLo;
416 State.regs[ OP[2] >> 11 ] = RdHi;
421 /* end-sanitize-v850e */
423 /* Read a null terminated string from memory, return in a buffer */
431 while (sim_core_read_1 (STATE_CPU (sd, 0),
432 PC, sim_core_read_map, addr + nr) != 0)
434 buf = NZALLOC (char, nr + 1);
435 sim_read (simulator, addr, buf, nr);
439 /* Read a null terminated argument vector from memory, return in a
442 fetch_argv (sd, addr)
448 char **buf = xmalloc (max_nr * sizeof (char*));
451 unsigned32 a = sim_core_read_4 (STATE_CPU (sd, 0),
452 PC, sim_core_read_map, addr + nr * 4);
454 buf[nr] = fetch_str (sd, a);
456 if (nr == max_nr - 1)
459 buf = xrealloc (buf, max_nr * sizeof (char*));
471 unsigned long result;
473 result = load_mem (State.regs[30] + (OP[3] & 0x7f), 1);
475 /* start-sanitize-v850eq */
477 trace_input ("sld.bu", OP_LOAD16, 1);
479 State.regs[ OP[1] ] = result;
481 /* end-sanitize-v850eq */
482 trace_input ("sld.b", OP_LOAD16, 1);
484 State.regs[ OP[1] ] = EXTEND8 (result);
485 /* start-sanitize-v850eq */
487 /* end-sanitize-v850eq */
489 trace_output (OP_LOAD16);
498 unsigned long result;
500 result = load_mem (State.regs[30] + ((OP[3] & 0x7f) << 1), 2);
502 /* start-sanitize-v850eq */
504 trace_input ("sld.hu", OP_LOAD16, 2);
506 State.regs[ OP[1] ] = result;
508 /* end-sanitize-v850eq */
509 trace_input ("sld.h", OP_LOAD16, 2);
511 State.regs[ OP[1] ] = EXTEND16 (result);
512 /* start-sanitize-v850eq */
514 /* end-sanitize-v850eq */
516 trace_output (OP_LOAD16);
525 trace_input ("sld.w", OP_LOAD16, 4);
527 State.regs[ OP[1] ] = load_mem (State.regs[30] + ((OP[3] & 0x7f) << 1), 4);
529 trace_output (OP_LOAD16);
538 trace_input ("sst.b", OP_STORE16, 1);
540 store_mem (State.regs[30] + (OP[3] & 0x7f), 1, State.regs[ OP[1] ]);
542 trace_output (OP_STORE16);
551 trace_input ("sst.h", OP_STORE16, 2);
553 store_mem (State.regs[30] + ((OP[3] & 0x7f) << 1), 2, State.regs[ OP[1] ]);
555 trace_output (OP_STORE16);
564 trace_input ("sst.w", OP_STORE16, 4);
566 store_mem (State.regs[30] + ((OP[3] & 0x7e) << 1), 4, State.regs[ OP[1] ]);
568 trace_output (OP_STORE16);
579 trace_input ("ld.b", OP_LOAD32, 1);
581 adr = State.regs[ OP[0] ] + EXTEND16 (OP[2]);
583 State.regs[ OP[1] ] = EXTEND8 (load_mem (adr, 1));
585 trace_output (OP_LOAD32);
596 trace_input ("ld.h", OP_LOAD32, 2);
598 adr = State.regs[ OP[0] ] + EXTEND16 (OP[2]);
601 State.regs[ OP[1] ] = EXTEND16 (load_mem (adr, 2));
603 trace_output (OP_LOAD32);
614 trace_input ("ld.w", OP_LOAD32, 4);
616 adr = State.regs[ OP[0] ] + EXTEND16 (OP[2] & ~1);
619 State.regs[ OP[1] ] = load_mem (adr, 4);
621 trace_output (OP_LOAD32);
630 trace_input ("st.b", OP_STORE32, 1);
632 store_mem (State.regs[ OP[0] ] + EXTEND16 (OP[2]), 1, State.regs[ OP[1] ]);
634 trace_output (OP_STORE32);
645 trace_input ("st.h", OP_STORE32, 2);
647 adr = State.regs[ OP[0] ] + EXTEND16 (OP[2]);
650 store_mem (adr, 2, State.regs[ OP[1] ]);
652 trace_output (OP_STORE32);
663 trace_input ("st.w", OP_STORE32, 4);
665 adr = State.regs[ OP[0] ] + EXTEND16 (OP[2] & ~1);
668 store_mem (adr, 4, State.regs[ OP[1] ]);
670 trace_output (OP_STORE32);
678 trace_input ("Bcond", OP_COND_BR, 0);
679 trace_output (OP_COND_BR);
681 if (condition_met (code))
682 return SEXT9 (((OP[3] & 0x70) >> 3) | ((OP[3] & 0xf800) >> 7));
799 /* jarl/jr disp22, reg */
803 trace_input ("jarl/jr", OP_JUMP, 0);
806 State.regs[ OP[1] ] = PC + 4;
808 trace_output (OP_JUMP);
810 return SEXT22 (((OP[3] & 0x3f) << 16) | OP[2]);
817 unsigned int op0, op1, result, z, s, cy, ov;
819 trace_input ("add", OP_REG_REG, 0);
821 /* Compute the result. */
823 op0 = State.regs[ OP[0] ];
824 op1 = State.regs[ OP[1] ];
828 /* Compute the condition codes. */
830 s = (result & 0x80000000);
831 cy = (result < op0 || result < op1);
832 ov = ((op0 & 0x80000000) == (op1 & 0x80000000)
833 && (op0 & 0x80000000) != (result & 0x80000000));
835 /* Store the result and condition codes. */
836 State.regs[OP[1]] = result;
837 PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
838 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
839 | (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0));
840 trace_output (OP_REG_REG);
845 /* add sign_extend(imm5), reg */
849 unsigned int op0, op1, result, z, s, cy, ov;
852 trace_input ("add", OP_IMM_REG, 0);
854 /* Compute the result. */
855 temp = SEXT5 (OP[0]);
857 op1 = State.regs[OP[1]];
860 /* Compute the condition codes. */
862 s = (result & 0x80000000);
863 cy = (result < op0 || result < op1);
864 ov = ((op0 & 0x80000000) == (op1 & 0x80000000)
865 && (op0 & 0x80000000) != (result & 0x80000000));
867 /* Store the result and condition codes. */
868 State.regs[OP[1]] = result;
869 PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
870 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
871 | (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0));
872 trace_output (OP_IMM_REG);
877 /* addi sign_extend(imm16), reg, reg */
881 unsigned int op0, op1, result, z, s, cy, ov;
883 trace_input ("addi", OP_IMM_REG_REG, 0);
885 /* Compute the result. */
887 op0 = EXTEND16 (OP[2]);
888 op1 = State.regs[ OP[0] ];
891 /* Compute the condition codes. */
893 s = (result & 0x80000000);
894 cy = (result < op0 || result < op1);
895 ov = ((op0 & 0x80000000) == (op1 & 0x80000000)
896 && (op0 & 0x80000000) != (result & 0x80000000));
898 /* Store the result and condition codes. */
899 State.regs[OP[1]] = result;
900 PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
901 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
902 | (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0));
903 trace_output (OP_IMM_REG_REG);
912 unsigned int op0, op1, result, z, s, cy, ov;
914 trace_input ("sub", OP_REG_REG, 0);
915 /* Compute the result. */
916 op0 = State.regs[ OP[0] ];
917 op1 = State.regs[ OP[1] ];
920 /* Compute the condition codes. */
922 s = (result & 0x80000000);
924 ov = ((op1 & 0x80000000) != (op0 & 0x80000000)
925 && (op1 & 0x80000000) != (result & 0x80000000));
927 /* Store the result and condition codes. */
928 State.regs[OP[1]] = result;
929 PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
930 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
931 | (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0));
932 trace_output (OP_REG_REG);
937 /* subr reg1, reg2 */
941 unsigned int op0, op1, result, z, s, cy, ov;
943 trace_input ("subr", OP_REG_REG, 0);
944 /* Compute the result. */
945 op0 = State.regs[ OP[0] ];
946 op1 = State.regs[ OP[1] ];
949 /* Compute the condition codes. */
951 s = (result & 0x80000000);
953 ov = ((op0 & 0x80000000) != (op1 & 0x80000000)
954 && (op0 & 0x80000000) != (result & 0x80000000));
956 /* Store the result and condition codes. */
957 State.regs[OP[1]] = result;
958 PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
959 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
960 | (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0));
961 trace_output (OP_REG_REG);
967 /* mulh reg1, reg2 */
971 /* start-sanitize-v850e */
974 trace_input ("sxh", OP_REG, 0);
976 State.regs[ OP[0] ] = EXTEND16 (State.regs[ OP[0] ]);
978 trace_output (OP_REG);
981 /* end-sanitize-v850e */
983 trace_input ("mulh", OP_REG_REG, 0);
985 State.regs[ OP[1] ] = (EXTEND16 (State.regs[ OP[1] ]) * EXTEND16 (State.regs[ OP[0] ]));
987 trace_output (OP_REG_REG);
993 /* mulh sign_extend(imm5), reg2 */
997 trace_input ("mulh", OP_IMM_REG, 0);
999 State.regs[ OP[1] ] = EXTEND16 (State.regs[ OP[1] ]) * SEXT5 (OP[0]);
1001 trace_output (OP_IMM_REG);
1006 /* mulhi imm16, reg1, reg2 */
1015 trace_input ("mulhi", OP_IMM_REG_REG, 0);
1017 State.regs[ OP[1] ] = EXTEND16 (State.regs[ OP[0] ]) * EXTEND16 (OP[2]);
1019 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);
1158 /* satadd reg,reg */
1162 /* start-sanitize-v850e */
1165 trace_input ("zxh", OP_REG, 0);
1167 State.regs[ OP[0] ] &= 0xffff;
1169 trace_output (OP_REG);
1172 /* end-sanitize-v850e */
1174 unsigned int op0, op1, result, z, s, cy, ov, sat;
1176 trace_input ("satadd", OP_REG_REG, 0);
1177 /* Compute the result. */
1178 op0 = State.regs[ OP[0] ];
1179 op1 = State.regs[ OP[1] ];
1182 /* Compute the condition codes. */
1184 s = (result & 0x80000000);
1185 cy = (result < op0 || result < op1);
1186 ov = ((op0 & 0x80000000) == (op1 & 0x80000000)
1187 && (op0 & 0x80000000) != (result & 0x80000000));
1190 /* Store the result and condition codes. */
1191 State.regs[OP[1]] = result;
1192 PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
1193 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
1194 | (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0)
1195 | (sat ? PSW_SAT : 0));
1197 /* Handle saturated results. */
1199 State.regs[OP[1]] = 0x80000000;
1201 State.regs[OP[1]] = 0x7fffffff;
1202 trace_output (OP_REG_REG);
1208 /* satadd sign_extend(imm5), reg */
1212 unsigned int op0, op1, result, z, s, cy, ov, sat;
1216 trace_input ("satadd", OP_IMM_REG, 0);
1218 /* Compute the result. */
1219 temp = SEXT5 (OP[0]);
1221 op1 = State.regs[OP[1]];
1224 /* Compute the condition codes. */
1226 s = (result & 0x80000000);
1227 cy = (result < op0 || result < op1);
1228 ov = ((op0 & 0x80000000) == (op1 & 0x80000000)
1229 && (op0 & 0x80000000) != (result & 0x80000000));
1232 /* Store the result and condition codes. */
1233 State.regs[OP[1]] = result;
1234 PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
1235 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
1236 | (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0)
1237 | (sat ? PSW_SAT : 0));
1239 /* Handle saturated results. */
1241 State.regs[OP[1]] = 0x80000000;
1243 State.regs[OP[1]] = 0x7fffffff;
1244 trace_output (OP_IMM_REG);
1249 /* satsub reg1, reg2 */
1254 /* start-sanitize-v850e */
1257 trace_input ("sxb", OP_REG, 0);
1259 State.regs[ OP[0] ] = EXTEND8 (State.regs[ OP[0] ]);
1261 trace_output (OP_REG);
1264 /* end-sanitize-v850e */
1266 unsigned int op0, op1, result, z, s, cy, ov, sat;
1268 trace_input ("satsub", OP_REG_REG, 0);
1270 /* Compute the result. */
1271 op0 = State.regs[ OP[0] ];
1272 op1 = State.regs[ OP[1] ];
1275 /* Compute the condition codes. */
1277 s = (result & 0x80000000);
1279 ov = ((op1 & 0x80000000) != (op0 & 0x80000000)
1280 && (op1 & 0x80000000) != (result & 0x80000000));
1283 /* Store the result and condition codes. */
1284 State.regs[OP[1]] = result;
1285 PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
1286 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
1287 | (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0)
1288 | (sat ? PSW_SAT : 0));
1290 /* Handle saturated results. */
1292 State.regs[OP[1]] = 0x80000000;
1294 State.regs[OP[1]] = 0x7fffffff;
1295 trace_output (OP_REG_REG);
1301 /* satsubi sign_extend(imm16), reg */
1305 unsigned int op0, op1, result, z, s, cy, ov, sat;
1308 trace_input ("satsubi", OP_IMM_REG, 0);
1310 /* Compute the result. */
1311 temp = EXTEND16 (OP[2]);
1313 op1 = State.regs[ OP[0] ];
1316 /* Compute the condition codes. */
1318 s = (result & 0x80000000);
1320 ov = ((op1 & 0x80000000) != (op0 & 0x80000000)
1321 && (op1 & 0x80000000) != (result & 0x80000000));
1324 /* Store the result and condition codes. */
1325 State.regs[OP[1]] = result;
1326 PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
1327 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
1328 | (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0)
1329 | (sat ? PSW_SAT : 0));
1331 /* Handle saturated results. */
1333 State.regs[OP[1]] = 0x80000000;
1335 State.regs[OP[1]] = 0x7fffffff;
1336 trace_output (OP_IMM_REG);
1341 /* satsubr reg,reg */
1346 /* start-sanitize-v850e */
1349 trace_input ("zxb", OP_REG, 0);
1351 State.regs[ OP[0] ] &= 0xff;
1353 trace_output (OP_REG);
1356 /* end-sanitize-v850e */
1358 unsigned int op0, op1, result, z, s, cy, ov, sat;
1360 trace_input ("satsubr", OP_REG_REG, 0);
1362 /* Compute the result. */
1363 op0 = State.regs[ OP[0] ];
1364 op1 = State.regs[ OP[1] ];
1367 /* Compute the condition codes. */
1369 s = (result & 0x80000000);
1370 cy = (result < op0);
1371 ov = ((op1 & 0x80000000) != (op0 & 0x80000000)
1372 && (op1 & 0x80000000) != (result & 0x80000000));
1375 /* Store the result and condition codes. */
1376 State.regs[OP[1]] = result;
1377 PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
1378 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
1379 | (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0)
1380 | (sat ? PSW_SAT : 0));
1382 /* Handle saturated results. */
1384 State.regs[OP[1]] = 0x80000000;
1386 State.regs[OP[1]] = 0x7fffffff;
1387 trace_output (OP_REG_REG);
1397 unsigned int op0, op1, result, z, s;
1399 trace_input ("tst", OP_REG_REG_CMP, 0);
1401 /* Compute the result. */
1402 op0 = State.regs[ OP[0] ];
1403 op1 = State.regs[ OP[1] ];
1406 /* Compute the condition codes. */
1408 s = (result & 0x80000000);
1410 /* Store the condition codes. */
1411 PSW &= ~(PSW_Z | PSW_S | PSW_OV);
1412 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0));
1413 trace_output (OP_REG_REG_CMP);
1422 trace_input ("mov", OP_REG_REG_MOVE, 0);
1424 State.regs[ OP[1] ] = State.regs[ OP[0] ];
1426 trace_output (OP_REG_REG_MOVE);
1431 /* mov sign_extend(imm5), reg */
1436 /* start-sanitize-v850e */
1441 trace_input ("callt", OP_LOAD16, 1);
1446 adr = CTBP + ((OP[3] & 0x3f) << 1);
1448 PC = CTBP + load_mem (adr, 1);
1450 trace_output (OP_LOAD16);
1455 /* end-sanitize-v850e */
1457 int value = SEXT5 (OP[0]);
1459 trace_input ("mov", OP_IMM_REG_MOVE, 0);
1461 State.regs[ OP[1] ] = value;
1463 trace_output (OP_IMM_REG_MOVE);
1469 /* mov imm32, reg1 */
1470 /* movea sign_extend(imm16), reg, reg */
1474 /* start-sanitize-v850e */
1477 trace_input ("mov", OP_IMM_REG, 4);
1479 State.regs[ OP[0] ] = load_mem (PC + 2, 4);
1481 trace_output (OP_IMM_REG);
1486 /* end-sanitize-v850e */
1488 trace_input ("movea", OP_IMM_REG_REG, 0);
1490 State.regs[ OP[1] ] = State.regs[ OP[0] ] + EXTEND16 (OP[2]);
1492 trace_output (OP_IMM_REG_REG);
1498 /* dispose imm5, list12 [, reg1] */
1499 /* movhi imm16, reg, reg */
1503 /* start-sanitize-v850e */
1509 trace_input ("dispose", OP_PUSHPOP1, 0);
1511 SP += (OP[3] & 0x3e) << 1;
1513 /* Load the registers with lower number registers being retrieved from higher addresses. */
1515 if ((OP[3] & (1 << type1_regs[ i ])))
1517 State.regs[ 20 + i ] = load_mem (SP, 4);
1521 if ((OP[3] & 0x1f0000) != 0)
1523 PC = State.regs[ (OP[3] >> 16) & 0x1f];
1527 trace_output (OP_PUSHPOP1);
1530 /* end-sanitize-v850e */
1532 trace_input ("movhi", OP_UIMM_REG_REG, 16);
1534 State.regs[ OP[1] ] = State.regs[ OP[0] ] + (OP[2] << 16);
1536 trace_output (OP_UIMM_REG_REG);
1542 /* sar zero_extend(imm5),reg1 */
1546 unsigned int op0, op1, result, z, s, cy;
1548 trace_input ("sar", OP_IMM_REG, 0);
1550 op1 = State.regs[ OP[1] ];
1551 result = (signed)op1 >> op0;
1553 /* Compute the condition codes. */
1555 s = (result & 0x80000000);
1556 cy = (op1 & (1 << (op0 - 1)));
1558 /* Store the result and condition codes. */
1559 State.regs[ OP[1] ] = result;
1560 PSW &= ~(PSW_Z | PSW_S | PSW_OV | PSW_CY);
1561 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
1562 | (cy ? PSW_CY : 0));
1563 trace_output (OP_IMM_REG);
1568 /* sar reg1, reg2 */
1572 unsigned int op0, op1, result, z, s, cy;
1574 trace_input ("sar", OP_REG_REG, 0);
1576 op0 = State.regs[ OP[0] ] & 0x1f;
1577 op1 = State.regs[ OP[1] ];
1578 result = (signed)op1 >> op0;
1580 /* Compute the condition codes. */
1582 s = (result & 0x80000000);
1583 cy = (op1 & (1 << (op0 - 1)));
1585 /* Store the result and condition codes. */
1586 State.regs[OP[1]] = result;
1587 PSW &= ~(PSW_Z | PSW_S | PSW_OV | PSW_CY);
1588 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
1589 | (cy ? PSW_CY : 0));
1590 trace_output (OP_REG_REG);
1595 /* shl zero_extend(imm5),reg1 */
1599 unsigned int op0, op1, result, z, s, cy;
1601 trace_input ("shl", OP_IMM_REG, 0);
1603 op1 = State.regs[ OP[1] ];
1604 result = op1 << op0;
1606 /* Compute the condition codes. */
1608 s = (result & 0x80000000);
1609 cy = (op1 & (1 << (32 - op0)));
1611 /* Store the result and condition codes. */
1612 State.regs[OP[1]] = result;
1613 PSW &= ~(PSW_Z | PSW_S | PSW_OV | PSW_CY);
1614 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
1615 | (cy ? PSW_CY : 0));
1616 trace_output (OP_IMM_REG);
1621 /* shl reg1, reg2 */
1625 unsigned int op0, op1, result, z, s, cy;
1627 trace_input ("shl", OP_REG_REG, 0);
1628 op0 = State.regs[ OP[0] ] & 0x1f;
1629 op1 = State.regs[ OP[1] ];
1630 result = op1 << op0;
1632 /* Compute the condition codes. */
1634 s = (result & 0x80000000);
1635 cy = (op1 & (1 << (32 - op0)));
1637 /* Store the result and condition codes. */
1638 State.regs[OP[1]] = result;
1639 PSW &= ~(PSW_Z | PSW_S | PSW_OV | PSW_CY);
1640 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
1641 | (cy ? PSW_CY : 0));
1642 trace_output (OP_REG_REG);
1647 /* shr zero_extend(imm5),reg1 */
1651 unsigned int op0, op1, result, z, s, cy;
1653 trace_input ("shr", OP_IMM_REG, 0);
1655 op1 = State.regs[ OP[1] ];
1656 result = op1 >> op0;
1658 /* Compute the condition codes. */
1660 s = (result & 0x80000000);
1661 cy = (op1 & (1 << (op0 - 1)));
1663 /* Store the result and condition codes. */
1664 State.regs[OP[1]] = result;
1665 PSW &= ~(PSW_Z | PSW_S | PSW_OV | PSW_CY);
1666 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
1667 | (cy ? PSW_CY : 0));
1668 trace_output (OP_IMM_REG);
1673 /* shr reg1, reg2 */
1677 unsigned int op0, op1, result, z, s, cy;
1679 trace_input ("shr", OP_REG_REG, 0);
1680 op0 = State.regs[ OP[0] ] & 0x1f;
1681 op1 = State.regs[ OP[1] ];
1682 result = op1 >> op0;
1684 /* Compute the condition codes. */
1686 s = (result & 0x80000000);
1687 cy = (op1 & (1 << (op0 - 1)));
1689 /* Store the result and condition codes. */
1690 State.regs[OP[1]] = result;
1691 PSW &= ~(PSW_Z | PSW_S | PSW_OV | PSW_CY);
1692 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
1693 | (cy ? PSW_CY : 0));
1694 trace_output (OP_REG_REG);
1703 unsigned int op0, op1, result, z, s;
1705 trace_input ("or", OP_REG_REG, 0);
1707 /* Compute the result. */
1708 op0 = State.regs[ OP[0] ];
1709 op1 = State.regs[ OP[1] ];
1712 /* Compute the condition codes. */
1714 s = (result & 0x80000000);
1716 /* Store the result and condition codes. */
1717 State.regs[OP[1]] = result;
1718 PSW &= ~(PSW_Z | PSW_S | PSW_OV);
1719 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0));
1720 trace_output (OP_REG_REG);
1725 /* ori zero_extend(imm16), reg, reg */
1729 unsigned int op0, op1, result, z, s;
1731 trace_input ("ori", OP_UIMM_REG_REG, 0);
1733 op1 = State.regs[ OP[0] ];
1736 /* Compute the condition codes. */
1738 s = (result & 0x80000000);
1740 /* Store the result and condition codes. */
1741 State.regs[OP[1]] = result;
1742 PSW &= ~(PSW_Z | PSW_S | PSW_OV);
1743 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0));
1744 trace_output (OP_UIMM_REG_REG);
1753 unsigned int op0, op1, result, z, s;
1755 trace_input ("and", OP_REG_REG, 0);
1757 /* Compute the result. */
1758 op0 = State.regs[ OP[0] ];
1759 op1 = State.regs[ OP[1] ];
1762 /* Compute the condition codes. */
1764 s = (result & 0x80000000);
1766 /* Store the result and condition codes. */
1767 State.regs[OP[1]] = result;
1768 PSW &= ~(PSW_Z | PSW_S | PSW_OV);
1769 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0));
1770 trace_output (OP_REG_REG);
1775 /* andi zero_extend(imm16), reg, reg */
1779 unsigned int result, z;
1781 trace_input ("andi", OP_UIMM_REG_REG, 0);
1783 result = OP[2] & State.regs[ OP[0] ];
1785 /* Compute the condition codes. */
1788 /* Store the result and condition codes. */
1789 State.regs[ OP[1] ] = result;
1791 PSW &= ~(PSW_Z | PSW_S | PSW_OV);
1792 PSW |= (z ? PSW_Z : 0);
1794 trace_output (OP_UIMM_REG_REG);
1803 unsigned int op0, op1, result, z, s;
1805 trace_input ("xor", OP_REG_REG, 0);
1807 /* Compute the result. */
1808 op0 = State.regs[ OP[0] ];
1809 op1 = State.regs[ OP[1] ];
1812 /* Compute the condition codes. */
1814 s = (result & 0x80000000);
1816 /* Store the result and condition codes. */
1817 State.regs[OP[1]] = result;
1818 PSW &= ~(PSW_Z | PSW_S | PSW_OV);
1819 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0));
1820 trace_output (OP_REG_REG);
1825 /* xori zero_extend(imm16), reg, reg */
1829 unsigned int op0, op1, result, z, s;
1831 trace_input ("xori", OP_UIMM_REG_REG, 0);
1833 op1 = State.regs[ OP[0] ];
1836 /* Compute the condition codes. */
1838 s = (result & 0x80000000);
1840 /* Store the result and condition codes. */
1841 State.regs[OP[1]] = result;
1842 PSW &= ~(PSW_Z | PSW_S | PSW_OV);
1843 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0));
1844 trace_output (OP_UIMM_REG_REG);
1849 /* not reg1, reg2 */
1853 unsigned int op0, result, z, s;
1855 trace_input ("not", OP_REG_REG_MOVE, 0);
1856 /* Compute the result. */
1857 op0 = State.regs[ OP[0] ];
1860 /* Compute the condition codes. */
1862 s = (result & 0x80000000);
1864 /* Store the result and condition codes. */
1865 State.regs[OP[1]] = result;
1866 PSW &= ~(PSW_Z | PSW_S | PSW_OV);
1867 PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0));
1868 trace_output (OP_REG_REG_MOVE);
1877 unsigned int op0, op1, op2;
1880 trace_input ("set1", OP_BIT, 0);
1881 op0 = State.regs[ OP[0] ];
1883 temp = EXTEND16 (OP[2]);
1885 temp = load_mem (op0 + op2, 1);
1887 if ((temp & (1 << op1)) == 0)
1890 store_mem (op0 + op2, 1, temp);
1891 trace_output (OP_BIT);
1900 unsigned int op0, op1, op2;
1903 trace_input ("not1", OP_BIT, 0);
1904 op0 = State.regs[ OP[0] ];
1906 temp = EXTEND16 (OP[2]);
1908 temp = load_mem (op0 + op2, 1);
1910 if ((temp & (1 << op1)) == 0)
1913 store_mem (op0 + op2, 1, temp);
1914 trace_output (OP_BIT);
1923 unsigned int op0, op1, op2;
1926 trace_input ("clr1", OP_BIT, 0);
1927 op0 = State.regs[ OP[0] ];
1929 temp = EXTEND16 (OP[2]);
1931 temp = load_mem (op0 + op2, 1);
1933 if ((temp & (1 << op1)) == 0)
1935 temp &= ~(1 << op1);
1936 store_mem (op0 + op2, 1, temp);
1937 trace_output (OP_BIT);
1946 unsigned int op0, op1, op2;
1949 trace_input ("tst1", OP_BIT, 0);
1950 op0 = State.regs[ OP[0] ];
1952 temp = EXTEND16 (OP[2]);
1954 temp = load_mem (op0 + op2, 1);
1956 if ((temp & (1 << op1)) == 0)
1958 trace_output (OP_BIT);
1967 sim_engine_halt (simulator, STATE_CPU (simulator, 0), NULL, PC,
1968 sim_stopped, SIGTRAP);
1976 trace_input ("di", OP_NONE, 0);
1978 trace_output (OP_NONE);
1987 trace_input ("ei", OP_NONE, 0);
1989 trace_output (OP_NONE);
1998 trace_input ("halt", OP_NONE, 0);
1999 /* FIXME this should put processor into a mode where NMI still handled */
2000 trace_output (OP_NONE);
2001 sim_engine_halt (simulator, STATE_CPU (simulator, 0), NULL, PC,
2002 sim_stopped, SIGTRAP);
2010 trace_input ("reti", OP_NONE, 0);
2011 trace_output (OP_NONE);
2013 /* Restore for NMI if only NP on, otherwise is interrupt or exception. */
2014 if ((PSW & (PSW_NP | PSW_EP)) == PSW_NP)
2032 trace_input ("trap", OP_TRAP, 0);
2033 trace_output (OP_TRAP);
2035 /* Trap 31 is used for simulating OS I/O functions */
2039 int save_errno = errno;
2042 /* Registers passed to trap 0 */
2044 #define FUNC State.regs[6] /* function number, return value */
2045 #define PARM1 State.regs[7] /* optional parm 1 */
2046 #define PARM2 State.regs[8] /* optional parm 2 */
2047 #define PARM3 State.regs[9] /* optional parm 3 */
2049 /* Registers set by trap 0 */
2051 #define RETVAL State.regs[10] /* return value */
2052 #define RETERR State.regs[11] /* return error code */
2054 /* Turn a pointer in a register into a pointer into real memory. */
2056 #define MEMPTR(x) (map (x))
2073 char *path = fetch_str (simulator, PARM1);
2074 char **argv = fetch_argv (simulator, PARM2);
2075 char **envp = fetch_argv (simulator, PARM3);
2076 RETVAL = execve (path, argv, envp);
2089 char *path = fetch_str (simulator, PARM1);
2090 char **argv = fetch_argv (simulator, PARM2);
2091 RETVAL = execv (path, argv);
2107 RETVAL = pipe (host_fd);
2108 SW (buf, host_fd[0]);
2109 buf += sizeof(uint16);
2110 SW (buf, host_fd[1]);
2122 RETVAL = wait (&status);
2132 char *buf = zalloc (PARM3);
2133 RETVAL = sim_io_read (simulator, PARM1, buf, PARM3);
2134 sim_write (simulator, PARM2, buf, PARM3);
2143 char *buf = zalloc (PARM3);
2144 sim_read (simulator, PARM2, buf, PARM3);
2146 RETVAL = sim_io_write_stdout (simulator, buf, PARM3);
2148 RETVAL = sim_io_write (simulator, PARM1, buf, PARM3);
2156 RETVAL = sim_io_lseek (simulator, PARM1, PARM2, PARM3);
2162 RETVAL = sim_io_close (simulator, PARM1);
2169 char *buf = fetch_str (simulator, PARM1);
2170 RETVAL = sim_io_open (simulator, buf, PARM2);
2178 if ((PARM1 & 0xffff0000) == 0xdead0000 && (PARM1 & 0xffff) != 0)
2179 /* get signal encoded by kill */
2180 sim_engine_halt (simulator, STATE_CPU (simulator, 0), NULL, PC,
2181 sim_signalled, PARM1 & 0xffff);
2182 else if (PARM1 == 0xdead)
2184 sim_engine_halt (simulator, STATE_CPU (simulator, 0), NULL, PC,
2185 sim_exited, SIGABRT);
2187 /* PARM1 has exit status */
2188 sim_engine_halt (simulator, STATE_CPU (simulator, 0), NULL, PC,
2193 #if !defined(__GO32__) && !defined(_WIN32)
2195 case SYS_stat: /* added at hmsi */
2196 /* stat system call */
2198 struct stat host_stat;
2200 char *path = fetch_str (simulator, PARM1);
2202 RETVAL = stat (path, &host_stat);
2207 /* Just wild-assed guesses. */
2208 store_mem (buf, 2, host_stat.st_dev);
2209 store_mem (buf + 2, 2, host_stat.st_ino);
2210 store_mem (buf + 4, 4, host_stat.st_mode);
2211 store_mem (buf + 8, 2, host_stat.st_nlink);
2212 store_mem (buf + 10, 2, host_stat.st_uid);
2213 store_mem (buf + 12, 2, host_stat.st_gid);
2214 store_mem (buf + 14, 2, host_stat.st_rdev);
2215 store_mem (buf + 16, 4, host_stat.st_size);
2216 store_mem (buf + 20, 4, host_stat.st_atime);
2217 store_mem (buf + 28, 4, host_stat.st_mtime);
2218 store_mem (buf + 36, 4, host_stat.st_ctime);
2228 char *path = fetch_str (simulator, PARM1);
2229 RETVAL = chown (path, PARM2, PARM3);
2240 char *path = fetch_str (simulator, PARM1);
2241 RETVAL = chmod (path, PARM2);
2253 RETVAL = time (&now);
2254 store_mem (PARM1, 4, now);
2260 #if !defined(__GO32__) && !defined(_WIN32)
2265 RETVAL = times (&tms);
2266 store_mem (PARM1, 4, tms.tms_utime);
2267 store_mem (PARM1 + 4, 4, tms.tms_stime);
2268 store_mem (PARM1 + 8, 4, tms.tms_cutime);
2269 store_mem (PARM1 + 12, 4, tms.tms_cstime);
2275 #ifdef SYS_gettimeofday
2276 #if !defined(__GO32__) && !defined(_WIN32)
2277 case SYS_gettimeofday:
2281 RETVAL = gettimeofday (&t, &tz);
2282 store_mem (PARM1, 4, t.tv_sec);
2283 store_mem (PARM1 + 4, 4, t.tv_usec);
2284 store_mem (PARM2, 4, tz.tz_minuteswest);
2285 store_mem (PARM2 + 4, 4, tz.tz_dsttime);
2295 /* Cast the second argument to void *, to avoid type mismatch
2296 if a prototype is present. */
2297 sim_io_error (simulator, "Utime not supported");
2298 /* RETVAL = utime (path, (void *) MEMPTR (PARM2)); */
2313 { /* Trap 0 -> 30 */
2318 ECR |= 0x40 + OP[0];
2319 /* Flag that we are now doing exception processing. */
2320 PSW |= PSW_EP | PSW_ID;
2321 PC = ((OP[0] < 0x10) ? 0x40 : 0x50) - 4;
2331 trace_input ("ldsr", OP_LDSR, 0);
2333 State.sregs[ OP[1] ] = State.regs[ OP[0] ];
2335 trace_output (OP_LDSR);
2344 trace_input ("stsr", OP_STSR, 0);
2346 State.regs[ OP[1] ] = State.sregs[ OP[0] ];
2348 trace_output (OP_STSR);
2353 /* start-sanitize-v850e */
2354 /* tst1 reg2, [reg1] */
2360 trace_input ("tst1", OP_BIT, 1);
2362 temp = load_mem (State.regs[ OP[0] ], 1);
2365 if ((temp & (1 << State.regs[ OP[1] & 0x7 ])) == 0)
2368 trace_output (OP_BIT);
2373 /* end-sanitize-v850e */
2374 /* start-sanitize-v850e */
2375 /* mulu reg1, reg2, reg3 */
2379 trace_input ("mulu", OP_REG_REG_REG, 0);
2381 Multiply64 (false, State.regs[ OP[0] ]);
2383 trace_output (OP_REG_REG_REG);
2388 /* end-sanitize-v850e */
2389 /* start-sanitize-v850e */
2391 #define BIT_CHANGE_OP( name, binop ) \
2393 unsigned int temp; \
2395 trace_input (name, OP_BIT_CHANGE, 0); \
2397 bit = 1 << State.regs[ OP[1] & 0x7 ]; \
2398 temp = load_mem (State.regs[ OP[0] ], 1); \
2401 if ((temp & bit) == 0) \
2405 store_mem (State.regs[ OP[0] ], 1, temp); \
2407 trace_output (OP_BIT_CHANGE); \
2411 /* clr1 reg2, [reg1] */
2415 BIT_CHANGE_OP ("clr1", &= ~ );
2418 /* not1 reg2, [reg1] */
2422 BIT_CHANGE_OP ("not1", ^= );
2429 BIT_CHANGE_OP ("set1", |= );
2436 trace_input ("sasf", OP_EX1, 0);
2438 State.regs[ OP[1] ] = (State.regs[ OP[1] ] << 1) | condition_met (OP[0]);
2440 trace_output (OP_EX1);
2444 /* end-sanitize-v850e */
2445 /* start-sanitize-v850eq */
2446 /* This function is courtesy of Sugimoto at NEC, via Seow Tan (Soew_Tan@el.nec.com) */
2451 unsigned long int als,
2452 unsigned long int sfi,
2453 unsigned long int * quotient_ptr,
2454 unsigned long int * remainder_ptr,
2455 boolean * overflow_ptr
2458 unsigned long ald = sfi >> (N - 1);
2459 unsigned long alo = als;
2464 unsigned int R1 = 1;
2465 unsigned int DBZ = (als == 0) ? 1 : 0;
2466 unsigned long alt = Q ? ~als : als;
2469 alo = ald + alt + Q;
2470 C = (((alt >> 31) & (ald >> 31))
2471 | (((alt >> 31) ^ (ald >> 31)) & (~alo >> 31)));
2474 R1 = (alo == 0) ? 0 : (R1 & Q);
2475 if ((S ^ (alo>>31)) && !C)
2480 sfi = (sfi << (32-N+1)) | Q;
2481 ald = (alo << 1) | (sfi >> 31);
2483 /* 2nd - N-1th Loop */
2484 for (i = 2; i < N; i++)
2486 alt = Q ? ~als : als;
2487 alo = ald + alt + Q;
2488 C = (((alt >> 31) & (ald >> 31))
2489 | (((alt >> 31) ^ (ald >> 31)) & (~alo >> 31)));
2492 R1 = (alo == 0) ? 0 : (R1 & Q);
2493 if ((S ^ (alo>>31)) && !C && !DBZ)
2498 sfi = (sfi << 1) | Q;
2499 ald = (alo << 1) | (sfi >> 31);
2503 alt = Q ? ~als : als;
2504 alo = ald + alt + Q;
2505 C = (((alt >> 31) & (ald >> 31))
2506 | (((alt >> 31) ^ (ald >> 31)) & (~alo >> 31)));
2509 R1 = (alo == 0) ? 0 : (R1 & Q);
2510 if ((S ^ (alo>>31)) && !C)
2515 * quotient_ptr = (sfi << 1) | Q;
2516 * remainder_ptr = Q ? alo : (alo + als);
2517 * overflow_ptr = DBZ | R1;
2520 /* This function is courtesy of Sugimoto at NEC, via Seow Tan (Soew_Tan@el.nec.com) */
2525 unsigned long int als,
2526 unsigned long int sfi,
2527 signed long int * quotient_ptr,
2528 signed long int * remainder_ptr,
2529 boolean * overflow_ptr
2532 unsigned long ald = (signed long) sfi >> (N - 1);
2533 unsigned long alo = als;
2534 unsigned int SS = als >> 31;
2535 unsigned int SD = sfi >> 31;
2536 unsigned int R1 = 1;
2538 unsigned int DBZ = als == 0 ? 1 : 0;
2539 unsigned int Q = ~(SS ^ SD) & 1;
2543 unsigned long alt = Q ? ~als : als;
2548 alo = ald + alt + Q;
2549 C = (((alt >> 31) & (ald >> 31))
2550 | (((alt >> 31) ^ (ald >> 31)) & (~alo >> 31)));
2552 R1 = (alo == 0) ? 0 : (R1 & (Q ^ (SS ^ SD)));
2554 sfi = (sfi << (32-N+1)) | Q;
2555 ald = (alo << 1) | (sfi >> 31);
2556 if ((alo >> 31) ^ (ald >> 31))
2561 /* 2nd - N-1th Loop */
2563 for (i = 2; i < N; i++)
2565 alt = Q ? ~als : als;
2566 alo = ald + alt + Q;
2567 C = (((alt >> 31) & (ald >> 31))
2568 | (((alt >> 31) ^ (ald >> 31)) & (~alo >> 31)));
2570 R1 = (alo == 0) ? 0 : (R1 & (Q ^ (SS ^ SD)));
2572 sfi = (sfi << 1) | Q;
2573 ald = (alo << 1) | (sfi >> 31);
2574 if ((alo >> 31) ^ (ald >> 31))
2581 alt = Q ? ~als : als;
2582 alo = ald + alt + Q;
2583 C = (((alt >> 31) & (ald >> 31))
2584 | (((alt >> 31) ^ (ald >> 31)) & (~alo >> 31)));
2586 R1 = (alo == 0) ? 0 : (R1 & (Q ^ (SS ^ SD)));
2587 sfi = (sfi << (32-N+1));
2593 alt = Q ? ~als : als;
2594 alo = ald + alt + Q;
2596 R1 = R1 & ((~alo >> 31) ^ SD);
2597 if ((alo != 0) && ((Q ^ (SS ^ SD)) ^ R1)) alo = ald;
2599 ald = sfi = (long) ((sfi >> 1) | (SS ^ SD) << 31) >> (32-N-1) | Q;
2601 ald = sfi = sfi | Q;
2603 OV = DBZ | ((alo == 0) ? 0 : R1);
2605 * remainder_ptr = alo;
2608 if (((alo != 0) && ((SS ^ SD) ^ R1))
2609 || ((alo == 0) && (SS ^ R1)))
2614 OV = (DBZ | R1) ? OV : ((alo >> 31) & (~ald >> 31));
2616 * quotient_ptr = alo;
2617 * overflow_ptr = OV;
2620 /* sdivun imm5, reg1, reg2, reg3 */
2624 unsigned long int quotient;
2625 unsigned long int remainder;
2626 unsigned long int divide_by;
2627 unsigned long int divide_this;
2628 boolean overflow = false;
2631 trace_input ("sdivun", OP_IMM_REG_REG_REG, 0);
2633 imm5 = 32 - ((OP[3] & 0x3c0000) >> 17);
2635 divide_by = State.regs[ OP[0] ];
2636 divide_this = State.regs[ OP[1] ] << imm5;
2638 divun (imm5, divide_by, divide_this, & quotient, & remainder, & overflow);
2640 State.regs[ OP[1] ] = quotient;
2641 State.regs[ OP[2] >> 11 ] = remainder;
2643 /* Set condition codes. */
2644 PSW &= ~(PSW_Z | PSW_S | PSW_OV);
2646 if (overflow) PSW |= PSW_OV;
2647 if (quotient == 0) PSW |= PSW_Z;
2648 if (quotient & 0x80000000) PSW |= PSW_S;
2650 trace_output (OP_IMM_REG_REG_REG);
2655 /* sdivn imm5, reg1, reg2, reg3 */
2659 signed long int quotient;
2660 signed long int remainder;
2661 signed long int divide_by;
2662 signed long int divide_this;
2663 boolean overflow = false;
2666 trace_input ("sdivn", OP_IMM_REG_REG_REG, 0);
2668 imm5 = 32 - ((OP[3] & 0x3c0000) >> 17);
2670 divide_by = State.regs[ OP[0] ];
2671 divide_this = State.regs[ OP[1] ] << imm5;
2673 divn (imm5, divide_by, divide_this, & quotient, & remainder, & overflow);
2675 State.regs[ OP[1] ] = quotient;
2676 State.regs[ OP[2] >> 11 ] = remainder;
2678 /* Set condition codes. */
2679 PSW &= ~(PSW_Z | PSW_S | PSW_OV);
2681 if (overflow) PSW |= PSW_OV;
2682 if (quotient == 0) PSW |= PSW_Z;
2683 if (quotient < 0) PSW |= PSW_S;
2685 trace_output (OP_IMM_REG_REG_REG);
2690 /* sdivhun imm5, reg1, reg2, reg3 */
2694 unsigned long int quotient;
2695 unsigned long int remainder;
2696 unsigned long int divide_by;
2697 unsigned long int divide_this;
2698 boolean overflow = false;
2701 trace_input ("sdivhun", OP_IMM_REG_REG_REG, 0);
2703 imm5 = 32 - ((OP[3] & 0x3c0000) >> 17);
2705 divide_by = State.regs[ OP[0] ] & 0xffff;
2706 divide_this = State.regs[ OP[1] ] << imm5;
2708 divun (imm5, divide_by, divide_this, & quotient, & remainder, & overflow);
2710 State.regs[ OP[1] ] = quotient;
2711 State.regs[ OP[2] >> 11 ] = remainder;
2713 /* Set condition codes. */
2714 PSW &= ~(PSW_Z | PSW_S | PSW_OV);
2716 if (overflow) PSW |= PSW_OV;
2717 if (quotient == 0) PSW |= PSW_Z;
2718 if (quotient & 0x80000000) PSW |= PSW_S;
2720 trace_output (OP_IMM_REG_REG_REG);
2725 /* sdivhn imm5, reg1, reg2, reg3 */
2729 signed long int quotient;
2730 signed long int remainder;
2731 signed long int divide_by;
2732 signed long int divide_this;
2733 boolean overflow = false;
2736 trace_input ("sdivhn", OP_IMM_REG_REG_REG, 0);
2738 imm5 = 32 - ((OP[3] & 0x3c0000) >> 17);
2740 divide_by = EXTEND16 (State.regs[ OP[0] ]);
2741 divide_this = State.regs[ OP[1] ] << imm5;
2743 divn (imm5, divide_by, divide_this, & quotient, & remainder, & overflow);
2745 State.regs[ OP[1] ] = quotient;
2746 State.regs[ OP[2] >> 11 ] = remainder;
2748 /* Set condition codes. */
2749 PSW &= ~(PSW_Z | PSW_S | PSW_OV);
2751 if (overflow) PSW |= PSW_OV;
2752 if (quotient == 0) PSW |= PSW_Z;
2753 if (quotient < 0) PSW |= PSW_S;
2755 trace_output (OP_IMM_REG_REG_REG);
2760 /* end-sanitize-v850eq */
2761 /* start-sanitize-v850e */
2762 /* divu reg1, reg2, reg3 */
2766 unsigned long int quotient;
2767 unsigned long int remainder;
2768 unsigned long int divide_by;
2769 unsigned long int divide_this;
2770 boolean overflow = false;
2772 if ((OP[3] & 0x3c0000) == 0)
2774 trace_input ("divu", OP_REG_REG_REG, 0);
2776 /* Compute the result. */
2778 divide_by = State.regs[ OP[0] ];
2779 divide_this = State.regs[ OP[1] ];
2787 State.regs[ OP[1] ] = quotient = divide_this / divide_by;
2788 State.regs[ OP[2] >> 11 ] = remainder = divide_this % divide_by;
2790 /* Set condition codes. */
2791 PSW &= ~(PSW_Z | PSW_S | PSW_OV);
2793 if (overflow) PSW |= PSW_OV;
2794 if (quotient == 0) PSW |= PSW_Z;
2795 if (quotient & 0x80000000) PSW |= PSW_S;
2797 trace_output (OP_REG_REG_REG);
2799 /* start-sanitize-v850eq */
2800 /* divun imm5, reg1, reg2, reg3 */
2805 trace_input ("divun", OP_IMM_REG_REG_REG, 0);
2807 imm5 = 32 - ((OP[3] & 0x3c0000) >> 17);
2809 divide_by = State.regs[ OP[0] ];
2810 divide_this = State.regs[ OP[1] ];
2812 divun (imm5, divide_by, divide_this, & quotient, & remainder, & overflow);
2814 State.regs[ OP[1] ] = quotient;
2815 State.regs[ OP[2] >> 11 ] = remainder;
2817 /* Set condition codes. */
2818 PSW &= ~(PSW_Z | PSW_S | PSW_OV);
2820 if (overflow) PSW |= PSW_OV;
2821 if (quotient == 0) PSW |= PSW_Z;
2822 if (quotient & 0x80000000) PSW |= PSW_S;
2824 trace_output (OP_IMM_REG_REG_REG);
2826 /* end-sanitize-v850eq */
2831 /* end-sanitize-v850e */
2832 /* start-sanitize-v850e */
2833 /* div reg1, reg2, reg3 */
2837 signed long int quotient;
2838 signed long int remainder;
2839 signed long int divide_by;
2840 signed long int divide_this;
2841 boolean overflow = false;
2843 if ((OP[3] & 0x3c0000) == 0)
2845 trace_input ("div", OP_REG_REG_REG, 0);
2847 /* Compute the result. */
2849 divide_by = State.regs[ OP[0] ];
2850 divide_this = State.regs[ OP[1] ];
2852 if (divide_by == 0 || (divide_by == -1 && divide_this == (1 << 31)))
2858 State.regs[ OP[1] ] = quotient = divide_this / divide_by;
2859 State.regs[ OP[2] >> 11 ] = remainder = divide_this % divide_by;
2861 /* Set condition codes. */
2862 PSW &= ~(PSW_Z | PSW_S | PSW_OV);
2864 if (overflow) PSW |= PSW_OV;
2865 if (quotient == 0) PSW |= PSW_Z;
2866 if (quotient < 0) PSW |= PSW_S;
2868 trace_output (OP_REG_REG_REG);
2870 /* start-sanitize-v850eq */
2871 /* divn imm5, reg1, reg2, reg3 */
2876 trace_input ("divn", OP_IMM_REG_REG_REG, 0);
2878 imm5 = 32 - ((OP[3] & 0x3c0000) >> 17);
2880 divide_by = State.regs[ OP[0] ];
2881 divide_this = State.regs[ OP[1] ];
2883 divn (imm5, divide_by, divide_this, & quotient, & remainder, & overflow);
2885 State.regs[ OP[1] ] = quotient;
2886 State.regs[ OP[2] >> 11 ] = remainder;
2888 /* Set condition codes. */
2889 PSW &= ~(PSW_Z | PSW_S | PSW_OV);
2891 if (overflow) PSW |= PSW_OV;
2892 if (quotient == 0) PSW |= PSW_Z;
2893 if (quotient < 0) PSW |= PSW_S;
2895 trace_output (OP_IMM_REG_REG_REG);
2897 /* end-sanitize-v850eq */
2902 /* end-sanitize-v850e */
2903 /* start-sanitize-v850e */
2904 /* divhu reg1, reg2, reg3 */
2908 unsigned long int quotient;
2909 unsigned long int remainder;
2910 unsigned long int divide_by;
2911 unsigned long int divide_this;
2912 boolean overflow = false;
2914 if ((OP[3] & 0x3c0000) == 0)
2916 trace_input ("divhu", OP_REG_REG_REG, 0);
2918 /* Compute the result. */
2920 divide_by = State.regs[ OP[0] ] & 0xffff;
2921 divide_this = State.regs[ OP[1] ];
2929 State.regs[ OP[1] ] = quotient = divide_this / divide_by;
2930 State.regs[ OP[2] >> 11 ] = remainder = divide_this % divide_by;
2932 /* Set condition codes. */
2933 PSW &= ~(PSW_Z | PSW_S | PSW_OV);
2935 if (overflow) PSW |= PSW_OV;
2936 if (quotient == 0) PSW |= PSW_Z;
2937 if (quotient & 0x80000000) PSW |= PSW_S;
2939 trace_output (OP_REG_REG_REG);
2941 /* start-sanitize-v850eq */
2942 /* divhun imm5, reg1, reg2, reg3 */
2947 trace_input ("divhun", OP_IMM_REG_REG_REG, 0);
2949 imm5 = 32 - ((OP[3] & 0x3c0000) >> 17);
2951 divide_by = State.regs[ OP[0] ] & 0xffff;
2952 divide_this = State.regs[ OP[1] ];
2954 divun (imm5, divide_by, divide_this, & quotient, & remainder, & overflow);
2956 State.regs[ OP[1] ] = quotient;
2957 State.regs[ OP[2] >> 11 ] = remainder;
2959 /* Set condition codes. */
2960 PSW &= ~(PSW_Z | PSW_S | PSW_OV);
2962 if (overflow) PSW |= PSW_OV;
2963 if (quotient == 0) PSW |= PSW_Z;
2964 if (quotient & 0x80000000) PSW |= PSW_S;
2966 trace_output (OP_IMM_REG_REG_REG);
2968 /* end-sanitize-v850eq */
2973 /* end-sanitize-v850e */
2974 /* start-sanitize-v850e */
2975 /* divh reg1, reg2, reg3 */
2979 signed long int quotient;
2980 signed long int remainder;
2981 signed long int divide_by;
2982 signed long int divide_this;
2983 boolean overflow = false;
2985 if ((OP[3] & 0x3c0000) == 0)
2987 trace_input ("divh", OP_REG_REG_REG, 0);
2989 /* Compute the result. */
2991 divide_by = State.regs[ OP[0] ];
2992 divide_this = EXTEND16 (State.regs[ OP[1] ]);
2994 if (divide_by == 0 || (divide_by == -1 && divide_this == (1 << 31)))
3000 State.regs[ OP[1] ] = quotient = divide_this / divide_by;
3001 State.regs[ OP[2] >> 11 ] = remainder = divide_this % divide_by;
3003 /* Set condition codes. */
3004 PSW &= ~(PSW_Z | PSW_S | PSW_OV);
3006 if (overflow) PSW |= PSW_OV;
3007 if (quotient == 0) PSW |= PSW_Z;
3008 if (quotient < 0) PSW |= PSW_S;
3010 trace_output (OP_REG_REG_REG);
3012 /* start-sanitize-v850eq */
3013 /* divhn imm5, reg1, reg2, reg3 */
3018 trace_input ("divhn", OP_IMM_REG_REG_REG, 0);
3020 imm5 = 32 - ((OP[3] & 0x3c0000) >> 17);
3022 divide_by = EXTEND16 (State.regs[ OP[0] ]);
3023 divide_this = State.regs[ OP[1] ];
3025 divn (imm5, divide_by, divide_this, & quotient, & remainder, & overflow);
3027 State.regs[ OP[1] ] = quotient;
3028 State.regs[ OP[2] >> 11 ] = remainder;
3030 /* Set condition codes. */
3031 PSW &= ~(PSW_Z | PSW_S | PSW_OV);
3033 if (overflow) PSW |= PSW_OV;
3034 if (quotient == 0) PSW |= PSW_Z;
3035 if (quotient < 0) PSW |= PSW_S;
3037 trace_output (OP_IMM_REG_REG_REG);
3039 /* end-sanitize-v850eq */
3044 /* end-sanitize-v850e */
3045 /* start-sanitize-v850e */
3046 /* mulu imm9, reg2, reg3 */
3050 trace_input ("mulu", OP_IMM_REG_REG, 0);
3052 Multiply64 (false, (OP[3] & 0x1f) | ((OP[3] >> 13) & 0x1e0));
3054 trace_output (OP_IMM_REG_REG);
3059 /* end-sanitize-v850e */
3060 /* start-sanitize-v850e */
3061 /* mul imm9, reg2, reg3 */
3065 trace_input ("mul", OP_IMM_REG_REG, 0);
3067 Multiply64 (true, (OP[3] & 0x1f) | ((OP[3] >> 13) & 0x1e0));
3069 trace_output (OP_IMM_REG_REG);
3074 /* end-sanitize-v850e */
3075 /* start-sanitize-v850e */
3076 /* cmov imm5, reg2, reg3 */
3080 trace_input ("cmov", OP_IMM_REG_REG, 0);
3082 State.regs[ OP[2] >> 11 ] = condition_met (OP[0]) ? SEXT5( OP[0] ) : State.regs[ OP[1] ];
3084 trace_output (OP_IMM_REG_REG);
3090 /* end-sanitize-v850e */
3091 /* start-sanitize-v850e */
3096 trace_input ("ctret", OP_NONE, 0);
3101 trace_output (OP_NONE);
3106 /* end-sanitize-v850e */
3107 /* start-sanitize-v850e */
3112 unsigned long value;
3114 trace_input ("hsw", OP_REG_REG3, 0);
3116 value = State.regs[ OP[ 1 ] ];
3118 value |= (State.regs[ OP[ 1 ] ] << 16);
3120 State.regs[ OP[2] >> 11 ] = value;
3122 PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
3124 if (value == 0) PSW |= PSW_Z;
3125 if (value & 0x80000000) PSW |= PSW_S;
3126 if (((value & 0xffff) == 0) || (value & 0xffff0000) == 0) PSW |= PSW_CY;
3128 trace_output (OP_REG_REG3);
3133 /* end-sanitize-v850e */
3134 /* start-sanitize-v850e */
3135 #define WORDHASNULLBYTE(x) (((x) - 0x01010101) & ~(x)&0x80808080)
3141 unsigned long value;
3143 trace_input ("bsw", OP_REG_REG3, 0);
3145 value = State.regs[ OP[ 1 ] ];
3147 value |= (State.regs[ OP[ 1 ] ] << 24);
3148 value |= ((State.regs[ OP[ 1 ] ] << 8) & 0x00ff0000);
3149 value |= ((State.regs[ OP[ 1 ] ] >> 8) & 0x0000ff00);
3151 State.regs[ OP[2] >> 11 ] = value;
3153 PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
3155 if (value == 0) PSW |= PSW_Z;
3156 if (value & 0x80000000) PSW |= PSW_S;
3157 if (WORDHASNULLBYTE (value)) PSW |= PSW_CY;
3159 trace_output (OP_REG_REG3);
3164 /* end-sanitize-v850e */
3165 /* start-sanitize-v850e */
3170 unsigned long value;
3172 trace_input ("bsh", OP_REG_REG3, 0);
3174 value = State.regs[ OP[ 1 ] ];
3176 value |= ((State.regs[ OP[ 1 ] ] << 8) & 0xff00ff00);
3177 value |= ((State.regs[ OP[ 1 ] ] >> 8) & 0x000000ff);
3179 State.regs[ OP[2] >> 11 ] = value;
3181 PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
3183 if (value == 0) PSW |= PSW_Z;
3184 if (value & 0x80000000) PSW |= PSW_S;
3185 if (((value & 0xff) == 0) || (value & 0x00ff) == 0) PSW |= PSW_CY;
3187 trace_output (OP_REG_REG3);
3192 /* end-sanitize-v850e */
3193 /* start-sanitize-v850e */
3203 trace_input ("pushml", OP_PUSHPOP3, 0);
3205 /* Store the registers with lower number registers being placed at higher addresses. */
3206 for (i = 0; i < 15; i++)
3207 if ((OP[3] & (1 << type3_regs[ i ])))
3210 store_mem (SP & ~ 3, 4, State.regs[ i + 1 ]);
3213 if (OP[3] & (1 << 3))
3217 store_mem (SP & ~ 3, 4, PSW);
3220 if (OP[3] & (1 << 19))
3224 if ((PSW & PSW_NP) && ((PSW & PSW_EP) == 0))
3226 store_mem ((SP + 4) & ~ 3, 4, FEPC);
3227 store_mem ( SP & ~ 3, 4, FEPSW);
3231 store_mem ((SP + 4) & ~ 3, 4, EIPC);
3232 store_mem ( SP & ~ 3, 4, EIPSW);
3236 trace_output (OP_PUSHPOP2);
3242 trace_input ("ld.hu", OP_LOAD32, 2);
3244 adr = State.regs[ OP[0] ] + EXTEND16 (OP[2] & ~1);
3247 State.regs[ OP[1] ] = load_mem (adr, 2);
3249 trace_output (OP_LOAD32);
3255 /* end-sanitize-v850e */
3256 /* start-sanitize-v850e */
3257 /* prepare list12, imm5 */
3266 trace_input ("prepare", OP_PUSHPOP1, 0);
3268 /* Store the registers with lower number registers being placed at higher addresses. */
3269 for (i = 0; i < 12; i++)
3270 if ((OP[3] & (1 << type1_regs[ i ])))
3273 store_mem (SP, 4, State.regs[ 20 + i ]);
3276 SP -= (OP[3] & 0x3e) << 1;
3278 trace_output (OP_PUSHPOP1);
3284 trace_input ("ld.bu", OP_LOAD32, 1);
3286 adr = (State.regs[ OP[0] ]
3287 + (EXTEND16 (OP[2] & ~1) | ((OP[3] >> 5) & 1)));
3289 State.regs[ OP[1] ] = load_mem (adr, 1);
3291 trace_output (OP_LOAD32);
3297 /* prepare list12, imm5, imm32 */
3303 trace_input ("prepare", OP_PUSHPOP1, 0);
3305 /* Store the registers with lower number registers being placed at higher addresses. */
3306 for (i = 0; i < 12; i++)
3307 if ((OP[3] & (1 << type1_regs[ i ])))
3310 store_mem (SP, 4, State.regs[ 20 + i ]);
3313 SP -= (OP[3] & 0x3e) << 1;
3315 EP = load_mem (PC + 4, 4);
3317 trace_output (OP_PUSHPOP1);
3322 /* prepare list12, imm5, imm16-32 */
3328 trace_input ("prepare", OP_PUSHPOP1, 0);
3330 /* Store the registers with lower number registers being placed at higher addresses. */
3331 for (i = 0; i < 12; i++)
3332 if ((OP[3] & (1 << type1_regs[ i ])))
3335 store_mem (SP, 4, State.regs[ 20 + i ]);
3338 SP -= (OP[3] & 0x3e) << 1;
3340 EP = load_mem (PC + 4, 2) << 16;
3342 trace_output (OP_PUSHPOP1);
3347 /* prepare list12, imm5, imm16 */
3353 trace_input ("prepare", OP_PUSHPOP1, 0);
3355 /* Store the registers with lower number registers being placed at higher addresses. */
3356 for (i = 0; i < 12; i++)
3357 if ((OP[3] & (1 << type1_regs[ i ])))
3360 store_mem (SP, 4, State.regs[ 20 + i ]);
3363 SP -= (OP[3] & 0x3e) << 1;
3365 EP = EXTEND16 (load_mem (PC + 4, 2));
3367 trace_output (OP_PUSHPOP1);
3372 /* prepare list12, imm5, sp */
3378 trace_input ("prepare", OP_PUSHPOP1, 0);
3380 /* Store the registers with lower number registers being placed at higher addresses. */
3381 for (i = 0; i < 12; i++)
3382 if ((OP[3] & (1 << type1_regs[ i ])))
3385 store_mem (SP, 4, State.regs[ 20 + i ]);
3388 SP -= (OP[3] & 0x3e) << 1;
3392 trace_output (OP_PUSHPOP1);
3397 /* end-sanitize-v850e */
3398 /* start-sanitize-v850e */
3403 unsigned long result;
3405 result = load_mem (State.regs[30] + ((OP[3] & 0xf) << 1), 2);
3407 /* start-sanitize-v850eq */
3409 trace_input ("sld.h", OP_LOAD16, 2);
3411 State.regs[ OP[1] ] = EXTEND16 (result);
3413 /* end-sanitize-v850eq */
3414 trace_input ("sld.hu", OP_LOAD16, 2);
3416 State.regs[ OP[1] ] = result;
3417 /* start-sanitize-v850eq */
3419 /* end-sanitize-v850eq */
3421 trace_output (OP_LOAD16);
3426 /* end-sanitize-v850e */
3427 /* start-sanitize-v850e */
3428 /* cmov reg1, reg2, reg3 */
3432 trace_input ("cmov", OP_REG_REG_REG, 0);
3434 State.regs[ OP[2] >> 11 ] = condition_met (OP[0]) ? State.regs[ OP[0] ] : State.regs[ OP[1] ];
3436 trace_output (OP_REG_REG_REG);
3441 /* end-sanitize-v850e */
3442 /* start-sanitize-v850e */
3443 /* mul reg1, reg2, reg3 */
3447 trace_input ("mul", OP_REG_REG_REG, 0);
3449 Multiply64 (true, State.regs[ OP[0] ]);
3451 trace_output (OP_REG_REG_REG);
3456 /* end-sanitize-v850e */
3457 /* start-sanitize-v850eq */
3465 trace_input ("popmh", OP_PUSHPOP2, 0);
3467 if (OP[3] & (1 << 19))
3469 if ((PSW & PSW_NP) && ((PSW & PSW_EP) == 0))
3471 FEPSW = load_mem ( SP & ~ 3, 4);
3472 FEPC = load_mem ((SP + 4) & ~ 3, 4);
3476 EIPSW = load_mem ( SP & ~ 3, 4);
3477 EIPC = load_mem ((SP + 4) & ~ 3, 4);
3483 /* Load the registers with lower number registers being retrieved from higher addresses. */
3485 if ((OP[3] & (1 << type2_regs[ i ])))
3487 State.regs[ i + 16 ] = load_mem (SP & ~ 3, 4);
3491 trace_output (OP_PUSHPOP2);
3502 trace_input ("popml", OP_PUSHPOP3, 0);
3504 if (OP[3] & (1 << 19))
3506 if ((PSW & PSW_NP) && ((PSW & PSW_EP) == 0))
3508 FEPSW = load_mem ( SP & ~ 3, 4);
3509 FEPC = load_mem ((SP + 4) & ~ 3, 4);
3513 EIPSW = load_mem ( SP & ~ 3, 4);
3514 EIPC = load_mem ((SP + 4) & ~ 3, 4);
3520 if (OP[3] & (1 << 3))
3522 PSW = load_mem (SP & ~ 3, 4);
3526 /* Load the registers with lower number registers being retrieved from higher addresses. */
3528 if ((OP[3] & (1 << type3_regs[ i ])))
3530 State.regs[ i + 1 ] = load_mem (SP & ~ 3, 4);
3534 trace_output (OP_PUSHPOP2);
3545 trace_input ("pushmh", OP_PUSHPOP2, 0);
3547 /* Store the registers with lower number registers being placed at higher addresses. */
3548 for (i = 0; i < 16; i++)
3549 if ((OP[3] & (1 << type2_regs[ i ])))
3552 store_mem (SP & ~ 3, 4, State.regs[ i + 16 ]);
3555 if (OP[3] & (1 << 19))
3559 if ((PSW & PSW_NP) && ((PSW & PSW_EP) == 0))
3561 store_mem ((SP + 4) & ~ 3, 4, FEPC);
3562 store_mem ( SP & ~ 3, 4, FEPSW);
3566 store_mem ((SP + 4) & ~ 3, 4, EIPC);
3567 store_mem ( SP & ~ 3, 4, EIPSW);
3571 trace_output (OP_PUSHPOP2);
3576 /* end-sanitize-v850eq */