63bb92db3981e60198e0ca02ebfe0a09b6c50ad6
[pcsx_rearmed.git] / deps / lightning / lib / jit_ia64-cpu.c
1 /*
2  * Copyright (C) 2013-2019  Free Software Foundation, Inc.
3  *
4  * This file is part of GNU lightning.
5  *
6  * GNU lightning is free software; you can redistribute it and/or modify it
7  * under the terms of the GNU Lesser General Public License as published
8  * by the Free Software Foundation; either version 3, or (at your option)
9  * any later version.
10  *
11  * GNU lightning is distributed in the hope that it will be useful, but
12  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
14  * License for more details.
15  *
16  * Authors:
17  *      Paulo Cesar Pereira de Andrade
18  */
19
20 #if PROTO
21 #define stack_framesize                 144
22 #define params_offset                   16
23 #define INST_NONE                       0       /* should never be generated */
24 #define INST_STOP                       1       /* or'ed if stop is required */
25 #define INST_A                          2       /* M- or I- unit */
26 #define INST_As                         3
27 #define INST_I                          4
28 #define INST_Is                         5
29 #define INST_M                          6
30 #define INST_Ms                         7
31 #define INST_F                          8
32 #define INST_Fs                         9
33 #define INST_B                          10
34 #define INST_Bs                         11
35 #define INST_L                          12
36 #define INST_Ls                         13
37 #define INST_X                          14
38 #define INST_Xs                         15
39
40 /* Data and instructions are referenced by 64-bit addresses. Instructions
41  * are stored in memory in little endian byte order, in which the least
42  * significant byte appears in the lowest addressed byte of a memory
43  * location. For data, modes for both big and little endian byte order are
44  * supported and can be controlled by a bit in the User Mask Register.
45  */
46 #define il(ii)                          *_jit->pc.ul++ = ii
47 #define set_bundle(p, l, h, tm, s0, s1, s2)                             \
48     do {                                                                \
49         l = tm | ((s0 & 0x1ffffffffffL) << 5L) | (s1 << 46L);           \
50         h = ((s1 >> 18L) & 0x7fffffLL) | (s2 << 23L);                   \
51         p[0] = byte_swap_if_big_endian(l);                              \
52         p[1] = byte_swap_if_big_endian(h);                              \
53     } while (0)
54 #define get_bundle(p, l, h, tm, s0, s1, s2)                             \
55     do {                                                                \
56         l = byte_swap_if_big_endian(p[0]);                              \
57         h = byte_swap_if_big_endian(p[1]);                              \
58         tm = l & 0x1f;                                                  \
59         s0 = (l >> 5L) & 0x1ffffffffffL;                                \
60         s1 = ((l >> 46L) & 0x3ffffL) | ((h & 0x7fffffL) << 18L);        \
61         s2 = (h >> 23L) & 0x1ffffffffffL;                               \
62     } while (0)
63
64 /*  Need to insert a stop if a modified register would (or could)
65  *  be read in the same cycle.
66  */
67 #define TSTREG1(r0)                                                     \
68     do {                                                                \
69         if (jit_regset_tstbit(&_jitc->regs, r0))                        \
70             stop();                                                     \
71     } while (0)
72 #define TSTREG2(r0, r1)                                                 \
73     do {                                                                \
74         if (jit_regset_tstbit(&_jitc->regs, r0) ||                      \
75             jit_regset_tstbit(&_jitc->regs, r1))                        \
76             stop();                                                     \
77     } while (0)
78 #define TSTPRED(p0)                                                     \
79     do {                                                                \
80         if (p0 && (_jitc->pred & (1 << p0)))                            \
81             stop();                                                     \
82     } while (0)
83 /* Record register was modified */
84 #define SETREG(r0)              jit_regset_setbit(&_jitc->regs, r0)
85
86 /* Avoid using constants in macros and code */
87 typedef enum {
88     GR_0,               GR_1,           GR_2,           GR_3,
89     GR_4,               GR_5,           GR_6,           GR_7,
90     GR_8,               GR_9,           GR_10,          GR_11,
91     GR_12,              GR_13,          GR_14,          GR_15,
92     GR_16,              GR_17,          GR_18,          GR_19,
93     GR_20,              GR_21,          GR_22,          GR_23,
94     GR_24,              GR_25,          GR_26,          GR_27,
95     GR_28,              GR_29,          GR_30,          GR_31,
96     GR_32,              GR_33,          GR_34,          GR_35,
97     GR_36,              GR_37,          GR_38,          GR_39,
98     GR_40,              GR_41,          GR_42,          GR_43,
99     /* GR_44...GR_127 */
100 } gr_reg_t;
101
102 typedef enum {
103     PR_0,               /* constant - always 1 */
104     /* p0-p5             -  preserved */
105     PR_1,               PR_2,           PR_3,           PR_4,
106     PR_5,
107     /* p6-p15            - scratch */
108     PR_6,               PR_7,           PR_8,           PR_9,
109     PR_10,              PR_11,          PR_12,          PR_13,
110     PR_14,              PR_15,
111     /* p16-...           - preserved - rotating */
112 } pr_reg_t;
113
114 typedef enum {
115     BR_0,               /* scratch - Return link */
116     /* b1-b5             - preserved */
117     BR_1,               BR_2,           BR_3,           BR_4,
118     BR_5,
119     /* b6-b7            - scratch */
120     BR_6,               BR_7
121 } br_reg_t;
122
123 typedef enum {
124     AR_KR0,             AR_KR1,         AR_KR2,         AR_KR3,
125     AR_KR4,             AR_KR5,         AR_KR6,         AR_KR7,
126     AR_8,               AR_9,           AR_10,          AR_11,
127     AR_12,              AR_13,          AR_14,          AR_15,
128     AR_RSC,             AR_BSP,         AR_BSPSTORE,    AR_RNAT,
129     AR_20,              AR_FCR,         AR_22,          AR_23,
130     AR_EFLAG,           AR_CSD,         AR_SSD,         AR_CFLG,
131     AR_FSR,             AR_FIR,         AR_FDR,         AR_31,
132     AR_CCV,             AR_33,          AR_34,          AR_35,
133     AR_UNAT,            AR_37,          AR_38,          AR_39,
134     AR_FPSR,            AR_41,          AR_42,          AR_43,
135     AR_ITC,             AR_RUC,         AR_46,          AR_47,
136     AR_48,              AR_49,          AR_50,          AR_51,
137     AR_52,              AR_53,          AR_54,          AR_55,
138     AR_56,              AR_57,          AR_58,          AR_59,
139     AR_60,              AR_61,          AR_62,          AR_63,
140     AR_PFS,             AR_LC,          AR_EC,
141     /* AR_67 ... AR_127 */
142 } ar_reg_t;
143
144 typedef enum {
145     TM_M_I_I_,  TM_M_I_Is,      TM_M_IsI_,      TM_M_IsIs,
146     TM_M_L_X_,  TM_M_L_Xs,      TM_ILL_06,      TM_ILL_07,
147     TM_M_M_I_,  TM_M_M_Is,      TM_MsM_I_,      TM_MsM_Is,
148     TM_M_F_I_,  TM_M_F_Is,      TM_M_M_F_,      TM_M_M_Fs,
149     TM_M_I_B_,  TM_M_I_Bs,      TM_M_B_B_,      TM_M_B_Bs,
150     TM_ILL_14,  TM_ILL_15,      TM_B_B_B_,      TM_B_B_Bs,
151     TM_M_M_B_,  TM_M_M_Bs,      TM_ILL_1A,      TM_ILL_1B,
152     TM_M_F_B_,  TM_M_F_Bs,      TM_ILL_1E,      TM_ILL_1F,
153 } template_t;
154
155 #define MWH_SPTK                        0
156 #define MWH_NONE                        1
157 #define MWH_DPTK                        2
158
159 #define IH_NONE                         0
160 #define IH_IMP                          1
161
162 #define LD_NONE                         0
163 #define LD_NT1                          1
164 #define LD_NTA                          3
165
166 #define ST_NONE                         0
167 #define ST_NTA                          3
168
169 #define LF_NONE                         0
170 #define LF_NT1                          1
171 #define LF_NT2                          2
172 #define LF_NTA                          3
173
174 #define BR_PH_FEW                       0
175 #define BR_PH_MANY                      1
176
177 #define BR_BWH_SPTK                     0
178 #define BR_BWH_SPNT                     1
179 #define BR_BWH_DPTK                     2
180 #define BR_BWH_DPNT                     3
181
182 #define BRI_BWH_SPTK                    1
183 #define BRI_BWH_SPNT                    3
184 #define BRI_BWH_DPTK                    5
185 #define BRI_BWH_DPNT                    7
186
187 #define BR_DH_NONE                      0
188 #define BR_DH_CLR                       1
189
190 #define BR_IH_NONE                      0
191 #define BR_IH_IMP                       1
192
193 #define BR_IPWH_SPTK                    0
194 #define BR_IPWH_LOOP                    1
195 #define BR_IPWH_DPTK                    2
196 #define BR_IPWH_EXIT                    3
197
198 #define BR_INDWH_SPTK                   0
199 #define BR_INDWH_DPTK                   2
200
201 #define MUX_BRCST                       0
202 #define MUX_REV                         11
203 #define MUX_MIX                         8
204 #define MUX_SHUF                        9
205 #define MUX_ALT                         10
206
207 #define ldr(r0,r1)                      ldr_l(r0,r1)
208 #define ldi(r0,i0)                      ldi_l(r0,i0)
209 #define str(r0,r1)                      str_l(r0,r1)
210 #define sti(i0,r0)                      str_l(i0,r0)
211 #define ldxr(r0,r1,r2)                  ldxr_l(r0,r1,r2)
212 #define ldxi(r0,r1,i0)                  ldxi_l(r0,r1,i0)
213 #define stxr(r0,r1,r2)                  stxr_l(r0,r1,r2)
214 #define stxi(i0,r0,r1)                  stxi_l(i0,r0,r1)
215
216 #if !HAVE_FFSL
217 #  define ffsl(l)                       __builtin_ffsl(l)
218 #endif
219
220 /* libgcc */
221 #if defined(__GNUC__)
222 extern long __divdi3(long,long);
223 extern unsigned long __udivdi3(unsigned long,unsigned long);
224 extern long __moddi3(long,long);
225 extern unsigned long __umoddi3(unsigned long,unsigned long);
226 #else
227 static long __divdi3(long,long);
228 static unsigned long __udivdi3(unsigned long,unsigned long);
229 static long __moddi3(long,long);
230 static unsigned long __umoddi3(unsigned long,unsigned long);
231 #endif
232 #define out(n,tm,s0,s1,s2)              _out(_jit,n,tm,s0,s1,s2)
233 static void _out(jit_state_t*,int,int,jit_word_t,jit_word_t,jit_word_t);
234 #define stop()                          _stop(_jit)
235 static void _stop(jit_state_t*);
236 #define sync()                          _sync(_jit)
237 static void _sync(jit_state_t*);
238 #define flush()                         _flush(_jit)
239 static void _flush(jit_state_t*);
240 #define inst(w, t)                      _inst(_jit, w, t)
241 static void _inst(jit_state_t*, jit_word_t, jit_uint8_t);
242 #define A1(x4,x2,r3,r2,r1)              _A1(_jit,0,x4,x2,r3,r2,r1)
243 static void _A1(jit_state_t*, jit_word_t,
244                 jit_word_t,jit_word_t,jit_word_t,jit_word_t,jit_word_t);
245 #define A2(x4,ct,r3,r2,r1)              A1(x4,ct,r3,r2,r1)
246 #define A3(x4,x2,r3,im,r1)              _A3(_jit,0,x4,x2,r3,im,r1)
247 static void _A3(jit_state_t*, jit_word_t,
248                 jit_word_t,jit_word_t,jit_word_t,jit_word_t,jit_word_t);
249 #define A4(x2a,r3,im,r1)                _A4(_jit,0,x2a,r3,im,r1)
250 static void _A4(jit_state_t*,jit_word_t,
251                 jit_word_t,jit_word_t,jit_word_t,jit_word_t);
252 #define A5(r3,im,r1)                    _A5(_jit,0,r3,im,r1)
253 static void _A5(jit_state_t*,jit_word_t,
254                 jit_word_t,jit_word_t,jit_word_t);
255 #define A6(o,x2,ta,p2,r3,r2,c,p1)       _A6(_jit,0,o,x2,ta,p2,r3,r2,c,p1)
256 static void _A6(jit_state_t*,jit_word_t,
257                 jit_word_t,jit_word_t,jit_word_t,jit_word_t,
258                 jit_word_t,jit_word_t,jit_word_t,jit_word_t);
259 #define A7(o,x2,ta,p2,r3,c,p1)          _A7(_jit,0,o,x2,ta,p2,r3,c,p1)
260 static void _A7(jit_state_t*,jit_word_t,
261                 jit_word_t,jit_word_t,jit_word_t,
262                 jit_word_t,jit_word_t,jit_word_t,jit_word_t)
263     maybe_unused;
264 #define A8(o,x2,ta,p2,r3,im,c,p1)       _A8(_jit,0,o,x2,ta,p2,r3,im,c,p1)
265 static void _A8(jit_state_t*,jit_word_t,
266                 jit_word_t,jit_word_t,jit_word_t,jit_word_t,
267                 jit_word_t,jit_word_t,jit_word_t,jit_word_t);
268 #define A9(za,zb,x4,x2,r3,r2,r1)        _A9(_jit,0,za,zb,x4,x2,r3,r2,r1)
269 static void _A9(jit_state_t*,jit_word_t,
270                 jit_word_t,jit_word_t,jit_word_t,
271                 jit_word_t,jit_word_t,jit_word_t,jit_word_t)
272     maybe_unused;
273 #define A10(x4,ct,r3,r2,r1)             A9(0,1,x4,ct,r3,r2,r1)
274 #define I1(ct,x2,r3,r2,r1)              _I1(_jit,0,ct,x2,r3,r2,r1)
275 static void _I1(jit_state_t*,jit_word_t,
276                 jit_word_t,jit_word_t,jit_word_t,jit_word_t,jit_word_t)
277     maybe_unused;
278 #define I2(za,x2a,zb,x2c,x2b,r3,r2,r1)  _I2(_jit,0,za,x2a,zb,x2c,x2b,r3,r2,r1)
279 static void _I2(jit_state_t*,jit_word_t,
280                 jit_word_t,jit_word_t,jit_word_t,jit_word_t,
281                 jit_word_t,jit_word_t,jit_word_t,jit_word_t)
282     maybe_unused;
283 #define I3(mbt,r2,r1)                   _I3(_jit,0,mbt,r2,r1)
284 static void _I3(jit_state_t*,jit_word_t,
285                 jit_word_t,jit_word_t,jit_word_t)
286 #if __BYTE_ORDER == __BIG_ENDIAN
287     maybe_unused
288 #endif
289     ;
290 #define I4(mht,r2,r1)                   _I4(_jit,0,mht,r2,r1)
291 static void _I4(jit_state_t*,jit_word_t,
292                 jit_word_t,jit_word_t,jit_word_t)
293     maybe_unused;
294 #define I5(za,zb,x2b,r3,r2,r1)          _I5(_jit,0,za,zb,x2b,r3,r2,r1)
295 static void _I5(jit_state_t*,jit_word_t,
296                 jit_word_t,jit_word_t,jit_word_t,
297                 jit_word_t,jit_word_t,jit_word_t);
298 #define I6(za,zb,x2b,r3,ct,r1)          _I6(_jit,0,za,zb,x2b,r3,ct,r1)
299 static void _I6(jit_state_t*,jit_word_t,
300                 jit_word_t,jit_word_t,jit_word_t,
301                 jit_word_t,jit_word_t,jit_word_t)
302     maybe_unused;
303 #define I7(za,zb,r3,r2,r1)              _I7(_jit,0,za,zb,r3,r2,r1)
304 static void _I7(jit_state_t*,jit_word_t,
305                 jit_word_t,jit_word_t,jit_word_t,jit_word_t,jit_word_t);
306 #define I8(za,zb,ct,r2,r1)              _I8(_jit,0,za,zb,ct,r2,r1)
307 static void _I8(jit_state_t*,jit_word_t,
308                 jit_word_t,jit_word_t,jit_word_t,jit_word_t,jit_word_t)
309     maybe_unused;
310 #define I9(x2c,r3,r1)                   _I9(_jit,0,x2c,r3,r1)
311 static void _I9(jit_state_t*,jit_word_t,
312                 jit_word_t,jit_word_t,jit_word_t)
313     maybe_unused;
314 #define I10(ct,r3,r2,r1)                _I10(_jit,0,ct,r3,r2,r1)
315 static void _I10(jit_state_t*,jit_word_t,
316                  jit_word_t,jit_word_t,jit_word_t,jit_word_t)
317     maybe_unused;
318 #define I11(len,r3,pos,y,r1)            _I11(_jit,0,len,r3,pos,y,r1)
319 static void _I11(jit_state_t*,jit_word_t,
320                  jit_word_t,jit_word_t,jit_word_t,jit_word_t,jit_word_t)
321     maybe_unused;
322 #define I12(len,pos,r2,r1)              _I12(_jit,0,len,pos,r2,r1)
323 static void _I12(jit_state_t*,jit_word_t,
324                  jit_word_t,jit_word_t,jit_word_t,jit_word_t)
325     maybe_unused;
326 #define I13(len,pos,im,r1)              _I13(_jit,0,len,pos,im,r1)
327 static void _I13(jit_state_t*,jit_word_t,
328                  jit_word_t,jit_word_t,jit_word_t,jit_word_t)
329     maybe_unused;
330 #define I14(s,len,r3,pos,r1)            _I14(_jit,0,s,len,r3,pos,r1)
331 static void _I14(jit_state_t*,jit_word_t,
332                  jit_word_t,jit_word_t,jit_word_t,jit_word_t,jit_word_t)
333     maybe_unused;
334 #define I15(pos,len,r3,r2,r1)           _I15(_jit,0,pos,len,r3,r2,r1)
335 static void _I15(jit_state_t*,jit_word_t,
336                  jit_word_t,jit_word_t,jit_word_t,jit_word_t,jit_word_t)
337     maybe_unused;
338 #define I16(tb,ta,p2,r3,pos,c,p1)       _I16(_jit,0,tb,ta,p2,r3,pos,c,p1)
339 static void _I16(jit_state_t*,jit_word_t,
340                  jit_word_t,jit_word_t,jit_word_t,
341                  jit_word_t,jit_word_t,jit_word_t,jit_word_t)
342     maybe_unused;
343 #define I17(tb,ta,p2,r3,c,p1)           _I17(_jit,0,tb,ta,p2,r3,c,p1)
344 static void _I17(jit_state_t*,jit_word_t,
345                  jit_word_t,jit_word_t,jit_word_t,
346                  jit_word_t,jit_word_t,jit_word_t)
347     maybe_unused;
348 #define I18(im,y)                       _I18(_jit,0,im,y)
349 static void _I18(jit_state_t*,jit_word_t,
350                  jit_word_t,jit_word_t)
351     maybe_unused;
352 #define I19(im)                         _I19(_jit,0,im)
353 static void _I19(jit_state_t*,jit_word_t,
354                  jit_word_t)
355     maybe_unused;
356 #define I20(r2,im)                      _I20(_jit,0,r2,im)
357 static void _I20(jit_state_t*,jit_word_t,
358                  jit_word_t,jit_word_t)
359     maybe_unused;
360 #define I21(im,ih,x,wh,r2,b1)           _I21(_jit,0,im,ih,x,wh,r2,b1)
361 static void _I21(jit_state_t*,jit_word_t,
362                  jit_word_t,jit_word_t,
363                  jit_word_t,jit_word_t,jit_word_t,jit_word_t);
364 #define I22(b2,r1)                      _I22(_jit,0,b2,r1)
365 static void _I22(jit_state_t*,jit_word_t,
366                  jit_word_t,jit_word_t);
367 #define I23(r2,im)                      _I23(_jit,0,r2,im)
368 static void _I23(jit_state_t*,jit_word_t,
369                  jit_word_t,jit_word_t)
370     maybe_unused;
371 #define I24(im)                         _I24(_jit,0,im)
372 static void _I24(jit_state_t*,jit_word_t,
373                  jit_word_t)
374     maybe_unused;
375 #define I25(x6,r1)                      _I25(_jit,0,x6,r1)
376 static void _I25(jit_state_t*,jit_word_t,
377                  jit_word_t,jit_word_t)
378     maybe_unused;
379 #define I26(ar,r2)                      _I26(_jit,0,ar,r2)
380 static void _I26(jit_state_t*,jit_word_t,
381                  jit_word_t,jit_word_t);
382 #define I27(ar,im)                      _I27(_jit,0,ar,im)
383 static void _I27(jit_state_t*,jit_word_t,
384                  jit_word_t,jit_word_t)
385     maybe_unused;
386 #define I28(ar,r1)                      _I28(_jit,0,ar,r1)
387 static void _I28(jit_state_t*,jit_word_t,
388                  jit_word_t,jit_word_t)
389     maybe_unused;
390 #define I29(x6,r3,r1)                   _I29(_jit,0,x6,r3,r1)
391 static void _I29(jit_state_t*,jit_word_t,
392                  jit_word_t,jit_word_t,jit_word_t);
393 #define I30(tb,ta,p2,im,c,p1)           _I30(_jit,0,ta,tb,p2,im,c,p1)
394 static void _I30(jit_state_t*,jit_word_t,
395                  jit_word_t,jit_word_t,jit_word_t,
396                  jit_word_t,jit_word_t,jit_word_t)
397     maybe_unused;
398 #define M1(x6,ht,x,r3,r1)               _M1(_jit,0,x6,ht,x,r3,r1)
399 static void _M1(jit_state_t*,jit_word_t,
400                 jit_word_t,jit_word_t,jit_word_t,jit_word_t,jit_word_t);
401 #define M2(x6,ht,r3,r2,r1)              _M2(_jit,0,x6,ht,r3,r2,r1)
402 static void _M2(jit_state_t*,jit_word_t,
403                 jit_word_t,jit_word_t,jit_word_t,jit_word_t,jit_word_t)
404     maybe_unused;
405 #define M3(x6,ht,r3,im,r1)              _M3(_jit,0,x6,ht,r3,im,r1)
406 static void _M3(jit_state_t*,jit_word_t,
407                 jit_word_t,jit_word_t,jit_word_t,jit_word_t,jit_word_t);
408 #define M5(x6,ht,r3,r2,im)              _M5(_jit,0,x6,ht,r3,r2,im)
409 static void _M5(jit_state_t*,jit_word_t,
410                 jit_word_t,jit_word_t,jit_word_t,jit_word_t,jit_word_t)
411     maybe_unused;
412 #define M6(x6,ht,x,r3,r2)               _M6(_jit,0,x6,ht,x,r3,r2)
413 static void _M6(jit_state_t*,jit_word_t,
414                 jit_word_t,jit_word_t,jit_word_t,jit_word_t,jit_word_t);
415 #define M13(x6,ht,r3,f2)                _M13(_jit,0,x6,ht,r3,f2)
416 static void _M13(jit_state_t*,jit_word_t,
417                  jit_word_t,jit_word_t,jit_word_t,jit_word_t);
418 #define M14(x6,ht,r3,r2)                _M14(_jit,0,x6,ht,r3,r2)
419 static void _M14(jit_state_t*,jit_word_t,
420                  jit_word_t,jit_word_t,jit_word_t,jit_word_t)
421     maybe_unused;
422 #define M15(x6,ht,r3,im)                _M15(_jit,0,x6,ht,r3,im)
423 static void _M15(jit_state_t*,jit_word_t,
424                  jit_word_t,jit_word_t,jit_word_t,jit_word_t)
425     maybe_unused;
426 #define M16(x6,ht,r3,r2,r1)             _M16(_jit,0,x6,ht,r3,r2,r1)
427 static void _M16(jit_state_t*,jit_word_t,
428                  jit_word_t,jit_word_t,jit_word_t,jit_word_t,jit_word_t)
429     maybe_unused;
430 #define M17(x6,ht,r3,im,r1)             _M17(_jit,0,x6,ht,r3,im,r1)
431 static void _M17(jit_state_t*,jit_word_t,
432                  jit_word_t,jit_word_t,jit_word_t,jit_word_t,jit_word_t)
433     maybe_unused;
434 #define M20(r2,im)                      M20x(0x1,r2,im)
435 #define M20x(x3,r2,im)                  _M20x(_jit,0,x3,r2,im)
436 static void _M20x(jit_state_t*,jit_word_t,
437                   jit_word_t,jit_word_t,jit_word_t)
438     maybe_unused;
439 #define M22(x3,im,r1)                   M22x(x3,im,r1)
440 #define M22x(x3,im,r1)                  _M22x(_jit,0,x3,im,r1)
441 static void _M22x(jit_state_t*,jit_word_t,
442                   jit_word_t,jit_word_t,jit_word_t)
443     maybe_unused;
444 #define M24(x2,x4)                      _M24(_jit,0,x2,x4)
445 #define M25(x4)                         M24(0,x4)
446 static void _M24(jit_state_t*,jit_word_t,
447                  jit_word_t,jit_word_t)
448     maybe_unused;
449 #define M26(r1)                         M26x(2,r1)
450 #define M26x(x4,r1)                     _M26x(_jit,0,x4,r1)
451 static void _M26x(jit_state_t*,jit_word_t,
452                   jit_word_t,jit_word_t)
453     maybe_unused;
454 #define M28(x,r3)                       _M28(_jit,0,x,r3)
455 static void _M28(jit_state_t*,jit_word_t,
456                  jit_word_t,jit_word_t)
457     maybe_unused;
458 #define M29(ar,r2)                      _M29(_jit,0,ar,r2)
459 static void _M29(jit_state_t*,jit_word_t,
460                  jit_word_t,jit_word_t)
461     maybe_unused;
462 #define M30(ar,im)                      _M30(_jit,0,ar,im)
463 static void _M30(jit_state_t*,jit_word_t,jit_word_t,jit_word_t)
464     maybe_unused;
465 #define M31(ar,r1)                      _M31(_jit,0,ar,r1)
466 static void _M31(jit_state_t*,jit_word_t,
467                  jit_word_t,jit_word_t)
468     maybe_unused;
469 #define M32(cr,r2)                      _M32(_jit,0,cr,r2)
470 static void _M32(jit_state_t*,jit_word_t,
471                  jit_word_t,jit_word_t)
472     maybe_unused;
473 #define M33(cr,r1)                      _M33(_jit,0,cr,r1)
474 static void _M33(jit_state_t*,jit_word_t,
475                  jit_word_t,jit_word_t)
476     maybe_unused;
477 #define M34(sor,sol,sof,r1)             _M34(_jit,0,sor,sol,sof,r1)
478 static void _M34(jit_state_t*,jit_word_t,
479                  jit_word_t,jit_word_t,jit_word_t,jit_word_t);
480 #define M35(x6,r2)                      _M35(_jit,0,x6,r2)
481 static void _M35(jit_state_t*,jit_word_t,
482                  jit_word_t,jit_word_t)
483     maybe_unused;
484 #define M36(x6,r1)                      _M36(_jit,0,x6,r1)
485 static void _M36(jit_state_t*,jit_word_t,
486                  jit_word_t,jit_word_t)
487     maybe_unused;
488 #define M37(im)                         _M37(_jit,0,im)
489 static void _M37(jit_state_t*,jit_word_t,
490                  jit_word_t)
491     maybe_unused;
492 #define M38(x6,r3,r2,r1)                _M38(_jit,0,x6,r3,r2,r1)
493 static void _M38(jit_state_t*,jit_word_t,
494                  jit_word_t,jit_word_t,jit_word_t,jit_word_t)
495     maybe_unused;
496 #define M39(x6,r3,im,r1)                _M39(_jit,0,x6,r3,im,r1)
497 static void _M39(jit_state_t*,jit_word_t,
498                  jit_word_t,jit_word_t,jit_word_t,jit_word_t)
499     maybe_unused;
500 #define M40(x6,r3,im)                   _M40(_jit,0,x6,r3,im)
501 static void _M40(jit_state_t*,jit_word_t,
502                  jit_word_t,jit_word_t,jit_word_t)
503     maybe_unused;
504 #define M41(x6,r2)                      _M41(_jit,0,x6,r2)
505 static void _M41(jit_state_t*,jit_word_t,
506                  jit_word_t,jit_word_t)
507     maybe_unused;
508 #define M42(x6,r3,r2)                   _M42(_jit,0,x6,r3,r2)
509 static void _M42(jit_state_t*,jit_word_t,
510                  jit_word_t,jit_word_t,jit_word_t)
511     maybe_unused;
512 #define M43(x6,r3,r1)                   _M43(_jit,0,x6,r3,r1)
513 static void _M43(jit_state_t*,jit_word_t,
514                  jit_word_t,jit_word_t,jit_word_t)
515     maybe_unused;
516 #define M44(x4,im)                      _M44(_jit,0,x4,im)
517 static void _M44(jit_state_t*,jit_word_t,
518                  jit_word_t,jit_word_t)
519     maybe_unused;
520 #define M45(x6,r3,r2)                   _M45(_jit,0,x6,r3,r2)
521 static void _M45(jit_state_t*,jit_word_t,
522                  jit_word_t,jit_word_t,jit_word_t)
523     maybe_unused;
524 #define M46(x6,r3,r1)                   _M46(_jit,0,x6,r3,r1)
525 #define M47(x6,r3)                      M46(x6,r3,0)
526 static void _M46(jit_state_t*,jit_word_t,
527                  jit_word_t,jit_word_t,jit_word_t)
528     maybe_unused;
529 #define M48(y,im)                       _M48(_jit,0,y,im)
530 static void _M48(jit_state_t*,jit_word_t,
531                  jit_word_t,jit_word_t)
532     maybe_unused;
533 #define B1(d,wh,im,p,tp)                _B1(_jit,0,d,wh,im,p,tp)
534 #define B2(d,wh,im,p,tp)                B1(d,wh,im,p,tp)
535 static void _B1(jit_state_t*,jit_word_t,
536                 jit_word_t,jit_word_t,jit_word_t,jit_word_t,jit_word_t);
537 #define B3(d,wh,im,p,b)                 _B3(_jit,0,d,wh,im,p,b)
538 static void _B3(jit_state_t*,jit_word_t,
539                 jit_word_t,jit_word_t,jit_word_t,jit_word_t,jit_word_t)
540     maybe_unused;
541 #define B4(d,wh,x6,b,p,tp)              _B4(_jit,0,d,wh,x6,b,p,tp)
542 static void _B4(jit_state_t*,jit_word_t,
543                 jit_word_t,jit_word_t,jit_word_t,
544                 jit_word_t,jit_word_t,jit_word_t);
545 #define B5(d,wh,b2,p,b1)                _B5(_jit,0,d,wh,b2,p,b1)
546 static void _B5(jit_state_t*,jit_word_t,
547                 jit_word_t,jit_word_t,jit_word_t,jit_word_t,jit_word_t);
548 #define B6(ih,im,tag,wh)                _B6(_jit,0,ih,im,tag,wh)
549 static void _B6(jit_state_t*,jit_word_t,
550                 jit_word_t,jit_word_t,jit_word_t,jit_word_t)
551     maybe_unused;
552 #define B7(ih,x6,b2,tag,wh)             _B7(_jit,0,ih,x6,b2,tag,wh)
553 static void _B7(jit_state_t*,jit_word_t,
554                 jit_word_t,jit_word_t,jit_word_t,jit_word_t,jit_word_t)
555     maybe_unused;
556 #define B8(x6)                          _B8(_jit,0,x6)
557 static void _B8(jit_state_t*,jit_word_t,
558                 jit_word_t)
559     maybe_unused;
560 #define B9(op,x6,im)                    _B9(_jit,0,op,x6,im)
561 static void _B9(jit_state_t*,jit_word_t,
562                 jit_word_t,jit_word_t,jit_word_t)
563     maybe_unused;
564 #define X1(im)                          _X1(_jit,0,im)
565 static void _X1(jit_state_t*,jit_word_t,
566                 jit_word_t)
567     maybe_unused;
568 #define X2(r1,im)                       _X2(_jit,0,r1,im)
569 static void _X2(jit_state_t*,jit_word_t,
570                 jit_word_t,jit_word_t);
571 #define X3x(o,d,wh,p,tp,im)             _X3x(_jit,0,o,d,wh,p,tp,im)
572 #define X3(d,wh,p,tp,im)                X3x(0xc,d,wh,p,tp,im)
573 #define X4(d,wh,p,tp,im)                X3x(0xd,d,wh,p,tp,im)
574 static void _X3x(jit_state_t*,jit_word_t,
575                  jit_word_t,jit_word_t,jit_word_t,
576                  jit_word_t,jit_word_t,jit_word_t);
577 #define X5(y,im)                        _X5(_jit,0,y,im)
578 static void _X5(jit_state_t*,jit_word_t,
579                 jit_word_t,jit_word_t)
580     maybe_unused;
581
582 /* add */
583 #define ADD(r1,r2,r3)                   A1(0,0,r3,r2,r1)
584 #define ADD1(r1,r2,r3)                  A1(0,1,r3,r2,r1)
585 #define ADDS(r1,im,r3)                  A4(2,r3,im,r1)
586 #define ADDS_p(r1,im,r3,_p)             _A4(_jit,_p,2,r3,im,r1)
587 #define ADDL(r1,im,r3)                  A5(r3,im,r1)
588 #define ADDL_p(r1,im,r3,_p)             _A5(_jit,_p,r3,im,r1)
589 /* addp4 */
590 #define ADDP4(r1,r2,r3)                 A1(2,0,r3,r2,r1)
591 #define ADDIP4(r1,im,r3)                A4(3,r3,im,r1)
592 /* alloc */
593 #define ALLOCR(r1,i,l,o,r)              M34((r)>>3,(i)+(l),(i)+(l)+(o),r1)
594 #define ALLOC(r1,i,o)                   ALLOCR(r1,i,0,o,0)
595 /* and */
596 #define AND(r1,r2,r3)                   A1(3,0,r3,r2,r1)
597 #define ANDI(r1,im,r3)                  A3(0xb,0,r3,im,r1)
598 /* andcm */
599 #define ANDCM(r1,r2,r3)                 A1(3,1,r3,r2,r1)
600 #define ANDCMI(r1,im,r3)                A3(0xb,1,r3,im,r1)
601 /* br */
602 #define BRI(im)                         B1(BR_DH_NONE,BR_BWH_SPTK,im,BR_PH_FEW,0)
603 #define BRI_COND(im,_p)                 _B1(_jit,_p,BR_DH_NONE,BR_BWH_SPTK,im,BR_PH_FEW,0)
604 #define BRI_WEXIT(im)                   B1(BR_DH_NONE,BR_BWH_SPTK,im,BR_PH_MANY,2)
605 #define BRI_WTOP(im)                    B1(BR_DH_NONE,BR_BWH_SPTK,im,BR_PH_MANY,3)
606 #define BRI_CALL(b,im)                  B3(BR_DH_NONE,BR_BWH_SPTK,im,BR_PH_MANY,b)
607 #define BRI_CLOOP(im)                   B2(BR_DH_NONE,BR_BWH_SPTK,im,BR_PH_MANY,5)
608 #define BRI_CEXIT(im)                   B2(BR_DH_NONE,BR_BWH_SPTK,im,BR_PH_MANY,6)
609 #define BRI_CTOP(im)                    B2(BR_DH_NONE,BR_BWH_SPTK,im,BR_PH_MANY,7)
610 #define BR_COND(b,_p)                   _B4(_jit,_p,BR_DH_NONE,BR_BWH_SPTK,0x20,b,BR_PH_FEW,0)
611 #define BR(b)                           B4(BR_DH_NONE,BR_BWH_SPTK,0x20,b,BR_PH_FEW,0)
612 #define BR_IA(b)                        B4(BR_DH_NONE,BR_BWH_SPTK,0x20,b,BR_PH_MANY,1)
613 #define BR_RET(b)                       B4(BR_DH_NONE,BR_BWH_SPTK,0x21,b,BR_PH_MANY,4)
614 #define BR_CALL(b1,b2)                  B5(BR_DH_NONE,BRI_BWH_SPTK,b2,BR_PH_MANY,b1)
615 /* break */
616 #define BREAK_I(im)                     I19(im)
617 #define BREAK_M(im)                     M37(im)
618 #define BREAK_B(im)                     B9(0,0,im)
619 #define BREAK_X(im)                     X1(im)
620 /* brl */
621 #define BRL(im)                         X3(BR_DH_NONE,BR_BWH_SPTK,BR_PH_MANY,0,im)
622 #define BRL_COND(im,_p)                 _X3(_jit,_p,BR_DH_NONE,BR_BWH_SPTK,BR_PH_MANY,0,im)
623 #define BRL_CALL(b1,im)                 X4(BR_DH_NONE,BR_BWH_SPTK,BR_PH_MANY,b1,im)
624 /* brp */
625 #define BRP(im,tag)                     B6(BR_IH_NONE,im,tag,BR_IPWH_SPTK)
626 #define BRPI(b2,tag)                    B7(BR_IH_NONE,0x10,b2,tag,BR_INDWH_SPTK)
627 #define BRPI_RET(b2,tag)                B7(BR_IH_NONE,0x11,b2,tag,BR_INDWH_SPTK)
628 /* bsw */
629 #define BSW_0()                         B8(0x0c)
630 #define BSW_1()                         B8(0x0d)
631 /* chk */
632 #define CHK_S_I(r2,im)                  I20(r2,im)
633 #define CHK_S_M(r2,im)                  M20(r2,im)
634 #define CHK_A_NC(r1,im)                 M22(0x4,im,r1)
635 #define CHK_A_CLR(r1,im)                M22(0x5,im,r1)
636 /* clrrrb */
637 #define CLRRRB()                        B8(0x04)
638 #define CLRRRB_PR()                     B8(0x05)
639 /* clz */
640 #define CLZ(r1,r3)                      I9(3,r3,r1)
641 /* cmp */
642 #define CMP_LT(p1,p2,r2,r3)             A6(0xc,0,0,p2,r3,r2,0,p1)
643 #define CMP_LT_p(p1,p2,r2,r3,_p)        A6(_jit,_p,0xc,0,0,p2,r3,r2,0,p1)
644 #define CMP_LTU(p1,p2,r2,r3)            A6(0xd,0,0,p2,r3,r2,0,p1)
645 #define CMP_EQ(p1,p2,r2,r3)             A6(0xe,0,0,p2,r3,r2,0,p1)
646 #define CMP_LT_UNC(p1,p2,r2,r3)         A6(0xc,0,0,p2,r3,r2,1,p1)
647 #define CMP_LTU_UNC(p1,p2,r2,r3)        A6(0xd,0,0,p2,r3,r2,1,p1)
648 #define CMP_EQ_UNC(p1,p2,r2,r3)         A6(0xe,0,0,p2,r3,r2,1,p1)
649 #define CMP_EQ_AND(p1,p2,r2,r3)         A6(0xc,0,1,p2,r3,r2,0,p1)
650 #define CMP_EQ_OR(p1,p2,r2,r3)          A6(0xd,0,1,p2,r3,r2,0,p1)
651 #define CMP_EQ_OR_ANDCM(p1,p2,r2,r3)    A6(0xe,0,1,p2,r3,r2,0,p1)
652 #define CMP_NE_AND(p1,p2,r2,r3)         A6(0xc,0,1,p2,r3,r2,1,p1)
653 #define CMP_NE_OR(p1,p2,r2,r3)          A6(0xd,0,1,p2,r3,r2,1,p1)
654 #define CMP_NE_OR_ANDCM(p1,p2,r2,r3)    A6(0xe,0,1,p2,r3,r2,1,p1)
655 #define CMPI_LT(p1,p2,im,r3)            A8(0xc,2,0,p2,r3,im,0,p1)
656 #define CMPI_LTU(p1,p2,im,r3)           A8(0xd,2,0,p2,r3,im,0,p1)
657 #define CMPI_EQ(p1,p2,im,r3)            A8(0xe,2,0,p2,r3,im,0,p1)
658 #define CMPI_EQ_p(p1,p2,im,r3,_p)       _A8(_jit,_p,0xe,2,0,p2,r3,im,0,p1)
659 #define CMPI_LT_UNC(p1,p2,im,r3)        A8(0xc,2,0,p2,r3,im,1,p1)
660 #define CMPI_LTU_UNC(p1,p2,im,r3)       A8(0xd,2,0,p2,r3,im,1,p1)
661 #define CMPI_EQ_UNC(p1,p2,im,r3)        A8(0xe,2,0,p2,r3,im,1,p1)
662 #define CMPI_EQ_AND(p1,p2,im,r3)        A8(0xc,2,1,p2,r3,im,0,p1)
663 #define CMPI_EQ_OR(p1,p2,im,r3)         A8(0xd,2,1,p2,r3,im,0,p1)
664 #define CMPI_EQ_ANDCM(p1,p2,im,r3)      A8(0xe,2,1,p2,r3,im,0,p1)
665 #define CMPI_NE_AND(p1,p2,im,r3)        A8(0xc,2,1,p2,r3,im,1,p1)
666 #define CMPI_NE_OR(p1,p2,im,r3)         A8(0xd,2,1,p2,r3,im,1,p1)
667 #define CMPI_NE_ANDCM(p1,p2,im,r3)      A8(0xe,2,1,p2,r3,im,1,p1)
668 #define ZCMP_GT_AND(p1,p2,r3)           A7(0xc,0,0,p2,r3,0,p1)
669 #define ZCMP_GT_OR(p1,p2,r3)            A7(0xd,0,0,p2,r3,0,p1)
670 #define ZCMP_GT_ANDCM(p1,p2,r3)         A7(0xe,0,0,p2,r3,0,p1)
671 #define ZCMP_LE_AND(p1,p2,r3)           A7(0xc,0,0,p2,r3,1,p1)
672 #define ZCMP_LE_OR(p1,p2,r3)            A7(0xd,0,0,p2,r3,1,p1)
673 #define ZCMP_LE_ANDCM(p1,p2,r3)         A7(0xe,0,0,p2,r3,1,p1)
674 #define ZCMP_GE_AND(p1,p2,r3)           A7(0xc,0,1,p2,r3,0,p1)
675 #define ZCMP_GE_OR(p1,p2,r3)            A7(0xd,0,1,p2,r3,0,p1)
676 #define ZCMP_GE_ANDCM(p1,p2,r3)         A7(0xe,0,1,p2,r3,0,p1)
677 #define ZCMP_LT_AND(p1,p2,r3)           A7(0xc,0,1,p2,r3,1,p1)
678 #define ZCMP_LT_OR(p1,p2,r3)            A7(0xd,0,1,p2,r3,1,p1)
679 #define ZCMP_LT_ANDCM(p1,p2,r3)         A7(0xe,0,1,p2,r3,1,p1)
680 /* cmp4 */
681 #define CMP4_LT(p1,p2,r2,r3)            A6(0xc,1,0,p2,r3,r2,0,p1)
682 #define CMP4_LTU(p1,p2,r2,r3)           A6(0xd,1,0,p2,r3,r2,0,p1)
683 #define CMP4_EQ(p1,p2,r2,r3)            A6(0xe,1,0,p2,r3,r2,0,p1)
684 #define CMP4_LT_UNC(p1,p2,r2,r3)        A6(0xc,1,0,p2,r3,r2,1,p1)
685 #define CMP4_LTU_UNC(p1,p2,r2,r3)       A6(0xd,1,0,p2,r3,r2,1,p1)
686 #define CMP4_EQ_UNC(p1,p2,r2,r3)        A6(0xe,1,0,p2,r3,r2,1,p1)
687 #define CMP4_EQ_AND(p1,p2,r2,r3)        A6(0xc,1,1,p2,r3,r2,0,p1)
688 #define CMP4_EQ_OR(p1,p2,r2,r3)         A6(0xd,1,1,p2,r3,r2,0,p1)
689 #define CMP4_EQ_XOR(p1,p2,r2,r3)        A6(0xe,1,1,p2,r3,r2,0,p1)
690 #define CMP4_NE_AND(p1,p2,r2,r3)        A6(0xc,1,1,p2,r3,r2,1,p1)
691 #define CMP4_NE_OR(p1,p2,r2,r3)         A6(0xd,1,1,p2,r3,r2,1,p1)
692 #define CMP4_NE_XOR(p1,p2,r2,r3)        A6(0xe,1,1,p2,r3,r2,1,p1)
693 #define CMP4I_LT(p1,p2,im,r3)           A8(0xc,3,0,p2,r3,im,0,p1)
694 #define CMP4I_LTU(p1,p2,im,r3)          A8(0xd,3,0,p2,r3,im,0,p1)
695 #define CMP4I_EQ(p1,p2,im,r3)           A8(0xe,3,0,p2,r3,im,0,p1)
696 #define CMP4I_LT_UNC(p1,p2,im,r3)       A8(0xc,3,0,p2,r3,im,1,p1)
697 #define CMP4I_LTU_UNC(p1,p2,im,r3)      A8(0xd,3,0,p2,r3,im,1,p1)
698 #define CMP4I_EQ_UNC(p1,p2,im,r3)       A8(0xe,3,0,p2,r3,im,1,p1)
699 #define CMP4I_EQ_AND(p1,p2,im,r3)       A8(0xc,3,1,p2,r3,im,0,p1)
700 #define CMP4I_EQ_OR(p1,p2,im,r3)        A8(0xd,3,1,p2,r3,im,0,p1)
701 #define CMP4I_EQ_ANDCM(p1,p2,im,r3)     A8(0xe,3,1,p2,r3,im,0,p1)
702 #define CMP4I_NE_AND(p1,p2,im,r3)       A8(0xc,3,1,p2,r3,im,1,p1)
703 #define CMP4I_NE_OR(p1,p2,im,r3)        A8(0xd,3,1,p2,r3,im,1,p1)
704 #define CMP4I_NE_ANDCM(p1,p2,im,r3)     A8(0xe,3,1,p2,r3,im,1,p1)
705 #define ZCMP4_GT_AND(p1,p2,r3)          A7(0xc,1,0,p2,r3,0,p1)
706 #define ZCMP4_GT_OR(p1,p2,r3)           A7(0xd,1,0,p2,r3,0,p1)
707 #define ZCMP4_GT_ANDCM(p1,p2,r3)        A7(0xe,1,0,p2,r3,0,p1)
708 #define ZCMP4_LE_AND(p1,p2,r3)          A7(0xc,1,0,p2,r3,1,p1)
709 #define ZCMP4_LE_OR(p1,p2,r3)           A7(0xd,1,0,p2,r3,1,p1)
710 #define ZCMP4_LE_ANDCM(p1,p2,r3)        A7(0xe,1,0,p2,r3,1,p1)
711 #define ZCMP4_GE_AND(p1,p2,r3)          A7(0xc,1,1,p2,r3,0,p1)
712 #define ZCMP4_GE_OR(p1,p2,r3)           A7(0xd,1,1,p2,r3,0,p1)
713 #define ZCMP4_GE_ANDCM(p1,p2,r3)        A7(0xe,1,1,p2,r3,0,p1)
714 #define ZCMP4_LT_AND(p1,p2,r3)          A7(0xc,1,1,p2,r3,1,p1)
715 #define ZCMP4_LT_OR(p1,p2,r3)           A7(0xd,1,1,p2,r3,1,p1)
716 #define ZCMP4_LT_ANDCM(p1,p2,r3)        A7(0xe,1,1,p2,r3,1,p1)
717 /* cmpxchg */
718 #define CMPXCHG1_ACQ(r1,r3,r2)          M16(0x00,LD_NONE,r3,r2,r1)
719 #define CMPXCHG2_ACQ(r1,r3,r2)          M16(0x01,LD_NONE,r3,r2,r1)
720 #define CMPXCHG4_ACQ(r1,r3,r2)          M16(0x02,LD_NONE,r3,r2,r1)
721 #define CMPXCHG8_ACQ(r1,r3,r2)          M16(0x03,LD_NONE,r3,r2,r1)
722 #define CMPXCHG1_REL(r1,r3,r2)          M16(0x04,LD_NONE,r3,r2,r1)
723 #define CMPXCHG2_REL(r1,r3,r2)          M16(0x05,LD_NONE,r3,r2,r1)
724 #define CMPXCHG4_REL(r1,r3,r2)          M16(0x06,LD_NONE,r3,r2,r1)
725 #define CMPXCHG8_REL(r1,r3,r2)          M16(0x07,LD_NONE,r3,r2,r1)
726 #define CMP8XCHG16_ACQ(r1,r3,r2)        M16(0x20,LD_NONE,r3,r2,r1)
727 #define CMP8XCHG16_REL(r1,r3,r2)        M16(0x24,LD_NONE,r3,r2,r1)
728 /* cover */
729 #define COVER()                         B8(0x02)
730 /* cxz */
731 #define CZX1_L(r1,r3)                   I29(0x18,r3,r1)
732 #define CZX2_L(r1,r3)                   I29(0x19,r3,r1)
733 #define CZX1_R(r1,r3)                   I29(0x1c,r3,r1)
734 #define CZX2_R(r1,r3)                   I29(0x1d,r3,r1)
735 /* dep */
736 #define DEP_Z(r1,r2,pos,len)            I12(len,pos,r2,r1)
737 #define DEPI_Z(r1,im,pos,len)           I13(len,pos,im,r1)
738 #define DEPs(r1,r2,r3,pos,len)          I14(1,len,r3,pos,r1)
739 #define DEPu(r1,r2,r3,pos,len)          I14(0,len,r3,pos,r1)
740 #define DEP(r1,r2,r3,pos,len)           I15(pos,len,r3,r2,r1)
741 /* epc */
742 #define EPC()                           B8(0x10)
743 /* extr */
744 #define EXTR(r1,r3,pos,len)             I11(len,r3,pos,1,r1)
745 #define EXTR_U(r1,r3,pos,len)           I11(len,r3,pos,0,r1)
746 /* fc */
747 #define FC(r3)                          M28(0,r3)
748 #define FC_I(r3)                        M28(1,r3)
749 /* fetchadd */
750 #define FETCHADD4_ACQ(r1,r3,im)         M17(0x12,LD_NONE,r3,im,r1)
751 #define FETCHADD8_ACQ(r1,r3,im)         M17(0x13,LD_NONE,r3,im,r1)
752 #define FETCHADD4_REL(r1,r3,im)         M17(0x16,LD_NONE,r3,im,r1)
753 #define FETCHADD8_REL(r1,r3,im)         M17(0x17,LD_NONE,r3,im,r1)
754 /* flushrs */
755 #define FLUSHRS()                       M25(0xc)
756 /* fwb */
757 #define FWB()                           M24(2,0)
758 /* hint */
759 #define HINT_I(im)                      I18(im,1)
760 #define HINT_M(im)                      M48(1,im)
761 #define HINT_B(im)                      B9(2,1,im)
762 #define HINT_X(im)                      X5(1,im)
763 /* invala */
764 #define INVALA()                        M24(1,0)
765 #define INVALA_E(r1)                    M26(r1)
766 /* itc */
767 #define ITC_I(r2)                       M41(0x2f,r2)
768 #define ITC_D(r2)                       M41(0x2e,r2)
769 /* itr */
770 #define ITR_I(r3,r2)                    M42(0x0f,r3,r2)
771 #define ITR_D(r3,r2)                    M42(0x0e,r3,r2)
772 /* ld */
773 #define LD1(r1,r3)                      M1(0x00,LD_NONE,0,r3,r1)
774 #define LD2(r1,r3)                      M1(0x01,LD_NONE,0,r3,r1)
775 #define LD4(r1,r3)                      M1(0x02,LD_NONE,0,r3,r1)
776 #define LD8(r1,r3)                      M1(0x03,LD_NONE,0,r3,r1)
777 #define LD1_S(r1,r3)                    M1(0x04,LD_NONE,0,r3,r1)
778 #define LD2_S(r1,r3)                    M1(0x05,LD_NONE,0,r3,r1)
779 #define LD4_S(r1,r3)                    M1(0x06,LD_NONE,0,r3,r1)
780 #define LD8_S(r1,r3)                    M1(0x07,LD_NONE,0,r3,r1)
781 #define LD1_A(r1,r3)                    M1(0x08,LD_NONE,0,r3,r1)
782 #define LD2_A(r1,r3)                    M1(0x09,LD_NONE,0,r3,r1)
783 #define LD4_A(r1,r3)                    M1(0x0a,LD_NONE,0,r3,r1)
784 #define LD8_A(r1,r3)                    M1(0x0b,LD_NONE,0,r3,r1)
785 #define LD1_SA(r1,r3)                   M1(0x0c,LD_NONE,0,r3,r1)
786 #define LD2_SA(r1,r3)                   M1(0x0d,LD_NONE,0,r3,r1)
787 #define LD4_SA(r1,r3)                   M1(0x0e,LD_NONE,0,r3,r1)
788 #define LD8_SA(r1,r3)                   M1(0x0f,LD_NONE,0,r3,r1)
789 #define LD1_BIAS(r1,r3)                 M1(0x10,LD_NONE,0,r3,r1)
790 #define LD2_BIAS(r1,r3)                 M1(0x11,LD_NONE,0,r3,r1)
791 #define LD4_BIAS(r1,r3)                 M1(0x12,LD_NONE,0,r3,r1)
792 #define LD8_BIAS(r1,r3)                 M1(0x13,LD_NONE,0,r3,r1)
793 #define LD1_ACQ(r1,r3)                  M1(0x14,LD_NONE,0,r3,r1)
794 #define LD2_ACQ(r1,r3)                  M1(0x15,LD_NONE,0,r3,r1)
795 #define LD4_ACQ(r1,r3)                  M1(0x16,LD_NONE,0,r3,r1)
796 #define LD8_ACQ(r1,r3)                  M1(0x17,LD_NONE,0,r3,r1)
797 #define LD8_FILL(r1,r3)                 M1(0x1b,LD_NONE,0,r3,r1)
798 #define LD1_C_CLR(r1,r3)                M1(0x20,LD_NONE,0,r3,r1)
799 #define LD2_C_CLR(r1,r3)                M1(0x21,LD_NONE,0,r3,r1)
800 #define LD4_C_CLR(r1,r3)                M1(0x22,LD_NONE,0,r3,r1)
801 #define LD8_C_CLR(r1,r3)                M1(0x23,LD_NONE,0,r3,r1)
802 #define LD1_C_NC(r1,r3)                 M1(0x24,LD_NONE,0,r3,r1)
803 #define LD2_C_NC(r1,r3)                 M1(0x25,LD_NONE,0,r3,r1)
804 #define LD4_C_NC(r1,r3)                 M1(0x26,LD_NONE,0,r3,r1)
805 #define LD8_C_NC(r1,r3)                 M1(0x27,LD_NONE,0,r3,r1)
806 #define LD1_C_CLR_ACQ(r1,r3)            M1(0x28,LD_NONE,0,r3,r1)
807 #define LD2_C_CLR_ACQ(r1,r3)            M1(0x29,LD_NONE,0,r3,r1)
808 #define LD4_C_CLR_ACQ(r1,r3)            M1(0x2a,LD_NONE,0,r3,r1)
809 #define LD8_C_CLR_ACQ(r1,r3)            M1(0x2b,LD_NONE,0,r3,r1)
810 #define LD16(r1,r3)                     M1(0x28,LD_NONE,1,r3,r1)
811 #define LD16_ACQ(r1,r3)                 M1(0x2c,LD_NONE,1,r3,r1)
812 #define LD1_inc(r1,r3,im)               M3(0x00,LD_NONE,r3,im,r1)
813 #define LD2_inc(r1,r3,im)               M3(0x01,LD_NONE,r3,im,r1)
814 #define LD4_inc(r1,r3,im)               M3(0x02,LD_NONE,r3,im,r1)
815 #define LD8_inc(r1,r3,im)               M3(0x03,LD_NONE,r3,im,r1)
816 #define LD1_S_inc(r1,r3,im)             M3(0x04,LD_NONE,r3,im,r1)
817 #define LD2_S_inc(r1,r3,im)             M3(0x05,LD_NONE,r3,im,r1)
818 #define LD4_S_inc(r1,r3,im)             M3(0x06,LD_NONE,r3,im,r1)
819 #define LD8_S_inc(r1,r3,im)             M3(0x07,LD_NONE,r3,im,r1)
820 #define LD1_A_inc(r1,r3,im)             M3(0x08,LD_NONE,r3,im,r1)
821 #define LD2_A_inc(r1,r3,im)             M3(0x09,LD_NONE,r3,im,r1)
822 #define LD4_A_inc(r1,r3,im)             M3(0x0a,LD_NONE,r3,im,r1)
823 #define LD8_A_inc(r1,r3,im)             M3(0x0b,LD_NONE,r3,im,r1)
824 #define LD1_SA_inc(r1,r3,im)            M3(0x0c,LD_NONE,r3,im,r1)
825 #define LD2_SA_inc(r1,r3,im)            M3(0x0d,LD_NONE,r3,im,r1)
826 #define LD4_SA_inc(r1,r3,im)            M3(0x0e,LD_NONE,r3,im,r1)
827 #define LD8_SA_inc(r1,r3,im)            M3(0x0f,LD_NONE,r3,im,r1)
828 #define LD1_BIAS_inc(r1,r3,im)          M3(0x10,LD_NONE,r3,im,r1)
829 #define LD2_BIAS_inc(r1,r3,im)          M3(0x11,LD_NONE,r3,im,r1)
830 #define LD4_BIAS_inc(r1,r3,im)          M3(0x12,LD_NONE,r3,im,r1)
831 #define LD8_BIAS_inc(r1,r3,im)          M3(0x13,LD_NONE,r3,im,r1)
832 #define LD1_ACQ_inc(r1,r3,im)           M3(0x14,LD_NONE,r3,im,r1)
833 #define LD2_ACQ_inc(r1,r3,im)           M3(0x15,LD_NONE,r3,im,r1)
834 #define LD4_ACQ_inc(r1,r3,im)           M3(0x16,LD_NONE,r3,im,r1)
835 #define LD8_AVQ_inc(r1,r3,im)           M3(0x17,LD_NONE,r3,im,r1)
836 #define LD8_FILL_inc(r1,r3,im)          M3(0x1b,LD_NONE,r3,im,r1)
837 #define LD1_C_CLR_inc(r1,r3,im)         M3(0x20,LD_NONE,r3,im,r1)
838 #define LD2_C_CLR_inc(r1,r3,im)         M3(0x21,LD_NONE,r3,im,r1)
839 #define LD4_C_CLR_inc(r1,r3,im)         M3(0x22,LD_NONE,r3,im,r1)
840 #define LD8_C_CLR_inc(r1,r3,im)         M3(0x23,LD_NONE,r3,im,r1)
841 #define LD1_C_NC_inc(r1,r3,im)          M3(0x24,LD_NONE,r3,im,r1)
842 #define LD2_C_NC_inc(r1,r3,im)          M3(0x25,LD_NONE,r3,im,r1)
843 #define LD4_C_NC_inc(r1,r3,im)          M3(0x26,LD_NONE,r3,im,r1)
844 #define LD8_C_NC_inc(r1,r3,im)          M3(0x27,LD_NONE,r3,im,r1)
845 #define LD1_C_CLR_ACQ_inc(r1,r3,im)     M3(0x28,LD_NONE,r3,im,r1)
846 #define LD2_C_CLR_ACQ_inc(r1,r3,im)     M3(0x29,LD_NONE,r3,im,r1)
847 #define LD4_C_CLR_ACQ_inc(r1,r3,im)     M3(0x2a,LD_NONE,r3,im,r1)
848 #define LD8_C_CLR_ACQ_inc(r1,r3,im)     M3(0x2b,LD_NONE,r3,im,r1)
849 #define LDX1(r1,r3,r2)                  M2(0x00,LD_NONE,r3,r2,r1)
850 #define LDX2(r1,r3,r2)                  M2(0x01,LD_NONE,r3,r2,r1)
851 #define LDX4(r1,r3,r2)                  M2(0x02,LD_NONE,r3,r2,r1)
852 #define LDX8(r1,r3,r2)                  M2(0x03,LD_NONE,r3,r2,r1)
853 #define LDX1_S(r1,r3,r2)                M2(0x04,LD_NONE,r3,r2,r1)
854 #define LDX2_S(r1,r3,r2)                M2(0x05,LD_NONE,r3,r2,r1)
855 #define LDX4_S(r1,r3,r2)                M2(0x06,LD_NONE,r3,r2,r1)
856 #define LDX8_S(r1,r3,r2)                M2(0x07,LD_NONE,r3,r2,r1)
857 #define LDX1_A(r1,r3,r2)                M2(0x08,LD_NONE,r3,r2,r1)
858 #define LDX2_A(r1,r3,r2)                M2(0x09,LD_NONE,r3,r2,r1)
859 #define LDX4_A(r1,r3,r2)                M2(0x0a,LD_NONE,r3,r2,r1)
860 #define LDX8_A(r1,r3,r2)                M2(0x0b,LD_NONE,r3,r2,r1)
861 #define LDX1_SA(r1,r3,r2)               M2(0x0c,LD_NONE,r3,r2,r1)
862 #define LDX2_SA(r1,r3,r2)               M2(0x0d,LD_NONE,r3,r2,r1)
863 #define LDX4_SA(r1,r3,r2)               M2(0x0e,LD_NONE,r3,r2,r1)
864 #define LDX8_SA(r1,r3,r2)               M2(0x0f,LD_NONE,r3,r2,r1)
865 #define LDX1_BIAS(r1,r3,r2)             M2(0x10,LD_NONE,r3,r2,r1)
866 #define LDX2_BIAS(r1,r3,r2)             M2(0x11,LD_NONE,r3,r2,r1)
867 #define LDX4_BIAS(r1,r3,r2)             M2(0x12,LD_NONE,r3,r2,r1)
868 #define LDX8_BIAS(r1,r3,r2)             M2(0x13,LD_NONE,r3,r2,r1)
869 #define LDX1_ACQ(r1,r3,r2)              M2(0x14,LD_NONE,r3,r2,r1)
870 #define LDX2_ACQ(r1,r3,r2)              M2(0x15,LD_NONE,r3,r2,r1)
871 #define LDX4_ACQ(r1,r3,r2)              M2(0x16,LD_NONE,r3,r2,r1)
872 #define LDX8_ACQ(r1,r3,r2)              M2(0x17,LD_NONE,r3,r2,r1)
873 #define LDX8_FILL(r1,r3,r2)             M2(0x1b,LD_NONE,r3,r2,r1)
874 #define LDX1_C_CLR(r1,r3,r2)            M2(0x20,LD_NONE,r3,r2,r1)
875 #define LDX2_C_CLR(r1,r3,r2)            M2(0x21,LD_NONE,r3,r2,r1)
876 #define LDX4_C_CLR(r1,r3,r2)            M2(0x22,LD_NONE,r3,r2,r1)
877 #define LDX8_C_CLR(r1,r3,r2)            M2(0x23,LD_NONE,r3,r2,r1)
878 #define LDX1_C_NC(r1,r3,r2)             M2(0x24,LD_NONE,r3,r2,r1)
879 #define LDX2_C_NC(r1,r3,r2)             M2(0x25,LD_NONE,r3,r2,r1)
880 #define LDX4_C_NC(r1,r3,r2)             M2(0x26,LD_NONE,r3,r2,r1)
881 #define LDX8_C_NC(r1,r3,r2)             M2(0x27,LD_NONE,r3,r2,r1)
882 #define LDX1_C_CLR_ACQ(r1,r3,r2)        M2(0x28,LD_NONE,r3,r2,r1)
883 #define LDX2_C_CLR_ACQ(r1,r3,r2)        M2(0x29,LD_NONE,r3,r2,r1)
884 #define LDX4_C_CLR_ACQ(r1,r3,r2)        M2(0x2a,LD_NONE,r3,r2,r1)
885 #define LDX8_C_CLR_ACQ(r1,r3,r2)        M2(0x2b,LD_NONE,r3,r2,r1)
886 /* lfetch */
887 #define LFETCH_EXCL(r3)                 M13(0x2d,LF_NONE,r3,GR_0)
888 #define LFETCH_FAULT(r3)                M13(0x2e,LF_NONE,r3,GR_0)
889 #define LFETCH_FAULT_EXCL(r3)           M13(0x2f,LF_NONE,r3,GR_0)
890 #define LXFETCH(r3,r2)                  M14(0x2c,LF_NONE,r3,r2)
891 #define LXFETCH_EXCL(r3,r2)             M14(0x2d,LF_NONE,r3,r2)
892 #define LXFETCH_FAULT(r3,r2)            M14(0x2e,LF_NONE,r3,r2)
893 #define LXFETCH_FAULT_EXCL(r3,r2)       M14(0x2f,LF_NONE,r3,r2)
894 #define LFETCHI(r3,im)                  M15(0x2c,LF_NONE,r3,im)
895 #define LFETCHI_EXCL(r3,im)             M15(0x2d,LF_NONE,r3,im)
896 #define LFETCHI_FAULT(r3,im)            M15(0x2e,LF_NONE,r3,im)
897 #define LFETCHI_FAULT_EXCL(r3,im)       M15(0x2f,LF_NONE,r3,im)
898 /* loadrs */
899 #define LOADRS()                        M25(0xa)
900 /* mf */
901 #define MF()                            M24(2,2)
902 #define MF_A()                          M24(2,3)
903 /* mix */
904 #define MIX1_R(r1,r2,r3)                I2(0,2,0,2,0,r3,r2,r1)
905 #define MIX2_R(r1,r2,r3)                I2(0,2,1,2,0,r3,r2,r1)
906 #define MIX4_R(r1,r2,r3)                I2(1,2,0,2,0,r3,r2,r1)
907 #define MIX1_L(r1,r2,r3)                I2(0,2,0,2,2,r3,r2,r1)
908 #define MIX2_L(r1,r2,r3)                I2(0,2,1,2,2,r3,r2,r1)
909 #define MIX4_L(r1,r2,r3)                I2(1,2,0,2,2,r3,r2,r1)
910 /* mov - Move Application Register */
911 #define MOV_I_rn_ar(r1,ar)              I28(ar,r1)
912 #define MOV_I_ar_rn(ar,r2)              I26(ar,r2)
913 #define MOV_I_ar_im(ar,im)              I27(ar,im)
914 #define MOV_M_rn_a(r1,ar)               M31(r1,ar)
915 #define MOV_M_ar_rn(ar,r2)              M29(ar,r2)
916 #define MOV_M_ar_im(ar,im)              M30(ar,im)
917 /* mov - Move Branch Register */
918 #define MOV_rn_br(r1,b2)                I22(b2,r1)
919 #define MOV_br_rn_tg(b1,r2,tag)         I21(tag,IH_NONE,0,MWH_NONE,r2,b1)
920 #define MOV_br_rn(b1,r2)                MOV_br_rn_tg(b1,r2,0)
921 #define MOV_RET_br_rn_tg(b1,r2,tag)     I21(tag,IH_NONE,1,MWH_NONE,r2,b1)
922 /* mov - Move Control Register */
923 #define MOV_rn_cr(cr,r1)                M33(cr,r1)
924 #define MOV_cr_rr(cr,r2)                M32(cr,r2)
925 /* mov - Move General Register */
926 #define MOV(r0,r1)                      ADDS(r0,0,r1)
927 #define MOV_p(r0,r1,_p)                 ADDS_p(r0,0,r1,_p)
928 /* mov - Move Immediate */
929 #define MOVI(r1,im)                     ADDL(r1,im,GR_0)
930 #define MOVI_p(r1,im,_p)                ADDL_p(r1,im,GR_0,_p)
931 /* mov - Move Indirect Register */
932 #define MOV_rn_RR(r1,r3)                M43(0x10,r3,r1)
933 #define MOV_rn_DBR(r1,r3)               M43(0x11,r3,r1)
934 #define MOV_rn_IBR(r1,r3)               M43(0x012,r3,r1)
935 #define MOV_rn_PKR(r1,r3)               M43(0x13,r3,r1)
936 #define MOV_rn_PMC(r1,r3)               M43(0x14,r3,r1)
937 #define MOV_rn_PMD(r1,r3)               M43(0x15,r3,r1)
938 #define MOV_rn_CPUID(r1,r3)             M43(0x17,r3,r1)
939 #define MOV_RR_rn(r3,r2)                M42(0x00,r3,r2)
940 #define MOV_DBR_rn(r3,r2)               M42(0x01,r3,r2)
941 #define MOV_IBR_rn(r3,r2)               M42(0x02,r3,r2)
942 #define MOV_PKR_rn(r3,r2)               M42(0x03,r3,r2)
943 #define MOV_PMC_rn(r3,r2)               M42(0x04,r3,r2)
944 #define MOV_PMD_rn(r3,r2)               M42(0x05,r3,r2)
945 /* mov - Move Instruction Pointer */
946 #define MOV_rn_ip(r1)                   I25(0x30,r1)
947 /* mov - Move Predicates */
948 #define MOV_rn_pr(r1)                   I25(0x33,r1)
949 #define MOV_pr_rn(r2,im)                I23(r2,im)
950 #define MOVI_pr(im)                     I24(im)
951 /* mov - Move Processor Status Register */
952 #define MOV_rn_psr(r1)                  M36(0x25,r1)
953 #define MOV_psr_l_rn(r2)                M35(0x2d,r2)
954 /* mov - Move User Mask */
955 #define MOV_rn_psr_um(r1)               M36(0x21,r1)
956 #define MOV_psr_um_rn(r2)               M35(0x29,r2)
957 /* movl */
958 #define MOVL(r1,im)                     X2(r1,im)
959 /* mpy4 */
960 #define MPY4(r1,r2,r3)                  I2(1,0,0,3,1,r3,r2,r1)
961 /* mpyshl4 */
962 #define MPYSHL4(r1,r2,r3)               I2(1,0,0,3,3,r3,r2,r1)
963 /* mux */
964 #define MUX1(r1,r2,mbt)                 I3(mbt,r2,r1)
965 #define MUX2(r1,r2,mht)                 I4(mht,r2,r1)
966 /* nop */
967 #define NOP_I(im)                       I18(im,0)
968 #define NOP_M(im)                       M48(0,im)
969 #define NOP_B(im)                       B9(2,0,im)
970 #define NOP_X(im)                       X5(0,im)
971 /* or */
972 #define OR(r1,r2,r3)                    A1(3,2,r3,r2,r1)
973 #define ORI(r1,im,r3)                   A3(0xb,2,r3,im,r1)
974 /* pack */
975 #define PACK2_USS(r1,r2,r3)             I2(0,2,1,0,0,r3,r2,r1)
976 #define PACK2_SSS(r1,r2,r3)             I2(0,2,1,0,2,r3,r2,r1)
977 #define PACK4_SSS(r1,r2,r3)             I2(1,2,0,0,2,r3,r2,r1)
978 /* padd */
979 #define PADD1(r1,r2,r3)                 A9(0,0,0,0,r3,r2,r1)
980 #define PADD1_SSS(r1,r2,r3)             A9(0,0,0,1,r3,r2,r1)
981 #define PADD1_UUU(r1,r2,r3)             A9(0,0,0,2,r3,r2,r1)
982 #define PADD1_UUS(r1,r2,r3)             A9(0,0,0,3,r3,r2,r1)
983 #define PADD2(r1,r2,r3)                 A9(0,1,0,0,r3,r2,r1)
984 #define PADD2_SSS(r1,r2,r3)             A9(0,1,0,1,r3,r2,r1)
985 #define PADD2_UUU(r1,r2,r3)             A9(0,1,0,2,r3,r2,r1)
986 #define PADD2_UUS(r1,r2,r3)             A9(0,1,0,3,r3,r2,r1)
987 #define PADD4(r1,r2,r3)                 A9(1,0,0,0,r3,r2,r1)
988 /* pavg */
989 #define PAVG1(r1,r2,r3)                 A9(0,0,2,2,r3,r2,r1)
990 #define PAVG2(r1,r2,r3)                 A9(0,1,2,2,r3,r2,r1)
991 #define PAVG1_RAZ(r1,r2,r3)             A9(0,0,2,3,r3,r2,r1)
992 #define PAVG2_RAZ(r1,r2,r3)             A9(0,1,2,3,r3,r2,r1)
993 /* pavgsub */
994 #define PAVGSUB1(r1,r2,r3)              A9(0,0,3,2,r3,r2,r1)
995 #define PAVGSUB2(r1,r2,r3)              A9(0,1,3,2,r3,r2,r1)
996 /* pcmp */
997 #define PCMP1_EQ(r1,r2,r3)              A9(0,0,9,0,r3,r2,r1)
998 #define PCMP2_EQ(r1,r2,r3)              A9(0,1,9,0,r3,r2,r1)
999 #define PCMP4_EQ(r1,r2,r3)              A9(1,0,9,0,r3,r2,r1)
1000 #define PCMP1_GT(r1,r2,r3)              A9(0,0,9,1,r3,r2,r1)
1001 #define PCMP2_GT(r1,r2,r3)              A9(0,1,9,1,r3,r2,r1)
1002 #define PCMP4_GT(r1,r2,r3)              A9(1,0,9,1,r3,r2,r1)
1003 /* pmax */
1004 #define PMAX1_U(r1,r2,r3)               I2(0,2,0,1,1,r3,r2,r1)
1005 #define PMAX2(r1,r2,r3)                 I2(0,2,1,1,3,r3,r2,r1)
1006 /* pmin */
1007 #define PMIN1_U(r1,r2,r3)               I2(0,2,0,0,1,r3,r2,r1)
1008 #define PMIN2(r1,r2,r3)                 I2(0,2,1,0,3,r3,r2,r1)
1009 /* pmpy */
1010 #define PMPY2_R(r1,r2,r3)               I2(0,2,1,3,1,r3,r2,r1)
1011 #define PMPY2_L(r1,r2,r3)               I2(0,2,1,3,3,r3,r2,r1)
1012 /* pmpyshr */
1013 #define PMPYSHR2(r1,r2,r3,im)           I1(im,3,r3,r2,r1)
1014 #define PMPYSHR2_U(r1,r2,r3,im)         I1(im,1,r3,r2,r1)
1015 /* popcnt */
1016 #define POPCNT(r1,r3)                   I9(2,r3,r1)
1017 /* probe */
1018 #define PROBE_R(r1,r3,r2)               M38(0x38,r3,r2,r1)
1019 #define PROBE_W(r1,r3,r2)               M38(0x39,r3,r2,r1)
1020 #define PROBEI_R(r1,r3,im)              M39(0x18,r3,im,r1)
1021 #define PROBEI_W(r1,r3,im)              M39(0x19,r3,im,r1)
1022 #define PROBE_RW_FAULT(r3,im)           M40(0x31,r3,im)
1023 #define PROBE_R_FAULT(r3,im)            M40(0x32,r3,im)
1024 #define PROBE_W_FAULT(r3,im)            M40(0x33,r3,im)
1025 /* psad */
1026 #define PSAD1(r1,r2,r3)                 I2(0,2,0,2,3,r3,r2,r1)
1027 /* pshl */
1028 #define PSHL2(r1,r2,r3)                 I7(0,1,r3,r2,r1)
1029 #define PSHL4(r1,r2,r3)                 I7(1,0,r3,r2,r1)
1030 #define PSHL2I(r1,r2,im)                I8(0,1,im,r2,r1)
1031 #define PSHL4I(r1,r2,im)                I8(1,0,im,r2,r1)
1032 /* pshladd */
1033 #define PSHLADD2(r1,r2,im,r3)           A10(4,im,r3,r2,r1)
1034 /* pshr */
1035 #define PSHR2(r1,r3,r2)                 I5(0,1,2,r3,r2,r1)
1036 #define PSHR2I(r1,r3,im)                I6(0,1,3,r3,im,r1)
1037 #define PSHR2_U(r1,r3,r2)               I5(0,1,0,r3,r2,r1)
1038 #define PSHR2I_U(r1,r3,im)              I6(0,1,1,r3,im,r1)
1039 #define PSHR4(r1,r3,r2)                 I5(1,0,2,r3,r2,r1)
1040 #define PSHR4I(r1,r3,im)                I6(1,0,3,r3,im,r1)
1041 #define PSHR4_U(r1,r3,r2)               I5(1,0,0,r3,r2,r1)
1042 #define PSHR4I_U(r1,r3,im)              I6(1,0,1,r3,im,r1)
1043 /* pshradd */
1044 #define PSHRADD2(r1,r2,im,r3)           A10(6,im,r3,r2,r1)
1045 /* psub */
1046 #define PSUB1(r1,r2,r3)                 A9(0,0,1,0,r3,r2,r1)
1047 #define PSUB1_SSS(r1,r2,r3)             A9(0,0,1,1,r3,r2,r1)
1048 #define PSUB1_UUU(r1,r2,r3)             A9(0,0,1,2,r3,r2,r1)
1049 #define PSUB1_UUS(r1,r2,r3)             A9(0,0,1,3,r3,r2,r1)
1050 #define PSUB2(r1,r2,r3)                 A9(0,1,1,0,r3,r2,r1)
1051 #define PSUB2_SSS(r1,r2,r3)             A9(0,1,1,1,r3,r2,r1)
1052 #define PSUB2_UUU(r1,r2,r3)             A9(0,1,1,2,r3,r2,r1)
1053 #define PSUB2_UUS(r1,r2,r3)             A9(0,1,1,3,r3,r2,r1)
1054 #define PSUB4(r1,r2,r3)                 A9(1,0,1,0,r3,r2,r1)
1055 /* ptc.e */
1056 #define PTC_E(r3)                       M47(0x34,r3)
1057 /* ptc.g, ptc.ga */
1058 #define PTC_G(r3,r2)                    M45(0xa,r3,r2)
1059 #define PTC_GA(r3,r2)                   M45(0xb,r3,r2)
1060 /* ptc.l */
1061 #define PTC_L(r3,r2)                    M45(0x9,r3,r2)
1062 /* ptr */
1063 #define PTR_D(r3,r2)                    M45(0xc,r3,r2)
1064 #define PTR_I(r3,r2)                    M45(0xd,r3,r2)
1065 /* rfi */
1066 #define RFI()                           B8(0x08)
1067 /* rsm */
1068 #define RSM(im)                         M44(7,im)
1069 /* rum */
1070 #define RUM(im)                         M44(5,im)
1071 /* shl */
1072 #define SHL(r1,r2,r3)                   I7(1,1,r3,r2,r1)
1073 /* shladd */
1074 #define SHLADD(r1,r2,im,r3)             A2(4,im,r3,r2,r1)
1075 /* shladdp4 */
1076 #define SHLADDP4(r1,r2,im,r3)           A2(6,im,r3,r2,r1)
1077 /* shr */
1078 #define SHR(r1,r3,r2)                   I5(1,1,2,r3,r2,r1)
1079 #define SHR_U(r1,r3,r2)                 I5(1,1,0,r3,r2,r1)
1080 /* shrp */
1081 #define SHRP(r1,r2,r3,im)               I10(im,r3,r2,r1)
1082 /* srlz */
1083 #define SRLZ_I()                        M24(3,1)
1084 #define SRLZ_D()                        M24(3,0)
1085 /* ssm */
1086 #define SSM(im)                         M44(6,im)
1087 /* st */
1088 #define ST1(r3,r2)                      M6(0x30,ST_NONE,0,r3,r2)
1089 #define ST2(r3,r2)                      M6(0x31,ST_NONE,0,r3,r2)
1090 #define ST4(r3,r2)                      M6(0x32,ST_NONE,0,r3,r2)
1091 #define ST8(r3,r2)                      M6(0x33,ST_NONE,0,r3,r2)
1092 #define ST1_REL(r3,r2)                  M6(0x34,ST_NONE,0,r3,r2)
1093 #define ST2_REL(r3,r2)                  M6(0x35,ST_NONE,0,r3,r2)
1094 #define ST4_REL(r3,r2)                  M6(0x36,ST_NONE,0,r3,r2)
1095 #define ST8_REL(r3,r2)                  M6(0x37,ST_NONE,0,r3,r2)
1096 #define ST8_SPILL(r3,r2)                M6(0x3b,ST_NONE,0,r3,r2)
1097 #define ST16(r3,r2)                     M6(0x30,ST_NONE,1,r3,r2)
1098 #define ST16_REL(r3,r2)                 M6(0x34,ST_NONE,1,r3,r2)
1099 #define ST1_inc(r3,r2,im)               M5(0x30,ST_NONE,r3,r2,im)
1100 #define ST2_inc(r3,r2,im)               M5(0x31,ST_NONE,r3,r2,im)
1101 #define ST4_inc(r3,r2,im)               M5(0x32,ST_NONE,r3,r2,im)
1102 #define ST8_inc(r3,r2,im)               M5(0x33,ST_NONE,r3,r2,im)
1103 #define ST1_REL_inc(r3,r2,im)           M5(0x34,ST_NONE,r3,r2,im)
1104 #define ST2_REL_inc(r3,r2,im)           M5(0x35,ST_NONE,r3,r2,im)
1105 #define ST4_REL_inc(r3,r2,im)           M5(0x36,ST_NONE,r3,r2,im)
1106 #define ST8_REL_inc(r3,r2,im)           M5(0x37,ST_NONE,r3,r2,im)
1107 #define ST8_SPILL_inc(r3,r2,im)         M5(0x3b,ST_NONE,r3,r2,im)
1108 /* sub */
1109 #define SUB(r1,r2,r3)                   A1(1,1,r3,r2,r1)
1110 #define SUB1(r1,r2,r3)                  A1(1,0,r3,r2,r1)
1111 #define SUBI(r1,im,r3)                  A3(9,1,r3,im,r1)
1112 /* sum */
1113 #define SUM(im)                         M44(4,im)
1114 /* sxt */
1115 #define SXT1(r1,r3)                     I29(0x14,r3,r1)
1116 #define SXT2(r1,r3)                     I29(0x15,r3,r1)
1117 #define SXT4(r1,r3)                     I29(0x16,r3,r1)
1118 /* sync */
1119 #define SYNC_I()                        M24(3,3)
1120 /* tak */
1121 #define TAK(r1,r3)                      M46(0x1f,r3,r1)
1122 /* tbit */
1123 #define TBIT_Z(p1,p2,r3,pos)            I16(0,0,p2,r3,pos,0,p1)
1124 #define TBIT_Z_UNC(p1,p2,r3,pos)        I16(0,0,p2,r3,pos,1,p1)
1125 #define TBIT_Z_AND(p1,p2,r3,pos)        I16(1,0,p2,r3,pos,0,p1)
1126 #define TBIT_NZ_AND(p1,p2,r3,pos)       I16(1,0,p2,r3,pos,1,p1)
1127 #define TBIT_Z_OR(p1,p2,r3,pos)         I16(0,1,p2,r3,pos,0,p1)
1128 #define TBIT_NZ_OR(p1,p2,r3,pos)        I16(0,1,p2,r3,pos,1,p1)
1129 #define TBIT_Z_ANDCM(p1,p2,r3,pos)      I16(1,1,p2,r3,pos,0,p1)
1130 #define TBIT_NZ_ANDCM(p1,p2,r3,pos)     I16(1,1,p2,r3,pos,1,p1)
1131 /* tf */
1132 #define TF_Z(p1,p2,im)                  I30(0,0,p2,im,0,p1)
1133 #define TF_Z_UNC(p1,p2,im)              I30(0,0,p2,im,1,p1)
1134 #define TF_Z_AND(p1,p2,im)              I30(1,0,p2,im,0,p1)
1135 #define TF_NZ_AND(p1,p2,im)             I30(1,0,p2,im,1,p1)
1136 #define TF_Z_OR(p1,p2,im)               I30(0,1,p2,im,0,p1)
1137 #define TF_NZ_OR(p1,p2,im)              I30(0,1,p2,im,1,p1)
1138 #define TF_Z_ANDCM(p1,p2,im)            I30(1,1,p2,im,0,p1)
1139 #define TF_NZ_ANDCM(p1,p2,im)           I30(1,1,p2,im,1,p1)
1140 /* thash */
1141 #define THASH(r1,r3)                    M46(0x1a,r3,r1)
1142 /* tnat */
1143 #define TNAT_Z(p1,p2,r3)                I17(0,0,p2,r3,0,p1)
1144 #define TNAT_Z_UNC(p1,p2,r3)            I17(0,0,p2,r3,1,p1)
1145 #define TNAT_Z_AND(p1,p2,r3)            I17(1,0,p2,r3,0,p1)
1146 #define TNAT_NZ_AND(p1,p2,r3)           I17(1,0,p2,r3,1,p1)
1147 #define TNAT_Z_OR(p1,p2,r3)             I17(0,1,p2,r3,0,p1)
1148 #define TNAT_NZ_OR(p1,p2,r3)            I17(0,1,p2,r3,1,p1)
1149 #define TNAT_Z_ANDCM(p1,p2,r3)          I17(1,1,p2,r3,0,p1)
1150 #define TNAT_NZ_ANDCM(p1,p2,r3)         I17(1,1,p2,r3,1,p1)
1151 /* tpa */
1152 #define TPA(r1,r3)                      M46(0x1e,r3,r1)
1153 /* ttag */
1154 #define TTAG(r1,r3)                     M46(0x1b,r3,r1)
1155 /* unpack */
1156 #define UNPACK1_H(r1,r2,r3)             I2(0,2,0,1,0,r3,r2,r1)
1157 #define UNPACK2_H(r1,r2,r3)             I2(0,2,1,1,0,r3,r2,r1)
1158 #define UNPACK4_H(r1,r2,r3)             I2(1,2,0,1,0,r3,r2,r1)
1159 #define UNPACK1_L(r1,r2,r3)             I2(0,2,0,1,2,r3,r2,r1)
1160 #define UNPACK2_L(r1,r2,r3)             I2(0,2,1,1,2,r3,r2,r1)
1161 #define UNPACK4_L(r1,r2,r3)             I2(1,2,0,1,2,r3,r2,r1)
1162 /* vmsw */
1163 #define VMSW_0()                        B8(0x18)
1164 #define VMSW_1()                        B8(0x19)
1165 /* xchg */
1166 #define XCHG1_ACQ(r1,r3,r2)             M16(0x08,LD_NONE,r3,r2,r1)
1167 #define XCHG2_ACQ(r1,r3,r2)             M16(0x09,LD_NONE,r3,r2,r1)
1168 #define XCHG4_ACQ(r1,r3,r2)             M16(0x0a,LD_NONE,r3,r2,r1)
1169 #define XCHG8_ACQ(r1,r3,r2)             M16(0x0b,LD_NONE,r3,r2,r1)
1170 /* xor */
1171 #define XOR(r1,r2,r3)                   A1(3,3,r3,r2,r1)
1172 #define XORI(r1,im,r3)                  A3(0xb,3,r3,im,r1)
1173 /* zxt */
1174 #define ZXT1(r1,r3)                     I29(0x10,r3,r1)
1175 #define ZXT2(r1,r3)                     I29(0x11,r3,r1)
1176 #define ZXT4(r1,r3)                     I29(0x12,r3,r1)
1177
1178 #define addr(r0,r1,r2)                  ADD(r0,r1,r2)
1179 #define addi(r0,r1,i0)                  _addi(_jit,r0,r1,i0)
1180 static void _addi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
1181 #define addcr(r0, r1, r2)               _addcr(_jit, r0, r1, r2)
1182 static void _addcr(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
1183 #define addci(r0, r1, i0)               _addci(_jit, r0, r1, i0)
1184 static void _addci(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
1185 #  define addxr(r0, r1, r2)             _addxr(_jit, r0, r1, r2)
1186 static void _addxr(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
1187 #  define addxi(r0, r1, i0)             _addxi(_jit, r0, r1, i0)
1188 static void _addxi(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
1189 #define subr(r0,r1,r2)                  SUB(r0,r1,r2)
1190 #define subi(r0,r1,i0)                  _subi(_jit,r0,r1,i0)
1191 static void _subi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
1192 #  define subcr(r0, r1, r2)             _subcr(_jit, r0, r1, r2)
1193 static void _subcr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
1194 #  define subci(r0, r1, i0)             _subci(_jit, r0, r1, i0)
1195 static void _subci(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
1196 #  define subxr(r0, r1, r2)             _subxr(_jit, r0, r1, r2)
1197 static void _subxr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
1198 #  define subxi(r0, r1, i0)             _subxi(_jit, r0, r1, i0)
1199 static void _subxi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
1200 #  define rsbi(r0, r1, i0)              _rsbi(_jit, r0, r1, i0)
1201 static void _rsbi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
1202 #define mulr(r0,r1,r2)                  _mulr(_jit,r0,r1,r2)
1203 static void _mulr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
1204 #define muli(r0,r1,i0)                  _muli(_jit,r0,r1,i0)
1205 static void _muli(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
1206 #define divr(r0,r1,r2)                  _divr(_jit,r0,r1,r2)
1207 static void _divr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
1208 #define divi(r0,r1,i0)                  _divi(_jit,r0,r1,i0)
1209 static void _divi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
1210 #define divr_u(r0,r1,r2)                _divr_u(_jit,r0,r1,r2)
1211 static void _divr_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
1212 #define divi_u(r0,r1,i0)                _divi_u(_jit,r0,r1,i0)
1213 static void _divi_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
1214 #define remr(r0,r1,r2)                  _remr(_jit,r0,r1,r2)
1215 static void _remr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
1216 #define remi(r0,r1,i0)                  _remi(_jit,r0,r1,i0)
1217 static void _remi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
1218 #define remr_u(r0,r1,r2)                _remr_u(_jit,r0,r1,r2)
1219 static void _remr_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
1220 #define remi_u(r0,r1,i0)                _remi_u(_jit,r0,r1,i0)
1221 static void _remi_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
1222 #define mulh(r0,r1,r2,sign)             _mulh(_jit,r0,r1,r2,sign)
1223 static void _mulh(jit_state_t*,jit_bool_t,jit_int32_t,jit_int32_t,jit_int32_t);
1224 #define qmulr(r0,r1,r2,r3)              iqmulr(r0,r1,r2,r3,1)
1225 #define qmulr_u(r0,r1,r2,r3)            iqmulr(r0,r1,r2,r3,0)
1226 #define iqmulr(r0,r1,r2,r3,sign)        _iqmulr(_jit,r0,r1,r2,r3,sign)
1227 static void _iqmulr(jit_state_t*,jit_int32_t,jit_int32_t,
1228                     jit_int32_t,jit_int32_t,jit_bool_t);
1229 #define qmuli(r0,r1,r2,i0)              iqmuli(r0,r1,r2,i0,1)
1230 #define qmuli_u(r0,r1,r2,i0)            iqmuli(r0,r1,r2,i0,0)
1231 #define iqmuli(r0,r1,r2,i0,sign)        _iqmuli(_jit,r0,r1,r2,i0,sign)
1232 static void _iqmuli(jit_state_t*,jit_int32_t,jit_int32_t,
1233                     jit_int32_t,jit_word_t,jit_bool_t);
1234 #define qdivr(r0,r1,r2,r3)              iqdivr(r0,r1,r2,r3,1)
1235 #define qdivr_u(r0,r1,r2,r3)            iqdivr(r0,r1,r2,r3,0)
1236 #define iqdivr(r0,r1,r2,r3,sign)        _iqdivr(_jit,r0,r1,r2,r3,sign)
1237 static void _iqdivr(jit_state_t*,jit_int32_t,jit_int32_t,
1238                     jit_int32_t,jit_int32_t,jit_bool_t);
1239 #define qdivi(r0,r1,r2,i0)              iqdivi(r0,r1,r2,i0,1)
1240 #define qdivi_u(r0,r1,r2,i0)            iqdivi(r0,r1,r2,i0,0)
1241 #define iqdivi(r0,r1,r2,i0,sign)        _iqdivi(_jit,r0,r1,r2,i0,sign)
1242 static void _iqdivi(jit_state_t*,jit_int32_t,jit_int32_t,
1243                     jit_int32_t,jit_word_t,jit_bool_t);
1244 #define andr(r0,r1,r2)                  AND(r0,r1,r2)
1245 #define andi(r0,r1,i0)                  _andi(_jit,r0,r1,i0)
1246 static void _andi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
1247 #define orr(r0,r1,r2)                   OR(r0,r1,r2)
1248 #define ori(r0,r1,i0)                   _ori(_jit,r0,r1,i0)
1249 static void _ori(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
1250 #define xorr(r0,r1,r2)                  XOR(r0,r1,r2)
1251 #define xori(r0,r1,i0)                  _xori(_jit,r0,r1,i0)
1252 static void _xori(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
1253 #define lshr(r0,r1,r2)                  SHL(r0,r1,r2)
1254 #define lshi(r0,r1,i0)                  _lshi(_jit,r0,r1,i0)
1255 static void _lshi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
1256 #define rshr(r0,r1,r2)                  SHR(r0,r1,r2)
1257 #define rshi(r0,r1,i0)                  _rshi(_jit,r0,r1,i0)
1258 static void _rshi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
1259 #define rshr_u(r0,r1,r2)                SHR_U(r0,r1,r2)
1260 #define rshi_u(r0,r1,i0)                _rshi_u(_jit,r0,r1,i0)
1261 static void _rshi_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
1262 #define ltr(r0,r1,r2)                   _ltr(_jit,r0,r1,r2)
1263 static void _ltr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
1264 #define lti(r0,r1,i0)                   _lti(_jit,r0,r1,i0)
1265 static void _lti(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
1266 #define ltr_u(r0,r1,r2)                 _ltr_u(_jit,r0,r1,r2)
1267 static void _ltr_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
1268 #define lti_u(r0,r1,i0)                 _lti_u(_jit,r0,r1,i0)
1269 static void _lti_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
1270 #define ler(r0,r1,r2)                   _ler(_jit,r0,r1,r2)
1271 static void _ler(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
1272 #define lei(r0,r1,i0)                   _lei(_jit,r0,r1,i0)
1273 static void _lei(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
1274 #define ler_u(r0,r1,r2)                 _ler_u(_jit,r0,r1,r2)
1275 static void _ler_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
1276 #define lei_u(r0,r1,i0)                 _lei_u(_jit,r0,r1,i0)
1277 static void _lei_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
1278 #define eqr(r0,r1,r2)                   _eqr(_jit,r0,r1,r2)
1279 static void _eqr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
1280 #define eqi(r0,r1,i0)                   _eqi(_jit,r0,r1,i0)
1281 static void _eqi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
1282 #define ger(r0,r1,r2)                   _ger(_jit,r0,r1,r2)
1283 static void _ger(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
1284 #define gei(r0,r1,i0)                   _gei(_jit,r0,r1,i0)
1285 static void _gei(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
1286 #define ger_u(r0,r1,r2)                 _ger_u(_jit,r0,r1,r2)
1287 static void _ger_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
1288 #define gei_u(r0,r1,i0)                 _gei_u(_jit,r0,r1,i0)
1289 static void _gei_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
1290 #define gtr(r0,r1,r2)                   _gtr(_jit,r0,r1,r2)
1291 static void _gtr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
1292 #define gti(r0,r1,i0)                   _gti(_jit,r0,r1,i0)
1293 static void _gti(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
1294 #define gtr_u(r0,r1,r2)                 _gtr_u(_jit,r0,r1,r2)
1295 static void _gtr_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
1296 #define gti_u(r0,r1,i0)                 _gti_u(_jit,r0,r1,i0)
1297 static void _gti_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
1298 #define ner(r0,r1,r2)                   _ner(_jit,r0,r1,r2)
1299 static void _ner(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
1300 #define nei(r0,r1,i0)                   _nei(_jit,r0,r1,i0)
1301 static void _nei(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
1302 #define negr(r0,r1)                     subr(r0,0,r1)
1303 #define comr(r0,r1)                     ANDCMI(r0,-1,r1)
1304 #define movr(r0,r1)                     _movr(_jit,r0,r1)
1305 static void _movr(jit_state_t*,jit_int32_t,jit_int32_t);
1306 #define movi(r0,i0)                     _movi(_jit,r0,i0)
1307 static void _movi(jit_state_t*,jit_int32_t,jit_word_t);
1308 #define movi_p(r0,i0)                   _movi_p(_jit,r0,i0)
1309 static jit_word_t _movi_p(jit_state_t*,jit_int32_t,jit_word_t);
1310 #  define movnr(r0,r1,r2)               _movnr(_jit,r0,r1,r2)
1311 static void _movnr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
1312 #  define movzr(r0,r1,r2)               _movzr(_jit,r0,r1,r2)
1313 static void _movzr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
1314 #  define bswapr_us(r0,r1)              _bswapr_us(_jit,r0,r1)
1315 static void _bswapr_us(jit_state_t*,jit_int32_t,jit_int32_t);
1316 #  define bswapr_ui(r0,r1)              _bswapr_ui(_jit,r0,r1)
1317 static void _bswapr_ui(jit_state_t*,jit_int32_t,jit_int32_t);
1318 #  define bswapr_ul(r0,r1)              MUX1(r0,r1,MUX_REV)
1319 #define extr_c(r0,r1)                   SXT1(r0,r1)
1320 #define extr_uc(r0,r1)                  ZXT1(r0,r1)
1321 #define extr_s(r0,r1)                   SXT2(r0,r1)
1322 #define extr_us(r0,r1)                  ZXT2(r0,r1)
1323 #define extr_i(r0,r1)                   SXT4(r0,r1)
1324 #define extr_ui(r0,r1)                  ZXT4(r0,r1)
1325 #define bltr(i0,r0,r1)                  _bltr(_jit,i0,r0,r1)
1326 static jit_word_t _bltr(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
1327 #define blti(i0,r0,i1)                  _blti(_jit,i0,r0,i1)
1328 static jit_word_t _blti(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
1329 #define bltr_u(i0,r0,r1)                _bltr_u(_jit,i0,r0,r1)
1330 static jit_word_t _bltr_u(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
1331 #define blti_u(i0,r0,i1)                _blti_u(_jit,i0,r0,i1)
1332 static jit_word_t _blti_u(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
1333 #define bler(i0,r0,r1)                  _bler(_jit,i0,r0,r1)
1334 static jit_word_t _bler(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
1335 #define blei(i0,r0,i1)                  _blei(_jit,i0,r0,i1)
1336 static jit_word_t _blei(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
1337 #define bler_u(i0,r0,r1)                _bler_u(_jit,i0,r0,r1)
1338 static jit_word_t _bler_u(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
1339 #define blei_u(i0,r0,i1)                _blei_u(_jit,i0,r0,i1)
1340 static jit_word_t _blei_u(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
1341 #define beqr(i0,r0,r1)                  _beqr(_jit,i0,r0,r1)
1342 static jit_word_t _beqr(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
1343 #define beqi(i0,r0,i1)                  _beqi(_jit,i0,r0,i1)
1344 static jit_word_t _beqi(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
1345 #define bger(i0,r0,r1)                  _bger(_jit,i0,r0,r1)
1346 static jit_word_t _bger(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
1347 #define bgei(i0,r0,i1)                  _bgei(_jit,i0,r0,i1)
1348 static jit_word_t _bgei(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
1349 #define bger_u(i0,r0,r1)                _bger_u(_jit,i0,r0,r1)
1350 static jit_word_t _bger_u(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
1351 #define bgei_u(i0,r0,i1)                _bgei_u(_jit,i0,r0,i1)
1352 static jit_word_t _bgei_u(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
1353 #define bgtr(i0,r0,r1)                  _bgtr(_jit,i0,r0,r1)
1354 static jit_word_t _bgtr(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
1355 #define bgti(i0,r0,i1)                  _bgti(_jit,i0,r0,i1)
1356 static jit_word_t _bgti(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
1357 #define bgtr_u(i0,r0,r1)                _bgtr_u(_jit,i0,r0,r1)
1358 static jit_word_t _bgtr_u(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
1359 #define bgti_u(i0,r0,i1)                _bgti_u(_jit,i0,r0,i1)
1360 static jit_word_t _bgti_u(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
1361 #define bner(i0,r0,r1)                  _bner(_jit,i0,r0,r1)
1362 static jit_word_t _bner(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
1363 #define bnei(i0,r0,i1)                  _bnei(_jit,i0,r0,i1)
1364 static jit_word_t _bnei(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
1365 #define bmsr(i0,r0,r1)                  _bmsr(_jit,i0,r0,r1)
1366 static jit_word_t _bmsr(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
1367 #define bmsi(i0,r0,i1)                  _bmsi(_jit,i0,r0,i1)
1368 static jit_word_t _bmsi(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
1369 #define bmcr(i0,r0,r1)                  _bmcr(_jit,i0,r0,r1)
1370 static jit_word_t _bmcr(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
1371 #define bmci(i0,r0,i1)                  _bmci(_jit,i0,r0,i1)
1372 static jit_word_t _bmci(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
1373 #define baddr(i0,r0,r1,cc)              _baddr(_jit,i0,r0,r1,cc)
1374 static jit_word_t _baddr(jit_state_t*,jit_word_t,
1375                          jit_int32_t,jit_int32_t,jit_bool_t);
1376 #define baddi(i0,r0,i1,cc)              _baddi(_jit,i0,r0,i1,cc)
1377 static jit_word_t _baddi(jit_state_t*,jit_word_t,
1378                          jit_int32_t,jit_word_t,jit_bool_t);
1379 #define baddr_u(i0,r0,r1,cc)            _baddr_u(_jit,i0,r0,r1,cc)
1380 static jit_word_t _baddr_u(jit_state_t*,jit_word_t,
1381                            jit_int32_t,jit_int32_t,jit_bool_t);
1382 #define baddi_u(i0,r0,i1,cc)            _baddi_u(_jit,i0,r0,i1,cc)
1383 static jit_word_t _baddi_u(jit_state_t*,jit_word_t,
1384                            jit_int32_t,jit_word_t,jit_bool_t);
1385 #define bsubr(i0,r0,r1,cc)              _bsubr(_jit,i0,r0,r1,cc)
1386 static jit_word_t _bsubr(jit_state_t*,jit_word_t,
1387                          jit_int32_t,jit_int32_t,jit_bool_t);
1388 #define bsubi(i0,r0,i1,cc)              _bsubi(_jit,i0,r0,i1,cc)
1389 static jit_word_t _bsubi(jit_state_t*,jit_word_t,
1390                          jit_int32_t,jit_word_t,jit_bool_t);
1391 #define bsubr_u(i0,r0,r1,cc)            _bsubr_u(_jit,i0,r0,r1,cc)
1392 static jit_word_t _bsubr_u(jit_state_t*,jit_word_t,
1393                            jit_int32_t,jit_int32_t,jit_bool_t);
1394 #define bsubi_u(i0,r0,i1,cc)            _bsubi_u(_jit,i0,r0,i1,cc)
1395 static jit_word_t _bsubi_u(jit_state_t*,jit_word_t,
1396                            jit_int32_t,jit_word_t,jit_bool_t);
1397 #define boaddr(i0,r0,r1)                baddr(i0,r0,r1,1)
1398 #define boaddi(i0,r0,i1)                baddi(i0,r0,i1,1)
1399 #define boaddr_u(i0,r0,r1)              baddr_u(i0,r0,r1,1)
1400 #define boaddi_u(i0,r0,i1)              baddi_u(i0,r0,i1,1)
1401 #define bxaddr(i0,r0,r1)                baddr(i0,r0,r1,0)
1402 #define bxaddi(i0,r0,i1)                baddi(i0,r0,i1,0)
1403 #define bxaddr_u(i0,r0,r1)              baddr_u(i0,r0,r1,0)
1404 #define bxaddi_u(i0,r0,i1)              baddi_u(i0,r0,i1,0)
1405 #define bosubr(i0,r0,r1)                bsubr(i0,r0,r1,1)
1406 #define bosubi(i0,r0,i1)                bsubi(i0,r0,i1,1)
1407 #define bosubr_u(i0,r0,r1)              bsubr_u(i0,r0,r1,1)
1408 #define bosubi_u(i0,r0,i1)              bsubi_u(i0,r0,i1,1)
1409 #define bxsubr(i0,r0,r1)                bsubr(i0,r0,r1,0)
1410 #define bxsubi(i0,r0,i1)                bsubi(i0,r0,i1,0)
1411 #define bxsubr_u(i0,r0,r1)              bsubr_u(i0,r0,r1,0)
1412 #define bxsubi_u(i0,r0,i1)              bsubi_u(i0,r0,i1,0)
1413 #define ldr_c(r0,r1)                    _ldr_c(_jit,r0,r1)
1414 static void _ldr_c(jit_state_t*,jit_int32_t,jit_int32_t);
1415 #define ldi_c(r0,i0)                    _ldi_c(_jit,r0,i0)
1416 static void _ldi_c(jit_state_t*,jit_int32_t,jit_word_t);
1417 #define ldr_uc(r0,r1)                   LD1(r0,r1)
1418 #define ldi_uc(r0,i0)                   _ldi_uc(_jit,r0,i0)
1419 static void _ldi_uc(jit_state_t*,jit_int32_t,jit_word_t);
1420 #define ldr_s(r0,r1)                    _ldr_s(_jit,r0,r1)
1421 static void _ldr_s(jit_state_t*,jit_int32_t,jit_int32_t);
1422 #define ldi_s(r0,i0)                    _ldi_s(_jit,r0,i0)
1423 static void _ldi_s(jit_state_t*,jit_int32_t,jit_word_t);
1424 #define ldr_us(r0,r1)                   LD2(r0,r1)
1425 #define ldi_us(r0,i0)                   _ldi_us(_jit,r0,i0)
1426 static void _ldi_us(jit_state_t*,jit_int32_t,jit_word_t);
1427 #define ldr_i(r0,r1)                    _ldr_i(_jit,r0,r1)
1428 static void _ldr_i(jit_state_t*,jit_int32_t,jit_int32_t);
1429 #define ldi_i(r0,i0)                    _ldi_i(_jit,r0,i0)
1430 static void _ldi_i(jit_state_t*,jit_int32_t,jit_word_t);
1431 #define ldr_ui(r0,r1)                   LD4(r0,r1)
1432 #define ldi_ui(r0,i0)                   _ldi_ui(_jit,r0,i0)
1433 static void _ldi_ui(jit_state_t*,jit_int32_t,jit_word_t);
1434 #define ldr_l(r0,r1)                    LD8(r0,r1)
1435 #define ldi_l(r0,i0)                    _ldi_l(_jit,r0,i0)
1436 static void _ldi_l(jit_state_t*,jit_int32_t,jit_word_t);
1437 #define ldxr_c(r0,r1,r2)                _ldxr_c(_jit,r0,r1,r2)
1438 static void _ldxr_c(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
1439 #define ldxi_c(r0,r1,i0)                _ldxi_c(_jit,r0,r1,i0)
1440 static void _ldxi_c(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
1441 #define ldxr_uc(r0,r1,r2)               _ldxr_uc(_jit,r0,r1,r2)
1442 static void _ldxr_uc(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
1443 #define ldxi_uc(r0,r1,i0)               _ldxi_uc(_jit,r0,r1,i0)
1444 static void _ldxi_uc(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
1445 #define ldxr_s(r0,r1,r2)                _ldxr_s(_jit,r0,r1,r2)
1446 static void _ldxr_s(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
1447 #define ldxi_s(r0,r1,i0)                _ldxi_s(_jit,r0,r1,i0)
1448 static void _ldxi_s(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
1449 #define ldxr_us(r0,r1,r2)               _ldxr_us(_jit,r0,r1,r2)
1450 static void _ldxr_us(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
1451 #define ldxi_us(r0,r1,i0)               _ldxi_us(_jit,r0,r1,i0)
1452 static void _ldxi_us(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
1453 #define ldxr_i(r0,r1,r2)                _ldxr_i(_jit,r0,r1,r2)
1454 static void _ldxr_i(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
1455 #define ldxi_i(r0,r1,i0)                _ldxi_i(_jit,r0,r1,i0)
1456 static void _ldxi_i(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
1457 #define ldxr_ui(r0,r1,r2)               _ldxr_ui(_jit,r0,r1,r2)
1458 static void _ldxr_ui(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
1459 #define ldxi_ui(r0,r1,i0)               _ldxi_ui(_jit,r0,r1,i0)
1460 static void _ldxi_ui(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
1461 #define ldxr_l(r0,r1,r2)                _ldxr_l(_jit,r0,r1,r2)
1462 static void _ldxr_l(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
1463 #define ldxi_l(r0,r1,i0)                _ldxi_l(_jit,r0,r1,i0)
1464 static void _ldxi_l(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
1465 #define str_c(r0,r1)                    ST1(r0,r1)
1466 #define sti_c(i0,r0)                    _sti_c(_jit,i0,r0)
1467 static void _sti_c(jit_state_t*,jit_word_t,jit_int32_t);
1468 #define str_s(r0,r1)                    ST2(r0,r1)
1469 #define sti_s(i0,r0)                    _sti_s(_jit,i0,r0)
1470 static void _sti_s(jit_state_t*,jit_word_t,jit_int32_t);
1471 #define str_i(r0,r1)                    ST4(r0,r1)
1472 #define sti_i(i0,r0)                    _sti_i(_jit,i0,r0)
1473 static void _sti_i(jit_state_t*,jit_word_t,jit_int32_t);
1474 #define str_l(r0,r1)                    ST8(r0,r1)
1475 #define sti_l(i0,r0)                    _sti_l(_jit,i0,r0)
1476 static void _sti_l(jit_state_t*,jit_word_t,jit_int32_t);
1477 #define stxr_c(r0,r1,r2)                _stxr_c(_jit,r0,r1,r2)
1478 static void _stxr_c(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
1479 #define stxi_c(i0,r0,r1)                _stxi_c(_jit,i0,r0,r1)
1480 static void _stxi_c(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
1481 #define stxr_s(r0,r1,r2)                _stxr_s(_jit,r0,r1,r2)
1482 static void _stxr_s(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
1483 #define stxi_s(i0,r0,r1)                _stxi_s(_jit,i0,r0,r1)
1484 static void _stxi_s(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
1485 #define stxr_i(r0,r1,r2)                _stxr_i(_jit,r0,r1,r2)
1486 static void _stxr_i(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
1487 #define stxi_i(i0,r0,r1)                _stxi_i(_jit,i0,r0,r1)
1488 static void _stxi_i(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
1489 #define stxr_l(r0,r1,r2)                _stxr_l(_jit,r0,r1,r2)
1490 static void _stxr_l(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
1491 #define stxi_l(i0,r0,r1)                _stxi_l(_jit,i0,r0,r1)
1492 static void _stxi_l(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
1493 #define jmpr(r0)                        _jmpr(_jit,r0)
1494 static void _jmpr(jit_state_t*,jit_int32_t);
1495 #define jmpi(i0)                        _jmpi(_jit,i0)
1496 static void _jmpi(jit_state_t*,jit_word_t);
1497 #define jmpi_p(i0)                      _jmpi_p(_jit,i0)
1498 static jit_word_t _jmpi_p(jit_state_t*,jit_word_t);
1499 #define callr(r0)                       _callr(_jit,r0)
1500 static void _callr(jit_state_t*,jit_int32_t);
1501 #define calli(i0)                       _calli(_jit,i0)
1502 static void _calli(jit_state_t*,jit_word_t);
1503 #define calli_p(i0)                     _calli_p(_jit,i0)
1504 static jit_word_t _calli_p(jit_state_t*,jit_word_t);
1505 #define prolog(node)                    _prolog(_jit,node)
1506 static void _prolog(jit_state_t*,jit_node_t*);
1507 #define epilog(node)                    _epilog(_jit,node)
1508 static void _epilog(jit_state_t*,jit_node_t*);
1509 #  define vastart(r0)                   _vastart(_jit, r0)
1510 static void _vastart(jit_state_t*, jit_int32_t);
1511 #  define vaarg(r0, r1)                 _vaarg(_jit, r0, r1)
1512 static void _vaarg(jit_state_t*, jit_int32_t, jit_int32_t);
1513 #define patch_at(node,instr,label)      _patch_at(_jit,node,instr,label)
1514 static void _patch_at(jit_state_t*,jit_code_t,jit_word_t,jit_word_t);
1515 #endif
1516
1517 #if CODE
1518 #if __BYTE_ORDER == __BIG_ENDIAN
1519 static jit_word_t
1520 byte_swap_if_big_endian(jit_word_t w)
1521 {
1522     union {
1523         char    c[8];
1524         long    w;
1525     } l, h;
1526     l.w = w;
1527     h.c[0] = l.c[7];
1528     h.c[1] = l.c[6];
1529     h.c[2] = l.c[5];
1530     h.c[3] = l.c[4];
1531     h.c[4] = l.c[3];
1532     h.c[5] = l.c[2];
1533     h.c[6] = l.c[1];
1534     h.c[7] = l.c[0];
1535     return (h.w);
1536 }
1537 #else
1538 #define byte_swap_if_big_endian(w)              (w)
1539 #endif
1540
1541 static void
1542 _out(jit_state_t *_jit, int n, int tm,
1543      jit_word_t s0, jit_word_t s1, jit_word_t s2)
1544 {
1545     int                  i;
1546     jit_word_t           l, h, *w;
1547     set_bundle(_jit->pc.ul, l, h, tm, s0, s1, s2);
1548     _jit->pc.ul += 2;
1549     w = (jit_word_t *)_jitc->inst;
1550     for (i = n; i < _jitc->ioff; i++)
1551         w[i - n] = w[i];
1552     _jitc->ioff -= n;
1553 }
1554
1555 #define nop_m           0x0008000000L
1556 #define nop_i           0x0008000000L
1557 #define nop_b           0x4000000000L
1558 static void
1559 _stop(jit_state_t *_jit)
1560 {
1561     /* Clear set of live registers */
1562     jit_regset_set_ui(&_jitc->regs, 0);
1563     _jitc->pred = 0;
1564     /* Flag a stop is required */
1565     if (_jitc->ioff)
1566         _jitc->inst[_jitc->ioff - 1].t |= INST_STOP;
1567     else
1568         inst(nop_m, INST_Ms);
1569 }
1570
1571 static void
1572 _sync(jit_state_t *_jit)
1573 {
1574     /* Taken branches are supposed to not need a stop, so, it
1575      * should not be required to stop if no registers live in
1576      * sequential code */
1577     if (jit_regset_cmp_ui(&_jitc->regs, 0) != 0 || _jitc->pred)
1578         stop();
1579     do
1580         flush();
1581     while (_jitc->ioff);
1582 }
1583
1584 #define A_0             INST_A
1585 #define As0             INST_As
1586 #define I_0             INST_I
1587 #define Is0             INST_Is
1588 #define M_0             INST_M
1589 #define Ms0             INST_Ms
1590 #define F_0             INST_F
1591 #define Fs0             INST_Fs
1592 #define B_0             INST_B
1593 #define Bs0             INST_Bs
1594 #define L_0             INST_L
1595 #define Ls0             INST_Ls
1596 #define X_0             INST_X
1597 #define Xs0             INST_Xs
1598 #define A_1             (INST_A<<4)
1599 #define As1             (INST_As<<4)
1600 #define I_1             (INST_I<<4)
1601 #define Is1             (INST_Is<<4)
1602 #define M_1             (INST_M<<4)
1603 #define Ms1             (INST_Ms<<4)
1604 #define F_1             (INST_F<<4)
1605 #define Fs1             (INST_Fs<<4)
1606 #define B_1             (INST_B<<4)
1607 #define Bs1             (INST_Bs<<4)
1608 #define L_1             (INST_L<<4)
1609 #define Ls1             (INST_Ls<<4)
1610 #define X_1             (INST_X<<4)
1611 #define Xs1             (INST_Xs<<4)
1612 #define A_2             (INST_A<<8)
1613 #define As2             (INST_As<<8)
1614 #define I_2             (INST_I<<8)
1615 #define Is2             (INST_Is<<8)
1616 #define M_2             (INST_M<<8)
1617 #define Ms2             (INST_Ms<<8)
1618 #define F_2             (INST_F<<8)
1619 #define Fs2             (INST_Fs<<8)
1620 #define B_2             (INST_B<<8)
1621 #define Bs2             (INST_Bs<<8)
1622 #define L_2             (INST_L<<8)
1623 #define Ls2             (INST_Ls<<8)
1624 #define X_2             (INST_X<<8)
1625 #define Xs2             (INST_Xs<<8)
1626
1627 #define I_              I_0
1628 #define I_I_            I_0|I_1
1629 #define I_Is            I_0|Is1
1630 #define I_B_            I_0|B_1
1631 #define I_Bs            I_0|Bs1
1632 #define Is              Is0
1633 #define IsI_            Is0|I_1
1634 #define IsIs            Is0|Is1
1635 #define M_              M_0
1636 #define M_I_            M_0|I_1
1637 #define M_Is            M_0|Is1
1638 #define M_M_            M_0|M_1
1639 #define M_Ms            M_0|Ms1
1640 #define M_F_            M_0|F_1
1641 #define M_Fs            M_0|Fs1
1642 #define M_B_            M_0|B_1
1643 #define M_Bs            M_0|Bs1
1644 #define M_I_I_          M_0|I_1|I_2
1645 #define M_I_Is          M_0|I_1|Is2
1646 #define M_I_B_          M_0|I_1|B_2
1647 #define M_I_Bs          M_0|I_1|Bs2
1648 #define M_IsI_          M_0|Is1|I_2
1649 #define M_IsIs          M_0|Is1|Is2
1650 #define M_M_I_          M_0|M_1|I_2
1651 #define M_M_Is          M_0|M_1|Is2
1652 #define M_M_F_          M_0|M_1|F_2
1653 #define M_M_Fs          M_0|M_1|Fs2
1654 #define M_M_B_          M_0|M_1|B_2
1655 #define M_M_Bs          M_0|M_1|Bs2
1656 #define M_F_I_          M_0|F_1|I_2
1657 #define M_F_Is          M_0|F_1|Is2
1658 #define M_F_B_          M_0|F_1|B_2
1659 #define M_F_Bs          M_0|F_1|Bs2
1660 #define M_B_B_          M_0|B_1|B_2
1661 #define M_B_Bs          M_0|B_1|Bs2
1662 #define M_L_X_          M_0|L_1|X_2
1663 #define M_L_Xs          M_0|L_1|Xs2
1664 #define Ms              Ms0
1665 #define MsI_            Ms0|I_1
1666 #define MsIs            Ms0|Is1
1667 #define MsM_            Ms0|M_1
1668 #define MsMs            Ms0|Ms1
1669 #define MsM_I_          Ms0|M_1|I_2
1670 #define MsM_Is          Ms0|M_1|Is2
1671 #define F_              F_0
1672 #define F_I_            F_0|I_1
1673 #define F_Is            F_0|Is1
1674 #define F_B_            F_0|B_1
1675 #define F_Bs            F_0|Bs1
1676 #define Fs              Fs0
1677 #define B_              B_0
1678 #define B_B_            B_0|B_1
1679 #define B_Bs            B_0|Bs1
1680 #define B_B_B_          B_0|B_1|B_2
1681 #define B_B_Bs          B_0|B_1|Bs2
1682 #define Bs              Bs0
1683 #define L_X_            L_0|X_1
1684 #define L_Xs            L_0|Xs1
1685
1686 static jit_word_t
1687 templat(jit_word_t cc)
1688 {
1689     switch (cc) {
1690         case I_:
1691         case I_I_:      case I_Is:
1692         case I_B_:      case I_Bs:
1693         case Is:
1694         case IsI_:      case IsIs:
1695         case M_:
1696         case M_I_:      case M_Is:
1697         case M_M_:      case M_Ms:
1698         case M_F_:      case M_Fs:
1699         case M_B_:      case M_Bs:
1700         case M_I_I_:    case M_I_Is:
1701         case M_I_B_:    case M_I_Bs:
1702         case M_IsI_:    case M_IsIs:
1703         case M_M_I_:    case M_M_Is:
1704         case M_M_F_:    case M_M_Fs:
1705         case M_M_B_:    case M_M_Bs:
1706         case M_F_I_:    case M_F_Is:
1707         case M_F_B_:    case M_F_Bs:
1708         case M_B_B_:    case M_B_Bs:
1709         case M_L_X_:    case M_L_Xs:
1710         case Ms:
1711         case MsI_:      case MsIs:
1712         case MsM_:      case MsMs:
1713         case MsM_I_:    case MsM_Is:
1714         case F_:
1715         case F_I_:      case F_Is:
1716         case F_B_:      case F_Bs:
1717         case Fs:
1718         case B_:
1719         case B_B_:      case B_Bs:
1720         case B_B_B_:    case B_B_Bs:
1721         case Bs:
1722         case L_X_:      case L_Xs:
1723             return (cc);
1724         default:
1725             return (0);
1726     }
1727 }
1728
1729 /* match* functions recurse attempting to find a template for A-
1730  * instructions, that may be executed in M- or I- unit.
1731  * It also uses an heuristic of trying first M- for slot 0 and 2,
1732  * and I- for slot 1, but tries all possible matches.
1733  */
1734 static jit_word_t
1735 match_2(jit_word_t cc)
1736 {
1737     jit_word_t          t;
1738     if ((t = templat(cc | M_2)))
1739         return (t);
1740     if ((t = templat(cc | I_2)))
1741         return (t);
1742     return (0);
1743 }
1744
1745 static jit_word_t
1746 matchs2(jit_word_t cc)
1747 {
1748     jit_word_t          t;
1749     if ((t = templat(cc | Ms2)))
1750         return (t);
1751     if ((t = templat(cc | Is2)))
1752         return (t);
1753     return (0);
1754 }
1755
1756 static jit_word_t
1757 match2(jit_word_t cc)
1758 {
1759     if ((cc & 0xf00) == A_2)
1760         return (match_2(cc & ~0xf00));
1761     if ((cc & 0xf00) == As2)
1762         return (matchs2(cc & ~0xf00));
1763     return (0);
1764 }
1765
1766 static jit_word_t
1767 match_1(jit_word_t cc)
1768 {
1769     jit_word_t          t;
1770     if ((t = templat(cc | I_1)))
1771         return (t);
1772     if ((t = templat(cc | M_1)))
1773         return (t);
1774     if ((t = match2(cc | I_1)))
1775         return (t);
1776     if ((t = match2(cc | M_1)))
1777         return (t);
1778     return (0);
1779 }
1780
1781 static jit_word_t
1782 matchs1(jit_word_t cc)
1783 {
1784     jit_word_t          t;
1785     if ((t = templat(cc | Is1)))
1786         return (t);
1787     if ((t = templat(cc | Ms1)))
1788         return (t);
1789     if ((t = match2(cc | Is1)))
1790         return (t);
1791     if ((t = match2(cc | Ms1)))
1792         return (t);
1793     return (0);
1794 }
1795
1796 static jit_word_t
1797 match1(jit_word_t cc)
1798 {
1799     if ((cc & 0x0f0) == A_1)
1800         return (match_1(cc & ~0x0f0));
1801     if ((cc & 0x0f0) == As1)
1802         return (matchs1(cc & ~0x0f0));
1803     return (0);
1804 }
1805
1806 static jit_word_t
1807 match_0(jit_word_t cc)
1808 {
1809     jit_word_t          t;
1810     if ((t = templat(cc | M_0)))
1811         return (t);
1812     if ((t = templat(cc | I_0)))
1813         return (t);
1814     if ((t = match1(cc | M_0)))
1815         return (t);
1816     if ((t = match1(cc | I_0)))
1817         return (t);
1818     return (0);
1819 }
1820
1821 static jit_word_t
1822 matchs0(jit_word_t cc)
1823 {
1824     jit_word_t          t;
1825     if ((t = templat(cc | Ms0)))
1826         return (t);
1827     if ((t = templat(cc | Is0)))
1828         return (t);
1829     if ((t = match1(cc | Ms0)))
1830         return (t);
1831     if ((t = match1(cc | Is0)))
1832         return (t);
1833     return (0);
1834 }
1835
1836 static jit_word_t
1837 match0(jit_word_t cc)
1838 {
1839     if ((cc & 0x00f) == A_0)
1840         return (match_0(cc & ~0x00f));
1841     if ((cc & 0x00f) == As0)
1842         return (matchs0(cc & ~0x00f));
1843     return (0);
1844 }
1845
1846 static void
1847 _flush(jit_state_t *_jit)
1848 {
1849     int                 n, soff;
1850     jit_word_t          t, cc, tm, s0, s1, s2;
1851
1852     if (!_jitc->ioff)
1853         return;
1854     for (cc = 0, n = soff = 0; n < _jitc->ioff; n++, soff += 4)
1855         cc |= (jit_uword_t)(_jitc->inst[n].t) << soff;
1856
1857     soff = 0xf00;
1858     while (soff) {
1859         /* Try to find a template, or reduce down
1860          * to one instruction if no template match */
1861         if ((t = templat(cc))) {
1862             cc = t;
1863             break;
1864         }
1865         /* A- instructions may be execute in M- or I- unit */
1866         if ((t = match0(cc))) {
1867             cc = t;
1868             break;
1869         }
1870         cc &= ~soff;
1871         soff >>= 4;
1872     }
1873     assert(soff);
1874
1875     /* Prefer tail nop if need to add some nop, so that patching is easier */
1876 #define ii(n)           _jitc->inst[n].i
1877     switch (cc) {
1878         case I_:
1879             n = 1;              tm = TM_M_I_I_;
1880             s0 = nop_m;         s1 = ii(0);             s2 = nop_i;
1881             break;
1882         case I_I_:
1883             n = 2;              tm = TM_M_I_I_;
1884             s0 = nop_m;         s1 = ii(0);             s2 = ii(1);
1885             break;
1886         case I_Is:
1887             n = 2;              tm = TM_M_I_Is;
1888             s0 = nop_m;         s1 = ii(0);             s2 = ii(1);
1889             break;
1890         case I_B_:
1891             n = 2;              tm = TM_M_I_B_;
1892             s0 = nop_m;         s1 = ii(0);             s2 = ii(1);
1893             break;
1894         case I_Bs:
1895             n = 2;              tm = TM_M_I_Bs;
1896             s0 = nop_m;         s1 = ii(0);             s2 = ii(1);
1897             break;
1898         case Is:
1899             n = 1;              tm = TM_M_IsI_;
1900             s0 = nop_m;         s1 = ii(0);             s2 = nop_i;
1901             break;
1902         case IsI_:
1903             n = 2;              tm = TM_M_IsI_;
1904             s0 = nop_m;         s1 = ii(0);             s2 = ii(1);
1905             break;
1906         case IsIs:
1907             n = 2;              tm = TM_M_IsIs;
1908             s0 = nop_m;         s1 = ii(0);             s2 = ii(1);
1909             break;
1910         case M_:
1911             n = 1;              tm = TM_M_I_I_;
1912             s0 = ii(0);         s1 = nop_i;             s2 = nop_i;
1913             break;
1914         case M_I_:
1915             n = 2;              tm = TM_M_I_I_;
1916             s0 = ii(0);         s1 = ii(1);             s2 = nop_i;
1917             break;
1918         case M_Is:
1919             n = 2;              tm = TM_M_IsI_;
1920             s0 = ii(0);         s1 = ii(1);             s2 = nop_i;
1921             break;
1922         case M_M_:
1923             n = 2;              tm = TM_M_M_I_;
1924             s0 = ii(0);         s1 = ii(1);             s2 = nop_i;
1925             break;
1926         case M_Ms:
1927             n = 2;              tm = TM_M_M_Is;
1928             s0 = ii(0);         s1 = ii(1);             s2 = nop_i;
1929             break;
1930         case M_F_:
1931             n = 2;              tm = TM_M_F_I_;
1932             s0 = ii(0);         s1 = ii(1);             s2 = nop_i;
1933             break;
1934         case M_Fs:
1935             n = 2;              tm = TM_M_F_Is;
1936             s0 = ii(0);         s1 = ii(1);             s2 = nop_i;
1937             break;
1938         case M_B_:
1939             n = 2;              tm = TM_M_B_B_;
1940             s0 = ii(0);         s1 = ii(1);             s2 = nop_b;
1941             break;
1942         case M_Bs:
1943             n = 2;              tm = TM_M_B_Bs;
1944             s0 = ii(0);         s1 = ii(1);             s2 = nop_b;
1945             break;
1946         case M_I_I_:
1947             n = 3;              tm = TM_M_I_I_;
1948             s0 = ii(0);         s1 = ii(1);             s2 = ii(2);
1949             break;
1950         case M_I_Is:
1951             n = 3;              tm = TM_M_I_Is;
1952             s0 = ii(0);         s1 = ii(1);             s2 = ii(2);
1953             break;
1954         case M_I_B_:
1955             n = 3;              tm = TM_M_I_B_;
1956             s0 = ii(0);         s1 = ii(1);             s2 = ii(2);
1957             break;
1958         case M_I_Bs:
1959             n = 3;              tm = TM_M_I_Bs;
1960             s0 = ii(0);         s1 = ii(1);             s2 = ii(2);
1961             break;
1962         case M_IsI_:
1963             n = 3;              tm = TM_M_IsI_;
1964             s0 = ii(0);         s1 = ii(1);             s2 = ii(2);
1965             break;
1966         case M_IsIs:
1967             n = 3;              tm = TM_M_IsIs;
1968             s0 = ii(0);         s1 = ii(1);             s2 = ii(2);
1969             break;
1970         case M_M_I_:
1971             n = 3;              tm = TM_M_M_I_;
1972             s0 = ii(0);         s1 = ii(1);             s2 = ii(2);
1973             break;
1974         case M_M_Is:
1975             n = 3;              tm = TM_M_M_Is;
1976             s0 = ii(0);         s1 = ii(1);             s2 = ii(2);
1977             break;
1978         case M_M_F_:
1979             n = 3;              tm = TM_M_M_F_;
1980             s0 = ii(0);         s1 = ii(1);             s2 = ii(2);
1981             break;
1982         case M_M_Fs:
1983             n = 3;              tm = TM_M_M_Fs;
1984             s0 = ii(0);         s1 = ii(1);             s2 = ii(2);
1985             break;
1986         case M_M_B_:
1987             n = 3;              tm = TM_M_M_B_;
1988             s0 = ii(0);         s1 = ii(1);             s2 = ii(2);
1989             break;
1990         case M_M_Bs:
1991             n = 3;              tm = TM_M_M_Bs;
1992             s0 = ii(0);         s1 = ii(1);             s2 = ii(2);
1993             break;
1994         case M_F_I_:
1995             n = 3;              tm = TM_M_F_I_;
1996             s0 = ii(0);         s1 = ii(1);             s2 = ii(2);
1997             break;
1998         case M_F_Is:
1999             n = 3;              tm = TM_M_F_Is;
2000             s0 = ii(0);         s1 = ii(1);             s2 = ii(2);
2001             break;
2002         case M_F_B_:
2003             n = 3;              tm = TM_M_F_B_;
2004             s0 = ii(0);         s1 = ii(1);             s2 = ii(2);
2005             break;
2006         case M_F_Bs:
2007             n = 3;              tm = TM_M_F_Bs;
2008             s0 = ii(0);         s1 = ii(1);             s2 = ii(2);
2009             break;
2010         case M_B_B_:
2011             n = 3;              tm = TM_M_B_B_;
2012             s0 = ii(0);         s1 = ii(1);             s2 = ii(2);
2013             break;
2014         case M_B_Bs:
2015             n = 3;              tm = TM_M_B_Bs;
2016             s0 = ii(0);         s1 = ii(1);             s2 = ii(2);
2017             break;
2018         case M_L_X_:
2019             n = 3;              tm = TM_M_L_X_;
2020             s0 = ii(0);         s1 = ii(1);             s2 = ii(2);
2021             break;
2022         case M_L_Xs:
2023             n = 3;              tm = TM_M_L_Xs;
2024             s0 = ii(0);         s1 = ii(1);             s2 = ii(2);
2025             break;
2026         case Ms:
2027             n = 1;              tm = TM_MsM_I_;
2028             s0 = ii(0);         s1 = nop_m;             s2 = nop_i;
2029             break;
2030         case MsI_:
2031             n = 2;              tm = TM_MsM_I_;
2032             s0 = ii(0);         s1 = nop_m;             s2 = ii(1);
2033             break;
2034         case MsIs:
2035             n = 2;              tm = TM_MsM_Is;
2036             s0 = ii(0);         s1 = nop_m;             s2 = ii(1);
2037             break;
2038         case MsM_:
2039             n = 2;              tm = TM_MsM_I_;
2040             s0 = ii(0);         s1 = ii(1);             s2 = nop_i;
2041             break;
2042         case MsMs:
2043             n = 2;              tm = TM_MsM_Is;
2044             s0 = ii(0);         s1 = ii(1);             s2 = nop_i;
2045             break;
2046         case MsM_I_:
2047             n = 3;              tm = TM_MsM_I_;
2048             s0 = ii(0);         s1 = ii(1);             s2 = ii(2);
2049             break;
2050         case MsM_Is:
2051             n = 3;              tm = TM_MsM_Is;
2052             s0 = ii(0);         s1 = ii(1);             s2 = ii(2);
2053             break;
2054         case F_:
2055             n = 1;              tm = TM_M_F_I_;
2056             s0 = nop_m;         s1 = ii(0);             s2 = nop_i;
2057             break;
2058         case F_I_:
2059             n = 2;              tm = TM_M_F_I_;
2060             s0 = nop_m;         s1 = ii(0);             s2 = ii(1);
2061             break;
2062         case F_Is:
2063             n = 2;              tm = TM_M_F_Is;
2064             s0 = nop_m;         s1 = ii(0);             s2 = ii(1);
2065             break;
2066         case F_B_:
2067             n = 2;              tm = TM_M_F_B_;
2068             s0 = nop_m;         s1 = ii(0);             s2 = ii(1);
2069             break;
2070         case F_Bs:
2071             n = 2;              tm = TM_M_F_Bs;
2072             s0 = nop_m;         s1 = ii(0);             s2 = ii(1);
2073             break;
2074         case Fs:
2075             n = 1;              tm = TM_M_F_Is;
2076             s0 = nop_m;         s1 = ii(0);             s2 = nop_i;
2077             break;
2078         case B_:
2079             n = 1;              tm = TM_B_B_B_;
2080             s0 = ii(0);         s1 = nop_b;             s2 = nop_b;
2081             break;
2082         case B_B_:
2083             n = 2;              tm = TM_B_B_B_;
2084             s0 = ii(0);         s1 = ii(1);             s2 = nop_b;
2085             break;
2086         case B_Bs:
2087             n = 2;              tm = TM_B_B_Bs;
2088             s0 = ii(0);         s1 = ii(1);             s2 = nop_b;
2089             break;
2090         case B_B_B_:
2091             n = 3;              tm = TM_B_B_B_;
2092             s0 = ii(0);         s1 = ii(1);             s2 = ii(2);
2093             break;
2094         case B_B_Bs:
2095             n = 3;              tm = TM_B_B_Bs;
2096             s0 = ii(0);         s1 = ii(1);             s2 = ii(2);
2097             break;
2098         case Bs:
2099             n = 1;              tm = TM_B_B_Bs;
2100             s0 = ii(0);         s1 = nop_b;             s2 = nop_b;
2101             break;
2102         case L_X_:
2103             n = 2;              tm = TM_M_L_X_;
2104             s0 = nop_m;         s1 = ii(0);             s2 = ii(1);
2105             break;
2106         case L_Xs:
2107             n = 2;              tm = TM_M_L_Xs;
2108             s0 = nop_m;         s1 = ii(0);             s2 = ii(1);
2109             break;
2110         default:
2111             abort();
2112     }
2113     out(n, tm, s0, s1, s2);
2114 }
2115
2116 static void
2117 _inst(jit_state_t *_jit, jit_word_t i, jit_uint8_t t)
2118 {
2119     if (_jitc->ioff > 2)
2120         flush();
2121     assert(!(i & 0x11111e0000000000L));
2122     _jitc->inst[_jitc->ioff].i = i;
2123     _jitc->inst[_jitc->ioff].t = t;
2124     ++_jitc->ioff;
2125 }
2126
2127 static void
2128 _A1(jit_state_t *_jit, jit_word_t _p,
2129     jit_word_t x4, jit_word_t x2, jit_word_t r3, jit_word_t r2, jit_word_t r1)
2130 {
2131     assert(!(_p & ~0x3fL));
2132     assert(!(x4 &  ~0xfL));
2133     assert(!(x2 &  ~0x3L));
2134     assert(!(r3 & ~0x7fL));
2135     assert(!(r2 & ~0x7fL));
2136     assert(!(r1 & ~0x7fL));
2137     TSTREG2(r2, r3);
2138     TSTPRED(_p);
2139     TSTREG1(r1);
2140     inst((8L<<37)|(x4<<29)|(x2<<27)|(r3<<20)|(r2<<13)|(r1<<6)|_p, INST_A);
2141     SETREG(r1);
2142 }
2143
2144 static void
2145 _A3(jit_state_t *_jit, jit_word_t _p,
2146     jit_word_t x4, jit_word_t x2, jit_word_t r3, jit_word_t im, jit_word_t r1)
2147 {
2148     assert(!(_p & ~0x3fL));
2149     assert(!(x4 &  ~0xfL));
2150     assert(!(x2 &  ~0x3L));
2151     assert(!(r3 & ~0x7fL));
2152     assert(im >= -128 && im <= 127);
2153     assert(!(r1 & ~0x7f));
2154     TSTREG1(r3);
2155     TSTPRED(_p);
2156     TSTREG1(r1);
2157     inst((8L<<37)|(((im>>7)&1L)<<36)|(x4<<29)|(x2<<27)|
2158          (r3<<20)|((im&0x7fL)<<13)|(r1<<6)|_p, INST_A);
2159     SETREG(r1);
2160 }
2161
2162 static void
2163 _A4(jit_state_t *_jit, jit_word_t _p,
2164     jit_word_t x2, jit_word_t r3, jit_word_t im, jit_word_t r1)
2165 {
2166     assert(!(_p & ~0x3fL));
2167     assert(!(x2 &  ~0x3L));
2168     assert(!(r3 & ~0x7fL));
2169     assert(im >= -8192 && im <= 8191);
2170     assert(!(r1  & ~0x7f));
2171     TSTREG1(r3);
2172     TSTPRED(_p);
2173     TSTREG1(r1);
2174     inst((8L<<37)|(((im>>13)&1L)<<36)|(x2<<34)|(((im>>7)&0x3fL)<<27)|
2175          (r3<<20)|((im&0x7fL)<<13)|(r1<<6)|_p, INST_A);
2176     SETREG(r1);
2177 }
2178
2179 static void
2180 _A5(jit_state_t *_jit, jit_word_t _p,
2181     jit_word_t r3, jit_word_t im, jit_word_t r1)
2182 {
2183     jit_word_t          s, i5, i9, i7;
2184     assert(!(_p & ~0x3fL));
2185     assert(!(r3  & ~0x3L));
2186     assert(im >= -2097152 && im <= 2097151);
2187     assert(!(r1  & ~0x7fL));
2188     /* imm22 = sign_ext(s << 21 | imm5c << 16 | imm9d << 7 | imm7b, 22) */
2189     s  = (im & 0x200000) >> 21;
2190     i5 = (im & 0x1f0000) >> 16;
2191     i9 = (im &   0xff80) >>  7;
2192     i7 =  im &     0x7f;
2193     TSTREG1(r3);
2194     TSTPRED(_p);
2195     TSTREG1(r1);
2196     inst((9L<<37)|(s<<36)|(i9<<27)|(i5<<22)|
2197          (r3<<20)|(i7<<13)|(r1<<6)|_p, INST_A);
2198     SETREG(r1);
2199 }
2200
2201 static void
2202 _A6(jit_state_t *_jit, jit_word_t _p,
2203     jit_word_t o, jit_word_t x2, jit_word_t ta, jit_word_t p2,
2204     jit_word_t r3, jit_word_t r2, jit_word_t c, jit_word_t p1)
2205 {
2206     assert(!(_p & ~0x3fL));
2207     assert(!(o  &  ~0xfL));
2208     assert(!(x2 &  ~0x3L));
2209     assert(!(ta &  ~0x1L));
2210     assert(!(p2 & ~0x7fL));
2211     assert(!(r3 & ~0x7fL));
2212     assert(!(r2 & ~0x7fL));
2213     assert(!(c  &  ~0x1L));
2214     assert(!(p1 & ~0x3fL));
2215     TSTREG2(r2, r3);
2216     TSTPRED(_p);
2217     inst((o<<37)|(x2<<34)|(ta<<33)|(p2<<27)|(r3<<20)|
2218          (r2<<13)|(c<<12)|(p1<<6)|_p, INST_A);
2219     if (p1)
2220         _jitc->pred |= 1 << p1;
2221     if (p2)
2222         _jitc->pred |= 1 << p2;
2223 }
2224
2225 static void
2226 _A7(jit_state_t *_jit, jit_word_t _p,
2227     jit_word_t o, jit_word_t x2, jit_word_t ta,
2228     jit_word_t p2, jit_word_t r3, jit_word_t c, jit_word_t p1)
2229 {
2230     assert(!(_p & ~0x3fL));
2231     assert(!(o  &  ~0xfL));
2232     assert(!(x2 &  ~0x3L));
2233     assert(!(ta &  ~0x1L));
2234     assert(!(p2 & ~0x7fL));
2235     assert(!(r3 & ~0x7fL));
2236     assert(!(c  &  ~0x1L));
2237     assert(!(p1 & ~0x3fL));
2238     TSTREG1(r3);
2239     TSTPRED(_p);
2240     inst((o<<37)|(1L<<36)|(x2<<34)|(ta<<33)|
2241          (p2<<27)|(r3<<20)|(c<<12)|(p1<<6)|_p, INST_A);
2242     if (p1)
2243         _jitc->pred |= 1 << p1;
2244     if (p2)
2245         _jitc->pred |= 1 << p2;
2246 }
2247
2248 static void
2249 _A8(jit_state_t *_jit, jit_word_t _p,
2250     jit_word_t o, jit_word_t x2, jit_word_t ta, jit_word_t p2,
2251     jit_word_t r3, jit_word_t im, jit_word_t c, jit_word_t p1)
2252 {
2253     assert(!(_p & ~0x3fL));
2254     assert(!(o  &  ~0xfL));
2255     assert(!(x2 &  ~0x3L));
2256     assert(!(ta &  ~0x1L));
2257     assert(!(p2 & ~0x7fL));
2258     assert(!(r3 & ~0x7fL));
2259     assert(im >= -128 && im <= 127);
2260     assert(!(c  &  ~0x1L));
2261     assert(!(p1 & ~0x3fL));
2262     TSTREG1(r3);
2263     TSTPRED(_p);
2264     inst((o<<37)|(((im>>7)&1L)<<36)|(x2<<34)|(ta<<33)|(p2<<27)|(r3<<20)|
2265          ((im&0x7fL)<<13)|(c<<12)|(p1<<6)|_p, INST_A);
2266     if (p1)
2267         _jitc->pred |= 1 << p1;
2268     if (p2)
2269         _jitc->pred |= 1 << p2;
2270 }
2271
2272 static void
2273 _A9(jit_state_t *_jit, jit_word_t _p,
2274     jit_word_t za, jit_word_t zb, jit_word_t x4,
2275     jit_word_t x2, jit_word_t r3, jit_word_t r2, jit_word_t r1)
2276 {
2277     assert(!(_p & ~0x3fL));
2278     assert(!(za &  ~0x1L));
2279     assert(!(zb &  ~0x1L));
2280     assert(!(x4 &  ~0xfL));
2281     assert(!(x2 &  ~0x3L));
2282     assert(!(r3 & ~0x7fL));
2283     assert(!(r2 & ~0x7fL));
2284     assert(!(r1 & ~0x7fL));
2285     TSTREG2(r2, r3);
2286     TSTPRED(_p);
2287     TSTREG1(r1);
2288     inst((8L<<37)|(za<<36)|(1L<<34)|(zb<<33)|(x4<<29)|(x2<<27)|
2289          (r3<<20)|(r2<<13)|(r1<<6)|_p, INST_A);
2290     SETREG(r1);
2291 }
2292
2293 static void
2294 _I1(jit_state_t *_jit, jit_word_t _p,
2295     jit_word_t ct, jit_word_t x2, jit_word_t r3, jit_word_t r2, jit_word_t r1)
2296 {
2297     assert(!(_p & ~0x3fL));
2298     assert(!(ct &  ~0x3L));
2299     assert(!(x2 &  ~0x3L));
2300     assert(!(r3 & ~0x7fL));
2301     assert(!(r2 & ~0x7fL));
2302     assert(!(r1 & ~0x7fL));
2303     TSTREG2(r2, r3);
2304     TSTPRED(_p);
2305     TSTREG1(r1);
2306     inst((7L<<37)|(1L<<33)|(ct<<30)|(x2<<28)|
2307          (r3<<20)|(r2<<13)|(r1<<6)|_p, INST_I);
2308     SETREG(r1);
2309 }
2310
2311 static void
2312 _I2(jit_state_t *_jit, jit_word_t _p,
2313     jit_word_t za, jit_word_t xa, jit_word_t zb, jit_word_t xc,
2314     jit_word_t xb ,jit_word_t r3, jit_word_t r2, jit_word_t r1)
2315 {
2316     assert(!(_p & ~0x3fL));
2317     assert(!(za &  ~0x1L));
2318     assert(!(xa &  ~0x3L));
2319     assert(!(zb &  ~0x1L));
2320     assert(!(xc &  ~0x3L));
2321     assert(!(xb &  ~0x3L));
2322     assert(!(r3 & ~0x7fL));
2323     assert(!(r2 & ~0x7fL));
2324     assert(!(r1 & ~0x7fL));
2325     TSTREG2(r2, r3);
2326     TSTPRED(_p);
2327     TSTREG1(r1);
2328     inst((7L<<37)|(za<<36)|(xa<<34)|(zb<<33)|(xc<<30)|
2329          (xb<<28)|(r3<<20)|(r2<<13)|(r1<<6), INST_I);
2330     SETREG(r1);
2331 }
2332
2333 static void
2334 _I3(jit_state_t *_jit, jit_word_t _p,
2335     jit_word_t mb, jit_word_t r2, jit_word_t r1)
2336 {
2337     assert(!(_p & ~0x3fL));
2338     assert(!(mb &  ~0xfL));
2339     assert(!(r2 & ~0x7fL));
2340     assert(!(r1 & ~0x7fL));
2341     TSTREG1(r2);
2342     TSTPRED(_p);
2343     TSTREG1(r1);
2344     inst((7L<<37)|(3L<<34)|(2L<<30)|(2L<<28)|
2345          (mb<<20)|(r2<<13)|(r1<<6)|_p, INST_I);
2346     SETREG(r1);
2347 }
2348
2349 static void
2350 _I4(jit_state_t *_jit, jit_word_t _p,
2351     jit_word_t mh, jit_word_t r2, jit_word_t r1)
2352 {
2353     assert(!(_p & ~0x3fL));
2354     assert(!(mh & ~0xffL));
2355     assert(!(r2 & ~0x7fL));
2356     assert(!(r1 & ~0x7fL));
2357     TSTREG1(r2);
2358     TSTPRED(_p);
2359     TSTREG1(r1);
2360     inst((7L<<37)|(3L<<34)|(1L<<33)|(2L<<30)|
2361          (2L<<28)|(mh<<20)|(r2<<13)|(r1<<6)|_p, INST_I);
2362     SETREG(r1);
2363 }
2364
2365 static void
2366 _I5(jit_state_t *_jit, jit_word_t _p,
2367     jit_word_t za, jit_word_t zb, jit_word_t x2,
2368     jit_word_t r3, jit_word_t r2, jit_word_t r1)
2369 {
2370     assert(!(_p & ~0x3fL));
2371     assert(!(za &  ~0x1L));
2372     assert(!(zb &  ~0x1L));
2373     assert(!(x2 &  ~0x3L));
2374     assert(!(r3 & ~0x7fL));
2375     assert(!(r2 & ~0x7fL));
2376     assert(!(r1 & ~0x7fL));
2377     TSTREG2(r2, r3);
2378     TSTPRED(_p);
2379     TSTREG1(r1);
2380     inst((7L<<37)|(za<<36)|(zb<<33)|(x2<<28)|
2381          (r3<<20)|(r2<<13)|(r1<<6)|_p, INST_I);
2382     SETREG(r1);
2383 }
2384
2385 static void
2386 _I6(jit_state_t *_jit, jit_word_t _p,
2387     jit_word_t za, jit_word_t zb, jit_word_t x2,
2388     jit_word_t r3, jit_word_t ct, jit_word_t r1)
2389 {
2390     assert(!(_p & ~0x3fL));
2391     assert(!(za &  ~0x1L));
2392     assert(!(zb &  ~0x1L));
2393     assert(!(x2 &  ~0x3L));
2394     assert(!(r3 & ~0x7fL));
2395     assert(!(ct & ~0x1fL));
2396     assert(!(r1 & ~0x7fL));
2397     TSTREG1(r3);
2398     TSTPRED(_p);
2399     TSTREG1(r1);
2400     inst((7L<<37)|(za<<36)|(1L<<34)|(zb<<33)|
2401          (x2<<28)|(r3<<20)|(ct<<14)|(r1<<6)|_p, INST_I);
2402     SETREG(r1);
2403 }
2404
2405 static void
2406 _I7(jit_state_t *_jit, jit_word_t _p,
2407     jit_word_t za, jit_word_t zb, jit_word_t r3, jit_word_t r2, jit_word_t r1)
2408 {
2409     assert(!(_p & ~0x3fL));
2410     assert(!(za &  ~0x1L));
2411     assert(!(zb &  ~0x1L));
2412     assert(!(r3 & ~0x7fL));
2413     assert(!(r2 & ~0x7fL));
2414     assert(!(r1 & ~0x7fL));
2415     TSTREG2(r2, r3);
2416     TSTPRED(_p);
2417     TSTREG1(r1);
2418     inst((7L<<37)|(za<<36)|(zb<<33)|(1L<<30)|
2419          (r3<<20)|(r2<<13)|(r1<<6)|_p, INST_I);
2420     SETREG(r1);
2421 }
2422
2423 static void
2424 _I8(jit_state_t *_jit, jit_word_t _p,
2425     jit_word_t za, jit_word_t zb, jit_word_t im, jit_word_t r2, jit_word_t r1)
2426 {
2427     assert(!(_p & ~0x3fL));
2428     assert(!(za &  ~0x1L));
2429     assert(!(zb &  ~0x1L));
2430     assert(!(im & ~0x1fL));
2431     assert(!(r2 & ~0x7fL));
2432     assert(!(r1 & ~0x7fL));
2433     TSTREG1(r2);
2434     TSTPRED(_p);
2435     TSTREG1(r1);
2436     inst((7L<<37)|(za<<36)|(3L<<34)|(zb<<33)|(1L<<30)|(1L<<28)|
2437          (im<<20)|(r2<<13)|(r1<<6), INST_I);
2438     SETREG(r1);
2439 }
2440
2441 static void
2442 _I9(jit_state_t *_jit, jit_word_t _p,
2443     jit_word_t x2, jit_word_t r3, jit_word_t r1)
2444 {
2445     assert(!(_p & ~0x3fL));
2446     assert(!(x2 &  ~0x3L));
2447     assert(!(r3 & ~0x7fL));
2448     assert(!(r1 & ~0x7fL));
2449     TSTREG1(r3);
2450     TSTPRED(_p);
2451     TSTREG1(r1);
2452     inst((7L<<37)|(1L<<34)|(1L<<34)|(1L<<33)|
2453          (x2<<30)|(1L<<28)|(r3<<20)|(r1<<6)|_p, INST_I);
2454     SETREG(r1);
2455 }
2456
2457 static void
2458 _I10(jit_state_t *_jit, jit_word_t _p,
2459      jit_word_t ct, jit_word_t r3, jit_word_t r2, jit_word_t r1)
2460 {
2461     assert(!(_p & ~0x3fL));
2462     assert(!(ct & ~0x3fL));
2463     assert(!(r3 & ~0x7fL));
2464     assert(!(r2 & ~0x7fL));
2465     assert(!(r1 & ~0x7fL));
2466     TSTREG2(r2, r3);
2467     TSTPRED(_p);
2468     TSTREG1(r1);
2469     inst((5L<<37)|(3L<<34)|(ct<<27)|(r3<<20)|(r2<<13)|(r1<<6)|_p, INST_I);
2470     SETREG(r1);
2471 }
2472
2473 static void
2474 _I11(jit_state_t *_jit, jit_word_t _p,
2475      jit_word_t len, jit_word_t r3,
2476      jit_word_t pos, jit_word_t y, jit_word_t r1)
2477 {
2478     assert(!(_p  & ~0x3fL));
2479     assert(!(len & ~0x3fL));
2480     assert(!(r3  & ~0x7fL));
2481     assert(!(pos & ~0x1fL));
2482     assert(!(y   &  ~0x1L));
2483     assert(!(r1  & ~0x7fL));
2484     TSTREG1(r3);
2485     TSTPRED(_p);
2486     TSTREG1(r1);
2487     inst((5L<<37)|(1L<<34)|(len<<27)|(r3<<20)|
2488          (pos<<14)|(y<<13)|(r1<<6)|_p, INST_I);
2489     SETREG(r1);
2490 }
2491
2492 static void
2493 _I12(jit_state_t *_jit, jit_word_t _p,
2494      jit_word_t len, jit_word_t pos, jit_word_t r2, jit_word_t r1)
2495 {
2496     assert(!(_p  & ~0x3fL));
2497     assert(!(len & ~0x3fL));
2498     assert(!(pos & ~0x3fL));
2499     assert(!(r2  & ~0x7fL));
2500     assert(!(r1  & ~0x7fL));
2501     TSTREG1(r2);
2502     TSTPRED(_p);
2503     TSTREG1(r1);
2504     inst((5L<<37)|(1L<<34)|(1L<<33)|(len<<27)|
2505          (pos<<20)|(r2<<13)|(r1<<6)|_p, INST_I);
2506     SETREG(r1);
2507 }
2508
2509 static void
2510 _I13(jit_state_t *_jit, jit_word_t _p,
2511      jit_word_t len, jit_word_t pos, jit_word_t im, jit_word_t r1)
2512 {
2513     assert(!(_p  & ~0x3fL));
2514     assert(!(len & ~0x3fL));
2515     assert(!(pos & ~0x3fL));
2516     assert(!(im  & ~0x7fL));
2517     assert(!(r1  & ~0x7fL));
2518     TSTPRED(_p);
2519     TSTREG1(r1);
2520     inst((5L<<37)|(((im>>7)&1L)<<36)|(1L<<34)|(1L<<33)|(len<<27)|
2521          (1L<<26)|(pos<<20)|((im&0x7fL)<<13)|(r1<<6)|_p, INST_I);
2522     SETREG(r1);
2523 }
2524
2525 static void
2526 _I14(jit_state_t *_jit, jit_word_t _p,
2527      jit_word_t s, jit_word_t len, jit_word_t r3, jit_word_t pos, jit_word_t r1)
2528 {
2529     assert(!(_p  & ~0x3fL));
2530     assert(!(s   &  ~0x1L));
2531     assert(!(len & ~0x3fL));
2532     assert(!(r3  & ~0x7fL));
2533     assert(!(pos & ~0x1fL));
2534     assert(!(r1  & ~0x7fL));
2535     TSTREG1(r3);
2536     TSTPRED(_p);
2537     TSTREG1(r1);
2538     inst((5L<<37)|(s<<36)|(3L<<34)|(1L<<33)|
2539          (len<<27)|(r3<<20)|(pos<<14)|(r1<<6)|_p, INST_I);
2540     SETREG(r1);
2541 }
2542
2543 static void
2544 _I15(jit_state_t *_jit, jit_word_t _p,
2545      jit_word_t pos, jit_word_t len,
2546      jit_word_t r3, jit_word_t r2, jit_word_t r1)
2547 {
2548     assert(!(_p  & ~0x3fL));
2549     assert(!(pos & ~0x3fL));
2550     assert(!(len &  ~0xfL));
2551     assert(!(r3  & ~0x7fL));
2552     assert(!(r2  & ~0x7fL));
2553     assert(!(r1  & ~0x7fL));
2554     TSTREG2(r2, r3);
2555     TSTPRED(_p);
2556     TSTREG1(r1);
2557     inst((4L<<37)|(pos<<31)|(len<<27)|(r3<<20)|(r2<<13)|(r1<<6)|_p, INST_I);
2558     SETREG(r1);
2559 }
2560
2561 static void
2562 _I16(jit_state_t *_jit, jit_word_t _p,
2563      jit_word_t tb, jit_word_t ta, jit_word_t p2,
2564      jit_word_t r3, jit_word_t ps, jit_word_t c, jit_word_t p1)
2565 {
2566     assert(!(_p & ~0x3fL));
2567     assert(!(tb &  ~0x1L));
2568     assert(!(ta &  ~0x1L));
2569     assert(!(p2 & ~0x7fL));
2570     assert(!(r3 & ~0x7fL));
2571     assert(!(ps & ~0x3fL));
2572     assert(!(c  &  ~0x1L));
2573     assert(!(p1 & ~0x3fL));
2574     TSTREG1(r3);
2575     TSTPRED(_p);
2576     inst((5L<<37)|(tb<<36)|(ta<<33)|(p2<<27)|
2577          (r3<<20)|(ps<<14)|(c<<12)|(p1<<6), INST_I);
2578     if (p1)
2579         _jitc->pred |= 1 << p1;
2580     if (p2)
2581         _jitc->pred |= 1 << p2;
2582 }
2583
2584 static void
2585 _I17(jit_state_t *_jit, jit_word_t _p,
2586      jit_word_t tb, jit_word_t ta, jit_word_t p2,
2587      jit_word_t r3, jit_word_t c, jit_word_t p1)
2588 {
2589     assert(!(_p & ~0x3fL));
2590     assert(!(tb &  ~0x1L));
2591     assert(!(ta &  ~0x1L));
2592     assert(!(p2 & ~0x7fL));
2593     assert(!(r3 & ~0x7fL));
2594     assert(!(c  &  ~0x1L));
2595     assert(!(p1 & ~0x3fL));
2596     TSTREG1(r3);
2597     TSTPRED(_p);
2598     inst((5L<<37)|(tb<<36)|(ta<<33)|(p2<<27)|
2599          (r3<<20)|(1L<<13)|(c<<12)|(p1<<6)|_p, INST_I);
2600     if (p1)
2601         _jitc->pred |= 1 << p1;
2602     if (p2)
2603         _jitc->pred |= 1 << p2;
2604 }
2605
2606 static void
2607 _I18(jit_state_t *_jit, jit_word_t _p,
2608      jit_word_t im, jit_word_t y)
2609 {
2610     assert(!(_p &     ~0x3fL));
2611     assert(!(im & ~0x1fffffL));
2612     assert(!(y  &      ~0x1L));
2613     TSTPRED(_p);
2614     inst((((im>>20)&1L)<<26)|(1L<<27)|(y<<26)|((im&0xffffL)<<6)|_p, INST_I);
2615 }
2616
2617 static void
2618 _I19(jit_state_t *_jit, jit_word_t _p,
2619      jit_word_t im)
2620 {
2621     assert(!(_p &     ~0x3fL));
2622     assert(!(im & ~0x1fffffL));
2623     TSTPRED(_p);
2624     inst(((im>>20)&1L)|((im&0xffffL)<<6)|_p, INST_I);
2625 }
2626
2627 static void
2628 _I20(jit_state_t *_jit, jit_word_t _p,
2629      jit_word_t r2, jit_word_t im)
2630 {
2631     assert(!(_p &     ~0x3fL));
2632     assert(!(r2 &     ~0x7fL));
2633     assert(!(im & ~0x1fffffL));
2634     TSTREG1(r2);
2635     TSTPRED(_p);
2636     inst(((im>>20)&1L)|(1L<<33)|(((im>>7)&0x1fffL)<<20)|
2637          (r2<<13)|((im&0x7fL)<<6)|_p, INST_I);
2638 }
2639
2640 static void
2641 _I21(jit_state_t *_jit, jit_word_t _p,
2642      jit_word_t im, jit_word_t ih, jit_word_t x,
2643      jit_word_t wh, jit_word_t r2, jit_word_t b1)
2644 {
2645     assert(!(_p &     ~0x3fL));
2646     assert(!(im &    ~0x1ffL));
2647     assert(!(ih &      ~0x1L));
2648     assert(!(x  &      ~0x1L));
2649     assert(!(wh &      ~0x3L));
2650     assert(!(r2 &     ~0x7fL));
2651     assert(!(b1 &      ~0x7L));
2652     TSTREG1(r2);
2653     TSTPRED(_p);
2654     inst((7L<<33)|(im<<24)|(ih<<23)|(x<<22)|(wh<<20)|
2655          (r2<<13)|(b1<<6), INST_I);
2656 }
2657
2658 static void
2659 _I22(jit_state_t *_jit, jit_word_t _p,
2660      jit_word_t b2, jit_word_t r1)
2661 {
2662     assert(!(_p & ~0x3fL));
2663     assert(!(b2 &  ~0x7L));
2664     assert(!(r1 & ~0x7fL));
2665     TSTPRED(_p);
2666     inst((0x31L<<27)|(b2<<13)|(r1<<6)|_p, INST_I);
2667 }
2668
2669 static void
2670 _I23(jit_state_t *_jit, jit_word_t _p,
2671      jit_word_t r2, jit_word_t im)
2672 {
2673     assert(!(_p &   ~0x3fL));
2674     assert(!(r2 &   ~0x7fL));
2675     assert(!(im & ~0xffffL));
2676     TSTREG1(r2);
2677     TSTPRED(_p);
2678     inst((((im>>15)&1L)<<36)|(3L<<33)|(((im>>7)&0xffL)<<24)|
2679          (r2<<13)|(im&0x7fL)|_p, INST_I);
2680 }
2681
2682 static void
2683 _I24(jit_state_t *_jit, jit_word_t _p,
2684      jit_word_t im)
2685 {
2686     jit_uint8_t         cc = INST_I;
2687     assert(!(_p &      ~0x3fL));
2688     assert(!(im & ~0xfffffffL));
2689     TSTPRED(_p);
2690     inst((((im>>27)&1L)<<36)|(2L<<33)|((im&0x7ffffffL)<<6)|_p, cc);
2691 }
2692
2693 static void
2694 _I25(jit_state_t *_jit, jit_word_t _p,
2695      jit_word_t x6, jit_word_t r1)
2696 {
2697     assert(!(_p & ~0x3fL));
2698     assert(!(x6 & ~0x3fL));
2699     assert(!(r1 & ~0x7fL));
2700     TSTPRED(_p);
2701     TSTREG1(r1);
2702     inst((x6<<27)|(r1<<6)|_p, INST_I);
2703     SETREG(r1);
2704 }
2705
2706 static void
2707 _I26(jit_state_t *_jit, jit_word_t _p,
2708      jit_word_t ar,jit_word_t r2)
2709 {
2710     assert(!(_p & ~0x3fL));
2711     assert(!(ar & ~0x7fL));
2712     assert(!(r2 & ~0x7fL));
2713     TSTREG1(r2);
2714     TSTPRED(_p);
2715     inst((0x2aL<<27)|(ar<<20)|(r2<<13)|_p, INST_I);
2716 }
2717
2718 static void
2719 _I27(jit_state_t *_jit, jit_word_t _p,
2720      jit_word_t ar,jit_word_t im)
2721 {
2722     assert(!(_p & ~0x3fL));
2723     assert(!(ar & ~0x7fL));
2724     assert(!(im & ~0xffL));
2725     TSTPRED(_p);
2726     inst((((im>>7)&1L)<<36)|(0xaL<<27)|(ar<<20)|((im&0x7fL)<<13)|_p, INST_I);
2727 }
2728
2729 static void
2730 _I28(jit_state_t *_jit, jit_word_t _p,
2731      jit_word_t ar, jit_word_t r1)
2732 {
2733     assert(!(_p & ~0x3fL));
2734     assert(!(ar & ~0x7fL));
2735     assert(!(r1 & ~0x7fL));
2736     TSTPRED(_p);
2737     TSTREG1(r1);
2738     inst((0x32L<<27)|(ar<<20)|(r1<<6)|_p, INST_I);
2739     SETREG(r1);
2740 }
2741
2742 static void
2743 _I29(jit_state_t *_jit, jit_word_t _p,
2744      jit_word_t x6, jit_word_t r3,jit_word_t r1)
2745 {
2746     assert(!(_p & ~0x3fL));
2747     assert(!(x6 & ~0x3fL));
2748     assert(!(r3 & ~0x7fL));
2749     assert(!(r1 & ~0x7fL));
2750     TSTREG1(r3);
2751     TSTPRED(_p);
2752     TSTREG1(r1);
2753     inst((x6<<27)|(r3<<20)|(r1<<6)|_p, INST_I);
2754     SETREG(r1);
2755 }
2756
2757 static void
2758 _I30(jit_state_t *_jit, jit_word_t _p,
2759      jit_word_t ta, jit_word_t tb, jit_word_t p2,
2760      jit_word_t im, jit_word_t c, jit_word_t p1)
2761 {
2762     assert(!(_p & ~0x3fL));
2763     assert(!(ta &  ~0x1L));
2764     assert(!(tb &  ~0x1L));
2765     assert(!(p2 & ~0x3fL));
2766     assert(!(im & ~0x1fL));
2767     assert(!(c  &  ~0x1L));
2768     assert(!(p1 & ~0x1fL));
2769     TSTPRED(_p);
2770     inst((5L<<37)|(tb<<36)|(ta<<33)|(1L<<19)|(im<<14)|
2771          (1L<<13)|(c<<12)|(p1<<6)|_p, INST_I);
2772     if (p1)
2773         _jitc->pred |= 1 << p1;
2774     if (p2)
2775         _jitc->pred |= 1 << p2;
2776 }
2777
2778 static void
2779 _M1(jit_state_t *_jit, jit_word_t _p,
2780     jit_word_t x6, jit_word_t ht, jit_word_t x, jit_word_t r3, jit_word_t r1)
2781 {
2782     assert(!(_p & ~0x3fL));
2783     assert(!(x6 & ~0x3fL));
2784     assert(!(ht &  ~0x3L));
2785     assert(!(x  &  ~0x1L));
2786     assert(!(r3 & ~0x7fL));
2787     assert(!(r1 & ~0x7fL));
2788     TSTREG1(r3);
2789     TSTPRED(_p);
2790     TSTREG1(r1);
2791     inst((4L<<37)|(x6<<30)|(ht<<28)|(x<<27)|(r3<<20)|(r1<<6)|_p, INST_M);
2792     SETREG(r1);
2793 }
2794
2795 static void
2796 _M2(jit_state_t *_jit, jit_word_t _p,
2797     jit_word_t x6, jit_word_t ht, jit_word_t r3, jit_word_t r2, jit_word_t r1)
2798 {
2799     assert(!(_p & ~0x3fL));
2800     assert(!(x6 & ~0x3fL));
2801     assert(!(ht &  ~0x3L));
2802     assert(!(r3 & ~0x7fL));
2803     assert(!(r2 & ~0x7fL));
2804     assert(!(r1 & ~0x7fL));
2805     TSTREG2(r2, r3);
2806     TSTPRED(_p);
2807     TSTREG1(r1);
2808     inst((4L<<37)|(1L<<36)|(x6<<30)|(ht<<28)|
2809          (r3<<20)|(r2<<13)|(r1<<6)|_p, INST_M);
2810     SETREG(r1);
2811     SETREG(r3);
2812 }
2813
2814 static void
2815 _M3(jit_state_t *_jit, jit_word_t _p,
2816     jit_word_t x6, jit_word_t ht, jit_word_t r3, jit_word_t im, jit_word_t r1)
2817 {
2818     jit_uint8_t         cc = INST_M;
2819     assert(!(_p &  ~0x3fL));
2820     assert(!(x6 &  ~0x3fL));
2821     assert(!(ht &   ~0x3L));
2822     assert(!(r3 &  ~0x7fL));
2823     assert(im > -256 && im <= 255);
2824     assert(!(r1 &  ~0x7fL));
2825     TSTREG1(r3);
2826     TSTPRED(_p);
2827     TSTREG1(r1);
2828     inst((5L<<37)|(((im>>8)&1L)<<36)|(x6<<30)|(ht<<28)|
2829          (((im>>7)&1L)<<27)|(r3<<20)|((im&0x7fL)<<13)|(r1<<6)|_p, cc);
2830     SETREG(r1);
2831     SETREG(r3);
2832 }
2833
2834 static void
2835 _M5(jit_state_t *_jit, jit_word_t _p,
2836     jit_word_t x6, jit_word_t ht, jit_word_t r3, jit_word_t r2, jit_word_t im)
2837 {
2838     assert(!(_p &  ~0x3fL));
2839     assert(!(x6 &  ~0x3fL));
2840     assert(!(ht &   ~0x3L));
2841     assert(!(r3 &  ~0x7fL));
2842     assert(!(r2 &  ~0x7fL));
2843     assert(im > -256 && im <= 255);
2844     TSTREG2(r2, r3);
2845     TSTPRED(_p);
2846     inst((5L<<37)|(((im>>8)&1L)<<36)|(x6<<30)|(ht<<28)|
2847          (((im>>7)&1L)<<27)|(r3<<20)|(r2<<13)|((im&0x7fL)<<6)|_p, INST_M);
2848     SETREG(r3);
2849 }
2850
2851 static void
2852 _M6(jit_state_t *_jit, jit_word_t _p,
2853     jit_word_t x6, jit_word_t ht, jit_word_t x, jit_word_t r3, jit_word_t r2)
2854 {
2855     assert(!(_p & ~0x3fL));
2856     assert(!(x6 & ~0x3fL));
2857     assert(!(ht &  ~0x3L));
2858     assert(!(x  &  ~0x1L));
2859     assert(!(r3 & ~0x7fL));
2860     assert(!(r2 & ~0x7fL));
2861     TSTREG2(r2, r3);
2862     TSTPRED(_p);
2863     inst((4L<<37)|(x6<<30)|(ht<<28)|(x<<27)|(r3<<20)|(r2<<13)|_p, INST_M);
2864 }
2865
2866 static void
2867 _M13(jit_state_t *_jit, jit_word_t _p,
2868      jit_word_t x6, jit_word_t ht, jit_word_t r3, jit_word_t r2)
2869 {
2870     assert(!(_p & ~0x3fL));
2871     assert(!(x6 & ~0x3fL));
2872     assert(!(ht &  ~0x3L));
2873     assert(!(r3 & ~0x7fL));
2874     assert(!(r2 & ~0x7fL));
2875     TSTREG1(r3);
2876     if (r2)
2877         TSTFREG1(r2);
2878     TSTPRED(_p);
2879     inst((6L<<37)|(x6<<30)|(ht<<28)|(r3<<20)|(r2<<13)|_p, INST_M);
2880 }
2881
2882 static void
2883 _M14(jit_state_t *_jit, jit_word_t _p,
2884      jit_word_t x6, jit_word_t ht, jit_word_t r3, jit_word_t r2)
2885 {
2886     assert(!(_p & ~0x3fL));
2887     assert(!(x6 & ~0x3fL));
2888     assert(!(ht &  ~0x3L));
2889     assert(!(r3 & ~0x7fL));
2890     assert(!(r2 & ~0x7fL));
2891     TSTREG2(r2, r3);
2892     TSTPRED(_p);
2893     inst((6L<<37)|(1L<<36)|(x6<<30)|(ht<<28)|(r3<<20)|(r2<<13)|_p, INST_M);
2894 }
2895
2896 static void
2897 _M15(jit_state_t *_jit, jit_word_t _p,
2898      jit_word_t x6, jit_word_t ht, jit_word_t r3, jit_word_t im)
2899 {
2900     assert(!(_p &  ~0x3fL));
2901     assert(!(x6 &  ~0x3fL));
2902     assert(!(ht &   ~0x3L));
2903     assert(!(r3 &  ~0x7fL));
2904     assert(!(im & ~0x1ffL));
2905     TSTREG1(r3);
2906     TSTPRED(_p);
2907     inst((7L<<37)|(((im>>8)&1L)<<36)|(x6<<30)|(ht<<28)|
2908          (((im>>7)&1L)<<27)|(r3<<20)|((im&0x7fL)<<13)|_p, INST_M);
2909 }
2910
2911 static void
2912 _M16(jit_state_t *_jit, jit_word_t _p,
2913      jit_word_t x6, jit_word_t ht, jit_word_t r3, jit_word_t r2, jit_word_t r1)
2914 {
2915     assert(!(_p & ~0x3fL));
2916     assert(!(x6 & ~0x3fL));
2917     assert(!(ht &  ~0x3L));
2918     assert(!(r3 & ~0x7fL));
2919     assert(!(r2 & ~0x7fL));
2920     assert(!(r1 & ~0x7fL));
2921     TSTREG2(r2, r3);
2922     TSTPRED(_p);
2923     TSTREG1(r1);
2924     inst((4L<<37)|(x6<<30)|(ht<<28)|(1L<<27)|
2925          (r3<<20)|(r2<<13)|(r1<<6)|_p, INST_M);
2926     SETREG(r1);
2927 }
2928
2929 static void
2930 _M17(jit_state_t *_jit, jit_word_t _p,
2931      jit_word_t x6, jit_word_t ht, jit_word_t r3, jit_word_t im, jit_word_t r1)
2932 {
2933     assert(!(_p & ~0x3fL));
2934     assert(!(x6 & ~0x3fL));
2935     assert(!(ht &  ~0x3L));
2936     assert(!(r3 & ~0x7fL));
2937     assert(!(im &  ~0x7L));
2938     assert(!(r1 & ~0x7fL));
2939     TSTREG1(r3);
2940     TSTPRED(_p);
2941     TSTREG1(r1);
2942     inst((4L<<37)|(x6<<30)|(ht<<28)|(1L<<27)|
2943          (r3<<20)|(im<<13)|(r1<<6)|_p, INST_M);
2944     SETREG(r1);
2945 }
2946
2947 static void
2948 _M20x(jit_state_t *_jit, jit_word_t _p,
2949       jit_word_t x3, jit_word_t r2, jit_word_t im)
2950 {
2951     assert(!(_p &     ~0x3fL));
2952     assert(!(x3 &      ~0x7L));
2953     assert(!(r2 &     ~0x7fL));
2954     assert(!(im & ~0x1fffffL));
2955     if (x3 == 1)
2956         TSTREG1(r2);
2957     else
2958         TSTFREG1(r2);
2959     TSTPRED(_p);
2960     inst((1L<<37)|(((im>>20)&1L)<<36)|(x3<<33)|
2961          (((im>>7)&0x1fffL)<<20)|(r2<<13)|((im&0x7fL)<<6)|_p, INST_M);
2962 }
2963
2964 static void
2965 _M22x(jit_state_t *_jit, jit_word_t _p,
2966       jit_word_t x3, jit_word_t im, jit_word_t r1)
2967 {
2968     assert(!(_p &     ~0x3fL));
2969     assert(!(x3 &      ~0x7L));
2970     assert(!(im & ~0x1fffffL));
2971     assert(!(r1 &     ~0x7fL));
2972     TSTPRED(_p);
2973     if (x3 < 6)
2974         TSTREG1(r1);
2975     else
2976         TSTFREG1(r1);
2977     inst((((im>>20)&1L)<<36)|(x3<<33)|((im&0xffffL)<<13)|(r1<<6)|_p, INST_M);
2978     if (x3 < 6)
2979         SETREG(r1);
2980     else
2981         SETFREG(r1);
2982 }
2983
2984 static void
2985 _M24(jit_state_t *_jit, jit_word_t _p,
2986      jit_word_t x2, jit_word_t x4)
2987 {
2988     assert(!(_p & ~0x3fL));
2989     assert(!(x2 &  ~0x3L));
2990     assert(!(x4 &  ~0xfL));
2991     TSTPRED(_p);
2992     inst((x2<<31)|(x4<<27)|_p, INST_M);
2993 }
2994
2995 static void
2996 _M26x(jit_state_t *_jit, jit_word_t _p,
2997       jit_word_t x4, jit_word_t r1)
2998 {
2999     assert(!(_p & ~0x3fL));
3000     assert(!(x4 &  ~0xfL));
3001     assert(!(r1 & ~0x7fL));
3002     if (x4 == 2)
3003         TSTREG1(r1);
3004     else
3005         TSTFREG1(r1);
3006     TSTPRED(_p);
3007     inst((1L<<31)|(x4<<27)|(r1<<6)|_p, INST_M);
3008 }
3009
3010 static void
3011 _M28(jit_state_t *_jit, jit_word_t _p,
3012      jit_word_t x, jit_word_t r3)
3013 {
3014     assert(!(_p & ~0x3fL));
3015     assert(!(x  &  ~0x1L));
3016     assert(!(r3 & ~0x7fL));
3017     TSTREG1(r3);
3018     TSTPRED(_p);
3019     inst((1L<<37)|(x<<36)|(0x30L<<27)|(r3<<20)|_p, INST_M);
3020 }
3021
3022 static void
3023 _M29(jit_state_t *_jit, jit_word_t _p,
3024      jit_word_t ar, jit_word_t r2)
3025 {
3026     assert(!(_p & ~0x3fL));
3027     assert(!(ar  & ~0x7L));
3028     assert(!(r2 & ~0x7fL));
3029     TSTREG1(r2);
3030     TSTPRED(_p);
3031     inst((1L<<37)|(0x2aL<<27)|(ar<<20)|(r2<<13)|_p, INST_M);
3032 }
3033
3034 static void
3035 _M30(jit_state_t *_jit, jit_word_t _p,
3036      jit_word_t ar, jit_word_t im)
3037 {
3038     assert(!(_p & ~0x3fL));
3039     assert(!(ar  & ~0x7L));
3040     assert(!(im & ~0xffL));
3041     TSTPRED(_p);
3042     inst((((im>>7)&1L)<<36)|(2L<<31)|(0x8L<<27)|
3043          (ar<<20)|((im&0x7fL)<<13)|_p, INST_M);
3044 }
3045
3046 static void
3047 _M31(jit_state_t *_jit, jit_word_t _p,
3048      jit_word_t ar, jit_word_t r1)
3049 {
3050     assert(!(_p & ~0x3fL));
3051     assert(!(ar  & ~0x7L));
3052     assert(!(r1 & ~0x7fL));
3053     TSTPRED(_p);
3054     TSTREG1(r1);
3055     inst((1L<<37)|(0x22L<<27)|(ar<<20)|(r1<<6)|_p, INST_M);
3056     SETREG(r1);
3057 }
3058
3059 static void
3060 _M32(jit_state_t *_jit, jit_word_t _p,
3061      jit_word_t cr, jit_word_t r2)
3062 {
3063     assert(!(_p & ~0x3fL));
3064     assert(!(cr  & ~0x7L));
3065     assert(!(r2 & ~0x7fL));
3066     TSTREG1(r2);
3067     TSTPRED(_p);
3068     inst((1L<<37)|(0x2cL<<27)|(cr<<20)|(r2<<13)|_p, INST_M);
3069 }
3070
3071 static void
3072 _M33(jit_state_t *_jit, jit_word_t _p,
3073      jit_word_t cr, jit_word_t r1)
3074 {
3075     assert(!(_p & ~0x3fL));
3076     assert(!(cr  & ~0x7L));
3077     assert(!(r1 & ~0x7fL));
3078     TSTPRED(_p);
3079     TSTREG1(r1);
3080     inst((1L<<37)|(0x24L<<27)|(cr<<20)|(r1<<6)|_p, INST_M);
3081     SETREG(r1);
3082 }
3083
3084 static void
3085 _M34(jit_state_t *_jit, jit_word_t _p,
3086      jit_word_t sor, jit_word_t sol, jit_word_t sof, jit_word_t r1)
3087 {
3088     assert(!(_p  & ~0x3fL));
3089     assert(!(sor &  ~0xfL));
3090     assert(!(sol & ~0x7fL));
3091     assert(!(sof & ~0x7fL));
3092     assert(!(r1  & ~0x7fL));
3093     TSTPRED(_p);
3094     inst((1L<<37)|(6L<<33)|(sor<<27)|(sol<<20)|(sof<<13)|(r1<<6)|_p, INST_M);
3095 }
3096
3097 static void
3098 _M35(jit_state_t *_jit, jit_word_t _p,
3099      jit_word_t x6, jit_word_t r2)
3100 {
3101     assert(!(_p & ~0x3fL));
3102     assert(!(x6 & ~0x3fL));
3103     assert(!(r2 & ~0x7fL));
3104     TSTREG1(r2);
3105     TSTPRED(_p);
3106     inst((1L<<37)|(x6<<27)|(r2<<13)|_p, INST_M);
3107 }
3108
3109 static void
3110 _M36(jit_state_t *_jit, jit_word_t _p,
3111      jit_word_t x6, jit_word_t r1)
3112 {
3113     assert(!(_p & ~0x3fL));
3114     assert(!(x6 & ~0x3fL));
3115     assert(!(r1 & ~0x7fL));
3116     TSTPRED(_p);
3117     TSTREG1(r1);
3118     inst((1L<<37)|(x6<<27)|(r1<<6)|_p, INST_M);
3119     SETREG(r1);
3120 }
3121
3122 static void
3123 _M37(jit_state_t *_jit, jit_word_t _p,
3124      jit_word_t im)
3125 {
3126     assert(!(_p &    ~0x3fL));
3127     assert(!(im & ~0x1ffffL));
3128     TSTPRED(_p);
3129     inst((((im>>20)&1L)<<36)|((im&0xffffL)<<6)|_p, INST_M);
3130 }
3131
3132 static void
3133 _M38(jit_state_t *_jit, jit_word_t _p,
3134      jit_word_t x6, jit_word_t r3, jit_word_t r2, jit_word_t r1)
3135 {
3136     assert(!(_p &  ~0x3fL));
3137     assert(!(x6 &  ~0x3fL));
3138     assert(!(r3 &  ~0x7fL));
3139     assert(!(r2 &  ~0x7fL));
3140     assert(!(r1 &  ~0x7fL));
3141     TSTREG2(r2, r3);
3142     TSTPRED(_p);
3143     TSTREG1(r1);
3144     inst((1L<<37)|(x6<<27)|(r3<<20)|(r2<<13)|(r1<<6)|_p, INST_M);
3145     SETREG(r1);
3146 }
3147
3148 static void
3149 _M39(jit_state_t *_jit, jit_word_t _p,
3150      jit_word_t x6, jit_word_t r3, jit_word_t im, jit_word_t r1)
3151 {
3152     assert(!(_p &  ~0x3fL));
3153     assert(!(x6 &  ~0x3fL));
3154     assert(!(r3 &  ~0x7fL));
3155     assert(!(im &   ~0x7L));
3156     assert(!(r1 &  ~0x7fL));
3157     TSTREG1(r3);
3158     TSTPRED(_p);
3159     TSTREG1(r1);
3160     inst((1L<<37)|(x6<<27)|(r3<<20)|(im<<13)|(r1<<6)|_p, INST_M);
3161     SETREG(r1);
3162 }
3163
3164 static void
3165 _M40(jit_state_t *_jit, jit_word_t _p,
3166      jit_word_t x6, jit_word_t r3, jit_word_t im)
3167 {
3168     assert(!(_p &  ~0x3fL));
3169     assert(!(x6 &  ~0x3fL));
3170     assert(!(r3 &  ~0x7fL));
3171     assert(!(im &   ~0x7L));
3172     TSTREG1(r3);
3173     TSTPRED(_p);
3174     inst((1L<<37)|(x6<<27)|(r3<<20)|(im<<13)|_p, INST_M);
3175 }
3176
3177 static void
3178 _M41(jit_state_t *_jit, jit_word_t _p,
3179      jit_word_t x6, jit_word_t r2)
3180 {
3181     assert(!(_p &  ~0x3fL));
3182     assert(!(x6 &  ~0x3fL));
3183     assert(!(r2 &  ~0x7fL));
3184     TSTREG1(r2);
3185     TSTPRED(_p);
3186     inst((1L<<37)|(x6<<27)|(r2<<13)|_p, INST_M);
3187 }
3188
3189 static void
3190 _M42(jit_state_t *_jit, jit_word_t _p,
3191      jit_word_t x6, jit_word_t r3, jit_word_t r2)
3192 {
3193     assert(!(_p &  ~0x3fL));
3194     assert(!(x6 &  ~0x3fL));
3195     assert(!(r3 &  ~0x7fL));
3196     assert(!(r2 &  ~0x7fL));
3197     TSTREG1(r2);
3198     TSTPRED(_p);
3199     inst((1L<<37)|(x6<<27)|(r3<<20)|(r2<<13)|_p, INST_M);
3200 }
3201
3202 static void
3203 _M43(jit_state_t *_jit, jit_word_t _p,
3204      jit_word_t x6, jit_word_t r3, jit_word_t r1)
3205 {
3206     assert(!(_p &  ~0x3fL));
3207     assert(!(x6 &  ~0x3fL));
3208     assert(!(r3 &  ~0x7fL));
3209     assert(!(r1 &  ~0x7fL));
3210     TSTPRED(_p);
3211     TSTREG1(r1);
3212     inst((1L<<37)|(x6<<27)|(r3<<20)|(r1<<6)|_p, INST_M);
3213     SETREG(r1);
3214 }
3215
3216 static void
3217 _M44(jit_state_t *_jit, jit_word_t _p,
3218      jit_word_t x4, jit_word_t im)
3219 {
3220     assert(!(_p &    ~0x3fL));
3221     assert(!(x4 &     ~0xfL));
3222     assert(!(im & ~0xfffffL));
3223     TSTPRED(_p);
3224     inst((((im>>23)&1L)<<36)|(((im>>21)&3L)<<31)|
3225          (x4<<27)|((im&0x1ffffL)<<6)|_p, INST_M);
3226 }
3227
3228 static void
3229 _M45(jit_state_t *_jit, jit_word_t _p,
3230      jit_word_t x6, jit_word_t r3, jit_word_t r2)
3231 {
3232     assert(!(_p &  ~0x3fL));
3233     assert(!(x6 &  ~0x3fL));
3234     assert(!(r3 &  ~0x7fL));
3235     assert(!(r2 &  ~0x7fL));
3236     TSTREG2(r2, r3);
3237     TSTPRED(_p);
3238     inst((1L<<37)|(x6<<27)|(r3<<20)|(r2<<13)|_p, INST_M);
3239 }
3240
3241 static void
3242 _M46(jit_state_t *_jit, jit_word_t _p,
3243      jit_word_t x6, jit_word_t r3, jit_word_t r1)
3244 {
3245     assert(!(_p & ~0x3fL));
3246     assert(!(x6 & ~0x3fL));
3247     assert(!(r3 & ~0x7fL));
3248     assert(!(r1 & ~0x7fL));
3249     TSTREG1(r3);
3250     TSTPRED(_p);
3251     if (r1)     TSTREG1(r1);
3252     inst((1L<<37)|(x6<<27)|(r3<<20)|(r1<<6)|_p, INST_M);
3253     if (r1)     SETREG(r1);
3254 }
3255
3256 static void
3257 _M48(jit_state_t *_jit, jit_word_t _p,
3258      jit_word_t y, jit_word_t im)
3259 {
3260     assert(!(_p &    ~0x3fL));
3261     assert(!(y  &     ~0x1L));
3262     assert(!(im & ~0x1ffffL));
3263     TSTPRED(_p);
3264     inst((((im>>20)&1L)<<36)|(1L<<27)|(y<<26)|((im&0xffffL)<<6)|_p, INST_M);
3265 }
3266
3267 static void
3268 _B1(jit_state_t *_jit, jit_word_t _p,
3269     jit_word_t d, jit_word_t wh, jit_word_t im, jit_word_t p, jit_word_t tp)
3270 {
3271     assert(!(_p &    ~0x3fL));
3272     assert(!(d  &     ~0x1L));
3273     assert(!(wh &     ~0x3L));
3274     assert(im >= -1048576 && im <= 1048575);
3275     assert(!(p  &     ~0x1L));
3276     assert(!(tp &     ~0x7L));
3277     TSTPRED(_p);
3278     inst((4L<<37)|(((im>>20)&1L)<<36)|(d<<35)|(wh<<33)|
3279          ((im&0xfffffL)<<13)|(p<<12)|(tp<<6)|_p, INST_B);
3280 }
3281
3282 static void
3283 _B3(jit_state_t *_jit, jit_word_t _p,
3284     jit_word_t d, jit_word_t wh, jit_word_t im, jit_word_t p, jit_word_t b)
3285 {
3286     assert(!(_p &    ~0x3fL));
3287     assert(!(d  &     ~0x1L));
3288     assert(!(wh &     ~0x3L));
3289     assert(im >= -1048576 && im <= 1048575);
3290     assert(!(p  &     ~0x1L));
3291     assert(!(b  &     ~0x3L));
3292     TSTPRED(_p);
3293     inst((5L<<37)|(((im>>20)&1L)<<36)|(d<<35)|(wh<<33)|
3294          ((im&0xfffffL)<<13)|(p<<12)|(b<<6)|_p, INST_B);
3295 }
3296
3297 static void
3298 _B4(jit_state_t *_jit, jit_word_t _p,
3299     jit_word_t d, jit_word_t wh, jit_word_t x6,
3300     jit_word_t b, jit_word_t p, jit_word_t tp)
3301 {
3302     assert(!(_p & ~0x3fL));
3303     assert(!(d  &  ~0x1L));
3304     assert(!(wh &  ~0x3L));
3305     assert(!(x6 & ~0x3fL));
3306     assert(!(b  &  ~0x7L));
3307     assert(!(p  &  ~0x1L));
3308     assert(!(tp &  ~0x7L));
3309     TSTPRED(_p);
3310     inst((d<<35)|(wh<<33)|(x6<<27)|(b<<13)|(p<<12)|(tp<<6)|_p, INST_B);
3311 }
3312
3313 static void
3314 _B5(jit_state_t *_jit, jit_word_t _p,
3315     jit_word_t d, jit_word_t wh, jit_word_t b2, jit_word_t p, jit_word_t b1)
3316 {
3317     assert(!(_p & ~0x3fL));
3318     assert(!(d  &  ~0x1L));
3319     assert(!(wh &  ~0x3L));
3320     assert(!(b2 &  ~0x7L));
3321     assert(!(p  &  ~0x1L));
3322     assert(!(b1 &  ~0x7L));
3323     TSTPRED(_p);
3324     inst((1L<<37)|(d<<35)|(wh<<32)|(b2<<13)|(p<<12)|(b1<<6)|_p, INST_B);
3325 }
3326
3327 static void
3328 _B6(jit_state_t *_jit, jit_word_t _p,
3329     jit_word_t ih, jit_word_t im, jit_word_t tag, jit_word_t wh)
3330 {
3331     assert(!(_p &     ~0x3fL));
3332     assert(!(ih  &     ~0x1L));
3333     assert(!(im  & ~0x1ffffL));
3334     assert(!(tag &   ~0x1ffL));
3335     assert(!(wh  &     ~0x3L));
3336     TSTPRED(_p);
3337     inst((7L<<37)|(((im>>20)&1L)<<36)|(ih<<35)|(((tag>>7)&3L)<<33)|
3338          ((im&0xfffffL)<<13)|((tag&0x7fL)<<6)|(wh<<3)|_p, INST_B);
3339 }
3340
3341 static void
3342 _B7(jit_state_t *_jit, jit_word_t _p,
3343     jit_word_t ih, jit_word_t x6, jit_word_t b2, jit_word_t tag, jit_word_t wh)
3344 {
3345     assert(!(_p &   ~0x3fL));
3346     assert(!(ih  &   ~0x1L));
3347     assert(!(x6  &  ~0x3fL));
3348     assert(!(b2  &   ~0x7L));
3349     assert(!(tag & ~0x1ffL));
3350     assert(!(wh  &   ~0x3L));
3351     TSTPRED(_p);
3352     inst((2L<<37)|(ih<<35)|(((tag>>7)&3L)<<33)|(x6<<27)|
3353          (b2<<13)|((tag&0x7fL)<<6)|(wh<<3)|_p, INST_B);
3354 }
3355
3356 static void
3357 _B8(jit_state_t *_jit, jit_word_t _p,
3358     jit_word_t x6)
3359 {
3360     assert(!(_p & ~0x3fL));
3361     assert(!(x6 & ~0x3fL));
3362     TSTPRED(_p);
3363     inst((x6<<27)|_p, INST_B);
3364 }
3365
3366 static void
3367 _B9(jit_state_t *_jit, jit_word_t _p,
3368     jit_word_t op, jit_word_t x6, jit_word_t im)
3369 {
3370     assert(!(_p &    ~0x3fL));
3371     assert(!(op &     ~0xfL));
3372     assert(!(x6 &    ~0x3fL));
3373     assert(!(im & ~0x1ffffL));
3374     TSTPRED(_p);
3375     inst((op<<37)|(((im>>20)&1L)<<36)|(x6<<27)|((im&0xffffL)<<6)|_p, INST_B);
3376 }
3377
3378 static void
3379 _X1(jit_state_t *_jit, jit_word_t _p,
3380     jit_word_t im)
3381 {
3382     jit_word_t          i41, i1, i20;
3383     assert(!(_p &               ~0x3fL));
3384     assert(im > -0x2000000000000000 && im <= 0x1fffffffffffffff);
3385     i41 = (im >> 22) & 0x1ffffffffffL;
3386     i1  = (im >> 21) &           0x1L;
3387     i20 =  im        &       0xfffffL;
3388     TSTPRED(_p);
3389     inst(i41, INST_L);
3390     inst((i1<<36)|(i20<<6)|_p, INST_X);
3391 }
3392
3393 static void
3394 _X2(jit_state_t *_jit, jit_word_t _p,
3395     jit_word_t r1, jit_word_t im)
3396 {
3397     jit_word_t          i1, i41, ic, i5, i9, i7;
3398     assert(!(_p & ~0x3fL));
3399     assert(!(r1 & ~0x7fL));
3400     i1  = (im >> 63) &           0x1L;
3401     i41 = (im >> 22) & 0x1ffffffffffL;
3402     ic  = (im >> 21) &           0x1L;
3403     i5  = (im >> 16) &          0x1fL;
3404     i9  = (im >>  7) &         0x1ffL;
3405     i7  =  im        &          0x7fL;
3406     TSTPRED(_p);
3407     TSTREG1(r1);
3408     inst(i41, INST_L);
3409     inst((6L<<37)|(i1<<36)|(i9<<27)|(i5<<22)|
3410          (ic<<21)|(i7<<13)|(r1<<6)|_p, INST_X);
3411     SETREG(r1);
3412 }
3413
3414 static void
3415 _X3x(jit_state_t *_jit, jit_word_t _p,
3416      jit_word_t op, jit_word_t d, jit_word_t wh,
3417      jit_word_t p, jit_word_t tp, jit_word_t im)
3418 {
3419     /* target64 = IP + ((i1 << 59 | imm39 << 20 | imm20b) << 4) */
3420     jit_word_t          i1, i41, i20;
3421     assert(!(_p &               ~0x3fL));
3422     assert(!(op &                ~0xfL));
3423     assert(!(d  &                ~0x1L));
3424     assert(!(wh &                ~0x3L));
3425     assert(!(p  &                ~0x1L));
3426     assert(!(tp &                ~0x7L));
3427     i1  = (im >> 61) &           0x1L;
3428     i41 = (im >> 22) & 0x1ffffffffffL;
3429     i20 =  im        &       0xfffffL;
3430     TSTPRED(_p);
3431     inst(i41, INST_L);
3432     inst((op<<37)|(i1<<36)|(d<<35)|(wh<<33)|
3433          (i20<<13)|(p<<12)|(tp<<6)|_p, INST_X);
3434 }
3435
3436 static void
3437 _X5(jit_state_t *_jit, jit_word_t _p,
3438     jit_word_t y, jit_word_t im)
3439 {
3440     jit_word_t          i41, i1, i20;
3441     assert(!(_p &               ~0x3fL));
3442     assert(im > -0x2000000000000000 && im <= 0x1fffffffffffffff);
3443     i41 = (im >> 22) & 0x1ffffffffffL;
3444     i1  = (im >> 21) &           0x1L;
3445     i20 =  im        &       0xfffffL;
3446     TSTPRED(_p);
3447     inst(i41, INST_L);
3448     inst((i1<<36)|(1L<<27)|(y<<26)|(i20<<6)|_p, INST_X);
3449 }
3450
3451 static void
3452 _movr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
3453 {
3454     /* patch pushargr */
3455     if (r0 >= 120)
3456         r0 = _jitc->rout + (r0 - 120);
3457
3458     MOV(r0, r1);
3459 }
3460
3461 static void
3462 _movi(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
3463 {
3464     /* patch pushargi */
3465     if (r0 >= 120)
3466         r0 = _jitc->rout + (r0 - 120);
3467
3468     if (i0 >= -2097152 && i0 <= 2097151)
3469         MOVI(r0, i0);
3470     else
3471         MOVL(r0, i0);
3472 }
3473
3474 static jit_word_t
3475 _movi_p(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
3476 {
3477     jit_word_t          w;
3478     sync();
3479     w = _jit->pc.w;
3480     MOVL(r0, i0);
3481     return (w);
3482 }
3483
3484 static void
3485 _movnr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
3486 {
3487     jit_word_t  w;
3488     w = beqi(_jit->pc.w, r2, 0);
3489     movr(r0, r1);
3490     patch_at(w, _jit->pc.w);
3491 }
3492
3493 static void
3494 _movzr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
3495 {
3496     jit_word_t  w;
3497     w = bnei(_jit->pc.w, r2, 0);
3498     movr(r0, r1);
3499     patch_at(w, _jit->pc.w);
3500 }
3501
3502 static void
3503 _bswapr_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
3504 {
3505         bswapr_ul(r0, r1);
3506         rshi_u(r0, r0, 48);
3507 }
3508
3509 static void
3510 _bswapr_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
3511 {
3512         bswapr_ul(r0, r1);
3513         rshi_u(r0, r0, 32);
3514 }
3515
3516 static void
3517 _addi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
3518 {
3519     jit_int32_t         reg;
3520     if (i0 >= -8192 && i0 <= 8191)
3521         ADDS(r0, i0, r1);
3522     else if (!(r1 & ~3) && i0 >= -2097152 && i0 <= 2097151)
3523         ADDL(r1, i0, r0);
3524     else {
3525         reg = jit_get_reg(jit_class_gpr);
3526         movi(rn(reg), i0);
3527         addr(r0, r1, rn(reg));
3528         jit_unget_reg(reg);
3529     }
3530 }
3531
3532 static void
3533 _addcr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
3534 {
3535     jit_int32_t         reg;
3536     if (jit_carry == _NOREG)
3537         jit_carry = jit_get_reg(jit_class_gpr);
3538     if (r0 == r1) {
3539         reg = jit_get_reg(jit_class_gpr);
3540         addr(rn(reg), r1, r2);
3541         ltr_u(rn(jit_carry), rn(reg), r1);
3542         movr(r0, rn(reg));
3543         jit_unget_reg(reg);
3544     }
3545     else {
3546         addr(r0, r1, r2);
3547         ltr_u(rn(jit_carry), r0, r1);
3548     }
3549 }
3550
3551 static void
3552 _addci(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
3553 {
3554     jit_int32_t         reg;
3555     if (jit_carry == _NOREG)
3556         jit_carry = jit_get_reg(jit_class_gpr);
3557     if (r0 == r1) {
3558         reg = jit_get_reg(jit_class_gpr);
3559         addi(rn(reg), r1, i0);
3560         ltr_u(rn(jit_carry), rn(reg), r1);
3561         movr(r0, rn(reg));
3562         jit_unget_reg(reg);
3563     }
3564     else {
3565         addi(r0, r1, i0);
3566         ltr_u(rn(jit_carry), r0, r1);
3567     }
3568 }
3569
3570 static void
3571 _addxr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
3572 {
3573     jit_int32_t         reg;
3574     assert(jit_carry != _NOREG);
3575     reg = jit_get_reg(jit_class_gpr);
3576     movr(rn(reg), rn(jit_carry));
3577     addcr(r0, r1, r2);
3578     addcr(r0, r0, rn(reg));
3579     jit_unget_reg(reg);
3580 }
3581
3582 static void
3583 _addxi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
3584 {
3585     jit_int32_t         reg;
3586     assert(jit_carry != _NOREG);
3587     reg = jit_get_reg(jit_class_gpr);
3588     movr(rn(reg), rn(jit_carry));
3589     addci(r0, r1, i0);
3590     addcr(r0, r0, rn(reg));
3591     jit_unget_reg(reg);
3592 }
3593
3594 static void
3595 _subi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
3596 {
3597     jit_int32_t         reg;
3598     reg = jit_get_reg(jit_class_gpr);
3599     movi(rn(reg), i0);
3600     subr(r0, r1, rn(reg));
3601     jit_unget_reg(reg);
3602 }
3603
3604 static void
3605 _subcr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
3606 {
3607     jit_int32_t         reg;
3608     if (jit_carry == _NOREG)
3609         jit_carry = jit_get_reg(jit_class_gpr);
3610     if (r0 == r1) {
3611         reg = jit_get_reg(jit_class_gpr);
3612         subr(rn(reg), r1, r2);
3613         ltr_u(rn(jit_carry), r1, rn(reg));
3614         movr(r0, rn(reg));
3615         jit_unget_reg(reg);
3616     }
3617     else {
3618         subr(r0, r1, r2);
3619         ltr_u(rn(jit_carry), r1, r0);
3620     }
3621 }
3622
3623 static void
3624 _subci(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
3625 {
3626     jit_int32_t         reg;
3627     if (jit_carry == _NOREG)
3628         jit_carry = jit_get_reg(jit_class_gpr);
3629     if (r0 == r1) {
3630         reg = jit_get_reg(jit_class_gpr);
3631         addi(rn(reg), r1, -i0);
3632         ltr_u(rn(jit_carry), r1, rn(reg));
3633         movr(r0, rn(reg));
3634         jit_unget_reg(reg);
3635     }
3636     else {
3637         addi(r0, r1, -i0);
3638         ltr_u(rn(jit_carry), r1, r0);
3639     }
3640 }
3641
3642 static void
3643 _subxr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
3644 {
3645     jit_int32_t         reg;
3646     assert(jit_carry != _NOREG);
3647     reg = jit_get_reg(jit_class_gpr);
3648     movr(rn(reg), rn(jit_carry));
3649     subcr(r0, r1, r2);
3650     subcr(r0, r0, rn(reg));
3651     jit_unget_reg(reg);
3652 }
3653
3654 static void
3655 _subxi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
3656 {
3657     jit_int32_t         reg;
3658     assert(jit_carry != _NOREG);
3659     reg = jit_get_reg(jit_class_gpr);
3660     movr(rn(reg), rn(jit_carry));
3661     subci(r0, r1, i0);
3662     subcr(r0, r0, rn(reg));
3663     jit_unget_reg(reg);
3664 }
3665
3666 static void
3667 _rsbi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
3668 {
3669     jit_int32_t         reg;
3670     if (i0 >= -128 && i0 <= 127)
3671         SUBI(r0, i0, r1);
3672     else if (!(r1 & ~3) && i0 >= -2097151 && i0 <= 2097152)
3673         ADDL(r1, -i0, r0);
3674     else {
3675         reg = jit_get_reg(jit_class_gpr);
3676         movi(rn(reg), i0);
3677         subr(r0, rn(reg), r1);
3678         jit_unget_reg(reg);
3679     }
3680 }
3681
3682 static void
3683 _mulr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
3684 {
3685     jit_int32_t         f0, f1;
3686     f0 = jit_get_reg(jit_class_fpr);
3687     f1 = jit_get_reg(jit_class_fpr);
3688     SETF_SIG(rn(f0), r1);
3689     SETF_SIG(rn(f1), r2);
3690     XMPY_L(rn(f0), rn(f0), rn(f1));
3691     GETF_SIG(r0, rn(f0));
3692     jit_unget_reg(f0);
3693     jit_unget_reg(f1);
3694 }
3695
3696 static void
3697 _muli(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
3698 {
3699     jit_int32_t         reg;
3700     reg = jit_get_reg(jit_class_gpr);
3701     movi(rn(reg), i0);
3702     mulr(r0, r1, rn(reg));
3703     jit_unget_reg(reg);
3704 }
3705
3706 #if !defined(__GNUC__)
3707 static long
3708 __divdi3(long u, long v)
3709 {
3710     return (u / v);
3711 }
3712
3713 static unsigned long
3714 __udivdi3(unsigned long u, unsigned long v)
3715 {
3716     return (u / v);
3717 }
3718
3719 static long
3720 __moddi3(long u, long v)
3721 {
3722     return (u % v);
3723 }
3724
3725 static unsigned long
3726 __umoddi3(unsigned long u, unsigned long v)
3727 {
3728     return (u % v);
3729 }
3730 #endif
3731
3732 static void
3733 _divr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
3734 {
3735     MOV(_jitc->rout, r1);
3736     MOV(_jitc->rout + 1, r2);
3737     calli((jit_word_t)__divdi3);
3738     MOV(r0, GR_8);
3739 }
3740
3741 static void
3742 _divi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
3743 {
3744     jit_int32_t         reg;
3745     switch (i0) {
3746         case 1:
3747             movr(r0, r1);
3748             return;
3749         case -1:
3750             negr(r0, r1);
3751             return;
3752         default:
3753             if (i0 > 0 && !(i0 & (i0 - 1))) {
3754                 movr(r0, r1);
3755                 rshi(r0, r0, ffsl(i0) - 1);
3756                 return;
3757             }
3758             break;
3759     }
3760     reg = jit_get_reg(jit_class_gpr);
3761     movi(rn(reg), i0);
3762     divr(r0, r1, rn(reg));
3763     jit_unget_reg(reg);
3764 }
3765
3766 static void
3767 _divr_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
3768 {
3769     MOV(_jitc->rout, r1);
3770     MOV(_jitc->rout + 1, r2);
3771     calli((jit_word_t)__udivdi3);
3772     MOV(r0, GR_8);
3773 }
3774
3775 static void
3776 _divi_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
3777 {
3778     jit_int32_t         reg;
3779     if (i0 == 1) {
3780         movr(r0, r1);
3781         return;
3782     }
3783     else if (i0 > 0 && !(i0 & (i0 - 1))) {
3784         movr(r0, r1);
3785         rshi_u(r0, r0, ffsl(i0) - 1);
3786         return;
3787     }
3788     reg = jit_get_reg(jit_class_gpr);
3789     movi(rn(reg), i0);
3790     divr_u(r0, r1, rn(reg));
3791     jit_unget_reg(reg);
3792 }
3793
3794 static void
3795 _remr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
3796 {
3797     MOV(_jitc->rout, r1);
3798     MOV(_jitc->rout + 1, r2);
3799     calli((jit_word_t)__moddi3);
3800     MOV(r0, GR_8);
3801 }
3802
3803 static void
3804 _remi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
3805 {
3806     jit_int32_t         reg;
3807     if (i0 == 1 || i0 == -1) {
3808         MOV(r0, GR_0);
3809         return;
3810     }
3811     reg = jit_get_reg(jit_class_gpr);
3812     movi(rn(reg), i0);
3813     remr(r0, r1, rn(reg));
3814     jit_unget_reg(reg);
3815 }
3816
3817 static void
3818 _remr_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
3819 {
3820     MOV(_jitc->rout, r1);
3821     MOV(_jitc->rout + 1, r2);
3822     calli((jit_word_t)__umoddi3);
3823     MOV(r0, GR_8);
3824 }
3825
3826 static void
3827 _remi_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
3828 {
3829     jit_int32_t         reg;
3830     if (i0 == 1) {
3831         MOV(r0, GR_0);
3832         return;
3833     }
3834     else if (i0 > 0 && !(i0 & (i0 - 1))) {
3835         andi(r0, r1, i0 - 1);
3836         return;
3837     }
3838     reg = jit_get_reg(jit_class_gpr);
3839     movi(rn(reg), i0);
3840     remr_u(r0, r1, rn(reg));
3841     jit_unget_reg(reg);
3842 }
3843
3844 static void
3845 _mulh(jit_state_t *_jit,
3846       jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_bool_t sign)
3847 {
3848     jit_int32_t         f0, f1;
3849     f0 = jit_get_reg(jit_class_fpr);
3850     f1 = jit_get_reg(jit_class_fpr);
3851     SETF_SIG(rn(f0), r1);
3852     SETF_SIG(rn(f1), r2);
3853     if (sign)
3854         XMPY_H(rn(f0), rn(f0), rn(f1));
3855     else
3856         XMPY_HU(rn(f0), rn(f0), rn(f1));
3857     GETF_SIG(r0, rn(f0));
3858     jit_unget_reg(f0);
3859     jit_unget_reg(f1);
3860 }
3861
3862 static void
3863 _iqmulr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1,
3864         jit_int32_t r2, jit_int32_t r3, jit_bool_t sign)
3865 {
3866     jit_int32_t         reg;
3867     if (r0 == r2 || r0 == r3) {
3868         reg = jit_get_reg(jit_class_gpr);
3869         mulr(rn(reg), r2, r3);
3870     }
3871     else
3872         mulr(r0, r2, r3);
3873     mulh(r1, r2, r3, sign);
3874     if (r0 == r2 || r0 == r3) {
3875         movr(r0, rn(reg));
3876         jit_unget_reg(reg);
3877     }
3878 }
3879
3880 static void
3881 _iqmuli(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1,
3882         jit_int32_t r2, jit_word_t i0, jit_bool_t sign)
3883 {
3884     jit_int32_t         reg;
3885     reg = jit_get_reg(jit_class_gpr);
3886     movi(rn(reg), i0);
3887     iqmulr(r0, r1, r2, rn(reg), sign);
3888     jit_unget_reg(reg);
3889 }
3890
3891 static void
3892 _iqdivr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1,
3893         jit_int32_t r2, jit_int32_t r3, jit_bool_t sign)
3894 {
3895     jit_int32_t         sv0, rg0;
3896     jit_int32_t         sv1, rg1;
3897
3898     if (r0 == r2 || r0 == r3) {
3899         sv0 = jit_get_reg(jit_class_gpr);
3900         rg0 = rn(sv0);
3901     }
3902     else
3903         rg0 = r0;
3904     if (r1 == r2 || r1 == r3) {
3905         sv1 = jit_get_reg(jit_class_gpr);
3906         rg1 = rn(sv1);
3907     }
3908     else
3909         rg1 = r1;
3910
3911     if (sign)
3912         divr(rg0, r2, r3);
3913     else
3914         divr_u(rg0, r2, r3);
3915     mulr(rg1, r3, rg0);
3916     subr(rg1, r2, rg1);
3917     if (rg0 != r0) {
3918         movr(r0, rg0);
3919         jit_unget_reg(sv0);
3920     }
3921     if (rg1 != r1) {
3922         movr(r1, rg1);
3923         jit_unget_reg(sv1);
3924     }
3925 }
3926
3927 static void
3928 _iqdivi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1,
3929         jit_int32_t r2, jit_word_t i0, jit_bool_t sign)
3930 {
3931     jit_int32_t         reg;
3932     reg = jit_get_reg(jit_class_gpr);
3933     movi(rn(reg), i0);
3934     iqdivr(r0, r1, r2, rn(reg), sign);
3935     jit_unget_reg(reg);
3936 }
3937
3938 static void
3939 _andi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
3940 {
3941     jit_int32_t         reg;
3942     if (i0 >= -128 && i0 <= 127)
3943         ANDI(r0, i0, r1);
3944     else if (~i0 >= -128 && ~i0 <= 127)
3945         ANDCMI(r0, ~i0, r1);
3946     else {
3947         reg = jit_get_reg(jit_class_gpr);
3948         movi(rn(reg), i0);
3949         andr(r0, r1, rn(reg));
3950         jit_unget_reg(reg);
3951     }
3952 }
3953
3954 static void
3955 _ori(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
3956 {
3957     jit_int32_t         reg;
3958     if (i0 >= -128 && i0 <= 127)
3959         ORI(r0, i0, r1);
3960     else {
3961         reg = jit_get_reg(jit_class_gpr);
3962         movi(rn(reg), i0);
3963         orr(r0, r1, rn(reg));
3964         jit_unget_reg(reg);
3965     }
3966 }
3967
3968 static void
3969 _xori(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
3970 {
3971     jit_int32_t         reg;
3972     if (i0 >= -128 && i0 <= 127)
3973         XORI(r0, i0, r1);
3974     else {
3975         reg = jit_get_reg(jit_class_gpr);
3976         movi(rn(reg), i0);
3977         xorr(r0, r1, rn(reg));
3978         jit_unget_reg(reg);
3979     }
3980 }
3981
3982 static void
3983 _lshi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
3984 {
3985     jit_int32_t         reg;
3986     reg = jit_get_reg(jit_class_gpr);
3987     movi(rn(reg), i0);
3988     lshr(r0, r1, rn(reg));
3989     jit_unget_reg(reg);
3990 }
3991
3992 static void
3993 _rshi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
3994 {
3995     jit_int32_t         reg;
3996     reg = jit_get_reg(jit_class_gpr);
3997     movi(rn(reg), i0);
3998     rshr(r0, r1, rn(reg));
3999     jit_unget_reg(reg);
4000 }
4001
4002 static void
4003 _rshi_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
4004 {
4005     jit_int32_t         reg;
4006     reg = jit_get_reg(jit_class_gpr);
4007     movi(rn(reg), i0);
4008     rshr_u(r0, r1, rn(reg));
4009     jit_unget_reg(reg);
4010 }
4011
4012 static void
4013 _ltr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
4014 {
4015     CMP_LT(PR_6, PR_7, r1, r2);
4016     MOVI_p(r0, 1, PR_6);
4017     MOV_p(r0, GR_0, PR_7);
4018 }
4019
4020 static void
4021 _lti(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
4022 {
4023     jit_int32_t         reg;
4024     if (i0 >= -127 && i0 <= 128)
4025         CMPI_LT(PR_7, PR_6, i0 - 1, r1);
4026     else {
4027         reg = jit_get_reg(jit_class_gpr);
4028         movi(rn(reg), i0);
4029         CMP_LT(PR_6, PR_7, r1, rn(reg));
4030         jit_unget_reg(reg);
4031     }
4032     MOVI_p(r0, 1, PR_6);
4033     MOV_p(r0, GR_0, PR_7);
4034 }
4035
4036 static void
4037 _ltr_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
4038 {
4039     CMP_LTU(PR_6, PR_7, r1, r2);
4040     MOVI_p(r0, 1, PR_6);
4041     MOV_p(r0, GR_0, PR_7);
4042 }
4043
4044 static void
4045 _lti_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
4046 {
4047     jit_int32_t         reg;
4048     if (i0 >= -127 && i0 <= 128)
4049         CMPI_LTU(PR_7, PR_6, i0 - 1, r1);
4050     else {
4051         reg = jit_get_reg(jit_class_gpr);
4052         movi(rn(reg), i0);
4053         CMP_LTU(PR_6, PR_7, r1, rn(reg));
4054         jit_unget_reg(reg);
4055     }
4056     MOVI_p(r0, 1, PR_6);
4057     MOV_p(r0, GR_0, PR_7);
4058 }
4059
4060 static void
4061 _ler(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
4062 {
4063     CMP_LT(PR_6, PR_7, r2, r1);
4064     MOV_p(r0, GR_0, PR_6);
4065     MOVI_p(r0, 1, PR_7);
4066 }
4067
4068 static void
4069 _lei(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
4070 {
4071     jit_int32_t         reg;
4072     reg = jit_get_reg(jit_class_gpr);
4073     movi(rn(reg), i0);
4074     ler(r0, r1, rn(reg));
4075     jit_unget_reg(reg);
4076 }
4077
4078 static void
4079 _ler_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
4080 {
4081     CMP_LTU(PR_6, PR_7, r2, r1);
4082     MOV_p(r0, GR_0, PR_6);
4083     MOVI_p(r0, 1, PR_7);
4084 }
4085
4086 static void
4087 _lei_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
4088 {
4089     jit_int32_t         reg;
4090     reg = jit_get_reg(jit_class_gpr);
4091     movi(rn(reg), i0);
4092     ler_u(r0, r1, rn(reg));
4093     jit_unget_reg(reg);
4094 }
4095
4096 static void
4097 _eqr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
4098 {
4099     CMP_EQ(PR_6, PR_7, r1, r2);
4100     MOVI_p(r0, 1, PR_6);
4101     MOV_p(r0, GR_0, PR_7);
4102 }
4103
4104 static void
4105 _eqi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
4106 {
4107     jit_int32_t         reg;
4108     if (i0 >= -128 && i0 <= 127)
4109         CMPI_EQ(PR_6, PR_7, i0, r1);
4110     else {
4111         reg = jit_get_reg(jit_class_gpr);
4112         movi(rn(reg), i0);
4113         CMP_EQ(PR_6, PR_7, r1, rn(reg));
4114         jit_unget_reg(reg);
4115     }
4116     MOVI_p(r0, 1, PR_6);
4117     MOV_p(r0, GR_0, PR_7);
4118 }
4119
4120 static void
4121 _ger(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
4122 {
4123     CMP_LT(PR_6, PR_7, r1, r2);
4124     MOV_p(r0, GR_0, PR_6);
4125     MOVI_p(r0, 1, PR_7);
4126 }
4127
4128 static void
4129 _gei(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
4130 {
4131     jit_int32_t         reg;
4132     if (i0 >= -127 && i0 <= 128)
4133         CMPI_LT(PR_7, PR_6, i0 - 1, r1);
4134     else {
4135         reg = jit_get_reg(jit_class_gpr);
4136         movi(rn(reg), i0);
4137         CMP_LT(PR_6, PR_7, r1, rn(reg));
4138         jit_unget_reg(reg);
4139     }
4140     MOV_p(r0, GR_0, PR_6);
4141     MOVI_p(r0, 1, PR_7);
4142 }
4143
4144 static void
4145 _ger_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
4146 {
4147     CMP_LTU(PR_6, PR_7, r1, r2);
4148     MOV_p(r0, GR_0, PR_6);
4149     MOVI_p(r0, 1, PR_7);
4150 }
4151
4152 static void
4153 _gei_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
4154 {
4155     jit_int32_t         reg;
4156     if (i0 >= -127 && i0 <= 128)
4157         CMPI_LTU(PR_7, PR_6, i0 - 1, r1);
4158     else {
4159         reg = jit_get_reg(jit_class_gpr);
4160         movi(rn(reg), i0);
4161         CMP_LTU(PR_6, PR_7, r1, rn(reg));
4162         jit_unget_reg(reg);
4163     }
4164     MOV_p(r0, GR_0, PR_6);
4165     MOVI_p(r0, 1, PR_7);
4166 }
4167
4168 static void
4169 _gtr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
4170 {
4171     CMP_LT(PR_6, PR_7, r2, r1);
4172     MOVI_p(r0, 1, PR_6);
4173     MOV_p(r0, GR_0, PR_7);
4174 }
4175
4176 static void
4177 _gti(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
4178 {
4179     jit_int32_t         reg;
4180     reg = jit_get_reg(jit_class_gpr);
4181     movi(rn(reg), i0);
4182     gtr(r0, r1, rn(reg));
4183     jit_unget_reg(reg);
4184 }
4185
4186 static void
4187 _gtr_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
4188 {
4189     CMP_LTU(PR_6, PR_7, r2, r1);
4190     MOVI_p(r0, 1, PR_6);
4191     MOV_p(r0, GR_0, PR_7);
4192 }
4193
4194 static void
4195 _gti_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
4196 {
4197     jit_int32_t         reg;
4198     reg = jit_get_reg(jit_class_gpr);
4199     movi(rn(reg), i0);
4200     gtr_u(r0, r1, rn(reg));
4201     jit_unget_reg(reg);
4202 }
4203
4204 static void
4205 _ner(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
4206 {
4207     CMP_EQ(PR_6, PR_7, r1, r2);
4208     MOV_p(r0, GR_0, PR_6);
4209     MOVI_p(r0, 1, PR_7);
4210 }
4211
4212 static void
4213 _nei(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
4214 {
4215     jit_int32_t         reg;
4216     if (i0 >= -128 && i0 <= 127)
4217         CMPI_EQ(PR_6, PR_7, i0, r1);
4218     else {
4219         reg = jit_get_reg(jit_class_gpr);
4220         movi(rn(reg), i0);
4221         CMP_EQ(PR_6, PR_7, r1, rn(reg));
4222         jit_unget_reg(reg);
4223     }
4224     MOV_p(r0, GR_0, PR_6);
4225     MOVI_p(r0, 1, PR_7);
4226 }
4227
4228 static void
4229 _ldr_c(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
4230 {
4231     ldr_uc(r0, r1);
4232     extr_c(r0, r0);
4233 }
4234
4235 static void
4236 _ldi_c(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
4237 {
4238     jit_int32_t         reg;
4239     reg = jit_get_reg(jit_class_gpr);
4240     movi(rn(reg), i0);
4241     ldr_c(r0, rn(reg));
4242     jit_unget_reg(reg);
4243 }
4244
4245 static void
4246 _ldi_uc(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
4247 {
4248     jit_int32_t         reg;
4249     reg = jit_get_reg(jit_class_gpr);
4250     movi(rn(reg), i0);
4251     ldr_uc(r0, rn(reg));
4252     jit_unget_reg(reg);
4253 }
4254
4255 static void
4256 _ldr_s(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
4257 {
4258     ldr_us(r0, r1);
4259     extr_s(r0, r0);
4260 }
4261
4262 static void
4263 _ldi_s(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
4264 {
4265     jit_int32_t         reg;
4266     reg = jit_get_reg(jit_class_gpr);
4267     movi(rn(reg), i0);
4268     ldr_s(r0, rn(reg));
4269     jit_unget_reg(reg);
4270 }
4271
4272 static void
4273 _ldi_us(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
4274 {
4275     jit_int32_t         reg;
4276     reg = jit_get_reg(jit_class_gpr);
4277     movi(rn(reg), i0);
4278     ldr_us(r0, rn(reg));
4279     jit_unget_reg(reg);
4280 }
4281
4282 static void
4283 _ldr_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
4284 {
4285     ldr_ui(r0, r1);
4286     extr_i(r0, r0);
4287 }
4288
4289 static void
4290 _ldi_i(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
4291 {
4292     jit_int32_t         reg;
4293     reg = jit_get_reg(jit_class_gpr);
4294     movi(rn(reg), i0);
4295     ldr_i(r0, rn(reg));
4296     jit_unget_reg(reg);
4297 }
4298
4299 static void
4300 _ldi_ui(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
4301 {
4302     jit_int32_t         reg;
4303     reg = jit_get_reg(jit_class_gpr);
4304     movi(rn(reg), i0);
4305     ldr_ui(r0, rn(reg));
4306     jit_unget_reg(reg);
4307 }
4308
4309 static void
4310 _ldi_l(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
4311 {
4312     jit_int32_t         reg;
4313     reg = jit_get_reg(jit_class_gpr);
4314     movi(rn(reg), i0);
4315     ldr_l(r0, rn(reg));
4316     jit_unget_reg(reg);
4317 }
4318
4319 static void
4320 _ldxr_c(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
4321 {
4322     jit_int32_t         reg;
4323     reg = jit_get_reg(jit_class_gpr);
4324     addr(rn(reg), r1, r2);
4325     ldr_c(r0, rn(reg));
4326     jit_unget_reg(reg);
4327 }
4328
4329 static void
4330 _ldxi_c(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
4331 {
4332     jit_int32_t         reg;
4333     if (i0) {
4334         reg = jit_get_reg(jit_class_gpr);
4335         movi(rn(reg), i0);
4336         ldxr_c(r0, r1, rn(reg));
4337         jit_unget_reg(reg);
4338     }
4339     else
4340         ldr_c(r0, r1);
4341 }
4342
4343 static void
4344 _ldxr_uc(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
4345 {
4346     jit_int32_t         reg;
4347     reg = jit_get_reg(jit_class_gpr);
4348     addr(rn(reg), r1, r2);
4349     ldr_uc(r0, rn(reg));
4350     jit_unget_reg(reg);
4351 }
4352
4353 static void
4354 _ldxi_uc(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
4355 {
4356     jit_int32_t         reg;
4357     if (i0) {
4358         reg = jit_get_reg(jit_class_gpr);
4359         movi(rn(reg), i0);
4360         ldxr_uc(r0, r1, rn(reg));
4361         jit_unget_reg(reg);
4362     }
4363     else
4364         ldr_uc(r0, r1);
4365 }
4366
4367 static void
4368 _ldxr_s(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
4369 {
4370     jit_int32_t         reg;
4371     reg = jit_get_reg(jit_class_gpr);
4372     addr(rn(reg), r1, r2);
4373     ldr_s(r0, rn(reg));
4374     jit_unget_reg(reg);
4375 }
4376
4377 static void
4378 _ldxi_s(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
4379 {
4380     jit_int32_t         reg;
4381     if (i0) {
4382         reg = jit_get_reg(jit_class_gpr);
4383         movi(rn(reg), i0);
4384         ldxr_s(r0, r1, rn(reg));
4385         jit_unget_reg(reg);
4386     }
4387     else
4388         ldr_s(r0, r1);
4389 }
4390
4391 static void
4392 _ldxr_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
4393 {
4394     jit_int32_t         reg;
4395     reg = jit_get_reg(jit_class_gpr);
4396     addr(rn(reg), r1, r2);
4397     ldr_us(r0, rn(reg));
4398     jit_unget_reg(reg);
4399 }
4400
4401 static void
4402 _ldxi_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
4403 {
4404     jit_int32_t         reg;
4405     if (i0) {
4406         reg = jit_get_reg(jit_class_gpr);
4407         movi(rn(reg), i0);
4408         ldxr_us(r0, r1, rn(reg));
4409         jit_unget_reg(reg);
4410     }
4411     else
4412         ldr_us(r0, r1);
4413 }
4414
4415 static void
4416 _ldxr_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
4417 {
4418     jit_int32_t         reg;
4419     reg = jit_get_reg(jit_class_gpr);
4420     addr(rn(reg), r1, r2);
4421     ldr_i(r0, rn(reg));
4422     jit_unget_reg(reg);
4423 }
4424
4425 static void
4426 _ldxi_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
4427 {
4428     jit_int32_t         reg;
4429     if (i0) {
4430         reg = jit_get_reg(jit_class_gpr);
4431         movi(rn(reg), i0);
4432         ldxr_i(r0, r1, rn(reg));
4433         jit_unget_reg(reg);
4434     }
4435     else
4436         ldr_i(r0, r1);
4437 }
4438
4439 static void
4440 _ldxr_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
4441 {
4442     jit_int32_t         reg;
4443     reg = jit_get_reg(jit_class_gpr);
4444     addr(rn(reg), r1, r2);
4445     ldr_ui(r0, rn(reg));
4446     jit_unget_reg(reg);
4447 }
4448
4449 static void
4450 _ldxi_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
4451 {
4452     jit_int32_t         reg;
4453     if (i0) {
4454         reg = jit_get_reg(jit_class_gpr);
4455         movi(rn(reg), i0);
4456         ldxr_ui(r0, r1, rn(reg));
4457         jit_unget_reg(reg);
4458     }
4459     else
4460         ldr_ui(r0, r1);
4461 }
4462
4463 static void
4464 _ldxr_l(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
4465 {
4466     jit_int32_t         reg;
4467     reg = jit_get_reg(jit_class_gpr);
4468     addr(rn(reg), r1, r2);
4469     ldr_l(r0, rn(reg));
4470     jit_unget_reg(reg);
4471 }
4472
4473 static void
4474 _ldxi_l(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
4475 {
4476     jit_int32_t         reg;
4477     if (i0) {
4478         reg = jit_get_reg(jit_class_gpr);
4479         movi(rn(reg), i0);
4480         ldxr_l(r0, r1, rn(reg));
4481         jit_unget_reg(reg);
4482     }
4483     else
4484         ldr_l(r0, r1);
4485 }
4486
4487 static void
4488 _sti_c(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
4489 {
4490     jit_int32_t         reg;
4491     reg = jit_get_reg(jit_class_gpr);
4492     movi(rn(reg), i0);
4493     str_c(rn(reg), r0);
4494     jit_unget_reg(reg);
4495 }
4496
4497 static void
4498 _sti_s(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
4499 {
4500     jit_int32_t         reg;
4501     reg = jit_get_reg(jit_class_gpr);
4502     movi(rn(reg), i0);
4503     str_s(rn(reg), r0);
4504     jit_unget_reg(reg);
4505 }
4506
4507 static void
4508 _sti_i(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
4509 {
4510     jit_int32_t         reg;
4511     reg = jit_get_reg(jit_class_gpr);
4512     movi(rn(reg), i0);
4513     str_i(rn(reg), r0);
4514     jit_unget_reg(reg);
4515 }
4516
4517 static void
4518 _sti_l(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
4519 {
4520     jit_int32_t         reg;
4521     reg = jit_get_reg(jit_class_gpr);
4522     movi(rn(reg), i0);
4523     str_l(rn(reg), r0);
4524     jit_unget_reg(reg);
4525 }
4526
4527 static void
4528 _stxr_c(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
4529 {
4530     jit_int32_t         reg;
4531     reg = jit_get_reg(jit_class_gpr);
4532     addr(rn(reg), r0, r1);
4533     str_c(rn(reg), r2);
4534     jit_unget_reg(reg);
4535 }
4536
4537 static void
4538 _stxi_c(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
4539 {
4540     jit_int32_t         reg;
4541     if (i0) {
4542         reg = jit_get_reg(jit_class_gpr);
4543         addi(rn(reg), r0, i0);
4544         str_c(rn(reg), r1);
4545         jit_unget_reg(reg);
4546     }
4547     else
4548         str_c(r0, r1);
4549 }
4550
4551 static void
4552 _stxr_s(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
4553 {
4554     jit_int32_t         reg;
4555     reg = jit_get_reg(jit_class_gpr);
4556     addr(rn(reg), r0, r1);
4557     str_s(rn(reg), r2);
4558     jit_unget_reg(reg);
4559 }
4560
4561 static void
4562 _stxi_s(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
4563 {
4564     jit_int32_t         reg;
4565     if (i0) {
4566         reg = jit_get_reg(jit_class_gpr);
4567         addi(rn(reg), r0, i0);
4568         str_s(rn(reg), r1);
4569         jit_unget_reg(reg);
4570     }
4571     else
4572         str_s(r0, r1);
4573 }
4574
4575 static void
4576 _stxr_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
4577 {
4578     jit_int32_t         reg;
4579     reg = jit_get_reg(jit_class_gpr);
4580     addr(rn(reg), r0, r1);
4581     str_i(rn(reg), r2);
4582     jit_unget_reg(reg);
4583 }
4584
4585 static void
4586 _stxi_i(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
4587 {
4588     jit_int32_t         reg;
4589     if (i0) {
4590         reg = jit_get_reg(jit_class_gpr);
4591         addi(rn(reg), r0, i0);
4592         str_i(rn(reg), r1);
4593         jit_unget_reg(reg);
4594     }
4595     else
4596         str_i(r0, r1);
4597 }
4598
4599 static void
4600 _stxr_l(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
4601 {
4602     jit_int32_t         reg;
4603     reg = jit_get_reg(jit_class_gpr);
4604     addr(rn(reg), r0, r1);
4605     str_l(rn(reg), r2);
4606     jit_unget_reg(reg);
4607 }
4608
4609 static void
4610 _stxi_l(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
4611 {
4612     jit_int32_t         reg;
4613     if (i0) {
4614         reg = jit_get_reg(jit_class_gpr);
4615         addi(rn(reg), r0, i0);
4616         str_l(rn(reg), r1);
4617         jit_unget_reg(reg);
4618     }
4619     else
4620         str_l(r0, r1);
4621 }
4622
4623 static jit_word_t
4624 _bltr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
4625 {
4626     jit_word_t          w;
4627     CMP_LT(PR_6, PR_7, r0, r1);
4628     sync();
4629     w = _jit->pc.w;
4630     BRI_COND((i0 - w) >> 4, PR_6);
4631     return (w);
4632 }
4633
4634 static jit_word_t
4635 _blti(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
4636 {
4637     jit_word_t          w;
4638     jit_int32_t         reg;
4639     if (i1 >= -127 && i1 <= 128)
4640         CMPI_LT(PR_7, PR_6, i1 - 1, r0);
4641     else {
4642         reg = jit_get_reg(jit_class_gpr);
4643         movi(rn(reg), i1);
4644         CMP_LT(PR_6, PR_7, r0, rn(reg));
4645         jit_unget_reg(reg);
4646     }
4647     sync();
4648     w = _jit->pc.w;
4649     BRI_COND((i0 - w) >> 4, PR_6);
4650     return (w);
4651 }
4652
4653 static jit_word_t
4654 _bltr_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
4655 {
4656     jit_word_t          w;
4657     CMP_LTU(PR_6, PR_7, r0, r1);
4658     sync();
4659     w = _jit->pc.w;
4660     BRI_COND((i0 - w) >> 4, PR_6);
4661     return (w);
4662 }
4663
4664 static jit_word_t
4665 _blti_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
4666 {
4667     jit_word_t          w;
4668     jit_int32_t         reg;
4669     if (i1 >= -127 && i1 <= 128)
4670         CMPI_LTU(PR_7, PR_6, i1 - 1, r0);
4671     else {
4672         reg = jit_get_reg(jit_class_gpr);
4673         movi(rn(reg), i1);
4674         CMP_LTU(PR_6, PR_7, r0, rn(reg));
4675         jit_unget_reg(reg);
4676     }
4677     sync();
4678     w = _jit->pc.w;
4679     BRI_COND((i0 - w) >> 4, PR_6);
4680     return (w);
4681 }
4682
4683 static jit_word_t
4684 _bler(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
4685 {
4686     jit_word_t          w;
4687     CMP_LT(PR_6, PR_7, r1, r0);
4688     sync();
4689     w = _jit->pc.w;
4690     BRI_COND((i0 - w) >> 4, PR_7);
4691     return (w);
4692 }
4693
4694 static jit_word_t
4695 _blei(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
4696 {
4697     jit_word_t          w;
4698     jit_int32_t         reg;
4699     reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
4700     movi(rn(reg), i1);
4701     w = bler(i0, r0, rn(reg));
4702     jit_unget_reg(reg);
4703     return (w);
4704 }
4705
4706 static jit_word_t
4707 _bler_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
4708 {
4709     jit_word_t          w;
4710     CMP_LTU(PR_6, PR_7, r1, r0);
4711     sync();
4712     w = _jit->pc.w;
4713     BRI_COND((i0 - w) >> 4, PR_7);
4714     return (w);
4715 }
4716
4717 static jit_word_t
4718 _blei_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
4719 {
4720     jit_word_t          w;
4721     jit_int32_t         reg;
4722     reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
4723     movi(rn(reg), i1);
4724     w = bler_u(i0, r0, rn(reg));
4725     jit_unget_reg(reg);
4726     return (w);
4727 }
4728
4729 static jit_word_t
4730 _beqr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
4731 {
4732     jit_word_t          w;
4733     CMP_EQ(PR_6, PR_7, r0, r1);
4734     sync();
4735     w = _jit->pc.w;
4736     BRI_COND((i0 - w) >> 4, PR_6);
4737     return (w);
4738 }
4739
4740 static jit_word_t
4741 _beqi(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
4742 {
4743     jit_word_t          w;
4744     jit_int32_t         reg;
4745     if (i1 >= -128 && i1 <= 127)
4746         CMPI_EQ(PR_6, PR_7, i1, r0);
4747     else {
4748         reg = jit_get_reg(jit_class_gpr);
4749         movi(rn(reg), i1);
4750         CMP_EQ(PR_6, PR_7, r0, rn(reg));
4751         jit_unget_reg(reg);
4752     }
4753     sync();
4754     w = _jit->pc.w;
4755     BRI_COND((i0 - w) >> 4, PR_6);
4756     return (w);
4757 }
4758
4759 static jit_word_t
4760 _bger(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
4761 {
4762     jit_word_t          w;
4763     CMP_LT(PR_6, PR_7, r0, r1);
4764     sync();
4765     w = _jit->pc.w;
4766     BRI_COND((i0 - w) >> 4, PR_7);
4767     return (w);
4768 }
4769
4770 static jit_word_t
4771 _bgei(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
4772 {
4773     jit_word_t          w;
4774     jit_int32_t         reg;
4775     if (i1 >= -127 && i1 <= 128)
4776         CMPI_LT(PR_7, PR_6, i1 - 1, r0);
4777     else {
4778         reg = jit_get_reg(jit_class_gpr);
4779         movi(rn(reg), i1);
4780         CMP_LT(PR_6, PR_7, r0, rn(reg));
4781         jit_unget_reg(reg);
4782     }
4783     sync();
4784     w = _jit->pc.w;
4785     BRI_COND((i0 - w) >> 4, PR_7);
4786     return (w);
4787 }
4788
4789 static jit_word_t
4790 _bger_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
4791 {
4792     jit_word_t          w;
4793     CMP_LTU(PR_6, PR_7, r0, r1);
4794     sync();
4795     w = _jit->pc.w;
4796     BRI_COND((i0 - w) >> 4, PR_7);
4797     return (w);
4798 }
4799
4800 static jit_word_t
4801 _bgei_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
4802 {
4803     jit_word_t          w;
4804     jit_int32_t         reg;
4805     if (i1 >= -127 && i1 <= 128)
4806         CMPI_LTU(PR_7, PR_6, i1 - 1, r0);
4807     else {
4808         reg = jit_get_reg(jit_class_gpr);
4809         movi(rn(reg), i1);
4810         CMP_LTU(PR_6, PR_7, r0, rn(reg));
4811         jit_unget_reg(reg);
4812     }
4813     sync();
4814     w = _jit->pc.w;
4815     BRI_COND((i0 - w) >> 4, PR_7);
4816     return (w);
4817 }
4818
4819 static jit_word_t
4820 _bgtr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
4821 {
4822     jit_word_t          w;
4823     CMP_LT(PR_6, PR_7, r1, r0);
4824     sync();
4825     w = _jit->pc.w;
4826     BRI_COND((i0 - w) >> 4, PR_6);
4827     return (w);
4828 }
4829
4830 static jit_word_t
4831 _bgti(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
4832 {
4833     jit_word_t          w;
4834     jit_int32_t         reg;
4835     reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
4836     movi(rn(reg), i1);
4837     w = bgtr(i0, r0, rn(reg));
4838     jit_unget_reg(reg);
4839     return (w);
4840 }
4841
4842 static jit_word_t
4843 _bgtr_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
4844 {
4845     jit_word_t          w;
4846     CMP_LTU(PR_6, PR_7, r1, r0);
4847     sync();
4848     w = _jit->pc.w;
4849     BRI_COND((i0 - w) >> 4, PR_6);
4850     return (w);
4851 }
4852
4853 static jit_word_t
4854 _bgti_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
4855 {
4856     jit_word_t          w;
4857     jit_int32_t         reg;
4858     reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
4859     movi(rn(reg), i1);
4860     w = bgtr_u(i0, r0, rn(reg));
4861     jit_unget_reg(reg);
4862     return (w);
4863 }
4864
4865 static jit_word_t
4866 _bner(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
4867 {
4868     jit_word_t          w;
4869     CMP_EQ(PR_6, PR_7, r0, r1);
4870     sync();
4871     w = _jit->pc.w;
4872     BRI_COND((i0 - w) >> 4, PR_7);
4873     return (w);
4874 }
4875
4876 static jit_word_t
4877 _bnei(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
4878 {
4879     jit_word_t          w;
4880     jit_int32_t         reg;
4881     if (i1 >= -128 && i1 <= 127)
4882         CMPI_EQ(PR_6, PR_7, i1, r0);
4883     else {
4884         reg = jit_get_reg(jit_class_gpr);
4885         movi(rn(reg), i1);
4886         CMP_EQ(PR_6, PR_7, r0, rn(reg));
4887         jit_unget_reg(reg);
4888     }
4889     sync();
4890     w = _jit->pc.w;
4891     BRI_COND((i0 - w) >> 4, PR_7);
4892     return (w);
4893 }
4894
4895 static jit_word_t
4896 _bmsr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
4897 {
4898     jit_word_t          w;
4899     jit_int32_t         reg;
4900     reg = jit_get_reg(jit_class_gpr);
4901     andr(rn(reg), r0, r1);
4902     CMPI_EQ(PR_6, PR_7, 0, rn(reg));
4903     jit_unget_reg(reg);
4904     sync();
4905     w = _jit->pc.w;
4906     BRI_COND((i0 - w) >> 4, PR_7);
4907     return (w);
4908 }
4909
4910 static jit_word_t
4911 _bmsi(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
4912 {
4913     jit_word_t          w;
4914     jit_int32_t         reg;
4915     reg = jit_get_reg(jit_class_gpr);
4916     movi(rn(reg), i1);
4917     andr(rn(reg), r0, rn(reg));
4918     CMPI_EQ(PR_6, PR_7, 0, rn(reg));
4919     jit_unget_reg(reg);
4920     sync();
4921     w = _jit->pc.w;
4922     BRI_COND((i0 - w) >> 4, PR_7);
4923     return (w);
4924 }
4925
4926 static jit_word_t
4927 _bmcr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
4928 {
4929     jit_word_t          w;
4930     jit_int32_t         reg;
4931     reg = jit_get_reg(jit_class_gpr);
4932     andr(rn(reg), r0, r1);
4933     CMPI_EQ(PR_6, PR_7, 0, rn(reg));
4934     jit_unget_reg(reg);
4935     sync();
4936     w = _jit->pc.w;
4937     BRI_COND((i0 - w) >> 4, PR_6);
4938     return (w);
4939 }
4940
4941 static jit_word_t
4942 _bmci(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
4943 {
4944     jit_word_t          w;
4945     jit_int32_t         reg;
4946     reg = jit_get_reg(jit_class_gpr);
4947     movi(rn(reg), i1);
4948     andr(rn(reg), r0, rn(reg));
4949     CMPI_EQ(PR_6, PR_7, 0, rn(reg));
4950     jit_unget_reg(reg);
4951     sync();
4952     w = _jit->pc.w;
4953     BRI_COND((i0 - w) >> 4, PR_6);
4954     return (w);
4955 }
4956
4957 static jit_word_t
4958 _baddr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1,
4959        jit_bool_t carry)
4960 {
4961     jit_word_t          w;
4962     jit_int32_t         t0;
4963     jit_int32_t         t1;
4964     jit_int32_t         t2;
4965     /* t1 = r0 + r1;    overflow = r1 < 0 ? r0 < t1 : t1 < r0 */
4966     t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
4967     t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
4968     t2 = jit_get_reg(jit_class_gpr|jit_class_nospill);
4969     lti(rn(t0), r1, 0);                 /* t0 = r1 < 0 */
4970     addr(rn(t1), r0, r1);               /* t1 = r0 + r1 */
4971     ltr(rn(t2), rn(t1), r0);            /* t2 = t1 < r0 */
4972     ltr(rn(t1), r0, rn(t1));            /* t1 = r0 < t1 */
4973     CMPI_EQ(PR_6, PR_7, 0, rn(t0));
4974     CMPI_EQ_p(PR_8, PR_9, 0, rn(t2), PR_6);/* if (t0==0) p8=t2==0,p9=t2!=0; */
4975     CMPI_EQ_p(PR_8, PR_9, 0, rn(t1), PR_7);/* if (t0!=0) p8=t1==0,p9=t1!=0; */
4976     addr(r0, r0, r1);
4977     sync();
4978     w = _jit->pc.w;
4979     BRI_COND((i0 - w) >> 4, carry ? PR_9 : PR_8);
4980     jit_unget_reg(t2);
4981     jit_unget_reg(t1);
4982     jit_unget_reg(t0);
4983     return (w);
4984 }
4985
4986 static jit_word_t
4987 _baddi(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1,
4988        jit_bool_t carry)
4989 {
4990     jit_word_t          w;
4991     jit_int32_t         reg;
4992     reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
4993     movi(rn(reg), i1);
4994     w = baddr(i0, r0, rn(reg), carry);
4995     jit_unget_reg(reg);
4996     return (w);
4997 }
4998
4999 static jit_word_t
5000 _baddr_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1,
5001          jit_bool_t carry)
5002 {
5003     jit_word_t          w;
5004     jit_int32_t         t0;
5005     jit_int32_t         t1;
5006     t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
5007     t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
5008     addr(rn(t0), r0, r1);
5009     ltr_u(rn(t1), rn(t0), r0);
5010     CMPI_EQ(PR_6, PR_7, 0, rn(t1));
5011     MOV(r0, rn(t0));
5012     sync();
5013     w = _jit->pc.w;
5014     BRI_COND((i0 - w) >> 4, carry ? PR_7 : PR_6);
5015     jit_unget_reg(t1);
5016     jit_unget_reg(t0);
5017     return (w);
5018 }
5019
5020 static jit_word_t
5021 _baddi_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1,
5022          jit_bool_t carry)
5023 {
5024     jit_word_t          w;
5025     jit_int32_t         reg;
5026     reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
5027     movi(rn(reg), i1);
5028     w = baddr_u(i0, r0, rn(reg), carry);
5029     jit_unget_reg(reg);
5030     return (w);
5031 }
5032
5033 static jit_word_t
5034 _bsubr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1,
5035        jit_bool_t carry)
5036 {
5037     jit_word_t          w;
5038     jit_int32_t         t0;
5039     jit_int32_t         t1;
5040     jit_int32_t         t2;
5041     /* t1 = r0 - r1;    overflow = 0 < r1 ? r0 < t1 : t1 < r0 */
5042     t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
5043     t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
5044     t2 = jit_get_reg(jit_class_gpr|jit_class_nospill);
5045     gti(rn(t0), r1, 0);                 /* t0 = r1 > 0 */
5046     subr(rn(t1), r0, r1);               /* t1 = r0 - r1 */
5047     ltr(rn(t2), rn(t1), r0);            /* t2 = t1 < r0 */
5048     ltr(rn(t1), r0, rn(t1));            /* t1 = r0 < t1 */
5049     CMPI_EQ(PR_6, PR_7, 0, rn(t0));
5050     CMPI_EQ_p(PR_8, PR_9, 0, rn(t2), PR_6);/* if (t0==0) p4=t2==0,p5=t2!=0; */
5051     CMPI_EQ_p(PR_8, PR_9, 0, rn(t1), PR_7);/* if (t0!=0) p4=t1==0,p5=t1!=0; */
5052     subr(r0, r0, r1);
5053     sync();
5054     w = _jit->pc.w;
5055     BRI_COND((i0 - w) >> 4, carry ? PR_9 : PR_8);
5056     jit_unget_reg(t2);
5057     jit_unget_reg(t1);
5058     jit_unget_reg(t0);
5059     return (w);
5060 }
5061
5062 static jit_word_t
5063 _bsubi(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1,
5064        jit_bool_t carry)
5065 {
5066     jit_word_t          w;
5067     jit_int32_t         reg;
5068     reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
5069     movi(rn(reg), i1);
5070     w = bsubr(i0, r0, rn(reg), carry);
5071     jit_unget_reg(reg);
5072     return (w);
5073 }
5074
5075 static jit_word_t
5076 _bsubr_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1,
5077          jit_bool_t carry)
5078 {
5079     jit_word_t          w;
5080     jit_int32_t         t0;
5081     jit_int32_t         t1;
5082     t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
5083     t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
5084     subr(rn(t0), r0, r1);
5085     ltr_u(rn(t1), r0, rn(t0));
5086     CMPI_EQ(PR_6, PR_7, 0, rn(t1));
5087     MOV(r0, rn(t0));
5088     sync();
5089     w = _jit->pc.w;
5090     BRI_COND((i0 - w) >> 4, carry ? PR_7 : PR_6);
5091     jit_unget_reg(t1);
5092     jit_unget_reg(t0);
5093     return (w);
5094 }
5095
5096 static jit_word_t
5097 _bsubi_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1,
5098          jit_bool_t carry)
5099 {
5100     jit_word_t          w;
5101     jit_int32_t         reg;
5102     reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
5103     movi(rn(reg), i1);
5104     w = bsubr_u(i0, r0, rn(reg), carry);
5105     jit_unget_reg(reg);
5106     return (w);
5107 }
5108
5109 static void
5110 _jmpr(jit_state_t *_jit, jit_int32_t r0)
5111 {
5112     MOV_br_rn(BR_6, r0);
5113     BR(BR_6);
5114 }
5115
5116 static void
5117 _jmpi(jit_state_t *_jit, jit_word_t i0)
5118 {
5119     jit_word_t          d;
5120     sync();
5121     d = ((jit_word_t)i0 - _jit->pc.w) >> 4;
5122     if (d >= -16777216 && d <= 16777215)
5123         BRI(d);
5124     else
5125         BRL(d);
5126 }
5127
5128 static jit_word_t
5129 _jmpi_p(jit_state_t *_jit, jit_word_t i0)
5130 {
5131     jit_word_t          d, w;
5132     sync();
5133     w = _jit->pc.w;
5134     d = ((jit_word_t)i0 - w) >> 4;
5135     BRL(d);
5136     return (w);
5137 }
5138
5139 static void
5140 _callr(jit_state_t *_jit, jit_int32_t r0)
5141 {
5142     jit_int32_t         reg;
5143     reg = jit_get_reg(jit_class_gpr);
5144     LD8_inc(rn(reg), r0, 8);
5145     MOV_br_rn(BR_6, rn(reg));
5146     jit_unget_reg(reg);
5147     LD8(GR_1, r0);
5148     BR_CALL(BR_0, BR_6);
5149 }
5150
5151 static void
5152 _calli(jit_state_t *_jit, jit_word_t i0)
5153 {
5154     jit_int32_t         reg;
5155     reg = jit_get_reg(jit_class_gpr);
5156     movi(rn(reg), i0);
5157     callr(rn(reg));
5158     jit_unget_reg(reg);
5159 }
5160
5161 static jit_word_t
5162 _calli_p(jit_state_t *_jit, jit_word_t i0)
5163 {
5164     jit_word_t          w;
5165     jit_int32_t         reg;
5166     reg = jit_get_reg(jit_class_gpr);
5167     w = movi_p(rn(reg), i0);
5168     callr(rn(reg));
5169     jit_unget_reg(reg);
5170     return (w);
5171 }
5172
5173 static void
5174 _prolog(jit_state_t *_jit, jit_node_t *node)
5175 {
5176     jit_int32_t         reg, ruse, rout;
5177
5178     if (_jitc->function->define_frame || _jitc->function->assume_frame) {
5179         jit_int32_t     frame = -_jitc->function->frame;
5180         assert(_jitc->function->self.aoff >= frame);
5181         if (_jitc->function->assume_frame)
5182             return;
5183         _jitc->function->self.aoff = frame;
5184     }
5185     if (_jitc->function->allocar)
5186         _jitc->function->self.aoff &= -16;
5187     _jitc->function->stack = ((_jitc->function->self.alen -
5188                                _jitc->function->self.aoff) + 15) & -16;
5189
5190     /* First lowest unused register is first output register */
5191     for (reg = _R115; reg >= _R40; reg--) {
5192         if (jit_regset_tstbit(&_jitc->function->regset, reg))
5193             break;
5194     }
5195     _jitc->breg = rn(reg) + 1;
5196     _jitc->rout = _jitc->breg + 5;
5197     ruse = _jitc->rout - GR_32;
5198
5199     /* How many out argument registers required? */
5200     if (!_jitc->function->define_frame) {
5201         for (reg = _OUT7; reg >= _OUT0; --reg) {
5202             if (jit_regset_tstbit(&_jitc->function->regset, reg))
5203                 break;
5204         }
5205         rout = (reg + 1) - _OUT0;
5206     }
5207     else
5208         rout = 8;
5209
5210     /* Do not know if will call div/mod functions (sqrt* needs one) */
5211     if (rout < 2)
5212         rout = 2;
5213
5214     /* Match gcc prolog */
5215     ALLOC(_jitc->breg + 1, ruse, rout);
5216     MOV(_jitc->breg + 2, GR_12);
5217     MOV_rn_br(_jitc->breg, BR_0);
5218     MOV(_jitc->breg + 3, GR_1);
5219
5220     /* lightning specific, use r4 as frame pointer */
5221     MOV(_jitc->breg + 4, GR_4);
5222     addi(GR_4, GR_12, -(stack_framesize + params_offset));
5223
5224     /* adjust stack pointer */
5225     addi(GR_12, GR_12, -(stack_framesize +
5226                          (params_offset << 1) + _jitc->function->stack));
5227
5228     if (jit_regset_tstbit(&_jitc->function->regset, JIT_F0))
5229         STF_SPILL(GR_4, rn(JIT_F0));
5230     if (jit_regset_tstbit(&_jitc->function->regset, JIT_F1)) {
5231         addi(GR_2, GR_4, 16);
5232         STF_SPILL(GR_2, rn(JIT_F1));
5233     }
5234     if (jit_regset_tstbit(&_jitc->function->regset, JIT_F2)) {
5235         addi(GR_2, GR_4, 32);
5236         STF_SPILL(GR_2, rn(JIT_F2));
5237     }
5238     if (jit_regset_tstbit(&_jitc->function->regset, JIT_F3)) {
5239         addi(GR_2, GR_4, 48);
5240         STF_SPILL(GR_2, rn(JIT_F3));
5241     }
5242     if (jit_regset_tstbit(&_jitc->function->regset, JIT_F4)) {
5243         addi(GR_2, GR_4, 64);
5244         STF_SPILL(GR_2, rn(JIT_F4));
5245     }
5246     if (jit_regset_tstbit(&_jitc->function->regset, JIT_F5)) {
5247         addi(GR_2, GR_4, 80);
5248         STF_SPILL(GR_2, rn(JIT_F5));
5249     }
5250
5251     if (_jitc->function->allocar) {
5252         reg = jit_get_reg(jit_class_gpr);
5253         movi(rn(reg), _jitc->function->self.aoff);
5254         stxi_i(_jitc->function->aoffoff, GR_4, rn(reg));
5255         jit_unget_reg(reg);
5256     }
5257
5258     if (_jitc->function->self.call & jit_call_varargs) {
5259         for (reg = _jitc->function->vagp; reg < 8; ++reg)
5260             stxi(112 + reg * 8, GR_4, GR_32 + reg);
5261     }
5262 }
5263
5264 static void
5265 _epilog(jit_state_t *_jit, jit_node_t *node)
5266 {
5267     if (_jitc->function->assume_frame)
5268         return;
5269     if (jit_regset_tstbit(&_jitc->function->regset, JIT_F0))
5270         LDF_FILL(rn(JIT_F0), GR_4);
5271     if (jit_regset_tstbit(&_jitc->function->regset, JIT_F1)) {
5272         addi(GR_2, GR_4, 16);
5273         LDF_FILL(rn(JIT_F1), GR_2);
5274     }
5275     if (jit_regset_tstbit(&_jitc->function->regset, JIT_F2)) {
5276         addi(GR_2, GR_4, 32);
5277         LDF_FILL(rn(JIT_F2), GR_2);
5278     }
5279     if (jit_regset_tstbit(&_jitc->function->regset, JIT_F3)) {
5280         addi(GR_2, GR_4, 48);
5281         LDF_FILL(rn(JIT_F3), GR_2);
5282     }
5283     if (jit_regset_tstbit(&_jitc->function->regset, JIT_F4)) {
5284         addi(GR_2, GR_4, 64);
5285         LDF_FILL(rn(JIT_F4), GR_2);
5286     }
5287     if (jit_regset_tstbit(&_jitc->function->regset, JIT_F5)) {
5288         addi(GR_2, GR_4, 80);
5289         LDF_FILL(rn(JIT_F5), GR_2);
5290     }
5291     /* Match gcc epilog */
5292     MOV(GR_1, _jitc->breg + 3);
5293     MOV_I_ar_rn(AR_PFS, _jitc->breg + 1);
5294     MOV_br_rn(BR_0, _jitc->breg);
5295     MOV(GR_12, _jitc->breg + 2);
5296     /* Restore lightning specific r4 as frame pointer */
5297     MOV(GR_4, _jitc->breg + 4);
5298     BR_RET(BR_0);
5299     flush();
5300 }
5301
5302 static void
5303 _vastart(jit_state_t *_jit, jit_int32_t r0)
5304 {
5305     assert(_jitc->function->self.call & jit_call_varargs);
5306     /* Initialize va_list to the first stack argument. */
5307     if (_jitc->function->vagp < 8)
5308         addi(r0, GR_4, 112 + _jitc->function->vagp * 8);
5309     else
5310         addi(r0, GR_4, _jitc->function->self.size);
5311 }
5312
5313 static void
5314 _vaarg(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
5315 {
5316     assert(_jitc->function->self.call & jit_call_varargs);
5317     /* Load argument. */
5318     ldr(r0, r1);
5319     /* Update va_list. */
5320     addi(r1, r1, 8);
5321 }
5322
5323 static void
5324 _patch_at(jit_state_t *_jit, jit_code_t code,
5325           jit_word_t instr, jit_word_t label)
5326 {
5327     jit_word_t           l, h, tm, s0, s1, s2;
5328     union {
5329         jit_word_t       w;
5330         jit_word_t      *p;
5331     } c;
5332     jit_word_t           i1, i41, i20, ic, i5, i9, i7;
5333     c.w = instr;
5334     get_bundle(c.p, l, h, tm, s0, s1, s2);
5335     switch (code) {
5336         case jit_code_movi:
5337             /* Handle jit functions as C function, so that jit function
5338              * pointers can be passed to C code, and jit code does not
5339              * need to try to differentiate them. */
5340         case jit_code_calli:
5341             i1  = (label >> 63) &           0x1L;
5342             i41 = (label >> 22) & 0x1ffffffffffL;
5343             ic  = (label >> 21) &           0x1L;
5344             i5  = (label >> 16) &          0x1fL;
5345             i9  = (label >>  7) &         0x1ffL;
5346             i7  =  label        &          0x7fL;
5347             s1 = i41;
5348             assert((tm & ~1) == TM_M_L_X_ &&
5349                    (s2 & 0xfL<<37) == (6L<<37) &&
5350                    s0 == nop_m);
5351             s2 &= (6L<<37)|(0x7fL<<6);
5352             s2 |= (i1<<36)|(i9<<27)|(i5<<22)|(ic<<21)|(i7<<13);
5353             break;
5354         case jit_code_jmpi:
5355             if (_jitc->jump) {
5356                 /* kludge to hide function descriptors; check that gp
5357                  * is zero, what is done for all jit functions */
5358                 if (((long *)label)[1] == 0) {
5359                     for (ic = 0; ic < _jitc->prolog.offset; ic++) {
5360                         if (_jitc->prolog.ptr[ic] == label) {
5361                             label += 16;
5362                             break;
5363                         }
5364                     }
5365                 }
5366             }
5367             ic = (label - instr) >> 4;
5368             i1  = (ic >> 61) &           0x1L;
5369             i41 = (ic >> 22) & 0x1ffffffffffL;
5370             i20 =  ic        &       0xfffffL;
5371             assert((tm & ~1) == TM_M_L_X_ &&
5372                    (s2 & 0xfL<<37) == (0xcL<<37) &&
5373                    s0 == nop_m);
5374             s1 = i41;
5375             s2 &= (0xcL<<37)|(0x7L<<33)|(1L<<12);
5376             s2 |= (i1<<36)|(i20<<13);
5377             break;
5378         default:
5379             /* Only B1 in slot 0 expected due to need to either
5380              * a stop to update predicates, or a sync before
5381              * unconditional short branch */
5382             ic = (label - instr) >> 4;
5383             assert((s0 >> 37) == 4 && (s0 & (7 << 6)) == 0);
5384             s0 &= (4L<<37)|(7L<<33)|(1L<<12)|0x1f;
5385             s0 |= (((ic>>20)&1L)<<36)|((ic&0xfffffL)<<13);
5386             break;
5387     }
5388     set_bundle(c.p, l, h, tm, s0, s1, s2);
5389 }
5390 #endif