Revision 0f8a249a target-sparc/op.c
b/target-sparc/op.c | ||
---|---|---|
376 | 376 |
env->psr = 0; |
377 | 377 |
#ifdef TARGET_SPARC64 |
378 | 378 |
if (!(T0 & 0xffffffff)) |
379 |
env->psr |= PSR_ZERO;
|
|
379 |
env->psr |= PSR_ZERO;
|
|
380 | 380 |
if ((int32_t) T0 < 0) |
381 |
env->psr |= PSR_NEG;
|
|
381 |
env->psr |= PSR_NEG;
|
|
382 | 382 |
if ((T0 & 0xffffffff) < (src1 & 0xffffffff)) |
383 |
env->psr |= PSR_CARRY;
|
|
383 |
env->psr |= PSR_CARRY;
|
|
384 | 384 |
if ((((src1 & 0xffffffff) ^ (T1 & 0xffffffff) ^ -1) & |
385 |
((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31))
|
|
386 |
env->psr |= PSR_OVF;
|
|
385 |
((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31))
|
|
386 |
env->psr |= PSR_OVF;
|
|
387 | 387 |
|
388 | 388 |
env->xcc = 0; |
389 | 389 |
if (!T0) |
390 |
env->xcc |= PSR_ZERO;
|
|
390 |
env->xcc |= PSR_ZERO;
|
|
391 | 391 |
if ((int64_t) T0 < 0) |
392 |
env->xcc |= PSR_NEG;
|
|
392 |
env->xcc |= PSR_NEG;
|
|
393 | 393 |
if (T0 < src1) |
394 |
env->xcc |= PSR_CARRY;
|
|
394 |
env->xcc |= PSR_CARRY;
|
|
395 | 395 |
if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1ULL << 63)) |
396 |
env->xcc |= PSR_OVF;
|
|
396 |
env->xcc |= PSR_OVF;
|
|
397 | 397 |
#else |
398 | 398 |
if (!T0) |
399 |
env->psr |= PSR_ZERO;
|
|
399 |
env->psr |= PSR_ZERO;
|
|
400 | 400 |
if ((int32_t) T0 < 0) |
401 |
env->psr |= PSR_NEG;
|
|
401 |
env->psr |= PSR_NEG;
|
|
402 | 402 |
if (T0 < src1) |
403 |
env->psr |= PSR_CARRY;
|
|
403 |
env->psr |= PSR_CARRY;
|
|
404 | 404 |
if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1 << 31)) |
405 |
env->psr |= PSR_OVF;
|
|
405 |
env->psr |= PSR_OVF;
|
|
406 | 406 |
#endif |
407 | 407 |
FORCE_RET(); |
408 | 408 |
} |
... | ... | |
448 | 448 |
} |
449 | 449 |
#ifdef TARGET_SPARC64 |
450 | 450 |
if (!(T0 & 0xffffffff)) |
451 |
env->psr |= PSR_ZERO;
|
|
451 |
env->psr |= PSR_ZERO;
|
|
452 | 452 |
if ((int32_t) T0 < 0) |
453 |
env->psr |= PSR_NEG;
|
|
453 |
env->psr |= PSR_NEG;
|
|
454 | 454 |
if ((((src1 & 0xffffffff) ^ (T1 & 0xffffffff) ^ -1) & |
455 |
((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31))
|
|
456 |
env->psr |= PSR_OVF;
|
|
455 |
((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31))
|
|
456 |
env->psr |= PSR_OVF;
|
|
457 | 457 |
|
458 | 458 |
if (!T0) |
459 |
env->xcc |= PSR_ZERO;
|
|
459 |
env->xcc |= PSR_ZERO;
|
|
460 | 460 |
if ((int64_t) T0 < 0) |
461 |
env->xcc |= PSR_NEG;
|
|
461 |
env->xcc |= PSR_NEG;
|
|
462 | 462 |
if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1ULL << 63)) |
463 |
env->xcc |= PSR_OVF;
|
|
463 |
env->xcc |= PSR_OVF;
|
|
464 | 464 |
#else |
465 | 465 |
if (!T0) |
466 |
env->psr |= PSR_ZERO;
|
|
466 |
env->psr |= PSR_ZERO;
|
|
467 | 467 |
if ((int32_t) T0 < 0) |
468 |
env->psr |= PSR_NEG;
|
|
468 |
env->psr |= PSR_NEG;
|
|
469 | 469 |
if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1 << 31)) |
470 |
env->psr |= PSR_OVF;
|
|
470 |
env->psr |= PSR_OVF;
|
|
471 | 471 |
#endif |
472 | 472 |
FORCE_RET(); |
473 | 473 |
} |
... | ... | |
481 | 481 |
env->psr = 0; |
482 | 482 |
#ifdef TARGET_SPARC64 |
483 | 483 |
if (!(T0 & 0xffffffff)) |
484 |
env->psr |= PSR_ZERO;
|
|
484 |
env->psr |= PSR_ZERO;
|
|
485 | 485 |
if ((int32_t) T0 < 0) |
486 |
env->psr |= PSR_NEG;
|
|
486 |
env->psr |= PSR_NEG;
|
|
487 | 487 |
if ((T0 & 0xffffffff) < (src1 & 0xffffffff)) |
488 |
env->psr |= PSR_CARRY;
|
|
488 |
env->psr |= PSR_CARRY;
|
|
489 | 489 |
if ((((src1 & 0xffffffff) ^ (T1 & 0xffffffff) ^ -1) & |
490 |
((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31))
|
|
491 |
env->psr |= PSR_OVF;
|
|
490 |
((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31))
|
|
491 |
env->psr |= PSR_OVF;
|
|
492 | 492 |
if ((src1 & 0x03) || (T1 & 0x03)) |
493 |
env->psr |= PSR_OVF;
|
|
493 |
env->psr |= PSR_OVF;
|
|
494 | 494 |
|
495 | 495 |
env->xcc = 0; |
496 | 496 |
if (!T0) |
497 |
env->xcc |= PSR_ZERO;
|
|
497 |
env->xcc |= PSR_ZERO;
|
|
498 | 498 |
if ((int64_t) T0 < 0) |
499 |
env->xcc |= PSR_NEG;
|
|
499 |
env->xcc |= PSR_NEG;
|
|
500 | 500 |
if (T0 < src1) |
501 |
env->xcc |= PSR_CARRY;
|
|
501 |
env->xcc |= PSR_CARRY;
|
|
502 | 502 |
if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1ULL << 63)) |
503 |
env->xcc |= PSR_OVF;
|
|
503 |
env->xcc |= PSR_OVF;
|
|
504 | 504 |
#else |
505 | 505 |
if (!T0) |
506 |
env->psr |= PSR_ZERO;
|
|
506 |
env->psr |= PSR_ZERO;
|
|
507 | 507 |
if ((int32_t) T0 < 0) |
508 |
env->psr |= PSR_NEG;
|
|
508 |
env->psr |= PSR_NEG;
|
|
509 | 509 |
if (T0 < src1) |
510 |
env->psr |= PSR_CARRY;
|
|
510 |
env->psr |= PSR_CARRY;
|
|
511 | 511 |
if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1 << 31)) |
512 |
env->psr |= PSR_OVF;
|
|
512 |
env->psr |= PSR_OVF;
|
|
513 | 513 |
if ((src1 & 0x03) || (T1 & 0x03)) |
514 |
env->psr |= PSR_OVF;
|
|
514 |
env->psr |= PSR_OVF;
|
|
515 | 515 |
#endif |
516 | 516 |
FORCE_RET(); |
517 | 517 |
} |
... | ... | |
528 | 528 |
|
529 | 529 |
#ifdef TARGET_SPARC64 |
530 | 530 |
if ((((src1 & 0xffffffff) ^ (T1 & 0xffffffff) ^ -1) & |
531 |
((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31))
|
|
531 |
((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31))
|
|
532 | 532 |
raise_exception(TT_TOVF); |
533 | 533 |
#else |
534 | 534 |
if ((src1 & 0x03) || (T1 & 0x03)) |
... | ... | |
538 | 538 |
env->psr = 0; |
539 | 539 |
#ifdef TARGET_SPARC64 |
540 | 540 |
if (!(T0 & 0xffffffff)) |
541 |
env->psr |= PSR_ZERO;
|
|
541 |
env->psr |= PSR_ZERO;
|
|
542 | 542 |
if ((int32_t) T0 < 0) |
543 |
env->psr |= PSR_NEG;
|
|
543 |
env->psr |= PSR_NEG;
|
|
544 | 544 |
if ((T0 & 0xffffffff) < (src1 & 0xffffffff)) |
545 |
env->psr |= PSR_CARRY;
|
|
545 |
env->psr |= PSR_CARRY;
|
|
546 | 546 |
|
547 | 547 |
env->xcc = 0; |
548 | 548 |
if (!T0) |
549 |
env->xcc |= PSR_ZERO;
|
|
549 |
env->xcc |= PSR_ZERO;
|
|
550 | 550 |
if ((int64_t) T0 < 0) |
551 |
env->xcc |= PSR_NEG;
|
|
551 |
env->xcc |= PSR_NEG;
|
|
552 | 552 |
if (T0 < src1) |
553 |
env->xcc |= PSR_CARRY;
|
|
553 |
env->xcc |= PSR_CARRY;
|
|
554 | 554 |
#else |
555 | 555 |
if (!T0) |
556 |
env->psr |= PSR_ZERO;
|
|
556 |
env->psr |= PSR_ZERO;
|
|
557 | 557 |
if ((int32_t) T0 < 0) |
558 |
env->psr |= PSR_NEG;
|
|
558 |
env->psr |= PSR_NEG;
|
|
559 | 559 |
if (T0 < src1) |
560 |
env->psr |= PSR_CARRY;
|
|
560 |
env->psr |= PSR_CARRY;
|
|
561 | 561 |
#endif |
562 | 562 |
FORCE_RET(); |
563 | 563 |
} |
... | ... | |
576 | 576 |
env->psr = 0; |
577 | 577 |
#ifdef TARGET_SPARC64 |
578 | 578 |
if (!(T0 & 0xffffffff)) |
579 |
env->psr |= PSR_ZERO;
|
|
579 |
env->psr |= PSR_ZERO;
|
|
580 | 580 |
if ((int32_t) T0 < 0) |
581 |
env->psr |= PSR_NEG;
|
|
581 |
env->psr |= PSR_NEG;
|
|
582 | 582 |
if ((src1 & 0xffffffff) < (T1 & 0xffffffff)) |
583 |
env->psr |= PSR_CARRY;
|
|
583 |
env->psr |= PSR_CARRY;
|
|
584 | 584 |
if ((((src1 & 0xffffffff) ^ (T1 & 0xffffffff)) & |
585 |
((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31))
|
|
586 |
env->psr |= PSR_OVF;
|
|
585 |
((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31))
|
|
586 |
env->psr |= PSR_OVF;
|
|
587 | 587 |
|
588 | 588 |
env->xcc = 0; |
589 | 589 |
if (!T0) |
590 |
env->xcc |= PSR_ZERO;
|
|
590 |
env->xcc |= PSR_ZERO;
|
|
591 | 591 |
if ((int64_t) T0 < 0) |
592 |
env->xcc |= PSR_NEG;
|
|
592 |
env->xcc |= PSR_NEG;
|
|
593 | 593 |
if (src1 < T1) |
594 |
env->xcc |= PSR_CARRY;
|
|
594 |
env->xcc |= PSR_CARRY;
|
|
595 | 595 |
if (((src1 ^ T1) & (src1 ^ T0)) & (1ULL << 63)) |
596 |
env->xcc |= PSR_OVF;
|
|
596 |
env->xcc |= PSR_OVF;
|
|
597 | 597 |
#else |
598 | 598 |
if (!T0) |
599 |
env->psr |= PSR_ZERO;
|
|
599 |
env->psr |= PSR_ZERO;
|
|
600 | 600 |
if ((int32_t) T0 < 0) |
601 |
env->psr |= PSR_NEG;
|
|
601 |
env->psr |= PSR_NEG;
|
|
602 | 602 |
if (src1 < T1) |
603 |
env->psr |= PSR_CARRY;
|
|
603 |
env->psr |= PSR_CARRY;
|
|
604 | 604 |
if (((src1 ^ T1) & (src1 ^ T0)) & (1 << 31)) |
605 |
env->psr |= PSR_OVF;
|
|
605 |
env->psr |= PSR_OVF;
|
|
606 | 606 |
#endif |
607 | 607 |
FORCE_RET(); |
608 | 608 |
} |
... | ... | |
648 | 648 |
} |
649 | 649 |
#ifdef TARGET_SPARC64 |
650 | 650 |
if (!(T0 & 0xffffffff)) |
651 |
env->psr |= PSR_ZERO;
|
|
651 |
env->psr |= PSR_ZERO;
|
|
652 | 652 |
if ((int32_t) T0 < 0) |
653 |
env->psr |= PSR_NEG;
|
|
653 |
env->psr |= PSR_NEG;
|
|
654 | 654 |
if ((((src1 & 0xffffffff) ^ (T1 & 0xffffffff)) & |
655 |
((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31))
|
|
656 |
env->psr |= PSR_OVF;
|
|
655 |
((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31))
|
|
656 |
env->psr |= PSR_OVF;
|
|
657 | 657 |
|
658 | 658 |
if (!T0) |
659 |
env->xcc |= PSR_ZERO;
|
|
659 |
env->xcc |= PSR_ZERO;
|
|
660 | 660 |
if ((int64_t) T0 < 0) |
661 |
env->xcc |= PSR_NEG;
|
|
661 |
env->xcc |= PSR_NEG;
|
|
662 | 662 |
if (((src1 ^ T1) & (src1 ^ T0)) & (1ULL << 63)) |
663 |
env->xcc |= PSR_OVF;
|
|
663 |
env->xcc |= PSR_OVF;
|
|
664 | 664 |
#else |
665 | 665 |
if (!T0) |
666 |
env->psr |= PSR_ZERO;
|
|
666 |
env->psr |= PSR_ZERO;
|
|
667 | 667 |
if ((int32_t) T0 < 0) |
668 |
env->psr |= PSR_NEG;
|
|
668 |
env->psr |= PSR_NEG;
|
|
669 | 669 |
if (((src1 ^ T1) & (src1 ^ T0)) & (1 << 31)) |
670 |
env->psr |= PSR_OVF;
|
|
670 |
env->psr |= PSR_OVF;
|
|
671 | 671 |
#endif |
672 | 672 |
FORCE_RET(); |
673 | 673 |
} |
... | ... | |
681 | 681 |
env->psr = 0; |
682 | 682 |
#ifdef TARGET_SPARC64 |
683 | 683 |
if (!(T0 & 0xffffffff)) |
684 |
env->psr |= PSR_ZERO;
|
|
684 |
env->psr |= PSR_ZERO;
|
|
685 | 685 |
if ((int32_t) T0 < 0) |
686 |
env->psr |= PSR_NEG;
|
|
686 |
env->psr |= PSR_NEG;
|
|
687 | 687 |
if ((src1 & 0xffffffff) < (T1 & 0xffffffff)) |
688 |
env->psr |= PSR_CARRY;
|
|
688 |
env->psr |= PSR_CARRY;
|
|
689 | 689 |
if ((((src1 & 0xffffffff) ^ (T1 & 0xffffffff)) & |
690 |
((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31))
|
|
691 |
env->psr |= PSR_OVF;
|
|
690 |
((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31))
|
|
691 |
env->psr |= PSR_OVF;
|
|
692 | 692 |
if ((src1 & 0x03) || (T1 & 0x03)) |
693 |
env->psr |= PSR_OVF;
|
|
693 |
env->psr |= PSR_OVF;
|
|
694 | 694 |
|
695 | 695 |
env->xcc = 0; |
696 | 696 |
if (!T0) |
697 |
env->xcc |= PSR_ZERO;
|
|
697 |
env->xcc |= PSR_ZERO;
|
|
698 | 698 |
if ((int64_t) T0 < 0) |
699 |
env->xcc |= PSR_NEG;
|
|
699 |
env->xcc |= PSR_NEG;
|
|
700 | 700 |
if (src1 < T1) |
701 |
env->xcc |= PSR_CARRY;
|
|
701 |
env->xcc |= PSR_CARRY;
|
|
702 | 702 |
if (((src1 ^ T1) & (src1 ^ T0)) & (1ULL << 63)) |
703 |
env->xcc |= PSR_OVF;
|
|
703 |
env->xcc |= PSR_OVF;
|
|
704 | 704 |
#else |
705 | 705 |
if (!T0) |
706 |
env->psr |= PSR_ZERO;
|
|
706 |
env->psr |= PSR_ZERO;
|
|
707 | 707 |
if ((int32_t) T0 < 0) |
708 |
env->psr |= PSR_NEG;
|
|
708 |
env->psr |= PSR_NEG;
|
|
709 | 709 |
if (src1 < T1) |
710 |
env->psr |= PSR_CARRY;
|
|
710 |
env->psr |= PSR_CARRY;
|
|
711 | 711 |
if (((src1 ^ T1) & (src1 ^ T0)) & (1 << 31)) |
712 |
env->psr |= PSR_OVF;
|
|
712 |
env->psr |= PSR_OVF;
|
|
713 | 713 |
if ((src1 & 0x03) || (T1 & 0x03)) |
714 |
env->psr |= PSR_OVF;
|
|
714 |
env->psr |= PSR_OVF;
|
|
715 | 715 |
#endif |
716 | 716 |
FORCE_RET(); |
717 | 717 |
} |
... | ... | |
728 | 728 |
|
729 | 729 |
#ifdef TARGET_SPARC64 |
730 | 730 |
if ((((src1 & 0xffffffff) ^ (T1 & 0xffffffff)) & |
731 |
((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31))
|
|
731 |
((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31))
|
|
732 | 732 |
raise_exception(TT_TOVF); |
733 | 733 |
#else |
734 | 734 |
if (((src1 ^ T1) & (src1 ^ T0)) & (1 << 31)) |
... | ... | |
738 | 738 |
env->psr = 0; |
739 | 739 |
#ifdef TARGET_SPARC64 |
740 | 740 |
if (!(T0 & 0xffffffff)) |
741 |
env->psr |= PSR_ZERO;
|
|
741 |
env->psr |= PSR_ZERO;
|
|
742 | 742 |
if ((int32_t) T0 < 0) |
743 |
env->psr |= PSR_NEG;
|
|
743 |
env->psr |= PSR_NEG;
|
|
744 | 744 |
if ((src1 & 0xffffffff) < (T1 & 0xffffffff)) |
745 |
env->psr |= PSR_CARRY;
|
|
745 |
env->psr |= PSR_CARRY;
|
|
746 | 746 |
|
747 | 747 |
env->xcc = 0; |
748 | 748 |
if (!T0) |
749 |
env->xcc |= PSR_ZERO;
|
|
749 |
env->xcc |= PSR_ZERO;
|
|
750 | 750 |
if ((int64_t) T0 < 0) |
751 |
env->xcc |= PSR_NEG;
|
|
751 |
env->xcc |= PSR_NEG;
|
|
752 | 752 |
if (src1 < T1) |
753 |
env->xcc |= PSR_CARRY;
|
|
753 |
env->xcc |= PSR_CARRY;
|
|
754 | 754 |
#else |
755 | 755 |
if (!T0) |
756 |
env->psr |= PSR_ZERO;
|
|
756 |
env->psr |= PSR_ZERO;
|
|
757 | 757 |
if ((int32_t) T0 < 0) |
758 |
env->psr |= PSR_NEG;
|
|
758 |
env->psr |= PSR_NEG;
|
|
759 | 759 |
if (src1 < T1) |
760 |
env->psr |= PSR_CARRY;
|
|
760 |
env->psr |= PSR_CARRY;
|
|
761 | 761 |
#endif |
762 | 762 |
FORCE_RET(); |
763 | 763 |
} |
... | ... | |
833 | 833 |
T0 += T1; |
834 | 834 |
env->psr = 0; |
835 | 835 |
if (!T0) |
836 |
env->psr |= PSR_ZERO;
|
|
836 |
env->psr |= PSR_ZERO;
|
|
837 | 837 |
if ((int32_t) T0 < 0) |
838 |
env->psr |= PSR_NEG;
|
|
838 |
env->psr |= PSR_NEG;
|
|
839 | 839 |
if (T0 < src1) |
840 |
env->psr |= PSR_CARRY;
|
|
840 |
env->psr |= PSR_CARRY;
|
|
841 | 841 |
if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1 << 31)) |
842 |
env->psr |= PSR_OVF;
|
|
842 |
env->psr |= PSR_OVF;
|
|
843 | 843 |
env->y = (b2 << 31) | (env->y >> 1); |
844 | 844 |
FORCE_RET(); |
845 | 845 |
} |
... | ... | |
858 | 858 |
|
859 | 859 |
x0 = x0 / x1; |
860 | 860 |
if (x0 > 0xffffffff) { |
861 |
T0 = 0xffffffff;
|
|
862 |
T1 = 1;
|
|
861 |
T0 = 0xffffffff;
|
|
862 |
T1 = 1;
|
|
863 | 863 |
} else { |
864 |
T0 = x0;
|
|
865 |
T1 = 0;
|
|
864 |
T0 = x0;
|
|
865 |
T1 = 0;
|
|
866 | 866 |
} |
867 | 867 |
FORCE_RET(); |
868 | 868 |
} |
... | ... | |
881 | 881 |
|
882 | 882 |
x0 = x0 / x1; |
883 | 883 |
if ((int32_t) x0 != x0) { |
884 |
T0 = x0 < 0? 0x80000000: 0x7fffffff;
|
|
885 |
T1 = 1;
|
|
884 |
T0 = x0 < 0? 0x80000000: 0x7fffffff;
|
|
885 |
T1 = 1;
|
|
886 | 886 |
} else { |
887 |
T0 = x0;
|
|
888 |
T1 = 0;
|
|
887 |
T0 = x0;
|
|
888 |
T1 = 0;
|
|
889 | 889 |
} |
890 | 890 |
FORCE_RET(); |
891 | 891 |
} |
... | ... | |
895 | 895 |
env->psr = 0; |
896 | 896 |
#ifdef TARGET_SPARC64 |
897 | 897 |
if (!T0) |
898 |
env->psr |= PSR_ZERO;
|
|
898 |
env->psr |= PSR_ZERO;
|
|
899 | 899 |
if ((int32_t) T0 < 0) |
900 |
env->psr |= PSR_NEG;
|
|
900 |
env->psr |= PSR_NEG;
|
|
901 | 901 |
if (T1) |
902 |
env->psr |= PSR_OVF;
|
|
902 |
env->psr |= PSR_OVF;
|
|
903 | 903 |
|
904 | 904 |
env->xcc = 0; |
905 | 905 |
if (!T0) |
906 |
env->xcc |= PSR_ZERO;
|
|
906 |
env->xcc |= PSR_ZERO;
|
|
907 | 907 |
if ((int64_t) T0 < 0) |
908 |
env->xcc |= PSR_NEG;
|
|
908 |
env->xcc |= PSR_NEG;
|
|
909 | 909 |
#else |
910 | 910 |
if (!T0) |
911 |
env->psr |= PSR_ZERO;
|
|
911 |
env->psr |= PSR_ZERO;
|
|
912 | 912 |
if ((int32_t) T0 < 0) |
913 |
env->psr |= PSR_NEG;
|
|
913 |
env->psr |= PSR_NEG;
|
|
914 | 914 |
if (T1) |
915 |
env->psr |= PSR_OVF;
|
|
915 |
env->psr |= PSR_OVF;
|
|
916 | 916 |
#endif |
917 | 917 |
FORCE_RET(); |
918 | 918 |
} |
... | ... | |
939 | 939 |
raise_exception(TT_DIV_ZERO); |
940 | 940 |
} |
941 | 941 |
if (T0 == INT64_MIN && T1 == -1) |
942 |
T0 = INT64_MIN;
|
|
942 |
T0 = INT64_MIN;
|
|
943 | 943 |
else |
944 |
T0 /= (target_long) T1;
|
|
944 |
T0 /= (target_long) T1;
|
|
945 | 945 |
FORCE_RET(); |
946 | 946 |
} |
947 | 947 |
#endif |
... | ... | |
951 | 951 |
env->psr = 0; |
952 | 952 |
#ifdef TARGET_SPARC64 |
953 | 953 |
if (!(T0 & 0xffffffff)) |
954 |
env->psr |= PSR_ZERO;
|
|
954 |
env->psr |= PSR_ZERO;
|
|
955 | 955 |
if ((int32_t) T0 < 0) |
956 |
env->psr |= PSR_NEG;
|
|
956 |
env->psr |= PSR_NEG;
|
|
957 | 957 |
|
958 | 958 |
env->xcc = 0; |
959 | 959 |
if (!T0) |
960 |
env->xcc |= PSR_ZERO;
|
|
960 |
env->xcc |= PSR_ZERO;
|
|
961 | 961 |
if ((int64_t) T0 < 0) |
962 |
env->xcc |= PSR_NEG;
|
|
962 |
env->xcc |= PSR_NEG;
|
|
963 | 963 |
#else |
964 | 964 |
if (!T0) |
965 |
env->psr |= PSR_ZERO;
|
|
965 |
env->psr |= PSR_ZERO;
|
|
966 | 966 |
if ((int32_t) T0 < 0) |
967 |
env->psr |= PSR_NEG;
|
|
967 |
env->psr |= PSR_NEG;
|
|
968 | 968 |
#endif |
969 | 969 |
FORCE_RET(); |
970 | 970 |
} |
... | ... | |
1200 | 1200 |
cwp = (env->cwp - 1) & (NWINDOWS - 1); |
1201 | 1201 |
if (env->cansave == 0) { |
1202 | 1202 |
raise_exception(TT_SPILL | (env->otherwin != 0 ? |
1203 |
(TT_WOTHER | ((env->wstate & 0x38) >> 1)):
|
|
1204 |
((env->wstate & 0x7) << 2)));
|
|
1203 |
(TT_WOTHER | ((env->wstate & 0x38) >> 1)):
|
|
1204 |
((env->wstate & 0x7) << 2)));
|
|
1205 | 1205 |
} else { |
1206 |
if (env->cleanwin - env->canrestore == 0) {
|
|
1207 |
// XXX Clean windows without trap
|
|
1208 |
raise_exception(TT_CLRWIN);
|
|
1209 |
} else {
|
|
1210 |
env->cansave--;
|
|
1211 |
env->canrestore++;
|
|
1212 |
set_cwp(cwp);
|
|
1213 |
}
|
|
1206 |
if (env->cleanwin - env->canrestore == 0) {
|
|
1207 |
// XXX Clean windows without trap
|
|
1208 |
raise_exception(TT_CLRWIN);
|
|
1209 |
} else {
|
|
1210 |
env->cansave--;
|
|
1211 |
env->canrestore++;
|
|
1212 |
set_cwp(cwp);
|
|
1213 |
}
|
|
1214 | 1214 |
} |
1215 | 1215 |
FORCE_RET(); |
1216 | 1216 |
} |
... | ... | |
1221 | 1221 |
cwp = (env->cwp + 1) & (NWINDOWS - 1); |
1222 | 1222 |
if (env->canrestore == 0) { |
1223 | 1223 |
raise_exception(TT_FILL | (env->otherwin != 0 ? |
1224 |
(TT_WOTHER | ((env->wstate & 0x38) >> 1)):
|
|
1225 |
((env->wstate & 0x7) << 2)));
|
|
1224 |
(TT_WOTHER | ((env->wstate & 0x38) >> 1)):
|
|
1225 |
((env->wstate & 0x7) << 2)));
|
|
1226 | 1226 |
} else { |
1227 |
env->cansave++;
|
|
1228 |
env->canrestore--;
|
|
1229 |
set_cwp(cwp);
|
|
1227 |
env->cansave++;
|
|
1228 |
env->canrestore--;
|
|
1229 |
set_cwp(cwp);
|
|
1230 | 1230 |
} |
1231 | 1231 |
FORCE_RET(); |
1232 | 1232 |
} |
... | ... | |
1576 | 1576 |
#define F_BINOP(name) \ |
1577 | 1577 |
F_OP(name, s) \ |
1578 | 1578 |
{ \ |
1579 |
set_float_exception_flags(0, &env->fp_status); \
|
|
1579 |
set_float_exception_flags(0, &env->fp_status); \
|
|
1580 | 1580 |
FT0 = float32_ ## name (FT0, FT1, &env->fp_status); \ |
1581 |
check_ieee_exceptions(); \
|
|
1581 |
check_ieee_exceptions(); \
|
|
1582 | 1582 |
} \ |
1583 | 1583 |
F_OP(name, d) \ |
1584 | 1584 |
{ \ |
1585 |
set_float_exception_flags(0, &env->fp_status); \
|
|
1585 |
set_float_exception_flags(0, &env->fp_status); \
|
|
1586 | 1586 |
DT0 = float64_ ## name (DT0, DT1, &env->fp_status); \ |
1587 |
check_ieee_exceptions(); \
|
|
1587 |
check_ieee_exceptions(); \
|
|
1588 | 1588 |
} |
1589 | 1589 |
|
1590 | 1590 |
F_BINOP(add); |
... | ... | |
1784 | 1784 |
void OPPROTO op_fmovs_cc(void) |
1785 | 1785 |
{ |
1786 | 1786 |
if (T2) |
1787 |
FT0 = FT1;
|
|
1787 |
FT0 = FT1;
|
|
1788 | 1788 |
} |
1789 | 1789 |
|
1790 | 1790 |
void OPPROTO op_fmovd_cc(void) |
1791 | 1791 |
{ |
1792 | 1792 |
if (T2) |
1793 |
DT0 = DT1;
|
|
1793 |
DT0 = DT1;
|
|
1794 | 1794 |
} |
1795 | 1795 |
|
1796 | 1796 |
void OPPROTO op_mov_cc(void) |
1797 | 1797 |
{ |
1798 | 1798 |
if (T2) |
1799 |
T0 = T1;
|
|
1799 |
T0 = T1;
|
|
1800 | 1800 |
} |
1801 | 1801 |
|
1802 | 1802 |
void OPPROTO op_flushw(void) |
1803 | 1803 |
{ |
1804 | 1804 |
if (env->cansave != NWINDOWS - 2) { |
1805 | 1805 |
raise_exception(TT_SPILL | (env->otherwin != 0 ? |
1806 |
(TT_WOTHER | ((env->wstate & 0x38) >> 1)):
|
|
1807 |
((env->wstate & 0x7) << 2)));
|
|
1806 |
(TT_WOTHER | ((env->wstate & 0x38) >> 1)):
|
|
1807 |
((env->wstate & 0x7) << 2)));
|
|
1808 | 1808 |
} |
1809 | 1809 |
} |
1810 | 1810 |
|
... | ... | |
1812 | 1812 |
{ |
1813 | 1813 |
env->cansave++; |
1814 | 1814 |
if (env->otherwin == 0) |
1815 |
env->canrestore--;
|
|
1815 |
env->canrestore--;
|
|
1816 | 1816 |
else |
1817 |
env->otherwin--;
|
|
1817 |
env->otherwin--;
|
|
1818 | 1818 |
FORCE_RET(); |
1819 | 1819 |
} |
1820 | 1820 |
|
... | ... | |
1822 | 1822 |
{ |
1823 | 1823 |
env->canrestore++; |
1824 | 1824 |
if (env->cleanwin < NWINDOWS - 1) |
1825 |
env->cleanwin++;
|
|
1825 |
env->cleanwin++;
|
|
1826 | 1826 |
if (env->otherwin == 0) |
1827 |
env->cansave--;
|
|
1827 |
env->cansave--;
|
|
1828 | 1828 |
else |
1829 |
env->otherwin--;
|
|
1829 |
env->otherwin--;
|
|
1830 | 1830 |
FORCE_RET(); |
1831 | 1831 |
} |
1832 | 1832 |
|
Also available in: Unified diff