diff options
Diffstat (limited to 'src/3rdparty/v8/test/cctest/test-hashing.cc')
-rw-r--r-- | src/3rdparty/v8/test/cctest/test-hashing.cc | 269 |
1 files changed, 0 insertions, 269 deletions
diff --git a/src/3rdparty/v8/test/cctest/test-hashing.cc b/src/3rdparty/v8/test/cctest/test-hashing.cc deleted file mode 100644 index 605b59b..0000000 --- a/src/3rdparty/v8/test/cctest/test-hashing.cc +++ /dev/null @@ -1,269 +0,0 @@ -// Copyright 2011 the V8 project authors. All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#include <stdlib.h> - -#include "v8.h" - -#include "factory.h" -#include "macro-assembler.h" -#include "cctest.h" -#include "code-stubs.h" -#include "objects.h" - -#ifdef USE_SIMULATOR -#include "simulator.h" -#endif - -using namespace v8::internal; - - -typedef uint32_t (*HASH_FUNCTION)(); - -static v8::Persistent<v8::Context> env; - -#define __ masm-> - - -void generate(MacroAssembler* masm, i::Vector<const uint8_t> string) { - // GenerateHashInit takes the first character as an argument so it can't - // handle the zero length string. - ASSERT(string.length() > 0); -#ifdef V8_TARGET_ARCH_IA32 - __ push(ebx); - __ push(ecx); - __ mov(eax, Immediate(0)); - __ mov(ebx, Immediate(string.at(0))); - StringHelper::GenerateHashInit(masm, eax, ebx, ecx); - for (int i = 1; i < string.length(); i++) { - __ mov(ebx, Immediate(string.at(i))); - StringHelper::GenerateHashAddCharacter(masm, eax, ebx, ecx); - } - StringHelper::GenerateHashGetHash(masm, eax, ecx); - __ pop(ecx); - __ pop(ebx); - __ Ret(); -#elif V8_TARGET_ARCH_X64 - __ push(kRootRegister); - __ InitializeRootRegister(); - __ push(rbx); - __ push(rcx); - __ movq(rax, Immediate(0)); - __ movq(rbx, Immediate(string.at(0))); - StringHelper::GenerateHashInit(masm, rax, rbx, rcx); - for (int i = 1; i < string.length(); i++) { - __ movq(rbx, Immediate(string.at(i))); - StringHelper::GenerateHashAddCharacter(masm, rax, rbx, rcx); - } - StringHelper::GenerateHashGetHash(masm, rax, rcx); - __ pop(rcx); - __ pop(rbx); - __ pop(kRootRegister); - __ Ret(); -#elif V8_TARGET_ARCH_ARM - __ push(kRootRegister); - __ InitializeRootRegister(); - - __ mov(r0, Operand(0)); - __ mov(ip, Operand(string.at(0))); - StringHelper::GenerateHashInit(masm, r0, ip); - for (int i = 1; i < string.length(); i++) { - __ mov(ip, Operand(string.at(i))); - StringHelper::GenerateHashAddCharacter(masm, r0, ip); - } - StringHelper::GenerateHashGetHash(masm, r0); - __ pop(kRootRegister); - __ mov(pc, Operand(lr)); -#elif V8_TARGET_ARCH_MIPS - __ push(kRootRegister); - __ InitializeRootRegister(); - - __ li(v0, Operand(0)); - __ li(t1, Operand(string.at(0))); - StringHelper::GenerateHashInit(masm, v0, t1); - for (int i = 1; i < string.length(); i++) { - __ li(t1, Operand(string.at(i))); - StringHelper::GenerateHashAddCharacter(masm, v0, t1); - } - StringHelper::GenerateHashGetHash(masm, v0); - __ pop(kRootRegister); - __ jr(ra); - __ nop(); -#endif -} - - -void generate(MacroAssembler* masm, uint32_t key) { -#ifdef V8_TARGET_ARCH_IA32 - __ push(ebx); - __ mov(eax, Immediate(key)); - __ GetNumberHash(eax, ebx); - __ pop(ebx); - __ Ret(); -#elif V8_TARGET_ARCH_X64 - __ push(kRootRegister); - __ InitializeRootRegister(); - __ push(rbx); - __ movq(rax, Immediate(key)); - __ GetNumberHash(rax, rbx); - __ pop(rbx); - __ pop(kRootRegister); - __ Ret(); -#elif V8_TARGET_ARCH_ARM - __ push(kRootRegister); - __ InitializeRootRegister(); - __ mov(r0, Operand(key)); - __ GetNumberHash(r0, ip); - __ pop(kRootRegister); - __ mov(pc, Operand(lr)); -#elif V8_TARGET_ARCH_MIPS - __ push(kRootRegister); - __ InitializeRootRegister(); - __ li(v0, Operand(key)); - __ GetNumberHash(v0, t1); - __ pop(kRootRegister); - __ jr(ra); - __ nop(); -#endif -} - - -void check(i::Vector<const uint8_t> string) { - Isolate* isolate = Isolate::Current(); - Factory* factory = isolate->factory(); - HandleScope scope(isolate); - - v8::internal::byte buffer[2048]; - MacroAssembler masm(isolate, buffer, sizeof buffer); - - generate(&masm, string); - - CodeDesc desc; - masm.GetCode(&desc); - Handle<Object> undefined(isolate->heap()->undefined_value(), isolate); - Handle<Code> code = factory->NewCode(desc, - Code::ComputeFlags(Code::STUB), - undefined); - CHECK(code->IsCode()); - - HASH_FUNCTION hash = FUNCTION_CAST<HASH_FUNCTION>(code->entry()); - Handle<String> v8_string = factory->NewStringFromOneByte(string); - v8_string->set_hash_field(String::kEmptyHashField); -#ifdef USE_SIMULATOR - uint32_t codegen_hash = - reinterpret_cast<uint32_t>(CALL_GENERATED_CODE(hash, 0, 0, 0, 0, 0)); -#else - uint32_t codegen_hash = hash(); -#endif - uint32_t runtime_hash = v8_string->Hash(); - CHECK(runtime_hash == codegen_hash); -} - - -void check(i::Vector<const char> s) { - check(i::Vector<const uint8_t>::cast(s)); -} - - -void check(uint32_t key) { - Isolate* isolate = Isolate::Current(); - Factory* factory = isolate->factory(); - HandleScope scope(isolate); - - v8::internal::byte buffer[2048]; - MacroAssembler masm(Isolate::Current(), buffer, sizeof buffer); - - generate(&masm, key); - - CodeDesc desc; - masm.GetCode(&desc); - Handle<Object> undefined(isolate->heap()->undefined_value(), isolate); - Handle<Code> code = factory->NewCode(desc, - Code::ComputeFlags(Code::STUB), - undefined); - CHECK(code->IsCode()); - - HASH_FUNCTION hash = FUNCTION_CAST<HASH_FUNCTION>(code->entry()); -#ifdef USE_SIMULATOR - uint32_t codegen_hash = - reinterpret_cast<uint32_t>(CALL_GENERATED_CODE(hash, 0, 0, 0, 0, 0)); -#else - uint32_t codegen_hash = hash(); -#endif - - uint32_t runtime_hash = ComputeIntegerHash(key, isolate->heap()->HashSeed()); - CHECK(runtime_hash == codegen_hash); -} - - -void check_twochars(uint8_t a, uint8_t b) { - uint8_t ab[2] = {a, b}; - check(i::Vector<const uint8_t>(ab, 2)); -} - - -static uint32_t PseudoRandom(uint32_t i, uint32_t j) { - return ~(~((i * 781) ^ (j * 329))); -} - - -TEST(StringHash) { - if (env.IsEmpty()) env = v8::Context::New(); - for (uint8_t a = 0; a < String::kMaxOneByteCharCode; a++) { - // Numbers are hashed differently. - if (a >= '0' && a <= '9') continue; - for (uint8_t b = 0; b < String::kMaxOneByteCharCode; b++) { - if (b >= '0' && b <= '9') continue; - check_twochars(a, b); - } - } - check(i::Vector<const char>("*", 1)); - check(i::Vector<const char>(".zZ", 3)); - check(i::Vector<const char>("muc", 3)); - check(i::Vector<const char>("(>'_')>", 7)); - check(i::Vector<const char>("-=[ vee eight ftw ]=-", 21)); -} - - -TEST(NumberHash) { - if (env.IsEmpty()) env = v8::Context::New(); - - // Some specific numbers - for (uint32_t key = 0; key < 42; key += 7) { - check(key); - } - - // Some pseudo-random numbers - static const uint32_t kLimit = 1000; - for (uint32_t i = 0; i < 5; i++) { - for (uint32_t j = 0; j < 5; j++) { - check(PseudoRandom(i, j) % kLimit); - } - } -} - -#undef __ |