Revision 7a0e1f41 target-i386/op.c

b/target-i386/op.c
1598 1598
   functions comes from the LGPL'ed x86 emulator found in the Willows
1599 1599
   TWIN windows emulator. */
1600 1600

  
1601
#if defined(__powerpc__)
1602
extern CPU86_LDouble copysign(CPU86_LDouble, CPU86_LDouble);
1603

  
1604
/* correct (but slow) PowerPC rint() (glibc version is incorrect) */
1605
double qemu_rint(double x)
1606
{
1607
    double y = 4503599627370496.0;
1608
    if (fabs(x) >= y)
1609
        return x;
1610
    if (x < 0) 
1611
        y = -y;
1612
    y = (x + y) - y;
1613
    if (y == 0.0)
1614
        y = copysign(y, x);
1615
    return y;
1616
}
1617

  
1618
#define rint qemu_rint
1619
#endif
1620

  
1621 1601
/* fp load FT0 */
1622 1602

  
1623 1603
void OPPROTO op_flds_FT0_A0(void)
......
1866 1846
    int val;
1867 1847

  
1868 1848
    d = ST0;
1869
    val = lrint(d);
1849
    val = floatx_to_int32(d, &env->fp_status);
1870 1850
    if (val != (int16_t)val)
1871 1851
        val = -32768;
1872 1852
    stw(A0, val);
......
1883 1863
    int val;
1884 1864

  
1885 1865
    d = ST0;
1886
    val = lrint(d);
1866
    val = floatx_to_int32(d, &env->fp_status);
1887 1867
    stl(A0, val);
1888 1868
    FORCE_RET();
1889 1869
}
......
1898 1878
    int64_t val;
1899 1879

  
1900 1880
    d = ST0;
1901
    val = llrint(d);
1881
    val = floatx_to_int64(d, &env->fp_status);
1902 1882
    stq(A0, val);
1903 1883
    FORCE_RET();
1904 1884
}
......
2101 2081
/* misc FPU operations */
2102 2082
void OPPROTO op_fchs_ST0(void)
2103 2083
{
2104
    ST0 = -ST0;
2084
    ST0 = floatx_chs(ST0);
2105 2085
}
2106 2086

  
2107 2087
void OPPROTO op_fabs_ST0(void)
2108 2088
{
2109
    ST0 = fabs(ST0);
2089
    ST0 = floatx_abs(ST0);
2110 2090
}
2111 2091

  
2112 2092
void OPPROTO op_fxam_ST0(void)
......
2251 2231

  
2252 2232
void OPPROTO op_fldcw_A0(void)
2253 2233
{
2254
    int rnd_type;
2255 2234
    env->fpuc = lduw(A0);
2256
    /* set rounding mode */
2257
    switch(env->fpuc & RC_MASK) {
2258
    default:
2259
    case RC_NEAR:
2260
        rnd_type = FE_TONEAREST;
2261
        break;
2262
    case RC_DOWN:
2263
        rnd_type = FE_DOWNWARD;
2264
        break;
2265
    case RC_UP:
2266
        rnd_type = FE_UPWARD;
2267
        break;
2268
    case RC_CHOP:
2269
        rnd_type = FE_TOWARDZERO;
2270
        break;
2271
    }
2272
    fesetround(rnd_type);
2235
    update_fp_status();
2273 2236
}
2274 2237

  
2275 2238
void OPPROTO op_fclex(void)

Also available in: Unified diff