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