From: Luke Kenneth Casson Leighton Date: Thu, 21 Dec 2023 16:35:38 +0000 (+0000) Subject: bug 676: with messing about got at least an inner maxloc loop working X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=e43a15a157430c7ffd81d76134c1b29f8c038608;p=openpower-isa.git bug 676: with messing about got at least an inner maxloc loop working --- diff --git a/src/openpower/decoder/isa/test_caller_svp64_maxloc.py b/src/openpower/decoder/isa/test_caller_svp64_maxloc.py index eba6370c..03b63067 100644 --- a/src/openpower/decoder/isa/test_caller_svp64_maxloc.py +++ b/src/openpower/decoder/isa/test_caller_svp64_maxloc.py @@ -53,11 +53,11 @@ class DDFFirstTestCase(FHDLTestCase): for i in range(32): self.assertEqual(sim.gpr(i), SelectableInt(expected[i], 64)) - def test_sv_maxloc_1(self): + def tst_sv_maxloc_1(self): self.sv_maxloc([1,2,3,4]) - def tst_sv_maxloc_2(self): - self.sv_maxloc([3,4,1,0]) + def test_sv_maxloc_2(self): + self.sv_maxloc([3,4,1,5]) def tst_sv_maxloc_3(self): self.sv_maxloc([2,9,8,0]) @@ -74,21 +74,25 @@ class DDFFirstTestCase(FHDLTestCase): return nm """ - lst = SVP64Asm(["sv.minmax./ff=le 4, *10, 4, 1" # scalar RB=RT + lst = SVP64Asm([ "mtspr 9, 3", # move r3 to CTR - # VL = MIN(CTR,MAXVL=8) - "setvl 3,0,8,0,1,1", # set MVL=8, VL=MIN(MVL,CTR) + "addi 0, 0, 0", # r0=0 + #"addi 5, 4, 0", # copy m(r4) to r5 + # VL = MIN(CTR,MAXVL=4) + "mtcrf 255,0", # clear CR entirely + "setvl 3,0,4,0,1,1", # set MVL=4, VL=MIN(MVL,CTR) # load VL bytes (update r4 addr) but compressed (dw=8) - "addi 6, 0, 0", # initialise r6 to zero - "sv.lbzu/pi/dw=8 *6, 1(4)", # should be /lf here as well - # gather performs the transpose (which gets us to positional..) - "gbbd 8,6", - # now those bits have been turned around, popcount and sum them - "setvl 0,0,8,0,1,1", # set MVL=VL=8 - "sv.popcntd/sw=8 *24,*8", # do the (now transposed) popcount - "sv.add *16,*16,*24", # and accumulate in results - # branch back if CTR still non-zero. works even though VL=8 - "sv.bc/all 16, *0, -0x28", # reduce CTR by VL and stop if -ve + #"addi 6, 0, 0", # initialise r6 to zero + #"sv.lbzu/pi/dw=8 *6, 1(4)", # should be /lf here as well + # while (ir4 (and dec CTR) ]) lst = list(lst) @@ -100,7 +104,8 @@ class DDFFirstTestCase(FHDLTestCase): print("SVSTATE", bin(svstate.asint())) gprs = [0] * 32 - gprs[4] = rb # (RT&RB) accumulator in r4 + gprs[3] = vl # variable n: to go into CTR + gprs[4] = 0 # variable m: max current number found for i, ra in enumerate(ra): # vector in ra starts at r10 gprs[10+i] = ra log("maxu ddff", i, gprs[10+i]) @@ -108,18 +113,24 @@ class DDFFirstTestCase(FHDLTestCase): cr_res = [0]*8 res = deepcopy(gprs) - expected_vl = sv_maxu(res, cr_res, vl, 10, 4, 4) - log("sv_maxu", expected_vl, cr_res) + #expected_vl, expected_cr = sv_maxu(res, cr_res, vl, 10, 4, 4) + #log("sv_maxu", expected_vl, cr_res) with Program(lst, bigendian=False) as program: sim = self.run_tst_program(program, initial_regs=gprs, svstate=svstate) - for i in range(4): + for i in range(vl): val = sim.gpr(i).value res.append(val) cr_res.append(0) log("i", i, val) + + for i in range(vl): + crf = sim.crl[i].get_range().value + log("crf", i, bin(crf)) + # confirm that the results are as expected + return for i, v in enumerate(cr_res[:vl]): crf = sim.crl[i].get_range().value @@ -129,10 +140,10 @@ class DDFFirstTestCase(FHDLTestCase): for i, v in enumerate(res): self.assertEqual(v, res[i]) - self.assertEqual(sim.svstate.vl, expected_vl) - self.assertEqual(sim.svstate.maxvl, 4) - self.assertEqual(sim.svstate.srcstep, 0) - self.assertEqual(sim.svstate.dststep, 0) + #self.assertEqual(sim.svstate.vl, expected_vl) + #self.assertEqual(sim.svstate.maxvl, 4) + #self.assertEqual(sim.svstate.srcstep, 0) + #self.assertEqual(sim.svstate.dststep, 0) def run_tst_program(self, prog, initial_regs=None, svstate=None,