0225b917a3f8132028641166052775d6b2a3470e
[fw/sdcc] / src / pic16 / gen.h
1 /*-------------------------------------------------------------------------
2   gen.h - header file for code generation for PIC16
3
4              Written By -  Sandeep Dutta . sandeep.dutta@usa.net (1998)
5              PIC port   - T. Scott Dattalo scott@dattalo.com (2000)
6              PIC16 port   - Martin Dubuc m.dubuc@rogers.com (2000)
7
8    This program is free software; you can redistribute it and/or modify it
9    under the terms of the GNU General Public License as published by the
10    Free Software Foundation; either version 2, or (at your option) any
11    later version.
12    
13    This program is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17    
18    You should have received a copy of the GNU General Public License
19    along with this program; if not, write to the Free Software
20    Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21    
22    In other words, you are welcome to use, share and improve this program.
23    You are forbidden to forbid anyone else to use, share and improve
24    what you give them.   Help stamp out software-hoarding!  
25 -------------------------------------------------------------------------*/
26
27 #ifndef SDCCGENPIC16_H
28 #define SDCCGENPIC16_H
29
30 struct pCodeOp;
31
32 enum
33   {
34     AOP_LIT = 1,
35     AOP_REG,
36     AOP_DIR,
37     AOP_DPTR,
38     AOP_DPTR2,
39     AOP_R0,
40     AOP_R1,
41     AOP_STK,
42     AOP_IMMD,
43     AOP_STR,
44     AOP_CRY,
45     AOP_ACC,
46     AOP_FSR0,
47     AOP_FSR1,
48     AOP_FSR2,
49     AOP_PCODE,
50     AOP_STA             // asmop on stack
51   };
52
53 /* type asmop : a homogenised type for 
54    all the different spaces an operand can be
55    in */
56 typedef struct asmop
57   {
58
59     short type;                 /* can have values
60                                    AOP_LIT    -  operand is a literal value
61                                    AOP_REG    -  is in registers
62                                    AOP_DIR    -  direct just a name
63                                    AOP_DPTR   -  dptr contains address of operand
64                                    AOP_DPTR2  -  dptr2 contains address of operand (DS80C390 only).
65                                    AOP_R0/R1  -  r0/r1 contains address of operand               
66                                    AOP_STK    -  should be pushed on stack this
67                                    can happen only for the result
68                                    AOP_IMMD   -  immediate value for eg. remateriazable 
69                                    AOP_CRY    -  carry contains the value of this
70                                    AOP_STR    -  array of strings
71                                    AOP_ACC    -  result is in the acc:b pair
72                                  */
73     short coff;                 /* current offset */
74     short size;                 /* total size */
75     unsigned code:1;            /* is in Code space */
76     unsigned paged:1;           /* in paged memory  */
77     unsigned freed:1;           /* already freed    */
78     union
79       {
80         value *aop_lit;         /* if literal */
81         regs *aop_reg[4];       /* array of registers */
82         char *aop_dir;          /* if direct  */
83         regs *aop_ptr;          /* either -> to r0 or r1 */
84         char *aop_immd;         /* if immediate others are implied */
85         int aop_stk;            /* stack offset when AOP_STK */
86         char *aop_str[4];       /* just a string array containing the location */
87 /*      regs *aop_alloc_reg;     * points to a dynamically allocated register */
88         pCodeOp *pcop;
89         struct {
90           int stk;
91           pCodeOp *pop[4];
92         } stk;
93       }
94     aopu;
95   }
96 asmop;
97
98 void genpic16Code (iCode *);
99
100 extern unsigned pic16_fReturnSizePic;
101
102
103 #define AOP(op) op->aop
104 #define AOP_TYPE(op) AOP(op)->type
105 #define AOP_SIZE(op) AOP(op)->size
106 #define IS_AOP_PREG(x) (AOP(x) && (AOP_TYPE(x) == AOP_R1 || \
107                        AOP_TYPE(x) == AOP_R0))
108
109 #define AOP_NEEDSACC(x) (AOP(x) && (AOP_TYPE(x) == AOP_CRY ||  \
110                         AOP_TYPE(x) == AOP_DPTR || AOP_TYPE(x) == AOP_DPTR2 || \
111                          AOP(x)->paged)) 
112
113 #define AOP_INPREG(x) (x && (x->type == AOP_REG &&                        \
114                       (x->aopu.aop_reg[0] == pic16_regWithIdx(R0_IDX) || \
115                       x->aopu.aop_reg[0] == pic16_regWithIdx(R1_IDX) )))
116
117 #define RESULTONSTACK(x) \
118                          (IC_RESULT(x) && IC_RESULT(x)->aop && \
119                          IC_RESULT(x)->aop->type == AOP_STK )
120 #define RESULTONSTA(x)  (IC_RESULT(x) && IC_RESULT(x)->aop && IC_RESULT(x)->aop->type == AOP_STA)
121
122
123 #define MOVA(x) if (strcmp(x,"a") && strcmp(x,"acc")) pic16_emitcode(";XXX mov","a,%s  %s,%d",x,__FILE__,__LINE__);
124 #define CLRC    pic16_emitcode(";XXX clr","c %s,%d",__FILE__,__LINE__);
125
126
127 #define BIT_NUMBER(x) (x & 7)
128 #define BIT_REGISTER(x) (x>>3)
129
130
131 #define LSB     0
132 #define MSB16   1
133 #define MSB24   2
134 #define MSB32   3
135
136
137 #define FUNCTION_LABEL_INC  40
138
139 /*-----------------------------------------------------------------*/
140 /* Macros for emitting skip instructions                           */
141 /*-----------------------------------------------------------------*/
142
143 #define emitSKPC    pic16_emitpcode(POC_BTFSS,pic16_popCopyGPR2Bit(PCOP(&pic16_pc_status),PIC_C_BIT))
144 #define emitSKPNC   pic16_emitpcode(POC_BTFSC,pic16_popCopyGPR2Bit(PCOP(&pic16_pc_status),PIC_C_BIT))
145 #define emitSKPZ    pic16_emitpcode(POC_BTFSS,pic16_popCopyGPR2Bit(PCOP(&pic16_pc_status),PIC_Z_BIT))
146 #define emitSKPNZ   pic16_emitpcode(POC_BTFSC,pic16_popCopyGPR2Bit(PCOP(&pic16_pc_status),PIC_Z_BIT))
147 #define emitSKPDC   pic16_emitpcode(POC_BTFSS,pic16_popCopyGPR2Bit(PCOP(&pic16_pc_status),PIC_DC_BIT))
148 #define emitSKPNDC  pic16_emitpcode(POC_BTFSC,pic16_popCopyGPR2Bit(PCOP(&pic16_pc_status),PIC_DC_BIT))
149 #define emitCLRZ    pic16_emitpcode(POC_BCF,  pic16_popCopyGPR2Bit(PCOP(&pic16_pc_status),PIC_Z_BIT))
150 #define emitCLRC    pic16_emitpcode(POC_BCF,  pic16_popCopyGPR2Bit(PCOP(&pic16_pc_status),PIC_C_BIT))
151 #define emitCLRDC   pic16_emitpcode(POC_BCF,  pic16_popCopyGPR2Bit(PCOP(&pic16_pc_status),PIC_DC_BIT))
152 #define emitSETZ    pic16_emitpcode(POC_BSF,  pic16_popCopyGPR2Bit(PCOP(&pic16_pc_status),PIC_Z_BIT))
153 #define emitSETC    pic16_emitpcode(POC_BSF,  pic16_popCopyGPR2Bit(PCOP(&pic16_pc_status),PIC_C_BIT))
154 #define emitSETDC   pic16_emitpcode(POC_BSF,  pic16_popCopyGPR2Bit(PCOP(&pic16_pc_status),PIC_DC_BIT))
155
156 #define emitTOGC    pic16_emitpcode(POC_BTG,  pic16_popCopyGPR2Bit(PCOP(&pic16_pc_status),PIC_C_BIT))
157
158 int pic16_getDataSize(operand *op);
159 void pic16_emitpcode_real(PIC_OPCODE poc, pCodeOp *pcop);
160 #define pic16_emitpcode(poc,pcop)       do { if (pic16_pcode_verbose) pic16_emitpcomment ("%s:%u(%s):", __FILE__, __LINE__, __FUNCTION__); pic16_emitpcode_real(poc,pcop); } while(0)
161 void pic16_emitpLabel(int key);
162 void pic16_emitcode (char *inst,char *fmt, ...);
163 void DEBUGpic16_emitcode (char *inst,char *fmt, ...);
164 void pic16_emitDebuggerSymbol (char *);
165 bool pic16_sameRegs (asmop *aop1, asmop *aop2 );
166 char *pic16_aopGet (asmop *aop, int offset, bool bit16, bool dname);
167 void DEBUGpic16_pic16_AopType(int line_no, operand *left, operand *right, operand *result);
168 void DEBUGpic16_pic16_AopTypeSign(int line_no, operand *left, operand *right, operand *result);
169
170
171 bool pic16_genPlusIncr (iCode *ic);
172 void pic16_outBitAcc(operand *result);
173 void pic16_genPlusBits (iCode *ic);
174 void pic16_genPlus (iCode *ic);
175 bool pic16_genMinusDec (iCode *ic);
176 void pic16_addSign(operand *result, int offset, int sign);
177 void pic16_genMinusBits (iCode *ic);
178 void pic16_genMinus (iCode *ic);
179 void pic16_genLeftShiftLiteral (operand *left, operand *right, operand *result, iCode *ic);
180
181 pCodeOp *pic16_popGet2p(pCodeOp *src, pCodeOp *dst);
182 void pic16_emitpcomment (char *fmt, ...);
183
184 pCodeOp *pic16_popGetLabel(unsigned int key);
185 pCodeOp *pic16_popCopyReg(pCodeOpReg *pc);
186 pCodeOp *pic16_popCopyGPR2Bit(pCodeOp *pc, int bitval);
187 pCodeOp *pic16_popGetLit(int lit);
188 pCodeOp *pic16_popGetLit2(int lit, pCodeOp *arg2);
189 pCodeOp *popGetWithString(char *str);
190 pCodeOp *pic16_popGet (asmop *aop, int offset);//, bool bit16, bool dname);
191 pCodeOp *pic16_popGetTempReg(int lock);
192 pCodeOp *pic16_popGetTempRegCond(bitVect *, bitVect *, int lock);
193 void pic16_popReleaseTempReg(pCodeOp *pcop, int lock);
194
195 pCodeOp *pic16_popCombine2(pCodeOpReg *src, pCodeOpReg *dst, int noalloc);
196
197 void pic16_aopPut (asmop *aop, char *s, int offset);
198 void pic16_outAcc(operand *result);
199 void pic16_aopOp (operand *op, iCode *ic, bool result);
200 void pic16_outBitC(operand *result);
201 void pic16_toBoolean(operand *oper);
202 void pic16_freeAsmop (operand *op, asmop *aaop, iCode *ic, bool pop);
203 const char *pic16_pCodeOpType(  pCodeOp *pcop);
204 int pic16_my_powof2 (unsigned long num);
205
206 void pic16_mov2w (asmop *aop, int offset);
207 void pic16_mov2f(asmop *dst, asmop *src, int offset);
208
209 void dumpiCode(iCode *lic);
210
211 int inWparamList(char *s);
212
213 #include "device.h"
214
215 #define DUMP_FUNCTION_ENTRY     1
216 #define DUMP_FUNCTION_EXIT      0
217
218 #if DUMP_FUNCTION_ENTRY
219 #define FENTRY  if(pic16_options.debgen&2)pic16_emitpcomment("**{\t%d %s", __LINE__, __FUNCTION__)
220 #define FENTRY2 if(pic16_options.debgen&2)pic16_emitpcomment("**{\t%d %s", __LINE__, __FUNCTION__)
221 #else
222 #define FENTRY
223 #define FENTRY2
224 #endif
225
226 #if DUMP_FUNCTION_EXIT
227 #define FEXIT   if(pic16_options.debgen&2)pic16_emitpcomment("; **}", "%d %s", __LINE__, __FUNCTION__)
228 #define FEXIT2  if(pic16_options.debgen&2)pic16_emitpcomment("**{\t%d %s", __LINE__, __FUNCTION__)
229 #else
230 #define FEXIT
231 #define FEXIT2
232 #endif
233
234 #define ERROR   werror(W_POSSBUG2, __FILE__, __LINE__)
235 #endif