]> oss.titaniummirror.com Git - msp430-binutils.git/blobdiff - gas/testsuite/gas/score/branch_32.s
Merge commit 'upstream/2.20'
[msp430-binutils.git] / gas / testsuite / gas / score / branch_32.s
diff --git a/gas/testsuite/gas/score/branch_32.s b/gas/testsuite/gas/score/branch_32.s
new file mode 100644 (file)
index 0000000..aba4dcd
--- /dev/null
@@ -0,0 +1,181 @@
+/*
+ * tests for branch instruction relaxation
+ *
+ * Author: libin
+ */
+
+.include "relaxation_macro.h"
+
+.macro _b_op_pattern insn insn1
+.balign 2
+
+/*
+ * for local label 1, assembler should NOT alter instructions before .skip;
+ * but it SHOULD alter instructions afte it.
+ */
+1:
+  insn_16    "\insn! 1b"
+  tran_16_32 "\insn! 1b", "\insn 1b"
+  insn_16    "\insn1 1b"
+.skip 512
+  insn_16    "\insn! 1b"
+  tran_16_32 "\insn! 1b", "\insn 1b"
+  insn_16    "\insn1 1b"
+
+/* 
+ * for local label 2, assembler SHOULD alter instructions before .skip;
+ * but it should NOT alter instructions after it.
+ */
+  insn_16    "\insn! 2f"
+  tran_16_32 "\insn! 2f", "\insn 2f"
+  insn_16    "\insn1 2f"
+.skip 511
+  insn_16    "\insn! 2f"
+  tran_16_32 "\insn! 2f", "\insn 2f"
+  insn_16    "\insn1 2f"
+2:
+  nop!
+
+/* tests for boundary */
+3:
+.skip 512
+  insn_16 "\insn! 3b"
+  insn_16 "\insn! 3b"
+
+  insn_16 "\insn! 4f"
+  insn_16 "\insn! 4f"
+.skip 511
+4:
+  nop!
+.endm
+
+.macro _br_op_pattern insn
+.balign 2
+  insn_32 "\insn r0"
+  insn_32 "\insn r15"
+
+  tran_16_32 "\insn! r0", "\insn r0"
+
+  /* shouldn't alter */
+  insn_32 "\insn r16"
+  insn_32 "\insn r31"
+.endm
+
+.macro _bcmp_op_pattern1 insn
+.balign 2
+
+/* as will give "Using temp register(r1)" warning if you using r1 */
+
+/*
+ * for local label 1, assembler should NOT alter instructions before .skip;
+ * but it SHOULD alter instructions afte it.
+ */
+1:
+  insn_32 "\insn r0,  r15, 1b"
+  insn_32 "\insn r15, r16, 1b"
+  insn_32 "\insn r15, r31, 1b"
+  insn_32 "\insn r16, r31, 1b"
+.skip 512
+  insn_32 "\insn r0,  r15, 1b"
+  insn_32 "\insn r15, r16, 1b"
+  insn_32 "\insn r15, r31, 1b"
+  insn_32 "\insn r16, r31, 1b"
+
+/* 
+ * for local label 2, assembler SHOULD alter instructions before .skip;
+ * but it should NOT alter instructions after it.
+ */
+  insn_32 "\insn r0,  r15, 2f"
+  insn_32 "\insn r15, r16, 2f"
+  insn_32 "\insn r15, r31, 2f"
+  insn_32 "\insn r16, r31, 2f"
+.skip 511
+  insn_32 "\insn r0,  r15, 2f"
+  insn_32 "\insn r15, r16, 2f"
+  insn_32 "\insn r15, r31, 2f"
+  insn_32 "\insn r16, r31, 2f"
+2:
+  nop!
+
+/* tests for boundary */
+3:
+.skip 512
+  insn_32 "\insn r0,  r15, 3b"
+  insn_32 "\insn r16, r15, 3b"
+
+  insn_32 "\insn r0,  r15, 4f"
+  insn_32 "\insn r16, r15, 4f"
+.skip 511
+4:
+.endm 
+
+.macro _bcmp_op_pattern2 insn
+.balign 2
+
+/* as will give "Using temp register(r1)" warning if you using r1 */
+
+/*
+ * for local label 1, assembler should NOT alter instructions before .skip;
+ * but it SHOULD alter instructions afte it.
+ */
+1:
+  insn_32 "\insn r0,  1b"
+  insn_32 "\insn r15, 1b"
+  insn_32 "\insn r16, 1b"
+  insn_32 "\insn r31, 1b"
+.skip 512
+  insn_32 "\insn r0,  1b"
+  insn_32 "\insn r15, 1b"
+  insn_32 "\insn r16, 1b"
+  insn_32 "\insn r31, 1b"
+
+/* 
+ * for local label 2, assembler SHOULD alter instructions before .skip;
+ * but it should NOT alter instructions after it.
+ */
+  insn_32 "\insn r0,  2f"
+  insn_32 "\insn r15, 2f"
+  insn_32 "\insn r16, 2f"
+  insn_32 "\insn r31, 2f"
+.skip 511
+  insn_32 "\insn r0,  2f"
+  insn_32 "\insn r15, 2f"
+  insn_32 "\insn r16, 2f"
+  insn_32 "\insn r31, 2f"
+2:
+  nop!
+
+/* tests for boundary */
+3:
+.skip 512
+  insn_32 "\insn r0,  3b"
+  insn_32 "\insn r16, 3b"
+
+  insn_32 "\insn r0,  4f"
+  insn_32 "\insn r16, 4f"
+.skip 511
+4:
+.endm 
+
+.text
+/* b Disp19 <-> b! Disp9 */
+_b_op_pattern "bgtu", "bgtul"
+_b_op_pattern "bleu", "bleul"
+_b_op_pattern "beq",  "beql"
+_b_op_pattern "bne",  "bnel"
+_b_op_pattern "bgt",  "bgtl"
+_b_op_pattern "ble",  "blel"
+_b_op_pattern "bcnz", "bcnzl"
+_b_op_pattern "b",    "bl"
+
+/* br rD <-> br! rD */
+_br_op_pattern "br"
+_br_op_pattern "brl"
+
+/* bcmpeq/bcmpne rA,rB,Disp9 -> cmp/cmp! rA, rB; beq/bne Disp19 */
+_bcmp_op_pattern1 "bcmpeq"
+_bcmp_op_pattern1 "bcmpne"
+
+/* bcmpeqz/bcmpnez rA,Disp9 -> cmpi! rA, 0; beq/bne Disp19 */
+_bcmp_op_pattern2 "bcmpeqz"
+_bcmp_op_pattern2 "bcmpnez"