diff options
-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 |