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