Revision 51fe6890

b/op-i386.c
412 412
    EDX = (EDX & 0xffff0000) | r;
413 413
}
414 414

  
415
#ifdef BUGGY_GCC_DIV64
416
/* gcc 2.95.4 on PowerPC does not seem to like using __udivdi3, so we
417
   call it from another function */
418
uint32_t div64(uint32_t *q_ptr, uint64_t num, uint32_t den)
419
{
420
    *q_ptr = num / den;
421
    return num % den;
422
}
423

  
424
int32_t idiv64(int32_t *q_ptr, int64_t num, int32_t den)
425
{
426
    *q_ptr = num / den;
427
    return num % den;
428
}
429
#endif
430

  
415 431
void OPPROTO op_divl_EAX_T0(void)
416 432
{
417 433
    unsigned int den, q, r;
......
421 437
    den = T0;
422 438
    if (den == 0)
423 439
        raise_exception(EXCP00_DIVZ);
440
#ifdef BUGGY_GCC_DIV64
441
    r = div64(&q, num, den);
442
#else
424 443
    q = (num / den);
425 444
    r = (num % den);
445
#endif
426 446
    EAX = q;
427 447
    EDX = r;
428 448
}
......
436 456
    den = T0;
437 457
    if (den == 0)
438 458
        raise_exception(EXCP00_DIVZ);
459
#ifdef BUGGY_GCC_DIV64
460
    r = idiv64(&q, num, den);
461
#else
439 462
    q = (num / den);
440 463
    r = (num % den);
464
#endif
441 465
    EAX = q;
442 466
    EDX = r;
443 467
}
......
1503 1527
extern CPU86_LDouble ceil(CPU86_LDouble x);
1504 1528
extern CPU86_LDouble rint(CPU86_LDouble x);
1505 1529

  
1530
#if defined(__powerpc__)
1531
extern CPU86_LDouble copysign(CPU86_LDouble, CPU86_LDouble);
1532

  
1533
/* correct (but slow) PowerPC rint() (glibc version is incorrect) */
1534
double qemu_rint(double x)
1535
{
1536
    double y = 4503599627370496.0;
1537
    if (fabs(x) >= y)
1538
        return x;
1539
    if (x < 0) 
1540
        y = -y;
1541
    y = (x + y) - y;
1542
    if (y == 0.0)
1543
        y = copysign(y, x);
1544
    return y;
1545
}
1546

  
1547
#define rint qemu_rint
1548
#endif
1549

  
1506 1550
#define RC_MASK         0xc00
1507 1551
#define RC_NEAR		0x000
1508 1552
#define RC_DOWN		0x400

Also available in: Unified diff