1 """Implementation of FORTRAN MAXLOC SVP64
2 Copyright (C) 2022,2023 Luke Kenneth Casson Leighton <lkcl@lkcl.net>
3 Licensed under the LGPLv3+
4 Funded by NLnet NGI-ASSURE under EU grant agreement No 957073.
5 * https://nlnet.nl/project/Libre-SOC-OpenPOWER-ISA
6 * https://bugs.libre-soc.org/show_bug.cgi?id=676
7 * https://libre-soc.org/openpower/sv/cookbook/fortran_maxloc/
11 from copy
import deepcopy
13 from nmutil
.formaltest
import FHDLTestCase
14 from openpower
.decoder
.isa
.caller
import SVP64State
15 from openpower
.decoder
.isa
.test_caller
import run_tst
16 from openpower
.decoder
.selectable_int
import SelectableInt
17 from openpower
.simulator
.program
import Program
18 from openpower
.insndb
.asm
import SVP64Asm
19 from openpower
.util
import log
20 from openpower
.decoder
.isa
.maxloc
import m2
24 def __init__(self
, value
=0):
25 self
.lt
= (value
>>3) & 0b1
26 self
.gt
= (value
>>2) & 0b1
27 self
.eq
= (value
>>1) & 0b1
29 return "<lt %d gt %d eq %d>" % (self
.lt
, self
.gt
, self
.eq
)
31 return (self
.lt
<<3) |
(self
.gt
<<2) |
(self
.eq
<<1)
34 class CR_Ops_TestCase(FHDLTestCase
):
36 def _check_regs(self
, sim
, expected
):
38 self
.assertEqual(sim
.gpr(i
), SelectableInt(expected
[i
], 64))
40 def test_sv_creqv_1(self
):
41 self
.sv_creqv([0b11,0b100])
43 def tst_sv_maxloc_2(self
):
44 self
.sv_maxloc([3,4,1,5])
46 def tst_sv_maxloc_3(self
):
47 self
.sv_maxloc([2,9,8,0])
49 def tst_sv_maxloc_4(self
):
50 self
.sv_maxloc([2,1,3,0])
52 def sv_creqv(self
, ra
):
57 "sv.creqv *19,*16,*16",
62 svstate
= SVP64State()
65 svstate
.maxvl
= vl
# MAXVL
66 print("SVSTATE", bin(svstate
.asint()))
73 for idx
, crf
in enumerate(ra
):
74 crs
.append(CRfield(crf
))
75 cr |
= crf
<< ((7-idx
)*4)
78 #expected_vl, expected_cr = sv_maxu(res, cr_res, vl, 10, 4, 4)
79 #log("sv_maxu", expected_vl, cr_res)
81 with
Program(lst
, bigendian
=False) as program
:
82 sim
= self
.run_tst_program(program
, initial_regs
=gprs
,
86 crf
= sim
.crl
[i
].get_range().value
87 log("crf", i
, bin(crf
))
89 # confirm that the results are as expected
92 for i
, v
in enumerate(cr_res
[:vl
]):
93 crf
= sim
.crl
[i
].get_range().value
94 log("crf", i
, res
[i
], bin(crf
), bin(int(v
)))
95 self
.assertEqual(crf
, int(v
))
97 def run_tst_program(self
, prog
, initial_regs
=None,
101 if initial_regs
is None:
102 initial_regs
= [0] * 32
103 simulator
= run_tst(prog
, initial_regs
, mem
=initial_mem
,
104 initial_cr
=initial_cr
,
115 if __name__
== "__main__":