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

Side by Side Diff: src/ia32/virtual-frame-ia32.cc

Issue 515012: Use a loop in generated code to allocate stack slots for function with many l... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 10 years, 12 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/ia32/virtual-frame-ia32.h ('k') | src/x64/virtual-frame-x64.h » ('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 2009 the V8 project authors. All rights reserved. 1 // Copyright 2009 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 495 matching lines...) Expand 10 before | Expand all | Expand 10 after
506 if (count > 0) { 506 if (count > 0) {
507 Comment cmnt(masm(), "[ Allocate space for locals"); 507 Comment cmnt(masm(), "[ Allocate space for locals");
508 // The locals are initialized to a constant (the undefined value), but 508 // The locals are initialized to a constant (the undefined value), but
509 // we sync them with the actual frame to allocate space for spilling 509 // we sync them with the actual frame to allocate space for spilling
510 // them later. First sync everything above the stack pointer so we can 510 // them later. First sync everything above the stack pointer so we can
511 // use pushes to allocate and initialize the locals. 511 // use pushes to allocate and initialize the locals.
512 SyncRange(stack_pointer_ + 1, element_count() - 1); 512 SyncRange(stack_pointer_ + 1, element_count() - 1);
513 Handle<Object> undefined = Factory::undefined_value(); 513 Handle<Object> undefined = Factory::undefined_value();
514 FrameElement initial_value = 514 FrameElement initial_value =
515 FrameElement::ConstantElement(undefined, FrameElement::SYNCED); 515 FrameElement::ConstantElement(undefined, FrameElement::SYNCED);
516 Result temp = cgen()->allocator()->Allocate(); 516 if (count == 1) {
517 ASSERT(temp.is_valid()); 517 __ push(Immediate(undefined));
518 __ Set(temp.reg(), Immediate(undefined)); 518 } else if (count < kLocalVarBound) {
519 // For less locals the unrolled loop is more compact.
520 Result temp = cgen()->allocator()->Allocate();
521 ASSERT(temp.is_valid());
522 __ Set(temp.reg(), Immediate(undefined));
523 for (int i = 0; i < count; i++) {
524 __ push(temp.reg());
525 }
526 } else {
527 // For more locals a loop in generated code is more compact.
528 Label alloc_locals_loop;
529 Result cnt = cgen()->allocator()->Allocate();
530 Result tmp = cgen()->allocator()->Allocate();
531 ASSERT(cnt.is_valid());
532 ASSERT(tmp.is_valid());
533 __ mov(cnt.reg(), Immediate(count));
534 __ mov(tmp.reg(), Immediate(undefined));
535 __ bind(&alloc_locals_loop);
536 __ push(tmp.reg());
537 __ dec(cnt.reg());
538 __ j(not_zero, &alloc_locals_loop);
539 }
519 for (int i = 0; i < count; i++) { 540 for (int i = 0; i < count; i++) {
520 elements_.Add(initial_value); 541 elements_.Add(initial_value);
521 stack_pointer_++; 542 stack_pointer_++;
522 __ push(temp.reg());
523 } 543 }
524 } 544 }
525 } 545 }
526 546
527 547
528 void VirtualFrame::SaveContextRegister() { 548 void VirtualFrame::SaveContextRegister() {
529 ASSERT(elements_[context_index()].is_memory()); 549 ASSERT(elements_[context_index()].is_memory());
530 __ mov(Operand(ebp, fp_relative(context_index())), esi); 550 __ mov(Operand(ebp, fp_relative(context_index())), esi);
531 } 551 }
532 552
(...skipping 543 matching lines...) Expand 10 before | Expand all | Expand 10 after
1076 ASSERT(stack_pointer_ == element_count() - 1); 1096 ASSERT(stack_pointer_ == element_count() - 1);
1077 elements_.Add(FrameElement::MemoryElement()); 1097 elements_.Add(FrameElement::MemoryElement());
1078 stack_pointer_++; 1098 stack_pointer_++;
1079 __ push(immediate); 1099 __ push(immediate);
1080 } 1100 }
1081 1101
1082 1102
1083 #undef __ 1103 #undef __
1084 1104
1085 } } // namespace v8::internal 1105 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/ia32/virtual-frame-ia32.h ('k') | src/x64/virtual-frame-x64.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698