Skip to content

Commit dddf3c5

Browse files
committed
Added specialized code for small arrays
1 parent 493f830 commit dddf3c5

File tree

1 file changed

+32
-28
lines changed

1 file changed

+32
-28
lines changed

Zend/zend_hash.c

Lines changed: 32 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -128,38 +128,42 @@ static zend_always_inline void zend_hash_real_init_mixed_ex(HashTable *ht)
128128
{
129129
uint32_t nSize = ht->nTableSize;
130130

131-
ht->nTableMask = HT_SIZE_TO_MASK(nSize);
132-
HT_SET_DATA_ADDR(ht, pemalloc(HT_SIZE_EX(nSize, HT_SIZE_TO_MASK(nSize)), GC_FLAGS(ht) & IS_ARRAY_PERSISTENT));
133-
HT_FLAGS(ht) |= HASH_FLAG_INITIALIZED;
134-
if (EXPECTED(ht->nTableMask == HT_SIZE_TO_MASK(HT_MIN_SIZE))) {
135-
Bucket *arData = ht->arData;
136-
131+
if (EXPECTED(nSize == HT_MIN_SIZE)) {
132+
ht->nTableMask = HT_SIZE_TO_MASK(HT_MIN_SIZE);
133+
HT_SET_DATA_ADDR(ht, pemalloc(HT_SIZE_EX(HT_MIN_SIZE, HT_SIZE_TO_MASK(HT_MIN_SIZE)), GC_FLAGS(ht) & IS_ARRAY_PERSISTENT));
134+
HT_FLAGS(ht) |= HASH_FLAG_INITIALIZED;
135+
do {
136+
Bucket *arData = ht->arData;
137137
#ifdef __SSE2__
138-
__m128i xmm0 = _mm_setzero_si128();
139-
xmm0 = _mm_cmpeq_epi8(xmm0, xmm0);
140-
_mm_storeu_si128((__m128i*)&HT_HASH_EX(arData, -16), xmm0);
141-
_mm_storeu_si128((__m128i*)&HT_HASH_EX(arData, -12), xmm0);
142-
_mm_storeu_si128((__m128i*)&HT_HASH_EX(arData, -8), xmm0);
143-
_mm_storeu_si128((__m128i*)&HT_HASH_EX(arData, -4), xmm0);
138+
__m128i xmm0 = _mm_setzero_si128();
139+
xmm0 = _mm_cmpeq_epi8(xmm0, xmm0);
140+
_mm_storeu_si128((__m128i*)&HT_HASH_EX(arData, -16), xmm0);
141+
_mm_storeu_si128((__m128i*)&HT_HASH_EX(arData, -12), xmm0);
142+
_mm_storeu_si128((__m128i*)&HT_HASH_EX(arData, -8), xmm0);
143+
_mm_storeu_si128((__m128i*)&HT_HASH_EX(arData, -4), xmm0);
144144
#else
145-
HT_HASH_EX(arData, -16) = -1;
146-
HT_HASH_EX(arData, -15) = -1;
147-
HT_HASH_EX(arData, -14) = -1;
148-
HT_HASH_EX(arData, -13) = -1;
149-
HT_HASH_EX(arData, -12) = -1;
150-
HT_HASH_EX(arData, -11) = -1;
151-
HT_HASH_EX(arData, -10) = -1;
152-
HT_HASH_EX(arData, -9) = -1;
153-
HT_HASH_EX(arData, -8) = -1;
154-
HT_HASH_EX(arData, -7) = -1;
155-
HT_HASH_EX(arData, -6) = -1;
156-
HT_HASH_EX(arData, -5) = -1;
157-
HT_HASH_EX(arData, -4) = -1;
158-
HT_HASH_EX(arData, -3) = -1;
159-
HT_HASH_EX(arData, -2) = -1;
160-
HT_HASH_EX(arData, -1) = -1;
145+
HT_HASH_EX(arData, -16) = -1;
146+
HT_HASH_EX(arData, -15) = -1;
147+
HT_HASH_EX(arData, -14) = -1;
148+
HT_HASH_EX(arData, -13) = -1;
149+
HT_HASH_EX(arData, -12) = -1;
150+
HT_HASH_EX(arData, -11) = -1;
151+
HT_HASH_EX(arData, -10) = -1;
152+
HT_HASH_EX(arData, -9) = -1;
153+
HT_HASH_EX(arData, -8) = -1;
154+
HT_HASH_EX(arData, -7) = -1;
155+
HT_HASH_EX(arData, -6) = -1;
156+
HT_HASH_EX(arData, -5) = -1;
157+
HT_HASH_EX(arData, -4) = -1;
158+
HT_HASH_EX(arData, -3) = -1;
159+
HT_HASH_EX(arData, -2) = -1;
160+
HT_HASH_EX(arData, -1) = -1;
161161
#endif
162+
} while (0);
162163
} else {
164+
ht->nTableMask = HT_SIZE_TO_MASK(nSize);
165+
HT_SET_DATA_ADDR(ht, pemalloc(HT_SIZE_EX(nSize, HT_SIZE_TO_MASK(nSize)), GC_FLAGS(ht) & IS_ARRAY_PERSISTENT));
166+
HT_FLAGS(ht) |= HASH_FLAG_INITIALIZED;
163167
HT_HASH_RESET(ht);
164168
}
165169
}

0 commit comments

Comments
 (0)