3030#include  "zend_property_hooks.h" 
3131#include  "zend_lazy_objects.h" 
3232
33- #include    <nmmintrin.h> 
34- # pragma   GCC push_options 
35- # pragma   GCC target ("sse4.2") 
33+ #ifdef    ZEND_INTRIN_SSE4_2_NATIVE 
34+ # include    <nmmintrin.h> 
35+ #endif  
3636
3737static  const  char  digits [] =  "0123456789abcdef" ;
3838
@@ -432,8 +432,7 @@ static zend_always_inline bool php_json_printable_ascii_escape(smart_str *buf, u
432432	return  true;
433433}
434434
435- #ifdef  __SSE2__ 
436- // TODO: may be unused 
435+ #ifdef  ZEND_INTRIN_SSE4_2_NATIVE 
437436static  zend_always_inline  __m128i  php_json_create_sse_escape_mask (int  options )
438437{
439438	const  char  sentinel  =  1 ; /* outside of the printable range, so no false matches are possible */ 
@@ -483,9 +482,8 @@ zend_result php_json_escape_string(
483482
484483	pos  =  0 ;
485484
486- #ifdef  __SSE2__ 
485+ #ifdef  ZEND_INTRIN_SSE4_2_NATIVE 
487486	const  __m128i  sse_escape_mask  =  php_json_create_sse_escape_mask (options );
488- 	(void ) sse_escape_mask ;
489487#endif 
490488
491489	do  {
@@ -505,7 +503,10 @@ zend_result php_json_escape_string(
505503				max_shift  =  __builtin_ctz (input_range_mask );
506504			}
507505
508- #if  0 
506+ #ifdef  ZEND_INTRIN_SSE4_2_NATIVE  /* TODO: resolver support */ 
507+ 			const  __m128i  result_individual_bytes  =  _mm_cmpistrm (sse_escape_mask , input , _SIDD_SBYTE_OPS  | _SIDD_CMP_EQUAL_ANY  | _SIDD_BIT_MASK );
508+ 			int  mask  =  _mm_cvtsi128_si32 (result_individual_bytes );
509+ #else 
509510			const  __m128i  result_34  =  _mm_cmpeq_epi8 (input , _mm_set1_epi8 ('"' ));
510511			const  __m128i  result_38  =  _mm_cmpeq_epi8 (input , _mm_set1_epi8 ('&' ));
511512			const  __m128i  result_39  =  _mm_cmpeq_epi8 (input , _mm_set1_epi8 ('\'' ));
@@ -523,9 +524,6 @@ zend_result php_json_escape_string(
523524
524525			const  __m128i  result_individual_bytes  =  _mm_or_si128 (result_34_38_39_47 , result_60_62_92 );
525526			int  mask  =  _mm_movemask_epi8 (result_individual_bytes );
526- #else 
527- 			const  __m128i  result_individual_bytes  =  _mm_cmpistrm (sse_escape_mask , input , _SIDD_SBYTE_OPS  | _SIDD_CMP_EQUAL_ANY  | _SIDD_BIT_MASK );
528- 			int  mask  =  _mm_cvtsi128_si32 (result_individual_bytes );
529527#endif 
530528			if  (mask  !=  0 ) {
531529				if  (max_shift  <  16 ) {
0 commit comments