2 * Copyright (C) 2014-2023 Free Software Foundation, Inc.
4 * This file is part of GNU lightning.
6 * GNU lightning is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU Lesser General Public License as published
8 * by the Free Software Foundation; either version 3, or (at your option)
11 * GNU lightning is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
14 * License for more details.
17 * Paulo Cesar Pereira de Andrade
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 movnr(r0,r1,r2) CMOVNE(r2, r1, r0)
315 # define movzr(r0,r1,r2) CMOVEQ(r2, r1, r0)
316 # define casx(r0, r1, r2, r3, i0) _casx(_jit, r0, r1, r2, r3, i0)
317 static void _casx(jit_state_t *_jit,jit_int32_t,jit_int32_t,
318 jit_int32_t,jit_int32_t,jit_word_t);
319 #define casr(r0, r1, r2, r3) casx(r0, r1, r2, r3, 0)
320 #define casi(r0, i0, r1, r2) casx(r0, _NOREG, r1, r2, i0)
321 # define negr(r0,r1) NEGQ(r1,r0)
322 # define comr(r0,r1) NOT(r1,r0)
323 # define clor(r0, r1) _clor(_jit, r0, r1)
324 static void _clor(jit_state_t*, jit_int32_t, jit_int32_t);
325 # define clzr(r0, r1) CTLZ(r1, r0)
326 # define ctor(r0, r1) _ctor(_jit, r0, r1)
327 static void _ctor(jit_state_t*, jit_int32_t, jit_int32_t);
328 # define ctzr(r0, r1) CTTZ(r1, r0)
329 # define addr(r0,r1,r2) ADDQ(r1,r2,r0)
330 # define addi(r0,r1,i0) _addi(_jit,r0,r1,i0)
331 static void _addi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
332 # define addcr(r0,r1,i0) _addcr(_jit,r0,r1,i0)
333 static void _addcr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
334 # define addci(r0,r1,i0) _addci(_jit,r0,r1,i0)
335 static void _addci(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
336 # define addxr(r0,r1,i0) _addxr(_jit,r0,r1,i0)
337 static void _addxr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
338 # define addxi(r0,r1,i0) _addxi(_jit,r0,r1,i0)
339 static void _addxi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
340 # define subr(r0,r1,r2) SUBQ(r1,r2,r0)
341 # define subi(r0,r1,i0) _subi(_jit,r0,r1,i0)
342 static void _subi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
343 # define subcr(r0,r1,i0) _subcr(_jit,r0,r1,i0)
344 static void _subcr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
345 # define subci(r0,r1,i0) _subci(_jit,r0,r1,i0)
346 static void _subci(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
347 # define subxr(r0,r1,i0) _subxr(_jit,r0,r1,i0)
348 static void _subxr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
349 # define subxi(r0,r1,i0) _subxi(_jit,r0,r1,i0)
350 static void _subxi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
351 # define rsbi(r0, r1, i0) _rsbi(_jit, r0, r1, i0)
352 static void _rsbi(jit_state_t*,jit_int32_t,jit_int32_t, jit_word_t);
353 # define mulr(r0,r1,r2) MULQ(r1,r2,r0)
354 # define muli(r0,r1,i0) _muli(_jit,r0,r1,i0)
355 static void _muli(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
356 # define qmulr(r0,r1,r2,r3) _qmulr(_jit,r0,r1,r2,r3)
357 static void _qmulr(jit_state_t*,jit_int32_t,
358 jit_int32_t,jit_int32_t,jit_int32_t);
359 # define qmuli(r0,r1,r2,i0) _qmuli(_jit,r0,r1,r2,i0)
360 static void _qmuli(jit_state_t*,jit_int32_t,
361 jit_int32_t,jit_int32_t,jit_word_t);
362 # define qmulr_u(r0,r1,r2,r3) _qmulr_u(_jit,r0,r1,r2,r3)
363 static void _qmulr_u(jit_state_t*,jit_int32_t,
364 jit_int32_t,jit_int32_t,jit_int32_t);
365 # define qmuli_u(r0,r1,r2,i0) _qmuli_u(_jit,r0,r1,r2,i0)
366 static void _qmuli_u(jit_state_t*,jit_int32_t,
367 jit_int32_t,jit_int32_t,jit_word_t);
368 static jit_word_t __idiv(jit_word_t, jit_word_t);
369 # define divr(r0,r1,r2) _divr(_jit,r0,r1,r2)
370 static void _divr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
371 # define divi(r0,r1,i0) _divi(_jit,r0,r1,i0)
372 static void _divi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
373 static jit_uword_t __udiv(jit_uword_t, jit_uword_t);
374 # define divr_u(r0,r1,r2) _divr_u(_jit,r0,r1,r2)
375 static void _divr_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
376 # define divi_u(r0,r1,i0) _divi_u(_jit,r0,r1,i0)
377 static void _divi_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
378 static jit_word_t __irem(jit_word_t, jit_word_t);
379 # define remr(r0,r1,r2) _remr(_jit,r0,r1,r2)
380 static void _remr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
381 # define remi(r0,r1,i0) _remi(_jit,r0,r1,i0)
382 static void _remi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
383 static jit_uword_t __urem(jit_uword_t, jit_uword_t);
384 # define remr_u(r0,r1,r2) _remr_u(_jit,r0,r1,r2)
385 static void _remr_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
386 # define remi_u(r0,r1,i0) _remi_u(_jit,r0,r1,i0)
387 static void _remi_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
388 static jit_word_t __idivrem(jit_word_t, jit_word_t, jit_word_t*);
389 # define qdivr(r0,r1,r2,r3) _qdivr(_jit,r0,r1,r2,r3)
390 static void _qdivr(jit_state_t*,
391 jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t);
392 # define qdivi(r0,r1,r2,i0) _qdivi(_jit,r0,r1,r2,i0)
393 static void _qdivi(jit_state_t*,
394 jit_int32_t,jit_int32_t,jit_int32_t,jit_word_t);
395 static jit_word_t __udivrem(jit_uword_t, jit_uword_t, jit_uword_t*);
396 # define qdivr_u(r0,r1,r2,r3) _qdivr_u(_jit,r0,r1,r2,r3)
397 static void _qdivr_u(jit_state_t*,
398 jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t);
399 # define qdivi_u(r0,r1,r2,i0) _qdivi_u(_jit,r0,r1,r2,i0)
400 static void _qdivi_u(jit_state_t*,
401 jit_int32_t,jit_int32_t,jit_int32_t,jit_word_t);
402 # define lshr(r0,r1,r2) SLL(r1,r2,r0)
403 # define lshi(r0,r1,i0) _lshi(_jit,r0,r1,i0)
404 static void _lshi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
405 # define rshr(r0,r1,r2) SRA(r1,r2,r0)
406 # define rshi(r0,r1,i0) _rshi(_jit,r0,r1,i0)
407 static void _rshi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
408 # define rshr_u(r0,r1,r2) SRL(r1,r2,r0)
409 # define rshi_u(r0,r1,i0) _rshi_u(_jit,r0,r1,i0)
410 static void _rshi_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
411 # define andr(r0,r1,r2) AND(r1,r2,r0)
412 # define andi(r0,r1,i0) _andi(_jit,r0,r1,i0)
413 static void _andi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
414 # define orr(r0,r1,r2) OR(r1,r2,r0)
415 # define ori(r0,r1,i0) _ori(_jit,r0,r1,i0)
416 static void _ori(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
417 # define xorr(r0,r1,r2) XOR(r1,r2,r0)
418 # define xori(r0,r1,i0) _xori(_jit,r0,r1,i0)
419 static void _xori(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
420 # define ltr(r0,r1,r2) CMPLT(r1,r2,r0)
421 # define lti(r0,r1,i0) _lti(_jit,r0,r1,i0)
422 static void _lti(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
423 # define ltr_u(r0,r1,r2) CMPULT(r1,r2,r0)
424 # define lti_u(r0,r1,i0) _lti_u(_jit,r0,r1,i0)
425 static void _lti_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
426 # define ler(r0,r1,r2) CMPLE(r1,r2,r0)
427 # define lei(r0,r1,i0) _lei(_jit,r0,r1,i0)
428 static void _lei(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
429 # define ler_u(r0,r1,r2) CMPULE(r1,r2,r0)
430 # define lei_u(r0,r1,i0) _lei_u(_jit,r0,r1,i0)
431 static void _lei_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
432 # define eqr(r0,r1,r2) CMPEQ(r1,r2,r0)
433 # define eqi(r0,r1,i0) _eqi(_jit,r0,r1,i0)
434 static void _eqi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
435 # define ger(r0,r1,r2) CMPLE(r2,r1,r0)
436 # define gei(r0,r1,i0) _gei(_jit,r0,r1,i0)
437 static void _gei(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
438 # define ger_u(r0,r1,r2) CMPULE(r2,r1,r0)
439 # define gei_u(r0,r1,i0) _gei_u(_jit,r0,r1,i0)
440 static void _gei_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
441 # define gtr(r0,r1,r2) CMPLT(r2,r1,r0)
442 # define gti(r0,r1,i0) _gti(_jit,r0,r1,i0)
443 static void _gti(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
444 # define gtr_u(r0,r1,r2) CMPULT(r2,r1,r0)
445 # define gti_u(r0,r1,i0) _gti_u(_jit,r0,r1,i0)
446 static void _gti_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
447 # define ner(r0,r1,r2) _ner(_jit,r0,r1,r2)
448 static void _ner(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
449 # define nei(r0,r1,i0) _nei(_jit,r0,r1,i0)
450 static void _nei(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
451 # define bltr(i0,r0,r1) _bltr(_jit,i0,r0,r1)
452 static jit_word_t _bltr(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
453 # define blti(i0,r0,i1) _blti(_jit,i0,r0,i1)
454 static jit_word_t _blti(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
455 # define bltr_u(i0,r0,r1) _bltr_u(_jit,i0,r0,r1)
456 static jit_word_t _bltr_u(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
457 # define blti_u(i0,r0,i1) _blti_u(_jit,i0,r0,i1)
458 static jit_word_t _blti_u(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
459 # define bler(i0,r0,r1) _bler(_jit,i0,r0,r1)
460 static jit_word_t _bler(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
461 # define blei(i0,r0,i1) _blei(_jit,i0,r0,i1)
462 static jit_word_t _blei(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
463 # define bler_u(i0,r0,r1) _bler_u(_jit,i0,r0,r1)
464 static jit_word_t _bler_u(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
465 # define blei_u(i0,r0,i1) _blei_u(_jit,i0,r0,i1)
466 static jit_word_t _blei_u(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
467 # define beqr(i0,r0,r1) _beqr(_jit,i0,r0,r1)
468 static jit_word_t _beqr(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
469 # define beqi(i0,r0,i1) _beqi(_jit,i0,r0,i1)
470 static jit_word_t _beqi(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
471 # define bger(i0,r0,r1) _bger(_jit,i0,r0,r1)
472 static jit_word_t _bger(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
473 # define bgei(i0,r0,i1) _bgei(_jit,i0,r0,i1)
474 static jit_word_t _bgei(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
475 # define bger_u(i0,r0,r1) _bger_u(_jit,i0,r0,r1)
476 static jit_word_t _bger_u(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
477 # define bgei_u(i0,r0,i1) _bgei_u(_jit,i0,r0,i1)
478 static jit_word_t _bgei_u(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
479 # define bgtr(i0,r0,r1) _bgtr(_jit,i0,r0,r1)
480 static jit_word_t _bgtr(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
481 # define bgti(i0,r0,i1) _bgti(_jit,i0,r0,i1)
482 static jit_word_t _bgti(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
483 # define bgtr_u(i0,r0,r1) _bgtr_u(_jit,i0,r0,r1)
484 static jit_word_t _bgtr_u(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
485 # define bgti_u(i0,r0,i1) _bgti_u(_jit,i0,r0,i1)
486 static jit_word_t _bgti_u(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
487 # define bner(i0,r0,r1) _bner(_jit,i0,r0,r1)
488 static jit_word_t _bner(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
489 # define bnei(i0,r0,i1) _bnei(_jit,i0,r0,i1)
490 static jit_word_t _bnei(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
491 # define baddr(i0,r0,r1,cc) _baddr(_jit,i0,r0,r1,cc)
492 static jit_word_t _baddr(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t,
494 # define baddi(i0,r0,i1,cc) _baddi(_jit,i0,r0,i1,cc)
495 static jit_word_t _baddi(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t,
497 # define baddr_u(i0,r0,r1,cc) _baddr_u(_jit,i0,r0,r1,cc)
498 static jit_word_t _baddr_u(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t,
500 # define baddi_u(i0,r0,i1,cc) _baddi_u(_jit,i0,r0,i1,cc)
501 static jit_word_t _baddi_u(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t,
503 # define boaddr(i0,r0,r1) baddr(i0,r0,r1,1)
504 # define boaddi(i0,r0,i1) baddi(i0,r0,i1,1)
505 # define boaddr_u(i0,r0,r1) baddr_u(i0,r0,r1,1)
506 # define boaddi_u(i0,r0,i1) baddi_u(i0,r0,i1,1)
507 # define bxaddr(i0,r0,r1) baddr(i0,r0,r1,0)
508 # define bxaddi(i0,r0,i1) baddi(i0,r0,i1,0)
509 # define bxaddr_u(i0,r0,r1) baddr_u(i0,r0,r1,0)
510 # define bxaddi_u(i0,r0,i1) baddi_u(i0,r0,i1,0)
511 # define bsubr(i0,r0,r1,cc) _bsubr(_jit,i0,r0,r1,cc)
512 static jit_word_t _bsubr(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t,
514 # define bsubi(i0,r0,i1,cc) _bsubi(_jit,i0,r0,i1,cc)
515 static jit_word_t _bsubi(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t,
517 # define bsubr_u(i0,r0,r1,cc) _bsubr_u(_jit,i0,r0,r1,cc)
518 static jit_word_t _bsubr_u(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t,
520 # define bsubi_u(i0,r0,i1,cc) _bsubi_u(_jit,i0,r0,i1,cc)
521 static jit_word_t _bsubi_u(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t,
523 # define bosubr(i0,r0,r1) bsubr(i0,r0,r1,1)
524 # define bosubi(i0,r0,i1) bsubi(i0,r0,i1,1)
525 # define bosubr_u(i0,r0,r1) bsubr_u(i0,r0,r1,1)
526 # define bosubi_u(i0,r0,i1) bsubi_u(i0,r0,i1,1)
527 # define bxsubr(i0,r0,r1) bsubr(i0,r0,r1,0)
528 # define bxsubi(i0,r0,i1) bsubi(i0,r0,i1,0)
529 # define bxsubr_u(i0,r0,r1) bsubr_u(i0,r0,r1,0)
530 # define bxsubi_u(i0,r0,i1) bsubi_u(i0,r0,i1,0)
531 # define bmxr(i0,r0,r1,cc) _bmxr(_jit,i0,r0,r1,cc)
532 static jit_word_t _bmxr(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t,
534 # define bmxi(i0,r0,i1,cc) _bmxi(_jit,i0,r0,i1,cc)
535 static jit_word_t _bmxi(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t,
537 # define bmsr(i0,r0,r1) bmxr(i0,r0,r1,1)
538 # define bmsi(i0,r0,i1) bmxi(i0,r0,i1,1)
539 # define bmcr(i0,r0,r1) bmxr(i0,r0,r1,0)
540 # define bmci(i0,r0,i1) bmxi(i0,r0,i1,0)
541 # define ldr_c(r0,r1) _ldr_c(_jit,r0,r1)
542 static void _ldr_c(jit_state_t*,jit_int32_t,jit_int32_t);
543 # define ldi_c(r0,i0) _ldi_c(_jit,r0,i0)
544 static void _ldi_c(jit_state_t*,jit_int32_t,jit_word_t);
545 # define ldr_uc(r0,r1) LDBU(r0,r1,0)
546 # define ldi_uc(r0,i0) _ldi_uc(_jit,r0,i0)
547 static void _ldi_uc(jit_state_t*,jit_int32_t,jit_word_t);
548 # define ldr_s(r0,r1) _ldr_s(_jit,r0,r1)
549 static void _ldr_s(jit_state_t*,jit_int32_t,jit_int32_t);
550 # define ldi_s(r0,i0) _ldi_s(_jit,r0,i0)
551 static void _ldi_s(jit_state_t*,jit_int32_t,jit_word_t);
552 # define ldr_us(r0,r1) LDWU(r0,r1,0)
553 # define ldi_us(r0,i0) _ldi_us(_jit,r0,i0)
554 static void _ldi_us(jit_state_t*,jit_int32_t,jit_word_t);
555 # define ldr_i(r0,r1) LDL(r0,r1,0)
556 # define ldi_i(r0,i0) _ldi_i(_jit,r0,i0)
557 static void _ldi_i(jit_state_t*,jit_int32_t,jit_word_t);
558 # define ldr_ui(r0,r1) _ldr_ui(_jit,r0,r1)
559 static void _ldr_ui(jit_state_t*,jit_int32_t,jit_int32_t);
560 # define ldi_ui(r0,i0) _ldi_ui(_jit,r0,i0)
561 static void _ldi_ui(jit_state_t*,jit_int32_t,jit_word_t);
562 # define ldr(r0,r1) ldr_l(r0,r1)
563 # define ldr_l(r0,r1) LDQ(r0,r1,0)
564 # define ldi_l(r0,i0) _ldi_l(_jit,r0,i0)
565 static void _ldi_l(jit_state_t*,jit_int32_t,jit_word_t);
566 # define ldxr_c(r0,r1,r2) _ldxr_c(_jit,r0,r1,r2)
567 static void _ldxr_c(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
568 # define ldxi_c(r0,r1,i0) _ldxi_c(_jit,r0,r1,i0)
569 static void _ldxi_c(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
570 # define ldxr_uc(r0,r1,r2) _ldxr_uc(_jit,r0,r1,r2)
571 static void _ldxr_uc(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
572 # define ldxi_uc(r0,r1,i0) _ldxi_uc(_jit,r0,r1,i0)
573 static void _ldxi_uc(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
574 # define ldxr_s(r0,r1,r2) _ldxr_s(_jit,r0,r1,r2)
575 static void _ldxr_s(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
576 # define ldxi_s(r0,r1,i0) _ldxi_s(_jit,r0,r1,i0)
577 static void _ldxi_s(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
578 # define ldxr_us(r0,r1,r2) _ldxr_us(_jit,r0,r1,r2)
579 static void _ldxr_us(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
580 # define ldxi_us(r0,r1,i0) _ldxi_us(_jit,r0,r1,i0)
581 static void _ldxi_us(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
582 # define ldxr_i(r0,r1,r2) _ldxr_i(_jit,r0,r1,r2)
583 static void _ldxr_i(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
584 # define ldxi_i(r0,r1,i0) _ldxi_i(_jit,r0,r1,i0)
585 static void _ldxi_i(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
586 # define ldxr_ui(r0,r1,r2) _ldxr_ui(_jit,r0,r1,r2)
587 static void _ldxr_ui(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
588 # define ldxi_ui(r0,r1,i0) _ldxi_ui(_jit,r0,r1,i0)
589 static void _ldxi_ui(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
590 # define ldxr(r0,r1,r2) ldxr_l(r0,r1,r2)
591 # define ldxr_l(r0,r1,r2) _ldxr_l(_jit,r0,r1,r2)
592 static void _ldxr_l(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
593 # define ldxi(r0,r1,i0) ldxi_l(r0,r1,i0)
594 # define ldxi_l(r0,r1,i0) _ldxi_l(_jit,r0,r1,i0)
595 static void _ldxi_l(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
596 # define str_c(r0,r1) STB(r1,r0,0)
597 # define sti_c(i0,r0) _sti_c(_jit,i0,r0)
598 static void _sti_c(jit_state_t*,jit_word_t,jit_int32_t);
599 # define str_s(r0,r1) STW(r1,r0,0)
600 # define sti_s(i0,r0) _sti_s(_jit,i0,r0)
601 static void _sti_s(jit_state_t*,jit_word_t,jit_int32_t);
602 # define str_i(r0,r1) STL(r1,r0,0)
603 # define sti_i(i0,r0) _sti_i(_jit,i0,r0)
604 static void _sti_i(jit_state_t*,jit_word_t,jit_int32_t);
605 # define str(r0,r1) str_l(r0,r1)
606 # define str_l(r0,r1) STQ(r1,r0,0)
607 # define sti_l(i0,r0) _sti_l(_jit,i0,r0)
608 static void _sti_l(jit_state_t*,jit_word_t,jit_int32_t);
609 # define stxr_c(r0,r1,r2) _stxr_c(_jit,r0,r1,r2)
610 static void _stxr_c(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
611 # define stxi_c(i0,r0,r1) _stxi_c(_jit,i0,r0,r1)
612 static void _stxi_c(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
613 # define stxr_s(r0,r1,r2) _stxr_s(_jit,r0,r1,r2)
614 static void _stxr_s(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
615 # define stxi_s(i0,r0,r1) _stxi_s(_jit,i0,r0,r1)
616 static void _stxi_s(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
617 # define stxr_i(r0,r1,r2) _stxr_i(_jit,r0,r1,r2)
618 static void _stxr_i(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
619 # define stxi_i(i0,r0,r1) _stxi_i(_jit,i0,r0,r1)
620 static void _stxi_i(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
621 # define stxr_l(r0,r1,r2) _stxr_l(_jit,r0,r1,r2)
622 static void _stxr_l(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
623 # define stxi(i0,r0,r1) stxi_l(i0,r0,r1)
624 # define stxi_l(i0,r0,r1) _stxi_l(_jit,i0,r0,r1)
625 static void _stxi_l(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
626 # define extr_c(r0,r1) _extr_c(_jit,r0,r1)
627 static void _extr_c(jit_state_t*,jit_int32_t,jit_int32_t);
628 # define extr_uc(r0,r1) _extr_uc(_jit,r0,r1)
629 static void _extr_uc(jit_state_t*,jit_int32_t,jit_int32_t);
630 # define extr_s(r0,r1) _extr_s(_jit,r0,r1)
631 static void _extr_s(jit_state_t*,jit_int32_t,jit_int32_t);
632 # define extr_us(r0,r1) _extr_us(_jit,r0,r1)
633 static void _extr_us(jit_state_t*,jit_int32_t,jit_int32_t);
634 # define extr_i(r0,r1) _extr_i(_jit,r0,r1)
635 static void _extr_i(jit_state_t*,jit_int32_t,jit_int32_t);
636 # define extr_ui(r0,r1) _extr_ui(_jit,r0,r1)
637 static void _extr_ui(jit_state_t*,jit_int32_t,jit_int32_t);
638 # define bswapr_us(r0,r1) _bswapr_us(_jit,r0,r1)
639 static void _bswapr_us(jit_state_t*,jit_int32_t,jit_int32_t);
640 # define bswapr_ui(r0,r1) _bswapr_ui(_jit,r0,r1)
641 static void _bswapr_ui(jit_state_t*,jit_int32_t,jit_int32_t);
642 # define bswapr_ul(r0,r1) _bswapr_ul(_jit,r0,r1)
643 static void _bswapr_ul(jit_state_t*,jit_int32_t,jit_int32_t);
644 # define jmpr(r0) JMP(_R31_REGNO,r0,0)
645 # define jmpi(i0) _jmpi(_jit,i0)
646 static jit_word_t _jmpi(jit_state_t*, jit_word_t);
647 # define jmpi_p(i0) _jmpi_p(_jit,i0)
648 static jit_word_t _jmpi_p(jit_state_t*, jit_word_t);
649 #define callr(r0) _callr(_jit,r0)
650 static void _callr(jit_state_t*, jit_int32_t);
651 # define calli(i0) _calli(_jit,i0)
652 static void _calli(jit_state_t*, jit_word_t);
653 # define calli_p(i0) _calli_p(_jit,i0)
654 static jit_word_t _calli_p(jit_state_t*, jit_word_t);
655 # define prolog(node) _prolog(_jit,node)
656 static void _prolog(jit_state_t*,jit_node_t*);
657 # define epilog(node) _epilog(_jit,node)
658 static void _epilog(jit_state_t*,jit_node_t*);
659 # define vastart(r0) _vastart(_jit, r0)
660 static void _vastart(jit_state_t*, jit_int32_t);
661 # define vaarg(r0, r1) _vaarg(_jit, r0, r1)
662 static void _vaarg(jit_state_t*, jit_int32_t, jit_int32_t);
663 # define patch_at(jump,label) _patch_at(_jit,jump,label)
664 static void _patch_at(jit_state_t*,jit_word_t,jit_word_t);
669 _Pcd(jit_state_t *_jit, int o, unsigned int n)
677 _Bra(jit_state_t *_jit, int o, int ra, int d)
682 ii((o<<26)|(ra<<21)|_u21(d));
686 _Mem(jit_state_t *_jit, int o, int ra, int rb, unsigned int d)
692 ii((o<<26)|(ra<<21)|(rb<<16)|_u16(d));
696 _Mbr(jit_state_t *_jit, int o, int ra, int rb, int h, int d)
703 ii((o<<26)|(ra<<21)|(rb<<16)|(h<<14)|_u14(d));
707 _Opr(jit_state_t *_jit, int o, int ra, int rb, unsigned int f, int rc)
714 ii((o<<26)|(ra<<21)|(rb<<16)|(_u11(f)<<5)|rc);
718 _Opi(jit_state_t *_jit, int o, int ra, unsigned int i, unsigned int f, int rc)
725 ii((o<<26)|(ra<<21)|(_u8(i)<<13)|(1<<12)|(_u7(f)<<5)|rc);
729 _nop(jit_state_t *_jit, jit_int32_t i0)
731 for (; i0 > 0; i0 -= 4)
737 _movr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
744 _movi(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
747 jit_int16_t s0, s1, s2, s3;
759 LDA(r0, _R31_REGNO, _u16(s0));
760 else if (_s32_p(i0)) {
761 LDA(r0, _R31_REGNO, _u16(s0));
762 LDAH(r0, r0, _u16(s1));
764 else if (_u32_p(i0)) {
765 LDA(r0, _R31_REGNO, _u16(s0));
767 LDAH(r0, r0, _u16(s1));
771 else if (_u32(i0) == 0) {
772 LDA(r0, _R31_REGNO, _u16(s2));
774 LDAH(r0, r0, _u16(s3));
778 reg = jit_get_reg(jit_class_gpr);
779 LDA(r0, _R31_REGNO, _u16(s0));
780 LDA(rn(reg), _R31_REGNO, _u16(s2));
782 LDAH(r0, r0, _u16(s1));
784 LDAH(rn(reg), rn(reg), _u16(s3));
787 lshi(rn(reg), rn(reg), 32);
788 orr(r0, r0, rn(reg));
794 _movi_p(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
798 jit_int16_t s0, s1, s2, s3;
800 reg = jit_get_reg(jit_class_gpr);
809 LDA(r0, _R31_REGNO, _u16(s0));
810 LDA(rn(reg), _R31_REGNO, _u16(s2));
811 LDAH(r0, r0, _u16(s1));
812 LDAH(rn(reg), rn(reg), _u16(s3));
815 lshi(rn(reg), rn(reg), 32);
816 orr(r0, r0, rn(reg));
822 _casx(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1,
823 jit_int32_t r2, jit_int32_t r3, jit_word_t i0)
825 jit_word_t jump0, jump1, again, done;
826 jit_int32_t iscasi, r1_reg;
827 if ((iscasi = (r1 == _NOREG))) {
828 r1_reg = jit_get_reg(jit_class_gpr);
832 again = _jit->pc.w; /* AGAIN */
833 LDQ_L(r0, r1, 0); /* Load r0 locked */
834 jump0 = bner(_jit->pc.w, r0, r2); /* bne FAIL r0 r2 */
835 movr(r0, r3); /* Move to r0 to attempt to store */
836 STQ_C(r0, r1, 0); /* r0 is an in/out argument */
838 BEQ(r0, 0); /* beqi AGAIN r0 0 */
839 patch_at(jump1, again);
841 BR(_R31_REGNO, 0); /* r0 set to 1 if store succeeded */
842 patch_at(jump0, _jit->pc.w); /* FAIL: */
843 movi(r0, 0); /* Already locked */
844 patch_at(jump1, _jit->pc.w);
846 jit_unget_reg(r1_reg);
850 _clor(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
857 _ctor(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
864 _addi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
870 LDA(r0, r1, _u16(i0));
872 reg = jit_get_reg(jit_class_gpr);
874 addr(r0, r1, rn(reg));
880 _addcr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
883 if (jit_carry == _NOREG)
884 jit_carry = jit_get_reg(jit_class_gpr);
886 reg = jit_get_reg(jit_class_gpr);
887 addr(rn(reg), r1, r2);
888 ltr_u(rn(jit_carry), rn(reg), r1);
894 ltr_u(rn(jit_carry), r0, r1);
899 _addci(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
902 if (jit_carry == _NOREG)
903 jit_carry = jit_get_reg(jit_class_gpr);
905 reg = jit_get_reg(jit_class_gpr);
906 addi(rn(reg), r1, i0);
907 ltr_u(rn(jit_carry), rn(reg), r1);
913 ltr_u(rn(jit_carry), r0, r1);
918 _addxr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
921 assert(jit_carry != _NOREG);
922 reg = jit_get_reg(jit_class_gpr);
923 movr(rn(reg), rn(jit_carry));
925 addcr(r0, r0, rn(reg));
930 _addxi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
933 assert(jit_carry != _NOREG);
934 reg = jit_get_reg(jit_class_gpr);
935 movr(rn(reg), rn(jit_carry));
937 addcr(r0, r0, rn(reg));
942 _subi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
947 else if (_s16_p(-i0))
948 LDA(r0, r1, _u16(-i0));
950 reg = jit_get_reg(jit_class_gpr);
952 subr(r0, r1, rn(reg));
958 _subcr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
961 if (jit_carry == _NOREG)
962 jit_carry = jit_get_reg(jit_class_gpr);
964 reg = jit_get_reg(jit_class_gpr);
965 subr(rn(reg), r1, r2);
966 ltr_u(rn(jit_carry), r1, rn(reg));
972 ltr_u(rn(jit_carry), r1, r0);
977 _subci(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
980 if (jit_carry == _NOREG)
981 jit_carry = jit_get_reg(jit_class_gpr);
983 reg = jit_get_reg(jit_class_gpr);
984 addi(rn(reg), r1, -i0);
985 ltr_u(rn(jit_carry), r1, rn(reg));
991 ltr_u(rn(jit_carry), r1, r0);
996 _subxr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
999 assert(jit_carry != _NOREG);
1000 reg = jit_get_reg(jit_class_gpr);
1001 movr(rn(reg), rn(jit_carry));
1003 subcr(r0, r0, rn(reg));
1008 _subxi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1011 assert(jit_carry != _NOREG);
1012 reg = jit_get_reg(jit_class_gpr);
1013 movr(rn(reg), rn(jit_carry));
1015 subcr(r0, r0, rn(reg));
1020 _rsbi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1027 _muli(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1033 reg = jit_get_reg(jit_class_gpr);
1035 mulr(r0, r1, rn(reg));
1041 _qmulr(jit_state_t *_jit, jit_int32_t r0,
1042 jit_int32_t r1, jit_int32_t r2, jit_int32_t r3)
1045 /* The only invalid condition is r0 == r1 */
1046 jit_int32_t t2, t3, s2, s3;
1047 if (r2 == r0 || r2 == r1) {
1048 s2 = jit_get_reg(jit_class_gpr);
1054 if (r3 == r0 || r3 == r1) {
1055 s3 = jit_get_reg(jit_class_gpr);
1061 qmulr_u(r0, r1, r2, r3);
1062 reg = jit_get_reg(jit_class_gpr);
1064 rshi(rn(reg), t2, 63);
1065 mulr(rn(reg), rn(reg), t3);
1066 addr(r1, r1, rn(reg));
1068 rshi(rn(reg), t3, 63);
1069 mulr(rn(reg), rn(reg), t2);
1070 addr(r1, r1, rn(reg));
1079 _qmuli(jit_state_t *_jit, jit_int32_t r0,
1080 jit_int32_t r1, jit_int32_t r2, jit_word_t i0)
1083 reg = jit_get_reg(jit_class_gpr);
1085 qmulr(r0, r1, r2, rn(reg));
1090 _qmulr_u(jit_state_t *_jit, jit_int32_t r0,
1091 jit_int32_t r1, jit_int32_t r2, jit_int32_t r3)
1094 if (r0 == r2 || r0 == r3) {
1095 reg = jit_get_reg(jit_class_gpr);
1096 mulr(rn(reg), r2, r3);
1101 if (r0 == r2 || r0 == r3) {
1108 _qmuli_u(jit_state_t *_jit, jit_int32_t r0,
1109 jit_int32_t r1, jit_int32_t r2, jit_word_t i0)
1114 reg = jit_get_reg(jit_class_gpr);
1115 muli(rn(reg), r2, i0);
1126 reg = jit_get_reg(jit_class_gpr);
1128 qmulr_u(r0, r1, r2, rn(reg));
1134 __idiv(jit_word_t u, jit_word_t v)
1140 _divr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1142 movr(_A0_REGNO, r1);
1143 movr(_A1_REGNO, r2);
1144 calli((jit_word_t)__idiv);
1145 movr(r0, _V0_REGNO);
1149 _divi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1151 movr(_A0_REGNO, r1);
1152 movi(_A1_REGNO, i0);
1153 calli((jit_word_t)__idiv);
1154 movr(r0, _V0_REGNO);
1158 __udiv(jit_uword_t u, jit_uword_t v)
1164 _divr_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1166 movr(_A0_REGNO, r1);
1167 movr(_A1_REGNO, r2);
1168 calli((jit_word_t)__udiv);
1169 movr(r0, _V0_REGNO);
1173 _divi_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1175 movr(_A0_REGNO, r1);
1176 movi(_A1_REGNO, i0);
1177 calli((jit_word_t)__udiv);
1178 movr(r0, _V0_REGNO);
1182 __irem(jit_word_t u, jit_word_t v)
1188 _remr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1190 movr(_A0_REGNO, r1);
1191 movr(_A1_REGNO, r2);
1192 calli((jit_word_t)__irem);
1193 movr(r0, _V0_REGNO);
1197 _remi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1199 movr(_A0_REGNO, r1);
1200 movi(_A1_REGNO, i0);
1201 calli((jit_word_t)__irem);
1202 movr(r0, _V0_REGNO);
1206 __urem(jit_uword_t u, jit_uword_t v)
1212 _remr_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1214 movr(_A0_REGNO, r1);
1215 movr(_A1_REGNO, r2);
1216 calli((jit_word_t)__urem);
1217 movr(r0, _V0_REGNO);
1221 _remi_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1223 movr(_A0_REGNO, r1);
1224 movi(_A1_REGNO, i0);
1225 calli((jit_word_t)__urem);
1226 movr(r0, _V0_REGNO);
1230 __idivrem(jit_word_t u, jit_word_t v, jit_word_t *rem)
1237 _qdivr(jit_state_t *_jit,
1238 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_int32_t r3)
1240 movr(_A0_REGNO, r2);
1241 movr(_A1_REGNO, r3);
1242 subi(_A2_REGNO, _FP_REGNO, 8);
1243 calli((jit_word_t)__idivrem);
1244 movr(r0, _V0_REGNO);
1245 ldxi(r1, _FP_REGNO, -8);
1249 _qdivi(jit_state_t *_jit,
1250 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_word_t i0)
1252 movr(_A0_REGNO, r2);
1253 movi(_A1_REGNO, i0);
1254 subi(_A2_REGNO, _FP_REGNO, 8);
1255 calli((jit_word_t)__idivrem);
1256 movr(r0, _V0_REGNO);
1257 ldxi(r1, _FP_REGNO, -8);
1261 __udivrem(jit_uword_t u, jit_uword_t v, jit_uword_t *rem)
1268 _qdivr_u(jit_state_t *_jit,
1269 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_int32_t r3)
1271 movr(_A0_REGNO, r2);
1272 movr(_A1_REGNO, r3);
1273 subi(_A2_REGNO, _FP_REGNO, 8);
1274 calli((jit_word_t)__udivrem);
1275 movr(r0, _V0_REGNO);
1276 ldxi(r1, _FP_REGNO, -8);
1280 _qdivi_u(jit_state_t *_jit,
1281 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_word_t i0)
1283 movr(_A0_REGNO, r2);
1284 movi(_A1_REGNO, i0);
1285 subi(_A2_REGNO, _FP_REGNO, 8);
1286 calli((jit_word_t)__udivrem);
1287 movr(r0, _V0_REGNO);
1288 ldxi(r1, _FP_REGNO, -8);
1292 _lshi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1294 assert(i0 >= 0 && i0 < 64);
1299 _rshi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1301 assert(i0 >= 0 && i0 < 64);
1306 _rshi_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1308 assert(i0 >= 0 && i0 < 64);
1313 _andi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1319 reg = jit_get_reg(jit_class_gpr);
1321 andr(r0, r1, rn(reg));
1327 _ori(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1333 reg = jit_get_reg(jit_class_gpr);
1335 orr(r0, r1, rn(reg));
1341 _xori(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1347 reg = jit_get_reg(jit_class_gpr);
1349 xorr(r0, r1, rn(reg));
1355 _lti(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1361 reg = jit_get_reg(jit_class_gpr);
1363 ltr(r0, r1, rn(reg));
1369 _lti_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1373 CMPULTi(r1, i0, r0);
1375 reg = jit_get_reg(jit_class_gpr);
1377 ltr_u(r0, r1, rn(reg));
1383 _lei(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1389 reg = jit_get_reg(jit_class_gpr);
1391 ler(r0, r1, rn(reg));
1397 _lei_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1403 CMPULEi(r1, i0, r0);
1405 reg = jit_get_reg(jit_class_gpr);
1407 ler_u(r0, r1, rn(reg));
1413 _eqi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1419 reg = jit_get_reg(jit_class_gpr);
1421 eqr(r0, r1, rn(reg));
1427 _gei(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1430 reg = jit_get_reg(jit_class_gpr);
1432 ger(r0, r1, rn(reg));
1437 _gei_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1440 reg = jit_get_reg(jit_class_gpr);
1442 ger_u(r0, r1, rn(reg));
1447 _gti(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1450 reg = jit_get_reg(jit_class_gpr);
1452 gtr(r0, r1, rn(reg));
1457 _gti_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1460 reg = jit_get_reg(jit_class_gpr);
1462 gtr_u(r0, r1, rn(reg));
1467 _ner(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1474 _nei(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1482 reg = jit_get_reg(jit_class_gpr);
1484 ner(r0, r1, rn(reg));
1490 _bltr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
1494 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1495 ltr(rn(reg), r0, r1);
1497 BNE(rn(reg), ((i0 - w) >> 2) - 1);
1503 _blti(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
1509 BLT(r0, ((i0 - w) >> 2) - 1);
1512 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1513 lti(rn(reg), r0, i1);
1515 BNE(rn(reg), ((i0 - w) >> 2) - 1);
1522 _bltr_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
1526 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1527 ltr_u(rn(reg), r0, r1);
1529 BNE(rn(reg), ((i0 - w) >> 2) - 1);
1535 _blti_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
1539 /* FIXME cannot optimize zero because need to return a patcheable address */
1540 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1541 lti_u(rn(reg), r0, i1);
1543 BNE(rn(reg), ((i0 - w) >> 2) - 1);
1549 _bler(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
1553 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1554 ler(rn(reg), r0, r1);
1556 BNE(rn(reg), ((i0 - w) >> 2) - 1);
1562 _blei(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
1568 BLE(r0, ((i0 - w) >> 2) - 1);
1571 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1572 lei(rn(reg), r0, i1);
1574 BNE(rn(reg), ((i0 - w) >> 2) - 1);
1581 _bler_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
1585 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1586 ler_u(rn(reg), r0, r1);
1588 BNE(rn(reg), ((i0 - w) >> 2) - 1);
1594 _blei_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
1600 BEQ(r0, ((i0 - w) >> 2) - 1);
1603 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1604 lei_u(rn(reg), r0, i1);
1606 BNE(rn(reg), ((i0 - w) >> 2) - 1);
1613 _beqr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
1617 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1618 eqr(rn(reg), r0, r1);
1620 BNE(rn(reg), ((i0 - w) >> 2) - 1);
1626 _beqi(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
1632 BEQ(r0, ((i0 - w) >> 2) - 1);
1635 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1636 eqi(rn(reg), r0, i1);
1638 BNE(rn(reg), ((i0 - w) >> 2) - 1);
1645 _bger(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
1649 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1650 ger(rn(reg), r0, r1);
1652 BNE(rn(reg), ((i0 - w) >> 2) - 1);
1658 _bgei(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
1664 BGE(r0, ((i0 - w) >> 2) - 1);
1667 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1668 gei(rn(reg), r0, i1);
1670 BNE(rn(reg), ((i0 - w) >> 2) - 1);
1677 _bger_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
1681 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1682 ger_u(rn(reg), r0, r1);
1684 BNE(rn(reg), ((i0 - w) >> 2) - 1);
1690 _bgei_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
1694 /* always true if i1 == 0 */
1697 BR(r0, ((i0 - w) >> 2) - 1);
1700 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1701 gei_u(rn(reg), r0, i1);
1703 BNE(rn(reg), ((i0 - w) >> 2) - 1);
1710 _bgtr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
1714 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1715 gtr(rn(reg), r0, r1);
1717 BNE(rn(reg), ((i0 - w) >> 2) - 1);
1723 _bgti(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
1729 BGT(r0, ((i0 - w) >> 2) - 1);
1732 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1733 gti(rn(reg), r0, i1);
1735 BNE(rn(reg), ((i0 - w) >> 2) - 1);
1742 _bgtr_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
1746 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1747 gtr_u(rn(reg), r0, r1);
1749 BNE(rn(reg), ((i0 - w) >> 2) - 1);
1755 _bgti_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
1759 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1760 gti_u(rn(reg), r0, i1);
1762 BNE(rn(reg), ((i0 - w) >> 2) - 1);
1768 _bner(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
1772 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1773 eqr(rn(reg), r0, r1);
1775 BEQ(rn(reg), ((i0 - w) >> 2) - 1);
1781 _bnei(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
1787 BNE(r0, ((i0 - w) >> 2) - 1);
1790 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1791 eqi(rn(reg), r0, i1);
1793 BEQ(rn(reg), ((i0 - w) >> 2) - 1);
1800 _baddr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1,
1808 /* t0 = r0 + r1; overflow = r1 < 0 ? r0 < t0 : t0 < r0 */
1809 t0 = jit_get_reg(jit_class_gpr);
1810 t1 = jit_get_reg(jit_class_gpr);
1811 t2 = jit_get_reg(jit_class_gpr);
1812 t3 = jit_get_reg(jit_class_gpr|jit_class_nospill);
1813 addr(rn(t0), r0, r1); /* t0 = r0 + r1 */
1814 ltr(rn(t1), r1, _R31_REGNO); /* t1 = r1 < 0 */
1815 ltr(rn(t2), r0, rn(t0)); /* t2 = r0 < t0 */
1816 ltr(rn(t3), rn(t0), r0); /* t3 = t0 < r0 */
1817 movr(r0, rn(t0)); /* r0 += r1 */
1818 CMOVNE(rn(t1), rn(t2), rn(t3)); /* if (t1 == 0) t3 = t2; */
1824 BNE(rn(t3), ((i0 - w) >> 2) - 1);
1826 BEQ(rn(t3), ((i0 - w) >> 2) - 1);
1832 _baddi(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1,
1837 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1839 w = baddr(i0, r0, rn(reg), carry);
1845 _baddr_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1,
1851 t0 = jit_get_reg(jit_class_gpr);
1852 t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
1853 addr(rn(t0), r0, r1);
1854 ltr_u(rn(t1), rn(t0), r0);
1859 BNE(rn(t1), ((i0 - w) >> 2) - 1);
1861 BEQ(rn(t1), ((i0 - w) >> 2) - 1);
1867 _baddi_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1,
1873 t0 = jit_get_reg(jit_class_gpr);
1874 t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
1875 addi(rn(t0), r0, i1);
1876 ltr_u(rn(t1), rn(t0), r0);
1881 BNE(rn(t1), ((i0 - w) >> 2) - 1);
1883 BEQ(rn(t1), ((i0 - w) >> 2) - 1);
1889 _bsubr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1,
1897 /* t0 = r0 - r1; overflow = 0 < r1 ? r0 < t0 : t0 < r0 */
1898 t0 = jit_get_reg(jit_class_gpr);
1899 t1 = jit_get_reg(jit_class_gpr);
1900 t2 = jit_get_reg(jit_class_gpr);
1901 t3 = jit_get_reg(jit_class_gpr|jit_class_nospill);
1902 subr(rn(t0), r0, r1); /* r0 = r0 - r1 */
1903 ltr(rn(t1), _R31_REGNO, r1); /* t1 = 0 < r1 */
1904 ltr(rn(t2), r0, rn(t0)); /* t2 = r0 < t0 */
1905 ltr(rn(t3), rn(t0), r0); /* t3 = t0 < r0 */
1906 movr(r0, rn(t0)); /* r0 -= r1 */
1907 CMOVNE(rn(t1), rn(t2), rn(t3)); /* if (t1 == 0) t3 = t2; */
1913 BNE(rn(t3), ((i0 - w) >> 2) - 1);
1915 BEQ(rn(t3), ((i0 - w) >> 2) - 1);
1921 _bsubi(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1,
1926 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1928 w = bsubr(i0, r0, rn(reg), carry);
1934 _bsubr_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1,
1940 t0 = jit_get_reg(jit_class_gpr);
1941 t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
1942 subr(rn(t0), r0, r1);
1943 ltr_u(rn(t1), r0, rn(t0));
1948 BNE(rn(t1), ((i0 - w) >> 2) - 1);
1950 BEQ(rn(t1), ((i0 - w) >> 2) - 1);
1956 _bsubi_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1,
1962 t0 = jit_get_reg(jit_class_gpr);
1963 t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
1964 subi(rn(t0), r0, i1);
1965 ltr_u(rn(t1), r0, rn(t0));
1970 BNE(rn(t1), ((i0 - w) >> 2) - 1);
1972 BEQ(rn(t1), ((i0 - w) >> 2) - 1);
1978 _bmxr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1,
1983 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
1984 andr(rn(t0), r0, r1);
1987 BNE(rn(t0), ((i0 - w) >> 2) - 1);
1989 BEQ(rn(t0), ((i0 - w) >> 2) - 1);
1995 _bmxi(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1,
2000 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2001 andi(rn(t0), r0, i1);
2004 BNE(rn(t0), ((i0 - w) >> 2) - 1);
2006 BEQ(rn(t0), ((i0 - w) >> 2) - 1);
2012 _ldr_c(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
2019 _ldi_c(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
2023 LDBU(r0, _R31_REGNO, _u16(i0));
2027 reg = jit_get_reg(jit_class_gpr);
2035 _ldi_uc(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
2039 LDBU(r0, _R31_REGNO, _u16(i0));
2041 reg = jit_get_reg(jit_class_gpr);
2043 ldr_uc(r0, rn(reg));
2049 _ldr_s(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
2056 _ldi_s(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
2060 LDWU(r0, _R31_REGNO, _u16(i0));
2064 reg = jit_get_reg(jit_class_gpr);
2072 _ldi_us(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
2076 LDWU(r0, _R31_REGNO, _u16(i0));
2078 reg = jit_get_reg(jit_class_gpr);
2080 ldr_us(r0, rn(reg));
2086 _ldi_i(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
2090 LDL(r0, _R31_REGNO, _u16(i0));
2092 reg = jit_get_reg(jit_class_gpr);
2100 _ldr_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
2107 _ldi_ui(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
2111 LDL(r0, _R31_REGNO, _u16(i0));
2115 reg = jit_get_reg(jit_class_gpr);
2117 ldr_ui(r0, rn(reg));
2123 _ldi_l(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
2127 LDQ(r0, _R31_REGNO, _u16(i0));
2129 reg = jit_get_reg(jit_class_gpr);
2137 _ldxr_c(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2140 reg = jit_get_reg(jit_class_gpr);
2141 addr(rn(reg), r1, r2);
2147 _ldxi_c(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2151 LDBU(r0, r1, _u16(i0));
2155 reg = jit_get_reg(jit_class_gpr);
2156 addi(rn(reg), r1, i0);
2163 _ldxr_uc(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2166 reg = jit_get_reg(jit_class_gpr);
2167 addr(rn(reg), r1, r2);
2168 ldr_uc(r0, rn(reg));
2173 _ldxi_uc(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2177 LDBU(r0, r1, _u16(i0));
2179 reg = jit_get_reg(jit_class_gpr);
2180 addi(rn(reg), r1, i0);
2181 ldr_uc(r0, rn(reg));
2187 _ldxr_s(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2190 reg = jit_get_reg(jit_class_gpr);
2191 addr(rn(reg), r1, r2);
2197 _ldxi_s(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2201 LDWU(r0, r1, _u16(i0));
2205 reg = jit_get_reg(jit_class_gpr);
2206 addi(rn(reg), r1, i0);
2213 _ldxr_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2216 reg = jit_get_reg(jit_class_gpr);
2217 addr(rn(reg), r1, r2);
2218 ldr_us(r0, rn(reg));
2223 _ldxi_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2227 LDWU(r0, r1, _u16(i0));
2229 reg = jit_get_reg(jit_class_gpr);
2230 addi(rn(reg), r1, i0);
2231 ldr_us(r0, rn(reg));
2237 _ldxr_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2240 reg = jit_get_reg(jit_class_gpr);
2241 addr(rn(reg), r1, r2);
2247 _ldxi_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2251 LDL(r0, r1, _u16(i0));
2253 reg = jit_get_reg(jit_class_gpr);
2254 addi(rn(reg), r1, i0);
2261 _ldxr_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2264 reg = jit_get_reg(jit_class_gpr);
2265 addr(rn(reg), r1, r2);
2266 ldr_ui(r0, rn(reg));
2271 _ldxi_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2275 LDL(r0, r1, _u16(i0));
2279 reg = jit_get_reg(jit_class_gpr);
2280 addi(rn(reg), r1, i0);
2281 ldr_ui(r0, rn(reg));
2287 _ldxr_l(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2290 reg = jit_get_reg(jit_class_gpr);
2291 addr(rn(reg), r1, r2);
2297 _ldxi_l(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2301 LDQ(r0, r1, _u16(i0));
2303 reg = jit_get_reg(jit_class_gpr);
2304 addi(rn(reg), r1, i0);
2311 _sti_c(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
2315 STB(r0, _R31_REGNO, _u16(i0));
2317 reg = jit_get_reg(jit_class_gpr);
2325 _sti_s(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
2329 STW(r0, _R31_REGNO, _u16(i0));
2331 reg = jit_get_reg(jit_class_gpr);
2339 _sti_i(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
2343 STL(r0, _R31_REGNO, _u16(i0));
2345 reg = jit_get_reg(jit_class_gpr);
2353 _sti_l(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
2357 STQ(r0, _R31_REGNO, _u16(i0));
2359 reg = jit_get_reg(jit_class_gpr);
2367 _stxr_c(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2370 reg = jit_get_reg(jit_class_gpr);
2371 addr(rn(reg), r0, r1);
2377 _stxi_c(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2381 STB(r1, r0, _u16(i0));
2383 reg = jit_get_reg(jit_class_gpr);
2384 addi(rn(reg), r0, i0);
2391 _stxr_s(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2394 reg = jit_get_reg(jit_class_gpr);
2395 addr(rn(reg), r0, r1);
2401 _stxi_s(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2405 STW(r1, r0, _u16(i0));
2407 reg = jit_get_reg(jit_class_gpr);
2408 addi(rn(reg), r0, i0);
2415 _stxr_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2418 reg = jit_get_reg(jit_class_gpr);
2419 addr(rn(reg), r0, r1);
2425 _stxi_i(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2429 STL(r1, r0, _u16(i0));
2431 reg = jit_get_reg(jit_class_gpr);
2432 addi(rn(reg), r0, i0);
2439 _stxr_l(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2442 reg = jit_get_reg(jit_class_gpr);
2443 addr(rn(reg), r0, r1);
2449 _stxi_l(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2453 STQ(r1, r0, _u16(i0));
2455 reg = jit_get_reg(jit_class_gpr);
2456 addi(rn(reg), r0, i0);
2463 _extr_c(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
2470 _extr_uc(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
2477 _extr_s(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
2484 _extr_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
2491 _extr_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
2498 _extr_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
2505 _bswapr_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
2508 t0 = jit_get_reg(jit_class_gpr);
2509 EXTBLi(r1, 0, rn(t0));
2511 SLLi(rn(t0), 8, rn(t0));
2517 _bswapr_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
2523 t0 = jit_get_reg(jit_class_gpr);
2524 t1 = jit_get_reg(jit_class_gpr);
2525 t2 = jit_get_reg(jit_class_gpr);
2526 t3 = jit_get_reg(jit_class_gpr);
2527 EXTBLi(r1, 3, rn(t0));
2528 INSBLi(r1, 3, rn(t1));
2529 SLLi(r1, 8, rn(t2));
2530 ZAPNOTi(rn(t2), 4, rn(t2));
2531 SRLi(r1, 8, rn(t3));
2532 OR(rn(t0), rn(t1), r0);
2534 ZAPNOTi(rn(t3), 2, rn(t3));
2543 _bswapr_ul(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
2548 assert(_jitc->function != NULL);
2549 t0 = jit_get_reg(jit_class_fpr);
2550 t1 = jit_get_reg(jit_class_gpr);
2551 t2 = jit_get_reg(jit_class_gpr);
2552 stxi(-8, _FP_REGNO, r1); /* r1 = ABCD EFGH */
2553 LDG(rn(t0), _FP_REGNO, _u16(-8)); /* t0 = GHEF CDAB */
2554 STT(rn(t0), _FP_REGNO, _u16(-8));
2555 ldxi(rn(t1), _FP_REGNO, -8); /* t1 = GHEF CDAB */
2556 lshi(rn(t2), rn(t1), 8); /* t2 = HEFC DAB. */
2557 rshi_u(rn(t1), rn(t1), 8); /* t1 = .GHE FCDA */
2558 ZAPi(rn(t2), 0x55, rn(t2)); /* t2 = H.F. D.B. */
2559 ZAPi(rn(t1), 0xaa, rn(t1)); /* t1 = .G.E .C.A */
2560 orr(r0, rn(t1), rn(t2)); /* r0 = HGFE DCBA */
2567 _jmpi(jit_state_t *_jit, jit_word_t i0)
2572 d = ((i0 - w) >> 2) - 1;
2581 _jmpi_p(jit_state_t *_jit, jit_word_t i0)
2585 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2586 w = movi_p(rn(reg), i0);
2593 _callr(jit_state_t *_jit, jit_int32_t r0)
2595 if (r0 != _PV_REGNO)
2597 JSR(_RA_REGNO, _PV_REGNO, 0);
2601 _calli(jit_state_t *_jit, jit_word_t i0)
2603 /* FIXME use a small buffer to load constants - using gp */
2608 d = ((i0 - w) >> 2) - 1;
2614 movi(_PV_REGNO, i0);
2620 _calli_p(jit_state_t *_jit, jit_word_t i0)
2623 w = movi_p(_PV_REGNO, i0);
2629 _prolog(jit_state_t *_jit, jit_node_t *node)
2632 if (_jitc->function->define_frame || _jitc->function->assume_frame) {
2633 jit_int32_t frame = -_jitc->function->frame;
2634 assert(_jitc->function->self.aoff >= frame);
2635 if (_jitc->function->assume_frame)
2637 _jitc->function->self.aoff = frame;
2639 if (_jitc->function->allocar)
2640 _jitc->function->self.aoff &= -8;
2641 _jitc->function->stack = ((_jitc->function->self.alen -
2642 _jitc->function->self.aoff) + 7) & -8;
2643 /* ldgp gp, 0(pv) */
2644 LDAH(_PV_REGNO, _GP_REGNO, 0);
2645 LDA(_GP_REGNO, _GP_REGNO, 0);
2646 /* callee save registers */
2647 subi(_SP_REGNO, _SP_REGNO, stack_framesize);
2648 stxi(0, _SP_REGNO, _RA_REGNO);
2649 stxi(8, _SP_REGNO, _FP_REGNO);
2650 # define SPILL(N, O) \
2651 if (jit_regset_tstbit(&_jitc->function->regset, N)) \
2652 stxi(O, _SP_REGNO, N##_REGNO)
2653 # define SPILLD(N, O) \
2654 if (jit_regset_tstbit(&_jitc->function->regset, N)) \
2655 stxi_d(O, _SP_REGNO, N##_REGNO)
2672 movr(_FP_REGNO, _SP_REGNO);
2674 if (_jitc->function->stack)
2675 subi(_SP_REGNO, _SP_REGNO, _jitc->function->stack);
2676 if (_jitc->function->allocar) {
2677 reg = jit_get_reg(jit_class_gpr);
2678 movi(rn(reg), _jitc->function->self.aoff);
2679 stxi_i(_jitc->function->aoffoff, _FP_REGNO, rn(reg));
2683 if (_jitc->function->self.call & jit_call_varargs) {
2684 for (reg = _jitc->function->self.argi; jit_arg_reg_p(reg); ++reg)
2685 stxi(stack_framesize - 48 + reg * 8, _FP_REGNO, rn(_A0 - reg));
2686 for (reg = _jitc->function->self.argi; jit_arg_reg_p(reg); ++reg)
2687 stxi_d(stack_framesize - 96 + reg * 8, _FP_REGNO, rn(_F16 - reg));
2692 _epilog(jit_state_t *_jit, jit_node_t *node)
2694 if (_jitc->function->assume_frame)
2696 movr(_SP_REGNO, _FP_REGNO);
2697 ldxi(_RA_REGNO, _SP_REGNO, 0);
2698 ldxi(_FP_REGNO, _SP_REGNO, 8);
2699 # define LOAD(N, O) \
2700 if (jit_regset_tstbit(&_jitc->function->regset, N)) \
2701 ldxi(N##_REGNO, _SP_REGNO, O)
2702 # define LOADD(N, O) \
2703 if (jit_regset_tstbit(&_jitc->function->regset, N)) \
2704 ldxi_d(N##_REGNO, _SP_REGNO, O)
2721 addi(_SP_REGNO, _SP_REGNO, stack_framesize);
2722 RET(_R31_REGNO, _RA_REGNO, 1); /* 1 means procedure return
2723 * 0 means no procedure return
2724 * other values are reserved */
2728 _vastart(jit_state_t *_jit, jit_int32_t r0)
2732 /* Return jit_va_list_t in the register argument */
2733 addi(r0, _FP_REGNO, _jitc->function->vaoff);
2735 reg = jit_get_reg(jit_class_gpr);
2737 /* The base field is constant. */
2738 addi(rn(reg), _FP_REGNO, stack_framesize - 48);
2739 stxi(offsetof(jit_va_list_t, base), r0, rn(reg));
2741 /* Initialize the offset field */
2742 if (_jitc->function->vagp < 6)
2743 movi(rn(reg), _jitc->function->vagp * 8);
2745 movi(rn(reg), _jitc->function->self.size - (stack_framesize - 48));
2746 stxi(offsetof(jit_va_list_t, offset), r0, rn(reg));
2752 _vaarg(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
2754 jit_int32_t rg0, rg1;
2756 assert(_jitc->function->self.call & jit_call_varargs);
2758 rg0 = jit_get_reg(jit_class_gpr);
2759 rg1 = jit_get_reg(jit_class_gpr);
2761 /* Load the base in first temporary. */
2762 ldxi(rn(rg0), r1, offsetof(jit_va_list_t, base));
2764 /* Load the offset in the second temporary. */
2765 ldxi(rn(rg1), r1, offsetof(jit_va_list_t, offset));
2767 /* Load the argument */
2768 ldxr(r0, rn(rg0), rn(rg1));
2770 /* No longer needed. */
2773 /* Update offset. */
2774 addi(rn(rg1), rn(rg1), 8);
2775 stxi(offsetof(jit_va_list_t, offset), r1, rn(rg1));
2780 _patch_at(jit_state_t *_jit, jit_word_t instr, jit_word_t label)
2787 jit_int16_t s0, s1, s2, s3;
2789 switch (_u6(u.i[0] >> 26)) {
2790 /* BLT BLE BEQ BGE */
2791 case 0x3a: case 0x3b: case 0x39: case 0x3e:
2792 /* BGT BNE BLBC BLBS */
2793 case 0x3f: case 0x3d: case 0x38: case 0x3c:
2795 case 0x30: case 0x34:
2796 /* FBLT FBLE FBEQ FBGE */
2797 case 0x32: case 0x33: case 0x31: case 0x36:
2799 case 0x37: case 0x35:
2800 d = ((label - instr) >> 2) - 1;
2802 u.i[0] &= ~0x1fffff;
2806 case 0x08: /* movi_p */
2818 assert(_u6(u.i[1] >> 26) == 0x08);
2822 assert(_u6(u.i[2] >> 26) == 0x09);
2826 assert(_u6(u.i[3] >> 26) == 0x09);
2830 assert(_u6(u.i[4] >> 26) == 0x12 && _u7(u.i[4] >> 5) == 0x39);
2832 assert(_u6(u.i[5] >> 26) == 0x12 && _u7(u.i[5] >> 5) == 0x34);
2834 assert(_u6(u.i[6] >> 26) == 0x12 && _u7(u.i[6] >> 5) == 0x39);
2836 assert(_u6(u.i[7] >> 26) == 0x11 && _u7(u.i[7] >> 5) == 0x20);