@unique
class Function(Enum):
NONE = 0
- ALU = 1
- LDST = 2
- SHIFT_ROT = 3
- LOGICAL = 4
- BRANCH = 5
- CR = 6
- TRAP = 7
- MUL = 8
- DIV = 9
+ ALU = 1<<1
+ LDST = 1<<2
+ SHIFT_ROT = 1<<3
+ LOGICAL = 1<<4
+ BRANCH = 1<<5
+ CR = 1<<6
+ TRAP = 1<<7
+ MUL = 1<<8
+ DIV = 1<<9
@unique
Z22 = 27
Z23 = 28
+# supported instructions: make sure to keep up-to-date with CSV files
+# just like everything else
+_insns = [
+ "NONE", "add", "addc", "addco", "adde", "addeo", "addi", "addic", "addic.",
+ "addis", "addme", "addmeo", "addo", "addze", "addzeo", "and", "andc",
+ "andi.", "andis.", "attn", "b", "bc", "bcctr", "bclr", "bctar",
+ "bpermd", "cmp", "cmpb", "cmpeqb", "cmpi", "cmpl", "cmpli", "cmprb",
+ "cntlzd", "cntlzw", "cnttzd", "cnttzw", "crand", "crandc", "creqv",
+ "crnand", "crnor", "cror", "crorc", "crxor", "darn", "dcbf", "dcbst",
+ "dcbt", "dcbtst", "dcbz", "divd", "divde", "divdeo", "divdeu",
+ "divdeuo", "divdo", "divdu", "divduo", "divw", "divwe", "divweo",
+ "divweu", "divweuo", "divwo", "divwu", "divwuo", "eqv", "extsb",
+ "extsh", "extsw", "extswsli", "icbi", "icbt", "isel", "isync",
+ "lbarx", "lbz", "lbzu", "lbzux", "lbzx", "ld", "ldarx", "ldbrx",
+ "ldu", "ldux", "ldx", "lha", "lharx", "lhau", "lhaux", "lhax",
+ "lhbrx", "lhz", "lhzu", "lhzux", "lhzx", "lwa", "lwarx", "lwaux",
+ "lwax", "lwbrx", "lwz", "lwzu", "lwzux", "lwzx", "mcrf", "mcrxr",
+ "mcrxrx", "mfcr/mfocrf", "mfmsr", "mfspr", "modsd", "modsw", "modud",
+ "moduw", "mtcrf/mtocrf", "mtmsrd", "mtspr", "mulhd", "mulhdu",
+ "mulhw", "mulhwu", "mulld", "mulldo", "mulli", "mullw", "mullwo",
+ "nand", "neg", "nego", "nop", "nor", "or", "orc", "ori", "oris",
+ "popcntb", "popcntd", "popcntw", "prtyd", "prtyw", "rfid", "rldcl",
+ "rldcr", "rldic", "rldicl", "rldicr", "rldimi", "rlwimi", "rlwinm",
+ "rlwnm", "setb", "sim_cfg", "sld", "slw", "srad", "sradi", "sraw",
+ "srawi", "srd", "srw", "stb", "stbcx", "stbu", "stbux", "stbx", "std",
+ "stdbrx", "stdcx", "stdu", "stdux", "stdx", "sth", "sthbrx", "sthcx",
+ "sthu", "sthux", "sthx", "stw", "stwbrx", "stwcx", "stwu", "stwux",
+ "stwx", "subf", "subfc", "subfco", "subfe", "subfeo", "subfic",
+ "subfme", "subfmeo", "subfo", "subfze", "subfzeo", "sync", "td",
+ "tdi", "tw", "twi", "xor", "xori", "xoris",
+]
+
+# two-way lookup of instruction-to-index and vice-versa
+insns = {}
+asmidx = {}
+for i, insn in enumerate(_insns):
+ insns[i] = insn
+ asmidx[insn] = i
# Internal Operation numbering. Add new opcodes here (FPADD, FPMUL etc.)
@unique
OP_SIM_CONFIG = 68
OP_CROP = 69
OP_RFID = 70
+ OP_MFMSR = 71
+ OP_MTMSRD = 72
+ OP_SC = 73
@unique
RA = 1
RA_OR_ZERO = 2
SPR = 3
+ RS = 4 # for some ALU/Logical operations
@unique
CONST_SH = 10
CONST_SH32 = 11
SPR = 12
+ RS = 13 # for shiftrot (M-Form)
@unique
class In3Sel(Enum):
NONE = 0
RS = 1
+ RB = 2 # for shiftrot (M-Form)
@unique
NONE = 0
is1B = 1
is2B = 2
- is4B = 3
- is8B = 4
+ is4B = 4
+ is8B = 8
@unique
'OV32': 44,
'CA32': 45
}
+
+if __name__ == '__main__':
+ # find out what the heck is in SPR enum :)
+ print ("sprs", len(SPR))
+ print (dir(SPR))
+ print (dir(Enum))
+ print (SPR.__members__['TAR'])
+ for x in SPR:
+ print (x, x.value, str(x), x.name)