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
.sv
.trans
.svp64
import SVP64Asm
12 class DecoderTestCase(FHDLTestCase
):
14 def _check_regs(self
, sim
, expected
):
16 self
.assertEqual(sim
.gpr(i
), SelectableInt(expected
[i
], 64))
18 def test_sv_addi_ffirst_le(self
):
19 lst
= SVP64Asm(["sv.subf./ff=le *0,8,*0"
24 svstate
= SVP64State()
26 svstate
.maxvl
= 4 # MAXVL
27 print("SVSTATE", bin(svstate
.asint()))
36 for i
, x
in enumerate(vec
):
39 with
Program(lst
, bigendian
=False) as program
:
40 sim
= self
.run_tst_program(program
, initial_regs
=gprs
,
43 val
= sim
.gpr(i
).value
47 # confirm that the results are as expected
48 expected
= deepcopy(vec
)
51 # calculate expected result and expected CR field
52 result
= vec
[i
] - gprs
[8]
53 crf
= ((result
==0)<<1) |
((result
> 0)<<2) |
((result
< 0) << 3)
57 # VLi=0 - test comes FIRST!
59 # only write out if successful
62 for i
, v
in enumerate(cr_res
):
63 crf
= sim
.crl
[i
].get_range().value
64 print ("crf", i
, res
[i
], bin(crf
), bin(v
))
65 self
.assertEqual(crf
, v
)
67 for i
, v
in enumerate(res
):
68 self
.assertEqual(v
, expected
[i
])
70 self
.assertEqual(sim
.svstate
.vl
, expected_vl
)
71 self
.assertEqual(sim
.svstate
.maxvl
, 4)
72 self
.assertEqual(sim
.svstate
.srcstep
, 0)
73 self
.assertEqual(sim
.svstate
.dststep
, 0)
75 def test_sv_addi_ffirst(self
):
76 lst
= SVP64Asm(["sv.subf./ff=eq *0,8,*0"
81 svstate
= SVP64State()
83 svstate
.maxvl
= 4 # MAXVL
84 print("SVSTATE", bin(svstate
.asint()))
93 for i
, x
in enumerate(vec
):
96 with
Program(lst
, bigendian
=False) as program
:
97 sim
= self
.run_tst_program(program
, initial_regs
=gprs
,
100 val
= sim
.gpr(i
).value
104 # confirm that the results are as expected
105 expected
= deepcopy(vec
)
107 result
= vec
[i
] - gprs
[8]
108 crf
= ((result
==0)<<1) |
((result
> 0)<<2) |
((result
< 0) << 3)
112 # VLi=0 - test comes FIRST!
114 for i
, v
in enumerate(cr_res
):
115 crf
= sim
.crl
[i
].get_range().value
116 print ("crf", i
, res
[i
], bin(crf
), bin(v
))
117 self
.assertEqual(crf
, v
)
119 for i
, v
in enumerate(res
):
120 self
.assertEqual(v
, expected
[i
])
122 self
.assertEqual(sim
.svstate
.vl
, 2)
123 self
.assertEqual(sim
.svstate
.maxvl
, 4)
124 self
.assertEqual(sim
.svstate
.srcstep
, 0)
125 self
.assertEqual(sim
.svstate
.dststep
, 0)
127 def test_sv_addi_ffirst_rc1(self
):
128 lst
= SVP64Asm(["sv.subf/ff=RC1 *0,8,*0" # RC1 auto-sets EQ (and Rc=1)
133 svstate
= SVP64State()
135 svstate
.maxvl
= 4 # MAXVL
136 print("SVSTATE", bin(svstate
.asint()))
144 for i
, x
in enumerate(vec
):
147 with
Program(lst
, bigendian
=False) as program
:
148 sim
= self
.run_tst_program(program
, initial_regs
=gprs
,
151 val
= sim
.gpr(i
).value
154 # confirm that the results are as expected
155 expected
= deepcopy(vec
)
157 result
= expected
[i
] - gprs
[8]
160 # VLi=0 - test comes FIRST!
162 for i
, v
in enumerate(res
):
163 self
.assertEqual(v
, expected
[i
])
165 self
.assertEqual(sim
.svstate
.vl
, 2)
166 self
.assertEqual(sim
.svstate
.maxvl
, 4)
167 self
.assertEqual(sim
.svstate
.srcstep
, 0)
168 self
.assertEqual(sim
.svstate
.dststep
, 0)
170 def test_sv_addi_ffirst_vli(self
):
171 """data-dependent fail-first with VLi=1, the test comes *after* write
173 lst
= SVP64Asm(["sv.subf/ff=RC1/vli *0,8,*0"
178 svstate
= SVP64State()
180 svstate
.maxvl
= 4 # MAXVL
181 print("SVSTATE", bin(svstate
.asint()))
189 for i
, x
in enumerate(vec
):
192 with
Program(lst
, bigendian
=False) as program
:
193 sim
= self
.run_tst_program(program
, initial_regs
=gprs
,
196 val
= sim
.gpr(i
).value
199 # confirm that the results are as expected
200 expected
= deepcopy(vec
)
202 # VLi=1 - test comes AFTER write!
203 expected
[i
] -= gprs
[8]
206 for i
, v
in enumerate(res
):
207 self
.assertEqual(v
, expected
[i
])
209 self
.assertEqual(sim
.svstate
.vl
, 3)
210 self
.assertEqual(sim
.svstate
.maxvl
, 4)
211 self
.assertEqual(sim
.svstate
.srcstep
, 0)
212 self
.assertEqual(sim
.svstate
.dststep
, 0)
214 def run_tst_program(self
, prog
, initial_regs
=None,
218 if initial_regs
is None:
219 initial_regs
= [0] * 32
220 simulator
= run_tst(prog
, initial_regs
, mem
=initial_mem
,
221 initial_fprs
=initial_fprs
,
232 if __name__
== "__main__":