1/* Thumb-2 IT blocks test program.
2
3   Copyright 2010-2020 Free Software Foundation, Inc.
4
5   This file is part of GDB.
6
7   This program is free software; you can redistribute it and/or modify
8   it under the terms of the GNU General Public License as published by
9   the Free Software Foundation; either version 3 of the License, or
10   (at your option) any later version.
11
12   This program is distributed in the hope that it will be useful,
13   but WITHOUT ANY WARRANTY; without even the implied warranty of
14   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15   GNU General Public License for more details.
16
17   You should have received a copy of the GNU General Public License
18   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
19
20	.syntax unified
21	.text
22	.p2align 2
23	.code 16
24
25#ifndef __thumb2__
26
27	.type main,%function
28	.thumb_func
29	.globl main
30main:
31	mov	r0, #0
32	bx	lr	@ No Thumb-2
33
34#else
35
36	.type main,%function
37	.thumb_func
38	.globl main
39main:
40	mov	r0, #0
41	bx	lr	@ Thumb-2 OK
42
43	@ One conditional instruction, executed.
44	.type it_1,%function
45	.thumb_func
46it_1:
47	mov	r0, #0	@ Setup
48	cmp	r0, #0	@ Setup
49	it	eq	@ IT instruction, Expected == 1
50	addeq	r0, #1	@ Reached
51	bx	lr	@ Done
52
53	@ One conditional instruction, skipped.
54	.type it_2,%function
55	.thumb_func
56it_2:
57	mov	r0, #0	@ Setup
58	cmp	r0, #0	@ Setup
59	it	ne	@ IT instruction, Expected == 0
60	addne	r0, #1	@ Not reached
61	bx	lr	@ Done, Check $r0 == 0
62
63	@ Block of four, alternating, starting with executed.
64	.type it_3,%function
65	.thumb_func
66it_3:
67	mov	r0, #0	@ Setup
68	cmp	r0, #0	@ Setup
69	itete	ge	@ IT instruction, Expected == 2
70	addge	r0, #1	@ Reached
71	addlt	r0, #2	@ Not reached
72	addge	r0, #4	@ Reached
73	addlt	r0, #8	@ Not reached
74	bx	lr	@ Done, Check $r0 == 5
75
76	@ Block of four, changing flags.
77	.type it_4,%function
78	.thumb_func
79it_4:
80	mov	r0, #0	@ Setup
81	cmp	r0, #0	@ Setup
82	itttt	ge	@ IT instruction, Expected == 2
83	addge	r0, #1	@ Reached
84	cmpge	r0, #10	@ Reached
85	addge	r0, #4	@ Not reached
86	addge	r0, #8	@ Not reached
87	bx	lr	@ Done, Check $r0 == 1
88
89	@ Block of two, ending with taken branch.
90	.type it_5,%function
91	.thumb_func
92it_5:
93	mov	r0, #0	@ Setup
94	cmp	r0, #0	@ Setup
95	itt	ge	@ IT instruction, Expected == 2
96	addge	r0, #1	@ Reached
97	bge	.L5	@ Reached
98	add	r0, #2	@ Never reached
99.L5:	bx	lr	@ Done, Check $r0 == 1
100
101	@ Block of two, ending with untaken branch.
102	.type it_6,%function
103	.thumb_func
104it_6:
105	mov	r0, #0	@ Setup
106	cmp	r0, #0	@ Setup
107	ite	ge	@ IT instruction, Expected == 2
108	addge	r0, #1	@ Reached
109	blt	.L6	@ Not reached
110	add	r0, #2	@ Reached
111.L6:	bx	lr	@ Done, Check $r0 == 3
112
113	@ Block of four, taken, of different sizes
114	.type it_7,%function
115	.thumb_func
116it_7:
117	mov	r0, #0	@ Setup
118	cmp	r0, #0	@ Setup
119	itttt	ge	@ IT instruction, Expected == 4
120	addge.n	r0, #1	@ Reached
121	addge.w	r0, #2	@ Reached
122	addge.n	r0, #4	@ Reached
123	addge.w	r0, #8	@ Reached
124	bx	lr	@ Done, Check $r0 == 15
125
126	@ Block of four, only first executed.
127	.type it_8,%function
128	.thumb_func
129it_8:
130	mov	r0, #0	@ Setup
131	cmp	r0, #0	@ Setup
132	iteee	ge	@ IT instruction, Expected == 1
133	addge	r0, #1	@ Reached
134	addlt	r0, #2	@ Not reached
135	addlt	r0, #4	@ Not reached
136	addlt	r0, #8	@ Not reached
137	bx	lr	@ Done, Check $r0 == 1
138
139	.type it_breakpoints,%function
140	.thumb_func
141it_breakpoints:
142	mov	r0, #0
143	cmp	r0, #0
144	it	eq	@ Location 1 @ Break 1
145	moveq	r0, #0
146
147	it	eq	@ Location 2
148	moveq	r0, #0	@ Break 2
149
150	it	ne	@ Location 3
151	movne	r0, #0	@ Break 3
152
153	@ An IT block of maximum size.
154	itttt	eq	@ Location 4
155	moveq.w	r0, #0
156	moveq.w	r0, #0
157	moveq.w	r0, #0
158	moveq.w	r0, #0	@ Break 4
159
160	@ Just outside an IT block.
161	it	eq
162	moveq	r0, #0
163	mov	r0, #0	@ Location 5 @ Break 5
164
165	@ After something that looks like an IT block, but
166	@ is the second half of an instruction.
167	.p2align 6
168	cmp	r0, r0
169	b	1f
170	b.w	.+0xe14	@ 0xf000 0xbf08 -> second half is IT EQ
1711:	mov	r0, #0	@ Location 6 @ Break 6
172
173	@ After something that looks like an IT block, but
174	@ is data.
175	.p2align 6
176	b	1f
177	.short	0xbf08
1781:	mov	r0, #0	@ Location 7 @ Break 7
179
180	bx	lr
181
182#endif /* __thumb2__ */
183