* src/hc08/gen.c (hc08_emitDebuggerSymbol),
[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_PCODE
47   };
48
49 /* type asmop : a homogenised type for 
50    all the different spaces an operand can be
51    in */
52 typedef struct asmop
53   {
54
55     short type;                 /* can have values
56                                    AOP_LIT    -  operand is a literal value
57                                    AOP_REG    -  is in registers
58                                    AOP_DIR    -  direct just a name
59                                    AOP_DPTR   -  dptr contains address of operand
60                                    AOP_DPTR2  -  dptr2 contains address of operand (DS80C390 only).
61                                    AOP_R0/R1  -  r0/r1 contains address of operand               
62                                    AOP_STK    -  should be pushed on stack this
63                                    can happen only for the result
64                                    AOP_IMMD   -  immediate value for eg. remateriazable 
65                                    AOP_CRY    -  carry contains the value of this
66                                    AOP_STR    -  array of strings
67                                    AOP_ACC    -  result is in the acc:b pair
68                                  */
69     short coff;                 /* current offset */
70     short size;                 /* total size */
71     unsigned code:1;            /* is in Code space */
72     unsigned paged:1;           /* in paged memory  */
73     unsigned freed:1;           /* already freed    */
74     union
75       {
76         value *aop_lit;         /* if literal */
77         regs *aop_reg[4];       /* array of registers */
78         char *aop_dir;          /* if direct  */
79         regs *aop_ptr;          /* either -> to r0 or r1 */
80         char *aop_immd;         /* if immediate others are implied */
81         int aop_stk;            /* stack offset when AOP_STK */
82         char *aop_str[4];       /* just a string array containing the location */
83 /*      regs *aop_alloc_reg;     * points to a dynamically allocated register */
84         pCodeOp *pcop;
85       }
86     aopu;
87   }
88 asmop;
89
90 void genpic16Code (iCode *);
91
92 //extern char *fReturnpic16[];
93 //extern char *fReturn390[];
94 extern unsigned pic16_fReturnSizePic;
95 //extern char **fReturn;
96
97
98 #define AOP(op) op->aop
99 #define AOP_TYPE(op) AOP(op)->type
100 #define AOP_SIZE(op) AOP(op)->size
101 #define IS_AOP_PREG(x) (AOP(x) && (AOP_TYPE(x) == AOP_R1 || \
102                        AOP_TYPE(x) == AOP_R0))
103
104 #define AOP_NEEDSACC(x) (AOP(x) && (AOP_TYPE(x) == AOP_CRY ||  \
105                         AOP_TYPE(x) == AOP_DPTR || AOP_TYPE(x) == AOP_DPTR2 || \
106                          AOP(x)->paged)) 
107
108 #define AOP_INPREG(x) (x && (x->type == AOP_REG &&                        \
109                       (x->aopu.aop_reg[0] == pic16_regWithIdx(R0_IDX) || \
110                       x->aopu.aop_reg[0] == pic16_regWithIdx(R1_IDX) )))
111
112 #define RESULTONSTACK(x) \
113                          (IC_RESULT(x) && IC_RESULT(x)->aop && \
114                          IC_RESULT(x)->aop->type == AOP_STK )
115
116 #define MOVA(x) if (strcmp(x,"a") && strcmp(x,"acc")) pic16_emitcode(";XXX mov","a,%s  %s,%d",x,__FILE__,__LINE__);
117 #define CLRC    pic16_emitcode(";XXX clr","c %s,%d",__FILE__,__LINE__);
118
119
120 #define BIT_NUMBER(x) (x & 7)
121 #define BIT_REGISTER(x) (x>>3)
122
123
124 #define LSB     0
125 #define MSB16   1
126 #define MSB24   2
127 #define MSB32   3
128
129
130 #define FUNCTION_LABEL_INC  40
131
132 /*-----------------------------------------------------------------*/
133 /* Macros for emitting skip instructions                           */
134 /*-----------------------------------------------------------------*/
135
136 #define emitSKPC    pic16_emitpcode(POC_BTFSS,pic16_popCopyGPR2Bit(PCOP(&pic16_pc_status),PIC_C_BIT))
137 #define emitSKPNC   pic16_emitpcode(POC_BTFSC,pic16_popCopyGPR2Bit(PCOP(&pic16_pc_status),PIC_C_BIT))
138 #define emitSKPZ    pic16_emitpcode(POC_BTFSS,pic16_popCopyGPR2Bit(PCOP(&pic16_pc_status),PIC_Z_BIT))
139 #define emitSKPNZ   pic16_emitpcode(POC_BTFSC,pic16_popCopyGPR2Bit(PCOP(&pic16_pc_status),PIC_Z_BIT))
140 #define emitSKPDC   pic16_emitpcode(POC_BTFSS,pic16_popCopyGPR2Bit(PCOP(&pic16_pc_status),PIC_DC_BIT))
141 #define emitSKPNDC  pic16_emitpcode(POC_BTFSC,pic16_popCopyGPR2Bit(PCOP(&pic16_pc_status),PIC_DC_BIT))
142 #define emitCLRZ    pic16_emitpcode(POC_BCF,  pic16_popCopyGPR2Bit(PCOP(&pic16_pc_status),PIC_Z_BIT))
143 #define emitCLRC    pic16_emitpcode(POC_BCF,  pic16_popCopyGPR2Bit(PCOP(&pic16_pc_status),PIC_C_BIT))
144 #define emitCLRDC   pic16_emitpcode(POC_BCF,  pic16_popCopyGPR2Bit(PCOP(&pic16_pc_status),PIC_DC_BIT))
145 #define emitSETZ    pic16_emitpcode(POC_BSF,  pic16_popCopyGPR2Bit(PCOP(&pic16_pc_status),PIC_Z_BIT))
146 #define emitSETC    pic16_emitpcode(POC_BSF,  pic16_popCopyGPR2Bit(PCOP(&pic16_pc_status),PIC_C_BIT))
147 #define emitSETDC   pic16_emitpcode(POC_BSF,  pic16_popCopyGPR2Bit(PCOP(&pic16_pc_status),PIC_DC_BIT))
148
149 int pic16_getDataSize(operand *op);
150 void pic16_emitpcode(PIC_OPCODE poc, pCodeOp *pcop);
151 void pic16_emitpLabel(int key);
152 void pic16_emitcode (char *inst,char *fmt, ...);
153 void DEBUGpic16_emitcode (char *inst,char *fmt, ...);
154 void pic16_emitDebuggerSymbol (char *);
155 bool pic16_sameRegs (asmop *aop1, asmop *aop2 );
156 char *pic16_aopGet (asmop *aop, int offset, bool bit16, bool dname);
157
158
159 bool pic16_genPlusIncr (iCode *ic);
160 void pic16_outBitAcc(operand *result);
161 void pic16_genPlusBits (iCode *ic);
162 void pic16_genPlus (iCode *ic);
163 bool pic16_genMinusDec (iCode *ic);
164 void pic16_addSign(operand *result, int offset, int sign);
165 void pic16_genMinusBits (iCode *ic);
166 void pic16_genMinus (iCode *ic);
167
168
169 pCodeOp *pic16_popGetLabel(unsigned int key);
170 pCodeOp *pic16_popCopyReg(pCodeOpReg *pc);
171 pCodeOp *pic16_popCopyGPR2Bit(pCodeOp *pc, int bitval);
172 pCodeOp *pic16_popGetLit(unsigned int lit);
173 pCodeOp *pic16_popGetLit2(unsigned int lit, pCodeOp *arg2);
174 pCodeOp *popGetWithString(char *str);
175 pCodeOp *pic16_popGet (asmop *aop, int offset);//, bool bit16, bool dname);
176 pCodeOp *pic16_popGetTempReg(void);
177 void pic16_popReleaseTempReg(pCodeOp *pcop);
178
179 pCodeOp *pic16_popCombine2(pCodeOpReg *src, pCodeOpReg *dst, int noalloc);
180
181 void pic16_aopPut (asmop *aop, char *s, int offset);
182 void pic16_outAcc(operand *result);
183 void pic16_aopOp (operand *op, iCode *ic, bool result);
184 void pic16_outBitC(operand *result);
185 void pic16_toBoolean(operand *oper);
186 void pic16_freeAsmop (operand *op, asmop *aaop, iCode *ic, bool pop);
187 const char *pic16_pCodeOpType(  pCodeOp *pcop);
188
189
190 void dumpiCode(iCode *lic);
191
192 #endif