Call into C++ to compute seeded integer hash
R=bmeurer@chromium.org Bug: chromium:680662 Change-Id: I8dace89d576dfcc5833fd539ce698a9ade1cb5a0 Reviewed-on: https://chromium-review.googlesource.com/1235928 Commit-Queue: Yang Guo <yangguo@chromium.org> Reviewed-by: Benedikt Meurer <bmeurer@chromium.org> Cr-Commit-Position: refs/heads/master@{#56091}
This commit is contained in:
parent
2c40c5250b
commit
95a979e02d
@ -253,40 +253,6 @@ HEAP_IMMUTABLE_IMMOVABLE_OBJECT_LIST(HEAP_CONSTANT_ACCESSOR);
|
||||
HEAP_IMMOVABLE_OBJECT_LIST(HEAP_CONSTANT_TEST);
|
||||
#undef HEAP_CONSTANT_TEST
|
||||
|
||||
TNode<Int64T> CodeStubAssembler::HashSeed() {
|
||||
DCHECK(Is64());
|
||||
TNode<HeapObject> hash_seed_root =
|
||||
TNode<HeapObject>::UncheckedCast(LoadRoot(RootIndex::kHashSeed));
|
||||
return TNode<Int64T>::UncheckedCast(LoadObjectField(
|
||||
hash_seed_root, ByteArray::kHeaderSize, MachineType::Int64()));
|
||||
}
|
||||
|
||||
TNode<Int32T> CodeStubAssembler::HashSeedHigh() {
|
||||
DCHECK(!Is64());
|
||||
#ifdef V8_TARGET_BIG_ENDIAN
|
||||
static int kOffset = 0;
|
||||
#else
|
||||
static int kOffset = kInt32Size;
|
||||
#endif
|
||||
TNode<HeapObject> hash_seed_root =
|
||||
TNode<HeapObject>::UncheckedCast(LoadRoot(RootIndex::kHashSeed));
|
||||
return TNode<Int32T>::UncheckedCast(LoadObjectField(
|
||||
hash_seed_root, ByteArray::kHeaderSize + kOffset, MachineType::Int32()));
|
||||
}
|
||||
|
||||
TNode<Int32T> CodeStubAssembler::HashSeedLow() {
|
||||
DCHECK(!Is64());
|
||||
#ifdef V8_TARGET_BIG_ENDIAN
|
||||
static int kOffset = kInt32Size;
|
||||
#else
|
||||
static int kOffset = 0;
|
||||
#endif
|
||||
TNode<HeapObject> hash_seed_root =
|
||||
TNode<HeapObject>::UncheckedCast(LoadRoot(RootIndex::kHashSeed));
|
||||
return TNode<Int32T>::UncheckedCast(LoadObjectField(
|
||||
hash_seed_root, ByteArray::kHeaderSize + kOffset, MachineType::Int32()));
|
||||
}
|
||||
|
||||
Node* CodeStubAssembler::IntPtrOrSmiConstant(int value, ParameterMode mode) {
|
||||
if (mode == SMI_PARAMETERS) {
|
||||
return SmiConstant(value);
|
||||
@ -7780,22 +7746,18 @@ Node* CodeStubAssembler::ComputeUnseededHash(Node* key) {
|
||||
}
|
||||
|
||||
Node* CodeStubAssembler::ComputeSeededHash(Node* key) {
|
||||
// See v8::internal::ComputeIntegerHash()
|
||||
Node* hash_seed;
|
||||
if (Is64()) {
|
||||
hash_seed = TruncateInt64ToInt32(HashSeed());
|
||||
} else {
|
||||
hash_seed = HashSeedLow();
|
||||
}
|
||||
Node* hash = Word32Xor(TruncateIntPtrToInt32(key), hash_seed);
|
||||
hash = Int32Add(Word32Xor(hash, Int32Constant(0xFFFFFFFF)),
|
||||
Word32Shl(hash, Int32Constant(15)));
|
||||
hash = Word32Xor(hash, Word32Shr(hash, Int32Constant(12)));
|
||||
hash = Int32Add(hash, Word32Shl(hash, Int32Constant(2)));
|
||||
hash = Word32Xor(hash, Word32Shr(hash, Int32Constant(4)));
|
||||
hash = Int32Mul(hash, Int32Constant(2057));
|
||||
hash = Word32Xor(hash, Word32Shr(hash, Int32Constant(16)));
|
||||
return Word32And(hash, Int32Constant(0x3FFFFFFF));
|
||||
Node* const function_addr =
|
||||
ExternalConstant(ExternalReference::compute_integer_hash());
|
||||
Node* const isolate_ptr =
|
||||
ExternalConstant(ExternalReference::isolate_address(isolate()));
|
||||
|
||||
MachineType type_ptr = MachineType::Pointer();
|
||||
MachineType type_uint32 = MachineType::Uint32();
|
||||
|
||||
Node* const result =
|
||||
CallCFunction2(type_uint32, type_ptr, type_uint32, function_addr,
|
||||
isolate_ptr, TruncateIntPtrToInt32(key));
|
||||
return result;
|
||||
}
|
||||
|
||||
void CodeStubAssembler::NumberDictionaryLookup(
|
||||
|
@ -450,10 +450,6 @@ class V8_EXPORT_PRIVATE CodeStubAssembler : public compiler::CodeAssembler {
|
||||
HEAP_IMMOVABLE_OBJECT_LIST(HEAP_CONSTANT_TEST)
|
||||
#undef HEAP_CONSTANT_TEST
|
||||
|
||||
TNode<Int64T> HashSeed();
|
||||
TNode<Int32T> HashSeedHigh();
|
||||
TNode<Int32T> HashSeedLow();
|
||||
|
||||
Node* IntPtrOrSmiConstant(int value, ParameterMode mode);
|
||||
TNode<Smi> LanguageModeConstant(LanguageMode mode) {
|
||||
return SmiConstant(static_cast<int>(mode));
|
||||
|
@ -759,6 +759,15 @@ ExternalReference ExternalReference::jsreceiver_create_identity_hash(
|
||||
return ExternalReference(Redirect(FUNCTION_ADDR(f)));
|
||||
}
|
||||
|
||||
static uint32_t ComputeSeededIntegerHash(Isolate* isolate, uint32_t key) {
|
||||
DisallowHeapAllocation no_gc;
|
||||
return ComputeSeededHash(key, isolate->heap()->HashSeed());
|
||||
}
|
||||
|
||||
ExternalReference ExternalReference::compute_integer_hash() {
|
||||
return ExternalReference(Redirect(FUNCTION_ADDR(ComputeSeededIntegerHash)));
|
||||
}
|
||||
|
||||
ExternalReference
|
||||
ExternalReference::copy_fast_number_jsarray_elements_to_typed_array() {
|
||||
return ExternalReference(
|
||||
|
@ -82,6 +82,7 @@ class StatsCounter;
|
||||
V(address_of_uint32_bias, "uint32_bias") \
|
||||
V(bytecode_size_table_address, "Bytecodes::bytecode_size_table_address") \
|
||||
V(check_object_type, "check_object_type") \
|
||||
V(compute_integer_hash, "ComputeSeededHash") \
|
||||
V(compute_output_frames_function, "Deoptimizer::ComputeOutputFrames()") \
|
||||
V(copy_fast_number_jsarray_elements_to_typed_array, \
|
||||
"copy_fast_number_jsarray_elements_to_typed_array") \
|
||||
|
Loading…
Reference in New Issue
Block a user