| 1 | |
| 2 | |
| 3 | |
| 4 | |
| 5 | |
| 6 | #ifndef _LJ_TARGET_PPC_H |
| 7 | #define _LJ_TARGET_PPC_H |
| 8 | |
| 9 | |
| 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) |
| 27 | FPRDEF(RIDENUM) |
| 28 | RID_MAX, |
| 29 | RID_TMP = RID_R0, |
| 30 | |
| 31 | |
| 32 | RID_RET = RID_R3, |
| 33 | RID_RETHI = RID_R3, |
| 34 | RID_RETLO = RID_R4, |
| 35 | RID_FPRET = RID_F1, |
| 36 | |
| 37 | |
| 38 | RID_BASE = RID_R14, |
| 39 | RID_LPC = RID_R16, |
| 40 | RID_DISPATCH = RID_R17, |
| 41 | RID_LREG = RID_R18, |
| 42 | RID_JGL = RID_R31, |
| 43 | |
| 44 | |
| 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 | |
| 57 | |
| 58 | |
| 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 | |
| 78 | |
| 79 | |
| 80 | |
| 81 | |
| 82 | |
| 83 | |
| 84 | |
| 85 | |
| 86 | |
| 87 | |
| 88 | |
| 89 | |
| 90 | #define SPS_FIXED 7 |
| 91 | #define SPS_FIRST 4 |
| 92 | |
| 93 | |
| 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 | |
| 103 | |
| 104 | |
| 105 | typedef struct { |
| 106 | lua_Number fpr[RID_NUM_FPR]; |
| 107 | int32_t gpr[RID_NUM_GPR]; |
| 108 | int32_t spill[256]; |
| 109 | } ExitState; |
| 110 | |
| 111 | |
| 112 | #define EXITSTATE_CHECKEXIT 1 |
| 113 | |
| 114 | |
| 115 | static LJ_AINLINE uint32_t *exitstub_trace_addr_(uint32_t *p, uint32_t exitno) |
| 116 | { |
| 117 | while (*p == 0x60000000) p++; |
| 118 | return p + 3 + exitno; |
| 119 | } |
| 120 | |
| 121 | #define exitstub_trace_addr(T, exitno) \ |
| 122 | exitstub_trace_addr_((MCode *)((char *)(T)->mcode + (T)->szmcode), (exitno)) |
| 123 | |
| 124 | |
| 125 | |
| 126 | |
| 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 | |
| 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 | |
| 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 | |
| 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 |