631 {
632 v4sf xmm1, xmm2, xmm3 = _mm_setzero_ps(), sign_bit_sin, y;
633#ifdef USE_SSE2
634 v4si emm0, emm2, emm4;
635#else
636 v2si mm0, mm1, mm2, mm3, mm4, mm5;
637#endif
638 sign_bit_sin = x;
639
640 x = _mm_and_ps(x, *(
v4sf*)_ps_inv_sign_mask);
641
642 sign_bit_sin = _mm_and_ps(sign_bit_sin, *(
v4sf*)_ps_sign_mask);
643
644
645 y = _mm_mul_ps(x, *(
v4sf*)_ps_cephes_FOPI);
646
647#ifdef USE_SSE2
648
649 emm2 = _mm_cvttps_epi32(y);
650
651
652 emm2 = _mm_add_epi32(emm2, *(v4si*)_pi32_1);
653 emm2 = _mm_and_si128(emm2, *(v4si*)_pi32_inv1);
654 y = _mm_cvtepi32_ps(emm2);
655
656 emm4 = emm2;
657
658
659 emm0 = _mm_and_si128(emm2, *(v4si*)_pi32_4);
660 emm0 = _mm_slli_epi32(emm0, 29);
661 v4sf swap_sign_bit_sin = _mm_castsi128_ps(emm0);
662
663
664 emm2 = _mm_and_si128(emm2, *(v4si*)_pi32_2);
665 emm2 = _mm_cmpeq_epi32(emm2, _mm_setzero_si128());
666 v4sf poly_mask = _mm_castsi128_ps(emm2);
667#else
668
669 xmm3 = _mm_movehl_ps(xmm3, y);
670 mm2 = _mm_cvttps_pi32(y);
671 mm3 = _mm_cvttps_pi32(xmm3);
672
673
674 mm2 = _mm_add_pi32(mm2, *(
v2si*)_pi32_1);
675 mm3 = _mm_add_pi32(mm3, *(
v2si*)_pi32_1);
676 mm2 = _mm_and_si64(mm2, *(
v2si*)_pi32_inv1);
677 mm3 = _mm_and_si64(mm3, *(
v2si*)_pi32_inv1);
678
679 y = _mm_cvtpi32x2_ps(mm2, mm3);
680
681 mm4 = mm2;
682 mm5 = mm3;
683
684
685 mm0 = _mm_and_si64(mm2, *(
v2si*)_pi32_4);
686 mm1 = _mm_and_si64(mm3, *(
v2si*)_pi32_4);
687 mm0 = _mm_slli_pi32(mm0, 29);
688 mm1 = _mm_slli_pi32(mm1, 29);
689 v4sf swap_sign_bit_sin;
691
692
693
694 mm2 = _mm_and_si64(mm2, *(
v2si*)_pi32_2);
695 mm3 = _mm_and_si64(mm3, *(
v2si*)_pi32_2);
696 mm2 = _mm_cmpeq_pi32(mm2, _mm_setzero_si64());
697 mm3 = _mm_cmpeq_pi32(mm3, _mm_setzero_si64());
700#endif
701
702
703
704 xmm1 = *(
v4sf*)_ps_minus_cephes_DP1;
705 xmm2 = *(
v4sf*)_ps_minus_cephes_DP2;
706 xmm3 = *(
v4sf*)_ps_minus_cephes_DP3;
707 xmm1 = _mm_mul_ps(y, xmm1);
708 xmm2 = _mm_mul_ps(y, xmm2);
709 xmm3 = _mm_mul_ps(y, xmm3);
710 x = _mm_add_ps(x, xmm1);
711 x = _mm_add_ps(x, xmm2);
712 x = _mm_add_ps(x, xmm3);
713
714#ifdef USE_SSE2
715 emm4 = _mm_sub_epi32(emm4, *(v4si*)_pi32_2);
716 emm4 = _mm_andnot_si128(emm4, *(v4si*)_pi32_4);
717 emm4 = _mm_slli_epi32(emm4, 29);
718 v4sf sign_bit_cos = _mm_castsi128_ps(emm4);
719#else
720
721 mm4 = _mm_sub_pi32(mm4, *(
v2si*)_pi32_2);
722 mm5 = _mm_sub_pi32(mm5, *(
v2si*)_pi32_2);
723 mm4 = _mm_andnot_si64(mm4, *(
v2si*)_pi32_4);
724 mm5 = _mm_andnot_si64(mm5, *(
v2si*)_pi32_4);
725 mm4 = _mm_slli_pi32(mm4, 29);
726 mm5 = _mm_slli_pi32(mm5, 29);
729 _mm_empty();
730#endif
731
732 sign_bit_sin = _mm_xor_ps(sign_bit_sin, swap_sign_bit_sin);
733
734
735
736 v4sf z = _mm_mul_ps(x,x);
737 y = *(
v4sf*)_ps_coscof_p0;
738
739 y = _mm_mul_ps(y, z);
740 y = _mm_add_ps(y, *(
v4sf*)_ps_coscof_p1);
741 y = _mm_mul_ps(y, z);
742 y = _mm_add_ps(y, *(
v4sf*)_ps_coscof_p2);
743 y = _mm_mul_ps(y, z);
744 y = _mm_mul_ps(y, z);
745 v4sf tmp = _mm_mul_ps(z, *(
v4sf*)_ps_0p5);
746 y = _mm_sub_ps(y, tmp);
747 y = _mm_add_ps(y, *(
v4sf*)_ps_1);
748
749
750
752 y2 = _mm_mul_ps(y2, z);
753 y2 = _mm_add_ps(y2, *(
v4sf*)_ps_sincof_p1);
754 y2 = _mm_mul_ps(y2, z);
755 y2 = _mm_add_ps(y2, *(
v4sf*)_ps_sincof_p2);
756 y2 = _mm_mul_ps(y2, z);
757 y2 = _mm_mul_ps(y2, x);
758 y2 = _mm_add_ps(y2, x);
759
760
761 xmm3 = poly_mask;
762 v4sf ysin2 = _mm_and_ps(xmm3, y2);
763 v4sf ysin1 = _mm_andnot_ps(xmm3, y);
764 y2 = _mm_sub_ps(y2,ysin2);
765 y = _mm_sub_ps(y, ysin1);
766
767 xmm1 = _mm_add_ps(ysin1,ysin2);
768 xmm2 = _mm_add_ps(y,y2);
769
770
771 *s = _mm_xor_ps(xmm1, sign_bit_sin);
772 *c = _mm_xor_ps(xmm2, sign_bit_cos);
773}