| # MIPS DSP ASE simulator testsuite utility functions. | 
 | # Copyright (C) 2005-2023 Free Software Foundation, Inc. | 
 | # Contributed by MIPS Technologies, Inc.  Written by Chao-ying Fu. | 
 | # | 
 | # This file is part of the GNU simulators. | 
 | # | 
 | # This program is free software; you can redistribute it and/or modify | 
 | # it under the terms of the GNU General Public License as published by | 
 | # the Free Software Foundation; either version 3 of the License, or | 
 | # (at your option) any later version. | 
 | # | 
 | # This program is distributed in the hope that it will be useful, | 
 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | 
 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
 | # GNU General Public License for more details. | 
 | # | 
 | # You should have received a copy of the GNU General Public License | 
 | # along with this program.  If not, see <http://www.gnu.org/licenses/>.  */ | 
 |  | 
 | # $4, $5, $6, $7, $ac0, $ac1, $ac2, $ac3 are used as temps by the macros | 
 | # defined here. | 
 |  | 
 | 	# If a != b, jump to _fail. | 
 | 	# Otherwise, fall through. | 
 | 	.macro dsp_assert a, b | 
 | 	beq	\a, \b, 1f | 
 | 	nop | 
 | 	j	_fail | 
 | 	nop | 
 | 1:  | 
 | 	.endm | 
 |  | 
 | 	# Set dsp control register <= crin | 
 | 	# Check if d == (inst ?, s, t) | 
 | 	# Check if crout == dsp control register | 
 | 	.macro dspck_dstio inst, d, s, t, crin, crout | 
 | 	li	$4, \crin | 
 | 	wrdsp	$4 | 
 | 	li	$4, \s | 
 | 	li	$5, \t | 
 | 	\inst	$6, $4, $5 | 
 | 	li	$7, \d | 
 | 	dsp_assert	$6, $7 | 
 | 	li	$4, \crout | 
 | 	rddsp	$5 | 
 | 	dsp_assert	$4, $5 | 
 | 	.endm | 
 |  | 
 | 	# Set dsp control register <= crin | 
 | 	# (inst s, t) | 
 | 	# Check if crout == dsp control register | 
 | 	.macro dspck_stio inst, s, t, crin, crout | 
 | 	li	$4, \crin | 
 | 	wrdsp	$4 | 
 | 	li	$4, \s | 
 | 	li	$5, \t | 
 | 	\inst	$4, $5 | 
 | 	li	$4, \crout | 
 | 	rddsp	$5 | 
 | 	dsp_assert	$4, $5 | 
 | 	.endm | 
 |  | 
 | 	# Set dsp control register <= crin | 
 | 	# Check if d == (inst ?, s, t) | 
 | 	.macro dspck_dsti inst, d, s, t, crin | 
 | 	li	$4, \crin | 
 | 	wrdsp	$4 | 
 | 	li	$4, \s | 
 | 	li	$5, \t | 
 | 	\inst	$6, $4, $5 | 
 | 	li	$7, \d | 
 | 	dsp_assert	$6, $7 | 
 | 	.endm | 
 |  | 
 | 	# Set dsp control register <= crin | 
 | 	# Check if tou == (inst tin, s) | 
 | 	.macro dspck_tsi inst, tou, tin, s, crin | 
 | 	li	$4, \crin | 
 | 	wrdsp	$4 | 
 | 	li	$4, \s | 
 | 	li	$5, \tin | 
 | 	\inst	$5, $4 | 
 | 	li	$6, \tou | 
 | 	dsp_assert	$5, $6 | 
 | 	.endm | 
 |  | 
 | 	# Set dsp control register <= crin | 
 | 	# Check if d == (inst ?, imm) | 
 | 	# Check if crout == dsp control register | 
 | 	.macro dspck_dIio inst, d, imm, crin, crout | 
 | 	li	$4, \crin | 
 | 	wrdsp	$4 | 
 | 	\inst	$5, \imm | 
 | 	li	$6, \d | 
 | 	dsp_assert	$5, $6 | 
 | 	li	$4, \crout | 
 | 	rddsp	$5 | 
 | 	dsp_assert	$4, $5 | 
 | 	.endm | 
 |  | 
 | 	# Set dsp control register <= crin | 
 | 	# Check if d == (inst ?, s) | 
 | 	# Check if crout == dsp control register | 
 | 	.macro dspck_dsio inst, d, s, crin, crout | 
 | 	li	$4, \crin | 
 | 	wrdsp	$4 | 
 | 	li	$4, \s | 
 | 	\inst	$6, $4 | 
 | 	li	$7, \d | 
 | 	dsp_assert	$6, $7 | 
 | 	li	$4, \crout | 
 | 	rddsp	$5 | 
 | 	dsp_assert	$4, $5 | 
 | 	.endm | 
 |  | 
 | 	# Set dsp control register <= crin | 
 | 	# Check if d == (inst ?, t, sa) | 
 | 	# Check if crout == dsp control register | 
 | 	.macro dspck_dtsaio inst, d, t, sa, crin, crout | 
 | 	li	$4, \crin | 
 | 	wrdsp	$4 | 
 | 	li	$4, \t | 
 | 	\inst	$6, $4, \sa | 
 | 	li	$7, \d | 
 | 	dsp_assert	$6, $7 | 
 | 	li	$4, \crout | 
 | 	rddsp	$5 | 
 | 	dsp_assert	$4, $5 | 
 | 	.endm | 
 |  | 
 | 	# Set dsp control register <= crin | 
 | 	# Check if d == (inst ?, t, sa) | 
 | 	.macro dspck_dtsai inst, d, t, sa, crin | 
 | 	li	$4, \crin | 
 | 	wrdsp	$4 | 
 | 	li	$4, \t | 
 | 	\inst	$6, $4, \sa | 
 | 	li	$7, \d | 
 | 	dsp_assert	$6, $7 | 
 | 	.endm | 
 |  | 
 | 	# Set dsp control register <= crin | 
 | 	# Set $ac3 <= {hiin, loin} | 
 | 	# (inst $ac3, s, t) | 
 | 	# Check if {hiou, loou} == $ac3 | 
 | 	# Check if (crout & 0x80000) == (dsp control register & 0x80000) | 
 | 	.macro dspck_astio inst, hiin, loin, hiou, loou, s, t, crin, crout | 
 | 	li	$4, \crin | 
 | 	wrdsp	$4 | 
 | 	li	$4, \hiin | 
 | 	mthi	$4, $ac3 | 
 | 	li	$4, \loin | 
 | 	mtlo	$4, $ac3 | 
 | 	li	$4, \s | 
 | 	li	$5, \t | 
 | 	\inst	$ac3, $4, $5 | 
 | 	li	$4, \hiou | 
 | 	mfhi	$5, $ac3 | 
 | 	dsp_assert	$4, $5 | 
 | 	li	$4, \loou | 
 | 	mflo	$5, $ac3 | 
 | 	dsp_assert	$4, $5 | 
 | 	li	$4, \crout | 
 | 	and	$4, $4, 0x80000 | 
 | 	rddsp	$5 | 
 | 	and	$5, $5, 0x80000 | 
 | 	dsp_assert	$4, $5 | 
 | 	.endm | 
 |  | 
 | 	# Set dsp control register <= crin | 
 | 	# Set $ac1 <= {hi, lo} | 
 | 	# Check if t == (inst ? $ac1, sa) | 
 | 	# Check if crout == dsp control register | 
 | 	.macro dspck_atsaio inst, hi, lo, t, sa, crin, crout | 
 | 	li	$4, \crin | 
 | 	wrdsp	$4 | 
 | 	li	$4, \hi | 
 | 	mthi	$4, $ac1 | 
 | 	li	$4, \lo | 
 | 	mtlo	$4, $ac1 | 
 | 	\inst	$5, $ac1, \sa | 
 | 	li	$6, \t | 
 | 	dsp_assert	$5, $6 | 
 | 	li	$4, \crout | 
 | 	rddsp	$5 | 
 | 	dsp_assert	$4, $5 | 
 | 	.endm | 
 |  | 
 | 	# Set dsp control register <= crin | 
 | 	# Set acc <= {hiin, loin} | 
 | 	# (inst acc, s, t) | 
 | 	# Check if {hiou, loou} == acc | 
 | 	# Check if (crout & 0x80000) == (dsp control register & 0x80000) | 
 | 	.macro dspckacc_astio inst, acc, hiin, loin, hiou, loou, s, t, crin, crout | 
 | 	li	$4, \crin | 
 | 	wrdsp	$4 | 
 | 	li	$4, \hiin | 
 | 	mthi	$4, \acc | 
 | 	li	$4, \loin | 
 | 	mtlo	$4, \acc | 
 | 	li	$4, \s | 
 | 	li	$5, \t | 
 | 	\inst	\acc, $4, $5 | 
 | 	li	$4, \hiou | 
 | 	mfhi	$5, \acc | 
 | 	dsp_assert	$4, $5 | 
 | 	li	$4, \loou | 
 | 	mflo	$5, \acc | 
 | 	dsp_assert	$4, $5 | 
 | 	li	$4, \crout | 
 | 	and	$4, $4, 0x80000 | 
 | 	rddsp	$5 | 
 | 	and	$5, $5, 0x80000 | 
 | 	dsp_assert	$4, $5 | 
 | 	.endm | 
 |  | 
 | 	# Set dsp control register <= crin | 
 | 	# Set $ac1 <= {hi, lo} | 
 | 	# Check if t == (inst ? $ac1, s) | 
 | 	# Check if crout == dsp control register | 
 | 	.macro dspck_atsio inst, hi, lo, t, s, crin, crout | 
 | 	li	$4, \crin | 
 | 	wrdsp	$4 | 
 | 	li	$4, \hi | 
 | 	mthi	$4, $ac1 | 
 | 	li	$4, \lo | 
 | 	mtlo	$4, $ac1 | 
 | 	li	$4, \s | 
 | 	\inst	$5, $ac1, $4 | 
 | 	li	$6, \t | 
 | 	dsp_assert	$5, $6 | 
 | 	li	$4, \crout | 
 | 	rddsp	$5 | 
 | 	dsp_assert	$4, $5 | 
 | 	.endm | 
 |  | 
 | 	# Set dsp control register <= (crin & crinmask) | 
 | 	# Set $ac2 <= {hi, lo} | 
 | 	# Check if t == (inst ? $ac2, size) | 
 | 	# Check if (crout & croutmask) == (dsp control register & croutmask) | 
 | 	.macro dspck_tasiimom inst, hi, lo, t, size, crin, crinmask, crout, croutmask | 
 | 	li	$4, \crin | 
 | 	and	$4, \crinmask | 
 | 	wrdsp	$4 | 
 | 	li	$4, \hi | 
 | 	mthi	$4, $ac2 | 
 | 	li	$4, \lo | 
 | 	mtlo	$4, $ac2 | 
 | 	\inst	$5, $ac2, \size | 
 | 	li	$6, \t | 
 | 	dsp_assert	$5, $6 | 
 | 	li	$4, \crout | 
 | 	and	$4, \croutmask | 
 | 	rddsp	$5 | 
 | 	and	$5, \croutmask | 
 | 	dsp_assert	$4, $5 | 
 | 	.endm | 
 |  | 
 | 	# Set dsp control register <= (crin & crinmask) | 
 | 	# Set $ac2 <= {hi, lo} | 
 | 	# Check if t == (inst ? $ac2, size) | 
 | 	.macro dspck_tasiim inst, hi, lo, t, size, crin, crinmask | 
 | 	li	$4, \crin | 
 | 	and	$4, \crinmask | 
 | 	wrdsp	$4 | 
 | 	li	$4, \hi | 
 | 	mthi	$4, $ac2 | 
 | 	li	$4, \lo | 
 | 	mtlo	$4, $ac2 | 
 | 	\inst	$5, $ac2, \size | 
 | 	li	$6, \t | 
 | 	dsp_assert	$5, $6 | 
 | 	.endm | 
 |  | 
 | 	# Set dsp control register <= (crin & crinmask) | 
 | 	# Set $ac2 <= {hi, lo} | 
 | 	# Check if t == (inst ? $ac2, s) | 
 | 	# Check if (crout & croutmask) == (dsp control register & croutmask) | 
 | 	.macro dspck_tasimom inst, hi, lo, t, s, crin, crinmask, crout, croutmask | 
 | 	li	$4, \crin | 
 | 	and	$4, \crinmask | 
 | 	wrdsp	$4 | 
 | 	li	$4, \hi | 
 | 	mthi	$4, $ac2 | 
 | 	li	$4, \lo | 
 | 	mtlo	$4, $ac2 | 
 | 	li	$4, \s | 
 | 	\inst	$5, $ac2, $4 | 
 | 	li	$6, \t | 
 | 	dsp_assert	$5, $6 | 
 | 	li	$4, \crout | 
 | 	and	$4, \croutmask | 
 | 	rddsp	$5 | 
 | 	and	$5, \croutmask | 
 | 	dsp_assert	$4, $5 | 
 | 	.endm | 
 |  | 
 | 	# Set dsp control register <= (crin & crinmask) | 
 | 	# Set $ac2 <= {hi, lo} | 
 | 	# Check if t == (inst ? $ac2, s) | 
 | 	.macro dspck_tasim inst, hi, lo, t, s, crin, crinmask | 
 | 	li	$4, \crin | 
 | 	and	$4, \crinmask | 
 | 	wrdsp	$4 | 
 | 	li	$4, \hi | 
 | 	mthi	$4, $ac2 | 
 | 	li	$4, \lo | 
 | 	mtlo	$4, $ac2 | 
 | 	li	$4, \s | 
 | 	\inst	$5, $ac2, $4 | 
 | 	li	$6, \t | 
 | 	dsp_assert	$5, $6 | 
 | 	.endm | 
 |  | 
 | 	# Set dsp control register <= crin | 
 | 	# Set $ac0 <= {hi, lo} | 
 | 	# (inst $ac0, shift) | 
 | 	# Check if $ac0 == {hio, loo} | 
 | 	# Check if crout == dsp control register | 
 | 	.macro dspck_asaio inst, hi, lo, hio, loo, shift, crin, crout | 
 | 	li	$4, \crin | 
 | 	wrdsp	$4 | 
 | 	li	$4, \hi | 
 | 	mthi	$4, $ac0 | 
 | 	li	$4, \lo | 
 | 	mtlo	$4, $ac0 | 
 | 	\inst	$ac0, \shift | 
 | 	mfhi	$5, $ac0 | 
 | 	li	$6, \hio | 
 | 	dsp_assert	$5, $6 | 
 | 	mflo	$5, $ac0 | 
 | 	li	$6, \loo | 
 | 	dsp_assert	$5, $6 | 
 | 	li	$4, \crout | 
 | 	rddsp	$5 | 
 | 	dsp_assert	$4, $5 | 
 | 	.endm | 
 |  | 
 | 	# Set dsp control register <= crin | 
 | 	# Set $ac0 <= {hi, lo} | 
 | 	# (inst $ac0, s) | 
 | 	# Check if $ac0 == {hio, loo} | 
 | 	# Check if crout == dsp control register | 
 | 	.macro dspck_asio inst, hi, lo, hio, loo, s, crin, crout | 
 | 	li	$4, \crin | 
 | 	wrdsp	$4 | 
 | 	li	$4, \hi | 
 | 	mthi	$4, $ac0 | 
 | 	li	$4, \lo | 
 | 	mtlo	$4, $ac0 | 
 | 	li	$4, \s | 
 | 	\inst	$ac0, $4 | 
 | 	mfhi	$5, $ac0 | 
 | 	li	$6, \hio | 
 | 	dsp_assert	$5, $6 | 
 | 	mflo	$5, $ac0 | 
 | 	li	$6, \loo | 
 | 	dsp_assert	$5, $6 | 
 | 	li	$4, \crout | 
 | 	rddsp	$5 | 
 | 	dsp_assert	$4, $5 | 
 | 	.endm | 
 |  | 
 | 	# Set dsp control register <= crin | 
 | 	# Set $ac3 <= {hi, lo} | 
 | 	# Check if s == (inst ? $ac3) | 
 | 	# Check if $ac3 == {hio, loo} | 
 | 	# Check if crout == dsp control register | 
 | 	.macro dspck_saio inst, hi, lo, hio, loo, s, crin, crout | 
 | 	li	$4, \crin | 
 | 	wrdsp	$4 | 
 | 	li	$4, \hi | 
 | 	mthi	$4, $ac3 | 
 | 	li	$4, \lo | 
 | 	mtlo	$4, $ac3 | 
 | 	li	$5, \s | 
 | 	\inst	$5, $ac3 | 
 | 	mfhi	$5, $ac3 | 
 | 	li	$6, \hio | 
 | 	dsp_assert	$5, $6 | 
 | 	mflo	$5, $ac3 | 
 | 	li	$6, \loo | 
 | 	dsp_assert	$5, $6 | 
 | 	li	$4, \crout | 
 | 	rddsp	$5 | 
 | 	dsp_assert	$4, $5 | 
 | 	.endm | 
 |  | 
 | 	# Set dsp control register <= crin | 
 | 	# (wrdsp s, m) | 
 | 	# Check if crout == dsp control register | 
 | 	.macro dspck_wrdsp s, m, crin, crout | 
 | 	li	$4, \crin | 
 | 	wrdsp	$4 | 
 | 	li	$5, \s | 
 | 	wrdsp	$5, \m | 
 | 	li	$6, \crout | 
 | 	rddsp	$7 | 
 | 	dsp_assert	$6, $7 | 
 | 	.endm | 
 |  | 
 | 	# Set dsp control register <= crin | 
 | 	# Check if d == (rddsp ?, m) | 
 | 	.macro dspck_rddsp d, m, crin | 
 | 	li	$4, \crin | 
 | 	wrdsp	$4 | 
 | 	rddsp	$5, \m | 
 | 	li	$6, \d | 
 | 	dsp_assert	$5, $6 | 
 | 	.endm | 
 |  | 
 | 	# Check if d == (inst i(b)) | 
 | 	.macro dspck_load inst, d, i, b | 
 | 	li	$4, \i | 
 | 	la	$5, \b | 
 | 	\inst	$6, $4($5) | 
 | 	li	$7, \d | 
 | 	dsp_assert	$6, $7 | 
 | 	.endm | 
 |  | 
 | 	# Set dsp control register <= crin | 
 | 	# Check if bposge32 is taken or not as expected in r | 
 | 	# (1 => taken, 0 => not taken) | 
 | 	.macro dspck_bposge32 crin, r | 
 | 	li	$4, \crin | 
 | 	wrdsp	$4 | 
 | 	li	$5, 1 | 
 | 	bposge32	1f | 
 | 	nop | 
 | 	li	$5, 0 | 
 | 1: | 
 | 	li	$6, \r | 
 | 	dsp_assert	$5, $6 | 
 | 	.endm | 
 |  | 
 | 	# Check if tou == (inst tin, s) | 
 | 	.macro dspck_tsimm inst, tou, tin, s, sa | 
 | 	li	$4, \s | 
 | 	li	$5, \tin | 
 | 	\inst	$5, $4, \sa | 
 | 	li	$6, \tou | 
 | 	dsp_assert	$5, $6 | 
 | 	.endm |