Annotation of qemu/target-sh4/op.c, revision 1.1.1.2

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:     env->delayed_pc = PARAM1;
1.1.1.2 ! root      113:     set_flag(DELAY_SLOT_CONDITIONAL | ((~env->sr) & SR_T));
1.1       root      114:     RETURN();
                    115: }
                    116: 
                    117: void OPPROTO op_bt_s(void)
                    118: {
                    119:     env->delayed_pc = PARAM1;
1.1.1.2 ! root      120:     set_flag(DELAY_SLOT_CONDITIONAL | (env->sr & SR_T));
1.1       root      121:     RETURN();
                    122: }
                    123: 
                    124: void OPPROTO op_bra(void)
                    125: {
                    126:     env->delayed_pc = PARAM1;
                    127:     set_flag(DELAY_SLOT);
                    128:     RETURN();
                    129: }
                    130: 
                    131: void OPPROTO op_braf_T0(void)
                    132: {
                    133:     env->delayed_pc = PARAM1 + T0;
                    134:     set_flag(DELAY_SLOT);
                    135:     RETURN();
                    136: }
                    137: 
                    138: void OPPROTO op_bsr(void)
                    139: {
                    140:     env->pr = PARAM1;
                    141:     env->delayed_pc = PARAM2;
                    142:     set_flag(DELAY_SLOT);
                    143:     RETURN();
                    144: }
                    145: 
                    146: void OPPROTO op_bsrf_T0(void)
                    147: {
                    148:     env->pr = PARAM1;
                    149:     env->delayed_pc = PARAM1 + T0;
                    150:     set_flag(DELAY_SLOT);
                    151:     RETURN();
                    152: }
                    153: 
                    154: void OPPROTO op_jsr_T0(void)
                    155: {
                    156:     env->pr = PARAM1;
                    157:     env->delayed_pc = T0;
                    158:     set_flag(DELAY_SLOT);
                    159:     RETURN();
                    160: }
                    161: 
                    162: void OPPROTO op_rts(void)
                    163: {
                    164:     env->delayed_pc = env->pr;
                    165:     set_flag(DELAY_SLOT);
                    166:     RETURN();
                    167: }
                    168: 
                    169: void OPPROTO op_clr_delay_slot(void)
                    170: {
                    171:     clr_flag(DELAY_SLOT);
                    172:     RETURN();
                    173: }
                    174: 
                    175: void OPPROTO op_clr_delay_slot_conditional(void)
                    176: {
                    177:     clr_flag(DELAY_SLOT_CONDITIONAL);
                    178:     RETURN();
                    179: }
                    180: 
                    181: void OPPROTO op_exit_tb(void)
                    182: {
                    183:     EXIT_TB();
                    184:     RETURN();
                    185: }
                    186: 
                    187: void OPPROTO op_addl_imm_T0(void)
                    188: {
                    189:     T0 += PARAM1;
                    190:     RETURN();
                    191: }
                    192: 
                    193: void OPPROTO op_addl_imm_T1(void)
                    194: {
                    195:     T1 += PARAM1;
                    196:     RETURN();
                    197: }
                    198: 
                    199: void OPPROTO op_clrmac(void)
                    200: {
                    201:     env->mach = env->macl = 0;
                    202:     RETURN();
                    203: }
                    204: 
                    205: void OPPROTO op_clrs(void)
                    206: {
                    207:     env->sr &= ~SR_S;
                    208:     RETURN();
                    209: }
                    210: 
                    211: void OPPROTO op_clrt(void)
                    212: {
                    213:     env->sr &= ~SR_T;
                    214:     RETURN();
                    215: }
                    216: 
                    217: void OPPROTO op_sets(void)
                    218: {
                    219:     env->sr |= SR_S;
                    220:     RETURN();
                    221: }
                    222: 
                    223: void OPPROTO op_sett(void)
                    224: {
                    225:     env->sr |= SR_T;
                    226:     RETURN();
                    227: }
                    228: 
1.1.1.2 ! root      229: void OPPROTO op_frchg(void)
        !           230: {
        !           231:     env->fpscr ^= FPSCR_FR;
        !           232:     RETURN();
        !           233: }
        !           234: 
        !           235: void OPPROTO op_fschg(void)
        !           236: {
        !           237:     env->fpscr ^= FPSCR_SZ;
        !           238:     RETURN();
        !           239: }
        !           240: 
1.1       root      241: void OPPROTO op_rte(void)
                    242: {
                    243:     env->sr = env->ssr;
                    244:     env->delayed_pc = env->spc;
                    245:     set_flag(DELAY_SLOT);
                    246:     RETURN();
                    247: }
                    248: 
                    249: void OPPROTO op_swapb_T0(void)
                    250: {
                    251:     T0 = (T0 & 0xffff0000) | ((T0 & 0xff) << 8) | ((T0 >> 8) & 0xff);
                    252:     RETURN();
                    253: }
                    254: 
                    255: void OPPROTO op_swapw_T0(void)
                    256: {
                    257:     T0 = ((T0 & 0xffff) << 16) | ((T0 >> 16) & 0xffff);
                    258:     RETURN();
                    259: }
                    260: 
                    261: void OPPROTO op_xtrct_T0_T1(void)
                    262: {
                    263:     T1 = ((T0 & 0xffff) << 16) | ((T1 >> 16) & 0xffff);
                    264:     RETURN();
                    265: }
                    266: 
                    267: void OPPROTO op_addc_T0_T1(void)
                    268: {
                    269:     helper_addc_T0_T1();
                    270:     RETURN();
                    271: }
                    272: 
                    273: void OPPROTO op_addv_T0_T1(void)
                    274: {
                    275:     helper_addv_T0_T1();
                    276:     RETURN();
                    277: }
                    278: 
                    279: void OPPROTO op_cmp_eq_T0_T1(void)
                    280: {
                    281:     cond_t(T1 == T0);
                    282:     RETURN();
                    283: }
                    284: 
                    285: void OPPROTO op_cmp_ge_T0_T1(void)
                    286: {
                    287:     cond_t((int32_t) T1 >= (int32_t) T0);
                    288:     RETURN();
                    289: }
                    290: 
                    291: void OPPROTO op_cmp_gt_T0_T1(void)
                    292: {
                    293:     cond_t((int32_t) T1 > (int32_t) T0);
                    294:     RETURN();
                    295: }
                    296: 
                    297: void OPPROTO op_cmp_hi_T0_T1(void)
                    298: {
                    299:     cond_t((uint32_t) T1 > (uint32_t) T0);
                    300:     RETURN();
                    301: }
                    302: 
                    303: void OPPROTO op_cmp_hs_T0_T1(void)
                    304: {
                    305:     cond_t((uint32_t) T1 >= (uint32_t) T0);
                    306:     RETURN();
                    307: }
                    308: 
                    309: void OPPROTO op_cmp_str_T0_T1(void)
                    310: {
                    311:     cond_t((T0 & 0x000000ff) == (T1 & 0x000000ff) ||
                    312:           (T0 & 0x0000ff00) == (T1 & 0x0000ff00) ||
                    313:           (T0 & 0x00ff0000) == (T1 & 0x00ff0000) ||
                    314:           (T0 & 0xff000000) == (T1 & 0xff000000));
                    315:     RETURN();
                    316: }
                    317: 
                    318: void OPPROTO op_tst_T0_T1(void)
                    319: {
                    320:     cond_t((T1 & T0) == 0);
                    321:     RETURN();
                    322: }
                    323: 
                    324: void OPPROTO op_div0s_T0_T1(void)
                    325: {
                    326:     if (T1 & 0x80000000)
                    327:        env->sr |= SR_Q;
                    328:     else
                    329:        env->sr &= ~SR_Q;
                    330:     if (T0 & 0x80000000)
                    331:        env->sr |= SR_M;
                    332:     else
                    333:        env->sr &= ~SR_M;
                    334:     cond_t((T1 ^ T0) & 0x80000000);
                    335:     RETURN();
                    336: }
                    337: 
                    338: void OPPROTO op_div0u(void)
                    339: {
                    340:     env->sr &= ~(SR_M | SR_Q | SR_T);
                    341:     RETURN();
                    342: }
                    343: 
                    344: void OPPROTO op_div1_T0_T1(void)
                    345: {
                    346:     helper_div1_T0_T1();
                    347:     RETURN();
                    348: }
                    349: 
                    350: void OPPROTO op_dmulsl_T0_T1(void)
                    351: {
                    352:     helper_dmulsl_T0_T1();
                    353:     RETURN();
                    354: }
                    355: 
                    356: void OPPROTO op_dmulul_T0_T1(void)
                    357: {
                    358:     helper_dmulul_T0_T1();
                    359:     RETURN();
                    360: }
                    361: 
                    362: void OPPROTO op_macl_T0_T1(void)
                    363: {
                    364:     helper_macl_T0_T1();
                    365:     RETURN();
                    366: }
                    367: 
                    368: void OPPROTO op_macw_T0_T1(void)
                    369: {
                    370:     helper_macw_T0_T1();
                    371:     RETURN();
                    372: }
                    373: 
                    374: void OPPROTO op_mull_T0_T1(void)
                    375: {
                    376:     env->macl = (T0 * T1) & 0xffffffff;
                    377:     RETURN();
                    378: }
                    379: 
                    380: void OPPROTO op_mulsw_T0_T1(void)
                    381: {
                    382:     env->macl = (int32_t) T0 *(int32_t) T1;
                    383:     RETURN();
                    384: }
                    385: 
                    386: void OPPROTO op_muluw_T0_T1(void)
                    387: {
                    388:     env->macl = (uint32_t) T0 *(uint32_t) T1;
                    389:     RETURN();
                    390: }
                    391: 
                    392: void OPPROTO op_neg_T0(void)
                    393: {
                    394:     T0 = -T0;
                    395:     RETURN();
                    396: }
                    397: 
                    398: void OPPROTO op_negc_T0(void)
                    399: {
                    400:     helper_negc_T0();
                    401:     RETURN();
                    402: }
                    403: 
                    404: void OPPROTO op_shad_T0_T1(void)
                    405: {
                    406:     if ((T0 & 0x80000000) == 0)
                    407:        T1 <<= (T0 & 0x1f);
                    408:     else if ((T0 & 0x1f) == 0)
                    409:        T1 = 0;
                    410:     else
                    411:        T1 = ((int32_t) T1) >> ((~T0 & 0x1f) + 1);
                    412:     RETURN();
                    413: }
                    414: 
                    415: void OPPROTO op_shld_T0_T1(void)
                    416: {
                    417:     if ((T0 & 0x80000000) == 0)
                    418:        T1 <<= (T0 & 0x1f);
                    419:     else if ((T0 & 0x1f) == 0)
                    420:        T1 = 0;
                    421:     else
                    422:        T1 = ((uint32_t) T1) >> ((~T0 & 0x1f) + 1);
                    423:     RETURN();
                    424: }
                    425: 
                    426: void OPPROTO op_subc_T0_T1(void)
                    427: {
                    428:     helper_subc_T0_T1();
                    429:     RETURN();
                    430: }
                    431: 
                    432: void OPPROTO op_subv_T0_T1(void)
                    433: {
                    434:     helper_subv_T0_T1();
                    435:     RETURN();
                    436: }
                    437: 
                    438: void OPPROTO op_trapa(void)
                    439: {
                    440:     env->tra = PARAM1 * 2;
                    441:     env->exception_index = 0x160;
                    442:     do_raise_exception();
                    443:     RETURN();
                    444: }
                    445: 
                    446: void OPPROTO op_cmp_pl_T0(void)
                    447: {
                    448:     cond_t((int32_t) T0 > 0);
                    449:     RETURN();
                    450: }
                    451: 
                    452: void OPPROTO op_cmp_pz_T0(void)
                    453: {
                    454:     cond_t((int32_t) T0 >= 0);
                    455:     RETURN();
                    456: }
                    457: 
                    458: void OPPROTO op_jmp_T0(void)
                    459: {
                    460:     env->delayed_pc = T0;
                    461:     set_flag(DELAY_SLOT);
                    462:     RETURN();
                    463: }
                    464: 
                    465: void OPPROTO op_movl_rN_rN(void)
                    466: {
                    467:     env->gregs[PARAM2] = env->gregs[PARAM1];
                    468:     RETURN();
                    469: }
                    470: 
                    471: void OPPROTO op_ldcl_rMplus_rN_bank(void)
                    472: {
                    473:     env->gregs[PARAM2] = env->gregs[PARAM1];
                    474:     env->gregs[PARAM1] += 4;
                    475:     RETURN();
                    476: }
                    477: 
1.1.1.2 ! root      478: void OPPROTO op_ldc_T0_sr(void)
        !           479: {
        !           480:     env->sr = T0 & 0x700083f3;
        !           481:     RETURN();
        !           482: }
        !           483: 
        !           484: void OPPROTO op_stc_sr_T0(void)
        !           485: {
        !           486:     T0 = env->sr;
        !           487:     RETURN();
        !           488: }
        !           489: 
1.1       root      490: #define LDSTOPS(target,load,store) \
                    491: void OPPROTO op_##load##_T0_##target (void) \
                    492: { env ->target = T0;   RETURN(); \
                    493: } \
                    494: void OPPROTO op_##store##_##target##_T0 (void) \
                    495: { T0 = env->target;   RETURN(); \
                    496: } \
                    497: 
                    498:     LDSTOPS(gbr, ldc, stc)
                    499:     LDSTOPS(vbr, ldc, stc)
                    500:     LDSTOPS(ssr, ldc, stc)
                    501:     LDSTOPS(spc, ldc, stc)
                    502:     LDSTOPS(sgr, ldc, stc)
                    503:     LDSTOPS(dbr, ldc, stc)
                    504:     LDSTOPS(mach, lds, sts)
                    505:     LDSTOPS(macl, lds, sts)
                    506:     LDSTOPS(pr, lds, sts)
1.1.1.2 ! root      507:     LDSTOPS(fpul, lds, sts)
        !           508: 
        !           509: void OPPROTO op_lds_T0_fpscr(void)
        !           510: {
        !           511:     env->fpscr = T0 & 0x003fffff;
        !           512:     RETURN();
        !           513: }
        !           514: 
        !           515: void OPPROTO op_sts_fpscr_T0(void)
        !           516: {
        !           517:     T0 = env->fpscr & 0x003fffff;
        !           518:     RETURN();
        !           519: }
1.1       root      520: 
                    521: void OPPROTO op_movt_rN(void)
                    522: {
                    523:     env->gregs[PARAM1] = env->sr & SR_T;
                    524:     RETURN();
                    525: }
                    526: 
                    527: void OPPROTO op_rotcl_Rn(void)
                    528: {
                    529:     helper_rotcl(&env->gregs[PARAM1]);
                    530:     RETURN();
                    531: }
                    532: 
                    533: void OPPROTO op_rotcr_Rn(void)
                    534: {
                    535:     helper_rotcr(&env->gregs[PARAM1]);
                    536:     RETURN();
                    537: }
                    538: 
                    539: void OPPROTO op_rotl_Rn(void)
                    540: {
                    541:     cond_t(env->gregs[PARAM1] & 0x80000000);
                    542:     env->gregs[PARAM1] = (env->gregs[PARAM1] << 1) | (env->sr & SR_T);
                    543:     RETURN();
                    544: }
                    545: 
                    546: void OPPROTO op_rotr_Rn(void)
                    547: {
                    548:     cond_t(env->gregs[PARAM1] & 1);
                    549:     env->gregs[PARAM1] = (env->gregs[PARAM1] >> 1) |
                    550:        ((env->sr & SR_T) ? 0x80000000 : 0);
                    551:     RETURN();
                    552: }
                    553: 
                    554: void OPPROTO op_shal_Rn(void)
                    555: {
                    556:     cond_t(env->gregs[PARAM1] & 0x80000000);
                    557:     env->gregs[PARAM1] <<= 1;
                    558:     RETURN();
                    559: }
                    560: 
                    561: void OPPROTO op_shar_Rn(void)
                    562: {
                    563:     cond_t(env->gregs[PARAM1] & 1);
                    564:     *(int32_t *) & env->gregs[PARAM1] >>= 1;
                    565:     RETURN();
                    566: }
                    567: 
                    568: void OPPROTO op_shlr_Rn(void)
                    569: {
                    570:     cond_t(env->gregs[PARAM1] & 1);
                    571:     *(uint32_t *) & env->gregs[PARAM1] >>= 1;
                    572:     RETURN();
                    573: }
                    574: 
                    575: void OPPROTO op_shll2_Rn(void)
                    576: {
                    577:     env->gregs[PARAM1] <<= 2;
                    578:     RETURN();
                    579: }
                    580: 
                    581: void OPPROTO op_shll8_Rn(void)
                    582: {
                    583:     env->gregs[PARAM1] <<= 8;
                    584:     RETURN();
                    585: }
                    586: 
                    587: void OPPROTO op_shll16_Rn(void)
                    588: {
                    589:     env->gregs[PARAM1] <<= 16;
                    590:     RETURN();
                    591: }
                    592: 
                    593: void OPPROTO op_shlr2_Rn(void)
                    594: {
                    595:     *(uint32_t *) & env->gregs[PARAM1] >>= 2;
                    596:     RETURN();
                    597: }
                    598: 
                    599: void OPPROTO op_shlr8_Rn(void)
                    600: {
                    601:     *(uint32_t *) & env->gregs[PARAM1] >>= 8;
                    602:     RETURN();
                    603: }
                    604: 
                    605: void OPPROTO op_shlr16_Rn(void)
                    606: {
                    607:     *(uint32_t *) & env->gregs[PARAM1] >>= 16;
                    608:     RETURN();
                    609: }
                    610: 
                    611: void OPPROTO op_tasb_rN(void)
                    612: {
                    613:     cond_t(*(int8_t *) env->gregs[PARAM1] == 0);
                    614:     *(int8_t *) env->gregs[PARAM1] |= 0x80;
                    615:     RETURN();
                    616: }
                    617: 
                    618: void OPPROTO op_movl_T0_rN(void)
                    619: {
                    620:     env->gregs[PARAM1] = T0;
                    621:     RETURN();
                    622: }
                    623: 
                    624: void OPPROTO op_movl_T1_rN(void)
                    625: {
                    626:     env->gregs[PARAM1] = T1;
                    627:     RETURN();
                    628: }
                    629: 
                    630: void OPPROTO op_movb_rN_T0(void)
                    631: {
                    632:     T0 = (int32_t) (int8_t) (env->gregs[PARAM1] & 0xff);
                    633:     RETURN();
                    634: }
                    635: 
                    636: void OPPROTO op_movub_rN_T0(void)
                    637: {
                    638:     T0 = env->gregs[PARAM1] & 0xff;
                    639:     RETURN();
                    640: }
                    641: 
                    642: void OPPROTO op_movw_rN_T0(void)
                    643: {
                    644:     T0 = (int32_t) (int16_t) (env->gregs[PARAM1] & 0xffff);
                    645:     RETURN();
                    646: }
                    647: 
                    648: void OPPROTO op_movuw_rN_T0(void)
                    649: {
                    650:     T0 = env->gregs[PARAM1] & 0xffff;
                    651:     RETURN();
                    652: }
                    653: 
                    654: void OPPROTO op_movl_rN_T0(void)
                    655: {
                    656:     T0 = env->gregs[PARAM1];
                    657:     RETURN();
                    658: }
                    659: 
                    660: void OPPROTO op_movb_rN_T1(void)
                    661: {
                    662:     T1 = (int32_t) (int8_t) (env->gregs[PARAM1] & 0xff);
                    663:     RETURN();
                    664: }
                    665: 
                    666: void OPPROTO op_movub_rN_T1(void)
                    667: {
                    668:     T1 = env->gregs[PARAM1] & 0xff;
                    669:     RETURN();
                    670: }
                    671: 
                    672: void OPPROTO op_movw_rN_T1(void)
                    673: {
                    674:     T1 = (int32_t) (int16_t) (env->gregs[PARAM1] & 0xffff);
                    675:     RETURN();
                    676: }
                    677: 
                    678: void OPPROTO op_movuw_rN_T1(void)
                    679: {
                    680:     T1 = env->gregs[PARAM1] & 0xffff;
                    681:     RETURN();
                    682: }
                    683: 
                    684: void OPPROTO op_movl_rN_T1(void)
                    685: {
                    686:     T1 = env->gregs[PARAM1];
                    687:     RETURN();
                    688: }
                    689: 
                    690: void OPPROTO op_movl_imm_rN(void)
                    691: {
                    692:     env->gregs[PARAM2] = PARAM1;
                    693:     RETURN();
                    694: }
                    695: 
1.1.1.2 ! root      696: void OPPROTO op_fmov_frN_FT0(void)
        !           697: {
        !           698:     FT0 = *(float32 *)&env->fregs[PARAM1];
        !           699:     RETURN();
        !           700: }
        !           701: 
        !           702: void OPPROTO op_fmov_drN_DT0(void)
        !           703: {
        !           704:     DT0 = *(float64 *)&env->fregs[PARAM1];
        !           705:     RETURN();
        !           706: }
        !           707: 
        !           708: void OPPROTO op_fmov_FT0_frN(void)
        !           709: {
        !           710:     *(float32 *)&env->fregs[PARAM1] = FT0;
        !           711:     RETURN();
        !           712: }
        !           713: 
        !           714: void OPPROTO op_fmov_DT0_drN(void)
        !           715: {
        !           716:     *(float64 *)&env->fregs[PARAM1] = DT0;
        !           717:     RETURN();
        !           718: }
        !           719: 
1.1       root      720: void OPPROTO op_dec1_rN(void)
                    721: {
                    722:     env->gregs[PARAM1] -= 1;
                    723:     RETURN();
                    724: }
                    725: 
                    726: void OPPROTO op_dec2_rN(void)
                    727: {
                    728:     env->gregs[PARAM1] -= 2;
                    729:     RETURN();
                    730: }
                    731: 
                    732: void OPPROTO op_dec4_rN(void)
                    733: {
                    734:     env->gregs[PARAM1] -= 4;
                    735:     RETURN();
                    736: }
                    737: 
1.1.1.2 ! root      738: void OPPROTO op_dec8_rN(void)
        !           739: {
        !           740:     env->gregs[PARAM1] -= 4;
        !           741:     RETURN();
        !           742: }
        !           743: 
1.1       root      744: void OPPROTO op_inc1_rN(void)
                    745: {
                    746:     env->gregs[PARAM1] += 1;
                    747:     RETURN();
                    748: }
                    749: 
                    750: void OPPROTO op_inc2_rN(void)
                    751: {
                    752:     env->gregs[PARAM1] += 2;
                    753:     RETURN();
                    754: }
                    755: 
                    756: void OPPROTO op_inc4_rN(void)
                    757: {
                    758:     env->gregs[PARAM1] += 4;
                    759:     RETURN();
                    760: }
                    761: 
1.1.1.2 ! root      762: void OPPROTO op_inc8_rN(void)
        !           763: {
        !           764:     env->gregs[PARAM1] += 4;
        !           765:     RETURN();
        !           766: }
        !           767: 
1.1       root      768: void OPPROTO op_add_T0_rN(void)
                    769: {
                    770:     env->gregs[PARAM1] += T0;
                    771:     RETURN();
                    772: }
                    773: 
                    774: void OPPROTO op_sub_T0_rN(void)
                    775: {
                    776:     env->gregs[PARAM1] -= T0;
                    777:     RETURN();
                    778: }
                    779: 
                    780: void OPPROTO op_and_T0_rN(void)
                    781: {
                    782:     env->gregs[PARAM1] &= T0;
                    783:     RETURN();
                    784: }
                    785: 
                    786: void OPPROTO op_or_T0_rN(void)
                    787: {
                    788:     env->gregs[PARAM1] |= T0;
                    789:     RETURN();
                    790: }
                    791: 
                    792: void OPPROTO op_xor_T0_rN(void)
                    793: {
                    794:     env->gregs[PARAM1] ^= T0;
                    795:     RETURN();
                    796: }
                    797: 
                    798: void OPPROTO op_add_rN_T0(void)
                    799: {
                    800:     T0 += env->gregs[PARAM1];
                    801:     RETURN();
                    802: }
                    803: 
                    804: void OPPROTO op_add_rN_T1(void)
                    805: {
                    806:     T1 += env->gregs[PARAM1];
                    807:     RETURN();
                    808: }
                    809: 
                    810: void OPPROTO op_add_imm_rN(void)
                    811: {
                    812:     env->gregs[PARAM2] += PARAM1;
                    813:     RETURN();
                    814: }
                    815: 
                    816: void OPPROTO op_and_imm_rN(void)
                    817: {
                    818:     env->gregs[PARAM2] &= PARAM1;
                    819:     RETURN();
                    820: }
                    821: 
                    822: void OPPROTO op_or_imm_rN(void)
                    823: {
                    824:     env->gregs[PARAM2] |= PARAM1;
                    825:     RETURN();
                    826: }
                    827: 
                    828: void OPPROTO op_xor_imm_rN(void)
                    829: {
                    830:     env->gregs[PARAM2] ^= PARAM1;
                    831:     RETURN();
                    832: }
                    833: 
                    834: void OPPROTO op_dt_rN(void)
                    835: {
                    836:     cond_t((--env->gregs[PARAM1]) == 0);
                    837:     RETURN();
                    838: }
                    839: 
                    840: void OPPROTO op_tst_imm_rN(void)
                    841: {
                    842:     cond_t((env->gregs[PARAM2] & PARAM1) == 0);
                    843:     RETURN();
                    844: }
                    845: 
                    846: void OPPROTO op_movl_T0_T1(void)
                    847: {
                    848:     T1 = T0;
                    849:     RETURN();
                    850: }
                    851: 
1.1.1.2 ! root      852: void OPPROTO op_movl_fpul_FT0(void)
        !           853: {
        !           854:     FT0 = *(float32 *)&env->fpul;
        !           855:     RETURN();
        !           856: }
        !           857: 
        !           858: void OPPROTO op_movl_FT0_fpul(void)
        !           859: {
        !           860:     *(float32 *)&env->fpul = FT0;
        !           861:     RETURN();
        !           862: }
        !           863: 
1.1       root      864: void OPPROTO op_goto_tb0(void)
                    865: {
                    866:     GOTO_TB(op_goto_tb0, PARAM1, 0);
                    867:     RETURN();
                    868: }
                    869: 
                    870: void OPPROTO op_goto_tb1(void)
                    871: {
                    872:     GOTO_TB(op_goto_tb1, PARAM1, 1);
                    873:     RETURN();
                    874: }
                    875: 
                    876: void OPPROTO op_movl_imm_PC(void)
                    877: {
                    878:     env->pc = PARAM1;
                    879:     RETURN();
                    880: }
                    881: 
                    882: void OPPROTO op_jT(void)
                    883: {
                    884:     if (env->sr & SR_T)
                    885:        GOTO_LABEL_PARAM(1);
                    886:     RETURN();
                    887: }
                    888: 
1.1.1.2 ! root      889: void OPPROTO op_jdelayed(void)
1.1       root      890: {
1.1.1.2 ! root      891:     uint32_t flags;
        !           892:     flags = env->flags;
        !           893:     env->flags &= ~(DELAY_SLOT | DELAY_SLOT_CONDITIONAL);
        !           894:     if (flags & DELAY_SLOT)
1.1       root      895:        GOTO_LABEL_PARAM(1);
                    896:     RETURN();
                    897: }
                    898: 
                    899: void OPPROTO op_movl_delayed_pc_PC(void)
                    900: {
                    901:     env->pc = env->delayed_pc;
                    902:     RETURN();
                    903: }
                    904: 
                    905: void OPPROTO op_addl_GBR_T0(void)
                    906: {
                    907:     T0 += env->gbr;
                    908:     RETURN();
                    909: }
                    910: 
                    911: void OPPROTO op_and_imm_T0(void)
                    912: {
                    913:     T0 &= PARAM1;
                    914:     RETURN();
                    915: }
                    916: 
                    917: void OPPROTO op_or_imm_T0(void)
                    918: {
                    919:     T0 |= PARAM1;
                    920:     RETURN();
                    921: }
                    922: 
                    923: void OPPROTO op_xor_imm_T0(void)
                    924: {
                    925:     T0 ^= PARAM1;
                    926:     RETURN();
                    927: }
                    928: 
                    929: void OPPROTO op_tst_imm_T0(void)
                    930: {
                    931:     cond_t((T0 & PARAM1) == 0);
                    932:     RETURN();
                    933: }
                    934: 
                    935: void OPPROTO op_raise_illegal_instruction(void)
                    936: {
                    937:     env->exception_index = 0x180;
                    938:     do_raise_exception();
                    939:     RETURN();
                    940: }
                    941: 
                    942: void OPPROTO op_raise_slot_illegal_instruction(void)
                    943: {
                    944:     env->exception_index = 0x1a0;
                    945:     do_raise_exception();
                    946:     RETURN();
                    947: }
                    948: 
                    949: void OPPROTO op_debug(void)
                    950: {
                    951:     env->exception_index = EXCP_DEBUG;
                    952:     cpu_loop_exit();
                    953: }
                    954: 
                    955: /* Load and store */
                    956: #define MEMSUFFIX _raw
                    957: #include "op_mem.c"
                    958: #undef MEMSUFFIX
                    959: #if !defined(CONFIG_USER_ONLY)
                    960: #define MEMSUFFIX _user
                    961: #include "op_mem.c"
                    962: #undef MEMSUFFIX
                    963: 
                    964: #define MEMSUFFIX _kernel
                    965: #include "op_mem.c"
                    966: #undef MEMSUFFIX
                    967: #endif

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.