summaryrefslogtreecommitdiff
path: root/ld/testsuite/ld-m68hc11/adj-jump.s
diff options
context:
space:
mode:
Diffstat (limited to 'ld/testsuite/ld-m68hc11/adj-jump.s')
-rw-r--r--ld/testsuite/ld-m68hc11/adj-jump.s74
1 files changed, 74 insertions, 0 deletions
diff --git a/ld/testsuite/ld-m68hc11/adj-jump.s b/ld/testsuite/ld-m68hc11/adj-jump.s
new file mode 100644
index 0000000..99b7258
--- /dev/null
+++ b/ld/testsuite/ld-m68hc11/adj-jump.s
@@ -0,0 +1,74 @@
+;;; Test 68HC11 linker relaxation and fixup of bcc/bra branches
+;;;
+ .sect .text
+ .globl _start
+_start:
+ ;; Next 'bra' is assembled as a 'jmp'. It is relaxed to 'bra L3'
+ ;; during a second pass of relax.
+ bra L3
+ .skip 20
+ ;; Next 'jmp' must be relaxed to a 'bra' during the first pass.
+ ;; The branch offset must then be adjusted by consecutive relax.
+ jmp L3
+L1:
+ addd 0,x
+ bne L1 ; Branch not adjusted
+ addd _toto
+ beq L1 ; Backward branch, adjust -1
+ addd _toto+1
+ jbne L1 ; Backward branch, adjust -2
+ bgt L1 ; All possible backward branchs, adjust -2
+ bge L1
+ beq L1
+ ble L1
+ blt L1
+ bhi L1
+ bhs L1
+ beq L1
+ bls L1
+ blo L1
+ bcs L1
+ bmi L1
+ bvs L1
+ bcc L1
+ bpl L1
+ bvc L1
+ bne L1
+ brn L1
+ bra L1
+ ;; Relax several insn to reduce block by 15
+ addd _toto
+ addd _toto
+ addd _toto
+ addd _toto
+ addd _toto
+ addd _toto
+ addd _toto
+ addd _toto
+ addd _toto
+ addd _toto
+ addd _toto
+ addd _toto
+ addd _toto
+ addd _toto
+ addd _toto
+L2:
+ jmp _start ; -> relax to bra _start
+ bne L2 ; Backward branch, adjust -1
+ beq L3 ; Forward branch, adjust -2
+ addd _toto
+ beq L3 ; Forward branch, adjust -1
+ addd _toto
+L3:
+ addd _toto
+ rts
+
+ .sect .page0
+_bar:
+ .long 0
+_toto:
+ .long 0
+ .skip 32
+stack:
+ .skip 10
+_table: