|
|
1.1 ! root 1: /* ! 2: * SH4 emulation ! 3: * ! 4: * Copyright (c) 2005 Samuel Tardieu ! 5: * ! 6: * This library is free software; you can redistribute it and/or ! 7: * modify it under the terms of the GNU Lesser General Public ! 8: * License as published by the Free Software Foundation; either ! 9: * version 2 of the License, or (at your option) any later version. ! 10: * ! 11: * This library is distributed in the hope that it will be useful, ! 12: * but WITHOUT ANY WARRANTY; without even the implied warranty of ! 13: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! 14: * Lesser General Public License for more details. ! 15: * ! 16: * You should have received a copy of the GNU Lesser General Public ! 17: * License along with this library; if not, write to the Free Software ! 18: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ! 19: */ ! 20: #include "exec.h" ! 21: ! 22: static inline void set_flag(uint32_t flag) ! 23: { ! 24: env->flags |= flag; ! 25: } ! 26: ! 27: static inline void clr_flag(uint32_t flag) ! 28: { ! 29: env->flags &= ~flag; ! 30: } ! 31: ! 32: static inline void set_t(void) ! 33: { ! 34: env->sr |= SR_T; ! 35: } ! 36: ! 37: static inline void clr_t(void) ! 38: { ! 39: env->sr &= ~SR_T; ! 40: } ! 41: ! 42: static inline void cond_t(int cond) ! 43: { ! 44: if (cond) ! 45: set_t(); ! 46: else ! 47: clr_t(); ! 48: } ! 49: ! 50: void OPPROTO op_movl_imm_T0(void) ! 51: { ! 52: T0 = (uint32_t) PARAM1; ! 53: RETURN(); ! 54: } ! 55: ! 56: void OPPROTO op_movl_imm_T1(void) ! 57: { ! 58: T0 = (uint32_t) PARAM1; ! 59: RETURN(); ! 60: } ! 61: ! 62: void OPPROTO op_movl_imm_T2(void) ! 63: { ! 64: T0 = (uint32_t) PARAM1; ! 65: RETURN(); ! 66: } ! 67: ! 68: void OPPROTO op_cmp_eq_imm_T0(void) ! 69: { ! 70: cond_t((int32_t) T0 == (int32_t) PARAM1); ! 71: RETURN(); ! 72: } ! 73: ! 74: void OPPROTO op_cmd_eq_T0_T1(void) ! 75: { ! 76: cond_t(T0 == T1); ! 77: RETURN(); ! 78: } ! 79: ! 80: void OPPROTO op_cmd_hs_T0_T1(void) ! 81: { ! 82: cond_t((uint32_t) T0 <= (uint32_t) T1); ! 83: RETURN(); ! 84: } ! 85: ! 86: void OPPROTO op_cmd_ge_T0_T1(void) ! 87: { ! 88: cond_t((int32_t) T0 <= (int32_t) T1); ! 89: RETURN(); ! 90: } ! 91: ! 92: void OPPROTO op_cmd_hi_T0_T1(void) ! 93: { ! 94: cond_t((uint32_t) T0 < (uint32_t) T1); ! 95: RETURN(); ! 96: } ! 97: ! 98: void OPPROTO op_cmd_gt_T0_T1(void) ! 99: { ! 100: cond_t((int32_t) T0 < (int32_t) T1); ! 101: RETURN(); ! 102: } ! 103: ! 104: void OPPROTO op_not_T0(void) ! 105: { ! 106: T0 = ~T0; ! 107: RETURN(); ! 108: } ! 109: ! 110: void OPPROTO op_bf_s(void) ! 111: { ! 112: T2 = ~env->sr; ! 113: env->delayed_pc = PARAM1; ! 114: set_flag(DELAY_SLOT_CONDITIONAL); ! 115: RETURN(); ! 116: } ! 117: ! 118: void OPPROTO op_bt_s(void) ! 119: { ! 120: T2 = env->sr; ! 121: env->delayed_pc = PARAM1; ! 122: set_flag(DELAY_SLOT_CONDITIONAL); ! 123: RETURN(); ! 124: } ! 125: ! 126: void OPPROTO op_bra(void) ! 127: { ! 128: env->delayed_pc = PARAM1; ! 129: set_flag(DELAY_SLOT); ! 130: RETURN(); ! 131: } ! 132: ! 133: void OPPROTO op_braf_T0(void) ! 134: { ! 135: env->delayed_pc = PARAM1 + T0; ! 136: set_flag(DELAY_SLOT); ! 137: RETURN(); ! 138: } ! 139: ! 140: void OPPROTO op_bsr(void) ! 141: { ! 142: env->pr = PARAM1; ! 143: env->delayed_pc = PARAM2; ! 144: set_flag(DELAY_SLOT); ! 145: RETURN(); ! 146: } ! 147: ! 148: void OPPROTO op_bsrf_T0(void) ! 149: { ! 150: env->pr = PARAM1; ! 151: env->delayed_pc = PARAM1 + T0; ! 152: set_flag(DELAY_SLOT); ! 153: RETURN(); ! 154: } ! 155: ! 156: void OPPROTO op_jsr_T0(void) ! 157: { ! 158: env->pr = PARAM1; ! 159: env->delayed_pc = T0; ! 160: set_flag(DELAY_SLOT); ! 161: RETURN(); ! 162: } ! 163: ! 164: void OPPROTO op_rts(void) ! 165: { ! 166: env->delayed_pc = env->pr; ! 167: set_flag(DELAY_SLOT); ! 168: RETURN(); ! 169: } ! 170: ! 171: void OPPROTO op_clr_delay_slot(void) ! 172: { ! 173: clr_flag(DELAY_SLOT); ! 174: RETURN(); ! 175: } ! 176: ! 177: void OPPROTO op_clr_delay_slot_conditional(void) ! 178: { ! 179: clr_flag(DELAY_SLOT_CONDITIONAL); ! 180: RETURN(); ! 181: } ! 182: ! 183: void OPPROTO op_exit_tb(void) ! 184: { ! 185: EXIT_TB(); ! 186: RETURN(); ! 187: } ! 188: ! 189: void OPPROTO op_addl_imm_T0(void) ! 190: { ! 191: T0 += PARAM1; ! 192: RETURN(); ! 193: } ! 194: ! 195: void OPPROTO op_addl_imm_T1(void) ! 196: { ! 197: T1 += PARAM1; ! 198: RETURN(); ! 199: } ! 200: ! 201: void OPPROTO op_clrmac(void) ! 202: { ! 203: env->mach = env->macl = 0; ! 204: RETURN(); ! 205: } ! 206: ! 207: void OPPROTO op_clrs(void) ! 208: { ! 209: env->sr &= ~SR_S; ! 210: RETURN(); ! 211: } ! 212: ! 213: void OPPROTO op_clrt(void) ! 214: { ! 215: env->sr &= ~SR_T; ! 216: RETURN(); ! 217: } ! 218: ! 219: void OPPROTO op_sets(void) ! 220: { ! 221: env->sr |= SR_S; ! 222: RETURN(); ! 223: } ! 224: ! 225: void OPPROTO op_sett(void) ! 226: { ! 227: env->sr |= SR_T; ! 228: RETURN(); ! 229: } ! 230: ! 231: void OPPROTO op_rte(void) ! 232: { ! 233: env->sr = env->ssr; ! 234: env->delayed_pc = env->spc; ! 235: set_flag(DELAY_SLOT); ! 236: RETURN(); ! 237: } ! 238: ! 239: void OPPROTO op_swapb_T0(void) ! 240: { ! 241: T0 = (T0 & 0xffff0000) | ((T0 & 0xff) << 8) | ((T0 >> 8) & 0xff); ! 242: RETURN(); ! 243: } ! 244: ! 245: void OPPROTO op_swapw_T0(void) ! 246: { ! 247: T0 = ((T0 & 0xffff) << 16) | ((T0 >> 16) & 0xffff); ! 248: RETURN(); ! 249: } ! 250: ! 251: void OPPROTO op_xtrct_T0_T1(void) ! 252: { ! 253: T1 = ((T0 & 0xffff) << 16) | ((T1 >> 16) & 0xffff); ! 254: RETURN(); ! 255: } ! 256: ! 257: void OPPROTO op_addc_T0_T1(void) ! 258: { ! 259: helper_addc_T0_T1(); ! 260: RETURN(); ! 261: } ! 262: ! 263: void OPPROTO op_addv_T0_T1(void) ! 264: { ! 265: helper_addv_T0_T1(); ! 266: RETURN(); ! 267: } ! 268: ! 269: void OPPROTO op_cmp_eq_T0_T1(void) ! 270: { ! 271: cond_t(T1 == T0); ! 272: RETURN(); ! 273: } ! 274: ! 275: void OPPROTO op_cmp_ge_T0_T1(void) ! 276: { ! 277: cond_t((int32_t) T1 >= (int32_t) T0); ! 278: RETURN(); ! 279: } ! 280: ! 281: void OPPROTO op_cmp_gt_T0_T1(void) ! 282: { ! 283: cond_t((int32_t) T1 > (int32_t) T0); ! 284: RETURN(); ! 285: } ! 286: ! 287: void OPPROTO op_cmp_hi_T0_T1(void) ! 288: { ! 289: cond_t((uint32_t) T1 > (uint32_t) T0); ! 290: RETURN(); ! 291: } ! 292: ! 293: void OPPROTO op_cmp_hs_T0_T1(void) ! 294: { ! 295: cond_t((uint32_t) T1 >= (uint32_t) T0); ! 296: RETURN(); ! 297: } ! 298: ! 299: void OPPROTO op_cmp_str_T0_T1(void) ! 300: { ! 301: cond_t((T0 & 0x000000ff) == (T1 & 0x000000ff) || ! 302: (T0 & 0x0000ff00) == (T1 & 0x0000ff00) || ! 303: (T0 & 0x00ff0000) == (T1 & 0x00ff0000) || ! 304: (T0 & 0xff000000) == (T1 & 0xff000000)); ! 305: RETURN(); ! 306: } ! 307: ! 308: void OPPROTO op_tst_T0_T1(void) ! 309: { ! 310: cond_t((T1 & T0) == 0); ! 311: RETURN(); ! 312: } ! 313: ! 314: void OPPROTO op_div0s_T0_T1(void) ! 315: { ! 316: if (T1 & 0x80000000) ! 317: env->sr |= SR_Q; ! 318: else ! 319: env->sr &= ~SR_Q; ! 320: if (T0 & 0x80000000) ! 321: env->sr |= SR_M; ! 322: else ! 323: env->sr &= ~SR_M; ! 324: cond_t((T1 ^ T0) & 0x80000000); ! 325: RETURN(); ! 326: } ! 327: ! 328: void OPPROTO op_div0u(void) ! 329: { ! 330: env->sr &= ~(SR_M | SR_Q | SR_T); ! 331: RETURN(); ! 332: } ! 333: ! 334: void OPPROTO op_div1_T0_T1(void) ! 335: { ! 336: helper_div1_T0_T1(); ! 337: RETURN(); ! 338: } ! 339: ! 340: void OPPROTO op_dmulsl_T0_T1(void) ! 341: { ! 342: helper_dmulsl_T0_T1(); ! 343: RETURN(); ! 344: } ! 345: ! 346: void OPPROTO op_dmulul_T0_T1(void) ! 347: { ! 348: helper_dmulul_T0_T1(); ! 349: RETURN(); ! 350: } ! 351: ! 352: void OPPROTO op_macl_T0_T1(void) ! 353: { ! 354: helper_macl_T0_T1(); ! 355: RETURN(); ! 356: } ! 357: ! 358: void OPPROTO op_macw_T0_T1(void) ! 359: { ! 360: helper_macw_T0_T1(); ! 361: RETURN(); ! 362: } ! 363: ! 364: void OPPROTO op_mull_T0_T1(void) ! 365: { ! 366: env->macl = (T0 * T1) & 0xffffffff; ! 367: RETURN(); ! 368: } ! 369: ! 370: void OPPROTO op_mulsw_T0_T1(void) ! 371: { ! 372: env->macl = (int32_t) T0 *(int32_t) T1; ! 373: RETURN(); ! 374: } ! 375: ! 376: void OPPROTO op_muluw_T0_T1(void) ! 377: { ! 378: env->macl = (uint32_t) T0 *(uint32_t) T1; ! 379: RETURN(); ! 380: } ! 381: ! 382: void OPPROTO op_neg_T0(void) ! 383: { ! 384: T0 = -T0; ! 385: RETURN(); ! 386: } ! 387: ! 388: void OPPROTO op_negc_T0(void) ! 389: { ! 390: helper_negc_T0(); ! 391: RETURN(); ! 392: } ! 393: ! 394: void OPPROTO op_shad_T0_T1(void) ! 395: { ! 396: if ((T0 & 0x80000000) == 0) ! 397: T1 <<= (T0 & 0x1f); ! 398: else if ((T0 & 0x1f) == 0) ! 399: T1 = 0; ! 400: else ! 401: T1 = ((int32_t) T1) >> ((~T0 & 0x1f) + 1); ! 402: RETURN(); ! 403: } ! 404: ! 405: void OPPROTO op_shld_T0_T1(void) ! 406: { ! 407: if ((T0 & 0x80000000) == 0) ! 408: T1 <<= (T0 & 0x1f); ! 409: else if ((T0 & 0x1f) == 0) ! 410: T1 = 0; ! 411: else ! 412: T1 = ((uint32_t) T1) >> ((~T0 & 0x1f) + 1); ! 413: RETURN(); ! 414: } ! 415: ! 416: void OPPROTO op_subc_T0_T1(void) ! 417: { ! 418: helper_subc_T0_T1(); ! 419: RETURN(); ! 420: } ! 421: ! 422: void OPPROTO op_subv_T0_T1(void) ! 423: { ! 424: helper_subv_T0_T1(); ! 425: RETURN(); ! 426: } ! 427: ! 428: void OPPROTO op_trapa(void) ! 429: { ! 430: env->tra = PARAM1 * 2; ! 431: env->exception_index = 0x160; ! 432: do_raise_exception(); ! 433: RETURN(); ! 434: } ! 435: ! 436: void OPPROTO op_cmp_pl_T0(void) ! 437: { ! 438: cond_t((int32_t) T0 > 0); ! 439: RETURN(); ! 440: } ! 441: ! 442: void OPPROTO op_cmp_pz_T0(void) ! 443: { ! 444: cond_t((int32_t) T0 >= 0); ! 445: RETURN(); ! 446: } ! 447: ! 448: void OPPROTO op_jmp_T0(void) ! 449: { ! 450: env->delayed_pc = T0; ! 451: set_flag(DELAY_SLOT); ! 452: RETURN(); ! 453: } ! 454: ! 455: void OPPROTO op_movl_rN_rN(void) ! 456: { ! 457: env->gregs[PARAM2] = env->gregs[PARAM1]; ! 458: RETURN(); ! 459: } ! 460: ! 461: void OPPROTO op_ldcl_rMplus_rN_bank(void) ! 462: { ! 463: env->gregs[PARAM2] = env->gregs[PARAM1]; ! 464: env->gregs[PARAM1] += 4; ! 465: RETURN(); ! 466: } ! 467: ! 468: #define LDSTOPS(target,load,store) \ ! 469: void OPPROTO op_##load##_T0_##target (void) \ ! 470: { env ->target = T0; RETURN(); \ ! 471: } \ ! 472: void OPPROTO op_##store##_##target##_T0 (void) \ ! 473: { T0 = env->target; RETURN(); \ ! 474: } \ ! 475: ! 476: LDSTOPS(sr, ldc, stc) ! 477: LDSTOPS(gbr, ldc, stc) ! 478: LDSTOPS(vbr, ldc, stc) ! 479: LDSTOPS(ssr, ldc, stc) ! 480: LDSTOPS(spc, ldc, stc) ! 481: LDSTOPS(sgr, ldc, stc) ! 482: LDSTOPS(dbr, ldc, stc) ! 483: LDSTOPS(mach, lds, sts) ! 484: LDSTOPS(macl, lds, sts) ! 485: LDSTOPS(pr, lds, sts) ! 486: ! 487: void OPPROTO op_movt_rN(void) ! 488: { ! 489: env->gregs[PARAM1] = env->sr & SR_T; ! 490: RETURN(); ! 491: } ! 492: ! 493: void OPPROTO op_rotcl_Rn(void) ! 494: { ! 495: helper_rotcl(&env->gregs[PARAM1]); ! 496: RETURN(); ! 497: } ! 498: ! 499: void OPPROTO op_rotcr_Rn(void) ! 500: { ! 501: helper_rotcr(&env->gregs[PARAM1]); ! 502: RETURN(); ! 503: } ! 504: ! 505: void OPPROTO op_rotl_Rn(void) ! 506: { ! 507: cond_t(env->gregs[PARAM1] & 0x80000000); ! 508: env->gregs[PARAM1] = (env->gregs[PARAM1] << 1) | (env->sr & SR_T); ! 509: RETURN(); ! 510: } ! 511: ! 512: void OPPROTO op_rotr_Rn(void) ! 513: { ! 514: cond_t(env->gregs[PARAM1] & 1); ! 515: env->gregs[PARAM1] = (env->gregs[PARAM1] >> 1) | ! 516: ((env->sr & SR_T) ? 0x80000000 : 0); ! 517: RETURN(); ! 518: } ! 519: ! 520: void OPPROTO op_shal_Rn(void) ! 521: { ! 522: cond_t(env->gregs[PARAM1] & 0x80000000); ! 523: env->gregs[PARAM1] <<= 1; ! 524: RETURN(); ! 525: } ! 526: ! 527: void OPPROTO op_shar_Rn(void) ! 528: { ! 529: cond_t(env->gregs[PARAM1] & 1); ! 530: *(int32_t *) & env->gregs[PARAM1] >>= 1; ! 531: RETURN(); ! 532: } ! 533: ! 534: void OPPROTO op_shlr_Rn(void) ! 535: { ! 536: cond_t(env->gregs[PARAM1] & 1); ! 537: *(uint32_t *) & env->gregs[PARAM1] >>= 1; ! 538: RETURN(); ! 539: } ! 540: ! 541: void OPPROTO op_shll2_Rn(void) ! 542: { ! 543: env->gregs[PARAM1] <<= 2; ! 544: RETURN(); ! 545: } ! 546: ! 547: void OPPROTO op_shll8_Rn(void) ! 548: { ! 549: env->gregs[PARAM1] <<= 8; ! 550: RETURN(); ! 551: } ! 552: ! 553: void OPPROTO op_shll16_Rn(void) ! 554: { ! 555: env->gregs[PARAM1] <<= 16; ! 556: RETURN(); ! 557: } ! 558: ! 559: void OPPROTO op_shlr2_Rn(void) ! 560: { ! 561: *(uint32_t *) & env->gregs[PARAM1] >>= 2; ! 562: RETURN(); ! 563: } ! 564: ! 565: void OPPROTO op_shlr8_Rn(void) ! 566: { ! 567: *(uint32_t *) & env->gregs[PARAM1] >>= 8; ! 568: RETURN(); ! 569: } ! 570: ! 571: void OPPROTO op_shlr16_Rn(void) ! 572: { ! 573: *(uint32_t *) & env->gregs[PARAM1] >>= 16; ! 574: RETURN(); ! 575: } ! 576: ! 577: void OPPROTO op_tasb_rN(void) ! 578: { ! 579: cond_t(*(int8_t *) env->gregs[PARAM1] == 0); ! 580: *(int8_t *) env->gregs[PARAM1] |= 0x80; ! 581: RETURN(); ! 582: } ! 583: ! 584: void OPPROTO op_movl_T0_rN(void) ! 585: { ! 586: env->gregs[PARAM1] = T0; ! 587: RETURN(); ! 588: } ! 589: ! 590: void OPPROTO op_movl_T1_rN(void) ! 591: { ! 592: env->gregs[PARAM1] = T1; ! 593: RETURN(); ! 594: } ! 595: ! 596: void OPPROTO op_movb_rN_T0(void) ! 597: { ! 598: T0 = (int32_t) (int8_t) (env->gregs[PARAM1] & 0xff); ! 599: RETURN(); ! 600: } ! 601: ! 602: void OPPROTO op_movub_rN_T0(void) ! 603: { ! 604: T0 = env->gregs[PARAM1] & 0xff; ! 605: RETURN(); ! 606: } ! 607: ! 608: void OPPROTO op_movw_rN_T0(void) ! 609: { ! 610: T0 = (int32_t) (int16_t) (env->gregs[PARAM1] & 0xffff); ! 611: RETURN(); ! 612: } ! 613: ! 614: void OPPROTO op_movuw_rN_T0(void) ! 615: { ! 616: T0 = env->gregs[PARAM1] & 0xffff; ! 617: RETURN(); ! 618: } ! 619: ! 620: void OPPROTO op_movl_rN_T0(void) ! 621: { ! 622: T0 = env->gregs[PARAM1]; ! 623: RETURN(); ! 624: } ! 625: ! 626: void OPPROTO op_movb_rN_T1(void) ! 627: { ! 628: T1 = (int32_t) (int8_t) (env->gregs[PARAM1] & 0xff); ! 629: RETURN(); ! 630: } ! 631: ! 632: void OPPROTO op_movub_rN_T1(void) ! 633: { ! 634: T1 = env->gregs[PARAM1] & 0xff; ! 635: RETURN(); ! 636: } ! 637: ! 638: void OPPROTO op_movw_rN_T1(void) ! 639: { ! 640: T1 = (int32_t) (int16_t) (env->gregs[PARAM1] & 0xffff); ! 641: RETURN(); ! 642: } ! 643: ! 644: void OPPROTO op_movuw_rN_T1(void) ! 645: { ! 646: T1 = env->gregs[PARAM1] & 0xffff; ! 647: RETURN(); ! 648: } ! 649: ! 650: void OPPROTO op_movl_rN_T1(void) ! 651: { ! 652: T1 = env->gregs[PARAM1]; ! 653: RETURN(); ! 654: } ! 655: ! 656: void OPPROTO op_movl_imm_rN(void) ! 657: { ! 658: env->gregs[PARAM2] = PARAM1; ! 659: RETURN(); ! 660: } ! 661: ! 662: void OPPROTO op_dec1_rN(void) ! 663: { ! 664: env->gregs[PARAM1] -= 1; ! 665: RETURN(); ! 666: } ! 667: ! 668: void OPPROTO op_dec2_rN(void) ! 669: { ! 670: env->gregs[PARAM1] -= 2; ! 671: RETURN(); ! 672: } ! 673: ! 674: void OPPROTO op_dec4_rN(void) ! 675: { ! 676: env->gregs[PARAM1] -= 4; ! 677: RETURN(); ! 678: } ! 679: ! 680: void OPPROTO op_inc1_rN(void) ! 681: { ! 682: env->gregs[PARAM1] += 1; ! 683: RETURN(); ! 684: } ! 685: ! 686: void OPPROTO op_inc2_rN(void) ! 687: { ! 688: env->gregs[PARAM1] += 2; ! 689: RETURN(); ! 690: } ! 691: ! 692: void OPPROTO op_inc4_rN(void) ! 693: { ! 694: env->gregs[PARAM1] += 4; ! 695: RETURN(); ! 696: } ! 697: ! 698: void OPPROTO op_add_T0_rN(void) ! 699: { ! 700: env->gregs[PARAM1] += T0; ! 701: RETURN(); ! 702: } ! 703: ! 704: void OPPROTO op_sub_T0_rN(void) ! 705: { ! 706: env->gregs[PARAM1] -= T0; ! 707: RETURN(); ! 708: } ! 709: ! 710: void OPPROTO op_and_T0_rN(void) ! 711: { ! 712: env->gregs[PARAM1] &= T0; ! 713: RETURN(); ! 714: } ! 715: ! 716: void OPPROTO op_or_T0_rN(void) ! 717: { ! 718: env->gregs[PARAM1] |= T0; ! 719: RETURN(); ! 720: } ! 721: ! 722: void OPPROTO op_xor_T0_rN(void) ! 723: { ! 724: env->gregs[PARAM1] ^= T0; ! 725: RETURN(); ! 726: } ! 727: ! 728: void OPPROTO op_add_rN_T0(void) ! 729: { ! 730: T0 += env->gregs[PARAM1]; ! 731: RETURN(); ! 732: } ! 733: ! 734: void OPPROTO op_add_rN_T1(void) ! 735: { ! 736: T1 += env->gregs[PARAM1]; ! 737: RETURN(); ! 738: } ! 739: ! 740: void OPPROTO op_add_imm_rN(void) ! 741: { ! 742: env->gregs[PARAM2] += PARAM1; ! 743: RETURN(); ! 744: } ! 745: ! 746: void OPPROTO op_and_imm_rN(void) ! 747: { ! 748: env->gregs[PARAM2] &= PARAM1; ! 749: RETURN(); ! 750: } ! 751: ! 752: void OPPROTO op_or_imm_rN(void) ! 753: { ! 754: env->gregs[PARAM2] |= PARAM1; ! 755: RETURN(); ! 756: } ! 757: ! 758: void OPPROTO op_xor_imm_rN(void) ! 759: { ! 760: env->gregs[PARAM2] ^= PARAM1; ! 761: RETURN(); ! 762: } ! 763: ! 764: void OPPROTO op_dt_rN(void) ! 765: { ! 766: cond_t((--env->gregs[PARAM1]) == 0); ! 767: RETURN(); ! 768: } ! 769: ! 770: void OPPROTO op_tst_imm_rN(void) ! 771: { ! 772: cond_t((env->gregs[PARAM2] & PARAM1) == 0); ! 773: RETURN(); ! 774: } ! 775: ! 776: void OPPROTO op_movl_T0_T1(void) ! 777: { ! 778: T1 = T0; ! 779: RETURN(); ! 780: } ! 781: ! 782: void OPPROTO op_goto_tb0(void) ! 783: { ! 784: GOTO_TB(op_goto_tb0, PARAM1, 0); ! 785: RETURN(); ! 786: } ! 787: ! 788: void OPPROTO op_goto_tb1(void) ! 789: { ! 790: GOTO_TB(op_goto_tb1, PARAM1, 1); ! 791: RETURN(); ! 792: } ! 793: ! 794: void OPPROTO op_movl_imm_PC(void) ! 795: { ! 796: env->pc = PARAM1; ! 797: RETURN(); ! 798: } ! 799: ! 800: void OPPROTO op_jT(void) ! 801: { ! 802: if (env->sr & SR_T) ! 803: GOTO_LABEL_PARAM(1); ! 804: RETURN(); ! 805: } ! 806: ! 807: void OPPROTO op_jTT2(void) ! 808: { ! 809: if (T2 & SR_T) ! 810: GOTO_LABEL_PARAM(1); ! 811: RETURN(); ! 812: } ! 813: ! 814: void OPPROTO op_movl_delayed_pc_PC(void) ! 815: { ! 816: env->pc = env->delayed_pc; ! 817: RETURN(); ! 818: } ! 819: ! 820: void OPPROTO op_addl_GBR_T0(void) ! 821: { ! 822: T0 += env->gbr; ! 823: RETURN(); ! 824: } ! 825: ! 826: void OPPROTO op_and_imm_T0(void) ! 827: { ! 828: T0 &= PARAM1; ! 829: RETURN(); ! 830: } ! 831: ! 832: void OPPROTO op_or_imm_T0(void) ! 833: { ! 834: T0 |= PARAM1; ! 835: RETURN(); ! 836: } ! 837: ! 838: void OPPROTO op_xor_imm_T0(void) ! 839: { ! 840: T0 ^= PARAM1; ! 841: RETURN(); ! 842: } ! 843: ! 844: void OPPROTO op_tst_imm_T0(void) ! 845: { ! 846: cond_t((T0 & PARAM1) == 0); ! 847: RETURN(); ! 848: } ! 849: ! 850: void OPPROTO op_raise_illegal_instruction(void) ! 851: { ! 852: env->exception_index = 0x180; ! 853: do_raise_exception(); ! 854: RETURN(); ! 855: } ! 856: ! 857: void OPPROTO op_raise_slot_illegal_instruction(void) ! 858: { ! 859: env->exception_index = 0x1a0; ! 860: do_raise_exception(); ! 861: RETURN(); ! 862: } ! 863: ! 864: void OPPROTO op_debug(void) ! 865: { ! 866: env->exception_index = EXCP_DEBUG; ! 867: cpu_loop_exit(); ! 868: } ! 869: ! 870: /* Load and store */ ! 871: #define MEMSUFFIX _raw ! 872: #include "op_mem.c" ! 873: #undef MEMSUFFIX ! 874: #if !defined(CONFIG_USER_ONLY) ! 875: #define MEMSUFFIX _user ! 876: #include "op_mem.c" ! 877: #undef MEMSUFFIX ! 878: ! 879: #define MEMSUFFIX _kernel ! 880: #include "op_mem.c" ! 881: #undef MEMSUFFIX ! 882: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.