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