summaryrefslogtreecommitdiff
path: root/sim/testsuite/bfin/link.s
diff options
context:
space:
mode:
Diffstat (limited to 'sim/testsuite/bfin/link.s')
-rw-r--r--sim/testsuite/bfin/link.s67
1 files changed, 67 insertions, 0 deletions
diff --git a/sim/testsuite/bfin/link.s b/sim/testsuite/bfin/link.s
new file mode 100644
index 00000000000..c92ae1bb00d
--- /dev/null
+++ b/sim/testsuite/bfin/link.s
@@ -0,0 +1,67 @@
+# Blackfin testcase for link/unlink instructions
+# mach: bfin
+
+ .include "testutils.inc"
+
+ start
+
+ /* give FP/RETS known/different values */
+ R7.H = 0xdead;
+ R7.L = 0x1234;
+ RETS = R7;
+ R6 = R7;
+ R6 += 0x23;
+ FP = R6;
+
+ /* SP should have moved by -8 bytes (to push FP/RETS) */
+ R0 = SP;
+ LINK 0;
+ R1 = SP;
+ R1 += 8;
+ CC = R0 == R1;
+ IF !CC JUMP 1f;
+
+ /* FP should now have the same value as SP */
+ R1 = SP;
+ R2 = FP;
+ CC = R1 == R2;
+ IF !CC JUMP 1f;
+
+ /* make sure FP/RETS on the stack have our known values */
+ R1 = [SP];
+ CC = R1 == R6;
+ IF !CC JUMP 1f;
+
+ R1 = [SP + 4];
+ CC = R1 == R7;
+ IF !CC JUMP 1f;
+
+ /* UNLINK should:
+ * assign SP to current FP
+ * adjust SP by -8 bytes
+ * restore RETS/FP from the stack
+ */
+ R4 = 0;
+ RETS = R4;
+ R0 = SP;
+ UNLINK;
+
+ /* Check new SP */
+ R1 = SP;
+ R1 += -0x8;
+ CC = R1 == R0;
+ IF !CC JUMP 1f;
+
+ /* Check restored RETS */
+ R1 = RETS;
+ CC = R1 == R7;
+ IF !CC JUMP 1f;
+
+ /* Check restored FP */
+ R1 = FP;
+ CC = R1 == R6;
+ IF !CC JUMP 1f;
+
+ pass
+1:
+ fail