* src/pic16/glue.c, src/SDCC.y, src/SDCCast.c, src/SDCCglue.c,
[fw/sdcc] / src / pic / gen.h
index 74d30d70b20b1dd2e5c63d8e3e4a2dbb41af6637..64198360a7deb1dcd069f93b21c60a7d92583b94 100644 (file)
@@ -2,78 +2,83 @@
   SDCCgen51.h - header file for code generation for 8051
 
              Written By -  Sandeep Dutta . sandeep.dutta@usa.net (1998)
   SDCCgen51.h - header file for code generation for 8051
 
              Written By -  Sandeep Dutta . sandeep.dutta@usa.net (1998)
-            PIC port   - T. Scott Dattalo scott@dattalo.com (2000)
+             PIC port   - T. Scott Dattalo scott@dattalo.com (2000)
 
    This program is free software; you can redistribute it and/or modify it
    under the terms of the GNU General Public License as published by the
    Free Software Foundation; either version 2, or (at your option) any
    later version.
 
    This program is free software; you can redistribute it and/or modify it
    under the terms of the GNU General Public License as published by the
    Free Software Foundation; either version 2, or (at your option) any
    later version.
-   
+
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
-   
+
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-   
+
    In other words, you are welcome to use, share and improve this program.
    You are forbidden to forbid anyone else to use, share and improve
    In other words, you are welcome to use, share and improve this program.
    You are forbidden to forbid anyone else to use, share and improve
-   what you give them.   Help stamp out software-hoarding!  
+   what you give them.   Help stamp out software-hoarding!
 -------------------------------------------------------------------------*/
 
 #ifndef SDCCGENPIC14_H
 #define SDCCGENPIC14_H
 
 -------------------------------------------------------------------------*/
 
 #ifndef SDCCGENPIC14_H
 #define SDCCGENPIC14_H
 
-extern int debug_verbose;
+#include "common.h"
 
 
-#define FENTRY do {                                                                    \
-       /*fprintf (stderr, "%s:%u:%s: *{*\n", __FILE__, __LINE__, __FUNCTION__);*/      \
-       if (options.debug || debug_verbose) {                                           \
-               emitpComment ("; %s:%u:%s *{*", __FILE__, __LINE__, __FUNCTION__);      \
-       }                                                                               \
+#include "main.h"
+#include "pcode.h"
+#include "ralloc.h"
+
+#define FENTRY do {                                                                     \
+        /*fprintf (stderr, "%s:%u:%s: *{*\n", __FILE__, __LINE__, __FUNCTION__);*/      \
+        if (options.debug || debug_verbose) {                                           \
+                emitpComment ("; %s:%u:%s *{*", __FILE__, __LINE__, __FUNCTION__);      \
+        }                                                                               \
 } while (0)
 } while (0)
-#define FEXIT do {                                                                     \
-       /*fprintf (stderr, "%s:%u:%s: *}*\n", __FILE__, __LINE__, __FUNCTION__);*/      \
-       if (options.debug || debug.verbose) {                                           \
-               emitpComment ("; %s:%u:%s *}*", __FILE__, __LINE__, __FUNCTION__);      \
-       }                                                                               \
+#define FEXIT do {                                                                      \
+        /*fprintf (stderr, "%s:%u:%s: *}*\n", __FILE__, __LINE__, __FUNCTION__);*/      \
+        if (options.debug || debug.verbose) {                                           \
+                emitpComment ("; %s:%u:%s *}*", __FILE__, __LINE__, __FUNCTION__);      \
+        }                                                                               \
 } while (0)
 
 } while (0)
 
-struct pCodeOp;
-
 enum
 {
   AOP_LIT = 1,
 enum
 {
   AOP_LIT = 1,
-  AOP_REG, AOP_DIR,
-  AOP_STK, AOP_IMMD, AOP_STR,
+  AOP_REG,
+  AOP_DIR,
+  AOP_STK,
+  AOP_IMMD,
+  AOP_STR,
   AOP_CRY,
   AOP_PCODE
 
 };
 
   AOP_CRY,
   AOP_PCODE
 
 };
 
-/* type asmop : a homogenised type for 
+/* type asmop : a homogenised type for
    all the different spaces an operand can be
    in */
 typedef struct asmop
 {
 
   short type;  /* can have values
    all the different spaces an operand can be
    in */
 typedef struct asmop
 {
 
   short type;  /* can have values
-                 AOP_LIT    -  operand is a literal value
-                 AOP_REG    -  is in registers
-                 AOP_DIR    -  direct just a name
-                 AOP_STK    -  should be pushed on stack this
-                 can happen only for the result
-                 AOP_IMMD   -  immediate value for eg. remateriazable 
-                 AOP_CRY    -  carry contains the value of this
-                 AOP_STR    -  array of strings
-              */
-  short coff;          /* current offset */
-  short size;          /* total size */
+                  AOP_LIT    -  operand is a literal value
+                  AOP_REG    -  is in registers
+                  AOP_DIR    -  direct just a name
+                  AOP_STK    -  should be pushed on stack this
+                  can happen only for the result
+                  AOP_IMMD   -  immediate value for eg. remateriazable
+                  AOP_CRY    -  carry contains the value of this
+                  AOP_STR    -  array of strings
+               */
+  short coff;           /* current offset */
+  short size;           /* total size */
   unsigned code:1;      /* is in Code space */
   unsigned code:1;      /* is in Code space */
-  unsigned paged:1;    /* in paged memory  */
-  unsigned freed:1;    /* already freed    */
+  unsigned paged:1;     /* in paged memory  */
+  unsigned freed:1;     /* already freed    */
   union
   {
     value *aop_lit;     /* if literal */
   union
   {
     value *aop_lit;     /* if literal */
@@ -89,8 +94,6 @@ typedef struct asmop
 }
 asmop;
 
 }
 asmop;
 
-void genpic14Code (iCode *);
-
 extern unsigned fReturnSizePic;
 
 
 extern unsigned fReturnSizePic;
 
 
@@ -107,18 +110,11 @@ extern unsigned fReturnSizePic;
 #define MOVA(x) if (strcmp(x,"a") && strcmp(x,"acc")) pic14_emitcode(";XXX mov","a,%s  %s,%d",x,__FILE__,__LINE__);
 #define CLRC    pic14_emitcode(";XXX clr","c %s,%d",__FILE__,__LINE__);
 
 #define MOVA(x) if (strcmp(x,"a") && strcmp(x,"acc")) pic14_emitcode(";XXX mov","a,%s  %s,%d",x,__FILE__,__LINE__);
 #define CLRC    pic14_emitcode(";XXX clr","c %s,%d",__FILE__,__LINE__);
 
-#define BIT_NUMBER(x) (x & 7)
-#define BIT_REGISTER(x) (x>>3)
-
-
 #define LSB     0
 #define MSB16   1
 #define MSB24   2
 #define MSB32   3
 
 #define LSB     0
 #define MSB16   1
 #define MSB24   2
 #define MSB32   3
 
-
-#define FUNCTION_LABEL_INC  40
-
 /*-----------------------------------------------------------------*/
 /* Macros for emitting skip instructions                           */
 /*-----------------------------------------------------------------*/
 /*-----------------------------------------------------------------*/
 /* Macros for emitting skip instructions                           */
 /*-----------------------------------------------------------------*/
@@ -140,47 +136,39 @@ extern unsigned fReturnSizePic;
 
 int pic14_getDataSize(operand *op);
 void emitpcode_real(PIC_OPCODE poc, pCodeOp *pcop);
 
 int pic14_getDataSize(operand *op);
 void emitpcode_real(PIC_OPCODE poc, pCodeOp *pcop);
-#define emitpcode(poc,pcop)    do { if (options.debug || debug_verbose) { emitpComment (" >>> %s:%d:%s", __FILE__, __LINE__, __FUNCTION__); } emitpcode_real(poc,pcop); } while(0)
+#define emitpcode(poc,pcop)     do { if (options.debug || debug_verbose) { emitpComment (" >>> %s:%d:%s", __FILE__, __LINE__, __FUNCTION__); } emitpcode_real(poc,pcop); } while(0)
 void emitpComment (const char *fmt, ...);
 void emitpLabel(int key);
 void pic14_emitcode (char *inst,char *fmt, ...);
 void DEBUGpic14_emitcode (char *inst,char *fmt, ...);
 void pic14_emitDebuggerSymbol (char *);
 void emitpComment (const char *fmt, ...);
 void emitpLabel(int key);
 void pic14_emitcode (char *inst,char *fmt, ...);
 void DEBUGpic14_emitcode (char *inst,char *fmt, ...);
 void pic14_emitDebuggerSymbol (char *);
-asmop *newAsmop (short type);
 bool pic14_sameRegs (asmop *aop1, asmop *aop2 );
 char *aopGet (asmop *aop, int offset, bool bit16, bool dname);
 bool pic14_sameRegs (asmop *aop1, asmop *aop2 );
 char *aopGet (asmop *aop, int offset, bool bit16, bool dname);
+void DEBUGpic14_AopType(int line_no, operand *left, operand *right, operand *result);
+void genpic14Code (iCode *lic);
 
 
 
 
-bool genPlusIncr (iCode *ic);
-void pic14_outBitAcc(operand *result);
-void genPlus (iCode *ic);
-bool genMinusDec (iCode *ic);
-void addSign(operand *result, int offset, int sign);
-void genMinus (iCode *ic);
-
-
-pCodeOp *popGetLabel(unsigned int key);
-pCodeOp *popCopyReg(pCodeOpReg *pc);
-pCodeOp *popCopyGPR2Bit(pCodeOp *pc, int bitval);
-pCodeOp *popGetLit(unsigned int lit);
-pCodeOp *popGetWithString(char *str, int isExtern);
-pCodeOp *popRegFromString(char *str, int size, int offset);
 pCodeOp *popGet (asmop *aop, int offset);//, bool bit16, bool dname);
 pCodeOp *popGetAddr (asmop *aop, int offset, int index);
 pCodeOp *popGet (asmop *aop, int offset);//, bool bit16, bool dname);
 pCodeOp *popGetAddr (asmop *aop, int offset, int index);
-pCodeOp *popGetTempReg(void);
-void popReleaseTempReg(pCodeOp *pcop);
+pCodeOp *popGetExternal (char *str, int isReg);
+pCodeOp *popGetLabel(unsigned int key);
+pCodeOp *popGetLit(unsigned int lit);
 
 
 void aopPut (asmop *aop, char *s, int offset);
 void pic14_outAcc(operand *result);
 void aopOp (operand *op, iCode *ic, bool result);
 
 
 void aopPut (asmop *aop, char *s, int offset);
 void pic14_outAcc(operand *result);
 void aopOp (operand *op, iCode *ic, bool result);
-void pic14_outBitC(operand *result);
-void pic14_toBoolean(operand *oper);
 void freeAsmop (operand *op, asmop *aaop, iCode *ic, bool pop);
 void mov2w (asmop *aop, int offset);
 void freeAsmop (operand *op, asmop *aaop, iCode *ic, bool pop);
 void mov2w (asmop *aop, int offset);
-const char *pCodeOpType(  pCodeOp *pcop);
-
-int aop_isLitLike (asmop *aop);
 int op_isLitLike (operand *op);
 
 int op_isLitLike (operand *op);
 
+/*
+ * From genarith.c:
+ */
+const char *AopType(short type);
+const char *pCodeOpType(pCodeOp *pcop);
+void genPlus (iCode *ic);
+void addSign(operand *result, int offset, int sign);
+void genMinus (iCode *ic);
+
 #endif
 #endif