| OLD | NEW | 
|     1 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file |     1 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file | 
|     2 // for details. All rights reserved. Use of this source code is governed by a |     2 // for details. All rights reserved. Use of this source code is governed by a | 
|     3 // BSD-style license that can be found in the LICENSE file. |     3 // BSD-style license that can be found in the LICENSE file. | 
|     4  |     4  | 
|     5 #include "vm/globals.h" |     5 #include "vm/globals.h" | 
|     6 #if defined(TARGET_ARCH_X64) |     6 #if defined(TARGET_ARCH_X64) | 
|     7  |     7  | 
|     8 #include "vm/assembler.h" |     8 #include "vm/assembler.h" | 
|     9 #include "vm/heap.h" |     9 #include "vm/heap.h" | 
|    10 #include "vm/memory_region.h" |    10 #include "vm/memory_region.h" | 
| (...skipping 1675 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1686 } |  1686 } | 
|  1687  |  1687  | 
|  1688  |  1688  | 
|  1689 // TODO(srdjan): Add XMM registers once they are used by the compiler. |  1689 // TODO(srdjan): Add XMM registers once they are used by the compiler. | 
|  1690 // Based on http://x86-64.org/documentation/abi.pdf Fig. 3.4 |  1690 // Based on http://x86-64.org/documentation/abi.pdf Fig. 3.4 | 
|  1691 static const intptr_t kNumberOfVolatileCpuRegisters = 9; |  1691 static const intptr_t kNumberOfVolatileCpuRegisters = 9; | 
|  1692 static const Register volatile_cpu_registers[kNumberOfVolatileCpuRegisters] = { |  1692 static const Register volatile_cpu_registers[kNumberOfVolatileCpuRegisters] = { | 
|  1693     RAX, RCX, RDX, RSI, RDI, R8, R9, R10, R11 |  1693     RAX, RCX, RDX, RSI, RDI, R8, R9, R10, R11 | 
|  1694 }; |  1694 }; | 
|  1695  |  1695  | 
 |  1696 // XMM0 is used only as a scratch register in the optimized code. No need to | 
 |  1697 // save it. | 
 |  1698 static const intptr_t kNumberOfVolatileXmmRegisters = | 
 |  1699     kNumberOfXmmRegisters - 1; | 
 |  1700  | 
 |  1701  | 
 |  1702 static const intptr_t kNumberOfVolatileRegisters = | 
 |  1703     kNumberOfVolatileCpuRegisters + kNumberOfVolatileXmmRegisters; | 
 |  1704  | 
|  1696  |  1705  | 
|  1697 void Assembler::EnterCallRuntimeFrame(intptr_t frame_space) { |  1706 void Assembler::EnterCallRuntimeFrame(intptr_t frame_space) { | 
|  1698   enter(Immediate(0)); |  1707   enter(Immediate(0)); | 
|  1699  |  1708  | 
|  1700   // Preserve volatile registers. |  1709   // Preserve volatile CPU registers. | 
|  1701   for (intptr_t i = 0; i < kNumberOfVolatileCpuRegisters; i++) { |  1710   for (intptr_t i = 0; i < kNumberOfVolatileCpuRegisters; i++) { | 
|  1702     pushq(volatile_cpu_registers[i]); |  1711     pushq(volatile_cpu_registers[i]); | 
|  1703   } |  1712   } | 
|  1704  |  1713  | 
 |  1714   // Preserve all XMM registers except XMM0 | 
 |  1715   subq(RSP, Immediate((kNumberOfXmmRegisters - 1) * kDoubleSize)); | 
 |  1716   // Store XMM registers with the lowest register number at the lowest | 
 |  1717   // address. | 
 |  1718   intptr_t offset = 0; | 
 |  1719   for (intptr_t reg_idx = 1; reg_idx < kNumberOfXmmRegisters; ++reg_idx) { | 
 |  1720     XmmRegister xmm_reg = static_cast<XmmRegister>(reg_idx); | 
 |  1721     movsd(Address(RSP, offset), xmm_reg); | 
 |  1722     offset += kDoubleSize; | 
 |  1723   } | 
 |  1724  | 
|  1705   ReserveAlignedFrameSpace(frame_space); |  1725   ReserveAlignedFrameSpace(frame_space); | 
|  1706 } |  1726 } | 
|  1707  |  1727  | 
|  1708  |  1728  | 
|  1709 void Assembler::LeaveCallRuntimeFrame() { |  1729 void Assembler::LeaveCallRuntimeFrame() { | 
|  1710   // RSP might have been modified to reserve space for arguments |  1730   // RSP might have been modified to reserve space for arguments | 
|  1711   // and ensure proper alignment of the stack frame. |  1731   // and ensure proper alignment of the stack frame. | 
|  1712   // We need to restore it before restoring registers. |  1732   // We need to restore it before restoring registers. | 
|  1713   leaq(RSP, Address(RBP, -kNumberOfVolatileCpuRegisters * kWordSize)); |  1733   leaq(RSP, Address(RBP, -kNumberOfVolatileRegisters * kWordSize)); | 
|  1714  |  1734  | 
|  1715   // Restore volatile registers. |  1735   // Restore all XMM registers except XMM0 | 
 |  1736   // XMM registers have the lowest register number at the lowest address. | 
 |  1737   intptr_t offset = 0; | 
 |  1738   for (intptr_t reg_idx = 1; reg_idx < kNumberOfXmmRegisters; ++reg_idx) { | 
 |  1739     XmmRegister xmm_reg = static_cast<XmmRegister>(reg_idx); | 
 |  1740     movsd(xmm_reg, Address(RSP, offset)); | 
 |  1741     offset += kDoubleSize; | 
 |  1742   } | 
 |  1743   addq(RSP, Immediate(offset)); | 
 |  1744  | 
 |  1745   // Restore volatile CPU registers. | 
|  1716   for (intptr_t i = kNumberOfVolatileCpuRegisters - 1; i >= 0; i--) { |  1746   for (intptr_t i = kNumberOfVolatileCpuRegisters - 1; i >= 0; i--) { | 
|  1717     popq(volatile_cpu_registers[i]); |  1747     popq(volatile_cpu_registers[i]); | 
|  1718   } |  1748   } | 
|  1719  |  1749  | 
|  1720   leave(); |  1750   leave(); | 
|  1721 } |  1751 } | 
|  1722  |  1752  | 
|  1723  |  1753  | 
|  1724 void Assembler::CallRuntime(const RuntimeEntry& entry) { |  1754 void Assembler::CallRuntime(const RuntimeEntry& entry) { | 
|  1725   entry.Call(this); |  1755   entry.Call(this); | 
| (...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1939  |  1969  | 
|  1940 const char* Assembler::XmmRegisterName(XmmRegister reg) { |  1970 const char* Assembler::XmmRegisterName(XmmRegister reg) { | 
|  1941   ASSERT((0 <= reg) && (reg < kNumberOfXmmRegisters)); |  1971   ASSERT((0 <= reg) && (reg < kNumberOfXmmRegisters)); | 
|  1942   return xmm_reg_names[reg]; |  1972   return xmm_reg_names[reg]; | 
|  1943 } |  1973 } | 
|  1944  |  1974  | 
|  1945  |  1975  | 
|  1946 }  // namespace dart |  1976 }  // namespace dart | 
|  1947  |  1977  | 
|  1948 #endif  // defined TARGET_ARCH_X64 |  1978 #endif  // defined TARGET_ARCH_X64 | 
| OLD | NEW |