comparison m68k.cpu @ 2450:6c93869babc1

Fix cycle counts for a number of instructions in new 68K core
author Michael Pavone <pavone@retrodev.com>
date Sun, 18 Feb 2024 22:34:51 -0800
parents d1eec03dca09
children 7d7525769ce2
comparison
equal deleted inserted replaced
2449:bb6cc45518e6 2450:6c93869babc1
425 invalid M 7 R 5 425 invalid M 7 R 5
426 invalid M 7 R 6 426 invalid M 7 R 6
427 invalid M 7 R 7 427 invalid M 7 R 7
428 local size 16 428 local size 16
429 local ext_src 32 429 local ext_src 32
430 #TODO: ensure "penalty" cycles are in the right place
430 if Z 431 if Z
431 mov 2 size 432 size = 2
433 switch M
434 case 0
435 #dreg src
436 cycles 4
437 case 1
438 #areg src
439 cycles 4
440 case 7
441 if R = 4
442 #immediate
443 cycles 4
444 else
445 cycles 2
446 end
447 default
448 cycles 2
449 end
432 else 450 else
433 mov 1 size 451 size = 1
452 cycles 4
434 end 453 end
435 m68k_fetch_src_ea M R size 454 m68k_fetch_src_ea M R size
436 switch size 455 switch size
437 case 1 456 case 1
438 sext 32 src ext_src 457 sext 32 src ext_src
457 switch Z 476 switch Z
458 case 2 477 case 2
459 lsl prefetch 16 immed 478 lsl prefetch 16 immed
460 m68k_prefetch 479 m68k_prefetch
461 or prefetch immed immed 480 or prefetch immed immed
481 if M = 0
482 cycles 4
483 end
462 default 484 default
463 mov prefetch immed 485 mov prefetch immed
464 end 486 end
465 #fetch dst EA 487 #fetch dst EA
466 m68k_fetch_dst_ea M R Z 488 m68k_fetch_dst_ea M R Z
502 invalid Z 3 524 invalid Z 3
503 adc dregs.S dregs.D dregs.D Z 525 adc dregs.S dregs.D dregs.D Z
504 update_flags XNVC 526 update_flags XNVC
505 switch Z 527 switch Z
506 case 0 528 case 0
507 local tmp8 8 529 local tmp8 8
508 mov dregs.D tmp8 530 mov dregs.D tmp8
509 if tmp8 531 if tmp8
510 update_flags Z0 532 update_flags Z0
511 end 533 end
512 case 1 534 case 1
513 local tmp16 16 535 local tmp16 16
514 mov dregs.D tmp16 536 mov dregs.D tmp16
515 if tmp16 537 if tmp16
516 update_flags Z0 538 update_flags Z0
517 end 539 end
518 case 2 540 case 2
519 if dregs.D 541 cycles 4
520 update_flags Z0 542 if dregs.D
521 end 543 update_flags Z0
544 end
522 end 545 end
523 m68k_prefetch 546 m68k_prefetch
524 547
525 1101DDD1ZZ001SSS addx_ay_ax 548 1101DDD1ZZ001SSS addx_ay_ax
526 invalid Z 3 549 invalid Z 3
532 sub 2 aregs.S aregs.S 555 sub 2 aregs.S aregs.S
533 default 556 default
534 decsize Z aregs.S aregs.S 557 decsize Z aregs.S aregs.S
535 end 558 end
536 end 559 end
560 #predec penalty on src only
561 cycles 2
537 mov aregs.S scratch1 562 mov aregs.S scratch1
538 switch Z 563 switch Z
539 case 0 564 case 0
540 ocall read_8 565 ocall read_8
541 case 1 566 case 1
631 switch Z 656 switch Z
632 case 2 657 case 2
633 lsl prefetch 16 immed 658 lsl prefetch 16 immed
634 m68k_prefetch 659 m68k_prefetch
635 or prefetch immed immed 660 or prefetch immed immed
661 if M = 0
662 cycles 4
663 end
636 default 664 default
637 mov prefetch immed 665 mov prefetch immed
638 end 666 end
639 #fetch dst EA 667 #fetch dst EA
640 m68k_fetch_dst_ea M R Z 668 m68k_fetch_dst_ea M R Z
658 invalid M 7 R 5 686 invalid M 7 R 5
659 invalid M 7 R 6 687 invalid M 7 R 6
660 invalid M 7 R 7 688 invalid M 7 R 7
661 invalid Z 3 689 invalid Z 3
662 m68k_fetch_dst_ea M R Z 690 m68k_fetch_dst_ea M R Z
663 691
692 if Z = 2
693 if M = 0
694 cycles 4
695 end
696 end
697
664 xor dregs.D dst dst Z 698 xor dregs.D dst dst Z
665 update_flags NZV0C0 699 update_flags NZV0C0
666 m68k_save_dst Z 700 m68k_save_dst Z
667 m68k_prefetch 701 m68k_prefetch
668 702
681 switch Z 715 switch Z
682 case 2 716 case 2
683 lsl prefetch 16 immed 717 lsl prefetch 16 immed
684 m68k_prefetch 718 m68k_prefetch
685 or prefetch immed immed 719 or prefetch immed immed
720 if M = 0
721 cycles 4
722 end
686 default 723 default
687 mov prefetch immed 724 mov prefetch immed
688 end 725 end
689 #fetch dst EA 726 #fetch dst EA
690 m68k_fetch_dst_ea M R Z 727 m68k_fetch_dst_ea M R Z
705 invalid M 7 R 5 742 invalid M 7 R 5
706 invalid M 7 R 6 743 invalid M 7 R 6
707 invalid M 7 R 7 744 invalid M 7 R 7
708 invalid Z 3 745 invalid Z 3
709 m68k_fetch_src_ea M R Z 746 m68k_fetch_src_ea M R Z
710 747
748 if Z = 2
749 switch M
750 case 0
751 #dreg
752 cycles 4
753 case 7
754 if R = 4
755 #immediate
756 cycles 4
757 else
758 cycles 2
759 end
760 default
761 cycles 2
762 end
763 end
764
711 or src dregs.D dregs.D Z 765 or src dregs.D dregs.D Z
712 update_flags NZV0C0 766 update_flags NZV0C0
713 m68k_prefetch 767 m68k_prefetch
714 768
715 1000DDD1ZZMMMRRR or_dn_ea 769 1000DDD1ZZMMMRRR or_dn_ea
744 switch Z 798 switch Z
745 case 2 799 case 2
746 lsl prefetch 16 immed 800 lsl prefetch 16 immed
747 m68k_prefetch 801 m68k_prefetch
748 or prefetch immed immed 802 or prefetch immed immed
803 if M = 0
804 cycles 4
805 end
749 default 806 default
750 mov prefetch immed 807 mov prefetch immed
751 end 808 end
752 #fetch dst EA 809 #fetch dst EA
753 m68k_fetch_dst_ea M R Z 810 m68k_fetch_dst_ea M R Z
796 invalid M 7 R 6 853 invalid M 7 R 6
797 invalid M 7 R 7 854 invalid M 7 R 7
798 local size 16 855 local size 16
799 local ext_src 32 856 local ext_src 32
800 if Z 857 if Z
801 mov 2 size 858 size = 2
859 switch M
860 case 0
861 #dreg src
862 cycles 4
863 case 1
864 #areg src
865 cycles 4
866 case 7
867 if R = 4
868 #immediate
869 cycles 4
870 else
871 cycles 2
872 end
873 default
874 cycles 2
875 end
802 else 876 else
803 mov 1 size 877 size = 1
878 cycles 4
804 end 879 end
805 m68k_fetch_src_ea M R size 880 m68k_fetch_src_ea M R size
806 switch size 881 switch size
807 case 1 882 case 1
808 sext 32 src ext_src 883 sext 32 src ext_src
827 switch Z 902 switch Z
828 case 2 903 case 2
829 lsl prefetch 16 immed 904 lsl prefetch 16 immed
830 m68k_prefetch 905 m68k_prefetch
831 or prefetch immed immed 906 or prefetch immed immed
907 if M = 0
908 cycles 4
909 end
832 default 910 default
833 mov prefetch immed 911 mov prefetch immed
834 end 912 end
835 #fetch dst EA 913 #fetch dst EA
836 m68k_fetch_dst_ea M R Z 914 m68k_fetch_dst_ea M R Z
930 default 1008 default
931 meta shift C 1009 meta shift C
932 end 1010 end
933 lsl dregs.R shift dregs.R Z 1011 lsl dregs.R shift dregs.R Z
934 update_flags XNZV0C 1012 update_flags XNZV0C
935 add shift shift shift 1013 local cyc 32
936 switch Z 1014 cyc = shift + shift
937 case 2 1015 switch Z
938 add 4 shift shift 1016 case 2
939 default 1017 cyc += 4
940 add 2 shift shift 1018 default
941 end 1019 cyc += 2
942 cycles shift 1020 end
1021 cycles cyc
943 #TODO: should this happen before or after the majority of the shift? 1022 #TODO: should this happen before or after the majority of the shift?
944 m68k_prefetch 1023 m68k_prefetch
945 1024
946 1110CCC1ZZ101RRR lsl_dn 1025 1110CCC1ZZ101RRR lsl_dn
947 invalid Z 3 1026 invalid Z 3
1188 invalid M 7 R 5 1267 invalid M 7 R 5
1189 invalid M 7 R 6 1268 invalid M 7 R 6
1190 invalid M 7 R 7 1269 invalid M 7 R 7
1191 invalid Z 3 1270 invalid Z 3
1192 m68k_fetch_dst_ea M R Z 1271 m68k_fetch_dst_ea M R Z
1272 if Z = 2
1273 if M = 0
1274 #register clears have 2 cycle penalty for longword size
1275 cycles 2
1276 end
1277 end
1193 dst:Z = 0 1278 dst:Z = 0
1194 update_flags N0Z1V0C0 1279 update_flags N0Z1V0C0
1195 m68k_save_dst Z 1280 m68k_save_dst Z
1196 m68k_prefetch 1281 m68k_prefetch
1197 1282