Revision 8422b113 target-i386/op.c
b/target-i386/op.c | ||
---|---|---|
1952 | 1952 |
|
1953 | 1953 |
/* FPU operations */ |
1954 | 1954 |
|
1955 |
/* XXX: handle nans */ |
|
1956 | 1955 |
void OPPROTO op_fcom_ST0_FT0(void) |
1957 | 1956 |
{ |
1958 |
env->fpus &= (~0x4500); /* (C3,C2,C0) <-- 000 */ |
|
1959 |
if (ST0 < FT0) |
|
1960 |
env->fpus |= 0x100; /* (C3,C2,C0) <-- 001 */ |
|
1961 |
else if (ST0 == FT0) |
|
1962 |
env->fpus |= 0x4000; /* (C3,C2,C0) <-- 100 */ |
|
1957 |
int cc; |
|
1958 |
switch(floatx_compare(ST0, FT0, &env->fp_status)) { |
|
1959 |
case -1: |
|
1960 |
cc = 0x0100; |
|
1961 |
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; |
|
1963 | 1974 |
FORCE_RET(); |
1964 | 1975 |
} |
1965 | 1976 |
|
1966 |
/* XXX: handle nans */ |
|
1967 | 1977 |
void OPPROTO op_fucom_ST0_FT0(void) |
1968 | 1978 |
{ |
1969 |
env->fpus &= (~0x4500); /* (C3,C2,C0) <-- 000 */ |
|
1970 |
if (ST0 < FT0) |
|
1971 |
env->fpus |= 0x100; /* (C3,C2,C0) <-- 001 */ |
|
1972 |
else if (ST0 == FT0) |
|
1973 |
env->fpus |= 0x4000; /* (C3,C2,C0) <-- 100 */ |
|
1979 |
int cc; |
|
1980 |
switch(floatx_compare_quiet(ST0, FT0, &env->fp_status)) { |
|
1981 |
case -1: |
|
1982 |
cc = 0x0100; |
|
1983 |
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; |
|
1974 | 1996 |
FORCE_RET(); |
1975 | 1997 |
} |
1976 | 1998 |
|
1977 |
/* XXX: handle nans */ |
|
1978 | 1999 |
void OPPROTO op_fcomi_ST0_FT0(void) |
1979 | 2000 |
{ |
1980 |
int eflags; |
|
2001 |
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 |
} |
|
1981 | 2017 |
eflags = cc_table[CC_OP].compute_all(); |
1982 |
eflags &= ~(CC_Z | CC_P | CC_C); |
|
1983 |
if (ST0 < FT0) |
|
1984 |
eflags |= CC_C; |
|
1985 |
else if (ST0 == FT0) |
|
1986 |
eflags |= CC_Z; |
|
2018 |
eflags = (eflags & ~(CC_Z | CC_P | CC_C)) | cc; |
|
1987 | 2019 |
CC_SRC = eflags; |
1988 | 2020 |
FORCE_RET(); |
1989 | 2021 |
} |
1990 | 2022 |
|
1991 |
/* XXX: handle nans */ |
|
1992 | 2023 |
void OPPROTO op_fucomi_ST0_FT0(void) |
1993 | 2024 |
{ |
1994 |
int eflags; |
|
2025 |
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 |
} |
|
1995 | 2041 |
eflags = cc_table[CC_OP].compute_all(); |
1996 |
eflags &= ~(CC_Z | CC_P | CC_C); |
|
1997 |
if (ST0 < FT0) |
|
1998 |
eflags |= CC_C; |
|
1999 |
else if (ST0 == FT0) |
|
2000 |
eflags |= CC_Z; |
|
2042 |
eflags = (eflags & ~(CC_Z | CC_P | CC_C)) | cc; |
|
2001 | 2043 |
CC_SRC = eflags; |
2002 | 2044 |
FORCE_RET(); |
2003 | 2045 |
} |
Also available in: Unified diff