Revision a750fc0b target-ppc/translate.c

b/target-ppc/translate.c
27 27
#include "exec-all.h"
28 28
#include "disas.h"
29 29

  
30
/* Include definitions for instructions classes and implementations flags */
30 31
//#define DO_SINGLE_STEP
31 32
//#define PPC_DEBUG_DISAS
32 33
//#define DEBUG_MEMORY_ACCESSES
33 34
//#define DO_PPC_STATISTICS
34 35

  
36
/*****************************************************************************/
37
/* Code translation helpers                                                  */
35 38
#if defined(USE_DIRECT_JUMP)
36 39
#define TBPARAM(x)
37 40
#else
......
175 178
    uint64_t type;
176 179
    /* handler */
177 180
    void (*handler)(DisasContext *ctx);
178
#if defined(DO_PPC_STATISTICS)
181
#if defined(DO_PPC_STATISTICS) || defined(PPC_DUMP_CPU)
179 182
    const unsigned char *oname;
183
#endif
184
#if defined(DO_PPC_STATISTICS)
180 185
    uint64_t count;
181 186
#endif
182 187
};
......
249 254
    const unsigned char *oname;
250 255
} opcode_t;
251 256

  
257
/*****************************************************************************/
252 258
/***                           Instruction decoding                        ***/
253 259
#define EXTRACT_HELPER(name, shift, nb)                                       \
254 260
static inline uint32_t name (uint32_t opcode)                                 \
......
365 371
    return ret;
366 372
}
367 373

  
374
/*****************************************************************************/
375
/* PowerPC Instructions types definitions                                    */
376
enum {
377
    PPC_NONE          = 0x0000000000000000ULL,
378
    /* integer operations instructions                  */
379
    /* flow control instructions                        */
380
    /* virtual memory instructions                      */
381
    /* ld/st with reservation instructions              */
382
    /* cache control instructions                       */
383
    /* spr/msr access instructions                      */
384
    PPC_INSNS_BASE    = 0x0000000000000001ULL,
385
#define PPC_INTEGER PPC_INSNS_BASE
386
#define PPC_FLOW    PPC_INSNS_BASE
387
#define PPC_MEM     PPC_INSNS_BASE
388
#define PPC_RES     PPC_INSNS_BASE
389
#define PPC_CACHE   PPC_INSNS_BASE
390
#define PPC_MISC    PPC_INSNS_BASE
391
    /* Optional floating point instructions             */
392
    PPC_FLOAT         = 0x0000000000000002ULL,
393
    PPC_FLOAT_FSQRT   = 0x0000000000000004ULL,
394
    PPC_FLOAT_FRES    = 0x0000000000000008ULL,
395
    PPC_FLOAT_FRSQRTE = 0x0000000000000010ULL,
396
    PPC_FLOAT_FSEL    = 0x0000000000000020ULL,
397
    PPC_FLOAT_STFIWX  = 0x0000000000000040ULL,
398
    /* external control instructions                    */
399
    PPC_EXTERN        = 0x0000000000000080ULL,
400
    /* segment register access instructions             */
401
    PPC_SEGMENT       = 0x0000000000000100ULL,
402
    /* Optional cache control instruction               */
403
    PPC_CACHE_DCBA    = 0x0000000000000200ULL,
404
    /* Optional memory control instructions             */
405
    PPC_MEM_TLBIA     = 0x0000000000000400ULL,
406
    PPC_MEM_TLBIE     = 0x0000000000000800ULL,
407
    PPC_MEM_TLBSYNC   = 0x0000000000001000ULL,
408
    /* eieio & sync                                     */
409
    PPC_MEM_SYNC      = 0x0000000000002000ULL,
410
    /* PowerPC 6xx TLB management instructions          */
411
    PPC_6xx_TLB       = 0x0000000000004000ULL,
412
    /* Altivec support                                  */
413
    PPC_ALTIVEC       = 0x0000000000008000ULL,
414
    /* Time base mftb instruction                       */
415
    PPC_MFTB          = 0x0000000000010000ULL,
416
    /* Embedded PowerPC dedicated instructions          */
417
    PPC_EMB_COMMON    = 0x0000000000020000ULL,
418
    /* PowerPC 40x exception model                      */
419
    PPC_40x_EXCP      = 0x0000000000040000ULL,
420
    /* PowerPC 40x TLB management instructions          */
421
    PPC_40x_TLB       = 0x0000000000080000ULL,
422
    /* PowerPC 405 Mac instructions                     */
423
    PPC_405_MAC       = 0x0000000000100000ULL,
424
    /* PowerPC 440 specific instructions                */
425
    PPC_440_SPEC      = 0x0000000000200000ULL,
426
    /* Power-to-PowerPC bridge (601)                    */
427
    PPC_POWER_BR      = 0x0000000000400000ULL,
428
    /* PowerPC 602 specific */
429
    PPC_602_SPEC      = 0x0000000000800000ULL,
430
    /* Deprecated instructions                          */
431
    /* Original POWER instruction set                   */
432
    PPC_POWER         = 0x0000000001000000ULL,
433
    /* POWER2 instruction set extension                 */
434
    PPC_POWER2        = 0x0000000002000000ULL,
435
    /* Power RTC support */
436
    PPC_POWER_RTC     = 0x0000000004000000ULL,
437
    /* 64 bits PowerPC instructions                     */
438
    /* 64 bits PowerPC instruction set                  */
439
    PPC_64B           = 0x0000000008000000ULL,
440
    /* 64 bits hypervisor extensions                    */
441
    PPC_64H           = 0x0000000010000000ULL,
442
    /* 64 bits PowerPC "bridge" features                */
443
    PPC_64_BRIDGE     = 0x0000000020000000ULL,
444
    /* BookE (embedded) PowerPC specification           */
445
    PPC_BOOKE         = 0x0000000040000000ULL,
446
    /* eieio                                            */
447
    PPC_MEM_EIEIO     = 0x0000000080000000ULL,
448
    /* e500 vector instructions                         */
449
    PPC_E500_VECTOR   = 0x0000000100000000ULL,
450
    /* PowerPC 4xx dedicated instructions               */
451
    PPC_4xx_COMMON    = 0x0000000200000000ULL,
452
    /* PowerPC 2.03 specification extensions            */
453
    PPC_203           = 0x0000000400000000ULL,
454
    /* PowerPC 2.03 SPE extension                       */
455
    PPC_SPE           = 0x0000000800000000ULL,
456
    /* PowerPC 2.03 SPE floating-point extension        */
457
    PPC_SPEFPU        = 0x0000001000000000ULL,
458
    /* SLB management                                   */
459
    PPC_SLBI          = 0x0000002000000000ULL,
460
    /* PowerPC 40x ibct instructions                    */
461
    PPC_40x_ICBT      = 0x0000004000000000ULL,
462
    /* PowerPC 74xx TLB management instructions         */
463
    PPC_74xx_TLB      = 0x0000008000000000ULL,
464
    /* More BookE (embedded) instructions...            */
465
    PPC_BOOKE_EXT     = 0x0000010000000000ULL,
466
    /* rfmci is not implemented in all BookE PowerPC    */
467
    PPC_RFMCI         = 0x0000020000000000ULL,
468
    /* user-mode DCR access, implemented in PowerPC 460 */
469
    PPC_DCRUX         = 0x0000040000000000ULL,
470
};
471

  
472
/*****************************************************************************/
473
/* PowerPC instructions table                                                */
368 474
#if HOST_LONG_BITS == 64
369 475
#define OPC_ALIGN 8
370 476
#else
......
845 951

  
846 952
#if defined(TARGET_PPC64)
847 953
/* mulhd  mulhd.                   */
848
GEN_INT_ARITHN (mulhd,  0x1F, 0x09, 0x02, PPC_INTEGER);
954
GEN_INT_ARITHN (mulhd,  0x1F, 0x09, 0x02, PPC_64B);
849 955
/* mulhdu mulhdu.                  */
850
GEN_INT_ARITHN (mulhdu, 0x1F, 0x09, 0x00, PPC_INTEGER);
956
GEN_INT_ARITHN (mulhdu, 0x1F, 0x09, 0x00, PPC_64B);
851 957
/* mulld  mulld.  mulldo  mulldo.  */
852
GEN_INT_ARITH2 (mulld,  0x1F, 0x09, 0x07, PPC_INTEGER);
958
GEN_INT_ARITH2 (mulld,  0x1F, 0x09, 0x07, PPC_64B);
853 959
/* divd   divd.   divdo   divdo.   */
854
GEN_INT_ARITH2 (divd,   0x1F, 0x09, 0x0F, PPC_INTEGER);
960
GEN_INT_ARITH2 (divd,   0x1F, 0x09, 0x0F, PPC_64B);
855 961
/* divdu  divdu.  divduo  divduo.  */
856
GEN_INT_ARITH2 (divdu,  0x1F, 0x09, 0x0E, PPC_INTEGER);
962
GEN_INT_ARITH2 (divdu,  0x1F, 0x09, 0x0E, PPC_64B);
857 963
#endif
858 964

  
859 965
/***                           Integer comparison                          ***/
......
1424 1530
#endif
1425 1531

  
1426 1532
/***                       Floating-Point arithmetic                       ***/
1427
#define _GEN_FLOAT_ACB(name, op, op1, op2, isfloat)                           \
1428
GEN_HANDLER(f##name, op1, op2, 0xFF, 0x00000000, PPC_FLOAT)                   \
1533
#define _GEN_FLOAT_ACB(name, op, op1, op2, isfloat, type)                     \
1534
GEN_HANDLER(f##name, op1, op2, 0xFF, 0x00000000, type)                        \
1429 1535
{                                                                             \
1430 1536
    if (unlikely(!ctx->fpu_enabled)) {                                        \
1431 1537
        RET_EXCP(ctx, EXCP_NO_FP, 0);                                         \
......
1444 1550
        gen_op_set_Rc1();                                                     \
1445 1551
}
1446 1552

  
1447
#define GEN_FLOAT_ACB(name, op2)                                              \
1448
_GEN_FLOAT_ACB(name, name, 0x3F, op2, 0);                                     \
1449
_GEN_FLOAT_ACB(name##s, name, 0x3B, op2, 1);
1553
#define GEN_FLOAT_ACB(name, op2, type)                                        \
1554
_GEN_FLOAT_ACB(name, name, 0x3F, op2, 0, type);                               \
1555
_GEN_FLOAT_ACB(name##s, name, 0x3B, op2, 1, type);
1450 1556

  
1451 1557
#define _GEN_FLOAT_AB(name, op, op1, op2, inval, isfloat)                     \
1452 1558
GEN_HANDLER(f##name, op1, op2, 0xFF, inval, PPC_FLOAT)                        \
......
1492 1598
_GEN_FLOAT_AC(name, name, 0x3F, op2, inval, 0);                               \
1493 1599
_GEN_FLOAT_AC(name##s, name, 0x3B, op2, inval, 1);
1494 1600

  
1495
#define GEN_FLOAT_B(name, op2, op3)                                           \
1496
GEN_HANDLER(f##name, 0x3F, op2, op3, 0x001F0000, PPC_FLOAT)                   \
1601
#define GEN_FLOAT_B(name, op2, op3, type)                                     \
1602
GEN_HANDLER(f##name, 0x3F, op2, op3, 0x001F0000, type)                        \
1497 1603
{                                                                             \
1498 1604
    if (unlikely(!ctx->fpu_enabled)) {                                        \
1499 1605
        RET_EXCP(ctx, EXCP_NO_FP, 0);                                         \
......
1507 1613
        gen_op_set_Rc1();                                                     \
1508 1614
}
1509 1615

  
1510
#define GEN_FLOAT_BS(name, op1, op2)                                          \
1511
GEN_HANDLER(f##name, op1, op2, 0xFF, 0x001F07C0, PPC_FLOAT)                   \
1616
#define GEN_FLOAT_BS(name, op1, op2, type)                                    \
1617
GEN_HANDLER(f##name, op1, op2, 0xFF, 0x001F07C0, type)                        \
1512 1618
{                                                                             \
1513 1619
    if (unlikely(!ctx->fpu_enabled)) {                                        \
1514 1620
        RET_EXCP(ctx, EXCP_NO_FP, 0);                                         \
......
1529 1635
/* fmul - fmuls */
1530 1636
GEN_FLOAT_AC(mul, 0x19, 0x0000F800);
1531 1637

  
1532
/* fres */ /* XXX: not in 601 */
1533
GEN_FLOAT_BS(res, 0x3B, 0x18);
1638
/* fres */
1639
GEN_FLOAT_BS(res, 0x3B, 0x18, PPC_FLOAT_FRES);
1534 1640

  
1535
/* frsqrte */ /* XXX: not in 601 */
1536
GEN_FLOAT_BS(rsqrte, 0x3F, 0x1A);
1641
/* frsqrte */
1642
GEN_FLOAT_BS(rsqrte, 0x3F, 0x1A, PPC_FLOAT_FRSQRTE);
1537 1643

  
1538
/* fsel */ /* XXX: not in 601 */
1539
_GEN_FLOAT_ACB(sel, sel, 0x3F, 0x17, 0);
1644
/* fsel */
1645
_GEN_FLOAT_ACB(sel, sel, 0x3F, 0x17, 0, PPC_FLOAT_FSEL);
1540 1646
/* fsub - fsubs */
1541 1647
GEN_FLOAT_AB(sub, 0x14, 0x000007C0);
1542 1648
/* Optional: */
1543 1649
/* fsqrt */
1544
GEN_HANDLER(fsqrt, 0x3F, 0x16, 0xFF, 0x001F07C0, PPC_FLOAT_OPT)
1650
GEN_HANDLER(fsqrt, 0x3F, 0x16, 0xFF, 0x001F07C0, PPC_FLOAT_FSQRT)
1545 1651
{
1546 1652
    if (unlikely(!ctx->fpu_enabled)) {
1547 1653
        RET_EXCP(ctx, EXCP_NO_FP, 0);
......
1555 1661
        gen_op_set_Rc1();
1556 1662
}
1557 1663

  
1558
GEN_HANDLER(fsqrts, 0x3B, 0x16, 0xFF, 0x001F07C0, PPC_FLOAT_OPT)
1664
GEN_HANDLER(fsqrts, 0x3B, 0x16, 0xFF, 0x001F07C0, PPC_FLOAT_FSQRT)
1559 1665
{
1560 1666
    if (unlikely(!ctx->fpu_enabled)) {
1561 1667
        RET_EXCP(ctx, EXCP_NO_FP, 0);
......
1572 1678

  
1573 1679
/***                     Floating-Point multiply-and-add                   ***/
1574 1680
/* fmadd - fmadds */
1575
GEN_FLOAT_ACB(madd, 0x1D);
1681
GEN_FLOAT_ACB(madd, 0x1D, PPC_FLOAT);
1576 1682
/* fmsub - fmsubs */
1577
GEN_FLOAT_ACB(msub, 0x1C);
1683
GEN_FLOAT_ACB(msub, 0x1C, PPC_FLOAT);
1578 1684
/* fnmadd - fnmadds */
1579
GEN_FLOAT_ACB(nmadd, 0x1F);
1685
GEN_FLOAT_ACB(nmadd, 0x1F, PPC_FLOAT);
1580 1686
/* fnmsub - fnmsubs */
1581
GEN_FLOAT_ACB(nmsub, 0x1E);
1687
GEN_FLOAT_ACB(nmsub, 0x1E, PPC_FLOAT);
1582 1688

  
1583 1689
/***                     Floating-Point round & convert                    ***/
1584 1690
/* fctiw */
1585
GEN_FLOAT_B(ctiw, 0x0E, 0x00);
1691
GEN_FLOAT_B(ctiw, 0x0E, 0x00, PPC_FLOAT);
1586 1692
/* fctiwz */
1587
GEN_FLOAT_B(ctiwz, 0x0F, 0x00);
1693
GEN_FLOAT_B(ctiwz, 0x0F, 0x00, PPC_FLOAT);
1588 1694
/* frsp */
1589
GEN_FLOAT_B(rsp, 0x0C, 0x00);
1695
GEN_FLOAT_B(rsp, 0x0C, 0x00, PPC_FLOAT);
1590 1696
#if defined(TARGET_PPC64)
1591 1697
/* fcfid */
1592
GEN_FLOAT_B(cfid, 0x0E, 0x1A);
1698
GEN_FLOAT_B(cfid, 0x0E, 0x1A, PPC_64B);
1593 1699
/* fctid */
1594
GEN_FLOAT_B(ctid, 0x0E, 0x19);
1700
GEN_FLOAT_B(ctid, 0x0E, 0x19, PPC_64B);
1595 1701
/* fctidz */
1596
GEN_FLOAT_B(ctidz, 0x0F, 0x19);
1702
GEN_FLOAT_B(ctidz, 0x0F, 0x19, PPC_64B);
1597 1703
#endif
1598 1704

  
1599 1705
/***                         Floating-Point compare                        ***/
......
1627 1733

  
1628 1734
/***                         Floating-point move                           ***/
1629 1735
/* fabs */
1630
GEN_FLOAT_B(abs, 0x08, 0x08);
1736
GEN_FLOAT_B(abs, 0x08, 0x08, PPC_FLOAT);
1631 1737

  
1632 1738
/* fmr  - fmr. */
1633 1739
GEN_HANDLER(fmr, 0x3F, 0x08, 0x02, 0x001F0000, PPC_FLOAT)
......
1644 1750
}
1645 1751

  
1646 1752
/* fnabs */
1647
GEN_FLOAT_B(nabs, 0x08, 0x04);
1753
GEN_FLOAT_B(nabs, 0x08, 0x04, PPC_FLOAT);
1648 1754
/* fneg */
1649
GEN_FLOAT_B(neg, 0x08, 0x01);
1755
GEN_FLOAT_B(neg, 0x08, 0x01, PPC_FLOAT);
1650 1756

  
1651 1757
/***                  Floating-Point status & ctrl register                ***/
1652 1758
/* mcrfs */
......
2426 2532
#endif
2427 2533

  
2428 2534
/* ldarx */
2429
GEN_HANDLER(ldarx, 0x1F, 0x14, 0x02, 0x00000001, PPC_RES)
2535
GEN_HANDLER(ldarx, 0x1F, 0x14, 0x02, 0x00000001, PPC_64B)
2430 2536
{
2431 2537
    gen_addr_reg_index(ctx);
2432 2538
    op_ldarx();
......
2434 2540
}
2435 2541

  
2436 2542
/* stdcx. */
2437
GEN_HANDLER(stdcx_, 0x1F, 0x16, 0x06, 0x00000000, PPC_RES)
2543
GEN_HANDLER(stdcx_, 0x1F, 0x16, 0x06, 0x00000000, PPC_64B)
2438 2544
{
2439 2545
    gen_addr_reg_index(ctx);
2440 2546
    gen_op_load_gpr_T1(rS(ctx->opcode));
......
2591 2697

  
2592 2698
/* Optional: */
2593 2699
/* stfiwx */
2594
GEN_HANDLER(stfiwx, 0x1F, 0x17, 0x1E, 0x00000001, PPC_FLOAT)
2700
GEN_HANDLER(stfiwx, 0x1F, 0x17, 0x1E, 0x00000001, PPC_FLOAT_STFIWX)
2595 2701
{
2596 2702
    if (unlikely(!ctx->fpu_enabled)) {
2597 2703
        RET_EXCP(ctx, EXCP_NO_FP, 0);
......
2886 2992
}
2887 2993

  
2888 2994
#if defined(TARGET_PPC64)
2889
GEN_HANDLER(rfid, 0x13, 0x12, 0x00, 0x03FF8001, PPC_FLOW)
2995
GEN_HANDLER(rfid, 0x13, 0x12, 0x00, 0x03FF8001, PPC_64B)
2890 2996
{
2891 2997
#if defined(CONFIG_USER_ONLY)
2892 2998
    RET_PRIVOPC(ctx);
......
3050 3156
}
3051 3157

  
3052 3158
/* mftb */
3053
GEN_HANDLER(mftb, 0x1F, 0x13, 0x0B, 0x00000001, PPC_TB)
3159
GEN_HANDLER(mftb, 0x1F, 0x13, 0x0B, 0x00000001, PPC_MFTB)
3054 3160
{
3055 3161
    gen_op_mfspr(ctx);
3056 3162
}
......
3074 3180

  
3075 3181
/* mtmsr */
3076 3182
#if defined(TARGET_PPC64)
3077
GEN_HANDLER(mtmsrd, 0x1F, 0x12, 0x05, 0x001FF801, PPC_MISC)
3183
GEN_HANDLER(mtmsrd, 0x1F, 0x12, 0x05, 0x001FF801, PPC_64B)
3078 3184
{
3079 3185
#if defined(CONFIG_USER_ONLY)
3080 3186
    RET_PRIVREG(ctx);
......
3296 3402

  
3297 3403
/* Optional: */
3298 3404
/* dcba */
3299
GEN_HANDLER(dcba, 0x1F, 0x16, 0x17, 0x03E00001, PPC_CACHE_OPT)
3405
GEN_HANDLER(dcba, 0x1F, 0x16, 0x17, 0x03E00001, PPC_CACHE_DCBA)
3300 3406
{
3301 3407
}
3302 3408

  
......
3568 3674
}
3569 3675

  
3570 3676
/* clcs */
3571
GEN_HANDLER(clcs, 0x1F, 0x10, 0x13, 0x0000F800, PPC_POWER_BR) /* 601 ? */
3677
GEN_HANDLER(clcs, 0x1F, 0x10, 0x13, 0x0000F800, PPC_POWER_BR)
3572 3678
{
3573 3679
    gen_op_load_gpr_T0(rA(ctx->opcode));
3574 3680
    gen_op_POWER_clcs();
......
4222 4328

  
4223 4329
/* BookE specific instructions */
4224 4330
/* XXX: not implemented on 440 ? */
4225
GEN_HANDLER(mfapidi, 0x1F, 0x13, 0x08, 0x0000F801, PPC_BOOKE)
4331
GEN_HANDLER(mfapidi, 0x1F, 0x13, 0x08, 0x0000F801, PPC_BOOKE_EXT)
4226 4332
{
4227 4333
    /* XXX: TODO */
4228 4334
    RET_INVAL(ctx);
4229 4335
}
4230 4336

  
4231 4337
/* XXX: not implemented on 440 ? */
4232
GEN_HANDLER(tlbiva, 0x1F, 0x12, 0x18, 0x03FFF801, PPC_BOOKE)
4338
GEN_HANDLER(tlbiva, 0x1F, 0x12, 0x18, 0x03FFF801, PPC_BOOKE_EXT)
4233 4339
{
4234 4340
#if defined(CONFIG_USER_ONLY)
4235 4341
    RET_PRIVOPC(ctx);
......
4331 4437
    }
4332 4438
}
4333 4439

  
4334
#define GEN_MAC_HANDLER(name, opc2, opc3, is_440)                                     \
4335
GEN_HANDLER(name, 0x04, opc2, opc3, 0x00000000,                               \
4336
            is_440 ? PPC_440_SPEC : PPC_405_MAC)                              \
4440
#define GEN_MAC_HANDLER(name, opc2, opc3)                                     \
4441
GEN_HANDLER(name, 0x04, opc2, opc3, 0x00000000, PPC_405_MAC)                  \
4337 4442
{                                                                             \
4338 4443
    gen_405_mulladd_insn(ctx, opc2, opc3, rA(ctx->opcode), rB(ctx->opcode),   \
4339 4444
                         rD(ctx->opcode), Rc(ctx->opcode));                   \
4340 4445
}
4341 4446

  
4342 4447
/* macchw    - macchw.    */
4343
GEN_MAC_HANDLER(macchw, 0x0C, 0x05, 0);
4448
GEN_MAC_HANDLER(macchw, 0x0C, 0x05);
4344 4449
/* macchwo   - macchwo.   */
4345
GEN_MAC_HANDLER(macchwo, 0x0C, 0x15, 0);
4450
GEN_MAC_HANDLER(macchwo, 0x0C, 0x15);
4346 4451
/* macchws   - macchws.   */
4347
GEN_MAC_HANDLER(macchws, 0x0C, 0x07, 0);
4452
GEN_MAC_HANDLER(macchws, 0x0C, 0x07);
4348 4453
/* macchwso  - macchwso.  */
4349
GEN_MAC_HANDLER(macchwso, 0x0C, 0x17, 0);
4454
GEN_MAC_HANDLER(macchwso, 0x0C, 0x17);
4350 4455
/* macchwsu  - macchwsu.  */
4351
GEN_MAC_HANDLER(macchwsu, 0x0C, 0x06, 0);
4456
GEN_MAC_HANDLER(macchwsu, 0x0C, 0x06);
4352 4457
/* macchwsuo - macchwsuo. */
4353
GEN_MAC_HANDLER(macchwsuo, 0x0C, 0x16, 0);
4458
GEN_MAC_HANDLER(macchwsuo, 0x0C, 0x16);
4354 4459
/* macchwu   - macchwu.   */
4355
GEN_MAC_HANDLER(macchwu, 0x0C, 0x04, 0);
4460
GEN_MAC_HANDLER(macchwu, 0x0C, 0x04);
4356 4461
/* macchwuo  - macchwuo.  */
4357
GEN_MAC_HANDLER(macchwuo, 0x0C, 0x14, 0);
4462
GEN_MAC_HANDLER(macchwuo, 0x0C, 0x14);
4358 4463
/* machhw    - machhw.    */
4359
GEN_MAC_HANDLER(machhw, 0x0C, 0x01, 0);
4464
GEN_MAC_HANDLER(machhw, 0x0C, 0x01);
4360 4465
/* machhwo   - machhwo.   */
4361
GEN_MAC_HANDLER(machhwo, 0x0C, 0x11, 0);
4466
GEN_MAC_HANDLER(machhwo, 0x0C, 0x11);
4362 4467
/* machhws   - machhws.   */
4363
GEN_MAC_HANDLER(machhws, 0x0C, 0x03, 0);
4468
GEN_MAC_HANDLER(machhws, 0x0C, 0x03);
4364 4469
/* machhwso  - machhwso.  */
4365
GEN_MAC_HANDLER(machhwso, 0x0C, 0x13, 0);
4470
GEN_MAC_HANDLER(machhwso, 0x0C, 0x13);
4366 4471
/* machhwsu  - machhwsu.  */
4367
GEN_MAC_HANDLER(machhwsu, 0x0C, 0x02, 0);
4472
GEN_MAC_HANDLER(machhwsu, 0x0C, 0x02);
4368 4473
/* machhwsuo - machhwsuo. */
4369
GEN_MAC_HANDLER(machhwsuo, 0x0C, 0x12, 0);
4474
GEN_MAC_HANDLER(machhwsuo, 0x0C, 0x12);
4370 4475
/* machhwu   - machhwu.   */
4371
GEN_MAC_HANDLER(machhwu, 0x0C, 0x00, 0);
4476
GEN_MAC_HANDLER(machhwu, 0x0C, 0x00);
4372 4477
/* machhwuo  - machhwuo.  */
4373
GEN_MAC_HANDLER(machhwuo, 0x0C, 0x10, 0);
4478
GEN_MAC_HANDLER(machhwuo, 0x0C, 0x10);
4374 4479
/* maclhw    - maclhw.    */
4375
GEN_MAC_HANDLER(maclhw, 0x0C, 0x0D, 0);
4480
GEN_MAC_HANDLER(maclhw, 0x0C, 0x0D);
4376 4481
/* maclhwo   - maclhwo.   */
4377
GEN_MAC_HANDLER(maclhwo, 0x0C, 0x1D, 0);
4482
GEN_MAC_HANDLER(maclhwo, 0x0C, 0x1D);
4378 4483
/* maclhws   - maclhws.   */
4379
GEN_MAC_HANDLER(maclhws, 0x0C, 0x0F, 0);
4484
GEN_MAC_HANDLER(maclhws, 0x0C, 0x0F);
4380 4485
/* maclhwso  - maclhwso.  */
4381
GEN_MAC_HANDLER(maclhwso, 0x0C, 0x1F, 0);
4486
GEN_MAC_HANDLER(maclhwso, 0x0C, 0x1F);
4382 4487
/* maclhwu   - maclhwu.   */
4383
GEN_MAC_HANDLER(maclhwu, 0x0C, 0x0C, 0);
4488
GEN_MAC_HANDLER(maclhwu, 0x0C, 0x0C);
4384 4489
/* maclhwuo  - maclhwuo.  */
4385
GEN_MAC_HANDLER(maclhwuo, 0x0C, 0x1C, 0);
4490
GEN_MAC_HANDLER(maclhwuo, 0x0C, 0x1C);
4386 4491
/* maclhwsu  - maclhwsu.  */
4387
GEN_MAC_HANDLER(maclhwsu, 0x0C, 0x0E, 0);
4492
GEN_MAC_HANDLER(maclhwsu, 0x0C, 0x0E);
4388 4493
/* maclhwsuo - maclhwsuo. */
4389
GEN_MAC_HANDLER(maclhwsuo, 0x0C, 0x1E, 0);
4494
GEN_MAC_HANDLER(maclhwsuo, 0x0C, 0x1E);
4390 4495
/* nmacchw   - nmacchw.   */
4391
GEN_MAC_HANDLER(nmacchw, 0x0E, 0x05, 0);
4496
GEN_MAC_HANDLER(nmacchw, 0x0E, 0x05);
4392 4497
/* nmacchwo  - nmacchwo.  */
4393
GEN_MAC_HANDLER(nmacchwo, 0x0E, 0x15, 0);
4498
GEN_MAC_HANDLER(nmacchwo, 0x0E, 0x15);
4394 4499
/* nmacchws  - nmacchws.  */
4395
GEN_MAC_HANDLER(nmacchws, 0x0E, 0x07, 0);
4500
GEN_MAC_HANDLER(nmacchws, 0x0E, 0x07);
4396 4501
/* nmacchwso - nmacchwso. */
4397
GEN_MAC_HANDLER(nmacchwso, 0x0E, 0x17, 0);
4502
GEN_MAC_HANDLER(nmacchwso, 0x0E, 0x17);
4398 4503
/* nmachhw   - nmachhw.   */
4399
GEN_MAC_HANDLER(nmachhw, 0x0E, 0x01, 0);
4504
GEN_MAC_HANDLER(nmachhw, 0x0E, 0x01);
4400 4505
/* nmachhwo  - nmachhwo.  */
4401
GEN_MAC_HANDLER(nmachhwo, 0x0E, 0x11, 0);
4506
GEN_MAC_HANDLER(nmachhwo, 0x0E, 0x11);
4402 4507
/* nmachhws  - nmachhws.  */
4403
GEN_MAC_HANDLER(nmachhws, 0x0E, 0x03, 1);
4508
GEN_MAC_HANDLER(nmachhws, 0x0E, 0x03);
4404 4509
/* nmachhwso - nmachhwso. */
4405
GEN_MAC_HANDLER(nmachhwso, 0x0E, 0x13, 1);
4510
GEN_MAC_HANDLER(nmachhwso, 0x0E, 0x13);
4406 4511
/* nmaclhw   - nmaclhw.   */
4407
GEN_MAC_HANDLER(nmaclhw, 0x0E, 0x0D, 1);
4512
GEN_MAC_HANDLER(nmaclhw, 0x0E, 0x0D);
4408 4513
/* nmaclhwo  - nmaclhwo.  */
4409
GEN_MAC_HANDLER(nmaclhwo, 0x0E, 0x1D, 1);
4514
GEN_MAC_HANDLER(nmaclhwo, 0x0E, 0x1D);
4410 4515
/* nmaclhws  - nmaclhws.  */
4411
GEN_MAC_HANDLER(nmaclhws, 0x0E, 0x0F, 1);
4516
GEN_MAC_HANDLER(nmaclhws, 0x0E, 0x0F);
4412 4517
/* nmaclhwso - nmaclhwso. */
4413
GEN_MAC_HANDLER(nmaclhwso, 0x0E, 0x1F, 1);
4518
GEN_MAC_HANDLER(nmaclhwso, 0x0E, 0x1F);
4414 4519

  
4415 4520
/* mulchw  - mulchw.  */
4416
GEN_MAC_HANDLER(mulchw, 0x08, 0x05, 0);
4521
GEN_MAC_HANDLER(mulchw, 0x08, 0x05);
4417 4522
/* mulchwu - mulchwu. */
4418
GEN_MAC_HANDLER(mulchwu, 0x08, 0x04, 0);
4523
GEN_MAC_HANDLER(mulchwu, 0x08, 0x04);
4419 4524
/* mulhhw  - mulhhw.  */
4420
GEN_MAC_HANDLER(mulhhw, 0x08, 0x01, 0);
4525
GEN_MAC_HANDLER(mulhhw, 0x08, 0x01);
4421 4526
/* mulhhwu - mulhhwu. */
4422
GEN_MAC_HANDLER(mulhhwu, 0x08, 0x00, 0);
4527
GEN_MAC_HANDLER(mulhhwu, 0x08, 0x00);
4423 4528
/* mullhw  - mullhw.  */
4424
GEN_MAC_HANDLER(mullhw, 0x08, 0x0D, 0);
4529
GEN_MAC_HANDLER(mullhw, 0x08, 0x0D);
4425 4530
/* mullhwu - mullhwu. */
4426
GEN_MAC_HANDLER(mullhwu, 0x08, 0x0C, 0);
4531
GEN_MAC_HANDLER(mullhwu, 0x08, 0x0C);
4427 4532

  
4428 4533
/* mfdcr */
4429 4534
GEN_HANDLER(mfdcr, 0x1F, 0x03, 0x0A, 0x00000001, PPC_EMB_COMMON)
......
4463 4568

  
4464 4569
/* mfdcrx */
4465 4570
/* XXX: not implemented on 440 ? */
4466
GEN_HANDLER(mfdcrx, 0x1F, 0x03, 0x08, 0x00000001, PPC_BOOKE)
4571
GEN_HANDLER(mfdcrx, 0x1F, 0x03, 0x08, 0x00000000, PPC_BOOKE_EXT)
4467 4572
{
4468 4573
#if defined(CONFIG_USER_ONLY)
4469 4574
    RET_PRIVREG(ctx);
......
4475 4580
    gen_op_load_gpr_T0(rA(ctx->opcode));
4476 4581
    gen_op_load_dcr();
4477 4582
    gen_op_store_T0_gpr(rD(ctx->opcode));
4583
    /* Note: Rc update flag set leads to undefined state of Rc0 */
4478 4584
#endif
4479 4585
}
4480 4586

  
4481 4587
/* mtdcrx */
4482 4588
/* XXX: not implemented on 440 ? */
4483
GEN_HANDLER(mtdcrx, 0x1F, 0x03, 0x0C, 0x00000001, PPC_BOOKE)
4589
GEN_HANDLER(mtdcrx, 0x1F, 0x03, 0x0C, 0x00000000, PPC_BOOKE_EXT)
4484 4590
{
4485 4591
#if defined(CONFIG_USER_ONLY)
4486 4592
    RET_PRIVREG(ctx);
......
4492 4598
    gen_op_load_gpr_T0(rA(ctx->opcode));
4493 4599
    gen_op_load_gpr_T1(rS(ctx->opcode));
4494 4600
    gen_op_store_dcr();
4601
    /* Note: Rc update flag set leads to undefined state of Rc0 */
4495 4602
#endif
4496 4603
}
4497 4604

  
4605
/* mfdcrux (PPC 460) : user-mode access to DCR */
4606
GEN_HANDLER(mfdcrux, 0x1F, 0x03, 0x09, 0x00000000, PPC_DCRUX)
4607
{
4608
    gen_op_load_gpr_T0(rA(ctx->opcode));
4609
    gen_op_load_dcr();
4610
    gen_op_store_T0_gpr(rD(ctx->opcode));
4611
    /* Note: Rc update flag set leads to undefined state of Rc0 */
4612
}
4613

  
4614
/* mtdcrux (PPC 460) : user-mode access to DCR */
4615
GEN_HANDLER(mtdcrux, 0x1F, 0x03, 0x0D, 0x00000000, PPC_DCRUX)
4616
{
4617
    gen_op_load_gpr_T0(rA(ctx->opcode));
4618
    gen_op_load_gpr_T1(rS(ctx->opcode));
4619
    gen_op_store_dcr();
4620
    /* Note: Rc update flag set leads to undefined state of Rc0 */
4621
}
4622

  
4498 4623
/* dccci */
4499 4624
GEN_HANDLER(dccci, 0x1F, 0x06, 0x0E, 0x03E00001, PPC_4xx_COMMON)
4500 4625
{
......
4595 4720

  
4596 4721
/* BookE specific */
4597 4722
/* XXX: not implemented on 440 ? */
4598
GEN_HANDLER(rfdi, 0x13, 0x07, 0x01, 0x03FF8001, PPC_BOOKE)
4723
GEN_HANDLER(rfdi, 0x13, 0x07, 0x01, 0x03FF8001, PPC_BOOKE_EXT)
4599 4724
{
4600 4725
#if defined(CONFIG_USER_ONLY)
4601 4726
    RET_PRIVOPC(ctx);
......
4611 4736
}
4612 4737

  
4613 4738
/* XXX: not implemented on 440 ? */
4614
GEN_HANDLER(rfmci, 0x13, 0x06, 0x01, 0x03FF8001, PPC_BOOKE)
4739
GEN_HANDLER(rfmci, 0x13, 0x06, 0x01, 0x03FF8001, PPC_RFMCI)
4615 4740
{
4616 4741
#if defined(CONFIG_USER_ONLY)
4617 4742
    RET_PRIVOPC(ctx);
......
4628 4753

  
4629 4754
/* TLB management - PowerPC 405 implementation */
4630 4755
/* tlbre */
4631
GEN_HANDLER(tlbre_40x, 0x1F, 0x12, 0x1D, 0x00000001, PPC_40x_SPEC)
4756
GEN_HANDLER(tlbre_40x, 0x1F, 0x12, 0x1D, 0x00000001, PPC_40x_TLB)
4632 4757
{
4633 4758
#if defined(CONFIG_USER_ONLY)
4634 4759
    RET_PRIVOPC(ctx);
......
4656 4781
}
4657 4782

  
4658 4783
/* tlbsx - tlbsx. */
4659
GEN_HANDLER(tlbsx_40x, 0x1F, 0x12, 0x1C, 0x00000000, PPC_40x_SPEC)
4784
GEN_HANDLER(tlbsx_40x, 0x1F, 0x12, 0x1C, 0x00000000, PPC_40x_TLB)
4660 4785
{
4661 4786
#if defined(CONFIG_USER_ONLY)
4662 4787
    RET_PRIVOPC(ctx);
......
4675 4800
}
4676 4801

  
4677 4802
/* tlbwe */
4678
GEN_HANDLER(tlbwe_40x, 0x1F, 0x12, 0x1E, 0x00000001, PPC_40x_SPEC)
4803
GEN_HANDLER(tlbwe_40x, 0x1F, 0x12, 0x1E, 0x00000001, PPC_40x_TLB)
4679 4804
{
4680 4805
#if defined(CONFIG_USER_ONLY)
4681 4806
    RET_PRIVOPC(ctx);
......
5701 5826
    for (i = 0; i < 32; i++) {
5702 5827
        if ((i & (RGPL - 1)) == 0)
5703 5828
            cpu_fprintf(f, "GPR%02d", i);
5704
        cpu_fprintf(f, " " REGX, env->gpr[i]);
5829
        cpu_fprintf(f, " " REGX, (target_ulong)env->gpr[i]);
5705 5830
        if ((i & (RGPL - 1)) == (RGPL - 1))
5706 5831
            cpu_fprintf(f, "\n");
5707 5832
    }

Also available in: Unified diff