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 |
11 #include "src/arm/constants-arm.h" | 11 #include "src/arm/constants-arm.h" |
12 #include "src/arm/simulator-arm.h" | 12 #include "src/arm/simulator-arm.h" |
13 #include "src/assembler.h" | 13 #include "src/assembler.h" |
14 #include "src/base/bits.h" | 14 #include "src/base/bits.h" |
15 #include "src/codegen.h" | 15 #include "src/codegen.h" |
16 #include "src/disasm.h" | 16 #include "src/disasm.h" |
| 17 #include "src/runtime/runtime-utils.h" |
17 | 18 |
18 #if defined(USE_SIMULATOR) | 19 #if defined(USE_SIMULATOR) |
19 | 20 |
20 // Only build the simulator if not compiling for real ARM hardware. | 21 // Only build the simulator if not compiling for real ARM hardware. |
21 namespace v8 { | 22 namespace v8 { |
22 namespace internal { | 23 namespace internal { |
23 | 24 |
24 // This macro provides a platform independent use of sscanf. The reason for | 25 // This macro provides a platform independent use of sscanf. The reason for |
25 // SScanF not being implemented in a platform independent way through | 26 // SScanF not being implemented in a platform independent way through |
26 // ::v8::internal::OS in the same way as SNPrintF is that the | 27 // ::v8::internal::OS in the same way as SNPrintF is that the |
(...skipping 1683 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1710 // 64-bit value. With the code below we assume that all runtime calls return | 1711 // 64-bit value. With the code below we assume that all runtime calls return |
1711 // 64 bits of result. If they don't, the r1 result register contains a bogus | 1712 // 64 bits of result. If they don't, the r1 result register contains a bogus |
1712 // value, which is fine because it is caller-saved. | 1713 // value, which is fine because it is caller-saved. |
1713 typedef int64_t (*SimulatorRuntimeCall)(int32_t arg0, | 1714 typedef int64_t (*SimulatorRuntimeCall)(int32_t arg0, |
1714 int32_t arg1, | 1715 int32_t arg1, |
1715 int32_t arg2, | 1716 int32_t arg2, |
1716 int32_t arg3, | 1717 int32_t arg3, |
1717 int32_t arg4, | 1718 int32_t arg4, |
1718 int32_t arg5); | 1719 int32_t arg5); |
1719 | 1720 |
| 1721 typedef ObjectTriple (*SimulatorRuntimeTripleCall)(int32_t arg0, int32_t arg1, |
| 1722 int32_t arg2, int32_t arg3, |
| 1723 int32_t arg4); |
| 1724 |
1720 // These prototypes handle the four types of FP calls. | 1725 // These prototypes handle the four types of FP calls. |
1721 typedef int64_t (*SimulatorRuntimeCompareCall)(double darg0, double darg1); | 1726 typedef int64_t (*SimulatorRuntimeCompareCall)(double darg0, double darg1); |
1722 typedef double (*SimulatorRuntimeFPFPCall)(double darg0, double darg1); | 1727 typedef double (*SimulatorRuntimeFPFPCall)(double darg0, double darg1); |
1723 typedef double (*SimulatorRuntimeFPCall)(double darg0); | 1728 typedef double (*SimulatorRuntimeFPCall)(double darg0); |
1724 typedef double (*SimulatorRuntimeFPIntCall)(double darg0, int32_t arg0); | 1729 typedef double (*SimulatorRuntimeFPIntCall)(double darg0, int32_t arg0); |
1725 | 1730 |
1726 // This signature supports direct call in to API function native callback | 1731 // This signature supports direct call in to API function native callback |
1727 // (refer to InvocationCallback in v8.h). | 1732 // (refer to InvocationCallback in v8.h). |
1728 typedef void (*SimulatorRuntimeDirectApiCall)(int32_t arg0); | 1733 typedef void (*SimulatorRuntimeDirectApiCall)(int32_t arg0); |
1729 typedef void (*SimulatorRuntimeProfilingApiCall)(int32_t arg0, void* arg1); | 1734 typedef void (*SimulatorRuntimeProfilingApiCall)(int32_t arg0, void* arg1); |
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1893 if (!stack_aligned) { | 1898 if (!stack_aligned) { |
1894 PrintF(" with unaligned stack %08x\n", get_register(sp)); | 1899 PrintF(" with unaligned stack %08x\n", get_register(sp)); |
1895 } | 1900 } |
1896 PrintF("\n"); | 1901 PrintF("\n"); |
1897 } | 1902 } |
1898 CHECK(stack_aligned); | 1903 CHECK(stack_aligned); |
1899 SimulatorRuntimeProfilingGetterCall target = | 1904 SimulatorRuntimeProfilingGetterCall target = |
1900 reinterpret_cast<SimulatorRuntimeProfilingGetterCall>( | 1905 reinterpret_cast<SimulatorRuntimeProfilingGetterCall>( |
1901 external); | 1906 external); |
1902 target(arg0, arg1, Redirection::ReverseRedirection(arg2)); | 1907 target(arg0, arg1, Redirection::ReverseRedirection(arg2)); |
| 1908 } else if (redirection->type() == |
| 1909 ExternalReference::BUILTIN_CALL_TRIPLE) { |
| 1910 // builtin call returning ObjectTriple. |
| 1911 SimulatorRuntimeTripleCall target = |
| 1912 reinterpret_cast<SimulatorRuntimeTripleCall>(external); |
| 1913 if (::v8::internal::FLAG_trace_sim || !stack_aligned) { |
| 1914 PrintF( |
| 1915 "Call to host triple returning runtime function %p " |
| 1916 "args %08x, %08x, %08x, %08x, %08x", |
| 1917 FUNCTION_ADDR(target), arg1, arg2, arg3, arg4, arg5); |
| 1918 if (!stack_aligned) { |
| 1919 PrintF(" with unaligned stack %08x\n", get_register(sp)); |
| 1920 } |
| 1921 PrintF("\n"); |
| 1922 } |
| 1923 CHECK(stack_aligned); |
| 1924 // arg0 is a hidden argument pointing to the return location, so don't |
| 1925 // pass it to the target function. |
| 1926 ObjectTriple result = target(arg1, arg2, arg3, arg4, arg5); |
| 1927 if (::v8::internal::FLAG_trace_sim) { |
| 1928 PrintF("Returned { %p, %p, %p }\n", result.x, result.y, result.z); |
| 1929 } |
| 1930 // Return is passed back in address pointed to by hidden first argument. |
| 1931 ObjectTriple* sim_result = reinterpret_cast<ObjectTriple*>(arg0); |
| 1932 *sim_result = result; |
| 1933 set_register(r0, arg0); |
1903 } else { | 1934 } else { |
1904 // builtin call. | 1935 // builtin call. |
1905 DCHECK(redirection->type() == ExternalReference::BUILTIN_CALL); | 1936 DCHECK(redirection->type() == ExternalReference::BUILTIN_CALL); |
1906 SimulatorRuntimeCall target = | 1937 SimulatorRuntimeCall target = |
1907 reinterpret_cast<SimulatorRuntimeCall>(external); | 1938 reinterpret_cast<SimulatorRuntimeCall>(external); |
1908 if (::v8::internal::FLAG_trace_sim || !stack_aligned) { | 1939 if (::v8::internal::FLAG_trace_sim || !stack_aligned) { |
1909 PrintF( | 1940 PrintF( |
1910 "Call to host function at %p " | 1941 "Call to host function at %p " |
1911 "args %08x, %08x, %08x, %08x, %08x, %08x", | 1942 "args %08x, %08x, %08x, %08x, %08x, %08x", |
1912 FUNCTION_ADDR(target), | 1943 FUNCTION_ADDR(target), |
(...skipping 2269 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4182 set_register(sp, current_sp + sizeof(uintptr_t)); | 4213 set_register(sp, current_sp + sizeof(uintptr_t)); |
4183 return address; | 4214 return address; |
4184 } | 4215 } |
4185 | 4216 |
4186 } // namespace internal | 4217 } // namespace internal |
4187 } // namespace v8 | 4218 } // namespace v8 |
4188 | 4219 |
4189 #endif // USE_SIMULATOR | 4220 #endif // USE_SIMULATOR |
4190 | 4221 |
4191 #endif // V8_TARGET_ARCH_ARM | 4222 #endif // V8_TARGET_ARCH_ARM |
OLD | NEW |