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