1 /* mips/ngen.h *****************************************************************
3 Copyright (c) 1997 A. Krall, R. Grafl, M. Gschwind, M. Probst
5 See file COPYRIGHT for information on usage and disclaimer of warranties
7 Contains the machine dependent code generator definitions and macros for an
10 Authors: Andreas Krall EMAIL: cacao@complang.tuwien.ac.at
12 Last Change: 1998/11/12
14 *******************************************************************************/
16 /* see also file calling.doc for explanation of calling conventions */
18 /* preallocated registers *****************************************************/
20 /* integer registers */
22 #define REG_ZERO 0 /* allways zero */
24 #define REG_RESULT 2 /* to deliver method results */
26 #define REG_ITMP1 1 /* temporary register */
27 #define REG_ITMP2 3 /* temporary register and method pointer */
28 #define REG_ITMP3 24 /* temporary register */
30 #define REG_RA 31 /* return address */
31 #define REG_SP 29 /* stack pointer */
33 #define REG_PV 25 /* procedure vector, must be provided by caller */
34 #define REG_METHODPTR 24 /* pointer to the place from where the procedure */
35 /* vector has been fetched */
36 #define REG_ITMP1_XPTR 1 /* exception pointer = temporary register 1 */
37 #define REG_ITMP2_XPC 3 /* exception pc = temporary register 2 */
39 /* floating point registers */
41 #define REG_FRESULT 0 /* to deliver floating point method results */
42 #define REG_FTMP1 1 /* temporary floating point register */
43 #define REG_FTMP2 2 /* temporary floating point register */
44 #define REG_FTMP3 3 /* temporary floating point register */
46 #define REG_IFTMP 1 /* temporary integer and floating point register */
48 /* register descripton - array ************************************************/
50 /* #define REG_RES 0 reserved register for OS or code generator */
51 /* #define REG_RET 1 return value register */
52 /* #define REG_EXC 2 exception value register (only old jit) */
53 /* #define REG_SAV 3 (callee) saved register */
54 /* #define REG_TMP 4 scratch temporary register (caller saved) */
55 /* #define REG_ARG 5 argument register (caller saved) */
57 /* #define REG_END -1 last entry in tables */
60 REG_RES, REG_RES, REG_RET, REG_RES, REG_ARG, REG_ARG, REG_ARG, REG_ARG,
61 REG_ARG, REG_ARG, REG_ARG, REG_ARG, REG_TMP, REG_TMP, REG_TMP, REG_TMP,
62 REG_SAV, REG_SAV, REG_SAV, REG_SAV, REG_SAV, REG_SAV, REG_SAV, REG_SAV,
63 REG_RES, REG_RES, REG_RES, REG_RES, REG_SAV, REG_RES, REG_SAV, REG_RES,
66 #define INT_SAV_CNT 10 /* number of int callee saved registers */
67 #define INT_ARG_CNT 8 /* number of int argument registers */
69 /* for use of reserved registers, see comment above */
71 int nregdescfloat[] = {
72 REG_RET, REG_RES, REG_RES, REG_RES, REG_TMP, REG_TMP, REG_TMP, REG_TMP,
73 REG_TMP, REG_TMP, REG_TMP, REG_TMP, REG_ARG, REG_ARG, REG_ARG, REG_ARG,
74 REG_ARG, REG_ARG, REG_ARG, REG_ARG, REG_TMP, REG_TMP, REG_TMP, REG_TMP,
75 REG_SAV, REG_TMP, REG_SAV, REG_TMP, REG_SAV, REG_TMP, REG_SAV, REG_TMP,
78 #define FLT_SAV_CNT 4 /* number of flt callee saved registers */
79 #define FLT_ARG_CNT 8 /* number of flt argument registers */
81 /* for use of reserved registers, see comment above */
84 /* parameter allocation mode */
86 int nreg_parammode = PARAMMODE_NUMBERED;
88 /* parameter-registers will be allocated by assigning the
89 1. parameter: int/float-reg a0
90 2. parameter: int/float-reg a1
91 3. parameter: int/float-reg a2 ....
95 /* stackframe-infos ***********************************************************/
97 int parentargs_base; /* offset in stackframe for the parameter from the caller*/
99 /* -> see file 'calling.doc' */
102 /* macros to create code ******************************************************/
104 /* code generation macros operands:
106 fu ..... function-number
107 rs ..... register number source 1
108 rt ..... register number or constant integer source 2
109 rd ..... register number destination
110 imm .... immediate/offset
111 sa ..... shift amount
115 #define M_ITYPE(op, rs, rt, imm)\
116 *(mcodeptr++) = (((op)<<26)|((rs)<<21)|((rt)<<16)|((off)&0xffff))
118 #define M_JTYPE(op, imm)\
119 *(mcodeptr++) = (((op)<<26)|((off)&0x3ffffff))
121 #define M_RTYPE(op, rs, rt, rd, sa, fu)\
122 *(mcodeptr++) = (((op)<<26)|((rs)<<21)|((rt)<<16)|((rd)<<11)|((sa)<<6)|(fu)
124 #define M_FP2(fu, fmt, fs, fd) M_RTYPE(0x11, fmt, 0, fs, fd, fu)
125 #define M_FP3(fu, fmt, fs, ft, fd) M_RTYPE(0x11, fmt, ft, fs, fd, fu)
132 /* macros for all used commands (see a MIPS-manual for description) ***********/
134 /* load/store macros use the form OPERATION(source/dest, base, offset) */
136 #define M_BLDS(a,b,disp) M_ITYPE(0x20,b,a,disp) /* 8 load */
137 #define M_BLDU(a,b,disp) M_ITYPE(0x24,b,a,disp) /* 8 load */
138 #define M_SLDS(a,b,disp) M_ITYPE(0x21,b,a,disp) /* 16 load */
139 #define M_SLDU(a,b,disp) M_ITYPE(0x25,b,a,disp) /* 16 load */
140 #define M_ILD(a,b,disp) M_ITYPE(0x23,b,a,disp) /* 32 load */
141 #define M_LLD(a,b,disp) M_ITYPE(0x37,b,a,disp) /* 64 load */
142 #define M_BST(a,b,disp) M_ITYPE(0x28,b,a,disp) /* 8 store */
143 #define M_SST(a,b,disp) M_ITYPE(0x29,b,a,disp) /* 16 store */
144 #define M_IST(a,b,disp) M_ITYPE(0x2b,b,a,disp) /* 32 store */
145 #define M_LST(a,b,disp) M_ITYPE(0x3f,b,a,disp) /* 64 store */
147 #define M_FLD(a,b,disp) M_ITYPE(0x31,b,a,disp) /* load flt */
148 #define M_DLD(a,b,disp) M_ITYPE(0x35,b,a,disp) /* load dbl */
149 #define M_FST(a,b,disp) M_ITYPE(0x39,b,a,disp) /* store flt */
150 #define M_DST(a,b,disp) M_ITYPE(0x3d,b,a,disp) /* store dbl */
153 * Load Address pseudo instruction:
154 * -n32 addressing mode -> 32 bit addrs, -64 addressing mode -> 64 bit addrs
157 #define POINTERSHIFT 3
158 #define M_ALD(a,b,disp) M_LLD(a,b,disp)
159 #define M_AST(a,b,disp) M_LST(a,b,disp)
161 #define POINTERSHIFT 2
162 #define M_ALD(a,b,disp) M_ILD(a,b,disp)
163 #define M_AST(a,b,disp) M_IST(a,b,disp)
166 #define M_BEQ(a,b,disp) M_ITYPE(0x04,a,b,disp) /* br a == b */
167 #define M_BNE(a,b,disp) M_ITYPE(0x05,a,b,disp) /* br a != b */
168 #define M_BEQZ(a,disp) M_ITYPE(0x04,a,0,disp) /* br a == 0 */
169 #define M_BLTZ(a,disp) M_ITYPE(0x01,a,0,disp) /* br a < 0 */
170 #define M_BLEZ(a,disp) M_ITYPE(0x06,a,0,disp) /* br a <= 0 */
171 #define M_BNEZ(a,disp) M_ITYPE(0x05,a,0,disp) /* br a != 0 */
172 #define M_BGEZ(a,disp) M_ITYPE(0x01,a,1,disp) /* br a >= 0 */
173 #define M_BGTZ(a,disp) M_ITYPE(0x07,a,0,disp) /* br a > 0 */
175 #define M_BEQL(a,b,disp) M_ITYPE(0x14,a,b,disp) /* br a == b */
176 #define M_BNEL(a,b,disp) M_ITYPE(0x15,a,b,disp) /* br a != b */
177 #define M_BEQZL(a,disp) M_ITYPE(0x14,a,0,disp) /* br a == 0 */
178 #define M_BLTZL(a,disp) M_ITYPE(0x01,a,2,disp) /* br a < 0 */
179 #define M_BLEZL(a,disp) M_ITYPE(0x16,a,0,disp) /* br a <= 0 */
180 #define M_BNEZL(a,disp) M_ITYPE(0x15,a,0,disp) /* br a != 0 */
181 #define M_BGEZL(a,disp) M_ITYPE(0x01,a,3,disp) /* br a >= 0 */
182 #define M_BGTZL(a,disp) M_ITYPE(0x17,a,0,disp) /* br a > 0 */
184 #define M_BR(disp) M_ITYPE(0x04,0,0,disp) /* branch */
186 #define M_JMP(a) M_RTYPE(0,a,0,0,0,0x08) /* jump */
187 #define M_JSR(r,a) M_RTYPE(0,a,0,r,0,0x09) /* call */
188 #define M_RET(a) M_RTYPE(0,a,0,0,0,0x08) /* return */
190 #define M_TGE(a,b,code) M_RTYPE(0,a,b,0,code&3ff,0x30) /* trp a >= b */
191 #define M_TGEU(a,b,code) M_RTYPE(0,a,b,0,code&3ff,0x31) /* trp a >= b */
192 #define M_TLT(a,b,code) M_RTYPE(0,a,b,0,code&3ff,0x32) /* trp a < b */
193 #define M_TLTU(a,b,code) M_RTYPE(0,a,b,0,code&3ff,0x33) /* trp a < b */
194 #define M_TEQ(a,b,code) M_RTYPE(0,a,b,0,code&3ff,0x34) /* trp a == b */
195 #define M_TNE(a,b,code) M_RTYPE(0,a,b,0,code&3ff,0x36) /* trp a != b */
196 #define M_TLE(a,b,code) M_RTYPE(0,b,a,0,code&3ff,0x30) /* trp a <= b */
197 #define M_TLEU(a,b,code) M_RTYPE(0,b,a,0,code&3ff,0x31) /* trp a <= b */
198 #define M_TGT(a,b,code) M_RTYPE(0,b,a,0,code&3ff,0x32) /* trp a > b */
199 #define M_TGTU(a,b,code) M_RTYPE(0,b,a,0,code&3ff,0x33) /* trp a > b */
201 #define M_TGE_IMM(a,b) M_ITYPE(1,a,0x08,b) /* trp a >= b */
202 #define M_TGEU_IMM(a,b) M_ITYPE(1,a,0x09,b) /* trp a >= b */
203 #define M_TLT_IMM(a,b) M_ITYPE(1,a,0x0a,b) /* trp a < b */
204 #define M_TLTU_IMM(a,b) M_ITYPE(1,a,0x0b,b) /* trp a < b */
205 #define M_TEQ_IMM(a,b) M_ITYPE(1,a,0x0c,b) /* trp a == b */
206 #define M_TNE_IMM(a,b) M_ITYPE(1,a,0x0e,b) /* trp a != b */
208 #define M_TGT_IMM(a,b) M_ITYPE(1,a,0x08,b+1) /* trp a > b */
209 #define M_TGTU_IMM(a,b) M_ITYPE(1,a,0x09,b+1) /* trp a > b */
210 #define M_TLE_IMM(a,b) M_ITYPE(1,a,0x0a,b+1) /* trp a <= b */
211 #define M_TLEU_IMM(a,b) M_ITYPE(1,a,0x0b,b+1) /* trp a <= b */
214 /* arithmetic macros use the form OPERATION(source, source/immediate, dest) */
216 #define M_IADD(a,b,c) M_RTYPE(0,a,b,c,0,0x21) /* 32 add */
217 #define M_LADD(a,b,c) M_RTYPE(0,a,b,c,0,0x2d) /* 64 add */
218 #define M_ISUB(a,b,c) M_RTYPE(0,a,b,c,0,0x23) /* 32 sub */
219 #define M_LSUB(a,b,c) M_RTYPE(0,a,b,c,0,0x2f) /* 64 sub */
220 #define M_IMUL(a,b) M_ITYPE(0,a,b,0x18) /* 32 mul */
221 #define M_LMUL(a,b) M_ITYPE(0,a,b,0x1c) /* 64 mul */
222 #define M_IDIV(a,b) M_ITYPE(0,a,b,0x1b) /* 32 div */
223 #define M_LDIV(a,b) M_ITYPE(0,a,b,0x1e) /* 64 div */
225 #define M_MFLO(a) M_RTYPE(0,0,0,a,0,0x12) /* quotient */
226 #define M_MFHI(a) M_RTYPE(0,0,0,a,0,0x10) /* remainder */
228 #define M_IADD_IMM(a,b,c) M_ITYPE(0x08,a,c,b) /* 32 add */
229 #define M_LADD_IMM(a,b,c) M_ITYPE(0x18,a,c,b) /* 64 add */
230 #define M_ISUB_IMM(a,b,c) M_ITYPE(0x08,a,c,-(b)) /* 32 sub */
231 #define M_LSUB_IMM(a,b,c) M_ITYPE(0x18,a,c,-(b)) /* 64 sub */
233 #define M_LDA(a,b,disp) M_LADD_IMM(b,disp,a) /* a = b+disp */
235 #define M_CMPLT(a,b,c) M_RTYPE(0,a,b,c,0,0x2a) /* c = a < b */
236 #define M_CMPGT(a,b,c) M_RTYPE(0,b,a,c,0,0x2a) /* c = a > b */
238 #define M_CMPULT(a,b,c) M_RTYPE(0,a,b,c,0,0x2b) /* c = a < b */
239 #define M_CMPUGT(a,b,c) M_RTYPE(0,b,a,c,0,0x2b) /* c = a > b */
241 #define M_CMPLT_IMM(a,b,c) M_ITYPE(0x0a,a,c,b) /* c = a < b */
242 #define M_CMPULT_IMM(a,b,c) M_ITYPE(0x0b,a,c,b) /* c = a < b */
244 #define M_AND(a,b,c) M_RTYPE(0,a,b,c,0,0x24) /* c = a & b */
245 #define M_OR( a,b,c) M_RTYPE(0,a,b,c,0,0x25) /* c = a | b */
246 #define M_XOR(a,b,c) M_RTYPE(0,a,b,c,0,0x26) /* c = a ^ b */
248 #define M_AND_IMM(a,b,c) M_ITYPE(0x0c,a,c,b) /* c = a & b */
249 #define M_OR_IMM( a,b,c) M_ITYPE(0x0d,a,c,b) /* c = a | b */
250 #define M_XOR_IMM(a,b,c) M_ITYPE(0x0e,a,c,b) /* c = a ^ b */
252 #define M_MOV(a,c) M_OR(a,a,c) /* c = a */
253 #define M_CLR(c) M_OR(0,0,c) /* c = 0 */
254 #define M_NOP M_OR(0,0,0) /* ; */
256 #define M_ISLL(a,b,c) M_RTYPE(0,b,a,c,0,0x04) /* c = a << b */
257 #define M_ISRL(a,b,c) M_RTYPE(0,b,a,c,0,0x06) /* c = a >>>b */
258 #define M_ISRA(a,b,c) M_RTYPE(0,b,a,c,0,0x07) /* c = a >> b */
259 #define M_LSLL(a,b,c) M_RTYPE(0,b,a,c,0,0x14) /* c = a << b */
260 #define M_LSRL(a,b,c) M_RTYPE(0,b,a,c,0,0x16) /* c = a >>>b */
261 #define M_LSRA(a,b,c) M_RTYPE(0,b,a,c,0,0x17) /* c = a >> b */
263 #define M_ISLL_IMM(a,b,c) M_RTYPE(0,0,a,c,b&1f,0x00) /* c = a << b */
264 #define M_ISRL_IMM(a,b,c) M_RTYPE(0,0,a,c,b&1f,0x02) /* c = a >>>b */
265 #define M_ISRA_IMM(a,b,c) M_RTYPE(0,0,a,c,b&1f,0x03) /* c = a >> b */
266 #define M_LSLL_IMM(a,b,c) M_RTYPE(0,0,a,c,b&1f,0x38+4*(b&x020)) /* c = a << b */
267 #define M_LSRL_IMM(a,b,c) M_RTYPE(0,0,a,c,b&1f,0x3a+4*(b&x020)) /* c = a >>>b */
268 #define M_LSRA_IMM(a,b,c) M_RTYPE(0,0,a,c,b&1f,0x3b+4*(b&x020)) /* c = a >> b */
270 /* floating point macros use the form OPERATION(source, source, dest) */
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 */
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 */
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 */
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 */
308 #define M_CVTDF(b,c) M_FP2(0x20,FMT_D,a,c) /* dbl2flt */
309 #define M_CVTIF(b,c) M_FP2(0x20,FMT_I,a,c) /* int2flt */
310 #define M_CVTLF(b,c) M_FP2(0x20,FMT_L,a,c) /* long2flt */
311 #define M_CVTFD(b,c) M_FP2(0x21,FMT_F,a,c) /* flt2dbl */
312 #define M_CVTID(b,c) M_FP2(0x21,FMT_I,a,c) /* int2dbl */
313 #define M_CVTLD(b,c) M_FP2(0x21,FMT_L,a,c) /* long2dbl */
314 #define M_CVTFI(b,c) M_FP2(0x24,FMT_F,a,c) /* flt2int */
315 #define M_CVTDI(b,c) M_FP2(0x24,FMT_D,a,c) /* dbl2int */
316 #define M_CVTFL(b,c) M_FP2(0x25,FMT_F,a,c) /* flt2long */
317 #define M_CVTDL(b,c) M_FP2(0x25,FMT_D,a,c) /* dbl2long */
319 #define M_MOVDL(d,l) M_FP3(0,1,l,d,0) /* l = d */
320 #define M_MOVLD(l,d) M_FP3(0,5,l,d,0) /* d = l */
322 #define M_FCMPFF(a,b) M_FP3(0x30,FMT_F,a,b,0) /* c = a == b */
323 #define M_FCMPFD(a,b) M_FP3(0x30,FMT_D,a,b,0) /* c = a == b */
324 #define M_FCMPUNF(a,b) M_FP3(0x30,FMT_F,a,b,0) /* c = a == b */
325 #define M_FCMPUND(a,b) M_FP3(0x30,FMT_D,a,b,0) /* c = a == b */
326 #define M_FCMPEQF(a,b) M_FP3(0x30,FMT_F,a,b,0) /* c = a == b */
327 #define M_FCMPEQD(a,b) M_FP3(0x30,FMT_D,a,b,0) /* c = a == b */
328 #define M_FCMPUEQF(a,b) M_FP3(0x30,FMT_F,a,b,0) /* c = a == b */
329 #define M_FCMPUEQD(a,b) M_FP3(0x30,FMT_D,a,b,0) /* c = a == b */
330 #define M_FCMPOLTF(a,b) M_FP3(0x30,FMT_F,a,b,0) /* c = a < b */
331 #define M_FCMPOLTD(a,b) M_FP3(0x30,FMT_D,a,b,0) /* c = a < b */
332 #define M_FCMPULTF(a,b) M_FP3(0x30,FMT_F,a,b,0) /* c = a < b */
333 #define M_FCMPULTD(a,b) M_FP3(0x30,FMT_D,a,b,0) /* c = a < b */
334 #define M_FCMPOLEF(a,b) M_FP3(0x30,FMT_F,a,b,0) /* c = a <= b */
335 #define M_FCMPOLED(a,b) M_FP3(0x30,FMT_D,a,b,0) /* c = a <= b */
336 #define M_FCMPULEF(a,b) M_FP3(0x30,FMT_F,a,b,0) /* c = a <= b */
337 #define M_FCMPULE(a,b) M_FP3(0x30,FMT_D,a,b,0) /* c = a <= b */
339 #define M_FBF(disp) M_ITYPE(0x11,8,0,disp) /* br false */
340 #define M_FBT(disp) M_ITYPE(0x11,8,1,disp) /* br true */
341 #define M_FBFL(disp) M_ITYPE(0x11,8,2,disp) /* br false */
342 #define M_FBTL(disp) M_ITYPE(0x11,8,3,disp) /* br true */
344 /* macros for special commands (see an Alpha-manual for description) **********/
347 #define M_CMOVEQ(a,b,c) M_OP3 (0x11,0x24, a,b,c,0) /* a==0 ? c=b */
348 #define M_CMOVNE(a,b,c) M_OP3 (0x11,0x26, a,b,c,0) /* a!=0 ? c=b */
349 #define M_CMOVLT(a,b,c) M_OP3 (0x11,0x44, a,b,c,0) /* a< 0 ? c=b */
350 #define M_CMOVGE(a,b,c) M_OP3 (0x11,0x46, a,b,c,0) /* a>=0 ? c=b */
351 #define M_CMOVLE(a,b,c) M_OP3 (0x11,0x64, a,b,c,0) /* a<=0 ? c=b */
352 #define M_CMOVGT(a,b,c) M_OP3 (0x11,0x66, a,b,c,0) /* a> 0 ? c=b */
354 #define M_CMOVEQ_IMM(a,b,c) M_OP3 (0x11,0x24, a,b,c,1) /* a==0 ? c=b */
355 #define M_CMOVNE_IMM(a,b,c) M_OP3 (0x11,0x26, a,b,c,1) /* a!=0 ? c=b */
356 #define M_CMOVLT_IMM(a,b,c) M_OP3 (0x11,0x44, a,b,c,1) /* a< 0 ? c=b */
357 #define M_CMOVGE_IMM(a,b,c) M_OP3 (0x11,0x46, a,b,c,1) /* a>=0 ? c=b */
358 #define M_CMOVLE_IMM(a,b,c) M_OP3 (0x11,0x64, a,b,c,1) /* a<=0 ? c=b */
359 #define M_CMOVGT_IMM(a,b,c) M_OP3 (0x11,0x66, a,b,c,1) /* a> 0 ? c=b */
362 /* function gen_resolvebranch **************************************************
364 backpatches a branch instruction; MIPS branch instructions are very
365 regular, so it is only necessary to overwrite some fixed bits in the
368 parameters: ip ... pointer to instruction after branch (void*)
369 so ... offset of instruction after branch (s4)
370 to ... offset of branch target (s4)
372 *******************************************************************************/
374 #define gen_resolvebranch(ip,so,to) ((s4*)(ip))[-1]|=((s4)(to)-(so))>>2&0xffff
376 #define SOFTNULLPTRCHECK /* soft null pointer check supportet as option */
380 * These are local overrides for various environment variables in Emacs.
381 * Please do not remove this and leave it at the end of the file, where
382 * Emacs will automagically detect them.
383 * ---------------------------------------------------------------------
386 * indent-tabs-mode: t