1952 |
|
|
1953 |
/* FPU operations */ |
/* FPU operations */ |
1954 |
|
|
|
/* XXX: handle nans */ |
|
1955 |
void OPPROTO op_fcom_ST0_FT0(void) |
void OPPROTO op_fcom_ST0_FT0(void) |
1956 |
{ |
{ |
1957 |
env->fpus &= (~0x4500); /* (C3,C2,C0) <-- 000 */ |
int cc; |
1958 |
if (ST0 < FT0) |
switch(floatx_compare(ST0, FT0, &env->fp_status)) { |
1959 |
env->fpus |= 0x100; /* (C3,C2,C0) <-- 001 */ |
case -1: |
1960 |
else if (ST0 == FT0) |
cc = 0x0100; |
1961 |
env->fpus |= 0x4000; /* (C3,C2,C0) <-- 100 */ |
break; |
1962 |
|
case 0: |
1963 |
|
cc = 0x4000; |
1964 |
|
break; |
1965 |
|
case 1: |
1966 |
|
cc = 0x0000; |
1967 |
|
break; |
1968 |
|
case 2: |
1969 |
|
default: |
1970 |
|
cc = 0x4500; |
1971 |
|
break; |
1972 |
|
} |
1973 |
|
env->fpus = (env->fpus & ~0x4500) | cc; |
1974 |
FORCE_RET(); |
FORCE_RET(); |
1975 |
} |
} |
1976 |
|
|
|
/* XXX: handle nans */ |
|
1977 |
void OPPROTO op_fucom_ST0_FT0(void) |
void OPPROTO op_fucom_ST0_FT0(void) |
1978 |
{ |
{ |
1979 |
env->fpus &= (~0x4500); /* (C3,C2,C0) <-- 000 */ |
int cc; |
1980 |
if (ST0 < FT0) |
switch(floatx_compare_quiet(ST0, FT0, &env->fp_status)) { |
1981 |
env->fpus |= 0x100; /* (C3,C2,C0) <-- 001 */ |
case -1: |
1982 |
else if (ST0 == FT0) |
cc = 0x0100; |
1983 |
env->fpus |= 0x4000; /* (C3,C2,C0) <-- 100 */ |
break; |
1984 |
|
case 0: |
1985 |
|
cc = 0x4000; |
1986 |
|
break; |
1987 |
|
case 1: |
1988 |
|
cc = 0x0000; |
1989 |
|
break; |
1990 |
|
case 2: |
1991 |
|
default: |
1992 |
|
cc = 0x4500; |
1993 |
|
break; |
1994 |
|
} |
1995 |
|
env->fpus = (env->fpus & ~0x4500) | cc; |
1996 |
FORCE_RET(); |
FORCE_RET(); |
1997 |
} |
} |
1998 |
|
|
|
/* XXX: handle nans */ |
|
1999 |
void OPPROTO op_fcomi_ST0_FT0(void) |
void OPPROTO op_fcomi_ST0_FT0(void) |
2000 |
{ |
{ |
2001 |
int eflags; |
int eflags, cc; |
2002 |
|
switch(floatx_compare(ST0, FT0, &env->fp_status)) { |
2003 |
|
case -1: |
2004 |
|
cc = CC_C; |
2005 |
|
break; |
2006 |
|
case 0: |
2007 |
|
cc = CC_Z; |
2008 |
|
break; |
2009 |
|
case 1: |
2010 |
|
cc = 0; |
2011 |
|
break; |
2012 |
|
case 2: |
2013 |
|
default: |
2014 |
|
cc = CC_Z | CC_P | CC_C; |
2015 |
|
break; |
2016 |
|
} |
2017 |
eflags = cc_table[CC_OP].compute_all(); |
eflags = cc_table[CC_OP].compute_all(); |
2018 |
eflags &= ~(CC_Z | CC_P | CC_C); |
eflags = (eflags & ~(CC_Z | CC_P | CC_C)) | cc; |
|
if (ST0 < FT0) |
|
|
eflags |= CC_C; |
|
|
else if (ST0 == FT0) |
|
|
eflags |= CC_Z; |
|
2019 |
CC_SRC = eflags; |
CC_SRC = eflags; |
2020 |
FORCE_RET(); |
FORCE_RET(); |
2021 |
} |
} |
2022 |
|
|
|
/* XXX: handle nans */ |
|
2023 |
void OPPROTO op_fucomi_ST0_FT0(void) |
void OPPROTO op_fucomi_ST0_FT0(void) |
2024 |
{ |
{ |
2025 |
int eflags; |
int eflags, cc; |
2026 |
|
switch(floatx_compare_quiet(ST0, FT0, &env->fp_status)) { |
2027 |
|
case -1: |
2028 |
|
cc = CC_C; |
2029 |
|
break; |
2030 |
|
case 0: |
2031 |
|
cc = CC_Z; |
2032 |
|
break; |
2033 |
|
case 1: |
2034 |
|
cc = 0; |
2035 |
|
break; |
2036 |
|
case 2: |
2037 |
|
default: |
2038 |
|
cc = CC_Z | CC_P | CC_C; |
2039 |
|
break; |
2040 |
|
} |
2041 |
eflags = cc_table[CC_OP].compute_all(); |
eflags = cc_table[CC_OP].compute_all(); |
2042 |
eflags &= ~(CC_Z | CC_P | CC_C); |
eflags = (eflags & ~(CC_Z | CC_P | CC_C)) | cc; |
|
if (ST0 < FT0) |
|
|
eflags |= CC_C; |
|
|
else if (ST0 == FT0) |
|
|
eflags |= CC_Z; |
|
2043 |
CC_SRC = eflags; |
CC_SRC = eflags; |
2044 |
FORCE_RET(); |
FORCE_RET(); |
2045 |
} |
} |