summaryrefslogtreecommitdiff
path: root/sim/testsuite/sim/sh/testutils.inc
blob: 8d3895e2581a792dd5ed2d78fd69bed1b972adc9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
# Support macros for the sh assembly test cases.

	.equ	no_dsp,  0
	.equ	yes_dsp, 1

	.section	.rodata
	.align 2
_pass:	.string	"pass\n"
_fail:	.string "fail\n"
_stack:	.fill	128, 4, 0
stackt:	

	.macro	push reg
	mov.l	\reg, @-r15
	.endm

	.macro	pop reg
	mov.l	@r15+, \reg
	.endm

	.macro start
	.text
	.align 1
	.global start
start:	mov.l	stackp, r15
	bra	main
	nop
	.align 2
stackp:	.long	stackt
mpass:
	mov	#4, r4
	mov	#1, r5
	mov.l	ppass, r6
	mov	#5, r7
	trapa	#34
	rts
	nop
mfail:
	mov	#4, r4
	mov	#1, r5
	mov.l	pfail, r6
	mov	#5, r7
	trapa	#34
	mov	#1, r5
mexit:
	mov	#1, r4
	mov	#0, r6
	mov	#0, r7
	trapa	#34
	.align 2
ppass:	.long	_pass
pfail:	.long	_fail

mtesta5:
	push	r0
	mov.l	a5a5, r0
	cmp/eq	r1, r0
	bf	mfail
	cmp/eq	r2, r0
	bf	mfail
	cmp/eq	r3, r0
	bf	mfail
	cmp/eq	r4, r0
	bf	mfail
	cmp/eq	r5, r0
	bf	mfail
	cmp/eq	r6, r0
	bf	mfail
	cmp/eq	r7, r0
	bf	mfail
	cmp/eq	r8, r0
	bf	mfail
	cmp/eq	r9, r0
	bf	mfail
	cmp/eq	r10, r0
	bf	mfail
	cmp/eq	r11, r0
	bf	mfail
	cmp/eq	r12, r0
	bf	mfail
	cmp/eq	r13, r0
	bf	mfail
	cmp/eq	r14, r0
	bf	mfail
	# restore and check r0
	pop	r0
	cmp/eq	r0, r1
	bf	mfail
	# pass
	rts
	nop
.if (sim_cpu == no_dsp)
mtesta5_fp:
	push	r0
	flds	fr0, fpul
	sts	fpul, r0
	push	r0
	mov.l	a5a5, r0
	lds	r0, fpul
	fsts	fpul, fr0
	fcmp/eq	fr1, fr0
	bf	mfail
	fcmp/eq	fr2, fr0
	bf	mfail
	fcmp/eq	fr3, fr0
	bf	mfail
	fcmp/eq	fr4, fr0
	bf	mfail
	fcmp/eq	fr5, fr0
	bf	mfail
	fcmp/eq	fr6, fr0
	bf	mfail
	fcmp/eq	fr7, fr0
	bf	mfail
	fcmp/eq	fr8, fr0
	bf	mfail
	fcmp/eq	fr9, fr0
	bf	mfail
	fcmp/eq	fr10, fr0
	bf	mfail
	fcmp/eq	fr11, fr0
	bf	mfail
	fcmp/eq	fr12, fr0
	bf	mfail
	fcmp/eq	fr13, fr0
	bf	mfail
	fcmp/eq	fr14, fr0
	bf	mfail
	fcmp/eq	fr15, fr0
	bf	mfail
	# restore and check fr0
	pop	r0
	lds	r0, fpul
	fsts	fpul, fr0
	fcmp/eq	fr0, fr1
	bf	mfail
	# restore r0 and pass
	pop	r0
	rts
	nop
.endif

mseta5:
	mov.l	a5a5, r0
	mov.l	a5a5, r1
	mov.l	a5a5, r2
	mov.l	a5a5, r3
	mov.l	a5a5, r4
	mov.l	a5a5, r5
	mov.l	a5a5, r6
	mov.l	a5a5, r7
	mov.l	a5a5, r8
	mov.l	a5a5, r9
	mov.l	a5a5, r10
	mov.l	a5a5, r11
	mov.l	a5a5, r12
	mov.l	a5a5, r13
	mov.l	a5a5, r14
	rts
	nop

.if (sim_cpu == no_dsp)
mseta5_fp:
	push	r0
	mov.l	a5a5, r0
	lds	r0, fpul
	fsts	fpul, fr0
	fsts	fpul, fr1
	fsts	fpul, fr2
	fsts	fpul, fr3
	fsts	fpul, fr4
	fsts	fpul, fr5
	fsts	fpul, fr6
	fsts	fpul, fr7
	fsts	fpul, fr8
	fsts	fpul, fr9
	fsts	fpul, fr10
	fsts	fpul, fr11
	fsts	fpul, fr12
	fsts	fpul, fr13
	fsts	fpul, fr14
	fsts	fpul, fr15
	pop	r0
	rts
	nop
.endif

	.align 2
a5a5:	.long	0xa5a5a5a5
main:
	.endm

	.macro exit val
	mov	#\val, r5
	bra	mexit
	nop
	.endm

	.macro pass
	bsr	mpass
	nop
	.endm

	.macro fail
	bra	mfail
	nop
	.endm

	# Assert value of register (any general register but r0)
	# Preserves r0 on stack, restores it on success.
	.macro assertreg val reg
	push	r0
	mov.l	.Larval\@, r0
	cmp/eq	r0, \reg
	bt	.Lar\@
	fail
	.align 2
.Larval\@:
	.long	\val
.Lar\@:	pop	r0
	.endm

	# Assert value of register zero
	# Preserves r1 on stack, restores it on success.
	.macro assertreg0 val
	push	r1
	mov.l	.Lazval\@, r1
	cmp/eq	r1, r0
	bt	.Laz\@
	fail
	.align 2
.Lazval\@:
	.long	\val
.Laz\@:	pop	r1
	.endm

	# Assert value of system register 
	# [mach, macl, pr, dsr, a0, x0, x1, y0, y1, ...]
	.macro assert_sreg val reg
	push	r0
	sts	\reg, r0
	assertreg0 \val
	pop	r0
	.endm

	# Assert value of system register that isn't directly stc-able
	# [a1, m0, m1, ...]
	.macro assert_sreg2 val reg
	push	r0
	sts	a0, r0
	push	r0
	pcopy	\reg, a0
	sts	a0, r0
	assertreg0 \val
	pop	r0
	lds	r0, a0
	pop	r0
	.endm

	# Assert value of control register 
	# [gbr, vbr, ssr, spc, sgr, dbr, r[0-7]_bank, sr, mod, re, rs, ...]
	.macro assert_creg val reg
	push	r0
	stc	\reg, r0
	assertreg0 \val
	pop	r0
	.endm

	# Assert integer value of fp register
	# Preserves r0 on stack, restores it on success
	# Assumes single-precision fp mode
	.macro assert_fpreg_i val freg
	push	r0
	ftrc	\freg, fpul
	sts	fpul, r0
	assertreg0	\val
	pop	r0
	.endm

	# Assert integer value of dp register
	# Preserves r0 on stack, restores it on success
	# Assumes double-precision fp mode
	.macro assert_dpreg_i val dreg
	push	r0
	ftrc	\dreg, fpul
	sts	fpul, r0
	assertreg0	\val
	pop	r0
	.endm

	# Assert hex value of fp register
	# Preserves r0 on stack, restores it on success
	# Assumes single-precision fp mode
	.macro assert_fpreg_x val freg
	push	r0
	flds	\freg, fpul
	sts	fpul, r0
	assertreg0	\val
	pop	r0
	.endm

	# Set FP bank 0
	# Saves and restores r0 and r1
	.macro	bank0
	push	r0
	push	r1
	mov	#32, r1
	shll16	r1
	not	r1, r1
	sts	fpscr, r0
	and	r1, r0
	lds	r0, fpscr
	pop	r1
	pop	r0
	.endm

	# Set FP bank 1
	.macro	bank1
	push	r0
	push	r1
	mov	#32,  r1
	shll16	r1
	sts	fpscr, r0
	or	r1, r0
	lds	r0, fpscr
	pop	r1
	pop	r0
	.endm

	# Set FP 32-bit xfer
	.macro	sz_32
	push	r0
	push	r1
	mov	#16,  r1
	shll16	r1
	not	r1, r1
	sts	fpscr, r0
	and	r1, r0
	lds	r0, fpscr
	pop	r1
	pop	r0
	.endm

	# Set FP 64-bit xfer
	.macro	sz_64
	push	r0
	push	r1
	mov	#16,  r1
	shll16	r1
	sts	fpscr, r0
	or	r1, r0
	lds	r0, fpscr
	pop	r1
	pop	r0
	.endm

	# Set FP single precision
	.macro	single_prec
	push	r0
	push	r1
	mov	#8, r1
	shll16	r1
	not	r1, r1
	sts	fpscr, r0
	and	r1, r0
	lds	r0, fpscr
	pop	r1
	pop	r0
	.endm

	# Set FP double precision
	.macro	double_prec
	push	r0
	push	r1
	mov	#8, r1
	shll16	r1
	sts	fpscr, r0
	or	r1, r0
	lds	r0, fpscr
	pop	r1
	pop	r0
	.endm

	.macro	set_carry
	sett
	.endm

	.macro	set_ovf
	sett
	.endm

	.macro	clear_carry
	clrt
	.endm

	.macro	clear_ovf
	clrt
	.endm

	# sets, clrs


	.macro set_grs_a5a5
	bsr	mseta5
	nop
	.endm

	.macro set_greg val greg
	mov.l	gregval\@, \greg
	bra	set_greg\@
	nop
	.align	2
gregval\@:	.long	\val
set_greg\@:
	.endm

	.macro set_fprs_a5a5
	bsr	mseta5_fp
	nop
	.endm

	.macro test_grs_a5a5
	bsr	mtesta5
	nop
	.endm

	.macro test_fprs_a5a5	
	bsr	mtesta5_fp
	nop
	.endm

	.macro test_gr_a5a5 reg
	assertreg 0xa5a5a5a5 \reg
	.endm

	.macro test_fpr_a5a5 reg
	assert_fpreg_x 0xa5a5a5a5 \reg
	.endm

	.macro test_gr0_a5a5
	assertreg0 0xa5a5a5a5
	.endm

	# Perform a single to double precision floating point conversion.
	# Assumes correct settings of fpscr.
	.macro _s2d fpr dpr
	flds \fpr, fpul
	fcnvsd fpul, \dpr
	.endm

	# Manipulate the status register
	.macro set_sr	val
	push	r0
	mov.l	.Lsrval\@, r0
	ldc	r0, sr
	pop	r0
	bra	.Lsetsr\@
	nop
	.align 2
.Lsrval\@:
	.long	\val
.Lsetsr\@:
	.endm

	.macro	get_sr	reg
	stc	sr, \reg
	.endm

	.macro	test_sr val
	push	r0
	get_sr	r0
	assertreg0 \val
	pop	r0
	.endm

	.macro	set_sr_bit val
	push	r0
	push	r1
	get_sr	r0
	mov.l	.Lsrbitval\@, r1
	or	r1, r0
	ldc	r0, sr
	pop	r1
	pop	r0
	bra	.Lsrbit\@
	nop
	.align 2
.Lsrbitval\@:
	.long	\val
.Lsrbit\@:
	.endm

	.macro	test_sr_bit_set val
	push	r0
	push	r1
	get_sr	r0
	mov.l	.Ltsbsval\@, r1
	tst	r1, r0
	bf	.Ltsbs\@
	fail
	.align	2
.Ltsbsval\@:
	.long	\val
.Ltsbs\@:
	pop	r1
	pop	r0
	.endm

	.macro	test_sr_bit_clear val
	push	r0
	push	r1
	get_sr	r0
	mov.l	.Ltsbcval\@, r1
	not	r0, r0
	tst	r1, r0
	bf	.Ltsbc\@
	fail
	.align	2
.Ltsbcval\@:
	.long	\val
.Ltsbc\@:
	pop	r1
	pop	r0
	.endm

	# Set system registers
	.macro set_sreg val reg
	# [mach, macl, pr, dsr, a0, x0, x1, y0, y1, ...]
	push	r0
	mov.l	.Lssrval\@, r0
	lds	r0, \reg
	pop	r0
	bra	.Lssr\@
	nop
	.align 2
.Lssrval\@:
	.long	\val
.Lssr\@:
	.endm

	.macro set_sreg2 val reg
	# [a1, m0, m1, ...]
	push	r0
	sts	a0, r0
	push	r0
	mov.l	.Lssr2val\@, r0
	lds	r0, a0
	pcopy	a0, \reg
	pop	r0
	lds	r0, a0
	pop	r0
	bra	.Lssr2_\@
	nop
	.align 2
.Lssr2val\@:
	.long	\val
.Lssr2_\@:
	.endm


	.macro set_creg val reg
	# [gbr, vbr, ssr, spc, sgr, dbr... ]
	push	r0
	mov.l	.Lscrval\@, r0
	ldc	r0, \reg
	pop	r0
	bra	.Lscr\@
	nop
	.align 2
.Lscrval\@:
	.long	\val
.Lscr\@:
	.endm

	.macro	set_dctrue
	push	r0
	sts	dsr, r0
	or	#1, r0
	lds	r0, dsr
	pop	r0
	.endm

	.macro	set_dcfalse
	push	r0
	sts	dsr, r0
	not	r0, r0
	or	#1, r0
	not	r0, r0
	lds	r0, dsr
	pop	r0
	.endm