@@ -119,53 +119,67 @@ static zend_always_inline uint32_t zend_hash_check_size(uint32_t nSize)
119
119
120
120
static zend_always_inline void zend_hash_real_init_packed_ex (HashTable * ht )
121
121
{
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 );
123
132
HT_FLAGS (ht ) |= HASH_FLAG_INITIALIZED | HASH_FLAG_PACKED ;
124
133
HT_HASH_RESET_PACKED (ht );
125
134
}
126
135
127
136
static zend_always_inline void zend_hash_real_init_mixed_ex (HashTable * ht )
128
137
{
138
+ void * data ;
129
139
uint32_t nSize = ht -> nTableSize ;
130
140
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 )));
132
145
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 );
134
147
HT_FLAGS (ht ) |= HASH_FLAG_INITIALIZED ;
135
- do {
136
- Bucket * arData = ht -> arData ;
137
148
#ifdef __SSE2__
149
+ do {
138
150
__m128i xmm0 = _mm_setzero_si128 ();
139
151
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 );
144
157
#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 ;
161
174
#endif
162
- } while ( 0 ) ;
175
+ return ;
163
176
} 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 )));
168
178
}
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 );
169
183
}
170
184
171
185
static zend_always_inline void zend_hash_real_init_ex (HashTable * ht , int packed )
0 commit comments