1/* Tests some basic CPU 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(0xffff0012);\n
20# output: report(0x12352af7);\n
21# output: report(0x7ffffffe);\n
22# output: report(0xffffa5a7);\n
23# output: report(0x000fffff);\n
24# output: report(0x00002800);\n
25# output: report(0x00000009);\n
26# output: report(0xdeaddead);\n
27# output: report(0xffff0000);\n
28# output: report(0x12345678);\n
29# output: report(0xabcdf0bd);\n
30# output: exit(0)\n
31
32#include "or1k-asm-test-env.h"
33
34#define FIRST_RAM_ADDR 0x00000000
35
36	STANDARD_TEST_HEADER
37
38	/* Early test begin.  */
39
40	/* Do this test upfront, as it modifies STACK_POINTER_R1.  */
41
42	l.addi  r1 , r0 , 0x1
43	l.addi  r2 , r1 , 0x2
44	l.addi  r3 , r2 , 0x4
45	l.addi  r4 , r3 , 0x8
46	l.addi  r5 , r4 , 0x10
47	l.addi  r6 , r5 , 0x20
48	l.addi  r7 , r6 , 0x40
49	l.addi  r8 , r7 , 0x80
50	l.addi  r9 , r8 , 0x100
51	l.addi  r10, r9 , 0x200
52	l.addi  r11, r10, 0x400
53	l.addi  r12, r11, 0x800
54	l.addi  r13, r12, 0x1000
55	l.addi  r14, r13, 0x2000
56	l.addi  r15, r14, 0x4000
57	l.addi  r16, r15, 0x8000
58
59	l.sub   r31, r0 , r1
60	l.sub   r30, r31, r2
61	l.sub   r29, r30, r3
62	l.sub   r28, r29, r4
63	l.sub   r27, r28, r5
64	l.sub   r26, r27, r6
65	l.sub   r25, r26, r7
66	l.sub   r24, r25, r8
67	l.sub   r23, r24, r9
68	l.sub   r22, r23, r10
69	l.sub   r21, r22, r11
70	l.sub   r20, r21, r12
71	l.sub   r19, r20, r13
72	l.sub   r18, r19, r14
73	l.sub   r17, r18, r15
74	l.sub   r16, r17, r16
75
76	/* We cannot use REPORT_REG_TO_CONSOLE here, as the stack is not
77	   set up yet.  */
78	MOVE_REG NOP_REPORT_R3, r16
79	REPORT_TO_CONSOLE /* Should be 0xffff0012  */
80
81	/* Early test end.  */
82
83	STANDARD_TEST_BODY
84
85	.section .text
86start_tests:
87	PUSH LINK_REGISTER_R9
88
89	/* Read and write from RAM.  */
90
91	LOAD_IMMEDIATE r31, FIRST_RAM_ADDR
92	l.sw    0(r31), r16
93
94	l.movhi r3,0x1234
95	l.ori   r3,r3,0x5678
96
97	l.sw    4(r31),r3
98
99	l.lbz   r4,4(r31)
100	l.add   r8,r8,r4
101	l.sb    11(r31),r4
102	l.lbz   r4,5(r31)
103	l.add   r8,r8,r4
104	l.sb    10(r31),r4
105	l.lbz   r4,6(r31)
106	l.add   r8,r8,r4
107	l.sb    9(r31),r4
108	l.lbz   r4,7(r31)
109	l.add   r8,r8,r4
110	l.sb    8(r31),r4
111
112	l.lbs   r4,8(r31)
113	l.add   r8,r8,r4
114	l.sb    7(r31),r4
115	l.lbs   r4,9(r31)
116	l.add   r8,r8,r4
117	l.sb    6(r31),r4
118	l.lbs   r4,10(r31)
119	l.add   r8,r8,r4
120	l.sb    5(r31),r4
121	l.lbs   r4,11(r31)
122	l.add   r8,r8,r4
123	l.sb    4(r31),r4
124
125	l.lhz   r4,4(r31)
126	l.add   r8,r8,r4
127	l.sh    10(r31),r4
128	l.lhz   r4,6(r31)
129	l.add   r8,r8,r4
130	l.sh    8(r31),r4
131
132	l.lhs   r4,8(r31)
133	l.add   r8,r8,r4
134	l.sh    6(r31),r4
135	l.lhs   r4,10(r31)
136	l.add   r8,r8,r4
137	l.sh    4(r31),r4
138
139	l.lwz   r4,4(r31)
140	l.add   r8,r8,r4
141
142	REPORT_REG_TO_CONSOLE r8 /* Should be 0x12352af7  */
143
144	l.lwz   r9,0(r31)
145	l.add   r8,r9,r8
146	l.sw    0(r31),r8
147
148	/* Test arithmetic operations.  */
149
150	l.addi  r3,r0,1
151	l.addi  r4,r0,2
152	l.addi  r5,r0,-1
153	l.addi  r6,r0,-1
154	l.addi  r8,r0,0
155
156	l.sub   r7,r5,r3
157	l.sub   r8,r3,r5
158	l.add   r8,r8,r7
159
160	l.div   r7,r7,r4
161	l.add   r9,r3,r4
162	l.mul   r7,r9,r7
163	l.divu  r7,r7,r4
164	l.add   r8,r8,r7
165
166	REPORT_REG_TO_CONSOLE r8 /* Should be 0x7ffffffe  */
167
168	l.lwz   r9,0(r31)
169	l.add   r8,r9,r8
170	l.sw    0(r31),r8
171
172	/* Test logical operations.  */
173
174	l.addi  r3,r0,1
175	l.addi  r4,r0,2
176	l.addi  r5,r0,-1
177	l.addi  r6,r0,-1
178	l.addi  r8,r0,0
179
180	l.andi  r8,r8,1
181	l.and   r8,r8,r3
182
183	l.xori  r8,r5,0xa5a5
184	l.xor   r8,r8,r5
185
186	l.ori   r8,r8,2
187	l.or    r8,r8,r4
188
189	REPORT_REG_TO_CONSOLE r8 /* Should be 0xffffa5a7  */
190
191	l.lwz   r9,0(r31)
192	l.add   r8,r9,r8
193	l.sw    0(r31),r8
194
195	/* Test shifting operations.  */
196
197	l.addi  r3,r0,1
198	l.addi  r4,r0,2
199	l.addi  r5,r0,-1
200	l.addi  r6,r0,-1
201	l.addi  r8,r0,0
202
203	l.slli  r8,r5,6
204	l.sll   r8,r8,r4
205
206	l.srli  r8,r8,6
207	l.srl   r8,r8,r4
208
209	l.srai  r8,r8,2
210	l.sra   r8,r8,r4
211
212	REPORT_REG_TO_CONSOLE r8 /* Should be 0x000fffff  */
213
214	l.lwz   r9,0(r31)
215	l.add   r8,r9,r8
216	l.sw    0(r31),r8
217
218	/* Test the CPU flag. */
219
220	l.addi  r3,r0,1
221	l.addi  r4,r0,-2
222	l.addi  r8,r0,0
223
224	l.sfeq  r3,r3
225	l.mfspr r5,r0,17
226	l.andi  r4,r5,0x200
227	l.add   r8,r8,r4
228
229	l.sfeq  r3,r4
230	l.mfspr r5,r0,17
231	l.andi  r4,r5,0x200
232	l.add   r8,r8,r4
233
234	l.sfeqi r3,1
235	l.mfspr r5,r0,17
236	l.andi  r4,r5,0x200
237	l.add   r8,r8,r4
238
239	l.sfeqi r3,-2
240	l.mfspr r5,r0,17
241	l.andi  r4,r5,0x200
242	l.add   r8,r8,r4
243
244	l.sfne  r3,r3
245	l.mfspr r5,r0,17
246	l.andi  r4,r5,0x200
247	l.add   r8,r8,r4
248
249	l.sfne  r3,r4
250	l.mfspr r5,r0,17
251	l.andi  r4,r5,0x200
252	l.add   r8,r8,r4
253
254	l.sfnei r3,1
255	l.mfspr r5,r0,17
256	l.andi  r4,r5,0x200
257	l.add   r8,r8,r4
258
259	l.sfnei r3,-2
260	l.mfspr r5,r0,17
261	l.andi  r4,r5,0x200
262	l.add   r8,r8,r4
263
264	l.sfgtu r3,r3
265	l.mfspr r5,r0,17
266	l.andi  r4,r5,0x200
267	l.add   r8,r8,r4
268
269	l.sfgtu r3,r4
270	l.mfspr r5,r0,17
271	l.andi  r4,r5,0x200
272	l.add   r8,r8,r4
273
274	l.sfgtui    r3,1
275	l.mfspr r5,r0,17
276	l.andi  r4,r5,0x200
277	l.add   r8,r8,r4
278
279	l.sfgtui    r3,-2
280	l.mfspr r5,r0,17
281	l.andi  r4,r5,0x200
282	l.add   r8,r8,r4
283
284	l.sfgeu r3,r3
285	l.mfspr r5,r0,17
286	l.andi  r4,r5,0x200
287	l.add   r8,r8,r4
288
289	l.sfgeu r3,r4
290	l.mfspr r5,r0,17
291	l.andi  r4,r5,0x200
292	l.add   r8,r8,r4
293
294	l.sfgeui    r3,1
295	l.mfspr r5,r0,17
296	l.andi  r4,r5,0x200
297	l.add   r8,r8,r4
298
299	l.sfgeui    r3,-2
300	l.mfspr r5,r0,17
301	l.andi  r4,r5,0x200
302	l.add   r8,r8,r4
303
304	l.sfltu r3,r3
305	l.mfspr r5,r0,17
306	l.andi  r4,r5,0x200
307	l.add   r8,r8,r4
308
309	l.sfltu r3,r4
310	l.mfspr r5,r0,17
311	l.andi  r4,r5,0x200
312	l.add   r8,r8,r4
313
314	l.sfltui    r3,1
315	l.mfspr r5,r0,17
316	l.andi  r4,r5,0x200
317	l.add   r8,r8,r4
318
319	l.sfltui    r3,-2
320	l.mfspr r5,r0,17
321	l.andi  r4,r5,0x200
322	l.add   r8,r8,r4
323
324	l.sfleu r3,r3
325	l.mfspr r5,r0,17
326	l.andi  r4,r5,0x200
327	l.add   r8,r8,r4
328
329	l.sfleu r3,r4
330	l.mfspr r5,r0,17
331	l.andi  r4,r5,0x200
332	l.add   r8,r8,r4
333
334	l.sfleui    r3,1
335	l.mfspr r5,r0,17
336	l.andi  r4,r5,0x200
337	l.add   r8,r8,r4
338
339	l.sfleui    r3,-2
340	l.mfspr r5,r0,17
341	l.andi  r4,r5,0x200
342	l.add   r8,r8,r4
343
344	l.sfgts r3,r3
345	l.mfspr r5,r0,17
346	l.andi  r4,r5,0x200
347	l.add   r8,r8,r4
348
349	l.sfgts r3,r4
350	l.mfspr r5,r0,17
351	l.andi  r4,r5,0x200
352	l.add   r8,r8,r4
353
354	l.sfgtsi    r3,1
355	l.mfspr r5,r0,17
356	l.andi  r4,r5,0x200
357	l.add   r8,r8,r4
358
359	l.sfgtsi    r3,-2
360	l.mfspr r5,r0,17
361	l.andi  r4,r5,0x200
362	l.add   r8,r8,r4
363
364	l.sfges r3,r3
365	l.mfspr r5,r0,17
366	l.andi  r4,r5,0x200
367	l.add   r8,r8,r4
368
369	l.sfges r3,r4
370	l.mfspr r5,r0,17
371	l.andi  r4,r5,0x200
372	l.add   r8,r8,r4
373
374	l.sfgesi    r3,1
375	l.mfspr r5,r0,17
376	l.andi  r4,r5,0x200
377	l.add   r8,r8,r4
378
379	l.sfgesi    r3,-2
380	l.mfspr r5,r0,17
381	l.andi  r4,r5,0x200
382	l.add   r8,r8,r4
383
384	l.sflts r3,r3
385	l.mfspr r5,r0,17
386	l.andi  r4,r5,0x200
387	l.add   r8,r8,r4
388
389	l.sflts r3,r4
390	l.mfspr r5,r0,17
391	l.andi  r4,r5,0x200
392	l.add   r8,r8,r4
393
394	l.sfltsi    r3,1
395	l.mfspr r5,r0,17
396	l.andi  r4,r5,0x200
397	l.add   r8,r8,r4
398
399	l.sfltsi    r3,-2
400	l.mfspr r5,r0,17
401	l.andi  r4,r5,0x200
402	l.add   r8,r8,r4
403
404	l.sfles r3,r3
405	l.mfspr r5,r0,17
406	l.andi  r4,r5,0x200
407	l.add   r8,r8,r4
408
409	l.sfles r3,r4
410	l.mfspr r5,r0,17
411	l.andi  r4,r5,0x200
412	l.add   r8,r8,r4
413
414	l.sflesi    r3,1
415	l.mfspr r5,r0,17
416	l.andi  r4,r5,0x200
417	l.add   r8,r8,r4
418
419	l.sflesi    r3,-2
420	l.mfspr r5,r0,17
421	l.andi  r4,r5,0x200
422	l.add   r8,r8,r4
423
424	REPORT_REG_TO_CONSOLE r8 /* Should be 0x00002800  */
425
426	l.lwz   r9,0(r31)
427	l.add   r8,r9,r8
428	l.sw    0(r31),r8
429
430	/* Test the jump instructions.  */
431
432	l.addi  r8,r0,0
433
434	OR1K_DELAYED (
435	OR1K_INST (l.addi  r8,r8,1),
436	OR1K_INST (l.j _T1)
437	)
438
439_T2:	OR1K_DELAYED (
440	OR1K_INST (l.addi  r8,r8,1),
441	OR1K_INST (l.jr    r9)
442	)
443
444_T1:	OR1K_DELAYED (
445	OR1K_INST (l.addi  r8,r8,1),
446	OR1K_INST (l.jal   _T2)
447	)
448
449	l.sfeqi r0,0
450	OR1K_DELAYED (
451	OR1K_INST (l.addi  r8,r8,1),
452	OR1K_INST (l.bf    _T3)
453	)
454
455_T3:	l.sfeqi r0,1
456	OR1K_DELAYED (
457	OR1K_INST (l.addi  r8,r8,1),
458	OR1K_INST (l.bf    _T4)
459	)
460
461	l.addi  r8,r8,1
462
463_T4:	l.sfeqi r0,0
464	OR1K_DELAYED (
465	OR1K_INST (l.addi  r8,r8,1),
466	OR1K_INST (l.bnf    _T5)
467	)
468
469	l.addi  r8,r8,1
470
471_T5:	l.sfeqi r0,1
472	OR1K_DELAYED (
473	OR1K_INST (l.addi  r8,r8,1),
474	OR1K_INST (l.bnf    _T6)
475	)
476
477	l.addi  r8,r8,1
478
479_T6:	l.movhi r3,hi (_T7)
480	l.ori  r3,r3,lo (_T7)
481	l.mtspr r0,r3,32
482	l.mfspr r5,r0,17
483	l.mtspr r0,r5,64
484	l.rfe
485	l.addi  r8,r8,1 /* l.rfe should not have a delay slot  */
486
487	l.addi  r8,r8,1
488
489_T7:    REPORT_REG_TO_CONSOLE r8 /* Should be 0x000000009  */
490
491	l.lwz   r9,0(r31)
492	l.add   r8,r9,r8
493	l.sw    0(r31),r8
494
495	l.lwz   r9,0(r31)
496	l.movhi r3,0x4c69
497	l.ori   r3,r3,0xe5f7
498	l.add   r8,r8,r3
499
500	REPORT_REG_TO_CONSOLE r8 /* Should be 0xdeaddead  */
501
502	/* Test l.movhi, on 32-bit implementations it should not
503	   sign-extend anything.  */
504
505	l.movhi r3, -1
506	REPORT_REG_TO_CONSOLE r3
507
508	/* Test l.cmov  */
509
510	LOAD_IMMEDIATE r14, 0x12345678
511	LOAD_IMMEDIATE r15, 0xABCDF0BD
512
513	SET_SPR_SR_FLAGS  SPR_SR_F, r6, r7
514	l.cmov r10, r14, r15
515	CLEAR_SPR_SR_FLAGS SPR_SR_F, r6, r7
516	l.cmov r11, r14, r15
517
518	REPORT_REG_TO_CONSOLE r10
519	REPORT_REG_TO_CONSOLE r11
520
521	POP LINK_REGISTER_R9
522	RETURN_TO_LINK_REGISTER_R9
523