diff options
| author | Mike Pall <mike> | 2010-08-27 01:43:32 +0200 |
|---|---|---|
| committer | Mike Pall <mike> | 2010-08-27 01:43:32 +0200 |
| commit | 1b57266668adf49c0deccd79d64a2c496416b4be (patch) | |
| tree | c89b74b1def54e2793afab76f3877694bb7ed30e | |
| parent | 4aa8757aac08fcd340649d9850f7bf88d5911f98 (diff) | |
| download | luajit-1b57266668adf49c0deccd79d64a2c496416b4be.tar.gz luajit-1b57266668adf49c0deccd79d64a2c496416b4be.tar.bz2 luajit-1b57266668adf49c0deccd79d64a2c496416b4be.zip | |
PPC: Add SPE instructions to DynASM PowerPC module.
| -rw-r--r-- | dynasm/dasm_ppc.lua | 288 |
1 files changed, 287 insertions, 1 deletions
diff --git a/dynasm/dasm_ppc.lua b/dynasm/dasm_ppc.lua index acea7cc1..ca75271f 100644 --- a/dynasm/dasm_ppc.lua +++ b/dynasm/dasm_ppc.lua | |||
| @@ -248,10 +248,10 @@ local map_op = { | |||
| 248 | ["addic._3"] = "34000000RRI", | 248 | ["addic._3"] = "34000000RRI", |
| 249 | addi_3 = "38000000RRI", | 249 | addi_3 = "38000000RRI", |
| 250 | li_2 = "38000000RI", | 250 | li_2 = "38000000RI", |
| 251 | la_2 = "38000000RD", | ||
| 251 | addis_3 = "3c000000RRI", | 252 | addis_3 = "3c000000RRI", |
| 252 | lis_2 = "3c000000RI", | 253 | lis_2 = "3c000000RI", |
| 253 | lus_2 = "3c000000RU", | 254 | lus_2 = "3c000000RU", |
| 254 | la_2 = "3c000000RD", | ||
| 255 | bc_3 = "40000000AAK", | 255 | bc_3 = "40000000AAK", |
| 256 | bcl_3 = "40000001AAK", | 256 | bcl_3 = "40000001AAK", |
| 257 | bdnz_1 = "42000000K", | 257 | bdnz_1 = "42000000K", |
| @@ -526,6 +526,282 @@ local map_op = { | |||
| 526 | fctidz_2 = "fc00065eF-F.", | 526 | fctidz_2 = "fc00065eF-F.", |
| 527 | fcfid_2 = "fc00069cF-F.", | 527 | fcfid_2 = "fc00069cF-F.", |
| 528 | 528 | ||
| 529 | -- Primary opcode 4, SPE APU extension: | ||
| 530 | evaddw_3 = "10000200RRR", | ||
| 531 | evaddiw_3 = "10000202RAR~", | ||
| 532 | evsubw_3 = "10000204RRR~", | ||
| 533 | evsubiw_3 = "10000206RAR~", | ||
| 534 | evabs_2 = "10000208RR", | ||
| 535 | evneg_2 = "10000209RR", | ||
| 536 | evextsb_2 = "1000020aRR", | ||
| 537 | evextsh_2 = "1000020bRR", | ||
| 538 | evrndw_2 = "1000020cRR", | ||
| 539 | evcntlzw_2 = "1000020dRR", | ||
| 540 | evcntlsw_2 = "1000020eRR", | ||
| 541 | brinc_3 = "1000020fRRR", | ||
| 542 | evand_3 = "10000211RRR", | ||
| 543 | evandc_3 = "10000212RRR", | ||
| 544 | evxor_3 = "10000216RRR", | ||
| 545 | evor_3 = "10000217RRR", | ||
| 546 | evmr_2 = "10000217RR=", | ||
| 547 | evnor_3 = "10000218RRR", | ||
| 548 | evnot_2 = "10000218RR=", | ||
| 549 | eveqv_3 = "10000219RRR", | ||
| 550 | evorc_3 = "1000021bRRR", | ||
| 551 | evnand_3 = "1000021eRRR", | ||
| 552 | evsrwu_3 = "10000220RRR", | ||
| 553 | evsrws_3 = "10000221RRR", | ||
| 554 | evsrwiu_3 = "10000222RRA", | ||
| 555 | evsrwis_3 = "10000223RRA", | ||
| 556 | evslw_3 = "10000224RRR", | ||
| 557 | evslwi_3 = "10000226RRA", | ||
| 558 | evrlw_3 = "10000228RRR", | ||
| 559 | evsplati_2 = "10000229RS", | ||
| 560 | evrlwi_3 = "1000022aRRA", | ||
| 561 | evsplatfi_2 = "1000022bRS", | ||
| 562 | evmergehi_3 = "1000022cRRR", | ||
| 563 | evmergelo_3 = "1000022dRRR", | ||
| 564 | evcmpgtu_3 = "10000230XRR", | ||
| 565 | evcmpgtu_2 = "10000230-RR", | ||
| 566 | evcmpgts_3 = "10000231XRR", | ||
| 567 | evcmpgts_2 = "10000231-RR", | ||
| 568 | evcmpltu_3 = "10000232XRR", | ||
| 569 | evcmpltu_2 = "10000232-RR", | ||
| 570 | evcmplts_3 = "10000233XRR", | ||
| 571 | evcmplts_2 = "10000233-RR", | ||
| 572 | evcmpeq_3 = "10000234XRR", | ||
| 573 | evcmpeq_2 = "10000234-RR", | ||
| 574 | evsel_4 = "10000278RRRW", | ||
| 575 | evsel_3 = "10000278RRR", | ||
| 576 | evfsadd_3 = "10000280RRR", | ||
| 577 | evfssub_3 = "10000281RRR", | ||
| 578 | evfsabs_2 = "10000284RR", | ||
| 579 | evfsnabs_2 = "10000285RR", | ||
| 580 | evfsneg_2 = "10000286RR", | ||
| 581 | evfsmul_3 = "10000288RRR", | ||
| 582 | evfsdiv_3 = "10000289RRR", | ||
| 583 | evfscmpgt_3 = "1000028cXRR", | ||
| 584 | evfscmpgt_2 = "1000028c-RR", | ||
| 585 | evfscmplt_3 = "1000028dXRR", | ||
| 586 | evfscmplt_2 = "1000028d-RR", | ||
| 587 | evfscmpeq_3 = "1000028eXRR", | ||
| 588 | evfscmpeq_2 = "1000028e-RR", | ||
| 589 | evfscfui_2 = "10000290R-R", | ||
| 590 | evfscfsi_2 = "10000291R-R", | ||
| 591 | evfscfuf_2 = "10000292R-R", | ||
| 592 | evfscfsf_2 = "10000293R-R", | ||
| 593 | evfsctui_2 = "10000294R-R", | ||
| 594 | evfsctsi_2 = "10000295R-R", | ||
| 595 | evfsctuf_2 = "10000296R-R", | ||
| 596 | evfsctsf_2 = "10000297R-R", | ||
| 597 | evfsctuiz_2 = "10000298R-R", | ||
| 598 | evfsctsiz_2 = "1000029aR-R", | ||
| 599 | evfststgt_3 = "1000029cXRR", | ||
| 600 | evfststgt_2 = "1000029c-RR", | ||
| 601 | evfststlt_3 = "1000029dXRR", | ||
| 602 | evfststlt_2 = "1000029d-RR", | ||
| 603 | evfststeq_3 = "1000029eXRR", | ||
| 604 | evfststeq_2 = "1000029e-RR", | ||
| 605 | efsadd_3 = "100002c0RRR", | ||
| 606 | efssub_3 = "100002c1RRR", | ||
| 607 | efsabs_2 = "100002c4RR", | ||
| 608 | efsnabs_2 = "100002c5RR", | ||
| 609 | efsneg_2 = "100002c6RR", | ||
| 610 | efsmul_3 = "100002c8RRR", | ||
| 611 | efsdiv_3 = "100002c9RRR", | ||
| 612 | efscmpgt_3 = "100002ccXRR", | ||
| 613 | efscmpgt_2 = "100002cc-RR", | ||
| 614 | efscmplt_3 = "100002cdXRR", | ||
| 615 | efscmplt_2 = "100002cd-RR", | ||
| 616 | efscmpeq_3 = "100002ceXRR", | ||
| 617 | efscmpeq_2 = "100002ce-RR", | ||
| 618 | efscfd_2 = "100002cfR-R", | ||
| 619 | efscfui_2 = "100002d0R-R", | ||
| 620 | efscfsi_2 = "100002d1R-R", | ||
| 621 | efscfuf_2 = "100002d2R-R", | ||
| 622 | efscfsf_2 = "100002d3R-R", | ||
| 623 | efsctui_2 = "100002d4R-R", | ||
| 624 | efsctsi_2 = "100002d5R-R", | ||
| 625 | efsctuf_2 = "100002d6R-R", | ||
| 626 | efsctsf_2 = "100002d7R-R", | ||
| 627 | efsctuiz_2 = "100002d8R-R", | ||
| 628 | efsctsiz_2 = "100002daR-R", | ||
| 629 | efststgt_3 = "100002dcXRR", | ||
| 630 | efststgt_2 = "100002dc-RR", | ||
| 631 | efststlt_3 = "100002ddXRR", | ||
| 632 | efststlt_2 = "100002dd-RR", | ||
| 633 | efststeq_3 = "100002deXRR", | ||
| 634 | efststeq_2 = "100002de-RR", | ||
| 635 | efdadd_3 = "100002e0RRR", | ||
| 636 | efdsub_3 = "100002e1RRR", | ||
| 637 | efdcfuid_2 = "100002e2R-R", | ||
| 638 | efdcfsid_2 = "100002e3R-R", | ||
| 639 | efdabs_2 = "100002e4RR", | ||
| 640 | efdnabs_2 = "100002e5RR", | ||
| 641 | efdneg_2 = "100002e6RR", | ||
| 642 | efdmul_3 = "100002e8RRR", | ||
| 643 | efddiv_3 = "100002e9RRR", | ||
| 644 | efdctuidz_2 = "100002eaR-R", | ||
| 645 | efdctsidz_2 = "100002ebR-R", | ||
| 646 | efdcmpgt_3 = "100002ecXRR", | ||
| 647 | efdcmpgt_2 = "100002ec-RR", | ||
| 648 | efdcmplt_3 = "100002edXRR", | ||
| 649 | efdcmplt_2 = "100002ed-RR", | ||
| 650 | efdcmpeq_3 = "100002eeXRR", | ||
| 651 | efdcmpeq_2 = "100002ee-RR", | ||
| 652 | efdcfs_2 = "100002efR-R", | ||
| 653 | efdcfui_2 = "100002f0R-R", | ||
| 654 | efdcfsi_2 = "100002f1R-R", | ||
| 655 | efdcfuf_2 = "100002f2R-R", | ||
| 656 | efdcfsf_2 = "100002f3R-R", | ||
| 657 | efdctui_2 = "100002f4R-R", | ||
| 658 | efdctsi_2 = "100002f5R-R", | ||
| 659 | efdctuf_2 = "100002f6R-R", | ||
| 660 | efdctsf_2 = "100002f7R-R", | ||
| 661 | efdctuiz_2 = "100002f8R-R", | ||
| 662 | efdctsiz_2 = "100002faR-R", | ||
| 663 | efdtstgt_3 = "100002fcXRR", | ||
| 664 | efdtstgt_2 = "100002fc-RR", | ||
| 665 | efdtstlt_3 = "100002fdXRR", | ||
| 666 | efdtstlt_2 = "100002fd-RR", | ||
| 667 | efdtsteq_3 = "100002feXRR", | ||
| 668 | efdtsteq_2 = "100002fe-RR", | ||
| 669 | evlddx_3 = "10000300RRR", | ||
| 670 | evldd_2 = "10000301R8", | ||
| 671 | evldwx_3 = "10000302RRR", | ||
| 672 | evldw_2 = "10000303R8", | ||
| 673 | evldhx_3 = "10000304RRR", | ||
| 674 | evldh_2 = "10000305R8", | ||
| 675 | evlwhex_3 = "10000310RRR", | ||
| 676 | evlwhe_2 = "10000311R4", | ||
| 677 | evlwhoux_3 = "10000314RRR", | ||
| 678 | evlwhou_2 = "10000315R4", | ||
| 679 | evlwhosx_3 = "10000316RRR", | ||
| 680 | evlwhos_2 = "10000317R4", | ||
| 681 | evstddx_3 = "10000320RRR", | ||
| 682 | evstdd_2 = "10000321R8", | ||
| 683 | evstdwx_3 = "10000322RRR", | ||
| 684 | evstdw_2 = "10000323R8", | ||
| 685 | evstdhx_3 = "10000324RRR", | ||
| 686 | evstdh_2 = "10000325R8", | ||
| 687 | evstwhex_3 = "10000330RRR", | ||
| 688 | evstwhe_2 = "10000331R4", | ||
| 689 | evstwhox_3 = "10000334RRR", | ||
| 690 | evstwho_2 = "10000335R4", | ||
| 691 | evstwwex_3 = "10000338RRR", | ||
| 692 | evstwwe_2 = "10000339R4", | ||
| 693 | evstwwox_3 = "1000033cRRR", | ||
| 694 | evstwwo_2 = "1000033dR4", | ||
| 695 | evmhessf_3 = "10000403RRR", | ||
| 696 | evmhossf_3 = "10000407RRR", | ||
| 697 | evmheumi_3 = "10000408RRR", | ||
| 698 | evmhesmi_3 = "10000409RRR", | ||
| 699 | evmhesmf_3 = "1000040bRRR", | ||
| 700 | evmhoumi_3 = "1000040cRRR", | ||
| 701 | evmhosmi_3 = "1000040dRRR", | ||
| 702 | evmhosmf_3 = "1000040fRRR", | ||
| 703 | evmhessfa_3 = "10000423RRR", | ||
| 704 | evmhossfa_3 = "10000427RRR", | ||
| 705 | evmheumia_3 = "10000428RRR", | ||
| 706 | evmhesmia_3 = "10000429RRR", | ||
| 707 | evmhesmfa_3 = "1000042bRRR", | ||
| 708 | evmhoumia_3 = "1000042cRRR", | ||
| 709 | evmhosmia_3 = "1000042dRRR", | ||
| 710 | evmhosmfa_3 = "1000042fRRR", | ||
| 711 | evmwhssf_3 = "10000447RRR", | ||
| 712 | evmwlumi_3 = "10000448RRR", | ||
| 713 | evmwhumi_3 = "1000044cRRR", | ||
| 714 | evmwhsmi_3 = "1000044dRRR", | ||
| 715 | evmwhsmf_3 = "1000044fRRR", | ||
| 716 | evmwssf_3 = "10000453RRR", | ||
| 717 | evmwumi_3 = "10000458RRR", | ||
| 718 | evmwsmi_3 = "10000459RRR", | ||
| 719 | evmwsmf_3 = "1000045bRRR", | ||
| 720 | evmwhssfa_3 = "10000467RRR", | ||
| 721 | evmwlumia_3 = "10000468RRR", | ||
| 722 | evmwhumia_3 = "1000046cRRR", | ||
| 723 | evmwhsmia_3 = "1000046dRRR", | ||
| 724 | evmwhsmfa_3 = "1000046fRRR", | ||
| 725 | evmwssfa_3 = "10000473RRR", | ||
| 726 | evmwumia_3 = "10000478RRR", | ||
| 727 | evmwsmia_3 = "10000479RRR", | ||
| 728 | evmwsmfa_3 = "1000047bRRR", | ||
| 729 | evmra_2 = "100004c4RR", | ||
| 730 | evdivws_3 = "100004c6RRR", | ||
| 731 | evdivwu_3 = "100004c7RRR", | ||
| 732 | evmwssfaa_3 = "10000553RRR", | ||
| 733 | evmwumiaa_3 = "10000558RRR", | ||
| 734 | evmwsmiaa_3 = "10000559RRR", | ||
| 735 | evmwsmfaa_3 = "1000055bRRR", | ||
| 736 | evmwssfan_3 = "100005d3RRR", | ||
| 737 | evmwumian_3 = "100005d8RRR", | ||
| 738 | evmwsmian_3 = "100005d9RRR", | ||
| 739 | evmwsmfan_3 = "100005dbRRR", | ||
| 740 | evmergehilo_3 = "1000022eRRR", | ||
| 741 | evmergelohi_3 = "1000022fRRR", | ||
| 742 | evlhhesplatx_3 = "10000308RRR", | ||
| 743 | evlhhesplat_2 = "10000309R2", | ||
| 744 | evlhhousplatx_3 = "1000030cRRR", | ||
| 745 | evlhhousplat_2 = "1000030dR2", | ||
| 746 | evlhhossplatx_3 = "1000030eRRR", | ||
| 747 | evlhhossplat_2 = "1000030fR2", | ||
| 748 | evlwwsplatx_3 = "10000318RRR", | ||
| 749 | evlwwsplat_2 = "10000319R4", | ||
| 750 | evlwhsplatx_3 = "1000031cRRR", | ||
| 751 | evlwhsplat_2 = "1000031dR4", | ||
| 752 | evaddusiaaw_2 = "100004c0RR", | ||
| 753 | evaddssiaaw_2 = "100004c1RR", | ||
| 754 | evsubfusiaaw_2 = "100004c2RR", | ||
| 755 | evsubfssiaaw_2 = "100004c3RR", | ||
| 756 | evaddumiaaw_2 = "100004c8RR", | ||
| 757 | evaddsmiaaw_2 = "100004c9RR", | ||
| 758 | evsubfumiaaw_2 = "100004caRR", | ||
| 759 | evsubfsmiaaw_2 = "100004cbRR", | ||
| 760 | evmheusiaaw_3 = "10000500RRR", | ||
| 761 | evmhessiaaw_3 = "10000501RRR", | ||
| 762 | evmhessfaaw_3 = "10000503RRR", | ||
| 763 | evmhousiaaw_3 = "10000504RRR", | ||
| 764 | evmhossiaaw_3 = "10000505RRR", | ||
| 765 | evmhossfaaw_3 = "10000507RRR", | ||
| 766 | evmheumiaaw_3 = "10000508RRR", | ||
| 767 | evmhesmiaaw_3 = "10000509RRR", | ||
| 768 | evmhesmfaaw_3 = "1000050bRRR", | ||
| 769 | evmhoumiaaw_3 = "1000050cRRR", | ||
| 770 | evmhosmiaaw_3 = "1000050dRRR", | ||
| 771 | evmhosmfaaw_3 = "1000050fRRR", | ||
| 772 | evmhegumiaa_3 = "10000528RRR", | ||
| 773 | evmhegsmiaa_3 = "10000529RRR", | ||
| 774 | evmhegsmfaa_3 = "1000052bRRR", | ||
| 775 | evmhogumiaa_3 = "1000052cRRR", | ||
| 776 | evmhogsmiaa_3 = "1000052dRRR", | ||
| 777 | evmhogsmfaa_3 = "1000052fRRR", | ||
| 778 | evmwlusiaaw_3 = "10000540RRR", | ||
| 779 | evmwlssiaaw_3 = "10000541RRR", | ||
| 780 | evmwlumiaaw_3 = "10000548RRR", | ||
| 781 | evmwlsmiaaw_3 = "10000549RRR", | ||
| 782 | evmheusianw_3 = "10000580RRR", | ||
| 783 | evmhessianw_3 = "10000581RRR", | ||
| 784 | evmhessfanw_3 = "10000583RRR", | ||
| 785 | evmhousianw_3 = "10000584RRR", | ||
| 786 | evmhossianw_3 = "10000585RRR", | ||
| 787 | evmhossfanw_3 = "10000587RRR", | ||
| 788 | evmheumianw_3 = "10000588RRR", | ||
| 789 | evmhesmianw_3 = "10000589RRR", | ||
| 790 | evmhesmfanw_3 = "1000058bRRR", | ||
| 791 | evmhoumianw_3 = "1000058cRRR", | ||
| 792 | evmhosmianw_3 = "1000058dRRR", | ||
| 793 | evmhosmfanw_3 = "1000058fRRR", | ||
| 794 | evmhegumian_3 = "100005a8RRR", | ||
| 795 | evmhegsmian_3 = "100005a9RRR", | ||
| 796 | evmhegsmfan_3 = "100005abRRR", | ||
| 797 | evmhogumian_3 = "100005acRRR", | ||
| 798 | evmhogsmian_3 = "100005adRRR", | ||
| 799 | evmhogsmfan_3 = "100005afRRR", | ||
| 800 | evmwlusianw_3 = "100005c0RRR", | ||
| 801 | evmwlssianw_3 = "100005c1RRR", | ||
| 802 | evmwlumianw_3 = "100005c8RRR", | ||
| 803 | evmwlsmianw_3 = "100005c9RRR", | ||
| 804 | |||
| 529 | -- NYI: some 64 bit PowerPC and Book E instructions: | 805 | -- NYI: some 64 bit PowerPC and Book E instructions: |
| 530 | -- rldicl, rldicr, rldic, rldimi, rldcl, rldcr, sradi, 64 bit ext. add/sub, | 806 | -- rldicl, rldicr, rldic, rldimi, rldcl, rldcr, sradi, 64 bit ext. add/sub, |
| 531 | -- extended addressing branches, cache management, loads and stores | 807 | -- extended addressing branches, cache management, loads and stores |
| @@ -720,16 +996,26 @@ map_op[".template__"] = function(params, template, nparams) | |||
| 720 | rs = rs - 5; op = op + parse_fpr(params[n]) * 2^rs; n = n + 1 | 996 | rs = rs - 5; op = op + parse_fpr(params[n]) * 2^rs; n = n + 1 |
| 721 | elseif p == "A" then | 997 | elseif p == "A" then |
| 722 | rs = rs - 5; op = op + parse_imm(params[n], 5, rs, 0, false); n = n + 1 | 998 | rs = rs - 5; op = op + parse_imm(params[n], 5, rs, 0, false); n = n + 1 |
| 999 | elseif p == "S" then | ||
| 1000 | rs = rs - 5; op = op + parse_imm(params[n], 5, rs, 0, true); n = n + 1 | ||
| 723 | elseif p == "I" then | 1001 | elseif p == "I" then |
| 724 | op = op + parse_imm(params[n], 16, 0, 0, true); n = n + 1 | 1002 | op = op + parse_imm(params[n], 16, 0, 0, true); n = n + 1 |
| 725 | elseif p == "U" then | 1003 | elseif p == "U" then |
| 726 | op = op + parse_imm(params[n], 16, 0, 0, false); n = n + 1 | 1004 | op = op + parse_imm(params[n], 16, 0, 0, false); n = n + 1 |
| 727 | elseif p == "D" then | 1005 | elseif p == "D" then |
| 728 | op = op + parse_disp(params[n]); n = n + 1 | 1006 | op = op + parse_disp(params[n]); n = n + 1 |
| 1007 | elseif p == "2" then | ||
| 1008 | op = op + parse_u5disp(params[n], 1); n = n + 1 | ||
| 1009 | elseif p == "4" then | ||
| 1010 | op = op + parse_u5disp(params[n], 2); n = n + 1 | ||
| 1011 | elseif p == "8" then | ||
| 1012 | op = op + parse_u5disp(params[n], 3); n = n + 1 | ||
| 729 | elseif p == "C" then | 1013 | elseif p == "C" then |
| 730 | rs = rs - 5; op = op + parse_cond(params[n]) * 2^rs; n = n + 1 | 1014 | rs = rs - 5; op = op + parse_cond(params[n]) * 2^rs; n = n + 1 |
| 731 | elseif p == "X" then | 1015 | elseif p == "X" then |
| 732 | rs = rs - 5; op = op + parse_cr(params[n]) * 2^(rs+2); n = n + 1 | 1016 | rs = rs - 5; op = op + parse_cr(params[n]) * 2^(rs+2); n = n + 1 |
| 1017 | elseif p == "W" then | ||
| 1018 | op = op + parse_cr(params[n]); n = n + 1 | ||
| 733 | elseif p == "J" or p == "K" then | 1019 | elseif p == "J" or p == "K" then |
| 734 | local mode, n, s = parse_label(params[n], false) | 1020 | local mode, n, s = parse_label(params[n], false) |
| 735 | if p == "K" then n = n + 2048 end | 1021 | if p == "K" then n = n + 2048 end |
