12c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org// Copyright 2011 the V8 project authors. All rights reserved.
22c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org// Redistribution and use in source and binary forms, with or without
32c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org// modification, are permitted provided that the following conditions are
42c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org// met:
52c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org//
62c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org//     * Redistributions of source code must retain the above copyright
72c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org//       notice, this list of conditions and the following disclaimer.
82c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org//     * Redistributions in binary form must reproduce the above
92c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org//       copyright notice, this list of conditions and the following
102c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org//       disclaimer in the documentation and/or other materials provided
112c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org//       with the distribution.
122c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org//     * Neither the name of Google Inc. nor the names of its
132c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org//       contributors may be used to endorse or promote products derived
142c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org//       from this software without specific prior written permission.
152c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org//
162c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
172c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
182c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
192c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
202c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
212c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
222c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
232c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
242c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
252c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
262c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
272c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org
282c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org#include <stdlib.h>
292c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org
302c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org#include "v8.h"
312c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org
322c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org#include "factory.h"
332c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org#include "macro-assembler.h"
342c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org#include "cctest.h"
352c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org#include "code-stubs.h"
362c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org#include "objects.h"
372c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org
382c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org#ifdef USE_SIMULATOR
392c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org#include "simulator.h"
402c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org#endif
412c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org
422c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.orgusing namespace v8::internal;
432c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org
442c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org
452c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.orgtypedef uint32_t (*HASH_FUNCTION)();
462c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org
47f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com#define __ masm->
482c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org
492c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org
5059297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.orgvoid generate(MacroAssembler* masm, i::Vector<const uint8_t> string) {
51f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  // GenerateHashInit takes the first character as an argument so it can't
52f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  // handle the zero length string.
53f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  ASSERT(string.length() > 0);
5493a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org#if V8_TARGET_ARCH_IA32
552c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org  __ push(ebx);
562c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org  __ push(ecx);
572c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org  __ mov(eax, Immediate(0));
58f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  __ mov(ebx, Immediate(string.at(0)));
59f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  StringHelper::GenerateHashInit(masm, eax, ebx, ecx);
602c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org  for (int i = 1; i < string.length(); i++) {
612c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org    __ mov(ebx, Immediate(string.at(i)));
62f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com    StringHelper::GenerateHashAddCharacter(masm, eax, ebx, ecx);
632c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org  }
64f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  StringHelper::GenerateHashGetHash(masm, eax, ecx);
652c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org  __ pop(ecx);
662c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org  __ pop(ebx);
672c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org  __ Ret();
682c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org#elif V8_TARGET_ARCH_X64
69f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  __ push(kRootRegister);
70f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  __ InitializeRootRegister();
712c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org  __ push(rbx);
722c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org  __ push(rcx);
732c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org  __ movq(rax, Immediate(0));
74f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  __ movq(rbx, Immediate(string.at(0)));
75f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  StringHelper::GenerateHashInit(masm, rax, rbx, rcx);
762c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org  for (int i = 1; i < string.length(); i++) {
772c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org    __ movq(rbx, Immediate(string.at(i)));
78f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com    StringHelper::GenerateHashAddCharacter(masm, rax, rbx, rcx);
792c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org  }
80f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  StringHelper::GenerateHashGetHash(masm, rax, rcx);
812c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org  __ pop(rcx);
822c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org  __ pop(rbx);
83f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  __ pop(kRootRegister);
842c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org  __ Ret();
852c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org#elif V8_TARGET_ARCH_ARM
86f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  __ push(kRootRegister);
87f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  __ InitializeRootRegister();
88f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com
892c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org  __ mov(r0, Operand(0));
90f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  __ mov(ip, Operand(string.at(0)));
91f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  StringHelper::GenerateHashInit(masm, r0, ip);
922c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org  for (int i = 1; i < string.length(); i++) {
932c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org    __ mov(ip, Operand(string.at(i)));
94f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com    StringHelper::GenerateHashAddCharacter(masm, r0, ip);
952c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org  }
96f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  StringHelper::GenerateHashGetHash(masm, r0);
97f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  __ pop(kRootRegister);
982c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org  __ mov(pc, Operand(lr));
992c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org#elif V8_TARGET_ARCH_MIPS
100f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  __ push(kRootRegister);
101f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  __ InitializeRootRegister();
102f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com
1032c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org  __ li(v0, Operand(0));
104f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  __ li(t1, Operand(string.at(0)));
105f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  StringHelper::GenerateHashInit(masm, v0, t1);
1062c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org  for (int i = 1; i < string.length(); i++) {
1072c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org    __ li(t1, Operand(string.at(i)));
108f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com    StringHelper::GenerateHashAddCharacter(masm, v0, t1);
1092c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org  }
110f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  StringHelper::GenerateHashGetHash(masm, v0);
111f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  __ pop(kRootRegister);
112f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  __ jr(ra);
113f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  __ nop();
114f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com#endif
115f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com}
116f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com
117f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com
118f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.comvoid generate(MacroAssembler* masm, uint32_t key) {
11993a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org#if V8_TARGET_ARCH_IA32
120f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  __ push(ebx);
121f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  __ mov(eax, Immediate(key));
122f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  __ GetNumberHash(eax, ebx);
123f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  __ pop(ebx);
124f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  __ Ret();
125f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com#elif V8_TARGET_ARCH_X64
126f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  __ push(kRootRegister);
127f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  __ InitializeRootRegister();
128f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  __ push(rbx);
129f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  __ movq(rax, Immediate(key));
130f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  __ GetNumberHash(rax, rbx);
131f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  __ pop(rbx);
132f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  __ pop(kRootRegister);
133f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  __ Ret();
134f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com#elif V8_TARGET_ARCH_ARM
135f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  __ push(kRootRegister);
136f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  __ InitializeRootRegister();
137f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  __ mov(r0, Operand(key));
138f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  __ GetNumberHash(r0, ip);
139f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  __ pop(kRootRegister);
140f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  __ mov(pc, Operand(lr));
141f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com#elif V8_TARGET_ARCH_MIPS
142f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  __ push(kRootRegister);
143f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  __ InitializeRootRegister();
144f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  __ li(v0, Operand(key));
145f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  __ GetNumberHash(v0, t1);
146f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  __ pop(kRootRegister);
1472c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org  __ jr(ra);
1487ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org  __ nop();
1492c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org#endif
1502c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org}
1512c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org
1522c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org
15359297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.orgvoid check(i::Vector<const uint8_t> string) {
15459297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  Isolate* isolate = Isolate::Current();
15559297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  Factory* factory = isolate->factory();
15659297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  HandleScope scope(isolate);
15759297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org
1582c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org  v8::internal::byte buffer[2048];
15959297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  MacroAssembler masm(isolate, buffer, sizeof buffer);
1602c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org
161f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  generate(&masm, string);
1622c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org
1632c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org  CodeDesc desc;
164f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  masm.GetCode(&desc);
16559297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  Handle<Object> undefined(isolate->heap()->undefined_value(), isolate);
16659297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  Handle<Code> code = factory->NewCode(desc,
16759297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org                                       Code::ComputeFlags(Code::STUB),
16859297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org                                       undefined);
1692c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org  CHECK(code->IsCode());
1702c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org
1717ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org  HASH_FUNCTION hash = FUNCTION_CAST<HASH_FUNCTION>(code->entry());
17259297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  Handle<String> v8_string = factory->NewStringFromOneByte(string);
1732c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org  v8_string->set_hash_field(String::kEmptyHashField);
1742c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org#ifdef USE_SIMULATOR
1752c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org  uint32_t codegen_hash =
1762c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org      reinterpret_cast<uint32_t>(CALL_GENERATED_CODE(hash, 0, 0, 0, 0, 0));
1772c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org#else
1782c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org  uint32_t codegen_hash = hash();
1792c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org#endif
1802c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org  uint32_t runtime_hash = v8_string->Hash();
1812c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org  CHECK(runtime_hash == codegen_hash);
1822c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org}
1832c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org
1842c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org
18559297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.orgvoid check(i::Vector<const char> s) {
18659297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  check(i::Vector<const uint8_t>::cast(s));
18759297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org}
18859297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org
18959297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org
190f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.comvoid check(uint32_t key) {
19159297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  Isolate* isolate = Isolate::Current();
19259297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  Factory* factory = isolate->factory();
19359297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  HandleScope scope(isolate);
19459297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org
195f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  v8::internal::byte buffer[2048];
196f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  MacroAssembler masm(Isolate::Current(), buffer, sizeof buffer);
197f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com
198f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  generate(&masm, key);
199f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com
200f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  CodeDesc desc;
201f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  masm.GetCode(&desc);
20259297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  Handle<Object> undefined(isolate->heap()->undefined_value(), isolate);
20359297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  Handle<Code> code = factory->NewCode(desc,
20459297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org                                       Code::ComputeFlags(Code::STUB),
20559297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org                                       undefined);
206f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  CHECK(code->IsCode());
207f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com
208f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  HASH_FUNCTION hash = FUNCTION_CAST<HASH_FUNCTION>(code->entry());
209f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com#ifdef USE_SIMULATOR
210f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  uint32_t codegen_hash =
211f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com      reinterpret_cast<uint32_t>(CALL_GENERATED_CODE(hash, 0, 0, 0, 0, 0));
212f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com#else
213f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  uint32_t codegen_hash = hash();
214f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com#endif
215f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com
21659297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  uint32_t runtime_hash = ComputeIntegerHash(key, isolate->heap()->HashSeed());
217f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  CHECK(runtime_hash == codegen_hash);
218f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com}
219f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com
220f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com
22159297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.orgvoid check_twochars(uint8_t a, uint8_t b) {
22259297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  uint8_t ab[2] = {a, b};
22359297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  check(i::Vector<const uint8_t>(ab, 2));
2242c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org}
2252c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org
2262c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org
227f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.comstatic uint32_t PseudoRandom(uint32_t i, uint32_t j) {
228f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  return ~(~((i * 781) ^ (j * 329)));
229f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com}
230f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com
231f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com
2322c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.orgTEST(StringHash) {
23357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  v8::Isolate* isolate = v8::Isolate::GetCurrent();
23457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  v8::HandleScope handle_scope(isolate);
23557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  v8::Context::Scope context_scope(v8::Context::New(isolate));
23657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
23759297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  for (uint8_t a = 0; a < String::kMaxOneByteCharCode; a++) {
2382c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org    // Numbers are hashed differently.
2392c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org    if (a >= '0' && a <= '9') continue;
24059297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org    for (uint8_t b = 0; b < String::kMaxOneByteCharCode; b++) {
2412c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org      if (b >= '0' && b <= '9') continue;
24259297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org      check_twochars(a, b);
2432c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org    }
2442c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org  }
2452c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org  check(i::Vector<const char>("*",       1));
2462c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org  check(i::Vector<const char>(".zZ",     3));
2472c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org  check(i::Vector<const char>("muc",     3));
2482c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org  check(i::Vector<const char>("(>'_')>", 7));
2492c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org  check(i::Vector<const char>("-=[ vee eight ftw ]=-", 21));
2502c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org}
2512c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org
252f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com
253f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.comTEST(NumberHash) {
25457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  v8::Isolate* isolate = v8::Isolate::GetCurrent();
25557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  v8::HandleScope handle_scope(isolate);
25657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  v8::Context::Scope context_scope(v8::Context::New(isolate));
257f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com
258f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  // Some specific numbers
259f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  for (uint32_t key = 0; key < 42; key += 7) {
260f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com    check(key);
261f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  }
262f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com
263f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  // Some pseudo-random numbers
264f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  static const uint32_t kLimit = 1000;
265f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  for (uint32_t i = 0; i < 5; i++) {
266f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com    for (uint32_t j = 0; j < 5; j++) {
267f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com      check(PseudoRandom(i, j) % kLimit);
268f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com    }
269f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  }
270f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com}
271f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com
2722c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org#undef __
273