Revision 2958620f target-alpha/int_helper.c

b/target-alpha/int_helper.c
255 255
            | ((op1 & 0xff0000) << 16)
256 256
            | ((op1 & 0xff000000) << 24));
257 257
}
258

  
259
uint64_t helper_addqv(CPUAlphaState *env, uint64_t op1, uint64_t op2)
260
{
261
    uint64_t tmp = op1;
262
    op1 += op2;
263
    if (unlikely((tmp ^ op2 ^ (-1ULL)) & (tmp ^ op1) & (1ULL << 63))) {
264
        arith_excp(env, GETPC(), EXC_M_IOV, 0);
265
    }
266
    return op1;
267
}
268

  
269
uint64_t helper_addlv(CPUAlphaState *env, uint64_t op1, uint64_t op2)
270
{
271
    uint64_t tmp = op1;
272
    op1 = (uint32_t)(op1 + op2);
273
    if (unlikely((tmp ^ op2 ^ (-1UL)) & (tmp ^ op1) & (1UL << 31))) {
274
        arith_excp(env, GETPC(), EXC_M_IOV, 0);
275
    }
276
    return op1;
277
}
278

  
279
uint64_t helper_subqv(CPUAlphaState *env, uint64_t op1, uint64_t op2)
280
{
281
    uint64_t res;
282
    res = op1 - op2;
283
    if (unlikely((op1 ^ op2) & (res ^ op1) & (1ULL << 63))) {
284
        arith_excp(env, GETPC(), EXC_M_IOV, 0);
285
    }
286
    return res;
287
}
288

  
289
uint64_t helper_sublv(CPUAlphaState *env, uint64_t op1, uint64_t op2)
290
{
291
    uint32_t res;
292
    res = op1 - op2;
293
    if (unlikely((op1 ^ op2) & (res ^ op1) & (1UL << 31))) {
294
        arith_excp(env, GETPC(), EXC_M_IOV, 0);
295
    }
296
    return res;
297
}
298

  
299
uint64_t helper_mullv(CPUAlphaState *env, uint64_t op1, uint64_t op2)
300
{
301
    int64_t res = (int64_t)op1 * (int64_t)op2;
302

  
303
    if (unlikely((int32_t)res != res)) {
304
        arith_excp(env, GETPC(), EXC_M_IOV, 0);
305
    }
306
    return (int64_t)((int32_t)res);
307
}
308

  
309
uint64_t helper_mulqv(CPUAlphaState *env, uint64_t op1, uint64_t op2)
310
{
311
    uint64_t tl, th;
312

  
313
    muls64(&tl, &th, op1, op2);
314
    /* If th != 0 && th != -1, then we had an overflow */
315
    if (unlikely((th + 1) > 1)) {
316
        arith_excp(env, GETPC(), EXC_M_IOV, 0);
317
    }
318
    return tl;
319
}

Also available in: Unified diff