1/*
2 * tests for branch instruction relaxation
3 *
4 * Author: libin
5 */
6
7.include "relaxation_macro.h"
8
9.macro _b_op_pattern insn insn1
10.balign 2
11
12/*
13 * for local label 1, assembler should NOT alter instructions before .skip;
14 * but it SHOULD alter instructions afte it.
15 */
161:
17  insn_16    "\insn! 1b"
18  tran_16_32 "\insn! 1b", "\insn 1b"
19  insn_16    "\insn1 1b"
20.skip 512
21  insn_16    "\insn! 1b"
22  tran_16_32 "\insn! 1b", "\insn 1b"
23  insn_16    "\insn1 1b"
24
25/*
26 * for local label 2, assembler SHOULD alter instructions before .skip;
27 * but it should NOT alter instructions after it.
28 */
29  insn_16    "\insn! 2f"
30  tran_16_32 "\insn! 2f", "\insn 2f"
31  insn_16    "\insn1 2f"
32.skip 511
33  insn_16    "\insn! 2f"
34  tran_16_32 "\insn! 2f", "\insn 2f"
35  insn_16    "\insn1 2f"
362:
37  nop!
38
39/* tests for boundary */
403:
41.skip 512
42  insn_16 "\insn! 3b"
43  insn_16 "\insn! 3b"
44
45  insn_16 "\insn! 4f"
46  insn_16 "\insn! 4f"
47.skip 511
484:
49  nop!
50.endm
51
52.macro _br_op_pattern insn
53.balign 2
54  insn_32 "\insn r0"
55  insn_32 "\insn r15"
56
57  tran_16_32 "\insn! r0", "\insn r0"
58
59  /* shouldn't alter */
60  insn_32 "\insn r16"
61  insn_32 "\insn r31"
62.endm
63
64.macro _bcmp_op_pattern1 insn
65.balign 2
66
67/* as will give "Using temp register(r1)" warning if you using r1 */
68
69/*
70 * for local label 1, assembler should NOT alter instructions before .skip;
71 * but it SHOULD alter instructions afte it.
72 */
731:
74  insn_32 "\insn r0,  r15, 1b"
75  insn_32 "\insn r15, r16, 1b"
76  insn_32 "\insn r15, r31, 1b"
77  insn_32 "\insn r16, r31, 1b"
78.skip 512
79  insn_32 "\insn r0,  r15, 1b"
80  insn_32 "\insn r15, r16, 1b"
81  insn_32 "\insn r15, r31, 1b"
82  insn_32 "\insn r16, r31, 1b"
83
84/*
85 * for local label 2, assembler SHOULD alter instructions before .skip;
86 * but it should NOT alter instructions after it.
87 */
88  insn_32 "\insn r0,  r15, 2f"
89  insn_32 "\insn r15, r16, 2f"
90  insn_32 "\insn r15, r31, 2f"
91  insn_32 "\insn r16, r31, 2f"
92.skip 511
93  insn_32 "\insn r0,  r15, 2f"
94  insn_32 "\insn r15, r16, 2f"
95  insn_32 "\insn r15, r31, 2f"
96  insn_32 "\insn r16, r31, 2f"
972:
98  nop!
99
100/* tests for boundary */
1013:
102.skip 512
103  insn_32 "\insn r0,  r15, 3b"
104  insn_32 "\insn r16, r15, 3b"
105
106  insn_32 "\insn r0,  r15, 4f"
107  insn_32 "\insn r16, r15, 4f"
108.skip 511
1094:
110.endm
111
112.macro _bcmp_op_pattern2 insn
113.balign 2
114
115/* as will give "Using temp register(r1)" warning if you using r1 */
116
117/*
118 * for local label 1, assembler should NOT alter instructions before .skip;
119 * but it SHOULD alter instructions afte it.
120 */
1211:
122  insn_32 "\insn r0,  1b"
123  insn_32 "\insn r15, 1b"
124  insn_32 "\insn r16, 1b"
125  insn_32 "\insn r31, 1b"
126.skip 512
127  insn_32 "\insn r0,  1b"
128  insn_32 "\insn r15, 1b"
129  insn_32 "\insn r16, 1b"
130  insn_32 "\insn r31, 1b"
131
132/*
133 * for local label 2, assembler SHOULD alter instructions before .skip;
134 * but it should NOT alter instructions after it.
135 */
136  insn_32 "\insn r0,  2f"
137  insn_32 "\insn r15, 2f"
138  insn_32 "\insn r16, 2f"
139  insn_32 "\insn r31, 2f"
140.skip 511
141  insn_32 "\insn r0,  2f"
142  insn_32 "\insn r15, 2f"
143  insn_32 "\insn r16, 2f"
144  insn_32 "\insn r31, 2f"
1452:
146  nop!
147
148/* tests for boundary */
1493:
150.skip 512
151  insn_32 "\insn r0,  3b"
152  insn_32 "\insn r16, 3b"
153
154  insn_32 "\insn r0,  4f"
155  insn_32 "\insn r16, 4f"
156.skip 511
1574:
158.endm
159
160.text
161/* b Disp19 <-> b! Disp9 */
162_b_op_pattern "bgtu", "bgtul"
163_b_op_pattern "bleu", "bleul"
164_b_op_pattern "beq",  "beql"
165_b_op_pattern "bne",  "bnel"
166_b_op_pattern "bgt",  "bgtl"
167_b_op_pattern "ble",  "blel"
168_b_op_pattern "bcnz", "bcnzl"
169_b_op_pattern "b",    "bl"
170
171/* br rD <-> br! rD */
172_br_op_pattern "br"
173_br_op_pattern "brl"
174
175/* bcmpeq/bcmpne rA,rB,Disp9 -> cmp/cmp! rA, rB; beq/bne Disp19 */
176_bcmp_op_pattern1 "bcmpeq"
177_bcmp_op_pattern1 "bcmpne"
178
179/* bcmpeqz/bcmpnez rA,Disp9 -> cmpi! rA, 0; beq/bne Disp19 */
180_bcmp_op_pattern2 "bcmpeqz"
181_bcmp_op_pattern2 "bcmpnez"
182