xref: /netbsd-src/external/gpl3/gdb.old/dist/gdb/testsuite/gdb.arch/arm-disp-step.S (revision 200d779b75dbeafa7bc01fd0f60bc61185f6967b)
1/* Copyright 2010-2014 Free Software Foundation, Inc.
2
3   This file is part of GDB.
4
5   This program is free software; you can redistribute it and/or modify
6   it under the terms of the GNU General Public License as published by
7   the Free Software Foundation; either version 3 of the License, or
8   (at your option) any later version.
9
10   This program is distributed in the hope that it will be useful,
11   but WITHOUT ANY WARRANTY; without even the implied warranty of
12   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13   GNU General Public License for more details.
14
15   You should have received a copy of the GNU General Public License
16   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
17
18	.syntax unified
19	.text
20	.type main,%function
21#if defined (__thumb__)
22	.code   16
23	.thumb_func
24#endif
25	.globl main
26main:
27	push {r7, lr}
28	add     sp, sp, #4
29	mov	r7, sp
30
31
32	/* Test call and return */
33	.global test_call
34test_call:
35	bl test_call_subr
36        .global test_ret_end
37test_ret_end:
38	nop			@ Location test_ret_end
39
40	/* Test branch */
41	bl test_branch
42
43	/* Test ldr from pc */
44	bl test_ldr_pc
45
46	/* Test ldm/stm only in ARM mode */
47#if !defined (__thumb__)
48	bl test_ldm_stm_pc
49#endif
50
51	/* Test ldrX literal in ARM and Thumb-2 */
52#if !defined (__thumb__) || defined(__thumb2__)
53	bl test_ldr_literal
54#endif
55
56	/* Test ldr literal in Thumb */
57#if defined(__thumb__)
58	bl test_ldr_literal_16
59#endif
60
61	/* Test cbnz/cbz in Thumb-2 */
62#if defined(__thumb2__)
63	bl test_cbz_cbnz
64#endif
65
66	/* Test adr in Thumb and Thumb-2 */
67#if defined(__thumb__)
68	bl test_adr
69#endif
70	/* Test 32-bit adr in ARM and Thumb-2 */
71#if defined(__thumb2__) || !defined(__thumb__)
72	bl test_adr_32bit
73#endif
74
75	bl test_pop_pc
76
77	/* Test str in ARM mode and Thumb-2 */
78#if !defined(__thumb__)
79	bl test_str_pc
80#endif
81	/* Return */
82	mov     sp, r7
83	sub     sp, sp, #4
84	movs 	r0, #0
85	pop	{r7, pc}
86	.size main, .-main
87
88	.global test_call_subr
89#if defined (__thumb__)
90	.code   16
91	.thumb_func
92#endif
93	.type test_call_subr, %function
94test_call_subr:
95	nop
96        .global test_call_end
97test_call_end:
98        nop			@ Location test_call_end
99        .global test_ret
100test_ret:
101        bx lr
102	.size test_call_subr, .-test_call_subr
103
104
105	.global test_branch
106#if defined (__thumb__)
107	.code   16
108	.thumb_func
109#endif
110	.type test_branch, %function
111test_branch:
112	b	L_branch
113	.global L_branch
114L_branch:
115	bx lr
116	.size test_branch, .-test_branch
117
118	.global test_ldr_pc
119#if defined (__thumb__)
120	.code   16
121	.thumb_func
122#endif
123	.type test_ldr_pc, %function
124test_ldr_pc:
125	ldr	r1, [pc, #0]
126
127	.global test_ldr_pc_ret
128test_ldr_pc_ret:
129	bx lr
130	.size test_ldr_pc, .-test_ldr_pc
131
132#if !defined (__thumb__)
133	.global test_ldm_stm_pc
134	.type test_ldm_stm_pc, %function
135test_ldm_stm_pc:
136	stmdb	sp!, {lr, pc}
137	ldmia	sp!, {r0, r1}
138	ldr	r0, .L1
139	stmdb	sp!, {r0}
140	.global test_ldm_pc
141test_ldm_pc:
142	ldmia	sp!, {pc}
143	.global test_ldm_stm_pc_ret
144test_ldm_stm_pc_ret:
145	bx lr
146	.align	2
147.L1:
148	.word	test_ldm_stm_pc_ret
149	.size test_ldm_stm_pc, .-test_ldm_stm_pc
150#endif
151
152#if !defined (__thumb__) || defined(__thumb2__)
153	.global test_ldr_literal
154	.type test_ldr_literal, %function
155test_ldr_literal:
156	ldrh    r0, [pc]
157	.global test_ldrsb_literal
158test_ldrsb_literal:
159	ldrsb   r0, [pc]
160	.global test_ldrsh_literal
161test_ldrsh_literal:
162	ldrsh   r0, [pc]
163	.global test_ldr_literal_end
164test_ldr_literal_end:
165	bx lr
166	.size test_ldr_literal, .-test_ldr_literal
167#endif
168
169#if defined(__thumb__)
170	.global test_ldr_literal_16
171	.code   16
172	.thumb_func
173test_ldr_literal_16:
174	ldr	r0, .L2
175	.global test_ldr_literal_16_end
176test_ldr_literal_16_end:
177	bx lr
178	.align	2
179.L2:
180	.word	test_ldr_literal_16
181	.size test_ldr_literal_16, .-test_ldr_literal_16
182#endif
183
184#if defined(__thumb2__)
185	.global test_cbz_cbnz
186	.code   16
187	.thumb_func
188test_cbz_cbnz:
189	movs 	r0, #0
190	.global test_zero_cbnz
191test_zero_cbnz:
192	cbnz	r0, .L3
193	.global test_zero_cbz
194test_zero_cbz:
195	cbz	r0, .L3
196.L3:
197	movs	r0, #1
198	.global test_non_zero_cbz
199test_non_zero_cbz:
200	cbz	r0, .L4
201	.global test_non_zero_cbnz
202test_non_zero_cbnz:
203	cbnz	r0, .L4
204	nop
205.L4:
206	.global test_cbz_cbnz_end
207test_cbz_cbnz_end:
208	bx lr
209	.size test_cbz_cbnz, .-test_cbz_cbnz
210#endif
211
212#if defined(__thumb__)
213	.global test_adr
214	.code   16
215	.thumb_func
216test_adr:
217	adr	r0, .L8
218	nop
219	nop
220	nop
221.L8:
222	.global test_adr_end
223test_adr_end:
224	bx lr
225	.size test_adr, .-test_adr
226#endif
227
228#if defined(__thumb2__) || !defined(__thumb__)
229	.global test_adr_32bit
230#if defined(__thumb2__)
231	.code   16
232	.thumb_func
233#endif
234test_adr_32bit:
235	adr     r0, .L6
236	nop
237.L6:
238	nop
239	.global test_adr_32bit_after
240test_adr_32bit_after:
241	adr     r0, .L6
242
243	.global test_adr_32bit_end
244test_adr_32bit_end:
245	bx lr
246	.size test_adr_32bit, .-test_adr_32bit
247#endif
248
249	.global test_pop_pc
250	.type test_pop_pc, %function
251#if defined(__thumb__)
252	.code   16
253	.thumb_func
254#endif
255
256test_pop_pc:
257	ldr     r1, .L1_right
258	ldr	r2, .L1_wrong
259#if defined(__thumb__)
260	movs    r0, #1
261	orrs    r1, r0
262	orrs	r2, r0
263#endif
264	push    {r1}
265	push    {r2}
266	.global test_pop_pc_1
267test_pop_pc_1:
268	pop     {r1, pc}
269
270test_pop_pc_2_start:
271	ldr r1, .L2_right
272#if defined(__thumb__)
273	movs    r0, #1
274	orrs    r1, r0
275#endif
276	push	{r1}
277	.global test_pop_pc_2
278test_pop_pc_2:
279	pop	{pc}
280
281	/* Test pop instruction with full register list.  */
282test_pop_pc_3_start:
283	ldr     r1, .L3_right
284	ldr	r2, .L3_wrong
285#if defined(__thumb__)
286	movs    r0, #1
287	orrs    r1, r0
288	orrs	r2, r0
289#endif
290	push 	{r7}
291	push    {r1} /* Push the right address so that PC will get it.  */
292	/* Push the wrong address so r0-r7 will get the wrong a	ddress.  If PC
293	is set from any of them, we can get a FAIL.  */
294	push	{r2}
295	push	{r2}
296	push	{r2}
297	push	{r2}
298	push	{r2}
299	push	{r2}
300	push	{r2}
301	push	{r2}
302test_pop_pc_3:
303	pop	{r0,r1,r2,r3,r4,r5,r6,r7,pc}
304	.global test_pop_pc_ret
305test_pop_pc_ret:
306	pop	{r7}
307	bx lr
308
309	.global test_pop_pc_1_right
310test_pop_pc_1_right:
311	b	test_pop_pc_2_start /* right */
312	.global test_pop_pc_1_wrong
313test_pop_pc_1_wrong:
314	b	test_pop_pc_2_start /* wrong */
315	.global test_pop_pc_2_right
316test_pop_pc_2_right:
317	b	test_pop_pc_3_start /* right */
318	.global test_pop_pc_2_wrong
319test_pop_pc_2_wrong:
320	b	test_pop_pc_3_start /* wrong */
321	.global test_pop_pc_3_right
322test_pop_pc_3_right:
323	b	test_pop_pc_ret /* right */
324	.global test_pop_pc_3_wrong
325test_pop_pc_3_wrong:
326	b	test_pop_pc_ret /* wrong */
327
328	.align  2
329.L1_right:
330	.word   test_pop_pc_1_right
331.L1_wrong:
332	.word	test_pop_pc_1_wrong
333.L2_right:
334	.word   test_pop_pc_2_right
335.L2_wrong:
336	.word	test_pop_pc_2_wrong
337.L3_right:
338	.word   test_pop_pc_3_right
339.L3_wrong:
340	.word	test_pop_pc_3_wrong
341	.size test_pop_pc, .-test_pop_pc
342
343#if !defined(__thumb__)
344#if defined (__thumb2__)
345	.code   16
346	.thumb_func
347#endif
348	.global test_str_pc
349	.type test_str_pc, %function
350test_str_pc:
351	str     pc, [sp, #-4]
352	ldr	r0, [sp, #-4]
353	sub	r0, r0, pc
354	/* compute offset again without displaced stepping.  */
355	str     pc, [sp, #-4]
356	ldr	r1, [sp, #-4]
357	sub	r1, r1, pc
358
359	/* r0 should be equal to r1.  */
360	cmp	r0, r1
361	bne	pc_offset_wrong
362
363	.global pc_offset_right
364pc_offset_right:
365	b	test_str_pc_end
366
367	.global pc_offset_wrong
368pc_offset_wrong:
369	nop
370
371	.global test_str_pc_end
372test_str_pc_end:
373	bx lr
374#endif
375