| 1 | |
| 2 | |
| 3 | |
| 4 | |
| 5 | |
| 6 | #ifndef _LJ_TARGET_MIPS_H |
| 7 | #define _LJ_TARGET_MIPS_H |
| 8 | |
| 9 | |
| 10 | |
| 11 | #define GPRDEF(_) \ |
| 12 | _(R0) _(R1) _(R2) _(R3) _(R4) _(R5) _(R6) _(R7) \ |
| 13 | _(R8) _(R9) _(R10) _(R11) _(R12) _(R13) _(R14) _(R15) \ |
| 14 | _(R16) _(R17) _(R18) _(R19) _(R20) _(R21) _(R22) _(R23) \ |
| 15 | _(R24) _(R25) _(SYS1) _(SYS2) _(R28) _(SP) _(R30) _(RA) |
| 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_ZERO = RID_R0, |
| 30 | RID_TMP = RID_RA, |
| 31 | RID_GP = RID_R28, |
| 32 | |
| 33 | |
| 34 | RID_RET = RID_R2, |
| 35 | #if LJ_LE |
| 36 | RID_RETHI = RID_R3, |
| 37 | RID_RETLO = RID_R2, |
| 38 | #else |
| 39 | RID_RETHI = RID_R2, |
| 40 | RID_RETLO = RID_R3, |
| 41 | #endif |
| 42 | RID_FPRET = RID_F0, |
| 43 | RID_CFUNCADDR = RID_R25, |
| 44 | |
| 45 | |
| 46 | RID_BASE = RID_R16, |
| 47 | RID_LPC = RID_R18, |
| 48 | RID_DISPATCH = RID_R19, |
| 49 | RID_LREG = RID_R20, |
| 50 | RID_JGL = RID_R30, |
| 51 | |
| 52 | |
| 53 | RID_MIN_GPR = RID_R0, |
| 54 | RID_MAX_GPR = RID_RA+1, |
| 55 | RID_MIN_FPR = RID_F0, |
| 56 | RID_MAX_FPR = RID_F31+1, |
| 57 | RID_NUM_GPR = RID_MAX_GPR - RID_MIN_GPR, |
| 58 | RID_NUM_FPR = RID_MAX_FPR - RID_MIN_FPR |
| 59 | }; |
| 60 | |
| 61 | #define RID_NUM_KREF RID_NUM_GPR |
| 62 | #define RID_MIN_KREF RID_R0 |
| 63 | |
| 64 | |
| 65 | |
| 66 | |
| 67 | #define RSET_FIXED \ |
| 68 | (RID2RSET(RID_ZERO)|RID2RSET(RID_TMP)|RID2RSET(RID_SP)|\ |
| 69 | RID2RSET(RID_SYS1)|RID2RSET(RID_SYS2)|RID2RSET(RID_JGL)|RID2RSET(RID_GP)) |
| 70 | #define RSET_GPR (RSET_RANGE(RID_MIN_GPR, RID_MAX_GPR) - RSET_FIXED) |
| 71 | #define RSET_FPR \ |
| 72 | (RID2RSET(RID_F0)|RID2RSET(RID_F2)|RID2RSET(RID_F4)|RID2RSET(RID_F6)|\ |
| 73 | RID2RSET(RID_F8)|RID2RSET(RID_F10)|RID2RSET(RID_F12)|RID2RSET(RID_F14)|\ |
| 74 | RID2RSET(RID_F16)|RID2RSET(RID_F18)|RID2RSET(RID_F20)|RID2RSET(RID_F22)|\ |
| 75 | RID2RSET(RID_F24)|RID2RSET(RID_F26)|RID2RSET(RID_F28)|RID2RSET(RID_F30)) |
| 76 | #define RSET_ALL (RSET_GPR|RSET_FPR) |
| 77 | #define RSET_INIT RSET_ALL |
| 78 | |
| 79 | #define RSET_SCRATCH_GPR \ |
| 80 | (RSET_RANGE(RID_R1, RID_R15+1)|\ |
| 81 | RID2RSET(RID_R24)|RID2RSET(RID_R25)) |
| 82 | #define RSET_SCRATCH_FPR \ |
| 83 | (RID2RSET(RID_F0)|RID2RSET(RID_F2)|RID2RSET(RID_F4)|RID2RSET(RID_F6)|\ |
| 84 | RID2RSET(RID_F8)|RID2RSET(RID_F10)|RID2RSET(RID_F12)|RID2RSET(RID_F14)|\ |
| 85 | RID2RSET(RID_F16)|RID2RSET(RID_F18)) |
| 86 | #define RSET_SCRATCH (RSET_SCRATCH_GPR|RSET_SCRATCH_FPR) |
| 87 | #define REGARG_FIRSTGPR RID_R4 |
| 88 | #define REGARG_LASTGPR RID_R7 |
| 89 | #define REGARG_NUMGPR 4 |
| 90 | #define REGARG_FIRSTFPR RID_F12 |
| 91 | #define REGARG_LASTFPR RID_F14 |
| 92 | #define REGARG_NUMFPR 2 |
| 93 | |
| 94 | |
| 95 | |
| 96 | |
| 97 | |
| 98 | |
| 99 | |
| 100 | |
| 101 | |
| 102 | |
| 103 | #define SPS_FIXED 5 |
| 104 | #define SPS_FIRST 4 |
| 105 | |
| 106 | #define SPOFS_TMP 0 |
| 107 | |
| 108 | #define sps_scale(slot) (4 * (int32_t)(slot)) |
| 109 | #define sps_align(slot) (((slot) - SPS_FIXED + 1) & ~1) |
| 110 | |
| 111 | |
| 112 | |
| 113 | |
| 114 | typedef struct { |
| 115 | lua_Number fpr[RID_NUM_FPR]; |
| 116 | int32_t gpr[RID_NUM_GPR]; |
| 117 | int32_t spill[256]; |
| 118 | } ExitState; |
| 119 | |
| 120 | |
| 121 | #define EXITSTATE_CHECKEXIT 1 |
| 122 | |
| 123 | |
| 124 | static LJ_AINLINE uint32_t *exitstub_trace_addr_(uint32_t *p) |
| 125 | { |
| 126 | while (*p == 0x00000000) p++; |
| 127 | return p; |
| 128 | } |
| 129 | |
| 130 | #define exitstub_trace_addr(T, exitno) \ |
| 131 | exitstub_trace_addr_((MCode *)((char *)(T)->mcode + (T)->szmcode)) |
| 132 | |
| 133 | |
| 134 | |
| 135 | |
| 136 | #define MIPSF_S(r) ((r) << 21) |
| 137 | #define MIPSF_T(r) ((r) << 16) |
| 138 | #define MIPSF_D(r) ((r) << 11) |
| 139 | #define MIPSF_R(r) ((r) << 21) |
| 140 | #define MIPSF_H(r) ((r) << 16) |
| 141 | #define MIPSF_G(r) ((r) << 11) |
| 142 | #define MIPSF_F(r) ((r) << 6) |
| 143 | #define MIPSF_A(n) ((n) << 6) |
| 144 | #define MIPSF_M(n) ((n) << 11) |
| 145 | |
| 146 | typedef enum MIPSIns { |
| 147 | |
| 148 | MIPSI_MOVE = 0x00000021, |
| 149 | MIPSI_NOP = 0x00000000, |
| 150 | |
| 151 | MIPSI_LI = 0x24000000, |
| 152 | MIPSI_LU = 0x34000000, |
| 153 | MIPSI_LUI = 0x3c000000, |
| 154 | |
| 155 | MIPSI_ADDIU = 0x24000000, |
| 156 | MIPSI_ANDI = 0x30000000, |
| 157 | MIPSI_ORI = 0x34000000, |
| 158 | MIPSI_XORI = 0x38000000, |
| 159 | MIPSI_SLTI = 0x28000000, |
| 160 | MIPSI_SLTIU = 0x2c000000, |
| 161 | |
| 162 | MIPSI_ADDU = 0x00000021, |
| 163 | MIPSI_SUBU = 0x00000023, |
| 164 | MIPSI_MUL = 0x70000002, |
| 165 | MIPSI_AND = 0x00000024, |
| 166 | MIPSI_OR = 0x00000025, |
| 167 | MIPSI_XOR = 0x00000026, |
| 168 | MIPSI_NOR = 0x00000027, |
| 169 | MIPSI_SLT = 0x0000002a, |
| 170 | MIPSI_SLTU = 0x0000002b, |
| 171 | MIPSI_MOVZ = 0x0000000a, |
| 172 | MIPSI_MOVN = 0x0000000b, |
| 173 | |
| 174 | MIPSI_SLL = 0x00000000, |
| 175 | MIPSI_SRL = 0x00000002, |
| 176 | MIPSI_SRA = 0x00000003, |
| 177 | MIPSI_ROTR = 0x00200002, |
| 178 | MIPSI_SLLV = 0x00000004, |
| 179 | MIPSI_SRLV = 0x00000006, |
| 180 | MIPSI_SRAV = 0x00000007, |
| 181 | MIPSI_ROTRV = 0x00000046, |
| 182 | |
| 183 | MIPSI_SEB = 0x7c000420, |
| 184 | MIPSI_SEH = 0x7c000620, |
| 185 | MIPSI_WSBH = 0x7c0000a0, |
| 186 | |
| 187 | MIPSI_B = 0x10000000, |
| 188 | MIPSI_J = 0x08000000, |
| 189 | MIPSI_JAL = 0x0c000000, |
| 190 | MIPSI_JR = 0x00000008, |
| 191 | MIPSI_JALR = 0x0000f809, |
| 192 | |
| 193 | MIPSI_BEQ = 0x10000000, |
| 194 | MIPSI_BNE = 0x14000000, |
| 195 | MIPSI_BLEZ = 0x18000000, |
| 196 | MIPSI_BGTZ = 0x1c000000, |
| 197 | MIPSI_BLTZ = 0x04000000, |
| 198 | MIPSI_BGEZ = 0x04010000, |
| 199 | |
| 200 | |
| 201 | MIPSI_LW = 0x8c000000, |
| 202 | MIPSI_SW = 0xac000000, |
| 203 | MIPSI_LB = 0x80000000, |
| 204 | MIPSI_SB = 0xa0000000, |
| 205 | MIPSI_LH = 0x84000000, |
| 206 | MIPSI_SH = 0xa4000000, |
| 207 | MIPSI_LBU = 0x90000000, |
| 208 | MIPSI_LHU = 0x94000000, |
| 209 | MIPSI_LWC1 = 0xc4000000, |
| 210 | MIPSI_SWC1 = 0xe4000000, |
| 211 | MIPSI_LDC1 = 0xd4000000, |
| 212 | MIPSI_SDC1 = 0xf4000000, |
| 213 | |
| 214 | |
| 215 | MIPSI_MOV_S = 0x46000006, |
| 216 | MIPSI_MOV_D = 0x46200006, |
| 217 | MIPSI_MOVT_D = 0x46210011, |
| 218 | MIPSI_MOVF_D = 0x46200011, |
| 219 | |
| 220 | MIPSI_ABS_D = 0x46200005, |
| 221 | MIPSI_NEG_D = 0x46200007, |
| 222 | |
| 223 | MIPSI_ADD_D = 0x46200000, |
| 224 | MIPSI_SUB_D = 0x46200001, |
| 225 | MIPSI_MUL_D = 0x46200002, |
| 226 | MIPSI_DIV_D = 0x46200003, |
| 227 | MIPSI_SQRT_D = 0x46200004, |
| 228 | |
| 229 | MIPSI_ADD_S = 0x46000000, |
| 230 | MIPSI_SUB_S = 0x46000001, |
| 231 | |
| 232 | MIPSI_CVT_D_S = 0x46000021, |
| 233 | MIPSI_CVT_W_S = 0x46000024, |
| 234 | MIPSI_CVT_S_D = 0x46200020, |
| 235 | MIPSI_CVT_W_D = 0x46200024, |
| 236 | MIPSI_CVT_S_W = 0x46800020, |
| 237 | MIPSI_CVT_D_W = 0x46800021, |
| 238 | |
| 239 | MIPSI_TRUNC_W_S = 0x4600000d, |
| 240 | MIPSI_TRUNC_W_D = 0x4620000d, |
| 241 | MIPSI_FLOOR_W_S = 0x4600000f, |
| 242 | MIPSI_FLOOR_W_D = 0x4620000f, |
| 243 | |
| 244 | MIPSI_MFC1 = 0x44000000, |
| 245 | MIPSI_MTC1 = 0x44800000, |
| 246 | |
| 247 | MIPSI_BC1F = 0x45000000, |
| 248 | MIPSI_BC1T = 0x45010000, |
| 249 | |
| 250 | MIPSI_C_EQ_D = 0x46200032, |
| 251 | MIPSI_C_OLT_D = 0x46200034, |
| 252 | MIPSI_C_ULT_D = 0x46200035, |
| 253 | MIPSI_C_OLE_D = 0x46200036, |
| 254 | MIPSI_C_ULE_D = 0x46200037, |
| 255 | |
| 256 | } MIPSIns; |
| 257 | |
| 258 | #endif |