blob: 936f691ea0f41184674c6b702ac7a2cc8b505f70 [file] [log] [blame]
# 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