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