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

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

Issue 732663003: Process two 32-bit digits as one 64-bit digit in bigint absAdd intrinsic on x64. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 6 years, 1 month 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.cc ('k') | no next file » | 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) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, 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" // Needed here to get TARGET_ARCH_X64. 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_X64.
6 #if defined(TARGET_ARCH_X64) 6 #if defined(TARGET_ARCH_X64)
7 7
8 #include "vm/intrinsifier.h" 8 #include "vm/intrinsifier.h"
9 9
10 #include "vm/assembler.h" 10 #include "vm/assembler.h"
(...skipping 819 matching lines...) Expand 10 before | Expand all | Expand 10 after
830 __ movq(RDI, Address(RSP, 5 * kWordSize)); // digits 830 __ movq(RDI, Address(RSP, 5 * kWordSize)); // digits
831 __ movq(R8, Address(RSP, 4 * kWordSize)); // used is Smi 831 __ movq(R8, Address(RSP, 4 * kWordSize)); // used is Smi
832 __ SmiUntag(R8); // used > 0. 832 __ SmiUntag(R8); // used > 0.
833 __ movq(RSI, Address(RSP, 3 * kWordSize)); // a_digits 833 __ movq(RSI, Address(RSP, 3 * kWordSize)); // a_digits
834 __ movq(RCX, Address(RSP, 2 * kWordSize)); // a_used is Smi 834 __ movq(RCX, Address(RSP, 2 * kWordSize)); // a_used is Smi
835 __ SmiUntag(RCX); // a_used > 0. 835 __ SmiUntag(RCX); // a_used > 0.
836 __ movq(RBX, Address(RSP, 1 * kWordSize)); // r_digits 836 __ movq(RBX, Address(RSP, 1 * kWordSize)); // r_digits
837 837
838 // Precompute 'used - a_used' now so that carry flag is not lost later. 838 // Precompute 'used - a_used' now so that carry flag is not lost later.
839 __ subq(R8, RCX); 839 __ subq(R8, RCX);
840 __ incq(R8); // To account for the extra test between loops. 840
841 // Process two 32-bit digits at a time as a 64-bit value.
842 __ movq(R9, RCX);
843 __ shrq(R9, Immediate(1)); // R9 = a_used / 2.
844 __ shlq(RCX, Immediate(63));
845 __ shrq(RCX, Immediate(63)); // RCX = a_used % 2.
846 __ movq(R10, R8);
847 __ shrq(R10, Immediate(1)); // R10 = (used - a_used) / 2.
848 __ shlq(R8, Immediate(63));
849 __ shrq(R8, Immediate(63)); // R8 = (used - a_used) % 2.
850
851 // Account for the extra guard tests.
852 __ incq(RCX);
853 __ incq(R8);
854 __ incq(R9);
855 __ incq(R10);
841 856
842 __ xorq(RDX, RDX); // RDX = 0, carry flag = 0. 857 __ xorq(RDX, RDX); // RDX = 0, carry flag = 0.
843 Label add_loop; 858 Label add32;
844 __ Bind(&add_loop); 859 __ decq(R9); // Does not affect carry flag.
845 // Loop a_used times, RCX = a_used, RCX > 0. 860 __ j(ZERO, &add32, Assembler::kNearJump); // a_used == 1.
861
862 Label add64_loop;
863 __ Bind(&add64_loop);
864 // Loop a_used/2 times, R9 = a_used/2, a_used > 0.
865 __ movq(RAX, FieldAddress(RDI, RDX, TIMES_4, TypedData::data_offset()));
866 __ adcq(RAX, FieldAddress(RSI, RDX, TIMES_4, TypedData::data_offset()));
867 __ movq(FieldAddress(RBX, RDX, TIMES_4, TypedData::data_offset()), RAX);
868 __ incq(RDX); // Does not affect carry flag.
zra 2014/11/14 22:11:54 Is it possible to put these incq's and decq's in b
869 __ incq(RDX); // Does not affect carry flag.
870 __ decq(R9); // Does not affect carry flag.
871 __ j(NOT_ZERO, &add64_loop, Assembler::kNearJump);
872
873 Label carry64_guard;
874 __ decq(RCX); // Does not affect carry flag.
875 __ j(ZERO, &carry64_guard, Assembler::kNearJump);
876
877 __ Bind(&add32);
846 __ movl(RAX, FieldAddress(RDI, RDX, TIMES_4, TypedData::data_offset())); 878 __ movl(RAX, FieldAddress(RDI, RDX, TIMES_4, TypedData::data_offset()));
847 __ adcl(RAX, FieldAddress(RSI, RDX, TIMES_4, TypedData::data_offset())); 879 __ adcl(RAX, FieldAddress(RSI, RDX, TIMES_4, TypedData::data_offset()));
848 __ movl(FieldAddress(RBX, RDX, TIMES_4, TypedData::data_offset()), RAX); 880 __ movl(FieldAddress(RBX, RDX, TIMES_4, TypedData::data_offset()), RAX);
849 __ incq(RDX); // Does not affect carry flag. 881 __ incq(RDX); // Does not affect carry flag.
850 __ decq(RCX); // Does not affect carry flag. 882
851 __ j(NOT_ZERO, &add_loop, Assembler::kNearJump); 883 Label carry32_guard;
884 __ Bind(&carry64_guard);
885 __ decq(R10); // Does not affect carry flag.
886 __ j(ZERO, &carry32_guard, Assembler::kNearJump);
887
888 Label carry64_loop;
889 __ Bind(&carry64_loop);
890 // Loop (used - a_used)/2 times, R10 = (used - a_used)/2.
891 __ movq(RAX, FieldAddress(RDI, RDX, TIMES_4, TypedData::data_offset()));
892 __ adcq(RAX, Immediate(0));
893 __ movq(FieldAddress(RBX, RDX, TIMES_4, TypedData::data_offset()), RAX);
894 __ incq(RDX); // Does not affect carry flag.
zra 2014/11/14 22:11:54 Same comment.
895 __ incq(RDX); // Does not affect carry flag.
896 __ decq(R10); // Does not affect carry flag.
897 __ j(NOT_ZERO, &carry64_loop, Assembler::kNearJump);
852 898
853 Label last_carry; 899 Label last_carry;
900 __ Bind(&carry32_guard);
854 __ decq(R8); // Does not affect carry flag. 901 __ decq(R8); // Does not affect carry flag.
855 __ j(ZERO, &last_carry, Assembler::kNearJump); // If used - a_used == 0. 902 __ j(ZERO, &last_carry, Assembler::kNearJump);
856 903
857 Label carry_loop;
858 __ Bind(&carry_loop);
859 // Loop used - a_used times, R8 = used - a_used, R8 > 0.
860 __ movl(RAX, FieldAddress(RDI, RDX, TIMES_4, TypedData::data_offset())); 904 __ movl(RAX, FieldAddress(RDI, RDX, TIMES_4, TypedData::data_offset()));
861 __ adcl(RAX, Immediate(0)); 905 __ adcl(RAX, Immediate(0));
862 __ movl(FieldAddress(RBX, RDX, TIMES_4, TypedData::data_offset()), RAX); 906 __ movl(FieldAddress(RBX, RDX, TIMES_4, TypedData::data_offset()), RAX);
863 __ incq(RDX); // Does not affect carry flag. 907 __ incq(RDX); // Does not affect carry flag.
864 __ decq(R8); // Does not affect carry flag.
865 __ j(NOT_ZERO, &carry_loop, Assembler::kNearJump);
866 908
867 __ Bind(&last_carry); 909 __ Bind(&last_carry);
868 __ movl(RAX, Immediate(0)); 910 __ movl(RAX, Immediate(0));
869 __ adcl(RAX, Immediate(0)); 911 __ adcl(RAX, Immediate(0));
870 __ movl(FieldAddress(RBX, RDX, TIMES_4, TypedData::data_offset()), RAX); 912 __ movl(FieldAddress(RBX, RDX, TIMES_4, TypedData::data_offset()), RAX);
871 913
872 // Returning Object::null() is not required, since this method is private. 914 // Returning Object::null() is not required, since this method is private.
873 __ ret(); 915 __ ret();
874 } 916 }
875 917
(...skipping 1081 matching lines...) Expand 10 before | Expand all | Expand 10 after
1957 // Set return value to Isolate::current_tag_. 1999 // Set return value to Isolate::current_tag_.
1958 __ movq(RAX, Address(RBX, Isolate::current_tag_offset())); 2000 __ movq(RAX, Address(RBX, Isolate::current_tag_offset()));
1959 __ ret(); 2001 __ ret();
1960 } 2002 }
1961 2003
1962 #undef __ 2004 #undef __
1963 2005
1964 } // namespace dart 2006 } // namespace dart
1965 2007
1966 #endif // defined TARGET_ARCH_X64 2008 #endif // defined TARGET_ARCH_X64
OLDNEW
« no previous file with comments | « runtime/vm/assembler_x64.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698