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

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

unix.superglobalmegacorp.com

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