| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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> | 5 #include <limits.h> |
| 6 #include <stdarg.h> | 6 #include <stdarg.h> |
| 7 #include <stdlib.h> | 7 #include <stdlib.h> |
| 8 #include <cmath> | 8 #include <cmath> |
| 9 | 9 |
| 10 #if V8_TARGET_ARCH_MIPS64 | 10 #if V8_TARGET_ARCH_MIPS64 |
| (...skipping 1966 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1977 } | 1977 } |
| 1978 | 1978 |
| 1979 | 1979 |
| 1980 // Calls into the V8 runtime are based on this very simple interface. | 1980 // Calls into the V8 runtime are based on this very simple interface. |
| 1981 // Note: To be able to return two values from some calls the code in runtime.cc | 1981 // Note: To be able to return two values from some calls the code in runtime.cc |
| 1982 // uses the ObjectPair which is essentially two 32-bit values stuffed into a | 1982 // uses the ObjectPair which is essentially two 32-bit values stuffed into a |
| 1983 // 64-bit value. With the code below we assume that all runtime calls return | 1983 // 64-bit value. With the code below we assume that all runtime calls return |
| 1984 // 64 bits of result. If they don't, the v1 result register contains a bogus | 1984 // 64 bits of result. If they don't, the v1 result register contains a bogus |
| 1985 // value, which is fine because it is caller-saved. | 1985 // value, which is fine because it is caller-saved. |
| 1986 | 1986 |
| 1987 typedef ObjectPair (*SimulatorRuntimeCall)(int64_t arg0, | 1987 typedef ObjectPair (*SimulatorRuntimeCall)(int64_t arg0, int64_t arg1, |
| 1988 int64_t arg1, | 1988 int64_t arg2, int64_t arg3, |
| 1989 int64_t arg2, | 1989 int64_t arg4, int64_t arg5, |
| 1990 int64_t arg3, | 1990 int64_t arg6, int64_t arg7, |
| 1991 int64_t arg4, | 1991 int64_t arg8); |
| 1992 int64_t arg5); | |
| 1993 | 1992 |
| 1994 typedef ObjectTriple (*SimulatorRuntimeTripleCall)(int64_t arg0, int64_t arg1, | 1993 typedef ObjectTriple (*SimulatorRuntimeTripleCall)(int64_t arg0, int64_t arg1, |
| 1995 int64_t arg2, int64_t arg3, | 1994 int64_t arg2, int64_t arg3, |
| 1996 int64_t arg4); | 1995 int64_t arg4); |
| 1997 | 1996 |
| 1998 // These prototypes handle the four types of FP calls. | 1997 // These prototypes handle the four types of FP calls. |
| 1999 typedef int64_t (*SimulatorRuntimeCompareCall)(double darg0, double darg1); | 1998 typedef int64_t (*SimulatorRuntimeCompareCall)(double darg0, double darg1); |
| 2000 typedef double (*SimulatorRuntimeFPFPCall)(double darg0, double darg1); | 1999 typedef double (*SimulatorRuntimeFPFPCall)(double darg0, double darg1); |
| 2001 typedef double (*SimulatorRuntimeFPCall)(double darg0); | 2000 typedef double (*SimulatorRuntimeFPCall)(double darg0); |
| 2002 typedef double (*SimulatorRuntimeFPIntCall)(double darg0, int32_t arg0); | 2001 typedef double (*SimulatorRuntimeFPIntCall)(double darg0, int32_t arg0); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 2015 // C-based V8 runtime. They are also used for debugging with simulator. | 2014 // C-based V8 runtime. They are also used for debugging with simulator. |
| 2016 void Simulator::SoftwareInterrupt() { | 2015 void Simulator::SoftwareInterrupt() { |
| 2017 // There are several instructions that could get us here, | 2016 // There are several instructions that could get us here, |
| 2018 // the break_ instruction, or several variants of traps. All | 2017 // the break_ instruction, or several variants of traps. All |
| 2019 // Are "SPECIAL" class opcode, and are distinuished by function. | 2018 // Are "SPECIAL" class opcode, and are distinuished by function. |
| 2020 int32_t func = instr_.FunctionFieldRaw(); | 2019 int32_t func = instr_.FunctionFieldRaw(); |
| 2021 uint32_t code = (func == BREAK) ? instr_.Bits(25, 6) : -1; | 2020 uint32_t code = (func == BREAK) ? instr_.Bits(25, 6) : -1; |
| 2022 // We first check if we met a call_rt_redirected. | 2021 // We first check if we met a call_rt_redirected. |
| 2023 if (instr_.InstructionBits() == rtCallRedirInstr) { | 2022 if (instr_.InstructionBits() == rtCallRedirInstr) { |
| 2024 Redirection* redirection = Redirection::FromSwiInstruction(instr_.instr()); | 2023 Redirection* redirection = Redirection::FromSwiInstruction(instr_.instr()); |
| 2024 |
| 2025 int64_t* stack_pointer = reinterpret_cast<int64_t*>(get_register(sp)); |
| 2026 |
| 2025 int64_t arg0 = get_register(a0); | 2027 int64_t arg0 = get_register(a0); |
| 2026 int64_t arg1 = get_register(a1); | 2028 int64_t arg1 = get_register(a1); |
| 2027 int64_t arg2 = get_register(a2); | 2029 int64_t arg2 = get_register(a2); |
| 2028 int64_t arg3 = get_register(a3); | 2030 int64_t arg3 = get_register(a3); |
| 2029 int64_t arg4, arg5; | 2031 int64_t arg4 = get_register(a4); |
| 2030 | 2032 int64_t arg5 = get_register(a5); |
| 2031 arg4 = get_register(a4); // Abi n64 register a4. | 2033 int64_t arg6 = get_register(a6); |
| 2032 arg5 = get_register(a5); // Abi n64 register a5. | 2034 int64_t arg7 = get_register(a7); |
| 2035 int64_t arg8 = stack_pointer[0]; |
| 2036 STATIC_ASSERT(kMaxCParameters == 9); |
| 2033 | 2037 |
| 2034 bool fp_call = | 2038 bool fp_call = |
| 2035 (redirection->type() == ExternalReference::BUILTIN_FP_FP_CALL) || | 2039 (redirection->type() == ExternalReference::BUILTIN_FP_FP_CALL) || |
| 2036 (redirection->type() == ExternalReference::BUILTIN_COMPARE_CALL) || | 2040 (redirection->type() == ExternalReference::BUILTIN_COMPARE_CALL) || |
| 2037 (redirection->type() == ExternalReference::BUILTIN_FP_CALL) || | 2041 (redirection->type() == ExternalReference::BUILTIN_FP_CALL) || |
| 2038 (redirection->type() == ExternalReference::BUILTIN_FP_INT_CALL); | 2042 (redirection->type() == ExternalReference::BUILTIN_FP_INT_CALL); |
| 2039 | 2043 |
| 2040 if (!IsMipsSoftFloatABI) { | 2044 if (!IsMipsSoftFloatABI) { |
| 2041 // With the hard floating point calling convention, double | 2045 // With the hard floating point calling convention, double |
| 2042 // arguments are passed in FPU registers. Fetch the arguments | 2046 // arguments are passed in FPU registers. Fetch the arguments |
| (...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2217 set_register(v0, arg0); | 2221 set_register(v0, arg0); |
| 2218 } else { | 2222 } else { |
| 2219 DCHECK(redirection->type() == ExternalReference::BUILTIN_CALL || | 2223 DCHECK(redirection->type() == ExternalReference::BUILTIN_CALL || |
| 2220 redirection->type() == ExternalReference::BUILTIN_CALL_PAIR); | 2224 redirection->type() == ExternalReference::BUILTIN_CALL_PAIR); |
| 2221 SimulatorRuntimeCall target = | 2225 SimulatorRuntimeCall target = |
| 2222 reinterpret_cast<SimulatorRuntimeCall>(external); | 2226 reinterpret_cast<SimulatorRuntimeCall>(external); |
| 2223 if (::v8::internal::FLAG_trace_sim) { | 2227 if (::v8::internal::FLAG_trace_sim) { |
| 2224 PrintF( | 2228 PrintF( |
| 2225 "Call to host function at %p " | 2229 "Call to host function at %p " |
| 2226 "args %08" PRIx64 " , %08" PRIx64 " , %08" PRIx64 " , %08" PRIx64 | 2230 "args %08" PRIx64 " , %08" PRIx64 " , %08" PRIx64 " , %08" PRIx64 |
| 2227 " , %08" PRIx64 " , %08" PRIx64 " \n", | 2231 " , %08" PRIx64 " , %08" PRIx64 " , %08" PRIx64 " , %08" PRIx64 |
| 2232 " , %08" PRIx64 " \n", |
| 2228 static_cast<void*>(FUNCTION_ADDR(target)), arg0, arg1, arg2, arg3, | 2233 static_cast<void*>(FUNCTION_ADDR(target)), arg0, arg1, arg2, arg3, |
| 2229 arg4, arg5); | 2234 arg4, arg5, arg6, arg7, arg8); |
| 2230 } | 2235 } |
| 2231 // int64_t result = target(arg0, arg1, arg2, arg3, arg4, arg5); | 2236 ObjectPair result = |
| 2232 // set_register(v0, static_cast<int32_t>(result)); | 2237 target(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); |
| 2233 // set_register(v1, static_cast<int32_t>(result >> 32)); | |
| 2234 ObjectPair result = target(arg0, arg1, arg2, arg3, arg4, arg5); | |
| 2235 set_register(v0, (int64_t)(result.x)); | 2238 set_register(v0, (int64_t)(result.x)); |
| 2236 set_register(v1, (int64_t)(result.y)); | 2239 set_register(v1, (int64_t)(result.y)); |
| 2237 } | 2240 } |
| 2238 if (::v8::internal::FLAG_trace_sim) { | 2241 if (::v8::internal::FLAG_trace_sim) { |
| 2239 PrintF("Returned %08" PRIx64 " : %08" PRIx64 " \n", get_register(v1), | 2242 PrintF("Returned %08" PRIx64 " : %08" PRIx64 " \n", get_register(v1), |
| 2240 get_register(v0)); | 2243 get_register(v0)); |
| 2241 } | 2244 } |
| 2242 set_register(ra, saved_ra); | 2245 set_register(ra, saved_ra); |
| 2243 set_pc(get_register(ra)); | 2246 set_pc(get_register(ra)); |
| 2244 | 2247 |
| (...skipping 2898 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5143 } | 5146 } |
| 5144 | 5147 |
| 5145 | 5148 |
| 5146 #undef UNSUPPORTED | 5149 #undef UNSUPPORTED |
| 5147 } // namespace internal | 5150 } // namespace internal |
| 5148 } // namespace v8 | 5151 } // namespace v8 |
| 5149 | 5152 |
| 5150 #endif // USE_SIMULATOR | 5153 #endif // USE_SIMULATOR |
| 5151 | 5154 |
| 5152 #endif // V8_TARGET_ARCH_MIPS64 | 5155 #endif // V8_TARGET_ARCH_MIPS64 |
| OLD | NEW |