Revision eaabeef2

b/target-ppc/cpu.h
1505 1505
    PPC_DCRX           = 0x2000000000000000ULL,
1506 1506
    /* user-mode DCR access, implemented in PowerPC 460                      */
1507 1507
    PPC_DCRUX          = 0x4000000000000000ULL,
1508
    /* popcntw and popcntd instructions                                      */
1509
    PPC_POPCNTWD       = 0x8000000000000000ULL,
1508 1510
};
1509 1511

  
1510 1512
/*****************************************************************************/
b/target-ppc/helper.h
38 38

  
39 39
DEF_HELPER_FLAGS_1(cntlzw, TCG_CALL_CONST | TCG_CALL_PURE, tl, tl)
40 40
DEF_HELPER_FLAGS_1(popcntb, TCG_CALL_CONST | TCG_CALL_PURE, tl, tl)
41
DEF_HELPER_FLAGS_1(popcntw, TCG_CALL_CONST | TCG_CALL_PURE, tl, tl)
41 42
DEF_HELPER_2(sraw, tl, tl, tl)
42 43
#if defined(TARGET_PPC64)
43 44
DEF_HELPER_FLAGS_1(cntlzd, TCG_CALL_CONST | TCG_CALL_PURE, tl, tl)
44
DEF_HELPER_FLAGS_1(popcntb_64, TCG_CALL_CONST | TCG_CALL_PURE, tl, tl)
45
DEF_HELPER_FLAGS_1(popcntd, TCG_CALL_CONST | TCG_CALL_PURE, tl, tl)
45 46
DEF_HELPER_2(srad, tl, tl, tl)
46 47
#endif
47 48

  
b/target-ppc/op_helper.c
499 499
}
500 500
#endif
501 501

  
502
#if defined(TARGET_PPC64)
503
target_ulong helper_popcntb (target_ulong val)
504
{
505
    val = (val & 0x5555555555555555ULL) + ((val >>  1) &
506
                                           0x5555555555555555ULL);
507
    val = (val & 0x3333333333333333ULL) + ((val >>  2) &
508
                                           0x3333333333333333ULL);
509
    val = (val & 0x0f0f0f0f0f0f0f0fULL) + ((val >>  4) &
510
                                           0x0f0f0f0f0f0f0f0fULL);
511
    return val;
512
}
513

  
514
target_ulong helper_popcntw (target_ulong val)
515
{
516
    val = (val & 0x5555555555555555ULL) + ((val >>  1) &
517
                                           0x5555555555555555ULL);
518
    val = (val & 0x3333333333333333ULL) + ((val >>  2) &
519
                                           0x3333333333333333ULL);
520
    val = (val & 0x0f0f0f0f0f0f0f0fULL) + ((val >>  4) &
521
                                           0x0f0f0f0f0f0f0f0fULL);
522
    val = (val & 0x00ff00ff00ff00ffULL) + ((val >>  8) &
523
                                           0x00ff00ff00ff00ffULL);
524
    val = (val & 0x0000ffff0000ffffULL) + ((val >> 16) &
525
                                           0x0000ffff0000ffffULL);
526
    return val;
527
}
528

  
529
target_ulong helper_popcntd (target_ulong val)
530
{
531
    val = (val & 0x5555555555555555ULL) + ((val >>  1) &
532
                                           0x5555555555555555ULL);
533
    val = (val & 0x3333333333333333ULL) + ((val >>  2) &
534
                                           0x3333333333333333ULL);
535
    val = (val & 0x0f0f0f0f0f0f0f0fULL) + ((val >>  4) &
536
                                           0x0f0f0f0f0f0f0f0fULL);
537
    val = (val & 0x00ff00ff00ff00ffULL) + ((val >>  8) &
538
                                           0x00ff00ff00ff00ffULL);
539
    val = (val & 0x0000ffff0000ffffULL) + ((val >> 16) &
540
                                           0x0000ffff0000ffffULL);
541
    val = (val & 0x00000000ffffffffULL) + ((val >> 32) &
542
                                           0x00000000ffffffffULL);
543
    return val;
544
}
545
#else
502 546
target_ulong helper_popcntb (target_ulong val)
503 547
{
504 548
    val = (val & 0x55555555) + ((val >>  1) & 0x55555555);
......
507 551
    return val;
508 552
}
509 553

  
510
#if defined(TARGET_PPC64)
511
target_ulong helper_popcntb_64 (target_ulong val)
554
target_ulong helper_popcntw (target_ulong val)
512 555
{
513
    val = (val & 0x5555555555555555ULL) + ((val >>  1) & 0x5555555555555555ULL);
514
    val = (val & 0x3333333333333333ULL) + ((val >>  2) & 0x3333333333333333ULL);
515
    val = (val & 0x0f0f0f0f0f0f0f0fULL) + ((val >>  4) & 0x0f0f0f0f0f0f0f0fULL);
556
    val = (val & 0x55555555) + ((val >>  1) & 0x55555555);
557
    val = (val & 0x33333333) + ((val >>  2) & 0x33333333);
558
    val = (val & 0x0f0f0f0f) + ((val >>  4) & 0x0f0f0f0f);
559
    val = (val & 0x00ff00ff) + ((val >>  8) & 0x00ff00ff);
560
    val = (val & 0x0000ffff) + ((val >> 16) & 0x0000ffff);
516 561
    return val;
517 562
}
518 563
#endif
b/target-ppc/translate.c
1483 1483
/* popcntb : PowerPC 2.03 specification */
1484 1484
static void gen_popcntb(DisasContext *ctx)
1485 1485
{
1486
    gen_helper_popcntb(cpu_gpr[rA(ctx->opcode)], cpu_gpr[rS(ctx->opcode)]);
1487
}
1488

  
1489
static void gen_popcntw(DisasContext *ctx)
1490
{
1491
    gen_helper_popcntw(cpu_gpr[rA(ctx->opcode)], cpu_gpr[rS(ctx->opcode)]);
1492
}
1493

  
1486 1494
#if defined(TARGET_PPC64)
1487
    if (ctx->sf_mode)
1488
        gen_helper_popcntb_64(cpu_gpr[rA(ctx->opcode)], cpu_gpr[rS(ctx->opcode)]);
1489
    else
1490
#endif
1491
        gen_helper_popcntb(cpu_gpr[rA(ctx->opcode)], cpu_gpr[rS(ctx->opcode)]);
1495
/* popcntd: PowerPC 2.06 specification */
1496
static void gen_popcntd(DisasContext *ctx)
1497
{
1498
    gen_helper_popcntd(cpu_gpr[rA(ctx->opcode)], cpu_gpr[rS(ctx->opcode)]);
1492 1499
}
1500
#endif
1493 1501

  
1494 1502
#if defined(TARGET_PPC64)
1495 1503
/* extsw & extsw. */
......
8226 8234
GEN_HANDLER(xori, 0x1A, 0xFF, 0xFF, 0x00000000, PPC_INTEGER),
8227 8235
GEN_HANDLER(xoris, 0x1B, 0xFF, 0xFF, 0x00000000, PPC_INTEGER),
8228 8236
GEN_HANDLER(popcntb, 0x1F, 0x03, 0x03, 0x0000F801, PPC_POPCNTB),
8237
GEN_HANDLER(popcntw, 0x1F, 0x1A, 0x0b, 0x0000F801, PPC_POPCNTWD),
8229 8238
#if defined(TARGET_PPC64)
8239
GEN_HANDLER(popcntd, 0x1F, 0x1A, 0x0F, 0x0000F801, PPC_POPCNTWD),
8230 8240
GEN_HANDLER(cntlzd, 0x1F, 0x1A, 0x01, 0x00000000, PPC_64B),
8231 8241
#endif
8232 8242
GEN_HANDLER(rlwimi, 0x14, 0xFF, 0xFF, 0x00000000, PPC_INTEGER),

Also available in: Unified diff