32
32
#include "bcmath.h"
33
33
#include "convert.h"
34
34
#include "private.h"
35
- #include "simd .h"
35
+ #include "zend_simd .h"
36
36
#include <stdbool.h>
37
37
#include <stddef.h>
38
38
39
39
/* Convert strings to bc numbers. Base 10 only.*/
40
40
static inline const char * bc_count_digits (const char * str , const char * end )
41
41
{
42
42
/* 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 ZEND_HAVE_VECTOR_128
44
+ const __m128i offset = _mm_set1_epi8 ((signed char ) (SCHAR_MIN - '0' ));
45
45
/* 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' ));
47
47
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 );
50
50
/* Wrapping-add the offset to the bytes, such that all bytes below '0' are positive and others are negative.
51
51
* 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 );
53
53
/* 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 );
55
55
56
- int mask = bc_simd_movemask_8x16 (bytes );
56
+ int mask = _mm_movemask_epi8 (bytes );
57
57
if (mask != 0xffff ) {
58
58
/* At least one of the bytes is not within range. Move to the first offending byte. */
59
59
#ifdef PHP_HAVE_BUILTIN_CTZL
@@ -63,7 +63,7 @@ static inline const char *bc_count_digits(const char *str, const char *end)
63
63
#endif
64
64
}
65
65
66
- str += sizeof (bc_simd_128_t );
66
+ str += sizeof (__m128i );
67
67
}
68
68
#endif
69
69
@@ -77,19 +77,19 @@ static inline const char *bc_count_digits(const char *str, const char *end)
77
77
static inline const char * bc_skip_zero_reverse (const char * scanner , const char * stop )
78
78
{
79
79
/* 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 ZEND_HAVE_VECTOR_128
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 );
85
85
/* 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 );
87
87
88
- int mask = bc_simd_movemask_8x16 (bytes );
88
+ int mask = _mm_movemask_epi8 (bytes );
89
89
/* The probability of having 16 trailing 0s in a row is very low, so we use EXPECTED. */
90
90
if (EXPECTED (mask != 0xffff )) {
91
91
/* Move the pointer back and check each character in loop. */
92
- scanner += sizeof (bc_simd_128_t );
92
+ scanner += sizeof (__m128i );
93
93
break ;
94
94
}
95
95
}
0 commit comments