Commit c7d344af8fb308975f941de1640b917e1b085a81
1 parent
e1a2849c
- remove the ugly "stop" pseudo-opcode.
- fix fsqrt instruction (there's no fsqrt.). - floating point load and store are not integer instructions. - wrong opcode for dcba instructions. (Jocelyn Mayer) git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1378 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
22 additions
and
16 deletions
target-ppc/translate.c
| ... | ... | @@ -325,12 +325,6 @@ GEN_HANDLER(invalid, 0x00, 0x00, 0x00, 0xFFFFFFFF, PPC_NONE) |
| 325 | 325 | RET_INVAL(ctx); |
| 326 | 326 | } |
| 327 | 327 | |
| 328 | -/* Special opcode to stop emulation */ | |
| 329 | -GEN_HANDLER(stop, 0x06, 0x00, 0xFF, 0x03FFFFC1, PPC_COMMON) | |
| 330 | -{ | |
| 331 | - RET_EXCP(ctx, EXCP_HLT, 0); | |
| 332 | -} | |
| 333 | - | |
| 334 | 328 | static opc_handler_t invalid_handler = { |
| 335 | 329 | .inval = 0xFFFFFFFF, |
| 336 | 330 | .type = PPC_NONE, |
| ... | ... | @@ -867,7 +861,19 @@ _GEN_FLOAT_ACB(sel, sel, 0x3F, 0x17, 0); |
| 867 | 861 | GEN_FLOAT_AB(sub, 0x14, 0x000007C0); |
| 868 | 862 | /* Optional: */ |
| 869 | 863 | /* fsqrt */ |
| 870 | -GEN_FLOAT_BS(sqrt, 0x3F, 0x16); | |
| 864 | +GEN_HANDLER(fsqrt, 0x3F, 0x16, 0xFF, 0x001F07C0, PPC_FLOAT_OPT) | |
| 865 | +{ | |
| 866 | + if (!ctx->fpu_enabled) { | |
| 867 | + RET_EXCP(ctx, EXCP_NO_FP, 0); | |
| 868 | + return; | |
| 869 | + } | |
| 870 | + gen_op_reset_scrfx(); | |
| 871 | + gen_op_load_fpr_FT0(rB(ctx->opcode)); | |
| 872 | + gen_op_fsqrt(); | |
| 873 | + gen_op_store_FT0_fpr(rD(ctx->opcode)); | |
| 874 | + if (Rc(ctx->opcode)) | |
| 875 | + gen_op_set_Rc1(); | |
| 876 | +} | |
| 871 | 877 | |
| 872 | 878 | GEN_HANDLER(fsqrts, 0x3B, 0x16, 0xFF, 0x001F07C0, PPC_FLOAT_OPT) |
| 873 | 879 | { |
| ... | ... | @@ -1434,7 +1440,7 @@ GEN_HANDLER(sync, 0x1F, 0x16, 0x12, 0x03FF0801, PPC_MEM) |
| 1434 | 1440 | |
| 1435 | 1441 | /*** Floating-point load ***/ |
| 1436 | 1442 | #define GEN_LDF(width, opc) \ |
| 1437 | -GEN_HANDLER(l##width, opc, 0xFF, 0xFF, 0x00000000, PPC_INTEGER) \ | |
| 1443 | +GEN_HANDLER(l##width, opc, 0xFF, 0xFF, 0x00000000, PPC_FLOAT) \ | |
| 1438 | 1444 | { \ |
| 1439 | 1445 | uint32_t simm = SIMM(ctx->opcode); \ |
| 1440 | 1446 | if (!ctx->fpu_enabled) { \ |
| ... | ... | @@ -1453,7 +1459,7 @@ GEN_HANDLER(l##width, opc, 0xFF, 0xFF, 0x00000000, PPC_INTEGER) \ |
| 1453 | 1459 | } |
| 1454 | 1460 | |
| 1455 | 1461 | #define GEN_LDUF(width, opc) \ |
| 1456 | -GEN_HANDLER(l##width##u, opc, 0xFF, 0xFF, 0x00000000, PPC_INTEGER) \ | |
| 1462 | +GEN_HANDLER(l##width##u, opc, 0xFF, 0xFF, 0x00000000, PPC_FLOAT) \ | |
| 1457 | 1463 | { \ |
| 1458 | 1464 | uint32_t simm = SIMM(ctx->opcode); \ |
| 1459 | 1465 | if (!ctx->fpu_enabled) { \ |
| ... | ... | @@ -1474,7 +1480,7 @@ GEN_HANDLER(l##width##u, opc, 0xFF, 0xFF, 0x00000000, PPC_INTEGER) \ |
| 1474 | 1480 | } |
| 1475 | 1481 | |
| 1476 | 1482 | #define GEN_LDUXF(width, opc) \ |
| 1477 | -GEN_HANDLER(l##width##ux, 0x1F, 0x17, opc, 0x00000001, PPC_INTEGER) \ | |
| 1483 | +GEN_HANDLER(l##width##ux, 0x1F, 0x17, opc, 0x00000001, PPC_FLOAT) \ | |
| 1478 | 1484 | { \ |
| 1479 | 1485 | if (!ctx->fpu_enabled) { \ |
| 1480 | 1486 | RET_EXCP(ctx, EXCP_NO_FP, 0); \ |
| ... | ... | @@ -1494,7 +1500,7 @@ GEN_HANDLER(l##width##ux, 0x1F, 0x17, opc, 0x00000001, PPC_INTEGER) \ |
| 1494 | 1500 | } |
| 1495 | 1501 | |
| 1496 | 1502 | #define GEN_LDXF(width, opc2, opc3) \ |
| 1497 | -GEN_HANDLER(l##width##x, 0x1F, opc2, opc3, 0x00000001, PPC_INTEGER) \ | |
| 1503 | +GEN_HANDLER(l##width##x, 0x1F, opc2, opc3, 0x00000001, PPC_FLOAT) \ | |
| 1498 | 1504 | { \ |
| 1499 | 1505 | if (!ctx->fpu_enabled) { \ |
| 1500 | 1506 | RET_EXCP(ctx, EXCP_NO_FP, 0); \ |
| ... | ... | @@ -1525,7 +1531,7 @@ GEN_LDFS(fs, 0x10); |
| 1525 | 1531 | |
| 1526 | 1532 | /*** Floating-point store ***/ |
| 1527 | 1533 | #define GEN_STF(width, opc) \ |
| 1528 | -GEN_HANDLER(st##width, opc, 0xFF, 0xFF, 0x00000000, PPC_INTEGER) \ | |
| 1534 | +GEN_HANDLER(st##width, opc, 0xFF, 0xFF, 0x00000000, PPC_FLOAT) \ | |
| 1529 | 1535 | { \ |
| 1530 | 1536 | uint32_t simm = SIMM(ctx->opcode); \ |
| 1531 | 1537 | if (!ctx->fpu_enabled) { \ |
| ... | ... | @@ -1544,7 +1550,7 @@ GEN_HANDLER(st##width, opc, 0xFF, 0xFF, 0x00000000, PPC_INTEGER) \ |
| 1544 | 1550 | } |
| 1545 | 1551 | |
| 1546 | 1552 | #define GEN_STUF(width, opc) \ |
| 1547 | -GEN_HANDLER(st##width##u, opc, 0xFF, 0xFF, 0x00000000, PPC_INTEGER) \ | |
| 1553 | +GEN_HANDLER(st##width##u, opc, 0xFF, 0xFF, 0x00000000, PPC_FLOAT) \ | |
| 1548 | 1554 | { \ |
| 1549 | 1555 | uint32_t simm = SIMM(ctx->opcode); \ |
| 1550 | 1556 | if (!ctx->fpu_enabled) { \ |
| ... | ... | @@ -1564,7 +1570,7 @@ GEN_HANDLER(st##width##u, opc, 0xFF, 0xFF, 0x00000000, PPC_INTEGER) \ |
| 1564 | 1570 | } |
| 1565 | 1571 | |
| 1566 | 1572 | #define GEN_STUXF(width, opc) \ |
| 1567 | -GEN_HANDLER(st##width##ux, 0x1F, 0x17, opc, 0x00000001, PPC_INTEGER) \ | |
| 1573 | +GEN_HANDLER(st##width##ux, 0x1F, 0x17, opc, 0x00000001, PPC_FLOAT) \ | |
| 1568 | 1574 | { \ |
| 1569 | 1575 | if (!ctx->fpu_enabled) { \ |
| 1570 | 1576 | RET_EXCP(ctx, EXCP_NO_FP, 0); \ |
| ... | ... | @@ -1583,7 +1589,7 @@ GEN_HANDLER(st##width##ux, 0x1F, 0x17, opc, 0x00000001, PPC_INTEGER) \ |
| 1583 | 1589 | } |
| 1584 | 1590 | |
| 1585 | 1591 | #define GEN_STXF(width, opc2, opc3) \ |
| 1586 | -GEN_HANDLER(st##width##x, 0x1F, opc2, opc3, 0x00000001, PPC_INTEGER) \ | |
| 1592 | +GEN_HANDLER(st##width##x, 0x1F, opc2, opc3, 0x00000001, PPC_FLOAT) \ | |
| 1587 | 1593 | { \ |
| 1588 | 1594 | if (!ctx->fpu_enabled) { \ |
| 1589 | 1595 | RET_EXCP(ctx, EXCP_NO_FP, 0); \ |
| ... | ... | @@ -2370,7 +2376,7 @@ GEN_HANDLER(icbi, 0x1F, 0x16, 0x1E, 0x03E00001, PPC_CACHE) |
| 2370 | 2376 | |
| 2371 | 2377 | /* Optional: */ |
| 2372 | 2378 | /* dcba */ |
| 2373 | -GEN_HANDLER(dcba, 0x1F, 0x16, 0x07, 0x03E00001, PPC_CACHE_OPT) | |
| 2379 | +GEN_HANDLER(dcba, 0x1F, 0x16, 0x17, 0x03E00001, PPC_CACHE_OPT) | |
| 2374 | 2380 | { |
| 2375 | 2381 | } |
| 2376 | 2382 | ... | ... |