root/lj_target_ppc.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. GPRDEF
  2. FPRDEF
  3. exitstub_trace_addr_

   1 /*
   2 ** Definitions for PPC CPUs.
   3 ** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
   4 */
   5 
   6 #ifndef _LJ_TARGET_PPC_H
   7 #define _LJ_TARGET_PPC_H
   8 
   9 /* -- Registers IDs ------------------------------------------------------- */
  10 
  11 #define GPRDEF(_) \
  12   _(R0) _(SP) _(SYS1) _(R3) _(R4) _(R5) _(R6) _(R7) \
  13   _(R8) _(R9) _(R10) _(R11) _(R12) _(SYS2) _(R14) _(R15) \
  14   _(R16) _(R17) _(R18) _(R19) _(R20) _(R21) _(R22) _(R23) \
  15   _(R24) _(R25) _(R26) _(R27) _(R28) _(R29) _(R30) _(R31)
  16 #define FPRDEF(_) \
  17   _(F0) _(F1) _(F2) _(F3) _(F4) _(F5) _(F6) _(F7) \
  18   _(F8) _(F9) _(F10) _(F11) _(F12) _(F13) _(F14) _(F15) \
  19   _(F16) _(F17) _(F18) _(F19) _(F20) _(F21) _(F22) _(F23) \
  20   _(F24) _(F25) _(F26) _(F27) _(F28) _(F29) _(F30) _(F31)
  21 #define VRIDDEF(_)
  22 
  23 #define RIDENUM(name)   RID_##name,
  24 
  25 enum {
  26   GPRDEF(RIDENUM)               /* General-purpose registers (GPRs). */
  27   FPRDEF(RIDENUM)               /* Floating-point registers (FPRs). */
  28   RID_MAX,
  29   RID_TMP = RID_R0,
  30 
  31   /* Calling conventions. */
  32   RID_RET = RID_R3,
  33   RID_RETHI = RID_R3,
  34   RID_RETLO = RID_R4,
  35   RID_FPRET = RID_F1,
  36 
  37   /* These definitions must match with the *.dasc file(s): */
  38   RID_BASE = RID_R14,           /* Interpreter BASE. */
  39   RID_LPC = RID_R16,            /* Interpreter PC. */
  40   RID_DISPATCH = RID_R17,       /* Interpreter DISPATCH table. */
  41   RID_LREG = RID_R18,           /* Interpreter L. */
  42   RID_JGL = RID_R31,            /* On-trace: global_State + 32768. */
  43 
  44   /* Register ranges [min, max) and number of registers. */
  45   RID_MIN_GPR = RID_R0,
  46   RID_MAX_GPR = RID_R31+1,
  47   RID_MIN_FPR = RID_F0,
  48   RID_MAX_FPR = RID_F31+1,
  49   RID_NUM_GPR = RID_MAX_GPR - RID_MIN_GPR,
  50   RID_NUM_FPR = RID_MAX_FPR - RID_MIN_FPR
  51 };
  52 
  53 #define RID_NUM_KREF            RID_NUM_GPR
  54 #define RID_MIN_KREF            RID_R0
  55 
  56 /* -- Register sets ------------------------------------------------------- */
  57 
  58 /* Make use of all registers, except TMP, SP, SYS1, SYS2 and JGL. */
  59 #define RSET_FIXED \
  60   (RID2RSET(RID_TMP)|RID2RSET(RID_SP)|RID2RSET(RID_SYS1)|\
  61    RID2RSET(RID_SYS2)|RID2RSET(RID_JGL))
  62 #define RSET_GPR        (RSET_RANGE(RID_MIN_GPR, RID_MAX_GPR) - RSET_FIXED)
  63 #define RSET_FPR        RSET_RANGE(RID_MIN_FPR, RID_MAX_FPR)
  64 #define RSET_ALL        (RSET_GPR|RSET_FPR)
  65 #define RSET_INIT       RSET_ALL
  66 
  67 #define RSET_SCRATCH_GPR        (RSET_RANGE(RID_R3, RID_R12+1))
  68 #define RSET_SCRATCH_FPR        (RSET_RANGE(RID_F0, RID_F13+1))
  69 #define RSET_SCRATCH            (RSET_SCRATCH_GPR|RSET_SCRATCH_FPR)
  70 #define REGARG_FIRSTGPR         RID_R3
  71 #define REGARG_LASTGPR          RID_R10
  72 #define REGARG_NUMGPR           8
  73 #define REGARG_FIRSTFPR         RID_F1
  74 #define REGARG_LASTFPR          RID_F8
  75 #define REGARG_NUMFPR           8
  76 
  77 /* -- Spill slots --------------------------------------------------------- */
  78 
  79 /* Spill slots are 32 bit wide. An even/odd pair is used for FPRs.
  80 **
  81 ** SPS_FIXED: Available fixed spill slots in interpreter frame.
  82 ** This definition must match with the *.dasc file(s).
  83 **
  84 ** SPS_FIRST: First spill slot for general use.
  85 ** [sp+12] tmplo word \
  86 ** [sp+ 8] tmphi word / tmp dword, parameter area for callee
  87 ** [sp+ 4] tmpw, LR of callee
  88 ** [sp+ 0] stack chain
  89 */
  90 #define SPS_FIXED       7
  91 #define SPS_FIRST       4
  92 
  93 /* Stack offsets for temporary slots. Used for FP<->int conversions etc. */
  94 #define SPOFS_TMPW      4
  95 #define SPOFS_TMP       8
  96 #define SPOFS_TMPHI     8
  97 #define SPOFS_TMPLO     12
  98 
  99 #define sps_scale(slot)         (4 * (int32_t)(slot))
 100 #define sps_align(slot)         (((slot) - SPS_FIXED + 3) & ~3)
 101 
 102 /* -- Exit state ---------------------------------------------------------- */
 103 
 104 /* This definition must match with the *.dasc file(s). */
 105 typedef struct {
 106   lua_Number fpr[RID_NUM_FPR];  /* Floating-point registers. */
 107   int32_t gpr[RID_NUM_GPR];     /* General-purpose registers. */
 108   int32_t spill[256];           /* Spill slots. */
 109 } ExitState;
 110 
 111 /* Highest exit + 1 indicates stack check. */
 112 #define EXITSTATE_CHECKEXIT     1
 113 
 114 /* Return the address of a per-trace exit stub. */
 115 static LJ_AINLINE uint32_t *exitstub_trace_addr_(uint32_t *p, uint32_t exitno)
 116 {
 117   while (*p == 0x60000000) p++;  /* Skip PPCI_NOP. */
 118   return p + 3 + exitno;
 119 }
 120 /* Avoid dependence on lj_jit.h if only including lj_target.h. */
 121 #define exitstub_trace_addr(T, exitno) \
 122   exitstub_trace_addr_((MCode *)((char *)(T)->mcode + (T)->szmcode), (exitno))
 123 
 124 /* -- Instructions -------------------------------------------------------- */
 125 
 126 /* Instruction fields. */
 127 #define PPCF_CC(cc)     ((((cc) & 3) << 16) | (((cc) & 4) << 22))
 128 #define PPCF_T(r)       ((r) << 21)
 129 #define PPCF_A(r)       ((r) << 16)
 130 #define PPCF_B(r)       ((r) << 11)
 131 #define PPCF_C(r)       ((r) << 6)
 132 #define PPCF_MB(n)      ((n) << 6)
 133 #define PPCF_ME(n)      ((n) << 1)
 134 #define PPCF_Y          0x00200000
 135 #define PPCF_DOT        0x00000001
 136 
 137 typedef enum PPCIns {
 138   /* Integer instructions. */
 139   PPCI_MR = 0x7c000378,
 140   PPCI_NOP = 0x60000000,
 141 
 142   PPCI_LI = 0x38000000,
 143   PPCI_LIS = 0x3c000000,
 144 
 145   PPCI_ADD = 0x7c000214,
 146   PPCI_ADDC = 0x7c000014,
 147   PPCI_ADDO = 0x7c000614,
 148   PPCI_ADDE = 0x7c000114,
 149   PPCI_ADDZE = 0x7c000194,
 150   PPCI_ADDME = 0x7c0001d4,
 151   PPCI_ADDI = 0x38000000,
 152   PPCI_ADDIS = 0x3c000000,
 153   PPCI_ADDIC = 0x30000000,
 154   PPCI_ADDICDOT = 0x34000000,
 155 
 156   PPCI_SUBF = 0x7c000050,
 157   PPCI_SUBFC = 0x7c000010,
 158   PPCI_SUBFO = 0x7c000450,
 159   PPCI_SUBFE = 0x7c000110,
 160   PPCI_SUBFZE = 0x7c000190,
 161   PPCI_SUBFME = 0x7c0001d0,
 162   PPCI_SUBFIC = 0x20000000,
 163 
 164   PPCI_NEG = 0x7c0000d0,
 165 
 166   PPCI_AND = 0x7c000038,
 167   PPCI_ANDC = 0x7c000078,
 168   PPCI_NAND = 0x7c0003b8,
 169   PPCI_ANDIDOT = 0x70000000,
 170   PPCI_ANDISDOT = 0x74000000,
 171 
 172   PPCI_OR = 0x7c000378,
 173   PPCI_NOR = 0x7c0000f8,
 174   PPCI_ORI = 0x60000000,
 175   PPCI_ORIS = 0x64000000,
 176 
 177   PPCI_XOR = 0x7c000278,
 178   PPCI_EQV = 0x7c000238,
 179   PPCI_XORI = 0x68000000,
 180   PPCI_XORIS = 0x6c000000,
 181 
 182   PPCI_CMPW = 0x7c000000,
 183   PPCI_CMPLW = 0x7c000040,
 184   PPCI_CMPWI = 0x2c000000,
 185   PPCI_CMPLWI = 0x28000000,
 186 
 187   PPCI_MULLW = 0x7c0001d6,
 188   PPCI_MULLI = 0x1c000000,
 189   PPCI_MULLWO = 0x7c0005d6,
 190 
 191   PPCI_EXTSB = 0x7c000774,
 192   PPCI_EXTSH = 0x7c000734,
 193 
 194   PPCI_SLW = 0x7c000030,
 195   PPCI_SRW = 0x7c000430,
 196   PPCI_SRAW = 0x7c000630,
 197   PPCI_SRAWI = 0x7c000670,
 198 
 199   PPCI_RLWNM = 0x5c000000,
 200   PPCI_RLWINM = 0x54000000,
 201   PPCI_RLWIMI = 0x50000000,
 202 
 203   PPCI_B = 0x48000000,
 204   PPCI_BL = 0x48000001,
 205   PPCI_BC = 0x40800000,
 206   PPCI_BCL = 0x40800001,
 207   PPCI_BCTR = 0x4e800420,
 208   PPCI_BCTRL = 0x4e800421,
 209 
 210   PPCI_CRANDC = 0x4c000102,
 211   PPCI_CRXOR = 0x4c000182,
 212   PPCI_CRAND = 0x4c000202,
 213   PPCI_CREQV = 0x4c000242,
 214   PPCI_CRORC = 0x4c000342,
 215   PPCI_CROR = 0x4c000382,
 216 
 217   PPCI_MFLR = 0x7c0802a6,
 218   PPCI_MTCTR = 0x7c0903a6,
 219 
 220   PPCI_MCRXR = 0x7c000400,
 221 
 222   /* Load/store instructions. */
 223   PPCI_LWZ = 0x80000000,
 224   PPCI_LBZ = 0x88000000,
 225   PPCI_STW = 0x90000000,
 226   PPCI_STB = 0x98000000,
 227   PPCI_LHZ = 0xa0000000,
 228   PPCI_LHA = 0xa8000000,
 229   PPCI_STH = 0xb0000000,
 230 
 231   PPCI_STWU = 0x94000000,
 232 
 233   PPCI_LFS = 0xc0000000,
 234   PPCI_LFD = 0xc8000000,
 235   PPCI_STFS = 0xd0000000,
 236   PPCI_STFD = 0xd8000000,
 237 
 238   PPCI_LWZX = 0x7c00002e,
 239   PPCI_LBZX = 0x7c0000ae,
 240   PPCI_STWX = 0x7c00012e,
 241   PPCI_STBX = 0x7c0001ae,
 242   PPCI_LHZX = 0x7c00022e,
 243   PPCI_LHAX = 0x7c0002ae,
 244   PPCI_STHX = 0x7c00032e,
 245 
 246   PPCI_LWBRX = 0x7c00042c,
 247   PPCI_STWBRX = 0x7c00052c,
 248 
 249   PPCI_LFSX = 0x7c00042e,
 250   PPCI_LFDX = 0x7c0004ae,
 251   PPCI_STFSX = 0x7c00052e,
 252   PPCI_STFDX = 0x7c0005ae,
 253 
 254   /* FP instructions. */
 255   PPCI_FMR = 0xfc000090,
 256   PPCI_FNEG = 0xfc000050,
 257   PPCI_FABS = 0xfc000210,
 258 
 259   PPCI_FRSP = 0xfc000018,
 260   PPCI_FCTIWZ = 0xfc00001e,
 261 
 262   PPCI_FADD = 0xfc00002a,
 263   PPCI_FSUB = 0xfc000028,
 264   PPCI_FMUL = 0xfc000032,
 265   PPCI_FDIV = 0xfc000024,
 266   PPCI_FSQRT = 0xfc00002c,
 267 
 268   PPCI_FMADD = 0xfc00003a,
 269   PPCI_FMSUB = 0xfc000038,
 270   PPCI_FNMSUB = 0xfc00003c,
 271 
 272   PPCI_FCMPU = 0xfc000000,
 273   PPCI_FSEL = 0xfc00002e,
 274 } PPCIns;
 275 
 276 typedef enum PPCCC {
 277   CC_GE, CC_LE, CC_NE, CC_NS, CC_LT, CC_GT, CC_EQ, CC_SO
 278 } PPCCC;
 279 
 280 #endif

/* [<][>][^][v][top][bottom][index][help] */