1 /******************************** -*- C -*- ****************************
2  *
3  *	Platform-independent layer support
4  *
5  ***********************************************************************/
6 
7 
8 /***********************************************************************
9  *
10  * Copyright 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
11  * Written by Paolo Bonzini.
12  *
13  * This file is part of GNU lightning.
14  *
15  * GNU lightning is free software; you can redistribute it and/or modify it
16  * under the terms of the GNU Lesser General Public License as published
17  * by the Free Software Foundation; either version 3, or (at your option)
18  * any later version.
19  *
20  * GNU lightning is distributed in the hope that it will be useful, but
21  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
22  * or  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
23  * License for more details.
24  *
25  * You should have received a copy of the GNU Lesser General Public License
26  * along with GNU lightning; see the file COPYING.LESSER; if not, write to the
27  * Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
28  * MA 02110-1301, USA.
29  *
30  ***********************************************************************/
31 
32 #ifndef __lightning_core_common_h_
33 #define __lightning_core_common_h_
34 
35 #define JIT_NOREG			(-1)
36 
37 #define	jit_get_raw_ip()		_jitp->x.pc
38 #define	jit_get_ip()			jit_adjust_ip(_jitp->x.pc)
39 #define	jit_set_ip(ptr)			(_jitp->x.pc = (ptr), jit_get_ip ())
40 #define	jit_get_label()			jit_get_ip()
41 #define	jit_forward()			jit_get_ip()
42 
43 #define jit_adjust_ip(x) ((jit_insn *)(((char *)(x)) + (jit_thumb_p() ? 1 : 0)))
44 #define jit_unadjust_ip(x) ((jit_insn *)(((char *)(x)) - (jit_thumb_p() ? 1 : 0)))
45 
46 #define	jit_field(struc, f)		( ((long) (&((struc *) 8)->f) ) - 8)
47 #define	jit_ptr_field(struc_p, f)	( ((long) (&((struc_p) 8)->f) ) - 8)
48 
49 /* realignment via N-byte no-ops */
50 
51 #ifndef jit_align
52 #define jit_align(n)
53 #endif
54 
55 /* jit_code: union of many possible function pointer types.  Returned
56  * by jit_get_ip().
57  */
58 typedef union jit_code {
59   char		 *ptr;
60   void		 (*vptr)(void);
61   char		 (*cptr)(void);
62   unsigned char	 (*ucptr)(void);
63   short		 (*sptr)(void);
64   unsigned short (*usptr)(void);
65   int		 (*iptr)(void);
66   unsigned int	 (*uiptr)(void);
67   long		 (*lptr)(void);
68   unsigned long	 (*ulptr)(void);
69   void *	 (*pptr)(void);
70   float		 (*fptr)(void);
71   double	 (*dptr)(void);
72 } jit_code;
73 
74 #ifndef jit_fill_delay_after
75 #define jit_fill_delay_after(branch)	(branch)
76 #endif
77 
78 #define jit_delay(insn, branch)		((insn), jit_fill_delay_after(branch))
79 
80 
81 /* ALU synonyms */
82 #if !defined(jit_addci_ui)
83 #  if !defined(jit_addci_i)
84      /* need add/sub that sets carry for all operands */
85 #    if _ASM_SAFETY
86 #      warning Assuming jit_{add,sub}{r,i}_{i,ui} always sets carry
87 #    endif
88 #    define jit_addci_ui(d, rs, is)	jit_addi_ui((d), (rs), (is))
89 #    define jit_addcr_ui(d, s1, s2)	jit_addr_ui((d), (s1), (s2))
90 #    define jit_subci_ui(d, rs, is)	jit_subi_ui((d), (rs), (is))
91 #    define jit_subcr_ui(d, s1, s2)	jit_subr_ui((d), (s1), (s2))
92 #  elif defined(jit_addci_i)
93      /* allow logically reversed definitions */
94 #    define jit_addci_ui(d, rs, is)	jit_addci_i((d), (rs), (is))
95 #    define jit_addcr_ui(d, s1, s2)	jit_addcr_i((d), (s1), (s2))
96 #    define jit_subci_ui(d, rs, is)	jit_subci_i((d), (rs), (is))
97 #    define jit_subcr_ui(d, s1, s2)	jit_subcr_i((d), (s1), (s2))
98 #  endif
99 #endif
100 #if !defined(jit_addci_i) && defined(jit_addci_ui)
101    /* provide compatibility logically wrong definitions */
102 #  define jit_addci_i(d, rs, is)	jit_addci_ui((d), (rs), (is))
103 #  define jit_addcr_i(d, s1, s2)	jit_addcr_ui((d), (s1), (s2))
104 #  define jit_subci_i(d, rs, is)	jit_subci_ui((d), (rs), (is))
105 #  define jit_subcr_i(d, s1, s2)	jit_subcr_ui((d), (s1), (s2))
106 #endif
107 #if !defined(jit_addxi_ui) && defined(jit_addxi_i)
108    /* allow logically reversed definitions */
109 #  define jit_addxi_ui(d, rs, is)	jit_addxi_i((d), (rs), (is))
110 #  define jit_addxr_ui(d, s1, s2)	jit_addxr_i((d), (s1), (s2))
111 #  define jit_subxi_ui(d, rs, is)	jit_subxi_i((d), (rs), (is))
112 #  define jit_subxr_ui(d, s1, s2)	jit_subxr_i((d), (s1), (s2))
113 #endif
114 #if !defined(jit_addxi_i) && defined(jit_addxi_ui)
115    /* provide compatibility logically wrong definitions */
116 #  define jit_addxi_i(d, rs, is)	jit_addxi_ui((d), (rs), (is))
117 #  define jit_addxr_i(d, s1, s2)	jit_addxr_ui((d), (s1), (s2))
118 #  define jit_subxi_i(d, rs, is)	jit_subxi_ui((d), (rs), (is))
119 #  define jit_subxr_i(d, s1, s2)	jit_subxr_ui((d), (s1), (s2))
120 #endif
121 
122 #define jit_addi_ui(d, rs, is)		jit_addi_i((d), (rs), (is))
123 #define jit_addr_ui(d, s1, s2)		jit_addr_i((d), (s1), (s2))
124 #define jit_andi_ui(d, rs, is)		jit_andi_i((d), (rs), (is))
125 #define jit_andr_ui(d, s1, s2)		jit_andr_i((d), (s1), (s2))
126 #define jit_lshi_ui(d, rs, is)		jit_lshi_i((d), (rs), (is))
127 #define jit_lshr_ui(d, s1, s2)		jit_lshr_i((d), (s1), (s2))
128 #ifndef jit_movi_ui
129 #  define jit_movi_ui(d, rs)		jit_movi_i((d), (rs))
130 #endif
131 #define jit_movr_ui(d, rs)		jit_movr_i((d), (rs))
132 #define jit_ori_ui(d, rs, is)		jit_ori_i((d), (rs), (is))
133 #define jit_orr_ui(d, s1, s2)		jit_orr_i((d), (s1), (s2))
134 #define jit_rsbi_ui(d, rs, is)		jit_rsbi_i((d), (rs), (is))
135 #define jit_rsbr_ui(d, s1, s2)		jit_rsbr_i((d), (s1), (s2))
136 #define jit_subi_ui(d, rs, is)		jit_subi_i((d), (rs), (is))
137 #define jit_subr_ui(d, s1, s2)		jit_subr_i((d), (s1), (s2))
138 #define jit_xori_ui(d, rs, is)		jit_xori_i((d), (rs), (is))
139 #define jit_xorr_ui(d, s1, s2)		jit_xorr_i((d), (s1), (s2))
140 
141 #if __WORDSIZE == 32
142    /* common definitions when sizeof(long) == sizeof(int) */
143 #  if !defined(jit_addci_ul) && defined(jit_addci_ui)
144 #    define jit_addci_ul(d, rs, is)	jit_addci_ui((d), (rs), (is))
145 #    define jit_addcr_ul(d, s1, s2)	jit_addcr_ui((d), (s1), (s2))
146 #    define jit_subci_ul(d, rs, is)	jit_subci_ui((d), (rs), (is))
147 #    define jit_subcr_ul(d, s1, s2)	jit_subcr_ui((d), (s1), (s2))
148 #  endif
149 #  if !defined(jit_addxi_ul) && defined(jit_addxi_ui)
150 #    define jit_addxi_ul(d, rs, is)	jit_addxi_ui((d), (rs), (is))
151 #    define jit_addxr_ul(d, s1, s2)	jit_addxr_ui((d), (s1), (s2))
152 #    define jit_subxi_ul(d, rs, is)	jit_subxi_ui((d), (rs), (is))
153 #    define jit_subxr_ul(d, s1, s2)	jit_subxr_ui((d), (s1), (s2))
154 #  endif
155 #endif
156 #if !defined(jit_addci_ul)
157 #  if !defined(jit_addci_l)
158      /* need add/sub that sets carry for all operands */
159 #    if _ASM_SAFETY
160 #      warning Assuming jit_{add,sub}{r,i}_{l,ul} always sets carry
161 #    endif
162 #    define jit_addci_ul(d, rs, is)	jit_addi_ul((d), (rs), (is))
163 #    define jit_addcr_ul(d, s1, s2)	jit_addr_ul((d), (s1), (s2))
164 #    define jit_subci_ul(d, rs, is)	jit_subi_ul((d), (rs), (is))
165 #    define jit_subcr_ul(d, s1, s2)	jit_subr_ul((d), (s1), (s2))
166 #  elif defined(jit_addci_l)
167      /* allow logically reversed definitions */
168 #    define jit_addci_ul(d, rs, is)	jit_addci_l((d), (rs), (is))
169 #    define jit_addcr_ul(d, s1, s2)	jit_addcr_l((d), (s1), (s2))
170 #    define jit_subci_ul(d, rs, is)	jit_subci_l((d), (rs), (is))
171 #    define jit_subcr_ul(d, s1, s2)	jit_subcr_l((d), (s1), (s2))
172 #  endif
173 #endif
174 #if !defined(jit_addci_l) && defined(jit_addci_ul)
175   /* provide compatibility logically wrong definitions */
176 #  define jit_addci_l(d, rs, is)	jit_addci_ul((d), (rs), (is))
177 #  define jit_addcr_l(d, s1, s2)	jit_addcr_ul((d), (s1), (s2))
178 #  define jit_subci_l(d, rs, is)	jit_subci_ul((d), (rs), (is))
179 #  define jit_subcr_l(d, s1, s2)	jit_subcr_ul((d), (s1), (s2))
180 #endif
181 #if !defined(jit_addxi_ul) && defined(jit_addxi_l)
182    /* allow logically reversed definitions */
183 #  define jit_addxi_ul(d, rs, is)	jit_addxi_l((d), (rs), (is))
184 #  define jit_addxr_ul(d, s1, s2)	jit_addxr_l((d), (s1), (s2))
185 #  define jit_subxi_ul(d, rs, is)	jit_subxi_l((d), (rs), (is))
186 #  define jit_subxr_ul(d, s1, s2)	jit_subxr_l((d), (s1), (s2))
187 #endif
188 #if !defined(jit_addxi_l) && defined(jit_addxi_ul)
189    /* provide compatibility logically wrong definitions */
190 #  define jit_addxi_l(d, rs, is)	jit_addxi_ul((d), (rs), (is))
191 #  define jit_addxr_l(d, s1, s2)	jit_addxr_ul((d), (s1), (s2))
192 #  define jit_subxi_l(d, rs, is)	jit_subxi_ul((d), (rs), (is))
193 #  define jit_subxr_l(d, s1, s2)	jit_subxr_ul((d), (s1), (s2))
194 #endif
195 #define jit_addi_ul(d, rs, is)		jit_addi_l((d), (rs), (is))
196 #define jit_addr_ul(d, s1, s2)		jit_addr_l((d), (s1), (s2))
197 #define jit_andi_ul(d, rs, is)		jit_andi_l((d), (rs), (is))
198 #define jit_andr_ul(d, s1, s2)		jit_andr_l((d), (s1), (s2))
199 #define jit_lshi_ul(d, rs, is)		jit_lshi_l((d), (rs), (is))
200 #define jit_lshr_ul(d, s1, s2)		jit_lshr_l((d), (s1), (s2))
201 #ifndef jit_movi_ul
202 #  define jit_movi_ul(d, rs)		jit_movi_l((d), (rs))
203 #endif
204 #ifndef jit_movr_ul
205 #  define jit_movr_ul(d, rs)		jit_movr_l((d), (rs))
206 #endif
207 #define jit_ori_ul(d, rs, is)		jit_ori_l((d), (rs), (is))
208 #define jit_orr_ul(d, s1, s2)		jit_orr_l((d), (s1), (s2))
209 #define jit_rsbi_ul(d, rs, is)		jit_rsbi_l((d), (rs), (is))
210 #define jit_rsbr_ul(d, s1, s2)		jit_rsbr_l((d), (s1), (s2))
211 #define jit_subi_ul(d, rs, is)		jit_subi_l((d), (rs), (is))
212 #define jit_subr_ul(d, s1, s2)		jit_subr_l((d), (s1), (s2))
213 #define jit_xori_ul(d, rs, is)		jit_xori_l((d), (rs), (is))
214 #define jit_xorr_ul(d, s1, s2)		jit_xorr_l((d), (s1), (s2))
215 #define jit_addr_p(d, s1, s2)		jit_addr_ul((d), (s1), 	      (s2))
216 #define jit_addi_p(d, rs, is)		jit_addi_ul((d), (rs), (long) (is))
217 #ifndef jit_movr_p
218 #  define jit_movr_p(d, rs)		jit_movr_ul((d),              (rs))
219 #endif
220 #define jit_subr_p(d, s1, s2)		jit_subr_ul((d), (s1),        (s2))
221 #define jit_subi_p(d, rs, is)		jit_subi_ul((d), (rs), (long) (is))
222 #define jit_rsbi_p(d, rs, is)		jit_rsbi_ul((d), (rs), (long) (is))
223 
224 #ifndef jit_movi_p
225 #define jit_movi_p(d, is)		(jit_movi_ul((d),       (long) (is)), jit_get_ip())
226 #endif
227 
228 #define jit_patch(pv)        		jit_patch_at ((pv), jit_get_ip())
229 
230 /* NEG is not mandatory -- pick an appropriate implementation */
231 #ifndef jit_negr_i
232 #  ifdef JIT_RZERO
233 #    define jit_negr_i(d, rs)		jit_subr_i((d), JIT_RZERO, (rs))
234 #      if __WORDSIZE == 64
235 #        define jit_negr_l(d, rs)	jit_subr_l((d), JIT_RZERO, (rs))
236 #      endif
237 #  else /* !JIT_RZERO */
238 #    ifndef jit_rsbi_i
239 #      define jit_negr_i(d, rs)		(jit_xori_i((d), (rs), -1), jit_addi_l((d), (d), 1))
240 #      define jit_negr_l(d, rs)		(jit_xori_l((d), (rs), -1), jit_addi_l((d), (d), 1))
241 #    else /* jit_rsbi_i */
242 #      define jit_negr_i(d, rs)		jit_rsbi_i((d), (rs), 0)
243 #      define jit_negr_l(d, rs)		jit_rsbi_l((d), (rs), 0)
244 #    endif /* jit_rsbi_i */
245 #  endif /* !JIT_RZERO */
246 #endif /* !jit_negr_i */
247 
248 /* Common 'shortcut' implementations */
249 #ifndef jit_subi_i
250 #  define jit_subi_i(d, rs, is)		jit_addi_i((d), (rs), -(is))
251 #endif
252 #ifndef jit_subi_l
253 #  define jit_subi_l(d, rs, is)		jit_subi_i((d), (rs), (is))
254 #endif
255 #define jit_rsbr_f(d, s1, s2)		jit_subr_f((d), (s2), (s1))
256 #define jit_rsbr_d(d, s1, s2)		jit_subr_d((d), (s2), (s1))
257 #ifndef jit_rsbr_i
258 #  define jit_rsbr_i(d, s1, s2)		jit_subr_i((d), (s2), (s1))
259 #endif
260 #define jit_rsbr_l(d, s1, s2)		jit_subr_l((d), (s2), (s1))
261 #define jit_rsbr_p(d, s1, s2)		jit_subr_p((d), (s2), (s1))
262 
263 /* Unary */
264 #ifndef jit_notr_i
265 #  define jit_notr_i(d, rs)		jit_xori_i((d), (rs), ~0)
266 #endif
267 #ifndef jit_notr_l
268 #  define jit_notr_l(d, rs)		jit_xori_l((d), (rs), ~0L)
269 #endif
270 #ifndef jit_notr_c
271 #  define jit_notr_c(d, rs)		jit_notr_i((d), (rs))
272 #  define jit_notr_uc(d, rs)		jit_notr_i((d), (rs))
273 #  define jit_notr_s(d, rs)		jit_notr_i((d), (rs))
274 #  define jit_notr_us(d, rs)		jit_notr_i((d), (rs))
275 #endif
276 #ifndef jit_notr_ui
277 #  define jit_notr_ui(d, rs)		jit_notr_i((d), (rs))
278 #endif
279 #ifndef jit_notr_ul
280 #  define jit_notr_ul(d, rs)		jit_notr_l((d), (rs))
281 #endif
282 
283 #ifndef jit_extr_c_ui
284 #  define jit_extr_c_ui(d, rs)		jit_andi_ui((d), (rs), 0xFF)
285 #endif
286 #ifndef jit_extr_s_ui
287 #  define jit_extr_s_ui(d, rs)		jit_andi_ui((d), (rs), 0xFFFF)
288 #endif
289 #ifndef jit_extr_c_i
290 #  define jit_extr_c_i(d, rs)		(jit_lshi_i((d), (rs), 24), jit_rshi_i((d), (d), 24))
291 #endif
292 #ifndef jit_extr_s_i
293 #  define jit_extr_s_i(d, rs)		(jit_lshi_i((d), (rs), 16), jit_rshi_i((d), (d), 16))
294 #endif
295 
296 #if __WORDSIZE == 64
297 #  ifndef jit_extr_c_l
298 #    define jit_extr_c_l(d, rs)		(jit_lshi_l((d), (rs), 56), jit_rshi_l((d), (d), 56))
299 #  endif
300 #  ifndef jit_extr_s_l
301 #    define jit_extr_s_l(d, rs)		(jit_lshi_l((d), (rs), 48), jit_rshi_l((d), (d), 48))
302 #  endif
303 #  ifndef jit_extr_i_l
304 #    define jit_extr_i_l(d, rs)		(jit_lshi_l((d), (rs), 32), jit_rshi_l((d), (d), 32))
305 #  endif
306 #  ifndef jit_extr_c_ul
307 #    define jit_extr_c_ul(d, rs)	jit_andi_l((d), (rs), 0xFF)
308 #  endif
309 #  ifndef jit_extr_s_ul
310 #    define jit_extr_s_ul(d, rs)	jit_andi_l((d), (rs), 0xFFFF)
311 #  endif
312 #  ifndef jit_extr_i_ul
313 #    define jit_extr_i_ul(d, rs)	jit_andi_l((d), (rs), 0xFFFFFFFFUL)
314 #  endif
315 #endif	/* __WORDSIZE == 64 */
316 
317 #define jit_extr_c_s(d, rs)		jit_extr_c_i((d), (rs))
318 #define jit_extr_c_us(d, rs)		jit_extr_c_ui((d), (rs))
319 #define jit_extr_uc_s(d, rs)		jit_extr_uc_i((d), (rs))
320 #define jit_extr_uc_us(d, rs)		jit_extr_uc_ui((d), (rs))
321 #define jit_extr_uc_i(d, rs)		jit_extr_c_ui((d), (rs))
322 #define jit_extr_uc_ui(d, rs)		jit_extr_c_ui((d), (rs))
323 #define jit_extr_us_i(d, rs)		jit_extr_s_ui((d), (rs))
324 #define jit_extr_us_ui(d, rs)		jit_extr_s_ui((d), (rs))
325 #define jit_extr_uc_l(d, rs)		jit_extr_c_ul((d), (rs))
326 #define jit_extr_uc_ul(d, rs)		jit_extr_c_ul((d), (rs))
327 #define jit_extr_us_l(d, rs)		jit_extr_s_ul((d), (rs))
328 #define jit_extr_us_ul(d, rs)		jit_extr_s_ul((d), (rs))
329 #define jit_extr_ui_l(d, rs)		jit_extr_i_ul((d), (rs))
330 #define jit_extr_ui_ul(d, rs)		jit_extr_i_ul((d), (rs))
331 
332 
333 /* NTOH/HTON is not mandatory for big endian architectures */
334 #ifndef jit_ntoh_ui /* big endian */
335 #define jit_ntoh_ui(d, rs)		((d) == (rs) ? (void)0 : jit_movr_i((d), (rs)))
336 #define jit_ntoh_us(d, rs)		((d) == (rs) ? (void)0 : jit_movr_i((d), (rs)))
337 #endif /* big endian */
338 
339 /* hton is a synonym for ntoh */
340 #define jit_hton_ui(d, rs)		jit_ntoh_ui((d), (rs))
341 #define jit_hton_us(d, rs)		jit_ntoh_us((d), (rs))
342 
343 /* Stack synonyms */
344 #define jit_pushr_ui(rs)		jit_pushr_i(rs)
345 #define jit_popr_ui(rs)			jit_popr_i(rs)
346 #define jit_pushr_ul(rs)		jit_pushr_l(rs)
347 #define jit_popr_ul(rs)			jit_popr_l(rs)
348 #define jit_pushr_p(rs)			jit_pushr_ul(rs)
349 #define jit_popr_p(rs)			jit_popr_ul(rs)
350 
351 #define jit_prepare(nint)		jit_prepare_i((nint))
352 #define jit_pusharg_c(rs)		jit_pusharg_i(rs)
353 #define jit_pusharg_s(rs)		jit_pusharg_i(rs)
354 #define jit_pusharg_uc(rs)		jit_pusharg_i(rs)
355 #define jit_pusharg_us(rs)		jit_pusharg_i(rs)
356 #define jit_pusharg_ui(rs)		jit_pusharg_i(rs)
357 #define jit_pusharg_ul(rs)		jit_pusharg_l(rs)
358 #define jit_pusharg_p(rs)		jit_pusharg_ul(rs)
359 
360 #define jit_normal_pushonlyarg_p(r0)   jit_normal_pushonlyarg_i(r0)
361 
362 /* Memory synonyms */
363 
364 #ifdef JIT_RZERO
365 #ifndef jit_ldi_c
366 #define jit_ldi_c(rd, is)		jit_ldxi_c((rd), JIT_RZERO, (is))
367 #define jit_sti_c(id, rs)		jit_stxi_c((id), JIT_RZERO, (rs))
368 #define jit_ldi_s(rd, is)		jit_ldxi_s((rd), JIT_RZERO, (is))
369 #define jit_sti_s(id, rs)		jit_stxi_s((id), JIT_RZERO, (rs))
370 #define jit_ldi_i(rd, is)		jit_ldxi_i((rd), JIT_RZERO, (is))
371 #define jit_sti_i(id, rs)		jit_stxi_i((id), JIT_RZERO, (rs))
372 #define jit_ldi_l(rd, is)		jit_ldxi_l((rd), JIT_RZERO, (is))
373 #define jit_sti_l(id, rs)		jit_stxi_l((id), JIT_RZERO, (rs))
374 #define jit_ldi_uc(rd, is)		jit_ldxi_uc((rd), JIT_RZERO, (is))
375 #define jit_ldi_us(rd, is)		jit_ldxi_us((rd), JIT_RZERO, (is))
376 #define jit_ldi_ui(rd, is)		jit_ldxi_ui((rd), JIT_RZERO, (is))
377 #  if __WORDSIZE == 64
378 #    define jit_ldi_ul(rd, is)		jit_ldxi_ul((rd), JIT_RZERO, (is))
379 #  endif
380 #endif
381 
382 #ifndef jit_ldr_c
383 #define jit_ldr_c(rd, rs)		jit_ldxr_c((rd), JIT_RZERO, (rs))
384 #define jit_str_c(rd, rs)		jit_stxr_c(JIT_RZERO, (rd), (rs))
385 #define jit_ldr_s(rd, rs)		jit_ldxr_s((rd), JIT_RZERO, (rs))
386 #define jit_str_s(rd, rs)		jit_stxr_s(JIT_RZERO, (rd), (rs))
387 #define jit_ldr_i(rd, rs)		jit_ldxr_i((rd), JIT_RZERO, (rs))
388 #define jit_str_i(rd, rs)		jit_stxr_i(JIT_RZERO, (rd), (rs))
389 #define jit_ldr_l(rd, rs)		jit_ldxr_l((rd), JIT_RZERO, (rs))
390 #define jit_str_l(rd, rs)		jit_stxr_l(JIT_RZERO, (rd), (rs))
391 #define jit_ldr_uc(rd, rs)		jit_ldxr_uc((rd), JIT_RZERO, (rs))
392 #define jit_ldr_us(rd, rs)		jit_ldxr_us((rd), JIT_RZERO, (rs))
393 #define jit_ldr_ui(rd, rs)		jit_ldxr_ui((rd), JIT_RZERO, (rs))
394 #  if __WORDSIZE == 64
395 #    define jit_ldr_ul(rd, rs)		jit_ldxr_ul((rd), JIT_RZERO, (rs))
396 #  endif
397 #endif
398 #endif
399 
400 #define jit_str_uc(rd, rs)		jit_str_c((rd), (rs))
401 #define jit_sti_uc(id, rs)		jit_sti_c((id), (rs))
402 #define jit_stxr_uc(d1, d2, rs)		jit_stxr_c((d1), (d2), (rs))
403 #define jit_stxi_uc(id, rd, is)		jit_stxi_c((id), (rd), (is))
404 
405 #define jit_str_us(rd, rs)		jit_str_s((rd), (rs))
406 #define jit_sti_us(id, rs)		jit_sti_s((id), (rs))
407 #define jit_stxr_us(d1, d2, rs)		jit_stxr_s((d1), (d2), (rs))
408 #define jit_stxi_us(id, rd, is)		jit_stxi_s((id), (rd), (is))
409 
410 #define jit_str_ui(rd, rs)		jit_str_i((rd), (rs))
411 #define jit_sti_ui(id, rs)		jit_sti_i((id), (rs))
412 #define jit_stxr_ui(d1, d2, rs)		jit_stxr_i((d1), (d2), (rs))
413 #define jit_stxi_ui(id, rd, is)		jit_stxi_i((id), (rd), (is))
414 
415 #define jit_str_ul(rd, rs)		jit_str_l((rd), (rs))
416 #define jit_sti_ul(id, rs)		jit_sti_l((id), (rs))
417 #define jit_stxr_ul(d1, d2, rs)		jit_stxr_l((d1), (d2), (rs))
418 #define jit_stxi_ul(id, rd, is)		jit_stxi_l((id), (rd), (is))
419 
420 #define jit_str_p(rd, rs)		jit_str_l((rd), (rs))
421 #define jit_sti_p(id, rs)		jit_sti_l((id), (rs))
422 #define jit_stxr_p(d1, d2, rs)		jit_stxr_l((d1), (d2), (rs))
423 #define jit_stxi_p(id, rd, is)		jit_stxi_l((id), (rd), (is))
424 
425 #define jit_ldr_p(rd, rs)		jit_ldr_l((rd), (rs))
426 #define jit_ldi_p(rd, is)		jit_ldi_l((rd), (is))
427 #define jit_ldxr_p(rd, s1, s2)		jit_ldxr_l((rd), (s1), (s2))
428 #ifndef jit_ldxi_p
429 #  define jit_ldxi_p(rd, rs, is)	jit_ldxi_l((rd), (rs), (is))
430 #endif
431 
432 #define jit_ldr_ul(d, rs)		jit_ldr_l((d), (rs))
433 #define jit_ldi_ul(d, is)		jit_ldi_l((d), (is))
434 #define jit_ldxr_ul(d, s1, s2)		jit_ldxr_l((d), (s1), (s2))
435 #ifndef jit_ldxi_ul
436 #  define jit_ldxi_ul(d, rs, is)	jit_ldxi_l((d), (rs), (is))
437 #endif
438 
439 
440 /* Boolean & branch synonyms */
441 #define jit_eqr_ui(d, s1, s2)		jit_eqr_i((d), (s1), (s2))
442 #define jit_eqi_ui(d, rs, is)		jit_eqi_i((d), (rs), (is))
443 #define jit_ner_ui(d, s1, s2)		jit_ner_i((d), (s1), (s2))
444 #define jit_nei_ui(d, rs, is)		jit_nei_i((d), (rs), (is))
445 
446 #define jit_eqr_ul(d, s1, s2)		jit_eqr_l((d), (s1), (s2))
447 #define jit_eqi_ul(d, rs, is)		jit_eqi_l((d), (rs), (is))
448 #define jit_ner_ul(d, s1, s2)		jit_ner_l((d), (s1), (s2))
449 #define jit_nei_ul(d, rs, is)		jit_nei_l((d), (rs), (is))
450 
451 #define jit_beqr_ui(label, s1, s2)	jit_beqr_i((label), (s1), (s2))
452 #define jit_beqi_ui(label, rs, is)	jit_beqi_i((label), (rs), (is))
453 #define jit_bner_ui(label, s1, s2)	jit_bner_i((label), (s1), (s2))
454 #define jit_bnei_ui(label, rs, is)	jit_bnei_i((label), (rs), (is))
455 #define jit_bmcr_ui(label, s1, s2)	jit_bmcr_i((label), (s1), (s2))
456 #define jit_bmci_ui(label, rs, is)	jit_bmci_i((label), (rs), (is))
457 #define jit_bmsr_ui(label, s1, s2)	jit_bmsr_i((label), (s1), (s2))
458 #define jit_bmsi_ui(label, rs, is)	jit_bmsi_i((label), (rs), (is))
459 
460 #define jit_beqr_ul(label, s1, s2)	jit_beqr_l((label), (s1), (s2))
461 #define jit_beqi_ul(label, rs, is)	jit_beqi_l((label), (rs), (is))
462 #define jit_bner_ul(label, s1, s2)	jit_bner_l((label), (s1), (s2))
463 #define jit_bnei_ul(label, rs, is)	jit_bnei_l((label), (rs), (is))
464 #define jit_bmcr_ul(label, s1, s2)	jit_bmcr_l((label), (s1), (s2))
465 #define jit_bmci_ul(label, rs, is)	jit_bmci_l((label), (rs), (is))
466 #define jit_bmsr_ul(label, s1, s2)	jit_bmsr_l((label), (s1), (s2))
467 #define jit_bmsi_ul(label, rs, is)	jit_bmsi_l((label), (rs), (is))
468 
469 #define jit_ltr_p(d, s1, s2)		jit_ltr_ul((d), (s1), (s2))
470 #define jit_lti_p(d, rs, is)		jit_lti_ul((d), (rs), (long)(is))
471 #define jit_ler_p(d, s1, s2)		jit_ler_ul((d), (s1), (s2))
472 #define jit_lei_p(d, rs, is)		jit_lei_ul((d), (rs), (long)(is))
473 #define jit_gtr_p(d, s1, s2)		jit_gtr_ul((d), (s1), (s2))
474 #define jit_gti_p(d, rs, is)		jit_gti_ul((d), (rs), (long)(is))
475 #define jit_ger_p(d, s1, s2)		jit_ger_ul((d), (s1), (s2))
476 #define jit_gei_p(d, rs, is)		jit_gei_ul((d), (rs), (long)(is))
477 #define jit_eqr_p(d, s1, s2)		jit_eqr_ul((d), (s1), (s2))
478 #define jit_eqi_p(d, rs, is)		jit_eqi_ul((d), (rs), (long)(is))
479 #define jit_ner_p(d, s1, s2)		jit_ner_ul((d), (s1), (s2))
480 #define jit_nei_p(d, rs, is)		jit_nei_ul((d), (rs), (long)(is))
481 
482 #define jit_bltr_p(label, s1, s2)	jit_bltr_ul((label), (s1), (s2))
483 #define jit_blti_p(label, rs, is)	jit_blti_ul((label), (rs), (long)(is))
484 #define jit_bler_p(label, s1, s2)	jit_bler_ul((label), (s1), (s2))
485 #define jit_blei_p(label, rs, is)	jit_blei_ul((label), (rs), (long)(is))
486 #define jit_bgtr_p(label, s1, s2)	jit_bgtr_ul((label), (s1), (s2))
487 #define jit_bgti_p(label, rs, is)	jit_bgti_ul((label), (rs), (long)(is))
488 #define jit_bger_p(label, s1, s2)	jit_bger_ul((label), (s1), (s2))
489 #define jit_bgei_p(label, rs, is)	jit_bgei_ul((label), (rs), (long)(is))
490 #define jit_beqr_p(label, s1, s2)	jit_beqr_ul((label), (s1), (s2))
491 #define jit_beqi_p(label, rs, is)	jit_beqi_ul((label), (rs), (long)(is))
492 #define jit_bner_p(label, s1, s2)	jit_bner_ul((label), (s1), (s2))
493 #define jit_bnei_p(label, rs, is)	jit_bnei_ul((label), (rs), (long)(is))
494 
495 #define jit_retval_ui(rd)		jit_retval_i((rd))
496 #define jit_retval_uc(rd)		jit_retval_i((rd))
497 #define jit_retval_us(rd)		jit_retval_i((rd))
498 #define jit_retval_ul(rd)		jit_retval_l((rd))
499 #define jit_retval_p(rd)		jit_retval_ul((rd))
500 #define jit_retval_c(rd)		jit_retval_i((rd))
501 #define jit_retval_s(rd)		jit_retval_i((rd))
502 
503 /* This was a bug, but we keep it.  */
504 #define jit_retval(rd)			jit_retval_i ((rd))
505 
506 #ifndef jit_finish
507 #define jit_finish(sub)			jit_calli(sub)
508 #endif
509 
510 #ifndef jit_finishr
511 #define jit_finishr(reg)		jit_callr(reg)
512 #endif
513 
514 #ifndef jit_prolog
515 #define jit_prolog(numargs)
516 #endif
517 
518 #ifndef jit_leaf
519 #define jit_leaf(numargs)		jit_prolog(numargs)
520 #endif
521 
522 #ifndef jit_getarg_c
523 #ifndef JIT_AP
524 #define jit_getarg_c(reg, ofs)		jit_extr_c_l  ((reg), (ofs))
525 #define jit_getarg_i(reg, ofs)		jit_extr_i_l  ((reg), (ofs))
526 #define jit_getarg_l(reg, ofs)		jit_movr_l    ((reg), (ofs))
527 #define jit_getarg_p(reg, ofs)		jit_movr_p    ((reg), (ofs))
528 #define jit_getarg_s(reg, ofs)		jit_extr_s_l  ((reg), (ofs))
529 #define jit_getarg_uc(reg, ofs)		jit_extr_uc_ul((reg), (ofs))
530 #define jit_getarg_ui(reg, ofs)		jit_extr_ui_ul((reg), (ofs))
531 #define jit_getarg_ul(reg, ofs)		jit_movr_ul   ((reg), (ofs))
532 #define jit_getarg_us(reg, ofs)		jit_extr_us_ul((reg), (ofs))
533 #else
534 #define jit_getarg_c(reg, ofs)		jit_ldxi_c((reg), JIT_AP, (ofs));
535 #define jit_getarg_uc(reg, ofs)		jit_ldxi_uc((reg), JIT_AP, (ofs));
536 #define jit_getarg_s(reg, ofs)		jit_ldxi_s((reg), JIT_AP, (ofs));
537 #define jit_getarg_us(reg, ofs)		jit_ldxi_us((reg), JIT_AP, (ofs));
538 #define jit_getarg_i(reg, ofs)		jit_ldxi_i((reg), JIT_AP, (ofs));
539 #define jit_getarg_ui(reg, ofs)		jit_ldxi_ui((reg), JIT_AP, (ofs));
540 #define jit_getarg_l(reg, ofs)		jit_ldxi_l((reg), JIT_AP, (ofs));
541 #define jit_getarg_ul(reg, ofs)		jit_ldxi_ul((reg), JIT_AP, (ofs));
542 #define jit_getarg_p(reg, ofs)		jit_ldxi_p((reg), JIT_AP, (ofs));
543 #endif
544 #endif
545 
546 
547 /* Common definitions when sizeof(long) = sizeof(int) */
548 #if __WORDSIZE == 32
549 /* ALU */
550 #  define jit_addi_l(d, rs, is)		jit_addi_i((d), (rs), (is))
551 #  define jit_addr_l(d, s1, s2)		jit_addr_i((d), (s1), (s2))
552 #  define jit_andi_l(d, rs, is)		jit_andi_i((d), (rs), (is))
553 #  define jit_andr_l(d, s1, s2)		jit_andr_i((d), (s1), (s2))
554 #  define jit_divi_l(d, rs, is)		jit_divi_i((d), (rs), (is))
555 #  define jit_divr_l(d, s1, s2)		jit_divr_i((d), (s1), (s2))
556 #  define jit_hmuli_l(d, rs, is)	jit_hmuli_i((d), (rs), (is))
557 #  define jit_hmulr_l(d, s1, s2)	jit_hmulr_i((d), (s1), (s2))
558 #  define jit_lshi_l(d, rs, is)		jit_lshi_i((d), (rs), (is))
559 #  define jit_lshr_l(d, s1, s2)		jit_lshr_i((d), (s1), (s2))
560 #  define jit_modi_l(d, rs, is)		jit_modi_i((d), (rs), (is))
561 #  define jit_modr_l(d, s1, s2)		jit_modr_i((d), (s1), (s2))
562 #  define jit_muli_l(d, rs, is)		jit_muli_i((d), (rs), (is))
563 #  define jit_mulr_l(d, s1, s2)		jit_mulr_i((d), (s1), (s2))
564 #  ifndef jit_negr_l
565 #    define jit_negr_l(d, s1)		jit_negr_i((d), (s1))
566 #  endif
567 #  define jit_ori_l(d, rs, is)		jit_ori_i((d), (rs), (is))
568 #  define jit_orr_l(d, s1, s2)		jit_orr_i((d), (s1), (s2))
569 #  define jit_rshi_l(d, rs, is)		jit_rshi_i((d), (rs), (is))
570 #  define jit_rshr_l(d, s1, s2)		jit_rshr_i((d), (s1), (s2))
571 #  define jit_subr_l(d, s1, s2)		jit_subr_i((d), (s1), (s2))
572 #  define jit_xori_l(d, rs, is)		jit_xori_i((d), (rs), (is))
573 #  define jit_xorr_l(d, s1, s2)		jit_xorr_i((d), (s1), (s2))
574 #  define jit_rsbi_l(d, rs, is)		jit_rsbi_i((d), (rs), (is))
575 #  define jit_divi_ul(d, rs, is)	jit_divi_ui((d), (rs), (is))
576 #  define jit_divr_ul(d, s1, s2)	jit_divr_ui((d), (s1), (s2))
577 #  define jit_hmuli_ul(d, rs, is)	jit_hmuli_ui((d), (rs), (is))
578 #  define jit_hmulr_ul(d, s1, s2)	jit_hmulr_ui((d), (s1), (s2))
579 #  define jit_modi_ul(d, rs, is)	jit_modi_ui((d), (rs), (is))
580 #  define jit_modr_ul(d, s1, s2)	jit_modr_ui((d), (s1), (s2))
581 #  define jit_muli_ul(d, rs, is)	jit_muli_ui((d), (rs), (is))
582 #  define jit_mulr_ul(d, s1, s2)	jit_mulr_ui((d), (s1), (s2))
583 #  define jit_rshi_ul(d, rs, is)	jit_rshi_ui((d), (rs), (is))
584 #  define jit_rshr_ul(d, s1, s2)	jit_rshr_ui((d), (s1), (s2))
585 
586 #  define jit_bomulr_l(d, s1, s2)       jit_bomulr_i((d), (s1), (s2))
587 
588 /* Sign/Zero extension */
589 #  define jit_extr_c_l(d, rs)		jit_extr_c_i(d, rs)
590 #  define jit_extr_c_ul(d, rs)		jit_extr_c_ui(d, rs)
591 #  define jit_extr_s_l(d, rs)		jit_extr_s_i(d, rs)
592 #  define jit_extr_s_ul(d, rs)		jit_extr_s_ui(d, rs)
593 #  define jit_extr_i_l(d, rs)		jit_movr_i(d, rs)
594 #  define jit_extr_i_ul(d, rs)		jit_movr_i(d, rs)
595 
596 /* Unary */
597 #  define jit_movi_l(d, rs)		jit_movi_i((d), (rs))
598 #  define jit_movr_l(d, rs)		jit_movr_i((d), (rs))
599 
600 /* Stack */
601 #  define jit_pushr_l(rs)		jit_pushr_i(rs)
602 #  define jit_popr_l(rs)		jit_popr_i(rs)
603 #  define jit_pusharg_l(rs)		jit_pusharg_i(rs)
604 
605 /* Memory */
606 #  ifndef JIT_RZERO
607 #    define jit_ldr_l(d, rs)		jit_ldr_i((d), (rs))
608 #    define jit_ldi_l(d, is)		jit_ldi_i((d), (is))
609 #    define jit_str_l(d, rs)		jit_str_i((d), (rs))
610 #    define jit_sti_l(d, is)		jit_sti_i((d), (is))
611 #    define jit_ldr_ui(d, rs)		jit_ldr_i((d), (rs))
612 #    define jit_ldi_ui(d, is)		jit_ldi_i((d), (is))
613 #  endif
614 
615 #  define jit_ldxr_l(d, s1, s2)		jit_ldxr_i((d), (s1), (s2))
616 #  define jit_ldxi_l(d, rs, is)		jit_ldxi_i((d), (rs), (is))
617 #  define jit_stxr_l(d, s1, s2)		jit_stxr_i((d), (s1), (s2))
618 #  define jit_stxi_l(d, rs, is)		jit_stxi_i((d), (rs), (is))
619 #  if !defined (jit_ldxr_ui)
620 #    define jit_ldxr_ui(d, s1, s2)	jit_ldxr_i((d), (s1), (s2))
621 #  endif
622 #  if !defined (jit_ldxi_ui)
623 #    define jit_ldxi_ui(d, rs, is)	jit_ldxi_i((d), (rs), (is))
624 #  endif
625 
626 
627 /* Boolean */
628 #  define jit_ltr_l(d, s1, s2)		jit_ltr_i((d), (s1), (s2))
629 #  define jit_lti_l(d, rs, is)		jit_lti_i((d), (rs), (is))
630 #  define jit_ler_l(d, s1, s2)		jit_ler_i((d), (s1), (s2))
631 #  define jit_lei_l(d, rs, is)		jit_lei_i((d), (rs), (is))
632 #  define jit_gtr_l(d, s1, s2)		jit_gtr_i((d), (s1), (s2))
633 #  define jit_gti_l(d, rs, is)		jit_gti_i((d), (rs), (is))
634 #  define jit_ger_l(d, s1, s2)		jit_ger_i((d), (s1), (s2))
635 #  define jit_gei_l(d, rs, is)		jit_gei_i((d), (rs), (is))
636 #  define jit_eqr_l(d, s1, s2)		jit_eqr_i((d), (s1), (s2))
637 #  define jit_eqi_l(d, rs, is)		jit_eqi_i((d), (rs), (is))
638 #  define jit_ner_l(d, s1, s2)		jit_ner_i((d), (s1), (s2))
639 #  define jit_nei_l(d, rs, is)		jit_nei_i((d), (rs), (is))
640 #  define jit_ltr_ul(d, s1, s2)		jit_ltr_ui((d), (s1), (s2))
641 #  define jit_lti_ul(d, rs, is)		jit_lti_ui((d), (rs), (is))
642 #  define jit_ler_ul(d, s1, s2)		jit_ler_ui((d), (s1), (s2))
643 #  define jit_lei_ul(d, rs, is)		jit_lei_ui((d), (rs), (is))
644 #  define jit_gtr_ul(d, s1, s2)		jit_gtr_ui((d), (s1), (s2))
645 #  define jit_gti_ul(d, rs, is)		jit_gti_ui((d), (rs), (is))
646 #  define jit_ger_ul(d, s1, s2)		jit_ger_ui((d), (s1), (s2))
647 #  define jit_gei_ul(d, rs, is)		jit_gei_ui((d), (rs), (is))
648 
649 /* Branches */
650 #  define jit_bltr_l(label, s1, s2)	jit_bltr_i((label), (s1), (s2))
651 #  define jit_blti_l(label, rs, is)	jit_blti_i((label), (rs), (is))
652 #  define jit_bler_l(label, s1, s2)	jit_bler_i((label), (s1), (s2))
653 #  define jit_blei_l(label, rs, is)	jit_blei_i((label), (rs), (is))
654 #  define jit_bgtr_l(label, s1, s2)	jit_bgtr_i((label), (s1), (s2))
655 #  define jit_bgti_l(label, rs, is)	jit_bgti_i((label), (rs), (is))
656 #  define jit_bger_l(label, s1, s2)	jit_bger_i((label), (s1), (s2))
657 #  define jit_bgei_l(label, rs, is)	jit_bgei_i((label), (rs), (is))
658 #  define jit_beqr_l(label, s1, s2)	jit_beqr_i((label), (s1), (s2))
659 #  define jit_beqi_l(label, rs, is)	jit_beqi_i((label), (rs), (is))
660 #  define jit_bner_l(label, s1, s2)	jit_bner_i((label), (s1), (s2))
661 #  define jit_bnei_l(label, rs, is)	jit_bnei_i((label), (rs), (is))
662 #  define jit_bmcr_l(label, s1, s2)	jit_bmcr_i((label), (s1), (s2))
663 #  define jit_bmci_l(label, rs, is)	jit_bmci_i((label), (rs), (is))
664 #  define jit_bmsr_l(label, s1, s2)	jit_bmsr_i((label), (s1), (s2))
665 #  define jit_bmsi_l(label, rs, is)	jit_bmsi_i((label), (rs), (is))
666 #  define jit_boaddr_l(label, s1, s2)	jit_boaddr_i((label), (s1), (s2))
667 #  define jit_boaddi_l(label, rs, is)	jit_boaddi_i((label), (rs), (is))
668 #  define jit_bosubr_l(label, s1, s2)	jit_bosubr_i((label), (s1), (s2))
669 #  define jit_bosubi_l(label, rs, is)	jit_bosubi_i((label), (rs), (is))
670 #  define jit_bltr_ul(label, s1, s2)	jit_bltr_ui((label), (s1), (s2))
671 #  define jit_blti_ul(label, rs, is)	jit_blti_ui((label), (rs), (is))
672 #  define jit_bler_ul(label, s1, s2)	jit_bler_ui((label), (s1), (s2))
673 #  define jit_blei_ul(label, rs, is)	jit_blei_ui((label), (rs), (is))
674 #  define jit_bgtr_ul(label, s1, s2)	jit_bgtr_ui((label), (s1), (s2))
675 #  define jit_bgti_ul(label, rs, is)	jit_bgti_ui((label), (rs), (is))
676 #  define jit_bger_ul(label, s1, s2)	jit_bger_ui((label), (s1), (s2))
677 #  define jit_bgei_ul(label, rs, is)	jit_bgei_ui((label), (rs), (is))
678 #  define jit_boaddr_ul(label, s1, s2)	jit_boaddr_ui((label), (s1), (s2))
679 #  define jit_boaddi_ul(label, rs, is)	jit_boaddi_ui((label), (rs), (is))
680 #  define jit_bosubr_ul(label, s1, s2)	jit_bosubr_ui((label), (s1), (s2))
681 #  define jit_bosubi_ul(label, rs, is)	jit_bosubi_ui((label), (rs), (is))
682 
683 #  define jit_retval_l(rd)		jit_retval_i((rd))
684 #endif	/* __WORDSIZE == 32 */
685 
686 /* RSB is not mandatory */
687 #ifndef jit_rsbi_i
688 # define jit_rsbi_i(d, rs, is)		(jit_subi_i((d), (rs), (is)), jit_negr_i((d), (d)))
689 
690 # ifndef jit_rsbi_l
691 #  define jit_rsbi_l(d, rs, is)		(jit_subi_l((d), (rs), (is)), jit_negr_l((d), (d)))
692 # endif
693 #endif
694 
695 #endif /* __lightning_core_common_h_ */
696