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