Revision 9c29504e target-alpha/translate.c

b/target-alpha/translate.c
124 124
    NAME ## _table[n]();                                                      \
125 125
}
126 126

  
127
/* IR moves */
128
/* Special hacks for ir31 */
129
#define gen_op_cmov_ir31 gen_op_nop
130
GEN32(gen_op_cmov_ir, gen_op_cmov_ir);
131

  
132 127
/* FIR moves */
133 128
/* Special hacks for fir31 */
134 129
#define gen_op_load_FT0_fir31 gen_op_reset_FT0
......
328 323
}
329 324

  
330 325
static always_inline void gen_bcond (DisasContext *ctx,
331
                                     void (*gen_test_op)(void),
332
                                     int ra, int32_t disp16)
326
                                     TCGCond cond,
327
                                     int ra, int32_t disp16, int mask)
333 328
{
334
    tcg_gen_movi_i64(cpu_T[1], ctx->pc + (int64_t)(disp16 << 2));
335
    if (ra != 31)
336
        tcg_gen_mov_i64(cpu_T[0], cpu_ir[ra]);
337
    else
338
        tcg_gen_movi_i64(cpu_T[0], 0);
339
    (*gen_test_op)();
340
    _gen_op_bcond(ctx);
329
    int l1, l2;
330

  
331
    l1 = gen_new_label();
332
    l2 = gen_new_label();
333
    if (likely(ra != 31)) {
334
        if (mask) {
335
            TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
336
            tcg_gen_andi_i64(tmp, cpu_ir[ra], 1);
337
            tcg_gen_brcondi_i64(cond, tmp, 0, l1);
338
            tcg_temp_free(tmp);
339
        } else
340
            tcg_gen_brcondi_i64(cond, cpu_ir[ra], 0, l1);
341
    } else {
342
        /* Very uncommon case - Do not bother to optimize.  */
343
        TCGv tmp = tcg_const_i64(0);
344
        tcg_gen_brcondi_i64(cond, tmp, 0, l1);
345
        tcg_temp_free(tmp);
346
    }
347
    tcg_gen_movi_i64(cpu_pc, ctx->pc);
348
    tcg_gen_br(l2);
349
    gen_set_label(l1);
350
    tcg_gen_movi_i64(cpu_pc, ctx->pc + (int64_t)(disp16 << 2));
351
    gen_set_label(l2);
341 352
}
342 353

  
343 354
static always_inline void gen_fbcond (DisasContext *ctx,
......
371 382
}
372 383

  
373 384
static always_inline void gen_cmov (DisasContext *ctx,
374
                                    void (*gen_test_op)(void),
385
                                    TCGCond inv_cond,
375 386
                                    int ra, int rb, int rc,
376
                                    int islit, uint8_t lit)
387
                                    int islit, int8_t lit, int mask)
377 388
{
378
    if (ra != 31)
379
        tcg_gen_mov_i64(cpu_T[0], cpu_ir[ra]);
380
    else
381
        tcg_gen_movi_i64(cpu_T[0], 0);
389
    int l1;
390

  
391
    if (unlikely(rc == 31))
392
        return;
393

  
394
    l1 = gen_new_label();
395

  
396
    if (ra != 31) {
397
        if (mask) {
398
            TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
399
            tcg_gen_andi_i64(tmp, cpu_ir[ra], 1);
400
            tcg_gen_brcondi_i64(inv_cond, tmp, 0, l1);
401
            tcg_temp_free(tmp);
402
        } else
403
            tcg_gen_brcondi_i64(inv_cond, cpu_ir[ra], 0, l1);
404
    } else {
405
        /* Very uncommon case - Do not bother to optimize.  */
406
        TCGv tmp = tcg_const_i64(0);
407
        tcg_gen_brcondi_i64(inv_cond, tmp, 0, l1);
408
        tcg_temp_free(tmp);
409
    }
410

  
382 411
    if (islit)
383
        tcg_gen_movi_i64(cpu_T[1], lit);
412
        tcg_gen_movi_i64(cpu_ir[rc], lit);
384 413
    else if (rb != 31)
385
        tcg_gen_mov_i64(cpu_T[1], cpu_ir[rb]);
414
        tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[rb]);
386 415
    else
387
        tcg_gen_movi_i64(cpu_T[1], 0);
388
    (*gen_test_op)();
389
    gen_op_cmov_ir(rc);
416
        tcg_gen_movi_i64(cpu_ir[rc], 0);
417
    gen_set_label(l1);
390 418
}
391 419

  
392 420
static always_inline void gen_farith2 (DisasContext *ctx,
......
933 961
            break;
934 962
        case 0x14:
935 963
            /* CMOVLBS */
936
            gen_cmov(ctx, &gen_op_cmplbs, ra, rb, rc, islit, lit);
964
            gen_cmov(ctx, TCG_COND_EQ, ra, rb, rc, islit, lit, 1);
937 965
            break;
938 966
        case 0x16:
939 967
            /* CMOVLBC */
940
            gen_cmov(ctx, &gen_op_cmplbc, ra, rb, rc, islit, lit);
968
            gen_cmov(ctx, TCG_COND_NE, ra, rb, rc, islit, lit, 1);
941 969
            break;
942 970
        case 0x20:
943 971
            /* BIS */
......
961 989
            break;
962 990
        case 0x24:
963 991
            /* CMOVEQ */
964
            gen_cmov(ctx, &gen_op_cmpeqz, ra, rb, rc, islit, lit);
992
            gen_cmov(ctx, TCG_COND_NE, ra, rb, rc, islit, lit, 0);
965 993
            break;
966 994
        case 0x26:
967 995
            /* CMOVNE */
968
            gen_cmov(ctx, &gen_op_cmpnez, ra, rb, rc, islit, lit);
996
            gen_cmov(ctx, TCG_COND_EQ, ra, rb, rc, islit, lit, 0);
969 997
            break;
970 998
        case 0x28:
971 999
            /* ORNOT */
......
1011 1039
            break;
1012 1040
        case 0x44:
1013 1041
            /* CMOVLT */
1014
            gen_cmov(ctx, &gen_op_cmpltz, ra, rb, rc, islit, lit);
1042
            gen_cmov(ctx, TCG_COND_GE, ra, rb, rc, islit, lit, 0);
1015 1043
            break;
1016 1044
        case 0x46:
1017 1045
            /* CMOVGE */
1018
            gen_cmov(ctx, &gen_op_cmpgez, ra, rb, rc, islit, lit);
1046
            gen_cmov(ctx, TCG_COND_LT, ra, rb, rc, islit, lit, 0);
1019 1047
            break;
1020 1048
        case 0x48:
1021 1049
            /* EQV */
......
1053 1081
            break;
1054 1082
        case 0x64:
1055 1083
            /* CMOVLE */
1056
            gen_cmov(ctx, &gen_op_cmplez, ra, rb, rc, islit, lit);
1084
            gen_cmov(ctx, TCG_COND_GT, ra, rb, rc, islit, lit, 0);
1057 1085
            break;
1058 1086
        case 0x66:
1059 1087
            /* CMOVGT */
1060
            gen_cmov(ctx, &gen_op_cmpgtz, ra, rb, rc, islit, lit);
1088
            gen_cmov(ctx, TCG_COND_LE, ra, rb, rc, islit, lit, 0);
1061 1089
            break;
1062 1090
        case 0x6C:
1063 1091
            /* IMPLVER */
......
2173 2201
        break;
2174 2202
    case 0x38:
2175 2203
        /* BLBC */
2176
        gen_bcond(ctx, &gen_op_cmplbc, ra, disp16);
2204
        gen_bcond(ctx, TCG_COND_EQ, ra, disp16, 1);
2177 2205
        ret = 1;
2178 2206
        break;
2179 2207
    case 0x39:
2180 2208
        /* BEQ */
2181
        gen_bcond(ctx, &gen_op_cmpeqz, ra, disp16);
2209
        gen_bcond(ctx, TCG_COND_EQ, ra, disp16, 0);
2182 2210
        ret = 1;
2183 2211
        break;
2184 2212
    case 0x3A:
2185 2213
        /* BLT */
2186
        gen_bcond(ctx, &gen_op_cmpltz, ra, disp16);
2214
        gen_bcond(ctx, TCG_COND_LT, ra, disp16, 0);
2187 2215
        ret = 1;
2188 2216
        break;
2189 2217
    case 0x3B:
2190 2218
        /* BLE */
2191
        gen_bcond(ctx, &gen_op_cmplez, ra, disp16);
2219
        gen_bcond(ctx, TCG_COND_LE, ra, disp16, 0);
2192 2220
        ret = 1;
2193 2221
        break;
2194 2222
    case 0x3C:
2195 2223
        /* BLBS */
2196
        gen_bcond(ctx, &gen_op_cmplbs, ra, disp16);
2224
        gen_bcond(ctx, TCG_COND_NE, ra, disp16, 1);
2197 2225
        ret = 1;
2198 2226
        break;
2199 2227
    case 0x3D:
2200 2228
        /* BNE */
2201
        gen_bcond(ctx, &gen_op_cmpnez, ra, disp16);
2229
        gen_bcond(ctx, TCG_COND_NE, ra, disp16, 0);
2202 2230
        ret = 1;
2203 2231
        break;
2204 2232
    case 0x3E:
2205 2233
        /* BGE */
2206
        gen_bcond(ctx, &gen_op_cmpgez, ra, disp16);
2234
        gen_bcond(ctx, TCG_COND_GE, ra, disp16, 0);
2207 2235
        ret = 1;
2208 2236
        break;
2209 2237
    case 0x3F:
2210 2238
        /* BGT */
2211
        gen_bcond(ctx, &gen_op_cmpgtz, ra, disp16);
2239
        gen_bcond(ctx, TCG_COND_GT, ra, disp16, 0);
2212 2240
        ret = 1;
2213 2241
        break;
2214 2242
    invalid_opc:

Also available in: Unified diff