Revision c7697e1f target-ppc/translate.c

b/target-ppc/translate.c
257 257
GEN_OPCODE(name, opc1, opc2, opc3, inval, type);                              \
258 258
static void gen_##name (DisasContext *ctx)
259 259

  
260
#define GEN_HANDLER2(name, onam, opc1, opc2, opc3, inval, type)               \
261
static void gen_##name (DisasContext *ctx);                                   \
262
GEN_OPCODE2(name, onam, opc1, opc2, opc3, inval, type);                       \
263
static void gen_##name (DisasContext *ctx)
264

  
265

  
260 266
typedef struct opcode_t {
261 267
    unsigned char opc1, opc2, opc3;
262 268
#if HOST_LONG_BITS == 64 /* Explicitely align to 64 bits */
......
523 529
    },                                                                        \
524 530
    .oname = stringify(name),                                                 \
525 531
}
532
#define GEN_OPCODE2(name, onam, op1, op2, op3, invl, _typ)                    \
533
OPCODES_SECTION opcode_t opc_##name = {                                       \
534
    .opc1 = op1,                                                              \
535
    .opc2 = op2,                                                              \
536
    .opc3 = op3,                                                              \
537
    .pad  = { 0, },                                                           \
538
    .handler = {                                                              \
539
        .inval   = invl,                                                      \
540
        .type = _typ,                                                         \
541
        .handler = &gen_##name,                                               \
542
        .oname = onam,                                                        \
543
    },                                                                        \
544
    .oname = onam,                                                            \
545
}
526 546
#else
527 547
#define GEN_OPCODE(name, op1, op2, op3, invl, _typ)                           \
528 548
OPCODES_SECTION opcode_t opc_##name = {                                       \
......
537 557
    },                                                                        \
538 558
    .oname = stringify(name),                                                 \
539 559
}
560
#define GEN_OPCODE2(name, onam, op1, op2, op3, invl, _typ)                    \
561
OPCODES_SECTION opcode_t opc_##name = {                                       \
562
    .opc1 = op1,                                                              \
563
    .opc2 = op2,                                                              \
564
    .opc3 = op3,                                                              \
565
    .pad  = { 0, },                                                           \
566
    .handler = {                                                              \
567
        .inval   = invl,                                                      \
568
        .type = _typ,                                                         \
569
        .handler = &gen_##name,                                               \
570
    },                                                                        \
571
    .oname = onam,                                                            \
572
}
540 573
#endif
541 574

  
542 575
#define GEN_OPCODE_MARK(name)                                                 \
......
918 951
    gen_op_store_T0_gpr(rD(ctx->opcode));
919 952
}
920 953
/* addic. */
921
GEN_HANDLER(addic_, 0x0D, 0xFF, 0xFF, 0x00000000, PPC_INTEGER)
954
GEN_HANDLER2(addic_, "addic.", 0x0D, 0xFF, 0xFF, 0x00000000, PPC_INTEGER)
922 955
{
923 956
    target_long simm = SIMM(ctx->opcode);
924 957

  
......
1087 1120
/* andc & andc. */
1088 1121
GEN_LOGICAL2(andc, 0x01, PPC_INTEGER);
1089 1122
/* andi. */
1090
GEN_HANDLER(andi_, 0x1C, 0xFF, 0xFF, 0x00000000, PPC_INTEGER)
1123
GEN_HANDLER2(andi_, "andi.", 0x1C, 0xFF, 0xFF, 0x00000000, PPC_INTEGER)
1091 1124
{
1092 1125
    gen_op_load_gpr_T0(rS(ctx->opcode));
1093 1126
    gen_op_andi_T0(UIMM(ctx->opcode));
......
1095 1128
    gen_set_Rc0(ctx);
1096 1129
}
1097 1130
/* andis. */
1098
GEN_HANDLER(andis_, 0x1D, 0xFF, 0xFF, 0x00000000, PPC_INTEGER)
1131
GEN_HANDLER2(andis_, "andis.", 0x1D, 0xFF, 0xFF, 0x00000000, PPC_INTEGER)
1099 1132
{
1100 1133
    gen_op_load_gpr_T0(rS(ctx->opcode));
1101 1134
    gen_op_andi_T0(UIMM(ctx->opcode) << 16);
......
1385 1418

  
1386 1419
#if defined(TARGET_PPC64)
1387 1420
#define GEN_PPC64_R2(name, opc1, opc2)                                        \
1388
GEN_HANDLER(name##0, opc1, opc2, 0xFF, 0x00000000, PPC_64B)                   \
1421
GEN_HANDLER2(name##0, stringify(name), opc1, opc2, 0xFF, 0x00000000, PPC_64B) \
1389 1422
{                                                                             \
1390 1423
    gen_##name(ctx, 0);                                                       \
1391 1424
}                                                                             \
1392
GEN_HANDLER(name##1, opc1, opc2 | 0x10, 0xFF, 0x00000000, PPC_64B)            \
1425
GEN_HANDLER2(name##1, stringify(name), opc1, opc2 | 0x10, 0xFF, 0x00000000,   \
1426
             PPC_64B)                                                         \
1393 1427
{                                                                             \
1394 1428
    gen_##name(ctx, 1);                                                       \
1395 1429
}
1396 1430
#define GEN_PPC64_R4(name, opc1, opc2)                                        \
1397
GEN_HANDLER(name##0, opc1, opc2, 0xFF, 0x00000000, PPC_64B)                   \
1431
GEN_HANDLER2(name##0, stringify(name), opc1, opc2, 0xFF, 0x00000000, PPC_64B) \
1398 1432
{                                                                             \
1399 1433
    gen_##name(ctx, 0, 0);                                                    \
1400 1434
}                                                                             \
1401
GEN_HANDLER(name##1, opc1, opc2 | 0x01, 0xFF, 0x00000000, PPC_64B)            \
1435
GEN_HANDLER2(name##1, stringify(name), opc1, opc2 | 0x01, 0xFF, 0x00000000,   \
1436
             PPC_64B)                                                         \
1402 1437
{                                                                             \
1403 1438
    gen_##name(ctx, 0, 1);                                                    \
1404 1439
}                                                                             \
1405
GEN_HANDLER(name##2, opc1, opc2 | 0x10, 0xFF, 0x00000000, PPC_64B)            \
1440
GEN_HANDLER2(name##2, stringify(name), opc1, opc2 | 0x10, 0xFF, 0x00000000,   \
1441
             PPC_64B)                                                         \
1406 1442
{                                                                             \
1407 1443
    gen_##name(ctx, 1, 0);                                                    \
1408 1444
}                                                                             \
1409
GEN_HANDLER(name##3, opc1, opc2 | 0x11, 0xFF, 0x00000000, PPC_64B)            \
1445
GEN_HANDLER2(name##3, stringify(name), opc1, opc2 | 0x11, 0xFF, 0x00000000,   \
1446
             PPC_64B)                                                         \
1410 1447
{                                                                             \
1411 1448
    gen_##name(ctx, 1, 1);                                                    \
1412 1449
}
......
1606 1643
    if (unlikely(Rc(ctx->opcode) != 0))
1607 1644
        gen_set_Rc0(ctx);
1608 1645
}
1609
GEN_HANDLER(sradi0, 0x1F, 0x1A, 0x19, 0x00000000, PPC_64B)
1646
GEN_HANDLER2(sradi0, "sradi", 0x1F, 0x1A, 0x19, 0x00000000, PPC_64B)
1610 1647
{
1611 1648
    gen_sradi(ctx, 0);
1612 1649
}
1613
GEN_HANDLER(sradi1, 0x1F, 0x1B, 0x19, 0x00000000, PPC_64B)
1650
GEN_HANDLER2(sradi1, "sradi", 0x1F, 0x1B, 0x19, 0x00000000, PPC_64B)
1614 1651
{
1615 1652
    gen_sradi(ctx, 1);
1616 1653
}
......
2726 2763
}
2727 2764

  
2728 2765
/* stwcx. */
2729
GEN_HANDLER(stwcx_, 0x1F, 0x16, 0x04, 0x00000000, PPC_RES)
2766
GEN_HANDLER2(stwcx_, "stwcx.", 0x1F, 0x16, 0x04, 0x00000000, PPC_RES)
2730 2767
{
2731 2768
    /* NIP cannot be restored if the memory exception comes from an helper */
2732 2769
    gen_update_nip(ctx, ctx->nip - 4);
......
2799 2836
}
2800 2837

  
2801 2838
/* stdcx. */
2802
GEN_HANDLER(stdcx_, 0x1F, 0x16, 0x06, 0x00000000, PPC_64B)
2839
GEN_HANDLER2(stdcx_, "stdcx.", 0x1F, 0x16, 0x06, 0x00000000, PPC_64B)
2803 2840
{
2804 2841
    /* NIP cannot be restored if the memory exception comes from an helper */
2805 2842
    gen_update_nip(ctx, ctx->nip - 4);
......
3802 3839
    gen_op_check_reservation();
3803 3840
}
3804 3841

  
3805
GEN_HANDLER(dcbz_970, 0x1F, 0x16, 0x1F, 0x03C00001, PPC_CACHE_DCBZT)
3842
GEN_HANDLER2(dcbz_970, "dcbz", 0x1F, 0x16, 0x1F, 0x03C00001, PPC_CACHE_DCBZT)
3806 3843
{
3807 3844
    gen_addr_reg_index(ctx);
3808 3845
    if (ctx->opcode & 0x00200000)
......
3943 3980
#if defined(TARGET_PPC64)
3944 3981
/* Specific implementation for PowerPC 64 "bridge" emulation using SLB */
3945 3982
/* mfsr */
3946
GEN_HANDLER(mfsr_64b, 0x1F, 0x13, 0x12, 0x0010F801, PPC_SEGMENT_64B)
3983
GEN_HANDLER2(mfsr_64b, "mfsr", 0x1F, 0x13, 0x12, 0x0010F801, PPC_SEGMENT_64B)
3947 3984
{
3948 3985
#if defined(CONFIG_USER_ONLY)
3949 3986
    GEN_EXCP_PRIVREG(ctx);
......
3959 3996
}
3960 3997

  
3961 3998
/* mfsrin */
3962
GEN_HANDLER(mfsrin_64b, 0x1F, 0x13, 0x14, 0x001F0001, PPC_SEGMENT_64B)
3999
GEN_HANDLER2(mfsrin_64b, "mfsrin", 0x1F, 0x13, 0x14, 0x001F0001,
4000
             PPC_SEGMENT_64B)
3963 4001
{
3964 4002
#if defined(CONFIG_USER_ONLY)
3965 4003
    GEN_EXCP_PRIVREG(ctx);
......
3976 4014
}
3977 4015

  
3978 4016
/* mtsr */
3979
GEN_HANDLER(mtsr_64b, 0x1F, 0x12, 0x06, 0x0010F801, PPC_SEGMENT_64B)
4017
GEN_HANDLER2(mtsr_64b, "mtsr", 0x1F, 0x12, 0x06, 0x0010F801, PPC_SEGMENT_64B)
3980 4018
{
3981 4019
#if defined(CONFIG_USER_ONLY)
3982 4020
    GEN_EXCP_PRIVREG(ctx);
......
3992 4030
}
3993 4031

  
3994 4032
/* mtsrin */
3995
GEN_HANDLER(mtsrin_64b, 0x1F, 0x12, 0x07, 0x001F0001, PPC_SEGMENT_64B)
4033
GEN_HANDLER2(mtsrin_64b, "mtsrin", 0x1F, 0x12, 0x07, 0x001F0001,
4034
             PPC_SEGMENT_64B)
3996 4035
{
3997 4036
#if defined(CONFIG_USER_ONLY)
3998 4037
    GEN_EXCP_PRIVREG(ctx);
......
4215 4254
{
4216 4255
    gen_op_load_gpr_T0(rA(ctx->opcode));
4217 4256
    gen_op_POWER_clcs();
4257
    /* Rc=1 sets CR0 to an undefined state */
4218 4258
    gen_op_store_T0_gpr(rD(ctx->opcode));
4219 4259
}
4220 4260

  
......
4622 4662

  
4623 4663
/* 602 - 603 - G2 TLB management */
4624 4664
/* tlbld */
4625
GEN_HANDLER(tlbld_6xx, 0x1F, 0x12, 0x1E, 0x03FF0001, PPC_6xx_TLB)
4665
GEN_HANDLER2(tlbld_6xx, "tlbld", 0x1F, 0x12, 0x1E, 0x03FF0001, PPC_6xx_TLB)
4626 4666
{
4627 4667
#if defined(CONFIG_USER_ONLY)
4628 4668
    GEN_EXCP_PRIVOPC(ctx);
......
4637 4677
}
4638 4678

  
4639 4679
/* tlbli */
4640
GEN_HANDLER(tlbli_6xx, 0x1F, 0x12, 0x1F, 0x03FF0001, PPC_6xx_TLB)
4680
GEN_HANDLER2(tlbli_6xx, "tlbli", 0x1F, 0x12, 0x1F, 0x03FF0001, PPC_6xx_TLB)
4641 4681
{
4642 4682
#if defined(CONFIG_USER_ONLY)
4643 4683
    GEN_EXCP_PRIVOPC(ctx);
......
4653 4693

  
4654 4694
/* 74xx TLB management */
4655 4695
/* tlbld */
4656
GEN_HANDLER(tlbld_74xx, 0x1F, 0x12, 0x1E, 0x03FF0001, PPC_74xx_TLB)
4696
GEN_HANDLER2(tlbld_74xx, "tlbld", 0x1F, 0x12, 0x1E, 0x03FF0001, PPC_74xx_TLB)
4657 4697
{
4658 4698
#if defined(CONFIG_USER_ONLY)
4659 4699
    GEN_EXCP_PRIVOPC(ctx);
......
4668 4708
}
4669 4709

  
4670 4710
/* tlbli */
4671
GEN_HANDLER(tlbli_74xx, 0x1F, 0x12, 0x1F, 0x03FF0001, PPC_74xx_TLB)
4711
GEN_HANDLER2(tlbli_74xx, "tlbli", 0x1F, 0x12, 0x1F, 0x03FF0001, PPC_74xx_TLB)
4672 4712
{
4673 4713
#if defined(CONFIG_USER_ONLY)
4674 4714
    GEN_EXCP_PRIVOPC(ctx);
......
5217 5257
}
5218 5258

  
5219 5259
/* icbt */
5220
GEN_HANDLER(icbt_40x, 0x1F, 0x06, 0x08, 0x03E00001, PPC_40x_ICBT)
5260
GEN_HANDLER2(icbt_40x, "icbt", 0x1F, 0x06, 0x08, 0x03E00001, PPC_40x_ICBT)
5221 5261
{
5222 5262
    /* interpreted as no-op */
5223 5263
    /* XXX: specification say this is treated as a load by the MMU
......
5254 5294
}
5255 5295

  
5256 5296
/* rfci (supervisor only) */
5257
GEN_HANDLER(rfci_40x, 0x13, 0x13, 0x01, 0x03FF8001, PPC_40x_EXCP)
5297
GEN_HANDLER2(rfci_40x, "rfci", 0x13, 0x13, 0x01, 0x03FF8001, PPC_40x_EXCP)
5258 5298
{
5259 5299
#if defined(CONFIG_USER_ONLY)
5260 5300
    GEN_EXCP_PRIVOPC(ctx);
......
5319 5359

  
5320 5360
/* TLB management - PowerPC 405 implementation */
5321 5361
/* tlbre */
5322
GEN_HANDLER(tlbre_40x, 0x1F, 0x12, 0x1D, 0x00000001, PPC_40x_TLB)
5362
GEN_HANDLER2(tlbre_40x, "tlbre", 0x1F, 0x12, 0x1D, 0x00000001, PPC_40x_TLB)
5323 5363
{
5324 5364
#if defined(CONFIG_USER_ONLY)
5325 5365
    GEN_EXCP_PRIVOPC(ctx);
......
5347 5387
}
5348 5388

  
5349 5389
/* tlbsx - tlbsx. */
5350
GEN_HANDLER(tlbsx_40x, 0x1F, 0x12, 0x1C, 0x00000000, PPC_40x_TLB)
5390
GEN_HANDLER2(tlbsx_40x, "tlbsx", 0x1F, 0x12, 0x1C, 0x00000000, PPC_40x_TLB)
5351 5391
{
5352 5392
#if defined(CONFIG_USER_ONLY)
5353 5393
    GEN_EXCP_PRIVOPC(ctx);
......
5365 5405
}
5366 5406

  
5367 5407
/* tlbwe */
5368
GEN_HANDLER(tlbwe_40x, 0x1F, 0x12, 0x1E, 0x00000001, PPC_40x_TLB)
5408
GEN_HANDLER2(tlbwe_40x, "tlbwe", 0x1F, 0x12, 0x1E, 0x00000001, PPC_40x_TLB)
5369 5409
{
5370 5410
#if defined(CONFIG_USER_ONLY)
5371 5411
    GEN_EXCP_PRIVOPC(ctx);
......
5394 5434

  
5395 5435
/* TLB management - PowerPC 440 implementation */
5396 5436
/* tlbre */
5397
GEN_HANDLER(tlbre_440, 0x1F, 0x12, 0x1D, 0x00000001, PPC_BOOKE)
5437
GEN_HANDLER2(tlbre_440, "tlbre", 0x1F, 0x12, 0x1D, 0x00000001, PPC_BOOKE)
5398 5438
{
5399 5439
#if defined(CONFIG_USER_ONLY)
5400 5440
    GEN_EXCP_PRIVOPC(ctx);
......
5419 5459
}
5420 5460

  
5421 5461
/* tlbsx - tlbsx. */
5422
GEN_HANDLER(tlbsx_440, 0x1F, 0x12, 0x1C, 0x00000000, PPC_BOOKE)
5462
GEN_HANDLER2(tlbsx_440, "tlbsx", 0x1F, 0x12, 0x1C, 0x00000000, PPC_BOOKE)
5423 5463
{
5424 5464
#if defined(CONFIG_USER_ONLY)
5425 5465
    GEN_EXCP_PRIVOPC(ctx);
......
5437 5477
}
5438 5478

  
5439 5479
/* tlbwe */
5440
GEN_HANDLER(tlbwe_440, 0x1F, 0x12, 0x1E, 0x00000001, PPC_BOOKE)
5480
GEN_HANDLER2(tlbwe_440, "tlbwe", 0x1F, 0x12, 0x1E, 0x00000001, PPC_BOOKE)
5441 5481
{
5442 5482
#if defined(CONFIG_USER_ONLY)
5443 5483
    GEN_EXCP_PRIVOPC(ctx);
......
5527 5567
}
5528 5568

  
5529 5569
/* icbt */
5530
GEN_HANDLER(icbt_440, 0x1F, 0x16, 0x00, 0x03E00001, PPC_BOOKE)
5570
GEN_HANDLER2(icbt_440, "icbt", 0x1F, 0x16, 0x00, 0x03E00001, PPC_BOOKE)
5531 5571
{
5532 5572
    /* interpreted as no-op */
5533 5573
    /* XXX: specification say this is treated as a load by the MMU
......
6079 6119
    gen_op_store_T0_gpr64(rD(ctx->opcode));
6080 6120
}
6081 6121

  
6082
GEN_HANDLER(evsel0, 0x04, 0x1c, 0x09, 0x00000000, PPC_SPE)
6122
GEN_HANDLER2(evsel0, "evsel", 0x04, 0x1c, 0x09, 0x00000000, PPC_SPE)
6083 6123
{
6084 6124
    gen_evsel(ctx);
6085 6125
}
6086
GEN_HANDLER(evsel1, 0x04, 0x1d, 0x09, 0x00000000, PPC_SPE)
6126
GEN_HANDLER2(evsel1, "evsel", 0x04, 0x1d, 0x09, 0x00000000, PPC_SPE)
6087 6127
{
6088 6128
    gen_evsel(ctx);
6089 6129
}
6090
GEN_HANDLER(evsel2, 0x04, 0x1e, 0x09, 0x00000000, PPC_SPE)
6130
GEN_HANDLER2(evsel2, "evsel", 0x04, 0x1e, 0x09, 0x00000000, PPC_SPE)
6091 6131
{
6092 6132
    gen_evsel(ctx);
6093 6133
}
6094
GEN_HANDLER(evsel3, 0x04, 0x1f, 0x09, 0x00000000, PPC_SPE)
6134
GEN_HANDLER2(evsel3, "evsel", 0x04, 0x1f, 0x09, 0x00000000, PPC_SPE)
6095 6135
{
6096 6136
    gen_evsel(ctx);
6097 6137
}

Also available in: Unified diff