simops.c revision 1.10 1 1.1 christos /* Simulation code for the CR16 processor.
2 1.10 christos Copyright (C) 2008-2023 Free Software Foundation, Inc.
3 1.1 christos Contributed by M Ranga Swami Reddy <MR.Swami.Reddy (at) nsc.com>
4 1.1 christos
5 1.1 christos This file is part of GDB, the GNU debugger.
6 1.1 christos
7 1.1 christos This program is free software; you can redistribute it and/or modify
8 1.1 christos it under the terms of the GNU General Public License as published by
9 1.1 christos the Free Software Foundation; either version 3, or (at your option)
10 1.1 christos any later version.
11 1.1 christos
12 1.1 christos This program is distributed in the hope that it will be useful,
13 1.1 christos but WITHOUT ANY WARRANTY; without even the implied warranty of
14 1.1 christos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 1.1 christos GNU General Public License for more details.
16 1.1 christos
17 1.1 christos You should have received a copy of the GNU General Public License
18 1.1 christos along with this program. If not, see <http://www.gnu.org/licenses/>. */
19 1.1 christos
20 1.10 christos /* This must come before any other includes. */
21 1.10 christos #include "defs.h"
22 1.1 christos
23 1.1 christos #include <signal.h>
24 1.1 christos #include <errno.h>
25 1.1 christos #include <sys/types.h>
26 1.1 christos #include <sys/stat.h>
27 1.1 christos #ifdef HAVE_UNISTD_H
28 1.1 christos #include <unistd.h>
29 1.1 christos #endif
30 1.1 christos #include <string.h>
31 1.5 christos #include <time.h>
32 1.5 christos #include <sys/time.h>
33 1.1 christos
34 1.5 christos #include "sim-main.h"
35 1.10 christos #include "sim-signal.h"
36 1.1 christos #include "simops.h"
37 1.10 christos #include "target-newlib-syscall.h"
38 1.1 christos
39 1.10 christos #ifdef HAVE_UTIME_H
40 1.5 christos #include <utime.h>
41 1.5 christos #endif
42 1.5 christos #include <sys/wait.h>
43 1.1 christos
44 1.6 christos #define EXCEPTION(sig) sim_engine_halt (sd, cpu, NULL, PC, sim_stopped, sig)
45 1.6 christos
46 1.1 christos enum op_types {
47 1.1 christos OP_VOID,
48 1.1 christos OP_CONSTANT3,
49 1.1 christos OP_UCONSTANT3,
50 1.1 christos OP_CONSTANT4,
51 1.1 christos OP_CONSTANT4_1,
52 1.1 christos OP_CONSTANT5,
53 1.1 christos OP_CONSTANT6,
54 1.1 christos OP_CONSTANT16,
55 1.1 christos OP_UCONSTANT16,
56 1.1 christos OP_CONSTANT20,
57 1.1 christos OP_UCONSTANT20,
58 1.1 christos OP_CONSTANT32,
59 1.1 christos OP_UCONSTANT32,
60 1.1 christos OP_MEMREF,
61 1.1 christos OP_MEMREF2,
62 1.1 christos OP_MEMREF3,
63 1.1 christos
64 1.1 christos OP_DISP5,
65 1.1 christos OP_DISP17,
66 1.1 christos OP_DISP25,
67 1.1 christos OP_DISPE9,
68 1.1 christos //OP_ABS20,
69 1.1 christos OP_ABS20_OUTPUT,
70 1.1 christos //OP_ABS24,
71 1.1 christos OP_ABS24_OUTPUT,
72 1.1 christos
73 1.1 christos OP_R_BASE_DISPS16,
74 1.1 christos OP_R_BASE_DISP20,
75 1.1 christos OP_R_BASE_DISPS20,
76 1.1 christos OP_R_BASE_DISPE20,
77 1.1 christos
78 1.1 christos OP_RP_BASE_DISPE0,
79 1.1 christos OP_RP_BASE_DISP4,
80 1.1 christos OP_RP_BASE_DISPE4,
81 1.1 christos OP_RP_BASE_DISP14,
82 1.1 christos OP_RP_BASE_DISP16,
83 1.1 christos OP_RP_BASE_DISP20,
84 1.1 christos OP_RP_BASE_DISPS20,
85 1.1 christos OP_RP_BASE_DISPE20,
86 1.1 christos
87 1.1 christos OP_R_INDEX7_ABS20,
88 1.1 christos OP_R_INDEX8_ABS20,
89 1.1 christos
90 1.1 christos OP_RP_INDEX_DISP0,
91 1.1 christos OP_RP_INDEX_DISP14,
92 1.1 christos OP_RP_INDEX_DISP20,
93 1.1 christos OP_RP_INDEX_DISPS20,
94 1.1 christos
95 1.1 christos OP_REG,
96 1.1 christos OP_REGP,
97 1.1 christos OP_PROC_REG,
98 1.1 christos OP_PROC_REGP,
99 1.1 christos OP_COND,
100 1.1 christos OP_RA
101 1.1 christos };
102 1.1 christos
103 1.1 christos
104 1.1 christos enum {
105 1.1 christos PSR_MASK = (PSR_I_BIT
106 1.1 christos | PSR_P_BIT
107 1.1 christos | PSR_E_BIT
108 1.1 christos | PSR_N_BIT
109 1.1 christos | PSR_Z_BIT
110 1.1 christos | PSR_F_BIT
111 1.1 christos | PSR_U_BIT
112 1.1 christos | PSR_L_BIT
113 1.1 christos | PSR_T_BIT
114 1.1 christos | PSR_C_BIT),
115 1.1 christos /* The following bits in the PSR _can't_ be set by instructions such
116 1.1 christos as mvtc. */
117 1.1 christos PSR_HW_MASK = (PSR_MASK)
118 1.1 christos };
119 1.1 christos
120 1.1 christos /* cond Code Condition True State
121 1.1 christos * EQ Equal Z flag is 1
122 1.1 christos * NE Not Equal Z flag is 0
123 1.1 christos * CS Carry Set C flag is 1
124 1.1 christos * CC Carry Clear C flag is 0
125 1.1 christos * HI Higher L flag is 1
126 1.1 christos * LS Lower or Same L flag is 0
127 1.1 christos * GT Greater Than N flag is 1
128 1.1 christos * LE Less Than or Equal To N flag is 0
129 1.1 christos * FS Flag Set F flag is 1
130 1.1 christos * FC Flag Clear F flag is 0
131 1.1 christos * LO Lower Z and L flags are 0
132 1.1 christos * HS Higher or Same Z or L flag is 1
133 1.1 christos * LT Less Than Z and N flags are 0
134 1.1 christos * GE Greater Than or Equal To Z or N flag is 1. */
135 1.1 christos
136 1.5 christos static int cond_stat(int cc)
137 1.1 christos {
138 1.1 christos switch (cc)
139 1.1 christos {
140 1.1 christos case 0: return PSR_Z; break;
141 1.1 christos case 1: return !PSR_Z; break;
142 1.1 christos case 2: return PSR_C; break;
143 1.1 christos case 3: return !PSR_C; break;
144 1.1 christos case 4: return PSR_L; break;
145 1.1 christos case 5: return !PSR_L; break;
146 1.1 christos case 6: return PSR_N; break;
147 1.1 christos case 7: return !PSR_N; break;
148 1.1 christos case 8: return PSR_F; break;
149 1.1 christos case 9: return !PSR_F; break;
150 1.1 christos case 10: return !PSR_Z && !PSR_L; break;
151 1.1 christos case 11: return PSR_Z || PSR_L; break;
152 1.1 christos case 12: return !PSR_Z && !PSR_N; break;
153 1.1 christos case 13: return PSR_Z || PSR_N; break;
154 1.1 christos case 14: return 1; break; /*ALWAYS. */
155 1.1 christos default:
156 1.1 christos // case NEVER: return false; break;
157 1.1 christos //case NO_COND_CODE:
158 1.1 christos //panic("Shouldn't have NO_COND_CODE in an actual instruction!");
159 1.1 christos return 0; break;
160 1.1 christos }
161 1.1 christos return 0;
162 1.1 christos }
163 1.1 christos
164 1.1 christos
165 1.1 christos creg_t
166 1.6 christos move_to_cr (SIM_DESC sd, SIM_CPU *cpu, int cr, creg_t mask, creg_t val, int psw_hw_p)
167 1.1 christos {
168 1.1 christos /* A MASK bit is set when the corresponding bit in the CR should
169 1.1 christos be left alone. */
170 1.1 christos /* This assumes that (VAL & MASK) == 0. */
171 1.1 christos switch (cr)
172 1.1 christos {
173 1.1 christos case PSR_CR:
174 1.1 christos if (psw_hw_p)
175 1.1 christos val &= PSR_HW_MASK;
176 1.1 christos #if 0
177 1.1 christos else
178 1.1 christos val &= PSR_MASK;
179 1.6 christos sim_io_printf
180 1.6 christos (sd,
181 1.1 christos "ERROR at PC 0x%x: ST can only be set when FX is set.\n", PC);
182 1.6 christos EXCEPTION (SIM_SIGILL);
183 1.1 christos #endif
184 1.1 christos /* keep an up-to-date psw around for tracing. */
185 1.1 christos State.trace.psw = (State.trace.psw & mask) | val;
186 1.1 christos break;
187 1.1 christos default:
188 1.1 christos break;
189 1.1 christos }
190 1.1 christos /* only issue an update if the register is being changed. */
191 1.1 christos if ((State.cregs[cr] & ~mask) != val)
192 1.1 christos SLOT_PEND_MASK (State.cregs[cr], mask, val);
193 1.1 christos
194 1.1 christos return val;
195 1.1 christos }
196 1.1 christos
197 1.1 christos #ifdef DEBUG
198 1.6 christos static void trace_input_func (SIM_DESC sd,
199 1.6 christos const char *name,
200 1.1 christos enum op_types in1,
201 1.1 christos enum op_types in2,
202 1.1 christos enum op_types in3);
203 1.1 christos
204 1.6 christos #define trace_input(name, in1, in2, in3) do { if (cr16_debug) trace_input_func (sd, name, in1, in2, in3); } while (0)
205 1.1 christos
206 1.1 christos #ifndef SIZE_INSTRUCTION
207 1.1 christos #define SIZE_INSTRUCTION 8
208 1.1 christos #endif
209 1.1 christos
210 1.1 christos #ifndef SIZE_OPERANDS
211 1.1 christos #define SIZE_OPERANDS 18
212 1.1 christos #endif
213 1.1 christos
214 1.1 christos #ifndef SIZE_VALUES
215 1.1 christos #define SIZE_VALUES 13
216 1.1 christos #endif
217 1.1 christos
218 1.1 christos #ifndef SIZE_LOCATION
219 1.1 christos #define SIZE_LOCATION 20
220 1.1 christos #endif
221 1.1 christos
222 1.1 christos #ifndef SIZE_PC
223 1.1 christos #define SIZE_PC 4
224 1.1 christos #endif
225 1.1 christos
226 1.1 christos #ifndef SIZE_LINE_NUMBER
227 1.1 christos #define SIZE_LINE_NUMBER 2
228 1.1 christos #endif
229 1.1 christos
230 1.1 christos static void
231 1.6 christos trace_input_func (SIM_DESC sd, const char *name, enum op_types in1, enum op_types in2, enum op_types in3)
232 1.1 christos {
233 1.1 christos char *comma;
234 1.1 christos enum op_types in[3];
235 1.1 christos int i;
236 1.1 christos char buf[1024];
237 1.1 christos char *p;
238 1.1 christos long tmp;
239 1.1 christos char *type;
240 1.1 christos const char *filename;
241 1.1 christos const char *functionname;
242 1.1 christos unsigned int linenumber;
243 1.1 christos bfd_vma byte_pc;
244 1.1 christos
245 1.1 christos if ((cr16_debug & DEBUG_TRACE) == 0)
246 1.1 christos return;
247 1.1 christos
248 1.1 christos switch (State.ins_type)
249 1.1 christos {
250 1.1 christos default:
251 1.1 christos case INS_UNKNOWN: type = " ?"; break;
252 1.1 christos }
253 1.1 christos
254 1.1 christos if ((cr16_debug & DEBUG_LINE_NUMBER) == 0)
255 1.6 christos sim_io_printf (sd,
256 1.1 christos "0x%.*x %s: %-*s ",
257 1.1 christos SIZE_PC, (unsigned)PC,
258 1.1 christos type,
259 1.1 christos SIZE_INSTRUCTION, name);
260 1.1 christos
261 1.1 christos else
262 1.1 christos {
263 1.1 christos buf[0] = '\0';
264 1.5 christos byte_pc = PC;
265 1.6 christos if (STATE_TEXT_SECTION (sd)
266 1.6 christos && byte_pc >= STATE_TEXT_START (sd)
267 1.6 christos && byte_pc < STATE_TEXT_END (sd))
268 1.1 christos {
269 1.1 christos filename = (const char *)0;
270 1.1 christos functionname = (const char *)0;
271 1.1 christos linenumber = 0;
272 1.6 christos if (bfd_find_nearest_line (STATE_PROG_BFD (sd),
273 1.6 christos STATE_TEXT_SECTION (sd),
274 1.5 christos (struct bfd_symbol **)0,
275 1.6 christos byte_pc - STATE_TEXT_START (sd),
276 1.1 christos &filename, &functionname, &linenumber))
277 1.1 christos {
278 1.1 christos p = buf;
279 1.1 christos if (linenumber)
280 1.1 christos {
281 1.1 christos sprintf (p, "#%-*d ", SIZE_LINE_NUMBER, linenumber);
282 1.1 christos p += strlen (p);
283 1.1 christos }
284 1.1 christos else
285 1.1 christos {
286 1.1 christos sprintf (p, "%-*s ", SIZE_LINE_NUMBER+1, "---");
287 1.1 christos p += SIZE_LINE_NUMBER+2;
288 1.1 christos }
289 1.1 christos
290 1.1 christos if (functionname)
291 1.1 christos {
292 1.1 christos sprintf (p, "%s ", functionname);
293 1.1 christos p += strlen (p);
294 1.1 christos }
295 1.1 christos else if (filename)
296 1.1 christos {
297 1.1 christos char *q = strrchr (filename, '/');
298 1.1 christos sprintf (p, "%s ", (q) ? q+1 : filename);
299 1.1 christos p += strlen (p);
300 1.1 christos }
301 1.1 christos
302 1.1 christos if (*p == ' ')
303 1.1 christos *p = '\0';
304 1.1 christos }
305 1.1 christos }
306 1.1 christos
307 1.6 christos sim_io_printf (sd,
308 1.1 christos "0x%.*x %s: %-*.*s %-*s ",
309 1.1 christos SIZE_PC, (unsigned)PC,
310 1.1 christos type,
311 1.1 christos SIZE_LOCATION, SIZE_LOCATION, buf,
312 1.1 christos SIZE_INSTRUCTION, name);
313 1.1 christos }
314 1.1 christos
315 1.1 christos in[0] = in1;
316 1.1 christos in[1] = in2;
317 1.1 christos in[2] = in3;
318 1.1 christos comma = "";
319 1.1 christos p = buf;
320 1.1 christos for (i = 0; i < 3; i++)
321 1.1 christos {
322 1.1 christos switch (in[i])
323 1.1 christos {
324 1.1 christos case OP_VOID:
325 1.1 christos break;
326 1.1 christos
327 1.1 christos case OP_REG:
328 1.1 christos case OP_REGP:
329 1.1 christos sprintf (p, "%sr%d", comma, OP[i]);
330 1.1 christos p += strlen (p);
331 1.1 christos comma = ",";
332 1.1 christos break;
333 1.1 christos
334 1.1 christos case OP_PROC_REG:
335 1.1 christos sprintf (p, "%scr%d", comma, OP[i]);
336 1.1 christos p += strlen (p);
337 1.1 christos comma = ",";
338 1.1 christos break;
339 1.1 christos
340 1.1 christos case OP_CONSTANT16:
341 1.1 christos sprintf (p, "%s%d", comma, OP[i]);
342 1.1 christos p += strlen (p);
343 1.1 christos comma = ",";
344 1.1 christos break;
345 1.1 christos
346 1.1 christos case OP_CONSTANT4:
347 1.1 christos sprintf (p, "%s%d", comma, SEXT4(OP[i]));
348 1.1 christos p += strlen (p);
349 1.1 christos comma = ",";
350 1.1 christos break;
351 1.1 christos
352 1.1 christos case OP_CONSTANT3:
353 1.1 christos sprintf (p, "%s%d", comma, SEXT3(OP[i]));
354 1.1 christos p += strlen (p);
355 1.1 christos comma = ",";
356 1.1 christos break;
357 1.1 christos
358 1.1 christos case OP_MEMREF:
359 1.1 christos sprintf (p, "%s@r%d", comma, OP[i]);
360 1.1 christos p += strlen (p);
361 1.1 christos comma = ",";
362 1.1 christos break;
363 1.1 christos
364 1.1 christos case OP_MEMREF2:
365 1.10 christos sprintf (p, "%s@(%d,r%d)", comma, (int16_t)OP[i], OP[i+1]);
366 1.1 christos p += strlen (p);
367 1.1 christos comma = ",";
368 1.1 christos break;
369 1.1 christos
370 1.1 christos case OP_MEMREF3:
371 1.1 christos sprintf (p, "%s@%d", comma, OP[i]);
372 1.1 christos p += strlen (p);
373 1.1 christos comma = ",";
374 1.1 christos break;
375 1.1 christos }
376 1.1 christos }
377 1.1 christos
378 1.1 christos if ((cr16_debug & DEBUG_VALUES) == 0)
379 1.1 christos {
380 1.1 christos *p++ = '\n';
381 1.1 christos *p = '\0';
382 1.6 christos sim_io_printf (sd, "%s", buf);
383 1.1 christos }
384 1.1 christos else
385 1.1 christos {
386 1.1 christos *p = '\0';
387 1.6 christos sim_io_printf (sd, "%-*s", SIZE_OPERANDS, buf);
388 1.1 christos
389 1.1 christos p = buf;
390 1.1 christos for (i = 0; i < 3; i++)
391 1.1 christos {
392 1.1 christos buf[0] = '\0';
393 1.1 christos switch (in[i])
394 1.1 christos {
395 1.1 christos case OP_VOID:
396 1.6 christos sim_io_printf (sd, "%*s", SIZE_VALUES, "");
397 1.1 christos break;
398 1.1 christos
399 1.1 christos case OP_REG:
400 1.6 christos sim_io_printf (sd, "%*s0x%.4x", SIZE_VALUES-6, "",
401 1.10 christos (uint16_t) GPR (OP[i]));
402 1.1 christos break;
403 1.1 christos
404 1.1 christos case OP_REGP:
405 1.10 christos tmp = (long)((((uint32_t) GPR (OP[i])) << 16) | ((uint32_t) GPR (OP[i] + 1)));
406 1.6 christos sim_io_printf (sd, "%*s0x%.8lx", SIZE_VALUES-10, "", tmp);
407 1.1 christos break;
408 1.1 christos
409 1.1 christos case OP_PROC_REG:
410 1.6 christos sim_io_printf (sd, "%*s0x%.4x", SIZE_VALUES-6, "",
411 1.10 christos (uint16_t) CREG (OP[i]));
412 1.1 christos break;
413 1.1 christos
414 1.1 christos case OP_CONSTANT16:
415 1.6 christos sim_io_printf (sd, "%*s0x%.4x", SIZE_VALUES-6, "",
416 1.10 christos (uint16_t)OP[i]);
417 1.1 christos break;
418 1.1 christos
419 1.1 christos case OP_CONSTANT4:
420 1.6 christos sim_io_printf (sd, "%*s0x%.4x", SIZE_VALUES-6, "",
421 1.10 christos (uint16_t)SEXT4(OP[i]));
422 1.1 christos break;
423 1.1 christos
424 1.1 christos case OP_CONSTANT3:
425 1.6 christos sim_io_printf (sd, "%*s0x%.4x", SIZE_VALUES-6, "",
426 1.10 christos (uint16_t)SEXT3(OP[i]));
427 1.1 christos break;
428 1.1 christos
429 1.1 christos case OP_MEMREF2:
430 1.6 christos sim_io_printf (sd, "%*s0x%.4x", SIZE_VALUES-6, "",
431 1.10 christos (uint16_t)OP[i]);
432 1.6 christos sim_io_printf (sd, "%*s0x%.4x", SIZE_VALUES-6, "",
433 1.10 christos (uint16_t)GPR (OP[i + 1]));
434 1.1 christos i++;
435 1.1 christos break;
436 1.1 christos }
437 1.1 christos }
438 1.1 christos }
439 1.1 christos
440 1.6 christos sim_io_flush_stdout (sd);
441 1.1 christos }
442 1.1 christos
443 1.1 christos static void
444 1.6 christos do_trace_output_flush (SIM_DESC sd)
445 1.1 christos {
446 1.6 christos sim_io_flush_stdout (sd);
447 1.1 christos }
448 1.1 christos
449 1.1 christos static void
450 1.6 christos do_trace_output_finish (SIM_DESC sd)
451 1.1 christos {
452 1.6 christos sim_io_printf (sd,
453 1.1 christos " F0=%d F1=%d C=%d\n",
454 1.1 christos (State.trace.psw & PSR_F_BIT) != 0,
455 1.1 christos (State.trace.psw & PSR_F_BIT) != 0,
456 1.1 christos (State.trace.psw & PSR_C_BIT) != 0);
457 1.6 christos sim_io_flush_stdout (sd);
458 1.1 christos }
459 1.1 christos
460 1.5 christos #if 0
461 1.1 christos static void
462 1.10 christos trace_output_40 (SIM_DESC sd, uint64_t val)
463 1.1 christos {
464 1.1 christos if ((cr16_debug & (DEBUG_TRACE | DEBUG_VALUES)) == (DEBUG_TRACE | DEBUG_VALUES))
465 1.1 christos {
466 1.6 christos sim_io_printf (sd,
467 1.1 christos " :: %*s0x%.2x%.8lx",
468 1.1 christos SIZE_VALUES - 12,
469 1.1 christos "",
470 1.1 christos ((int)(val >> 32) & 0xff),
471 1.1 christos ((unsigned long) val) & 0xffffffff);
472 1.1 christos do_trace_output_finish ();
473 1.1 christos }
474 1.1 christos }
475 1.5 christos #endif
476 1.1 christos
477 1.1 christos static void
478 1.10 christos trace_output_32 (SIM_DESC sd, uint32_t val)
479 1.1 christos {
480 1.1 christos if ((cr16_debug & (DEBUG_TRACE | DEBUG_VALUES)) == (DEBUG_TRACE | DEBUG_VALUES))
481 1.1 christos {
482 1.6 christos sim_io_printf (sd,
483 1.1 christos " :: %*s0x%.8x",
484 1.1 christos SIZE_VALUES - 10,
485 1.1 christos "",
486 1.1 christos (int) val);
487 1.6 christos do_trace_output_finish (sd);
488 1.1 christos }
489 1.1 christos }
490 1.1 christos
491 1.1 christos static void
492 1.10 christos trace_output_16 (SIM_DESC sd, uint16_t val)
493 1.1 christos {
494 1.1 christos if ((cr16_debug & (DEBUG_TRACE | DEBUG_VALUES)) == (DEBUG_TRACE | DEBUG_VALUES))
495 1.1 christos {
496 1.6 christos sim_io_printf (sd,
497 1.1 christos " :: %*s0x%.4x",
498 1.1 christos SIZE_VALUES - 6,
499 1.1 christos "",
500 1.1 christos (int) val);
501 1.6 christos do_trace_output_finish (sd);
502 1.1 christos }
503 1.1 christos }
504 1.1 christos
505 1.1 christos static void
506 1.6 christos trace_output_void (SIM_DESC sd)
507 1.1 christos {
508 1.1 christos if ((cr16_debug & (DEBUG_TRACE | DEBUG_VALUES)) == (DEBUG_TRACE | DEBUG_VALUES))
509 1.1 christos {
510 1.6 christos sim_io_printf (sd, "\n");
511 1.6 christos do_trace_output_flush (sd);
512 1.1 christos }
513 1.1 christos }
514 1.1 christos
515 1.1 christos static void
516 1.6 christos trace_output_flag (SIM_DESC sd)
517 1.1 christos {
518 1.1 christos if ((cr16_debug & (DEBUG_TRACE | DEBUG_VALUES)) == (DEBUG_TRACE | DEBUG_VALUES))
519 1.1 christos {
520 1.6 christos sim_io_printf (sd,
521 1.1 christos " :: %*s",
522 1.1 christos SIZE_VALUES,
523 1.1 christos "");
524 1.6 christos do_trace_output_finish (sd);
525 1.1 christos }
526 1.1 christos }
527 1.1 christos
528 1.1 christos
529 1.1 christos
530 1.1 christos
531 1.1 christos #else
532 1.1 christos #define trace_input(NAME, IN1, IN2, IN3)
533 1.1 christos #define trace_output(RESULT)
534 1.1 christos #endif
535 1.1 christos
536 1.1 christos /* addub. */
537 1.1 christos void
538 1.6 christos OP_2C_8 (SIM_DESC sd, SIM_CPU *cpu)
539 1.1 christos {
540 1.10 christos uint8_t tmp;
541 1.10 christos uint8_t a = OP[0] & 0xff;
542 1.10 christos uint16_t b = (GPR (OP[1])) & 0xff;
543 1.1 christos trace_input ("addub", OP_CONSTANT4_1, OP_REG, OP_VOID);
544 1.1 christos tmp = (a + b) & 0xff;
545 1.1 christos SET_GPR (OP[1], (tmp | ((GPR (OP[1])) & 0xff00)));
546 1.6 christos trace_output_16 (sd, tmp);
547 1.1 christos }
548 1.1 christos
549 1.1 christos /* addub. */
550 1.1 christos void
551 1.6 christos OP_2CB_C (SIM_DESC sd, SIM_CPU *cpu)
552 1.1 christos {
553 1.10 christos uint16_t tmp;
554 1.10 christos uint8_t a = ((OP[0]) & 0xff), b = (GPR (OP[1])) & 0xff;
555 1.1 christos trace_input ("addub", OP_CONSTANT16, OP_REG, OP_VOID);
556 1.1 christos tmp = (a + b) & 0xff;
557 1.1 christos SET_GPR (OP[1], (tmp | ((GPR (OP[1])) & 0xff00)));
558 1.6 christos trace_output_16 (sd, tmp);
559 1.1 christos }
560 1.1 christos
561 1.1 christos /* addub. */
562 1.1 christos void
563 1.6 christos OP_2D_8 (SIM_DESC sd, SIM_CPU *cpu)
564 1.1 christos {
565 1.10 christos uint8_t a = (GPR (OP[0])) & 0xff;
566 1.10 christos uint8_t b = (GPR (OP[1])) & 0xff;
567 1.10 christos uint16_t tmp = (a + b) & 0xff;
568 1.1 christos trace_input ("addub", OP_REG, OP_REG, OP_VOID);
569 1.1 christos SET_GPR (OP[1], (tmp | ((GPR (OP[1])) & 0xff00)));
570 1.6 christos trace_output_16 (sd, tmp);
571 1.1 christos }
572 1.1 christos
573 1.1 christos /* adduw. */
574 1.1 christos void
575 1.6 christos OP_2E_8 (SIM_DESC sd, SIM_CPU *cpu)
576 1.1 christos {
577 1.10 christos uint16_t a = OP[0];
578 1.10 christos uint16_t b = GPR (OP[1]);
579 1.10 christos uint16_t tmp = (a + b);
580 1.1 christos trace_input ("adduw", OP_CONSTANT4_1, OP_REG, OP_VOID);
581 1.1 christos SET_GPR (OP[1], tmp);
582 1.6 christos trace_output_16 (sd, tmp);
583 1.1 christos }
584 1.1 christos
585 1.1 christos /* adduw. */
586 1.1 christos void
587 1.6 christos OP_2EB_C (SIM_DESC sd, SIM_CPU *cpu)
588 1.1 christos {
589 1.10 christos uint16_t a = OP[0];
590 1.10 christos uint16_t b = GPR (OP[1]);
591 1.10 christos uint16_t tmp = (a + b);
592 1.1 christos trace_input ("adduw", OP_CONSTANT16, OP_REG, OP_VOID);
593 1.1 christos SET_GPR (OP[1], tmp);
594 1.6 christos trace_output_16 (sd, tmp);
595 1.1 christos }
596 1.1 christos
597 1.1 christos /* adduw. */
598 1.1 christos void
599 1.6 christos OP_2F_8 (SIM_DESC sd, SIM_CPU *cpu)
600 1.1 christos {
601 1.10 christos uint16_t a = GPR (OP[0]);
602 1.10 christos uint16_t b = GPR (OP[1]);
603 1.10 christos uint16_t tmp = (a + b);
604 1.1 christos trace_input ("adduw", OP_REG, OP_REG, OP_VOID);
605 1.1 christos SET_GPR (OP[1], tmp);
606 1.6 christos trace_output_16 (sd, tmp);
607 1.1 christos }
608 1.1 christos
609 1.1 christos /* addb. */
610 1.1 christos void
611 1.6 christos OP_30_8 (SIM_DESC sd, SIM_CPU *cpu)
612 1.1 christos {
613 1.10 christos uint8_t a = OP[0];
614 1.10 christos uint8_t b = (GPR (OP[1]) & 0xff);
615 1.10 christos uint16_t tmp = (a + b) & 0xff;
616 1.1 christos trace_input ("addb", OP_CONSTANT4_1, OP_REG, OP_VOID);
617 1.1 christos SET_GPR (OP[1], (tmp | ((GPR (OP[1])) & 0xff00)));
618 1.1 christos SET_PSR_C (tmp > 0xFF);
619 1.1 christos SET_PSR_F (((a & 0x80) == (b & 0x80)) && ((b & 0x80) != (tmp & 0x80)));
620 1.6 christos trace_output_16 (sd, tmp);
621 1.1 christos }
622 1.1 christos
623 1.1 christos /* addb. */
624 1.1 christos void
625 1.6 christos OP_30B_C (SIM_DESC sd, SIM_CPU *cpu)
626 1.1 christos {
627 1.10 christos uint8_t a = (OP[0]) & 0xff;
628 1.10 christos uint8_t b = (GPR (OP[1]) & 0xff);
629 1.10 christos uint16_t tmp = (a + b) & 0xff;
630 1.1 christos trace_input ("addb", OP_CONSTANT16, OP_REG, OP_VOID);
631 1.1 christos SET_GPR (OP[1], (tmp | ((GPR (OP[1])) & 0xff00)));
632 1.1 christos SET_PSR_C (tmp > 0xFF);
633 1.1 christos SET_PSR_F (((a & 0x80) == (b & 0x80)) && ((b & 0x80) != (tmp & 0x80)));
634 1.6 christos trace_output_16 (sd, tmp);
635 1.1 christos }
636 1.1 christos
637 1.1 christos /* addb. */
638 1.1 christos void
639 1.6 christos OP_31_8 (SIM_DESC sd, SIM_CPU *cpu)
640 1.1 christos {
641 1.10 christos uint8_t a = (GPR (OP[0]) & 0xff);
642 1.10 christos uint8_t b = (GPR (OP[1]) & 0xff);
643 1.10 christos uint16_t tmp = (a + b) & 0xff;
644 1.1 christos trace_input ("addb", OP_REG, OP_REG, OP_VOID);
645 1.1 christos SET_GPR (OP[1], (tmp | ((GPR (OP[1])) & 0xff00)));
646 1.1 christos SET_PSR_C (tmp > 0xFF);
647 1.1 christos SET_PSR_F (((a & 0x80) == (b & 0x80)) && ((b & 0x80) != (tmp & 0x80)));
648 1.6 christos trace_output_16 (sd, tmp);
649 1.1 christos }
650 1.1 christos
651 1.1 christos /* addw. */
652 1.1 christos void
653 1.6 christos OP_32_8 (SIM_DESC sd, SIM_CPU *cpu)
654 1.1 christos {
655 1.10 christos int16_t a = OP[0];
656 1.10 christos uint16_t tmp, b = GPR (OP[1]);
657 1.5 christos tmp = (a + b);
658 1.1 christos trace_input ("addw", OP_CONSTANT4_1, OP_REG, OP_VOID);
659 1.1 christos SET_GPR (OP[1], tmp);
660 1.1 christos SET_PSR_C (tmp > 0xFFFF);
661 1.1 christos SET_PSR_F (((a & 0x8000) == (b & 0x8000)) && ((b & 0x8000) != (tmp & 0x8000)));
662 1.6 christos trace_output_16 (sd, tmp);
663 1.1 christos }
664 1.1 christos
665 1.1 christos /* addw. */
666 1.1 christos void
667 1.6 christos OP_32B_C (SIM_DESC sd, SIM_CPU *cpu)
668 1.1 christos {
669 1.10 christos int16_t a = OP[0];
670 1.10 christos uint16_t tmp, b = GPR (OP[1]);
671 1.1 christos tmp = (a + b);
672 1.1 christos trace_input ("addw", OP_CONSTANT16, OP_REG, OP_VOID);
673 1.1 christos SET_GPR (OP[1], tmp);
674 1.1 christos SET_PSR_C (tmp > 0xFFFF);
675 1.1 christos SET_PSR_F (((a & 0x8000) == (b & 0x8000)) && ((b & 0x8000) != (tmp & 0x8000)));
676 1.6 christos trace_output_16 (sd, tmp);
677 1.1 christos }
678 1.1 christos
679 1.1 christos /* addw. */
680 1.1 christos void
681 1.6 christos OP_33_8 (SIM_DESC sd, SIM_CPU *cpu)
682 1.1 christos {
683 1.10 christos uint16_t tmp, a = (GPR (OP[0])), b = (GPR (OP[1]));
684 1.1 christos trace_input ("addw", OP_REG, OP_REG, OP_VOID);
685 1.1 christos tmp = (a + b);
686 1.1 christos SET_GPR (OP[1], tmp);
687 1.1 christos SET_PSR_C (tmp > 0xFFFF);
688 1.1 christos SET_PSR_F (((a & 0x8000) == (b & 0x8000)) && ((b & 0x8000) != (tmp & 0x8000)));
689 1.6 christos trace_output_16 (sd, tmp);
690 1.1 christos }
691 1.1 christos
692 1.1 christos /* addcb. */
693 1.1 christos void
694 1.6 christos OP_34_8 (SIM_DESC sd, SIM_CPU *cpu)
695 1.1 christos {
696 1.10 christos uint8_t tmp, a = OP[0] & 0xff, b = (GPR (OP[1])) & 0xff;
697 1.1 christos trace_input ("addcb", OP_CONSTANT4_1, OP_REG, OP_REG);
698 1.1 christos tmp = (a + b + PSR_C) & 0xff;
699 1.1 christos SET_GPR (OP[1], (tmp | ((GPR (OP[1])) & 0xff00)));
700 1.1 christos SET_PSR_C (tmp > 0xFF);
701 1.1 christos SET_PSR_F (((a & 0x80) == (b & 0x80)) && ((b & 0x80) != (tmp & 0x80)));
702 1.6 christos trace_output_16 (sd, tmp);
703 1.1 christos }
704 1.1 christos
705 1.1 christos /* addcb. */
706 1.1 christos void
707 1.6 christos OP_34B_C (SIM_DESC sd, SIM_CPU *cpu)
708 1.1 christos {
709 1.10 christos int8_t a = OP[0] & 0xff;
710 1.10 christos uint8_t b = (GPR (OP[1])) & 0xff;
711 1.10 christos uint8_t tmp = (a + b + PSR_C) & 0xff;
712 1.1 christos trace_input ("addcb", OP_CONSTANT16, OP_REG, OP_VOID);
713 1.1 christos SET_GPR (OP[1], (tmp | ((GPR (OP[1])) & 0xff00)));
714 1.1 christos SET_PSR_C (tmp > 0xFF);
715 1.1 christos SET_PSR_F (((a & 0x80) == (b & 0x80)) && ((b & 0x80) != (tmp & 0x80)));
716 1.6 christos trace_output_16 (sd, tmp);
717 1.1 christos }
718 1.1 christos
719 1.1 christos /* addcb. */
720 1.1 christos void
721 1.6 christos OP_35_8 (SIM_DESC sd, SIM_CPU *cpu)
722 1.1 christos {
723 1.10 christos uint8_t a = (GPR (OP[0])) & 0xff;
724 1.10 christos uint8_t b = (GPR (OP[1])) & 0xff;
725 1.10 christos uint8_t tmp = (a + b + PSR_C) & 0xff;
726 1.1 christos trace_input ("addcb", OP_REG, OP_REG, OP_VOID);
727 1.1 christos SET_GPR (OP[1], (tmp | ((GPR (OP[1])) & 0xff00)));
728 1.1 christos SET_PSR_C (tmp > 0xFF);
729 1.1 christos SET_PSR_F (((a & 0x80) == (b & 0x80)) && ((b & 0x80) != (tmp & 0x80)));
730 1.6 christos trace_output_16 (sd, tmp);
731 1.1 christos }
732 1.1 christos
733 1.1 christos /* addcw. */
734 1.1 christos void
735 1.6 christos OP_36_8 (SIM_DESC sd, SIM_CPU *cpu)
736 1.1 christos {
737 1.10 christos uint16_t a = OP[0];
738 1.10 christos uint16_t b = GPR (OP[1]);
739 1.10 christos uint16_t tmp = (a + b + PSR_C);
740 1.1 christos trace_input ("addcw", OP_CONSTANT4_1, OP_REG, OP_VOID);
741 1.1 christos SET_GPR (OP[1], tmp);
742 1.1 christos SET_PSR_C (tmp > 0xFFFF);
743 1.1 christos SET_PSR_F (((a & 0x8000) == (b & 0x8000)) && ((b & 0x8000) != (tmp & 0x8000)));
744 1.6 christos trace_output_16 (sd, tmp);
745 1.1 christos }
746 1.1 christos
747 1.1 christos /* addcw. */
748 1.1 christos void
749 1.6 christos OP_36B_C (SIM_DESC sd, SIM_CPU *cpu)
750 1.1 christos {
751 1.10 christos int16_t a = OP[0];
752 1.10 christos uint16_t b = GPR (OP[1]);
753 1.10 christos uint16_t tmp = (a + b + PSR_C);
754 1.1 christos trace_input ("addcw", OP_CONSTANT16, OP_REG, OP_VOID);
755 1.1 christos SET_GPR (OP[1], tmp);
756 1.1 christos SET_PSR_C (tmp > 0xFFFF);
757 1.1 christos SET_PSR_F (((a & 0x8000) == (b & 0x8000)) && ((b & 0x8000) != (tmp & 0x8000)));
758 1.6 christos trace_output_16 (sd, tmp);
759 1.1 christos }
760 1.1 christos
761 1.1 christos /* addcw. */
762 1.1 christos void
763 1.6 christos OP_37_8 (SIM_DESC sd, SIM_CPU *cpu)
764 1.1 christos {
765 1.10 christos uint16_t a = GPR (OP[1]);
766 1.10 christos uint16_t b = GPR (OP[1]);
767 1.10 christos uint16_t tmp = (a + b + PSR_C);
768 1.1 christos trace_input ("addcw", OP_REG, OP_REG, OP_VOID);
769 1.1 christos SET_GPR (OP[1], tmp);
770 1.1 christos SET_PSR_C (tmp > 0xFFFF);
771 1.1 christos SET_PSR_F (((a & 0x8000) == (b & 0x8000)) && ((b & 0x8000) != (tmp & 0x8000)));
772 1.6 christos trace_output_16 (sd, tmp);
773 1.1 christos }
774 1.1 christos
775 1.1 christos /* addd. */
776 1.1 christos void
777 1.6 christos OP_60_8 (SIM_DESC sd, SIM_CPU *cpu)
778 1.1 christos {
779 1.10 christos int16_t a = (OP[0]);
780 1.10 christos uint32_t b = GPR32 (OP[1]);
781 1.10 christos uint32_t tmp = (a + b);
782 1.1 christos trace_input ("addd", OP_CONSTANT4_1, OP_REGP, OP_VOID);
783 1.1 christos SET_GPR32 (OP[1], tmp);
784 1.1 christos SET_PSR_C (tmp > 0xFFFFFFFF);
785 1.1 christos SET_PSR_F (((a & 0x80000000) == (b & 0x80000000)) && ((b & 0x80000000) != (tmp & 0x80000000)));
786 1.6 christos trace_output_32 (sd, tmp);
787 1.1 christos }
788 1.1 christos
789 1.1 christos /* addd. */
790 1.1 christos void
791 1.6 christos OP_60B_C (SIM_DESC sd, SIM_CPU *cpu)
792 1.1 christos {
793 1.10 christos int32_t a = (SEXT16(OP[0]));
794 1.10 christos uint32_t b = GPR32 (OP[1]);
795 1.10 christos uint32_t tmp = (a + b);
796 1.1 christos trace_input ("addd", OP_CONSTANT16, OP_REGP, OP_VOID);
797 1.1 christos SET_GPR32 (OP[1], tmp);
798 1.1 christos SET_PSR_C (tmp > 0xFFFFFFFF);
799 1.1 christos SET_PSR_F (((a & 0x80000000) == (b & 0x80000000)) && ((b & 0x80000000) != (tmp & 0x80000000)));
800 1.6 christos trace_output_32 (sd, tmp);
801 1.1 christos }
802 1.1 christos
803 1.1 christos /* addd. */
804 1.1 christos void
805 1.6 christos OP_61_8 (SIM_DESC sd, SIM_CPU *cpu)
806 1.1 christos {
807 1.10 christos uint32_t a = GPR32 (OP[0]);
808 1.10 christos uint32_t b = GPR32 (OP[1]);
809 1.10 christos uint32_t tmp = (a + b);
810 1.1 christos trace_input ("addd", OP_REGP, OP_REGP, OP_VOID);
811 1.1 christos SET_GPR32 (OP[1], tmp);
812 1.6 christos trace_output_32 (sd, tmp);
813 1.1 christos SET_PSR_C (tmp > 0xFFFFFFFF);
814 1.1 christos SET_PSR_F (((a & 0x80000000) == (b & 0x80000000)) && ((b & 0x80000000) != (tmp & 0x80000000)));
815 1.1 christos }
816 1.1 christos
817 1.1 christos /* addd. */
818 1.1 christos void
819 1.6 christos OP_4_8 (SIM_DESC sd, SIM_CPU *cpu)
820 1.1 christos {
821 1.10 christos uint32_t a = OP[0];
822 1.10 christos uint32_t b = GPR32 (OP[1]);
823 1.10 christos uint32_t tmp;
824 1.1 christos trace_input ("addd", OP_CONSTANT20, OP_REGP, OP_VOID);
825 1.1 christos tmp = (a + b);
826 1.1 christos SET_GPR32 (OP[1], tmp);
827 1.1 christos SET_PSR_C (tmp > 0xFFFFFFFF);
828 1.1 christos SET_PSR_F (((a & 0x80000000) == (b & 0x80000000)) && ((b & 0x80000000) != (tmp & 0x80000000)));
829 1.6 christos trace_output_32 (sd, tmp);
830 1.1 christos }
831 1.1 christos
832 1.1 christos /* addd. */
833 1.1 christos void
834 1.6 christos OP_2_C (SIM_DESC sd, SIM_CPU *cpu)
835 1.1 christos {
836 1.10 christos int32_t a = OP[0];
837 1.10 christos uint32_t b = GPR32 (OP[1]);
838 1.10 christos uint32_t tmp;
839 1.1 christos trace_input ("addd", OP_CONSTANT32, OP_REGP, OP_VOID);
840 1.1 christos tmp = (a + b);
841 1.1 christos SET_GPR32 (OP[1], tmp);
842 1.1 christos SET_PSR_C (tmp > 0xFFFFFFFF);
843 1.1 christos SET_PSR_F (((a & 0x80000000) == (b & 0x80000000)) && ((b & 0x80000000) != (tmp & 0x80000000)));
844 1.6 christos trace_output_32 (sd, tmp);
845 1.1 christos }
846 1.1 christos
847 1.1 christos /* andb. */
848 1.1 christos void
849 1.6 christos OP_20_8 (SIM_DESC sd, SIM_CPU *cpu)
850 1.1 christos {
851 1.10 christos uint8_t tmp, a = (OP[0]) & 0xff, b = (GPR (OP[1])) & 0xff;
852 1.1 christos trace_input ("andb", OP_CONSTANT4, OP_REG, OP_VOID);
853 1.1 christos tmp = a & b;
854 1.1 christos SET_GPR (OP[1], (tmp | ((GPR (OP[1])) & 0xff00)));
855 1.6 christos trace_output_16 (sd, tmp);
856 1.1 christos }
857 1.1 christos
858 1.1 christos /* andb. */
859 1.1 christos void
860 1.6 christos OP_20B_C (SIM_DESC sd, SIM_CPU *cpu)
861 1.1 christos {
862 1.10 christos uint8_t tmp, a = (OP[0]) & 0xff, b = (GPR (OP[1])) & 0xff;
863 1.1 christos trace_input ("andb", OP_CONSTANT16, OP_REG, OP_VOID);
864 1.1 christos tmp = a & b;
865 1.1 christos SET_GPR (OP[1], (tmp | ((GPR (OP[1])) & 0xff00)));
866 1.6 christos trace_output_16 (sd, tmp);
867 1.1 christos }
868 1.1 christos
869 1.1 christos /* andb. */
870 1.1 christos void
871 1.6 christos OP_21_8 (SIM_DESC sd, SIM_CPU *cpu)
872 1.1 christos {
873 1.10 christos uint8_t tmp, a = (GPR (OP[0])) & 0xff, b = (GPR (OP[1])) & 0xff;
874 1.1 christos trace_input ("andb", OP_REG, OP_REG, OP_VOID);
875 1.1 christos tmp = a & b;
876 1.1 christos SET_GPR (OP[1], (tmp | ((GPR (OP[1])) & 0xff00)));
877 1.6 christos trace_output_16 (sd, tmp);
878 1.1 christos }
879 1.1 christos
880 1.1 christos /* andw. */
881 1.1 christos void
882 1.6 christos OP_22_8 (SIM_DESC sd, SIM_CPU *cpu)
883 1.1 christos {
884 1.10 christos uint16_t tmp, a = OP[0], b = GPR (OP[1]);
885 1.1 christos trace_input ("andw", OP_CONSTANT4, OP_REG, OP_VOID);
886 1.1 christos tmp = a & b;
887 1.1 christos SET_GPR (OP[1], tmp);
888 1.6 christos trace_output_16 (sd, tmp);
889 1.1 christos }
890 1.1 christos
891 1.1 christos /* andw. */
892 1.1 christos void
893 1.6 christos OP_22B_C (SIM_DESC sd, SIM_CPU *cpu)
894 1.1 christos {
895 1.10 christos uint16_t tmp, a = OP[0], b = GPR (OP[1]);
896 1.1 christos trace_input ("andw", OP_CONSTANT16, OP_REG, OP_VOID);
897 1.1 christos tmp = a & b;
898 1.1 christos SET_GPR (OP[1], tmp);
899 1.6 christos trace_output_16 (sd, tmp);
900 1.1 christos }
901 1.1 christos
902 1.1 christos /* andw. */
903 1.1 christos void
904 1.6 christos OP_23_8 (SIM_DESC sd, SIM_CPU *cpu)
905 1.1 christos {
906 1.10 christos uint16_t tmp, a = GPR (OP[0]), b = GPR (OP[1]);
907 1.1 christos trace_input ("andw", OP_REG, OP_REG, OP_VOID);
908 1.1 christos tmp = a & b;
909 1.1 christos SET_GPR (OP[1], tmp);
910 1.6 christos trace_output_16 (sd, tmp);
911 1.1 christos }
912 1.1 christos
913 1.1 christos /* andd. */
914 1.1 christos void
915 1.6 christos OP_4_C (SIM_DESC sd, SIM_CPU *cpu)
916 1.1 christos {
917 1.10 christos uint32_t tmp, a = OP[0], b = GPR32 (OP[1]);
918 1.1 christos trace_input ("andd", OP_CONSTANT32, OP_REGP, OP_VOID);
919 1.1 christos tmp = a & b;
920 1.1 christos SET_GPR32 (OP[1], tmp);
921 1.6 christos trace_output_32 (sd, tmp);
922 1.1 christos }
923 1.1 christos
924 1.1 christos /* andd. */
925 1.1 christos void
926 1.6 christos OP_14B_14 (SIM_DESC sd, SIM_CPU *cpu)
927 1.1 christos {
928 1.10 christos uint32_t tmp, a = (GPR32 (OP[0])), b = (GPR32 (OP[1]));
929 1.1 christos trace_input ("andd", OP_REGP, OP_REGP, OP_VOID);
930 1.1 christos tmp = a & b;
931 1.1 christos SET_GPR32 (OP[1], tmp);
932 1.6 christos trace_output_32 (sd, tmp);
933 1.1 christos }
934 1.1 christos
935 1.1 christos /* ord. */
936 1.1 christos void
937 1.6 christos OP_5_C (SIM_DESC sd, SIM_CPU *cpu)
938 1.1 christos {
939 1.10 christos uint32_t tmp, a = (OP[0]), b = GPR32 (OP[1]);
940 1.1 christos trace_input ("ord", OP_CONSTANT32, OP_REG, OP_VOID);
941 1.1 christos tmp = a | b;
942 1.1 christos SET_GPR32 (OP[1], tmp);
943 1.6 christos trace_output_32 (sd, tmp);
944 1.1 christos }
945 1.1 christos
946 1.1 christos /* ord. */
947 1.1 christos void
948 1.6 christos OP_149_14 (SIM_DESC sd, SIM_CPU *cpu)
949 1.1 christos {
950 1.10 christos uint32_t tmp, a = GPR32 (OP[0]), b = GPR32 (OP[1]);
951 1.1 christos trace_input ("ord", OP_REGP, OP_REGP, OP_VOID);
952 1.1 christos tmp = a | b;
953 1.1 christos SET_GPR32 (OP[1], tmp);
954 1.6 christos trace_output_32 (sd, tmp);
955 1.1 christos }
956 1.1 christos
957 1.1 christos /* xord. */
958 1.1 christos void
959 1.6 christos OP_6_C (SIM_DESC sd, SIM_CPU *cpu)
960 1.1 christos {
961 1.10 christos uint32_t tmp, a = (OP[0]), b = GPR32 (OP[1]);
962 1.1 christos trace_input ("xord", OP_CONSTANT32, OP_REG, OP_VOID);
963 1.1 christos tmp = a ^ b;
964 1.1 christos SET_GPR32 (OP[1], tmp);
965 1.6 christos trace_output_32 (sd, tmp);
966 1.1 christos }
967 1.1 christos
968 1.1 christos /* xord. */
969 1.1 christos void
970 1.6 christos OP_14A_14 (SIM_DESC sd, SIM_CPU *cpu)
971 1.1 christos {
972 1.10 christos uint32_t tmp, a = GPR32 (OP[0]), b = GPR32 (OP[1]);
973 1.1 christos trace_input ("xord", OP_REGP, OP_REGP, OP_VOID);
974 1.1 christos tmp = a ^ b;
975 1.1 christos SET_GPR32 (OP[1], tmp);
976 1.6 christos trace_output_32 (sd, tmp);
977 1.1 christos }
978 1.1 christos
979 1.1 christos
980 1.1 christos /* b. */
981 1.1 christos void
982 1.6 christos OP_1_4 (SIM_DESC sd, SIM_CPU *cpu)
983 1.1 christos {
984 1.10 christos uint32_t tmp = 0, cc = cond_stat (OP[0]);
985 1.1 christos trace_input ("b", OP_CONSTANT4, OP_DISPE9, OP_VOID);
986 1.1 christos if (cc)
987 1.1 christos {
988 1.1 christos if (sign_flag)
989 1.1 christos tmp = (PC - (OP[1]));
990 1.1 christos else
991 1.1 christos tmp = (PC + (OP[1]));
992 1.1 christos /* If the resulting PC value is less than 0x00_0000 or greater
993 1.1 christos than 0xFF_FFFF, this instruction causes an IAD trap.*/
994 1.1 christos
995 1.1 christos if ((tmp < 0x000000) || (tmp > 0xFFFFFF))
996 1.1 christos {
997 1.6 christos trace_output_void (sd);
998 1.6 christos EXCEPTION (SIM_SIGBUS);
999 1.1 christos }
1000 1.1 christos else
1001 1.1 christos JMP (tmp);
1002 1.1 christos }
1003 1.1 christos sign_flag = 0; /* Reset sign_flag. */
1004 1.6 christos trace_output_32 (sd, tmp);
1005 1.1 christos }
1006 1.1 christos
1007 1.1 christos /* b. */
1008 1.1 christos void
1009 1.6 christos OP_18_8 (SIM_DESC sd, SIM_CPU *cpu)
1010 1.1 christos {
1011 1.10 christos uint32_t tmp = 0, cc = cond_stat (OP[0]);
1012 1.1 christos trace_input ("b", OP_CONSTANT4, OP_DISP17, OP_VOID);
1013 1.1 christos if (cc)
1014 1.1 christos {
1015 1.1 christos if (sign_flag)
1016 1.1 christos tmp = (PC - OP[1]);
1017 1.1 christos else
1018 1.1 christos tmp = (PC + OP[1]);
1019 1.1 christos /* If the resulting PC value is less than 0x00_0000 or greater
1020 1.1 christos than 0xFF_FFFF, this instruction causes an IAD trap.*/
1021 1.1 christos
1022 1.1 christos if ((tmp < 0x000000) || (tmp > 0xFFFFFF))
1023 1.1 christos {
1024 1.6 christos trace_output_void (sd);
1025 1.6 christos EXCEPTION (SIM_SIGBUS);
1026 1.1 christos }
1027 1.1 christos else
1028 1.1 christos JMP (tmp);
1029 1.1 christos }
1030 1.1 christos sign_flag = 0; /* Reset sign_flag. */
1031 1.6 christos trace_output_32 (sd, tmp);
1032 1.1 christos }
1033 1.1 christos
1034 1.1 christos /* b. */
1035 1.1 christos void
1036 1.6 christos OP_10_10 (SIM_DESC sd, SIM_CPU *cpu)
1037 1.1 christos {
1038 1.10 christos uint32_t tmp = 0, cc = cond_stat (OP[0]);
1039 1.1 christos trace_input ("b", OP_CONSTANT4, OP_DISP25, OP_VOID);
1040 1.1 christos if (cc)
1041 1.1 christos {
1042 1.1 christos if (sign_flag)
1043 1.1 christos tmp = (PC - (OP[1]));
1044 1.1 christos else
1045 1.1 christos tmp = (PC + (OP[1]));
1046 1.1 christos /* If the resulting PC value is less than 0x00_0000 or greater
1047 1.1 christos than 0xFF_FFFF, this instruction causes an IAD trap.*/
1048 1.1 christos
1049 1.1 christos if ((tmp < 0x000000) || (tmp > 0xFFFFFF))
1050 1.1 christos {
1051 1.6 christos trace_output_void (sd);
1052 1.6 christos EXCEPTION (SIM_SIGBUS);
1053 1.1 christos }
1054 1.1 christos else
1055 1.1 christos JMP (tmp);
1056 1.1 christos }
1057 1.1 christos sign_flag = 0; /* Reset sign_flag. */
1058 1.6 christos trace_output_32 (sd, tmp);
1059 1.1 christos }
1060 1.1 christos
1061 1.1 christos /* bal. */
1062 1.1 christos void
1063 1.6 christos OP_C0_8 (SIM_DESC sd, SIM_CPU *cpu)
1064 1.1 christos {
1065 1.10 christos uint32_t tmp;
1066 1.1 christos trace_input ("bal", OP_REG, OP_DISP17, OP_VOID);
1067 1.1 christos tmp = ((PC + 4) >> 1); /* Store PC in RA register. */
1068 1.1 christos SET_GPR32 (14, tmp);
1069 1.1 christos if (sign_flag)
1070 1.1 christos tmp = (PC - (OP[1]));
1071 1.1 christos else
1072 1.1 christos tmp = (PC + (OP[1]));
1073 1.1 christos
1074 1.1 christos /* If the resulting PC value is less than 0x00_0000 or greater
1075 1.1 christos than 0xFF_FFFF, this instruction causes an IAD trap. */
1076 1.1 christos
1077 1.1 christos if ((tmp < 0x000000) || (tmp > 0xFFFFFF))
1078 1.1 christos {
1079 1.6 christos trace_output_void (sd);
1080 1.6 christos EXCEPTION (SIM_SIGBUS);
1081 1.1 christos }
1082 1.1 christos else
1083 1.1 christos JMP (tmp);
1084 1.1 christos sign_flag = 0; /* Reset sign_flag. */
1085 1.6 christos trace_output_32 (sd, tmp);
1086 1.1 christos }
1087 1.1 christos
1088 1.1 christos
1089 1.1 christos /* bal. */
1090 1.1 christos void
1091 1.6 christos OP_102_14 (SIM_DESC sd, SIM_CPU *cpu)
1092 1.1 christos {
1093 1.10 christos uint32_t tmp;
1094 1.1 christos trace_input ("bal", OP_REGP, OP_DISP25, OP_VOID);
1095 1.1 christos tmp = (((PC) + 4) >> 1); /* Store PC in reg pair. */
1096 1.1 christos SET_GPR32 (OP[0], tmp);
1097 1.1 christos if (sign_flag)
1098 1.1 christos tmp = ((PC) - (OP[1]));
1099 1.1 christos else
1100 1.1 christos tmp = ((PC) + (OP[1]));
1101 1.1 christos /* If the resulting PC value is less than 0x00_0000 or greater
1102 1.1 christos than 0xFF_FFFF, this instruction causes an IAD trap.*/
1103 1.1 christos
1104 1.1 christos if ((tmp < 0x000000) || (tmp > 0xFFFFFF))
1105 1.1 christos {
1106 1.6 christos trace_output_void (sd);
1107 1.6 christos EXCEPTION (SIM_SIGBUS);
1108 1.1 christos }
1109 1.1 christos else
1110 1.1 christos JMP (tmp);
1111 1.1 christos sign_flag = 0; /* Reset sign_flag. */
1112 1.6 christos trace_output_32 (sd, tmp);
1113 1.1 christos }
1114 1.1 christos
1115 1.1 christos /* jal. */
1116 1.1 christos void
1117 1.6 christos OP_148_14 (SIM_DESC sd, SIM_CPU *cpu)
1118 1.1 christos {
1119 1.10 christos uint32_t tmp;
1120 1.1 christos trace_input ("jal", OP_REGP, OP_REGP, OP_VOID);
1121 1.1 christos SET_GPR32 (OP[0], (((PC) + 4) >> 1)); /* Store next PC in RA */
1122 1.1 christos tmp = GPR32 (OP[1]);
1123 1.1 christos tmp = SEXT24(tmp << 1);
1124 1.1 christos /* If the resulting PC value is less than 0x00_0000 or greater
1125 1.1 christos than 0xFF_FFFF, this instruction causes an IAD trap.*/
1126 1.1 christos
1127 1.1 christos if ((tmp < 0x0) || (tmp > 0xFFFFFF))
1128 1.1 christos {
1129 1.6 christos trace_output_void (sd);
1130 1.6 christos EXCEPTION (SIM_SIGBUS);
1131 1.1 christos }
1132 1.1 christos else
1133 1.1 christos JMP (tmp);
1134 1.1 christos
1135 1.6 christos trace_output_32 (sd, tmp);
1136 1.1 christos }
1137 1.1 christos
1138 1.1 christos
1139 1.1 christos /* jal. */
1140 1.1 christos void
1141 1.6 christos OP_D_C (SIM_DESC sd, SIM_CPU *cpu)
1142 1.1 christos {
1143 1.10 christos uint32_t tmp;
1144 1.1 christos trace_input ("jal", OP_REGP, OP_VOID, OP_VOID);
1145 1.1 christos SET_GPR32 (14, (((PC) + 2) >> 1)); /* Store next PC in RA */
1146 1.1 christos tmp = GPR32 (OP[0]);
1147 1.1 christos tmp = SEXT24(tmp << 1);
1148 1.1 christos /* If the resulting PC value is less than 0x00_0000 or greater
1149 1.1 christos than 0xFF_FFFF, this instruction causes an IAD trap.*/
1150 1.1 christos
1151 1.1 christos if ((tmp < 0x0) || (tmp > 0xFFFFFF))
1152 1.1 christos {
1153 1.6 christos trace_output_void (sd);
1154 1.6 christos EXCEPTION (SIM_SIGBUS);
1155 1.1 christos }
1156 1.1 christos else
1157 1.1 christos JMP (tmp);
1158 1.1 christos
1159 1.6 christos trace_output_32 (sd, tmp);
1160 1.1 christos }
1161 1.1 christos
1162 1.1 christos
1163 1.1 christos /* beq0b. */
1164 1.1 christos void
1165 1.6 christos OP_C_8 (SIM_DESC sd, SIM_CPU *cpu)
1166 1.1 christos {
1167 1.10 christos uint32_t addr;
1168 1.10 christos uint8_t a = (GPR (OP[0]) & 0xFF);
1169 1.1 christos trace_input ("beq0b", OP_REG, OP_DISP5, OP_VOID);
1170 1.1 christos addr = OP[1];
1171 1.1 christos if (a == 0)
1172 1.1 christos {
1173 1.1 christos if (sign_flag)
1174 1.1 christos addr = (PC - OP[1]);
1175 1.1 christos else
1176 1.1 christos addr = (PC + OP[1]);
1177 1.1 christos
1178 1.1 christos JMP (addr);
1179 1.1 christos }
1180 1.1 christos sign_flag = 0; /* Reset sign_flag. */
1181 1.6 christos trace_output_void (sd);
1182 1.1 christos }
1183 1.1 christos
1184 1.1 christos /* bne0b. */
1185 1.1 christos void
1186 1.6 christos OP_D_8 (SIM_DESC sd, SIM_CPU *cpu)
1187 1.1 christos {
1188 1.10 christos uint32_t addr;
1189 1.10 christos uint8_t a = (GPR (OP[0]) & 0xFF);
1190 1.1 christos trace_input ("bne0b", OP_REG, OP_DISP5, OP_VOID);
1191 1.1 christos addr = OP[1];
1192 1.1 christos if (a != 0)
1193 1.1 christos {
1194 1.1 christos if (sign_flag)
1195 1.1 christos addr = (PC - OP[1]);
1196 1.1 christos else
1197 1.1 christos addr = (PC + OP[1]);
1198 1.1 christos
1199 1.1 christos JMP (addr);
1200 1.1 christos }
1201 1.1 christos sign_flag = 0; /* Reset sign_flag. */
1202 1.6 christos trace_output_void (sd);
1203 1.1 christos }
1204 1.1 christos
1205 1.1 christos /* beq0w. */
1206 1.1 christos void
1207 1.6 christos OP_E_8 (SIM_DESC sd, SIM_CPU *cpu)
1208 1.1 christos {
1209 1.10 christos uint32_t addr;
1210 1.10 christos uint16_t a = GPR (OP[0]);
1211 1.1 christos trace_input ("beq0w", OP_REG, OP_DISP5, OP_VOID);
1212 1.1 christos addr = OP[1];
1213 1.1 christos if (a == 0)
1214 1.1 christos {
1215 1.1 christos if (sign_flag)
1216 1.1 christos addr = (PC - OP[1]);
1217 1.1 christos else
1218 1.1 christos addr = (PC + OP[1]);
1219 1.1 christos
1220 1.1 christos JMP (addr);
1221 1.1 christos }
1222 1.1 christos sign_flag = 0; /* Reset sign_flag. */
1223 1.6 christos trace_output_void (sd);
1224 1.1 christos }
1225 1.1 christos
1226 1.1 christos /* bne0w. */
1227 1.1 christos void
1228 1.6 christos OP_F_8 (SIM_DESC sd, SIM_CPU *cpu)
1229 1.1 christos {
1230 1.10 christos uint32_t addr;
1231 1.10 christos uint16_t a = GPR (OP[0]);
1232 1.1 christos trace_input ("bne0w", OP_REG, OP_DISP5, OP_VOID);
1233 1.1 christos addr = OP[1];
1234 1.1 christos if (a != 0)
1235 1.1 christos {
1236 1.1 christos if (sign_flag)
1237 1.1 christos addr = (PC - OP[1]);
1238 1.1 christos else
1239 1.1 christos addr = (PC + OP[1]);
1240 1.1 christos
1241 1.1 christos JMP (addr);
1242 1.1 christos }
1243 1.1 christos sign_flag = 0; /* Reset sign_flag. */
1244 1.6 christos trace_output_void (sd);
1245 1.1 christos }
1246 1.1 christos
1247 1.1 christos
1248 1.1 christos /* jeq. */
1249 1.1 christos void
1250 1.6 christos OP_A0_C (SIM_DESC sd, SIM_CPU *cpu)
1251 1.1 christos {
1252 1.10 christos uint32_t tmp = 0;
1253 1.1 christos trace_input ("jeq", OP_REGP, OP_VOID, OP_VOID);
1254 1.1 christos if ((PSR_Z) == 1)
1255 1.1 christos {
1256 1.1 christos tmp = (GPR32 (OP[0])) & 0x3fffff; /* Use only 0 - 22 bits. */
1257 1.1 christos JMP (tmp << 1); /* Set PC's 1 - 23 bits and clear 0th bit. */
1258 1.1 christos }
1259 1.6 christos trace_output_32 (sd, tmp);
1260 1.1 christos }
1261 1.1 christos
1262 1.1 christos /* jne. */
1263 1.1 christos void
1264 1.6 christos OP_A1_C (SIM_DESC sd, SIM_CPU *cpu)
1265 1.1 christos {
1266 1.10 christos uint32_t tmp = 0;
1267 1.1 christos trace_input ("jne", OP_REGP, OP_VOID, OP_VOID);
1268 1.1 christos if ((PSR_Z) == 0)
1269 1.1 christos {
1270 1.1 christos tmp = (GPR32 (OP[0])) & 0x3fffff; /* Use only 0 - 22 bits. */
1271 1.1 christos JMP (tmp << 1); /* Set PC's 1 - 23 bits and clear 0th bit. */
1272 1.1 christos }
1273 1.6 christos trace_output_32 (sd, tmp);
1274 1.1 christos }
1275 1.1 christos
1276 1.1 christos /* jcs. */
1277 1.1 christos void
1278 1.6 christos OP_A2_C (SIM_DESC sd, SIM_CPU *cpu)
1279 1.1 christos {
1280 1.10 christos uint32_t tmp = 0;
1281 1.1 christos trace_input ("jcs", OP_REGP, OP_VOID, OP_VOID);
1282 1.1 christos if ((PSR_C) == 1)
1283 1.1 christos {
1284 1.1 christos tmp = (GPR32 (OP[0])) & 0x3fffff; /* Use only 0 - 22 bits */
1285 1.1 christos JMP (tmp << 1); /* Set PC's 1 - 23 bits and clear 0th bit*/
1286 1.1 christos }
1287 1.6 christos trace_output_32 (sd, tmp);
1288 1.1 christos }
1289 1.1 christos
1290 1.1 christos /* jcc. */
1291 1.1 christos void
1292 1.6 christos OP_A3_C (SIM_DESC sd, SIM_CPU *cpu)
1293 1.1 christos {
1294 1.10 christos uint32_t tmp = 0;
1295 1.1 christos trace_input ("jcc", OP_REGP, OP_VOID, OP_VOID);
1296 1.1 christos if ((PSR_C) == 0)
1297 1.1 christos {
1298 1.1 christos tmp = (GPR32 (OP[0])) & 0x3fffff; /* Use only 0 - 22 bits */
1299 1.1 christos JMP (tmp << 1); /* Set PC's 1 - 23 bits and clear 0th bit*/
1300 1.1 christos }
1301 1.6 christos trace_output_32 (sd, tmp);
1302 1.1 christos }
1303 1.1 christos
1304 1.1 christos /* jhi. */
1305 1.1 christos void
1306 1.6 christos OP_A4_C (SIM_DESC sd, SIM_CPU *cpu)
1307 1.1 christos {
1308 1.10 christos uint32_t tmp = 0;
1309 1.1 christos trace_input ("jhi", OP_REGP, OP_VOID, OP_VOID);
1310 1.1 christos if ((PSR_L) == 1)
1311 1.1 christos {
1312 1.1 christos tmp = (GPR32 (OP[0])) & 0x3fffff; /* Use only 0 - 22 bits */
1313 1.1 christos JMP (tmp << 1); /* Set PC's 1 - 23 bits and clear 0th bit*/
1314 1.1 christos }
1315 1.6 christos trace_output_32 (sd, tmp);
1316 1.1 christos }
1317 1.1 christos
1318 1.1 christos /* jls. */
1319 1.1 christos void
1320 1.6 christos OP_A5_C (SIM_DESC sd, SIM_CPU *cpu)
1321 1.1 christos {
1322 1.10 christos uint32_t tmp = 0;
1323 1.1 christos trace_input ("jls", OP_REGP, OP_VOID, OP_VOID);
1324 1.1 christos if ((PSR_L) == 0)
1325 1.1 christos {
1326 1.1 christos tmp = (GPR32 (OP[0])) & 0x3fffff; /* Use only 0 - 22 bits */
1327 1.1 christos JMP (tmp << 1); /* Set PC's 1 - 23 bits and clear 0th bit*/
1328 1.1 christos }
1329 1.6 christos trace_output_32 (sd, tmp);
1330 1.1 christos }
1331 1.1 christos
1332 1.1 christos /* jgt. */
1333 1.1 christos void
1334 1.6 christos OP_A6_C (SIM_DESC sd, SIM_CPU *cpu)
1335 1.1 christos {
1336 1.10 christos uint32_t tmp = 0;
1337 1.1 christos trace_input ("jgt", OP_REGP, OP_VOID, OP_VOID);
1338 1.1 christos if ((PSR_N) == 1)
1339 1.1 christos {
1340 1.1 christos tmp = (GPR32 (OP[0])) & 0x3fffff; /* Use only 0 - 22 bits */
1341 1.1 christos JMP (tmp << 1); /* Set PC's 1 - 23 bits and clear 0th bit*/
1342 1.1 christos }
1343 1.6 christos trace_output_32 (sd, tmp);
1344 1.1 christos }
1345 1.1 christos
1346 1.1 christos /* jle. */
1347 1.1 christos void
1348 1.6 christos OP_A7_C (SIM_DESC sd, SIM_CPU *cpu)
1349 1.1 christos {
1350 1.10 christos uint32_t tmp = 0;
1351 1.1 christos trace_input ("jle", OP_REGP, OP_VOID, OP_VOID);
1352 1.1 christos if ((PSR_N) == 0)
1353 1.1 christos {
1354 1.1 christos tmp = (GPR32 (OP[0])) & 0x3fffff; /* Use only 0 - 22 bits */
1355 1.1 christos JMP (tmp << 1); /* Set PC's 1 - 23 bits and clear 0th bit*/
1356 1.1 christos }
1357 1.6 christos trace_output_32 (sd, tmp);
1358 1.1 christos }
1359 1.1 christos
1360 1.1 christos
1361 1.1 christos /* jfs. */
1362 1.1 christos void
1363 1.6 christos OP_A8_C (SIM_DESC sd, SIM_CPU *cpu)
1364 1.1 christos {
1365 1.10 christos uint32_t tmp = 0;
1366 1.1 christos trace_input ("jfs", OP_REGP, OP_VOID, OP_VOID);
1367 1.1 christos if ((PSR_F) == 1)
1368 1.1 christos {
1369 1.1 christos tmp = (GPR32 (OP[0])) & 0x3fffff; /* Use only 0 - 22 bits */
1370 1.1 christos JMP (tmp << 1); /* Set PC's 1 - 23 bits and clear 0th bit*/
1371 1.1 christos }
1372 1.6 christos trace_output_32 (sd, tmp);
1373 1.1 christos }
1374 1.1 christos
1375 1.1 christos /* jfc. */
1376 1.1 christos void
1377 1.6 christos OP_A9_C (SIM_DESC sd, SIM_CPU *cpu)
1378 1.1 christos {
1379 1.10 christos uint32_t tmp = 0;
1380 1.1 christos trace_input ("jfc", OP_REGP, OP_VOID, OP_VOID);
1381 1.1 christos if ((PSR_F) == 0)
1382 1.1 christos {
1383 1.1 christos tmp = (GPR32 (OP[0])) & 0x3fffff; /* Use only 0 - 22 bits */
1384 1.1 christos JMP (tmp << 1); /* Set PC's 1 - 23 bits and clear 0th bit*/
1385 1.1 christos }
1386 1.6 christos trace_output_32 (sd, tmp);
1387 1.1 christos }
1388 1.1 christos
1389 1.1 christos /* jlo. */
1390 1.1 christos void
1391 1.6 christos OP_AA_C (SIM_DESC sd, SIM_CPU *cpu)
1392 1.1 christos {
1393 1.10 christos uint32_t tmp = 0;
1394 1.1 christos trace_input ("jlo", OP_REGP, OP_VOID, OP_VOID);
1395 1.1 christos if (((PSR_Z) == 0) & ((PSR_L) == 0))
1396 1.1 christos {
1397 1.1 christos tmp = (GPR32 (OP[0])) & 0x3fffff; /* Use only 0 - 22 bits */
1398 1.1 christos JMP (tmp << 1); /* Set PC's 1 - 23 bits and clear 0th bit*/
1399 1.1 christos }
1400 1.6 christos trace_output_32 (sd, tmp);
1401 1.1 christos }
1402 1.1 christos
1403 1.1 christos /* jhs. */
1404 1.1 christos void
1405 1.6 christos OP_AB_C (SIM_DESC sd, SIM_CPU *cpu)
1406 1.1 christos {
1407 1.10 christos uint32_t tmp = 0;
1408 1.1 christos trace_input ("jhs", OP_REGP, OP_VOID, OP_VOID);
1409 1.1 christos if (((PSR_Z) == 1) | ((PSR_L) == 1))
1410 1.1 christos {
1411 1.1 christos tmp = (GPR32 (OP[0])) & 0x3fffff; /* Use only 0 - 22 bits */
1412 1.1 christos JMP (tmp << 1); /* Set PC's 1 - 23 bits and clear 0th bit*/
1413 1.1 christos }
1414 1.6 christos trace_output_32 (sd, tmp);
1415 1.1 christos }
1416 1.1 christos
1417 1.1 christos /* jlt. */
1418 1.1 christos void
1419 1.6 christos OP_AC_C (SIM_DESC sd, SIM_CPU *cpu)
1420 1.1 christos {
1421 1.10 christos uint32_t tmp = 0;
1422 1.1 christos trace_input ("jlt", OP_REGP, OP_VOID, OP_VOID);
1423 1.1 christos if (((PSR_Z) == 0) & ((PSR_N) == 0))
1424 1.1 christos {
1425 1.1 christos tmp = (GPR32 (OP[0])) & 0x3fffff; /* Use only 0 - 22 bits */
1426 1.1 christos JMP (tmp << 1); /* Set PC's 1 - 23 bits and clear 0th bit*/
1427 1.1 christos }
1428 1.6 christos trace_output_32 (sd, tmp);
1429 1.1 christos }
1430 1.1 christos
1431 1.1 christos /* jge. */
1432 1.1 christos void
1433 1.6 christos OP_AD_C (SIM_DESC sd, SIM_CPU *cpu)
1434 1.1 christos {
1435 1.10 christos uint32_t tmp = 0;
1436 1.1 christos trace_input ("jge", OP_REGP, OP_VOID, OP_VOID);
1437 1.1 christos if (((PSR_Z) == 1) | ((PSR_N) == 1))
1438 1.1 christos {
1439 1.1 christos tmp = (GPR32 (OP[0])) & 0x3fffff; /* Use only 0 - 22 bits */
1440 1.1 christos JMP (tmp << 1); /* Set PC's 1 - 23 bits and clear 0th bit*/
1441 1.1 christos }
1442 1.6 christos trace_output_32 (sd, tmp);
1443 1.1 christos }
1444 1.1 christos
1445 1.1 christos /* jump. */
1446 1.1 christos void
1447 1.6 christos OP_AE_C (SIM_DESC sd, SIM_CPU *cpu)
1448 1.1 christos {
1449 1.10 christos uint32_t tmp;
1450 1.1 christos trace_input ("jump", OP_REGP, OP_VOID, OP_VOID);
1451 1.1 christos tmp = GPR32 (OP[0]) /*& 0x3fffff*/; /* Use only 0 - 22 bits */
1452 1.1 christos JMP (tmp << 1); /* Set PC's 1 - 23 bits and clear 0th bit*/
1453 1.6 christos trace_output_32 (sd, tmp);
1454 1.1 christos }
1455 1.1 christos
1456 1.1 christos /* jusr. */
1457 1.1 christos void
1458 1.6 christos OP_AF_C (SIM_DESC sd, SIM_CPU *cpu)
1459 1.1 christos {
1460 1.10 christos uint32_t tmp;
1461 1.1 christos trace_input ("jusr", OP_REGP, OP_VOID, OP_VOID);
1462 1.1 christos tmp = (GPR32 (OP[0])) & 0x3fffff; /* Use only 0 - 22 bits */
1463 1.1 christos JMP (tmp << 1); /* Set PC's 1 - 23 bits and clear 0th bit*/
1464 1.1 christos SET_PSR_U(1);
1465 1.6 christos trace_output_32 (sd, tmp);
1466 1.1 christos }
1467 1.1 christos
1468 1.1 christos /* seq. */
1469 1.1 christos void
1470 1.6 christos OP_80_C (SIM_DESC sd, SIM_CPU *cpu)
1471 1.1 christos {
1472 1.1 christos trace_input ("seq", OP_REG, OP_VOID, OP_VOID);
1473 1.1 christos if ((PSR_Z) == 1)
1474 1.1 christos SET_GPR (OP[0], 1);
1475 1.1 christos else
1476 1.1 christos SET_GPR (OP[0], 0);
1477 1.6 christos trace_output_void (sd);
1478 1.1 christos }
1479 1.1 christos /* sne. */
1480 1.1 christos void
1481 1.6 christos OP_81_C (SIM_DESC sd, SIM_CPU *cpu)
1482 1.1 christos {
1483 1.1 christos trace_input ("sne", OP_REG, OP_VOID, OP_VOID);
1484 1.1 christos if ((PSR_Z) == 0)
1485 1.1 christos SET_GPR (OP[0], 1);
1486 1.1 christos else
1487 1.1 christos SET_GPR (OP[0], 0);
1488 1.6 christos trace_output_void (sd);
1489 1.1 christos }
1490 1.1 christos
1491 1.1 christos /* scs. */
1492 1.1 christos void
1493 1.6 christos OP_82_C (SIM_DESC sd, SIM_CPU *cpu)
1494 1.1 christos {
1495 1.1 christos trace_input ("scs", OP_REG, OP_VOID, OP_VOID);
1496 1.1 christos if ((PSR_C) == 1)
1497 1.1 christos SET_GPR (OP[0], 1);
1498 1.1 christos else
1499 1.1 christos SET_GPR (OP[0], 0);
1500 1.6 christos trace_output_void (sd);
1501 1.1 christos }
1502 1.1 christos
1503 1.1 christos /* scc. */
1504 1.1 christos void
1505 1.6 christos OP_83_C (SIM_DESC sd, SIM_CPU *cpu)
1506 1.1 christos {
1507 1.1 christos trace_input ("scc", OP_REG, OP_VOID, OP_VOID);
1508 1.1 christos if ((PSR_C) == 0)
1509 1.1 christos SET_GPR (OP[0], 1);
1510 1.1 christos else
1511 1.1 christos SET_GPR (OP[0], 0);
1512 1.6 christos trace_output_void (sd);
1513 1.1 christos }
1514 1.1 christos
1515 1.1 christos /* shi. */
1516 1.1 christos void
1517 1.6 christos OP_84_C (SIM_DESC sd, SIM_CPU *cpu)
1518 1.1 christos {
1519 1.1 christos trace_input ("shi", OP_REG, OP_VOID, OP_VOID);
1520 1.1 christos if ((PSR_L) == 1)
1521 1.1 christos SET_GPR (OP[0], 1);
1522 1.1 christos else
1523 1.1 christos SET_GPR (OP[0], 0);
1524 1.6 christos trace_output_void (sd);
1525 1.1 christos }
1526 1.1 christos
1527 1.1 christos /* sls. */
1528 1.1 christos void
1529 1.6 christos OP_85_C (SIM_DESC sd, SIM_CPU *cpu)
1530 1.1 christos {
1531 1.1 christos trace_input ("sls", OP_REG, OP_VOID, OP_VOID);
1532 1.1 christos if ((PSR_L) == 0)
1533 1.1 christos SET_GPR (OP[0], 1);
1534 1.1 christos else
1535 1.1 christos SET_GPR (OP[0], 0);
1536 1.6 christos trace_output_void (sd);
1537 1.1 christos }
1538 1.1 christos
1539 1.1 christos /* sgt. */
1540 1.1 christos void
1541 1.6 christos OP_86_C (SIM_DESC sd, SIM_CPU *cpu)
1542 1.1 christos {
1543 1.1 christos trace_input ("sgt", OP_REG, OP_VOID, OP_VOID);
1544 1.1 christos if ((PSR_N) == 1)
1545 1.1 christos SET_GPR (OP[0], 1);
1546 1.1 christos else
1547 1.1 christos SET_GPR (OP[0], 0);
1548 1.6 christos trace_output_void (sd);
1549 1.1 christos }
1550 1.1 christos
1551 1.1 christos /* sle. */
1552 1.1 christos void
1553 1.6 christos OP_87_C (SIM_DESC sd, SIM_CPU *cpu)
1554 1.1 christos {
1555 1.1 christos trace_input ("sle", OP_REG, OP_VOID, OP_VOID);
1556 1.1 christos if ((PSR_N) == 0)
1557 1.1 christos SET_GPR (OP[0], 1);
1558 1.1 christos else
1559 1.1 christos SET_GPR (OP[0], 0);
1560 1.6 christos trace_output_void (sd);
1561 1.1 christos }
1562 1.1 christos
1563 1.1 christos /* sfs. */
1564 1.1 christos void
1565 1.6 christos OP_88_C (SIM_DESC sd, SIM_CPU *cpu)
1566 1.1 christos {
1567 1.1 christos trace_input ("sfs", OP_REG, OP_VOID, OP_VOID);
1568 1.1 christos if ((PSR_F) == 1)
1569 1.1 christos SET_GPR (OP[0], 1);
1570 1.1 christos else
1571 1.1 christos SET_GPR (OP[0], 0);
1572 1.6 christos trace_output_void (sd);
1573 1.1 christos }
1574 1.1 christos
1575 1.1 christos /* sfc. */
1576 1.1 christos void
1577 1.6 christos OP_89_C (SIM_DESC sd, SIM_CPU *cpu)
1578 1.1 christos {
1579 1.1 christos trace_input ("sfc", OP_REG, OP_VOID, OP_VOID);
1580 1.1 christos if ((PSR_F) == 0)
1581 1.1 christos SET_GPR (OP[0], 1);
1582 1.1 christos else
1583 1.1 christos SET_GPR (OP[0], 0);
1584 1.6 christos trace_output_void (sd);
1585 1.1 christos }
1586 1.1 christos
1587 1.1 christos
1588 1.1 christos /* slo. */
1589 1.1 christos void
1590 1.6 christos OP_8A_C (SIM_DESC sd, SIM_CPU *cpu)
1591 1.1 christos {
1592 1.1 christos trace_input ("slo", OP_REG, OP_VOID, OP_VOID);
1593 1.1 christos if (((PSR_Z) == 0) & ((PSR_L) == 0))
1594 1.1 christos SET_GPR (OP[0], 1);
1595 1.1 christos else
1596 1.1 christos SET_GPR (OP[0], 0);
1597 1.6 christos trace_output_void (sd);
1598 1.1 christos }
1599 1.1 christos
1600 1.1 christos /* shs. */
1601 1.1 christos void
1602 1.6 christos OP_8B_C (SIM_DESC sd, SIM_CPU *cpu)
1603 1.1 christos {
1604 1.1 christos trace_input ("shs", OP_REG, OP_VOID, OP_VOID);
1605 1.1 christos if ( ((PSR_Z) == 1) | ((PSR_L) == 1))
1606 1.1 christos SET_GPR (OP[0], 1);
1607 1.1 christos else
1608 1.1 christos SET_GPR (OP[0], 0);
1609 1.6 christos trace_output_void (sd);
1610 1.1 christos }
1611 1.1 christos
1612 1.1 christos /* slt. */
1613 1.1 christos void
1614 1.6 christos OP_8C_C (SIM_DESC sd, SIM_CPU *cpu)
1615 1.1 christos {
1616 1.1 christos trace_input ("slt", OP_REG, OP_VOID, OP_VOID);
1617 1.1 christos if (((PSR_Z) == 0) & ((PSR_N) == 0))
1618 1.1 christos SET_GPR (OP[0], 1);
1619 1.1 christos else
1620 1.1 christos SET_GPR (OP[0], 0);
1621 1.6 christos trace_output_void (sd);
1622 1.1 christos }
1623 1.1 christos
1624 1.1 christos /* sge. */
1625 1.1 christos void
1626 1.6 christos OP_8D_C (SIM_DESC sd, SIM_CPU *cpu)
1627 1.1 christos {
1628 1.1 christos trace_input ("sge", OP_REG, OP_VOID, OP_VOID);
1629 1.1 christos if (((PSR_Z) == 1) | ((PSR_N) == 1))
1630 1.1 christos SET_GPR (OP[0], 1);
1631 1.1 christos else
1632 1.1 christos SET_GPR (OP[0], 0);
1633 1.6 christos trace_output_void (sd);
1634 1.1 christos }
1635 1.1 christos
1636 1.1 christos /* cbitb. */
1637 1.1 christos void
1638 1.6 christos OP_D7_9 (SIM_DESC sd, SIM_CPU *cpu)
1639 1.1 christos {
1640 1.10 christos uint8_t a = OP[0] & 0xff;
1641 1.10 christos uint32_t addr = OP[1], tmp;
1642 1.1 christos trace_input ("cbitb", OP_CONSTANT4, OP_ABS20_OUTPUT, OP_VOID);
1643 1.1 christos tmp = RB (addr);
1644 1.1 christos SET_PSR_F (tmp & (1 << a));
1645 1.1 christos tmp = tmp & ~(1 << a);
1646 1.1 christos SB (addr, tmp);
1647 1.6 christos trace_output_32 (sd, tmp);
1648 1.1 christos }
1649 1.1 christos
1650 1.1 christos /* cbitb. */
1651 1.1 christos void
1652 1.6 christos OP_107_14 (SIM_DESC sd, SIM_CPU *cpu)
1653 1.1 christos {
1654 1.10 christos uint8_t a = OP[0] & 0xff;
1655 1.10 christos uint32_t addr = OP[1], tmp;
1656 1.1 christos trace_input ("cbitb", OP_CONSTANT4, OP_ABS24_OUTPUT, OP_VOID);
1657 1.1 christos tmp = RB (addr);
1658 1.1 christos SET_PSR_F (tmp & (1 << a));
1659 1.1 christos tmp = tmp & ~(1 << a);
1660 1.1 christos SB (addr, tmp);
1661 1.6 christos trace_output_32 (sd, tmp);
1662 1.1 christos }
1663 1.1 christos
1664 1.1 christos /* cbitb. */
1665 1.1 christos void
1666 1.6 christos OP_68_8 (SIM_DESC sd, SIM_CPU *cpu)
1667 1.1 christos {
1668 1.10 christos uint8_t a = (OP[0]) & 0xff;
1669 1.10 christos uint32_t addr = (GPR (OP[2])) + OP[1], tmp;
1670 1.1 christos trace_input ("cbitb", OP_CONSTANT4, OP_R_INDEX7_ABS20, OP_VOID);
1671 1.1 christos tmp = RB (addr);
1672 1.1 christos SET_PSR_F (tmp & (1 << a));
1673 1.1 christos tmp = tmp & ~(1 << a);
1674 1.1 christos SB (addr, tmp);
1675 1.6 christos trace_output_32 (sd, addr);
1676 1.1 christos }
1677 1.1 christos
1678 1.1 christos /* cbitb. */
1679 1.1 christos void
1680 1.6 christos OP_1AA_A (SIM_DESC sd, SIM_CPU *cpu)
1681 1.1 christos {
1682 1.10 christos uint8_t a = (OP[0]) & 0xff;
1683 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1], tmp;
1684 1.1 christos trace_input ("cbitb", OP_CONSTANT4, OP_RP_INDEX_DISP14, OP_VOID);
1685 1.1 christos tmp = RB (addr);
1686 1.1 christos SET_PSR_F (tmp & (1 << a));
1687 1.1 christos tmp = tmp & ~(1 << a);
1688 1.1 christos SB (addr, tmp);
1689 1.6 christos trace_output_32 (sd, addr);
1690 1.1 christos }
1691 1.1 christos
1692 1.1 christos /* cbitb. */
1693 1.1 christos void
1694 1.6 christos OP_104_14 (SIM_DESC sd, SIM_CPU *cpu)
1695 1.1 christos {
1696 1.10 christos uint8_t a = (OP[0]) & 0xff;
1697 1.10 christos uint32_t addr = (GPR (OP[2])) + OP[1], tmp;
1698 1.1 christos trace_input ("cbitb", OP_CONSTANT4, OP_R_BASE_DISPS20, OP_VOID);
1699 1.1 christos tmp = RB (addr);
1700 1.1 christos SET_PSR_F (tmp & (1 << a));
1701 1.1 christos tmp = tmp & ~(1 << a);
1702 1.1 christos SB (addr, tmp);
1703 1.6 christos trace_output_32 (sd, addr);
1704 1.1 christos }
1705 1.1 christos
1706 1.1 christos /* cbitb. */
1707 1.1 christos void
1708 1.6 christos OP_D4_9 (SIM_DESC sd, SIM_CPU *cpu)
1709 1.1 christos {
1710 1.10 christos uint8_t a = (OP[0]) & 0xff;
1711 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1], tmp;
1712 1.1 christos trace_input ("cbitb", OP_CONSTANT4, OP_RP_INDEX_DISP0, OP_VOID);
1713 1.1 christos tmp = RB (addr);
1714 1.1 christos SET_PSR_F (tmp & (1 << a));
1715 1.1 christos tmp = tmp & ~(1 << a);
1716 1.1 christos SB (addr, tmp);
1717 1.6 christos trace_output_32 (sd, addr);
1718 1.1 christos }
1719 1.1 christos
1720 1.1 christos /* cbitb. */
1721 1.1 christos void
1722 1.6 christos OP_D6_9 (SIM_DESC sd, SIM_CPU *cpu)
1723 1.1 christos {
1724 1.10 christos uint8_t a = (OP[0]) & 0xff;
1725 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1], tmp;
1726 1.1 christos trace_input ("cbitb", OP_CONSTANT4, OP_RP_BASE_DISP16, OP_VOID);
1727 1.1 christos tmp = RB (addr);
1728 1.1 christos SET_PSR_F (tmp & (1 << a));
1729 1.1 christos tmp = tmp & ~(1 << a);
1730 1.1 christos SB (addr, tmp);
1731 1.6 christos trace_output_32 (sd, addr);
1732 1.1 christos
1733 1.1 christos }
1734 1.1 christos
1735 1.1 christos /* cbitb. */
1736 1.1 christos void
1737 1.6 christos OP_105_14 (SIM_DESC sd, SIM_CPU *cpu)
1738 1.1 christos {
1739 1.10 christos uint8_t a = (OP[0]) & 0xff;
1740 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1], tmp;
1741 1.1 christos trace_input ("cbitb", OP_CONSTANT4, OP_RP_BASE_DISPS20, OP_VOID);
1742 1.1 christos tmp = RB (addr);
1743 1.1 christos SET_PSR_F (tmp & (1 << a));
1744 1.1 christos tmp = tmp & ~(1 << a);
1745 1.1 christos SB (addr, tmp);
1746 1.6 christos trace_output_32 (sd, addr);
1747 1.1 christos }
1748 1.1 christos
1749 1.1 christos /* cbitb. */
1750 1.1 christos void
1751 1.6 christos OP_106_14 (SIM_DESC sd, SIM_CPU *cpu)
1752 1.1 christos {
1753 1.10 christos uint8_t a = (OP[0]) & 0xff;
1754 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1], tmp;
1755 1.1 christos trace_input ("cbitb", OP_CONSTANT4, OP_RP_INDEX_DISPS20, OP_VOID);
1756 1.1 christos tmp = RB (addr);
1757 1.1 christos SET_PSR_F (tmp & (1 << a));
1758 1.1 christos tmp = tmp & ~(1 << a);
1759 1.1 christos SB (addr, tmp);
1760 1.6 christos trace_output_32 (sd, addr);
1761 1.1 christos }
1762 1.1 christos
1763 1.1 christos
1764 1.1 christos /* cbitw. */
1765 1.1 christos void
1766 1.6 christos OP_6F_8 (SIM_DESC sd, SIM_CPU *cpu)
1767 1.1 christos {
1768 1.10 christos uint16_t a = OP[0];
1769 1.10 christos uint32_t addr = OP[1], tmp;
1770 1.1 christos trace_input ("cbitw", OP_CONSTANT4, OP_ABS20_OUTPUT, OP_VOID);
1771 1.1 christos tmp = RW (addr);
1772 1.1 christos SET_PSR_F (tmp & (1 << a));
1773 1.1 christos tmp = tmp & ~(1 << a);
1774 1.1 christos SW (addr, tmp);
1775 1.6 christos trace_output_32 (sd, tmp);
1776 1.1 christos }
1777 1.1 christos
1778 1.1 christos /* cbitw. */
1779 1.1 christos void
1780 1.6 christos OP_117_14 (SIM_DESC sd, SIM_CPU *cpu)
1781 1.1 christos {
1782 1.10 christos uint16_t a = OP[0];
1783 1.10 christos uint32_t addr = OP[1], tmp;
1784 1.1 christos trace_input ("cbitw", OP_CONSTANT4, OP_ABS24_OUTPUT, OP_VOID);
1785 1.1 christos tmp = RW (addr);
1786 1.1 christos SET_PSR_F (tmp & (1 << a));
1787 1.1 christos tmp = tmp & ~(1 << a);
1788 1.1 christos SW (addr, tmp);
1789 1.6 christos trace_output_32 (sd, tmp);
1790 1.1 christos }
1791 1.1 christos
1792 1.1 christos /* cbitw. */
1793 1.1 christos void
1794 1.6 christos OP_36_7 (SIM_DESC sd, SIM_CPU *cpu)
1795 1.1 christos {
1796 1.10 christos uint32_t addr;
1797 1.10 christos uint16_t a = (OP[0]), tmp;
1798 1.1 christos trace_input ("cbitw", OP_CONSTANT4, OP_R_INDEX8_ABS20, OP_VOID);
1799 1.1 christos
1800 1.1 christos if (OP[1] == 0)
1801 1.1 christos addr = (GPR32 (12)) + OP[2];
1802 1.1 christos else
1803 1.1 christos addr = (GPR32 (13)) + OP[2];
1804 1.1 christos
1805 1.1 christos tmp = RW (addr);
1806 1.1 christos SET_PSR_F (tmp & (1 << a));
1807 1.1 christos tmp = tmp & ~(1 << a);
1808 1.1 christos SW (addr, tmp);
1809 1.6 christos trace_output_32 (sd, addr);
1810 1.1 christos
1811 1.1 christos }
1812 1.1 christos
1813 1.1 christos /* cbitw. */
1814 1.1 christos void
1815 1.6 christos OP_1AB_A (SIM_DESC sd, SIM_CPU *cpu)
1816 1.1 christos {
1817 1.10 christos uint16_t a = (OP[0]);
1818 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1], tmp;
1819 1.1 christos trace_input ("cbitw", OP_CONSTANT4, OP_RP_INDEX_DISP14, OP_VOID);
1820 1.1 christos tmp = RW (addr);
1821 1.1 christos SET_PSR_F (tmp & (1 << a));
1822 1.1 christos tmp = tmp & ~(1 << a);
1823 1.1 christos SW (addr, tmp);
1824 1.6 christos trace_output_32 (sd, addr);
1825 1.1 christos }
1826 1.1 christos
1827 1.1 christos /* cbitw. */
1828 1.1 christos void
1829 1.6 christos OP_114_14 (SIM_DESC sd, SIM_CPU *cpu)
1830 1.1 christos {
1831 1.10 christos uint16_t a = (OP[0]);
1832 1.10 christos uint32_t addr = (GPR (OP[2])) + OP[1], tmp;
1833 1.1 christos trace_input ("cbitw", OP_CONSTANT4, OP_R_BASE_DISPS20, OP_VOID);
1834 1.1 christos tmp = RW (addr);
1835 1.1 christos SET_PSR_F (tmp & (1 << a));
1836 1.1 christos tmp = tmp & ~(1 << a);
1837 1.1 christos SW (addr, tmp);
1838 1.6 christos trace_output_32 (sd, addr);
1839 1.1 christos }
1840 1.1 christos
1841 1.1 christos
1842 1.1 christos /* cbitw. */
1843 1.1 christos void
1844 1.6 christos OP_6E_8 (SIM_DESC sd, SIM_CPU *cpu)
1845 1.1 christos {
1846 1.10 christos uint16_t a = (OP[0]);
1847 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1], tmp;
1848 1.1 christos trace_input ("cbitw", OP_CONSTANT4, OP_RP_INDEX_DISP0, OP_VOID);
1849 1.1 christos tmp = RW (addr);
1850 1.1 christos SET_PSR_F (tmp & (1 << a));
1851 1.1 christos tmp = tmp & ~(1 << a);
1852 1.1 christos SW (addr, tmp);
1853 1.6 christos trace_output_32 (sd, addr);
1854 1.1 christos }
1855 1.1 christos
1856 1.1 christos /* cbitw. */
1857 1.1 christos void
1858 1.6 christos OP_69_8 (SIM_DESC sd, SIM_CPU *cpu)
1859 1.1 christos {
1860 1.10 christos uint16_t a = (OP[0]);
1861 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1], tmp;
1862 1.1 christos trace_input ("cbitw", OP_CONSTANT4, OP_RP_BASE_DISP16, OP_VOID);
1863 1.1 christos tmp = RW (addr);
1864 1.1 christos SET_PSR_F (tmp & (1 << a));
1865 1.1 christos tmp = tmp & ~(1 << a);
1866 1.1 christos SW (addr, tmp);
1867 1.6 christos trace_output_32 (sd, addr);
1868 1.1 christos }
1869 1.1 christos
1870 1.1 christos
1871 1.1 christos /* cbitw. */
1872 1.1 christos void
1873 1.6 christos OP_115_14 (SIM_DESC sd, SIM_CPU *cpu)
1874 1.1 christos {
1875 1.10 christos uint16_t a = (OP[0]);
1876 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1], tmp;
1877 1.1 christos trace_input ("cbitw", OP_CONSTANT4, OP_RP_BASE_DISPS20, OP_VOID);
1878 1.1 christos tmp = RW (addr);
1879 1.1 christos SET_PSR_F (tmp & (1 << a));
1880 1.1 christos tmp = tmp & ~(1 << a);
1881 1.1 christos SW (addr, tmp);
1882 1.6 christos trace_output_32 (sd, addr);
1883 1.1 christos }
1884 1.1 christos
1885 1.1 christos /* cbitw. */
1886 1.1 christos void
1887 1.6 christos OP_116_14 (SIM_DESC sd, SIM_CPU *cpu)
1888 1.1 christos {
1889 1.10 christos uint16_t a = (OP[0]);
1890 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1], tmp;
1891 1.1 christos trace_input ("cbitw", OP_CONSTANT4, OP_RP_INDEX_DISPS20, OP_VOID);
1892 1.1 christos tmp = RW (addr);
1893 1.1 christos SET_PSR_F (tmp & (1 << a));
1894 1.1 christos tmp = tmp & ~(1 << a);
1895 1.1 christos SW (addr, tmp);
1896 1.6 christos trace_output_32 (sd, addr);
1897 1.1 christos }
1898 1.1 christos
1899 1.1 christos /* sbitb. */
1900 1.1 christos void
1901 1.6 christos OP_E7_9 (SIM_DESC sd, SIM_CPU *cpu)
1902 1.1 christos {
1903 1.10 christos uint8_t a = OP[0] & 0xff;
1904 1.10 christos uint32_t addr = OP[1], tmp;
1905 1.1 christos trace_input ("sbitb", OP_CONSTANT4, OP_ABS20_OUTPUT, OP_VOID);
1906 1.1 christos tmp = RB (addr);
1907 1.1 christos SET_PSR_F (tmp & (1 << a));
1908 1.1 christos tmp = tmp | (1 << a);
1909 1.1 christos SB (addr, tmp);
1910 1.6 christos trace_output_32 (sd, tmp);
1911 1.1 christos }
1912 1.1 christos
1913 1.1 christos /* sbitb. */
1914 1.1 christos void
1915 1.6 christos OP_10B_14 (SIM_DESC sd, SIM_CPU *cpu)
1916 1.1 christos {
1917 1.10 christos uint8_t a = OP[0] & 0xff;
1918 1.10 christos uint32_t addr = OP[1], tmp;
1919 1.1 christos trace_input ("sbitb", OP_CONSTANT4, OP_ABS24_OUTPUT, OP_VOID);
1920 1.1 christos tmp = RB (addr);
1921 1.1 christos SET_PSR_F (tmp & (1 << a));
1922 1.1 christos tmp = tmp | (1 << a);
1923 1.1 christos SB (addr, tmp);
1924 1.6 christos trace_output_32 (sd, tmp);
1925 1.1 christos }
1926 1.1 christos
1927 1.1 christos /* sbitb. */
1928 1.1 christos void
1929 1.6 christos OP_70_8 (SIM_DESC sd, SIM_CPU *cpu)
1930 1.1 christos {
1931 1.10 christos uint8_t a = OP[0] & 0xff;
1932 1.10 christos uint32_t addr = (GPR (OP[2])) + OP[1], tmp;
1933 1.1 christos trace_input ("sbitb", OP_CONSTANT4, OP_R_INDEX7_ABS20, OP_VOID);
1934 1.1 christos tmp = RB (addr);
1935 1.1 christos SET_PSR_F (tmp & (1 << a));
1936 1.1 christos tmp = tmp | (1 << a);
1937 1.1 christos SB (addr, tmp);
1938 1.6 christos trace_output_32 (sd, tmp);
1939 1.1 christos }
1940 1.1 christos
1941 1.1 christos /* sbitb. */
1942 1.1 christos void
1943 1.6 christos OP_1CA_A (SIM_DESC sd, SIM_CPU *cpu)
1944 1.1 christos {
1945 1.10 christos uint8_t a = OP[0] & 0xff;
1946 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1], tmp;
1947 1.1 christos trace_input ("sbitb", OP_CONSTANT4, OP_RP_INDEX_DISP14, OP_VOID);
1948 1.1 christos tmp = RB (addr);
1949 1.1 christos SET_PSR_F (tmp & (1 << a));
1950 1.1 christos tmp = tmp | (1 << a);
1951 1.1 christos SB (addr, tmp);
1952 1.6 christos trace_output_32 (sd, tmp);
1953 1.1 christos }
1954 1.1 christos
1955 1.1 christos /* sbitb. */
1956 1.1 christos void
1957 1.6 christos OP_108_14 (SIM_DESC sd, SIM_CPU *cpu)
1958 1.1 christos {
1959 1.10 christos uint8_t a = OP[0] & 0xff;
1960 1.10 christos uint32_t addr = (GPR (OP[2])) + OP[1], tmp;
1961 1.1 christos trace_input ("sbitb", OP_CONSTANT4, OP_R_BASE_DISPS20, OP_VOID);
1962 1.1 christos tmp = RB (addr);
1963 1.1 christos SET_PSR_F (tmp & (1 << a));
1964 1.1 christos tmp = tmp | (1 << a);
1965 1.1 christos SB (addr, tmp);
1966 1.6 christos trace_output_32 (sd, tmp);
1967 1.1 christos }
1968 1.1 christos
1969 1.1 christos
1970 1.1 christos /* sbitb. */
1971 1.1 christos void
1972 1.6 christos OP_E4_9 (SIM_DESC sd, SIM_CPU *cpu)
1973 1.1 christos {
1974 1.10 christos uint8_t a = OP[0] & 0xff;
1975 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1], tmp;
1976 1.1 christos trace_input ("sbitb", OP_CONSTANT4, OP_RP_INDEX_DISP0, OP_VOID);
1977 1.1 christos tmp = RB (addr);
1978 1.1 christos SET_PSR_F (tmp & (1 << a));
1979 1.1 christos tmp = tmp | (1 << a);
1980 1.1 christos SB (addr, tmp);
1981 1.6 christos trace_output_32 (sd, tmp);
1982 1.1 christos }
1983 1.1 christos
1984 1.1 christos /* sbitb. */
1985 1.1 christos void
1986 1.6 christos OP_E6_9 (SIM_DESC sd, SIM_CPU *cpu)
1987 1.1 christos {
1988 1.10 christos uint8_t a = OP[0] & 0xff;
1989 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1], tmp;
1990 1.1 christos trace_input ("sbitb", OP_CONSTANT4, OP_RP_BASE_DISP16, OP_VOID);
1991 1.1 christos tmp = RB (addr);
1992 1.1 christos SET_PSR_F (tmp & (1 << a));
1993 1.1 christos tmp = tmp | (1 << a);
1994 1.1 christos SB (addr, tmp);
1995 1.6 christos trace_output_32 (sd, tmp);
1996 1.1 christos }
1997 1.1 christos
1998 1.1 christos
1999 1.1 christos /* sbitb. */
2000 1.1 christos void
2001 1.6 christos OP_109_14 (SIM_DESC sd, SIM_CPU *cpu)
2002 1.1 christos {
2003 1.10 christos uint8_t a = OP[0] & 0xff;
2004 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1], tmp;
2005 1.1 christos trace_input ("sbitb", OP_CONSTANT4, OP_RP_BASE_DISPS20, OP_VOID);
2006 1.1 christos tmp = RB (addr);
2007 1.1 christos SET_PSR_F (tmp & (1 << a));
2008 1.1 christos tmp = tmp | (1 << a);
2009 1.1 christos SB (addr, tmp);
2010 1.6 christos trace_output_32 (sd, tmp);
2011 1.1 christos }
2012 1.1 christos
2013 1.1 christos
2014 1.1 christos /* sbitb. */
2015 1.1 christos void
2016 1.6 christos OP_10A_14 (SIM_DESC sd, SIM_CPU *cpu)
2017 1.1 christos {
2018 1.10 christos uint8_t a = OP[0] & 0xff;
2019 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1], tmp;
2020 1.1 christos trace_input ("sbitb", OP_CONSTANT4, OP_RP_INDEX_DISPS20, OP_VOID);
2021 1.1 christos tmp = RB (addr);
2022 1.1 christos SET_PSR_F (tmp & (1 << a));
2023 1.1 christos tmp = tmp | (1 << a);
2024 1.1 christos SB (addr, tmp);
2025 1.6 christos trace_output_32 (sd, tmp);
2026 1.1 christos }
2027 1.1 christos
2028 1.1 christos
2029 1.1 christos /* sbitw. */
2030 1.1 christos void
2031 1.6 christos OP_77_8 (SIM_DESC sd, SIM_CPU *cpu)
2032 1.1 christos {
2033 1.10 christos uint16_t a = OP[0];
2034 1.10 christos uint32_t addr = OP[1], tmp;
2035 1.1 christos trace_input ("sbitw", OP_CONSTANT4, OP_ABS20_OUTPUT, OP_VOID);
2036 1.1 christos tmp = RW (addr);
2037 1.1 christos SET_PSR_F (tmp & (1 << a));
2038 1.1 christos tmp = tmp | (1 << a);
2039 1.1 christos SW (addr, tmp);
2040 1.6 christos trace_output_32 (sd, tmp);
2041 1.1 christos }
2042 1.1 christos
2043 1.1 christos /* sbitw. */
2044 1.1 christos void
2045 1.6 christos OP_11B_14 (SIM_DESC sd, SIM_CPU *cpu)
2046 1.1 christos {
2047 1.10 christos uint16_t a = OP[0];
2048 1.10 christos uint32_t addr = OP[1], tmp;
2049 1.1 christos trace_input ("sbitw", OP_CONSTANT4, OP_ABS24_OUTPUT, OP_VOID);
2050 1.1 christos tmp = RW (addr);
2051 1.1 christos SET_PSR_F (tmp & (1 << a));
2052 1.1 christos tmp = tmp | (1 << a);
2053 1.1 christos SW (addr, tmp);
2054 1.6 christos trace_output_32 (sd, tmp);
2055 1.1 christos }
2056 1.1 christos
2057 1.1 christos /* sbitw. */
2058 1.1 christos void
2059 1.6 christos OP_3A_7 (SIM_DESC sd, SIM_CPU *cpu)
2060 1.1 christos {
2061 1.10 christos uint32_t addr;
2062 1.10 christos uint16_t a = (OP[0]), tmp;
2063 1.1 christos trace_input ("sbitw", OP_CONSTANT4, OP_R_INDEX8_ABS20, OP_VOID);
2064 1.1 christos
2065 1.1 christos if (OP[1] == 0)
2066 1.1 christos addr = (GPR32 (12)) + OP[2];
2067 1.1 christos else
2068 1.1 christos addr = (GPR32 (13)) + OP[2];
2069 1.1 christos
2070 1.1 christos tmp = RW (addr);
2071 1.1 christos SET_PSR_F (tmp & (1 << a));
2072 1.1 christos tmp = tmp | (1 << a);
2073 1.1 christos SW (addr, tmp);
2074 1.6 christos trace_output_32 (sd, addr);
2075 1.1 christos }
2076 1.1 christos
2077 1.1 christos /* sbitw. */
2078 1.1 christos void
2079 1.6 christos OP_1CB_A (SIM_DESC sd, SIM_CPU *cpu)
2080 1.1 christos {
2081 1.10 christos uint16_t a = (OP[0]);
2082 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1], tmp;
2083 1.1 christos trace_input ("sbitw", OP_CONSTANT4, OP_RP_INDEX_DISP14, OP_VOID);
2084 1.1 christos tmp = RW (addr);
2085 1.1 christos SET_PSR_F (tmp & (1 << a));
2086 1.1 christos tmp = tmp | (1 << a);
2087 1.1 christos SW (addr, tmp);
2088 1.6 christos trace_output_32 (sd, addr);
2089 1.1 christos }
2090 1.1 christos
2091 1.1 christos /* sbitw. */
2092 1.1 christos void
2093 1.6 christos OP_118_14 (SIM_DESC sd, SIM_CPU *cpu)
2094 1.1 christos {
2095 1.10 christos uint16_t a = (OP[0]);
2096 1.10 christos uint32_t addr = (GPR (OP[2])) + OP[1], tmp;
2097 1.1 christos trace_input ("sbitw", OP_CONSTANT4, OP_R_BASE_DISPS20, OP_VOID);
2098 1.1 christos tmp = RW (addr);
2099 1.1 christos SET_PSR_F (tmp & (1 << a));
2100 1.1 christos tmp = tmp | (1 << a);
2101 1.1 christos SW (addr, tmp);
2102 1.6 christos trace_output_32 (sd, addr);
2103 1.1 christos }
2104 1.1 christos
2105 1.1 christos /* sbitw. */
2106 1.1 christos void
2107 1.6 christos OP_76_8 (SIM_DESC sd, SIM_CPU *cpu)
2108 1.1 christos {
2109 1.10 christos uint16_t a = (OP[0]);
2110 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1], tmp;
2111 1.1 christos trace_input ("sbitw", OP_CONSTANT4, OP_RP_INDEX_DISP0, OP_VOID);
2112 1.1 christos tmp = RW (addr);
2113 1.1 christos SET_PSR_F (tmp & (1 << a));
2114 1.1 christos tmp = tmp | (1 << a);
2115 1.1 christos SW (addr, tmp);
2116 1.6 christos trace_output_32 (sd, addr);
2117 1.1 christos }
2118 1.1 christos
2119 1.1 christos /* sbitw. */
2120 1.1 christos void
2121 1.6 christos OP_71_8 (SIM_DESC sd, SIM_CPU *cpu)
2122 1.1 christos {
2123 1.10 christos uint16_t a = (OP[0]);
2124 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1], tmp;
2125 1.1 christos trace_input ("sbitw", OP_CONSTANT4, OP_RP_BASE_DISP16, OP_VOID);
2126 1.1 christos tmp = RW (addr);
2127 1.1 christos SET_PSR_F (tmp & (1 << a));
2128 1.1 christos tmp = tmp | (1 << a);
2129 1.1 christos SW (addr, tmp);
2130 1.6 christos trace_output_32 (sd, addr);
2131 1.1 christos }
2132 1.1 christos
2133 1.1 christos /* sbitw. */
2134 1.1 christos void
2135 1.6 christos OP_119_14 (SIM_DESC sd, SIM_CPU *cpu)
2136 1.1 christos {
2137 1.10 christos uint16_t a = (OP[0]);
2138 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1], tmp;
2139 1.1 christos trace_input ("sbitw", OP_CONSTANT4, OP_RP_BASE_DISPS20, OP_VOID);
2140 1.1 christos tmp = RW (addr);
2141 1.1 christos SET_PSR_F (tmp & (1 << a));
2142 1.1 christos tmp = tmp | (1 << a);
2143 1.1 christos SW (addr, tmp);
2144 1.6 christos trace_output_32 (sd, addr);
2145 1.1 christos }
2146 1.1 christos
2147 1.1 christos /* sbitw. */
2148 1.1 christos void
2149 1.6 christos OP_11A_14 (SIM_DESC sd, SIM_CPU *cpu)
2150 1.1 christos {
2151 1.10 christos uint16_t a = (OP[0]);
2152 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1], tmp;
2153 1.1 christos trace_input ("sbitw", OP_CONSTANT4, OP_RP_INDEX_DISPS20, OP_VOID);
2154 1.1 christos tmp = RW (addr);
2155 1.1 christos SET_PSR_F (tmp & (1 << a));
2156 1.1 christos tmp = tmp | (1 << a);
2157 1.1 christos SW (addr, tmp);
2158 1.6 christos trace_output_32 (sd, addr);
2159 1.1 christos }
2160 1.1 christos
2161 1.1 christos
2162 1.1 christos /* tbitb. */
2163 1.1 christos void
2164 1.6 christos OP_F7_9 (SIM_DESC sd, SIM_CPU *cpu)
2165 1.1 christos {
2166 1.10 christos uint8_t a = OP[0] & 0xff;
2167 1.10 christos uint32_t addr = OP[1], tmp;
2168 1.1 christos trace_input ("tbitb", OP_CONSTANT4, OP_ABS20_OUTPUT, OP_VOID);
2169 1.1 christos tmp = RB (addr);
2170 1.1 christos SET_PSR_F (tmp & (1 << a));
2171 1.6 christos trace_output_32 (sd, tmp);
2172 1.1 christos }
2173 1.1 christos
2174 1.1 christos /* tbitb. */
2175 1.1 christos void
2176 1.6 christos OP_10F_14 (SIM_DESC sd, SIM_CPU *cpu)
2177 1.1 christos {
2178 1.10 christos uint8_t a = OP[0] & 0xff;
2179 1.10 christos uint32_t addr = OP[1], tmp;
2180 1.1 christos trace_input ("tbitb", OP_CONSTANT4, OP_ABS24_OUTPUT, OP_VOID);
2181 1.1 christos tmp = RB (addr);
2182 1.1 christos SET_PSR_F (tmp & (1 << a));
2183 1.6 christos trace_output_32 (sd, tmp);
2184 1.1 christos }
2185 1.1 christos
2186 1.1 christos /* tbitb. */
2187 1.1 christos void
2188 1.6 christos OP_78_8 (SIM_DESC sd, SIM_CPU *cpu)
2189 1.1 christos {
2190 1.10 christos uint8_t a = (OP[0]) & 0xff;
2191 1.10 christos uint32_t addr = (GPR (OP[2])) + OP[1], tmp;
2192 1.1 christos trace_input ("tbitb", OP_CONSTANT4, OP_R_INDEX7_ABS20, OP_VOID);
2193 1.1 christos tmp = RB (addr);
2194 1.1 christos SET_PSR_F (tmp & (1 << a));
2195 1.6 christos trace_output_32 (sd, addr);
2196 1.1 christos }
2197 1.1 christos
2198 1.1 christos /* tbitb. */
2199 1.1 christos void
2200 1.6 christos OP_1EA_A (SIM_DESC sd, SIM_CPU *cpu)
2201 1.1 christos {
2202 1.10 christos uint8_t a = (OP[0]) & 0xff;
2203 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1], tmp;
2204 1.1 christos trace_input ("tbitb", OP_CONSTANT4, OP_RP_INDEX_DISP14, OP_VOID);
2205 1.1 christos tmp = RB (addr);
2206 1.1 christos SET_PSR_F (tmp & (1 << a));
2207 1.6 christos trace_output_32 (sd, addr);
2208 1.1 christos }
2209 1.1 christos
2210 1.1 christos /* tbitb. */
2211 1.1 christos void
2212 1.6 christos OP_10C_14 (SIM_DESC sd, SIM_CPU *cpu)
2213 1.1 christos {
2214 1.10 christos uint8_t a = (OP[0]) & 0xff;
2215 1.10 christos uint32_t addr = (GPR (OP[2])) + OP[1], tmp;
2216 1.1 christos trace_input ("tbitb", OP_CONSTANT4, OP_R_BASE_DISPS20, OP_VOID);
2217 1.1 christos tmp = RB (addr);
2218 1.1 christos SET_PSR_F (tmp & (1 << a));
2219 1.6 christos trace_output_32 (sd, addr);
2220 1.1 christos }
2221 1.1 christos
2222 1.1 christos /* tbitb. */
2223 1.1 christos void
2224 1.6 christos OP_F4_9 (SIM_DESC sd, SIM_CPU *cpu)
2225 1.1 christos {
2226 1.10 christos uint8_t a = (OP[0]) & 0xff;
2227 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1], tmp;
2228 1.1 christos trace_input ("tbitb", OP_CONSTANT4, OP_RP_INDEX_DISP0, OP_VOID);
2229 1.1 christos tmp = RB (addr);
2230 1.1 christos SET_PSR_F (tmp & (1 << a));
2231 1.6 christos trace_output_32 (sd, addr);
2232 1.1 christos }
2233 1.1 christos
2234 1.1 christos /* tbitb. */
2235 1.1 christos void
2236 1.6 christos OP_F6_9 (SIM_DESC sd, SIM_CPU *cpu)
2237 1.1 christos {
2238 1.10 christos uint8_t a = (OP[0]) & 0xff;
2239 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1], tmp;
2240 1.1 christos trace_input ("tbitb", OP_CONSTANT4, OP_RP_BASE_DISP16, OP_VOID);
2241 1.1 christos tmp = RB (addr);
2242 1.1 christos SET_PSR_F (tmp & (1 << a));
2243 1.6 christos trace_output_32 (sd, addr);
2244 1.1 christos }
2245 1.1 christos
2246 1.1 christos /* tbitb. */
2247 1.1 christos void
2248 1.6 christos OP_10D_14 (SIM_DESC sd, SIM_CPU *cpu)
2249 1.1 christos {
2250 1.10 christos uint8_t a = (OP[0]) & 0xff;
2251 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1], tmp;
2252 1.1 christos trace_input ("tbitb", OP_CONSTANT4, OP_RP_BASE_DISPS20, OP_VOID);
2253 1.1 christos tmp = RB (addr);
2254 1.1 christos SET_PSR_F (tmp & (1 << a));
2255 1.6 christos trace_output_32 (sd, addr);
2256 1.1 christos }
2257 1.1 christos
2258 1.1 christos /* tbitb. */
2259 1.1 christos void
2260 1.6 christos OP_10E_14 (SIM_DESC sd, SIM_CPU *cpu)
2261 1.1 christos {
2262 1.10 christos uint8_t a = (OP[0]) & 0xff;
2263 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1], tmp;
2264 1.1 christos trace_input ("tbitb", OP_CONSTANT4, OP_RP_INDEX_DISPS20, OP_VOID);
2265 1.1 christos tmp = RB (addr);
2266 1.1 christos SET_PSR_F (tmp & (1 << a));
2267 1.6 christos trace_output_32 (sd, addr);
2268 1.1 christos }
2269 1.1 christos
2270 1.1 christos
2271 1.1 christos /* tbitw. */
2272 1.1 christos void
2273 1.6 christos OP_7F_8 (SIM_DESC sd, SIM_CPU *cpu)
2274 1.1 christos {
2275 1.10 christos uint16_t a = OP[0];
2276 1.10 christos uint32_t addr = OP[1], tmp;
2277 1.1 christos trace_input ("tbitw", OP_CONSTANT4, OP_ABS20_OUTPUT, OP_VOID);
2278 1.1 christos tmp = RW (addr);
2279 1.1 christos SET_PSR_F (tmp & (1 << a));
2280 1.6 christos trace_output_32 (sd, tmp);
2281 1.1 christos }
2282 1.1 christos
2283 1.1 christos /* tbitw. */
2284 1.1 christos void
2285 1.6 christos OP_11F_14 (SIM_DESC sd, SIM_CPU *cpu)
2286 1.1 christos {
2287 1.10 christos uint16_t a = OP[0];
2288 1.10 christos uint32_t addr = OP[1], tmp;
2289 1.1 christos trace_input ("tbitw", OP_CONSTANT4, OP_ABS24_OUTPUT, OP_VOID);
2290 1.1 christos tmp = RW (addr);
2291 1.1 christos SET_PSR_F (tmp & (1 << a));
2292 1.6 christos trace_output_32 (sd, tmp);
2293 1.1 christos }
2294 1.1 christos
2295 1.1 christos
2296 1.1 christos /* tbitw. */
2297 1.1 christos void
2298 1.6 christos OP_3E_7 (SIM_DESC sd, SIM_CPU *cpu)
2299 1.1 christos {
2300 1.10 christos uint32_t addr;
2301 1.10 christos uint16_t a = (OP[0]), tmp;
2302 1.1 christos trace_input ("tbitw", OP_CONSTANT4, OP_R_INDEX8_ABS20, OP_VOID);
2303 1.1 christos
2304 1.1 christos if (OP[1] == 0)
2305 1.1 christos addr = (GPR32 (12)) + OP[2];
2306 1.1 christos else
2307 1.1 christos addr = (GPR32 (13)) + OP[2];
2308 1.1 christos
2309 1.1 christos tmp = RW (addr);
2310 1.1 christos SET_PSR_F (tmp & (1 << a));
2311 1.6 christos trace_output_32 (sd, addr);
2312 1.1 christos }
2313 1.1 christos
2314 1.1 christos /* tbitw. */
2315 1.1 christos void
2316 1.6 christos OP_1EB_A (SIM_DESC sd, SIM_CPU *cpu)
2317 1.1 christos {
2318 1.10 christos uint16_t a = (OP[0]);
2319 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1], tmp;
2320 1.1 christos trace_input ("tbitw", OP_CONSTANT4, OP_RP_INDEX_DISP14, OP_VOID);
2321 1.1 christos tmp = RW (addr);
2322 1.1 christos SET_PSR_F (tmp & (1 << a));
2323 1.6 christos trace_output_32 (sd, addr);
2324 1.1 christos }
2325 1.1 christos
2326 1.1 christos /* tbitw. */
2327 1.1 christos void
2328 1.6 christos OP_11C_14 (SIM_DESC sd, SIM_CPU *cpu)
2329 1.1 christos {
2330 1.10 christos uint16_t a = (OP[0]);
2331 1.10 christos uint32_t addr = (GPR (OP[2])) + OP[1], tmp;
2332 1.1 christos trace_input ("tbitw", OP_CONSTANT4, OP_R_BASE_DISPS20, OP_VOID);
2333 1.1 christos tmp = RW (addr);
2334 1.1 christos SET_PSR_F (tmp & (1 << a));
2335 1.6 christos trace_output_32 (sd, addr);
2336 1.1 christos }
2337 1.1 christos
2338 1.1 christos /* tbitw. */
2339 1.1 christos void
2340 1.6 christos OP_7E_8 (SIM_DESC sd, SIM_CPU *cpu)
2341 1.1 christos {
2342 1.10 christos uint16_t a = (OP[0]);
2343 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1], tmp;
2344 1.1 christos trace_input ("tbitw", OP_CONSTANT4, OP_RP_INDEX_DISP0, OP_VOID);
2345 1.1 christos tmp = RW (addr);
2346 1.1 christos SET_PSR_F (tmp & (1 << a));
2347 1.6 christos trace_output_32 (sd, addr);
2348 1.1 christos }
2349 1.1 christos
2350 1.1 christos /* tbitw. */
2351 1.1 christos void
2352 1.6 christos OP_79_8 (SIM_DESC sd, SIM_CPU *cpu)
2353 1.1 christos {
2354 1.10 christos uint16_t a = (OP[0]);
2355 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1], tmp;
2356 1.1 christos trace_input ("tbitw", OP_CONSTANT4, OP_RP_BASE_DISP16, OP_VOID);
2357 1.1 christos tmp = RW (addr);
2358 1.1 christos SET_PSR_F (tmp & (1 << a));
2359 1.6 christos trace_output_32 (sd, addr);
2360 1.1 christos }
2361 1.1 christos
2362 1.1 christos /* tbitw. */
2363 1.1 christos void
2364 1.6 christos OP_11D_14 (SIM_DESC sd, SIM_CPU *cpu)
2365 1.1 christos {
2366 1.10 christos uint16_t a = (OP[0]);
2367 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1], tmp;
2368 1.1 christos trace_input ("tbitw", OP_CONSTANT4, OP_RP_BASE_DISPS20, OP_VOID);
2369 1.1 christos tmp = RW (addr);
2370 1.1 christos SET_PSR_F (tmp & (1 << a));
2371 1.6 christos trace_output_32 (sd, addr);
2372 1.1 christos }
2373 1.1 christos
2374 1.1 christos
2375 1.1 christos /* tbitw. */
2376 1.1 christos void
2377 1.6 christos OP_11E_14 (SIM_DESC sd, SIM_CPU *cpu)
2378 1.1 christos {
2379 1.10 christos uint16_t a = (OP[0]);
2380 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1], tmp;
2381 1.1 christos trace_input ("tbitw", OP_CONSTANT4, OP_RP_INDEX_DISPS20, OP_VOID);
2382 1.1 christos tmp = RW (addr);
2383 1.1 christos SET_PSR_F (tmp & (1 << a));
2384 1.6 christos trace_output_32 (sd, addr);
2385 1.1 christos }
2386 1.1 christos
2387 1.1 christos
2388 1.1 christos /* tbit. */
2389 1.1 christos void
2390 1.6 christos OP_6_8 (SIM_DESC sd, SIM_CPU *cpu)
2391 1.1 christos {
2392 1.10 christos uint16_t a = OP[0];
2393 1.10 christos uint16_t b = (GPR (OP[1]));
2394 1.1 christos trace_input ("tbit", OP_CONSTANT4, OP_REG, OP_VOID);
2395 1.1 christos SET_PSR_F (b & (1 << a));
2396 1.6 christos trace_output_16 (sd, b);
2397 1.1 christos }
2398 1.1 christos
2399 1.1 christos /* tbit. */
2400 1.1 christos void
2401 1.6 christos OP_7_8 (SIM_DESC sd, SIM_CPU *cpu)
2402 1.1 christos {
2403 1.10 christos uint16_t a = GPR (OP[0]);
2404 1.10 christos uint16_t b = (GPR (OP[1]));
2405 1.1 christos trace_input ("tbit", OP_REG, OP_REG, OP_VOID);
2406 1.1 christos SET_PSR_F (b & (1 << a));
2407 1.6 christos trace_output_16 (sd, b);
2408 1.1 christos }
2409 1.1 christos
2410 1.1 christos
2411 1.1 christos /* cmpb. */
2412 1.1 christos void
2413 1.6 christos OP_50_8 (SIM_DESC sd, SIM_CPU *cpu)
2414 1.1 christos {
2415 1.10 christos uint8_t a = (OP[0]) & 0xFF;
2416 1.10 christos uint8_t b = (GPR (OP[1])) & 0xFF;
2417 1.1 christos trace_input ("cmpb", OP_CONSTANT4, OP_REG, OP_VOID);
2418 1.1 christos SET_PSR_Z (a == b);
2419 1.10 christos SET_PSR_N ((int8_t)a > (int8_t)b);
2420 1.1 christos SET_PSR_L (a > b);
2421 1.6 christos trace_output_flag (sd);
2422 1.1 christos }
2423 1.1 christos
2424 1.1 christos /* cmpb. */
2425 1.1 christos void
2426 1.6 christos OP_50B_C (SIM_DESC sd, SIM_CPU *cpu)
2427 1.1 christos {
2428 1.10 christos uint8_t a = (OP[0]) & 0xFF;
2429 1.10 christos uint8_t b = (GPR (OP[1])) & 0xFF;
2430 1.1 christos trace_input ("cmpb", OP_CONSTANT16, OP_REG, OP_VOID);
2431 1.1 christos SET_PSR_Z (a == b);
2432 1.10 christos SET_PSR_N ((int8_t)a > (int8_t)b);
2433 1.1 christos SET_PSR_L (a > b);
2434 1.6 christos trace_output_flag (sd);
2435 1.1 christos }
2436 1.1 christos
2437 1.1 christos /* cmpb. */
2438 1.1 christos void
2439 1.6 christos OP_51_8 (SIM_DESC sd, SIM_CPU *cpu)
2440 1.1 christos {
2441 1.10 christos uint8_t a = (GPR (OP[0])) & 0xFF;
2442 1.10 christos uint8_t b = (GPR (OP[1])) & 0xFF;
2443 1.1 christos trace_input ("cmpb", OP_REG, OP_REG, OP_VOID);
2444 1.1 christos SET_PSR_Z (a == b);
2445 1.10 christos SET_PSR_N ((int8_t)a > (int8_t)b);
2446 1.1 christos SET_PSR_L (a > b);
2447 1.6 christos trace_output_flag (sd);
2448 1.1 christos }
2449 1.1 christos
2450 1.1 christos /* cmpw. */
2451 1.1 christos void
2452 1.6 christos OP_52_8 (SIM_DESC sd, SIM_CPU *cpu)
2453 1.1 christos {
2454 1.10 christos uint16_t a = (OP[0]);
2455 1.10 christos uint16_t b = GPR (OP[1]);
2456 1.1 christos trace_input ("cmpw", OP_CONSTANT4, OP_REG, OP_VOID);
2457 1.1 christos SET_PSR_Z (a == b);
2458 1.10 christos SET_PSR_N ((int16_t)a > (int16_t)b);
2459 1.1 christos SET_PSR_L (a > b);
2460 1.6 christos trace_output_flag (sd);
2461 1.1 christos }
2462 1.1 christos
2463 1.1 christos /* cmpw. */
2464 1.1 christos void
2465 1.6 christos OP_52B_C (SIM_DESC sd, SIM_CPU *cpu)
2466 1.1 christos {
2467 1.10 christos uint16_t a = (OP[0]);
2468 1.10 christos uint16_t b = GPR (OP[1]);
2469 1.1 christos trace_input ("cmpw", OP_CONSTANT16, OP_REG, OP_VOID);
2470 1.1 christos SET_PSR_Z (a == b);
2471 1.10 christos SET_PSR_N ((int16_t)a > (int16_t)b);
2472 1.1 christos SET_PSR_L (a > b);
2473 1.6 christos trace_output_flag (sd);
2474 1.1 christos }
2475 1.1 christos
2476 1.1 christos /* cmpw. */
2477 1.1 christos void
2478 1.6 christos OP_53_8 (SIM_DESC sd, SIM_CPU *cpu)
2479 1.1 christos {
2480 1.10 christos uint16_t a = GPR (OP[0]) ;
2481 1.10 christos uint16_t b = GPR (OP[1]) ;
2482 1.1 christos trace_input ("cmpw", OP_REG, OP_REG, OP_VOID);
2483 1.1 christos SET_PSR_Z (a == b);
2484 1.10 christos SET_PSR_N ((int16_t)a > (int16_t)b);
2485 1.1 christos SET_PSR_L (a > b);
2486 1.6 christos trace_output_flag (sd);
2487 1.1 christos }
2488 1.1 christos
2489 1.1 christos /* cmpd. */
2490 1.1 christos void
2491 1.6 christos OP_56_8 (SIM_DESC sd, SIM_CPU *cpu)
2492 1.1 christos {
2493 1.10 christos uint32_t a = (OP[0]);
2494 1.10 christos uint32_t b = GPR32 (OP[1]);
2495 1.1 christos trace_input ("cmpd", OP_CONSTANT4, OP_REGP, OP_VOID);
2496 1.1 christos SET_PSR_Z (a == b);
2497 1.10 christos SET_PSR_N ((int32_t)a > (int32_t)b);
2498 1.1 christos SET_PSR_L (a > b);
2499 1.6 christos trace_output_flag (sd);
2500 1.1 christos }
2501 1.1 christos
2502 1.1 christos /* cmpd. */
2503 1.1 christos void
2504 1.6 christos OP_56B_C (SIM_DESC sd, SIM_CPU *cpu)
2505 1.1 christos {
2506 1.10 christos uint32_t a = (SEXT16(OP[0]));
2507 1.10 christos uint32_t b = GPR32 (OP[1]);
2508 1.1 christos trace_input ("cmpd", OP_CONSTANT16, OP_REGP, OP_VOID);
2509 1.1 christos SET_PSR_Z (a == b);
2510 1.10 christos SET_PSR_N ((int32_t)a > (int32_t)b);
2511 1.1 christos SET_PSR_L (a > b);
2512 1.6 christos trace_output_flag (sd);
2513 1.1 christos }
2514 1.1 christos
2515 1.1 christos /* cmpd. */
2516 1.1 christos void
2517 1.6 christos OP_57_8 (SIM_DESC sd, SIM_CPU *cpu)
2518 1.1 christos {
2519 1.10 christos uint32_t a = GPR32 (OP[0]) ;
2520 1.10 christos uint32_t b = GPR32 (OP[1]) ;
2521 1.1 christos trace_input ("cmpd", OP_REGP, OP_REGP, OP_VOID);
2522 1.1 christos SET_PSR_Z (a == b);
2523 1.10 christos SET_PSR_N ((int32_t)a > (int32_t)b);
2524 1.1 christos SET_PSR_L (a > b);
2525 1.6 christos trace_output_flag (sd);
2526 1.1 christos }
2527 1.1 christos
2528 1.1 christos /* cmpd. */
2529 1.1 christos void
2530 1.6 christos OP_9_C (SIM_DESC sd, SIM_CPU *cpu)
2531 1.1 christos {
2532 1.10 christos uint32_t a = (OP[0]);
2533 1.10 christos uint32_t b = GPR32 (OP[1]);
2534 1.1 christos trace_input ("cmpd", OP_CONSTANT32, OP_REGP, OP_VOID);
2535 1.1 christos SET_PSR_Z (a == b);
2536 1.10 christos SET_PSR_N ((int32_t)a > (int32_t)b);
2537 1.1 christos SET_PSR_L (a > b);
2538 1.6 christos trace_output_flag (sd);
2539 1.1 christos }
2540 1.1 christos
2541 1.1 christos
2542 1.1 christos /* movb. */
2543 1.1 christos void
2544 1.6 christos OP_58_8 (SIM_DESC sd, SIM_CPU *cpu)
2545 1.1 christos {
2546 1.10 christos uint8_t tmp = OP[0] & 0xFF;
2547 1.10 christos uint16_t a = (GPR (OP[1])) & 0xFF00;
2548 1.1 christos trace_input ("movb", OP_CONSTANT4, OP_REG, OP_VOID);
2549 1.1 christos SET_GPR (OP[1], (a | tmp));
2550 1.6 christos trace_output_16 (sd, tmp);
2551 1.1 christos }
2552 1.1 christos
2553 1.1 christos /* movb. */
2554 1.1 christos void
2555 1.6 christos OP_58B_C (SIM_DESC sd, SIM_CPU *cpu)
2556 1.1 christos {
2557 1.10 christos uint8_t tmp = OP[0] & 0xFF;
2558 1.10 christos uint16_t a = (GPR (OP[1])) & 0xFF00;
2559 1.1 christos trace_input ("movb", OP_CONSTANT16, OP_REG, OP_VOID);
2560 1.1 christos SET_GPR (OP[1], (a | tmp));
2561 1.6 christos trace_output_16 (sd, tmp);
2562 1.1 christos }
2563 1.1 christos
2564 1.1 christos /* movb. */
2565 1.1 christos void
2566 1.6 christos OP_59_8 (SIM_DESC sd, SIM_CPU *cpu)
2567 1.1 christos {
2568 1.10 christos uint8_t tmp = (GPR (OP[0])) & 0xFF;
2569 1.10 christos uint16_t a = (GPR (OP[1])) & 0xFF00;
2570 1.1 christos trace_input ("movb", OP_REG, OP_REG, OP_VOID);
2571 1.1 christos SET_GPR (OP[1], (a | tmp));
2572 1.6 christos trace_output_16 (sd, tmp);
2573 1.1 christos }
2574 1.1 christos
2575 1.1 christos /* movw. */
2576 1.1 christos void
2577 1.6 christos OP_5A_8 (SIM_DESC sd, SIM_CPU *cpu)
2578 1.1 christos {
2579 1.10 christos uint16_t tmp = OP[0];
2580 1.1 christos trace_input ("movw", OP_CONSTANT4_1, OP_REG, OP_VOID);
2581 1.1 christos SET_GPR (OP[1], (tmp & 0xffff));
2582 1.6 christos trace_output_16 (sd, tmp);
2583 1.1 christos }
2584 1.1 christos
2585 1.1 christos /* movw. */
2586 1.1 christos void
2587 1.6 christos OP_5AB_C (SIM_DESC sd, SIM_CPU *cpu)
2588 1.1 christos {
2589 1.10 christos int16_t tmp = OP[0];
2590 1.1 christos trace_input ("movw", OP_CONSTANT16, OP_REG, OP_VOID);
2591 1.1 christos SET_GPR (OP[1], (tmp & 0xffff));
2592 1.6 christos trace_output_16 (sd, tmp);
2593 1.1 christos }
2594 1.1 christos
2595 1.1 christos /* movw. */
2596 1.1 christos void
2597 1.6 christos OP_5B_8 (SIM_DESC sd, SIM_CPU *cpu)
2598 1.1 christos {
2599 1.10 christos uint16_t tmp = GPR (OP[0]);
2600 1.10 christos uint32_t a = GPR32 (OP[1]);
2601 1.1 christos trace_input ("movw", OP_REG, OP_REGP, OP_VOID);
2602 1.1 christos a = (a & 0xffff0000) | tmp;
2603 1.1 christos SET_GPR32 (OP[1], a);
2604 1.6 christos trace_output_16 (sd, tmp);
2605 1.1 christos }
2606 1.1 christos
2607 1.1 christos /* movxb. */
2608 1.1 christos void
2609 1.6 christos OP_5C_8 (SIM_DESC sd, SIM_CPU *cpu)
2610 1.1 christos {
2611 1.10 christos uint8_t tmp = (GPR (OP[0])) & 0xFF;
2612 1.1 christos trace_input ("movxb", OP_REG, OP_REG, OP_VOID);
2613 1.1 christos SET_GPR (OP[1], ((SEXT8(tmp)) & 0xffff));
2614 1.6 christos trace_output_16 (sd, tmp);
2615 1.1 christos }
2616 1.1 christos
2617 1.1 christos /* movzb. */
2618 1.1 christos void
2619 1.6 christos OP_5D_8 (SIM_DESC sd, SIM_CPU *cpu)
2620 1.1 christos {
2621 1.10 christos uint8_t tmp = (GPR (OP[0])) & 0xFF;
2622 1.1 christos trace_input ("movzb", OP_REG, OP_REG, OP_VOID);
2623 1.1 christos SET_GPR (OP[1], tmp);
2624 1.6 christos trace_output_16 (sd, tmp);
2625 1.1 christos }
2626 1.1 christos
2627 1.1 christos /* movxw. */
2628 1.1 christos void
2629 1.6 christos OP_5E_8 (SIM_DESC sd, SIM_CPU *cpu)
2630 1.1 christos {
2631 1.10 christos uint16_t tmp = GPR (OP[0]);
2632 1.1 christos trace_input ("movxw", OP_REG, OP_REGP, OP_VOID);
2633 1.1 christos SET_GPR32 (OP[1], SEXT16(tmp));
2634 1.6 christos trace_output_16 (sd, tmp);
2635 1.1 christos }
2636 1.1 christos
2637 1.1 christos /* movzw. */
2638 1.1 christos void
2639 1.6 christos OP_5F_8 (SIM_DESC sd, SIM_CPU *cpu)
2640 1.1 christos {
2641 1.10 christos uint16_t tmp = GPR (OP[0]);
2642 1.1 christos trace_input ("movzw", OP_REG, OP_REGP, OP_VOID);
2643 1.1 christos SET_GPR32 (OP[1], (tmp & 0x0000FFFF));
2644 1.6 christos trace_output_16 (sd, tmp);
2645 1.1 christos }
2646 1.1 christos
2647 1.1 christos /* movd. */
2648 1.1 christos void
2649 1.6 christos OP_54_8 (SIM_DESC sd, SIM_CPU *cpu)
2650 1.1 christos {
2651 1.10 christos int32_t tmp = OP[0];
2652 1.1 christos trace_input ("movd", OP_CONSTANT4, OP_REGP, OP_VOID);
2653 1.1 christos SET_GPR32 (OP[1], tmp);
2654 1.6 christos trace_output_32 (sd, tmp);
2655 1.1 christos }
2656 1.1 christos
2657 1.1 christos /* movd. */
2658 1.1 christos void
2659 1.6 christos OP_54B_C (SIM_DESC sd, SIM_CPU *cpu)
2660 1.1 christos {
2661 1.10 christos int32_t tmp = SEXT16(OP[0]);
2662 1.1 christos trace_input ("movd", OP_CONSTANT16, OP_REGP, OP_VOID);
2663 1.1 christos SET_GPR32 (OP[1], tmp);
2664 1.6 christos trace_output_32 (sd, tmp);
2665 1.1 christos }
2666 1.1 christos
2667 1.1 christos /* movd. */
2668 1.1 christos void
2669 1.6 christos OP_55_8 (SIM_DESC sd, SIM_CPU *cpu)
2670 1.1 christos {
2671 1.10 christos uint32_t tmp = GPR32 (OP[0]);
2672 1.1 christos trace_input ("movd", OP_REGP, OP_REGP, OP_VOID);
2673 1.1 christos SET_GPR32 (OP[1], tmp);
2674 1.6 christos trace_output_32 (sd, tmp);
2675 1.1 christos }
2676 1.1 christos
2677 1.1 christos /* movd. */
2678 1.1 christos void
2679 1.6 christos OP_5_8 (SIM_DESC sd, SIM_CPU *cpu)
2680 1.1 christos {
2681 1.10 christos uint32_t tmp = OP[0];
2682 1.1 christos trace_input ("movd", OP_CONSTANT20, OP_REGP, OP_VOID);
2683 1.1 christos SET_GPR32 (OP[1], tmp);
2684 1.6 christos trace_output_32 (sd, tmp);
2685 1.1 christos }
2686 1.1 christos
2687 1.1 christos /* movd. */
2688 1.1 christos void
2689 1.6 christos OP_7_C (SIM_DESC sd, SIM_CPU *cpu)
2690 1.1 christos {
2691 1.10 christos int32_t tmp = OP[0];
2692 1.1 christos trace_input ("movd", OP_CONSTANT32, OP_REGP, OP_VOID);
2693 1.1 christos SET_GPR32 (OP[1], tmp);
2694 1.6 christos trace_output_32 (sd, tmp);
2695 1.1 christos }
2696 1.1 christos
2697 1.1 christos /* loadm. */
2698 1.1 christos void
2699 1.6 christos OP_14_D (SIM_DESC sd, SIM_CPU *cpu)
2700 1.1 christos {
2701 1.10 christos uint32_t addr = GPR (0);
2702 1.10 christos uint16_t count = OP[0], reg = 2, tmp;
2703 1.1 christos trace_input ("loadm", OP_CONSTANT4, OP_VOID, OP_VOID);
2704 1.1 christos if ((addr & 1))
2705 1.1 christos {
2706 1.6 christos trace_output_void (sd);
2707 1.6 christos EXCEPTION (SIM_SIGBUS);
2708 1.1 christos }
2709 1.1 christos
2710 1.1 christos while (count)
2711 1.1 christos {
2712 1.1 christos tmp = RW (addr);
2713 1.1 christos SET_GPR (reg, tmp);
2714 1.1 christos addr +=2;
2715 1.1 christos --count;
2716 1.1 christos reg++;
2717 1.1 christos if (reg == 6) reg = 8;
2718 1.1 christos };
2719 1.1 christos
2720 1.1 christos SET_GPR (0, addr);
2721 1.6 christos trace_output_void (sd);
2722 1.1 christos }
2723 1.1 christos
2724 1.1 christos
2725 1.1 christos /* loadmp. */
2726 1.1 christos void
2727 1.6 christos OP_15_D (SIM_DESC sd, SIM_CPU *cpu)
2728 1.1 christos {
2729 1.10 christos uint32_t addr = GPR32 (0);
2730 1.10 christos uint16_t count = OP[0], reg = 2, tmp;
2731 1.1 christos trace_input ("loadm", OP_CONSTANT4, OP_VOID, OP_VOID);
2732 1.1 christos if ((addr & 1))
2733 1.1 christos {
2734 1.6 christos trace_output_void (sd);
2735 1.6 christos EXCEPTION (SIM_SIGBUS);
2736 1.1 christos }
2737 1.1 christos
2738 1.1 christos while (count)
2739 1.1 christos {
2740 1.1 christos tmp = RW (addr);
2741 1.1 christos SET_GPR (reg, tmp);
2742 1.1 christos addr +=2;
2743 1.1 christos --count;
2744 1.1 christos reg++;
2745 1.1 christos if (reg == 6) reg = 8;
2746 1.1 christos };
2747 1.1 christos
2748 1.1 christos SET_GPR32 (0, addr);
2749 1.6 christos trace_output_void (sd);
2750 1.1 christos }
2751 1.1 christos
2752 1.1 christos
2753 1.1 christos /* loadb. */
2754 1.1 christos void
2755 1.6 christos OP_88_8 (SIM_DESC sd, SIM_CPU *cpu)
2756 1.1 christos {
2757 1.1 christos /* loadb ABS20, REG
2758 1.1 christos * ADDR = zext24(abs20) | remap (ie 0xF00000)
2759 1.1 christos * REG = [ADDR]
2760 1.1 christos * NOTE: remap is
2761 1.1 christos * If (abs20 > 0xEFFFF) the resulting address is logically ORed
2762 1.1 christos * with 0xF00000 i.e. addresses from 1M-64k to 1M are re-mapped
2763 1.1 christos * by the core to 16M-64k to 16M. */
2764 1.1 christos
2765 1.10 christos uint16_t tmp, a = (GPR (OP[1])) & 0xFF00;
2766 1.10 christos uint32_t addr = OP[0];
2767 1.1 christos trace_input ("loadb", OP_ABS20, OP_REG, OP_VOID);
2768 1.1 christos if (addr > 0xEFFFF) addr |= 0xF00000;
2769 1.1 christos tmp = (RB (addr));
2770 1.1 christos SET_GPR (OP[1], (a | tmp));
2771 1.6 christos trace_output_16 (sd, tmp);
2772 1.1 christos }
2773 1.1 christos
2774 1.1 christos /* loadb. */
2775 1.1 christos void
2776 1.6 christos OP_127_14 (SIM_DESC sd, SIM_CPU *cpu)
2777 1.1 christos {
2778 1.1 christos /* loadb ABS24, REG
2779 1.1 christos * ADDR = abs24
2780 1.1 christos * REGR = [ADDR]. */
2781 1.1 christos
2782 1.10 christos uint16_t tmp, a = (GPR (OP[1])) & 0xFF00;
2783 1.10 christos uint32_t addr = OP[0];
2784 1.1 christos trace_input ("loadb", OP_ABS24, OP_REG, OP_VOID);
2785 1.1 christos tmp = (RB (addr));
2786 1.1 christos SET_GPR (OP[1], (a | tmp));
2787 1.6 christos trace_output_16 (sd, tmp);
2788 1.1 christos }
2789 1.1 christos
2790 1.1 christos /* loadb. */
2791 1.1 christos void
2792 1.6 christos OP_45_7 (SIM_DESC sd, SIM_CPU *cpu)
2793 1.1 christos {
2794 1.1 christos /* loadb [Rindex]ABS20 REG
2795 1.1 christos * ADDR = Rindex + zext24(disp20)
2796 1.1 christos * REGR = [ADDR]. */
2797 1.1 christos
2798 1.10 christos uint32_t addr;
2799 1.10 christos uint16_t tmp, a = (GPR (OP[2])) & 0xFF00;
2800 1.1 christos trace_input ("loadb", OP_R_INDEX8_ABS20, OP_REG, OP_VOID);
2801 1.1 christos
2802 1.1 christos if (OP[0] == 0)
2803 1.1 christos addr = (GPR32 (12)) + OP[1];
2804 1.1 christos else
2805 1.1 christos addr = (GPR32 (13)) + OP[1];
2806 1.1 christos
2807 1.1 christos tmp = (RB (addr));
2808 1.1 christos SET_GPR (OP[2], (a | tmp));
2809 1.6 christos trace_output_16 (sd, tmp);
2810 1.1 christos }
2811 1.1 christos
2812 1.1 christos
2813 1.1 christos /* loadb. */
2814 1.1 christos void
2815 1.6 christos OP_B_4 (SIM_DESC sd, SIM_CPU *cpu)
2816 1.1 christos {
2817 1.1 christos /* loadb DIPS4(REGP) REG
2818 1.1 christos * ADDR = RPBASE + zext24(DISP4)
2819 1.1 christos * REG = [ADDR]. */
2820 1.10 christos uint16_t tmp, a = (GPR (OP[2])) & 0xFF00;
2821 1.10 christos uint32_t addr = (GPR32 (OP[1])) + OP[0];
2822 1.1 christos trace_input ("loadb", OP_RP_BASE_DISP4, OP_REG, OP_VOID);
2823 1.1 christos tmp = (RB (addr));
2824 1.1 christos SET_GPR (OP[2], (a | tmp));
2825 1.6 christos trace_output_16 (sd, tmp);
2826 1.1 christos }
2827 1.1 christos
2828 1.1 christos /* loadb. */
2829 1.1 christos void
2830 1.6 christos OP_BE_8 (SIM_DESC sd, SIM_CPU *cpu)
2831 1.1 christos {
2832 1.1 christos /* loadb [Rindex]disp0(RPbasex) REG
2833 1.1 christos * ADDR = Rpbasex + Rindex
2834 1.1 christos * REGR = [ADDR] */
2835 1.1 christos
2836 1.10 christos uint32_t addr;
2837 1.10 christos uint16_t tmp, a = (GPR (OP[3])) & 0xFF00;
2838 1.1 christos trace_input ("loadb", OP_RP_INDEX_DISP0, OP_REG, OP_VOID);
2839 1.1 christos
2840 1.1 christos addr = (GPR32 (OP[2])) + OP[1];
2841 1.1 christos
2842 1.1 christos if (OP[0] == 0)
2843 1.1 christos addr = (GPR32 (12)) + addr;
2844 1.1 christos else
2845 1.1 christos addr = (GPR32 (13)) + addr;
2846 1.1 christos
2847 1.1 christos tmp = (RB (addr));
2848 1.1 christos SET_GPR (OP[3], (a | tmp));
2849 1.6 christos trace_output_16 (sd, tmp);
2850 1.1 christos }
2851 1.1 christos
2852 1.1 christos /* loadb. */
2853 1.1 christos void
2854 1.6 christos OP_219_A (SIM_DESC sd, SIM_CPU *cpu)
2855 1.1 christos {
2856 1.1 christos /* loadb [Rindex]disp14(RPbasex) REG
2857 1.1 christos * ADDR = Rpbasex + Rindex + zext24(disp14)
2858 1.1 christos * REGR = [ADDR] */
2859 1.1 christos
2860 1.10 christos uint32_t addr;
2861 1.10 christos uint16_t tmp, a = (GPR (OP[3])) & 0xFF00;
2862 1.1 christos
2863 1.1 christos addr = (GPR32 (OP[2])) + OP[1];
2864 1.1 christos
2865 1.1 christos if (OP[0] == 0)
2866 1.1 christos addr = (GPR32 (12)) + addr;
2867 1.1 christos else
2868 1.1 christos addr = (GPR32 (13)) + addr;
2869 1.1 christos
2870 1.1 christos trace_input ("loadb", OP_RP_INDEX_DISP14, OP_REG, OP_VOID);
2871 1.1 christos tmp = (RB (addr));
2872 1.1 christos SET_GPR (OP[3], (a | tmp));
2873 1.6 christos trace_output_16 (sd, tmp);
2874 1.1 christos }
2875 1.1 christos
2876 1.1 christos
2877 1.1 christos /* loadb. */
2878 1.1 christos void
2879 1.6 christos OP_184_14 (SIM_DESC sd, SIM_CPU *cpu)
2880 1.1 christos {
2881 1.1 christos /* loadb DISPE20(REG) REG
2882 1.1 christos * zext24(Rbase) + zext24(dispe20)
2883 1.1 christos * REG = [ADDR] */
2884 1.1 christos
2885 1.10 christos uint16_t tmp,a = (GPR (OP[2])) & 0xFF00;
2886 1.10 christos uint32_t addr = OP[0] + (GPR (OP[1]));
2887 1.1 christos trace_input ("loadb", OP_R_BASE_DISPE20, OP_REG, OP_VOID);
2888 1.1 christos tmp = (RB (addr));
2889 1.1 christos SET_GPR (OP[2], (a | tmp));
2890 1.6 christos trace_output_16 (sd, tmp);
2891 1.1 christos }
2892 1.1 christos
2893 1.1 christos /* loadb. */
2894 1.1 christos void
2895 1.6 christos OP_124_14 (SIM_DESC sd, SIM_CPU *cpu)
2896 1.1 christos {
2897 1.1 christos /* loadb DISP20(REG) REG
2898 1.1 christos * ADDR = zext24(Rbase) + zext24(disp20)
2899 1.1 christos * REG = [ADDR] */
2900 1.1 christos
2901 1.10 christos uint16_t tmp,a = (GPR (OP[2])) & 0xFF00;
2902 1.10 christos uint32_t addr = OP[0] + (GPR (OP[1]));
2903 1.1 christos trace_input ("loadb", OP_R_BASE_DISP20, OP_REG, OP_VOID);
2904 1.1 christos tmp = (RB (addr));
2905 1.1 christos SET_GPR (OP[2], (a | tmp));
2906 1.6 christos trace_output_16 (sd, tmp);
2907 1.1 christos }
2908 1.1 christos
2909 1.1 christos /* loadb. */
2910 1.1 christos void
2911 1.6 christos OP_BF_8 (SIM_DESC sd, SIM_CPU *cpu)
2912 1.1 christos {
2913 1.1 christos /* loadb disp16(REGP) REG
2914 1.1 christos * ADDR = RPbase + zext24(disp16)
2915 1.1 christos * REGR = [ADDR] */
2916 1.1 christos
2917 1.10 christos uint16_t tmp,a = (GPR (OP[2])) & 0xFF00;
2918 1.10 christos uint32_t addr = (GPR32 (OP[1])) + OP[0];
2919 1.1 christos trace_input ("loadb", OP_RP_BASE_DISP16, OP_REG, OP_VOID);
2920 1.1 christos tmp = (RB (addr));
2921 1.1 christos SET_GPR (OP[2], (a | tmp));
2922 1.6 christos trace_output_16 (sd, tmp);
2923 1.1 christos }
2924 1.1 christos
2925 1.1 christos /* loadb. */
2926 1.1 christos void
2927 1.6 christos OP_125_14 (SIM_DESC sd, SIM_CPU *cpu)
2928 1.1 christos {
2929 1.1 christos /* loadb disp20(REGP) REG
2930 1.1 christos * ADDR = RPbase + zext24(disp20)
2931 1.1 christos * REGR = [ADDR] */
2932 1.10 christos uint16_t tmp,a = (GPR (OP[2])) & 0xFF00;
2933 1.10 christos uint32_t addr = (GPR32 (OP[1])) + OP[0];
2934 1.1 christos trace_input ("loadb", OP_RP_BASE_DISP20, OP_REG, OP_VOID);
2935 1.1 christos tmp = (RB (addr));
2936 1.1 christos SET_GPR (OP[2], (a | tmp));
2937 1.6 christos trace_output_16 (sd, tmp);
2938 1.1 christos }
2939 1.1 christos
2940 1.1 christos
2941 1.1 christos /* loadb. */
2942 1.1 christos void
2943 1.6 christos OP_185_14 (SIM_DESC sd, SIM_CPU *cpu)
2944 1.1 christos {
2945 1.1 christos /* loadb -disp20(REGP) REG
2946 1.1 christos * ADDR = RPbase + zext24(-disp20)
2947 1.1 christos * REGR = [ADDR] */
2948 1.10 christos uint16_t tmp,a = (GPR (OP[2])) & 0xFF00;
2949 1.10 christos uint32_t addr = (GPR32 (OP[1])) + OP[1];
2950 1.1 christos trace_input ("loadb", OP_RP_BASE_DISPE20, OP_REG, OP_VOID);
2951 1.1 christos tmp = (RB (addr));
2952 1.1 christos SET_GPR (OP[2], (a | tmp));
2953 1.6 christos trace_output_16 (sd, tmp);
2954 1.1 christos }
2955 1.1 christos
2956 1.1 christos /* loadb. */
2957 1.1 christos void
2958 1.6 christos OP_126_14 (SIM_DESC sd, SIM_CPU *cpu)
2959 1.1 christos {
2960 1.1 christos /* loadb [Rindex]disp20(RPbasexb) REG
2961 1.1 christos * ADDR = RPbasex + Rindex + zext24(disp20)
2962 1.1 christos * REGR = [ADDR] */
2963 1.1 christos
2964 1.10 christos uint32_t addr;
2965 1.10 christos uint16_t tmp, a = (GPR (OP[3])) & 0xFF00;
2966 1.1 christos trace_input ("loadb", OP_RP_INDEX_DISP20, OP_REG, OP_VOID);
2967 1.1 christos
2968 1.1 christos addr = (GPR32 (OP[2])) + OP[1];
2969 1.1 christos
2970 1.1 christos if (OP[0] == 0)
2971 1.1 christos addr = (GPR32 (12)) + addr;
2972 1.1 christos else
2973 1.1 christos addr = (GPR32 (13)) + addr;
2974 1.1 christos
2975 1.1 christos tmp = (RB (addr));
2976 1.1 christos SET_GPR (OP[3], (a | tmp));
2977 1.6 christos trace_output_16 (sd, tmp);
2978 1.1 christos }
2979 1.1 christos
2980 1.1 christos
2981 1.1 christos /* loadw. */
2982 1.1 christos void
2983 1.6 christos OP_89_8 (SIM_DESC sd, SIM_CPU *cpu)
2984 1.1 christos {
2985 1.1 christos /* loadw ABS20, REG
2986 1.1 christos * ADDR = zext24(abs20) | remap
2987 1.1 christos * REGR = [ADDR]
2988 1.1 christos * NOTE: remap is
2989 1.1 christos * If (abs20 > 0xEFFFF) the resulting address is logically ORed
2990 1.1 christos * with 0xF00000 i.e. addresses from 1M-64k to 1M are re-mapped
2991 1.1 christos * by the core to 16M-64k to 16M. */
2992 1.1 christos
2993 1.10 christos uint16_t tmp;
2994 1.10 christos uint32_t addr = OP[0];
2995 1.1 christos trace_input ("loadw", OP_ABS20, OP_REG, OP_VOID);
2996 1.1 christos if (addr > 0xEFFFF) addr |= 0xF00000;
2997 1.1 christos tmp = (RW (addr));
2998 1.1 christos SET_GPR (OP[1], tmp);
2999 1.6 christos trace_output_16 (sd, tmp);
3000 1.1 christos }
3001 1.1 christos
3002 1.1 christos
3003 1.1 christos /* loadw. */
3004 1.1 christos void
3005 1.6 christos OP_12F_14 (SIM_DESC sd, SIM_CPU *cpu)
3006 1.1 christos {
3007 1.1 christos /* loadw ABS24, REG
3008 1.1 christos * ADDR = abs24
3009 1.1 christos * REGR = [ADDR] */
3010 1.10 christos uint16_t tmp;
3011 1.10 christos uint32_t addr = OP[0];
3012 1.1 christos trace_input ("loadw", OP_ABS24, OP_REG, OP_VOID);
3013 1.1 christos tmp = (RW (addr));
3014 1.1 christos SET_GPR (OP[1], tmp);
3015 1.6 christos trace_output_16 (sd, tmp);
3016 1.1 christos }
3017 1.1 christos
3018 1.1 christos /* loadw. */
3019 1.1 christos void
3020 1.6 christos OP_47_7 (SIM_DESC sd, SIM_CPU *cpu)
3021 1.1 christos {
3022 1.1 christos /* loadw [Rindex]ABS20 REG
3023 1.1 christos * ADDR = Rindex + zext24(disp20)
3024 1.1 christos * REGR = [ADDR] */
3025 1.1 christos
3026 1.10 christos uint32_t addr;
3027 1.10 christos uint16_t tmp;
3028 1.1 christos trace_input ("loadw", OP_R_INDEX8_ABS20, OP_REG, OP_VOID);
3029 1.1 christos
3030 1.1 christos if (OP[0] == 0)
3031 1.1 christos addr = (GPR32 (12)) + OP[1];
3032 1.1 christos else
3033 1.1 christos addr = (GPR32 (13)) + OP[1];
3034 1.1 christos
3035 1.1 christos tmp = (RW (addr));
3036 1.1 christos SET_GPR (OP[2], tmp);
3037 1.6 christos trace_output_16 (sd, tmp);
3038 1.1 christos }
3039 1.1 christos
3040 1.1 christos
3041 1.1 christos /* loadw. */
3042 1.1 christos void
3043 1.6 christos OP_9_4 (SIM_DESC sd, SIM_CPU *cpu)
3044 1.1 christos {
3045 1.1 christos /* loadw DIPS4(REGP) REGP
3046 1.1 christos * ADDR = RPBASE + zext24(DISP4)
3047 1.1 christos * REGP = [ADDR]. */
3048 1.10 christos uint16_t tmp;
3049 1.10 christos uint32_t addr, a;
3050 1.1 christos trace_input ("loadw", OP_RP_BASE_DISP4, OP_REG, OP_VOID);
3051 1.1 christos addr = (GPR32 (OP[1])) + OP[0];
3052 1.1 christos tmp = (RW (addr));
3053 1.1 christos if (OP[2] > 11)
3054 1.1 christos {
3055 1.1 christos a = (GPR32 (OP[2])) & 0xffff0000;
3056 1.1 christos SET_GPR32 (OP[2], (a | tmp));
3057 1.1 christos }
3058 1.1 christos else
3059 1.1 christos SET_GPR (OP[2], tmp);
3060 1.1 christos
3061 1.6 christos trace_output_16 (sd, tmp);
3062 1.1 christos }
3063 1.1 christos
3064 1.1 christos
3065 1.1 christos /* loadw. */
3066 1.1 christos void
3067 1.6 christos OP_9E_8 (SIM_DESC sd, SIM_CPU *cpu)
3068 1.1 christos {
3069 1.1 christos /* loadw [Rindex]disp0(RPbasex) REG
3070 1.1 christos * ADDR = Rpbasex + Rindex
3071 1.1 christos * REGR = [ADDR] */
3072 1.1 christos
3073 1.10 christos uint32_t addr;
3074 1.10 christos uint16_t tmp;
3075 1.1 christos trace_input ("loadw", OP_RP_INDEX_DISP0, OP_REG, OP_VOID);
3076 1.1 christos
3077 1.1 christos addr = (GPR32 (OP[2])) + OP[1];
3078 1.1 christos
3079 1.1 christos if (OP[0] == 0)
3080 1.1 christos addr = (GPR32 (12)) + addr;
3081 1.1 christos else
3082 1.1 christos addr = (GPR32 (13)) + addr;
3083 1.1 christos
3084 1.1 christos tmp = RW (addr);
3085 1.1 christos SET_GPR (OP[3], tmp);
3086 1.6 christos trace_output_16 (sd, tmp);
3087 1.1 christos }
3088 1.1 christos
3089 1.1 christos
3090 1.1 christos /* loadw. */
3091 1.1 christos void
3092 1.6 christos OP_21B_A (SIM_DESC sd, SIM_CPU *cpu)
3093 1.1 christos {
3094 1.1 christos /* loadw [Rindex]disp14(RPbasex) REG
3095 1.1 christos * ADDR = Rpbasex + Rindex + zext24(disp14)
3096 1.1 christos * REGR = [ADDR] */
3097 1.1 christos
3098 1.10 christos uint32_t addr;
3099 1.10 christos uint16_t tmp;
3100 1.1 christos trace_input ("loadw", OP_RP_INDEX_DISP14, OP_REG, OP_VOID);
3101 1.1 christos addr = (GPR32 (OP[2])) + OP[1];
3102 1.1 christos
3103 1.1 christos if (OP[0] == 0)
3104 1.1 christos addr = (GPR32 (12)) + addr;
3105 1.1 christos else
3106 1.1 christos addr = (GPR32 (13)) + addr;
3107 1.1 christos
3108 1.1 christos tmp = (RW (addr));
3109 1.1 christos SET_GPR (OP[3], tmp);
3110 1.6 christos trace_output_16 (sd, tmp);
3111 1.1 christos }
3112 1.1 christos
3113 1.1 christos /* loadw. */
3114 1.1 christos void
3115 1.6 christos OP_18C_14 (SIM_DESC sd, SIM_CPU *cpu)
3116 1.1 christos {
3117 1.1 christos /* loadw dispe20(REG) REGP
3118 1.1 christos * REGP = [DISPE20+[REG]] */
3119 1.1 christos
3120 1.10 christos uint16_t tmp;
3121 1.10 christos uint32_t addr, a;
3122 1.1 christos trace_input ("loadw", OP_R_BASE_DISPE20, OP_REGP, OP_VOID);
3123 1.1 christos addr = OP[0] + (GPR (OP[1]));
3124 1.1 christos tmp = (RW (addr));
3125 1.1 christos if (OP[2] > 11)
3126 1.1 christos {
3127 1.1 christos a = (GPR32 (OP[2])) & 0xffff0000;
3128 1.1 christos SET_GPR32 (OP[2], (a | tmp));
3129 1.1 christos }
3130 1.1 christos else
3131 1.1 christos SET_GPR (OP[2], tmp);
3132 1.1 christos
3133 1.6 christos trace_output_16 (sd, tmp);
3134 1.1 christos }
3135 1.1 christos
3136 1.1 christos
3137 1.1 christos /* loadw. */
3138 1.1 christos void
3139 1.6 christos OP_12C_14 (SIM_DESC sd, SIM_CPU *cpu)
3140 1.1 christos {
3141 1.1 christos /* loadw DISP20(REG) REGP
3142 1.1 christos * ADDR = zext24(Rbase) + zext24(disp20)
3143 1.1 christos * REGP = [ADDR] */
3144 1.1 christos
3145 1.10 christos uint16_t tmp;
3146 1.10 christos uint32_t addr, a;
3147 1.1 christos trace_input ("loadw", OP_R_BASE_DISP20, OP_REGP, OP_VOID);
3148 1.1 christos addr = OP[0] + (GPR (OP[1]));
3149 1.1 christos tmp = (RW (addr));
3150 1.1 christos if (OP[2] > 11)
3151 1.1 christos {
3152 1.1 christos a = (GPR32 (OP[2])) & 0xffff0000;
3153 1.1 christos SET_GPR32 (OP[2], (a | tmp));
3154 1.1 christos }
3155 1.1 christos else
3156 1.1 christos SET_GPR (OP[2], tmp);
3157 1.1 christos
3158 1.6 christos trace_output_16 (sd, tmp);
3159 1.1 christos }
3160 1.1 christos
3161 1.1 christos /* loadw. */
3162 1.1 christos void
3163 1.6 christos OP_9F_8 (SIM_DESC sd, SIM_CPU *cpu)
3164 1.1 christos {
3165 1.1 christos /* loadw disp16(REGP) REGP
3166 1.1 christos * ADDR = RPbase + zext24(disp16)
3167 1.1 christos * REGP = [ADDR] */
3168 1.10 christos uint16_t tmp;
3169 1.10 christos uint32_t addr, a;
3170 1.1 christos trace_input ("loadw", OP_RP_BASE_DISP16, OP_REGP, OP_VOID);
3171 1.1 christos addr = (GPR32 (OP[1])) + OP[0];
3172 1.1 christos tmp = (RW (addr));
3173 1.1 christos if (OP[2] > 11)
3174 1.1 christos {
3175 1.1 christos a = (GPR32 (OP[2])) & 0xffff0000;
3176 1.1 christos SET_GPR32 (OP[2], (a | tmp));
3177 1.1 christos }
3178 1.1 christos else
3179 1.1 christos SET_GPR (OP[2], tmp);
3180 1.1 christos
3181 1.6 christos trace_output_16 (sd, tmp);
3182 1.1 christos }
3183 1.1 christos
3184 1.1 christos /* loadw. */
3185 1.1 christos void
3186 1.6 christos OP_12D_14 (SIM_DESC sd, SIM_CPU *cpu)
3187 1.1 christos {
3188 1.1 christos /* loadw disp20(REGP) REGP
3189 1.1 christos * ADDR = RPbase + zext24(disp20)
3190 1.1 christos * REGP = [ADDR] */
3191 1.10 christos uint16_t tmp;
3192 1.10 christos uint32_t addr, a;
3193 1.1 christos trace_input ("loadw", OP_RP_BASE_DISP20, OP_REG, OP_VOID);
3194 1.1 christos addr = (GPR32 (OP[1])) + OP[0];
3195 1.1 christos tmp = (RW (addr));
3196 1.1 christos if (OP[2] > 11)
3197 1.1 christos {
3198 1.1 christos a = (GPR32 (OP[2])) & 0xffff0000;
3199 1.1 christos SET_GPR32 (OP[2], (a | tmp));
3200 1.1 christos }
3201 1.1 christos else
3202 1.1 christos SET_GPR (OP[2], tmp);
3203 1.1 christos
3204 1.6 christos trace_output_16 (sd, tmp);
3205 1.1 christos }
3206 1.1 christos
3207 1.1 christos /* loadw. */
3208 1.1 christos void
3209 1.6 christos OP_18D_14 (SIM_DESC sd, SIM_CPU *cpu)
3210 1.1 christos {
3211 1.1 christos /* loadw -disp20(REGP) REG
3212 1.1 christos * ADDR = RPbase + zext24(-disp20)
3213 1.1 christos * REGR = [ADDR] */
3214 1.1 christos
3215 1.10 christos uint16_t tmp;
3216 1.10 christos uint32_t addr, a;
3217 1.1 christos trace_input ("loadw", OP_RP_BASE_DISPE20, OP_REG, OP_VOID);
3218 1.1 christos addr = (GPR32 (OP[1])) + OP[0];
3219 1.1 christos tmp = (RB (addr));
3220 1.1 christos if (OP[2] > 11)
3221 1.1 christos {
3222 1.1 christos a = (GPR32 (OP[2])) & 0xffff0000;
3223 1.1 christos SET_GPR32 (OP[2], (a | tmp));
3224 1.1 christos }
3225 1.1 christos else
3226 1.1 christos SET_GPR (OP[2], tmp);
3227 1.1 christos
3228 1.6 christos trace_output_16 (sd, tmp);
3229 1.1 christos }
3230 1.1 christos
3231 1.1 christos
3232 1.1 christos /* loadw. */
3233 1.1 christos void
3234 1.6 christos OP_12E_14 (SIM_DESC sd, SIM_CPU *cpu)
3235 1.1 christos {
3236 1.1 christos /* loadw [Rindex]disp20(RPbasexb) REG
3237 1.1 christos * ADDR = RPbasex + Rindex + zext24(disp20)
3238 1.1 christos * REGR = [ADDR] */
3239 1.1 christos
3240 1.10 christos uint32_t addr;
3241 1.10 christos uint16_t tmp;
3242 1.1 christos trace_input ("loadw", OP_RP_INDEX_DISP20, OP_REG, OP_VOID);
3243 1.1 christos
3244 1.1 christos if (OP[0] == 0)
3245 1.1 christos addr = (GPR32 (12)) + OP[1] + (GPR32 (OP[2]));
3246 1.1 christos else
3247 1.1 christos addr = (GPR32 (13)) + OP[1] + (GPR32 (OP[2]));
3248 1.1 christos
3249 1.1 christos tmp = (RW (addr));
3250 1.1 christos SET_GPR (OP[3], tmp);
3251 1.6 christos trace_output_16 (sd, tmp);
3252 1.1 christos }
3253 1.1 christos
3254 1.1 christos
3255 1.1 christos /* loadd. */
3256 1.1 christos void
3257 1.6 christos OP_87_8 (SIM_DESC sd, SIM_CPU *cpu)
3258 1.1 christos {
3259 1.1 christos /* loadd ABS20, REGP
3260 1.1 christos * ADDR = zext24(abs20) | remap
3261 1.1 christos * REGP = [ADDR]
3262 1.1 christos * NOTE: remap is
3263 1.1 christos * If (abs20 > 0xEFFFF) the resulting address is logically ORed
3264 1.1 christos * with 0xF00000 i.e. addresses from 1M-64k to 1M are re-mapped
3265 1.1 christos * by the core to 16M-64k to 16M. */
3266 1.1 christos
3267 1.10 christos uint32_t addr, tmp;
3268 1.1 christos addr = OP[0];
3269 1.1 christos trace_input ("loadd", OP_ABS20, OP_REGP, OP_VOID);
3270 1.1 christos if (addr > 0xEFFFF) addr |= 0xF00000;
3271 1.1 christos tmp = RLW (addr);
3272 1.1 christos tmp = ((tmp << 16) & 0xffff)| ((tmp >> 16) & 0xffff);
3273 1.1 christos SET_GPR32 (OP[1], tmp);
3274 1.6 christos trace_output_32 (sd, tmp);
3275 1.1 christos }
3276 1.1 christos
3277 1.1 christos /* loadd. */
3278 1.1 christos void
3279 1.6 christos OP_12B_14 (SIM_DESC sd, SIM_CPU *cpu)
3280 1.1 christos {
3281 1.1 christos /* loadd ABS24, REGP
3282 1.1 christos * ADDR = abs24
3283 1.1 christos * REGP = [ADDR] */
3284 1.1 christos
3285 1.10 christos uint32_t addr = OP[0];
3286 1.10 christos uint32_t tmp;
3287 1.1 christos trace_input ("loadd", OP_ABS24, OP_REGP, OP_VOID);
3288 1.1 christos tmp = RLW (addr);
3289 1.1 christos tmp = ((tmp & 0xffff) << 16)| ((tmp >> 16) & 0xffff);
3290 1.1 christos SET_GPR32 (OP[1],tmp);
3291 1.6 christos trace_output_32 (sd, tmp);
3292 1.1 christos }
3293 1.1 christos
3294 1.1 christos
3295 1.1 christos /* loadd. */
3296 1.1 christos void
3297 1.6 christos OP_46_7 (SIM_DESC sd, SIM_CPU *cpu)
3298 1.1 christos {
3299 1.1 christos /* loadd [Rindex]ABS20 REGP
3300 1.1 christos * ADDR = Rindex + zext24(disp20)
3301 1.1 christos * REGP = [ADDR] */
3302 1.1 christos
3303 1.10 christos uint32_t addr, tmp;
3304 1.1 christos trace_input ("loadd", OP_R_INDEX8_ABS20, OP_REGP, OP_VOID);
3305 1.1 christos
3306 1.1 christos if (OP[0] == 0)
3307 1.1 christos addr = (GPR32 (12)) + OP[1];
3308 1.1 christos else
3309 1.1 christos addr = (GPR32 (13)) + OP[1];
3310 1.1 christos
3311 1.1 christos tmp = RLW (addr);
3312 1.1 christos tmp = ((tmp & 0xffff) << 16)| ((tmp >> 16) & 0xffff);
3313 1.1 christos SET_GPR32 (OP[2], tmp);
3314 1.6 christos trace_output_32 (sd, tmp);
3315 1.1 christos }
3316 1.1 christos
3317 1.1 christos
3318 1.1 christos /* loadd. */
3319 1.1 christos void
3320 1.6 christos OP_A_4 (SIM_DESC sd, SIM_CPU *cpu)
3321 1.1 christos {
3322 1.1 christos /* loadd dips4(regp) REGP
3323 1.1 christos * ADDR = Rpbase + zext24(disp4)
3324 1.1 christos * REGP = [ADDR] */
3325 1.1 christos
3326 1.10 christos uint32_t tmp, addr = (GPR32 (OP[1])) + OP[0];
3327 1.1 christos trace_input ("loadd", OP_RP_BASE_DISP4, OP_REGP, OP_VOID);
3328 1.1 christos tmp = RLW (addr);
3329 1.1 christos tmp = ((tmp & 0xffff) << 16)| ((tmp >> 16) & 0xffff);
3330 1.1 christos SET_GPR32 (OP[2], tmp);
3331 1.6 christos trace_output_32 (sd, tmp);
3332 1.1 christos }
3333 1.1 christos
3334 1.1 christos
3335 1.1 christos /* loadd. */
3336 1.1 christos void
3337 1.6 christos OP_AE_8 (SIM_DESC sd, SIM_CPU *cpu)
3338 1.1 christos {
3339 1.1 christos /* loadd [Rindex]disp0(RPbasex) REGP
3340 1.1 christos * ADDR = Rpbasex + Rindex
3341 1.1 christos * REGP = [ADDR] */
3342 1.1 christos
3343 1.10 christos uint32_t addr, tmp;
3344 1.1 christos trace_input ("loadd", OP_RP_INDEX_DISP0, OP_REGP, OP_VOID);
3345 1.1 christos
3346 1.1 christos if (OP[0] == 0)
3347 1.1 christos addr = (GPR32 (12)) + (GPR32 (OP[2])) + OP[1];
3348 1.1 christos else
3349 1.1 christos addr = (GPR32 (13)) + (GPR32 (OP[2])) + OP[1];
3350 1.1 christos
3351 1.1 christos tmp = RLW (addr);
3352 1.1 christos tmp = ((tmp & 0xffff) << 16)| ((tmp >> 16) & 0xffff);
3353 1.1 christos SET_GPR32 (OP[3], tmp);
3354 1.6 christos trace_output_32 (sd, tmp);
3355 1.1 christos }
3356 1.1 christos
3357 1.1 christos
3358 1.1 christos /* loadd. */
3359 1.1 christos void
3360 1.6 christos OP_21A_A (SIM_DESC sd, SIM_CPU *cpu)
3361 1.1 christos {
3362 1.1 christos /* loadd [Rindex]disp14(RPbasex) REGP
3363 1.1 christos * ADDR = Rpbasex + Rindex + zext24(disp14)
3364 1.1 christos * REGR = [ADDR] */
3365 1.1 christos
3366 1.10 christos uint32_t addr, tmp;
3367 1.1 christos trace_input ("loadd", OP_RP_INDEX_DISP14, OP_REGP, OP_VOID);
3368 1.1 christos
3369 1.1 christos if (OP[0] == 0)
3370 1.1 christos addr = (GPR32 (12)) + OP[1] + (GPR32 (OP[2]));
3371 1.1 christos else
3372 1.1 christos addr = (GPR32 (13)) + OP[1] + (GPR32 (OP[2]));
3373 1.1 christos
3374 1.1 christos tmp = RLW (addr);
3375 1.1 christos tmp = ((tmp & 0xffff) << 16)| ((tmp >> 16) & 0xffff);
3376 1.1 christos SET_GPR (OP[3],tmp);
3377 1.6 christos trace_output_32 (sd, tmp);
3378 1.1 christos }
3379 1.1 christos
3380 1.1 christos
3381 1.1 christos /* loadd. */
3382 1.1 christos void
3383 1.6 christos OP_188_14 (SIM_DESC sd, SIM_CPU *cpu)
3384 1.1 christos {
3385 1.1 christos /* loadd dispe20(REG) REG
3386 1.1 christos * zext24(Rbase) + zext24(dispe20)
3387 1.1 christos * REG = [ADDR] */
3388 1.1 christos
3389 1.10 christos uint32_t tmp, addr = OP[0] + (GPR (OP[1]));
3390 1.1 christos trace_input ("loadd", OP_R_BASE_DISPE20, OP_REGP, OP_VOID);
3391 1.1 christos tmp = RLW (addr);
3392 1.1 christos tmp = ((tmp & 0xffff) << 16)| ((tmp >> 16) & 0xffff);
3393 1.1 christos SET_GPR32 (OP[2], tmp);
3394 1.6 christos trace_output_32 (sd, tmp);
3395 1.1 christos }
3396 1.1 christos
3397 1.1 christos
3398 1.1 christos /* loadd. */
3399 1.1 christos void
3400 1.6 christos OP_128_14 (SIM_DESC sd, SIM_CPU *cpu)
3401 1.1 christos {
3402 1.1 christos /* loadd DISP20(REG) REG
3403 1.1 christos * ADDR = zext24(Rbase) + zext24(disp20)
3404 1.1 christos * REG = [ADDR] */
3405 1.1 christos
3406 1.10 christos uint32_t tmp, addr = OP[0] + (GPR (OP[1]));
3407 1.1 christos trace_input ("loadd", OP_R_BASE_DISP20, OP_REGP, OP_VOID);
3408 1.1 christos tmp = RLW (addr);
3409 1.1 christos tmp = ((tmp & 0xffff) << 16)| ((tmp >> 16) & 0xffff);
3410 1.1 christos SET_GPR32 (OP[2], tmp);
3411 1.6 christos trace_output_32 (sd, tmp);
3412 1.1 christos }
3413 1.1 christos
3414 1.1 christos /* loadd. */
3415 1.1 christos void
3416 1.6 christos OP_AF_8 (SIM_DESC sd, SIM_CPU *cpu)
3417 1.1 christos {
3418 1.1 christos /* loadd disp16(REGP) REGP
3419 1.1 christos * ADDR = RPbase + zext24(disp16)
3420 1.1 christos * REGR = [ADDR] */
3421 1.10 christos uint32_t tmp, addr = OP[0] + (GPR32 (OP[1]));
3422 1.1 christos trace_input ("loadd", OP_RP_BASE_DISP16, OP_REGP, OP_VOID);
3423 1.1 christos tmp = RLW (addr);
3424 1.1 christos tmp = ((tmp & 0xffff) << 16)| ((tmp >> 16) & 0xffff);
3425 1.1 christos SET_GPR32 (OP[2], tmp);
3426 1.6 christos trace_output_32 (sd, tmp);
3427 1.1 christos }
3428 1.1 christos
3429 1.1 christos
3430 1.1 christos /* loadd. */
3431 1.1 christos void
3432 1.6 christos OP_129_14 (SIM_DESC sd, SIM_CPU *cpu)
3433 1.1 christos {
3434 1.1 christos /* loadd disp20(REGP) REGP
3435 1.1 christos * ADDR = RPbase + zext24(disp20)
3436 1.1 christos * REGP = [ADDR] */
3437 1.10 christos uint32_t tmp, addr = OP[0] + (GPR32 (OP[1]));
3438 1.1 christos trace_input ("loadd", OP_RP_BASE_DISP20, OP_REGP, OP_VOID);
3439 1.1 christos tmp = RLW (addr);
3440 1.1 christos tmp = ((tmp & 0xffff) << 16)| ((tmp >> 16) & 0xffff);
3441 1.1 christos SET_GPR32 (OP[2], tmp);
3442 1.6 christos trace_output_32 (sd, tmp);
3443 1.1 christos }
3444 1.1 christos
3445 1.1 christos /* loadd. */
3446 1.1 christos void
3447 1.6 christos OP_189_14 (SIM_DESC sd, SIM_CPU *cpu)
3448 1.1 christos {
3449 1.1 christos /* loadd -disp20(REGP) REGP
3450 1.1 christos * ADDR = RPbase + zext24(-disp20)
3451 1.1 christos * REGP = [ADDR] */
3452 1.1 christos
3453 1.10 christos uint32_t tmp, addr = OP[0] + (GPR32 (OP[1]));
3454 1.1 christos trace_input ("loadd", OP_RP_BASE_DISPE20, OP_REGP, OP_VOID);
3455 1.1 christos tmp = RLW (addr);
3456 1.1 christos tmp = ((tmp & 0xffff) << 16)| ((tmp >> 16) & 0xffff);
3457 1.1 christos SET_GPR32 (OP[2], tmp);
3458 1.6 christos trace_output_32 (sd, tmp);
3459 1.1 christos }
3460 1.1 christos
3461 1.1 christos /* loadd. */
3462 1.1 christos void
3463 1.6 christos OP_12A_14 (SIM_DESC sd, SIM_CPU *cpu)
3464 1.1 christos {
3465 1.1 christos /* loadd [Rindex]disp20(RPbasexb) REGP
3466 1.1 christos * ADDR = RPbasex + Rindex + zext24(disp20)
3467 1.1 christos * REGP = [ADDR] */
3468 1.1 christos
3469 1.10 christos uint32_t addr, tmp;
3470 1.1 christos trace_input ("loadd", OP_RP_INDEX_DISP20, OP_REGP, OP_VOID);
3471 1.1 christos
3472 1.1 christos if (OP[0] == 0)
3473 1.1 christos addr = (GPR32 (12)) + OP[1] + (GPR32 (OP[2]));
3474 1.1 christos else
3475 1.1 christos addr = (GPR32 (13)) + OP[1] + (GPR32 (OP[2]));
3476 1.1 christos
3477 1.1 christos tmp = RLW (addr);
3478 1.1 christos tmp = ((tmp << 16) & 0xffff)| ((tmp >> 16) & 0xffff);
3479 1.1 christos SET_GPR32 (OP[3], tmp);
3480 1.6 christos trace_output_32 (sd, tmp);
3481 1.1 christos }
3482 1.1 christos
3483 1.1 christos
3484 1.1 christos /* storb. */
3485 1.1 christos void
3486 1.6 christos OP_C8_8 (SIM_DESC sd, SIM_CPU *cpu)
3487 1.1 christos {
3488 1.1 christos /* storb REG, ABS20
3489 1.1 christos * ADDR = zext24(abs20) | remap
3490 1.1 christos * [ADDR] = REGR
3491 1.1 christos * NOTE: remap is
3492 1.1 christos * If (abs20 > 0xEFFFF) the resulting address is logically ORed
3493 1.1 christos * with 0xF00000 i.e. addresses from 1M-64k to 1M are re-mapped
3494 1.1 christos * by the core to 16M-64k to 16M. */
3495 1.1 christos
3496 1.10 christos uint8_t a = ((GPR (OP[0])) & 0xff);
3497 1.10 christos uint32_t addr = OP[1];
3498 1.1 christos trace_input ("storb", OP_REG, OP_ABS20_OUTPUT, OP_VOID);
3499 1.1 christos SB (addr, a);
3500 1.6 christos trace_output_32 (sd, addr);
3501 1.1 christos }
3502 1.1 christos
3503 1.1 christos /* storb. */
3504 1.1 christos void
3505 1.6 christos OP_137_14 (SIM_DESC sd, SIM_CPU *cpu)
3506 1.1 christos {
3507 1.1 christos /* storb REG, ABS24
3508 1.1 christos * ADDR = abs24
3509 1.1 christos * [ADDR] = REGR. */
3510 1.1 christos
3511 1.10 christos uint8_t a = ((GPR (OP[0])) & 0xff);
3512 1.10 christos uint32_t addr = OP[1];
3513 1.1 christos trace_input ("storb", OP_REG, OP_ABS24_OUTPUT, OP_VOID);
3514 1.1 christos SB (addr, a);
3515 1.6 christos trace_output_32 (sd, addr);
3516 1.1 christos }
3517 1.1 christos
3518 1.1 christos /* storb. */
3519 1.1 christos void
3520 1.6 christos OP_65_7 (SIM_DESC sd, SIM_CPU *cpu)
3521 1.1 christos {
3522 1.1 christos /* storb REG, [Rindex]ABS20
3523 1.1 christos * ADDR = Rindex + zext24(disp20)
3524 1.1 christos * [ADDR] = REGR */
3525 1.1 christos
3526 1.10 christos uint32_t addr;
3527 1.10 christos uint8_t a = ((GPR (OP[0])) & 0xff);
3528 1.1 christos trace_input ("storb", OP_REG, OP_R_INDEX8_ABS20, OP_VOID);
3529 1.1 christos
3530 1.1 christos if (OP[1] == 0)
3531 1.1 christos addr = (GPR32 (12)) + OP[2];
3532 1.1 christos else
3533 1.1 christos addr = (GPR32 (13)) + OP[2];
3534 1.1 christos
3535 1.1 christos SB (addr, a);
3536 1.6 christos trace_output_32 (sd, addr);
3537 1.1 christos }
3538 1.1 christos
3539 1.1 christos /* storb. */
3540 1.1 christos void
3541 1.6 christos OP_F_4 (SIM_DESC sd, SIM_CPU *cpu)
3542 1.1 christos {
3543 1.1 christos /* storb REG, DIPS4(REGP)
3544 1.1 christos * ADDR = RPBASE + zext24(DISP4)
3545 1.1 christos * [ADDR] = REG. */
3546 1.1 christos
3547 1.10 christos uint16_t a = ((GPR (OP[0])) & 0xff);
3548 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1];
3549 1.1 christos trace_input ("storb", OP_REG, OP_RP_BASE_DISPE4, OP_VOID);
3550 1.1 christos SB (addr, a);
3551 1.6 christos trace_output_32 (sd, addr);
3552 1.1 christos }
3553 1.1 christos
3554 1.1 christos /* storb. */
3555 1.1 christos void
3556 1.6 christos OP_FE_8 (SIM_DESC sd, SIM_CPU *cpu)
3557 1.1 christos {
3558 1.1 christos /* storb [Rindex]disp0(RPbasex) REG
3559 1.1 christos * ADDR = Rpbasex + Rindex
3560 1.1 christos * [ADDR] = REGR */
3561 1.1 christos
3562 1.10 christos uint32_t addr;
3563 1.10 christos uint8_t a = ((GPR (OP[0])) & 0xff);
3564 1.1 christos trace_input ("storb", OP_REG, OP_RP_INDEX_DISP0, OP_VOID);
3565 1.1 christos
3566 1.1 christos if (OP[1] == 0)
3567 1.1 christos addr = (GPR32 (12)) + (GPR32 (OP[3])) + OP[2];
3568 1.1 christos else
3569 1.1 christos addr = (GPR32 (13)) + (GPR32 (OP[3])) + OP[2];
3570 1.1 christos
3571 1.1 christos SB (addr, a);
3572 1.6 christos trace_output_32 (sd, addr);
3573 1.1 christos }
3574 1.1 christos
3575 1.1 christos /* storb. */
3576 1.1 christos void
3577 1.6 christos OP_319_A (SIM_DESC sd, SIM_CPU *cpu)
3578 1.1 christos {
3579 1.1 christos /* storb REG, [Rindex]disp14(RPbasex)
3580 1.1 christos * ADDR = Rpbasex + Rindex + zext24(disp14)
3581 1.1 christos * [ADDR] = REGR */
3582 1.1 christos
3583 1.10 christos uint8_t a = ((GPR (OP[0])) & 0xff);
3584 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1];
3585 1.1 christos trace_input ("storb", OP_REG, OP_RP_INDEX_DISP14, OP_VOID);
3586 1.1 christos SB (addr, a);
3587 1.6 christos trace_output_32 (sd, addr);
3588 1.1 christos }
3589 1.1 christos
3590 1.1 christos /* storb. */
3591 1.1 christos void
3592 1.6 christos OP_194_14 (SIM_DESC sd, SIM_CPU *cpu)
3593 1.1 christos {
3594 1.1 christos /* storb REG, DISPE20(REG)
3595 1.1 christos * zext24(Rbase) + zext24(dispe20)
3596 1.1 christos * [ADDR] = REG */
3597 1.1 christos
3598 1.10 christos uint8_t a = ((GPR (OP[0])) & 0xff);
3599 1.10 christos uint32_t addr = OP[1] + (GPR (OP[2]));
3600 1.1 christos trace_input ("storb", OP_REG, OP_R_BASE_DISPE20, OP_VOID);
3601 1.1 christos SB (addr, a);
3602 1.6 christos trace_output_32 (sd, addr);
3603 1.1 christos }
3604 1.1 christos
3605 1.1 christos /* storb. */
3606 1.1 christos void
3607 1.6 christos OP_134_14 (SIM_DESC sd, SIM_CPU *cpu)
3608 1.1 christos {
3609 1.1 christos /* storb REG, DISP20(REG)
3610 1.1 christos * ADDR = zext24(Rbase) + zext24(disp20)
3611 1.1 christos * [ADDR] = REG */
3612 1.1 christos
3613 1.10 christos uint8_t a = (GPR (OP[0]) & 0xff);
3614 1.10 christos uint32_t addr = OP[1] + (GPR (OP[2]));
3615 1.1 christos trace_input ("storb", OP_REG, OP_R_BASE_DISPS20, OP_VOID);
3616 1.1 christos SB (addr, a);
3617 1.6 christos trace_output_32 (sd, addr);
3618 1.1 christos }
3619 1.1 christos
3620 1.1 christos /* storb. */
3621 1.1 christos void
3622 1.6 christos OP_FF_8 (SIM_DESC sd, SIM_CPU *cpu)
3623 1.1 christos {
3624 1.1 christos /* storb REG, disp16(REGP)
3625 1.1 christos * ADDR = RPbase + zext24(disp16)
3626 1.1 christos * [ADDR] = REGP */
3627 1.1 christos
3628 1.10 christos uint8_t a = ((GPR (OP[0])) & 0xff);
3629 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1];
3630 1.1 christos trace_input ("storb", OP_REG, OP_RP_BASE_DISP16, OP_VOID);
3631 1.1 christos SB (addr, a);
3632 1.6 christos trace_output_32 (sd, addr);
3633 1.1 christos }
3634 1.1 christos
3635 1.1 christos /* storb. */
3636 1.1 christos void
3637 1.6 christos OP_135_14 (SIM_DESC sd, SIM_CPU *cpu)
3638 1.1 christos {
3639 1.1 christos /* storb REG, disp20(REGP)
3640 1.1 christos * ADDR = RPbase + zext24(disp20)
3641 1.1 christos * [ADDR] = REGP */
3642 1.1 christos
3643 1.10 christos uint8_t a = ((GPR (OP[0])) & 0xff);
3644 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1];
3645 1.1 christos trace_input ("storb", OP_REG, OP_RP_BASE_DISPS20, OP_VOID);
3646 1.1 christos SB (addr, a);
3647 1.6 christos trace_output_32 (sd, addr);
3648 1.1 christos }
3649 1.1 christos
3650 1.1 christos /* storb. */
3651 1.1 christos void
3652 1.6 christos OP_195_14 (SIM_DESC sd, SIM_CPU *cpu)
3653 1.1 christos {
3654 1.1 christos /* storb REG, -disp20(REGP)
3655 1.1 christos * ADDR = RPbase + zext24(-disp20)
3656 1.1 christos * [ADDR] = REGP */
3657 1.1 christos
3658 1.10 christos uint8_t a = (GPR (OP[0]) & 0xff);
3659 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1];
3660 1.1 christos trace_input ("storb", OP_REG, OP_RP_BASE_DISPE20, OP_VOID);
3661 1.1 christos SB (addr, a);
3662 1.6 christos trace_output_32 (sd, addr);
3663 1.1 christos }
3664 1.1 christos
3665 1.1 christos /* storb. */
3666 1.1 christos void
3667 1.6 christos OP_136_14 (SIM_DESC sd, SIM_CPU *cpu)
3668 1.1 christos {
3669 1.1 christos /* storb REG, [Rindex]disp20(RPbase)
3670 1.1 christos * ADDR = RPbasex + Rindex + zext24(disp20)
3671 1.1 christos * [ADDR] = REGP */
3672 1.1 christos
3673 1.10 christos uint8_t a = (GPR (OP[0])) & 0xff;
3674 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1];
3675 1.1 christos trace_input ("storb", OP_REG, OP_RP_INDEX_DISPS20, OP_VOID);
3676 1.1 christos SB (addr, a);
3677 1.6 christos trace_output_32 (sd, addr);
3678 1.1 christos }
3679 1.1 christos
3680 1.1 christos /* STR_IMM instructions. */
3681 1.1 christos /* storb . */
3682 1.1 christos void
3683 1.6 christos OP_81_8 (SIM_DESC sd, SIM_CPU *cpu)
3684 1.1 christos {
3685 1.10 christos uint8_t a = (OP[0]) & 0xff;
3686 1.10 christos uint32_t addr = OP[1];
3687 1.1 christos trace_input ("storb", OP_CONSTANT4, OP_ABS20_OUTPUT, OP_VOID);
3688 1.1 christos SB (addr, a);
3689 1.6 christos trace_output_32 (sd, addr);
3690 1.1 christos }
3691 1.1 christos
3692 1.1 christos /* storb. */
3693 1.1 christos void
3694 1.6 christos OP_123_14 (SIM_DESC sd, SIM_CPU *cpu)
3695 1.1 christos {
3696 1.10 christos uint8_t a = (OP[0]) & 0xff;
3697 1.10 christos uint32_t addr = OP[1];
3698 1.1 christos trace_input ("storb", OP_CONSTANT4, OP_ABS24_OUTPUT, OP_VOID);
3699 1.1 christos SB (addr, a);
3700 1.6 christos trace_output_32 (sd, addr);
3701 1.1 christos }
3702 1.1 christos
3703 1.1 christos /* storb. */
3704 1.1 christos void
3705 1.6 christos OP_42_7 (SIM_DESC sd, SIM_CPU *cpu)
3706 1.1 christos {
3707 1.10 christos uint32_t addr;
3708 1.10 christos uint8_t a = (OP[0]) & 0xff;
3709 1.1 christos trace_input ("storb", OP_CONSTANT4, OP_R_INDEX8_ABS20, OP_VOID);
3710 1.1 christos
3711 1.1 christos if (OP[1] == 0)
3712 1.1 christos addr = (GPR32 (12)) + OP[2];
3713 1.1 christos else
3714 1.1 christos addr = (GPR32 (13)) + OP[2];
3715 1.1 christos
3716 1.1 christos SB (addr, a);
3717 1.6 christos trace_output_32 (sd, addr);
3718 1.1 christos }
3719 1.1 christos
3720 1.1 christos /* storb. */
3721 1.1 christos void
3722 1.6 christos OP_218_A (SIM_DESC sd, SIM_CPU *cpu)
3723 1.1 christos {
3724 1.10 christos uint8_t a = (OP[0]) & 0xff;
3725 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1];
3726 1.1 christos trace_input ("storb", OP_CONSTANT4, OP_RP_BASE_DISP14, OP_VOID);
3727 1.1 christos SB (addr, a);
3728 1.6 christos trace_output_32 (sd, addr);
3729 1.1 christos }
3730 1.1 christos
3731 1.1 christos /* storb. */
3732 1.1 christos void
3733 1.6 christos OP_82_8 (SIM_DESC sd, SIM_CPU *cpu)
3734 1.1 christos {
3735 1.10 christos uint8_t a = (OP[0]) & 0xff;
3736 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1];
3737 1.1 christos trace_input ("storb", OP_CONSTANT4, OP_RP_INDEX_DISP0, OP_VOID);
3738 1.1 christos SB (addr, a);
3739 1.6 christos trace_output_32 (sd, addr);
3740 1.1 christos }
3741 1.1 christos
3742 1.1 christos /* storb. */
3743 1.1 christos void
3744 1.6 christos OP_120_14 (SIM_DESC sd, SIM_CPU *cpu)
3745 1.1 christos {
3746 1.10 christos uint8_t a = (OP[0]) & 0xff;
3747 1.10 christos uint32_t addr = (GPR (OP[2])) + OP[1];
3748 1.1 christos trace_input ("storb", OP_CONSTANT4, OP_R_BASE_DISPS20, OP_VOID);
3749 1.1 christos SB (addr, a);
3750 1.6 christos trace_output_32 (sd, addr);
3751 1.1 christos }
3752 1.1 christos
3753 1.1 christos /* storb. */
3754 1.1 christos void
3755 1.6 christos OP_83_8 (SIM_DESC sd, SIM_CPU *cpu)
3756 1.1 christos {
3757 1.10 christos uint8_t a = (OP[0]) & 0xff;
3758 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1];
3759 1.1 christos trace_input ("storb", OP_CONSTANT4, OP_RP_BASE_DISP16, OP_VOID);
3760 1.1 christos SB (addr, a);
3761 1.6 christos trace_output_32 (sd, addr);
3762 1.1 christos }
3763 1.1 christos
3764 1.1 christos /* storb. */
3765 1.1 christos void
3766 1.6 christos OP_121_14 (SIM_DESC sd, SIM_CPU *cpu)
3767 1.1 christos {
3768 1.10 christos uint8_t a = (OP[0]) & 0xff;
3769 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1];
3770 1.1 christos trace_input ("storb", OP_CONSTANT4, OP_RP_BASE_DISPS20, OP_VOID);
3771 1.1 christos SB (addr, a);
3772 1.6 christos trace_output_32 (sd, addr);
3773 1.1 christos }
3774 1.1 christos
3775 1.1 christos /* storb. */
3776 1.1 christos void
3777 1.6 christos OP_122_14 (SIM_DESC sd, SIM_CPU *cpu)
3778 1.1 christos {
3779 1.10 christos uint8_t a = (OP[0]) & 0xff;
3780 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1];
3781 1.1 christos trace_input ("storb", OP_CONSTANT4, OP_RP_INDEX_DISPS20, OP_VOID);
3782 1.1 christos SB (addr, a);
3783 1.6 christos trace_output_32 (sd, addr);
3784 1.1 christos }
3785 1.1 christos /* endif for STR_IMM. */
3786 1.1 christos
3787 1.1 christos /* storw . */
3788 1.1 christos void
3789 1.6 christos OP_C9_8 (SIM_DESC sd, SIM_CPU *cpu)
3790 1.1 christos {
3791 1.10 christos uint16_t a = GPR (OP[0]);
3792 1.10 christos uint32_t addr = OP[1];
3793 1.1 christos trace_input ("storw", OP_REG, OP_ABS20_OUTPUT, OP_VOID);
3794 1.1 christos SW (addr, a);
3795 1.6 christos trace_output_32 (sd, addr);
3796 1.1 christos }
3797 1.1 christos
3798 1.1 christos /* storw. */
3799 1.1 christos void
3800 1.6 christos OP_13F_14 (SIM_DESC sd, SIM_CPU *cpu)
3801 1.1 christos {
3802 1.10 christos uint16_t a = GPR (OP[0]);
3803 1.10 christos uint32_t addr = OP[1];
3804 1.1 christos trace_input ("storw", OP_REG, OP_ABS24_OUTPUT, OP_VOID);
3805 1.1 christos SW (addr, a);
3806 1.6 christos trace_output_32 (sd, addr);
3807 1.1 christos }
3808 1.1 christos
3809 1.1 christos /* storw. */
3810 1.1 christos void
3811 1.6 christos OP_67_7 (SIM_DESC sd, SIM_CPU *cpu)
3812 1.1 christos {
3813 1.10 christos uint32_t addr;
3814 1.10 christos uint16_t a = GPR (OP[0]);
3815 1.1 christos trace_input ("storw", OP_REG, OP_R_INDEX8_ABS20, OP_VOID);
3816 1.1 christos
3817 1.1 christos if (OP[1] == 0)
3818 1.1 christos addr = (GPR32 (12)) + OP[2];
3819 1.1 christos else
3820 1.1 christos addr = (GPR32 (13)) + OP[2];
3821 1.1 christos
3822 1.1 christos SW (addr, a);
3823 1.6 christos trace_output_32 (sd, addr);
3824 1.1 christos }
3825 1.1 christos
3826 1.1 christos
3827 1.1 christos /* storw. */
3828 1.1 christos void
3829 1.6 christos OP_D_4 (SIM_DESC sd, SIM_CPU *cpu)
3830 1.1 christos {
3831 1.10 christos uint16_t a = (GPR (OP[0]));
3832 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1];
3833 1.1 christos trace_input ("storw", OP_REGP, OP_RP_BASE_DISPE4, OP_VOID);
3834 1.1 christos SW (addr, a);
3835 1.6 christos trace_output_32 (sd, addr);
3836 1.1 christos }
3837 1.1 christos
3838 1.1 christos /* storw. */
3839 1.1 christos void
3840 1.6 christos OP_DE_8 (SIM_DESC sd, SIM_CPU *cpu)
3841 1.1 christos {
3842 1.10 christos uint16_t a = GPR (OP[0]);
3843 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1];
3844 1.1 christos trace_input ("storw", OP_REG, OP_RP_INDEX_DISP0, OP_VOID);
3845 1.1 christos SW (addr, a);
3846 1.6 christos trace_output_32 (sd, addr);
3847 1.1 christos }
3848 1.1 christos
3849 1.1 christos /* storw. */
3850 1.1 christos void
3851 1.6 christos OP_31B_A (SIM_DESC sd, SIM_CPU *cpu)
3852 1.1 christos {
3853 1.10 christos uint16_t a = GPR (OP[0]);
3854 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1];
3855 1.1 christos trace_input ("storw", OP_REG, OP_RP_INDEX_DISP14, OP_VOID);
3856 1.1 christos SW (addr, a);
3857 1.6 christos trace_output_32 (sd, addr);
3858 1.1 christos }
3859 1.1 christos
3860 1.1 christos /* storw. */
3861 1.1 christos void
3862 1.6 christos OP_19C_14 (SIM_DESC sd, SIM_CPU *cpu)
3863 1.1 christos {
3864 1.10 christos uint16_t a = (GPR (OP[0]));
3865 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1];
3866 1.1 christos trace_input ("storw", OP_REGP, OP_RP_BASE_DISPE20, OP_VOID);
3867 1.1 christos SW (addr, a);
3868 1.6 christos trace_output_32 (sd, addr);
3869 1.1 christos }
3870 1.1 christos
3871 1.1 christos /* storw. */
3872 1.1 christos void
3873 1.6 christos OP_13C_14 (SIM_DESC sd, SIM_CPU *cpu)
3874 1.1 christos {
3875 1.10 christos uint16_t a = (GPR (OP[0]));
3876 1.10 christos uint32_t addr = (GPR (OP[2])) + OP[1];
3877 1.1 christos trace_input ("storw", OP_REG, OP_R_BASE_DISPS20, OP_VOID);
3878 1.1 christos SW (addr, a);
3879 1.6 christos trace_output_32 (sd, addr);
3880 1.1 christos }
3881 1.1 christos
3882 1.1 christos /* storw. */
3883 1.1 christos void
3884 1.6 christos OP_DF_8 (SIM_DESC sd, SIM_CPU *cpu)
3885 1.1 christos {
3886 1.10 christos uint16_t a = (GPR (OP[0]));
3887 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1];
3888 1.1 christos trace_input ("storw", OP_REG, OP_RP_BASE_DISP16, OP_VOID);
3889 1.1 christos SW (addr, a);
3890 1.6 christos trace_output_32 (sd, addr);
3891 1.1 christos }
3892 1.1 christos
3893 1.1 christos /* storw. */
3894 1.1 christos void
3895 1.6 christos OP_13D_14 (SIM_DESC sd, SIM_CPU *cpu)
3896 1.1 christos {
3897 1.10 christos uint16_t a = (GPR (OP[0]));
3898 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1];
3899 1.1 christos trace_input ("storw", OP_REG, OP_RP_BASE_DISPS20, OP_VOID);
3900 1.1 christos SW (addr, a);
3901 1.6 christos trace_output_32 (sd, addr);
3902 1.1 christos }
3903 1.1 christos
3904 1.1 christos /* storw. */
3905 1.1 christos void
3906 1.6 christos OP_19D_14 (SIM_DESC sd, SIM_CPU *cpu)
3907 1.1 christos {
3908 1.10 christos uint16_t a = (GPR (OP[0]));
3909 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1];
3910 1.1 christos trace_input ("storw", OP_REG, OP_RP_BASE_DISPE20, OP_VOID);
3911 1.1 christos SW (addr, a);
3912 1.6 christos trace_output_32 (sd, addr);
3913 1.1 christos }
3914 1.1 christos
3915 1.1 christos /* storw. */
3916 1.1 christos void
3917 1.6 christos OP_13E_14 (SIM_DESC sd, SIM_CPU *cpu)
3918 1.1 christos {
3919 1.10 christos uint16_t a = (GPR (OP[0]));
3920 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1];
3921 1.1 christos trace_input ("storw", OP_REG, OP_RP_INDEX_DISPS20, OP_VOID);
3922 1.1 christos SW (addr, a);
3923 1.6 christos trace_output_32 (sd, addr);
3924 1.1 christos }
3925 1.1 christos
3926 1.1 christos /* STORE-w IMM instruction *****/
3927 1.1 christos /* storw . */
3928 1.1 christos void
3929 1.6 christos OP_C1_8 (SIM_DESC sd, SIM_CPU *cpu)
3930 1.1 christos {
3931 1.10 christos uint16_t a = OP[0];
3932 1.10 christos uint32_t addr = OP[1];
3933 1.1 christos trace_input ("storw", OP_CONSTANT4, OP_ABS20_OUTPUT, OP_VOID);
3934 1.1 christos SW (addr, a);
3935 1.6 christos trace_output_32 (sd, addr);
3936 1.1 christos }
3937 1.1 christos
3938 1.1 christos /* storw. */
3939 1.1 christos void
3940 1.6 christos OP_133_14 (SIM_DESC sd, SIM_CPU *cpu)
3941 1.1 christos {
3942 1.10 christos uint16_t a = OP[0];
3943 1.10 christos uint32_t addr = OP[1];
3944 1.1 christos trace_input ("storw", OP_CONSTANT4, OP_ABS24_OUTPUT, OP_VOID);
3945 1.1 christos SW (addr, a);
3946 1.6 christos trace_output_32 (sd, addr);
3947 1.1 christos }
3948 1.1 christos
3949 1.1 christos /* storw. */
3950 1.1 christos void
3951 1.6 christos OP_62_7 (SIM_DESC sd, SIM_CPU *cpu)
3952 1.1 christos {
3953 1.10 christos uint32_t addr;
3954 1.10 christos uint16_t a = OP[0];
3955 1.1 christos trace_input ("storw", OP_CONSTANT4, OP_R_INDEX8_ABS20, OP_VOID);
3956 1.1 christos
3957 1.1 christos if (OP[1] == 0)
3958 1.1 christos addr = (GPR32 (12)) + OP[2];
3959 1.1 christos else
3960 1.1 christos addr = (GPR32 (13)) + OP[2];
3961 1.1 christos
3962 1.1 christos SW (addr, a);
3963 1.6 christos trace_output_32 (sd, addr);
3964 1.1 christos }
3965 1.1 christos
3966 1.1 christos /* storw. */
3967 1.1 christos void
3968 1.6 christos OP_318_A (SIM_DESC sd, SIM_CPU *cpu)
3969 1.1 christos {
3970 1.10 christos uint16_t a = OP[0];
3971 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1];
3972 1.1 christos trace_input ("storw", OP_CONSTANT4, OP_RP_BASE_DISP14, OP_VOID);
3973 1.1 christos SW (addr, a);
3974 1.6 christos trace_output_32 (sd, addr);
3975 1.1 christos }
3976 1.1 christos
3977 1.1 christos /* storw. */
3978 1.1 christos void
3979 1.6 christos OP_C2_8 (SIM_DESC sd, SIM_CPU *cpu)
3980 1.1 christos {
3981 1.10 christos uint16_t a = OP[0];
3982 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1];
3983 1.1 christos trace_input ("storw", OP_CONSTANT4, OP_RP_INDEX_DISP0, OP_VOID);
3984 1.1 christos SW (addr, a);
3985 1.6 christos trace_output_32 (sd, addr);
3986 1.1 christos }
3987 1.1 christos
3988 1.1 christos /* storw. */
3989 1.1 christos void
3990 1.6 christos OP_130_14 (SIM_DESC sd, SIM_CPU *cpu)
3991 1.1 christos {
3992 1.10 christos uint16_t a = OP[0];
3993 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1];
3994 1.1 christos trace_input ("storw", OP_CONSTANT4, OP_R_BASE_DISPS20, OP_VOID);
3995 1.1 christos SW (addr, a);
3996 1.6 christos trace_output_32 (sd, addr);
3997 1.1 christos }
3998 1.1 christos
3999 1.1 christos /* storw. */
4000 1.1 christos void
4001 1.6 christos OP_C3_8 (SIM_DESC sd, SIM_CPU *cpu)
4002 1.1 christos {
4003 1.10 christos uint16_t a = OP[0];
4004 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1];
4005 1.1 christos trace_input ("storw", OP_CONSTANT4, OP_RP_BASE_DISP16, OP_VOID);
4006 1.1 christos SW (addr, a);
4007 1.6 christos trace_output_32 (sd, addr);
4008 1.1 christos }
4009 1.1 christos
4010 1.1 christos
4011 1.1 christos /* storw. */
4012 1.1 christos void
4013 1.6 christos OP_131_14 (SIM_DESC sd, SIM_CPU *cpu)
4014 1.1 christos {
4015 1.10 christos uint16_t a = OP[0];
4016 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1];
4017 1.1 christos trace_input ("storw", OP_CONSTANT4, OP_RP_BASE_DISPS20, OP_VOID);
4018 1.1 christos SW (addr, a);
4019 1.6 christos trace_output_32 (sd, addr);
4020 1.1 christos }
4021 1.1 christos
4022 1.1 christos /* storw. */
4023 1.1 christos void
4024 1.6 christos OP_132_14 (SIM_DESC sd, SIM_CPU *cpu)
4025 1.1 christos {
4026 1.10 christos uint16_t a = OP[0];
4027 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1];
4028 1.1 christos trace_input ("storw", OP_CONSTANT4, OP_RP_INDEX_DISPS20, OP_VOID);
4029 1.1 christos SW (addr, a);
4030 1.6 christos trace_output_32 (sd, addr);
4031 1.1 christos }
4032 1.1 christos
4033 1.1 christos
4034 1.1 christos /* stord. */
4035 1.1 christos void
4036 1.6 christos OP_C7_8 (SIM_DESC sd, SIM_CPU *cpu)
4037 1.1 christos {
4038 1.10 christos uint32_t a = GPR32 (OP[0]);
4039 1.10 christos uint32_t addr = OP[1];
4040 1.1 christos trace_input ("stord", OP_REGP, OP_ABS20_OUTPUT, OP_VOID);
4041 1.1 christos SLW (addr, a);
4042 1.6 christos trace_output_32 (sd, addr);
4043 1.1 christos }
4044 1.1 christos
4045 1.1 christos /* stord. */
4046 1.1 christos void
4047 1.6 christos OP_13B_14 (SIM_DESC sd, SIM_CPU *cpu)
4048 1.1 christos {
4049 1.10 christos uint32_t a = GPR32 (OP[0]);
4050 1.10 christos uint32_t addr = OP[1];
4051 1.1 christos trace_input ("stord", OP_REGP, OP_ABS24_OUTPUT, OP_VOID);
4052 1.1 christos SLW (addr, a);
4053 1.6 christos trace_output_32 (sd, addr);
4054 1.1 christos }
4055 1.1 christos
4056 1.1 christos /* stord. */
4057 1.1 christos void
4058 1.6 christos OP_66_7 (SIM_DESC sd, SIM_CPU *cpu)
4059 1.1 christos {
4060 1.10 christos uint32_t addr, a = GPR32 (OP[0]);
4061 1.1 christos trace_input ("stord", OP_REGP, OP_R_INDEX8_ABS20, OP_VOID);
4062 1.1 christos
4063 1.1 christos if (OP[1] == 0)
4064 1.1 christos addr = (GPR32 (12)) + OP[2];
4065 1.1 christos else
4066 1.1 christos addr = (GPR32 (13)) + OP[2];
4067 1.1 christos
4068 1.1 christos SLW (addr, a);
4069 1.6 christos trace_output_32 (sd, addr);
4070 1.1 christos }
4071 1.1 christos
4072 1.1 christos /* stord. */
4073 1.1 christos void
4074 1.6 christos OP_E_4 (SIM_DESC sd, SIM_CPU *cpu)
4075 1.1 christos {
4076 1.10 christos uint32_t a = GPR32 (OP[0]);
4077 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1];
4078 1.1 christos trace_input ("stord", OP_REGP, OP_RP_BASE_DISPE4, OP_VOID);
4079 1.1 christos SLW (addr, a);
4080 1.6 christos trace_output_32 (sd, addr);
4081 1.1 christos }
4082 1.1 christos
4083 1.1 christos /* stord. */
4084 1.1 christos void
4085 1.6 christos OP_EE_8 (SIM_DESC sd, SIM_CPU *cpu)
4086 1.1 christos {
4087 1.10 christos uint32_t a = GPR32 (OP[0]);
4088 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1];
4089 1.1 christos trace_input ("stord", OP_REGP, OP_RP_INDEX_DISP0, OP_VOID);
4090 1.1 christos SLW (addr, a);
4091 1.6 christos trace_output_32 (sd, addr);
4092 1.1 christos }
4093 1.1 christos
4094 1.1 christos /* stord. */
4095 1.1 christos void
4096 1.6 christos OP_31A_A (SIM_DESC sd, SIM_CPU *cpu)
4097 1.1 christos {
4098 1.10 christos uint32_t a = GPR32 (OP[0]);
4099 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1];
4100 1.1 christos trace_input ("stord", OP_REGP, OP_RP_INDEX_DISP14, OP_VOID);
4101 1.1 christos SLW (addr, a);
4102 1.6 christos trace_output_32 (sd, addr);
4103 1.1 christos }
4104 1.1 christos
4105 1.1 christos /* stord. */
4106 1.1 christos void
4107 1.6 christos OP_198_14 (SIM_DESC sd, SIM_CPU *cpu)
4108 1.1 christos {
4109 1.10 christos uint32_t a = GPR32 (OP[0]);
4110 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1];
4111 1.1 christos trace_input ("stord", OP_REGP, OP_R_BASE_DISPE20, OP_VOID);
4112 1.1 christos SLW (addr, a);
4113 1.6 christos trace_output_32 (sd, addr);
4114 1.1 christos }
4115 1.1 christos
4116 1.1 christos /* stord. */
4117 1.1 christos void
4118 1.6 christos OP_138_14 (SIM_DESC sd, SIM_CPU *cpu)
4119 1.1 christos {
4120 1.10 christos uint32_t a = GPR32 (OP[0]);
4121 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1];
4122 1.1 christos trace_input ("stord", OP_REGP, OP_R_BASE_DISPS20, OP_VOID);
4123 1.1 christos SLW (addr, a);
4124 1.6 christos trace_output_32 (sd, addr);
4125 1.1 christos }
4126 1.1 christos
4127 1.1 christos /* stord. */
4128 1.1 christos void
4129 1.6 christos OP_EF_8 (SIM_DESC sd, SIM_CPU *cpu)
4130 1.1 christos {
4131 1.10 christos uint32_t a = GPR32 (OP[0]);
4132 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1];
4133 1.1 christos trace_input ("stord", OP_REGP, OP_RP_BASE_DISP16, OP_VOID);
4134 1.1 christos SLW (addr, a);
4135 1.6 christos trace_output_32 (sd, addr);
4136 1.1 christos }
4137 1.1 christos
4138 1.1 christos /* stord. */
4139 1.1 christos void
4140 1.6 christos OP_139_14 (SIM_DESC sd, SIM_CPU *cpu)
4141 1.1 christos {
4142 1.10 christos uint32_t a = GPR32 (OP[0]);
4143 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1];
4144 1.1 christos trace_input ("stord", OP_REGP, OP_RP_BASE_DISPS20, OP_VOID);
4145 1.1 christos SLW (addr, a);
4146 1.6 christos trace_output_32 (sd, addr);
4147 1.1 christos }
4148 1.1 christos
4149 1.1 christos /* stord. */
4150 1.1 christos void
4151 1.6 christos OP_199_14 (SIM_DESC sd, SIM_CPU *cpu)
4152 1.1 christos {
4153 1.10 christos uint32_t a = GPR32 (OP[0]);
4154 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1];
4155 1.1 christos trace_input ("stord", OP_REGP, OP_RP_BASE_DISPE20, OP_VOID);
4156 1.1 christos SLW (addr, a);
4157 1.6 christos trace_output_32 (sd, addr);
4158 1.1 christos }
4159 1.1 christos
4160 1.1 christos /* stord. */
4161 1.1 christos void
4162 1.6 christos OP_13A_14 (SIM_DESC sd, SIM_CPU *cpu)
4163 1.1 christos {
4164 1.10 christos uint32_t a = GPR32 (OP[0]);
4165 1.10 christos uint32_t addr = (GPR32 (OP[2])) + OP[1];
4166 1.1 christos trace_input ("stord", OP_REGP, OP_RP_INDEX_DISPS20, OP_VOID);
4167 1.1 christos SLW (addr, a);
4168 1.6 christos trace_output_32 (sd, addr);
4169 1.1 christos }
4170 1.1 christos
4171 1.1 christos /* macqu. */
4172 1.1 christos void
4173 1.6 christos OP_14D_14 (SIM_DESC sd, SIM_CPU *cpu)
4174 1.1 christos {
4175 1.10 christos int32_t tmp;
4176 1.10 christos int16_t src1, src2;
4177 1.1 christos trace_input ("macuw", OP_REG, OP_REG, OP_REGP);
4178 1.1 christos src1 = GPR (OP[0]);
4179 1.1 christos src2 = GPR (OP[1]);
4180 1.1 christos tmp = src1 * src2;
4181 1.1 christos /*REVISIT FOR SATURATION and Q FORMAT. */
4182 1.1 christos SET_GPR32 (OP[2], tmp);
4183 1.6 christos trace_output_32 (sd, tmp);
4184 1.1 christos }
4185 1.1 christos
4186 1.1 christos /* macuw. */
4187 1.1 christos void
4188 1.6 christos OP_14E_14 (SIM_DESC sd, SIM_CPU *cpu)
4189 1.1 christos {
4190 1.10 christos uint32_t tmp;
4191 1.10 christos uint16_t src1, src2;
4192 1.1 christos trace_input ("macuw", OP_REG, OP_REG, OP_REGP);
4193 1.1 christos src1 = GPR (OP[0]);
4194 1.1 christos src2 = GPR (OP[1]);
4195 1.1 christos tmp = src1 * src2;
4196 1.1 christos /*REVISIT FOR SATURATION. */
4197 1.1 christos SET_GPR32 (OP[2], tmp);
4198 1.6 christos trace_output_32 (sd, tmp);
4199 1.1 christos }
4200 1.1 christos
4201 1.1 christos /* macsw. */
4202 1.1 christos void
4203 1.6 christos OP_14F_14 (SIM_DESC sd, SIM_CPU *cpu)
4204 1.1 christos {
4205 1.10 christos int32_t tmp;
4206 1.10 christos int16_t src1, src2;
4207 1.1 christos trace_input ("macsw", OP_REG, OP_REG, OP_REGP);
4208 1.1 christos src1 = GPR (OP[0]);
4209 1.1 christos src2 = GPR (OP[1]);
4210 1.1 christos tmp = src1 * src2;
4211 1.1 christos /*REVISIT FOR SATURATION. */
4212 1.1 christos SET_GPR32 (OP[2], tmp);
4213 1.6 christos trace_output_32 (sd, tmp);
4214 1.1 christos }
4215 1.1 christos
4216 1.1 christos
4217 1.1 christos /* mulb. */
4218 1.1 christos void
4219 1.6 christos OP_64_8 (SIM_DESC sd, SIM_CPU *cpu)
4220 1.1 christos {
4221 1.10 christos int16_t tmp;
4222 1.10 christos int8_t a = (OP[0]) & 0xff;
4223 1.10 christos int8_t b = (GPR (OP[1])) & 0xff;
4224 1.1 christos trace_input ("mulb", OP_CONSTANT4_1, OP_REG, OP_VOID);
4225 1.1 christos tmp = (a * b) & 0xff;
4226 1.1 christos SET_GPR (OP[1], (tmp | ((GPR (OP[1])) & 0xff00)));
4227 1.6 christos trace_output_16 (sd, tmp);
4228 1.1 christos }
4229 1.1 christos
4230 1.1 christos /* mulb. */
4231 1.1 christos void
4232 1.6 christos OP_64B_C (SIM_DESC sd, SIM_CPU *cpu)
4233 1.1 christos {
4234 1.10 christos int16_t tmp;
4235 1.10 christos int8_t a = (OP[0]) & 0xff, b = (GPR (OP[1])) & 0xff;
4236 1.1 christos trace_input ("mulb", OP_CONSTANT4, OP_REG, OP_VOID);
4237 1.1 christos tmp = (a * b) & 0xff;
4238 1.1 christos SET_GPR (OP[1], (tmp | ((GPR (OP[1])) & 0xff00)));
4239 1.6 christos trace_output_16 (sd, tmp);
4240 1.1 christos }
4241 1.1 christos
4242 1.1 christos
4243 1.1 christos /* mulb. */
4244 1.1 christos void
4245 1.6 christos OP_65_8 (SIM_DESC sd, SIM_CPU *cpu)
4246 1.1 christos {
4247 1.10 christos int16_t tmp;
4248 1.10 christos int8_t a = (GPR (OP[0])) & 0xff, b = (GPR (OP[1])) & 0xff;
4249 1.1 christos trace_input ("mulb", OP_REG, OP_REG, OP_VOID);
4250 1.1 christos tmp = (a * b) & 0xff;
4251 1.1 christos SET_GPR (OP[1], (tmp | ((GPR (OP[1])) & 0xff00)));
4252 1.6 christos trace_output_16 (sd, tmp);
4253 1.1 christos }
4254 1.1 christos
4255 1.1 christos
4256 1.1 christos /* mulw. */
4257 1.1 christos void
4258 1.6 christos OP_66_8 (SIM_DESC sd, SIM_CPU *cpu)
4259 1.1 christos {
4260 1.10 christos int32_t tmp;
4261 1.10 christos uint16_t a = OP[0];
4262 1.10 christos int16_t b = (GPR (OP[1]));
4263 1.1 christos trace_input ("mulw", OP_CONSTANT4_1, OP_REG, OP_VOID);
4264 1.1 christos tmp = (a * b) & 0xffff;
4265 1.1 christos SET_GPR (OP[1], tmp);
4266 1.6 christos trace_output_32 (sd, tmp);
4267 1.1 christos }
4268 1.1 christos
4269 1.1 christos /* mulw. */
4270 1.1 christos void
4271 1.6 christos OP_66B_C (SIM_DESC sd, SIM_CPU *cpu)
4272 1.1 christos {
4273 1.10 christos int32_t tmp;
4274 1.10 christos int16_t a = OP[0], b = (GPR (OP[1]));
4275 1.1 christos trace_input ("mulw", OP_CONSTANT4, OP_REG, OP_VOID);
4276 1.1 christos tmp = (a * b) & 0xffff;
4277 1.1 christos SET_GPR (OP[1], tmp);
4278 1.6 christos trace_output_32 (sd, tmp);
4279 1.1 christos }
4280 1.1 christos
4281 1.1 christos
4282 1.1 christos /* mulw. */
4283 1.1 christos void
4284 1.6 christos OP_67_8 (SIM_DESC sd, SIM_CPU *cpu)
4285 1.1 christos {
4286 1.10 christos int32_t tmp;
4287 1.10 christos int16_t a = (GPR (OP[0])), b = (GPR (OP[1]));
4288 1.1 christos trace_input ("mulw", OP_REG, OP_REG, OP_VOID);
4289 1.1 christos tmp = (a * b) & 0xffff;
4290 1.1 christos SET_GPR (OP[1], tmp);
4291 1.6 christos trace_output_32 (sd, tmp);
4292 1.1 christos }
4293 1.1 christos
4294 1.1 christos
4295 1.1 christos /* mulsb. */
4296 1.1 christos void
4297 1.6 christos OP_B_8 (SIM_DESC sd, SIM_CPU *cpu)
4298 1.1 christos {
4299 1.10 christos int16_t tmp;
4300 1.10 christos int8_t a = (GPR (OP[0])) & 0xff, b = (GPR (OP[1])) & 0xff;
4301 1.1 christos trace_input ("mulsb", OP_REG, OP_REG, OP_VOID);
4302 1.1 christos tmp = a * b;
4303 1.1 christos SET_GPR (OP[1], tmp);
4304 1.6 christos trace_output_32 (sd, tmp);
4305 1.1 christos }
4306 1.1 christos
4307 1.1 christos /* mulsw. */
4308 1.1 christos void
4309 1.6 christos OP_62_8 (SIM_DESC sd, SIM_CPU *cpu)
4310 1.1 christos {
4311 1.10 christos int32_t tmp;
4312 1.10 christos int16_t a = (GPR (OP[0])), b = (GPR (OP[1]));
4313 1.1 christos trace_input ("mulsw", OP_REG, OP_REGP, OP_VOID);
4314 1.1 christos tmp = a * b;
4315 1.1 christos SET_GPR32 (OP[1], tmp);
4316 1.6 christos trace_output_32 (sd, tmp);
4317 1.1 christos }
4318 1.1 christos
4319 1.1 christos /* muluw. */
4320 1.1 christos void
4321 1.6 christos OP_63_8 (SIM_DESC sd, SIM_CPU *cpu)
4322 1.1 christos {
4323 1.10 christos uint32_t tmp;
4324 1.10 christos uint16_t a = (GPR (OP[0])), b = (GPR (OP[1]));
4325 1.1 christos trace_input ("muluw", OP_REG, OP_REGP, OP_VOID);
4326 1.1 christos tmp = a * b;
4327 1.1 christos SET_GPR32 (OP[1], tmp);
4328 1.6 christos trace_output_32 (sd, tmp);
4329 1.1 christos }
4330 1.1 christos
4331 1.1 christos
4332 1.1 christos /* nop. */
4333 1.1 christos void
4334 1.6 christos OP_2C00_10 (SIM_DESC sd, SIM_CPU *cpu)
4335 1.1 christos {
4336 1.1 christos trace_input ("nop", OP_VOID, OP_VOID, OP_VOID);
4337 1.1 christos
4338 1.1 christos #if 0
4339 1.1 christos ins_type_counters[ (int)State.ins_type ]--; /* don't count nops as normal instructions */
4340 1.1 christos switch (State.ins_type)
4341 1.1 christos {
4342 1.1 christos default:
4343 1.1 christos ins_type_counters[ (int)INS_UNKNOWN ]++;
4344 1.1 christos break;
4345 1.1 christos
4346 1.1 christos }
4347 1.6 christos EXCEPTION (SIM_SIGTRAP);
4348 1.1 christos #endif
4349 1.6 christos trace_output_void (sd);
4350 1.1 christos }
4351 1.1 christos
4352 1.1 christos
4353 1.1 christos /* orb. */
4354 1.1 christos void
4355 1.6 christos OP_24_8 (SIM_DESC sd, SIM_CPU *cpu)
4356 1.1 christos {
4357 1.10 christos uint8_t tmp, a = (OP[0]) & 0xff, b = (GPR (OP[1])) & 0xff;
4358 1.1 christos trace_input ("orb", OP_CONSTANT4, OP_REG, OP_VOID);
4359 1.1 christos tmp = a | b;
4360 1.1 christos SET_GPR (OP[1], ((GPR (OP[1]) | tmp)));
4361 1.6 christos trace_output_16 (sd, tmp);
4362 1.1 christos }
4363 1.1 christos
4364 1.1 christos /* orb. */
4365 1.1 christos void
4366 1.6 christos OP_24B_C (SIM_DESC sd, SIM_CPU *cpu)
4367 1.1 christos {
4368 1.10 christos uint8_t tmp, a = (OP[0]) & 0xff, b = (GPR (OP[1])) & 0xff;
4369 1.1 christos trace_input ("orb", OP_CONSTANT16, OP_REG, OP_VOID);
4370 1.1 christos tmp = a | b;
4371 1.1 christos SET_GPR (OP[1], ((GPR (OP[1]) | tmp)));
4372 1.6 christos trace_output_16 (sd, tmp);
4373 1.1 christos }
4374 1.1 christos
4375 1.1 christos /* orb. */
4376 1.1 christos void
4377 1.6 christos OP_25_8 (SIM_DESC sd, SIM_CPU *cpu)
4378 1.1 christos {
4379 1.10 christos uint8_t tmp, a = (GPR (OP[0])) & 0xff, b = (GPR (OP[1])) & 0xff;
4380 1.1 christos trace_input ("orb", OP_REG, OP_REG, OP_VOID);
4381 1.1 christos tmp = a | b;
4382 1.1 christos SET_GPR (OP[1], ((GPR (OP[1]) | tmp)));
4383 1.6 christos trace_output_16 (sd, tmp);
4384 1.1 christos }
4385 1.1 christos
4386 1.1 christos /* orw. */
4387 1.1 christos void
4388 1.6 christos OP_26_8 (SIM_DESC sd, SIM_CPU *cpu)
4389 1.1 christos {
4390 1.10 christos uint16_t tmp, a = (OP[0]), b = (GPR (OP[1]));
4391 1.1 christos trace_input ("orw", OP_CONSTANT4, OP_REG, OP_VOID);
4392 1.1 christos tmp = a | b;
4393 1.1 christos SET_GPR (OP[1], tmp);
4394 1.6 christos trace_output_16 (sd, tmp);
4395 1.1 christos }
4396 1.1 christos
4397 1.1 christos
4398 1.1 christos /* orw. */
4399 1.1 christos void
4400 1.6 christos OP_26B_C (SIM_DESC sd, SIM_CPU *cpu)
4401 1.1 christos {
4402 1.10 christos uint16_t tmp, a = (OP[0]), b = (GPR (OP[1]));
4403 1.1 christos trace_input ("orw", OP_CONSTANT16, OP_REG, OP_VOID);
4404 1.1 christos tmp = a | b;
4405 1.1 christos SET_GPR (OP[1], tmp);
4406 1.6 christos trace_output_16 (sd, tmp);
4407 1.1 christos }
4408 1.1 christos
4409 1.1 christos /* orw. */
4410 1.1 christos void
4411 1.6 christos OP_27_8 (SIM_DESC sd, SIM_CPU *cpu)
4412 1.1 christos {
4413 1.10 christos uint16_t tmp, a = (GPR (OP[0])), b = (GPR (OP[1]));
4414 1.1 christos trace_input ("orw", OP_REG, OP_REG, OP_VOID);
4415 1.1 christos tmp = a | b;
4416 1.1 christos SET_GPR (OP[1], tmp);
4417 1.6 christos trace_output_16 (sd, tmp);
4418 1.1 christos }
4419 1.1 christos
4420 1.1 christos
4421 1.1 christos /* lshb. */
4422 1.1 christos void
4423 1.6 christos OP_13_9 (SIM_DESC sd, SIM_CPU *cpu)
4424 1.1 christos {
4425 1.10 christos uint16_t a = OP[0];
4426 1.10 christos uint16_t tmp, b = (GPR (OP[1])) & 0xFF;
4427 1.1 christos trace_input ("lshb", OP_CONSTANT4, OP_REG, OP_VOID);
4428 1.1 christos /* A positive count specifies a shift to the left;
4429 1.1 christos * A negative count specifies a shift to the right. */
4430 1.1 christos if (sign_flag)
4431 1.1 christos tmp = b >> a;
4432 1.1 christos else
4433 1.1 christos tmp = b << a;
4434 1.1 christos
4435 1.1 christos sign_flag = 0; /* Reset sign_flag. */
4436 1.1 christos
4437 1.1 christos SET_GPR (OP[1], ((tmp & 0xFF) | ((GPR (OP[1])) & 0xFF00)));
4438 1.6 christos trace_output_16 (sd, tmp);
4439 1.1 christos }
4440 1.1 christos
4441 1.1 christos /* lshb. */
4442 1.1 christos void
4443 1.6 christos OP_44_8 (SIM_DESC sd, SIM_CPU *cpu)
4444 1.1 christos {
4445 1.10 christos uint16_t a = (GPR (OP[0])) & 0xff;
4446 1.10 christos uint16_t tmp, b = (GPR (OP[1])) & 0xFF;
4447 1.1 christos trace_input ("lshb", OP_REG, OP_REG, OP_VOID);
4448 1.1 christos if (a & ((long)1 << 3))
4449 1.1 christos {
4450 1.1 christos sign_flag = 1;
4451 1.1 christos a = ~(a) + 1;
4452 1.1 christos }
4453 1.1 christos a = (unsigned int) (a & 0x7);
4454 1.1 christos
4455 1.1 christos /* A positive count specifies a shift to the left;
4456 1.1 christos * A negative count specifies a shift to the right. */
4457 1.1 christos if (sign_flag)
4458 1.1 christos tmp = b >> a;
4459 1.1 christos else
4460 1.1 christos tmp = b << a;
4461 1.1 christos
4462 1.1 christos sign_flag = 0; /* Reset sign_flag. */
4463 1.1 christos SET_GPR (OP[1], ((tmp & 0xFF) | ((GPR (OP[1])) & 0xFF00)));
4464 1.6 christos trace_output_16 (sd, tmp);
4465 1.1 christos }
4466 1.1 christos
4467 1.1 christos /* lshw. */
4468 1.1 christos void
4469 1.6 christos OP_46_8 (SIM_DESC sd, SIM_CPU *cpu)
4470 1.1 christos {
4471 1.10 christos uint16_t tmp, b = GPR (OP[1]);
4472 1.10 christos int16_t a = GPR (OP[0]);
4473 1.1 christos trace_input ("lshw", OP_REG, OP_REG, OP_VOID);
4474 1.1 christos if (a & ((long)1 << 4))
4475 1.1 christos {
4476 1.1 christos sign_flag = 1;
4477 1.1 christos a = ~(a) + 1;
4478 1.1 christos }
4479 1.1 christos a = (unsigned int) (a & 0xf);
4480 1.1 christos
4481 1.1 christos /* A positive count specifies a shift to the left;
4482 1.1 christos * A negative count specifies a shift to the right. */
4483 1.1 christos if (sign_flag)
4484 1.1 christos tmp = b >> a;
4485 1.1 christos else
4486 1.1 christos tmp = b << a;
4487 1.1 christos
4488 1.1 christos sign_flag = 0; /* Reset sign_flag. */
4489 1.1 christos SET_GPR (OP[1], (tmp & 0xffff));
4490 1.6 christos trace_output_16 (sd, tmp);
4491 1.1 christos }
4492 1.1 christos
4493 1.1 christos /* lshw. */
4494 1.1 christos void
4495 1.6 christos OP_49_8 (SIM_DESC sd, SIM_CPU *cpu)
4496 1.1 christos {
4497 1.10 christos uint16_t tmp, b = GPR (OP[1]);
4498 1.10 christos uint16_t a = OP[0];
4499 1.1 christos trace_input ("lshw", OP_CONSTANT5, OP_REG, OP_VOID);
4500 1.1 christos /* A positive count specifies a shift to the left;
4501 1.1 christos * A negative count specifies a shift to the right. */
4502 1.1 christos if (sign_flag)
4503 1.1 christos tmp = b >> a;
4504 1.1 christos else
4505 1.1 christos tmp = b << a;
4506 1.1 christos
4507 1.1 christos sign_flag = 0; /* Reset sign_flag. */
4508 1.1 christos SET_GPR (OP[1], (tmp & 0xffff));
4509 1.6 christos trace_output_16 (sd, tmp);
4510 1.1 christos }
4511 1.1 christos
4512 1.1 christos /* lshd. */
4513 1.1 christos void
4514 1.6 christos OP_25_7 (SIM_DESC sd, SIM_CPU *cpu)
4515 1.1 christos {
4516 1.10 christos uint32_t tmp, b = GPR32 (OP[1]);
4517 1.10 christos uint16_t a = OP[0];
4518 1.1 christos trace_input ("lshd", OP_CONSTANT6, OP_REGP, OP_VOID);
4519 1.1 christos /* A positive count specifies a shift to the left;
4520 1.1 christos * A negative count specifies a shift to the right. */
4521 1.1 christos if (sign_flag)
4522 1.1 christos tmp = b >> a;
4523 1.1 christos else
4524 1.1 christos tmp = b << a;
4525 1.1 christos
4526 1.1 christos sign_flag = 0; /* Reset sign flag. */
4527 1.1 christos
4528 1.1 christos SET_GPR32 (OP[1], tmp);
4529 1.6 christos trace_output_32 (sd, tmp);
4530 1.1 christos }
4531 1.1 christos
4532 1.1 christos /* lshd. */
4533 1.1 christos void
4534 1.6 christos OP_47_8 (SIM_DESC sd, SIM_CPU *cpu)
4535 1.1 christos {
4536 1.10 christos uint32_t tmp, b = GPR32 (OP[1]);
4537 1.10 christos uint16_t a = GPR (OP[0]);
4538 1.1 christos trace_input ("lshd", OP_REG, OP_REGP, OP_VOID);
4539 1.1 christos if (a & ((long)1 << 5))
4540 1.1 christos {
4541 1.1 christos sign_flag = 1;
4542 1.1 christos a = ~(a) + 1;
4543 1.1 christos }
4544 1.1 christos a = (unsigned int) (a & 0x1f);
4545 1.1 christos /* A positive count specifies a shift to the left;
4546 1.1 christos * A negative count specifies a shift to the right. */
4547 1.1 christos if (sign_flag)
4548 1.1 christos tmp = b >> a;
4549 1.1 christos else
4550 1.1 christos tmp = b << a;
4551 1.1 christos
4552 1.1 christos sign_flag = 0; /* Reset sign flag. */
4553 1.1 christos
4554 1.1 christos SET_GPR32 (OP[1], tmp);
4555 1.6 christos trace_output_32 (sd, tmp);
4556 1.1 christos }
4557 1.1 christos
4558 1.1 christos /* ashub. */
4559 1.1 christos void
4560 1.6 christos OP_80_9 (SIM_DESC sd, SIM_CPU *cpu)
4561 1.1 christos {
4562 1.10 christos uint16_t a = OP[0];
4563 1.10 christos int8_t tmp, b = (GPR (OP[1])) & 0xFF;
4564 1.1 christos trace_input ("ashub", OP_CONSTANT4, OP_REG, OP_VOID);
4565 1.1 christos /* A positive count specifies a shift to the left;
4566 1.1 christos * A negative count specifies a shift to the right. */
4567 1.1 christos if (sign_flag)
4568 1.1 christos tmp = b >> a;
4569 1.1 christos else
4570 1.1 christos tmp = b << a;
4571 1.1 christos
4572 1.1 christos sign_flag = 0; /* Reset sign flag. */
4573 1.1 christos
4574 1.1 christos SET_GPR (OP[1], ((tmp & 0xFF) | ((GPR (OP[1])) & 0xff00)));
4575 1.6 christos trace_output_16 (sd, tmp);
4576 1.1 christos }
4577 1.1 christos
4578 1.1 christos /* ashub. */
4579 1.1 christos void
4580 1.6 christos OP_81_9 (SIM_DESC sd, SIM_CPU *cpu)
4581 1.1 christos {
4582 1.10 christos uint16_t a = OP[0];
4583 1.10 christos int8_t tmp, b = (GPR (OP[1])) & 0xFF;
4584 1.1 christos trace_input ("ashub", OP_CONSTANT4, OP_REG, OP_VOID);
4585 1.1 christos /* A positive count specifies a shift to the left;
4586 1.1 christos * A negative count specifies a shift to the right. */
4587 1.1 christos if (sign_flag)
4588 1.1 christos tmp = b >> a;
4589 1.1 christos else
4590 1.1 christos tmp = b << a;
4591 1.1 christos
4592 1.1 christos sign_flag = 0; /* Reset sign flag. */
4593 1.1 christos
4594 1.1 christos SET_GPR (OP[1], ((tmp & 0xFF) | ((GPR (OP[1])) & 0xFF00)));
4595 1.6 christos trace_output_16 (sd, tmp);
4596 1.1 christos }
4597 1.1 christos
4598 1.1 christos
4599 1.1 christos /* ashub. */
4600 1.1 christos void
4601 1.6 christos OP_41_8 (SIM_DESC sd, SIM_CPU *cpu)
4602 1.1 christos {
4603 1.10 christos int16_t a = (GPR (OP[0]));
4604 1.10 christos int8_t tmp, b = (GPR (OP[1])) & 0xFF;
4605 1.1 christos trace_input ("ashub", OP_REG, OP_REG, OP_VOID);
4606 1.1 christos
4607 1.1 christos if (a & ((long)1 << 3))
4608 1.1 christos {
4609 1.1 christos sign_flag = 1;
4610 1.1 christos a = ~(a) + 1;
4611 1.1 christos }
4612 1.1 christos a = (unsigned int) (a & 0x7);
4613 1.1 christos
4614 1.1 christos /* A positive count specifies a shift to the left;
4615 1.1 christos * A negative count specifies a shift to the right. */
4616 1.1 christos if (sign_flag)
4617 1.1 christos tmp = b >> a;
4618 1.1 christos else
4619 1.1 christos tmp = b << a;
4620 1.1 christos
4621 1.1 christos sign_flag = 0; /* Reset sign flag. */
4622 1.1 christos
4623 1.1 christos SET_GPR (OP[1], ((tmp & 0xFF) | ((GPR (OP[1])) & 0xFF00)));
4624 1.6 christos trace_output_16 (sd, tmp);
4625 1.1 christos }
4626 1.1 christos
4627 1.1 christos
4628 1.1 christos /* ashuw. */
4629 1.1 christos void
4630 1.6 christos OP_42_8 (SIM_DESC sd, SIM_CPU *cpu)
4631 1.1 christos {
4632 1.10 christos int16_t tmp, b = GPR (OP[1]);
4633 1.10 christos uint16_t a = OP[0];
4634 1.1 christos trace_input ("ashuw", OP_CONSTANT5, OP_REG, OP_VOID);
4635 1.1 christos /* A positive count specifies a shift to the left;
4636 1.1 christos * A negative count specifies a shift to the right. */
4637 1.1 christos if (sign_flag)
4638 1.1 christos tmp = b >> a;
4639 1.1 christos else
4640 1.1 christos tmp = b << a;
4641 1.1 christos
4642 1.1 christos sign_flag = 0; /* Reset sign flag. */
4643 1.1 christos
4644 1.1 christos SET_GPR (OP[1], (tmp & 0xffff));
4645 1.6 christos trace_output_16 (sd, tmp);
4646 1.1 christos }
4647 1.1 christos
4648 1.1 christos /* ashuw. */
4649 1.1 christos void
4650 1.6 christos OP_43_8 (SIM_DESC sd, SIM_CPU *cpu)
4651 1.1 christos {
4652 1.10 christos int16_t tmp, b = GPR (OP[1]);
4653 1.10 christos uint16_t a = OP[0];
4654 1.1 christos trace_input ("ashuw", OP_CONSTANT5, OP_REG, OP_VOID);
4655 1.1 christos /* A positive count specifies a shift to the left;
4656 1.1 christos * A negative count specifies a shift to the right. */
4657 1.1 christos if (sign_flag)
4658 1.1 christos tmp = b >> a;
4659 1.1 christos else
4660 1.1 christos tmp = b << a;
4661 1.1 christos
4662 1.1 christos sign_flag = 0; /* Reset sign flag. */
4663 1.1 christos SET_GPR (OP[1], (tmp & 0xffff));
4664 1.6 christos trace_output_16 (sd, tmp);
4665 1.1 christos }
4666 1.1 christos
4667 1.1 christos /* ashuw. */
4668 1.1 christos void
4669 1.6 christos OP_45_8 (SIM_DESC sd, SIM_CPU *cpu)
4670 1.1 christos {
4671 1.10 christos int16_t tmp;
4672 1.10 christos int16_t a = GPR (OP[0]), b = GPR (OP[1]);
4673 1.1 christos trace_input ("ashuw", OP_REG, OP_REG, OP_VOID);
4674 1.1 christos
4675 1.1 christos if (a & ((long)1 << 4))
4676 1.1 christos {
4677 1.1 christos sign_flag = 1;
4678 1.1 christos a = ~(a) + 1;
4679 1.1 christos }
4680 1.1 christos a = (unsigned int) (a & 0xf);
4681 1.1 christos /* A positive count specifies a shift to the left;
4682 1.1 christos * A negative count specifies a shift to the right. */
4683 1.1 christos
4684 1.1 christos if (sign_flag)
4685 1.1 christos tmp = b >> a;
4686 1.1 christos else
4687 1.1 christos tmp = b << a;
4688 1.1 christos
4689 1.1 christos sign_flag = 0; /* Reset sign flag. */
4690 1.1 christos SET_GPR (OP[1], (tmp & 0xffff));
4691 1.6 christos trace_output_16 (sd, tmp);
4692 1.1 christos }
4693 1.1 christos
4694 1.1 christos /* ashud. */
4695 1.1 christos void
4696 1.6 christos OP_26_7 (SIM_DESC sd, SIM_CPU *cpu)
4697 1.1 christos {
4698 1.10 christos int32_t tmp,b = GPR32 (OP[1]);
4699 1.10 christos uint32_t a = OP[0];
4700 1.1 christos trace_input ("ashud", OP_CONSTANT6, OP_REGP, OP_VOID);
4701 1.1 christos /* A positive count specifies a shift to the left;
4702 1.1 christos * A negative count specifies a shift to the right. */
4703 1.1 christos if (sign_flag)
4704 1.1 christos tmp = b >> a;
4705 1.1 christos else
4706 1.1 christos tmp = b << a;
4707 1.1 christos
4708 1.1 christos sign_flag = 0; /* Reset sign flag. */
4709 1.1 christos SET_GPR32 (OP[1], tmp);
4710 1.6 christos trace_output_32 (sd, tmp);
4711 1.1 christos }
4712 1.1 christos
4713 1.1 christos /* ashud. */
4714 1.1 christos void
4715 1.6 christos OP_27_7 (SIM_DESC sd, SIM_CPU *cpu)
4716 1.1 christos {
4717 1.10 christos int32_t tmp;
4718 1.10 christos int32_t a = OP[0], b = GPR32 (OP[1]);
4719 1.1 christos trace_input ("ashud", OP_CONSTANT6, OP_REGP, OP_VOID);
4720 1.1 christos /* A positive count specifies a shift to the left;
4721 1.1 christos * A negative count specifies a shift to the right. */
4722 1.1 christos if (sign_flag)
4723 1.1 christos tmp = b >> a;
4724 1.1 christos else
4725 1.1 christos tmp = b << a;
4726 1.1 christos
4727 1.1 christos sign_flag = 0; /* Reset sign flag. */
4728 1.1 christos SET_GPR32 (OP[1], tmp);
4729 1.6 christos trace_output_32 (sd, tmp);
4730 1.1 christos }
4731 1.1 christos
4732 1.1 christos /* ashud. */
4733 1.1 christos void
4734 1.6 christos OP_48_8 (SIM_DESC sd, SIM_CPU *cpu)
4735 1.1 christos {
4736 1.10 christos int32_t tmp;
4737 1.10 christos int32_t a = GPR32 (OP[0]), b = GPR32 (OP[1]);
4738 1.1 christos trace_input ("ashud", OP_REGP, OP_REGP, OP_VOID);
4739 1.1 christos
4740 1.1 christos if (a & ((long)1 << 5))
4741 1.1 christos {
4742 1.1 christos sign_flag = 1;
4743 1.1 christos a = ~(a) + 1;
4744 1.1 christos }
4745 1.1 christos a = (unsigned int) (a & 0x1f);
4746 1.1 christos /* A positive count specifies a shift to the left;
4747 1.1 christos * A negative count specifies a shift to the right. */
4748 1.1 christos if (sign_flag)
4749 1.1 christos tmp = b >> a;
4750 1.1 christos else
4751 1.1 christos tmp = b << a;
4752 1.1 christos
4753 1.1 christos sign_flag = 0; /* Reset sign flag. */
4754 1.1 christos SET_GPR32 (OP[1], tmp);
4755 1.6 christos trace_output_32 (sd, tmp);
4756 1.1 christos }
4757 1.1 christos
4758 1.1 christos
4759 1.1 christos /* storm. */
4760 1.1 christos void
4761 1.6 christos OP_16_D (SIM_DESC sd, SIM_CPU *cpu)
4762 1.1 christos {
4763 1.10 christos uint32_t addr = GPR (1);
4764 1.10 christos uint16_t count = OP[0], reg = 2;
4765 1.1 christos trace_input ("storm", OP_CONSTANT4, OP_VOID, OP_VOID);
4766 1.1 christos if ((addr & 1))
4767 1.1 christos {
4768 1.6 christos trace_output_void (sd);
4769 1.6 christos EXCEPTION (SIM_SIGBUS);
4770 1.1 christos }
4771 1.1 christos
4772 1.1 christos while (count)
4773 1.1 christos {
4774 1.1 christos SW (addr, (GPR (reg)));
4775 1.1 christos addr +=2;
4776 1.1 christos --count;
4777 1.1 christos reg++;
4778 1.1 christos if (reg == 6) reg = 8;
4779 1.1 christos };
4780 1.1 christos
4781 1.1 christos SET_GPR (1, addr);
4782 1.1 christos
4783 1.6 christos trace_output_void (sd);
4784 1.1 christos }
4785 1.1 christos
4786 1.1 christos
4787 1.1 christos /* stormp. */
4788 1.1 christos void
4789 1.6 christos OP_17_D (SIM_DESC sd, SIM_CPU *cpu)
4790 1.1 christos {
4791 1.10 christos uint32_t addr = GPR32 (6);
4792 1.10 christos uint16_t count = OP[0], reg = 2;
4793 1.1 christos trace_input ("stormp", OP_CONSTANT4, OP_VOID, OP_VOID);
4794 1.1 christos if ((addr & 1))
4795 1.1 christos {
4796 1.6 christos trace_output_void (sd);
4797 1.6 christos EXCEPTION (SIM_SIGBUS);
4798 1.1 christos }
4799 1.1 christos
4800 1.1 christos while (count)
4801 1.1 christos {
4802 1.1 christos SW (addr, (GPR (reg)));
4803 1.1 christos addr +=2;
4804 1.1 christos --count;
4805 1.1 christos reg++;
4806 1.1 christos if (reg == 6) reg = 8;
4807 1.1 christos };
4808 1.1 christos
4809 1.1 christos SET_GPR32 (6, addr);
4810 1.6 christos trace_output_void (sd);
4811 1.1 christos }
4812 1.1 christos
4813 1.1 christos /* subb. */
4814 1.1 christos void
4815 1.6 christos OP_38_8 (SIM_DESC sd, SIM_CPU *cpu)
4816 1.1 christos {
4817 1.10 christos uint8_t a = OP[0];
4818 1.10 christos uint8_t b = (GPR (OP[1])) & 0xff;
4819 1.10 christos uint16_t tmp = (~a + 1 + b) & 0xff;
4820 1.1 christos trace_input ("subb", OP_CONSTANT4, OP_REG, OP_VOID);
4821 1.1 christos /* see ../common/sim-alu.h for a more extensive discussion on how to
4822 1.1 christos compute the carry/overflow bits. */
4823 1.1 christos SET_PSR_C (tmp > 0xff);
4824 1.1 christos SET_PSR_F (((a & 0x80) != (b & 0x80)) && ((b & 0x80) != (tmp & 0x80)));
4825 1.1 christos SET_GPR (OP[1], (tmp | ((GPR (OP[1])) & 0xff00)));
4826 1.6 christos trace_output_16 (sd, tmp);
4827 1.1 christos }
4828 1.1 christos
4829 1.1 christos /* subb. */
4830 1.1 christos void
4831 1.6 christos OP_38B_C (SIM_DESC sd, SIM_CPU *cpu)
4832 1.1 christos {
4833 1.10 christos uint8_t a = OP[0] & 0xFF;
4834 1.10 christos uint8_t b = (GPR (OP[1])) & 0xFF;
4835 1.10 christos uint16_t tmp = (~a + 1 + b) & 0xFF;
4836 1.1 christos trace_input ("subb", OP_CONSTANT16, OP_REG, OP_VOID);
4837 1.1 christos /* see ../common/sim-alu.h for a more extensive discussion on how to
4838 1.1 christos compute the carry/overflow bits. */
4839 1.1 christos SET_PSR_C (tmp > 0xff);
4840 1.1 christos SET_PSR_F (((a & 0x80) != (b & 0x80)) && ((b & 0x80) != (tmp & 0x80)));
4841 1.1 christos SET_GPR (OP[1], (tmp | ((GPR (OP[1])) & 0xff00)));
4842 1.6 christos trace_output_16 (sd, tmp);
4843 1.1 christos }
4844 1.1 christos
4845 1.1 christos /* subb. */
4846 1.1 christos void
4847 1.6 christos OP_39_8 (SIM_DESC sd, SIM_CPU *cpu)
4848 1.1 christos {
4849 1.10 christos uint8_t a = (GPR (OP[0])) & 0xFF;
4850 1.10 christos uint8_t b = (GPR (OP[1])) & 0xFF;
4851 1.10 christos uint16_t tmp = (~a + 1 + b) & 0xff;
4852 1.1 christos trace_input ("subb", OP_REG, OP_REG, OP_VOID);
4853 1.1 christos /* see ../common/sim-alu.h for a more extensive discussion on how to
4854 1.1 christos compute the carry/overflow bits. */
4855 1.1 christos SET_PSR_C (tmp > 0xff);
4856 1.1 christos SET_PSR_F (((a & 0x80) != (b & 0x80)) && ((b & 0x80) != (tmp & 0x80)));
4857 1.1 christos SET_GPR (OP[1], (tmp | ((GPR (OP[1])) & 0xff00)));
4858 1.6 christos trace_output_16 (sd, tmp);
4859 1.1 christos }
4860 1.1 christos
4861 1.1 christos /* subw. */
4862 1.1 christos void
4863 1.6 christos OP_3A_8 (SIM_DESC sd, SIM_CPU *cpu)
4864 1.1 christos {
4865 1.10 christos uint16_t a = OP[0];
4866 1.10 christos uint16_t b = GPR (OP[1]);
4867 1.10 christos uint16_t tmp = (~a + 1 + b);
4868 1.1 christos trace_input ("subw", OP_CONSTANT4, OP_REG, OP_VOID);
4869 1.1 christos /* see ../common/sim-alu.h for a more extensive discussion on how to
4870 1.1 christos compute the carry/overflow bits. */
4871 1.1 christos SET_PSR_C (tmp > 0xffff);
4872 1.1 christos SET_PSR_F (((a & 0x8000) != (b & 0x8000)) && ((b & 0x8000) != (tmp & 0x8000)));
4873 1.1 christos SET_GPR (OP[1], tmp);
4874 1.6 christos trace_output_16 (sd, tmp);
4875 1.1 christos }
4876 1.1 christos
4877 1.1 christos /* subw. */
4878 1.1 christos void
4879 1.6 christos OP_3AB_C (SIM_DESC sd, SIM_CPU *cpu)
4880 1.1 christos {
4881 1.10 christos uint16_t a = OP[0];
4882 1.10 christos uint16_t b = GPR (OP[1]);
4883 1.10 christos uint32_t tmp = (~a + 1 + b);
4884 1.1 christos trace_input ("subw", OP_CONSTANT16, OP_REG, OP_VOID);
4885 1.1 christos /* see ../common/sim-alu.h for a more extensive discussion on how to
4886 1.1 christos compute the carry/overflow bits. */
4887 1.1 christos SET_PSR_C (tmp > 0xffff);
4888 1.1 christos SET_PSR_F (((a & 0x8000) != (b & 0x8000)) && ((b & 0x8000) != (tmp & 0x8000)));
4889 1.1 christos SET_GPR (OP[1], tmp & 0xffff);
4890 1.6 christos trace_output_16 (sd, tmp);
4891 1.1 christos }
4892 1.1 christos
4893 1.1 christos /* subw. */
4894 1.1 christos void
4895 1.6 christos OP_3B_8 (SIM_DESC sd, SIM_CPU *cpu)
4896 1.1 christos {
4897 1.10 christos uint16_t a = GPR (OP[0]);
4898 1.10 christos uint16_t b = GPR (OP[1]);
4899 1.10 christos uint32_t tmp = (~a + 1 + b);
4900 1.1 christos trace_input ("subw", OP_REG, OP_REG, OP_VOID);
4901 1.1 christos /* see ../common/sim-alu.h for a more extensive discussion on how to
4902 1.1 christos compute the carry/overflow bits. */
4903 1.1 christos SET_PSR_C (tmp > 0xffff);
4904 1.1 christos SET_PSR_F (((a & 0x8000) != (b & 0x8000)) && ((b & 0x8000) != (tmp & 0x8000)));
4905 1.1 christos SET_GPR (OP[1], tmp & 0xffff);
4906 1.6 christos trace_output_16 (sd, tmp);
4907 1.1 christos }
4908 1.1 christos
4909 1.1 christos /* subcb. */
4910 1.1 christos void
4911 1.6 christos OP_3C_8 (SIM_DESC sd, SIM_CPU *cpu)
4912 1.1 christos {
4913 1.10 christos uint8_t a = OP[0];
4914 1.10 christos uint8_t b = (GPR (OP[1])) & 0xff;
4915 1.10 christos //uint16_t tmp1 = a + 1;
4916 1.10 christos uint16_t tmp1 = a + (PSR_C);
4917 1.10 christos uint16_t tmp = (~tmp1 + 1 + b);
4918 1.1 christos trace_input ("subcb", OP_CONSTANT4, OP_REG, OP_VOID);
4919 1.1 christos /* see ../common/sim-alu.h for a more extensive discussion on how to
4920 1.1 christos compute the carry/overflow bits. */
4921 1.1 christos SET_PSR_C (tmp > 0xff);
4922 1.1 christos SET_PSR_F (((a & 0x80) != (b & 0x80)) && ((b & 0x80) != (tmp & 0x80)));
4923 1.1 christos SET_GPR (OP[1], tmp);
4924 1.6 christos trace_output_16 (sd, tmp);
4925 1.1 christos }
4926 1.1 christos
4927 1.1 christos /* subcb. */
4928 1.1 christos void
4929 1.6 christos OP_3CB_C (SIM_DESC sd, SIM_CPU *cpu)
4930 1.1 christos {
4931 1.10 christos uint16_t a = OP[0];
4932 1.10 christos uint16_t b = (GPR (OP[1])) & 0xff;
4933 1.10 christos //uint16_t tmp1 = a + 1;
4934 1.10 christos uint16_t tmp1 = a + (PSR_C);
4935 1.10 christos uint16_t tmp = (~tmp1 + 1 + b);
4936 1.1 christos trace_input ("subcb", OP_CONSTANT16, OP_REG, OP_VOID);
4937 1.1 christos /* see ../common/sim-alu.h for a more extensive discussion on how to
4938 1.1 christos compute the carry/overflow bits. */
4939 1.1 christos SET_PSR_C (tmp > 0xff);
4940 1.1 christos SET_PSR_F (((a & 0x80) != (b & 0x80)) && ((b & 0x80) != (tmp & 0x80)));
4941 1.1 christos SET_GPR (OP[1], tmp);
4942 1.6 christos trace_output_16 (sd, tmp);
4943 1.1 christos }
4944 1.1 christos
4945 1.1 christos /* subcb. */
4946 1.1 christos void
4947 1.6 christos OP_3D_8 (SIM_DESC sd, SIM_CPU *cpu)
4948 1.1 christos {
4949 1.10 christos uint16_t a = (GPR (OP[0])) & 0xff;
4950 1.10 christos uint16_t b = (GPR (OP[1])) & 0xff;
4951 1.10 christos uint16_t tmp1 = a + (PSR_C);
4952 1.10 christos uint16_t tmp = (~tmp1 + 1 + b);
4953 1.1 christos trace_input ("subcb", OP_REG, OP_REG, OP_VOID);
4954 1.1 christos /* see ../common/sim-alu.h for a more extensive discussion on how to
4955 1.1 christos compute the carry/overflow bits. */
4956 1.1 christos SET_PSR_C (tmp > 0xff);
4957 1.1 christos SET_PSR_F (((a & 0x80) != (b & 0x80)) && ((b & 0x80) != (tmp & 0x80)));
4958 1.1 christos SET_GPR (OP[1], tmp);
4959 1.6 christos trace_output_16 (sd, tmp);
4960 1.1 christos }
4961 1.1 christos
4962 1.1 christos /* subcw. */
4963 1.1 christos void
4964 1.6 christos OP_3E_8 (SIM_DESC sd, SIM_CPU *cpu)
4965 1.1 christos {
4966 1.10 christos uint16_t a = OP[0], b = (GPR (OP[1]));
4967 1.10 christos uint16_t tmp1 = a + (PSR_C);
4968 1.10 christos uint16_t tmp = (~tmp1 + 1 + b);
4969 1.1 christos trace_input ("subcw", OP_CONSTANT4, OP_REG, OP_VOID);
4970 1.1 christos /* see ../common/sim-alu.h for a more extensive discussion on how to
4971 1.1 christos compute the carry/overflow bits. */
4972 1.1 christos SET_PSR_C (tmp > 0xffff);
4973 1.1 christos SET_PSR_F (((a & 0x8000) != (b & 0x8000)) && ((b & 0x8000) != (tmp & 0x8000)));
4974 1.1 christos SET_GPR (OP[1], tmp);
4975 1.6 christos trace_output_16 (sd, tmp);
4976 1.1 christos }
4977 1.1 christos
4978 1.1 christos /* subcw. */
4979 1.1 christos void
4980 1.6 christos OP_3EB_C (SIM_DESC sd, SIM_CPU *cpu)
4981 1.1 christos {
4982 1.10 christos int16_t a = OP[0];
4983 1.10 christos uint16_t b = GPR (OP[1]);
4984 1.10 christos uint16_t tmp1 = a + (PSR_C);
4985 1.10 christos uint16_t tmp = (~tmp1 + 1 + b);
4986 1.1 christos trace_input ("subcw", OP_CONSTANT16, OP_REG, OP_VOID);
4987 1.1 christos /* see ../common/sim-alu.h for a more extensive discussion on how to
4988 1.1 christos compute the carry/overflow bits. */
4989 1.1 christos SET_PSR_C (tmp > 0xffff);
4990 1.1 christos SET_PSR_F (((a & 0x8000) != (b & 0x8000)) && ((b & 0x8000) != (tmp & 0x8000)));
4991 1.1 christos SET_GPR (OP[1], tmp);
4992 1.6 christos trace_output_16 (sd, tmp);
4993 1.1 christos }
4994 1.1 christos
4995 1.1 christos /* subcw. */
4996 1.1 christos void
4997 1.6 christos OP_3F_8 (SIM_DESC sd, SIM_CPU *cpu)
4998 1.1 christos {
4999 1.10 christos uint16_t a = (GPR (OP[0])), b = (GPR (OP[1]));
5000 1.10 christos uint16_t tmp1 = a + (PSR_C);
5001 1.10 christos uint16_t tmp = (~tmp1 + 1 + b);
5002 1.1 christos trace_input ("subcw", OP_REG, OP_REG, OP_VOID);
5003 1.1 christos /* see ../common/sim-alu.h for a more extensive discussion on how to
5004 1.1 christos compute the carry/overflow bits. */
5005 1.1 christos SET_PSR_C (tmp > 0xffff);
5006 1.1 christos SET_PSR_F (((a & 0x8000) != (b & 0x8000)) && ((b & 0x8000) != (tmp & 0x8000)));
5007 1.1 christos SET_GPR (OP[1], tmp);
5008 1.6 christos trace_output_16 (sd, tmp);
5009 1.1 christos }
5010 1.1 christos
5011 1.1 christos /* subd. */
5012 1.1 christos void
5013 1.6 christos OP_3_C (SIM_DESC sd, SIM_CPU *cpu)
5014 1.1 christos {
5015 1.10 christos int32_t a = OP[0];
5016 1.10 christos uint32_t b = GPR32 (OP[1]);
5017 1.10 christos uint32_t tmp = (~a + 1 + b);
5018 1.1 christos trace_input ("subd", OP_CONSTANT32, OP_REGP, OP_VOID);
5019 1.1 christos /* see ../common/sim-alu.h for a more extensive discussion on how to
5020 1.1 christos compute the carry/overflow bits. */
5021 1.1 christos SET_PSR_C (tmp > 0xffffffff);
5022 1.1 christos SET_PSR_F (((a & 0x80000000) != (b & 0x80000000)) &&
5023 1.1 christos ((b & 0x80000000) != (tmp & 0x80000000)));
5024 1.1 christos SET_GPR32 (OP[1], tmp);
5025 1.6 christos trace_output_32 (sd, tmp);
5026 1.1 christos }
5027 1.1 christos
5028 1.1 christos /* subd. */
5029 1.1 christos void
5030 1.6 christos OP_14C_14 (SIM_DESC sd, SIM_CPU *cpu)
5031 1.1 christos {
5032 1.10 christos uint32_t a = GPR32 (OP[0]);
5033 1.10 christos uint32_t b = GPR32 (OP[1]);
5034 1.10 christos uint32_t tmp = (~a + 1 + b);
5035 1.1 christos trace_input ("subd", OP_REGP, OP_REGP, OP_VOID);
5036 1.1 christos /* see ../common/sim-alu.h for a more extensive discussion on how to
5037 1.1 christos compute the carry/overflow bits. */
5038 1.1 christos SET_PSR_C (tmp > 0xffffffff);
5039 1.1 christos SET_PSR_F (((a & 0x80000000) != (b & 0x80000000)) &&
5040 1.1 christos ((b & 0x80000000) != (tmp & 0x80000000)));
5041 1.1 christos SET_GPR32 (OP[1], tmp);
5042 1.6 christos trace_output_32 (sd, tmp);
5043 1.1 christos }
5044 1.1 christos
5045 1.1 christos /* excp. */
5046 1.1 christos void
5047 1.6 christos OP_C_C (SIM_DESC sd, SIM_CPU *cpu)
5048 1.1 christos {
5049 1.6 christos host_callback *cb = STATE_CALLBACK (sd);
5050 1.10 christos uint32_t tmp;
5051 1.10 christos uint16_t a;
5052 1.1 christos trace_input ("excp", OP_CONSTANT4, OP_VOID, OP_VOID);
5053 1.1 christos switch (OP[0])
5054 1.1 christos {
5055 1.1 christos default:
5056 1.1 christos #if (DEBUG & DEBUG_TRAP) == 0
5057 1.1 christos {
5058 1.1 christos #if 0
5059 1.10 christos uint16_t vec = OP[0] + TRAP_VECTOR_START;
5060 1.1 christos SET_BPC (PC + 1);
5061 1.1 christos SET_BPSR (PSR);
5062 1.1 christos SET_PSR (PSR & PSR_SM_BIT);
5063 1.1 christos JMP (vec);
5064 1.1 christos break;
5065 1.1 christos #endif
5066 1.1 christos }
5067 1.1 christos #else /* if debugging use trap to print registers */
5068 1.1 christos {
5069 1.1 christos int i;
5070 1.1 christos static int first_time = 1;
5071 1.1 christos
5072 1.1 christos if (first_time)
5073 1.1 christos {
5074 1.1 christos first_time = 0;
5075 1.6 christos sim_io_printf (sd, "Trap # PC ");
5076 1.1 christos for (i = 0; i < 16; i++)
5077 1.6 christos sim_io_printf (sd, " %sr%d", (i > 9) ? "" : " ", i);
5078 1.6 christos sim_io_printf (sd, " a0 a1 f0 f1 c\n");
5079 1.1 christos }
5080 1.1 christos
5081 1.6 christos sim_io_printf (sd, "Trap %2d 0x%.4x:", (int)OP[0], (int)PC);
5082 1.1 christos
5083 1.1 christos for (i = 0; i < 16; i++)
5084 1.6 christos sim_io_printf (sd, " %.4x", (int) GPR (i));
5085 1.1 christos
5086 1.1 christos for (i = 0; i < 2; i++)
5087 1.6 christos sim_io_printf (sd, " %.2x%.8lx",
5088 1.1 christos ((int)(ACC (i) >> 32) & 0xff),
5089 1.1 christos ((unsigned long) ACC (i)) & 0xffffffff);
5090 1.1 christos
5091 1.6 christos sim_io_printf (sd, " %d %d %d\n",
5092 1.1 christos PSR_F != 0, PSR_F != 0, PSR_C != 0);
5093 1.6 christos sim_io_flush_stdout (sd);
5094 1.1 christos break;
5095 1.1 christos }
5096 1.1 christos #endif
5097 1.1 christos case 8: /* new system call trap */
5098 1.1 christos /* Trap 8 is used for simulating low-level I/O */
5099 1.1 christos {
5100 1.10 christos uint32_t result = 0;
5101 1.1 christos errno = 0;
5102 1.1 christos
5103 1.1 christos /* Registers passed to trap 0. */
5104 1.1 christos
5105 1.1 christos #define FUNC GPR (0) /* function number. */
5106 1.1 christos #define PARM1 GPR (2) /* optional parm 1. */
5107 1.1 christos #define PARM2 GPR (3) /* optional parm 2. */
5108 1.1 christos #define PARM3 GPR (4) /* optional parm 3. */
5109 1.1 christos #define PARM4 GPR (5) /* optional parm 4. */
5110 1.1 christos
5111 1.1 christos /* Registers set by trap 0 */
5112 1.1 christos
5113 1.1 christos #define RETVAL(X) do { result = (0xffff & (X));SET_GPR (0, result);} while (0)
5114 1.1 christos #define RETVAL32(X) do { result = (X); SET_GPR32 (0, result);} while (0)
5115 1.1 christos #define RETERR(X) SET_GPR (4, (X)) /* return error code. */
5116 1.1 christos
5117 1.1 christos /* Turn a pointer in a register into a pointer into real memory. */
5118 1.1 christos
5119 1.6 christos #define MEMPTR(x) sim_core_trans_addr (sd, cpu, read_map, x)
5120 1.1 christos
5121 1.1 christos switch (FUNC)
5122 1.1 christos {
5123 1.1 christos #if !defined(__GO32__) && !defined(_WIN32)
5124 1.10 christos case TARGET_NEWLIB_CR16_SYS_fork:
5125 1.1 christos trace_input ("<fork>", OP_VOID, OP_VOID, OP_VOID);
5126 1.1 christos RETVAL (fork ());
5127 1.6 christos trace_output_16 (sd, result);
5128 1.1 christos break;
5129 1.1 christos
5130 1.1 christos #define getpid() 47
5131 1.10 christos case TARGET_NEWLIB_CR16_SYS_getpid:
5132 1.1 christos trace_input ("<getpid>", OP_VOID, OP_VOID, OP_VOID);
5133 1.1 christos RETVAL (getpid ());
5134 1.6 christos trace_output_16 (sd, result);
5135 1.1 christos break;
5136 1.1 christos
5137 1.10 christos case TARGET_NEWLIB_CR16_SYS_kill:
5138 1.1 christos trace_input ("<kill>", OP_REG, OP_REG, OP_VOID);
5139 1.1 christos if (PARM1 == getpid ())
5140 1.1 christos {
5141 1.6 christos trace_output_void (sd);
5142 1.6 christos EXCEPTION (PARM2);
5143 1.1 christos }
5144 1.1 christos else
5145 1.1 christos {
5146 1.1 christos int os_sig = -1;
5147 1.1 christos switch (PARM2)
5148 1.1 christos {
5149 1.1 christos #ifdef SIGHUP
5150 1.1 christos case 1: os_sig = SIGHUP; break;
5151 1.1 christos #endif
5152 1.1 christos #ifdef SIGINT
5153 1.1 christos case 2: os_sig = SIGINT; break;
5154 1.1 christos #endif
5155 1.1 christos #ifdef SIGQUIT
5156 1.1 christos case 3: os_sig = SIGQUIT; break;
5157 1.1 christos #endif
5158 1.1 christos #ifdef SIGILL
5159 1.1 christos case 4: os_sig = SIGILL; break;
5160 1.1 christos #endif
5161 1.1 christos #ifdef SIGTRAP
5162 1.1 christos case 5: os_sig = SIGTRAP; break;
5163 1.1 christos #endif
5164 1.1 christos #ifdef SIGABRT
5165 1.1 christos case 6: os_sig = SIGABRT; break;
5166 1.1 christos #elif defined(SIGIOT)
5167 1.1 christos case 6: os_sig = SIGIOT; break;
5168 1.1 christos #endif
5169 1.1 christos #ifdef SIGEMT
5170 1.1 christos case 7: os_sig = SIGEMT; break;
5171 1.1 christos #endif
5172 1.1 christos #ifdef SIGFPE
5173 1.1 christos case 8: os_sig = SIGFPE; break;
5174 1.1 christos #endif
5175 1.1 christos #ifdef SIGKILL
5176 1.1 christos case 9: os_sig = SIGKILL; break;
5177 1.1 christos #endif
5178 1.1 christos #ifdef SIGBUS
5179 1.1 christos case 10: os_sig = SIGBUS; break;
5180 1.1 christos #endif
5181 1.1 christos #ifdef SIGSEGV
5182 1.1 christos case 11: os_sig = SIGSEGV; break;
5183 1.1 christos #endif
5184 1.1 christos #ifdef SIGSYS
5185 1.1 christos case 12: os_sig = SIGSYS; break;
5186 1.1 christos #endif
5187 1.1 christos #ifdef SIGPIPE
5188 1.1 christos case 13: os_sig = SIGPIPE; break;
5189 1.1 christos #endif
5190 1.1 christos #ifdef SIGALRM
5191 1.1 christos case 14: os_sig = SIGALRM; break;
5192 1.1 christos #endif
5193 1.1 christos #ifdef SIGTERM
5194 1.1 christos case 15: os_sig = SIGTERM; break;
5195 1.1 christos #endif
5196 1.1 christos #ifdef SIGURG
5197 1.1 christos case 16: os_sig = SIGURG; break;
5198 1.1 christos #endif
5199 1.1 christos #ifdef SIGSTOP
5200 1.1 christos case 17: os_sig = SIGSTOP; break;
5201 1.1 christos #endif
5202 1.1 christos #ifdef SIGTSTP
5203 1.1 christos case 18: os_sig = SIGTSTP; break;
5204 1.1 christos #endif
5205 1.1 christos #ifdef SIGCONT
5206 1.1 christos case 19: os_sig = SIGCONT; break;
5207 1.1 christos #endif
5208 1.1 christos #ifdef SIGCHLD
5209 1.1 christos case 20: os_sig = SIGCHLD; break;
5210 1.1 christos #elif defined(SIGCLD)
5211 1.1 christos case 20: os_sig = SIGCLD; break;
5212 1.1 christos #endif
5213 1.1 christos #ifdef SIGTTIN
5214 1.1 christos case 21: os_sig = SIGTTIN; break;
5215 1.1 christos #endif
5216 1.1 christos #ifdef SIGTTOU
5217 1.1 christos case 22: os_sig = SIGTTOU; break;
5218 1.1 christos #endif
5219 1.1 christos #ifdef SIGIO
5220 1.1 christos case 23: os_sig = SIGIO; break;
5221 1.1 christos #elif defined (SIGPOLL)
5222 1.1 christos case 23: os_sig = SIGPOLL; break;
5223 1.1 christos #endif
5224 1.1 christos #ifdef SIGXCPU
5225 1.1 christos case 24: os_sig = SIGXCPU; break;
5226 1.1 christos #endif
5227 1.1 christos #ifdef SIGXFSZ
5228 1.1 christos case 25: os_sig = SIGXFSZ; break;
5229 1.1 christos #endif
5230 1.1 christos #ifdef SIGVTALRM
5231 1.1 christos case 26: os_sig = SIGVTALRM; break;
5232 1.1 christos #endif
5233 1.1 christos #ifdef SIGPROF
5234 1.1 christos case 27: os_sig = SIGPROF; break;
5235 1.1 christos #endif
5236 1.1 christos #ifdef SIGWINCH
5237 1.1 christos case 28: os_sig = SIGWINCH; break;
5238 1.1 christos #endif
5239 1.1 christos #ifdef SIGLOST
5240 1.1 christos case 29: os_sig = SIGLOST; break;
5241 1.1 christos #endif
5242 1.1 christos #ifdef SIGUSR1
5243 1.1 christos case 30: os_sig = SIGUSR1; break;
5244 1.1 christos #endif
5245 1.1 christos #ifdef SIGUSR2
5246 1.1 christos case 31: os_sig = SIGUSR2; break;
5247 1.1 christos #endif
5248 1.1 christos }
5249 1.1 christos
5250 1.1 christos if (os_sig == -1)
5251 1.1 christos {
5252 1.6 christos trace_output_void (sd);
5253 1.6 christos sim_io_printf (sd, "Unknown signal %d\n", PARM2);
5254 1.6 christos sim_io_flush_stdout (sd);
5255 1.6 christos EXCEPTION (SIM_SIGILL);
5256 1.1 christos }
5257 1.1 christos else
5258 1.1 christos {
5259 1.1 christos RETVAL (kill (PARM1, PARM2));
5260 1.6 christos trace_output_16 (sd, result);
5261 1.1 christos }
5262 1.1 christos }
5263 1.1 christos break;
5264 1.1 christos
5265 1.10 christos case TARGET_NEWLIB_CR16_SYS_execve:
5266 1.1 christos trace_input ("<execve>", OP_VOID, OP_VOID, OP_VOID);
5267 1.1 christos RETVAL (execve (MEMPTR (PARM1), (char **) MEMPTR (PARM2<<16|PARM3),
5268 1.1 christos (char **)MEMPTR (PARM4)));
5269 1.6 christos trace_output_16 (sd, result);
5270 1.1 christos break;
5271 1.1 christos
5272 1.10 christos case TARGET_NEWLIB_CR16_SYS_execv:
5273 1.1 christos trace_input ("<execv>", OP_VOID, OP_VOID, OP_VOID);
5274 1.1 christos RETVAL (execve (MEMPTR (PARM1), (char **) MEMPTR (PARM2), NULL));
5275 1.6 christos trace_output_16 (sd, result);
5276 1.1 christos break;
5277 1.1 christos
5278 1.10 christos case TARGET_NEWLIB_CR16_SYS_pipe:
5279 1.1 christos {
5280 1.1 christos reg_t buf;
5281 1.1 christos int host_fd[2];
5282 1.1 christos
5283 1.1 christos trace_input ("<pipe>", OP_VOID, OP_VOID, OP_VOID);
5284 1.1 christos buf = PARM1;
5285 1.1 christos RETVAL (pipe (host_fd));
5286 1.1 christos SW (buf, host_fd[0]);
5287 1.10 christos buf += sizeof(uint16_t);
5288 1.1 christos SW (buf, host_fd[1]);
5289 1.6 christos trace_output_16 (sd, result);
5290 1.1 christos }
5291 1.1 christos break;
5292 1.1 christos
5293 1.10 christos case TARGET_NEWLIB_CR16_SYS_wait:
5294 1.1 christos {
5295 1.1 christos int status;
5296 1.1 christos trace_input ("<wait>", OP_REG, OP_VOID, OP_VOID);
5297 1.1 christos RETVAL (wait (&status));
5298 1.1 christos if (PARM1)
5299 1.1 christos SW (PARM1, status);
5300 1.6 christos trace_output_16 (sd, result);
5301 1.1 christos }
5302 1.1 christos break;
5303 1.1 christos #else
5304 1.10 christos case TARGET_NEWLIB_CR16_SYS_getpid:
5305 1.1 christos trace_input ("<getpid>", OP_VOID, OP_VOID, OP_VOID);
5306 1.1 christos RETVAL (1);
5307 1.6 christos trace_output_16 (sd, result);
5308 1.1 christos break;
5309 1.1 christos
5310 1.10 christos case TARGET_NEWLIB_CR16_SYS_kill:
5311 1.1 christos trace_input ("<kill>", OP_REG, OP_REG, OP_VOID);
5312 1.6 christos trace_output_void (sd);
5313 1.6 christos EXCEPTION (PARM2);
5314 1.1 christos break;
5315 1.1 christos #endif
5316 1.1 christos
5317 1.10 christos case TARGET_NEWLIB_CR16_SYS_read:
5318 1.1 christos trace_input ("<read>", OP_REG, OP_MEMREF, OP_REG);
5319 1.6 christos RETVAL (cb->read (cb, PARM1,
5320 1.6 christos MEMPTR (((unsigned long)PARM3 << 16)
5321 1.6 christos | ((unsigned long)PARM2)), PARM4));
5322 1.6 christos trace_output_16 (sd, result);
5323 1.1 christos break;
5324 1.1 christos
5325 1.10 christos case TARGET_NEWLIB_CR16_SYS_write:
5326 1.1 christos trace_input ("<write>", OP_REG, OP_MEMREF, OP_REG);
5327 1.6 christos RETVAL ((int)cb->write (cb, PARM1,
5328 1.6 christos MEMPTR (((unsigned long)PARM3 << 16)
5329 1.6 christos | PARM2), PARM4));
5330 1.6 christos trace_output_16 (sd, result);
5331 1.1 christos break;
5332 1.1 christos
5333 1.10 christos case TARGET_NEWLIB_CR16_SYS_lseek:
5334 1.1 christos trace_input ("<lseek>", OP_REG, OP_REGP, OP_REG);
5335 1.6 christos RETVAL32 (cb->lseek (cb, PARM1, ((((long) PARM3) << 16) | PARM2),
5336 1.6 christos PARM4));
5337 1.6 christos trace_output_32 (sd, result);
5338 1.1 christos break;
5339 1.1 christos
5340 1.10 christos case TARGET_NEWLIB_CR16_SYS_close:
5341 1.1 christos trace_input ("<close>", OP_REG, OP_VOID, OP_VOID);
5342 1.6 christos RETVAL (cb->close (cb, PARM1));
5343 1.6 christos trace_output_16 (sd, result);
5344 1.1 christos break;
5345 1.1 christos
5346 1.10 christos case TARGET_NEWLIB_CR16_SYS_open:
5347 1.1 christos trace_input ("<open>", OP_MEMREF, OP_REG, OP_VOID);
5348 1.6 christos RETVAL32 (cb->open (cb, MEMPTR ((((unsigned long)PARM2) << 16)
5349 1.6 christos | PARM1), PARM3));
5350 1.6 christos trace_output_32 (sd, result);
5351 1.1 christos break;
5352 1.1 christos
5353 1.10 christos case TARGET_NEWLIB_CR16_SYS_rename:
5354 1.1 christos trace_input ("<rename>", OP_MEMREF, OP_MEMREF, OP_VOID);
5355 1.6 christos RETVAL (cb->rename (cb, MEMPTR ((((unsigned long)PARM2) << 16) | PARM1),
5356 1.6 christos MEMPTR ((((unsigned long)PARM4) << 16) | PARM3)));
5357 1.6 christos trace_output_16 (sd, result);
5358 1.1 christos break;
5359 1.1 christos
5360 1.1 christos case 0x408: /* REVISIT: Added a dummy getenv call. */
5361 1.1 christos trace_input ("<getenv>", OP_MEMREF, OP_MEMREF, OP_VOID);
5362 1.5 christos RETVAL32 (0);
5363 1.6 christos trace_output_32 (sd, result);
5364 1.1 christos break;
5365 1.1 christos
5366 1.10 christos case TARGET_NEWLIB_CR16_SYS_exit:
5367 1.1 christos trace_input ("<exit>", OP_VOID, OP_VOID, OP_VOID);
5368 1.6 christos trace_output_void (sd);
5369 1.6 christos sim_engine_halt (sd, cpu, NULL, PC, sim_exited, GPR (2));
5370 1.1 christos break;
5371 1.1 christos
5372 1.10 christos case TARGET_NEWLIB_CR16_SYS_unlink:
5373 1.1 christos trace_input ("<unlink>", OP_MEMREF, OP_VOID, OP_VOID);
5374 1.6 christos RETVAL (cb->unlink (cb, MEMPTR (((unsigned long)PARM2 << 16) | PARM1)));
5375 1.6 christos trace_output_16 (sd, result);
5376 1.1 christos break;
5377 1.1 christos
5378 1.10 christos case TARGET_NEWLIB_CR16_SYS_stat:
5379 1.1 christos trace_input ("<stat>", OP_VOID, OP_VOID, OP_VOID);
5380 1.1 christos /* stat system call. */
5381 1.1 christos {
5382 1.1 christos struct stat host_stat;
5383 1.1 christos reg_t buf;
5384 1.1 christos
5385 1.1 christos RETVAL (stat (MEMPTR ((((unsigned long)PARM2) << 16)|PARM1), &host_stat));
5386 1.1 christos
5387 1.1 christos buf = PARM2;
5388 1.1 christos
5389 1.1 christos /* The hard-coded offsets and sizes were determined by using
5390 1.1 christos * the CR16 compiler on a test program that used struct stat.
5391 1.1 christos */
5392 1.1 christos SW (buf, host_stat.st_dev);
5393 1.1 christos SW (buf+2, host_stat.st_ino);
5394 1.1 christos SW (buf+4, host_stat.st_mode);
5395 1.1 christos SW (buf+6, host_stat.st_nlink);
5396 1.1 christos SW (buf+8, host_stat.st_uid);
5397 1.1 christos SW (buf+10, host_stat.st_gid);
5398 1.1 christos SW (buf+12, host_stat.st_rdev);
5399 1.1 christos SLW (buf+16, host_stat.st_size);
5400 1.1 christos SLW (buf+20, host_stat.st_atime);
5401 1.1 christos SLW (buf+28, host_stat.st_mtime);
5402 1.1 christos SLW (buf+36, host_stat.st_ctime);
5403 1.1 christos }
5404 1.6 christos trace_output_16 (sd, result);
5405 1.1 christos break;
5406 1.1 christos
5407 1.10 christos case TARGET_NEWLIB_CR16_SYS_chown:
5408 1.1 christos trace_input ("<chown>", OP_VOID, OP_VOID, OP_VOID);
5409 1.1 christos RETVAL (chown (MEMPTR (PARM1), PARM2, PARM3));
5410 1.6 christos trace_output_16 (sd, result);
5411 1.1 christos break;
5412 1.1 christos
5413 1.10 christos case TARGET_NEWLIB_CR16_SYS_chmod:
5414 1.1 christos trace_input ("<chmod>", OP_VOID, OP_VOID, OP_VOID);
5415 1.1 christos RETVAL (chmod (MEMPTR (PARM1), PARM2));
5416 1.6 christos trace_output_16 (sd, result);
5417 1.1 christos break;
5418 1.1 christos
5419 1.10 christos case TARGET_NEWLIB_CR16_SYS_utime:
5420 1.1 christos trace_input ("<utime>", OP_REG, OP_REG, OP_REG);
5421 1.1 christos /* Cast the second argument to void *, to avoid type mismatch
5422 1.1 christos if a prototype is present. */
5423 1.1 christos RETVAL (utime (MEMPTR (PARM1), (void *) MEMPTR (PARM2)));
5424 1.6 christos trace_output_16 (sd, result);
5425 1.1 christos break;
5426 1.1 christos
5427 1.10 christos case TARGET_NEWLIB_CR16_SYS_time:
5428 1.1 christos trace_input ("<time>", OP_VOID, OP_VOID, OP_REG);
5429 1.1 christos RETVAL32 (time (NULL));
5430 1.6 christos trace_output_32 (sd, result);
5431 1.1 christos break;
5432 1.10 christos
5433 1.1 christos default:
5434 1.1 christos a = OP[0];
5435 1.1 christos switch (a)
5436 1.1 christos {
5437 1.1 christos case TRAP_BREAKPOINT:
5438 1.1 christos tmp = (PC);
5439 1.1 christos JMP(tmp);
5440 1.6 christos trace_output_void (sd);
5441 1.6 christos EXCEPTION (SIM_SIGTRAP);
5442 1.1 christos break;
5443 1.1 christos case SIGTRAP: /* supervisor call ? */
5444 1.6 christos trace_output_void (sd);
5445 1.6 christos sim_engine_halt (sd, cpu, NULL, PC, sim_exited, GPR (2));
5446 1.1 christos break;
5447 1.1 christos default:
5448 1.6 christos cb->error (cb, "Unknown syscall %d", FUNC);
5449 1.1 christos break;
5450 1.1 christos }
5451 1.1 christos }
5452 1.10 christos if ((uint16_t) result == (uint16_t) -1)
5453 1.6 christos RETERR (cb->get_errno (cb));
5454 1.1 christos else
5455 1.1 christos RETERR (0);
5456 1.1 christos break;
5457 1.1 christos }
5458 1.1 christos }
5459 1.1 christos }
5460 1.1 christos
5461 1.1 christos
5462 1.1 christos /* push. */
5463 1.1 christos void
5464 1.6 christos OP_3_9 (SIM_DESC sd, SIM_CPU *cpu)
5465 1.1 christos {
5466 1.10 christos uint16_t a = OP[0] + 1, b = OP[1], c = OP[2], i = 0;
5467 1.10 christos uint32_t tmp, sp_addr = (GPR32 (15)) - (a * 2) - 4, is_regp = 0;
5468 1.1 christos trace_input ("push", OP_CONSTANT3, OP_REG, OP_REG);
5469 1.1 christos
5470 1.1 christos for (; i < a; ++i)
5471 1.1 christos {
5472 1.1 christos if ((b+i) <= 11)
5473 1.1 christos {
5474 1.1 christos SW (sp_addr, (GPR (b+i)));
5475 1.1 christos sp_addr +=2;
5476 1.1 christos }
5477 1.1 christos else
5478 1.1 christos {
5479 1.1 christos if (is_regp == 0)
5480 1.1 christos tmp = (GPR32 (b+i));
5481 1.1 christos else
5482 1.1 christos tmp = (GPR32 (b+i-1));
5483 1.1 christos
5484 1.1 christos if ((a-i) > 1)
5485 1.1 christos {
5486 1.1 christos SLW (sp_addr, tmp);
5487 1.1 christos sp_addr +=4;
5488 1.1 christos }
5489 1.1 christos else
5490 1.1 christos {
5491 1.1 christos SW (sp_addr, tmp);
5492 1.1 christos sp_addr +=2;
5493 1.1 christos }
5494 1.1 christos ++i;
5495 1.1 christos is_regp = 1;
5496 1.1 christos }
5497 1.1 christos }
5498 1.1 christos
5499 1.1 christos sp_addr +=4;
5500 1.1 christos
5501 1.1 christos /* Store RA address. */
5502 1.1 christos tmp = (GPR32 (14));
5503 1.1 christos SLW(sp_addr,tmp);
5504 1.1 christos
5505 1.1 christos sp_addr = (GPR32 (15)) - (a * 2) - 4;
5506 1.1 christos SET_GPR32 (15, sp_addr); /* Update SP address. */
5507 1.1 christos
5508 1.6 christos trace_output_void (sd);
5509 1.1 christos }
5510 1.1 christos
5511 1.1 christos /* push. */
5512 1.1 christos void
5513 1.6 christos OP_1_8 (SIM_DESC sd, SIM_CPU *cpu)
5514 1.1 christos {
5515 1.10 christos uint32_t sp_addr, tmp, is_regp = 0;
5516 1.10 christos uint16_t a = OP[0] + 1, b = OP[1], c = OP[2], i = 0;
5517 1.1 christos trace_input ("push", OP_CONSTANT3, OP_REG, OP_VOID);
5518 1.1 christos
5519 1.1 christos if (c == 1)
5520 1.1 christos sp_addr = (GPR32 (15)) - (a * 2) - 4;
5521 1.1 christos else
5522 1.1 christos sp_addr = (GPR32 (15)) - (a * 2);
5523 1.1 christos
5524 1.1 christos for (; i < a; ++i)
5525 1.1 christos {
5526 1.1 christos if ((b+i) <= 11)
5527 1.1 christos {
5528 1.1 christos SW (sp_addr, (GPR (b+i)));
5529 1.1 christos sp_addr +=2;
5530 1.1 christos }
5531 1.1 christos else
5532 1.1 christos {
5533 1.1 christos if (is_regp == 0)
5534 1.1 christos tmp = (GPR32 (b+i));
5535 1.1 christos else
5536 1.1 christos tmp = (GPR32 (b+i-1));
5537 1.1 christos
5538 1.1 christos if ((a-i) > 1)
5539 1.1 christos {
5540 1.1 christos SLW (sp_addr, tmp);
5541 1.1 christos sp_addr +=4;
5542 1.1 christos }
5543 1.1 christos else
5544 1.1 christos {
5545 1.1 christos SW (sp_addr, tmp);
5546 1.1 christos sp_addr +=2;
5547 1.1 christos }
5548 1.1 christos ++i;
5549 1.1 christos is_regp = 1;
5550 1.1 christos }
5551 1.1 christos }
5552 1.1 christos
5553 1.1 christos if (c == 1)
5554 1.1 christos {
5555 1.1 christos /* Store RA address. */
5556 1.1 christos tmp = (GPR32 (14));
5557 1.1 christos SLW(sp_addr,tmp);
5558 1.1 christos sp_addr = (GPR32 (15)) - (a * 2) - 4;
5559 1.1 christos }
5560 1.1 christos else
5561 1.1 christos sp_addr = (GPR32 (15)) - (a * 2);
5562 1.1 christos
5563 1.1 christos SET_GPR32 (15, sp_addr); /* Update SP address. */
5564 1.1 christos
5565 1.6 christos trace_output_void (sd);
5566 1.1 christos }
5567 1.1 christos
5568 1.1 christos
5569 1.1 christos /* push. */
5570 1.1 christos void
5571 1.6 christos OP_11E_10 (SIM_DESC sd, SIM_CPU *cpu)
5572 1.1 christos {
5573 1.10 christos uint32_t sp_addr = (GPR32 (15)), tmp;
5574 1.1 christos trace_input ("push", OP_VOID, OP_VOID, OP_VOID);
5575 1.1 christos tmp = (GPR32 (14));
5576 1.1 christos SLW(sp_addr-4,tmp); /* Store RA address. */
5577 1.1 christos SET_GPR32 (15, (sp_addr - 4)); /* Update SP address. */
5578 1.6 christos trace_output_void (sd);
5579 1.1 christos }
5580 1.1 christos
5581 1.1 christos
5582 1.1 christos /* pop. */
5583 1.1 christos void
5584 1.6 christos OP_5_9 (SIM_DESC sd, SIM_CPU *cpu)
5585 1.1 christos {
5586 1.10 christos uint16_t a = OP[0] + 1, b = OP[1], c = OP[2], i = 0;
5587 1.10 christos uint32_t tmp, sp_addr = (GPR32 (15)), is_regp = 0;;
5588 1.1 christos trace_input ("pop", OP_CONSTANT3, OP_REG, OP_REG);
5589 1.1 christos
5590 1.1 christos for (; i < a; ++i)
5591 1.1 christos {
5592 1.1 christos if ((b+i) <= 11)
5593 1.1 christos {
5594 1.1 christos SET_GPR ((b+i), RW(sp_addr));
5595 1.1 christos sp_addr +=2;
5596 1.1 christos }
5597 1.1 christos else
5598 1.1 christos {
5599 1.1 christos if ((a-i) > 1)
5600 1.1 christos {
5601 1.1 christos tmp = RLW(sp_addr);
5602 1.1 christos sp_addr +=4;
5603 1.1 christos }
5604 1.1 christos else
5605 1.1 christos {
5606 1.1 christos tmp = RW(sp_addr);
5607 1.1 christos sp_addr +=2;
5608 1.1 christos
5609 1.1 christos if (is_regp == 0)
5610 1.1 christos tmp = (tmp << 16) | (GPR32 (b+i));
5611 1.1 christos else
5612 1.1 christos tmp = (tmp << 16) | (GPR32 (b+i-1));
5613 1.1 christos }
5614 1.1 christos
5615 1.1 christos if (is_regp == 0)
5616 1.1 christos SET_GPR32 ((b+i), (((tmp & 0xffff) << 16)
5617 1.1 christos | ((tmp >> 16) & 0xffff)));
5618 1.1 christos else
5619 1.1 christos SET_GPR32 ((b+i-1), (((tmp & 0xffff) << 16)
5620 1.1 christos | ((tmp >> 16) & 0xffff)));
5621 1.1 christos
5622 1.1 christos ++i;
5623 1.1 christos is_regp = 1;
5624 1.1 christos }
5625 1.1 christos }
5626 1.1 christos
5627 1.1 christos tmp = RLW(sp_addr); /* store RA also. */
5628 1.1 christos SET_GPR32 (14, (((tmp & 0xffff) << 16)| ((tmp >> 16) & 0xffff)));
5629 1.1 christos
5630 1.1 christos SET_GPR32 (15, (sp_addr + 4)); /* Update SP address. */
5631 1.1 christos
5632 1.6 christos trace_output_void (sd);
5633 1.1 christos }
5634 1.1 christos
5635 1.1 christos /* pop. */
5636 1.1 christos void
5637 1.6 christos OP_2_8 (SIM_DESC sd, SIM_CPU *cpu)
5638 1.1 christos {
5639 1.10 christos uint16_t a = OP[0] + 1, b = OP[1], c = OP[2], i = 0;
5640 1.10 christos uint32_t tmp, sp_addr = (GPR32 (15)), is_regp = 0;
5641 1.1 christos trace_input ("pop", OP_CONSTANT3, OP_REG, OP_VOID);
5642 1.1 christos
5643 1.1 christos for (; i < a; ++i)
5644 1.1 christos {
5645 1.1 christos if ((b+i) <= 11)
5646 1.1 christos {
5647 1.1 christos SET_GPR ((b+i), RW(sp_addr));
5648 1.1 christos sp_addr +=2;
5649 1.1 christos }
5650 1.1 christos else
5651 1.1 christos {
5652 1.1 christos if ((a-i) > 1)
5653 1.1 christos {
5654 1.1 christos tmp = RLW(sp_addr);
5655 1.1 christos sp_addr +=4;
5656 1.1 christos }
5657 1.1 christos else
5658 1.1 christos {
5659 1.1 christos tmp = RW(sp_addr);
5660 1.1 christos sp_addr +=2;
5661 1.1 christos
5662 1.1 christos if (is_regp == 0)
5663 1.1 christos tmp = ((tmp << 16) & 0xffffffff) | (GPR32 (b+i));
5664 1.1 christos else
5665 1.1 christos tmp = ((tmp << 16) & 0xffffffff) | (GPR32 (b+i-1));
5666 1.1 christos }
5667 1.1 christos
5668 1.1 christos if (is_regp == 0)
5669 1.1 christos SET_GPR32 ((b+i), (((tmp & 0xffff) << 16)| ((tmp >> 16) & 0xffff)));
5670 1.1 christos else
5671 1.1 christos SET_GPR32 ((b+i-1), (((tmp & 0xffff) << 16)| ((tmp >> 16) & 0xffff)));
5672 1.1 christos ++i;
5673 1.1 christos is_regp = 1;
5674 1.1 christos }
5675 1.1 christos }
5676 1.1 christos
5677 1.1 christos if (c == 1)
5678 1.1 christos {
5679 1.1 christos tmp = RLW(sp_addr); /* Store RA Reg. */
5680 1.1 christos SET_GPR32 (14, (((tmp & 0xffff) << 16)| ((tmp >> 16) & 0xffff)));
5681 1.1 christos sp_addr +=4;
5682 1.1 christos }
5683 1.1 christos
5684 1.1 christos SET_GPR32 (15, sp_addr); /* Update SP address. */
5685 1.1 christos
5686 1.6 christos trace_output_void (sd);
5687 1.1 christos }
5688 1.1 christos
5689 1.1 christos /* pop. */
5690 1.1 christos void
5691 1.6 christos OP_21E_10 (SIM_DESC sd, SIM_CPU *cpu)
5692 1.1 christos {
5693 1.10 christos uint32_t sp_addr = GPR32 (15);
5694 1.10 christos uint32_t tmp;
5695 1.1 christos trace_input ("pop", OP_VOID, OP_VOID, OP_VOID);
5696 1.1 christos
5697 1.1 christos tmp = RLW(sp_addr);
5698 1.1 christos SET_GPR32 (14, (((tmp & 0xffff) << 16)| ((tmp >> 16) & 0xffff)));
5699 1.1 christos SET_GPR32 (15, (sp_addr+4)); /* Update SP address. */
5700 1.1 christos
5701 1.6 christos trace_output_void (sd);
5702 1.1 christos }
5703 1.1 christos
5704 1.1 christos /* popret. */
5705 1.1 christos void
5706 1.6 christos OP_7_9 (SIM_DESC sd, SIM_CPU *cpu)
5707 1.1 christos {
5708 1.10 christos uint16_t a = OP[0], b = OP[1];
5709 1.1 christos trace_input ("popret", OP_CONSTANT3, OP_REG, OP_REG);
5710 1.6 christos OP_5_9 (sd, cpu);
5711 1.1 christos JMP(((GPR32(14)) << 1) & 0xffffff);
5712 1.1 christos
5713 1.6 christos trace_output_void (sd);
5714 1.1 christos }
5715 1.1 christos
5716 1.1 christos /* popret. */
5717 1.1 christos void
5718 1.6 christos OP_3_8 (SIM_DESC sd, SIM_CPU *cpu)
5719 1.1 christos {
5720 1.10 christos uint16_t a = OP[0], b = OP[1];
5721 1.1 christos trace_input ("popret", OP_CONSTANT3, OP_REG, OP_VOID);
5722 1.6 christos OP_2_8 (sd, cpu);
5723 1.1 christos JMP(((GPR32(14)) << 1) & 0xffffff);
5724 1.1 christos
5725 1.6 christos trace_output_void (sd);
5726 1.1 christos }
5727 1.1 christos
5728 1.1 christos /* popret. */
5729 1.1 christos void
5730 1.6 christos OP_31E_10 (SIM_DESC sd, SIM_CPU *cpu)
5731 1.1 christos {
5732 1.10 christos uint32_t tmp;
5733 1.1 christos trace_input ("popret", OP_VOID, OP_VOID, OP_VOID);
5734 1.6 christos OP_21E_10 (sd, cpu);
5735 1.1 christos tmp = (((GPR32(14)) << 1) & 0xffffff);
5736 1.1 christos /* If the resulting PC value is less than 0x00_0000 or greater
5737 1.1 christos than 0xFF_FFFF, this instruction causes an IAD trap.*/
5738 1.1 christos
5739 1.1 christos if ((tmp < 0x0) || (tmp > 0xFFFFFF))
5740 1.1 christos {
5741 1.6 christos trace_output_void (sd);
5742 1.6 christos EXCEPTION (SIM_SIGBUS);
5743 1.1 christos }
5744 1.1 christos else
5745 1.1 christos JMP (tmp);
5746 1.1 christos
5747 1.6 christos trace_output_32 (sd, tmp);
5748 1.1 christos }
5749 1.1 christos
5750 1.1 christos
5751 1.1 christos /* cinv[i]. */
5752 1.1 christos void
5753 1.6 christos OP_A_10 (SIM_DESC sd, SIM_CPU *cpu)
5754 1.1 christos {
5755 1.1 christos trace_input ("cinv[i]", OP_VOID, OP_VOID, OP_VOID);
5756 1.1 christos SET_PSR_I (1);
5757 1.6 christos trace_output_void (sd);
5758 1.1 christos }
5759 1.1 christos
5760 1.1 christos /* cinv[i,u]. */
5761 1.1 christos void
5762 1.6 christos OP_B_10 (SIM_DESC sd, SIM_CPU *cpu)
5763 1.1 christos {
5764 1.1 christos trace_input ("cinv[i,u]", OP_VOID, OP_VOID, OP_VOID);
5765 1.1 christos SET_PSR_I (1);
5766 1.6 christos trace_output_void (sd);
5767 1.1 christos }
5768 1.1 christos
5769 1.1 christos /* cinv[d]. */
5770 1.1 christos void
5771 1.6 christos OP_C_10 (SIM_DESC sd, SIM_CPU *cpu)
5772 1.1 christos {
5773 1.1 christos trace_input ("cinv[d]", OP_VOID, OP_VOID, OP_VOID);
5774 1.1 christos SET_PSR_I (1);
5775 1.6 christos trace_output_void (sd);
5776 1.1 christos }
5777 1.1 christos
5778 1.1 christos /* cinv[d,u]. */
5779 1.1 christos void
5780 1.6 christos OP_D_10 (SIM_DESC sd, SIM_CPU *cpu)
5781 1.1 christos {
5782 1.1 christos trace_input ("cinv[i,u]", OP_VOID, OP_VOID, OP_VOID);
5783 1.1 christos SET_PSR_I (1);
5784 1.6 christos trace_output_void (sd);
5785 1.1 christos }
5786 1.1 christos
5787 1.1 christos /* cinv[d,i]. */
5788 1.1 christos void
5789 1.6 christos OP_E_10 (SIM_DESC sd, SIM_CPU *cpu)
5790 1.1 christos {
5791 1.1 christos trace_input ("cinv[d,i]", OP_VOID, OP_VOID, OP_VOID);
5792 1.1 christos SET_PSR_I (1);
5793 1.6 christos trace_output_void (sd);
5794 1.1 christos }
5795 1.1 christos
5796 1.1 christos /* cinv[d,i,u]. */
5797 1.1 christos void
5798 1.6 christos OP_F_10 (SIM_DESC sd, SIM_CPU *cpu)
5799 1.1 christos {
5800 1.1 christos trace_input ("cinv[d,i,u]", OP_VOID, OP_VOID, OP_VOID);
5801 1.1 christos SET_PSR_I (1);
5802 1.6 christos trace_output_void (sd);
5803 1.1 christos }
5804 1.1 christos
5805 1.1 christos /* retx. */
5806 1.1 christos void
5807 1.6 christos OP_3_10 (SIM_DESC sd, SIM_CPU *cpu)
5808 1.1 christos {
5809 1.1 christos trace_input ("retx", OP_VOID, OP_VOID, OP_VOID);
5810 1.1 christos SET_PSR_I (1);
5811 1.6 christos trace_output_void (sd);
5812 1.1 christos }
5813 1.1 christos
5814 1.1 christos /* di. */
5815 1.1 christos void
5816 1.6 christos OP_4_10 (SIM_DESC sd, SIM_CPU *cpu)
5817 1.1 christos {
5818 1.1 christos trace_input ("di", OP_VOID, OP_VOID, OP_VOID);
5819 1.1 christos SET_PSR_I (1);
5820 1.6 christos trace_output_void (sd);
5821 1.1 christos }
5822 1.1 christos
5823 1.1 christos /* ei. */
5824 1.1 christos void
5825 1.6 christos OP_5_10 (SIM_DESC sd, SIM_CPU *cpu)
5826 1.1 christos {
5827 1.1 christos trace_input ("ei", OP_VOID, OP_VOID, OP_VOID);
5828 1.1 christos SET_PSR_I (1);
5829 1.6 christos trace_output_void (sd);
5830 1.1 christos }
5831 1.1 christos
5832 1.1 christos /* wait. */
5833 1.1 christos void
5834 1.6 christos OP_6_10 (SIM_DESC sd, SIM_CPU *cpu)
5835 1.1 christos {
5836 1.1 christos trace_input ("wait", OP_VOID, OP_VOID, OP_VOID);
5837 1.6 christos trace_output_void (sd);
5838 1.6 christos EXCEPTION (SIM_SIGTRAP);
5839 1.1 christos }
5840 1.1 christos
5841 1.1 christos /* ewait. */
5842 1.1 christos void
5843 1.6 christos OP_7_10 (SIM_DESC sd, SIM_CPU *cpu)
5844 1.1 christos {
5845 1.1 christos trace_input ("ewait", OP_VOID, OP_VOID, OP_VOID);
5846 1.1 christos SET_PSR_I (1);
5847 1.6 christos trace_output_void (sd);
5848 1.1 christos }
5849 1.1 christos
5850 1.1 christos /* xorb. */
5851 1.1 christos void
5852 1.6 christos OP_28_8 (SIM_DESC sd, SIM_CPU *cpu)
5853 1.1 christos {
5854 1.10 christos uint8_t tmp, a = (OP[0]) & 0xff, b = (GPR (OP[1])) & 0xff;
5855 1.1 christos trace_input ("xorb", OP_CONSTANT4, OP_REG, OP_VOID);
5856 1.1 christos tmp = a ^ b;
5857 1.1 christos SET_GPR (OP[1], (tmp | ((GPR (OP[1])) & 0xff00)));
5858 1.6 christos trace_output_16 (sd, tmp);
5859 1.1 christos }
5860 1.1 christos
5861 1.1 christos /* xorb. */
5862 1.1 christos void
5863 1.6 christos OP_28B_C (SIM_DESC sd, SIM_CPU *cpu)
5864 1.1 christos {
5865 1.10 christos uint8_t tmp, a = (OP[0]) & 0xff, b = (GPR (OP[1])) & 0xff;
5866 1.1 christos trace_input ("xorb", OP_CONSTANT16, OP_REG, OP_VOID);
5867 1.1 christos tmp = a ^ b;
5868 1.1 christos SET_GPR (OP[1], (tmp | ((GPR (OP[1])) & 0xff00)));
5869 1.6 christos trace_output_16 (sd, tmp);
5870 1.1 christos }
5871 1.1 christos
5872 1.1 christos /* xorb. */
5873 1.1 christos void
5874 1.6 christos OP_29_8 (SIM_DESC sd, SIM_CPU *cpu)
5875 1.1 christos {
5876 1.10 christos uint8_t tmp, a = (GPR (OP[0])) & 0xff, b = (GPR (OP[1])) & 0xff;
5877 1.1 christos trace_input ("xorb", OP_REG, OP_REG, OP_VOID);
5878 1.1 christos tmp = a ^ b;
5879 1.1 christos SET_GPR (OP[1], (tmp | ((GPR (OP[1])) & 0xff00)));
5880 1.6 christos trace_output_16 (sd, tmp);
5881 1.1 christos }
5882 1.1 christos
5883 1.1 christos /* xorw. */
5884 1.1 christos void
5885 1.6 christos OP_2A_8 (SIM_DESC sd, SIM_CPU *cpu)
5886 1.1 christos {
5887 1.10 christos uint16_t tmp, a = (OP[0]), b = (GPR (OP[1]));
5888 1.1 christos trace_input ("xorw", OP_CONSTANT4, OP_REG, OP_VOID);
5889 1.1 christos tmp = a ^ b;
5890 1.1 christos SET_GPR (OP[1], tmp);
5891 1.6 christos trace_output_16 (sd, tmp);
5892 1.1 christos }
5893 1.1 christos
5894 1.1 christos /* xorw. */
5895 1.1 christos void
5896 1.6 christos OP_2AB_C (SIM_DESC sd, SIM_CPU *cpu)
5897 1.1 christos {
5898 1.10 christos uint16_t tmp, a = (OP[0]), b = (GPR (OP[1]));
5899 1.1 christos trace_input ("xorw", OP_CONSTANT16, OP_REG, OP_VOID);
5900 1.1 christos tmp = a ^ b;
5901 1.1 christos SET_GPR (OP[1], tmp);
5902 1.6 christos trace_output_16 (sd, tmp);
5903 1.1 christos }
5904 1.1 christos
5905 1.1 christos /* xorw. */
5906 1.1 christos void
5907 1.6 christos OP_2B_8 (SIM_DESC sd, SIM_CPU *cpu)
5908 1.1 christos {
5909 1.10 christos uint16_t tmp, a = (GPR (OP[0])), b = (GPR (OP[1]));
5910 1.1 christos trace_input ("xorw", OP_REG, OP_REG, OP_VOID);
5911 1.1 christos tmp = a ^ b;
5912 1.1 christos SET_GPR (OP[1], tmp);
5913 1.6 christos trace_output_16 (sd, tmp);
5914 1.1 christos }
5915 1.1 christos
5916 1.1 christos /*REVISIT FOR LPR/SPR . */
5917 1.1 christos
5918 1.1 christos /* lpr. */
5919 1.1 christos void
5920 1.6 christos OP_140_14 (SIM_DESC sd, SIM_CPU *cpu)
5921 1.1 christos {
5922 1.10 christos uint16_t a = GPR (OP[0]);
5923 1.1 christos trace_input ("lpr", OP_REG, OP_REG, OP_VOID);
5924 1.1 christos SET_CREG (OP[1], a);
5925 1.6 christos trace_output_16 (sd, a);
5926 1.1 christos }
5927 1.1 christos
5928 1.1 christos /* lprd. */
5929 1.1 christos void
5930 1.6 christos OP_141_14 (SIM_DESC sd, SIM_CPU *cpu)
5931 1.1 christos {
5932 1.10 christos uint32_t a = GPR32 (OP[0]);
5933 1.1 christos trace_input ("lprd", OP_REGP, OP_REG, OP_VOID);
5934 1.1 christos SET_CREG (OP[1], a);
5935 1.6 christos trace_output_flag (sd);
5936 1.1 christos }
5937 1.1 christos
5938 1.1 christos /* spr. */
5939 1.1 christos void
5940 1.6 christos OP_142_14 (SIM_DESC sd, SIM_CPU *cpu)
5941 1.1 christos {
5942 1.10 christos uint16_t a = CREG (OP[0]);
5943 1.1 christos trace_input ("spr", OP_REG, OP_REG, OP_VOID);
5944 1.1 christos SET_GPR (OP[1], a);
5945 1.6 christos trace_output_16 (sd, a);
5946 1.1 christos }
5947 1.1 christos
5948 1.1 christos /* sprd. */
5949 1.1 christos void
5950 1.6 christos OP_143_14 (SIM_DESC sd, SIM_CPU *cpu)
5951 1.1 christos {
5952 1.10 christos uint32_t a = CREG (OP[0]);
5953 1.1 christos trace_input ("sprd", OP_REGP, OP_REGP, OP_VOID);
5954 1.1 christos SET_GPR32 (OP[1], a);
5955 1.6 christos trace_output_32 (sd, a);
5956 1.1 christos }
5957 1.1 christos
5958 1.1 christos /* null. */
5959 1.1 christos void
5960 1.6 christos OP_0_20 (SIM_DESC sd, SIM_CPU *cpu)
5961 1.1 christos {
5962 1.1 christos trace_input ("null", OP_VOID, OP_VOID, OP_VOID);
5963 1.6 christos sim_engine_halt (sd, cpu, NULL, PC, sim_exited, 0);
5964 1.1 christos }
5965