1# SPIM S20 MIPS simulator. 2# A torture test for the SPIM simulator. 3# Tests for little-endian systems. 4# Run in conjunction with tt.core.s 5# 6# Copyright (c) 1990-2010, James R. Larus. 7# All rights reserved. 8# 9# Redistribution and use in source and binary forms, with or without modification, 10# are permitted provided that the following conditions are met: 11# 12# Redistributions of source code must retain the above copyright notice, 13# this list of conditions and the following disclaimer. 14# 15# Redistributions in binary form must reproduce the above copyright notice, 16# this list of conditions and the following disclaimer in the documentation and/or 17# other materials provided with the distribution. 18# 19# Neither the name of the James R. Larus nor the names of its contributors may be 20# used to endorse or promote products derived from this software without specific 21# prior written permission. 22# 23# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 24# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 25# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 26# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 27# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 28# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 29# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 30# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 31# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 32# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 33# 34 35 36 .data 37saved_ret_pc: .word 0 # Holds PC to return from main 38m3: .asciiz "The next few lines should contain exception error messages\n" 39m4: .asciiz "Done with exceptions\n\n" 40m5: .asciiz "Expect an address error exception:\n " 41m6: .asciiz "Expect two address error exceptions:\n" 42 .text 43 .globl main 44main: 45 sw $31 saved_ret_pc 46 47 .data 48lb_: .asciiz "Testing LB\n" 49lbd_: .byte 1, -1, 0, 128 50lbd1_: .word 0x76543210, 0xfedcba98 51 .text 52 li $v0 4 # syscall 4 (print_str) 53 la $a0 lb_ 54 syscall 55 56 la $2 lbd_ 57 lb $3 0($2) 58 bne $3 1 fail 59 lb $3 1($2) 60 bne $3 -1 fail 61 lb $3 2($2) 62 bne $3 0 fail 63 lb $3 3($2) 64 bne $3 0xffffff80 fail 65 66 la $t0 lbd1_ 67 lb $t1 0($t0) 68 bne $t1 0x10 fail 69 lb $t1 1($t0) 70 bne $t1 0x32 fail 71 lb $t1 2($t0) 72 bne $t1 0x54 fail 73 lb $t1 3($t0) 74 bne $t1 0x76 fail 75 lb $t1 4($t0) 76 bne $t1 0xffffff98 fail 77 lb $t1 5($t0) 78 bne $t1 0xffffffba fail 79 lb $t1 6($t0) 80 bne $t1 0xffffffdc fail 81 lb $t1 7($t0) 82 bne $t1 0xfffffffe fail 83 84 li $v0 4 # syscall 4 (print_str) 85 la $a0 m5 86 syscall 87 88 li $t5 0x7fffffff 89 lb $3 1000($t5) 90 91 92 .data 93lbu_: .asciiz "Testing LBU\n" 94 .text 95 li $v0 4 # syscall 4 (print_str) 96 la $a0 lbu_ 97 syscall 98 99 la $2 lbd_ 100 lbu $3 0($2) 101 bne $3 1 fail 102 lbu $3 1($2) 103 bne $3 0xff fail 104 lbu $3 2($2) 105 bne $3 0 fail 106 lbu $3 3($2) 107 bne $3 128 fail 108 109 la $t0 lbd1_ 110 lbu $t1 0($t0) 111 bne $t1 0x10 fail 112 lbu $t1 1($t0) 113 bne $t1 0x32 fail 114 lbu $t1 2($t0) 115 bne $t1 0x54 fail 116 lbu $t1 3($t0) 117 bne $t1 0x76 fail 118 lbu $t1 4($t0) 119 bne $t1 0x98 fail 120 lbu $t1 5($t0) 121 bne $t1 0xba fail 122 lbu $t1 6($t0) 123 bne $t1 0xdc fail 124 lbu $t1 7($t0) 125 bne $t1 0xfe fail 126 127 li $v0 4 # syscall 4 (print_str) 128 la $a0 m5 129 syscall 130 131 li $t5 0x7fffffff 132 lbu $3 1000($t5) 133 134 135 .data 136lwl_: .asciiz "Testing LWL\n" 137 .align 2 138lwld_: .byte 0 1 2 3 4 5 6 7 139 .text 140 li $v0 4 # syscall 4 (print_str) 141 la $a0 lwl_ 142 syscall 143 144 la $2 lwld_ 145 move $3 $0 146 lwl $3 0($2) 147 bne $3 0 fail 148 move $3 $0 149 lwl $3 1($2) 150 bne $3 0x01000000 fail 151 li $3 5 152 lwl $3 1($2) 153 bne $3 0x01000005 fail 154 move $3 $0 155 lwl $3 2($2) 156 bne $3 0x02010000 fail 157 li $3 5 158 lwl $3 2($2) 159 bne $3 0x02010005 fail 160 move $3 $0 161 lwl $3 3($2) 162 bne $3 0x03020100 fail 163 li $3 5 164 lwl $3 3($2) 165 bne $3 0x03020100 fail 166 167 li $v0 4 # syscall 4 (print_str) 168 la $a0 m6 169 syscall 170 171 li $t5 0x7fffffff 172 lwl $3 1000($t5) 173 lwl $3 1001($t5) 174 175 176 .data 177lwr_: .asciiz "Testing LWR\n" 178 .align 2 179lwrd_: .byte 0 1 2 3 4 5 6 7 180 .text 181 li $v0 4 # syscall 4 (print_str) 182 la $a0 lwr_ 183 syscall 184 185 la $2 lwrd_ 186 li $3 0x00000500 187 lwr $3 0($2) 188 bne $3 0x3020100 fail 189 move $3 $0 190 lwr $3 1($2) 191 bne $3 0x30201 fail 192 li $3 0x50000000 193 lwr $3 1($2) 194 bne $3 0x50030201 fail 195 move $3 $0 196 lwr $3 2($2) 197 bne $3 0x0302 fail 198 li $3 0x50000000 199 lwr $3 2($2) 200 bne $3 0x50000302 fail 201 202 li $v0 4 # syscall 4 (print_str) 203 la $a0 m6 204 syscall 205 206 li $t5 0x7fffffff 207 lwr $3 1000($t5) 208 lwr $3 1001($t5) 209 210 211 .data 212sb_: .asciiz "Testing SB\n" 213 .align 2 214sbd_: .byte 0, 0, 0, 0 215 .text 216 li $v0 4 # syscall 4 (print_str) 217 la $a0 sb_ 218 syscall 219 220 li $3, 1 221 la $2 sbd_ 222 sb $3 0($2) 223 lw $4 0($2) 224 bne $4 0x1 fail 225 li $3 2 226 sb $3 1($2) 227 lw $4 0($2) 228 bne $4 0x201 fail 229 li $3 3 230 sb $3 2($2) 231 lw $4 0($2) 232 bne $4 0x30201 fail 233 li $3 4 234 sb $3 3($2) 235 lw $4 0($2) 236 bne $4 0x4030201 fail 237 238 239 li $v0 4 # syscall 4 (print_str) 240 la $a0 m5 241 syscall 242 243 li $t5 0x7fffffff 244 sb $3 1000($t5) 245 246 247 .data 248sh_: .asciiz "Testing SH\n" 249sh2_: .asciiz "Expect two address error exceptions:\n" 250 .align 2 251shd_: .byte 0, 0, 0, 0 252 .text 253 li $v0 4 # syscall 4 (print_str) 254 la $a0 sh_ 255 syscall 256 257 li $3, 1 258 la $2 shd_ 259 sh $3 0($2) 260 lw $4 0($2) 261 bne $4 0x1 fail 262 li $3 2 263 sh $3 2($2) 264 lw $4 0($2) 265 bne $4 0x20001 fail 266 267 li $v0 4 # syscall 4 (print_str) 268 la $a0 sh2_ 269 syscall 270 271 li $t5 0x7fffffff 272 sh $3 1000($t5) 273 sh $3 1001($t5) 274 275 276 .data 277swl_: .asciiz "Testing SWL\n" 278 .align 2 279swld_: .word 0 0 280 .text 281 li $v0 4 # syscall 4 (print_str) 282 la $a0 swl_ 283 syscall 284 285 la $2 swld_ 286 li $3 0x01000000 287 swl $3 0($2) 288 lw $4 0($2) 289 bne $4 0x1 fail 290 291 li $3 0x01020000 292 swl $3 1($2) 293 lw $4 0($2) 294 bne $4 0x0102 fail 295 296 li $3 0x01020300 297 swl $3 2($2) 298 lw $4 0($2) 299 bne $4 0x010203 fail 300 301 li $3 0x01020304 302 swl $3 3($2) 303 lw $4 0($2) 304 bne $4 0x01020304 fail 305 306 307 .data 308swr_: .asciiz "Testing SWR\n" 309 .align 2 310swrd_: .word 0 0 311 .text 312 li $v0 4 # syscall 4 (print_str) 313 la $a0 swr_ 314 syscall 315 316 la $2 swrd_ 317 li $3 1 318 swr $3 0($2) 319 lw $4 0($2) 320 bne $4 1 fail 321 322 li $3 0x0102 323 swr $3 1($2) 324 lw $4 0($2) 325 bne $4 0x10201 fail 326 327 li $3 0x010203 328 swr $3 2($2) 329 lw $4 0($2) 330 bne $4 0x2030201 fail 331 332 li $3 0x01020304 333 swr $3 3($2) 334 lw $4 0($2) 335 bne $4 0x4030201 fail 336 337 338 .data 339ulh_: .asciiz "Testing ULH\n" 340ulh1_: .byte 1 2 3 4 5 6 7 8 341ulh2_: .byte 0xff 0xff 342 .text 343 344 li $v0 4 # syscall 4 (print_str) 345 la $a0 ulh_ 346 syscall 347 la $2 ulh1_ 348 ulh $3 0($2) 349 bne $3 0x0201 fail 350 ulh $3 1($2) 351 bne $3 0x0302 fail 352 ulh $3 2($2) 353 bne $3 0x0403 fail 354 ulh $3 3($2) 355 bne $3 0x0504 fail 356 ulh $3 4($2) 357 bne $3 0x0605 fail 358 la $2 ulh2_ 359 ulh $3 0($2) 360 bne $3 -1 fail 361 362 363 .data 364ulhu_: .asciiz "Testing ULHU\n" 365 .text 366 li $v0 4 # syscall 4 (print_str) 367 la $a0 ulhu_ 368 syscall 369 370 li $v0 4 # syscall 4 (print_str) 371 la $a0 ulhu_ 372 syscall 373 la $2 ulh1_ 374 ulhu $3 0($2) 375 bne $3 0x0201 fail 376 ulhu $3 1($2) 377 bne $3 0x0302 fail 378 ulhu $3 2($2) 379 bne $3 0x0403 fail 380 ulhu $3 3($2) 381 bne $3 0x0504 fail 382 ulhu $3 4($2) 383 bne $3 0x0605 fail 384 la $2 ulh2_ 385 ulhu $3 0($2) 386 bne $3 0xffff fail 387 388 389 .data 390ulw_: .asciiz "Testing ULW\n" 391 .text 392 li $v0 4 # syscall 4 (print_str) 393 la $a0 ulw_ 394 syscall 395 396 la $2 ulh1_ 397 ulw $3 0($2) 398 bne $3 0x04030201 fail 399 ulw $3 1($2) 400 bne $3 0x05040302 fail 401 ulw $3 2($2) 402 bne $3 0x06050403 fail 403 ulw $3 3($2) 404 bne $3 0x07060504 fail 405 406 407 .data 408ush_: .asciiz "Testing USH\n" 409ushd: .word 0 0 410 .text 411 li $v0 4 # syscall 4 (print_str) 412 la $a0 ush_ 413 syscall 414 415 la $2 ushd 416 sw $0 0($2) 417 sw $0 4($2) 418 li $3 0x01020304 419 ush $3 0($2) 420 lw $4 0($2) 421 bne $4 0x0304 fail 422 lw $4 4($2) 423 bne $4 0 fail 424 425 sw $0 0($2) 426 sw $0 4($2) 427 li $3 0x01020304 428 ush $3 1($2) 429 lw $4 0($2) 430 bne $4 0x030400 fail 431 lw $4 4($2) 432 bne $4 0 fail 433 434 sw $0 0($2) 435 sw $0 4($2) 436 li $3 0x01020304 437 ush $3 2($2) 438 lw $4 0($2) 439 bne $4 0x03040000 fail 440 lw $4 4($2) 441 bne $4 0 fail 442 443 sw $0 0($2) 444 sw $0 4($2) 445 li $3 0x01020304 446 ush $3 3($2) 447 lw $4 0($2) 448 bne $4 0x04000000 fail 449 lw $4 4($2) 450 bne $4 0x03 fail 451 452 453 .data 454usw_: .asciiz "Testing USW\n" 455 .text 456 li $v0 4 # syscall 4 (print_str) 457 la $a0 usw_ 458 syscall 459 460 la $2 ushd 461 sw $0 0($2) 462 sw $0 4($2) 463 li $3 -1 464 usw $3 0($2) 465 lw $4 0($2) 466 bne $4 -1 fail 467 lw $4 4($2) 468 bne $4 0 fail 469 470 sw $0 0($2) 471 sw $0 4($2) 472 li $3 -1 473 usw $3 1($2) 474 lw $4 0($2) 475 bne $4 0xffffff00 fail 476 lw $4 4($2) 477 bne $4 0xff fail 478 479 sw $0 0($2) 480 sw $0 4($2) 481 li $3 -1 482 usw $3 2($2) 483 lw $4 0($2) 484 bne $4 0xffff0000 fail 485 lw $4 4($2) 486 bne $4 0xffff fail 487 488 sw $0 0($2) 489 sw $0 4($2) 490 li $3 -1 491 usw $3 3($2) 492 lw $4 0($2) 493 bne $4 0xff000000 fail 494 lw $4 4($2) 495 bne $4 0xffffff fail 496 497 498 .data 499word_: .asciiz "Testing .WORD\n" 500 .text 501 li $v0 4 # syscall 4 (print_str) 502 la $a0 word_ 503 syscall 504 505 .data 506 .align 0 507wordd: .byte 0x1 508 .word 0x2345678 509 .word 0x9abcdef 510 .text 511 la $2 wordd 512 lwr $3 1($2) 513 lwl $3 4($2) 514 bne $3 0x2345678 fail 515 lwr $3 5($2) 516 lwl $3 8($2) 517 bne $3 0x9abcdef fail 518 519 .data 520 .byte 0 521x: .word OK # Forward reference in unaligned data! 522 .text 523 lw $8 x 524 beq $8 $0 fail 525OK: 526 527 528# Done !!! 529 .data 530sm: .asciiz "\nPassed all tests\n" 531 .text 532 li $v0 4 # syscall 4 (print_str) 533 la $a0 sm 534 syscall 535 lw $31 saved_ret_pc 536 jr $31 # Return from main 537 538 539 .data 540fm: .asciiz "Failed test\n" 541 .text 542fail: li $v0 4 # syscall 4 (print_str) 543 la $a0 fm 544 syscall 545 li $v0, 10 # syscall 10 (exit) 546 syscall 547