1# MIPS simulator instruction tests
2
3sim_init
4
5# Do "run_sim_test TESTFILE MODELS" for each combination of the
6# mf{lo,hi} -> mult/div/mt{lo,hi} hazard described in mips.igen.
7# Insert NOPS nops after the mflo or mfhi.
8proc run_hilo_test {testfile models nops} {
9    foreach reg {lo hi} {
10	foreach insn "{mult\t\$4,\$4} {div\t\$0,\$4,\$4} {mt$reg\t\$4}" {
11	    set contents ""
12	    append contents "\t.macro hilo\n"
13	    append contents "\tmf$reg\t\$4\n"
14	    append contents "\t.rept\t$nops\n"
15	    append contents "\tnop\n"
16	    append contents "\t.endr\n"
17	    append contents "\t$insn\n"
18	    append contents "\t.endm"
19
20	    verbose -log "HILO test:\n$contents"
21	    set file [open hilo-hazard.inc w]
22	    puts $file $contents
23	    close $file
24
25	    run_sim_test $testfile $models
26	}
27    }
28}
29
30# Runs micromips tests by adding -mmicromips to as options
31proc run_micromips_test { name requested_machs } {
32    global ASFLAGS_FOR_TARGET
33    set ASFLAGS_FOR_TARGET "-mmicromips"
34    run_sim_test $name $requested_machs
35    unset ASFLAGS_FOR_TARGET
36}
37
38# Runs endian tests
39proc run_endian_tests { name requested_machs } {
40    global ASFLAGS_FOR_TARGET
41    global LDFLAGS_FOR_TARGET
42    run_sim_test $name $requested_machs
43    set ASFLAGS_FOR_TARGET "-EL"
44    set LDFLAGS_FOR_TARGET "-EL"
45    run_sim_test $name $requested_machs
46    unset ASFLAGS_FOR_TARGET
47    unset LDFLAGS_FOR_TARGET
48}
49
50# Runs all specified tests
51proc run_sim_tests { name requested_machs { requested_micromips_machs "" } } {
52    run_sim_test $name $requested_machs
53    run_micromips_test $name $requested_micromips_machs
54}
55
56
57# Runs the combination of instructions removed in R6 through the testsuite
58proc run_r6_removed_test {testfile models} {
59    global subdir srcdir
60    set fd [open "$srcdir/$subdir/r6-removed.csv" r]
61    set file_data [read $fd]
62    close $fd
63    set data [split $file_data "\n"]
64    foreach line $data {
65        set line_contents [split $line ","]
66        set mnemonic [lindex $line_contents 0]
67        set insn [lindex $line_contents 1]
68
69        if {[string compare $insn ""] == 1} {
70
71            set contents ""
72            append contents ".macro removed_instr\n"
73            append contents ".word $insn\n"
74            append contents "nop\n"
75            append contents ".endm"
76
77            verbose -log "r6-removed test: $mnemonic\n$contents"
78            set file [open r6-removed.inc w]
79            puts $file $contents
80            close $file
81
82            run_sim_test $testfile $models
83        }
84    }
85}
86
87
88if {[istarget *]} {
89    # Used to locate the `run` program.
90    global arch
91    set arch "mips"
92
93    set dspmodels ""
94    set mdmxmodels ""
95    set micromipsmodels ""
96    set micromipsdspmodels ""
97
98    if {[istarget mipsisa64sb1*-*-elf]} {
99	set models "sb1"
100	set submodels "mips1 mips2 mips3 mips4 mips32 mips64"
101	append mdmxmodels " mips64"
102    } elseif {[istarget mipsisa64r6*-*-elf]} {
103        set models "mips32r6 mips64r6"
104        set submodels ""
105    } elseif {[istarget mipsisa64*-*-elf]} {
106	set models "mips32 mips64 mips32r2 mips64r2"
107	set submodels "mips1 mips2 mips3 mips4"
108	append dspmodels " mips32r2 mips64r2"
109	append mdmxmodels " mips64 mips32r2 mips64r2"
110    } elseif {[istarget mips*-sde-elf*] || [istarget mips*-mti-elf*]} {
111	set models "mips32 mips64 mips32r2 mips64r2 mips32r6 mips64r6"
112	set submodels ""
113	append dspmodels " mips32r2 mips64r2 mips32r6 mips64r6"
114	append mdmxmodels " mips64 mips32r2 mips64r2 mips32r6 mips64r6"
115	append micromipsmodels " mips32r2 mips64r2"
116	append micromipsdspmodels " mips32r2 mips64r2"
117    } elseif {[istarget mipsisa32r6*-*-elf]} {
118        set models "mips32r6"
119        set submodels ""
120    } elseif {[istarget mipsisa32*-*-elf]} {
121	set models "mips32 mips32r2"
122	set submodels "mips1 mips2"
123	append dspmodels " mips32r2"
124	append mdmxmodels " mips32r2"
125	append micromipsmodels " mips32r2"
126	append micromipsdspmodels " mips32r2"
127    } elseif {[istarget mips64vr*-*-elf]} {
128	set models "vr4100 vr4111 vr4120 vr5000 vr5400 vr5500"
129	set submodels "mips1 mips2 mips3 mips4"
130    } elseif {[istarget mips64*-*-elf]} {
131	set models "mips3"
132	set submodels "mips1 mips2"
133    } else {
134	# fall back to just testing mips1 code.
135	set models "mips1"
136	set submodels ""
137    }
138    append submodels " " $models
139    set cpu_option -march
140
141    run_sim_tests sanity.s $submodels $micromipsmodels
142
143    foreach nops {0 1} {
144	run_hilo_test hilo-hazard-1.s $models $nops
145	run_hilo_test hilo-hazard-2.s $models $nops
146    }
147    run_hilo_test hilo-hazard-3.s $models 2
148    run_hilo_test hilo-hazard-4.s $micromipsmodels 2
149
150    run_sim_test fpu64-ps.s $submodels
151    run_sim_test fpu64-ps-sb1.s $submodels
152
153    run_sim_test mdmx-ob.s $mdmxmodels
154    run_sim_test mdmx-ob-sb1.s $mdmxmodels
155
156    run_sim_tests mips32-dsp.s $dspmodels $micromipsdspmodels
157    run_sim_tests mips32-dsp2.s $dspmodels $micromipsdspmodels
158
159    run_sim_test r2-fpu.s $models
160
161    run_sim_test r6-fpu.s $models
162    run_sim_test r6.s $models
163    run_sim_test r6-forbidden.s $models
164    run_r6_removed_test r6-removed.s $models
165    run_sim_test r6-64.s $models
166    run_sim_test r6-branch.s $models
167    run_endian_tests r6-llsc-wp.s $models
168    run_endian_tests r6-llsc-dp.s $models
169}
170