Revision af12906f target-ppc/op.c
b/target-ppc/op.c | ||
---|---|---|
261 | 261 |
} |
262 | 262 |
#endif /* !defined(CONFIG_USER_ONLY) */ |
263 | 263 |
|
264 |
/* FPSCR */ |
|
265 |
#ifdef CONFIG_SOFTFLOAT |
|
266 |
void OPPROTO op_reset_fpstatus (void) |
|
267 |
{ |
|
268 |
env->fp_status.float_exception_flags = 0; |
|
269 |
RETURN(); |
|
270 |
} |
|
271 |
#endif |
|
272 |
|
|
273 |
void OPPROTO op_compute_fprf (void) |
|
274 |
{ |
|
275 |
do_compute_fprf(PARAM1); |
|
276 |
RETURN(); |
|
277 |
} |
|
278 |
|
|
279 |
#ifdef CONFIG_SOFTFLOAT |
|
280 |
void OPPROTO op_float_check_status (void) |
|
281 |
{ |
|
282 |
do_float_check_status(); |
|
283 |
RETURN(); |
|
284 |
} |
|
285 |
#else |
|
286 |
void OPPROTO op_float_check_status (void) |
|
287 |
{ |
|
288 |
if (env->exception_index == POWERPC_EXCP_PROGRAM && |
|
289 |
(env->error_code & POWERPC_EXCP_FP)) { |
|
290 |
/* Differred floating-point exception after target FPR update */ |
|
291 |
if (msr_fe0 != 0 || msr_fe1 != 0) |
|
292 |
do_raise_exception_err(env->exception_index, env->error_code); |
|
293 |
} |
|
294 |
RETURN(); |
|
295 |
} |
|
296 |
#endif |
|
297 |
|
|
298 |
void OPPROTO op_load_fpscr_FT0 (void) |
|
299 |
{ |
|
300 |
/* The 32 MSB of the target fpr are undefined. |
|
301 |
* They'll be zero... |
|
302 |
*/ |
|
303 |
CPU_DoubleU u; |
|
304 |
|
|
305 |
u.l.upper = 0; |
|
306 |
u.l.lower = env->fpscr; |
|
307 |
FT0 = u.d; |
|
308 |
RETURN(); |
|
309 |
} |
|
310 |
|
|
311 |
void OPPROTO op_fpscr_resetbit (void) |
|
312 |
{ |
|
313 |
env->fpscr &= PARAM1; |
|
314 |
RETURN(); |
|
315 |
} |
|
316 |
|
|
317 |
void OPPROTO op_fpscr_setbit (void) |
|
318 |
{ |
|
319 |
do_fpscr_setbit(PARAM1); |
|
320 |
RETURN(); |
|
321 |
} |
|
322 |
|
|
323 |
void OPPROTO op_store_fpscr (void) |
|
324 |
{ |
|
325 |
do_store_fpscr(PARAM1); |
|
326 |
RETURN(); |
|
327 |
} |
|
328 |
|
|
329 | 264 |
/*** Integer shift ***/ |
330 | 265 |
void OPPROTO op_srli_T1 (void) |
331 | 266 |
{ |
... | ... | |
333 | 268 |
RETURN(); |
334 | 269 |
} |
335 | 270 |
|
336 |
/*** Floating-Point arithmetic ***/ |
|
337 |
/* fadd - fadd. */ |
|
338 |
void OPPROTO op_fadd (void) |
|
339 |
{ |
|
340 |
#if USE_PRECISE_EMULATION |
|
341 |
do_fadd(); |
|
342 |
#else |
|
343 |
FT0 = float64_add(FT0, FT1, &env->fp_status); |
|
344 |
#endif |
|
345 |
RETURN(); |
|
346 |
} |
|
347 |
|
|
348 |
/* fsub - fsub. */ |
|
349 |
void OPPROTO op_fsub (void) |
|
350 |
{ |
|
351 |
#if USE_PRECISE_EMULATION |
|
352 |
do_fsub(); |
|
353 |
#else |
|
354 |
FT0 = float64_sub(FT0, FT1, &env->fp_status); |
|
355 |
#endif |
|
356 |
RETURN(); |
|
357 |
} |
|
358 |
|
|
359 |
/* fmul - fmul. */ |
|
360 |
void OPPROTO op_fmul (void) |
|
361 |
{ |
|
362 |
#if USE_PRECISE_EMULATION |
|
363 |
do_fmul(); |
|
364 |
#else |
|
365 |
FT0 = float64_mul(FT0, FT1, &env->fp_status); |
|
366 |
#endif |
|
367 |
RETURN(); |
|
368 |
} |
|
369 |
|
|
370 |
/* fdiv - fdiv. */ |
|
371 |
void OPPROTO op_fdiv (void) |
|
372 |
{ |
|
373 |
#if USE_PRECISE_EMULATION |
|
374 |
do_fdiv(); |
|
375 |
#else |
|
376 |
FT0 = float64_div(FT0, FT1, &env->fp_status); |
|
377 |
#endif |
|
378 |
RETURN(); |
|
379 |
} |
|
380 |
|
|
381 |
/* fsqrt - fsqrt. */ |
|
382 |
void OPPROTO op_fsqrt (void) |
|
383 |
{ |
|
384 |
do_fsqrt(); |
|
385 |
RETURN(); |
|
386 |
} |
|
387 |
|
|
388 |
/* fre - fre. */ |
|
389 |
void OPPROTO op_fre (void) |
|
390 |
{ |
|
391 |
do_fre(); |
|
392 |
RETURN(); |
|
393 |
} |
|
394 |
|
|
395 |
/* fres - fres. */ |
|
396 |
void OPPROTO op_fres (void) |
|
397 |
{ |
|
398 |
do_fres(); |
|
399 |
RETURN(); |
|
400 |
} |
|
401 |
|
|
402 |
/* frsqrte - frsqrte. */ |
|
403 |
void OPPROTO op_frsqrte (void) |
|
404 |
{ |
|
405 |
do_frsqrte(); |
|
406 |
RETURN(); |
|
407 |
} |
|
408 |
|
|
409 |
/* fsel - fsel. */ |
|
410 |
void OPPROTO op_fsel (void) |
|
411 |
{ |
|
412 |
do_fsel(); |
|
413 |
RETURN(); |
|
414 |
} |
|
415 |
|
|
416 |
/*** Floating-Point multiply-and-add ***/ |
|
417 |
/* fmadd - fmadd. */ |
|
418 |
void OPPROTO op_fmadd (void) |
|
419 |
{ |
|
420 |
#if USE_PRECISE_EMULATION |
|
421 |
do_fmadd(); |
|
422 |
#else |
|
423 |
FT0 = float64_mul(FT0, FT1, &env->fp_status); |
|
424 |
FT0 = float64_add(FT0, FT2, &env->fp_status); |
|
425 |
#endif |
|
426 |
RETURN(); |
|
427 |
} |
|
428 |
|
|
429 |
/* fmsub - fmsub. */ |
|
430 |
void OPPROTO op_fmsub (void) |
|
431 |
{ |
|
432 |
#if USE_PRECISE_EMULATION |
|
433 |
do_fmsub(); |
|
434 |
#else |
|
435 |
FT0 = float64_mul(FT0, FT1, &env->fp_status); |
|
436 |
FT0 = float64_sub(FT0, FT2, &env->fp_status); |
|
437 |
#endif |
|
438 |
RETURN(); |
|
439 |
} |
|
440 |
|
|
441 |
/* fnmadd - fnmadd. - fnmadds - fnmadds. */ |
|
442 |
void OPPROTO op_fnmadd (void) |
|
443 |
{ |
|
444 |
do_fnmadd(); |
|
445 |
RETURN(); |
|
446 |
} |
|
447 |
|
|
448 |
/* fnmsub - fnmsub. */ |
|
449 |
void OPPROTO op_fnmsub (void) |
|
450 |
{ |
|
451 |
do_fnmsub(); |
|
452 |
RETURN(); |
|
453 |
} |
|
454 |
|
|
455 |
/*** Floating-Point round & convert ***/ |
|
456 |
/* frsp - frsp. */ |
|
457 |
void OPPROTO op_frsp (void) |
|
458 |
{ |
|
459 |
#if USE_PRECISE_EMULATION |
|
460 |
do_frsp(); |
|
461 |
#else |
|
462 |
FT0 = float64_to_float32(FT0, &env->fp_status); |
|
463 |
#endif |
|
464 |
RETURN(); |
|
465 |
} |
|
466 |
|
|
467 |
/* fctiw - fctiw. */ |
|
468 |
void OPPROTO op_fctiw (void) |
|
469 |
{ |
|
470 |
do_fctiw(); |
|
471 |
RETURN(); |
|
472 |
} |
|
473 |
|
|
474 |
/* fctiwz - fctiwz. */ |
|
475 |
void OPPROTO op_fctiwz (void) |
|
476 |
{ |
|
477 |
do_fctiwz(); |
|
478 |
RETURN(); |
|
479 |
} |
|
480 |
|
|
481 |
#if defined(TARGET_PPC64) |
|
482 |
/* fcfid - fcfid. */ |
|
483 |
void OPPROTO op_fcfid (void) |
|
484 |
{ |
|
485 |
do_fcfid(); |
|
486 |
RETURN(); |
|
487 |
} |
|
488 |
|
|
489 |
/* fctid - fctid. */ |
|
490 |
void OPPROTO op_fctid (void) |
|
491 |
{ |
|
492 |
do_fctid(); |
|
493 |
RETURN(); |
|
494 |
} |
|
495 |
|
|
496 |
/* fctidz - fctidz. */ |
|
497 |
void OPPROTO op_fctidz (void) |
|
498 |
{ |
|
499 |
do_fctidz(); |
|
500 |
RETURN(); |
|
501 |
} |
|
502 |
#endif |
|
503 |
|
|
504 |
void OPPROTO op_frin (void) |
|
505 |
{ |
|
506 |
do_frin(); |
|
507 |
RETURN(); |
|
508 |
} |
|
509 |
|
|
510 |
void OPPROTO op_friz (void) |
|
511 |
{ |
|
512 |
do_friz(); |
|
513 |
RETURN(); |
|
514 |
} |
|
515 |
|
|
516 |
void OPPROTO op_frip (void) |
|
517 |
{ |
|
518 |
do_frip(); |
|
519 |
RETURN(); |
|
520 |
} |
|
521 |
|
|
522 |
void OPPROTO op_frim (void) |
|
523 |
{ |
|
524 |
do_frim(); |
|
525 |
RETURN(); |
|
526 |
} |
|
527 |
|
|
528 |
/*** Floating-point move ***/ |
|
529 |
/* fabs */ |
|
530 |
void OPPROTO op_fabs (void) |
|
531 |
{ |
|
532 |
FT0 = float64_abs(FT0); |
|
533 |
RETURN(); |
|
534 |
} |
|
535 |
|
|
536 |
/* fnabs */ |
|
537 |
void OPPROTO op_fnabs (void) |
|
538 |
{ |
|
539 |
FT0 = float64_abs(FT0); |
|
540 |
FT0 = float64_chs(FT0); |
|
541 |
RETURN(); |
|
542 |
} |
|
543 |
|
|
544 |
/* fneg */ |
|
545 |
void OPPROTO op_fneg (void) |
|
546 |
{ |
|
547 |
FT0 = float64_chs(FT0); |
|
548 |
RETURN(); |
|
549 |
} |
|
550 |
|
|
551 | 271 |
/* Load and store */ |
552 | 272 |
#define MEMSUFFIX _raw |
553 | 273 |
#include "op_helper.h" |
Also available in: Unified diff