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

Side by Side Diff: src/builtins-ia32.cc

Issue 4035: Refactored the code for entering and leaving exit frames (calls... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: Created 12 years, 3 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
OLDNEW
1 // Copyright 2006-2008 the V8 project authors. All rights reserved. 1 // Copyright 2006-2008 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 280 matching lines...) Expand 10 before | Expand all | Expand 10 after
291 __ j(greater_equal, &exit, not_taken); 291 __ j(greater_equal, &exit, not_taken);
292 292
293 // Throw away the result of the constructor invocation and use the 293 // Throw away the result of the constructor invocation and use the
294 // on-stack receiver as the result. 294 // on-stack receiver as the result.
295 __ bind(&use_receiver); 295 __ bind(&use_receiver);
296 __ mov(eax, Operand(esp, 0)); 296 __ mov(eax, Operand(esp, 0));
297 297
298 // Restore the arguments count and exit the internal frame. 298 // Restore the arguments count and exit the internal frame.
299 __ bind(&exit); 299 __ bind(&exit);
300 __ mov(ebx, Operand(esp, kPointerSize)); // get arguments count 300 __ mov(ebx, Operand(esp, kPointerSize)); // get arguments count
301 __ ExitInternalFrame(); 301 __ LeaveInternalFrame();
302 302
303 // Remove caller arguments from the stack and return. 303 // Remove caller arguments from the stack and return.
304 ASSERT(kSmiTagSize == 1 && kSmiTag == 0); 304 ASSERT(kSmiTagSize == 1 && kSmiTag == 0);
305 __ pop(ecx); 305 __ pop(ecx);
306 __ lea(esp, Operand(esp, ebx, times_2, 1 * kPointerSize)); // 1 ~ receiver 306 __ lea(esp, Operand(esp, ebx, times_2, 1 * kPointerSize)); // 1 ~ receiver
307 __ push(ecx); 307 __ push(ecx);
308 __ ret(0); 308 __ ret(0);
309 309
310 // Compute the offset from the beginning of the JSConstructCall 310 // Compute the offset from the beginning of the JSConstructCall
311 // builtin code object to the return address after the call. 311 // builtin code object to the return address after the call.
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
357 __ call(Handle<Code>(Builtins::builtin(Builtins::JSConstructCall)), 357 __ call(Handle<Code>(Builtins::builtin(Builtins::JSConstructCall)),
358 code_target); 358 code_target);
359 } else { 359 } else {
360 ParameterCount actual(eax); 360 ParameterCount actual(eax);
361 __ InvokeFunction(edi, actual, CALL_FUNCTION); 361 __ InvokeFunction(edi, actual, CALL_FUNCTION);
362 } 362 }
363 363
364 // Exit the JS frame. Notice that this also removes the empty 364 // Exit the JS frame. Notice that this also removes the empty
365 // context and the function left on the stack by the code 365 // context and the function left on the stack by the code
366 // invocation. 366 // invocation.
367 __ ExitInternalFrame(); 367 __ LeaveInternalFrame();
368 __ ret(1 * kPointerSize); // remove receiver 368 __ ret(1 * kPointerSize); // remove receiver
369 } 369 }
370 370
371 371
372 void Builtins::Generate_JSEntryTrampoline(MacroAssembler* masm) { 372 void Builtins::Generate_JSEntryTrampoline(MacroAssembler* masm) {
373 Generate_JSEntryTrampolineHelper(masm, false); 373 Generate_JSEntryTrampolineHelper(masm, false);
374 } 374 }
375 375
376 376
377 void Builtins::Generate_JSConstructEntryTrampoline(MacroAssembler* masm) { 377 void Builtins::Generate_JSConstructEntryTrampoline(MacroAssembler* masm) {
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
444 __ push(edi); // save edi across the call 444 __ push(edi); // save edi across the call
445 __ push(ebx); 445 __ push(ebx);
446 __ InvokeBuiltin(Builtins::TO_OBJECT, CALL_FUNCTION); 446 __ InvokeBuiltin(Builtins::TO_OBJECT, CALL_FUNCTION);
447 __ mov(Operand(ebx), eax); 447 __ mov(Operand(ebx), eax);
448 __ pop(edi); // restore edi after the call 448 __ pop(edi); // restore edi after the call
449 449
450 // Get the arguments count and untag it. 450 // Get the arguments count and untag it.
451 __ pop(eax); 451 __ pop(eax);
452 __ shr(eax, kSmiTagSize); 452 __ shr(eax, kSmiTagSize);
453 453
454 __ ExitInternalFrame(); 454 __ LeaveInternalFrame();
455 __ jmp(&patch_receiver); 455 __ jmp(&patch_receiver);
456 456
457 // Use the global object from the called function as the receiver. 457 // Use the global object from the called function as the receiver.
458 __ bind(&use_global_receiver); 458 __ bind(&use_global_receiver);
459 const int kGlobalIndex = 459 const int kGlobalIndex =
460 Context::kHeaderSize + Context::GLOBAL_INDEX * kPointerSize; 460 Context::kHeaderSize + Context::GLOBAL_INDEX * kPointerSize;
461 __ mov(ebx, FieldOperand(esi, kGlobalIndex)); 461 __ mov(ebx, FieldOperand(esi, kGlobalIndex));
462 462
463 __ bind(&patch_receiver); 463 __ bind(&patch_receiver);
464 __ mov(Operand(esp, eax, times_4, 0), ebx); 464 __ mov(Operand(esp, eax, times_4, 0), ebx);
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
606 __ bind(&entry); 606 __ bind(&entry);
607 __ cmp(eax, Operand(ebp, kLimitOffset)); 607 __ cmp(eax, Operand(ebp, kLimitOffset));
608 __ j(not_equal, &loop); 608 __ j(not_equal, &loop);
609 609
610 // Invoke the function. 610 // Invoke the function.
611 ParameterCount actual(eax); 611 ParameterCount actual(eax);
612 __ shr(eax, kSmiTagSize); 612 __ shr(eax, kSmiTagSize);
613 __ mov(edi, Operand(ebp, 4 * kPointerSize)); 613 __ mov(edi, Operand(ebp, 4 * kPointerSize));
614 __ InvokeFunction(edi, actual, CALL_FUNCTION); 614 __ InvokeFunction(edi, actual, CALL_FUNCTION);
615 615
616 __ ExitInternalFrame(); 616 __ LeaveInternalFrame();
617 __ ret(3 * kPointerSize); // remove this, receiver, and arguments 617 __ ret(3 * kPointerSize); // remove this, receiver, and arguments
618 } 618 }
619 619
620 620
621 static void EnterArgumentsAdaptorFrame(MacroAssembler* masm) { 621 static void EnterArgumentsAdaptorFrame(MacroAssembler* masm) {
622 __ push(ebp); 622 __ push(ebp);
623 __ mov(ebp, Operand(esp)); 623 __ mov(ebp, Operand(esp));
624 624
625 // Store the arguments adaptor context sentinel. 625 // Store the arguments adaptor context sentinel.
626 __ push(Immediate(ArgumentsAdaptorFrame::SENTINEL)); 626 __ push(Immediate(ArgumentsAdaptorFrame::SENTINEL));
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
764 __ mov(Operand(ebx), Immediate(ExternalReference::debug_break())); 764 __ mov(Operand(ebx), Immediate(ExternalReference::debug_break()));
765 765
766 CEntryDebugBreakStub ceb; 766 CEntryDebugBreakStub ceb;
767 __ CallStub(&ceb); 767 __ CallStub(&ceb);
768 768
769 // Restore the register values containing object pointers from the expression 769 // Restore the register values containing object pointers from the expression
770 // stack in the reverse order as they where pushed. 770 // stack in the reverse order as they where pushed.
771 __ PopRegistersToMemory(pointer_regs); 771 __ PopRegistersToMemory(pointer_regs);
772 772
773 // Get rid of the internal frame. 773 // Get rid of the internal frame.
774 __ ExitInternalFrame(); 774 __ LeaveInternalFrame();
775 775
776 // If this call did not replace a call but patched other code then there will 776 // If this call did not replace a call but patched other code then there will
777 // be an unwanted return address left on the stack. Here we get rid of that. 777 // be an unwanted return address left on the stack. Here we get rid of that.
778 if (convert_call_to_jmp) { 778 if (convert_call_to_jmp) {
779 __ pop(eax); 779 __ pop(eax);
780 } 780 }
781 781
782 // Finally restore all registers. 782 // Finally restore all registers.
783 __ RestoreRegistersFromMemory(kJSCallerSaved); 783 __ RestoreRegistersFromMemory(kJSCallerSaved);
784 784
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
876 // Register state for stub CallFunction (from CallFunctionStub in ic-ia32.cc). 876 // Register state for stub CallFunction (from CallFunctionStub in ic-ia32.cc).
877 // ----------- S t a t e ------------- 877 // ----------- S t a t e -------------
878 // No registers used on entry. 878 // No registers used on entry.
879 // ----------------------------------- 879 // -----------------------------------
880 Generate_DebugBreakCallHelper(masm, 0, false); 880 Generate_DebugBreakCallHelper(masm, 0, false);
881 } 881 }
882 882
883 #undef __ 883 #undef __
884 884
885 } } // namespace v8::internal 885 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/builtins-arm.cc ('k') | src/codegen-arm.cc » ('j') | src/codegen-arm.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698