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 | 15 | DEF_HELPER(void, do_dmultu, (void)) |
| 16 | 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 | 33 | /* CP0 helpers */ |
| 19 | 34 | #ifndef CONFIG_USER_ONLY |
| 20 | 35 | DEF_HELPER(void, do_mfc0_mvpcontrol, (void)) | ... | ... |
target-mips/op.c
| ... | ... | @@ -45,226 +45,3 @@ |
| 45 | 45 | #include "op_mem.c" |
| 46 | 46 | #undef MEMSUFFIX |
| 47 | 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 | 168 | #endif /* TARGET_MIPS64 */ |
| 169 | 169 | |
| 170 | 170 | /* 64 bits arithmetic for 32 bits hosts */ |
| 171 | -#if TARGET_LONG_BITS > HOST_LONG_BITS | |
| 172 | 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 | 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 | 191 | env->HI[env->current_tc][0] = (int32_t)(HILO >> 32); |
| 193 | 192 | } |
| 194 | 193 | |
| 194 | +#if TARGET_LONG_BITS > HOST_LONG_BITS | |
| 195 | 195 | void do_madd (void) |
| 196 | 196 | { |
| 197 | 197 | int64_t tmp; |
| ... | ... | @@ -223,6 +223,7 @@ void do_msubu (void) |
| 223 | 223 | tmp = ((uint64_t)(uint32_t)T0 * (uint64_t)(uint32_t)T1); |
| 224 | 224 | set_HILO(get_HILO() - tmp); |
| 225 | 225 | } |
| 226 | +#endif /* TARGET_LONG_BITS > HOST_LONG_BITS */ | |
| 226 | 227 | |
| 227 | 228 | /* Multiplication variants of the vr54xx. */ |
| 228 | 229 | void do_muls (void) |
| ... | ... | @@ -294,7 +295,6 @@ void do_mulshiu (void) |
| 294 | 295 | { |
| 295 | 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 | 299 | #ifdef TARGET_MIPS64 |
| 300 | 300 | void do_dmult (void) | ... | ... |
target-mips/translate.c
| ... | ... | @@ -2204,59 +2204,59 @@ static void gen_mul_vr54xx (DisasContext *ctx, uint32_t opc, |
| 2204 | 2204 | |
| 2205 | 2205 | switch (opc) { |
| 2206 | 2206 | case OPC_VR54XX_MULS: |
| 2207 | - gen_op_muls(); | |
| 2207 | + tcg_gen_helper_0_0(do_muls); | |
| 2208 | 2208 | opn = "muls"; |
| 2209 | 2209 | break; |
| 2210 | 2210 | case OPC_VR54XX_MULSU: |
| 2211 | - gen_op_mulsu(); | |
| 2211 | + tcg_gen_helper_0_0(do_mulsu); | |
| 2212 | 2212 | opn = "mulsu"; |
| 2213 | 2213 | break; |
| 2214 | 2214 | case OPC_VR54XX_MACC: |
| 2215 | - gen_op_macc(); | |
| 2215 | + tcg_gen_helper_0_0(do_macc); | |
| 2216 | 2216 | opn = "macc"; |
| 2217 | 2217 | break; |
| 2218 | 2218 | case OPC_VR54XX_MACCU: |
| 2219 | - gen_op_maccu(); | |
| 2219 | + tcg_gen_helper_0_0(do_maccu); | |
| 2220 | 2220 | opn = "maccu"; |
| 2221 | 2221 | break; |
| 2222 | 2222 | case OPC_VR54XX_MSAC: |
| 2223 | - gen_op_msac(); | |
| 2223 | + tcg_gen_helper_0_0(do_msac); | |
| 2224 | 2224 | opn = "msac"; |
| 2225 | 2225 | break; |
| 2226 | 2226 | case OPC_VR54XX_MSACU: |
| 2227 | - gen_op_msacu(); | |
| 2227 | + tcg_gen_helper_0_0(do_msacu); | |
| 2228 | 2228 | opn = "msacu"; |
| 2229 | 2229 | break; |
| 2230 | 2230 | case OPC_VR54XX_MULHI: |
| 2231 | - gen_op_mulhi(); | |
| 2231 | + tcg_gen_helper_0_0(do_mulhi); | |
| 2232 | 2232 | opn = "mulhi"; |
| 2233 | 2233 | break; |
| 2234 | 2234 | case OPC_VR54XX_MULHIU: |
| 2235 | - gen_op_mulhiu(); | |
| 2235 | + tcg_gen_helper_0_0(do_mulhiu); | |
| 2236 | 2236 | opn = "mulhiu"; |
| 2237 | 2237 | break; |
| 2238 | 2238 | case OPC_VR54XX_MULSHI: |
| 2239 | - gen_op_mulshi(); | |
| 2239 | + tcg_gen_helper_0_0(do_mulshi); | |
| 2240 | 2240 | opn = "mulshi"; |
| 2241 | 2241 | break; |
| 2242 | 2242 | case OPC_VR54XX_MULSHIU: |
| 2243 | - gen_op_mulshiu(); | |
| 2243 | + tcg_gen_helper_0_0(do_mulshiu); | |
| 2244 | 2244 | opn = "mulshiu"; |
| 2245 | 2245 | break; |
| 2246 | 2246 | case OPC_VR54XX_MACCHI: |
| 2247 | - gen_op_macchi(); | |
| 2247 | + tcg_gen_helper_0_0(do_macchi); | |
| 2248 | 2248 | opn = "macchi"; |
| 2249 | 2249 | break; |
| 2250 | 2250 | case OPC_VR54XX_MACCHIU: |
| 2251 | - gen_op_macchiu(); | |
| 2251 | + tcg_gen_helper_0_0(do_macchiu); | |
| 2252 | 2252 | opn = "macchiu"; |
| 2253 | 2253 | break; |
| 2254 | 2254 | case OPC_VR54XX_MSACHI: |
| 2255 | - gen_op_msachi(); | |
| 2255 | + tcg_gen_helper_0_0(do_msachi); | |
| 2256 | 2256 | opn = "msachi"; |
| 2257 | 2257 | break; |
| 2258 | 2258 | case OPC_VR54XX_MSACHIU: |
| 2259 | - gen_op_msachiu(); | |
| 2259 | + tcg_gen_helper_0_0(do_msachiu); | |
| 2260 | 2260 | opn = "msachiu"; |
| 2261 | 2261 | break; |
| 2262 | 2262 | default: | ... | ... |