PPCINST.H
/*++  
 
Copyright (c) 1993  IBM Corporation 
 
Module Name: 
 
    ppcinst.h 
 
Abstract: 
 
    PowerPC instruction and floating constant definitions. 
 
Author: 
 
    Rick Simpson   30 July 1993 
 
Revision History: 
 
--*/ 
 
#ifndef _PPCINST_ 
#define _PPCINST_ 
  
// 
//     POWERPC INSTRUCTION FORMAT STRUCTURES 
// 
 
typedef union _PPC_INSTRUCTION { 
    ULONG Long; 
    UCHAR Byte[4]; 
 
    struct { 
        ULONG bit31   :  1; 
        ULONG bit30   :  1; 
 LONG bit6_29 : 24; 
ULONG bit0_5  :  6; 
    } i_f; 
 
#define Primary_Op  i_f.bit0_5 
 
#define Iform_LI  i_f.bit6_29 
#define Iform_AA  i_f.bit30 
#define Iform_LK  i_f.bit31 
 
    struct { 
        ULONG bit31    :  1; 
        ULONG bit30    :  1; 
 LONG bit16_29 : 14; 
ULONG bit11_15 :  5; 
ULONG bit6_10  :  5; 
        ULONG bit0_5   :  6; 
    } b_f; 
 
#define Bform_BO  b_f.bit6_10 
#define Bform_BI  b_f.bit11_15 
#define Bform_BD  b_f.bit16_29 
#define Bform_AA  b_f.bit30 
#define Bform_LK  b_f.bit31 
 
    struct { 
ULONG bit31    :  1; 
ULONG bit30    :  1; 
ULONG bit6_29  : 24; 
ULONG bit0_5   :  6; 
    } sc_f; 
 
#define SCform_XO  sc_f.bit30 
 
    struct { 
 LONG bit16_31 : 16; 
ULONG bit11_15 :  5; 
ULONG bit6_10  :  5; 
ULONG bit0_5   :  6; 
    } d_f1; 
    struct { 
ULONG bit16_31 : 16; 
ULONG bit11_15 :  5; 
ULONG bit10    :  1; 
ULONG bit9     :  1; 
ULONG bit6_8   :  3; 
ULONG bit0_5   :  6; 
    } d_f2; 
 
#define Dform_RT   d_f1.bit6_10 
#define Dform_RS   d_f1.bit6_10 
#define Dform_TO   d_f1.bit6_10 
#define Dform_FRT  d_f1.bit6_10 
#define Dform_FRS  d_f1.bit6_10 
#define Dform_BF   d_f2.bit6_8 
#define Dform_L    d_f2.bit10 
#define Dform_RA   d_f1.bit11_15 
#define Dform_D    d_f1.bit16_31 
#define Dform_SI   d_f1.bit16_31 
#define Dform_UI   d_f2.bit16_31 
     
    struct { 
ULONG bit30_31 :  2; 
 LONG bit16_29 : 14; 
ULONG bit11_15 :  5; 
ULONG bit6_10  :  5; 
ULONG bit0_5   :  6; 
    } ds_f; 
 
#define DSform_RT  ds_f.bit6_10 
#define DSform_RS  ds_f.bit6_10 
#define DSform_RA  ds_f.bit11_15 
#define DSform_DS  ds_f.bit16_29 
#define DSform_XO  ds_f.bit30_31 
 
    struct { 
ULONG bit31    :  1; 
ULONG bit21_30 : 10; 
ULONG bit16_20 :  5; 
ULONG bit11_15 :  5; 
ULONG bit6_10  :  5; 
ULONG bit0_5   :  6; 
    } x_f1; 
    struct { 
ULONG bit20_31 : 12; 
ULONG bit16_19 :  4; 
ULONG bit14_15 :  2; 
ULONG bit11_13 :  3; 
ULONG bit10    :  1; 
ULONG bit9     :  1; 
ULONG bit6_8   :  3; 
ULONG bit0_5   :  6; 
    } x_f2; 
    struct { 
ULONG bit16_31 : 16; 
ULONG bit12_15 :  4; 
ULONG bit0_11  : 12; 
    } x_f3; 
 
#define Xform_RT   x_f1.bit6_10 
#define Xform_RS   x_f1.bit6_10 
#define Xform_TO   x_f1.bit6_10 
#define Xform_FRT  x_f1.bit6_10 
#define Xform_FRS  x_f1.bit6_10 
#define Xform_BT   x_f1.bit6_10 
#define Xform_BF   x_f2.bit6_8 
#define Xform_L    x_f2.bit10 
#define Xform_RA   x_f1.bit11_15 
#define Xform_FRA  x_f1.bit11_15 
#define Xform_BFA  x_f2.bit11_13 
#define Xform_SR   x_f3.bit12_15 
#define Xform_RB   x_f1.bit16_20 
#define Xform_NB   x_f1.bit16_20 
#define Xform_SH   x_f1.bit16_20 
#define Xform_FRB  x_f1.bit16_20 
#define Xform_U    x_f2.bit16_19 
#define Xform_XO   x_f1.bit21_30 
#define Xform_RC   x_f1.bit31 
 
    struct { 
ULONG bit31    :  1; 
ULONG bit21_30 : 10; 
ULONG bit16_20 :  5; 
ULONG bit11_15 :  5; 
ULONG bit6_10  :  5; 
ULONG bit0_5   :  6; 
    } xl_f1; 
    struct { 
ULONG bit14_31 : 18; 
ULONG bit11_13 :  3; 
ULONG bit9_10  :  2; 
ULONG bit6_8   :  3; 
ULONG bit0_5   :  6; 
    } xl_f2; 
 
#define XLform_LK   xl_f1.bit31 
#define XLform_XO   xl_f1.bit21_30 
#define XLform_BB   xl_f1.bit16_20 
#define XLform_BA   xl_f1.bit11_15 
#define XLform_BI   xl_f1.bit11_15 
#define XLform_BFA  xl_f2.bit11_13 
#define XLform_BT   xl_f1.bit6_10 
#define XLform_BO   xl_f1.bit6_10 
#define XLform_BF   xl_f2.bit6_8 
 
    struct { 
ULONG bit31    :  1; 
ULONG bit21_30 : 10; 
ULONG bit11_20 : 10; 
ULONG bit6_10  :  5; 
ULONG bit0_5   :  6; 
    } xfx_f1; 
    struct {  
ULONG bit20_31 : 12; 
ULONG bit12_19 :  8; 
ULONG bit6_11  :  6; 
ULONG bit0_5   :  6; 
    } xfx_f2; 
 
#define XFXform_RT  xfx_f1.bit6_10 
#define XFXform_RS  xfx_f1.bit6_10 
#define XFXform_spr xfx_f1.bit11_20 
#define XFXform_tbr xfx_f1.bit11_20 
#define XFXform_spr xfx_f1.bit11_20 
#define XFXform_FXM xfx_f2.bit12_19 
#define XFXform_XO  xfx_f1.bit21_30 
 
    struct { 
ULONG bit31    :  1; 
ULONG bit21_30 : 10; 
ULONG bit16_20 :  5; 
ULONG bit15    :  1; 
ULONG bit7_14  :  8; 
ULONG bit6     :  1; 
ULONG bit0_5   :  6; 
    } xfl_f; 
 
#define XFLform_FLM xfl_f.bit7_14 
#define XFLform_FRB xfl_f.bit16_20 
#define XFLform_XO  xfl_f.bit21_30 
#define XFLform_RC  xfl_f.bit31 
     
    struct { 
ULONG bit31    :  1; 
ULONG bit30    :  1; 
ULONG bit21_29 :  9; 
ULONG bit16_20 :  5; 
ULONG bit10_15 :  5; 
ULONG bit6_10  :  5; 
ULONG bit0_5   :  6; 
    } xs_f; 
 
#define XSform_RS  xs_f.bit6_10 
#define XSform_RA  xs_f.bit11_15 
#define XSform_sh1 xs_f.bit16_20 
#define XSform_XO  xs_f.bit21_29 
#define XSform_sh2 xs_f.bit30 
#define XSform_RC  xs_f.bit31 
     
    struct { 
ULONG bit31    :  1; 
ULONG bit22_30 :  9; 
ULONG bit21    :  1; 
ULONG bit16_20 :  5; 
ULONG bit10_15 :  5; 
ULONG bit6_10  :  5; 
ULONG bit0_5   :  6; 
    } xo_f; 
 
#define XOform_RT  xo_f.bit6_10 
#define XOform_RA  xo_f.bit11_15 
#define XOform_RB  xo_f.bit16_20 
#define XOform_OE  xo_f.bit21 
#define XOform_XO  xo_f.bit22_30 
#define XOform_RC  xo_f.bit31 
     
    struct { 
ULONG bit31    :  1; 
ULONG bit26_30 :  5; 
ULONG bit21_25 :  5; 
ULONG bit16_20 :  5; 
ULONG bit11_15 :  5; 
ULONG bit6_10  :  5; 
ULONG bit0_5   :  6; 
    } a_f; 
 
#define Aform_FRT  a_f.bit6_10 
#define Aform_FRA  a_f.bit11_15 
#define Aform_FRB  a_f.bit16_20 
#define Aform_FRC  a_f.bit21_25 
#define Aform_XO   a_f.bit26_30 
#define Aform_RC   a_f.bit31 
     
    struct { 
ULONG bit31    :  1; 
ULONG bit26_30 :  5; 
ULONG bit21_25 :  5; 
ULONG bit16_20 :  5; 
ULONG bit11_15 :  5; 
ULONG bit6_10  :  5; 
ULONG bit0_5   :  6; 
    } m_f; 
 
#define Mform_RS  m_f.bit6_10 
#define Mform_RA  m_f.bit11_15 
#define Mform_RB  m_f.bit16_20 
#define Mform_SH  m_f.bit16_20 
#define Mform_MB  m_f.bit21_25 
#define Mform_ME  m_f.bit26_30 
#define Mform_RC  m_f.bit31 
     
    struct { 
ULONG bit31    :  1; 
ULONG bit30    :  1; 
ULONG bit27_29 :  3; 
ULONG bit21_26 :  6; 
ULONG bit16_20 :  5; 
ULONG bit11_15 :  5; 
ULONG bit6_10  :  5; 
ULONG bit0_5   :  6; 
    } md_f; 
 
#define MDform_RS   md_f.bit6_10 
#define MDform_RA   md_f.bit11_15 
#define MDform_sh1  md_f.bit16_20 
#define MDform_mb   md_f.bit21_26 
#define MDform_me   md_f.bit21_26 
#define MDform_XO   md_f.bit27_29 
#define MDform_sh2  md_f.bit30 
#define MDform_RC   md_f.bit31 
     
    struct { 
ULONG bit31    :  1; 
ULONG bit27_30 :  4; 
ULONG bit21_26 :  6; 
ULONG bit16_20 :  5; 
ULONG bit11_15 :  5; 
ULONG bit6_10  :  5; 
ULONG bit0_5   :  6; 
    } mds_f; 
 
#define MDSform_RS  mds_f.bit6_10 
#define MDSform_RA  mds_f.bit11_15 
#define MDSform_RB  mds_f.bit16_20 
#define MDSform_mb  mds_f.bit21_26 
#define MDSform_me  mds_f.bit21_26 
#define MDSform_XO  mds_f.bit27_30 
#define MDSform_RC  mds_f.bit31 
 
} PPC_INSTRUCTION, *PPPC_INSTRUCTION; 
  
// 
//     POWERPC PRIMARY AND SECONDARY (EXTENDED) OPCODES 
// 
 
#define TDI_OP       2 
#define TWI_OP       3 
#define MULLI_OP     7 
#define SUBFIC_OP    8 
#define CMPLI_OP    10 
#define CMPI_OP     11 
#define ADDIC_OP    12 
#define ADDIC_RC_OP 13 
#define ADDI_OP     14 
#define ADDIS_OP    15 
#define BC_OP       16 
#define SC_OP       17 
#define B_OP        18 
 
#define X19_OP      19    // Extended ops for primary code 19: 
#define   MCRF_OP       0 
#define   BCLR_OP      16 
#define   CRNOR_OP     33 
#define   RFI_OP       50 
#define   CRANDC_OP   129 
#define   ISYNC_OP    150 
#define   CRXOR_OP    193 
#define  CRNAND_OP   225 
#define  CRAND_OP    257 
#define  CREQV_OP    289 
#define  CRORC_OP    417 
#define  CROR_OP     449 
#define  BCCTR_OP    528 
 
#define RLWIMI_OP   20 
#define RLWINM_OP   21 
#define RLWNM_OP    23 
#define ORI_OP      24 
#defineORIS_OP    25 
#define XORI_OP    26 
#defineXORIS_OP    27 
#defineANDI_RC_OP  28 
#define ANDIS_RC_OP 29 
 
#define X30_OP    30    // Extended ops for primary code 30: 
#define   RLDICL_OP     0 
#define   RLDICR_OP1 
#define  RLDIC_OP2 
#define  RLDIMI_OP3 
#define   RLDCL_OP8 
#define   RLDCR_OP9 
 
#define X31_OP      31    // Extended ops for primary code 31: 
#define   CMP_OP0 
#define  TW_OP4 
#define  SUBFC_OP8 
#define  MULHDU_OP9 
#define  ADDC_OP      10 
#define  MULHWU_OP    11 
#define  MFCR_OP      19 
#define  LWARX_OP     20 
#define  LDX_OP       21 
#define  LWZX_OP      23 
#define  SLW_OP       24 
#define  CNTLZW_OP    26 
#define  SLD_OP       27 
#define  AND_OP       28 
#define  CMPL_OP      32 
#define  SUBF_OP      40 
#define  LDUX_OP      53 
#define  DCBST_OP     54 
#define  LWZUX_OP     55 
#define  CNTLZD_OP    58 
#define  ANDC_OP      60 
#define  TD_OP       68 
#define  MULHD_OP     73 
#define  MULHW_OP     75 
#define  MFMSR_OP     83 
#define  LDARX_OP     84 
#define  DCBF_OP      86 
#define  LBZX_OP      87 
#define  NEG_OP      104 
#define  LBZUX_OP    119 
#define  NOR_OP      124 
#define  SUBFE_OP    136 
#define  ADDE_OP     138 
#define  MTCRF_OP    144 
#define  MTMSR_OP    146 
#define  STDX_OP     149 
#define  STWCX_RC_OP 150  
#define  STWX_OP     151 
#define  STDUX_OP    181 
#define  STWUX_OP    183 
#define  SUBFZE_OP   200 
#define  ADDZE_OP    202 
#define  MTSR_OP     210 
#define  STDCX_RC_OP 214 
#define  STBX_OP     215 
#define  SUBFME_OP   232 
#define  MULLD_OP    233 
#define  ADDME_OP    234 
#define  MULLW_OP    235 
#define  MTSRIN_OP   242 
#define  DCBTST_OP   246 
#define  STBUX_OP    247 
#define  ADD_OP      266 
#define  DCBT_OP     278 
#define  LHZX_OP     279 
#define  EQV_OP      284 
#define  TLBIE_OP    306 
#define  ECIWX_OP    310 
#define  LHZUX_OP    311 
#define  XOR_OP      316 
#define  MFSPR_OP    339 
#define  LWAX_OP     341 
#define  LHAX_OP     343 
#define  TLBIA_OP    370 
#define  MFTB_OP     371 
#define  LWAUX_OP    373 
#define  LHAUX_OP    375 
#define  STHX_OP     407 
#define  ORC_OP      412 
#define  SRADI_OP    413 
#define  SLBIE_OP    434 
#define  ECOWX_OP    438 
#define  STHUX_OP    439 
#define  OR_OP      444 
#define  DIVDU_OP    457 
#define  DIVWU_OP    459 
#define  MTSPR_OP    467 
#define  DCBI_OP     470 
#define  NAND_OP     476 
#define  DIVD_OP     489 
#define  DIVW_OP     491 
#define  SLBIA_OP    498 
#define  MCRXR_OP    512 
#define  LSWX_OP     533 
#define  LWBRX_OP    534 
#define  LFSX_OP     535 
#define  SRW_OP      536 
#define  SRD_OP      539 
#define  TLBSYNC_OP  566 
#define  LFSUX_OP    567 
#define  MFSR_OP     595 
#define  LSWI_OP     597 
#define  SYNC_OP     598 
#define  LFDX_OP     599 
#define  LFDUX_OP    631 
#define  MFSRIN_OP   659 
#define  STSWX_OP    661 
#define  STWBRX_OP   662 
#define  STFSX_OP    663 
#define  STFSUX_OP   695 
#define  STSWI_OP    725 
#define  STFDX_OP    727 
#define  STFDUX_OP   759 
#define  LHBRX_OP    790 
#define  SRAW_OP     792 
#define  SRAD_OP     794 
#define  SRAWI_OP    824 
#define  EIEIO_OP    854 
#define  STHBRX_OP   918 
#define  EXTSH_OP    922 
#define  EXTSB_OP    954 
#define  ICBI_OP     982 
#define  STFIWX_OP   983 
#define  EXTSW_OP    986 
#define  DCBZ_OP    1014 
 
#define LWZ_OP      32 
#define LWZU_OP    33 
#defineLBZ_OP    34 
#defineLBZU_OP    35 
#defineSTW_OP    36 
#defineSTWU_OP    37 
#defineSTB_OP    38 
#defineSTBU_OP    39 
#defineLHZ_OP    40 
#defineLHZU_OP    41 
#defineLHA_OP    42 
#defineLHAU_OP    43 
#defineSTH_OP    44 
#defineSTHU_OP    45 
#defineLFS_OP    48 
#defineLFSU_OP    49 
#defineLFD_OP    50 
#defineLFDU_OP    51 
#define STFS_OP    52 
#defineSTFSU_OP    53 
#defineSTFD_OP    54 
#defineSTFDU_OP    55 
 
#define X58_OP      58    // Extended ops for primary code 58: 
#define   LD_OP        0 
#define  LDU_OP1 
#define  LWA_OP2 
 
#define X59_OP      59    // Extended ops for primary code 59: 
#define  FDIVS_OP     18 
#define  FSUBS_OP     20 
#define  FADDS_OP     21 
#define  FSQRTS_OP    22 
#define  FRES_OP      24 
#define  FMULS_OP     25 
#define  FMSUBS_OP    28 
#define   FMADDS_OP    29 
#define  FNMSUBS_OP   30 
#define  FNMADDS_OP   31 
 
#define X62_OP      62    // Extended ops for primary code 62: 
#define   STD_OP        0 
#define   STDU_OP       1 
 
#define X63_OP    63  // Extended ops for primary code 63: 
#define   FCMPU_OP      0 
#define  FRSP_OP      12 
#define  FCTIW_OP     14 
#define  FCTIWZ_OP    15 
#define  FDIV_OP      18 
#define  FSUB_OP      20 
#define  FADD_OP      21 
#define  FSQRT_OP     22 
#define  FSEL_OP      23 
#define  FMUL_OP      25 
#define  FSQRTE_OP    26 
#define  FMSUB_OP     28 
#define   FMADD_OP     29 
#define  FNMSUB_OP    30 
#define  FNMADD_OP    31 
#define  FCMPO_OP     32 
#define  MTFSB1_OP    38 
#define  FNEG_OP      40 
#define  MCRFS_OP     64 
#define  MTFSB0_OP    70 
#define  FMR_OP       72 
#define  MTFSFI_OP   134 
#define  FNABS_OP    136 
#define  FABS_OP     264 
#define  MFFS_OP     583 
#define  MTFSF_OP    711 
#define  FCTID_OP    814 
#define  FCTIDZ_OP   815 
#define  FCFID_OP    846 
 
// 
// Define certain specific instructions 
// 
 
#define SYSTEM_CALL_INSTR  0x44000002L  // sc 
#define RETURN_INSTR       0x4E800020L  // blr 
#define BREAK_INSTR        0x0FE00000L  // break <number> 
#define TRAP_INSTR         0x0C000000L  // trap word immediate 
#define NO_OP_INSTR       0x60000000L  // ori r.0, r.0, 0 
#define INVALID_INSTR   0x00000000L  // all 0's => invalid 
 
// 
// Define specific values for the TO field of the TRAP_INSTR  
// 
 
#define TO_BREAKPOINT                   0x03E00000L  // Unconditional breakpoint 
#define TO_DIVIDE_BY_ZERO               0x00C00000L  // Integer divide by zero 
#define TO_UNCONDITIONAL_DIVIDE_BY_ZERO 0x00E00000L  // Unconditional divide 
                                                     // by zero 
  
// 
//     IEEE FLOATING POINT VALUE REPRESENTATION 
// 
 
// 
// Define maximum and minimum single and double exponent values. 
// 
 
#define DOUBLE_MAXIMUM_EXPONENT  2047 
#define DOUBLE_MINIMUM_EXPONENT  0 
#define SINGLE_MAXIMUM_EXPONENT  255 
#define SINGLE_MINIMUM_EXPONENT  0 
 
// 
// Define single and double exponent bias values. 
// 
 
#define SINGLE_EXPONENT_BIAS  127 
#define DOUBLE_EXPONENT_BIAS  1023 
 
// 
// Define the largest single and double values; 
// 
 
#define DOUBLE_MAXIMUM_VALUE_LOW   0xffffffff 
#define DOUBLE_MAXIMUM_VALUE_HIGH  0x7fefffff 
#define SINGLE_MAXIMUM_VALUE       0x7f7fffff 
 
// 
// Define single and double quite and signaling Nan values. 
// 
 
#define DOUBLE_NAN_LOW     0xffffffff 
#define DOUBLE_QUIET_NAN   0x7ff7ffff 
#define DOUBLE_SIGNAL_NAN  0x7fffffff 
#define SINGLE_QUIET_NAN   0x7fbfffff 
#define SINGLE_SIGNAL_NAN  0x7fffffff 
 
// 
// Define positive single and double infinity values. 
// 
 
#define DOUBLE_INFINITY_VALUE_LOW   0x0 
#define DOUBLE_INFINITY_VALUE_HIGH  0x7ff00000 
#define SINGLE_INFINITY_VALUE       0x7f800000 
 
// 
// Define rounding modes. 
// 
 
#define ROUND_TO_NEAREST         0 
#define ROUND_TO_ZERO            1 
#define ROUND_TO_PLUS_INFINITY   2 
#define ROUND_TO_MINUS_INFINITY  3 
 
#endif // _PPCINST_