Revision e14fe0a9 target-alpha/op_helper.c
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) |
Also available in: Unified diff