aboutsummaryrefslogtreecommitdiff
path: root/src/lj_target_mips.h
diff options
context:
space:
mode:
authorMike Pall <mike>2017-02-20 03:43:10 +0100
committerMike Pall <mike>2017-02-20 03:43:10 +0100
commita25c0b99b84558887887b8e298409dcf8605e5e3 (patch)
tree8cb7b1db3cb0cd4f6cdd59540d39d986b502e471 /src/lj_target_mips.h
parent4416e885d28c0f49d2c7bb3f9630ab23c22fbc9a (diff)
downloadluajit-a25c0b99b84558887887b8e298409dcf8605e5e3.tar.gz
luajit-a25c0b99b84558887887b8e298409dcf8605e5e3.tar.bz2
luajit-a25c0b99b84558887887b8e298409dcf8605e5e3.zip
MIPS64, part 2: Add MIPS64 hard-float JIT compiler backend.
Contributed by Djordje Kovacevic and Stefan Pejic from RT-RK.com. Sponsored by Cisco Systems, Inc.
Diffstat (limited to 'src/lj_target_mips.h')
-rw-r--r--src/lj_target_mips.h90
1 files changed, 73 insertions, 17 deletions
diff --git a/src/lj_target_mips.h b/src/lj_target_mips.h
index 1b061943..740687b3 100644
--- a/src/lj_target_mips.h
+++ b/src/lj_target_mips.h
@@ -81,7 +81,7 @@ enum {
81 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))
82#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 83#if LJ_SOFTFP
84#define RSET_FPR 0 84#define RSET_FPR 0
85#else 85#else
86#if LJ_32 86#if LJ_32
87#define RSET_FPR \ 87#define RSET_FPR \
@@ -90,11 +90,11 @@ enum {
90 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)|\
91 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))
92#else 92#else
93#define RSET_FPR RSET_RANGE(RID_MIN_FPR, RID_MAX_FPR) 93#define RSET_FPR RSET_RANGE(RID_MIN_FPR, RID_MAX_FPR)
94#endif 94#endif
95#endif 95#endif
96#define RSET_ALL (RSET_GPR|RSET_FPR) 96#define RSET_ALL (RSET_GPR|RSET_FPR)
97#define RSET_INIT RSET_ALL 97#define RSET_INIT RSET_ALL
98 98
99#define RSET_SCRATCH_GPR \ 99#define RSET_SCRATCH_GPR \
100 (RSET_RANGE(RID_R1, RID_R15+1)|\ 100 (RSET_RANGE(RID_R1, RID_R15+1)|\
@@ -192,8 +192,12 @@ static LJ_AINLINE uint32_t *exitstub_trace_addr_(uint32_t *p)
192#define MIPSF_F(r) ((r) << 6) 192#define MIPSF_F(r) ((r) << 6)
193#define MIPSF_A(n) ((n) << 6) 193#define MIPSF_A(n) ((n) << 6)
194#define MIPSF_M(n) ((n) << 11) 194#define MIPSF_M(n) ((n) << 11)
195#define MIPSF_L(n) ((n) << 6)
195 196
196typedef enum MIPSIns { 197typedef enum MIPSIns {
198 MIPSI_D = 0x38,
199 MIPSI_DV = 0x10,
200 MIPSI_D32 = 0x3c,
197 /* Integer instructions. */ 201 /* Integer instructions. */
198 MIPSI_MOVE = 0x00000025, 202 MIPSI_MOVE = 0x00000025,
199 MIPSI_NOP = 0x00000000, 203 MIPSI_NOP = 0x00000000,
@@ -202,22 +206,27 @@ typedef enum MIPSIns {
202 MIPSI_LU = 0x34000000, 206 MIPSI_LU = 0x34000000,
203 MIPSI_LUI = 0x3c000000, 207 MIPSI_LUI = 0x3c000000,
204 208
205 MIPSI_ADDIU = 0x24000000, 209 MIPSI_AND = 0x00000024,
206 MIPSI_ANDI = 0x30000000, 210 MIPSI_ANDI = 0x30000000,
211 MIPSI_OR = 0x00000025,
207 MIPSI_ORI = 0x34000000, 212 MIPSI_ORI = 0x34000000,
213 MIPSI_XOR = 0x00000026,
208 MIPSI_XORI = 0x38000000, 214 MIPSI_XORI = 0x38000000,
215 MIPSI_NOR = 0x00000027,
216
217 MIPSI_SLT = 0x0000002a,
218 MIPSI_SLTU = 0x0000002b,
209 MIPSI_SLTI = 0x28000000, 219 MIPSI_SLTI = 0x28000000,
210 MIPSI_SLTIU = 0x2c000000, 220 MIPSI_SLTIU = 0x2c000000,
211 221
212 MIPSI_ADDU = 0x00000021, 222 MIPSI_ADDU = 0x00000021,
223 MIPSI_ADDIU = 0x24000000,
224 MIPSI_SUB = 0x00000022,
213 MIPSI_SUBU = 0x00000023, 225 MIPSI_SUBU = 0x00000023,
214 MIPSI_MUL = 0x70000002, 226 MIPSI_MUL = 0x70000002,
215 MIPSI_AND = 0x00000024, 227 MIPSI_DIV = 0x0000001a,
216 MIPSI_OR = 0x00000025, 228 MIPSI_DIVU = 0x0000001b,
217 MIPSI_XOR = 0x00000026, 229
218 MIPSI_NOR = 0x00000027,
219 MIPSI_SLT = 0x0000002a,
220 MIPSI_SLTU = 0x0000002b,
221 MIPSI_MOVZ = 0x0000000a, 230 MIPSI_MOVZ = 0x0000000a,
222 MIPSI_MOVN = 0x0000000b, 231 MIPSI_MOVN = 0x0000000b,
223 MIPSI_MFHI = 0x00000010, 232 MIPSI_MFHI = 0x00000010,
@@ -228,14 +237,18 @@ typedef enum MIPSIns {
228 MIPSI_SRL = 0x00000002, 237 MIPSI_SRL = 0x00000002,
229 MIPSI_SRA = 0x00000003, 238 MIPSI_SRA = 0x00000003,
230 MIPSI_ROTR = 0x00200002, /* MIPSXXR2 */ 239 MIPSI_ROTR = 0x00200002, /* MIPSXXR2 */
240 MIPSI_DROTR = 0x0020003a,
241 MIPSI_DROTR32 = 0x0020003e,
231 MIPSI_SLLV = 0x00000004, 242 MIPSI_SLLV = 0x00000004,
232 MIPSI_SRLV = 0x00000006, 243 MIPSI_SRLV = 0x00000006,
233 MIPSI_SRAV = 0x00000007, 244 MIPSI_SRAV = 0x00000007,
234 MIPSI_ROTRV = 0x00000046, /* MIPSXXR2 */ 245 MIPSI_ROTRV = 0x00000046, /* MIPSXXR2 */
246 MIPSI_DROTRV = 0x00000056,
235 247
236 MIPSI_SEB = 0x7c000420, /* MIPSXXR2 */ 248 MIPSI_SEB = 0x7c000420, /* MIPSXXR2 */
237 MIPSI_SEH = 0x7c000620, /* MIPSXXR2 */ 249 MIPSI_SEH = 0x7c000620, /* MIPSXXR2 */
238 MIPSI_WSBH = 0x7c0000a0, /* MIPSXXR2 */ 250 MIPSI_WSBH = 0x7c0000a0, /* MIPSXXR2 */
251 MIPSI_DSBH = 0x7c0000a4,
239 252
240 MIPSI_B = 0x10000000, 253 MIPSI_B = 0x10000000,
241 MIPSI_J = 0x08000000, 254 MIPSI_J = 0x08000000,
@@ -253,7 +266,9 @@ typedef enum MIPSIns {
253 266
254 /* Load/store instructions. */ 267 /* Load/store instructions. */
255 MIPSI_LW = 0x8c000000, 268 MIPSI_LW = 0x8c000000,
269 MIPSI_LD = 0xdc000000,
256 MIPSI_SW = 0xac000000, 270 MIPSI_SW = 0xac000000,
271 MIPSI_SD = 0xfc000000,
257 MIPSI_LB = 0x80000000, 272 MIPSI_LB = 0x80000000,
258 MIPSI_SB = 0xa0000000, 273 MIPSI_SB = 0xa0000000,
259 MIPSI_LH = 0x84000000, 274 MIPSI_LH = 0x84000000,
@@ -266,13 +281,48 @@ typedef enum MIPSIns {
266 MIPSI_SDC1 = 0xf4000000, 281 MIPSI_SDC1 = 0xf4000000,
267 282
268 /* MIPS64 instructions. */ 283 /* MIPS64 instructions. */
269 MIPSI_DSLL = 0x00000038, 284 MIPSI_DADD = 0x0000002c,
270 MIPSI_LD = 0xdc000000, 285 MIPSI_DADDI = 0x60000000,
286 MIPSI_DADDU = 0x0000002d,
271 MIPSI_DADDIU = 0x64000000, 287 MIPSI_DADDIU = 0x64000000,
272 MIPSI_SD = 0xfc000000, 288 MIPSI_DSUB = 0x0000002e,
273 MIPSI_DMFC1 = 0x44200000, 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,
274 MIPSI_DSRA32 = 0x0000003f, 301 MIPSI_DSRA32 = 0x0000003f,
275 MIPSI_MFHC1 = 0x44600000, 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,
276 326
277 /* FP instructions. */ 327 /* FP instructions. */
278 MIPSI_MOV_S = 0x46000006, 328 MIPSI_MOV_S = 0x46000006,
@@ -298,24 +348,30 @@ typedef enum MIPSIns {
298 MIPSI_CVT_W_D = 0x46200024, 348 MIPSI_CVT_W_D = 0x46200024,
299 MIPSI_CVT_S_W = 0x46800020, 349 MIPSI_CVT_S_W = 0x46800020,
300 MIPSI_CVT_D_W = 0x46800021, 350 MIPSI_CVT_D_W = 0x46800021,
351 MIPSI_CVT_S_L = 0x46a00020,
352 MIPSI_CVT_D_L = 0x46a00021,
301 353
302 MIPSI_TRUNC_W_S = 0x4600000d, 354 MIPSI_TRUNC_W_S = 0x4600000d,
303 MIPSI_TRUNC_W_D = 0x4620000d, 355 MIPSI_TRUNC_W_D = 0x4620000d,
356 MIPSI_TRUNC_L_S = 0x46000009,
357 MIPSI_TRUNC_L_D = 0x46200009,
304 MIPSI_FLOOR_W_S = 0x4600000f, 358 MIPSI_FLOOR_W_S = 0x4600000f,
305 MIPSI_FLOOR_W_D = 0x4620000f, 359 MIPSI_FLOOR_W_D = 0x4620000f,
306 360
307 MIPSI_MFC1 = 0x44000000, 361 MIPSI_MFC1 = 0x44000000,
308 MIPSI_MTC1 = 0x44800000, 362 MIPSI_MTC1 = 0x44800000,
363 MIPSI_DMTC1 = 0x44a00000,
364 MIPSI_DMFC1 = 0x44200000,
309 365
310 MIPSI_BC1F = 0x45000000, 366 MIPSI_BC1F = 0x45000000,
311 MIPSI_BC1T = 0x45010000, 367 MIPSI_BC1T = 0x45010000,
312 368
313 MIPSI_C_EQ_D = 0x46200032, 369 MIPSI_C_EQ_D = 0x46200032,
370 MIPSI_C_OLT_S = 0x46000034,
314 MIPSI_C_OLT_D = 0x46200034, 371 MIPSI_C_OLT_D = 0x46200034,
315 MIPSI_C_ULT_D = 0x46200035, 372 MIPSI_C_ULT_D = 0x46200035,
316 MIPSI_C_OLE_D = 0x46200036, 373 MIPSI_C_OLE_D = 0x46200036,
317 MIPSI_C_ULE_D = 0x46200037, 374 MIPSI_C_ULE_D = 0x46200037,
318
319} MIPSIns; 375} MIPSIns;
320 376
321#endif 377#endif