diff options
Diffstat (limited to 'sim/testsuite/mips/utils-dsp.inc')
-rw-r--r-- | sim/testsuite/mips/utils-dsp.inc | 443 |
1 files changed, 443 insertions, 0 deletions
diff --git a/sim/testsuite/mips/utils-dsp.inc b/sim/testsuite/mips/utils-dsp.inc new file mode 100644 index 0000000..936f691 --- /dev/null +++ b/sim/testsuite/mips/utils-dsp.inc @@ -0,0 +1,443 @@ +# MIPS DSP ASE simulator testsuite utility functions. +# Copyright (C) 2005-2021 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 |