1 /* jit/reg.inc - register allocator
3 Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
4 Institut f. Computersprachen, TU Wien
5 R. Grafl, A. Krall, C. Kruegel, C. Oates, R. Obermaisser, M. Probst,
6 S. Ring, E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich,
9 This file is part of CACAO.
11 This program is free software; you can redistribute it and/or
12 modify it under the terms of the GNU General Public License as
13 published by the Free Software Foundation; either version 2, or (at
14 your option) any later version.
16 This program is distributed in the hope that it will be useful, but
17 WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 General Public License for more details.
21 You should have received a copy of the GNU General Public License
22 along with this program; if not, write to the Free Software
23 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
26 Contact: cacao@complang.tuwien.ac.at
28 Authors: Andreas Krall
33 $Id: reg.inc 1152 2004-06-07 10:09:20Z twisti $
39 #include "toolbox/memory.h"
45 static int intregsnum; /* absolute number of integer registers */
46 static int floatregsnum; /* absolute number of float registers */
48 static int intreg_ret; /* register to return integer values */
49 int intreg_argnum; /* number of integer argument registers */
51 static int floatreg_ret; /* register for return float values */
52 int fltreg_argnum; /* number of float argument registers */
55 static int *argintregs; /* scratch integer registers */
56 static int *tmpintregs; /* scratch integer registers */
57 static int *savintregs; /* saved integer registers */
58 static int *argfltregs; /* scratch float registers */
59 static int *tmpfltregs; /* scratch float registers */
60 static int *savfltregs; /* saved float registers */
61 static int *freeargintregs; /* free argument integer registers */
62 static int *freetmpintregs; /* free scratch integer registers */
63 static int *freesavintregs; /* free saved integer registers */
64 static int *freeargfltregs; /* free argument float registers */
65 static int *freetmpfltregs; /* free scratch float registers */
66 static int *freesavfltregs; /* free saved float registers */
69 static int *secondregs; /* used for longs in 2 32 bit registers */
72 static int *freemem; /* free scratch memory */
73 static int memuse; /* used memory count */
74 static int ifmemuse; /* interface used memory count */
75 static int maxmemuse; /* maximal used memory count (spills) */
76 static int freememtop; /* free memory count */
78 static int tmpintregcnt; /* scratch integer register count */
79 static int savintregcnt; /* saved integer register count */
80 static int tmpfltregcnt; /* scratch float register count */
81 static int savfltregcnt; /* saved float register count */
83 static int iftmpintregcnt; /* iface scratch integer register count */
84 static int ifsavintregcnt; /* iface saved integer register count */
85 static int iftmpfltregcnt; /* iface scratch float register count */
86 static int ifsavfltregcnt; /* iface saved float register count */
88 static int argintreguse; /* used argument integer register count */
89 static int tmpintreguse; /* used scratch integer register count */
90 static int savintreguse; /* used saved integer register count */
91 static int argfltreguse; /* used argument float register count */
92 static int tmpfltreguse; /* used scratch float register count */
93 static int savfltreguse; /* used saved float register count */
95 static int maxargintreguse; /* max used argument int register count */
96 static int maxtmpintreguse; /* max used scratch int register count */
97 static int maxsavintreguse; /* max used saved int register count */
98 static int maxargfltreguse; /* max used argument float register count */
99 static int maxtmpfltreguse; /* max used scratch float register count */
100 static int maxsavfltreguse; /* max used saved float register count */
102 static int freearginttop; /* free argument integer register count */
103 static int freetmpinttop; /* free scratch integer register count */
104 static int freesavinttop; /* free saved integer register count */
105 static int freeargflttop; /* free argument float register count */
106 static int freetmpflttop; /* free scratch float register count */
107 static int freesavflttop; /* free saved float register count */
109 static int savedregs_num; /* total number of registers to be saved */
110 int arguments_num; /* size of parameter field in the stackframe */
113 /* function prototypes for this file */
115 static void interface_regalloc();
116 static void local_regalloc();
117 static void allocate_scratch_registers();
120 /* function reg_init ***********************************************************
122 initialises the register-allocator
124 *******************************************************************************/
130 if (TYPE_INT != 0 || TYPE_ADR != 4)
131 panic("JAVA-Basictypes have been changed");
133 /* setup the integer register table */
138 for (intregsnum = 0; nregdescint[intregsnum] != REG_END; intregsnum++) {
139 switch (nregdescint[intregsnum]) {
140 case REG_SAV: savintregcnt++;
142 case REG_TMP: tmpintregcnt++;
144 case REG_ARG: intreg_argnum++;
148 argintregs = MNEW(int, intreg_argnum);
149 tmpintregs = MNEW(int, tmpintregcnt);
150 savintregs = MNEW(int, savintregcnt);
151 freeargintregs = MNEW(int, intreg_argnum);
152 freetmpintregs = MNEW(int, tmpintregcnt);
153 freesavintregs = MNEW(int, savintregcnt);
155 secondregs = MNEW(int, intregsnum);
163 for (n = 0; n < intregsnum; n++) {
164 switch (nregdescint[n]) {
165 case REG_RET: intreg_ret = n;
167 case REG_SAV: savintregs[savintreguse++] = n;
169 case REG_TMP: tmpintregs[tmpintreguse++] = n;
171 case REG_ARG: argintregs[intreg_argnum++] = n;
177 #if defined(__I386__)
179 this assumes that we have 3 tmp regs (%ecx, %edx, %ebx)
180 sort to [ %ebx, %edx, %ecx ]
183 tmpintregs[0] = tmpintregs[2];
187 #if defined(__X86_64__)
189 * on x86_64 the argument registers are not in ascending order
190 * a00 (%rdi) <-> a03 (%rcx) and a01 (%rsi) <-> a02 (%rdx)
193 argintregs[3] = argintregs[0];
197 argintregs[2] = argintregs[1];
202 for (n = 1; n < intreg_argnum; n++)
203 secondregs[argintregs[n - 1]] = argintregs[n];
204 for (n = 1; n < tmpintregcnt; n++)
205 secondregs[tmpintregs[n - 1]] = tmpintregs[n];
206 for (n = 1; n < savintregcnt; n++)
207 secondregs[savintregs[n - 1]] = savintregs[n];
209 secondregs[REG_ITMP1] = REG_ITMP2;
210 secondregs[REG_ITMP3] = REG_ITMP2;
211 secondregs[REG_RESULT] = REG_RESULT + 1;
212 secondregs[argintregs[intreg_argnum - 1]] = REG_ITMP3;
215 /* setup the float register table */
220 for (floatregsnum = 0; nregdescfloat[floatregsnum] != REG_END; floatregsnum++) {
221 switch (nregdescfloat[floatregsnum]) {
222 case REG_SAV: savfltregcnt++;
224 case REG_TMP: tmpfltregcnt++;
226 case REG_ARG: fltreg_argnum++;
231 argfltregs = MNEW(int, fltreg_argnum);
232 tmpfltregs = MNEW(int, tmpfltregcnt);
233 savfltregs = MNEW(int, savfltregcnt);
234 freeargfltregs = MNEW(int, fltreg_argnum);
235 freetmpfltregs = MNEW(int, tmpfltregcnt);
236 freesavfltregs = MNEW(int, savfltregcnt);
243 for (n = 0; n < floatregsnum; n++) {
244 switch (nregdescfloat[n]) {
248 case REG_SAV: savfltregs[savfltreguse++] = n;
250 case REG_TMP: tmpfltregs[tmpfltreguse++] = n;
252 case REG_ARG: argfltregs[fltreg_argnum++] = n;
265 freemem = DMNEW(int, maxstack);
266 locals = DMNEW(varinfo5, maxlocals);
267 interfaces = DMNEW(varinfo5, maxstack);
269 for (v = locals, i = maxlocals; i > 0; v++, i--) {
270 v[0][TYPE_INT].type = -1;
271 v[0][TYPE_LNG].type = -1;
272 v[0][TYPE_FLT].type = -1;
273 v[0][TYPE_DBL].type = -1;
274 v[0][TYPE_ADR].type = -1;
277 for (v = interfaces, i = maxstack; i > 0; v++, i--) {
278 v[0][TYPE_INT].type = -1;
279 v[0][TYPE_INT].flags = 0;
280 v[0][TYPE_LNG].type = -1;
281 v[0][TYPE_LNG].flags = 0;
282 v[0][TYPE_FLT].type = -1;
283 v[0][TYPE_FLT].flags = 0;
284 v[0][TYPE_DBL].type = -1;
285 v[0][TYPE_DBL].flags = 0;
286 v[0][TYPE_ADR].type = -1;
287 v[0][TYPE_ADR].flags = 0;
293 /* function reg_close **********************************************************
295 releases all allocated space for registers
297 *******************************************************************************/
301 if (argintregs) MFREE(argintregs, int, intreg_argnum);
302 if (argfltregs) MFREE(argfltregs, int, fltreg_argnum);
303 if (tmpintregs) MFREE(tmpintregs, int, tmpintregcnt);
304 if (savintregs) MFREE(savintregs, int, savintregcnt);
305 if (tmpfltregs) MFREE(tmpfltregs, int, tmpfltregcnt);
306 if (savfltregs) MFREE(savfltregs, int, savfltregcnt);
308 if (freeargintregs) MFREE(freeargintregs, int, intreg_argnum);
309 if (freeargfltregs) MFREE(freeargfltregs, int, fltreg_argnum);
310 if (freetmpintregs) MFREE(freetmpintregs, int, tmpintregcnt);
311 if (freesavintregs) MFREE(freesavintregs, int, savintregcnt);
312 if (freetmpfltregs) MFREE(freetmpfltregs, int, tmpfltregcnt);
313 if (freesavfltregs) MFREE(freesavfltregs, int, savfltregcnt);
316 if (secondregs) MFREE(secondregs, int, intregsnum);
321 /* function interface_regalloc *************************************************
323 allocates registers for all interface variables
325 *******************************************************************************/
329 #if defined(__I386__)
330 /* remove %ecx and/or %edx from tmpintregs */
331 int origtmpintregcnt = tmpintregcnt;
332 if (method_uses_ecx) tmpintregcnt--;
333 if (method_uses_edx) tmpintregcnt--;
336 interface_regalloc();
337 allocate_scratch_registers();
340 #if defined(__I386__)
341 tmpintregcnt = origtmpintregcnt;
346 /* function interface_regalloc *************************************************
348 allocates registers for all interface variables
350 *******************************************************************************/
352 static void interface_regalloc()
355 int intalloc, fltalloc;
359 /* allocate stack space for passing arguments to called methods */
361 #ifndef SPECIALMEMUSE
362 #if defined(__X86_64__)
364 * XXX: we have a problem here, but allocating a little more stack space
365 * is better than having a bug
367 /* if (arguments_num > (intreg_argnum + fltreg_argnum)) */
368 /* ifmemuse = arguments_num - (intreg_argnum + fltreg_argnum); */
369 if (arguments_num > fltreg_argnum)
370 ifmemuse = arguments_num - fltreg_argnum;
372 if (arguments_num > intreg_argnum)
373 ifmemuse = arguments_num - intreg_argnum;
379 iftmpintregcnt = tmpintregcnt;
380 ifsavintregcnt = savintregcnt;
381 iftmpfltregcnt = tmpfltregcnt;
382 ifsavfltregcnt = savfltregcnt;
384 for (s = 0; s < maxstack; s++) {
385 intalloc = -1; fltalloc = -1;
386 saved = (interfaces[s][TYPE_INT].flags | interfaces[s][TYPE_LNG].flags |
387 interfaces[s][TYPE_FLT].flags | interfaces[s][TYPE_DBL].flags |
388 interfaces[s][TYPE_ADR].flags) & SAVEDVAR;
390 for (t = TYPE_INT; t <= TYPE_ADR; t++) {
391 v = &interfaces[s][t];
394 regsneeded = (IS_2_WORD_TYPE(t)) ? 1 : 0;
397 if (IS_FLT_DBL_TYPE(t)) {
399 v->flags |= interfaces[s][fltalloc].flags & INMEMORY;
400 v->regoff = interfaces[s][fltalloc].regoff;
402 else if (iftmpfltregcnt > 0) {
404 v->regoff = tmpfltregs[iftmpfltregcnt];
406 else if (ifsavfltregcnt > 0) {
408 v->regoff = savfltregs[ifsavfltregcnt];
411 v->flags |= INMEMORY;
412 v->regoff = ifmemuse;
413 ifmemuse += regsneeded + 1;
418 #if defined(__I386__)
420 * for i386 put all longs in memory
422 if (IS_2_WORD_TYPE(t)) {
423 v->flags |= INMEMORY;
424 v->regoff = ifmemuse++;
428 v->flags |= interfaces[s][intalloc].flags & INMEMORY;
429 v->regoff = interfaces[s][intalloc].regoff;
431 else if (iftmpintregcnt > regsneeded) {
432 iftmpintregcnt -= regsneeded + 1;
433 v->regoff = tmpintregs[iftmpintregcnt];
435 else if (ifsavintregcnt > regsneeded) {
436 ifsavintregcnt -= regsneeded + 1;
437 v->regoff = savintregs[ifsavintregcnt];
440 v->flags |= INMEMORY;
441 v->regoff = ifmemuse;
442 ifmemuse += regsneeded + 1;
444 #if defined(__I386__)
451 if (IS_FLT_DBL_TYPE(t)) {
453 v->flags |= interfaces[s][fltalloc].flags & INMEMORY;
454 v->regoff = interfaces[s][fltalloc].regoff;
456 else if (ifsavfltregcnt > 0) {
458 v->regoff = savfltregs[ifsavfltregcnt];
461 v->flags |= INMEMORY;
462 v->regoff = ifmemuse;
463 ifmemuse += regsneeded + 1;
468 #if defined(__I386__)
470 * for i386 put all longs in memory
472 if (IS_2_WORD_TYPE(t)) {
473 v->flags |= INMEMORY;
474 v->regoff = ifmemuse++;
478 v->flags |= interfaces[s][intalloc].flags & INMEMORY;
479 v->regoff = interfaces[s][intalloc].regoff;
481 else if (ifsavintregcnt > regsneeded) {
482 ifsavintregcnt -= regsneeded + 1;
483 v->regoff = savintregs[ifsavintregcnt];
486 v->flags |= INMEMORY;
487 v->regoff = ifmemuse;
488 ifmemuse += regsneeded + 1;
490 #if defined(__I386__)
496 } /* if (type >= 0) */
500 maxmemuse = ifmemuse;
501 maxargintreguse = -1;
502 maxtmpintreguse = iftmpintregcnt;
503 maxsavintreguse = ifsavintregcnt;
504 maxargfltreguse = -1;
505 maxtmpfltreguse = iftmpfltregcnt;
506 maxsavfltreguse = ifsavfltregcnt;
511 /* function local_regalloc *****************************************************
513 allocates registers for all local variables
515 *******************************************************************************/
517 static void local_regalloc()
520 int intalloc, fltalloc;
523 int typeloop[] = { TYPE_LNG, TYPE_DBL, TYPE_INT, TYPE_FLT, TYPE_ADR };
526 int arg, doublewordarg, iargcnt, fargcnt;
528 arg = 0, iargcnt = 0, fargcnt = 0;
530 for (s = 0; s < maxlocals; s++) {
531 intalloc = -1; fltalloc = -1;
532 for (tt = 0; tt <= 4; tt++) {
538 regsneeded = (IS_2_WORD_TYPE(t)) ? 1 : 0;
540 if (IS_FLT_DBL_TYPE(t)) {
541 #if !defined(CONSECUTIVE_FLOATARGS)
545 v->flags = locals[s][fltalloc].flags;
546 v->regoff = locals[s][fltalloc].regoff;
548 else if (!doublewordarg && (arg < mparamcount)
549 && (fargcnt < fltreg_argnum)) {
551 v->regoff = argfltregs[fargcnt];
553 else if (maxtmpfltreguse > 0) {
556 v->regoff = tmpfltregs[maxtmpfltreguse];
558 else if (maxsavfltreguse > 0) {
561 v->regoff = savfltregs[maxsavfltreguse];
565 v->regoff = maxmemuse;
566 maxmemuse += regsneeded + 1;
572 #if defined(__I386__)
574 * for i386 put all longs in memory
576 if (IS_2_WORD_TYPE(t)) {
578 v->regoff = maxmemuse++;
581 #if !defined(CONSECUTIVE_INTARGS)
585 v->flags = locals[s][intalloc].flags;
586 v->regoff = locals[s][intalloc].regoff;
588 else if (!doublewordarg && (arg < mparamcount)
590 && ((regtouse = iargcnt) < intreg_argnum)
592 && ((regtouse = s) < intreg_argnum - regsneeded)
596 v->regoff = argintregs[regtouse];
598 else if (maxtmpintreguse > regsneeded) {
599 maxtmpintreguse -= regsneeded + 1;
601 v->regoff = tmpintregs[maxtmpintreguse];
603 else if (maxsavintreguse > regsneeded) {
604 maxsavintreguse -= regsneeded + 1;
606 v->regoff = savintregs[maxsavintreguse];
609 * use unused argument registers as local registers
611 else if (!doublewordarg && (arg >= mparamcount)
612 && (iargcnt < intreg_argnum)) {
614 v->regoff = argintregs[iargcnt];
620 v->regoff = maxmemuse;
621 maxmemuse += regsneeded + 1;
623 #if defined(__I386__)
630 if (arg < mparamcount) {
633 /* what type was the double arg? */
634 if (IS_FLT_DBL_TYPE(mparamtypes[arg])) {
642 } else if (IS_2_WORD_TYPE(mparamtypes[arg])) {
646 if (IS_FLT_DBL_TYPE(mparamtypes[arg])) {
659 for (s = 0; s < maxlocals; s++) {
660 intalloc = -1; fltalloc = -1;
661 for (tt=0; tt<=4; tt++) {
666 regsneeded = (IS_2_WORD_TYPE(t)) ? 1 : 0;
668 if (IS_FLT_DBL_TYPE(t)) {
670 v->flags = locals[s][fltalloc].flags;
671 v->regoff = locals[s][fltalloc].regoff;
673 else if (maxsavfltreguse > 0) {
676 v->regoff = savfltregs[maxsavfltreguse];
680 v->regoff = maxmemuse;
681 maxmemuse += regsneeded + 1;
686 #if defined(__I386__)
688 * for i386 put all longs in memory
690 if (IS_2_WORD_TYPE(t)) {
692 v->regoff = maxmemuse++;
696 v->flags = locals[s][intalloc].flags;
697 v->regoff = locals[s][intalloc].regoff;
699 else if (maxsavintreguse > regsneeded) {
700 maxsavintreguse -= regsneeded+1;
702 v->regoff = savintregs[maxsavintreguse];
706 v->regoff = maxmemuse;
707 maxmemuse += regsneeded + 1;
709 #if defined(__I386__)
721 static void reg_init_temp()
733 tmpintreguse = iftmpintregcnt;
734 savintreguse = ifsavintregcnt;
735 tmpfltreguse = iftmpfltregcnt;
736 savfltreguse = ifsavfltregcnt;
738 /* all argument registers are available */
739 argintreguse = intreg_argnum;
740 argfltreguse = fltreg_argnum;
745 #define reg_new_temp(s) if (s->varkind == TEMPVAR) reg_new_temp_func(s)
747 static void reg_new_temp_func(stackptr s)
751 /* Try to allocate a saved register if there is no temporary one */
752 /* available. This is what happens during the second run. */
753 int tryagain = (s->flags & SAVEDVAR) ? 1 : 2;
756 regsneeded = (IS_2_WORD_TYPE(s->type)) ? 1 : 0;
759 for(; tryagain; --tryagain) {
761 if (!(s->flags & SAVEDVAR))
762 s->flags |= SAVEDTMP;
763 if (IS_FLT_DBL_TYPE(s->type)) {
764 if (freesavflttop > 0) {
766 s->regoff = freesavfltregs[freesavflttop];
769 else if (savfltreguse > 0) {
771 if (savfltreguse < maxsavfltreguse)
772 maxsavfltreguse = savfltreguse;
773 s->regoff = savfltregs[savfltreguse];
778 #if defined(__I386__)
780 * for i386 put all longs in memory
782 if (!IS_2_WORD_TYPE(s->type)) {
784 if (freesavinttop > regsneeded) {
785 freesavinttop -= regsneeded + 1;
786 s->regoff = freesavintregs[freesavinttop];
789 else if (savintreguse > regsneeded) {
790 savintreguse -= regsneeded + 1;
791 if (savintreguse < maxsavintreguse)
792 maxsavintreguse = savintreguse;
793 s->regoff = savintregs[savintreguse];
796 #if defined(__I386__)
802 if (IS_FLT_DBL_TYPE(s->type)) {
803 if (freetmpflttop > 0) {
805 s->regoff = freetmpfltregs[freetmpflttop];
808 else if (tmpfltreguse > 0) {
810 if (tmpfltreguse < maxtmpfltreguse)
811 maxtmpfltreguse = tmpfltreguse;
812 s->regoff = tmpfltregs[tmpfltreguse];
817 #if defined(__I386__)
819 * for i386 put all longs in memory
821 if (!IS_2_WORD_TYPE(s->type)) {
823 if (freetmpinttop > regsneeded) {
824 freetmpinttop -= regsneeded + 1;
825 s->regoff = freetmpintregs[freetmpinttop];
828 else if (tmpintreguse > regsneeded) {
829 tmpintreguse -= regsneeded + 1;
830 if (tmpintreguse < maxtmpintreguse)
831 maxtmpintreguse = tmpintreguse;
832 s->regoff = tmpintregs[tmpintreguse];
835 #if defined(__I386__)
842 if (freememtop > regsneeded) {
843 freememtop -= regsneeded + 1;
844 s->regoff = freemem[freememtop];
848 memuse += regsneeded + 1;
849 if (memuse > maxmemuse)
852 s->flags |= INMEMORY;
857 #define reg_free_temp(s) if (s->varkind == TEMPVAR) reg_free_temp_func(s)
859 static void reg_free_temp_func(stackptr s)
864 regsneeded = (IS_2_WORD_TYPE(s->type)) ? 1 : 0;
867 if (s->flags & INMEMORY) {
868 freemem[freememtop] = s->regoff;
870 freemem[freememtop + 1] = s->regoff + 1;
871 freememtop += regsneeded + 1;
873 else if (IS_FLT_DBL_TYPE(s->type)) {
874 if (s->flags & (SAVEDVAR | SAVEDTMP)) {
875 s->flags &= ~SAVEDTMP;
876 freesavfltregs[freesavflttop++] = s->regoff;
878 freetmpfltregs[freetmpflttop++] = s->regoff;
881 if (s->flags & (SAVEDVAR | SAVEDTMP)) {
882 s->flags &= ~SAVEDTMP;
883 freesavintregs[freesavinttop] = s->regoff;
886 freesavintregs[freesavinttop + 1] = secondregs[s->regoff];
888 freesavinttop += regsneeded + 1;
890 freetmpintregs[freetmpinttop] = s->regoff;
893 freetmpintregs[freetmpinttop + 1] = secondregs[s->regoff];
895 freetmpinttop += regsneeded + 1;
902 static void allocate_scratch_registers()
912 /* b_count = block_count; */
915 while (bptr != NULL) {
917 if (bptr->flags >= BBREACHED) {
933 case ICMD_ELSE_ICONST:
934 case ICMD_CHECKASIZE:
935 case ICMD_CHECKEXCEPTION:
943 /* pop 0 push 1 const */
951 /* pop 0 push 1 load */
974 reg_free_temp(src->prev);
991 reg_free_temp(src->prev);
992 reg_free_temp(src->prev->prev);
995 /* pop 1 push 0 store */
1015 case ICMD_PUTSTATIC:
1017 /* pop 1 push 0 branch */
1020 case ICMD_IFNONNULL:
1036 /* pop 1 push 0 table branch */
1038 case ICMD_TABLESWITCH:
1039 case ICMD_LOOKUPSWITCH:
1041 case ICMD_NULLCHECKPOP:
1042 case ICMD_MONITORENTER:
1043 case ICMD_MONITOREXIT:
1047 /* pop 2 push 0 branch */
1049 case ICMD_IF_ICMPEQ:
1050 case ICMD_IF_ICMPNE:
1051 case ICMD_IF_ICMPLT:
1052 case ICMD_IF_ICMPGE:
1053 case ICMD_IF_ICMPGT:
1054 case ICMD_IF_ICMPLE:
1056 case ICMD_IF_LCMPEQ:
1057 case ICMD_IF_LCMPNE:
1058 case ICMD_IF_LCMPLT:
1059 case ICMD_IF_LCMPGE:
1060 case ICMD_IF_LCMPGT:
1061 case ICMD_IF_LCMPLE:
1063 case ICMD_IF_ACMPEQ:
1064 case ICMD_IF_ACMPNE:
1072 reg_free_temp(src->prev);
1075 /* pop 0 push 1 dup */
1081 /* pop 0 push 2 dup */
1084 reg_new_temp(dst->prev);
1088 /* pop 2 push 3 dup */
1091 reg_new_temp(dst->prev->prev);
1092 reg_new_temp(dst->prev);
1095 reg_free_temp(src->prev);
1098 /* pop 3 push 4 dup */
1101 reg_new_temp(dst->prev->prev->prev);
1102 reg_new_temp(dst->prev->prev);
1103 reg_new_temp(dst->prev);
1106 reg_free_temp(src->prev);
1107 reg_free_temp(src->prev->prev);
1110 /* pop 3 push 5 dup */
1113 reg_new_temp(dst->prev->prev->prev->prev);
1114 reg_new_temp(dst->prev->prev->prev);
1115 reg_new_temp(dst->prev->prev);
1116 reg_new_temp(dst->prev);
1119 reg_free_temp(src->prev);
1120 reg_free_temp(src->prev->prev);
1123 /* pop 4 push 6 dup */
1126 reg_new_temp(dst->prev->prev->prev->prev->prev);
1127 reg_new_temp(dst->prev->prev->prev->prev);
1128 reg_new_temp(dst->prev->prev->prev);
1129 reg_new_temp(dst->prev->prev);
1130 reg_new_temp(dst->prev);
1133 reg_free_temp(src->prev);
1134 reg_free_temp(src->prev->prev);
1135 reg_free_temp(src->prev->prev->prev);
1138 /* pop 2 push 2 swap */
1141 reg_new_temp(dst->prev);
1144 reg_free_temp(src->prev);
1194 reg_free_temp(src->prev);
1200 case ICMD_IADDCONST:
1201 case ICMD_ISUBCONST:
1202 case ICMD_IMULCONST:
1205 case ICMD_IREM0X10001:
1206 case ICMD_IANDCONST:
1208 case ICMD_IXORCONST:
1209 case ICMD_ISHLCONST:
1210 case ICMD_ISHRCONST:
1211 case ICMD_IUSHRCONST:
1213 case ICMD_LADDCONST:
1214 case ICMD_LSUBCONST:
1215 case ICMD_LMULCONST:
1218 case ICMD_LREM0X10001:
1219 case ICMD_LANDCONST:
1221 case ICMD_LXORCONST:
1222 case ICMD_LSHLCONST:
1223 case ICMD_LSHRCONST:
1224 case ICMD_LUSHRCONST:
1226 case ICMD_IFEQ_ICONST:
1227 case ICMD_IFNE_ICONST:
1228 case ICMD_IFLT_ICONST:
1229 case ICMD_IFGE_ICONST:
1230 case ICMD_IFGT_ICONST:
1231 case ICMD_IFLE_ICONST:
1236 case ICMD_INT2SHORT:
1254 case ICMD_CHECKCAST:
1256 case ICMD_ARRAYLENGTH:
1257 case ICMD_INSTANCEOF:
1260 case ICMD_ANEWARRAY:
1269 case ICMD_GETSTATIC:
1276 /* pop many push any */
1278 case ICMD_INVOKEVIRTUAL:
1279 case ICMD_INVOKESPECIAL:
1280 case ICMD_INVOKESTATIC:
1281 case ICMD_INVOKEINTERFACE:
1288 if (((methodinfo*)iptr->val.a)->returntype != TYPE_VOID)
1302 if (iptr->op1 != TYPE_VOID)
1306 case ICMD_MULTIANEWARRAY:
1316 printf("ICMD %d at %d\n", iptr->opc, (int)(iptr-instr));
1317 panic("Missing ICMD code during register allocation");
1320 } /* while instructions */
1323 } /* while blocks */
1328 * These are local overrides for various environment variables in Emacs.
1329 * Please do not remove this and leave it at the end of the file, where
1330 * Emacs will automagically detect them.
1331 * ---------------------------------------------------------------------
1334 * indent-tabs-mode: t