Commit e14fe0a921631ab6cf1f404ad6243a716cb84366

Authored by j_mayer
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
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);