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