Commit | Line | Data |
---|---|---|
c3b7224a NC |
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 | */ | |
16 | 1: | |
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" | |
36 | 2: | |
37 | nop! | |
38 | ||
39 | /* tests for boundary */ | |
40 | 3: | |
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 | |
48 | 4: | |
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 | */ | |
73 | 1: | |
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" | |
97 | 2: | |
98 | nop! | |
99 | ||
100 | /* tests for boundary */ | |
101 | 3: | |
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 | |
109 | 4: | |
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 | */ | |
121 | 1: | |
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" | |
145 | 2: | |
146 | nop! | |
147 | ||
148 | /* tests for boundary */ | |
149 | 3: | |
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 | |
157 | 4: | |
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" |