function registers and corrected defaults with additional warning
* device/lib/malloc.c: cosmetic changes
* device/lib/realloc.c: bugfix for bug #
1496907, Thanks Efim Monyak
* src/ds390/ralloc.c (getRegBitNoSpil): reenabled,
(fillGaps): and used it
git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@4295
4a8a32a2-be11-0410-ad9d-
d568d2c75423
+2006-07-23 Maarten Brock <sourceforge.brock AT dse.nl>
+
+ * device/include/mcs51/compiler.h: added SFRX for xdata based special
+ function registers and corrected defaults with additional warning
+ * device/lib/malloc.c: cosmetic changes
+ * device/lib/realloc.c: bugfix for bug #1496907, Thanks Efim Monyak
+ * src/ds390/ralloc.c (getRegBitNoSpil): reenabled,
+ (fillGaps): and used it
+
2006-07-20 Raphael Neider <rneider AT web.de>
* src/pic/device.c (addMemRange,assignRegister): suppress verbose
2006-07-20 Raphael Neider <rneider AT web.de>
* src/pic/device.c (addMemRange,assignRegister): suppress verbose
* prerequisite byte order or adjacency. None of these multi-byte sfr\r
* combinations will guarantee the order in which they are accessed when read\r
* or written.\r
* prerequisite byte order or adjacency. None of these multi-byte sfr\r
* combinations will guarantee the order in which they are accessed when read\r
* or written.\r
+ * SFR16X and SFR32X for 16 bit and 32 bit xdata registers are not defined\r
+ * to avoid portability issues because of compiler endianness.\r
* This file is to be included in every microcontroller specific header file.\r
* Example:\r
*\r
* This file is to be included in every microcontroller specific header file.\r
* Example:\r
*\r
*\r
* SFR (P0, 0x80); // Port 0\r
*\r
*\r
* SFR (P0, 0x80); // Port 0\r
*\r
+ * SFRX (CPUCS, 0xE600); // Cypress FX2 Control and Status register in xdata memory at 0xE600\r
+ *\r
* SFR16 (TMR2, 0xCC); // Timer 2, lsb at 0xCC, msb at 0xCD\r
*\r
* SFR16E(TMR0, 0x8C8A); // Timer 0, lsb at 0x8A, msb at 0x8C\r
* SFR16 (TMR2, 0xCC); // Timer 2, lsb at 0xCC, msb at 0xCD\r
*\r
* SFR16E(TMR0, 0x8C8A); // Timer 0, lsb at 0x8A, msb at 0x8C\r
* SFR32 (MAC0ACC, 0x93); // SiLabs C8051F120 32 bits MAC0 Accumulator, lsb at 0x93, msb at 0x96\r
*\r
* SFR32E(SUMR, 0xE5E4E3E2); // TI MSC1210 SUMR 32 bits Summation register, lsb at 0xE2, msb at 0xE5\r
* SFR32 (MAC0ACC, 0x93); // SiLabs C8051F120 32 bits MAC0 Accumulator, lsb at 0x93, msb at 0x96\r
*\r
* SFR32E(SUMR, 0xE5E4E3E2); // TI MSC1210 SUMR 32 bits Summation register, lsb at 0xE2, msb at 0xE5\r
*/\r
\r
#ifndef COMPILER_H\r
*/\r
\r
#ifndef COMPILER_H\r
* http://sdcc.sf.net\r
*/\r
#if defined SDCC\r
* http://sdcc.sf.net\r
*/\r
#if defined SDCC\r
-# define SBIT(name, addr, bit) __sbit __at(addr+bit) name\r
-# define SFR(name, addr) __sfr __at(addr) name\r
-# define SFR16(name, addr) __sfr16 __at(((addr+1)<<8) | addr) name\r
-# define SFR16E(name, fulladdr) __sfr16 __at(fulladdr) name\r
+# define SBIT(name, addr, bit) __sbit __at(addr+bit) name\r
+# define SFR(name, addr) __sfr __at(addr) name\r
+# define SFRX(name, addr) xdata volatile unsigned char __at(addr) name\r
+# define SFR16(name, addr) __sfr16 __at(((addr+1)<<8) | addr) name\r
+# define SFR16E(name, fulladdr) __sfr16 __at(fulladdr) name\r
# define SFR32(name, addr) __sfr32 __at(((addr+3)<<24) | ((addr+2)<<16) | ((addr+1)<<8) | addr) name\r
# define SFR32(name, addr) __sfr32 __at(((addr+3)<<24) | ((addr+2)<<16) | ((addr+1)<<8) | addr) name\r
-# define SFR32E(name, fulladdr) __sfr32 __at(fulladdr) name\r
+# define SFR32E(name, fulladdr) __sfr32 __at(fulladdr) name\r
\r
/** Keil C51\r
* http://www.keil.com\r
\r
/** Keil C51\r
* http://www.keil.com\r
#elif defined __CX51__\r
# define SBIT(name, addr, bit) sbit name = addr^bit\r
# define SFR(name, addr) sfr name = addr\r
#elif defined __CX51__\r
# define SBIT(name, addr, bit) sbit name = addr^bit\r
# define SFR(name, addr) sfr name = addr\r
+# define SFRX(name, addr) volatile unsigned char xdata name _at_ addr\r
# define SFR16(name, addr) sfr16 name = addr\r
# define SFR16E(name, fulladdr) /* not supported */\r
# define SFR32(name, fulladdr) /* not supported */\r
# define SFR16(name, addr) sfr16 name = addr\r
# define SFR16E(name, fulladdr) /* not supported */\r
# define SFR32(name, fulladdr) /* not supported */\r
* http://www.raisonance.com\r
*/\r
#elif defined __RC51__\r
* http://www.raisonance.com\r
*/\r
#elif defined __RC51__\r
-# define SBIT(name, addr, bit) at (addr+bit) sbit name\r
-# define SFR(name, addr) sfr at addr name\r
-# define SFR16(name, addr) sfr16 at addr name\r
+# define SBIT(name, addr, bit) at (addr+bit) sbit name\r
+# define SFR(name, addr) sfr at addr name\r
+# define SFRX(name, addr) xdata at addr volatile unsigned char name\r
+# define SFR16(name, addr) sfr16 at addr name\r
# define SFR16E(name, fulladdr) /* not supported */\r
# define SFR32(name, fulladdr) /* not supported */\r
# define SFR32E(name, fulladdr) /* not supported */\r
# define SFR16E(name, fulladdr) /* not supported */\r
# define SFR32(name, fulladdr) /* not supported */\r
# define SFR32E(name, fulladdr) /* not supported */\r
#elif defined __ICC8051__\r
# define SBIT(name, addr, bit) __bit __no_init volatile bool name @ (addr+bit)\r
# define SFR(name, addr) __sfr __no_init volatile unsigned char name @ addr\r
#elif defined __ICC8051__\r
# define SBIT(name, addr, bit) __bit __no_init volatile bool name @ (addr+bit)\r
# define SFR(name, addr) __sfr __no_init volatile unsigned char name @ addr\r
+# define SFRX(name, addr) __xdata __no_init volatile unsigned char name @ addr\r
# define SFR16(name, addr) __sfr __no_init volatile unsigned int name @ addr\r
# define SFR16E(name, fulladdr) /* not supported */\r
# define SFR32(name, fulladdr) __sfr __no_init volatile unsigned long name @ addr\r
# define SFR16(name, addr) __sfr __no_init volatile unsigned int name @ addr\r
# define SFR16E(name, fulladdr) /* not supported */\r
# define SFR32(name, fulladdr) __sfr __no_init volatile unsigned long name @ addr\r
#elif defined _CC51\r
# define SBIT(name, addr, bit) _sfrbit name _at(addr+bit)\r
# define SFR(name, addr) _sfrbyte name _at(addr)\r
#elif defined _CC51\r
# define SBIT(name, addr, bit) _sfrbit name _at(addr+bit)\r
# define SFR(name, addr) _sfrbyte name _at(addr)\r
+# define SFRX(name, addr) _xdat volatile unsigned char name _at(addr)\r
# define SFR16(name, addr) /* not supported */\r
# define SFR16E(name, fulladdr) /* not supported */\r
# define SFR32(name, fulladdr) /* not supported */\r
# define SFR16(name, addr) /* not supported */\r
# define SFR16E(name, fulladdr) /* not supported */\r
# define SFR32(name, fulladdr) /* not supported */\r
#elif defined HI_TECH_C\r
# define SBIT(name, addr, bit) volatile bit name @ (addr+bit)\r
# define SFR(name, addr) volatile unsigned char name @ addr\r
#elif defined HI_TECH_C\r
# define SBIT(name, addr, bit) volatile bit name @ (addr+bit)\r
# define SFR(name, addr) volatile unsigned char name @ addr\r
+# define SFRX(name, addr) volatile far unsigned char name @ addr\r
# define SFR16(name, addr) /* not supported */\r
# define SFR16E(name, fulladdr) /* not supported */\r
# define SFR32(name, fulladdr) /* not supported */\r
# define SFR16(name, addr) /* not supported */\r
# define SFR16E(name, fulladdr) /* not supported */\r
# define SFR32(name, fulladdr) /* not supported */\r
#elif defined _XC51_VER\r
# define SBIT(name, addr, bit) _sfrbit name = (addr+bit)\r
# define SFR(name, addr) _sfr name = addr\r
#elif defined _XC51_VER\r
# define SBIT(name, addr, bit) _sfrbit name = (addr+bit)\r
# define SFR(name, addr) _sfr name = addr\r
+# define SFRX(name, addr) volatile unsigned char _xdata name _at addr\r
# define SFR16(name, addr) _sfrword name = addr\r
# define SFR16E(name, fulladdr) /* not supported */\r
# define SFR32(name, fulladdr) /* not supported */\r
# define SFR16(name, addr) _sfrword name = addr\r
# define SFR16E(name, fulladdr) /* not supported */\r
# define SFR32(name, fulladdr) /* not supported */\r
#elif defined __UC__\r
# define SBIT(name, addr, bit) unsigned char bit name @ (addr+bit)\r
# define SFR(name, addr) near unsigned char name @ addr\r
#elif defined __UC__\r
# define SBIT(name, addr, bit) unsigned char bit name @ (addr+bit)\r
# define SFR(name, addr) near unsigned char name @ addr\r
+# define SFRX(name, addr) xdata volatile unsigned char name @ addr\r
# define SFR16(name, addr) /* not supported */\r
# define SFR16E(name, fulladdr) /* not supported */\r
# define SFR32(name, fulladdr) /* not supported */\r
# define SFR16(name, addr) /* not supported */\r
# define SFR16E(name, fulladdr) /* not supported */\r
# define SFR32(name, fulladdr) /* not supported */\r
* unknown compiler\r
*/\r
#elif\r
* unknown compiler\r
*/\r
#elif\r
-# define SBIT(name, addr, bit) volatile bool\r
-# define SFR(name, addr) volatile unsigned char\r
-# define SFR16(name, addr) volatile short\r
-# define SFR16E(name, fulladdr) volatile short\r
-# define SFR32(name, fulladdr) volatile int\r
-# define SFR32E(name, fulladdr) volatile int\r
+# warning unknown compiler\r
+# define SBIT(name, addr, bit) volatile bool name\r
+# define SFR(name, addr) volatile unsigned char name\r
+# define SFRX(name, addr) volatile unsigned char name\r
+# define SFR16(name, addr) volatile unsigned short name\r
+# define SFR16E(name, fulladdr) volatile unsigned short name\r
+# define SFR32(name, fulladdr) volatile unsigned long name\r
+# define SFR32E(name, fulladdr) volatile unsigned long name\r
- if (!current_header->len)
- { //This code works only for first_header in the list and only
- current_header->len = size; //for first allocation
- }
- else
- {
- //else create new header at the begin of spare
- new_header = (MEMHEADER * )((char *)current_header + current_header->len);
- new_header->next = current_header->next; //and plug it into the chain
- new_header->prev = current_header;
- current_header->next = new_header;
- if (new_header->next)
- {
- new_header->next->prev = new_header;
+ if (!current_header->len)
+ { //This code works only for first_header in the list and only
+ current_header->len = size; //for first allocation
- new_header->len = size; //mark as used
+ else
+ {
+ //else create new header at the begin of spare
+ new_header = (MEMHEADER * )((char *)current_header + current_header->len);
+ new_header->next = current_header->next; //and plug it into the chain
+ new_header->prev = current_header;
+ current_header->next = new_header;
+ if (new_header->next)
+ {
+ new_header->next->prev = new_header;
+ }
+ new_header->len = size; //mark as used
{
pnew = (MEMHEADER xdata * )((char xdata *)_sdcc_prev_memheader + _sdcc_prev_memheader->len);
_sdcc_prev_memheader->next = pnew;
{
pnew = (MEMHEADER xdata * )((char xdata *)_sdcc_prev_memheader + _sdcc_prev_memheader->len);
_sdcc_prev_memheader->next = pnew;
+
+#if _SDCC_MALLOC_TYPE_MLH
+ pthis->next->prev = pnew;
+#endif
+
memmove(pnew, pthis, pthis->len);
pnew->len = size;
ret = MEM(pnew);
memmove(pnew, pthis, pthis->len);
pnew->len = size;
ret = MEM(pnew);
currFunc->regsUsed = bitVectSetBit (currFunc->regsUsed, i);
return ®s390[i];
}
currFunc->regsUsed = bitVectSetBit (currFunc->regsUsed, i);
return ®s390[i];
}
- /* otherwise look for specific type
- of register */
+ /* otherwise look for specific type of register */
if (regs390[i].isFree &&
regs390[i].type == type)
{
if (regs390[i].isFree &&
regs390[i].type == type)
{
/*-----------------------------------------------------------------*/
/* getRegBitNoSpil - get it cannot be spilt */
/*-----------------------------------------------------------------*/
/*-----------------------------------------------------------------*/
/* getRegBitNoSpil - get it cannot be spilt */
/*-----------------------------------------------------------------*/
static regs *getRegBitNoSpil()
{
regs *reg;
static regs *getRegBitNoSpil()
{
regs *reg;
/* just to make the compiler happy */
return 0;
}
/* just to make the compiler happy */
return 0;
}
/*-----------------------------------------------------------------*/
/* symHasReg - symbol has a given register */
/*-----------------------------------------------------------------*/
/* symHasReg - symbol has a given register */
for (i=0; i < sym->nRegs ; i++ ) {
if (sym->regType == REG_PTR)
sym->regs[i] = getRegPtrNoSpil ();
for (i=0; i < sym->nRegs ; i++ ) {
if (sym->regType == REG_PTR)
sym->regs[i] = getRegPtrNoSpil ();
+ else if (sym->regType == REG_BIT)
+ sym->regs[i] = getRegBitNoSpil ();
else
sym->regs[i] = getRegGprNoSpil ();
}
else
sym->regs[i] = getRegGprNoSpil ();
}