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

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
« no previous file with comments | « runtime/vm/assembler_x64.h ('k') | runtime/vm/assembler_x64_test.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 static double kOneConst = 1.0;
1811 static double kNegOneConst = -1.0;
1812 Label is_negative, round;
1813 if (src != dst) {
1814 movsd(dst, src);
1815 }
1816 // Special handling: 0.5 -> 1.0, -0.5 -> -1.0;
1817 Label done, equal_point5, equal_neg_point5;
1818 movq(TMP, Immediate(reinterpret_cast<intptr_t>(&kZeroFiveConst)));
1819 movsd(tmp, Address(TMP, 0));
1820 comisd(tmp, dst);
1821 j(EQUAL, &equal_point5, Assembler::kNearJump);
1822 movq(TMP, Immediate(reinterpret_cast<intptr_t>(&kNegZeroFiveConst)));
1823 movsd(tmp, Address(TMP, 0));
1824 comisd(tmp, dst);
1825 j(EQUAL, &equal_neg_point5, Assembler::kNearJump);
1826
1827 roundsd(dst, dst, Assembler::kRoundToNearest);
1828 jmp(&done, Assembler::kNearJump);
1829
1830 Bind(&equal_point5);
1831 movq(TMP, Immediate(reinterpret_cast<intptr_t>(&kOneConst)));
1832 movsd(dst, Address(TMP, 0));
1833 jmp(&done);
1834
1835 Bind(&equal_neg_point5);
1836 movq(TMP, Immediate(reinterpret_cast<intptr_t>(&kNegOneConst)));
1837 movsd(dst, Address(TMP, 0));
1838 Bind(&done);
1839 }
1840
1841
1757 void Assembler::Stop(const char* message) { 1842 void Assembler::Stop(const char* message) {
1758 int64_t message_address = reinterpret_cast<int64_t>(message); 1843 int64_t message_address = reinterpret_cast<int64_t>(message);
1759 if (FLAG_print_stop_message) { 1844 if (FLAG_print_stop_message) {
1760 pushq(TMP); // Preserve TMP register. 1845 pushq(TMP); // Preserve TMP register.
1761 pushq(RDI); // Preserve RDI register. 1846 pushq(RDI); // Preserve RDI register.
1762 movq(RDI, Immediate(message_address)); 1847 movq(RDI, Immediate(message_address));
1763 call(&StubCode::PrintStopMessageLabel()); 1848 call(&StubCode::PrintStopMessageLabel());
1764 popq(RDI); // Restore RDI register. 1849 popq(RDI); // Restore RDI register.
1765 popq(TMP); // Restore TMP register. 1850 popq(TMP); // Restore TMP register.
1766 } else { 1851 } else {
(...skipping 338 matching lines...) Expand 10 before | Expand all | Expand 10 after
2105 2190
2106 const char* Assembler::XmmRegisterName(XmmRegister reg) { 2191 const char* Assembler::XmmRegisterName(XmmRegister reg) {
2107 ASSERT((0 <= reg) && (reg < kNumberOfXmmRegisters)); 2192 ASSERT((0 <= reg) && (reg < kNumberOfXmmRegisters));
2108 return xmm_reg_names[reg]; 2193 return xmm_reg_names[reg];
2109 } 2194 }
2110 2195
2111 2196
2112 } // namespace dart 2197 } // namespace dart
2113 2198
2114 #endif // defined TARGET_ARCH_X64 2199 #endif // defined TARGET_ARCH_X64
OLDNEW
« no previous file with comments | « runtime/vm/assembler_x64.h ('k') | runtime/vm/assembler_x64_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698