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,7 +295,7 @@ void OPPROTO op_mullv (void) | ||
| 295 | 295 | ||
| 296 | void OPPROTO op_mulq (void) | 296 | void OPPROTO op_mulq (void) |
| 297 | { | 297 | { |
| 298 | - T0 *= T1; | 298 | + T0 = (int64_t)T0 * (int64_t)T1; |
| 299 | RETURN(); | 299 | RETURN(); |
| 300 | } | 300 | } |
| 301 | 301 | ||
| @@ -307,7 +307,10 @@ void OPPROTO op_mulqv (void) | @@ -307,7 +307,10 @@ void OPPROTO op_mulqv (void) | ||
| 307 | 307 | ||
| 308 | void OPPROTO op_umulh (void) | 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 | RETURN(); | 314 | RETURN(); |
| 312 | } | 315 | } |
| 313 | 316 |
target-alpha/op_helper.c
| @@ -199,30 +199,14 @@ void helper_mullv (void) | @@ -199,30 +199,14 @@ void helper_mullv (void) | ||
| 199 | 199 | ||
| 200 | void helper_mulqv () | 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 | helper_excp(EXCP_ARITH, EXCP_ARITH_OVERFLOW); | 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 | void helper_ctpop (void) | 212 | void helper_ctpop (void) |
target-alpha/op_helper.h
| @@ -34,7 +34,6 @@ void helper_subqv (void); | @@ -34,7 +34,6 @@ void helper_subqv (void); | ||
| 34 | void helper_sublv (void); | 34 | void helper_sublv (void); |
| 35 | void helper_mullv (void); | 35 | void helper_mullv (void); |
| 36 | void helper_mulqv (void); | 36 | void helper_mulqv (void); |
| 37 | -void helper_umulh (void); | ||
| 38 | void helper_ctpop (void); | 37 | void helper_ctpop (void); |
| 39 | void helper_ctlz (void); | 38 | void helper_ctlz (void); |
| 40 | void helper_cttz (void); | 39 | void helper_cttz (void); |