Revision ae8ecd42

b/target-alpha/helper.h
3 3
#endif
4 4

  
5 5
DEF_HELPER(void, helper_tb_flush, (void))
6

  
7
DEF_HELPER(uint64_t, helper_amask, (uint64_t))
8

  
9
DEF_HELPER(uint64_t, helper_ctpop, (uint64_t))
10
DEF_HELPER(uint64_t, helper_ctlz, (uint64_t))
11
DEF_HELPER(uint64_t, helper_cttz, (uint64_t))
b/target-alpha/op.c
155 155
    RETURN();
156 156
}
157 157

  
158
void OPPROTO op_load_amask (void)
159
{
160
    helper_amask();
161
    RETURN();
162
}
163

  
164 158
void OPPROTO op_load_pcc (void)
165 159
{
166 160
    helper_load_pcc();
......
340 334
    RETURN();
341 335
}
342 336

  
343
void OPPROTO op_sextb (void)
344
{
345
    T0 = (int64_t)((int8_t)T0);
346
    RETURN();
347
}
348

  
349
void OPPROTO op_sextw (void)
350
{
351
    T0 = (int64_t)((int16_t)T0);
352
    RETURN();
353

  
354
}
355

  
356
void OPPROTO op_ctpop (void)
357
{
358
    helper_ctpop();
359
    RETURN();
360
}
361

  
362
void OPPROTO op_ctlz (void)
363
{
364
    helper_ctlz();
365
    RETURN();
366
}
367

  
368
void OPPROTO op_cttz (void)
369
{
370
    helper_cttz();
371
    RETURN();
372
}
373

  
374 337
void OPPROTO op_mskbl (void)
375 338
{
376 339
    helper_mskbl();
b/target-alpha/op_helper.c
65 65
    cpu_loop_exit();
66 66
}
67 67

  
68
void helper_amask (void)
68
uint64_t helper_amask (uint64_t arg)
69 69
{
70 70
    switch (env->implver) {
71 71
    case IMPLVER_2106x:
......
74 74
    case IMPLVER_21164:
75 75
    case IMPLVER_21264:
76 76
    case IMPLVER_21364:
77
        T0 &= ~env->amask;
77
        arg &= ~env->amask;
78 78
        break;
79 79
    }
80
    return arg;
80 81
}
81 82

  
82 83
void helper_load_pcc (void)
......
210 211
    T0 = tl;
211 212
}
212 213

  
213
void helper_ctpop (void)
214
uint64_t helper_ctpop (uint64_t arg)
214 215
{
215
    T0 = ctpop64(T0);
216
    return ctpop64(arg);
216 217
}
217 218

  
218
void helper_ctlz (void)
219
uint64_t helper_ctlz (uint64_t arg)
219 220
{
220
    T0 = clz64(T0);
221
    return clz64(arg);
221 222
}
222 223

  
223
void helper_cttz (void)
224
uint64_t helper_cttz (uint64_t arg)
224 225
{
225
    T0 = ctz64(T0);
226
    return ctz64(arg);
226 227
}
227 228

  
228 229
static always_inline uint64_t byte_zap (uint64_t op, uint8_t mskb)
b/target-alpha/op_helper.h
20 20

  
21 21
void helper_call_pal (uint32_t palcode);
22 22
void helper_excp (uint32_t excp, uint32_t error);
23
void helper_amask (void);
24 23
void helper_load_pcc (void);
25 24
void helper_load_implver (void);
26 25
void helper_load_fpcr (void);
......
34 33
void helper_sublv (void);
35 34
void helper_mullv (void);
36 35
void helper_mulqv (void);
37
void helper_ctpop (void);
38
void helper_ctlz (void);
39
void helper_cttz (void);
40 36
void helper_mskbl (void);
41 37
void helper_extbl (void);
42 38
void helper_insbl (void);
b/target-alpha/translate.c
25 25
#include "cpu.h"
26 26
#include "exec-all.h"
27 27
#include "disas.h"
28
#include "host-utils.h"
28 29
#include "helper.h"
29 30
#include "tcg-op.h"
30 31
#include "qemu-common.h"
......
349 350
    _gen_op_bcond(ctx);
350 351
}
351 352

  
352
static always_inline void gen_arith2 (DisasContext *ctx,
353
                                      void (*gen_arith_op)(void),
354
                                      int rb, int rc, int islit, uint8_t lit)
355
{
356
    if (islit)
357
        tcg_gen_movi_i64(cpu_T[0], lit);
358
    else if (rb != 31)
359
        tcg_gen_mov_i64(cpu_T[0], cpu_ir[rb]);
360
    else
361
        tcg_gen_movi_i64(cpu_T[0], 0);
362
    (*gen_arith_op)();
363
    if (rc != 31)
364
        tcg_gen_mov_i64(cpu_ir[rc], cpu_T[0]);
365
}
366

  
367 353
static always_inline void gen_arith3 (DisasContext *ctx,
368 354
                                      void (*gen_arith_op)(void),
369 355
                                      int ra, int rb, int rc,
......
502 488
    tcg_gen_sub_i64(cpu_T[0], cpu_T[0], cpu_T[1]);
503 489
}
504 490

  
505
static always_inline void gen_amask (void)
506
{
507
    gen_op_load_amask();
508
    gen_op_bic();
509
}
510

  
511 491
static always_inline int translate_one (DisasContext *ctx, uint32_t insn)
512 492
{
513 493
    uint32_t palcode;
......
793 773
            break;
794 774
        case 0x61:
795 775
            /* AMASK */
796
            gen_arith2(ctx, &gen_amask, rb, rc, islit, lit);
776
            if (likely(rc != 31)) {
777
                if (islit)
778
                    tcg_gen_movi_i64(cpu_ir[rc], helper_amask(lit));
779
                else if (rb != 31)
780
                    tcg_gen_helper_1_1(helper_amask, cpu_ir[rc], cpu_ir[rb]);
781
                else
782
                    tcg_gen_movi_i64(cpu_ir[rc], 0);
783
            }
797 784
            break;
798 785
        case 0x64:
799 786
            /* CMOVLE */
......
1446 1433
            /* SEXTB */
1447 1434
            if (!(ctx->amask & AMASK_BWX))
1448 1435
                goto invalid_opc;
1449
            gen_arith2(ctx, &gen_op_sextb, rb, rc, islit, lit);
1436
            if (likely(rc != 31)) {
1437
                if (islit)
1438
                    tcg_gen_movi_i64(cpu_ir[rc], (int64_t)((int8_t)lit));
1439
                else if (rb != 31)
1440
                    tcg_gen_ext8s_i64(cpu_ir[rc], cpu_ir[rb]);
1441
                else
1442
                    tcg_gen_movi_i64(cpu_ir[rc], 0);
1443
            }
1450 1444
            break;
1451 1445
        case 0x01:
1452 1446
            /* SEXTW */
1453 1447
            if (!(ctx->amask & AMASK_BWX))
1454 1448
                goto invalid_opc;
1455
            gen_arith2(ctx, &gen_op_sextw, rb, rc, islit, lit);
1449
            if (likely(rc != 31)) {
1450
                if (islit)
1451
                    tcg_gen_movi_i64(cpu_ir[rc], (int64_t)((int16_t)lit));
1452
                else if (rb != 31)
1453
                    tcg_gen_ext16s_i64(cpu_ir[rc], cpu_ir[rb]);
1454
                else
1455
                    tcg_gen_movi_i64(cpu_ir[rc], 0);
1456
            }
1456 1457
            break;
1457 1458
        case 0x30:
1458 1459
            /* CTPOP */
1459 1460
            if (!(ctx->amask & AMASK_CIX))
1460 1461
                goto invalid_opc;
1461
            gen_arith2(ctx, &gen_op_ctpop, rb, rc, 0, 0);
1462
            if (likely(rc != 31)) {
1463
                if (islit)
1464
                    tcg_gen_movi_i64(cpu_ir[rc], ctpop64(lit));
1465
                else if (rb != 31)
1466
                    tcg_gen_helper_1_1(helper_ctpop, cpu_ir[rc], cpu_ir[rb]);
1467
                else
1468
                    tcg_gen_movi_i64(cpu_ir[rc], 0);
1469
            }
1462 1470
            break;
1463 1471
        case 0x31:
1464 1472
            /* PERR */
......
1471 1479
            /* CTLZ */
1472 1480
            if (!(ctx->amask & AMASK_CIX))
1473 1481
                goto invalid_opc;
1474
            gen_arith2(ctx, &gen_op_ctlz, rb, rc, 0, 0);
1482
            if (likely(rc != 31)) {
1483
                if (islit)
1484
                    tcg_gen_movi_i64(cpu_ir[rc], clz64(lit));
1485
                else if (rb != 31)
1486
                    tcg_gen_helper_1_1(helper_ctlz, cpu_ir[rc], cpu_ir[rb]);
1487
                else
1488
                    tcg_gen_movi_i64(cpu_ir[rc], 0);
1489
            }
1475 1490
            break;
1476 1491
        case 0x33:
1477 1492
            /* CTTZ */
1478 1493
            if (!(ctx->amask & AMASK_CIX))
1479 1494
                goto invalid_opc;
1480
            gen_arith2(ctx, &gen_op_cttz, rb, rc, 0, 0);
1495
            if (likely(rc != 31)) {
1496
                if (islit)
1497
                    tcg_gen_movi_i64(cpu_ir[rc], ctz64(lit));
1498
                else if (rb != 31)
1499
                    tcg_gen_helper_1_1(helper_cttz, cpu_ir[rc], cpu_ir[rb]);
1500
                else
1501
                    tcg_gen_movi_i64(cpu_ir[rc], 0);
1502
            }
1481 1503
            break;
1482 1504
        case 0x34:
1483 1505
            /* UNPKBW */

Also available in: Unified diff