aboutsummaryrefslogtreecommitdiff
path: root/src/lj_target_mips.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/lj_target_mips.h')
-rw-r--r--src/lj_target_mips.h155
1 files changed, 137 insertions, 18 deletions
diff --git a/src/lj_target_mips.h b/src/lj_target_mips.h
index bed174b8..740687b3 100644
--- a/src/lj_target_mips.h
+++ b/src/lj_target_mips.h
@@ -13,11 +13,15 @@
13 _(R8) _(R9) _(R10) _(R11) _(R12) _(R13) _(R14) _(R15) \ 13 _(R8) _(R9) _(R10) _(R11) _(R12) _(R13) _(R14) _(R15) \
14 _(R16) _(R17) _(R18) _(R19) _(R20) _(R21) _(R22) _(R23) \ 14 _(R16) _(R17) _(R18) _(R19) _(R20) _(R21) _(R22) _(R23) \
15 _(R24) _(R25) _(SYS1) _(SYS2) _(R28) _(SP) _(R30) _(RA) 15 _(R24) _(R25) _(SYS1) _(SYS2) _(R28) _(SP) _(R30) _(RA)
16#if LJ_SOFTFP
17#define FPRDEF(_)
18#else
16#define FPRDEF(_) \ 19#define FPRDEF(_) \
17 _(F0) _(F1) _(F2) _(F3) _(F4) _(F5) _(F6) _(F7) \ 20 _(F0) _(F1) _(F2) _(F3) _(F4) _(F5) _(F6) _(F7) \
18 _(F8) _(F9) _(F10) _(F11) _(F12) _(F13) _(F14) _(F15) \ 21 _(F8) _(F9) _(F10) _(F11) _(F12) _(F13) _(F14) _(F15) \
19 _(F16) _(F17) _(F18) _(F19) _(F20) _(F21) _(F22) _(F23) \ 22 _(F16) _(F17) _(F18) _(F19) _(F20) _(F21) _(F22) _(F23) \
20 _(F24) _(F25) _(F26) _(F27) _(F28) _(F29) _(F30) _(F31) 23 _(F24) _(F25) _(F26) _(F27) _(F28) _(F29) _(F30) _(F31)
24#endif
21#define VRIDDEF(_) 25#define VRIDDEF(_)
22 26
23#define RIDENUM(name) RID_##name, 27#define RIDENUM(name) RID_##name,
@@ -39,7 +43,11 @@ enum {
39 RID_RETHI = RID_R2, 43 RID_RETHI = RID_R2,
40 RID_RETLO = RID_R3, 44 RID_RETLO = RID_R3,
41#endif 45#endif
46#if LJ_SOFTFP
47 RID_FPRET = RID_R2,
48#else
42 RID_FPRET = RID_F0, 49 RID_FPRET = RID_F0,
50#endif
43 RID_CFUNCADDR = RID_R25, 51 RID_CFUNCADDR = RID_R25,
44 52
45 /* These definitions must match with the *.dasc file(s): */ 53 /* These definitions must match with the *.dasc file(s): */
@@ -52,8 +60,12 @@ enum {
52 /* Register ranges [min, max) and number of registers. */ 60 /* Register ranges [min, max) and number of registers. */
53 RID_MIN_GPR = RID_R0, 61 RID_MIN_GPR = RID_R0,
54 RID_MAX_GPR = RID_RA+1, 62 RID_MAX_GPR = RID_RA+1,
55 RID_MIN_FPR = RID_F0, 63 RID_MIN_FPR = RID_MAX_GPR,
64#if LJ_SOFTFP
65 RID_MAX_FPR = RID_MIN_FPR,
66#else
56 RID_MAX_FPR = RID_F31+1, 67 RID_MAX_FPR = RID_F31+1,
68#endif
57 RID_NUM_GPR = RID_MAX_GPR - RID_MIN_GPR, 69 RID_NUM_GPR = RID_MAX_GPR - RID_MIN_GPR,
58 RID_NUM_FPR = RID_MAX_FPR - RID_MIN_FPR /* Only even regs are used. */ 70 RID_NUM_FPR = RID_MAX_FPR - RID_MIN_FPR /* Only even regs are used. */
59}; 71};
@@ -68,28 +80,60 @@ enum {
68 (RID2RSET(RID_ZERO)|RID2RSET(RID_TMP)|RID2RSET(RID_SP)|\ 80 (RID2RSET(RID_ZERO)|RID2RSET(RID_TMP)|RID2RSET(RID_SP)|\
69 RID2RSET(RID_SYS1)|RID2RSET(RID_SYS2)|RID2RSET(RID_JGL)|RID2RSET(RID_GP)) 81 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) 82#define RSET_GPR (RSET_RANGE(RID_MIN_GPR, RID_MAX_GPR) - RSET_FIXED)
83#if LJ_SOFTFP
84#define RSET_FPR 0
85#else
86#if LJ_32
71#define RSET_FPR \ 87#define RSET_FPR \
72 (RID2RSET(RID_F0)|RID2RSET(RID_F2)|RID2RSET(RID_F4)|RID2RSET(RID_F6)|\ 88 (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)|\ 89 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)|\ 90 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)) 91 RID2RSET(RID_F24)|RID2RSET(RID_F26)|RID2RSET(RID_F28)|RID2RSET(RID_F30))
76#define RSET_ALL (RSET_GPR|RSET_FPR) 92#else
77#define RSET_INIT RSET_ALL 93#define RSET_FPR RSET_RANGE(RID_MIN_FPR, RID_MAX_FPR)
94#endif
95#endif
96#define RSET_ALL (RSET_GPR|RSET_FPR)
97#define RSET_INIT RSET_ALL
78 98
79#define RSET_SCRATCH_GPR \ 99#define RSET_SCRATCH_GPR \
80 (RSET_RANGE(RID_R1, RID_R15+1)|\ 100 (RSET_RANGE(RID_R1, RID_R15+1)|\
81 RID2RSET(RID_R24)|RID2RSET(RID_R25)) 101 RID2RSET(RID_R24)|RID2RSET(RID_R25))
102#if LJ_SOFTFP
103#define RSET_SCRATCH_FPR 0
104#else
105#if LJ_32
82#define RSET_SCRATCH_FPR \ 106#define RSET_SCRATCH_FPR \
83 (RID2RSET(RID_F0)|RID2RSET(RID_F2)|RID2RSET(RID_F4)|RID2RSET(RID_F6)|\ 107 (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)|\ 108 RID2RSET(RID_F8)|RID2RSET(RID_F10)|RID2RSET(RID_F12)|RID2RSET(RID_F14)|\
85 RID2RSET(RID_F16)|RID2RSET(RID_F18)) 109 RID2RSET(RID_F16)|RID2RSET(RID_F18))
110#else
111#define RSET_SCRATCH_FPR RSET_RANGE(RID_F0, RID_F24)
112#endif
113#endif
86#define RSET_SCRATCH (RSET_SCRATCH_GPR|RSET_SCRATCH_FPR) 114#define RSET_SCRATCH (RSET_SCRATCH_GPR|RSET_SCRATCH_FPR)
87#define REGARG_FIRSTGPR RID_R4 115#define REGARG_FIRSTGPR RID_R4
116#if LJ_32
88#define REGARG_LASTGPR RID_R7 117#define REGARG_LASTGPR RID_R7
89#define REGARG_NUMGPR 4 118#define REGARG_NUMGPR 4
119#else
120#define REGARG_LASTGPR RID_R11
121#define REGARG_NUMGPR 8
122#endif
123#if LJ_ABI_SOFTFP
124#define REGARG_FIRSTFPR 0
125#define REGARG_LASTFPR 0
126#define REGARG_NUMFPR 0
127#else
90#define REGARG_FIRSTFPR RID_F12 128#define REGARG_FIRSTFPR RID_F12
129#if LJ_32
91#define REGARG_LASTFPR RID_F14 130#define REGARG_LASTFPR RID_F14
92#define REGARG_NUMFPR 2 131#define REGARG_NUMFPR 2
132#else
133#define REGARG_LASTFPR RID_F19
134#define REGARG_NUMFPR 8
135#endif
136#endif
93 137
94/* -- Spill slots --------------------------------------------------------- */ 138/* -- Spill slots --------------------------------------------------------- */
95 139
@@ -100,7 +144,11 @@ enum {
100** 144**
101** SPS_FIRST: First spill slot for general use. 145** SPS_FIRST: First spill slot for general use.
102*/ 146*/
147#if LJ_32
103#define SPS_FIXED 5 148#define SPS_FIXED 5
149#else
150#define SPS_FIXED 4
151#endif
104#define SPS_FIRST 4 152#define SPS_FIRST 4
105 153
106#define SPOFS_TMP 0 154#define SPOFS_TMP 0
@@ -112,8 +160,10 @@ enum {
112 160
113/* This definition must match with the *.dasc file(s). */ 161/* This definition must match with the *.dasc file(s). */
114typedef struct { 162typedef struct {
163#if !LJ_SOFTFP
115 lua_Number fpr[RID_NUM_FPR]; /* Floating-point registers. */ 164 lua_Number fpr[RID_NUM_FPR]; /* Floating-point registers. */
116 int32_t gpr[RID_NUM_GPR]; /* General-purpose registers. */ 165#endif
166 intptr_t gpr[RID_NUM_GPR]; /* General-purpose registers. */
117 int32_t spill[256]; /* Spill slots. */ 167 int32_t spill[256]; /* Spill slots. */
118} ExitState; 168} ExitState;
119 169
@@ -142,51 +192,68 @@ static LJ_AINLINE uint32_t *exitstub_trace_addr_(uint32_t *p)
142#define MIPSF_F(r) ((r) << 6) 192#define MIPSF_F(r) ((r) << 6)
143#define MIPSF_A(n) ((n) << 6) 193#define MIPSF_A(n) ((n) << 6)
144#define MIPSF_M(n) ((n) << 11) 194#define MIPSF_M(n) ((n) << 11)
195#define MIPSF_L(n) ((n) << 6)
145 196
146typedef enum MIPSIns { 197typedef enum MIPSIns {
198 MIPSI_D = 0x38,
199 MIPSI_DV = 0x10,
200 MIPSI_D32 = 0x3c,
147 /* Integer instructions. */ 201 /* Integer instructions. */
148 MIPSI_MOVE = 0x00000021, 202 MIPSI_MOVE = 0x00000025,
149 MIPSI_NOP = 0x00000000, 203 MIPSI_NOP = 0x00000000,
150 204
151 MIPSI_LI = 0x24000000, 205 MIPSI_LI = 0x24000000,
152 MIPSI_LU = 0x34000000, 206 MIPSI_LU = 0x34000000,
153 MIPSI_LUI = 0x3c000000, 207 MIPSI_LUI = 0x3c000000,
154 208
155 MIPSI_ADDIU = 0x24000000, 209 MIPSI_AND = 0x00000024,
156 MIPSI_ANDI = 0x30000000, 210 MIPSI_ANDI = 0x30000000,
211 MIPSI_OR = 0x00000025,
157 MIPSI_ORI = 0x34000000, 212 MIPSI_ORI = 0x34000000,
213 MIPSI_XOR = 0x00000026,
158 MIPSI_XORI = 0x38000000, 214 MIPSI_XORI = 0x38000000,
215 MIPSI_NOR = 0x00000027,
216
217 MIPSI_SLT = 0x0000002a,
218 MIPSI_SLTU = 0x0000002b,
159 MIPSI_SLTI = 0x28000000, 219 MIPSI_SLTI = 0x28000000,
160 MIPSI_SLTIU = 0x2c000000, 220 MIPSI_SLTIU = 0x2c000000,
161 221
162 MIPSI_ADDU = 0x00000021, 222 MIPSI_ADDU = 0x00000021,
223 MIPSI_ADDIU = 0x24000000,
224 MIPSI_SUB = 0x00000022,
163 MIPSI_SUBU = 0x00000023, 225 MIPSI_SUBU = 0x00000023,
164 MIPSI_MUL = 0x70000002, 226 MIPSI_MUL = 0x70000002,
165 MIPSI_AND = 0x00000024, 227 MIPSI_DIV = 0x0000001a,
166 MIPSI_OR = 0x00000025, 228 MIPSI_DIVU = 0x0000001b,
167 MIPSI_XOR = 0x00000026, 229
168 MIPSI_NOR = 0x00000027,
169 MIPSI_SLT = 0x0000002a,
170 MIPSI_SLTU = 0x0000002b,
171 MIPSI_MOVZ = 0x0000000a, 230 MIPSI_MOVZ = 0x0000000a,
172 MIPSI_MOVN = 0x0000000b, 231 MIPSI_MOVN = 0x0000000b,
232 MIPSI_MFHI = 0x00000010,
233 MIPSI_MFLO = 0x00000012,
234 MIPSI_MULT = 0x00000018,
173 235
174 MIPSI_SLL = 0x00000000, 236 MIPSI_SLL = 0x00000000,
175 MIPSI_SRL = 0x00000002, 237 MIPSI_SRL = 0x00000002,
176 MIPSI_SRA = 0x00000003, 238 MIPSI_SRA = 0x00000003,
177 MIPSI_ROTR = 0x00200002, /* MIPS32R2 */ 239 MIPSI_ROTR = 0x00200002, /* MIPSXXR2 */
240 MIPSI_DROTR = 0x0020003a,
241 MIPSI_DROTR32 = 0x0020003e,
178 MIPSI_SLLV = 0x00000004, 242 MIPSI_SLLV = 0x00000004,
179 MIPSI_SRLV = 0x00000006, 243 MIPSI_SRLV = 0x00000006,
180 MIPSI_SRAV = 0x00000007, 244 MIPSI_SRAV = 0x00000007,
181 MIPSI_ROTRV = 0x00000046, /* MIPS32R2 */ 245 MIPSI_ROTRV = 0x00000046, /* MIPSXXR2 */
246 MIPSI_DROTRV = 0x00000056,
182 247
183 MIPSI_SEB = 0x7c000420, /* MIPS32R2 */ 248 MIPSI_SEB = 0x7c000420, /* MIPSXXR2 */
184 MIPSI_SEH = 0x7c000620, /* MIPS32R2 */ 249 MIPSI_SEH = 0x7c000620, /* MIPSXXR2 */
185 MIPSI_WSBH = 0x7c0000a0, /* MIPS32R2 */ 250 MIPSI_WSBH = 0x7c0000a0, /* MIPSXXR2 */
251 MIPSI_DSBH = 0x7c0000a4,
186 252
187 MIPSI_B = 0x10000000, 253 MIPSI_B = 0x10000000,
188 MIPSI_J = 0x08000000, 254 MIPSI_J = 0x08000000,
189 MIPSI_JAL = 0x0c000000, 255 MIPSI_JAL = 0x0c000000,
256 MIPSI_JALX = 0x74000000,
190 MIPSI_JR = 0x00000008, 257 MIPSI_JR = 0x00000008,
191 MIPSI_JALR = 0x0000f809, 258 MIPSI_JALR = 0x0000f809,
192 259
@@ -199,7 +266,9 @@ typedef enum MIPSIns {
199 266
200 /* Load/store instructions. */ 267 /* Load/store instructions. */
201 MIPSI_LW = 0x8c000000, 268 MIPSI_LW = 0x8c000000,
269 MIPSI_LD = 0xdc000000,
202 MIPSI_SW = 0xac000000, 270 MIPSI_SW = 0xac000000,
271 MIPSI_SD = 0xfc000000,
203 MIPSI_LB = 0x80000000, 272 MIPSI_LB = 0x80000000,
204 MIPSI_SB = 0xa0000000, 273 MIPSI_SB = 0xa0000000,
205 MIPSI_LH = 0x84000000, 274 MIPSI_LH = 0x84000000,
@@ -211,6 +280,50 @@ typedef enum MIPSIns {
211 MIPSI_LDC1 = 0xd4000000, 280 MIPSI_LDC1 = 0xd4000000,
212 MIPSI_SDC1 = 0xf4000000, 281 MIPSI_SDC1 = 0xf4000000,
213 282
283 /* MIPS64 instructions. */
284 MIPSI_DADD = 0x0000002c,
285 MIPSI_DADDI = 0x60000000,
286 MIPSI_DADDU = 0x0000002d,
287 MIPSI_DADDIU = 0x64000000,
288 MIPSI_DSUB = 0x0000002e,
289 MIPSI_DSUBU = 0x0000002f,
290 MIPSI_DDIV = 0x0000001e,
291 MIPSI_DDIVU = 0x0000001f,
292 MIPSI_DMULT = 0x0000001c,
293 MIPSI_DMULTU = 0x0000001d,
294
295 MIPSI_DSLL = 0x00000038,
296 MIPSI_DSRL = 0x0000003a,
297 MIPSI_DSLLV = 0x00000014,
298 MIPSI_DSRLV = 0x00000016,
299 MIPSI_DSRA = 0x0000003b,
300 MIPSI_DSRAV = 0x00000017,
301 MIPSI_DSRA32 = 0x0000003f,
302 MIPSI_DSLL32 = 0x0000003c,
303 MIPSI_DSRL32 = 0x0000003e,
304 MIPSI_DSHD = 0x7c000164,
305
306 MIPSI_AADDU = LJ_32 ? MIPSI_ADDU : MIPSI_DADDU,
307 MIPSI_AADDIU = LJ_32 ? MIPSI_ADDIU : MIPSI_DADDIU,
308 MIPSI_ASUBU = LJ_32 ? MIPSI_SUBU : MIPSI_DSUBU,
309 MIPSI_AL = LJ_32 ? MIPSI_LW : MIPSI_LD,
310 MIPSI_AS = LJ_32 ? MIPSI_SW : MIPSI_SD,
311
312 /* Extract/insert instructions. */
313 MIPSI_DEXTM = 0x7c000001,
314 MIPSI_DEXTU = 0x7c000002,
315 MIPSI_DEXT = 0x7c000003,
316 MIPSI_DINSM = 0x7c000005,
317 MIPSI_DINSU = 0x7c000006,
318 MIPSI_DINS = 0x7c000007,
319
320 MIPSI_RINT_D = 0x4620001a,
321 MIPSI_RINT_S = 0x4600001a,
322 MIPSI_RINT = 0x4400001a,
323 MIPSI_FLOOR_D = 0x4620000b,
324 MIPSI_CEIL_D = 0x4620000a,
325 MIPSI_ROUND_D = 0x46200008,
326
214 /* FP instructions. */ 327 /* FP instructions. */
215 MIPSI_MOV_S = 0x46000006, 328 MIPSI_MOV_S = 0x46000006,
216 MIPSI_MOV_D = 0x46200006, 329 MIPSI_MOV_D = 0x46200006,
@@ -235,24 +348,30 @@ typedef enum MIPSIns {
235 MIPSI_CVT_W_D = 0x46200024, 348 MIPSI_CVT_W_D = 0x46200024,
236 MIPSI_CVT_S_W = 0x46800020, 349 MIPSI_CVT_S_W = 0x46800020,
237 MIPSI_CVT_D_W = 0x46800021, 350 MIPSI_CVT_D_W = 0x46800021,
351 MIPSI_CVT_S_L = 0x46a00020,
352 MIPSI_CVT_D_L = 0x46a00021,
238 353
239 MIPSI_TRUNC_W_S = 0x4600000d, 354 MIPSI_TRUNC_W_S = 0x4600000d,
240 MIPSI_TRUNC_W_D = 0x4620000d, 355 MIPSI_TRUNC_W_D = 0x4620000d,
356 MIPSI_TRUNC_L_S = 0x46000009,
357 MIPSI_TRUNC_L_D = 0x46200009,
241 MIPSI_FLOOR_W_S = 0x4600000f, 358 MIPSI_FLOOR_W_S = 0x4600000f,
242 MIPSI_FLOOR_W_D = 0x4620000f, 359 MIPSI_FLOOR_W_D = 0x4620000f,
243 360
244 MIPSI_MFC1 = 0x44000000, 361 MIPSI_MFC1 = 0x44000000,
245 MIPSI_MTC1 = 0x44800000, 362 MIPSI_MTC1 = 0x44800000,
363 MIPSI_DMTC1 = 0x44a00000,
364 MIPSI_DMFC1 = 0x44200000,
246 365
247 MIPSI_BC1F = 0x45000000, 366 MIPSI_BC1F = 0x45000000,
248 MIPSI_BC1T = 0x45010000, 367 MIPSI_BC1T = 0x45010000,
249 368
250 MIPSI_C_EQ_D = 0x46200032, 369 MIPSI_C_EQ_D = 0x46200032,
370 MIPSI_C_OLT_S = 0x46000034,
251 MIPSI_C_OLT_D = 0x46200034, 371 MIPSI_C_OLT_D = 0x46200034,
252 MIPSI_C_ULT_D = 0x46200035, 372 MIPSI_C_ULT_D = 0x46200035,
253 MIPSI_C_OLE_D = 0x46200036, 373 MIPSI_C_OLE_D = 0x46200036,
254 MIPSI_C_ULE_D = 0x46200037, 374 MIPSI_C_ULE_D = 0x46200037,
255
256} MIPSIns; 375} MIPSIns;
257 376
258#endif 377#endif