Update lightrec 20220910 (#686)
[pcsx_rearmed.git] / deps / lightning / lib / jit_mips-cpu.c
CommitLineData
4a71579b
PC
1/*
2 * Copyright (C) 2012-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
21typedef union {
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;
38#else
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;
54#endif
55 int op;
56} jit_instr_t;
40a44dcb
PC
57#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
58# define jit_mips2_p() 1
59#else
4a71579b 60# define jit_mips2_p() 0
40a44dcb 61#endif
4a71579b
PC
62# define _ZERO_REGNO 0
63# define _T0_REGNO 0x08
64# define _T1_REGNO 0x09
65# define _T2_REGNO 0x0a
66# define _T3_REGNO 0x0b
67# define _T4_REGNO 0x0c
68# define _T5_REGNO 0x0d
69# define _T6_REGNO 0x0e
70# define _T7_REGNO 0x0f
71# define _S0_REGNO 0x10
72# define _S1_REGNO 0x11
73# define _S2_REGNO 0x12
74# define _S3_REGNO 0x13
75# define _S4_REGNO 0x14
76# define _S5_REGNO 0x15
77# define _S6_REGNO 0x16
78# define _S7_REGNO 0x17
79# define _T8_REGNO 0x18
80# define _T9_REGNO 0x19
81# define _SP_REGNO 0x1d
82# define _BP_REGNO 0x1e
83# define _RA_REGNO 0x1f
84# define _F16_REGNO 16
85# define _F18_REGNO 18
86# define _F20_REGNO 20
87# define _F22_REGNO 22
88# define _F24_REGNO 24
89# define _F26_REGNO 26
90# define _F28_REGNO 28
91# define _F30_REGNO 30
92# if __WORDSIZE == 32
93# if NEW_ABI
94# define stack_framesize 144
95# else
96# define stack_framesize 112
97# endif
98# define ldr(u,v) ldr_i(u,v)
99# define ldi(u,v) ldi_i(u,v)
100# define ldxi(u,v,w) ldxi_i(u,v,w)
101# define sti(u,v) sti_i(u,v)
102# define stxi(u,v,w) stxi_i(u,v,w)
103# else
104# define stack_framesize 144
105# define ldr(u,v) ldr_l(u,v)
106# define ldi(u,v) ldi_l(u,v)
107# define ldxi(u,v,w) ldxi_l(u,v,w)
108# define sti(u,v) sti_l(u,v)
109# define stxi(u,v,w) stxi_l(u,v,w)
110# endif
111# define can_sign_extend_short_p(im) ((im) >= -32678 && (im) <= 32767)
112# define can_zero_extend_short_p(im) ((im) >= 0 && (im) <= 65535)
40a44dcb
PC
113# define is_low_mask(im) (((im) & 1) ? (__builtin_popcountl((im) + 1) <= 1) : 0)
114# define is_middle_mask(im) ((im) ? (__builtin_popcountl((im) + (1 << __builtin_ctzl(im))) <= 1) : 0)
519a9ea1
PC
115# define is_high_mask(im) ((im) ? (__builtin_popcountl((im) + (1 << __builtin_ctzl(im))) == 0) : 0)
116# define masked_bits_count(im) __builtin_popcountl(im)
117# define unmasked_bits_count(im) (__WORDSIZE - masked_bits_count(im))
4a71579b
PC
118# if __WORDSIZE == 32
119# define can_sign_extend_int_p(im) 1
120# define can_zero_extend_int_p(im) 1
121# else
122# define can_sign_extend_int_p(im) \
123 (((im) >= 0 && (im) <= 0x7fffffffL) || \
124 ((im) < 0 && (im) >= -0x80000000L))
125# define can_zero_extend_int_p(im) ((im) >= 0 && (im) <= 0xffffffff)
126# endif
127# define MIPS_SPECIAL 0x00
128# define MIPS_REGIMM 0x01
129# define MIPS_J 0x02
130# define MIPS_SRL 0x02
131# define MIPS_JAL 0x03
132# define MIPS_SRA 0x03
133# define MIPS_BEQ 0x04
134# define MIPS_BNE 0x05
135# define MIPS_BLEZ 0x06
136# define MIPS_BGTZ 0x07
137# define MIPS_ADDI 0x08
138# define MIPS_ADDIU 0x09
139# define MIPS_SLTI 0x0a
140# define MIPS_SLTIU 0x0b
141# define MIPS_ANDI 0x0c
142# define MIPS_ORI 0x0d
143# define MIPS_XORI 0x0e
144# define MIPS_LUI 0x0f
145# define MIPS_COP0 0x10
146# define MIPS_COP1 0x11
147# define MIPS_COP2 0x12
148# define MIPS_COP1X 0x13
149# define MIPS_BEQL 0x14
150# define MIPS_BNEL 0x15
151# define MIPS_BLEZL 0x16
152# define MIPS_BGTZL 0x17
153# define MIPS_DADDI 0x18
154# define MIPS_DADDIU 0x19
155# define MIPS_LDL 0x1a
156# define MIPS_LDR 0x1b
157# define MIPS_SPECIAL2 0x1c
158# define MIPS_JALX 0x1d
159# define MIPS_SPECIAL3 0x1f
160# define MIPS_LB 0x20
161# define MIPS_LH 0x21
162# define MIPS_LWL 0x22
163# define MIPS_LW 0x23
164# define MIPS_LBU 0x24
165# define MIPS_LHU 0x25
166# define MIPS_LWR 0x26
167# define MIPS_LWU 0x27
168# define MIPS_SB 0x28
169# define MIPS_SH 0x29
170# define MIPS_SWL 0x2a
171# define MIPS_SW 0x2b
172# define MIPS_SWR 0x2e
173# define MIPS_CACHE 0x2f
174# define MIPS_LL 0x30
175# define MIPS_LWC1 0x31
176# define MIPS_LWC2 0x32
177# define MIPS_PREF 0x33
178# define MIPS_LLD 0x34
179# define MIPS_LDC1 0x35
180# define MIPS_LDC2 0x36
181# define MIPS_LD 0x37
182# define MIPS_SC 0x38
183# define MIPS_SCD 0x3c
184# define MIPS_SDC1 0x3d
185# define MIPS_SDC2 0x3e
186# define MIPS_SWC1 0x39
187# define MIPS_SWC2 0x3a
188# define MIPS_SD 0x3f
189# define MIPS_MF 0x00
190# define MIPS_DMF 0x01
191# define MIPS_CF 0x02
192# define MIPS_MFH 0x03
193# define MIPS_MT 0x04
194# define MIPS_DMT 0x05
195# define MIPS_CT 0x06
196# define MIPS_MTH 0x07
197# define MIPS_BC 0x08
198# define MIPS_WRPGPR 0x0e
199# define MIPS_BGZAL 0x11
200# define MIPS_MFMC0 0x11
201# define MIPS_BCF 0x00
202# define MIPS_BLTZ 0x00
203# define MIPS_BCT 0x01
204# define MIPS_BGEZ 0x01
205# define MIPS_BCFL 0x02
206# define MIPS_BLTZL 0x02
207# define MIPS_BCTL 0x03
208# define MIPS_BGEZL 0x03
209# define MIPS_TGEI 0x08
210# define MIPS_TGEIU 0x09
211# define MIPS_TLTI 0x0a
212# define MIPS_TLTIU 0x0b
213# define MIPS_TEQI 0x0c
214# define MIPS_TNEI 0x0e
215# define MIPS_BLTZAL 0x10
216# define MIPS_BGEZAL 0x11
217# define MIPS_BLTZALL 0x12
218# define MIPS_BGEZALL 0x13
219# define MIPS_SYNCI 0x1f
220# define MIPS_WSBH 0x02
221# define MIPS_DBSH 0x02
222# define MIPS_DSHD 0x05
223# define MIPS_SEB 0x10
224# define MIPS_SEH 0x18
225# define MIPS_MADD 0x00
226# define MIPS_SLL 0x00
227# define MIPS_EXT 0x00
228# define MIPS_DEXTM 0x01
229# define MIPS_MADDU 0x01
230# define MIPS_MOVFT 0x01
231# define MIPS_TLBR 0x01
232# define MIPS_MUL 0x02
233# define MIPS_DEXTU 0x02
234# define MIPS_TLBWI 0x02
235# define MIPS_DEXT 0x03
236# define MIPS_SLLV 0x04
237# define MIPS_INS 0x04
238# define MIPS_MSUB 0x04
239# define MIPS_DINSM 0x05
240# define MIPS_MSUBU 0x05
241# define MIPS_SRLV 0x06
242# define MIPS_DINSU 0x06
243# define MIPS_TLBWR 0x06
244# define MIPS_SRAV 0x07
245# define MIPS_DINS 0x07
246# define MIPS_JR 0x08
247# define MIPS_TLBP 0x08
248# define MIPS_JALR 0x09
249# define MIPS_MOVZ 0x0a
250# define MIPS_MOVN 0x0b
251# define MIPS_SYSCALL 0x0c
252# define MIPS_BREAK 0x0d
253# define MIPS_PREFX 0x0f
254# define MIPS_SYNC 0x0f
255# define MIPS_MFHI 0x10
256# define MIPS_MTHI 0x11
257# define MIPS_MFLO 0x12
258# define MIPS_MTLO 0x13
259# define MIPS_DSLLV 0x14
260# define MIPS_DSRLV 0x16
261# define MIPS_DSRAV 0x17
262# define MIPS_MULT 0x18
263# define MIPS_ERET 0x18
264# define MIPS_MULTU 0x19
265# define MIPS_DIV 0x1a
266# define MIPS_DIVU 0x1b
267# define MIPS_DMULT 0x1c
268# define MIPS_DMULTU 0x1d
269# define MIPS_DDIV 0x1e
270# define MIPS_DDIVU 0x1f
271# define MIPS_DERET 0x1f
272# define MIPS_ADD 0x20
273# define MIPS_CLZ 0x20
274# define MIPS_BSHFL 0x20
275# define MIPS_ADDU 0x21
276# define MIPS_CLO 0x21
277# define MIPS_SUB 0x22
278# define MIPS_SUBU 0x23
279# define MIPS_AND 0x24
280# define MIPS_DCLZ 0x24
281# define MIPS_DBSHFL 0x24
282# define MIPS_OR 0x25
283# define MIPS_DCLO 0x25
284# define MIPS_XOR 0x26
285# define MIPS_NOR 0x27
286# define MIPS_SLT 0x2a
287# define MIPS_SLTU 0x2b
288# define MIPS_DADD 0x2c
289# define MIPS_DADDU 0x2d
290# define MIPS_DSUB 0x2e
291# define MIPS_DSUBU 0x2f
292# define MIPS_TGE 0x30
293# define MIPS_TGEU 0x31
294# define MIPS_TLT 0x32
295# define MIPS_TLTU 0x33
296# define MIPS_TEQ 0x34
297# define MIPS_TNE 0x36
298# define MIPS_DSLL 0x38
299# define MIPS_DSRL 0x3a
300# define MIPS_DSRA 0x3b
301# define MIPS_DSLL32 0x3c
302# define MIPS_DSRL32 0x3e
303# define MIPS_DSRA32 0x3f
304# define MIPS_SDBPP 0x3f
305# define ii(i) *_jit->pc.ui++ = i
306static void
307_hrrrit(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t,
308 jit_int32_t,jit_int32_t);
309# define hrrrit(hc,rs,rt,rd,im,tc) _hrrrit(_jit,hc,rs,rt,rd,im,tc)
310# define hrrr_t(hc,rs,rt,rd,tc) hrrrit(hc,rs,rt,rd,0,tc)
311# define rrr_t(rs,rt,rd,tc) hrrr_t(0,rs,rt,rd,tc)
312# define hrri(hc,rs,rt,im) _hrri(_jit,hc,rs,rt,im)
313static void _hrri(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t);
314# define hi(hc,im) _hi(_jit,hc,im)
315static void _hi(jit_state_t*,jit_int32_t,jit_int32_t);
316# define NOP(i0) ii(0)
317# define nop(i0) _nop(_jit,i0)
318static void _nop(jit_state_t*,jit_int32_t);
319# define h_ri(hc,rt,im) _hrri(_jit,hc,0,rt,im)
320# define rrit(rt,rd,im,tc) _hrrrit(_jit,0,0,rt,rd,im,tc)
321# define LUI(rt,im) h_ri(MIPS_LUI,rt,im)
322# define ADDU(rd,rs,rt) rrr_t(rs,rt,rd,MIPS_ADDU)
323# define DADDU(rd,rs,rt) rrr_t(rs,rt,rd,MIPS_DADDU)
324# define ADDIU(rt,rs,im) hrri(MIPS_ADDIU,rs,rt,im)
325# define DADDIU(rt,rs,im) hrri(MIPS_DADDIU,rs,rt,im)
326# define SUBU(rd,rs,rt) rrr_t(rs,rt,rd,MIPS_SUBU)
327# define DSUBU(rd,rs,rt) rrr_t(rs,rt,rd,MIPS_DSUBU)
40a44dcb 328# define MUL(rd,rs,rt) hrrr_t(MIPS_SPECIAL2,rs,rt,rd,MIPS_MUL)
4a71579b
PC
329# define MULT(rs,rt) rrr_t(rs,rt,_ZERO_REGNO,MIPS_MULT)
330# define MULTU(rs,rt) rrr_t(rs,rt,_ZERO_REGNO,MIPS_MULTU)
331# define DMULT(rs,rt) rrr_t(rs,rt,_ZERO_REGNO,MIPS_DMULT)
332# define DMULTU(rs,rt) rrr_t(rs,rt,_ZERO_REGNO,MIPS_DMULTU)
333# define DIV(rs,rt) rrr_t(rs,rt,_ZERO_REGNO,MIPS_DIV)
334# define DIVU(rs,rt) rrr_t(rs,rt,_ZERO_REGNO,MIPS_DIVU)
335# define DDIV(rs,rt) rrr_t(rs,rt,_ZERO_REGNO,MIPS_DDIV)
336# define DDIVU(rs,rt) rrr_t(rs,rt,_ZERO_REGNO,MIPS_DDIVU)
337# define SLLV(rd,rt,rs) rrr_t(rs,rt,rd,MIPS_SLLV)
338# define SLL(rd,rt,sa) rrit(rt,rd,sa,MIPS_SLL)
339# define DSLLV(rd,rt,rs) rrr_t(rs,rt,rd,MIPS_DSLLV)
340# define DSLL(rd,rt,sa) rrit(rt,rd,sa,MIPS_DSLL)
341# define DSLL32(rd,rt,sa) rrit(rt,rd,sa,MIPS_DSLL32)
342# define SRAV(rd,rt,rs) rrr_t(rs,rt,rd,MIPS_SRAV)
343# define SRA(rd,rt,sa) rrit(rt,rd,sa,MIPS_SRA)
344# define SRLV(rd,rt,rs) rrr_t(rs,rt,rd,MIPS_SRLV)
345# define SRL(rd,rt,sa) rrit(rt,rd,sa,MIPS_SRL)
346# define DSRAV(rd,rt,rs) rrr_t(rs,rt,rd,MIPS_DSRAV)
347# define DSRA(rd,rt,sa) rrit(rt,rd,sa,MIPS_DSRA)
348# define DSRA32(rd,rt,sa) rrit(rt,rd,sa,MIPS_DSRA32)
349# define DSRLV(rd,rt,rs) rrr_t(rs,rt,rd,MIPS_DSRLV)
350# define DSRL(rd,rt,sa) rrit(rt,rd,sa,MIPS_DSRL)
351# define DSRL32(rd,rt,sa) rrit(rt,rd,sa,MIPS_DSRL32)
519a9ea1
PC
352# define INS(rt,rs,pos,size) hrrrit(MIPS_SPECIAL3,rs,rt,pos+size-1,pos,MIPS_INS)
353# define DINS(rt,rs,pos,size) hrrrit(MIPS_SPECIAL3,rs,rt,pos+size-1,pos,MIPS_DINS)
40a44dcb
PC
354# define DINSU(rt,rs,pos,size) hrrrit(MIPS_SPECIAL3,rs,rt,pos+size-32-1,pos-32,MIPS_DINSU)
355# define DINSM(rt,rs,pos,size) hrrrit(MIPS_SPECIAL3,rs,rt,pos+size-32-1,pos,MIPS_DINSM)
519a9ea1
PC
356# define EXT(rt,rs,pos,size) hrrrit(MIPS_SPECIAL3,rs,rt,size-1,pos,MIPS_EXT)
357# define DEXT(rt,rs,pos,size) hrrrit(MIPS_SPECIAL3,rs,rt,size-1,pos,MIPS_DEXT)
40a44dcb
PC
358# define DEXTU(rt,rs,pos,size) hrrrit(MIPS_SPECIAL3,rs,rt,size-1,pos-32,MIPS_DEXTU)
359# define DEXTM(rt,rs,pos,size) hrrrit(MIPS_SPECIAL3,rs,rt,size-32-1,pos,MIPS_DEXTM)
4a71579b
PC
360# define ROTR(rd,rt,sa) hrrrit(MIPS_SPECIAL,1,rt,rd,sa,MIPS_SRL)
361# define DROTR(rd,rt,sa) hrrrit(MIPS_SPECIAL,1,rt,rd,sa,MIPS_DSRL)
362# define MFHI(rd) rrr_t(_ZERO_REGNO,_ZERO_REGNO,rd,MIPS_MFHI)
363# define MFLO(rd) rrr_t(_ZERO_REGNO,_ZERO_REGNO,rd,MIPS_MFLO)
364# define MTHI(rs) rrr_t(rs,_ZERO_REGNO,_ZERO_REGNO,MIPS_MTHI)
365# define MTLO(rs) rrr_t(rs,_ZERO_REGNO,_ZERO_REGNO,MIPS_MTLO)
366# define AND(rd,rs,rt) rrr_t(rs,rt,rd,MIPS_AND)
367# define ANDI(rt,rs,im) hrri(MIPS_ANDI,rs,rt,im)
368# define OR(rd,rs,rt) rrr_t(rs,rt,rd,MIPS_OR)
369# define ORI(rt,rs,im) hrri(MIPS_ORI,rs,rt,im)
370# define XOR(rd,rs,rt) rrr_t(rs,rt,rd,MIPS_XOR)
371# define XORI(rt,rs,im) hrri(MIPS_XORI,rs,rt,im)
372# define LB(rt,of,rb) hrri(MIPS_LB,rb,rt,of)
373# define LBU(rt,of,rb) hrri(MIPS_LBU,rb,rt,of)
374# define LH(rt,of,rb) hrri(MIPS_LH,rb,rt,of)
375# define LHU(rt,of,rb) hrri(MIPS_LHU,rb,rt,of)
376# define LW(rt,of,rb) hrri(MIPS_LW,rb,rt,of)
377# define LWU(rt,of,rb) hrri(MIPS_LWU,rb,rt,of)
378# define LD(rt,of,rb) hrri(MIPS_LD,rb,rt,of)
379# define SB(rt,of,rb) hrri(MIPS_SB,rb,rt,of)
380# define SH(rt,of,rb) hrri(MIPS_SH,rb,rt,of)
381# define SW(rt,of,rb) hrri(MIPS_SW,rb,rt,of)
382# define SD(rt,of,rb) hrri(MIPS_SD,rb,rt,of)
383# define WSBH(rd,rt) hrrrit(MIPS_SPECIAL3,0,rt,rd,MIPS_WSBH,MIPS_BSHFL)
384# define SEB(rd,rt) hrrrit(MIPS_SPECIAL3,0,rt,rd,MIPS_SEB,MIPS_BSHFL)
385# define SEH(rd,rt) hrrrit(MIPS_SPECIAL3,0,rt,rd,MIPS_SEH,MIPS_BSHFL)
386# define SLT(rd,rs,rt) rrr_t(rs,rt,rd,MIPS_SLT)
387# define SLTU(rd,rs,rt) rrr_t(rs,rt,rd,MIPS_SLTU)
388# define SLTI(rt,rs,im) hrri(MIPS_SLTI,rs,rt,im)
389# define SLTIU(rt,rs,im) hrri(MIPS_SLTIU,rs,rt,im)
390# define BLTZ(rs,im) hrri(MIPS_REGIMM,rs,MIPS_BLTZ,im)
391# define BLEZ(rs,im) hrri(MIPS_BLEZ,rs,_ZERO_REGNO,im)
392# define BEQ(rs,rt,im) hrri(MIPS_BEQ,rs,rt,im)
393# define BGEZ(rs,im) hrri(MIPS_REGIMM,rs,MIPS_BGEZ,im)
394# define BGTZ(rs,im) hrri(MIPS_BGTZ,rs,_ZERO_REGNO,im)
395# define BNE(rs,rt,im) hrri(MIPS_BNE,rs,rt,im)
396# define JALR(r0) hrrrit(MIPS_SPECIAL,r0,0,_RA_REGNO,0,MIPS_JALR)
397# if 1 /* supports MIPS32 R6 */
398# define JR(r0) hrrrit(MIPS_SPECIAL,r0,0,0,0,MIPS_JALR)
399# else /* does not support MIPS32 R6 */
400# define JR(r0) hrrrit(MIPS_SPECIAL,r0,0,0,0,MIPS_JR)
401# endif
402# define J(i0) hi(MIPS_J,i0)
1f22b268 403# define MOVN(rd,rs,rt) hrrrit(0,rs,rt,rd,0,MIPS_MOVN)
4a71579b
PC
404# define MOVZ(rd,rs,rt) hrrrit(0,rs,rt,rd,0,MIPS_MOVZ)
405# define comr(r0,r1) xori(r0,r1,-1)
406# define negr(r0,r1) subr(r0,_ZERO_REGNO,r1)
407# if __WORDSIZE == 32
408# define addr(rd,rs,rt) ADDU(rd,rs,rt)
409# define addiu(r0,r1,i0) ADDIU(r0,r1,i0)
410# define subr(rd,rs,rt) SUBU(rd,rs,rt)
411# define mult(rs,rt) MULT(rs,rt)
412# define multu(rs,rt) MULTU(rs,rt)
413# define div(rs,rt) DIV(rs,rt)
414# define divu(rs,rt) DIVU(rs,rt)
415# else
416# define addr(rd,rs,rt) DADDU(rd,rs,rt)
417# define addiu(r0,r1,i0) DADDIU(r0,r1,i0)
418# define subr(rd,rs,rt) DSUBU(rd,rs,rt)
419# define mult(rs,rt) DMULT(rs,rt)
420# define multu(rs,rt) DMULTU(rs,rt)
421# define div(rs,rt) DDIV(rs,rt)
422# define divu(rs,rt) DDIVU(rs,rt)
423# endif
40a44dcb
PC
424# define extr(rd,rt,lsb,nb) _extr(_jit,rd,rt,lsb,nb)
425static void _extr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t);
426# define insr(rd,rt,lsb,nb) _insr(_jit,rd,rt,lsb,nb)
427static void _insr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t);
4a71579b
PC
428# define addi(r0,r1,i0) _addi(_jit,r0,r1,i0)
429static void _addi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
430#define addcr(r0,r1,r2) _addcr(_jit,r0,r1,r2)
431static void _addcr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
432#define addci(r0,r1,i0) _addci(_jit,r0,r1,i0)
433static void _addci(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
434# define addxr(r0,r1,r2) _addxr(_jit,r0,r1,r2)
435static void _addxr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
436# define addxi(r0,r1,i0) _addxi(_jit,r0,r1,i0)
437static void _addxi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
438# define subi(r0,r1,i0) _subi(_jit,r0,r1,i0)
439static void _subi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
440# define subcr(r0,r1,r2) _subcr(_jit,r0,r1,r2)
441static void _subcr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
442# define subci(r0,r1,i0) _subci(_jit,r0,r1,i0)
443static void _subci(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
444# define subxr(r0,r1,r2) _subxr(_jit,r0,r1,r2)
445static void _subxr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
446# define subxi(r0,r1,i0) _subxi(_jit,r0,r1,i0)
447static void _subxi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
448# define rsbi(r0, r1, i0) _rsbi(_jit, r0, r1, i0)
449static void _rsbi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
450# define mulr(r0,r1,r2) _mulr(_jit,r0,r1,r2)
451static void _mulr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
452# define muli(r0,r1,i0) _muli(_jit,r0,r1,i0)
453static void _muli(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
454# define qmulr(r0,r1,r2,r3) iqmulr(r0,r1,r2,r3,1)
455# define qmulr_u(r0,r1,r2,r3) iqmulr(r0,r1,r2,r3,0)
456# define iqmulr(r0,r1,r2,r3,cc) _iqmulr(_jit,r0,r1,r2,r3,cc)
457static void _iqmulr(jit_state_t*,jit_int32_t,jit_int32_t,
458 jit_int32_t,jit_int32_t,jit_bool_t);
459# define qmuli(r0,r1,r2,i0) iqmuli(r0,r1,r2,i0,1)
460# define qmuli_u(r0,r1,r2,i0) iqmuli(r0,r1,r2,i0,0)
461# define iqmuli(r0,r1,r2,i0,cc) _iqmuli(_jit,r0,r1,r2,i0,cc)
462static void _iqmuli(jit_state_t*,jit_int32_t,jit_int32_t,
463 jit_int32_t,jit_word_t,jit_bool_t);
464# define divr(r0,r1,r2) _divr(_jit,r0,r1,r2)
465static void _divr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
466# define divi(r0,r1,i0) _divi(_jit,r0,r1,i0)
467static void _divi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
468# define divr_u(r0,r1,r2) _divr_u(_jit,r0,r1,r2)
469static void _divr_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
470# define divi_u(r0,r1,i0) _divi_u(_jit,r0,r1,i0)
471static void _divi_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
472# define qdivr(r0,r1,r2,r3) iqdivr(r0,r1,r2,r3,1)
473# define qdivr_u(r0,r1,r2,r3) iqdivr(r0,r1,r2,r3,0)
474# define iqdivr(r0,r1,r2,r3,cc) _iqdivr(_jit,r0,r1,r2,r3,cc)
475static void _iqdivr(jit_state_t*,jit_int32_t,jit_int32_t,
476 jit_int32_t,jit_int32_t,jit_bool_t);
477# define qdivi(r0,r1,r2,i0) iqdivi(r0,r1,r2,i0,1)
478# define qdivi_u(r0,r1,r2,i0) iqdivi(r0,r1,r2,i0,0)
479# define iqdivi(r0,r1,r2,i0,cc) _iqdivi(_jit,r0,r1,r2,i0,cc)
480static void _iqdivi(jit_state_t*,jit_int32_t,jit_int32_t,
481 jit_int32_t,jit_word_t,jit_bool_t);
482# define remr(r0,r1,r2) _remr(_jit,r0,r1,r2)
483static void _remr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
484# define remi(r0,r1,i0) _remi(_jit,r0,r1,i0)
485static void _remi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
486# define remr_u(r0,r1,r2) _remr_u(_jit,r0,r1,r2)
487static void _remr_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
488# define remi_u(r0,r1,i0) _remi_u(_jit,r0,r1,i0)
489static void _remi_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
490# if __WORDSIZE == 32
491# define lshr(r0,r1,r2) SLLV(r0,r1,r2)
492# define lshi(r0,r1,i0) SLL(r0,r1,i0)
493# define rshr(r0,r1,r2) SRAV(r0,r1,r2)
494# define rshi(r0,r1,i0) SRA(r0,r1,i0)
495# define rshr_u(r0,r1,r2) SRLV(r0,r1,r2)
496# define rshi_u(r0,r1,i0) SRL(r0,r1,i0)
497# else
498# define lshr(r0,r1,r2) DSLLV(r0,r1,r2)
499# define lshi(r0,r1,i0) _lshi(_jit,r0,r1,i0)
500static void _lshi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
501# define rshr(r0,r1,r2) DSRAV(r0,r1,r2)
502# define rshi(r0,r1,i0) _rshi(_jit,r0,r1,i0)
503static void _rshi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
504# define rshr_u(r0,r1,r2) DSRLV(r0,r1,r2)
505# define rshi_u(r0,r1,i0) _rshi_u(_jit,r0,r1,i0)
506static void _rshi_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
507# endif
508# define andr(r0,r1,r2) AND(r0,r1,r2)
509# define andi(r0,r1,i0) _andi(_jit,r0,r1,i0)
510static void _andi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
511# define orr(r0,r1,r2) OR(r0,r1,r2)
512# define ori(r0,r1,i0) _ori(_jit,r0,r1,i0)
513static void _ori(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
514# define xorr(r0,r1,r2) XOR(r0,r1,r2)
515# define xori(r0,r1,i0) _xori(_jit,r0,r1,i0)
516static void _xori(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
519a9ea1
PC
517# define movr(r0,r1) _movr(_jit,r0,r1)
518static void _movr(jit_state_t*,jit_int32_t,jit_int32_t);
4a71579b
PC
519# define movi(r0,i0) _movi(_jit,r0,i0)
520static void _movi(jit_state_t*,jit_int32_t,jit_word_t);
521# define movi_p(r0,i0) _movi_p(_jit,r0,i0)
522static jit_word_t _movi_p(jit_state_t*,jit_int32_t,jit_word_t);
1f22b268
PC
523# define movnr(r0,r1,r2) MOVN(r0, r1, r2)
524# define movzr(r0,r1,r2) MOVZ(r0, r1, r2)
ba3814c1
PC
525# define casx(r0, r1, r2, r3, i0) _casx(_jit, r0, r1, r2, r3, i0)
526static void _casx(jit_state_t *_jit,jit_int32_t,jit_int32_t,
527 jit_int32_t,jit_int32_t,jit_word_t);
528#define casr(r0, r1, r2, r3) casx(r0, r1, r2, r3, 0)
529#define casi(r0, i0, r1, r2) casx(r0, _NOREG, r1, r2, i0)
4a71579b
PC
530# define ldr_c(r0,r1) LB(r0,0,r1)
531# define ldi_c(r0,i0) _ldi_c(_jit,r0,i0)
532static void _ldi_c(jit_state_t*,jit_int32_t,jit_word_t);
533# define ldr_uc(r0,r1) LBU(r0,0,r1)
534# define ldi_uc(r0,i0) _ldi_uc(_jit,r0,i0)
535static void _ldi_uc(jit_state_t*,jit_int32_t,jit_word_t);
536# define ldr_s(r0,r1) LH(r0,0,r1)
537# define ldi_s(r0,i0) _ldi_s(_jit,r0,i0)
538static void _ldi_s(jit_state_t*,jit_int32_t,jit_word_t);
539# define ldr_us(r0,r1) LHU(r0,0,r1)
540# define ldi_us(r0,i0) _ldi_us(_jit,r0,i0)
541static void _ldi_us(jit_state_t*,jit_int32_t,jit_word_t);
542# define ldr_i(r0,r1) LW(r0,0,r1)
543# define ldi_i(r0,i0) _ldi_i(_jit,r0,i0)
544static void _ldi_i(jit_state_t*,jit_int32_t,jit_word_t);
545# if __WORDSIZE == 64
546# define ldr_ui(r0,r1) LWU(r0,0,r1)
547# define ldi_ui(r0,i0) _ldi_ui(_jit,r0,i0)
548static void _ldi_ui(jit_state_t*,jit_int32_t,jit_word_t);
549# define ldr_l(r0,r1) LD(r0,0,r1)
550# define ldi_l(r0,i0) _ldi_l(_jit,r0,i0)
551static void _ldi_l(jit_state_t*,jit_int32_t,jit_word_t);
552# endif
553# define ldxr_c(r0,r1,r2) _ldxr_c(_jit,r0,r1,r2)
554static void _ldxr_c(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
555# define ldxi_c(r0,r1,i0) _ldxi_c(_jit,r0,r1,i0)
556static void _ldxi_c(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
557# define ldxr_uc(r0,r1,r2) _ldxr_uc(_jit,r0,r1,r2)
558static void _ldxr_uc(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
559# define ldxi_uc(r0,r1,i0) _ldxi_uc(_jit,r0,r1,i0)
560static void _ldxi_uc(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
561# define ldxr_s(r0,r1,r2) _ldxr_s(_jit,r0,r1,r2)
562static void _ldxr_s(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
563# define ldxi_s(r0,r1,i0) _ldxi_s(_jit,r0,r1,i0)
564static void _ldxi_s(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
565# define ldxr_us(r0,r1,r2) _ldxr_us(_jit,r0,r1,r2)
566static void _ldxr_us(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
567# define ldxi_us(r0,r1,i0) _ldxi_us(_jit,r0,r1,i0)
568static void _ldxi_us(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
569# define ldxr_i(r0,r1,r2) _ldxr_i(_jit,r0,r1,r2)
570static void _ldxr_i(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
571# define ldxi_i(r0,r1,i0) _ldxi_i(_jit,r0,r1,i0)
572static void _ldxi_i(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
573# if __WORDSIZE == 64
574# define ldxr_ui(r0,r1,r2) _ldxr_ui(_jit,r0,r1,r2)
575static void _ldxr_ui(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
576# define ldxi_ui(r0,r1,i0) _ldxi_ui(_jit,r0,r1,i0)
577static void _ldxi_ui(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
578# define ldxr_l(r0,r1,r2) _ldxr_l(_jit,r0,r1,r2)
579static void _ldxr_l(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
580# define ldxi_l(r0,r1,i0) _ldxi_l(_jit,r0,r1,i0)
581static void _ldxi_l(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
582# endif
583# define str_c(r0,r1) SB(r1,0,r0)
584# define sti_c(i0,r0) _sti_c(_jit,i0,r0)
585static void _sti_c(jit_state_t*,jit_word_t,jit_int32_t);
586# define str_s(r0,r1) SH(r1,0,r0)
587# define sti_s(i0,r0) _sti_s(_jit,i0,r0)
588static void _sti_s(jit_state_t*,jit_word_t,jit_int32_t);
589# define str_i(r0,r1) SW(r1,0,r0)
590# define sti_i(i0,r0) _sti_i(_jit,i0,r0)
591static void _sti_i(jit_state_t*,jit_word_t,jit_int32_t);
592# if __WORDSIZE == 64
593# define str_l(r0,r1) SD(r1,0,r0)
594# define sti_l(i0,r0) _sti_l(_jit,i0,r0)
595static void _sti_l(jit_state_t*,jit_word_t,jit_int32_t);
596# endif
597# define stxr_c(r0,r1,r2) _stxr_c(_jit,r0,r1,r2)
598static void _stxr_c(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
599# define stxi_c(i0,r0,r1) _stxi_c(_jit,i0,r0,r1)
600static void _stxi_c(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
601# define stxr_s(r0,r1,r2) _stxr_s(_jit,r0,r1,r2)
602static void _stxr_s(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
603# define stxi_s(i0,r0,r1) _stxi_s(_jit,i0,r0,r1)
604static void _stxi_s(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
605# define stxr_i(r0,r1,r2) _stxr_i(_jit,r0,r1,r2)
606static void _stxr_i(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
607# define stxi_i(i0,r0,r1) _stxi_i(_jit,i0,r0,r1)
608static void _stxi_i(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
609# if __WORDSIZE == 64
610# define stxr_l(r0,r1,r2) _stxr_l(_jit,r0,r1,r2)
611static void _stxr_l(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
612# define stxi_l(i0,r0,r1) _stxi_l(_jit,i0,r0,r1)
613static void _stxi_l(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
614# endif
40a44dcb
PC
615# define bswapr_us(r0,r1) _bswapr_us(_jit,r0,r1)
616static void _bswapr_us(jit_state_t*,jit_int32_t,jit_int32_t);
617# define bswapr_ui(r0,r1) _bswapr_ui(_jit,r0,r1)
618static void _bswapr_ui(jit_state_t*,jit_int32_t,jit_int32_t);
619# if __WORDSIZE == 64
620# define bswapr_ul(r0,r1) generic_bswapr_ul(_jit,r0,r1)
4a71579b
PC
621# endif
622# define extr_c(r0,r1) _extr_c(_jit,r0,r1)
623static void _extr_c(jit_state_t*,jit_int32_t,jit_int32_t);
624# define extr_uc(r0,r1) ANDI(r0,r1,0xff)
625# define extr_s(r0,r1) _extr_s(_jit,r0,r1)
626static void _extr_s(jit_state_t*,jit_int32_t,jit_int32_t);
627# define extr_us(r0,r1) ANDI(r0,r1,0xffff)
628# if __WORDSIZE == 64
629# define extr_i(r0,r1) SLL(r0,r1,0)
630# define extr_ui(r0,r1) _extr_ui(_jit,r0,r1)
631static void _extr_ui(jit_state_t*,jit_int32_t,jit_int32_t);
632# endif
633# define ltr(r0,r1,r2) SLT(r0,r1,r2)
634# define lti(r0,r1,i0) _lti(_jit,r0,r1,i0)
635static void _lti(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
636# define ltr_u(r0,r1,r2) SLTU(r0,r1,r2)
637# define lti_u(r0,r1,i0) _lti_u(_jit,r0,r1,i0)
638static void _lti_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
639#define ler(r0,r1,r2) _ler(_jit,r0,r1,r2)
640static void _ler(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
641#define lei(r0,r1,i0) _lei(_jit,r0,r1,i0)
642static void _lei(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
643#define ler_u(r0,r1,r2) _ler_u(_jit,r0,r1,r2)
644static void _ler_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
645#define lei_u(r0,r1,i0) _lei_u(_jit,r0,r1,i0)
646static void _lei_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
647#define eqr(r0,r1,r2) _eqr(_jit,r0,r1,r2)
648static void _eqr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
649#define eqi(r0,r1,i0) _eqi(_jit,r0,r1,i0)
650static void _eqi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
651#define ger(r0,r1,r2) _ger(_jit,r0,r1,r2)
652static void _ger(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
653#define gei(r0,r1,i0) _gei(_jit,r0,r1,i0)
654static void _gei(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
655#define ger_u(r0,r1,i0) _ger_u(_jit,r0,r1,i0)
656static void _ger_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
657#define gei_u(r0,r1,i0) _gei_u(_jit,r0,r1,i0)
658static void _gei_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
659# define gtr(r0,r1,r2) SLT(r0,r2,r1)
660#define gti(r0,r1,i0) _gti(_jit,r0,r1,i0)
661static void _gti(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
662# define gtr_u(r0,r1,r2) SLTU(r0,r2,r1)
663# define gti_u(r0,r1,i0) _gti_u(_jit,r0,r1,i0)
664static void _gti_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
665#define ner(r0,r1,r2) _ner(_jit,r0,r1,r2)
666static void _ner(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
667#define nei(r0,r1,i0) _nei(_jit,r0,r1,i0)
668static void _nei(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
669#define bltr(i0,r0,r1) _bltr(_jit,i0,r0,r1)
670static jit_word_t _bltr(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
671#define bltr_u(i0,r0,r1) _bltr_u(_jit,i0,r0,r1)
672static jit_word_t _bltr_u(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
673#define blti(i0,r0,i1) _blti(_jit,i0,r0,i1)
674static jit_word_t _blti(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
675#define blti_u(i0,r0,i1) _blti_u(_jit,i0,r0,i1)
676static jit_word_t _blti_u(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
677#define bler(i0,r0,r1) _bler(_jit,i0,r0,r1)
678static jit_word_t _bler(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
679#define bler_u(i0,r0,r1) _bler_u(_jit,i0,r0,r1)
680static jit_word_t _bler_u(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
681#define blei(i0,r0,i1) _blei(_jit,i0,r0,i1)
682static jit_word_t _blei(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
683#define blei_u(i0,r0,i1) _blei_u(_jit,i0,r0,i1)
684static jit_word_t _blei_u(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
685#define beqr(i0,r0,r1) _beqr(_jit,i0,r0,r1)
686static jit_word_t _beqr(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
687#define beqi(i0,r0,i1) _beqi(_jit,i0,r0,i1)
688static jit_word_t _beqi(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
689#define bger(i0,r0,r1) _bger(_jit,i0,r0,r1)
690static jit_word_t _bger(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
691#define bger_u(i0,r0,r1) _bger_u(_jit,i0,r0,r1)
692static jit_word_t _bger_u(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
693#define bgei(i0,r0,i1) _bgei(_jit,i0,r0,i1)
694static jit_word_t _bgei(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
695#define bgei_u(i0,r0,i1) _bgei_u(_jit,i0,r0,i1)
696static jit_word_t _bgei_u(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
697#define bgtr(i0,r0,r1) _bgtr(_jit,i0,r0,r1)
698static jit_word_t _bgtr(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
699#define bgtr_u(i0,r0,r1) _bgtr_u(_jit,i0,r0,r1)
700static jit_word_t _bgtr_u(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
701#define bgti(i0,r0,i1) _bgti(_jit,i0,r0,i1)
702static jit_word_t _bgti(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
703#define bgti_u(i0,r0,i1) _bgti_u(_jit,i0,r0,i1)
704static jit_word_t _bgti_u(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
705#define bner(i0,r0,r1) _bner(_jit,i0,r0,r1)
706static jit_word_t _bner(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
707#define bnei(i0,r0,i1) _bnei(_jit,i0,r0,i1)
708static jit_word_t _bnei(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
709# define jmpr(r0) _jmpr(_jit,r0)
710static void _jmpr(jit_state_t*,jit_int32_t);
711# define jmpi(i0) _jmpi(_jit,i0)
712static jit_word_t _jmpi(jit_state_t*,jit_word_t);
713# define boaddr(i0,r0,r1) _boaddr(_jit,i0,r0,r1)
714static jit_word_t _boaddr(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
715# define boaddi(i0,r0,i1) _boaddi(_jit,i0,r0,i1)
716static jit_word_t _boaddi(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
717# define boaddr_u(i0,r0,r1) _boaddr_u(_jit,i0,r0,r1)
718static jit_word_t _boaddr_u(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
719# define boaddi_u(i0,r0,i1) _boaddi_u(_jit,i0,r0,i1)
720static jit_word_t _boaddi_u(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
721# define bxaddr(i0,r0,r1) _bxaddr(_jit,i0,r0,r1)
722static jit_word_t _bxaddr(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
723# define bxaddi(i0,r0,i1) _bxaddi(_jit,i0,r0,i1)
724static jit_word_t _bxaddi(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
725# define bxaddr_u(i0,r0,r1) _bxaddr_u(_jit,i0,r0,r1)
726static jit_word_t _bxaddr_u(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
727# define bxaddi_u(i0,r0,i1) _bxaddi_u(_jit,i0,r0,i1)
728static jit_word_t _bxaddi_u(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
729# define bosubr(i0,r0,r1) _bosubr(_jit,i0,r0,r1)
730static jit_word_t _bosubr(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
731# define bosubi(i0,r0,i1) _bosubi(_jit,i0,r0,i1)
732static jit_word_t _bosubi(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
733# define bosubr_u(i0,r0,r1) _bosubr_u(_jit,i0,r0,r1)
734static jit_word_t _bosubr_u(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
735# define bosubi_u(i0,r0,i1) _bosubi_u(_jit,i0,r0,i1)
736static jit_word_t _bosubi_u(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
737# define bxsubr(i0,r0,r1) _bxsubr(_jit,i0,r0,r1)
738static jit_word_t _bxsubr(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
739# define bxsubi(i0,r0,i1) _bxsubi(_jit,i0,r0,i1)
740static jit_word_t _bxsubi(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
741# define bxsubr_u(i0,r0,r1) _bxsubr_u(_jit,i0,r0,r1)
742static jit_word_t _bxsubr_u(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
743# define bxsubi_u(i0,r0,i1) _bxsubi_u(_jit,i0,r0,i1)
744static jit_word_t _bxsubi_u(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
745# define bmsr(i0,r0,r1) _bmsr(_jit,i0,r0,r1)
746static jit_word_t _bmsr(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
747# define bmsi(i0,r0,i1) _bmsi(_jit,i0,r0,i1)
748static jit_word_t _bmsi(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
749# define bmcr(i0,r0,r1) _bmcr(_jit,i0,r0,r1)
750static jit_word_t _bmcr(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
751# define bmci(i0,r0,i1) _bmci(_jit,i0,r0,i1)
752static jit_word_t _bmci(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
753# define callr(r0) _callr(_jit,r0)
754static void _callr(jit_state_t*,jit_int32_t);
755# define calli(i0) _calli(_jit,i0)
756static void _calli(jit_state_t*,jit_word_t);
757# define calli_p(i0) _calli_p(_jit,i0)
758static jit_word_t _calli_p(jit_state_t*,jit_word_t);
759# define prolog(node) _prolog(_jit,node)
760static void _prolog(jit_state_t*,jit_node_t*);
761# define epilog(node) _epilog(_jit,node)
762static void _epilog(jit_state_t*,jit_node_t*);
763# define vastart(r0) _vastart(_jit, r0)
764static void _vastart(jit_state_t*, jit_int32_t);
765# define vaarg(r0, r1) _vaarg(_jit, r0, r1)
766static void _vaarg(jit_state_t*, jit_int32_t, jit_int32_t);
767#define patch_abs(instr,label) _patch_abs(_jit,instr,label)
768static void _patch_abs(jit_state_t*,jit_word_t,jit_word_t);
769#define patch_at(jump,label) _patch_at(_jit,jump,label)
770static void _patch_at(jit_state_t*,jit_word_t,jit_word_t);
771#endif
772
773#if CODE
774static void
775_hrrrit(jit_state_t *_jit,jit_int32_t hc,
776 jit_int32_t rs, jit_int32_t rt, jit_int32_t rd,
777 jit_int32_t ic, jit_int32_t tc)
778{
779 jit_instr_t i;
780 i.tc.b = tc;
781 i.ic.b = ic;
782 i.rd.b = rd;
783 i.rt.b = rt;
784 i.rs.b = rs;
785 i.hc.b = hc;
786 ii(i.op);
787}
788
789static void
790_hrri(jit_state_t *_jit, jit_int32_t hc,
791 jit_int32_t rs, jit_int32_t rt, jit_int32_t im)
792{
793 jit_instr_t i;
794 i.op = 0;
795 i.is.b = im;
796 i.rt.b = rt;
797 i.rs.b = rs;
798 i.hc.b = hc;
799 ii(i.op);
800}
801
802static void
803_hi(jit_state_t *_jit, jit_int32_t hc, jit_int32_t im)
804{
805 jit_instr_t i;
806 i.ii.b = im;
807 i.hc.b = hc;
808 ii(i.op);
809}
810
811static void
812_nop(jit_state_t *_jit, jit_int32_t i0)
813{
814 for (; i0 > 0; i0 -= 4)
815 NOP();
816 assert(i0 == 0);
817}
818
40a44dcb
PC
819static void
820_extr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1,
821 jit_int32_t pos, jit_int32_t size)
822{
823 assert(size > 0);
824
825 if (__WORDSIZE == 32)
826 EXT(r0, r1, pos, size);
827 else if (pos >= 32)
828 DEXTU(r0, r1, pos, size);
829 else if (size > 32)
830 DEXTM(r0, r1, pos, size);
831 else
832 DEXT(r0, r1, pos, size);
833}
834
835static void
836_insr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1,
837 jit_int32_t pos, jit_int32_t size)
838{
839 assert(size > 0);
840
841 if (__WORDSIZE == 32)
842 INS(r0, r1, pos, size);
843 else if (pos >= 32)
844 DINSU(r0, r1, pos, size);
845 else if (size > 32)
846 DINSM(r0, r1, pos, size);
847 else
848 DINS(r0, r1, pos, size);
849}
850
4a71579b
PC
851static void
852_addi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
853{
854 jit_int32_t reg;
855 if (i0 == 0)
856 movr(r0, r1);
857 else if (can_sign_extend_short_p(i0))
858 addiu(r0, r1, i0);
859 else {
860 reg = jit_get_reg(jit_class_gpr);
861 movi(rn(reg), i0);
862 addr(r0, r1, rn(reg));
863 jit_unget_reg(reg);
864 }
865}
866
867static void
868_addcr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
869{
870 jit_int32_t t0;
871
872 if (jit_carry == _NOREG)
873 jit_carry = jit_get_reg(jit_class_gpr);
874 if (r0 == r1) {
875 t0 = jit_get_reg(jit_class_gpr);
876 addr(rn(t0), r1, r2);
877 SLTU(rn(jit_carry), rn(t0), r1);
878 movr(r0, rn(t0));
879 jit_unget_reg(t0);
880 }
881 else {
882 addr(r0, r1, r2);
883 SLTU(rn(jit_carry), r0, r1);
884 }
885}
886
887static void
888_addci(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
889{
890 jit_int32_t t0;
891
892 if (jit_carry == _NOREG)
893 jit_carry = jit_get_reg(jit_class_gpr);
894 t0 = jit_get_reg(jit_class_gpr);
895 if (r0 == r1) {
896 if (can_sign_extend_short_p(i0))
897 addiu(rn(t0), r1, i0);
898 else {
899 movi(rn(t0), i0);
900 addr(rn(t0), r1, rn(t0));
901 }
902 SLTU(rn(jit_carry), rn(t0), r1);
903 movr(r0, rn(t0));
904 }
905 else {
906 if (can_sign_extend_short_p(i0))
907 addiu(r0, r1, i0);
908 else {
909 movi(rn(t0), i0);
910 addr(r0, r1, rn(t0));
911 }
912 SLTU(rn(jit_carry), r0, r1);
913 }
914 jit_unget_reg(t0);
915}
916
917static void
918_addxr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
919{
920 jit_int32_t t0;
921
922 assert(jit_carry != _NOREG);
923 t0 = jit_get_reg(jit_class_gpr);
924 movr(rn(t0), rn(jit_carry));
925 addcr(r0, r1, r2);
926 addcr(r0, r0, rn(t0));
927 jit_unget_reg(t0);
928}
929
930static void
931_addxi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
932{
933 jit_int32_t t0;
934
935 assert(jit_carry != _NOREG);
936 t0 = jit_get_reg(jit_class_gpr);
937 movr(rn(t0), rn(jit_carry));
938 addci(r0, r1, i0);
939 addcr(r0, r0, rn(t0));
940 jit_unget_reg(t0);
941}
942
943static void
944_subi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
945{
946 jit_int32_t reg;
947 if (i0 == 0)
948 movr(r0, r1);
949 else if (can_sign_extend_short_p(i0) && (i0 & 0xffff) != 0x8000)
950 addiu(r0, r1, -i0);
951 else {
952 reg = jit_get_reg(jit_class_gpr);
953 movi(rn(reg), i0);
954 subr(r0, r1, rn(reg));
955 jit_unget_reg(reg);
956 }
957}
958
959static void
960_subcr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
961{
962 jit_int32_t t0;
963
964 if (jit_carry == _NOREG)
965 jit_carry = jit_get_reg(jit_class_gpr);
966 if (r0 == r1) {
967 t0 = jit_get_reg(jit_class_gpr);
968 subr(rn(t0), r1, r2);
969 SLTU(rn(jit_carry), r1, rn(t0));
970 movr(r0, rn(t0));
971 jit_unget_reg(t0);
972 }
973 else {
974 subr(r0, r1, r2);
975 SLTU(rn(jit_carry), r1, r0);
976 }
977}
978
979static void
980_subci(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
981{
982 jit_int32_t t0;
983
984 if (jit_carry == _NOREG)
985 jit_carry = jit_get_reg(jit_class_gpr);
986 t0 = jit_get_reg(jit_class_gpr);
987 if (r0 == r1) {
988 if (can_sign_extend_short_p(i0) && (i0 & 0xffff) != 0x8000)
989 addiu(rn(t0), r1, -i0);
990 else {
991 movi(rn(t0), i0);
992 subr(rn(t0), r1, rn(t0));
993 }
994 SLTU(rn(jit_carry), r1, rn(t0));
995 movr(r0, rn(t0));
996 }
997 else {
998 if (can_sign_extend_short_p(i0) && (i0 & 0xffff) != 0x8000)
999 addiu(r0, r1, -i0);
1000 else {
1001 movi(rn(t0), i0);
1002 subr(r0, r1, rn(t0));
1003 }
1004 SLTU(rn(jit_carry), r1, r0);
1005 }
1006 jit_unget_reg(t0);
1007}
1008
1009static void
1010_subxr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1011{
1012 jit_int32_t t0;
1013
1014 assert(jit_carry != _NOREG);
1015 t0 = jit_get_reg(jit_class_gpr);
1016 movr(rn(t0), rn(jit_carry));
1017 subcr(r0, r1, r2);
1018 subcr(r0, r0, rn(t0));
1019 jit_unget_reg(t0);
1020}
1021
1022static void
1023_subxi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1024{
1025 jit_int32_t t0;
1026
1027 assert(jit_carry != _NOREG);
1028 t0 = jit_get_reg(jit_class_gpr);
1029 movr(rn(t0), rn(jit_carry));
1030 subci(r0, r1, i0);
1031 subcr(r0, r0, rn(t0));
1032 jit_unget_reg(t0);
1033}
1034
1035static void
1036_rsbi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1037{
1038 subi(r0, r1, i0);
1039 negr(r0, r0);
1040}
1041
1042static void
1043_mulr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1044{
40a44dcb
PC
1045 if (__WORDSIZE == 32)
1046 MUL(r0, r1, r2);
1047 else {
1048 multu(r1, r2);
1049 MFLO(r0);
1050 }
4a71579b
PC
1051}
1052
1053static void
1054_muli(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1055{
1056 jit_int32_t reg;
1057
1058 reg = jit_get_reg(jit_class_gpr);
1059 movi(rn(reg), i0);
1060 mulr(r0, r1, rn(reg));
1061 jit_unget_reg(reg);
1062}
1063
1064static void
1065_iqmulr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1,
1066 jit_int32_t r2, jit_int32_t r3, jit_bool_t sign)
1067{
1068 if (sign)
1069 mult(r2, r3);
1070 else
1071 multu(r2, r3);
1072 MFLO(r0);
1073 MFHI(r1);
1074}
1075
1076static void
1077_iqmuli(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1,
1078 jit_int32_t r2, jit_word_t i0, jit_bool_t sign)
1079{
1080 jit_int32_t reg;
1081 reg = jit_get_reg(jit_class_gpr);
1082 movi(rn(reg), i0);
1083 iqmulr(r0, r1, r2, rn(reg), sign);
1084 jit_unget_reg(reg);
1085}
1086
1087static void
1088_divr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1089{
1090 div(r1, r2);
1091 MFLO(r0);
1092}
1093
1094static void
1095_divi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1096{
1097 jit_int32_t reg;
1098 reg = jit_get_reg(jit_class_gpr);
1099 movi(rn(reg), i0);
1100 divr(r0, r1, rn(reg));
1101 jit_unget_reg(reg);
1102}
1103
1104static void
1105_divr_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1106{
1107 divu(r1, r2);
1108 MFLO(r0);
1109}
1110
1111static void
1112_divi_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1113{
1114 jit_int32_t reg;
1115 reg = jit_get_reg(jit_class_gpr);
1116 movi(rn(reg), i0);
1117 divr_u(r0, r1, rn(reg));
1118 jit_unget_reg(reg);
1119}
1120
1121static void
1122_iqdivr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1,
1123 jit_int32_t r2, jit_int32_t r3, jit_bool_t sign)
1124{
1125 if (sign)
1126 div(r2, r3);
1127 else
1128 divu(r2, r3);
1129 MFLO(r0);
1130 MFHI(r1);
1131}
1132
1133static void
1134_iqdivi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1,
1135 jit_int32_t r2, jit_word_t i0, jit_bool_t sign)
1136{
1137 jit_int32_t reg;
1138 reg = jit_get_reg(jit_class_gpr);
1139 movi(rn(reg), i0);
1140 iqdivr(r0, r1, r2, rn(reg), sign);
1141 jit_unget_reg(reg);
1142}
1143
1144static void
1145_remr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1146{
1147 div(r1, r2);
1148 MFHI(r0);
1149}
1150
1151static void
1152_remi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1153{
1154 jit_int32_t reg;
1155 reg = jit_get_reg(jit_class_gpr);
1156 movi(rn(reg), i0);
1157 remr(r0, r1, rn(reg));
1158 jit_unget_reg(reg);
1159}
1160
1161static void
1162_remr_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1163{
1164 divu(r1, r2);
1165 MFHI(r0);
1166}
1167
1168static void
1169_remi_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1170{
1171 jit_int32_t reg;
1172 reg = jit_get_reg(jit_class_gpr);
1173 movi(rn(reg), i0);
1174 remr_u(r0, r1, rn(reg));
1175 jit_unget_reg(reg);
1176}
1177
1178#if __WORDSIZE == 64
1179static void
1180_lshi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1181{
1182 assert(i0 >= 0 && i0 <= 63);
1183 if (i0 < 32)
1184 DSLL(r0, r1, i0);
1185 else
1186 DSLL32(r0, r1, i0 - 32);
1187}
1188
1189static void
1190_rshi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1191{
1192 assert(i0 >= 0 && i0 <= 63);
1193 if (i0 < 32)
1194 DSRA(r0, r1, i0);
1195 else
1196 DSRA32(r0, r1, i0 - 32);
1197}
1198
1199static void
1200_rshi_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1201{
1202 assert(i0 >= 0 && i0 <= 63);
1203 if (i0 < 32)
1204 DSRL(r0, r1, i0);
1205 else
1206 DSRL32(r0, r1, i0 - 32);
1207}
1208#endif
1209
1210static void
1211_andi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1212{
1213 jit_int32_t reg;
1214 if (can_zero_extend_short_p(i0))
40a44dcb 1215 ANDI(r0, r1, i0);
519a9ea1 1216 else if (is_low_mask(i0)) {
40a44dcb
PC
1217 if (jit_mips2_p())
1218 extr(r0, r1, 0, masked_bits_count(i0));
1219 else {
1220 lshi(r0, r1, unmasked_bits_count(i0));
1221 rshi_u(r0, r0, unmasked_bits_count(i0));
1222 }
519a9ea1 1223 } else if (is_high_mask(i0)) {
40a44dcb
PC
1224 if (jit_mips2_p() && r0 == r1)
1225 insr(r0, _ZERO_REGNO, 0, unmasked_bits_count(i0));
1226 else {
1227 rshi(r0, r1, unmasked_bits_count(i0));
1228 lshi(r0, r0, unmasked_bits_count(i0));
1229 }
1230 } else if (jit_mips2_p() && is_middle_mask(i0)) {
1231 extr(r0, r1, __builtin_ctzl(i0), masked_bits_count(i0));
1232 lshi(r0, r0, __builtin_ctzl(i0));
1233 } else if (jit_mips2_p() && is_middle_mask(~i0)) {
1234 if (r0 != r1)
1235 movr(r0, r1);
1236 insr(r0, _ZERO_REGNO, __builtin_ctzl(~i0), masked_bits_count(~i0));
519a9ea1 1237 } else {
40a44dcb
PC
1238 reg = jit_get_reg(jit_class_gpr);
1239 movi(rn(reg), i0);
1240 AND(r0, r1, rn(reg));
1241 jit_unget_reg(reg);
4a71579b
PC
1242 }
1243}
1244
1245static void
1246_ori(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1247{
1248 jit_int32_t reg;
1249 if (can_zero_extend_short_p(i0))
1250 ORI(r0, r1, i0);
1251 else {
1252 reg = jit_get_reg(jit_class_gpr);
1253 movi(rn(reg), i0);
1254 OR(r0, r1, rn(reg));
1255 jit_unget_reg(reg);
1256 }
1257}
1258
1259static void
1260_xori(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1261{
1262 jit_int32_t reg;
1263 if (can_zero_extend_short_p(i0))
1264 XORI(r0, r1, i0);
1265 else {
1266 reg = jit_get_reg(jit_class_gpr);
1267 movi(rn(reg), i0);
1268 XOR(r0, r1, rn(reg));
1269 jit_unget_reg(reg);
1270 }
1271}
1272
519a9ea1
PC
1273static void
1274_movr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1275{
1276 if (r0 != r1)
1277 orr(r0, r1, _ZERO_REGNO);
1278}
1279
4a71579b
PC
1280static void
1281_movi(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
1282{
1283 if (i0 == 0)
1284 OR(r0, _ZERO_REGNO, _ZERO_REGNO);
1285 else if (can_sign_extend_short_p(i0))
1286 addiu(r0, _ZERO_REGNO, i0);
1287 else if (can_zero_extend_short_p(i0))
1288 ORI(r0, _ZERO_REGNO, i0);
1289 else {
1290 if (can_sign_extend_int_p(i0))
1291 LUI(r0, i0 >> 16);
1292 else if (can_zero_extend_int_p(i0)) {
1293 if (i0 & 0xffff0000) {
1294 ORI(r0, _ZERO_REGNO, i0 >> 16);
1295 lshi(r0, r0, 16);
1296 }
1297 }
1298# if __WORDSIZE == 64
1299 else {
1300 movi(r0, (jit_uword_t)i0 >> 32);
1301 if (i0 & 0xffff0000) {
1302 lshi(r0, r0, 16);
1303 ORI(r0, r0, i0 >> 16);
1304 lshi(r0, r0, 16);
1305 }
1306 else
1307 lshi(r0, r0, 32);
1308 }
1309# endif
1310 if (i0 & 0xffff)
1311 ORI(r0, r0, i0);
1312 }
1313}
1314
1315static jit_word_t
1316_movi_p(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
1317{
1318 jit_word_t w;
1319
1320 w = _jit->pc.w;
1321# if __WORDSIZE == 32
1322 LUI(r0, i0 >> 16);
1323 ORI(r0, r0, i0);
1324# else
1325 LUI(r0, i0 >> 48);
1326 ORI(r0, r0, i0 >> 32);
1327 lshi(r0, r0, 16);
1328 ORI(r0, r0, i0 >> 16);
1329 lshi(r0, r0, 16);
1330 ORI(r0, r0, i0);
1331# endif
1332
1333 return (w);
1334}
1335
ba3814c1
PC
1336static void
1337_casx(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1,
1338 jit_int32_t r2, jit_int32_t r3, jit_word_t i0)
1339{
1340 fallback_casx(r0, r1, r2, r3, i0);
1341}
1342
4a71579b
PC
1343static void
1344_ldi_c(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
1345{
1346 jit_int32_t reg;
1347 if (can_sign_extend_short_p(i0))
1348 LB(r0, i0, _ZERO_REGNO);
1349 else {
1350 reg = jit_get_reg(jit_class_gpr);
1351 movi(rn(reg), i0);
1352 ldr_c(r0, rn(reg));
1353 jit_unget_reg(reg);
1354 }
1355}
1356
1357static void
1358_ldi_uc(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
1359{
1360 jit_int32_t reg;
1361 if (can_sign_extend_short_p(i0))
1362 LBU(r0, i0, _ZERO_REGNO);
1363 else {
1364 reg = jit_get_reg(jit_class_gpr);
1365 movi(rn(reg), i0);
1366 ldr_uc(r0, rn(reg));
1367 jit_unget_reg(reg);
1368 }
1369}
1370
1371static void
1372_ldi_s(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
1373{
1374 jit_int32_t reg;
1375 if (can_sign_extend_short_p(i0))
1376 LH(r0, i0, _ZERO_REGNO);
1377 else {
1378 reg = jit_get_reg(jit_class_gpr);
1379 movi(rn(reg), i0);
1380 ldr_s(r0, rn(reg));
1381 jit_unget_reg(reg);
1382 }
1383}
1384
1385static void
1386_ldi_us(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
1387{
1388 jit_int32_t reg;
1389 if (can_sign_extend_short_p(i0))
1390 LHU(r0, i0, _ZERO_REGNO);
1391 else {
1392 reg = jit_get_reg(jit_class_gpr);
1393 movi(rn(reg), i0);
1394 ldr_us(r0, rn(reg));
1395 jit_unget_reg(reg);
1396 }
1397}
1398
1399static void
1400_ldi_i(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
1401{
1402 jit_int32_t reg;
1403 if (can_sign_extend_short_p(i0))
1404 LW(r0, i0, _ZERO_REGNO);
1405 else {
1406 reg = jit_get_reg(jit_class_gpr);
1407 movi(rn(reg), i0);
1408 ldr_i(r0, rn(reg));
1409 jit_unget_reg(reg);
1410 }
1411}
1412
1413#if __WORDSIZE == 64
1414static void
1415_ldi_ui(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
1416{
1417 jit_int32_t reg;
1418 if (can_sign_extend_short_p(i0))
1419 LWU(r0, i0, _ZERO_REGNO);
1420 else {
1421 reg = jit_get_reg(jit_class_gpr);
1422 movi(rn(reg), i0);
1423 ldr_ui(r0, rn(reg));
1424 jit_unget_reg(reg);
1425 }
1426}
1427
1428static void
1429_ldi_l(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
1430{
1431 jit_int32_t reg;
1432 if (can_sign_extend_short_p(i0))
1433 LD(r0, i0, _ZERO_REGNO);
1434 else {
1435 reg = jit_get_reg(jit_class_gpr);
1436 movi(rn(reg), i0);
1437 ldr_l(r0, rn(reg));
1438 jit_unget_reg(reg);
1439 }
1440}
1441#endif
1442
1443static void
1444_ldxr_c(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1 ,jit_int32_t r2)
1445{
1446 jit_int32_t reg;
1447 reg = jit_get_reg(jit_class_gpr);
1448 addr(rn(reg), r1, r2);
1449 ldr_c(r0, rn(reg));
1450 jit_unget_reg(reg);
1451}
1452
1453static void
1454_ldxi_c(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1455{
1456 jit_int32_t reg;
1457 if (can_sign_extend_short_p(i0))
1458 LB(r0, i0, r1);
1459 else {
1460 reg = jit_get_reg(jit_class_gpr);
1461 addi(rn(reg), r1, i0);
1462 ldr_c(r0, rn(reg));
1463 jit_unget_reg(reg);
1464 }
1465}
1466
1467static void
1468_ldxr_uc(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1 ,jit_int32_t r2)
1469{
1470 jit_int32_t reg;
1471 reg = jit_get_reg(jit_class_gpr);
1472 addr(rn(reg), r1, r2);
1473 ldr_uc(r0, rn(reg));
1474 jit_unget_reg(reg);
1475}
1476
1477static void
1478_ldxi_uc(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1479{
1480 jit_int32_t reg;
1481 if (can_sign_extend_short_p(i0))
1482 LBU(r0, i0, r1);
1483 else {
1484 reg = jit_get_reg(jit_class_gpr);
1485 addi(rn(reg), r1, i0);
1486 ldr_uc(r0, rn(reg));
1487 jit_unget_reg(reg);
1488 }
1489}
1490
1491static void
1492_ldxr_s(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1 ,jit_int32_t r2)
1493{
1494 jit_int32_t reg;
1495 reg = jit_get_reg(jit_class_gpr);
1496 addr(rn(reg), r1, r2);
1497 ldr_s(r0, rn(reg));
1498 jit_unget_reg(reg);
1499}
1500
1501static void
1502_ldxi_s(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1503{
1504 jit_int32_t reg;
1505 if (can_sign_extend_short_p(i0))
1506 LH(r0, i0, r1);
1507 else {
1508 reg = jit_get_reg(jit_class_gpr);
1509 addi(rn(reg), r1, i0);
1510 ldr_s(r0, rn(reg));
1511 jit_unget_reg(reg);
1512 }
1513}
1514
1515static void
1516_ldxr_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1 ,jit_int32_t r2)
1517{
1518 jit_int32_t reg;
1519 reg = jit_get_reg(jit_class_gpr);
1520 addr(rn(reg), r1, r2);
1521 ldr_us(r0, rn(reg));
1522 jit_unget_reg(reg);
1523}
1524
1525static void
1526_ldxi_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1527{
1528 jit_int32_t reg;
1529 if (can_sign_extend_short_p(i0))
1530 LHU(r0, i0, r1);
1531 else {
1532 reg = jit_get_reg(jit_class_gpr);
1533 addi(rn(reg), r1, i0);
1534 ldr_us(r0, rn(reg));
1535 jit_unget_reg(reg);
1536 }
1537}
1538
1539static void
1540_ldxr_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1 ,jit_int32_t r2)
1541{
1542 jit_int32_t reg;
1543 reg = jit_get_reg(jit_class_gpr);
1544 addr(rn(reg), r1, r2);
1545 ldr_i(r0, rn(reg));
1546 jit_unget_reg(reg);
1547}
1548
1549static void
1550_ldxi_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1551{
1552 jit_int32_t reg;
1553 if (can_sign_extend_short_p(i0))
1554 LW(r0, i0, r1);
1555 else {
1556 reg = jit_get_reg(jit_class_gpr);
1557 addi(rn(reg), r1, i0);
1558 ldr_i(r0, rn(reg));
1559 jit_unget_reg(reg);
1560 }
1561}
1562
1563#if __WORDSIZE == 64
1564static void
1565_ldxr_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1 ,jit_int32_t r2)
1566{
1567 jit_int32_t reg;
1568 reg = jit_get_reg(jit_class_gpr);
1569 addr(rn(reg), r1, r2);
1570 ldr_ui(r0, rn(reg));
1571 jit_unget_reg(reg);
1572}
1573
1574static void
1575_ldxi_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1576{
1577 jit_int32_t reg;
1578 if (can_sign_extend_short_p(i0))
1579 LWU(r0, i0, r1);
1580 else {
1581 reg = jit_get_reg(jit_class_gpr);
1582 addi(rn(reg), r1, i0);
1583 ldr_ui(r0, rn(reg));
1584 jit_unget_reg(reg);
1585 }
1586}
1587
1588static void
1589_ldxr_l(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1 ,jit_int32_t r2)
1590{
1591 jit_int32_t reg;
1592 reg = jit_get_reg(jit_class_gpr);
1593 addr(rn(reg), r1, r2);
1594 ldr_l(r0, rn(reg));
1595 jit_unget_reg(reg);
1596}
1597
1598static void
1599_ldxi_l(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1600{
1601 jit_int32_t reg;
1602 if (can_sign_extend_short_p(i0))
1603 LD(r0, i0, r1);
1604 else {
1605 reg = jit_get_reg(jit_class_gpr);
1606 addi(rn(reg), r1, i0);
1607 ldr_l(r0, rn(reg));
1608 jit_unget_reg(reg);
1609 }
1610}
1611#endif
1612
1613static void
1614_sti_c(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
1615{
1616 jit_int32_t reg;
1617 if (can_sign_extend_short_p(i0))
1618 SB(r0, i0, _ZERO_REGNO);
1619 else {
1620 reg = jit_get_reg(jit_class_gpr);
1621 movi(rn(reg), i0);
1622 str_c(rn(reg), r0);
1623 jit_unget_reg(reg);
1624 }
1625}
1626
1627static void
1628_sti_s(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
1629{
1630 jit_int32_t reg;
1631 if (can_sign_extend_short_p(i0))
1632 SH(r0, i0, _ZERO_REGNO);
1633 else {
1634 reg = jit_get_reg(jit_class_gpr);
1635 movi(rn(reg), i0);
1636 str_s(rn(reg), r0);
1637 jit_unget_reg(reg);
1638 }
1639}
1640
1641static void
1642_sti_i(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
1643{
1644 jit_int32_t reg;
1645 if (can_sign_extend_short_p(i0))
1646 SW(r0, i0, _ZERO_REGNO);
1647 else {
1648 reg = jit_get_reg(jit_class_gpr);
1649 movi(rn(reg), i0);
1650 str_i(rn(reg), r0);
1651 jit_unget_reg(reg);
1652 }
1653}
1654
1655#if __WORDSIZE == 64
1656static void
1657_sti_l(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
1658{
1659 jit_int32_t reg;
1660 if (can_sign_extend_short_p(i0))
1661 SD(r0, i0, _ZERO_REGNO);
1662 else {
1663 reg = jit_get_reg(jit_class_gpr);
1664 movi(rn(reg), i0);
1665 str_l(rn(reg), r0);
1666 jit_unget_reg(reg);
1667 }
1668}
1669#endif
1670
1671static void
1672_stxr_c(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1673{
1674 jit_int32_t reg;
1675 reg = jit_get_reg(jit_class_gpr);
1676 addr(rn(reg), r0, r1);
1677 str_c(rn(reg), r2);
1678 jit_unget_reg(reg);
1679}
1680
1681static void
1682_stxi_c(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
1683{
1684 jit_int32_t reg;
1685 if (can_sign_extend_short_p(i0))
1686 SB(r1, i0, r0);
1687 else {
1688 reg = jit_get_reg(jit_class_gpr);
1689 addi(rn(reg), r0, i0);
1690 str_c(rn(reg), r1);
1691 jit_unget_reg(reg);
1692 }
1693}
1694
1695static void
1696_stxr_s(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1 ,jit_int32_t r2)
1697{
1698 jit_int32_t reg;
1699 reg = jit_get_reg(jit_class_gpr);
1700 addr(rn(reg), r0, r1);
1701 str_s(rn(reg), r2);
1702 jit_unget_reg(reg);
1703}
1704
1705static void
1706_stxi_s(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
1707{
1708 jit_int32_t reg;
1709 if (can_sign_extend_short_p(i0))
1710 SH(r1, i0, r0);
1711 else {
1712 reg = jit_get_reg(jit_class_gpr);
1713 addi(rn(reg), r0, i0);
1714 str_s(rn(reg), r1);
1715 jit_unget_reg(reg);
1716 }
1717}
1718
1719static void
1720_stxr_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1 ,jit_int32_t r2)
1721{
1722 jit_int32_t reg;
1723 reg = jit_get_reg(jit_class_gpr);
1724 addr(rn(reg), r0, r1);
1725 str_i(rn(reg), r2);
1726 jit_unget_reg(reg);
1727}
1728
1729static void
1730_stxi_i(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
1731{
1732 jit_int32_t reg;
1733 if (can_sign_extend_short_p(i0))
1734 SW(r1, i0, r0);
1735 else {
1736 reg = jit_get_reg(jit_class_gpr);
1737 addi(rn(reg), r0, i0);
1738 str_i(rn(reg), r1);
1739 jit_unget_reg(reg);
1740 }
1741}
1742
1743#if __WORDSIZE == 64
1744static void
1745_stxr_l(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1 ,jit_int32_t r2)
1746{
1747 jit_int32_t reg;
1748 reg = jit_get_reg(jit_class_gpr);
1749 addr(rn(reg), r0, r1);
1750 str_l(rn(reg), r2);
1751 jit_unget_reg(reg);
1752}
1753
1754static void
1755_stxi_l(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
1756{
1757 jit_int32_t reg;
1758 if (can_sign_extend_short_p(i0))
1759 SD(r1, i0, r0);
1760 else {
1761 reg = jit_get_reg(jit_class_gpr);
1762 addi(rn(reg), r0, i0);
1763 str_l(rn(reg), r1);
1764 jit_unget_reg(reg);
1765 }
1766}
1767#endif
1768
4a71579b 1769static void
40a44dcb 1770_bswapr_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
4a71579b 1771{
40a44dcb
PC
1772 if (jit_mips2_p()) {
1773 extr_us(r0, r1);
1774 WSBH(r0, r0);
1775 } else {
1776 generic_bswapr_us(_jit, r0, r1);
1777 }
4a71579b
PC
1778}
1779
1780static void
40a44dcb 1781_bswapr_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
4a71579b 1782{
40a44dcb
PC
1783 if (jit_mips2_p()) {
1784 if (__WORDSIZE == 64) {
1785 SLL(r0, r1, 0);
1786 WSBH(r0, r0);
1787 ROTR(r0, r0, 16);
1788 extr(r0, r0, 0, 32);
1789 } else {
1790 WSBH(r0, r1);
1791 ROTR(r0, r0, 16);
1792 }
1793 } else {
1794 generic_bswapr_ui(_jit, r0, r1);
1795 }
4a71579b 1796}
4a71579b
PC
1797
1798static void
1799_extr_c(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1800{
1801 if (jit_mips2_p())
1802 SEB(r0, r1);
1803 else {
1804 lshi(r0, r1, __WORDSIZE - 8);
1805 rshi(r0, r0, __WORDSIZE - 8);
1806 }
1807}
1808
1809static void
1810_extr_s(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1811{
1812 if (jit_mips2_p())
1813 SEH(r0, r1);
1814 else {
1815 lshi(r0, r1, __WORDSIZE - 16);
1816 rshi(r0, r0, __WORDSIZE - 16);
1817 }
1818}
1819
1820# if __WORDSIZE == 64
1821static void
1822_extr_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1823{
40a44dcb
PC
1824 if (jit_mips2_p())
1825 DEXT(r0, r1, 0, 32);
1826 else {
1827 lshi(r0, r1, 32);
1828 rshi_u(r0, r0, 32);
1829 }
4a71579b
PC
1830}
1831# endif
1832
1833static void
1834_lti(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1835{
1836 jit_int32_t reg;
1837
1838 if (can_sign_extend_short_p(i0))
1839 SLTI(r0, r1, i0);
1840 else {
1841 reg = jit_get_reg(jit_class_gpr);
1842 movi(rn(reg), i0);
1843 ltr(r0, r1, rn(reg));
1844 jit_unget_reg(reg);
1845 }
1846}
1847
1848static void
1849_lti_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1850{
1851 jit_int32_t reg;
1852
1853 if (can_sign_extend_short_p(i0))
1854 SLTIU(r0, r1, i0);
1855 else {
1856 reg = jit_get_reg(jit_class_gpr);
1857 movi(rn(reg), i0);
1858 ltr_u(r0, r1, rn(reg));
1859 jit_unget_reg(reg);
1860 }
1861}
1862
1863static void
1864_ler(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1865{
1866 SLT(r0, r2, r1);
1867 XORI(r0, r0, 1);
1868}
1869
1870static void
1871_lei(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1872{
1873 jit_int32_t reg;
1874
40a44dcb
PC
1875 if (can_sign_extend_short_p(i0 + 1))
1876 SLTI(r0, r1, i0 + 1);
4a71579b
PC
1877 else {
1878 reg = jit_get_reg(jit_class_gpr);
1879 movi(rn(reg), i0);
1880 ler(r0, r1, rn(reg));
1881 jit_unget_reg(reg);
1882 }
1883}
1884
1885static void
1886_ler_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1887{
1888 SLTU(r0, r2, r1);
1889 XORI(r0, r0, 1);
1890}
1891
1892static void
1893_lei_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1894{
1895 jit_int32_t reg;
1896
40a44dcb
PC
1897 if (can_sign_extend_short_p(i0 + 1))
1898 SLTIU(r0, r1, i0 + 1);
4a71579b
PC
1899 else {
1900 reg = jit_get_reg(jit_class_gpr);
1901 movi(rn(reg), i0);
1902 ler_u(r0, r1, rn(reg));
1903 jit_unget_reg(reg);
1904 }
1905}
1906
1907static void
1908_eqr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1909{
1910 subr(r0, r1, r2);
1911 SLTU(r0, _ZERO_REGNO, r0);
1912 XORI(r0, r0, 1);
1913}
1914
1915static void
1916_eqi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1917{
1918 if (i0) {
1919 subi(r0, r1, i0);
1920 SLTU(r0, _ZERO_REGNO, r0);
1921 }
1922 else
1923 SLTU(r0, _ZERO_REGNO, r1);
1924 XORI(r0, r0, 1);
1925}
1926
1927static void
1928_ger(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1929{
1930 SLT(r0, r1, r2);
1931 XORI(r0, r0, 1);
1932}
1933
1934static void
1935_gei(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1936{
1937 jit_int32_t reg;
1938
40a44dcb
PC
1939 if (can_sign_extend_short_p(i0)) {
1940 SLTI(r0, r1, i0);
1941 XORI(r0, r0, 1);
1942 } else {
1943 reg = jit_get_reg(jit_class_gpr);
1944 movi(rn(reg), i0);
1945 ger(r0, r1, rn(reg));
1946 jit_unget_reg(reg);
1947 }
4a71579b
PC
1948}
1949
1950static void
1951_ger_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1952{
1953 SLTU(r0, r1, r2);
1954 XORI(r0, r0, 1);
1955}
1956
1957static void
1958_gei_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1959{
1960 jit_int32_t reg;
1961
40a44dcb
PC
1962 if (can_sign_extend_short_p(i0)) {
1963 SLTIU(r0, r1, i0);
1964 XORI(r0, r0, 1);
1965 } else {
1966 reg = jit_get_reg(jit_class_gpr);
1967 movi(rn(reg), i0);
1968 ger_u(r0, r1, rn(reg));
1969 jit_unget_reg(reg);
1970 }
4a71579b
PC
1971}
1972
1973static void
1974_gti(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1975{
1976 jit_int32_t reg;
1977
1978 if (i0 == 0)
1979 SLT(r0, _ZERO_REGNO, r1);
1980 else {
1981 reg = jit_get_reg(jit_class_gpr);
1982 movi(rn(reg), i0);
1983 SLT(r0, rn(reg), r1);
1984 jit_unget_reg(reg);
1985 }
1986}
1987
1988static void
1989_gti_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1990{
1991 jit_int32_t reg;
1992
1993 if (i0 == 0)
1994 SLTU(r0, _ZERO_REGNO, r1);
1995 else {
1996 reg = jit_get_reg(jit_class_gpr);
1997 movi(rn(reg), i0);
1998 SLTU(r0, rn(reg), r1);
1999 jit_unget_reg(reg);
2000 }
2001}
2002
2003static void
2004_ner(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2005{
2006 subr(r0, r1, r2);
2007 SLTU(r0, _ZERO_REGNO, r0);
2008}
2009
2010static void
2011_nei(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2012{
2013 if (i0) {
2014 subi(r0, r1, i0);
2015 SLTU(r0, _ZERO_REGNO, r0);
2016 }
2017 else
2018 SLTU(r0, _ZERO_REGNO, r1);
2019}
2020
2021static jit_word_t
2022_bltr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2023{
2024 jit_word_t w;
2025 jit_int32_t reg;
2026
2027 reg = jit_get_reg(jit_class_gpr);
2028 SLT(rn(reg), r0, r1);
2029 w = _jit->pc.w;
2030 BNE(rn(reg), _ZERO_REGNO, ((i0 - w) >> 2) - 1);
2031 NOP(1);
2032 jit_unget_reg(reg);
2033
2034 return (w);
2035}
2036
2037static jit_word_t
2038_bltr_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2039{
2040 jit_word_t w;
2041 jit_int32_t reg;
2042
2043 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2044 SLTU(rn(reg), r0, r1);
2045 w = _jit->pc.w;
2046 BNE(rn(reg), _ZERO_REGNO, ((i0 - w) >> 2) - 1);
2047 NOP(1);
2048 jit_unget_reg(reg);
2049
2050 return (w);
2051}
2052
2053static jit_word_t
2054_blti(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
2055{
2056 jit_word_t w;
2057 jit_word_t d;
2058 jit_int32_t reg;
2059 jit_bool_t zero_p;
2060
2061 if (!(zero_p = i1 == 0))
2062 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2063 if (can_sign_extend_short_p(i1)) {
2064 if (!zero_p)
2065 SLTI(rn(reg), r0, i1);
2066 w = _jit->pc.w;
2067 d = ((i0 - w) >> 2) - 1;
2068 if (!zero_p)
2069 BNE(rn(reg), _ZERO_REGNO, d);
2070 else
2071 BLTZ(r0, d);
2072 NOP(1);
2073 }
2074 else {
2075 movi(rn(reg), i1);
2076 w = bltr(i0, r0, rn(reg));
2077 }
2078 if (!zero_p)
2079 jit_unget_reg(reg);
2080
2081 return (w);
2082}
2083
2084static jit_word_t
2085_blti_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
2086{
2087 jit_word_t w;
2088 jit_int32_t reg;
2089
2090 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2091 if (can_sign_extend_short_p(i1)) {
2092 SLTIU(rn(reg), r0, i1);
2093 w = _jit->pc.w;
2094 BNE(rn(reg), _ZERO_REGNO, ((i0 - w) >> 2) - 1);
2095 NOP(1);
2096 }
2097 else {
2098 movi(rn(reg), i1);
2099 w = bltr_u(i0, r0, rn(reg));
2100 }
2101 jit_unget_reg(reg);
2102
2103 return (w);
2104}
2105
2106static jit_word_t
2107_bler(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2108{
2109 jit_word_t w;
2110 jit_int32_t reg;
2111
2112 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2113 SLT(rn(reg), r1, r0);
2114 w = _jit->pc.w;
2115 BEQ(rn(reg), _ZERO_REGNO, ((i0 - w) >> 2) - 1);
2116 NOP(1);
2117 jit_unget_reg(reg);
2118
2119 return (w);
2120}
2121
2122static jit_word_t
2123_bler_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2124{
2125 jit_word_t w;
2126 jit_int32_t reg;
2127
2128 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2129 SLTU(rn(reg), r1, r0);
2130 w = _jit->pc.w;
2131 BEQ(rn(reg), _ZERO_REGNO, ((i0 - w) >> 2) - 1);
2132 NOP(1);
2133 jit_unget_reg(reg);
2134
2135 return (w);
2136}
2137
2138static jit_word_t
2139_blei(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
2140{
2141 jit_word_t w;
2142 jit_int32_t reg;
2143
2144 if (i1 == 0) {
2145 w = _jit->pc.w;
2146 BLEZ(r0, ((i0 - w) >> 2) - 1);
2147 NOP(1);
2148 }
2149 else {
2150 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2151 movi(rn(reg), i1);
2152 w = bler(i0, r0, rn(reg));
2153 jit_unget_reg(reg);
2154 }
2155
2156 return (w);
2157}
2158
2159static jit_word_t
2160_blei_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
2161{
2162 jit_word_t w;
2163 jit_int32_t reg;
2164
2165 if (i1 == 0) {
2166 w = _jit->pc.w;
2167 BEQ(r0, _ZERO_REGNO, ((i0 - w) >> 2) - 1);
2168 NOP(1);
2169 }
2170 else {
2171 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2172 movi(rn(reg), i1);
2173 w = bler_u(i0, r0, rn(reg));
2174 jit_unget_reg(reg);
2175 }
2176
2177 return (w);
2178}
2179
2180static jit_word_t
2181_beqr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2182{
2183 jit_word_t w;
2184
2185 w = _jit->pc.w;
2186 BEQ(r0, r1, ((i0 - w) >> 2) - 1);
2187 NOP(1);
2188
2189 return (w);
2190}
2191
2192static jit_word_t
2193_beqi(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
2194{
2195 jit_word_t w;
2196 jit_int32_t reg;
2197
2198 if (i1 == 0) {
2199 w = _jit->pc.w;
2200 BEQ(r0, _ZERO_REGNO, ((i0 - w) >> 2) - 1);
2201 NOP(1);
2202 }
2203 else {
2204 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2205 movi(rn(reg), i1);
2206 w = beqr(i0, r0, rn(reg));
2207 jit_unget_reg(reg);
2208 }
2209
2210 return (w);
2211}
2212
2213static jit_word_t
2214_bger(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2215{
2216 jit_word_t w;
2217 jit_int32_t reg;
2218
2219 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2220 SLT(rn(reg), r0, r1);
2221 w = _jit->pc.w;
2222 BEQ(rn(reg), _ZERO_REGNO, ((i0 - w) >> 2) - 1);
2223 NOP(1);
2224 jit_unget_reg(reg);
2225
2226 return (w);
2227}
2228
2229static jit_word_t
2230_bger_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2231{
2232 jit_word_t w;
2233 jit_int32_t reg;
2234
2235 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2236 SLTU(rn(reg), r0, r1);
2237 w = _jit->pc.w;
2238 BEQ(rn(reg), _ZERO_REGNO, ((i0 - w) >> 2) - 1);
2239 NOP(1);
2240 jit_unget_reg(reg);
2241
2242 return (w);
2243}
2244
2245static jit_word_t
2246_bgei(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
2247{
2248 jit_word_t w;
2249 jit_word_t d;
2250 jit_int32_t reg;
2251 jit_bool_t zero_p;
2252
2253 if (!(zero_p = i1 == 0))
2254 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2255 if (can_sign_extend_short_p(i1)) {
2256 if (!zero_p)
2257 SLTI(rn(reg), r0, i1);
2258 w = _jit->pc.w;
2259 d = ((i0 - w) >> 2) - 1;
2260 if (!zero_p)
2261 BEQ(rn(reg), _ZERO_REGNO, d);
2262 else
2263 BGEZ(r0, d);
2264 NOP(1);
2265 }
2266 else {
2267 movi(rn(reg), i1);
2268 w = bger(i0, r0, rn(reg));
2269 }
2270 if (!zero_p)
2271 jit_unget_reg(reg);
2272
2273 return (w);
2274}
2275
2276static jit_word_t
2277_bgei_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
2278{
2279 jit_word_t w;
2280 jit_int32_t reg;
2281
2282 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2283 if (can_sign_extend_short_p(i1)) {
2284 SLTIU(rn(reg), r0, i1);
2285 w = _jit->pc.w;
2286 BEQ(rn(reg), _ZERO_REGNO, ((i0 - w) >> 2) - 1);
2287 NOP(1);
2288 }
2289 else {
2290 movi(rn(reg), i1);
2291 w = bger_u(i0, r0, rn(reg));
2292 }
2293 jit_unget_reg(reg);
2294
2295 return (w);
2296}
2297
2298static jit_word_t
2299_bgtr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2300{
2301 jit_word_t w;
2302 jit_int32_t reg;
2303
2304 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2305 SLT(rn(reg), r1, r0);
2306 w = _jit->pc.w;
2307 BNE(rn(reg), _ZERO_REGNO, ((i0 - w) >> 2) - 1);
2308 NOP(1);
2309 jit_unget_reg(reg);
2310
2311 return (w);
2312}
2313
2314static jit_word_t
2315_bgtr_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2316{
2317 jit_word_t w;
2318 jit_int32_t reg;
2319
2320 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2321 SLTU(rn(reg), r1, r0);
2322 w = _jit->pc.w;
2323 BNE(rn(reg), _ZERO_REGNO, ((i0 - w) >> 2) - 1);
2324 NOP(1);
2325 jit_unget_reg(reg);
2326
2327 return (w);
2328}
2329
2330static jit_word_t
2331_bgti(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
2332{
2333 jit_word_t w;
2334 jit_int32_t reg;
2335
2336 if (i1 == 0) {
2337 w = _jit->pc.w;
2338 BGTZ(r0, ((i0 - w) >> 2) - 1);
2339 NOP(1);
2340 }
2341 else {
2342 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2343 movi(rn(reg), i1);
2344 w = bgtr(i0, r0, rn(reg));
2345 jit_unget_reg(reg);
2346 }
2347
2348 return (w);
2349}
2350
2351static jit_word_t
2352_bgti_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
2353{
2354 jit_word_t w;
2355 jit_int32_t reg;
2356
2357 if (i1 == 0) {
2358 w = _jit->pc.w;
2359 BNE(r0, _ZERO_REGNO, ((i0 - w) >> 2) - 1);
2360 NOP(1);
2361 }
2362 else {
2363 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2364 movi(rn(reg), i1);
2365 w = bgtr_u(i0, r0, rn(reg));
2366 jit_unget_reg(reg);
2367 }
2368
2369 return (w);
2370}
2371
2372static jit_word_t
2373_bner(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2374{
2375 jit_word_t w;
2376
2377 w = _jit->pc.w;
2378 BNE(r0, r1, ((i0 - w) >> 2) - 1);
2379 NOP(1);
2380
2381 return (w);
2382}
2383
2384static jit_word_t
2385_bnei(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
2386{
2387 jit_word_t w;
2388 jit_int32_t reg;
2389
2390 if (i1 == 0) {
2391 w = _jit->pc.w;
2392 BNE(r0, _ZERO_REGNO, ((i0 - w) >> 2) - 1);
2393 NOP(1);
2394 }
2395 else {
2396 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2397 movi(rn(reg), i1);
2398 w = bner(i0, r0, rn(reg));
2399 jit_unget_reg(reg);
2400 }
2401
2402 return (w);
2403}
2404
2405static void
2406_jmpr(jit_state_t *_jit, jit_int32_t r0)
2407{
2408 JR(r0);
2409 NOP(1);
2410}
2411
2412static jit_word_t
2413_jmpi(jit_state_t *_jit, jit_word_t i0)
2414{
2415 jit_word_t w;
2416 jit_int32_t reg;
2417
2418 w = _jit->pc.w;
2419 if (((w + sizeof(jit_int32_t)) & 0xf0000000) == (i0 & 0xf0000000)) {
2420 J((i0 & ~0xf0000000) >> 2);
2421 NOP(1);
2422 }
2423 else {
2424 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2425 movi_p(rn(reg), i0);
2426 jmpr(rn(reg));
2427 jit_unget_reg(reg);
2428 }
2429
2430 return (w);
2431}
2432
2433static jit_word_t
2434_boaddr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2435{
2436 jit_word_t w;
2437 jit_int32_t t0;
2438 jit_int32_t t1;
2439 jit_int32_t t2;
2440
2441 /* t1 = r0 + r1; overflow = r1 < 0 ? r0 < t1 : t1 < r0 */
2442 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2443 t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2444 t2 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2445 SLT(rn(t0), r1, _ZERO_REGNO); /* t0 = r1 < 0 */
2446 addr(rn(t1), r0, r1); /* t1 = r0 + r1 */
2447 SLT(rn(t2), rn(t1), r0); /* t2 = t1 < r0 */
2448 SLT(rn(t1), r0, rn(t1)); /* t1 = r0 < t1 */
2449 MOVZ(rn(t1), rn(t2), rn(t0)); /* if (r0 == 0) t1 = t2 */
2450 w = _jit->pc.w;
2451 BNE(rn(t1), _ZERO_REGNO, ((i0 - w) >> 2) - 1);
2452 /* delay slot */
2453 addr(r0, r0, r1);
2454 jit_unget_reg(t2);
2455 jit_unget_reg(t1);
2456 jit_unget_reg(t0);
2457
2458 return (w);
2459}
2460
2461static jit_word_t
2462_boaddi(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
2463{
2464 jit_word_t w;
2465 jit_int32_t t0;
2466 jit_int32_t t1;
2467 jit_int32_t t2;
2468
2469 if (can_sign_extend_short_p(i1)) {
2470 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2471 t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2472 t2 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2473 SLTI(rn(t0), _ZERO_REGNO, i1);
2474 addiu(rn(t1), r0, i1);
2475 SLT(rn(t2), r0, rn(t1));
2476 SLT(rn(t1), rn(t1), r0);
2477 MOVZ(rn(t1), rn(t2), rn(t0));
2478 w = _jit->pc.w;
2479 BNE(rn(t1), _ZERO_REGNO, ((i0 - w) >> 2) - 1);
2480 /* delay slot */
2481 addiu(r0, r0, i1);
2482 jit_unget_reg(t2);
2483 jit_unget_reg(t1);
2484 jit_unget_reg(t0);
2485 }
2486 else {
2487 t0 = jit_get_reg(jit_class_gpr);
2488 movi(rn(t0), i1);
2489 w = boaddr(i0, r0, rn(t0));
2490 jit_unget_reg(t0);
2491 }
2492 return (w);
2493}
2494
2495static jit_word_t
2496_boaddr_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2497{
2498 jit_word_t w;
2499 jit_int32_t t0;
2500 jit_int32_t t1;
2501
2502 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2503 t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2504 addr(rn(t0), r0, r1);
2505 SLTU(rn(t1), rn(t0), r0);
2506 w = _jit->pc.w;
2507 BNE(_ZERO_REGNO, rn(t1), ((i0 - w) >> 2) - 1);
2508 /* delay slot */
2509 movr(r0, rn(t0));
2510 jit_unget_reg(t1);
2511 jit_unget_reg(t0);
2512 return (w);
2513}
2514
2515static jit_word_t
2516_boaddi_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
2517{
2518 jit_word_t w;
2519 jit_int32_t t0;
2520 jit_int32_t t1;
2521
2522 if (can_sign_extend_short_p(i0)) {
2523 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2524 t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2525 addiu(rn(t0), r0, i1);
2526 SLTU(rn(t1), rn(t0), r0);
2527 w = _jit->pc.w;
2528 BNE(_ZERO_REGNO, rn(t1), ((i0 - w) >> 2) - 1);
2529 /* delay slot */
2530 movr(r0, rn(t0));
2531 jit_unget_reg(t1);
2532 jit_unget_reg(t0);
2533 }
2534 else {
2535 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2536 movi(rn(t0), i1);
2537 w = boaddr_u(i0, r0, rn(t0));
2538 jit_unget_reg(t0);
2539 }
2540 return (w);
2541}
2542
2543static jit_word_t
2544_bxaddr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2545{
2546 jit_word_t w;
2547 jit_int32_t t0;
2548 jit_int32_t t1;
2549 jit_int32_t t2;
2550
2551 /* t1 = r0 + r1; overflow = r1 < 0 ? r0 < t1 : t1 < r0 */
2552 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2553 t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2554 t2 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2555 SLT(rn(t0), r1, _ZERO_REGNO); /* t0 = r1 < 0 */
2556 addr(rn(t1), r0, r1); /* t1 = r0 + r1 */
2557 SLT(rn(t2), rn(t1), r0); /* t2 = t1 < r0 */
2558 SLT(rn(t1), r0, rn(t1)); /* t1 = r0 < t1 */
2559 MOVZ(rn(t1), rn(t2), rn(t0)); /* if (r0 == 0) t1 = t2 */
2560 w = _jit->pc.w;
2561 BEQ(rn(t1), _ZERO_REGNO, ((i0 - w) >> 2) - 1);
2562 /* delay slot */
2563 addr(r0, r0, r1);
2564 jit_unget_reg(t2);
2565 jit_unget_reg(t1);
2566 jit_unget_reg(t0);
2567
2568 return (w);
2569}
2570
2571static jit_word_t
2572_bxaddi(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
2573{
2574 jit_word_t w;
2575 jit_int32_t t0;
2576 jit_int32_t t1;
2577 jit_int32_t t2;
2578
2579 if (can_sign_extend_short_p(i1)) {
2580 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2581 t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2582 t2 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2583 SLTI(rn(t0), _ZERO_REGNO, i1);
2584 addiu(rn(t1), r0, i1);
2585 SLT(rn(t2), r0, rn(t1));
2586 SLT(rn(t1), rn(t1), r0);
2587 MOVZ(rn(t1), rn(t2), rn(t0));
2588 w = _jit->pc.w;
2589 BEQ(rn(t1), _ZERO_REGNO, ((i0 - w) >> 2) - 1);
2590 /* delay slot */
2591 addiu(r0, r0, i1);
2592 jit_unget_reg(t2);
2593 jit_unget_reg(t1);
2594 jit_unget_reg(t0);
2595 }
2596 else {
2597 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2598 movi(rn(t0), i1);
2599 w = bxaddr(i0, r0, rn(t0));
2600 jit_unget_reg(t0);
2601 }
2602 return (w);
2603}
2604
2605static jit_word_t
2606_bxaddr_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2607{
2608 jit_word_t w;
2609 jit_int32_t t0;
2610 jit_int32_t t1;
2611
2612 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2613 t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2614 addr(rn(t0), r0, r1);
2615 SLTU(rn(t1), rn(t0), r0);
2616 w = _jit->pc.w;
2617 BEQ(_ZERO_REGNO, rn(t1), ((i0 - w) >> 2) - 1);
2618 /* delay slot */
2619 movr(r0, rn(t0));
2620 jit_unget_reg(t1);
2621 jit_unget_reg(t0);
2622 return (w);
2623}
2624
2625static jit_word_t
2626_bxaddi_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
2627{
2628 jit_word_t w;
2629 jit_int32_t t0;
2630 jit_int32_t t1;
2631
2632 if (can_sign_extend_short_p(i0)) {
2633 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2634 t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2635 addiu(rn(t0), r0, i1);
2636 SLTU(rn(t1), rn(t0), r0);
2637 w = _jit->pc.w;
2638 BEQ(_ZERO_REGNO, rn(t1), ((i0 - w) >> 2) - 1);
2639 /* delay slot */
2640 movr(r0, rn(t0));
2641 jit_unget_reg(t1);
2642 jit_unget_reg(t0);
2643 }
2644 else {
2645 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2646 movi(rn(t0), i1);
2647 w = bxaddr_u(i0, r0, rn(t0));
2648 jit_unget_reg(t0);
2649 }
2650 return (w);
2651}
2652
2653static jit_word_t
2654_bosubr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2655{
2656 jit_word_t w;
2657 jit_int32_t t0;
2658 jit_int32_t t1;
2659 jit_int32_t t2;
2660
2661 /* t1 = r0 - r1; overflow = 0 < r1 ? r0 < t1 : t1 < r0 */
2662 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2663 t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2664 t2 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2665 SLT(rn(t0), _ZERO_REGNO, r1); /* t0 = 0 < r1 */
2666 subr(rn(t1), r0, r1); /* t1 = r0 - r1 */
2667 SLT(rn(t2), rn(t1), r0); /* t2 = t1 < r0 */
2668 SLT(rn(t1), r0, rn(t1)); /* t1 = r0 < t1 */
2669 MOVZ(rn(t1), rn(t2), rn(t0)); /* if (r0 == 0) t1 = t2 */
2670 w = _jit->pc.w;
2671 BNE(rn(t1), _ZERO_REGNO, ((i0 - w) >> 2) - 1);
2672 /* delay slot */
2673 subr(r0, r0, r1);
2674 jit_unget_reg(t2);
2675 jit_unget_reg(t1);
2676 jit_unget_reg(t0);
2677
2678 return (w);
2679}
2680
2681static jit_word_t
2682_bosubi(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
2683{
2684 jit_word_t w;
2685 jit_int32_t t0;
2686 jit_int32_t t1;
2687 jit_int32_t t2;
2688
2689 if (can_sign_extend_short_p(i1) && (i1 & 0xffff) != 0x8000) {
2690 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2691 t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2692 t2 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2693 SLTI(rn(t0), _ZERO_REGNO, i1);
2694 addiu(rn(t1), r0, -i1);
2695 SLT(rn(t2), rn(t1), r0);
2696 SLT(rn(t1), r0, rn(t1));
2697 MOVZ(rn(t1), rn(t2), rn(t0));
2698 w = _jit->pc.w;
2699 BNE(rn(t1), _ZERO_REGNO, ((i0 - w) >> 2) - 1);
2700 /* delay slot */
2701 addiu(r0, r0, -i1);
2702 jit_unget_reg(t2);
2703 jit_unget_reg(t1);
2704 jit_unget_reg(t0);
2705 }
2706 else {
2707 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2708 movi(rn(t0), i1);
2709 w = bosubr(i0, r0, rn(t0));
2710 jit_unget_reg(t0);
2711 }
2712 return (w);
2713}
2714
2715static jit_word_t
2716_bosubr_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2717{
2718 jit_word_t w;
2719 jit_int32_t t0;
2720 jit_int32_t t1;
2721
2722 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2723 t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2724 subr(rn(t0), r0, r1);
2725 SLTU(rn(t1), r0, rn(t0));
2726 w = _jit->pc.w;
2727 BNE(_ZERO_REGNO, rn(t1), ((i0 - w) >> 2) - 1);
2728 /* delay slot */
2729 movr(r0, rn(t0));
2730 jit_unget_reg(t1);
2731 jit_unget_reg(t0);
2732 return (w);
2733}
2734
2735static jit_word_t
2736_bosubi_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
2737{
2738 jit_word_t w;
2739 jit_int32_t t0;
2740 jit_int32_t t1;
2741
2742 if (can_sign_extend_short_p(i0) && (i0 & 0xffff) != 0x8000) {
2743 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2744 t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2745 addiu(rn(t0), r0, -i1);
2746 SLTU(rn(t1), r0, rn(t0));
2747 w = _jit->pc.w;
2748 BNE(_ZERO_REGNO, rn(t1), ((i0 - w) >> 2) - 1);
2749 /* delay slot */
2750 movr(r0, rn(t0));
2751 jit_unget_reg(t1);
2752 jit_unget_reg(t0);
2753 }
2754 else {
2755 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2756 movi(rn(t0), i1);
2757 w = bosubr_u(i0, r0, rn(t0));
2758 jit_unget_reg(t0);
2759 }
2760 return (w);
2761}
2762
2763static jit_word_t
2764_bxsubr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2765{
2766 jit_word_t w;
2767 jit_int32_t t0;
2768 jit_int32_t t1;
2769 jit_int32_t t2;
2770
2771 /* t1 = r0 - r1; overflow = 0 < r1 ? r0 < t1 : t1 < r0 */
2772 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2773 t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2774 t2 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2775 SLT(rn(t0), _ZERO_REGNO, r1); /* t0 = 0 < r1 */
2776 subr(rn(t1), r0, r1); /* t1 = r0 - r1 */
2777 SLT(rn(t2), rn(t1), r0); /* t2 = t1 < r0 */
2778 SLT(rn(t1), r0, rn(t1)); /* t1 = r0 < t1 */
2779 MOVZ(rn(t1), rn(t2), rn(t0)); /* if (t0 == 0) t1 = t2 */
2780 w = _jit->pc.w;
2781 BEQ(rn(t1), _ZERO_REGNO, ((i0 - w) >> 2) - 1);
2782 /* delay slot */
2783 subr(r0, r0, r1);
2784 jit_unget_reg(t2);
2785 jit_unget_reg(t1);
2786 jit_unget_reg(t0);
2787
2788 return (w);
2789}
2790
2791static jit_word_t
2792_bxsubi(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
2793{
2794 jit_word_t w;
2795 jit_int32_t t0;
2796 jit_int32_t t1;
2797 jit_int32_t t2;
2798
2799 if (can_sign_extend_short_p(i1) && (i1 & 0xffff) != 0x8000) {
2800 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2801 t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2802 t2 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2803 SLTI(rn(t0), _ZERO_REGNO, i1);
2804 addiu(rn(t1), r0, -i1);
2805 SLT(rn(t2), rn(t1), r0);
2806 SLT(rn(t1), r0, rn(t1));
2807 MOVZ(rn(t1), rn(t2), rn(t0));
2808 w = _jit->pc.w;
2809 BEQ(rn(t1), _ZERO_REGNO, ((i0 - w) >> 2) - 1);
2810 /* delay slot */
2811 addiu(r0, r0, -i1);
2812 jit_unget_reg(t2);
2813 jit_unget_reg(t1);
2814 jit_unget_reg(t0);
2815 }
2816 else {
2817 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2818 movi(rn(t0), i1);
2819 w = bxsubr(i0, r0, rn(t0));
2820 jit_unget_reg(t0);
2821 }
2822 return (w);
2823}
2824
2825static jit_word_t
2826_bxsubr_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2827{
2828 jit_word_t w;
2829 jit_int32_t t0;
2830 jit_int32_t t1;
2831
2832 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2833 t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2834 subr(rn(t0), r0, r1);
2835 SLTU(rn(t1), r0, rn(t0));
2836 w = _jit->pc.w;
2837 BEQ(_ZERO_REGNO, rn(t1), ((i0 - w) >> 2) - 1);
2838 /* delay slot */
2839 movr(r0, rn(t0));
2840 jit_unget_reg(t1);
2841 jit_unget_reg(t0);
2842 return (w);
2843}
2844
2845static jit_word_t
2846_bxsubi_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
2847{
2848 jit_word_t w;
2849 jit_int32_t t0;
2850 jit_int32_t t1;
2851
2852 if (can_sign_extend_short_p(i0) && (i0 & 0xffff) != 0x8000) {
2853 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2854 t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2855 addiu(rn(t0), r0, -i1);
2856 SLTU(rn(t1), r0, rn(t0));
2857 w = _jit->pc.w;
2858 BEQ(_ZERO_REGNO, rn(t1), ((i0 - w) >> 2) - 1);
2859 /* delay slot */
2860 movr(r0, rn(t0));
2861 jit_unget_reg(t1);
2862 jit_unget_reg(t0);
2863 }
2864 else {
2865 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2866 movi(rn(t0), i1);
2867 w = bxsubr_u(i0, r0, rn(t0));
2868 jit_unget_reg(t0);
2869 }
2870 return (w);
2871}
2872
2873static jit_word_t
2874_bmsr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2875{
2876 jit_word_t w;
2877 jit_int32_t t0;
2878 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2879 AND(rn(t0), r0, r1);
2880 w = _jit->pc.w;
2881 BNE(_ZERO_REGNO, rn(t0), ((i0 - w) >> 2) - 1);
2882 NOP(1);
2883 jit_unget_reg(t0);
2884 return (w);
2885}
2886
2887static jit_word_t
2888_bmsi(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
2889{
2890 jit_word_t w;
2891 jit_int32_t t0;
2892 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
40a44dcb
PC
2893
2894 andi(rn(t0), r0, i1);
2895 w = _jit->pc.w;
2896 BNE(_ZERO_REGNO, rn(t0), ((i0 - w) >> 2) - 1);
2897 NOP(1);
2898
4a71579b
PC
2899 jit_unget_reg(t0);
2900 return (w);
2901}
2902
2903static jit_word_t
2904_bmcr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2905{
2906 jit_word_t w;
2907 jit_int32_t t0;
2908 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2909 AND(rn(t0), r0, r1);
2910 w = _jit->pc.w;
2911 BEQ(_ZERO_REGNO, rn(t0), ((i0 - w) >> 2) - 1);
2912 NOP(1);
2913 jit_unget_reg(t0);
2914 return (w);
2915}
2916
2917static jit_word_t
2918_bmci(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
2919{
2920 jit_word_t w;
2921 jit_int32_t t0;
2922 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
40a44dcb
PC
2923
2924 andi(rn(t0), r0, i1);
2925 w = _jit->pc.w;
2926 BEQ(_ZERO_REGNO, rn(t0), ((i0 - w) >> 2) - 1);
2927 NOP(1);
2928
4a71579b
PC
2929 jit_unget_reg(t0);
2930 return (w);
2931}
2932
2933static void
2934_callr(jit_state_t *_jit, jit_int32_t r0)
2935{
519a9ea1 2936 JALR(r0);
4a71579b
PC
2937 if (r0 != _T9_REGNO)
2938 movr(_T9_REGNO, r0);
519a9ea1
PC
2939 else
2940 NOP(1);
4a71579b
PC
2941}
2942
2943static void
2944_calli(jit_state_t *_jit, jit_word_t i0)
2945{
ba3814c1
PC
2946 if (((_jit->pc.w + sizeof(jit_int32_t)) & 0xf0000000) == (i0 & 0xf0000000)) {
2947 if (can_sign_extend_short_p(i0)) {
2948 JAL((i0 & ~0xf0000000) >> 2);
2949 addiu(_T9_REGNO, _ZERO_REGNO, i0);
2950 return;
2951 }
2952
2953 if (can_zero_extend_short_p(i0)) {
2954 JAL((i0 & ~0xf0000000) >> 2);
2955 ORI(_T9_REGNO, _ZERO_REGNO, i0);
2956 return;
2957 }
2958
2959 if (can_sign_extend_int_p(i0)) {
2960 if (i0 & 0xffff) {
2961 LUI(_T9_REGNO, i0 >> 16);
2962 JAL((i0 & ~0xf0000000) >> 2);
2963 ORI(_T9_REGNO, _T9_REGNO, i0);
2964 } else {
2965 JAL((i0 & ~0xf0000000) >> 2);
2966 LUI(_T9_REGNO, i0 >> 16);
2967 }
2968 return;
2969 }
2970 }
2971
4a71579b
PC
2972 movi(_T9_REGNO, i0);
2973 JALR(_T9_REGNO);
2974 NOP(1);
2975}
2976
2977static jit_word_t
2978_calli_p(jit_state_t *_jit, jit_word_t i0)
2979{
2980 jit_word_t word;
2981
2982 word = _jit->pc.w;
2983 movi_p(_T9_REGNO, i0);
2984 JALR(_T9_REGNO);
2985 NOP(1);
2986
2987 return (word);
2988}
2989
2990static jit_int32_t fregs[] = {
2991 _F30, _F28, _F26, _F24, _F22, _F20,
2992#if !NEW_ABI
2993 _F18, _F16,
2994#endif
2995};
2996
2997static jit_int32_t iregs[] = {
2998 _S7, _S6, _S5, _S4, _S3, _S2, _S1, _S0,
2999};
3000
3001static void
3002_prolog(jit_state_t *_jit, jit_node_t *node)
3003{
3004 jit_int32_t index;
3005 jit_int32_t offset;
3006 if (_jitc->function->define_frame || _jitc->function->assume_frame) {
3007 jit_int32_t frame = -_jitc->function->frame;
3008 assert(_jitc->function->self.aoff >= frame);
3009 if (_jitc->function->assume_frame)
3010 return;
3011 _jitc->function->self.aoff = frame;
3012 }
3013 if (_jitc->function->allocar)
3014 _jitc->function->self.aoff &= -8;
3015#if NEW_ABI
3016 _jitc->function->stack = ((_jitc->function->self.alen -
3017 /* align stack at 16 bytes */
3018 _jitc->function->self.aoff) + 15) & -16;
3019#else
3020 _jitc->function->stack = ((/* first 16 bytes must be allocated */
3021 (_jitc->function->self.alen > 16 ?
3022 _jitc->function->self.alen : 16) -
3023 /* align stack at 8 bytes */
3024 _jitc->function->self.aoff) + 7) & -8;
3025#endif
3026 /* callee save registers */
3027#if NEW_ABI
3028 if ((_jitc->function->self.call & jit_call_varargs) &&
3029 jit_arg_reg_p(_jitc->function->vagp))
3030 subi(_SP_REGNO, _SP_REGNO, stack_framesize + 64);
3031 else
3032#endif
3033 subi(_SP_REGNO, _SP_REGNO, stack_framesize);
3034 offset = stack_framesize - (sizeof(jit_word_t) << 1);
3035 for (index = 0; index < jit_size(fregs); index++, offset -= 8) {
3036 if (jit_regset_tstbit(&_jitc->function->regset, fregs[index]))
3037 stxi_d(offset, _SP_REGNO, rn(fregs[index]));
3038 }
3039 for (index = 0; index < jit_size(iregs);
3040 index++, offset -= sizeof(jit_word_t)) {
3041 if (jit_regset_tstbit(&_jitc->function->regset, iregs[index]))
3042 stxi(offset, _SP_REGNO, rn(iregs[index]));
3043 }
3044 assert(offset >= sizeof(jit_word_t));
3045 stxi(offset, _SP_REGNO, _RA_REGNO);
3046 stxi(0, _SP_REGNO, _BP_REGNO);
3047 movr(_BP_REGNO, _SP_REGNO);
3048
3049 /* alloca */
3050 if (_jitc->function->stack)
3051 subi(_SP_REGNO, _SP_REGNO, _jitc->function->stack);
3052 if (_jitc->function->allocar) {
3053 index = jit_get_reg(jit_class_gpr);
3054 movi(rn(index), _jitc->function->self.aoff);
3055 stxi_i(_jitc->function->aoffoff, _BP_REGNO, rn(index));
3056 jit_unget_reg(index);
3057 }
3058
3059 if (_jitc->function->self.call & jit_call_varargs) {
3060#if NEW_ABI
3061 index = _jitc->function->vagp;
3062#else
3063 index = (_jitc->function->self.size - stack_framesize) >> STACK_SHIFT;
3064#endif
3065 offset = stack_framesize + index * STACK_SLOT;
3066 for (; jit_arg_reg_p(index); ++index, offset += STACK_SLOT) {
3067#if NEW_ABI
3068 SD(rn(_A0 - index), offset, _BP_REGNO);
3069#else
3070 stxi(offset + WORD_ADJUST, _BP_REGNO, rn(_A0 - index));
3071#endif
3072 }
3073 }
3074}
3075
3076static void
3077_epilog(jit_state_t *_jit, jit_node_t *node)
3078{
3079 jit_int32_t index;
3080 jit_int32_t offset;
3081 if (_jitc->function->assume_frame)
3082 return;
3083 /* callee save registers */
3084 movr(_SP_REGNO, _BP_REGNO);
3085 offset = stack_framesize - (sizeof(jit_word_t) << 1);
3086 for (index = 0; index < jit_size(fregs); index++, offset -= 8) {
3087 if (jit_regset_tstbit(&_jitc->function->regset, fregs[index]))
3088 ldxi_d(rn(fregs[index]), _SP_REGNO, offset);
3089 }
3090 for (index = 0; index < jit_size(iregs);
3091 index++, offset -= sizeof(jit_word_t)) {
3092 if (jit_regset_tstbit(&_jitc->function->regset, iregs[index]))
3093 ldxi(rn(iregs[index]), _SP_REGNO, offset);
3094 }
3095 assert(offset >= sizeof(jit_word_t));
3096 ldxi(_RA_REGNO, _SP_REGNO, offset);
3097 ldxi(_BP_REGNO, _SP_REGNO, 0);
3098 JR(_RA_REGNO);
3099 /* delay slot */
3100#if NEW_ABI
3101 if ((_jitc->function->self.call & jit_call_varargs) &&
3102 jit_arg_reg_p(_jitc->function->vagp))
3103 addi(_SP_REGNO, _SP_REGNO, stack_framesize + 64);
3104 else
3105#endif
3106 addi(_SP_REGNO, _SP_REGNO, stack_framesize);
3107}
3108
3109static void
3110_vastart(jit_state_t *_jit, jit_int32_t r0)
3111{
3112 assert(_jitc->function->self.call & jit_call_varargs);
3113 /* Initialize va_list to the first stack argument. */
3114#if NEW_ABI
3115 if (jit_arg_reg_p(_jitc->function->vagp))
3116 addi(r0, _BP_REGNO, stack_framesize + _jitc->function->vagp *
3117 sizeof(jit_int64_t));
3118 else
3119#endif
3120 addi(r0, _BP_REGNO, _jitc->function->self.size);
3121}
3122
3123static void
3124_vaarg(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
3125{
3126 /* Load argument. */
3127#if WORD_ADJUST
3128 ldxi(r0, r1, WORD_ADJUST);
3129#else
3130 ldr(r0, r1);
3131#endif
3132
3133 /* Update va_list. */
3134 addi(r1, r1, STACK_SLOT);
3135}
3136
3137static void
3138_patch_abs(jit_state_t *_jit, jit_word_t instr, jit_word_t label)
3139{
3140 jit_instr_t i;
3141 union {
3142 jit_int32_t *i;
3143 jit_word_t w;
3144 } u;
3145
3146 u.w = instr;
3147#if __WORDSIZE == 32
3148 i.op = u.i[0];
3149 assert(i.hc.b == MIPS_LUI);
3150 i.is.b = label >> 16;
3151 u.i[0] = i.op;
3152 i.op = u.i[1];
3153 assert(i.hc.b == MIPS_ORI);
3154 i.is.b = label;
3155 u.i[1] = i.op;
3156#else
3157 i.op = u.i[0];
3158 assert(i.hc.b == MIPS_LUI);
3159 i.is.b = label >> 48;
3160 u.i[0] = i.op;
3161 i.op = u.i[1];
3162 assert(i.hc.b == MIPS_ORI);
3163 i.is.b = label >> 32;
3164 u.i[1] = i.op;
3165 /* lshi */
3166 i.op = u.i[3];
3167 assert(i.hc.b == MIPS_ORI);
3168 i.is.b = label >> 16;
3169 u.i[3] = i.op;
3170 /* lshi */
3171 i.op = u.i[5];
3172 assert(i.hc.b == MIPS_ORI);
3173 i.is.b = label;
3174 u.i[5] = i.op;
3175#endif
3176}
3177
3178static void
3179_patch_at(jit_state_t *_jit, jit_word_t instr, jit_word_t label)
3180{
3181 jit_instr_t i;
3182 union {
3183 jit_int32_t *i;
3184 jit_word_t w;
3185 } u;
3186
3187 u.w = instr;
3188 i.op = u.i[0];
3189 switch (i.hc.b) {
3190 /* 16 bit immediate opcodes */
3191 case MIPS_REGIMM:
3192 switch (i.rt.b) {
3193 case MIPS_BLTZ: case MIPS_BLTZL:
3194 case MIPS_BLTZAL: case MIPS_BLTZALL:
3195 case MIPS_BGEZ: case MIPS_BGEZAL:
3196 case MIPS_BGEZALL: case MIPS_BGEZL:
3197 case MIPS_TEQI: case MIPS_TGEI:
3198 case MIPS_TGEIU: case MIPS_TLTI:
3199 case MIPS_TLTIU: case MIPS_TNEI:
3200 i.is.b = ((label - instr) >> 2) - 1;
3201 u.i[0] = i.op;
3202 break;
3203 default:
3204 assert(!"unhandled branch opcode");
3205 break;
3206 }
3207 break;
3208
3209 case MIPS_COP1: case MIPS_COP2:
3210 assert(i.rs.b == MIPS_BC);
3211 switch (i.rt.b) {
3212 case MIPS_BCF: case MIPS_BCFL:
3213 case MIPS_BCT: case MIPS_BCTL:
3214 i.is.b = ((label - instr) >> 2) - 1;
3215 u.i[0] = i.op;
3216 break;
3217 default:
3218 assert(!"unhandled branch opcode");
3219 break;
3220 }
3221 break;
3222
3223 case MIPS_BLEZ: case MIPS_BLEZL:
3224 case MIPS_BEQ: case MIPS_BEQL:
3225 case MIPS_BGTZ: case MIPS_BGTZL:
3226 case MIPS_BNE: case MIPS_BNEL:
3227 i.is.b = ((label - instr) >> 2) - 1;
3228 u.i[0] = i.op;
3229 break;
3230
3231 case MIPS_LUI:
3232 patch_abs(instr, label);
3233 break;
3234
3235 case MIPS_J: case MIPS_JAL:
3236 case MIPS_JALX:
3237 assert(((instr + sizeof(jit_int32_t)) & 0xf0000000) ==
3238 (label & 0xf0000000));
3239 i.ii.b = (label & ~0xf0000000) >> 2;
3240 u.i[0] = i.op;
3241 break;
3242
3243 default:
3244 assert(!"unhandled branch opcode");
3245 break;
3246 }
3247}
3248#endif