1 /*
2  * Copyright (C) 2014-2019  Free Software Foundation, Inc.
3  *
4  * This file is part of GNU lightning.
5  *
6  * GNU lightning is free software; you can redistribute it and/or modify it
7  * under the terms of the GNU Lesser General Public License as published
8  * by the Free Software Foundation; either version 3, or (at your option)
9  * any later version.
10  *
11  * GNU lightning is distributed in the hope that it will be useful, but
12  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
14  * License for more details.
15  *
16  * Authors:
17  *	Paulo Cesar Pereira de Andrade
18  */
19 
20 #if PROTO
21 #  define _u2(v)			((v) & 0x3)
22 #  define _s2_p(v)			((v) >= -0x2 && (v) <= 0x1)
23 #  define _u2_p(v)			((v) >= 0 && (v) <= 0x3)
24 #  define _u5(v)			((v) & 0x1f)
25 #  define _s5_p(v)			((v) >= -0x10 && (v) <= 0xf)
26 #  define _u5_p(v)			((v) >= 0 && (v) <= 0x1f)
27 #  define _u6(v)			((v) & 0x3f)
28 #  define _s6_p(v)			((v) >= -0x20 && (v) <= 0x1f)
29 #  define _u6_p(v)			((v) >= 0 && (v) <= 0x3f)
30 #  define _u7(v)			((v) & 0x7f)
31 #  define _s7_p(v)			((v) >= -0x40 && (v) <= 0x3f)
32 #  define _u7_p(v)			((v) >= 0 && (v) <= 0x7f)
33 #  define _u8(v)			((v) & 0xff)
34 #  define _s8_p(v)			((v) >= -0x80 && (v) <= 0x7f)
35 #  define _u8_p(v)			((v) >= 0 && (v) <= 0xff)
36 #  define _u11(v)			((v) & 0x7ff)
37 #  define _s11_p(v)			((v) >= -0x400 && (v) <= 0x3ff)
38 #  define _u11_p(v)			((v) >= 0 && (v) <= 0x7ff)
39 #  define _u14(v)			((v) & 0x3fff)
40 #  define _s14_p(v)			((v) >= -0x2000 && (v) <= 0x1fff)
41 #  define _u14_p(v)			((v) >= 0 && (v) <= 0x3fff)
42 #  define _u16(v)			((v) & 0xffff)
43 #  define _s16_p(v)			((v) >= -0x8000 && (v) <= 0x7fff)
44 #  define _u16_p(v)			((v) >= 0 && (v) <= 0xffff)
45 #  define _u21(v)			((v) & 0x1fffff)
46 #  define _s21_p(v)			((v) >= -0x100000 && (v) <= 0xfffff)
47 #  define _u21_p(v)			((v) >= 0 && (v) <= 0x1fffff)
48 #  define _u26(v)			((v) & 0x3ffffff)
49 #  define _s26_p(v)			((v) >= -0x2000000 && (v) <= 0x1ffffff)
50 #  define _u26_p(v)			((v) >= 0 && (v) <= 0x3ffffff)
51 #  define _u32(v)			((v) & 0xffffffff)
52 #  define _s32_p(v)			((v) >= -0x80000000 && (v) <= 0x7fffffff)
53 #  define _u32_p(v)			((v) >= 0 && (v) <= 0xffffffff)
54 #  define ii(i)				*_jit->pc.ui++ = i
55 #  define stack_framesize		224
56 #  define _S0_REGNO			0x09
57 #  define _S1_REGNO			0x0a
58 #  define _S2_REGNO			0x0b
59 #  define _S3_REGNO			0x0c
60 #  define _S4_REGNO			0x0d
61 #  define _S5_REGNO			0x0e
62 #  define _FP_REGNO			0x0f
63 #  define _A0_REGNO			0x10
64 #  define _A1_REGNO			0x11
65 #  define _A2_REGNO			0x12
66 #  define _V0_REGNO			0x00
67 #  define _T0_REGNO			0x01
68 #  define _T1_REGNO			0x02
69 #  define _RA_REGNO			0x1a
70 #  define _PV_REGNO			0x1b
71 #  define _GP_REGNO			0x1d
72 #  define _SP_REGNO			0x1e
73 #  define _R31_REGNO			0x1f
74 #  define Pcd(o,n)			_Pcd(_jit,o,n)
75 static void _Pcd(jit_state_t*,int,unsigned int) maybe_unused;
76 #  define Bra(o,ra,d)			_Bra(_jit,o,ra,d)
77 static void _Bra(jit_state_t*,int,int,int);
78 #  define Mem(o,ra,rb,d)			_Mem(_jit,o,ra,rb,d)
79 static void _Mem(jit_state_t*,int,int,int,unsigned int);
80 #  define Mbr(o,ra,rb,h,d)		_Mbr(_jit,o,ra,rb,h,d)
81 static void _Mbr(jit_state_t*,int,int,int,int,int);
82 #  define Opr(o,ra,rb,f,rc)		_Opr(_jit,o,ra,rb,f,rc)
83 static void _Opr(jit_state_t*,int,int,int,unsigned int,int);
84 #  define Opi(o,ra,i,f,rc)		_Opi(_jit,o,ra,i,f,rc)
85 static void _Opi(jit_state_t*,int,int,unsigned int,unsigned int,int);
86 #  define ADDL(ra,rb,rc)		Opr(0x10,ra,rb,0x00,rc)
87 #  define ADDLi(ra,im,rc)		Opi(0x10,ra,im,0x00,rc)
88 #  define ADDL_V(ra,rb,rc)		Opr(0x10,ra,rb,0x40,rc)
89 #  define ADDL_Vi(ra,im,rc)		Opi(0x10,ra,im,0x40,rc)
90 #  define ADDQ(ra,rb,rc)		Opr(0x10,ra,rb,0x20,rc)
91 #  define ADDQi(ra,im,rc)		Opi(0x10,ra,im,0x20,rc)
92 #  define ADDQ_V(ra,rb,rc)		Opr(0x10,ra,rb,0x60,rc)
93 #  define ADDQ_Vi(ra,im,rc)		Opi(0x10,ra,im,0x60,rc)
94 #  define AMASK(rb,rc)			Opr(0x11,_R31_REGNO,rb,0x61,rc)
95 #  define AND(ra,rb,rc)			Opr(0x11,ra,rb,0x00,rc)
96 #  define ANDi(ra,im,rc)		Opi(0x11,ra,im,0x00,rc)
97 #  define BEQ(ra,d)			Bra(0x39,ra,d)
98 #  define BGE(ra,d)			Bra(0x3e,ra,d)
99 #  define BGT(ra,d)			Bra(0x3f,ra,d)
100 #  define BIC(ra,rb,rc)			Opr(0x11,ra,rb,0x08,rc)
101 #  define ANDNOT(ra,rb,rc)		BIC(ra,rb,rc)
102 #  define BICi(ra,im,rc)		Opi(0x11,ra,im,0x08,rc)
103 #  define ANDNOTi(ra,im,rc)		BICi(ra,im,rc)
104 #  define BIS(ra,rb,rc)			Opr(0x11,ra,rb,0x20,rc)
105 #  define BISi(ra,im,rc)		Opi(0x11,ra,im,0x20,rc)
106 #  define OR(ra,rb,rc)			BIS(ra,rb,rc)
107 #  define ORi(ra,im,rc)			BISi(ra,im,rc)
108 #  define BLBC(ra,d)			Bra(0x38,ra,d)
109 #  define BLBS(ra,d)			Bra(0x3c,ra,d)
110 #  define BLE(ra,d)			Bra(0x3b,ra,d)
111 #  define BLT(ra,d)			Bra(0x3a,ra,d)
112 #  define BNE(ra,d)			Bra(0x3d,ra,d)
113 #  define BR(ra,d)			Bra(0x30,ra,d)
114 #  define BSR(ra,d)			Bra(0x34,ra,d)
115 #  define CALL_PAL(c)			Pcd(0x00,c)
116 #  define CMOVEQ(ra,rb,rc)		Opr(0x11,ra,rb,0x24,rc)
117 #  define CMOVEQi(ra,im,rc)		Opi(0x11,ra,im,0x24,rc)
118 #  define CMOVGE(ra,rb,rc)		Opr(0x11,ra,rb,0x46,rc)
119 #  define CMOVGEi(ra,im,rc)		Opi(0x11,ra,im,0x46,rc)
120 #  define CMOVGT(ra,rb,rc)		Opr(0x11,ra,rb,0x66,rc)
121 #  define CMOVGTi(ra,im,rc)		Opi(0x11,ra,im,0x66,rc)
122 #  define CMOVLBC(ra,rb,rc)		Opr(0x11,ra,rb,0x16,rc)
123 #  define CMOVLBCi(ra,im,rc)		Opi(0x11,ra,im,0x16,rc)
124 #  define CMOVLBS(ra,rb,rc)		Opr(0x11,ra,rb,0x14,rc)
125 #  define CMOVLBSi(ra,im,rc)		Opi(0x11,ra,im,0x14,rc)
126 #  define CMOVLE(ra,rb,rc)		Opr(0x11,ra,rb,0x64,rc)
127 #  define CMOVLEi(ra,im,rc)		Opi(0x11,ra,im,0x64,rc)
128 #  define CMOVLT(ra,rb,rc)		Opr(0x11,ra,rb,0x44,rc)
129 #  define CMOVLTi(ra,im,rc)		Opi(0x11,ra,im,0x44,rc)
130 #  define CMOVNE(ra,rb,rc)		Opr(0x11,ra,rb,0x26,rc)
131 #  define CMOVNEi(ra,im,rc)		Opi(0x11,ra,im,0x26,rc)
132 #  define CMPBGE(ra,rb,rc)		Opr(0x10,ra,rb,0x0f,rc)
133 #  define CMPBGEi(ra,im,rc)		Opi(0x10,ra,im,0x0f,rc)
134 #  define CMPEQ(ra,rb,rc)		Opr(0x10,ra,rb,0x2d,rc)
135 #  define CMPEQi(ra,im,rc)		Opi(0x10,ra,im,0x2d,rc)
136 #  define CMPLE(ra,rb,rc)		Opr(0x10,ra,rb,0x6d,rc)
137 #  define CMPLEi(ra,im,rc)		Opi(0x10,ra,im,0x6d,rc)
138 #  define CMPLT(ra,rb,rc)		Opr(0x10,ra,rb,0x4d,rc)
139 #  define CMPLTi(ra,im,rc)		Opi(0x10,ra,im,0x4d,rc)
140 #  define CMPULE(ra,rb,rc)		Opr(0x10,ra,rb,0x3d,rc)
141 #  define CMPULEi(ra,im,rc)		Opi(0x10,ra,im,0x3d,rc)
142 #  define CMPULT(ra,rb,rc)		Opr(0x10,ra,rb,0x1d,rc)
143 #  define CMPULTi(ra,im,rc)		Opi(0x10,ra,im,0x1d,rc)
144 #  define CTLZ(rb,rc)			Opr(0x1c,_R31_REGNO,rb,0x32,rc)
145 #  define CTPOP(rb,rc)			Opr(0x1c,_R31_REGNO,rb,0x30,rc)
146 #  define CTTZ(rb,rc)			Opr(0x1c,_R31_REGNO,rb,0x33,rc)
147 #  define ECB(rb,d)			Mem(0x18,_R31_REGNO,rb,0xe800)
148 #  define EQV(ra,rb,rc)			Opr(0x11,ra,rb,0x48,rc)
149 #  define XORNOT(ra,rb,rc)		EQV(ra,rb,rc)
150 #  define EQVi(ra,im,rc)		Opi(0x11,ra,im,0x48,rc)
151 #  define XORNOTi(ra,im,rc)		EQVi(ra,im,rc)
152 #  define EXCB()			Mem(0x18,0,0,0x0400)
153 #  define EXTBL(ra,rb,rc)		Opr(0x12,ra,rb,0x06,rc)
154 #  define EXTBLi(ra,im,rc)		Opi(0x12,ra,im,0x06,rc)
155 #  define EXTLH(ra,rb,rc)		Opr(0x12,ra,rb,0x6a,rc)
156 #  define EXTLHi(ra,im,rc)		Opi(0x12,ra,im,0x6a,rc)
157 #  define EXTLL(ra,rb,rc)		Opr(0x12,ra,rb,0x26,rc)
158 #  define EXTLLi(ra,im,rc)		Opi(0x12,ra,im,0x26,rc)
159 #  define EXTQH(ra,rb,rc)		Opr(0x12,ra,rb,0x7a,rc)
160 #  define EXTQHi(ra,im,rc)		Opi(0x12,ra,im,0x7a,rc)
161 #  define EXTQL(ra,rb,rc)		Opr(0x12,ra,rb,0x36,rc)
162 #  define EXTQLi(ra,im,rc)		Opi(0x12,ra,im,0x36,rc)
163 #  define EXTWH(ra,rb,rc)		Opr(0x12,ra,rb,0x5a,rc)
164 #  define EXTWHi(ra,im,rc)		Opi(0x12,ra,im,0x5a,rc)
165 #  define EXTWL(ra,rb,rc)		Opr(0x12,ra,rb,0x16,rc)
166 #  define EXTWLi(ra,im,rc)		Opi(0x12,ra,im,0x16,rc)
167 #  define FETCH(rb,d)			Mem(0x18,_R31_REGNO,rb,0x8000)
168 #  define FETCH_Mem(rb,d)		Mem(0x18,_R31_REGNO,rb,0xa000)
169 /* FIXME IMPLVER not disassembled */
170 #  define IMPLVER(rc)			Opr(0x11,_R31_REGNO,1,0x6c,rc)
171 #  define INSBL(ra,rb,rc)		Opr(0x12,ra,rb,0x0b,rc)
172 #  define INSBLi(ra,im,rc)		Opi(0x12,ra,im,0x0b,rc)
173 #  define INSLH(ra,rb,rc)		Opr(0x12,ra,rb,0x67,rc)
174 #  define INSLHi(ra,im,rc)		Opi(0x12,ra,im,0x67,rc)
175 #  define INSLL(ra,rb,rc)		Opr(0x12,ra,rb,0x2b,rc)
176 #  define INSLLi(ra,im,rc)		Opi(0x12,ra,im,0x2b,rc)
177 #  define INSQH(ra,rb,rc)		Opr(0x12,ra,rb,0x77,rc)
178 #  define INSQHi(ra,im,rc)		Opi(0x12,ra,im,0x77,rc)
179 #  define INSQL(ra,rb,rc)		Opr(0x12,ra,rb,0x3b,rc)
180 #  define INSQLi(ra,im,rc)		Opi(0x12,ra,im,0x3b,rc)
181 #  define INSWH(ra,rb,rc)		Opr(0x12,ra,rb,0x57,rc)
182 #  define INSWHi(ra,im,rc)		Opi(0x12,ra,im,0x57,rc)
183 #  define INSWL(ra,rb,rc)		Opr(0x12,ra,rb,0x1b,rc)
184 #  define INSWLi(ra,im,rc)		Opi(0x12,ra,im,0x1b,rc)
185 #  define JMP(ra,rb,d)			Mbr(0x1a,ra,rb,0,d)
186 #  define JSR(ra,rb,d)			Mbr(0x1a,ra,rb,1,d)
187 #  define JSR_COROUTINE(ra,rb,d)	Mbr(0x1a,ra,rb,3,d)
188 #  define JCR(ra,rb,rd)			JSR_COROUTINE(ra,rb,d)
189 #  define LDA(ra,rb,d)			Mem(0x08,ra,rb,d)
190 #  define LDAH(ra,rb,d)			Mem(0x09,ra,rb,d)
191 #  define LDBU(ra,rb,d)			Mem(0x0a,ra,rb,d)
192 #  define LDWU(ra,rb,d)			Mem(0x0c,ra,rb,d)
193 #  define LDL(ra,rb,d)			Mem(0x28,ra,rb,d)
194 #  define LDL_L(ra,rb,d)		Mem(0x2a,ra,rb,d)
195 #  define LDQ(ra,rb,d)			Mem(0x29,ra,rb,d)
196 #  define LDQ_L(ra,rb,d)		Mem(0x2b,ra,rb,d)
197 #  define LDQ_U(ra,rb,d)		Mem(0x0b,ra,rb,d)
198 #  define MAXSB8(ra,rb,rc)		Opr(0x1c,ra,rb,0x3e,rc)
199 #  define MAXSW4(ra,rb,rc)		Opr(0x1c,ra,rb,0x3f,rc)
200 #  define MAXSUB8(ra,rb,rc)		Opr(0x1c,ra,rb,0x3c,rc)
201 #  define MAXSUW4(ra,rb,rc)		Opr(0x1c,ra,rb,0x3d,rc)
202 #  define MB()				Mem(0x18,_R31_REGNO,_R31_REGNO,0x4000)
203 #  define MINSB8(ra,rb,rc)		Opr(0x1c,ra,rb,0x38,rc)
204 #  define MINSW4(ra,rb,rc)		Opr(0x1c,ra,rb,0x39,rc)
205 #  define MINSUB8(ra,rb,rc)		Opr(0x1c,ra,rb,0x3a,rc)
206 #  define MINSUW4(ra,rb,rc)		Opr(0x1c,ra,rb,0x3b,rc)
207 #  define MSKBL(ra,rb,rc)		Opr(0x12,ra,rb,0x02,rc)
208 #  define MSKBLi(ra,im,rc)		Opi(0x12,ra,im,0x02,rc)
209 #  define MSKLH(ra,rb,rc)		Opr(0x12,ra,rb,0x62,rc)
210 #  define MSKLHi(ra,im,rc)		Opi(0x12,ra,im,0x62,rc)
211 #  define MSKLL(ra,rb,rc)		Opr(0x12,ra,rb,0x22,rc)
212 #  define MSKLLi(ra,im,rc)		Opi(0x12,ra,im,0x22,rc)
213 #  define MSKQH(ra,rb,rc)		Opr(0x12,ra,rb,0x72,rc)
214 #  define MSKQHi(ra,im,rc)		Opi(0x12,ra,im,0x72,rc)
215 #  define MSKQL(ra,rb,rc)		Opr(0x12,ra,rb,0x32,rc)
216 #  define MSKQLi(ra,im,rc)		Opi(0x12,ra,im,0x32,rc)
217 #  define MSKWH(ra,rb,rc)		Opr(0x12,ra,rb,0x52,rc)
218 #  define MSKWHi(ra,im,rc)		Opi(0x12,ra,im,0x52,rc)
219 #  define MSKWL(ra,rb,rc)		Opr(0x12,ra,rb,0x12,rc)
220 #  define MSKWLi(ra,im,rc)		Opi(0x12,ra,im,0x12,rc)
221 #  define MULL(ra,rb,rc)		Opr(0x13,ra,rb,0x00,rc)
222 #  define MULLi(ra,im,rc)		Opi(0x13,ra,im,0x00,rc)
223 #  define MULL_V(ra,rb,rc)		Opr(0x13,ra,rb,0x40,rc)
224 #  define MULL_Vi(ra,im,rc)		Opi(0x13,ra,im,0x40,rc)
225 #  define MULQ(ra,rb,rc)		Opr(0x13,ra,rb,0x20,rc)
226 #  define MULQi(ra,im,rc)		Opi(0x13,ra,im,0x20,rc)
227 #  define MULQ_V(ra,rb,rc)		Opr(0x13,ra,rb,0x60,rc)
228 #  define MULQ_Vi(ra,im,rc)		Opi(0x13,ra,im,0x60,rc)
229 #  define ORNOT(ra,rb,rc)		Opr(0x11,ra,rb,0x28,rc)
230 #  define ORNOTi(ra,im,rc)		Opi(0x11,ra,im,0x28,rc)
231 #  define PERR(ra,rb,rc)		Opr(0x1c,ra,rb,0x31,rc)
232 #  define PKLB(rb,rc)			Opr(0x1c,_R31_REGNO,rb,0x37,rc)
233 #  define PKWB(rb,rc)			Opr(0x1c,_R31_REGNO,rb,0x36,rc)
234 /* FIXME PREFETCH* not disassembled */
235 #  define PREFETCH(rb,d)		Mem(0x28,_R31_REGNO,rb,d)
236 #  define PREFETCH_EN(rb,d)		Mem(0x29,_R31_REGNO,rb,d)
237 #  define PREFETCH_M(rb,d)		Mem(0x22,_R31_REGNO,rb,d)
238 #  define PREFETCH_MEN(rb,d)		Mem(0x23,_R31_REGNO,rb,d)
239 #  define RC(ra)			Mem(0x18,ra,_R31_REGNO,0xe000)
240 #  define RET(ra,rb,d)			Mbr(0x1a,ra,rb,2,d)
241 #  define RPCC(ra)			Mem(0x18,ra,_R31_REGNO,0xc000)
242 #  define RS(ra)			Mem(0x18,ra,_R31_REGNO,0xf000)
243 #  define S4ADDL(ra,rb,rc)		Opr(0x10,ra,rb,0x02,rc)
244 #  define S4ADDi(ra,im,rc)		Opi(0x10,ra,im,0x02,rc)
245 #  define S4ADDQ(ra,rb,rc)		Opr(0x10,ra,rb,0x22,rc)
246 #  define S4ADDQi(ra,im,rc)		Opi(0x10,ra,im,0x22,rc)
247 #  define S4SUBL(ra,rb,rc)		Opr(0x10,ra,rb,0x0b,rc)
248 #  define S4SUBLi(ra,im,rc)		Opi(0x10,ra,im,0x0b,rc)
249 #  define S4SUBQ(ra,rb,rc)		Opr(0x10,ra,rb,0x2b,rc)
250 #  define S4SUBQi(ra,im,rc)		Opi(0x10,ra,im,0x2b,rc)
251 #  define S8ADDL(ra,rb,rc)		Opr(0x10,ra,rb,0x12,rc)
252 #  define S8ADDLi(ra,im,rc)		Opi(0x10,ra,im,0x12,rc)
253 #  define S8ADDQ(ra,rb,rc)		Opr(0x10,ra,rb,0x32,rc)
254 #  define S8ADDQi(ra,im,rc)		Opi(0x10,ra,im,0x32,rc)
255 #  define S8SUBL(ra,rb,rc)		Opr(0x10,ra,rb,0x1b,rc)
256 #  define S8SUBLi(ra,im,rc)		Opi(0x10,ra,im,0x1b,rc)
257 #  define S8SUBQ(ra,rb,rc)		Opr(0x10,ra,rb,0x3b,rc)
258 #  define S8SUBQi(ra,im,rc)		Opi(0x10,ra,im,0x3b,rc)
259 #  define SEXTB(rb,rc)			Opr(0x1c,_R31_REGNO,rb,0x00,rc)
260 /* FIXME not disassembled */
261 #  define SEXTBi(im,rc)			Opi(0x1c,_R31_REGNO,im,0x00,rc)
262 #  define SEXTW(rb,rc)			Opr(0x1c,_R31_REGNO,rb,0x01,rc)
263 /* FIXME not disassembled */
264 #  define SEXTWi(im,rc)			Opi(0x1c,_R31_REGNO,im,0x01,rc)
265 #  define SLL(ra,rb,rc)			Opr(0x12,ra,rb,0x39,rc)
266 #  define SLLi(ra,im,rc)		Opi(0x12,ra,im,0x39,rc)
267 #  define SRA(ra,rb,rc)			Opr(0x12,ra,rb,0x3c,rc)
268 #  define SRAi(ra,im,rc)		Opi(0x12,ra,im,0x3c,rc)
269 #  define SRL(ra,rb,rc)			Opr(0x12,ra,rb,0x34,rc)
270 #  define SRLi(ra,im,rc)		Opi(0x12,ra,im,0x34,rc)
271 #  define STB(ra,rb,d)			Mem(0x0e,ra,rb,d)
272 #  define STL(ra,rb,d)			Mem(0x2c,ra,rb,d)
273 #  define STL_C(ra,rb,d)		Mem(0x2e,ra,rb,d)
274 #  define STQ(ra,rb,d)			Mem(0x2d,ra,rb,d)
275 #  define STQ_C(ra,rb,d)		Mem(0x2f,ra,rb,d)
276 #  define STQ_U(ra,rb,d)		Mem(0x0f,ra,rb,d)
277 #  define STW(ra,rb,d)			Mem(0x0d,ra,rb,d)
278 #  define SUBL(ra,rb,rc)		Opr(0x10,ra,rb,0x09,rc)
279 #  define SUBLi(ra,im,rc)		Opi(0x10,ra,im,0x09,rc)
280 #  define SUBL_V(ra,rb,rc)		Opr(0x10,ra,rb,0x49,rc)
281 #  define SUBL_Vi(ra,im,rc)		Opi(0x10,ra,im,0x49,rc)
282 #  define SUBQ(ra,rb,rc)		Opr(0x10,ra,rb,0x29,rc)
283 #  define SUBQi(ra,im,rc)		Opi(0x10,ra,im,0x29,rc)
284 #  define SUBQ_V(ra,rb,rc)		Opr(0x10,ra,rb,0x69,rc)
285 #  define SUBQ_Vi(ra,im,rc)		Opi(0x10,ra,im,0x69,rc)
286 #  define TRAPB()			Mem(0x18,_R31_REGNO,_R31_REGNO,0x0000)
287 #  define UMULH(ra,rb,rc)		Opr(0x13,ra,rb,0x30,rc)
288 #  define UMULHi(ra,im,rc)		Opi(0x13,ra,im,0x30,rc)
289 #  define UNPKBL(rb,rc)			Opr(0x1c,_R31_REGNO,rb,0x35,rc)
290 #  define UNPKBW(rb,rc)			Opr(0x1c,_R31_REGNO,rb,0x34,rc)
291 #  define WH64(ra)			Mem(0x18,ra,_R31_REGNO,0xf800)
292 #  define WH64EN(ra)			Mem(0x18,ra,_R31_REGNO,0xfc00)
293 #  define WMB()				Mem(0x18,_R31_REGNO,_R31_REGNO,0x4400)
294 #  define XOR(ra,rb,rc)			Opr(0x11,ra,rb,0x40,rc)
295 #  define XORi(ra,im,rc)		Opi(0x11,ra,im,0x40,rc)
296 #  define ZAP(ra,rb,rc)			Opr(0x12,ra,rb,0x30,rc)
297 #  define ZAPi(ra,im,rc)		Opi(0x12,ra,im,0x30,rc)
298 #  define ZAPNOT(ra,rb,rc)		Opr(0x12,ra,rb,0x31,rc)
299 #  define ZAPNOTi(ra,im,rc)		Opi(0x12,ra,im,0x31,rc)
300 #  define NOP()				BIS(_R31_REGNO,_R31_REGNO,_R31_REGNO)
301 #  define MOV(ra,rc)			BIS(ra,ra,rc)
302 #  define MOVi(im,rc)			BISi(_R31_REGNO,im,rc)
303 #  define NEGL(ra,rc)			SUBL(_R31_REGNO,ra,rc)
304 #  define NEGQ(ra,rc)			SUBQ(_R31_REGNO,ra,rc)
305 #  define NOT(ra,rc)			ORNOT(_R31_REGNO,ra,rc)
306 #  define nop(i0)			_nop(_jit,i0)
307 static void _nop(jit_state_t*,jit_int32_t);
308 #  define movr(r0,r1)			_movr(_jit,r0,r1)
309 static void _movr(jit_state_t*,jit_int32_t,jit_int32_t);
310 #  define movi(r0,i0)			_movi(_jit,r0,i0)
311 static void _movi(jit_state_t*,jit_int32_t,jit_word_t);
312 #  define movi_p(r0,i0)			_movi_p(_jit,r0,i0)
313 static jit_word_t _movi_p(jit_state_t*,jit_int32_t,jit_word_t);
314 #  define negr(r0,r1)			NEGQ(r1,r0)
315 #  define comr(r0,r1)			NOT(r1,r0)
316 #  define addr(r0,r1,r2)		ADDQ(r1,r2,r0)
317 #  define addi(r0,r1,i0)		_addi(_jit,r0,r1,i0)
318 static void _addi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
319 #  define addcr(r0,r1,i0)		_addcr(_jit,r0,r1,i0)
320 static void _addcr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
321 #  define addci(r0,r1,i0)		_addci(_jit,r0,r1,i0)
322 static void _addci(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
323 #  define addxr(r0,r1,i0)		_addxr(_jit,r0,r1,i0)
324 static void _addxr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
325 #  define addxi(r0,r1,i0)		_addxi(_jit,r0,r1,i0)
326 static void _addxi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
327 #  define subr(r0,r1,r2)		SUBQ(r1,r2,r0)
328 #  define subi(r0,r1,i0)		_subi(_jit,r0,r1,i0)
329 static void _subi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
330 #  define subcr(r0,r1,i0)		_subcr(_jit,r0,r1,i0)
331 static void _subcr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
332 #  define subci(r0,r1,i0)		_subci(_jit,r0,r1,i0)
333 static void _subci(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
334 #  define subxr(r0,r1,i0)		_subxr(_jit,r0,r1,i0)
335 static void _subxr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
336 #  define subxi(r0,r1,i0)		_subxi(_jit,r0,r1,i0)
337 static void _subxi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
338 #  define rsbi(r0, r1, i0)		_rsbi(_jit, r0, r1, i0)
339 static void _rsbi(jit_state_t*,jit_int32_t,jit_int32_t, jit_word_t);
340 #  define mulr(r0,r1,r2)		MULQ(r1,r2,r0)
341 #  define muli(r0,r1,i0)		_muli(_jit,r0,r1,i0)
342 static void _muli(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
343 #  define qmulr(r0,r1,r2,r3)		_qmulr(_jit,r0,r1,r2,r3)
344 static void _qmulr(jit_state_t*,jit_int32_t,
345 		   jit_int32_t,jit_int32_t,jit_int32_t);
346 #  define qmuli(r0,r1,r2,i0)		_qmuli(_jit,r0,r1,r2,i0)
347 static void _qmuli(jit_state_t*,jit_int32_t,
348 		   jit_int32_t,jit_int32_t,jit_word_t);
349 #  define qmulr_u(r0,r1,r2,r3)		_qmulr_u(_jit,r0,r1,r2,r3)
350 static void _qmulr_u(jit_state_t*,jit_int32_t,
351 		     jit_int32_t,jit_int32_t,jit_int32_t);
352 #  define qmuli_u(r0,r1,r2,i0)		_qmuli_u(_jit,r0,r1,r2,i0)
353 static void _qmuli_u(jit_state_t*,jit_int32_t,
354 		     jit_int32_t,jit_int32_t,jit_word_t);
355 static jit_word_t __idiv(jit_word_t, jit_word_t);
356 #  define divr(r0,r1,r2)		_divr(_jit,r0,r1,r2)
357 static void _divr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
358 #  define divi(r0,r1,i0)		_divi(_jit,r0,r1,i0)
359 static void _divi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
360 static jit_uword_t __udiv(jit_uword_t, jit_uword_t);
361 #  define divr_u(r0,r1,r2)		_divr_u(_jit,r0,r1,r2)
362 static void _divr_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
363 #  define divi_u(r0,r1,i0)		_divi_u(_jit,r0,r1,i0)
364 static void _divi_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
365 static jit_word_t __irem(jit_word_t, jit_word_t);
366 #  define remr(r0,r1,r2)		_remr(_jit,r0,r1,r2)
367 static void _remr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
368 #  define remi(r0,r1,i0)		_remi(_jit,r0,r1,i0)
369 static void _remi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
370 static jit_uword_t __urem(jit_uword_t, jit_uword_t);
371 #  define remr_u(r0,r1,r2)		_remr_u(_jit,r0,r1,r2)
372 static void _remr_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
373 #  define remi_u(r0,r1,i0)		_remi_u(_jit,r0,r1,i0)
374 static void _remi_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
375 static jit_word_t __idivrem(jit_word_t, jit_word_t, jit_word_t*);
376 #  define qdivr(r0,r1,r2,r3)		_qdivr(_jit,r0,r1,r2,r3)
377 static void _qdivr(jit_state_t*,
378 		   jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t);
379 #  define qdivi(r0,r1,r2,i0)		_qdivi(_jit,r0,r1,r2,i0)
380 static void _qdivi(jit_state_t*,
381 		   jit_int32_t,jit_int32_t,jit_int32_t,jit_word_t);
382 static jit_word_t __udivrem(jit_uword_t, jit_uword_t, jit_uword_t*);
383 #  define qdivr_u(r0,r1,r2,r3)		_qdivr_u(_jit,r0,r1,r2,r3)
384 static void _qdivr_u(jit_state_t*,
385 		     jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t);
386 #  define qdivi_u(r0,r1,r2,i0)		_qdivi_u(_jit,r0,r1,r2,i0)
387 static void _qdivi_u(jit_state_t*,
388 		     jit_int32_t,jit_int32_t,jit_int32_t,jit_word_t);
389 #  define lshr(r0,r1,r2)		SLL(r1,r2,r0)
390 #  define lshi(r0,r1,i0)		_lshi(_jit,r0,r1,i0)
391 static void _lshi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
392 #  define rshr(r0,r1,r2)		SRA(r1,r2,r0)
393 #  define rshi(r0,r1,i0)		_rshi(_jit,r0,r1,i0)
394 static void _rshi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
395 #  define rshr_u(r0,r1,r2)		SRL(r1,r2,r0)
396 #  define rshi_u(r0,r1,i0)		_rshi_u(_jit,r0,r1,i0)
397 static void _rshi_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
398 #  define andr(r0,r1,r2)		AND(r1,r2,r0)
399 #  define andi(r0,r1,i0)		_andi(_jit,r0,r1,i0)
400 static void _andi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
401 #  define orr(r0,r1,r2)			OR(r1,r2,r0)
402 #  define ori(r0,r1,i0)			_ori(_jit,r0,r1,i0)
403 static void _ori(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
404 #  define xorr(r0,r1,r2)		XOR(r1,r2,r0)
405 #  define xori(r0,r1,i0)		_xori(_jit,r0,r1,i0)
406 static void _xori(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
407 #  define ltr(r0,r1,r2)			CMPLT(r1,r2,r0)
408 #  define lti(r0,r1,i0)			_lti(_jit,r0,r1,i0)
409 static void _lti(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
410 #  define ltr_u(r0,r1,r2)		CMPULT(r1,r2,r0)
411 #  define lti_u(r0,r1,i0)		_lti_u(_jit,r0,r1,i0)
412 static void _lti_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
413 #  define ler(r0,r1,r2)			CMPLE(r1,r2,r0)
414 #  define lei(r0,r1,i0)			_lei(_jit,r0,r1,i0)
415 static void _lei(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
416 #  define ler_u(r0,r1,r2)		CMPULE(r1,r2,r0)
417 #  define lei_u(r0,r1,i0)		_lei_u(_jit,r0,r1,i0)
418 static void _lei_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
419 #  define eqr(r0,r1,r2)			CMPEQ(r1,r2,r0)
420 #  define eqi(r0,r1,i0)			_eqi(_jit,r0,r1,i0)
421 static void _eqi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
422 #  define ger(r0,r1,r2)			CMPLE(r2,r1,r0)
423 #  define gei(r0,r1,i0)			_gei(_jit,r0,r1,i0)
424 static void _gei(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
425 #  define ger_u(r0,r1,r2)		CMPULE(r2,r1,r0)
426 #  define gei_u(r0,r1,i0)		_gei_u(_jit,r0,r1,i0)
427 static void _gei_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
428 #  define gtr(r0,r1,r2)			CMPLT(r2,r1,r0)
429 #  define gti(r0,r1,i0)			_gti(_jit,r0,r1,i0)
430 static void _gti(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
431 #  define gtr_u(r0,r1,r2)		CMPULT(r2,r1,r0)
432 #  define gti_u(r0,r1,i0)		_gti_u(_jit,r0,r1,i0)
433 static void _gti_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
434 #  define ner(r0,r1,r2)			_ner(_jit,r0,r1,r2)
435 static void _ner(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
436 #  define nei(r0,r1,i0)			_nei(_jit,r0,r1,i0)
437 static void _nei(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
438 #  define bltr(i0,r0,r1)		_bltr(_jit,i0,r0,r1)
439 static jit_word_t _bltr(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
440 #  define blti(i0,r0,i1)		_blti(_jit,i0,r0,i1)
441 static jit_word_t _blti(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
442 #  define bltr_u(i0,r0,r1)		_bltr_u(_jit,i0,r0,r1)
443 static jit_word_t _bltr_u(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
444 #  define blti_u(i0,r0,i1)		_blti_u(_jit,i0,r0,i1)
445 static jit_word_t _blti_u(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
446 #  define bler(i0,r0,r1)		_bler(_jit,i0,r0,r1)
447 static jit_word_t _bler(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
448 #  define blei(i0,r0,i1)		_blei(_jit,i0,r0,i1)
449 static jit_word_t _blei(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
450 #  define bler_u(i0,r0,r1)		_bler_u(_jit,i0,r0,r1)
451 static jit_word_t _bler_u(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
452 #  define blei_u(i0,r0,i1)		_blei_u(_jit,i0,r0,i1)
453 static jit_word_t _blei_u(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
454 #  define beqr(i0,r0,r1)		_beqr(_jit,i0,r0,r1)
455 static jit_word_t _beqr(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
456 #  define beqi(i0,r0,i1)		_beqi(_jit,i0,r0,i1)
457 static jit_word_t _beqi(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
458 #  define bger(i0,r0,r1)		_bger(_jit,i0,r0,r1)
459 static jit_word_t _bger(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
460 #  define bgei(i0,r0,i1)			_bgei(_jit,i0,r0,i1)
461 static jit_word_t _bgei(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
462 #  define bger_u(i0,r0,r1)		_bger_u(_jit,i0,r0,r1)
463 static jit_word_t _bger_u(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
464 #  define bgei_u(i0,r0,i1)		_bgei_u(_jit,i0,r0,i1)
465 static jit_word_t _bgei_u(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
466 #  define bgtr(i0,r0,r1)		_bgtr(_jit,i0,r0,r1)
467 static jit_word_t _bgtr(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
468 #  define bgti(i0,r0,i1)		_bgti(_jit,i0,r0,i1)
469 static jit_word_t _bgti(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
470 #  define bgtr_u(i0,r0,r1)		_bgtr_u(_jit,i0,r0,r1)
471 static jit_word_t _bgtr_u(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
472 #  define bgti_u(i0,r0,i1)		_bgti_u(_jit,i0,r0,i1)
473 static jit_word_t _bgti_u(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
474 #  define bner(i0,r0,r1)		_bner(_jit,i0,r0,r1)
475 static jit_word_t _bner(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
476 #  define bnei(i0,r0,i1)		_bnei(_jit,i0,r0,i1)
477 static jit_word_t _bnei(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
478 #  define baddr(i0,r0,r1,cc)		_baddr(_jit,i0,r0,r1,cc)
479 static jit_word_t _baddr(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t,
480 			 jit_bool_t);
481 #  define baddi(i0,r0,i1,cc)		_baddi(_jit,i0,r0,i1,cc)
482 static jit_word_t _baddi(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t,
483 			 jit_bool_t);
484 #  define baddr_u(i0,r0,r1,cc)		_baddr_u(_jit,i0,r0,r1,cc)
485 static jit_word_t _baddr_u(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t,
486 			   jit_bool_t);
487 #  define baddi_u(i0,r0,i1,cc)		_baddi_u(_jit,i0,r0,i1,cc)
488 static jit_word_t _baddi_u(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t,
489 			   jit_bool_t);
490 #  define boaddr(i0,r0,r1)		baddr(i0,r0,r1,1)
491 #  define boaddi(i0,r0,i1)		baddi(i0,r0,i1,1)
492 #  define boaddr_u(i0,r0,r1)		baddr_u(i0,r0,r1,1)
493 #  define boaddi_u(i0,r0,i1)		baddi_u(i0,r0,i1,1)
494 #  define bxaddr(i0,r0,r1)		baddr(i0,r0,r1,0)
495 #  define bxaddi(i0,r0,i1)		baddi(i0,r0,i1,0)
496 #  define bxaddr_u(i0,r0,r1)		baddr_u(i0,r0,r1,0)
497 #  define bxaddi_u(i0,r0,i1)		baddi_u(i0,r0,i1,0)
498 #  define bsubr(i0,r0,r1,cc)		_bsubr(_jit,i0,r0,r1,cc)
499 static jit_word_t _bsubr(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t,
500 			 jit_bool_t);
501 #  define bsubi(i0,r0,i1,cc)		_bsubi(_jit,i0,r0,i1,cc)
502 static jit_word_t _bsubi(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t,
503 			 jit_bool_t);
504 #  define bsubr_u(i0,r0,r1,cc)		_bsubr_u(_jit,i0,r0,r1,cc)
505 static jit_word_t _bsubr_u(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t,
506 			   jit_bool_t);
507 #  define bsubi_u(i0,r0,i1,cc)		_bsubi_u(_jit,i0,r0,i1,cc)
508 static jit_word_t _bsubi_u(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t,
509 			   jit_bool_t);
510 #  define bosubr(i0,r0,r1)		bsubr(i0,r0,r1,1)
511 #  define bosubi(i0,r0,i1)		bsubi(i0,r0,i1,1)
512 #  define bosubr_u(i0,r0,r1)		bsubr_u(i0,r0,r1,1)
513 #  define bosubi_u(i0,r0,i1)		bsubi_u(i0,r0,i1,1)
514 #  define bxsubr(i0,r0,r1)		bsubr(i0,r0,r1,0)
515 #  define bxsubi(i0,r0,i1)		bsubi(i0,r0,i1,0)
516 #  define bxsubr_u(i0,r0,r1)		bsubr_u(i0,r0,r1,0)
517 #  define bxsubi_u(i0,r0,i1)		bsubi_u(i0,r0,i1,0)
518 #  define bmxr(i0,r0,r1,cc)		_bmxr(_jit,i0,r0,r1,cc)
519 static jit_word_t _bmxr(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t,
520 			jit_bool_t);
521 #  define bmxi(i0,r0,i1,cc)		_bmxi(_jit,i0,r0,i1,cc)
522 static jit_word_t _bmxi(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t,
523 			jit_bool_t);
524 #  define bmsr(i0,r0,r1)		bmxr(i0,r0,r1,1)
525 #  define bmsi(i0,r0,i1)		bmxi(i0,r0,i1,1)
526 #  define bmcr(i0,r0,r1)		bmxr(i0,r0,r1,0)
527 #  define bmci(i0,r0,i1)		bmxi(i0,r0,i1,0)
528 #  define ldr_c(r0,r1)			_ldr_c(_jit,r0,r1)
529 static void _ldr_c(jit_state_t*,jit_int32_t,jit_int32_t);
530 #  define ldi_c(r0,i0)			_ldi_c(_jit,r0,i0)
531 static void _ldi_c(jit_state_t*,jit_int32_t,jit_word_t);
532 #  define ldr_uc(r0,r1)			LDBU(r0,r1,0)
533 #  define ldi_uc(r0,i0)			_ldi_uc(_jit,r0,i0)
534 static void _ldi_uc(jit_state_t*,jit_int32_t,jit_word_t);
535 #  define ldr_s(r0,r1)			_ldr_s(_jit,r0,r1)
536 static void _ldr_s(jit_state_t*,jit_int32_t,jit_int32_t);
537 #  define ldi_s(r0,i0)			_ldi_s(_jit,r0,i0)
538 static void _ldi_s(jit_state_t*,jit_int32_t,jit_word_t);
539 #  define ldr_us(r0,r1)			LDWU(r0,r1,0)
540 #  define ldi_us(r0,i0)			_ldi_us(_jit,r0,i0)
541 static void _ldi_us(jit_state_t*,jit_int32_t,jit_word_t);
542 #  define ldr_i(r0,r1)			LDL(r0,r1,0)
543 #  define ldi_i(r0,i0)			_ldi_i(_jit,r0,i0)
544 static void _ldi_i(jit_state_t*,jit_int32_t,jit_word_t);
545 #  define ldr_ui(r0,r1)			_ldr_ui(_jit,r0,r1)
546 static void _ldr_ui(jit_state_t*,jit_int32_t,jit_int32_t);
547 #  define ldi_ui(r0,i0)			_ldi_ui(_jit,r0,i0)
548 static void _ldi_ui(jit_state_t*,jit_int32_t,jit_word_t);
549 #  define ldr(r0,r1)			ldr_l(r0,r1)
550 #  define ldr_l(r0,r1)			LDQ(r0,r1,0)
551 #  define ldi_l(r0,i0)			_ldi_l(_jit,r0,i0)
552 static void _ldi_l(jit_state_t*,jit_int32_t,jit_word_t);
553 #  define ldxr_c(r0,r1,r2)		_ldxr_c(_jit,r0,r1,r2)
554 static 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)
556 static 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)
558 static 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)
560 static 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)
562 static 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)
564 static 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)
566 static 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)
568 static 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)
570 static 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)
572 static void _ldxi_i(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
573 #  define ldxr_ui(r0,r1,r2)		_ldxr_ui(_jit,r0,r1,r2)
574 static void _ldxr_ui(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
575 #  define ldxi_ui(r0,r1,i0)		_ldxi_ui(_jit,r0,r1,i0)
576 static void _ldxi_ui(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
577 #  define ldxr(r0,r1,r2)		ldxr_l(r0,r1,r2)
578 #  define ldxr_l(r0,r1,r2)		_ldxr_l(_jit,r0,r1,r2)
579 static void _ldxr_l(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
580 #  define ldxi(r0,r1,i0)		ldxi_l(r0,r1,i0)
581 #  define ldxi_l(r0,r1,i0)		_ldxi_l(_jit,r0,r1,i0)
582 static void _ldxi_l(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
583 #  define str_c(r0,r1)			STB(r1,r0,0)
584 #  define sti_c(i0,r0)			_sti_c(_jit,i0,r0)
585 static void _sti_c(jit_state_t*,jit_word_t,jit_int32_t);
586 #  define str_s(r0,r1)			STW(r1,r0,0)
587 #  define sti_s(i0,r0)			_sti_s(_jit,i0,r0)
588 static void _sti_s(jit_state_t*,jit_word_t,jit_int32_t);
589 #  define str_i(r0,r1)			STL(r1,r0,0)
590 #  define sti_i(i0,r0)			_sti_i(_jit,i0,r0)
591 static void _sti_i(jit_state_t*,jit_word_t,jit_int32_t);
592 #  define str(r0,r1)			str_l(r0,r1)
593 #  define str_l(r0,r1)			STQ(r1,r0,0)
594 #  define sti_l(i0,r0)			_sti_l(_jit,i0,r0)
595 static void _sti_l(jit_state_t*,jit_word_t,jit_int32_t);
596 #  define stxr_c(r0,r1,r2)		_stxr_c(_jit,r0,r1,r2)
597 static void _stxr_c(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
598 #  define stxi_c(i0,r0,r1)		_stxi_c(_jit,i0,r0,r1)
599 static void _stxi_c(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
600 #  define stxr_s(r0,r1,r2)		_stxr_s(_jit,r0,r1,r2)
601 static void _stxr_s(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
602 #  define stxi_s(i0,r0,r1)		_stxi_s(_jit,i0,r0,r1)
603 static void _stxi_s(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
604 #  define stxr_i(r0,r1,r2)		_stxr_i(_jit,r0,r1,r2)
605 static void _stxr_i(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
606 #  define stxi_i(i0,r0,r1)		_stxi_i(_jit,i0,r0,r1)
607 static void _stxi_i(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
608 #  define stxr_l(r0,r1,r2)		_stxr_l(_jit,r0,r1,r2)
609 static void _stxr_l(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
610 #  define stxi(i0,r0,r1)		stxi_l(i0,r0,r1)
611 #  define stxi_l(i0,r0,r1)		_stxi_l(_jit,i0,r0,r1)
612 static void _stxi_l(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
613 #  define extr_c(r0,r1)			_extr_c(_jit,r0,r1)
614 static void _extr_c(jit_state_t*,jit_int32_t,jit_int32_t);
615 #  define extr_uc(r0,r1)		_extr_uc(_jit,r0,r1)
616 static void _extr_uc(jit_state_t*,jit_int32_t,jit_int32_t);
617 #  define extr_s(r0,r1)			_extr_s(_jit,r0,r1)
618 static void _extr_s(jit_state_t*,jit_int32_t,jit_int32_t);
619 #  define extr_us(r0,r1)		_extr_us(_jit,r0,r1)
620 static void _extr_us(jit_state_t*,jit_int32_t,jit_int32_t);
621 #  define extr_i(r0,r1)			_extr_i(_jit,r0,r1)
622 static void _extr_i(jit_state_t*,jit_int32_t,jit_int32_t);
623 #  define extr_ui(r0,r1)		_extr_ui(_jit,r0,r1)
624 static void _extr_ui(jit_state_t*,jit_int32_t,jit_int32_t);
625 #  if __BYTE_ORDER == __LITTLE_ENDIAN
626 #    define htonr_us(r0,r1)		_htonr_us(_jit,r0,r1)
627 static void _htonr_us(jit_state_t*,jit_int32_t,jit_int32_t);
628 #    define htonr_ui(r0,r1)		_htonr_ui(_jit,r0,r1)
629 static void _htonr_ui(jit_state_t*,jit_int32_t,jit_int32_t);
630 #    define htonr_ul(r0,r1)		_htonr_ul(_jit,r0,r1)
631 static void _htonr_ul(jit_state_t*,jit_int32_t,jit_int32_t);
632 #  else
633 #    define htonr_us(r0,r1)		extr_us(r0,r1)
634 #    define htonr_ui(r0,r1)		extr_ui(r0,r1)
635 #    define htonr_ul(r0,r1)		movr(r0,r1)
636 #  endif
637 #  define jmpr(r0)			JMP(_R31_REGNO,r0,0)
638 #  define jmpi(i0)			_jmpi(_jit,i0)
639 static void _jmpi(jit_state_t*, jit_word_t);
640 #  define jmpi_p(i0)			_jmpi_p(_jit,i0)
641 static jit_word_t _jmpi_p(jit_state_t*, jit_word_t);
642 #define callr(r0)			_callr(_jit,r0)
643 static void _callr(jit_state_t*, jit_int32_t);
644 #  define calli(i0)			_calli(_jit,i0)
645 static void _calli(jit_state_t*, jit_word_t);
646 #  define calli_p(i0)			_calli_p(_jit,i0)
647 static jit_word_t _calli_p(jit_state_t*, jit_word_t);
648 #  define prolog(node)			_prolog(_jit,node)
649 static void _prolog(jit_state_t*,jit_node_t*);
650 #  define epilog(node)			_epilog(_jit,node)
651 static void _epilog(jit_state_t*,jit_node_t*);
652 #  define vastart(r0)			_vastart(_jit, r0)
653 static void _vastart(jit_state_t*, jit_int32_t);
654 #  define vaarg(r0, r1)			_vaarg(_jit, r0, r1)
655 static void _vaarg(jit_state_t*, jit_int32_t, jit_int32_t);
656 #  define patch_at(jump,label)		_patch_at(_jit,jump,label)
657 static void _patch_at(jit_state_t*,jit_word_t,jit_word_t);
658 #endif
659 
660 #if CODE
661 static void
_Pcd(jit_state_t * _jit,int o,unsigned int n)662 _Pcd(jit_state_t *_jit, int o, unsigned int n)
663 {
664     assert(_u6_p(o));
665     assert(_u26_p(n));
666     ii((o<<26)|_u26(n));
667 }
668 
669 static void
_Bra(jit_state_t * _jit,int o,int ra,int d)670 _Bra(jit_state_t *_jit, int o, int ra, int d)
671 {
672     assert(_u6_p(o));
673     assert(_u5_p(ra));
674     assert(_s21_p(d));
675     ii((o<<26)|(ra<<21)|_u21(d));
676 }
677 
678 static void
_Mem(jit_state_t * _jit,int o,int ra,int rb,unsigned int d)679 _Mem(jit_state_t *_jit, int o, int ra, int rb, unsigned int d)
680 {
681     assert(_u6_p(o));
682     assert(_u5_p(ra));
683     assert(_u5_p(rb));
684     assert(_u16_p(d));
685     ii((o<<26)|(ra<<21)|(rb<<16)|_u16(d));
686 }
687 
688 static void
_Mbr(jit_state_t * _jit,int o,int ra,int rb,int h,int d)689 _Mbr(jit_state_t *_jit, int o, int ra, int rb, int h, int d)
690 {
691     assert(_u6_p(o));
692     assert(_u5_p(ra));
693     assert(_u5_p(rb));
694     assert(_u2_p(h));
695     assert(_s14_p(d));
696     ii((o<<26)|(ra<<21)|(rb<<16)|(h<<14)|_u14(d));
697 }
698 
699 static void
_Opr(jit_state_t * _jit,int o,int ra,int rb,unsigned int f,int rc)700 _Opr(jit_state_t *_jit, int o, int ra, int rb, unsigned int f, int rc)
701 {
702     assert(_u6_p(o));
703     assert(_u5_p(ra));
704     assert(_u5_p(rb));
705     assert(_u5_p(rc));
706     assert(_u11_p(f));
707     ii((o<<26)|(ra<<21)|(rb<<16)|(_u11(f)<<5)|rc);
708 }
709 
710 static void
_Opi(jit_state_t * _jit,int o,int ra,unsigned int i,unsigned int f,int rc)711 _Opi(jit_state_t *_jit, int o, int ra, unsigned int i, unsigned int f, int rc)
712 {
713     assert(_u6_p(o));
714     assert(_u5_p(ra));
715     assert(_u8_p(i));
716     assert(_u5_p(rc));
717     assert(_u7_p(f));
718     ii((o<<26)|(ra<<21)|(_u8(i)<<13)|(1<<12)|(_u7(f)<<5)|rc);
719 }
720 
721 static void
_nop(jit_state_t * _jit,jit_int32_t i0)722 _nop(jit_state_t *_jit, jit_int32_t i0)
723 {
724     for (; i0 > 0; i0 -= 4)
725 	NOP();
726     assert(i0 == 0);
727 }
728 
729 static void
_movr(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1)730 _movr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
731 {
732     if (r0 != r1)
733 	MOV(r1, r0);
734 }
735 
736 static void
_movi(jit_state_t * _jit,jit_int32_t r0,jit_word_t i0)737 _movi(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
738 {
739     jit_int32_t		reg;
740     jit_int16_t		s0, s1, s2, s3;
741     s0 = i0;
742     s1 = i0 >> 16;
743     s2 = i0 >> 32;
744     s3 = i0 >> 48;
745     if (s0 < 0)
746 	++s1;
747     if (s2 < 0)
748 	++s3;
749     if (_u8_p(i0))
750 	MOVi(_u8(i0), r0);
751     else if (_s16_p(i0))
752 	LDA(r0, _R31_REGNO, _u16(s0));
753     else if (_s32_p(i0)) {
754 	LDA(r0, _R31_REGNO, _u16(s0));
755 	LDAH(r0, r0, _u16(s1));
756     }
757     else if (_u32_p(i0)) {
758 	LDA(r0, _R31_REGNO, _u16(s0));
759 	if (s1)
760 	    LDAH(r0, r0, _u16(s1));
761 	lshi(r0, r0, 32);
762 	rshi_u(r0, r0, 32);
763     }
764     else if (_u32(i0) == 0) {
765 	LDA(r0, _R31_REGNO, _u16(s2));
766 	if (s3)
767 	    LDAH(r0, r0, _u16(s3));
768 	lshi(r0, r0, 32);
769     }
770     else {
771 	reg = jit_get_reg(jit_class_gpr);
772 	LDA(r0, _R31_REGNO, _u16(s0));
773 	LDA(rn(reg), _R31_REGNO, _u16(s2));
774 	if (s1)
775 	    LDAH(r0, r0, _u16(s1));
776 	if (s3)
777 	    LDAH(rn(reg), rn(reg), _u16(s3));
778 	lshi(r0, r0, 32);
779 	rshi_u(r0, r0, 32);
780 	lshi(rn(reg), rn(reg), 32);
781 	orr(r0, r0, rn(reg));
782 	jit_unget_reg(reg);
783     }
784 }
785 
786 static jit_word_t
_movi_p(jit_state_t * _jit,jit_int32_t r0,jit_word_t i0)787 _movi_p(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
788 {
789     jit_word_t		w;
790     jit_int32_t		reg;
791     jit_int16_t		s0, s1, s2, s3;
792     w = _jit->pc.w;
793     reg = jit_get_reg(jit_class_gpr);
794     s0 = i0;
795     s1 = i0 >> 16;
796     s2 = i0 >> 32;
797     s3 = i0 >> 48;
798     if (s0 < 0)
799 	++s1;
800     if (s2 < 0)
801 	++s3;
802     LDA(r0, _R31_REGNO, _u16(s0));
803     LDA(rn(reg), _R31_REGNO, _u16(s2));
804     LDAH(r0, r0, _u16(s1));
805     LDAH(rn(reg), rn(reg), _u16(s3));
806     lshi(r0, r0, 32);
807     rshi_u(r0, r0, 32);
808     lshi(rn(reg), rn(reg), 32);
809     orr(r0, r0, rn(reg));
810     jit_unget_reg(reg);
811     return (w);
812 }
813 
814 static void
_addi(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_word_t i0)815 _addi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
816 {
817     jit_int32_t		reg;
818     if (_u8_p(i0))
819 	ADDQi(r1, i0, r0);
820     else if (_s16_p(i0))
821 	LDA(r0, r1, _u16(i0));
822     else {
823 	reg = jit_get_reg(jit_class_gpr);
824 	movi(rn(reg), i0);
825 	addr(r0, r1, rn(reg));
826 	jit_unget_reg(reg);
827     }
828 }
829 
830 static void
_addcr(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_int32_t r2)831 _addcr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
832 {
833     jit_int32_t		reg;
834     if (jit_carry == _NOREG)
835 	jit_carry = jit_get_reg(jit_class_gpr);
836     if (r0 == r1) {
837 	reg = jit_get_reg(jit_class_gpr);
838 	addr(rn(reg), r1, r2);
839 	ltr_u(rn(jit_carry), rn(reg), r1);
840 	movr(r0, rn(reg));
841 	jit_unget_reg(reg);
842     }
843     else {
844 	addr(r0, r1, r2);
845 	ltr_u(rn(jit_carry), r0, r1);
846     }
847 }
848 
849 static void
_addci(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_word_t i0)850 _addci(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
851 {
852     jit_int32_t		reg;
853     if (jit_carry == _NOREG)
854 	jit_carry = jit_get_reg(jit_class_gpr);
855     if (r0 == r1) {
856 	reg = jit_get_reg(jit_class_gpr);
857 	addi(rn(reg), r1, i0);
858 	ltr_u(rn(jit_carry), rn(reg), r1);
859 	movr(r0, rn(reg));
860 	jit_unget_reg(reg);
861     }
862     else {
863 	addi(r0, r1, i0);
864 	ltr_u(rn(jit_carry), r0, r1);
865     }
866 }
867 
868 static void
_addxr(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_int32_t r2)869 _addxr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
870 {
871     jit_int32_t		reg;
872     assert(jit_carry != _NOREG);
873     reg = jit_get_reg(jit_class_gpr);
874     movr(rn(reg), rn(jit_carry));
875     addcr(r0, r1, r2);
876     addcr(r0, r0, rn(reg));
877     jit_unget_reg(reg);
878 }
879 
880 static void
_addxi(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_word_t i0)881 _addxi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
882 {
883     jit_int32_t		reg;
884     assert(jit_carry != _NOREG);
885     reg = jit_get_reg(jit_class_gpr);
886     movr(rn(reg), rn(jit_carry));
887     addci(r0, r1, i0);
888     addcr(r0, r0, rn(reg));
889     jit_unget_reg(reg);
890 }
891 
892 static void
_subi(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_word_t i0)893 _subi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
894 {
895     jit_int32_t		reg;
896     if (_u8_p(i0))
897 	SUBQi(r1, i0, r0);
898     else if (_s16_p(-i0))
899 	LDA(r0, r1, _u16(-i0));
900     else {
901 	reg = jit_get_reg(jit_class_gpr);
902 	movi(rn(reg), i0);
903 	subr(r0, r1, rn(reg));
904 	jit_unget_reg(reg);
905     }
906 }
907 
908 static void
_subcr(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_int32_t r2)909 _subcr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
910 {
911     jit_int32_t		reg;
912     if (jit_carry == _NOREG)
913 	jit_carry = jit_get_reg(jit_class_gpr);
914     if (r0 == r1) {
915 	reg = jit_get_reg(jit_class_gpr);
916 	subr(rn(reg), r1, r2);
917 	ltr_u(rn(jit_carry), r1, rn(reg));
918 	movr(r0, rn(reg));
919 	jit_unget_reg(reg);
920     }
921     else {
922 	subr(r0, r1, r2);
923 	ltr_u(rn(jit_carry), r1, r0);
924     }
925 }
926 
927 static void
_subci(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_word_t i0)928 _subci(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
929 {
930     jit_int32_t		reg;
931     if (jit_carry == _NOREG)
932 	jit_carry = jit_get_reg(jit_class_gpr);
933     if (r0 == r1) {
934 	reg = jit_get_reg(jit_class_gpr);
935 	addi(rn(reg), r1, -i0);
936 	ltr_u(rn(jit_carry), r1, rn(reg));
937 	movr(r0, rn(reg));
938 	jit_unget_reg(reg);
939     }
940     else {
941 	addi(r0, r1, -i0);
942 	ltr_u(rn(jit_carry), r1, r0);
943     }
944 }
945 
946 static void
_subxr(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_int32_t r2)947 _subxr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
948 {
949     jit_int32_t		reg;
950     assert(jit_carry != _NOREG);
951     reg = jit_get_reg(jit_class_gpr);
952     movr(rn(reg), rn(jit_carry));
953     subcr(r0, r1, r2);
954     subcr(r0, r0, rn(reg));
955     jit_unget_reg(reg);
956 }
957 
958 static void
_subxi(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_word_t i0)959 _subxi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
960 {
961     jit_int32_t		reg;
962     assert(jit_carry != _NOREG);
963     reg = jit_get_reg(jit_class_gpr);
964     movr(rn(reg), rn(jit_carry));
965     subci(r0, r1, i0);
966     subcr(r0, r0, rn(reg));
967     jit_unget_reg(reg);
968 }
969 
970 static void
_rsbi(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_word_t i0)971 _rsbi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
972 {
973     subi(r0, r1, i0);
974     negr(r0, r0);
975 }
976 
977 static void
_muli(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_word_t i0)978 _muli(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
979 {
980     jit_int32_t		reg;
981     if (_u8_p(i0))
982 	MULQi(r1, i0, r0);
983     else {
984 	reg = jit_get_reg(jit_class_gpr);
985 	movi(rn(reg), i0);
986 	mulr(r0, r1, rn(reg));
987 	jit_unget_reg(reg);
988     }
989 }
990 
991 static void
_qmulr(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_int32_t r2,jit_int32_t r3)992 _qmulr(jit_state_t *_jit, jit_int32_t r0,
993        jit_int32_t r1, jit_int32_t r2, jit_int32_t r3)
994 {
995     jit_int32_t		reg;
996     /* The only invalid condition is r0 == r1 */
997     jit_int32_t		t2, t3, s2, s3;
998     if (r2 == r0 || r2 == r1) {
999 	s2 = jit_get_reg(jit_class_gpr);
1000 	t2 = rn(s2);
1001 	movr(t2, r2);
1002     }
1003     else
1004 	t2 = r2;
1005     if (r3 == r0 || r3 == r1) {
1006 	s3 = jit_get_reg(jit_class_gpr);
1007 	t3 = rn(s3);
1008 	movr(t3, r3);
1009     }
1010     else
1011 	t3 = r3;
1012     qmulr_u(r0, r1, r2, r3);
1013     reg = jit_get_reg(jit_class_gpr);
1014     /**/
1015     rshi(rn(reg), t2, 63);
1016     mulr(rn(reg), rn(reg), t3);
1017     addr(r1, r1, rn(reg));
1018     /**/
1019     rshi(rn(reg), t3, 63);
1020     mulr(rn(reg), rn(reg), t2);
1021     addr(r1, r1, rn(reg));
1022     jit_unget_reg(reg);
1023     if (t2 != r2)
1024 	jit_unget_reg(s2);
1025     if (t3 != r3)
1026 	jit_unget_reg(s3);
1027 }
1028 
1029 static void
_qmuli(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_int32_t r2,jit_word_t i0)1030 _qmuli(jit_state_t *_jit, jit_int32_t r0,
1031        jit_int32_t r1, jit_int32_t r2, jit_word_t i0)
1032 {
1033     jit_int32_t		reg;
1034     reg = jit_get_reg(jit_class_gpr);
1035     movi(rn(reg), i0);
1036     qmulr(r0, r1, r2, rn(reg));
1037     jit_unget_reg(reg);
1038 }
1039 
1040 static void
_qmulr_u(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_int32_t r2,jit_int32_t r3)1041 _qmulr_u(jit_state_t *_jit, jit_int32_t r0,
1042 	 jit_int32_t r1, jit_int32_t r2, jit_int32_t r3)
1043 {
1044     jit_int32_t		reg;
1045     if (r0 == r2 || r0 == r3) {
1046 	reg = jit_get_reg(jit_class_gpr);
1047 	mulr(rn(reg), r2, r3);
1048     }
1049     else
1050 	mulr(r0, r2, r3);
1051     UMULH(r2, r3, r1);
1052     if (r0 == r2 || r0 == r3) {
1053 	movr(r0, rn(reg));
1054 	jit_unget_reg(reg);
1055     }
1056 }
1057 
1058 static void
_qmuli_u(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_int32_t r2,jit_word_t i0)1059 _qmuli_u(jit_state_t *_jit, jit_int32_t r0,
1060 	 jit_int32_t r1, jit_int32_t r2, jit_word_t i0)
1061 {
1062     jit_int32_t		reg;
1063     if (_u8_p(i0)) {
1064 	if (r0 == r2) {
1065 	    reg = jit_get_reg(jit_class_gpr);
1066 	    muli(rn(reg), r2, i0);
1067 	}
1068 	else
1069 	    muli(r0, r2, i0);
1070 	UMULHi(r2, i0, r1);
1071 	if (r0 == r2) {
1072 	    movr(r0, rn(reg));
1073 	    jit_unget_reg(reg);
1074 	}
1075     }
1076     else {
1077 	reg = jit_get_reg(jit_class_gpr);
1078 	movi(rn(reg), i0);
1079 	qmulr_u(r0, r1, r2, rn(reg));
1080 	jit_unget_reg(reg);
1081     }
1082 }
1083 
1084 static jit_word_t
__idiv(jit_word_t u,jit_word_t v)1085 __idiv(jit_word_t u, jit_word_t v)
1086 {
1087     return (u / v);
1088 }
1089 
1090 static void
_divr(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_int32_t r2)1091 _divr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1092 {
1093     movr(_A0_REGNO, r1);
1094     movr(_A1_REGNO, r2);
1095     calli((jit_word_t)__idiv);
1096     movr(r0, _V0_REGNO);
1097 }
1098 
1099 static void
_divi(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_word_t i0)1100 _divi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1101 {
1102     movr(_A0_REGNO, r1);
1103     movi(_A1_REGNO, i0);
1104     calli((jit_word_t)__idiv);
1105     movr(r0, _V0_REGNO);
1106 }
1107 
1108 static jit_uword_t
__udiv(jit_uword_t u,jit_uword_t v)1109 __udiv(jit_uword_t u, jit_uword_t v)
1110 {
1111     return (u / v);
1112 }
1113 
1114 static void
_divr_u(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_int32_t r2)1115 _divr_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1116 {
1117     movr(_A0_REGNO, r1);
1118     movr(_A1_REGNO, r2);
1119     calli((jit_word_t)__udiv);
1120     movr(r0, _V0_REGNO);
1121 }
1122 
1123 static void
_divi_u(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_word_t i0)1124 _divi_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1125 {
1126     movr(_A0_REGNO, r1);
1127     movi(_A1_REGNO, i0);
1128     calli((jit_word_t)__udiv);
1129     movr(r0, _V0_REGNO);
1130 }
1131 
1132 static jit_word_t
__irem(jit_word_t u,jit_word_t v)1133 __irem(jit_word_t u, jit_word_t v)
1134 {
1135     return (u % v);
1136 }
1137 
1138 static void
_remr(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_int32_t r2)1139 _remr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1140 {
1141     movr(_A0_REGNO, r1);
1142     movr(_A1_REGNO, r2);
1143     calli((jit_word_t)__irem);
1144     movr(r0, _V0_REGNO);
1145 }
1146 
1147 static void
_remi(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_word_t i0)1148 _remi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1149 {
1150     movr(_A0_REGNO, r1);
1151     movi(_A1_REGNO, i0);
1152     calli((jit_word_t)__irem);
1153     movr(r0, _V0_REGNO);
1154 }
1155 
1156 static jit_uword_t
__urem(jit_uword_t u,jit_uword_t v)1157 __urem(jit_uword_t u, jit_uword_t v)
1158 {
1159     return (u % v);
1160 }
1161 
1162 static void
_remr_u(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_int32_t r2)1163 _remr_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1164 {
1165     movr(_A0_REGNO, r1);
1166     movr(_A1_REGNO, r2);
1167     calli((jit_word_t)__urem);
1168     movr(r0, _V0_REGNO);
1169 }
1170 
1171 static void
_remi_u(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_word_t i0)1172 _remi_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1173 {
1174     movr(_A0_REGNO, r1);
1175     movi(_A1_REGNO, i0);
1176     calli((jit_word_t)__urem);
1177     movr(r0, _V0_REGNO);
1178 }
1179 
1180 static jit_word_t
__idivrem(jit_word_t u,jit_word_t v,jit_word_t * rem)1181 __idivrem(jit_word_t u, jit_word_t v, jit_word_t *rem)
1182 {
1183     *rem = u % v;
1184     return (u / v);
1185 }
1186 
1187 static void
_qdivr(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_int32_t r2,jit_int32_t r3)1188 _qdivr(jit_state_t *_jit,
1189        jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_int32_t r3)
1190 {
1191     movr(_A0_REGNO, r2);
1192     movr(_A1_REGNO, r3);
1193     subi(_A2_REGNO, _FP_REGNO, 8);
1194     calli((jit_word_t)__idivrem);
1195     movr(r0, _V0_REGNO);
1196     ldxi(r1, _FP_REGNO, -8);
1197 }
1198 
1199 static void
_qdivi(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_int32_t r2,jit_word_t i0)1200 _qdivi(jit_state_t *_jit,
1201        jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_word_t i0)
1202 {
1203     movr(_A0_REGNO, r2);
1204     movi(_A1_REGNO, i0);
1205     subi(_A2_REGNO, _FP_REGNO, 8);
1206     calli((jit_word_t)__idivrem);
1207     movr(r0, _V0_REGNO);
1208     ldxi(r1, _FP_REGNO, -8);
1209 }
1210 
1211 static jit_word_t
__udivrem(jit_uword_t u,jit_uword_t v,jit_uword_t * rem)1212 __udivrem(jit_uword_t u, jit_uword_t v, jit_uword_t *rem)
1213 {
1214     *rem = u % v;
1215     return (u / v);
1216 }
1217 
1218 static void
_qdivr_u(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_int32_t r2,jit_int32_t r3)1219 _qdivr_u(jit_state_t *_jit,
1220 	 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_int32_t r3)
1221 {
1222     movr(_A0_REGNO, r2);
1223     movr(_A1_REGNO, r3);
1224     subi(_A2_REGNO, _FP_REGNO, 8);
1225     calli((jit_word_t)__udivrem);
1226     movr(r0, _V0_REGNO);
1227     ldxi(r1, _FP_REGNO, -8);
1228 }
1229 
1230 static void
_qdivi_u(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_int32_t r2,jit_word_t i0)1231 _qdivi_u(jit_state_t *_jit,
1232 	 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_word_t i0)
1233 {
1234     movr(_A0_REGNO, r2);
1235     movi(_A1_REGNO, i0);
1236     subi(_A2_REGNO, _FP_REGNO, 8);
1237     calli((jit_word_t)__udivrem);
1238     movr(r0, _V0_REGNO);
1239     ldxi(r1, _FP_REGNO, -8);
1240 }
1241 
1242 static void
_lshi(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_word_t i0)1243 _lshi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1244 {
1245     assert(i0 >= 0 && i0 < 64);
1246     SLLi(r1, i0, r0);
1247 }
1248 
1249 static void
_rshi(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_word_t i0)1250 _rshi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1251 {
1252     assert(i0 >= 0 && i0 < 64);
1253     SRAi(r1, i0, r0);
1254 }
1255 
1256 static void
_rshi_u(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_word_t i0)1257 _rshi_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1258 {
1259     assert(i0 >= 0 && i0 < 64);
1260     SRLi(r1, i0, r0);
1261 }
1262 
1263 static void
_andi(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_word_t i0)1264 _andi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1265 {
1266     jit_int32_t		reg;
1267     if (_u8_p(i0))
1268 	ANDi(r1, i0, r0);
1269     else {
1270 	reg = jit_get_reg(jit_class_gpr);
1271 	movi(rn(reg), i0);
1272 	andr(r0, r1, rn(reg));
1273 	jit_unget_reg(reg);
1274     }
1275 }
1276 
1277 static void
_ori(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_word_t i0)1278 _ori(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1279 {
1280     jit_int32_t		reg;
1281     if (_u8_p(i0))
1282 	ORi(r1, i0, r0);
1283     else {
1284 	reg = jit_get_reg(jit_class_gpr);
1285 	movi(rn(reg), i0);
1286 	orr(r0, r1, rn(reg));
1287 	jit_unget_reg(reg);
1288     }
1289 }
1290 
1291 static void
_xori(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_word_t i0)1292 _xori(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1293 {
1294     jit_int32_t		reg;
1295     if (_u8_p(i0))
1296 	XORi(r1, i0, r0);
1297     else {
1298 	reg = jit_get_reg(jit_class_gpr);
1299 	movi(rn(reg), i0);
1300 	xorr(r0, r1, rn(reg));
1301 	jit_unget_reg(reg);
1302     }
1303 }
1304 
1305 static void
_lti(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_word_t i0)1306 _lti(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1307 {
1308     jit_int32_t		reg;
1309     if (_u8_p(i0))
1310 	CMPLTi(r1, i0, r0);
1311     else {
1312 	reg = jit_get_reg(jit_class_gpr);
1313 	movi(rn(reg), i0);
1314 	ltr(r0, r1, rn(reg));
1315 	jit_unget_reg(reg);
1316     }
1317 }
1318 
1319 static void
_lti_u(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_word_t i0)1320 _lti_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1321 {
1322     jit_int32_t		reg;
1323     if (_u8_p(i0))
1324 	CMPULTi(r1, i0, r0);
1325     else {
1326 	reg = jit_get_reg(jit_class_gpr);
1327 	movi(rn(reg), i0);
1328 	ltr_u(r0, r1, rn(reg));
1329 	jit_unget_reg(reg);
1330     }
1331 }
1332 
1333 static void
_lei(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_word_t i0)1334 _lei(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1335 {
1336     jit_int32_t		reg;
1337     if (_u8_p(i0))
1338 	CMPLEi(r1, i0, r0);
1339     else {
1340 	reg = jit_get_reg(jit_class_gpr);
1341 	movi(rn(reg), i0);
1342 	ler(r0, r1, rn(reg));
1343 	jit_unget_reg(reg);
1344     }
1345 }
1346 
1347 static void
_lei_u(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_word_t i0)1348 _lei_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1349 {
1350     jit_int32_t		reg;
1351     jit_word_t		ni0;
1352     ni0 = -i0;
1353     if (_u8_p(i0))
1354 	CMPULEi(r1, i0, r0);
1355     else {
1356 	reg = jit_get_reg(jit_class_gpr);
1357 	movi(rn(reg), i0);
1358 	ler_u(r0, r1, rn(reg));
1359 	jit_unget_reg(reg);
1360     }
1361 }
1362 
1363 static void
_eqi(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_word_t i0)1364 _eqi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1365 {
1366     jit_int32_t		reg;
1367     if (_u8_p(i0))
1368 	CMPEQi(r1, i0, r0);
1369     else {
1370 	reg = jit_get_reg(jit_class_gpr);
1371 	movi(rn(reg), i0);
1372 	eqr(r0, r1, rn(reg));
1373 	jit_unget_reg(reg);
1374     }
1375 }
1376 
1377 static void
_gei(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_word_t i0)1378 _gei(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1379 {
1380     jit_int32_t		reg;
1381     reg = jit_get_reg(jit_class_gpr);
1382     movi(rn(reg), i0);
1383     ger(r0, r1, rn(reg));
1384     jit_unget_reg(reg);
1385 }
1386 
1387 static void
_gei_u(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_word_t i0)1388 _gei_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1389 {
1390     jit_int32_t		reg;
1391     reg = jit_get_reg(jit_class_gpr);
1392     movi(rn(reg), i0);
1393     ger_u(r0, r1, rn(reg));
1394     jit_unget_reg(reg);
1395 }
1396 
1397 static void
_gti(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_word_t i0)1398 _gti(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1399 {
1400     jit_int32_t		reg;
1401     reg = jit_get_reg(jit_class_gpr);
1402     movi(rn(reg), i0);
1403     gtr(r0, r1, rn(reg));
1404     jit_unget_reg(reg);
1405 }
1406 
1407 static void
_gti_u(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_word_t i0)1408 _gti_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1409 {
1410     jit_int32_t		reg;
1411     reg = jit_get_reg(jit_class_gpr);
1412     movi(rn(reg), i0);
1413     gtr_u(r0, r1, rn(reg));
1414     jit_unget_reg(reg);
1415 }
1416 
1417 static void
_ner(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_int32_t r2)1418 _ner(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1419 {
1420     CMPEQ(r1, r2, r0);
1421     CMPEQi(r0, 0, r0);
1422 }
1423 
1424 static void
_nei(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_word_t i0)1425 _nei(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1426 {
1427     jit_int32_t		reg;
1428     if (_u8_p(i0)) {
1429 	CMPEQi(r1, i0, r0);
1430 	CMPEQi(r0, 0, r0);
1431     }
1432     else {
1433 	reg = jit_get_reg(jit_class_gpr);
1434 	movi(rn(reg), i0);
1435 	ner(r0, r1, rn(reg));
1436 	jit_unget_reg(reg);
1437     }
1438 }
1439 
1440 static jit_word_t
_bltr(jit_state_t * _jit,jit_word_t i0,jit_int32_t r0,jit_int32_t r1)1441 _bltr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
1442 {
1443     jit_word_t		w;
1444     jit_int32_t		reg;
1445     reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1446     ltr(rn(reg), r0, r1);
1447     w = _jit->pc.w;
1448     BNE(rn(reg), ((i0 - w) >> 2) - 1);
1449     jit_unget_reg(reg);
1450     return (w);
1451 }
1452 
1453 static jit_word_t
_blti(jit_state_t * _jit,jit_word_t i0,jit_int32_t r0,jit_word_t i1)1454 _blti(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
1455 {
1456     jit_word_t		w;
1457     jit_int32_t		reg;
1458     if (i1 == 0) {
1459 	w = _jit->pc.w;
1460 	BLT(r0, ((i0 - w) >> 2) - 1);
1461     }
1462     else {
1463 	reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1464 	lti(rn(reg), r0, i1);
1465 	w = _jit->pc.w;
1466 	BNE(rn(reg), ((i0 - w) >> 2) - 1);
1467 	jit_unget_reg(reg);
1468     }
1469     return (w);
1470 }
1471 
1472 static jit_word_t
_bltr_u(jit_state_t * _jit,jit_word_t i0,jit_int32_t r0,jit_int32_t r1)1473 _bltr_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
1474 {
1475     jit_word_t		w;
1476     jit_int32_t		reg;
1477     reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1478     ltr_u(rn(reg), r0, r1);
1479     w = _jit->pc.w;
1480     BNE(rn(reg), ((i0 - w) >> 2) - 1);
1481     jit_unget_reg(reg);
1482     return (w);
1483 }
1484 
1485 static jit_word_t
_blti_u(jit_state_t * _jit,jit_word_t i0,jit_int32_t r0,jit_word_t i1)1486 _blti_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
1487 {
1488     jit_word_t		w;
1489     jit_int32_t		reg;
1490     /* FIXME cannot optimize zero because need to return a patcheable address */
1491     reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1492     lti_u(rn(reg), r0, i1);
1493     w = _jit->pc.w;
1494     BNE(rn(reg), ((i0 - w) >> 2) - 1);
1495     jit_unget_reg(reg);
1496     return (w);
1497 }
1498 
1499 static jit_word_t
_bler(jit_state_t * _jit,jit_word_t i0,jit_int32_t r0,jit_int32_t r1)1500 _bler(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
1501 {
1502     jit_word_t		w;
1503     jit_int32_t		reg;
1504     reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1505     ler(rn(reg), r0, r1);
1506     w = _jit->pc.w;
1507     BNE(rn(reg), ((i0 - w) >> 2) - 1);
1508     jit_unget_reg(reg);
1509     return (w);
1510 }
1511 
1512 static jit_word_t
_blei(jit_state_t * _jit,jit_word_t i0,jit_int32_t r0,jit_word_t i1)1513 _blei(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
1514 {
1515     jit_word_t		w;
1516     jit_int32_t		reg;
1517     if (i1 == 0) {
1518 	w = _jit->pc.w;
1519 	BLE(r0, ((i0 - w) >> 2) - 1);
1520     }
1521     else {
1522 	reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1523 	lei(rn(reg), r0, i1);
1524 	w = _jit->pc.w;
1525 	BNE(rn(reg), ((i0 - w) >> 2) - 1);
1526 	jit_unget_reg(reg);
1527     }
1528     return (w);
1529 }
1530 
1531 static jit_word_t
_bler_u(jit_state_t * _jit,jit_word_t i0,jit_int32_t r0,jit_int32_t r1)1532 _bler_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
1533 {
1534     jit_word_t		w;
1535     jit_int32_t		reg;
1536     reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1537     ler_u(rn(reg), r0, r1);
1538     w = _jit->pc.w;
1539     BNE(rn(reg), ((i0 - w) >> 2) - 1);
1540     jit_unget_reg(reg);
1541     return (w);
1542 }
1543 
1544 static jit_word_t
_blei_u(jit_state_t * _jit,jit_word_t i0,jit_int32_t r0,jit_word_t i1)1545 _blei_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
1546 {
1547     jit_word_t		w;
1548     jit_int32_t		reg;
1549     if (i1 == 0) {
1550 	w = _jit->pc.w;
1551 	BEQ(r0, ((i0 - w) >> 2) - 1);
1552     }
1553     else {
1554 	reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1555 	lei_u(rn(reg), r0, i1);
1556 	w = _jit->pc.w;
1557 	BNE(rn(reg), ((i0 - w) >> 2) - 1);
1558 	jit_unget_reg(reg);
1559      }
1560     return (w);
1561 }
1562 
1563 static jit_word_t
_beqr(jit_state_t * _jit,jit_word_t i0,jit_int32_t r0,jit_int32_t r1)1564 _beqr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
1565 {
1566     jit_word_t		w;
1567     jit_int32_t		reg;
1568     reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1569     eqr(rn(reg), r0, r1);
1570     w = _jit->pc.w;
1571     BNE(rn(reg), ((i0 - w) >> 2) - 1);
1572     jit_unget_reg(reg);
1573     return (w);
1574 }
1575 
1576 static jit_word_t
_beqi(jit_state_t * _jit,jit_word_t i0,jit_int32_t r0,jit_word_t i1)1577 _beqi(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
1578 {
1579     jit_word_t		w;
1580     jit_int32_t		reg;
1581     if (i1 == 0) {
1582 	w = _jit->pc.w;
1583 	BEQ(r0, ((i0 - w) >> 2) - 1);
1584     }
1585     else {
1586 	reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1587 	eqi(rn(reg), r0, i1);
1588 	w = _jit->pc.w;
1589 	BNE(rn(reg), ((i0 - w) >> 2) - 1);
1590 	jit_unget_reg(reg);
1591     }
1592     return (w);
1593 }
1594 
1595 static jit_word_t
_bger(jit_state_t * _jit,jit_word_t i0,jit_int32_t r0,jit_int32_t r1)1596 _bger(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
1597 {
1598     jit_word_t		w;
1599     jit_int32_t		reg;
1600     reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1601     ger(rn(reg), r0, r1);
1602     w = _jit->pc.w;
1603     BNE(rn(reg), ((i0 - w) >> 2) - 1);
1604     jit_unget_reg(reg);
1605     return (w);
1606 }
1607 
1608 static jit_word_t
_bgei(jit_state_t * _jit,jit_word_t i0,jit_int32_t r0,jit_word_t i1)1609 _bgei(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
1610 {
1611     jit_word_t		w;
1612     jit_int32_t		reg;
1613     if (i1 == 0) {
1614 	w = _jit->pc.w;
1615 	BGE(r0, ((i0 - w) >> 2) - 1);
1616     }
1617     else {
1618 	reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1619 	gei(rn(reg), r0, i1);
1620 	w = _jit->pc.w;
1621 	BNE(rn(reg), ((i0 - w) >> 2) - 1);
1622 	jit_unget_reg(reg);
1623     }
1624     return (w);
1625 }
1626 
1627 static jit_word_t
_bger_u(jit_state_t * _jit,jit_word_t i0,jit_int32_t r0,jit_int32_t r1)1628 _bger_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
1629 {
1630     jit_word_t		w;
1631     jit_int32_t		reg;
1632     reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1633     ger_u(rn(reg), r0, r1);
1634     w = _jit->pc.w;
1635     BNE(rn(reg), ((i0 - w) >> 2) - 1);
1636     jit_unget_reg(reg);
1637     return (w);
1638 }
1639 
1640 static jit_word_t
_bgei_u(jit_state_t * _jit,jit_word_t i0,jit_int32_t r0,jit_word_t i1)1641 _bgei_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
1642 {
1643     jit_word_t		w;
1644     jit_int32_t		reg;
1645     /* always true if i1 == 0 */
1646     if (i0 == 0) {
1647 	w = _jit->pc.w;
1648 	BR(r0, ((i0 - w) >> 2) - 1);
1649     }
1650     else {
1651 	reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1652 	gei_u(rn(reg), r0, i1);
1653 	w = _jit->pc.w;
1654 	BNE(rn(reg), ((i0 - w) >> 2) - 1);
1655 	jit_unget_reg(reg);
1656     }
1657     return (w);
1658 }
1659 
1660 static jit_word_t
_bgtr(jit_state_t * _jit,jit_word_t i0,jit_int32_t r0,jit_int32_t r1)1661 _bgtr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
1662 {
1663     jit_word_t		w;
1664     jit_int32_t		reg;
1665     reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1666     gtr(rn(reg), r0, r1);
1667     w = _jit->pc.w;
1668     BNE(rn(reg), ((i0 - w) >> 2) - 1);
1669     jit_unget_reg(reg);
1670     return (w);
1671 }
1672 
1673 static jit_word_t
_bgti(jit_state_t * _jit,jit_word_t i0,jit_int32_t r0,jit_word_t i1)1674 _bgti(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
1675 {
1676     jit_word_t		w;
1677     jit_int32_t		reg;
1678     if (i1 == 0) {
1679 	w = _jit->pc.w;
1680 	BGT(r0, ((i0 - w) >> 2) - 1);
1681     }
1682     else {
1683 	reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1684 	gti(rn(reg), r0, i1);
1685 	w = _jit->pc.w;
1686 	BNE(rn(reg), ((i0 - w) >> 2) - 1);
1687 	jit_unget_reg(reg);
1688     }
1689     return (w);
1690 }
1691 
1692 static jit_word_t
_bgtr_u(jit_state_t * _jit,jit_word_t i0,jit_int32_t r0,jit_int32_t r1)1693 _bgtr_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
1694 {
1695     jit_word_t		w;
1696     jit_int32_t		reg;
1697     reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1698     gtr_u(rn(reg), r0, r1);
1699     w = _jit->pc.w;
1700     BNE(rn(reg), ((i0 - w) >> 2) - 1);
1701     jit_unget_reg(reg);
1702     return (w);
1703 }
1704 
1705 static jit_word_t
_bgti_u(jit_state_t * _jit,jit_word_t i0,jit_int32_t r0,jit_word_t i1)1706 _bgti_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
1707 {
1708     jit_word_t		w;
1709     jit_int32_t		reg;
1710     reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1711     gti_u(rn(reg), r0, i1);
1712     w = _jit->pc.w;
1713     BNE(rn(reg), ((i0 - w) >> 2) - 1);
1714     jit_unget_reg(reg);
1715     return (w);
1716 }
1717 
1718 static jit_word_t
_bner(jit_state_t * _jit,jit_word_t i0,jit_int32_t r0,jit_int32_t r1)1719 _bner(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
1720 {
1721     jit_word_t		w;
1722     jit_int32_t		reg;
1723     reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1724     eqr(rn(reg), r0, r1);
1725     w = _jit->pc.w;
1726     BEQ(rn(reg), ((i0 - w) >> 2) - 1);
1727     jit_unget_reg(reg);
1728     return (w);
1729 }
1730 
1731 static jit_word_t
_bnei(jit_state_t * _jit,jit_word_t i0,jit_int32_t r0,jit_word_t i1)1732 _bnei(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
1733 {
1734     jit_word_t		w;
1735     jit_int32_t		reg;
1736     if (i1 == 0) {
1737 	w = _jit->pc.w;
1738 	BNE(r0, ((i0 - w) >> 2) - 1);
1739     }
1740     else {
1741 	reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1742 	eqi(rn(reg), r0, i1);
1743 	w = _jit->pc.w;
1744 	BEQ(rn(reg), ((i0 - w) >> 2) - 1);
1745 	jit_unget_reg(reg);
1746     }
1747     return (w);
1748 }
1749 
1750 static jit_word_t
_baddr(jit_state_t * _jit,jit_word_t i0,jit_int32_t r0,jit_int32_t r1,jit_bool_t carry)1751 _baddr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1,
1752        jit_bool_t carry)
1753 {
1754     jit_word_t		w;
1755     jit_int32_t		t0;
1756     jit_int32_t		t1;
1757     jit_int32_t		t2;
1758     jit_int32_t		t3;
1759     /* t0 = r0 + r1;	overflow = r1 < 0 ? r0 < t0 : t0 < r0 */
1760     t0 = jit_get_reg(jit_class_gpr);
1761     t1 = jit_get_reg(jit_class_gpr);
1762     t2 = jit_get_reg(jit_class_gpr);
1763     t3 = jit_get_reg(jit_class_gpr|jit_class_nospill);
1764     addr(rn(t0), r0, r1);		/* t0 = r0 + r1 */
1765     ltr(rn(t1), r1, _R31_REGNO);	/* t1 = r1 < 0 */
1766     ltr(rn(t2), r0, rn(t0));		/* t2 = r0 < t0 */
1767     ltr(rn(t3), rn(t0), r0);		/* t3 = t0 < r0 */
1768     movr(r0, rn(t0));			/* r0 += r1 */
1769     CMOVNE(rn(t1), rn(t2), rn(t3));	/* if (t1 == 0) t3 = t2; */
1770     jit_unget_reg(t2);
1771     jit_unget_reg(t1);
1772     jit_unget_reg(t0);
1773     w = _jit->pc.w;
1774     if (carry)
1775 	BNE(rn(t3), ((i0 - w) >> 2) - 1);
1776     else
1777 	BEQ(rn(t3), ((i0 - w) >> 2) - 1);
1778     jit_unget_reg(t3);
1779     return (w);
1780 }
1781 
1782 static jit_word_t
_baddi(jit_state_t * _jit,jit_word_t i0,jit_int32_t r0,jit_word_t i1,jit_bool_t carry)1783 _baddi(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1,
1784        jit_bool_t carry)
1785 {
1786     jit_word_t		w;
1787     jit_int32_t		reg;
1788     reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1789     movi(rn(reg), i1);
1790     w = baddr(i0, r0, rn(reg), carry);
1791     jit_unget_reg(reg);
1792     return (w);
1793 }
1794 
1795 static jit_word_t
_baddr_u(jit_state_t * _jit,jit_word_t i0,jit_int32_t r0,jit_int32_t r1,jit_bool_t carry)1796 _baddr_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1,
1797 	 jit_bool_t carry)
1798 {
1799     jit_word_t		w;
1800     jit_int32_t		t0;
1801     jit_int32_t		t1;
1802     t0 = jit_get_reg(jit_class_gpr);
1803     t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
1804     addr(rn(t0), r0, r1);
1805     ltr_u(rn(t1), rn(t0), r0);
1806     movr(r0, rn(t0));
1807     jit_unget_reg(t0);
1808     w = _jit->pc.w;
1809     if (carry)
1810 	BNE(rn(t1), ((i0 - w) >> 2) - 1);
1811     else
1812 	BEQ(rn(t1), ((i0 - w) >> 2) - 1);
1813     jit_unget_reg(t1);
1814     return (w);
1815 }
1816 
1817 static jit_word_t
_baddi_u(jit_state_t * _jit,jit_word_t i0,jit_int32_t r0,jit_word_t i1,jit_bool_t carry)1818 _baddi_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1,
1819 	 jit_bool_t carry)
1820 {
1821     jit_word_t		w;
1822     jit_int32_t		t0;
1823     jit_int32_t		t1;
1824     t0 = jit_get_reg(jit_class_gpr);
1825     t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
1826     addi(rn(t0), r0, i1);
1827     ltr_u(rn(t1), rn(t0), r0);
1828     movr(r0, rn(t0));
1829     jit_unget_reg(t0);
1830     w = _jit->pc.w;
1831     if (carry)
1832 	BNE(rn(t1), ((i0 - w) >> 2) - 1);
1833     else
1834 	BEQ(rn(t1), ((i0 - w) >> 2) - 1);
1835     jit_unget_reg(t1);
1836     return (w);
1837 }
1838 
1839 static jit_word_t
_bsubr(jit_state_t * _jit,jit_word_t i0,jit_int32_t r0,jit_int32_t r1,jit_bool_t carry)1840 _bsubr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1,
1841        jit_bool_t carry)
1842 {
1843     jit_word_t		w;
1844     jit_int32_t		t0;
1845     jit_int32_t		t1;
1846     jit_int32_t		t2;
1847     jit_int32_t		t3;
1848     /* t0 = r0 - r1;	overflow = 0 < r1 ? r0 < t0 : t0 < r0 */
1849     t0 = jit_get_reg(jit_class_gpr);
1850     t1 = jit_get_reg(jit_class_gpr);
1851     t2 = jit_get_reg(jit_class_gpr);
1852     t3 = jit_get_reg(jit_class_gpr|jit_class_nospill);
1853     subr(rn(t0), r0, r1);		/* r0 = r0 - r1 */
1854     ltr(rn(t1), _R31_REGNO, r1);	/* t1 = 0 < r1 */
1855     ltr(rn(t2), r0, rn(t0));		/* t2 = r0 < t0 */
1856     ltr(rn(t3), rn(t0), r0);		/* t3 = t0 < r0 */
1857     movr(r0, rn(t0));			/* r0 -= r1 */
1858     CMOVNE(rn(t1), rn(t2), rn(t3));	/* if (t1 == 0) t3 = t2; */
1859     jit_unget_reg(t2);
1860     jit_unget_reg(t1);
1861     jit_unget_reg(t0);
1862     w = _jit->pc.w;
1863     if (carry)
1864 	BNE(rn(t3), ((i0 - w) >> 2) - 1);
1865     else
1866 	BEQ(rn(t3), ((i0 - w) >> 2) - 1);
1867     jit_unget_reg(t3);
1868     return (w);
1869 }
1870 
1871 static jit_word_t
_bsubi(jit_state_t * _jit,jit_word_t i0,jit_int32_t r0,jit_word_t i1,jit_bool_t carry)1872 _bsubi(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1,
1873        jit_bool_t carry)
1874 {
1875     jit_word_t		w;
1876     jit_int32_t		reg;
1877     reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1878     movi(rn(reg), i1);
1879     w = bsubr(i0, r0, rn(reg), carry);
1880     jit_unget_reg(reg);
1881     return (w);
1882 }
1883 
1884 static jit_word_t
_bsubr_u(jit_state_t * _jit,jit_word_t i0,jit_int32_t r0,jit_int32_t r1,jit_bool_t carry)1885 _bsubr_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1,
1886 	 jit_bool_t carry)
1887 {
1888     jit_word_t		w;
1889     jit_int32_t		t0;
1890     jit_int32_t		t1;
1891     t0 = jit_get_reg(jit_class_gpr);
1892     t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
1893     subr(rn(t0), r0, r1);
1894     ltr_u(rn(t1), r0, rn(t0));
1895     movr(r0, rn(t0));
1896     jit_unget_reg(t0);
1897     w = _jit->pc.w;
1898     if (carry)
1899 	BNE(rn(t1), ((i0 - w) >> 2) - 1);
1900     else
1901 	BEQ(rn(t1), ((i0 - w) >> 2) - 1);
1902     jit_unget_reg(t1);
1903     return (w);
1904 }
1905 
1906 static jit_word_t
_bsubi_u(jit_state_t * _jit,jit_word_t i0,jit_int32_t r0,jit_word_t i1,jit_bool_t carry)1907 _bsubi_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1,
1908 	 jit_bool_t carry)
1909 {
1910     jit_word_t		w;
1911     jit_int32_t		t0;
1912     jit_int32_t		t1;
1913     t0 = jit_get_reg(jit_class_gpr);
1914     t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
1915     subi(rn(t0), r0, i1);
1916     ltr_u(rn(t1), r0, rn(t0));
1917     movr(r0, rn(t0));
1918     jit_unget_reg(t0);
1919     w = _jit->pc.w;
1920     if (carry)
1921 	BNE(rn(t1), ((i0 - w) >> 2) - 1);
1922     else
1923 	BEQ(rn(t1), ((i0 - w) >> 2) - 1);
1924     jit_unget_reg(t1);
1925     return (w);
1926 }
1927 
1928 static jit_word_t
_bmxr(jit_state_t * _jit,jit_word_t i0,jit_int32_t r0,jit_int32_t r1,jit_bool_t set)1929 _bmxr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1,
1930       jit_bool_t set)
1931 {
1932     jit_word_t		w;
1933     jit_int32_t		t0;
1934     t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
1935     andr(rn(t0), r0, r1);
1936     w = _jit->pc.w;
1937     if (set)
1938 	BNE(rn(t0), ((i0 - w) >> 2) - 1);
1939     else
1940 	BEQ(rn(t0), ((i0 - w) >> 2) - 1);
1941     jit_unget_reg(t0);
1942     return (w);
1943 }
1944 
1945 static jit_word_t
_bmxi(jit_state_t * _jit,jit_word_t i0,jit_int32_t r0,jit_word_t i1,jit_bool_t set)1946 _bmxi(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1,
1947       jit_bool_t set)
1948 {
1949     jit_word_t		w;
1950     jit_int32_t		t0;
1951     t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
1952     andi(rn(t0), r0, i1);
1953     w = _jit->pc.w;
1954     if (set)
1955 	BNE(rn(t0), ((i0 - w) >> 2) - 1);
1956     else
1957 	BEQ(rn(t0), ((i0 - w) >> 2) - 1);
1958     jit_unget_reg(t0);
1959     return (w);
1960 }
1961 
1962 static void
_ldr_c(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1)1963 _ldr_c(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1964 {
1965     ldr_uc(r0, r1);
1966     extr_c(r0, r0);
1967 }
1968 
1969 static void
_ldi_c(jit_state_t * _jit,jit_int32_t r0,jit_word_t i0)1970 _ldi_c(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
1971 {
1972     jit_int32_t		reg;
1973     if (_s16_p(i0)) {
1974 	LDBU(r0, _R31_REGNO, _u16(i0));
1975 	extr_c(r0, r0);
1976     }
1977     else {
1978 	reg = jit_get_reg(jit_class_gpr);
1979 	movi(rn(reg), i0);
1980 	ldr_c(r0, rn(reg));
1981 	jit_unget_reg(reg);
1982     }
1983 }
1984 
1985 static void
_ldi_uc(jit_state_t * _jit,jit_int32_t r0,jit_word_t i0)1986 _ldi_uc(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
1987 {
1988     jit_int32_t		reg;
1989     if (_s16_p(i0))
1990 	LDBU(r0, _R31_REGNO, _u16(i0));
1991     else  {
1992 	reg = jit_get_reg(jit_class_gpr);
1993 	movi(rn(reg), i0);
1994 	ldr_uc(r0, rn(reg));
1995 	jit_unget_reg(reg);
1996     }
1997 }
1998 
1999 static void
_ldr_s(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1)2000 _ldr_s(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
2001 {
2002     ldr_us(r0, r1);
2003     extr_s(r0, r0);
2004 }
2005 
2006 static void
_ldi_s(jit_state_t * _jit,jit_int32_t r0,jit_word_t i0)2007 _ldi_s(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
2008 {
2009     jit_int32_t		reg;
2010     if (_s16_p(i0)) {
2011 	LDWU(r0, _R31_REGNO, _u16(i0));
2012 	extr_s(r0, r0);
2013     }
2014     else {
2015 	reg = jit_get_reg(jit_class_gpr);
2016 	movi(rn(reg), i0);
2017 	ldr_s(r0, rn(reg));
2018 	jit_unget_reg(reg);
2019     }
2020 }
2021 
2022 static void
_ldi_us(jit_state_t * _jit,jit_int32_t r0,jit_word_t i0)2023 _ldi_us(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
2024 {
2025     jit_int32_t		reg;
2026     if (_s16_p(i0))
2027 	LDWU(r0, _R31_REGNO, _u16(i0));
2028     else {
2029 	reg = jit_get_reg(jit_class_gpr);
2030 	movi(rn(reg), i0);
2031 	ldr_us(r0, rn(reg));
2032 	jit_unget_reg(reg);
2033     }
2034 }
2035 
2036 static void
_ldi_i(jit_state_t * _jit,jit_int32_t r0,jit_word_t i0)2037 _ldi_i(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
2038 {
2039     jit_int32_t		reg;
2040     if (_s16_p(i0))
2041 	LDL(r0, _R31_REGNO, _u16(i0));
2042     else {
2043 	reg = jit_get_reg(jit_class_gpr);
2044 	movi(rn(reg), i0);
2045 	ldr_i(r0, rn(reg));
2046 	jit_unget_reg(reg);
2047     }
2048 }
2049 
2050 static void
_ldr_ui(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1)2051 _ldr_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
2052 {
2053     ldr_i(r0, r1);
2054     extr_ui(r0, r0);
2055 }
2056 
2057 static void
_ldi_ui(jit_state_t * _jit,jit_int32_t r0,jit_word_t i0)2058 _ldi_ui(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
2059 {
2060     jit_int32_t		reg;
2061     if (_s16_p(i0)) {
2062 	LDL(r0, _R31_REGNO, _u16(i0));
2063 	extr_ui(r0, r0);
2064     }
2065     else {
2066 	reg = jit_get_reg(jit_class_gpr);
2067 	movi(rn(reg), i0);
2068 	ldr_ui(r0, rn(reg));
2069 	jit_unget_reg(reg);
2070     }
2071 }
2072 
2073 static void
_ldi_l(jit_state_t * _jit,jit_int32_t r0,jit_word_t i0)2074 _ldi_l(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
2075 {
2076     jit_int32_t		reg;
2077     if (_s16_p(i0))
2078 	LDQ(r0, _R31_REGNO, _u16(i0));
2079     else {
2080 	reg = jit_get_reg(jit_class_gpr);
2081 	movi(rn(reg), i0);
2082 	ldr_l(r0, rn(reg));
2083 	jit_unget_reg(reg);
2084     }
2085 }
2086 
2087 static void
_ldxr_c(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_int32_t r2)2088 _ldxr_c(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2089 {
2090     jit_int32_t		reg;
2091     reg = jit_get_reg(jit_class_gpr);
2092     addr(rn(reg), r1, r2);
2093     ldr_c(r0, rn(reg));
2094     jit_unget_reg(reg);
2095 }
2096 
2097 static void
_ldxi_c(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_word_t i0)2098 _ldxi_c(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2099 {
2100     jit_int32_t		reg;
2101     if (_s16_p(i0)) {
2102 	LDBU(r0, r1, _u16(i0));
2103 	extr_c(r0, r0);
2104     }
2105     else {
2106 	reg = jit_get_reg(jit_class_gpr);
2107 	addi(rn(reg), r1, i0);
2108 	ldr_c(r0, rn(reg));
2109 	jit_unget_reg(reg);
2110     }
2111 }
2112 
2113 static void
_ldxr_uc(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_int32_t r2)2114 _ldxr_uc(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2115 {
2116     jit_int32_t		reg;
2117     reg = jit_get_reg(jit_class_gpr);
2118     addr(rn(reg), r1, r2);
2119     ldr_uc(r0, rn(reg));
2120     jit_unget_reg(reg);
2121 }
2122 
2123 static void
_ldxi_uc(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_word_t i0)2124 _ldxi_uc(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2125 {
2126     jit_int32_t		reg;
2127     if (_s16_p(i0))
2128 	LDBU(r0, r1, _u16(i0));
2129     else {
2130 	reg = jit_get_reg(jit_class_gpr);
2131 	addi(rn(reg), r1, i0);
2132 	ldr_uc(r0, rn(reg));
2133 	jit_unget_reg(reg);
2134     }
2135 }
2136 
2137 static void
_ldxr_s(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_int32_t r2)2138 _ldxr_s(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2139 {
2140     jit_int32_t		reg;
2141     reg = jit_get_reg(jit_class_gpr);
2142     addr(rn(reg), r1, r2);
2143     ldr_s(r0, rn(reg));
2144     jit_unget_reg(reg);
2145 }
2146 
2147 static void
_ldxi_s(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_word_t i0)2148 _ldxi_s(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2149 {
2150     jit_int32_t		reg;
2151     if (_s16_p(i0)) {
2152 	LDWU(r0, r1, _u16(i0));
2153 	extr_s(r0, r0);
2154     }
2155     else {
2156 	reg = jit_get_reg(jit_class_gpr);
2157 	addi(rn(reg), r1, i0);
2158 	ldr_s(r0, rn(reg));
2159 	jit_unget_reg(reg);
2160     }
2161 }
2162 
2163 static void
_ldxr_us(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_int32_t r2)2164 _ldxr_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2165 {
2166     jit_int32_t		reg;
2167     reg = jit_get_reg(jit_class_gpr);
2168     addr(rn(reg), r1, r2);
2169     ldr_us(r0, rn(reg));
2170     jit_unget_reg(reg);
2171 }
2172 
2173 static void
_ldxi_us(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_word_t i0)2174 _ldxi_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2175 {
2176     jit_int32_t		reg;
2177     if (_s16_p(i0))
2178 	LDWU(r0, r1, _u16(i0));
2179     else {
2180 	reg = jit_get_reg(jit_class_gpr);
2181 	addi(rn(reg), r1, i0);
2182 	ldr_us(r0, rn(reg));
2183 	jit_unget_reg(reg);
2184     }
2185 }
2186 
2187 static void
_ldxr_i(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_int32_t r2)2188 _ldxr_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2189 {
2190     jit_int32_t		reg;
2191     reg = jit_get_reg(jit_class_gpr);
2192     addr(rn(reg), r1, r2);
2193     ldr_i(r0, rn(reg));
2194     jit_unget_reg(reg);
2195 }
2196 
2197 static void
_ldxi_i(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_word_t i0)2198 _ldxi_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2199 {
2200     jit_int32_t		reg;
2201     if (_s16_p(i0))
2202 	LDL(r0, r1, _u16(i0));
2203     else {
2204 	reg = jit_get_reg(jit_class_gpr);
2205 	addi(rn(reg), r1, i0);
2206 	ldr_i(r0, rn(reg));
2207 	jit_unget_reg(reg);
2208     }
2209 }
2210 
2211 static void
_ldxr_ui(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_int32_t r2)2212 _ldxr_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2213 {
2214     jit_int32_t		reg;
2215     reg = jit_get_reg(jit_class_gpr);
2216     addr(rn(reg), r1, r2);
2217     ldr_ui(r0, rn(reg));
2218     jit_unget_reg(reg);
2219 }
2220 
2221 static void
_ldxi_ui(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_word_t i0)2222 _ldxi_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2223 {
2224     jit_int32_t		reg;
2225     if (_s16_p(i0)) {
2226 	LDL(r0, r1, _u16(i0));
2227 	extr_ui(r0, r0);
2228     }
2229     else {
2230 	reg = jit_get_reg(jit_class_gpr);
2231 	addi(rn(reg), r1, i0);
2232 	ldr_ui(r0, rn(reg));
2233 	jit_unget_reg(reg);
2234     }
2235 }
2236 
2237 static void
_ldxr_l(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_int32_t r2)2238 _ldxr_l(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2239 {
2240     jit_int32_t		reg;
2241     reg = jit_get_reg(jit_class_gpr);
2242     addr(rn(reg), r1, r2);
2243     ldr_l(r0, rn(reg));
2244     jit_unget_reg(reg);
2245 }
2246 
2247 static void
_ldxi_l(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_word_t i0)2248 _ldxi_l(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2249 {
2250     jit_int32_t		reg;
2251     if (_s16_p(i0))
2252 	LDQ(r0, r1, _u16(i0));
2253     else {
2254 	reg = jit_get_reg(jit_class_gpr);
2255 	addi(rn(reg), r1, i0);
2256 	ldr_l(r0, rn(reg));
2257 	jit_unget_reg(reg);
2258     }
2259 }
2260 
2261 static void
_sti_c(jit_state_t * _jit,jit_word_t i0,jit_int32_t r0)2262 _sti_c(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
2263 {
2264     jit_int32_t		reg;
2265     if (_s16_p(i0))
2266 	STB(r0, _R31_REGNO, _u16(i0));
2267     else {
2268 	reg = jit_get_reg(jit_class_gpr);
2269 	movi(rn(reg), i0);
2270 	str_c(rn(reg), r0);
2271 	jit_unget_reg(reg);
2272     }
2273 }
2274 
2275 static void
_sti_s(jit_state_t * _jit,jit_word_t i0,jit_int32_t r0)2276 _sti_s(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
2277 {
2278     jit_int32_t		reg;
2279     if (_s16_p(i0))
2280 	STW(r0, _R31_REGNO, _u16(i0));
2281     else {
2282 	reg = jit_get_reg(jit_class_gpr);
2283 	movi(rn(reg), i0);
2284 	str_s(rn(reg), r0);
2285 	jit_unget_reg(reg);
2286     }
2287 }
2288 
2289 static void
_sti_i(jit_state_t * _jit,jit_word_t i0,jit_int32_t r0)2290 _sti_i(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
2291 {
2292     jit_int32_t		reg;
2293     if (_s16_p(i0))
2294 	STL(r0, _R31_REGNO, _u16(i0));
2295     else {
2296 	reg = jit_get_reg(jit_class_gpr);
2297 	movi(rn(reg), i0);
2298 	str_i(rn(reg), r0);
2299 	jit_unget_reg(reg);
2300     }
2301 }
2302 
2303 static void
_sti_l(jit_state_t * _jit,jit_word_t i0,jit_int32_t r0)2304 _sti_l(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
2305 {
2306     jit_int32_t		reg;
2307     if (_s16_p(i0))
2308 	STQ(r0, _R31_REGNO, _u16(i0));
2309     else {
2310 	reg = jit_get_reg(jit_class_gpr);
2311 	movi(rn(reg), i0);
2312 	str_l(rn(reg), r0);
2313 	jit_unget_reg(reg);
2314     }
2315 }
2316 
2317 static void
_stxr_c(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_int32_t r2)2318 _stxr_c(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2319 {
2320     jit_int32_t		reg;
2321     reg = jit_get_reg(jit_class_gpr);
2322     addr(rn(reg), r0, r1);
2323     str_c(rn(reg), r2);
2324     jit_unget_reg(reg);
2325 }
2326 
2327 static void
_stxi_c(jit_state_t * _jit,jit_word_t i0,jit_int32_t r0,jit_int32_t r1)2328 _stxi_c(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2329 {
2330     jit_int32_t		reg;
2331     if (_s16_p(i0))
2332 	STB(r1, r0, _u16(i0));
2333     else {
2334 	reg = jit_get_reg(jit_class_gpr);
2335 	addi(rn(reg), r0, i0);
2336 	str_c(rn(reg), r1);
2337 	jit_unget_reg(reg);
2338     }
2339 }
2340 
2341 static void
_stxr_s(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_int32_t r2)2342 _stxr_s(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2343 {
2344     jit_int32_t		reg;
2345     reg = jit_get_reg(jit_class_gpr);
2346     addr(rn(reg), r0, r1);
2347     str_s(rn(reg), r2);
2348     jit_unget_reg(reg);
2349 }
2350 
2351 static void
_stxi_s(jit_state_t * _jit,jit_word_t i0,jit_int32_t r0,jit_int32_t r1)2352 _stxi_s(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2353 {
2354     jit_int32_t		reg;
2355     if (_s16_p(i0))
2356 	STW(r1, r0, _u16(i0));
2357     else {
2358 	reg = jit_get_reg(jit_class_gpr);
2359 	addi(rn(reg), r0, i0);
2360 	str_s(rn(reg), r1);
2361 	jit_unget_reg(reg);
2362     }
2363 }
2364 
2365 static void
_stxr_i(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_int32_t r2)2366 _stxr_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2367 {
2368     jit_int32_t		reg;
2369     reg = jit_get_reg(jit_class_gpr);
2370     addr(rn(reg), r0, r1);
2371     str_i(rn(reg), r2);
2372     jit_unget_reg(reg);
2373 }
2374 
2375 static void
_stxi_i(jit_state_t * _jit,jit_word_t i0,jit_int32_t r0,jit_int32_t r1)2376 _stxi_i(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2377 {
2378     jit_int32_t		reg;
2379     if (_s16_p(i0))
2380 	STL(r1, r0, _u16(i0));
2381     else {
2382 	reg = jit_get_reg(jit_class_gpr);
2383 	addi(rn(reg), r0, i0);
2384 	str_i(rn(reg), r1);
2385 	jit_unget_reg(reg);
2386     }
2387 }
2388 
2389 static void
_stxr_l(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_int32_t r2)2390 _stxr_l(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2391 {
2392     jit_int32_t		reg;
2393     reg = jit_get_reg(jit_class_gpr);
2394     addr(rn(reg), r0, r1);
2395     str_l(rn(reg), r2);
2396     jit_unget_reg(reg);
2397 }
2398 
2399 static void
_stxi_l(jit_state_t * _jit,jit_word_t i0,jit_int32_t r0,jit_int32_t r1)2400 _stxi_l(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2401 {
2402     jit_int32_t		reg;
2403     if (_s16_p(i0))
2404 	STQ(r1, r0, _u16(i0));
2405     else {
2406 	reg = jit_get_reg(jit_class_gpr);
2407 	addi(rn(reg), r0, i0);
2408 	str_l(rn(reg), r1);
2409 	jit_unget_reg(reg);
2410     }
2411 }
2412 
2413 static void
_extr_c(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1)2414 _extr_c(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
2415 {
2416     lshi(r0, r1, 56);
2417     rshi(r0, r0, 56);
2418 }
2419 
2420 static void
_extr_uc(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1)2421 _extr_uc(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
2422 {
2423     lshi(r0, r1, 56);
2424     rshi_u(r0, r0, 56);
2425 }
2426 
2427 static void
_extr_s(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1)2428 _extr_s(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
2429 {
2430     lshi(r0, r1, 48);
2431     rshi(r0, r0, 48);
2432 }
2433 
2434 static void
_extr_us(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1)2435 _extr_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
2436 {
2437     lshi(r0, r1, 48);
2438     rshi_u(r0, r0, 48);
2439 }
2440 
2441 static void
_extr_i(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1)2442 _extr_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
2443 {
2444     lshi(r0, r1, 32);
2445     rshi(r0, r0, 32);
2446 }
2447 
2448 static void
_extr_ui(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1)2449 _extr_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
2450 {
2451     lshi(r0, r1, 32);
2452     rshi_u(r0, r0, 32);
2453 }
2454 
2455 static void
_htonr_us(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1)2456 _htonr_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
2457 {
2458     jit_int32_t		t0;
2459     t0 = jit_get_reg(jit_class_gpr);
2460     EXTBLi(r1, 0, rn(t0));
2461     EXTBLi(r1, 1, r0);
2462     SLLi(rn(t0), 8, rn(t0));
2463     OR(r0, rn(t0), r0);
2464     jit_unget_reg(t0);
2465 }
2466 
2467 static void
_htonr_ui(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1)2468 _htonr_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
2469 {
2470     jit_int32_t		t0;
2471     jit_int32_t		t1;
2472     jit_int32_t		t2;
2473     jit_int32_t		t3;
2474     t0 = jit_get_reg(jit_class_gpr);
2475     t1 = jit_get_reg(jit_class_gpr);
2476     t2 = jit_get_reg(jit_class_gpr);
2477     t3 = jit_get_reg(jit_class_gpr);
2478     EXTBLi(r1, 3, rn(t0));
2479     INSBLi(r1, 3, rn(t1));
2480     SLLi(r1, 8, rn(t2));
2481     ZAPNOTi(rn(t2), 4, rn(t2));
2482     SRLi(r1, 8, rn(t3));
2483     OR(rn(t0), rn(t1), r0);
2484     OR(rn(t2), r0, r0);
2485     ZAPNOTi(rn(t3), 2, rn(t3));
2486     OR(rn(t3), r0, r0);
2487     jit_unget_reg(t3);
2488     jit_unget_reg(t2);
2489     jit_unget_reg(t1);
2490     jit_unget_reg(t0);
2491 }
2492 
2493 static void
_htonr_ul(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1)2494 _htonr_ul(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
2495 {
2496     jit_int32_t		t0;
2497     jit_int32_t		t1;
2498     jit_int32_t		t2;
2499     assert(_jitc->function != NULL);
2500     t0 = jit_get_reg(jit_class_fpr);
2501     t1 = jit_get_reg(jit_class_gpr);
2502     t2 = jit_get_reg(jit_class_gpr);
2503     stxi(-8, _FP_REGNO, r1);			/* r1 = ABCD EFGH */
2504     LDG(rn(t0), _FP_REGNO, _u16(-8));		/* t0 = GHEF CDAB */
2505     STT(rn(t0), _FP_REGNO, _u16(-8));
2506     ldxi(rn(t1), _FP_REGNO, -8);		/* t1 = GHEF CDAB */
2507     lshi(rn(t2), rn(t1), 8);			/* t2 = HEFC DAB. */
2508     rshi_u(rn(t1), rn(t1), 8);			/* t1 = .GHE FCDA */
2509     ZAPi(rn(t2), 0x55, rn(t2));			/* t2 = H.F. D.B. */
2510     ZAPi(rn(t1), 0xaa, rn(t1));			/* t1 = .G.E .C.A */
2511     orr(r0, rn(t1), rn(t2));			/* r0 = HGFE DCBA */
2512     jit_unget_reg(t2);
2513     jit_unget_reg(t1);
2514     jit_unget_reg(t0);
2515 }
2516 
2517 static void
_jmpi(jit_state_t * _jit,jit_word_t i0)2518 _jmpi(jit_state_t *_jit, jit_word_t i0)
2519 {
2520     jit_word_t		w;
2521     jit_word_t		d;
2522     w = _jit->pc.w;
2523     d = ((i0 - w) >> 2) - 1;
2524     if (_s21_p(d))
2525 	BR(_R31_REGNO, d);
2526     else
2527 	(void)jmpi_p(i0);
2528 }
2529 
2530 static jit_word_t
_jmpi_p(jit_state_t * _jit,jit_word_t i0)2531 _jmpi_p(jit_state_t *_jit, jit_word_t i0)
2532 {
2533     jit_word_t		w;
2534     jit_int32_t		reg;
2535     reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2536     w = movi_p(rn(reg), i0);
2537     jmpr(rn(reg));
2538     jit_unget_reg(reg);
2539     return (w);
2540 }
2541 
2542 static void
_callr(jit_state_t * _jit,jit_int32_t r0)2543 _callr(jit_state_t *_jit, jit_int32_t r0)
2544 {
2545     if (r0 != _PV_REGNO)
2546 	MOV(r0, _PV_REGNO);
2547     JSR(_RA_REGNO, _PV_REGNO, 0);
2548 }
2549 
2550 static void
_calli(jit_state_t * _jit,jit_word_t i0)2551 _calli(jit_state_t *_jit, jit_word_t i0)
2552 {
2553     /* FIXME use a small buffer to load constants - using gp */
2554 #if 0
2555     jit_word_t		w;
2556     jit_word_t		d;
2557     w = _jit->pc.w;
2558     d = ((i0 - w) >> 2) - 1;
2559     if (_s21_p(d))
2560 	BSR(_RA_REGNO, d);
2561     else
2562 	(void)calli_p(i0);
2563 #else
2564     movi(_PV_REGNO, i0);
2565     callr(_PV_REGNO);
2566 #endif
2567 }
2568 
2569 static jit_word_t
_calli_p(jit_state_t * _jit,jit_word_t i0)2570 _calli_p(jit_state_t *_jit, jit_word_t i0)
2571 {
2572     jit_word_t		w;
2573     w = movi_p(_PV_REGNO, i0);
2574     callr(_PV_REGNO);
2575     return (w);
2576 }
2577 
2578 static void
_prolog(jit_state_t * _jit,jit_node_t * node)2579 _prolog(jit_state_t *_jit, jit_node_t *node)
2580 {
2581     jit_int32_t		reg;
2582     if (_jitc->function->define_frame || _jitc->function->assume_frame) {
2583 	jit_int32_t	frame = -_jitc->function->frame;
2584 	assert(_jitc->function->self.aoff >= frame);
2585 	if (_jitc->function->assume_frame)
2586 	    return;
2587 	_jitc->function->self.aoff = frame;
2588     }
2589     if (_jitc->function->allocar)
2590 	_jitc->function->self.aoff &= -8;
2591     _jitc->function->stack = ((_jitc->function->self.alen -
2592 			       _jitc->function->self.aoff) + 7) & -8;
2593     /* ldgp gp, 0(pv) */
2594     LDAH(_PV_REGNO, _GP_REGNO, 0);
2595     LDA(_GP_REGNO, _GP_REGNO, 0);
2596     /* callee save registers */
2597     subi(_SP_REGNO, _SP_REGNO, stack_framesize);
2598     stxi(0, _SP_REGNO, _RA_REGNO);
2599     stxi(8, _SP_REGNO, _FP_REGNO);
2600 #  define SPILL(N, O)							\
2601     if (jit_regset_tstbit(&_jitc->function->regset, N))			\
2602 	stxi(O, _SP_REGNO, N##_REGNO)
2603 #  define SPILLD(N, O)							\
2604     if (jit_regset_tstbit(&_jitc->function->regset, N))			\
2605 	stxi_d(O, _SP_REGNO, N##_REGNO)
2606     SPILL(_S0, 16);
2607     SPILL(_S1, 24);
2608     SPILL(_S2, 32);
2609     SPILL(_S3, 40);
2610     SPILL(_S4, 48);
2611     SPILL(_S5, 56);
2612     SPILLD(_F2, 64);
2613     SPILLD(_F3, 72);
2614     SPILLD(_F4, 80);
2615     SPILLD(_F5, 88);
2616     SPILLD(_F6, 96);
2617     SPILLD(_F7, 104);
2618     SPILLD(_F8, 112);
2619     SPILLD(_F9, 120);
2620 #  undef SPILLD
2621 #  undef SPILL
2622     movr(_FP_REGNO, _SP_REGNO);
2623     /* alloca */
2624     if (_jitc->function->stack)
2625 	subi(_SP_REGNO, _SP_REGNO, _jitc->function->stack);
2626     if (_jitc->function->allocar) {
2627 	reg = jit_get_reg(jit_class_gpr);
2628 	movi(rn(reg), _jitc->function->self.aoff);
2629 	stxi_i(_jitc->function->aoffoff, _FP_REGNO, rn(reg));
2630 	jit_unget_reg(reg);
2631     }
2632 
2633     if (_jitc->function->self.call & jit_call_varargs) {
2634 	for (reg = _jitc->function->self.argi; jit_arg_reg_p(reg); ++reg)
2635 	    stxi(stack_framesize - 48 + reg * 8, _FP_REGNO, rn(_A0 - reg));
2636 	for (reg = _jitc->function->self.argi; jit_arg_reg_p(reg); ++reg)
2637 	    stxi_d(stack_framesize - 96 + reg * 8, _FP_REGNO, rn(_F16 - reg));
2638     }
2639 }
2640 
2641 static void
_epilog(jit_state_t * _jit,jit_node_t * node)2642 _epilog(jit_state_t *_jit, jit_node_t *node)
2643 {
2644     if (_jitc->function->assume_frame)
2645 	return;
2646     movr(_SP_REGNO, _FP_REGNO);
2647     ldxi(_RA_REGNO, _SP_REGNO, 0);
2648     ldxi(_FP_REGNO, _SP_REGNO, 8);
2649 #  define LOAD(N, O)							\
2650     if (jit_regset_tstbit(&_jitc->function->regset, N))			\
2651 	ldxi(N##_REGNO, _SP_REGNO,  O)
2652 #  define LOADD(N, O)							\
2653     if (jit_regset_tstbit(&_jitc->function->regset, N))			\
2654 	ldxi_d(N##_REGNO, _SP_REGNO,  O)
2655     LOAD(_S0, 16);
2656     LOAD(_S1, 24);
2657     LOAD(_S2, 32);
2658     LOAD(_S3, 40);
2659     LOAD(_S4, 48);
2660     LOAD(_S5, 56);
2661     LOADD(_F2, 64);
2662     LOADD(_F3, 72);
2663     LOADD(_F4, 80);
2664     LOADD(_F5, 88);
2665     LOADD(_F6, 96);
2666     LOADD(_F7, 104);
2667     LOADD(_F8, 112);
2668     LOADD(_F9, 120);
2669 #  undef LOADD
2670 #  undef LOAD
2671     addi(_SP_REGNO, _SP_REGNO, stack_framesize);
2672     RET(_R31_REGNO, _RA_REGNO, 1);	/* 1 means procedure return
2673 					 * 0 means no procedure return
2674 					 * other values are reserved */
2675 }
2676 
2677 static void
_vastart(jit_state_t * _jit,jit_int32_t r0)2678 _vastart(jit_state_t *_jit, jit_int32_t r0)
2679 {
2680     jit_int32_t		reg;
2681 
2682     /* Return jit_va_list_t in the register argument */
2683     addi(r0, _FP_REGNO, _jitc->function->vaoff);
2684 
2685     reg = jit_get_reg(jit_class_gpr);
2686 
2687     /* The base field is constant. */
2688     addi(rn(reg), _FP_REGNO, stack_framesize - 48);
2689     stxi(offsetof(jit_va_list_t, base), r0, rn(reg));
2690 
2691     /* Initialize the offset field */
2692     if (_jitc->function->vagp < 6)
2693 	movi(rn(reg), _jitc->function->vagp * 8);
2694     else
2695 	movi(rn(reg), _jitc->function->self.size - (stack_framesize - 48));
2696     stxi(offsetof(jit_va_list_t, offset), r0, rn(reg));
2697 
2698     jit_unget_reg(reg);
2699 }
2700 
2701 static void
_vaarg(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1)2702 _vaarg(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
2703 {
2704     jit_int32_t		rg0, rg1;
2705 
2706     assert(_jitc->function->self.call & jit_call_varargs);
2707 
2708     rg0 = jit_get_reg(jit_class_gpr);
2709     rg1 = jit_get_reg(jit_class_gpr);
2710 
2711     /* Load the base in first temporary. */
2712     ldxi(rn(rg0), r1, offsetof(jit_va_list_t, base));
2713 
2714     /* Load the offset in the second temporary. */
2715     ldxi(rn(rg1), r1, offsetof(jit_va_list_t, offset));
2716 
2717     /* Load the argument */
2718     ldxr(r0, rn(rg0), rn(rg1));
2719 
2720     /* No longer needed. */
2721     jit_unget_reg(rg0);
2722 
2723     /* Update offset. */
2724     addi(rn(rg1), rn(rg1), 8);
2725     stxi(offsetof(jit_va_list_t, offset), r1, rn(rg1));
2726     jit_unget_reg(rg1);
2727 }
2728 
2729 static void
_patch_at(jit_state_t * _jit,jit_word_t instr,jit_word_t label)2730 _patch_at(jit_state_t *_jit, jit_word_t instr, jit_word_t label)
2731 {
2732     union {
2733 	jit_int32_t	*i;
2734 	jit_word_t	 w;
2735     } u;
2736     jit_word_t		 d;
2737     jit_int16_t		s0, s1, s2, s3;
2738     u.w = instr;
2739     switch (_u6(u.i[0] >> 26)) {
2740 	/*   BLT	     BLE	     BEQ	     BGE */
2741 	case 0x3a:	case 0x3b:	case 0x39:	case 0x3e:
2742 	/*   BGT	     BNE	     BLBC	     BLBS */
2743 	case 0x3f:	case 0x3d:	case 0x38:	case 0x3c:
2744 	/*   BR		     BSR */
2745 	case 0x30:	case 0x34:
2746 	/*   FBLT	     FBLE	     FBEQ	     FBGE */
2747 	case 0x32:	case 0x33:	case 0x31:	case 0x36:
2748 	/*   FBGT	     FBNE */
2749 	case 0x37:	case 0x35:
2750 	    d = ((label - instr) >> 2) - 1;
2751 	    assert(_s21_p(d));
2752 	    u.i[0] &= ~0x1fffff;
2753 	    u.i[0] |= _u21(d);
2754 	    break;
2755 	/*   LDA */
2756 	case 0x08:		/* movi_p */
2757 	    s0 = label;
2758 	    s1 = label >> 16;
2759 	    s2 = label >> 32;
2760 	    s3 = label >> 48;
2761 	    if (s0 < 0)
2762 		++s1;
2763 	    if (s2 < 0)
2764 		++s3;
2765 	    u.i[0] &= ~0xffff;
2766 	    u.i[0] |= _u16(s0);
2767 	    /*				LDA */
2768 	    assert(_u6(u.i[1] >> 26) == 0x08);
2769 	    u.i[1] &= ~0xffff;
2770 	    u.i[1] |= _u16(s2);
2771 	    /*				LDAH */
2772 	    assert(_u6(u.i[2] >> 26) == 0x09);
2773 	    u.i[2] &= ~0xffff;
2774 	    u.i[2] |= _u16(s1);
2775 	    /*				LDAH */
2776 	    assert(_u6(u.i[3] >> 26) == 0x09);
2777 	    u.i[3] &= ~0xffff;
2778 	    u.i[3] |= _u16(s3);
2779 	    /*				SLL */
2780 	    assert(_u6(u.i[4] >> 26) == 0x12 && _u7(u.i[4] >> 5) == 0x39);
2781 	    /*				SRL */
2782 	    assert(_u6(u.i[5] >> 26) == 0x12 && _u7(u.i[5] >> 5) == 0x34);
2783 	    /*				SLL */
2784 	    assert(_u6(u.i[6] >> 26) == 0x12 && _u7(u.i[6] >> 5) == 0x39);
2785 	    /*				BIS */
2786 	    assert(_u6(u.i[7] >> 26) == 0x11 && _u7(u.i[7] >> 5) == 0x20);
2787 	    break;
2788 	default:
2789 	    abort();
2790     }
2791 }
2792 #endif
2793