Home | History | Annotate | Line # | Download | only in sh
      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
     11 stackt:
     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
     25 start:	mov.l	stackp, r15
     26 	bra	main
     27 	nop
     28 	.align 2
     29 stackp:	.long	stackt
     30 mpass:
     31 	mov	#4, r4
     32 	mov	#1, r5
     33 	mov.l	ppass, r6
     34 	mov	#5, r7
     35 	trapa	#34
     36 	rts
     37 	nop
     38 mfail:
     39 	mov	#4, r4
     40 	mov	#1, r5
     41 	mov.l	pfail, r6
     42 	mov	#5, r7
     43 	trapa	#34
     44 	mov	#1, r5
     45 mexit:
     46 	mov	#1, r4
     47 	mov	#0, r6
     48 	mov	#0, r7
     49 	trapa	#34
     50 	.align 2
     51 ppass:	.long	_pass
     52 pfail:	.long	_fail
     53 
     54 mtesta5:
     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)
     93 mtesta5_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 
    143 mseta5:
    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)
    163 mseta5_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
    189 a5a5:	.long	0xa5a5a5a5
    190 main:
    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
    426 gregval\@:	.long	\val
    427 set_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