Revision fbcc6828
b/target-mips/op.c | ||
---|---|---|
2185 | 2185 |
FDT2 = float64_ ## name (FDT0, FDT1, &env->fp_status); \ |
2186 | 2186 |
update_fcr31(); \ |
2187 | 2187 |
DEBUG_FPU_STATE(); \ |
2188 |
RETURN(); \ |
|
2188 | 2189 |
} \ |
2189 | 2190 |
FLOAT_OP(name, s) \ |
2190 | 2191 |
{ \ |
... | ... | |
2192 | 2193 |
FST2 = float32_ ## name (FST0, FST1, &env->fp_status); \ |
2193 | 2194 |
update_fcr31(); \ |
2194 | 2195 |
DEBUG_FPU_STATE(); \ |
2196 |
RETURN(); \ |
|
2195 | 2197 |
} \ |
2196 | 2198 |
FLOAT_OP(name, ps) \ |
2197 | 2199 |
{ \ |
... | ... | |
2200 | 2202 |
FSTH2 = float32_ ## name (FSTH0, FSTH1, &env->fp_status); \ |
2201 | 2203 |
update_fcr31(); \ |
2202 | 2204 |
DEBUG_FPU_STATE(); \ |
2205 |
RETURN(); \ |
|
2203 | 2206 |
} |
2204 | 2207 |
FLOAT_BINOP(add) |
2205 | 2208 |
FLOAT_BINOP(sub) |
... | ... | |
2207 | 2210 |
FLOAT_BINOP(div) |
2208 | 2211 |
#undef FLOAT_BINOP |
2209 | 2212 |
|
2213 |
FLOAT_OP(addr, ps) |
|
2214 |
{ |
|
2215 |
set_float_exception_flags(0, &env->fp_status); |
|
2216 |
FST2 = float32_add (FST0, FSTH0, &env->fp_status); |
|
2217 |
FSTH2 = float32_add (FST1, FSTH1, &env->fp_status); |
|
2218 |
update_fcr31(); |
|
2219 |
DEBUG_FPU_STATE(); |
|
2220 |
RETURN(); |
|
2221 |
} |
|
2222 |
|
|
2210 | 2223 |
/* ternary operations */ |
2211 | 2224 |
#define FLOAT_TERNOP(name1, name2) \ |
2212 | 2225 |
FLOAT_OP(name1 ## name2, d) \ |
... | ... | |
2214 | 2227 |
FDT0 = float64_ ## name1 (FDT0, FDT1, &env->fp_status); \ |
2215 | 2228 |
FDT2 = float64_ ## name2 (FDT0, FDT2, &env->fp_status); \ |
2216 | 2229 |
DEBUG_FPU_STATE(); \ |
2230 |
RETURN(); \ |
|
2217 | 2231 |
} \ |
2218 | 2232 |
FLOAT_OP(name1 ## name2, s) \ |
2219 | 2233 |
{ \ |
2220 | 2234 |
FST0 = float32_ ## name1 (FST0, FST1, &env->fp_status); \ |
2221 | 2235 |
FST2 = float32_ ## name2 (FST0, FST2, &env->fp_status); \ |
2222 | 2236 |
DEBUG_FPU_STATE(); \ |
2237 |
RETURN(); \ |
|
2223 | 2238 |
} \ |
2224 | 2239 |
FLOAT_OP(name1 ## name2, ps) \ |
2225 | 2240 |
{ \ |
... | ... | |
2228 | 2243 |
FST2 = float32_ ## name2 (FST0, FST2, &env->fp_status); \ |
2229 | 2244 |
FSTH2 = float32_ ## name2 (FSTH0, FSTH2, &env->fp_status); \ |
2230 | 2245 |
DEBUG_FPU_STATE(); \ |
2246 |
RETURN(); \ |
|
2231 | 2247 |
} |
2232 | 2248 |
FLOAT_TERNOP(mul, add) |
2233 | 2249 |
FLOAT_TERNOP(mul, sub) |
2234 | 2250 |
#undef FLOAT_TERNOP |
2235 | 2251 |
|
2252 |
/* negated ternary operations */ |
|
2253 |
#define FLOAT_NTERNOP(name1, name2) \ |
|
2254 |
FLOAT_OP(n ## name1 ## name2, d) \ |
|
2255 |
{ \ |
|
2256 |
FDT0 = float64_ ## name1 (FDT0, FDT1, &env->fp_status); \ |
|
2257 |
FDT2 = float64_ ## name2 (FDT0, FDT2, &env->fp_status); \ |
|
2258 |
FDT2 ^= 1ULL << 63; \ |
|
2259 |
DEBUG_FPU_STATE(); \ |
|
2260 |
RETURN(); \ |
|
2261 |
} \ |
|
2262 |
FLOAT_OP(n ## name1 ## name2, s) \ |
|
2263 |
{ \ |
|
2264 |
FST0 = float32_ ## name1 (FST0, FST1, &env->fp_status); \ |
|
2265 |
FST2 = float32_ ## name2 (FST0, FST2, &env->fp_status); \ |
|
2266 |
FST2 ^= 1 << 31; \ |
|
2267 |
DEBUG_FPU_STATE(); \ |
|
2268 |
RETURN(); \ |
|
2269 |
} \ |
|
2270 |
FLOAT_OP(n ## name1 ## name2, ps) \ |
|
2271 |
{ \ |
|
2272 |
FST0 = float32_ ## name1 (FST0, FST1, &env->fp_status); \ |
|
2273 |
FSTH0 = float32_ ## name1 (FSTH0, FSTH1, &env->fp_status); \ |
|
2274 |
FST2 = float32_ ## name2 (FST0, FST2, &env->fp_status); \ |
|
2275 |
FSTH2 = float32_ ## name2 (FSTH0, FSTH2, &env->fp_status); \ |
|
2276 |
FST2 ^= 1 << 31; \ |
|
2277 |
FSTH2 ^= 1 << 31; \ |
|
2278 |
DEBUG_FPU_STATE(); \ |
|
2279 |
RETURN(); \ |
|
2280 |
} |
|
2281 |
FLOAT_NTERNOP(mul, add) |
|
2282 |
FLOAT_NTERNOP(mul, sub) |
|
2283 |
#undef FLOAT_NTERNOP |
|
2284 |
|
|
2236 | 2285 |
/* unary operations, modifying fp status */ |
2237 | 2286 |
#define FLOAT_UNOP(name) \ |
2238 | 2287 |
FLOAT_OP(name, d) \ |
2239 | 2288 |
{ \ |
2240 | 2289 |
FDT2 = float64_ ## name(FDT0, &env->fp_status); \ |
2241 | 2290 |
DEBUG_FPU_STATE(); \ |
2291 |
RETURN(); \ |
|
2242 | 2292 |
} \ |
2243 | 2293 |
FLOAT_OP(name, s) \ |
2244 | 2294 |
{ \ |
2245 | 2295 |
FST2 = float32_ ## name(FST0, &env->fp_status); \ |
2246 | 2296 |
DEBUG_FPU_STATE(); \ |
2297 |
RETURN(); \ |
|
2247 | 2298 |
} \ |
2248 | 2299 |
FLOAT_OP(name, ps) \ |
2249 | 2300 |
{ \ |
2250 | 2301 |
FST2 = float32_ ## name(FST0, &env->fp_status); \ |
2251 | 2302 |
FSTH2 = float32_ ## name(FSTH0, &env->fp_status); \ |
2252 | 2303 |
DEBUG_FPU_STATE(); \ |
2304 |
RETURN(); \ |
|
2253 | 2305 |
} |
2254 | 2306 |
FLOAT_UNOP(sqrt) |
2255 | 2307 |
#undef FLOAT_UNOP |
... | ... | |
2260 | 2312 |
{ \ |
2261 | 2313 |
FDT2 = float64_ ## name(FDT0); \ |
2262 | 2314 |
DEBUG_FPU_STATE(); \ |
2315 |
RETURN(); \ |
|
2263 | 2316 |
} \ |
2264 | 2317 |
FLOAT_OP(name, s) \ |
2265 | 2318 |
{ \ |
2266 | 2319 |
FST2 = float32_ ## name(FST0); \ |
2267 | 2320 |
DEBUG_FPU_STATE(); \ |
2321 |
RETURN(); \ |
|
2268 | 2322 |
} \ |
2269 | 2323 |
FLOAT_OP(name, ps) \ |
2270 | 2324 |
{ \ |
2271 | 2325 |
FST2 = float32_ ## name(FST0); \ |
2272 | 2326 |
FSTH2 = float32_ ## name(FSTH0); \ |
2273 | 2327 |
DEBUG_FPU_STATE(); \ |
2328 |
RETURN(); \ |
|
2274 | 2329 |
} |
2275 | 2330 |
FLOAT_UNOP(abs) |
2276 | 2331 |
FLOAT_UNOP(chs) |
b/target-mips/translate.c | ||
---|---|---|
402 | 402 |
OPC_MSUB_D = 0x29 | OPC_CP3, |
403 | 403 |
OPC_MSUB_PS = 0x2E | OPC_CP3, |
404 | 404 |
OPC_NMADD_S = 0x30 | OPC_CP3, |
405 |
OPC_NMADD_D = 0x32 | OPC_CP3,
|
|
405 |
OPC_NMADD_D = 0x31 | OPC_CP3,
|
|
406 | 406 |
OPC_NMADD_PS= 0x36 | OPC_CP3, |
407 | 407 |
OPC_NMSUB_S = 0x38 | OPC_CP3, |
408 | 408 |
OPC_NMSUB_D = 0x39 | OPC_CP3, |
... | ... | |
4955 | 4955 |
GEN_STORE_FTN_FREG(fd, WTH2); |
4956 | 4956 |
opn = "movn.ps"; |
4957 | 4957 |
break; |
4958 |
case FOP(24, 22): |
|
4959 |
CHECK_FR(ctx, fs | fd | ft); |
|
4960 |
GEN_LOAD_FREG_FTN(WT0, fs); |
|
4961 |
GEN_LOAD_FREG_FTN(WTH0, fs); |
|
4962 |
GEN_LOAD_FREG_FTN(WT1, ft); |
|
4963 |
GEN_LOAD_FREG_FTN(WTH1, ft); |
|
4964 |
gen_op_float_addr_ps(); |
|
4965 |
GEN_STORE_FTN_FREG(fd, WT2); |
|
4966 |
GEN_STORE_FTN_FREG(fd, WTH2); |
|
4967 |
opn = "addr.ps"; |
|
4968 |
break; |
|
4958 | 4969 |
case FOP(32, 22): |
4959 | 4970 |
CHECK_FR(ctx, fs); |
4960 | 4971 |
GEN_LOAD_FREG_FTN(WTH0, fs); |
... | ... | |
5120 | 5131 |
opn = "madd.s"; |
5121 | 5132 |
break; |
5122 | 5133 |
case OPC_MADD_D: |
5123 |
generate_exception (ctx, EXCP_RI); |
|
5134 |
GEN_LOAD_FREG_FTN(DT0, fs); |
|
5135 |
GEN_LOAD_FREG_FTN(DT1, ft); |
|
5136 |
GEN_LOAD_FREG_FTN(DT2, fr); |
|
5137 |
gen_op_float_muladd_d(); |
|
5138 |
GEN_STORE_FTN_FREG(fd, DT2); |
|
5124 | 5139 |
opn = "madd.d"; |
5125 | 5140 |
break; |
5126 | 5141 |
case OPC_MADD_PS: |
5127 |
generate_exception (ctx, EXCP_RI); |
|
5142 |
GEN_LOAD_FREG_FTN(WT0, fs); |
|
5143 |
GEN_LOAD_FREG_FTN(WTH0, fs); |
|
5144 |
GEN_LOAD_FREG_FTN(WT1, ft); |
|
5145 |
GEN_LOAD_FREG_FTN(WTH1, ft); |
|
5146 |
GEN_LOAD_FREG_FTN(WT2, fr); |
|
5147 |
GEN_LOAD_FREG_FTN(WTH2, fr); |
|
5148 |
gen_op_float_muladd_ps(); |
|
5149 |
GEN_STORE_FTN_FREG(fd, WT2); |
|
5150 |
GEN_STORE_FTN_FREG(fd, WTH2); |
|
5128 | 5151 |
opn = "madd.ps"; |
5129 | 5152 |
break; |
5130 | 5153 |
case OPC_MSUB_S: |
5131 |
generate_exception (ctx, EXCP_RI); |
|
5154 |
GEN_LOAD_FREG_FTN(WT0, fs); |
|
5155 |
GEN_LOAD_FREG_FTN(WT1, ft); |
|
5156 |
GEN_LOAD_FREG_FTN(WT2, fr); |
|
5157 |
gen_op_float_mulsub_s(); |
|
5158 |
GEN_STORE_FTN_FREG(fd, WT2); |
|
5132 | 5159 |
opn = "msub.s"; |
5133 | 5160 |
break; |
5134 | 5161 |
case OPC_MSUB_D: |
5135 |
generate_exception (ctx, EXCP_RI); |
|
5162 |
GEN_LOAD_FREG_FTN(DT0, fs); |
|
5163 |
GEN_LOAD_FREG_FTN(DT1, ft); |
|
5164 |
GEN_LOAD_FREG_FTN(DT2, fr); |
|
5165 |
gen_op_float_mulsub_d(); |
|
5166 |
GEN_STORE_FTN_FREG(fd, DT2); |
|
5136 | 5167 |
opn = "msub.d"; |
5137 | 5168 |
break; |
5138 | 5169 |
case OPC_MSUB_PS: |
5139 |
generate_exception (ctx, EXCP_RI); |
|
5170 |
GEN_LOAD_FREG_FTN(WT0, fs); |
|
5171 |
GEN_LOAD_FREG_FTN(WTH0, fs); |
|
5172 |
GEN_LOAD_FREG_FTN(WT1, ft); |
|
5173 |
GEN_LOAD_FREG_FTN(WTH1, ft); |
|
5174 |
GEN_LOAD_FREG_FTN(WT2, fr); |
|
5175 |
GEN_LOAD_FREG_FTN(WTH2, fr); |
|
5176 |
gen_op_float_mulsub_ps(); |
|
5177 |
GEN_STORE_FTN_FREG(fd, WT2); |
|
5178 |
GEN_STORE_FTN_FREG(fd, WTH2); |
|
5140 | 5179 |
opn = "msub.ps"; |
5141 | 5180 |
break; |
5142 | 5181 |
case OPC_NMADD_S: |
5143 |
generate_exception (ctx, EXCP_RI); |
|
5182 |
GEN_LOAD_FREG_FTN(WT0, fs); |
|
5183 |
GEN_LOAD_FREG_FTN(WT1, ft); |
|
5184 |
GEN_LOAD_FREG_FTN(WT2, fr); |
|
5185 |
gen_op_float_nmuladd_s(); |
|
5186 |
GEN_STORE_FTN_FREG(fd, WT2); |
|
5144 | 5187 |
opn = "nmadd.s"; |
5145 | 5188 |
break; |
5146 | 5189 |
case OPC_NMADD_D: |
5147 |
generate_exception (ctx, EXCP_RI); |
|
5190 |
GEN_LOAD_FREG_FTN(DT0, fs); |
|
5191 |
GEN_LOAD_FREG_FTN(DT1, ft); |
|
5192 |
GEN_LOAD_FREG_FTN(DT2, fr); |
|
5193 |
gen_op_float_nmuladd_d(); |
|
5194 |
GEN_STORE_FTN_FREG(fd, DT2); |
|
5148 | 5195 |
opn = "nmadd.d"; |
5149 | 5196 |
break; |
5150 | 5197 |
case OPC_NMADD_PS: |
5151 |
generate_exception (ctx, EXCP_RI); |
|
5198 |
GEN_LOAD_FREG_FTN(WT0, fs); |
|
5199 |
GEN_LOAD_FREG_FTN(WTH0, fs); |
|
5200 |
GEN_LOAD_FREG_FTN(WT1, ft); |
|
5201 |
GEN_LOAD_FREG_FTN(WTH1, ft); |
|
5202 |
GEN_LOAD_FREG_FTN(WT2, fr); |
|
5203 |
GEN_LOAD_FREG_FTN(WTH2, fr); |
|
5204 |
gen_op_float_nmuladd_ps(); |
|
5205 |
GEN_STORE_FTN_FREG(fd, WT2); |
|
5206 |
GEN_STORE_FTN_FREG(fd, WTH2); |
|
5152 | 5207 |
opn = "nmadd.ps"; |
5153 | 5208 |
break; |
5154 | 5209 |
case OPC_NMSUB_S: |
5155 |
generate_exception (ctx, EXCP_RI); |
|
5210 |
GEN_LOAD_FREG_FTN(WT0, fs); |
|
5211 |
GEN_LOAD_FREG_FTN(WT1, ft); |
|
5212 |
GEN_LOAD_FREG_FTN(WT2, fr); |
|
5213 |
gen_op_float_nmulsub_s(); |
|
5214 |
GEN_STORE_FTN_FREG(fd, WT2); |
|
5156 | 5215 |
opn = "nmsub.s"; |
5157 | 5216 |
break; |
5158 | 5217 |
case OPC_NMSUB_D: |
5159 |
generate_exception (ctx, EXCP_RI); |
|
5218 |
GEN_LOAD_FREG_FTN(DT0, fs); |
|
5219 |
GEN_LOAD_FREG_FTN(DT1, ft); |
|
5220 |
GEN_LOAD_FREG_FTN(DT2, fr); |
|
5221 |
gen_op_float_nmulsub_d(); |
|
5222 |
GEN_STORE_FTN_FREG(fd, DT2); |
|
5160 | 5223 |
opn = "nmsub.d"; |
5161 | 5224 |
break; |
5162 | 5225 |
case OPC_NMSUB_PS: |
5163 |
generate_exception (ctx, EXCP_RI); |
|
5226 |
GEN_LOAD_FREG_FTN(WT0, fs); |
|
5227 |
GEN_LOAD_FREG_FTN(WTH0, fs); |
|
5228 |
GEN_LOAD_FREG_FTN(WT1, ft); |
|
5229 |
GEN_LOAD_FREG_FTN(WTH1, ft); |
|
5230 |
GEN_LOAD_FREG_FTN(WT2, fr); |
|
5231 |
GEN_LOAD_FREG_FTN(WTH2, fr); |
|
5232 |
gen_op_float_nmulsub_ps(); |
|
5233 |
GEN_STORE_FTN_FREG(fd, WT2); |
|
5234 |
GEN_STORE_FTN_FREG(fd, WTH2); |
|
5164 | 5235 |
opn = "nmsub.ps"; |
5165 | 5236 |
break; |
5166 | 5237 |
default: |
... | ... | |
5562 | 5633 |
gen_cp1(ctx, op1, rt, rd); |
5563 | 5634 |
break; |
5564 | 5635 |
case OPC_BC1: |
5636 |
case OPC_BC1ANY2: |
|
5637 |
case OPC_BC1ANY4: |
|
5565 | 5638 |
gen_compute_branch1(ctx, MASK_BC1(ctx->opcode), |
5566 | 5639 |
(rt >> 2) & 0x7, imm << 2); |
5567 | 5640 |
return; |
Also available in: Unified diff