Revision 9c29504e

b/target-alpha/op.c
434 434
    RETURN();
435 435
}
436 436

  
437
void OPPROTO op_cmpeqz (void)
438
{
439
    if (T0 == 0)
440
        T0 = 1;
441
    else
442
        T0 = 0;
443
    RETURN();
444
}
445

  
446
void OPPROTO op_cmpnez (void)
447
{
448
    if (T0 != 0)
449
        T0 = 1;
450
    else
451
        T0 = 0;
452
    RETURN();
453
}
454

  
455
void OPPROTO op_cmpltz (void)
456
{
457
    if ((int64_t)T0 < 0)
458
        T0 = 1;
459
    else
460
        T0 = 0;
461
    RETURN();
462
}
463

  
464
void OPPROTO op_cmplez (void)
465
{
466
    if ((int64_t)T0 <= 0)
467
        T0 = 1;
468
    else
469
        T0 = 0;
470
    RETURN();
471
}
472

  
473
void OPPROTO op_cmpgtz (void)
474
{
475
    if ((int64_t)T0 > 0)
476
        T0 = 1;
477
    else
478
        T0 = 0;
479
    RETURN();
480
}
481

  
482
void OPPROTO op_cmpgez (void)
483
{
484
    if ((int64_t)T0 >= 0)
485
        T0 = 1;
486
    else
487
        T0 = 0;
488
    RETURN();
489
}
490

  
491
void OPPROTO op_cmplbs (void)
492
{
493
    T0 &= 1;
494
    RETURN();
495
}
496

  
497
void OPPROTO op_cmplbc (void)
498
{
499
    T0 = (~T0) & 1;
500
    RETURN();
501
}
502

  
503 437
#if 0 // Qemu does not know how to do this...
504 438
void OPPROTO op_bcond (void)
505 439
{
b/target-alpha/op_template.h
37 37

  
38 38
#endif /* REG < 3 */
39 39

  
40
/* Fixed-point register moves */
41 40
#if REG < 31
42
void OPPROTO glue(op_cmov_ir, REG) (void)
43
{
44
    if (T0)
45
        env->ir[REG] = T1;
46
    RETURN();
47
}
48

  
49 41
/* floating point registers moves */
50 42
void OPPROTO glue(op_load_FT0_fir, REG) (void)
51 43
{
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