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