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