Merged everything with MIPS version
[cacao.git] / mips / ngen.h
1 /* mips/ngen.h *****************************************************************
2
3         Copyright (c) 1997 A. Krall, R. Grafl, M. Gschwind, M. Probst
4
5         See file COPYRIGHT for information on usage and disclaimer of warranties
6
7         Contains the machine dependent code generator definitions and macros for an
8         Alpha processor.
9
10         Authors: Andreas  Krall      EMAIL: cacao@complang.tuwien.ac.at
11
12         Last Change: 1998/11/12
13
14 *******************************************************************************/
15
16 #include <sys/cachectl.h>
17 #include <sys/mman.h>
18
19 /* see also file calling.doc for explanation of calling conventions           */
20
21 /* preallocated registers *****************************************************/
22
23 /* integer registers */
24   
25 #define REG_ZERO        0    /* allways zero                                  */
26
27 #define REG_RESULT      2    /* to deliver method results                     */ 
28
29 #define REG_ITMP1       1    /* temporary register                            */
30 #define REG_ITMP2       3    /* temporary register and method pointer         */
31 #define REG_ITMP3       25   /* temporary register                            */
32
33 #define REG_ARG_0       4    /* argument register                             */
34 #define REG_ARG_1       5    /* argument register                             */
35 #define REG_ARG_2       6    /* argument register                             */
36 #define REG_ARG_3       7    /* argument register                             */
37 #define REG_ARG_4       8    /* argument register                             */
38 #define REG_ARG_5       9    /* argument register                             */
39
40 #define REG_RA          31   /* return address                                */
41 #define REG_SP          29   /* stack pointer                                 */
42 #define REG_GP          28   /* global pointer                                */
43
44 #define REG_PV          30   /* procedure vector, must be provided by caller  */
45 #define REG_METHODPTR   25   /* pointer to the place from where the procedure */
46                              /* vector has been fetched                       */
47 #define REG_ITMP1_XPTR  1    /* exception pointer = temporary register 1      */
48 #define REG_ITMP2_XPC   3    /* exception pc = temporary register 2           */
49
50 /* floating point registers */
51
52 #define REG_FRESULT     0    /* to deliver floating point method results      */ 
53 #define REG_FTMP1       1    /* temporary floating point register             */
54 #define REG_FTMP2       2    /* temporary floating point register             */
55 #define REG_FTMP3       3    /* temporary floating point register             */
56
57 #define REG_IFTMP       1    /* temporary integer and floating point register */
58
59 /* register descripton - array ************************************************/
60
61 /* #define REG_RES   0         reserved register for OS or code generator     */
62 /* #define REG_RET   1         return value register                          */
63 /* #define REG_EXC   2         exception value register (only old jit)        */
64 /* #define REG_SAV   3         (callee) saved register                        */
65 /* #define REG_TMP   4         scratch temporary register (caller saved)      */
66 /* #define REG_ARG   5         argument register (caller saved)               */
67
68 /* #define REG_END   -1        last entry in tables */
69  
70 int nregdescint[] = {
71         REG_RES, REG_RES, REG_RET, REG_RES, REG_ARG, REG_ARG, REG_ARG, REG_ARG, 
72         REG_ARG, REG_ARG, REG_ARG, REG_ARG, REG_TMP, REG_TMP, REG_TMP, REG_TMP, 
73         REG_SAV, REG_SAV, REG_SAV, REG_SAV, REG_SAV, REG_SAV, REG_SAV, REG_SAV,
74         REG_TMP, REG_RES, REG_RES, REG_RES, REG_RES, REG_RES, REG_RES, REG_RES,
75         REG_END };
76
77 #define INT_SAV_CNT      8   /* number of int callee saved registers          */
78 #define INT_ARG_CNT      8   /* number of int argument registers              */
79
80 /* for use of reserved registers, see comment above */
81         
82 int nregdescfloat[] = {
83         REG_RET, REG_RES, REG_RES, REG_RES, REG_TMP, REG_TMP, REG_TMP, REG_TMP,
84         REG_TMP, REG_TMP, REG_TMP, REG_TMP, REG_ARG, REG_ARG, REG_ARG, REG_ARG, 
85         REG_ARG, REG_ARG, REG_ARG, REG_ARG, REG_TMP, REG_TMP, REG_TMP, REG_TMP,
86         REG_SAV, REG_TMP, REG_SAV, REG_TMP, REG_SAV, REG_TMP, REG_SAV, REG_TMP,
87         REG_END };
88
89 #define FLT_SAV_CNT      4   /* number of flt callee saved registers          */
90 #define FLT_ARG_CNT      8   /* number of flt argument registers              */
91
92 /* for use of reserved registers, see comment above */
93
94
95 /* parameter allocation mode */
96
97 int nreg_parammode = PARAMMODE_NUMBERED;  
98
99    /* parameter-registers will be allocated by assigning the
100       1. parameter:   int/float-reg a0
101       2. parameter:   int/float-reg a1  
102       3. parameter:   int/float-reg a2 ....
103    */
104
105
106 /* stackframe-infos ***********************************************************/
107
108 int parentargs_base; /* offset in stackframe for the parameter from the caller*/
109
110 /* -> see file 'calling.doc' */
111
112
113 /* macros to create code ******************************************************/
114
115 /* code generation macros operands:
116       op ..... opcode
117       fu ..... function-number
118       rs ..... register number source 1
119       rt ..... register number or constant integer source 2
120       rd ..... register number destination
121       imm .... immediate/offset
122       sa ..... shift amount
123 */
124
125
126 #define M_ITYPE(op, rs, rt, imm)\
127   *(mcodeptr++) = (((op)<<26)|((rs)<<21)|((rt)<<16)|((imm)&0xffff))
128
129 #define M_JTYPE(op, imm)\
130   *(mcodeptr++) = (((op)<<26)|((off)&0x3ffffff))
131
132 #define M_RTYPE(op, rs, rt, rd, sa, fu)\
133   *(mcodeptr++) = (((op)<<26)|((rs)<<21)|((rt)<<16)|((rd)<<11)|((sa)<<6)|(fu))
134
135 #define M_FP2(fu, fmt, fs, fd)       M_RTYPE(0x11, fmt,  0, fs, fd, fu)
136 #define M_FP3(fu, fmt, fs, ft, fd)   M_RTYPE(0x11, fmt, ft, fs, fd, fu)
137
138 #define FMT_F  16
139 #define FMT_D  17
140 #define FMT_I  20
141 #define FMT_L  21
142
143 /* macros for all used commands (see a MIPS-manual for description) ***********/ 
144
145 /* load/store macros use the form OPERATION(source/dest, base, offset)        */
146
147 #define M_BLDS(a,b,disp)        M_ITYPE(0x20,b,a,disp)          /*  8 load    */
148 #define M_BLDU(a,b,disp)        M_ITYPE(0x24,b,a,disp)          /*  8 load    */
149 #define M_SLDS(a,b,disp)        M_ITYPE(0x21,b,a,disp)          /* 16 load    */
150 #define M_SLDU(a,b,disp)        M_ITYPE(0x25,b,a,disp)          /* 16 load    */
151 #define M_ILD(a,b,disp)         M_ITYPE(0x23,b,a,disp)          /* 32 load    */
152 #define M_LLD(a,b,disp)         M_ITYPE(0x37,b,a,disp)          /* 64 load    */
153 #define M_BST(a,b,disp)         M_ITYPE(0x28,b,a,disp)          /*  8 store   */
154 #define M_SST(a,b,disp)         M_ITYPE(0x29,b,a,disp)          /* 16 store   */
155 #define M_IST(a,b,disp)         M_ITYPE(0x2b,b,a,disp)          /* 32 store   */
156 #define M_LST(a,b,disp)         M_ITYPE(0x3f,b,a,disp)          /* 64 store   */
157
158 #define M_FLD(a,b,disp)         M_ITYPE(0x31,b,a,disp)          /* load flt   */
159 #define M_DLD(a,b,disp)         M_ITYPE(0x35,b,a,disp)          /* load dbl   */
160 #define M_FST(a,b,disp)         M_ITYPE(0x39,b,a,disp)          /* store flt  */
161 #define M_DST(a,b,disp)         M_ITYPE(0x3d,b,a,disp)          /* store dbl  */
162
163 #define M_BEQ(a,b,disp)         M_ITYPE(0x04,a,b,disp)          /* br a == b  */
164 #define M_BNE(a,b,disp)         M_ITYPE(0x05,a,b,disp)          /* br a != b  */
165 #define M_BEQZ(a,disp)          M_ITYPE(0x04,a,0,disp)          /* br a == 0  */
166 #define M_BLTZ(a,disp)          M_ITYPE(0x01,a,0,disp)          /* br a <  0  */
167 #define M_BLEZ(a,disp)          M_ITYPE(0x06,a,0,disp)          /* br a <= 0  */
168 #define M_BNEZ(a,disp)          M_ITYPE(0x05,a,0,disp)          /* br a != 0  */
169 #define M_BGEZ(a,disp)          M_ITYPE(0x01,a,1,disp)          /* br a >= 0  */
170 #define M_BGTZ(a,disp)          M_ITYPE(0x07,a,0,disp)          /* br a >  0  */
171
172 #define M_BEQL(a,b,disp)        M_ITYPE(0x14,a,b,disp)          /* br a == b  */
173 #define M_BNEL(a,b,disp)        M_ITYPE(0x15,a,b,disp)          /* br a != b  */
174 #define M_BEQZL(a,disp)         M_ITYPE(0x14,a,0,disp)          /* br a == 0  */
175 #define M_BLTZL(a,disp)         M_ITYPE(0x01,a,2,disp)          /* br a <  0  */
176 #define M_BLEZL(a,disp)         M_ITYPE(0x16,a,0,disp)          /* br a <= 0  */
177 #define M_BNEZL(a,disp)         M_ITYPE(0x15,a,0,disp)          /* br a != 0  */
178 #define M_BGEZL(a,disp)         M_ITYPE(0x01,a,3,disp)          /* br a >= 0  */
179 #define M_BGTZL(a,disp)         M_ITYPE(0x17,a,0,disp)          /* br a >  0  */
180
181 #define M_BR(disp)              M_ITYPE(0x04,0,0,disp)          /* branch     */
182 #define M_BRS(disp)             M_ITYPE(0x01,0,17,disp)         /* branch sbr */
183
184 #define M_JMP(a)                M_RTYPE(0,a,0,0,0,0x08)         /* jump       */
185 #define M_JSR(r,a)              M_RTYPE(0,a,0,r,0,0x09)         /* call       */
186 #define M_RET(a)                M_RTYPE(0,a,0,0,0,0x08)         /* return     */
187
188 #define M_TGE(a,b,code)         M_RTYPE(0,a,b,0,code&3ff,0x30)  /* trp a >= b */
189 #define M_TGEU(a,b,code)        M_RTYPE(0,a,b,0,code&3ff,0x31)  /* trp a >= b */
190 #define M_TLT(a,b,code)         M_RTYPE(0,a,b,0,code&3ff,0x32)  /* trp a <  b */
191 #define M_TLTU(a,b,code)        M_RTYPE(0,a,b,0,code&3ff,0x33)  /* trp a <  b */
192 #define M_TEQ(a,b,code)         M_RTYPE(0,a,b,0,code&3ff,0x34)  /* trp a == b */
193 #define M_TNE(a,b,code)         M_RTYPE(0,a,b,0,code&3ff,0x36)  /* trp a != b */
194 #define M_TLE(a,b,code)         M_RTYPE(0,b,a,0,code&3ff,0x30)  /* trp a <= b */
195 #define M_TLEU(a,b,code)        M_RTYPE(0,b,a,0,code&3ff,0x31)  /* trp a <= b */
196 #define M_TGT(a,b,code)         M_RTYPE(0,b,a,0,code&3ff,0x32)  /* trp a >  b */
197 #define M_TGTU(a,b,code)        M_RTYPE(0,b,a,0,code&3ff,0x33)  /* trp a >  b */
198
199 #define M_TGE_IMM(a,b)          M_ITYPE(1,a,0x08,b)             /* trp a >= b */
200 #define M_TGEU_IMM(a,b)         M_ITYPE(1,a,0x09,b)             /* trp a >= b */
201 #define M_TLT_IMM(a,b)          M_ITYPE(1,a,0x0a,b)             /* trp a <  b */
202 #define M_TLTU_IMM(a,b)         M_ITYPE(1,a,0x0b,b)             /* trp a <  b */
203 #define M_TEQ_IMM(a,b)          M_ITYPE(1,a,0x0c,b)             /* trp a == b */
204 #define M_TNE_IMM(a,b)          M_ITYPE(1,a,0x0e,b)             /* trp a != b */
205 #if 0
206 #define M_TGT_IMM(a,b)          M_ITYPE(1,a,0x08,b+1)           /* trp a >  b */
207 #define M_TGTU_IMM(a,b)         M_ITYPE(1,a,0x09,b+1)           /* trp a >  b */
208 #define M_TLE_IMM(a,b)          M_ITYPE(1,a,0x0a,b+1)           /* trp a <= b */
209 #define M_TLEU_IMM(a,b)         M_ITYPE(1,a,0x0b,b+1)           /* trp a <= b */
210 #endif
211
212 /* arithmetic macros use the form OPERATION(source, source/immediate, dest)   */
213
214 #define M_IADD(a,b,c)           M_RTYPE(0,a,b,c,0,0x21)         /* 32 add     */
215 #define M_LADD(a,b,c)           M_RTYPE(0,a,b,c,0,0x2d)         /* 64 add     */
216 #define M_ISUB(a,b,c)           M_RTYPE(0,a,b,c,0,0x23)         /* 32 sub     */
217 #define M_LSUB(a,b,c)           M_RTYPE(0,a,b,c,0,0x2f)         /* 64 sub     */
218 #define M_IMUL(a,b)             M_ITYPE(0,a,b,0x18)             /* 32 mul     */
219 #define M_LMUL(a,b)             M_ITYPE(0,a,b,0x1c)             /* 64 mul     */
220 #define M_IDIV(a,b)             M_ITYPE(0,a,b,0x1a)             /* 32 div     */
221 #define M_LDIV(a,b)             M_ITYPE(0,a,b,0x1e)             /* 64 div     */
222
223 #define M_MFLO(a)               M_RTYPE(0,0,0,a,0,0x12)         /* quotient   */
224 #define M_MFHI(a)               M_RTYPE(0,0,0,a,0,0x10)         /* remainder  */
225
226 #define M_IADD_IMM(a,b,c)       M_ITYPE(0x09,a,c,b)             /* 32 add     */
227 #define M_LADD_IMM(a,b,c)       M_ITYPE(0x19,a,c,b)             /* 64 add     */
228 #define M_ISUB_IMM(a,b,c)       M_ITYPE(0x09,a,c,-(b))          /* 32 sub     */
229 #define M_LSUB_IMM(a,b,c)       M_ITYPE(0x19,a,c,-(b))          /* 64 sub     */
230
231 #define M_LUI(a,imm)            M_ITYPE(0x0f,0,a,imm)           /* a = imm<<16*/
232
233 #define M_CMPLT(a,b,c)          M_RTYPE(0,a,b,c,0,0x2a)         /* c = a <  b */
234 #define M_CMPGT(a,b,c)          M_RTYPE(0,b,a,c,0,0x2a)         /* c = a >  b */
235
236 #define M_CMPULT(a,b,c)         M_RTYPE(0,a,b,c,0,0x2b)         /* c = a <  b */
237 #define M_CMPUGT(a,b,c)         M_RTYPE(0,b,a,c,0,0x2b)         /* c = a >  b */
238
239 #define M_CMPLT_IMM(a,b,c)      M_ITYPE(0x0a,a,c,b)             /* c = a <  b */
240 #define M_CMPULT_IMM(a,b,c)     M_ITYPE(0x0b,a,c,b)             /* c = a <  b */
241
242 #define M_AND(a,b,c)            M_RTYPE(0,a,b,c,0,0x24)         /* c = a &  b */
243 #define M_OR( a,b,c)            M_RTYPE(0,a,b,c,0,0x25)         /* c = a |  b */
244 #define M_XOR(a,b,c)            M_RTYPE(0,a,b,c,0,0x26)         /* c = a ^  b */
245
246 #define M_AND_IMM(a,b,c)        M_ITYPE(0x0c,a,c,b)             /* c = a &  b */
247 #define M_OR_IMM( a,b,c)        M_ITYPE(0x0d,a,c,b)             /* c = a |  b */
248 #define M_XOR_IMM(a,b,c)        M_ITYPE(0x0e,a,c,b)             /* c = a ^  b */
249
250 #define M_CZEXT(a,c)            M_AND_IMM(a,0xffff,c)           /* c = zext(a)*/
251
252 #define M_ISLL(a,b,c)           M_RTYPE(0,b,a,c,0,0x04)         /* c = a << b */
253 #define M_ISRL(a,b,c)           M_RTYPE(0,b,a,c,0,0x06)         /* c = a >>>b */
254 #define M_ISRA(a,b,c)           M_RTYPE(0,b,a,c,0,0x07)         /* c = a >> b */
255 #define M_LSLL(a,b,c)           M_RTYPE(0,b,a,c,0,0x14)         /* c = a << b */
256 #define M_LSRL(a,b,c)           M_RTYPE(0,b,a,c,0,0x16)         /* c = a >>>b */
257 #define M_LSRA(a,b,c)           M_RTYPE(0,b,a,c,0,0x17)         /* c = a >> b */
258
259 #define M_ISLL_IMM(a,b,c)       M_RTYPE(0,0,a,c,(b)&31,0x00)    /* c = a << b */
260 #define M_ISRL_IMM(a,b,c)       M_RTYPE(0,0,a,c,(b)&31,0x02)    /* c = a >>>b */
261 #define M_ISRA_IMM(a,b,c)       M_RTYPE(0,0,a,c,(b)&31,0x03)    /* c = a >> b */
262 #define M_LSLL_IMM(a,b,c) M_RTYPE(0,0,a,c,(b)&31,0x38+((b)>>3&4)) /*c = a << b*/
263 #define M_LSRL_IMM(a,b,c) M_RTYPE(0,0,a,c,(b)&31,0x3a+((b)>>3&4)) /*c = a >>>b*/
264 #define M_LSRA_IMM(a,b,c) M_RTYPE(0,0,a,c,(b)&31,0x3b+((b)>>3&4)) /*c = a >> b*/
265
266 #define M_MOV(a,c)              M_OR(a,0,c)                     /* c = a      */
267 #define M_CLR(c)                M_OR(0,0,c)                     /* c = 0      */
268 #define M_NOP                   M_ISLL_IMM(0,0,0)               /* ;          */
269
270 /* floating point macros use the form OPERATION(source, source, dest)         */
271
272 #define M_FADD(a,b,c)           M_FP3(0x00,FMT_F,a,b,c)         /* flt add    */
273 #define M_DADD(a,b,c)           M_FP3(0x00,FMT_D,a,b,c)         /* dbl add    */
274 #define M_FSUB(a,b,c)           M_FP3(0x01,FMT_F,a,b,c)         /* flt sub    */
275 #define M_DSUB(a,b,c)           M_FP3(0x01,FMT_D,a,b,c)         /* dbl sub    */
276 #define M_FMUL(a,b,c)           M_FP3(0x02,FMT_F,a,b,c)         /* flt mul    */
277 #define M_DMUL(a,b,c)           M_FP3(0x02,FMT_D,a,b,c)         /* dbl mul    */
278 #define M_FDIV(a,b,c)           M_FP3(0x03,FMT_F,a,b,c)         /* flt div    */
279 #define M_DDIV(a,b,c)           M_FP3(0x03,FMT_D,a,b,c)         /* dbl div    */
280
281 #define M_FSQRT(a,c)            M_FP2(0x04,FMT_F,a,c)           /* flt sqrt   */
282 #define M_DSQRT(a,c)            M_FP2(0x04,FMT_D,a,c)           /* dbl sqrt   */
283 #define M_FABS(a,c)             M_FP2(0x05,FMT_F,a,c)           /* flt abs    */
284 #define M_DABS(a,c)             M_FP2(0x05,FMT_D,a,c)           /* dbl abs    */
285 #define M_FMOV(a,c)             M_FP2(0x06,FMT_F,a,c)           /* flt mov    */
286 #define M_DMOV(a,c)             M_FP2(0x06,FMT_D,a,c)           /* dbl mov    */
287 #define M_FNEG(a,c)             M_FP2(0x07,FMT_F,a,c)           /* flt neg    */
288 #define M_DNEG(a,c)             M_FP2(0x07,FMT_D,a,c)           /* dbl neg    */
289
290 #define M_ROUNDFI(a,c)          M_FP2(0x0c,FMT_F,a,c)           /* flt roundi */
291 #define M_ROUNDDI(a,c)          M_FP2(0x0c,FMT_D,a,c)           /* dbl roundi */
292 #define M_TRUNCFI(a,c)          M_FP2(0x0d,FMT_F,a,c)           /* flt trunci */
293 #define M_TRUNCDI(a,c)          M_FP2(0x0d,FMT_D,a,c)           /* dbl trunci */
294 #define M_CEILFI(a,c)           M_FP2(0x0e,FMT_F,a,c)           /* flt ceili  */
295 #define M_CEILDI(a,c)           M_FP2(0x0e,FMT_D,a,c)           /* dbl ceili  */
296 #define M_FLOORFI(a,c)          M_FP2(0x0f,FMT_F,a,c)           /* flt trunci */
297 #define M_FLOORDI(a,c)          M_FP2(0x0f,FMT_D,a,c)           /* dbl trunci */
298
299 #define M_ROUNDFL(a,c)          M_FP2(0x08,FMT_F,a,c)           /* flt roundl */
300 #define M_ROUNDDL(a,c)          M_FP2(0x08,FMT_D,a,c)           /* dbl roundl */
301 #define M_TRUNCFL(a,c)          M_FP2(0x09,FMT_F,a,c)           /* flt truncl */
302 #define M_TRUNCDL(a,c)          M_FP2(0x09,FMT_D,a,c)           /* dbl truncl */
303 #define M_CEILFL(a,c)           M_FP2(0x0a,FMT_F,a,c)           /* flt ceill  */
304 #define M_CEILDL(a,c)           M_FP2(0x0a,FMT_D,a,c)           /* dbl ceill  */
305 #define M_FLOORFL(a,c)          M_FP2(0x0b,FMT_F,a,c)           /* flt truncl */
306 #define M_FLOORDL(a,c)          M_FP2(0x0b,FMT_D,a,c)           /* dbl truncl */
307
308 #define M_CVTDF(a,c)            M_FP2(0x20,FMT_D,a,c)           /* dbl2flt    */
309 #define M_CVTIF(a,c)            M_FP2(0x20,FMT_I,a,c)           /* int2flt    */
310 #define M_CVTLF(a,c)            M_FP2(0x20,FMT_L,a,c)           /* long2flt   */
311 #define M_CVTFD(a,c)            M_FP2(0x21,FMT_F,a,c)           /* flt2dbl    */
312 #define M_CVTID(a,c)            M_FP2(0x21,FMT_I,a,c)           /* int2dbl    */
313 #define M_CVTLD(a,c)            M_FP2(0x21,FMT_L,a,c)           /* long2dbl   */
314 #define M_CVTFI(a,c)            M_FP2(0x24,FMT_F,a,c)           /* flt2int    */
315 #define M_CVTDI(a,c)            M_FP2(0x24,FMT_D,a,c)           /* dbl2int    */
316 #define M_CVTFL(a,c)            M_FP2(0x25,FMT_F,a,c)           /* flt2long   */
317 #define M_CVTDL(a,c)            M_FP2(0x25,FMT_D,a,c)           /* dbl2long   */
318
319 #define M_MOVDI(d,i)            M_FP3(0,0,d,i,0)                /* i = d      */
320 #define M_MOVDL(d,l)            M_FP3(0,1,d,l,0)                /* l = d      */
321 #define M_MOVID(i,d)            M_FP3(0,4,d,i,0)                /* d = i      */
322 #define M_MOVLD(l,d)            M_FP3(0,5,d,l,0)                /* d = l      */
323
324 #define M_FCMPFF(a,b)           M_FP3(0x30,FMT_F,a,b,0)         /* c = a == b */
325 #define M_FCMPFD(a,b)           M_FP3(0x30,FMT_D,a,b,0)         /* c = a == b */
326 #define M_FCMPUNF(a,b)          M_FP3(0x31,FMT_F,a,b,0)         /* c = a == b */
327 #define M_FCMPUND(a,b)          M_FP3(0x31,FMT_D,a,b,0)         /* c = a == b */
328 #define M_FCMPEQF(a,b)          M_FP3(0x32,FMT_F,a,b,0)         /* c = a == b */
329 #define M_FCMPEQD(a,b)          M_FP3(0x32,FMT_D,a,b,0)         /* c = a == b */
330 #define M_FCMPUEQF(a,b)         M_FP3(0x33,FMT_F,a,b,0)         /* c = a == b */
331 #define M_FCMPUEQD(a,b)         M_FP3(0x33,FMT_D,a,b,0)         /* c = a == b */
332 #define M_FCMPOLTF(a,b)         M_FP3(0x34,FMT_F,a,b,0)         /* c = a <  b */
333 #define M_FCMPOLTD(a,b)         M_FP3(0x34,FMT_D,a,b,0)         /* c = a <  b */
334 #define M_FCMPULTF(a,b)         M_FP3(0x35,FMT_F,a,b,0)         /* c = a <  b */
335 #define M_FCMPULTD(a,b)         M_FP3(0x35,FMT_D,a,b,0)         /* c = a <  b */
336 #define M_FCMPOLEF(a,b)         M_FP3(0x36,FMT_F,a,b,0)         /* c = a <= b */
337 #define M_FCMPOLED(a,b)         M_FP3(0x36,FMT_D,a,b,0)         /* c = a <= b */
338 #define M_FCMPULEF(a,b)         M_FP3(0x37,FMT_F,a,b,0)         /* c = a <= b */
339 #define M_FCMPULE(a,b)          M_FP3(0x37,FMT_D,a,b,0)         /* c = a <= b */
340
341 #define M_FBF(disp)             M_ITYPE(0x11,8,0,disp)          /* br false   */
342 #define M_FBT(disp)             M_ITYPE(0x11,8,1,disp)          /* br true    */
343 #define M_FBFL(disp)            M_ITYPE(0x11,8,2,disp)          /* br false   */
344 #define M_FBTL(disp)            M_ITYPE(0x11,8,3,disp)          /* br true    */
345
346 /*
347  * Load Address pseudo instruction:
348  * -n32 addressing mode -> 32 bit addrs, -64 addressing mode -> 64 bit addrs
349  */
350 #if POINTERSIZE==8
351 #define POINTERSHIFT 3
352 #define M_ALD(a,b,disp)         M_LLD(a,b,disp)
353 #define M_AST(a,b,disp)         M_LST(a,b,disp)
354 #define M_AADD(a,b,c)           M_LADD(a,b,c)
355 #define M_ASLL_IMM(a,b,c)       M_LSLL_IMM(a,b,c)
356 #define M_LDA(a,b,disp)         M_LADD_IMM(b,disp,a)            /* a = b+disp */
357 #else
358 #define POINTERSHIFT 2
359 #define M_ALD(a,b,disp)         M_ILD(a,b,disp)
360 #define M_AST(a,b,disp)         M_IST(a,b,disp)
361 #define M_AADD(a,b,c)           M_IADD(a,b,c)
362 #define M_ASLL_IMM(a,b,c)       M_ISLL_IMM(a,b,c)
363 #define M_LDA(a,b,disp)         M_IADD_IMM(b,disp,a)            /* a = b+disp */
364 #endif
365
366 /* macros for special commands (see an Alpha-manual for description) **********/ 
367
368 #if 0
369 #define M_CMOVEQ(a,b,c)         M_OP3 (0x11,0x24, a,b,c,0)     /* a==0 ? c=b  */
370 #define M_CMOVNE(a,b,c)         M_OP3 (0x11,0x26, a,b,c,0)     /* a!=0 ? c=b  */
371 #define M_CMOVLT(a,b,c)         M_OP3 (0x11,0x44, a,b,c,0)     /* a< 0 ? c=b  */
372 #define M_CMOVGE(a,b,c)         M_OP3 (0x11,0x46, a,b,c,0)     /* a>=0 ? c=b  */
373 #define M_CMOVLE(a,b,c)         M_OP3 (0x11,0x64, a,b,c,0)     /* a<=0 ? c=b  */
374 #define M_CMOVGT(a,b,c)         M_OP3 (0x11,0x66, a,b,c,0)     /* a> 0 ? c=b  */
375
376 #define M_CMOVEQ_IMM(a,b,c)     M_OP3 (0x11,0x24, a,b,c,1)     /* a==0 ? c=b  */
377 #define M_CMOVNE_IMM(a,b,c)     M_OP3 (0x11,0x26, a,b,c,1)     /* a!=0 ? c=b  */
378 #define M_CMOVLT_IMM(a,b,c)     M_OP3 (0x11,0x44, a,b,c,1)     /* a< 0 ? c=b  */
379 #define M_CMOVGE_IMM(a,b,c)     M_OP3 (0x11,0x46, a,b,c,1)     /* a>=0 ? c=b  */
380 #define M_CMOVLE_IMM(a,b,c)     M_OP3 (0x11,0x64, a,b,c,1)     /* a<=0 ? c=b  */
381 #define M_CMOVGT_IMM(a,b,c)     M_OP3 (0x11,0x66, a,b,c,1)     /* a> 0 ? c=b  */
382 #endif
383
384 /* function gen_resolvebranch **************************************************
385
386         backpatches a branch instruction; MIPS branch instructions are very
387         regular, so it is only necessary to overwrite some fixed bits in the
388         instruction.
389
390         parameters: ip ... pointer to instruction after branch (void*)
391                     so ... offset of instruction after branch  (s4)
392                     to ... offset of branch target             (s4)
393
394 *******************************************************************************/
395
396 #define gen_resolvebranch(ip,so,to) ((s4*)(ip))[-1]|=((s4)(to)-(so))>>2&0xffff
397
398 #define SOFTNULLPTRCHECK       /* soft null pointer check supportet as option */
399
400 void ngen_init();
401
402
403 /*
404  * These are local overrides for various environment variables in Emacs.
405  * Please do not remove this and leave it at the end of the file, where
406  * Emacs will automagically detect them.
407  * ---------------------------------------------------------------------
408  * Local variables:
409  * mode: c
410  * indent-tabs-mode: t
411  * c-basic-offset: 4
412  * tab-width: 4
413  * End:
414  */