X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fpic16%2Fpcode.h;h=cf3d19113f359f1e9848a413fe2b8186abb5ccd3;hb=fc9f8d30f7f7ee34e195357753de502eb429a585;hp=43dd89f47367ffdcb6690c7b3b3c5c2dfbe29f1b;hpb=35dd84251b9d153bb48ad98be9c5eae77799cb42;p=fw%2Fsdcc diff --git a/src/pic16/pcode.h b/src/pic16/pcode.h index 43dd89f4..cf3d1911 100644 --- a/src/pic16/pcode.h +++ b/src/pic16/pcode.h @@ -86,6 +86,23 @@ struct regs; #endif +#ifdef WORDS_BIGENDIAN + #define _ENDIAN(x) (3-x) +#else + #define _ENDIAN(x) (x) +#endif + + +#define BYTE_IN_LONG(x,b) ((x>>(8*_ENDIAN(b)))&0xff) + + +/*********************************************************************** + * Extended Instruction Set/Indexed Literal Offset Mode * + * Set this macro to enable code generation with the extended * + * instruction set and the new Indexed Literal Offset Mode * + ***********************************************************************/ +#define XINST 1 + /*********************************************************************** * PIC status bits - this will move into device dependent headers ***********************************************************************/ @@ -282,6 +299,8 @@ typedef enum POC_XORFW, POC_BANKSEL + + /* pseudo-instructions */ } PIC_OPCODE; @@ -302,7 +321,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; @@ -406,10 +425,12 @@ typedef struct pCodeOpBit just a bit of a register */ } pCodeOpBit; #endif + typedef struct pCodeOpLit { pCodeOp pcop; int lit; + pCodeOp *arg2; /* needed as pCodeOpLit and pCodeOpLit2 are not separable via their type (PO_LITERAL) */ } pCodeOpLit; typedef struct pCodeOpLit2 @@ -445,6 +466,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 @@ -579,6 +602,7 @@ typedef struct pCodeCSource contiguous chunk. **************************************************/ +struct defmap_s; // defined in pcode.c typedef struct pCodeFlow { @@ -611,6 +635,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; /************************************************* @@ -961,6 +992,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) @@ -996,7 +1028,7 @@ void pCodePeepInit(void); void pic16_pBlockConvert2ISR(pBlock *pb); void pic16_pBlockConvert2Absolute(pBlock *pb); void pic16_initDB(void); -void pic16_emitDB(char c, char ptype, void *p); // Add DB directives to a pBlock +void pic16_emitDB(int c, char ptype, void *p); // Add DB directives to a pBlock void pic16_emitDS(char *s, char ptype, void *p); void pic16_flushDB(char ptype, void *p); // Add pending DB data to a pBlock @@ -1005,15 +1037,20 @@ pCode *pic16_newpCodeAsmDir(char *asdir, char *argfmt, ...); pCodeOp *pic16_newpCodeOpLabel(char *name, int key); pCodeOp *pic16_newpCodeOpImmd(char *name, int offset, int index, int code_space); pCodeOp *pic16_newpCodeOpLit(int lit); +pCodeOp *pic16_newpCodeOpLit12(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); @@ -1028,6 +1065,9 @@ 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) @@ -1047,15 +1087,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; @@ -1091,6 +1131,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;