* src/mcs51/ralloc.c (deassignLR),
[fw/sdcc] / src / z80 / ralloc.c
1 /** @name Z80 Register allocation functions.
2     @author Michael Hope
3
4     Note: much of this is ripped straight from Sandeep's mcs51 code.
5
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.
9
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.
16
17     The stack frame is the common ix-bp style.  Basically:
18
19     ix+4+n:     param 1 
20     ix+4:       param 0 
21     ix+2:       return address 
22     ix+0:       calling functions ix 
23     ix-n:       local varibles 
24     ...  
25     sp:         end of local varibles
26
27     There is currently no support for bit spaces or banked functions.
28     
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.
36     
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
43     software-hoarding!  
44 */
45
46 #include "z80.h"
47 #include "SDCCicode.h"
48
49 /* Flags to turn off optimisations.
50  */
51 enum
52   {
53     DISABLE_PACK_ACC = 0,
54     DISABLE_PACK_ASSIGN = 0,
55     DISABLE_PACK_ONE_USE = 0,
56     DISABLE_PACK_HL = 1,
57     DISABLE_PACK_IY = 0
58   };
59
60 /* Flags to turn on debugging code.
61  */
62 enum
63   {
64     D_ALLOC = 0,
65     D_ALLOC2 = 0,
66     D_ACCUSE2 = 0,
67     D_ACCUSE2_VERBOSE = 0,
68     D_HLUSE = 0,
69     D_HLUSE2 = 0,
70     D_HLUSE2_VERBOSE = 0,
71     D_FILL_GAPS = 0,
72     D_PACK_IY = 0,
73     D_PACK_HLUSE3 = 0
74   };
75
76 #if 1
77 #define D(_a, _s)       if (_a)  { printf _s; fflush(stdout); }
78 #else
79 #define D(_a, _s)
80 #endif
81
82 #define DISABLE_PACKREGSFORSUPPORT      1
83 #define DISABLE_PACKREGSFORACCUSE       1
84
85 extern void genZ80Code (iCode *);
86
87 /** Local static variables */
88 static struct
89 {
90   bitVect *spiltSet;
91   set *stackSpil;
92   bitVect *regAssigned;
93   bitVect *totRegAssigned;    /* final set of LRs that got into registers */
94   short blockSpil;
95   int slocNum;
96   /* registers used in a function */
97   bitVect *funcrUsed;
98   int stackExtend;
99   int dataExtend;
100   int nRegs;
101 } _G;
102
103 static regs _gbz80_regs[] =
104 {
105   {REG_GPR, C_IDX, "c", 1},
106   {REG_GPR, B_IDX, "b", 1},
107   {REG_CND, CND_IDX, "c", 1}
108 };
109
110 static regs _z80_regs[] =
111 {
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}
117 };
118
119 regs *regsZ80;
120
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)
124
125 static void spillThis (symbol *);
126 static void freeAllRegs ();
127
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.
131
132     @return             Pointer to the newly allocated register.
133  */
134 static regs *
135 allocReg (short type)
136 {
137   int i;
138
139   for (i = 0; i < _G.nRegs; i++)
140     {
141       /* For now we allocate from any free */
142       if (regsZ80[i].isFree)
143         {
144           regsZ80[i].isFree = 0;
145           if (currFunc)
146             {
147               currFunc->regsUsed = bitVectSetBit (currFunc->regsUsed, i);
148             }
149           D (D_ALLOC, ("allocReg: alloced %p\n", &regsZ80[i]));
150           return &regsZ80[i];
151         }
152     }
153   D (D_ALLOC, ("allocReg: No free.\n"));
154   return NULL;
155 }
156
157 /** Returns pointer to register wit index number
158  */
159 regs *
160 regWithIdx (int idx)
161 {
162   int i;
163
164   for (i = 0; i < _G.nRegs; i++)
165     {
166       if (regsZ80[i].rIdx == idx)
167         {
168           return &regsZ80[i];
169         }
170     }
171
172   wassertl (0, "regWithIdx not found");
173   exit (1);
174 }
175
176 /** Frees a register.
177  */
178 static void 
179 freeReg (regs * reg)
180 {
181   wassert (!reg->isFree);
182   reg->isFree = 1;
183   D (D_ALLOC, ("freeReg: freed %p\n", reg));
184 }
185
186
187 /** Returns number of free registers.
188  */
189 static int 
190 nFreeRegs (int type)
191 {
192   int i;
193   int nfr = 0;
194
195   for (i = 0; i < _G.nRegs; i++)
196     {
197       /* For now only one reg type */
198       if (regsZ80[i].isFree)
199         {
200           nfr++;
201         }
202     }
203   return nfr;
204 }
205
206 /** Free registers with type.
207  */
208 static int 
209 nfreeRegsType (int type)
210 {
211   int nfr;
212   if (type == REG_PTR)
213     {
214       if ((nfr = nFreeRegs (type)) == 0)
215         {
216           return nFreeRegs (REG_GPR);
217         }
218     }
219
220   return nFreeRegs (type);
221 }
222
223 /*-----------------------------------------------------------------*/
224 /* useReg - marks a register  as used                              */
225 /*-----------------------------------------------------------------*/
226 static void
227 useReg (regs * reg)
228 {
229   reg->isFree = 0;
230 }
231
232 /*-----------------------------------------------------------------*/
233 /* computeSpillable - given a point find the spillable live ranges */
234 /*-----------------------------------------------------------------*/
235 static bitVect *
236 computeSpillable (iCode * ic)
237 {
238   bitVect *spillable;
239
240   /* spillable live ranges are those that are live at this 
241      point . the following categories need to be subtracted
242      from this set. 
243      a) - those that are already spilt
244      b) - if being used by this one
245      c) - defined by this one */
246
247   spillable = bitVectCopy (ic->rlive);
248   spillable =
249     bitVectCplAnd (spillable, _G.spiltSet);     /* those already spilt */
250   spillable =
251     bitVectCplAnd (spillable, ic->uses);        /* used in this one */
252   bitVectUnSetBit (spillable, ic->defKey);
253   spillable = bitVectIntersect (spillable, _G.regAssigned);
254
255   return spillable;
256 }
257
258 /*-----------------------------------------------------------------*/
259 /* noSpilLoc - return true if a variable has no spil location      */
260 /*-----------------------------------------------------------------*/
261 static int 
262 noSpilLoc (symbol * sym, eBBlock * ebp, iCode * ic)
263 {
264   return (sym->usl.spillLoc ? 0 : 1);
265 }
266
267 /*-----------------------------------------------------------------*/
268 /* hasSpilLoc - will return 1 if the symbol has spil location      */
269 /*-----------------------------------------------------------------*/
270 static int 
271 hasSpilLoc (symbol * sym, eBBlock * ebp, iCode * ic)
272 {
273   return (sym->usl.spillLoc ? 1 : 0);
274 }
275
276 /** Will return 1 if the remat flag is set.
277     A symbol is rematerialisable if it doesnt need to be allocated
278     into registers at creation as it can be re-created at any time -
279     i.e. it's constant in some way.
280 */
281 static int 
282 rematable (symbol * sym, eBBlock * ebp, iCode * ic)
283 {
284   return sym->remat;
285 }
286
287 /*-----------------------------------------------------------------*/
288 /* allLRs - return true for all                                    */
289 /*-----------------------------------------------------------------*/
290 static int 
291 allLRs (symbol * sym, eBBlock * ebp, iCode * ic)
292 {
293   return 1;
294 }
295
296 /** liveRangesWith - applies function to a given set of live range 
297  */
298 static set *
299 liveRangesWith (bitVect * lrs, int (func) (symbol *, eBBlock *, iCode *),
300                 eBBlock * ebp, iCode * ic)
301 {
302   set *rset = NULL;
303   int i;
304
305   if (!lrs || !lrs->size)
306     return NULL;
307
308   for (i = 1; i < lrs->size; i++)
309     {
310       symbol *sym;
311       if (!bitVectBitValue (lrs, i))
312         continue;
313
314       /* if we don't find it in the live range 
315          hash table we are in serious trouble */
316       if (!(sym = hTabItemWithKey (liveRanges, i)))
317         {
318           wassertl (0, "liveRangesWith could not find liveRange");
319           exit (1);
320         }
321
322       if (func (sym, ebp, ic) && bitVectBitValue (_G.regAssigned, sym->key))
323         {
324           addSetHead (&rset, sym);
325         }
326     }
327
328   return rset;
329 }
330
331
332 /** leastUsedLR - given a set determines which is the least used 
333  */
334 static symbol *
335 leastUsedLR (set * sset)
336 {
337   symbol *sym = NULL, *lsym = NULL;
338
339   sym = lsym = setFirstItem (sset);
340
341   if (!lsym)
342     return NULL;
343
344   for (; lsym; lsym = setNextItem (sset))
345     {
346
347       /* if usage is the same then prefer
348          the spill the smaller of the two */
349       if (lsym->used == sym->used)
350         if (getSize (lsym->type) < getSize (sym->type))
351           sym = lsym;
352
353       /* if less usage */
354       if (lsym->used < sym->used)
355         sym = lsym;
356
357     }
358
359   setToNull ((void *) &sset);
360   sym->blockSpil = 0;
361   return sym;
362 }
363
364 /** noOverLap - will iterate through the list looking for over lap
365  */
366 static int 
367 noOverLap (set * itmpStack, symbol * fsym)
368 {
369   symbol *sym;
370
371   for (sym = setFirstItem (itmpStack); sym;
372        sym = setNextItem (itmpStack))
373     {
374       if (bitVectBitValue(sym->clashes,fsym->key)) 
375         return 0;
376 #if 0
377             // if sym starts before (or on) our end point
378             // and ends after (or on) our start point, 
379             // it is an overlap.
380             if (sym->liveFrom <= fsym->liveTo &&
381                 sym->liveTo   >= fsym->liveFrom)
382             {
383                 return 0;
384             }
385 #endif
386     }
387   return 1;
388 }
389
390 /*-----------------------------------------------------------------*/
391 /* isFree - will return 1 if the a free spil location is found     */
392 /*-----------------------------------------------------------------*/
393 DEFSETFUNC (isFree)
394 {
395   symbol *sym = item;
396   V_ARG (symbol **, sloc);
397   V_ARG (symbol *, fsym);
398
399   /* if already found */
400   if (*sloc)
401     return 0;
402
403   /* if it is free && and the itmp assigned to
404      this does not have any overlapping live ranges
405      with the one currently being assigned and
406      the size can be accomodated  */
407   if (sym->isFree &&
408       noOverLap (sym->usl.itmpStack, fsym) &&
409       getSize (sym->type) >= getSize (fsym->type))
410     {
411       *sloc = sym;
412       return 1;
413     }
414
415   return 0;
416 }
417
418 /*-----------------------------------------------------------------*/
419 /* createStackSpil - create a location on the stack to spil        */
420 /*-----------------------------------------------------------------*/
421 static symbol *
422 createStackSpil (symbol * sym)
423 {
424   symbol *sloc = NULL;
425
426   D (D_ALLOC, ("createStackSpil: for sym %p\n", sym));
427
428   /* first go try and find a free one that is already 
429      existing on the stack */
430   if (applyToSet (_G.stackSpil, isFree, &sloc, sym))
431     {
432       /* found a free one : just update & return */
433       sym->usl.spillLoc = sloc;
434       sym->stackSpil = 1;
435       sloc->isFree = 0;
436       addSetHead (&sloc->usl.itmpStack, sym);
437       D (D_ALLOC, ("createStackSpil: found existing\n"));
438       return sym;
439     }
440
441   /* could not then have to create one , this is the hard part
442      we need to allocate this on the stack : this is really a
443      hack!! but cannot think of anything better at this time */
444
445   sprintf (buffer, "sloc%d", _G.slocNum++);
446   sloc = newiTemp (buffer);
447
448   /* set the type to the spilling symbol */
449   sloc->type = copyLinkChain (sym->type);
450   sloc->etype = getSpec (sloc->type);
451   SPEC_SCLS (sloc->etype) = S_AUTO;
452   SPEC_EXTR (sloc->etype) = 0;
453   SPEC_STAT (sloc->etype) = 0;
454   SPEC_VOLATILE(sloc->etype) = 0;
455
456   allocLocal (sloc);
457
458   sloc->isref = 1;              /* to prevent compiler warning */
459
460   /* if it is on the stack then update the stack */
461   if (IN_STACK (sloc->etype))
462     {
463       currFunc->stack += getSize (sloc->type);
464       _G.stackExtend += getSize (sloc->type);
465     }
466   else
467     {
468       _G.dataExtend += getSize (sloc->type);
469     }
470
471   /* add it to the stackSpil set */
472   addSetHead (&_G.stackSpil, sloc);
473   sym->usl.spillLoc = sloc;
474   sym->stackSpil = 1;
475
476   /* add it to the set of itempStack set 
477      of the spill location */
478   addSetHead (&sloc->usl.itmpStack, sym);
479
480   D (D_ALLOC, ("createStackSpil: created new\n"));
481   return sym;
482 }
483
484 /*-----------------------------------------------------------------*/
485 /* spillThis - spils a specific operand                            */
486 /*-----------------------------------------------------------------*/
487 static void 
488 spillThis (symbol * sym)
489 {
490   int i;
491
492   D (D_ALLOC, ("spillThis: spilling %p\n", sym));
493
494   /* if this is rematerializable or has a spillLocation
495      we are okay, else we need to create a spillLocation
496      for it */
497   if (!(sym->remat || sym->usl.spillLoc))
498     {
499       createStackSpil (sym);
500     }
501
502   /* mark it has spilt & put it in the spilt set */
503   sym->isspilt = sym->spillA = 1;
504   _G.spiltSet = bitVectSetBit (_G.spiltSet, sym->key);
505
506   bitVectUnSetBit (_G.regAssigned, sym->key);
507   bitVectUnSetBit (_G.totRegAssigned, sym->key);
508
509   for (i = 0; i < sym->nRegs; i++)
510     {
511       if (sym->regs[i])
512         {
513           freeReg (sym->regs[i]);
514           sym->regs[i] = NULL;
515         }
516     }
517
518   if (sym->usl.spillLoc && !sym->remat)
519     {
520       sym->usl.spillLoc->allocreq++;
521     }
522   return;
523 }
524
525 #if DISABLED
526 /*-----------------------------------------------------------------*/
527 /* allDefsOutOfRange - all definitions are out of a range          */
528 /*-----------------------------------------------------------------*/
529 static bool
530 allDefsOutOfRange (bitVect * defs, int fseq, int toseq)
531 {
532   int i;
533
534   if (!defs)
535     return TRUE;
536
537   for (i = 0; i < defs->size; i++)
538     {
539       iCode *ic;
540
541       if (bitVectBitValue (defs, i) &&
542           (ic = hTabItemWithKey (iCodehTab, i)) &&
543           (ic->seq >= fseq && ic->seq <= toseq))
544
545         return FALSE;
546
547     }
548
549   return TRUE;
550 }
551
552 /*-----------------------------------------------------------------*/
553 /* hasSpilLocnoUptr - will return 1 if the symbol has spil location */
554 /*                    but is not used as a pointer                 */
555 /*-----------------------------------------------------------------*/
556 static int
557 hasSpilLocnoUptr (symbol * sym, eBBlock * ebp, iCode * ic)
558 {
559   return ((sym->usl.spillLoc && !sym->uptr) ? 1 : 0);
560 }
561
562 /*-----------------------------------------------------------------*/
563 /* notUsedInRemaining - not used or defined in remain of the block */
564 /*-----------------------------------------------------------------*/
565 static int
566 notUsedInRemaining (symbol * sym, eBBlock * ebp, iCode * ic)
567 {
568   return ((usedInRemaining (operandFromSymbol (sym), ic) ? 0 : 1) &&
569           allDefsOutOfRange (sym->defs, ebp->fSeq, ebp->lSeq));
570 }
571 #endif
572
573 /** Select a iTemp to spil : rather a simple procedure.
574  */
575 symbol *
576 selectSpil (iCode * ic, eBBlock * ebp, symbol * forSym)
577 {
578   bitVect *lrcs = NULL;
579   set *selectS;
580   symbol *sym;
581
582   D (D_ALLOC, ("selectSpil: finding spill for ic %p\n", ic));
583   /* get the spillable live ranges */
584   lrcs = computeSpillable (ic);
585
586   /* get all live ranges that are rematerizable */
587   if ((selectS = liveRangesWith (lrcs, rematable, ebp, ic)))
588     {
589       D (D_ALLOC, ("selectSpil: using remat.\n"));
590       /* return the least used of these */
591       return leastUsedLR (selectS);
592     }
593
594 #if 0
595   /* get live ranges with spillLocations in direct space */
596   if ((selectS = liveRangesWith (lrcs, directSpilLoc, ebp, ic)))
597     {
598       sym = leastUsedLR (selectS);
599       strcpy (sym->rname, (sym->usl.spillLoc->rname[0] ?
600                            sym->usl.spillLoc->rname :
601                            sym->usl.spillLoc->name));
602       sym->spildir = 1;
603       /* mark it as allocation required */
604       sym->usl.spillLoc->allocreq++;
605       return sym;
606     }
607
608   /* if the symbol is local to the block then */
609   if (forSym->liveTo < ebp->lSeq)
610     {
611
612       /* check if there are any live ranges allocated
613          to registers that are not used in this block */
614       if (!_G.blockSpil && (selectS = liveRangesWith (lrcs, notUsedInBlock, ebp, ic)))
615         {
616           sym = leastUsedLR (selectS);
617           /* if this is not rematerializable */
618           if (!sym->remat)
619             {
620               _G.blockSpil++;
621               wassertl (0, "Attempted to do an unsupported block spill");
622               sym->blockSpil = 1;
623             }
624           return sym;
625         }
626
627       /* check if there are any live ranges that not
628          used in the remainder of the block */
629       if (!_G.blockSpil && (selectS = liveRangesWith (lrcs, notUsedInRemaining, ebp, ic)))
630         {
631           sym = leastUsedLR (selectS);
632           if (sym != forSym)
633             {
634               if (!sym->remat)
635                 {
636                   wassertl (0, "Attempted to do an unsupported remain spill");
637                   sym->remainSpil = 1;
638                   _G.blockSpil++;
639                 }
640               return sym;
641             }
642         }
643     }
644   /* find live ranges with spillocation && not used as pointers */
645   if ((selectS = liveRangesWith (lrcs, hasSpilLocnoUptr, ebp, ic)))
646     {
647
648       sym = leastUsedLR (selectS);
649       /* mark this as allocation required */
650       sym->usl.spillLoc->allocreq++;
651       return sym;
652     }
653 #endif
654
655   /* find live ranges with spillocation */
656   if ((selectS = liveRangesWith (lrcs, hasSpilLoc, ebp, ic)))
657     {
658       D (D_ALLOC, ("selectSpil: using with spill.\n"));
659       sym = leastUsedLR (selectS);
660       sym->usl.spillLoc->allocreq++;
661       return sym;
662     }
663
664   /* couldn't find then we need to create a spil
665      location on the stack , for which one? the least
666      used ofcourse */
667   if ((selectS = liveRangesWith (lrcs, noSpilLoc, ebp, ic)))
668     {
669       D (D_ALLOC, ("selectSpil: creating new spill.\n"));
670       /* return a created spil location */
671       sym = createStackSpil (leastUsedLR (selectS));
672       sym->usl.spillLoc->allocreq++;
673       return sym;
674     }
675
676   /* this is an extreme situation we will spill
677      this one : happens very rarely but it does happen */
678   D (D_ALLOC, ("selectSpil: using spillThis.\n"));
679   spillThis (forSym);
680   return forSym;
681
682 }
683
684 /** Spil some variable & mark registers as free.
685     A spill occurs when an iTemp wont fit into the available registers.
686  */
687 bool 
688 spilSomething (iCode * ic, eBBlock * ebp, symbol * forSym)
689 {
690   symbol *ssym;
691   int i;
692
693   D (D_ALLOC, ("spilSomething: spilling on ic %p\n", ic));
694
695   /* get something we can spil */
696   ssym = selectSpil (ic, ebp, forSym);
697
698   /* mark it as spilt */
699   ssym->isspilt = ssym->spillA = 1;
700   _G.spiltSet = bitVectSetBit (_G.spiltSet, ssym->key);
701
702   /* mark it as not register assigned &
703      take it away from the set */
704   bitVectUnSetBit (_G.regAssigned, ssym->key);
705   bitVectUnSetBit (_G.totRegAssigned, ssym->key);
706
707   /* mark the registers as free */
708   for (i = 0; i < ssym->nRegs; i++)
709     if (ssym->regs[i])
710       freeReg (ssym->regs[i]);
711
712   wassertl (ssym->blockSpil == 0, "Encountered a sym with a block spill");
713   wassertl (ssym->remainSpil == 0, "Encountered a sym with a remain spill");
714 #if 0
715   /* if spilt on stack then free up r0 & r1 
716      if they could have been assigned to as gprs */
717   if (!ptrRegReq && isSpiltOnStack (ssym))
718     {
719       ptrRegReq++;
720       spillLRWithPtrReg (ssym);
721     }
722
723   /* if this was a block level spil then insert push & pop 
724      at the start & end of block respectively */
725   if (ssym->blockSpil)
726     {
727       iCode *nic = newiCode (IPUSH, operandFromSymbol (ssym), NULL);
728       /* add push to the start of the block */
729       addiCodeToeBBlock (ebp, nic, (ebp->sch->op == LABEL ?
730                                     ebp->sch->next : ebp->sch));
731       nic = newiCode (IPOP, operandFromSymbol (ssym), NULL);
732       /* add pop to the end of the block */
733       addiCodeToeBBlock (ebp, nic, NULL);
734     }
735
736   /* if spilt because not used in the remainder of the
737      block then add a push before this instruction and
738      a pop at the end of the block */
739   if (ssym->remainSpil)
740     {
741
742       iCode *nic = newiCode (IPUSH, operandFromSymbol (ssym), NULL);
743       /* add push just before this instruction */
744       addiCodeToeBBlock (ebp, nic, ic);
745
746       nic = newiCode (IPOP, operandFromSymbol (ssym), NULL);
747       /* add pop to the end of the block */
748       addiCodeToeBBlock (ebp, nic, NULL);
749     }
750 #endif
751
752   D (D_ALLOC, ("spilSomething: done.\n"));
753
754   if (ssym == forSym)
755     return FALSE;
756   else
757     return TRUE;
758 }
759
760 /** Will try for GPR if not spil.
761  */
762 regs *
763 getRegGpr (iCode * ic, eBBlock * ebp, symbol * sym)
764 {
765   regs *reg;
766   int j;
767
768   D (D_ALLOC, ("getRegGpr: on ic %p\n", ic));
769 tryAgain:
770   /* try for gpr type */
771   if ((reg = allocReg (REG_GPR)))
772     {
773       D (D_ALLOC, ("getRegGpr: got a reg.\n"));
774       return reg;
775     }
776
777   /* we have to spil */
778   if (!spilSomething (ic, ebp, sym))
779     {
780       D (D_ALLOC, ("getRegGpr: have to spill.\n"));
781       return NULL;
782     }
783   
784   /* make sure partially assigned registers aren't reused */
785   for (j=0; j<=sym->nRegs; j++)
786     if (sym->regs[j])
787       sym->regs[j]->isFree = 0;
788
789   /* this looks like an infinite loop but 
790      in really selectSpil will abort  */
791   goto tryAgain;
792 }
793
794 static regs *getRegGprNoSpil()
795 {
796   regs *reg;
797
798   /* try for gpr type */
799   if ((reg = allocReg (REG_GPR)))
800     {
801       D (D_ALLOC, ("getRegGprNoSpil: got a reg.\n"));
802       return reg;
803     }
804   assert(0);
805
806   /* just to make the compiler happy */
807   return 0;
808 }
809
810 /** Symbol has a given register.
811  */
812 static bool 
813 symHasReg (symbol * sym, regs * reg)
814 {
815   int i;
816
817   for (i = 0; i < sym->nRegs; i++)
818     if (sym->regs[i] == reg)
819       return TRUE;
820
821   return FALSE;
822 }
823
824 /** Check the live to and if they have registers & are not spilt then
825     free up the registers 
826 */
827 static void 
828 deassignLRs (iCode * ic, eBBlock * ebp)
829 {
830   symbol *sym;
831   int k;
832   symbol *result;
833
834   for (sym = hTabFirstItem (liveRanges, &k); sym;
835        sym = hTabNextItem (liveRanges, &k))
836     {
837
838       symbol *psym = NULL;
839       /* if it does not end here */
840       if (sym->liveTo > ic->seq)
841         continue;
842
843       /* if it was spilt on stack then we can 
844          mark the stack spil location as free */
845       if (sym->isspilt)
846         {
847           if (sym->stackSpil)
848             {
849               sym->usl.spillLoc->isFree = 1;
850               sym->stackSpil = 0;
851             }
852           continue;
853         }
854
855       if (!bitVectBitValue (_G.regAssigned, sym->key))
856         continue;
857
858       /* special case check if this is an IFX &
859          the privious one was a pop and the 
860          previous one was not spilt then keep track
861          of the symbol */
862       if (ic->op == IFX && ic->prev &&
863           ic->prev->op == IPOP &&
864           !ic->prev->parmPush &&
865           !OP_SYMBOL (IC_LEFT (ic->prev))->isspilt)
866         psym = OP_SYMBOL (IC_LEFT (ic->prev));
867
868       D (D_ALLOC, ("deassignLRs: in loop on sym %p nregs %u\n", sym, sym->nRegs));
869
870       if (sym->nRegs)
871         {
872           int i = 0;
873
874           bitVectUnSetBit (_G.regAssigned, sym->key);
875
876           /* if the result of this one needs registers
877              and does not have it then assign it right
878              away */
879           if (IC_RESULT (ic) &&
880               !(SKIP_IC2 (ic) ||        /* not a special icode */
881                 ic->op == JUMPTABLE ||
882                 ic->op == IFX ||
883                 ic->op == IPUSH ||
884                 ic->op == IPOP ||
885                 ic->op == RETURN) &&
886               (result = OP_SYMBOL (IC_RESULT (ic))) &&  /* has a result */
887               result->liveTo > ic->seq &&       /* and will live beyond this */
888               result->liveTo <= ebp->lSeq &&    /* does not go beyond this block */
889               result->liveFrom == ic->seq &&    /* does not start before here */
890               result->regType == sym->regType &&        /* same register types */
891               result->nRegs &&  /* which needs registers */
892               !result->isspilt &&       /* and does not already have them */
893               !result->remat &&
894               !bitVectBitValue (_G.regAssigned, result->key) &&
895           /* the number of free regs + number of regs in this LR
896              can accomodate the what result Needs */
897               ((nfreeRegsType (result->regType) +
898                 sym->nRegs) >= result->nRegs)
899             )
900             {
901               for (i = 0; i < result->nRegs; i++)
902                 {
903                   if (i < sym->nRegs)
904                     result->regs[i] = sym->regs[i];
905                   else
906                     result->regs[i] = getRegGpr (ic, ebp, result);
907
908                   /* if the allocation falied which means
909                      this was spilt then break */
910                   if (!result->regs[i])
911                     {
912                       wassert (0);
913                       assert (0);
914                       break;
915                     }
916                 }
917
918               _G.regAssigned = bitVectSetBit (_G.regAssigned, result->key);
919               _G.totRegAssigned = bitVectSetBit (_G.totRegAssigned, result->key);
920             }
921
922           /* free the remaining */
923           for (; i < sym->nRegs; i++)
924             {
925               if (psym)
926                 {
927                   if (!symHasReg (psym, sym->regs[i]))
928                     freeReg (sym->regs[i]);
929                 }
930               else
931                 freeReg (sym->regs[i]);
932               //              sym->regs[i] = NULL;
933             }
934         }
935     }
936 }
937
938
939 /** Reassign this to registers.
940  */
941 static void 
942 reassignLR (operand * op)
943 {
944   symbol *sym = OP_SYMBOL (op);
945   int i;
946
947   D (D_ALLOC, ("reassingLR: on sym %p\n", sym));
948
949   /* not spilt any more */
950   sym->isspilt = sym->spillA = sym->blockSpil = sym->remainSpil = 0;
951   bitVectUnSetBit (_G.spiltSet, sym->key);
952
953   _G.regAssigned = bitVectSetBit (_G.regAssigned, sym->key);
954   _G.totRegAssigned = bitVectSetBit (_G.totRegAssigned, sym->key);
955
956   _G.blockSpil--;
957
958   for (i = 0; i < sym->nRegs; i++)
959     sym->regs[i]->isFree = 0;
960 }
961
962 /** Determines if allocating will cause a spill.
963  */
964 static int 
965 willCauseSpill (int nr, int rt)
966 {
967   /* first check if there are any avlb registers
968      of te type required */
969   if (nFreeRegs (0) >= nr)
970     return 0;
971
972   /* it will cause a spil */
973   return 1;
974 }
975
976 /** The allocator can allocate same registers to result and operand,
977     if this happens make sure they are in the same position as the operand
978     otherwise chaos results.
979 */
980 static int
981 positionRegs (symbol * result, symbol * opsym)
982 {
983   int count = min (result->nRegs, opsym->nRegs);
984   int i, j = 0, shared = 0;
985   int change = 0;
986
987   D (D_ALLOC, ("positionRegs: on result %p opsum %p line %u\n", result, opsym, lineno));
988
989   /* if the result has been spilt then cannot share */
990   if (opsym->isspilt)
991     return 0;
992 again:
993   shared = 0;
994   /* first make sure that they actually share */
995   for (i = 0; i < count; i++)
996     {
997       for (j = 0; j < count; j++)
998         {
999           if (result->regs[i] == opsym->regs[j] && i != j)
1000             {
1001               shared = 1;
1002               goto xchgPositions;
1003             }
1004         }
1005     }
1006 xchgPositions:
1007   if (shared)
1008     {
1009       regs *tmp = result->regs[i];
1010       result->regs[i] = result->regs[j];
1011       result->regs[j] = tmp;
1012       change ++;
1013       goto again;
1014     }
1015   return change ;
1016 }
1017
1018 /** Try to allocate a pair of registers to the symbol.
1019  */
1020 bool 
1021 tryAllocatingRegPair (symbol * sym)
1022 {
1023   int i;
1024   wassert (sym->nRegs == 2);
1025   for (i = 0; i < _G.nRegs; i += 2)
1026     {
1027       if ((regsZ80[i].isFree) && (regsZ80[i + 1].isFree))
1028         {
1029           regsZ80[i].isFree = 0;
1030           sym->regs[0] = &regsZ80[i];
1031           regsZ80[i + 1].isFree = 0;
1032           sym->regs[1] = &regsZ80[i + 1];
1033           sym->regType = REG_PAIR;
1034
1035           if (currFunc)
1036             {
1037               currFunc->regsUsed =
1038                 bitVectSetBit (currFunc->regsUsed, i);
1039               currFunc->regsUsed =
1040                 bitVectSetBit (currFunc->regsUsed, i + 1);
1041             }
1042           D (D_ALLOC, ("tryAllocRegPair: succeded for sym %p\n", sym));
1043           return TRUE;
1044         }
1045     }
1046   D (D_ALLOC, ("tryAllocRegPair: failed on sym %p\n", sym));
1047   return FALSE;
1048 }
1049
1050 /*------------------------------------------------------------------*/
1051 /* verifyRegsAssigned - make sure an iTemp is properly initialized; */
1052 /* it should either have registers or have beed spilled. Otherwise, */
1053 /* there was an uninitialized variable, so just spill this to get   */
1054 /* the operand in a valid state.                                    */
1055 /*------------------------------------------------------------------*/
1056 static void
1057 verifyRegsAssigned (operand *op, iCode * ic)
1058 {
1059   symbol * sym;
1060   
1061   if (!op) return;
1062   if (!IS_ITEMP (op)) return;
1063   
1064   sym = OP_SYMBOL (op);
1065   if (sym->isspilt) return;
1066   if (!sym->nRegs) return;
1067   if (sym->regs[0]) return;
1068   
1069   werrorfl (ic->filename, ic->lineno, W_LOCAL_NOINIT, 
1070             sym->prereqv ? sym->prereqv->name : sym->name);
1071   spillThis (sym);
1072 }
1073
1074
1075 /** Serially allocate registers to the variables.
1076     This is the main register allocation function.  It is called after
1077     packing.
1078  */
1079 static void 
1080 serialRegAssign (eBBlock ** ebbs, int count)
1081 {
1082   int i;
1083
1084   /* for all blocks */
1085   for (i = 0; i < count; i++)
1086     {
1087
1088       iCode *ic;
1089
1090       if (ebbs[i]->noPath &&
1091           (ebbs[i]->entryLabel != entryLabel &&
1092            ebbs[i]->entryLabel != returnLabel))
1093         continue;
1094
1095       /* of all instructions do */
1096       for (ic = ebbs[i]->sch; ic; ic = ic->next)
1097         {
1098
1099           /* if this is an ipop that means some live
1100              range will have to be assigned again */
1101           if (ic->op == IPOP)
1102             {
1103               wassert (0);
1104               reassignLR (IC_LEFT (ic));
1105             }
1106
1107           /* if result is present && is a true symbol */
1108           if (IC_RESULT (ic) && ic->op != IFX &&
1109               IS_TRUE_SYMOP (IC_RESULT (ic)))
1110             OP_SYMBOL (IC_RESULT (ic))->allocreq++;
1111
1112           /* take away registers from live
1113              ranges that end at this instruction */
1114           deassignLRs (ic, ebbs[i]);
1115
1116           /* some don't need registers */
1117           /* MLH: removed RESULT and POINTER_SET condition */
1118           if (SKIP_IC2 (ic) ||
1119               ic->op == JUMPTABLE ||
1120               ic->op == IFX ||
1121               ic->op == IPUSH ||
1122               ic->op == IPOP)
1123             continue;
1124
1125           /* now we need to allocate registers only for the result */
1126           if (IC_RESULT (ic))
1127             {
1128               symbol *sym = OP_SYMBOL (IC_RESULT (ic));
1129               bitVect *spillable;
1130               int willCS;
1131               int j;
1132
1133               D (D_ALLOC, ("serialRegAssign: in loop on result %p\n", sym));
1134
1135               /* if it does not need or is spilt 
1136                  or is already assigned to registers
1137                  or will not live beyond this instructions */
1138               if (!sym->nRegs ||
1139                   sym->isspilt ||
1140                   bitVectBitValue (_G.regAssigned, sym->key) ||
1141                   sym->liveTo <= ic->seq)
1142                 {
1143                   D (D_ALLOC, ("serialRegAssign: wont live long enough.\n"));
1144                   continue;
1145                 }
1146
1147               /* if some liverange has been spilt at the block level
1148                  and this one live beyond this block then spil this
1149                  to be safe */
1150               if (_G.blockSpil && sym->liveTo > ebbs[i]->lSeq)
1151                 {
1152                   D (D_ALLOC, ("serialRegAssign: \"spilling to be safe.\"\n"));
1153                   spillThis (sym);
1154                   continue;
1155                 }
1156               /* if trying to allocate this will cause
1157                  a spill and there is nothing to spill 
1158                  or this one is rematerializable then
1159                  spill this one */
1160               willCS = willCauseSpill (sym->nRegs, sym->regType);
1161               spillable = computeSpillable (ic);
1162               if (sym->remat ||
1163                   (willCS && bitVectIsZero (spillable)))
1164                 {
1165
1166                   D (D_ALLOC, ("serialRegAssign: \"remat spill\"\n"));
1167                   spillThis (sym);
1168                   continue;
1169
1170                 }
1171
1172               /* If the live range preceeds the point of definition 
1173                  then ideally we must take into account registers that 
1174                  have been allocated after sym->liveFrom but freed
1175                  before ic->seq. This is complicated, so spill this
1176                  symbol instead and let fillGaps handle the allocation. */
1177               if (sym->liveFrom < ic->seq)
1178                 {
1179                     spillThis (sym);
1180                     continue;                 
1181                 }
1182
1183               /* if it has a spillocation & is used less than
1184                  all other live ranges then spill this */
1185               if (willCS) {
1186                       if (sym->usl.spillLoc) {
1187                               symbol *leastUsed = leastUsedLR (liveRangesWith (spillable,
1188                                                                                allLRs, ebbs[i], ic));
1189                               if (leastUsed && leastUsed->used > sym->used) {
1190                                       spillThis (sym);
1191                                       continue;
1192                               }
1193                       } else {
1194                               /* if none of the liveRanges have a spillLocation then better
1195                                  to spill this one than anything else already assigned to registers */
1196                               if (liveRangesWith(spillable,noSpilLoc,ebbs[i],ic)) {
1197                                   /* if this is local to this block then we might find a block spil */
1198                                   if (!(sym->liveFrom >= ebbs[i]->fSeq && sym->liveTo <= ebbs[i]->lSeq)) {
1199                                       spillThis (sym);
1200                                       continue;
1201                                   }
1202                               }
1203                       }
1204               }
1205
1206               /* else we assign registers to it */
1207               _G.regAssigned = bitVectSetBit (_G.regAssigned, sym->key);
1208               _G.totRegAssigned = bitVectSetBit (_G.totRegAssigned, sym->key);
1209
1210               /* Special case:  Try to fit into a reg pair if
1211                  available */
1212               D (D_ALLOC, ("serialRegAssign: actually allocing regs!\n"));
1213               if ((sym->nRegs == 2) && tryAllocatingRegPair (sym))
1214                 {
1215                 }
1216               else
1217                 {
1218                   for (j = 0; j < sym->nRegs; j++)
1219                     {
1220                       sym->regs[j] = getRegGpr (ic, ebbs[i], sym);
1221
1222                       /* if the allocation falied which means
1223                          this was spilt then break */
1224                       if (!sym->regs[j])
1225                         {
1226                           D (D_ALLOC, ("Couldnt alloc (spill)\n"))
1227                             break;
1228                         }
1229                     }
1230                 }
1231               /* if it shares registers with operands make sure
1232                  that they are in the same position */
1233               if (IC_LEFT (ic) && IS_SYMOP (IC_LEFT (ic)) &&
1234                   OP_SYMBOL (IC_LEFT (ic))->nRegs && ic->op != '=')
1235                 positionRegs (OP_SYMBOL (IC_RESULT (ic)),
1236                               OP_SYMBOL (IC_LEFT (ic)));
1237               /* do the same for the right operand */
1238               if (IC_RIGHT (ic) && IS_SYMOP (IC_RIGHT (ic)) &&
1239                   OP_SYMBOL (IC_RIGHT (ic))->nRegs)
1240                 positionRegs (OP_SYMBOL (IC_RESULT (ic)),
1241                               OP_SYMBOL (IC_RIGHT (ic)));
1242
1243             }
1244         }
1245     }
1246
1247     /* Check for and fix any problems with uninitialized operands */
1248     for (i = 0; i < count; i++)
1249       {
1250         iCode *ic;
1251
1252         if (ebbs[i]->noPath &&
1253             (ebbs[i]->entryLabel != entryLabel &&
1254              ebbs[i]->entryLabel != returnLabel))
1255             continue;
1256
1257         for (ic = ebbs[i]->sch; ic; ic = ic->next)
1258           {
1259             if (SKIP_IC2 (ic))
1260               continue;
1261
1262             if (ic->op == IFX)
1263               {
1264                 verifyRegsAssigned (IC_COND (ic), ic);
1265                 continue;
1266               }
1267
1268             if (ic->op == JUMPTABLE)
1269               {
1270                 verifyRegsAssigned (IC_JTCOND (ic), ic);
1271                 continue;
1272               }
1273
1274             verifyRegsAssigned (IC_RESULT (ic), ic);
1275             verifyRegsAssigned (IC_LEFT (ic), ic);
1276             verifyRegsAssigned (IC_RIGHT (ic), ic);
1277           }
1278       }    
1279
1280 }
1281
1282 /*-----------------------------------------------------------------*/
1283 /* fillGaps - Try to fill in the Gaps left by Pass1                */
1284 /*-----------------------------------------------------------------*/
1285 static void fillGaps()
1286 {
1287     symbol *sym =NULL;
1288     int key =0;    
1289     
1290     if (getenv("DISABLE_FILL_GAPS")) return;
1291     
1292     /* look for livernages that was spilt by the allocator */
1293     for (sym = hTabFirstItem(liveRanges,&key) ; sym ; 
1294          sym = hTabNextItem(liveRanges,&key)) {
1295
1296         int i;
1297         int pdone = 0;
1298
1299         if (!sym->spillA || !sym->clashes || sym->remat) continue ;
1300
1301         /* find the liveRanges this one clashes with, that are
1302            still assigned to registers & mark the registers as used*/
1303         for ( i = 0 ; i < sym->clashes->size ; i ++) {
1304             int k;
1305             symbol *clr;
1306
1307             if (bitVectBitValue(sym->clashes,i) == 0 ||    /* those that clash with this */
1308                 bitVectBitValue(_G.totRegAssigned,i) == 0) /* and are still assigned to registers */
1309                 continue ;
1310
1311             clr = hTabItemWithKey(liveRanges,i);
1312             assert(clr);
1313          
1314             /* mark these registers as used */
1315             for (k = 0 ; k < clr->nRegs ; k++ ) 
1316                 useReg(clr->regs[k]);
1317         }
1318
1319         if (willCauseSpill(sym->nRegs,sym->regType)) {
1320             /* NOPE :( clear all registers & and continue */
1321             freeAllRegs();
1322             continue ;
1323         }
1324
1325         /* THERE IS HOPE !!!! */
1326         for (i=0; i < sym->nRegs ; i++ ) {
1327                 sym->regs[i] = getRegGprNoSpil ();                
1328         }
1329
1330         /* for all its definitions check if the registers
1331            allocated needs positioning NOTE: we can position
1332            only ONCE if more than One positioning required 
1333            then give up */
1334         sym->isspilt = 0;
1335         for (i = 0 ; i < sym->defs->size ; i++ ) {
1336             if (bitVectBitValue(sym->defs,i)) {
1337                 iCode *ic;
1338                 if (!(ic = hTabItemWithKey(iCodehTab,i))) continue ;
1339                 if (SKIP_IC(ic)) continue;
1340                 assert(isSymbolEqual(sym,OP_SYMBOL(IC_RESULT(ic)))); /* just making sure */
1341                 /* if left is assigned to registers */
1342                 if (IS_SYMOP(IC_LEFT(ic)) && 
1343                     bitVectBitValue(_G.totRegAssigned,OP_SYMBOL(IC_LEFT(ic))->key)) {
1344                     pdone += positionRegs(sym,OP_SYMBOL(IC_LEFT(ic)));
1345                 }
1346                 if (IS_SYMOP(IC_RIGHT(ic)) && 
1347                     bitVectBitValue(_G.totRegAssigned,OP_SYMBOL(IC_RIGHT(ic))->key)) {
1348                     pdone += positionRegs(sym,OP_SYMBOL(IC_RIGHT(ic)));
1349                 }
1350                 if (pdone > 1) break;
1351             }
1352         }
1353         for (i = 0 ; i < sym->uses->size ; i++ ) {
1354             if (bitVectBitValue(sym->uses,i)) {
1355                 iCode *ic;
1356                 if (!(ic = hTabItemWithKey(iCodehTab,i))) continue ;
1357                 if (SKIP_IC(ic)) continue;
1358                 if (!IS_ASSIGN_ICODE(ic)) continue ;
1359
1360                 /* if result is assigned to registers */
1361                 if (IS_SYMOP(IC_RESULT(ic)) && 
1362                     bitVectBitValue(_G.totRegAssigned,OP_SYMBOL(IC_RESULT(ic))->key)) {
1363                     pdone += positionRegs(sym,OP_SYMBOL(IC_RESULT(ic)));
1364                 }
1365                 if (pdone > 1) break;
1366             }
1367         }
1368         /* had to position more than once GIVE UP */
1369         if (pdone > 1) {
1370             /* UNDO all the changes we made to try this */
1371             sym->isspilt = 1;
1372             for (i=0; i < sym->nRegs ; i++ ) {
1373                 sym->regs[i] = NULL;
1374             }
1375             freeAllRegs();
1376             D(D_FILL_GAPS,("Fill Gap gave up due to positioning for %s in function %s\n",sym->name, currFunc ? currFunc->name : "UNKNOWN"));
1377             continue ;      
1378         }
1379         D(D_FILL_GAPS,("FILLED GAP for %s in function %s\n",sym->name, currFunc ? currFunc->name : "UNKNOWN"));
1380         _G.totRegAssigned = bitVectSetBit(_G.totRegAssigned,sym->key);
1381         sym->isspilt = sym->spillA = 0 ;
1382         sym->usl.spillLoc->allocreq--;
1383         freeAllRegs();
1384     }
1385 }
1386
1387 /*-----------------------------------------------------------------*/
1388 /* rUmaskForOp :- returns register mask for an operand             */
1389 /*-----------------------------------------------------------------*/
1390 bitVect *
1391 rUmaskForOp (operand * op)
1392 {
1393   bitVect *rumask;
1394   symbol *sym;
1395   int j;
1396
1397   /* only temporaries are assigned registers */
1398   if (!IS_ITEMP (op))
1399     return NULL;
1400
1401   sym = OP_SYMBOL (op);
1402
1403   /* if spilt or no registers assigned to it
1404      then nothing */
1405   if (sym->isspilt || !sym->nRegs)
1406     return NULL;
1407
1408   rumask = newBitVect (_G.nRegs);
1409
1410   for (j = 0; j < sym->nRegs; j++)
1411     {
1412       rumask = bitVectSetBit (rumask, sym->regs[j]->rIdx);
1413     }
1414
1415   return rumask;
1416 }
1417
1418 bitVect *
1419 z80_rUmaskForOp (operand * op)
1420 {
1421   return rUmaskForOp (op);
1422 }
1423
1424 /** Returns bit vector of registers used in iCode.
1425  */
1426 bitVect *
1427 regsUsedIniCode (iCode * ic)
1428 {
1429   bitVect *rmask = newBitVect (_G.nRegs);
1430
1431   /* do the special cases first */
1432   if (ic->op == IFX)
1433     {
1434       rmask = bitVectUnion (rmask,
1435                             rUmaskForOp (IC_COND (ic)));
1436       goto ret;
1437     }
1438
1439   /* for the jumptable */
1440   if (ic->op == JUMPTABLE)
1441     {
1442       rmask = bitVectUnion (rmask,
1443                             rUmaskForOp (IC_JTCOND (ic)));
1444
1445       goto ret;
1446     }
1447
1448   /* of all other cases */
1449   if (IC_LEFT (ic))
1450     rmask = bitVectUnion (rmask,
1451                           rUmaskForOp (IC_LEFT (ic)));
1452
1453
1454   if (IC_RIGHT (ic))
1455     rmask = bitVectUnion (rmask,
1456                           rUmaskForOp (IC_RIGHT (ic)));
1457
1458   if (IC_RESULT (ic))
1459     rmask = bitVectUnion (rmask,
1460                           rUmaskForOp (IC_RESULT (ic)));
1461
1462 ret:
1463   return rmask;
1464 }
1465
1466 /** For each instruction will determine the regsUsed.
1467  */
1468 static void 
1469 createRegMask (eBBlock ** ebbs, int count)
1470 {
1471   int i;
1472
1473   /* for all blocks */
1474   for (i = 0; i < count; i++)
1475     {
1476       iCode *ic;
1477
1478       if (ebbs[i]->noPath &&
1479           (ebbs[i]->entryLabel != entryLabel &&
1480            ebbs[i]->entryLabel != returnLabel))
1481         continue;
1482
1483       /* for all instructions */
1484       for (ic = ebbs[i]->sch; ic; ic = ic->next)
1485         {
1486
1487           int j;
1488
1489           if (SKIP_IC2 (ic) || !ic->rlive)
1490             continue;
1491
1492           /* first mark the registers used in this
1493              instruction */
1494           ic->rUsed = regsUsedIniCode (ic);
1495           _G.funcrUsed = bitVectUnion (_G.funcrUsed, ic->rUsed);
1496
1497           /* now create the register mask for those 
1498              registers that are in use : this is a
1499              super set of ic->rUsed */
1500           ic->rMask = newBitVect (_G.nRegs + 1);
1501
1502           /* for all live Ranges alive at this point */
1503           for (j = 1; j < ic->rlive->size; j++)
1504             {
1505               symbol *sym;
1506               int k;
1507
1508               /* if not alive then continue */
1509               if (!bitVectBitValue (ic->rlive, j))
1510                 continue;
1511
1512               /* find the live range we are interested in */
1513               if (!(sym = hTabItemWithKey (liveRanges, j)))
1514                 {
1515                   werror (E_INTERNAL_ERROR, __FILE__, __LINE__,
1516                           "createRegMask cannot find live range");
1517                   exit (0);
1518                 }
1519
1520               /* if no register assigned to it */
1521               if (!sym->nRegs || sym->isspilt)
1522                 continue;
1523
1524               /* for all the registers allocated to it */
1525               for (k = 0; k < sym->nRegs; k++)
1526                 if (sym->regs[k])
1527                   ic->rMask =
1528                     bitVectSetBit (ic->rMask, sym->regs[k]->rIdx);
1529             }
1530         }
1531     }
1532 }
1533
1534 /** Returns the rematerialized string for a remat var.
1535  */
1536 char *
1537 rematStr (symbol * sym)
1538 {
1539   char *s = buffer;
1540   iCode *ic = sym->rematiCode;
1541
1542   while (1)
1543     {
1544
1545       /* if plus or minus print the right hand side */
1546       if (ic->op == '+' || ic->op == '-')
1547         {
1548           sprintf (s, "0x%04x %c ", (int) operandLitValue (IC_RIGHT (ic)),
1549                    ic->op);
1550           s += strlen (s);
1551           ic = OP_SYMBOL (IC_LEFT (ic))->rematiCode;
1552           continue;
1553         }
1554       /* we reached the end */
1555       sprintf (s, "%s", OP_SYMBOL (IC_LEFT (ic))->rname);
1556       break;
1557     }
1558
1559   return buffer;
1560 }
1561
1562 /*-----------------------------------------------------------------*/
1563 /* regTypeNum - computes the type & number of registers required   */
1564 /*-----------------------------------------------------------------*/
1565 static void 
1566 regTypeNum (void)
1567 {
1568   symbol *sym;
1569   int k;
1570
1571   /* for each live range do */
1572   for (sym = hTabFirstItem (liveRanges, &k); sym;
1573        sym = hTabNextItem (liveRanges, &k))
1574     {
1575
1576       /* if used zero times then no registers needed */
1577       if ((sym->liveTo - sym->liveFrom) == 0)
1578         continue;
1579
1580       D (D_ALLOC, ("regTypeNum: loop on sym %p\n", sym));
1581
1582       /* if the live range is a temporary */
1583       if (sym->isitmp)
1584         {
1585
1586           /* if the type is marked as a conditional */
1587           if (sym->regType == REG_CND)
1588             continue;
1589
1590           /* if used in return only then we don't 
1591              need registers */
1592           if (sym->ruonly || sym->accuse)
1593             {
1594               if (IS_AGGREGATE (sym->type) || sym->isptr)
1595                 sym->type = aggrToPtr (sym->type, FALSE);
1596               continue;
1597             }
1598
1599           /* if not then we require registers */
1600           D (D_ALLOC, ("regTypeNum: isagg %u nRegs %u type %p\n", IS_AGGREGATE (sym->type) || sym->isptr, sym->nRegs, sym->type));
1601           sym->nRegs = ((IS_AGGREGATE (sym->type) || sym->isptr) ?
1602                         getSize (sym->type = aggrToPtr (sym->type, FALSE)) :
1603                         getSize (sym->type));
1604           D (D_ALLOC, ("regTypeNum: setting nRegs of %s (%p) to %u\n", sym->name, sym, sym->nRegs));
1605
1606           D (D_ALLOC, ("regTypeNum: setup to assign regs sym %p\n", sym));
1607
1608           if (sym->nRegs > 4)
1609             {
1610               fprintf (stderr, "allocated more than 4 or 0 registers for type ");
1611               printTypeChain (sym->type, stderr);
1612               fprintf (stderr, "\n");
1613             }
1614
1615           /* determine the type of register required */
1616           /* Always general purpose */
1617           sym->regType = REG_GPR;
1618
1619         }
1620       else
1621         {
1622           /* for the first run we don't provide */
1623           /* registers for true symbols we will */
1624           /* see how things go                  */
1625           D (D_ALLOC, ("regTypeNum: #2 setting num of %p to 0\n", sym));
1626           sym->nRegs = 0;
1627         }
1628     }
1629
1630 }
1631
1632 /** Mark all registers as free.
1633  */
1634 static void 
1635 freeAllRegs ()
1636 {
1637   int i;
1638
1639   D (D_ALLOC, ("freeAllRegs: running.\n"));
1640
1641   for (i = 0; i < _G.nRegs; i++)
1642     regsZ80[i].isFree = 1;
1643 }
1644
1645 /*-----------------------------------------------------------------*/
1646 /* deallocStackSpil - this will set the stack pointer back         */
1647 /*-----------------------------------------------------------------*/
1648 DEFSETFUNC (deallocStackSpil)
1649 {
1650   symbol *sym = item;
1651
1652   deallocLocal (sym);
1653   return 0;
1654 }
1655
1656 /** Register reduction for assignment.
1657  */
1658 static int 
1659 packRegsForAssign (iCode * ic, eBBlock * ebp)
1660 {
1661   iCode *dic, *sic;
1662
1663   D (D_ALLOC, ("packRegsForAssign: running on ic %p\n", ic));
1664
1665   if (!IS_ITEMP (IC_RIGHT (ic)) ||
1666       OP_SYMBOL (IC_RIGHT (ic))->isind ||
1667       OP_LIVETO (IC_RIGHT (ic)) > ic->seq)
1668     {
1669       return 0;
1670     }
1671
1672   /* find the definition of iTempNN scanning backwards if we find a 
1673      a use of the true symbol in before we find the definition then 
1674      we cannot */
1675   for (dic = ic->prev; dic; dic = dic->prev)
1676     {
1677       /* PENDING: Don't pack across function calls. */
1678       if (dic->op == CALL || dic->op == PCALL)
1679         {
1680           dic = NULL;
1681           break;
1682         }
1683
1684       if (SKIP_IC2 (dic))
1685         continue;
1686
1687       if (IS_SYMOP (IC_RESULT (dic)) &&
1688           IC_RESULT (dic)->key == IC_RIGHT (ic)->key)
1689         {
1690           break;
1691         }
1692
1693       if (IS_SYMOP (IC_RIGHT (dic)) &&
1694           (IC_RIGHT (dic)->key == IC_RESULT (ic)->key ||
1695            IC_RIGHT (dic)->key == IC_RIGHT (ic)->key))
1696         {
1697           dic = NULL;
1698           break;
1699         }
1700
1701       if (IS_SYMOP (IC_LEFT (dic)) &&
1702           (IC_LEFT (dic)->key == IC_RESULT (ic)->key ||
1703            IC_LEFT (dic)->key == IC_RIGHT (ic)->key))
1704         {
1705           dic = NULL;
1706           break;
1707         }
1708     }
1709
1710   if (!dic)
1711     return 0;                   /* did not find */
1712
1713   /* if the result is on stack or iaccess then it must be
1714      the same atleast one of the operands */
1715   if (OP_SYMBOL (IC_RESULT (ic))->onStack ||
1716       OP_SYMBOL (IC_RESULT (ic))->iaccess)
1717     {
1718       /* the operation has only one symbol
1719          operator then we can pack */
1720       if ((IC_LEFT (dic) && !IS_SYMOP (IC_LEFT (dic))) ||
1721           (IC_RIGHT (dic) && !IS_SYMOP (IC_RIGHT (dic))))
1722         goto pack;
1723
1724       if (!((IC_LEFT (dic) &&
1725              IC_RESULT (ic)->key == IC_LEFT (dic)->key) ||
1726             (IC_RIGHT (dic) &&
1727              IC_RESULT (ic)->key == IC_RIGHT (dic)->key)))
1728         return 0;
1729     }
1730 pack:
1731   /* found the definition */
1732   /* replace the result with the result of */
1733   /* this assignment and remove this assignment */
1734   bitVectUnSetBit(OP_SYMBOL(IC_RESULT(dic))->defs,dic->key);
1735   IC_RESULT (dic) = IC_RESULT (ic);
1736
1737   if (IS_ITEMP (IC_RESULT (dic)) && OP_SYMBOL (IC_RESULT (dic))->liveFrom > dic->seq)
1738     {
1739       OP_SYMBOL (IC_RESULT (dic))->liveFrom = dic->seq;
1740     }
1741   /* delete from liverange table also 
1742      delete from all the points inbetween and the new
1743      one */
1744   for (sic = dic; sic != ic; sic = sic->next)
1745     {
1746       bitVectUnSetBit (sic->rlive, IC_RESULT (ic)->key);
1747       if (IS_ITEMP (IC_RESULT (dic)))
1748         bitVectSetBit (sic->rlive, IC_RESULT (dic)->key);
1749     }
1750
1751   remiCodeFromeBBlock (ebp, ic);
1752   // PENDING: Check vs mcs51
1753   bitVectUnSetBit(OP_SYMBOL(IC_RESULT(ic))->defs,ic->key);
1754   hTabDeleteItem (&iCodehTab, ic->key, ic, DELETE_ITEM, NULL);
1755   OP_DEFS(IC_RESULT (dic))=bitVectSetBit (OP_DEFS (IC_RESULT (dic)), dic->key);
1756   return 1;
1757 }
1758
1759 /** Scanning backwards looks for first assig found.
1760  */
1761 iCode *
1762 findAssignToSym (operand * op, iCode * ic)
1763 {
1764   iCode *dic;
1765
1766   for (dic = ic->prev; dic; dic = dic->prev)
1767     {
1768
1769       /* if definition by assignment */
1770       if (dic->op == '=' &&
1771           !POINTER_SET (dic) &&
1772           IC_RESULT (dic)->key == op->key)
1773         /*      &&  IS_TRUE_SYMOP(IC_RIGHT(dic)) */
1774         {
1775
1776           /* we are interested only if defined in far space */
1777           /* or in stack space in case of + & - */
1778
1779           /* if assigned to a non-symbol then return
1780              true */
1781           if (!IS_SYMOP (IC_RIGHT (dic)))
1782             break;
1783
1784           /* if the symbol is in far space then
1785              we should not */
1786           if (isOperandInFarSpace (IC_RIGHT (dic)))
1787             return NULL;
1788
1789           /* for + & - operations make sure that
1790              if it is on the stack it is the same
1791              as one of the three operands */
1792           if ((ic->op == '+' || ic->op == '-') &&
1793               OP_SYMBOL (IC_RIGHT (dic))->onStack)
1794             {
1795
1796               if (IC_RESULT (ic)->key != IC_RIGHT (dic)->key &&
1797                   IC_LEFT (ic)->key != IC_RIGHT (dic)->key &&
1798                   IC_RIGHT (ic)->key != IC_RIGHT (dic)->key)
1799                 return NULL;
1800             }
1801
1802           break;
1803
1804         }
1805
1806       /* if we find an usage then we cannot delete it */
1807       if (IC_LEFT (dic) && IC_LEFT (dic)->key == op->key)
1808         return NULL;
1809
1810       if (IC_RIGHT (dic) && IC_RIGHT (dic)->key == op->key)
1811         return NULL;
1812
1813       if (POINTER_SET (dic) && IC_RESULT (dic)->key == op->key)
1814         return NULL;
1815     }
1816
1817   /* now make sure that the right side of dic
1818      is not defined between ic & dic */
1819   if (dic)
1820     {
1821       iCode *sic = dic->next;
1822
1823       for (; sic != ic; sic = sic->next)
1824         if (IC_RESULT (sic) &&
1825             IC_RESULT (sic)->key == IC_RIGHT (dic)->key)
1826           return NULL;
1827     }
1828
1829   return dic;
1830
1831
1832 }
1833
1834 #if !DISABLE_PACKREGSFORSUPPORT
1835 // PENDING
1836
1837 /*-----------------------------------------------------------------*/
1838 /* packRegsForSupport :- reduce some registers for support calls   */
1839 /*-----------------------------------------------------------------*/
1840 static int 
1841 packRegsForSupport (iCode * ic, eBBlock * ebp)
1842 {
1843   int change = 0;
1844   /* for the left & right operand :- look to see if the
1845      left was assigned a true symbol in far space in that
1846      case replace them */
1847   D (D_ALLOC, ("packRegsForSupport: running on ic %p\n", ic));
1848
1849   if (IS_ITEMP (IC_LEFT (ic)) &&
1850       OP_SYMBOL (IC_LEFT (ic))->liveTo <= ic->seq)
1851     {
1852       iCode *dic = findAssignToSym (IC_LEFT (ic), ic);
1853       iCode *sic;
1854
1855       if (!dic)
1856         goto right;
1857
1858       /* found it we need to remove it from the
1859          block */
1860       for (sic = dic; sic != ic; sic = sic->next)
1861         bitVectUnSetBit (sic->rlive, IC_LEFT (ic)->key);
1862
1863       IC_LEFT (ic)->operand.symOperand =
1864         IC_RIGHT (dic)->operand.symOperand;
1865       IC_LEFT (ic)->key = IC_RIGHT (dic)->operand.symOperand->key;
1866       remiCodeFromeBBlock (ebp, dic);
1867       bitVectUnSetBit(OP_SYMBOL(IC_RESULT(dic))->defs,dic->key);
1868       hTabDeleteItem (&iCodehTab, dic->key, dic, DELETE_ITEM, NULL);
1869       // PENDING: Check vs mcs51
1870       change++;
1871     }
1872
1873   /* do the same for the right operand */
1874 right:
1875   if (!change &&
1876       IS_ITEMP (IC_RIGHT (ic)) &&
1877       OP_SYMBOL (IC_RIGHT (ic))->liveTo <= ic->seq)
1878     {
1879       iCode *dic = findAssignToSym (IC_RIGHT (ic), ic);
1880       iCode *sic;
1881
1882       if (!dic)
1883         return change;
1884
1885       /* found it we need to remove it from the block */
1886       for (sic = dic; sic != ic; sic = sic->next)
1887         bitVectUnSetBit (sic->rlive, IC_RIGHT (ic)->key);
1888
1889       IC_RIGHT (ic)->operand.symOperand =
1890         IC_RIGHT (dic)->operand.symOperand;
1891       IC_RIGHT (ic)->key = IC_RIGHT (dic)->operand.symOperand->key;
1892
1893       remiCodeFromeBBlock (ebp, dic);
1894       bitVectUnSetBit(OP_SYMBOL(IC_RESULT(dic))->defs,dic->key);
1895       hTabDeleteItem (&iCodehTab, dic->key, dic, DELETE_ITEM, NULL);
1896       // PENDING: vs mcs51
1897       change++;
1898     }
1899
1900   return change;
1901 }
1902 #endif
1903
1904 #define IS_OP_RUONLY(x) (x && IS_SYMOP(x) && OP_SYMBOL(x)->ruonly)
1905
1906 /** Will reduce some registers for single use.
1907  */
1908 static iCode *
1909 packRegsForOneuse (iCode * ic, operand * op, eBBlock * ebp)
1910 {
1911   bitVect *uses;
1912   iCode *dic, *sic;
1913
1914   // PENDING: Disable
1915   D (D_ALLOC, ("packRegsForOneUse: running on ic %p\n", ic));
1916
1917   /* if returning a literal then do nothing */
1918   if (!IS_SYMOP (op))
1919     return NULL;
1920
1921   /* only upto 2 bytes since we cannot predict
1922      the usage of b, & acc */
1923   if (getSize (operandType (op)) > 2)
1924     return NULL;
1925
1926   if (ic->op != RETURN &&
1927       ic->op != SEND)
1928     return NULL;
1929
1930   /* this routine will mark the a symbol as used in one 
1931      instruction use only && if the defintion is local 
1932      (ie. within the basic block) && has only one definition &&
1933      that definiion is either a return value from a 
1934      function or does not contain any variables in
1935      far space */
1936   uses = bitVectCopy (OP_USES (op));
1937   bitVectUnSetBit (uses, ic->key);      /* take away this iCode */
1938   if (!bitVectIsZero (uses))    /* has other uses */
1939     return NULL;
1940
1941   /* if it has only one defintion */
1942   if (bitVectnBitsOn (OP_DEFS (op)) > 1)
1943     return NULL;                /* has more than one definition */
1944
1945   /* get the that definition */
1946   if (!(dic =
1947         hTabItemWithKey (iCodehTab,
1948                          bitVectFirstBit (OP_DEFS (op)))))
1949     return NULL;
1950
1951   /* found the definition now check if it is local */
1952   if (dic->seq < ebp->fSeq ||
1953       dic->seq > ebp->lSeq)
1954     return NULL;                /* non-local */
1955
1956   /* now check if it is the return from a function call */
1957   if (dic->op == CALL || dic->op == PCALL)
1958     {
1959       if (ic->op != SEND && ic->op != RETURN &&
1960           !POINTER_SET(ic) && !POINTER_GET(ic))
1961         {
1962           OP_SYMBOL (op)->ruonly = 1;
1963           return dic;
1964         }
1965       dic = dic->next;
1966     }
1967
1968   /* otherwise check that the definition does
1969      not contain any symbols in far space */
1970   if (isOperandInFarSpace (IC_LEFT (dic)) ||
1971       isOperandInFarSpace (IC_RIGHT (dic)) ||
1972       IS_OP_RUONLY (IC_LEFT (ic)) ||
1973       IS_OP_RUONLY (IC_RIGHT (ic)))
1974     {
1975       return NULL;
1976     }
1977
1978   /* if pointer set then make sure the pointer is one byte */
1979   if (POINTER_SET (dic))
1980     return NULL;
1981
1982   if (POINTER_GET (dic))
1983     return NULL;
1984
1985   sic = dic;
1986
1987   /* also make sure the intervenening instructions
1988      don't have any thing in far space */
1989   for (dic = dic->next; dic && dic != ic; dic = dic->next)
1990     {
1991       /* if there is an intervening function call then no */
1992       if (dic->op == CALL || dic->op == PCALL)
1993         return NULL;
1994       /* if pointer set then make sure the pointer
1995          is one byte */
1996       if (POINTER_SET (dic))
1997         return NULL;
1998
1999       if (POINTER_GET (dic))
2000         return NULL;
2001
2002       /* if address of & the result is remat the okay */
2003       if (dic->op == ADDRESS_OF &&
2004           OP_SYMBOL (IC_RESULT (dic))->remat)
2005         continue;
2006
2007       /* if left or right or result is in far space */
2008       if (isOperandInFarSpace (IC_LEFT (dic)) ||
2009           isOperandInFarSpace (IC_RIGHT (dic)) ||
2010           isOperandInFarSpace (IC_RESULT (dic)) ||
2011           IS_OP_RUONLY (IC_LEFT (dic)) ||
2012           IS_OP_RUONLY (IC_RIGHT (dic)) ||
2013           IS_OP_RUONLY (IC_RESULT (dic)))
2014         {
2015           return NULL;
2016         }
2017     }
2018
2019   OP_SYMBOL (op)->ruonly = 1;
2020   return sic;
2021 }
2022
2023 /*-----------------------------------------------------------------*/
2024 /* isBitwiseOptimizable - requirements of JEAN LOUIS VERN          */
2025 /*-----------------------------------------------------------------*/
2026 static bool 
2027 isBitwiseOptimizable (iCode * ic)
2028 {
2029   sym_link *rtype = getSpec (operandType (IC_RIGHT (ic)));
2030
2031   /* bitwise operations are considered optimizable
2032      under the following conditions (Jean-Louis VERN) 
2033
2034      x & lit
2035      bit & bit
2036      bit & x
2037      bit ^ bit
2038      bit ^ x
2039      x   ^ lit
2040      x   | lit
2041      bit | bit
2042      bit | x
2043    */
2044   if (IS_LITERAL (rtype))
2045     return TRUE;
2046   return FALSE;
2047 }
2048
2049 /** Optimisations:
2050     Certian assignments involving pointers can be temporarly stored
2051     in HL.  Esp.
2052 genAssign
2053     ld  iy,#_Blah
2054     ld  bc,(iy)
2055 genAssign (ptr)
2056     ld  hl,bc
2057     ld  iy,#_Blah2
2058     ld  (iy),(hl)
2059 */
2060
2061 #if !DISABLE_PACKREGSFORACCUSE
2062 // PENDING
2063
2064 /** Pack registers for acc use.
2065     When the result of this operation is small and short lived it may
2066     be able to be stored in the accumelator.
2067  */
2068 static void 
2069 packRegsForAccUse (iCode * ic)
2070 {
2071   iCode *uic;
2072
2073   /* if this is an aggregate, e.g. a one byte char array */
2074   if (IS_AGGREGATE(operandType(IC_RESULT(ic)))) {
2075     return;
2076   }
2077
2078   /* if + or - then it has to be one byte result */
2079   if ((ic->op == '+' || ic->op == '-')
2080       && getSize (operandType (IC_RESULT (ic))) > 1)
2081     return;
2082
2083   /* if shift operation make sure right side is not a literal */
2084   if (ic->op == RIGHT_OP &&
2085       (isOperandLiteral (IC_RIGHT (ic)) ||
2086        getSize (operandType (IC_RESULT (ic))) > 1))
2087     return;
2088
2089   if (ic->op == LEFT_OP &&
2090       (isOperandLiteral (IC_RIGHT (ic)) ||
2091        getSize (operandType (IC_RESULT (ic))) > 1))
2092     return;
2093
2094   /* has only one definition */
2095   if (bitVectnBitsOn (OP_DEFS (IC_RESULT (ic))) > 1)
2096     return;
2097
2098   /* has only one use */
2099   if (bitVectnBitsOn (OP_USES (IC_RESULT (ic))) > 1)
2100     return;
2101
2102   /* and the usage immediately follows this iCode */
2103   if (!(uic = hTabItemWithKey (iCodehTab,
2104                                bitVectFirstBit (OP_USES (IC_RESULT (ic))))))
2105     return;
2106
2107   if (ic->next != uic)
2108     return;
2109
2110   /* if it is a conditional branch then we definitely can */
2111   if (uic->op == IFX)
2112     goto accuse;
2113
2114   if (uic->op == JUMPTABLE)
2115     return;
2116
2117 #if 0
2118   /* if the usage is not is an assignment or an 
2119      arithmetic / bitwise / shift operation then not */
2120   if (POINTER_SET (uic) &&
2121       getSize (aggrToPtr (operandType (IC_RESULT (uic)), FALSE)) > 1)
2122     return;
2123 #endif
2124
2125   if (uic->op != '=' &&
2126       !IS_ARITHMETIC_OP (uic) &&
2127       !IS_BITWISE_OP (uic) &&
2128       uic->op != LEFT_OP &&
2129       uic->op != RIGHT_OP)
2130     return;
2131
2132   /* if used in ^ operation then make sure right is not a 
2133      literl */
2134   if (uic->op == '^' && isOperandLiteral (IC_RIGHT (uic)))
2135     return;
2136
2137   /* if shift operation make sure right side is not a literal */
2138   if (uic->op == RIGHT_OP &&
2139       (isOperandLiteral (IC_RIGHT (uic)) ||
2140        getSize (operandType (IC_RESULT (uic))) > 1))
2141     return;
2142
2143   if (uic->op == LEFT_OP &&
2144       (isOperandLiteral (IC_RIGHT (uic)) ||
2145        getSize (operandType (IC_RESULT (uic))) > 1))
2146     return;
2147
2148 #if 0
2149   /* make sure that the result of this icode is not on the
2150      stack, since acc is used to compute stack offset */
2151   if (IS_TRUE_SYMOP (IC_RESULT (uic)) &&
2152       OP_SYMBOL (IC_RESULT (uic))->onStack)
2153     return;
2154 #endif
2155
2156 #if 0
2157   /* if either one of them in far space then we cannot */
2158   if ((IS_TRUE_SYMOP (IC_LEFT (uic)) &&
2159        isOperandInFarSpace (IC_LEFT (uic))) ||
2160       (IS_TRUE_SYMOP (IC_RIGHT (uic)) &&
2161        isOperandInFarSpace (IC_RIGHT (uic))))
2162     return;
2163 #endif
2164
2165   /* if the usage has only one operand then we can */
2166   if (IC_LEFT (uic) == NULL ||
2167       IC_RIGHT (uic) == NULL)
2168     goto accuse;
2169
2170   /* make sure this is on the left side if not
2171      a '+' since '+' is commutative */
2172   if (ic->op != '+' &&
2173       IC_LEFT (uic)->key != IC_RESULT (ic)->key)
2174     return;
2175
2176   // See mcs51 ralloc for reasoning
2177 #if 0
2178   /* if one of them is a literal then we can */
2179   if ((IC_LEFT (uic) && IS_OP_LITERAL (IC_LEFT (uic))) ||
2180       (IC_RIGHT (uic) && IS_OP_LITERAL (IC_RIGHT (uic))))
2181     {
2182       goto accuse;
2183       return;
2184     }
2185 #endif
2186
2187 /** This is confusing :)  Guess for now */
2188   if (IC_LEFT (uic)->key == IC_RESULT (ic)->key &&
2189       (IS_ITEMP (IC_RIGHT (uic)) ||
2190        (IS_TRUE_SYMOP (IC_RIGHT (uic)))))
2191     goto accuse;
2192
2193   if (IC_RIGHT (uic)->key == IC_RESULT (ic)->key &&
2194       (IS_ITEMP (IC_LEFT (uic)) ||
2195        (IS_TRUE_SYMOP (IC_LEFT (uic)))))
2196     goto accuse;
2197   return;
2198 accuse:
2199   OP_SYMBOL (IC_RESULT (ic))->accuse = ACCUSE_A;
2200 }
2201 #endif
2202
2203 static void 
2204 packRegsForHLUse (iCode * ic)
2205 {
2206   iCode *uic;
2207
2208   /* PENDING: Could do IFX */
2209   if (ic->op == IFX)
2210     {
2211       return;
2212     }
2213
2214   /* has only one definition */
2215   if (bitVectnBitsOn (OP_DEFS (IC_RESULT (ic))) > 1)
2216     {
2217       D (D_HLUSE, ("  + Dropping as has more than one def\n"));
2218       return;
2219     }
2220
2221   /* has only one use */
2222   if (bitVectnBitsOn (OP_USES (IC_RESULT (ic))) > 1)
2223     {
2224       D (D_HLUSE, ("  + Dropping as has more than one use\n"));
2225       return;
2226     }
2227
2228   /* and the usage immediately follows this iCode */
2229   if (!(uic = hTabItemWithKey (iCodehTab,
2230                                bitVectFirstBit (OP_USES (IC_RESULT (ic))))))
2231     {
2232       D (D_HLUSE, ("  + Dropping as usage isn't in this block\n"));
2233       return;
2234     }
2235
2236   if (ic->next != uic)
2237     {
2238       D (D_HLUSE, ("  + Dropping as usage doesn't follow this\n"));
2239       return;
2240     }
2241
2242   if (uic->op ==IFX)
2243     {
2244       return;
2245     }
2246
2247   if (getSize (operandType (IC_RESULT (ic))) != 2 ||
2248       (IC_LEFT(uic) && getSize (operandType (IC_LEFT (uic))) != 2) ||
2249       (IC_RIGHT(uic) && getSize (operandType (IC_RIGHT (uic))) != 2))
2250     {
2251       D (D_HLUSE, ("  + Dropping as the result size is not 2\n"));
2252       return;
2253     }
2254
2255   if (IS_Z80)
2256     {
2257       if (ic->op == CAST && uic->op == IPUSH)
2258         goto hluse;
2259       if (ic->op == ADDRESS_OF && uic->op == IPUSH)
2260         goto hluse;
2261       if (ic->op == ADDRESS_OF && POINTER_GET (uic) && IS_ITEMP( IC_RESULT (uic)))
2262         goto hluse;
2263       if (ic->op == CALL && ic->parmBytes == 0 && (uic->op == '-' || uic->op == '+'))
2264         goto hluse;
2265     }
2266   else if (IS_GB)
2267     {
2268       /* Case of assign a constant to offset in a static array. */
2269       if (ic->op == '+' && IS_VALOP (IC_RIGHT (ic)))
2270         {
2271           if (uic->op == '=' && POINTER_SET (uic))
2272             {
2273               goto hluse;
2274             }
2275           else if (uic->op == IPUSH && getSize (operandType (IC_LEFT (uic))) == 2)
2276             {
2277               goto hluse;
2278             }
2279         }
2280     }
2281
2282   D (D_HLUSE, ("  + Dropping as it's a bad op\n"));
2283   return;
2284 hluse:
2285   OP_SYMBOL (IC_RESULT (ic))->accuse = ACCUSE_SCRATCH;
2286 }
2287
2288 static iCode *
2289 packRegsForHLUse3 (iCode * lic, operand * op, eBBlock * ebp)
2290 {
2291   int i, key;
2292   symbol *sym;
2293   iCode *ic, *dic;
2294   bool isFirst = TRUE;
2295
2296   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));
2297   if (D_PACK_HLUSE3)
2298     piCode(lic, NULL);
2299
2300   if ( OP_SYMBOL(op)->accuse)
2301     {
2302       return NULL;
2303     }
2304
2305   if (OP_SYMBOL(op)->remat)
2306     {
2307       return NULL; 
2308     }
2309
2310   /* Only defined once */
2311   if (bitVectnBitsOn (OP_DEFS (op)) > 1)
2312     return NULL;
2313
2314   if (getSize (operandType (op)) > 2)
2315     return NULL;
2316
2317   /* And this is the definition */
2318   if (bitVectFirstBit (OP_DEFS (op)) != lic->key)
2319     return NULL;
2320
2321   /* first check if any overlapping liverange has already been
2322      assigned to DPTR */
2323   if (OP_SYMBOL(op)->clashes) 
2324     {
2325       for (i = 0 ; i < OP_SYMBOL(op)->clashes->size ; i++ ) 
2326         {
2327           if (bitVectBitValue(OP_SYMBOL(op)->clashes,i)) 
2328             {
2329               sym = hTabItemWithKey(liveRanges,i);
2330               if (sym->accuse == ACCUSE_SCRATCH)
2331                 {
2332                   return NULL;
2333                 }
2334             }
2335         }
2336     }
2337
2338   /* Nothing else that clashes with this is using the scratch
2339      register.  Scan through all of the intermediate instructions and
2340      see if any of them could nuke HL.
2341   */
2342   dic = ic = hTabFirstItemWK(iCodeSeqhTab,OP_SYMBOL(op)->liveFrom);
2343
2344   for (; ic && ic->seq <= OP_SYMBOL(op)->liveTo;
2345        ic = hTabNextItem(iCodeSeqhTab, &key)) 
2346     {
2347       if (D_PACK_HLUSE3)
2348         piCode(ic, NULL);
2349       D (D_PACK_HLUSE3, ("(On %p: op: %u next: %p)\n", ic, ic->op, ic->next));
2350
2351       if (isFirst)
2352         {
2353           isFirst = FALSE;
2354           if (ic->op == ADDRESS_OF)
2355             continue;
2356           if (POINTER_GET (ic))
2357             continue;
2358           if (ic->op == '=' && !POINTER_SET(ic))
2359             continue;
2360         }
2361
2362       if (IC_RESULT(ic) && IS_SYMOP(IC_RESULT(ic))
2363           && isOperandInDirSpace (IC_RESULT (ic)))
2364         return NULL;
2365
2366       if (IC_LEFT(ic) && IS_SYMOP(IC_LEFT(ic))
2367           && isOperandInDirSpace (IC_LEFT (ic)))
2368         return NULL;
2369
2370       if (IC_RIGHT(ic) && IS_SYMOP(IC_RIGHT(ic))
2371           && isOperandInDirSpace (IC_RIGHT (ic)))
2372         return NULL;
2373
2374       /* Handle the non left/right/result ones first */
2375       if (ic->op == IFX)
2376         continue;
2377       if (ic->op == JUMPTABLE)
2378         return NULL;
2379
2380       if (SKIP_IC2(ic))
2381         continue;
2382
2383       if (ic->op == CAST)
2384         continue;
2385
2386       if (ic->op == IPUSH && isOperandEqual (op, IC_LEFT (ic)))
2387         continue;
2388
2389       if (ic->op == SEND && isOperandEqual (op, IC_LEFT (ic)))
2390         continue;
2391
2392       if (ic->op == CALL && isOperandEqual (op, IC_RESULT (ic)))
2393         continue;
2394
2395       if (ic->op == LEFT_OP && isOperandLiteral (IC_RIGHT (ic)))
2396         continue;
2397
2398       if ((ic->op == '=' && !POINTER_SET(ic)) ||
2399           ic->op == UNARYMINUS ||
2400           ic->op == '+' ||
2401           ic->op == '-' ||
2402           ic->op == '>' ||
2403           ic->op == '<' ||
2404           ic->op == EQ_OP ||
2405           0)
2406         continue;
2407
2408       if (ic->op == '*' && isOperandEqual (op, IC_LEFT (ic)))
2409         continue;
2410
2411       if (POINTER_SET (ic) && isOperandEqual (op, IC_RESULT (ic)))
2412         continue;
2413
2414       if (POINTER_GET (ic) && isOperandEqual (op, IC_LEFT (ic)))
2415         continue;
2416
2417       if (IS_VALOP (IC_RIGHT (ic)) &&
2418           (ic->op == EQ_OP ||
2419            0))
2420         {
2421           continue;
2422         }
2423
2424       /* By default give up */
2425       return NULL;
2426     }
2427
2428   D (D_PACK_HLUSE3, ("Succeeded!\n"))
2429
2430   OP_SYMBOL (op)->accuse = ACCUSE_SCRATCH;
2431   return dic;
2432 }
2433
2434 static iCode *
2435 packRegsForIYUse (iCode * lic, operand * op, eBBlock * ebp)
2436 {
2437   int i, key;
2438   symbol *sym;
2439   iCode *ic, *dic;
2440   bitVect *uses;
2441
2442   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));
2443   if (D_PACK_IY)
2444     piCode(lic, NULL);
2445
2446   if ( OP_SYMBOL(op)->accuse)
2447     {
2448       return NULL;
2449     }
2450
2451   if (OP_SYMBOL(op)->remat)
2452     {
2453       return NULL; 
2454     }
2455
2456   /* Only defined once */
2457   if (bitVectnBitsOn (OP_DEFS (op)) > 1)
2458     return NULL;
2459
2460   /* And this is the definition */
2461   if (bitVectFirstBit (OP_DEFS (op)) != lic->key)
2462     return NULL;
2463
2464   /* first check if any overlapping liverange has already been
2465      assigned to DPTR */
2466   if (OP_SYMBOL(op)->clashes) 
2467     {
2468       for (i = 0 ; i < OP_SYMBOL(op)->clashes->size ; i++ ) 
2469         {
2470           if (bitVectBitValue(OP_SYMBOL(op)->clashes,i)) 
2471             {
2472               sym = hTabItemWithKey(liveRanges,i);
2473               if (sym->accuse == ACCUSE_IY)
2474                 {
2475                   return NULL;
2476                 }
2477             }
2478         }
2479     }
2480
2481   /* Only a few instructions can load into IY */
2482   if (lic->op != '=')
2483     {
2484       return NULL;
2485     }
2486
2487   if (getSize (operandType (op)) != 2)
2488     {
2489       D (D_ACCUSE2, ("  + Dropping as operation has size is too big\n"));
2490       return FALSE;
2491     }
2492
2493   /* Nothing else that clashes with this is using the scratch
2494      register.  Scan through all of the intermediate instructions and
2495      see if any of them could nuke HL.
2496   */
2497   dic = ic = hTabFirstItemWK(iCodeSeqhTab,OP_SYMBOL(op)->liveFrom);
2498   uses = OP_USES(op);
2499
2500   for (; ic && ic->seq <= OP_SYMBOL(op)->liveTo;
2501        ic = hTabNextItem(iCodeSeqhTab,&key)) 
2502     {
2503       if (D_PACK_IY)
2504         piCode(ic, NULL);
2505
2506       if (ic->op == PCALL || 
2507           ic->op == CALL ||
2508           ic->op == JUMPTABLE
2509           )
2510         return NULL;
2511
2512       if (SKIP_IC2(ic))
2513         continue;
2514
2515       /* Be pessamistic. */
2516       if (ic->op == IFX)
2517         return NULL;
2518
2519       D (D_PACK_IY, ("  op: %u uses %u result: %d left: %d right: %d\n", ic->op, bitVectBitValue(uses, ic->key),
2520                      IC_RESULT(ic) && IS_SYMOP(IC_RESULT(ic)) ? isOperandInDirSpace(IC_RESULT(ic)) : -1,
2521                      IC_LEFT(ic) && IS_SYMOP(IC_LEFT(ic)) ? isOperandInDirSpace(IC_LEFT(ic)) : -1,
2522                      IC_RIGHT(ic) && IS_SYMOP(IC_RIGHT(ic)) ? isOperandInDirSpace(IC_RIGHT(ic)) : -1
2523                      ));
2524
2525       if (IC_RESULT(ic) && IS_SYMOP(IC_RESULT(ic)) && 
2526           isOperandInDirSpace(IC_RESULT(ic)))
2527         return NULL;
2528       
2529       if (IC_RIGHT(ic) && IS_SYMOP(IC_RIGHT(ic)) && 
2530           isOperandInDirSpace(IC_RIGHT(ic)))
2531         return NULL;
2532       
2533       if (IC_LEFT(ic) && IS_SYMOP(IC_LEFT(ic)) && 
2534           isOperandInDirSpace(IC_LEFT(ic)))
2535         return NULL;
2536
2537       /* Only certain rules will work against IY.  Check if this iCode uses
2538          this symbol. */
2539       if (bitVectBitValue(uses, ic->key) != 0)
2540         {
2541           if (ic->op == '=' &&
2542               isOperandEqual(IC_RESULT(ic), op))
2543             continue;
2544
2545           if (ic->op == GET_VALUE_AT_ADDRESS &&
2546               isOperandEqual(IC_LEFT(ic), op))
2547             continue;
2548
2549           if (isOperandEqual(IC_RESULT(ic), IC_LEFT(ic)) == FALSE)
2550             return NULL;
2551
2552           if (IC_RIGHT (ic) && IS_VALOP (IC_RIGHT (ic)))
2553             {
2554               if (ic->op == '+' ||
2555                   ic->op == '-')
2556                 {
2557                   /* Only works if the constant is small */
2558                   if (operandLitValue (IC_RIGHT (ic)) < 4)
2559                     continue;
2560                 }
2561             }
2562
2563           return NULL;
2564         }
2565       else
2566         {
2567           /* This iCode doesn't use the sym.  See if this iCode preserves IY.
2568            */
2569           continue;
2570         }
2571
2572       /* By default give up */
2573       return NULL;
2574     }
2575
2576   D (D_PACK_IY, ("Succeeded IY!\n"));
2577
2578   OP_SYMBOL (op)->accuse = ACCUSE_IY;
2579   return dic;
2580 }
2581
2582 /** Returns TRUE if this operation can use acc and if it preserves the value.
2583  */
2584 static bool 
2585 opPreservesA (iCode * uic)
2586 {
2587   if (uic->op == IFX)
2588     {
2589       /* If we've gotten this far then the thing to compare must be
2590          small enough and must be in A.
2591       */
2592       return TRUE;
2593     }
2594
2595   if (uic->op == JUMPTABLE)
2596     {
2597       D (D_ACCUSE2, ("  + Dropping as operation is a Jumptable\n"));
2598       return FALSE;
2599     }
2600
2601   /* A pointer assign preserves A if A is the left value. */
2602   if (uic->op == '=' && POINTER_SET (uic))
2603     {
2604       return TRUE;
2605     }
2606
2607   /* if the usage has only one operand then we can */
2608   /* PENDING: check */
2609   if (IC_LEFT (uic) == NULL ||
2610       IC_RIGHT (uic) == NULL)
2611     {
2612       D (D_ACCUSE2, ("  + Dropping as operation has only one operand\n"));
2613       return FALSE;
2614     }
2615
2616   /* PENDING: check this rule */
2617   if (getSize (operandType (IC_RESULT (uic))) > 1)
2618     {
2619       D (D_ACCUSE2, ("  + Dropping as operation has size is too big\n"));
2620       return FALSE;
2621     }
2622
2623
2624   /* Disabled all of the old rules as they weren't verified and have
2625      caused at least one problem.
2626    */
2627   return FALSE;
2628 }
2629
2630 /** Returns true if this operand preserves the value of A.
2631  */
2632 static bool
2633 opIgnoresA (iCode * ic, iCode * uic)
2634 {
2635   /* A increment of an iTemp by a constant is OK. */
2636   if ( uic->op == '+' &&
2637        IS_ITEMP (IC_LEFT (uic)) &&
2638        IS_ITEMP (IC_RESULT (uic)) &&
2639        IS_OP_LITERAL (IC_RIGHT (uic)))
2640     {
2641       unsigned int icount = (unsigned int) floatFromVal (IC_RIGHT (uic)->operand.valOperand);
2642
2643       /* Being an ITEMP means that we're already a symbol. */
2644       if (icount == 1 &&
2645           IC_RESULT (uic)->operand.symOperand->key == IC_LEFT (uic)->operand.symOperand->key
2646           )
2647         {
2648           return TRUE;
2649         }
2650     }
2651   else if (uic->op == '=' && !POINTER_SET (uic))
2652     {
2653       /* If they are equal and get optimised out then things are OK. */
2654       if (isOperandEqual (IC_RESULT (uic), IC_RIGHT (uic)))
2655         {
2656           /* Straight assign is OK. */
2657           return TRUE;
2658         }
2659     }
2660
2661   return FALSE;
2662 }
2663
2664
2665 /* Some optimisation cases:
2666
2667    1. Part of memcpy
2668 ;       genPointerGet
2669         ld      l,-4(ix)
2670         ld      h,-3(ix)
2671         ld      c,(hl)
2672 ;       genPlus
2673         inc     -4(ix)
2674         jp      nz,00108$
2675         inc     -3(ix)
2676 00108$:
2677 ;       genAssign (pointer)
2678         ld      a,c
2679         ld      (de),a
2680  
2681       want to optimise down to:
2682         ld       hl,-4(ix) ...
2683         ld       a,(hl)
2684         inc      -4(ix).w  ...
2685         ld       (de),a
2686
2687       So genPointer get is OK
2688       genPlus where the right is constant, left is iTemp, and result is same as left
2689       genAssign (pointer) is OK
2690
2691     2. Part of _strcpy
2692 ;       genPointerGet
2693         ld      a,(de)
2694         ld      c,a
2695 ;       genIfx
2696         xor     a,a
2697         or      a,c
2698         jp      z,00103$
2699 ;       _strcpy.c 40
2700 ;       genAssign (pointer)
2701 ;       AOP_STK for _strcpy_to_1_1
2702         ld      l,-2(ix)
2703         ld      h,-1(ix)
2704         ld      (hl),c
2705
2706       want to optimise down to:
2707         ld      a,(de)
2708         or      a,a
2709         jp      z,00103$
2710         ld      (bc),a
2711       
2712       So genIfx where IC_COND has size of 1 and is a constant.
2713 */
2714
2715 /** Pack registers for acc use.
2716     When the result of this operation is small and short lived it may
2717     be able to be stored in the accumulator.
2718
2719     Note that the 'A preserving' list is currently emperical :)
2720  */
2721 static void 
2722 packRegsForAccUse2 (iCode * ic)
2723 {
2724   iCode *uic;
2725
2726   D (D_ACCUSE2, ("packRegsForAccUse2: running on ic %p line %u\n", ic, ic->lineno));
2727   if (D_ACCUSE2)
2728     piCode (ic, NULL);
2729
2730   /* Filter out all but those 'good' commands */
2731   if (
2732        !POINTER_GET (ic) &&
2733        ic->op != '+' &&
2734        ic->op != '-' &&
2735        !IS_BITWISE_OP (ic) &&
2736        ic->op != '=' &&
2737        ic->op != EQ_OP &&
2738        ic->op != '<' &&
2739        ic->op != '>' &&
2740        ic->op != CAST &&
2741        ic->op != GETHBIT &&
2742        1)
2743     {
2744       D (D_ACCUSE2, ("  + Dropping as not a 'good' source command\n"));
2745       return;
2746     }
2747
2748   /* if + or - then it has to be one byte result.
2749      MLH: Ok.
2750    */
2751   if ((ic->op == '+' || ic->op == '-')
2752       && getSize (operandType (IC_RESULT (ic))) > 1)
2753     {
2754       D (D_ACCUSE2, ("  + Dropping as it's a big + or -\n"));
2755       return;
2756     }
2757
2758   /* has only one definition */
2759   if (bitVectnBitsOn (OP_DEFS (IC_RESULT (ic))) > 1)
2760     {
2761       D (D_ACCUSE2, ("  + Dropping as it has more than one definition\n"));
2762       return;
2763     }
2764
2765   /* Right.  We may be able to propagate it through if:
2766      For each in the chain of uses the intermediate is OK.
2767    */
2768   /* Get next with 'uses result' bit on
2769      If this->next == next
2770      Validate use of next
2771      If OK, increase count
2772    */
2773   /* and the usage immediately follows this iCode */
2774   if (!(uic = hTabItemWithKey (iCodehTab,
2775                                bitVectFirstBit (OP_USES (IC_RESULT (ic))))))
2776     {
2777       D (D_ACCUSE2, ("  + Dropping as usage does not follow first\n"));
2778       return;
2779     }
2780
2781   {
2782     /* Create a copy of the OP_USES bit vect */
2783     bitVect *uses = bitVectCopy (OP_USES (IC_RESULT (ic)));
2784     int setBit;
2785     iCode *scan = ic, *next;
2786
2787     do
2788       {
2789         setBit = bitVectFirstBit (uses);
2790         next = hTabItemWithKey (iCodehTab, setBit);
2791         if (scan->next == next)
2792           {
2793             D (D_ACCUSE2_VERBOSE, ("  ! Is next in line\n"));
2794
2795             bitVectUnSetBit (uses, setBit);
2796             /* Still contigous. */
2797             if (!opPreservesA (next))
2798               {
2799                 D (D_ACCUSE2, ("  + Dropping as operation doesn't preserve A\n"));
2800                 return;
2801               }
2802             D (D_ACCUSE2_VERBOSE, ("  ! Preserves A, so continue scanning\n"));
2803             scan = next;
2804           }
2805         else if (scan->next == NULL && bitVectnBitsOn (uses) == 1 && next != NULL)
2806           {
2807             if (next->prev == NULL)
2808               {
2809                 if (!opPreservesA (next))
2810                   {
2811                     D (D_ACCUSE2, ("  + Dropping as operation doesn't preserve A #2\n"));
2812                     return;
2813                   }
2814                 bitVectUnSetBit (uses, setBit);
2815                 scan = next;
2816               }
2817             else 
2818               {
2819                 D (D_ACCUSE2, ("  + Dropping as last in list and next doesn't start a block\n"));
2820                 return;
2821               }
2822           }
2823         else if (scan->next == NULL)
2824           {
2825             D (D_ACCUSE2, ("  + Dropping as hit the end of the list\n"));
2826             D (D_ACCUSE2, ("  + Next in htab: %p\n", next));
2827             return;
2828           }
2829         else
2830           {
2831             if (opIgnoresA (ic, scan->next))
2832               {
2833                 /* Safe for now. */
2834                 scan = scan->next;
2835                 D (D_ACCUSE2_VERBOSE, ("  ! Op ignores A, so continue scanning\n"));
2836               }
2837             else
2838               {
2839                 D (D_ACCUSE2, ("  + Dropping as parts are not consecuitive and intermediate might use A\n"));
2840                 return;
2841               }
2842           }
2843       }
2844     while (!bitVectIsZero (uses));
2845
2846     OP_SYMBOL (IC_RESULT (ic))->accuse = ACCUSE_A;
2847     return;
2848   }
2849 }
2850
2851 /** Does some transformations to reduce register pressure.
2852  */
2853 static void 
2854 packRegisters (eBBlock * ebp)
2855 {
2856   iCode *ic;
2857   int change = 0;
2858
2859   D (D_ALLOC, ("packRegisters: entered.\n"));
2860
2861   while (1 && !DISABLE_PACK_ASSIGN)
2862     {
2863       change = 0;
2864       /* look for assignments of the form */
2865       /* iTempNN = TRueSym (someoperation) SomeOperand */
2866       /*       ....                       */
2867       /* TrueSym := iTempNN:1             */
2868       for (ic = ebp->sch; ic; ic = ic->next)
2869         {
2870           /* find assignment of the form TrueSym := iTempNN:1 */
2871           if (ic->op == '=' && !POINTER_SET (ic))
2872             change += packRegsForAssign (ic, ebp);
2873         }
2874       if (!change)
2875         break;
2876     }
2877
2878   for (ic = ebp->sch; ic; ic = ic->next)
2879     {
2880       /* Safe: address of a true sym is always constant. */
2881       /* if this is an itemp & result of a address of a true sym 
2882          then mark this as rematerialisable   */
2883       D (D_ALLOC, ("packRegisters: looping on ic %p\n", ic));
2884
2885       if (ic->op == ADDRESS_OF &&
2886           IS_ITEMP (IC_RESULT (ic)) &&
2887           IS_TRUE_SYMOP (IC_LEFT (ic)) &&
2888           bitVectnBitsOn (OP_DEFS (IC_RESULT (ic))) == 1 &&
2889           !OP_SYMBOL (IC_LEFT (ic))->onStack)
2890         {
2891
2892           OP_SYMBOL (IC_RESULT (ic))->remat = 1;
2893           OP_SYMBOL (IC_RESULT (ic))->rematiCode = ic;
2894           OP_SYMBOL (IC_RESULT (ic))->usl.spillLoc = NULL;
2895         }
2896
2897       /* Safe: just propagates the remat flag */
2898       /* if straight assignment then carry remat flag if this is the
2899          only definition */
2900       if (ic->op == '=' &&
2901           !POINTER_SET (ic) &&
2902           IS_SYMOP (IC_RIGHT (ic)) &&
2903           OP_SYMBOL (IC_RIGHT (ic))->remat &&
2904           bitVectnBitsOn (OP_SYMBOL (IC_RESULT (ic))->defs) <= 1)
2905         {
2906
2907           OP_SYMBOL (IC_RESULT (ic))->remat =
2908             OP_SYMBOL (IC_RIGHT (ic))->remat;
2909           OP_SYMBOL (IC_RESULT (ic))->rematiCode =
2910             OP_SYMBOL (IC_RIGHT (ic))->rematiCode;
2911         }
2912
2913       /* if the condition of an if instruction is defined in the
2914          previous instruction then mark the itemp as a conditional */
2915       if ((IS_CONDITIONAL (ic) ||
2916            ((ic->op == BITWISEAND ||
2917              ic->op == '|' ||
2918              ic->op == '^') &&
2919             isBitwiseOptimizable (ic))) &&
2920           ic->next && ic->next->op == IFX &&
2921           bitVectnBitsOn (OP_USES(IC_RESULT(ic)))==1 &&
2922           isOperandEqual (IC_RESULT (ic), IC_COND (ic->next)) &&
2923           OP_SYMBOL (IC_RESULT (ic))->liveTo <= ic->next->seq)
2924         {
2925
2926           OP_SYMBOL (IC_RESULT (ic))->regType = REG_CND;
2927           continue;
2928         }
2929
2930 #if 0
2931       /* reduce for support function calls */
2932       if (ic->supportRtn || ic->op == '+' || ic->op == '-')
2933         packRegsForSupport (ic, ebp);
2934 #endif
2935
2936       /* some cases the redundant moves can
2937          can be eliminated for return statements */
2938       if (ic->op == RETURN || ic->op == SEND)
2939         {
2940           packRegsForOneuse (ic, IC_LEFT (ic), ebp);
2941         }
2942
2943       /* if pointer set & left has a size more than
2944          one and right is not in far space */
2945       if (!DISABLE_PACK_ONE_USE &&
2946           POINTER_SET (ic) &&
2947           /* MLH: no such thing.
2948              !isOperandInFarSpace(IC_RIGHT(ic)) && */
2949           !OP_SYMBOL (IC_RESULT (ic))->remat &&
2950           !IS_OP_RUONLY (IC_RIGHT (ic)) &&
2951           getSize (aggrToPtr (operandType (IC_RESULT (ic)), FALSE)) > 1)
2952         {
2953
2954           packRegsForOneuse (ic, IC_RESULT (ic), ebp);
2955         }
2956
2957       /* if pointer get */
2958       if (!DISABLE_PACK_ONE_USE &&
2959           POINTER_GET (ic) &&
2960           IS_SYMOP (IC_LEFT (ic)) &&
2961       /* MLH: dont have far space
2962          !isOperandInFarSpace(IC_RESULT(ic))&& */
2963           !OP_SYMBOL (IC_LEFT (ic))->remat &&
2964           !IS_OP_RUONLY (IC_RESULT (ic)) &&
2965           getSize (aggrToPtr (operandType (IC_LEFT (ic)), FALSE)) > 1)
2966         {
2967
2968           packRegsForOneuse (ic, IC_LEFT (ic), ebp);
2969         }
2970
2971       /* pack registers for accumulator use, when the result of an
2972          arithmetic or bit wise operation has only one use, that use is
2973          immediately following the defintion and the using iCode has
2974          only one operand or has two operands but one is literal & the
2975          result of that operation is not on stack then we can leave the
2976          result of this operation in acc:b combination */
2977
2978       if (!DISABLE_PACK_HL && IS_ITEMP (IC_RESULT (ic)))
2979         {
2980           /* PENDING */
2981           if (IS_GB)
2982             {
2983               if (0)
2984                 packRegsForHLUse (ic);
2985             }
2986           else
2987             {
2988               packRegsForHLUse3 (ic, IC_RESULT (ic), ebp);
2989             }
2990         }
2991
2992       if (!DISABLE_PACK_IY && IS_ITEMP (IC_RESULT (ic)) && IS_Z80)
2993         {
2994           packRegsForIYUse (ic, IC_RESULT (ic), ebp);
2995         }
2996
2997       if (!DISABLE_PACK_ACC && IS_ITEMP (IC_RESULT (ic)) &&
2998           getSize (operandType (IC_RESULT (ic))) == 1)
2999         {
3000           packRegsForAccUse2 (ic);
3001         }
3002     }
3003 }
3004
3005 /** Joins together two byte constant pushes into one word push.
3006  */
3007 static iCode *
3008 joinPushes (iCode *lic)
3009 {
3010   iCode *ic, *uic;
3011
3012   for (ic = lic; ic; ic = ic->next)
3013     {
3014       int first, second;
3015       value *val;
3016
3017       uic = ic->next;
3018
3019       /* Anything past this? */
3020       if (uic == NULL)
3021         {
3022           continue;
3023         }
3024       /* This and the next pushes? */
3025       if (ic->op != IPUSH || uic->op != IPUSH)
3026         {
3027           continue;
3028         }
3029       /* Both literals? */
3030       if ( !IS_OP_LITERAL (IC_LEFT (ic)) || !IS_OP_LITERAL (IC_LEFT (uic)))
3031         {
3032           continue;
3033         }
3034       /* Both characters? */
3035       if ( getSize (operandType (IC_LEFT (ic))) != 1 || getSize (operandType (IC_LEFT (uic))) != 1)
3036         {
3037           continue;
3038         }
3039       /* Pull out the values, make a new type, and create the new iCode for it.
3040        */
3041       first = (int)operandLitValue ( IC_LEFT (ic));
3042       second = (int)operandLitValue ( IC_LEFT (uic));
3043
3044       sprintf (buffer, "%uu", ((first << 8) | (second & 0xFF)) & 0xFFFFU);
3045       val = constVal (buffer);
3046       SPEC_NOUN (val->type) = V_INT;
3047       IC_LEFT (ic) = operandFromOperand (IC_LEFT (ic));
3048       IC_LEFT (ic)->operand.valOperand = val;
3049       
3050       /* Now remove the second one from the list. */
3051       ic->next = uic->next;
3052       if (uic->next)
3053         {
3054           /* Patch up the reverse link */
3055           uic->next->prev = ic;
3056         }
3057     }
3058
3059   return lic;
3060 }
3061
3062 /*-----------------------------------------------------------------*/
3063 /* assignRegisters - assigns registers to each live range as need  */
3064 /*-----------------------------------------------------------------*/
3065 void 
3066 z80_assignRegisters (eBBlock ** ebbs, int count)
3067 {
3068   iCode *ic;
3069   int i;
3070
3071   D (D_ALLOC, ("\n-> z80_assignRegisters: entered.\n"));
3072
3073   setToNull ((void *) &_G.funcrUsed);
3074   setToNull ((void *) &_G.totRegAssigned);  
3075   _G.stackExtend = _G.dataExtend = 0;
3076
3077   if (IS_GB)
3078     {
3079       /* DE is required for the code gen. */
3080       _G.nRegs = GBZ80_MAX_REGS;
3081       regsZ80 = _gbz80_regs;
3082     }
3083   else
3084     {
3085       _G.nRegs = Z80_MAX_REGS;
3086       regsZ80 = _z80_regs;
3087     }
3088
3089   /* change assignments this will remove some
3090      live ranges reducing some register pressure */
3091   for (i = 0; i < count; i++)
3092     packRegisters (ebbs[i]);
3093
3094   /* liveranges probably changed by register packing
3095      so we compute them again */
3096   recomputeLiveRanges (ebbs, count);
3097
3098   if (options.dump_pack)
3099     dumpEbbsToFileExt (DUMP_PACK, ebbs, count);
3100
3101   /* first determine for each live range the number of 
3102      registers & the type of registers required for each */
3103   regTypeNum ();
3104
3105   /* and serially allocate registers */
3106   serialRegAssign (ebbs, count);
3107
3108   freeAllRegs ();
3109   fillGaps();
3110
3111   /* if stack was extended then tell the user */
3112   if (_G.stackExtend)
3113     {
3114 /*      werror(W_TOOMANY_SPILS,"stack", */
3115 /*             _G.stackExtend,currFunc->name,""); */
3116       _G.stackExtend = 0;
3117     }
3118
3119   if (_G.dataExtend)
3120     {
3121 /*      werror(W_TOOMANY_SPILS,"data space", */
3122 /*             _G.dataExtend,currFunc->name,""); */
3123       _G.dataExtend = 0;
3124     }
3125
3126   if (options.dump_rassgn) {
3127     dumpEbbsToFileExt (DUMP_RASSGN, ebbs, count);
3128     dumpLiveRanges (DUMP_LRANGE, liveRanges);
3129   }
3130
3131   /* after that create the register mask
3132      for each of the instruction */
3133   createRegMask (ebbs, count);
3134
3135   /* now get back the chain */
3136   ic = iCodeLabelOptimize (iCodeFromeBBlock (ebbs, count));
3137
3138   ic = joinPushes (ic);
3139
3140   /* redo that offsets for stacked automatic variables */
3141   redoStackOffsets ();
3142
3143   genZ80Code (ic);
3144
3145   /* free up any stackSpil locations allocated */
3146   applyToSet (_G.stackSpil, deallocStackSpil);
3147   _G.slocNum = 0;
3148   setToNull ((void *) &_G.stackSpil);
3149   setToNull ((void *) &_G.spiltSet);
3150   /* mark all registers as free */
3151   freeAllRegs ();
3152
3153   return;
3154 }