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

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

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

Powered by Google App Engine
This is Rietveld 408576698