* .version: changed version to 2.5.4
[fw/sdcc] / src / pic / gen.h
1 /*-------------------------------------------------------------------------
2   SDCCgen51.h - header file for code generation for 8051
3
4              Written By -  Sandeep Dutta . sandeep.dutta@usa.net (1998)
5              PIC port   - T. Scott Dattalo scott@dattalo.com (2000)
6
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
10    later version.
11    
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.
16    
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.
20    
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 -------------------------------------------------------------------------*/
25
26 #ifndef SDCCGENPIC14_H
27 #define SDCCGENPIC14_H
28
29 extern int debug_verbose;
30
31 #define FENTRY do {                                                                     \
32         /*fprintf (stderr, "%s:%u:%s: *{*\n", __FILE__, __LINE__, __FUNCTION__);*/      \
33         if (options.debug || debug_verbose) {                                           \
34                 emitpComment ("; %s:%u:%s *{*", __FILE__, __LINE__, __FUNCTION__);      \
35         }                                                                               \
36 } while (0)
37 #define FEXIT do {                                                                      \
38         /*fprintf (stderr, "%s:%u:%s: *}*\n", __FILE__, __LINE__, __FUNCTION__);*/      \
39         if (options.debug || debug.verbose) {                                           \
40                 emitpComment ("; %s:%u:%s *}*", __FILE__, __LINE__, __FUNCTION__);      \
41         }                                                                               \
42 } while (0)
43
44 struct pCodeOp;
45
46 enum
47 {
48   AOP_LIT = 1,
49   AOP_REG, AOP_DIR,
50   AOP_DPTR, AOP_DPTR2, AOP_R0, AOP_R1,
51   AOP_STK, AOP_IMMD, AOP_STR,
52   AOP_CRY, AOP_ACC,
53   AOP_PCODE
54
55 };
56
57 /* type asmop : a homogenised type for 
58    all the different spaces an operand can be
59    in */
60 typedef struct asmop
61 {
62
63   short type;  /* can have values
64                   AOP_LIT    -  operand is a literal value
65                   AOP_REG    -  is in registers
66                   AOP_DIR    -  direct just a name
67                   AOP_DPTR   -  dptr contains address of operand
68                   AOP_DPTR2  -  dptr2 contains address of operand (DS80C390 only).
69                   AOP_R0/R1  -  r0/r1 contains address of operand               
70                   AOP_STK    -  should be pushed on stack this
71                   can happen only for the result
72                   AOP_IMMD   -  immediate value for eg. remateriazable 
73                   AOP_CRY    -  carry contains the value of this
74                   AOP_STR    -  array of strings
75                   AOP_ACC    -  result is in the acc:b pair
76                */
77   short coff;           /* current offset */
78   short size;           /* total size */
79   unsigned code:1;      /* is in Code space */
80   unsigned paged:1;     /* in paged memory  */
81   unsigned freed:1;     /* already freed    */
82   union
83   {
84     value *aop_lit;     /* if literal */
85     regs *aop_reg[4];   /* array of registers */
86     char *aop_dir;      /* if direct  */
87     regs *aop_ptr;      /* either -> to r0 or r1 */
88     char *aop_immd;     /* if immediate others are implied */
89     int aop_stk;        /* stack offset when AOP_STK */
90     char *aop_str[4];   /* just a string array containing the location */
91     pCodeOp *pcop;
92   }
93   aopu;
94 }
95 asmop;
96
97 void genpic14Code (iCode *);
98
99 extern unsigned fReturnSizePic;
100
101
102 #define AOP(op) op->aop
103 #define AOP_TYPE(op) AOP(op)->type
104 #define AOP_SIZE(op) AOP(op)->size
105 #define IS_AOP_PREG(x) (AOP(x) && (AOP_TYPE(x) == AOP_R1 || \
106                        AOP_TYPE(x) == AOP_R0))
107
108 #define AOP_NEEDSACC(x) (AOP(x) && (AOP_TYPE(x) == AOP_CRY ||  \
109                         AOP_TYPE(x) == AOP_DPTR || AOP_TYPE(x) == AOP_DPTR2 || \
110                          AOP(x)->paged)) 
111
112 #define AOP_INPREG(x) (x && (x->type == AOP_REG &&                        \
113                       (x->aopu.aop_reg[0] == pic14_regWithIdx(R0_IDX) || \
114                       x->aopu.aop_reg[0] == pic14_regWithIdx(R1_IDX) )))
115
116 #define RESULTONSTACK(x) \
117                          (IC_RESULT(x) && IC_RESULT(x)->aop && \
118                          IC_RESULT(x)->aop->type == AOP_STK )
119
120 #define MOVA(x) if (strcmp(x,"a") && strcmp(x,"acc")) pic14_emitcode(";XXX mov","a,%s  %s,%d",x,__FILE__,__LINE__);
121 #define CLRC    pic14_emitcode(";XXX clr","c %s,%d",__FILE__,__LINE__);
122
123 #define BIT_NUMBER(x) (x & 7)
124 #define BIT_REGISTER(x) (x>>3)
125
126
127 #define LSB     0
128 #define MSB16   1
129 #define MSB24   2
130 #define MSB32   3
131
132
133 #define FUNCTION_LABEL_INC  40
134
135 /*-----------------------------------------------------------------*/
136 /* Macros for emitting skip instructions                           */
137 /*-----------------------------------------------------------------*/
138
139 #define emitSKPC    emitpcode(POC_BTFSS,popCopyGPR2Bit(PCOP(&pc_status),PIC_C_BIT))
140 #define emitSKPNC   emitpcode(POC_BTFSC,popCopyGPR2Bit(PCOP(&pc_status),PIC_C_BIT))
141 #define emitSKPZ    emitpcode(POC_BTFSS,popCopyGPR2Bit(PCOP(&pc_status),PIC_Z_BIT))
142 #define emitSKPNZ   emitpcode(POC_BTFSC,popCopyGPR2Bit(PCOP(&pc_status),PIC_Z_BIT))
143 #define emitSKPDC   emitpcode(POC_BTFSS,popCopyGPR2Bit(PCOP(&pc_status),PIC_DC_BIT))
144 #define emitSKPNDC  emitpcode(POC_BTFSC,popCopyGPR2Bit(PCOP(&pc_status),PIC_DC_BIT))
145 #define emitCLRZ    emitpcode(POC_BCF,  popCopyGPR2Bit(PCOP(&pc_status),PIC_Z_BIT))
146 #define emitCLRC    emitpcode(POC_BCF,  popCopyGPR2Bit(PCOP(&pc_status),PIC_C_BIT))
147 #define emitCLRDC   emitpcode(POC_BCF,  popCopyGPR2Bit(PCOP(&pc_status),PIC_DC_BIT))
148 #define emitCLRIRP  emitpcode(POC_BCF,  popCopyGPR2Bit(PCOP(&pc_status),PIC_IRP_BIT))
149 #define emitSETZ    emitpcode(POC_BSF,  popCopyGPR2Bit(PCOP(&pc_status),PIC_Z_BIT))
150 #define emitSETC    emitpcode(POC_BSF,  popCopyGPR2Bit(PCOP(&pc_status),PIC_C_BIT))
151 #define emitSETDC   emitpcode(POC_BSF,  popCopyGPR2Bit(PCOP(&pc_status),PIC_DC_BIT))
152 #define emitSETIRP  emitpcode(POC_BSF,  popCopyGPR2Bit(PCOP(&pc_status),PIC_IRP_BIT))
153
154 int pic14_getDataSize(operand *op);
155 void emitpcode_real(PIC_OPCODE poc, pCodeOp *pcop);
156 #define emitpcode(poc,pcop)     do { if (options.debug || debug_verbose) { emitpComment (" >>> %s:%d:%s", __FILE__, __LINE__, __FUNCTION__); } emitpcode_real(poc,pcop); } while(0)
157 void emitpComment (const char *fmt, ...);
158 void emitpLabel(int key);
159 void pic14_emitcode (char *inst,char *fmt, ...);
160 void DEBUGpic14_emitcode (char *inst,char *fmt, ...);
161 void pic14_emitDebuggerSymbol (char *);
162 asmop *newAsmop (short type);
163 bool pic14_sameRegs (asmop *aop1, asmop *aop2 );
164 char *aopGet (asmop *aop, int offset, bool bit16, bool dname);
165
166
167 bool genPlusIncr (iCode *ic);
168 void pic14_outBitAcc(operand *result);
169 void genPlusBits (iCode *ic);
170 void genPlus (iCode *ic);
171 bool genMinusDec (iCode *ic);
172 void addSign(operand *result, int offset, int sign);
173 void genMinusBits (iCode *ic);
174 void genMinus (iCode *ic);
175
176
177 pCodeOp *popGetLabel(unsigned int key);
178 pCodeOp *popCopyReg(pCodeOpReg *pc);
179 pCodeOp *popCopyGPR2Bit(pCodeOp *pc, int bitval);
180 pCodeOp *popGetLit(unsigned int lit);
181 pCodeOp *popGetWithString(char *str, int isExtern);
182 pCodeOp *popRegFromString(char *str, int size, int offset);
183 pCodeOp *popGet (asmop *aop, int offset);//, bool bit16, bool dname);
184 pCodeOp *popGetAddr (asmop *aop, int offset, int index);
185 pCodeOp *popGetTempReg(void);
186 void popReleaseTempReg(pCodeOp *pcop);
187
188
189 void aopPut (asmop *aop, char *s, int offset);
190 void pic14_outAcc(operand *result);
191 void aopOp (operand *op, iCode *ic, bool result);
192 void pic14_outBitC(operand *result);
193 void pic14_toBoolean(operand *oper);
194 void freeAsmop (operand *op, asmop *aaop, iCode *ic, bool pop);
195 void mov2w (asmop *aop, int offset);
196 const char *pCodeOpType(  pCodeOp *pcop);
197
198 int aop_isLitLike (asmop *aop);
199 int op_isLitLike (operand *op);
200
201 #endif