f98ba118a0f548681201b674ddbe8554043ee71b
2 from copy
import deepcopy
4 from nmutil
.formaltest
import FHDLTestCase
5 from openpower
.decoder
.isa
.caller
import SVP64State
6 from openpower
.decoder
.isa
.test_caller
import run_tst
7 from openpower
.decoder
.selectable_int
import SelectableInt
8 from openpower
.simulator
.program
import Program
9 from openpower
.insndb
.asm
import SVP64Asm
10 from openpower
.util
import log
15 return "<lt %d gt %d eq %d>" % (self
.lt
, self
.gt
, self
.eq
)
17 return (CRf
.lt
<<3) |
(CRf
.gt
<<2) |
(CRf
.eq
<<1)
25 # example sv.cmpi/ff=lt 0, 1, *10, 5
26 # see https://bugs.libre-soc.org/show_bug.cgi?id=1183#c3
27 def sv_cmpi(gpr
, CR
, vl
, ra
, si
):
30 CR
[i
] = cmpd(gpr
[ra
+ i
], si
)
31 log("sv_cmpi test", i
, gpr
[ra
+ i
], si
, CR
[i
], CR
[i
].lt
)
38 # example sv.cmpi/ff=lt 0, 1, *10, 5
39 # see https://bugs.libre-soc.org/show_bug.cgi?id=1183#c3
40 def sv_maxu(gpr
, CR
, vl
, ra
, rb
, rt
):
43 CR
[0] = cmpd(gpr
[ra
+i
], gpr
[rb
])
44 gpr
[rt
] = gpr
[rb
] if CR
[0].gt
else gpr
[ra
+i
]
45 log("sv_maxss test", i
, gpr
[ra
+ i
], gpr
[rb
+i
], CR
[0], CR
[0].gt
)
52 class DDFFirstTestCase(FHDLTestCase
):
54 def _check_regs(self
, sim
, expected
):
56 self
.assertEqual(sim
.gpr(i
), SelectableInt(expected
[i
], 64))
58 def test_sv_maxu_ddffirst_single(self
):
59 lst
= SVP64Asm(["sv.minmax./ff=le 4, *10, 4, 1" # scalar RB=RT
64 svstate
= SVP64State()
67 svstate
.maxvl
= vl
# MAXVL
68 print("SVSTATE", bin(svstate
.asint()))
71 gprs
[4] = 2 # start (RT&RB) accumulator
72 gprs
[10] = 3 # vector starts here
81 expected_vl
= sv_maxu(res
, cr_res
, vl
, 10, 5, 5)
82 log("sv_maxu", expected_vl
, cr_res
)
84 with
Program(lst
, bigendian
=False) as program
:
85 sim
= self
.run_tst_program(program
, initial_regs
=gprs
,
88 val
= sim
.gpr(i
).value
92 # confirm that the results are as expected
94 for i
, v
in enumerate(cr_res
[:vl
]):
95 crf
= sim
.crl
[i
].get_range().value
96 print ("crf", i
, res
[i
], bin(crf
), bin(int(v
)))
97 self
.assertEqual(crf
, int(v
))
99 for i
, v
in enumerate(res
):
100 self
.assertEqual(v
, res
[i
])
102 self
.assertEqual(sim
.svstate
.vl
, expected_vl
)
103 self
.assertEqual(sim
.svstate
.maxvl
, 4)
104 self
.assertEqual(sim
.svstate
.srcstep
, 0)
105 self
.assertEqual(sim
.svstate
.dststep
, 0)
108 lst
= SVP64Asm(["sv.cmpi/ff=lt 0, 1, *10, 5"
113 svstate
= SVP64State()
116 svstate
.maxvl
= vl
# MAXVL
117 print("SVSTATE", bin(svstate
.asint()))
127 newvl
= sv_cmpi(gprs
, cr_res
, vl
, 10, 5)
128 log("sv_cmpi", newvl
, cr_res
)
130 with
Program(lst
, bigendian
=False) as program
:
131 sim
= self
.run_tst_program(program
, initial_regs
=gprs
,
134 val
= sim
.gpr(i
).value
138 # confirm that the results are as expected
139 expected
= deepcopy(vec
)
142 # calculate expected result and expected CR field
143 result
= vec
[i
] - gprs
[8]
144 crf
= ((result
==0)<<1) |
((result
> 0)<<2) |
((result
< 0) << 3)
148 # VLi=0 - test comes FIRST!
150 # only write out if successful
153 for i
, v
in enumerate(cr_res
):
154 crf
= sim
.crl
[i
].get_range().value
155 print ("crf", i
, res
[i
], bin(crf
), bin(v
))
156 self
.assertEqual(crf
, v
)
158 for i
, v
in enumerate(res
):
159 self
.assertEqual(v
, expected
[i
])
161 self
.assertEqual(sim
.svstate
.vl
, expected_vl
)
162 self
.assertEqual(sim
.svstate
.maxvl
, 4)
163 self
.assertEqual(sim
.svstate
.srcstep
, 0)
164 self
.assertEqual(sim
.svstate
.dststep
, 0)
166 def test_sv_addi_ffirst_le(self
):
167 lst
= SVP64Asm(["sv.subf./ff=le *0,8,*0"
172 svstate
= SVP64State()
174 svstate
.maxvl
= 4 # MAXVL
175 print("SVSTATE", bin(svstate
.asint()))
184 for i
, x
in enumerate(vec
):
187 with
Program(lst
, bigendian
=False) as program
:
188 sim
= self
.run_tst_program(program
, initial_regs
=gprs
,
191 val
= sim
.gpr(i
).value
195 # confirm that the results are as expected
196 expected
= deepcopy(vec
)
199 # calculate expected result and expected CR field
200 result
= vec
[i
] - gprs
[8]
201 crf
= ((result
==0)<<1) |
((result
> 0)<<2) |
((result
< 0) << 3)
205 # VLi=0 - test comes FIRST!
207 # only write out if successful
210 for i
, v
in enumerate(cr_res
):
211 crf
= sim
.crl
[i
].get_range().value
212 print ("crf", i
, res
[i
], bin(crf
), bin(v
))
213 self
.assertEqual(crf
, v
)
215 for i
, v
in enumerate(res
):
216 self
.assertEqual(v
, expected
[i
])
218 self
.assertEqual(sim
.svstate
.vl
, expected_vl
)
219 self
.assertEqual(sim
.svstate
.maxvl
, 4)
220 self
.assertEqual(sim
.svstate
.srcstep
, 0)
221 self
.assertEqual(sim
.svstate
.dststep
, 0)
223 def test_sv_addi_ffirst(self
):
224 lst
= SVP64Asm(["sv.subf./ff=eq *0,8,*0"
229 svstate
= SVP64State()
231 svstate
.maxvl
= 4 # MAXVL
232 print("SVSTATE", bin(svstate
.asint()))
241 for i
, x
in enumerate(vec
):
244 with
Program(lst
, bigendian
=False) as program
:
245 sim
= self
.run_tst_program(program
, initial_regs
=gprs
,
248 val
= sim
.gpr(i
).value
252 # confirm that the results are as expected
253 expected
= deepcopy(vec
)
255 result
= vec
[i
] - gprs
[8]
256 crf
= ((result
==0)<<1) |
((result
> 0)<<2) |
((result
< 0) << 3)
260 # VLi=0 - test comes FIRST!
262 for i
, v
in enumerate(cr_res
):
263 crf
= sim
.crl
[i
].get_range().value
264 print ("crf", i
, res
[i
], bin(crf
), bin(v
))
265 self
.assertEqual(crf
, v
)
267 for i
, v
in enumerate(res
):
268 self
.assertEqual(v
, expected
[i
])
270 self
.assertEqual(sim
.svstate
.vl
, 2)
271 self
.assertEqual(sim
.svstate
.maxvl
, 4)
272 self
.assertEqual(sim
.svstate
.srcstep
, 0)
273 self
.assertEqual(sim
.svstate
.dststep
, 0)
275 def test_sv_addi_ffirst_rc1(self
):
276 lst
= SVP64Asm(["sv.subf/ff=RC1 *0,8,*0" # RC1 auto-sets EQ (and Rc=1)
281 svstate
= SVP64State()
283 svstate
.maxvl
= 4 # MAXVL
284 print("SVSTATE", bin(svstate
.asint()))
292 for i
, x
in enumerate(vec
):
295 with
Program(lst
, bigendian
=False) as program
:
296 sim
= self
.run_tst_program(program
, initial_regs
=gprs
,
299 val
= sim
.gpr(i
).value
302 # confirm that the results are as expected
303 expected
= deepcopy(vec
)
305 result
= expected
[i
] - gprs
[8]
308 # VLi=0 - test comes FIRST!
310 for i
, v
in enumerate(res
):
311 self
.assertEqual(v
, expected
[i
])
313 self
.assertEqual(sim
.svstate
.vl
, 2)
314 self
.assertEqual(sim
.svstate
.maxvl
, 4)
315 self
.assertEqual(sim
.svstate
.srcstep
, 0)
316 self
.assertEqual(sim
.svstate
.dststep
, 0)
318 def test_sv_addi_ffirst_vli(self
):
319 """data-dependent fail-first with VLi=1, the test comes *after* write
321 lst
= SVP64Asm(["sv.subf/ff=RC1/vli *0,8,*0"
326 svstate
= SVP64State()
328 svstate
.maxvl
= 4 # MAXVL
329 print("SVSTATE", bin(svstate
.asint()))
337 for i
, x
in enumerate(vec
):
340 with
Program(lst
, bigendian
=False) as program
:
341 sim
= self
.run_tst_program(program
, initial_regs
=gprs
,
344 val
= sim
.gpr(i
).value
347 # confirm that the results are as expected
348 expected
= deepcopy(vec
)
350 # VLi=1 - test comes AFTER write!
351 expected
[i
] -= gprs
[8]
354 for i
, v
in enumerate(res
):
355 self
.assertEqual(v
, expected
[i
])
357 self
.assertEqual(sim
.svstate
.vl
, 3)
358 self
.assertEqual(sim
.svstate
.maxvl
, 4)
359 self
.assertEqual(sim
.svstate
.srcstep
, 0)
360 self
.assertEqual(sim
.svstate
.dststep
, 0)
362 def run_tst_program(self
, prog
, initial_regs
=None,
366 if initial_regs
is None:
367 initial_regs
= [0] * 32
368 simulator
= run_tst(prog
, initial_regs
, mem
=initial_mem
,
369 initial_fprs
=initial_fprs
,
380 if __name__
== "__main__":