55 #define DEBUG_NAME "simplereg"
80 #define SIZE_OF_STACKSLOT 8
85 #define TOTAL_REG_CNT (INT_REG_CNT + FLT_REG_CNT)
91 # define AVAIL_FRONT(cnt, limit) (!opt_RegallocSpillAll && ((cnt) < (limit)))
92 # define AVAIL_BACK(cnt) (!opt_RegallocSpillAll && ((cnt) > 0))
94 # define AVAIL_FRONT(cnt, limit) ((cnt) < (limit))
95 # define AVAIL_BACK(cnt) ((cnt) > 0)
98 #if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
100 # define AVAIL_FRONT_INT(cnt, limit) (!opt_RegallocSpillAll && ((cnt) < (limit) - intregsneeded))
101 # define AVAIL_BACK_INT(cnt) (!opt_RegallocSpillAll && ((cnt) > intregsneeded))
103 # define AVAIL_FRONT_INT(cnt, limit) ((cnt) < (limit) - intregsneeded)
104 # define AVAIL_BACK_INT(cnt) ((cnt) > intregsneeded)
107 # define AVAIL_FRONT_INT(cnt, limit) AVAIL_FRONT(cnt, limit)
108 # define AVAIL_BACK_INT(cnt) AVAIL_BACK(cnt)
111 #define POP_FRONT(stk, cnt, reg) do { reg = stk[cnt++]; } while (0)
112 #define POP_BACK(stk, cnt, reg) do { reg = stk[--cnt]; } while (0)
113 #define PUSH_FRONT(stk, cnt, reg) do { stk[--cnt] = (reg); } while (0)
114 #define PUSH_BACK(stk, cnt, reg) do { stk[cnt++] = (reg); } while (0)
116 #if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
117 #define POP_FRONT_INT(stk, cnt, reg) \
119 if (intregsneeded) { \
120 reg = PACK_REGS(stk[cnt], stk[cnt+1]); \
124 POP_FRONT(stk, cnt, reg); \
127 #define POP_FRONT_INT(stk, cnt, reg) POP_FRONT(stk, cnt, reg)
130 #if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
131 #define POP_BACK_INT(stk, cnt, reg) \
133 if (intregsneeded) { \
135 reg = PACK_REGS(stk[cnt], stk[cnt+1]); \
138 POP_BACK(stk, cnt, reg); \
141 #define POP_BACK_INT(stk, cnt, reg) POP_BACK(stk, cnt, reg)
144 #if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
145 #define PUSH_BACK_INT(stk, cnt, reg) \
147 if (intregsneeded) { \
148 stk[cnt] = GET_LOW_REG(reg); \
149 stk[cnt + 1] = GET_HIGH_REG(reg); \
153 PUSH_BACK(stk, cnt, reg); \
156 #define PUSH_BACK_INT(stk, cnt, reg) PUSH_BACK(stk, cnt, reg)
159 #define AVAIL_ARG_FLT AVAIL_FRONT(rd->argfltreguse, FLT_ARG_CNT)
160 #define AVAIL_TMP_FLT AVAIL_BACK(rd->tmpfltreguse)
161 #define AVAIL_SAV_FLT AVAIL_BACK(rd->savfltreguse)
163 #define AVAIL_ARG_ADR AVAIL_FRONT(rd->argadrreguse, ADR_ARG_CNT)
164 #define AVAIL_TMP_ADR AVAIL_BACK(rd->tmpadrreguse)
165 #define AVAIL_SAV_ADR AVAIL_BACK(rd->savadrreguse)
167 #define AVAIL_ARG_INT AVAIL_FRONT_INT(rd->argintreguse, INT_ARG_CNT)
168 #define AVAIL_TMP_INT AVAIL_BACK_INT(rd->tmpintreguse)
169 #define AVAIL_SAV_INT AVAIL_BACK_INT(rd->savintreguse)
171 #define AVAIL_FREE_ARG_FLT AVAIL_BACK(rd->freeargflttop)
172 #define AVAIL_FREE_TMP_FLT AVAIL_BACK(rd->freetmpflttop)
173 #define AVAIL_FREE_SAV_FLT AVAIL_BACK(rd->freesavflttop)
175 #define AVAIL_FREE_ARG_ADR AVAIL_BACK(rd->freeargadrtop)
176 #define AVAIL_FREE_TMP_ADR AVAIL_BACK(rd->freetmpadrtop)
177 #define AVAIL_FREE_SAV_ADR AVAIL_BACK(rd->freesavadrtop)
179 #define AVAIL_FREE_ARG_INT AVAIL_BACK_INT(rd->freearginttop)
180 #define AVAIL_FREE_TMP_INT AVAIL_BACK_INT(rd->freetmpinttop)
181 #define AVAIL_FREE_SAV_INT AVAIL_BACK_INT(rd->freesavinttop)
183 #define TAKE_ARG_FLT(r) POP_FRONT(abi_registers_float_argument, rd->argfltreguse, r)
184 #define TAKE_TMP_FLT(r) POP_BACK(rd->tmpfltregs, rd->tmpfltreguse, r)
185 #define TAKE_SAV_FLT(r) POP_BACK(rd->savfltregs, rd->savfltreguse, r)
187 #define TAKE_ARG_ADR(r) POP_FRONT(rd->argadrregs, rd->argadrreguse, r)
188 #define TAKE_TMP_ADR(r) POP_BACK(rd->tmpadrregs, rd->tmpadrreguse, r)
189 #define TAKE_SAV_ADR(r) POP_BACK(rd->savadrregs, rd->savadrreguse, r)
191 #define TAKE_ARG_INT(r) POP_FRONT_INT(abi_registers_integer_argument, rd->argintreguse, r)
192 #define TAKE_TMP_INT(r) POP_BACK_INT(rd->tmpintregs, rd->tmpintreguse, r)
193 #define TAKE_SAV_INT(r) POP_BACK_INT(rd->savintregs, rd->savintreguse, r)
195 #define TAKE_FREE_ARG_FLT(r) POP_BACK(rd->freeargfltregs, rd->freeargflttop, r)
196 #define TAKE_FREE_TMP_FLT(r) POP_BACK(rd->freetmpfltregs, rd->freetmpflttop, r)
197 #define TAKE_FREE_SAV_FLT(r) POP_BACK(rd->freesavfltregs, rd->freesavflttop, r)
199 #define TAKE_FREE_ARG_ADR(r) POP_BACK(rd->freeargadrregs, rd->freeargadrtop, r)
200 #define TAKE_FREE_TMP_ADR(r) POP_BACK(rd->freetmpadrregs, rd->freetmpadrtop, r)
201 #define TAKE_FREE_SAV_ADR(r) POP_BACK(rd->freesavadrregs, rd->freesavadrtop, r)
203 #define TAKE_FREE_ARG_INT(r) POP_BACK_INT(rd->freeargintregs, rd->freearginttop, r)
204 #define TAKE_FREE_TMP_INT(r) POP_BACK_INT(rd->freetmpintregs, rd->freetmpinttop, r)
205 #define TAKE_FREE_SAV_INT(r) POP_BACK_INT(rd->freesavintregs, rd->freesavinttop, r)
207 #define PUSH_FREE_ARG_FLT(r) PUSH_BACK(rd->freeargfltregs, rd->freeargflttop, r)
208 #define PUSH_FREE_TMP_FLT(r) PUSH_BACK(rd->freetmpfltregs, rd->freetmpflttop, r)
209 #define PUSH_FREE_SAV_FLT(r) PUSH_BACK(rd->freesavfltregs, rd->freesavflttop, r)
211 #define PUSH_FREE_ARG_ADR(r) PUSH_BACK(rd->freeargadrregs, rd->freeargadrtop, r)
212 #define PUSH_FREE_TMP_ADR(r) PUSH_BACK(rd->freetmpadrregs, rd->freetmpadrtop, r)
213 #define PUSH_FREE_SAV_ADR(r) PUSH_BACK(rd->freesavadrregs, rd->freesavadrtop, r)
215 #define PUSH_FREE_ARG_INT(r) PUSH_BACK_INT(rd->freeargintregs, rd->freearginttop, r)
216 #define PUSH_FREE_TMP_INT(r) PUSH_BACK_INT(rd->freetmpintregs, rd->freetmpinttop, r)
217 #define PUSH_FREE_SAV_INT(r) PUSH_BACK_INT(rd->freesavintregs, rd->freesavinttop, r)
222 #define NEW_MEM_SLOT(r) \
224 (r) = rd->memuse * SIZE_OF_STACKSLOT; \
228 #define NEW_MEM_SLOT_INT_LNG(r) NEW_MEM_SLOT(r)
229 #define NEW_MEM_SLOT_FLT_DBL(r) NEW_MEM_SLOT(r)
230 #define NEW_MEM_SLOT_REUSE_PADDING(r) NEW_MEM_SLOT(r)
235 #define NEW_TEMP_REG(index) \
236 if ( ((index) >= jd->localcount) \
237 && (!(VAR(index)->flags & (INOUT | PREALLOC))) ) \
238 simplereg_new_temp(jd, (index))
241 #define FREE_TEMP_REG(index) \
242 if (((index) > jd->localcount) \
243 && (!(VAR(index)->flags & (PREALLOC)))) \
244 simplereg_free_temp(jd, (index))
249 #if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
250 #define REG_INDEX(regoff, type) (IS_FLT_DBL_TYPE(type) ? (INT_REG_CNT + (regoff)) : (GET_LOW_REG(regoff)))
252 #define REG_INDEX(regoff, type) (IS_FLT_DBL_TYPE(type) ? (INT_REG_CNT + (regoff)) : (regoff))
296 int intalloc, fltalloc;
302 #if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
316 #if defined(__I386__)
334 intalloc = -1; fltalloc = -1;
340 for (tt = 0; tt <=4; tt++) {
348 for (tt = 0; tt <= 4; tt++) {
356 #if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
382 fltalloc = s * 5 + t;
385 #if (SIZEOF_VOID_P == 4) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
399 #if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
423 intalloc = s * 5 + t;
442 fltalloc = s * 5 + t;
445 #if (SIZEOF_VOID_P == 4) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
459 #if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
502 int p, s, t, tt, varindex;
503 int intalloc, fltalloc;
505 int intregsneeded = 0;
507 int fargcnt, iargcnt;
520 for (p = 0, s = 0; s < jd->
maxlocals; s++, p++) {
521 intalloc = -1; fltalloc = -1;
522 for (tt = 0; tt <= 4; tt++) {
530 #if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
538 #if !defined(SUPPORT_PASS_FLOATARGS_IN_INTREGS)
568 #if (SIZEOF_VOID_P == 4) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
581 #if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
588 else if ((p < md->paramcount) &&
592 #if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
631 if (p < md->paramcount)
649 int s, t, tt, varindex;
650 int intalloc, fltalloc;
653 #ifdef SUPPORT_COMBINE_INTEGER_REGISTERS
669 intalloc = -1; fltalloc = -1;
670 for (tt=0; tt<=4; tt++) {
679 #ifdef SUPPORT_COMBINE_INTEGER_REGISTERS
699 #if (SIZEOF_VOID_P == 4) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
711 #if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
726 #if (SIZEOF_VOID_P == 4) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
818 #ifdef SUPPORT_COMBINE_INTEGER_REGISTERS
836 #ifdef SUPPORT_COMBINE_INTEGER_REGISTERS
840 for(; tryagain; --tryagain) {
856 #if (SIZEOF_VOID_P == 4) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
896 #if (SIZEOF_VOID_P == 4) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
953 if (memindex < rd->memcopycountsize && rd->
memcopycount[memindex]) {
969 <<
" r=" << regoff <<
" t=" << type <<
cacao::nl);
975 <<
" r=" << regoff <<
" t=" << type <<
cacao::nl);
984 if (flags & INMEMORY) {
1000 #if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
1031 if (srcindex <= jd->localcount || dstindex <= jd->localcount)
1097 while (bptr != NULL) {
1107 #if !defined(NDEBUG) && !defined(ENABLE_SSA)
1158 LOG(
"MAY REUSE interface register f="
1161 <<
" r=" << regoff <<
" t=" << type <<
cacao::nl);
1179 while (--len >= 0) {
1181 switch (iptr->
opc) {
1352 int newsize = (memindex + 1) * 2;
1508 argp = iptr->
sx.
s23.s2.args;
1518 bte = iptr->
sx.
s23.s3.bte;
1521 argp = iptr->
sx.
s23.s2.args;
1532 argp = iptr->
sx.
s23.s2.args;
1553 #if defined(ENABLE_STATISTICS)
1554 void simplereg_make_statistics(
jitdata *jd)
1596 while (bptr != NULL) {
1599 #if defined(ENABLE_LSRA) || defined(ENABLE_SSA)
1605 if (len > size_interface) size_interface = len;
1616 if (len > size_interface) size_interface = len;
1624 #if defined(ENABLE_LSRA) || defined(ENABLE_SSA)
1630 dst = bptr->instack;
1635 while (--len >= 0) {
1637 dst = iptr->
dst.var;
1639 if ((src!= NULL) && (src != src_old)) {
1693 STATISTICS(count_interface_size += size_interface);
const s4 abi_registers_float_argument[]
static void simplereg_new_temp(jitdata *jd, s4 index)
#define NEW_TEMP_REG(index)
#define STATISTICS(x)
Wrapper for statistics only code.
#define AVAIL_FREE_ARG_INT
static SetWidth setw(size_t w)
static void simplereg_allocate_locals(jitdata *jd)
#define TAKE_FREE_ARG_FLT(r)
#define DMREALLOC(ptr, type, num1, num2)
const s4 abi_registers_integer_argument[]
static void simplereg_free_temp(jitdata *jd, s4 index)
static void simplereg_allocate_temporaries(jitdata *jd)
#define FREE_TEMP_REG(index)
#define PUSH_BACK(stk, cnt, reg)
#define NEW_MEM_SLOT_INT_LNG(r)
static void simplereg_init(jitdata *jd, registerdata *rd)
#define POP_FRONT_INT(stk, cnt, reg)
#define POP_BACK(stk, cnt, reg)
#define TAKE_FREE_TMP_INT(r)
static int code_is_leafmethod(codeinfo *code)
#define MZERO(ptr, type, num)
#define TAKE_FREE_ARG_INT(r)
#define POP_FRONT(stk, cnt, reg)
#define PUSH_FREE_ARG_INT(r)
#define IS_2_WORD_TYPE(a)
#define PUSH_FREE_SAV_INT(r)
#define NEW_MEM_SLOT_FLT_DBL(r)
#define AVAIL_FREE_SAV_INT
#define PUSH_FREE_TMP_INT(r)
#define PUSH_FREE_TMP_FLT(r)
#define REG_INDEX(regoff, type)
static void simplereg_allocate_locals_leafmethod(jitdata *jd)
static void simplereg_init_block(registerdata *rd)
#define TAKE_FREE_SAV_INT(r)
static JNINativeMethod methods[]
#define IS_FLT_DBL_TYPE(a)
static bool simplereg_alloc_dup(jitdata *jd, s4 srcindex, s4 dstindex)
void exceptions_throw_internalerror(const char *message,...)
#define AVAIL_FREE_TMP_FLT
#define SIZE_OF_STACKSLOT
#define TAKE_FREE_SAV_FLT(r)
static void simplereg_allocate_interfaces(jitdata *jd)
union instruction::@12 sx
#define PACK_REGS(low, high)
#define INSTRUCTION_GET_METHODDESC(iptr, md)
#define LOG(STMT)
Analogous to DEBUG.
bool regalloc(jitdata *jd)
interface_info * interface_map
static void simplereg_free(registerdata *rd, s4 flags, s4 regoff, s4 type)
static int code_is_synchronized(codeinfo *code)
#define AVAIL_FREE_ARG_FLT
struct instruction::@12::@13 s23
#define PUSH_FREE_SAV_FLT(r)
#define AVAIL_FREE_TMP_INT
#define AVAIL_FREE_SAV_FLT
#define STAT_REGISTER_VAR(type, var, init, name, description)
Register an external statistics variable.
#define STAT_DECLARE_VAR(type, var, init)
Declare an external statistics variable.
#define NEW_MEM_SLOT_REUSE_PADDING(r)
#define PUSH_FREE_ARG_FLT(r)
#define TAKE_FREE_TMP_FLT(r)