1 import argparse
as _argparse
3 import functools
as _functools
6 from openpower
.decoder
.selectable_int
import SelectableInt
as _SelectableInt
7 from openpower
.decoder
.isa
.caller
import SVP64PrefixFields
as _SVP64PrefixFields
8 from openpower
.decoder
.isa
.caller
import SVP64RMFields
as _SVP64RMFields
11 from functools
import cached_property
13 from cached_property
import cached_property
16 class ByteOrder(_enum
.Enum
):
21 return self
.name
.lower()
24 class Instruction(_SelectableInt
):
25 def __init__(self
, value
, byteorder
=ByteOrder
.LITTLE
):
26 if isinstance(value
, bytes
):
27 value
= int.from_bytes(value
, byteorder
=str(byteorder
))
28 if not isinstance(value
, int) or (value
< 0) or (value
> ((1 << 32) - 1)):
29 raise ValueError(value
)
30 return super().__init
__(value
=value
, bits
=32)
33 return f
"{self.__class__.__name__}({self.value:08x})"
36 return f
".long 0x{self.value:08x}"
39 class PrefixedInstruction(_SelectableInt
):
40 def __init__(self
, prefix
, suffix
, byteorder
=ByteOrder
.LITTLE
):
41 insn
= _functools
.partial(Instruction
, byteorder
=byteorder
)
42 (prefix
, suffix
) = map(insn
, (prefix
, suffix
))
43 value
= ((prefix
.value
<< 32) | suffix
.value
)
44 return super().__init
__(value
=value
, bits
=64)
47 return f
"{self.__class__.__name__}({self.value:016x})"
50 return f
".llong 0x{self.value:016x}"
61 class SVP64Instruction(PrefixedInstruction
):
62 class Prefix(_SVP64PrefixFields
):
63 class RM(_SVP64RMFields
):
66 return (self
.mode
& 0b11)
70 return self
.__class
__.RM(super().rm
)
74 return self
.__class
__.Prefix(super().prefix
)
77 def load(ifile
, byteorder
, **_
):
79 prefix
= ifile
.read(4)
85 sv_prefix
= _SVP64PrefixFields(int.from_bytes(prefix
, byteorder
=str(byteorder
)))
86 if sv_prefix
.major
!= 0x1:
87 return Instruction(prefix
, byteorder
)
89 suffix
= ifile
.read(4)
95 if sv_prefix
.pid
== 0b11:
96 return SVP64Instruction(prefix
, suffix
, byteorder
)
98 return PrefixedInstruction(prefix
, suffix
, byteorder
)
107 def dump(insns
, ofile
, **_
):
113 parser
= _argparse
.ArgumentParser()
114 parser
.add_argument("ifile", nargs
="?",
115 type=_argparse
.FileType("rb"), default
=_sys
.stdin
.buffer)
116 parser
.add_argument("ofile", nargs
="?",
117 type=_argparse
.FileType("w"), default
=_sys
.stdout
)
118 parser
.add_argument("-b", "--byteorder",
119 type=ByteOrder
, default
=ByteOrder
.LITTLE
)
121 args
= dict(vars(parser
.parse_args()))
122 ifile
= args
["ifile"]
123 ofile
= args
["ofile"]
124 byteorder
= args
["byteorder"]
126 insns
= load(ifile
, byteorder
)
127 for line
in dump(insns
, byteorder
):
128 print(line
, file=ofile
)
131 if __name__
== "__main__":