* src/pic/gen.c,
[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_STK, AOP_IMMD, AOP_STR,
51   AOP_CRY,
52   AOP_PCODE
53
54 };
55
56 /* type asmop : a homogenised type for 
57    all the different spaces an operand can be
58    in */
59 typedef struct asmop
60 {
61
62   short type;  /* can have values
63                   AOP_LIT    -  operand is a literal value
64                   AOP_REG    -  is in registers
65                   AOP_DIR    -  direct just a name
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                */
72   short coff;           /* current offset */
73   short size;           /* total size */
74   unsigned code:1;      /* is in Code space */
75   unsigned paged:1;     /* in paged memory  */
76   unsigned freed:1;     /* already freed    */
77   union
78   {
79     value *aop_lit;     /* if literal */
80     regs *aop_reg[4];   /* array of registers */
81     char *aop_dir;      /* if direct  */
82     regs *aop_ptr;      /* either -> to r0 or r1 */
83     char *aop_immd;     /* if immediate others are implied */
84     int aop_stk;        /* stack offset when AOP_STK */
85     char *aop_str[4];   /* just a string array containing the location */
86     pCodeOp *pcop;
87   }
88   aopu;
89 }
90 asmop;
91
92 void genpic14Code (iCode *);
93
94 extern unsigned fReturnSizePic;
95
96
97 #define AOP(op) op->aop
98 #define AOP_TYPE(op) AOP(op)->type
99 #define AOP_SIZE(op) AOP(op)->size
100
101 #define AOP_NEEDSACC(x) (AOP(x) && (AOP_TYPE(x) == AOP_CRY || AOP(x)->paged))
102
103 #define RESULTONSTACK(x) \
104                          (IC_RESULT(x) && IC_RESULT(x)->aop && \
105                          IC_RESULT(x)->aop->type == AOP_STK )
106
107 #define MOVA(x) if (strcmp(x,"a") && strcmp(x,"acc")) pic14_emitcode(";XXX mov","a,%s  %s,%d",x,__FILE__,__LINE__);
108 #define CLRC    pic14_emitcode(";XXX clr","c %s,%d",__FILE__,__LINE__);
109
110 #define BIT_NUMBER(x) (x & 7)
111 #define BIT_REGISTER(x) (x>>3)
112
113
114 #define LSB     0
115 #define MSB16   1
116 #define MSB24   2
117 #define MSB32   3
118
119
120 #define FUNCTION_LABEL_INC  40
121
122 /*-----------------------------------------------------------------*/
123 /* Macros for emitting skip instructions                           */
124 /*-----------------------------------------------------------------*/
125
126 #define emitSKPC    emitpcode(POC_BTFSS,popCopyGPR2Bit(PCOP(&pc_status),PIC_C_BIT))
127 #define emitSKPNC   emitpcode(POC_BTFSC,popCopyGPR2Bit(PCOP(&pc_status),PIC_C_BIT))
128 #define emitSKPZ    emitpcode(POC_BTFSS,popCopyGPR2Bit(PCOP(&pc_status),PIC_Z_BIT))
129 #define emitSKPNZ   emitpcode(POC_BTFSC,popCopyGPR2Bit(PCOP(&pc_status),PIC_Z_BIT))
130 #define emitSKPDC   emitpcode(POC_BTFSS,popCopyGPR2Bit(PCOP(&pc_status),PIC_DC_BIT))
131 #define emitSKPNDC  emitpcode(POC_BTFSC,popCopyGPR2Bit(PCOP(&pc_status),PIC_DC_BIT))
132 #define emitCLRZ    emitpcode(POC_BCF,  popCopyGPR2Bit(PCOP(&pc_status),PIC_Z_BIT))
133 #define emitCLRC    emitpcode(POC_BCF,  popCopyGPR2Bit(PCOP(&pc_status),PIC_C_BIT))
134 #define emitCLRDC   emitpcode(POC_BCF,  popCopyGPR2Bit(PCOP(&pc_status),PIC_DC_BIT))
135 #define emitCLRIRP  emitpcode(POC_BCF,  popCopyGPR2Bit(PCOP(&pc_status),PIC_IRP_BIT))
136 #define emitSETZ    emitpcode(POC_BSF,  popCopyGPR2Bit(PCOP(&pc_status),PIC_Z_BIT))
137 #define emitSETC    emitpcode(POC_BSF,  popCopyGPR2Bit(PCOP(&pc_status),PIC_C_BIT))
138 #define emitSETDC   emitpcode(POC_BSF,  popCopyGPR2Bit(PCOP(&pc_status),PIC_DC_BIT))
139 #define emitSETIRP  emitpcode(POC_BSF,  popCopyGPR2Bit(PCOP(&pc_status),PIC_IRP_BIT))
140
141 int pic14_getDataSize(operand *op);
142 void emitpcode_real(PIC_OPCODE poc, pCodeOp *pcop);
143 #define emitpcode(poc,pcop)     do { if (options.debug || debug_verbose) { emitpComment (" >>> %s:%d:%s", __FILE__, __LINE__, __FUNCTION__); } emitpcode_real(poc,pcop); } while(0)
144 void emitpComment (const char *fmt, ...);
145 void emitpLabel(int key);
146 void pic14_emitcode (char *inst,char *fmt, ...);
147 void DEBUGpic14_emitcode (char *inst,char *fmt, ...);
148 void pic14_emitDebuggerSymbol (char *);
149 asmop *newAsmop (short type);
150 bool pic14_sameRegs (asmop *aop1, asmop *aop2 );
151 char *aopGet (asmop *aop, int offset, bool bit16, bool dname);
152
153
154 bool genPlusIncr (iCode *ic);
155 void pic14_outBitAcc(operand *result);
156 void genPlus (iCode *ic);
157 bool genMinusDec (iCode *ic);
158 void addSign(operand *result, int offset, int sign);
159 void genMinus (iCode *ic);
160
161
162 pCodeOp *popGetLabel(unsigned int key);
163 pCodeOp *popCopyReg(pCodeOpReg *pc);
164 pCodeOp *popCopyGPR2Bit(pCodeOp *pc, int bitval);
165 pCodeOp *popGetLit(unsigned int lit);
166 pCodeOp *popGetWithString(char *str, int isExtern);
167 pCodeOp *popRegFromString(char *str, int size, int offset);
168 pCodeOp *popGet (asmop *aop, int offset);//, bool bit16, bool dname);
169 pCodeOp *popGetAddr (asmop *aop, int offset, int index);
170 pCodeOp *popGetTempReg(void);
171 void popReleaseTempReg(pCodeOp *pcop);
172
173
174 void aopPut (asmop *aop, char *s, int offset);
175 void pic14_outAcc(operand *result);
176 void aopOp (operand *op, iCode *ic, bool result);
177 void pic14_outBitC(operand *result);
178 void pic14_toBoolean(operand *oper);
179 void freeAsmop (operand *op, asmop *aaop, iCode *ic, bool pop);
180 void mov2w (asmop *aop, int offset);
181 const char *pCodeOpType(  pCodeOp *pcop);
182
183 int aop_isLitLike (asmop *aop);
184 int op_isLitLike (operand *op);
185
186 #endif