Commit e9c71dd1c1f5aeb3732261a02dcfae031973f053
1 parent
29fe0e34
Support for VR5432, and some of its special instructions. Original patch
by Dirk Behme. git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3859 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
6 changed files
with
405 additions
and
7 deletions
target-mips/exec.h
| ... | ... | @@ -79,6 +79,20 @@ void do_madd (void); |
| 79 | 79 | void do_maddu (void); |
| 80 | 80 | void do_msub (void); |
| 81 | 81 | void do_msubu (void); |
| 82 | +void do_muls (void); | |
| 83 | +void do_mulsu (void); | |
| 84 | +void do_macc (void); | |
| 85 | +void do_macchi (void); | |
| 86 | +void do_maccu (void); | |
| 87 | +void do_macchiu (void); | |
| 88 | +void do_msac (void); | |
| 89 | +void do_msachi (void); | |
| 90 | +void do_msacu (void); | |
| 91 | +void do_msachiu (void); | |
| 92 | +void do_mulhi (void); | |
| 93 | +void do_mulhiu (void); | |
| 94 | +void do_mulshi (void); | |
| 95 | +void do_mulshiu (void); | |
| 82 | 96 | #endif |
| 83 | 97 | #if defined(TARGET_MIPS64) |
| 84 | 98 | void do_ddiv (void); | ... | ... |
target-mips/mips-defs.h
| ... | ... | @@ -4,7 +4,7 @@ |
| 4 | 4 | /* If we want to use host float regs... */ |
| 5 | 5 | //#define USE_HOST_FLOAT_REGS |
| 6 | 6 | |
| 7 | -/* real pages are variable size... */ | |
| 7 | +/* Real pages are variable size... */ | |
| 8 | 8 | #define TARGET_PAGE_BITS 12 |
| 9 | 9 | #define MIPS_TLB_MAX 128 |
| 10 | 10 | |
| ... | ... | @@ -29,7 +29,7 @@ |
| 29 | 29 | #define ISA_MIPS64 0x00000080 |
| 30 | 30 | #define ISA_MIPS64R2 0x00000100 |
| 31 | 31 | |
| 32 | -/* MIPS ASE */ | |
| 32 | +/* MIPS ASEs. */ | |
| 33 | 33 | #define ASE_MIPS16 0x00001000 |
| 34 | 34 | #define ASE_MIPS3D 0x00002000 |
| 35 | 35 | #define ASE_MDMX 0x00004000 |
| ... | ... | @@ -38,19 +38,23 @@ |
| 38 | 38 | #define ASE_MT 0x00020000 |
| 39 | 39 | #define ASE_SMARTMIPS 0x00040000 |
| 40 | 40 | |
| 41 | -/* Chip specific instructions. */ | |
| 42 | -/* Currently void */ | |
| 41 | +/* Chip specific instructions. */ | |
| 42 | +#define INSN_VR54XX 0x80000000 | |
| 43 | 43 | |
| 44 | -/* MIPS CPU defines. */ | |
| 44 | +/* MIPS CPU defines. */ | |
| 45 | 45 | #define CPU_MIPS1 (ISA_MIPS1) |
| 46 | 46 | #define CPU_MIPS2 (CPU_MIPS1 | ISA_MIPS2) |
| 47 | 47 | #define CPU_MIPS3 (CPU_MIPS2 | ISA_MIPS3) |
| 48 | 48 | #define CPU_MIPS4 (CPU_MIPS3 | ISA_MIPS4) |
| 49 | +#define CPU_VR54XX (CPU_MIPS4 | INSN_VR54XX) | |
| 50 | + | |
| 49 | 51 | #define CPU_MIPS5 (CPU_MIPS4 | ISA_MIPS5) |
| 50 | 52 | |
| 53 | +/* MIPS Technologies "Release 1" */ | |
| 51 | 54 | #define CPU_MIPS32 (CPU_MIPS2 | ISA_MIPS32) |
| 52 | 55 | #define CPU_MIPS64 (CPU_MIPS5 | CPU_MIPS32 | ISA_MIPS64) |
| 53 | 56 | |
| 57 | +/* MIPS Technologies "Release 2" */ | |
| 54 | 58 | #define CPU_MIPS32R2 (CPU_MIPS32 | ISA_MIPS32R2) |
| 55 | 59 | #define CPU_MIPS64R2 (CPU_MIPS64 | CPU_MIPS32R2 | ISA_MIPS64R2) |
| 56 | 60 | ... | ... |
target-mips/op.c
| ... | ... | @@ -781,6 +781,90 @@ void op_msubu (void) |
| 781 | 781 | FORCE_RET(); |
| 782 | 782 | } |
| 783 | 783 | |
| 784 | +/* Multiplication variants of the vr54xx. */ | |
| 785 | +void op_muls (void) | |
| 786 | +{ | |
| 787 | + CALL_FROM_TB0(do_muls); | |
| 788 | + FORCE_RET(); | |
| 789 | +} | |
| 790 | + | |
| 791 | +void op_mulsu (void) | |
| 792 | +{ | |
| 793 | + CALL_FROM_TB0(do_mulsu); | |
| 794 | + FORCE_RET(); | |
| 795 | +} | |
| 796 | + | |
| 797 | +void op_macc (void) | |
| 798 | +{ | |
| 799 | + CALL_FROM_TB0(do_macc); | |
| 800 | + FORCE_RET(); | |
| 801 | +} | |
| 802 | + | |
| 803 | +void op_macchi (void) | |
| 804 | +{ | |
| 805 | + CALL_FROM_TB0(do_macchi); | |
| 806 | + FORCE_RET(); | |
| 807 | +} | |
| 808 | + | |
| 809 | +void op_maccu (void) | |
| 810 | +{ | |
| 811 | + CALL_FROM_TB0(do_maccu); | |
| 812 | + FORCE_RET(); | |
| 813 | +} | |
| 814 | +void op_macchiu (void) | |
| 815 | +{ | |
| 816 | + CALL_FROM_TB0(do_macchiu); | |
| 817 | + FORCE_RET(); | |
| 818 | +} | |
| 819 | + | |
| 820 | +void op_msac (void) | |
| 821 | +{ | |
| 822 | + CALL_FROM_TB0(do_msac); | |
| 823 | + FORCE_RET(); | |
| 824 | +} | |
| 825 | + | |
| 826 | +void op_msachi (void) | |
| 827 | +{ | |
| 828 | + CALL_FROM_TB0(do_msachi); | |
| 829 | + FORCE_RET(); | |
| 830 | +} | |
| 831 | + | |
| 832 | +void op_msacu (void) | |
| 833 | +{ | |
| 834 | + CALL_FROM_TB0(do_msacu); | |
| 835 | + FORCE_RET(); | |
| 836 | +} | |
| 837 | + | |
| 838 | +void op_msachiu (void) | |
| 839 | +{ | |
| 840 | + CALL_FROM_TB0(do_msachiu); | |
| 841 | + FORCE_RET(); | |
| 842 | +} | |
| 843 | + | |
| 844 | +void op_mulhi (void) | |
| 845 | +{ | |
| 846 | + CALL_FROM_TB0(do_mulhi); | |
| 847 | + FORCE_RET(); | |
| 848 | +} | |
| 849 | + | |
| 850 | +void op_mulhiu (void) | |
| 851 | +{ | |
| 852 | + CALL_FROM_TB0(do_mulhiu); | |
| 853 | + FORCE_RET(); | |
| 854 | +} | |
| 855 | + | |
| 856 | +void op_mulshi (void) | |
| 857 | +{ | |
| 858 | + CALL_FROM_TB0(do_mulshi); | |
| 859 | + FORCE_RET(); | |
| 860 | +} | |
| 861 | + | |
| 862 | +void op_mulshiu (void) | |
| 863 | +{ | |
| 864 | + CALL_FROM_TB0(do_mulshiu); | |
| 865 | + FORCE_RET(); | |
| 866 | +} | |
| 867 | + | |
| 784 | 868 | #else /* TARGET_LONG_BITS > HOST_LONG_BITS */ |
| 785 | 869 | |
| 786 | 870 | static always_inline uint64_t get_HILO (void) |
| ... | ... | @@ -795,6 +879,18 @@ static always_inline void set_HILO (uint64_t HILO) |
| 795 | 879 | env->HI[0][env->current_tc] = (int32_t)(HILO >> 32); |
| 796 | 880 | } |
| 797 | 881 | |
| 882 | +static always_inline void set_HIT0_LO (uint64_t HILO) | |
| 883 | +{ | |
| 884 | + env->LO[0][env->current_tc] = (int32_t)(HILO & 0xFFFFFFFF); | |
| 885 | + T0 = env->HI[0][env->current_tc] = (int32_t)(HILO >> 32); | |
| 886 | +} | |
| 887 | + | |
| 888 | +static always_inline void set_HI_LOT0 (uint64_t HILO) | |
| 889 | +{ | |
| 890 | + T0 = env->LO[0][env->current_tc] = (int32_t)(HILO & 0xFFFFFFFF); | |
| 891 | + env->HI[0][env->current_tc] = (int32_t)(HILO >> 32); | |
| 892 | +} | |
| 893 | + | |
| 798 | 894 | void op_mult (void) |
| 799 | 895 | { |
| 800 | 896 | set_HILO((int64_t)(int32_t)T0 * (int64_t)(int32_t)T1); |
| ... | ... | @@ -842,6 +938,92 @@ void op_msubu (void) |
| 842 | 938 | set_HILO(get_HILO() - tmp); |
| 843 | 939 | FORCE_RET(); |
| 844 | 940 | } |
| 941 | + | |
| 942 | +/* Multiplication variants of the vr54xx. */ | |
| 943 | +void op_muls (void) | |
| 944 | +{ | |
| 945 | + set_HI_LOT0(0 - ((int64_t)(int32_t)T0 * (int64_t)(int32_t)T1)); | |
| 946 | + FORCE_RET(); | |
| 947 | +} | |
| 948 | + | |
| 949 | +void op_mulsu (void) | |
| 950 | +{ | |
| 951 | + set_HI_LOT0(0 - ((uint64_t)(uint32_t)T0 * (uint64_t)(uint32_t)T1)); | |
| 952 | + FORCE_RET(); | |
| 953 | +} | |
| 954 | + | |
| 955 | +void op_macc (void) | |
| 956 | +{ | |
| 957 | + set_HI_LOT0(get_HILO() + ((int64_t)(int32_t)T0 * (int64_t)(int32_t)T1)); | |
| 958 | + FORCE_RET(); | |
| 959 | +} | |
| 960 | + | |
| 961 | +void op_macchi (void) | |
| 962 | +{ | |
| 963 | + set_HIT0_LO(get_HILO() + ((int64_t)(int32_t)T0 * (int64_t)(int32_t)T1)); | |
| 964 | + FORCE_RET(); | |
| 965 | +} | |
| 966 | + | |
| 967 | +void op_maccu (void) | |
| 968 | +{ | |
| 969 | + set_HI_LOT0(get_HILO() + ((uint64_t)(uint32_t)T0 * (uint64_t)(uint32_t)T1)); | |
| 970 | + FORCE_RET(); | |
| 971 | +} | |
| 972 | + | |
| 973 | +void op_macchiu (void) | |
| 974 | +{ | |
| 975 | + set_HIT0_LO(get_HILO() + ((uint64_t)(uint32_t)T0 * (uint64_t)(uint32_t)T1)); | |
| 976 | + FORCE_RET(); | |
| 977 | +} | |
| 978 | + | |
| 979 | +void op_msac (void) | |
| 980 | +{ | |
| 981 | + set_HI_LOT0(get_HILO() - ((int64_t)(int32_t)T0 * (int64_t)(int32_t)T1)); | |
| 982 | + FORCE_RET(); | |
| 983 | +} | |
| 984 | + | |
| 985 | +void op_msachi (void) | |
| 986 | +{ | |
| 987 | + set_HIT0_LO(get_HILO() - ((int64_t)(int32_t)T0 * (int64_t)(int32_t)T1)); | |
| 988 | + FORCE_RET(); | |
| 989 | +} | |
| 990 | + | |
| 991 | +void op_msacu (void) | |
| 992 | +{ | |
| 993 | + set_HI_LOT0(get_HILO() - ((uint64_t)(uint32_t)T0 * (uint64_t)(uint32_t)T1)); | |
| 994 | + FORCE_RET(); | |
| 995 | +} | |
| 996 | + | |
| 997 | +void op_msachiu (void) | |
| 998 | +{ | |
| 999 | + set_HIT0_LO(get_HILO() - ((uint64_t)(uint32_t)T0 * (uint64_t)(uint32_t)T1)); | |
| 1000 | + FORCE_RET(); | |
| 1001 | +} | |
| 1002 | + | |
| 1003 | +void op_mulhi (void) | |
| 1004 | +{ | |
| 1005 | + set_HIT0_LO((int64_t)(int32_t)T0 * (int64_t)(int32_t)T1); | |
| 1006 | + FORCE_RET(); | |
| 1007 | +} | |
| 1008 | + | |
| 1009 | +void op_mulhiu (void) | |
| 1010 | +{ | |
| 1011 | + set_HIT0_LO((uint64_t)(uint32_t)T0 * (uint64_t)(uint32_t)T1); | |
| 1012 | + FORCE_RET(); | |
| 1013 | +} | |
| 1014 | + | |
| 1015 | +void op_mulshi (void) | |
| 1016 | +{ | |
| 1017 | + set_HIT0_LO(0 - ((int64_t)(int32_t)T0 * (int64_t)(int32_t)T1)); | |
| 1018 | + FORCE_RET(); | |
| 1019 | +} | |
| 1020 | + | |
| 1021 | +void op_mulshiu (void) | |
| 1022 | +{ | |
| 1023 | + set_HIT0_LO(0 - ((uint64_t)(uint32_t)T0 * (uint64_t)(uint32_t)T1)); | |
| 1024 | + FORCE_RET(); | |
| 1025 | +} | |
| 1026 | + | |
| 845 | 1027 | #endif /* TARGET_LONG_BITS > HOST_LONG_BITS */ |
| 846 | 1028 | |
| 847 | 1029 | #if defined(TARGET_MIPS64) | ... | ... |
target-mips/op_helper.c
| ... | ... | @@ -172,6 +172,18 @@ static always_inline void set_HILO (uint64_t HILO) |
| 172 | 172 | env->HI[0][env->current_tc] = (int32_t)(HILO >> 32); |
| 173 | 173 | } |
| 174 | 174 | |
| 175 | +static always_inline void set_HIT0_LO (uint64_t HILO) | |
| 176 | +{ | |
| 177 | + env->LO[0][env->current_tc] = (int32_t)(HILO & 0xFFFFFFFF); | |
| 178 | + T0 = env->HI[0][env->current_tc] = (int32_t)(HILO >> 32); | |
| 179 | +} | |
| 180 | + | |
| 181 | +static always_inline void set_HI_LOT0 (uint64_t HILO) | |
| 182 | +{ | |
| 183 | + T0 = env->LO[0][env->current_tc] = (int32_t)(HILO & 0xFFFFFFFF); | |
| 184 | + env->HI[0][env->current_tc] = (int32_t)(HILO >> 32); | |
| 185 | +} | |
| 186 | + | |
| 175 | 187 | void do_mult (void) |
| 176 | 188 | { |
| 177 | 189 | set_HILO((int64_t)(int32_t)T0 * (int64_t)(int32_t)T1); |
| ... | ... | @@ -213,7 +225,78 @@ void do_msubu (void) |
| 213 | 225 | tmp = ((uint64_t)(uint32_t)T0 * (uint64_t)(uint32_t)T1); |
| 214 | 226 | set_HILO(get_HILO() - tmp); |
| 215 | 227 | } |
| 216 | -#endif | |
| 228 | + | |
| 229 | +/* Multiplication variants of the vr54xx. */ | |
| 230 | +void do_muls (void) | |
| 231 | +{ | |
| 232 | + set_HI_LOT0(0 - ((int64_t)(int32_t)T0 * (int64_t)(int32_t)T1)); | |
| 233 | +} | |
| 234 | + | |
| 235 | +void do_mulsu (void) | |
| 236 | +{ | |
| 237 | + set_HI_LOT0(0 - ((uint64_t)(uint32_t)T0 * (uint64_t)(uint32_t)T1)); | |
| 238 | +} | |
| 239 | + | |
| 240 | +void do_macc (void) | |
| 241 | +{ | |
| 242 | + set_HI_LOT0(((int64_t)get_HILO()) + ((int64_t)(int32_t)T0 * (int64_t)(int32_t)T1)); | |
| 243 | +} | |
| 244 | + | |
| 245 | +void do_macchi (void) | |
| 246 | +{ | |
| 247 | + set_HIT0_LO(((int64_t)get_HILO()) + ((int64_t)(int32_t)T0 * (int64_t)(int32_t)T1)); | |
| 248 | +} | |
| 249 | + | |
| 250 | +void do_maccu (void) | |
| 251 | +{ | |
| 252 | + set_HI_LOT0(((uint64_t)get_HILO()) + ((uint64_t)(uint32_t)T0 * (uint64_t)(uint32_t)T1)); | |
| 253 | +} | |
| 254 | + | |
| 255 | +void do_macchiu (void) | |
| 256 | +{ | |
| 257 | + set_HIT0_LO(((uint64_t)get_HILO()) + ((uint64_t)(uint32_t)T0 * (uint64_t)(uint32_t)T1)); | |
| 258 | +} | |
| 259 | + | |
| 260 | +void do_msac (void) | |
| 261 | +{ | |
| 262 | + set_HI_LOT0(((int64_t)get_HILO()) - ((int64_t)(int32_t)T0 * (int64_t)(int32_t)T1)); | |
| 263 | +} | |
| 264 | + | |
| 265 | +void do_msachi (void) | |
| 266 | +{ | |
| 267 | + set_HIT0_LO(((int64_t)get_HILO()) - ((int64_t)(int32_t)T0 * (int64_t)(int32_t)T1)); | |
| 268 | +} | |
| 269 | + | |
| 270 | +void do_msacu (void) | |
| 271 | +{ | |
| 272 | + set_HI_LOT0(((uint64_t)get_HILO()) - ((uint64_t)(uint32_t)T0 * (uint64_t)(uint32_t)T1)); | |
| 273 | +} | |
| 274 | + | |
| 275 | +void do_msachiu (void) | |
| 276 | +{ | |
| 277 | + set_HIT0_LO(((uint64_t)get_HILO()) - ((uint64_t)(uint32_t)T0 * (uint64_t)(uint32_t)T1)); | |
| 278 | +} | |
| 279 | + | |
| 280 | +void do_mulhi (void) | |
| 281 | +{ | |
| 282 | + set_HIT0_LO((int64_t)(int32_t)T0 * (int64_t)(int32_t)T1); | |
| 283 | +} | |
| 284 | + | |
| 285 | +void do_mulhiu (void) | |
| 286 | +{ | |
| 287 | + set_HIT0_LO((uint64_t)(uint32_t)T0 * (uint64_t)(uint32_t)T1); | |
| 288 | +} | |
| 289 | + | |
| 290 | +void do_mulshi (void) | |
| 291 | +{ | |
| 292 | + set_HIT0_LO(0 - ((int64_t)(int32_t)T0 * (int64_t)(int32_t)T1)); | |
| 293 | +} | |
| 294 | + | |
| 295 | +void do_mulshiu (void) | |
| 296 | +{ | |
| 297 | + set_HIT0_LO(0 - ((uint64_t)(uint32_t)T0 * (uint64_t)(uint32_t)T1)); | |
| 298 | +} | |
| 299 | +#endif /* TARGET_LONG_BITS > HOST_LONG_BITS */ | |
| 217 | 300 | |
| 218 | 301 | #if HOST_LONG_BITS < 64 |
| 219 | 302 | void do_div (void) | ... | ... |
target-mips/translate.c
| ... | ... | @@ -214,6 +214,26 @@ enum { |
| 214 | 214 | OPC_SPECIAL3D_RESERVED = 0x3D | OPC_SPECIAL, |
| 215 | 215 | }; |
| 216 | 216 | |
| 217 | +/* Multiplication variants of the vr54xx. */ | |
| 218 | +#define MASK_MUL_VR54XX(op) MASK_SPECIAL(op) | (op & (0x1F << 6)) | |
| 219 | + | |
| 220 | +enum { | |
| 221 | + OPC_VR54XX_MULS = (0x03 << 6) | OPC_MULT, | |
| 222 | + OPC_VR54XX_MULSU = (0x03 << 6) | OPC_MULTU, | |
| 223 | + OPC_VR54XX_MACC = (0x05 << 6) | OPC_MULT, | |
| 224 | + OPC_VR54XX_MACCU = (0x05 << 6) | OPC_MULTU, | |
| 225 | + OPC_VR54XX_MSAC = (0x07 << 6) | OPC_MULT, | |
| 226 | + OPC_VR54XX_MSACU = (0x07 << 6) | OPC_MULTU, | |
| 227 | + OPC_VR54XX_MULHI = (0x09 << 6) | OPC_MULT, | |
| 228 | + OPC_VR54XX_MULHIU = (0x09 << 6) | OPC_MULTU, | |
| 229 | + OPC_VR54XX_MULSHI = (0x0B << 6) | OPC_MULT, | |
| 230 | + OPC_VR54XX_MULSHIU = (0x0B << 6) | OPC_MULTU, | |
| 231 | + OPC_VR54XX_MACCHI = (0x0D << 6) | OPC_MULT, | |
| 232 | + OPC_VR54XX_MACCHIU = (0x0D << 6) | OPC_MULTU, | |
| 233 | + OPC_VR54XX_MSACHI = (0x0F << 6) | OPC_MULT, | |
| 234 | + OPC_VR54XX_MSACHIU = (0x0F << 6) | OPC_MULTU, | |
| 235 | +}; | |
| 236 | + | |
| 217 | 237 | /* REGIMM (rt field) opcodes */ |
| 218 | 238 | #define MASK_REGIMM(op) MASK_OP_MAJOR(op) | (op & (0x1F << 16)) |
| 219 | 239 | |
| ... | ... | @@ -1530,6 +1550,80 @@ static void gen_muldiv (DisasContext *ctx, uint32_t opc, |
| 1530 | 1550 | MIPS_DEBUG("%s %s %s", opn, regnames[rs], regnames[rt]); |
| 1531 | 1551 | } |
| 1532 | 1552 | |
| 1553 | +static void gen_mul_vr54xx (DisasContext *ctx, uint32_t opc, | |
| 1554 | + int rd, int rs, int rt) | |
| 1555 | +{ | |
| 1556 | + const char *opn = "mul vr54xx"; | |
| 1557 | + | |
| 1558 | + GEN_LOAD_REG_T0(rs); | |
| 1559 | + GEN_LOAD_REG_T1(rt); | |
| 1560 | + | |
| 1561 | + switch (opc) { | |
| 1562 | + case OPC_VR54XX_MULS: | |
| 1563 | + gen_op_muls(); | |
| 1564 | + opn = "muls"; | |
| 1565 | + break; | |
| 1566 | + case OPC_VR54XX_MULSU: | |
| 1567 | + gen_op_mulsu(); | |
| 1568 | + opn = "mulsu"; | |
| 1569 | + break; | |
| 1570 | + case OPC_VR54XX_MACC: | |
| 1571 | + gen_op_macc(); | |
| 1572 | + opn = "macc"; | |
| 1573 | + break; | |
| 1574 | + case OPC_VR54XX_MACCU: | |
| 1575 | + gen_op_maccu(); | |
| 1576 | + opn = "maccu"; | |
| 1577 | + break; | |
| 1578 | + case OPC_VR54XX_MSAC: | |
| 1579 | + gen_op_msac(); | |
| 1580 | + opn = "msac"; | |
| 1581 | + break; | |
| 1582 | + case OPC_VR54XX_MSACU: | |
| 1583 | + gen_op_msacu(); | |
| 1584 | + opn = "msacu"; | |
| 1585 | + break; | |
| 1586 | + case OPC_VR54XX_MULHI: | |
| 1587 | + gen_op_mulhi(); | |
| 1588 | + opn = "mulhi"; | |
| 1589 | + break; | |
| 1590 | + case OPC_VR54XX_MULHIU: | |
| 1591 | + gen_op_mulhiu(); | |
| 1592 | + opn = "mulhiu"; | |
| 1593 | + break; | |
| 1594 | + case OPC_VR54XX_MULSHI: | |
| 1595 | + gen_op_mulshi(); | |
| 1596 | + opn = "mulshi"; | |
| 1597 | + break; | |
| 1598 | + case OPC_VR54XX_MULSHIU: | |
| 1599 | + gen_op_mulshiu(); | |
| 1600 | + opn = "mulshiu"; | |
| 1601 | + break; | |
| 1602 | + case OPC_VR54XX_MACCHI: | |
| 1603 | + gen_op_macchi(); | |
| 1604 | + opn = "macchi"; | |
| 1605 | + break; | |
| 1606 | + case OPC_VR54XX_MACCHIU: | |
| 1607 | + gen_op_macchiu(); | |
| 1608 | + opn = "macchiu"; | |
| 1609 | + break; | |
| 1610 | + case OPC_VR54XX_MSACHI: | |
| 1611 | + gen_op_msachi(); | |
| 1612 | + opn = "msachi"; | |
| 1613 | + break; | |
| 1614 | + case OPC_VR54XX_MSACHIU: | |
| 1615 | + gen_op_msachiu(); | |
| 1616 | + opn = "msachiu"; | |
| 1617 | + break; | |
| 1618 | + default: | |
| 1619 | + MIPS_INVAL("mul vr54xx"); | |
| 1620 | + generate_exception(ctx, EXCP_RI); | |
| 1621 | + return; | |
| 1622 | + } | |
| 1623 | + GEN_STORE_T0_REG(rd); | |
| 1624 | + MIPS_DEBUG("%s %s, %s, %s", opn, regnames[rd], regnames[rs], regnames[rt]); | |
| 1625 | +} | |
| 1626 | + | |
| 1533 | 1627 | static void gen_cl (DisasContext *ctx, uint32_t opc, |
| 1534 | 1628 | int rd, int rs) |
| 1535 | 1629 | { |
| ... | ... | @@ -5973,7 +6067,12 @@ static void decode_opc (CPUState *env, DisasContext *ctx) |
| 5973 | 6067 | gen_arith(env, ctx, op1, rd, rs, rt); |
| 5974 | 6068 | break; |
| 5975 | 6069 | case OPC_MULT ... OPC_DIVU: |
| 5976 | - gen_muldiv(ctx, op1, rs, rt); | |
| 6070 | + if (sa) { | |
| 6071 | + check_insn(env, ctx, INSN_VR54XX); | |
| 6072 | + op1 = MASK_MUL_VR54XX(ctx->opcode); | |
| 6073 | + gen_mul_vr54xx(ctx, op1, rd, rs, rt); | |
| 6074 | + } else | |
| 6075 | + gen_muldiv(ctx, op1, rs, rt); | |
| 5977 | 6076 | break; |
| 5978 | 6077 | case OPC_JR ... OPC_JALR: |
| 5979 | 6078 | gen_compute_branch(ctx, op1, rs, rd, sa); | ... | ... |
target-mips/translate_init.c
| ... | ... | @@ -306,6 +306,22 @@ static mips_def_t mips_defs[] = |
| 306 | 306 | .mmu_type = MMU_TYPE_R4000, |
| 307 | 307 | }, |
| 308 | 308 | { |
| 309 | + .name = "VR5432", | |
| 310 | + .CP0_PRid = 0x00005400, | |
| 311 | + /* No L2 cache, icache size 8k, dcache size 8k, uncached coherency. */ | |
| 312 | + .CP0_Config0 = (1 << 17) | (0x1 << 9) | (0x1 << 6) | (0x2 << CP0C0_K0), | |
| 313 | + .CP0_Config1 = (1 << CP0C1_FP) | (47 << CP0C1_MMU), | |
| 314 | + .SYNCI_Step = 16, | |
| 315 | + .CCRes = 2, | |
| 316 | + .CP0_Status_rw_bitmask = 0x3678FFFF, | |
| 317 | + /* The VR5432 has a full 64bit FPU but doesn't use the fcr0 bits. */ | |
| 318 | + .CP1_fcr0 = (0x54 << FCR0_PRID) | (0x0 << FCR0_REV), | |
| 319 | + .SEGBITS = 40, | |
| 320 | + .PABITS = 32, | |
| 321 | + .insn_flags = CPU_VR54XX, | |
| 322 | + .mmu_type = MMU_TYPE_R4000, | |
| 323 | + }, | |
| 324 | + { | |
| 309 | 325 | .name = "5Kc", |
| 310 | 326 | .CP0_PRid = 0x00018100, |
| 311 | 327 | .CP0_Config0 = MIPS_CONFIG0 | (0x2 << CP0C0_AT) | | ... | ... |