Revision b3249f63 target-alpha/translate.c

b/target-alpha/translate.c
468 468
    gen_store_fir(ctx, rc, 0);
469 469
}
470 470

  
471
/* EXTWH, EXTWH, EXTLH, EXTQH */
472
static always_inline void gen_ext_h(void (*tcg_gen_ext_i64)(TCGv t0, TCGv t1),
473
                                    int ra, int rb, int rc,
474
                                    int islit, int8_t lit)
475
{
476
    if (unlikely(rc == 31))
477
        return;
478

  
479
    if (ra != 31) {
480
        if (islit)
481
            tcg_gen_shli_i64(cpu_ir[rc], cpu_ir[ra], 64 - ((lit & 7) * 8));
482
        else if (rb != 31) {
483
            TCGv tmp1, tmp2;
484
            tmp1 = tcg_temp_new(TCG_TYPE_I64);
485
            tcg_gen_andi_i64(tmp1, cpu_ir[rb], 7);
486
            tcg_gen_shli_i64(tmp1, tmp1, 3);
487
            tmp2 = tcg_const_i64(64);
488
            tcg_gen_sub_i64(tmp1, tmp2, tmp1);
489
            tcg_temp_free(tmp2);
490
            if (tcg_gen_ext_i64) {
491
                tcg_gen_shl_i64(tmp1, cpu_ir[ra], tmp1);
492
                tcg_gen_ext_i64(cpu_ir[rc], tmp1);
493
            } else
494
                tcg_gen_shl_i64(cpu_ir[rc], cpu_ir[ra], tmp1);
495
            tcg_temp_free(tmp1);
496
        } else
497
            tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[ra]);
498
    } else
499
        tcg_gen_movi_i64(cpu_ir[rc], 0);
500
}
501

  
502
/* EXTBL, EXTWL, EXTWL, EXTLL, EXTQL */
503
static always_inline void gen_ext_l(void (*tcg_gen_ext_i64)(TCGv t0, TCGv t1),
504
                                    int ra, int rb, int rc,
505
                                    int islit, int8_t lit)
506
{
507
    if (unlikely(rc == 31))
508
        return;
509

  
510
    if (ra != 31) {
511
        if (islit)
512
            tcg_gen_shri_i64(cpu_ir[rc], cpu_ir[ra], (lit & 7) * 8);
513
        else if (rb != 31) {
514
            TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
515
            tcg_gen_andi_i64(tmp, cpu_ir[rb], 7);
516
            tcg_gen_shli_i64(tmp, tmp, 3);
517
            if (tcg_gen_ext_i64) {
518
                tcg_gen_shr_i64(tmp, cpu_ir[ra], tmp);
519
                tcg_gen_ext_i64(cpu_ir[rc], tmp);
520
            } else
521
                tcg_gen_shr_i64(cpu_ir[rc], cpu_ir[ra], tmp);
522
            tcg_temp_free(tmp);
523
        } else
524
            tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[ra]);
525
    } else
526
        tcg_gen_movi_i64(cpu_ir[rc], 0);
527
}
528

  
529
/* Code to call byte manipulation helpers, used by:
530
   INSWH, INSLH, INSQH, INSBL, INSWL, INSLL, INSQL,
531
   MSKWH, MSKLH, MSKQH, MSKBL, MSKWL, MSKLL, MSKQL,
532
   ZAP, ZAPNOT
533

  
534
   WARNING: it assumes that when ra31 is used, the result is 0.
535
*/
536
static always_inline void gen_byte_manipulation(void *helper,
537
                                                int ra, int rb, int rc,
538
                                                int islit, uint8_t lit)
539
{
540
    if (unlikely(rc == 31))
541
        return;
542

  
543
    if (ra != 31) {
544
        if (islit || rb == 31) {
545
            TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
546
            if (islit)
547
                tcg_gen_movi_i64(tmp, lit);
548
            else
549
                tcg_gen_movi_i64(tmp, 0);
550
            tcg_gen_helper_1_2(helper, cpu_ir[rc], cpu_ir[ra], tmp);
551
            tcg_temp_free(tmp);
552
        } else
553
            tcg_gen_helper_1_2(helper, cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
554
    } else
555
        tcg_gen_movi_i64(cpu_ir[rc], 0);
556
}
557

  
471 558
static always_inline int translate_one (DisasContext *ctx, uint32_t insn)
472 559
{
473 560
    uint32_t palcode;
......
1101 1188
        switch (fn7) {
1102 1189
        case 0x02:
1103 1190
            /* MSKBL */
1104
            gen_arith3(ctx, &gen_op_mskbl, ra, rb, rc, islit, lit);
1191
            gen_byte_manipulation(helper_mskbl, ra, rb, rc, islit, lit);
1105 1192
            break;
1106 1193
        case 0x06:
1107 1194
            /* EXTBL */
1108
            gen_arith3(ctx, &gen_op_extbl, ra, rb, rc, islit, lit);
1195
            gen_ext_l(&tcg_gen_ext8u_i64, ra, rb, rc, islit, lit);
1109 1196
            break;
1110 1197
        case 0x0B:
1111 1198
            /* INSBL */
1112
            gen_arith3(ctx, &gen_op_insbl, ra, rb, rc, islit, lit);
1199
            gen_byte_manipulation(helper_insbl, ra, rb, rc, islit, lit);
1113 1200
            break;
1114 1201
        case 0x12:
1115 1202
            /* MSKWL */
1116
            gen_arith3(ctx, &gen_op_mskwl, ra, rb, rc, islit, lit);
1203
            gen_byte_manipulation(helper_mskwl, ra, rb, rc, islit, lit);
1117 1204
            break;
1118 1205
        case 0x16:
1119 1206
            /* EXTWL */
1120
            gen_arith3(ctx, &gen_op_extwl, ra, rb, rc, islit, lit);
1207
            gen_ext_l(&tcg_gen_ext16u_i64, ra, rb, rc, islit, lit);
1121 1208
            break;
1122 1209
        case 0x1B:
1123 1210
            /* INSWL */
1124
            gen_arith3(ctx, &gen_op_inswl, ra, rb, rc, islit, lit);
1211
            gen_byte_manipulation(helper_inswl, ra, rb, rc, islit, lit);
1125 1212
            break;
1126 1213
        case 0x22:
1127 1214
            /* MSKLL */
1128
            gen_arith3(ctx, &gen_op_mskll, ra, rb, rc, islit, lit);
1215
            gen_byte_manipulation(helper_mskll, ra, rb, rc, islit, lit);
1129 1216
            break;
1130 1217
        case 0x26:
1131 1218
            /* EXTLL */
1132
            gen_arith3(ctx, &gen_op_extll, ra, rb, rc, islit, lit);
1219
            gen_ext_l(&tcg_gen_ext32u_i64, ra, rb, rc, islit, lit);
1133 1220
            break;
1134 1221
        case 0x2B:
1135 1222
            /* INSLL */
1136
            gen_arith3(ctx, &gen_op_insll, ra, rb, rc, islit, lit);
1223
            gen_byte_manipulation(helper_insll, ra, rb, rc, islit, lit);
1137 1224
            break;
1138 1225
        case 0x30:
1139 1226
            /* ZAP */
1140
            gen_arith3(ctx, &gen_op_zap, ra, rb, rc, islit, lit);
1227
            gen_byte_manipulation(helper_zap, ra, rb, rc, islit, lit);
1141 1228
            break;
1142 1229
        case 0x31:
1143 1230
            /* ZAPNOT */
1144
            gen_arith3(ctx, &gen_op_zapnot, ra, rb, rc, islit, lit);
1231
            gen_byte_manipulation(helper_zapnot, ra, rb, rc, islit, lit);
1145 1232
            break;
1146 1233
        case 0x32:
1147 1234
            /* MSKQL */
1148
            gen_arith3(ctx, &gen_op_mskql, ra, rb, rc, islit, lit);
1235
            gen_byte_manipulation(helper_mskql, ra, rb, rc, islit, lit);
1149 1236
            break;
1150 1237
        case 0x34:
1151 1238
            /* SRL */
......
1166 1253
            break;
1167 1254
        case 0x36:
1168 1255
            /* EXTQL */
1169
            gen_arith3(ctx, &gen_op_extql, ra, rb, rc, islit, lit);
1256
            gen_ext_l(NULL, ra, rb, rc, islit, lit);
1170 1257
            break;
1171 1258
        case 0x39:
1172 1259
            /* SLL */
......
1187 1274
            break;
1188 1275
        case 0x3B:
1189 1276
            /* INSQL */
1190
            gen_arith3(ctx, &gen_op_insql, ra, rb, rc, islit, lit);
1277
            gen_byte_manipulation(helper_insql, ra, rb, rc, islit, lit);
1191 1278
            break;
1192 1279
        case 0x3C:
1193 1280
            /* SRA */
......
1208 1295
            break;
1209 1296
        case 0x52:
1210 1297
            /* MSKWH */
1211
            gen_arith3(ctx, &gen_op_mskwh, ra, rb, rc, islit, lit);
1298
            gen_byte_manipulation(helper_mskwh, ra, rb, rc, islit, lit);
1212 1299
            break;
1213 1300
        case 0x57:
1214 1301
            /* INSWH */
1215
            gen_arith3(ctx, &gen_op_inswh, ra, rb, rc, islit, lit);
1302
            gen_byte_manipulation(helper_inswh, ra, rb, rc, islit, lit);
1216 1303
            break;
1217 1304
        case 0x5A:
1218 1305
            /* EXTWH */
1219
            gen_arith3(ctx, &gen_op_extwh, ra, rb, rc, islit, lit);
1306
            gen_ext_h(&tcg_gen_ext16u_i64, ra, rb, rc, islit, lit);
1220 1307
            break;
1221 1308
        case 0x62:
1222 1309
            /* MSKLH */
1223
            gen_arith3(ctx, &gen_op_msklh, ra, rb, rc, islit, lit);
1310
            gen_byte_manipulation(helper_msklh, ra, rb, rc, islit, lit);
1224 1311
            break;
1225 1312
        case 0x67:
1226 1313
            /* INSLH */
1227
            gen_arith3(ctx, &gen_op_inslh, ra, rb, rc, islit, lit);
1314
            gen_byte_manipulation(helper_inslh, ra, rb, rc, islit, lit);
1228 1315
            break;
1229 1316
        case 0x6A:
1230 1317
            /* EXTLH */
1231
            gen_arith3(ctx, &gen_op_extlh, ra, rb, rc, islit, lit);
1318
            gen_ext_h(&tcg_gen_ext16u_i64, ra, rb, rc, islit, lit);
1232 1319
            break;
1233 1320
        case 0x72:
1234 1321
            /* MSKQH */
1235
            gen_arith3(ctx, &gen_op_mskqh, ra, rb, rc, islit, lit);
1322
            gen_byte_manipulation(helper_mskqh, ra, rb, rc, islit, lit);
1236 1323
            break;
1237 1324
        case 0x77:
1238 1325
            /* INSQH */
1239
            gen_arith3(ctx, &gen_op_insqh, ra, rb, rc, islit, lit);
1326
            gen_byte_manipulation(helper_insqh, ra, rb, rc, islit, lit);
1240 1327
            break;
1241 1328
        case 0x7A:
1242 1329
            /* EXTQH */
1243
            gen_arith3(ctx, &gen_op_extqh, ra, rb, rc, islit, lit);
1330
            gen_ext_h(NULL, ra, rb, rc, islit, lit);
1244 1331
            break;
1245 1332
        default:
1246 1333
            goto invalid_opc;

Also available in: Unified diff