Commit 43fb823b5f89c6d716e2cbce603c6fb1ca6c0b2f
1 parent
e50e6a20
removed switches in op.c (Paul Brook)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1400 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
36 additions
and
136 deletions
target-i386/op.c
| ... | ... | @@ -1952,94 +1952,48 @@ void OPPROTO op_fxchg_ST0_STN(void) |
| 1952 | 1952 | |
| 1953 | 1953 | /* FPU operations */ |
| 1954 | 1954 | |
| 1955 | +const int fcom_ccval[4] = {0x0100, 0x4000, 0x0000, 0x4500}; | |
| 1956 | + | |
| 1955 | 1957 | void OPPROTO op_fcom_ST0_FT0(void) |
| 1956 | 1958 | { |
| 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; | |
| 1959 | + int ret; | |
| 1960 | + | |
| 1961 | + ret = floatx_compare(ST0, FT0, &env->fp_status); | |
| 1962 | + env->fpus = (env->fpus & ~0x4500) | fcom_ccval[ret + 1]; | |
| 1974 | 1963 | FORCE_RET(); |
| 1975 | 1964 | } |
| 1976 | 1965 | |
| 1977 | 1966 | void OPPROTO op_fucom_ST0_FT0(void) |
| 1978 | 1967 | { |
| 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; | |
| 1968 | + int ret; | |
| 1969 | + | |
| 1970 | + ret = floatx_compare_quiet(ST0, FT0, &env->fp_status); | |
| 1971 | + env->fpus = (env->fpus & ~0x4500) | fcom_ccval[ret+ 1]; | |
| 1996 | 1972 | FORCE_RET(); |
| 1997 | 1973 | } |
| 1998 | 1974 | |
| 1975 | +const int fcomi_ccval[4] = {CC_C, CC_Z, 0, CC_Z | CC_P | CC_C}; | |
| 1976 | + | |
| 1999 | 1977 | void OPPROTO op_fcomi_ST0_FT0(void) |
| 2000 | 1978 | { |
| 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 | - } | |
| 1979 | + int eflags; | |
| 1980 | + int ret; | |
| 1981 | + | |
| 1982 | + ret = floatx_compare(ST0, FT0, &env->fp_status); | |
| 2017 | 1983 | eflags = cc_table[CC_OP].compute_all(); |
| 2018 | - eflags = (eflags & ~(CC_Z | CC_P | CC_C)) | cc; | |
| 1984 | + eflags = (eflags & ~(CC_Z | CC_P | CC_C)) | fcomi_ccval[ret + 1]; | |
| 2019 | 1985 | CC_SRC = eflags; |
| 2020 | 1986 | FORCE_RET(); |
| 2021 | 1987 | } |
| 2022 | 1988 | |
| 2023 | 1989 | void OPPROTO op_fucomi_ST0_FT0(void) |
| 2024 | 1990 | { |
| 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 | - } | |
| 1991 | + int eflags; | |
| 1992 | + int ret; | |
| 1993 | + | |
| 1994 | + ret = floatx_compare_quiet(ST0, FT0, &env->fp_status); | |
| 2041 | 1995 | eflags = cc_table[CC_OP].compute_all(); |
| 2042 | - eflags = (eflags & ~(CC_Z | CC_P | CC_C)) | cc; | |
| 1996 | + eflags = (eflags & ~(CC_Z | CC_P | CC_C)) | fcomi_ccval[ret + 1]; | |
| 2043 | 1997 | CC_SRC = eflags; |
| 2044 | 1998 | FORCE_RET(); |
| 2045 | 1999 | } | ... | ... |
target-i386/ops_sse.h
| ... | ... | @@ -1079,9 +1079,11 @@ SSE_OP_CMP(cmpnlt, FPU_CMPNLT) |
| 1079 | 1079 | SSE_OP_CMP(cmpnle, FPU_CMPNLE) |
| 1080 | 1080 | SSE_OP_CMP(cmpord, FPU_CMPORD) |
| 1081 | 1081 | |
| 1082 | +const int comis_eflags[4] = {CC_C, CC_Z, 0, CC_Z | CC_P | CC_C}; | |
| 1083 | + | |
| 1082 | 1084 | void OPPROTO op_ucomiss(void) |
| 1083 | 1085 | { |
| 1084 | - int eflags; | |
| 1086 | + int ret; | |
| 1085 | 1087 | float32 s0, s1; |
| 1086 | 1088 | Reg *d, *s; |
| 1087 | 1089 | d = (Reg *)((char *)env + PARAM1); |
| ... | ... | @@ -1089,28 +1091,14 @@ void OPPROTO op_ucomiss(void) |
| 1089 | 1091 | |
| 1090 | 1092 | s0 = d->XMM_S(0); |
| 1091 | 1093 | s1 = s->XMM_S(0); |
| 1092 | - switch(float32_compare_quiet(s0, s1, &env->sse_status)) { | |
| 1093 | - case -1: | |
| 1094 | - eflags = CC_C; | |
| 1095 | - break; | |
| 1096 | - case 0: | |
| 1097 | - eflags = CC_Z; | |
| 1098 | - break; | |
| 1099 | - case 1: | |
| 1100 | - eflags = 0; | |
| 1101 | - break; | |
| 1102 | - case 2: | |
| 1103 | - default: | |
| 1104 | - eflags = CC_Z | CC_P | CC_C; | |
| 1105 | - break; | |
| 1106 | - } | |
| 1107 | - CC_SRC = eflags; | |
| 1094 | + ret = float32_compare_quiet(s0, s1, &env->sse_status); | |
| 1095 | + CC_SRC = comis_eflags[ret + 1]; | |
| 1108 | 1096 | FORCE_RET(); |
| 1109 | 1097 | } |
| 1110 | 1098 | |
| 1111 | 1099 | void OPPROTO op_comiss(void) |
| 1112 | 1100 | { |
| 1113 | - int eflags; | |
| 1101 | + int ret; | |
| 1114 | 1102 | float32 s0, s1; |
| 1115 | 1103 | Reg *d, *s; |
| 1116 | 1104 | d = (Reg *)((char *)env + PARAM1); |
| ... | ... | @@ -1118,28 +1106,14 @@ void OPPROTO op_comiss(void) |
| 1118 | 1106 | |
| 1119 | 1107 | s0 = d->XMM_S(0); |
| 1120 | 1108 | s1 = s->XMM_S(0); |
| 1121 | - switch(float32_compare(s0, s1, &env->sse_status)) { | |
| 1122 | - case -1: | |
| 1123 | - eflags = CC_C; | |
| 1124 | - break; | |
| 1125 | - case 0: | |
| 1126 | - eflags = CC_Z; | |
| 1127 | - break; | |
| 1128 | - case 1: | |
| 1129 | - eflags = 0; | |
| 1130 | - break; | |
| 1131 | - case 2: | |
| 1132 | - default: | |
| 1133 | - eflags = CC_Z | CC_P | CC_C; | |
| 1134 | - break; | |
| 1135 | - } | |
| 1136 | - CC_SRC = eflags; | |
| 1109 | + ret = float32_compare(s0, s1, &env->sse_status); | |
| 1110 | + CC_SRC = comis_eflags[ret + 1]; | |
| 1137 | 1111 | FORCE_RET(); |
| 1138 | 1112 | } |
| 1139 | 1113 | |
| 1140 | 1114 | void OPPROTO op_ucomisd(void) |
| 1141 | 1115 | { |
| 1142 | - int eflags; | |
| 1116 | + int ret; | |
| 1143 | 1117 | float64 d0, d1; |
| 1144 | 1118 | Reg *d, *s; |
| 1145 | 1119 | d = (Reg *)((char *)env + PARAM1); |
| ... | ... | @@ -1147,28 +1121,14 @@ void OPPROTO op_ucomisd(void) |
| 1147 | 1121 | |
| 1148 | 1122 | d0 = d->XMM_D(0); |
| 1149 | 1123 | d1 = s->XMM_D(0); |
| 1150 | - switch(float64_compare_quiet(d0, d1, &env->sse_status)) { | |
| 1151 | - case -1: | |
| 1152 | - eflags = CC_C; | |
| 1153 | - break; | |
| 1154 | - case 0: | |
| 1155 | - eflags = CC_Z; | |
| 1156 | - break; | |
| 1157 | - case 1: | |
| 1158 | - eflags = 0; | |
| 1159 | - break; | |
| 1160 | - case 2: | |
| 1161 | - default: | |
| 1162 | - eflags = CC_Z | CC_P | CC_C; | |
| 1163 | - break; | |
| 1164 | - } | |
| 1165 | - CC_SRC = eflags; | |
| 1124 | + ret = float64_compare_quiet(d0, d1, &env->sse_status); | |
| 1125 | + CC_SRC = comis_eflags[ret + 1]; | |
| 1166 | 1126 | FORCE_RET(); |
| 1167 | 1127 | } |
| 1168 | 1128 | |
| 1169 | 1129 | void OPPROTO op_comisd(void) |
| 1170 | 1130 | { |
| 1171 | - int eflags; | |
| 1131 | + int ret; | |
| 1172 | 1132 | float64 d0, d1; |
| 1173 | 1133 | Reg *d, *s; |
| 1174 | 1134 | d = (Reg *)((char *)env + PARAM1); |
| ... | ... | @@ -1176,22 +1136,8 @@ void OPPROTO op_comisd(void) |
| 1176 | 1136 | |
| 1177 | 1137 | d0 = d->XMM_D(0); |
| 1178 | 1138 | d1 = s->XMM_D(0); |
| 1179 | - switch(float64_compare(d0, d1, &env->sse_status)) { | |
| 1180 | - case -1: | |
| 1181 | - eflags = CC_C; | |
| 1182 | - break; | |
| 1183 | - case 0: | |
| 1184 | - eflags = CC_Z; | |
| 1185 | - break; | |
| 1186 | - case 1: | |
| 1187 | - eflags = 0; | |
| 1188 | - break; | |
| 1189 | - case 2: | |
| 1190 | - default: | |
| 1191 | - eflags = CC_Z | CC_P | CC_C; | |
| 1192 | - break; | |
| 1193 | - } | |
| 1194 | - CC_SRC = eflags; | |
| 1139 | + ret = float64_compare(d0, d1, &env->sse_status); | |
| 1140 | + CC_SRC = comis_eflags[ret + 1]; | |
| 1195 | 1141 | FORCE_RET(); |
| 1196 | 1142 | } |
| 1197 | 1143 | ... | ... |