@@ -30,6 +30,10 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3030
3131#include "fix_impl.h"
3232
33+ #ifdef USE_SSE
34+ #include <xmmintrin.h>
35+ #endif
36+
3337// message buffer handling
3438static
3539char * make_space (fix_parser * const parser , char * dest , unsigned extra_len )
@@ -103,9 +107,36 @@ bool copy_chunk(scanner_state* const state)
103107static
104108unsigned char copy_cs (char * restrict dest , const char * restrict src , unsigned n )
105109{
106- unsigned char cs = (* dest ++ = * src ++ );
110+ unsigned char cs = 0 ;
111+
112+ #ifdef USE_SSE
113+ if (n >= sizeof (__m128i ))
114+ {
115+ __m128i cs128 = _mm_loadu_si128 ((const __m128i * )src );
116+
117+ src += sizeof (__m128i );
118+ _mm_storeu_si128 ((__m128i * )dest , cs128 );
119+ dest += sizeof (__m128i );
120+
121+ while ((n -= sizeof (__m128i )) >= sizeof (__m128i ))
122+ {
123+ const __m128i tmp = _mm_loadu_si128 ((const __m128i * )src );
124+
125+ src += sizeof (__m128i );
126+ _mm_storeu_si128 ((__m128i * )dest , tmp );
127+ dest += sizeof (__m128i );
128+ cs128 = _mm_add_epi8 (cs128 , tmp );
129+ }
130+
131+ cs128 = _mm_add_epi8 (cs128 , _mm_srli_si128 (cs128 , 8 ));
132+ cs128 = _mm_add_epi8 (cs128 , _mm_srli_si128 (cs128 , 4 ));
133+ cs128 = _mm_add_epi8 (cs128 , _mm_srli_si128 (cs128 , 2 ));
134+ cs128 = _mm_add_epi8 (cs128 , _mm_srli_si128 (cs128 , 1 ));
135+ cs += _mm_extract_epi16 (cs128 , 0 ); // SSE4: _mm_extract_epi8 ?
136+ }
137+ #endif // #ifdef USE_SSE
107138
108- while (-- n > 0 )
139+ while (n -- > 0 )
109140 cs += (* dest ++ = * src ++ );
110141
111142 return cs ;
0 commit comments