Revision 7a387fff target-mips/op.c

b/target-mips/op.c
437 437
    RETURN();
438 438
}
439 439

  
440
void op_rotr (void)
441
{
442
    target_ulong tmp;
443

  
444
    if (T1) {
445
       tmp = T0 << (0x20 - T1);
446
       T0 = (T0 >> T1) | tmp;
447
    } else
448
       T0 = T1;
449
    RETURN();
450
}
451

  
440 452
void op_sllv (void)
441 453
{
442 454
    T0 = T1 << (T0 & 0x1F);
......
455 467
    RETURN();
456 468
}
457 469

  
470
void op_rotrv (void)
471
{
472
    target_ulong tmp;
473

  
474
    T0 &= 0x1F;
475
    if (T0) {
476
       tmp = T1 << (0x20 - T0);
477
       T0 = (T1 >> T0) | tmp;
478
    } else
479
       T0 = T1;
480
    RETURN();
481
}
482

  
458 483
void op_clo (void)
459 484
{
460 485
    int n;
......
602 627
    RETURN();
603 628
}
604 629

  
630
void op_movf (void)
631
{
632
    if (!(env->fcr31 & PARAM1))
633
        env->gpr[PARAM2] = env->gpr[PARAM3];
634
    RETURN();
635
}
636

  
637
void op_movt (void)
638
{
639
    if (env->fcr31 & PARAM1)
640
        env->gpr[PARAM2] = env->gpr[PARAM3];
641
    RETURN();
642
}
643

  
605 644
/* Tests */
606 645
#define OP_COND(name, cond) \
607 646
void glue(op_, name) (void) \
......
625 664
OP_COND(lez, (int32_t)T0 <= 0);
626 665
OP_COND(ltz, (int32_t)T0 < 0);
627 666

  
628
/* Branchs */
667
/* Branches */
629 668
//#undef USE_DIRECT_JUMP
630 669

  
631 670
void OPPROTO op_goto_tb0(void)
632 671
{
633 672
    GOTO_TB(op_goto_tb0, PARAM1, 0);
673
    RETURN();
634 674
}
635 675

  
636 676
void OPPROTO op_goto_tb1(void)
637 677
{
638 678
    GOTO_TB(op_goto_tb1, PARAM1, 1);
679
    RETURN();
639 680
}
640 681

  
641 682
/* Branch to register */
642 683
void op_save_breg_target (void)
643 684
{
644 685
    env->btarget = T2;
686
    RETURN();
645 687
}
646 688

  
647 689
void op_restore_breg_target (void)
648 690
{
649 691
    T2 = env->btarget;
692
    RETURN();
650 693
}
651 694

  
652 695
void op_breg (void)
......
724 767
    RETURN();
725 768
}
726 769

  
770
void op_mfc0_pagegrain (void)
771
{
772
    T0 = env->CP0_PageGrain;
773
    RETURN();
774
}
775

  
727 776
void op_mfc0_wired (void)
728 777
{
729 778
    T0 = env->CP0_Wired;
730 779
    RETURN();
731 780
}
732 781

  
782
void op_mfc0_hwrena (void)
783
{
784
    T0 = env->CP0_HWREna;
785
    RETURN();
786
}
787

  
733 788
void op_mfc0_badvaddr (void)
734 789
{
735 790
    T0 = env->CP0_BadVAddr;
......
766 821
    RETURN();
767 822
}
768 823

  
824
void op_mfc0_intctl (void)
825
{
826
    T0 = env->CP0_IntCtl;
827
    RETURN();
828
}
829

  
830
void op_mfc0_srsctl (void)
831
{
832
    T0 = env->CP0_SRSCtl;
833
    RETURN();
834
}
835

  
769 836
void op_mfc0_cause (void)
770 837
{
771 838
    T0 = env->CP0_Cause;
......
784 851
    RETURN();
785 852
}
786 853

  
854
void op_mfc0_ebase (void)
855
{
856
    T0 = env->CP0_EBase;
857
    RETURN();
858
}
859

  
787 860
void op_mfc0_config0 (void)
788 861
{
789 862
    T0 = env->CP0_Config0;
......
796 869
    RETURN();
797 870
}
798 871

  
872
void op_mfc0_config2 (void)
873
{
874
    T0 = env->CP0_Config2;
875
    RETURN();
876
}
877

  
878
void op_mfc0_config3 (void)
879
{
880
    T0 = env->CP0_Config3;
881
    RETURN();
882
}
883

  
799 884
void op_mfc0_lladdr (void)
800 885
{
801 886
    T0 = env->CP0_LLAddr >> 4;
802 887
    RETURN();
803 888
}
804 889

  
805
void op_mfc0_watchlo (void)
890
void op_mfc0_watchlo0 (void)
806 891
{
807 892
    T0 = env->CP0_WatchLo;
808 893
    RETURN();
809 894
}
810 895

  
811
void op_mfc0_watchhi (void)
896
void op_mfc0_watchhi0 (void)
812 897
{
813 898
    T0 = env->CP0_WatchHi;
814 899
    RETURN();
815 900
}
816 901

  
902
void op_mfc0_xcontext (void)
903
{
904
    T0 = env->CP0_XContext;
905
    RETURN();
906
}
907

  
908
void op_mfc0_framemask (void)
909
{
910
    T0 = env->CP0_Framemask;
911
    RETURN();
912
}
913

  
817 914
void op_mfc0_debug (void)
818 915
{
819 916
    T0 = env->CP0_Debug;
......
828 925
    RETURN();
829 926
}
830 927

  
928
void op_mfc0_performance0 (void)
929
{
930
    T0 = env->CP0_Performance0;
931
    RETURN();
932
}
933

  
831 934
void op_mfc0_taglo (void)
832 935
{
833 936
    T0 = env->CP0_TagLo;
......
840 943
    RETURN();
841 944
}
842 945

  
946
void op_mfc0_taghi (void)
947
{
948
    T0 = env->CP0_TagHi;
949
    RETURN();
950
}
951

  
952
void op_mfc0_datahi (void)
953
{
954
    T0 = env->CP0_DataHi;
955
    RETURN();
956
}
957

  
843 958
void op_mfc0_errorepc (void)
844 959
{
845 960
    T0 = env->CP0_ErrorEPC;
......
854 969

  
855 970
void op_mtc0_index (void)
856 971
{
857
    env->CP0_index = (env->CP0_index & 0x80000000) | (T0 & 0x0000000F);
972
    env->CP0_index = (env->CP0_index & 0x80000000) | (T0 & (MIPS_TLB_NB - 1));
858 973
    RETURN();
859 974
}
860 975

  
861 976
void op_mtc0_entrylo0 (void)
862 977
{
863
    env->CP0_EntryLo0 = T0 & 0x3FFFFFFF;
978
    /* Large physaddr not implemented */
979
    /* 1k pages not implemented */
980
    env->CP0_EntryLo0 = T0 & 0x3FFFFFFFUL;
864 981
    RETURN();
865 982
}
866 983

  
867 984
void op_mtc0_entrylo1 (void)
868 985
{
869
    env->CP0_EntryLo1 = T0 & 0x3FFFFFFF;
986
    /* Large physaddr not implemented */
987
    /* 1k pages not implemented */
988
    env->CP0_EntryLo1 = T0 & 0x3FFFFFFFUL;
870 989
    RETURN();
871 990
}
872 991

  
873 992
void op_mtc0_context (void)
874 993
{
875
    env->CP0_Context = (env->CP0_Context & 0xFF800000) | (T0 & 0x007FFFF0);
994
    env->CP0_Context = (env->CP0_Context & ~0x007FFFFF) | (T0 & 0x007FFFF0);
876 995
    RETURN();
877 996
}
878 997

  
879 998
void op_mtc0_pagemask (void)
880 999
{
881
    env->CP0_PageMask = T0 & 0x01FFE000;
1000
    /* 1k pages not implemented */
1001
    env->CP0_PageMask = T0 & 0x1FFFE000;
1002
    RETURN();
1003
}
1004

  
1005
void op_mtc0_pagegrain (void)
1006
{
1007
    /* SmartMIPS not implemented */
1008
    /* Large physaddr not implemented */
1009
    /* 1k pages not implemented */
1010
    env->CP0_PageGrain = 0;
882 1011
    RETURN();
883 1012
}
884 1013

  
885 1014
void op_mtc0_wired (void)
886 1015
{
887
    env->CP0_Wired = T0 & 0x0000000F;
1016
    env->CP0_Wired = T0 & (MIPS_TLB_NB - 1);
1017
    RETURN();
1018
}
1019

  
1020
void op_mtc0_hwrena (void)
1021
{
1022
    env->CP0_HWREna = T0 & 0x0000000F;
888 1023
    RETURN();
889 1024
}
890 1025

  
......
898 1033
{
899 1034
    uint32_t old, val;
900 1035

  
1036
    /* 1k pages not implemented */
1037
    /* Ignore MIPS64 TLB for now */
901 1038
    val = T0 & 0xFFFFE0FF;
902 1039
    old = env->CP0_EntryHi;
903 1040
    env->CP0_EntryHi = val;
......
950 1087
    RETURN();
951 1088
}
952 1089

  
1090
void op_mtc0_intctl (void)
1091
{
1092
    /* vectored interrupts not implemented */
1093
    env->CP0_IntCtl = 0;
1094
    RETURN();
1095
}
1096

  
1097
void op_mtc0_srsctl (void)
1098
{
1099
    /* shadow registers not implemented */
1100
    env->CP0_SRSCtl = 0;
1101
    RETURN();
1102
}
1103

  
953 1104
void op_mtc0_cause (void)
954 1105
{
955 1106
    uint32_t val, old;
......
960 1111
#if 0
961 1112
    {
962 1113
        int i, mask;
963

  
964 1114
       /* Check if we ever asserted a software IRQ */
965 1115
        for (i = 0; i < 2; i++) {
966 1116
            mask = 0x100 << i;
......
978 1128
    RETURN();
979 1129
}
980 1130

  
1131
void op_mtc0_ebase (void)
1132
{
1133
    /* vectored interrupts not implemented */
1134
    /* Multi-CPU not implemented */
1135
    env->CP0_EBase = 0x80000000 | (T0 & 0x3FFFF000);
1136
    RETURN();
1137
}
1138

  
981 1139
void op_mtc0_config0 (void)
982 1140
{
983 1141
#if defined(MIPS_USES_R4K_TLB)
984
    env->CP0_Config0 = (env->CP0_Config0 & 0x8017FF80) | (T0 & 0x7E000001);
1142
     /* Fixed mapping MMU not implemented */
1143
    env->CP0_Config0 = (env->CP0_Config0 & 0x8017FF88) | (T0 & 0x00000001);
985 1144
#else
986
    env->CP0_Config0 = (env->CP0_Config0 & 0xFE17FF80) | (T0 & 0x00000001);
1145
    env->CP0_Config0 = (env->CP0_Config0 & 0xFE17FF88) | (T0 & 0x00000001);
987 1146
#endif
988 1147
    RETURN();
989 1148
}
990 1149

  
991
void op_mtc0_watchlo (void)
1150
void op_mtc0_config2 (void)
1151
{
1152
    /* tertiary/secondary caches not implemented */
1153
    env->CP0_Config2 = (env->CP0_Config2 & 0x8FFF0FFF);
1154
    RETURN();
1155
}
1156

  
1157
void op_mtc0_watchlo0 (void)
992 1158
{
993 1159
    env->CP0_WatchLo = T0;
994 1160
    RETURN();
995 1161
}
996 1162

  
997
void op_mtc0_watchhi (void)
1163
void op_mtc0_watchhi0 (void)
998 1164
{
999 1165
    env->CP0_WatchHi = T0 & 0x40FF0FF8;
1000 1166
    RETURN();
1001 1167
}
1002 1168

  
1169
void op_mtc0_xcontext (void)
1170
{
1171
    env->CP0_XContext = T0; /* XXX */
1172
    RETURN();
1173
}
1174

  
1175
void op_mtc0_framemask (void)
1176
{
1177
    env->CP0_Framemask = T0; /* XXX */
1178
    RETURN();
1179
}
1180

  
1003 1181
void op_mtc0_debug (void)
1004 1182
{
1005 1183
    env->CP0_Debug = (env->CP0_Debug & 0x8C03FC1F) | (T0 & 0x13300120);
......
1016 1194
    RETURN();
1017 1195
}
1018 1196

  
1197
void op_mtc0_performance0 (void)
1198
{
1199
    env->CP0_Performance0 = T0; /* XXX */
1200
    RETURN();
1201
}
1202

  
1019 1203
void op_mtc0_taglo (void)
1020 1204
{
1021 1205
    env->CP0_TagLo = T0 & 0xFFFFFCF6;
1022 1206
    RETURN();
1023 1207
}
1024 1208

  
1209
void op_mtc0_datalo (void)
1210
{
1211
    env->CP0_DataLo = T0; /* XXX */
1212
    RETURN();
1213
}
1214

  
1215
void op_mtc0_taghi (void)
1216
{
1217
    env->CP0_TagHi = T0; /* XXX */
1218
    RETURN();
1219
}
1220

  
1221
void op_mtc0_datahi (void)
1222
{
1223
    env->CP0_DataHi = T0; /* XXX */
1224
    RETURN();
1225
}
1226

  
1025 1227
void op_mtc0_errorepc (void)
1026 1228
{
1027 1229
    env->CP0_ErrorEPC = T0;
......
1422 1624
void op_pmon (void)
1423 1625
{
1424 1626
    CALL_FROM_TB1(do_pmon, PARAM1);
1627
    RETURN();
1628
}
1629

  
1630
void op_di (void)
1631
{
1632
    uint32_t val;
1633

  
1634
    T0 = env->CP0_Status;
1635
    val = T0 & ~(1 << CP0St_IE);
1636
    if (val != T0) {
1637
        env->interrupt_request &= ~CPU_INTERRUPT_HARD;
1638
        env->CP0_Status = val;
1639
    }
1640
    RETURN();
1641
}
1642

  
1643
void op_ei (void)
1644
{
1645
    uint32_t val;
1646

  
1647
    T0 = env->CP0_Status;
1648
    val = T0 | (1 << CP0St_IE);
1649
    if (val != T0) {
1650
       const uint32_t mask = 0x0000FF00;
1651

  
1652
       env->CP0_Status = val;
1653
       if (!(env->hflags & MIPS_HFLAG_EXL) &&
1654
           !(env->hflags & MIPS_HFLAG_ERL) &&
1655
           !(env->hflags & MIPS_HFLAG_DM) &&
1656
           (env->CP0_Status & env->CP0_Cause & mask)) {
1657
               env->interrupt_request |= CPU_INTERRUPT_HARD;
1658
               if (logfile)
1659
                   CALL_FROM_TB0(do_mtc0_status_irqraise_debug);
1660
       }
1661
    }
1662
    RETURN();
1425 1663
}
1426 1664

  
1427 1665
void op_trap (void)
......
1434 1672

  
1435 1673
void op_debug (void)
1436 1674
{
1437
  CALL_FROM_TB1(do_raise_exception, EXCP_DEBUG);
1675
    CALL_FROM_TB1(do_raise_exception, EXCP_DEBUG);
1676
    RETURN();
1438 1677
}
1439 1678

  
1440 1679
void op_set_lladdr (void)
1441 1680
{
1442 1681
    env->CP0_LLAddr = T2;
1682
    RETURN();
1443 1683
}
1444 1684

  
1445 1685
void debug_eret (void);
......
1456 1696
	env->CP0_Status &= ~(1 << CP0St_EXL);
1457 1697
    }
1458 1698
    env->CP0_LLAddr = 1;
1699
    RETURN();
1459 1700
}
1460 1701

  
1461 1702
void op_deret (void)
1462 1703
{
1463 1704
    CALL_FROM_TB0(debug_eret);
1464 1705
    env->PC = env->CP0_DEPC;
1706
    RETURN();
1707
}
1708

  
1709
void op_rdhwr_cpunum(void)
1710
{
1711
    if (env->CP0_HWREna & (1 << 0))
1712
       T0 = env->CP0_EBase & 0x2ff;
1713
    else
1714
       CALL_FROM_TB1(do_raise_exception_direct, EXCP_RI);
1715
    RETURN();
1716
}
1717

  
1718
void op_rdhwr_synci_step(void)
1719
{
1720
    if (env->CP0_HWREna & (1 << 1))
1721
       T0 = env->SYNCI_Step;
1722
    else
1723
       CALL_FROM_TB1(do_raise_exception_direct, EXCP_RI);
1724
    RETURN();
1725
}
1726

  
1727
void op_rdhwr_cc(void)
1728
{
1729
    if (env->CP0_HWREna & (1 << 2))
1730
       T0 = env->CP0_Count;
1731
    else
1732
       CALL_FROM_TB1(do_raise_exception_direct, EXCP_RI);
1733
    RETURN();
1734
}
1735

  
1736
void op_rdhwr_ccres(void)
1737
{
1738
    if (env->CP0_HWREna & (1 << 3))
1739
       T0 = env->CCRes;
1740
    else
1741
       CALL_FROM_TB1(do_raise_exception_direct, EXCP_RI);
1742
    RETURN();
1465 1743
}
1466 1744

  
1467 1745
void op_save_state (void)
......
1491 1769
void op_exit_tb (void)
1492 1770
{
1493 1771
    EXIT_TB();
1772
    RETURN();
1494 1773
}
1495 1774

  
1496 1775
void op_wait (void)
1497 1776
{
1498 1777
    env->halted = 1;
1499 1778
    CALL_FROM_TB1(do_raise_exception, EXCP_HLT);
1779
    RETURN();
1780
}
1781

  
1782
/* Bitfield operations. */
1783
void op_ext(void)
1784
{
1785
    unsigned int pos = PARAM1;
1786
    unsigned int size = PARAM2;
1787

  
1788
    T0 = (T1 >> pos) & ((1 << size) - 1);
1789
    RETURN();
1790
}
1791

  
1792
void op_ins(void)
1793
{
1794
    unsigned int pos = PARAM1;
1795
    unsigned int size = PARAM2;
1796
    target_ulong mask = ((1 << size) - 1) << pos;
1797

  
1798
    T0 = (T2 & ~mask) | ((T1 << pos) & mask);
1799
    RETURN();
1800
}
1801

  
1802
void op_wsbh(void)
1803
{
1804
    T0 = ((T1 << 8) & ~0x00FF00FF) | ((T1 >> 8) & 0x00FF00FF);
1805
    RETURN();
1806
}
1807

  
1808
void op_dsbh(void)
1809
{
1810
    T0 = ((T1 << 8) & ~0x00FF00FF00FF00FFULL) | ((T1 >> 8) & 0x00FF00FF00FF00FFULL);
1811
    RETURN();
1812
}
1813

  
1814
void op_dshd(void)
1815
{
1816
    T0 = ((T1 << 16) & ~0x0000FFFF0000FFFFULL) | ((T1 >> 16) & 0x0000FFFF0000FFFFULL);
1817
    RETURN();
1818
}
1819

  
1820
void op_seb(void)
1821
{
1822
    T0 = ((T1 & 0xFF) ^ 0x80) - 0x80;
1823
    RETURN();
1824
}
1825

  
1826
void op_seh(void)
1827
{
1828
    T0 = ((T1 & 0xFFFF) ^ 0x8000) - 0x8000;
1829
    RETURN();
1500 1830
}

Also available in: Unified diff