1952 |
|
|
1953 |
/* FPU operations */ |
/* FPU operations */ |
1954 |
|
|
1955 |
|
const int fcom_ccval[4] = {0x0100, 0x4000, 0x0000, 0x4500}; |
1956 |
|
|
1957 |
void OPPROTO op_fcom_ST0_FT0(void) |
void OPPROTO op_fcom_ST0_FT0(void) |
1958 |
{ |
{ |
1959 |
int cc; |
int ret; |
1960 |
switch(floatx_compare(ST0, FT0, &env->fp_status)) { |
|
1961 |
case -1: |
ret = floatx_compare(ST0, FT0, &env->fp_status); |
1962 |
cc = 0x0100; |
env->fpus = (env->fpus & ~0x4500) | fcom_ccval[ret + 1]; |
|
break; |
|
|
case 0: |
|
|
cc = 0x4000; |
|
|
break; |
|
|
case 1: |
|
|
cc = 0x0000; |
|
|
break; |
|
|
case 2: |
|
|
default: |
|
|
cc = 0x4500; |
|
|
break; |
|
|
} |
|
|
env->fpus = (env->fpus & ~0x4500) | cc; |
|
1963 |
FORCE_RET(); |
FORCE_RET(); |
1964 |
} |
} |
1965 |
|
|
1966 |
void OPPROTO op_fucom_ST0_FT0(void) |
void OPPROTO op_fucom_ST0_FT0(void) |
1967 |
{ |
{ |
1968 |
int cc; |
int ret; |
1969 |
switch(floatx_compare_quiet(ST0, FT0, &env->fp_status)) { |
|
1970 |
case -1: |
ret = floatx_compare_quiet(ST0, FT0, &env->fp_status); |
1971 |
cc = 0x0100; |
env->fpus = (env->fpus & ~0x4500) | fcom_ccval[ret+ 1]; |
|
break; |
|
|
case 0: |
|
|
cc = 0x4000; |
|
|
break; |
|
|
case 1: |
|
|
cc = 0x0000; |
|
|
break; |
|
|
case 2: |
|
|
default: |
|
|
cc = 0x4500; |
|
|
break; |
|
|
} |
|
|
env->fpus = (env->fpus & ~0x4500) | cc; |
|
1972 |
FORCE_RET(); |
FORCE_RET(); |
1973 |
} |
} |
1974 |
|
|
1975 |
|
const int fcomi_ccval[4] = {CC_C, CC_Z, 0, CC_Z | CC_P | CC_C}; |
1976 |
|
|
1977 |
void OPPROTO op_fcomi_ST0_FT0(void) |
void OPPROTO op_fcomi_ST0_FT0(void) |
1978 |
{ |
{ |
1979 |
int eflags, cc; |
int eflags; |
1980 |
switch(floatx_compare(ST0, FT0, &env->fp_status)) { |
int ret; |
1981 |
case -1: |
|
1982 |
cc = CC_C; |
ret = floatx_compare(ST0, FT0, &env->fp_status); |
|
break; |
|
|
case 0: |
|
|
cc = CC_Z; |
|
|
break; |
|
|
case 1: |
|
|
cc = 0; |
|
|
break; |
|
|
case 2: |
|
|
default: |
|
|
cc = CC_Z | CC_P | CC_C; |
|
|
break; |
|
|
} |
|
1983 |
eflags = cc_table[CC_OP].compute_all(); |
eflags = cc_table[CC_OP].compute_all(); |
1984 |
eflags = (eflags & ~(CC_Z | CC_P | CC_C)) | cc; |
eflags = (eflags & ~(CC_Z | CC_P | CC_C)) | fcomi_ccval[ret + 1]; |
1985 |
CC_SRC = eflags; |
CC_SRC = eflags; |
1986 |
FORCE_RET(); |
FORCE_RET(); |
1987 |
} |
} |
1988 |
|
|
1989 |
void OPPROTO op_fucomi_ST0_FT0(void) |
void OPPROTO op_fucomi_ST0_FT0(void) |
1990 |
{ |
{ |
1991 |
int eflags, cc; |
int eflags; |
1992 |
switch(floatx_compare_quiet(ST0, FT0, &env->fp_status)) { |
int ret; |
1993 |
case -1: |
|
1994 |
cc = CC_C; |
ret = floatx_compare_quiet(ST0, FT0, &env->fp_status); |
|
break; |
|
|
case 0: |
|
|
cc = CC_Z; |
|
|
break; |
|
|
case 1: |
|
|
cc = 0; |
|
|
break; |
|
|
case 2: |
|
|
default: |
|
|
cc = CC_Z | CC_P | CC_C; |
|
|
break; |
|
|
} |
|
1995 |
eflags = cc_table[CC_OP].compute_all(); |
eflags = cc_table[CC_OP].compute_all(); |
1996 |
eflags = (eflags & ~(CC_Z | CC_P | CC_C)) | cc; |
eflags = (eflags & ~(CC_Z | CC_P | CC_C)) | fcomi_ccval[ret + 1]; |
1997 |
CC_SRC = eflags; |
CC_SRC = eflags; |
1998 |
FORCE_RET(); |
FORCE_RET(); |
1999 |
} |
} |