Single one off performance graph for link in mailing list.
[luajit-2.0/celess22.git] / src / lj_target_mips.h
blobbed174b8e57c8dcd379151ea1abb10253a98b92a
1 /*
2 ** Definitions for MIPS CPUs.
3 ** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
4 */
6 #ifndef _LJ_TARGET_MIPS_H
7 #define _LJ_TARGET_MIPS_H
9 /* -- Registers IDs ------------------------------------------------------- */
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(_)
23 #define RIDENUM(name) RID_##name,
25 enum {
26 GPRDEF(RIDENUM) /* General-purpose registers (GPRs). */
27 FPRDEF(RIDENUM) /* Floating-point registers (FPRs). */
28 RID_MAX,
29 RID_ZERO = RID_R0,
30 RID_TMP = RID_RA,
31 RID_GP = RID_R28,
33 /* Calling conventions. */
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,
45 /* These definitions must match with the *.dasc file(s): */
46 RID_BASE = RID_R16, /* Interpreter BASE. */
47 RID_LPC = RID_R18, /* Interpreter PC. */
48 RID_DISPATCH = RID_R19, /* Interpreter DISPATCH table. */
49 RID_LREG = RID_R20, /* Interpreter L. */
50 RID_JGL = RID_R30, /* On-trace: global_State + 32768. */
52 /* Register ranges [min, max) and number of registers. */
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 /* Only even regs are used. */
61 #define RID_NUM_KREF RID_NUM_GPR
62 #define RID_MIN_KREF RID_R0
64 /* -- Register sets ------------------------------------------------------- */
66 /* Make use of all registers, except ZERO, TMP, SP, SYS1, SYS2, JGL and GP. */
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
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
94 /* -- Spill slots --------------------------------------------------------- */
96 /* Spill slots are 32 bit wide. An even/odd pair is used for FPRs.
98 ** SPS_FIXED: Available fixed spill slots in interpreter frame.
99 ** This definition must match with the *.dasc file(s).
101 ** SPS_FIRST: First spill slot for general use.
103 #define SPS_FIXED 5
104 #define SPS_FIRST 4
106 #define SPOFS_TMP 0
108 #define sps_scale(slot) (4 * (int32_t)(slot))
109 #define sps_align(slot) (((slot) - SPS_FIXED + 1) & ~1)
111 /* -- Exit state ---------------------------------------------------------- */
113 /* This definition must match with the *.dasc file(s). */
114 typedef struct {
115 lua_Number fpr[RID_NUM_FPR]; /* Floating-point registers. */
116 int32_t gpr[RID_NUM_GPR]; /* General-purpose registers. */
117 int32_t spill[256]; /* Spill slots. */
118 } ExitState;
120 /* Highest exit + 1 indicates stack check. */
121 #define EXITSTATE_CHECKEXIT 1
123 /* Return the address of a per-trace exit stub. */
124 static LJ_AINLINE uint32_t *exitstub_trace_addr_(uint32_t *p)
126 while (*p == 0x00000000) p++; /* Skip MIPSI_NOP. */
127 return p;
129 /* Avoid dependence on lj_jit.h if only including lj_target.h. */
130 #define exitstub_trace_addr(T, exitno) \
131 exitstub_trace_addr_((MCode *)((char *)(T)->mcode + (T)->szmcode))
133 /* -- Instructions -------------------------------------------------------- */
135 /* Instruction fields. */
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)
146 typedef enum MIPSIns {
147 /* Integer instructions. */
148 MIPSI_MOVE = 0x00000021,
149 MIPSI_NOP = 0x00000000,
151 MIPSI_LI = 0x24000000,
152 MIPSI_LU = 0x34000000,
153 MIPSI_LUI = 0x3c000000,
155 MIPSI_ADDIU = 0x24000000,
156 MIPSI_ANDI = 0x30000000,
157 MIPSI_ORI = 0x34000000,
158 MIPSI_XORI = 0x38000000,
159 MIPSI_SLTI = 0x28000000,
160 MIPSI_SLTIU = 0x2c000000,
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,
174 MIPSI_SLL = 0x00000000,
175 MIPSI_SRL = 0x00000002,
176 MIPSI_SRA = 0x00000003,
177 MIPSI_ROTR = 0x00200002, /* MIPS32R2 */
178 MIPSI_SLLV = 0x00000004,
179 MIPSI_SRLV = 0x00000006,
180 MIPSI_SRAV = 0x00000007,
181 MIPSI_ROTRV = 0x00000046, /* MIPS32R2 */
183 MIPSI_SEB = 0x7c000420, /* MIPS32R2 */
184 MIPSI_SEH = 0x7c000620, /* MIPS32R2 */
185 MIPSI_WSBH = 0x7c0000a0, /* MIPS32R2 */
187 MIPSI_B = 0x10000000,
188 MIPSI_J = 0x08000000,
189 MIPSI_JAL = 0x0c000000,
190 MIPSI_JR = 0x00000008,
191 MIPSI_JALR = 0x0000f809,
193 MIPSI_BEQ = 0x10000000,
194 MIPSI_BNE = 0x14000000,
195 MIPSI_BLEZ = 0x18000000,
196 MIPSI_BGTZ = 0x1c000000,
197 MIPSI_BLTZ = 0x04000000,
198 MIPSI_BGEZ = 0x04010000,
200 /* Load/store instructions. */
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,
214 /* FP instructions. */
215 MIPSI_MOV_S = 0x46000006,
216 MIPSI_MOV_D = 0x46200006,
217 MIPSI_MOVT_D = 0x46210011,
218 MIPSI_MOVF_D = 0x46200011,
220 MIPSI_ABS_D = 0x46200005,
221 MIPSI_NEG_D = 0x46200007,
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,
229 MIPSI_ADD_S = 0x46000000,
230 MIPSI_SUB_S = 0x46000001,
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,
239 MIPSI_TRUNC_W_S = 0x4600000d,
240 MIPSI_TRUNC_W_D = 0x4620000d,
241 MIPSI_FLOOR_W_S = 0x4600000f,
242 MIPSI_FLOOR_W_D = 0x4620000f,
244 MIPSI_MFC1 = 0x44000000,
245 MIPSI_MTC1 = 0x44800000,
247 MIPSI_BC1F = 0x45000000,
248 MIPSI_BC1T = 0x45010000,
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,
256 } MIPSIns;
258 #endif