xref: /netbsd-src/external/gpl3/gdb/dist/sim/testsuite/ft32/basic.s (revision 4b169a6ba595ae283ca507b26b15fdff40495b1c)
1# check that basic insns work.
2# mach: ft32
3
4.include "testutils.inc"
5
6	start
7
8	ldk	  $r0,__PMSIZE
9	EXPECT    $r0,0x00040000
10	ldk       $r0,__RAMSIZE
11	EXPECT    $r0,0x00010000
12
13	ldk     $r4,10
14	add     $r4,$r4,23
15	EXPECT  $r4,33
16
17# lda, sta
18	.data
19tmp:    .long     0
20	.text
21
22	xor.l     $r0,$r0,$r0
23	EXPECT    $r0,0x00000000
24	xor.l     $r0,$r0,$r0
25	add.l     $r0,$r0,1
26	EXPECT    $r0,0x00000001
27
28	ldk.l     $r0,0x4567
29	EXPECT    $r0,0x00004567
30
31	lpm.l     $r0,k_12345678
32	EXPECT    $r0,0x12345678
33
34	sta.l     tmp,$r0
35	lda.l     $r1,tmp
36	EXPECT    $r1,0x12345678
37
38	lda.b     $r1,tmp
39	EXPECT    $r1,0x00000078
40
41	lda.b     $r1,tmp+1
42	EXPECT    $r1,0x00000056
43
44	lda.b     $r1,tmp+2
45	EXPECT    $r1,0x00000034
46
47	lda.b     $r1,tmp+3
48	EXPECT    $r1,0x00000012
49
50	sta.b     tmp+1,$r0
51	lda.l     $r1,tmp+0
52	EXPECT    $r1,0x12347878
53
54# immediate
55	ldk.l     $r1,12
56	add.l     $r1,$r1,4
57	EXPECT    $r1,0x00000010
58	add.l     $r1,$r1,0x1ff
59	EXPECT    $r1,0x0000020f
60	add.l     $r1,$r1,-0x200
61	EXPECT    $r1,0x0000000f
62
63# addk
64	xor.l     $r1,$r0,$r0
65	add.l     $r2,$r1,127
66	EXPECT    $r2,0x0000007f
67
68	add.l     $r2,$r2,127
69	EXPECT    $r2,0x000000fe
70
71	add.l     $r2,$r2,-127
72	EXPECT    $r2,0x0000007f
73
74	add.l     $r2,$r2,-128
75	EXPECT    $r2,0xffffffff
76
77	add.l     $r2,$r2,1
78	EXPECT    $r2,0x00000000
79
80# mul
81	ldk.l     $r1,100
82	ldk.l     $r2,77
83	mul.l     $r3,$r1,$r2
84	EXPECT    $r3,0x00001e14
85
86	# 0x12345678 ** 2 = 0x14b66dc1df4d840L
87	mul.l     $r3,$r0,$r0
88	EXPECT    $r3,0x1df4d840
89	muluh.l   $r3,$r0,$r0
90	EXPECT    $r3,0x014b66dc
91
92# push and pop
93	push.l    $r0
94	EXPECT    $sp,0x0000fffc
95	ldi.l     $r3,$sp,0
96	EXPECT    $r3,0x12345678
97
98	pop.l     $r4
99	EXPECT    $sp,0x00000000
100	EXPECT    $r4,0x12345678
101
102	ldk.l     $r1,0x1111
103	push.l    $r1
104	ldk.l     $r1,0x2222
105	push.l    $r1
106	ldk.l     $r1,0x3333
107	push.l    $r1
108	ldk.l     $r1,0x4444
109	push.l    $r1
110	EXPECT    $sp,0x0000fff0
111	pop.l     $r1
112	EXPECT    $r1,0x00004444
113	pop.l     $r1
114	EXPECT    $r1,0x00003333
115	pop.l     $r1
116	EXPECT    $r1,0x00002222
117	pop.l     $r1
118	EXPECT    $r1,0x00001111
119
120# push and pop with $sp changes
121	ldk.l     $r1,0xa111
122	push.l    $r1
123	sub.l     $sp,$sp,4
124	ldk.l     $r1,0xa222
125	push.l    $r1
126	add.l     $sp,$sp,-36
127	add.l     $sp,$sp,36
128	pop.l     $r1
129	EXPECT    $r1,0x0000a222
130	add.l     $sp,$sp,4
131	pop.l     $r1
132	EXPECT    $r1,0x0000a111
133
134# sti
135	ldk.l     $r2,80
136	EXPECT    $r2,0x00000050
137	sti.l     $r2,0,$r0
138	lda.l     $r1,80
139	EXPECT    $r1,0x12345678
140
141	ldk.l     $r3,0xF0
142	sti.b     $r2,0,$r3
143	lda.l     $r1,80
144	EXPECT    $r1,0x123456f0
145
146	add.l     $r2,$r2,1
147	sti.l     $r2,0,$r0
148	sti.b     $r2,0,$r3
149	lda.l     $r1,80
150	EXPECT    $r1,0x1234f078
151
152	add.l     $r2,$r2,1
153	sti.l     $r2,0,$r0
154	sti.b     $r2,0,$r3
155	lda.l     $r1,80
156	EXPECT    $r1,0x12f05678
157
158	add.l     $r2,$r2,1
159	sti.l     $r2,0,$r0
160	sti.b     $r2,0,$r3
161	lda.l     $r1,80
162	EXPECT    $r1,0xf0345678
163
164	ldk.l     $r2,80
165	sti.l     $r2,0,$r0
166	ldk.s     $r3,0xbeef
167	sti.s     $r2,0,$r3
168	lda.l     $r1,80
169	EXPECT    $r1,0x1234beef
170	add.l     $r2,$r2,2
171	sti.s     $r2,0,$r3
172	lda.l     $r1,80
173	EXPECT    $r1,0xbeefbeef
174
175# lpmi
176
177	ldk.l     $r1,k_12345678
178	lpmi.l    $r2,$r1,0
179	EXPECT    $r2,0x12345678
180
181	lpmi.b    $r2,$r1,0
182	EXPECT    $r2,0x00000078
183
184	add.l     $r1,$r1,1
185	lpmi.b    $r2,$r1,0
186	EXPECT    $r2,0x00000056
187
188	add.l     $r1,$r1,1
189	lpmi.b    $r2,$r1,0
190	EXPECT    $r2,0x00000034
191
192	add.l     $r1,$r1,1
193	lpmi.b    $r2,$r1,0
194	EXPECT    $r2,0x00000012
195
196	lpmi.l    $r2,$r1,4
197	EXPECT    $r2,0xabcdef01
198
199	lpmi.l    $r2,$r1,-4
200	EXPECT    $r2,0x10111213
201
202	lpmi.b    $r2,$r1,-4
203	EXPECT    $r2,0x00000010
204
205	ldk.l     $r1,k_12345678
206	lpmi.s    $r2,$r1,0
207	EXPECT    $r2,0x00005678
208	lpmi.s    $r2,$r1,2
209	EXPECT    $r2,0x00001234
210	lpmi.b    $r2,$r1,6
211	EXPECT    $r2,0x000000cd
212	lpmi.b    $r2,$r1,7
213	EXPECT    $r2,0x000000ab
214	lpmi.b    $r2,$r1,-1
215	EXPECT    $r2,0x00000010
216	lpmi.s    $r2,$r1,-2
217	EXPECT    $r2,0x00001011
218
219	ldk.l     $r1,k_12345678-127
220	lpmi.b    $r2,$r1,127
221	EXPECT    $r2,0x00000078
222
223	ldk.l     $r1,k_12345678+128
224	lpmi.b    $r2,$r1,-128
225	EXPECT    $r2,0x00000078
226
227# shifts
228
229	lpm.l     $r0,k_12345678
230	ldk.l     $r2,4
231	ashl.l    $r1,$r0,$r2
232	EXPECT    $r1,0x23456780
233	lshr.l    $r1,$r0,$r2
234	EXPECT    $r1,0x01234567
235	ashr.l    $r1,$r0,$r2
236	EXPECT    $r1,0x01234567
237
238	lpm.l     $r0,k_abcdef01
239	ashl.l    $r1,$r0,$r2
240	EXPECT    $r1,0xbcdef010
241	lshr.l    $r1,$r0,$r2
242	EXPECT    $r1,0x0abcdef0
243	ashr.l    $r1,$r0,$r2
244	EXPECT    $r1,0xfabcdef0
245
246# rotate right
247
248	lpm.l     $r0,k_12345678
249	ror.l     $r1,$r0,0
250	EXPECT    $r1,0x12345678
251	ror.l     $r1,$r0,12
252	EXPECT    $r1,0x67812345
253	ror.l     $r1,$r0,-4
254	EXPECT    $r1,0x23456781
255
256# jmpx
257	ldk       $r28,0xaaaaa
258	jmpx      0,$r28,1,failcase
259	jmpx      1,$r28,0,failcase
260	jmpx      2,$r28,1,failcase
261	jmpx      3,$r28,0,failcase
262	jmpx      4,$r28,1,failcase
263	jmpx      5,$r28,0,failcase
264	jmpx      6,$r28,1,failcase
265	jmpx      7,$r28,0,failcase
266	jmpx      8,$r28,1,failcase
267	jmpx      9,$r28,0,failcase
268	jmpx      10,$r28,1,failcase
269	jmpx      11,$r28,0,failcase
270	jmpx      12,$r28,1,failcase
271	jmpx      13,$r28,0,failcase
272	jmpx      14,$r28,1,failcase
273	jmpx      15,$r28,0,failcase
274	jmpx      16,$r28,1,failcase
275	jmpx      17,$r28,0,failcase
276	jmpx      18,$r28,1,failcase
277	jmpx      19,$r28,0,failcase
278
279	move      $r29,$r28
280	ldk       $r28,0
281	jmpx      0,$r29,1,failcase
282	jmpx      1,$r29,0,failcase
283	jmpx      2,$r29,1,failcase
284	jmpx      3,$r29,0,failcase
285	jmpx      4,$r29,1,failcase
286	jmpx      5,$r29,0,failcase
287	jmpx      6,$r29,1,failcase
288	jmpx      7,$r29,0,failcase
289	jmpx      8,$r29,1,failcase
290	jmpx      9,$r29,0,failcase
291	jmpx      10,$r29,1,failcase
292	jmpx      11,$r29,0,failcase
293	jmpx      12,$r29,1,failcase
294	jmpx      13,$r29,0,failcase
295	jmpx      14,$r29,1,failcase
296	jmpx      15,$r29,0,failcase
297	jmpx      16,$r29,1,failcase
298	jmpx      17,$r29,0,failcase
299	jmpx      18,$r29,1,failcase
300	jmpx      19,$r29,0,failcase
301
302	move      $r30,$r29
303	ldk       $r29,0
304	jmpx      0,$r30,1,failcase
305	jmpx      1,$r30,0,failcase
306	jmpx      2,$r30,1,failcase
307	jmpx      3,$r30,0,failcase
308	jmpx      4,$r30,1,failcase
309	jmpx      5,$r30,0,failcase
310	jmpx      6,$r30,1,failcase
311	jmpx      7,$r30,0,failcase
312	jmpx      8,$r30,1,failcase
313	jmpx      9,$r30,0,failcase
314	jmpx      10,$r30,1,failcase
315	jmpx      11,$r30,0,failcase
316	jmpx      12,$r30,1,failcase
317	jmpx      13,$r30,0,failcase
318	jmpx      14,$r30,1,failcase
319	jmpx      15,$r30,0,failcase
320	jmpx      16,$r30,1,failcase
321	jmpx      17,$r30,0,failcase
322	jmpx      18,$r30,1,failcase
323	jmpx      19,$r30,0,failcase
324
325# callx
326	ldk       $r30,0xaaaaa
327	callx     0,$r30,0,skip1
328	jmp       failcase
329	callx     1,$r30,1,skip1
330	jmp       failcase
331	callx     2,$r30,0,skip1
332	jmp       failcase
333	callx     3,$r30,1,skip1
334	jmp       failcase
335
336	callx     0,$r30,1,skip1
337	ldk       $r30,0x123
338	EXPECT    $r30,0x123
339
340#define BIT(N,M)  ((((N) & 15) << 5) | (M))
341# bextu
342	bextu.l   $r1,$r0,(0<<5)|0
343	EXPECT    $r1,0x00005678
344	bextu.l   $r1,$r0,(4<<5)|0
345	EXPECT    $r1,0x00000008
346	bextu.l   $r1,$r0,(4<<5)|4
347	EXPECT    $r1,0x00000007
348	bextu.l   $r1,$r0,(4<<5)|28
349	EXPECT    $r1,0x00000001
350	bextu.l   $r1,$r0,(8<<5)|16
351	EXPECT    $r1,0x00000034
352	ldk.l     $r2,-1
353	bextu.l   $r1,$r2,(6<<5)|(3)
354	EXPECT    $r1,0x0000003f
355
356# bexts
357	bexts.l   $r1,$r0,(8<<5)|0
358	EXPECT    $r1,0x00000078
359	bexts.l   $r1,$r0,(0<<5)|16
360	EXPECT    $r1,0x00001234
361	bexts.l   $r1,$r0,(4<<5)|0
362	EXPECT    $r1,0xfffffff8
363	# extract the '5' digit in widths 4-1
364	bexts.l   $r1,$r0,(4<<5)|12
365	EXPECT    $r1,0x00000005
366	bexts.l   $r1,$r0,(3<<5)|12
367	EXPECT    $r1,0xfffffffd
368	bexts.l   $r1,$r0,(2<<5)|12
369	EXPECT    $r1,0x00000001
370	bexts.l   $r1,$r0,(1<<5)|12
371	EXPECT    $r1,0xffffffff
372
373# btst
374	# low four bits should be 0,0,0,1
375	btst.l    $r0,(1<<5)|0
376	jmpc      nz,failcase
377	btst.l    $r0,(1<<5)|1
378	jmpc      nz,failcase
379	btst.l    $r0,(1<<5)|2
380	jmpc      nz,failcase
381	btst.l    $r0,(1<<5)|3
382	jmpc      z,failcase
383
384	# the 6 bit field starting at position 24 is positive
385	btst.l    $r0,(6<<5)|24
386	jmpc      s,failcase
387	# the 5 bit field starting at position 24 is negative
388	btst.l    $r0,(5<<5)|24
389	jmpc      ns,failcase
390
391	EXPECT    $r0,0x12345678
392
393# bins
394	bins.l    $r1,$r0,(8 << 5) | (0)
395	EXPECT    $r1,0x12345600
396
397	bins.l    $r1,$r0,(0 << 5) | (8)
398	EXPECT    $r1,0x12000078
399
400	ldk.l     $r1,(0xff << 10) | (8 << 5) | (8)
401	bins.l    $r1,$r0,$r1
402	EXPECT    $r1,0x1234ff78
403
404	call      litr1
405	.long     (0x8dd1 << 10) | (0 << 5) | (0)
406	bins.l    $r1,$r0,$r1
407	EXPECT    $r1,0x12348dd1
408
409	call      litr1
410	.long     (0x8dd1 << 10) | (0 << 5) | (16)
411	bins.l    $r1,$r0,$r1
412	EXPECT    $r1,0x8dd15678
413
414	ldk.l     $r1,(0xde << 10) | (8 << 5) | (0)
415	bins.l    $r1,$r0,$r1
416	EXPECT    $r1,0x123456de
417
418# ldl
419	ldk.l     $r0,0
420	ldl.l     $r3,$r0,0
421	EXPECT    $r3,0x00000000
422	ldk.l     $r0,-1
423	ldl.l     $r3,$r0,-1
424	EXPECT    $r3,0xffffffff
425	ldk.l     $r0,(0x12345678 >> 10)
426	ldl.l     $r3,$r0,(0x12345678 & 0x3ff)
427	EXPECT    $r3,0x12345678
428	ldk.l     $r0,(0xe2345678 >> 10)
429	ldl.l     $r3,$r0,(0xe2345678 & 0x3ff)
430	EXPECT    $r3,0xe2345678
431
432# flip
433	ldk.l     $r0,0x0000001
434	flip.l    $r1,$r0,0
435	EXPECT    $r1,0x00000001
436
437	lpm.l     $r0,k_12345678
438	flip.l    $r1,$r0,0
439	EXPECT    $r1,0x12345678
440	flip.l    $r1,$r0,24
441	EXPECT    $r1,0x78563412
442	flip.l    $r1,$r0,31
443	EXPECT    $r1,0x1e6a2c48
444
445# stack push pop
446
447	EXPECT    $sp,0x00000000
448	ldk.l     $r6,0x6666
449	push.l    $r6
450	or.l      $r0,$r0,$r0      # xxx
451	EXPECT    $sp,0x0000fffc
452	ldi.l     $r1,$sp,0
453	EXPECT    $r1,0x00006666
454	pop.l     $r1
455	EXPECT    $r1,0x00006666
456	EXPECT    $sp,0x00000000
457
458# call/return
459	call      fowia
460	push.l    $r1
461	call      fowia
462	pop.l     $r2
463	sub.l     $r1,$r1,$r2
464	EXPECT    $r1,0x00000008
465
466# add,carry
467
468	ldk.l     $r0,0
469	ldk.l     $r1,0
470	call      add64
471	EXPECT    $r1,0x00000000
472	EXPECT    $r0,0x00000000
473
474	lpm.l     $r0,k_abcdef01
475	lpm.l     $r1,k_abcdef01
476	call      add64
477	EXPECT    $r1,0x00000001
478	EXPECT    $r0,0x579bde02
479
480	ldk.l     $r0,4
481	ldk.l     $r1,-5
482	call      add64
483	EXPECT    $r1,0x00000000
484	EXPECT    $r0,0xffffffff
485
486	ldk.l     $r0,5
487	ldk.l     $r1,-5
488	call      add64
489	EXPECT    $r1,0x00000001
490	EXPECT    $r0,0x00000000
491
492	lpm.l     $r0,k_12345678
493	ldk.l     $r1,-1
494	call      add64
495	EXPECT    $r1,0x00000001
496	EXPECT    $r0,0x12345677
497
498	ldk.l     $r0,-1
499	ldk.l     $r1,-1
500	call      add64
501	EXPECT    $r1,0x00000001
502	EXPECT    $r0,0xfffffffe
503
504# inline literal
505	call      lit
506	.long     0xdecafbad
507	EXPECT    $r0,0xdecafbad
508
509	ldk.l     $r1,0xee
510	call      lit
511	ldk.l     $r1,0xfe
512	EXPECT    $r1,0x000000ee
513
514	call      lit
515	.long     0x01020304
516	EXPECT    $r0,0x01020304
517
518	call      lit
519	.long     lit
520	calli     $r0
521	.long     0xffaa55aa
522	EXPECT    $r0,0xffaa55aa
523
524# comparisons
525	ldk.l     $r0,-100
526	ldk.l     $r1,100
527	cmp.l     $r0,$r1
528
529	ldk.l     $r2,0
530	jmpc      lt,.c1
531	ldk.l     $r2,1
532.c1:
533	EXPECT    $r2,0x00000000
534
535	ldk.l     $r2,0
536	jmpc      gt,.c2
537	ldk.l     $r2,1
538.c2:
539	EXPECT    $r2,0x00000001
540
541	ldk.l     $r2,0
542	jmpc      a,.c3
543	ldk.l     $r2,1
544.c3:
545	EXPECT    $r2,0x00000000
546
547	ldk.l     $r2,0
548	jmpc      b,.c4
549	ldk.l     $r2,1
550.c4:
551	EXPECT    $r2,0x00000001
552
553	ldk.l     $r2,0
554	jmpc      be,.c5
555	ldk.l     $r2,1
556.c5:
557	EXPECT    $r2,0x00000001
558
559# 8-bit comparisons
560	ldk.l     $r0,0x8fe
561	ldk.l     $r1,0x708
562	cmp.b     $r0,$r1
563
564	ldk.l     $r2,0
565	jmpc      lt,.8c1
566	ldk.l     $r2,1
567.8c1:
568	EXPECT    $r2,0x00000000
569
570	ldk.l     $r2,0
571	jmpc      gt,.8c2
572	ldk.l     $r2,1
573.8c2:
574	EXPECT    $r2,0x00000001
575
576	ldk.l     $r2,0
577	jmpc      a,.8c3
578	ldk.l     $r2,1
579.8c3:
580	EXPECT    $r2,0x00000000
581
582	ldk.l     $r2,0
583	jmpc      b,.8c4
584	ldk.l     $r2,1
585.8c4:
586	EXPECT    $r2,0x00000001
587
588	ldk.l     $r2,0
589	jmpc      be,.8c5
590	ldk.l     $r2,1
591.8c5:
592	EXPECT    $r2,0x00000001
593
594	ldk.l     $r0,0x8aa
595	ldk.l     $r1,0x7aa
596	cmp.b     $r0,$r1
597
598	ldk.l     $r2,0
599	jmpc      z,.8c6
600	ldk.l     $r2,1
601.8c6:
602	EXPECT    $r2,0x00000000
603
604	ldk.b     $r0,1
605	ldk.b     $r2,0xe0
606	cmp.b     $r2,0x1c0
607	jmpc      a,.8c7
608	ldk.b     $r0,0
609.8c7:
610	EXPECT    $r0,0x00000001
611
612# conditional call
613	cmp.l     $r0,$r0
614	callc     z,lit
615	.long     0xccddeeff
616	callc     nz,zr0
617	EXPECT    $r0,0xccddeeff
618
619# modify return address
620	ldk.l     $r0,0x66
621	call      skip1
622	ldk.l     $r0,0xAA
623	EXPECT    $r0,0x00000066
624
625	ldk.l     $r0,0x77
626	call      skip2
627	ldk.l     $r0,0xBB
628	EXPECT    $r0,0x00000077
629
630# simple recursive function
631	ldk.l     $r0,1
632	call      factorial
633	EXPECT    $r0,0x00000001
634	ldk.l     $r0,2
635	call      factorial
636	EXPECT    $r0,0x00000002
637	ldk.l     $r0,3
638	call      factorial
639	EXPECT    $r0,0x00000006
640	ldk.l     $r0,4
641	call      factorial
642	EXPECT    $r0,0x00000018
643	ldk.l     $r0,5
644	call      factorial
645	EXPECT    $r0,0x00000078
646	ldk.l     $r0,6
647	call      factorial
648	EXPECT    $r0,0x000002d0
649	ldk.l     $r0,7
650	call      factorial
651	EXPECT    $r0,0x000013b0
652	ldk.l     $r0,12
653	call      factorial
654	EXPECT    $r0,0x1c8cfc00
655
656# read sp after a call
657	call      nullfunc
658	EXPECT    $sp,0x00000000
659
660# CALLI->RETURN
661	ldk.l     $r4,nullfunc
662	calli     $r4
663	EXPECT    $sp,0x00000000
664
665# Link/unlink
666	ldk.l     $r14,0x17566
667
668	link      $r14,48
669	EXPECT    $r14,0x0000fffc
670	sub.l     $sp,$sp,200
671	unlink    $r14
672	EXPECT    $r14,0x00017566
673
674# LINK->UNLINK
675	link      $r14,48
676	unlink    $r14
677	EXPECT    $r14,0x00017566
678
679# LINK->JUMPI
680	ldk.l     $r3,.here
681	link      $r14,48
682	jmpi      $r3
683	jmp       failcase
684.here:
685	unlink    $r14
686	EXPECT    $r14,0x00017566
687
688# LINK->RETURN
689# (This is a nonsense combination, but can still exericse it by
690# using a negative parameter for the link.  "link $r14,-4" leaves
691# $sp exactly unchanged.)
692	ldk.l     $r0,.returnhere
693	push.l    $r0
694	link      $r14,0xfffc
695	return
696.returnhere:
697	EXPECT    $sp,0x00000000
698
699# LPMI->CALLI
700	ldk.l     $r0,k_abcdef01
701	ldk.l     $r1,increment
702	lpmi.l    $r0,$r0,0
703	calli     $r1
704	EXPECT    $r0,0xabcdef02
705
706# STRLen
707	lpm.l     $r4,str3
708	sta.l     tmp,$r4
709	ldk.l     $r0,tmp
710	strlen.b  $r1,$r0
711	EXPECT    $r1,0x00000003
712	strlen.s  $r1,$r0
713	EXPECT    $r1,0x00000003
714	strlen.l  $r1,$r0
715	EXPECT    $r1,0x00000003
716
717	ldk.l     $r4,0
718	sta.b     4,$r4
719	strlen.l  $r1,$r0
720	EXPECT    $r1,0x00000000
721
722	ldk.l     $r4,-1
723	sta.l     4,$r4
724	lpm.l     $r4,str3
725	sta.l     8,$r4
726	strlen.l  $r1,$r0
727	EXPECT    $r1,0x00000007
728
729# MEMSet
730	ldk.l     $r0,4
731	ldk.l     $r1,0xaa
732	memset.s  $r0,$r1,8
733	ldk.l     $r1,0x55
734	memset.b  $r0,$r1,5
735	lda.l     $r0,4
736	EXPECT    $r0,0x55555555
737	lda.l     $r0,8
738	EXPECT    $r0,0xaaaaaa55
739
740# first cycle after mispredict
741	ldk.l     $r0,3
742	cmp.l     $r0,$r0
743	jmpc      nz,failcase
744	add.l     $r0,$r0,7
745	EXPECT    $r0,0x0000000a
746	jmpc      nz,failcase
747	push.l    $r0
748	EXPECT    $sp,0x0000fffc
749	pop.l     $r0
750
751# $sp access after stall
752	lpm.l     $r13,0
753	push.l    $r0
754	EXPECT    $sp,0x0000fffc
755	pop.l     $r0
756
757	push.l    $r0
758	add.l     $sp,$sp,-484
759	EXPECT    $sp,0x0000fe18
760	EXPECT    $sp,0x0000fe18
761	EXPECT    $sp,0x0000fe18
762	add.l     $sp,$sp,484
763	EXPECT    $sp,0x0000fffc
764	pop.l     $r0
765
766# atomic exchange
767	lpm.l     $r0,k_12345678
768	lpm.l     $r1,k_abcdef01
769	sta.l     100,$r1
770	exa.l     $r0,100
771	EXPECT    $r0,0xabcdef01
772	lda.l     $r0,100
773	EXPECT    $r0,0x12345678
774
775	lpm.l     $r0,k_12345678
776	lpm.l     $r1,k_abcdef01
777	sta.l     144,$r1
778	ldk.l     $r7,20
779	exi.l     $r0,$r7,124
780	EXPECT    $r0,0xabcdef01
781	lda.l     $r0,144
782	EXPECT    $r0,0x12345678
783
784	lpm.l     $r0,k_12345678
785	lpm.l     $r1,k_abcdef01
786	push      $r1
787	exi.l     $r0,$sp,0
788	EXPECT    $r0,0xabcdef01
789	pop.l     $r0
790	EXPECT    $r0,0x12345678
791
792# PM write port
793	.equ    PM_UNLOCK,      0x1fc80
794	.equ    PM_ADDR,        0x1fc84
795	.equ    PM_DATA,        0x1fc88
796
797	lpm.l     $r0,k_12345678
798	lpm.l     $r1,k_abcdef01
799	EXPECT    $r0,0x12345678
800	EXPECT    $r1,0xabcdef01
801	ldk.l     $r3,(0x1337f7d1 >> 10)
802	ldl.l     $r3,$r3,(0x1337f7d1 & 0x3ff)
803	EXPECT    $r3,0x1337f7d1
804	ldk	  $r4,k_12345678
805	sta.l     PM_ADDR,$r4
806
807	# write while locked does nothing
808	sta.l	  PM_DATA,$r1
809	sta.l	  PM_DATA,$r0
810	lpm.l     $r0,k_12345678
811	lpm.l     $r1,k_abcdef01
812	EXPECT    $r0,0x12345678
813	EXPECT    $r1,0xabcdef01
814
815	# write while unlocked modifies program memory
816	sta.l	  PM_UNLOCK,$r3
817	sta.l	  PM_DATA,$r1
818	sta.l	  PM_DATA,$r0
819	lpm.l     $r0,k_12345678
820	lpm.l     $r1,k_abcdef01
821	EXPECT    $r0,0xabcdef01
822	EXPECT    $r1,0x12345678
823
824# final stack check
825	EXPECT    $sp,0x00000000
826
827	PASS
828
829# --------------------------------------------------
830
831skip1:          # skip the instruction after the call
832	pop.l     $r1
833	add.l     $r1,$r1,4
834	push.l    $r1
835	return
836
837skipparent:     # skip the instruction after the caller's call
838	ldi.l     $r1,$sp,4
839	add.l     $r1,$r1,4
840	sti.l     $sp,4,$r1
841	return
842skip2:
843	call      skipparent
844	return
845
846add64:
847	addcc.l   $r0,$r1
848	add.l     $r0,$r0,$r1
849	ldk.l     $r1,0
850	jmpc      nc,.done
851	ldk.l     $r1,1
852.done:
853	return
854
855fowia:  # find out where I'm at
856	ldi.l     $r1,$sp,0
857	return
858
859lit:    # load literal to $r0
860	pop.l     $r14
861	lpmi.l    $r0,$r14,0
862	add.l     $r14,$r14,4
863	jmpi      $r14
864zr0:
865	ldk.l     $r0,0
866	return
867litr1:
868	ldi.l     $r1,$sp,0
869	add.l     $r1,$r1,4
870	sti.l     $sp,0,$r1
871	lpmi.l    $r1,$r1,-4
872	return
873
874factorial:
875	ldk.l     $r1,1
876	cmp.l     $r0,$r1
877	jmpc      z,.factdone
878	push.l    $r0
879	add.l     $r0,$r0,-1
880	call      factorial
881	pop.l     $r1
882	mul.l     $r0,$r0,$r1
883.factdone:
884	return
885
886nullfunc:
887	return
888
889increment:
890	add.l     $r0,$r0,1
891	return
892
893	.long   0x10111213
894k_12345678:
895	.long   0x12345678
896k_abcdef01:
897	.long   0xabcdef01
898str3:
899	.string   "abc"
900