754 |
|
} |
755 |
|
#endif |
756 |
|
|
757 |
+ |
// Fix flags used information for Scc, Bcc, TRAPcc, DBcc instructions |
758 |
+ |
if ( table68k[opc].mnemo == i_Scc |
759 |
+ |
|| table68k[opc].mnemo == i_Bcc |
760 |
+ |
|| table68k[opc].mnemo == i_DBcc |
761 |
+ |
|| table68k[opc].mnemo == i_TRAPcc |
762 |
+ |
) { |
763 |
+ |
switch (table68k[opc].cc) { |
764 |
+ |
// CC mask: XNZVC |
765 |
+ |
// 8421 |
766 |
+ |
case 0: flags_used = 0x00; break; /* T */ |
767 |
+ |
case 1: flags_used = 0x00; break; /* F */ |
768 |
+ |
case 2: flags_used = 0x05; break; /* HI */ |
769 |
+ |
case 3: flags_used = 0x05; break; /* LS */ |
770 |
+ |
case 4: flags_used = 0x01; break; /* CC */ |
771 |
+ |
case 5: flags_used = 0x01; break; /* CS */ |
772 |
+ |
case 6: flags_used = 0x04; break; /* NE */ |
773 |
+ |
case 7: flags_used = 0x04; break; /* EQ */ |
774 |
+ |
case 8: flags_used = 0x02; break; /* VC */ |
775 |
+ |
case 9: flags_used = 0x02; break; /* VS */ |
776 |
+ |
case 10:flags_used = 0x08; break; /* PL */ |
777 |
+ |
case 11:flags_used = 0x08; break; /* MI */ |
778 |
+ |
case 12:flags_used = 0x0A; break; /* GE */ |
779 |
+ |
case 13:flags_used = 0x0A; break; /* LT */ |
780 |
+ |
case 14:flags_used = 0x0E; break; /* GT */ |
781 |
+ |
case 15:flags_used = 0x0E; break; /* LE */ |
782 |
+ |
} |
783 |
+ |
} |
784 |
+ |
|
785 |
|
#if 1 |
786 |
|
/* gb-- flagdead and flaglive would not have correct information */ |
787 |
|
table68k[opc].flagdead = flags_set; |
809 |
|
for (i = 0; i < n_defs68k; i++) { |
810 |
|
build_insn (i); |
811 |
|
} |
784 |
– |
|
785 |
– |
/* Extra fixes in table68k for control flow information and flag usage */ |
786 |
– |
for (i = 0; i < 65536; i++) { |
787 |
– |
instrmnem mnemo = (instrmnem)(table68k[i].mnemo); |
788 |
– |
|
789 |
– |
#define IS_CONST_JUMP(opc) \ |
790 |
– |
( ((table68k[opc].mnemo == i_Bcc) && (table68k[opc].cc < 2)) \ |
791 |
– |
|| (table68k[opc].mnemo == i_BSR) \ |
792 |
– |
) |
793 |
– |
|
794 |
– |
// Precise const jumps as such. The JIT compiler will take |
795 |
– |
// care to actually enable that optimization or not |
796 |
– |
if (IS_CONST_JUMP(i)) |
797 |
– |
table68k[i].cflow |= fl_const_jump; |
798 |
– |
|
799 |
– |
// Fix flags used information for Scc, Bcc, TRAPcc, DBcc instructions |
800 |
– |
int flags_used = table68k[i].flaglive; |
801 |
– |
if ( (mnemo == i_Scc) |
802 |
– |
|| (mnemo == i_Bcc) |
803 |
– |
|| (mnemo == i_DBcc) |
804 |
– |
|| (mnemo == i_TRAPcc) |
805 |
– |
) { |
806 |
– |
switch (table68k[i].cc) { |
807 |
– |
// CC mask: XNZVC |
808 |
– |
// 8421 |
809 |
– |
case 0: flags_used = 0x00; break; /* T */ |
810 |
– |
case 1: flags_used = 0x00; break; /* F */ |
811 |
– |
case 2: flags_used = 0x05; break; /* HI */ |
812 |
– |
case 3: flags_used = 0x05; break; /* LS */ |
813 |
– |
case 4: flags_used = 0x01; break; /* CC */ |
814 |
– |
case 5: flags_used = 0x01; break; /* CS */ |
815 |
– |
case 6: flags_used = 0x04; break; /* NE */ |
816 |
– |
case 7: flags_used = 0x04; break; /* EQ */ |
817 |
– |
case 8: flags_used = 0x02; break; /* VC */ |
818 |
– |
case 9: flags_used = 0x02; break; /* VS */ |
819 |
– |
case 10:flags_used = 0x08; break; /* PL */ |
820 |
– |
case 11:flags_used = 0x08; break; /* MI */ |
821 |
– |
case 12:flags_used = 0x0A; break; /* GE */ |
822 |
– |
case 13:flags_used = 0x0A; break; /* LT */ |
823 |
– |
case 14:flags_used = 0x0E; break; /* GT */ |
824 |
– |
case 15:flags_used = 0x0E; break; /* LE */ |
825 |
– |
} |
826 |
– |
} |
827 |
– |
|
828 |
– |
/* Unconditional jumps don't evaluate condition codes, so they |
829 |
– |
don't actually use any flags themselves */ |
830 |
– |
if (IS_CONST_JUMP(i)) |
831 |
– |
flags_used = 0; |
832 |
– |
|
833 |
– |
table68k[i].flaglive = flags_used; |
834 |
– |
} |
812 |
|
} |
813 |
|
|
814 |
|
static int mismatch; |