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

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 1050 matching lines...) Expand 10 before | Expand all | Expand 10 after
1752 static const struct ALIGN16 { 1790 static const struct ALIGN16 {
1753 uint64_t a; 1791 uint64_t a;
1754 uint64_t b; 1792 uint64_t b;
1755 } double_negate_constant = 1793 } double_negate_constant =
1756 {0x8000000000000000LL, 0x8000000000000000LL}; 1794 {0x8000000000000000LL, 0x8000000000000000LL};
1757 movq(TMP, Immediate(reinterpret_cast<intptr_t>(&double_negate_constant))); 1795 movq(TMP, Immediate(reinterpret_cast<intptr_t>(&double_negate_constant)));
1758 xorpd(d, Address(TMP, 0)); 1796 xorpd(d, Address(TMP, 0));
1759 } 1797 }
1760 1798
1761 1799
1800 void Assembler::DoubleAbs(XmmRegister reg) {
1801 static const struct ALIGN16 {
1802 uint64_t a;
1803 uint64_t b;
1804 } double_abs_constant =
1805 {0x7FFFFFFFFFFFFFFFLL, 0x7FFFFFFFFFFFFFFFLL};
1806 movq(TMP, Immediate(reinterpret_cast<intptr_t>(&double_abs_constant)));
1807 andpd(reg, Address(TMP, 0));
1808 }
1809
1810
1811 void Assembler::DoubleRound(XmmRegister dst, XmmRegister src, XmmRegister tmp) {
1812 ASSERT(tmp != src);
1813
1814 static double kZeroFiveConst = 0.5;
1815 Label is_negative, round;
1816 movq(TMP, Immediate(reinterpret_cast<intptr_t>(&kZeroFiveConst)));
1817 if (src != dst) {
1818 movsd(dst, src);
1819 }
1820 pxor(tmp, tmp);
1821 comisd(src, tmp);
1822 j(BELOW, &is_negative, Assembler::kNearJump);
1823 movsd(tmp, Address(TMP, 0));
1824 addsd(dst, tmp);
1825 jmp(&round, Assembler::kNearJump);
1826 Bind(&is_negative);
1827 movsd(tmp, Address(TMP, 0));
1828 subsd(dst, tmp);
1829 Bind(&round);
1830 roundsd(dst, dst, Assembler::kRoundToZero);
1831 }
1832
1833
1762 void Assembler::Stop(const char* message) { 1834 void Assembler::Stop(const char* message) {
1763 int64_t message_address = reinterpret_cast<int64_t>(message); 1835 int64_t message_address = reinterpret_cast<int64_t>(message);
1764 if (FLAG_print_stop_message) { 1836 if (FLAG_print_stop_message) {
1765 pushq(TMP); // Preserve TMP register. 1837 pushq(TMP); // Preserve TMP register.
1766 pushq(RDI); // Preserve RDI register. 1838 pushq(RDI); // Preserve RDI register.
1767 movq(RDI, Immediate(message_address)); 1839 movq(RDI, Immediate(message_address));
1768 call(&StubCode::PrintStopMessageLabel()); 1840 call(&StubCode::PrintStopMessageLabel());
1769 popq(RDI); // Restore RDI register. 1841 popq(RDI); // Restore RDI register.
1770 popq(TMP); // Restore TMP register. 1842 popq(TMP); // Restore TMP register.
1771 } else { 1843 } else {
(...skipping 338 matching lines...) Expand 10 before | Expand all | Expand 10 after
2110 2182
2111 const char* Assembler::XmmRegisterName(XmmRegister reg) { 2183 const char* Assembler::XmmRegisterName(XmmRegister reg) {
2112 ASSERT((0 <= reg) && (reg < kNumberOfXmmRegisters)); 2184 ASSERT((0 <= reg) && (reg < kNumberOfXmmRegisters));
2113 return xmm_reg_names[reg]; 2185 return xmm_reg_names[reg];
2114 } 2186 }
2115 2187
2116 2188
2117 } // namespace dart 2189 } // namespace dart
2118 2190
2119 #endif // defined TARGET_ARCH_X64 2191 #endif // defined TARGET_ARCH_X64
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698