Commit e14fe0a921631ab6cf1f404ad6243a716cb84366
1 parent
9d901a20
Use host-utils for Alpha 64x64 bits multiplications.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3443 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
3 changed files
with
11 additions
and
25 deletions
target-alpha/op.c
... | ... | @@ -295,7 +295,7 @@ void OPPROTO op_mullv (void) |
295 | 295 | |
296 | 296 | void OPPROTO op_mulq (void) |
297 | 297 | { |
298 | - T0 *= T1; | |
298 | + T0 = (int64_t)T0 * (int64_t)T1; | |
299 | 299 | RETURN(); |
300 | 300 | } |
301 | 301 | |
... | ... | @@ -307,7 +307,10 @@ void OPPROTO op_mulqv (void) |
307 | 307 | |
308 | 308 | void OPPROTO op_umulh (void) |
309 | 309 | { |
310 | - helper_umulh(); | |
310 | + uint64_t tl, th; | |
311 | + | |
312 | + mulu64(&tl, &th, T0, T1); | |
313 | + T0 = th; | |
311 | 314 | RETURN(); |
312 | 315 | } |
313 | 316 | ... | ... |
target-alpha/op_helper.c
... | ... | @@ -199,30 +199,14 @@ void helper_mullv (void) |
199 | 199 | |
200 | 200 | void helper_mulqv () |
201 | 201 | { |
202 | - uint64_t res, tmp0, tmp1; | |
203 | - | |
204 | - res = (T0 >> 32) * (T1 >> 32); | |
205 | - tmp0 = ((T0 & 0xFFFFFFFF) * (T1 >> 32)) + | |
206 | - ((T0 >> 32) * (T1 & 0xFFFFFFFF)); | |
207 | - tmp1 = (T0 & 0xFFFFFFFF) * (T1 & 0xFFFFFFFF); | |
208 | - tmp0 += tmp1 >> 32; | |
209 | - res += tmp0 >> 32; | |
210 | - T0 *= T1; | |
211 | - if (unlikely(res != 0)) { | |
202 | + uint64_t tl, th; | |
203 | + | |
204 | + muls64(&tl, &th, T0, T1); | |
205 | + /* If th != 0 && th != -1, then we had an overflow */ | |
206 | + if (unlikely((th + 1) > 1)) { | |
212 | 207 | helper_excp(EXCP_ARITH, EXCP_ARITH_OVERFLOW); |
213 | 208 | } |
214 | -} | |
215 | - | |
216 | -void helper_umulh (void) | |
217 | -{ | |
218 | - uint64_t tmp0, tmp1; | |
219 | - | |
220 | - tmp0 = ((T0 & 0xFFFFFFFF) * (T1 >> 32)) + | |
221 | - ((T0 >> 32) * (T1 & 0xFFFFFFFF)); | |
222 | - tmp1 = (T0 & 0xFFFFFFFF) * (T1 & 0xFFFFFFFF); | |
223 | - tmp0 += tmp1 >> 32; | |
224 | - T0 = (T0 >> 32) * (T0 >> 32); | |
225 | - T0 += tmp0 >> 32; | |
209 | + T0 = tl; | |
226 | 210 | } |
227 | 211 | |
228 | 212 | void helper_ctpop (void) | ... | ... |
target-alpha/op_helper.h