3232#include "bcmath.h"
3333#include "convert.h"
3434#include "private.h"
35- #include "simd .h"
35+ #include "xsse .h"
3636#include <stdbool.h>
3737#include <stddef.h>
3838
3939/* Convert strings to bc numbers. Base 10 only.*/
4040static inline const char * bc_count_digits (const char * str , const char * end )
4141{
4242 /* Process in bulk */
43- #ifdef HAVE_BC_SIMD_128
44- const bc_simd_128_t offset = bc_simd_set_8x16 ((signed char ) (SCHAR_MIN - '0' ));
43+ #ifdef XSSE2
44+ const __m128i offset = _mm_set1_epi8 ((signed char ) (SCHAR_MIN - '0' ));
4545 /* we use the less than comparator, so add 1 */
46- const bc_simd_128_t threshold = bc_simd_set_8x16 (SCHAR_MIN + ('9' + 1 - '0' ));
46+ const __m128i threshold = _mm_set1_epi8 (SCHAR_MIN + ('9' + 1 - '0' ));
4747
48- while (str + sizeof (bc_simd_128_t ) <= end ) {
49- bc_simd_128_t bytes = bc_simd_load_8x16 ((const bc_simd_128_t * ) str );
48+ while (str + sizeof (__m128i ) <= end ) {
49+ __m128i bytes = _mm_loadu_si128 ((const __m128i * ) str );
5050 /* Wrapping-add the offset to the bytes, such that all bytes below '0' are positive and others are negative.
5151 * More specifically, '0' will be -128 and '9' will be -119. */
52- bytes = bc_simd_add_8x16 (bytes , offset );
52+ bytes = _mm_add_epi8 (bytes , offset );
5353 /* Now mark all bytes that are <= '9', i.e. <= -119, i.e. < -118, i.e. the threshold. */
54- bytes = bc_simd_cmplt_8x16 (bytes , threshold );
54+ bytes = _mm_cmplt_epi8 (bytes , threshold );
5555
56- int mask = bc_simd_movemask_8x16 (bytes );
56+ int mask = _mm_movemask_epi8 (bytes );
5757 if (mask != 0xffff ) {
5858 /* At least one of the bytes is not within range. Move to the first offending byte. */
5959#ifdef PHP_HAVE_BUILTIN_CTZL
@@ -63,7 +63,7 @@ static inline const char *bc_count_digits(const char *str, const char *end)
6363#endif
6464 }
6565
66- str += sizeof (bc_simd_128_t );
66+ str += sizeof (__m128i );
6767 }
6868#endif
6969
@@ -77,19 +77,19 @@ static inline const char *bc_count_digits(const char *str, const char *end)
7777static inline const char * bc_skip_zero_reverse (const char * scanner , const char * stop )
7878{
7979 /* Check in bulk */
80- #ifdef HAVE_BC_SIMD_128
81- const bc_simd_128_t c_zero_repeat = bc_simd_set_8x16 ('0' );
82- while (scanner - sizeof (bc_simd_128_t ) >= stop ) {
83- scanner -= sizeof (bc_simd_128_t );
84- bc_simd_128_t bytes = bc_simd_load_8x16 ((const bc_simd_128_t * ) scanner );
80+ #ifdef XSSE2
81+ const __m128i c_zero_repeat = _mm_set1_epi8 ('0' );
82+ while (scanner - sizeof (__m128i ) >= stop ) {
83+ scanner -= sizeof (__m128i );
84+ __m128i bytes = _mm_loadu_si128 ((const __m128i * ) scanner );
8585 /* Checks if all numeric strings are equal to '0'. */
86- bytes = bc_simd_cmpeq_8x16 (bytes , c_zero_repeat );
86+ bytes = _mm_cmpeq_epi8 (bytes , c_zero_repeat );
8787
88- int mask = bc_simd_movemask_8x16 (bytes );
88+ int mask = _mm_movemask_epi8 (bytes );
8989 /* The probability of having 16 trailing 0s in a row is very low, so we use EXPECTED. */
9090 if (EXPECTED (mask != 0xffff )) {
9191 /* Move the pointer back and check each character in loop. */
92- scanner += sizeof (bc_simd_128_t );
92+ scanner += sizeof (__m128i );
9393 break ;
9494 }
9595 }
0 commit comments