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

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

Issue 747483002: Resubmit bigint changes of r41817 that were later reverted. (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
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 810 matching lines...) Expand 10 before | Expand all | Expand 10 after
821 } 821 }
822 822
823 823
824 void Intrinsifier::Bigint_absAdd(Assembler* assembler) { 824 void Intrinsifier::Bigint_absAdd(Assembler* assembler) {
825 // static void _absAdd(Uint32List digits, int used, 825 // static void _absAdd(Uint32List digits, int used,
826 // Uint32List a_digits, int a_used, 826 // Uint32List a_digits, int a_used,
827 // Uint32List r_digits) 827 // Uint32List r_digits)
828 828
829 __ movq(RDI, Address(RSP, 5 * kWordSize)); // digits 829 __ movq(RDI, Address(RSP, 5 * kWordSize)); // digits
830 __ movq(R8, Address(RSP, 4 * kWordSize)); // used is Smi 830 __ movq(R8, Address(RSP, 4 * kWordSize)); // used is Smi
831 __ SmiUntag(R8); // used > 0. 831 __ addq(R8, Immediate(2)); // used > 0, Smi. R8 = used + 1, round up.
832 __ sarq(R8, Immediate(2)); // R8 = number of digit pairs to process.
832 __ movq(RSI, Address(RSP, 3 * kWordSize)); // a_digits 833 __ movq(RSI, Address(RSP, 3 * kWordSize)); // a_digits
833 __ movq(RCX, Address(RSP, 2 * kWordSize)); // a_used is Smi 834 __ movq(RCX, Address(RSP, 2 * kWordSize)); // a_used is Smi
834 __ SmiUntag(RCX); // a_used > 0. 835 __ addq(RCX, Immediate(2)); // a_used > 0, Smi. R8 = a_used + 1, round up.
836 __ sarq(RCX, Immediate(2)); // R8 = number of digit pairs to process.
835 __ movq(RBX, Address(RSP, 1 * kWordSize)); // r_digits 837 __ movq(RBX, Address(RSP, 1 * kWordSize)); // r_digits
836 838
837 // Precompute 'used - a_used' now so that carry flag is not lost later. 839 // Precompute 'used - a_used' now so that carry flag is not lost later.
838 __ subq(R8, RCX); 840 __ subq(R8, RCX);
839 __ incq(R8); // To account for the extra test between loops. 841 __ incq(R8); // To account for the extra test between loops.
840 842
841 __ xorq(RDX, RDX); // RDX = 0, carry flag = 0. 843 __ xorq(RDX, RDX); // RDX = 0, carry flag = 0.
842 Label add_loop; 844 Label add_loop;
843 __ Bind(&add_loop); 845 __ Bind(&add_loop);
844 // Loop a_used times, RCX = a_used, RCX > 0. 846 // Loop (a_used+1)/2 times, RCX > 0.
845 __ movl(RAX, FieldAddress(RDI, RDX, TIMES_4, TypedData::data_offset())); 847 __ movq(RAX, FieldAddress(RDI, RDX, TIMES_8, TypedData::data_offset()));
846 __ adcl(RAX, FieldAddress(RSI, RDX, TIMES_4, TypedData::data_offset())); 848 __ adcq(RAX, FieldAddress(RSI, RDX, TIMES_8, TypedData::data_offset()));
847 __ movl(FieldAddress(RBX, RDX, TIMES_4, TypedData::data_offset()), RAX); 849 __ movq(FieldAddress(RBX, RDX, TIMES_8, TypedData::data_offset()), RAX);
848 __ incq(RDX); // Does not affect carry flag. 850 __ incq(RDX); // Does not affect carry flag.
849 __ decq(RCX); // Does not affect carry flag. 851 __ decq(RCX); // Does not affect carry flag.
850 __ j(NOT_ZERO, &add_loop, Assembler::kNearJump); 852 __ j(NOT_ZERO, &add_loop, Assembler::kNearJump);
851 853
852 Label last_carry; 854 Label last_carry;
853 __ decq(R8); // Does not affect carry flag. 855 __ decq(R8); // Does not affect carry flag.
854 __ j(ZERO, &last_carry, Assembler::kNearJump); // If used - a_used == 0. 856 __ j(ZERO, &last_carry, Assembler::kNearJump); // If used - a_used == 0.
855 857
856 Label carry_loop; 858 Label carry_loop;
857 __ Bind(&carry_loop); 859 __ Bind(&carry_loop);
858 // Loop used - a_used times, R8 = used - a_used, R8 > 0. 860 // Loop (used+1)/2 - (a_used+1)/2 times, R8 > 0.
859 __ movl(RAX, FieldAddress(RDI, RDX, TIMES_4, TypedData::data_offset())); 861 __ movq(RAX, FieldAddress(RDI, RDX, TIMES_8, TypedData::data_offset()));
860 __ adcl(RAX, Immediate(0)); 862 __ adcq(RAX, Immediate(0));
861 __ movl(FieldAddress(RBX, RDX, TIMES_4, TypedData::data_offset()), RAX); 863 __ movq(FieldAddress(RBX, RDX, TIMES_8, TypedData::data_offset()), RAX);
862 __ incq(RDX); // Does not affect carry flag. 864 __ incq(RDX); // Does not affect carry flag.
863 __ decq(R8); // Does not affect carry flag. 865 __ decq(R8); // Does not affect carry flag.
864 __ j(NOT_ZERO, &carry_loop, Assembler::kNearJump); 866 __ j(NOT_ZERO, &carry_loop, Assembler::kNearJump);
865 867
866 __ Bind(&last_carry); 868 __ Bind(&last_carry);
867 __ movl(RAX, Immediate(0)); 869 __ movq(RAX, Immediate(0));
868 __ adcl(RAX, Immediate(0)); 870 __ adcq(RAX, Immediate(0));
869 __ movl(FieldAddress(RBX, RDX, TIMES_4, TypedData::data_offset()), RAX); 871 __ movq(FieldAddress(RBX, RDX, TIMES_8, TypedData::data_offset()), RAX);
870 872
871 // Returning Object::null() is not required, since this method is private. 873 // Returning Object::null() is not required, since this method is private.
872 __ ret(); 874 __ ret();
873 } 875 }
874 876
875 877
876 void Intrinsifier::Bigint_absSub(Assembler* assembler) { 878 void Intrinsifier::Bigint_absSub(Assembler* assembler) {
877 // static void _absSub(Uint32List digits, int used, 879 // static void _absSub(Uint32List digits, int used,
878 // Uint32List a_digits, int a_used, 880 // Uint32List a_digits, int a_used,
879 // Uint32List r_digits) 881 // Uint32List r_digits)
880 882
881 __ movq(RDI, Address(RSP, 5 * kWordSize)); // digits 883 __ movq(RDI, Address(RSP, 5 * kWordSize)); // digits
882 __ movq(R8, Address(RSP, 4 * kWordSize)); // used is Smi 884 __ movq(R8, Address(RSP, 4 * kWordSize)); // used is Smi
883 __ SmiUntag(R8); // used > 0. 885 __ addq(R8, Immediate(2)); // used > 0, Smi. R8 = used + 1, round up.
886 __ sarq(R8, Immediate(2)); // R8 = number of digit pairs to process.
884 __ movq(RSI, Address(RSP, 3 * kWordSize)); // a_digits 887 __ movq(RSI, Address(RSP, 3 * kWordSize)); // a_digits
885 __ movq(RCX, Address(RSP, 2 * kWordSize)); // a_used is Smi 888 __ movq(RCX, Address(RSP, 2 * kWordSize)); // a_used is Smi
886 __ SmiUntag(RCX); // a_used > 0. 889 __ addq(RCX, Immediate(2)); // a_used > 0, Smi. R8 = a_used + 1, round up.
890 __ sarq(RCX, Immediate(2)); // R8 = number of digit pairs to process.
887 __ movq(RBX, Address(RSP, 1 * kWordSize)); // r_digits 891 __ movq(RBX, Address(RSP, 1 * kWordSize)); // r_digits
888 892
889 // Precompute 'used - a_used' now so that carry flag is not lost later. 893 // Precompute 'used - a_used' now so that carry flag is not lost later.
890 __ subq(R8, RCX); 894 __ subq(R8, RCX);
891 __ incq(R8); // To account for the extra test between loops. 895 __ incq(R8); // To account for the extra test between loops.
892 896
893 __ xorq(RDX, RDX); // RDX = 0, carry flag = 0. 897 __ xorq(RDX, RDX); // RDX = 0, carry flag = 0.
894 Label sub_loop; 898 Label sub_loop;
895 __ Bind(&sub_loop); 899 __ Bind(&sub_loop);
896 // Loop a_used times, RCX = a_used, RCX > 0. 900 // Loop (a_used+1)/2 times, RCX > 0.
897 __ movl(RAX, FieldAddress(RDI, RDX, TIMES_4, TypedData::data_offset())); 901 __ movq(RAX, FieldAddress(RDI, RDX, TIMES_8, TypedData::data_offset()));
898 __ sbbl(RAX, FieldAddress(RSI, RDX, TIMES_4, TypedData::data_offset())); 902 __ sbbq(RAX, FieldAddress(RSI, RDX, TIMES_8, TypedData::data_offset()));
899 __ movl(FieldAddress(RBX, RDX, TIMES_4, TypedData::data_offset()), RAX); 903 __ movq(FieldAddress(RBX, RDX, TIMES_8, TypedData::data_offset()), RAX);
900 __ incq(RDX); // Does not affect carry flag. 904 __ incq(RDX); // Does not affect carry flag.
901 __ decq(RCX); // Does not affect carry flag. 905 __ decq(RCX); // Does not affect carry flag.
902 __ j(NOT_ZERO, &sub_loop, Assembler::kNearJump); 906 __ j(NOT_ZERO, &sub_loop, Assembler::kNearJump);
903 907
904 Label done; 908 Label done;
905 __ decq(R8); // Does not affect carry flag. 909 __ decq(R8); // Does not affect carry flag.
906 __ j(ZERO, &done, Assembler::kNearJump); // If used - a_used == 0. 910 __ j(ZERO, &done, Assembler::kNearJump); // If used - a_used == 0.
907 911
908 Label carry_loop; 912 Label carry_loop;
909 __ Bind(&carry_loop); 913 __ Bind(&carry_loop);
910 // Loop used - a_used times, R8 = used - a_used, R8 > 0. 914 // Loop (used+1)/2 - (a_used+1)/2 times, R8 > 0.
911 __ movl(RAX, FieldAddress(RDI, RDX, TIMES_4, TypedData::data_offset())); 915 __ movq(RAX, FieldAddress(RDI, RDX, TIMES_8, TypedData::data_offset()));
912 __ sbbl(RAX, Immediate(0)); 916 __ sbbq(RAX, Immediate(0));
913 __ movl(FieldAddress(RBX, RDX, TIMES_4, TypedData::data_offset()), RAX); 917 __ movq(FieldAddress(RBX, RDX, TIMES_8, TypedData::data_offset()), RAX);
914 __ incq(RDX); // Does not affect carry flag. 918 __ incq(RDX); // Does not affect carry flag.
915 __ decq(R8); // Does not affect carry flag. 919 __ decq(R8); // Does not affect carry flag.
916 __ j(NOT_ZERO, &carry_loop, Assembler::kNearJump); 920 __ j(NOT_ZERO, &carry_loop, Assembler::kNearJump);
917 921
918 __ Bind(&done); 922 __ Bind(&done);
919 // Returning Object::null() is not required, since this method is private. 923 // Returning Object::null() is not required, since this method is private.
920 __ ret(); 924 __ ret();
921 } 925 }
922 926
923 927
(...skipping 1032 matching lines...) Expand 10 before | Expand all | Expand 10 after
1956 // Set return value to Isolate::current_tag_. 1960 // Set return value to Isolate::current_tag_.
1957 __ movq(RAX, Address(RBX, Isolate::current_tag_offset())); 1961 __ movq(RAX, Address(RBX, Isolate::current_tag_offset()));
1958 __ ret(); 1962 __ ret();
1959 } 1963 }
1960 1964
1961 #undef __ 1965 #undef __
1962 1966
1963 } // namespace dart 1967 } // namespace dart
1964 1968
1965 #endif // defined TARGET_ARCH_X64 1969 #endif // defined TARGET_ARCH_X64
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698