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

Side by Side Diff: src/arm/macro-assembler-arm.cc

Issue 6164003: Implement DoApplyArguments. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge/benchmarks
Patch Set: Adress comments. Created 9 years, 11 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/arm/macro-assembler-arm.h ('k') | no next file » | 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 664 matching lines...) Expand 10 before | Expand all | Expand 10 after
675 mov(sp, Operand(fp)); // respect ABI stack constraint 675 mov(sp, Operand(fp)); // respect ABI stack constraint
676 ldm(ia, sp, fp.bit() | sp.bit() | pc.bit()); 676 ldm(ia, sp, fp.bit() | sp.bit() | pc.bit());
677 } 677 }
678 678
679 679
680 void MacroAssembler::InvokePrologue(const ParameterCount& expected, 680 void MacroAssembler::InvokePrologue(const ParameterCount& expected,
681 const ParameterCount& actual, 681 const ParameterCount& actual,
682 Handle<Code> code_constant, 682 Handle<Code> code_constant,
683 Register code_reg, 683 Register code_reg,
684 Label* done, 684 Label* done,
685 InvokeFlag flag) { 685 InvokeFlag flag,
686 PostCallGenerator* post_call_generator) {
686 bool definitely_matches = false; 687 bool definitely_matches = false;
687 Label regular_invoke; 688 Label regular_invoke;
688 689
689 // Check whether the expected and actual arguments count match. If not, 690 // Check whether the expected and actual arguments count match. If not,
690 // setup registers according to contract with ArgumentsAdaptorTrampoline: 691 // setup registers according to contract with ArgumentsAdaptorTrampoline:
691 // r0: actual arguments count 692 // r0: actual arguments count
692 // r1: function (passed through to callee) 693 // r1: function (passed through to callee)
693 // r2: expected arguments count 694 // r2: expected arguments count
694 // r3: callee code entry 695 // r3: callee code entry
695 696
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
731 if (!definitely_matches) { 732 if (!definitely_matches) {
732 if (!code_constant.is_null()) { 733 if (!code_constant.is_null()) {
733 mov(r3, Operand(code_constant)); 734 mov(r3, Operand(code_constant));
734 add(r3, r3, Operand(Code::kHeaderSize - kHeapObjectTag)); 735 add(r3, r3, Operand(Code::kHeaderSize - kHeapObjectTag));
735 } 736 }
736 737
737 Handle<Code> adaptor = 738 Handle<Code> adaptor =
738 Handle<Code>(Builtins::builtin(Builtins::ArgumentsAdaptorTrampoline)); 739 Handle<Code>(Builtins::builtin(Builtins::ArgumentsAdaptorTrampoline));
739 if (flag == CALL_FUNCTION) { 740 if (flag == CALL_FUNCTION) {
740 Call(adaptor, RelocInfo::CODE_TARGET); 741 Call(adaptor, RelocInfo::CODE_TARGET);
742 if (post_call_generator != NULL) post_call_generator->Generate();
741 b(done); 743 b(done);
742 } else { 744 } else {
743 Jump(adaptor, RelocInfo::CODE_TARGET); 745 Jump(adaptor, RelocInfo::CODE_TARGET);
744 } 746 }
745 bind(&regular_invoke); 747 bind(&regular_invoke);
746 } 748 }
747 } 749 }
748 750
749 751
750 void MacroAssembler::InvokeCode(Register code, 752 void MacroAssembler::InvokeCode(Register code,
751 const ParameterCount& expected, 753 const ParameterCount& expected,
752 const ParameterCount& actual, 754 const ParameterCount& actual,
753 InvokeFlag flag) { 755 InvokeFlag flag,
756 PostCallGenerator* post_call_generator) {
754 Label done; 757 Label done;
755 758
756 InvokePrologue(expected, actual, Handle<Code>::null(), code, &done, flag); 759 InvokePrologue(expected, actual, Handle<Code>::null(), code, &done, flag,
760 post_call_generator);
757 if (flag == CALL_FUNCTION) { 761 if (flag == CALL_FUNCTION) {
758 Call(code); 762 Call(code);
763 if (post_call_generator != NULL) post_call_generator->Generate();
759 } else { 764 } else {
760 ASSERT(flag == JUMP_FUNCTION); 765 ASSERT(flag == JUMP_FUNCTION);
761 Jump(code); 766 Jump(code);
762 } 767 }
763 768
764 // Continue here if InvokePrologue does handle the invocation due to 769 // Continue here if InvokePrologue does handle the invocation due to
765 // mismatched parameter counts. 770 // mismatched parameter counts.
766 bind(&done); 771 bind(&done);
767 } 772 }
768 773
(...skipping 13 matching lines...) Expand all
782 } 787 }
783 788
784 // Continue here if InvokePrologue does handle the invocation due to 789 // Continue here if InvokePrologue does handle the invocation due to
785 // mismatched parameter counts. 790 // mismatched parameter counts.
786 bind(&done); 791 bind(&done);
787 } 792 }
788 793
789 794
790 void MacroAssembler::InvokeFunction(Register fun, 795 void MacroAssembler::InvokeFunction(Register fun,
791 const ParameterCount& actual, 796 const ParameterCount& actual,
792 InvokeFlag flag) { 797 InvokeFlag flag,
798 PostCallGenerator* post_call_generator) {
793 // Contract with called JS functions requires that function is passed in r1. 799 // Contract with called JS functions requires that function is passed in r1.
794 ASSERT(fun.is(r1)); 800 ASSERT(fun.is(r1));
795 801
796 Register expected_reg = r2; 802 Register expected_reg = r2;
797 Register code_reg = r3; 803 Register code_reg = r3;
798 804
799 ldr(code_reg, FieldMemOperand(r1, JSFunction::kSharedFunctionInfoOffset)); 805 ldr(code_reg, FieldMemOperand(r1, JSFunction::kSharedFunctionInfoOffset));
800 ldr(cp, FieldMemOperand(r1, JSFunction::kContextOffset)); 806 ldr(cp, FieldMemOperand(r1, JSFunction::kContextOffset));
801 ldr(expected_reg, 807 ldr(expected_reg,
802 FieldMemOperand(code_reg, 808 FieldMemOperand(code_reg,
803 SharedFunctionInfo::kFormalParameterCountOffset)); 809 SharedFunctionInfo::kFormalParameterCountOffset));
804 mov(expected_reg, Operand(expected_reg, ASR, kSmiTagSize)); 810 mov(expected_reg, Operand(expected_reg, ASR, kSmiTagSize));
805 ldr(code_reg, 811 ldr(code_reg,
806 FieldMemOperand(r1, JSFunction::kCodeEntryOffset)); 812 FieldMemOperand(r1, JSFunction::kCodeEntryOffset));
807 813
808 ParameterCount expected(expected_reg); 814 ParameterCount expected(expected_reg);
809 InvokeCode(code_reg, expected, actual, flag); 815 InvokeCode(code_reg, expected, actual, flag, post_call_generator);
810 } 816 }
811 817
812 818
813 void MacroAssembler::InvokeFunction(JSFunction* function, 819 void MacroAssembler::InvokeFunction(JSFunction* function,
814 const ParameterCount& actual, 820 const ParameterCount& actual,
815 InvokeFlag flag) { 821 InvokeFlag flag) {
816 ASSERT(function->is_compiled()); 822 ASSERT(function->is_compiled());
817 823
818 // Get the function and setup the context. 824 // Get the function and setup the context.
819 mov(r1, Operand(Handle<JSFunction>(function))); 825 mov(r1, Operand(Handle<JSFunction>(function)));
(...skipping 1334 matching lines...) Expand 10 before | Expand all | Expand 10 after
2154 2160
2155 void CodePatcher::Emit(Address addr) { 2161 void CodePatcher::Emit(Address addr) {
2156 masm()->emit(reinterpret_cast<Instr>(addr)); 2162 masm()->emit(reinterpret_cast<Instr>(addr));
2157 } 2163 }
2158 #endif // ENABLE_DEBUGGER_SUPPORT 2164 #endif // ENABLE_DEBUGGER_SUPPORT
2159 2165
2160 2166
2161 } } // namespace v8::internal 2167 } } // namespace v8::internal
2162 2168
2163 #endif // V8_TARGET_ARCH_ARM 2169 #endif // V8_TARGET_ARCH_ARM
OLDNEW
« no previous file with comments | « src/arm/macro-assembler-arm.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698