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