dattalo - Major commit! re-wrote register allocation and flow analysis.
[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 enum
30   {
31     AOP_LIT = 1,
32     AOP_REG, AOP_DIR,
33     AOP_DPTR, AOP_DPTR2, AOP_R0, AOP_R1,
34     AOP_STK, AOP_IMMD, AOP_STR,
35     AOP_CRY, AOP_ACC
36   };
37
38 /* type asmop : a homogenised type for 
39    all the different spaces an operand can be
40    in */
41 typedef struct asmop
42   {
43
44     short type;                 /* can have values
45                                    AOP_LIT    -  operand is a literal value
46                                    AOP_REG    -  is in registers
47                                    AOP_DIR    -  direct just a name
48                                    AOP_DPTR   -  dptr contains address of operand
49                                    AOP_DPTR2  -  dptr2 contains address of operand (DS80C390 only).
50                                    AOP_R0/R1  -  r0/r1 contains address of operand               
51                                    AOP_STK    -  should be pushed on stack this
52                                    can happen only for the result
53                                    AOP_IMMD   -  immediate value for eg. remateriazable 
54                                    AOP_CRY    -  carry contains the value of this
55                                    AOP_STR    -  array of strings
56                                    AOP_ACC    -  result is in the acc:b pair
57                                  */
58     short coff;                 /* current offset */
59     short size;                 /* total size */
60     unsigned code:1;            /* is in Code space */
61     unsigned paged:1;           /* in paged memory  */
62     unsigned freed:1;           /* already freed    */
63     union
64       {
65         value *aop_lit;         /* if literal */
66         regs *aop_reg[4];       /* array of registers */
67         char *aop_dir;          /* if direct  */
68         regs *aop_ptr;          /* either -> to r0 or r1 */
69         char *aop_immd;         /* if immediate others are implied */
70         int aop_stk;            /* stack offset when AOP_STK */
71         char *aop_str[4];       /* just a string array containing the location */
72 /*      regs *aop_alloc_reg;     * points to a dynamically allocated register */
73       }
74     aopu;
75   }
76 asmop;
77
78 void genpic14Code (iCode *);
79
80 //extern char *fReturnpic14[];
81 //extern char *fReturn390[];
82 extern unsigned fReturnSizePic;
83 //extern char **fReturn;
84
85
86 #define AOP(op) op->aop
87 #define AOP_TYPE(op) AOP(op)->type
88 #define AOP_SIZE(op) AOP(op)->size
89 #define IS_AOP_PREG(x) (AOP(x) && (AOP_TYPE(x) == AOP_R1 || \
90                        AOP_TYPE(x) == AOP_R0))
91
92 #define AOP_NEEDSACC(x) (AOP(x) && (AOP_TYPE(x) == AOP_CRY ||  \
93                         AOP_TYPE(x) == AOP_DPTR || AOP_TYPE(x) == AOP_DPTR2 || \
94                          AOP(x)->paged)) 
95
96 #define AOP_INPREG(x) (x && (x->type == AOP_REG &&                        \
97                       (x->aopu.aop_reg[0] == pic14_regWithIdx(R0_IDX) || \
98                       x->aopu.aop_reg[0] == pic14_regWithIdx(R1_IDX) )))
99
100 #define RESULTONSTACK(x) \
101                          (IC_RESULT(x) && IC_RESULT(x)->aop && \
102                          IC_RESULT(x)->aop->type == AOP_STK )
103
104 #define MOVA(x) if (strcmp(x,"a") && strcmp(x,"acc")) pic14_emitcode(";XXX mov","a,%s  %s,%d",x,__FILE__,__LINE__);
105 #define CLRC    pic14_emitcode(";XXX clr","c %s,%d",__FILE__,__LINE__);
106
107 #define BIT_NUMBER(x) (x & 7)
108 #define BIT_REGISTER(x) (x>>3)
109
110
111 #define LSB     0
112 #define MSB16   1
113 #define MSB24   2
114 #define MSB32   3
115
116
117 #define FUNCTION_LABEL_INC  40
118
119 /*-----------------------------------------------------------------*/
120 /* Macros for emitting skip instructions                           */
121 /*-----------------------------------------------------------------*/
122
123 #define emitSKPC    emitpcode(POC_BTFSS,popCopyGPR2Bit(PCOP(&pc_status),PIC_C_BIT))
124 #define emitSKPNC   emitpcode(POC_BTFSC,popCopyGPR2Bit(PCOP(&pc_status),PIC_C_BIT))
125 #define emitSKPZ    emitpcode(POC_BTFSS,popCopyGPR2Bit(PCOP(&pc_status),PIC_Z_BIT))
126 #define emitSKPNZ   emitpcode(POC_BTFSC,popCopyGPR2Bit(PCOP(&pc_status),PIC_Z_BIT))
127 #define emitSKPDC   emitpcode(POC_BTFSS,popCopyGPR2Bit(PCOP(&pc_status),PIC_DC_BIT))
128 #define emitSKPNDC  emitpcode(POC_BTFSC,popCopyGPR2Bit(PCOP(&pc_status),PIC_DC_BIT))
129 #define emitCLRZ    emitpcode(POC_BCF,  popCopyGPR2Bit(PCOP(&pc_status),PIC_Z_BIT))
130 #define emitCLRC    emitpcode(POC_BCF,  popCopyGPR2Bit(PCOP(&pc_status),PIC_C_BIT))
131 #define emitCLRDC   emitpcode(POC_BCF,  popCopyGPR2Bit(PCOP(&pc_status),PIC_DC_BIT))
132 #define emitSETZ    emitpcode(POC_BSF,  popCopyGPR2Bit(PCOP(&pc_status),PIC_Z_BIT))
133 #define emitSETC    emitpcode(POC_BSF,  popCopyGPR2Bit(PCOP(&pc_status),PIC_C_BIT))
134 #define emitSETDC   emitpcode(POC_BSF,  popCopyGPR2Bit(PCOP(&pc_status),PIC_DC_BIT))
135
136 int pic14_getDataSize(operand *op);
137 void emitpcode(PIC_OPCODE poc, pCodeOp *pcop);
138 void pic14_emitcode (char *inst,char *fmt, ...);
139 void DEBUGpic14_emitcode (char *inst,char *fmt, ...);
140 asmop *newAsmop (short type);
141 bool pic14_sameRegs (asmop *aop1, asmop *aop2 );
142 char *aopGet (asmop *aop, int offset, bool bit16, bool dname);
143
144
145 bool genPlusIncr (iCode *ic);
146 void pic14_outBitAcc(operand *result);
147 void genPlusBits (iCode *ic);
148 void genPlus (iCode *ic);
149 bool genMinusDec (iCode *ic);
150 void addSign(operand *result, int offset, int sign);
151 void genMinusBits (iCode *ic);
152 void genMinus (iCode *ic);
153
154
155 pCodeOp *popGetLabel(unsigned int key);
156 pCodeOp *popCopyReg(pCodeOpReg *pc);
157 pCodeOp *popCopyGPR2Bit(pCodeOp *pc, int bitval);
158 pCodeOp *popGetLit(unsigned int lit);
159 pCodeOp *popGetWithString(char *str);
160 pCodeOp *popRegFromString(char *str);
161 pCodeOp *popGet (asmop *aop, int offset);//, bool bit16, bool dname);
162
163
164 void aopPut (asmop *aop, char *s, int offset);
165 void pic14_outAcc(operand *result);
166 void aopOp (operand *op, iCode *ic, bool result);
167 void pic14_outBitC(operand *result);
168 void pic14_toBoolean(operand *oper);
169 void freeAsmop (operand *op, asmop *aaop, iCode *ic, bool pop);
170
171
172
173 #endif