Commit 92af06d216857de77bcadaf86cf9675cce9f1d3c
1 parent
278ed7c3
Convert vr54xx multiply instructions to TCG.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4756 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
4 changed files
with
32 additions
and
240 deletions
target-mips/helper.h
| @@ -15,6 +15,21 @@ DEF_HELPER(void, do_dmult, (void)) | @@ -15,6 +15,21 @@ DEF_HELPER(void, do_dmult, (void)) | ||
| 15 | DEF_HELPER(void, do_dmultu, (void)) | 15 | DEF_HELPER(void, do_dmultu, (void)) |
| 16 | #endif | 16 | #endif |
| 17 | 17 | ||
| 18 | +DEF_HELPER(void, do_muls, (void)) | ||
| 19 | +DEF_HELPER(void, do_mulsu, (void)) | ||
| 20 | +DEF_HELPER(void, do_macc, (void)) | ||
| 21 | +DEF_HELPER(void, do_maccu, (void)) | ||
| 22 | +DEF_HELPER(void, do_msac, (void)) | ||
| 23 | +DEF_HELPER(void, do_msacu, (void)) | ||
| 24 | +DEF_HELPER(void, do_mulhi, (void)) | ||
| 25 | +DEF_HELPER(void, do_mulhiu, (void)) | ||
| 26 | +DEF_HELPER(void, do_mulshi, (void)) | ||
| 27 | +DEF_HELPER(void, do_mulshiu, (void)) | ||
| 28 | +DEF_HELPER(void, do_macchi, (void)) | ||
| 29 | +DEF_HELPER(void, do_macchiu, (void)) | ||
| 30 | +DEF_HELPER(void, do_msachi, (void)) | ||
| 31 | +DEF_HELPER(void, do_msachiu, (void)) | ||
| 32 | + | ||
| 18 | /* CP0 helpers */ | 33 | /* CP0 helpers */ |
| 19 | #ifndef CONFIG_USER_ONLY | 34 | #ifndef CONFIG_USER_ONLY |
| 20 | DEF_HELPER(void, do_mfc0_mvpcontrol, (void)) | 35 | DEF_HELPER(void, do_mfc0_mvpcontrol, (void)) |
target-mips/op.c
| @@ -45,226 +45,3 @@ | @@ -45,226 +45,3 @@ | ||
| 45 | #include "op_mem.c" | 45 | #include "op_mem.c" |
| 46 | #undef MEMSUFFIX | 46 | #undef MEMSUFFIX |
| 47 | #endif | 47 | #endif |
| 48 | - | ||
| 49 | -/* 64 bits arithmetic */ | ||
| 50 | -#if TARGET_LONG_BITS > HOST_LONG_BITS | ||
| 51 | -void op_madd (void) | ||
| 52 | -{ | ||
| 53 | - CALL_FROM_TB0(do_madd); | ||
| 54 | - FORCE_RET(); | ||
| 55 | -} | ||
| 56 | - | ||
| 57 | -void op_maddu (void) | ||
| 58 | -{ | ||
| 59 | - CALL_FROM_TB0(do_maddu); | ||
| 60 | - FORCE_RET(); | ||
| 61 | -} | ||
| 62 | - | ||
| 63 | -void op_msub (void) | ||
| 64 | -{ | ||
| 65 | - CALL_FROM_TB0(do_msub); | ||
| 66 | - FORCE_RET(); | ||
| 67 | -} | ||
| 68 | - | ||
| 69 | -void op_msubu (void) | ||
| 70 | -{ | ||
| 71 | - CALL_FROM_TB0(do_msubu); | ||
| 72 | - FORCE_RET(); | ||
| 73 | -} | ||
| 74 | - | ||
| 75 | -/* Multiplication variants of the vr54xx. */ | ||
| 76 | -void op_muls (void) | ||
| 77 | -{ | ||
| 78 | - CALL_FROM_TB0(do_muls); | ||
| 79 | - FORCE_RET(); | ||
| 80 | -} | ||
| 81 | - | ||
| 82 | -void op_mulsu (void) | ||
| 83 | -{ | ||
| 84 | - CALL_FROM_TB0(do_mulsu); | ||
| 85 | - FORCE_RET(); | ||
| 86 | -} | ||
| 87 | - | ||
| 88 | -void op_macc (void) | ||
| 89 | -{ | ||
| 90 | - CALL_FROM_TB0(do_macc); | ||
| 91 | - FORCE_RET(); | ||
| 92 | -} | ||
| 93 | - | ||
| 94 | -void op_macchi (void) | ||
| 95 | -{ | ||
| 96 | - CALL_FROM_TB0(do_macchi); | ||
| 97 | - FORCE_RET(); | ||
| 98 | -} | ||
| 99 | - | ||
| 100 | -void op_maccu (void) | ||
| 101 | -{ | ||
| 102 | - CALL_FROM_TB0(do_maccu); | ||
| 103 | - FORCE_RET(); | ||
| 104 | -} | ||
| 105 | -void op_macchiu (void) | ||
| 106 | -{ | ||
| 107 | - CALL_FROM_TB0(do_macchiu); | ||
| 108 | - FORCE_RET(); | ||
| 109 | -} | ||
| 110 | - | ||
| 111 | -void op_msac (void) | ||
| 112 | -{ | ||
| 113 | - CALL_FROM_TB0(do_msac); | ||
| 114 | - FORCE_RET(); | ||
| 115 | -} | ||
| 116 | - | ||
| 117 | -void op_msachi (void) | ||
| 118 | -{ | ||
| 119 | - CALL_FROM_TB0(do_msachi); | ||
| 120 | - FORCE_RET(); | ||
| 121 | -} | ||
| 122 | - | ||
| 123 | -void op_msacu (void) | ||
| 124 | -{ | ||
| 125 | - CALL_FROM_TB0(do_msacu); | ||
| 126 | - FORCE_RET(); | ||
| 127 | -} | ||
| 128 | - | ||
| 129 | -void op_msachiu (void) | ||
| 130 | -{ | ||
| 131 | - CALL_FROM_TB0(do_msachiu); | ||
| 132 | - FORCE_RET(); | ||
| 133 | -} | ||
| 134 | - | ||
| 135 | -void op_mulhi (void) | ||
| 136 | -{ | ||
| 137 | - CALL_FROM_TB0(do_mulhi); | ||
| 138 | - FORCE_RET(); | ||
| 139 | -} | ||
| 140 | - | ||
| 141 | -void op_mulhiu (void) | ||
| 142 | -{ | ||
| 143 | - CALL_FROM_TB0(do_mulhiu); | ||
| 144 | - FORCE_RET(); | ||
| 145 | -} | ||
| 146 | - | ||
| 147 | -void op_mulshi (void) | ||
| 148 | -{ | ||
| 149 | - CALL_FROM_TB0(do_mulshi); | ||
| 150 | - FORCE_RET(); | ||
| 151 | -} | ||
| 152 | - | ||
| 153 | -void op_mulshiu (void) | ||
| 154 | -{ | ||
| 155 | - CALL_FROM_TB0(do_mulshiu); | ||
| 156 | - FORCE_RET(); | ||
| 157 | -} | ||
| 158 | - | ||
| 159 | -#else /* TARGET_LONG_BITS > HOST_LONG_BITS */ | ||
| 160 | - | ||
| 161 | -static always_inline uint64_t get_HILO (void) | ||
| 162 | -{ | ||
| 163 | - return ((uint64_t)env->HI[env->current_tc][0] << 32) | | ||
| 164 | - ((uint64_t)(uint32_t)env->LO[env->current_tc][0]); | ||
| 165 | -} | ||
| 166 | - | ||
| 167 | -static always_inline void set_HILO (uint64_t HILO) | ||
| 168 | -{ | ||
| 169 | - env->LO[env->current_tc][0] = (int32_t)(HILO & 0xFFFFFFFF); | ||
| 170 | - env->HI[env->current_tc][0] = (int32_t)(HILO >> 32); | ||
| 171 | -} | ||
| 172 | - | ||
| 173 | -static always_inline void set_HIT0_LO (uint64_t HILO) | ||
| 174 | -{ | ||
| 175 | - env->LO[env->current_tc][0] = (int32_t)(HILO & 0xFFFFFFFF); | ||
| 176 | - T0 = env->HI[env->current_tc][0] = (int32_t)(HILO >> 32); | ||
| 177 | -} | ||
| 178 | - | ||
| 179 | -static always_inline void set_HI_LOT0 (uint64_t HILO) | ||
| 180 | -{ | ||
| 181 | - T0 = env->LO[env->current_tc][0] = (int32_t)(HILO & 0xFFFFFFFF); | ||
| 182 | - env->HI[env->current_tc][0] = (int32_t)(HILO >> 32); | ||
| 183 | -} | ||
| 184 | - | ||
| 185 | -/* Multiplication variants of the vr54xx. */ | ||
| 186 | -void op_muls (void) | ||
| 187 | -{ | ||
| 188 | - set_HI_LOT0(0 - ((int64_t)(int32_t)T0 * (int64_t)(int32_t)T1)); | ||
| 189 | - FORCE_RET(); | ||
| 190 | -} | ||
| 191 | - | ||
| 192 | -void op_mulsu (void) | ||
| 193 | -{ | ||
| 194 | - set_HI_LOT0(0 - ((uint64_t)(uint32_t)T0 * (uint64_t)(uint32_t)T1)); | ||
| 195 | - FORCE_RET(); | ||
| 196 | -} | ||
| 197 | - | ||
| 198 | -void op_macc (void) | ||
| 199 | -{ | ||
| 200 | - set_HI_LOT0(get_HILO() + ((int64_t)(int32_t)T0 * (int64_t)(int32_t)T1)); | ||
| 201 | - FORCE_RET(); | ||
| 202 | -} | ||
| 203 | - | ||
| 204 | -void op_macchi (void) | ||
| 205 | -{ | ||
| 206 | - set_HIT0_LO(get_HILO() + ((int64_t)(int32_t)T0 * (int64_t)(int32_t)T1)); | ||
| 207 | - FORCE_RET(); | ||
| 208 | -} | ||
| 209 | - | ||
| 210 | -void op_maccu (void) | ||
| 211 | -{ | ||
| 212 | - set_HI_LOT0(get_HILO() + ((uint64_t)(uint32_t)T0 * (uint64_t)(uint32_t)T1)); | ||
| 213 | - FORCE_RET(); | ||
| 214 | -} | ||
| 215 | - | ||
| 216 | -void op_macchiu (void) | ||
| 217 | -{ | ||
| 218 | - set_HIT0_LO(get_HILO() + ((uint64_t)(uint32_t)T0 * (uint64_t)(uint32_t)T1)); | ||
| 219 | - FORCE_RET(); | ||
| 220 | -} | ||
| 221 | - | ||
| 222 | -void op_msac (void) | ||
| 223 | -{ | ||
| 224 | - set_HI_LOT0(get_HILO() - ((int64_t)(int32_t)T0 * (int64_t)(int32_t)T1)); | ||
| 225 | - FORCE_RET(); | ||
| 226 | -} | ||
| 227 | - | ||
| 228 | -void op_msachi (void) | ||
| 229 | -{ | ||
| 230 | - set_HIT0_LO(get_HILO() - ((int64_t)(int32_t)T0 * (int64_t)(int32_t)T1)); | ||
| 231 | - FORCE_RET(); | ||
| 232 | -} | ||
| 233 | - | ||
| 234 | -void op_msacu (void) | ||
| 235 | -{ | ||
| 236 | - set_HI_LOT0(get_HILO() - ((uint64_t)(uint32_t)T0 * (uint64_t)(uint32_t)T1)); | ||
| 237 | - FORCE_RET(); | ||
| 238 | -} | ||
| 239 | - | ||
| 240 | -void op_msachiu (void) | ||
| 241 | -{ | ||
| 242 | - set_HIT0_LO(get_HILO() - ((uint64_t)(uint32_t)T0 * (uint64_t)(uint32_t)T1)); | ||
| 243 | - FORCE_RET(); | ||
| 244 | -} | ||
| 245 | - | ||
| 246 | -void op_mulhi (void) | ||
| 247 | -{ | ||
| 248 | - set_HIT0_LO((int64_t)(int32_t)T0 * (int64_t)(int32_t)T1); | ||
| 249 | - FORCE_RET(); | ||
| 250 | -} | ||
| 251 | - | ||
| 252 | -void op_mulhiu (void) | ||
| 253 | -{ | ||
| 254 | - set_HIT0_LO((uint64_t)(uint32_t)T0 * (uint64_t)(uint32_t)T1); | ||
| 255 | - FORCE_RET(); | ||
| 256 | -} | ||
| 257 | - | ||
| 258 | -void op_mulshi (void) | ||
| 259 | -{ | ||
| 260 | - set_HIT0_LO(0 - ((int64_t)(int32_t)T0 * (int64_t)(int32_t)T1)); | ||
| 261 | - FORCE_RET(); | ||
| 262 | -} | ||
| 263 | - | ||
| 264 | -void op_mulshiu (void) | ||
| 265 | -{ | ||
| 266 | - set_HIT0_LO(0 - ((uint64_t)(uint32_t)T0 * (uint64_t)(uint32_t)T1)); | ||
| 267 | - FORCE_RET(); | ||
| 268 | -} | ||
| 269 | - | ||
| 270 | -#endif /* TARGET_LONG_BITS > HOST_LONG_BITS */ |
target-mips/op_helper.c
| @@ -168,10 +168,9 @@ void do_dclz (void) | @@ -168,10 +168,9 @@ void do_dclz (void) | ||
| 168 | #endif /* TARGET_MIPS64 */ | 168 | #endif /* TARGET_MIPS64 */ |
| 169 | 169 | ||
| 170 | /* 64 bits arithmetic for 32 bits hosts */ | 170 | /* 64 bits arithmetic for 32 bits hosts */ |
| 171 | -#if TARGET_LONG_BITS > HOST_LONG_BITS | ||
| 172 | static always_inline uint64_t get_HILO (void) | 171 | static always_inline uint64_t get_HILO (void) |
| 173 | { | 172 | { |
| 174 | - return (env->HI[env->current_tc][0] << 32) | (uint32_t)env->LO[env->current_tc][0]; | 173 | + return ((uint64_t)(env->HI[env->current_tc][0]) << 32) | (uint32_t)env->LO[env->current_tc][0]; |
| 175 | } | 174 | } |
| 176 | 175 | ||
| 177 | static always_inline void set_HILO (uint64_t HILO) | 176 | static always_inline void set_HILO (uint64_t HILO) |
| @@ -192,6 +191,7 @@ static always_inline void set_HI_LOT0 (uint64_t HILO) | @@ -192,6 +191,7 @@ static always_inline void set_HI_LOT0 (uint64_t HILO) | ||
| 192 | env->HI[env->current_tc][0] = (int32_t)(HILO >> 32); | 191 | env->HI[env->current_tc][0] = (int32_t)(HILO >> 32); |
| 193 | } | 192 | } |
| 194 | 193 | ||
| 194 | +#if TARGET_LONG_BITS > HOST_LONG_BITS | ||
| 195 | void do_madd (void) | 195 | void do_madd (void) |
| 196 | { | 196 | { |
| 197 | int64_t tmp; | 197 | int64_t tmp; |
| @@ -223,6 +223,7 @@ void do_msubu (void) | @@ -223,6 +223,7 @@ void do_msubu (void) | ||
| 223 | tmp = ((uint64_t)(uint32_t)T0 * (uint64_t)(uint32_t)T1); | 223 | tmp = ((uint64_t)(uint32_t)T0 * (uint64_t)(uint32_t)T1); |
| 224 | set_HILO(get_HILO() - tmp); | 224 | set_HILO(get_HILO() - tmp); |
| 225 | } | 225 | } |
| 226 | +#endif /* TARGET_LONG_BITS > HOST_LONG_BITS */ | ||
| 226 | 227 | ||
| 227 | /* Multiplication variants of the vr54xx. */ | 228 | /* Multiplication variants of the vr54xx. */ |
| 228 | void do_muls (void) | 229 | void do_muls (void) |
| @@ -294,7 +295,6 @@ void do_mulshiu (void) | @@ -294,7 +295,6 @@ void do_mulshiu (void) | ||
| 294 | { | 295 | { |
| 295 | set_HIT0_LO(0 - ((uint64_t)(uint32_t)T0 * (uint64_t)(uint32_t)T1)); | 296 | set_HIT0_LO(0 - ((uint64_t)(uint32_t)T0 * (uint64_t)(uint32_t)T1)); |
| 296 | } | 297 | } |
| 297 | -#endif /* TARGET_LONG_BITS > HOST_LONG_BITS */ | ||
| 298 | 298 | ||
| 299 | #ifdef TARGET_MIPS64 | 299 | #ifdef TARGET_MIPS64 |
| 300 | void do_dmult (void) | 300 | void do_dmult (void) |
target-mips/translate.c
| @@ -2204,59 +2204,59 @@ static void gen_mul_vr54xx (DisasContext *ctx, uint32_t opc, | @@ -2204,59 +2204,59 @@ static void gen_mul_vr54xx (DisasContext *ctx, uint32_t opc, | ||
| 2204 | 2204 | ||
| 2205 | switch (opc) { | 2205 | switch (opc) { |
| 2206 | case OPC_VR54XX_MULS: | 2206 | case OPC_VR54XX_MULS: |
| 2207 | - gen_op_muls(); | 2207 | + tcg_gen_helper_0_0(do_muls); |
| 2208 | opn = "muls"; | 2208 | opn = "muls"; |
| 2209 | break; | 2209 | break; |
| 2210 | case OPC_VR54XX_MULSU: | 2210 | case OPC_VR54XX_MULSU: |
| 2211 | - gen_op_mulsu(); | 2211 | + tcg_gen_helper_0_0(do_mulsu); |
| 2212 | opn = "mulsu"; | 2212 | opn = "mulsu"; |
| 2213 | break; | 2213 | break; |
| 2214 | case OPC_VR54XX_MACC: | 2214 | case OPC_VR54XX_MACC: |
| 2215 | - gen_op_macc(); | 2215 | + tcg_gen_helper_0_0(do_macc); |
| 2216 | opn = "macc"; | 2216 | opn = "macc"; |
| 2217 | break; | 2217 | break; |
| 2218 | case OPC_VR54XX_MACCU: | 2218 | case OPC_VR54XX_MACCU: |
| 2219 | - gen_op_maccu(); | 2219 | + tcg_gen_helper_0_0(do_maccu); |
| 2220 | opn = "maccu"; | 2220 | opn = "maccu"; |
| 2221 | break; | 2221 | break; |
| 2222 | case OPC_VR54XX_MSAC: | 2222 | case OPC_VR54XX_MSAC: |
| 2223 | - gen_op_msac(); | 2223 | + tcg_gen_helper_0_0(do_msac); |
| 2224 | opn = "msac"; | 2224 | opn = "msac"; |
| 2225 | break; | 2225 | break; |
| 2226 | case OPC_VR54XX_MSACU: | 2226 | case OPC_VR54XX_MSACU: |
| 2227 | - gen_op_msacu(); | 2227 | + tcg_gen_helper_0_0(do_msacu); |
| 2228 | opn = "msacu"; | 2228 | opn = "msacu"; |
| 2229 | break; | 2229 | break; |
| 2230 | case OPC_VR54XX_MULHI: | 2230 | case OPC_VR54XX_MULHI: |
| 2231 | - gen_op_mulhi(); | 2231 | + tcg_gen_helper_0_0(do_mulhi); |
| 2232 | opn = "mulhi"; | 2232 | opn = "mulhi"; |
| 2233 | break; | 2233 | break; |
| 2234 | case OPC_VR54XX_MULHIU: | 2234 | case OPC_VR54XX_MULHIU: |
| 2235 | - gen_op_mulhiu(); | 2235 | + tcg_gen_helper_0_0(do_mulhiu); |
| 2236 | opn = "mulhiu"; | 2236 | opn = "mulhiu"; |
| 2237 | break; | 2237 | break; |
| 2238 | case OPC_VR54XX_MULSHI: | 2238 | case OPC_VR54XX_MULSHI: |
| 2239 | - gen_op_mulshi(); | 2239 | + tcg_gen_helper_0_0(do_mulshi); |
| 2240 | opn = "mulshi"; | 2240 | opn = "mulshi"; |
| 2241 | break; | 2241 | break; |
| 2242 | case OPC_VR54XX_MULSHIU: | 2242 | case OPC_VR54XX_MULSHIU: |
| 2243 | - gen_op_mulshiu(); | 2243 | + tcg_gen_helper_0_0(do_mulshiu); |
| 2244 | opn = "mulshiu"; | 2244 | opn = "mulshiu"; |
| 2245 | break; | 2245 | break; |
| 2246 | case OPC_VR54XX_MACCHI: | 2246 | case OPC_VR54XX_MACCHI: |
| 2247 | - gen_op_macchi(); | 2247 | + tcg_gen_helper_0_0(do_macchi); |
| 2248 | opn = "macchi"; | 2248 | opn = "macchi"; |
| 2249 | break; | 2249 | break; |
| 2250 | case OPC_VR54XX_MACCHIU: | 2250 | case OPC_VR54XX_MACCHIU: |
| 2251 | - gen_op_macchiu(); | 2251 | + tcg_gen_helper_0_0(do_macchiu); |
| 2252 | opn = "macchiu"; | 2252 | opn = "macchiu"; |
| 2253 | break; | 2253 | break; |
| 2254 | case OPC_VR54XX_MSACHI: | 2254 | case OPC_VR54XX_MSACHI: |
| 2255 | - gen_op_msachi(); | 2255 | + tcg_gen_helper_0_0(do_msachi); |
| 2256 | opn = "msachi"; | 2256 | opn = "msachi"; |
| 2257 | break; | 2257 | break; |
| 2258 | case OPC_VR54XX_MSACHIU: | 2258 | case OPC_VR54XX_MSACHIU: |
| 2259 | - gen_op_msachiu(); | 2259 | + tcg_gen_helper_0_0(do_msachiu); |
| 2260 | opn = "msachiu"; | 2260 | opn = "msachiu"; |
| 2261 | break; | 2261 | break; |
| 2262 | default: | 2262 | default: |