16#include <freerdp/config.h>
18#include <freerdp/types.h>
19#include <freerdp/primitives.h>
20#include <winpr/sysinfo.h>
24#include "prim_internal.h"
25#include "prim_avxsse.h"
27#if defined(SSE_AVX_INTRINSICS_ENABLED)
34static pstatus_t ssse3_sign_16s(
const INT16* WINPR_RESTRICT pSrc, INT16* WINPR_RESTRICT pDst,
38 const INT16* sptr = pSrc;
44 return generic->sign_16s(pSrc, pDst, ulen);
48 if ((ULONG_PTR)pDst & 0x01)
50 return generic->sign_16s(pSrc, pDst, ulen);
54 while ((ULONG_PTR)dptr & 0x0f)
57 *dptr++ = WINPR_ASSERTING_INT_CAST(int16_t, (src < 0) ? (-1) : ((src > 0) ? 1 : 0));
60 return PRIMITIVES_SUCCESS;
67 if ((ULONG_PTR)sptr & 0x0f)
80 xmm0 = _mm_set1_epi16(0x0001U);
81 xmm1 = _mm_set1_epi16(0x0001U);
82 xmm2 = _mm_set1_epi16(0x0001U);
83 xmm3 = _mm_set1_epi16(0x0001U);
84 xmm4 = LOAD_SI128(sptr);
86 xmm5 = LOAD_SI128(sptr);
88 xmm6 = LOAD_SI128(sptr);
90 xmm7 = LOAD_SI128(sptr);
92 xmm0 = _mm_sign_epi16(xmm0, xmm4);
93 xmm1 = _mm_sign_epi16(xmm1, xmm5);
94 xmm2 = _mm_sign_epi16(xmm2, xmm6);
95 xmm3 = _mm_sign_epi16(xmm3, xmm7);
96 STORE_SI128(dptr, xmm0);
98 STORE_SI128(dptr, xmm1);
100 STORE_SI128(dptr, xmm2);
102 STORE_SI128(dptr, xmm3);
119 xmm0 = _mm_set1_epi16(0x0001U);
120 xmm1 = _mm_set1_epi16(0x0001U);
121 xmm2 = _mm_set1_epi16(0x0001U);
122 xmm3 = _mm_set1_epi16(0x0001U);
123 xmm4 = LOAD_SI128(sptr);
125 xmm5 = LOAD_SI128(sptr);
127 xmm6 = LOAD_SI128(sptr);
129 xmm7 = LOAD_SI128(sptr);
131 xmm0 = _mm_sign_epi16(xmm0, xmm4);
132 xmm1 = _mm_sign_epi16(xmm1, xmm5);
133 xmm2 = _mm_sign_epi16(xmm2, xmm6);
134 xmm3 = _mm_sign_epi16(xmm3, xmm7);
135 STORE_SI128(dptr, xmm0);
137 STORE_SI128(dptr, xmm1);
139 STORE_SI128(dptr, xmm2);
141 STORE_SI128(dptr, xmm3);
152 __m128i xmm0 = _mm_set1_epi16(0x0001U);
153 __m128i xmm1 = LOAD_SI128(sptr);
155 xmm0 = _mm_sign_epi16(xmm0, xmm1);
156 STORE_SI128(dptr, xmm0);
164 *dptr++ = WINPR_ASSERTING_INT_CAST(int16_t, (src < 0) ? -1 : ((src > 0) ? 1 : 0));
167 return PRIMITIVES_SUCCESS;
173void primitives_init_sign_ssse3_int(
primitives_t* WINPR_RESTRICT prims)
175#if defined(SSE_AVX_INTRINSICS_ENABLED)
176 generic = primitives_get_generic();
181 WLog_VRB(PRIM_TAG,
"SSE3/SSSE3 optimizations");
182 prims->sign_16s = ssse3_sign_16s;
185 WLog_VRB(PRIM_TAG,
"undefined WITH_SIMD or SSSE3/SSE3 intrinsics not available");