1 /** @name Z80 Register allocation functions.
4 Note: much of this is ripped straight from Sandeep's mcs51 code.
6 This code maps the virtual symbols and code onto the real
7 hardware. It allocates based on usage and how long the varible
8 lives into registers or temporary memory on the stack.
10 On the Z80 hl and ix and a are reserved for the code generator,
11 leaving bc and de for allocation. iy is unusable due to currently
12 as it's only adressable as a pair. The extra register pressure
13 from reserving hl is made up for by how much easier the sub
14 operations become. You could swap hl for iy if the undocumented
15 iyl/iyh instructions are available.
17 The stack frame is the common ix-bp style. Basically:
22 ix+0: calling functions ix
25 sp: end of local varibles
27 There is currently no support for bit spaces or banked functions.
29 This program is free software; you can redistribute it and/or
30 modify it under the terms of the GNU General Public License as
31 published by the Free Software Foundation; either version 2, or (at
32 your option) any later version. This program is distributed in the
33 hope that it will be useful, but WITHOUT ANY WARRANTY; without even
34 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
35 PURPOSE. See the GNU General Public License for more details.
37 You should have received a copy of the GNU General Public License
38 along with this program; if not, write to the Free Software
39 Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
40 USA. In other words, you are welcome to use, share and improve
41 this program. You are forbidden to forbid anyone else to use,
42 share and improve what you give them. Help stamp out
47 #include "SDCCicode.h"
49 /* Flags to turn off optimisations.
54 DISABLE_PACK_ASSIGN = 0,
55 DISABLE_PACK_ONE_USE = 0,
60 /* Flags to turn on debugging code.
67 D_ACCUSE2_VERBOSE = 0,
77 #define D(_a, _s) if (_a) { printf _s; fflush(stdout); }
82 #define DISABLE_PACKREGSFORSUPPORT 1
83 #define DISABLE_PACKREGSFORACCUSE 1
85 extern void genZ80Code (iCode *);
87 /** Local static variables */
93 bitVect *totRegAssigned; /* final set of LRs that got into registers */
96 /* registers used in a function */
103 static regs _gbz80_regs[] =
105 {REG_GPR, C_IDX, "c", 1},
106 {REG_GPR, B_IDX, "b", 1},
107 {REG_CND, CND_IDX, "c", 1}
110 static regs _z80_regs[] =
112 {REG_GPR, C_IDX, "c", 1},
113 {REG_GPR, B_IDX, "b", 1},
114 {REG_GPR, E_IDX, "e", 1},
115 {REG_GPR, D_IDX, "d", 1},
116 {REG_CND, CND_IDX, "c", 1}
121 /** Number of usable registers (all but C) */
122 #define Z80_MAX_REGS ((sizeof(_z80_regs)/sizeof(_z80_regs[0]))-1)
123 #define GBZ80_MAX_REGS ((sizeof(_gbz80_regs)/sizeof(_gbz80_regs[0]))-1)
125 static void spillThis (symbol *);
126 static void freeAllRegs ();
128 /** Allocates register of given type.
129 'type' is not used on the z80 version. It was used to select
130 between pointer and general purpose registers on the mcs51 version.
132 @return Pointer to the newly allocated register.
135 allocReg (short type)
139 for (i = 0; i < _G.nRegs; i++)
141 /* For now we allocate from any free */
142 if (regsZ80[i].isFree)
144 regsZ80[i].isFree = 0;
147 currFunc->regsUsed = bitVectSetBit (currFunc->regsUsed, i);
149 D (D_ALLOC, ("allocReg: alloced %p\n", ®sZ80[i]));
153 D (D_ALLOC, ("allocReg: No free.\n"));
157 /** Returns pointer to register wit index number
164 for (i = 0; i < _G.nRegs; i++)
166 if (regsZ80[i].rIdx == idx)
172 wassertl (0, "regWithIdx not found");
176 /** Frees a register.
181 wassert (!reg->isFree);
183 D (D_ALLOC, ("freeReg: freed %p\n", reg));
187 /** Returns number of free registers.
195 for (i = 0; i < _G.nRegs; i++)
197 /* For now only one reg type */
198 if (regsZ80[i].isFree)
206 /** Free registers with type.
209 nfreeRegsType (int type)
214 if ((nfr = nFreeRegs (type)) == 0)
216 return nFreeRegs (REG_GPR);
220 return nFreeRegs (type);
223 /*-----------------------------------------------------------------*/
224 /* useReg - marks a register as used */
225 /*-----------------------------------------------------------------*/
233 /*-----------------------------------------------------------------*/
234 /* allDefsOutOfRange - all definitions are out of a range */
235 /*-----------------------------------------------------------------*/
237 allDefsOutOfRange (bitVect * defs, int fseq, int toseq)
244 for (i = 0; i < defs->size; i++)
248 if (bitVectBitValue (defs, i) &&
249 (ic = hTabItemWithKey (iCodehTab, i)) &&
250 (ic->seq >= fseq && ic->seq <= toseq))
260 /*-----------------------------------------------------------------*/
261 /* computeSpillable - given a point find the spillable live ranges */
262 /*-----------------------------------------------------------------*/
264 computeSpillable (iCode * ic)
268 /* spillable live ranges are those that are live at this
269 point . the following categories need to be subtracted
271 a) - those that are already spilt
272 b) - if being used by this one
273 c) - defined by this one */
275 spillable = bitVectCopy (ic->rlive);
277 bitVectCplAnd (spillable, _G.spiltSet); /* those already spilt */
279 bitVectCplAnd (spillable, ic->uses); /* used in this one */
280 bitVectUnSetBit (spillable, ic->defKey);
281 spillable = bitVectIntersect (spillable, _G.regAssigned);
286 /*-----------------------------------------------------------------*/
287 /* noSpilLoc - return true if a variable has no spil location */
288 /*-----------------------------------------------------------------*/
290 noSpilLoc (symbol * sym, eBBlock * ebp, iCode * ic)
292 return (sym->usl.spillLoc ? 0 : 1);
295 /*-----------------------------------------------------------------*/
296 /* hasSpilLoc - will return 1 if the symbol has spil location */
297 /*-----------------------------------------------------------------*/
299 hasSpilLoc (symbol * sym, eBBlock * ebp, iCode * ic)
301 return (sym->usl.spillLoc ? 1 : 0);
304 /** Will return 1 if the remat flag is set.
305 A symbol is rematerialisable if it doesnt need to be allocated
306 into registers at creation as it can be re-created at any time -
307 i.e. it's constant in some way.
310 rematable (symbol * sym, eBBlock * ebp, iCode * ic)
315 /*-----------------------------------------------------------------*/
316 /* allLRs - return true for all */
317 /*-----------------------------------------------------------------*/
319 allLRs (symbol * sym, eBBlock * ebp, iCode * ic)
324 /** liveRangesWith - applies function to a given set of live range
327 liveRangesWith (bitVect * lrs, int (func) (symbol *, eBBlock *, iCode *),
328 eBBlock * ebp, iCode * ic)
333 if (!lrs || !lrs->size)
336 for (i = 1; i < lrs->size; i++)
339 if (!bitVectBitValue (lrs, i))
342 /* if we don't find it in the live range
343 hash table we are in serious trouble */
344 if (!(sym = hTabItemWithKey (liveRanges, i)))
346 wassertl (0, "liveRangesWith could not find liveRange");
350 if (func (sym, ebp, ic) && bitVectBitValue (_G.regAssigned, sym->key))
352 addSetHead (&rset, sym);
360 /** leastUsedLR - given a set determines which is the least used
363 leastUsedLR (set * sset)
365 symbol *sym = NULL, *lsym = NULL;
367 sym = lsym = setFirstItem (sset);
372 for (; lsym; lsym = setNextItem (sset))
375 /* if usage is the same then prefer
376 the spill the smaller of the two */
377 if (lsym->used == sym->used)
378 if (getSize (lsym->type) < getSize (sym->type))
382 if (lsym->used < sym->used)
387 setToNull ((void **) &sset);
392 /** noOverLap - will iterate through the list looking for over lap
395 noOverLap (set * itmpStack, symbol * fsym)
399 for (sym = setFirstItem (itmpStack); sym;
400 sym = setNextItem (itmpStack))
402 if (bitVectBitValue(sym->clashes,fsym->key))
405 // if sym starts before (or on) our end point
406 // and ends after (or on) our start point,
408 if (sym->liveFrom <= fsym->liveTo &&
409 sym->liveTo >= fsym->liveFrom)
418 /*-----------------------------------------------------------------*/
419 /* isFree - will return 1 if the a free spil location is found */
420 /*-----------------------------------------------------------------*/
424 V_ARG (symbol **, sloc);
425 V_ARG (symbol *, fsym);
427 /* if already found */
431 /* if it is free && and the itmp assigned to
432 this does not have any overlapping live ranges
433 with the one currently being assigned and
434 the size can be accomodated */
436 noOverLap (sym->usl.itmpStack, fsym) &&
437 getSize (sym->type) >= getSize (fsym->type))
446 /*-----------------------------------------------------------------*/
447 /* createStackSpil - create a location on the stack to spil */
448 /*-----------------------------------------------------------------*/
450 createStackSpil (symbol * sym)
454 D (D_ALLOC, ("createStackSpil: for sym %p\n", sym));
456 /* first go try and find a free one that is already
457 existing on the stack */
458 if (applyToSet (_G.stackSpil, isFree, &sloc, sym))
460 /* found a free one : just update & return */
461 sym->usl.spillLoc = sloc;
464 addSetHead (&sloc->usl.itmpStack, sym);
465 D (D_ALLOC, ("createStackSpil: found existing\n"));
469 /* could not then have to create one , this is the hard part
470 we need to allocate this on the stack : this is really a
471 hack!! but cannot think of anything better at this time */
473 sprintf (buffer, "sloc%d", _G.slocNum++);
474 sloc = newiTemp (buffer);
476 /* set the type to the spilling symbol */
477 sloc->type = copyLinkChain (sym->type);
478 sloc->etype = getSpec (sloc->type);
479 SPEC_SCLS (sloc->etype) = S_AUTO;
480 SPEC_EXTR (sloc->etype) = 0;
481 SPEC_STAT (sloc->etype) = 0;
482 SPEC_VOLATILE(sloc->etype) = 0;
486 sloc->isref = 1; /* to prevent compiler warning */
488 /* if it is on the stack then update the stack */
489 if (IN_STACK (sloc->etype))
491 currFunc->stack += getSize (sloc->type);
492 _G.stackExtend += getSize (sloc->type);
496 _G.dataExtend += getSize (sloc->type);
499 /* add it to the stackSpil set */
500 addSetHead (&_G.stackSpil, sloc);
501 sym->usl.spillLoc = sloc;
504 /* add it to the set of itempStack set
505 of the spill location */
506 addSetHead (&sloc->usl.itmpStack, sym);
508 D (D_ALLOC, ("createStackSpil: created new\n"));
512 /*-----------------------------------------------------------------*/
513 /* spillThis - spils a specific operand */
514 /*-----------------------------------------------------------------*/
516 spillThis (symbol * sym)
520 D (D_ALLOC, ("spillThis: spilling %p\n", sym));
522 /* if this is rematerializable or has a spillLocation
523 we are okay, else we need to create a spillLocation
525 if (!(sym->remat || sym->usl.spillLoc))
527 createStackSpil (sym);
530 /* mark it has spilt & put it in the spilt set */
531 sym->isspilt = sym->spillA = 1;
532 _G.spiltSet = bitVectSetBit (_G.spiltSet, sym->key);
534 bitVectUnSetBit (_G.regAssigned, sym->key);
535 bitVectUnSetBit (_G.totRegAssigned, sym->key);
537 for (i = 0; i < sym->nRegs; i++)
541 freeReg (sym->regs[i]);
546 if (sym->usl.spillLoc && !sym->remat)
548 sym->usl.spillLoc->allocreq++;
554 /*-----------------------------------------------------------------*/
555 /* allDefsOutOfRange - all definitions are out of a range */
556 /*-----------------------------------------------------------------*/
558 allDefsOutOfRange (bitVect * defs, int fseq, int toseq)
565 for (i = 0; i < defs->size; i++)
569 if (bitVectBitValue (defs, i) &&
570 (ic = hTabItemWithKey (iCodehTab, i)) &&
571 (ic->seq >= fseq && ic->seq <= toseq))
580 /*-----------------------------------------------------------------*/
581 /* hasSpilLocnoUptr - will return 1 if the symbol has spil location */
582 /* but is not used as a pointer */
583 /*-----------------------------------------------------------------*/
585 hasSpilLocnoUptr (symbol * sym, eBBlock * ebp, iCode * ic)
587 return ((sym->usl.spillLoc && !sym->uptr) ? 1 : 0);
590 /*-----------------------------------------------------------------*/
591 /* notUsedInBlock - not used in this block */
592 /*-----------------------------------------------------------------*/
594 notUsedInBlock (symbol * sym, eBBlock * ebp, iCode * ic)
596 return (!bitVectBitsInCommon (sym->defs, ebp->usesDefs) &&
597 allDefsOutOfRange (sym->defs, ebp->fSeq, ebp->lSeq));
598 /* return (!bitVectBitsInCommon(sym->defs,ebp->usesDefs)); */
601 /*-----------------------------------------------------------------*/
602 /* notUsedInRemaining - not used or defined in remain of the block */
603 /*-----------------------------------------------------------------*/
605 notUsedInRemaining (symbol * sym, eBBlock * ebp, iCode * ic)
607 return ((usedInRemaining (operandFromSymbol (sym), ic) ? 0 : 1) &&
608 allDefsOutOfRange (sym->defs, ebp->fSeq, ebp->lSeq));
612 /** Select a iTemp to spil : rather a simple procedure.
615 selectSpil (iCode * ic, eBBlock * ebp, symbol * forSym)
617 bitVect *lrcs = NULL;
621 D (D_ALLOC, ("selectSpil: finding spill for ic %p\n", ic));
622 /* get the spillable live ranges */
623 lrcs = computeSpillable (ic);
625 /* get all live ranges that are rematerizable */
626 if ((selectS = liveRangesWith (lrcs, rematable, ebp, ic)))
628 D (D_ALLOC, ("selectSpil: using remat.\n"));
629 /* return the least used of these */
630 return leastUsedLR (selectS);
634 /* get live ranges with spillLocations in direct space */
635 if ((selectS = liveRangesWith (lrcs, directSpilLoc, ebp, ic)))
637 sym = leastUsedLR (selectS);
638 strcpy (sym->rname, (sym->usl.spillLoc->rname[0] ?
639 sym->usl.spillLoc->rname :
640 sym->usl.spillLoc->name));
642 /* mark it as allocation required */
643 sym->usl.spillLoc->allocreq++;
647 /* if the symbol is local to the block then */
648 if (forSym->liveTo < ebp->lSeq)
651 /* check if there are any live ranges allocated
652 to registers that are not used in this block */
653 if (!_G.blockSpil && (selectS = liveRangesWith (lrcs, notUsedInBlock, ebp, ic)))
655 sym = leastUsedLR (selectS);
656 /* if this is not rematerializable */
660 wassertl (0, "Attempted to do an unsupported block spill");
666 /* check if there are any live ranges that not
667 used in the remainder of the block */
668 if (!_G.blockSpil && (selectS = liveRangesWith (lrcs, notUsedInRemaining, ebp, ic)))
670 sym = leastUsedLR (selectS);
675 wassertl (0, "Attempted to do an unsupported remain spill");
683 /* find live ranges with spillocation && not used as pointers */
684 if ((selectS = liveRangesWith (lrcs, hasSpilLocnoUptr, ebp, ic)))
687 sym = leastUsedLR (selectS);
688 /* mark this as allocation required */
689 sym->usl.spillLoc->allocreq++;
694 /* find live ranges with spillocation */
695 if ((selectS = liveRangesWith (lrcs, hasSpilLoc, ebp, ic)))
697 D (D_ALLOC, ("selectSpil: using with spill.\n"));
698 sym = leastUsedLR (selectS);
699 sym->usl.spillLoc->allocreq++;
703 /* couldn't find then we need to create a spil
704 location on the stack , for which one? the least
706 if ((selectS = liveRangesWith (lrcs, noSpilLoc, ebp, ic)))
708 D (D_ALLOC, ("selectSpil: creating new spill.\n"));
709 /* return a created spil location */
710 sym = createStackSpil (leastUsedLR (selectS));
711 sym->usl.spillLoc->allocreq++;
715 /* this is an extreme situation we will spill
716 this one : happens very rarely but it does happen */
717 D (D_ALLOC, ("selectSpil: using spillThis.\n"));
723 /** Spil some variable & mark registers as free.
724 A spill occurs when an iTemp wont fit into the available registers.
727 spilSomething (iCode * ic, eBBlock * ebp, symbol * forSym)
732 D (D_ALLOC, ("spilSomething: spilling on ic %p\n", ic));
734 /* get something we can spil */
735 ssym = selectSpil (ic, ebp, forSym);
737 /* mark it as spilt */
738 ssym->isspilt = ssym->spillA = 1;
739 _G.spiltSet = bitVectSetBit (_G.spiltSet, ssym->key);
741 /* mark it as not register assigned &
742 take it away from the set */
743 bitVectUnSetBit (_G.regAssigned, ssym->key);
744 bitVectUnSetBit (_G.totRegAssigned, ssym->key);
746 /* mark the registers as free */
747 for (i = 0; i < ssym->nRegs; i++)
749 freeReg (ssym->regs[i]);
751 wassertl (ssym->blockSpil == 0, "Encountered a sym with a block spill");
752 wassertl (ssym->remainSpil == 0, "Encountered a sym with a remain spill");
754 /* if spilt on stack then free up r0 & r1
755 if they could have been assigned to as gprs */
756 if (!ptrRegReq && isSpiltOnStack (ssym))
759 spillLRWithPtrReg (ssym);
762 /* if this was a block level spil then insert push & pop
763 at the start & end of block respectively */
766 iCode *nic = newiCode (IPUSH, operandFromSymbol (ssym), NULL);
767 /* add push to the start of the block */
768 addiCodeToeBBlock (ebp, nic, (ebp->sch->op == LABEL ?
769 ebp->sch->next : ebp->sch));
770 nic = newiCode (IPOP, operandFromSymbol (ssym), NULL);
771 /* add pop to the end of the block */
772 addiCodeToeBBlock (ebp, nic, NULL);
775 /* if spilt because not used in the remainder of the
776 block then add a push before this instruction and
777 a pop at the end of the block */
778 if (ssym->remainSpil)
781 iCode *nic = newiCode (IPUSH, operandFromSymbol (ssym), NULL);
782 /* add push just before this instruction */
783 addiCodeToeBBlock (ebp, nic, ic);
785 nic = newiCode (IPOP, operandFromSymbol (ssym), NULL);
786 /* add pop to the end of the block */
787 addiCodeToeBBlock (ebp, nic, NULL);
791 D (D_ALLOC, ("spilSomething: done.\n"));
799 /** Will try for GPR if not spil.
802 getRegGpr (iCode * ic, eBBlock * ebp, symbol * sym)
806 D (D_ALLOC, ("getRegGpr: on ic %p\n", ic));
808 /* try for gpr type */
809 if ((reg = allocReg (REG_GPR)))
811 D (D_ALLOC, ("getRegGpr: got a reg.\n"));
815 /* we have to spil */
816 if (!spilSomething (ic, ebp, sym))
818 D (D_ALLOC, ("getRegGpr: have to spill.\n"));
822 /* this looks like an infinite loop but
823 in really selectSpil will abort */
827 static regs *getRegGprNoSpil()
831 /* try for gpr type */
832 if ((reg = allocReg (REG_GPR)))
834 D (D_ALLOC, ("getRegGprNoSpil: got a reg.\n"));
840 /** Symbol has a given register.
843 symHasReg (symbol * sym, regs * reg)
847 for (i = 0; i < sym->nRegs; i++)
848 if (sym->regs[i] == reg)
854 /** Check the live to and if they have registers & are not spilt then
855 free up the registers
858 deassignLRs (iCode * ic, eBBlock * ebp)
864 for (sym = hTabFirstItem (liveRanges, &k); sym;
865 sym = hTabNextItem (liveRanges, &k))
869 /* if it does not end here */
870 if (sym->liveTo > ic->seq)
873 /* if it was spilt on stack then we can
874 mark the stack spil location as free */
879 sym->usl.spillLoc->isFree = 1;
885 if (!bitVectBitValue (_G.regAssigned, sym->key))
888 /* special case check if this is an IFX &
889 the privious one was a pop and the
890 previous one was not spilt then keep track
892 if (ic->op == IFX && ic->prev &&
893 ic->prev->op == IPOP &&
894 !ic->prev->parmPush &&
895 !OP_SYMBOL (IC_LEFT (ic->prev))->isspilt)
896 psym = OP_SYMBOL (IC_LEFT (ic->prev));
898 D (D_ALLOC, ("deassignLRs: in loop on sym %p nregs %u\n", sym, sym->nRegs));
904 bitVectUnSetBit (_G.regAssigned, sym->key);
906 /* if the result of this one needs registers
907 and does not have it then assign it right
909 if (IC_RESULT (ic) &&
910 !(SKIP_IC2 (ic) || /* not a special icode */
911 ic->op == JUMPTABLE ||
916 (result = OP_SYMBOL (IC_RESULT (ic))) && /* has a result */
917 result->liveTo > ic->seq && /* and will live beyond this */
918 result->liveTo <= ebp->lSeq && /* does not go beyond this block */
919 result->regType == sym->regType && /* same register types */
920 result->nRegs && /* which needs registers */
921 !result->isspilt && /* and does not already have them */
923 !bitVectBitValue (_G.regAssigned, result->key) &&
924 /* the number of free regs + number of regs in this LR
925 can accomodate the what result Needs */
926 ((nfreeRegsType (result->regType) +
927 sym->nRegs) >= result->nRegs)
930 for (i = 0; i < result->nRegs; i++)
933 result->regs[i] = sym->regs[i];
935 result->regs[i] = getRegGpr (ic, ebp, result);
937 /* if the allocation falied which means
938 this was spilt then break */
939 if (!result->regs[i])
947 _G.regAssigned = bitVectSetBit (_G.regAssigned, result->key);
948 _G.totRegAssigned = bitVectSetBit (_G.totRegAssigned, result->key);
951 /* free the remaining */
952 for (; i < sym->nRegs; i++)
956 if (!symHasReg (psym, sym->regs[i]))
957 freeReg (sym->regs[i]);
960 freeReg (sym->regs[i]);
961 // sym->regs[i] = NULL;
968 /** Reassign this to registers.
971 reassignLR (operand * op)
973 symbol *sym = OP_SYMBOL (op);
976 D (D_ALLOC, ("reassingLR: on sym %p\n", sym));
978 /* not spilt any more */
979 sym->isspilt = sym->spillA = sym->blockSpil = sym->remainSpil = 0;
980 bitVectUnSetBit (_G.spiltSet, sym->key);
982 _G.regAssigned = bitVectSetBit (_G.regAssigned, sym->key);
983 _G.totRegAssigned = bitVectSetBit (_G.totRegAssigned, sym->key);
987 for (i = 0; i < sym->nRegs; i++)
988 sym->regs[i]->isFree = 0;
991 /** Determines if allocating will cause a spill.
994 willCauseSpill (int nr, int rt)
996 /* first check if there are any avlb registers
997 of te type required */
998 if (nFreeRegs (0) >= nr)
1001 /* it will cause a spil */
1005 /** The allocator can allocate same registers to result and operand,
1006 if this happens make sure they are in the same position as the operand
1007 otherwise chaos results.
1010 positionRegs (symbol * result, symbol * opsym)
1012 int count = min (result->nRegs, opsym->nRegs);
1013 int i, j = 0, shared = 0;
1016 D (D_ALLOC, ("positionRegs: on result %p opsum %p line %u\n", result, opsym, lineno));
1018 /* if the result has been spilt then cannot share */
1023 /* first make sure that they actually share */
1024 for (i = 0; i < count; i++)
1026 for (j = 0; j < count; j++)
1028 if (result->regs[i] == opsym->regs[j] && i != j)
1038 regs *tmp = result->regs[i];
1039 result->regs[i] = result->regs[j];
1040 result->regs[j] = tmp;
1047 /** Try to allocate a pair of registers to the symbol.
1050 tryAllocatingRegPair (symbol * sym)
1053 wassert (sym->nRegs == 2);
1054 for (i = 0; i < _G.nRegs; i += 2)
1056 if ((regsZ80[i].isFree) && (regsZ80[i + 1].isFree))
1058 regsZ80[i].isFree = 0;
1059 sym->regs[0] = ®sZ80[i];
1060 regsZ80[i + 1].isFree = 0;
1061 sym->regs[1] = ®sZ80[i + 1];
1062 sym->regType = REG_PAIR;
1066 currFunc->regsUsed =
1067 bitVectSetBit (currFunc->regsUsed, i);
1068 currFunc->regsUsed =
1069 bitVectSetBit (currFunc->regsUsed, i + 1);
1071 D (D_ALLOC, ("tryAllocRegPair: succeded for sym %p\n", sym));
1075 D (D_ALLOC, ("tryAllocRegPair: failed on sym %p\n", sym));
1079 /** Serially allocate registers to the variables.
1080 This is the main register allocation function. It is called after
1084 serialRegAssign (eBBlock ** ebbs, int count)
1088 /* for all blocks */
1089 for (i = 0; i < count; i++)
1094 if (ebbs[i]->noPath &&
1095 (ebbs[i]->entryLabel != entryLabel &&
1096 ebbs[i]->entryLabel != returnLabel))
1099 /* of all instructions do */
1100 for (ic = ebbs[i]->sch; ic; ic = ic->next)
1103 /* if this is an ipop that means some live
1104 range will have to be assigned again */
1108 reassignLR (IC_LEFT (ic));
1111 /* if result is present && is a true symbol */
1112 if (IC_RESULT (ic) && ic->op != IFX &&
1113 IS_TRUE_SYMOP (IC_RESULT (ic)))
1114 OP_SYMBOL (IC_RESULT (ic))->allocreq++;
1116 /* take away registers from live
1117 ranges that end at this instruction */
1118 deassignLRs (ic, ebbs[i]);
1120 /* some don't need registers */
1121 /* MLH: removed RESULT and POINTER_SET condition */
1122 if (SKIP_IC2 (ic) ||
1123 ic->op == JUMPTABLE ||
1129 /* now we need to allocate registers only for the result */
1132 symbol *sym = OP_SYMBOL (IC_RESULT (ic));
1137 D (D_ALLOC, ("serialRegAssign: in loop on result %p\n", sym));
1139 /* if it does not need or is spilt
1140 or is already assigned to registers
1141 or will not live beyond this instructions */
1144 bitVectBitValue (_G.regAssigned, sym->key) ||
1145 sym->liveTo <= ic->seq)
1147 D (D_ALLOC, ("serialRegAssign: wont live long enough.\n"));
1151 /* if some liverange has been spilt at the block level
1152 and this one live beyond this block then spil this
1154 if (_G.blockSpil && sym->liveTo > ebbs[i]->lSeq)
1156 D (D_ALLOC, ("serialRegAssign: \"spilling to be safe.\"\n"));
1160 /* if trying to allocate this will cause
1161 a spill and there is nothing to spill
1162 or this one is rematerializable then
1164 willCS = willCauseSpill (sym->nRegs, sym->regType);
1165 spillable = computeSpillable (ic);
1167 (willCS && bitVectIsZero (spillable)))
1170 D (D_ALLOC, ("serialRegAssign: \"remat spill\"\n"));
1176 /* if it has a spillocation & is used less than
1177 all other live ranges then spill this */
1179 if (sym->usl.spillLoc) {
1180 symbol *leastUsed = leastUsedLR (liveRangesWith (spillable,
1181 allLRs, ebbs[i], ic));
1182 if (leastUsed && leastUsed->used > sym->used) {
1187 /* if none of the liveRanges have a spillLocation then better
1188 to spill this one than anything else already assigned to registers */
1189 if (liveRangesWith(spillable,noSpilLoc,ebbs[i],ic)) {
1190 /* if this is local to this block then we might find a block spil */
1191 if (!(sym->liveFrom >= ebbs[i]->fSeq && sym->liveTo <= ebbs[i]->lSeq)) {
1199 /* else we assign registers to it */
1200 _G.regAssigned = bitVectSetBit (_G.regAssigned, sym->key);
1201 _G.totRegAssigned = bitVectSetBit (_G.totRegAssigned, sym->key);
1203 /* Special case: Try to fit into a reg pair if
1205 D (D_ALLOC, ("serialRegAssign: actually allocing regs!\n"));
1206 if ((sym->nRegs == 2) && tryAllocatingRegPair (sym))
1211 for (j = 0; j < sym->nRegs; j++)
1213 sym->regs[j] = getRegGpr (ic, ebbs[i], sym);
1215 /* if the allocation falied which means
1216 this was spilt then break */
1219 D (D_ALLOC, ("Couldnt alloc (spill)\n"))
1224 /* if it shares registers with operands make sure
1225 that they are in the same position */
1226 if (IC_LEFT (ic) && IS_SYMOP (IC_LEFT (ic)) &&
1227 OP_SYMBOL (IC_LEFT (ic))->nRegs && ic->op != '=')
1228 positionRegs (OP_SYMBOL (IC_RESULT (ic)),
1229 OP_SYMBOL (IC_LEFT (ic)));
1230 /* do the same for the right operand */
1231 if (IC_RIGHT (ic) && IS_SYMOP (IC_RIGHT (ic)) &&
1232 OP_SYMBOL (IC_RIGHT (ic))->nRegs)
1233 positionRegs (OP_SYMBOL (IC_RESULT (ic)),
1234 OP_SYMBOL (IC_RIGHT (ic)));
1241 /*-----------------------------------------------------------------*/
1242 /* fillGaps - Try to fill in the Gaps left by Pass1 */
1243 /*-----------------------------------------------------------------*/
1244 static void fillGaps()
1249 if (getenv("DISABLE_FILL_GAPS")) return;
1251 /* look for livernages that was spilt by the allocator */
1252 for (sym = hTabFirstItem(liveRanges,&key) ; sym ;
1253 sym = hTabNextItem(liveRanges,&key)) {
1258 if (!sym->spillA || !sym->clashes || sym->remat) continue ;
1260 /* find the liveRanges this one clashes with, that are
1261 still assigned to registers & mark the registers as used*/
1262 for ( i = 0 ; i < sym->clashes->size ; i ++) {
1266 if (bitVectBitValue(sym->clashes,i) == 0 || /* those that clash with this */
1267 bitVectBitValue(_G.totRegAssigned,i) == 0) /* and are still assigned to registers */
1270 assert (clr = hTabItemWithKey(liveRanges,i));
1272 /* mark these registers as used */
1273 for (k = 0 ; k < clr->nRegs ; k++ )
1274 useReg(clr->regs[k]);
1277 if (willCauseSpill(sym->nRegs,sym->regType)) {
1278 /* NOPE :( clear all registers & and continue */
1283 /* THERE IS HOPE !!!! */
1284 for (i=0; i < sym->nRegs ; i++ ) {
1285 sym->regs[i] = getRegGprNoSpil ();
1288 /* for all its definitions check if the registers
1289 allocated needs positioning NOTE: we can position
1290 only ONCE if more than One positioning required
1293 for (i = 0 ; i < sym->defs->size ; i++ ) {
1294 if (bitVectBitValue(sym->defs,i)) {
1296 if (!(ic = hTabItemWithKey(iCodehTab,i))) continue ;
1297 if (SKIP_IC(ic)) continue;
1298 assert(isSymbolEqual(sym,OP_SYMBOL(IC_RESULT(ic)))); /* just making sure */
1299 /* if left is assigned to registers */
1300 if (IS_SYMOP(IC_LEFT(ic)) &&
1301 bitVectBitValue(_G.totRegAssigned,OP_SYMBOL(IC_LEFT(ic))->key)) {
1302 pdone += positionRegs(sym,OP_SYMBOL(IC_LEFT(ic)));
1304 if (IS_SYMOP(IC_RIGHT(ic)) &&
1305 bitVectBitValue(_G.totRegAssigned,OP_SYMBOL(IC_RIGHT(ic))->key)) {
1306 pdone += positionRegs(sym,OP_SYMBOL(IC_RIGHT(ic)));
1308 if (pdone > 1) break;
1311 for (i = 0 ; i < sym->uses->size ; i++ ) {
1312 if (bitVectBitValue(sym->uses,i)) {
1314 if (!(ic = hTabItemWithKey(iCodehTab,i))) continue ;
1315 if (SKIP_IC(ic)) continue;
1316 if (!IS_ASSIGN_ICODE(ic)) continue ;
1318 /* if result is assigned to registers */
1319 if (IS_SYMOP(IC_RESULT(ic)) &&
1320 bitVectBitValue(_G.totRegAssigned,OP_SYMBOL(IC_RESULT(ic))->key)) {
1321 pdone += positionRegs(sym,OP_SYMBOL(IC_RESULT(ic)));
1323 if (pdone > 1) break;
1326 /* had to position more than once GIVE UP */
1328 /* UNDO all the changes we made to try this */
1330 for (i=0; i < sym->nRegs ; i++ ) {
1331 sym->regs[i] = NULL;
1334 D(D_FILL_GAPS,("Fill Gap gave up due to positioning for %s in function %s\n",sym->name, currFunc ? currFunc->name : "UNKNOWN"));
1337 D(D_FILL_GAPS,("FILLED GAP for %s in function %s\n",sym->name, currFunc ? currFunc->name : "UNKNOWN"));
1338 _G.totRegAssigned = bitVectSetBit(_G.totRegAssigned,sym->key);
1339 sym->isspilt = sym->spillA = 0 ;
1340 sym->usl.spillLoc->allocreq--;
1345 /*-----------------------------------------------------------------*/
1346 /* rUmaskForOp :- returns register mask for an operand */
1347 /*-----------------------------------------------------------------*/
1349 rUmaskForOp (operand * op)
1355 /* only temporaries are assigned registers */
1359 sym = OP_SYMBOL (op);
1361 /* if spilt or no registers assigned to it
1363 if (sym->isspilt || !sym->nRegs)
1366 rumask = newBitVect (_G.nRegs);
1368 for (j = 0; j < sym->nRegs; j++)
1370 rumask = bitVectSetBit (rumask, sym->regs[j]->rIdx);
1377 z80_rUmaskForOp (operand * op)
1379 return rUmaskForOp (op);
1382 /** Returns bit vector of registers used in iCode.
1385 regsUsedIniCode (iCode * ic)
1387 bitVect *rmask = newBitVect (_G.nRegs);
1389 /* do the special cases first */
1392 rmask = bitVectUnion (rmask,
1393 rUmaskForOp (IC_COND (ic)));
1397 /* for the jumptable */
1398 if (ic->op == JUMPTABLE)
1400 rmask = bitVectUnion (rmask,
1401 rUmaskForOp (IC_JTCOND (ic)));
1406 /* of all other cases */
1408 rmask = bitVectUnion (rmask,
1409 rUmaskForOp (IC_LEFT (ic)));
1413 rmask = bitVectUnion (rmask,
1414 rUmaskForOp (IC_RIGHT (ic)));
1417 rmask = bitVectUnion (rmask,
1418 rUmaskForOp (IC_RESULT (ic)));
1424 /** For each instruction will determine the regsUsed.
1427 createRegMask (eBBlock ** ebbs, int count)
1431 /* for all blocks */
1432 for (i = 0; i < count; i++)
1436 if (ebbs[i]->noPath &&
1437 (ebbs[i]->entryLabel != entryLabel &&
1438 ebbs[i]->entryLabel != returnLabel))
1441 /* for all instructions */
1442 for (ic = ebbs[i]->sch; ic; ic = ic->next)
1447 if (SKIP_IC2 (ic) || !ic->rlive)
1450 /* first mark the registers used in this
1452 ic->rUsed = regsUsedIniCode (ic);
1453 _G.funcrUsed = bitVectUnion (_G.funcrUsed, ic->rUsed);
1455 /* now create the register mask for those
1456 registers that are in use : this is a
1457 super set of ic->rUsed */
1458 ic->rMask = newBitVect (_G.nRegs + 1);
1460 /* for all live Ranges alive at this point */
1461 for (j = 1; j < ic->rlive->size; j++)
1466 /* if not alive then continue */
1467 if (!bitVectBitValue (ic->rlive, j))
1470 /* find the live range we are interested in */
1471 if (!(sym = hTabItemWithKey (liveRanges, j)))
1473 werror (E_INTERNAL_ERROR, __FILE__, __LINE__,
1474 "createRegMask cannot find live range");
1478 /* if no register assigned to it */
1479 if (!sym->nRegs || sym->isspilt)
1482 /* for all the registers allocated to it */
1483 for (k = 0; k < sym->nRegs; k++)
1486 bitVectSetBit (ic->rMask, sym->regs[k]->rIdx);
1492 /** Returns the rematerialized string for a remat var.
1495 rematStr (symbol * sym)
1498 iCode *ic = sym->rematiCode;
1503 /* if plus or minus print the right hand side */
1504 if (ic->op == '+' || ic->op == '-')
1506 sprintf (s, "0x%04x %c ", (int) operandLitValue (IC_RIGHT (ic)),
1509 ic = OP_SYMBOL (IC_LEFT (ic))->rematiCode;
1512 /* we reached the end */
1513 sprintf (s, "%s", OP_SYMBOL (IC_LEFT (ic))->rname);
1520 /*-----------------------------------------------------------------*/
1521 /* regTypeNum - computes the type & number of registers required */
1522 /*-----------------------------------------------------------------*/
1529 /* for each live range do */
1530 for (sym = hTabFirstItem (liveRanges, &k); sym;
1531 sym = hTabNextItem (liveRanges, &k))
1534 /* if used zero times then no registers needed */
1535 if ((sym->liveTo - sym->liveFrom) == 0)
1538 D (D_ALLOC, ("regTypeNum: loop on sym %p\n", sym));
1540 /* if the live range is a temporary */
1544 /* if the type is marked as a conditional */
1545 if (sym->regType == REG_CND)
1548 /* if used in return only then we don't
1550 if (sym->ruonly || sym->accuse)
1552 if (IS_AGGREGATE (sym->type) || sym->isptr)
1553 sym->type = aggrToPtr (sym->type, FALSE);
1557 /* if not then we require registers */
1558 D (D_ALLOC, ("regTypeNum: isagg %u nRegs %u type %p\n", IS_AGGREGATE (sym->type) || sym->isptr, sym->nRegs, sym->type));
1559 sym->nRegs = ((IS_AGGREGATE (sym->type) || sym->isptr) ?
1560 getSize (sym->type = aggrToPtr (sym->type, FALSE)) :
1561 getSize (sym->type));
1562 D (D_ALLOC, ("regTypeNum: setting nRegs of %s (%p) to %u\n", sym->name, sym, sym->nRegs));
1564 D (D_ALLOC, ("regTypeNum: setup to assign regs sym %p\n", sym));
1568 fprintf (stderr, "allocated more than 4 or 0 registers for type ");
1569 printTypeChain (sym->type, stderr);
1570 fprintf (stderr, "\n");
1573 /* determine the type of register required */
1574 /* Always general purpose */
1575 sym->regType = REG_GPR;
1580 /* for the first run we don't provide */
1581 /* registers for true symbols we will */
1582 /* see how things go */
1583 D (D_ALLOC, ("regTypeNum: #2 setting num of %p to 0\n", sym));
1590 /** Mark all registers as free.
1597 D (D_ALLOC, ("freeAllRegs: running.\n"));
1599 for (i = 0; i < _G.nRegs; i++)
1600 regsZ80[i].isFree = 1;
1603 /*-----------------------------------------------------------------*/
1604 /* deallocStackSpil - this will set the stack pointer back */
1605 /*-----------------------------------------------------------------*/
1606 DEFSETFUNC (deallocStackSpil)
1614 /** Register reduction for assignment.
1617 packRegsForAssign (iCode * ic, eBBlock * ebp)
1621 D (D_ALLOC, ("packRegsForAssign: running on ic %p\n", ic));
1623 if (!IS_ITEMP (IC_RIGHT (ic)) ||
1624 OP_SYMBOL (IC_RIGHT (ic))->isind ||
1625 OP_LIVETO (IC_RIGHT (ic)) > ic->seq)
1630 /* find the definition of iTempNN scanning backwards if we find a
1631 a use of the true symbol in before we find the definition then
1633 for (dic = ic->prev; dic; dic = dic->prev)
1635 /* PENDING: Don't pack across function calls. */
1636 if (dic->op == CALL || dic->op == PCALL)
1645 if (IS_SYMOP (IC_RESULT (dic)) &&
1646 IC_RESULT (dic)->key == IC_RIGHT (ic)->key)
1651 if (IS_SYMOP (IC_RIGHT (dic)) &&
1652 (IC_RIGHT (dic)->key == IC_RESULT (ic)->key ||
1653 IC_RIGHT (dic)->key == IC_RIGHT (ic)->key))
1659 if (IS_SYMOP (IC_LEFT (dic)) &&
1660 (IC_LEFT (dic)->key == IC_RESULT (ic)->key ||
1661 IC_LEFT (dic)->key == IC_RIGHT (ic)->key))
1669 return 0; /* did not find */
1671 /* if the result is on stack or iaccess then it must be
1672 the same atleast one of the operands */
1673 if (OP_SYMBOL (IC_RESULT (ic))->onStack ||
1674 OP_SYMBOL (IC_RESULT (ic))->iaccess)
1676 /* the operation has only one symbol
1677 operator then we can pack */
1678 if ((IC_LEFT (dic) && !IS_SYMOP (IC_LEFT (dic))) ||
1679 (IC_RIGHT (dic) && !IS_SYMOP (IC_RIGHT (dic))))
1682 if (!((IC_LEFT (dic) &&
1683 IC_RESULT (ic)->key == IC_LEFT (dic)->key) ||
1685 IC_RESULT (ic)->key == IC_RIGHT (dic)->key)))
1689 /* found the definition */
1690 /* replace the result with the result of */
1691 /* this assignment and remove this assignment */
1692 bitVectUnSetBit(OP_SYMBOL(IC_RESULT(dic))->defs,dic->key);
1693 IC_RESULT (dic) = IC_RESULT (ic);
1695 if (IS_ITEMP (IC_RESULT (dic)) && OP_SYMBOL (IC_RESULT (dic))->liveFrom > dic->seq)
1697 OP_SYMBOL (IC_RESULT (dic))->liveFrom = dic->seq;
1699 /* delete from liverange table also
1700 delete from all the points inbetween and the new
1702 for (sic = dic; sic != ic; sic = sic->next)
1704 bitVectUnSetBit (sic->rlive, IC_RESULT (ic)->key);
1705 if (IS_ITEMP (IC_RESULT (dic)))
1706 bitVectSetBit (sic->rlive, IC_RESULT (dic)->key);
1709 remiCodeFromeBBlock (ebp, ic);
1710 // PENDING: Check vs mcs51
1711 bitVectUnSetBit(OP_SYMBOL(IC_RESULT(ic))->defs,ic->key);
1712 hTabDeleteItem (&iCodehTab, ic->key, ic, DELETE_ITEM, NULL);
1713 OP_DEFS (IC_RESULT (dic)) = bitVectSetBit (OP_DEFS (IC_RESULT (dic)), dic->key);
1717 /** Scanning backwards looks for first assig found.
1720 findAssignToSym (operand * op, iCode * ic)
1724 for (dic = ic->prev; dic; dic = dic->prev)
1727 /* if definition by assignment */
1728 if (dic->op == '=' &&
1729 !POINTER_SET (dic) &&
1730 IC_RESULT (dic)->key == op->key)
1731 /* && IS_TRUE_SYMOP(IC_RIGHT(dic)) */
1734 /* we are interested only if defined in far space */
1735 /* or in stack space in case of + & - */
1737 /* if assigned to a non-symbol then return
1739 if (!IS_SYMOP (IC_RIGHT (dic)))
1742 /* if the symbol is in far space then
1744 if (isOperandInFarSpace (IC_RIGHT (dic)))
1747 /* for + & - operations make sure that
1748 if it is on the stack it is the same
1749 as one of the three operands */
1750 if ((ic->op == '+' || ic->op == '-') &&
1751 OP_SYMBOL (IC_RIGHT (dic))->onStack)
1754 if (IC_RESULT (ic)->key != IC_RIGHT (dic)->key &&
1755 IC_LEFT (ic)->key != IC_RIGHT (dic)->key &&
1756 IC_RIGHT (ic)->key != IC_RIGHT (dic)->key)
1764 /* if we find an usage then we cannot delete it */
1765 if (IC_LEFT (dic) && IC_LEFT (dic)->key == op->key)
1768 if (IC_RIGHT (dic) && IC_RIGHT (dic)->key == op->key)
1771 if (POINTER_SET (dic) && IC_RESULT (dic)->key == op->key)
1775 /* now make sure that the right side of dic
1776 is not defined between ic & dic */
1779 iCode *sic = dic->next;
1781 for (; sic != ic; sic = sic->next)
1782 if (IC_RESULT (sic) &&
1783 IC_RESULT (sic)->key == IC_RIGHT (dic)->key)
1792 #if !DISABLE_PACKREGSFORSUPPORT
1795 /*-----------------------------------------------------------------*/
1796 /* packRegsForSupport :- reduce some registers for support calls */
1797 /*-----------------------------------------------------------------*/
1799 packRegsForSupport (iCode * ic, eBBlock * ebp)
1802 /* for the left & right operand :- look to see if the
1803 left was assigned a true symbol in far space in that
1804 case replace them */
1805 D (D_ALLOC, ("packRegsForSupport: running on ic %p\n", ic));
1807 if (IS_ITEMP (IC_LEFT (ic)) &&
1808 OP_SYMBOL (IC_LEFT (ic))->liveTo <= ic->seq)
1810 iCode *dic = findAssignToSym (IC_LEFT (ic), ic);
1816 /* found it we need to remove it from the
1818 for (sic = dic; sic != ic; sic = sic->next)
1819 bitVectUnSetBit (sic->rlive, IC_LEFT (ic)->key);
1821 IC_LEFT (ic)->operand.symOperand =
1822 IC_RIGHT (dic)->operand.symOperand;
1823 IC_LEFT (ic)->key = IC_RIGHT (dic)->operand.symOperand->key;
1824 remiCodeFromeBBlock (ebp, dic);
1825 bitVectUnSetBit(OP_SYMBOL(IC_RESULT(dic))->defs,dic->key);
1826 hTabDeleteItem (&iCodehTab, dic->key, dic, DELETE_ITEM, NULL);
1827 // PENDING: Check vs mcs51
1831 /* do the same for the right operand */
1834 IS_ITEMP (IC_RIGHT (ic)) &&
1835 OP_SYMBOL (IC_RIGHT (ic))->liveTo <= ic->seq)
1837 iCode *dic = findAssignToSym (IC_RIGHT (ic), ic);
1843 /* found it we need to remove it from the block */
1844 for (sic = dic; sic != ic; sic = sic->next)
1845 bitVectUnSetBit (sic->rlive, IC_RIGHT (ic)->key);
1847 IC_RIGHT (ic)->operand.symOperand =
1848 IC_RIGHT (dic)->operand.symOperand;
1849 IC_RIGHT (ic)->key = IC_RIGHT (dic)->operand.symOperand->key;
1851 remiCodeFromeBBlock (ebp, dic);
1852 bitVectUnSetBit(OP_SYMBOL(IC_RESULT(dic))->defs,dic->key);
1853 hTabDeleteItem (&iCodehTab, dic->key, dic, DELETE_ITEM, NULL);
1854 // PENDING: vs mcs51
1862 #define IS_OP_RUONLY(x) (x && IS_SYMOP(x) && OP_SYMBOL(x)->ruonly)
1864 /** Will reduce some registers for single use.
1867 packRegsForOneuse (iCode * ic, operand * op, eBBlock * ebp)
1873 D (D_ALLOC, ("packRegsForOneUse: running on ic %p\n", ic));
1875 /* if returning a literal then do nothing */
1879 /* only upto 2 bytes since we cannot predict
1880 the usage of b, & acc */
1881 if (getSize (operandType (op)) > 2)
1884 if (ic->op != RETURN &&
1888 /* this routine will mark the a symbol as used in one
1889 instruction use only && if the defintion is local
1890 (ie. within the basic block) && has only one definition &&
1891 that definiion is either a return value from a
1892 function or does not contain any variables in
1894 uses = bitVectCopy (OP_USES (op));
1895 bitVectUnSetBit (uses, ic->key); /* take away this iCode */
1896 if (!bitVectIsZero (uses)) /* has other uses */
1899 /* if it has only one defintion */
1900 if (bitVectnBitsOn (OP_DEFS (op)) > 1)
1901 return NULL; /* has more than one definition */
1903 /* get the that definition */
1905 hTabItemWithKey (iCodehTab,
1906 bitVectFirstBit (OP_DEFS (op)))))
1909 /* found the definition now check if it is local */
1910 if (dic->seq < ebp->fSeq ||
1911 dic->seq > ebp->lSeq)
1912 return NULL; /* non-local */
1914 /* now check if it is the return from a function call */
1915 if (dic->op == CALL || dic->op == PCALL)
1917 if (ic->op != SEND && ic->op != RETURN &&
1918 !POINTER_SET(ic) && !POINTER_GET(ic))
1920 OP_SYMBOL (op)->ruonly = 1;
1926 /* otherwise check that the definition does
1927 not contain any symbols in far space */
1928 if (isOperandInFarSpace (IC_LEFT (dic)) ||
1929 isOperandInFarSpace (IC_RIGHT (dic)) ||
1930 IS_OP_RUONLY (IC_LEFT (ic)) ||
1931 IS_OP_RUONLY (IC_RIGHT (ic)))
1936 /* if pointer set then make sure the pointer is one byte */
1937 if (POINTER_SET (dic))
1940 if (POINTER_GET (dic))
1945 /* also make sure the intervenening instructions
1946 don't have any thing in far space */
1947 for (dic = dic->next; dic && dic != ic; dic = dic->next)
1949 /* if there is an intervening function call then no */
1950 if (dic->op == CALL || dic->op == PCALL)
1952 /* if pointer set then make sure the pointer
1954 if (POINTER_SET (dic))
1957 if (POINTER_GET (dic))
1960 /* if address of & the result is remat the okay */
1961 if (dic->op == ADDRESS_OF &&
1962 OP_SYMBOL (IC_RESULT (dic))->remat)
1965 /* if left or right or result is in far space */
1966 if (isOperandInFarSpace (IC_LEFT (dic)) ||
1967 isOperandInFarSpace (IC_RIGHT (dic)) ||
1968 isOperandInFarSpace (IC_RESULT (dic)) ||
1969 IS_OP_RUONLY (IC_LEFT (dic)) ||
1970 IS_OP_RUONLY (IC_RIGHT (dic)) ||
1971 IS_OP_RUONLY (IC_RESULT (dic)))
1977 OP_SYMBOL (op)->ruonly = 1;
1981 /*-----------------------------------------------------------------*/
1982 /* isBitwiseOptimizable - requirements of JEAN LOUIS VERN */
1983 /*-----------------------------------------------------------------*/
1985 isBitwiseOptimizable (iCode * ic)
1987 sym_link *rtype = getSpec (operandType (IC_RIGHT (ic)));
1989 /* bitwise operations are considered optimizable
1990 under the following conditions (Jean-Louis VERN)
2002 if (IS_LITERAL (rtype))
2008 Certian assignments involving pointers can be temporarly stored
2019 #if !DISABLE_PACKREGSFORACCUSE
2022 /** Pack registers for acc use.
2023 When the result of this operation is small and short lived it may
2024 be able to be stored in the accumelator.
2027 packRegsForAccUse (iCode * ic)
2031 /* if this is an aggregate, e.g. a one byte char array */
2032 if (IS_AGGREGATE(operandType(IC_RESULT(ic)))) {
2036 /* if + or - then it has to be one byte result */
2037 if ((ic->op == '+' || ic->op == '-')
2038 && getSize (operandType (IC_RESULT (ic))) > 1)
2041 /* if shift operation make sure right side is not a literal */
2042 if (ic->op == RIGHT_OP &&
2043 (isOperandLiteral (IC_RIGHT (ic)) ||
2044 getSize (operandType (IC_RESULT (ic))) > 1))
2047 if (ic->op == LEFT_OP &&
2048 (isOperandLiteral (IC_RIGHT (ic)) ||
2049 getSize (operandType (IC_RESULT (ic))) > 1))
2052 /* has only one definition */
2053 if (bitVectnBitsOn (OP_DEFS (IC_RESULT (ic))) > 1)
2056 /* has only one use */
2057 if (bitVectnBitsOn (OP_USES (IC_RESULT (ic))) > 1)
2060 /* and the usage immediately follows this iCode */
2061 if (!(uic = hTabItemWithKey (iCodehTab,
2062 bitVectFirstBit (OP_USES (IC_RESULT (ic))))))
2065 if (ic->next != uic)
2068 /* if it is a conditional branch then we definitely can */
2072 if (uic->op == JUMPTABLE)
2076 /* if the usage is not is an assignment or an
2077 arithmetic / bitwise / shift operation then not */
2078 if (POINTER_SET (uic) &&
2079 getSize (aggrToPtr (operandType (IC_RESULT (uic)), FALSE)) > 1)
2083 if (uic->op != '=' &&
2084 !IS_ARITHMETIC_OP (uic) &&
2085 !IS_BITWISE_OP (uic) &&
2086 uic->op != LEFT_OP &&
2087 uic->op != RIGHT_OP)
2090 /* if used in ^ operation then make sure right is not a
2092 if (uic->op == '^' && isOperandLiteral (IC_RIGHT (uic)))
2095 /* if shift operation make sure right side is not a literal */
2096 if (uic->op == RIGHT_OP &&
2097 (isOperandLiteral (IC_RIGHT (uic)) ||
2098 getSize (operandType (IC_RESULT (uic))) > 1))
2101 if (uic->op == LEFT_OP &&
2102 (isOperandLiteral (IC_RIGHT (uic)) ||
2103 getSize (operandType (IC_RESULT (uic))) > 1))
2107 /* make sure that the result of this icode is not on the
2108 stack, since acc is used to compute stack offset */
2109 if (IS_TRUE_SYMOP (IC_RESULT (uic)) &&
2110 OP_SYMBOL (IC_RESULT (uic))->onStack)
2115 /* if either one of them in far space then we cannot */
2116 if ((IS_TRUE_SYMOP (IC_LEFT (uic)) &&
2117 isOperandInFarSpace (IC_LEFT (uic))) ||
2118 (IS_TRUE_SYMOP (IC_RIGHT (uic)) &&
2119 isOperandInFarSpace (IC_RIGHT (uic))))
2123 /* if the usage has only one operand then we can */
2124 if (IC_LEFT (uic) == NULL ||
2125 IC_RIGHT (uic) == NULL)
2128 /* make sure this is on the left side if not
2129 a '+' since '+' is commutative */
2130 if (ic->op != '+' &&
2131 IC_LEFT (uic)->key != IC_RESULT (ic)->key)
2134 // See mcs51 ralloc for reasoning
2136 /* if one of them is a literal then we can */
2137 if ((IC_LEFT (uic) && IS_OP_LITERAL (IC_LEFT (uic))) ||
2138 (IC_RIGHT (uic) && IS_OP_LITERAL (IC_RIGHT (uic))))
2145 /** This is confusing :) Guess for now */
2146 if (IC_LEFT (uic)->key == IC_RESULT (ic)->key &&
2147 (IS_ITEMP (IC_RIGHT (uic)) ||
2148 (IS_TRUE_SYMOP (IC_RIGHT (uic)))))
2151 if (IC_RIGHT (uic)->key == IC_RESULT (ic)->key &&
2152 (IS_ITEMP (IC_LEFT (uic)) ||
2153 (IS_TRUE_SYMOP (IC_LEFT (uic)))))
2157 OP_SYMBOL (IC_RESULT (ic))->accuse = ACCUSE_A;
2162 packRegsForHLUse (iCode * ic)
2166 /* PENDING: Could do IFX */
2172 /* has only one definition */
2173 if (bitVectnBitsOn (OP_DEFS (IC_RESULT (ic))) > 1)
2175 D (D_HLUSE, (" + Dropping as has more than one def\n"));
2179 /* has only one use */
2180 if (bitVectnBitsOn (OP_USES (IC_RESULT (ic))) > 1)
2182 D (D_HLUSE, (" + Dropping as has more than one use\n"));
2186 /* and the usage immediately follows this iCode */
2187 if (!(uic = hTabItemWithKey (iCodehTab,
2188 bitVectFirstBit (OP_USES (IC_RESULT (ic))))))
2190 D (D_HLUSE, (" + Dropping as usage isn't in this block\n"));
2194 if (ic->next != uic)
2196 D (D_HLUSE, (" + Dropping as usage doesn't follow this\n"));
2205 if (getSize (operandType (IC_RESULT (ic))) != 2 ||
2206 (IC_LEFT(uic) && getSize (operandType (IC_LEFT (uic))) != 2) ||
2207 (IC_RIGHT(uic) && getSize (operandType (IC_RIGHT (uic))) != 2))
2209 D (D_HLUSE, (" + Dropping as the result size is not 2\n"));
2215 if (ic->op == CAST && uic->op == IPUSH)
2217 if (ic->op == ADDRESS_OF && uic->op == IPUSH)
2219 if (ic->op == ADDRESS_OF && POINTER_GET (uic) && IS_ITEMP( IC_RESULT (uic)))
2221 if (ic->op == CALL && ic->parmBytes == 0 && (uic->op == '-' || uic->op == '+'))
2226 /* Case of assign a constant to offset in a static array. */
2227 if (ic->op == '+' && IS_VALOP (IC_RIGHT (ic)))
2229 if (uic->op == '=' && POINTER_SET (uic))
2233 else if (uic->op == IPUSH && getSize (operandType (IC_LEFT (uic))) == 2)
2240 D (D_HLUSE, (" + Dropping as it's a bad op\n"));
2243 OP_SYMBOL (IC_RESULT (ic))->accuse = ACCUSE_SCRATCH;
2247 packRegsForHLUse3 (iCode * lic, operand * op, eBBlock * ebp)
2252 bool isFirst = TRUE;
2254 D (D_PACK_HLUSE3, ("Checking HL on %p lic key %u first def %u line %u:\n", OP_SYMBOL(op), lic->key, bitVectFirstBit(OP_DEFS(op)), lic->lineno));
2258 if ( OP_SYMBOL(op)->accuse)
2263 if (OP_SYMBOL(op)->remat)
2268 /* Only defined once */
2269 if (bitVectnBitsOn (OP_DEFS (op)) > 1)
2272 if (getSize (operandType (op)) > 2)
2275 /* And this is the definition */
2276 if (bitVectFirstBit (OP_DEFS (op)) != lic->key)
2279 /* first check if any overlapping liverange has already been
2281 if (OP_SYMBOL(op)->clashes)
2283 for (i = 0 ; i < OP_SYMBOL(op)->clashes->size ; i++ )
2285 if (bitVectBitValue(OP_SYMBOL(op)->clashes,i))
2287 sym = hTabItemWithKey(liveRanges,i);
2288 if (sym->accuse == ACCUSE_SCRATCH)
2296 /* Nothing else that clashes with this is using the scratch
2297 register. Scan through all of the intermediate instructions and
2298 see if any of them could nuke HL.
2300 dic = ic = hTabFirstItemWK(iCodeSeqhTab,OP_SYMBOL(op)->liveFrom);
2302 for (; ic && ic->seq <= OP_SYMBOL(op)->liveTo;
2303 ic = hTabNextItem(iCodeSeqhTab, &key))
2307 D (D_PACK_HLUSE3, ("(On %p: op: %u next: %p)\n", ic, ic->op, ic->next));
2312 if (ic->op == ADDRESS_OF)
2314 if (POINTER_GET (ic))
2316 if (ic->op == '=' && !POINTER_SET(ic))
2320 if (IC_RESULT(ic) && IS_SYMOP(IC_RESULT(ic))
2321 && isOperandInDirSpace (IC_RESULT (ic)))
2324 if (IC_LEFT(ic) && IS_SYMOP(IC_LEFT(ic))
2325 && isOperandInDirSpace (IC_LEFT (ic)))
2328 if (IC_RIGHT(ic) && IS_SYMOP(IC_RIGHT(ic))
2329 && isOperandInDirSpace (IC_RIGHT (ic)))
2332 /* Handle the non left/right/result ones first */
2335 if (ic->op == JUMPTABLE)
2344 if (ic->op == IPUSH && isOperandEqual (op, IC_LEFT (ic)))
2347 if (ic->op == SEND && isOperandEqual (op, IC_LEFT (ic)))
2350 if (ic->op == CALL && isOperandEqual (op, IC_RESULT (ic)))
2353 if (ic->op == LEFT_OP && isOperandLiteral (IC_RIGHT (ic)))
2356 if ((ic->op == '=' && !POINTER_SET(ic)) ||
2357 ic->op == UNARYMINUS ||
2366 if (ic->op == '*' && isOperandEqual (op, IC_LEFT (ic)))
2369 if (POINTER_SET (ic) && isOperandEqual (op, IC_RESULT (ic)))
2372 if (POINTER_GET (ic) && isOperandEqual (op, IC_LEFT (ic)))
2375 if (IS_VALOP (IC_RIGHT (ic)) &&
2382 /* By default give up */
2386 D (D_PACK_HLUSE3, ("Succeeded!\n"))
2388 OP_SYMBOL (op)->accuse = ACCUSE_SCRATCH;
2393 packRegsForIYUse (iCode * lic, operand * op, eBBlock * ebp)
2400 D (D_PACK_IY, ("Checking IY on %p lic key %u first def %u line %u:\n", OP_SYMBOL(op), lic->key, bitVectFirstBit(OP_DEFS(op)), lic->lineno));
2404 if ( OP_SYMBOL(op)->accuse)
2409 if (OP_SYMBOL(op)->remat)
2414 /* Only defined once */
2415 if (bitVectnBitsOn (OP_DEFS (op)) > 1)
2418 /* And this is the definition */
2419 if (bitVectFirstBit (OP_DEFS (op)) != lic->key)
2422 /* first check if any overlapping liverange has already been
2424 if (OP_SYMBOL(op)->clashes)
2426 for (i = 0 ; i < OP_SYMBOL(op)->clashes->size ; i++ )
2428 if (bitVectBitValue(OP_SYMBOL(op)->clashes,i))
2430 sym = hTabItemWithKey(liveRanges,i);
2431 if (sym->accuse == ACCUSE_IY)
2439 /* Only a few instructions can load into IY */
2445 /* Nothing else that clashes with this is using the scratch
2446 register. Scan through all of the intermediate instructions and
2447 see if any of them could nuke HL.
2449 dic = ic = hTabFirstItemWK(iCodeSeqhTab,OP_SYMBOL(op)->liveFrom);
2452 for (; ic && ic->seq <= OP_SYMBOL(op)->liveTo;
2453 ic = hTabNextItem(iCodeSeqhTab,&key))
2458 if (ic->op == PCALL ||
2467 /* Be pessamistic. */
2471 D (D_PACK_IY, (" op: %u uses %u result: %d left: %d right: %d\n", ic->op, bitVectBitValue(uses, ic->key),
2472 IC_RESULT(ic) && IS_SYMOP(IC_RESULT(ic)) ? isOperandInDirSpace(IC_RESULT(ic)) : -1,
2473 IC_LEFT(ic) && IS_SYMOP(IC_LEFT(ic)) ? isOperandInDirSpace(IC_LEFT(ic)) : -1,
2474 IC_RIGHT(ic) && IS_SYMOP(IC_RIGHT(ic)) ? isOperandInDirSpace(IC_RIGHT(ic)) : -1
2477 if (IC_RESULT(ic) && IS_SYMOP(IC_RESULT(ic)) &&
2478 isOperandInDirSpace(IC_RESULT(ic)))
2481 if (IC_RIGHT(ic) && IS_SYMOP(IC_RIGHT(ic)) &&
2482 isOperandInDirSpace(IC_RIGHT(ic)))
2485 if (IC_LEFT(ic) && IS_SYMOP(IC_LEFT(ic)) &&
2486 isOperandInDirSpace(IC_LEFT(ic)))
2489 /* Only certain rules will work against IY. Check if this iCode uses
2491 if (bitVectBitValue(uses, ic->key) != 0)
2493 if (ic->op == '=' &&
2494 isOperandEqual(IC_RESULT(ic), op))
2497 if (ic->op == GET_VALUE_AT_ADDRESS &&
2498 isOperandEqual(IC_LEFT(ic), op))
2501 if (isOperandEqual(IC_RESULT(ic), IC_LEFT(ic)) == FALSE)
2504 if (IC_RIGHT (ic) && IS_VALOP (IC_RIGHT (ic)))
2506 if (ic->op == '+' ||
2509 /* Only works if the constant is small */
2510 if (operandLitValue (IC_RIGHT (ic)) < 4)
2519 /* This iCode doesn't use the sym. See if this iCode preserves IY.
2524 /* By default give up */
2528 D (D_PACK_IY, ("Succeeded IY!\n"));
2530 OP_SYMBOL (op)->accuse = ACCUSE_IY;
2534 /** Returns TRUE if this operation can use acc and if it preserves the value.
2537 opPreservesA (iCode * uic)
2541 /* If we've gotten this far then the thing to compare must be
2542 small enough and must be in A.
2547 if (uic->op == JUMPTABLE)
2549 D (D_ACCUSE2, (" + Dropping as operation is a Jumptable\n"));
2553 /* A pointer assign preserves A if A is the left value. */
2554 if (uic->op == '=' && POINTER_SET (uic))
2559 /* if the usage has only one operand then we can */
2560 /* PENDING: check */
2561 if (IC_LEFT (uic) == NULL ||
2562 IC_RIGHT (uic) == NULL)
2564 D (D_ACCUSE2, (" + Dropping as operation has only one operand\n"));
2568 /* PENDING: check this rule */
2569 if (getSize (operandType (IC_RESULT (uic))) > 1)
2571 D (D_ACCUSE2, (" + Dropping as operation has size is too big\n"));
2576 /* Disabled all of the old rules as they weren't verified and have
2577 caused at least one problem.
2582 /** Returns true if this operand preserves the value of A.
2585 opIgnoresA (iCode * ic, iCode * uic)
2587 /* A increment of an iTemp by a constant is OK. */
2588 if ( uic->op == '+' &&
2589 IS_ITEMP (IC_LEFT (uic)) &&
2590 IS_ITEMP (IC_RESULT (uic)) &&
2591 IS_OP_LITERAL (IC_RIGHT (uic)))
2593 unsigned int icount = (unsigned int) floatFromVal (IC_RIGHT (uic)->operand.valOperand);
2595 /* Being an ITEMP means that we're already a symbol. */
2597 IC_RESULT (uic)->operand.symOperand->key == IC_LEFT (uic)->operand.symOperand->key
2603 else if (uic->op == '=' && !POINTER_SET (uic))
2605 /* If they are equal and get optimised out then things are OK. */
2606 if (isOperandEqual (IC_RESULT (uic), IC_RIGHT (uic)))
2608 /* Straight assign is OK. */
2617 /* Some optimisation cases:
2629 ; genAssign (pointer)
2633 want to optimise down to:
2639 So genPointer get is OK
2640 genPlus where the right is constant, left is iTemp, and result is same as left
2641 genAssign (pointer) is OK
2652 ; genAssign (pointer)
2653 ; AOP_STK for _strcpy_to_1_1
2658 want to optimise down to:
2664 So genIfx where IC_COND has size of 1 and is a constant.
2667 /** Pack registers for acc use.
2668 When the result of this operation is small and short lived it may
2669 be able to be stored in the accumulator.
2671 Note that the 'A preserving' list is currently emperical :)
2674 packRegsForAccUse2 (iCode * ic)
2678 D (D_ACCUSE2, ("packRegsForAccUse2: running on ic %p line %u\n", ic, ic->lineno));
2682 /* Filter out all but those 'good' commands */
2684 !POINTER_GET (ic) &&
2687 !IS_BITWISE_OP (ic) &&
2693 ic->op != GETHBIT &&
2696 D (D_ACCUSE2, (" + Dropping as not a 'good' source command\n"));
2700 /* if + or - then it has to be one byte result.
2703 if ((ic->op == '+' || ic->op == '-')
2704 && getSize (operandType (IC_RESULT (ic))) > 1)
2706 D (D_ACCUSE2, (" + Dropping as it's a big + or -\n"));
2710 /* has only one definition */
2711 if (bitVectnBitsOn (OP_DEFS (IC_RESULT (ic))) > 1)
2713 D (D_ACCUSE2, (" + Dropping as it has more than one definition\n"));
2717 /* Right. We may be able to propagate it through if:
2718 For each in the chain of uses the intermediate is OK.
2720 /* Get next with 'uses result' bit on
2721 If this->next == next
2722 Validate use of next
2723 If OK, increase count
2725 /* and the usage immediately follows this iCode */
2726 if (!(uic = hTabItemWithKey (iCodehTab,
2727 bitVectFirstBit (OP_USES (IC_RESULT (ic))))))
2729 D (D_ACCUSE2, (" + Dropping as usage does not follow first\n"));
2734 /* Create a copy of the OP_USES bit vect */
2735 bitVect *uses = bitVectCopy (OP_USES (IC_RESULT (ic)));
2737 iCode *scan = ic, *next;
2741 setBit = bitVectFirstBit (uses);
2742 next = hTabItemWithKey (iCodehTab, setBit);
2743 if (scan->next == next)
2745 D (D_ACCUSE2_VERBOSE, (" ! Is next in line\n"));
2747 bitVectUnSetBit (uses, setBit);
2748 /* Still contigous. */
2749 if (!opPreservesA (next))
2751 D (D_ACCUSE2, (" + Dropping as operation doesn't preserve A\n"));
2754 D (D_ACCUSE2_VERBOSE, (" ! Preserves A, so continue scanning\n"));
2757 else if (scan->next == NULL && bitVectnBitsOn (uses) == 1 && next != NULL)
2759 if (next->prev == NULL)
2761 if (!opPreservesA (next))
2763 D (D_ACCUSE2, (" + Dropping as operation doesn't preserve A #2\n"));
2766 bitVectUnSetBit (uses, setBit);
2771 D (D_ACCUSE2, (" + Dropping as last in list and next doesn't start a block\n"));
2775 else if (scan->next == NULL)
2777 D (D_ACCUSE2, (" + Dropping as hit the end of the list\n"));
2778 D (D_ACCUSE2, (" + Next in htab: %p\n", next));
2783 if (opIgnoresA (ic, scan->next))
2787 D (D_ACCUSE2_VERBOSE, (" ! Op ignores A, so continue scanning\n"));
2791 D (D_ACCUSE2, (" + Dropping as parts are not consecuitive and intermediate might use A\n"));
2796 while (!bitVectIsZero (uses));
2798 OP_SYMBOL (IC_RESULT (ic))->accuse = ACCUSE_A;
2803 /** Does some transformations to reduce register pressure.
2806 packRegisters (eBBlock * ebp)
2811 D (D_ALLOC, ("packRegisters: entered.\n"));
2813 while (1 && !DISABLE_PACK_ASSIGN)
2816 /* look for assignments of the form */
2817 /* iTempNN = TRueSym (someoperation) SomeOperand */
2819 /* TrueSym := iTempNN:1 */
2820 for (ic = ebp->sch; ic; ic = ic->next)
2822 /* find assignment of the form TrueSym := iTempNN:1 */
2823 if (ic->op == '=' && !POINTER_SET (ic))
2824 change += packRegsForAssign (ic, ebp);
2830 for (ic = ebp->sch; ic; ic = ic->next)
2832 /* Safe: address of a true sym is always constant. */
2833 /* if this is an itemp & result of a address of a true sym
2834 then mark this as rematerialisable */
2835 D (D_ALLOC, ("packRegisters: looping on ic %p\n", ic));
2837 if (ic->op == ADDRESS_OF &&
2838 IS_ITEMP (IC_RESULT (ic)) &&
2839 IS_TRUE_SYMOP (IC_LEFT (ic)) &&
2840 bitVectnBitsOn (OP_DEFS (IC_RESULT (ic))) == 1 &&
2841 !OP_SYMBOL (IC_LEFT (ic))->onStack)
2844 OP_SYMBOL (IC_RESULT (ic))->remat = 1;
2845 OP_SYMBOL (IC_RESULT (ic))->rematiCode = ic;
2846 OP_SYMBOL (IC_RESULT (ic))->usl.spillLoc = NULL;
2849 /* Safe: just propagates the remat flag */
2850 /* if straight assignment then carry remat flag if this is the
2852 if (ic->op == '=' &&
2853 !POINTER_SET (ic) &&
2854 IS_SYMOP (IC_RIGHT (ic)) &&
2855 OP_SYMBOL (IC_RIGHT (ic))->remat &&
2856 bitVectnBitsOn (OP_SYMBOL (IC_RESULT (ic))->defs) <= 1)
2859 OP_SYMBOL (IC_RESULT (ic))->remat =
2860 OP_SYMBOL (IC_RIGHT (ic))->remat;
2861 OP_SYMBOL (IC_RESULT (ic))->rematiCode =
2862 OP_SYMBOL (IC_RIGHT (ic))->rematiCode;
2865 /* if the condition of an if instruction is defined in the
2866 previous instruction then mark the itemp as a conditional */
2867 if ((IS_CONDITIONAL (ic) ||
2868 ((ic->op == BITWISEAND ||
2871 isBitwiseOptimizable (ic))) &&
2872 ic->next && ic->next->op == IFX &&
2873 bitVectnBitsOn (OP_USES(IC_RESULT(ic)))==1 &&
2874 isOperandEqual (IC_RESULT (ic), IC_COND (ic->next)) &&
2875 OP_SYMBOL (IC_RESULT (ic))->liveTo <= ic->next->seq)
2878 OP_SYMBOL (IC_RESULT (ic))->regType = REG_CND;
2883 /* reduce for support function calls */
2884 if (ic->supportRtn || ic->op == '+' || ic->op == '-')
2885 packRegsForSupport (ic, ebp);
2888 /* some cases the redundant moves can
2889 can be eliminated for return statements */
2890 if (ic->op == RETURN || ic->op == SEND)
2892 packRegsForOneuse (ic, IC_LEFT (ic), ebp);
2895 /* if pointer set & left has a size more than
2896 one and right is not in far space */
2897 if (!DISABLE_PACK_ONE_USE &&
2899 /* MLH: no such thing.
2900 !isOperandInFarSpace(IC_RIGHT(ic)) && */
2901 !OP_SYMBOL (IC_RESULT (ic))->remat &&
2902 !IS_OP_RUONLY (IC_RIGHT (ic)) &&
2903 getSize (aggrToPtr (operandType (IC_RESULT (ic)), FALSE)) > 1)
2906 packRegsForOneuse (ic, IC_RESULT (ic), ebp);
2909 /* if pointer get */
2910 if (!DISABLE_PACK_ONE_USE &&
2912 /* MLH: dont have far space
2913 !isOperandInFarSpace(IC_RESULT(ic))&& */
2914 !OP_SYMBOL (IC_LEFT (ic))->remat &&
2915 !IS_OP_RUONLY (IC_RESULT (ic)) &&
2916 getSize (aggrToPtr (operandType (IC_LEFT (ic)), FALSE)) > 1)
2919 packRegsForOneuse (ic, IC_LEFT (ic), ebp);
2922 /* pack registers for accumulator use, when the result of an
2923 arithmetic or bit wise operation has only one use, that use is
2924 immediately following the defintion and the using iCode has
2925 only one operand or has two operands but one is literal & the
2926 result of that operation is not on stack then we can leave the
2927 result of this operation in acc:b combination */
2929 if (!DISABLE_PACK_HL && IS_ITEMP (IC_RESULT (ic)))
2932 packRegsForHLUse (ic);
2934 packRegsForHLUse3 (ic, IC_RESULT (ic), ebp);
2937 if (!DISABLE_PACK_IY && IS_ITEMP (IC_RESULT (ic)) && IS_Z80)
2939 packRegsForIYUse (ic, IC_RESULT (ic), ebp);
2942 if (!DISABLE_PACK_ACC && IS_ITEMP (IC_RESULT (ic)) &&
2943 getSize (operandType (IC_RESULT (ic))) == 1)
2945 packRegsForAccUse2 (ic);
2950 /** Joins together two byte constant pushes into one word push.
2953 joinPushes (iCode *lic)
2957 for (ic = lic; ic; ic = ic->next)
2964 /* Anything past this? */
2969 /* This and the next pushes? */
2970 if (ic->op != IPUSH || uic->op != IPUSH)
2974 /* Both literals? */
2975 if ( !IS_OP_LITERAL (IC_LEFT (ic)) || !IS_OP_LITERAL (IC_LEFT (uic)))
2979 /* Both characters? */
2980 if ( getSize (operandType (IC_LEFT (ic))) != 1 || getSize (operandType (IC_LEFT (uic))) != 1)
2984 /* Pull out the values, make a new type, and create the new iCode for it.
2986 first = (int)operandLitValue ( IC_LEFT (ic));
2987 second = (int)operandLitValue ( IC_LEFT (uic));
2989 sprintf (buffer, "%u", ((first << 8) | (second & 0xFF)) & 0xFFFFU);
2990 val = constVal (buffer);
2991 SPEC_NOUN (val->type) = V_INT;
2992 IC_LEFT (ic)->operand.valOperand = val;
2994 /* Now remove the second one from the list. */
2995 ic->next = uic->next;
2998 /* Patch up the reverse link */
2999 uic->next->prev = ic;
3006 /*-----------------------------------------------------------------*/
3007 /* assignRegisters - assigns registers to each live range as need */
3008 /*-----------------------------------------------------------------*/
3010 z80_assignRegisters (eBBlock ** ebbs, int count)
3015 D (D_ALLOC, ("\n-> z80_assignRegisters: entered.\n"));
3017 setToNull ((void *) &_G.funcrUsed);
3018 setToNull ((void *) &_G.totRegAssigned);
3019 _G.stackExtend = _G.dataExtend = 0;
3023 /* DE is required for the code gen. */
3024 _G.nRegs = GBZ80_MAX_REGS;
3025 regsZ80 = _gbz80_regs;
3029 _G.nRegs = Z80_MAX_REGS;
3030 regsZ80 = _z80_regs;
3033 /* change assignments this will remove some
3034 live ranges reducing some register pressure */
3035 for (i = 0; i < count; i++)
3036 packRegisters (ebbs[i]);
3038 if (options.dump_pack)
3039 dumpEbbsToFileExt (DUMP_PACK, ebbs, count);
3041 /* first determine for each live range the number of
3042 registers & the type of registers required for each */
3045 /* and serially allocate registers */
3046 serialRegAssign (ebbs, count);
3051 /* if stack was extended then tell the user */
3054 /* werror(W_TOOMANY_SPILS,"stack", */
3055 /* _G.stackExtend,currFunc->name,""); */
3061 /* werror(W_TOOMANY_SPILS,"data space", */
3062 /* _G.dataExtend,currFunc->name,""); */
3066 if (options.dump_rassgn) {
3067 dumpEbbsToFileExt (DUMP_RASSGN, ebbs, count);
3068 dumpLiveRanges (DUMP_LRANGE, liveRanges);
3071 /* after that create the register mask
3072 for each of the instruction */
3073 createRegMask (ebbs, count);
3075 /* now get back the chain */
3076 ic = iCodeLabelOptimize (iCodeFromeBBlock (ebbs, count));
3078 ic = joinPushes (ic);
3080 /* redo that offsets for stacked automatic variables */
3081 redoStackOffsets ();
3085 /* free up any stackSpil locations allocated */
3086 applyToSet (_G.stackSpil, deallocStackSpil);
3088 setToNull ((void **) &_G.stackSpil);
3089 setToNull ((void **) &_G.spiltSet);
3090 /* mark all registers as free */