pysvp64asm: integrate into insndb
authorDmitry Selyutin <ghostmansd@gmail.com>
Fri, 2 Jun 2023 16:23:02 +0000 (19:23 +0300)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Fri, 22 Dec 2023 19:26:19 +0000 (19:26 +0000)
39 files changed:
setup.py
src/openpower/decoder/isa/test_caller_setvl.py
src/openpower/decoder/isa/test_caller_svindex.py
src/openpower/decoder/isa/test_caller_svp64.py
src/openpower/decoder/isa/test_caller_svp64_bc.py
src/openpower/decoder/isa/test_caller_svp64_chacha20.py
src/openpower/decoder/isa/test_caller_svp64_dct.py
src/openpower/decoder/isa/test_caller_svp64_dd_ffirst.py
src/openpower/decoder/isa/test_caller_svp64_fft.py
src/openpower/decoder/isa/test_caller_svp64_fp.py
src/openpower/decoder/isa/test_caller_svp64_inssort.py
src/openpower/decoder/isa/test_caller_svp64_ldst.py
src/openpower/decoder/isa/test_caller_svp64_mapreduce.py
src/openpower/decoder/isa/test_caller_svp64_matrix.py
src/openpower/decoder/isa/test_caller_svp64_pack.py
src/openpower/decoder/isa/test_caller_svp64_parallel_reduce.py
src/openpower/decoder/isa/test_caller_svp64_predication.py
src/openpower/decoder/isa/test_caller_svp64_subvl.py
src/openpower/decoder/isa/test_caller_svshape2.py
src/openpower/decoder/isa/test_caller_svstate.py
src/openpower/decoder/isa/test_caller_transcendentals.py
src/openpower/insndb/asm.py [new file with mode: 0644]
src/openpower/sv/trans/svp64.py [deleted file]
src/openpower/sv/trans/test_pysvp64dis.py
src/openpower/sv/trans/test_pysvp64dis_branch.py
src/openpower/test/algorithms/svp64_utf_8_validation.py
src/openpower/test/alu/fmvis_cases.py
src/openpower/test/alu/maddsubrs_cases.py
src/openpower/test/alu/svp64_cases.py
src/openpower/test/bigint/bigint_cases.py
src/openpower/test/bigint/shadd_cases.py
src/openpower/test/bitmanip/av_cases.py
src/openpower/test/bitmanip/bitmanip_cases.py
src/openpower/test/fmv_fcvt/fmv_fcvt.py
src/openpower/test/fptrans/fptrans_cases.py
src/openpower/test/logical/svp64_cases.py
src/openpower/test/mul/mul_cases.py
src/openpower/test/prefix_codes/prefix_codes_cases.py
src/openpower/test/svp64/parallel_prefix_sum.py

index 58a7ec32ec65d50bc838b8502860564310842a23..304b2c95b1ccff2579e74a719f14fae5df8d0afb 100644 (file)
--- a/setup.py
+++ b/setup.py
@@ -82,7 +82,7 @@ setup(
             'pyfnwriter=openpower.decoder.pseudo.pyfnwriter:pyfnwriter',
             'sv_analysis=openpower.sv.sv_analysis:main',
             'pypowersim=openpower.decoder.isa.pypowersim:run_simulation',
-            'pysvp64asm=openpower.sv.trans.svp64:asm_process',
+            'pysvp64asm=openpower.insndb.asm:main',
             'pysvp64dis=openpower.sv.trans.pysvp64dis:main'
         ]
     }
index 163a5afe6d68293da4d2fe29b8abdca144f83cfe..a0661aa136d90bb354fc9adf5d15505ee06c8929 100644 (file)
@@ -6,7 +6,7 @@ from openpower.decoder.isa.caller import CRFields, SVP64State
 from openpower.decoder.isa.test_caller import run_tst
 from openpower.decoder.selectable_int import SelectableInt
 from openpower.simulator.program import Program
-from openpower.sv.trans.svp64 import SVP64Asm
+from openpower.insndb.asm import SVP64Asm
 
 
 class DecoderTestCase(FHDLTestCase):
index e33ad652521c28bcfd838cc04814198def984df8..2c479c2f2e445eaba9b70ccb085603802697a72d 100644 (file)
@@ -9,7 +9,7 @@ from openpower.decoder.isa.caller import SVP64State, set_masked_reg
 from openpower.decoder.isa.test_caller import run_tst
 from openpower.decoder.selectable_int import SelectableInt
 from openpower.simulator.program import Program
-from openpower.sv.trans.svp64 import SVP64Asm
+from openpower.insndb.asm import SVP64Asm
 
 
 class SVSTATETestCase(FHDLTestCase):
index e5ef3f39ac6cd41af326248516d701568908aafa..e38ba963b4ba97142f0d3ee43b3def33c0bf8b5e 100644 (file)
@@ -7,7 +7,7 @@ from openpower.decoder.isa.caller import SVP64State
 from openpower.decoder.isa.test_caller import run_tst
 from openpower.decoder.selectable_int import SelectableInt
 from openpower.simulator.program import Program
-from openpower.sv.trans.svp64 import SVP64Asm
+from openpower.insndb.asm import SVP64Asm
 
 
 class DecoderTestCase(FHDLTestCase):
index 159f08a2f42417211868063ea9e2404f1da29ce1..23ba3b00b08244d5ec6d2d0d822ca03d48794309 100644 (file)
@@ -7,7 +7,7 @@ from openpower.decoder.isa.caller import SVP64State
 from openpower.decoder.isa.test_caller import run_tst
 from openpower.decoder.selectable_int import SelectableInt
 from openpower.simulator.program import Program
-from openpower.sv.trans.svp64 import SVP64Asm
+from openpower.insndb.asm import SVP64Asm
 
 
 class DecoderTestCase(FHDLTestCase):
index 11ea2a08b95692865a64bf4b8479da492a7d81e7..0a0feac1ef5c249addc677fed782cb1a22f47c4d 100644 (file)
@@ -9,7 +9,7 @@ from openpower.decoder.isa.caller import SVP64State, set_masked_reg
 from openpower.decoder.isa.test_caller import run_tst
 from openpower.decoder.selectable_int import SelectableInt
 from openpower.simulator.program import Program
-from openpower.sv.trans.svp64 import SVP64Asm
+from openpower.insndb.asm import SVP64Asm
 
 
 # originally from https://github.com/pts/chacha20
index 940724f9996d2f417b42d4a6a20bc61e355be7d1..581b35223e06ebc6d44e160bb1b7695536c367d0 100644 (file)
@@ -12,7 +12,7 @@ from openpower.decoder.isafunctions.double2single import (
         ISACallerFnHelper_double2single)
 from openpower.decoder.selectable_int import SelectableInt
 from openpower.simulator.program import Program
-from openpower.sv.trans.svp64 import SVP64Asm
+from openpower.insndb.asm import SVP64Asm
 
 # really bad hack.  need to access the DOUBLE2SINGLE function auto-generated
 # from pseudo-code.
index c9e98e48478ececf463979f730c11a7765315664..666db4d2c346c7010d3c3ea6a1d82f9e0579c304 100644 (file)
@@ -6,7 +6,7 @@ from openpower.decoder.isa.caller import SVP64State
 from openpower.decoder.isa.test_caller import run_tst
 from openpower.decoder.selectable_int import SelectableInt
 from openpower.simulator.program import Program
-from openpower.sv.trans.svp64 import SVP64Asm
+from openpower.insndb.asm import SVP64Asm
 
 
 class DecoderTestCase(FHDLTestCase):
index fceb6b38f7fb98164a961905590ecbc0c687c641..bc201c316fac0c6b0ed1ac8b9b28431f5f2d4b95 100644 (file)
@@ -8,7 +8,7 @@ from openpower.decoder.isafunctions.double2single import (
             ISACallerFnHelper_double2single)
 from openpower.decoder.selectable_int import SelectableInt
 from openpower.simulator.program import Program
-from openpower.sv.trans.svp64 import SVP64Asm
+from openpower.insndb.asm import SVP64Asm
 
 # really bad hack.  need to access the DOUBLE2SINGLE function auto-generated
 # from pseudo-code.
index 703e95ab6b47b66709f2197bb092df2c15dc5e14..920b21ad740860496e33e7e25368b556b0b18bcb 100644 (file)
@@ -5,7 +5,7 @@ from openpower.decoder.isa.caller import SVP64State
 from openpower.decoder.isa.test_caller import run_tst
 from openpower.decoder.selectable_int import SelectableInt
 from openpower.simulator.program import Program
-from openpower.sv.trans.svp64 import SVP64Asm
+from openpower.insndb.asm import SVP64Asm
 
 
 class DecoderTestCase(FHDLTestCase):
index 86e706bbdbe4a09563ca97ef6aa7f7f5af49bf6e..816bb40bb38b49b675e6cfb25535c5ffe97421a3 100644 (file)
@@ -5,7 +5,7 @@ from openpower.decoder.isa.caller import SVP64State
 from openpower.decoder.isa.test_caller import run_tst
 from openpower.decoder.selectable_int import SelectableInt
 from openpower.simulator.program import Program
-from openpower.sv.trans.svp64 import SVP64Asm
+from openpower.insndb.asm import SVP64Asm
 
 
 def signcopy(x, y):
index 8e37fce1853d5a928a2692f832929edb65f9d9be..4ecf534777a5e8a0178b29dbcd69a1a5e2dd14d6 100644 (file)
@@ -8,7 +8,7 @@ from openpower.decoder.isa.remap_dct_yield import halfrev2, reverse_bits
 from openpower.decoder.isa.test_caller import run_tst
 from openpower.decoder.selectable_int import SelectableInt
 from openpower.simulator.program import Program
-from openpower.sv.trans.svp64 import SVP64Asm
+from openpower.insndb.asm import SVP64Asm
 
 
 def write_byte(mem, addr, val):
index dbca78476f6f03ad2e305b22dd18b802a5b16a66..9d547ba9ef92305894284b02b211a3cb7f620657 100644 (file)
@@ -6,7 +6,7 @@ from openpower.decoder.isa.caller import SVP64State
 from openpower.decoder.isa.test_caller import run_tst
 from openpower.decoder.selectable_int import SelectableInt
 from openpower.simulator.program import Program
-from openpower.sv.trans.svp64 import SVP64Asm
+from openpower.insndb.asm import SVP64Asm
 
 
 class DecoderTestCase(FHDLTestCase):
index 0796e7c9d039824915c351fc1dfbf41ff9daad5b..65e0e3416548c742b38aeef4ab618ce71bb1b182 100644 (file)
@@ -7,7 +7,7 @@ from openpower.decoder.helpers import fp64toselectable
 from openpower.decoder.isa.test_caller import run_tst
 from openpower.decoder.selectable_int import SelectableInt
 from openpower.simulator.program import Program
-from openpower.sv.trans.svp64 import SVP64Asm
+from openpower.insndb.asm import SVP64Asm
 
 
 class DecoderTestCase(FHDLTestCase):
index e3edd216a8b005852723dd4440530659d3756b4e..0e83b9ebaf44f72ebd6755ecc63f28bb33f2b646 100644 (file)
@@ -5,7 +5,7 @@ from openpower.decoder.isa.caller import CRFields, SVP64State
 from openpower.decoder.isa.test_caller import run_tst
 from openpower.decoder.selectable_int import SelectableInt
 from openpower.simulator.program import Program
-from openpower.sv.trans.svp64 import SVP64Asm
+from openpower.insndb.asm import SVP64Asm
 
 
 class DecoderTestCase(FHDLTestCase):
index 88004682ceb893c434d5266eba4d6ae6219972bf..c6ea8beb999a680bf98849d72436436e8e7e25cd 100644 (file)
@@ -7,7 +7,7 @@ from openpower.decoder.isa.remap_preduce_yield import preduce_y
 from openpower.decoder.isa.test_caller import run_tst
 from openpower.decoder.selectable_int import SelectableInt
 from openpower.simulator.program import Program
-from openpower.sv.trans.svp64 import SVP64Asm
+from openpower.insndb.asm import SVP64Asm
 
 
 def signcopy(x, y):
index a0552e75ce7497cd2cd29b4fc41920180ef682c1..0670abfb1ae64f80645d7fad94402b732d5730bc 100644 (file)
@@ -6,7 +6,7 @@ from openpower.decoder.isa.caller import CRFields, SVP64State
 from openpower.decoder.isa.test_caller import run_tst
 from openpower.decoder.selectable_int import SelectableInt
 from openpower.simulator.program import Program
-from openpower.sv.trans.svp64 import SVP64Asm
+from openpower.insndb.asm import SVP64Asm
 
 
 class DecoderTestCase(FHDLTestCase):
index 01f1232edb64c353d53d3724ca811524081ae4de..cfd254d295ced96eb7624ae6466fa116a0008d1d 100644 (file)
@@ -6,7 +6,7 @@ from openpower.decoder.isa.caller import SVP64State
 from openpower.decoder.isa.test_caller import run_tst
 from openpower.decoder.selectable_int import SelectableInt
 from openpower.simulator.program import Program
-from openpower.sv.trans.svp64 import SVP64Asm
+from openpower.insndb.asm import SVP64Asm
 
 
 class DecoderTestCase(FHDLTestCase):
index 53ae23c9b70015f9e12fab17038aa614feec23f8..75aad2111ca8a75cb111da541d03aa867248d407 100644 (file)
@@ -9,7 +9,7 @@ from openpower.decoder.isa.caller import SVP64State
 from openpower.decoder.isa.test_caller import run_tst
 from openpower.decoder.selectable_int import SelectableInt
 from openpower.simulator.program import Program
-from openpower.sv.trans.svp64 import SVP64Asm
+from openpower.insndb.asm import SVP64Asm
 
 
 class SVSTATETestCase(FHDLTestCase):
index c8ef62c3486c87184f1cc95f3414904f7390b878..48c4b6f24d87eed99520198ca60576b23e4997f7 100644 (file)
@@ -8,7 +8,7 @@ from openpower.decoder.isa.caller import CRFields, SVP64State
 from openpower.decoder.isa.test_caller import run_tst
 from openpower.decoder.selectable_int import SelectableInt
 from openpower.simulator.program import Program
-from openpower.sv.trans.svp64 import SVP64Asm
+from openpower.insndb.asm import SVP64Asm
 
 
 class SVSTATETestCase(FHDLTestCase):
index 6c6304f2b26220f69cc978bec6f95e1424dd95af..c61faa5d71562b38c74fd41ac47f30ab13d80fcc 100644 (file)
@@ -8,7 +8,7 @@ from openpower.decoder.isafunctions.double2single import (
         ISACallerFnHelper_double2single)
 from openpower.decoder.selectable_int import SelectableInt
 from openpower.simulator.program import Program
-from openpower.sv.trans.svp64 import SVP64Asm
+from openpower.insndb.asm import SVP64Asm
 
 # really bad hack.  need to access the DOUBLE2SINGLE function auto-generated
 # from pseudo-code.
diff --git a/src/openpower/insndb/asm.py b/src/openpower/insndb/asm.py
new file mode 100644 (file)
index 0000000..8ed34b8
--- /dev/null
@@ -0,0 +1,321 @@
+# SPDX-License-Identifier: LGPLv3+
+# Copyright (C) 2021 Luke Kenneth Casson Leighton <lkcl@lkcl.net>
+# Funded by NLnet http://nlnet.nl
+
+"""SVP64 OpenPOWER v3.0B assembly translator
+
+This class takes raw svp64 assembly mnemonics (aliases excluded) and creates
+an EXT001-encoded "svp64 prefix" (as a .long) followed by a v3.0B opcode.
+
+It is very simple and straightforward, the only weirdness being the
+extraction of the register information and conversion to v3.0B numbering.
+
+Encoding format of svp64: https://libre-soc.org/openpower/sv/svp64/
+Encoding format of arithmetic: https://libre-soc.org/openpower/sv/normal/
+Encoding format of LDST: https://libre-soc.org/openpower/sv/ldst/
+**TODO format of branches: https://libre-soc.org/openpower/sv/branches/**
+**TODO format of CRs: https://libre-soc.org/openpower/sv/cr_ops/**
+Bugtracker: https://bugs.libre-soc.org/show_bug.cgi?id=578
+"""
+
+import functools
+import os
+import sys
+from collections import OrderedDict
+import inspect
+
+from openpower.decoder.pseudo.pagereader import ISA
+from openpower.decoder.power_svp64 import SVP64RM, get_regtype, decode_extra
+from openpower.decoder.selectable_int import SelectableInt
+from openpower.consts import SVP64MODE
+from openpower.insndb.types import SVP64Instruction
+from openpower.insndb.types import Database
+from openpower.insndb.types import Style
+from openpower.insndb.types import WordInstruction
+from openpower.decoder.power_enums import find_wiki_dir
+
+# for debug logging
+from openpower.util import log
+
+
+DB = Database(find_wiki_dir())
+
+
+class AssemblerError(ValueError):
+    pass
+
+
+# decodes svp64 assembly listings and creates EXT001 svp64 prefixes
+class SVP64Asm:
+    def __init__(self, lst, bigendian=False, macros=None):
+        if macros is None:
+            macros = {}
+        self.macros = macros
+        self.lst = lst
+        self.trans = self.translate(lst)
+        self.isa = ISA()  # reads the v3.0B pseudo-code markdown files
+        self.svp64 = SVP64RM()  # reads the svp64 Remap entries for registers
+        assert bigendian == False, "error, bigendian not supported yet"
+
+    def __iter__(self):
+        yield from self.trans
+
+    def translate_one(self, insn, macros=None):
+        if macros is None:
+            macros = {}
+        macros.update(self.macros)
+        isa = self.isa
+        svp64 = self.svp64
+        insn_no_comments = insn.partition('#')[0].strip()
+        if not insn_no_comments:
+            return
+
+        # find first space, to get opcode
+        ls = insn_no_comments.split()
+        opcode = ls[0]
+        # now find opcode fields
+        fields = ''.join(ls[1:]).split(',')
+        mfields = list(filter(bool, map(str.strip, fields)))
+        log("opcode, fields", ls, opcode, mfields)
+        fields = []
+        # macro substitution
+        for field in mfields:
+            fields.append(macro_subst(macros, field))
+        log("opcode, fields substed", ls, opcode, fields)
+
+        # identify if it is a word instruction
+        record = DB[opcode]
+        if record is not None:
+            insn = WordInstruction.assemble(record=record, arguments=fields)
+            yield from insn.disassemble(record=record, style=Style.LEGACY)
+            return
+
+        # identify if is a svp64 mnemonic
+        if not opcode.startswith('sv.'):
+            yield insn  # unaltered
+            return
+        opcode = opcode[3:]  # strip leading "sv"
+
+        # start working on decoding the svp64 op: sv.basev30Bop/vec2/mode
+        opmodes = opcode.split("/")  # split at "/"
+        v30b_op = opmodes.pop(0)    # first is the v3.0B
+
+        record = DB[v30b_op]
+        if record is not None:
+            insn = SVP64Instruction.assemble(record=record,
+                arguments=fields, specifiers=opmodes)
+            yield from insn.disassemble(record=record, style=Style.LEGACY)
+            return
+
+        raise AssemblerError(insn_no_comments)
+
+    def translate(self, lst):
+        for insn in lst:
+            yield from self.translate_one(insn)
+
+
+def macro_subst(macros, txt):
+    again = True
+    log("subst", txt, macros)
+    while again:
+        again = False
+        for macro, value in macros.items():
+            if macro == txt:
+                again = True
+                replaced = txt.replace(macro, value)
+                log("macro", txt, "replaced", replaced, macro, value)
+                txt = replaced
+                continue
+            toreplace = '%s.s' % macro
+            if toreplace == txt:
+                again = True
+                replaced = txt.replace(toreplace, "%s.s" % value)
+                log("macro", txt, "replaced", replaced, toreplace, value)
+                txt = replaced
+                continue
+            toreplace = '%s.v' % macro
+            if toreplace == txt:
+                again = True
+                replaced = txt.replace(toreplace, "%s.v" % value)
+                log("macro", txt, "replaced", replaced, toreplace, value)
+                txt = replaced
+                continue
+            toreplace = '*%s' % macro
+            if toreplace in txt:
+                again = True
+                replaced = txt.replace(toreplace, '*%s' % value)
+                log("macro", txt, "replaced", replaced, toreplace, value)
+                txt = replaced
+                continue
+            toreplace = '(%s)' % macro
+            if toreplace in txt:
+                again = True
+                replaced = txt.replace(toreplace, '(%s)' % value)
+                log("macro", txt, "replaced", replaced, toreplace, value)
+                txt = replaced
+                continue
+    log("    processed", txt)
+    return txt
+
+
+def get_ws(line):
+    # find whitespace
+    ws = ''
+    while line:
+        if not line[0].isspace():
+            break
+        ws += line[0]
+        line = line[1:]
+    return ws, line
+
+
+def main():
+    # get an input file and an output file
+    args = sys.argv[1:]
+    if len(args) == 0:
+        infile = sys.stdin
+        outfile = sys.stdout
+        # read the whole lot in advance in case of in-place
+        lines = list(infile.readlines())
+    elif len(args) != 2:
+        print("pysvp64asm [infile | -] [outfile | -]", file=sys.stderr)
+        exit(0)
+    else:
+        if args[0] == '--':
+            infile = sys.stdin
+        else:
+            infile = open(args[0], "r")
+        # read the whole lot in advance in case of in-place overwrite
+        lines = list(infile.readlines())
+
+        if args[1] == '--':
+            outfile = sys.stdout
+        else:
+            outfile = open(args[1], "w")
+
+    # read the line, look for custom insn, process it
+    macros = {}  # macros which start ".set"
+    isa = SVP64Asm([])
+    for line in lines:
+        op = line.split("#")[0].strip()
+        # identify macros
+        if op.startswith(".set"):
+            macro = op[4:].split(",")
+            (macro, value) = map(str.strip, macro)
+            macros[macro] = value
+
+        if not op or op.startswith("#"):
+            outfile.write(line)
+            continue
+        (ws, line) = get_ws(line)
+        lst = isa.translate_one(op, macros)
+        lst = '; '.join(lst)
+        outfile.write("%s%s # %s\n" % (ws, lst, op))
+
+
+if __name__ == '__main__':
+    lst = ['slw 3, 1, 4',
+           'extsw 5, 3',
+           'sv.extsw 5, 3',
+           'sv.cmpi 5, 1, 3, 2',
+           'sv.setb 5, 31',
+           'sv.isel 64.v, 3, 2, 65.v',
+           'sv.setb/dm=r3/sm=1<<r3 5, 31',
+           'sv.setb/m=r3 5, 31',
+           'sv.setb/vec2 5, 31',
+           'sv.setb/sw=8/ew=16 5, 31',
+           'sv.extsw./ff=eq 5, 31',
+           'sv.extsw./satu/sz/dz/sm=r3/dm=r3 5, 31',
+           'sv.add. 5.v, 2.v, 1.v',
+           'sv.add./m=r3 5.v, 2.v, 1.v',
+           ]
+    lst += [
+        'sv.stw 5.v, 4(1.v)',
+        'sv.ld 5.v, 4(1.v)',
+        'setvl. 2, 3, 4, 0, 1, 1',
+        'sv.setvl. 2, 3, 4, 0, 1, 1',
+    ]
+    lst = [
+        "sv.stfsu 0.v, 16(4.v)",
+    ]
+    lst = [
+        "sv.stfsu/els 0.v, 16(4)",
+    ]
+    lst = [
+        'sv.add./mr 5.v, 2.v, 1.v',
+    ]
+    macros = {'win2': '50', 'win': '60'}
+    lst = [
+        'sv.addi win2.v, win.v, -1',
+        'sv.add./mrr 5.v, 2.v, 1.v',
+        #'sv.lhzsh 5.v, 11(9.v), 15',
+        #'sv.lwzsh 5.v, 11(9.v), 15',
+        'sv.ffmadds 6.v, 2.v, 4.v, 6.v',
+    ]
+    lst = [
+        #'sv.fmadds 0.v, 8.v, 16.v, 4.v',
+        #'sv.ffadds 0.v, 8.v, 4.v',
+        'svremap 11, 0, 1, 2, 3, 2, 1',
+        'svshape 8, 1, 1, 1, 0',
+        'svshape 8, 1, 1, 1, 1',
+    ]
+    lst = [
+        #'sv.lfssh 4.v, 11(8.v), 15',
+        #'sv.lwzsh 4.v, 11(8.v), 15',
+        #'sv.svstep. 2.v, 4, 0',
+        #'sv.fcfids. 48.v, 64.v',
+        'sv.fcoss. 80.v, 0.v',
+        'sv.fcoss. 20.v, 0.v',
+    ]
+    lst = [
+        'sv.bc/all 3,12,192',
+        'sv.bclr/vsbi 3,81.v,192',
+        'sv.ld 5.v, 4(1.v)',
+        'sv.svstep. 2.v, 4, 0',
+    ]
+    lst = [
+        'minmax 3,12,5,3',
+        'minmax. 3,12,5,4',
+        'avgadd 3,12,5',
+        'absdu 3,12,5',
+        'absds 3,12,5',
+        'absdacu 3,12,5',
+        'absdacs 3,12,5',
+        'cprop 3,12,5',
+        'svindex 0,0,1,0,0,0,0',
+    ]
+    lst = [
+        'sv.svstep./m=r3 2.v, 4, 0',
+        'ternlogi 0,0,0,0x5',
+        'fmvis 5,65535',
+        'fmvis 5,1',
+        'fmvis 5,2',
+        'fmvis 5,4',
+        'fmvis 5,8',
+        'fmvis 5,16',
+        'fmvis 5,32',
+        'fmvis 5,64',
+        'fmvis 5,32768',
+    ]
+    lst = [
+        'sv.andi. *80, *80, 1',
+        'sv.ffmadds. 6.v, 2.v, 4.v, 6.v',  # incorrectly inserted 32-bit op
+        'sv.ffmadds 6.v, 2.v, 4.v, 6.v',  # correctly converted to .long
+        'svshape2 8, 1, 31, 7, 1, 1',
+        'sv.ld 5.v, 4(1.v)',
+        'sv.stw 5.v, 4(1.v)',
+        'sv.bc/all 3,12,192',
+        'pcdec. 0,0,0,0',
+    ]
+    lst = [
+        #"sv.cmp/ff=gt *0,*1,*2,0",
+        "dsld 5,4,5,3",
+
+    ]
+    isa = SVP64Asm(lst, macros=macros)
+    log("list:\n", "\n\t".join(list(isa)))
+    # running svp64.py is designed to test hard-coded lists
+    # (above) - which strictly speaking should all be unit tests.
+    # if you need to actually do assembler translation at the
+    # commandline use "pysvp64asm" - see setup.py
+    # XXX NO. asm_process()
diff --git a/src/openpower/sv/trans/svp64.py b/src/openpower/sv/trans/svp64.py
deleted file mode 100644 (file)
index f05cefd..0000000
+++ /dev/null
@@ -1,321 +0,0 @@
-# SPDX-License-Identifier: LGPLv3+
-# Copyright (C) 2021 Luke Kenneth Casson Leighton <lkcl@lkcl.net>
-# Funded by NLnet http://nlnet.nl
-
-"""SVP64 OpenPOWER v3.0B assembly translator
-
-This class takes raw svp64 assembly mnemonics (aliases excluded) and creates
-an EXT001-encoded "svp64 prefix" (as a .long) followed by a v3.0B opcode.
-
-It is very simple and straightforward, the only weirdness being the
-extraction of the register information and conversion to v3.0B numbering.
-
-Encoding format of svp64: https://libre-soc.org/openpower/sv/svp64/
-Encoding format of arithmetic: https://libre-soc.org/openpower/sv/normal/
-Encoding format of LDST: https://libre-soc.org/openpower/sv/ldst/
-**TODO format of branches: https://libre-soc.org/openpower/sv/branches/**
-**TODO format of CRs: https://libre-soc.org/openpower/sv/cr_ops/**
-Bugtracker: https://bugs.libre-soc.org/show_bug.cgi?id=578
-"""
-
-import functools
-import os
-import sys
-from collections import OrderedDict
-import inspect
-
-from openpower.decoder.pseudo.pagereader import ISA
-from openpower.decoder.power_svp64 import SVP64RM, get_regtype, decode_extra
-from openpower.decoder.selectable_int import SelectableInt
-from openpower.consts import SVP64MODE
-from openpower.insndb.types import SVP64Instruction
-from openpower.insndb.types import Database
-from openpower.insndb.types import Style
-from openpower.insndb.types import WordInstruction
-from openpower.decoder.power_enums import find_wiki_dir
-
-# for debug logging
-from openpower.util import log
-
-
-DB = Database(find_wiki_dir())
-
-
-class AssemblerError(ValueError):
-    pass
-
-
-# decodes svp64 assembly listings and creates EXT001 svp64 prefixes
-class SVP64Asm:
-    def __init__(self, lst, bigendian=False, macros=None):
-        if macros is None:
-            macros = {}
-        self.macros = macros
-        self.lst = lst
-        self.trans = self.translate(lst)
-        self.isa = ISA()  # reads the v3.0B pseudo-code markdown files
-        self.svp64 = SVP64RM()  # reads the svp64 Remap entries for registers
-        assert bigendian == False, "error, bigendian not supported yet"
-
-    def __iter__(self):
-        yield from self.trans
-
-    def translate_one(self, insn, macros=None):
-        if macros is None:
-            macros = {}
-        macros.update(self.macros)
-        isa = self.isa
-        svp64 = self.svp64
-        insn_no_comments = insn.partition('#')[0].strip()
-        if not insn_no_comments:
-            return
-
-        # find first space, to get opcode
-        ls = insn_no_comments.split()
-        opcode = ls[0]
-        # now find opcode fields
-        fields = ''.join(ls[1:]).split(',')
-        mfields = list(filter(bool, map(str.strip, fields)))
-        log("opcode, fields", ls, opcode, mfields)
-        fields = []
-        # macro substitution
-        for field in mfields:
-            fields.append(macro_subst(macros, field))
-        log("opcode, fields substed", ls, opcode, fields)
-
-        # identify if it is a word instruction
-        record = DB[opcode]
-        if record is not None:
-            insn = WordInstruction.assemble(record=record, arguments=fields)
-            yield from insn.disassemble(record=record, style=Style.LEGACY)
-            return
-
-        # identify if is a svp64 mnemonic
-        if not opcode.startswith('sv.'):
-            yield insn  # unaltered
-            return
-        opcode = opcode[3:]  # strip leading "sv"
-
-        # start working on decoding the svp64 op: sv.basev30Bop/vec2/mode
-        opmodes = opcode.split("/")  # split at "/"
-        v30b_op = opmodes.pop(0)    # first is the v3.0B
-
-        record = DB[v30b_op]
-        if record is not None:
-            insn = SVP64Instruction.assemble(record=record,
-                arguments=fields, specifiers=opmodes)
-            yield from insn.disassemble(record=record, style=Style.LEGACY)
-            return
-
-        raise AssemblerError(insn_no_comments)
-
-    def translate(self, lst):
-        for insn in lst:
-            yield from self.translate_one(insn)
-
-
-def macro_subst(macros, txt):
-    again = True
-    log("subst", txt, macros)
-    while again:
-        again = False
-        for macro, value in macros.items():
-            if macro == txt:
-                again = True
-                replaced = txt.replace(macro, value)
-                log("macro", txt, "replaced", replaced, macro, value)
-                txt = replaced
-                continue
-            toreplace = '%s.s' % macro
-            if toreplace == txt:
-                again = True
-                replaced = txt.replace(toreplace, "%s.s" % value)
-                log("macro", txt, "replaced", replaced, toreplace, value)
-                txt = replaced
-                continue
-            toreplace = '%s.v' % macro
-            if toreplace == txt:
-                again = True
-                replaced = txt.replace(toreplace, "%s.v" % value)
-                log("macro", txt, "replaced", replaced, toreplace, value)
-                txt = replaced
-                continue
-            toreplace = '*%s' % macro
-            if toreplace in txt:
-                again = True
-                replaced = txt.replace(toreplace, '*%s' % value)
-                log("macro", txt, "replaced", replaced, toreplace, value)
-                txt = replaced
-                continue
-            toreplace = '(%s)' % macro
-            if toreplace in txt:
-                again = True
-                replaced = txt.replace(toreplace, '(%s)' % value)
-                log("macro", txt, "replaced", replaced, toreplace, value)
-                txt = replaced
-                continue
-    log("    processed", txt)
-    return txt
-
-
-def get_ws(line):
-    # find whitespace
-    ws = ''
-    while line:
-        if not line[0].isspace():
-            break
-        ws += line[0]
-        line = line[1:]
-    return ws, line
-
-
-def asm_process():
-    # get an input file and an output file
-    args = sys.argv[1:]
-    if len(args) == 0:
-        infile = sys.stdin
-        outfile = sys.stdout
-        # read the whole lot in advance in case of in-place
-        lines = list(infile.readlines())
-    elif len(args) != 2:
-        print("pysvp64asm [infile | -] [outfile | -]", file=sys.stderr)
-        exit(0)
-    else:
-        if args[0] == '--':
-            infile = sys.stdin
-        else:
-            infile = open(args[0], "r")
-        # read the whole lot in advance in case of in-place overwrite
-        lines = list(infile.readlines())
-
-        if args[1] == '--':
-            outfile = sys.stdout
-        else:
-            outfile = open(args[1], "w")
-
-    # read the line, look for custom insn, process it
-    macros = {}  # macros which start ".set"
-    isa = SVP64Asm([])
-    for line in lines:
-        op = line.split("#")[0].strip()
-        # identify macros
-        if op.startswith(".set"):
-            macro = op[4:].split(",")
-            (macro, value) = map(str.strip, macro)
-            macros[macro] = value
-
-        if not op or op.startswith("#"):
-            outfile.write(line)
-            continue
-        (ws, line) = get_ws(line)
-        lst = isa.translate_one(op, macros)
-        lst = '; '.join(lst)
-        outfile.write("%s%s # %s\n" % (ws, lst, op))
-
-
-if __name__ == '__main__':
-    lst = ['slw 3, 1, 4',
-           'extsw 5, 3',
-           'sv.extsw 5, 3',
-           'sv.cmpi 5, 1, 3, 2',
-           'sv.setb 5, 31',
-           'sv.isel 64.v, 3, 2, 65.v',
-           'sv.setb/dm=r3/sm=1<<r3 5, 31',
-           'sv.setb/m=r3 5, 31',
-           'sv.setb/vec2 5, 31',
-           'sv.setb/sw=8/ew=16 5, 31',
-           'sv.extsw./ff=eq 5, 31',
-           'sv.extsw./satu/sz/dz/sm=r3/dm=r3 5, 31',
-           'sv.add. 5.v, 2.v, 1.v',
-           'sv.add./m=r3 5.v, 2.v, 1.v',
-           ]
-    lst += [
-        'sv.stw 5.v, 4(1.v)',
-        'sv.ld 5.v, 4(1.v)',
-        'setvl. 2, 3, 4, 0, 1, 1',
-        'sv.setvl. 2, 3, 4, 0, 1, 1',
-    ]
-    lst = [
-        "sv.stfsu 0.v, 16(4.v)",
-    ]
-    lst = [
-        "sv.stfsu/els 0.v, 16(4)",
-    ]
-    lst = [
-        'sv.add./mr 5.v, 2.v, 1.v',
-    ]
-    macros = {'win2': '50', 'win': '60'}
-    lst = [
-        'sv.addi win2.v, win.v, -1',
-        'sv.add./mrr 5.v, 2.v, 1.v',
-        #'sv.lhzsh 5.v, 11(9.v), 15',
-        #'sv.lwzsh 5.v, 11(9.v), 15',
-        'sv.ffmadds 6.v, 2.v, 4.v, 6.v',
-    ]
-    lst = [
-        #'sv.fmadds 0.v, 8.v, 16.v, 4.v',
-        #'sv.ffadds 0.v, 8.v, 4.v',
-        'svremap 11, 0, 1, 2, 3, 2, 1',
-        'svshape 8, 1, 1, 1, 0',
-        'svshape 8, 1, 1, 1, 1',
-    ]
-    lst = [
-        #'sv.lfssh 4.v, 11(8.v), 15',
-        #'sv.lwzsh 4.v, 11(8.v), 15',
-        #'sv.svstep. 2.v, 4, 0',
-        #'sv.fcfids. 48.v, 64.v',
-        'sv.fcoss. 80.v, 0.v',
-        'sv.fcoss. 20.v, 0.v',
-    ]
-    lst = [
-        'sv.bc/all 3,12,192',
-        'sv.bclr/vsbi 3,81.v,192',
-        'sv.ld 5.v, 4(1.v)',
-        'sv.svstep. 2.v, 4, 0',
-    ]
-    lst = [
-        'minmax 3,12,5,3',
-        'minmax. 3,12,5,4',
-        'avgadd 3,12,5',
-        'absdu 3,12,5',
-        'absds 3,12,5',
-        'absdacu 3,12,5',
-        'absdacs 3,12,5',
-        'cprop 3,12,5',
-        'svindex 0,0,1,0,0,0,0',
-    ]
-    lst = [
-        'sv.svstep./m=r3 2.v, 4, 0',
-        'ternlogi 0,0,0,0x5',
-        'fmvis 5,65535',
-        'fmvis 5,1',
-        'fmvis 5,2',
-        'fmvis 5,4',
-        'fmvis 5,8',
-        'fmvis 5,16',
-        'fmvis 5,32',
-        'fmvis 5,64',
-        'fmvis 5,32768',
-    ]
-    lst = [
-        'sv.andi. *80, *80, 1',
-        'sv.ffmadds. 6.v, 2.v, 4.v, 6.v',  # incorrectly inserted 32-bit op
-        'sv.ffmadds 6.v, 2.v, 4.v, 6.v',  # correctly converted to .long
-        'svshape2 8, 1, 31, 7, 1, 1',
-        'sv.ld 5.v, 4(1.v)',
-        'sv.stw 5.v, 4(1.v)',
-        'sv.bc/all 3,12,192',
-        'pcdec. 0,0,0,0',
-    ]
-    lst = [
-        #"sv.cmp/ff=gt *0,*1,*2,0",
-        "dsld 5,4,5,3",
-
-    ]
-    isa = SVP64Asm(lst, macros=macros)
-    log("list:\n", "\n\t".join(list(isa)))
-    # running svp64.py is designed to test hard-coded lists
-    # (above) - which strictly speaking should all be unit tests.
-    # if you need to actually do assembler translation at the
-    # commandline use "pysvp64asm" - see setup.py
-    # XXX NO. asm_process()
index 13c2152db78631e3f5d28bb03caa30a37627d243..b8a8fe2b812ea0af4514e7f3f7d0cc509798b6f4 100644 (file)
@@ -1,6 +1,6 @@
 from openpower.simulator.program import Program
 from openpower.sv.trans.pysvp64dis import load, dump
-from openpower.sv.trans.svp64 import SVP64Asm
+from openpower.insndb.asm import SVP64Asm
 from openpower.insndb.types import Database, Style
 from openpower.decoder.power_enums import find_wiki_dir
 from openpower.sv import sv_binutils_fptrans
index c809cba858e2de1bf0ae558273d20a66583b553f..44a215fb54cb7e7ddd1138343553f80de47451f3 100644 (file)
@@ -1,6 +1,6 @@
 from openpower.simulator.program import Program
 from openpower.sv.trans.pysvp64dis import load, dump
-from openpower.sv.trans.svp64 import SVP64Asm
+from openpower.insndb.asm import SVP64Asm
 from openpower.insndb.types import Database, Style
 from openpower.decoder.power_enums import find_wiki_dir
 from openpower.sv import sv_binutils_fptrans
index 5174999ce8908fd1a5dd94dc66bfe4e28f17b0bd..054fd481dab0040dcb302f0506ab04bc8b52c864 100644 (file)
@@ -7,7 +7,7 @@ from openpower.decoder.selectable_int import SelectableInt
 from openpower.simulator.program import Program
 from openpower.test.common import TestAccumulatorBase, skip_case
 from openpower.test.state import ExpectedState
-from openpower.sv.trans.svp64 import SVP64Asm
+from openpower.insndb.asm import SVP64Asm
 from cached_property import cached_property
 
 
index 4689c26f778f0b1ca3c9de6f4eb1cf68082c4a21..8caac0cfffd1ae017db197498b331a85537e43c4 100644 (file)
@@ -1,4 +1,4 @@
-from openpower.sv.trans.svp64 import SVP64Asm
+from openpower.insndb.asm import SVP64Asm
 import random
 from openpower.test.common import TestAccumulatorBase
 from openpower.endian import bigendian
index 7cb8f0175245d03c3ddd44d8fbb87afc817fc356..326060d4160c41de500e17d92f7a24b270d25e17 100644 (file)
@@ -1,4 +1,4 @@
-from openpower.sv.trans.svp64 import SVP64Asm
+from openpower.insndb.asm import SVP64Asm
 import random
 from openpower.test.common import TestAccumulatorBase, skip_case
 from openpower.endian import bigendian
index 6c4b5289a68c70b890448f1e7eec0b04078dd329..b86a1d120cf7fb3fee27cd575bf257bc34d11935 100644 (file)
@@ -2,7 +2,7 @@ from openpower.test.common import (TestAccumulatorBase, skip_case)
 from openpower.endian import bigendian
 from openpower.simulator.program import Program
 from openpower.decoder.isa.caller import SVP64State, CRFields
-from openpower.sv.trans.svp64 import SVP64Asm
+from openpower.insndb.asm import SVP64Asm
 from openpower.test.state import ExpectedState
 from copy import deepcopy
 
index 092c8468abcae2cbaae007ed5c1d1942c0f3d727..38ad4e084682dc342c9dbc1c412c415cef3eda33 100644 (file)
@@ -1,5 +1,5 @@
 from openpower.test.common import TestAccumulatorBase, skip_case
-from openpower.sv.trans.svp64 import SVP64Asm
+from openpower.insndb.asm import SVP64Asm
 from openpower.test.state import ExpectedState
 from openpower.simulator.program import Program
 from openpower.decoder.isa.caller import SVP64State
index 1534a8ea2927b8fc625b264634c1620af893df28..7e61e303ccb9335da65ffd154845ae3fdad51ec9 100644 (file)
@@ -1,5 +1,5 @@
 from openpower.test.common import TestAccumulatorBase, skip_case
-from openpower.sv.trans.svp64 import SVP64Asm
+from openpower.insndb.asm import SVP64Asm
 from openpower.test.state import ExpectedState
 from openpower.simulator.program import Program
 from openpower.decoder.isa.caller import SVP64State
index bfb4a3509d641041bfdb1c5de38389617ff0923c..d39e044125814b5a497a52d821077442a6a3cf58 100644 (file)
@@ -1,4 +1,4 @@
-from openpower.sv.trans.svp64 import SVP64Asm
+from openpower.insndb.asm import SVP64Asm
 import random
 from openpower.test.common import TestAccumulatorBase
 from openpower.endian import bigendian
index 8c344d5f4d0cbb2ec5f8742589a7e6fc0c92aa72..c89d3f81fb0c9e5514c07c177923625654cdf33d 100644 (file)
@@ -1,4 +1,4 @@
-from openpower.sv.trans.svp64 import SVP64Asm
+from openpower.insndb.asm import SVP64Asm
 from openpower.test.common import TestAccumulatorBase, skip_case
 from openpower.endian import bigendian
 from openpower.simulator.program import Program
index 613c0564bd89a21859a187575350b3016744063e..29c35146d0ecbf7c8a6ec2ed94ce7389872bbb3b 100644 (file)
@@ -1,5 +1,5 @@
 from openpower.test.common import TestAccumulatorBase, skip_case
-from openpower.sv.trans.svp64 import SVP64Asm
+from openpower.insndb.asm import SVP64Asm
 from openpower.test.state import ExpectedState
 from openpower.simulator.program import Program
 from openpower.decoder.isa.caller import SVP64State
index bfa08165428ef4a2fdaccb3d6be261944620c783..92d84b5bd5d06a1af29a0ba28af1ac1b0ac90962 100644 (file)
@@ -1,5 +1,5 @@
 from openpower.test.common import TestAccumulatorBase, skip_case
-from openpower.sv.trans.svp64 import SVP64Asm
+from openpower.insndb.asm import SVP64Asm
 from openpower.test.state import ExpectedState
 from openpower.simulator.program import Program
 from openpower.decoder.isa.caller import SVP64State
index 000bc434403f1d31207c3698f20b354391eeda14..3cf2de1316db2c803206c364309645a2cf92fcbf 100644 (file)
@@ -2,7 +2,7 @@ from openpower.test.common import (TestAccumulatorBase, skip_case)
 from openpower.endian import bigendian
 from openpower.simulator.program import Program
 from openpower.decoder.isa.caller import SVP64State, CRFields
-from openpower.sv.trans.svp64 import SVP64Asm
+from openpower.insndb.asm import SVP64Asm
 
 
 class SVP64LogicalTestCase(TestAccumulatorBase):
index f1e7cc110596aaec0cb4dc266fe8fd321cfcd392..32ca0c30396e98c1c037d1342a3e20e5d3783fb5 100644 (file)
@@ -2,7 +2,7 @@ from openpower.simulator.program import Program
 from openpower.endian import bigendian
 from openpower.test.common import TestAccumulatorBase, skip_case
 from openpower.test.state import ExpectedState
-from openpower.sv.trans.svp64 import SVP64Asm
+from openpower.insndb.asm import SVP64Asm
 from openpower.decoder.isa.caller import SVP64State
 from copy import deepcopy
 import random
index c19fa350df1669b782ae722413b00ba59498eed9..da2d85ef8080805160d276717d99bcd4e48ffc48 100644 (file)
@@ -1,7 +1,7 @@
 import functools
 import itertools
 from openpower.test.common import TestAccumulatorBase, skip_case
-from openpower.sv.trans.svp64 import SVP64Asm
+from openpower.insndb.asm import SVP64Asm
 from openpower.test.state import ExpectedState
 from openpower.simulator.program import Program
 from typing import Iterable
index 74b408f45d52b597cf761bf6c4aaaaf6a1d85bf8..36c08e1e78fcd53a5775e05edca43d79258e7057 100644 (file)
@@ -1,7 +1,7 @@
 import itertools
 import operator
 from openpower.simulator.program import Program
-from openpower.sv.trans.svp64 import SVP64Asm
+from openpower.insndb.asm import SVP64Asm
 from openpower.test.state import ExpectedState
 from openpower.test.common import TestAccumulatorBase, skip_case
 from nmutil.prefix_sum import prefix_sum, prefix_sum_ops