# MIPS DSP ASE simulator testsuite utility functions. # Copyright (C) 2005 MIPS Technologies, Inc. # All rights reserved. # Contributed by Chao-ying Fu (fu@mips.com). # # 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 2, 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, write to the Free Software Foundation, Inc., # 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ # $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 $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