17#include <freerdp/config.h>
20#include <freerdp/types.h>
21#include <freerdp/primitives.h>
22#include <winpr/sysinfo.h>
24#include "prim_internal.h"
25#include "prim_avxsse.h"
29#if defined(SSE_AVX_INTRINSICS_ENABLED)
34static pstatus_t sse2_set_8u(BYTE val, BYTE* WINPR_RESTRICT pDst, UINT32 ulen)
43 return generic->set_8u(val, pDst, ulen);
49 while ((ULONG_PTR)dptr & 0x0f)
54 return PRIMITIVES_SUCCESS;
57 xmm0 = mm_set1_epu8(
byte);
65 STORE_SI128(dptr, xmm0);
67 STORE_SI128(dptr, xmm0);
69 STORE_SI128(dptr, xmm0);
71 STORE_SI128(dptr, xmm0);
73 STORE_SI128(dptr, xmm0);
75 STORE_SI128(dptr, xmm0);
77 STORE_SI128(dptr, xmm0);
79 STORE_SI128(dptr, xmm0);
81 STORE_SI128(dptr, xmm0);
83 STORE_SI128(dptr, xmm0);
85 STORE_SI128(dptr, xmm0);
87 STORE_SI128(dptr, xmm0);
89 STORE_SI128(dptr, xmm0);
91 STORE_SI128(dptr, xmm0);
93 STORE_SI128(dptr, xmm0);
95 STORE_SI128(dptr, xmm0);
106 STORE_SI128(dptr, xmm0);
114 return PRIMITIVES_SUCCESS;
118static pstatus_t sse2_set_32u(UINT32 val, UINT32* WINPR_RESTRICT pDst, UINT32 ulen)
132 return PRIMITIVES_SUCCESS;
136 if (((ULONG_PTR)dptr & 0x03) != 0)
138 return prim->set_32u(val, pDst, ulen);
142 while ((ULONG_PTR)dptr & 0x0f)
147 return PRIMITIVES_SUCCESS;
150 xmm0 = mm_set1_epu32(val);
158 STORE_SI128(dptr, xmm0);
160 STORE_SI128(dptr, xmm0);
162 STORE_SI128(dptr, xmm0);
164 STORE_SI128(dptr, xmm0);
166 STORE_SI128(dptr, xmm0);
168 STORE_SI128(dptr, xmm0);
170 STORE_SI128(dptr, xmm0);
172 STORE_SI128(dptr, xmm0);
174 STORE_SI128(dptr, xmm0);
176 STORE_SI128(dptr, xmm0);
178 STORE_SI128(dptr, xmm0);
180 STORE_SI128(dptr, xmm0);
182 STORE_SI128(dptr, xmm0);
184 STORE_SI128(dptr, xmm0);
186 STORE_SI128(dptr, xmm0);
188 STORE_SI128(dptr, xmm0);
199 STORE_SI128(dptr, xmm0);
207 return PRIMITIVES_SUCCESS;
211static pstatus_t sse2_set_32s(INT32 val, INT32* WINPR_RESTRICT pDst, UINT32 len)
213 UINT32 uval = *((UINT32*)&val);
214 return sse2_set_32u(uval, (UINT32*)pDst, len);
219void primitives_init_set_sse2_int(
primitives_t* WINPR_RESTRICT prims)
221#if defined(SSE_AVX_INTRINSICS_ENABLED)
222 generic = primitives_get_generic();
226 WLog_VRB(PRIM_TAG,
"SSE2 optimizations");
227 prims->set_8u = sse2_set_8u;
228 prims->set_32s = sse2_set_32s;
229 prims->set_32u = sse2_set_32u;
232 WLog_VRB(PRIM_TAG,
"undefined WITH_SIMD or SSE2 intrinsics not available");