1 /*-------------------------------------------------------------------------
2 SDCCgen51.h - header file for code generation for 8051
4 Written By - Sandeep Dutta . sandeep.dutta@usa.net (1998)
5 PIC port - T. Scott Dattalo scott@dattalo.com (2000)
7 This program is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published by the
9 Free Software Foundation; either version 2, or (at your option) any
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21 In other words, you are welcome to use, share and improve this program.
22 You are forbidden to forbid anyone else to use, share and improve
23 what you give them. Help stamp out software-hoarding!
24 -------------------------------------------------------------------------*/
26 #ifndef SDCCGENPIC14_H
27 #define SDCCGENPIC14_H
29 extern int debug_verbose;
32 /*fprintf (stderr, "%s:%u:%s: *{*\n", __FILE__, __LINE__, __FUNCTION__);*/ \
33 if (options.debug || debug_verbose) { \
34 emitpComment ("; %s:%u:%s *{*", __FILE__, __LINE__, __FUNCTION__); \
38 /*fprintf (stderr, "%s:%u:%s: *}*\n", __FILE__, __LINE__, __FUNCTION__);*/ \
39 if (options.debug || debug.verbose) { \
40 emitpComment ("; %s:%u:%s *}*", __FILE__, __LINE__, __FUNCTION__); \
59 /* type asmop : a homogenised type for
60 all the different spaces an operand can be
65 short type; /* can have values
66 AOP_LIT - operand is a literal value
67 AOP_REG - is in registers
68 AOP_DIR - direct just a name
69 AOP_STK - should be pushed on stack this
70 can happen only for the result
71 AOP_IMMD - immediate value for eg. remateriazable
72 AOP_CRY - carry contains the value of this
73 AOP_STR - array of strings
75 short coff; /* current offset */
76 short size; /* total size */
77 unsigned code:1; /* is in Code space */
78 unsigned paged:1; /* in paged memory */
79 unsigned freed:1; /* already freed */
82 value *aop_lit; /* if literal */
83 regs *aop_reg[4]; /* array of registers */
84 char *aop_dir; /* if direct */
85 regs *aop_ptr; /* either -> to r0 or r1 */
86 char *aop_immd; /* if immediate others are implied */
87 int aop_stk; /* stack offset when AOP_STK */
88 char *aop_str[4]; /* just a string array containing the location */
95 void genpic14Code (iCode *);
97 extern unsigned fReturnSizePic;
100 #define AOP(op) op->aop
101 #define AOP_TYPE(op) AOP(op)->type
102 #define AOP_SIZE(op) AOP(op)->size
104 #define AOP_NEEDSACC(x) (AOP(x) && (AOP_TYPE(x) == AOP_CRY || AOP(x)->paged))
106 #define RESULTONSTACK(x) \
107 (IC_RESULT(x) && IC_RESULT(x)->aop && \
108 IC_RESULT(x)->aop->type == AOP_STK )
110 #define MOVA(x) if (strcmp(x,"a") && strcmp(x,"acc")) pic14_emitcode(";XXX mov","a,%s %s,%d",x,__FILE__,__LINE__);
111 #define CLRC pic14_emitcode(";XXX clr","c %s,%d",__FILE__,__LINE__);
113 #define BIT_NUMBER(x) (x & 7)
114 #define BIT_REGISTER(x) (x>>3)
123 #define FUNCTION_LABEL_INC 40
125 /*-----------------------------------------------------------------*/
126 /* Macros for emitting skip instructions */
127 /*-----------------------------------------------------------------*/
129 #define emitSKPC emitpcode(POC_BTFSS,popCopyGPR2Bit(PCOP(&pc_status),PIC_C_BIT))
130 #define emitSKPNC emitpcode(POC_BTFSC,popCopyGPR2Bit(PCOP(&pc_status),PIC_C_BIT))
131 #define emitSKPZ emitpcode(POC_BTFSS,popCopyGPR2Bit(PCOP(&pc_status),PIC_Z_BIT))
132 #define emitSKPNZ emitpcode(POC_BTFSC,popCopyGPR2Bit(PCOP(&pc_status),PIC_Z_BIT))
133 #define emitSKPDC emitpcode(POC_BTFSS,popCopyGPR2Bit(PCOP(&pc_status),PIC_DC_BIT))
134 #define emitSKPNDC emitpcode(POC_BTFSC,popCopyGPR2Bit(PCOP(&pc_status),PIC_DC_BIT))
135 #define emitCLRZ emitpcode(POC_BCF, popCopyGPR2Bit(PCOP(&pc_status),PIC_Z_BIT))
136 #define emitCLRC emitpcode(POC_BCF, popCopyGPR2Bit(PCOP(&pc_status),PIC_C_BIT))
137 #define emitCLRDC emitpcode(POC_BCF, popCopyGPR2Bit(PCOP(&pc_status),PIC_DC_BIT))
138 #define emitCLRIRP emitpcode(POC_BCF, popCopyGPR2Bit(PCOP(&pc_status),PIC_IRP_BIT))
139 #define emitSETZ emitpcode(POC_BSF, popCopyGPR2Bit(PCOP(&pc_status),PIC_Z_BIT))
140 #define emitSETC emitpcode(POC_BSF, popCopyGPR2Bit(PCOP(&pc_status),PIC_C_BIT))
141 #define emitSETDC emitpcode(POC_BSF, popCopyGPR2Bit(PCOP(&pc_status),PIC_DC_BIT))
142 #define emitSETIRP emitpcode(POC_BSF, popCopyGPR2Bit(PCOP(&pc_status),PIC_IRP_BIT))
144 int pic14_getDataSize(operand *op);
145 void emitpcode_real(PIC_OPCODE poc, pCodeOp *pcop);
146 #define emitpcode(poc,pcop) do { if (options.debug || debug_verbose) { emitpComment (" >>> %s:%d:%s", __FILE__, __LINE__, __FUNCTION__); } emitpcode_real(poc,pcop); } while(0)
147 void emitpComment (const char *fmt, ...);
148 void emitpLabel(int key);
149 void pic14_emitcode (char *inst,char *fmt, ...);
150 void DEBUGpic14_emitcode (char *inst,char *fmt, ...);
151 void pic14_emitDebuggerSymbol (char *);
152 asmop *newAsmop (short type);
153 bool pic14_sameRegs (asmop *aop1, asmop *aop2 );
154 char *aopGet (asmop *aop, int offset, bool bit16, bool dname);
157 bool genPlusIncr (iCode *ic);
158 void pic14_outBitAcc(operand *result);
159 void genPlus (iCode *ic);
160 void addSign(operand *result, int offset, int sign);
161 void genMinus (iCode *ic);
164 pCodeOp *popGetLabel(unsigned int key);
165 pCodeOp *popCopyReg(pCodeOpReg *pc);
166 pCodeOp *popCopyGPR2Bit(pCodeOp *pc, int bitval);
167 pCodeOp *popGetLit(unsigned int lit);
168 pCodeOp *popGetWithString(char *str, int isExtern);
169 pCodeOp *popRegFromString(char *str, int size, int offset);
170 pCodeOp *popGet (asmop *aop, int offset);//, bool bit16, bool dname);
171 pCodeOp *popGetAddr (asmop *aop, int offset, int index);
172 pCodeOp *popGetTempReg(void);
173 void popReleaseTempReg(pCodeOp *pcop);
176 void aopPut (asmop *aop, char *s, int offset);
177 void pic14_outAcc(operand *result);
178 void aopOp (operand *op, iCode *ic, bool result);
179 void pic14_outBitC(operand *result);
180 void pic14_toBoolean(operand *oper);
181 void freeAsmop (operand *op, asmop *aaop, iCode *ic, bool pop);
182 void mov2w (asmop *aop, int offset);
183 const char *pCodeOpType( pCodeOp *pcop);
185 int aop_isLitLike (asmop *aop);
186 int op_isLitLike (operand *op);