diff options
author | Mike Pall <mike> | 2017-02-20 03:43:10 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2017-02-20 03:43:10 +0100 |
commit | a25c0b99b84558887887b8e298409dcf8605e5e3 (patch) | |
tree | 8cb7b1db3cb0cd4f6cdd59540d39d986b502e471 /src/lj_target_mips.h | |
parent | 4416e885d28c0f49d2c7bb3f9630ab23c22fbc9a (diff) | |
download | luajit-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.h | 90 |
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 | ||
196 | typedef enum MIPSIns { | 197 | typedef 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 |