Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(392)

Side by Side Diff: test/cctest/test-hashing.cc

Issue 148293020: Merge experimental/a64 to bleeding_edge. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Remove ARM from OWNERS Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « test/cctest/test-fuzz-a64.cc ('k') | test/cctest/test-heap.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
89 __ mov(r0, Operand(0)); 89 __ mov(r0, Operand(0));
90 __ mov(ip, Operand(string.at(0))); 90 __ mov(ip, Operand(string.at(0)));
91 StringHelper::GenerateHashInit(masm, r0, ip); 91 StringHelper::GenerateHashInit(masm, r0, ip);
92 for (int i = 1; i < string.length(); i++) { 92 for (int i = 1; i < string.length(); i++) {
93 __ mov(ip, Operand(string.at(i))); 93 __ mov(ip, Operand(string.at(i)));
94 StringHelper::GenerateHashAddCharacter(masm, r0, ip); 94 StringHelper::GenerateHashAddCharacter(masm, r0, ip);
95 } 95 }
96 StringHelper::GenerateHashGetHash(masm, r0); 96 StringHelper::GenerateHashGetHash(masm, r0);
97 __ pop(kRootRegister); 97 __ pop(kRootRegister);
98 __ mov(pc, Operand(lr)); 98 __ mov(pc, Operand(lr));
99 #elif V8_TARGET_ARCH_A64
100 // The A64 assembler usually uses jssp (x28) as a stack pointer, but only csp
101 // is initialized by the calling (C++) code.
102 Register old_stack_pointer = __ StackPointer();
103 __ SetStackPointer(csp);
104 __ Push(root, xzr);
105 __ InitializeRootRegister();
106 __ Mov(x0, 0);
107 __ Mov(x10, Operand(string.at(0)));
108 StringHelper::GenerateHashInit(masm, x0, x10);
109 for (int i = 1; i < string.length(); i++) {
110 __ Mov(x10, Operand(string.at(i)));
111 StringHelper::GenerateHashAddCharacter(masm, x0, x10);
112 }
113 StringHelper::GenerateHashGetHash(masm, x0, x10);
114 __ Pop(xzr, root);
115 __ Ret();
116 __ SetStackPointer(old_stack_pointer);
99 #elif V8_TARGET_ARCH_MIPS 117 #elif V8_TARGET_ARCH_MIPS
100 __ push(kRootRegister); 118 __ push(kRootRegister);
101 __ InitializeRootRegister(); 119 __ InitializeRootRegister();
102 120
103 __ li(v0, Operand(0)); 121 __ li(v0, Operand(0));
104 __ li(t1, Operand(string.at(0))); 122 __ li(t1, Operand(string.at(0)));
105 StringHelper::GenerateHashInit(masm, v0, t1); 123 StringHelper::GenerateHashInit(masm, v0, t1);
106 for (int i = 1; i < string.length(); i++) { 124 for (int i = 1; i < string.length(); i++) {
107 __ li(t1, Operand(string.at(i))); 125 __ li(t1, Operand(string.at(i)));
108 StringHelper::GenerateHashAddCharacter(masm, v0, t1); 126 StringHelper::GenerateHashAddCharacter(masm, v0, t1);
109 } 127 }
110 StringHelper::GenerateHashGetHash(masm, v0); 128 StringHelper::GenerateHashGetHash(masm, v0);
111 __ pop(kRootRegister); 129 __ pop(kRootRegister);
112 __ jr(ra); 130 __ jr(ra);
113 __ nop(); 131 __ nop();
132 #else
133 #error Unsupported architecture.
114 #endif 134 #endif
115 } 135 }
116 136
117 137
118 void generate(MacroAssembler* masm, uint32_t key) { 138 void generate(MacroAssembler* masm, uint32_t key) {
119 #if V8_TARGET_ARCH_IA32 139 #if V8_TARGET_ARCH_IA32
120 __ push(ebx); 140 __ push(ebx);
121 __ mov(eax, Immediate(key)); 141 __ mov(eax, Immediate(key));
122 __ GetNumberHash(eax, ebx); 142 __ GetNumberHash(eax, ebx);
123 __ pop(ebx); 143 __ pop(ebx);
124 __ Ret(); 144 __ Ret();
125 #elif V8_TARGET_ARCH_X64 145 #elif V8_TARGET_ARCH_X64
126 __ push(kRootRegister); 146 __ push(kRootRegister);
127 __ InitializeRootRegister(); 147 __ InitializeRootRegister();
128 __ push(rbx); 148 __ push(rbx);
129 __ movq(rax, Immediate(key)); 149 __ movq(rax, Immediate(key));
130 __ GetNumberHash(rax, rbx); 150 __ GetNumberHash(rax, rbx);
131 __ pop(rbx); 151 __ pop(rbx);
132 __ pop(kRootRegister); 152 __ pop(kRootRegister);
133 __ Ret(); 153 __ Ret();
134 #elif V8_TARGET_ARCH_ARM 154 #elif V8_TARGET_ARCH_ARM
135 __ push(kRootRegister); 155 __ push(kRootRegister);
136 __ InitializeRootRegister(); 156 __ InitializeRootRegister();
137 __ mov(r0, Operand(key)); 157 __ mov(r0, Operand(key));
138 __ GetNumberHash(r0, ip); 158 __ GetNumberHash(r0, ip);
139 __ pop(kRootRegister); 159 __ pop(kRootRegister);
140 __ mov(pc, Operand(lr)); 160 __ mov(pc, Operand(lr));
161 #elif V8_TARGET_ARCH_A64
162 // The A64 assembler usually uses jssp (x28) as a stack pointer, but only csp
163 // is initialized by the calling (C++) code.
164 Register old_stack_pointer = __ StackPointer();
165 __ SetStackPointer(csp);
166 __ Push(root, xzr);
167 __ InitializeRootRegister();
168 __ Mov(x0, key);
169 __ GetNumberHash(x0, x10);
170 __ Pop(xzr, root);
171 __ Ret();
172 __ SetStackPointer(old_stack_pointer);
141 #elif V8_TARGET_ARCH_MIPS 173 #elif V8_TARGET_ARCH_MIPS
142 __ push(kRootRegister); 174 __ push(kRootRegister);
143 __ InitializeRootRegister(); 175 __ InitializeRootRegister();
144 __ li(v0, Operand(key)); 176 __ li(v0, Operand(key));
145 __ GetNumberHash(v0, t1); 177 __ GetNumberHash(v0, t1);
146 __ pop(kRootRegister); 178 __ pop(kRootRegister);
147 __ jr(ra); 179 __ jr(ra);
148 __ nop(); 180 __ nop();
181 #else
182 #error Unsupported architecture.
149 #endif 183 #endif
150 } 184 }
151 185
152 186
153 void check(i::Vector<const uint8_t> string) { 187 void check(i::Vector<const uint8_t> string) {
154 Isolate* isolate = CcTest::i_isolate(); 188 Isolate* isolate = CcTest::i_isolate();
155 Factory* factory = isolate->factory(); 189 Factory* factory = isolate->factory();
156 HandleScope scope(isolate); 190 HandleScope scope(isolate);
157 191
158 v8::internal::byte buffer[2048]; 192 v8::internal::byte buffer[2048];
159 MacroAssembler masm(isolate, buffer, sizeof buffer); 193 MacroAssembler masm(isolate, buffer, sizeof buffer);
160 194
161 generate(&masm, string); 195 generate(&masm, string);
162 196
163 CodeDesc desc; 197 CodeDesc desc;
164 masm.GetCode(&desc); 198 masm.GetCode(&desc);
165 Handle<Object> undefined(isolate->heap()->undefined_value(), isolate); 199 Handle<Object> undefined(isolate->heap()->undefined_value(), isolate);
166 Handle<Code> code = factory->NewCode(desc, 200 Handle<Code> code = factory->NewCode(desc,
167 Code::ComputeFlags(Code::STUB), 201 Code::ComputeFlags(Code::STUB),
168 undefined); 202 undefined);
169 CHECK(code->IsCode()); 203 CHECK(code->IsCode());
170 204
171 HASH_FUNCTION hash = FUNCTION_CAST<HASH_FUNCTION>(code->entry()); 205 HASH_FUNCTION hash = FUNCTION_CAST<HASH_FUNCTION>(code->entry());
172 Handle<String> v8_string = factory->NewStringFromOneByte(string); 206 Handle<String> v8_string = factory->NewStringFromOneByte(string);
173 v8_string->set_hash_field(String::kEmptyHashField); 207 v8_string->set_hash_field(String::kEmptyHashField);
174 #ifdef USE_SIMULATOR 208 #ifdef USE_SIMULATOR
175 uint32_t codegen_hash = 209 uint32_t codegen_hash = static_cast<uint32_t>(
176 reinterpret_cast<uint32_t>(CALL_GENERATED_CODE(hash, 0, 0, 0, 0, 0)); 210 reinterpret_cast<uintptr_t>(CALL_GENERATED_CODE(hash, 0, 0, 0, 0, 0)));
177 #else 211 #else
178 uint32_t codegen_hash = hash(); 212 uint32_t codegen_hash = hash();
179 #endif 213 #endif
180 uint32_t runtime_hash = v8_string->Hash(); 214 uint32_t runtime_hash = v8_string->Hash();
181 CHECK(runtime_hash == codegen_hash); 215 CHECK(runtime_hash == codegen_hash);
182 } 216 }
183 217
184 218
185 void check(i::Vector<const char> s) { 219 void check(i::Vector<const char> s) {
186 check(i::Vector<const uint8_t>::cast(s)); 220 check(i::Vector<const uint8_t>::cast(s));
(...skipping 13 matching lines...) Expand all
200 CodeDesc desc; 234 CodeDesc desc;
201 masm.GetCode(&desc); 235 masm.GetCode(&desc);
202 Handle<Object> undefined(isolate->heap()->undefined_value(), isolate); 236 Handle<Object> undefined(isolate->heap()->undefined_value(), isolate);
203 Handle<Code> code = factory->NewCode(desc, 237 Handle<Code> code = factory->NewCode(desc,
204 Code::ComputeFlags(Code::STUB), 238 Code::ComputeFlags(Code::STUB),
205 undefined); 239 undefined);
206 CHECK(code->IsCode()); 240 CHECK(code->IsCode());
207 241
208 HASH_FUNCTION hash = FUNCTION_CAST<HASH_FUNCTION>(code->entry()); 242 HASH_FUNCTION hash = FUNCTION_CAST<HASH_FUNCTION>(code->entry());
209 #ifdef USE_SIMULATOR 243 #ifdef USE_SIMULATOR
210 uint32_t codegen_hash = 244 uint32_t codegen_hash = static_cast<uint32_t>(
211 reinterpret_cast<uint32_t>(CALL_GENERATED_CODE(hash, 0, 0, 0, 0, 0)); 245 reinterpret_cast<uintptr_t>(CALL_GENERATED_CODE(hash, 0, 0, 0, 0, 0)));
212 #else 246 #else
213 uint32_t codegen_hash = hash(); 247 uint32_t codegen_hash = hash();
214 #endif 248 #endif
215 249
216 uint32_t runtime_hash = ComputeIntegerHash(key, isolate->heap()->HashSeed()); 250 uint32_t runtime_hash = ComputeIntegerHash(key, isolate->heap()->HashSeed());
217 CHECK(runtime_hash == codegen_hash); 251 CHECK(runtime_hash == codegen_hash);
218 } 252 }
219 253
220 254
221 void check_twochars(uint8_t a, uint8_t b) { 255 void check_twochars(uint8_t a, uint8_t b) {
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
263 // Some pseudo-random numbers 297 // Some pseudo-random numbers
264 static const uint32_t kLimit = 1000; 298 static const uint32_t kLimit = 1000;
265 for (uint32_t i = 0; i < 5; i++) { 299 for (uint32_t i = 0; i < 5; i++) {
266 for (uint32_t j = 0; j < 5; j++) { 300 for (uint32_t j = 0; j < 5; j++) {
267 check(PseudoRandom(i, j) % kLimit); 301 check(PseudoRandom(i, j) % kLimit);
268 } 302 }
269 } 303 }
270 } 304 }
271 305
272 #undef __ 306 #undef __
OLDNEW
« no previous file with comments | « test/cctest/test-fuzz-a64.cc ('k') | test/cctest/test-heap.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698