OLD | NEW |
1 // Copyright 2006-2009 the V8 project authors. All rights reserved. | 1 // Copyright 2006-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 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
116 | 116 |
117 void EnterConstructFrame() { EnterFrame(StackFrame::CONSTRUCT); } | 117 void EnterConstructFrame() { EnterFrame(StackFrame::CONSTRUCT); } |
118 void LeaveConstructFrame() { LeaveFrame(StackFrame::CONSTRUCT); } | 118 void LeaveConstructFrame() { LeaveFrame(StackFrame::CONSTRUCT); } |
119 | 119 |
120 // Enter specific kind of exit frame; either in normal or debug mode. | 120 // Enter specific kind of exit frame; either in normal or debug mode. |
121 // Expects the number of arguments in register eax and | 121 // Expects the number of arguments in register eax and |
122 // sets up the number of arguments in register edi and the pointer | 122 // sets up the number of arguments in register edi and the pointer |
123 // to the first argument in register esi. | 123 // to the first argument in register esi. |
124 void EnterExitFrame(); | 124 void EnterExitFrame(); |
125 | 125 |
126 void EnterApiExitFrame(int stack_space, int argc); | 126 void EnterApiExitFrame(int argc); |
127 | 127 |
128 // Leave the current exit frame. Expects the return value in | 128 // Leave the current exit frame. Expects the return value in |
129 // register eax:edx (untouched) and the pointer to the first | 129 // register eax:edx (untouched) and the pointer to the first |
130 // argument in register esi. | 130 // argument in register esi. |
131 void LeaveExitFrame(); | 131 void LeaveExitFrame(); |
132 | 132 |
| 133 // Leave the current exit frame. Expects the return value in |
| 134 // register eax (untouched). |
| 135 void LeaveApiExitFrame(); |
| 136 |
133 // Find the function context up the context chain. | 137 // Find the function context up the context chain. |
134 void LoadContext(Register dst, int context_chain_length); | 138 void LoadContext(Register dst, int context_chain_length); |
135 | 139 |
136 // Load the global function with the given index. | 140 // Load the global function with the given index. |
137 void LoadGlobalFunction(int index, Register function); | 141 void LoadGlobalFunction(int index, Register function); |
138 | 142 |
139 // Load the initial map from the global function. The registers | 143 // Load the initial map from the global function. The registers |
140 // function and map can be the same. | 144 // function and map can be the same. |
141 void LoadGlobalFunctionInitialMap(Register function, Register map); | 145 void LoadGlobalFunctionInitialMap(Register function, Register map); |
142 | 146 |
(...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
453 // Convenience function: call an external reference. | 457 // Convenience function: call an external reference. |
454 void CallExternalReference(ExternalReference ref, int num_arguments); | 458 void CallExternalReference(ExternalReference ref, int num_arguments); |
455 | 459 |
456 // Tail call of a runtime routine (jump). | 460 // Tail call of a runtime routine (jump). |
457 // Like JumpToExternalReference, but also takes care of passing the number | 461 // Like JumpToExternalReference, but also takes care of passing the number |
458 // of parameters. | 462 // of parameters. |
459 void TailCallExternalReference(const ExternalReference& ext, | 463 void TailCallExternalReference(const ExternalReference& ext, |
460 int num_arguments, | 464 int num_arguments, |
461 int result_size); | 465 int result_size); |
462 | 466 |
| 467 // Tail call of a runtime routine (jump). Try to generate the code if |
| 468 // necessary. Do not perform a GC but instead return a retry after GC failure. |
| 469 MUST_USE_RESULT MaybeObject* TryTailCallExternalReference( |
| 470 const ExternalReference& ext, int num_arguments, int result_size); |
| 471 |
463 // Convenience function: tail call a runtime routine (jump). | 472 // Convenience function: tail call a runtime routine (jump). |
464 void TailCallRuntime(Runtime::FunctionId fid, | 473 void TailCallRuntime(Runtime::FunctionId fid, |
465 int num_arguments, | 474 int num_arguments, |
466 int result_size); | 475 int result_size); |
467 | 476 |
| 477 // Convenience function: tail call a runtime routine (jump). Try to generate |
| 478 // the code if necessary. Do not perform a GC but instead return a retry after |
| 479 // GC failure. |
| 480 MUST_USE_RESULT MaybeObject* TryTailCallRuntime(Runtime::FunctionId fid, |
| 481 int num_arguments, |
| 482 int result_size); |
| 483 |
468 // Before calling a C-function from generated code, align arguments on stack. | 484 // Before calling a C-function from generated code, align arguments on stack. |
469 // After aligning the frame, arguments must be stored in esp[0], esp[4], | 485 // After aligning the frame, arguments must be stored in esp[0], esp[4], |
470 // etc., not pushed. The argument count assumes all arguments are word sized. | 486 // etc., not pushed. The argument count assumes all arguments are word sized. |
471 // Some compilers/platforms require the stack to be aligned when calling | 487 // Some compilers/platforms require the stack to be aligned when calling |
472 // C++ code. | 488 // C++ code. |
473 // Needs a scratch register to do some arithmetic. This register will be | 489 // Needs a scratch register to do some arithmetic. This register will be |
474 // trashed. | 490 // trashed. |
475 void PrepareCallCFunction(int num_arguments, Register scratch); | 491 void PrepareCallCFunction(int num_arguments, Register scratch); |
476 | 492 |
477 // Calls a C function and cleans up the space for arguments allocated | 493 // Calls a C function and cleans up the space for arguments allocated |
478 // by PrepareCallCFunction. The called function is not allowed to trigger a | 494 // by PrepareCallCFunction. The called function is not allowed to trigger a |
479 // garbage collection, since that might move the code and invalidate the | 495 // garbage collection, since that might move the code and invalidate the |
480 // return address (unless this is somehow accounted for by the called | 496 // return address (unless this is somehow accounted for by the called |
481 // function). | 497 // function). |
482 void CallCFunction(ExternalReference function, int num_arguments); | 498 void CallCFunction(ExternalReference function, int num_arguments); |
483 void CallCFunction(Register function, int num_arguments); | 499 void CallCFunction(Register function, int num_arguments); |
484 | 500 |
485 // Prepares stack to put arguments (aligns and so on). Reserves | 501 // Prepares stack to put arguments (aligns and so on). Reserves |
486 // space for return value if needed (assumes the return value is a handle). | 502 // space for return value if needed (assumes the return value is a handle). |
487 // Uses callee-saved esi to restore stack state after call. Arguments must be | 503 // Uses callee-saved esi to restore stack state after call. Arguments must be |
488 // stored in ApiParameterOperand(0), ApiParameterOperand(1) etc. | 504 // stored in ApiParameterOperand(0), ApiParameterOperand(1) etc. Saves |
489 void PrepareCallApiFunction(int stack_space, int argc); | 505 // context (esi). |
| 506 void PrepareCallApiFunction(int argc, Register scratch); |
490 | 507 |
491 // Calls an API function. Allocates HandleScope, extracts | 508 // Calls an API function. Allocates HandleScope, extracts |
492 // returned value from handle and propagates exceptions. | 509 // returned value from handle and propagates exceptions. |
493 // Clobbers ebx, esi, edi and caller-save registers. | 510 // Clobbers ebx, edi and caller-save registers. Restores context. |
494 void CallApiFunctionAndReturn(ApiFunction* function, int argc); | 511 // On return removes stack_space * kPointerSize (GCed). |
| 512 MaybeObject* TryCallApiFunctionAndReturn(ApiFunction* function, |
| 513 int stack_space); |
495 | 514 |
496 // Jump to a runtime routine. | 515 // Jump to a runtime routine. |
497 void JumpToExternalReference(const ExternalReference& ext); | 516 void JumpToExternalReference(const ExternalReference& ext); |
498 | 517 |
| 518 MaybeObject* TryJumpToExternalReference(const ExternalReference& ext); |
| 519 |
499 | 520 |
500 // --------------------------------------------------------------------------- | 521 // --------------------------------------------------------------------------- |
501 // Utilities | 522 // Utilities |
502 | 523 |
503 void Ret(); | 524 void Ret(); |
504 | 525 |
505 // Emit code to discard a non-negative number of pointer-sized elements | 526 // Emit code to discard a non-negative number of pointer-sized elements |
506 // from the stack, clobbering only the esp register. | 527 // from the stack, clobbering only the esp register. |
507 void Drop(int element_count); | 528 void Drop(int element_count); |
508 | 529 |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
582 Label* done, | 603 Label* done, |
583 InvokeFlag flag); | 604 InvokeFlag flag); |
584 | 605 |
585 // Activation support. | 606 // Activation support. |
586 void EnterFrame(StackFrame::Type type); | 607 void EnterFrame(StackFrame::Type type); |
587 void LeaveFrame(StackFrame::Type type); | 608 void LeaveFrame(StackFrame::Type type); |
588 | 609 |
589 void EnterExitFramePrologue(); | 610 void EnterExitFramePrologue(); |
590 void EnterExitFrameEpilogue(int argc); | 611 void EnterExitFrameEpilogue(int argc); |
591 | 612 |
| 613 void LeaveExitFrameEpilogue(); |
| 614 |
592 // Allocation support helpers. | 615 // Allocation support helpers. |
593 void LoadAllocationTopHelper(Register result, | 616 void LoadAllocationTopHelper(Register result, |
594 Register result_end, | 617 Register result_end, |
595 Register scratch, | 618 Register scratch, |
596 AllocationFlags flags); | 619 AllocationFlags flags); |
597 void UpdateAllocationTopHelper(Register result_end, Register scratch); | 620 void UpdateAllocationTopHelper(Register result_end, Register scratch); |
598 | 621 |
599 // Helper for PopHandleScope. Allowed to perform a GC and returns | 622 // Helper for PopHandleScope. Allowed to perform a GC and returns |
600 // NULL if gc_allowed. Does not perform a GC if !gc_allowed, and | 623 // NULL if gc_allowed. Does not perform a GC if !gc_allowed, and |
601 // possibly returns a failure object indicating an allocation failure. | 624 // possibly returns a failure object indicating an allocation failure. |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
635 | 658 |
636 | 659 |
637 // Generate an Operand for loading an indexed field from an object. | 660 // Generate an Operand for loading an indexed field from an object. |
638 static inline Operand FieldOperand(Register object, | 661 static inline Operand FieldOperand(Register object, |
639 Register index, | 662 Register index, |
640 ScaleFactor scale, | 663 ScaleFactor scale, |
641 int offset) { | 664 int offset) { |
642 return Operand(object, index, scale, offset - kHeapObjectTag); | 665 return Operand(object, index, scale, offset - kHeapObjectTag); |
643 } | 666 } |
644 | 667 |
| 668 |
| 669 static inline Operand ContextOperand(Register context, int index) { |
| 670 return Operand(context, Context::SlotOffset(index)); |
| 671 } |
| 672 |
| 673 |
| 674 static inline Operand GlobalObjectOperand() { |
| 675 return ContextOperand(esi, Context::GLOBAL_INDEX); |
| 676 } |
| 677 |
| 678 |
645 // Generates an Operand for saving parameters after PrepareCallApiFunction. | 679 // Generates an Operand for saving parameters after PrepareCallApiFunction. |
646 Operand ApiParameterOperand(int index); | 680 Operand ApiParameterOperand(int index); |
647 | 681 |
648 | 682 |
649 #ifdef GENERATED_CODE_COVERAGE | 683 #ifdef GENERATED_CODE_COVERAGE |
650 extern void LogGeneratedCodeCoverage(const char* file_line); | 684 extern void LogGeneratedCodeCoverage(const char* file_line); |
651 #define CODE_COVERAGE_STRINGIFY(x) #x | 685 #define CODE_COVERAGE_STRINGIFY(x) #x |
652 #define CODE_COVERAGE_TOSTRING(x) CODE_COVERAGE_STRINGIFY(x) | 686 #define CODE_COVERAGE_TOSTRING(x) CODE_COVERAGE_STRINGIFY(x) |
653 #define __FILE_LINE__ __FILE__ ":" CODE_COVERAGE_TOSTRING(__LINE__) | 687 #define __FILE_LINE__ __FILE__ ":" CODE_COVERAGE_TOSTRING(__LINE__) |
654 #define ACCESS_MASM(masm) { \ | 688 #define ACCESS_MASM(masm) { \ |
655 byte* ia32_coverage_function = \ | 689 byte* ia32_coverage_function = \ |
656 reinterpret_cast<byte*>(FUNCTION_ADDR(LogGeneratedCodeCoverage)); \ | 690 reinterpret_cast<byte*>(FUNCTION_ADDR(LogGeneratedCodeCoverage)); \ |
657 masm->pushfd(); \ | 691 masm->pushfd(); \ |
658 masm->pushad(); \ | 692 masm->pushad(); \ |
659 masm->push(Immediate(reinterpret_cast<int>(&__FILE_LINE__))); \ | 693 masm->push(Immediate(reinterpret_cast<int>(&__FILE_LINE__))); \ |
660 masm->call(ia32_coverage_function, RelocInfo::RUNTIME_ENTRY); \ | 694 masm->call(ia32_coverage_function, RelocInfo::RUNTIME_ENTRY); \ |
661 masm->pop(eax); \ | 695 masm->pop(eax); \ |
662 masm->popad(); \ | 696 masm->popad(); \ |
663 masm->popfd(); \ | 697 masm->popfd(); \ |
664 } \ | 698 } \ |
665 masm-> | 699 masm-> |
666 #else | 700 #else |
667 #define ACCESS_MASM(masm) masm-> | 701 #define ACCESS_MASM(masm) masm-> |
668 #endif | 702 #endif |
669 | 703 |
670 | 704 |
671 } } // namespace v8::internal | 705 } } // namespace v8::internal |
672 | 706 |
673 #endif // V8_IA32_MACRO_ASSEMBLER_IA32_H_ | 707 #endif // V8_IA32_MACRO_ASSEMBLER_IA32_H_ |
OLD | NEW |