OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <limits.h> // For LONG_MIN, LONG_MAX. | 5 #include <limits.h> // For LONG_MIN, LONG_MAX. |
6 | 6 |
7 #if V8_TARGET_ARCH_MIPS64 | 7 #if V8_TARGET_ARCH_MIPS64 |
8 | 8 |
9 #include "src/base/division-by-constant.h" | 9 #include "src/base/division-by-constant.h" |
10 #include "src/bootstrapper.h" | 10 #include "src/bootstrapper.h" |
(...skipping 4138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4149 } | 4149 } |
4150 } | 4150 } |
4151 } | 4151 } |
4152 | 4152 |
4153 | 4153 |
4154 // ----------------------------------------------------------------------------- | 4154 // ----------------------------------------------------------------------------- |
4155 // JavaScript invokes. | 4155 // JavaScript invokes. |
4156 | 4156 |
4157 void MacroAssembler::InvokePrologue(const ParameterCount& expected, | 4157 void MacroAssembler::InvokePrologue(const ParameterCount& expected, |
4158 const ParameterCount& actual, | 4158 const ParameterCount& actual, |
4159 Handle<Code> code_constant, | |
4160 Register code_reg, | |
4161 Label* done, | 4159 Label* done, |
4162 bool* definitely_mismatches, | 4160 bool* definitely_mismatches, |
4163 InvokeFlag flag, | 4161 InvokeFlag flag, |
4164 const CallWrapper& call_wrapper) { | 4162 const CallWrapper& call_wrapper) { |
4165 bool definitely_matches = false; | 4163 bool definitely_matches = false; |
4166 *definitely_mismatches = false; | 4164 *definitely_mismatches = false; |
4167 Label regular_invoke; | 4165 Label regular_invoke; |
4168 | 4166 |
4169 // Check whether the expected and actual arguments count match. If not, | 4167 // Check whether the expected and actual arguments count match. If not, |
4170 // setup registers according to contract with ArgumentsAdaptorTrampoline: | 4168 // setup registers according to contract with ArgumentsAdaptorTrampoline: |
4171 // a0: actual arguments count | 4169 // a0: actual arguments count |
4172 // a1: function (passed through to callee) | 4170 // a1: function (passed through to callee) |
4173 // a2: expected arguments count | 4171 // a2: expected arguments count |
4174 | 4172 |
4175 // The code below is made a lot easier because the calling code already sets | 4173 // The code below is made a lot easier because the calling code already sets |
4176 // up actual and expected registers according to the contract if values are | 4174 // up actual and expected registers according to the contract if values are |
4177 // passed in registers. | 4175 // passed in registers. |
4178 DCHECK(actual.is_immediate() || actual.reg().is(a0)); | 4176 DCHECK(actual.is_immediate() || actual.reg().is(a0)); |
4179 DCHECK(expected.is_immediate() || expected.reg().is(a2)); | 4177 DCHECK(expected.is_immediate() || expected.reg().is(a2)); |
4180 DCHECK((!code_constant.is_null() && code_reg.is(no_reg)) || code_reg.is(a3)); | |
4181 | 4178 |
4182 if (expected.is_immediate()) { | 4179 if (expected.is_immediate()) { |
4183 DCHECK(actual.is_immediate()); | 4180 DCHECK(actual.is_immediate()); |
4184 li(a0, Operand(actual.immediate())); | 4181 li(a0, Operand(actual.immediate())); |
4185 if (expected.immediate() == actual.immediate()) { | 4182 if (expected.immediate() == actual.immediate()) { |
4186 definitely_matches = true; | 4183 definitely_matches = true; |
4187 } else { | 4184 } else { |
4188 const int sentinel = SharedFunctionInfo::kDontAdaptArgumentsSentinel; | 4185 const int sentinel = SharedFunctionInfo::kDontAdaptArgumentsSentinel; |
4189 if (expected.immediate() == sentinel) { | 4186 if (expected.immediate() == sentinel) { |
4190 // Don't worry about adapting arguments for builtins that | 4187 // Don't worry about adapting arguments for builtins that |
4191 // don't want that done. Skip adaption code by making it look | 4188 // don't want that done. Skip adaption code by making it look |
4192 // like we have a match between expected and actual number of | 4189 // like we have a match between expected and actual number of |
4193 // arguments. | 4190 // arguments. |
4194 definitely_matches = true; | 4191 definitely_matches = true; |
4195 } else { | 4192 } else { |
4196 *definitely_mismatches = true; | 4193 *definitely_mismatches = true; |
4197 li(a2, Operand(expected.immediate())); | 4194 li(a2, Operand(expected.immediate())); |
4198 } | 4195 } |
4199 } | 4196 } |
4200 } else if (actual.is_immediate()) { | 4197 } else if (actual.is_immediate()) { |
4201 li(a0, Operand(actual.immediate())); | 4198 li(a0, Operand(actual.immediate())); |
4202 Branch(®ular_invoke, eq, expected.reg(), Operand(a0)); | 4199 Branch(®ular_invoke, eq, expected.reg(), Operand(a0)); |
4203 } else { | 4200 } else { |
4204 Branch(®ular_invoke, eq, expected.reg(), Operand(actual.reg())); | 4201 Branch(®ular_invoke, eq, expected.reg(), Operand(actual.reg())); |
4205 } | 4202 } |
4206 | 4203 |
4207 if (!definitely_matches) { | 4204 if (!definitely_matches) { |
4208 if (!code_constant.is_null()) { | |
4209 li(a3, Operand(code_constant)); | |
4210 daddiu(a3, a3, Code::kHeaderSize - kHeapObjectTag); | |
4211 } | |
4212 | |
4213 Handle<Code> adaptor = | 4205 Handle<Code> adaptor = |
4214 isolate()->builtins()->ArgumentsAdaptorTrampoline(); | 4206 isolate()->builtins()->ArgumentsAdaptorTrampoline(); |
4215 if (flag == CALL_FUNCTION) { | 4207 if (flag == CALL_FUNCTION) { |
4216 call_wrapper.BeforeCall(CallSize(adaptor)); | 4208 call_wrapper.BeforeCall(CallSize(adaptor)); |
4217 Call(adaptor); | 4209 Call(adaptor); |
4218 call_wrapper.AfterCall(); | 4210 call_wrapper.AfterCall(); |
4219 if (!*definitely_mismatches) { | 4211 if (!*definitely_mismatches) { |
4220 Branch(done); | 4212 Branch(done); |
4221 } | 4213 } |
4222 } else { | 4214 } else { |
4223 Jump(adaptor, RelocInfo::CODE_TARGET); | 4215 Jump(adaptor, RelocInfo::CODE_TARGET); |
4224 } | 4216 } |
4225 bind(®ular_invoke); | 4217 bind(®ular_invoke); |
4226 } | 4218 } |
4227 } | 4219 } |
4228 | 4220 |
4229 | 4221 |
4230 void MacroAssembler::InvokeCode(Register code, | 4222 void MacroAssembler::InvokeCode(Register code, |
4231 const ParameterCount& expected, | 4223 const ParameterCount& expected, |
4232 const ParameterCount& actual, | 4224 const ParameterCount& actual, |
4233 InvokeFlag flag, | 4225 InvokeFlag flag, |
4234 const CallWrapper& call_wrapper) { | 4226 const CallWrapper& call_wrapper) { |
4235 // You can't call a function without a valid frame. | 4227 // You can't call a function without a valid frame. |
4236 DCHECK(flag == JUMP_FUNCTION || has_frame()); | 4228 DCHECK(flag == JUMP_FUNCTION || has_frame()); |
4237 | 4229 |
4238 Label done; | 4230 Label done; |
4239 | 4231 |
4240 bool definitely_mismatches = false; | 4232 bool definitely_mismatches = false; |
4241 InvokePrologue(expected, actual, Handle<Code>::null(), code, | 4233 InvokePrologue(expected, actual, &done, &definitely_mismatches, flag, |
4242 &done, &definitely_mismatches, flag, | |
4243 call_wrapper); | 4234 call_wrapper); |
4244 if (!definitely_mismatches) { | 4235 if (!definitely_mismatches) { |
4245 if (flag == CALL_FUNCTION) { | 4236 if (flag == CALL_FUNCTION) { |
4246 call_wrapper.BeforeCall(CallSize(code)); | 4237 call_wrapper.BeforeCall(CallSize(code)); |
4247 Call(code); | 4238 Call(code); |
4248 call_wrapper.AfterCall(); | 4239 call_wrapper.AfterCall(); |
4249 } else { | 4240 } else { |
4250 DCHECK(flag == JUMP_FUNCTION); | 4241 DCHECK(flag == JUMP_FUNCTION); |
4251 Jump(code); | 4242 Jump(code); |
4252 } | 4243 } |
(...skipping 1984 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6237 if (mag.shift > 0) sra(result, result, mag.shift); | 6228 if (mag.shift > 0) sra(result, result, mag.shift); |
6238 srl(at, dividend, 31); | 6229 srl(at, dividend, 31); |
6239 Addu(result, result, Operand(at)); | 6230 Addu(result, result, Operand(at)); |
6240 } | 6231 } |
6241 | 6232 |
6242 | 6233 |
6243 } // namespace internal | 6234 } // namespace internal |
6244 } // namespace v8 | 6235 } // namespace v8 |
6245 | 6236 |
6246 #endif // V8_TARGET_ARCH_MIPS64 | 6237 #endif // V8_TARGET_ARCH_MIPS64 |
OLD | NEW |