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