- mode = mode.prrc0
-
- modes = {
- NormalMode.simple: "normal: simple",
- NormalMode.smr: "normal: smr",
- NormalMode.pmr: "normal: pmr",
- NormalMode.svmr: "normal: svmr",
- NormalMode.pu: "normal: pu",
- NormalMode.ffrc1: "normal: ffrc1",
- NormalMode.ffrc0: "normal: ffrc0",
- NormalMode.sat: "normal: sat",
- NormalMode.satx: "normal: satx",
- NormalMode.satpu: "normal: satpu",
- NormalMode.prrc1: "normal: prrc1",
- NormalMode.prrc0: "normal: prrc0",
- LDSTImmMode.simple: "ld/st imm: simple",
- LDSTImmMode.spu: "ld/st imm: spu",
- LDSTImmMode.ffrc1: "ld/st imm: ffrc1",
- LDSTImmMode.ffrc0: "ld/st imm: ffrc0",
- LDSTImmMode.sat: "ld/st imm: sat",
- LDSTImmMode.prrc1: "ld/st imm: prrc1",
- LDSTImmMode.prrc0: "ld/st imm: prrc0",
- LDSTIdxMode.simple: "ld/st idx simple",
- LDSTIdxMode.stride: "ld/st idx stride",
- LDSTIdxMode.sat: "ld/st idx sat",
- LDSTIdxMode.prrc1: "ld/st idx prrc1",
- LDSTIdxMode.prrc0: "ld/st idx prrc0",
- }
- for (cls, desc) in modes.items():
- if isinstance(mode, cls):
- return (mode, desc)
+ rm = rm.prrc0
+
+ elif record.svp64.mode is _SVMode.CROP:
+ rm = rm.cr_op
+ if rm[19] == 0b0:
+ if rm[21] == 0b0:
+ rm = rm.simple
+ else:
+ if self.subvl == 0:
+ rm = rm.smr
+ else:
+ if rm[23] == 0b0:
+ rm = rm.svmr
+ else:
+ rm = rm.reserved
+ else:
+ regtype = None
+ for idx in range(0, 4):
+ for entry in record.svp64.extra[idx]:
+ if entry.regtype is _SVExtraRegType.DST:
+ if regtype is not None:
+ raise ValueError(record.svp64)
+ regtype = _RegType(entry.reg)
+ if regtype is _RegType.CR_REG:
+ rm = rm.ff5
+ elif regtype is _RegType.CR_BIT:
+ rm = rm.ff3
+ else:
+ raise ValueError(record.svp64)
+
+ elif record.svp64.mode is _SVMode.BRANCH:
+ if rm[19] == 0b0:
+ if rm[20] == 0b0:
+ rm = rm.simple
+ else:
+ rm = rm.vls
+ else:
+ if rm[20] == 0b0:
+ rm = rm.ctr
+ else:
+ rm = rm.ctrvls
+
+ if rm.__class__ is self.__class__:
+ raise ValueError(self)
+
+ return rm
+
+
+class SVP64Instruction(PrefixedInstruction):
+ """SVP64 instruction: https://libre-soc.org/openpower/sv/svp64/"""
+ class Prefix(PrefixedInstruction.Prefix):
+ id: _Field = (7, 9)
+ rm: RM.remap((6, 8) + tuple(range(10, 32)))