some -xstack related stuff
[fw/sdcc] / src / mcs51 / gen.c
index 1b99d94be5a6f52c197086d45ded8b1bae94108b..a960c041a885466b338f4ae27bdc34ed7829b1ed 100644 (file)
@@ -53,6 +53,7 @@
 #include "gen.h"
 
 char *aopLiteral (value *val, int offset);
+extern int allocInfo;
 
 /* this is the down and dirty file with all kinds of 
    kludgy & hacky stuff. This is what it is all about
@@ -90,7 +91,8 @@ static void saverbank (int, iCode *,bool);
                          IC_RESULT(x)->aop->type == AOP_STK )
 
 #define MOVA(x) if (strcmp(x,"a") && strcmp(x,"acc")) emitcode("mov","a,%s",x);
-#define CLRC    emitcode("clr","c");
+#define CLRC    emitcode("clr","c")
+#define SETC    emitcode("setb","c")
 
 static lineNode *lineHead = NULL;
 static lineNode *lineCurr = NULL;
@@ -1367,15 +1369,19 @@ static void genUminus (iCode *ic)
     /* otherwise subtract from zero */
     size = AOP_SIZE(IC_LEFT(ic));
     offset = 0 ;
-    CLRC ;
+    //CLRC ;
     while(size--) {
         char *l = aopGet(AOP(IC_LEFT(ic)),offset,FALSE,FALSE);
         if (!strcmp(l,"a")) {
-            emitcode("cpl","a");
-            emitcode("inc","a");
+         if (offset==0)
+           SETC;
+         emitcode("cpl","a");
+         emitcode("addc","a,#0");
         } else {
-            emitcode("clr","a");
-            emitcode("subb","a,%s",l);
+         if (offset==0)
+           CLRC;
+         emitcode("clr","a");
+         emitcode("subb","a,%s",l);
         }       
         aopPut(AOP(IC_RESULT(ic)),"a",offset++);
     }
@@ -2100,6 +2106,17 @@ static void genFunction (iCode *ic)
     if (IS_RENT(sym->etype) || options.stackAuto) {
 
        if (options.useXstack) {
+               /* set up the PAGE for the xternal stack */
+               if (sym->args) {
+                       emitcode("push","dph");
+                       emitcode("push","acc");
+               }
+               emitcode("mov","dph,__page_no__");
+               emitcode("movx","a,@dptr");
+               if (sym->args) {
+                       emitcode("pop","acc");
+                       emitcode("pop","dph");
+               }               
            emitcode("mov","r0,%s",spname);
            emitcode("mov","a,_bp");
            emitcode("movx","@r0,a");
@@ -7113,7 +7130,7 @@ static void genAssign (iCode *ic)
     }
     
 release:
-    freeAsmop (right,NULL,ic,FALSE);
+    freeAsmop (right,NULL,ic,TRUE);
     freeAsmop (result,NULL,ic,TRUE);
 }   
 
@@ -7152,6 +7169,7 @@ static void genCast (iCode *ic)
 {
     operand *result = IC_RESULT(ic);
     link *ctype = operandType(IC_LEFT(ic));
+    link *rtype = operandType(IC_RIGHT(ic));
     operand *right = IC_RIGHT(ic);
     int size, offset ;
 
@@ -7224,20 +7242,6 @@ static void genCast (iCode *ic)
            else {
                /* we have to go by the storage class */
                p_type = PTR_TYPE(SPEC_OCLS(etype));
-
-/*             if (SPEC_OCLS(etype)->codesp )  */
-/*                 p_type = CPOINTER ;  */
-/*             else */
-/*                 if (SPEC_OCLS(etype)->fmap && !SPEC_OCLS(etype)->paged) */
-/*                     p_type = FPOINTER ; */
-/*                 else */
-/*                     if (SPEC_OCLS(etype)->fmap && SPEC_OCLS(etype)->paged) */
-/*                         p_type = PPOINTER; */
-/*                     else */
-/*                         if (SPEC_OCLS(etype) == idata ) */
-/*                             p_type = IPOINTER ; */
-/*                         else */
-/*                             p_type = POINTER ; */
            }
                
            /* the first two bytes are known */
@@ -7299,10 +7303,10 @@ static void genCast (iCode *ic)
         offset++;
     }
 
-    /* now depending on the sign of the destination */
+    /* now depending on the sign of the source && destination */
     size = AOP_SIZE(result) - AOP_SIZE(right);
     /* if unsigned or not an integral type */
-    if (SPEC_USIGN(ctype) || !IS_SPEC(ctype)) {
+    if (SPEC_USIGN(rtype) || !IS_SPEC(rtype)) {
         while (size--)
             aopPut(AOP(result),zero,offset++);
     } else {
@@ -7421,6 +7425,9 @@ void gen51Code (iCode *lic)
 
     lineHead = lineCurr = NULL;
 
+    /* print the allocation information */
+    if (allocInfo)
+       printAllocInfo( currFunc, codeOutFile);
     /* if debug information required */
 /*     if (options.debug && currFunc) { */
     if (currFunc) {
@@ -7656,6 +7663,6 @@ void gen51Code (iCode *lic)
        peepHole (&lineHead);
 
     /* now do the actual printing */
-    printLine (lineHead,codeOutFile);
+    printLine (lineHead,codeOutFile);    
     return;
 }