Skip to content

Commit d6f4652

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

File tree

1 file changed

+44
-30
lines changed

1 file changed

+44
-30
lines changed

Zend/zend_hash.c

Lines changed: 44 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -119,53 +119,67 @@ static zend_always_inline uint32_t zend_hash_check_size(uint32_t nSize)
119119

120120
static zend_always_inline void zend_hash_real_init_packed_ex(HashTable *ht)
121121
{
122-
HT_SET_DATA_ADDR(ht, pemalloc(HT_SIZE_EX(ht->nTableSize, HT_MIN_MASK), GC_FLAGS(ht) & IS_ARRAY_PERSISTENT));
122+
void *data;
123+
124+
if (UNEXPECTED(GC_FLAGS(ht) & IS_ARRAY_PERSISTENT)) {
125+
data = pemalloc(HT_SIZE_EX(ht->nTableSize, HT_MIN_MASK), 1);
126+
} else if (EXPECTED(ht->nTableSize == HT_MIN_SIZE)) {
127+
data = emalloc(HT_SIZE_EX(HT_MIN_SIZE, HT_MIN_MASK));
128+
} else {
129+
data = emalloc(HT_SIZE_EX(ht->nTableSize, HT_MIN_MASK));
130+
}
131+
HT_SET_DATA_ADDR(ht, data);
123132
HT_FLAGS(ht) |= HASH_FLAG_INITIALIZED | HASH_FLAG_PACKED;
124133
HT_HASH_RESET_PACKED(ht);
125134
}
126135

127136
static zend_always_inline void zend_hash_real_init_mixed_ex(HashTable *ht)
128137
{
138+
void *data;
129139
uint32_t nSize = ht->nTableSize;
130140

131-
if (EXPECTED(nSize == HT_MIN_SIZE)) {
141+
if (UNEXPECTED(GC_FLAGS(ht) & IS_ARRAY_PERSISTENT)) {
142+
data = pemalloc(HT_SIZE_EX(nSize, HT_SIZE_TO_MASK(nSize)), 1);
143+
} else if (EXPECTED(nSize == HT_MIN_SIZE)) {
144+
data = emalloc(HT_SIZE_EX(HT_MIN_SIZE, HT_SIZE_TO_MASK(HT_MIN_SIZE)));
132145
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));
146+
HT_SET_DATA_ADDR(ht, data);
134147
HT_FLAGS(ht) |= HASH_FLAG_INITIALIZED;
135-
do {
136-
Bucket *arData = ht->arData;
137148
#ifdef __SSE2__
149+
do {
138150
__m128i xmm0 = _mm_setzero_si128();
139151
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);
152+
_mm_storeu_si128((__m128i*)&HT_HASH_EX(data, 0), xmm0);
153+
_mm_storeu_si128((__m128i*)&HT_HASH_EX(data, 4), xmm0);
154+
_mm_storeu_si128((__m128i*)&HT_HASH_EX(data, 8), xmm0);
155+
_mm_storeu_si128((__m128i*)&HT_HASH_EX(data, 12), xmm0);
156+
} while (0);
144157
#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;
158+
HT_HASH_EX(data, 0) = -1;
159+
HT_HASH_EX(data, 1) = -1;
160+
HT_HASH_EX(data, 2) = -1;
161+
HT_HASH_EX(data, 3) = -1;
162+
HT_HASH_EX(data, 4) = -1;
163+
HT_HASH_EX(data, 5) = -1;
164+
HT_HASH_EX(data, 6) = -1;
165+
HT_HASH_EX(data, 7) = -1;
166+
HT_HASH_EX(data, 8) = -1;
167+
HT_HASH_EX(data, 9) = -1;
168+
HT_HASH_EX(data, 10) = -1;
169+
HT_HASH_EX(data, 11) = -1;
170+
HT_HASH_EX(data, 12) = -1;
171+
HT_HASH_EX(data, 13) = -1;
172+
HT_HASH_EX(data, 14) = -1;
173+
HT_HASH_EX(data, 15) = -1;
161174
#endif
162-
} while (0);
175+
return;
163176
} 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;
167-
HT_HASH_RESET(ht);
177+
data = emalloc(HT_SIZE_EX(nSize, HT_SIZE_TO_MASK(nSize)));
168178
}
179+
ht->nTableMask = HT_SIZE_TO_MASK(nSize);
180+
HT_SET_DATA_ADDR(ht, data);
181+
HT_FLAGS(ht) |= HASH_FLAG_INITIALIZED;
182+
HT_HASH_RESET(ht);
169183
}
170184

171185
static zend_always_inline void zend_hash_real_init_ex(HashTable *ht, int packed)

0 commit comments

Comments
 (0)