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