| 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 <stdarg.h> | 5 #include <stdarg.h> |
| 6 #include <stdlib.h> | 6 #include <stdlib.h> |
| 7 #include <cmath> | 7 #include <cmath> |
| 8 | 8 |
| 9 #if V8_TARGET_ARCH_ARM | 9 #if V8_TARGET_ARCH_ARM |
| 10 | 10 |
| (...skipping 1688 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1699 } | 1699 } |
| 1700 } | 1700 } |
| 1701 | 1701 |
| 1702 | 1702 |
| 1703 // Calls into the V8 runtime are based on this very simple interface. | 1703 // Calls into the V8 runtime are based on this very simple interface. |
| 1704 // Note: To be able to return two values from some calls the code in runtime.cc | 1704 // Note: To be able to return two values from some calls the code in runtime.cc |
| 1705 // uses the ObjectPair which is essentially two 32-bit values stuffed into a | 1705 // uses the ObjectPair which is essentially two 32-bit values stuffed into a |
| 1706 // 64-bit value. With the code below we assume that all runtime calls return | 1706 // 64-bit value. With the code below we assume that all runtime calls return |
| 1707 // 64 bits of result. If they don't, the r1 result register contains a bogus | 1707 // 64 bits of result. If they don't, the r1 result register contains a bogus |
| 1708 // value, which is fine because it is caller-saved. | 1708 // value, which is fine because it is caller-saved. |
| 1709 typedef int64_t (*SimulatorRuntimeCall)(int32_t arg0, | 1709 typedef int64_t (*SimulatorRuntimeCall)(int32_t arg0, int32_t arg1, |
| 1710 int32_t arg1, | 1710 int32_t arg2, int32_t arg3, |
| 1711 int32_t arg2, | 1711 int32_t arg4, int32_t arg5, |
| 1712 int32_t arg3, | 1712 int32_t arg6, int32_t arg7, |
| 1713 int32_t arg4, | 1713 int32_t arg8); |
| 1714 int32_t arg5); | |
| 1715 | 1714 |
| 1716 typedef ObjectTriple (*SimulatorRuntimeTripleCall)(int32_t arg0, int32_t arg1, | 1715 typedef ObjectTriple (*SimulatorRuntimeTripleCall)(int32_t arg0, int32_t arg1, |
| 1717 int32_t arg2, int32_t arg3, | 1716 int32_t arg2, int32_t arg3, |
| 1718 int32_t arg4); | 1717 int32_t arg4); |
| 1719 | 1718 |
| 1720 // These prototypes handle the four types of FP calls. | 1719 // These prototypes handle the four types of FP calls. |
| 1721 typedef int64_t (*SimulatorRuntimeCompareCall)(double darg0, double darg1); | 1720 typedef int64_t (*SimulatorRuntimeCompareCall)(double darg0, double darg1); |
| 1722 typedef double (*SimulatorRuntimeFPFPCall)(double darg0, double darg1); | 1721 typedef double (*SimulatorRuntimeFPFPCall)(double darg0, double darg1); |
| 1723 typedef double (*SimulatorRuntimeFPCall)(double darg0); | 1722 typedef double (*SimulatorRuntimeFPCall)(double darg0); |
| 1724 typedef double (*SimulatorRuntimeFPIntCall)(double darg0, int32_t arg0); | 1723 typedef double (*SimulatorRuntimeFPIntCall)(double darg0, int32_t arg0); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 1745 (get_register(sp) | 1744 (get_register(sp) |
| 1746 & (::v8::internal::FLAG_sim_stack_alignment - 1)) == 0; | 1745 & (::v8::internal::FLAG_sim_stack_alignment - 1)) == 0; |
| 1747 Redirection* redirection = Redirection::FromSwiInstruction(instr); | 1746 Redirection* redirection = Redirection::FromSwiInstruction(instr); |
| 1748 int32_t arg0 = get_register(r0); | 1747 int32_t arg0 = get_register(r0); |
| 1749 int32_t arg1 = get_register(r1); | 1748 int32_t arg1 = get_register(r1); |
| 1750 int32_t arg2 = get_register(r2); | 1749 int32_t arg2 = get_register(r2); |
| 1751 int32_t arg3 = get_register(r3); | 1750 int32_t arg3 = get_register(r3); |
| 1752 int32_t* stack_pointer = reinterpret_cast<int32_t*>(get_register(sp)); | 1751 int32_t* stack_pointer = reinterpret_cast<int32_t*>(get_register(sp)); |
| 1753 int32_t arg4 = stack_pointer[0]; | 1752 int32_t arg4 = stack_pointer[0]; |
| 1754 int32_t arg5 = stack_pointer[1]; | 1753 int32_t arg5 = stack_pointer[1]; |
| 1754 int32_t arg6 = stack_pointer[2]; |
| 1755 int32_t arg7 = stack_pointer[3]; |
| 1756 int32_t arg8 = stack_pointer[4]; |
| 1757 STATIC_ASSERT(kMaxCParameters == 9); |
| 1758 |
| 1755 bool fp_call = | 1759 bool fp_call = |
| 1756 (redirection->type() == ExternalReference::BUILTIN_FP_FP_CALL) || | 1760 (redirection->type() == ExternalReference::BUILTIN_FP_FP_CALL) || |
| 1757 (redirection->type() == ExternalReference::BUILTIN_COMPARE_CALL) || | 1761 (redirection->type() == ExternalReference::BUILTIN_COMPARE_CALL) || |
| 1758 (redirection->type() == ExternalReference::BUILTIN_FP_CALL) || | 1762 (redirection->type() == ExternalReference::BUILTIN_FP_CALL) || |
| 1759 (redirection->type() == ExternalReference::BUILTIN_FP_INT_CALL); | 1763 (redirection->type() == ExternalReference::BUILTIN_FP_INT_CALL); |
| 1760 // This is dodgy but it works because the C entry stubs are never moved. | 1764 // This is dodgy but it works because the C entry stubs are never moved. |
| 1761 // See comment in codegen-arm.cc and bug 1242173. | 1765 // See comment in codegen-arm.cc and bug 1242173. |
| 1762 int32_t saved_lr = get_register(lr); | 1766 int32_t saved_lr = get_register(lr); |
| 1763 intptr_t external = | 1767 intptr_t external = |
| 1764 reinterpret_cast<intptr_t>(redirection->external_function()); | 1768 reinterpret_cast<intptr_t>(redirection->external_function()); |
| (...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1932 set_register(r0, arg0); | 1936 set_register(r0, arg0); |
| 1933 } else { | 1937 } else { |
| 1934 // builtin call. | 1938 // builtin call. |
| 1935 DCHECK(redirection->type() == ExternalReference::BUILTIN_CALL || | 1939 DCHECK(redirection->type() == ExternalReference::BUILTIN_CALL || |
| 1936 redirection->type() == ExternalReference::BUILTIN_CALL_PAIR); | 1940 redirection->type() == ExternalReference::BUILTIN_CALL_PAIR); |
| 1937 SimulatorRuntimeCall target = | 1941 SimulatorRuntimeCall target = |
| 1938 reinterpret_cast<SimulatorRuntimeCall>(external); | 1942 reinterpret_cast<SimulatorRuntimeCall>(external); |
| 1939 if (::v8::internal::FLAG_trace_sim || !stack_aligned) { | 1943 if (::v8::internal::FLAG_trace_sim || !stack_aligned) { |
| 1940 PrintF( | 1944 PrintF( |
| 1941 "Call to host function at %p " | 1945 "Call to host function at %p " |
| 1942 "args %08x, %08x, %08x, %08x, %08x, %08x", | 1946 "args %08x, %08x, %08x, %08x, %08x, %08x, %08x, %08x, %08x", |
| 1943 static_cast<void*>(FUNCTION_ADDR(target)), arg0, arg1, arg2, arg3, | 1947 static_cast<void*>(FUNCTION_ADDR(target)), arg0, arg1, arg2, arg3, |
| 1944 arg4, arg5); | 1948 arg4, arg5, arg6, arg7, arg8); |
| 1945 if (!stack_aligned) { | 1949 if (!stack_aligned) { |
| 1946 PrintF(" with unaligned stack %08x\n", get_register(sp)); | 1950 PrintF(" with unaligned stack %08x\n", get_register(sp)); |
| 1947 } | 1951 } |
| 1948 PrintF("\n"); | 1952 PrintF("\n"); |
| 1949 } | 1953 } |
| 1950 CHECK(stack_aligned); | 1954 CHECK(stack_aligned); |
| 1951 int64_t result = target(arg0, arg1, arg2, arg3, arg4, arg5); | 1955 int64_t result = |
| 1956 target(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); |
| 1952 int32_t lo_res = static_cast<int32_t>(result); | 1957 int32_t lo_res = static_cast<int32_t>(result); |
| 1953 int32_t hi_res = static_cast<int32_t>(result >> 32); | 1958 int32_t hi_res = static_cast<int32_t>(result >> 32); |
| 1954 if (::v8::internal::FLAG_trace_sim) { | 1959 if (::v8::internal::FLAG_trace_sim) { |
| 1955 PrintF("Returned %08x\n", lo_res); | 1960 PrintF("Returned %08x\n", lo_res); |
| 1956 } | 1961 } |
| 1957 set_register(r0, lo_res); | 1962 set_register(r0, lo_res); |
| 1958 set_register(r1, hi_res); | 1963 set_register(r1, hi_res); |
| 1959 } | 1964 } |
| 1960 set_register(lr, saved_lr); | 1965 set_register(lr, saved_lr); |
| 1961 set_pc(get_register(lr)); | 1966 set_pc(get_register(lr)); |
| (...skipping 4082 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6044 processor->prev_ = nullptr; | 6049 processor->prev_ = nullptr; |
| 6045 processor->next_ = nullptr; | 6050 processor->next_ = nullptr; |
| 6046 } | 6051 } |
| 6047 | 6052 |
| 6048 } // namespace internal | 6053 } // namespace internal |
| 6049 } // namespace v8 | 6054 } // namespace v8 |
| 6050 | 6055 |
| 6051 #endif // USE_SIMULATOR | 6056 #endif // USE_SIMULATOR |
| 6052 | 6057 |
| 6053 #endif // V8_TARGET_ARCH_ARM | 6058 #endif // V8_TARGET_ARCH_ARM |
| OLD | NEW |