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