import argparse as _argparse
import enum as _enum
-import functools as _functools
import sys as _sys
+import os
-from openpower.decoder.selectable_int import SelectableInt as _SelectableInt
+from openpower.decoder.power_enums import (
+ find_wiki_dir as _find_wiki_dir,
+)
+from openpower.decoder.power_insn import (
+ Verbosity as _Verbosity,
+ Database as _Database,
+ WordInstruction as _WordInstruction,
+ PrefixedInstruction as _PrefixedInstruction,
+ SVP64Instruction as _SVP64Instruction,
+)
class ByteOrder(_enum.Enum):
return self.name.lower()
-class Instruction(_SelectableInt):
- def __init__(self, value, bits=32, byteorder=ByteOrder.LITTLE):
- if isinstance(value, bytes):
- value = int.from_bytes(value, byteorder=str(byteorder))
- if not isinstance(value, (int, _SelectableInt)) or (value < 0):
- raise ValueError(value)
- return super().__init__(value=value, bits=bits)
+def load(ifile, byteorder=ByteOrder.LITTLE, **_):
+ byteorder = str(byteorder)
+ curpos = ifile.tell() # get file position
- def __repr__(self):
- return f"{self.__class__.__name__}({str(self)})"
-
- def __str__(self):
- return f".long 0x{self.value:08x}"
-
- @property
- def major(self):
- return self[0:6]
-
-
-class PrefixedInstruction(Instruction):
- def __init__(self, prefix, suffix, byteorder=ByteOrder.LITTLE):
- insn = _functools.partial(Instruction, bits=64)
- (prefix, suffix) = map(insn, (prefix, suffix))
- value = ((prefix.value << 32) | suffix.value)
- return super().__init__(value=value, bits=64)
-
- def __str__(self):
- return f".llong 0x{self.value:016x}"
-
- @property
- def prefix(self):
- return self[0:32]
-
- @property
- def suffix(self):
- return self[32:64]
-
-
-def load(ifile, byteorder, **_):
- def load(ifile):
- prefix = ifile.read(4)
- length = len(prefix)
- if length == 0:
- return None
- elif length < 4:
- raise IOError(prefix)
- prefix = Instruction(prefix, byteorder=byteorder)
- if prefix.major != 0x1:
- return prefix
-
- suffix = ifile.read(4)
- length = len(suffix)
+ while True:
+ insn = ifile.read(4)
+ length = len(insn)
if length == 0:
- return prefix
+ return
elif length < 4:
- raise IOError(suffix)
-
- return PrefixedInstruction(prefix, suffix, byteorder=byteorder)
-
- while True:
- insn = load(ifile)
- if insn is None:
- break
+ raise IOError(insn)
+ insn = _WordInstruction.integer(value=insn, byteorder=byteorder)
+ if insn.po == 0x1:
+ suffix = ifile.read(4)
+ length = len(suffix)
+ if length == 0:
+ yield insn
+ return
+ elif length < 4:
+ raise IOError(suffix)
+
+ prefix = insn
+ suffix = _WordInstruction.integer(value=suffix, byteorder=byteorder)
+ insn = _SVP64Instruction.pair(prefix=prefix, suffix=suffix)
+ if insn.prefix.id != 0b11:
+ insn = _PrefixedInstruction.pair(prefix=prefix, suffix=suffix)
yield insn
+ ifile.seek(curpos) # restore position so that generator can be reused
+
-def dump(insns, ofile, **_):
+def dump(insns, verbosity, **_):
+ db = _Database(_find_wiki_dir())
for insn in insns:
- yield str(insn)
+ yield from insn.disassemble(db=db, verbosity=verbosity)
+# this is the entry-point for the console-script pysvp64dis
def main():
parser = _argparse.ArgumentParser()
parser.add_argument("ifile", nargs="?",
type=_argparse.FileType("w"), default=_sys.stdout)
parser.add_argument("-b", "--byteorder",
type=ByteOrder, default=ByteOrder.LITTLE)
+ parser.add_argument("-s", "--short",
+ dest="verbosity", default=_Verbosity.NORMAL,
+ action="store_const", const=_Verbosity.SHORT)
+ parser.add_argument("-v", "--verbose",
+ dest="verbosity", default=_Verbosity.NORMAL,
+ action="store_const", const=_Verbosity.VERBOSE)
+ parser.add_argument("-l", "--log",
+ action="store_true", default=False)
+
args = dict(vars(parser.parse_args()))
+ # if logging requested do not disable it.
+ if not args['log']:
+ os.environ['SILENCELOG'] = '1'
+
+ # load instructions and dump them
insns = load(**args)
for line in dump(insns, **args):
- print(line)
+ print(line, file=args["ofile"])
+# still here but use "python3 setup.py develop" then run the
+# command "pysvp64dis" instead of "python3 src/openpower/sv/trans/pysvp64dis.py"
if __name__ == "__main__":
main()