1/* Tests the set flag (l.sf*) 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: exit(0)\n
20
21#include "or1k-asm-test-helpers.h"
22
23#define INT_MAX		2147483647 /* 0x7fffffff  */
24#define INT_MAX_MIN1	2147483646 /* 0x7ffffffe  */
25#define NEG_INT_MAX	-2147483648 /* 0x80000000  */
26#define NEG_INT_MAX_PL1	-2147483647 /* 0x80000001  */
27#define MIN1		-1 /* 0xffffffff  */
28
29#define SHRT_MIN	(-32768)
30#define SHRT_MAX	32767
31
32#define UINT_MAX	4294967295 /* 0xffffffff  */
33#define UINT_MAX_MIN1	4294967294 /* 0xfffffffe  */
34
35#define USHRT_MAX	65535
36
37	.macro MOVE_TO_R4_R5_AND_REPORT a, b
38	LOAD_IMMEDIATE r4, \a
39	LOAD_IMMEDIATE r5, \b
40
41	/* During development, add REPORT_xxx statements here to see the
42	   operands.  */
43	.endm
44
45	.macro MOVE_TO_R4_AND_REPORT_I a, b
46	LOAD_IMMEDIATE r4, \a
47
48	/* During development, add REPORT_xxx statements here to see the
49	   operands.  */
50	.endm
51
52	.macro SHOULD_BE_SET
53	OR1K_DELAYED_NOP (l.bnf  failed)
54	.endm
55
56	.macro SHOULDNT_BE_SET
57	OR1K_DELAYED_NOP (l.bf    failed)
58	.endm
59
60	.macro SHOULD_BE_LESS_THAN_SIGNED a, b
61	MOVE_TO_R4_R5_AND_REPORT \a , \b
62
63	l.sfeq  r4, r5
64	SHOULDNT_BE_SET
65	l.sfne  r4, r5
66	SHOULD_BE_SET
67	l.sfgts r4, r5
68	SHOULDNT_BE_SET
69	l.sfges r4, r5
70	SHOULDNT_BE_SET
71	l.sfles r4, r5
72	SHOULD_BE_SET
73	l.sflts r4, r5
74	SHOULD_BE_SET
75	.endm
76
77	.macro SHOULD_BE_GREATER_THAN_SIGNED a, b
78	MOVE_TO_R4_R5_AND_REPORT \a , \b
79
80	l.sfeq  r4, r5
81	SHOULDNT_BE_SET
82	l.sfne  r4, r5
83	SHOULD_BE_SET
84	l.sfgts r4, r5
85	SHOULD_BE_SET
86	l.sfges r4, r5
87	SHOULD_BE_SET
88	l.sfles r4, r5
89	SHOULDNT_BE_SET
90	l.sflts r4, r5
91	SHOULDNT_BE_SET
92	.endm
93
94	.macro SHOULD_BE_LESS_THAN_UNSIGNED a, b
95	MOVE_TO_R4_R5_AND_REPORT \a , \b
96
97	l.sfeq  r4, r5
98	SHOULDNT_BE_SET
99	l.sfne  r4, r5
100	SHOULD_BE_SET
101	l.sfgtu r4, r5
102	SHOULDNT_BE_SET
103	l.sfgeu r4, r5
104	SHOULDNT_BE_SET
105	l.sfleu r4, r5
106	SHOULD_BE_SET
107	l.sfltu r4, r5
108	SHOULD_BE_SET
109	.endm
110
111	.macro SHOULD_BE_GREATER_THAN_UNSIGNED a, b
112	MOVE_TO_R4_R5_AND_REPORT \a , \b
113
114	l.sfeq  r4, r5
115	SHOULDNT_BE_SET
116	l.sfne  r4, r5
117	SHOULD_BE_SET
118	l.sfgtu r4, r5
119	SHOULD_BE_SET
120	l.sfgeu r4, r5
121	SHOULD_BE_SET
122	l.sfleu r4, r5
123	SHOULDNT_BE_SET
124	l.sfltu r4, r5
125	SHOULDNT_BE_SET
126	.endm
127
128	.macro SHOULD_BE_EQUAL a, b
129	MOVE_TO_R4_R5_AND_REPORT \a , \b
130
131	l.sfeq  r4, r5
132	SHOULD_BE_SET
133	l.sfne  r4, r5
134	SHOULDNT_BE_SET
135
136	/* Signed tests.  */
137	l.sfgts r4, r5
138	SHOULDNT_BE_SET
139	l.sfges r4, r5
140	SHOULD_BE_SET
141	l.sfles r4, r5
142	SHOULD_BE_SET
143	l.sflts r4, r5
144	SHOULDNT_BE_SET
145
146	/* Unsigned tests.  */
147	l.sfgtu r4, r5
148	SHOULDNT_BE_SET
149	l.sfgeu r4, r5
150	SHOULD_BE_SET
151	l.sfleu r4, r5
152	SHOULD_BE_SET
153	l.sfltu r4, r5
154	SHOULDNT_BE_SET
155	.endm
156
157	.macro SHOULDNT_BE_EQUAL a, b
158	MOVE_TO_R4_R5_AND_REPORT \a , \b
159
160	l.sfeq  r4, r5
161	SHOULDNT_BE_SET
162	l.sfne  r4, r5
163	SHOULD_BE_SET
164	.endm
165
166	.macro SHOULD_BE_EQUAL_I a, b
167	MOVE_TO_R4_AND_REPORT_I \a, \b
168
169	l.sfeqi  r4, \b
170	SHOULD_BE_SET
171	l.sfnei  r4, \b
172	SHOULDNT_BE_SET
173
174	/* Signed tests.  */
175	l.sfgtsi r4, \b
176	SHOULDNT_BE_SET
177	l.sfgesi r4, \b
178	SHOULD_BE_SET
179	l.sflesi r4, \b
180	SHOULD_BE_SET
181	l.sfltsi r4, \b
182	SHOULDNT_BE_SET
183
184	/* Unsigned tests.  */
185	l.sfgtui r4, \b
186	SHOULDNT_BE_SET
187	l.sfgeui r4, \b
188	SHOULD_BE_SET
189	l.sfleui r4, \b
190	SHOULD_BE_SET
191	l.sfltui r4, \b
192	SHOULDNT_BE_SET
193	.endm
194
195	.macro SHOULDNT_BE_EQUAL_I a, b
196	MOVE_TO_R4_AND_REPORT_I \a, \b
197
198	l.sfeqi  r4, \b
199	SHOULDNT_BE_SET
200	l.sfnei  r4, \b
201	SHOULD_BE_SET
202	.endm
203
204	.macro SHOULD_BE_LESS_THAN_SIGNED_I a, b
205	MOVE_TO_R4_AND_REPORT_I \a, \b
206
207	l.sfeqi  r4, \b
208	SHOULDNT_BE_SET
209	l.sfnei  r4, \b
210	SHOULD_BE_SET
211	l.sfgtsi r4, \b
212	SHOULDNT_BE_SET
213	l.sfgesi r4, \b
214	SHOULDNT_BE_SET
215	l.sflesi r4, \b
216	SHOULD_BE_SET
217	l.sfltsi r4, \b
218	SHOULD_BE_SET
219	.endm
220
221	.macro SHOULD_BE_GREATER_THAN_SIGNED_I a, b
222	MOVE_TO_R4_AND_REPORT_I \a, \b
223
224	l.sfeqi  r4, \b
225	SHOULDNT_BE_SET
226	l.sfnei  r4, \b
227	SHOULD_BE_SET
228	l.sfgtsi r4, \b
229	SHOULD_BE_SET
230	l.sfgesi r4, \b
231	SHOULD_BE_SET
232	l.sflesi r4, \b
233	SHOULDNT_BE_SET
234	l.sfltsi r4, \b
235	SHOULDNT_BE_SET
236	.endm
237
238	.macro SHOULD_BE_LESS_THAN_UNSIGNED_I a, b
239	MOVE_TO_R4_AND_REPORT_I \a, \b
240
241	l.sfeqi  r4, \b
242	SHOULDNT_BE_SET
243	l.sfnei  r4, \b
244	SHOULD_BE_SET
245	l.sfgtui r4, \b
246	SHOULDNT_BE_SET
247	l.sfgeui r4, \b
248	SHOULDNT_BE_SET
249	l.sfleui r4, \b
250	SHOULD_BE_SET
251	l.sfltui r4, \b
252	SHOULD_BE_SET
253	.endm
254
255	.macro SHOULD_BE_GREATER_THAN_UNSIGNED_I a, b
256	MOVE_TO_R4_AND_REPORT_I \a, \b
257
258	l.sfeqi  r4, \b
259	SHOULDNT_BE_SET
260	l.sfnei  r4, \b
261	SHOULD_BE_SET
262	l.sfgtui r4, \b
263	SHOULD_BE_SET
264	l.sfgeui r4, \b
265	SHOULD_BE_SET
266	l.sfleui r4, \b
267	SHOULDNT_BE_SET
268	l.sfltui r4, \b
269	SHOULDNT_BE_SET
270	.endm
271
272	STANDARD_TEST_ENVIRONMENT
273
274	.section .text
275start_tests:
276	PUSH LINK_REGISTER_R9
277
278	/* Signed tests  */
279
280	SHOULD_BE_LESS_THAN_SIGNED 0, 1
281	SHOULD_BE_LESS_THAN_SIGNED MIN1, 0
282	SHOULD_BE_LESS_THAN_SIGNED INT_MAX_MIN1, INT_MAX
283	SHOULD_BE_LESS_THAN_SIGNED NEG_INT_MAX, INT_MAX
284	SHOULD_BE_LESS_THAN_SIGNED NEG_INT_MAX, INT_MAX_MIN1
285	SHOULD_BE_LESS_THAN_SIGNED NEG_INT_MAX_PL1, INT_MAX
286	SHOULD_BE_LESS_THAN_SIGNED NEG_INT_MAX_PL1, INT_MAX_MIN1
287	SHOULD_BE_LESS_THAN_SIGNED -7, -6
288	SHOULD_BE_LESS_THAN_SIGNED NEG_INT_MAX, NEG_INT_MAX_PL1
289	SHOULD_BE_LESS_THAN_SIGNED NEG_INT_MAX, MIN1
290	SHOULD_BE_LESS_THAN_SIGNED NEG_INT_MAX, 0
291
292	SHOULD_BE_GREATER_THAN_SIGNED 1, 0
293	SHOULD_BE_GREATER_THAN_SIGNED 0, MIN1
294	SHOULD_BE_GREATER_THAN_SIGNED INT_MAX, INT_MAX_MIN1
295	SHOULD_BE_GREATER_THAN_SIGNED INT_MAX, NEG_INT_MAX
296	SHOULD_BE_GREATER_THAN_SIGNED INT_MAX_MIN1, NEG_INT_MAX
297	SHOULD_BE_GREATER_THAN_SIGNED INT_MAX, NEG_INT_MAX_PL1
298	SHOULD_BE_GREATER_THAN_SIGNED INT_MAX_MIN1, NEG_INT_MAX_PL1
299	SHOULD_BE_GREATER_THAN_SIGNED -6, -7
300	SHOULD_BE_GREATER_THAN_SIGNED NEG_INT_MAX_PL1, NEG_INT_MAX
301	SHOULD_BE_GREATER_THAN_SIGNED MIN1, NEG_INT_MAX
302	SHOULD_BE_GREATER_THAN_SIGNED 0, NEG_INT_MAX
303
304	/* See the immediate tests below.  */
305	SHOULD_BE_LESS_THAN_SIGNED 0xFFFF7FFF, 0xFFFF8000
306	/* See the immediate tests below.  */
307	SHOULD_BE_GREATER_THAN_SIGNED 0xFFFF8001, 0xFFFF8000
308
309	/* Signed tests, immediate  */
310
311	SHOULD_BE_LESS_THAN_SIGNED_I	0,  1
312	SHOULD_BE_LESS_THAN_SIGNED_I  -1,  0
313	SHOULD_BE_LESS_THAN_SIGNED_I  -7, -6
314
315	SHOULD_BE_GREATER_THAN_SIGNED_I 0x00008000, 0x7FFF
316	SHOULD_BE_LESS_THAN_SIGNED_I 0xFFFFFFFF, 0x7FFF
317	/* 0x8000 gets sign-extended to 0xFFFF8000.  */
318	SHOULD_BE_LESS_THAN_SIGNED_I 0xFFFF7FFF, 0x8000
319	/* 0x8000 gets sign-extended to 0xFFFF8000.  */
320	SHOULD_BE_GREATER_THAN_SIGNED_I 0xFFFF8001, 0x8000
321	/* 0x8000 gets sign-extended to 0xFFFF8000.  */
322	SHOULD_BE_GREATER_THAN_SIGNED_I 0x00008000, 0x8000
323
324	/* Unsigned tests  */
325
326	SHOULD_BE_LESS_THAN_UNSIGNED 0, 1
327	SHOULD_BE_LESS_THAN_UNSIGNED UINT_MAX_MIN1, UINT_MAX
328	SHOULD_BE_GREATER_THAN_UNSIGNED 1, 0
329	SHOULD_BE_GREATER_THAN_UNSIGNED UINT_MAX, UINT_MAX_MIN1
330	SHOULD_BE_GREATER_THAN_UNSIGNED UINT_MAX, 0
331	SHOULD_BE_GREATER_THAN_UNSIGNED 0x80000001,  0x80000000
332	SHOULD_BE_LESS_THAN_UNSIGNED 0x80000000,  0x80000001
333	SHOULD_BE_GREATER_THAN_UNSIGNED 0x80000000, 0x7fffffff
334	SHOULD_BE_LESS_THAN_UNSIGNED 0x7fffffff,  0x80000000
335	SHOULD_BE_GREATER_THAN_UNSIGNED 0x7fffffff,  0x7ffffffe
336	SHOULD_BE_LESS_THAN_UNSIGNED 0x7ffffffe,  0x7fffffff
337	SHOULD_BE_LESS_THAN_UNSIGNED 0x2024fae0,  0xfef03220
338
339	/* Unsigned tests, immediate  */
340
341	SHOULD_BE_LESS_THAN_UNSIGNED_I 0, 1
342	SHOULD_BE_GREATER_THAN_UNSIGNED_I 1, 0
343	SHOULD_BE_LESS_THAN_UNSIGNED_I	 SHRT_MAX - 1, SHRT_MAX
344	SHOULD_BE_GREATER_THAN_UNSIGNED_I SHRT_MAX	 , SHRT_MAX - 1
345
346	/* The sign extension produces unexpected results here.  */
347
348	/* 0xFFFF gets sign-extended to 0xFFFFFFFF.  */
349	SHOULD_BE_LESS_THAN_UNSIGNED_I 0xFFFFFFFF - 1, 0xFFFF
350	/* 0x8000 gets sign-extended to 0xFFFF8000.  */
351	SHOULD_BE_LESS_THAN_UNSIGNED_I 0xFFFF7FFF, 0x8000
352
353	/* Equal tests.  */
354
355	SHOULD_BE_EQUAL 0, 0
356	SHOULD_BE_EQUAL UINT_MAX, UINT_MAX
357	SHOULD_BE_EQUAL MIN1, UINT_MAX
358	SHOULD_BE_EQUAL INT_MAX, INT_MAX
359	SHOULD_BE_EQUAL NEG_INT_MAX, NEG_INT_MAX
360
361	/* Equal tests, immediate.  Test the 16-to-32-bit sign extension.  */
362
363	SHOULD_BE_EQUAL_I 0, 0
364	SHOULD_BE_EQUAL_I 0x00007FFF, 0x7FFF
365	SHOULD_BE_EQUAL_I 0xFFFF8000, 0x8000
366	SHOULD_BE_EQUAL_I 0xFFFFFFFF, 0xFFFF
367
368	/* Non-equal tests.  */
369
370	SHOULDNT_BE_EQUAL 0, 1
371	SHOULDNT_BE_EQUAL UINT_MAX, INT_MAX
372	SHOULDNT_BE_EQUAL UINT_MAX, NEG_INT_MAX
373	SHOULDNT_BE_EQUAL MIN1, NEG_INT_MAX_PL1
374	SHOULDNT_BE_EQUAL INT_MAX, NEG_INT_MAX
375	SHOULDNT_BE_EQUAL NEG_INT_MAX_PL1, UINT_MAX_MIN1
376
377	/* Non-equal tests, immediate.  Test the 16-to-32-bit sign
378	   extension.  */
379
380	SHOULDNT_BE_EQUAL_I 0x00008000, 0x8000
381
382	POP LINK_REGISTER_R9
383	RETURN_TO_LINK_REGISTER_R9
384
385failed:
386	EXIT_SIMULATION_WITH_IMMEDIATE_EXIT_CODE SEC_GENERIC_ERROR
387