1692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch// Copyright 2011 the V8 project authors. All rights reserved. 2692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch// Redistribution and use in source and binary forms, with or without 3692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch// modification, are permitted provided that the following conditions are 4692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch// met: 5692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch// 6692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch// * Redistributions of source code must retain the above copyright 7692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch// notice, this list of conditions and the following disclaimer. 8692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch// * Redistributions in binary form must reproduce the above 9692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch// copyright notice, this list of conditions and the following 10692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch// disclaimer in the documentation and/or other materials provided 11692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch// with the distribution. 12692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch// * Neither the name of Google Inc. nor the names of its 13692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch// contributors may be used to endorse or promote products derived 14692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch// from this software without specific prior written permission. 15692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch// 16692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch 28692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch#include <stdlib.h> 29692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch 30692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch#include "v8.h" 31692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch 32692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch#include "factory.h" 33692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch#include "macro-assembler.h" 34692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch#include "cctest.h" 35692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch#include "code-stubs.h" 36692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch#include "objects.h" 37692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch 38692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch#ifdef USE_SIMULATOR 39692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch#include "simulator.h" 40692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch#endif 41692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch 42692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdochusing namespace v8::internal; 43692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch 44692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch 45692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdochtypedef uint32_t (*HASH_FUNCTION)(); 46692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch 47692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdochstatic v8::Persistent<v8::Context> env; 48692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch 49c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch#define __ masm-> 50692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch 51692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch 52c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdochvoid generate(MacroAssembler* masm, i::Vector<const char> string) { 53c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch // GenerateHashInit takes the first character as an argument so it can't 54c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch // handle the zero length string. 55c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch ASSERT(string.length() > 0); 56692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch#ifdef V8_TARGET_ARCH_IA32 57692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch __ push(ebx); 58692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch __ push(ecx); 59692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch __ mov(eax, Immediate(0)); 60c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch __ mov(ebx, Immediate(string.at(0))); 61c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch StringHelper::GenerateHashInit(masm, eax, ebx, ecx); 62692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch for (int i = 1; i < string.length(); i++) { 63692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch __ mov(ebx, Immediate(string.at(i))); 64c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch StringHelper::GenerateHashAddCharacter(masm, eax, ebx, ecx); 65692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch } 66c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch StringHelper::GenerateHashGetHash(masm, eax, ecx); 67692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch __ pop(ecx); 68692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch __ pop(ebx); 69692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch __ Ret(); 70692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch#elif V8_TARGET_ARCH_X64 71c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch __ push(kRootRegister); 72c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch __ InitializeRootRegister(); 73692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch __ push(rbx); 74692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch __ push(rcx); 75692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch __ movq(rax, Immediate(0)); 76c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch __ movq(rbx, Immediate(string.at(0))); 77c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch StringHelper::GenerateHashInit(masm, rax, rbx, rcx); 78692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch for (int i = 1; i < string.length(); i++) { 79692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch __ movq(rbx, Immediate(string.at(i))); 80c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch StringHelper::GenerateHashAddCharacter(masm, rax, rbx, rcx); 81692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch } 82c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch StringHelper::GenerateHashGetHash(masm, rax, rcx); 83692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch __ pop(rcx); 84692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch __ pop(rbx); 85c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch __ pop(kRootRegister); 86692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch __ Ret(); 87692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch#elif V8_TARGET_ARCH_ARM 88c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch __ push(kRootRegister); 89c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch __ InitializeRootRegister(); 90c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 91692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch __ mov(r0, Operand(0)); 92c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch __ mov(ip, Operand(string.at(0))); 93c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch StringHelper::GenerateHashInit(masm, r0, ip); 94692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch for (int i = 1; i < string.length(); i++) { 95692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch __ mov(ip, Operand(string.at(i))); 96c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch StringHelper::GenerateHashAddCharacter(masm, r0, ip); 97692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch } 98c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch StringHelper::GenerateHashGetHash(masm, r0); 99c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch __ pop(kRootRegister); 100692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch __ mov(pc, Operand(lr)); 101692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch#elif V8_TARGET_ARCH_MIPS 102c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch __ push(kRootRegister); 103c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch __ InitializeRootRegister(); 104c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 105692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch __ li(v0, Operand(0)); 106c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch __ li(t1, Operand(string.at(0))); 107c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch StringHelper::GenerateHashInit(masm, v0, t1); 108692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch for (int i = 1; i < string.length(); i++) { 109692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch __ li(t1, Operand(string.at(i))); 110c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch StringHelper::GenerateHashAddCharacter(masm, v0, t1); 111692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch } 112c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch StringHelper::GenerateHashGetHash(masm, v0); 113c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch __ pop(kRootRegister); 114c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch __ jr(ra); 115c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch __ nop(); 116c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch#endif 117c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch} 118c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 119c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 120c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdochvoid generate(MacroAssembler* masm, uint32_t key) { 121c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch#ifdef V8_TARGET_ARCH_IA32 122c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch __ push(ebx); 123c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch __ mov(eax, Immediate(key)); 124c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch __ GetNumberHash(eax, ebx); 125c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch __ pop(ebx); 126c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch __ Ret(); 127c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch#elif V8_TARGET_ARCH_X64 128c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch __ push(kRootRegister); 129c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch __ InitializeRootRegister(); 130c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch __ push(rbx); 131c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch __ movq(rax, Immediate(key)); 132c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch __ GetNumberHash(rax, rbx); 133c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch __ pop(rbx); 134c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch __ pop(kRootRegister); 135c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch __ Ret(); 136c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch#elif V8_TARGET_ARCH_ARM 137c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch __ push(kRootRegister); 138c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch __ InitializeRootRegister(); 139c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch __ mov(r0, Operand(key)); 140c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch __ GetNumberHash(r0, ip); 141c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch __ pop(kRootRegister); 142c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch __ mov(pc, Operand(lr)); 143c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch#elif V8_TARGET_ARCH_MIPS 144c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch __ push(kRootRegister); 145c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch __ InitializeRootRegister(); 146c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch __ li(v0, Operand(key)); 147c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch __ GetNumberHash(v0, t1); 148c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch __ pop(kRootRegister); 1492b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch __ jr(ra); 150c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch __ nop(); 1512b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch#endif 1522b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch} 1532b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch 1542b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch 155692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdochvoid check(i::Vector<const char> string) { 156692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch v8::HandleScope scope; 157692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch v8::internal::byte buffer[2048]; 158c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch MacroAssembler masm(Isolate::Current(), buffer, sizeof buffer); 159692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch 160c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch generate(&masm, string); 161692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch 162692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch CodeDesc desc; 163c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch masm.GetCode(&desc); 164692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch Code* code = Code::cast(HEAP->CreateCode( 165692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch desc, 166692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch Code::ComputeFlags(Code::STUB), 167692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch Handle<Object>(HEAP->undefined_value()))->ToObjectChecked()); 168692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch CHECK(code->IsCode()); 169692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch 170c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch HASH_FUNCTION hash = FUNCTION_CAST<HASH_FUNCTION>(code->entry()); 171692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch Handle<String> v8_string = FACTORY->NewStringFromAscii(string); 172692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch v8_string->set_hash_field(String::kEmptyHashField); 173692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch#ifdef USE_SIMULATOR 174692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch uint32_t codegen_hash = 175692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch reinterpret_cast<uint32_t>(CALL_GENERATED_CODE(hash, 0, 0, 0, 0, 0)); 176692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch#else 177692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch uint32_t codegen_hash = hash(); 178692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch#endif 179692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch uint32_t runtime_hash = v8_string->Hash(); 180692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch CHECK(runtime_hash == codegen_hash); 181692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch} 182692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch 183692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch 184c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdochvoid check(uint32_t key) { 185c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch v8::HandleScope scope; 186c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch v8::internal::byte buffer[2048]; 187c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch MacroAssembler masm(Isolate::Current(), buffer, sizeof buffer); 188c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 189c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch generate(&masm, key); 190c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 191c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch CodeDesc desc; 192c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch masm.GetCode(&desc); 193c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch Code* code = Code::cast(HEAP->CreateCode( 194c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch desc, 195c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch Code::ComputeFlags(Code::STUB), 196c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch Handle<Object>(HEAP->undefined_value()))->ToObjectChecked()); 197c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch CHECK(code->IsCode()); 198c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 199c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch HASH_FUNCTION hash = FUNCTION_CAST<HASH_FUNCTION>(code->entry()); 200c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch#ifdef USE_SIMULATOR 201c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch uint32_t codegen_hash = 202c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch reinterpret_cast<uint32_t>(CALL_GENERATED_CODE(hash, 0, 0, 0, 0, 0)); 203c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch#else 204c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch uint32_t codegen_hash = hash(); 205c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch#endif 206c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 207c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch uint32_t runtime_hash = ComputeIntegerHash( 208c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch key, 209c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch Isolate::Current()->heap()->HashSeed()); 210c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch CHECK(runtime_hash == codegen_hash); 211c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch} 212c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 213c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 214692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdochvoid check_twochars(char a, char b) { 215692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch char ab[2] = {a, b}; 216692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch check(i::Vector<const char>(ab, 2)); 217692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch} 218692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch 219692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch 220c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdochstatic uint32_t PseudoRandom(uint32_t i, uint32_t j) { 221c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch return ~(~((i * 781) ^ (j * 329))); 222c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch} 223c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 224c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 225692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben MurdochTEST(StringHash) { 226692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch if (env.IsEmpty()) env = v8::Context::New(); 227692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch for (int a = 0; a < String::kMaxAsciiCharCode; a++) { 228692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch // Numbers are hashed differently. 229692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch if (a >= '0' && a <= '9') continue; 230692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch for (int b = 0; b < String::kMaxAsciiCharCode; b++) { 231692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch if (b >= '0' && b <= '9') continue; 232692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch check_twochars(static_cast<char>(a), static_cast<char>(b)); 233692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch } 234692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch } 235692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch check(i::Vector<const char>("*", 1)); 236692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch check(i::Vector<const char>(".zZ", 3)); 237692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch check(i::Vector<const char>("muc", 3)); 238692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch check(i::Vector<const char>("(>'_')>", 7)); 239692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch check(i::Vector<const char>("-=[ vee eight ftw ]=-", 21)); 240692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch} 241692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch 242c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 243c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben MurdochTEST(NumberHash) { 244c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch if (env.IsEmpty()) env = v8::Context::New(); 245c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 246c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch // Some specific numbers 247c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch for (uint32_t key = 0; key < 42; key += 7) { 248c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch check(key); 249c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch } 250c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 251c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch // Some pseudo-random numbers 252c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch static const uint32_t kLimit = 1000; 253c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch for (uint32_t i = 0; i < 5; i++) { 254c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch for (uint32_t j = 0; j < 5; j++) { 255c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch check(PseudoRandom(i, j) % kLimit); 256c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch } 257c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch } 258c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch} 259c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 260692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch#undef __ 261