223 static ALWAYS_INLINE uint32_t bitsForDiversifier(void* diversifier)
224 {
225 return static_cast<uint32_t>(bitwise_cast<uintptr_t>(diversifier));
226 }
227
228 ALWAYS_INLINE uint32_t currentHash(uint32_t index, void* diversifier)
229 {
230 uint64_t result;
231 bool hashFieldIsTagged = index == 0;
232 if (hashFieldIsTagged)
233 result = untagInt(m_hash, makeDiversifier(initializationNamespace, index, bitsForDiversifier(diversifier)));
234 else
235 result = m_hash;
236 return static_cast<uint32_t>(result);
237 }
238
239 ALWAYS_INLINE void setUpdatedHash(uint32_t value, uint32_t index, void* diversifier)
240 {
241 bool shouldTagHashField = index == 0;
242 if (shouldTagHashField)
243 m_hash = tagInt(static_cast<uint64_t>(value), makeDiversifier(initializationNamespace, index, bitsForDiversifier(diversifier)));
244 else
245 m_hash = value;
246 }
247
248 ARM64EHash(void* diversifier)
249 {
250 setUpdatedHash(0, 0, diversifier);
251 }
252
253 ALWAYS_INLINE uint32_t update(uint32_t instruction, uint32_t index, void* diversifier)