git subrepo pull (merge) --force deps/lightning
[pcsx_rearmed.git] / deps / lightning / lib / jit_alpha-cpu.c
CommitLineData
4a71579b 1/*
79bfeef6 2 * Copyright (C) 2014-2023 Free Software Foundation, Inc.
4a71579b
PC
3 *
4 * This file is part of GNU lightning.
5 *
6 * GNU lightning is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU Lesser General Public License as published
8 * by the Free Software Foundation; either version 3, or (at your option)
9 * any later version.
10 *
11 * GNU lightning is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
14 * License for more details.
15 *
16 * Authors:
17 * Paulo Cesar Pereira de Andrade
18 */
19
20#if PROTO
21# define _u2(v) ((v) & 0x3)
22# define _s2_p(v) ((v) >= -0x2 && (v) <= 0x1)
23# define _u2_p(v) ((v) >= 0 && (v) <= 0x3)
24# define _u5(v) ((v) & 0x1f)
25# define _s5_p(v) ((v) >= -0x10 && (v) <= 0xf)
26# define _u5_p(v) ((v) >= 0 && (v) <= 0x1f)
27# define _u6(v) ((v) & 0x3f)
28# define _s6_p(v) ((v) >= -0x20 && (v) <= 0x1f)
29# define _u6_p(v) ((v) >= 0 && (v) <= 0x3f)
30# define _u7(v) ((v) & 0x7f)
31# define _s7_p(v) ((v) >= -0x40 && (v) <= 0x3f)
32# define _u7_p(v) ((v) >= 0 && (v) <= 0x7f)
33# define _u8(v) ((v) & 0xff)
34# define _s8_p(v) ((v) >= -0x80 && (v) <= 0x7f)
35# define _u8_p(v) ((v) >= 0 && (v) <= 0xff)
36# define _u11(v) ((v) & 0x7ff)
37# define _s11_p(v) ((v) >= -0x400 && (v) <= 0x3ff)
38# define _u11_p(v) ((v) >= 0 && (v) <= 0x7ff)
39# define _u14(v) ((v) & 0x3fff)
40# define _s14_p(v) ((v) >= -0x2000 && (v) <= 0x1fff)
41# define _u14_p(v) ((v) >= 0 && (v) <= 0x3fff)
42# define _u16(v) ((v) & 0xffff)
43# define _s16_p(v) ((v) >= -0x8000 && (v) <= 0x7fff)
44# define _u16_p(v) ((v) >= 0 && (v) <= 0xffff)
45# define _u21(v) ((v) & 0x1fffff)
46# define _s21_p(v) ((v) >= -0x100000 && (v) <= 0xfffff)
47# define _u21_p(v) ((v) >= 0 && (v) <= 0x1fffff)
48# define _u26(v) ((v) & 0x3ffffff)
49# define _s26_p(v) ((v) >= -0x2000000 && (v) <= 0x1ffffff)
50# define _u26_p(v) ((v) >= 0 && (v) <= 0x3ffffff)
51# define _u32(v) ((v) & 0xffffffff)
52# define _s32_p(v) ((v) >= -0x80000000 && (v) <= 0x7fffffff)
53# define _u32_p(v) ((v) >= 0 && (v) <= 0xffffffff)
54# define ii(i) *_jit->pc.ui++ = i
ba86ff93
PC
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)
4a71579b
PC
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)
83static void _Pcd(jit_state_t*,int,unsigned int) maybe_unused;
84# define Bra(o,ra,d) _Bra(_jit,o,ra,d)
85static void _Bra(jit_state_t*,int,int,int);
86# define Mem(o,ra,rb,d) _Mem(_jit,o,ra,rb,d)
87static 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)
89static 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)
91static 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)
93static 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)
315static void _nop(jit_state_t*,jit_int32_t);
316# define movr(r0,r1) _movr(_jit,r0,r1)
317static void _movr(jit_state_t*,jit_int32_t,jit_int32_t);
318# define movi(r0,i0) _movi(_jit,r0,i0)
319static void _movi(jit_state_t*,jit_int32_t,jit_word_t);
320# define movi_p(r0,i0) _movi_p(_jit,r0,i0)
321static jit_word_t _movi_p(jit_state_t*,jit_int32_t,jit_word_t);
c0c16242
PC
322# define movnr(r0,r1,r2) CMOVNE(r2, r1, r0)
323# define movzr(r0,r1,r2) CMOVEQ(r2, r1, r0)
ba3814c1
PC
324# define casx(r0, r1, r2, r3, i0) _casx(_jit, r0, r1, r2, r3, i0)
325static void _casx(jit_state_t *_jit,jit_int32_t,jit_int32_t,
326 jit_int32_t,jit_int32_t,jit_word_t);
c0c16242
PC
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)
4a71579b
PC
329# define negr(r0,r1) NEGQ(r1,r0)
330# define comr(r0,r1) NOT(r1,r0)
79bfeef6
PC
331# define clor(r0, r1) _clor(_jit, r0, r1)
332static 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)
335static void _ctor(jit_state_t*, jit_int32_t, jit_int32_t);
336# define ctzr(r0, r1) CTTZ(r1, r0)
ba86ff93 337# define popcntr(r0, r1) CTPOP(r1, r0)
4a71579b
PC
338# define addr(r0,r1,r2) ADDQ(r1,r2,r0)
339# define addi(r0,r1,i0) _addi(_jit,r0,r1,i0)
340static 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)
342static 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)
344static 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)
346static 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)
348static 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)
351static 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)
353static 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)
355static 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)
357static 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)
359static 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)
361static 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)
364static void _muli(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
ba86ff93
PC
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)
4a71579b
PC
369# define qmulr(r0,r1,r2,r3) _qmulr(_jit,r0,r1,r2,r3)
370static 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)
373static 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)
376static 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)
379static void _qmuli_u(jit_state_t*,jit_int32_t,
380 jit_int32_t,jit_int32_t,jit_word_t);
381static jit_word_t __idiv(jit_word_t, jit_word_t);
382# define divr(r0,r1,r2) _divr(_jit,r0,r1,r2)
383static 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)
385static void _divi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
386static jit_uword_t __udiv(jit_uword_t, jit_uword_t);
387# define divr_u(r0,r1,r2) _divr_u(_jit,r0,r1,r2)
388static 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)
390static void _divi_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
391static jit_word_t __irem(jit_word_t, jit_word_t);
392# define remr(r0,r1,r2) _remr(_jit,r0,r1,r2)
393static 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)
395static void _remi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
396static jit_uword_t __urem(jit_uword_t, jit_uword_t);
397# define remr_u(r0,r1,r2) _remr_u(_jit,r0,r1,r2)
398static 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)
400static void _remi_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
401static 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)
403static 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)
406static void _qdivi(jit_state_t*,
407 jit_int32_t,jit_int32_t,jit_int32_t,jit_word_t);
408static 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)
410static 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)
413static 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)
417static 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)
420static 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)
423static void _rshi_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
ba86ff93
PC
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)
427static void
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)
432static void
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)
437static void
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)
442static void
443_xrshi(jit_state_t*,jit_bool_t,jit_int32_t,jit_int32_t,jit_int32_t,jit_word_t);
4a71579b
PC
444# define andr(r0,r1,r2) AND(r1,r2,r0)
445# define andi(r0,r1,i0) _andi(_jit,r0,r1,i0)
446static 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)
449static 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)
452static 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)
455static 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)
458static 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)
461static 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)
464static 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)
467static 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)
470static 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)
473static 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)
476static 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)
479static 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)
481static 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)
483static 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)
485static 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)
487static 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)
489static 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)
491static 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)
493static 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)
495static 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)
497static 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)
499static 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)
501static 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)
503static 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)
505static 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)
507static 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)
509static 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)
511static 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)
513static 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)
515static 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)
517static 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)
519static 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)
521static 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)
523static 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)
525static jit_word_t _baddr(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t,
526 jit_bool_t);
527# define baddi(i0,r0,i1,cc) _baddi(_jit,i0,r0,i1,cc)
528static jit_word_t _baddi(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t,
529 jit_bool_t);
530# define baddr_u(i0,r0,r1,cc) _baddr_u(_jit,i0,r0,r1,cc)
531static jit_word_t _baddr_u(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t,
532 jit_bool_t);
533# define baddi_u(i0,r0,i1,cc) _baddi_u(_jit,i0,r0,i1,cc)
534static jit_word_t _baddi_u(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t,
535 jit_bool_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)
545static jit_word_t _bsubr(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t,
546 jit_bool_t);
547# define bsubi(i0,r0,i1,cc) _bsubi(_jit,i0,r0,i1,cc)
548static jit_word_t _bsubi(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t,
549 jit_bool_t);
550# define bsubr_u(i0,r0,r1,cc) _bsubr_u(_jit,i0,r0,r1,cc)
551static jit_word_t _bsubr_u(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t,
552 jit_bool_t);
553# define bsubi_u(i0,r0,i1,cc) _bsubi_u(_jit,i0,r0,i1,cc)
554static jit_word_t _bsubi_u(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t,
555 jit_bool_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)
565static jit_word_t _bmxr(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t,
566 jit_bool_t);
567# define bmxi(i0,r0,i1,cc) _bmxi(_jit,i0,r0,i1,cc)
568static jit_word_t _bmxi(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t,
569 jit_bool_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)
575static void _ldr_c(jit_state_t*,jit_int32_t,jit_int32_t);
576# define ldi_c(r0,i0) _ldi_c(_jit,r0,i0)
577static 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)
580static void _ldi_uc(jit_state_t*,jit_int32_t,jit_word_t);
581# define ldr_s(r0,r1) _ldr_s(_jit,r0,r1)
582static void _ldr_s(jit_state_t*,jit_int32_t,jit_int32_t);
583# define ldi_s(r0,i0) _ldi_s(_jit,r0,i0)
584static 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)
587static 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)
590static void _ldi_i(jit_state_t*,jit_int32_t,jit_word_t);
591# define ldr_ui(r0,r1) _ldr_ui(_jit,r0,r1)
592static void _ldr_ui(jit_state_t*,jit_int32_t,jit_int32_t);
593# define ldi_ui(r0,i0) _ldi_ui(_jit,r0,i0)
594static void _ldi_ui(jit_state_t*,jit_int32_t,jit_word_t);
4a71579b
PC
595# define ldr_l(r0,r1) LDQ(r0,r1,0)
596# define ldi_l(r0,i0) _ldi_l(_jit,r0,i0)
597static 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)
599static 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)
601static 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)
603static 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)
605static 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)
607static 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)
609static 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)
611static 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)
613static 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)
615static 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)
617static 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)
619static 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)
621static void _ldxi_ui(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
4a71579b
PC
622# define ldxr_l(r0,r1,r2) _ldxr_l(_jit,r0,r1,r2)
623static void _ldxr_l(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
4a71579b
PC
624# define ldxi_l(r0,r1,i0) _ldxi_l(_jit,r0,r1,i0)
625static void _ldxi_l(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
ba86ff93
PC
626# define unldr(r0, r1, i0) _unldr(_jit, r0, r1, i0)
627static 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)
629static 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)
631static 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)
633static void _unldi_u(jit_state_t*, jit_int32_t, jit_word_t, jit_word_t);
4a71579b
PC
634# define str_c(r0,r1) STB(r1,r0,0)
635# define sti_c(i0,r0) _sti_c(_jit,i0,r0)
636static 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)
639static 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)
642static void _sti_i(jit_state_t*,jit_word_t,jit_int32_t);
4a71579b
PC
643# define str_l(r0,r1) STQ(r1,r0,0)
644# define sti_l(i0,r0) _sti_l(_jit,i0,r0)
645static 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)
647static 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)
649static 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)
651static 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)
653static 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)
655static 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)
657static 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)
659static 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)
662static void _stxi_l(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
ba86ff93
PC
663# define unstr(r0, r1, i0) _unstr(_jit, r0, r1, i0)
664static 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)
666static 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)
668static 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)
670static 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)
672static 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)
4a71579b
PC
677# define extr_i(r0,r1) _extr_i(_jit,r0,r1)
678static void _extr_i(jit_state_t*,jit_int32_t,jit_int32_t);
ba86ff93 679# define extr_ui(r0,r1) EXTLLi(r1, 0, r0)
40a44dcb
PC
680# define bswapr_us(r0,r1) _bswapr_us(_jit,r0,r1)
681static void _bswapr_us(jit_state_t*,jit_int32_t,jit_int32_t);
682# define bswapr_ui(r0,r1) _bswapr_ui(_jit,r0,r1)
683static void _bswapr_ui(jit_state_t*,jit_int32_t,jit_int32_t);
684# define bswapr_ul(r0,r1) _bswapr_ul(_jit,r0,r1)
685static void _bswapr_ul(jit_state_t*,jit_int32_t,jit_int32_t);
4a71579b
PC
686# define jmpr(r0) JMP(_R31_REGNO,r0,0)
687# define jmpi(i0) _jmpi(_jit,i0)
79bfeef6 688static jit_word_t _jmpi(jit_state_t*, jit_word_t);
4a71579b
PC
689# define jmpi_p(i0) _jmpi_p(_jit,i0)
690static jit_word_t _jmpi_p(jit_state_t*, jit_word_t);
691#define callr(r0) _callr(_jit,r0)
692static void _callr(jit_state_t*, jit_int32_t);
693# define calli(i0) _calli(_jit,i0)
694static void _calli(jit_state_t*, jit_word_t);
695# define calli_p(i0) _calli_p(_jit,i0)
696static jit_word_t _calli_p(jit_state_t*, jit_word_t);
697# define prolog(node) _prolog(_jit,node)
698static void _prolog(jit_state_t*,jit_node_t*);
699# define epilog(node) _epilog(_jit,node)
700static void _epilog(jit_state_t*,jit_node_t*);
701# define vastart(r0) _vastart(_jit, r0)
702static void _vastart(jit_state_t*, jit_int32_t);
703# define vaarg(r0, r1) _vaarg(_jit, r0, r1)
704static void _vaarg(jit_state_t*, jit_int32_t, jit_int32_t);
705# define patch_at(jump,label) _patch_at(_jit,jump,label)
706static void _patch_at(jit_state_t*,jit_word_t,jit_word_t);
707#endif
708
709#if CODE
710static void
711_Pcd(jit_state_t *_jit, int o, unsigned int n)
712{
713 assert(_u6_p(o));
714 assert(_u26_p(n));
715 ii((o<<26)|_u26(n));
716}
717
718static void
719_Bra(jit_state_t *_jit, int o, int ra, int d)
720{
721 assert(_u6_p(o));
722 assert(_u5_p(ra));
723 assert(_s21_p(d));
724 ii((o<<26)|(ra<<21)|_u21(d));
725}
726
727static void
728_Mem(jit_state_t *_jit, int o, int ra, int rb, unsigned int d)
729{
730 assert(_u6_p(o));
731 assert(_u5_p(ra));
732 assert(_u5_p(rb));
733 assert(_u16_p(d));
734 ii((o<<26)|(ra<<21)|(rb<<16)|_u16(d));
735}
736
737static void
738_Mbr(jit_state_t *_jit, int o, int ra, int rb, int h, int d)
739{
740 assert(_u6_p(o));
741 assert(_u5_p(ra));
742 assert(_u5_p(rb));
743 assert(_u2_p(h));
744 assert(_s14_p(d));
745 ii((o<<26)|(ra<<21)|(rb<<16)|(h<<14)|_u14(d));
746}
747
748static void
749_Opr(jit_state_t *_jit, int o, int ra, int rb, unsigned int f, int rc)
750{
751 assert(_u6_p(o));
752 assert(_u5_p(ra));
753 assert(_u5_p(rb));
754 assert(_u5_p(rc));
755 assert(_u11_p(f));
756 ii((o<<26)|(ra<<21)|(rb<<16)|(_u11(f)<<5)|rc);
757}
758
759static void
760_Opi(jit_state_t *_jit, int o, int ra, unsigned int i, unsigned int f, int rc)
761{
762 assert(_u6_p(o));
763 assert(_u5_p(ra));
764 assert(_u8_p(i));
765 assert(_u5_p(rc));
766 assert(_u7_p(f));
767 ii((o<<26)|(ra<<21)|(_u8(i)<<13)|(1<<12)|(_u7(f)<<5)|rc);
768}
769
770static void
771_nop(jit_state_t *_jit, jit_int32_t i0)
772{
773 for (; i0 > 0; i0 -= 4)
774 NOP();
775 assert(i0 == 0);
776}
777
778static void
779_movr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
780{
781 if (r0 != r1)
782 MOV(r1, r0);
783}
784
785static void
786_movi(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
787{
788 jit_int32_t reg;
789 jit_int16_t s0, s1, s2, s3;
790 s0 = i0;
791 s1 = i0 >> 16;
792 s2 = i0 >> 32;
793 s3 = i0 >> 48;
794 if (s0 < 0)
795 ++s1;
796 if (s2 < 0)
797 ++s3;
798 if (_u8_p(i0))
799 MOVi(_u8(i0), r0);
800 else if (_s16_p(i0))
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));
805 }
806 else if (_u32_p(i0)) {
807 LDA(r0, _R31_REGNO, _u16(s0));
808 if (s1)
809 LDAH(r0, r0, _u16(s1));
810 lshi(r0, r0, 32);
811 rshi_u(r0, r0, 32);
812 }
813 else if (_u32(i0) == 0) {
814 LDA(r0, _R31_REGNO, _u16(s2));
815 if (s3)
816 LDAH(r0, r0, _u16(s3));
817 lshi(r0, r0, 32);
818 }
819 else {
820 reg = jit_get_reg(jit_class_gpr);
821 LDA(r0, _R31_REGNO, _u16(s0));
822 LDA(rn(reg), _R31_REGNO, _u16(s2));
823 if (s1)
824 LDAH(r0, r0, _u16(s1));
825 if (s3)
826 LDAH(rn(reg), rn(reg), _u16(s3));
827 lshi(r0, r0, 32);
828 rshi_u(r0, r0, 32);
829 lshi(rn(reg), rn(reg), 32);
830 orr(r0, r0, rn(reg));
831 jit_unget_reg(reg);
832 }
833}
834
835static jit_word_t
836_movi_p(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
837{
838 jit_word_t w;
839 jit_int32_t reg;
840 jit_int16_t s0, s1, s2, s3;
841 w = _jit->pc.w;
842 reg = jit_get_reg(jit_class_gpr);
843 s0 = i0;
844 s1 = i0 >> 16;
845 s2 = i0 >> 32;
846 s3 = i0 >> 48;
847 if (s0 < 0)
848 ++s1;
849 if (s2 < 0)
850 ++s3;
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));
855 lshi(r0, r0, 32);
856 rshi_u(r0, r0, 32);
857 lshi(rn(reg), rn(reg), 32);
858 orr(r0, r0, rn(reg));
859 jit_unget_reg(reg);
860 return (w);
861}
862
ba3814c1
PC
863static void
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)
866{
c0c16242
PC
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);
871 r1 = rn(r1_reg);
872 movi(r1, i0);
873 }
874 again = _jit->pc.w; /* AGAIN */
875 LDQ_L(r0, r1, 0); /* Load r0 locked */
79bfeef6 876 jump0 = bner(_jit->pc.w, r0, r2); /* bne FAIL r0 r2 */
c0c16242
PC
877 movr(r0, r3); /* Move to r0 to attempt to store */
878 STQ_C(r0, r1, 0); /* r0 is an in/out argument */
879 jump1 = _jit->pc.w;
880 BEQ(r0, 0); /* beqi AGAIN r0 0 */
881 patch_at(jump1, again);
882 jump1 = _jit->pc.w;
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);
887 if (iscasi)
888 jit_unget_reg(r1_reg);
ba3814c1
PC
889}
890
79bfeef6
PC
891static void
892_clor(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
893{
894 comr(r0, r1);
895 clzr(r0, r0);
896}
897
898static void
899_ctor(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
900{
901 comr(r0, r1);
902 ctzr(r0, r0);
903}
904
4a71579b
PC
905static void
906_addi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
907{
908 jit_int32_t reg;
909 if (_u8_p(i0))
910 ADDQi(r1, i0, r0);
911 else if (_s16_p(i0))
912 LDA(r0, r1, _u16(i0));
913 else {
914 reg = jit_get_reg(jit_class_gpr);
915 movi(rn(reg), i0);
916 addr(r0, r1, rn(reg));
917 jit_unget_reg(reg);
918 }
919}
920
921static void
922_addcr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
923{
924 jit_int32_t reg;
925 if (jit_carry == _NOREG)
926 jit_carry = jit_get_reg(jit_class_gpr);
927 if (r0 == r1) {
928 reg = jit_get_reg(jit_class_gpr);
929 addr(rn(reg), r1, r2);
930 ltr_u(rn(jit_carry), rn(reg), r1);
931 movr(r0, rn(reg));
932 jit_unget_reg(reg);
933 }
934 else {
935 addr(r0, r1, r2);
936 ltr_u(rn(jit_carry), r0, r1);
937 }
938}
939
940static void
941_addci(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
942{
943 jit_int32_t reg;
944 if (jit_carry == _NOREG)
945 jit_carry = jit_get_reg(jit_class_gpr);
946 if (r0 == r1) {
947 reg = jit_get_reg(jit_class_gpr);
948 addi(rn(reg), r1, i0);
949 ltr_u(rn(jit_carry), rn(reg), r1);
950 movr(r0, rn(reg));
951 jit_unget_reg(reg);
952 }
953 else {
954 addi(r0, r1, i0);
955 ltr_u(rn(jit_carry), r0, r1);
956 }
957}
958
959static void
960_addxr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
961{
962 jit_int32_t reg;
963 assert(jit_carry != _NOREG);
964 reg = jit_get_reg(jit_class_gpr);
965 movr(rn(reg), rn(jit_carry));
966 addcr(r0, r1, r2);
967 addcr(r0, r0, rn(reg));
968 jit_unget_reg(reg);
969}
970
971static void
972_addxi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
973{
974 jit_int32_t reg;
975 assert(jit_carry != _NOREG);
976 reg = jit_get_reg(jit_class_gpr);
977 movr(rn(reg), rn(jit_carry));
978 addci(r0, r1, i0);
979 addcr(r0, r0, rn(reg));
980 jit_unget_reg(reg);
981}
982
983static void
984_subi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
985{
986 jit_int32_t reg;
987 if (_u8_p(i0))
988 SUBQi(r1, i0, r0);
989 else if (_s16_p(-i0))
990 LDA(r0, r1, _u16(-i0));
991 else {
992 reg = jit_get_reg(jit_class_gpr);
993 movi(rn(reg), i0);
994 subr(r0, r1, rn(reg));
995 jit_unget_reg(reg);
996 }
997}
998
999static void
1000_subcr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1001{
1002 jit_int32_t reg;
1003 if (jit_carry == _NOREG)
1004 jit_carry = jit_get_reg(jit_class_gpr);
1005 if (r0 == r1) {
1006 reg = jit_get_reg(jit_class_gpr);
1007 subr(rn(reg), r1, r2);
1008 ltr_u(rn(jit_carry), r1, rn(reg));
1009 movr(r0, rn(reg));
1010 jit_unget_reg(reg);
1011 }
1012 else {
1013 subr(r0, r1, r2);
1014 ltr_u(rn(jit_carry), r1, r0);
1015 }
1016}
1017
1018static void
1019_subci(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1020{
1021 jit_int32_t reg;
1022 if (jit_carry == _NOREG)
1023 jit_carry = jit_get_reg(jit_class_gpr);
1024 if (r0 == r1) {
1025 reg = jit_get_reg(jit_class_gpr);
1026 addi(rn(reg), r1, -i0);
1027 ltr_u(rn(jit_carry), r1, rn(reg));
1028 movr(r0, rn(reg));
1029 jit_unget_reg(reg);
1030 }
1031 else {
1032 addi(r0, r1, -i0);
1033 ltr_u(rn(jit_carry), r1, r0);
1034 }
1035}
1036
1037static void
1038_subxr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1039{
1040 jit_int32_t reg;
1041 assert(jit_carry != _NOREG);
1042 reg = jit_get_reg(jit_class_gpr);
1043 movr(rn(reg), rn(jit_carry));
1044 subcr(r0, r1, r2);
1045 subcr(r0, r0, rn(reg));
1046 jit_unget_reg(reg);
1047}
1048
1049static void
1050_subxi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1051{
1052 jit_int32_t reg;
1053 assert(jit_carry != _NOREG);
1054 reg = jit_get_reg(jit_class_gpr);
1055 movr(rn(reg), rn(jit_carry));
1056 subci(r0, r1, i0);
1057 subcr(r0, r0, rn(reg));
1058 jit_unget_reg(reg);
1059}
1060
1061static void
1062_rsbi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1063{
1064 subi(r0, r1, i0);
1065 negr(r0, r0);
1066}
1067
1068static void
1069_muli(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1070{
1071 jit_int32_t reg;
1072 if (_u8_p(i0))
1073 MULQi(r1, i0, r0);
1074 else {
1075 reg = jit_get_reg(jit_class_gpr);
1076 movi(rn(reg), i0);
1077 mulr(r0, r1, rn(reg));
1078 jit_unget_reg(reg);
1079 }
1080}
1081
1082static void
1083_qmulr(jit_state_t *_jit, jit_int32_t r0,
1084 jit_int32_t r1, jit_int32_t r2, jit_int32_t r3)
1085{
1086 jit_int32_t reg;
1087 /* The only invalid condition is r0 == r1 */
1088 jit_int32_t t2, t3, s2, s3;
ba86ff93 1089 if ((r0 != JIT_NOREG && r2 == r0) || r2 == r1) {
4a71579b
PC
1090 s2 = jit_get_reg(jit_class_gpr);
1091 t2 = rn(s2);
1092 movr(t2, r2);
1093 }
1094 else
1095 t2 = r2;
ba86ff93 1096 if ((r0 != JIT_NOREG && r3 == r0) || r3 == r1) {
4a71579b
PC
1097 s3 = jit_get_reg(jit_class_gpr);
1098 t3 = rn(s3);
1099 movr(t3, r3);
1100 }
1101 else
1102 t3 = r3;
1103 qmulr_u(r0, r1, r2, r3);
1104 reg = jit_get_reg(jit_class_gpr);
1105 /**/
1106 rshi(rn(reg), t2, 63);
1107 mulr(rn(reg), rn(reg), t3);
1108 addr(r1, r1, rn(reg));
1109 /**/
1110 rshi(rn(reg), t3, 63);
1111 mulr(rn(reg), rn(reg), t2);
1112 addr(r1, r1, rn(reg));
1113 jit_unget_reg(reg);
1114 if (t2 != r2)
1115 jit_unget_reg(s2);
1116 if (t3 != r3)
1117 jit_unget_reg(s3);
1118}
1119
1120static void
1121_qmuli(jit_state_t *_jit, jit_int32_t r0,
1122 jit_int32_t r1, jit_int32_t r2, jit_word_t i0)
1123{
1124 jit_int32_t reg;
1125 reg = jit_get_reg(jit_class_gpr);
1126 movi(rn(reg), i0);
1127 qmulr(r0, r1, r2, rn(reg));
1128 jit_unget_reg(reg);
1129}
1130
1131static void
1132_qmulr_u(jit_state_t *_jit, jit_int32_t r0,
1133 jit_int32_t r1, jit_int32_t r2, jit_int32_t r3)
1134{
1135 jit_int32_t reg;
ba86ff93
PC
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);
1140 }
1141 else
1142 mulr(r0, r2, r3);
4a71579b 1143 }
4a71579b 1144 UMULH(r2, r3, r1);
ba86ff93
PC
1145 if (r0 != JIT_NOREG) {
1146 if (r0 == r2 || r0 == r3) {
1147 movr(r0, rn(reg));
1148 jit_unget_reg(reg);
1149 }
4a71579b
PC
1150 }
1151}
1152
1153static void
1154_qmuli_u(jit_state_t *_jit, jit_int32_t r0,
1155 jit_int32_t r1, jit_int32_t r2, jit_word_t i0)
1156{
1157 jit_int32_t reg;
1158 if (_u8_p(i0)) {
ba86ff93
PC
1159 if (r0 != JIT_NOREG) {
1160 if (r0 == r2) {
1161 reg = jit_get_reg(jit_class_gpr);
1162 muli(rn(reg), r2, i0);
1163 }
1164 else
1165 muli(r0, r2, i0);
4a71579b 1166 }
4a71579b 1167 UMULHi(r2, i0, r1);
ba86ff93
PC
1168 if (r0 != JIT_NOREG) {
1169 if (r0 == r2) {
1170 movr(r0, rn(reg));
1171 jit_unget_reg(reg);
1172 }
4a71579b
PC
1173 }
1174 }
1175 else {
1176 reg = jit_get_reg(jit_class_gpr);
1177 movi(rn(reg), i0);
1178 qmulr_u(r0, r1, r2, rn(reg));
1179 jit_unget_reg(reg);
1180 }
1181}
1182
1183static jit_word_t
1184__idiv(jit_word_t u, jit_word_t v)
1185{
1186 return (u / v);
1187}
1188
1189static void
1190_divr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1191{
1192 movr(_A0_REGNO, r1);
1193 movr(_A1_REGNO, r2);
1194 calli((jit_word_t)__idiv);
1195 movr(r0, _V0_REGNO);
1196}
1197
1198static void
1199_divi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1200{
1201 movr(_A0_REGNO, r1);
1202 movi(_A1_REGNO, i0);
1203 calli((jit_word_t)__idiv);
1204 movr(r0, _V0_REGNO);
1205}
1206
1207static jit_uword_t
1208__udiv(jit_uword_t u, jit_uword_t v)
1209{
1210 return (u / v);
1211}
1212
1213static void
1214_divr_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1215{
1216 movr(_A0_REGNO, r1);
1217 movr(_A1_REGNO, r2);
1218 calli((jit_word_t)__udiv);
1219 movr(r0, _V0_REGNO);
1220}
1221
1222static void
1223_divi_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1224{
1225 movr(_A0_REGNO, r1);
1226 movi(_A1_REGNO, i0);
1227 calli((jit_word_t)__udiv);
1228 movr(r0, _V0_REGNO);
1229}
1230
1231static jit_word_t
1232__irem(jit_word_t u, jit_word_t v)
1233{
1234 return (u % v);
1235}
1236
1237static void
1238_remr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1239{
1240 movr(_A0_REGNO, r1);
1241 movr(_A1_REGNO, r2);
1242 calli((jit_word_t)__irem);
1243 movr(r0, _V0_REGNO);
1244}
1245
1246static void
1247_remi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1248{
1249 movr(_A0_REGNO, r1);
1250 movi(_A1_REGNO, i0);
1251 calli((jit_word_t)__irem);
1252 movr(r0, _V0_REGNO);
1253}
1254
1255static jit_uword_t
1256__urem(jit_uword_t u, jit_uword_t v)
1257{
1258 return (u % v);
1259}
1260
1261static void
1262_remr_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1263{
1264 movr(_A0_REGNO, r1);
1265 movr(_A1_REGNO, r2);
1266 calli((jit_word_t)__urem);
1267 movr(r0, _V0_REGNO);
1268}
1269
1270static void
1271_remi_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1272{
1273 movr(_A0_REGNO, r1);
1274 movi(_A1_REGNO, i0);
1275 calli((jit_word_t)__urem);
1276 movr(r0, _V0_REGNO);
1277}
1278
1279static jit_word_t
1280__idivrem(jit_word_t u, jit_word_t v, jit_word_t *rem)
1281{
1282 *rem = u % v;
1283 return (u / v);
1284}
1285
1286static void
1287_qdivr(jit_state_t *_jit,
1288 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_int32_t r3)
1289{
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);
1296}
1297
1298static void
1299_qdivi(jit_state_t *_jit,
1300 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_word_t i0)
1301{
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);
1308}
1309
1310static jit_word_t
1311__udivrem(jit_uword_t u, jit_uword_t v, jit_uword_t *rem)
1312{
1313 *rem = u % v;
1314 return (u / v);
1315}
1316
1317static void
1318_qdivr_u(jit_state_t *_jit,
1319 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_int32_t r3)
1320{
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);
1327}
1328
1329static void
1330_qdivi_u(jit_state_t *_jit,
1331 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_word_t i0)
1332{
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);
1339}
1340
1341static void
1342_lshi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1343{
1344 assert(i0 >= 0 && i0 < 64);
1345 SLLi(r1, i0, r0);
1346}
1347
1348static void
1349_rshi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1350{
1351 assert(i0 >= 0 && i0 < 64);
1352 SRAi(r1, i0, r0);
1353}
1354
1355static void
1356_rshi_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1357{
1358 assert(i0 >= 0 && i0 < 64);
1359 SRLi(r1, i0, r0);
1360}
1361
ba86ff93
PC
1362static void
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)
1365{
1366 jit_bool_t branch;
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);
1370 t0 = rn(s0);
1371 if (r0 == r2 || r1 == r2) {
1372 s2 = jit_get_reg(jit_class_gpr);
1373 t2 = rn(s2);
1374 movr(t2, r2);
1375 }
1376 else
1377 t2 = r2;
1378 if (r0 == r3 || r1 == r3) {
1379 s3 = jit_get_reg(jit_class_gpr);
1380 t3 = rn(s3);
1381 movr(t3, r3);
1382 }
1383 else
1384 t3 = r3;
1385 if ((s1 = jit_get_reg(jit_class_gpr|jit_class_nospill|jit_class_chk))) {
1386 t1 = rn(s1);
1387 branch = 0;
1388 }
1389 else
1390 branch = 1;
1391 rsbi(t0, t3, __WORDSIZE);
1392 lshr(r0, t2, t3);
1393 if (sign)
1394 rshr(r1, t2, t0);
1395 else
1396 rshr_u(r1, t2, t0);
1397 if (branch) {
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);
1402 /* overflow */
1403 movi(r0, 0);
1404 done_over = jmpi(_jit->pc.w);
1405 /* zero */
1406 patch_at(zero, _jit->pc.w);
1407 if (sign)
1408 rshi(r1, t2, __WORDSIZE - 1);
1409 else
1410 movi(r1, 0);
1411 patch_at(done, _jit->pc.w);
1412 patch_at(done_over, _jit->pc.w);
1413 }
1414 else {
1415 if (sign)
1416 rshi(t0, t2, __WORDSIZE - 1);
1417 else
1418 movi(t0, 0);
1419 /* zero? */
1420 movzr(r1, t0, t3);
1421 /* Branchless but 4 bytes longer than branching fallback */
1422 if (sign)
1423 movi(t0, 0);
1424 /* overflow? */
1425 eqi(t1, t3, __WORDSIZE);
1426 movnr(r0, t0, t1);
1427 jit_unget_reg(s1);
1428 }
1429 jit_unget_reg(s0);
1430 if (t2 != r2)
1431 jit_unget_reg(s2);
1432 if (t3 != r3)
1433 jit_unget_reg(s3);
1434}
1435
1436static void
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)
1439{
1440 if (i0 == 0) {
1441 movr(r0, r2);
1442 if (sign)
1443 rshi(r1, r2, __WORDSIZE - 1);
1444 else
1445 movi(r1, 0);
1446 }
1447 else if (i0 == __WORDSIZE) {
1448 movr(r1, r2);
1449 movi(r0, 0);
1450 }
1451 else {
1452 assert((jit_uword_t)i0 <= __WORDSIZE);
1453 if (sign)
1454 rshi(r1, r2, __WORDSIZE - i0);
1455 else
1456 rshi_u(r1, r2, __WORDSIZE - i0);
1457 lshi(r0, r2, i0);
1458 }
1459}
1460
1461static void
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)
1464{
1465 jit_bool_t branch;
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);
1469 t0 = rn(s0);
1470 if (r0 == r2 || r1 == r2) {
1471 s2 = jit_get_reg(jit_class_gpr);
1472 t2 = rn(s2);
1473 movr(t2, r2);
1474 }
1475 else
1476 t2 = r2;
1477 if (r0 == r3 || r1 == r3) {
1478 s3 = jit_get_reg(jit_class_gpr);
1479 t3 = rn(s3);
1480 movr(t3, r3);
1481 }
1482 else
1483 t3 = r3;
1484 if ((s1 = jit_get_reg(jit_class_gpr|jit_class_nospill|jit_class_chk))) {
1485 t1 = rn(s1);
1486 branch = 0;
1487 }
1488 else
1489 branch = 1;
1490 rsbi(t0, t3, __WORDSIZE);
1491 if (sign)
1492 rshr(r0, t2, t3);
1493 else
1494 rshr_u(r0, t2, t3);
1495 lshr(r1, t2, t0);
1496 if (branch) {
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);
1501 /* underflow */
1502 if (sign)
1503 rshi(r0, t2, __WORDSIZE - 1);
1504 else
1505 movi(r0, 0);
1506 done_over = jmpi(_jit->pc.w);
1507 /* zero */
1508 patch_at(zero, _jit->pc.w);
d481fb64 1509 movi(r1, 0);
ba86ff93
PC
1510 patch_at(done, _jit->pc.w);
1511 patch_at(done_over, _jit->pc.w);
1512 jit_unget_reg(s1);
1513 }
1514 else {
1515 /* zero? */
d481fb64 1516 movi(t0, 0);
ba86ff93
PC
1517 movzr(r1, t0, t3);
1518 /* underflow? */
1519 eqi(t1, t3, __WORDSIZE);
d481fb64
PC
1520 if (sign)
1521 rshi(t0, t2, __WORDSIZE - 1);
ba86ff93
PC
1522 movnr(r0, t0, t1);
1523 jit_unget_reg(s1);
1524 }
1525 jit_unget_reg(s0);
1526 if (t2 != r2)
1527 jit_unget_reg(s2);
1528 if (t3 != r3)
1529 jit_unget_reg(s3);
1530}
1531
1532static void
1533_xrshi(jit_state_t *_jit, jit_bool_t sign,
1534 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_word_t i0)
1535{
1536 if (i0 == 0) {
1537 movr(r0, r2);
d481fb64 1538 movi(r1, 0);
ba86ff93
PC
1539 }
1540 else if (i0 == __WORDSIZE) {
1541 movr(r1, r2);
1542 if (sign)
1543 rshi(r0, r2, __WORDSIZE - 1);
1544 else
1545 movi(r0, 0);
1546 }
1547 else {
1548 assert((jit_uword_t)i0 <= __WORDSIZE);
1549 lshi(r1, r2, __WORDSIZE - i0);
1550 if (sign)
1551 rshi(r0, r2, i0);
1552 else
1553 rshi_u(r0, r2, i0);
1554 }
1555}
1556
4a71579b
PC
1557static void
1558_andi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1559{
ba86ff93
PC
1560 union {
1561 jit_uword_t uw;
1562 jit_uint8_t uc[8];
1563 } u;
1564 jit_int32_t reg, zapnot;
4a71579b
PC
1565 if (_u8_p(i0))
1566 ANDi(r1, i0, r0);
1567 else {
ba86ff93
PC
1568 u.uw = i0;
1569 for (reg = zapnot = 0; reg < 8; ++reg) {
1570# if __BYTE_ORDER == __LITTLE_ENDIAN
1571# define OFFS(i) (i)
1572# else
1573# define OFFS(i) (7 - (i))
1574# endif
1575 if (u.uc[OFFS(reg)] == 0xff)
1576 zapnot |= 1 << reg;
1577 else if (u.uc[OFFS(reg)] != 0)
1578 break;
1579# undef OFFS
1580 }
1581 if (reg == 8)
1582 ZAPNOTi(r1, zapnot, r0);
1583 else {
1584 reg = jit_get_reg(jit_class_gpr);
1585 movi(rn(reg), i0);
1586 andr(r0, r1, rn(reg));
1587 jit_unget_reg(reg);
1588 }
4a71579b
PC
1589 }
1590}
1591
1592static void
1593_ori(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1594{
1595 jit_int32_t reg;
1596 if (_u8_p(i0))
1597 ORi(r1, i0, r0);
1598 else {
1599 reg = jit_get_reg(jit_class_gpr);
1600 movi(rn(reg), i0);
1601 orr(r0, r1, rn(reg));
1602 jit_unget_reg(reg);
1603 }
1604}
1605
1606static void
1607_xori(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1608{
1609 jit_int32_t reg;
1610 if (_u8_p(i0))
1611 XORi(r1, i0, r0);
1612 else {
1613 reg = jit_get_reg(jit_class_gpr);
1614 movi(rn(reg), i0);
1615 xorr(r0, r1, rn(reg));
1616 jit_unget_reg(reg);
1617 }
1618}
1619
1620static void
1621_lti(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1622{
1623 jit_int32_t reg;
1624 if (_u8_p(i0))
1625 CMPLTi(r1, i0, r0);
1626 else {
1627 reg = jit_get_reg(jit_class_gpr);
1628 movi(rn(reg), i0);
1629 ltr(r0, r1, rn(reg));
1630 jit_unget_reg(reg);
1631 }
1632}
1633
1634static void
1635_lti_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1636{
1637 jit_int32_t reg;
1638 if (_u8_p(i0))
1639 CMPULTi(r1, i0, r0);
1640 else {
1641 reg = jit_get_reg(jit_class_gpr);
1642 movi(rn(reg), i0);
1643 ltr_u(r0, r1, rn(reg));
1644 jit_unget_reg(reg);
1645 }
1646}
1647
1648static void
1649_lei(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1650{
1651 jit_int32_t reg;
1652 if (_u8_p(i0))
1653 CMPLEi(r1, i0, r0);
1654 else {
1655 reg = jit_get_reg(jit_class_gpr);
1656 movi(rn(reg), i0);
1657 ler(r0, r1, rn(reg));
1658 jit_unget_reg(reg);
1659 }
1660}
1661
1662static void
1663_lei_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1664{
1665 jit_int32_t reg;
1666 jit_word_t ni0;
1667 ni0 = -i0;
1668 if (_u8_p(i0))
1669 CMPULEi(r1, i0, r0);
1670 else {
1671 reg = jit_get_reg(jit_class_gpr);
1672 movi(rn(reg), i0);
1673 ler_u(r0, r1, rn(reg));
1674 jit_unget_reg(reg);
1675 }
1676}
1677
1678static void
1679_eqi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1680{
1681 jit_int32_t reg;
1682 if (_u8_p(i0))
1683 CMPEQi(r1, i0, r0);
1684 else {
1685 reg = jit_get_reg(jit_class_gpr);
1686 movi(rn(reg), i0);
1687 eqr(r0, r1, rn(reg));
1688 jit_unget_reg(reg);
1689 }
1690}
1691
1692static void
1693_gei(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1694{
1695 jit_int32_t reg;
1696 reg = jit_get_reg(jit_class_gpr);
1697 movi(rn(reg), i0);
1698 ger(r0, r1, rn(reg));
1699 jit_unget_reg(reg);
1700}
1701
1702static void
1703_gei_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1704{
1705 jit_int32_t reg;
1706 reg = jit_get_reg(jit_class_gpr);
1707 movi(rn(reg), i0);
1708 ger_u(r0, r1, rn(reg));
1709 jit_unget_reg(reg);
1710}
1711
1712static void
1713_gti(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1714{
1715 jit_int32_t reg;
1716 reg = jit_get_reg(jit_class_gpr);
1717 movi(rn(reg), i0);
1718 gtr(r0, r1, rn(reg));
1719 jit_unget_reg(reg);
1720}
1721
1722static void
1723_gti_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1724{
1725 jit_int32_t reg;
1726 reg = jit_get_reg(jit_class_gpr);
1727 movi(rn(reg), i0);
1728 gtr_u(r0, r1, rn(reg));
1729 jit_unget_reg(reg);
1730}
1731
1732static void
1733_ner(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1734{
1735 CMPEQ(r1, r2, r0);
1736 CMPEQi(r0, 0, r0);
1737}
1738
1739static void
1740_nei(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1741{
1742 jit_int32_t reg;
1743 if (_u8_p(i0)) {
1744 CMPEQi(r1, i0, r0);
1745 CMPEQi(r0, 0, r0);
1746 }
1747 else {
1748 reg = jit_get_reg(jit_class_gpr);
1749 movi(rn(reg), i0);
1750 ner(r0, r1, rn(reg));
1751 jit_unget_reg(reg);
1752 }
1753}
1754
1755static jit_word_t
1756_bltr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
1757{
1758 jit_word_t w;
1759 jit_int32_t reg;
1760 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1761 ltr(rn(reg), r0, r1);
1762 w = _jit->pc.w;
1763 BNE(rn(reg), ((i0 - w) >> 2) - 1);
1764 jit_unget_reg(reg);
1765 return (w);
1766}
1767
1768static jit_word_t
1769_blti(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
1770{
1771 jit_word_t w;
1772 jit_int32_t reg;
1773 if (i1 == 0) {
1774 w = _jit->pc.w;
1775 BLT(r0, ((i0 - w) >> 2) - 1);
1776 }
1777 else {
1778 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1779 lti(rn(reg), r0, i1);
1780 w = _jit->pc.w;
1781 BNE(rn(reg), ((i0 - w) >> 2) - 1);
1782 jit_unget_reg(reg);
1783 }
1784 return (w);
1785}
1786
1787static jit_word_t
1788_bltr_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
1789{
1790 jit_word_t w;
1791 jit_int32_t reg;
1792 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1793 ltr_u(rn(reg), r0, r1);
1794 w = _jit->pc.w;
1795 BNE(rn(reg), ((i0 - w) >> 2) - 1);
1796 jit_unget_reg(reg);
1797 return (w);
1798}
1799
1800static jit_word_t
1801_blti_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
1802{
1803 jit_word_t w;
1804 jit_int32_t reg;
1805 /* FIXME cannot optimize zero because need to return a patcheable address */
1806 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1807 lti_u(rn(reg), r0, i1);
1808 w = _jit->pc.w;
1809 BNE(rn(reg), ((i0 - w) >> 2) - 1);
1810 jit_unget_reg(reg);
1811 return (w);
1812}
1813
1814static jit_word_t
1815_bler(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
1816{
1817 jit_word_t w;
1818 jit_int32_t reg;
1819 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1820 ler(rn(reg), r0, r1);
1821 w = _jit->pc.w;
1822 BNE(rn(reg), ((i0 - w) >> 2) - 1);
1823 jit_unget_reg(reg);
1824 return (w);
1825}
1826
1827static jit_word_t
1828_blei(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
1829{
1830 jit_word_t w;
1831 jit_int32_t reg;
1832 if (i1 == 0) {
1833 w = _jit->pc.w;
1834 BLE(r0, ((i0 - w) >> 2) - 1);
1835 }
1836 else {
1837 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1838 lei(rn(reg), r0, i1);
1839 w = _jit->pc.w;
1840 BNE(rn(reg), ((i0 - w) >> 2) - 1);
1841 jit_unget_reg(reg);
1842 }
1843 return (w);
1844}
1845
1846static jit_word_t
1847_bler_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
1848{
1849 jit_word_t w;
1850 jit_int32_t reg;
1851 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1852 ler_u(rn(reg), r0, r1);
1853 w = _jit->pc.w;
1854 BNE(rn(reg), ((i0 - w) >> 2) - 1);
1855 jit_unget_reg(reg);
1856 return (w);
1857}
1858
1859static jit_word_t
1860_blei_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
1861{
1862 jit_word_t w;
1863 jit_int32_t reg;
1864 if (i1 == 0) {
1865 w = _jit->pc.w;
1866 BEQ(r0, ((i0 - w) >> 2) - 1);
1867 }
1868 else {
1869 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1870 lei_u(rn(reg), r0, i1);
1871 w = _jit->pc.w;
1872 BNE(rn(reg), ((i0 - w) >> 2) - 1);
1873 jit_unget_reg(reg);
1874 }
1875 return (w);
1876}
1877
1878static jit_word_t
1879_beqr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
1880{
1881 jit_word_t w;
1882 jit_int32_t reg;
1883 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1884 eqr(rn(reg), r0, r1);
1885 w = _jit->pc.w;
1886 BNE(rn(reg), ((i0 - w) >> 2) - 1);
1887 jit_unget_reg(reg);
1888 return (w);
1889}
1890
1891static jit_word_t
1892_beqi(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
1893{
1894 jit_word_t w;
1895 jit_int32_t reg;
1896 if (i1 == 0) {
1897 w = _jit->pc.w;
1898 BEQ(r0, ((i0 - w) >> 2) - 1);
1899 }
1900 else {
1901 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1902 eqi(rn(reg), r0, i1);
1903 w = _jit->pc.w;
1904 BNE(rn(reg), ((i0 - w) >> 2) - 1);
1905 jit_unget_reg(reg);
1906 }
1907 return (w);
1908}
1909
1910static jit_word_t
1911_bger(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
1912{
1913 jit_word_t w;
1914 jit_int32_t reg;
1915 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1916 ger(rn(reg), r0, r1);
1917 w = _jit->pc.w;
1918 BNE(rn(reg), ((i0 - w) >> 2) - 1);
1919 jit_unget_reg(reg);
1920 return (w);
1921}
1922
1923static jit_word_t
1924_bgei(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
1925{
1926 jit_word_t w;
1927 jit_int32_t reg;
1928 if (i1 == 0) {
1929 w = _jit->pc.w;
1930 BGE(r0, ((i0 - w) >> 2) - 1);
1931 }
1932 else {
1933 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1934 gei(rn(reg), r0, i1);
1935 w = _jit->pc.w;
1936 BNE(rn(reg), ((i0 - w) >> 2) - 1);
1937 jit_unget_reg(reg);
1938 }
1939 return (w);
1940}
1941
1942static jit_word_t
1943_bger_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
1944{
1945 jit_word_t w;
1946 jit_int32_t reg;
1947 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1948 ger_u(rn(reg), r0, r1);
1949 w = _jit->pc.w;
1950 BNE(rn(reg), ((i0 - w) >> 2) - 1);
1951 jit_unget_reg(reg);
1952 return (w);
1953}
1954
1955static jit_word_t
1956_bgei_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
1957{
1958 jit_word_t w;
1959 jit_int32_t reg;
1960 /* always true if i1 == 0 */
1961 if (i0 == 0) {
1962 w = _jit->pc.w;
1963 BR(r0, ((i0 - w) >> 2) - 1);
1964 }
1965 else {
1966 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1967 gei_u(rn(reg), r0, i1);
1968 w = _jit->pc.w;
1969 BNE(rn(reg), ((i0 - w) >> 2) - 1);
1970 jit_unget_reg(reg);
1971 }
1972 return (w);
1973}
1974
1975static jit_word_t
1976_bgtr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
1977{
1978 jit_word_t w;
1979 jit_int32_t reg;
1980 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1981 gtr(rn(reg), r0, r1);
1982 w = _jit->pc.w;
1983 BNE(rn(reg), ((i0 - w) >> 2) - 1);
1984 jit_unget_reg(reg);
1985 return (w);
1986}
1987
1988static jit_word_t
1989_bgti(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
1990{
1991 jit_word_t w;
1992 jit_int32_t reg;
1993 if (i1 == 0) {
1994 w = _jit->pc.w;
1995 BGT(r0, ((i0 - w) >> 2) - 1);
1996 }
1997 else {
1998 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
1999 gti(rn(reg), r0, i1);
2000 w = _jit->pc.w;
2001 BNE(rn(reg), ((i0 - w) >> 2) - 1);
2002 jit_unget_reg(reg);
2003 }
2004 return (w);
2005}
2006
2007static jit_word_t
2008_bgtr_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2009{
2010 jit_word_t w;
2011 jit_int32_t reg;
2012 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2013 gtr_u(rn(reg), r0, r1);
2014 w = _jit->pc.w;
2015 BNE(rn(reg), ((i0 - w) >> 2) - 1);
2016 jit_unget_reg(reg);
2017 return (w);
2018}
2019
2020static jit_word_t
2021_bgti_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
2022{
2023 jit_word_t w;
2024 jit_int32_t reg;
2025 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2026 gti_u(rn(reg), r0, i1);
2027 w = _jit->pc.w;
2028 BNE(rn(reg), ((i0 - w) >> 2) - 1);
2029 jit_unget_reg(reg);
2030 return (w);
2031}
2032
2033static jit_word_t
2034_bner(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2035{
2036 jit_word_t w;
2037 jit_int32_t reg;
2038 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2039 eqr(rn(reg), r0, r1);
2040 w = _jit->pc.w;
2041 BEQ(rn(reg), ((i0 - w) >> 2) - 1);
2042 jit_unget_reg(reg);
2043 return (w);
2044}
2045
2046static jit_word_t
2047_bnei(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
2048{
2049 jit_word_t w;
2050 jit_int32_t reg;
2051 if (i1 == 0) {
2052 w = _jit->pc.w;
2053 BNE(r0, ((i0 - w) >> 2) - 1);
2054 }
2055 else {
2056 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2057 eqi(rn(reg), r0, i1);
2058 w = _jit->pc.w;
2059 BEQ(rn(reg), ((i0 - w) >> 2) - 1);
2060 jit_unget_reg(reg);
2061 }
2062 return (w);
2063}
2064
2065static jit_word_t
2066_baddr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1,
2067 jit_bool_t carry)
2068{
2069 jit_word_t w;
2070 jit_int32_t t0;
2071 jit_int32_t t1;
2072 jit_int32_t t2;
2073 jit_int32_t t3;
2074 /* t0 = r0 + r1; overflow = r1 < 0 ? r0 < t0 : t0 < r0 */
2075 t0 = jit_get_reg(jit_class_gpr);
2076 t1 = jit_get_reg(jit_class_gpr);
2077 t2 = jit_get_reg(jit_class_gpr);
2078 t3 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2079 addr(rn(t0), r0, r1); /* t0 = r0 + r1 */
2080 ltr(rn(t1), r1, _R31_REGNO); /* t1 = r1 < 0 */
2081 ltr(rn(t2), r0, rn(t0)); /* t2 = r0 < t0 */
2082 ltr(rn(t3), rn(t0), r0); /* t3 = t0 < r0 */
2083 movr(r0, rn(t0)); /* r0 += r1 */
2084 CMOVNE(rn(t1), rn(t2), rn(t3)); /* if (t1 == 0) t3 = t2; */
2085 jit_unget_reg(t2);
2086 jit_unget_reg(t1);
2087 jit_unget_reg(t0);
2088 w = _jit->pc.w;
2089 if (carry)
2090 BNE(rn(t3), ((i0 - w) >> 2) - 1);
2091 else
2092 BEQ(rn(t3), ((i0 - w) >> 2) - 1);
2093 jit_unget_reg(t3);
2094 return (w);
2095}
2096
2097static jit_word_t
2098_baddi(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1,
2099 jit_bool_t carry)
2100{
2101 jit_word_t w;
2102 jit_int32_t reg;
2103 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2104 movi(rn(reg), i1);
2105 w = baddr(i0, r0, rn(reg), carry);
2106 jit_unget_reg(reg);
2107 return (w);
2108}
2109
2110static jit_word_t
2111_baddr_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1,
2112 jit_bool_t carry)
2113{
2114 jit_word_t w;
2115 jit_int32_t t0;
2116 jit_int32_t t1;
2117 t0 = jit_get_reg(jit_class_gpr);
2118 t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2119 addr(rn(t0), r0, r1);
2120 ltr_u(rn(t1), rn(t0), r0);
2121 movr(r0, rn(t0));
2122 jit_unget_reg(t0);
2123 w = _jit->pc.w;
2124 if (carry)
2125 BNE(rn(t1), ((i0 - w) >> 2) - 1);
2126 else
2127 BEQ(rn(t1), ((i0 - w) >> 2) - 1);
2128 jit_unget_reg(t1);
2129 return (w);
2130}
2131
2132static jit_word_t
2133_baddi_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1,
2134 jit_bool_t carry)
2135{
2136 jit_word_t w;
2137 jit_int32_t t0;
2138 jit_int32_t t1;
2139 t0 = jit_get_reg(jit_class_gpr);
2140 t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2141 addi(rn(t0), r0, i1);
2142 ltr_u(rn(t1), rn(t0), r0);
2143 movr(r0, rn(t0));
2144 jit_unget_reg(t0);
2145 w = _jit->pc.w;
2146 if (carry)
2147 BNE(rn(t1), ((i0 - w) >> 2) - 1);
2148 else
2149 BEQ(rn(t1), ((i0 - w) >> 2) - 1);
2150 jit_unget_reg(t1);
2151 return (w);
2152}
2153
2154static jit_word_t
2155_bsubr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1,
2156 jit_bool_t carry)
2157{
2158 jit_word_t w;
2159 jit_int32_t t0;
2160 jit_int32_t t1;
2161 jit_int32_t t2;
2162 jit_int32_t t3;
2163 /* t0 = r0 - r1; overflow = 0 < r1 ? r0 < t0 : t0 < r0 */
2164 t0 = jit_get_reg(jit_class_gpr);
2165 t1 = jit_get_reg(jit_class_gpr);
2166 t2 = jit_get_reg(jit_class_gpr);
2167 t3 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2168 subr(rn(t0), r0, r1); /* r0 = r0 - r1 */
2169 ltr(rn(t1), _R31_REGNO, r1); /* t1 = 0 < r1 */
2170 ltr(rn(t2), r0, rn(t0)); /* t2 = r0 < t0 */
2171 ltr(rn(t3), rn(t0), r0); /* t3 = t0 < r0 */
2172 movr(r0, rn(t0)); /* r0 -= r1 */
2173 CMOVNE(rn(t1), rn(t2), rn(t3)); /* if (t1 == 0) t3 = t2; */
2174 jit_unget_reg(t2);
2175 jit_unget_reg(t1);
2176 jit_unget_reg(t0);
2177 w = _jit->pc.w;
2178 if (carry)
2179 BNE(rn(t3), ((i0 - w) >> 2) - 1);
2180 else
2181 BEQ(rn(t3), ((i0 - w) >> 2) - 1);
2182 jit_unget_reg(t3);
2183 return (w);
2184}
2185
2186static jit_word_t
2187_bsubi(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1,
2188 jit_bool_t carry)
2189{
2190 jit_word_t w;
2191 jit_int32_t reg;
2192 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2193 movi(rn(reg), i1);
2194 w = bsubr(i0, r0, rn(reg), carry);
2195 jit_unget_reg(reg);
2196 return (w);
2197}
2198
2199static jit_word_t
2200_bsubr_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1,
2201 jit_bool_t carry)
2202{
2203 jit_word_t w;
2204 jit_int32_t t0;
2205 jit_int32_t t1;
2206 t0 = jit_get_reg(jit_class_gpr);
2207 t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2208 subr(rn(t0), r0, r1);
2209 ltr_u(rn(t1), r0, rn(t0));
2210 movr(r0, rn(t0));
2211 jit_unget_reg(t0);
2212 w = _jit->pc.w;
2213 if (carry)
2214 BNE(rn(t1), ((i0 - w) >> 2) - 1);
2215 else
2216 BEQ(rn(t1), ((i0 - w) >> 2) - 1);
2217 jit_unget_reg(t1);
2218 return (w);
2219}
2220
2221static jit_word_t
2222_bsubi_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1,
2223 jit_bool_t carry)
2224{
2225 jit_word_t w;
2226 jit_int32_t t0;
2227 jit_int32_t t1;
2228 t0 = jit_get_reg(jit_class_gpr);
2229 t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2230 subi(rn(t0), r0, i1);
2231 ltr_u(rn(t1), r0, rn(t0));
2232 movr(r0, rn(t0));
2233 jit_unget_reg(t0);
2234 w = _jit->pc.w;
2235 if (carry)
2236 BNE(rn(t1), ((i0 - w) >> 2) - 1);
2237 else
2238 BEQ(rn(t1), ((i0 - w) >> 2) - 1);
2239 jit_unget_reg(t1);
2240 return (w);
2241}
2242
2243static jit_word_t
2244_bmxr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1,
2245 jit_bool_t set)
2246{
2247 jit_word_t w;
2248 jit_int32_t t0;
2249 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2250 andr(rn(t0), r0, r1);
2251 w = _jit->pc.w;
2252 if (set)
2253 BNE(rn(t0), ((i0 - w) >> 2) - 1);
2254 else
2255 BEQ(rn(t0), ((i0 - w) >> 2) - 1);
2256 jit_unget_reg(t0);
2257 return (w);
2258}
2259
2260static jit_word_t
2261_bmxi(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1,
2262 jit_bool_t set)
2263{
2264 jit_word_t w;
2265 jit_int32_t t0;
2266 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
2267 andi(rn(t0), r0, i1);
2268 w = _jit->pc.w;
2269 if (set)
2270 BNE(rn(t0), ((i0 - w) >> 2) - 1);
2271 else
2272 BEQ(rn(t0), ((i0 - w) >> 2) - 1);
2273 jit_unget_reg(t0);
2274 return (w);
2275}
2276
2277static void
2278_ldr_c(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
2279{
2280 ldr_uc(r0, r1);
2281 extr_c(r0, r0);
2282}
2283
2284static void
2285_ldi_c(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
2286{
2287 jit_int32_t reg;
2288 if (_s16_p(i0)) {
2289 LDBU(r0, _R31_REGNO, _u16(i0));
2290 extr_c(r0, r0);
2291 }
2292 else {
2293 reg = jit_get_reg(jit_class_gpr);
2294 movi(rn(reg), i0);
2295 ldr_c(r0, rn(reg));
2296 jit_unget_reg(reg);
2297 }
2298}
2299
2300static void
2301_ldi_uc(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
2302{
2303 jit_int32_t reg;
2304 if (_s16_p(i0))
2305 LDBU(r0, _R31_REGNO, _u16(i0));
2306 else {
2307 reg = jit_get_reg(jit_class_gpr);
2308 movi(rn(reg), i0);
2309 ldr_uc(r0, rn(reg));
2310 jit_unget_reg(reg);
2311 }
2312}
2313
2314static void
2315_ldr_s(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
2316{
2317 ldr_us(r0, r1);
2318 extr_s(r0, r0);
2319}
2320
2321static void
2322_ldi_s(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
2323{
2324 jit_int32_t reg;
2325 if (_s16_p(i0)) {
2326 LDWU(r0, _R31_REGNO, _u16(i0));
2327 extr_s(r0, r0);
2328 }
2329 else {
2330 reg = jit_get_reg(jit_class_gpr);
2331 movi(rn(reg), i0);
2332 ldr_s(r0, rn(reg));
2333 jit_unget_reg(reg);
2334 }
2335}
2336
2337static void
2338_ldi_us(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
2339{
2340 jit_int32_t reg;
2341 if (_s16_p(i0))
2342 LDWU(r0, _R31_REGNO, _u16(i0));
2343 else {
2344 reg = jit_get_reg(jit_class_gpr);
2345 movi(rn(reg), i0);
2346 ldr_us(r0, rn(reg));
2347 jit_unget_reg(reg);
2348 }
2349}
2350
2351static void
2352_ldi_i(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
2353{
2354 jit_int32_t reg;
2355 if (_s16_p(i0))
2356 LDL(r0, _R31_REGNO, _u16(i0));
2357 else {
2358 reg = jit_get_reg(jit_class_gpr);
2359 movi(rn(reg), i0);
2360 ldr_i(r0, rn(reg));
2361 jit_unget_reg(reg);
2362 }
2363}
2364
2365static void
2366_ldr_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
2367{
2368 ldr_i(r0, r1);
2369 extr_ui(r0, r0);
2370}
2371
2372static void
2373_ldi_ui(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
2374{
2375 jit_int32_t reg;
2376 if (_s16_p(i0)) {
2377 LDL(r0, _R31_REGNO, _u16(i0));
2378 extr_ui(r0, r0);
2379 }
2380 else {
2381 reg = jit_get_reg(jit_class_gpr);
2382 movi(rn(reg), i0);
2383 ldr_ui(r0, rn(reg));
2384 jit_unget_reg(reg);
2385 }
2386}
2387
2388static void
2389_ldi_l(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
2390{
2391 jit_int32_t reg;
2392 if (_s16_p(i0))
2393 LDQ(r0, _R31_REGNO, _u16(i0));
2394 else {
2395 reg = jit_get_reg(jit_class_gpr);
2396 movi(rn(reg), i0);
2397 ldr_l(r0, rn(reg));
2398 jit_unget_reg(reg);
2399 }
2400}
2401
2402static void
2403_ldxr_c(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2404{
2405 jit_int32_t reg;
2406 reg = jit_get_reg(jit_class_gpr);
2407 addr(rn(reg), r1, r2);
2408 ldr_c(r0, rn(reg));
2409 jit_unget_reg(reg);
2410}
2411
2412static void
2413_ldxi_c(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2414{
2415 jit_int32_t reg;
2416 if (_s16_p(i0)) {
2417 LDBU(r0, r1, _u16(i0));
2418 extr_c(r0, r0);
2419 }
2420 else {
2421 reg = jit_get_reg(jit_class_gpr);
2422 addi(rn(reg), r1, i0);
2423 ldr_c(r0, rn(reg));
2424 jit_unget_reg(reg);
2425 }
2426}
2427
2428static void
2429_ldxr_uc(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2430{
2431 jit_int32_t reg;
2432 reg = jit_get_reg(jit_class_gpr);
2433 addr(rn(reg), r1, r2);
2434 ldr_uc(r0, rn(reg));
2435 jit_unget_reg(reg);
2436}
2437
2438static void
2439_ldxi_uc(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2440{
2441 jit_int32_t reg;
2442 if (_s16_p(i0))
2443 LDBU(r0, r1, _u16(i0));
2444 else {
2445 reg = jit_get_reg(jit_class_gpr);
2446 addi(rn(reg), r1, i0);
2447 ldr_uc(r0, rn(reg));
2448 jit_unget_reg(reg);
2449 }
2450}
2451
2452static void
2453_ldxr_s(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2454{
2455 jit_int32_t reg;
2456 reg = jit_get_reg(jit_class_gpr);
2457 addr(rn(reg), r1, r2);
2458 ldr_s(r0, rn(reg));
2459 jit_unget_reg(reg);
2460}
2461
2462static void
2463_ldxi_s(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2464{
2465 jit_int32_t reg;
2466 if (_s16_p(i0)) {
2467 LDWU(r0, r1, _u16(i0));
2468 extr_s(r0, r0);
2469 }
2470 else {
2471 reg = jit_get_reg(jit_class_gpr);
2472 addi(rn(reg), r1, i0);
2473 ldr_s(r0, rn(reg));
2474 jit_unget_reg(reg);
2475 }
2476}
2477
2478static void
2479_ldxr_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2480{
2481 jit_int32_t reg;
2482 reg = jit_get_reg(jit_class_gpr);
2483 addr(rn(reg), r1, r2);
2484 ldr_us(r0, rn(reg));
2485 jit_unget_reg(reg);
2486}
2487
2488static void
2489_ldxi_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2490{
2491 jit_int32_t reg;
2492 if (_s16_p(i0))
2493 LDWU(r0, r1, _u16(i0));
2494 else {
2495 reg = jit_get_reg(jit_class_gpr);
2496 addi(rn(reg), r1, i0);
2497 ldr_us(r0, rn(reg));
2498 jit_unget_reg(reg);
2499 }
2500}
2501
2502static void
2503_ldxr_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2504{
2505 jit_int32_t reg;
2506 reg = jit_get_reg(jit_class_gpr);
2507 addr(rn(reg), r1, r2);
2508 ldr_i(r0, rn(reg));
2509 jit_unget_reg(reg);
2510}
2511
2512static void
2513_ldxi_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2514{
2515 jit_int32_t reg;
2516 if (_s16_p(i0))
2517 LDL(r0, r1, _u16(i0));
2518 else {
2519 reg = jit_get_reg(jit_class_gpr);
2520 addi(rn(reg), r1, i0);
2521 ldr_i(r0, rn(reg));
2522 jit_unget_reg(reg);
2523 }
2524}
2525
2526static void
2527_ldxr_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2528{
2529 jit_int32_t reg;
2530 reg = jit_get_reg(jit_class_gpr);
2531 addr(rn(reg), r1, r2);
2532 ldr_ui(r0, rn(reg));
2533 jit_unget_reg(reg);
2534}
2535
2536static void
2537_ldxi_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2538{
2539 jit_int32_t reg;
2540 if (_s16_p(i0)) {
2541 LDL(r0, r1, _u16(i0));
2542 extr_ui(r0, r0);
2543 }
2544 else {
2545 reg = jit_get_reg(jit_class_gpr);
2546 addi(rn(reg), r1, i0);
2547 ldr_ui(r0, rn(reg));
2548 jit_unget_reg(reg);
2549 }
2550}
2551
2552static void
2553_ldxr_l(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2554{
2555 jit_int32_t reg;
2556 reg = jit_get_reg(jit_class_gpr);
2557 addr(rn(reg), r1, r2);
2558 ldr_l(r0, rn(reg));
2559 jit_unget_reg(reg);
2560}
2561
2562static void
2563_ldxi_l(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2564{
2565 jit_int32_t reg;
2566 if (_s16_p(i0))
2567 LDQ(r0, r1, _u16(i0));
2568 else {
2569 reg = jit_get_reg(jit_class_gpr);
2570 addi(rn(reg), r1, i0);
2571 ldr_l(r0, rn(reg));
2572 jit_unget_reg(reg);
2573 }
2574}
2575
ba86ff93
PC
2576static void
2577_unldr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2578{
2579 jit_int32_t t0, r2, t1, r3;
2580 assert(i0 >= 1 && i0 <= sizeof(jit_word_t));
2581 if (i0 == 1)
2582 ldr_c(r0, r1);
2583 else {
2584 t0 = jit_get_reg(jit_class_gpr); r2 = rn(t0);
2585 t1 = jit_get_reg(jit_class_gpr);
2586 if (r0 == r1) {
2587 r3 = rn(t1);
2588 movr(r3, r1);
2589 }
2590 else
2591 r3 = r1;
2592 LDQ_U(r0, r3, 0);
2593 LDQ_U(r2, r3, 7);
2594 if (r0 == r1) {
2595#if __BYTE_ORDER == __LITTLE_ENDIAN
2596 LDA(r3, r3, 0);
2597#else
2598 LDA(r3, r3, 7);
2599#endif
2600 }
2601 else {
2602 r3 = rn(t1);
2603#if __BYTE_ORDER == __LITTLE_ENDIAN
2604 LDA(r3, r1, 0);
2605#else
2606 LDA(r3, r1, 7);
2607#endif
2608 }
2609 EXTQL(r0, r3, r0);
2610 EXTQH(r2, r3, r2);
2611 OR(r2, r0, r0);
2612 jit_unget_reg(t1);
2613 jit_unget_reg(t0);
2614 switch (i0) {
2615 case 2:
2616 extr_s(r0, r0);
2617 break;
2618 case 3:
2619 lshi(r0, r0, __WORDSIZE - 24);
2620 rshi(r0, r0, __WORDSIZE - 24);
2621 break;
2622 case 4:
2623 extr_i(r0, r0);
2624 break;
2625 case 5:
2626 lshi(r0, r0, __WORDSIZE - 40);
2627 rshi(r0, r0, __WORDSIZE - 40);
2628 break;
2629 case 6:
2630 lshi(r0, r0, __WORDSIZE - 48);
2631 rshi(r0, r0, __WORDSIZE - 48);
2632 break;
2633 case 7:
2634 lshi(r0, r0, __WORDSIZE - 56);
2635 rshi(r0, r0, __WORDSIZE - 56);
2636 break;
2637 default:
2638 break;
2639 }
2640 }
2641}
2642
2643/* Slightly shorter than fallback, and branchless */
2644static void
2645_unldi(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0, jit_word_t i1)
2646{
2647 jit_int32_t reg;
2648 reg = jit_get_reg(jit_class_gpr);
2649 movi(rn(reg), i0);
2650 unldr(r0, rn(reg), i1);
2651 jit_unget_reg(reg);
2652}
2653
2654static void
2655_unldr_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2656{
2657 jit_int32_t t0, r2, t1, r3;
2658 assert(i0 >= 1 && i0 <= sizeof(jit_word_t));
2659 if (i0 == 1)
2660 ldr_uc(r0, r1);
2661 else {
2662 t0 = jit_get_reg(jit_class_gpr); r2 = rn(t0);
2663 t1 = jit_get_reg(jit_class_gpr);
2664 if (r0 == r1) {
2665 r3 = rn(t1);
2666 movr(r3, r1);
2667 }
2668 else
2669 r3 = r1;
2670 LDQ_U(r0, r3, 0);
2671 LDQ_U(r2, r3, 7);
2672 if (r0 == r1) {
2673#if __BYTE_ORDER == __LITTLE_ENDIAN
2674 LDA(r3, r3, 0);
2675#else
2676 LDA(r3, r3, 7);
2677#endif
2678 }
2679 else {
2680 r3 = rn(t1);
2681#if __BYTE_ORDER == __LITTLE_ENDIAN
2682 LDA(r3, r1, 0);
2683#else
2684 LDA(r3, r1, 7);
2685#endif
2686 }
2687 EXTQL(r0, r3, r0);
2688 EXTQH(r2, r3, r2);
2689 OR(r2, r0, r0);
2690 jit_unget_reg(t1);
2691 jit_unget_reg(t0);
2692 switch (i0) {
2693 case 2:
2694 extr_us(r0, r0);
2695 break;
2696 case 3:
2697 lshi(r0, r0, __WORDSIZE - 24);
2698 rshi_u(r0, r0, __WORDSIZE - 24);
2699 break;
2700 case 4:
2701 extr_ui(r0, r0);
2702 break;
2703 case 5:
2704 lshi(r0, r0, __WORDSIZE - 40);
2705 rshi_u(r0, r0, __WORDSIZE - 40);
2706 break;
2707 case 6:
2708 lshi(r0, r0, __WORDSIZE - 48);
2709 rshi_u(r0, r0, __WORDSIZE - 48);
2710 break;
2711 case 7:
2712 lshi(r0, r0, __WORDSIZE - 56);
2713 rshi_u(r0, r0, __WORDSIZE - 56);
2714 break;
2715 default:
2716 break;
2717 }
2718 }
2719}
2720
2721static void
2722_unldi_u(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0, jit_word_t i1)
2723{
2724 jit_int32_t reg;
2725 reg = jit_get_reg(jit_class_gpr);
2726 movi(rn(reg), i0);
2727 unldr_u(r0, rn(reg), i1);
2728 jit_unget_reg(reg);
2729}
2730
4a71579b
PC
2731static void
2732_sti_c(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
2733{
2734 jit_int32_t reg;
2735 if (_s16_p(i0))
2736 STB(r0, _R31_REGNO, _u16(i0));
2737 else {
2738 reg = jit_get_reg(jit_class_gpr);
2739 movi(rn(reg), i0);
2740 str_c(rn(reg), r0);
2741 jit_unget_reg(reg);
2742 }
2743}
2744
2745static void
2746_sti_s(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
2747{
2748 jit_int32_t reg;
2749 if (_s16_p(i0))
2750 STW(r0, _R31_REGNO, _u16(i0));
2751 else {
2752 reg = jit_get_reg(jit_class_gpr);
2753 movi(rn(reg), i0);
2754 str_s(rn(reg), r0);
2755 jit_unget_reg(reg);
2756 }
2757}
2758
2759static void
2760_sti_i(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
2761{
2762 jit_int32_t reg;
2763 if (_s16_p(i0))
2764 STL(r0, _R31_REGNO, _u16(i0));
2765 else {
2766 reg = jit_get_reg(jit_class_gpr);
2767 movi(rn(reg), i0);
2768 str_i(rn(reg), r0);
2769 jit_unget_reg(reg);
2770 }
2771}
2772
2773static void
2774_sti_l(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
2775{
2776 jit_int32_t reg;
2777 if (_s16_p(i0))
2778 STQ(r0, _R31_REGNO, _u16(i0));
2779 else {
2780 reg = jit_get_reg(jit_class_gpr);
2781 movi(rn(reg), i0);
2782 str_l(rn(reg), r0);
2783 jit_unget_reg(reg);
2784 }
2785}
2786
2787static void
2788_stxr_c(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2789{
2790 jit_int32_t reg;
2791 reg = jit_get_reg(jit_class_gpr);
2792 addr(rn(reg), r0, r1);
2793 str_c(rn(reg), r2);
2794 jit_unget_reg(reg);
2795}
2796
2797static void
2798_stxi_c(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2799{
2800 jit_int32_t reg;
2801 if (_s16_p(i0))
2802 STB(r1, r0, _u16(i0));
2803 else {
2804 reg = jit_get_reg(jit_class_gpr);
2805 addi(rn(reg), r0, i0);
2806 str_c(rn(reg), r1);
2807 jit_unget_reg(reg);
2808 }
2809}
2810
2811static void
2812_stxr_s(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2813{
2814 jit_int32_t reg;
2815 reg = jit_get_reg(jit_class_gpr);
2816 addr(rn(reg), r0, r1);
2817 str_s(rn(reg), r2);
2818 jit_unget_reg(reg);
2819}
2820
2821static void
2822_stxi_s(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2823{
2824 jit_int32_t reg;
2825 if (_s16_p(i0))
2826 STW(r1, r0, _u16(i0));
2827 else {
2828 reg = jit_get_reg(jit_class_gpr);
2829 addi(rn(reg), r0, i0);
2830 str_s(rn(reg), r1);
2831 jit_unget_reg(reg);
2832 }
2833}
2834
2835static void
2836_stxr_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2837{
2838 jit_int32_t reg;
2839 reg = jit_get_reg(jit_class_gpr);
2840 addr(rn(reg), r0, r1);
2841 str_i(rn(reg), r2);
2842 jit_unget_reg(reg);
2843}
2844
2845static void
2846_stxi_i(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2847{
2848 jit_int32_t reg;
2849 if (_s16_p(i0))
2850 STL(r1, r0, _u16(i0));
2851 else {
2852 reg = jit_get_reg(jit_class_gpr);
2853 addi(rn(reg), r0, i0);
2854 str_i(rn(reg), r1);
2855 jit_unget_reg(reg);
2856 }
2857}
2858
2859static void
2860_stxr_l(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2861{
2862 jit_int32_t reg;
2863 reg = jit_get_reg(jit_class_gpr);
2864 addr(rn(reg), r0, r1);
2865 str_l(rn(reg), r2);
2866 jit_unget_reg(reg);
2867}
2868
2869static void
2870_stxi_l(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2871{
2872 jit_int32_t reg;
2873 if (_s16_p(i0))
2874 STQ(r1, r0, _u16(i0));
2875 else {
2876 reg = jit_get_reg(jit_class_gpr);
2877 addi(rn(reg), r0, i0);
2878 str_l(rn(reg), r1);
2879 jit_unget_reg(reg);
2880 }
2881}
2882
2883static void
ba86ff93 2884_unstr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
4a71579b 2885{
ba86ff93
PC
2886 jit_word_t t0, t1, t2, t3, t4, r2, r3, r4, r5, r6;
2887 assert(i0 > 0 && i0 <= sizeof(jit_word_t));
2888 if (i0 == 1)
2889 str_c(r0, r1);
2890 else if (i0 == 4 || i0 == 8) {
2891 t0 = jit_get_reg(jit_class_gpr); r2 = rn(t0);
2892 t1 = jit_get_reg(jit_class_gpr); r3 = rn(t1);
2893 t2 = jit_get_reg(jit_class_gpr); r4 = rn(t2);
2894 t3 = jit_get_reg(jit_class_gpr); r5 = rn(t3);
2895 t4 = jit_get_reg(jit_class_gpr); r6 = rn(t4);
2896#if __BYTE_ORDER == __LITTLE_ENDIAN
2897 LDA(r4, r0, 0); /* r4<2:0> = (X mod 8) = 5 */
2898#else
2899 LDA(r4, r0, i0 - 1); /* r4<2:0> = ((X+7) mod 8) = 5 */
2900#endif
2901 LDQ_U(r2, r0, i0 - 1); /* Ignores va<2:0>, r2 = yyyH GFED
2902 or (if i0 == 4)
2903 r2 = yyyy yyyD */
2904 LDQ_U(r3, r0, 0); /* Ignores va<2:0>, r3 = CBAx xxxx */
2905 if (i0 == 8) {
2906 INSQH(r1, r4, r5); /* r5 = 000H GFED */
2907 INSQL(r1, r4, r6); /* r6 = CBA0 0000 */
2908 MSKQH(r2, r4, r2); /* r2 = yyy0 0000 */
2909 MSKQL(r3, r4, r3); /* r3 = 000x xxxx */
2910 }
2911 else {
2912 INSLH(r1, r4, r5); /* r5 = 0000 000D */
2913 INSLL(r1, r4, r6); /* r6 = CBA0 0000 */
2914 MSKLH(r2, r4, r2); /* r2 = yyy0 0000 */
2915 MSKLL(r3, r4, r3); /* r3 = 000x xxxx */
2916 }
2917 OR(r2, r5, r2); /* r2 = yyyH GFED (or yyyy yyyD) */
2918 OR(r3, r6, r3); /* r1 = CBAx xxxx */
2919 STQ_U(r2, r0, i0 - 1); /* Must store high then low for */
2920 STQ_U(r3, r0, 0); /* degenerate case of aligned QW */
2921 jit_unget_reg(t4);
2922 jit_unget_reg(t3);
2923 jit_unget_reg(t2);
2924 jit_unget_reg(t1);
2925 jit_unget_reg(t0);
2926 }
2927 else
2928 fallback_unstr(r0, r1, i0);
4a71579b
PC
2929}
2930
2931static void
ba86ff93 2932_unsti(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
4a71579b 2933{
ba86ff93
PC
2934 jit_int32_t reg;
2935 if (i1 == 4 || i1 == 8) {
2936 reg = jit_get_reg(jit_class_gpr);
2937 movi(rn(reg), i0);
2938 unstr(rn(reg), r0, i1);
2939 jit_unget_reg(reg);
2940 }
2941 else
2942 fallback_unsti(i0, r0, i1);
4a71579b
PC
2943}
2944
2945static void
ba86ff93
PC
2946_extr(jit_state_t *_jit,
2947 jit_int32_t r0, jit_int32_t r1, jit_word_t i0, jit_word_t i1)
4a71579b 2948{
ba86ff93
PC
2949 assert(i0 >= 0 && i1 >= 1 && i0 + i1 <= __WORDSIZE);
2950 if (i1 == __WORDSIZE)
2951 movr(r0, r1);
2952 else {
2953# if __BYTE_ORDER == __BIG_ENDIAN
2954 i0 = __WORDSIZE - (i0 + i1);
2955# endif
2956 if (__WORDSIZE - (i0 + i1)) {
2957 lshi(r0, r1, __WORDSIZE - (i0 + i1));
2958 rshi(r0, r0, __WORDSIZE - i1);
2959 }
2960 else
2961 rshi(r0, r1, __WORDSIZE - i1);
2962 }
4a71579b
PC
2963}
2964
2965static void
ba86ff93
PC
2966_extr_u(jit_state_t *_jit,
2967 jit_int32_t r0, jit_int32_t r1, jit_word_t i0, jit_word_t i1)
4a71579b 2968{
ba86ff93
PC
2969 assert(i0 >= 0 && i1 >= 1 && i0 + i1 <= __WORDSIZE);
2970 if (i1 == __WORDSIZE)
2971 movr(r0, r1);
2972 else {
2973# if __BYTE_ORDER == __BIG_ENDIAN
2974 i0 = __WORDSIZE - (i0 + i1);
2975# endif
2976 if ((i0 & 7) == 0) {
2977 if (i1 == 8) {
2978 EXTBLi(r1, i0 >> 3, r0);
2979 goto done;
2980 }
2981 if (i1 == 16) {
2982 EXTWLi(r1, i0 >> 3, r0);
2983 goto done;
2984 }
2985 if (i1 == 32) {
2986 EXTLLi(r1, i0 >> 3, r0);
2987 goto done;
2988 }
2989 }
2990 if (i0)
2991 rshi_u(r0, r1, i0);
2992 andi(r0, r0, (1L << i1) - 1);
2993 }
2994done:;
4a71579b
PC
2995}
2996
2997static void
ba86ff93
PC
2998_depr(jit_state_t *_jit,
2999 jit_int32_t r0, jit_int32_t r1, jit_word_t i0, jit_word_t i1)
4a71579b 3000{
ba86ff93
PC
3001 jit_int32_t t0;
3002 jit_word_t mask;
3003 assert(i0 >= 0 && i1 >= 1 && i0 + i1 <= __WORDSIZE);
3004 if (i1 == __WORDSIZE)
3005 movr(r0, r1);
3006 else {
3007# if __BYTE_ORDER == __BIG_ENDIAN
3008 i0 = __WORDSIZE - (i0 + i1);
3009# endif
3010 t0 = jit_get_reg(jit_class_gpr);
3011 if ((i0 & 7) == 0) {
3012 if (i1 == 8) {
3013 MSKBLi(r0, i0 >> 3, rn(t0));
3014 INSBLi(r1, i0 >> 3, r0);
3015 goto done;
3016 }
3017 if (i1 == 16) {
3018 MSKWLi(r0, i0 >> 3, rn(t0));
3019 INSWLi(r1, i0 >> 3, r0);
3020 goto done;
3021 }
3022 if (i1 == 32) {
3023 MSKLLi(r0, i0 >> 3, rn(t0));
3024 INSLLi(r1, i0 >> 3, r0);
3025 goto done;
3026 }
3027 }
3028 mask = (1L << i1) - 1;
3029 andi(rn(t0), r1, mask);
3030 if (i0) {
3031 lshi(rn(t0), rn(t0), i0);
3032 mask <<= i0;
3033 }
3034 andi(r0, r0, ~mask);
3035 done:
3036 orr(r0, r0, rn(t0));
3037 jit_unget_reg(t0);
3038 }
4a71579b
PC
3039}
3040
3041static void
ba86ff93 3042_extr_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
4a71579b
PC
3043{
3044 lshi(r0, r1, 32);
ba86ff93 3045 rshi(r0, r0, 32);
4a71579b
PC
3046}
3047
3048static void
40a44dcb 3049_bswapr_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
4a71579b
PC
3050{
3051 jit_int32_t t0;
3052 t0 = jit_get_reg(jit_class_gpr);
3053 EXTBLi(r1, 0, rn(t0));
3054 EXTBLi(r1, 1, r0);
3055 SLLi(rn(t0), 8, rn(t0));
3056 OR(r0, rn(t0), r0);
3057 jit_unget_reg(t0);
3058}
3059
3060static void
40a44dcb 3061_bswapr_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
4a71579b
PC
3062{
3063 jit_int32_t t0;
3064 jit_int32_t t1;
3065 jit_int32_t t2;
3066 jit_int32_t t3;
3067 t0 = jit_get_reg(jit_class_gpr);
3068 t1 = jit_get_reg(jit_class_gpr);
3069 t2 = jit_get_reg(jit_class_gpr);
3070 t3 = jit_get_reg(jit_class_gpr);
3071 EXTBLi(r1, 3, rn(t0));
3072 INSBLi(r1, 3, rn(t1));
3073 SLLi(r1, 8, rn(t2));
3074 ZAPNOTi(rn(t2), 4, rn(t2));
3075 SRLi(r1, 8, rn(t3));
3076 OR(rn(t0), rn(t1), r0);
3077 OR(rn(t2), r0, r0);
3078 ZAPNOTi(rn(t3), 2, rn(t3));
3079 OR(rn(t3), r0, r0);
3080 jit_unget_reg(t3);
3081 jit_unget_reg(t2);
3082 jit_unget_reg(t1);
3083 jit_unget_reg(t0);
3084}
3085
3086static void
40a44dcb 3087_bswapr_ul(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
4a71579b
PC
3088{
3089 jit_int32_t t0;
3090 jit_int32_t t1;
3091 jit_int32_t t2;
3092 assert(_jitc->function != NULL);
3093 t0 = jit_get_reg(jit_class_fpr);
3094 t1 = jit_get_reg(jit_class_gpr);
3095 t2 = jit_get_reg(jit_class_gpr);
3096 stxi(-8, _FP_REGNO, r1); /* r1 = ABCD EFGH */
3097 LDG(rn(t0), _FP_REGNO, _u16(-8)); /* t0 = GHEF CDAB */
3098 STT(rn(t0), _FP_REGNO, _u16(-8));
3099 ldxi(rn(t1), _FP_REGNO, -8); /* t1 = GHEF CDAB */
3100 lshi(rn(t2), rn(t1), 8); /* t2 = HEFC DAB. */
3101 rshi_u(rn(t1), rn(t1), 8); /* t1 = .GHE FCDA */
3102 ZAPi(rn(t2), 0x55, rn(t2)); /* t2 = H.F. D.B. */
3103 ZAPi(rn(t1), 0xaa, rn(t1)); /* t1 = .G.E .C.A */
3104 orr(r0, rn(t1), rn(t2)); /* r0 = HGFE DCBA */
3105 jit_unget_reg(t2);
3106 jit_unget_reg(t1);
3107 jit_unget_reg(t0);
3108}
3109
79bfeef6 3110static jit_word_t
4a71579b
PC
3111_jmpi(jit_state_t *_jit, jit_word_t i0)
3112{
3113 jit_word_t w;
3114 jit_word_t d;
3115 w = _jit->pc.w;
3116 d = ((i0 - w) >> 2) - 1;
3117 if (_s21_p(d))
3118 BR(_R31_REGNO, d);
3119 else
79bfeef6
PC
3120 w = jmpi_p(i0);
3121 return (w);
4a71579b
PC
3122}
3123
3124static jit_word_t
3125_jmpi_p(jit_state_t *_jit, jit_word_t i0)
3126{
3127 jit_word_t w;
3128 jit_int32_t reg;
3129 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
3130 w = movi_p(rn(reg), i0);
3131 jmpr(rn(reg));
3132 jit_unget_reg(reg);
3133 return (w);
3134}
3135
3136static void
3137_callr(jit_state_t *_jit, jit_int32_t r0)
3138{
3139 if (r0 != _PV_REGNO)
3140 MOV(r0, _PV_REGNO);
3141 JSR(_RA_REGNO, _PV_REGNO, 0);
3142}
3143
3144static void
3145_calli(jit_state_t *_jit, jit_word_t i0)
3146{
3147 /* FIXME use a small buffer to load constants - using gp */
3148#if 0
3149 jit_word_t w;
3150 jit_word_t d;
3151 w = _jit->pc.w;
3152 d = ((i0 - w) >> 2) - 1;
3153 if (_s21_p(d))
3154 BSR(_RA_REGNO, d);
3155 else
3156 (void)calli_p(i0);
3157#else
3158 movi(_PV_REGNO, i0);
3159 callr(_PV_REGNO);
3160#endif
3161}
3162
3163static jit_word_t
3164_calli_p(jit_state_t *_jit, jit_word_t i0)
3165{
3166 jit_word_t w;
3167 w = movi_p(_PV_REGNO, i0);
3168 callr(_PV_REGNO);
3169 return (w);
3170}
3171
3172static void
3173_prolog(jit_state_t *_jit, jit_node_t *node)
3174{
3175 jit_int32_t reg;
3176 if (_jitc->function->define_frame || _jitc->function->assume_frame) {
3177 jit_int32_t frame = -_jitc->function->frame;
3178 assert(_jitc->function->self.aoff >= frame);
3179 if (_jitc->function->assume_frame)
3180 return;
3181 _jitc->function->self.aoff = frame;
3182 }
3183 if (_jitc->function->allocar)
3184 _jitc->function->self.aoff &= -8;
3185 _jitc->function->stack = ((_jitc->function->self.alen -
3186 _jitc->function->self.aoff) + 7) & -8;
3187 /* ldgp gp, 0(pv) */
3188 LDAH(_PV_REGNO, _GP_REGNO, 0);
3189 LDA(_GP_REGNO, _GP_REGNO, 0);
3190 /* callee save registers */
3191 subi(_SP_REGNO, _SP_REGNO, stack_framesize);
3192 stxi(0, _SP_REGNO, _RA_REGNO);
3193 stxi(8, _SP_REGNO, _FP_REGNO);
3194# define SPILL(N, O) \
3195 if (jit_regset_tstbit(&_jitc->function->regset, N)) \
3196 stxi(O, _SP_REGNO, N##_REGNO)
3197# define SPILLD(N, O) \
3198 if (jit_regset_tstbit(&_jitc->function->regset, N)) \
3199 stxi_d(O, _SP_REGNO, N##_REGNO)
3200 SPILL(_S0, 16);
3201 SPILL(_S1, 24);
3202 SPILL(_S2, 32);
3203 SPILL(_S3, 40);
3204 SPILL(_S4, 48);
3205 SPILL(_S5, 56);
3206 SPILLD(_F2, 64);
3207 SPILLD(_F3, 72);
3208 SPILLD(_F4, 80);
3209 SPILLD(_F5, 88);
3210 SPILLD(_F6, 96);
3211 SPILLD(_F7, 104);
3212 SPILLD(_F8, 112);
3213 SPILLD(_F9, 120);
3214# undef SPILLD
3215# undef SPILL
3216 movr(_FP_REGNO, _SP_REGNO);
3217 /* alloca */
3218 if (_jitc->function->stack)
3219 subi(_SP_REGNO, _SP_REGNO, _jitc->function->stack);
3220 if (_jitc->function->allocar) {
3221 reg = jit_get_reg(jit_class_gpr);
3222 movi(rn(reg), _jitc->function->self.aoff);
3223 stxi_i(_jitc->function->aoffoff, _FP_REGNO, rn(reg));
3224 jit_unget_reg(reg);
3225 }
3226
3227 if (_jitc->function->self.call & jit_call_varargs) {
3228 for (reg = _jitc->function->self.argi; jit_arg_reg_p(reg); ++reg)
3229 stxi(stack_framesize - 48 + reg * 8, _FP_REGNO, rn(_A0 - reg));
3230 for (reg = _jitc->function->self.argi; jit_arg_reg_p(reg); ++reg)
3231 stxi_d(stack_framesize - 96 + reg * 8, _FP_REGNO, rn(_F16 - reg));
3232 }
3233}
3234
3235static void
3236_epilog(jit_state_t *_jit, jit_node_t *node)
3237{
3238 if (_jitc->function->assume_frame)
3239 return;
3240 movr(_SP_REGNO, _FP_REGNO);
3241 ldxi(_RA_REGNO, _SP_REGNO, 0);
3242 ldxi(_FP_REGNO, _SP_REGNO, 8);
3243# define LOAD(N, O) \
3244 if (jit_regset_tstbit(&_jitc->function->regset, N)) \
3245 ldxi(N##_REGNO, _SP_REGNO, O)
3246# define LOADD(N, O) \
3247 if (jit_regset_tstbit(&_jitc->function->regset, N)) \
3248 ldxi_d(N##_REGNO, _SP_REGNO, O)
3249 LOAD(_S0, 16);
3250 LOAD(_S1, 24);
3251 LOAD(_S2, 32);
3252 LOAD(_S3, 40);
3253 LOAD(_S4, 48);
3254 LOAD(_S5, 56);
3255 LOADD(_F2, 64);
3256 LOADD(_F3, 72);
3257 LOADD(_F4, 80);
3258 LOADD(_F5, 88);
3259 LOADD(_F6, 96);
3260 LOADD(_F7, 104);
3261 LOADD(_F8, 112);
3262 LOADD(_F9, 120);
3263# undef LOADD
3264# undef LOAD
3265 addi(_SP_REGNO, _SP_REGNO, stack_framesize);
3266 RET(_R31_REGNO, _RA_REGNO, 1); /* 1 means procedure return
3267 * 0 means no procedure return
3268 * other values are reserved */
3269}
3270
3271static void
3272_vastart(jit_state_t *_jit, jit_int32_t r0)
3273{
3274 jit_int32_t reg;
3275
3276 /* Return jit_va_list_t in the register argument */
3277 addi(r0, _FP_REGNO, _jitc->function->vaoff);
3278
3279 reg = jit_get_reg(jit_class_gpr);
3280
3281 /* The base field is constant. */
3282 addi(rn(reg), _FP_REGNO, stack_framesize - 48);
3283 stxi(offsetof(jit_va_list_t, base), r0, rn(reg));
3284
3285 /* Initialize the offset field */
3286 if (_jitc->function->vagp < 6)
3287 movi(rn(reg), _jitc->function->vagp * 8);
3288 else
3289 movi(rn(reg), _jitc->function->self.size - (stack_framesize - 48));
3290 stxi(offsetof(jit_va_list_t, offset), r0, rn(reg));
3291
3292 jit_unget_reg(reg);
3293}
3294
3295static void
3296_vaarg(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
3297{
3298 jit_int32_t rg0, rg1;
3299
3300 assert(_jitc->function->self.call & jit_call_varargs);
3301
3302 rg0 = jit_get_reg(jit_class_gpr);
3303 rg1 = jit_get_reg(jit_class_gpr);
3304
3305 /* Load the base in first temporary. */
3306 ldxi(rn(rg0), r1, offsetof(jit_va_list_t, base));
3307
3308 /* Load the offset in the second temporary. */
3309 ldxi(rn(rg1), r1, offsetof(jit_va_list_t, offset));
3310
3311 /* Load the argument */
3312 ldxr(r0, rn(rg0), rn(rg1));
3313
3314 /* No longer needed. */
3315 jit_unget_reg(rg0);
3316
3317 /* Update offset. */
3318 addi(rn(rg1), rn(rg1), 8);
3319 stxi(offsetof(jit_va_list_t, offset), r1, rn(rg1));
3320 jit_unget_reg(rg1);
3321}
3322
3323static void
3324_patch_at(jit_state_t *_jit, jit_word_t instr, jit_word_t label)
3325{
3326 union {
3327 jit_int32_t *i;
3328 jit_word_t w;
3329 } u;
3330 jit_word_t d;
3331 jit_int16_t s0, s1, s2, s3;
3332 u.w = instr;
3333 switch (_u6(u.i[0] >> 26)) {
3334 /* BLT BLE BEQ BGE */
3335 case 0x3a: case 0x3b: case 0x39: case 0x3e:
3336 /* BGT BNE BLBC BLBS */
3337 case 0x3f: case 0x3d: case 0x38: case 0x3c:
3338 /* BR BSR */
3339 case 0x30: case 0x34:
3340 /* FBLT FBLE FBEQ FBGE */
3341 case 0x32: case 0x33: case 0x31: case 0x36:
3342 /* FBGT FBNE */
3343 case 0x37: case 0x35:
3344 d = ((label - instr) >> 2) - 1;
3345 assert(_s21_p(d));
3346 u.i[0] &= ~0x1fffff;
3347 u.i[0] |= _u21(d);
3348 break;
3349 /* LDA */
3350 case 0x08: /* movi_p */
3351 s0 = label;
3352 s1 = label >> 16;
3353 s2 = label >> 32;
3354 s3 = label >> 48;
3355 if (s0 < 0)
3356 ++s1;
3357 if (s2 < 0)
3358 ++s3;
3359 u.i[0] &= ~0xffff;
3360 u.i[0] |= _u16(s0);
3361 /* LDA */
3362 assert(_u6(u.i[1] >> 26) == 0x08);
3363 u.i[1] &= ~0xffff;
3364 u.i[1] |= _u16(s2);
3365 /* LDAH */
3366 assert(_u6(u.i[2] >> 26) == 0x09);
3367 u.i[2] &= ~0xffff;
3368 u.i[2] |= _u16(s1);
3369 /* LDAH */
3370 assert(_u6(u.i[3] >> 26) == 0x09);
3371 u.i[3] &= ~0xffff;
3372 u.i[3] |= _u16(s3);
3373 /* SLL */
3374 assert(_u6(u.i[4] >> 26) == 0x12 && _u7(u.i[4] >> 5) == 0x39);
3375 /* SRL */
3376 assert(_u6(u.i[5] >> 26) == 0x12 && _u7(u.i[5] >> 5) == 0x34);
3377 /* SLL */
3378 assert(_u6(u.i[6] >> 26) == 0x12 && _u7(u.i[6] >> 5) == 0x39);
3379 /* BIS */
3380 assert(_u6(u.i[7] >> 26) == 0x11 && _u7(u.i[7] >> 5) == 0x20);
3381 break;
3382 default:
3383 abort();
3384 }
3385}
3386#endif