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 | 980 | { |
981 | 981 | uint64_t tl, th; |
982 | 982 | |
983 | - do_imul64(&tl, &th); | |
983 | + muls64(&tl, &th, T0, T1); | |
984 | 984 | T0 = th; |
985 | 985 | RETURN(); |
986 | 986 | } |
... | ... | @@ -998,7 +998,7 @@ void OPPROTO op_mulhdu (void) |
998 | 998 | { |
999 | 999 | uint64_t tl, th; |
1000 | 1000 | |
1001 | - do_mul64(&tl, &th); | |
1001 | + mulu64(&tl, &th, T0, T1); | |
1002 | 1002 | T0 = th; |
1003 | 1003 | RETURN(); |
1004 | 1004 | } | ... | ... |
target-ppc/op_helper.c
... | ... | @@ -199,79 +199,6 @@ void ppc_store_dump_spr (int sprn, target_ulong val) |
199 | 199 | |
200 | 200 | /*****************************************************************************/ |
201 | 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 | 202 | void do_adde (void) |
276 | 203 | { |
277 | 204 | T2 = T0; |
... | ... | @@ -403,7 +330,7 @@ void do_mulldo (void) |
403 | 330 | int64_t th; |
404 | 331 | uint64_t tl; |
405 | 332 | |
406 | - do_imul64(&tl, &th); | |
333 | + muls64(&tl, &th, T0, T1); | |
407 | 334 | if (likely(th == 0)) { |
408 | 335 | xer_ov = 0; |
409 | 336 | } else { | ... | ... |
target-ppc/op_helper.h
... | ... | @@ -79,8 +79,6 @@ void do_sraw (void); |
79 | 79 | #if defined(TARGET_PPC64) |
80 | 80 | void do_adde_64 (void); |
81 | 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 | 82 | void do_divdo (void); |
85 | 83 | void do_divduo (void); |
86 | 84 | void do_mulldo (void); | ... | ... |