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