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,6 +61,7 @@ void OPPROTO glue(op_psrlw, SUFFIX)(void) | ||
61 | d->W(7) >>= shift; | 61 | d->W(7) >>= shift; |
62 | #endif | 62 | #endif |
63 | } | 63 | } |
64 | + FORCE_RET(); | ||
64 | } | 65 | } |
65 | 66 | ||
66 | void OPPROTO glue(op_psraw, SUFFIX)(void) | 67 | void OPPROTO glue(op_psraw, SUFFIX)(void) |
@@ -114,6 +115,7 @@ void OPPROTO glue(op_psllw, SUFFIX)(void) | @@ -114,6 +115,7 @@ void OPPROTO glue(op_psllw, SUFFIX)(void) | ||
114 | d->W(7) <<= shift; | 115 | d->W(7) <<= shift; |
115 | #endif | 116 | #endif |
116 | } | 117 | } |
118 | + FORCE_RET(); | ||
117 | } | 119 | } |
118 | 120 | ||
119 | void OPPROTO glue(op_psrld, SUFFIX)(void) | 121 | void OPPROTO glue(op_psrld, SUFFIX)(void) |
@@ -138,6 +140,7 @@ void OPPROTO glue(op_psrld, SUFFIX)(void) | @@ -138,6 +140,7 @@ void OPPROTO glue(op_psrld, SUFFIX)(void) | ||
138 | d->L(3) >>= shift; | 140 | d->L(3) >>= shift; |
139 | #endif | 141 | #endif |
140 | } | 142 | } |
143 | + FORCE_RET(); | ||
141 | } | 144 | } |
142 | 145 | ||
143 | void OPPROTO glue(op_psrad, SUFFIX)(void) | 146 | void OPPROTO glue(op_psrad, SUFFIX)(void) |
@@ -183,6 +186,7 @@ void OPPROTO glue(op_pslld, SUFFIX)(void) | @@ -183,6 +186,7 @@ void OPPROTO glue(op_pslld, SUFFIX)(void) | ||
183 | d->L(3) <<= shift; | 186 | d->L(3) <<= shift; |
184 | #endif | 187 | #endif |
185 | } | 188 | } |
189 | + FORCE_RET(); | ||
186 | } | 190 | } |
187 | 191 | ||
188 | void OPPROTO glue(op_psrlq, SUFFIX)(void) | 192 | void OPPROTO glue(op_psrlq, SUFFIX)(void) |
@@ -205,6 +209,7 @@ void OPPROTO glue(op_psrlq, SUFFIX)(void) | @@ -205,6 +209,7 @@ void OPPROTO glue(op_psrlq, SUFFIX)(void) | ||
205 | d->Q(1) >>= shift; | 209 | d->Q(1) >>= shift; |
206 | #endif | 210 | #endif |
207 | } | 211 | } |
212 | + FORCE_RET(); | ||
208 | } | 213 | } |
209 | 214 | ||
210 | void OPPROTO glue(op_psllq, SUFFIX)(void) | 215 | void OPPROTO glue(op_psllq, SUFFIX)(void) |
@@ -227,6 +232,7 @@ void OPPROTO glue(op_psllq, SUFFIX)(void) | @@ -227,6 +232,7 @@ void OPPROTO glue(op_psllq, SUFFIX)(void) | ||
227 | d->Q(1) <<= shift; | 232 | d->Q(1) <<= shift; |
228 | #endif | 233 | #endif |
229 | } | 234 | } |
235 | + FORCE_RET(); | ||
230 | } | 236 | } |
231 | 237 | ||
232 | #if SHIFT == 1 | 238 | #if SHIFT == 1 |
@@ -478,6 +484,7 @@ void OPPROTO glue(op_pmaddwd, SUFFIX) (void) | @@ -478,6 +484,7 @@ void OPPROTO glue(op_pmaddwd, SUFFIX) (void) | ||
478 | d->L(i) = (int16_t)s->W(2*i) * (int16_t)d->W(2*i) + | 484 | d->L(i) = (int16_t)s->W(2*i) * (int16_t)d->W(2*i) + |
479 | (int16_t)s->W(2*i+1) * (int16_t)d->W(2*i+1); | 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 | #if SHIFT == 0 | 490 | #if SHIFT == 0 |
@@ -530,6 +537,7 @@ void OPPROTO glue(op_maskmov, SUFFIX) (void) | @@ -530,6 +537,7 @@ void OPPROTO glue(op_maskmov, SUFFIX) (void) | ||
530 | if (s->B(i) & 0x80) | 537 | if (s->B(i) & 0x80) |
531 | stb(A0 + i, d->B(i)); | 538 | stb(A0 + i, d->B(i)); |
532 | } | 539 | } |
540 | + FORCE_RET(); | ||
533 | } | 541 | } |
534 | 542 | ||
535 | void OPPROTO glue(op_movl_mm_T0, SUFFIX) (void) | 543 | void OPPROTO glue(op_movl_mm_T0, SUFFIX) (void) |
@@ -682,7 +690,7 @@ void OPPROTO op_ ## name ## sd (void)\ | @@ -682,7 +690,7 @@ void OPPROTO op_ ## name ## sd (void)\ | ||
682 | #define FPU_DIV(a, b) (a) / (b) | 690 | #define FPU_DIV(a, b) (a) / (b) |
683 | #define FPU_MIN(a, b) (a) < (b) ? (a) : (b) | 691 | #define FPU_MIN(a, b) (a) < (b) ? (a) : (b) |
684 | #define FPU_MAX(a, b) (a) > (b) ? (a) : (b) | 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 | SSE_OP_S(add, FPU_ADD) | 695 | SSE_OP_S(add, FPU_ADD) |
688 | SSE_OP_S(sub, FPU_SUB) | 696 | SSE_OP_S(sub, FPU_SUB) |
@@ -702,8 +710,8 @@ void OPPROTO op_cvtps2pd(void) | @@ -702,8 +710,8 @@ void OPPROTO op_cvtps2pd(void) | ||
702 | s = (Reg *)((char *)env + PARAM2); | 710 | s = (Reg *)((char *)env + PARAM2); |
703 | s0 = s->XMM_S(0); | 711 | s0 = s->XMM_S(0); |
704 | s1 = s->XMM_S(1); | 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 | void OPPROTO op_cvtpd2ps(void) | 717 | void OPPROTO op_cvtpd2ps(void) |
@@ -711,8 +719,8 @@ void OPPROTO op_cvtpd2ps(void) | @@ -711,8 +719,8 @@ void OPPROTO op_cvtpd2ps(void) | ||
711 | Reg *d, *s; | 719 | Reg *d, *s; |
712 | d = (Reg *)((char *)env + PARAM1); | 720 | d = (Reg *)((char *)env + PARAM1); |
713 | s = (Reg *)((char *)env + PARAM2); | 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 | d->Q(1) = 0; | 724 | d->Q(1) = 0; |
717 | } | 725 | } |
718 | 726 | ||
@@ -721,7 +729,7 @@ void OPPROTO op_cvtss2sd(void) | @@ -721,7 +729,7 @@ void OPPROTO op_cvtss2sd(void) | ||
721 | Reg *d, *s; | 729 | Reg *d, *s; |
722 | d = (Reg *)((char *)env + PARAM1); | 730 | d = (Reg *)((char *)env + PARAM1); |
723 | s = (Reg *)((char *)env + PARAM2); | 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 | void OPPROTO op_cvtsd2ss(void) | 735 | void OPPROTO op_cvtsd2ss(void) |
@@ -729,7 +737,7 @@ void OPPROTO op_cvtsd2ss(void) | @@ -729,7 +737,7 @@ void OPPROTO op_cvtsd2ss(void) | ||
729 | Reg *d, *s; | 737 | Reg *d, *s; |
730 | d = (Reg *)((char *)env + PARAM1); | 738 | d = (Reg *)((char *)env + PARAM1); |
731 | s = (Reg *)((char *)env + PARAM2); | 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 | /* integer to float */ | 743 | /* integer to float */ |
@@ -737,10 +745,10 @@ void OPPROTO op_cvtdq2ps(void) | @@ -737,10 +745,10 @@ void OPPROTO op_cvtdq2ps(void) | ||
737 | { | 745 | { |
738 | XMMReg *d = (XMMReg *)((char *)env + PARAM1); | 746 | XMMReg *d = (XMMReg *)((char *)env + PARAM1); |
739 | XMMReg *s = (XMMReg *)((char *)env + PARAM2); | 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 | void OPPROTO op_cvtdq2pd(void) | 754 | void OPPROTO op_cvtdq2pd(void) |
@@ -750,49 +758,49 @@ void OPPROTO op_cvtdq2pd(void) | @@ -750,49 +758,49 @@ void OPPROTO op_cvtdq2pd(void) | ||
750 | int32_t l0, l1; | 758 | int32_t l0, l1; |
751 | l0 = (int32_t)s->XMM_L(0); | 759 | l0 = (int32_t)s->XMM_L(0); |
752 | l1 = (int32_t)s->XMM_L(1); | 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 | void OPPROTO op_cvtpi2ps(void) | 765 | void OPPROTO op_cvtpi2ps(void) |
758 | { | 766 | { |
759 | XMMReg *d = (Reg *)((char *)env + PARAM1); | 767 | XMMReg *d = (Reg *)((char *)env + PARAM1); |
760 | MMXReg *s = (MMXReg *)((char *)env + PARAM2); | 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 | void OPPROTO op_cvtpi2pd(void) | 773 | void OPPROTO op_cvtpi2pd(void) |
766 | { | 774 | { |
767 | XMMReg *d = (Reg *)((char *)env + PARAM1); | 775 | XMMReg *d = (Reg *)((char *)env + PARAM1); |
768 | MMXReg *s = (MMXReg *)((char *)env + PARAM2); | 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 | void OPPROTO op_cvtsi2ss(void) | 781 | void OPPROTO op_cvtsi2ss(void) |
774 | { | 782 | { |
775 | XMMReg *d = (Reg *)((char *)env + PARAM1); | 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 | void OPPROTO op_cvtsi2sd(void) | 787 | void OPPROTO op_cvtsi2sd(void) |
780 | { | 788 | { |
781 | XMMReg *d = (Reg *)((char *)env + PARAM1); | 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 | #ifdef TARGET_X86_64 | 793 | #ifdef TARGET_X86_64 |
786 | void OPPROTO op_cvtsq2ss(void) | 794 | void OPPROTO op_cvtsq2ss(void) |
787 | { | 795 | { |
788 | XMMReg *d = (Reg *)((char *)env + PARAM1); | 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 | void OPPROTO op_cvtsq2sd(void) | 800 | void OPPROTO op_cvtsq2sd(void) |
793 | { | 801 | { |
794 | XMMReg *d = (Reg *)((char *)env + PARAM1); | 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 | #endif | 805 | #endif |
798 | 806 |