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

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

Issue 107293008: Fixes bug in far branches on MIPS. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years 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
« runtime/vm/assembler_arm.h ('K') | « runtime/vm/assembler_mips.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" 5 #include "vm/globals.h"
6 #if defined(TARGET_ARCH_MIPS) 6 #if defined(TARGET_ARCH_MIPS)
7 7
8 #include "vm/assembler.h" 8 #include "vm/assembler.h"
9 #include "vm/os.h" 9 #include "vm/os.h"
10 #include "vm/unit_test.h" 10 #include "vm/unit_test.h"
(...skipping 675 matching lines...) Expand 10 before | Expand all | Expand 10 after
686 __ jr(RA); 686 __ jr(RA);
687 } 687 }
688 688
689 689
690 ASSEMBLER_TEST_RUN(Beq_backward, test) { 690 ASSEMBLER_TEST_RUN(Beq_backward, test) {
691 typedef int (*SimpleCode)(); 691 typedef int (*SimpleCode)();
692 EXPECT_EQ(2, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); 692 EXPECT_EQ(2, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
693 } 693 }
694 694
695 695
696 ASSEMBLER_TEST_GENERATE(Beq_backward_far, assembler) {
697 Label l;
698
699 __ set_use_far_branches(true);
700
701 __ LoadImmediate(T1, 0);
702 __ LoadImmediate(T2, 1);
703 __ Bind(&l);
704 __ addiu(T1, T1, Immediate(1));
705 __ beq(T1, T2, &l);
706 __ ori(V0, T1, Immediate(0));
707 __ jr(RA);
708 }
709
710
711 ASSEMBLER_TEST_RUN(Beq_backward_far, test) {
712 typedef int (*SimpleCode)();
713 EXPECT_EQ(2, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
714 }
715
716
696 ASSEMBLER_TEST_GENERATE(Beq_backward_delay, assembler) { 717 ASSEMBLER_TEST_GENERATE(Beq_backward_delay, assembler) {
697 Label l; 718 Label l;
698 719
699 __ LoadImmediate(T1, 0); 720 __ LoadImmediate(T1, 0);
700 __ LoadImmediate(T2, 1); 721 __ LoadImmediate(T2, 1);
701 __ Bind(&l); 722 __ Bind(&l);
702 __ addiu(T1, T1, Immediate(1)); 723 __ addiu(T1, T1, Immediate(1));
703 __ beq(T1, T2, &l); 724 __ beq(T1, T2, &l);
704 __ delay_slot()->addiu(T1, T1, Immediate(1)); 725 __ delay_slot()->addiu(T1, T1, Immediate(1));
705 __ ori(V0, T1, Immediate(0)); 726 __ ori(V0, T1, Immediate(0));
(...skipping 20 matching lines...) Expand all
726 __ jr(RA); 747 __ jr(RA);
727 } 748 }
728 749
729 750
730 ASSEMBLER_TEST_RUN(Beq_forward_taken, test) { 751 ASSEMBLER_TEST_RUN(Beq_forward_taken, test) {
731 typedef int (*SimpleCode)(); 752 typedef int (*SimpleCode)();
732 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); 753 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
733 } 754 }
734 755
735 756
757 ASSEMBLER_TEST_GENERATE(Beq_forward_taken_far, assembler) {
758 Label l;
759
760 __ set_use_far_branches(true);
761
762 __ LoadImmediate(T5, 1);
763 __ LoadImmediate(T6, 1);
764
765 __ LoadImmediate(V0, 42);
766 __ beq(T5, T6, &l);
767 __ LoadImmediate(V0, 0);
768 __ Bind(&l);
769 __ jr(RA);
770 }
771
772
773 ASSEMBLER_TEST_RUN(Beq_forward_taken_far, test) {
774 typedef int (*SimpleCode)();
775 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
776 }
777
778
736 ASSEMBLER_TEST_GENERATE(Beq_forward_not_taken, assembler) { 779 ASSEMBLER_TEST_GENERATE(Beq_forward_not_taken, assembler) {
737 Label l; 780 Label l;
738 781
739 __ LoadImmediate(T5, 0); 782 __ LoadImmediate(T5, 0);
740 __ LoadImmediate(T6, 1); 783 __ LoadImmediate(T6, 1);
741 784
742 __ LoadImmediate(V0, 42); 785 __ LoadImmediate(V0, 42);
743 __ beq(T5, T6, &l); 786 __ beq(T5, T6, &l);
787 __ nop();
744 __ LoadImmediate(V0, 0); 788 __ LoadImmediate(V0, 0);
745 __ Bind(&l); 789 __ Bind(&l);
746 __ jr(RA); 790 __ jr(RA);
747 } 791 }
748 792
749 793
750 ASSEMBLER_TEST_RUN(Beq_forward_not_taken, test) { 794 ASSEMBLER_TEST_RUN(Beq_forward_not_taken, test) {
751 typedef int (*SimpleCode)(); 795 typedef int (*SimpleCode)();
752 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); 796 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
753 } 797 }
754 798
755 799
800 ASSEMBLER_TEST_GENERATE(Beq_forward_not_taken_far, assembler) {
801 Label l;
802
803 __ set_use_far_branches(true);
804
805 __ LoadImmediate(T5, 0);
806 __ LoadImmediate(T6, 1);
807
808 __ LoadImmediate(V0, 42);
809 __ beq(T5, T6, &l);
810 __ nop();
811 __ LoadImmediate(V0, 0);
812 __ Bind(&l);
813 __ jr(RA);
814 }
815
816
817 ASSEMBLER_TEST_RUN(Beq_forward_not_taken_far, test) {
818 typedef int (*SimpleCode)();
819 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
820 }
821
822
823 ASSEMBLER_TEST_GENERATE(Beq_forward_not_taken_far2, assembler) {
824 Label l;
825
826 __ set_use_far_branches(true);
827
828 __ LoadImmediate(T5, 0);
829 __ LoadImmediate(T6, 1);
830
831 __ LoadImmediate(V0, 42);
832 __ beq(T5, T6, &l);
833 __ nop();
834 for (int i = 0; i < (1 << 15); i++) {
835 __ nop();
836 }
837 __ LoadImmediate(V0, 0);
838 __ Bind(&l);
839 __ jr(RA);
840 }
841
842
843 ASSEMBLER_TEST_RUN(Beq_forward_not_taken_far2, test) {
844 typedef int (*SimpleCode)();
845 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
846 }
847
848
756 ASSEMBLER_TEST_GENERATE(Beq_forward_taken2, assembler) { 849 ASSEMBLER_TEST_GENERATE(Beq_forward_taken2, assembler) {
757 Label l; 850 Label l;
758 851
759 __ LoadImmediate(T5, 1); 852 __ LoadImmediate(T5, 1);
760 __ LoadImmediate(T6, 1); 853 __ LoadImmediate(T6, 1);
761 854
762 __ LoadImmediate(V0, 42); 855 __ LoadImmediate(V0, 42);
763 __ beq(T5, T6, &l); 856 __ beq(T5, T6, &l);
764 __ nop(); 857 __ nop();
765 __ nop(); 858 __ nop();
766 __ LoadImmediate(V0, 0); 859 __ LoadImmediate(V0, 0);
767 __ Bind(&l); 860 __ Bind(&l);
768 __ jr(RA); 861 __ jr(RA);
769 } 862 }
770 863
771 864
772 ASSEMBLER_TEST_RUN(Beq_forward_taken2, test) { 865 ASSEMBLER_TEST_RUN(Beq_forward_taken2, test) {
773 typedef int (*SimpleCode)(); 866 typedef int (*SimpleCode)();
774 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); 867 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
775 } 868 }
776 869
777 870
871 ASSEMBLER_TEST_GENERATE(Beq_forward_taken_far2, assembler) {
872 Label l;
873
874 __ set_use_far_branches(true);
875
876 __ LoadImmediate(T5, 1);
877 __ LoadImmediate(T6, 1);
878
879 __ LoadImmediate(V0, 42);
880 __ beq(T5, T6, &l);
881 __ nop();
882 __ nop();
883 __ LoadImmediate(V0, 0);
884 __ Bind(&l);
885 __ jr(RA);
886 }
887
888
889 ASSEMBLER_TEST_RUN(Beq_forward_taken_far2, test) {
890 typedef int (*SimpleCode)();
891 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
892 }
893
894
895 ASSEMBLER_TEST_GENERATE(Beq_forward_taken_far3, assembler) {
896 Label l;
897
898 __ set_use_far_branches(true);
899
900 __ LoadImmediate(T5, 1);
901 __ LoadImmediate(T6, 1);
902
903 __ LoadImmediate(V0, 42);
904 __ beq(T5, T6, &l);
905 __ nop();
906 for (int i = 0; i < (1 << 15); i++) {
907 __ nop();
908 }
909 __ nop();
910 __ LoadImmediate(V0, 0);
911 __ Bind(&l);
912 __ jr(RA);
913 }
914
915
916 ASSEMBLER_TEST_RUN(Beq_forward_taken_far3, test) {
917 typedef int (*SimpleCode)();
918 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
919 }
920
921
778 ASSEMBLER_TEST_GENERATE(Beq_forward_taken_delay, assembler) { 922 ASSEMBLER_TEST_GENERATE(Beq_forward_taken_delay, assembler) {
779 Label l; 923 Label l;
780 924
781 __ LoadImmediate(T5, 1); 925 __ LoadImmediate(T5, 1);
782 __ LoadImmediate(T6, 1); 926 __ LoadImmediate(T6, 1);
783 927
784 __ LoadImmediate(V0, 42); 928 __ LoadImmediate(V0, 42);
785 __ beq(T5, T6, &l); 929 __ beq(T5, T6, &l);
786 __ delay_slot()->ori(V0, V0, Immediate(1)); 930 __ delay_slot()->ori(V0, V0, Immediate(1));
787 __ LoadImmediate(V0, 0); 931 __ LoadImmediate(V0, 0);
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
848 __ jr(RA); 992 __ jr(RA);
849 } 993 }
850 994
851 995
852 ASSEMBLER_TEST_RUN(Bgez, test) { 996 ASSEMBLER_TEST_RUN(Bgez, test) {
853 typedef int (*SimpleCode)(); 997 typedef int (*SimpleCode)();
854 EXPECT_EQ(-2, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); 998 EXPECT_EQ(-2, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
855 } 999 }
856 1000
857 1001
1002 ASSEMBLER_TEST_GENERATE(Bgez_far, assembler) {
1003 Label l;
1004
1005 __ set_use_far_branches(true);
1006
1007 __ LoadImmediate(T5, 3);
1008 __ Bind(&l);
1009 __ bgez(T5, &l);
1010 __ delay_slot()->addiu(T5, T5, Immediate(-1));
1011 __ ori(V0, T5, Immediate(0));
1012 __ jr(RA);
1013 }
1014
1015
1016 ASSEMBLER_TEST_RUN(Bgez_far, test) {
1017 typedef int (*SimpleCode)();
1018 EXPECT_EQ(-2, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
1019 }
1020
1021
1022 ASSEMBLER_TEST_GENERATE(Bgez_far2, assembler) {
1023 Label l;
1024
1025 __ set_use_far_branches(true);
1026
1027 __ LoadImmediate(T5, 3);
1028 __ Bind(&l);
1029 for (int i = 0; i < (1 << 15); i++) {
1030 __ nop();
1031 }
1032 __ bgez(T5, &l);
1033 __ delay_slot()->addiu(T5, T5, Immediate(-1));
1034 __ ori(V0, T5, Immediate(0));
1035 __ jr(RA);
1036 }
1037
1038
1039 ASSEMBLER_TEST_RUN(Bgez_far2, test) {
1040 typedef int (*SimpleCode)();
1041 EXPECT_EQ(-2, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
1042 }
1043
1044
1045 ASSEMBLER_TEST_GENERATE(Bgez_taken_forward_far, assembler) {
1046 Label l;
1047
1048 __ set_use_far_branches(true);
1049
1050 __ LoadImmediate(T5, 1);
1051
1052 __ LoadImmediate(V0, 42);
1053 __ bgez(T5, &l);
1054 __ nop();
1055 __ nop();
1056 __ LoadImmediate(V0, 0);
1057 __ Bind(&l);
1058 __ jr(RA);
1059 }
1060
1061
1062 ASSEMBLER_TEST_RUN(Bgez_taken_forward_far, test) {
1063 typedef int (*SimpleCode)();
1064 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
1065 }
1066
1067
1068 ASSEMBLER_TEST_GENERATE(Bgez_taken_forward_far2, assembler) {
1069 Label l;
1070
1071 __ set_use_far_branches(true);
1072
1073 __ LoadImmediate(T5, 1);
1074
1075 __ LoadImmediate(V0, 42);
1076 __ bgez(T5, &l);
1077 __ nop();
1078 for (int i = 0; i < (1 << 15); i++) {
1079 __ nop();
1080 }
1081 __ LoadImmediate(V0, 0);
1082 __ Bind(&l);
1083 __ jr(RA);
1084 }
1085
1086
1087 ASSEMBLER_TEST_RUN(Bgez_taken_forward_far2, test) {
1088 typedef int (*SimpleCode)();
1089 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
1090 }
1091
1092
1093 ASSEMBLER_TEST_GENERATE(Bgez_not_taken_forward_far, assembler) {
1094 Label l;
1095
1096 __ set_use_far_branches(true);
1097
1098 __ LoadImmediate(T5, -1);
1099
1100 __ LoadImmediate(V0, 42);
1101 __ bgez(T5, &l);
1102 __ nop();
1103 __ nop();
1104 __ LoadImmediate(V0, 0);
1105 __ Bind(&l);
1106 __ jr(RA);
1107 }
1108
1109
1110 ASSEMBLER_TEST_RUN(Bgez_not_taken_forward_far, test) {
1111 typedef int (*SimpleCode)();
1112 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
1113 }
1114
1115
1116 ASSEMBLER_TEST_GENERATE(Bgez_not_taken_forward_far2, assembler) {
1117 Label l;
1118
1119 __ set_use_far_branches(true);
1120
1121 __ LoadImmediate(T5, -1);
1122
1123 __ LoadImmediate(V0, 42);
1124 __ bgez(T5, &l);
1125 __ nop();
1126 for (int i = 0; i < (1 << 15); i++) {
1127 __ nop();
1128 }
1129 __ LoadImmediate(V0, 0);
1130 __ Bind(&l);
1131 __ jr(RA);
1132 }
1133
1134
1135 ASSEMBLER_TEST_RUN(Bgez_not_taken_forward_far2, test) {
1136 typedef int (*SimpleCode)();
1137 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
1138 }
1139
1140
858 ASSEMBLER_TEST_GENERATE(Bgezl, assembler) { 1141 ASSEMBLER_TEST_GENERATE(Bgezl, assembler) {
859 Label l; 1142 Label l;
860 1143
861 __ LoadImmediate(T5, 3); 1144 __ LoadImmediate(T5, 3);
862 __ Bind(&l); 1145 __ Bind(&l);
863 __ bgezl(T5, &l); 1146 __ bgezl(T5, &l);
864 __ delay_slot()->addiu(T5, T5, Immediate(-1)); 1147 __ delay_slot()->addiu(T5, T5, Immediate(-1));
865 __ ori(V0, T5, Immediate(0)); 1148 __ ori(V0, T5, Immediate(0));
866 __ jr(RA); 1149 __ jr(RA);
867 } 1150 }
(...skipping 16 matching lines...) Expand all
884 __ jr(RA); 1167 __ jr(RA);
885 } 1168 }
886 1169
887 1170
888 ASSEMBLER_TEST_RUN(Blez, test) { 1171 ASSEMBLER_TEST_RUN(Blez, test) {
889 typedef int (*SimpleCode)(); 1172 typedef int (*SimpleCode)();
890 EXPECT_EQ(2, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); 1173 EXPECT_EQ(2, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
891 } 1174 }
892 1175
893 1176
1177 ASSEMBLER_TEST_GENERATE(Blez_far, assembler) {
1178 Label l;
1179
1180 __ set_use_far_branches(true);
1181
1182 __ LoadImmediate(T5, -3);
1183 __ Bind(&l);
1184 __ blez(T5, &l);
1185 __ delay_slot()->addiu(T5, T5, Immediate(1));
1186 __ ori(V0, T5, Immediate(0));
1187 __ jr(RA);
1188 }
1189
1190
1191 ASSEMBLER_TEST_RUN(Blez_far, test) {
1192 typedef int (*SimpleCode)();
1193 EXPECT_EQ(2, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
1194 }
1195
1196
1197 ASSEMBLER_TEST_GENERATE(Blez_far2, assembler) {
1198 Label l;
1199
1200 __ set_use_far_branches(true);
1201
1202 __ LoadImmediate(T5, -3);
1203 __ Bind(&l);
1204 for (int i = 0; i < (1 << 15); i++) {
1205 __ nop();
1206 }
1207 __ blez(T5, &l);
1208 __ delay_slot()->addiu(T5, T5, Immediate(1));
1209 __ ori(V0, T5, Immediate(0));
1210 __ jr(RA);
1211 }
1212
1213
1214 ASSEMBLER_TEST_RUN(Blez_far2, test) {
1215 typedef int (*SimpleCode)();
1216 EXPECT_EQ(2, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
1217 }
1218
1219
1220 ASSEMBLER_TEST_GENERATE(Blez_taken_forward_far, assembler) {
1221 Label l;
1222
1223 __ set_use_far_branches(true);
1224
1225 __ LoadImmediate(T5, -1);
1226
1227 __ LoadImmediate(V0, 42);
1228 __ blez(T5, &l);
1229 __ nop();
1230 __ nop();
1231 __ LoadImmediate(V0, 0);
1232 __ Bind(&l);
1233 __ jr(RA);
1234 }
1235
1236
1237 ASSEMBLER_TEST_RUN(Blez_taken_forward_far, test) {
1238 typedef int (*SimpleCode)();
1239 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
1240 }
1241
1242
1243 ASSEMBLER_TEST_GENERATE(Blez_not_taken_forward_far, assembler) {
1244 Label l;
1245
1246 __ set_use_far_branches(true);
1247
1248 __ LoadImmediate(T5, 1);
1249
1250 __ LoadImmediate(V0, 42);
1251 __ blez(T5, &l);
1252 __ nop();
1253 __ nop();
1254 __ LoadImmediate(V0, 0);
1255 __ Bind(&l);
1256 __ jr(RA);
1257 }
1258
1259
1260 ASSEMBLER_TEST_RUN(Blez_not_taken_forward_far, test) {
1261 typedef int (*SimpleCode)();
1262 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
1263 }
1264
1265
894 ASSEMBLER_TEST_GENERATE(Blezl, assembler) { 1266 ASSEMBLER_TEST_GENERATE(Blezl, assembler) {
895 Label l; 1267 Label l;
896 1268
897 __ LoadImmediate(T5, -3); 1269 __ LoadImmediate(T5, -3);
898 __ Bind(&l); 1270 __ Bind(&l);
899 __ blezl(T5, &l); 1271 __ blezl(T5, &l);
900 __ delay_slot()->addiu(T5, T5, Immediate(1)); 1272 __ delay_slot()->addiu(T5, T5, Immediate(1));
901 __ ori(V0, T5, Immediate(0)); 1273 __ ori(V0, T5, Immediate(0));
902 __ jr(RA); 1274 __ jr(RA);
903 } 1275 }
(...skipping 777 matching lines...) Expand 10 before | Expand all | Expand 10 after
1681 A1); 2053 A1);
1682 __ lw(RA, Address(SP, 0 * kWordSize)); 2054 __ lw(RA, Address(SP, 0 * kWordSize));
1683 __ lw(CTX, Address(SP, 1 * kWordSize)); 2055 __ lw(CTX, Address(SP, 1 * kWordSize));
1684 __ addiu(SP, SP, Immediate(2 * kWordSize)); 2056 __ addiu(SP, SP, Immediate(2 * kWordSize));
1685 __ Ret(); 2057 __ Ret();
1686 } 2058 }
1687 2059
1688 } // namespace dart 2060 } // namespace dart
1689 2061
1690 #endif // defined TARGET_ARCH_MIPS 2062 #endif // defined TARGET_ARCH_MIPS
OLDNEW
« runtime/vm/assembler_arm.h ('K') | « runtime/vm/assembler_mips.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698