1# MIPS DSP ASE simulator testsuite utility functions. 2# Copyright (C) 2005-2023 Free Software Foundation, Inc. 3# Contributed by MIPS Technologies, Inc. Written by Chao-ying Fu. 4# 5# This file is part of the GNU simulators. 6# 7# This program is free software; you can redistribute it and/or modify 8# it under the terms of the GNU General Public License as published by 9# the Free Software Foundation; either version 3 of the License, or 10# (at your option) any later version. 11# 12# This program is distributed in the hope that it will be useful, 13# but WITHOUT ANY WARRANTY; without even the implied warranty of 14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15# GNU General Public License for more details. 16# 17# You should have received a copy of the GNU General Public License 18# along with this program. If not, see <http://www.gnu.org/licenses/>. */ 19 20# $4, $5, $6, $7, $ac0, $ac1, $ac2, $ac3 are used as temps by the macros 21# defined here. 22 23 # If a != b, jump to _fail. 24 # Otherwise, fall through. 25 .macro dsp_assert a, b 26 beq \a, \b, 1f 27 nop 28 j _fail 29 nop 301: 31 .endm 32 33 # Set dsp control register <= crin 34 # Check if d == (inst ?, s, t) 35 # Check if crout == dsp control register 36 .macro dspck_dstio inst, d, s, t, crin, crout 37 li $4, \crin 38 wrdsp $4 39 li $4, \s 40 li $5, \t 41 \inst $6, $4, $5 42 li $7, \d 43 dsp_assert $6, $7 44 li $4, \crout 45 rddsp $5 46 dsp_assert $4, $5 47 .endm 48 49 # Set dsp control register <= crin 50 # (inst s, t) 51 # Check if crout == dsp control register 52 .macro dspck_stio inst, s, t, crin, crout 53 li $4, \crin 54 wrdsp $4 55 li $4, \s 56 li $5, \t 57 \inst $4, $5 58 li $4, \crout 59 rddsp $5 60 dsp_assert $4, $5 61 .endm 62 63 # Set dsp control register <= crin 64 # Check if d == (inst ?, s, t) 65 .macro dspck_dsti inst, d, s, t, crin 66 li $4, \crin 67 wrdsp $4 68 li $4, \s 69 li $5, \t 70 \inst $6, $4, $5 71 li $7, \d 72 dsp_assert $6, $7 73 .endm 74 75 # Set dsp control register <= crin 76 # Check if tou == (inst tin, s) 77 .macro dspck_tsi inst, tou, tin, s, crin 78 li $4, \crin 79 wrdsp $4 80 li $4, \s 81 li $5, \tin 82 \inst $5, $4 83 li $6, \tou 84 dsp_assert $5, $6 85 .endm 86 87 # Set dsp control register <= crin 88 # Check if d == (inst ?, imm) 89 # Check if crout == dsp control register 90 .macro dspck_dIio inst, d, imm, crin, crout 91 li $4, \crin 92 wrdsp $4 93 \inst $5, \imm 94 li $6, \d 95 dsp_assert $5, $6 96 li $4, \crout 97 rddsp $5 98 dsp_assert $4, $5 99 .endm 100 101 # Set dsp control register <= crin 102 # Check if d == (inst ?, s) 103 # Check if crout == dsp control register 104 .macro dspck_dsio inst, d, s, crin, crout 105 li $4, \crin 106 wrdsp $4 107 li $4, \s 108 \inst $6, $4 109 li $7, \d 110 dsp_assert $6, $7 111 li $4, \crout 112 rddsp $5 113 dsp_assert $4, $5 114 .endm 115 116 # Set dsp control register <= crin 117 # Check if d == (inst ?, t, sa) 118 # Check if crout == dsp control register 119 .macro dspck_dtsaio inst, d, t, sa, crin, crout 120 li $4, \crin 121 wrdsp $4 122 li $4, \t 123 \inst $6, $4, \sa 124 li $7, \d 125 dsp_assert $6, $7 126 li $4, \crout 127 rddsp $5 128 dsp_assert $4, $5 129 .endm 130 131 # Set dsp control register <= crin 132 # Check if d == (inst ?, t, sa) 133 .macro dspck_dtsai inst, d, t, sa, crin 134 li $4, \crin 135 wrdsp $4 136 li $4, \t 137 \inst $6, $4, \sa 138 li $7, \d 139 dsp_assert $6, $7 140 .endm 141 142 # Set dsp control register <= crin 143 # Set $ac3 <= {hiin, loin} 144 # (inst $ac3, s, t) 145 # Check if {hiou, loou} == $ac3 146 # Check if (crout & 0x80000) == (dsp control register & 0x80000) 147 .macro dspck_astio inst, hiin, loin, hiou, loou, s, t, crin, crout 148 li $4, \crin 149 wrdsp $4 150 li $4, \hiin 151 mthi $4, $ac3 152 li $4, \loin 153 mtlo $4, $ac3 154 li $4, \s 155 li $5, \t 156 \inst $ac3, $4, $5 157 li $4, \hiou 158 mfhi $5, $ac3 159 dsp_assert $4, $5 160 li $4, \loou 161 mflo $5, $ac3 162 dsp_assert $4, $5 163 li $4, \crout 164 and $4, $4, 0x80000 165 rddsp $5 166 and $5, $5, 0x80000 167 dsp_assert $4, $5 168 .endm 169 170 # Set dsp control register <= crin 171 # Set $ac1 <= {hi, lo} 172 # Check if t == (inst ? $ac1, sa) 173 # Check if crout == dsp control register 174 .macro dspck_atsaio inst, hi, lo, t, sa, crin, crout 175 li $4, \crin 176 wrdsp $4 177 li $4, \hi 178 mthi $4, $ac1 179 li $4, \lo 180 mtlo $4, $ac1 181 \inst $5, $ac1, \sa 182 li $6, \t 183 dsp_assert $5, $6 184 li $4, \crout 185 rddsp $5 186 dsp_assert $4, $5 187 .endm 188 189 # Set dsp control register <= crin 190 # Set acc <= {hiin, loin} 191 # (inst acc, s, t) 192 # Check if {hiou, loou} == acc 193 # Check if (crout & 0x80000) == (dsp control register & 0x80000) 194 .macro dspckacc_astio inst, acc, hiin, loin, hiou, loou, s, t, crin, crout 195 li $4, \crin 196 wrdsp $4 197 li $4, \hiin 198 mthi $4, \acc 199 li $4, \loin 200 mtlo $4, \acc 201 li $4, \s 202 li $5, \t 203 \inst \acc, $4, $5 204 li $4, \hiou 205 mfhi $5, \acc 206 dsp_assert $4, $5 207 li $4, \loou 208 mflo $5, \acc 209 dsp_assert $4, $5 210 li $4, \crout 211 and $4, $4, 0x80000 212 rddsp $5 213 and $5, $5, 0x80000 214 dsp_assert $4, $5 215 .endm 216 217 # Set dsp control register <= crin 218 # Set $ac1 <= {hi, lo} 219 # Check if t == (inst ? $ac1, s) 220 # Check if crout == dsp control register 221 .macro dspck_atsio inst, hi, lo, t, s, crin, crout 222 li $4, \crin 223 wrdsp $4 224 li $4, \hi 225 mthi $4, $ac1 226 li $4, \lo 227 mtlo $4, $ac1 228 li $4, \s 229 \inst $5, $ac1, $4 230 li $6, \t 231 dsp_assert $5, $6 232 li $4, \crout 233 rddsp $5 234 dsp_assert $4, $5 235 .endm 236 237 # Set dsp control register <= (crin & crinmask) 238 # Set $ac2 <= {hi, lo} 239 # Check if t == (inst ? $ac2, size) 240 # Check if (crout & croutmask) == (dsp control register & croutmask) 241 .macro dspck_tasiimom inst, hi, lo, t, size, crin, crinmask, crout, croutmask 242 li $4, \crin 243 and $4, \crinmask 244 wrdsp $4 245 li $4, \hi 246 mthi $4, $ac2 247 li $4, \lo 248 mtlo $4, $ac2 249 \inst $5, $ac2, \size 250 li $6, \t 251 dsp_assert $5, $6 252 li $4, \crout 253 and $4, \croutmask 254 rddsp $5 255 and $5, \croutmask 256 dsp_assert $4, $5 257 .endm 258 259 # Set dsp control register <= (crin & crinmask) 260 # Set $ac2 <= {hi, lo} 261 # Check if t == (inst ? $ac2, size) 262 .macro dspck_tasiim inst, hi, lo, t, size, crin, crinmask 263 li $4, \crin 264 and $4, \crinmask 265 wrdsp $4 266 li $4, \hi 267 mthi $4, $ac2 268 li $4, \lo 269 mtlo $4, $ac2 270 \inst $5, $ac2, \size 271 li $6, \t 272 dsp_assert $5, $6 273 .endm 274 275 # Set dsp control register <= (crin & crinmask) 276 # Set $ac2 <= {hi, lo} 277 # Check if t == (inst ? $ac2, s) 278 # Check if (crout & croutmask) == (dsp control register & croutmask) 279 .macro dspck_tasimom inst, hi, lo, t, s, crin, crinmask, crout, croutmask 280 li $4, \crin 281 and $4, \crinmask 282 wrdsp $4 283 li $4, \hi 284 mthi $4, $ac2 285 li $4, \lo 286 mtlo $4, $ac2 287 li $4, \s 288 \inst $5, $ac2, $4 289 li $6, \t 290 dsp_assert $5, $6 291 li $4, \crout 292 and $4, \croutmask 293 rddsp $5 294 and $5, \croutmask 295 dsp_assert $4, $5 296 .endm 297 298 # Set dsp control register <= (crin & crinmask) 299 # Set $ac2 <= {hi, lo} 300 # Check if t == (inst ? $ac2, s) 301 .macro dspck_tasim inst, hi, lo, t, s, crin, crinmask 302 li $4, \crin 303 and $4, \crinmask 304 wrdsp $4 305 li $4, \hi 306 mthi $4, $ac2 307 li $4, \lo 308 mtlo $4, $ac2 309 li $4, \s 310 \inst $5, $ac2, $4 311 li $6, \t 312 dsp_assert $5, $6 313 .endm 314 315 # Set dsp control register <= crin 316 # Set $ac0 <= {hi, lo} 317 # (inst $ac0, shift) 318 # Check if $ac0 == {hio, loo} 319 # Check if crout == dsp control register 320 .macro dspck_asaio inst, hi, lo, hio, loo, shift, crin, crout 321 li $4, \crin 322 wrdsp $4 323 li $4, \hi 324 mthi $4, $ac0 325 li $4, \lo 326 mtlo $4, $ac0 327 \inst $ac0, \shift 328 mfhi $5, $ac0 329 li $6, \hio 330 dsp_assert $5, $6 331 mflo $5, $ac0 332 li $6, \loo 333 dsp_assert $5, $6 334 li $4, \crout 335 rddsp $5 336 dsp_assert $4, $5 337 .endm 338 339 # Set dsp control register <= crin 340 # Set $ac0 <= {hi, lo} 341 # (inst $ac0, s) 342 # Check if $ac0 == {hio, loo} 343 # Check if crout == dsp control register 344 .macro dspck_asio inst, hi, lo, hio, loo, s, crin, crout 345 li $4, \crin 346 wrdsp $4 347 li $4, \hi 348 mthi $4, $ac0 349 li $4, \lo 350 mtlo $4, $ac0 351 li $4, \s 352 \inst $ac0, $4 353 mfhi $5, $ac0 354 li $6, \hio 355 dsp_assert $5, $6 356 mflo $5, $ac0 357 li $6, \loo 358 dsp_assert $5, $6 359 li $4, \crout 360 rddsp $5 361 dsp_assert $4, $5 362 .endm 363 364 # Set dsp control register <= crin 365 # Set $ac3 <= {hi, lo} 366 # Check if s == (inst ? $ac3) 367 # Check if $ac3 == {hio, loo} 368 # Check if crout == dsp control register 369 .macro dspck_saio inst, hi, lo, hio, loo, s, crin, crout 370 li $4, \crin 371 wrdsp $4 372 li $4, \hi 373 mthi $4, $ac3 374 li $4, \lo 375 mtlo $4, $ac3 376 li $5, \s 377 \inst $5, $ac3 378 mfhi $5, $ac3 379 li $6, \hio 380 dsp_assert $5, $6 381 mflo $5, $ac3 382 li $6, \loo 383 dsp_assert $5, $6 384 li $4, \crout 385 rddsp $5 386 dsp_assert $4, $5 387 .endm 388 389 # Set dsp control register <= crin 390 # (wrdsp s, m) 391 # Check if crout == dsp control register 392 .macro dspck_wrdsp s, m, crin, crout 393 li $4, \crin 394 wrdsp $4 395 li $5, \s 396 wrdsp $5, \m 397 li $6, \crout 398 rddsp $7 399 dsp_assert $6, $7 400 .endm 401 402 # Set dsp control register <= crin 403 # Check if d == (rddsp ?, m) 404 .macro dspck_rddsp d, m, crin 405 li $4, \crin 406 wrdsp $4 407 rddsp $5, \m 408 li $6, \d 409 dsp_assert $5, $6 410 .endm 411 412 # Check if d == (inst i(b)) 413 .macro dspck_load inst, d, i, b 414 li $4, \i 415 la $5, \b 416 \inst $6, $4($5) 417 li $7, \d 418 dsp_assert $6, $7 419 .endm 420 421 # Set dsp control register <= crin 422 # Check if bposge32 is taken or not as expected in r 423 # (1 => taken, 0 => not taken) 424 .macro dspck_bposge32 crin, r 425 li $4, \crin 426 wrdsp $4 427 li $5, 1 428 bposge32 1f 429 nop 430 li $5, 0 4311: 432 li $6, \r 433 dsp_assert $5, $6 434 .endm 435 436 # Check if tou == (inst tin, s) 437 .macro dspck_tsimm inst, tou, tin, s, sa 438 li $4, \s 439 li $5, \tin 440 \inst $5, $4, \sa 441 li $6, \tou 442 dsp_assert $5, $6 443 .endm 444