More changes to FPU nearest rounding, Unreal works again.
This commit is contained in:
parent
3e314ccdfb
commit
33685c3318
3 changed files with 40 additions and 13 deletions
|
|
@ -3737,10 +3737,19 @@ static void FP_LOAD_REG_D(int reg, int *host_reg1, int *host_reg2)
|
||||||
}
|
}
|
||||||
static int64_t x87_fround(double b)
|
static int64_t x87_fround(double b)
|
||||||
{
|
{
|
||||||
|
int64_t a, c;
|
||||||
|
|
||||||
switch ((npxc>>10)&3)
|
switch ((npxc>>10)&3)
|
||||||
{
|
{
|
||||||
case 0: /*Nearest*/
|
case 0: /*Nearest*/
|
||||||
return (int64_t)(b+0.5);
|
a = (int64_t)floor(b);
|
||||||
|
c = (int64_t)floor(b + 1.0);
|
||||||
|
if ((b - a) < (b - c))
|
||||||
|
return a;
|
||||||
|
else if ((b - a) > (b - c))
|
||||||
|
return b;
|
||||||
|
else
|
||||||
|
return (a & 1) ? c : a;
|
||||||
case 1: /*Down*/
|
case 1: /*Down*/
|
||||||
return (int64_t)floor(b);
|
return (int64_t)floor(b);
|
||||||
case 2: /*Up*/
|
case 2: /*Up*/
|
||||||
|
|
|
||||||
|
|
@ -2254,13 +2254,19 @@ static void FP_RESTORE_ROUNDING()
|
||||||
|
|
||||||
static int32_t x87_fround32(double b)
|
static int32_t x87_fround32(double b)
|
||||||
{
|
{
|
||||||
|
int64_t a, c;
|
||||||
|
|
||||||
switch ((npxc>>10)&3)
|
switch ((npxc>>10)&3)
|
||||||
{
|
{
|
||||||
case 0: /*Nearest*/
|
case 0: /*Nearest*/
|
||||||
if (b < 0.0)
|
a = (int64_t)floor(b);
|
||||||
return (int32_t)(b-0.5);
|
c = (int64_t)floor(b + 1.0);
|
||||||
else
|
if ((b - a) < (b - c))
|
||||||
return (int32_t)(b+0.5);
|
return a;
|
||||||
|
else if ((b - a) > (b - c))
|
||||||
|
return b;
|
||||||
|
else
|
||||||
|
return (a & 1) ? c : a;
|
||||||
case 1: /*Down*/
|
case 1: /*Down*/
|
||||||
return (int32_t)floor(b);
|
return (int32_t)floor(b);
|
||||||
case 2: /*Up*/
|
case 2: /*Up*/
|
||||||
|
|
@ -2271,13 +2277,19 @@ static int32_t x87_fround32(double b)
|
||||||
}
|
}
|
||||||
static int64_t x87_fround64(double b)
|
static int64_t x87_fround64(double b)
|
||||||
{
|
{
|
||||||
|
int64_t a, c;
|
||||||
|
|
||||||
switch ((npxc>>10)&3)
|
switch ((npxc>>10)&3)
|
||||||
{
|
{
|
||||||
case 0: /*Nearest*/
|
case 0: /*Nearest*/
|
||||||
if (b < 0.0)
|
a = (int64_t)floor(b);
|
||||||
return (int64_t)(b-0.5);
|
c = (int64_t)floor(b + 1.0);
|
||||||
else
|
if ((b - a) < (b - c))
|
||||||
return (int64_t)(b+0.5);
|
return a;
|
||||||
|
else if ((b - a) > (b - c))
|
||||||
|
return b;
|
||||||
|
else
|
||||||
|
return (a & 1) ? c : a;
|
||||||
case 1: /*Down*/
|
case 1: /*Down*/
|
||||||
return (int64_t)floor(b);
|
return (int64_t)floor(b);
|
||||||
case 2: /*Up*/
|
case 2: /*Up*/
|
||||||
|
|
|
||||||
|
|
@ -66,13 +66,19 @@ static inline double x87_pop()
|
||||||
|
|
||||||
static inline int64_t x87_fround(double b)
|
static inline int64_t x87_fround(double b)
|
||||||
{
|
{
|
||||||
|
int64_t a, c;
|
||||||
|
|
||||||
switch ((npxc>>10)&3)
|
switch ((npxc>>10)&3)
|
||||||
{
|
{
|
||||||
case 0: /*Nearest*/
|
case 0: /*Nearest*/
|
||||||
if (b < 0.0)
|
a = (int64_t)floor(b);
|
||||||
return (int64_t)(b-0.5);
|
c = (int64_t)floor(b + 1.0);
|
||||||
else
|
if ((b - a) < (b - c))
|
||||||
return (int64_t)(b+0.5);
|
return a;
|
||||||
|
else if ((b - a) > (b - c))
|
||||||
|
return b;
|
||||||
|
else
|
||||||
|
return (a & 1) ? c : a;
|
||||||
case 1: /*Down*/
|
case 1: /*Down*/
|
||||||
return (int64_t)floor(b);
|
return (int64_t)floor(b);
|
||||||
case 2: /*Up*/
|
case 2: /*Up*/
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue