aboutsummaryrefslogtreecommitdiff
path: root/sim/testsuite/mips/utils-dsp.inc
diff options
context:
space:
mode:
Diffstat (limited to 'sim/testsuite/mips/utils-dsp.inc')
-rw-r--r--sim/testsuite/mips/utils-dsp.inc443
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