| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 868 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 879 } | 879 } |
| 880 } | 880 } |
| 881 | 881 |
| 882 | 882 |
| 883 void MacroAssembler::InvokePrologue(const ParameterCount& expected, | 883 void MacroAssembler::InvokePrologue(const ParameterCount& expected, |
| 884 const ParameterCount& actual, | 884 const ParameterCount& actual, |
| 885 Handle<Code> code_constant, | 885 Handle<Code> code_constant, |
| 886 Register code_reg, | 886 Register code_reg, |
| 887 Label* done, | 887 Label* done, |
| 888 InvokeFlag flag, | 888 InvokeFlag flag, |
| 889 CallWrapper* call_wrapper) { | 889 const CallWrapper& call_wrapper) { |
| 890 bool definitely_matches = false; | 890 bool definitely_matches = false; |
| 891 Label regular_invoke; | 891 Label regular_invoke; |
| 892 | 892 |
| 893 // Check whether the expected and actual arguments count match. If not, | 893 // Check whether the expected and actual arguments count match. If not, |
| 894 // setup registers according to contract with ArgumentsAdaptorTrampoline: | 894 // setup registers according to contract with ArgumentsAdaptorTrampoline: |
| 895 // r0: actual arguments count | 895 // r0: actual arguments count |
| 896 // r1: function (passed through to callee) | 896 // r1: function (passed through to callee) |
| 897 // r2: expected arguments count | 897 // r2: expected arguments count |
| 898 // r3: callee code entry | 898 // r3: callee code entry |
| 899 | 899 |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 934 | 934 |
| 935 if (!definitely_matches) { | 935 if (!definitely_matches) { |
| 936 if (!code_constant.is_null()) { | 936 if (!code_constant.is_null()) { |
| 937 mov(r3, Operand(code_constant)); | 937 mov(r3, Operand(code_constant)); |
| 938 add(r3, r3, Operand(Code::kHeaderSize - kHeapObjectTag)); | 938 add(r3, r3, Operand(Code::kHeaderSize - kHeapObjectTag)); |
| 939 } | 939 } |
| 940 | 940 |
| 941 Handle<Code> adaptor = | 941 Handle<Code> adaptor = |
| 942 isolate()->builtins()->ArgumentsAdaptorTrampoline(); | 942 isolate()->builtins()->ArgumentsAdaptorTrampoline(); |
| 943 if (flag == CALL_FUNCTION) { | 943 if (flag == CALL_FUNCTION) { |
| 944 if (call_wrapper != NULL) { | 944 call_wrapper.BeforeCall(CallSize(adaptor, RelocInfo::CODE_TARGET)); |
| 945 call_wrapper->BeforeCall(CallSize(adaptor, RelocInfo::CODE_TARGET)); | |
| 946 } | |
| 947 Call(adaptor, RelocInfo::CODE_TARGET); | 945 Call(adaptor, RelocInfo::CODE_TARGET); |
| 948 if (call_wrapper != NULL) call_wrapper->AfterCall(); | 946 call_wrapper.AfterCall(); |
| 949 b(done); | 947 b(done); |
| 950 } else { | 948 } else { |
| 951 Jump(adaptor, RelocInfo::CODE_TARGET); | 949 Jump(adaptor, RelocInfo::CODE_TARGET); |
| 952 } | 950 } |
| 953 bind(®ular_invoke); | 951 bind(®ular_invoke); |
| 954 } | 952 } |
| 955 } | 953 } |
| 956 | 954 |
| 957 | 955 |
| 958 void MacroAssembler::InvokeCode(Register code, | 956 void MacroAssembler::InvokeCode(Register code, |
| 959 const ParameterCount& expected, | 957 const ParameterCount& expected, |
| 960 const ParameterCount& actual, | 958 const ParameterCount& actual, |
| 961 InvokeFlag flag, | 959 InvokeFlag flag, |
| 962 CallWrapper* call_wrapper) { | 960 const CallWrapper& call_wrapper) { |
| 963 Label done; | 961 Label done; |
| 964 | 962 |
| 965 InvokePrologue(expected, actual, Handle<Code>::null(), code, &done, flag, | 963 InvokePrologue(expected, actual, Handle<Code>::null(), code, &done, flag, |
| 966 call_wrapper); | 964 call_wrapper); |
| 967 if (flag == CALL_FUNCTION) { | 965 if (flag == CALL_FUNCTION) { |
| 968 if (call_wrapper != NULL) call_wrapper->BeforeCall(CallSize(code)); | 966 call_wrapper.BeforeCall(CallSize(code)); |
| 969 Call(code); | 967 Call(code); |
| 970 if (call_wrapper != NULL) call_wrapper->AfterCall(); | 968 call_wrapper.AfterCall(); |
| 971 } else { | 969 } else { |
| 972 ASSERT(flag == JUMP_FUNCTION); | 970 ASSERT(flag == JUMP_FUNCTION); |
| 973 Jump(code); | 971 Jump(code); |
| 974 } | 972 } |
| 975 | 973 |
| 976 // Continue here if InvokePrologue does handle the invocation due to | 974 // Continue here if InvokePrologue does handle the invocation due to |
| 977 // mismatched parameter counts. | 975 // mismatched parameter counts. |
| 978 bind(&done); | 976 bind(&done); |
| 979 } | 977 } |
| 980 | 978 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 995 | 993 |
| 996 // Continue here if InvokePrologue does handle the invocation due to | 994 // Continue here if InvokePrologue does handle the invocation due to |
| 997 // mismatched parameter counts. | 995 // mismatched parameter counts. |
| 998 bind(&done); | 996 bind(&done); |
| 999 } | 997 } |
| 1000 | 998 |
| 1001 | 999 |
| 1002 void MacroAssembler::InvokeFunction(Register fun, | 1000 void MacroAssembler::InvokeFunction(Register fun, |
| 1003 const ParameterCount& actual, | 1001 const ParameterCount& actual, |
| 1004 InvokeFlag flag, | 1002 InvokeFlag flag, |
| 1005 CallWrapper* call_wrapper) { | 1003 const CallWrapper& call_wrapper) { |
| 1006 // Contract with called JS functions requires that function is passed in r1. | 1004 // Contract with called JS functions requires that function is passed in r1. |
| 1007 ASSERT(fun.is(r1)); | 1005 ASSERT(fun.is(r1)); |
| 1008 | 1006 |
| 1009 Register expected_reg = r2; | 1007 Register expected_reg = r2; |
| 1010 Register code_reg = r3; | 1008 Register code_reg = r3; |
| 1011 | 1009 |
| 1012 ldr(code_reg, FieldMemOperand(r1, JSFunction::kSharedFunctionInfoOffset)); | 1010 ldr(code_reg, FieldMemOperand(r1, JSFunction::kSharedFunctionInfoOffset)); |
| 1013 ldr(cp, FieldMemOperand(r1, JSFunction::kContextOffset)); | 1011 ldr(cp, FieldMemOperand(r1, JSFunction::kContextOffset)); |
| 1014 ldr(expected_reg, | 1012 ldr(expected_reg, |
| 1015 FieldMemOperand(code_reg, | 1013 FieldMemOperand(code_reg, |
| (...skipping 1291 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2307 ASSERT((reinterpret_cast<intptr_t>(builtin.address()) & 1) == 1); | 2305 ASSERT((reinterpret_cast<intptr_t>(builtin.address()) & 1) == 1); |
| 2308 #endif | 2306 #endif |
| 2309 mov(r1, Operand(builtin)); | 2307 mov(r1, Operand(builtin)); |
| 2310 CEntryStub stub(1); | 2308 CEntryStub stub(1); |
| 2311 return TryTailCallStub(&stub); | 2309 return TryTailCallStub(&stub); |
| 2312 } | 2310 } |
| 2313 | 2311 |
| 2314 | 2312 |
| 2315 void MacroAssembler::InvokeBuiltin(Builtins::JavaScript id, | 2313 void MacroAssembler::InvokeBuiltin(Builtins::JavaScript id, |
| 2316 InvokeFlag flag, | 2314 InvokeFlag flag, |
| 2317 CallWrapper* call_wrapper) { | 2315 const CallWrapper& call_wrapper) { |
| 2318 GetBuiltinEntry(r2, id); | 2316 GetBuiltinEntry(r2, id); |
| 2319 if (flag == CALL_FUNCTION) { | 2317 if (flag == CALL_FUNCTION) { |
| 2320 if (call_wrapper != NULL) call_wrapper->BeforeCall(CallSize(r2)); | 2318 call_wrapper.BeforeCall(CallSize(r2)); |
| 2321 Call(r2); | 2319 Call(r2); |
| 2322 if (call_wrapper != NULL) call_wrapper->AfterCall(); | 2320 call_wrapper.AfterCall(); |
| 2323 } else { | 2321 } else { |
| 2324 ASSERT(flag == JUMP_FUNCTION); | 2322 ASSERT(flag == JUMP_FUNCTION); |
| 2325 Jump(r2); | 2323 Jump(r2); |
| 2326 } | 2324 } |
| 2327 } | 2325 } |
| 2328 | 2326 |
| 2329 | 2327 |
| 2330 void MacroAssembler::GetBuiltinFunction(Register target, | 2328 void MacroAssembler::GetBuiltinFunction(Register target, |
| 2331 Builtins::JavaScript id) { | 2329 Builtins::JavaScript id) { |
| 2332 // Load the builtins object into target register. | 2330 // Load the builtins object into target register. |
| (...skipping 721 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3054 void CodePatcher::EmitCondition(Condition cond) { | 3052 void CodePatcher::EmitCondition(Condition cond) { |
| 3055 Instr instr = Assembler::instr_at(masm_.pc_); | 3053 Instr instr = Assembler::instr_at(masm_.pc_); |
| 3056 instr = (instr & ~kCondMask) | cond; | 3054 instr = (instr & ~kCondMask) | cond; |
| 3057 masm_.emit(instr); | 3055 masm_.emit(instr); |
| 3058 } | 3056 } |
| 3059 | 3057 |
| 3060 | 3058 |
| 3061 } } // namespace v8::internal | 3059 } } // namespace v8::internal |
| 3062 | 3060 |
| 3063 #endif // V8_TARGET_ARCH_ARM | 3061 #endif // V8_TARGET_ARCH_ARM |
| OLD | NEW |