2 * Copyright (C) 2012-2019 Free Software Foundation, Inc.
4 * This file is part of GNU lightning.
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)
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.
17 * Paulo Cesar Pereira de Andrade
22 #if __BYTE_ORDER == __LITTLE_ENDIAN
23 struct { jit_uint32_t _:26; jit_uint32_t b : 6; } hc;
24 struct { jit_uint32_t _:21; jit_uint32_t b : 5; } rs;
25 struct { jit_uint32_t _:21; jit_uint32_t b : 5; } fm;
26 struct { jit_uint32_t _:16; jit_uint32_t b : 5; } rt;
27 struct { jit_uint32_t _:16; jit_uint32_t b : 5; } ft;
28 struct { jit_uint32_t _:11; jit_uint32_t b : 5; } rd;
29 struct { jit_uint32_t _:11; jit_uint32_t b : 5; } fs;
30 struct { jit_uint32_t _: 6; jit_uint32_t b : 5; } ic;
31 struct { jit_uint32_t _: 6; jit_uint32_t b : 5; } fd;
32 struct { jit_uint32_t _: 6; jit_uint32_t b : 10; } tr;
33 struct { jit_uint32_t _: 6; jit_uint32_t b : 20; } br;
34 struct { jit_uint32_t b : 6; } tc;
35 struct { jit_uint32_t b : 11; } cc;
36 struct { jit_uint32_t b : 16; } is;
37 struct { jit_uint32_t b : 26; } ii;
39 struct { jit_uint32_t b : 6; } hc;
40 struct { jit_uint32_t _: 6; jit_uint32_t b : 5; } rs;
41 struct { jit_uint32_t _: 6; jit_uint32_t b : 5; } fm;
42 struct { jit_uint32_t _:11; jit_uint32_t b : 5; } rt;
43 struct { jit_uint32_t _:11; jit_uint32_t b : 5; } ft;
44 struct { jit_uint32_t _:16; jit_uint32_t b : 5; } rd;
45 struct { jit_uint32_t _:16; jit_uint32_t b : 5; } fs;
46 struct { jit_uint32_t _:21; jit_uint32_t b : 5; } ic;
47 struct { jit_uint32_t _:21; jit_uint32_t b : 5; } fd;
48 struct { jit_uint32_t _:21; jit_uint32_t b : 10; } tr;
49 struct { jit_uint32_t _:21; jit_uint32_t b : 20; } br;
50 struct { jit_uint32_t _:26; jit_uint32_t b : 6; } tc;
51 struct { jit_uint32_t _:21; jit_uint32_t b : 11; } cc;
52 struct { jit_uint32_t _:16; jit_uint32_t b : 16; } is;
53 struct { jit_uint32_t _: 6; jit_uint32_t b : 26; } ii;
58 # define jit_mips2_p() 0
59 # define _ZERO_REGNO 0
60 # define _T0_REGNO 0x08
61 # define _T1_REGNO 0x09
62 # define _T2_REGNO 0x0a
63 # define _T3_REGNO 0x0b
64 # define _T4_REGNO 0x0c
65 # define _T5_REGNO 0x0d
66 # define _T6_REGNO 0x0e
67 # define _T7_REGNO 0x0f
68 # define _S0_REGNO 0x10
69 # define _S1_REGNO 0x11
70 # define _S2_REGNO 0x12
71 # define _S3_REGNO 0x13
72 # define _S4_REGNO 0x14
73 # define _S5_REGNO 0x15
74 # define _S6_REGNO 0x16
75 # define _S7_REGNO 0x17
76 # define _T8_REGNO 0x18
77 # define _T9_REGNO 0x19
78 # define _SP_REGNO 0x1d
79 # define _BP_REGNO 0x1e
80 # define _RA_REGNO 0x1f
81 # define _F16_REGNO 16
82 # define _F18_REGNO 18
83 # define _F20_REGNO 20
84 # define _F22_REGNO 22
85 # define _F24_REGNO 24
86 # define _F26_REGNO 26
87 # define _F28_REGNO 28
88 # define _F30_REGNO 30
91 # define stack_framesize 144
93 # define stack_framesize 112
95 # define ldr(u,v) ldr_i(u,v)
96 # define ldi(u,v) ldi_i(u,v)
97 # define ldxi(u,v,w) ldxi_i(u,v,w)
98 # define sti(u,v) sti_i(u,v)
99 # define stxi(u,v,w) stxi_i(u,v,w)
101 # define stack_framesize 144
102 # define ldr(u,v) ldr_l(u,v)
103 # define ldi(u,v) ldi_l(u,v)
104 # define ldxi(u,v,w) ldxi_l(u,v,w)
105 # define sti(u,v) sti_l(u,v)
106 # define stxi(u,v,w) stxi_l(u,v,w)
108 # define can_sign_extend_short_p(im) ((im) >= -32678 && (im) <= 32767)
109 # define can_zero_extend_short_p(im) ((im) >= 0 && (im) <= 65535)
110 # define is_low_mask(im) (((im) & 1) ? (__builtin_popcountl((im) + 1) == 1) : 0)
111 # define is_high_mask(im) ((im) ? (__builtin_popcountl((im) + (1 << __builtin_ctzl(im))) == 0) : 0)
112 # define masked_bits_count(im) __builtin_popcountl(im)
113 # define unmasked_bits_count(im) (__WORDSIZE - masked_bits_count(im))
114 # if __WORDSIZE == 32
115 # define can_sign_extend_int_p(im) 1
116 # define can_zero_extend_int_p(im) 1
118 # define can_sign_extend_int_p(im) \
119 (((im) >= 0 && (im) <= 0x7fffffffL) || \
120 ((im) < 0 && (im) >= -0x80000000L))
121 # define can_zero_extend_int_p(im) ((im) >= 0 && (im) <= 0xffffffff)
123 # define MIPS_SPECIAL 0x00
124 # define MIPS_REGIMM 0x01
126 # define MIPS_SRL 0x02
127 # define MIPS_JAL 0x03
128 # define MIPS_SRA 0x03
129 # define MIPS_BEQ 0x04
130 # define MIPS_BNE 0x05
131 # define MIPS_BLEZ 0x06
132 # define MIPS_BGTZ 0x07
133 # define MIPS_ADDI 0x08
134 # define MIPS_ADDIU 0x09
135 # define MIPS_SLTI 0x0a
136 # define MIPS_SLTIU 0x0b
137 # define MIPS_ANDI 0x0c
138 # define MIPS_ORI 0x0d
139 # define MIPS_XORI 0x0e
140 # define MIPS_LUI 0x0f
141 # define MIPS_COP0 0x10
142 # define MIPS_COP1 0x11
143 # define MIPS_COP2 0x12
144 # define MIPS_COP1X 0x13
145 # define MIPS_BEQL 0x14
146 # define MIPS_BNEL 0x15
147 # define MIPS_BLEZL 0x16
148 # define MIPS_BGTZL 0x17
149 # define MIPS_DADDI 0x18
150 # define MIPS_DADDIU 0x19
151 # define MIPS_LDL 0x1a
152 # define MIPS_LDR 0x1b
153 # define MIPS_SPECIAL2 0x1c
154 # define MIPS_JALX 0x1d
155 # define MIPS_SPECIAL3 0x1f
156 # define MIPS_LB 0x20
157 # define MIPS_LH 0x21
158 # define MIPS_LWL 0x22
159 # define MIPS_LW 0x23
160 # define MIPS_LBU 0x24
161 # define MIPS_LHU 0x25
162 # define MIPS_LWR 0x26
163 # define MIPS_LWU 0x27
164 # define MIPS_SB 0x28
165 # define MIPS_SH 0x29
166 # define MIPS_SWL 0x2a
167 # define MIPS_SW 0x2b
168 # define MIPS_SWR 0x2e
169 # define MIPS_CACHE 0x2f
170 # define MIPS_LL 0x30
171 # define MIPS_LWC1 0x31
172 # define MIPS_LWC2 0x32
173 # define MIPS_PREF 0x33
174 # define MIPS_LLD 0x34
175 # define MIPS_LDC1 0x35
176 # define MIPS_LDC2 0x36
177 # define MIPS_LD 0x37
178 # define MIPS_SC 0x38
179 # define MIPS_SCD 0x3c
180 # define MIPS_SDC1 0x3d
181 # define MIPS_SDC2 0x3e
182 # define MIPS_SWC1 0x39
183 # define MIPS_SWC2 0x3a
184 # define MIPS_SD 0x3f
185 # define MIPS_MF 0x00
186 # define MIPS_DMF 0x01
187 # define MIPS_CF 0x02
188 # define MIPS_MFH 0x03
189 # define MIPS_MT 0x04
190 # define MIPS_DMT 0x05
191 # define MIPS_CT 0x06
192 # define MIPS_MTH 0x07
193 # define MIPS_BC 0x08
194 # define MIPS_WRPGPR 0x0e
195 # define MIPS_BGZAL 0x11
196 # define MIPS_MFMC0 0x11
197 # define MIPS_BCF 0x00
198 # define MIPS_BLTZ 0x00
199 # define MIPS_BCT 0x01
200 # define MIPS_BGEZ 0x01
201 # define MIPS_BCFL 0x02
202 # define MIPS_BLTZL 0x02
203 # define MIPS_BCTL 0x03
204 # define MIPS_BGEZL 0x03
205 # define MIPS_TGEI 0x08
206 # define MIPS_TGEIU 0x09
207 # define MIPS_TLTI 0x0a
208 # define MIPS_TLTIU 0x0b
209 # define MIPS_TEQI 0x0c
210 # define MIPS_TNEI 0x0e
211 # define MIPS_BLTZAL 0x10
212 # define MIPS_BGEZAL 0x11
213 # define MIPS_BLTZALL 0x12
214 # define MIPS_BGEZALL 0x13
215 # define MIPS_SYNCI 0x1f
216 # define MIPS_WSBH 0x02
217 # define MIPS_DBSH 0x02
218 # define MIPS_DSHD 0x05
219 # define MIPS_SEB 0x10
220 # define MIPS_SEH 0x18
221 # define MIPS_MADD 0x00
222 # define MIPS_SLL 0x00
223 # define MIPS_EXT 0x00
224 # define MIPS_DEXTM 0x01
225 # define MIPS_MADDU 0x01
226 # define MIPS_MOVFT 0x01
227 # define MIPS_TLBR 0x01
228 # define MIPS_MUL 0x02
229 # define MIPS_DEXTU 0x02
230 # define MIPS_TLBWI 0x02
231 # define MIPS_DEXT 0x03
232 # define MIPS_SLLV 0x04
233 # define MIPS_INS 0x04
234 # define MIPS_MSUB 0x04
235 # define MIPS_DINSM 0x05
236 # define MIPS_MSUBU 0x05
237 # define MIPS_SRLV 0x06
238 # define MIPS_DINSU 0x06
239 # define MIPS_TLBWR 0x06
240 # define MIPS_SRAV 0x07
241 # define MIPS_DINS 0x07
242 # define MIPS_JR 0x08
243 # define MIPS_TLBP 0x08
244 # define MIPS_JALR 0x09
245 # define MIPS_MOVZ 0x0a
246 # define MIPS_MOVN 0x0b
247 # define MIPS_SYSCALL 0x0c
248 # define MIPS_BREAK 0x0d
249 # define MIPS_PREFX 0x0f
250 # define MIPS_SYNC 0x0f
251 # define MIPS_MFHI 0x10
252 # define MIPS_MTHI 0x11
253 # define MIPS_MFLO 0x12
254 # define MIPS_MTLO 0x13
255 # define MIPS_DSLLV 0x14
256 # define MIPS_DSRLV 0x16
257 # define MIPS_DSRAV 0x17
258 # define MIPS_MULT 0x18
259 # define MIPS_ERET 0x18
260 # define MIPS_MULTU 0x19
261 # define MIPS_DIV 0x1a
262 # define MIPS_DIVU 0x1b
263 # define MIPS_DMULT 0x1c
264 # define MIPS_DMULTU 0x1d
265 # define MIPS_DDIV 0x1e
266 # define MIPS_DDIVU 0x1f
267 # define MIPS_DERET 0x1f
268 # define MIPS_ADD 0x20
269 # define MIPS_CLZ 0x20
270 # define MIPS_BSHFL 0x20
271 # define MIPS_ADDU 0x21
272 # define MIPS_CLO 0x21
273 # define MIPS_SUB 0x22
274 # define MIPS_SUBU 0x23
275 # define MIPS_AND 0x24
276 # define MIPS_DCLZ 0x24
277 # define MIPS_DBSHFL 0x24
278 # define MIPS_OR 0x25
279 # define MIPS_DCLO 0x25
280 # define MIPS_XOR 0x26
281 # define MIPS_NOR 0x27
282 # define MIPS_SLT 0x2a
283 # define MIPS_SLTU 0x2b
284 # define MIPS_DADD 0x2c
285 # define MIPS_DADDU 0x2d
286 # define MIPS_DSUB 0x2e
287 # define MIPS_DSUBU 0x2f
288 # define MIPS_TGE 0x30
289 # define MIPS_TGEU 0x31
290 # define MIPS_TLT 0x32
291 # define MIPS_TLTU 0x33
292 # define MIPS_TEQ 0x34
293 # define MIPS_TNE 0x36
294 # define MIPS_DSLL 0x38
295 # define MIPS_DSRL 0x3a
296 # define MIPS_DSRA 0x3b
297 # define MIPS_DSLL32 0x3c
298 # define MIPS_DSRL32 0x3e
299 # define MIPS_DSRA32 0x3f
300 # define MIPS_SDBPP 0x3f
301 # define ii(i) *_jit->pc.ui++ = i
303 _hrrrit(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t,
304 jit_int32_t,jit_int32_t);
305 # define hrrrit(hc,rs,rt,rd,im,tc) _hrrrit(_jit,hc,rs,rt,rd,im,tc)
306 # define hrrr_t(hc,rs,rt,rd,tc) hrrrit(hc,rs,rt,rd,0,tc)
307 # define rrr_t(rs,rt,rd,tc) hrrr_t(0,rs,rt,rd,tc)
308 # define hrri(hc,rs,rt,im) _hrri(_jit,hc,rs,rt,im)
309 static void _hrri(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t);
310 # define hi(hc,im) _hi(_jit,hc,im)
311 static void _hi(jit_state_t*,jit_int32_t,jit_int32_t);
312 # define NOP(i0) ii(0)
313 # define nop(i0) _nop(_jit,i0)
314 static void _nop(jit_state_t*,jit_int32_t);
315 # define h_ri(hc,rt,im) _hrri(_jit,hc,0,rt,im)
316 # define rrit(rt,rd,im,tc) _hrrrit(_jit,0,0,rt,rd,im,tc)
317 # define LUI(rt,im) h_ri(MIPS_LUI,rt,im)
318 # define ADDU(rd,rs,rt) rrr_t(rs,rt,rd,MIPS_ADDU)
319 # define DADDU(rd,rs,rt) rrr_t(rs,rt,rd,MIPS_DADDU)
320 # define ADDIU(rt,rs,im) hrri(MIPS_ADDIU,rs,rt,im)
321 # define DADDIU(rt,rs,im) hrri(MIPS_DADDIU,rs,rt,im)
322 # define SUBU(rd,rs,rt) rrr_t(rs,rt,rd,MIPS_SUBU)
323 # define DSUBU(rd,rs,rt) rrr_t(rs,rt,rd,MIPS_DSUBU)
324 # define MULT(rs,rt) rrr_t(rs,rt,_ZERO_REGNO,MIPS_MULT)
325 # define MULTU(rs,rt) rrr_t(rs,rt,_ZERO_REGNO,MIPS_MULTU)
326 # define DMULT(rs,rt) rrr_t(rs,rt,_ZERO_REGNO,MIPS_DMULT)
327 # define DMULTU(rs,rt) rrr_t(rs,rt,_ZERO_REGNO,MIPS_DMULTU)
328 # define DIV(rs,rt) rrr_t(rs,rt,_ZERO_REGNO,MIPS_DIV)
329 # define DIVU(rs,rt) rrr_t(rs,rt,_ZERO_REGNO,MIPS_DIVU)
330 # define DDIV(rs,rt) rrr_t(rs,rt,_ZERO_REGNO,MIPS_DDIV)
331 # define DDIVU(rs,rt) rrr_t(rs,rt,_ZERO_REGNO,MIPS_DDIVU)
332 # define SLLV(rd,rt,rs) rrr_t(rs,rt,rd,MIPS_SLLV)
333 # define SLL(rd,rt,sa) rrit(rt,rd,sa,MIPS_SLL)
334 # define DSLLV(rd,rt,rs) rrr_t(rs,rt,rd,MIPS_DSLLV)
335 # define DSLL(rd,rt,sa) rrit(rt,rd,sa,MIPS_DSLL)
336 # define DSLL32(rd,rt,sa) rrit(rt,rd,sa,MIPS_DSLL32)
337 # define SRAV(rd,rt,rs) rrr_t(rs,rt,rd,MIPS_SRAV)
338 # define SRA(rd,rt,sa) rrit(rt,rd,sa,MIPS_SRA)
339 # define SRLV(rd,rt,rs) rrr_t(rs,rt,rd,MIPS_SRLV)
340 # define SRL(rd,rt,sa) rrit(rt,rd,sa,MIPS_SRL)
341 # define DSRAV(rd,rt,rs) rrr_t(rs,rt,rd,MIPS_DSRAV)
342 # define DSRA(rd,rt,sa) rrit(rt,rd,sa,MIPS_DSRA)
343 # define DSRA32(rd,rt,sa) rrit(rt,rd,sa,MIPS_DSRA32)
344 # define DSRLV(rd,rt,rs) rrr_t(rs,rt,rd,MIPS_DSRLV)
345 # define DSRL(rd,rt,sa) rrit(rt,rd,sa,MIPS_DSRL)
346 # define DSRL32(rd,rt,sa) rrit(rt,rd,sa,MIPS_DSRL32)
347 # define INS(rt,rs,pos,size) hrrrit(MIPS_SPECIAL3,rs,rt,pos+size-1,pos,MIPS_INS)
348 # define DINS(rt,rs,pos,size) hrrrit(MIPS_SPECIAL3,rs,rt,pos+size-1,pos,MIPS_DINS)
349 # define EXT(rt,rs,pos,size) hrrrit(MIPS_SPECIAL3,rs,rt,size-1,pos,MIPS_EXT)
350 # define DEXT(rt,rs,pos,size) hrrrit(MIPS_SPECIAL3,rs,rt,size-1,pos,MIPS_DEXT)
351 # define ROTR(rd,rt,sa) hrrrit(MIPS_SPECIAL,1,rt,rd,sa,MIPS_SRL)
352 # define DROTR(rd,rt,sa) hrrrit(MIPS_SPECIAL,1,rt,rd,sa,MIPS_DSRL)
353 # define MFHI(rd) rrr_t(_ZERO_REGNO,_ZERO_REGNO,rd,MIPS_MFHI)
354 # define MFLO(rd) rrr_t(_ZERO_REGNO,_ZERO_REGNO,rd,MIPS_MFLO)
355 # define MTHI(rs) rrr_t(rs,_ZERO_REGNO,_ZERO_REGNO,MIPS_MTHI)
356 # define MTLO(rs) rrr_t(rs,_ZERO_REGNO,_ZERO_REGNO,MIPS_MTLO)
357 # define AND(rd,rs,rt) rrr_t(rs,rt,rd,MIPS_AND)
358 # define ANDI(rt,rs,im) hrri(MIPS_ANDI,rs,rt,im)
359 # define OR(rd,rs,rt) rrr_t(rs,rt,rd,MIPS_OR)
360 # define ORI(rt,rs,im) hrri(MIPS_ORI,rs,rt,im)
361 # define XOR(rd,rs,rt) rrr_t(rs,rt,rd,MIPS_XOR)
362 # define XORI(rt,rs,im) hrri(MIPS_XORI,rs,rt,im)
363 # define LB(rt,of,rb) hrri(MIPS_LB,rb,rt,of)
364 # define LBU(rt,of,rb) hrri(MIPS_LBU,rb,rt,of)
365 # define LH(rt,of,rb) hrri(MIPS_LH,rb,rt,of)
366 # define LHU(rt,of,rb) hrri(MIPS_LHU,rb,rt,of)
367 # define LW(rt,of,rb) hrri(MIPS_LW,rb,rt,of)
368 # define LWU(rt,of,rb) hrri(MIPS_LWU,rb,rt,of)
369 # define LD(rt,of,rb) hrri(MIPS_LD,rb,rt,of)
370 # define SB(rt,of,rb) hrri(MIPS_SB,rb,rt,of)
371 # define SH(rt,of,rb) hrri(MIPS_SH,rb,rt,of)
372 # define SW(rt,of,rb) hrri(MIPS_SW,rb,rt,of)
373 # define SD(rt,of,rb) hrri(MIPS_SD,rb,rt,of)
374 # define WSBH(rd,rt) hrrrit(MIPS_SPECIAL3,0,rt,rd,MIPS_WSBH,MIPS_BSHFL)
375 # define SEB(rd,rt) hrrrit(MIPS_SPECIAL3,0,rt,rd,MIPS_SEB,MIPS_BSHFL)
376 # define SEH(rd,rt) hrrrit(MIPS_SPECIAL3,0,rt,rd,MIPS_SEH,MIPS_BSHFL)
377 # define SLT(rd,rs,rt) rrr_t(rs,rt,rd,MIPS_SLT)
378 # define SLTU(rd,rs,rt) rrr_t(rs,rt,rd,MIPS_SLTU)
379 # define SLTI(rt,rs,im) hrri(MIPS_SLTI,rs,rt,im)
380 # define SLTIU(rt,rs,im) hrri(MIPS_SLTIU,rs,rt,im)
381 # define BLTZ(rs,im) hrri(MIPS_REGIMM,rs,MIPS_BLTZ,im)
382 # define BLEZ(rs,im) hrri(MIPS_BLEZ,rs,_ZERO_REGNO,im)
383 # define BEQ(rs,rt,im) hrri(MIPS_BEQ,rs,rt,im)
384 # define BGEZ(rs,im) hrri(MIPS_REGIMM,rs,MIPS_BGEZ,im)
385 # define BGTZ(rs,im) hrri(MIPS_BGTZ,rs,_ZERO_REGNO,im)
386 # define BNE(rs,rt,im) hrri(MIPS_BNE,rs,rt,im)
387 # define JALR(r0) hrrrit(MIPS_SPECIAL,r0,0,_RA_REGNO,0,MIPS_JALR)
388 # if 1 /* supports MIPS32 R6 */
389 # define JR(r0) hrrrit(MIPS_SPECIAL,r0,0,0,0,MIPS_JALR)
390 # else /* does not support MIPS32 R6 */
391 # define JR(r0) hrrrit(MIPS_SPECIAL,r0,0,0,0,MIPS_JR)
393 # define J(i0) hi(MIPS_J,i0)
394 # define MOVN(rd,rs,rt) hrrrit(0,rs,rt,rd,0,MIPS_MOVN)
395 # define MOVZ(rd,rs,rt) hrrrit(0,rs,rt,rd,0,MIPS_MOVZ)
396 # define comr(r0,r1) xori(r0,r1,-1)
397 # define negr(r0,r1) subr(r0,_ZERO_REGNO,r1)
398 # if __WORDSIZE == 32
399 # define addr(rd,rs,rt) ADDU(rd,rs,rt)
400 # define addiu(r0,r1,i0) ADDIU(r0,r1,i0)
401 # define subr(rd,rs,rt) SUBU(rd,rs,rt)
402 # define mult(rs,rt) MULT(rs,rt)
403 # define multu(rs,rt) MULTU(rs,rt)
404 # define div(rs,rt) DIV(rs,rt)
405 # define divu(rs,rt) DIVU(rs,rt)
407 # define addr(rd,rs,rt) DADDU(rd,rs,rt)
408 # define addiu(r0,r1,i0) DADDIU(r0,r1,i0)
409 # define subr(rd,rs,rt) DSUBU(rd,rs,rt)
410 # define mult(rs,rt) DMULT(rs,rt)
411 # define multu(rs,rt) DMULTU(rs,rt)
412 # define div(rs,rt) DDIV(rs,rt)
413 # define divu(rs,rt) DDIVU(rs,rt)
415 # define addi(r0,r1,i0) _addi(_jit,r0,r1,i0)
416 static void _addi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
417 #define addcr(r0,r1,r2) _addcr(_jit,r0,r1,r2)
418 static void _addcr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
419 #define addci(r0,r1,i0) _addci(_jit,r0,r1,i0)
420 static void _addci(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
421 # define addxr(r0,r1,r2) _addxr(_jit,r0,r1,r2)
422 static void _addxr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
423 # define addxi(r0,r1,i0) _addxi(_jit,r0,r1,i0)
424 static void _addxi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
425 # define subi(r0,r1,i0) _subi(_jit,r0,r1,i0)
426 static void _subi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
427 # define subcr(r0,r1,r2) _subcr(_jit,r0,r1,r2)
428 static void _subcr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
429 # define subci(r0,r1,i0) _subci(_jit,r0,r1,i0)
430 static void _subci(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
431 # define subxr(r0,r1,r2) _subxr(_jit,r0,r1,r2)
432 static void _subxr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
433 # define subxi(r0,r1,i0) _subxi(_jit,r0,r1,i0)
434 static void _subxi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
435 # define rsbi(r0, r1, i0) _rsbi(_jit, r0, r1, i0)
436 static void _rsbi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
437 # define mulr(r0,r1,r2) _mulr(_jit,r0,r1,r2)
438 static void _mulr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
439 # define muli(r0,r1,i0) _muli(_jit,r0,r1,i0)
440 static void _muli(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
441 # define qmulr(r0,r1,r2,r3) iqmulr(r0,r1,r2,r3,1)
442 # define qmulr_u(r0,r1,r2,r3) iqmulr(r0,r1,r2,r3,0)
443 # define iqmulr(r0,r1,r2,r3,cc) _iqmulr(_jit,r0,r1,r2,r3,cc)
444 static void _iqmulr(jit_state_t*,jit_int32_t,jit_int32_t,
445 jit_int32_t,jit_int32_t,jit_bool_t);
446 # define qmuli(r0,r1,r2,i0) iqmuli(r0,r1,r2,i0,1)
447 # define qmuli_u(r0,r1,r2,i0) iqmuli(r0,r1,r2,i0,0)
448 # define iqmuli(r0,r1,r2,i0,cc) _iqmuli(_jit,r0,r1,r2,i0,cc)
449 static void _iqmuli(jit_state_t*,jit_int32_t,jit_int32_t,
450 jit_int32_t,jit_word_t,jit_bool_t);
451 # define divr(r0,r1,r2) _divr(_jit,r0,r1,r2)
452 static void _divr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
453 # define divi(r0,r1,i0) _divi(_jit,r0,r1,i0)
454 static void _divi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
455 # define divr_u(r0,r1,r2) _divr_u(_jit,r0,r1,r2)
456 static void _divr_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
457 # define divi_u(r0,r1,i0) _divi_u(_jit,r0,r1,i0)
458 static void _divi_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
459 # define qdivr(r0,r1,r2,r3) iqdivr(r0,r1,r2,r3,1)
460 # define qdivr_u(r0,r1,r2,r3) iqdivr(r0,r1,r2,r3,0)
461 # define iqdivr(r0,r1,r2,r3,cc) _iqdivr(_jit,r0,r1,r2,r3,cc)
462 static void _iqdivr(jit_state_t*,jit_int32_t,jit_int32_t,
463 jit_int32_t,jit_int32_t,jit_bool_t);
464 # define qdivi(r0,r1,r2,i0) iqdivi(r0,r1,r2,i0,1)
465 # define qdivi_u(r0,r1,r2,i0) iqdivi(r0,r1,r2,i0,0)
466 # define iqdivi(r0,r1,r2,i0,cc) _iqdivi(_jit,r0,r1,r2,i0,cc)
467 static void _iqdivi(jit_state_t*,jit_int32_t,jit_int32_t,
468 jit_int32_t,jit_word_t,jit_bool_t);
469 # define remr(r0,r1,r2) _remr(_jit,r0,r1,r2)
470 static void _remr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
471 # define remi(r0,r1,i0) _remi(_jit,r0,r1,i0)
472 static void _remi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
473 # define remr_u(r0,r1,r2) _remr_u(_jit,r0,r1,r2)
474 static void _remr_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
475 # define remi_u(r0,r1,i0) _remi_u(_jit,r0,r1,i0)
476 static void _remi_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
477 # if __WORDSIZE == 32
478 # define lshr(r0,r1,r2) SLLV(r0,r1,r2)
479 # define lshi(r0,r1,i0) SLL(r0,r1,i0)
480 # define rshr(r0,r1,r2) SRAV(r0,r1,r2)
481 # define rshi(r0,r1,i0) SRA(r0,r1,i0)
482 # define rshr_u(r0,r1,r2) SRLV(r0,r1,r2)
483 # define rshi_u(r0,r1,i0) SRL(r0,r1,i0)
485 # define lshr(r0,r1,r2) DSLLV(r0,r1,r2)
486 # define lshi(r0,r1,i0) _lshi(_jit,r0,r1,i0)
487 static void _lshi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
488 # define rshr(r0,r1,r2) DSRAV(r0,r1,r2)
489 # define rshi(r0,r1,i0) _rshi(_jit,r0,r1,i0)
490 static void _rshi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
491 # define rshr_u(r0,r1,r2) DSRLV(r0,r1,r2)
492 # define rshi_u(r0,r1,i0) _rshi_u(_jit,r0,r1,i0)
493 static void _rshi_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
495 # define andr(r0,r1,r2) AND(r0,r1,r2)
496 # define andi(r0,r1,i0) _andi(_jit,r0,r1,i0)
497 static void _andi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
498 # define orr(r0,r1,r2) OR(r0,r1,r2)
499 # define ori(r0,r1,i0) _ori(_jit,r0,r1,i0)
500 static void _ori(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
501 # define xorr(r0,r1,r2) XOR(r0,r1,r2)
502 # define xori(r0,r1,i0) _xori(_jit,r0,r1,i0)
503 static void _xori(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
504 # define movr(r0,r1) _movr(_jit,r0,r1)
505 static void _movr(jit_state_t*,jit_int32_t,jit_int32_t);
506 # define movi(r0,i0) _movi(_jit,r0,i0)
507 static void _movi(jit_state_t*,jit_int32_t,jit_word_t);
508 # define movi_p(r0,i0) _movi_p(_jit,r0,i0)
509 static jit_word_t _movi_p(jit_state_t*,jit_int32_t,jit_word_t);
510 # define movnr(r0,r1,r2) MOVN(r0, r1, r2)
511 # define movzr(r0,r1,r2) MOVZ(r0, r1, r2)
512 # define ldr_c(r0,r1) LB(r0,0,r1)
513 # define ldi_c(r0,i0) _ldi_c(_jit,r0,i0)
514 static void _ldi_c(jit_state_t*,jit_int32_t,jit_word_t);
515 # define ldr_uc(r0,r1) LBU(r0,0,r1)
516 # define ldi_uc(r0,i0) _ldi_uc(_jit,r0,i0)
517 static void _ldi_uc(jit_state_t*,jit_int32_t,jit_word_t);
518 # define ldr_s(r0,r1) LH(r0,0,r1)
519 # define ldi_s(r0,i0) _ldi_s(_jit,r0,i0)
520 static void _ldi_s(jit_state_t*,jit_int32_t,jit_word_t);
521 # define ldr_us(r0,r1) LHU(r0,0,r1)
522 # define ldi_us(r0,i0) _ldi_us(_jit,r0,i0)
523 static void _ldi_us(jit_state_t*,jit_int32_t,jit_word_t);
524 # define ldr_i(r0,r1) LW(r0,0,r1)
525 # define ldi_i(r0,i0) _ldi_i(_jit,r0,i0)
526 static void _ldi_i(jit_state_t*,jit_int32_t,jit_word_t);
527 # if __WORDSIZE == 64
528 # define ldr_ui(r0,r1) LWU(r0,0,r1)
529 # define ldi_ui(r0,i0) _ldi_ui(_jit,r0,i0)
530 static void _ldi_ui(jit_state_t*,jit_int32_t,jit_word_t);
531 # define ldr_l(r0,r1) LD(r0,0,r1)
532 # define ldi_l(r0,i0) _ldi_l(_jit,r0,i0)
533 static void _ldi_l(jit_state_t*,jit_int32_t,jit_word_t);
535 # define ldxr_c(r0,r1,r2) _ldxr_c(_jit,r0,r1,r2)
536 static void _ldxr_c(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
537 # define ldxi_c(r0,r1,i0) _ldxi_c(_jit,r0,r1,i0)
538 static void _ldxi_c(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
539 # define ldxr_uc(r0,r1,r2) _ldxr_uc(_jit,r0,r1,r2)
540 static void _ldxr_uc(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
541 # define ldxi_uc(r0,r1,i0) _ldxi_uc(_jit,r0,r1,i0)
542 static void _ldxi_uc(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
543 # define ldxr_s(r0,r1,r2) _ldxr_s(_jit,r0,r1,r2)
544 static void _ldxr_s(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
545 # define ldxi_s(r0,r1,i0) _ldxi_s(_jit,r0,r1,i0)
546 static void _ldxi_s(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
547 # define ldxr_us(r0,r1,r2) _ldxr_us(_jit,r0,r1,r2)
548 static void _ldxr_us(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
549 # define ldxi_us(r0,r1,i0) _ldxi_us(_jit,r0,r1,i0)
550 static void _ldxi_us(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
551 # define ldxr_i(r0,r1,r2) _ldxr_i(_jit,r0,r1,r2)
552 static void _ldxr_i(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
553 # define ldxi_i(r0,r1,i0) _ldxi_i(_jit,r0,r1,i0)
554 static void _ldxi_i(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
555 # if __WORDSIZE == 64
556 # define ldxr_ui(r0,r1,r2) _ldxr_ui(_jit,r0,r1,r2)
557 static void _ldxr_ui(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
558 # define ldxi_ui(r0,r1,i0) _ldxi_ui(_jit,r0,r1,i0)
559 static void _ldxi_ui(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
560 # define ldxr_l(r0,r1,r2) _ldxr_l(_jit,r0,r1,r2)
561 static void _ldxr_l(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
562 # define ldxi_l(r0,r1,i0) _ldxi_l(_jit,r0,r1,i0)
563 static void _ldxi_l(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
565 # define str_c(r0,r1) SB(r1,0,r0)
566 # define sti_c(i0,r0) _sti_c(_jit,i0,r0)
567 static void _sti_c(jit_state_t*,jit_word_t,jit_int32_t);
568 # define str_s(r0,r1) SH(r1,0,r0)
569 # define sti_s(i0,r0) _sti_s(_jit,i0,r0)
570 static void _sti_s(jit_state_t*,jit_word_t,jit_int32_t);
571 # define str_i(r0,r1) SW(r1,0,r0)
572 # define sti_i(i0,r0) _sti_i(_jit,i0,r0)
573 static void _sti_i(jit_state_t*,jit_word_t,jit_int32_t);
574 # if __WORDSIZE == 64
575 # define str_l(r0,r1) SD(r1,0,r0)
576 # define sti_l(i0,r0) _sti_l(_jit,i0,r0)
577 static void _sti_l(jit_state_t*,jit_word_t,jit_int32_t);
579 # define stxr_c(r0,r1,r2) _stxr_c(_jit,r0,r1,r2)
580 static void _stxr_c(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
581 # define stxi_c(i0,r0,r1) _stxi_c(_jit,i0,r0,r1)
582 static void _stxi_c(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
583 # define stxr_s(r0,r1,r2) _stxr_s(_jit,r0,r1,r2)
584 static void _stxr_s(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
585 # define stxi_s(i0,r0,r1) _stxi_s(_jit,i0,r0,r1)
586 static void _stxi_s(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
587 # define stxr_i(r0,r1,r2) _stxr_i(_jit,r0,r1,r2)
588 static void _stxr_i(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
589 # define stxi_i(i0,r0,r1) _stxi_i(_jit,i0,r0,r1)
590 static void _stxi_i(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
591 # if __WORDSIZE == 64
592 # define stxr_l(r0,r1,r2) _stxr_l(_jit,r0,r1,r2)
593 static void _stxr_l(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
594 # define stxi_l(i0,r0,r1) _stxi_l(_jit,i0,r0,r1)
595 static void _stxi_l(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
597 # if __BYTE_ORDER == __LITTLE_ENDIAN
598 # define htonr_us(r0,r1) _htonr_us(_jit,r0,r1)
599 static void _htonr_us(jit_state_t*,jit_int32_t,jit_int32_t);
600 # define htonr_ui(r0,r1) _htonr_ui(_jit,r0,r1)
601 static void _htonr_ui(jit_state_t*,jit_int32_t,jit_int32_t);
602 # if __WORDSIZE == 64
603 # define htonr_ul(r0,r1) _htonr_ul(_jit,r0,r1)
604 static void _htonr_ul(jit_state_t*,jit_int32_t,jit_int32_t);
607 # define htonr_us(r0,r1) extr_us(r0,r1)
608 # if __WORDSIZE == 32
609 # define htonr_ui(r0,r1) movr(r0,r1)
611 # define htonr_ui(r0,r1) extr_ui(r0,r1)
612 # define htonr_ul(r0,r1) movr(r0,r1)
615 # define extr_c(r0,r1) _extr_c(_jit,r0,r1)
616 static void _extr_c(jit_state_t*,jit_int32_t,jit_int32_t);
617 # define extr_uc(r0,r1) ANDI(r0,r1,0xff)
618 # define extr_s(r0,r1) _extr_s(_jit,r0,r1)
619 static void _extr_s(jit_state_t*,jit_int32_t,jit_int32_t);
620 # define extr_us(r0,r1) ANDI(r0,r1,0xffff)
621 # if __WORDSIZE == 64
622 # define extr_i(r0,r1) SLL(r0,r1,0)
623 # define extr_ui(r0,r1) _extr_ui(_jit,r0,r1)
624 static void _extr_ui(jit_state_t*,jit_int32_t,jit_int32_t);
626 # define ltr(r0,r1,r2) SLT(r0,r1,r2)
627 # define lti(r0,r1,i0) _lti(_jit,r0,r1,i0)
628 static void _lti(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
629 # define ltr_u(r0,r1,r2) SLTU(r0,r1,r2)
630 # define lti_u(r0,r1,i0) _lti_u(_jit,r0,r1,i0)
631 static void _lti_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
632 #define ler(r0,r1,r2) _ler(_jit,r0,r1,r2)
633 static void _ler(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
634 #define lei(r0,r1,i0) _lei(_jit,r0,r1,i0)
635 static void _lei(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
636 #define ler_u(r0,r1,r2) _ler_u(_jit,r0,r1,r2)
637 static void _ler_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
638 #define lei_u(r0,r1,i0) _lei_u(_jit,r0,r1,i0)
639 static void _lei_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
640 #define eqr(r0,r1,r2) _eqr(_jit,r0,r1,r2)
641 static void _eqr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
642 #define eqi(r0,r1,i0) _eqi(_jit,r0,r1,i0)
643 static void _eqi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
644 #define ger(r0,r1,r2) _ger(_jit,r0,r1,r2)
645 static void _ger(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
646 #define gei(r0,r1,i0) _gei(_jit,r0,r1,i0)
647 static void _gei(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
648 #define ger_u(r0,r1,i0) _ger_u(_jit,r0,r1,i0)
649 static void _ger_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
650 #define gei_u(r0,r1,i0) _gei_u(_jit,r0,r1,i0)
651 static void _gei_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
652 # define gtr(r0,r1,r2) SLT(r0,r2,r1)
653 #define gti(r0,r1,i0) _gti(_jit,r0,r1,i0)
654 static void _gti(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
655 # define gtr_u(r0,r1,r2) SLTU(r0,r2,r1)
656 # define gti_u(r0,r1,i0) _gti_u(_jit,r0,r1,i0)
657 static void _gti_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
658 #define ner(r0,r1,r2) _ner(_jit,r0,r1,r2)
659 static void _ner(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
660 #define nei(r0,r1,i0) _nei(_jit,r0,r1,i0)
661 static void _nei(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
662 #define bltr(i0,r0,r1) _bltr(_jit,i0,r0,r1)
663 static jit_word_t _bltr(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
664 #define bltr_u(i0,r0,r1) _bltr_u(_jit,i0,r0,r1)
665 static jit_word_t _bltr_u(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
666 #define blti(i0,r0,i1) _blti(_jit,i0,r0,i1)
667 static jit_word_t _blti(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
668 #define blti_u(i0,r0,i1) _blti_u(_jit,i0,r0,i1)
669 static jit_word_t _blti_u(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
670 #define bler(i0,r0,r1) _bler(_jit,i0,r0,r1)
671 static jit_word_t _bler(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
672 #define bler_u(i0,r0,r1) _bler_u(_jit,i0,r0,r1)
673 static jit_word_t _bler_u(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
674 #define blei(i0,r0,i1) _blei(_jit,i0,r0,i1)
675 static jit_word_t _blei(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
676 #define blei_u(i0,r0,i1) _blei_u(_jit,i0,r0,i1)
677 static jit_word_t _blei_u(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
678 #define beqr(i0,r0,r1) _beqr(_jit,i0,r0,r1)
679 static jit_word_t _beqr(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
680 #define beqi(i0,r0,i1) _beqi(_jit,i0,r0,i1)
681 static jit_word_t _beqi(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
682 #define bger(i0,r0,r1) _bger(_jit,i0,r0,r1)
683 static jit_word_t _bger(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
684 #define bger_u(i0,r0,r1) _bger_u(_jit,i0,r0,r1)
685 static jit_word_t _bger_u(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
686 #define bgei(i0,r0,i1) _bgei(_jit,i0,r0,i1)
687 static jit_word_t _bgei(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
688 #define bgei_u(i0,r0,i1) _bgei_u(_jit,i0,r0,i1)
689 static jit_word_t _bgei_u(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
690 #define bgtr(i0,r0,r1) _bgtr(_jit,i0,r0,r1)
691 static jit_word_t _bgtr(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
692 #define bgtr_u(i0,r0,r1) _bgtr_u(_jit,i0,r0,r1)
693 static jit_word_t _bgtr_u(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
694 #define bgti(i0,r0,i1) _bgti(_jit,i0,r0,i1)
695 static jit_word_t _bgti(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
696 #define bgti_u(i0,r0,i1) _bgti_u(_jit,i0,r0,i1)
697 static jit_word_t _bgti_u(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
698 #define bner(i0,r0,r1) _bner(_jit,i0,r0,r1)
699 static jit_word_t _bner(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
700 #define bnei(i0,r0,i1) _bnei(_jit,i0,r0,i1)
701 static jit_word_t _bnei(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
702 # define jmpr(r0) _jmpr(_jit,r0)
703 static void _jmpr(jit_state_t*,jit_int32_t);
704 # define jmpi(i0) _jmpi(_jit,i0)
705 static jit_word_t _jmpi(jit_state_t*,jit_word_t);
706 # define boaddr(i0,r0,r1) _boaddr(_jit,i0,r0,r1)
707 static jit_word_t _boaddr(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
708 # define boaddi(i0,r0,i1) _boaddi(_jit,i0,r0,i1)
709 static jit_word_t _boaddi(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
710 # define boaddr_u(i0,r0,r1) _boaddr_u(_jit,i0,r0,r1)
711 static jit_word_t _boaddr_u(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
712 # define boaddi_u(i0,r0,i1) _boaddi_u(_jit,i0,r0,i1)
713 static jit_word_t _boaddi_u(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
714 # define bxaddr(i0,r0,r1) _bxaddr(_jit,i0,r0,r1)
715 static jit_word_t _bxaddr(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
716 # define bxaddi(i0,r0,i1) _bxaddi(_jit,i0,r0,i1)
717 static jit_word_t _bxaddi(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
718 # define bxaddr_u(i0,r0,r1) _bxaddr_u(_jit,i0,r0,r1)
719 static jit_word_t _bxaddr_u(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
720 # define bxaddi_u(i0,r0,i1) _bxaddi_u(_jit,i0,r0,i1)
721 static jit_word_t _bxaddi_u(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
722 # define bosubr(i0,r0,r1) _bosubr(_jit,i0,r0,r1)
723 static jit_word_t _bosubr(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
724 # define bosubi(i0,r0,i1) _bosubi(_jit,i0,r0,i1)
725 static jit_word_t _bosubi(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
726 # define bosubr_u(i0,r0,r1) _bosubr_u(_jit,i0,r0,r1)
727 static jit_word_t _bosubr_u(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
728 # define bosubi_u(i0,r0,i1) _bosubi_u(_jit,i0,r0,i1)
729 static jit_word_t _bosubi_u(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
730 # define bxsubr(i0,r0,r1) _bxsubr(_jit,i0,r0,r1)
731 static jit_word_t _bxsubr(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
732 # define bxsubi(i0,r0,i1) _bxsubi(_jit,i0,r0,i1)
733 static jit_word_t _bxsubi(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
734 # define bxsubr_u(i0,r0,r1) _bxsubr_u(_jit,i0,r0,r1)
735 static jit_word_t _bxsubr_u(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
736 # define bxsubi_u(i0,r0,i1) _bxsubi_u(_jit,i0,r0,i1)
737 static jit_word_t _bxsubi_u(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
738 # define bmsr(i0,r0,r1) _bmsr(_jit,i0,r0,r1)
739 static jit_word_t _bmsr(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
740 # define bmsi(i0,r0,i1) _bmsi(_jit,i0,r0,i1)
741 static jit_word_t _bmsi(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
742 # define bmcr(i0,r0,r1) _bmcr(_jit,i0,r0,r1)
743 static jit_word_t _bmcr(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
744 # define bmci(i0,r0,i1) _bmci(_jit,i0,r0,i1)
745 static jit_word_t _bmci(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
746 # define callr(r0) _callr(_jit,r0)
747 static void _callr(jit_state_t*,jit_int32_t);
748 # define calli(i0) _calli(_jit,i0)
749 static void _calli(jit_state_t*,jit_word_t);
750 # define calli_p(i0) _calli_p(_jit,i0)
751 static jit_word_t _calli_p(jit_state_t*,jit_word_t);
752 # define prolog(node) _prolog(_jit,node)
753 static void _prolog(jit_state_t*,jit_node_t*);
754 # define epilog(node) _epilog(_jit,node)
755 static void _epilog(jit_state_t*,jit_node_t*);
756 # define vastart(r0) _vastart(_jit, r0)
757 static void _vastart(jit_state_t*, jit_int32_t);
758 # define vaarg(r0, r1) _vaarg(_jit, r0, r1)
759 static void _vaarg(jit_state_t*, jit_int32_t, jit_int32_t);
760 #define patch_abs(instr,label) _patch_abs(_jit,instr,label)
761 static void _patch_abs(jit_state_t*,jit_word_t,jit_word_t);
762 #define patch_at(jump,label) _patch_at(_jit,jump,label)
763 static void _patch_at(jit_state_t*,jit_word_t,jit_word_t);
768 _hrrrit(jit_state_t *_jit,jit_int32_t hc,
769 jit_int32_t rs, jit_int32_t rt, jit_int32_t rd,
770 jit_int32_t ic, jit_int32_t tc)
783 _hrri(jit_state_t *_jit, jit_int32_t hc,
784 jit_int32_t rs, jit_int32_t rt, jit_int32_t im)
796 _hi(jit_state_t *_jit, jit_int32_t hc, jit_int32_t im)
805 _nop(jit_state_t *_jit, jit_int32_t i0)
807 for (; i0 > 0; i0 -= 4)
813 _addi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
818 else if (can_sign_extend_short_p(i0))
821 reg = jit_get_reg(jit_class_gpr);
823 addr(r0, r1, rn(reg));
829 _addcr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
833 if (jit_carry == _NOREG)
834 jit_carry = jit_get_reg(jit_class_gpr);
836 t0 = jit_get_reg(jit_class_gpr);
837 addr(rn(t0), r1, r2);
838 SLTU(rn(jit_carry), rn(t0), r1);
844 SLTU(rn(jit_carry), r0, r1);
849 _addci(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
853 if (jit_carry == _NOREG)
854 jit_carry = jit_get_reg(jit_class_gpr);
855 t0 = jit_get_reg(jit_class_gpr);
857 if (can_sign_extend_short_p(i0))
858 addiu(rn(t0), r1, i0);
861 addr(rn(t0), r1, rn(t0));
863 SLTU(rn(jit_carry), rn(t0), r1);
867 if (can_sign_extend_short_p(i0))
871 addr(r0, r1, rn(t0));
873 SLTU(rn(jit_carry), r0, r1);
879 _addxr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
883 assert(jit_carry != _NOREG);
884 t0 = jit_get_reg(jit_class_gpr);
885 movr(rn(t0), rn(jit_carry));
887 addcr(r0, r0, rn(t0));
892 _addxi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
896 assert(jit_carry != _NOREG);
897 t0 = jit_get_reg(jit_class_gpr);
898 movr(rn(t0), rn(jit_carry));
900 addcr(r0, r0, rn(t0));
905 _subi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
910 else if (can_sign_extend_short_p(i0) && (i0 & 0xffff) != 0x8000)
913 reg = jit_get_reg(jit_class_gpr);
915 subr(r0, r1, rn(reg));
921 _subcr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
925 if (jit_carry == _NOREG)
926 jit_carry = jit_get_reg(jit_class_gpr);
928 t0 = jit_get_reg(jit_class_gpr);
929 subr(rn(t0), r1, r2);
930 SLTU(rn(jit_carry), r1, rn(t0));
936 SLTU(rn(jit_carry), r1, r0);
941 _subci(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
945 if (jit_carry == _NOREG)
946 jit_carry = jit_get_reg(jit_class_gpr);
947 t0 = jit_get_reg(jit_class_gpr);
949 if (can_sign_extend_short_p(i0) && (i0 & 0xffff) != 0x8000)
950 addiu(rn(t0), r1, -i0);
953 subr(rn(t0), r1, rn(t0));
955 SLTU(rn(jit_carry), r1, rn(t0));
959 if (can_sign_extend_short_p(i0) && (i0 & 0xffff) != 0x8000)
963 subr(r0, r1, rn(t0));
965 SLTU(rn(jit_carry), r1, r0);
971 _subxr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
975 assert(jit_carry != _NOREG);
976 t0 = jit_get_reg(jit_class_gpr);
977 movr(rn(t0), rn(jit_carry));
979 subcr(r0, r0, rn(t0));
984 _subxi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
988 assert(jit_carry != _NOREG);
989 t0 = jit_get_reg(jit_class_gpr);
990 movr(rn(t0), rn(jit_carry));
992 subcr(r0, r0, rn(t0));
997 _rsbi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1004 _mulr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1011 _muli(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1015 reg = jit_get_reg(jit_class_gpr);
1017 mulr(r0, r1, rn(reg));
1022 _iqmulr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1,
1023 jit_int32_t r2, jit_int32_t r3, jit_bool_t sign)
1034 _iqmuli(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1,
1035 jit_int32_t r2, jit_word_t i0, jit_bool_t sign)
1038 reg = jit_get_reg(jit_class_gpr);
1040 iqmulr(r0, r1, r2, rn(reg), sign);
1045 _divr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1052 _divi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1055 reg = jit_get_reg(jit_class_gpr);
1057 divr(r0, r1, rn(reg));
1062 _divr_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1069 _divi_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1072 reg = jit_get_reg(jit_class_gpr);
1074 divr_u(r0, r1, rn(reg));
1079 _iqdivr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1,
1080 jit_int32_t r2, jit_int32_t r3, jit_bool_t sign)
1091 _iqdivi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1,
1092 jit_int32_t r2, jit_word_t i0, jit_bool_t sign)
1095 reg = jit_get_reg(jit_class_gpr);
1097 iqdivr(r0, r1, r2, rn(reg), sign);
1102 _remr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1109 _remi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1112 reg = jit_get_reg(jit_class_gpr);
1114 remr(r0, r1, rn(reg));
1119 _remr_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1126 _remi_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1129 reg = jit_get_reg(jit_class_gpr);
1131 remr_u(r0, r1, rn(reg));
1135 #if __WORDSIZE == 64
1137 _lshi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1139 assert(i0 >= 0 && i0 <= 63);
1143 DSLL32(r0, r1, i0 - 32);
1147 _rshi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1149 assert(i0 >= 0 && i0 <= 63);
1153 DSRA32(r0, r1, i0 - 32);
1157 _rshi_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1159 assert(i0 >= 0 && i0 <= 63);
1163 DSRL32(r0, r1, i0 - 32);
1168 _andi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1171 if (can_zero_extend_short_p(i0))
1173 else if (is_low_mask(i0)) {
1174 #if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
1175 if (masked_bits_count(i0) <= 32)
1176 EXT(r0, r1, 0, masked_bits_count(i0));
1180 lshi(r0, r1, unmasked_bits_count(i0));
1181 rshi_u(r0, r0, unmasked_bits_count(i0));
1183 } else if (is_high_mask(i0)) {
1184 rshi(r0, r1, unmasked_bits_count(i0));
1185 lshi(r0, r0, unmasked_bits_count(i0));
1187 reg = jit_get_reg(jit_class_gpr);
1189 AND(r0, r1, rn(reg));
1195 _ori(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1198 if (can_zero_extend_short_p(i0))
1201 reg = jit_get_reg(jit_class_gpr);
1203 OR(r0, r1, rn(reg));
1209 _xori(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1212 if (can_zero_extend_short_p(i0))
1215 reg = jit_get_reg(jit_class_gpr);
1217 XOR(r0, r1, rn(reg));
1223 _movr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1226 orr(r0, r1, _ZERO_REGNO);
1230 _movi(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
1233 OR(r0, _ZERO_REGNO, _ZERO_REGNO);
1234 else if (can_sign_extend_short_p(i0))
1235 addiu(r0, _ZERO_REGNO, i0);
1236 else if (can_zero_extend_short_p(i0))
1237 ORI(r0, _ZERO_REGNO, i0);
1239 if (can_sign_extend_int_p(i0))
1241 else if (can_zero_extend_int_p(i0)) {
1242 if (i0 & 0xffff0000) {
1243 ORI(r0, _ZERO_REGNO, i0 >> 16);
1247 # if __WORDSIZE == 64
1249 movi(r0, (jit_uword_t)i0 >> 32);
1250 if (i0 & 0xffff0000) {
1252 ORI(r0, r0, i0 >> 16);
1265 _movi_p(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
1270 # if __WORDSIZE == 32
1275 ORI(r0, r0, i0 >> 32);
1277 ORI(r0, r0, i0 >> 16);
1286 _ldi_c(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
1289 if (can_sign_extend_short_p(i0))
1290 LB(r0, i0, _ZERO_REGNO);
1292 reg = jit_get_reg(jit_class_gpr);
1300 _ldi_uc(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
1303 if (can_sign_extend_short_p(i0))
1304 LBU(r0, i0, _ZERO_REGNO);
1306 reg = jit_get_reg(jit_class_gpr);
1308 ldr_uc(r0, rn(reg));
1314 _ldi_s(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
1317 if (can_sign_extend_short_p(i0))
1318 LH(r0, i0, _ZERO_REGNO);
1320 reg = jit_get_reg(jit_class_gpr);
1328 _ldi_us(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
1331 if (can_sign_extend_short_p(i0))
1332 LHU(r0, i0, _ZERO_REGNO);
1334 reg = jit_get_reg(jit_class_gpr);
1336 ldr_us(r0, rn(reg));
1342 _ldi_i(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
1345 if (can_sign_extend_short_p(i0))
1346 LW(r0, i0, _ZERO_REGNO);
1348 reg = jit_get_reg(jit_class_gpr);
1355 #if __WORDSIZE == 64
1357 _ldi_ui(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
1360 if (can_sign_extend_short_p(i0))
1361 LWU(r0, i0, _ZERO_REGNO);
1363 reg = jit_get_reg(jit_class_gpr);
1365 ldr_ui(r0, rn(reg));
1371 _ldi_l(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
1374 if (can_sign_extend_short_p(i0))
1375 LD(r0, i0, _ZERO_REGNO);
1377 reg = jit_get_reg(jit_class_gpr);
1386 _ldxr_c(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1 ,jit_int32_t r2)
1389 reg = jit_get_reg(jit_class_gpr);
1390 addr(rn(reg), r1, r2);
1396 _ldxi_c(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1399 if (can_sign_extend_short_p(i0))
1402 reg = jit_get_reg(jit_class_gpr);
1403 addi(rn(reg), r1, i0);
1410 _ldxr_uc(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1 ,jit_int32_t r2)
1413 reg = jit_get_reg(jit_class_gpr);
1414 addr(rn(reg), r1, r2);
1415 ldr_uc(r0, rn(reg));
1420 _ldxi_uc(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1423 if (can_sign_extend_short_p(i0))
1426 reg = jit_get_reg(jit_class_gpr);
1427 addi(rn(reg), r1, i0);
1428 ldr_uc(r0, rn(reg));
1434 _ldxr_s(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1 ,jit_int32_t r2)
1437 reg = jit_get_reg(jit_class_gpr);
1438 addr(rn(reg), r1, r2);
1444 _ldxi_s(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1447 if (can_sign_extend_short_p(i0))
1450 reg = jit_get_reg(jit_class_gpr);
1451 addi(rn(reg), r1, i0);
1458 _ldxr_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1 ,jit_int32_t r2)
1461 reg = jit_get_reg(jit_class_gpr);
1462 addr(rn(reg), r1, r2);
1463 ldr_us(r0, rn(reg));
1468 _ldxi_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1471 if (can_sign_extend_short_p(i0))
1474 reg = jit_get_reg(jit_class_gpr);
1475 addi(rn(reg), r1, i0);
1476 ldr_us(r0, rn(reg));
1482 _ldxr_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1 ,jit_int32_t r2)
1485 reg = jit_get_reg(jit_class_gpr);
1486 addr(rn(reg), r1, r2);
1492 _ldxi_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1495 if (can_sign_extend_short_p(i0))
1498 reg = jit_get_reg(jit_class_gpr);
1499 addi(rn(reg), r1, i0);
1505 #if __WORDSIZE == 64
1507 _ldxr_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1 ,jit_int32_t r2)
1510 reg = jit_get_reg(jit_class_gpr);
1511 addr(rn(reg), r1, r2);
1512 ldr_ui(r0, rn(reg));
1517 _ldxi_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1520 if (can_sign_extend_short_p(i0))
1523 reg = jit_get_reg(jit_class_gpr);
1524 addi(rn(reg), r1, i0);
1525 ldr_ui(r0, rn(reg));
1531 _ldxr_l(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1 ,jit_int32_t r2)
1534 reg = jit_get_reg(jit_class_gpr);
1535 addr(rn(reg), r1, r2);
1541 _ldxi_l(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1544 if (can_sign_extend_short_p(i0))
1547 reg = jit_get_reg(jit_class_gpr);
1548 addi(rn(reg), r1, i0);
1556 _sti_c(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
1559 if (can_sign_extend_short_p(i0))
1560 SB(r0, i0, _ZERO_REGNO);
1562 reg = jit_get_reg(jit_class_gpr);
1570 _sti_s(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
1573 if (can_sign_extend_short_p(i0))
1574 SH(r0, i0, _ZERO_REGNO);
1576 reg = jit_get_reg(jit_class_gpr);
1584 _sti_i(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
1587 if (can_sign_extend_short_p(i0))
1588 SW(r0, i0, _ZERO_REGNO);
1590 reg = jit_get_reg(jit_class_gpr);
1597 #if __WORDSIZE == 64
1599 _sti_l(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
1602 if (can_sign_extend_short_p(i0))
1603 SD(r0, i0, _ZERO_REGNO);
1605 reg = jit_get_reg(jit_class_gpr);
1614 _stxr_c(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1617 reg = jit_get_reg(jit_class_gpr);
1618 addr(rn(reg), r0, r1);
1624 _stxi_c(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
1627 if (can_sign_extend_short_p(i0))
1630 reg = jit_get_reg(jit_class_gpr);
1631 addi(rn(reg), r0, i0);
1638 _stxr_s(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1 ,jit_int32_t r2)
1641 reg = jit_get_reg(jit_class_gpr);
1642 addr(rn(reg), r0, r1);
1648 _stxi_s(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
1651 if (can_sign_extend_short_p(i0))
1654 reg = jit_get_reg(jit_class_gpr);
1655 addi(rn(reg), r0, i0);
1662 _stxr_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1 ,jit_int32_t r2)
1665 reg = jit_get_reg(jit_class_gpr);
1666 addr(rn(reg), r0, r1);
1672 _stxi_i(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
1675 if (can_sign_extend_short_p(i0))
1678 reg = jit_get_reg(jit_class_gpr);
1679 addi(rn(reg), r0, i0);
1685 #if __WORDSIZE == 64
1687 _stxr_l(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1 ,jit_int32_t r2)
1690 reg = jit_get_reg(jit_class_gpr);
1691 addr(rn(reg), r0, r1);
1697 _stxi_l(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
1700 if (can_sign_extend_short_p(i0))
1703 reg = jit_get_reg(jit_class_gpr);
1704 addi(rn(reg), r0, i0);
1711 # if __BYTE_ORDER == __LITTLE_ENDIAN
1713 _htonr_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1716 t0 = jit_get_reg(jit_class_gpr);
1717 rshi(rn(t0), r1, 8);
1719 andi(rn(t0), rn(t0), 0xff);
1721 orr(r0, r0, rn(t0));
1726 _htonr_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1731 t0 = jit_get_reg(jit_class_gpr);
1732 t1 = jit_get_reg(jit_class_gpr);
1733 t2 = jit_get_reg(jit_class_gpr);
1734 rshi(rn(t0), r1, 24);
1735 rshi(rn(t1), r1, 16);
1736 rshi(rn(t2), r1, 8);
1737 andi(rn(t0), rn(t0), 0xff);
1738 andi(rn(t1), rn(t1), 0xff);
1739 andi(rn(t2), rn(t2), 0xff);
1742 lshi(rn(t1), rn(t1), 8);
1743 orr(r0, r0, rn(t0));
1744 lshi(rn(t2), rn(t2), 16);
1745 orr(r0, r0, rn(t1));
1746 orr(r0, r0, rn(t2));
1753 _htonr_ul(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1756 reg = jit_get_reg(jit_class_gpr);
1757 rshi_u(rn(reg), r1, 32);
1759 htonr_ui(rn(reg), rn(reg));
1761 orr(r0, r0, rn(reg));
1767 _extr_c(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1772 lshi(r0, r1, __WORDSIZE - 8);
1773 rshi(r0, r0, __WORDSIZE - 8);
1778 _extr_s(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1783 lshi(r0, r1, __WORDSIZE - 16);
1784 rshi(r0, r0, __WORDSIZE - 16);
1788 # if __WORDSIZE == 64
1790 _extr_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1798 _lti(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1802 if (can_sign_extend_short_p(i0))
1805 reg = jit_get_reg(jit_class_gpr);
1807 ltr(r0, r1, rn(reg));
1813 _lti_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1817 if (can_sign_extend_short_p(i0))
1820 reg = jit_get_reg(jit_class_gpr);
1822 ltr_u(r0, r1, rn(reg));
1828 _ler(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1835 _lei(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1840 SLT(r0, _ZERO_REGNO, r1);
1844 reg = jit_get_reg(jit_class_gpr);
1846 ler(r0, r1, rn(reg));
1852 _ler_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1859 _lei_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1864 SLTU(r0, _ZERO_REGNO, r1);
1868 reg = jit_get_reg(jit_class_gpr);
1870 ler_u(r0, r1, rn(reg));
1876 _eqr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1879 SLTU(r0, _ZERO_REGNO, r0);
1884 _eqi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1888 SLTU(r0, _ZERO_REGNO, r0);
1891 SLTU(r0, _ZERO_REGNO, r1);
1896 _ger(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1903 _gei(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1907 reg = jit_get_reg(jit_class_gpr);
1909 ger(r0, r1, rn(reg));
1914 _ger_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1921 _gei_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1925 reg = jit_get_reg(jit_class_gpr);
1927 ger_u(r0, r1, rn(reg));
1932 _gti(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1937 SLT(r0, _ZERO_REGNO, r1);
1939 reg = jit_get_reg(jit_class_gpr);
1941 SLT(r0, rn(reg), r1);
1947 _gti_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1952 SLTU(r0, _ZERO_REGNO, r1);
1954 reg = jit_get_reg(jit_class_gpr);
1956 SLTU(r0, rn(reg), r1);
1962 _ner(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1965 SLTU(r0, _ZERO_REGNO, r0);
1969 _nei(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1973 SLTU(r0, _ZERO_REGNO, r0);
1976 SLTU(r0, _ZERO_REGNO, r1);
1980 _bltr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
1985 reg = jit_get_reg(jit_class_gpr);
1986 SLT(rn(reg), r0, r1);
1988 BNE(rn(reg), _ZERO_REGNO, ((i0 - w) >> 2) - 1);
1996 _bltr_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2001 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2002 SLTU(rn(reg), r0, r1);
2004 BNE(rn(reg), _ZERO_REGNO, ((i0 - w) >> 2) - 1);
2012 _blti(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
2019 if (!(zero_p = i1 == 0))
2020 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2021 if (can_sign_extend_short_p(i1)) {
2023 SLTI(rn(reg), r0, i1);
2025 d = ((i0 - w) >> 2) - 1;
2027 BNE(rn(reg), _ZERO_REGNO, d);
2034 w = bltr(i0, r0, rn(reg));
2043 _blti_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
2048 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2049 if (can_sign_extend_short_p(i1)) {
2050 SLTIU(rn(reg), r0, i1);
2052 BNE(rn(reg), _ZERO_REGNO, ((i0 - w) >> 2) - 1);
2057 w = bltr_u(i0, r0, rn(reg));
2065 _bler(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2070 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2071 SLT(rn(reg), r1, r0);
2073 BEQ(rn(reg), _ZERO_REGNO, ((i0 - w) >> 2) - 1);
2081 _bler_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2086 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2087 SLTU(rn(reg), r1, r0);
2089 BEQ(rn(reg), _ZERO_REGNO, ((i0 - w) >> 2) - 1);
2097 _blei(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
2104 BLEZ(r0, ((i0 - w) >> 2) - 1);
2108 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2110 w = bler(i0, r0, rn(reg));
2118 _blei_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
2125 BEQ(r0, _ZERO_REGNO, ((i0 - w) >> 2) - 1);
2129 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2131 w = bler_u(i0, r0, rn(reg));
2139 _beqr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2144 BEQ(r0, r1, ((i0 - w) >> 2) - 1);
2151 _beqi(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
2158 BEQ(r0, _ZERO_REGNO, ((i0 - w) >> 2) - 1);
2162 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2164 w = beqr(i0, r0, rn(reg));
2172 _bger(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2177 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2178 SLT(rn(reg), r0, r1);
2180 BEQ(rn(reg), _ZERO_REGNO, ((i0 - w) >> 2) - 1);
2188 _bger_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2193 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2194 SLTU(rn(reg), r0, r1);
2196 BEQ(rn(reg), _ZERO_REGNO, ((i0 - w) >> 2) - 1);
2204 _bgei(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
2211 if (!(zero_p = i1 == 0))
2212 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2213 if (can_sign_extend_short_p(i1)) {
2215 SLTI(rn(reg), r0, i1);
2217 d = ((i0 - w) >> 2) - 1;
2219 BEQ(rn(reg), _ZERO_REGNO, d);
2226 w = bger(i0, r0, rn(reg));
2235 _bgei_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
2240 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2241 if (can_sign_extend_short_p(i1)) {
2242 SLTIU(rn(reg), r0, i1);
2244 BEQ(rn(reg), _ZERO_REGNO, ((i0 - w) >> 2) - 1);
2249 w = bger_u(i0, r0, rn(reg));
2257 _bgtr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2262 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2263 SLT(rn(reg), r1, r0);
2265 BNE(rn(reg), _ZERO_REGNO, ((i0 - w) >> 2) - 1);
2273 _bgtr_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2278 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2279 SLTU(rn(reg), r1, r0);
2281 BNE(rn(reg), _ZERO_REGNO, ((i0 - w) >> 2) - 1);
2289 _bgti(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
2296 BGTZ(r0, ((i0 - w) >> 2) - 1);
2300 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2302 w = bgtr(i0, r0, rn(reg));
2310 _bgti_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
2317 BNE(r0, _ZERO_REGNO, ((i0 - w) >> 2) - 1);
2321 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2323 w = bgtr_u(i0, r0, rn(reg));
2331 _bner(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2336 BNE(r0, r1, ((i0 - w) >> 2) - 1);
2343 _bnei(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
2350 BNE(r0, _ZERO_REGNO, ((i0 - w) >> 2) - 1);
2354 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2356 w = bner(i0, r0, rn(reg));
2364 _jmpr(jit_state_t *_jit, jit_int32_t r0)
2371 _jmpi(jit_state_t *_jit, jit_word_t i0)
2377 if (((w + sizeof(jit_int32_t)) & 0xf0000000) == (i0 & 0xf0000000)) {
2378 J((i0 & ~0xf0000000) >> 2);
2382 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2383 movi_p(rn(reg), i0);
2392 _boaddr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2399 /* t1 = r0 + r1; overflow = r1 < 0 ? r0 < t1 : t1 < r0 */
2400 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2401 t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2402 t2 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2403 SLT(rn(t0), r1, _ZERO_REGNO); /* t0 = r1 < 0 */
2404 addr(rn(t1), r0, r1); /* t1 = r0 + r1 */
2405 SLT(rn(t2), rn(t1), r0); /* t2 = t1 < r0 */
2406 SLT(rn(t1), r0, rn(t1)); /* t1 = r0 < t1 */
2407 MOVZ(rn(t1), rn(t2), rn(t0)); /* if (r0 == 0) t1 = t2 */
2409 BNE(rn(t1), _ZERO_REGNO, ((i0 - w) >> 2) - 1);
2420 _boaddi(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
2427 if (can_sign_extend_short_p(i1)) {
2428 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2429 t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2430 t2 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2431 SLTI(rn(t0), _ZERO_REGNO, i1);
2432 addiu(rn(t1), r0, i1);
2433 SLT(rn(t2), r0, rn(t1));
2434 SLT(rn(t1), rn(t1), r0);
2435 MOVZ(rn(t1), rn(t2), rn(t0));
2437 BNE(rn(t1), _ZERO_REGNO, ((i0 - w) >> 2) - 1);
2445 t0 = jit_get_reg(jit_class_gpr);
2447 w = boaddr(i0, r0, rn(t0));
2454 _boaddr_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2460 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2461 t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2462 addr(rn(t0), r0, r1);
2463 SLTU(rn(t1), rn(t0), r0);
2465 BNE(_ZERO_REGNO, rn(t1), ((i0 - w) >> 2) - 1);
2474 _boaddi_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
2480 if (can_sign_extend_short_p(i0)) {
2481 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2482 t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2483 addiu(rn(t0), r0, i1);
2484 SLTU(rn(t1), rn(t0), r0);
2486 BNE(_ZERO_REGNO, rn(t1), ((i0 - w) >> 2) - 1);
2493 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2495 w = boaddr_u(i0, r0, rn(t0));
2502 _bxaddr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2509 /* t1 = r0 + r1; overflow = r1 < 0 ? r0 < t1 : t1 < r0 */
2510 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2511 t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2512 t2 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2513 SLT(rn(t0), r1, _ZERO_REGNO); /* t0 = r1 < 0 */
2514 addr(rn(t1), r0, r1); /* t1 = r0 + r1 */
2515 SLT(rn(t2), rn(t1), r0); /* t2 = t1 < r0 */
2516 SLT(rn(t1), r0, rn(t1)); /* t1 = r0 < t1 */
2517 MOVZ(rn(t1), rn(t2), rn(t0)); /* if (r0 == 0) t1 = t2 */
2519 BEQ(rn(t1), _ZERO_REGNO, ((i0 - w) >> 2) - 1);
2530 _bxaddi(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
2537 if (can_sign_extend_short_p(i1)) {
2538 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2539 t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2540 t2 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2541 SLTI(rn(t0), _ZERO_REGNO, i1);
2542 addiu(rn(t1), r0, i1);
2543 SLT(rn(t2), r0, rn(t1));
2544 SLT(rn(t1), rn(t1), r0);
2545 MOVZ(rn(t1), rn(t2), rn(t0));
2547 BEQ(rn(t1), _ZERO_REGNO, ((i0 - w) >> 2) - 1);
2555 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2557 w = bxaddr(i0, r0, rn(t0));
2564 _bxaddr_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2570 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2571 t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2572 addr(rn(t0), r0, r1);
2573 SLTU(rn(t1), rn(t0), r0);
2575 BEQ(_ZERO_REGNO, rn(t1), ((i0 - w) >> 2) - 1);
2584 _bxaddi_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
2590 if (can_sign_extend_short_p(i0)) {
2591 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2592 t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2593 addiu(rn(t0), r0, i1);
2594 SLTU(rn(t1), rn(t0), r0);
2596 BEQ(_ZERO_REGNO, rn(t1), ((i0 - w) >> 2) - 1);
2603 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2605 w = bxaddr_u(i0, r0, rn(t0));
2612 _bosubr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2619 /* t1 = r0 - r1; overflow = 0 < r1 ? r0 < t1 : t1 < r0 */
2620 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2621 t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2622 t2 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2623 SLT(rn(t0), _ZERO_REGNO, r1); /* t0 = 0 < r1 */
2624 subr(rn(t1), r0, r1); /* t1 = r0 - r1 */
2625 SLT(rn(t2), rn(t1), r0); /* t2 = t1 < r0 */
2626 SLT(rn(t1), r0, rn(t1)); /* t1 = r0 < t1 */
2627 MOVZ(rn(t1), rn(t2), rn(t0)); /* if (r0 == 0) t1 = t2 */
2629 BNE(rn(t1), _ZERO_REGNO, ((i0 - w) >> 2) - 1);
2640 _bosubi(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
2647 if (can_sign_extend_short_p(i1) && (i1 & 0xffff) != 0x8000) {
2648 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2649 t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2650 t2 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2651 SLTI(rn(t0), _ZERO_REGNO, i1);
2652 addiu(rn(t1), r0, -i1);
2653 SLT(rn(t2), rn(t1), r0);
2654 SLT(rn(t1), r0, rn(t1));
2655 MOVZ(rn(t1), rn(t2), rn(t0));
2657 BNE(rn(t1), _ZERO_REGNO, ((i0 - w) >> 2) - 1);
2665 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2667 w = bosubr(i0, r0, rn(t0));
2674 _bosubr_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2680 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2681 t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2682 subr(rn(t0), r0, r1);
2683 SLTU(rn(t1), r0, rn(t0));
2685 BNE(_ZERO_REGNO, rn(t1), ((i0 - w) >> 2) - 1);
2694 _bosubi_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
2700 if (can_sign_extend_short_p(i0) && (i0 & 0xffff) != 0x8000) {
2701 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2702 t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2703 addiu(rn(t0), r0, -i1);
2704 SLTU(rn(t1), r0, rn(t0));
2706 BNE(_ZERO_REGNO, rn(t1), ((i0 - w) >> 2) - 1);
2713 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2715 w = bosubr_u(i0, r0, rn(t0));
2722 _bxsubr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2729 /* t1 = r0 - r1; overflow = 0 < r1 ? r0 < t1 : t1 < r0 */
2730 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2731 t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2732 t2 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2733 SLT(rn(t0), _ZERO_REGNO, r1); /* t0 = 0 < r1 */
2734 subr(rn(t1), r0, r1); /* t1 = r0 - r1 */
2735 SLT(rn(t2), rn(t1), r0); /* t2 = t1 < r0 */
2736 SLT(rn(t1), r0, rn(t1)); /* t1 = r0 < t1 */
2737 MOVZ(rn(t1), rn(t2), rn(t0)); /* if (t0 == 0) t1 = t2 */
2739 BEQ(rn(t1), _ZERO_REGNO, ((i0 - w) >> 2) - 1);
2750 _bxsubi(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
2757 if (can_sign_extend_short_p(i1) && (i1 & 0xffff) != 0x8000) {
2758 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2759 t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2760 t2 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2761 SLTI(rn(t0), _ZERO_REGNO, i1);
2762 addiu(rn(t1), r0, -i1);
2763 SLT(rn(t2), rn(t1), r0);
2764 SLT(rn(t1), r0, rn(t1));
2765 MOVZ(rn(t1), rn(t2), rn(t0));
2767 BEQ(rn(t1), _ZERO_REGNO, ((i0 - w) >> 2) - 1);
2775 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2777 w = bxsubr(i0, r0, rn(t0));
2784 _bxsubr_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2790 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2791 t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2792 subr(rn(t0), r0, r1);
2793 SLTU(rn(t1), r0, rn(t0));
2795 BEQ(_ZERO_REGNO, rn(t1), ((i0 - w) >> 2) - 1);
2804 _bxsubi_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
2810 if (can_sign_extend_short_p(i0) && (i0 & 0xffff) != 0x8000) {
2811 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2812 t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2813 addiu(rn(t0), r0, -i1);
2814 SLTU(rn(t1), r0, rn(t0));
2816 BEQ(_ZERO_REGNO, rn(t1), ((i0 - w) >> 2) - 1);
2823 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2825 w = bxsubr_u(i0, r0, rn(t0));
2832 _bmsr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2836 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2837 AND(rn(t0), r0, r1);
2839 BNE(_ZERO_REGNO, rn(t0), ((i0 - w) >> 2) - 1);
2846 _bmsi(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
2850 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2851 if (can_zero_extend_short_p(i1)) {
2852 ANDI(rn(t0), r0, i1);
2854 BNE(_ZERO_REGNO, rn(t0), ((i0 - w) >> 2) - 1);
2859 w = bmsr(i0, r0, rn(t0));
2866 _bmcr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2870 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2871 AND(rn(t0), r0, r1);
2873 BEQ(_ZERO_REGNO, rn(t0), ((i0 - w) >> 2) - 1);
2880 _bmci(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
2884 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2885 if (can_zero_extend_short_p(i1)) {
2886 ANDI(rn(t0), r0, i1);
2888 BEQ(_ZERO_REGNO, rn(t0), ((i0 - w) >> 2) - 1);
2893 w = bmcr(i0, r0, rn(t0));
2900 _callr(jit_state_t *_jit, jit_int32_t r0)
2903 if (r0 != _T9_REGNO)
2904 movr(_T9_REGNO, r0);
2910 _calli(jit_state_t *_jit, jit_word_t i0)
2912 movi(_T9_REGNO, i0);
2918 _calli_p(jit_state_t *_jit, jit_word_t i0)
2923 movi_p(_T9_REGNO, i0);
2930 static jit_int32_t fregs[] = {
2931 _F30, _F28, _F26, _F24, _F22, _F20,
2937 static jit_int32_t iregs[] = {
2938 _S7, _S6, _S5, _S4, _S3, _S2, _S1, _S0,
2942 _prolog(jit_state_t *_jit, jit_node_t *node)
2946 if (_jitc->function->define_frame || _jitc->function->assume_frame) {
2947 jit_int32_t frame = -_jitc->function->frame;
2948 assert(_jitc->function->self.aoff >= frame);
2949 if (_jitc->function->assume_frame)
2951 _jitc->function->self.aoff = frame;
2953 if (_jitc->function->allocar)
2954 _jitc->function->self.aoff &= -8;
2956 _jitc->function->stack = ((_jitc->function->self.alen -
2957 /* align stack at 16 bytes */
2958 _jitc->function->self.aoff) + 15) & -16;
2960 _jitc->function->stack = ((/* first 16 bytes must be allocated */
2961 (_jitc->function->self.alen > 16 ?
2962 _jitc->function->self.alen : 16) -
2963 /* align stack at 8 bytes */
2964 _jitc->function->self.aoff) + 7) & -8;
2966 /* callee save registers */
2968 if ((_jitc->function->self.call & jit_call_varargs) &&
2969 jit_arg_reg_p(_jitc->function->vagp))
2970 subi(_SP_REGNO, _SP_REGNO, stack_framesize + 64);
2973 subi(_SP_REGNO, _SP_REGNO, stack_framesize);
2974 offset = stack_framesize - (sizeof(jit_word_t) << 1);
2975 for (index = 0; index < jit_size(fregs); index++, offset -= 8) {
2976 if (jit_regset_tstbit(&_jitc->function->regset, fregs[index]))
2977 stxi_d(offset, _SP_REGNO, rn(fregs[index]));
2979 for (index = 0; index < jit_size(iregs);
2980 index++, offset -= sizeof(jit_word_t)) {
2981 if (jit_regset_tstbit(&_jitc->function->regset, iregs[index]))
2982 stxi(offset, _SP_REGNO, rn(iregs[index]));
2984 assert(offset >= sizeof(jit_word_t));
2985 stxi(offset, _SP_REGNO, _RA_REGNO);
2986 stxi(0, _SP_REGNO, _BP_REGNO);
2987 movr(_BP_REGNO, _SP_REGNO);
2990 if (_jitc->function->stack)
2991 subi(_SP_REGNO, _SP_REGNO, _jitc->function->stack);
2992 if (_jitc->function->allocar) {
2993 index = jit_get_reg(jit_class_gpr);
2994 movi(rn(index), _jitc->function->self.aoff);
2995 stxi_i(_jitc->function->aoffoff, _BP_REGNO, rn(index));
2996 jit_unget_reg(index);
2999 if (_jitc->function->self.call & jit_call_varargs) {
3001 index = _jitc->function->vagp;
3003 index = (_jitc->function->self.size - stack_framesize) >> STACK_SHIFT;
3005 offset = stack_framesize + index * STACK_SLOT;
3006 for (; jit_arg_reg_p(index); ++index, offset += STACK_SLOT) {
3008 SD(rn(_A0 - index), offset, _BP_REGNO);
3010 stxi(offset + WORD_ADJUST, _BP_REGNO, rn(_A0 - index));
3017 _epilog(jit_state_t *_jit, jit_node_t *node)
3021 if (_jitc->function->assume_frame)
3023 /* callee save registers */
3024 movr(_SP_REGNO, _BP_REGNO);
3025 offset = stack_framesize - (sizeof(jit_word_t) << 1);
3026 for (index = 0; index < jit_size(fregs); index++, offset -= 8) {
3027 if (jit_regset_tstbit(&_jitc->function->regset, fregs[index]))
3028 ldxi_d(rn(fregs[index]), _SP_REGNO, offset);
3030 for (index = 0; index < jit_size(iregs);
3031 index++, offset -= sizeof(jit_word_t)) {
3032 if (jit_regset_tstbit(&_jitc->function->regset, iregs[index]))
3033 ldxi(rn(iregs[index]), _SP_REGNO, offset);
3035 assert(offset >= sizeof(jit_word_t));
3036 ldxi(_RA_REGNO, _SP_REGNO, offset);
3037 ldxi(_BP_REGNO, _SP_REGNO, 0);
3041 if ((_jitc->function->self.call & jit_call_varargs) &&
3042 jit_arg_reg_p(_jitc->function->vagp))
3043 addi(_SP_REGNO, _SP_REGNO, stack_framesize + 64);
3046 addi(_SP_REGNO, _SP_REGNO, stack_framesize);
3050 _vastart(jit_state_t *_jit, jit_int32_t r0)
3052 assert(_jitc->function->self.call & jit_call_varargs);
3053 /* Initialize va_list to the first stack argument. */
3055 if (jit_arg_reg_p(_jitc->function->vagp))
3056 addi(r0, _BP_REGNO, stack_framesize + _jitc->function->vagp *
3057 sizeof(jit_int64_t));
3060 addi(r0, _BP_REGNO, _jitc->function->self.size);
3064 _vaarg(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
3066 /* Load argument. */
3068 ldxi(r0, r1, WORD_ADJUST);
3073 /* Update va_list. */
3074 addi(r1, r1, STACK_SLOT);
3078 _patch_abs(jit_state_t *_jit, jit_word_t instr, jit_word_t label)
3087 #if __WORDSIZE == 32
3089 assert(i.hc.b == MIPS_LUI);
3090 i.is.b = label >> 16;
3093 assert(i.hc.b == MIPS_ORI);
3098 assert(i.hc.b == MIPS_LUI);
3099 i.is.b = label >> 48;
3102 assert(i.hc.b == MIPS_ORI);
3103 i.is.b = label >> 32;
3107 assert(i.hc.b == MIPS_ORI);
3108 i.is.b = label >> 16;
3112 assert(i.hc.b == MIPS_ORI);
3119 _patch_at(jit_state_t *_jit, jit_word_t instr, jit_word_t label)
3130 /* 16 bit immediate opcodes */
3133 case MIPS_BLTZ: case MIPS_BLTZL:
3134 case MIPS_BLTZAL: case MIPS_BLTZALL:
3135 case MIPS_BGEZ: case MIPS_BGEZAL:
3136 case MIPS_BGEZALL: case MIPS_BGEZL:
3137 case MIPS_TEQI: case MIPS_TGEI:
3138 case MIPS_TGEIU: case MIPS_TLTI:
3139 case MIPS_TLTIU: case MIPS_TNEI:
3140 i.is.b = ((label - instr) >> 2) - 1;
3144 assert(!"unhandled branch opcode");
3149 case MIPS_COP1: case MIPS_COP2:
3150 assert(i.rs.b == MIPS_BC);
3152 case MIPS_BCF: case MIPS_BCFL:
3153 case MIPS_BCT: case MIPS_BCTL:
3154 i.is.b = ((label - instr) >> 2) - 1;
3158 assert(!"unhandled branch opcode");
3163 case MIPS_BLEZ: case MIPS_BLEZL:
3164 case MIPS_BEQ: case MIPS_BEQL:
3165 case MIPS_BGTZ: case MIPS_BGTZL:
3166 case MIPS_BNE: case MIPS_BNEL:
3167 i.is.b = ((label - instr) >> 2) - 1;
3172 patch_abs(instr, label);
3175 case MIPS_J: case MIPS_JAL:
3177 assert(((instr + sizeof(jit_int32_t)) & 0xf0000000) ==
3178 (label & 0xf0000000));
3179 i.ii.b = (label & ~0xf0000000) >> 2;
3184 assert(!"unhandled branch opcode");