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