xref: /netbsd-src/external/gpl3/gdb/dist/sim/testsuite/pru/carry.s (revision 8e33eff89e26cf71871ead62f0d5063e1313c33a)
1# Check that carry for addition and subtraction works.
2# mach: pru
3
4# Copyright (C) 2023-2024 Free Software Foundation, Inc.
5# Contributed by Dimitar Dimitrov <dimitar@dinux.eu>
6#
7# This file is part of the GNU simulators.
8#
9# This program is free software; you can redistribute it and/or modify
10# it under the terms of the GNU General Public License as published by
11# the Free Software Foundation; either version 3 of the License, or
12# (at your option) any later version.
13#
14# This program is distributed in the hope that it will be useful,
15# but WITHOUT ANY WARRANTY; without even the implied warranty of
16# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17# GNU General Public License for more details.
18#
19# You should have received a copy of the GNU General Public License
20# along with this program.  If not, see <http://www.gnu.org/licenses/>.
21
22.include "testutils.inc"
23
24	# Helper macro to exercise three consecutive
25	# instructions using the carry bit.
26	.macro test_seq srcmode, dstmode, init0, init1, init2, init3, alu0, alu1, alu2, expected
27	# In case srcmode>dstmode, "garbage" in the r20 MSB
28	# bits could falsely be interpreted as carry.
29	# So start with initialized destination to make tests consistent.
30	ldi	r20, 0
31	ldi32	r15, \init0
32	ldi32	r16, \init1
33	ldi32	r17, \init2
34	ldi32	r18, \init3
35	ldi32	r0, \expected
36	\alu0	r20\dstmode, r15\srcmode, r16\srcmode
37	\alu1	r20\dstmode, r20\srcmode, r17\srcmode
38	\alu2	r20\dstmode, r20\srcmode, r18\srcmode
39	qbeq	1f, r0, r20\dstmode
40	jmp	EXIT_FAIL
411:
42	.endm
43
44	# Helper macro to verify one ALU instruction
45	# using the carry bit.
46	.macro test1 alu, dstmode, src0mode, src0init, src1mode, src1init, expected
47	ldi32	r15, \src0init
48	ldi32	r16, \src1init
49	ldi32	r0, \expected
50	\alu	r20\dstmode, r15\src0mode, r16\src1mode
51	qbeq	1f, r0, r20\dstmode
52	jmp	EXIT_FAIL
531:
54	.endm
55
56	start
57
58	# ***** ADD 32-bit dst, 32-bit src *****
59	# {add, clear carry}
60	test1	add, "   ", "   ", 0x00000000, "   ", 0x00000000, 0x00000000
61	# {add with carry=0, clear carry}
62	test1	adc, "   ", "   ", 0x00000000, "   ", 0x00000000, 0x00000000
63	# {add with carry=0, set carry}
64	test1	adc, "   ", "   ", 0x00000001, "   ", 0xffffffff, 0x00000000
65	# {add with carry=1, set carry}
66	test1	adc, "   ", "   ", 0x00000010, "   ", 0xfffffffe, 0x0000000f
67	# {add with carry=1, clear carry}
68	test1	adc, "   ", "   ", 0x00000010, "   ", 0x0ffffffe, 0x1000000f
69	# {add with carry=0, set carry}
70	test1	adc, "   ", "   ", 0x00000001, "   ", 0xffffffff, 0x00000000
71	# {add, set carry}
72	test1	add, "   ", "   ", 0x00000001, "   ", 0xffffffff, 0x00000000
73	# {add with carry=1, set carry}
74	test1	adc, "   ", "   ", 0x00000010, "   ", 0xfffffffe, 0x0000000f
75
76	# ***** ADD 32-bit dst, 16-bit src *****
77	test1	add, "   ", ".w0", 0x00000000, ".w0", 0x00000000, 0x00000000
78	test1	adc, "   ", ".w0", 0x00000000, ".w0", 0x00000000, 0x00000000
79	test1	adc, "   ", ".w0", 0x00000003, ".w0", 0xffffffff, 0x00010002
80	test1	adc, "   ", ".w0", 0x00000010, ".w0", 0x0000fffe, 0x0001000e
81
82	# ***** ADD 32-bit dst, 8-bit src *****
83	test1	add, "   ", ".b0", 0x00000000, ".b0", 0x00000000, 0x00000000
84	test1	adc, "   ", ".b0", 0x00000000, ".b0", 0x00000000, 0x00000000
85	test1	adc, "   ", ".b0", 0x00000003, ".b0", 0xffffffff, 0x00000102
86	test1	adc, "   ", ".b0", 0x00000010, ".b0", 0x0000f0fe, 0x0000010e
87
88	# ***** ADD 16-bit dst, 32-bit src *****
89	test1	add, ".w0", "   ", 0x00000000, "   ", 0x00000000, 0x00000000
90	test1	adc, ".w0", "   ", 0x00000000, "   ", 0x00000000, 0x00000000
91	test1	adc, ".w0", "   ", 0x00000001, "   ", 0xfff0ffff, 0x00000000
92	test1	adc, ".w0", "   ", 0x00000010, "   ", 0x0000fffe, 0x0000000f
93	test1	adc, ".w0", "   ", 0x00000010, "   ", 0x00000ffe, 0x0000100f
94	test1	adc, ".w0", "   ", 0x00000001, "   ", 0x0000ffff, 0x00000000
95	test1	add, ".w0", "   ", 0x00000001, "   ", 0x0000ffff, 0x00000000
96	test1	adc, ".w0", "   ", 0x00000010, "   ", 0x0000fffe, 0x0000000f
97	# Test when intermediate sum sets the carry.
98	test1	add, ".w0", "   ", 0x00010000, "   ", 0x00000000, 0x00000000
99	test1	adc, ".w0", "   ", 0x00000000, "   ", 0x00000000, 0x00000001
100	test1	add, ".w0", "   ", 0x00020000, "   ", 0x00000000, 0x00000000
101	test1	adc, ".w0", "   ", 0x00000000, "   ", 0x00000000, 0x00000000
102
103	# ***** ADD 16-bit dst, 16-bit src *****
104	test1	add, ".w0", ".w0", 0x00000210, ".w0", 0x00000130, 0x00000340
105	test1	adc, ".w0", ".w0", 0x00000000, ".w0", 0x00000000, 0x00000000
106	test1	adc, ".w0", ".w0", 0x00000001, ".w0", 0xffffffff, 0x00000000
107	test1	adc, ".w0", ".w0", 0x00000010, ".w0", 0xfffffffe, 0x0000000f
108	test1	adc, ".w0", ".w0", 0x00000010, ".w0", 0x00000ffe, 0x0000100f
109	test1	adc, ".w0", ".w0", 0x00000001, ".w0", 0xfff0ffff, 0x00000000
110	test1	add, ".w0", ".w0", 0x00000001, ".w0", 0xfff0ffff, 0x00000000
111	test1	adc, ".w0", ".w0", 0x00000010, ".w0", 0xfff1fffe, 0x0000000f
112
113	# ***** ADD 16-bit dst, 8-bit src *****
114	test1	add, ".w0", ".b0", 0x00000000, ".b0", 0x00000000, 0x00000000
115	test1	adc, ".w0", ".b0", 0x00000000, ".b0", 0x00000000, 0x00000000
116	test1	adc, ".w0", ".b0", 0x00000003, ".b0", 0xffffffff, 0x00000102
117	test1	adc, ".w0", ".b0", 0x00000010, ".b0", 0x0000f0fe, 0x0000010e
118
119	# ***** ADD 8-bit dst, 32-bit src *****
120	test1	add, ".b0", "   ", 0x00000000, "   ", 0x00000000, 0x00000000
121	test1	adc, ".b0", "   ", 0x00000000, "   ", 0x00000000, 0x00000000
122	test1	adc, ".b0", "   ", 0x00000001, "   ", 0x000000ff, 0x00000000
123	test1	adc, ".b0", "   ", 0x00000010, "   ", 0x000000fe, 0x0000000f
124	test1	adc, ".b0", "   ", 0x00000021, "   ", 0x0000001e, 0x00000040
125	test1	adc, ".b0", "   ", 0x00000001, "   ", 0x000000ff, 0x00000000
126	test1	add, ".b0", "   ", 0x00000001, "   ", 0x000000ff, 0x00000000
127	test1	adc, ".b0", "   ", 0x00000010, "   ", 0x000000fe, 0x0000000f
128	# Test when intermediate sum sets the carry.
129	test1	add, ".b0", "   ", 0x10000100, "   ", 0x00000000, 0x00000000
130	test1	adc, ".b0", "   ", 0x00000000, "   ", 0x00000000, 0x00000001
131
132	# ***** ADD 8-bit dst, 16-bit src *****
133	test1	add, ".b0", ".w0", 0x10000000, ".w0", 0x00000000, 0x00000000
134	test1	adc, ".b0", ".w0", 0x02000000, ".w0", 0x00000000, 0x00000000
135	test1	adc, ".b0", ".w0", 0x00030001, ".w0", 0x000000ff, 0x00000000
136	test1	adc, ".b0", ".w0", 0x00004010, ".w0", 0x000000fe, 0x0000000f
137	test1	adc, ".b0", ".w0", 0x00000021, ".w0", 0x0000001e, 0x00000040
138	test1	adc, ".b0", ".w0", 0x00000001, ".w0", 0x000000ff, 0x00000000
139	test1	add, ".b0", ".w0", 0x00000001, ".w0", 0x000000ff, 0x00000000
140	test1	adc, ".b0", ".w0", 0x00000010, ".w0", 0x000000fe, 0x0000000f
141	# Test when intermediate sum sets the carry.
142	test1	add, ".b0", ".w0", 0x10003100, ".w0", 0x00000000, 0x00000000
143	test1	adc, ".b0", ".w0", 0x00000000, ".w0", 0x00000000, 0x00000001
144
145	# ***** ADD 8-bit dst, 8-bit src  *****
146	test1	add, ".b0", ".b0", 0x00000210, ".b0", 0x00000130, 0x00000040
147	test1	adc, ".b0", ".b0", 0x00000000, ".b0", 0x00000000, 0x00000000
148	test1	adc, ".b0", ".b0", 0x00000001, ".b0", 0xffffffff, 0x00000000
149	test1	adc, ".b0", ".b0", 0x00000010, ".b0", 0xfffffffe, 0x0000000f
150	test1	adc, ".b0", ".b0", 0x00000010, ".b0", 0x0000000e, 0x0000001f
151	test1	adc, ".b0", ".b0", 0x00000001, ".b0", 0xfff0ffff, 0x00000000
152	test1	add, ".b0", ".b0", 0x00000001, ".b0", 0xfff0ffff, 0x00000000
153	test1	adc, ".b0", ".b0", 0x00000010, ".b0", 0xfff1fffe, 0x0000000f
154
155	# ***** SUB 32-bit dst, 32-bit src *****
156	# {sub, clear borrow}
157	test1	sub, "   ", "   ", 0x00000000, "   ", 0x00000000, 0x00000000
158	# {sub with borrow=0, clear borrow}
159	test1	suc, "   ", "   ", 0x00000010, "   ", 0x00000001, 0x0000000f
160	# {sub with borrow=0, set borrow}
161	test1	suc, "   ", "   ", 0x00000008, "   ", 0x00000009, 0xffffffff
162	# {sub with borrow=1, set borrow}
163	test1	suc, "   ", "   ", 0x00000008, "   ", 0x00000009, 0xfffffffe
164	# {sub with borrow=1, clear borrow}
165	test1	suc, "   ", "   ", 0x00000008, "   ", 0x00000001, 0x00000006
166	# {sub with borrow=0, set borrow}
167	test1	suc, "   ", "   ", 0x80000000, "   ", 0x90000000, 0xf0000000
168	# {sub, set borrow}
169	test1	sub, "   ", "   ", 0x00000000, "   ", 0x00000001, 0xffffffff
170	# {sub with borrow=1, set borrow}
171	test1	suc, "   ", "   ", 0x80000000, "   ", 0x90000000, 0xefffffff
172
173	# ***** SUB 32-bit dst, 16-bit src *****
174	test1	sub, "   ", ".w0", 0x00000000, ".w0", 0x00000000, 0x00000000
175	test1	suc, "   ", ".w0", 0x00000010, ".w0", 0x00000001, 0x0000000f
176	test1	suc, "   ", ".w0", 0x00000008, ".w0", 0x00000009, 0xffffffff
177	test1	suc, "   ", ".w0", 0x00000008, ".w0", 0x00000009, 0xfffffffe
178	test1	suc, "   ", ".w0", 0x00000008, ".w0", 0x00000001, 0x00000006
179	test1	suc, "   ", ".w0", 0x00108000, ".w0", 0x00009000, 0xfffff000
180	test1	sub, "   ", ".w0", 0x00000000, ".w0", 0x00000001, 0xffffffff
181	test1	suc, "   ", ".w0", 0x00008000, ".w0", 0x00009000, 0xffffefff
182
183	# ***** SUB 32-bit dst, 8-bit src *****
184	test1	sub, "   ", ".b0", 0x00000000, ".b0", 0x00000000, 0x00000000
185	test1	suc, "   ", ".b0", 0x00000010, ".b0", 0x00000001, 0x0000000f
186	test1	suc, "   ", ".b0", 0x00000008, ".b0", 0x00000009, 0xffffffff
187	test1	suc, "   ", ".b0", 0x00000008, ".b0", 0x00000009, 0xfffffffe
188	test1	suc, "   ", ".b0", 0x00000008, ".b0", 0x00000001, 0x00000006
189	test1	suc, "   ", ".b0", 0x00108080, ".b0", 0x00009090, 0xfffffff0
190	test1	sub, "   ", ".b0", 0x00000000, ".b0", 0x00000001, 0xffffffff
191	test1	suc, "   ", ".b0", 0x00008080, ".b0", 0x00009090, 0xffffffef
192
193	# ***** SUB 16-bit dst, 32-bit src *****
194	test1	sub, ".w0", "   ", 0x00000000, "   ", 0x00000000, 0x00000000
195	test1	suc, ".w0", "   ", 0x00000010, "   ", 0x00000001, 0x0000000f
196	test1	suc, ".w0", "   ", 0x00000008, "   ", 0x00000009, 0x0000ffff
197	test1	suc, ".w0", "   ", 0x00000008, "   ", 0x00000009, 0x0000fffe
198	test1	suc, ".w0", "   ", 0x00000008, "   ", 0x00000001, 0x00000006
199	test1	suc, ".w0", "   ", 0x00108000, "   ", 0x00009000, 0x0000f000
200	test1	sub, ".w0", "   ", 0x00000000, "   ", 0x00000001, 0x0000ffff
201	test1	suc, ".w0", "   ", 0x00008000, "   ", 0x00009000, 0x0000efff
202	# Test when intermediate value sets the borrow.
203	test1	sub, ".w0", "   ", 0x00010000, "   ", 0x00000000, 0x00000000
204	test1	suc, ".w0", "   ", 0x00000002, "   ", 0x00000000, 0x00000001
205
206	# ***** SUB 16-bit dst, 16-bit src *****
207	test1	sub, ".w0", ".w0", 0x00000000, ".w0", 0x00000000, 0x00000000
208	test1	suc, ".w0", ".w0", 0x00000010, ".w0", 0x00000001, 0x0000000f
209	test1	suc, ".w0", ".w0", 0x00000008, ".w0", 0x00000009, 0x0000ffff
210	test1	suc, ".w0", ".w0", 0x00000008, ".w0", 0x00000009, 0x0000fffe
211	test1	suc, ".w0", ".w0", 0x00000008, ".w0", 0x00000001, 0x00000006
212	test1	suc, ".w0", ".w0", 0x00108000, ".w0", 0x00009000, 0x0000f000
213	test1	sub, ".w0", ".w0", 0x00000000, ".w0", 0x00000001, 0x0000ffff
214	test1	suc, ".w0", ".w0", 0x00008000, ".w0", 0x00009000, 0x0000efff
215
216	# ***** SUB 16-bit dst, 8-bit src *****
217	test1	sub, ".w0", ".b0", 0x00000000, ".b0", 0x00000000, 0x00000000
218	test1	suc, ".w0", ".b0", 0x00000010, ".b0", 0x00000001, 0x0000000f
219	test1	suc, ".w0", ".b0", 0x00000008, ".b0", 0x00000009, 0x0000ffff
220	test1	suc, ".w0", ".b0", 0x00000008, ".b0", 0x00000009, 0x0000fffe
221	test1	suc, ".w0", ".b0", 0x00000008, ".b0", 0x00000001, 0x00000006
222	test1	suc, ".w0", ".b0", 0x00108080, ".b0", 0x00009090, 0x0000fff0
223	test1	sub, ".w0", ".b0", 0x00000000, ".b0", 0x00000001, 0x0000ffff
224	test1	suc, ".w0", ".b0", 0x0000a080, ".b0", 0x0000c090, 0x0000ffef
225
226	# ***** SUB 8-bit dst, 32-bit src *****
227	test1	sub, ".b0", "   ", 0x00000000, "   ", 0x00000000, 0x00000000
228	test1	suc, ".b0", "   ", 0x00000010, "   ", 0x00000001, 0x0000000f
229	test1	suc, ".b0", "   ", 0x00000008, "   ", 0x00000009, 0x000000ff
230	test1	suc, ".b0", "   ", 0x00000008, "   ", 0x00000009, 0x000000fe
231	test1	suc, ".b0", "   ", 0x00000008, "   ", 0x00000001, 0x00000006
232	test1	suc, ".b0", "   ", 0x00000080, "   ", 0x00000090, 0x000000f0
233	test1	sub, ".b0", "   ", 0x00000000, "   ", 0x00000001, 0x000000ff
234	test1	suc, ".b0", "   ", 0x00000080, "   ", 0x00000090, 0x000000ef
235	# Test when intermediate value sets the borrow.
236	test1	sub, ".b0", "   ", 0x00000100, "   ", 0x00000000, 0x00000000
237	test1	suc, ".b0", "   ", 0x00000002, "   ", 0x00000000, 0x00000001
238	test1	sub, ".b0", "   ", 0x00000100, "   ", 0x00000000, 0x00000000
239	test1	rsc, ".b0", "   ", 0x00000000, "   ", 0x00000002, 0x00000001
240
241	# ***** SUB 8-bit dst, 16-bit src *****
242	test1	sub, ".b0", ".w0", 0x00000000, ".w0", 0x00000000, 0x00000000
243	test1	suc, ".b0", ".w0", 0x00000010, ".w0", 0x00000001, 0x0000000f
244	test1	suc, ".b0", ".w0", 0x00000008, ".w0", 0x00000009, 0x000000ff
245	test1	suc, ".b0", ".w0", 0x00000008, ".w0", 0x00000009, 0x000000fe
246	test1	suc, ".b0", ".w0", 0x00000008, ".w0", 0x00000001, 0x00000006
247	test1	suc, ".b0", ".w0", 0x00000080, ".w0", 0x00000090, 0x000000f0
248	test1	sub, ".b0", ".w0", 0x00000000, ".w0", 0x00000001, 0x000000ff
249	test1	suc, ".b0", ".w0", 0x00000080, ".w0", 0x00000090, 0x000000ef
250	# Test when intermediate value sets the borrow.
251	test1	sub, ".b0", ".w0", 0x00000100, ".w0", 0x00000000, 0x00000000
252	test1	suc, ".b0", ".w0", 0x00000002, ".w0", 0x00000000, 0x00000001
253	test1	sub, ".b0", ".w0", 0x00000100, ".w0", 0x00000000, 0x00000000
254	test1	rsc, ".b0", ".w0", 0x00000000, ".w0", 0x00000002, 0x00000001
255
256	# ***** SUB 8-bit dst, 8-bit src *****
257	test1	sub, ".b0", ".w0", 0x00000000, ".w0", 0x00000000, 0x00000000
258	test1	suc, ".b0", ".w0", 0x00000010, ".w0", 0x00000001, 0x0000000f
259	test1	suc, ".b0", ".w0", 0x00000008, ".w0", 0x00000009, 0x000000ff
260	test1	suc, ".b0", ".w0", 0x00000008, ".w0", 0x00000009, 0x000000fe
261	test1	suc, ".b0", ".w0", 0x00000008, ".w0", 0x00000001, 0x00000006
262	test1	suc, ".b0", ".w0", 0x00000080, ".w0", 0x00000090, 0x000000f0
263	test1	sub, ".b0", ".w0", 0x00000000, ".w0", 0x00000001, 0x000000ff
264	test1	suc, ".b0", ".w0", 0x00000080, ".w0", 0x00000090, 0x000000ef
265
266	# ***** Reverse SUB 32-bit dst, 32-bit src *****
267	# {rsb, clear borrow}
268	test1	rsb, "   ", "   ", 0x00000000, "   ", 0x00000000, 0x00000000
269	# {rsb with borrow=0, clear borrow}
270	test1	rsc, "   ", "   ", 0x00000001, "   ", 0x00000010, 0x0000000f
271	# {rsb with borrow=0, set borrow}
272	test1	rsc, "   ", "   ", 0x00000009, "   ", 0x00000008, 0xffffffff
273	# {rsb with borrow=1, set borrow}
274	test1	rsc, "   ", "   ", 0x00000009, "   ", 0x00000008, 0xfffffffe
275	# {rsb with borrow=1, clear borrow}
276	test1	rsc, "   ", "   ", 0x00000001, "   ", 0x00000008, 0x00000006
277	# {rsb with borrow=0, set borrow}
278	test1	rsc, "   ", "   ", 0x90000000, "   ", 0x80000000, 0xf0000000
279	# {rsb, set borrow}
280	test1	rsb, "   ", "   ", 0x00000001, "   ", 0x00000000, 0xffffffff
281	# {rsb with borrow=1, set borrow}
282	test1	rsc, "   ", "   ", 0x90000000, "   ", 0x80000000, 0xefffffff
283
284	# ***** Reverse SUB 32-bit dst, 16-bit src *****
285	test1	rsb, "   ", ".w0", 0x00000000, ".w0", 0x00000000, 0x00000000
286	test1	rsc, "   ", ".w0", 0x00000001, ".w0", 0x00000010, 0x0000000f
287	test1	rsc, "   ", ".w0", 0x00000009, ".w0", 0x00000008, 0xffffffff
288	test1	rsc, "   ", ".w0", 0x00000009, ".w0", 0x00000008, 0xfffffffe
289	test1	rsc, "   ", ".w0", 0x00000001, ".w0", 0x00000008, 0x00000006
290	test1	rsc, "   ", ".w0", 0x00109000, ".w0", 0x00008000, 0xfffff000
291	test1	rsb, "   ", ".w0", 0x00000001, ".w0", 0x00000000, 0xffffffff
292	test1	rsc, "   ", ".w0", 0x00009000, ".w0", 0x00008000, 0xffffefff
293
294	# ***** Reverse SUB 32-bit dst, 8-bit src *****
295	test1	rsb, "   ", ".b0", 0x00000000, ".b0", 0x00000000, 0x00000000
296	test1	rsc, "   ", ".b0", 0x00000001, ".b0", 0x00000010, 0x0000000f
297	test1	rsc, "   ", ".b0", 0x00000009, ".b0", 0x00000008, 0xffffffff
298	test1	rsc, "   ", ".b0", 0x00000009, ".b0", 0x00000008, 0xfffffffe
299	test1	rsc, "   ", ".b0", 0x00000001, ".b0", 0x00000008, 0x00000006
300	test1	rsc, "   ", ".b0", 0x00108090, ".b0", 0x00009080, 0xfffffff0
301	test1	rsb, "   ", ".b0", 0x00000001, ".b0", 0x00000000, 0xffffffff
302	test1	rsc, "   ", ".b0", 0x00008090, ".b0", 0x00009080, 0xffffffef
303
304	# ***** Reverse SUB 16-bit dst, 32-bit src *****
305	test1	rsb, ".w0", "   ", 0x00000000, "   ", 0x00000000, 0x00000000
306	test1	rsc, ".w0", "   ", 0x00000001, "   ", 0x00000010, 0x0000000f
307	test1	rsc, ".w0", "   ", 0x00000009, "   ", 0x00000008, 0x0000ffff
308	test1	rsc, ".w0", "   ", 0x00000009, "   ", 0x00000008, 0x0000fffe
309	test1	rsc, ".w0", "   ", 0x00000001, "   ", 0x00000008, 0x00000006
310	test1	rsc, ".w0", "   ", 0x00109000, "   ", 0x00008000, 0x0000f000
311	test1	rsb, ".w0", "   ", 0x00000001, "   ", 0x00000000, 0x0000ffff
312	test1	rsc, ".w0", "   ", 0x00009000, "   ", 0x00008000, 0x0000efff
313	# Test when intermediate value sets the borrow.
314	test1	rsb, ".w0", "   ", 0x00000000, "   ", 0x00010000, 0x00000000
315	test1	rsc, ".w0", "   ", 0x00000000, "   ", 0x00000002, 0x00000001
316
317	# ***** Reverse SUB 16-bit dst, 16-bit src *****
318	test1	rsb, ".w0", ".w0", 0x00000000, ".w0", 0x00000000, 0x00000000
319	test1	rsc, ".w0", ".w0", 0x00000001, ".w0", 0x00000010, 0x0000000f
320	test1	rsc, ".w0", ".w0", 0x00000009, ".w0", 0x00000008, 0x0000ffff
321	test1	rsc, ".w0", ".w0", 0x00000009, ".w0", 0x00000008, 0x0000fffe
322	test1	rsc, ".w0", ".w0", 0x00000001, ".w0", 0x00000008, 0x00000006
323	test1	rsc, ".w0", ".w0", 0x00109000, ".w0", 0x00008000, 0x0000f000
324	test1	rsb, ".w0", ".w0", 0x00000001, ".w0", 0x00000000, 0x0000ffff
325	test1	rsc, ".w0", ".w0", 0x00009000, ".w0", 0x00008000, 0x0000efff
326
327	# ***** Reverse SUB 16-bit dst, 8-bit src *****
328	test1	rsb, ".w0", ".b0", 0x00000000, ".b0", 0x00000000, 0x00000000
329	test1	rsc, ".w0", ".b0", 0x00000001, ".b0", 0x00000010, 0x0000000f
330	test1	rsc, ".w0", ".b0", 0x00000009, ".b0", 0x00000008, 0x0000ffff
331	test1	rsc, ".w0", ".b0", 0x00000009, ".b0", 0x00000008, 0x0000fffe
332	test1	rsc, ".w0", ".b0", 0x00000001, ".b0", 0x00000008, 0x00000006
333	test1	rsc, ".w0", ".b0", 0x00108090, ".b0", 0x00009080, 0x0000fff0
334	test1	rsb, ".w0", ".b0", 0x00000001, ".b0", 0x00000000, 0x0000ffff
335	test1	rsc, ".w0", ".b0", 0x0000a090, ".b0", 0x0000c080, 0x0000ffef
336
337	# ***** Reverse SUB 8-bit dst, 32-bit src *****
338	test1	rsb, ".b0", "   ", 0x00000000, "   ", 0x00000000, 0x00000000
339	test1	rsc, ".b0", "   ", 0x00000001, "   ", 0x00000010, 0x0000000f
340	test1	rsc, ".b0", "   ", 0x00000009, "   ", 0x00000008, 0x000000ff
341	test1	rsc, ".b0", "   ", 0x00000009, "   ", 0x00000008, 0x000000fe
342	test1	rsc, ".b0", "   ", 0x00000001, "   ", 0x00000008, 0x00000006
343	test1	rsc, ".b0", "   ", 0x00000090, "   ", 0x00000080, 0x000000f0
344	test1	rsb, ".b0", "   ", 0x00000001, "   ", 0x00000000, 0x000000ff
345	test1	rsc, ".b0", "   ", 0x00000090, "   ", 0x00000080, 0x000000ef
346	# Test when intermediate value sets the borrow.
347	test1	rsb, ".b0", "   ", 0x00000000, "   ", 0x00000100, 0x00000000
348	test1	rsc, ".b0", "   ", 0x00000000, "   ", 0x00000002, 0x00000001
349	test1	rsb, ".b0", "   ", 0x00000000, "   ", 0x00000100, 0x00000000
350	test1	suc, ".b0", "   ", 0x00000002, "   ", 0x00000000, 0x00000001
351
352	# ***** Reverse SUB 8-bit dst, 16-bit src *****
353	test1	rsb, ".b0", ".w0", 0x00000000, ".w0", 0x00000000, 0x00000000
354	test1	rsc, ".b0", ".w0", 0x00000001, ".w0", 0x00000010, 0x0000000f
355	test1	rsc, ".b0", ".w0", 0x00000009, ".w0", 0x00000008, 0x000000ff
356	test1	rsc, ".b0", ".w0", 0x00000009, ".w0", 0x00000008, 0x000000fe
357	test1	rsc, ".b0", ".w0", 0x00000001, ".w0", 0x00000008, 0x00000006
358	test1	rsc, ".b0", ".w0", 0x00000090, ".w0", 0x00000080, 0x000000f0
359	test1	rsb, ".b0", ".w0", 0x00000001, ".w0", 0x00000000, 0x000000ff
360	test1	rsc, ".b0", ".w0", 0x00000090, ".w0", 0x00000080, 0x000000ef
361	# Test when intermediate value sets the borrow.
362	test1	rsb, ".b0", ".w0", 0x00000000, ".w0", 0x00000100, 0x00000000
363	test1	rsc, ".b0", ".w0", 0x00000000, ".w0", 0x00000002, 0x00000001
364	test1	rsb, ".b0", ".w0", 0x00000000, ".w0", 0x00000100, 0x00000000
365	test1	suc, ".b0", ".w0", 0x00000002, ".w0", 0x00000000, 0x00000001
366
367	# ***** Reverse SUB 8-bit dst, 8-bit src *****
368	test1	rsb, ".b0", ".w0", 0x00000000, ".w0", 0x00000000, 0x00000000
369	test1	rsc, ".b0", ".w0", 0x00000001, ".w0", 0x00000010, 0x0000000f
370	test1	rsc, ".b0", ".w0", 0x00000009, ".w0", 0x00000008, 0x000000ff
371	test1	rsc, ".b0", ".w0", 0x00000009, ".w0", 0x00000008, 0x000000fe
372	test1	rsc, ".b0", ".w0", 0x00000001, ".w0", 0x00000008, 0x00000006
373	test1	rsc, ".b0", ".w0", 0x00000090, ".w0", 0x00000080, 0x000000f0
374	test1	rsb, ".b0", ".w0", 0x00000001, ".w0", 0x00000000, 0x000000ff
375	test1	rsc, ".b0", ".w0", 0x00000090, ".w0", 0x00000080, 0x000000ef
376
377	# ***** Mixed 32-bit *****
378	test1	sub, "   ", " ", 0x00000000, " ", 0x00000000, 0x00000000
379	test1	adc, "   ", " ", 0x00000000, " ", 0x00000000, 0x00000001
380	test1	suc, "   ", " ", 0x00000001, " ", 0x00000001, 0xffffffff
381	test1	adc, "   ", " ", 0x00000001, " ", 0x00000000, 0x00000001
382
383	test_seq "", "", 0xffffffff, 0x00000001, 0x00000000, 0x00000000 add, suc, add, 0x00000000
384	test_seq "", "", 0xffffffff, 0x00000001, 0x00000000, 0x00000000 add, rsc, add, 0x00000000
385	test_seq "", "", 0xfffffffe, 0x00000001, 0x00000000, 0x00000000 add, suc, add, 0xfffffffe
386	test_seq "", "", 0xffffffff, 0x00000001, 0x00000000, 0x00000000 add, suc, adc, 0x00000001
387	test_seq "", "", 0xfffffffe, 0x00000001, 0x00000000, 0x00000000 add, suc, adc, 0xffffffff
388
389	test_seq "", "", 0xffffffff, 0x00000010, 0x00000000, 0x00000000 sub, adc, add, 0xfffffff0
390	test_seq "", "", 0x0fffffff, 0x00000010, 0x00000000, 0x00000000 sub, adc, add, 0x0ffffff0
391	test_seq "", "", 0x00000000, 0x00000010, 0x00000000, 0x00000000 sub, adc, add, 0xfffffff0
392	test_seq "", "", 0x00000000, 0x00000010, 0x00000000, 0x00000000 sub, adc, adc, 0xfffffff0
393	test_seq "", "", 0x00000000, 0x00000010, 0x00000000, 0x00000000 sub, adc, suc, 0xffffffef
394
395
396	# For coverage, also test sequences of ALU instructions
397	# (i.e. no other instructions in between).
398	test_seq "", "", 0x00000000, 0x00000000, 0x00000000, 0x00000000 add, adc, adc, 0x00000000
399	test_seq "", "", 0x80000000, 0xfffffff0, 0xc0000000, 0x0000001a add, adc, adc, 0x4000000c
400	test_seq "", ".b0", 0x00000000, 0x00000001, 0x000000ff, 0x00000000 add, adc, adc, 0x00000001
401	test_seq "", ".b0", 0x00000000, 0x00000001, 0x000000ff, 0x00000000 add, adc, adc, 0x00000001
402	test_seq ".b0", ".b0", 0x00000000, 0x00000001, 0x00000000, 0x0000ffff add, adc, adc, 0x00000000
403	test_seq ".b0", ".w0", 0x00000001, 0x00000020, 0x00000400, 0x00008000 add, adc, adc, 0x00000021
404	test_seq "", "", 0x00000010, 0x0000000f, 0x00000002, 0x00000020 sub, suc, suc, 0xffffffde
405	test_seq "", ".b0", 0x00000202, 0x00000000, 0x00000000, 0x00000000 sub, suc, suc, 0x00000002
406	test_seq ".w0", ".b0", 0x00000008, 0x00000000, 0x00000000, 0x00000000, sub, suc, suc, 0x00000008
407	test_seq ".w0", ".b0", 0x00000008, 0x000000ff, 0x000000ff, 0x000000ff, sub, suc, suc, 0x00000009
408	test_seq ".w0", ".b0", 0x00000008, 0x00000fff, 0x00000fff, 0x00000fff, sub, suc, suc, 0x0000000b
409	test_seq "", "", 0x0000000f, 0x00000010, 0x00000002, 0x00000020 rsb, suc, suc, 0xffffffde
410	test_seq "", "", 0xffffffff, 0x00000001, 0x00000000, 0x00000000 add, suc, adc, 0x00000001
411	test_seq "", "", 0x00000000, 0x00000010, 0x00000000, 0x00000000 sub, adc, adc, 0xfffffff0
412	test_seq "", "", 0x00000000, 0x00000010, 0x00000000, 0x00000000 sub, adc, suc, 0xffffffef
413
414	pass
415EXIT_FAIL:
416	fail
417