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