c371830cf
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 log("sv_maxss test", i
, gpr
[ra
+ i
], gpr
[rb
], CR
[0], int(CR
[0]))
45 gpr
[rt
] = gpr
[ra
+i
] if CR
[0].lt
else gpr
[rb
]
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_1(self
):
59 self
.sv_maxu_ddffirst_single([1,2,3,4], 0)
61 def test_sv_maxu_ddffirst_single_1(self
):
62 self
.sv_maxu_ddffirst_single([3,4,1,0], 2)
64 def test_sv_maxu_ddffirst_single_2(self
):
65 self
.sv_maxu_ddffirst_single([2,9,8,0], 2)
67 def test_sv_maxu_ddffirst_single_3(self
):
68 self
.sv_maxu_ddffirst_single([2,1,3,0], 99999)
70 def sv_maxu_ddffirst_single(self
, ra
, rb
):
71 lst
= SVP64Asm(["sv.minmax./ff=le 4, *10, 4, 1" # scalar RB=RT
76 svstate
= SVP64State()
77 vl
= len(ra
) # VL is length of array ra
79 svstate
.maxvl
= vl
# MAXVL
80 print("SVSTATE", bin(svstate
.asint()))
83 gprs
[4] = rb
# (RT&RB) accumulator in r4
84 for i
, ra
in enumerate(ra
): # vector in ra starts at r10
86 log("maxu ddff", i
, gprs
[10+i
])
91 expected_vl
= sv_maxu(res
, cr_res
, vl
, 10, 4, 4)
92 log("sv_maxu", expected_vl
, cr_res
)
94 with
Program(lst
, bigendian
=False) as program
:
95 sim
= self
.run_tst_program(program
, initial_regs
=gprs
,
98 val
= sim
.gpr(i
).value
102 # confirm that the results are as expected
104 for i
, v
in enumerate(cr_res
[:vl
]):
105 crf
= sim
.crl
[i
].get_range().value
106 log("crf", i
, res
[i
], bin(crf
), bin(int(v
)))
107 self
.assertEqual(crf
, int(v
))
109 for i
, v
in enumerate(res
):
110 self
.assertEqual(v
, res
[i
])
112 self
.assertEqual(sim
.svstate
.vl
, expected_vl
)
113 self
.assertEqual(sim
.svstate
.maxvl
, 4)
114 self
.assertEqual(sim
.svstate
.srcstep
, 0)
115 self
.assertEqual(sim
.svstate
.dststep
, 0)
118 lst
= SVP64Asm(["sv.cmpi/ff=lt 0, 1, *10, 5"
123 svstate
= SVP64State()
126 svstate
.maxvl
= vl
# MAXVL
127 print("SVSTATE", bin(svstate
.asint()))
137 newvl
= sv_cmpi(gprs
, cr_res
, vl
, 10, 5)
138 log("sv_cmpi", newvl
, cr_res
)
140 with
Program(lst
, bigendian
=False) as program
:
141 sim
= self
.run_tst_program(program
, initial_regs
=gprs
,
144 val
= sim
.gpr(i
).value
148 # confirm that the results are as expected
149 expected
= deepcopy(vec
)
152 # calculate expected result and expected CR field
153 result
= vec
[i
] - gprs
[8]
154 crf
= ((result
==0)<<1) |
((result
> 0)<<2) |
((result
< 0) << 3)
158 # VLi=0 - test comes FIRST!
160 # only write out if successful
163 for i
, v
in enumerate(cr_res
):
164 crf
= sim
.crl
[i
].get_range().value
165 print ("crf", i
, res
[i
], bin(crf
), bin(v
))
166 self
.assertEqual(crf
, v
)
168 for i
, v
in enumerate(res
):
169 self
.assertEqual(v
, expected
[i
])
171 self
.assertEqual(sim
.svstate
.vl
, expected_vl
)
172 self
.assertEqual(sim
.svstate
.maxvl
, 4)
173 self
.assertEqual(sim
.svstate
.srcstep
, 0)
174 self
.assertEqual(sim
.svstate
.dststep
, 0)
176 def test_sv_addi_ffirst_le(self
):
177 lst
= SVP64Asm(["sv.subf./ff=le *0,8,*0"
182 svstate
= SVP64State()
184 svstate
.maxvl
= 4 # MAXVL
185 print("SVSTATE", bin(svstate
.asint()))
194 for i
, x
in enumerate(vec
):
197 with
Program(lst
, bigendian
=False) as program
:
198 sim
= self
.run_tst_program(program
, initial_regs
=gprs
,
201 val
= sim
.gpr(i
).value
205 # confirm that the results are as expected
206 expected
= deepcopy(vec
)
209 # calculate expected result and expected CR field
210 result
= vec
[i
] - gprs
[8]
211 crf
= ((result
==0)<<1) |
((result
> 0)<<2) |
((result
< 0) << 3)
215 # VLi=0 - test comes FIRST!
217 # only write out if successful
220 for i
, v
in enumerate(cr_res
):
221 crf
= sim
.crl
[i
].get_range().value
222 print ("crf", i
, res
[i
], bin(crf
), bin(v
))
223 self
.assertEqual(crf
, v
)
225 for i
, v
in enumerate(res
):
226 self
.assertEqual(v
, expected
[i
])
228 self
.assertEqual(sim
.svstate
.vl
, expected_vl
)
229 self
.assertEqual(sim
.svstate
.maxvl
, 4)
230 self
.assertEqual(sim
.svstate
.srcstep
, 0)
231 self
.assertEqual(sim
.svstate
.dststep
, 0)
233 def test_sv_addi_ffirst(self
):
234 lst
= SVP64Asm(["sv.subf./ff=eq *0,8,*0"
239 svstate
= SVP64State()
241 svstate
.maxvl
= 4 # MAXVL
242 print("SVSTATE", bin(svstate
.asint()))
251 for i
, x
in enumerate(vec
):
254 with
Program(lst
, bigendian
=False) as program
:
255 sim
= self
.run_tst_program(program
, initial_regs
=gprs
,
258 val
= sim
.gpr(i
).value
262 # confirm that the results are as expected
263 expected
= deepcopy(vec
)
265 result
= vec
[i
] - gprs
[8]
266 crf
= ((result
==0)<<1) |
((result
> 0)<<2) |
((result
< 0) << 3)
270 # VLi=0 - test comes FIRST!
272 for i
, v
in enumerate(cr_res
):
273 crf
= sim
.crl
[i
].get_range().value
274 print ("crf", i
, res
[i
], bin(crf
), bin(v
))
275 self
.assertEqual(crf
, v
)
277 for i
, v
in enumerate(res
):
278 self
.assertEqual(v
, expected
[i
])
280 self
.assertEqual(sim
.svstate
.vl
, 2)
281 self
.assertEqual(sim
.svstate
.maxvl
, 4)
282 self
.assertEqual(sim
.svstate
.srcstep
, 0)
283 self
.assertEqual(sim
.svstate
.dststep
, 0)
285 def test_sv_addi_ffirst_rc1(self
):
286 lst
= SVP64Asm(["sv.subf/ff=RC1 *0,8,*0" # RC1 auto-sets EQ (and Rc=1)
291 svstate
= SVP64State()
293 svstate
.maxvl
= 4 # MAXVL
294 print("SVSTATE", bin(svstate
.asint()))
302 for i
, x
in enumerate(vec
):
305 with
Program(lst
, bigendian
=False) as program
:
306 sim
= self
.run_tst_program(program
, initial_regs
=gprs
,
309 val
= sim
.gpr(i
).value
312 # confirm that the results are as expected
313 expected
= deepcopy(vec
)
315 result
= expected
[i
] - gprs
[8]
318 # VLi=0 - test comes FIRST!
320 for i
, v
in enumerate(res
):
321 self
.assertEqual(v
, expected
[i
])
323 self
.assertEqual(sim
.svstate
.vl
, 2)
324 self
.assertEqual(sim
.svstate
.maxvl
, 4)
325 self
.assertEqual(sim
.svstate
.srcstep
, 0)
326 self
.assertEqual(sim
.svstate
.dststep
, 0)
328 def test_sv_addi_ffirst_vli(self
):
329 """data-dependent fail-first with VLi=1, the test comes *after* write
331 lst
= SVP64Asm(["sv.subf/ff=RC1/vli *0,8,*0"
336 svstate
= SVP64State()
338 svstate
.maxvl
= 4 # MAXVL
339 print("SVSTATE", bin(svstate
.asint()))
347 for i
, x
in enumerate(vec
):
350 with
Program(lst
, bigendian
=False) as program
:
351 sim
= self
.run_tst_program(program
, initial_regs
=gprs
,
354 val
= sim
.gpr(i
).value
357 # confirm that the results are as expected
358 expected
= deepcopy(vec
)
360 # VLi=1 - test comes AFTER write!
361 expected
[i
] -= gprs
[8]
364 for i
, v
in enumerate(res
):
365 self
.assertEqual(v
, expected
[i
])
367 self
.assertEqual(sim
.svstate
.vl
, 3)
368 self
.assertEqual(sim
.svstate
.maxvl
, 4)
369 self
.assertEqual(sim
.svstate
.srcstep
, 0)
370 self
.assertEqual(sim
.svstate
.dststep
, 0)
372 def run_tst_program(self
, prog
, initial_regs
=None,
376 if initial_regs
is None:
377 initial_regs
= [0] * 32
378 simulator
= run_tst(prog
, initial_regs
, mem
=initial_mem
,
379 initial_fprs
=initial_fprs
,
390 if __name__
== "__main__":