Chromium Code Reviews| 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 623 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 634 ASSERT(src <= XMM15); | 634 ASSERT(src <= XMM15); |
| 635 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 635 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 636 EmitUint8(0x66); | 636 EmitUint8(0x66); |
| 637 EmitREX_RB(dst, src); | 637 EmitREX_RB(dst, src); |
| 638 EmitUint8(0x0F); | 638 EmitUint8(0x0F); |
| 639 EmitUint8(0x57); | 639 EmitUint8(0x57); |
| 640 EmitXmmRegisterOperand(dst & 7, src); | 640 EmitXmmRegisterOperand(dst & 7, src); |
| 641 } | 641 } |
| 642 | 642 |
| 643 | 643 |
| 644 void Assembler::andpd(XmmRegister dst, const Address& src) { | |
| 645 ASSERT(dst <= XMM15); | |
| 646 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | |
| 647 EmitUint8(0x66); | |
| 648 EmitOperandREX(dst, src, REX_NONE); | |
| 649 EmitUint8(0x0F); | |
| 650 EmitUint8(0x54); | |
| 651 EmitOperand(dst & 7, src); | |
| 652 } | |
| 653 | |
| 654 | |
| 644 void Assembler::cvtsi2sd(XmmRegister dst, Register src) { | 655 void Assembler::cvtsi2sd(XmmRegister dst, Register src) { |
| 645 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 656 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 646 ASSERT(dst <= XMM15); | 657 ASSERT(dst <= XMM15); |
| 647 Operand operand(src); | 658 Operand operand(src); |
| 648 EmitUint8(0xF2); | 659 EmitUint8(0xF2); |
| 649 EmitOperandREX(dst, operand, REX_W); | 660 EmitOperandREX(dst, operand, REX_W); |
| 650 EmitUint8(0x0F); | 661 EmitUint8(0x0F); |
| 651 EmitUint8(0x2A); | 662 EmitUint8(0x2A); |
| 652 EmitOperand(dst & 7, operand); | 663 EmitOperand(dst & 7, operand); |
| 653 } | 664 } |
| (...skipping 28 matching lines...) Expand all Loading... | |
| 682 ASSERT(dst <= XMM15); | 693 ASSERT(dst <= XMM15); |
| 683 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 694 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 684 EmitUint8(0xF2); | 695 EmitUint8(0xF2); |
| 685 EmitREX_RB(dst, src); | 696 EmitREX_RB(dst, src); |
| 686 EmitUint8(0x0F); | 697 EmitUint8(0x0F); |
| 687 EmitUint8(0x5A); | 698 EmitUint8(0x5A); |
| 688 EmitXmmRegisterOperand(dst & 7, src); | 699 EmitXmmRegisterOperand(dst & 7, src); |
| 689 } | 700 } |
| 690 | 701 |
| 691 | 702 |
| 703 void Assembler::pxor(XmmRegister dst, XmmRegister src) { | |
| 704 ASSERT(src <= XMM15); | |
| 705 ASSERT(dst <= XMM15); | |
| 706 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | |
| 707 EmitUint8(0x66); | |
| 708 EmitREX_RB(dst, src); | |
| 709 EmitUint8(0x0F); | |
| 710 EmitUint8(0xEF); | |
| 711 EmitXmmRegisterOperand(dst, src); | |
| 712 } | |
| 713 | |
| 714 | |
| 715 void Assembler::roundsd(XmmRegister dst, XmmRegister src, RoundingMode mode) { | |
| 716 ASSERT(src <= XMM15); | |
| 717 ASSERT(dst <= XMM15); | |
| 718 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | |
| 719 EmitUint8(0x66); | |
| 720 EmitREX_RB(dst, src); | |
| 721 EmitUint8(0x0F); | |
| 722 EmitUint8(0x3A); | |
| 723 EmitUint8(0x0B); | |
| 724 EmitXmmRegisterOperand(dst, src); | |
| 725 // Mask precision exeption. | |
| 726 EmitUint8(static_cast<uint8_t>(mode) | 0x8); | |
| 727 } | |
| 728 | |
| 729 | |
| 692 void Assembler::fldl(const Address& src) { | 730 void Assembler::fldl(const Address& src) { |
| 693 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 731 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 694 EmitUint8(0xDD); | 732 EmitUint8(0xDD); |
| 695 EmitOperand(0, src); | 733 EmitOperand(0, src); |
| 696 } | 734 } |
| 697 | 735 |
| 698 | 736 |
| 699 void Assembler::fstpl(const Address& dst) { | 737 void Assembler::fstpl(const Address& dst) { |
| 700 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 738 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 701 EmitUint8(0xDD); | 739 EmitUint8(0xDD); |
| (...skipping 1045 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1747 static const struct ALIGN16 { | 1785 static const struct ALIGN16 { |
| 1748 uint64_t a; | 1786 uint64_t a; |
| 1749 uint64_t b; | 1787 uint64_t b; |
| 1750 } double_negate_constant = | 1788 } double_negate_constant = |
| 1751 {0x8000000000000000LL, 0x8000000000000000LL}; | 1789 {0x8000000000000000LL, 0x8000000000000000LL}; |
| 1752 movq(TMP, Immediate(reinterpret_cast<intptr_t>(&double_negate_constant))); | 1790 movq(TMP, Immediate(reinterpret_cast<intptr_t>(&double_negate_constant))); |
| 1753 xorpd(d, Address(TMP, 0)); | 1791 xorpd(d, Address(TMP, 0)); |
| 1754 } | 1792 } |
| 1755 | 1793 |
| 1756 | 1794 |
| 1795 void Assembler::DoubleAbs(XmmRegister reg) { | |
| 1796 static const struct ALIGN16 { | |
| 1797 uint64_t a; | |
| 1798 uint64_t b; | |
| 1799 } double_abs_constant = | |
| 1800 {0x7FFFFFFFFFFFFFFFLL, 0x7FFFFFFFFFFFFFFFLL}; | |
| 1801 movq(TMP, Immediate(reinterpret_cast<intptr_t>(&double_abs_constant))); | |
| 1802 andpd(reg, Address(TMP, 0)); | |
| 1803 } | |
| 1804 | |
| 1805 | |
| 1806 void Assembler::DoubleRound(XmmRegister dst, XmmRegister src, XmmRegister tmp) { | |
| 1807 ASSERT(tmp != src); | |
| 1808 static double kZeroFiveConst = 0.5; | |
| 1809 static double kNegZeroFiveConst = -0.5; | |
| 1810 Label is_negative, round; | |
| 1811 if (src != dst) { | |
| 1812 movsd(dst, src); | |
| 1813 } | |
| 1814 Label below_half, below_equal_neg_half, done; | |
| 1815 movq(TMP, Immediate(reinterpret_cast<intptr_t>(&kZeroFiveConst))); | |
| 1816 movsd(tmp, Address(TMP, 0)); | |
| 1817 comisd(tmp, dst); | |
| 1818 // 0.5 > dst ? | |
|
Florian Schneider
2013/01/11 09:49:30
Same comments as on ia32.
srdjan
2013/01/11 19:41:08
Done.
| |
| 1819 j(ABOVE, &below_half, Assembler::kNearJump); | |
| 1820 // floor(val + 0.5). | |
| 1821 addsd(dst, tmp); | |
| 1822 roundsd(dst, dst, Assembler::kRoundDown); | |
| 1823 jmp(&done, Assembler::kNearJump); | |
| 1824 Bind(&below_half); | |
| 1825 // Return -0.0 for -0.5. | |
| 1826 movq(TMP, Immediate(reinterpret_cast<intptr_t>(&kNegZeroFiveConst))); | |
| 1827 movsd(tmp, Address(TMP, 0)); | |
| 1828 comisd(tmp, dst); | |
| 1829 // -0.5 >= dst. | |
| 1830 j(ABOVE_EQUAL, &below_equal_neg_half, Assembler::kNearJump); | |
| 1831 roundsd(dst, dst, Assembler::kRoundToZero); | |
| 1832 jmp(&done, Assembler::kNearJump); | |
| 1833 Bind(&below_equal_neg_half); | |
| 1834 addsd(dst, tmp); | |
| 1835 roundsd(dst, dst, Assembler::kRoundUp); | |
| 1836 Bind(&done); | |
| 1837 } | |
| 1838 | |
| 1839 | |
| 1757 void Assembler::Stop(const char* message) { | 1840 void Assembler::Stop(const char* message) { |
| 1758 int64_t message_address = reinterpret_cast<int64_t>(message); | 1841 int64_t message_address = reinterpret_cast<int64_t>(message); |
| 1759 if (FLAG_print_stop_message) { | 1842 if (FLAG_print_stop_message) { |
| 1760 pushq(TMP); // Preserve TMP register. | 1843 pushq(TMP); // Preserve TMP register. |
| 1761 pushq(RDI); // Preserve RDI register. | 1844 pushq(RDI); // Preserve RDI register. |
| 1762 movq(RDI, Immediate(message_address)); | 1845 movq(RDI, Immediate(message_address)); |
| 1763 call(&StubCode::PrintStopMessageLabel()); | 1846 call(&StubCode::PrintStopMessageLabel()); |
| 1764 popq(RDI); // Restore RDI register. | 1847 popq(RDI); // Restore RDI register. |
| 1765 popq(TMP); // Restore TMP register. | 1848 popq(TMP); // Restore TMP register. |
| 1766 } else { | 1849 } else { |
| (...skipping 338 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2105 | 2188 |
| 2106 const char* Assembler::XmmRegisterName(XmmRegister reg) { | 2189 const char* Assembler::XmmRegisterName(XmmRegister reg) { |
| 2107 ASSERT((0 <= reg) && (reg < kNumberOfXmmRegisters)); | 2190 ASSERT((0 <= reg) && (reg < kNumberOfXmmRegisters)); |
| 2108 return xmm_reg_names[reg]; | 2191 return xmm_reg_names[reg]; |
| 2109 } | 2192 } |
| 2110 | 2193 |
| 2111 | 2194 |
| 2112 } // namespace dart | 2195 } // namespace dart |
| 2113 | 2196 |
| 2114 #endif // defined TARGET_ARCH_X64 | 2197 #endif // defined TARGET_ARCH_X64 |
| OLD | NEW |