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