Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

398 lines
14 KiB

/* #ifdef _MOTO_EXTENSIONS */
/* PowerPC instruction set from IBM PowerPC User Instruction Set Architecture
Book 1, Version 1.04 May 4,1993 */
/* These are the instruction format types. Keep them in the same order as the
eopFormat array below. */
enum { I=0, B, SC, Dform, DSform, X, XL, XFX, XFL, XS, XO, A, M, MD, MDS };
/* The values in this array are used to isolate the extended opcodes.
The first is the mask, the second is the amount to shift.
Keep them in the same order as the enum'ed instruction format types above. */
static int eopFormat[15][2] = {
0, 1, /* I */
0, 1, /* B */
0x1, 1, /* SC */
0, 1, /* Dform */
0x3, 0, /* DSform */
0x3ff, 1, /* X */
0x3ff, 1, /* XL */
0x3ff, 1, /* XFX */
0x3ff, 1, /* XFL */
0x1ff, 2, /* XS */
0x1ff, 1, /* XO */
0x1f, 1, /* A */
0, 1, /* M */
0x7, 2, /* MD */
0xf, 1 /* MDS */
};
/* Information about each instruction */
typedef struct ppc_instruction {
char *mnemonic; /* instruction mnemonic */
char *mne_ext; /* instruction mnemonic extension */
int ext_opcode; /* extended opcode */
char operand_fmt[6]; /* operand formats */
} INSTRUCTION;
/* These are the operand formats. */
enum { BA=1,
BB,
BD,
BF,
BFA,
BI,
BO,
BT,
D,
DS,
FLM,
FRA,
FRB,
FRC,
FRS,
FRT,
FXM,
L,
LI,
PPC_MB,
ME,
MBE64,
NB,
RA,
RB,
RS,
PPC_RT,
SH,
SH64,
SI,
SPR,
SR,
TBR,
TO,
U,
UI
};
/* PowerPC instruction set as defined in
IBM PowerPC Architecture Books, Version 1.04 May 4,1993
Many of the PowerPC instructions map to the same primary opcode
and are unique only in the extended opcode. There is a table for
each group of extended opcodes (i.e., those with the same primary
opcode) and a table of instructions with unique primary opcodes.
The unique primary opcode can be used as a direct index into the
primary opcode table. A binary search is performed on the extended
opcode tables. The size and location of the extended opcode bit field
varies according to the instruction, so all format variations must be
checked when searching for extended opcodes. All the unique format
variations for a given primary opcode are kept in an associated table. All format variations need not be present in the format table, just the
ones so that all unique extended opcode fields are represented.
Note that the primary and extended opcode tables use the same
structure, so that the code that uses the information in the table
need not know which table it is from.
mnemonic options eop operand formats opcode */
struct ppc_instruction pop_insn [] = {
{"Illegal", 0, 0, {0} }, /* 0 */
{"Illegal", 0, 0, {0} }, /* 1 */
{"tdi", 0, -1, {TO,RA,SI,0} }, /* 2 */
{"twi", 0, -1, {TO,RA,SI,0} }, /* 3 */
{"Illegal", 0, 0, {0} }, /* 4 */
{"Illegal", 0, 0, {0} }, /* 5 */
{"Illegal", 0, 0, {0} }, /* 6 */
{"mulli", 0, -1, {PPC_RT,RA,SI,0} }, /* 7 */
{"subfic", 0, -1, {PPC_RT,RA,SI,0} }, /* 8 */
{"Illegal", 0, 0, {0} }, /* 9 */
{"cmpli", 0, -1, {BF,L,RA,UI,0} }, /* 10 */
{"cmpi", 0, -1, {BF,L,RA,SI,0} }, /* 11 */
{"addic", 0, -1, {PPC_RT,RA,SI,0} }, /* 12 */
{"addic.", 0, -1, {PPC_RT,RA,SI,0} }, /* 13 */
{"addi", 0, -1, {PPC_RT,RA,SI,0} }, /* 14 */
{"addis", 0, -1, {PPC_RT,RA,SI,0} }, /* 15 */
{"bc", "la", -1, {BO,BI,BD,0} }, /* 16 */
{"sc", 0, -1, {0} }, /* 17 */
{"b", "la", -1, {LI,0} }, /* 18 */
{"Unknown", 0, 0, {0} }, /* 19 */
{"rlwimi", ".", -1, {RA,RS,SH,PPC_MB,ME,0} }, /* 20 */
{"rlwinm", ".", -1, {RA,RS,SH,PPC_MB,ME,0} }, /* 21 */
{"Illegal", 0, 0, {0} }, /* 22 */
{"rlwnm", ".", -1, {RA,RS,RB,PPC_MB,ME,0} }, /* 23 */
{"ori", 0, -1, {RA,RS,UI,0} }, /* 24 */
{"oris", 0, -1, {RA,RS,UI,0} }, /* 25 */
{"xori", 0, -1, {RA,RS,UI,0} }, /* 26 */
{"xoris", 0, -1, {RA,RS,UI,0} }, /* 27 */
{"andi.", 0, -1, {RA,RS,UI,0} }, /* 28 */
{"andis.", 0, -1, {RA,RS,UI,0} }, /* 29 */
{"Unknown", 0, 0, {0} }, /* 30 */
{"Unknown", 0, 0, {0} }, /* 31 */
{"lwz", 0, -1, {PPC_RT,D,RA,0} }, /* 32 */
{"lwzu", 0, -1, {PPC_RT,D,RA,0} }, /* 33 */
{"lbz", 0, -1, {PPC_RT,D,RA,0} }, /* 34 */
{"lbzu", 0, -1, {PPC_RT,D,RA,0} }, /* 35 */
{"stw", 0, -1, {RS,D,RA,0} }, /* 36 */
{"stwu", 0, -1, {RS,D,RA,0} }, /* 37 */
{"stb", 0, -1, {RS,D,RA,0} }, /* 38 */
{"stbu", 0, -1, {RS,D,RA,0} }, /* 39 */
{"lhz", 0, -1, {PPC_RT,D,RA,0} }, /* 40 */
{"lhzu", 0, -1, {PPC_RT,D,RA,0} }, /* 41 */
{"lha", 0, -1, {PPC_RT,D,RA,0} }, /* 42 */
{"lhau", 0, -1, {PPC_RT,D,RA,0} }, /* 43 */
{"sth", 0, -1, {RS,D,RA,0} }, /* 44 */
{"sthu", 0, -1, {RS,D,RA,0} }, /* 45 */
{"lmw", 0, -1, {PPC_RT,D,RA,0} }, /* 46 */
{"stmw", 0, -1, {RS,D,RA,0} }, /* 47 */
{"lfs", 0, -1, {FRT,D,RA,0} }, /* 48 */
{"lfsu", 0, -1, {FRT,D,RA,0} }, /* 49 */
{"lfd", 0, -1, {FRT,D,RA,0} }, /* 50 */
{"lfdu", 0, -1, {FRT,D,RA,0} }, /* 51 */
{"stfs", 0, -1, {FRS,D,RA,0} }, /* 52 */
{"stfsu", 0, -1, {FRS,D,RA,0} }, /* 53 */
{"stfd", 0, -1, {FRS,D,RA,0} }, /* 54 */
{"stfdu", 0, -1, {FRS,D,RA,0} }, /* 55 */
{"Illegal", 0, 0, {0} }, /* 56 */
{"Illegal", 0, 0, {0} }, /* 57 */
{"Unknown", 0, 0, {0} }, /* 58 */
{"Unknown", 0, 0, {0} }, /* 59 */
{"Illegal", 0, 0, {0} }, /* 60 */
{"Illegal", 0, 0, {0} }, /* 61 */
{"Unknown", 0, 0, {0} }, /* 62 */
{"Unknown", 0, 0, {0} }, /* 63 */
};
struct ppc_instruction pop19_insn [] = {
{"mcrf", 0, 0, {BF,BFA,0} },
{"bclr", "l", 16, {BO,BI,0} },
{"crnor", 0, 33, {BT,BA,BB,0} },
{"rfi", 0, 50, {0} },
{"crandc", 0, 129, {BT,BA,BB,0} },
{"isync", 0, 150, {0} },
{"crxor", 0, 193, {BT,BA,BB,0} },
{"crnand", 0, 225, {BT,BA,BB,0} },
{"crand", 0, 257, {BT,BA,BB,0} },
{"creqv", 0, 289, {BT,BA,BB,0} },
{"crorc", 0, 417, {BT,BA,BB,0} },
{"cror", 0, 449, {BT,BA,BB,0} },
{"bcctr", "l", 528, {BO,BI,0} },
};
struct ppc_instruction pop30_insn [] = {
{"rldicl", ".", 0, {RA,RS,SH64,MBE64,0} },
{"rldicr", ".", 1, {RA,RS,SH64,MBE64,0} },
{"rldic", ".", 2, {RA,RS,SH64,MBE64,0} },
{"rldimi", ".", 3, {RA,RS,SH64,MBE64,0} },
{"rldcl", ".", 8, {RA,RS,RB,MBE64,0} },
{"rldcr", ".", 9, {RA,RS,RB,MBE64,0} },
};
struct ppc_instruction pop31_insn [] = {
{"cmp", 0, 0, {BF,L,RA,RB,0} },
{"tw", 0, 4, {TO,RA,RB,0} },
{"subfc", "o.", 8, {PPC_RT,RA,RB,0} },
{"mulhdu", ".", 9, {PPC_RT,RA,RB,0} },
{"addc", "o.", 10, {PPC_RT,RA,RB,0} },
{"mulhwu", ".", 11, {PPC_RT,RA,RB,0} },
{"mfcr", 0, 19, {PPC_RT,0} },
{"lwarx", 0, 20, {PPC_RT,RA,RB,0} },
{"ldx", 0, 21, {PPC_RT,RA,RB,0} },
{"lwzx", 0, 23, {PPC_RT,RA,RB,0} },
{"slw", ".", 24, {RA,RS,RB,0} },
{"cntlzw", ".", 26, {RA,RS,0} },
{"sld", ".", 27, {RA,RS,RB,0} },
{"and", ".", 28, {RA,RS,RB,0} },
{"cmpl", 0, 32, {BF,L,RA,RB,0} },
{"subf", "o.", 40, {PPC_RT,RA,RB,0} },
{"ldux", 0, 53, {PPC_RT,RA,RB,0} },
{"dcbst", 0, 54, {RA,RB,0} },
{"lwzux", 0, 55, {PPC_RT,RA,RB,0} },
{"cntlzd", ".", 58, {RA,RS,0} },
{"andc", ".", 60, {RA,RS,RB,0} },
{"td", 0, 68, {TO,RA,RB,0} },
{"mulhd", ".", 73, {PPC_RT,RA,RB,0} },
{"mulhw", ".", 75, {PPC_RT,RA,RB,0} },
{"mfmsr", 0, 83, {PPC_RT,0} },
{"ldarx", 0, 84, {PPC_RT,RA,RB,0} },
{"dcbf", 0, 86, {RA,RB,0} },
{"lbzx", 0, 87, {PPC_RT,RA,RB,0} },
{"neg", "o.", 104, {PPC_RT,RA,0} },
{"mfpmr", 0, 115, {PPC_RT,0} },
{"lbzux", 0, 119, {PPC_RT,RA,RB,0} },
{"nor", ".", 124, {RA,RS,RB,0} },
{"subfe", "o.", 136, {PPC_RT,RA,RB,0} },
{"adde", "o.", 138, {PPC_RT,RA,RB,0} },
{"mtcrf", 0, 144, {FXM,RS,0} },
{"mtmsr", 0, 146, {RS,0} },
{"stdx", 0, 149, {RS,RA,RB,0} },
{"stwcx.", 0, 150, {RS,RA,RB,0} },
{"stwx", 0, 151, {RS,RA,RB,0} },
{"mtpmr", 0, 178, {RS,0} },
{"stdux", 0, 181, {RS,RA,RB,0} },
{"stwux", 0, 183, {RS,RA,RB,0} },
{"subfze", "o.", 200, {PPC_RT,RA,0} },
{"addze", "o.", 202, {PPC_RT,RA,0} },
{"mtsr", 0, 210, {SR,RS,0} },
{"stdcx.", 0, 214, {RS,RA,RB,0} },
{"stbx", 0, 215, {RS,RA,RB,0} },
{"subfme", "o.", 232, {PPC_RT,RA,0} },
{"addme", "o.", 234, {PPC_RT,RA,0} },
{"mull", "o.", 235, {PPC_RT,RA,RB,0} },
{"mtsrin", 0, 242, {RS,RB,0} },
{"dcbtst", 0, 246, {RA,RB,0} },
{"stbux", 0, 247, {RS,RA,RB,0} },
{"add", "o.", 266, {PPC_RT,RA,RB,0} },
{"dcbt", 0, 278, {RA,RB,0} },
{"lhzx", 0, 279, {PPC_RT,RA,RB,0} },
{"eqv", ".", 284, {RA,RS,RB,0} },
{"tlbie", 0, 306, {RB,0} },
{"eciwx", 0, 310, {PPC_RT,RA,RB,0} },
{"lhzux", 0, 311, {PPC_RT,RA,RB,0} },
{"xor", ".", 316, {RA,RS,RB,0} },
{"tlbiex", 0, 338, {RB,0} },
{"mfspr", 0, 339, {PPC_RT,SPR,0} },
{"lwax", 0, 341, {PPC_RT,RA,RB,0} },
{"lhax", 0, 343, {PPC_RT,RA,RB,0} },
{"tlbia", 0, 370, {0} },
{"mftb", 0, 371, {PPC_RT,TBR,0} },
{"lwaux", 0, 373, {PPC_RT,RA,RB,0} },
{"lhaux", 0, 375, {PPC_RT,RA,RB,0} },
{"mttb", 0, 403, {RB,0} },
{"sthx", 0, 407, {RS,RA,RB,0} },
{"orc", ".", 412, {RA,RS,RB,0} },
{"sradi", ".", 413, {RA,RS,SH64,0} },
{"slbie", 0, 434, {RB,0} },
{"mttbu", 0, 435, {RB,0} },
{"ecowx", 0, 438, {RS,RA,RB,0} },
{"sthux", 0, 439, {RS,RA,RB,0} },
{"or", ".", 444, {RA,RS,RB,0} },
{"divdu", "o.", 457, {PPC_RT,RA,RB,0} },
{"divwu", "o.", 459, {PPC_RT,RA,RB,0} },
{"slbiex", 0, 466, {RB,0} },
{"mtspr", 0, 467, {SPR,RS,0} },
{"dcbi", 0, 470, {RA,RB,0} },
{"nand", ".", 476, {RA,RS,RB,0} },
{"divd", "o.", 489, {PPC_RT,RA,RB,0} },
{"divw", "o.", 491, {PPC_RT,RA,RB,0} },
{"slbia", 0, 498, {0} },
{"mcrxr", 0, 512, {BF,0} },
{"lswx", 0, 533, {PPC_RT,RA,RB,0} },
{"lwbrx", 0, 534, {PPC_RT,RA,RB,0} },
{"lfsx", 0, 535, {FRT,RA,RB,0} },
{"srw", ".", 536, {RA,RS,RB,0} },
{"srd", ".", 539, {RA,RS,RB,0} },
{"lfsux", 0, 567, {FRT,RA,RB,0} },
{"mfsr", 0, 595, {PPC_RT,SR,0} },
{"lswi", 0, 597, {PPC_RT,RA,NB,0} },
{"sync", 0, 598, {0} },
{"lfdx", 0, 599, {FRT,RA,RB,0} },
{"lfdux", 0, 631, {FRT,RA,RB,0} },
{"mfsrin", 0, 659, {PPC_RT,RB,0} },
{"stswx", 0, 661, {RS,RA,RB,0} },
{"stwbrx", 0, 662, {RS,RA,RB,0} },
{"stfsx", 0, 663, {FRS,RA,RB,0} },
{"stfsux", 0, 695, {FRS,RA,RB,0} },
{"stswi", 0, 725, {RS,RA,NB,0} },
{"stfdx", 0, 727, {FRS,RA,RB,0} },
{"stfdux", 0, 759, {FRS,RA,RB,0} },
{"lhbrx", 0, 790, {PPC_RT,RA,RB,0} },
{"sraw", ".", 792, {RA,RS,RB,0} },
{"srad", ".", 794, {RA,RS,RB,0} },
{"srawi", ".", 824, {RA,RS,SH,0} },
{"eieio", 0, 854, {0} },
{"sthbrx", 0, 918, {RS,RA,RB,0} },
{"extsh", ".", 922, {RA,RS,0} },
{"extsb", ".", 954, {RA,RS,0} },
{"icbi", 0, 982, {RA,RB,0} },
{"stfiwx", 0, 983, {FRS,RA,RB,0} },
{"extsw", ".", 986, {RA,RS,0} },
{"dcbz", 0, 1014, {RA,RB,0} },
};
struct ppc_instruction pop58_insn [] = {
{"ld", 0, 0, {PPC_RT,DS,RA,0} },
{"ldu", 0, 1, {PPC_RT,DS,RA,0} },
{"lwa", 0, 2, {PPC_RT,DS,RA,0} },
{"lmd", 0, 3, {PPC_RT,DS,RA,0} },
};
struct ppc_instruction pop59_insn [] = {
{"fdivs", ".", 18, {FRT,FRA,FRB,0} },
{"fsubs", ".", 20, {FRT,FRA,FRB,0} },
{"fadds", ".", 21, {FRT,FRA,FRB,0} },
{"fsqrts", ".", 22, {FRT,FRB,0} },
{"fres", ".", 24, {FRT,FRB,0} },
{"fmuls", ".", 25, {FRT,FRA,FRC,0} },
{"fmsubs", ".", 28, {FRT,FRA,FRC,FRB,0} },
{"fmadds", ".", 29, {FRT,FRA,FRC,FRB,0} },
{"fnmsubs", ".", 30, {FRT,FRA,FRC,FRB,0} },
{"fnmadds", ".", 31, {FRT,FRA,FRC,FRB,0} },
};
struct ppc_instruction pop62_insn [] = {
{"std", 0, 0, {RS,DS,RA,0} },
{"stdu", 0, 1, {RS,DS,RA,0} },
{"stmd", 0, 3, {RS,DS,RA,0} },
};
struct ppc_instruction pop63_insn [] = {
{"fcmpu", 0, 0, {BF,FRA,FRB,0} },
{"frsp", ".", 12, {FRT,FRB,0} },
{"fctiw", ".", 14, {FRT,FRB,0} },
{"fctiwz", ".", 15, {FRT,FRB,0} },
{"fdiv", ".", 18, {FRT,FRA,FRB,0} },
{"fsub", ".", 20, {FRT,FRA,FRB,0} },
{"fadd", ".", 21, {FRT,FRA,FRB,0} },
{"fsqrt", ".", 22, {FRT,FRB,0} },
{"fsel", ".", 23, {FRT,FRA,FRB,FRC,0} },
{"fmul", ".", 25, {FRT,FRA,FRC,0} },
{"frsqrte", ".", 26, {FRT,FRB,0} },
{"fmsub", ".", 28, {FRT,FRA,FRC,FRB,0} },
{"fmadd", ".", 29, {FRT,FRA,FRC,FRB,0} },
{"fnmsub", ".", 30, {FRT,FRA,FRC,FRB,0} },
{"fnmadd", ".", 31, {FRT,FRA,FRC,FRB,0} },
{"fcmpo", 0, 32, {BF,FRA,FRB,0} },
{"mtfsb1", ".", 38, {BT,0} },
{"fneg", ".", 40, {FRT,FRB,0} },
{"mcrfs", 0, 64, {BF,BFA,0} },
{"mtfsb0", ".", 70, {BT,0} },
{"fmr", ".", 72, {FRT,FRB,0} },
{"mtfsfi", ".", 134, {BF,U,0} },
{"fnabs", ".", 136, {FRT,FRB,0} },
{"fabs", ".", 264, {FRT,FRB,0} },
{"mffs", ".", 583, {FRT,0} },
{"mtfsf", ".", 711, {FLM,FRB,0} },
{"fctid", ".", 814, {FRT,FRB,0} },
{"fctidz", ".", 815, {FRT,FRB,0} },
{"fcfid", ".", 846, {FRT,FRB,0} },
};
/* popXX_fmts is a list of instruction formats for the corresponding
extended opcode instruction table. When adding an instruction to the
table, add a format to the list if the extended opcode maps differently
than one that is already on the list. Leave the "-1" at the end to
terminate searches.
Note that it is best to keep the most common format first in the
tables, because formats are checked in the order they appear.
Also note that XFX is not in the format list because it is not
a unique mapping. */
int pop19_fmts [] = { XL, -1 };
int pop30_fmts [] = { MD, MDS, -1 };
int pop31_fmts [] = { X, XO, XS, -1 };
int pop58_fmts [] = { DS, -1 };
int pop59_fmts [] = { A, -1 };
int pop62_fmts [] = { DS, -1 };
int pop63_fmts [] = { X, A, -1 };
/* This calculates the number of entries in each table */
#define COUNT19 (sizeof (pop19_insn) / sizeof (struct ppc_instruction))
#define COUNT30 (sizeof (pop30_insn) / sizeof (struct ppc_instruction))
#define COUNT31 (sizeof (pop31_insn) / sizeof (struct ppc_instruction))
#define COUNT58 (sizeof (pop58_insn) / sizeof (struct ppc_instruction))
#define COUNT59 (sizeof (pop59_insn) / sizeof (struct ppc_instruction))
#define COUNT62 (sizeof (pop62_insn) / sizeof (struct ppc_instruction))
#define COUNT63 (sizeof (pop63_insn) / sizeof (struct ppc_instruction))
/* #endif _MOTO_EXTENSIONS */