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

Unified 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 side-by-side diff with in-line comments
Download patch
« runtime/vm/assembler_arm.h ('K') | « runtime/vm/assembler_mips.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/assembler_mips_test.cc
===================================================================
--- runtime/vm/assembler_mips_test.cc (revision 31003)
+++ runtime/vm/assembler_mips_test.cc (working copy)
@@ -693,6 +693,27 @@
}
+ASSEMBLER_TEST_GENERATE(Beq_backward_far, assembler) {
+ Label l;
+
+ __ set_use_far_branches(true);
+
+ __ LoadImmediate(T1, 0);
+ __ LoadImmediate(T2, 1);
+ __ Bind(&l);
+ __ addiu(T1, T1, Immediate(1));
+ __ beq(T1, T2, &l);
+ __ ori(V0, T1, Immediate(0));
+ __ jr(RA);
+}
+
+
+ASSEMBLER_TEST_RUN(Beq_backward_far, test) {
+ typedef int (*SimpleCode)();
+ EXPECT_EQ(2, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
+}
+
+
ASSEMBLER_TEST_GENERATE(Beq_backward_delay, assembler) {
Label l;
@@ -733,6 +754,28 @@
}
+ASSEMBLER_TEST_GENERATE(Beq_forward_taken_far, assembler) {
+ Label l;
+
+ __ set_use_far_branches(true);
+
+ __ LoadImmediate(T5, 1);
+ __ LoadImmediate(T6, 1);
+
+ __ LoadImmediate(V0, 42);
+ __ beq(T5, T6, &l);
+ __ LoadImmediate(V0, 0);
+ __ Bind(&l);
+ __ jr(RA);
+}
+
+
+ASSEMBLER_TEST_RUN(Beq_forward_taken_far, test) {
+ typedef int (*SimpleCode)();
+ EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
+}
+
+
ASSEMBLER_TEST_GENERATE(Beq_forward_not_taken, assembler) {
Label l;
@@ -741,6 +784,7 @@
__ LoadImmediate(V0, 42);
__ beq(T5, T6, &l);
+ __ nop();
__ LoadImmediate(V0, 0);
__ Bind(&l);
__ jr(RA);
@@ -753,6 +797,55 @@
}
+ASSEMBLER_TEST_GENERATE(Beq_forward_not_taken_far, assembler) {
+ Label l;
+
+ __ set_use_far_branches(true);
+
+ __ LoadImmediate(T5, 0);
+ __ LoadImmediate(T6, 1);
+
+ __ LoadImmediate(V0, 42);
+ __ beq(T5, T6, &l);
+ __ nop();
+ __ LoadImmediate(V0, 0);
+ __ Bind(&l);
+ __ jr(RA);
+}
+
+
+ASSEMBLER_TEST_RUN(Beq_forward_not_taken_far, test) {
+ typedef int (*SimpleCode)();
+ EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Beq_forward_not_taken_far2, assembler) {
+ Label l;
+
+ __ set_use_far_branches(true);
+
+ __ LoadImmediate(T5, 0);
+ __ LoadImmediate(T6, 1);
+
+ __ LoadImmediate(V0, 42);
+ __ beq(T5, T6, &l);
+ __ nop();
+ for (int i = 0; i < (1 << 15); i++) {
+ __ nop();
+ }
+ __ LoadImmediate(V0, 0);
+ __ Bind(&l);
+ __ jr(RA);
+}
+
+
+ASSEMBLER_TEST_RUN(Beq_forward_not_taken_far2, test) {
+ typedef int (*SimpleCode)();
+ EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
+}
+
+
ASSEMBLER_TEST_GENERATE(Beq_forward_taken2, assembler) {
Label l;
@@ -775,6 +868,57 @@
}
+ASSEMBLER_TEST_GENERATE(Beq_forward_taken_far2, assembler) {
+ Label l;
+
+ __ set_use_far_branches(true);
+
+ __ LoadImmediate(T5, 1);
+ __ LoadImmediate(T6, 1);
+
+ __ LoadImmediate(V0, 42);
+ __ beq(T5, T6, &l);
+ __ nop();
+ __ nop();
+ __ LoadImmediate(V0, 0);
+ __ Bind(&l);
+ __ jr(RA);
+}
+
+
+ASSEMBLER_TEST_RUN(Beq_forward_taken_far2, test) {
+ typedef int (*SimpleCode)();
+ EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Beq_forward_taken_far3, assembler) {
+ Label l;
+
+ __ set_use_far_branches(true);
+
+ __ LoadImmediate(T5, 1);
+ __ LoadImmediate(T6, 1);
+
+ __ LoadImmediate(V0, 42);
+ __ beq(T5, T6, &l);
+ __ nop();
+ for (int i = 0; i < (1 << 15); i++) {
+ __ nop();
+ }
+ __ nop();
+ __ LoadImmediate(V0, 0);
+ __ Bind(&l);
+ __ jr(RA);
+}
+
+
+ASSEMBLER_TEST_RUN(Beq_forward_taken_far3, test) {
+ typedef int (*SimpleCode)();
+ EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
+}
+
+
ASSEMBLER_TEST_GENERATE(Beq_forward_taken_delay, assembler) {
Label l;
@@ -855,6 +999,145 @@
}
+ASSEMBLER_TEST_GENERATE(Bgez_far, assembler) {
+ Label l;
+
+ __ set_use_far_branches(true);
+
+ __ LoadImmediate(T5, 3);
+ __ Bind(&l);
+ __ bgez(T5, &l);
+ __ delay_slot()->addiu(T5, T5, Immediate(-1));
+ __ ori(V0, T5, Immediate(0));
+ __ jr(RA);
+}
+
+
+ASSEMBLER_TEST_RUN(Bgez_far, test) {
+ typedef int (*SimpleCode)();
+ EXPECT_EQ(-2, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Bgez_far2, assembler) {
+ Label l;
+
+ __ set_use_far_branches(true);
+
+ __ LoadImmediate(T5, 3);
+ __ Bind(&l);
+ for (int i = 0; i < (1 << 15); i++) {
+ __ nop();
+ }
+ __ bgez(T5, &l);
+ __ delay_slot()->addiu(T5, T5, Immediate(-1));
+ __ ori(V0, T5, Immediate(0));
+ __ jr(RA);
+}
+
+
+ASSEMBLER_TEST_RUN(Bgez_far2, test) {
+ typedef int (*SimpleCode)();
+ EXPECT_EQ(-2, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Bgez_taken_forward_far, assembler) {
+ Label l;
+
+ __ set_use_far_branches(true);
+
+ __ LoadImmediate(T5, 1);
+
+ __ LoadImmediate(V0, 42);
+ __ bgez(T5, &l);
+ __ nop();
+ __ nop();
+ __ LoadImmediate(V0, 0);
+ __ Bind(&l);
+ __ jr(RA);
+}
+
+
+ASSEMBLER_TEST_RUN(Bgez_taken_forward_far, test) {
+ typedef int (*SimpleCode)();
+ EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Bgez_taken_forward_far2, assembler) {
+ Label l;
+
+ __ set_use_far_branches(true);
+
+ __ LoadImmediate(T5, 1);
+
+ __ LoadImmediate(V0, 42);
+ __ bgez(T5, &l);
+ __ nop();
+ for (int i = 0; i < (1 << 15); i++) {
+ __ nop();
+ }
+ __ LoadImmediate(V0, 0);
+ __ Bind(&l);
+ __ jr(RA);
+}
+
+
+ASSEMBLER_TEST_RUN(Bgez_taken_forward_far2, test) {
+ typedef int (*SimpleCode)();
+ EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Bgez_not_taken_forward_far, assembler) {
+ Label l;
+
+ __ set_use_far_branches(true);
+
+ __ LoadImmediate(T5, -1);
+
+ __ LoadImmediate(V0, 42);
+ __ bgez(T5, &l);
+ __ nop();
+ __ nop();
+ __ LoadImmediate(V0, 0);
+ __ Bind(&l);
+ __ jr(RA);
+}
+
+
+ASSEMBLER_TEST_RUN(Bgez_not_taken_forward_far, test) {
+ typedef int (*SimpleCode)();
+ EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Bgez_not_taken_forward_far2, assembler) {
+ Label l;
+
+ __ set_use_far_branches(true);
+
+ __ LoadImmediate(T5, -1);
+
+ __ LoadImmediate(V0, 42);
+ __ bgez(T5, &l);
+ __ nop();
+ for (int i = 0; i < (1 << 15); i++) {
+ __ nop();
+ }
+ __ LoadImmediate(V0, 0);
+ __ Bind(&l);
+ __ jr(RA);
+}
+
+
+ASSEMBLER_TEST_RUN(Bgez_not_taken_forward_far2, test) {
+ typedef int (*SimpleCode)();
+ EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
+}
+
+
ASSEMBLER_TEST_GENERATE(Bgezl, assembler) {
Label l;
@@ -891,6 +1174,95 @@
}
+ASSEMBLER_TEST_GENERATE(Blez_far, assembler) {
+ Label l;
+
+ __ set_use_far_branches(true);
+
+ __ LoadImmediate(T5, -3);
+ __ Bind(&l);
+ __ blez(T5, &l);
+ __ delay_slot()->addiu(T5, T5, Immediate(1));
+ __ ori(V0, T5, Immediate(0));
+ __ jr(RA);
+}
+
+
+ASSEMBLER_TEST_RUN(Blez_far, test) {
+ typedef int (*SimpleCode)();
+ EXPECT_EQ(2, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Blez_far2, assembler) {
+ Label l;
+
+ __ set_use_far_branches(true);
+
+ __ LoadImmediate(T5, -3);
+ __ Bind(&l);
+ for (int i = 0; i < (1 << 15); i++) {
+ __ nop();
+ }
+ __ blez(T5, &l);
+ __ delay_slot()->addiu(T5, T5, Immediate(1));
+ __ ori(V0, T5, Immediate(0));
+ __ jr(RA);
+}
+
+
+ASSEMBLER_TEST_RUN(Blez_far2, test) {
+ typedef int (*SimpleCode)();
+ EXPECT_EQ(2, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Blez_taken_forward_far, assembler) {
+ Label l;
+
+ __ set_use_far_branches(true);
+
+ __ LoadImmediate(T5, -1);
+
+ __ LoadImmediate(V0, 42);
+ __ blez(T5, &l);
+ __ nop();
+ __ nop();
+ __ LoadImmediate(V0, 0);
+ __ Bind(&l);
+ __ jr(RA);
+}
+
+
+ASSEMBLER_TEST_RUN(Blez_taken_forward_far, test) {
+ typedef int (*SimpleCode)();
+ EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Blez_not_taken_forward_far, assembler) {
+ Label l;
+
+ __ set_use_far_branches(true);
+
+ __ LoadImmediate(T5, 1);
+
+ __ LoadImmediate(V0, 42);
+ __ blez(T5, &l);
+ __ nop();
+ __ nop();
+ __ LoadImmediate(V0, 0);
+ __ Bind(&l);
+ __ jr(RA);
+}
+
+
+ASSEMBLER_TEST_RUN(Blez_not_taken_forward_far, test) {
+ typedef int (*SimpleCode)();
+ EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
+}
+
+
ASSEMBLER_TEST_GENERATE(Blezl, assembler) {
Label l;
« 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