Revision e14fe0a9
b/target-alpha/op.c | ||
---|---|---|
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 | 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 |
|
b/target-alpha/op_helper.c | ||
---|---|---|
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) |
b/target-alpha/op_helper.h | ||
---|---|---|
34 | 34 |
void helper_sublv (void); |
35 | 35 |
void helper_mullv (void); |
36 | 36 |
void helper_mulqv (void); |
37 |
void helper_umulh (void); |
|
38 | 37 |
void helper_ctpop (void); |
39 | 38 |
void helper_ctlz (void); |
40 | 39 |
void helper_cttz (void); |
Also available in: Unified diff