Commit 7385ac0ba2456159a52b9b2cbb5f6c71921d0c23
1 parent
d8a5950a
Use the standard ASE check for MIPS-3D and MT.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3427 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
3 changed files
with
80 additions
and
93 deletions
target-mips/mips-defs.h
target-mips/translate.c
| ... | ... | @@ -749,12 +749,6 @@ static always_inline void check_cp1_64bitmode(DisasContext *ctx) |
| 749 | 749 | generate_exception(ctx, EXCP_RI); |
| 750 | 750 | } |
| 751 | 751 | |
| 752 | -static always_inline void check_cp1_3d(CPUState *env, DisasContext *ctx) | |
| 753 | -{ | |
| 754 | - if (unlikely(!(env->fpu->fcr0 & (1 << FCR0_3D)))) | |
| 755 | - generate_exception(ctx, EXCP_RI); | |
| 756 | -} | |
| 757 | - | |
| 758 | 752 | /* |
| 759 | 753 | * Verify if floating point register is valid; an operation is not defined |
| 760 | 754 | * if bit 0 of any register specification is set and the FR bit in the |
| ... | ... | @@ -780,14 +774,6 @@ static always_inline void check_insn(CPUState *env, DisasContext *ctx, int flags |
| 780 | 774 | generate_exception(ctx, EXCP_RI); |
| 781 | 775 | } |
| 782 | 776 | |
| 783 | -/* This code generates a "reserved instruction" exception if the | |
| 784 | - CPU is not MIPS MT capable. */ | |
| 785 | -static always_inline void check_mips_mt(CPUState *env, DisasContext *ctx) | |
| 786 | -{ | |
| 787 | - if (unlikely(!(env->CP0_Config3 & (1 << CP0C3_MT)))) | |
| 788 | - generate_exception(ctx, EXCP_RI); | |
| 789 | -} | |
| 790 | - | |
| 791 | 777 | /* This code generates a "reserved instruction" exception if 64-bit |
| 792 | 778 | instructions are not enabled. */ |
| 793 | 779 | static always_inline void check_mips_64(DisasContext *ctx) |
| ... | ... | @@ -1971,17 +1957,17 @@ static void gen_mfc0 (CPUState *env, DisasContext *ctx, int reg, int sel) |
| 1971 | 1957 | rn = "Index"; |
| 1972 | 1958 | break; |
| 1973 | 1959 | case 1: |
| 1974 | - check_mips_mt(env, ctx); | |
| 1960 | + check_insn(env, ctx, ASE_MT); | |
| 1975 | 1961 | gen_op_mfc0_mvpcontrol(); |
| 1976 | 1962 | rn = "MVPControl"; |
| 1977 | 1963 | break; |
| 1978 | 1964 | case 2: |
| 1979 | - check_mips_mt(env, ctx); | |
| 1965 | + check_insn(env, ctx, ASE_MT); | |
| 1980 | 1966 | gen_op_mfc0_mvpconf0(); |
| 1981 | 1967 | rn = "MVPConf0"; |
| 1982 | 1968 | break; |
| 1983 | 1969 | case 3: |
| 1984 | - check_mips_mt(env, ctx); | |
| 1970 | + check_insn(env, ctx, ASE_MT); | |
| 1985 | 1971 | gen_op_mfc0_mvpconf1(); |
| 1986 | 1972 | rn = "MVPConf1"; |
| 1987 | 1973 | break; |
| ... | ... | @@ -1996,37 +1982,37 @@ static void gen_mfc0 (CPUState *env, DisasContext *ctx, int reg, int sel) |
| 1996 | 1982 | rn = "Random"; |
| 1997 | 1983 | break; |
| 1998 | 1984 | case 1: |
| 1999 | - check_mips_mt(env, ctx); | |
| 1985 | + check_insn(env, ctx, ASE_MT); | |
| 2000 | 1986 | gen_op_mfc0_vpecontrol(); |
| 2001 | 1987 | rn = "VPEControl"; |
| 2002 | 1988 | break; |
| 2003 | 1989 | case 2: |
| 2004 | - check_mips_mt(env, ctx); | |
| 1990 | + check_insn(env, ctx, ASE_MT); | |
| 2005 | 1991 | gen_op_mfc0_vpeconf0(); |
| 2006 | 1992 | rn = "VPEConf0"; |
| 2007 | 1993 | break; |
| 2008 | 1994 | case 3: |
| 2009 | - check_mips_mt(env, ctx); | |
| 1995 | + check_insn(env, ctx, ASE_MT); | |
| 2010 | 1996 | gen_op_mfc0_vpeconf1(); |
| 2011 | 1997 | rn = "VPEConf1"; |
| 2012 | 1998 | break; |
| 2013 | 1999 | case 4: |
| 2014 | - check_mips_mt(env, ctx); | |
| 2000 | + check_insn(env, ctx, ASE_MT); | |
| 2015 | 2001 | gen_op_mfc0_yqmask(); |
| 2016 | 2002 | rn = "YQMask"; |
| 2017 | 2003 | break; |
| 2018 | 2004 | case 5: |
| 2019 | - check_mips_mt(env, ctx); | |
| 2005 | + check_insn(env, ctx, ASE_MT); | |
| 2020 | 2006 | gen_op_mfc0_vpeschedule(); |
| 2021 | 2007 | rn = "VPESchedule"; |
| 2022 | 2008 | break; |
| 2023 | 2009 | case 6: |
| 2024 | - check_mips_mt(env, ctx); | |
| 2010 | + check_insn(env, ctx, ASE_MT); | |
| 2025 | 2011 | gen_op_mfc0_vpeschefback(); |
| 2026 | 2012 | rn = "VPEScheFBack"; |
| 2027 | 2013 | break; |
| 2028 | 2014 | case 7: |
| 2029 | - check_mips_mt(env, ctx); | |
| 2015 | + check_insn(env, ctx, ASE_MT); | |
| 2030 | 2016 | gen_op_mfc0_vpeopt(); |
| 2031 | 2017 | rn = "VPEOpt"; |
| 2032 | 2018 | break; |
| ... | ... | @@ -2041,37 +2027,37 @@ static void gen_mfc0 (CPUState *env, DisasContext *ctx, int reg, int sel) |
| 2041 | 2027 | rn = "EntryLo0"; |
| 2042 | 2028 | break; |
| 2043 | 2029 | case 1: |
| 2044 | - check_mips_mt(env, ctx); | |
| 2030 | + check_insn(env, ctx, ASE_MT); | |
| 2045 | 2031 | gen_op_mfc0_tcstatus(); |
| 2046 | 2032 | rn = "TCStatus"; |
| 2047 | 2033 | break; |
| 2048 | 2034 | case 2: |
| 2049 | - check_mips_mt(env, ctx); | |
| 2035 | + check_insn(env, ctx, ASE_MT); | |
| 2050 | 2036 | gen_op_mfc0_tcbind(); |
| 2051 | 2037 | rn = "TCBind"; |
| 2052 | 2038 | break; |
| 2053 | 2039 | case 3: |
| 2054 | - check_mips_mt(env, ctx); | |
| 2040 | + check_insn(env, ctx, ASE_MT); | |
| 2055 | 2041 | gen_op_mfc0_tcrestart(); |
| 2056 | 2042 | rn = "TCRestart"; |
| 2057 | 2043 | break; |
| 2058 | 2044 | case 4: |
| 2059 | - check_mips_mt(env, ctx); | |
| 2045 | + check_insn(env, ctx, ASE_MT); | |
| 2060 | 2046 | gen_op_mfc0_tchalt(); |
| 2061 | 2047 | rn = "TCHalt"; |
| 2062 | 2048 | break; |
| 2063 | 2049 | case 5: |
| 2064 | - check_mips_mt(env, ctx); | |
| 2050 | + check_insn(env, ctx, ASE_MT); | |
| 2065 | 2051 | gen_op_mfc0_tccontext(); |
| 2066 | 2052 | rn = "TCContext"; |
| 2067 | 2053 | break; |
| 2068 | 2054 | case 6: |
| 2069 | - check_mips_mt(env, ctx); | |
| 2055 | + check_insn(env, ctx, ASE_MT); | |
| 2070 | 2056 | gen_op_mfc0_tcschedule(); |
| 2071 | 2057 | rn = "TCSchedule"; |
| 2072 | 2058 | break; |
| 2073 | 2059 | case 7: |
| 2074 | - check_mips_mt(env, ctx); | |
| 2060 | + check_insn(env, ctx, ASE_MT); | |
| 2075 | 2061 | gen_op_mfc0_tcschefback(); |
| 2076 | 2062 | rn = "TCScheFBack"; |
| 2077 | 2063 | break; |
| ... | ... | @@ -2539,17 +2525,17 @@ static void gen_mtc0 (CPUState *env, DisasContext *ctx, int reg, int sel) |
| 2539 | 2525 | rn = "Index"; |
| 2540 | 2526 | break; |
| 2541 | 2527 | case 1: |
| 2542 | - check_mips_mt(env, ctx); | |
| 2528 | + check_insn(env, ctx, ASE_MT); | |
| 2543 | 2529 | gen_op_mtc0_mvpcontrol(); |
| 2544 | 2530 | rn = "MVPControl"; |
| 2545 | 2531 | break; |
| 2546 | 2532 | case 2: |
| 2547 | - check_mips_mt(env, ctx); | |
| 2533 | + check_insn(env, ctx, ASE_MT); | |
| 2548 | 2534 | /* ignored */ |
| 2549 | 2535 | rn = "MVPConf0"; |
| 2550 | 2536 | break; |
| 2551 | 2537 | case 3: |
| 2552 | - check_mips_mt(env, ctx); | |
| 2538 | + check_insn(env, ctx, ASE_MT); | |
| 2553 | 2539 | /* ignored */ |
| 2554 | 2540 | rn = "MVPConf1"; |
| 2555 | 2541 | break; |
| ... | ... | @@ -2564,37 +2550,37 @@ static void gen_mtc0 (CPUState *env, DisasContext *ctx, int reg, int sel) |
| 2564 | 2550 | rn = "Random"; |
| 2565 | 2551 | break; |
| 2566 | 2552 | case 1: |
| 2567 | - check_mips_mt(env, ctx); | |
| 2553 | + check_insn(env, ctx, ASE_MT); | |
| 2568 | 2554 | gen_op_mtc0_vpecontrol(); |
| 2569 | 2555 | rn = "VPEControl"; |
| 2570 | 2556 | break; |
| 2571 | 2557 | case 2: |
| 2572 | - check_mips_mt(env, ctx); | |
| 2558 | + check_insn(env, ctx, ASE_MT); | |
| 2573 | 2559 | gen_op_mtc0_vpeconf0(); |
| 2574 | 2560 | rn = "VPEConf0"; |
| 2575 | 2561 | break; |
| 2576 | 2562 | case 3: |
| 2577 | - check_mips_mt(env, ctx); | |
| 2563 | + check_insn(env, ctx, ASE_MT); | |
| 2578 | 2564 | gen_op_mtc0_vpeconf1(); |
| 2579 | 2565 | rn = "VPEConf1"; |
| 2580 | 2566 | break; |
| 2581 | 2567 | case 4: |
| 2582 | - check_mips_mt(env, ctx); | |
| 2568 | + check_insn(env, ctx, ASE_MT); | |
| 2583 | 2569 | gen_op_mtc0_yqmask(); |
| 2584 | 2570 | rn = "YQMask"; |
| 2585 | 2571 | break; |
| 2586 | 2572 | case 5: |
| 2587 | - check_mips_mt(env, ctx); | |
| 2573 | + check_insn(env, ctx, ASE_MT); | |
| 2588 | 2574 | gen_op_mtc0_vpeschedule(); |
| 2589 | 2575 | rn = "VPESchedule"; |
| 2590 | 2576 | break; |
| 2591 | 2577 | case 6: |
| 2592 | - check_mips_mt(env, ctx); | |
| 2578 | + check_insn(env, ctx, ASE_MT); | |
| 2593 | 2579 | gen_op_mtc0_vpeschefback(); |
| 2594 | 2580 | rn = "VPEScheFBack"; |
| 2595 | 2581 | break; |
| 2596 | 2582 | case 7: |
| 2597 | - check_mips_mt(env, ctx); | |
| 2583 | + check_insn(env, ctx, ASE_MT); | |
| 2598 | 2584 | gen_op_mtc0_vpeopt(); |
| 2599 | 2585 | rn = "VPEOpt"; |
| 2600 | 2586 | break; |
| ... | ... | @@ -2609,37 +2595,37 @@ static void gen_mtc0 (CPUState *env, DisasContext *ctx, int reg, int sel) |
| 2609 | 2595 | rn = "EntryLo0"; |
| 2610 | 2596 | break; |
| 2611 | 2597 | case 1: |
| 2612 | - check_mips_mt(env, ctx); | |
| 2598 | + check_insn(env, ctx, ASE_MT); | |
| 2613 | 2599 | gen_op_mtc0_tcstatus(); |
| 2614 | 2600 | rn = "TCStatus"; |
| 2615 | 2601 | break; |
| 2616 | 2602 | case 2: |
| 2617 | - check_mips_mt(env, ctx); | |
| 2603 | + check_insn(env, ctx, ASE_MT); | |
| 2618 | 2604 | gen_op_mtc0_tcbind(); |
| 2619 | 2605 | rn = "TCBind"; |
| 2620 | 2606 | break; |
| 2621 | 2607 | case 3: |
| 2622 | - check_mips_mt(env, ctx); | |
| 2608 | + check_insn(env, ctx, ASE_MT); | |
| 2623 | 2609 | gen_op_mtc0_tcrestart(); |
| 2624 | 2610 | rn = "TCRestart"; |
| 2625 | 2611 | break; |
| 2626 | 2612 | case 4: |
| 2627 | - check_mips_mt(env, ctx); | |
| 2613 | + check_insn(env, ctx, ASE_MT); | |
| 2628 | 2614 | gen_op_mtc0_tchalt(); |
| 2629 | 2615 | rn = "TCHalt"; |
| 2630 | 2616 | break; |
| 2631 | 2617 | case 5: |
| 2632 | - check_mips_mt(env, ctx); | |
| 2618 | + check_insn(env, ctx, ASE_MT); | |
| 2633 | 2619 | gen_op_mtc0_tccontext(); |
| 2634 | 2620 | rn = "TCContext"; |
| 2635 | 2621 | break; |
| 2636 | 2622 | case 6: |
| 2637 | - check_mips_mt(env, ctx); | |
| 2623 | + check_insn(env, ctx, ASE_MT); | |
| 2638 | 2624 | gen_op_mtc0_tcschedule(); |
| 2639 | 2625 | rn = "TCSchedule"; |
| 2640 | 2626 | break; |
| 2641 | 2627 | case 7: |
| 2642 | - check_mips_mt(env, ctx); | |
| 2628 | + check_insn(env, ctx, ASE_MT); | |
| 2643 | 2629 | gen_op_mtc0_tcschefback(); |
| 2644 | 2630 | rn = "TCScheFBack"; |
| 2645 | 2631 | break; |
| ... | ... | @@ -3139,17 +3125,17 @@ static void gen_dmfc0 (CPUState *env, DisasContext *ctx, int reg, int sel) |
| 3139 | 3125 | rn = "Index"; |
| 3140 | 3126 | break; |
| 3141 | 3127 | case 1: |
| 3142 | - check_mips_mt(env, ctx); | |
| 3128 | + check_insn(env, ctx, ASE_MT); | |
| 3143 | 3129 | gen_op_mfc0_mvpcontrol(); |
| 3144 | 3130 | rn = "MVPControl"; |
| 3145 | 3131 | break; |
| 3146 | 3132 | case 2: |
| 3147 | - check_mips_mt(env, ctx); | |
| 3133 | + check_insn(env, ctx, ASE_MT); | |
| 3148 | 3134 | gen_op_mfc0_mvpconf0(); |
| 3149 | 3135 | rn = "MVPConf0"; |
| 3150 | 3136 | break; |
| 3151 | 3137 | case 3: |
| 3152 | - check_mips_mt(env, ctx); | |
| 3138 | + check_insn(env, ctx, ASE_MT); | |
| 3153 | 3139 | gen_op_mfc0_mvpconf1(); |
| 3154 | 3140 | rn = "MVPConf1"; |
| 3155 | 3141 | break; |
| ... | ... | @@ -3164,37 +3150,37 @@ static void gen_dmfc0 (CPUState *env, DisasContext *ctx, int reg, int sel) |
| 3164 | 3150 | rn = "Random"; |
| 3165 | 3151 | break; |
| 3166 | 3152 | case 1: |
| 3167 | - check_mips_mt(env, ctx); | |
| 3153 | + check_insn(env, ctx, ASE_MT); | |
| 3168 | 3154 | gen_op_mfc0_vpecontrol(); |
| 3169 | 3155 | rn = "VPEControl"; |
| 3170 | 3156 | break; |
| 3171 | 3157 | case 2: |
| 3172 | - check_mips_mt(env, ctx); | |
| 3158 | + check_insn(env, ctx, ASE_MT); | |
| 3173 | 3159 | gen_op_mfc0_vpeconf0(); |
| 3174 | 3160 | rn = "VPEConf0"; |
| 3175 | 3161 | break; |
| 3176 | 3162 | case 3: |
| 3177 | - check_mips_mt(env, ctx); | |
| 3163 | + check_insn(env, ctx, ASE_MT); | |
| 3178 | 3164 | gen_op_mfc0_vpeconf1(); |
| 3179 | 3165 | rn = "VPEConf1"; |
| 3180 | 3166 | break; |
| 3181 | 3167 | case 4: |
| 3182 | - check_mips_mt(env, ctx); | |
| 3168 | + check_insn(env, ctx, ASE_MT); | |
| 3183 | 3169 | gen_op_dmfc0_yqmask(); |
| 3184 | 3170 | rn = "YQMask"; |
| 3185 | 3171 | break; |
| 3186 | 3172 | case 5: |
| 3187 | - check_mips_mt(env, ctx); | |
| 3173 | + check_insn(env, ctx, ASE_MT); | |
| 3188 | 3174 | gen_op_dmfc0_vpeschedule(); |
| 3189 | 3175 | rn = "VPESchedule"; |
| 3190 | 3176 | break; |
| 3191 | 3177 | case 6: |
| 3192 | - check_mips_mt(env, ctx); | |
| 3178 | + check_insn(env, ctx, ASE_MT); | |
| 3193 | 3179 | gen_op_dmfc0_vpeschefback(); |
| 3194 | 3180 | rn = "VPEScheFBack"; |
| 3195 | 3181 | break; |
| 3196 | 3182 | case 7: |
| 3197 | - check_mips_mt(env, ctx); | |
| 3183 | + check_insn(env, ctx, ASE_MT); | |
| 3198 | 3184 | gen_op_mfc0_vpeopt(); |
| 3199 | 3185 | rn = "VPEOpt"; |
| 3200 | 3186 | break; |
| ... | ... | @@ -3209,37 +3195,37 @@ static void gen_dmfc0 (CPUState *env, DisasContext *ctx, int reg, int sel) |
| 3209 | 3195 | rn = "EntryLo0"; |
| 3210 | 3196 | break; |
| 3211 | 3197 | case 1: |
| 3212 | - check_mips_mt(env, ctx); | |
| 3198 | + check_insn(env, ctx, ASE_MT); | |
| 3213 | 3199 | gen_op_mfc0_tcstatus(); |
| 3214 | 3200 | rn = "TCStatus"; |
| 3215 | 3201 | break; |
| 3216 | 3202 | case 2: |
| 3217 | - check_mips_mt(env, ctx); | |
| 3203 | + check_insn(env, ctx, ASE_MT); | |
| 3218 | 3204 | gen_op_mfc0_tcbind(); |
| 3219 | 3205 | rn = "TCBind"; |
| 3220 | 3206 | break; |
| 3221 | 3207 | case 3: |
| 3222 | - check_mips_mt(env, ctx); | |
| 3208 | + check_insn(env, ctx, ASE_MT); | |
| 3223 | 3209 | gen_op_dmfc0_tcrestart(); |
| 3224 | 3210 | rn = "TCRestart"; |
| 3225 | 3211 | break; |
| 3226 | 3212 | case 4: |
| 3227 | - check_mips_mt(env, ctx); | |
| 3213 | + check_insn(env, ctx, ASE_MT); | |
| 3228 | 3214 | gen_op_dmfc0_tchalt(); |
| 3229 | 3215 | rn = "TCHalt"; |
| 3230 | 3216 | break; |
| 3231 | 3217 | case 5: |
| 3232 | - check_mips_mt(env, ctx); | |
| 3218 | + check_insn(env, ctx, ASE_MT); | |
| 3233 | 3219 | gen_op_dmfc0_tccontext(); |
| 3234 | 3220 | rn = "TCContext"; |
| 3235 | 3221 | break; |
| 3236 | 3222 | case 6: |
| 3237 | - check_mips_mt(env, ctx); | |
| 3223 | + check_insn(env, ctx, ASE_MT); | |
| 3238 | 3224 | gen_op_dmfc0_tcschedule(); |
| 3239 | 3225 | rn = "TCSchedule"; |
| 3240 | 3226 | break; |
| 3241 | 3227 | case 7: |
| 3242 | - check_mips_mt(env, ctx); | |
| 3228 | + check_insn(env, ctx, ASE_MT); | |
| 3243 | 3229 | gen_op_dmfc0_tcschefback(); |
| 3244 | 3230 | rn = "TCScheFBack"; |
| 3245 | 3231 | break; |
| ... | ... | @@ -3696,17 +3682,17 @@ static void gen_dmtc0 (CPUState *env, DisasContext *ctx, int reg, int sel) |
| 3696 | 3682 | rn = "Index"; |
| 3697 | 3683 | break; |
| 3698 | 3684 | case 1: |
| 3699 | - check_mips_mt(env, ctx); | |
| 3685 | + check_insn(env, ctx, ASE_MT); | |
| 3700 | 3686 | gen_op_mtc0_mvpcontrol(); |
| 3701 | 3687 | rn = "MVPControl"; |
| 3702 | 3688 | break; |
| 3703 | 3689 | case 2: |
| 3704 | - check_mips_mt(env, ctx); | |
| 3690 | + check_insn(env, ctx, ASE_MT); | |
| 3705 | 3691 | /* ignored */ |
| 3706 | 3692 | rn = "MVPConf0"; |
| 3707 | 3693 | break; |
| 3708 | 3694 | case 3: |
| 3709 | - check_mips_mt(env, ctx); | |
| 3695 | + check_insn(env, ctx, ASE_MT); | |
| 3710 | 3696 | /* ignored */ |
| 3711 | 3697 | rn = "MVPConf1"; |
| 3712 | 3698 | break; |
| ... | ... | @@ -3721,37 +3707,37 @@ static void gen_dmtc0 (CPUState *env, DisasContext *ctx, int reg, int sel) |
| 3721 | 3707 | rn = "Random"; |
| 3722 | 3708 | break; |
| 3723 | 3709 | case 1: |
| 3724 | - check_mips_mt(env, ctx); | |
| 3710 | + check_insn(env, ctx, ASE_MT); | |
| 3725 | 3711 | gen_op_mtc0_vpecontrol(); |
| 3726 | 3712 | rn = "VPEControl"; |
| 3727 | 3713 | break; |
| 3728 | 3714 | case 2: |
| 3729 | - check_mips_mt(env, ctx); | |
| 3715 | + check_insn(env, ctx, ASE_MT); | |
| 3730 | 3716 | gen_op_mtc0_vpeconf0(); |
| 3731 | 3717 | rn = "VPEConf0"; |
| 3732 | 3718 | break; |
| 3733 | 3719 | case 3: |
| 3734 | - check_mips_mt(env, ctx); | |
| 3720 | + check_insn(env, ctx, ASE_MT); | |
| 3735 | 3721 | gen_op_mtc0_vpeconf1(); |
| 3736 | 3722 | rn = "VPEConf1"; |
| 3737 | 3723 | break; |
| 3738 | 3724 | case 4: |
| 3739 | - check_mips_mt(env, ctx); | |
| 3725 | + check_insn(env, ctx, ASE_MT); | |
| 3740 | 3726 | gen_op_mtc0_yqmask(); |
| 3741 | 3727 | rn = "YQMask"; |
| 3742 | 3728 | break; |
| 3743 | 3729 | case 5: |
| 3744 | - check_mips_mt(env, ctx); | |
| 3730 | + check_insn(env, ctx, ASE_MT); | |
| 3745 | 3731 | gen_op_mtc0_vpeschedule(); |
| 3746 | 3732 | rn = "VPESchedule"; |
| 3747 | 3733 | break; |
| 3748 | 3734 | case 6: |
| 3749 | - check_mips_mt(env, ctx); | |
| 3735 | + check_insn(env, ctx, ASE_MT); | |
| 3750 | 3736 | gen_op_mtc0_vpeschefback(); |
| 3751 | 3737 | rn = "VPEScheFBack"; |
| 3752 | 3738 | break; |
| 3753 | 3739 | case 7: |
| 3754 | - check_mips_mt(env, ctx); | |
| 3740 | + check_insn(env, ctx, ASE_MT); | |
| 3755 | 3741 | gen_op_mtc0_vpeopt(); |
| 3756 | 3742 | rn = "VPEOpt"; |
| 3757 | 3743 | break; |
| ... | ... | @@ -3766,37 +3752,37 @@ static void gen_dmtc0 (CPUState *env, DisasContext *ctx, int reg, int sel) |
| 3766 | 3752 | rn = "EntryLo0"; |
| 3767 | 3753 | break; |
| 3768 | 3754 | case 1: |
| 3769 | - check_mips_mt(env, ctx); | |
| 3755 | + check_insn(env, ctx, ASE_MT); | |
| 3770 | 3756 | gen_op_mtc0_tcstatus(); |
| 3771 | 3757 | rn = "TCStatus"; |
| 3772 | 3758 | break; |
| 3773 | 3759 | case 2: |
| 3774 | - check_mips_mt(env, ctx); | |
| 3760 | + check_insn(env, ctx, ASE_MT); | |
| 3775 | 3761 | gen_op_mtc0_tcbind(); |
| 3776 | 3762 | rn = "TCBind"; |
| 3777 | 3763 | break; |
| 3778 | 3764 | case 3: |
| 3779 | - check_mips_mt(env, ctx); | |
| 3765 | + check_insn(env, ctx, ASE_MT); | |
| 3780 | 3766 | gen_op_mtc0_tcrestart(); |
| 3781 | 3767 | rn = "TCRestart"; |
| 3782 | 3768 | break; |
| 3783 | 3769 | case 4: |
| 3784 | - check_mips_mt(env, ctx); | |
| 3770 | + check_insn(env, ctx, ASE_MT); | |
| 3785 | 3771 | gen_op_mtc0_tchalt(); |
| 3786 | 3772 | rn = "TCHalt"; |
| 3787 | 3773 | break; |
| 3788 | 3774 | case 5: |
| 3789 | - check_mips_mt(env, ctx); | |
| 3775 | + check_insn(env, ctx, ASE_MT); | |
| 3790 | 3776 | gen_op_mtc0_tccontext(); |
| 3791 | 3777 | rn = "TCContext"; |
| 3792 | 3778 | break; |
| 3793 | 3779 | case 6: |
| 3794 | - check_mips_mt(env, ctx); | |
| 3780 | + check_insn(env, ctx, ASE_MT); | |
| 3795 | 3781 | gen_op_mtc0_tcschedule(); |
| 3796 | 3782 | rn = "TCSchedule"; |
| 3797 | 3783 | break; |
| 3798 | 3784 | case 7: |
| 3799 | - check_mips_mt(env, ctx); | |
| 3785 | + check_insn(env, ctx, ASE_MT); | |
| 3800 | 3786 | gen_op_mtc0_tcschefback(); |
| 3801 | 3787 | rn = "TCScheFBack"; |
| 3802 | 3788 | break; |
| ... | ... | @@ -4636,7 +4622,7 @@ static void gen_cp0 (CPUState *env, DisasContext *ctx, uint32_t opc, int rt, int |
| 4636 | 4622 | break; |
| 4637 | 4623 | #endif |
| 4638 | 4624 | case OPC_MFTR: |
| 4639 | - check_mips_mt(env, ctx); | |
| 4625 | + check_insn(env, ctx, ASE_MT); | |
| 4640 | 4626 | if (rd == 0) { |
| 4641 | 4627 | /* Treat as NOP. */ |
| 4642 | 4628 | return; |
| ... | ... | @@ -4647,7 +4633,7 @@ static void gen_cp0 (CPUState *env, DisasContext *ctx, uint32_t opc, int rt, int |
| 4647 | 4633 | opn = "mftr"; |
| 4648 | 4634 | break; |
| 4649 | 4635 | case OPC_MTTR: |
| 4650 | - check_mips_mt(env, ctx); | |
| 4636 | + check_insn(env, ctx, ASE_MT); | |
| 4651 | 4637 | GEN_LOAD_REG_TN(T0, rt); |
| 4652 | 4638 | gen_mttr(env, ctx, rd, (ctx->opcode >> 5) & 1, |
| 4653 | 4639 | ctx->opcode & 0x7, (ctx->opcode >> 4) & 1); |
| ... | ... | @@ -5893,7 +5879,6 @@ static void gen_flt3_arith (DisasContext *ctx, uint32_t opc, |
| 5893 | 5879 | #if defined(TARGET_MIPSN32) || defined(TARGET_MIPS64) |
| 5894 | 5880 | |
| 5895 | 5881 | /* MDMX extension to MIPS64 */ |
| 5896 | -/* MIPS-3D extension to MIPS64 */ | |
| 5897 | 5882 | |
| 5898 | 5883 | #endif |
| 5899 | 5884 | |
| ... | ... | @@ -6133,13 +6118,13 @@ static void decode_opc (CPUState *env, DisasContext *ctx) |
| 6133 | 6118 | GEN_STORE_TN_REG(rt, T0); |
| 6134 | 6119 | break; |
| 6135 | 6120 | case OPC_FORK: |
| 6136 | - check_mips_mt(env, ctx); | |
| 6121 | + check_insn(env, ctx, ASE_MT); | |
| 6137 | 6122 | GEN_LOAD_REG_TN(T0, rt); |
| 6138 | 6123 | GEN_LOAD_REG_TN(T1, rs); |
| 6139 | 6124 | gen_op_fork(); |
| 6140 | 6125 | break; |
| 6141 | 6126 | case OPC_YIELD: |
| 6142 | - check_mips_mt(env, ctx); | |
| 6127 | + check_insn(env, ctx, ASE_MT); | |
| 6143 | 6128 | GEN_LOAD_REG_TN(T0, rs); |
| 6144 | 6129 | gen_op_yield(); |
| 6145 | 6130 | GEN_STORE_TN_REG(rd, T0); |
| ... | ... | @@ -6219,19 +6204,19 @@ static void decode_opc (CPUState *env, DisasContext *ctx) |
| 6219 | 6204 | op2 = MASK_MFMC0(ctx->opcode); |
| 6220 | 6205 | switch (op2) { |
| 6221 | 6206 | case OPC_DMT: |
| 6222 | - check_mips_mt(env, ctx); | |
| 6207 | + check_insn(env, ctx, ASE_MT); | |
| 6223 | 6208 | gen_op_dmt(); |
| 6224 | 6209 | break; |
| 6225 | 6210 | case OPC_EMT: |
| 6226 | - check_mips_mt(env, ctx); | |
| 6211 | + check_insn(env, ctx, ASE_MT); | |
| 6227 | 6212 | gen_op_emt(); |
| 6228 | 6213 | break; |
| 6229 | 6214 | case OPC_DVPE: |
| 6230 | - check_mips_mt(env, ctx); | |
| 6215 | + check_insn(env, ctx, ASE_MT); | |
| 6231 | 6216 | gen_op_dvpe(); |
| 6232 | 6217 | break; |
| 6233 | 6218 | case OPC_EVPE: |
| 6234 | - check_mips_mt(env, ctx); | |
| 6219 | + check_insn(env, ctx, ASE_MT); | |
| 6235 | 6220 | gen_op_evpe(); |
| 6236 | 6221 | break; |
| 6237 | 6222 | case OPC_DI: |
| ... | ... | @@ -6336,7 +6321,7 @@ static void decode_opc (CPUState *env, DisasContext *ctx) |
| 6336 | 6321 | #endif |
| 6337 | 6322 | case OPC_BC1ANY2: |
| 6338 | 6323 | case OPC_BC1ANY4: |
| 6339 | - check_cp1_3d(env, ctx); | |
| 6324 | + check_insn(env, ctx, ASE_MIPS3D); | |
| 6340 | 6325 | /* fall through */ |
| 6341 | 6326 | case OPC_BC1: |
| 6342 | 6327 | gen_compute_branch1(env, ctx, MASK_BC1(ctx->opcode), | ... | ... |
target-mips/translate_init.c
| ... | ... | @@ -199,7 +199,7 @@ static mips_def_t mips_defs[] = |
| 199 | 199 | .CP0_SRSConf4_rw_bitmask = 0x3fffffff, |
| 200 | 200 | .CP0_SRSConf4 = (0x3fe << CP0SRSC4_SRS15) | |
| 201 | 201 | (0x3fe << CP0SRSC4_SRS14) | (0x3fe << CP0SRSC4_SRS13), |
| 202 | - .insn_flags = CPU_MIPS32R2 | ASE_MIPS16 | ASE_DSP, | |
| 202 | + .insn_flags = CPU_MIPS32R2 | ASE_MIPS16 | ASE_DSP | ASE_MT, | |
| 203 | 203 | }, |
| 204 | 204 | #if defined(TARGET_MIPSN32) || defined(TARGET_MIPS64) |
| 205 | 205 | { | ... | ... |