Revision 9c2149c8 target-mips/translate.c
b/target-mips/translate.c | ||
---|---|---|
2827 | 2827 |
generate_exception(ctx, EXCP_RI); |
2828 | 2828 |
} |
2829 | 2829 |
|
2830 |
static void gen_dmfc0 (DisasContext *ctx, int reg, int sel) |
|
2831 |
{ |
|
2832 |
const char *rn = "invalid"; |
|
2833 |
|
|
2834 |
switch (reg) { |
|
2835 |
case 0: |
|
2836 |
switch (sel) { |
|
2837 |
case 0: |
|
2838 |
gen_op_mfc0_index(); |
|
2839 |
rn = "Index"; |
|
2840 |
break; |
|
2841 |
case 1: |
|
2842 |
// gen_op_dmfc0_mvpcontrol(); /* MT ASE */ |
|
2843 |
rn = "MVPControl"; |
|
2844 |
// break; |
|
2845 |
case 2: |
|
2846 |
// gen_op_dmfc0_mvpconf0(); /* MT ASE */ |
|
2847 |
rn = "MVPConf0"; |
|
2848 |
// break; |
|
2849 |
case 3: |
|
2850 |
// gen_op_dmfc0_mvpconf1(); /* MT ASE */ |
|
2851 |
rn = "MVPConf1"; |
|
2852 |
// break; |
|
2853 |
default: |
|
2854 |
goto die; |
|
2855 |
} |
|
2856 |
break; |
|
2857 |
case 1: |
|
2858 |
switch (sel) { |
|
2859 |
case 0: |
|
2860 |
gen_op_mfc0_random(); |
|
2861 |
rn = "Random"; |
|
2862 |
break; |
|
2863 |
case 1: |
|
2864 |
// gen_op_dmfc0_vpecontrol(); /* MT ASE */ |
|
2865 |
rn = "VPEControl"; |
|
2866 |
// break; |
|
2867 |
case 2: |
|
2868 |
// gen_op_dmfc0_vpeconf0(); /* MT ASE */ |
|
2869 |
rn = "VPEConf0"; |
|
2870 |
// break; |
|
2871 |
case 3: |
|
2872 |
// gen_op_dmfc0_vpeconf1(); /* MT ASE */ |
|
2873 |
rn = "VPEConf1"; |
|
2874 |
// break; |
|
2875 |
case 4: |
|
2876 |
// gen_op_dmfc0_YQMask(); /* MT ASE */ |
|
2877 |
rn = "YQMask"; |
|
2878 |
// break; |
|
2879 |
case 5: |
|
2880 |
// gen_op_dmfc0_vpeschedule(); /* MT ASE */ |
|
2881 |
rn = "VPESchedule"; |
|
2882 |
// break; |
|
2883 |
case 6: |
|
2884 |
// gen_op_dmfc0_vpeschefback(); /* MT ASE */ |
|
2885 |
rn = "VPEScheFBack"; |
|
2886 |
// break; |
|
2887 |
case 7: |
|
2888 |
// gen_op_dmfc0_vpeopt(); /* MT ASE */ |
|
2889 |
rn = "VPEOpt"; |
|
2890 |
// break; |
|
2891 |
default: |
|
2892 |
goto die; |
|
2893 |
} |
|
2894 |
break; |
|
2895 |
case 2: |
|
2896 |
switch (sel) { |
|
2897 |
case 0: |
|
2898 |
gen_op_dmfc0_entrylo0(); |
|
2899 |
rn = "EntryLo0"; |
|
2900 |
break; |
|
2901 |
case 1: |
|
2902 |
// gen_op_dmfc0_tcstatus(); /* MT ASE */ |
|
2903 |
rn = "TCStatus"; |
|
2904 |
// break; |
|
2905 |
case 2: |
|
2906 |
// gen_op_dmfc0_tcbind(); /* MT ASE */ |
|
2907 |
rn = "TCBind"; |
|
2908 |
// break; |
|
2909 |
case 3: |
|
2910 |
// gen_op_dmfc0_tcrestart(); /* MT ASE */ |
|
2911 |
rn = "TCRestart"; |
|
2912 |
// break; |
|
2913 |
case 4: |
|
2914 |
// gen_op_dmfc0_tchalt(); /* MT ASE */ |
|
2915 |
rn = "TCHalt"; |
|
2916 |
// break; |
|
2917 |
case 5: |
|
2918 |
// gen_op_dmfc0_tccontext(); /* MT ASE */ |
|
2919 |
rn = "TCContext"; |
|
2920 |
// break; |
|
2921 |
case 6: |
|
2922 |
// gen_op_dmfc0_tcschedule(); /* MT ASE */ |
|
2923 |
rn = "TCSchedule"; |
|
2924 |
// break; |
|
2925 |
case 7: |
|
2926 |
// gen_op_dmfc0_tcschefback(); /* MT ASE */ |
|
2927 |
rn = "TCScheFBack"; |
|
2928 |
// break; |
|
2929 |
default: |
|
2930 |
goto die; |
|
2931 |
} |
|
2932 |
break; |
|
2933 |
case 3: |
|
2934 |
switch (sel) { |
|
2935 |
case 0: |
|
2936 |
gen_op_dmfc0_entrylo1(); |
|
2937 |
rn = "EntryLo1"; |
|
2938 |
break; |
|
2939 |
default: |
|
2940 |
goto die; |
|
2941 |
} |
|
2942 |
break; |
|
2943 |
case 4: |
|
2944 |
switch (sel) { |
|
2945 |
case 0: |
|
2946 |
gen_op_dmfc0_context(); |
|
2947 |
rn = "Context"; |
|
2948 |
break; |
|
2949 |
case 1: |
|
2950 |
// gen_op_dmfc0_contextconfig(); /* SmartMIPS ASE */ |
|
2951 |
rn = "ContextConfig"; |
|
2952 |
// break; |
|
2953 |
default: |
|
2954 |
goto die; |
|
2955 |
} |
|
2956 |
break; |
|
2957 |
case 5: |
|
2958 |
switch (sel) { |
|
2959 |
case 0: |
|
2960 |
gen_op_mfc0_pagemask(); |
|
2961 |
rn = "PageMask"; |
|
2962 |
break; |
|
2963 |
case 1: |
|
2964 |
gen_op_mfc0_pagegrain(); |
|
2965 |
rn = "PageGrain"; |
|
2966 |
break; |
|
2967 |
default: |
|
2968 |
goto die; |
|
2969 |
} |
|
2970 |
break; |
|
2971 |
case 6: |
|
2972 |
switch (sel) { |
|
2973 |
case 0: |
|
2974 |
gen_op_mfc0_wired(); |
|
2975 |
rn = "Wired"; |
|
2976 |
break; |
|
2977 |
case 1: |
|
2978 |
// gen_op_dmfc0_srsconf0(); /* shadow registers */ |
|
2979 |
rn = "SRSConf0"; |
|
2980 |
// break; |
|
2981 |
case 2: |
|
2982 |
// gen_op_dmfc0_srsconf1(); /* shadow registers */ |
|
2983 |
rn = "SRSConf1"; |
|
2984 |
// break; |
|
2985 |
case 3: |
|
2986 |
// gen_op_dmfc0_srsconf2(); /* shadow registers */ |
|
2987 |
rn = "SRSConf2"; |
|
2988 |
// break; |
|
2989 |
case 4: |
|
2990 |
// gen_op_dmfc0_srsconf3(); /* shadow registers */ |
|
2991 |
rn = "SRSConf3"; |
|
2992 |
// break; |
|
2993 |
case 5: |
|
2994 |
// gen_op_dmfc0_srsconf4(); /* shadow registers */ |
|
2995 |
rn = "SRSConf4"; |
|
2996 |
// break; |
|
2997 |
default: |
|
2998 |
goto die; |
|
2999 |
} |
|
3000 |
break; |
|
3001 |
case 7: |
|
3002 |
switch (sel) { |
|
3003 |
case 0: |
|
3004 |
gen_op_mfc0_hwrena(); |
|
3005 |
rn = "HWREna"; |
|
3006 |
break; |
|
3007 |
default: |
|
3008 |
goto die; |
|
3009 |
} |
|
3010 |
break; |
|
3011 |
case 8: |
|
3012 |
switch (sel) { |
|
3013 |
case 0: |
|
3014 |
gen_op_dmfc0_badvaddr(); |
|
3015 |
rn = "BadVaddr"; |
|
3016 |
break; |
|
3017 |
default: |
|
3018 |
goto die; |
|
3019 |
} |
|
3020 |
break; |
|
3021 |
case 9: |
|
3022 |
switch (sel) { |
|
3023 |
case 0: |
|
3024 |
gen_op_mfc0_count(); |
|
3025 |
rn = "Count"; |
|
3026 |
break; |
|
3027 |
/* 6,7 are implementation dependent */ |
|
3028 |
default: |
|
3029 |
goto die; |
|
3030 |
} |
|
3031 |
break; |
|
3032 |
case 10: |
|
3033 |
switch (sel) { |
|
3034 |
case 0: |
|
3035 |
gen_op_dmfc0_entryhi(); |
|
3036 |
rn = "EntryHi"; |
|
3037 |
break; |
|
3038 |
default: |
|
3039 |
goto die; |
|
3040 |
} |
|
3041 |
break; |
|
3042 |
case 11: |
|
3043 |
switch (sel) { |
|
3044 |
case 0: |
|
3045 |
gen_op_mfc0_compare(); |
|
3046 |
rn = "Compare"; |
|
3047 |
break; |
|
3048 |
/* 6,7 are implementation dependent */ |
|
3049 |
default: |
|
3050 |
goto die; |
|
3051 |
} |
|
3052 |
break; |
|
3053 |
case 12: |
|
3054 |
switch (sel) { |
|
3055 |
case 0: |
|
3056 |
gen_op_mfc0_status(); |
|
3057 |
rn = "Status"; |
|
3058 |
break; |
|
3059 |
case 1: |
|
3060 |
gen_op_mfc0_intctl(); |
|
3061 |
rn = "IntCtl"; |
|
3062 |
break; |
|
3063 |
case 2: |
|
3064 |
gen_op_mfc0_srsctl(); |
|
3065 |
rn = "SRSCtl"; |
|
3066 |
break; |
|
3067 |
case 3: |
|
3068 |
gen_op_mfc0_srsmap(); /* shadow registers */ |
|
3069 |
rn = "SRSMap"; |
|
3070 |
break; |
|
3071 |
default: |
|
3072 |
goto die; |
|
3073 |
} |
|
3074 |
break; |
|
3075 |
case 13: |
|
3076 |
switch (sel) { |
|
3077 |
case 0: |
|
3078 |
gen_op_mfc0_cause(); |
|
3079 |
rn = "Cause"; |
|
3080 |
break; |
|
3081 |
default: |
|
3082 |
goto die; |
|
3083 |
} |
|
3084 |
break; |
|
3085 |
case 14: |
|
3086 |
switch (sel) { |
|
3087 |
case 0: |
|
3088 |
gen_op_dmfc0_epc(); |
|
3089 |
rn = "EPC"; |
|
3090 |
break; |
|
3091 |
default: |
|
3092 |
goto die; |
|
3093 |
} |
|
3094 |
break; |
|
3095 |
case 15: |
|
3096 |
switch (sel) { |
|
3097 |
case 0: |
|
3098 |
gen_op_mfc0_prid(); |
|
3099 |
rn = "PRid"; |
|
3100 |
break; |
|
3101 |
case 1: |
|
3102 |
gen_op_dmfc0_ebase(); |
|
3103 |
rn = "EBase"; |
|
3104 |
break; |
|
3105 |
default: |
|
3106 |
goto die; |
|
3107 |
} |
|
3108 |
break; |
|
3109 |
case 16: |
|
3110 |
switch (sel) { |
|
3111 |
case 0: |
|
3112 |
gen_op_mfc0_config0(); |
|
3113 |
rn = "Config"; |
|
3114 |
break; |
|
3115 |
case 1: |
|
3116 |
gen_op_mfc0_config1(); |
|
3117 |
rn = "Config1"; |
|
3118 |
break; |
|
3119 |
case 2: |
|
3120 |
gen_op_mfc0_config2(); |
|
3121 |
rn = "Config2"; |
|
3122 |
break; |
|
3123 |
case 3: |
|
3124 |
gen_op_mfc0_config3(); |
|
3125 |
rn = "Config3"; |
|
3126 |
break; |
|
3127 |
/* 6,7 are implementation dependent */ |
|
3128 |
default: |
|
3129 |
goto die; |
|
3130 |
} |
|
3131 |
break; |
|
3132 |
case 17: |
|
3133 |
switch (sel) { |
|
3134 |
case 0: |
|
3135 |
gen_op_dmfc0_lladdr(); |
|
3136 |
rn = "LLAddr"; |
|
3137 |
break; |
|
3138 |
default: |
|
3139 |
goto die; |
|
3140 |
} |
|
3141 |
break; |
|
3142 |
case 18: |
|
3143 |
switch (sel) { |
|
3144 |
case 0: |
|
3145 |
gen_op_dmfc0_watchlo0(); |
|
3146 |
rn = "WatchLo"; |
|
3147 |
break; |
|
3148 |
case 1: |
|
3149 |
// gen_op_dmfc0_watchlo1(); |
|
3150 |
rn = "WatchLo1"; |
|
3151 |
// break; |
|
3152 |
case 2: |
|
3153 |
// gen_op_dmfc0_watchlo2(); |
|
3154 |
rn = "WatchLo2"; |
|
3155 |
// break; |
|
3156 |
case 3: |
|
3157 |
// gen_op_dmfc0_watchlo3(); |
|
3158 |
rn = "WatchLo3"; |
|
3159 |
// break; |
|
3160 |
case 4: |
|
3161 |
// gen_op_dmfc0_watchlo4(); |
|
3162 |
rn = "WatchLo4"; |
|
3163 |
// break; |
|
3164 |
case 5: |
|
3165 |
// gen_op_dmfc0_watchlo5(); |
|
3166 |
rn = "WatchLo5"; |
|
3167 |
// break; |
|
3168 |
case 6: |
|
3169 |
// gen_op_dmfc0_watchlo6(); |
|
3170 |
rn = "WatchLo6"; |
|
3171 |
// break; |
|
3172 |
case 7: |
|
3173 |
// gen_op_dmfc0_watchlo7(); |
|
3174 |
rn = "WatchLo7"; |
|
3175 |
// break; |
|
3176 |
default: |
|
3177 |
goto die; |
|
3178 |
} |
|
3179 |
break; |
|
3180 |
case 19: |
|
3181 |
switch (sel) { |
|
3182 |
case 0: |
|
3183 |
gen_op_mfc0_watchhi0(); |
|
3184 |
rn = "WatchHi"; |
|
3185 |
break; |
|
3186 |
case 1: |
|
3187 |
// gen_op_mfc0_watchhi1(); |
|
3188 |
rn = "WatchHi1"; |
|
3189 |
// break; |
|
3190 |
case 2: |
|
3191 |
// gen_op_mfc0_watchhi2(); |
|
3192 |
rn = "WatchHi2"; |
|
3193 |
// break; |
|
3194 |
case 3: |
|
3195 |
// gen_op_mfc0_watchhi3(); |
|
3196 |
rn = "WatchHi3"; |
|
3197 |
// break; |
|
3198 |
case 4: |
|
3199 |
// gen_op_mfc0_watchhi4(); |
|
3200 |
rn = "WatchHi4"; |
|
3201 |
// break; |
|
3202 |
case 5: |
|
3203 |
// gen_op_mfc0_watchhi5(); |
|
3204 |
rn = "WatchHi5"; |
|
3205 |
// break; |
|
3206 |
case 6: |
|
3207 |
// gen_op_mfc0_watchhi6(); |
|
3208 |
rn = "WatchHi6"; |
|
3209 |
// break; |
|
3210 |
case 7: |
|
3211 |
// gen_op_mfc0_watchhi7(); |
|
3212 |
rn = "WatchHi7"; |
|
3213 |
// break; |
|
3214 |
default: |
|
3215 |
goto die; |
|
3216 |
} |
|
3217 |
break; |
|
3218 |
case 20: |
|
3219 |
switch (sel) { |
|
3220 |
case 0: |
|
3221 |
/* 64 bit MMU only */ |
|
3222 |
gen_op_dmfc0_xcontext(); |
|
3223 |
rn = "XContext"; |
|
3224 |
break; |
|
3225 |
default: |
|
3226 |
goto die; |
|
3227 |
} |
|
3228 |
break; |
|
3229 |
case 21: |
|
3230 |
/* Officially reserved, but sel 0 is used for R1x000 framemask */ |
|
3231 |
switch (sel) { |
|
3232 |
case 0: |
|
3233 |
gen_op_mfc0_framemask(); |
|
3234 |
rn = "Framemask"; |
|
3235 |
break; |
|
3236 |
default: |
|
3237 |
goto die; |
|
3238 |
} |
|
3239 |
break; |
|
3240 |
case 22: |
|
3241 |
/* ignored */ |
|
3242 |
rn = "'Diagnostic"; /* implementation dependent */ |
|
3243 |
break; |
|
3244 |
case 23: |
|
3245 |
switch (sel) { |
|
3246 |
case 0: |
|
3247 |
gen_op_mfc0_debug(); /* EJTAG support */ |
|
3248 |
rn = "Debug"; |
|
3249 |
break; |
|
3250 |
case 1: |
|
3251 |
// gen_op_dmfc0_tracecontrol(); /* PDtrace support */ |
|
3252 |
rn = "TraceControl"; |
|
3253 |
// break; |
|
3254 |
case 2: |
|
3255 |
// gen_op_dmfc0_tracecontrol2(); /* PDtrace support */ |
|
3256 |
rn = "TraceControl2"; |
|
3257 |
// break; |
|
3258 |
case 3: |
|
3259 |
// gen_op_dmfc0_usertracedata(); /* PDtrace support */ |
|
3260 |
rn = "UserTraceData"; |
|
3261 |
// break; |
|
3262 |
case 4: |
|
3263 |
// gen_op_dmfc0_debug(); /* PDtrace support */ |
|
3264 |
rn = "TraceBPC"; |
|
3265 |
// break; |
|
3266 |
default: |
|
3267 |
goto die; |
|
3268 |
} |
|
3269 |
break; |
|
3270 |
case 24: |
|
3271 |
switch (sel) { |
|
3272 |
case 0: |
|
3273 |
gen_op_dmfc0_depc(); /* EJTAG support */ |
|
3274 |
rn = "DEPC"; |
|
3275 |
break; |
|
3276 |
default: |
|
3277 |
goto die; |
|
3278 |
} |
|
3279 |
break; |
|
3280 |
case 25: |
|
3281 |
switch (sel) { |
|
3282 |
case 0: |
|
3283 |
gen_op_mfc0_performance0(); |
|
3284 |
rn = "Performance0"; |
|
3285 |
break; |
|
3286 |
case 1: |
|
3287 |
// gen_op_dmfc0_performance1(); |
|
3288 |
rn = "Performance1"; |
|
3289 |
// break; |
|
3290 |
case 2: |
|
3291 |
// gen_op_dmfc0_performance2(); |
|
3292 |
rn = "Performance2"; |
|
3293 |
// break; |
|
3294 |
case 3: |
|
3295 |
// gen_op_dmfc0_performance3(); |
|
3296 |
rn = "Performance3"; |
|
3297 |
// break; |
|
3298 |
case 4: |
|
3299 |
// gen_op_dmfc0_performance4(); |
|
3300 |
rn = "Performance4"; |
|
3301 |
// break; |
|
3302 |
case 5: |
|
3303 |
// gen_op_dmfc0_performance5(); |
|
3304 |
rn = "Performance5"; |
|
3305 |
// break; |
|
3306 |
case 6: |
|
3307 |
// gen_op_dmfc0_performance6(); |
|
3308 |
rn = "Performance6"; |
|
3309 |
// break; |
|
3310 |
case 7: |
|
3311 |
// gen_op_dmfc0_performance7(); |
|
3312 |
rn = "Performance7"; |
|
3313 |
// break; |
|
3314 |
default: |
|
3315 |
goto die; |
|
3316 |
} |
|
3317 |
break; |
|
3318 |
case 26: |
|
3319 |
rn = "ECC"; |
|
3320 |
break; |
|
3321 |
case 27: |
|
3322 |
switch (sel) { |
|
3323 |
/* ignored */ |
|
3324 |
case 0 ... 3: |
|
3325 |
rn = "CacheErr"; |
|
3326 |
break; |
|
3327 |
default: |
|
3328 |
goto die; |
|
3329 |
} |
|
3330 |
break; |
|
3331 |
case 28: |
|
3332 |
switch (sel) { |
|
3333 |
case 0: |
|
3334 |
case 2: |
|
3335 |
case 4: |
|
3336 |
case 6: |
|
3337 |
gen_op_mfc0_taglo(); |
|
3338 |
rn = "TagLo"; |
|
3339 |
break; |
|
3340 |
case 1: |
|
3341 |
case 3: |
|
3342 |
case 5: |
|
3343 |
case 7: |
|
3344 |
gen_op_mfc0_datalo(); |
|
3345 |
rn = "DataLo"; |
|
3346 |
break; |
|
3347 |
default: |
|
3348 |
goto die; |
|
3349 |
} |
|
3350 |
break; |
|
3351 |
case 29: |
|
3352 |
switch (sel) { |
|
3353 |
case 0: |
|
3354 |
case 2: |
|
3355 |
case 4: |
|
3356 |
case 6: |
|
3357 |
gen_op_mfc0_taghi(); |
|
3358 |
rn = "TagHi"; |
|
3359 |
break; |
|
3360 |
case 1: |
|
3361 |
case 3: |
|
3362 |
case 5: |
|
3363 |
case 7: |
|
3364 |
gen_op_mfc0_datahi(); |
|
3365 |
rn = "DataHi"; |
|
3366 |
break; |
|
3367 |
default: |
|
3368 |
goto die; |
|
3369 |
} |
|
3370 |
break; |
|
3371 |
case 30: |
|
3372 |
switch (sel) { |
|
3373 |
case 0: |
|
3374 |
gen_op_dmfc0_errorepc(); |
|
3375 |
rn = "ErrorEPC"; |
|
3376 |
break; |
|
3377 |
default: |
|
3378 |
goto die; |
|
3379 |
} |
|
3380 |
break; |
|
3381 |
case 31: |
|
3382 |
switch (sel) { |
|
3383 |
case 0: |
|
3384 |
gen_op_mfc0_desave(); /* EJTAG support */ |
|
3385 |
rn = "DESAVE"; |
|
3386 |
break; |
|
3387 |
default: |
|
3388 |
goto die; |
|
3389 |
} |
|
3390 |
break; |
|
3391 |
default: |
|
3392 |
goto die; |
|
3393 |
} |
|
3394 |
#if defined MIPS_DEBUG_DISAS |
|
3395 |
if (loglevel & CPU_LOG_TB_IN_ASM) { |
|
3396 |
fprintf(logfile, "dmfc0 %s (reg %d sel %d)\n", |
|
3397 |
rn, reg, sel); |
|
3398 |
} |
|
3399 |
#endif |
|
3400 |
return; |
|
3401 |
|
|
3402 |
die: |
|
3403 |
#if defined MIPS_DEBUG_DISAS |
|
3404 |
if (loglevel & CPU_LOG_TB_IN_ASM) { |
|
3405 |
fprintf(logfile, "dmfc0 %s (reg %d sel %d)\n", |
|
3406 |
rn, reg, sel); |
|
3407 |
} |
|
3408 |
#endif |
|
3409 |
generate_exception(ctx, EXCP_RI); |
|
3410 |
} |
|
3411 |
|
|
3412 |
static void gen_dmtc0 (DisasContext *ctx, int reg, int sel) |
|
3413 |
{ |
|
3414 |
const char *rn = "invalid"; |
|
3415 |
|
|
3416 |
switch (reg) { |
|
3417 |
case 0: |
|
3418 |
switch (sel) { |
|
3419 |
case 0: |
|
3420 |
gen_op_mtc0_index(); |
|
3421 |
rn = "Index"; |
|
3422 |
break; |
|
3423 |
case 1: |
|
3424 |
// gen_op_dmtc0_mvpcontrol(); /* MT ASE */ |
|
3425 |
rn = "MVPControl"; |
|
3426 |
// break; |
|
3427 |
case 2: |
|
3428 |
// gen_op_dmtc0_mvpconf0(); /* MT ASE */ |
|
3429 |
rn = "MVPConf0"; |
|
3430 |
// break; |
|
3431 |
case 3: |
|
3432 |
// gen_op_dmtc0_mvpconf1(); /* MT ASE */ |
|
3433 |
rn = "MVPConf1"; |
|
3434 |
// break; |
|
3435 |
default: |
|
3436 |
goto die; |
|
3437 |
} |
|
3438 |
break; |
|
3439 |
case 1: |
|
3440 |
switch (sel) { |
|
3441 |
case 0: |
|
3442 |
/* ignored */ |
|
3443 |
rn = "Random"; |
|
3444 |
break; |
|
3445 |
case 1: |
|
3446 |
// gen_op_dmtc0_vpecontrol(); /* MT ASE */ |
|
3447 |
rn = "VPEControl"; |
|
3448 |
// break; |
|
3449 |
case 2: |
|
3450 |
// gen_op_dmtc0_vpeconf0(); /* MT ASE */ |
|
3451 |
rn = "VPEConf0"; |
|
3452 |
// break; |
|
3453 |
case 3: |
|
3454 |
// gen_op_dmtc0_vpeconf1(); /* MT ASE */ |
|
3455 |
rn = "VPEConf1"; |
|
3456 |
// break; |
|
3457 |
case 4: |
|
3458 |
// gen_op_dmtc0_YQMask(); /* MT ASE */ |
|
3459 |
rn = "YQMask"; |
|
3460 |
// break; |
|
3461 |
case 5: |
|
3462 |
// gen_op_dmtc0_vpeschedule(); /* MT ASE */ |
|
3463 |
rn = "VPESchedule"; |
|
3464 |
// break; |
|
3465 |
case 6: |
|
3466 |
// gen_op_dmtc0_vpeschefback(); /* MT ASE */ |
|
3467 |
rn = "VPEScheFBack"; |
|
3468 |
// break; |
|
3469 |
case 7: |
|
3470 |
// gen_op_dmtc0_vpeopt(); /* MT ASE */ |
|
3471 |
rn = "VPEOpt"; |
|
3472 |
// break; |
|
3473 |
default: |
|
3474 |
goto die; |
|
3475 |
} |
|
3476 |
break; |
|
3477 |
case 2: |
|
3478 |
switch (sel) { |
|
3479 |
case 0: |
|
3480 |
gen_op_dmtc0_entrylo0(); |
|
3481 |
rn = "EntryLo0"; |
|
3482 |
break; |
|
3483 |
case 1: |
|
3484 |
// gen_op_dmtc0_tcstatus(); /* MT ASE */ |
|
3485 |
rn = "TCStatus"; |
|
3486 |
// break; |
|
3487 |
case 2: |
|
3488 |
// gen_op_dmtc0_tcbind(); /* MT ASE */ |
|
3489 |
rn = "TCBind"; |
|
3490 |
// break; |
|
3491 |
case 3: |
|
3492 |
// gen_op_dmtc0_tcrestart(); /* MT ASE */ |
|
3493 |
rn = "TCRestart"; |
|
3494 |
// break; |
|
3495 |
case 4: |
|
3496 |
// gen_op_dmtc0_tchalt(); /* MT ASE */ |
|
3497 |
rn = "TCHalt"; |
|
3498 |
// break; |
|
3499 |
case 5: |
|
3500 |
// gen_op_dmtc0_tccontext(); /* MT ASE */ |
|
3501 |
rn = "TCContext"; |
|
3502 |
// break; |
|
3503 |
case 6: |
|
3504 |
// gen_op_dmtc0_tcschedule(); /* MT ASE */ |
|
3505 |
rn = "TCSchedule"; |
|
3506 |
// break; |
|
3507 |
case 7: |
|
3508 |
// gen_op_dmtc0_tcschefback(); /* MT ASE */ |
|
3509 |
rn = "TCScheFBack"; |
|
3510 |
// break; |
|
3511 |
default: |
|
3512 |
goto die; |
|
3513 |
} |
|
3514 |
break; |
|
3515 |
case 3: |
|
3516 |
switch (sel) { |
|
3517 |
case 0: |
|
3518 |
gen_op_dmtc0_entrylo1(); |
|
3519 |
rn = "EntryLo1"; |
|
3520 |
break; |
|
3521 |
default: |
|
3522 |
goto die; |
|
3523 |
} |
|
3524 |
break; |
|
3525 |
case 4: |
|
3526 |
switch (sel) { |
|
3527 |
case 0: |
|
3528 |
gen_op_dmtc0_context(); |
|
3529 |
rn = "Context"; |
|
3530 |
break; |
|
3531 |
case 1: |
|
3532 |
// gen_op_dmtc0_contextconfig(); /* SmartMIPS ASE */ |
|
3533 |
rn = "ContextConfig"; |
|
3534 |
// break; |
|
3535 |
default: |
|
3536 |
goto die; |
|
3537 |
} |
|
3538 |
break; |
|
3539 |
case 5: |
|
3540 |
switch (sel) { |
|
3541 |
case 0: |
|
3542 |
gen_op_mtc0_pagemask(); |
|
3543 |
rn = "PageMask"; |
|
3544 |
break; |
|
3545 |
case 1: |
|
3546 |
gen_op_mtc0_pagegrain(); |
|
3547 |
rn = "PageGrain"; |
|
3548 |
break; |
|
3549 |
default: |
|
3550 |
goto die; |
|
3551 |
} |
|
3552 |
break; |
|
3553 |
case 6: |
|
3554 |
switch (sel) { |
|
3555 |
case 0: |
|
3556 |
gen_op_mtc0_wired(); |
|
3557 |
rn = "Wired"; |
|
3558 |
break; |
|
3559 |
case 1: |
|
3560 |
// gen_op_dmtc0_srsconf0(); /* shadow registers */ |
|
3561 |
rn = "SRSConf0"; |
|
3562 |
// break; |
|
3563 |
case 2: |
|
3564 |
// gen_op_dmtc0_srsconf1(); /* shadow registers */ |
|
3565 |
rn = "SRSConf1"; |
|
3566 |
// break; |
|
3567 |
case 3: |
|
3568 |
// gen_op_dmtc0_srsconf2(); /* shadow registers */ |
|
3569 |
rn = "SRSConf2"; |
|
3570 |
// break; |
|
3571 |
case 4: |
|
3572 |
// gen_op_dmtc0_srsconf3(); /* shadow registers */ |
|
3573 |
rn = "SRSConf3"; |
|
3574 |
// break; |
|
3575 |
case 5: |
|
3576 |
// gen_op_dmtc0_srsconf4(); /* shadow registers */ |
|
3577 |
rn = "SRSConf4"; |
|
3578 |
// break; |
|
3579 |
default: |
|
3580 |
goto die; |
|
3581 |
} |
|
3582 |
break; |
|
3583 |
case 7: |
|
3584 |
switch (sel) { |
|
3585 |
case 0: |
|
3586 |
gen_op_mtc0_hwrena(); |
|
3587 |
rn = "HWREna"; |
|
3588 |
break; |
|
3589 |
default: |
|
3590 |
goto die; |
|
3591 |
} |
|
3592 |
break; |
|
3593 |
case 8: |
|
3594 |
/* ignored */ |
|
3595 |
rn = "BadVaddr"; |
|
3596 |
break; |
|
3597 |
case 9: |
|
3598 |
switch (sel) { |
|
3599 |
case 0: |
|
3600 |
gen_op_mtc0_count(); |
|
3601 |
rn = "Count"; |
|
3602 |
break; |
|
3603 |
/* 6,7 are implementation dependent */ |
|
3604 |
default: |
|
3605 |
goto die; |
|
3606 |
} |
|
3607 |
/* Stop translation as we may have switched the execution mode */ |
|
3608 |
ctx->bstate = BS_STOP; |
|
3609 |
break; |
|
3610 |
case 10: |
|
3611 |
switch (sel) { |
|
3612 |
case 0: |
|
3613 |
gen_op_mtc0_entryhi(); |
|
3614 |
rn = "EntryHi"; |
|
3615 |
break; |
|
3616 |
default: |
|
3617 |
goto die; |
|
3618 |
} |
|
3619 |
break; |
|
3620 |
case 11: |
|
3621 |
switch (sel) { |
|
3622 |
case 0: |
|
3623 |
gen_op_mtc0_compare(); |
|
3624 |
rn = "Compare"; |
|
3625 |
break; |
|
3626 |
/* 6,7 are implementation dependent */ |
|
3627 |
default: |
|
3628 |
goto die; |
|
3629 |
} |
|
3630 |
/* Stop translation as we may have switched the execution mode */ |
|
3631 |
ctx->bstate = BS_STOP; |
|
3632 |
break; |
|
3633 |
case 12: |
|
3634 |
switch (sel) { |
|
3635 |
case 0: |
|
3636 |
gen_op_mtc0_status(); |
|
3637 |
rn = "Status"; |
|
3638 |
break; |
|
3639 |
case 1: |
|
3640 |
gen_op_mtc0_intctl(); |
|
3641 |
rn = "IntCtl"; |
|
3642 |
break; |
|
3643 |
case 2: |
|
3644 |
gen_op_mtc0_srsctl(); |
|
3645 |
rn = "SRSCtl"; |
|
3646 |
break; |
|
3647 |
case 3: |
|
3648 |
gen_op_mtc0_srsmap(); /* shadow registers */ |
|
3649 |
rn = "SRSMap"; |
|
3650 |
break; |
|
3651 |
default: |
|
3652 |
goto die; |
|
3653 |
} |
|
3654 |
/* Stop translation as we may have switched the execution mode */ |
|
3655 |
ctx->bstate = BS_STOP; |
|
3656 |
break; |
|
3657 |
case 13: |
|
3658 |
switch (sel) { |
|
3659 |
case 0: |
|
3660 |
gen_op_mtc0_cause(); |
|
3661 |
rn = "Cause"; |
|
3662 |
break; |
|
3663 |
default: |
|
3664 |
goto die; |
|
3665 |
} |
|
3666 |
/* Stop translation as we may have switched the execution mode */ |
|
3667 |
ctx->bstate = BS_STOP; |
|
3668 |
break; |
|
3669 |
case 14: |
|
3670 |
switch (sel) { |
|
3671 |
case 0: |
|
3672 |
gen_op_dmtc0_epc(); |
|
3673 |
rn = "EPC"; |
|
3674 |
break; |
|
3675 |
default: |
|
3676 |
goto die; |
|
3677 |
} |
|
3678 |
break; |
|
3679 |
case 15: |
|
3680 |
switch (sel) { |
|
3681 |
case 0: |
|
3682 |
/* ignored */ |
|
3683 |
rn = "PRid"; |
|
3684 |
break; |
|
3685 |
case 1: |
|
3686 |
gen_op_dmtc0_ebase(); |
|
3687 |
rn = "EBase"; |
|
3688 |
break; |
|
3689 |
default: |
|
3690 |
goto die; |
|
3691 |
} |
|
3692 |
break; |
|
3693 |
case 16: |
|
3694 |
switch (sel) { |
|
3695 |
case 0: |
|
3696 |
gen_op_mtc0_config0(); |
|
3697 |
rn = "Config"; |
|
3698 |
break; |
|
3699 |
case 1: |
|
3700 |
/* ignored */ |
|
3701 |
rn = "Config1"; |
|
3702 |
break; |
|
3703 |
case 2: |
|
3704 |
gen_op_mtc0_config2(); |
|
3705 |
rn = "Config2"; |
|
3706 |
break; |
|
3707 |
case 3: |
|
3708 |
/* ignored */ |
|
3709 |
rn = "Config3"; |
|
3710 |
break; |
|
3711 |
/* 6,7 are implementation dependent */ |
|
3712 |
default: |
|
3713 |
rn = "Invalid config selector"; |
|
3714 |
goto die; |
|
3715 |
} |
|
3716 |
/* Stop translation as we may have switched the execution mode */ |
|
3717 |
ctx->bstate = BS_STOP; |
|
3718 |
break; |
|
3719 |
case 17: |
|
3720 |
switch (sel) { |
|
3721 |
case 0: |
|
3722 |
/* ignored */ |
|
3723 |
rn = "LLAddr"; |
|
3724 |
break; |
|
3725 |
default: |
|
3726 |
goto die; |
|
3727 |
} |
|
3728 |
break; |
|
3729 |
case 18: |
|
3730 |
switch (sel) { |
|
3731 |
case 0: |
|
3732 |
gen_op_dmtc0_watchlo0(); |
|
3733 |
rn = "WatchLo"; |
|
3734 |
break; |
|
3735 |
case 1: |
|
3736 |
// gen_op_dmtc0_watchlo1(); |
|
3737 |
rn = "WatchLo1"; |
|
3738 |
// break; |
|
3739 |
case 2: |
|
3740 |
// gen_op_dmtc0_watchlo2(); |
|
3741 |
rn = "WatchLo2"; |
|
3742 |
// break; |
|
3743 |
case 3: |
|
3744 |
// gen_op_dmtc0_watchlo3(); |
|
3745 |
rn = "WatchLo3"; |
|
3746 |
// break; |
|
3747 |
case 4: |
|
3748 |
// gen_op_dmtc0_watchlo4(); |
|
3749 |
rn = "WatchLo4"; |
|
3750 |
// break; |
|
3751 |
case 5: |
|
3752 |
// gen_op_dmtc0_watchlo5(); |
|
3753 |
rn = "WatchLo5"; |
|
3754 |
// break; |
|
3755 |
case 6: |
|
3756 |
// gen_op_dmtc0_watchlo6(); |
|
3757 |
rn = "WatchLo6"; |
|
3758 |
// break; |
|
3759 |
case 7: |
|
3760 |
// gen_op_dmtc0_watchlo7(); |
|
3761 |
rn = "WatchLo7"; |
|
3762 |
// break; |
|
3763 |
default: |
|
3764 |
goto die; |
|
3765 |
} |
|
3766 |
break; |
|
3767 |
case 19: |
|
3768 |
switch (sel) { |
|
3769 |
case 0: |
|
3770 |
gen_op_mtc0_watchhi0(); |
|
3771 |
rn = "WatchHi"; |
|
3772 |
break; |
|
3773 |
case 1: |
|
3774 |
// gen_op_dmtc0_watchhi1(); |
|
3775 |
rn = "WatchHi1"; |
|
3776 |
// break; |
|
3777 |
case 2: |
|
3778 |
// gen_op_dmtc0_watchhi2(); |
|
3779 |
rn = "WatchHi2"; |
|
3780 |
// break; |
|
3781 |
case 3: |
|
3782 |
// gen_op_dmtc0_watchhi3(); |
|
3783 |
rn = "WatchHi3"; |
|
3784 |
// break; |
|
3785 |
case 4: |
|
3786 |
// gen_op_dmtc0_watchhi4(); |
|
3787 |
rn = "WatchHi4"; |
|
3788 |
// break; |
|
3789 |
case 5: |
|
3790 |
// gen_op_dmtc0_watchhi5(); |
|
3791 |
rn = "WatchHi5"; |
|
3792 |
// break; |
|
3793 |
case 6: |
|
3794 |
// gen_op_dmtc0_watchhi6(); |
|
3795 |
rn = "WatchHi6"; |
|
3796 |
// break; |
|
3797 |
case 7: |
|
3798 |
// gen_op_dmtc0_watchhi7(); |
|
3799 |
rn = "WatchHi7"; |
|
3800 |
// break; |
|
3801 |
default: |
|
3802 |
goto die; |
|
3803 |
} |
|
3804 |
break; |
|
3805 |
case 20: |
|
3806 |
switch (sel) { |
|
3807 |
case 0: |
|
3808 |
/* 64 bit MMU only */ |
|
3809 |
gen_op_dmtc0_xcontext(); |
|
3810 |
rn = "XContext"; |
|
3811 |
break; |
|
3812 |
default: |
|
3813 |
goto die; |
|
3814 |
} |
|
3815 |
break; |
|
3816 |
case 21: |
|
3817 |
/* Officially reserved, but sel 0 is used for R1x000 framemask */ |
|
3818 |
switch (sel) { |
|
3819 |
case 0: |
|
3820 |
gen_op_mtc0_framemask(); |
|
3821 |
rn = "Framemask"; |
|
3822 |
break; |
|
3823 |
default: |
|
3824 |
goto die; |
|
3825 |
} |
|
3826 |
break; |
|
3827 |
case 22: |
|
3828 |
/* ignored */ |
|
3829 |
rn = "Diagnostic"; /* implementation dependent */ |
|
3830 |
break; |
|
3831 |
case 23: |
|
3832 |
switch (sel) { |
|
3833 |
case 0: |
|
3834 |
gen_op_mtc0_debug(); /* EJTAG support */ |
|
3835 |
rn = "Debug"; |
|
3836 |
break; |
|
3837 |
case 1: |
|
3838 |
// gen_op_dmtc0_tracecontrol(); /* PDtrace support */ |
|
3839 |
rn = "TraceControl"; |
|
3840 |
// break; |
|
3841 |
case 2: |
|
3842 |
// gen_op_dmtc0_tracecontrol2(); /* PDtrace support */ |
|
3843 |
rn = "TraceControl2"; |
|
3844 |
// break; |
|
3845 |
case 3: |
|
3846 |
// gen_op_dmtc0_usertracedata(); /* PDtrace support */ |
|
3847 |
rn = "UserTraceData"; |
|
3848 |
// break; |
|
3849 |
case 4: |
|
3850 |
// gen_op_dmtc0_debug(); /* PDtrace support */ |
|
3851 |
rn = "TraceBPC"; |
|
3852 |
// break; |
|
3853 |
default: |
|
3854 |
goto die; |
|
3855 |
} |
|
3856 |
/* Stop translation as we may have switched the execution mode */ |
|
3857 |
ctx->bstate = BS_STOP; |
|
3858 |
break; |
|
3859 |
case 24: |
|
3860 |
switch (sel) { |
|
3861 |
case 0: |
|
3862 |
gen_op_dmtc0_depc(); /* EJTAG support */ |
|
3863 |
rn = "DEPC"; |
|
3864 |
break; |
|
3865 |
default: |
|
3866 |
goto die; |
|
3867 |
} |
|
3868 |
break; |
|
3869 |
case 25: |
|
3870 |
switch (sel) { |
|
3871 |
case 0: |
|
3872 |
gen_op_mtc0_performance0(); |
|
3873 |
rn = "Performance0"; |
|
3874 |
break; |
|
3875 |
case 1: |
|
3876 |
// gen_op_dmtc0_performance1(); |
|
3877 |
rn = "Performance1"; |
|
3878 |
// break; |
|
3879 |
case 2: |
|
3880 |
// gen_op_dmtc0_performance2(); |
|
3881 |
rn = "Performance2"; |
|
3882 |
// break; |
|
3883 |
case 3: |
|
3884 |
// gen_op_dmtc0_performance3(); |
|
3885 |
rn = "Performance3"; |
|
3886 |
// break; |
|
3887 |
case 4: |
|
3888 |
// gen_op_dmtc0_performance4(); |
|
3889 |
rn = "Performance4"; |
|
3890 |
// break; |
|
3891 |
case 5: |
|
3892 |
// gen_op_dmtc0_performance5(); |
|
3893 |
rn = "Performance5"; |
|
3894 |
// break; |
|
3895 |
case 6: |
|
3896 |
// gen_op_dmtc0_performance6(); |
|
3897 |
rn = "Performance6"; |
|
3898 |
// break; |
|
3899 |
case 7: |
|
3900 |
// gen_op_dmtc0_performance7(); |
|
3901 |
rn = "Performance7"; |
|
3902 |
// break; |
|
3903 |
default: |
|
3904 |
goto die; |
|
3905 |
} |
|
3906 |
break; |
|
3907 |
case 26: |
|
3908 |
/* ignored */ |
|
3909 |
rn = "ECC"; |
|
3910 |
break; |
|
3911 |
case 27: |
|
3912 |
switch (sel) { |
|
3913 |
case 0 ... 3: |
|
3914 |
/* ignored */ |
|
3915 |
rn = "CacheErr"; |
|
3916 |
break; |
|
3917 |
default: |
|
3918 |
goto die; |
|
3919 |
} |
|
3920 |
break; |
|
3921 |
case 28: |
|
3922 |
switch (sel) { |
|
3923 |
case 0: |
|
3924 |
case 2: |
|
3925 |
case 4: |
|
3926 |
case 6: |
|
3927 |
gen_op_mtc0_taglo(); |
|
3928 |
rn = "TagLo"; |
|
3929 |
break; |
|
3930 |
case 1: |
|
3931 |
case 3: |
|
3932 |
case 5: |
|
3933 |
case 7: |
|
3934 |
gen_op_mtc0_datalo(); |
|
3935 |
rn = "DataLo"; |
|
3936 |
break; |
|
3937 |
default: |
|
3938 |
goto die; |
|
3939 |
} |
|
3940 |
break; |
|
3941 |
case 29: |
|
3942 |
switch (sel) { |
|
3943 |
case 0: |
|
3944 |
case 2: |
|
3945 |
case 4: |
|
3946 |
case 6: |
|
3947 |
gen_op_mtc0_taghi(); |
|
3948 |
rn = "TagHi"; |
|
3949 |
break; |
|
3950 |
case 1: |
|
3951 |
case 3: |
|
3952 |
case 5: |
|
3953 |
case 7: |
|
3954 |
gen_op_mtc0_datahi(); |
|
3955 |
rn = "DataHi"; |
|
3956 |
break; |
|
3957 |
default: |
|
3958 |
rn = "invalid sel"; |
|
3959 |
goto die; |
|
3960 |
} |
|
3961 |
break; |
|
3962 |
case 30: |
|
3963 |
switch (sel) { |
|
3964 |
case 0: |
|
3965 |
gen_op_dmtc0_errorepc(); |
|
3966 |
rn = "ErrorEPC"; |
|
3967 |
break; |
|
3968 |
default: |
|
3969 |
goto die; |
|
3970 |
} |
|
3971 |
break; |
|
3972 |
case 31: |
|
3973 |
switch (sel) { |
|
3974 |
case 0: |
|
3975 |
gen_op_mtc0_desave(); /* EJTAG support */ |
|
3976 |
rn = "DESAVE"; |
|
3977 |
break; |
|
3978 |
default: |
|
3979 |
goto die; |
|
3980 |
} |
|
3981 |
/* Stop translation as we may have switched the execution mode */ |
|
3982 |
ctx->bstate = BS_STOP; |
|
3983 |
break; |
|
3984 |
default: |
|
3985 |
goto die; |
|
3986 |
} |
|
3987 |
#if defined MIPS_DEBUG_DISAS |
|
3988 |
if (loglevel & CPU_LOG_TB_IN_ASM) { |
|
3989 |
fprintf(logfile, "dmtc0 %s (reg %d sel %d)\n", |
|
3990 |
rn, reg, sel); |
|
3991 |
} |
|
3992 |
#endif |
|
3993 |
return; |
|
3994 |
|
|
3995 |
die: |
|
3996 |
#if defined MIPS_DEBUG_DISAS |
|
3997 |
if (loglevel & CPU_LOG_TB_IN_ASM) { |
|
3998 |
fprintf(logfile, "dmtc0 %s (reg %d sel %d)\n", |
|
3999 |
rn, reg, sel); |
|
4000 |
} |
|
4001 |
#endif |
|
4002 |
generate_exception(ctx, EXCP_RI); |
|
4003 |
} |
|
4004 |
|
|
2830 | 4005 |
static void gen_cp0 (DisasContext *ctx, uint32_t opc, int rt, int rd) |
2831 | 4006 |
{ |
2832 | 4007 |
const char *opn = "unk"; |
... | ... | |
2854 | 4029 |
break; |
2855 | 4030 |
case OPC_MTC0: |
2856 | 4031 |
/* If we get an exception, we want to restart at next instruction */ |
2857 |
/* XXX: breaks for mtc in delay slot */ |
|
4032 |
/* XXX: breaks for mtc in delay slot */
|
|
2858 | 4033 |
ctx->pc += 4; |
2859 | 4034 |
save_cpu_state(ctx, 1); |
2860 | 4035 |
ctx->pc -= 4; |
... | ... | |
2862 | 4037 |
gen_mtc0(ctx, rd, ctx->opcode & 0x7); |
2863 | 4038 |
opn = "mtc0"; |
2864 | 4039 |
break; |
4040 |
case OPC_DMFC0: |
|
4041 |
if (rt == 0) { |
|
4042 |
/* Treat as NOP */ |
|
4043 |
return; |
|
4044 |
} |
|
4045 |
gen_dmfc0(ctx, rd, ctx->opcode & 0x7); |
|
4046 |
gen_op_store_T0_gpr(rt); |
|
4047 |
opn = "dmfc0"; |
|
4048 |
break; |
|
4049 |
case OPC_DMTC0: |
|
4050 |
/* If we get an exception, we want to restart at next instruction */ |
|
4051 |
/* XXX: breaks for dmtc in delay slot */ |
|
4052 |
ctx->pc += 4; |
|
4053 |
save_cpu_state(ctx, 1); |
|
4054 |
ctx->pc -= 4; |
|
4055 |
GEN_LOAD_REG_TN(T0, rt); |
|
4056 |
gen_dmtc0(ctx, rd, ctx->opcode & 0x7); |
|
4057 |
opn = "dmtc0"; |
|
4058 |
break; |
|
2865 | 4059 |
#if defined(MIPS_USES_R4K_TLB) |
2866 | 4060 |
case OPC_TLBWI: |
2867 | 4061 |
gen_op_tlbwi(); |
... | ... | |
3002 | 4196 |
gen_op_ctc1(); |
3003 | 4197 |
opn = "ctc1"; |
3004 | 4198 |
break; |
4199 |
case OPC_DMFC1: |
|
4200 |
case OPC_DMTC1: |
|
4201 |
/* Not implemented, fallthrough. */ |
|
3005 | 4202 |
default: |
3006 | 4203 |
if (loglevel & CPU_LOG_TB_IN_ASM) { |
3007 | 4204 |
fprintf(logfile, "Invalid CP1 opcode: %08x %03x %03x %03x\n", |
... | ... | |
3703 | 4900 |
case OPC_CFC1: |
3704 | 4901 |
case OPC_MTC1: |
3705 | 4902 |
case OPC_CTC1: |
4903 |
#ifdef MIPS_HAS_MIPS64 |
|
4904 |
case OPC_DMFC1: |
|
4905 |
case OPC_DMTC1: |
|
4906 |
#endif |
|
3706 | 4907 |
gen_cp1(ctx, op1, rt, rd); |
3707 | 4908 |
break; |
3708 | 4909 |
case OPC_BC1: |
... | ... | |
4099 | 5300 |
} |
4100 | 5301 |
env->PC = (int32_t)0xBFC00000; |
4101 | 5302 |
#if defined (MIPS_USES_R4K_TLB) |
4102 |
env->CP0_random = MIPS_TLB_NB - 1;
|
|
5303 |
env->CP0_Random = MIPS_TLB_NB - 1;
|
|
4103 | 5304 |
env->tlb_in_use = MIPS_TLB_NB; |
4104 | 5305 |
#endif |
4105 | 5306 |
env->CP0_Wired = 0; |
Also available in: Unified diff