xref: /netbsd-src/external/gpl3/gdb/dist/sim/testsuite/or1k/div.S (revision 2f62cc9c12bc202c40224f32c879f81443fee079)
1/* Tests the divide instructions.
2
3   Copyright (C) 2017-2023 Free Software Foundation, Inc.
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# mach: or1k
19# output: report(0x0000000c);\n
20# output: report(0x00000003);\n
21# output: report(0x00000004);\n
22# output: report(0x00000000);\n
23# output: report(0x00000000);\n
24# output: report(0x00000000);\n
25# output: \n
26# output: report(0x0000000b);\n
27# output: report(0x00000003);\n
28# output: report(0x00000003);\n
29# output: report(0x00000000);\n
30# output: report(0x00000000);\n
31# output: report(0x00000000);\n
32# output: \n
33# output: report(0xfffffff4);\n
34# output: report(0xfffffffd);\n
35# output: report(0x00000004);\n
36# output: report(0x00000000);\n
37# output: report(0x00000000);\n
38# output: report(0x00000000);\n
39# output: \n
40# output: report(0xfffffff5);\n
41# output: report(0xfffffffd);\n
42# output: report(0x00000003);\n
43# output: report(0x00000000);\n
44# output: report(0x00000000);\n
45# output: report(0x00000000);\n
46# output: \n
47# output: report(0xfffffff4);\n
48# output: report(0x00000003);\n
49# output: report(0xfffffffc);\n
50# output: report(0x00000000);\n
51# output: report(0x00000000);\n
52# output: report(0x00000000);\n
53# output: \n
54# output: report(0xfffffff5);\n
55# output: report(0x00000003);\n
56# output: report(0xfffffffd);\n
57# output: report(0x00000000);\n
58# output: report(0x00000000);\n
59# output: report(0x00000000);\n
60# output: \n
61# output: report(0x0000000c);\n
62# output: report(0xfffffffd);\n
63# output: report(0xfffffffc);\n
64# output: report(0x00000000);\n
65# output: report(0x00000000);\n
66# output: report(0x00000000);\n
67# output: \n
68# output: report(0x0000000b);\n
69# output: report(0xfffffffd);\n
70# output: report(0xfffffffd);\n
71# output: report(0x00000000);\n
72# output: report(0x00000000);\n
73# output: report(0x00000000);\n
74# output: \n
75# output: report(0x0000000c);\n
76# output: report(0x00000000);\n
77# output: report(0xfffffffd);\n
78# output: report(0x00000000);\n
79# output: report(0x00000001);\n
80# output: report(0x00000000);\n
81# output: \n
82# output: report(0xfffffff4);\n
83# output: report(0x00000000);\n
84# output: report(0xfffffffd);\n
85# output: report(0x00000000);\n
86# output: report(0x00000001);\n
87# output: report(0x00000000);\n
88# output: \n
89# output: report(0x0000000c);\n
90# output: report(0x00000000);\n
91# output: report(0xfffffffd);\n
92# output: report(0x00000000);\n
93# output: report(0x00000001);\n
94# output: report(0x00000001);\n
95# output: \n
96# output: report(0xfffffff4);\n
97# output: report(0x00000000);\n
98# output: report(0xfffffffd);\n
99# output: report(0x00000000);\n
100# output: report(0x00000001);\n
101# output: report(0x00000001);\n
102# output: \n
103# output: report(0x0000000c);\n
104# output: report(0x00000003);\n
105# output: report(0x00000004);\n
106# output: report(0x00000000);\n
107# output: report(0x00000000);\n
108# output: report(0x00000000);\n
109# output: \n
110# output: report(0x0000000b);\n
111# output: report(0x00000003);\n
112# output: report(0x00000003);\n
113# output: report(0x00000000);\n
114# output: report(0x00000000);\n
115# output: report(0x00000000);\n
116# output: \n
117# output: report(0xfffffff4);\n
118# output: report(0xfffffffd);\n
119# output: report(0x00000000);\n
120# output: report(0x00000000);\n
121# output: report(0x00000000);\n
122# output: report(0x00000000);\n
123# output: \n
124# output: report(0xfffffff5);\n
125# output: report(0xfffffffd);\n
126# output: report(0x00000000);\n
127# output: report(0x00000000);\n
128# output: report(0x00000000);\n
129# output: report(0x00000000);\n
130# output: \n
131# output: report(0xfffffff4);\n
132# output: report(0x00000003);\n
133# output: report(0x55555551);\n
134# output: report(0x00000000);\n
135# output: report(0x00000000);\n
136# output: report(0x00000000);\n
137# output: \n
138# output: report(0xfffffff5);\n
139# output: report(0x00000003);\n
140# output: report(0x55555551);\n
141# output: report(0x00000000);\n
142# output: report(0x00000000);\n
143# output: report(0x00000000);\n
144# output: \n
145# output: report(0x0000000c);\n
146# output: report(0xfffffffd);\n
147# output: report(0x00000000);\n
148# output: report(0x00000000);\n
149# output: report(0x00000000);\n
150# output: report(0x00000000);\n
151# output: \n
152# output: report(0x0000000b);\n
153# output: report(0xfffffffd);\n
154# output: report(0x00000000);\n
155# output: report(0x00000000);\n
156# output: report(0x00000000);\n
157# output: report(0x00000000);\n
158# output: \n
159# output: report(0x0000000c);\n
160# output: report(0x00000000);\n
161# output: report(0x00000000);\n
162# output: report(0x00000001);\n
163# output: report(0x00000000);\n
164# output: report(0x00000000);\n
165# output: \n
166# output: report(0xfffffff4);\n
167# output: report(0x00000000);\n
168# output: report(0x00000000);\n
169# output: report(0x00000001);\n
170# output: report(0x00000000);\n
171# output: report(0x00000000);\n
172# output: \n
173# output: report(0x0000000c);\n
174# output: report(0x00000000);\n
175# output: report(0x00000000);\n
176# output: report(0x00000001);\n
177# output: report(0x00000000);\n
178# output: report(0x00000001);\n
179# output: \n
180# output: report(0xfffffff4);\n
181# output: report(0x00000000);\n
182# output: report(0x00000000);\n
183# output: report(0x00000001);\n
184# output: report(0x00000000);\n
185# output: report(0x00000001);\n
186# output: \n
187# output: exit(0)\n
188
189#include "or1k-asm-test-helpers.h"
190
191	STANDARD_TEST_ENVIRONMENT
192
193	.section .exception_vectors
194
195	/* Range exception.  */
196	.org	0xb00
197
198	l.addi r1, r1, -EXCEPTION_STACK_SKIP_SIZE
199	PUSH r2
200	PUSH r3
201	/* Save the address of the instruction that caused the problem.  */
202	MOVE_FROM_SPR r2, SPR_EPCR_BASE
203	LOAD_IMMEDIATE r3, 0x15000000 /* Opcode for l.nop  */
204	l.sw	0(r2), r3
205	POP r3
206	POP r2
207	l.addi r1, r1, EXCEPTION_STACK_SKIP_SIZE
208	l.rfe
209
210	.section .text
211start_tests:
212	PUSH LINK_REGISTER_R9
213
214	/* Test l.div  */
215
216	/* Divide two positive numbers and check rounding.  Should set no
217	   flags.  */
218	TEST_INST_I32_I32 l.div, 0x0000000c, 0x00000003 /* 12 / 3 = 4  */
219	TEST_INST_I32_I32 l.div, 0x0000000b, 0x00000003 /* 11 / 3 = 3  */
220
221	/* Divide two negative numbers and check rounding.  Should set no
222	   flags.  */
223	TEST_INST_I32_I32 l.div, 0xfffffff4, 0xfffffffd
224	TEST_INST_I32_I32 l.div, 0xfffffff5, 0xfffffffd
225
226	/* Divide a negative number by a positive number and check
227	   rounding.  Should set no flags.  */
228	TEST_INST_I32_I32 l.div, 0xfffffff4, 0x00000003
229	TEST_INST_I32_I32 l.div, 0xfffffff5, 0x00000003
230
231	/* Divide a positive number by a negative number and check
232	   rounding.  Should set no flags.  */
233	TEST_INST_I32_I32 l.div, 0x0000000c, 0xfffffffd
234	TEST_INST_I32_I32 l.div, 0x0000000b, 0xfffffffd
235
236	/* Divide by zero.  This will set the overflow flag.  */
237	TEST_INST_I32_I32 l.div, 0x0000000c, 0x00000000
238	TEST_INST_I32_I32 l.div, 0xfffffff4, 0x00000000
239
240	/* Check that range exceptions are triggered.  */
241
242	SET_SPR_SR_FLAGS SPR_SR_OVE, r2, r3
243
244	/* Divide by zero.  This will set the overflow flag and trigger an
245	   exception.  */
246	TEST_INST_I32_I32 l.div, 0x0000000c, 0x00000000
247	TEST_INST_I32_I32 l.div, 0xfffffff4, 0x00000000
248
249	CLEAR_SPR_SR_FLAGS SPR_SR_OVE, r2, r3
250
251	/* Test l.divu  */
252
253	/* Divide two positive numbers and check rounding.  Should set no
254	   flags.  */
255	TEST_INST_I32_I32 l.divu, 0x0000000c, 0x00000003
256	TEST_INST_I32_I32 l.divu, 0x0000000b, 0x00000003
257
258	/* Divide two numbers that would be negative under 2's complement
259	   and check rounding.  Should set no flags.  */
260	TEST_INST_I32_I32 l.divu, 0xfffffff4, 0xfffffffd
261	TEST_INST_I32_I32 l.divu, 0xfffffff5, 0xfffffffd
262
263	/* Divide a number that would be negative under 2's complement by a
264	   number that would be positive under 2's complement and check
265	   rounding.  This should set no flags.  */
266	TEST_INST_I32_I32 l.divu, 0xfffffff4, 0x00000003
267	TEST_INST_I32_I32 l.divu, 0xfffffff5, 0x00000003
268
269	/* Divide a number that would be positive under 2's complement by a
270	   number that would be negative under 2's complement and check
271	   rounding.  This should set no flags.  */
272	TEST_INST_I32_I32 l.divu, 0x0000000c, 0xfffffffd
273	TEST_INST_I32_I32 l.divu, 0x0000000b, 0xfffffffd
274
275	/* Divide by zero.  This will set the carry flag.  */
276	TEST_INST_I32_I32 l.divu, 0x0000000c, 0x00000000
277	TEST_INST_I32_I32 l.divu, 0xfffffff4, 0x00000000
278
279	/* Check that range exceptions are triggered.  */
280
281	SET_SPR_SR_FLAGS SPR_SR_OVE, r2, r3
282
283	/* Divide by zero.  This will set the carry flag and trigger an
284	   exception.  */
285	TEST_INST_I32_I32 l.divu, 0x0000000c, 0x00000000
286	TEST_INST_I32_I32 l.divu, 0xfffffff4, 0x00000000
287
288	CLEAR_SPR_SR_FLAGS SPR_SR_OVE, r2, r3
289
290	POP LINK_REGISTER_R9
291	RETURN_TO_LINK_REGISTER_R9
292