31
31
# include <mmintrin.h>
32
32
# include <emmintrin.h>
33
33
#endif
34
+ #if defined(__AVX2__ )
35
+ # include <immintrin.h>
36
+ #endif
37
+ #if defined(__aarch64__ ) || defined(_M_ARM64 )
38
+ # include <arm_neon.h>
39
+ #endif
34
40
35
41
#ifdef WORDS_BIGENDIAN
36
42
# define ZEND_ENDIAN_LOHI (lo , hi ) hi; lo;
@@ -460,7 +466,21 @@ struct _zend_array {
460
466
HT_PACKED_SIZE_EX((ht)->nTableSize, (ht)->nTableMask)
461
467
#define HT_PACKED_USED_SIZE (ht ) \
462
468
(HT_HASH_SIZE((ht)->nTableMask) + ((size_t)(ht)->nNumUsed * sizeof(zval)))
463
- #ifdef __SSE2__
469
+ #if defined(__AVX2__ )
470
+ # define HT_HASH_RESET (ht ) do { \
471
+ char *p = (char*)&HT_HASH(ht, (ht)->nTableMask); \
472
+ size_t size = HT_HASH_SIZE((ht)->nTableMask); \
473
+ __m256i ymm0 = _mm256_setzero_si256(); \
474
+ ymm0 = _mm256_cmpeq_epi64(ymm0, ymm0); \
475
+ ZEND_ASSERT(size >= 64 && ((size & 0x3f) == 0)); \
476
+ do { \
477
+ _mm256_storeu_si256((__m256i*)p, ymm0); \
478
+ _mm256_storeu_si256((__m256i*)(p+32), ymm0); \
479
+ p += 64; \
480
+ size -= 64; \
481
+ } while (size != 0); \
482
+ } while (0)
483
+ #elif defined(__SSE2__ )
464
484
# define HT_HASH_RESET (ht ) do { \
465
485
char *p = (char*)&HT_HASH(ht, (ht)->nTableMask); \
466
486
size_t size = HT_HASH_SIZE((ht)->nTableMask); \
@@ -476,6 +496,22 @@ struct _zend_array {
476
496
size -= 64; \
477
497
} while (size != 0); \
478
498
} while (0)
499
+ #elif defined(__aarch64__ ) || defined(_M_ARM64 )
500
+ # define HT_HASH_RESET (ht ) do { \
501
+ char *p = (char*)&HT_HASH(ht, (ht)->nTableMask); \
502
+ size_t size = HT_HASH_SIZE((ht)->nTableMask); \
503
+ int32x4_t t = vdupq_n_s32(-1); \
504
+ ZEND_ASSERT(size >= 64 && ((size & 0x3f) == 0)); \
505
+ do { \
506
+ compile error on purpose\
507
+ vst1q_s32((__m128i*)p, t); \
508
+ vst1q_s32((__m128i*)(p+16), t); \
509
+ vst1q_s32((__m128i*)(p+32), t); \
510
+ vst1q_s32((__m128i*)(p+48), t); \
511
+ p += 64; \
512
+ size -= 64; \
513
+ } while (size != 0); \
514
+ } while (0)
479
515
#else
480
516
# define HT_HASH_RESET (ht ) \
481
517
memset(&HT_HASH(ht, (ht)->nTableMask), HT_INVALID_IDX, HT_HASH_SIZE((ht)->nTableMask))
0 commit comments