| 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_IA32) | 6 #if defined(TARGET_ARCH_IA32) |
| 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 1528 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1539 EAX, ECX, EDX | 1539 EAX, ECX, EDX |
| 1540 }; | 1540 }; |
| 1541 | 1541 |
| 1542 | 1542 |
| 1543 // XMM0 is used only as a scratch register in the optimized code. No need to | 1543 // XMM0 is used only as a scratch register in the optimized code. No need to |
| 1544 // save it. | 1544 // save it. |
| 1545 static const intptr_t kNumberOfVolatileXmmRegisters = | 1545 static const intptr_t kNumberOfVolatileXmmRegisters = |
| 1546 kNumberOfXmmRegisters - 1; | 1546 kNumberOfXmmRegisters - 1; |
| 1547 | 1547 |
| 1548 | 1548 |
| 1549 static const intptr_t kNumberOfVolatileRegisters = | |
| 1550 kNumberOfVolatileCpuRegisters + kNumberOfVolatileXmmRegisters; | |
| 1551 | |
| 1552 | |
| 1553 void Assembler::EnterCallRuntimeFrame(intptr_t frame_space) { | 1549 void Assembler::EnterCallRuntimeFrame(intptr_t frame_space) { |
| 1554 enter(Immediate(0)); | 1550 enter(Immediate(0)); |
| 1555 | 1551 |
| 1556 // Preserve volatile CPU registers. | 1552 // Preserve volatile CPU registers. |
| 1557 for (intptr_t i = 0; i < kNumberOfVolatileCpuRegisters; i++) { | 1553 for (intptr_t i = 0; i < kNumberOfVolatileCpuRegisters; i++) { |
| 1558 pushl(volatile_cpu_registers[i]); | 1554 pushl(volatile_cpu_registers[i]); |
| 1559 } | 1555 } |
| 1560 | 1556 |
| 1561 // Preserve all XMM registers except XMM0 | 1557 // Preserve all XMM registers except XMM0 |
| 1562 subl(ESP, Immediate((kNumberOfXmmRegisters - 1) * kDoubleSize)); | 1558 subl(ESP, Immediate((kNumberOfXmmRegisters - 1) * kDoubleSize)); |
| 1563 // Store XMM registers with the lowest register number at the lowest | 1559 // Store XMM registers with the lowest register number at the lowest |
| 1564 // address. | 1560 // address. |
| 1565 intptr_t offset = 0; | 1561 intptr_t offset = 0; |
| 1566 for (intptr_t reg_idx = 1; reg_idx < kNumberOfXmmRegisters; ++reg_idx) { | 1562 for (intptr_t reg_idx = 1; reg_idx < kNumberOfXmmRegisters; ++reg_idx) { |
| 1567 XmmRegister xmm_reg = static_cast<XmmRegister>(reg_idx); | 1563 XmmRegister xmm_reg = static_cast<XmmRegister>(reg_idx); |
| 1568 movsd(Address(ESP, offset), xmm_reg); | 1564 movsd(Address(ESP, offset), xmm_reg); |
| 1569 offset += kDoubleSize; | 1565 offset += kDoubleSize; |
| 1570 } | 1566 } |
| 1571 | 1567 |
| 1572 ReserveAlignedFrameSpace(frame_space); | 1568 ReserveAlignedFrameSpace(frame_space); |
| 1573 } | 1569 } |
| 1574 | 1570 |
| 1575 | 1571 |
| 1576 void Assembler::LeaveCallRuntimeFrame() { | 1572 void Assembler::LeaveCallRuntimeFrame() { |
| 1577 // ESP might have been modified to reserve space for arguments | 1573 // ESP might have been modified to reserve space for arguments |
| 1578 // and ensure proper alignment of the stack frame. | 1574 // and ensure proper alignment of the stack frame. |
| 1579 // We need to restore it before restoring registers. | 1575 // We need to restore it before restoring registers. |
| 1580 leal(ESP, Address(EBP, -kNumberOfVolatileRegisters * kWordSize)); | 1576 const intptr_t kPushedRegistersSize = |
| 1577 kNumberOfVolatileCpuRegisters * kWordSize + |
| 1578 kNumberOfVolatileXmmRegisters * kDoubleSize; |
| 1579 leal(ESP, Address(EBP, -kPushedRegistersSize)); |
| 1581 | 1580 |
| 1582 // Restore all XMM registers except XMM0 | 1581 // Restore all XMM registers except XMM0 |
| 1583 // XMM registers have the lowest register number at the lowest address. | 1582 // XMM registers have the lowest register number at the lowest address. |
| 1584 intptr_t offset = 0; | 1583 intptr_t offset = 0; |
| 1585 for (intptr_t reg_idx = 1; reg_idx < kNumberOfXmmRegisters; ++reg_idx) { | 1584 for (intptr_t reg_idx = 1; reg_idx < kNumberOfXmmRegisters; ++reg_idx) { |
| 1586 XmmRegister xmm_reg = static_cast<XmmRegister>(reg_idx); | 1585 XmmRegister xmm_reg = static_cast<XmmRegister>(reg_idx); |
| 1587 movsd(xmm_reg, Address(ESP, offset)); | 1586 movsd(xmm_reg, Address(ESP, offset)); |
| 1588 offset += kDoubleSize; | 1587 offset += kDoubleSize; |
| 1589 } | 1588 } |
| 1590 addl(ESP, Immediate(offset)); | 1589 addl(ESP, Immediate(offset)); |
| (...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1835 | 1834 |
| 1836 const char* Assembler::XmmRegisterName(XmmRegister reg) { | 1835 const char* Assembler::XmmRegisterName(XmmRegister reg) { |
| 1837 ASSERT((0 <= reg) && (reg < kNumberOfXmmRegisters)); | 1836 ASSERT((0 <= reg) && (reg < kNumberOfXmmRegisters)); |
| 1838 return xmm_reg_names[reg]; | 1837 return xmm_reg_names[reg]; |
| 1839 } | 1838 } |
| 1840 | 1839 |
| 1841 | 1840 |
| 1842 } // namespace dart | 1841 } // namespace dart |
| 1843 | 1842 |
| 1844 #endif // defined TARGET_ARCH_IA32 | 1843 #endif // defined TARGET_ARCH_IA32 |
| OLD | NEW |