Commit 0523c6b7c5605e93b1c9960a3a91d08535e9a77e
1 parent
39c61f49
FORCE_RET() fixes - fpu fixes
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1236 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
29 additions
and
21 deletions
target-i386/ops_sse.h
| ... | ... | @@ -61,6 +61,7 @@ void OPPROTO glue(op_psrlw, SUFFIX)(void) |
| 61 | 61 | d->W(7) >>= shift; |
| 62 | 62 | #endif |
| 63 | 63 | } |
| 64 | + FORCE_RET(); | |
| 64 | 65 | } |
| 65 | 66 | |
| 66 | 67 | void OPPROTO glue(op_psraw, SUFFIX)(void) |
| ... | ... | @@ -114,6 +115,7 @@ void OPPROTO glue(op_psllw, SUFFIX)(void) |
| 114 | 115 | d->W(7) <<= shift; |
| 115 | 116 | #endif |
| 116 | 117 | } |
| 118 | + FORCE_RET(); | |
| 117 | 119 | } |
| 118 | 120 | |
| 119 | 121 | void OPPROTO glue(op_psrld, SUFFIX)(void) |
| ... | ... | @@ -138,6 +140,7 @@ void OPPROTO glue(op_psrld, SUFFIX)(void) |
| 138 | 140 | d->L(3) >>= shift; |
| 139 | 141 | #endif |
| 140 | 142 | } |
| 143 | + FORCE_RET(); | |
| 141 | 144 | } |
| 142 | 145 | |
| 143 | 146 | void OPPROTO glue(op_psrad, SUFFIX)(void) |
| ... | ... | @@ -183,6 +186,7 @@ void OPPROTO glue(op_pslld, SUFFIX)(void) |
| 183 | 186 | d->L(3) <<= shift; |
| 184 | 187 | #endif |
| 185 | 188 | } |
| 189 | + FORCE_RET(); | |
| 186 | 190 | } |
| 187 | 191 | |
| 188 | 192 | void OPPROTO glue(op_psrlq, SUFFIX)(void) |
| ... | ... | @@ -205,6 +209,7 @@ void OPPROTO glue(op_psrlq, SUFFIX)(void) |
| 205 | 209 | d->Q(1) >>= shift; |
| 206 | 210 | #endif |
| 207 | 211 | } |
| 212 | + FORCE_RET(); | |
| 208 | 213 | } |
| 209 | 214 | |
| 210 | 215 | void OPPROTO glue(op_psllq, SUFFIX)(void) |
| ... | ... | @@ -227,6 +232,7 @@ void OPPROTO glue(op_psllq, SUFFIX)(void) |
| 227 | 232 | d->Q(1) <<= shift; |
| 228 | 233 | #endif |
| 229 | 234 | } |
| 235 | + FORCE_RET(); | |
| 230 | 236 | } |
| 231 | 237 | |
| 232 | 238 | #if SHIFT == 1 |
| ... | ... | @@ -478,6 +484,7 @@ void OPPROTO glue(op_pmaddwd, SUFFIX) (void) |
| 478 | 484 | d->L(i) = (int16_t)s->W(2*i) * (int16_t)d->W(2*i) + |
| 479 | 485 | (int16_t)s->W(2*i+1) * (int16_t)d->W(2*i+1); |
| 480 | 486 | } |
| 487 | + FORCE_RET(); | |
| 481 | 488 | } |
| 482 | 489 | |
| 483 | 490 | #if SHIFT == 0 |
| ... | ... | @@ -530,6 +537,7 @@ void OPPROTO glue(op_maskmov, SUFFIX) (void) |
| 530 | 537 | if (s->B(i) & 0x80) |
| 531 | 538 | stb(A0 + i, d->B(i)); |
| 532 | 539 | } |
| 540 | + FORCE_RET(); | |
| 533 | 541 | } |
| 534 | 542 | |
| 535 | 543 | void OPPROTO glue(op_movl_mm_T0, SUFFIX) (void) |
| ... | ... | @@ -682,7 +690,7 @@ void OPPROTO op_ ## name ## sd (void)\ |
| 682 | 690 | #define FPU_DIV(a, b) (a) / (b) |
| 683 | 691 | #define FPU_MIN(a, b) (a) < (b) ? (a) : (b) |
| 684 | 692 | #define FPU_MAX(a, b) (a) > (b) ? (a) : (b) |
| 685 | -#define FPU_SQRT(a, b) sqrt(b) | |
| 693 | +#define FPU_SQRT(a, b) helper_sqrt(b) | |
| 686 | 694 | |
| 687 | 695 | SSE_OP_S(add, FPU_ADD) |
| 688 | 696 | SSE_OP_S(sub, FPU_SUB) |
| ... | ... | @@ -702,8 +710,8 @@ void OPPROTO op_cvtps2pd(void) |
| 702 | 710 | s = (Reg *)((char *)env + PARAM2); |
| 703 | 711 | s0 = s->XMM_S(0); |
| 704 | 712 | s1 = s->XMM_S(1); |
| 705 | - d->XMM_D(0) = s0; | |
| 706 | - d->XMM_D(1) = s1; | |
| 713 | + d->XMM_D(0) = float32_to_float64(s0); | |
| 714 | + d->XMM_D(1) = float32_to_float64(s1); | |
| 707 | 715 | } |
| 708 | 716 | |
| 709 | 717 | void OPPROTO op_cvtpd2ps(void) |
| ... | ... | @@ -711,8 +719,8 @@ void OPPROTO op_cvtpd2ps(void) |
| 711 | 719 | Reg *d, *s; |
| 712 | 720 | d = (Reg *)((char *)env + PARAM1); |
| 713 | 721 | s = (Reg *)((char *)env + PARAM2); |
| 714 | - d->XMM_S(0) = s->XMM_D(0); | |
| 715 | - d->XMM_S(1) = s->XMM_D(1); | |
| 722 | + d->XMM_S(0) = float64_to_float32(s->XMM_D(0)); | |
| 723 | + d->XMM_S(1) = float64_to_float32(s->XMM_D(1)); | |
| 716 | 724 | d->Q(1) = 0; |
| 717 | 725 | } |
| 718 | 726 | |
| ... | ... | @@ -721,7 +729,7 @@ void OPPROTO op_cvtss2sd(void) |
| 721 | 729 | Reg *d, *s; |
| 722 | 730 | d = (Reg *)((char *)env + PARAM1); |
| 723 | 731 | s = (Reg *)((char *)env + PARAM2); |
| 724 | - d->XMM_D(0) = s->XMM_S(0); | |
| 732 | + d->XMM_D(0) = float32_to_float64(s->XMM_S(0)); | |
| 725 | 733 | } |
| 726 | 734 | |
| 727 | 735 | void OPPROTO op_cvtsd2ss(void) |
| ... | ... | @@ -729,7 +737,7 @@ void OPPROTO op_cvtsd2ss(void) |
| 729 | 737 | Reg *d, *s; |
| 730 | 738 | d = (Reg *)((char *)env + PARAM1); |
| 731 | 739 | s = (Reg *)((char *)env + PARAM2); |
| 732 | - d->XMM_S(0) = s->XMM_D(0); | |
| 740 | + d->XMM_S(0) = float64_to_float32(s->XMM_D(0)); | |
| 733 | 741 | } |
| 734 | 742 | |
| 735 | 743 | /* integer to float */ |
| ... | ... | @@ -737,10 +745,10 @@ void OPPROTO op_cvtdq2ps(void) |
| 737 | 745 | { |
| 738 | 746 | XMMReg *d = (XMMReg *)((char *)env + PARAM1); |
| 739 | 747 | XMMReg *s = (XMMReg *)((char *)env + PARAM2); |
| 740 | - d->XMM_S(0) = (int32_t)s->XMM_L(0); | |
| 741 | - d->XMM_S(1) = (int32_t)s->XMM_L(1); | |
| 742 | - d->XMM_S(2) = (int32_t)s->XMM_L(2); | |
| 743 | - d->XMM_S(3) = (int32_t)s->XMM_L(3); | |
| 748 | + d->XMM_S(0) = int32_to_float32(s->XMM_L(0)); | |
| 749 | + d->XMM_S(1) = int32_to_float32(s->XMM_L(1)); | |
| 750 | + d->XMM_S(2) = int32_to_float32(s->XMM_L(2)); | |
| 751 | + d->XMM_S(3) = int32_to_float32(s->XMM_L(3)); | |
| 744 | 752 | } |
| 745 | 753 | |
| 746 | 754 | void OPPROTO op_cvtdq2pd(void) |
| ... | ... | @@ -750,49 +758,49 @@ void OPPROTO op_cvtdq2pd(void) |
| 750 | 758 | int32_t l0, l1; |
| 751 | 759 | l0 = (int32_t)s->XMM_L(0); |
| 752 | 760 | l1 = (int32_t)s->XMM_L(1); |
| 753 | - d->XMM_D(0) = l0; | |
| 754 | - d->XMM_D(1) = l1; | |
| 761 | + d->XMM_D(0) = int32_to_float64(l0); | |
| 762 | + d->XMM_D(1) = int32_to_float64(l1); | |
| 755 | 763 | } |
| 756 | 764 | |
| 757 | 765 | void OPPROTO op_cvtpi2ps(void) |
| 758 | 766 | { |
| 759 | 767 | XMMReg *d = (Reg *)((char *)env + PARAM1); |
| 760 | 768 | MMXReg *s = (MMXReg *)((char *)env + PARAM2); |
| 761 | - d->XMM_S(0) = (int32_t)s->MMX_L(0); | |
| 762 | - d->XMM_S(1) = (int32_t)s->MMX_L(1); | |
| 769 | + d->XMM_S(0) = int32_to_float32(s->MMX_L(0)); | |
| 770 | + d->XMM_S(1) = int32_to_float32(s->MMX_L(1)); | |
| 763 | 771 | } |
| 764 | 772 | |
| 765 | 773 | void OPPROTO op_cvtpi2pd(void) |
| 766 | 774 | { |
| 767 | 775 | XMMReg *d = (Reg *)((char *)env + PARAM1); |
| 768 | 776 | MMXReg *s = (MMXReg *)((char *)env + PARAM2); |
| 769 | - d->XMM_D(0) = (int32_t)s->MMX_L(0); | |
| 770 | - d->XMM_D(1) = (int32_t)s->MMX_L(1); | |
| 777 | + d->XMM_D(0) = int32_to_float64(s->MMX_L(0)); | |
| 778 | + d->XMM_D(1) = int32_to_float64(s->MMX_L(1)); | |
| 771 | 779 | } |
| 772 | 780 | |
| 773 | 781 | void OPPROTO op_cvtsi2ss(void) |
| 774 | 782 | { |
| 775 | 783 | XMMReg *d = (Reg *)((char *)env + PARAM1); |
| 776 | - d->XMM_S(0) = (int32_t)T0; | |
| 784 | + d->XMM_S(0) = int32_to_float32(T0); | |
| 777 | 785 | } |
| 778 | 786 | |
| 779 | 787 | void OPPROTO op_cvtsi2sd(void) |
| 780 | 788 | { |
| 781 | 789 | XMMReg *d = (Reg *)((char *)env + PARAM1); |
| 782 | - d->XMM_D(0) = (int32_t)T0; | |
| 790 | + d->XMM_D(0) = int32_to_float64(T0); | |
| 783 | 791 | } |
| 784 | 792 | |
| 785 | 793 | #ifdef TARGET_X86_64 |
| 786 | 794 | void OPPROTO op_cvtsq2ss(void) |
| 787 | 795 | { |
| 788 | 796 | XMMReg *d = (Reg *)((char *)env + PARAM1); |
| 789 | - d->XMM_S(0) = (int64_t)T0; | |
| 797 | + d->XMM_S(0) = int64_to_float32(T0); | |
| 790 | 798 | } |
| 791 | 799 | |
| 792 | 800 | void OPPROTO op_cvtsq2sd(void) |
| 793 | 801 | { |
| 794 | 802 | XMMReg *d = (Reg *)((char *)env + PARAM1); |
| 795 | - d->XMM_D(0) = (int64_t)T0; | |
| 803 | + d->XMM_D(0) = int64_to_float64(T0); | |
| 796 | 804 | } |
| 797 | 805 | #endif |
| 798 | 806 | ... | ... |