* as/mcs51/asdata.c: changed ctype['['] to BINOP
[fw/sdcc] / src / pic16 / pcode.h
index ae1e1ea560c38c6066e881c6a678b5b232cbaf71..b08204793b39bbe70ee8b70f8b5eb65112dff862 100644 (file)
@@ -302,7 +302,7 @@ typedef enum
   PC_CSOURCE,     /* C-Source Line  */
   PC_ASMDIR,     /* Assembler directive */
   PC_BAD,         /* Mark the pCode object as being bad */
-  PC_INFO         /* pCode informatio node, used primarily in optimizing */
+  PC_INFO         /* pCode information node, used primarily in optimizing */
 } PC_TYPE;
 
 
@@ -326,6 +326,8 @@ typedef enum
 {
   OPT_BEGIN,             /* mark beginning of optimization block */
   OPT_END,               /* mark ending of optimization block */
+  OPT_JUMPTABLE_BEGIN,   /* mark beginning of a jumptable */
+  OPT_JUMPTABLE_END      /* mark end of jumptable */
 } OPT_TYPE;
 
 /***********************************************************************
@@ -404,6 +406,7 @@ typedef struct pCodeOpBit
                                 just a bit of a register */
 } pCodeOpBit;
 #endif
+
 typedef struct pCodeOpLit
 {
   pCodeOp pcop;
@@ -443,6 +446,8 @@ typedef struct pCodeOpReg
   struct regs *r;
   int instance;    // byte # of Multi-byte registers
   struct pBlock *pb;
+
+  pCodeOp *pcop2;      // second memory operand (NEEDED IN gen.c:pic16_popGet2p (pCodeOpReg casted into pCodeOpReg2) 
 } pCodeOpReg;
 
 typedef struct pCodeOpReg2
@@ -577,6 +582,7 @@ typedef struct pCodeCSource
  contiguous chunk.
 
 **************************************************/
+struct defmap_s; // defined in pcode.c
 
 typedef struct pCodeFlow
 {
@@ -609,6 +615,13 @@ typedef struct pCodeFlow
 
   set *registers;/* Registers used in this flow */
 
+  struct defmap_s *defmap;     /* chronologically ordered list of definitions performed
+                          in this flow (most recent at the front) */
+  struct defmap_s *in_vals;    /* definitions of all symbols reaching this flow
+                                * symbols with multiple different definitions are stored
+                                * with an assigned value of 0. */
+  struct defmap_s *out_vals;   /* definitions valid AFTER thie flow */
+
 } pCodeFlow;
 
 /*************************************************
@@ -959,6 +972,7 @@ typedef struct peepCommand {
 #define isPCW(x)        ((PCODE(x)->type == PC_WILD))
 #define isPCCS(x)       ((PCODE(x)->type == PC_CSOURCE))
 #define isPCAD(x)      ((PCODE(x)->type == PC_ASMDIR))
+#define isPCINFO(x)     ((PCODE(x)->type == PC_INFO))
 
 #define isCALL(x)       ((isPCI(x)) && (PCI(x)->op == POC_CALL))
 #define isSTATUS_REG(r) ((r)->pc_type == PO_STATUS)
@@ -1005,13 +1019,17 @@ pCodeOp *pic16_newpCodeOpImmd(char *name, int offset, int index, int code_space)
 pCodeOp *pic16_newpCodeOpLit(int lit);
 pCodeOp *pic16_newpCodeOpLit2(int lit, pCodeOp *arg2);
 pCodeOp *pic16_newpCodeOpBit(char *name, int bit,int inBitSpace, PIC_OPTYPE subt);
+pCodeOp *pic16_newpCodeOpBit_simple (struct asmop *op, int offs, int bit);
 pCodeOp *pic16_newpCodeOpRegFromStr(char *name);
+pCodeOp *pic16_newpCodeOpReg(int rIdx);
 pCodeOp *pic16_newpCodeOp(char *name, PIC_OPTYPE p);
+pCodeOp *pic16_newpCodeOpRegNotVect(bitVect *bv);
 pCodeOp *pic16_pCodeOpCopy(pCodeOp *pcop);
 
 pCode *pic16_newpCodeInfo(INFO_TYPE type, pCodeOp *pcop);
 pCodeOp *pic16_newpCodeOpOpt(OPT_TYPE type, char *key);
 pCodeOp *pic16_newpCodeOpLocalRegs(LR_TYPE type);
+pCodeOp *pic16_newpCodeOpReg(int rIdx);
 
 pCode * pic16_findNextInstruction(pCode *pci);
 pCode * pic16_findNextpCode(pCode *pc, PC_TYPE pct);
@@ -1026,9 +1044,15 @@ extern void pic16_pcode_test(void);
 extern int pic16_debug_verbose;
 extern int pic16_pcode_verbose;
 
+extern char *LR_TYPE_STR[];
+
+
 #ifndef debugf
 //#define debugf(frm, rest...)       _debugf(__FILE__, __LINE__, frm, rest)
 #define debugf(frm, rest)      _debugf(__FILE__, __LINE__, frm, rest)
+#define debugf2(frm, arg1, arg2)       _debugf(__FILE__, __LINE__, frm, arg1, arg2)
+#define debugf3(frm, arg1, arg2, arg3) _debugf(__FILE__, __LINE__, frm, arg1, arg2, arg3)
+
 #endif
 
 extern void _debugf(char *f, int l, char *frm, ...);
@@ -1042,15 +1066,15 @@ extern pCodeOpReg pic16_pc_status;
 extern pCodeOpReg pic16_pc_intcon;
 extern pCodeOpReg pic16_pc_pcl;
 extern pCodeOpReg pic16_pc_pclath;
-extern pCodeOpReg pic16_pc_pclatu; // patch 14
+extern pCodeOpReg pic16_pc_pclatu;
 extern pCodeOpReg pic16_pc_wreg;
-extern pCodeOpReg pic16_pc_tosl; // patch 14
-extern pCodeOpReg pic16_pc_tosh; // patch 14
-extern pCodeOpReg pic16_pc_tosu; // patch 14
-extern pCodeOpReg pic16_pc_tblptrl; // patch 15
-extern pCodeOpReg pic16_pc_tblptrh; //
-extern pCodeOpReg pic16_pc_tblptru; //
-extern pCodeOpReg pic16_pc_tablat;  // patch 15
+extern pCodeOpReg pic16_pc_tosl;
+extern pCodeOpReg pic16_pc_tosh;
+extern pCodeOpReg pic16_pc_tosu;
+extern pCodeOpReg pic16_pc_tblptrl;
+extern pCodeOpReg pic16_pc_tblptrh;
+extern pCodeOpReg pic16_pc_tblptru;
+extern pCodeOpReg pic16_pc_tablat;
 extern pCodeOpReg pic16_pc_bsr;
 extern pCodeOpReg pic16_pc_fsr0;
 extern pCodeOpReg pic16_pc_fsr0l;
@@ -1086,6 +1110,20 @@ extern pCodeOpReg pic16_pc_kzero;
 extern pCodeOpReg pic16_pc_wsave;     /* wsave and ssave are used to save W and the Status */
 extern pCodeOpReg pic16_pc_ssave;     /* registers during an interrupt */
 
+extern pCodeOpReg *pic16_stackpnt_lo;
+extern pCodeOpReg *pic16_stackpnt_hi;
+extern pCodeOpReg *pic16_stack_postinc;
+extern pCodeOpReg *pic16_stack_postdec;
+extern pCodeOpReg *pic16_stack_preinc;
+extern pCodeOpReg *pic16_stack_plusw;
+
+extern pCodeOpReg *pic16_framepnt_lo;
+extern pCodeOpReg *pic16_framepnt_hi;
+extern pCodeOpReg *pic16_frame_postinc;
+extern pCodeOpReg *pic16_frame_postdec;
+extern pCodeOpReg *pic16_frame_preinc;
+extern pCodeOpReg *pic16_frame_plusw;
+
 extern pCodeOpReg pic16_pc_gpsimio;
 extern pCodeOpReg pic16_pc_gpsimio2;