Commit 9d901a201bc37bbb40ca8fa325866cba047ec701
1 parent
cd346349
Use host-utils for PowerPC 64 64x64 bits multiplications.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3442 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
3 changed files
with
3 additions
and
78 deletions
target-ppc/op.c
| @@ -980,7 +980,7 @@ void OPPROTO op_mulhd (void) | @@ -980,7 +980,7 @@ void OPPROTO op_mulhd (void) | ||
| 980 | { | 980 | { |
| 981 | uint64_t tl, th; | 981 | uint64_t tl, th; |
| 982 | 982 | ||
| 983 | - do_imul64(&tl, &th); | 983 | + muls64(&tl, &th, T0, T1); |
| 984 | T0 = th; | 984 | T0 = th; |
| 985 | RETURN(); | 985 | RETURN(); |
| 986 | } | 986 | } |
| @@ -998,7 +998,7 @@ void OPPROTO op_mulhdu (void) | @@ -998,7 +998,7 @@ void OPPROTO op_mulhdu (void) | ||
| 998 | { | 998 | { |
| 999 | uint64_t tl, th; | 999 | uint64_t tl, th; |
| 1000 | 1000 | ||
| 1001 | - do_mul64(&tl, &th); | 1001 | + mulu64(&tl, &th, T0, T1); |
| 1002 | T0 = th; | 1002 | T0 = th; |
| 1003 | RETURN(); | 1003 | RETURN(); |
| 1004 | } | 1004 | } |
target-ppc/op_helper.c
| @@ -199,79 +199,6 @@ void ppc_store_dump_spr (int sprn, target_ulong val) | @@ -199,79 +199,6 @@ void ppc_store_dump_spr (int sprn, target_ulong val) | ||
| 199 | 199 | ||
| 200 | /*****************************************************************************/ | 200 | /*****************************************************************************/ |
| 201 | /* Fixed point operations helpers */ | 201 | /* Fixed point operations helpers */ |
| 202 | -#if defined(TARGET_PPC64) | ||
| 203 | -static void add128 (uint64_t *plow, uint64_t *phigh, uint64_t a, uint64_t b) | ||
| 204 | -{ | ||
| 205 | - *plow += a; | ||
| 206 | - /* carry test */ | ||
| 207 | - if (*plow < a) | ||
| 208 | - (*phigh)++; | ||
| 209 | - *phigh += b; | ||
| 210 | -} | ||
| 211 | - | ||
| 212 | -static void neg128 (uint64_t *plow, uint64_t *phigh) | ||
| 213 | -{ | ||
| 214 | - *plow = ~*plow; | ||
| 215 | - *phigh = ~*phigh; | ||
| 216 | - add128(plow, phigh, 1, 0); | ||
| 217 | -} | ||
| 218 | - | ||
| 219 | -static void mul64 (uint64_t *plow, uint64_t *phigh, uint64_t a, uint64_t b) | ||
| 220 | -{ | ||
| 221 | - uint32_t a0, a1, b0, b1; | ||
| 222 | - uint64_t v; | ||
| 223 | - | ||
| 224 | - a0 = a; | ||
| 225 | - a1 = a >> 32; | ||
| 226 | - | ||
| 227 | - b0 = b; | ||
| 228 | - b1 = b >> 32; | ||
| 229 | - | ||
| 230 | - v = (uint64_t)a0 * (uint64_t)b0; | ||
| 231 | - *plow = v; | ||
| 232 | - *phigh = 0; | ||
| 233 | - | ||
| 234 | - v = (uint64_t)a0 * (uint64_t)b1; | ||
| 235 | - add128(plow, phigh, v << 32, v >> 32); | ||
| 236 | - | ||
| 237 | - v = (uint64_t)a1 * (uint64_t)b0; | ||
| 238 | - add128(plow, phigh, v << 32, v >> 32); | ||
| 239 | - | ||
| 240 | - v = (uint64_t)a1 * (uint64_t)b1; | ||
| 241 | - *phigh += v; | ||
| 242 | -#if defined(DEBUG_MULDIV) | ||
| 243 | - printf("mul: 0x%016llx * 0x%016llx = 0x%016llx%016llx\n", | ||
| 244 | - a, b, *phigh, *plow); | ||
| 245 | -#endif | ||
| 246 | -} | ||
| 247 | - | ||
| 248 | -void do_mul64 (uint64_t *plow, uint64_t *phigh) | ||
| 249 | -{ | ||
| 250 | - mul64(plow, phigh, T0, T1); | ||
| 251 | -} | ||
| 252 | - | ||
| 253 | -static void imul64 (uint64_t *plow, uint64_t *phigh, int64_t a, int64_t b) | ||
| 254 | -{ | ||
| 255 | - int sa, sb; | ||
| 256 | - | ||
| 257 | - sa = (a < 0); | ||
| 258 | - if (sa) | ||
| 259 | - a = -a; | ||
| 260 | - sb = (b < 0); | ||
| 261 | - if (sb) | ||
| 262 | - b = -b; | ||
| 263 | - mul64(plow, phigh, a, b); | ||
| 264 | - if (sa ^ sb) { | ||
| 265 | - neg128(plow, phigh); | ||
| 266 | - } | ||
| 267 | -} | ||
| 268 | - | ||
| 269 | -void do_imul64 (uint64_t *plow, uint64_t *phigh) | ||
| 270 | -{ | ||
| 271 | - imul64(plow, phigh, T0, T1); | ||
| 272 | -} | ||
| 273 | -#endif | ||
| 274 | - | ||
| 275 | void do_adde (void) | 202 | void do_adde (void) |
| 276 | { | 203 | { |
| 277 | T2 = T0; | 204 | T2 = T0; |
| @@ -403,7 +330,7 @@ void do_mulldo (void) | @@ -403,7 +330,7 @@ void do_mulldo (void) | ||
| 403 | int64_t th; | 330 | int64_t th; |
| 404 | uint64_t tl; | 331 | uint64_t tl; |
| 405 | 332 | ||
| 406 | - do_imul64(&tl, &th); | 333 | + muls64(&tl, &th, T0, T1); |
| 407 | if (likely(th == 0)) { | 334 | if (likely(th == 0)) { |
| 408 | xer_ov = 0; | 335 | xer_ov = 0; |
| 409 | } else { | 336 | } else { |
target-ppc/op_helper.h
| @@ -79,8 +79,6 @@ void do_sraw (void); | @@ -79,8 +79,6 @@ void do_sraw (void); | ||
| 79 | #if defined(TARGET_PPC64) | 79 | #if defined(TARGET_PPC64) |
| 80 | void do_adde_64 (void); | 80 | void do_adde_64 (void); |
| 81 | void do_addmeo_64 (void); | 81 | void do_addmeo_64 (void); |
| 82 | -void do_imul64 (uint64_t *tl, uint64_t *th); | ||
| 83 | -void do_mul64 (uint64_t *tl, uint64_t *th); | ||
| 84 | void do_divdo (void); | 82 | void do_divdo (void); |
| 85 | void do_divduo (void); | 83 | void do_divduo (void); |
| 86 | void do_mulldo (void); | 84 | void do_mulldo (void); |