| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 878 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 889 // r1: constructor function | 889 // r1: constructor function |
| 890 __ bind(&rt_call); | 890 __ bind(&rt_call); |
| 891 __ push(r1); // argument for Runtime_NewObject | 891 __ push(r1); // argument for Runtime_NewObject |
| 892 __ CallRuntime(Runtime::kNewObject, 1); | 892 __ CallRuntime(Runtime::kNewObject, 1); |
| 893 __ mov(r4, r0); | 893 __ mov(r4, r0); |
| 894 | 894 |
| 895 // Receiver for constructor call allocated. | 895 // Receiver for constructor call allocated. |
| 896 // r4: JSObject | 896 // r4: JSObject |
| 897 __ bind(&allocated); | 897 __ bind(&allocated); |
| 898 __ push(r4); | 898 __ push(r4); |
| 899 __ push(r4); |
| 899 | 900 |
| 900 // Push the function and the allocated receiver from the stack. | 901 // Reload the number of arguments and the constructor from the stack. |
| 901 // sp[0]: receiver (newly allocated object) | |
| 902 // sp[1]: constructor function | |
| 903 // sp[2]: number of arguments (smi-tagged) | |
| 904 __ ldr(r1, MemOperand(sp, kPointerSize)); | |
| 905 __ push(r1); // Constructor function. | |
| 906 __ push(r4); // Receiver. | |
| 907 | |
| 908 // Reload the number of arguments from the stack. | |
| 909 // r1: constructor function | |
| 910 // sp[0]: receiver | 902 // sp[0]: receiver |
| 911 // sp[1]: constructor function | 903 // sp[1]: receiver |
| 912 // sp[2]: receiver | 904 // sp[2]: constructor function |
| 913 // sp[3]: constructor function | 905 // sp[3]: number of arguments (smi-tagged) |
| 914 // sp[4]: number of arguments (smi-tagged) | 906 __ ldr(r1, MemOperand(sp, 2 * kPointerSize)); |
| 915 __ ldr(r3, MemOperand(sp, 4 * kPointerSize)); | 907 __ ldr(r3, MemOperand(sp, 3 * kPointerSize)); |
| 916 | 908 |
| 917 // Set up pointer to last argument. | 909 // Set up pointer to last argument. |
| 918 __ add(r2, fp, Operand(StandardFrameConstants::kCallerSPOffset)); | 910 __ add(r2, fp, Operand(StandardFrameConstants::kCallerSPOffset)); |
| 919 | 911 |
| 920 // Set up number of arguments for function call below | 912 // Set up number of arguments for function call below |
| 921 __ mov(r0, Operand(r3, LSR, kSmiTagSize)); | 913 __ mov(r0, Operand(r3, LSR, kSmiTagSize)); |
| 922 | 914 |
| 923 // Copy arguments and receiver to the expression stack. | 915 // Copy arguments and receiver to the expression stack. |
| 924 // r0: number of arguments | 916 // r0: number of arguments |
| 917 // r1: constructor function |
| 925 // r2: address of last argument (caller sp) | 918 // r2: address of last argument (caller sp) |
| 926 // r1: constructor function | |
| 927 // r3: number of arguments (smi-tagged) | 919 // r3: number of arguments (smi-tagged) |
| 928 // sp[0]: receiver | 920 // sp[0]: receiver |
| 929 // sp[1]: constructor function | 921 // sp[1]: receiver |
| 930 // sp[2]: receiver | 922 // sp[2]: constructor function |
| 931 // sp[3]: constructor function | 923 // sp[3]: number of arguments (smi-tagged) |
| 932 // sp[4]: number of arguments (smi-tagged) | |
| 933 Label loop, entry; | 924 Label loop, entry; |
| 934 __ b(&entry); | 925 __ b(&entry); |
| 935 __ bind(&loop); | 926 __ bind(&loop); |
| 936 __ ldr(ip, MemOperand(r2, r3, LSL, kPointerSizeLog2 - 1)); | 927 __ ldr(ip, MemOperand(r2, r3, LSL, kPointerSizeLog2 - 1)); |
| 937 __ push(ip); | 928 __ push(ip); |
| 938 __ bind(&entry); | 929 __ bind(&entry); |
| 939 __ sub(r3, r3, Operand(2), SetCC); | 930 __ sub(r3, r3, Operand(2), SetCC); |
| 940 __ b(ge, &loop); | 931 __ b(ge, &loop); |
| 941 | 932 |
| 942 // Call the function. | 933 // Call the function. |
| 943 // r0: number of arguments | 934 // r0: number of arguments |
| 944 // r1: constructor function | 935 // r1: constructor function |
| 945 if (is_api_function) { | 936 if (is_api_function) { |
| 946 __ ldr(cp, FieldMemOperand(r1, JSFunction::kContextOffset)); | 937 __ ldr(cp, FieldMemOperand(r1, JSFunction::kContextOffset)); |
| 947 Handle<Code> code = | 938 Handle<Code> code = |
| 948 masm->isolate()->builtins()->HandleApiCallConstruct(); | 939 masm->isolate()->builtins()->HandleApiCallConstruct(); |
| 949 ParameterCount expected(0); | 940 ParameterCount expected(0); |
| 950 __ InvokeCode(code, expected, expected, | 941 __ InvokeCode(code, expected, expected, |
| 951 RelocInfo::CODE_TARGET, CALL_FUNCTION, CALL_AS_METHOD); | 942 RelocInfo::CODE_TARGET, CALL_FUNCTION, CALL_AS_METHOD); |
| 952 } else { | 943 } else { |
| 953 ParameterCount actual(r0); | 944 ParameterCount actual(r0); |
| 954 __ InvokeFunction(r1, actual, CALL_FUNCTION, | 945 __ InvokeFunction(r1, actual, CALL_FUNCTION, |
| 955 NullCallWrapper(), CALL_AS_METHOD); | 946 NullCallWrapper(), CALL_AS_METHOD); |
| 956 } | 947 } |
| 957 | 948 |
| 958 // Pop the function from the stack. | 949 // Store offset of return address for deoptimizer. |
| 959 // sp[0]: constructor function | 950 if (!is_api_function && !count_constructions) { |
| 960 // sp[2]: receiver | 951 masm->isolate()->heap()->SetConstructStubDeoptPCOffset(masm->pc_offset()); |
| 961 // sp[3]: constructor function | 952 } |
| 962 // sp[4]: number of arguments (smi-tagged) | |
| 963 __ pop(); | |
| 964 | 953 |
| 965 // Restore context from the frame. | 954 // Restore context from the frame. |
| 966 // r0: result | 955 // r0: result |
| 967 // sp[0]: receiver | 956 // sp[0]: receiver |
| 968 // sp[1]: constructor function | 957 // sp[1]: constructor function |
| 969 // sp[2]: number of arguments (smi-tagged) | 958 // sp[2]: number of arguments (smi-tagged) |
| 970 __ ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); | 959 __ ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); |
| 971 | 960 |
| 972 // If the result is an object (in the ECMA sense), we should get rid | 961 // If the result is an object (in the ECMA sense), we should get rid |
| 973 // of the receiver and use the result; see ECMA-262 section 13.2.2-7 | 962 // of the receiver and use the result; see ECMA-262 section 13.2.2-7 |
| (...skipping 743 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1717 __ bind(&fill); | 1706 __ bind(&fill); |
| 1718 __ push(ip); | 1707 __ push(ip); |
| 1719 __ cmp(sp, r2); | 1708 __ cmp(sp, r2); |
| 1720 __ b(ne, &fill); | 1709 __ b(ne, &fill); |
| 1721 } | 1710 } |
| 1722 | 1711 |
| 1723 // Call the entry point. | 1712 // Call the entry point. |
| 1724 __ bind(&invoke); | 1713 __ bind(&invoke); |
| 1725 __ Call(r3); | 1714 __ Call(r3); |
| 1726 | 1715 |
| 1716 // Store offset of return address for deoptimizer. |
| 1727 masm->isolate()->heap()->SetArgumentsAdaptorDeoptPCOffset(masm->pc_offset()); | 1717 masm->isolate()->heap()->SetArgumentsAdaptorDeoptPCOffset(masm->pc_offset()); |
| 1718 |
| 1728 // Exit frame and return. | 1719 // Exit frame and return. |
| 1729 LeaveArgumentsAdaptorFrame(masm); | 1720 LeaveArgumentsAdaptorFrame(masm); |
| 1730 __ Jump(lr); | 1721 __ Jump(lr); |
| 1731 | 1722 |
| 1732 | 1723 |
| 1733 // ------------------------------------------- | 1724 // ------------------------------------------- |
| 1734 // Dont adapt arguments. | 1725 // Dont adapt arguments. |
| 1735 // ------------------------------------------- | 1726 // ------------------------------------------- |
| 1736 __ bind(&dont_adapt_arguments); | 1727 __ bind(&dont_adapt_arguments); |
| 1737 __ Jump(r3); | 1728 __ Jump(r3); |
| 1738 } | 1729 } |
| 1739 | 1730 |
| 1740 | 1731 |
| 1741 #undef __ | 1732 #undef __ |
| 1742 | 1733 |
| 1743 } } // namespace v8::internal | 1734 } } // namespace v8::internal |
| 1744 | 1735 |
| 1745 #endif // V8_TARGET_ARCH_ARM | 1736 #endif // V8_TARGET_ARCH_ARM |
| OLD | NEW |