1# Support macros for the sh assembly test cases.
2
3	.equ	no_dsp,  0
4	.equ	yes_dsp, 1
5
6	.section	.rodata
7	.align 2
8_pass:	.string	"pass\n"
9_fail:	.string "fail\n"
10_stack:	.fill	128, 4, 0
11stackt:
12
13	.macro	push reg
14	mov.l	\reg, @-r15
15	.endm
16
17	.macro	pop reg
18	mov.l	@r15+, \reg
19	.endm
20
21	.macro start
22	.text
23	.align 1
24	.global start
25start:	mov.l	stackp, r15
26	bra	main
27	nop
28	.align 2
29stackp:	.long	stackt
30mpass:
31	mov	#4, r4
32	mov	#1, r5
33	mov.l	ppass, r6
34	mov	#5, r7
35	trapa	#34
36	rts
37	nop
38mfail:
39	mov	#4, r4
40	mov	#1, r5
41	mov.l	pfail, r6
42	mov	#5, r7
43	trapa	#34
44	mov	#1, r5
45mexit:
46	mov	#1, r4
47	mov	#0, r6
48	mov	#0, r7
49	trapa	#34
50	.align 2
51ppass:	.long	_pass
52pfail:	.long	_fail
53
54mtesta5:
55	push	r0
56	mov.l	a5a5, r0
57	cmp/eq	r1, r0
58	bf	mfail
59	cmp/eq	r2, r0
60	bf	mfail
61	cmp/eq	r3, r0
62	bf	mfail
63	cmp/eq	r4, r0
64	bf	mfail
65	cmp/eq	r5, r0
66	bf	mfail
67	cmp/eq	r6, r0
68	bf	mfail
69	cmp/eq	r7, r0
70	bf	mfail
71	cmp/eq	r8, r0
72	bf	mfail
73	cmp/eq	r9, r0
74	bf	mfail
75	cmp/eq	r10, r0
76	bf	mfail
77	cmp/eq	r11, r0
78	bf	mfail
79	cmp/eq	r12, r0
80	bf	mfail
81	cmp/eq	r13, r0
82	bf	mfail
83	cmp/eq	r14, r0
84	bf	mfail
85	# restore and check r0
86	pop	r0
87	cmp/eq	r0, r1
88	bf	mfail
89	# pass
90	rts
91	nop
92.if (sim_cpu == no_dsp)
93mtesta5_fp:
94	push	r0
95	flds	fr0, fpul
96	sts	fpul, r0
97	push	r0
98	mov.l	a5a5, r0
99	lds	r0, fpul
100	fsts	fpul, fr0
101	fcmp/eq	fr1, fr0
102	bf	mfail
103	fcmp/eq	fr2, fr0
104	bf	mfail
105	fcmp/eq	fr3, fr0
106	bf	mfail
107	fcmp/eq	fr4, fr0
108	bf	mfail
109	fcmp/eq	fr5, fr0
110	bf	mfail
111	fcmp/eq	fr6, fr0
112	bf	mfail
113	fcmp/eq	fr7, fr0
114	bf	mfail
115	fcmp/eq	fr8, fr0
116	bf	mfail
117	fcmp/eq	fr9, fr0
118	bf	mfail
119	fcmp/eq	fr10, fr0
120	bf	mfail
121	fcmp/eq	fr11, fr0
122	bf	mfail
123	fcmp/eq	fr12, fr0
124	bf	mfail
125	fcmp/eq	fr13, fr0
126	bf	mfail
127	fcmp/eq	fr14, fr0
128	bf	mfail
129	fcmp/eq	fr15, fr0
130	bf	mfail
131	# restore and check fr0
132	pop	r0
133	lds	r0, fpul
134	fsts	fpul, fr0
135	fcmp/eq	fr0, fr1
136	bf	mfail
137	# restore r0 and pass
138	pop	r0
139	rts
140	nop
141.endif
142
143mseta5:
144	mov.l	a5a5, r0
145	mov.l	a5a5, r1
146	mov.l	a5a5, r2
147	mov.l	a5a5, r3
148	mov.l	a5a5, r4
149	mov.l	a5a5, r5
150	mov.l	a5a5, r6
151	mov.l	a5a5, r7
152	mov.l	a5a5, r8
153	mov.l	a5a5, r9
154	mov.l	a5a5, r10
155	mov.l	a5a5, r11
156	mov.l	a5a5, r12
157	mov.l	a5a5, r13
158	mov.l	a5a5, r14
159	rts
160	nop
161
162.if (sim_cpu == no_dsp)
163mseta5_fp:
164	push	r0
165	mov.l	a5a5, r0
166	lds	r0, fpul
167	fsts	fpul, fr0
168	fsts	fpul, fr1
169	fsts	fpul, fr2
170	fsts	fpul, fr3
171	fsts	fpul, fr4
172	fsts	fpul, fr5
173	fsts	fpul, fr6
174	fsts	fpul, fr7
175	fsts	fpul, fr8
176	fsts	fpul, fr9
177	fsts	fpul, fr10
178	fsts	fpul, fr11
179	fsts	fpul, fr12
180	fsts	fpul, fr13
181	fsts	fpul, fr14
182	fsts	fpul, fr15
183	pop	r0
184	rts
185	nop
186.endif
187
188	.align 2
189a5a5:	.long	0xa5a5a5a5
190main:
191	.endm
192
193	.macro exit val
194	mov	#\val, r5
195	bra	mexit
196	nop
197	.endm
198
199	.macro pass
200	bsr	mpass
201	nop
202	.endm
203
204	.macro fail
205	bra	mfail
206	nop
207	.endm
208	# Branch if false -- 8k range
209	.macro bf8k label
210	bt	.Lbf8k\@
211	bra	\label
212.Lbf8k\@:
213	.endm
214
215	# Branch if true -- 8k range
216	.macro bt8k label
217	bf	.Lbt8k\@
218	bra	\label
219.Lbt8k\@:
220	.endm
221
222	# Assert value of register (any general register but r0)
223	# Preserves r0 on stack, restores it on success.
224	.macro assertreg val reg
225	push	r0
226	mov.l	.Larval\@, r0
227	cmp/eq	r0, \reg
228	bt	.Lar\@
229	fail
230	.align 2
231.Larval\@:
232	.long	\val
233.Lar\@:	pop	r0
234	.endm
235
236	# Assert value of register zero
237	# Preserves r1 on stack, restores it on success.
238	.macro assertreg0 val
239	push	r1
240	mov.l	.Lazval\@, r1
241	cmp/eq	r1, r0
242	bt	.Laz\@
243	fail
244	.align 2
245.Lazval\@:
246	.long	\val
247.Laz\@:	pop	r1
248	.endm
249
250	# Assert value of system register
251	# [mach, macl, pr, dsr, a0, x0, x1, y0, y1, ...]
252	.macro assert_sreg val reg
253	push	r0
254	sts	\reg, r0
255	assertreg0 \val
256	pop	r0
257	.endm
258
259	# Assert value of system register that isn't directly stc-able
260	# [a1, m0, m1, ...]
261	.macro assert_sreg2 val reg
262	push	r0
263	sts	a0, r0
264	push	r0
265	pcopy	\reg, a0
266	sts	a0, r0
267	assertreg0 \val
268	pop	r0
269	lds	r0, a0
270	pop	r0
271	.endm
272
273	# Assert value of control register
274	# [gbr, vbr, ssr, spc, sgr, dbr, r[0-7]_bank, sr, mod, re, rs, ...]
275	.macro assert_creg val reg
276	push	r0
277	stc	\reg, r0
278	assertreg0 \val
279	pop	r0
280	.endm
281
282	# Assert integer value of fp register
283	# Preserves r0 on stack, restores it on success
284	# Assumes single-precision fp mode
285	.macro assert_fpreg_i val freg
286	push	r0
287	ftrc	\freg, fpul
288	sts	fpul, r0
289	assertreg0	\val
290	pop	r0
291	.endm
292
293	# Assert integer value of dp register
294	# Preserves r0 on stack, restores it on success
295	# Assumes double-precision fp mode
296	.macro assert_dpreg_i val dreg
297	push	r0
298	ftrc	\dreg, fpul
299	sts	fpul, r0
300	assertreg0	\val
301	pop	r0
302	.endm
303
304	# Assert hex value of fp register
305	# Preserves r0 on stack, restores it on success
306	# Assumes single-precision fp mode
307	.macro assert_fpreg_x val freg
308	push	r0
309	flds	\freg, fpul
310	sts	fpul, r0
311	assertreg0	\val
312	pop	r0
313	.endm
314
315	# Set FP bank 0
316	# Saves and restores r0 and r1
317	.macro	bank0
318	push	r0
319	push	r1
320	mov	#32, r1
321	shll16	r1
322	not	r1, r1
323	sts	fpscr, r0
324	and	r1, r0
325	lds	r0, fpscr
326	pop	r1
327	pop	r0
328	.endm
329
330	# Set FP bank 1
331	.macro	bank1
332	push	r0
333	push	r1
334	mov	#32,  r1
335	shll16	r1
336	sts	fpscr, r0
337	or	r1, r0
338	lds	r0, fpscr
339	pop	r1
340	pop	r0
341	.endm
342
343	# Set FP 32-bit xfer
344	.macro	sz_32
345	push	r0
346	push	r1
347	mov	#16,  r1
348	shll16	r1
349	not	r1, r1
350	sts	fpscr, r0
351	and	r1, r0
352	lds	r0, fpscr
353	pop	r1
354	pop	r0
355	.endm
356
357	# Set FP 64-bit xfer
358	.macro	sz_64
359	push	r0
360	push	r1
361	mov	#16,  r1
362	shll16	r1
363	sts	fpscr, r0
364	or	r1, r0
365	lds	r0, fpscr
366	pop	r1
367	pop	r0
368	.endm
369
370	# Set FP single precision
371	.macro	single_prec
372	push	r0
373	push	r1
374	mov	#8, r1
375	shll16	r1
376	not	r1, r1
377	sts	fpscr, r0
378	and	r1, r0
379	lds	r0, fpscr
380	pop	r1
381	pop	r0
382	.endm
383
384	# Set FP double precision
385	.macro	double_prec
386	push	r0
387	push	r1
388	mov	#8, r1
389	shll16	r1
390	sts	fpscr, r0
391	or	r1, r0
392	lds	r0, fpscr
393	pop	r1
394	pop	r0
395	.endm
396
397	.macro	set_carry
398	sett
399	.endm
400
401	.macro	set_ovf
402	sett
403	.endm
404
405	.macro	clear_carry
406	clrt
407	.endm
408
409	.macro	clear_ovf
410	clrt
411	.endm
412
413	# sets, clrs
414
415
416	.macro set_grs_a5a5
417	bsr	mseta5
418	nop
419	.endm
420
421	.macro set_greg val greg
422	mov.l	gregval\@, \greg
423	bra	set_greg\@
424	nop
425	.align	2
426gregval\@:	.long	\val
427set_greg\@:
428	.endm
429
430	.macro set_fprs_a5a5
431	bsr	mseta5_fp
432	nop
433	.endm
434
435	.macro test_grs_a5a5
436	bsr	mtesta5
437	nop
438	.endm
439
440	.macro test_fprs_a5a5
441	bsr	mtesta5_fp
442	nop
443	.endm
444
445	.macro test_gr_a5a5 reg
446	assertreg 0xa5a5a5a5 \reg
447	.endm
448
449	.macro test_fpr_a5a5 reg
450	assert_fpreg_x 0xa5a5a5a5 \reg
451	.endm
452
453	.macro test_gr0_a5a5
454	assertreg0 0xa5a5a5a5
455	.endm
456
457	# Perform a single to double precision floating point conversion.
458	# Assumes correct settings of fpscr.
459	.macro _s2d fpr dpr
460	flds \fpr, fpul
461	fcnvsd fpul, \dpr
462	.endm
463
464	# Manipulate the status register
465	.macro set_sr	val
466	push	r0
467	mov.l	.Lsrval\@, r0
468	ldc	r0, sr
469	pop	r0
470	bra	.Lsetsr\@
471	nop
472	.align 2
473.Lsrval\@:
474	.long	\val
475.Lsetsr\@:
476	.endm
477
478	.macro	get_sr	reg
479	stc	sr, \reg
480	.endm
481
482	.macro	test_sr val
483	push	r0
484	get_sr	r0
485	assertreg0 \val
486	pop	r0
487	.endm
488
489	.macro	set_sr_bit val
490	push	r0
491	push	r1
492	get_sr	r0
493	mov.l	.Lsrbitval\@, r1
494	or	r1, r0
495	ldc	r0, sr
496	pop	r1
497	pop	r0
498	bra	.Lsrbit\@
499	nop
500	.align 2
501.Lsrbitval\@:
502	.long	\val
503.Lsrbit\@:
504	.endm
505
506	.macro	test_sr_bit_set val
507	push	r0
508	push	r1
509	get_sr	r0
510	mov.l	.Ltsbsval\@, r1
511	tst	r1, r0
512	bf	.Ltsbs\@
513	fail
514	.align	2
515.Ltsbsval\@:
516	.long	\val
517.Ltsbs\@:
518	pop	r1
519	pop	r0
520	.endm
521
522	.macro	test_sr_bit_clear val
523	push	r0
524	push	r1
525	get_sr	r0
526	mov.l	.Ltsbcval\@, r1
527	not	r0, r0
528	tst	r1, r0
529	bf	.Ltsbc\@
530	fail
531	.align	2
532.Ltsbcval\@:
533	.long	\val
534.Ltsbc\@:
535	pop	r1
536	pop	r0
537	.endm
538
539	# Set system registers
540	.macro set_sreg val reg
541	# [mach, macl, pr, dsr, a0, x0, x1, y0, y1, ...]
542	push	r0
543	mov.l	.Lssrval\@, r0
544	lds	r0, \reg
545	pop	r0
546	bra	.Lssr\@
547	nop
548	.align 2
549.Lssrval\@:
550	.long	\val
551.Lssr\@:
552	.endm
553
554	.macro set_sreg2 val reg
555	# [a1, m0, m1, ...]
556	push	r0
557	sts	a0, r0
558	push	r0
559	mov.l	.Lssr2val\@, r0
560	lds	r0, a0
561	pcopy	a0, \reg
562	pop	r0
563	lds	r0, a0
564	pop	r0
565	bra	.Lssr2_\@
566	nop
567	.align 2
568.Lssr2val\@:
569	.long	\val
570.Lssr2_\@:
571	.endm
572
573
574	.macro set_creg val reg
575	# [gbr, vbr, ssr, spc, sgr, dbr... ]
576	push	r0
577	mov.l	.Lscrval\@, r0
578	ldc	r0, \reg
579	pop	r0
580	bra	.Lscr\@
581	nop
582	.align 2
583.Lscrval\@:
584	.long	\val
585.Lscr\@:
586	.endm
587
588	.macro	set_dctrue
589	push	r0
590	sts	dsr, r0
591	or	#1, r0
592	lds	r0, dsr
593	pop	r0
594	.endm
595
596	.macro	set_dcfalse
597	push	r0
598	sts	dsr, r0
599	not	r0, r0
600	or	#1, r0
601	not	r0, r0
602	lds	r0, dsr
603	pop	r0
604	.endm
605
606	.macro	assertmem addr val
607	push	r0
608	mov.l	.Laddr\@, r0
609	mov.l	@r0, r0
610	assertreg0 \val
611	bra	.Lam\@
612	nop
613	.align	2
614.Laddr\@:
615	.long	\addr
616.Lam\@:	pop	r0
617	.endm
618