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

Side by Side Diff: src/arm/codegen-arm.cc

Issue 3152016: Remove experimental fast-codegen. We are no longer working on this (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: Created 10 years, 4 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 | « src/SConscript ('k') | src/arm/fast-codegen-arm.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 2010 the V8 project authors. All rights reserved. 1 // Copyright 2010 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 199 matching lines...) Expand 10 before | Expand all | Expand 10 after
210 allocator_->Initialize(); 210 allocator_->Initialize();
211 211
212 #ifdef DEBUG 212 #ifdef DEBUG
213 if (strlen(FLAG_stop_at) > 0 && 213 if (strlen(FLAG_stop_at) > 0 &&
214 info->function()->name()->IsEqualTo(CStrVector(FLAG_stop_at))) { 214 info->function()->name()->IsEqualTo(CStrVector(FLAG_stop_at))) {
215 frame_->SpillAll(); 215 frame_->SpillAll();
216 __ stop("stop-at"); 216 __ stop("stop-at");
217 } 217 }
218 #endif 218 #endif
219 219
220 if (info->mode() == CompilationInfo::PRIMARY) { 220 frame_->Enter();
221 frame_->Enter(); 221 // tos: code slot
222 // tos: code slot
223 222
224 // Allocate space for locals and initialize them. This also checks 223 // Allocate space for locals and initialize them. This also checks
225 // for stack overflow. 224 // for stack overflow.
226 frame_->AllocateStackSlots(); 225 frame_->AllocateStackSlots();
227 226
228 frame_->AssertIsSpilled(); 227 frame_->AssertIsSpilled();
229 int heap_slots = scope()->num_heap_slots() - Context::MIN_CONTEXT_SLOTS; 228 int heap_slots = scope()->num_heap_slots() - Context::MIN_CONTEXT_SLOTS;
230 if (heap_slots > 0) { 229 if (heap_slots > 0) {
231 // Allocate local context. 230 // Allocate local context.
232 // Get outer context and create a new context based on it. 231 // Get outer context and create a new context based on it.
233 __ ldr(r0, frame_->Function()); 232 __ ldr(r0, frame_->Function());
234 frame_->EmitPush(r0); 233 frame_->EmitPush(r0);
235 if (heap_slots <= FastNewContextStub::kMaximumSlots) { 234 if (heap_slots <= FastNewContextStub::kMaximumSlots) {
236 FastNewContextStub stub(heap_slots); 235 FastNewContextStub stub(heap_slots);
237 frame_->CallStub(&stub, 1); 236 frame_->CallStub(&stub, 1);
238 } else { 237 } else {
239 frame_->CallRuntime(Runtime::kNewContext, 1); 238 frame_->CallRuntime(Runtime::kNewContext, 1);
240 } 239 }
241 240
242 #ifdef DEBUG 241 #ifdef DEBUG
243 JumpTarget verified_true; 242 JumpTarget verified_true;
244 __ cmp(r0, cp); 243 __ cmp(r0, cp);
245 verified_true.Branch(eq); 244 verified_true.Branch(eq);
246 __ stop("NewContext: r0 is expected to be the same as cp"); 245 __ stop("NewContext: r0 is expected to be the same as cp");
247 verified_true.Bind(); 246 verified_true.Bind();
248 #endif 247 #endif
249 // Update context local. 248 // Update context local.
250 __ str(cp, frame_->Context()); 249 __ str(cp, frame_->Context());
251 } 250 }
252 251
253 // TODO(1241774): Improve this code: 252 // TODO(1241774): Improve this code:
254 // 1) only needed if we have a context 253 // 1) only needed if we have a context
255 // 2) no need to recompute context ptr every single time 254 // 2) no need to recompute context ptr every single time
256 // 3) don't copy parameter operand code from SlotOperand! 255 // 3) don't copy parameter operand code from SlotOperand!
257 { 256 {
258 Comment cmnt2(masm_, "[ copy context parameters into .context"); 257 Comment cmnt2(masm_, "[ copy context parameters into .context");
259 // Note that iteration order is relevant here! If we have the same 258 // Note that iteration order is relevant here! If we have the same
260 // parameter twice (e.g., function (x, y, x)), and that parameter 259 // parameter twice (e.g., function (x, y, x)), and that parameter
261 // needs to be copied into the context, it must be the last argument 260 // needs to be copied into the context, it must be the last argument
262 // passed to the parameter that needs to be copied. This is a rare 261 // passed to the parameter that needs to be copied. This is a rare
263 // case so we don't check for it, instead we rely on the copying 262 // case so we don't check for it, instead we rely on the copying
264 // order: such a parameter is copied repeatedly into the same 263 // order: such a parameter is copied repeatedly into the same
265 // context location and thus the last value is what is seen inside 264 // context location and thus the last value is what is seen inside
266 // the function. 265 // the function.
267 frame_->AssertIsSpilled(); 266 frame_->AssertIsSpilled();
268 for (int i = 0; i < scope()->num_parameters(); i++) { 267 for (int i = 0; i < scope()->num_parameters(); i++) {
269 Variable* par = scope()->parameter(i); 268 Variable* par = scope()->parameter(i);
270 Slot* slot = par->slot(); 269 Slot* slot = par->slot();
271 if (slot != NULL && slot->type() == Slot::CONTEXT) { 270 if (slot != NULL && slot->type() == Slot::CONTEXT) {
272 ASSERT(!scope()->is_global_scope()); // No params in global scope. 271 ASSERT(!scope()->is_global_scope()); // No params in global scope.
273 __ ldr(r1, frame_->ParameterAt(i)); 272 __ ldr(r1, frame_->ParameterAt(i));
274 // Loads r2 with context; used below in RecordWrite. 273 // Loads r2 with context; used below in RecordWrite.
275 __ str(r1, SlotOperand(slot, r2)); 274 __ str(r1, SlotOperand(slot, r2));
276 // Load the offset into r3. 275 // Load the offset into r3.
277 int slot_offset = 276 int slot_offset =
278 FixedArray::kHeaderSize + slot->index() * kPointerSize; 277 FixedArray::kHeaderSize + slot->index() * kPointerSize;
279 __ RecordWrite(r2, Operand(slot_offset), r3, r1); 278 __ RecordWrite(r2, Operand(slot_offset), r3, r1);
280 }
281 } 279 }
282 } 280 }
283
284 // Store the arguments object. This must happen after context
285 // initialization because the arguments object may be stored in
286 // the context.
287 if (ArgumentsMode() != NO_ARGUMENTS_ALLOCATION) {
288 StoreArgumentsObject(true);
289 }
290
291 // Initialize ThisFunction reference if present.
292 if (scope()->is_function_scope() && scope()->function() != NULL) {
293 frame_->EmitPushRoot(Heap::kTheHoleValueRootIndex);
294 StoreToSlot(scope()->function()->slot(), NOT_CONST_INIT);
295 }
296 } else {
297 // When used as the secondary compiler for splitting, r1, cp,
298 // fp, and lr have been pushed on the stack. Adjust the virtual
299 // frame to match this state.
300 frame_->Adjust(4);
301
302 // Bind all the bailout labels to the beginning of the function.
303 List<CompilationInfo::Bailout*>* bailouts = info->bailouts();
304 for (int i = 0; i < bailouts->length(); i++) {
305 __ bind(bailouts->at(i)->label());
306 }
307 } 281 }
308 282
283 // Store the arguments object. This must happen after context
284 // initialization because the arguments object may be stored in
285 // the context.
286 if (ArgumentsMode() != NO_ARGUMENTS_ALLOCATION) {
287 StoreArgumentsObject(true);
288 }
289
290 // Initialize ThisFunction reference if present.
291 if (scope()->is_function_scope() && scope()->function() != NULL) {
292 frame_->EmitPushRoot(Heap::kTheHoleValueRootIndex);
293 StoreToSlot(scope()->function()->slot(), NOT_CONST_INIT);
294 }
295
309 // Initialize the function return target after the locals are set 296 // Initialize the function return target after the locals are set
310 // up, because it needs the expected frame height from the frame. 297 // up, because it needs the expected frame height from the frame.
311 function_return_.SetExpectedHeight(); 298 function_return_.SetExpectedHeight();
312 function_return_is_shadowed_ = false; 299 function_return_is_shadowed_ = false;
313 300
314 // Generate code to 'execute' declarations and initialize functions 301 // Generate code to 'execute' declarations and initialize functions
315 // (source elements). In case of an illegal redeclaration we need to 302 // (source elements). In case of an illegal redeclaration we need to
316 // handle that instead of processing the declarations. 303 // handle that instead of processing the declarations.
317 if (scope()->HasIllegalRedeclaration()) { 304 if (scope()->HasIllegalRedeclaration()) {
318 Comment cmnt(masm_, "[ illegal redeclarations"); 305 Comment cmnt(masm_, "[ illegal redeclarations");
(...skipping 11257 matching lines...) Expand 10 before | Expand all | Expand 10 after
11576 __ bind(&string_add_runtime); 11563 __ bind(&string_add_runtime);
11577 __ TailCallRuntime(Runtime::kStringAdd, 2, 1); 11564 __ TailCallRuntime(Runtime::kStringAdd, 2, 1);
11578 } 11565 }
11579 11566
11580 11567
11581 #undef __ 11568 #undef __
11582 11569
11583 } } // namespace v8::internal 11570 } } // namespace v8::internal
11584 11571
11585 #endif // V8_TARGET_ARCH_ARM 11572 #endif // V8_TARGET_ARCH_ARM
OLDNEW
« no previous file with comments | « src/SConscript ('k') | src/arm/fast-codegen-arm.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698