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 1095 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1106 const CallWrapper& call_wrapper) { | 1106 const CallWrapper& call_wrapper) { |
1107 bool definitely_matches = false; | 1107 bool definitely_matches = false; |
1108 *definitely_mismatches = false; | 1108 *definitely_mismatches = false; |
1109 Label regular_invoke; | 1109 Label regular_invoke; |
1110 | 1110 |
1111 // Check whether the expected and actual arguments count match. If not, | 1111 // Check whether the expected and actual arguments count match. If not, |
1112 // setup registers according to contract with ArgumentsAdaptorTrampoline: | 1112 // setup registers according to contract with ArgumentsAdaptorTrampoline: |
1113 // r0: actual arguments count | 1113 // r0: actual arguments count |
1114 // r1: function (passed through to callee) | 1114 // r1: function (passed through to callee) |
1115 // r2: expected arguments count | 1115 // r2: expected arguments count |
1116 // r3: callee code entry | |
1117 | 1116 |
1118 // The code below is made a lot easier because the calling code already sets | 1117 // The code below is made a lot easier because the calling code already sets |
1119 // up actual and expected registers according to the contract if values are | 1118 // up actual and expected registers according to the contract if values are |
1120 // passed in registers. | 1119 // passed in registers. |
1121 ASSERT(actual.is_immediate() || actual.reg().is(r0)); | 1120 ASSERT(actual.is_immediate() || actual.reg().is(r0)); |
1122 ASSERT(expected.is_immediate() || expected.reg().is(r2)); | 1121 ASSERT(expected.is_immediate() || expected.reg().is(r2)); |
1123 ASSERT((!code_constant.is_null() && code_reg.is(no_reg)) || code_reg.is(r3)); | 1122 ASSERT((!code_constant.is_null() && code_reg.is(no_reg)) || code_reg.is(r3)); |
1124 | 1123 |
1125 if (expected.is_immediate()) { | 1124 if (expected.is_immediate()) { |
1126 ASSERT(actual.is_immediate()); | 1125 ASSERT(actual.is_immediate()); |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1197 Jump(code); | 1196 Jump(code); |
1198 } | 1197 } |
1199 | 1198 |
1200 // Continue here if InvokePrologue does handle the invocation due to | 1199 // Continue here if InvokePrologue does handle the invocation due to |
1201 // mismatched parameter counts. | 1200 // mismatched parameter counts. |
1202 bind(&done); | 1201 bind(&done); |
1203 } | 1202 } |
1204 } | 1203 } |
1205 | 1204 |
1206 | 1205 |
1207 void MacroAssembler::InvokeCode(Handle<Code> code, | |
1208 const ParameterCount& expected, | |
1209 const ParameterCount& actual, | |
1210 RelocInfo::Mode rmode, | |
1211 InvokeFlag flag) { | |
1212 // You can't call a function without a valid frame. | |
1213 ASSERT(flag == JUMP_FUNCTION || has_frame()); | |
1214 | |
1215 Label done; | |
1216 bool definitely_mismatches = false; | |
1217 InvokePrologue(expected, actual, code, no_reg, | |
1218 &done, &definitely_mismatches, flag, | |
1219 NullCallWrapper()); | |
1220 if (!definitely_mismatches) { | |
1221 if (flag == CALL_FUNCTION) { | |
1222 Call(code, rmode); | |
1223 } else { | |
1224 Jump(code, rmode); | |
1225 } | |
1226 | |
1227 // Continue here if InvokePrologue does handle the invocation due to | |
1228 // mismatched parameter counts. | |
1229 bind(&done); | |
1230 } | |
1231 } | |
1232 | |
1233 | |
1234 void MacroAssembler::InvokeFunction(Register fun, | 1206 void MacroAssembler::InvokeFunction(Register fun, |
1235 const ParameterCount& actual, | 1207 const ParameterCount& actual, |
1236 InvokeFlag flag, | 1208 InvokeFlag flag, |
1237 const CallWrapper& call_wrapper) { | 1209 const CallWrapper& call_wrapper) { |
1238 // You can't call a function without a valid frame. | 1210 // You can't call a function without a valid frame. |
1239 ASSERT(flag == JUMP_FUNCTION || has_frame()); | 1211 ASSERT(flag == JUMP_FUNCTION || has_frame()); |
1240 | 1212 |
1241 // Contract with called JS functions requires that function is passed in r1. | 1213 // Contract with called JS functions requires that function is passed in r1. |
1242 ASSERT(fun.is(r1)); | 1214 ASSERT(fun.is(r1)); |
1243 | 1215 |
(...skipping 2855 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4099 void CodePatcher::EmitCondition(Condition cond) { | 4071 void CodePatcher::EmitCondition(Condition cond) { |
4100 Instr instr = Assembler::instr_at(masm_.pc_); | 4072 Instr instr = Assembler::instr_at(masm_.pc_); |
4101 instr = (instr & ~kCondMask) | cond; | 4073 instr = (instr & ~kCondMask) | cond; |
4102 masm_.emit(instr); | 4074 masm_.emit(instr); |
4103 } | 4075 } |
4104 | 4076 |
4105 | 4077 |
4106 } } // namespace v8::internal | 4078 } } // namespace v8::internal |
4107 | 4079 |
4108 #endif // V8_TARGET_ARCH_ARM | 4080 #endif // V8_TARGET_ARCH_ARM |
OLD | NEW |