summaryrefslogtreecommitdiff
path: root/src/runtime/c/pgf/lightning/core-common.h
blob: ee90bd472fc432621c4d8336039bc63a9f985f5e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
/******************************** -*- C -*- ****************************
 *
 *	Platform-independent layer support
 *
 ***********************************************************************/


/***********************************************************************
 *
 * Copyright 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
 * Written by Paolo Bonzini.
 *
 * This file is part of GNU lightning.
 *
 * GNU lightning is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as published
 * by the Free Software Foundation; either version 2.1, or (at your option)
 * any later version.
 * 
 * GNU lightning is distributed in the hope that it will be useful, but 
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 * or  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
 * License for more details.
 * 
 * You should have received a copy of the GNU Lesser General Public License
 * along with GNU lightning; see the file COPYING.LESSER; if not, write to the
 * Free Software Foundation, 59 Temple Place - Suite 330, Boston,
 * MA 02111-1307, USA.
 *
 ***********************************************************************/


#ifndef __lightning_core_common_h_
#define __lightning_core_common_h_

typedef struct {
  union {
    jit_insn             *pc;
    _uc                  *uc_pc;
    _us                  *us_pc;
    _ui                  *ui_pc;
    _ul                  *ul_pc;
  }                       x;
  struct jit_fp		 *fp;
  struct jit_local_state jitl;
} jit_state;

#define JIT_NOREG			(-1)
#define JIT_R0				JIT_R(0)
#define JIT_R1				JIT_R(1)
#define JIT_R2				JIT_R(2)
#define JIT_V0				JIT_V(0)
#define JIT_V1				JIT_V(1)
#define JIT_V2				JIT_V(2)
#define JIT_FPR0			JIT_FPR(0)
#define JIT_FPR1			JIT_FPR(1)
#define JIT_FPR2			JIT_FPR(2)
#define JIT_FPR3			JIT_FPR(3)
#define JIT_FPR4			JIT_FPR(4)
#define JIT_FPR5			JIT_FPR(5)

#define _jitl				_jit.jitl

#define	jit_get_ip()			(*(jit_code *) &_jit.x.pc)
#define	jit_set_ip(ptr)			(_jit.x.pc = (ptr), jit_get_ip ())
#define	jit_get_label()			(_jit.x.pc)
#define	jit_forward()			(_jit.x.pc)

#define	jit_field(struc, f)		( ((long) (&((struc *) 8)->f) ) - 8)
#define	jit_ptr_field(struc_p, f)	( ((long) (&((struc_p) 8)->f) ) - 8)

/* realignment via N-byte no-ops */

#ifndef jit_align
#define jit_align(n)
#endif

/* jit_code: union of many possible function pointer types.  Returned
 * by jit_get_ip().
 */
typedef union jit_code {	
  char		 *ptr;
  void		 (*vptr)(void);
  char		 (*cptr)(void);
  unsigned char	 (*ucptr)(void);
  short		 (*sptr)(void);
  unsigned short (*usptr)(void);
  int		 (*iptr)(void);
  unsigned int	 (*uiptr)(void);
  long		 (*lptr)(void);
  unsigned long	 (*ulptr)(void);
  void *	 (*pptr)(void);
  float		 (*fptr)(void);
  double	 (*dptr)(void);
} jit_code;

#ifndef jit_fill_delay_after
#define jit_fill_delay_after(branch)	(branch)
#endif

#define jit_delay(insn, branch)		((insn), jit_fill_delay_after(branch))


/* ALU synonyms */
#define jit_addi_ui(d, rs, is)		jit_addi_i((d), (rs), (is))	
#define jit_addr_ui(d, s1, s2)		jit_addr_i((d), (s1), (s2))
#define jit_addci_ui(d, rs, is)		jit_addci_i((d), (rs), (is))	
#define jit_addcr_ui(d, s1, s2)		jit_addcr_i((d), (s1), (s2))
#define jit_addxi_ui(d, rs, is)		jit_addxi_i((d), (rs), (is))	
#define jit_addxr_ui(d, s1, s2)		jit_addxr_i((d), (s1), (s2))
#define jit_andi_ui(d, rs, is)		jit_andi_i((d), (rs), (is))	
#define jit_andr_ui(d, s1, s2)		jit_andr_i((d), (s1), (s2))
#define jit_lshi_ui(d, rs, is)		jit_lshi_i((d), (rs), (is))	
#define jit_lshr_ui(d, s1, s2)		jit_lshr_i((d), (s1), (s2))
#define jit_movi_ui(d, rs)		jit_movi_i((d), (rs))
#define jit_movr_ui(d, rs)		jit_movr_i((d), (rs))
#define jit_ori_ui(d, rs, is)		jit_ori_i((d), (rs), (is))	
#define jit_orr_ui(d, s1, s2)		jit_orr_i((d), (s1), (s2))
#define jit_rsbi_ui(d, rs, is)		jit_rsbi_i((d), (rs), (is))	
#define jit_rsbr_ui(d, s1, s2)		jit_rsbr_i((d), (s1), (s2))
#define jit_subi_ui(d, rs, is)		jit_subi_i((d), (rs), (is))	
#define jit_subr_ui(d, s1, s2)		jit_subr_i((d), (s1), (s2))
#define jit_subci_ui(d, rs, is)		jit_subci_i((d), (rs), (is))	
#define jit_subcr_ui(d, s1, s2)		jit_subcr_i((d), (s1), (s2))
#define jit_subxi_ui(d, rs, is)		jit_subxi_i((d), (rs), (is))	
#define jit_subxr_ui(d, s1, s2)		jit_subxr_i((d), (s1), (s2))
#define jit_xori_ui(d, rs, is)		jit_xori_i((d), (rs), (is))	
#define jit_xorr_ui(d, s1, s2)		jit_xorr_i((d), (s1), (s2))

#define jit_addi_ul(d, rs, is)		jit_addi_l((d), (rs), (is))	
#define jit_addr_ul(d, s1, s2)		jit_addr_l((d), (s1), (s2))
#define jit_addci_ul(d, rs, is)		jit_addci_l((d), (rs), (is))	
#define jit_addcr_ul(d, s1, s2)		jit_addcr_l((d), (s1), (s2))
#define jit_addxi_ul(d, rs, is)		jit_addxi_l((d), (rs), (is))	
#define jit_addxr_ul(d, s1, s2)		jit_addxr_l((d), (s1), (s2))
#define jit_andi_ul(d, rs, is)		jit_andi_l((d), (rs), (is))	
#define jit_andr_ul(d, s1, s2)		jit_andr_l((d), (s1), (s2))
#define jit_lshi_ul(d, rs, is)		jit_lshi_l((d), (rs), (is))	
#define jit_lshr_ul(d, s1, s2)		jit_lshr_l((d), (s1), (s2))
#define jit_movi_ul(d, rs)		jit_movi_l((d), (rs))
#define jit_movr_ul(d, rs)		jit_movr_l((d), (rs))
#define jit_ori_ul(d, rs, is)		jit_ori_l((d), (rs), (is))	
#define jit_orr_ul(d, s1, s2)		jit_orr_l((d), (s1), (s2))
#define jit_rsbi_ul(d, rs, is)		jit_rsbi_l((d), (rs), (is))	
#define jit_rsbr_ul(d, s1, s2)		jit_rsbr_l((d), (s1), (s2))
#define jit_subi_ul(d, rs, is)		jit_subi_l((d), (rs), (is))	
#define jit_subr_ul(d, s1, s2)		jit_subr_l((d), (s1), (s2))
#define jit_subci_ul(d, rs, is)		jit_subci_l((d), (rs), (is))	
#define jit_subcr_ul(d, s1, s2)		jit_subcr_l((d), (s1), (s2))
#define jit_subxi_ui(d, rs, is)		jit_subxi_i((d), (rs), (is))	
#define jit_subxi_ul(d, rs, is)		jit_subxi_l((d), (rs), (is))	
#define jit_subxr_ui(d, s1, s2)		jit_subxr_i((d), (s1), (s2))
#define jit_subxr_ul(d, s1, s2)		jit_subxr_i((d), (s1), (s2))
#define jit_xori_ul(d, rs, is)		jit_xori_l((d), (rs), (is))	
#define jit_xorr_ul(d, s1, s2)		jit_xorr_l((d), (s1), (s2))

#define jit_addr_p(d, s1, s2)		jit_addr_ul((d), (s1), 	      (s2))
#define jit_addi_p(d, rs, is)		(jit_addi_ul((d), (rs), (long) (is)), _jit.x.pc)
#define jit_movr_p(d, rs)		jit_movr_ul((d),              (rs))
#define jit_subr_p(d, s1, s2)		jit_subr_ul((d), (s1),        (s2))
#define jit_subi_p(d, rs, is)		jit_subi_ul((d), (rs), (long) (is))
#define jit_rsbi_p(d, rs, is)		jit_rsbi_ul((d), (rs), (long) (is))

#ifndef jit_movi_p
#define jit_movi_p(d, is)		(jit_movi_ul((d),       (long) (is)), _jit.x.pc)
#endif

#define jit_patch(pv)        		jit_patch_at ((pv), (_jit.x.pc))

#ifndef jit_addci_i
#define jit_addci_i(d, rs, is)		jit_addi_i((d), (rs), (is))	
#define jit_addcr_i(d, s1, s2)		jit_addr_i((d), (s1), (s2))
#define jit_addci_l(d, rs, is)		jit_addi_l((d), (rs), (is))	
#define jit_addcr_l(d, s1, s2)		jit_addr_l((d), (s1), (s2))
#endif

#ifndef jit_subcr_i
#define jit_subcr_i(d, s1, s2)		jit_subr_i((d), (s1), (s2))
#endif

/* NEG is not mandatory -- pick an appropriate implementation */
#ifndef jit_negr_i
# ifdef JIT_RZERO
#  define jit_negr_i(d, rs)		jit_subr_i((d), JIT_RZERO, (rs))
#  define jit_negr_l(d, rs)		jit_subr_l((d), JIT_RZERO, (rs))
# else /* !JIT_RZERO */
#  ifndef jit_rsbi_i
#   define jit_negr_i(d, rs)		(jit_xori_i((d), (rs), -1), jit_addi_l((d), (d), 1))
#   define jit_negr_l(d, rs)		(jit_xori_l((d), (rs), -1), jit_addi_l((d), (d), 1))
#  else /* jit_rsbi_i */
#   define jit_negr_i(d, rs)		jit_rsbi_i((d), (rs), 0)
#   define jit_negr_l(d, rs)		jit_rsbi_l((d), (rs), 0)
#  endif /* jit_rsbi_i */
# endif /* !JIT_RZERO */
#endif /* !jit_negr_i */

/* RSB is not mandatory */
#ifndef jit_rsbi_i
# define jit_rsbi_i(d, rs, is)		(jit_subi_i((d), (rs), (is)), jit_negr_i((d), (d)))

# ifndef jit_rsbi_l
#  define jit_rsbi_l(d, rs, is)		(jit_subi_l((d), (rs), (is)), jit_negr_l((d), (d)))
# endif
#endif

/* Common 'shortcut' implementations */
#ifndef jit_subi_i
#define jit_subi_i(d, rs, is)		jit_addi_i((d), (rs), -(is))
#endif
#define jit_subi_l(d, rs, is)		jit_addi_l((d), (rs), -(is))
#ifndef jit_subci_i
#define jit_subci_i(d, rs, is)		jit_addci_i((d), (rs), -(is))
#endif
#define jit_subci_l(d, rs, is)		jit_addci_l((d), (rs), -(is))
#define jit_rsbr_f(d, s1, s2)		jit_subr_f((d), (s2), (s1))
#define jit_rsbr_d(d, s1, s2)		jit_subr_d((d), (s2), (s1))
#ifndef jit_rsbr_i
#define jit_rsbr_i(d, s1, s2)		jit_subr_i((d), (s2), (s1))
#endif
#define jit_rsbr_l(d, s1, s2)		jit_subr_l((d), (s2), (s1))
#define jit_rsbr_p(d, s1, s2)		jit_subr_p((d), (s2), (s1))

/* Unary */
#define jit_notr_c(d, rs)		jit_xori_c((d), (rs), 255)
#define jit_notr_uc(d, rs)		jit_xori_c((d), (rs), 255)
#define jit_notr_s(d, rs)		jit_xori_s((d), (rs), 65535)
#define jit_notr_us(d, rs)		jit_xori_s((d), (rs), 65535)
#ifndef jit_notr_i
#define jit_notr_i(d, rs)		jit_xori_i((d), (rs), ~0)
#endif
#define jit_notr_ui(d, rs)		jit_xori_i((d), (rs), ~0)
#define jit_notr_l(d, rs)		jit_xori_l((d), (rs), ~0L)
#define jit_notr_ul(d, rs)		jit_xori_l((d), (rs), ~0L)

#ifndef jit_extr_c_ui
#define jit_extr_c_ui(d, rs)		jit_andi_ui((d), (rs), 0xFF)
#endif
#ifndef jit_extr_s_ui
#define jit_extr_s_ui(d, rs)		jit_andi_ui((d), (rs), 0xFFFF)
#endif
#ifndef jit_extr_c_i
#define jit_extr_c_i(d, rs)		(jit_lshi_i((d), (rs), 24), jit_rshi_i((d), (d), 24))
#endif
#ifndef jit_extr_s_i
#define jit_extr_s_i(d, rs)		(jit_lshi_i((d), (rs), 16), jit_rshi_i((d), (d), 16))
#endif

#ifdef jit_addi_l /* sizeof(long) != sizeof(int) */
#ifndef jit_extr_c_l
#define jit_extr_c_l(d, rs)		(jit_lshi_l((d), (rs), 56), jit_rshi_l((d), (d), 56))
#endif
#ifndef jit_extr_s_l
#define jit_extr_s_l(d, rs)		(jit_lshi_l((d), (rs), 48), jit_rshi_l((d), (d), 48))
#endif
#ifndef jit_extr_i_l
#define jit_extr_i_l(d, rs)		(jit_lshi_l((d), (rs), 32), jit_rshi_l((d), (d), 32))
#endif
#ifndef jit_extr_c_ul
#define jit_extr_c_ul(d, rs)		jit_andi_l((d), (rs), 0xFF)
#endif
#ifndef jit_extr_s_ul
#define jit_extr_s_ul(d, rs)		jit_andi_l((d), (rs), 0xFFFF)
#endif
#ifndef jit_extr_i_ul
#define jit_extr_i_ul(d, rs)		jit_andi_l((d), (rs), 0xFFFFFFFFUL)
#endif
#endif

#define jit_extr_c_s(d, rs)		jit_extr_c_i((d), (rs))
#define jit_extr_c_us(d, rs)		jit_extr_c_ui((d), (rs))
#define jit_extr_uc_s(d, rs)		jit_extr_uc_i((d), (rs))
#define jit_extr_uc_us(d, rs)		jit_extr_uc_ui((d), (rs))
#define jit_extr_uc_i(d, rs)		jit_extr_c_ui((d), (rs))
#define jit_extr_uc_ui(d, rs)		jit_extr_c_ui((d), (rs))
#define jit_extr_us_i(d, rs)		jit_extr_s_ui((d), (rs))
#define jit_extr_us_ui(d, rs)		jit_extr_s_ui((d), (rs))
#define jit_extr_uc_l(d, rs)		jit_extr_c_ul((d), (rs))
#define jit_extr_uc_ul(d, rs)		jit_extr_c_ul((d), (rs))
#define jit_extr_us_l(d, rs)		jit_extr_s_ul((d), (rs))
#define jit_extr_us_ul(d, rs)		jit_extr_s_ul((d), (rs))
#define jit_extr_ui_l(d, rs)		jit_extr_i_ul((d), (rs))
#define jit_extr_ui_ul(d, rs)		jit_extr_i_ul((d), (rs))


/* NTOH/HTON is not mandatory for big endian architectures */
#ifndef jit_ntoh_ui /* big endian */
#define jit_ntoh_ui(d, rs)		((d) == (rs) ? (void)0 : jit_movr_i((d), (rs)))
#define jit_ntoh_us(d, rs)		((d) == (rs) ? (void)0 : jit_movr_i((d), (rs)))
#endif /* big endian */

/* hton is a synonym for ntoh */
#define jit_hton_ui(d, rs)		jit_ntoh_ui((d), (rs))
#define jit_hton_us(d, rs)		jit_ntoh_us((d), (rs))

/* Stack synonyms */
#define jit_pushr_ui(rs)		jit_pushr_i(rs)
#define jit_popr_ui(rs)			jit_popr_i(rs)		
#define jit_pushr_ul(rs)		jit_pushr_l(rs)
#define jit_popr_ul(rs)			jit_popr_l(rs)		
#define jit_pushr_p(rs)			jit_pushr_ul(rs)
#define jit_popr_p(rs)			jit_popr_ul(rs)		

#define jit_prepare(nint)		jit_prepare_i((nint))
#define jit_pusharg_c(rs)		jit_pusharg_i(rs)
#define jit_pusharg_s(rs)		jit_pusharg_i(rs)
#define jit_pusharg_uc(rs)		jit_pusharg_i(rs)
#define jit_pusharg_us(rs)		jit_pusharg_i(rs)
#define jit_pusharg_ui(rs)		jit_pusharg_i(rs)
#define jit_pusharg_ul(rs)		jit_pusharg_l(rs)
#define jit_pusharg_p(rs)		jit_pusharg_ul(rs)

/* Memory synonyms */

#ifdef JIT_RZERO
#ifndef jit_ldi_c
#define jit_ldi_c(rd, is)		jit_ldxi_c((rd), JIT_RZERO, (is))		
#define jit_sti_c(id, rs)		jit_stxi_c((id), JIT_RZERO, (rs))		
#define jit_ldi_s(rd, is)		jit_ldxi_s((rd), JIT_RZERO, (is))		
#define jit_sti_s(id, rs)		jit_stxi_s((id), JIT_RZERO, (rs))		
#define jit_ldi_i(rd, is)		jit_ldxi_i((rd), JIT_RZERO, (is))		
#define jit_sti_i(id, rs)		jit_stxi_i((id), JIT_RZERO, (rs))		
#define jit_ldi_l(rd, is)		jit_ldxi_l((rd), JIT_RZERO, (is))		
#define jit_sti_l(id, rs)		jit_stxi_l((id), JIT_RZERO, (rs))		
#define jit_ldi_uc(rd, is)		jit_ldxi_uc((rd), JIT_RZERO, (is))		
#define jit_ldi_us(rd, is)		jit_ldxi_us((rd), JIT_RZERO, (is))		
#define jit_ldi_ui(rd, is)		jit_ldxi_ui((rd), JIT_RZERO, (is))		
#define jit_ldi_ul(rd, is)		jit_ldxi_ul((rd), JIT_RZERO, (is))		
#endif

#ifndef jit_ldr_c
#define jit_ldr_c(rd, rs)		jit_ldxr_c((rd), JIT_RZERO, (rs))		
#define jit_str_c(rd, rs)		jit_stxr_c(JIT_RZERO, (rd), (rs))		
#define jit_ldr_s(rd, rs)		jit_ldxr_s((rd), JIT_RZERO, (rs))		
#define jit_str_s(rd, rs)		jit_stxr_s(JIT_RZERO, (rd), (rs))		
#define jit_ldr_i(rd, rs)		jit_ldxr_i((rd), JIT_RZERO, (rs))		
#define jit_str_i(rd, rs)		jit_stxr_i(JIT_RZERO, (rd), (rs))		
#define jit_ldr_l(rd, rs)		jit_ldxr_l((rd), JIT_RZERO, (rs))		
#define jit_str_l(rd, rs)		jit_stxr_l(JIT_RZERO, (rd), (rs))		
#define jit_ldr_uc(rd, rs)		jit_ldxr_uc((rd), JIT_RZERO, (rs))		
#define jit_ldr_us(rd, rs)		jit_ldxr_us((rd), JIT_RZERO, (rs))		
#define jit_ldr_ui(rd, rs)		jit_ldxr_ui((rd), JIT_RZERO, (rs))		
#define jit_ldr_ul(rd, rs)		jit_ldxr_ul((rd), JIT_RZERO, (rs))		
#endif
#endif

#define jit_str_uc(rd, rs)		jit_str_c((rd), (rs))
#define jit_sti_uc(id, rs)		jit_sti_c((id), (rs))
#define jit_stxr_uc(d1, d2, rs)		jit_stxr_c((d1), (d2), (rs))
#define jit_stxi_uc(id, rd, is)		jit_stxi_c((id), (rd), (is))

#define jit_str_us(rd, rs)		jit_str_s((rd), (rs))
#define jit_sti_us(id, rs)		jit_sti_s((id), (rs))
#define jit_stxr_us(d1, d2, rs)		jit_stxr_s((d1), (d2), (rs))
#define jit_stxi_us(id, rd, is)		jit_stxi_s((id), (rd), (is))

#define jit_str_ui(rd, rs)		jit_str_i((rd), (rs))
#define jit_sti_ui(id, rs)		jit_sti_i((id), (rs))
#define jit_stxr_ui(d1, d2, rs)		jit_stxr_i((d1), (d2), (rs))
#define jit_stxi_ui(id, rd, is)		jit_stxi_i((id), (rd), (is))

#define jit_str_ul(rd, rs)		jit_str_l((rd), (rs))
#define jit_sti_ul(id, rs)		jit_sti_l((id), (rs))
#define jit_stxr_ul(d1, d2, rs)		jit_stxr_l((d1), (d2), (rs))
#define jit_stxi_ul(id, rd, is)		jit_stxi_l((id), (rd), (is))

#define jit_str_p(rd, rs)		jit_str_l((rd), (rs))
#define jit_sti_p(id, rs)		jit_sti_l((id), (rs))
#define jit_stxr_p(d1, d2, rs)		jit_stxr_l((d1), (d2), (rs))
#define jit_stxi_p(id, rd, is)		jit_stxi_l((id), (rd), (is))

#define jit_ldr_p(rd, rs)		jit_ldr_l((rd), (rs))
#define jit_ldi_p(rd, is)		jit_ldi_l((rd), (is))
#define jit_ldxr_p(rd, s1, s2)		jit_ldxr_l((rd), (s1), (s2))
#define jit_ldxi_p(rd, rs, is)		jit_ldxi_l((rd), (rs), (is))


/* Boolean & branch synonyms */
#define jit_eqr_ui(d, s1, s2)		jit_eqr_i((d), (s1), (s2))
#define jit_eqi_ui(d, rs, is)		jit_eqi_i((d), (rs), (is))
#define jit_ner_ui(d, s1, s2)		jit_ner_i((d), (s1), (s2))
#define jit_nei_ui(d, rs, is)		jit_nei_i((d), (rs), (is))

#define jit_eqr_ul(d, s1, s2)		jit_eqr_l((d), (s1), (s2))
#define jit_eqi_ul(d, rs, is)		jit_eqi_l((d), (rs), (is))
#define jit_ner_ul(d, s1, s2)		jit_ner_l((d), (s1), (s2))
#define jit_nei_ul(d, rs, is)		jit_nei_l((d), (rs), (is))

#define jit_beqr_ui(label, s1, s2)	jit_beqr_i((label), (s1), (s2))
#define jit_beqi_ui(label, rs, is)	jit_beqi_i((label), (rs), (is))
#define jit_bner_ui(label, s1, s2)	jit_bner_i((label), (s1), (s2))
#define jit_bnei_ui(label, rs, is)	jit_bnei_i((label), (rs), (is))
#define jit_bmcr_ui(label, s1, s2)	jit_bmcr_i((label), (s1), (s2))
#define jit_bmci_ui(label, rs, is)	jit_bmci_i((label), (rs), (is))
#define jit_bmsr_ui(label, s1, s2)	jit_bmsr_i((label), (s1), (s2))
#define jit_bmsi_ui(label, rs, is)	jit_bmsi_i((label), (rs), (is))

#define jit_beqr_ul(label, s1, s2)	jit_beqr_l((label), (s1), (s2))
#define jit_beqi_ul(label, rs, is)	jit_beqi_l((label), (rs), (is))
#define jit_bner_ul(label, s1, s2)	jit_bner_l((label), (s1), (s2))
#define jit_bnei_ul(label, rs, is)	jit_bnei_l((label), (rs), (is))
#define jit_bmcr_ul(label, s1, s2)	jit_bmcr_l((label), (s1), (s2))
#define jit_bmci_ul(label, rs, is)	jit_bmci_l((label), (rs), (is))
#define jit_bmsr_ul(label, s1, s2)	jit_bmsr_l((label), (s1), (s2))
#define jit_bmsi_ul(label, rs, is)	jit_bmsi_l((label), (rs), (is))

#define jit_ltr_p(d, s1, s2)		jit_ltr_ul((d), (s1), (s2))
#define jit_lti_p(d, rs, is)		jit_lti_ul((d), (rs), (is))
#define jit_ler_p(d, s1, s2)		jit_ler_ul((d), (s1), (s2))
#define jit_lei_p(d, rs, is)		jit_lei_ul((d), (rs), (is))
#define jit_gtr_p(d, s1, s2)		jit_gtr_ul((d), (s1), (s2))
#define jit_gti_p(d, rs, is)		jit_gti_ul((d), (rs), (is))
#define jit_ger_p(d, s1, s2)		jit_ger_ul((d), (s1), (s2))
#define jit_gei_p(d, rs, is)		jit_gei_ul((d), (rs), (is))
#define jit_eqr_p(d, s1, s2)		jit_eqr_ul((d), (s1), (s2))
#define jit_eqi_p(d, rs, is)		jit_eqi_ul((d), (rs), (is))
#define jit_ner_p(d, s1, s2)		jit_ner_ul((d), (s1), (s2))
#define jit_nei_p(d, rs, is)		jit_nei_ul((d), (rs), (is))

#define jit_bltr_p(label, s1, s2)	jit_bltr_ul((label), (s1), (s2))
#define jit_blti_p(label, rs, is)	jit_blti_ul((label), (rs), (is))
#define jit_bler_p(label, s1, s2)	jit_bler_ul((label), (s1), (s2))
#define jit_blei_p(label, rs, is)	jit_blei_ul((label), (rs), (is))
#define jit_bgtr_p(label, s1, s2)	jit_bgtr_ul((label), (s1), (s2))
#define jit_bgti_p(label, rs, is)	jit_bgti_ul((label), (rs), (is))
#define jit_bger_p(label, s1, s2)	jit_bger_ul((label), (s1), (s2))
#define jit_bgei_p(label, rs, is)	jit_bgei_ul((label), (rs), (is))
#define jit_beqr_p(label, s1, s2)	jit_beqr_ul((label), (s1), (s2))
#define jit_beqi_p(label, rs, is)	jit_beqi_ul((label), (rs), (is))
#define jit_bner_p(label, s1, s2)	jit_bner_ul((label), (s1), (s2))
#define jit_bnei_p(label, rs, is)	jit_bnei_ul((label), (rs), _jit_UL(is))

#define jit_retval_ui(rd)		jit_retval_i((rd))
#define jit_retval_uc(rd)		jit_retval_i((rd))
#define jit_retval_us(rd)		jit_retval_i((rd))
#define jit_retval_ul(rd)		jit_retval_l((rd))
#define jit_retval_p(rd)		jit_retval_ul((rd))
#define jit_retval_c(rd)		jit_retval_i((rd))
#define jit_retval_s(rd)		jit_retval_i((rd))

/* This was a bug, but we keep it.  */
#define jit_retval(rd)			jit_retval_i ((rd))

#ifndef jit_finish
#define jit_finish(sub)			jit_calli(sub)
#endif

#ifndef jit_finishr
#define jit_finishr(reg)		jit_callr(reg)
#endif

#ifndef jit_prolog
#define jit_prolog(numargs)
#endif

#ifndef jit_leaf
#define jit_leaf(numargs)		jit_prolog(numargs)
#endif

#ifndef jit_getarg_c
#ifndef JIT_FP
#define jit_getarg_c(reg, ofs)		jit_extr_c_i  ((reg), (ofs))
#define jit_getarg_i(reg, ofs)		jit_movr_i    ((reg), (ofs))
#define jit_getarg_l(reg, ofs)		jit_movr_l    ((reg), (ofs))
#define jit_getarg_p(reg, ofs)		jit_movr_p    ((reg), (ofs))
#define jit_getarg_s(reg, ofs)		jit_extr_s_i  ((reg), (ofs))
#define jit_getarg_uc(reg, ofs)		jit_extr_uc_ui((reg), (ofs))
#define jit_getarg_ui(reg, ofs)		jit_movr_ui   ((reg), (ofs))
#define jit_getarg_ul(reg, ofs)		jit_extr_uc_ul((reg), (ofs))
#define jit_getarg_us(reg, ofs)		jit_extr_us_ul((reg), (ofs))
#else
#define jit_getarg_c(reg, ofs)		jit_ldxi_c((reg), JIT_FP, (ofs));
#define jit_getarg_uc(reg, ofs)		jit_ldxi_uc((reg), JIT_FP, (ofs));
#define jit_getarg_s(reg, ofs)		jit_ldxi_s((reg), JIT_FP, (ofs));
#define jit_getarg_us(reg, ofs)		jit_ldxi_us((reg), JIT_FP, (ofs));
#define jit_getarg_i(reg, ofs)		jit_ldxi_i((reg), JIT_FP, (ofs));
#define jit_getarg_ui(reg, ofs)		jit_ldxi_ui((reg), JIT_FP, (ofs));
#define jit_getarg_l(reg, ofs)		jit_ldxi_l((reg), JIT_FP, (ofs));
#define jit_getarg_ul(reg, ofs)		jit_ldxi_ul((reg), JIT_FP, (ofs));
#define jit_getarg_p(reg, ofs)		jit_ldxi_p((reg), JIT_FP, (ofs));
#endif
#endif

#ifndef jit_setarg_p
#ifdef JIT_FP
#define jit_setarg_p(reg, ofs)		jit_stxi_p((ofs), JIT_FP, (reg));
#endif
#endif


/* Common definitions when sizeof(long) = sizeof(int) */
#ifndef jit_addi_l
#define JIT_LONG_IS_INT

/* ALU */
#define jit_addi_l(d, rs, is)		jit_addi_i((d), (rs), (is))	
#define jit_addr_l(d, s1, s2)		jit_addr_i((d), (s1), (s2))
#define jit_addci_l(d, rs, is)		jit_addci_i((d), (rs), (is))	
#define jit_addcr_l(d, s1, s2)		jit_addcr_i((d), (s1), (s2))
#define jit_addxi_l(d, rs, is)		jit_addxi_i((d), (rs), (is))	
#define jit_addxr_l(d, s1, s2)		jit_addxr_i((d), (s1), (s2))
#define jit_andi_l(d, rs, is)		jit_andi_i((d), (rs), (is))	
#define jit_andr_l(d, s1, s2)		jit_andr_i((d), (s1), (s2))
#define jit_divi_l(d, rs, is)		jit_divi_i((d), (rs), (is))	
#define jit_divr_l(d, s1, s2)		jit_divr_i((d), (s1), (s2))
#define jit_hmuli_l(d, rs, is)		jit_hmuli_i((d), (rs), (is))	
#define jit_hmulr_l(d, s1, s2)		jit_hmulr_i((d), (s1), (s2))
#define jit_lshi_l(d, rs, is)		jit_lshi_i((d), (rs), (is))	
#define jit_lshr_l(d, s1, s2)		jit_lshr_i((d), (s1), (s2))
#define jit_modi_l(d, rs, is)		jit_modi_i((d), (rs), (is))	
#define jit_modr_l(d, s1, s2)		jit_modr_i((d), (s1), (s2))
#define jit_muli_l(d, rs, is)		jit_muli_i((d), (rs), (is))	
#define jit_mulr_l(d, s1, s2)		jit_mulr_i((d), (s1), (s2))
#define jit_ori_l(d, rs, is)		jit_ori_i((d), (rs), (is))	
#define jit_orr_l(d, s1, s2)		jit_orr_i((d), (s1), (s2))
#define jit_rshi_l(d, rs, is)		jit_rshi_i((d), (rs), (is))	
#define jit_rshr_l(d, s1, s2)		jit_rshr_i((d), (s1), (s2))
#define jit_subr_l(d, s1, s2)		jit_subr_i((d), (s1), (s2))
#define jit_subcr_l(d, s1, s2)		jit_subcr_i((d), (s1), (s2))
#define jit_subxi_l(d, rs, is)		jit_subxi_i((d), (rs), (is))	
#define jit_subxr_l(d, s1, s2)		jit_subxr_i((d), (s1), (s2))
#define jit_xori_l(d, rs, is)		jit_xori_i((d), (rs), (is))	
#define jit_xorr_l(d, s1, s2)		jit_xorr_i((d), (s1), (s2))

#ifndef jit_rsbi_l
#define jit_rsbi_l(d, rs, is)		jit_rsbi_i((d), (rs), (is))	
#endif

#define jit_divi_ul(d, rs, is)		jit_divi_ui((d), (rs), (is))	
#define jit_divr_ul(d, s1, s2)		jit_divr_ui((d), (s1), (s2))
#define jit_hmuli_ul(d, rs, is)		jit_hmuli_ui((d), (rs), (is))	
#define jit_hmulr_ul(d, s1, s2)		jit_hmulr_ui((d), (s1), (s2))
#define jit_modi_ul(d, rs, is)		jit_modi_ui((d), (rs), (is))	
#define jit_modr_ul(d, s1, s2)		jit_modr_ui((d), (s1), (s2))
#define jit_muli_ul(d, rs, is)		jit_muli_ui((d), (rs), (is))	
#define jit_mulr_ul(d, s1, s2)		jit_mulr_ui((d), (s1), (s2))
#define jit_rshi_ul(d, rs, is)		jit_rshi_ui((d), (rs), (is))	
#define jit_rshr_ul(d, s1, s2)		jit_rshr_ui((d), (s1), (s2))

/* Sign/Zero extension */
#define jit_extr_c_l(d, rs)		jit_extr_c_i(d, rs)
#define jit_extr_c_ul(d, rs)		jit_extr_c_ui(d, rs)
#define jit_extr_s_l(d, rs)		jit_extr_s_i(d, rs)
#define jit_extr_s_ul(d, rs)		jit_extr_s_ui(d, rs)
#define jit_extr_i_l(d, rs)		jit_movr_i(d, rs)
#define jit_extr_i_ul(d, rs)		jit_movr_i(d, rs)

/* Unary */
#define jit_movi_l(d, rs)		jit_movi_i((d), (rs))
#define jit_movr_l(d, rs)		jit_movr_i((d), (rs))

/* Stack */
#define jit_pushr_l(rs)			jit_pushr_i(rs)
#define jit_popr_l(rs)			jit_popr_i(rs)		
#define jit_pusharg_l(rs)		jit_pusharg_i(rs)

/* Memory */
#ifndef JIT_RZERO
#define jit_ldr_l(d, rs)		jit_ldr_i((d), (rs))
#define jit_ldi_l(d, is)		jit_ldi_i((d), (is))
#define jit_str_l(d, rs)		jit_str_i((d), (rs))
#define jit_sti_l(d, is)		jit_sti_i((d), (is))
#define jit_ldr_ui(d, rs)		jit_ldr_i((d), (rs))
#define jit_ldi_ui(d, is)		jit_ldi_i((d), (is))
#define jit_ldr_ul(d, rs)		jit_ldr_ui((d), (rs))
#define jit_ldi_ul(d, is)		jit_ldi_ui((d), (is))
#endif

#define jit_ldxr_l(d, s1, s2)		jit_ldxr_i((d), (s1), (s2))
#define jit_ldxi_l(d, rs, is)		jit_ldxi_i((d), (rs), (is))
#define jit_stxr_l(d, s1, s2)		jit_stxr_i((d), (s1), (s2))
#define jit_stxi_l(d, rs, is)		jit_stxi_i((d), (rs), (is))
#define jit_ldxr_ui(d, s1, s2)		jit_ldxr_i((d), (s1), (s2))
#define jit_ldxi_ui(d, rs, is)		jit_ldxi_i((d), (rs), (is))
#define jit_ldxr_ul(d, s1, s2)		jit_ldxr_ui((d), (s1), (s2))
#define jit_ldxi_ul(d, rs, is)		jit_ldxi_ui((d), (rs), (is))


/* Boolean */
#define jit_ltr_l(d, s1, s2)		jit_ltr_i((d), (s1), (s2))
#define jit_lti_l(d, rs, is)		jit_lti_i((d), (rs), (is))
#define jit_ler_l(d, s1, s2)		jit_ler_i((d), (s1), (s2))
#define jit_lei_l(d, rs, is)		jit_lei_i((d), (rs), (is))
#define jit_gtr_l(d, s1, s2)		jit_gtr_i((d), (s1), (s2))
#define jit_gti_l(d, rs, is)		jit_gti_i((d), (rs), (is))
#define jit_ger_l(d, s1, s2)		jit_ger_i((d), (s1), (s2))
#define jit_gei_l(d, rs, is)		jit_gei_i((d), (rs), (is))
#define jit_eqr_l(d, s1, s2)		jit_eqr_i((d), (s1), (s2))
#define jit_eqi_l(d, rs, is)		jit_eqi_i((d), (rs), (is))
#define jit_ner_l(d, s1, s2)		jit_ner_i((d), (s1), (s2))
#define jit_nei_l(d, rs, is)		jit_nei_i((d), (rs), (is))
#define jit_ltr_ul(d, s1, s2)		jit_ltr_ui((d), (s1), (s2))
#define jit_lti_ul(d, rs, is)		jit_lti_ui((d), (rs), (is))
#define jit_ler_ul(d, s1, s2)		jit_ler_ui((d), (s1), (s2))
#define jit_lei_ul(d, rs, is)		jit_lei_ui((d), (rs), (is))
#define jit_gtr_ul(d, s1, s2)		jit_gtr_ui((d), (s1), (s2))
#define jit_gti_ul(d, rs, is)		jit_gti_ui((d), (rs), (is))
#define jit_ger_ul(d, s1, s2)		jit_ger_ui((d), (s1), (s2))
#define jit_gei_ul(d, rs, is)		jit_gei_ui((d), (rs), (is))

/* Branches */
#define jit_bltr_l(label, s1, s2)	jit_bltr_i((label), (s1), (s2))
#define jit_blti_l(label, rs, is)	jit_blti_i((label), (rs), (is))
#define jit_bler_l(label, s1, s2)	jit_bler_i((label), (s1), (s2))
#define jit_blei_l(label, rs, is)	jit_blei_i((label), (rs), (is))
#define jit_bgtr_l(label, s1, s2)	jit_bgtr_i((label), (s1), (s2))
#define jit_bgti_l(label, rs, is)	jit_bgti_i((label), (rs), (is))
#define jit_bger_l(label, s1, s2)	jit_bger_i((label), (s1), (s2))
#define jit_bgei_l(label, rs, is)	jit_bgei_i((label), (rs), (is))
#define jit_beqr_l(label, s1, s2)	jit_beqr_i((label), (s1), (s2))
#define jit_beqi_l(label, rs, is)	jit_beqi_i((label), (rs), (is))
#define jit_bner_l(label, s1, s2)	jit_bner_i((label), (s1), (s2))
#define jit_bnei_l(label, rs, is)	jit_bnei_i((label), (rs), (is))
#define jit_bmcr_l(label, s1, s2)	jit_bmcr_i((label), (s1), (s2))
#define jit_bmci_l(label, rs, is)	jit_bmci_i((label), (rs), (is))
#define jit_bmsr_l(label, s1, s2)	jit_bmsr_i((label), (s1), (s2))
#define jit_bmsi_l(label, rs, is)	jit_bmsi_i((label), (rs), (is))
#define jit_boaddr_l(label, s1, s2)	jit_boaddr_i((label), (s1), (s2))
#define jit_boaddi_l(label, rs, is)	jit_boaddi_i((label), (rs), (is))
#define jit_bosubr_l(label, s1, s2)	jit_bosubr_i((label), (s1), (s2))
#define jit_bosubi_l(label, rs, is)	jit_bosubi_i((label), (rs), (is))
#define jit_bltr_ul(label, s1, s2)	jit_bltr_ui((label), (s1), (s2))
#define jit_blti_ul(label, rs, is)	jit_blti_ui((label), (rs), (is))
#define jit_bler_ul(label, s1, s2)	jit_bler_ui((label), (s1), (s2))
#define jit_blei_ul(label, rs, is)	jit_blei_ui((label), (rs), (is))
#define jit_bgtr_ul(label, s1, s2)	jit_bgtr_ui((label), (s1), (s2))
#define jit_bgti_ul(label, rs, is)	jit_bgti_ui((label), (rs), (is))
#define jit_bger_ul(label, s1, s2)	jit_bger_ui((label), (s1), (s2))
#define jit_bgei_ul(label, rs, is)	jit_bgei_ui((label), (rs), (is))
#define jit_boaddr_ul(label, s1, s2)	jit_boaddr_ui((label), (s1), (s2))
#define jit_boaddi_ul(label, rs, is)	jit_boaddi_ui((label), (rs), (is))
#define jit_bosubr_ul(label, s1, s2)	jit_bosubr_ui((label), (s1), (s2))
#define jit_bosubi_ul(label, rs, is)	jit_bosubi_ui((label), (rs), (is))

#define jit_retval_l(rd)		jit_retval_i((rd))

#endif

#endif /* __lightning_core_common_h_ */