| # MIPS simulator instruction tests | |
| sim_init | |
| # Do "run_sim_test TESTFILE MODELS" for each combination of the | |
| # mf{lo,hi} -> mult/div/mt{lo,hi} hazard described in mips.igen. | |
| # Insert NOPS nops after the mflo or mfhi. | |
| proc run_hilo_test {testfile models nops} { | |
| foreach reg {lo hi} { | |
| foreach insn "{mult\t\$4,\$4} {div\t\$0,\$4,\$4} {mt$reg\t\$4}" { | |
| set contents "" | |
| append contents "\t.macro hilo\n" | |
| append contents "\tmf$reg\t\$4\n" | |
| append contents "\t.rept\t$nops\n" | |
| append contents "\tnop\n" | |
| append contents "\t.endr\n" | |
| append contents "\t$insn\n" | |
| append contents "\t.endm" | |
| verbose -log "HILO test:\n$contents" | |
| set file [open hilo-hazard.inc w] | |
| puts $file $contents | |
| close $file | |
| run_sim_test $testfile $models | |
| } | |
| } | |
| } | |
| # Runs micromips tests by adding -mmicromips to as options | |
| proc run_micromips_test { name requested_machs } { | |
| global ASFLAGS_FOR_TARGET | |
| set ASFLAGS_FOR_TARGET "-mmicromips" | |
| run_sim_test $name $requested_machs | |
| unset ASFLAGS_FOR_TARGET | |
| } | |
| # Runs endian tests | |
| proc run_endian_tests { name requested_machs } { | |
| global ASFLAGS_FOR_TARGET | |
| global LDFLAGS_FOR_TARGET | |
| run_sim_test $name $requested_machs | |
| set ASFLAGS_FOR_TARGET "-EL" | |
| set LDFLAGS_FOR_TARGET "-EL" | |
| run_sim_test $name $requested_machs | |
| unset ASFLAGS_FOR_TARGET | |
| unset LDFLAGS_FOR_TARGET | |
| } | |
| # Runs all specified tests | |
| proc run_sim_tests { name requested_machs { requested_micromips_machs "" } } { | |
| run_sim_test $name $requested_machs | |
| run_micromips_test $name $requested_micromips_machs | |
| } | |
| # Runs the combination of instructions removed in R6 through the testsuite | |
| proc run_r6_removed_test {testfile models} { | |
| global subdir srcdir | |
| set fd [open "$srcdir/$subdir/r6-removed.csv" r] | |
| set file_data [read $fd] | |
| close $fd | |
| set data [split $file_data "\n"] | |
| foreach line $data { | |
| set line_contents [split $line ","] | |
| set mnemonic [lindex $line_contents 0] | |
| set insn [lindex $line_contents 1] | |
| if {[string compare $insn ""] == 1} { | |
| set contents "" | |
| append contents ".macro removed_instr\n" | |
| append contents ".word $insn\n" | |
| append contents "nop\n" | |
| append contents ".endm" | |
| verbose -log "r6-removed test: $mnemonic\n$contents" | |
| set file [open r6-removed.inc w] | |
| puts $file $contents | |
| close $file | |
| run_sim_test $testfile $models | |
| } | |
| } | |
| } | |
| if {[istarget *]} { | |
| # Used to locate the `run` program. | |
| global arch | |
| set arch "mips" | |
| set dspmodels "" | |
| set mdmxmodels "" | |
| set micromipsmodels "" | |
| set micromipsdspmodels "" | |
| if {[istarget mipsisa64sb1*-*-elf]} { | |
| set models "sb1" | |
| set submodels "mips1 mips2 mips3 mips4 mips32 mips64" | |
| append mdmxmodels " mips64" | |
| } elseif {[istarget mipsisa64r6*-*-elf]} { | |
| set models "mips32r6 mips64r6" | |
| set submodels "" | |
| } elseif {[istarget mipsisa64*-*-elf]} { | |
| set models "mips32 mips64 mips32r2 mips64r2" | |
| set submodels "mips1 mips2 mips3 mips4" | |
| append dspmodels " mips32r2 mips64r2" | |
| append mdmxmodels " mips64 mips32r2 mips64r2" | |
| } elseif {[istarget mips*-sde-elf*] || [istarget mips*-mti-elf*]} { | |
| set models "mips32 mips64 mips32r2 mips64r2 mips32r6 mips64r6" | |
| set submodels "" | |
| append dspmodels " mips32r2 mips64r2 mips32r6 mips64r6" | |
| append mdmxmodels " mips64 mips32r2 mips64r2 mips32r6 mips64r6" | |
| append micromipsmodels " mips32r2 mips64r2" | |
| append micromipsdspmodels " mips32r2 mips64r2" | |
| } elseif {[istarget mipsisa32r6*-*-elf]} { | |
| set models "mips32r6" | |
| set submodels "" | |
| } elseif {[istarget mipsisa32*-*-elf]} { | |
| set models "mips32 mips32r2" | |
| set submodels "mips1 mips2" | |
| append dspmodels " mips32r2" | |
| append mdmxmodels " mips32r2" | |
| append micromipsmodels " mips32r2" | |
| append micromipsdspmodels " mips32r2" | |
| } elseif {[istarget mips64vr*-*-elf]} { | |
| set models "vr4100 vr4111 vr4120 vr5000 vr5400 vr5500" | |
| set submodels "mips1 mips2 mips3 mips4" | |
| } elseif {[istarget mips64*-*-elf]} { | |
| set models "mips3" | |
| set submodels "mips1 mips2" | |
| } else { | |
| # fall back to just testing mips1 code. | |
| set models "mips1" | |
| set submodels "" | |
| } | |
| append submodels " " $models | |
| set cpu_option -march | |
| run_sim_tests sanity.s $submodels $micromipsmodels | |
| foreach nops {0 1} { | |
| run_hilo_test hilo-hazard-1.s $models $nops | |
| run_hilo_test hilo-hazard-2.s $models $nops | |
| } | |
| run_hilo_test hilo-hazard-3.s $models 2 | |
| run_hilo_test hilo-hazard-4.s $micromipsmodels 2 | |
| run_sim_test fpu64-ps.s $submodels | |
| run_sim_test fpu64-ps-sb1.s $submodels | |
| run_sim_test mdmx-ob.s $mdmxmodels | |
| run_sim_test mdmx-ob-sb1.s $mdmxmodels | |
| run_sim_tests mips32-dsp.s $dspmodels $micromipsdspmodels | |
| run_sim_tests mips32-dsp2.s $dspmodels $micromipsdspmodels | |
| run_sim_test r2-fpu.s $models | |
| run_sim_test r6-fpu.s $models | |
| run_sim_test r6.s $models | |
| run_sim_test r6-forbidden.s $models | |
| run_r6_removed_test r6-removed.s $models | |
| run_sim_test r6-64.s $models | |
| run_sim_test r6-branch.s $models | |
| run_endian_tests r6-llsc-wp.s $models | |
| run_endian_tests r6-llsc-dp.s $models | |
| } |