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 557 2003-11-02 22:51:59Z twisti $
38 #include "toolbox/memory.h"
44 static int intregsnum; /* absolute number of integer registers */
45 static int floatregsnum; /* absolute number of float registers */
47 static int intreg_ret; /* register to return integer values */
48 int intreg_argnum; /* number of integer argument registers */
50 static int floatreg_ret; /* register for return float values */
51 static int fltreg_argnum; /* number of float argument registers */
54 static int *argintregs; /* scratch integer registers */
55 static int *tmpintregs; /* scratch integer registers */
56 static int *savintregs; /* saved integer registers */
57 static int *argfltregs; /* scratch float registers */
58 static int *tmpfltregs; /* scratch float registers */
59 static int *savfltregs; /* saved float registers */
60 static int *freeargintregs; /* free argument integer registers */
61 static int *freetmpintregs; /* free scratch integer registers */
62 static int *freesavintregs; /* free saved integer registers */
63 static int *freeargfltregs; /* free argument float registers */
64 static int *freetmpfltregs; /* free scratch float registers */
65 static int *freesavfltregs; /* free saved float registers */
68 static int *secondregs; /* used for longs in 2 32 bit registers */
71 static int *freemem; /* free scratch memory */
72 static int memuse; /* used memory count */
73 static int ifmemuse; /* interface used memory count */
74 static int maxmemuse; /* maximal used memory count (spills) */
75 static int freememtop; /* free memory count */
77 static int tmpintregcnt; /* scratch integer register count */
78 static int savintregcnt; /* saved integer register count */
79 static int tmpfltregcnt; /* scratch float register count */
80 static int savfltregcnt; /* saved float register count */
82 static int iftmpintregcnt; /* iface scratch integer register count */
83 static int ifsavintregcnt; /* iface saved integer register count */
84 static int iftmpfltregcnt; /* iface scratch float register count */
85 static int ifsavfltregcnt; /* iface saved float register count */
87 static int argintreguse; /* used argument integer register count */
88 static int tmpintreguse; /* used scratch integer register count */
89 static int savintreguse; /* used saved integer register count */
90 static int argfltreguse; /* used argument float register count */
91 static int tmpfltreguse; /* used scratch float register count */
92 static int savfltreguse; /* used saved float register count */
94 static int maxargintreguse; /* max used argument int register count */
95 static int maxtmpintreguse; /* max used scratch int register count */
96 static int maxsavintreguse; /* max used saved int register count */
97 static int maxargfltreguse; /* max used argument float register count */
98 static int maxtmpfltreguse; /* max used scratch float register count */
99 static int maxsavfltreguse; /* max used saved float register count */
101 static int freearginttop; /* free argument integer register count */
102 static int freetmpinttop; /* free scratch integer register count */
103 static int freesavinttop; /* free saved integer register count */
104 static int freeargflttop; /* free argument float register count */
105 static int freetmpflttop; /* free scratch float register count */
106 static int freesavflttop; /* free saved float register count */
108 static int savedregs_num; /* total number of registers to be saved */
109 int arguments_num; /* size of parameter field in the stackframe */
113 /* function reg_init ***********************************************************
115 initialises the register-allocator
117 *******************************************************************************/
126 if (TYPE_INT != 0 || TYPE_ADR != 4)
127 panic ("JAVA-Basictypes have been changed");
133 for (intregsnum = 0; nregdescint[intregsnum] != REG_END; intregsnum++) {
134 switch (nregdescint[intregsnum]) {
135 case REG_SAV: savintregcnt++;
137 case REG_TMP: tmpintregcnt++;
139 case REG_ARG: intreg_argnum++;
143 argintregs = MNEW(int, intreg_argnum);
144 tmpintregs = MNEW(int, tmpintregcnt);
145 savintregs = MNEW(int, savintregcnt);
146 freeargintregs = MNEW(int, intreg_argnum);
147 freetmpintregs = MNEW(int, tmpintregcnt);
148 freesavintregs = MNEW(int, savintregcnt);
150 secondregs = MNEW(int, intregsnum);
158 for (n = 0; n < intregsnum; n++) {
159 switch (nregdescint[n]) {
160 case REG_RET: intreg_ret = n;
162 case REG_SAV: savintregs[savintreguse++] = n;
164 case REG_TMP: tmpintregs[tmpintreguse++] = n;
166 case REG_ARG: argintregs[intreg_argnum++] = n;
172 #if defined(__X86_64__)
174 * on x86_64 the argument registers are not in ascending order
175 * a00 (%rdi) <-> a03 (%rcx) and a01 (%rsi) <-> a02 (%rdx)
179 argintregs[3] = argintregs[0];
183 argintregs[2] = argintregs[1];
188 for (n = 1; n < intreg_argnum; n++)
189 secondregs[argintregs[n - 1]] = argintregs[n];
190 for (n = 1; n < tmpintregcnt; n++)
191 secondregs[tmpintregs[n - 1]] = tmpintregs[n];
192 for (n = 1; n < savintregcnt; n++)
193 secondregs[savintregs[n - 1]] = savintregs[n];
195 secondregs[REG_ITMP1] = REG_ITMP2;
196 secondregs[REG_ITMP3] = REG_ITMP2;
197 secondregs[REG_RESULT] = REG_RESULT + 1;
198 secondregs[argintregs[intreg_argnum - 1]] = REG_ITMP3;
205 for (floatregsnum = 0; nregdescfloat[floatregsnum] != REG_END; floatregsnum++) {
206 switch (nregdescfloat[floatregsnum]) {
207 case REG_SAV: savfltregcnt++;
209 case REG_TMP: tmpfltregcnt++;
211 case REG_ARG: fltreg_argnum++;
216 argfltregs = MNEW(int, fltreg_argnum);
217 tmpfltregs = MNEW(int, tmpfltregcnt);
218 savfltregs = MNEW(int, savfltregcnt);
219 freeargfltregs = MNEW(int, fltreg_argnum);
220 freetmpfltregs = MNEW(int, tmpfltregcnt);
221 freesavfltregs = MNEW(int, savfltregcnt);
228 for (n = 0; n < floatregsnum; n++) {
229 switch (nregdescfloat[n]) {
233 case REG_SAV: savfltregs[savfltreguse++] = n;
235 case REG_TMP: tmpfltregs[tmpfltreguse++] = n;
237 case REG_ARG: argfltregs[fltreg_argnum++] = n;
246 freemem = DMNEW(int, maxstack);
247 locals = DMNEW(varinfo5, maxlocals);
248 interfaces = DMNEW(varinfo5, maxstack);
250 for (v = locals, i = maxlocals; i > 0; v++, i--) {
251 v[0][TYPE_INT].type = -1;
252 v[0][TYPE_LNG].type = -1;
253 v[0][TYPE_FLT].type = -1;
254 v[0][TYPE_DBL].type = -1;
255 v[0][TYPE_ADR].type = -1;
258 for (v = interfaces, i = maxstack; i > 0; v++, i--) {
259 v[0][TYPE_INT].type = -1;
260 v[0][TYPE_INT].flags = 0;
261 v[0][TYPE_LNG].type = -1;
262 v[0][TYPE_LNG].flags = 0;
263 v[0][TYPE_FLT].type = -1;
264 v[0][TYPE_FLT].flags = 0;
265 v[0][TYPE_DBL].type = -1;
266 v[0][TYPE_DBL].flags = 0;
267 v[0][TYPE_ADR].type = -1;
268 v[0][TYPE_ADR].flags = 0;
274 /* function reg_close **********************************************************
276 releases all allocated space for registers
278 *******************************************************************************/
282 if (argintregs) MFREE(argintregs, int, intreg_argnum);
283 if (argfltregs) MFREE(argfltregs, int, fltreg_argnum);
284 if (tmpintregs) MFREE(tmpintregs, int, tmpintregcnt);
285 if (savintregs) MFREE(savintregs, int, savintregcnt);
286 if (tmpfltregs) MFREE(tmpfltregs, int, tmpfltregcnt);
287 if (savfltregs) MFREE(savfltregs, int, savfltregcnt);
289 if (freeargintregs) MFREE(freeargintregs, int, intreg_argnum);
290 if (freeargfltregs) MFREE(freeargfltregs, int, fltreg_argnum);
291 if (freetmpintregs) MFREE(freetmpintregs, int, tmpintregcnt);
292 if (freesavintregs) MFREE(freesavintregs, int, savintregcnt);
293 if (freetmpfltregs) MFREE(freetmpfltregs, int, tmpfltregcnt);
294 if (freesavfltregs) MFREE(freesavfltregs, int, savfltregcnt);
297 if (secondregs) MFREE(secondregs, int, intregsnum);
302 /* function interface_regalloc *************************************************
304 allocates registers for all interface variables
306 *******************************************************************************/
310 interface_regalloc();
311 allocate_scratch_registers();
316 /* function interface_regalloc *************************************************
318 allocates registers for all interface variables
320 *******************************************************************************/
322 static void interface_regalloc ()
325 int intalloc, fltalloc;
329 /* allocate stack space for passing arguments to called methods */
331 #ifndef SPECIALMEMUSE
332 #if defined(__X86_64__)
334 * XXX: we have a problem here, but allocating a little more stack space
335 * is better than having a bug
337 /* if (arguments_num > (intreg_argnum + fltreg_argnum)) */
338 /* ifmemuse = arguments_num - (intreg_argnum + fltreg_argnum); */
339 if (arguments_num > fltreg_argnum)
340 ifmemuse = arguments_num - fltreg_argnum;
342 if (arguments_num > intreg_argnum)
343 ifmemuse = arguments_num - intreg_argnum;
349 iftmpintregcnt = tmpintregcnt;
350 ifsavintregcnt = savintregcnt;
351 iftmpfltregcnt = tmpfltregcnt;
352 ifsavfltregcnt = savfltregcnt;
354 for (s = 0; s < maxstack; s++) {
355 intalloc = -1; fltalloc = -1;
356 saved = (interfaces[s][TYPE_INT].flags | interfaces[s][TYPE_LNG].flags |
357 interfaces[s][TYPE_FLT].flags | interfaces[s][TYPE_DBL].flags |
358 interfaces[s][TYPE_ADR].flags) & SAVEDVAR;
360 for (t = TYPE_INT; t <= TYPE_ADR; t++) {
361 v = &interfaces[s][t];
364 regsneeded = (IS_2_WORD_TYPE(t)) ? 1 : 0;
367 if (IS_FLT_DBL_TYPE(t)) {
369 v->flags |= interfaces[s][fltalloc].flags & INMEMORY;
370 v->regoff = interfaces[s][fltalloc].regoff;
372 else if (iftmpfltregcnt > 0) {
374 v->regoff = tmpfltregs[iftmpfltregcnt];
376 else if (ifsavfltregcnt > 0) {
378 v->regoff = savfltregs[ifsavfltregcnt];
381 v->flags |= INMEMORY;
382 v->regoff = ifmemuse;
383 ifmemuse += regsneeded+1;
388 #if defined(__I386__)
390 * for i386 put all longs in memory
392 if (IS_2_WORD_TYPE(t)) {
393 v->flags |= INMEMORY;
394 v->regoff = ifmemuse++;
398 v->flags |= interfaces[s][intalloc].flags & INMEMORY;
399 v->regoff = interfaces[s][intalloc].regoff;
401 else if (iftmpintregcnt > regsneeded) {
402 iftmpintregcnt -= regsneeded+1;
403 v->regoff = tmpintregs[iftmpintregcnt];
405 else if (ifsavintregcnt > regsneeded) {
406 ifsavintregcnt -= regsneeded+1;
407 v->regoff = savintregs[ifsavintregcnt];
410 v->flags |= INMEMORY;
411 v->regoff = ifmemuse;
412 ifmemuse += regsneeded+1;
414 #if defined(__I386__)
421 if (IS_FLT_DBL_TYPE(t)) {
423 v->flags |= interfaces[s][fltalloc].flags & INMEMORY;
424 v->regoff = interfaces[s][fltalloc].regoff;
426 else if (ifsavfltregcnt > 0) {
428 v->regoff = savfltregs[ifsavfltregcnt];
431 v->flags |= INMEMORY;
432 v->regoff = ifmemuse;
433 ifmemuse += regsneeded+1;
438 #if defined(__I386__)
440 * for i386 put all longs in memory
442 if (IS_2_WORD_TYPE(t)) {
443 v->flags |= INMEMORY;
444 v->regoff = ifmemuse++;
448 v->flags |= interfaces[s][intalloc].flags & INMEMORY;
449 v->regoff = interfaces[s][intalloc].regoff;
451 else if (ifsavintregcnt > regsneeded) {
452 ifsavintregcnt -= regsneeded+1;
453 v->regoff = savintregs[ifsavintregcnt];
456 v->flags |= INMEMORY;
457 v->regoff = ifmemuse;
458 ifmemuse += regsneeded+1;
460 #if defined(__I386__)
466 } /* if (type >= 0) */
470 maxmemuse = ifmemuse;
471 maxtmpintreguse = iftmpintregcnt;
472 maxsavintreguse = ifsavintregcnt;
473 maxtmpfltreguse = iftmpfltregcnt;
474 maxsavfltreguse = ifsavfltregcnt;
479 /* function local_regalloc *****************************************************
481 allocates registers for all local variables
483 *******************************************************************************/
485 static void local_regalloc()
488 int intalloc, fltalloc;
491 int typeloop[] = { TYPE_LNG, TYPE_DBL, TYPE_INT, TYPE_FLT, TYPE_ADR };
494 int arg, doublewordarg, iargcnt, fargcnt;
496 arg = 0, iargcnt = 0, fargcnt = 0;
498 for (s = 0; s < maxlocals; s++) {
499 intalloc = -1; fltalloc = -1;
500 for (tt = 0; tt <= 4; tt++) {
506 regsneeded = (IS_2_WORD_TYPE(t)) ? 1 : 0;
508 if (IS_FLT_DBL_TYPE(t)) {
509 #if !defined(CONSECUTIVE_FLOATARGS)
513 v->flags = locals[s][fltalloc].flags;
514 v->regoff = locals[s][fltalloc].regoff;
516 else if (!doublewordarg && (arg < mparamcount)
517 && (fargcnt < fltreg_argnum)) {
519 v->regoff = argfltregs[fargcnt];
521 else if (maxtmpfltreguse > 0) {
524 v->regoff = tmpfltregs[maxtmpfltreguse];
526 else if (maxsavfltreguse > 0) {
529 v->regoff = savfltregs[maxsavfltreguse];
533 v->regoff = maxmemuse;
534 maxmemuse += regsneeded+1;
540 #if defined(__I386__)
542 * for i386 put all longs in memory
544 if (IS_2_WORD_TYPE(t)) {
546 v->regoff = maxmemuse++;
549 #if !defined(CONSECUTIVE_INTARGS)
553 v->flags = locals[s][intalloc].flags;
554 v->regoff = locals[s][intalloc].regoff;
556 else if (!doublewordarg && (arg < mparamcount)
558 && ((regtouse = iargcnt) < intreg_argnum)
560 && ((regtouse = s) < intreg_argnum - regsneeded)
564 v->regoff = argintregs[regtouse];
566 else if (maxtmpintreguse > regsneeded) {
567 maxtmpintreguse -= regsneeded + 1;
569 v->regoff = tmpintregs[maxtmpintreguse];
571 else if (maxsavintreguse > regsneeded) {
572 maxsavintreguse -= regsneeded + 1;
574 v->regoff = savintregs[maxsavintreguse];
577 * use unused argument registers as local registers
579 else if (!doublewordarg && (arg >= mparamcount)
580 && (iargcnt < intreg_argnum)) {
582 v->regoff = argintregs[iargcnt];
588 v->regoff = maxmemuse;
589 maxmemuse += regsneeded+1;
591 #if defined(__I386__)
598 if (arg < mparamcount) {
601 /* what type was the double arg? */
602 if (IS_FLT_DBL_TYPE(mparamtypes[arg])) {
610 } else if (IS_2_WORD_TYPE(mparamtypes[arg])) {
614 if (IS_FLT_DBL_TYPE(mparamtypes[arg])) {
627 for (s = 0; s < maxlocals; s++) {
628 intalloc = -1; fltalloc = -1;
629 for (tt=0; tt<=4; tt++) {
634 regsneeded = (IS_2_WORD_TYPE(t)) ? 1 : 0;
636 if (IS_FLT_DBL_TYPE(t)) {
638 v->flags = locals[s][fltalloc].flags;
639 v->regoff = locals[s][fltalloc].regoff;
641 else if (maxsavfltreguse > 0) {
644 v->regoff = savfltregs[maxsavfltreguse];
648 v->regoff = maxmemuse;
649 maxmemuse += regsneeded+1;
654 #if defined(__I386__)
656 * for i386 put all longs in memory
658 if (IS_2_WORD_TYPE(t)) {
660 v->regoff = maxmemuse++;
664 v->flags = locals[s][intalloc].flags;
665 v->regoff = locals[s][intalloc].regoff;
667 else if (maxsavintreguse > regsneeded) {
668 maxsavintreguse -= regsneeded+1;
670 v->regoff = savintregs[maxsavintreguse];
674 v->regoff = maxmemuse;
675 maxmemuse += regsneeded+1;
677 #if defined(__I386__)
689 static void reg_init_temp()
701 tmpintreguse = iftmpintregcnt;
702 savintreguse = ifsavintregcnt;
703 tmpfltreguse = iftmpfltregcnt;
704 savfltreguse = ifsavfltregcnt;
707 * all argument registers are available
709 argintreguse = intreg_argnum;
710 argfltreguse = fltreg_argnum;
715 #define reg_new_temp(s) if (s->varkind == TEMPVAR) reg_new_temp_func(s)
717 static void reg_new_temp_func(stackptr s)
721 /* Try to allocate a saved register if there is no temporary one available. */
722 /* This is what happens during the second run. */
723 int tryagain = (s->flags & SAVEDVAR) ? 1 : 2;
726 regsneeded = (IS_2_WORD_TYPE(s->type)) ? 1 : 0;
729 for(; tryagain; --tryagain) {
731 if (!(s->flags & SAVEDVAR))
732 s->flags |= SAVEDTMP;
733 if (IS_FLT_DBL_TYPE(s->type)) {
734 if (freesavflttop > 0) {
736 s->regoff = freesavfltregs[freesavflttop];
739 else if (savfltreguse > 0) {
741 if (savfltreguse < maxsavfltreguse)
742 maxsavfltreguse = savfltreguse;
743 s->regoff = savfltregs[savfltreguse];
748 #if defined(__I386__)
750 * for i386 put all longs in memory
752 if (!IS_2_WORD_TYPE(s->type)) {
754 if (freesavinttop > regsneeded) {
755 freesavinttop -= regsneeded + 1;
756 s->regoff = freesavintregs[freesavinttop];
759 else if (savintreguse > regsneeded) {
760 savintreguse -= regsneeded + 1;
761 if (savintreguse < maxsavintreguse)
762 maxsavintreguse = savintreguse;
763 s->regoff = savintregs[savintreguse];
766 #if defined(__I386__)
772 if (IS_FLT_DBL_TYPE(s->type)) {
773 if (freetmpflttop > 0) {
775 s->regoff = freetmpfltregs[freetmpflttop];
778 else if (tmpfltreguse > 0) {
780 if (tmpfltreguse < maxtmpfltreguse)
781 maxtmpfltreguse = tmpfltreguse;
782 s->regoff = tmpfltregs[tmpfltreguse];
787 #if defined(__I386__)
789 * for i386 put all longs in memory
791 if (!IS_2_WORD_TYPE(s->type)) {
793 if (freetmpinttop > regsneeded) {
794 freetmpinttop -= regsneeded + 1;
795 s->regoff = freetmpintregs[freetmpinttop];
798 else if (tmpintreguse > regsneeded) {
799 tmpintreguse -= regsneeded + 1;
800 if (tmpintreguse < maxtmpintreguse)
801 maxtmpintreguse = tmpintreguse;
802 s->regoff = tmpintregs[tmpintreguse];
805 #if defined(__I386__)
812 if (freememtop > regsneeded) {
813 freememtop -= regsneeded+1;
814 s->regoff = freemem[freememtop];
818 memuse += regsneeded+1;
819 if (memuse > maxmemuse)
822 s->flags |= INMEMORY;
827 #define reg_free_temp(s) if (s->varkind == TEMPVAR) reg_free_temp_func(s)
829 static void reg_free_temp_func(stackptr s)
834 regsneeded = (IS_2_WORD_TYPE(s->type)) ? 1 : 0;
837 if (s->flags & INMEMORY) {
838 freemem[freememtop] = s->regoff;
840 freemem[freememtop + 1] = s->regoff + 1;
841 freememtop += regsneeded + 1;
843 else if (IS_FLT_DBL_TYPE(s->type)) {
844 if (s->flags & (SAVEDVAR | SAVEDTMP)) {
845 s->flags &= ~SAVEDTMP;
846 freesavfltregs[freesavflttop++] = s->regoff;
848 freetmpfltregs[freetmpflttop++] = s->regoff;
851 if (s->flags & (SAVEDVAR | SAVEDTMP)) {
852 s->flags &= ~SAVEDTMP;
853 freesavintregs[freesavinttop] = s->regoff;
856 freesavintregs[freesavinttop + 1] = secondregs[s->regoff];
858 freesavinttop += regsneeded + 1;
860 freetmpintregs[freetmpinttop] = s->regoff;
863 freetmpintregs[freetmpinttop + 1] = secondregs[s->regoff];
865 freetmpinttop += regsneeded + 1;
872 static void allocate_scratch_registers()
882 /* b_count = block_count; */
885 while (bptr != NULL) {
887 if (bptr->flags >= BBREACHED) {
903 case ICMD_ELSE_ICONST:
904 case ICMD_CHECKASIZE:
912 /* pop 0 push 1 const */
920 /* pop 0 push 1 load */
943 reg_free_temp(src->prev);
960 reg_free_temp(src->prev);
961 reg_free_temp(src->prev->prev);
964 /* pop 1 push 0 store */
986 /* pop 1 push 0 branch */
1005 /* pop 1 push 0 table branch */
1007 case ICMD_TABLESWITCH:
1008 case ICMD_LOOKUPSWITCH:
1010 case ICMD_NULLCHECKPOP:
1011 case ICMD_MONITORENTER:
1012 case ICMD_MONITOREXIT:
1016 /* pop 2 push 0 branch */
1018 case ICMD_IF_ICMPEQ:
1019 case ICMD_IF_ICMPNE:
1020 case ICMD_IF_ICMPLT:
1021 case ICMD_IF_ICMPGE:
1022 case ICMD_IF_ICMPGT:
1023 case ICMD_IF_ICMPLE:
1025 case ICMD_IF_LCMPEQ:
1026 case ICMD_IF_LCMPNE:
1027 case ICMD_IF_LCMPLT:
1028 case ICMD_IF_LCMPGE:
1029 case ICMD_IF_LCMPGT:
1030 case ICMD_IF_LCMPLE:
1032 case ICMD_IF_ACMPEQ:
1033 case ICMD_IF_ACMPNE:
1041 reg_free_temp(src->prev);
1044 /* pop 0 push 1 dup */
1050 /* pop 0 push 2 dup */
1053 reg_new_temp(dst->prev);
1057 /* pop 2 push 3 dup */
1060 reg_new_temp(dst->prev->prev);
1061 reg_new_temp(dst->prev);
1064 reg_free_temp(src->prev);
1067 /* pop 3 push 4 dup */
1070 reg_new_temp(dst->prev->prev->prev);
1071 reg_new_temp(dst->prev->prev);
1072 reg_new_temp(dst->prev);
1075 reg_free_temp(src->prev);
1076 reg_free_temp(src->prev->prev);
1079 /* pop 3 push 5 dup */
1082 reg_new_temp(dst->prev->prev->prev->prev);
1083 reg_new_temp(dst->prev->prev->prev);
1084 reg_new_temp(dst->prev->prev);
1085 reg_new_temp(dst->prev);
1088 reg_free_temp(src->prev);
1089 reg_free_temp(src->prev->prev);
1092 /* pop 4 push 6 dup */
1095 reg_new_temp(dst->prev->prev->prev->prev->prev);
1096 reg_new_temp(dst->prev->prev->prev->prev);
1097 reg_new_temp(dst->prev->prev->prev);
1098 reg_new_temp(dst->prev->prev);
1099 reg_new_temp(dst->prev);
1102 reg_free_temp(src->prev);
1103 reg_free_temp(src->prev->prev);
1104 reg_free_temp(src->prev->prev->prev);
1107 /* pop 2 push 2 swap */
1110 reg_new_temp(dst->prev);
1113 reg_free_temp(src->prev);
1163 reg_free_temp(src->prev);
1169 case ICMD_IADDCONST:
1170 case ICMD_ISUBCONST:
1171 case ICMD_IMULCONST:
1174 case ICMD_IREM0X10001:
1175 case ICMD_IANDCONST:
1177 case ICMD_IXORCONST:
1178 case ICMD_ISHLCONST:
1179 case ICMD_ISHRCONST:
1180 case ICMD_IUSHRCONST:
1182 case ICMD_LADDCONST:
1183 case ICMD_LSUBCONST:
1184 case ICMD_LMULCONST:
1187 case ICMD_LREM0X10001:
1188 case ICMD_LANDCONST:
1190 case ICMD_LXORCONST:
1191 case ICMD_LSHLCONST:
1192 case ICMD_LSHRCONST:
1193 case ICMD_LUSHRCONST:
1195 case ICMD_IFEQ_ICONST:
1196 case ICMD_IFNE_ICONST:
1197 case ICMD_IFLT_ICONST:
1198 case ICMD_IFGE_ICONST:
1199 case ICMD_IFGT_ICONST:
1200 case ICMD_IFLE_ICONST:
1205 case ICMD_INT2SHORT:
1223 case ICMD_CHECKCAST:
1225 case ICMD_ARRAYLENGTH:
1226 case ICMD_INSTANCEOF:
1229 case ICMD_ANEWARRAY:
1238 case ICMD_GETSTATIC:
1245 /* pop many push any */
1247 case ICMD_INVOKEVIRTUAL:
1248 case ICMD_INVOKESPECIAL:
1249 case ICMD_INVOKESTATIC:
1250 case ICMD_INVOKEINTERFACE:
1257 if (((methodinfo*)iptr->val.a)->returntype != TYPE_VOID)
1271 if (iptr->op1 != TYPE_VOID)
1275 case ICMD_MULTIANEWARRAY:
1285 printf("ICMD %d at %d\n", iptr->opc, (int)(iptr-instr));
1286 panic("Missing ICMD code during register allocation");
1289 } /* while instructions */
1292 } /* while blocks */
1297 * These are local overrides for various environment variables in Emacs.
1298 * Please do not remove this and leave it at the end of the file, where
1299 * Emacs will automagically detect them.
1300 * ---------------------------------------------------------------------
1303 * indent-tabs-mode: t