Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(793)

Side by Side Diff: runtime/vm/assembler_x64.cc

Issue 11573044: Inline Doubles truncate and round. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698