📄 ppcopc.cc
字号:
uint32 ret = ((insn >> 16) & 0x1f) | ((insn >> 6) & 0x3e0); if (ret == TB) ret = 0; return ret;}static uint32 extract_vds128(uint32 insn, bool *invalid){ return ((insn<<3) & 0x60) | ((insn>>21) & 0x1f);}static uint32 extract_va128(uint32 insn, bool *invalid){ return ((insn>>4) & 0x40) | (insn & 0x20) | ((insn>>16) & 0x1f);}static uint32 extract_vb128(uint32 insn, bool *invalid){ return ((insn<<5) & 0x60) | ((insn>>11) & 0x1f);}static uint32 extract_vperm(uint32 insn, bool *invalid){ return ((insn>>1) & 0xe0) | ((insn>>16) & 0x1f);}/* The operands table. The fields are bits, shift, signed, extract, flags. */#undef UNUSEDconst struct powerpc_operand powerpc_operands[] ={ /* The zero index is used to indicate the end of the list of operands. */#define UNUSED 0 { 0, 0, 0, 0 }, /* The BA field in an XL form instruction. */#define BA UNUSED + 1#define BA_MASK (0x1f << 16) { 5, 16, 0, PPC_OPERAND_CR }, /* The BA field in an XL form instruction when it must be the same as the BT field in the same instruction. */#define BAT BA + 1 { 5, 16, extract_bat, PPC_OPERAND_FAKE }, /* The BB field in an XL form instruction. */#define BB BAT + 1#define BB_MASK (0x1f << 11) { 5, 11, 0, PPC_OPERAND_CR }, /* The BB field in an XL form instruction when it must be the same as the BA field in the same instruction. */#define BBA BB + 1 { 5, 11, extract_bba, PPC_OPERAND_FAKE }, /* The BD field in a B form instruction. The lower two bits are forced to zero. */#define BD BBA + 1 { 16, 0, extract_bd, PPC_OPERAND_RELATIVE | PPC_OPERAND_SIGNED }, /* The BD field in a B form instruction when absolute addressing is used. */#define BDA BD + 1 { 16, 0, extract_bd, PPC_OPERAND_ABSOLUTE | PPC_OPERAND_SIGNED }, /* The BD field in a B form instruction when the - modifier is used. This sets the y bit of the BO field appropriately. */#define BDM BDA + 1 { 16, 0, extract_bdm, PPC_OPERAND_RELATIVE | PPC_OPERAND_SIGNED }, /* The BD field in a B form instruction when the - modifier is used and absolute address is used. */#define BDMA BDM + 1 { 16, 0, extract_bdm, PPC_OPERAND_ABSOLUTE | PPC_OPERAND_SIGNED }, /* The BD field in a B form instruction when the + modifier is used. This sets the y bit of the BO field appropriately. */#define BDP BDMA + 1 { 16, 0, extract_bdp, PPC_OPERAND_RELATIVE | PPC_OPERAND_SIGNED }, /* The BD field in a B form instruction when the + modifier is used and absolute addressing is used. */#define BDPA BDP + 1 { 16, 0, extract_bdp, PPC_OPERAND_ABSOLUTE | PPC_OPERAND_SIGNED }, /* The BF field in an X or XL form instruction. */#define BF BDPA + 1 { 3, 23, 0, PPC_OPERAND_CR }, /* An optional BF field. This is used for comparison instructions, in which an omitted BF field is taken as zero. */#define OBF BF + 1 { 3, 23, 0, PPC_OPERAND_CR | PPC_OPERAND_OPTIONAL }, /* The BFA field in an X or XL form instruction. */#define BFA OBF + 1 { 3, 18, 0, PPC_OPERAND_CR }, /* The BI field in a B form or XL form instruction. */#define BI BFA + 1#define BI_MASK (0x1f << 16) { 5, 16, 0, PPC_OPERAND_CR }, /* The BO field in a B form instruction. Certain values are illegal. */#define BO BI + 1#define BO_MASK (0x1f << 21) { 5, 21, extract_bo, 0 }, /* The BO field in a B form instruction when the + or - modifier is used. This is like the BO field, but it must be even. */#define BOE BO + 1 { 5, 21, extract_boe, 0 }, /* The BT field in an X or XL form instruction. */#define BT BOE + 1 { 5, 21, 0, PPC_OPERAND_CR }, /* The condition register number portion of the BI field in a B form or XL form instruction. This is used for the extended conditional branch mnemonics, which set the lower two bits of the BI field. This field is optional. */#define CR BT + 1 { 3, 18, 0, PPC_OPERAND_CR | PPC_OPERAND_OPTIONAL }, /* The CRB field in an X form instruction. */#define CRB CR + 1 { 5, 6, 0, 0 }, /* The CRFD field in an X form instruction. */#define CRFD CRB + 1 { 3, 23, 0, PPC_OPERAND_CR }, /* The CRFS field in an X form instruction. */#define CRFS CRFD + 1 { 3, 0, 0, PPC_OPERAND_CR }, /* The CT field in an X form instruction. */#define CT CRFS + 1 { 5, 21, 0, PPC_OPERAND_OPTIONAL }, /* The D field in a D form instruction. This is a displacement off a register, and implies that the next operand is a register in parentheses. */#define D CT + 1 { 16, 0, 0, PPC_OPERAND_PARENS | PPC_OPERAND_SIGNED }, /* The DE field in a DE form instruction. This is like D, but is 12 bits only. */#define DE D + 1 { 14, 0, extract_de, PPC_OPERAND_PARENS }, /* The DES field in a DES form instruction. This is like DS, but is 14 bits only (12 stored.) */#define DES DE + 1 { 14, 0, extract_des, PPC_OPERAND_PARENS | PPC_OPERAND_SIGNED }, /* The DQ field in a DQ form instruction. This is like D, but the lower four bits are forced to zero. */#define DQ DES + 1 { 16, 0, extract_dq, PPC_OPERAND_PARENS | PPC_OPERAND_SIGNED | PPC_OPERAND_DQ }, /* The DS field in a DS form instruction. This is like D, but the lower two bits are forced to zero. */#define DS DQ + 1 { 16, 0, extract_ds, PPC_OPERAND_PARENS | PPC_OPERAND_SIGNED | PPC_OPERAND_DS }, /* The FLM field in an XFL form instruction. */#define FLM DS + 1 { 8, 17, 0, 0 }, /* The FRA field in an X or A form instruction. */#define FRA FLM + 1#define FRA_MASK (0x1f << 16) { 5, 16, 0, PPC_OPERAND_FPR }, /* The FRB field in an X or A form instruction. */#define FRB FRA + 1#define FRB_MASK (0x1f << 11) { 5, 11, 0, PPC_OPERAND_FPR }, /* The FRC field in an A form instruction. */#define FRC FRB + 1#define FRC_MASK (0x1f << 6) { 5, 6, 0, PPC_OPERAND_FPR }, /* The FRS field in an X form instruction or the FRT field in a D, X or A form instruction. */#define FRS FRC + 1#define FRT FRS { 5, 21, 0, PPC_OPERAND_FPR }, /* The FXM field in an XFX instruction. */#define FXM FRS + 1#define FXM_MASK (0xff << 12) { 8, 12, 0, 0 }, /* The L field in a D or X form instruction. */#define L FXM + 1 { 1, 21, 0, PPC_OPERAND_OPTIONAL }, /* The LI field in an I form instruction. The lower two bits are forced to zero. */#define LI L + 1 { 26, 0, extract_li, PPC_OPERAND_RELATIVE | PPC_OPERAND_SIGNED }, /* The LI field in an I form instruction when used as an absolute address. */#define LIA LI + 1 { 26, 0, extract_li, PPC_OPERAND_ABSOLUTE | PPC_OPERAND_SIGNED }, /* The LS field in an X (sync) form instruction. */#define LS LIA + 1 { 2, 21, 0, PPC_OPERAND_OPTIONAL }, /* The MB field in an M form instruction. */#define MB LS + 1#define MB_MASK (0x1f << 6) { 5, 6, 0, 0 }, /* The ME field in an M form instruction. */#define ME MB + 1#define ME_MASK (0x1f << 1) { 5, 1, 0, 0 }, /* The MB and ME fields in an M form instruction expressed a single operand which is a bitmask indicating which bits to select. This is a two operand form using PPC_OPERAND_NEXT. See the description in opcode/ppc.h for what this means. */#define MBE ME + 1 { 5, 6, 0, PPC_OPERAND_OPTIONAL | PPC_OPERAND_NEXT }, { 32, 0, extract_mbe, 0 }, /* The MB or ME field in an MD or MDS form instruction. The high bit is wrapped to the low end. */#define MB6 MBE + 2#define ME6 MB6#define MB6_MASK (0x3f << 5) { 6, 5, extract_mb6, 0 },#define MSLWI MB6 + 1 { 0, 0, extract_mbe_special1, PPC_OPERAND_FAKE },#define MSRWI MSLWI + 1 { 0, 0, extract_mbe_special2, PPC_OPERAND_FAKE }, /* The MO field in an mbar instruction. */#define MO MSRWI + 1 { 5, 21, 0, 0 }, /* The NB field in an X form instruction. The value 32 is stored as 0. */#define NB MO + 1 { 6, 11, extract_nb, 0 }, /* The NSI field in a D form instruction. This is the same as the SI field, only negated. */#define NSI NB + 1 { 16, 0, extract_nsi, PPC_OPERAND_NEGATIVE | PPC_OPERAND_SIGNED }, /* The RA field in an D, DS, X, XO, M, or MDS form instruction. */#define RA NSI + 1#define RAM RA#define RAS RA#define RAL RA#define RA_MASK (0x1f << 16) { 5, 16, 0, PPC_OPERAND_GPR }, /* As above, but 0 in the RA field means zero, not r0. */#define RA0 RA + 1#define RAQ RA0 { 5, 16, 0, PPC_OPERAND_GPR_0 }, /* The RB field in an X, XO, M, or MDS form instruction. */#define RB RA0 + 1#define RB_MASK (0x1f << 11) { 5, 11, 0, PPC_OPERAND_GPR }, /* The RB field in an X form instruction when it must be the same as the RS field in the instruction. This is used for extended mnemonics like mr. */#define RBS RB + 1 { 5, 1, extract_rbs, PPC_OPERAND_FAKE }, /* The RS field in a D, DS, X, XFX, XS, M, MD or MDS form instruction or the RT field in a D, DS, X, XFX or XO form instruction. */#define RS RBS + 1#define RT RS#define RT_MASK (0x1f << 21) { 5, 21, 0, PPC_OPERAND_GPR }, /* The RS field of the DS form stq instruction, which has special value restrictions. */#define RSQ RS + 1 { 5, 21, 0, PPC_OPERAND_GPR_0 }, /* The RT field of the DQ form lq instruction, which has special value restrictions. */#define RTQ RSQ + 1 { 5, 21, 0, PPC_OPERAND_GPR_0 }, /* The SH field in an X or M form instruction. */#define SH RTQ + 1#define SH_MASK (0x1f << 11) { 5, 11, 0, 0 }, /* The SH field in an MD form instruction. This is split. */#define SH6 SH + 1#define SH6_MASK ((0x1f << 11) | (1 << 1)) { 6, 1, extract_sh6, 0 }, /* The SI field in a D form instruction. */#define SI SH6 + 1 { 16, 0, 0, PPC_OPERAND_SIGNED }, /* The SI field in a D form instruction when we accept a wide range of positive values. */#define SISIGNOPT SI + 1 { 16, 0, 0, PPC_OPERAND_SIGNED | PPC_OPERAND_SIGNOPT }, /* The SPR field in an XFX form instruction. This is flipped--the lower 5 bits are stored in the upper 5 and vice- versa. */#define SPR SISIGNOPT + 1#define PMR SPR#define SPR_MASK (0x3ff << 11)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -