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 ldr(r0,r1) ldr_l(r0,r1)
56 # define ldi(r0,i0) ldi_l(r0,i0)
57 # define ldxr(r0,r1,r2) ldxr_l(r0,r1,r2)
58 # define ldxi(r0,r1,i0) ldxi_l(r0,r1,i0)
59 # define str(r0,r1) str_l(r0,r1)
60 # define sti(i0,r0) sti_l(i0,r0)
61 # define stxr(r0,r1,r2) stxr_l(r0,r1,r2)
62 # define stxi(i0,r0,r1) stxi_l(i0,r0,r1)
63 # define stack_framesize 224
64 # define _S0_REGNO 0x09
65 # define _S1_REGNO 0x0a
66 # define _S2_REGNO 0x0b
67 # define _S3_REGNO 0x0c
68 # define _S4_REGNO 0x0d
69 # define _S5_REGNO 0x0e
70 # define _FP_REGNO 0x0f
71 # define _A0_REGNO 0x10
72 # define _A1_REGNO 0x11
73 # define _A2_REGNO 0x12
74 # define _V0_REGNO 0x00
75 # define _T0_REGNO 0x01
76 # define _T1_REGNO 0x02
77 # define _RA_REGNO 0x1a
78 # define _PV_REGNO 0x1b
79 # define _GP_REGNO 0x1d
80 # define _SP_REGNO 0x1e
81 # define _R31_REGNO 0x1f
82 # define Pcd(o,n) _Pcd(_jit,o,n)
83 static void _Pcd(jit_state_t*,int,unsigned int) maybe_unused;
84 # define Bra(o,ra,d) _Bra(_jit,o,ra,d)
85 static void _Bra(jit_state_t*,int,int,int);
86 # define Mem(o,ra,rb,d) _Mem(_jit,o,ra,rb,d)
87 static void _Mem(jit_state_t*,int,int,int,unsigned int);
88 # define Mbr(o,ra,rb,h,d) _Mbr(_jit,o,ra,rb,h,d)
89 static void _Mbr(jit_state_t*,int,int,int,int,int);
90 # define Opr(o,ra,rb,f,rc) _Opr(_jit,o,ra,rb,f,rc)
91 static void _Opr(jit_state_t*,int,int,int,unsigned int,int);
92 # define Opi(o,ra,i,f,rc) _Opi(_jit,o,ra,i,f,rc)
93 static void _Opi(jit_state_t*,int,int,unsigned int,unsigned int,int);
94 # define ADDL(ra,rb,rc) Opr(0x10,ra,rb,0x00,rc)
95 # define ADDLi(ra,im,rc) Opi(0x10,ra,im,0x00,rc)
96 # define ADDL_V(ra,rb,rc) Opr(0x10,ra,rb,0x40,rc)
97 # define ADDL_Vi(ra,im,rc) Opi(0x10,ra,im,0x40,rc)
98 # define ADDQ(ra,rb,rc) Opr(0x10,ra,rb,0x20,rc)
99 # define ADDQi(ra,im,rc) Opi(0x10,ra,im,0x20,rc)
100 # define ADDQ_V(ra,rb,rc) Opr(0x10,ra,rb,0x60,rc)
101 # define ADDQ_Vi(ra,im,rc) Opi(0x10,ra,im,0x60,rc)
102 # define AMASK(rb,rc) Opr(0x11,_R31_REGNO,rb,0x61,rc)
103 # define AND(ra,rb,rc) Opr(0x11,ra,rb,0x00,rc)
104 # define ANDi(ra,im,rc) Opi(0x11,ra,im,0x00,rc)
105 # define BEQ(ra,d) Bra(0x39,ra,d)
106 # define BGE(ra,d) Bra(0x3e,ra,d)
107 # define BGT(ra,d) Bra(0x3f,ra,d)
108 # define BIC(ra,rb,rc) Opr(0x11,ra,rb,0x08,rc)
109 # define ANDNOT(ra,rb,rc) BIC(ra,rb,rc)
110 # define BICi(ra,im,rc) Opi(0x11,ra,im,0x08,rc)
111 # define ANDNOTi(ra,im,rc) BICi(ra,im,rc)
112 # define BIS(ra,rb,rc) Opr(0x11,ra,rb,0x20,rc)
113 # define BISi(ra,im,rc) Opi(0x11,ra,im,0x20,rc)
114 # define OR(ra,rb,rc) BIS(ra,rb,rc)
115 # define ORi(ra,im,rc) BISi(ra,im,rc)
116 # define BLBC(ra,d) Bra(0x38,ra,d)
117 # define BLBS(ra,d) Bra(0x3c,ra,d)
118 # define BLE(ra,d) Bra(0x3b,ra,d)
119 # define BLT(ra,d) Bra(0x3a,ra,d)
120 # define BNE(ra,d) Bra(0x3d,ra,d)
121 # define BR(ra,d) Bra(0x30,ra,d)
122 # define BSR(ra,d) Bra(0x34,ra,d)
123 # define CALL_PAL(c) Pcd(0x00,c)
124 # define CMOVEQ(ra,rb,rc) Opr(0x11,ra,rb,0x24,rc)
125 # define CMOVEQi(ra,im,rc) Opi(0x11,ra,im,0x24,rc)
126 # define CMOVGE(ra,rb,rc) Opr(0x11,ra,rb,0x46,rc)
127 # define CMOVGEi(ra,im,rc) Opi(0x11,ra,im,0x46,rc)
128 # define CMOVGT(ra,rb,rc) Opr(0x11,ra,rb,0x66,rc)
129 # define CMOVGTi(ra,im,rc) Opi(0x11,ra,im,0x66,rc)
130 # define CMOVLBC(ra,rb,rc) Opr(0x11,ra,rb,0x16,rc)
131 # define CMOVLBCi(ra,im,rc) Opi(0x11,ra,im,0x16,rc)
132 # define CMOVLBS(ra,rb,rc) Opr(0x11,ra,rb,0x14,rc)
133 # define CMOVLBSi(ra,im,rc) Opi(0x11,ra,im,0x14,rc)
134 # define CMOVLE(ra,rb,rc) Opr(0x11,ra,rb,0x64,rc)
135 # define CMOVLEi(ra,im,rc) Opi(0x11,ra,im,0x64,rc)
136 # define CMOVLT(ra,rb,rc) Opr(0x11,ra,rb,0x44,rc)
137 # define CMOVLTi(ra,im,rc) Opi(0x11,ra,im,0x44,rc)
138 # define CMOVNE(ra,rb,rc) Opr(0x11,ra,rb,0x26,rc)
139 # define CMOVNEi(ra,im,rc) Opi(0x11,ra,im,0x26,rc)
140 # define CMPBGE(ra,rb,rc) Opr(0x10,ra,rb,0x0f,rc)
141 # define CMPBGEi(ra,im,rc) Opi(0x10,ra,im,0x0f,rc)
142 # define CMPEQ(ra,rb,rc) Opr(0x10,ra,rb,0x2d,rc)
143 # define CMPEQi(ra,im,rc) Opi(0x10,ra,im,0x2d,rc)
144 # define CMPLE(ra,rb,rc) Opr(0x10,ra,rb,0x6d,rc)
145 # define CMPLEi(ra,im,rc) Opi(0x10,ra,im,0x6d,rc)
146 # define CMPLT(ra,rb,rc) Opr(0x10,ra,rb,0x4d,rc)
147 # define CMPLTi(ra,im,rc) Opi(0x10,ra,im,0x4d,rc)
148 # define CMPULE(ra,rb,rc) Opr(0x10,ra,rb,0x3d,rc)
149 # define CMPULEi(ra,im,rc) Opi(0x10,ra,im,0x3d,rc)
150 # define CMPULT(ra,rb,rc) Opr(0x10,ra,rb,0x1d,rc)
151 # define CMPULTi(ra,im,rc) Opi(0x10,ra,im,0x1d,rc)
152 # define CTLZ(rb,rc) Opr(0x1c,_R31_REGNO,rb,0x32,rc)
153 # define CTPOP(rb,rc) Opr(0x1c,_R31_REGNO,rb,0x30,rc)
154 # define CTTZ(rb,rc) Opr(0x1c,_R31_REGNO,rb,0x33,rc)
155 # define ECB(rb,d) Mem(0x18,_R31_REGNO,rb,0xe800)
156 # define EQV(ra,rb,rc) Opr(0x11,ra,rb,0x48,rc)
157 # define XORNOT(ra,rb,rc) EQV(ra,rb,rc)
158 # define EQVi(ra,im,rc) Opi(0x11,ra,im,0x48,rc)
159 # define XORNOTi(ra,im,rc) EQVi(ra,im,rc)
160 # define EXCB() Mem(0x18,0,0,0x0400)
161 # define EXTBL(ra,rb,rc) Opr(0x12,ra,rb,0x06,rc)
162 # define EXTBLi(ra,im,rc) Opi(0x12,ra,im,0x06,rc)
163 # define EXTLH(ra,rb,rc) Opr(0x12,ra,rb,0x6a,rc)
164 # define EXTLHi(ra,im,rc) Opi(0x12,ra,im,0x6a,rc)
165 # define EXTLL(ra,rb,rc) Opr(0x12,ra,rb,0x26,rc)
166 # define EXTLLi(ra,im,rc) Opi(0x12,ra,im,0x26,rc)
167 # define EXTQH(ra,rb,rc) Opr(0x12,ra,rb,0x7a,rc)
168 # define EXTQHi(ra,im,rc) Opi(0x12,ra,im,0x7a,rc)
169 # define EXTQL(ra,rb,rc) Opr(0x12,ra,rb,0x36,rc)
170 # define EXTQLi(ra,im,rc) Opi(0x12,ra,im,0x36,rc)
171 # define EXTWH(ra,rb,rc) Opr(0x12,ra,rb,0x5a,rc)
172 # define EXTWHi(ra,im,rc) Opi(0x12,ra,im,0x5a,rc)
173 # define EXTWL(ra,rb,rc) Opr(0x12,ra,rb,0x16,rc)
174 # define EXTWLi(ra,im,rc) Opi(0x12,ra,im,0x16,rc)
175 # define FETCH(rb,d) Mem(0x18,_R31_REGNO,rb,0x8000)
176 # define FETCH_Mem(rb,d) Mem(0x18,_R31_REGNO,rb,0xa000)
177 /* FIXME IMPLVER not disassembled */
178 # define IMPLVER(rc) Opr(0x11,_R31_REGNO,1,0x6c,rc)
179 # define INSBL(ra,rb,rc) Opr(0x12,ra,rb,0x0b,rc)
180 # define INSBLi(ra,im,rc) Opi(0x12,ra,im,0x0b,rc)
181 # define INSLH(ra,rb,rc) Opr(0x12,ra,rb,0x67,rc)
182 # define INSLHi(ra,im,rc) Opi(0x12,ra,im,0x67,rc)
183 # define INSLL(ra,rb,rc) Opr(0x12,ra,rb,0x2b,rc)
184 # define INSLLi(ra,im,rc) Opi(0x12,ra,im,0x2b,rc)
185 # define INSQH(ra,rb,rc) Opr(0x12,ra,rb,0x77,rc)
186 # define INSQHi(ra,im,rc) Opi(0x12,ra,im,0x77,rc)
187 # define INSQL(ra,rb,rc) Opr(0x12,ra,rb,0x3b,rc)
188 # define INSQLi(ra,im,rc) Opi(0x12,ra,im,0x3b,rc)
189 # define INSWH(ra,rb,rc) Opr(0x12,ra,rb,0x57,rc)
190 # define INSWHi(ra,im,rc) Opi(0x12,ra,im,0x57,rc)
191 # define INSWL(ra,rb,rc) Opr(0x12,ra,rb,0x1b,rc)
192 # define INSWLi(ra,im,rc) Opi(0x12,ra,im,0x1b,rc)
193 # define JMP(ra,rb,d) Mbr(0x1a,ra,rb,0,d)
194 # define JSR(ra,rb,d) Mbr(0x1a,ra,rb,1,d)
195 # define JSR_COROUTINE(ra,rb,d) Mbr(0x1a,ra,rb,3,d)
196 # define JCR(ra,rb,rd) JSR_COROUTINE(ra,rb,d)
197 # define LDA(ra,rb,d) Mem(0x08,ra,rb,d)
198 # define LDAH(ra,rb,d) Mem(0x09,ra,rb,d)
199 # define LDBU(ra,rb,d) Mem(0x0a,ra,rb,d)
200 # define LDWU(ra,rb,d) Mem(0x0c,ra,rb,d)
201 # define LDL(ra,rb,d) Mem(0x28,ra,rb,d)
202 # define LDL_L(ra,rb,d) Mem(0x2a,ra,rb,d)
203 # define LDQ(ra,rb,d) Mem(0x29,ra,rb,d)
204 # define LDQ_L(ra,rb,d) Mem(0x2b,ra,rb,d)
205 # define LDQ_U(ra,rb,d) Mem(0x0b,ra,rb,d)
206 # define MAXSB8(ra,rb,rc) Opr(0x1c,ra,rb,0x3e,rc)
207 # define MAXSW4(ra,rb,rc) Opr(0x1c,ra,rb,0x3f,rc)
208 # define MAXSUB8(ra,rb,rc) Opr(0x1c,ra,rb,0x3c,rc)
209 # define MAXSUW4(ra,rb,rc) Opr(0x1c,ra,rb,0x3d,rc)
210 # define MB() Mem(0x18,_R31_REGNO,_R31_REGNO,0x4000)
211 # define MINSB8(ra,rb,rc) Opr(0x1c,ra,rb,0x38,rc)
212 # define MINSW4(ra,rb,rc) Opr(0x1c,ra,rb,0x39,rc)
213 # define MINSUB8(ra,rb,rc) Opr(0x1c,ra,rb,0x3a,rc)
214 # define MINSUW4(ra,rb,rc) Opr(0x1c,ra,rb,0x3b,rc)
215 # define MSKBL(ra,rb,rc) Opr(0x12,ra,rb,0x02,rc)
216 # define MSKBLi(ra,im,rc) Opi(0x12,ra,im,0x02,rc)
217 # define MSKLH(ra,rb,rc) Opr(0x12,ra,rb,0x62,rc)
218 # define MSKLHi(ra,im,rc) Opi(0x12,ra,im,0x62,rc)
219 # define MSKLL(ra,rb,rc) Opr(0x12,ra,rb,0x22,rc)
220 # define MSKLLi(ra,im,rc) Opi(0x12,ra,im,0x22,rc)
221 # define MSKQH(ra,rb,rc) Opr(0x12,ra,rb,0x72,rc)
222 # define MSKQHi(ra,im,rc) Opi(0x12,ra,im,0x72,rc)
223 # define MSKQL(ra,rb,rc) Opr(0x12,ra,rb,0x32,rc)
224 # define MSKQLi(ra,im,rc) Opi(0x12,ra,im,0x32,rc)
225 # define MSKWH(ra,rb,rc) Opr(0x12,ra,rb,0x52,rc)
226 # define MSKWHi(ra,im,rc) Opi(0x12,ra,im,0x52,rc)
227 # define MSKWL(ra,rb,rc) Opr(0x12,ra,rb,0x12,rc)
228 # define MSKWLi(ra,im,rc) Opi(0x12,ra,im,0x12,rc)
229 # define MULL(ra,rb,rc) Opr(0x13,ra,rb,0x00,rc)
230 # define MULLi(ra,im,rc) Opi(0x13,ra,im,0x00,rc)
231 # define MULL_V(ra,rb,rc) Opr(0x13,ra,rb,0x40,rc)
232 # define MULL_Vi(ra,im,rc) Opi(0x13,ra,im,0x40,rc)
233 # define MULQ(ra,rb,rc) Opr(0x13,ra,rb,0x20,rc)
234 # define MULQi(ra,im,rc) Opi(0x13,ra,im,0x20,rc)
235 # define MULQ_V(ra,rb,rc) Opr(0x13,ra,rb,0x60,rc)
236 # define MULQ_Vi(ra,im,rc) Opi(0x13,ra,im,0x60,rc)
237 # define ORNOT(ra,rb,rc) Opr(0x11,ra,rb,0x28,rc)
238 # define ORNOTi(ra,im,rc) Opi(0x11,ra,im,0x28,rc)
239 # define PERR(ra,rb,rc) Opr(0x1c,ra,rb,0x31,rc)
240 # define PKLB(rb,rc) Opr(0x1c,_R31_REGNO,rb,0x37,rc)
241 # define PKWB(rb,rc) Opr(0x1c,_R31_REGNO,rb,0x36,rc)
242 /* FIXME PREFETCH* not disassembled */
243 # define PREFETCH(rb,d) Mem(0x28,_R31_REGNO,rb,d)
244 # define PREFETCH_EN(rb,d) Mem(0x29,_R31_REGNO,rb,d)
245 # define PREFETCH_M(rb,d) Mem(0x22,_R31_REGNO,rb,d)
246 # define PREFETCH_MEN(rb,d) Mem(0x23,_R31_REGNO,rb,d)
247 # define RC(ra) Mem(0x18,ra,_R31_REGNO,0xe000)
248 # define RET(ra,rb,d) Mbr(0x1a,ra,rb,2,d)
249 # define RPCC(ra) Mem(0x18,ra,_R31_REGNO,0xc000)
250 # define RS(ra) Mem(0x18,ra,_R31_REGNO,0xf000)
251 # define S4ADDL(ra,rb,rc) Opr(0x10,ra,rb,0x02,rc)
252 # define S4ADDi(ra,im,rc) Opi(0x10,ra,im,0x02,rc)
253 # define S4ADDQ(ra,rb,rc) Opr(0x10,ra,rb,0x22,rc)
254 # define S4ADDQi(ra,im,rc) Opi(0x10,ra,im,0x22,rc)
255 # define S4SUBL(ra,rb,rc) Opr(0x10,ra,rb,0x0b,rc)
256 # define S4SUBLi(ra,im,rc) Opi(0x10,ra,im,0x0b,rc)
257 # define S4SUBQ(ra,rb,rc) Opr(0x10,ra,rb,0x2b,rc)
258 # define S4SUBQi(ra,im,rc) Opi(0x10,ra,im,0x2b,rc)
259 # define S8ADDL(ra,rb,rc) Opr(0x10,ra,rb,0x12,rc)
260 # define S8ADDLi(ra,im,rc) Opi(0x10,ra,im,0x12,rc)
261 # define S8ADDQ(ra,rb,rc) Opr(0x10,ra,rb,0x32,rc)
262 # define S8ADDQi(ra,im,rc) Opi(0x10,ra,im,0x32,rc)
263 # define S8SUBL(ra,rb,rc) Opr(0x10,ra,rb,0x1b,rc)
264 # define S8SUBLi(ra,im,rc) Opi(0x10,ra,im,0x1b,rc)
265 # define S8SUBQ(ra,rb,rc) Opr(0x10,ra,rb,0x3b,rc)
266 # define S8SUBQi(ra,im,rc) Opi(0x10,ra,im,0x3b,rc)
267 # define SEXTB(rb,rc) Opr(0x1c,_R31_REGNO,rb,0x00,rc)
268 /* FIXME not disassembled */
269 # define SEXTBi(im,rc) Opi(0x1c,_R31_REGNO,im,0x00,rc)
270 # define SEXTW(rb,rc) Opr(0x1c,_R31_REGNO,rb,0x01,rc)
271 /* FIXME not disassembled */
272 # define SEXTWi(im,rc) Opi(0x1c,_R31_REGNO,im,0x01,rc)
273 # define SLL(ra,rb,rc) Opr(0x12,ra,rb,0x39,rc)
274 # define SLLi(ra,im,rc) Opi(0x12,ra,im,0x39,rc)
275 # define SRA(ra,rb,rc) Opr(0x12,ra,rb,0x3c,rc)
276 # define SRAi(ra,im,rc) Opi(0x12,ra,im,0x3c,rc)
277 # define SRL(ra,rb,rc) Opr(0x12,ra,rb,0x34,rc)
278 # define SRLi(ra,im,rc) Opi(0x12,ra,im,0x34,rc)
279 # define STB(ra,rb,d) Mem(0x0e,ra,rb,d)
280 # define STL(ra,rb,d) Mem(0x2c,ra,rb,d)
281 # define STL_C(ra,rb,d) Mem(0x2e,ra,rb,d)
282 # define STQ(ra,rb,d) Mem(0x2d,ra,rb,d)
283 # define STQ_C(ra,rb,d) Mem(0x2f,ra,rb,d)
284 # define STQ_U(ra,rb,d) Mem(0x0f,ra,rb,d)
285 # define STW(ra,rb,d) Mem(0x0d,ra,rb,d)
286 # define SUBL(ra,rb,rc) Opr(0x10,ra,rb,0x09,rc)
287 # define SUBLi(ra,im,rc) Opi(0x10,ra,im,0x09,rc)
288 # define SUBL_V(ra,rb,rc) Opr(0x10,ra,rb,0x49,rc)
289 # define SUBL_Vi(ra,im,rc) Opi(0x10,ra,im,0x49,rc)
290 # define SUBQ(ra,rb,rc) Opr(0x10,ra,rb,0x29,rc)
291 # define SUBQi(ra,im,rc) Opi(0x10,ra,im,0x29,rc)
292 # define SUBQ_V(ra,rb,rc) Opr(0x10,ra,rb,0x69,rc)
293 # define SUBQ_Vi(ra,im,rc) Opi(0x10,ra,im,0x69,rc)
294 # define TRAPB() Mem(0x18,_R31_REGNO,_R31_REGNO,0x0000)
295 # define UMULH(ra,rb,rc) Opr(0x13,ra,rb,0x30,rc)
296 # define UMULHi(ra,im,rc) Opi(0x13,ra,im,0x30,rc)
297 # define UNPKBL(rb,rc) Opr(0x1c,_R31_REGNO,rb,0x35,rc)
298 # define UNPKBW(rb,rc) Opr(0x1c,_R31_REGNO,rb,0x34,rc)
299 # define WH64(ra) Mem(0x18,ra,_R31_REGNO,0xf800)
300 # define WH64EN(ra) Mem(0x18,ra,_R31_REGNO,0xfc00)
301 # define WMB() Mem(0x18,_R31_REGNO,_R31_REGNO,0x4400)
302 # define XOR(ra,rb,rc) Opr(0x11,ra,rb,0x40,rc)
303 # define XORi(ra,im,rc) Opi(0x11,ra,im,0x40,rc)
304 # define ZAP(ra,rb,rc) Opr(0x12,ra,rb,0x30,rc)
305 # define ZAPi(ra,im,rc) Opi(0x12,ra,im,0x30,rc)
306 # define ZAPNOT(ra,rb,rc) Opr(0x12,ra,rb,0x31,rc)
307 # define ZAPNOTi(ra,im,rc) Opi(0x12,ra,im,0x31,rc)
308 # define NOP() BIS(_R31_REGNO,_R31_REGNO,_R31_REGNO)
309 # define MOV(ra,rc) BIS(ra,ra,rc)
310 # define MOVi(im,rc) BISi(_R31_REGNO,im,rc)
311 # define NEGL(ra,rc) SUBL(_R31_REGNO,ra,rc)
312 # define NEGQ(ra,rc) SUBQ(_R31_REGNO,ra,rc)
313 # define NOT(ra,rc) ORNOT(_R31_REGNO,ra,rc)
314 # define nop(i0) _nop(_jit,i0)
315 static void _nop(jit_state_t*,jit_int32_t);
316 # define movr(r0,r1) _movr(_jit,r0,r1)
317 static void _movr(jit_state_t*,jit_int32_t,jit_int32_t);
318 # define movi(r0,i0) _movi(_jit,r0,i0)
319 static void _movi(jit_state_t*,jit_int32_t,jit_word_t);
320 # define movi_p(r0,i0) _movi_p(_jit,r0,i0)
321 static jit_word_t _movi_p(jit_state_t*,jit_int32_t,jit_word_t);
322 # define movnr(r0,r1,r2) CMOVNE(r2, r1, r0)
323 # define movzr(r0,r1,r2) CMOVEQ(r2, r1, r0)
324 # define casx(r0, r1, r2, r3, i0) _casx(_jit, r0, r1, r2, r3, i0)
325 static void _casx(jit_state_t *_jit,jit_int32_t,jit_int32_t,
326 jit_int32_t,jit_int32_t,jit_word_t);
327 #define casr(r0, r1, r2, r3) casx(r0, r1, r2, r3, 0)
328 #define casi(r0, i0, r1, r2) casx(r0, _NOREG, r1, r2, i0)
329 # define negr(r0,r1) NEGQ(r1,r0)
330 # define comr(r0,r1) NOT(r1,r0)
331 # define clor(r0, r1) _clor(_jit, r0, r1)
332 static void _clor(jit_state_t*, jit_int32_t, jit_int32_t);
333 # define clzr(r0, r1) CTLZ(r1, r0)
334 # define ctor(r0, r1) _ctor(_jit, r0, r1)
335 static void _ctor(jit_state_t*, jit_int32_t, jit_int32_t);
336 # define ctzr(r0, r1) CTTZ(r1, r0)
337 # define popcntr(r0, r1) CTPOP(r1, r0)
338 # define addr(r0,r1,r2) ADDQ(r1,r2,r0)
339 # define addi(r0,r1,i0) _addi(_jit,r0,r1,i0)
340 static void _addi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
341 # define addcr(r0,r1,i0) _addcr(_jit,r0,r1,i0)
342 static void _addcr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
343 # define addci(r0,r1,i0) _addci(_jit,r0,r1,i0)
344 static void _addci(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
345 # define addxr(r0,r1,i0) _addxr(_jit,r0,r1,i0)
346 static void _addxr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
347 # define addxi(r0,r1,i0) _addxi(_jit,r0,r1,i0)
348 static void _addxi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
349 # define subr(r0,r1,r2) SUBQ(r1,r2,r0)
350 # define subi(r0,r1,i0) _subi(_jit,r0,r1,i0)
351 static void _subi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
352 # define subcr(r0,r1,i0) _subcr(_jit,r0,r1,i0)
353 static void _subcr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
354 # define subci(r0,r1,i0) _subci(_jit,r0,r1,i0)
355 static void _subci(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
356 # define subxr(r0,r1,i0) _subxr(_jit,r0,r1,i0)
357 static void _subxr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
358 # define subxi(r0,r1,i0) _subxi(_jit,r0,r1,i0)
359 static void _subxi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
360 # define rsbi(r0, r1, i0) _rsbi(_jit, r0, r1, i0)
361 static void _rsbi(jit_state_t*,jit_int32_t,jit_int32_t, jit_word_t);
362 # define mulr(r0,r1,r2) MULQ(r1,r2,r0)
363 # define muli(r0,r1,i0) _muli(_jit,r0,r1,i0)
364 static void _muli(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
365 # define hmulr(r0, r1, r2) qmulr(JIT_NOREG, r0, r1, r2)
366 # define hmuli(r0, r1, i0) qmuli(JIT_NOREG, r0, r1, i0)
367 # define hmulr_u(r0, r1, r2) qmulr_u(JIT_NOREG, r0, r1, r2)
368 # define hmuli_u(r0, r1, i0) qmuli_u(JIT_NOREG, r0, r1, i0)
369 # define qmulr(r0,r1,r2,r3) _qmulr(_jit,r0,r1,r2,r3)
370 static void _qmulr(jit_state_t*,jit_int32_t,
371 jit_int32_t,jit_int32_t,jit_int32_t);
372 # define qmuli(r0,r1,r2,i0) _qmuli(_jit,r0,r1,r2,i0)
373 static void _qmuli(jit_state_t*,jit_int32_t,
374 jit_int32_t,jit_int32_t,jit_word_t);
375 # define qmulr_u(r0,r1,r2,r3) _qmulr_u(_jit,r0,r1,r2,r3)
376 static void _qmulr_u(jit_state_t*,jit_int32_t,
377 jit_int32_t,jit_int32_t,jit_int32_t);
378 # define qmuli_u(r0,r1,r2,i0) _qmuli_u(_jit,r0,r1,r2,i0)
379 static void _qmuli_u(jit_state_t*,jit_int32_t,
380 jit_int32_t,jit_int32_t,jit_word_t);
381 static jit_word_t __idiv(jit_word_t, jit_word_t);
382 # define divr(r0,r1,r2) _divr(_jit,r0,r1,r2)
383 static void _divr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
384 # define divi(r0,r1,i0) _divi(_jit,r0,r1,i0)
385 static void _divi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
386 static jit_uword_t __udiv(jit_uword_t, jit_uword_t);
387 # define divr_u(r0,r1,r2) _divr_u(_jit,r0,r1,r2)
388 static void _divr_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
389 # define divi_u(r0,r1,i0) _divi_u(_jit,r0,r1,i0)
390 static void _divi_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
391 static jit_word_t __irem(jit_word_t, jit_word_t);
392 # define remr(r0,r1,r2) _remr(_jit,r0,r1,r2)
393 static void _remr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
394 # define remi(r0,r1,i0) _remi(_jit,r0,r1,i0)
395 static void _remi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
396 static jit_uword_t __urem(jit_uword_t, jit_uword_t);
397 # define remr_u(r0,r1,r2) _remr_u(_jit,r0,r1,r2)
398 static void _remr_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
399 # define remi_u(r0,r1,i0) _remi_u(_jit,r0,r1,i0)
400 static void _remi_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
401 static jit_word_t __idivrem(jit_word_t, jit_word_t, jit_word_t*);
402 # define qdivr(r0,r1,r2,r3) _qdivr(_jit,r0,r1,r2,r3)
403 static void _qdivr(jit_state_t*,
404 jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t);
405 # define qdivi(r0,r1,r2,i0) _qdivi(_jit,r0,r1,r2,i0)
406 static void _qdivi(jit_state_t*,
407 jit_int32_t,jit_int32_t,jit_int32_t,jit_word_t);
408 static jit_word_t __udivrem(jit_uword_t, jit_uword_t, jit_uword_t*);
409 # define qdivr_u(r0,r1,r2,r3) _qdivr_u(_jit,r0,r1,r2,r3)
410 static void _qdivr_u(jit_state_t*,
411 jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t);
412 # define qdivi_u(r0,r1,r2,i0) _qdivi_u(_jit,r0,r1,r2,i0)
413 static void _qdivi_u(jit_state_t*,
414 jit_int32_t,jit_int32_t,jit_int32_t,jit_word_t);
415 # define lshr(r0,r1,r2) SLL(r1,r2,r0)
416 # define lshi(r0,r1,i0) _lshi(_jit,r0,r1,i0)
417 static void _lshi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
418 # define rshr(r0,r1,r2) SRA(r1,r2,r0)
419 # define rshi(r0,r1,i0) _rshi(_jit,r0,r1,i0)
420 static void _rshi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
421 # define rshr_u(r0,r1,r2) SRL(r1,r2,r0)
422 # define rshi_u(r0,r1,i0) _rshi_u(_jit,r0,r1,i0)
423 static void _rshi_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
424 # define qlshr(r0,r1,r2,r3) xlshr(1,r0,r1,r2,r3)
425 # define qlshr_u(r0, r1, r2, r3) xlshr(0, r0, r1, r2, r3)
426 # define xlshr(s,r0,r1,r2,r3) _xlshr(_jit,s,r0,r1,r2,r3)
428 _xlshr(jit_state_t*,jit_bool_t,jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t);
429 # define qlshi(r0, r1, r2, i0) xlshi(1, r0, r1, r2, i0)
430 # define qlshi_u(r0, r1, r2, i0) xlshi(0, r0, r1, r2, i0)
431 # define xlshi(s, r0, r1, r2, i0) _xlshi(_jit, s, r0, r1, r2, i0)
433 _xlshi(jit_state_t*,jit_bool_t,jit_int32_t,jit_int32_t,jit_int32_t,jit_word_t);
434 # define qrshr(r0, r1, r2, r3) xrshr(1, r0, r1, r2, r3)
435 # define qrshr_u(r0, r1, r2, r3) xrshr(0, r0, r1, r2, r3)
436 # define xrshr(s, r0, r1, r2, r3) _xrshr(_jit, s, r0, r1, r2, r3)
438 _xrshr(jit_state_t*,jit_bool_t,jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t);
439 # define qrshi(r0, r1, r2, i0) xrshi(1, r0, r1, r2, i0)
440 # define qrshi_u(r0, r1, r2, i0) xrshi(0, r0, r1, r2, i0)
441 # define xrshi(s, r0, r1, r2, i0) _xrshi(_jit, s, r0, r1, r2, i0)
443 _xrshi(jit_state_t*,jit_bool_t,jit_int32_t,jit_int32_t,jit_int32_t,jit_word_t);
444 # define andr(r0,r1,r2) AND(r1,r2,r0)
445 # define andi(r0,r1,i0) _andi(_jit,r0,r1,i0)
446 static void _andi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
447 # define orr(r0,r1,r2) OR(r1,r2,r0)
448 # define ori(r0,r1,i0) _ori(_jit,r0,r1,i0)
449 static void _ori(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
450 # define xorr(r0,r1,r2) XOR(r1,r2,r0)
451 # define xori(r0,r1,i0) _xori(_jit,r0,r1,i0)
452 static void _xori(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
453 # define ltr(r0,r1,r2) CMPLT(r1,r2,r0)
454 # define lti(r0,r1,i0) _lti(_jit,r0,r1,i0)
455 static void _lti(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
456 # define ltr_u(r0,r1,r2) CMPULT(r1,r2,r0)
457 # define lti_u(r0,r1,i0) _lti_u(_jit,r0,r1,i0)
458 static void _lti_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
459 # define ler(r0,r1,r2) CMPLE(r1,r2,r0)
460 # define lei(r0,r1,i0) _lei(_jit,r0,r1,i0)
461 static void _lei(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
462 # define ler_u(r0,r1,r2) CMPULE(r1,r2,r0)
463 # define lei_u(r0,r1,i0) _lei_u(_jit,r0,r1,i0)
464 static void _lei_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
465 # define eqr(r0,r1,r2) CMPEQ(r1,r2,r0)
466 # define eqi(r0,r1,i0) _eqi(_jit,r0,r1,i0)
467 static void _eqi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
468 # define ger(r0,r1,r2) CMPLE(r2,r1,r0)
469 # define gei(r0,r1,i0) _gei(_jit,r0,r1,i0)
470 static void _gei(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
471 # define ger_u(r0,r1,r2) CMPULE(r2,r1,r0)
472 # define gei_u(r0,r1,i0) _gei_u(_jit,r0,r1,i0)
473 static void _gei_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
474 # define gtr(r0,r1,r2) CMPLT(r2,r1,r0)
475 # define gti(r0,r1,i0) _gti(_jit,r0,r1,i0)
476 static void _gti(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
477 # define gtr_u(r0,r1,r2) CMPULT(r2,r1,r0)
478 # define gti_u(r0,r1,i0) _gti_u(_jit,r0,r1,i0)
479 static void _gti_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
480 # define ner(r0,r1,r2) _ner(_jit,r0,r1,r2)
481 static void _ner(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
482 # define nei(r0,r1,i0) _nei(_jit,r0,r1,i0)
483 static void _nei(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
484 # define bltr(i0,r0,r1) _bltr(_jit,i0,r0,r1)
485 static jit_word_t _bltr(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
486 # define blti(i0,r0,i1) _blti(_jit,i0,r0,i1)
487 static jit_word_t _blti(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
488 # define bltr_u(i0,r0,r1) _bltr_u(_jit,i0,r0,r1)
489 static jit_word_t _bltr_u(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
490 # define blti_u(i0,r0,i1) _blti_u(_jit,i0,r0,i1)
491 static jit_word_t _blti_u(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
492 # define bler(i0,r0,r1) _bler(_jit,i0,r0,r1)
493 static jit_word_t _bler(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
494 # define blei(i0,r0,i1) _blei(_jit,i0,r0,i1)
495 static jit_word_t _blei(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
496 # define bler_u(i0,r0,r1) _bler_u(_jit,i0,r0,r1)
497 static jit_word_t _bler_u(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
498 # define blei_u(i0,r0,i1) _blei_u(_jit,i0,r0,i1)
499 static jit_word_t _blei_u(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
500 # define beqr(i0,r0,r1) _beqr(_jit,i0,r0,r1)
501 static jit_word_t _beqr(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
502 # define beqi(i0,r0,i1) _beqi(_jit,i0,r0,i1)
503 static jit_word_t _beqi(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
504 # define bger(i0,r0,r1) _bger(_jit,i0,r0,r1)
505 static jit_word_t _bger(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
506 # define bgei(i0,r0,i1) _bgei(_jit,i0,r0,i1)
507 static jit_word_t _bgei(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
508 # define bger_u(i0,r0,r1) _bger_u(_jit,i0,r0,r1)
509 static jit_word_t _bger_u(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
510 # define bgei_u(i0,r0,i1) _bgei_u(_jit,i0,r0,i1)
511 static jit_word_t _bgei_u(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
512 # define bgtr(i0,r0,r1) _bgtr(_jit,i0,r0,r1)
513 static jit_word_t _bgtr(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
514 # define bgti(i0,r0,i1) _bgti(_jit,i0,r0,i1)
515 static jit_word_t _bgti(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
516 # define bgtr_u(i0,r0,r1) _bgtr_u(_jit,i0,r0,r1)
517 static jit_word_t _bgtr_u(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
518 # define bgti_u(i0,r0,i1) _bgti_u(_jit,i0,r0,i1)
519 static jit_word_t _bgti_u(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
520 # define bner(i0,r0,r1) _bner(_jit,i0,r0,r1)
521 static jit_word_t _bner(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
522 # define bnei(i0,r0,i1) _bnei(_jit,i0,r0,i1)
523 static jit_word_t _bnei(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
524 # define baddr(i0,r0,r1,cc) _baddr(_jit,i0,r0,r1,cc)
525 static jit_word_t _baddr(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t,
527 # define baddi(i0,r0,i1,cc) _baddi(_jit,i0,r0,i1,cc)
528 static jit_word_t _baddi(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t,
530 # define baddr_u(i0,r0,r1,cc) _baddr_u(_jit,i0,r0,r1,cc)
531 static jit_word_t _baddr_u(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t,
533 # define baddi_u(i0,r0,i1,cc) _baddi_u(_jit,i0,r0,i1,cc)
534 static jit_word_t _baddi_u(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t,
536 # define boaddr(i0,r0,r1) baddr(i0,r0,r1,1)
537 # define boaddi(i0,r0,i1) baddi(i0,r0,i1,1)
538 # define boaddr_u(i0,r0,r1) baddr_u(i0,r0,r1,1)
539 # define boaddi_u(i0,r0,i1) baddi_u(i0,r0,i1,1)
540 # define bxaddr(i0,r0,r1) baddr(i0,r0,r1,0)
541 # define bxaddi(i0,r0,i1) baddi(i0,r0,i1,0)
542 # define bxaddr_u(i0,r0,r1) baddr_u(i0,r0,r1,0)
543 # define bxaddi_u(i0,r0,i1) baddi_u(i0,r0,i1,0)
544 # define bsubr(i0,r0,r1,cc) _bsubr(_jit,i0,r0,r1,cc)
545 static jit_word_t _bsubr(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t,
547 # define bsubi(i0,r0,i1,cc) _bsubi(_jit,i0,r0,i1,cc)
548 static jit_word_t _bsubi(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t,
550 # define bsubr_u(i0,r0,r1,cc) _bsubr_u(_jit,i0,r0,r1,cc)
551 static jit_word_t _bsubr_u(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t,
553 # define bsubi_u(i0,r0,i1,cc) _bsubi_u(_jit,i0,r0,i1,cc)
554 static jit_word_t _bsubi_u(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t,
556 # define bosubr(i0,r0,r1) bsubr(i0,r0,r1,1)
557 # define bosubi(i0,r0,i1) bsubi(i0,r0,i1,1)
558 # define bosubr_u(i0,r0,r1) bsubr_u(i0,r0,r1,1)
559 # define bosubi_u(i0,r0,i1) bsubi_u(i0,r0,i1,1)
560 # define bxsubr(i0,r0,r1) bsubr(i0,r0,r1,0)
561 # define bxsubi(i0,r0,i1) bsubi(i0,r0,i1,0)
562 # define bxsubr_u(i0,r0,r1) bsubr_u(i0,r0,r1,0)
563 # define bxsubi_u(i0,r0,i1) bsubi_u(i0,r0,i1,0)
564 # define bmxr(i0,r0,r1,cc) _bmxr(_jit,i0,r0,r1,cc)
565 static jit_word_t _bmxr(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t,
567 # define bmxi(i0,r0,i1,cc) _bmxi(_jit,i0,r0,i1,cc)
568 static jit_word_t _bmxi(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t,
570 # define bmsr(i0,r0,r1) bmxr(i0,r0,r1,1)
571 # define bmsi(i0,r0,i1) bmxi(i0,r0,i1,1)
572 # define bmcr(i0,r0,r1) bmxr(i0,r0,r1,0)
573 # define bmci(i0,r0,i1) bmxi(i0,r0,i1,0)
574 # define ldr_c(r0,r1) _ldr_c(_jit,r0,r1)
575 static void _ldr_c(jit_state_t*,jit_int32_t,jit_int32_t);
576 # define ldi_c(r0,i0) _ldi_c(_jit,r0,i0)
577 static void _ldi_c(jit_state_t*,jit_int32_t,jit_word_t);
578 # define ldr_uc(r0,r1) LDBU(r0,r1,0)
579 # define ldi_uc(r0,i0) _ldi_uc(_jit,r0,i0)
580 static void _ldi_uc(jit_state_t*,jit_int32_t,jit_word_t);
581 # define ldr_s(r0,r1) _ldr_s(_jit,r0,r1)
582 static void _ldr_s(jit_state_t*,jit_int32_t,jit_int32_t);
583 # define ldi_s(r0,i0) _ldi_s(_jit,r0,i0)
584 static void _ldi_s(jit_state_t*,jit_int32_t,jit_word_t);
585 # define ldr_us(r0,r1) LDWU(r0,r1,0)
586 # define ldi_us(r0,i0) _ldi_us(_jit,r0,i0)
587 static void _ldi_us(jit_state_t*,jit_int32_t,jit_word_t);
588 # define ldr_i(r0,r1) LDL(r0,r1,0)
589 # define ldi_i(r0,i0) _ldi_i(_jit,r0,i0)
590 static void _ldi_i(jit_state_t*,jit_int32_t,jit_word_t);
591 # define ldr_ui(r0,r1) _ldr_ui(_jit,r0,r1)
592 static void _ldr_ui(jit_state_t*,jit_int32_t,jit_int32_t);
593 # define ldi_ui(r0,i0) _ldi_ui(_jit,r0,i0)
594 static void _ldi_ui(jit_state_t*,jit_int32_t,jit_word_t);
595 # define ldr_l(r0,r1) LDQ(r0,r1,0)
596 # define ldi_l(r0,i0) _ldi_l(_jit,r0,i0)
597 static void _ldi_l(jit_state_t*,jit_int32_t,jit_word_t);
598 # define ldxr_c(r0,r1,r2) _ldxr_c(_jit,r0,r1,r2)
599 static void _ldxr_c(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
600 # define ldxi_c(r0,r1,i0) _ldxi_c(_jit,r0,r1,i0)
601 static void _ldxi_c(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
602 # define ldxr_uc(r0,r1,r2) _ldxr_uc(_jit,r0,r1,r2)
603 static void _ldxr_uc(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
604 # define ldxi_uc(r0,r1,i0) _ldxi_uc(_jit,r0,r1,i0)
605 static void _ldxi_uc(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
606 # define ldxr_s(r0,r1,r2) _ldxr_s(_jit,r0,r1,r2)
607 static void _ldxr_s(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
608 # define ldxi_s(r0,r1,i0) _ldxi_s(_jit,r0,r1,i0)
609 static void _ldxi_s(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
610 # define ldxr_us(r0,r1,r2) _ldxr_us(_jit,r0,r1,r2)
611 static void _ldxr_us(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
612 # define ldxi_us(r0,r1,i0) _ldxi_us(_jit,r0,r1,i0)
613 static void _ldxi_us(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
614 # define ldxr_i(r0,r1,r2) _ldxr_i(_jit,r0,r1,r2)
615 static void _ldxr_i(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
616 # define ldxi_i(r0,r1,i0) _ldxi_i(_jit,r0,r1,i0)
617 static void _ldxi_i(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
618 # define ldxr_ui(r0,r1,r2) _ldxr_ui(_jit,r0,r1,r2)
619 static void _ldxr_ui(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
620 # define ldxi_ui(r0,r1,i0) _ldxi_ui(_jit,r0,r1,i0)
621 static void _ldxi_ui(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
622 # define ldxr_l(r0,r1,r2) _ldxr_l(_jit,r0,r1,r2)
623 static void _ldxr_l(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
624 # define ldxi_l(r0,r1,i0) _ldxi_l(_jit,r0,r1,i0)
625 static void _ldxi_l(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
626 # define unldr(r0, r1, i0) _unldr(_jit, r0, r1, i0)
627 static void _unldr(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
628 # define unldi(r0, i0, i1) _unldi(_jit, r0, i0, i1)
629 static void _unldi(jit_state_t*, jit_int32_t, jit_word_t, jit_word_t);
630 # define unldr_u(r0, r1, i0) _unldr_u(_jit, r0, r1, i0)
631 static void _unldr_u(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
632 # define unldi_u(r0, i0, i1) _unldi_u(_jit, r0, i0, i1)
633 static void _unldi_u(jit_state_t*, jit_int32_t, jit_word_t, jit_word_t);
634 # define str_c(r0,r1) STB(r1,r0,0)
635 # define sti_c(i0,r0) _sti_c(_jit,i0,r0)
636 static void _sti_c(jit_state_t*,jit_word_t,jit_int32_t);
637 # define str_s(r0,r1) STW(r1,r0,0)
638 # define sti_s(i0,r0) _sti_s(_jit,i0,r0)
639 static void _sti_s(jit_state_t*,jit_word_t,jit_int32_t);
640 # define str_i(r0,r1) STL(r1,r0,0)
641 # define sti_i(i0,r0) _sti_i(_jit,i0,r0)
642 static void _sti_i(jit_state_t*,jit_word_t,jit_int32_t);
643 # define str_l(r0,r1) STQ(r1,r0,0)
644 # define sti_l(i0,r0) _sti_l(_jit,i0,r0)
645 static void _sti_l(jit_state_t*,jit_word_t,jit_int32_t);
646 # define stxr_c(r0,r1,r2) _stxr_c(_jit,r0,r1,r2)
647 static void _stxr_c(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
648 # define stxi_c(i0,r0,r1) _stxi_c(_jit,i0,r0,r1)
649 static void _stxi_c(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
650 # define stxr_s(r0,r1,r2) _stxr_s(_jit,r0,r1,r2)
651 static void _stxr_s(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
652 # define stxi_s(i0,r0,r1) _stxi_s(_jit,i0,r0,r1)
653 static void _stxi_s(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
654 # define stxr_i(r0,r1,r2) _stxr_i(_jit,r0,r1,r2)
655 static void _stxr_i(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
656 # define stxi_i(i0,r0,r1) _stxi_i(_jit,i0,r0,r1)
657 static void _stxi_i(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
658 # define stxr_l(r0,r1,r2) _stxr_l(_jit,r0,r1,r2)
659 static void _stxr_l(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
660 # define stxi(i0,r0,r1) stxi_l(i0,r0,r1)
661 # define stxi_l(i0,r0,r1) _stxi_l(_jit,i0,r0,r1)
662 static void _stxi_l(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
663 # define unstr(r0, r1, i0) _unstr(_jit, r0, r1, i0)
664 static void _unstr(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
665 # define unsti(i0, r0, i1) _unsti(_jit, i0, r0, i1)
666 static void _unsti(jit_state_t*, jit_word_t, jit_int32_t, jit_word_t);
667 # define extr(r0,r1,i0,i1) _extr(_jit,r0,r1,i0,i1)
668 static void _extr(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t,jit_word_t);
669 # define extr_u(r0,r1,i0,i1) _extr_u(_jit,r0,r1,i0,i1)
670 static void _extr_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t,jit_word_t);
671 # define depr(r0,r1,i0,i1) _depr(_jit,r0,r1,i0,i1)
672 static void _depr(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t,jit_word_t);
673 # define extr_c(r0,r1) SEXTB(r1, r0)
674 # define extr_uc(r0,r1) EXTBLi(r1, 0, r0)
675 # define extr_s(r0,r1) SEXTW(r1, r0)
676 # define extr_us(r0,r1) EXTWLi(r1, 0, r0)
677 # define extr_i(r0,r1) _extr_i(_jit,r0,r1)
678 static void _extr_i(jit_state_t*,jit_int32_t,jit_int32_t);
679 # define extr_ui(r0,r1) EXTLLi(r1, 0, r0)
680 # define bswapr_us(r0,r1) _bswapr_us(_jit,r0,r1)
681 static void _bswapr_us(jit_state_t*,jit_int32_t,jit_int32_t);
682 # define bswapr_ui(r0,r1) _bswapr_ui(_jit,r0,r1)
683 static void _bswapr_ui(jit_state_t*,jit_int32_t,jit_int32_t);
684 # define bswapr_ul(r0,r1) _bswapr_ul(_jit,r0,r1)
685 static void _bswapr_ul(jit_state_t*,jit_int32_t,jit_int32_t);
686 # define jmpr(r0) JMP(_R31_REGNO,r0,0)
687 # define jmpi(i0) _jmpi(_jit,i0)
688 static jit_word_t _jmpi(jit_state_t*, jit_word_t);
689 # define jmpi_p(i0) _jmpi_p(_jit,i0)
690 static jit_word_t _jmpi_p(jit_state_t*, jit_word_t);
691 #define callr(r0) _callr(_jit,r0)
692 static void _callr(jit_state_t*, jit_int32_t);
693 # define calli(i0) _calli(_jit,i0)
694 static void _calli(jit_state_t*, jit_word_t);
695 # define calli_p(i0) _calli_p(_jit,i0)
696 static jit_word_t _calli_p(jit_state_t*, jit_word_t);
697 # define prolog(node) _prolog(_jit,node)
698 static void _prolog(jit_state_t*,jit_node_t*);
699 # define epilog(node) _epilog(_jit,node)
700 static void _epilog(jit_state_t*,jit_node_t*);
701 # define vastart(r0) _vastart(_jit, r0)
702 static void _vastart(jit_state_t*, jit_int32_t);
703 # define vaarg(r0, r1) _vaarg(_jit, r0, r1)
704 static void _vaarg(jit_state_t*, jit_int32_t, jit_int32_t);
705 # define patch_at(jump,label) _patch_at(_jit,jump,label)
706 static void _patch_at(jit_state_t*,jit_word_t,jit_word_t);
711 _Pcd(jit_state_t *_jit, int o, unsigned int n)
719 _Bra(jit_state_t *_jit, int o, int ra, int d)
724 ii((o<<26)|(ra<<21)|_u21(d));
728 _Mem(jit_state_t *_jit, int o, int ra, int rb, unsigned int d)
734 ii((o<<26)|(ra<<21)|(rb<<16)|_u16(d));
738 _Mbr(jit_state_t *_jit, int o, int ra, int rb, int h, int d)
745 ii((o<<26)|(ra<<21)|(rb<<16)|(h<<14)|_u14(d));
749 _Opr(jit_state_t *_jit, int o, int ra, int rb, unsigned int f, int rc)
756 ii((o<<26)|(ra<<21)|(rb<<16)|(_u11(f)<<5)|rc);
760 _Opi(jit_state_t *_jit, int o, int ra, unsigned int i, unsigned int f, int rc)
767 ii((o<<26)|(ra<<21)|(_u8(i)<<13)|(1<<12)|(_u7(f)<<5)|rc);
771 _nop(jit_state_t *_jit, jit_int32_t i0)
773 for (; i0 > 0; i0 -= 4)
779 _movr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
786 _movi(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
789 jit_int16_t s0, s1, s2, s3;
801 LDA(r0, _R31_REGNO, _u16(s0));
802 else if (_s32_p(i0)) {
803 LDA(r0, _R31_REGNO, _u16(s0));
804 LDAH(r0, r0, _u16(s1));
806 else if (_u32_p(i0)) {
807 LDA(r0, _R31_REGNO, _u16(s0));
809 LDAH(r0, r0, _u16(s1));
813 else if (_u32(i0) == 0) {
814 LDA(r0, _R31_REGNO, _u16(s2));
816 LDAH(r0, r0, _u16(s3));
820 reg = jit_get_reg(jit_class_gpr);
821 LDA(r0, _R31_REGNO, _u16(s0));
822 LDA(rn(reg), _R31_REGNO, _u16(s2));
824 LDAH(r0, r0, _u16(s1));
826 LDAH(rn(reg), rn(reg), _u16(s3));
829 lshi(rn(reg), rn(reg), 32);
830 orr(r0, r0, rn(reg));
836 _movi_p(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
840 jit_int16_t s0, s1, s2, s3;
842 reg = jit_get_reg(jit_class_gpr);
851 LDA(r0, _R31_REGNO, _u16(s0));
852 LDA(rn(reg), _R31_REGNO, _u16(s2));
853 LDAH(r0, r0, _u16(s1));
854 LDAH(rn(reg), rn(reg), _u16(s3));
857 lshi(rn(reg), rn(reg), 32);
858 orr(r0, r0, rn(reg));
864 _casx(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1,
865 jit_int32_t r2, jit_int32_t r3, jit_word_t i0)
867 jit_word_t jump0, jump1, again, done;
868 jit_int32_t iscasi, r1_reg;
869 if ((iscasi = (r1 == _NOREG))) {
870 r1_reg = jit_get_reg(jit_class_gpr);
874 again = _jit->pc.w; /* AGAIN */
875 LDQ_L(r0, r1, 0); /* Load r0 locked */
876 jump0 = bner(_jit->pc.w, r0, r2); /* bne FAIL r0 r2 */
877 movr(r0, r3); /* Move to r0 to attempt to store */
878 STQ_C(r0, r1, 0); /* r0 is an in/out argument */
880 BEQ(r0, 0); /* beqi AGAIN r0 0 */
881 patch_at(jump1, again);
883 BR(_R31_REGNO, 0); /* r0 set to 1 if store succeeded */
884 patch_at(jump0, _jit->pc.w); /* FAIL: */
885 movi(r0, 0); /* Already locked */
886 patch_at(jump1, _jit->pc.w);
888 jit_unget_reg(r1_reg);
892 _clor(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
899 _ctor(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
906 _addi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
912 LDA(r0, r1, _u16(i0));
914 reg = jit_get_reg(jit_class_gpr);
916 addr(r0, r1, rn(reg));
922 _addcr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
925 if (jit_carry == _NOREG)
926 jit_carry = jit_get_reg(jit_class_gpr);
928 reg = jit_get_reg(jit_class_gpr);
929 addr(rn(reg), r1, r2);
930 ltr_u(rn(jit_carry), rn(reg), r1);
936 ltr_u(rn(jit_carry), r0, r1);
941 _addci(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
944 if (jit_carry == _NOREG)
945 jit_carry = jit_get_reg(jit_class_gpr);
947 reg = jit_get_reg(jit_class_gpr);
948 addi(rn(reg), r1, i0);
949 ltr_u(rn(jit_carry), rn(reg), r1);
955 ltr_u(rn(jit_carry), r0, r1);
960 _addxr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
963 assert(jit_carry != _NOREG);
964 reg = jit_get_reg(jit_class_gpr);
965 movr(rn(reg), rn(jit_carry));
967 addcr(r0, r0, rn(reg));
972 _addxi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
975 assert(jit_carry != _NOREG);
976 reg = jit_get_reg(jit_class_gpr);
977 movr(rn(reg), rn(jit_carry));
979 addcr(r0, r0, rn(reg));
984 _subi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
989 else if (_s16_p(-i0))
990 LDA(r0, r1, _u16(-i0));
992 reg = jit_get_reg(jit_class_gpr);
994 subr(r0, r1, rn(reg));
1000 _subcr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1003 if (jit_carry == _NOREG)
1004 jit_carry = jit_get_reg(jit_class_gpr);
1006 reg = jit_get_reg(jit_class_gpr);
1007 subr(rn(reg), r1, r2);
1008 ltr_u(rn(jit_carry), r1, rn(reg));
1014 ltr_u(rn(jit_carry), r1, r0);
1019 _subci(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1022 if (jit_carry == _NOREG)
1023 jit_carry = jit_get_reg(jit_class_gpr);
1025 reg = jit_get_reg(jit_class_gpr);
1026 addi(rn(reg), r1, -i0);
1027 ltr_u(rn(jit_carry), r1, rn(reg));
1033 ltr_u(rn(jit_carry), r1, r0);
1038 _subxr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1041 assert(jit_carry != _NOREG);
1042 reg = jit_get_reg(jit_class_gpr);
1043 movr(rn(reg), rn(jit_carry));
1045 subcr(r0, r0, rn(reg));
1050 _subxi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1053 assert(jit_carry != _NOREG);
1054 reg = jit_get_reg(jit_class_gpr);
1055 movr(rn(reg), rn(jit_carry));
1057 subcr(r0, r0, rn(reg));
1062 _rsbi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1069 _muli(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1075 reg = jit_get_reg(jit_class_gpr);
1077 mulr(r0, r1, rn(reg));
1083 _qmulr(jit_state_t *_jit, jit_int32_t r0,
1084 jit_int32_t r1, jit_int32_t r2, jit_int32_t r3)
1087 /* The only invalid condition is r0 == r1 */
1088 jit_int32_t t2, t3, s2, s3;
1089 if ((r0 != JIT_NOREG && r2 == r0) || r2 == r1) {
1090 s2 = jit_get_reg(jit_class_gpr);
1096 if ((r0 != JIT_NOREG && r3 == r0) || r3 == r1) {
1097 s3 = jit_get_reg(jit_class_gpr);
1103 qmulr_u(r0, r1, r2, r3);
1104 reg = jit_get_reg(jit_class_gpr);
1106 rshi(rn(reg), t2, 63);
1107 mulr(rn(reg), rn(reg), t3);
1108 addr(r1, r1, rn(reg));
1110 rshi(rn(reg), t3, 63);
1111 mulr(rn(reg), rn(reg), t2);
1112 addr(r1, r1, rn(reg));
1121 _qmuli(jit_state_t *_jit, jit_int32_t r0,
1122 jit_int32_t r1, jit_int32_t r2, jit_word_t i0)
1125 reg = jit_get_reg(jit_class_gpr);
1127 qmulr(r0, r1, r2, rn(reg));
1132 _qmulr_u(jit_state_t *_jit, jit_int32_t r0,
1133 jit_int32_t r1, jit_int32_t r2, jit_int32_t r3)
1136 if (r0 != JIT_NOREG) {
1137 if (r0 == r2 || r0 == r3) {
1138 reg = jit_get_reg(jit_class_gpr);
1139 mulr(rn(reg), r2, r3);
1145 if (r0 != JIT_NOREG) {
1146 if (r0 == r2 || r0 == r3) {
1154 _qmuli_u(jit_state_t *_jit, jit_int32_t r0,
1155 jit_int32_t r1, jit_int32_t r2, jit_word_t i0)
1159 if (r0 != JIT_NOREG) {
1161 reg = jit_get_reg(jit_class_gpr);
1162 muli(rn(reg), r2, i0);
1168 if (r0 != JIT_NOREG) {
1176 reg = jit_get_reg(jit_class_gpr);
1178 qmulr_u(r0, r1, r2, rn(reg));
1184 __idiv(jit_word_t u, jit_word_t v)
1190 _divr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1192 movr(_A0_REGNO, r1);
1193 movr(_A1_REGNO, r2);
1194 calli((jit_word_t)__idiv);
1195 movr(r0, _V0_REGNO);
1199 _divi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1201 movr(_A0_REGNO, r1);
1202 movi(_A1_REGNO, i0);
1203 calli((jit_word_t)__idiv);
1204 movr(r0, _V0_REGNO);
1208 __udiv(jit_uword_t u, jit_uword_t v)
1214 _divr_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1216 movr(_A0_REGNO, r1);
1217 movr(_A1_REGNO, r2);
1218 calli((jit_word_t)__udiv);
1219 movr(r0, _V0_REGNO);
1223 _divi_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1225 movr(_A0_REGNO, r1);
1226 movi(_A1_REGNO, i0);
1227 calli((jit_word_t)__udiv);
1228 movr(r0, _V0_REGNO);
1232 __irem(jit_word_t u, jit_word_t v)
1238 _remr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1240 movr(_A0_REGNO, r1);
1241 movr(_A1_REGNO, r2);
1242 calli((jit_word_t)__irem);
1243 movr(r0, _V0_REGNO);
1247 _remi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1249 movr(_A0_REGNO, r1);
1250 movi(_A1_REGNO, i0);
1251 calli((jit_word_t)__irem);
1252 movr(r0, _V0_REGNO);
1256 __urem(jit_uword_t u, jit_uword_t v)
1262 _remr_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1264 movr(_A0_REGNO, r1);
1265 movr(_A1_REGNO, r2);
1266 calli((jit_word_t)__urem);
1267 movr(r0, _V0_REGNO);
1271 _remi_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1273 movr(_A0_REGNO, r1);
1274 movi(_A1_REGNO, i0);
1275 calli((jit_word_t)__urem);
1276 movr(r0, _V0_REGNO);
1280 __idivrem(jit_word_t u, jit_word_t v, jit_word_t *rem)
1287 _qdivr(jit_state_t *_jit,
1288 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_int32_t r3)
1290 movr(_A0_REGNO, r2);
1291 movr(_A1_REGNO, r3);
1292 subi(_A2_REGNO, _FP_REGNO, 8);
1293 calli((jit_word_t)__idivrem);
1294 movr(r0, _V0_REGNO);
1295 ldxi(r1, _FP_REGNO, -8);
1299 _qdivi(jit_state_t *_jit,
1300 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_word_t i0)
1302 movr(_A0_REGNO, r2);
1303 movi(_A1_REGNO, i0);
1304 subi(_A2_REGNO, _FP_REGNO, 8);
1305 calli((jit_word_t)__idivrem);
1306 movr(r0, _V0_REGNO);
1307 ldxi(r1, _FP_REGNO, -8);
1311 __udivrem(jit_uword_t u, jit_uword_t v, jit_uword_t *rem)
1318 _qdivr_u(jit_state_t *_jit,
1319 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_int32_t r3)
1321 movr(_A0_REGNO, r2);
1322 movr(_A1_REGNO, r3);
1323 subi(_A2_REGNO, _FP_REGNO, 8);
1324 calli((jit_word_t)__udivrem);
1325 movr(r0, _V0_REGNO);
1326 ldxi(r1, _FP_REGNO, -8);
1330 _qdivi_u(jit_state_t *_jit,
1331 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_word_t i0)
1333 movr(_A0_REGNO, r2);
1334 movi(_A1_REGNO, i0);
1335 subi(_A2_REGNO, _FP_REGNO, 8);
1336 calli((jit_word_t)__udivrem);
1337 movr(r0, _V0_REGNO);
1338 ldxi(r1, _FP_REGNO, -8);
1342 _lshi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1344 assert(i0 >= 0 && i0 < 64);
1349 _rshi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1351 assert(i0 >= 0 && i0 < 64);
1356 _rshi_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1358 assert(i0 >= 0 && i0 < 64);
1363 _xlshr(jit_state_t *_jit, jit_bool_t sign,
1364 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_int32_t r3)
1367 jit_word_t over, zero, done, done_over;
1368 jit_int32_t t0, s0, t1, s1, t2, s2, t3, s3;
1369 s0 = jit_get_reg(jit_class_gpr);
1371 if (r0 == r2 || r1 == r2) {
1372 s2 = jit_get_reg(jit_class_gpr);
1378 if (r0 == r3 || r1 == r3) {
1379 s3 = jit_get_reg(jit_class_gpr);
1385 if ((s1 = jit_get_reg(jit_class_gpr|jit_class_nospill|jit_class_chk))) {
1391 rsbi(t0, t3, __WORDSIZE);
1398 zero = beqi(_jit->pc.w, t3, 0);
1399 over = beqi(_jit->pc.w, t3, __WORDSIZE);
1400 done = jmpi(_jit->pc.w);
1401 patch_at(over, _jit->pc.w);
1404 done_over = jmpi(_jit->pc.w);
1406 patch_at(zero, _jit->pc.w);
1408 rshi(r1, t2, __WORDSIZE - 1);
1411 patch_at(done, _jit->pc.w);
1412 patch_at(done_over, _jit->pc.w);
1416 rshi(t0, t2, __WORDSIZE - 1);
1421 /* Branchless but 4 bytes longer than branching fallback */
1425 eqi(t1, t3, __WORDSIZE);
1437 _xlshi(jit_state_t *_jit, jit_bool_t sign,
1438 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_word_t i0)
1443 rshi(r1, r2, __WORDSIZE - 1);
1447 else if (i0 == __WORDSIZE) {
1452 assert((jit_uword_t)i0 <= __WORDSIZE);
1454 rshi(r1, r2, __WORDSIZE - i0);
1456 rshi_u(r1, r2, __WORDSIZE - i0);
1462 _xrshr(jit_state_t *_jit, jit_bool_t sign,
1463 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_int32_t r3)
1466 jit_word_t over, zero, done, done_over;
1467 jit_int32_t t0, s0, t1, s1, t2, s2, t3, s3;
1468 s0 = jit_get_reg(jit_class_gpr);
1470 if (r0 == r2 || r1 == r2) {
1471 s2 = jit_get_reg(jit_class_gpr);
1477 if (r0 == r3 || r1 == r3) {
1478 s3 = jit_get_reg(jit_class_gpr);
1484 if ((s1 = jit_get_reg(jit_class_gpr|jit_class_nospill|jit_class_chk))) {
1490 rsbi(t0, t3, __WORDSIZE);
1497 zero = beqi(_jit->pc.w, t3, 0);
1498 over = beqi(_jit->pc.w, t3, __WORDSIZE);
1499 done = jmpi(_jit->pc.w);
1500 patch_at(over, _jit->pc.w);
1503 rshi(r0, t2, __WORDSIZE - 1);
1506 done_over = jmpi(_jit->pc.w);
1508 patch_at(zero, _jit->pc.w);
1510 rshi(r1, t2, __WORDSIZE - 1);
1513 patch_at(done, _jit->pc.w);
1514 patch_at(done_over, _jit->pc.w);
1520 rshi(t0, t2, __WORDSIZE - 1);
1525 eqi(t1, t3, __WORDSIZE);
1537 _xrshi(jit_state_t *_jit, jit_bool_t sign,
1538 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_word_t i0)
1543 rshi(r1, r2, __WORDSIZE - 1);
1547 else if (i0 == __WORDSIZE) {
1550 rshi(r0, r2, __WORDSIZE - 1);
1555 assert((jit_uword_t)i0 <= __WORDSIZE);
1556 lshi(r1, r2, __WORDSIZE - i0);
1565 _andi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1571 jit_int32_t reg, zapnot;
1576 for (reg = zapnot = 0; reg < 8; ++reg) {
1577 # if __BYTE_ORDER == __LITTLE_ENDIAN
1578 # define OFFS(i) (i)
1580 # define OFFS(i) (7 - (i))
1582 if (u.uc[OFFS(reg)] == 0xff)
1584 else if (u.uc[OFFS(reg)] != 0)
1589 ZAPNOTi(r1, zapnot, r0);
1591 reg = jit_get_reg(jit_class_gpr);
1593 andr(r0, r1, rn(reg));
1600 _ori(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1606 reg = jit_get_reg(jit_class_gpr);
1608 orr(r0, r1, rn(reg));
1614 _xori(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1620 reg = jit_get_reg(jit_class_gpr);
1622 xorr(r0, r1, rn(reg));
1628 _lti(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1634 reg = jit_get_reg(jit_class_gpr);
1636 ltr(r0, r1, rn(reg));
1642 _lti_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1646 CMPULTi(r1, i0, r0);
1648 reg = jit_get_reg(jit_class_gpr);
1650 ltr_u(r0, r1, rn(reg));
1656 _lei(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1662 reg = jit_get_reg(jit_class_gpr);
1664 ler(r0, r1, rn(reg));
1670 _lei_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1676 CMPULEi(r1, i0, r0);
1678 reg = jit_get_reg(jit_class_gpr);
1680 ler_u(r0, r1, rn(reg));
1686 _eqi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1692 reg = jit_get_reg(jit_class_gpr);
1694 eqr(r0, r1, rn(reg));
1700 _gei(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1703 reg = jit_get_reg(jit_class_gpr);
1705 ger(r0, r1, rn(reg));
1710 _gei_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1713 reg = jit_get_reg(jit_class_gpr);
1715 ger_u(r0, r1, rn(reg));
1720 _gti(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1723 reg = jit_get_reg(jit_class_gpr);
1725 gtr(r0, r1, rn(reg));
1730 _gti_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1733 reg = jit_get_reg(jit_class_gpr);
1735 gtr_u(r0, r1, rn(reg));
1740 _ner(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1747 _nei(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1755 reg = jit_get_reg(jit_class_gpr);
1757 ner(r0, r1, rn(reg));
1763 _bltr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
1767 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1768 ltr(rn(reg), r0, r1);
1770 BNE(rn(reg), ((i0 - w) >> 2) - 1);
1776 _blti(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
1782 BLT(r0, ((i0 - w) >> 2) - 1);
1785 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1786 lti(rn(reg), r0, i1);
1788 BNE(rn(reg), ((i0 - w) >> 2) - 1);
1795 _bltr_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
1799 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1800 ltr_u(rn(reg), r0, r1);
1802 BNE(rn(reg), ((i0 - w) >> 2) - 1);
1808 _blti_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
1812 /* FIXME cannot optimize zero because need to return a patcheable address */
1813 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1814 lti_u(rn(reg), r0, i1);
1816 BNE(rn(reg), ((i0 - w) >> 2) - 1);
1822 _bler(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
1826 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1827 ler(rn(reg), r0, r1);
1829 BNE(rn(reg), ((i0 - w) >> 2) - 1);
1835 _blei(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
1841 BLE(r0, ((i0 - w) >> 2) - 1);
1844 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1845 lei(rn(reg), r0, i1);
1847 BNE(rn(reg), ((i0 - w) >> 2) - 1);
1854 _bler_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
1858 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1859 ler_u(rn(reg), r0, r1);
1861 BNE(rn(reg), ((i0 - w) >> 2) - 1);
1867 _blei_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
1873 BEQ(r0, ((i0 - w) >> 2) - 1);
1876 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1877 lei_u(rn(reg), r0, i1);
1879 BNE(rn(reg), ((i0 - w) >> 2) - 1);
1886 _beqr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
1890 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1891 eqr(rn(reg), r0, r1);
1893 BNE(rn(reg), ((i0 - w) >> 2) - 1);
1899 _beqi(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
1905 BEQ(r0, ((i0 - w) >> 2) - 1);
1908 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1909 eqi(rn(reg), r0, i1);
1911 BNE(rn(reg), ((i0 - w) >> 2) - 1);
1918 _bger(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
1922 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1923 ger(rn(reg), r0, r1);
1925 BNE(rn(reg), ((i0 - w) >> 2) - 1);
1931 _bgei(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
1937 BGE(r0, ((i0 - w) >> 2) - 1);
1940 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1941 gei(rn(reg), r0, i1);
1943 BNE(rn(reg), ((i0 - w) >> 2) - 1);
1950 _bger_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
1954 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1955 ger_u(rn(reg), r0, r1);
1957 BNE(rn(reg), ((i0 - w) >> 2) - 1);
1963 _bgei_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
1967 /* always true if i1 == 0 */
1970 BR(r0, ((i0 - w) >> 2) - 1);
1973 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1974 gei_u(rn(reg), r0, i1);
1976 BNE(rn(reg), ((i0 - w) >> 2) - 1);
1983 _bgtr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
1987 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1988 gtr(rn(reg), r0, r1);
1990 BNE(rn(reg), ((i0 - w) >> 2) - 1);
1996 _bgti(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
2002 BGT(r0, ((i0 - w) >> 2) - 1);
2005 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2006 gti(rn(reg), r0, i1);
2008 BNE(rn(reg), ((i0 - w) >> 2) - 1);
2015 _bgtr_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2019 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2020 gtr_u(rn(reg), r0, r1);
2022 BNE(rn(reg), ((i0 - w) >> 2) - 1);
2028 _bgti_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
2032 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2033 gti_u(rn(reg), r0, i1);
2035 BNE(rn(reg), ((i0 - w) >> 2) - 1);
2041 _bner(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2045 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2046 eqr(rn(reg), r0, r1);
2048 BEQ(rn(reg), ((i0 - w) >> 2) - 1);
2054 _bnei(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
2060 BNE(r0, ((i0 - w) >> 2) - 1);
2063 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2064 eqi(rn(reg), r0, i1);
2066 BEQ(rn(reg), ((i0 - w) >> 2) - 1);
2073 _baddr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1,
2081 /* t0 = r0 + r1; overflow = r1 < 0 ? r0 < t0 : t0 < r0 */
2082 t0 = jit_get_reg(jit_class_gpr);
2083 t1 = jit_get_reg(jit_class_gpr);
2084 t2 = jit_get_reg(jit_class_gpr);
2085 t3 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2086 addr(rn(t0), r0, r1); /* t0 = r0 + r1 */
2087 ltr(rn(t1), r1, _R31_REGNO); /* t1 = r1 < 0 */
2088 ltr(rn(t2), r0, rn(t0)); /* t2 = r0 < t0 */
2089 ltr(rn(t3), rn(t0), r0); /* t3 = t0 < r0 */
2090 movr(r0, rn(t0)); /* r0 += r1 */
2091 CMOVNE(rn(t1), rn(t2), rn(t3)); /* if (t1 == 0) t3 = t2; */
2097 BNE(rn(t3), ((i0 - w) >> 2) - 1);
2099 BEQ(rn(t3), ((i0 - w) >> 2) - 1);
2105 _baddi(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1,
2110 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2112 w = baddr(i0, r0, rn(reg), carry);
2118 _baddr_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1,
2124 t0 = jit_get_reg(jit_class_gpr);
2125 t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2126 addr(rn(t0), r0, r1);
2127 ltr_u(rn(t1), rn(t0), r0);
2132 BNE(rn(t1), ((i0 - w) >> 2) - 1);
2134 BEQ(rn(t1), ((i0 - w) >> 2) - 1);
2140 _baddi_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1,
2146 t0 = jit_get_reg(jit_class_gpr);
2147 t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2148 addi(rn(t0), r0, i1);
2149 ltr_u(rn(t1), rn(t0), r0);
2154 BNE(rn(t1), ((i0 - w) >> 2) - 1);
2156 BEQ(rn(t1), ((i0 - w) >> 2) - 1);
2162 _bsubr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1,
2170 /* t0 = r0 - r1; overflow = 0 < r1 ? r0 < t0 : t0 < r0 */
2171 t0 = jit_get_reg(jit_class_gpr);
2172 t1 = jit_get_reg(jit_class_gpr);
2173 t2 = jit_get_reg(jit_class_gpr);
2174 t3 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2175 subr(rn(t0), r0, r1); /* r0 = r0 - r1 */
2176 ltr(rn(t1), _R31_REGNO, r1); /* t1 = 0 < r1 */
2177 ltr(rn(t2), r0, rn(t0)); /* t2 = r0 < t0 */
2178 ltr(rn(t3), rn(t0), r0); /* t3 = t0 < r0 */
2179 movr(r0, rn(t0)); /* r0 -= r1 */
2180 CMOVNE(rn(t1), rn(t2), rn(t3)); /* if (t1 == 0) t3 = t2; */
2186 BNE(rn(t3), ((i0 - w) >> 2) - 1);
2188 BEQ(rn(t3), ((i0 - w) >> 2) - 1);
2194 _bsubi(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1,
2199 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2201 w = bsubr(i0, r0, rn(reg), carry);
2207 _bsubr_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1,
2213 t0 = jit_get_reg(jit_class_gpr);
2214 t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2215 subr(rn(t0), r0, r1);
2216 ltr_u(rn(t1), r0, rn(t0));
2221 BNE(rn(t1), ((i0 - w) >> 2) - 1);
2223 BEQ(rn(t1), ((i0 - w) >> 2) - 1);
2229 _bsubi_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1,
2235 t0 = jit_get_reg(jit_class_gpr);
2236 t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2237 subi(rn(t0), r0, i1);
2238 ltr_u(rn(t1), r0, rn(t0));
2243 BNE(rn(t1), ((i0 - w) >> 2) - 1);
2245 BEQ(rn(t1), ((i0 - w) >> 2) - 1);
2251 _bmxr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1,
2256 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2257 andr(rn(t0), r0, r1);
2260 BNE(rn(t0), ((i0 - w) >> 2) - 1);
2262 BEQ(rn(t0), ((i0 - w) >> 2) - 1);
2268 _bmxi(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1,
2273 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2274 andi(rn(t0), r0, i1);
2277 BNE(rn(t0), ((i0 - w) >> 2) - 1);
2279 BEQ(rn(t0), ((i0 - w) >> 2) - 1);
2285 _ldr_c(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
2292 _ldi_c(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
2296 LDBU(r0, _R31_REGNO, _u16(i0));
2300 reg = jit_get_reg(jit_class_gpr);
2308 _ldi_uc(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
2312 LDBU(r0, _R31_REGNO, _u16(i0));
2314 reg = jit_get_reg(jit_class_gpr);
2316 ldr_uc(r0, rn(reg));
2322 _ldr_s(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
2329 _ldi_s(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
2333 LDWU(r0, _R31_REGNO, _u16(i0));
2337 reg = jit_get_reg(jit_class_gpr);
2345 _ldi_us(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
2349 LDWU(r0, _R31_REGNO, _u16(i0));
2351 reg = jit_get_reg(jit_class_gpr);
2353 ldr_us(r0, rn(reg));
2359 _ldi_i(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
2363 LDL(r0, _R31_REGNO, _u16(i0));
2365 reg = jit_get_reg(jit_class_gpr);
2373 _ldr_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
2380 _ldi_ui(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
2384 LDL(r0, _R31_REGNO, _u16(i0));
2388 reg = jit_get_reg(jit_class_gpr);
2390 ldr_ui(r0, rn(reg));
2396 _ldi_l(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
2400 LDQ(r0, _R31_REGNO, _u16(i0));
2402 reg = jit_get_reg(jit_class_gpr);
2410 _ldxr_c(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2413 reg = jit_get_reg(jit_class_gpr);
2414 addr(rn(reg), r1, r2);
2420 _ldxi_c(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2424 LDBU(r0, r1, _u16(i0));
2428 reg = jit_get_reg(jit_class_gpr);
2429 addi(rn(reg), r1, i0);
2436 _ldxr_uc(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2439 reg = jit_get_reg(jit_class_gpr);
2440 addr(rn(reg), r1, r2);
2441 ldr_uc(r0, rn(reg));
2446 _ldxi_uc(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2450 LDBU(r0, r1, _u16(i0));
2452 reg = jit_get_reg(jit_class_gpr);
2453 addi(rn(reg), r1, i0);
2454 ldr_uc(r0, rn(reg));
2460 _ldxr_s(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2463 reg = jit_get_reg(jit_class_gpr);
2464 addr(rn(reg), r1, r2);
2470 _ldxi_s(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2474 LDWU(r0, r1, _u16(i0));
2478 reg = jit_get_reg(jit_class_gpr);
2479 addi(rn(reg), r1, i0);
2486 _ldxr_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2489 reg = jit_get_reg(jit_class_gpr);
2490 addr(rn(reg), r1, r2);
2491 ldr_us(r0, rn(reg));
2496 _ldxi_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2500 LDWU(r0, r1, _u16(i0));
2502 reg = jit_get_reg(jit_class_gpr);
2503 addi(rn(reg), r1, i0);
2504 ldr_us(r0, rn(reg));
2510 _ldxr_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2513 reg = jit_get_reg(jit_class_gpr);
2514 addr(rn(reg), r1, r2);
2520 _ldxi_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2524 LDL(r0, r1, _u16(i0));
2526 reg = jit_get_reg(jit_class_gpr);
2527 addi(rn(reg), r1, i0);
2534 _ldxr_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2537 reg = jit_get_reg(jit_class_gpr);
2538 addr(rn(reg), r1, r2);
2539 ldr_ui(r0, rn(reg));
2544 _ldxi_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2548 LDL(r0, r1, _u16(i0));
2552 reg = jit_get_reg(jit_class_gpr);
2553 addi(rn(reg), r1, i0);
2554 ldr_ui(r0, rn(reg));
2560 _ldxr_l(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2563 reg = jit_get_reg(jit_class_gpr);
2564 addr(rn(reg), r1, r2);
2570 _ldxi_l(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2574 LDQ(r0, r1, _u16(i0));
2576 reg = jit_get_reg(jit_class_gpr);
2577 addi(rn(reg), r1, i0);
2584 _unldr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2586 jit_int32_t t0, r2, t1, r3;
2587 assert(i0 >= 1 && i0 <= sizeof(jit_word_t));
2591 t0 = jit_get_reg(jit_class_gpr); r2 = rn(t0);
2592 t1 = jit_get_reg(jit_class_gpr);
2602 #if __BYTE_ORDER == __LITTLE_ENDIAN
2610 #if __BYTE_ORDER == __LITTLE_ENDIAN
2626 lshi(r0, r0, __WORDSIZE - 24);
2627 rshi(r0, r0, __WORDSIZE - 24);
2633 lshi(r0, r0, __WORDSIZE - 40);
2634 rshi(r0, r0, __WORDSIZE - 40);
2637 lshi(r0, r0, __WORDSIZE - 48);
2638 rshi(r0, r0, __WORDSIZE - 48);
2641 lshi(r0, r0, __WORDSIZE - 56);
2642 rshi(r0, r0, __WORDSIZE - 56);
2650 /* Slightly shorter than fallback, and branchless */
2652 _unldi(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0, jit_word_t i1)
2655 reg = jit_get_reg(jit_class_gpr);
2657 unldr(r0, rn(reg), i1);
2662 _unldr_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2664 jit_int32_t t0, r2, t1, r3;
2665 assert(i0 >= 1 && i0 <= sizeof(jit_word_t));
2669 t0 = jit_get_reg(jit_class_gpr); r2 = rn(t0);
2670 t1 = jit_get_reg(jit_class_gpr);
2680 #if __BYTE_ORDER == __LITTLE_ENDIAN
2688 #if __BYTE_ORDER == __LITTLE_ENDIAN
2704 lshi(r0, r0, __WORDSIZE - 24);
2705 rshi_u(r0, r0, __WORDSIZE - 24);
2711 lshi(r0, r0, __WORDSIZE - 40);
2712 rshi_u(r0, r0, __WORDSIZE - 40);
2715 lshi(r0, r0, __WORDSIZE - 48);
2716 rshi_u(r0, r0, __WORDSIZE - 48);
2719 lshi(r0, r0, __WORDSIZE - 56);
2720 rshi_u(r0, r0, __WORDSIZE - 56);
2729 _unldi_u(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0, jit_word_t i1)
2732 reg = jit_get_reg(jit_class_gpr);
2734 unldr_u(r0, rn(reg), i1);
2739 _sti_c(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
2743 STB(r0, _R31_REGNO, _u16(i0));
2745 reg = jit_get_reg(jit_class_gpr);
2753 _sti_s(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
2757 STW(r0, _R31_REGNO, _u16(i0));
2759 reg = jit_get_reg(jit_class_gpr);
2767 _sti_i(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
2771 STL(r0, _R31_REGNO, _u16(i0));
2773 reg = jit_get_reg(jit_class_gpr);
2781 _sti_l(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
2785 STQ(r0, _R31_REGNO, _u16(i0));
2787 reg = jit_get_reg(jit_class_gpr);
2795 _stxr_c(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2798 reg = jit_get_reg(jit_class_gpr);
2799 addr(rn(reg), r0, r1);
2805 _stxi_c(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2809 STB(r1, r0, _u16(i0));
2811 reg = jit_get_reg(jit_class_gpr);
2812 addi(rn(reg), r0, i0);
2819 _stxr_s(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2822 reg = jit_get_reg(jit_class_gpr);
2823 addr(rn(reg), r0, r1);
2829 _stxi_s(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2833 STW(r1, r0, _u16(i0));
2835 reg = jit_get_reg(jit_class_gpr);
2836 addi(rn(reg), r0, i0);
2843 _stxr_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2846 reg = jit_get_reg(jit_class_gpr);
2847 addr(rn(reg), r0, r1);
2853 _stxi_i(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2857 STL(r1, r0, _u16(i0));
2859 reg = jit_get_reg(jit_class_gpr);
2860 addi(rn(reg), r0, i0);
2867 _stxr_l(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2870 reg = jit_get_reg(jit_class_gpr);
2871 addr(rn(reg), r0, r1);
2877 _stxi_l(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2881 STQ(r1, r0, _u16(i0));
2883 reg = jit_get_reg(jit_class_gpr);
2884 addi(rn(reg), r0, i0);
2891 _unstr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2893 jit_word_t t0, t1, t2, t3, t4, r2, r3, r4, r5, r6;
2894 assert(i0 > 0 && i0 <= sizeof(jit_word_t));
2897 else if (i0 == 4 || i0 == 8) {
2898 t0 = jit_get_reg(jit_class_gpr); r2 = rn(t0);
2899 t1 = jit_get_reg(jit_class_gpr); r3 = rn(t1);
2900 t2 = jit_get_reg(jit_class_gpr); r4 = rn(t2);
2901 t3 = jit_get_reg(jit_class_gpr); r5 = rn(t3);
2902 t4 = jit_get_reg(jit_class_gpr); r6 = rn(t4);
2903 #if __BYTE_ORDER == __LITTLE_ENDIAN
2904 LDA(r4, r0, 0); /* r4<2:0> = (X mod 8) = 5 */
2906 LDA(r4, r0, i0 - 1); /* r4<2:0> = ((X+7) mod 8) = 5 */
2908 LDQ_U(r2, r0, i0 - 1); /* Ignores va<2:0>, r2 = yyyH GFED
2911 LDQ_U(r3, r0, 0); /* Ignores va<2:0>, r3 = CBAx xxxx */
2913 INSQH(r1, r4, r5); /* r5 = 000H GFED */
2914 INSQL(r1, r4, r6); /* r6 = CBA0 0000 */
2915 MSKQH(r2, r4, r2); /* r2 = yyy0 0000 */
2916 MSKQL(r3, r4, r3); /* r3 = 000x xxxx */
2919 INSLH(r1, r4, r5); /* r5 = 0000 000D */
2920 INSLL(r1, r4, r6); /* r6 = CBA0 0000 */
2921 MSKLH(r2, r4, r2); /* r2 = yyy0 0000 */
2922 MSKLL(r3, r4, r3); /* r3 = 000x xxxx */
2924 OR(r2, r5, r2); /* r2 = yyyH GFED (or yyyy yyyD) */
2925 OR(r3, r6, r3); /* r1 = CBAx xxxx */
2926 STQ_U(r2, r0, i0 - 1); /* Must store high then low for */
2927 STQ_U(r3, r0, 0); /* degenerate case of aligned QW */
2935 fallback_unstr(r0, r1, i0);
2939 _unsti(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
2942 if (i1 == 4 || i1 == 8) {
2943 reg = jit_get_reg(jit_class_gpr);
2945 unstr(rn(reg), r0, i1);
2949 fallback_unsti(i0, r0, i1);
2953 _extr(jit_state_t *_jit,
2954 jit_int32_t r0, jit_int32_t r1, jit_word_t i0, jit_word_t i1)
2956 assert(i0 >= 0 && i1 >= 1 && i0 + i1 <= __WORDSIZE);
2957 if (i1 == __WORDSIZE)
2960 # if __BYTE_ORDER == __BIG_ENDIAN
2961 i0 = __WORDSIZE - (i0 + i1);
2963 if (__WORDSIZE - (i0 + i1)) {
2964 lshi(r0, r1, __WORDSIZE - (i0 + i1));
2965 rshi(r0, r0, __WORDSIZE - i1);
2968 rshi(r0, r1, __WORDSIZE - i1);
2973 _extr_u(jit_state_t *_jit,
2974 jit_int32_t r0, jit_int32_t r1, jit_word_t i0, jit_word_t i1)
2976 assert(i0 >= 0 && i1 >= 1 && i0 + i1 <= __WORDSIZE);
2977 if (i1 == __WORDSIZE)
2980 # if __BYTE_ORDER == __BIG_ENDIAN
2981 i0 = __WORDSIZE - (i0 + i1);
2983 if ((i0 & 7) == 0) {
2985 EXTBLi(r1, i0 >> 3, r0);
2989 EXTWLi(r1, i0 >> 3, r0);
2993 EXTLLi(r1, i0 >> 3, r0);
2999 andi(r0, r0, (1L << i1) - 1);
3005 _depr(jit_state_t *_jit,
3006 jit_int32_t r0, jit_int32_t r1, jit_word_t i0, jit_word_t i1)
3010 assert(i0 >= 0 && i1 >= 1 && i0 + i1 <= __WORDSIZE);
3011 if (i1 == __WORDSIZE)
3014 # if __BYTE_ORDER == __BIG_ENDIAN
3015 i0 = __WORDSIZE - (i0 + i1);
3017 t0 = jit_get_reg(jit_class_gpr);
3018 if ((i0 & 7) == 0) {
3020 MSKBLi(r0, i0 >> 3, rn(t0));
3021 INSBLi(r1, i0 >> 3, r0);
3025 MSKWLi(r0, i0 >> 3, rn(t0));
3026 INSWLi(r1, i0 >> 3, r0);
3030 MSKLLi(r0, i0 >> 3, rn(t0));
3031 INSLLi(r1, i0 >> 3, r0);
3035 mask = (1L << i1) - 1;
3036 andi(rn(t0), r1, mask);
3038 lshi(rn(t0), rn(t0), i0);
3041 andi(r0, r0, ~mask);
3043 orr(r0, r0, rn(t0));
3049 _extr_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
3056 _bswapr_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
3059 t0 = jit_get_reg(jit_class_gpr);
3060 EXTBLi(r1, 0, rn(t0));
3062 SLLi(rn(t0), 8, rn(t0));
3068 _bswapr_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
3074 t0 = jit_get_reg(jit_class_gpr);
3075 t1 = jit_get_reg(jit_class_gpr);
3076 t2 = jit_get_reg(jit_class_gpr);
3077 t3 = jit_get_reg(jit_class_gpr);
3078 EXTBLi(r1, 3, rn(t0));
3079 INSBLi(r1, 3, rn(t1));
3080 SLLi(r1, 8, rn(t2));
3081 ZAPNOTi(rn(t2), 4, rn(t2));
3082 SRLi(r1, 8, rn(t3));
3083 OR(rn(t0), rn(t1), r0);
3085 ZAPNOTi(rn(t3), 2, rn(t3));
3094 _bswapr_ul(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
3099 assert(_jitc->function != NULL);
3100 t0 = jit_get_reg(jit_class_fpr);
3101 t1 = jit_get_reg(jit_class_gpr);
3102 t2 = jit_get_reg(jit_class_gpr);
3103 stxi(-8, _FP_REGNO, r1); /* r1 = ABCD EFGH */
3104 LDG(rn(t0), _FP_REGNO, _u16(-8)); /* t0 = GHEF CDAB */
3105 STT(rn(t0), _FP_REGNO, _u16(-8));
3106 ldxi(rn(t1), _FP_REGNO, -8); /* t1 = GHEF CDAB */
3107 lshi(rn(t2), rn(t1), 8); /* t2 = HEFC DAB. */
3108 rshi_u(rn(t1), rn(t1), 8); /* t1 = .GHE FCDA */
3109 ZAPi(rn(t2), 0x55, rn(t2)); /* t2 = H.F. D.B. */
3110 ZAPi(rn(t1), 0xaa, rn(t1)); /* t1 = .G.E .C.A */
3111 orr(r0, rn(t1), rn(t2)); /* r0 = HGFE DCBA */
3118 _jmpi(jit_state_t *_jit, jit_word_t i0)
3123 d = ((i0 - w) >> 2) - 1;
3132 _jmpi_p(jit_state_t *_jit, jit_word_t i0)
3136 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
3137 w = movi_p(rn(reg), i0);
3144 _callr(jit_state_t *_jit, jit_int32_t r0)
3146 if (r0 != _PV_REGNO)
3148 JSR(_RA_REGNO, _PV_REGNO, 0);
3152 _calli(jit_state_t *_jit, jit_word_t i0)
3154 /* FIXME use a small buffer to load constants - using gp */
3159 d = ((i0 - w) >> 2) - 1;
3165 movi(_PV_REGNO, i0);
3171 _calli_p(jit_state_t *_jit, jit_word_t i0)
3174 w = movi_p(_PV_REGNO, i0);
3180 _prolog(jit_state_t *_jit, jit_node_t *node)
3183 if (_jitc->function->define_frame || _jitc->function->assume_frame) {
3184 jit_int32_t frame = -_jitc->function->frame;
3185 assert(_jitc->function->self.aoff >= frame);
3186 if (_jitc->function->assume_frame)
3188 _jitc->function->self.aoff = frame;
3190 if (_jitc->function->allocar)
3191 _jitc->function->self.aoff &= -8;
3192 _jitc->function->stack = ((_jitc->function->self.alen -
3193 _jitc->function->self.aoff) + 7) & -8;
3194 /* ldgp gp, 0(pv) */
3195 LDAH(_PV_REGNO, _GP_REGNO, 0);
3196 LDA(_GP_REGNO, _GP_REGNO, 0);
3197 /* callee save registers */
3198 subi(_SP_REGNO, _SP_REGNO, stack_framesize);
3199 stxi(0, _SP_REGNO, _RA_REGNO);
3200 stxi(8, _SP_REGNO, _FP_REGNO);
3201 # define SPILL(N, O) \
3202 if (jit_regset_tstbit(&_jitc->function->regset, N)) \
3203 stxi(O, _SP_REGNO, N##_REGNO)
3204 # define SPILLD(N, O) \
3205 if (jit_regset_tstbit(&_jitc->function->regset, N)) \
3206 stxi_d(O, _SP_REGNO, N##_REGNO)
3223 movr(_FP_REGNO, _SP_REGNO);
3225 if (_jitc->function->stack)
3226 subi(_SP_REGNO, _SP_REGNO, _jitc->function->stack);
3227 if (_jitc->function->allocar) {
3228 reg = jit_get_reg(jit_class_gpr);
3229 movi(rn(reg), _jitc->function->self.aoff);
3230 stxi_i(_jitc->function->aoffoff, _FP_REGNO, rn(reg));
3234 if (_jitc->function->self.call & jit_call_varargs) {
3235 for (reg = _jitc->function->self.argi; jit_arg_reg_p(reg); ++reg)
3236 stxi(stack_framesize - 48 + reg * 8, _FP_REGNO, rn(_A0 - reg));
3237 for (reg = _jitc->function->self.argi; jit_arg_reg_p(reg); ++reg)
3238 stxi_d(stack_framesize - 96 + reg * 8, _FP_REGNO, rn(_F16 - reg));
3243 _epilog(jit_state_t *_jit, jit_node_t *node)
3245 if (_jitc->function->assume_frame)
3247 movr(_SP_REGNO, _FP_REGNO);
3248 ldxi(_RA_REGNO, _SP_REGNO, 0);
3249 ldxi(_FP_REGNO, _SP_REGNO, 8);
3250 # define LOAD(N, O) \
3251 if (jit_regset_tstbit(&_jitc->function->regset, N)) \
3252 ldxi(N##_REGNO, _SP_REGNO, O)
3253 # define LOADD(N, O) \
3254 if (jit_regset_tstbit(&_jitc->function->regset, N)) \
3255 ldxi_d(N##_REGNO, _SP_REGNO, O)
3272 addi(_SP_REGNO, _SP_REGNO, stack_framesize);
3273 RET(_R31_REGNO, _RA_REGNO, 1); /* 1 means procedure return
3274 * 0 means no procedure return
3275 * other values are reserved */
3279 _vastart(jit_state_t *_jit, jit_int32_t r0)
3283 /* Return jit_va_list_t in the register argument */
3284 addi(r0, _FP_REGNO, _jitc->function->vaoff);
3286 reg = jit_get_reg(jit_class_gpr);
3288 /* The base field is constant. */
3289 addi(rn(reg), _FP_REGNO, stack_framesize - 48);
3290 stxi(offsetof(jit_va_list_t, base), r0, rn(reg));
3292 /* Initialize the offset field */
3293 if (_jitc->function->vagp < 6)
3294 movi(rn(reg), _jitc->function->vagp * 8);
3296 movi(rn(reg), _jitc->function->self.size - (stack_framesize - 48));
3297 stxi(offsetof(jit_va_list_t, offset), r0, rn(reg));
3303 _vaarg(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
3305 jit_int32_t rg0, rg1;
3307 assert(_jitc->function->self.call & jit_call_varargs);
3309 rg0 = jit_get_reg(jit_class_gpr);
3310 rg1 = jit_get_reg(jit_class_gpr);
3312 /* Load the base in first temporary. */
3313 ldxi(rn(rg0), r1, offsetof(jit_va_list_t, base));
3315 /* Load the offset in the second temporary. */
3316 ldxi(rn(rg1), r1, offsetof(jit_va_list_t, offset));
3318 /* Load the argument */
3319 ldxr(r0, rn(rg0), rn(rg1));
3321 /* No longer needed. */
3324 /* Update offset. */
3325 addi(rn(rg1), rn(rg1), 8);
3326 stxi(offsetof(jit_va_list_t, offset), r1, rn(rg1));
3331 _patch_at(jit_state_t *_jit, jit_word_t instr, jit_word_t label)
3338 jit_int16_t s0, s1, s2, s3;
3340 switch (_u6(u.i[0] >> 26)) {
3341 /* BLT BLE BEQ BGE */
3342 case 0x3a: case 0x3b: case 0x39: case 0x3e:
3343 /* BGT BNE BLBC BLBS */
3344 case 0x3f: case 0x3d: case 0x38: case 0x3c:
3346 case 0x30: case 0x34:
3347 /* FBLT FBLE FBEQ FBGE */
3348 case 0x32: case 0x33: case 0x31: case 0x36:
3350 case 0x37: case 0x35:
3351 d = ((label - instr) >> 2) - 1;
3353 u.i[0] &= ~0x1fffff;
3357 case 0x08: /* movi_p */
3369 assert(_u6(u.i[1] >> 26) == 0x08);
3373 assert(_u6(u.i[2] >> 26) == 0x09);
3377 assert(_u6(u.i[3] >> 26) == 0x09);
3381 assert(_u6(u.i[4] >> 26) == 0x12 && _u7(u.i[4] >> 5) == 0x39);
3383 assert(_u6(u.i[5] >> 26) == 0x12 && _u7(u.i[5] >> 5) == 0x34);
3385 assert(_u6(u.i[6] >> 26) == 0x12 && _u7(u.i[6] >> 5) == 0x39);
3387 assert(_u6(u.i[7] >> 26) == 0x11 && _u7(u.i[7] >> 5) == 0x20);