1 /*
2  * Copyright (C) 2013-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 RND_CUR			0
22 #  define RND_BIAS_NEAR			1
23 #  define RND_NEAR			4
24 #  define RND_ZERO			5
25 #  define RND_POS_INF			6
26 #  define RND_NEG_INF			7
27 /****************************************************************
28  * Floating Point Instructions					*
29  ****************************************************************/
30 /* CONVERT BFP TO HFP */
31 #  define THDER(R1,R2)			RRE_(0xB358,R1,R2)
32 #  define THDR(R1,R2)			RRE_(0xB359,R1,R2)
33 /* CONVERT HFP TO BFP */
34 #  define TBEDR(R1,R2)			RRE_(0xB350,R1,R2)
35 #  define TBDR(R1,R2)			RRE_(0xB351,R1,R2)
36 /* LOAD */
37 #  define LER(R1,R2)			RR_(0x38,R1,R2)
38 #  define LDR(R1,R2)			RR_(0x28,R1,R2)
39 #  define LXR(R1,R2)			RRE_(0xB365,R1,R2)
40 #  define LE(R1,D2,X2,B2)		RX_(0x78,R1,X2,B2,D2)
41 #  define LD(R1,D2,X2,B2)		RX_(0x68,R1,X2,B2,D2)
42 #  define LEY(R1,D2,X2,B2)		RXY_(0xED,R1,X2,B2,D2,0x64)
43 #  define LDY(R1,D2,X2,B2)		RXY_(0xED,R1,X2,B2,D2,0x65)
44 /* LOAD ZERO */
45 #  define LZER(R1)			RRE_(0xB374,R1,0)
46 #  define LZDR(R1)			RRE_(0xB375,R1,0)
47 #  define LZXR(R1)			RRE_(0xB376,R1,0)
48 /* STORE */
49 #  define STE(R1,D2,X2,B2)		RX_(0x70,R1,X2,B2,D2)
50 #  define STD(R1,D2,X2,B2)		RX_(0x60,R1,X2,B2,D2)
51 #  define STEY(R1,D2,X2,B2)		RXY_(0xED,R1,X2,B2,D2,0x66)
52 #  define STDY(R1,D2,X2,B2)		RXY_(0xED,R1,X2,B2,D2,0x67)
53 /****************************************************************
54  * Hexadecimal Floating Point Instructions			*
55  ****************************************************************/
56 /* ADD NORMALIZED */
57 #  define AER(R1,R2)			RR_(0x3A,R1,R2)
58 #  define ADR(R1,R2)			RR_(0x2A,R1,R2)
59 #  define AXR(R1,R2)			RR_(0x36,R1,R2)
60 #  define AE(R1,D2,X2,B2)		RX_(0x7A,R1,X2,B2,D2)
61 #  define AD(R1,D2,X2,B2)		RX_(0x6A,R1,X2,B2,D2)
62 /* ADD UNNORMALIZED */
63 #  define AUR(R1,R2)			RR_(0x3E,R1,R2)
64 #  define AWR(R1,R2)			RR_(0x2E,R1,R2)
65 #  define AU(R1,D2,X2,B2)		RX_(0x7E,R1,X2,B2,D2)
66 #  define AW(R1,D2,X2,B2)		RX_(0x6E,R1,X2,B2,D2)
67 /* COMPARE */
68 #  define CER(R1,R2)			RR_(0x39,R1,R2)
69 #  define CDR(R1,R2)			RR_(0x29,R1,R2)
70 #  define CXR(R1,R2)			RRE_(0xB369,R1,R2)
71 #  define CE(R1,D2,X2,B2)		RX_(0x79,R1,X2,B2,D2)
72 #  define CD(R1,D2,X2,B2)		RX_(0x69,R1,X2,B2,D2)
73 /* CONVERT FROM FIXED */
74 #  define CEFR(R1,R2)			RRE_(0xB3B4,R1,R2)
75 #  define CDFR(R1,R2)			RRE_(0xB3B5,R1,R2)
76 #  define CXFR(R1,R2)			RRE_(0xB3B6,R1,R2)
77 #  define CEGR(R1,R2)			RRE_(0xB3C4,R1,R2)
78 #  define CDGR(R1,R2)			RRE_(0xB3C5,R1,R2)
79 #  define CXGR(R1,R2)			RRE_(0xB3C6,R1,R2)
80 /* CONVERT TO FIXED */
81 #  define CFER(R1,R2)			RRE_(0xB3B8,R1,R2)
82 #  define CFDR(R1,R2)			RRE_(0xB3B9,R1,R2)
83 #  define CFXR(R1,R2)			RRE_(0xB3BA,R1,R2)
84 #  define CGER(R1,R2)			RRE_(0xB3C8,R1,R2)
85 #  define CGDR(R1,R2)			RRE_(0xB3C9,R1,R2)
86 #  define CGXR(R1,R2)			RRE_(0xB3CA,R1,R2)
87 /* DIVIDE */
88 #  define DER(R1,R2)			RR_(0x3D,R1,R2)
89 #  define DDR(R1,R2)			RR_(0x2D,R1,R2)
90 #  define DXR(R1,R2)			RRE_(0xB22D,R1,R2)
91 #  define DE(R1,D2,X2,B2)		RX_(0x7D,R1,X2,B2,D2)
92 #  define DD(R1,D2,X2,B2)		RX_(0x6D,R1,X2,B2,D2)
93 /* HALVE */
94 #  define HER(R1,R2)			RR_(0x34,R1,R2)
95 #  define HDR(R1,R2)			RR_(0x24,R1,R2)
96 /* LOAD AND TEST */
97 #  define LTER(R1,R2)			RR_(0x32,R1,R2)
98 #  define LTDR(R1,R2)			RR_(0x22,R1,R2)
99 #  define LTXR(R1,R2)			RRE_(0xB362,R1,R2)
100 /* LOAD COMPLEMENT */
101 #  define LCER(R1,R2)			RR_(0x33,R1,R2)
102 #  define LCDR(R1,R2)			RR_(0x23,R1,R2)
103 #  define LCXR(R1,R2)			RRE_(0xB363,R1,R2)
104 /* LOAD FP INTEGER */
105 #  define FIER(R1,R2)			RRE_(0xB377,R1,R2)
106 #  define FIDR(R1,R2)			RRE_(0xB37F,R1,R2)
107 #  define FIXR(R1,R2)			RRE_(0xB367,R1,R2)
108 /* LOAD LENGHTENED */
109 #  define LDER(R1,R2)			RRE_(0xB324,R1,R2)
110 #  define LXDR(R1,R2)			RRE_(0xB325,R1,R2)
111 #  define LXER(R1,R2)			RRE_(0xB326,R1,R2)
112 #  define LDE(R1,D2,X2,B2)		RXE_(0xED,R1,X2,B2,D2,0x24)
113 #  define LXD(R1,D2,X2,B2)		RXE_(0xED,R1,X2,B2,D2,0x25)
114 #  define LXE(R1,D2,X2,B2)		RXE_(0xED,R1,X2,B2,D2,0x26)
115 /* LOAD NEGATIVE */
116 #  define LNER(R1,R2)			RR_(0x31,R1,R2)
117 #  define LNDR(R1,R2)			RR_(0x21,R1,R2)
118 #  define LNXR(R1,R2)			RRE_(0xB361,R1,R2)
119 /* LOAD POSITIVE */
120 #  define LPER(R1,R2)			RR_(0x30,R1,R2)
121 #  define LPDR(R1,R2)			RR_(0x20,R1,R2)
122 #  define LPXR(R1,R2)			RRE_(0xB360,R1,R2)
123 /* LOAD ROUNDED */
124 #  define LEDR(R1,R2)			RR_(0x35,R1,R2)
125 #  define LDXR(R1,R2)			RR_(0x25,R1,R2)
126 #  define LRER(R1,R2)			LEDR(R1,R2)
127 #  define LRDR(R1,R2)			LDXR(R1,R2)
128 #  define LRXR(R1,R2)			RRE_(0xB366,R1,R2)
129 /* MULTIPLY */
130 #  define MEER(R1,R2)			RRE_(0xB337,R1,R2)
131 #  define MDR(R1,R2)			RR_(0x2C,R1,R2)
132 #  define MXR(R1,R2)			RR_(0x26,R1,R2)
133 #  define MDER(R1,R2)			RR_(0x3C,R1,R2)
134 #  define MXDR(R1,R2)			RR_(0x27,R1,R2)
135 #  define MER(R1,R2)			MDER(R1,R2)
136 #  define MEE(R1,D2,X2,B2)		RXE_(0xED,R1,X2,B2,D2,0x37)
137 #  define MD(R1,D2,X2,B2)		RX_(0x6C,R1,X2,B2,D2)
138 #  define MDE(R1,D2,X2,B2)		RX_(0x7C,R1,X2,B2,D2)
139 #  define MXD(R1,D2,X2,B2)		RX_(0x67,R1,X2,B2,D2)
140 #  define ME(R1,D2,X2,B2)		MDE(R1,D2,X2,B2)
141 /* MULTIPLY AND ADD */
142 #  define MAER(R1,R3,R2)		RRF_(0xB32E,R1,0,R3,R2)
143 #  define MADR(R1,R3,R2)		RRF_(0xB33E,R1,0,R3,R2)
144 #  define MAE(R1,R3,D2,X2,B2)		RXF_(0xED,R3,X2,B2,D2,R1,0x2E)
145 #  define MAD(R1,R3,D2,X2,B2)		RXF_(0xED,R3,X2,B2,D2,R1,0x3E)
146 /* MULTIPLY AND SUBTRACT */
147 #  define MSER(R1,R3,R2)		RRF_(0xB32F,R1,0,R3,R2)
148 #  define MSDR(R1,R3,R2)		RRF_(0xB33F,R1,0,R3,R2)
149 #  define MSE(R1,R3,D2,X2,B2)		RXF_(0xED,R3,X2,B2,D2,R1,0x2F)
150 #  define MSD(R1,R3,D2,X2,B2)		RXF_(0xED,R3,X2,B2,D2,R1,0x3F)
151 /* SQUARE ROOT */
152 #  define SQER(R1,R2)			RRE_(0xB245,R1,R2)
153 #  define SQDR(R1,R2)			RRE_(0xB244,R1,R2)
154 #  define SQXR(R1,R2)			RRE_(0xB336,R1,R2)
155 #  define SQE(R1,D2,X2,B2)		RXE_(0xED,R1,X2,B2,D2,0x34)
156 #  define SQD(R1,D2,X2,B2)		RXE_(0xED,R1,X2,B2,D2,0x35)
157 /* SUBTRACT NORMALIZED */
158 #  define SER(R1,R2)			RR_(0x3B,R1,R2)
159 #  define SDR(R1,R2)			RR_(0x2B,R1,R2)
160 #  define SXR(R1,R2)			RR_(0x37,R1,R2)
161 #  define SE(R1,D2,X2,B2)		RX_(0x7B,R1,X2,B2,D2)
162 #  define SD(R1,D2,X2,B2)		RX_(0x6B,R1,X2,B2,D2)
163 /* SUBTRACT UNNORMALIZED */
164 #  define SUR(R1,R2)			RR_(0x3F,R1,R2)
165 #  define SWR(R1,R2)			RR_(0x2F,R1,R2)
166 #  define SU(R1,D2,X2,B2)		RX_(0x7F,R1,X2,B2,D2)
167 #  define SW(R1,D2,X2,B2)		RX_(0x6F,R1,X2,B2,D2)
168 /****************************************************************
169  * Binary Floating Point Instructions				*
170  ****************************************************************/
171 /* ADD */
172 #  define AEBR(R1,R2)			RRE_(0xB30A,R1,R2)
173 #  define ADBR(R1,R2)			RRE_(0xB31A,R1,R2)
174 #  define AXBR(R1,R2)			RRE_(0xB34A,R1,R2)
175 #  define AEB(R1,D2,X2,B2)		RXE_(0xED,R1,X2,B2,D2,0x0A)
176 #  define ADB(R1,D2,X2,B2)		RXE_(0xED,R1,X2,B2,D2,0x1A)
177 /* COMPARE */
178 #  define CEBR(R1,R2)			RRE_(0xB309,R1,R2)
179 #  define CDBR(R1,R2)			RRE_(0xB319,R1,R2)
180 #  define CXBR(R1,R2)			RRE_(0xB349,R1,R2)
181 #  define CEB(R1,D2,X2,B2)		RXE_(0xED,R1,X2,B2,D2,0x09)
182 #  define CDB(R1,D2,X2,B2)		RXE_(0xED,R1,X2,B2,D2,0x19)
183 /* COMPARE AND SIGNAL */
184 #  define KEBR(R1,R2)			RRE_(0xB308,R1,R2)
185 #  define KDBR(R1,R2)			RRE_(0xB318,R1,R2)
186 #  define KXBR(R1,R2)			RRE_(0xB348,R1,R2)
187 #  define KEB(R1,D2,X2,B2)		RXE_(0xED,R1,X2,B2,D2,0x08)
188 #  define KDB(R1,D2,X2,B2)		RXE_(0xED,R1,X2,B2,D2,0x18)
189 /* CONVERT FROM FIXED */
190 #  define CEFBR(R1,R2)			RRE_(0xB394,R1,R2)
191 #  define CDFBR(R1,R2)			RRE_(0xB395,R1,R2)
192 #  define CXFBR(R1,R2)			RRE_(0xB396,R1,R2)
193 #  define CEGBR(R1,R2)			RRE_(0xB3A4,R1,R2)
194 #  define CDGBR(R1,R2)			RRE_(0xB3A5,R1,R2)
195 #  define CXGBR(R1,R2)			RRE_(0xB3A6,R1,R2)
196 /* CONVERT TO FIXED */
197 #  define CFEBR(R1,M3,R2)		RRF_(0xB398,M3,0,R1,R2)
198 #  define CFDBR(R1,M3,R2)		RRF_(0xB399,M3,0,R1,R2)
199 #  define CFXBR(R1,M3,R2)		RRF_(0xB39A,M3,0,R1,R2)
200 #  define CGEBR(R1,M3,R2)		RRF_(0xB3A8,M3,0,R1,R2)
201 #  define CGDBR(R1,M3,R2)		RRF_(0xB3A9,M3,0,R1,R2)
202 #  define CGXBR(R1,M3,R2)		RRF_(0xB3AA,M3,0,R1,R2)
203 /* DIVIDE */
204 #  define DEBR(R1,R2)			RRE_(0xB30D,R1,R2)
205 #  define DDBR(R1,R2)			RRE_(0xB31D,R1,R2)
206 #  define DXBR(R1,R2)			RRE_(0xB34D,R1,R2)
207 #  define DEB(R1,D2,X2,B2)		RXE_(0xED,R1,X2,B2,D2,0x0D)
208 #  define DDB(R1,D2,X2,B2)		RXE_(0xED,R1,X2,B2,D2,0x1D)
209 /* DIVIDE TO INTEGER */
210 #  define DIEBR(R1,R3,R2,M4)		RRF_(0xB353,R3,M4,R1,R2)
211 #  define DIDBR(R1,R3,R2,M4)		RRF_(0xB35B,R3,M4,R1,R2)
212 /* EXTRACT FPC */
213 #  define EFPC(R1)			RRE_(0xB38C,R1,0)
214 /* LOAD AND TEST */
215 #  define LTEBR(R1,R2)			RRE_(0xB302,R1,R2)
216 #  define LTDBR(R1,R2)			RRE_(0xB312,R1,R2)
217 #  define LTXBR(R1,R2)			RRE_(0xB342,R1,R2)
218 /* LOAD COMPLEMENT */
219 #  define LCEBR(R1,R2)			RRE_(0xB303,R1,R2)
220 #  define LCDBR(R1,R2)			RRE_(0xB313,R1,R2)
221 #  define LCXBR(R1,R2)			RRE_(0xB343,R1,R2)
222 /* LOAD FP INTEGER */
223 #  define FIEBR(R1,M3,R2)		RRF_(0xB357,M3,0,R1,R2)
224 #  define FIDBR(R1,M3,R2)		RRF_(0xB35F,M3,0,R1,R2)
225 #  define FIXBR(R1,M3,R2)		RRF_(0xB347,M3,0,R1,R2)
226 /* LOAD FPC */
227 #  define LFPC(D2,B2)			S_(0xB29D,B2,D2)
228 /* LOAD LENGTHENED */
229 #  define LDEBR(R1,R2)			RRE_(0xB304,R1,R2)
230 #  define LXDBR(R1,R2)			RRE_(0xB305,R1,R2)
231 #  define LXEBR(R1,R2)			RRE_(0xB306,R1,R2)
232 #  define LDEB(R1,D2,X2,B2)		RXE_(0xED,R1,X2,B2,D2,0x04)
233 #  define LXDB(R1,D2,X2,B2)		RXE_(0xED,R1,X2,B2,D2,0x05)
234 #  define LXEB(R1,D2,X2,B2)		RXE_(0xED,R1,X2,B2,D2,0x06)
235 /* LOAD NEGATIVE */
236 #  define LNEBR(R1,R2)			RRE_(0xB301,R1,R2)
237 #  define LNDBR(R1,R2)			RRE_(0xB311,R1,R2)
238 #  define LNXBR(R1,R2)			RRE_(0xB341,R1,R2)
239 /* LOAD POSITIVE */
240 #  define LPEBR(R1,R2)			RRE_(0xB300,R1,R2)
241 #  define LPDBR(R1,R2)			RRE_(0xB310,R1,R2)
242 #  define LPXBR(R1,R2)			RRE_(0xB340,R1,R2)
243 /* LOAD ROUNDED */
244 #  define LEDBR(R1,R2)			RRE_(0xB344,R1,R2)
245 #  define LDXBR(R1,R2)			RRE_(0xB345,R1,R2)
246 #  define LEXBR(R1,R2)			RRE_(0xB346,R1,R2)
247 /* MULTIPLY */
248 #  define MEEBR(R1,R2)			RRE_(0xB317,R1,R2)
249 #  define MDBR(R1,R2)			RRE_(0xB31C,R1,R2)
250 #  define MXBR(R1,R2)			RRE_(0xB34C,R1,R2)
251 #  define MDEBR(R1,R2)			RRE_(0xB30C,R1,R2)
252 #  define MXDBR(R1,R2)			RRE_(0xB307,R1,R2)
253 #  define MEEB(R1,D2,X2,B2)		RXE_(0xED,R1,X2,B2,D2,0x17)
254 #  define MDB(R1,D2,X2,B2)		RXE_(0xED,R1,X2,B2,D2,0x1C)
255 #  define MDEB(R1,D2,X2,B2)		RXE_(0xED,R1,X2,B2,D2,0x0C)
256 #  define MXDB(R1,D2,X2,B2)		RXE_(0xED,R1,X2,B2,D2,0x07)
257 /* MULTIPLY AND ADD */
258 #  define MAEBR(R1,R3,R2)		RRF_(0xB30E,R1,0,R3,R2)
259 #  define MADBR(R1,R3,R2)		RRF_(0xB31E,R1,0,R3,R2)
260 #  define MAEB(R1,R3,D2,X2,B2)		RXF_(0xED,R3,X2,B2,D2,R1,0x0E)
261 #  define MADB(R1,R3,D2,X2,B2)		RXF_(0xED,R3,X2,B2,D2,R1,0x1E)
262 /* MULTIPLY AND SUBTRACT */
263 #  define MSEBR(R1,R3,R2)		RRF_(0xB30F,R1,0,R3,R2)
264 #  define MSDBR(R1,R3,R2)		RRF_(0xB31F,R1,0,R3,R2)
265 #  define MSEB(R1,R3,D2,X2,B2)		RXF_(0xED,R3,X2,B2,D2,R1,0x0F)
266 #  define MSDB(R1,R3,D2,X2,B2)		RXF_(0xED,R3,X2,B2,D2,R1,0x1F)
267 /* SET FPC */
268 #  define SFPC(R1)			RRE_(0xB384,R1,0)
269 /* SET ROUNDING MODE */
270 #  define SRNM(D2,B2)			S_(0xB299,B2,D2)
271 /* SQUARE ROOT */
272 #  define SQEBR(R1,R2)			RRE_(0xB314,R1,R2)
273 #  define SQDBR(R1,R2)			RRE_(0xB315,R1,R2)
274 #  define SQXBR(R1,R2)			RRE_(0xB316,R1,R2)
275 /* STORE FPC */
276 #  define STFPC(D2,B2)			S_(0xB29C,B2,D2)
277 /* SUBTRACT */
278 #  define SEBR(R1,R2)			RRE_(0xB30B,R1,R2)
279 #  define SDBR(R1,R2)			RRE_(0xB31B,R1,R2)
280 #  define SXBR(R1,R2)			RRE_(0xB34B,R1,R2)
281 #  define SEB(R1,D2,X2,B2)		RXE_(0xED,R1,X2,B2,D2,0x0B)
282 #  define SDB(R1,D2,X2,B2)		RXE_(0xED,R1,X2,B2,D2,0x1B)
283 /* TEST DATA CLASS */
284 #  define TCEB(R1,D2,X2,B2)		RXE_(0xED,R1,X2,B2,D2,0x10)
285 #  define TCDB(R1,D2,X2,B2)		RXE_(0xED,R1,X2,B2,D2,0x11)
286 #  define TCXB(R1,D2,X2,B2)		RXE_(0xED,R1,X2,B2,D2,0x12)
287 #  define fp(code,r0,r1,i0)		_fp(_jit,jit_code_##code##i_f,r0,r1,i0)
288 static void _fp(jit_state_t*,jit_code_t,
289 		jit_int32_t,jit_int32_t,jit_float32_t*);
290 #  define dp(code,r0,r1,i0)		_dp(_jit,jit_code_##code##i_d,r0,r1,i0)
291 static void _dp(jit_state_t*,jit_code_t,
292 		jit_int32_t,jit_int32_t,jit_float64_t*);
293 #  define fr(cc,r0,r1,r2)		_fr(_jit,cc,r0,r1,r2)
294 static void _fr(jit_state_t*,jit_int32_t,
295 		jit_int32_t,jit_int32_t,jit_int32_t);
296 #  define dr(cc,r0,r1,r2)		_dr(_jit,cc,r0,r1,r2)
297 static void _dr(jit_state_t*,jit_int32_t,
298 		jit_int32_t,jit_int32_t,jit_int32_t);
299 #  define fi(cc,r0,r1,i0)		_fi(_jit,cc,r0,r1,i0)
300 static void _fi(jit_state_t*,jit_int32_t,
301 		jit_int32_t,jit_int32_t,jit_float32_t*);
302 #  define di(cc,r0,r1,i0)		_di(_jit,cc,r0,r1,i0)
303 static void _di(jit_state_t*,jit_int32_t,
304 		jit_int32_t,jit_int32_t,jit_float64_t*);
305 #  define bfr(cc,i0,r0,r1)		_bfr(_jit,cc,i0,r0,r1)
306 static void _bfr(jit_state_t*,jit_int32_t,
307 		 jit_word_t,jit_int32_t,jit_int32_t);
308 #  define bdr(cc,i0,r0,r1)		_bdr(_jit,cc,i0,r0,r1)
309 static void _bdr(jit_state_t*,jit_int32_t,
310 		 jit_word_t,jit_int32_t,jit_int32_t);
311 #  define bfr_p(cc,i0,r0,r1)		_bfr_p(_jit,cc,i0,r0,r1)
312 static jit_word_t _bfr_p(jit_state_t*,jit_int32_t,
313 			 jit_word_t,jit_int32_t,jit_int32_t);
314 #  define bdr_p(cc,i0,r0,r1)		_bdr_p(_jit,cc,i0,r0,r1)
315 static jit_word_t _bdr_p(jit_state_t*,jit_int32_t,
316 			 jit_word_t,jit_int32_t,jit_int32_t);
317 #  define bfi(cc,i0,r0,i1)		_bfi(_jit,cc,i0,r0,i1)
318 static void _bfi(jit_state_t*,jit_int32_t,
319 		 jit_word_t,jit_int32_t,jit_float32_t*);
320 #  define bdi(cc,i0,r0,i1)		_bdi(_jit,cc,i0,r0,i1)
321 static void _bdi(jit_state_t*,jit_int32_t,
322 		 jit_word_t,jit_int32_t,jit_float64_t*);
323 #  define bfi_p(cc,i0,r0,i1)		_bfi_p(_jit,cc,i0,r0,i1)
324 static jit_word_t _bfi_p(jit_state_t*,jit_int32_t,
325 			 jit_word_t,jit_int32_t,jit_float32_t*);
326 #  define bdi_p(cc,i0,r0,i1)		_bdi_p(_jit,cc,i0,r0,i1)
327 static jit_word_t _bdi_p(jit_state_t*,jit_int32_t,
328 			 jit_word_t,jit_int32_t,jit_float64_t*);
329 #  define buneqr(db,i0,r0,r1)		_buneqr(_jit,db,i0,r0,r1)
330 static jit_word_t _buneqr(jit_state_t*,jit_int32_t,
331 			  jit_word_t,jit_int32_t,jit_int32_t);
332 #  define buneqi(db,i0,r0,i1)		_buneqi(_jit,db,i0,r0,(jit_word_t)i1)
333 static jit_word_t _buneqi(jit_state_t*,jit_int32_t,
334 			  jit_word_t,jit_int32_t,jit_word_t);
335 #  define bltgtr(db,i0,r0,r1)		_bltgtr(_jit,db,i0,r0,r1)
336 static jit_word_t _bltgtr(jit_state_t*,jit_int32_t,
337 			  jit_word_t,jit_int32_t,jit_int32_t);
338 #  define bltgti(db,i0,r0,i1)		_bltgti(_jit,db,i0,r0,(jit_word_t)i1)
339 static jit_word_t _bltgti(jit_state_t*,jit_int32_t,
340 			  jit_word_t,jit_int32_t,jit_word_t);
341 #  define movr_f(r0,r1)			_movr_f(_jit,r0,r1)
342 static void _movr_f(jit_state_t*,jit_int32_t,jit_int32_t);
343 #  define movi_f(r0,i0)			_movi_f(_jit,r0,i0)
344 static void _movi_f(jit_state_t*,jit_int32_t,jit_float32_t*);
345 #  define movr_d(r0,r1)			_movr_d(_jit,r0,r1)
346 static void _movr_d(jit_state_t*,jit_int32_t,jit_int32_t);
347 #  define movi_d(r0,i0)			_movi_d(_jit,r0,i0)
348 static void _movi_d(jit_state_t*,jit_int32_t,jit_float64_t*);
349 #  define absr_f(r0,r1)			LPEBR(r0,r1)
350 #  define absr_d(r0,r1)			LPDBR(r0,r1)
351 #  define negr_f(r0,r1)			LCEBR(r0,r1)
352 #  define negr_d(r0,r1)			LCDBR(r0,r1)
353 #  define sqrtr_f(r0,r1)		SQEBR(r0,r1)
354 #  define sqrtr_d(r0,r1)		SQDBR(r0,r1)
355 #  define truncr_f_i(r0,r1)		CFEBR(r0,RND_ZERO,r1)
356 #  define truncr_d_i(r0,r1)		CFDBR(r0,RND_ZERO,r1)
357 #  if __WORDSIZE == 64
358 #    define truncr_f_l(r0,r1)		CGEBR(r0,RND_ZERO,r1)
359 #    define truncr_d_l(r0,r1)		CGDBR(r0,RND_ZERO,r1)
360 #  endif
361 #  if __WORDSIZE == 32
362 #    define extr_f(r0,r1)		CEFBR(r0,r1)
363 #    define extr_d(r0,r1)		CDFBR(r0,r1)
364 #  else
365 #    define extr_f(r0,r1)		CEGBR(r0,r1)
366 #    define extr_d(r0,r1)		CDGBR(r0,r1)
367 #  endif
368 #  define extr_d_f(r0,r1)		LEDBR(r0,r1)
369 #  define extr_f_d(r0,r1)		LDEBR(r0,r1)
370 #  define addr_f(r0,r1,r2)		_addr_f(_jit,r0,r1,r2)
371 static void _addr_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
372 #  define addi_f(r0,r1,i0)		fp(add,r0,r1,i0)
373 #  define addr_d(r0,r1,r2)		_addr_d(_jit,r0,r1,r2)
374 static void _addr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
375 #  define addi_d(r0,r1,i0)		dp(add,r0,r1,i0)
376 #  define subr_f(r0,r1,r2)		_subr_f(_jit,r0,r1,r2)
377 static void _subr_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
378 #  define subi_f(r0,r1,i0)		fp(sub,r0,r1,i0)
379 #  define subr_d(r0,r1,r2)		_subr_d(_jit,r0,r1,r2)
380 static void _subr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
381 #  define subi_d(r0,r1,i0)		dp(sub,r0,r1,i0)
382 #  define rsbr_f(r0,r1,r2)		subr_f(r0,r2,r1)
383 #  define rsbi_f(r0,r1,i0)		fp(rsb,r0,r1,i0)
384 #  define rsbr_d(r0,r1,r2)		subr_d(r0,r2,r1)
385 #  define rsbi_d(r0,r1,i0)		dp(rsb,r0,r1,i0)
386 #  define mulr_f(r0,r1,r2)		_mulr_f(_jit,r0,r1,r2)
387 static void _mulr_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
388 #  define muli_f(r0,r1,i0)		fp(mul,r0,r1,i0)
389 #  define mulr_d(r0,r1,r2)		_mulr_d(_jit,r0,r1,r2)
390 static void _mulr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
391 #  define muli_d(r0,r1,i0)		dp(mul,r0,r1,i0)
392 #  define divr_f(r0,r1,r2)		_divr_f(_jit,r0,r1,r2)
393 static void _divr_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
394 #  define divi_f(r0,r1,i0)		fp(div,r0,r1,i0)
395 #  define divr_d(r0,r1,r2)		_divr_d(_jit,r0,r1,r2)
396 static void _divr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
397 #  define divi_d(r0,r1,i0)		dp(div,r0,r1,i0)
398 #  define ldr_f(r0,r1)			LE(r0,0,0,r1)
399 #  define ldr_d(r0,r1)			LD(r0,0,0,r1)
400 #  define ldi_f(r0,i0)			_ldi_f(_jit,r0,i0)
401 static void _ldi_f(jit_state_t*,jit_int32_t,jit_word_t);
402 #  define ldi_d(r0,i0)			_ldi_d(_jit,r0,i0)
403 static void _ldi_d(jit_state_t*,jit_int32_t,jit_word_t);
404 #  define ldxr_f(r0,r1,r2)		_ldxr_f(_jit,r0,r1,r2)
405 static void _ldxr_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
406 #  define ldxr_d(r0,r1,r2)		_ldxr_d(_jit,r0,r1,r2)
407 static void _ldxr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
408 #  define ldxi_f(r0,r1,i0)		_ldxi_f(_jit,r0,r1,i0)
409 static void _ldxi_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
410 #  define ldxi_d(r0,r1,i0)		_ldxi_d(_jit,r0,r1,i0)
411 static void _ldxi_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
412 #  define str_f(r0,r1)			STE(r1,0,0,r0)
413 #  define str_d(r0,r1)			STD(r1,0,0,r0)
414 #  define sti_f(i0,r0)			_sti_f(_jit,i0,r0)
415 static void _sti_f(jit_state_t*,jit_word_t,jit_int32_t);
416 #  define sti_d(i0,r0)			_sti_d(_jit,i0,r0)
417 static void _sti_d(jit_state_t*,jit_word_t,jit_int32_t);
418 #  define stxr_f(r0,r1,r2)		_stxr_f(_jit,r0,r1,r2)
419 static void _stxr_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
420 #  define stxr_d(r0,r1,r2)		_stxr_d(_jit,r0,r1,r2)
421 static void _stxr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
422 #  define stxi_f(i0,r0,r1)		_stxi_f(_jit,i0,r0,r1)
423 static void _stxi_f(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
424 #  define stxi_d(i0,r0,r1)		_stxi_d(_jit,i0,r0,r1)
425 static void _stxi_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
426 #  define ltr_f(r0,r1,r2)		fr(CC_L,r0,r1,r2)
427 #  define ltr_d(r0,r1,r2)		dr(CC_L,r0,r1,r2)
428 #  define lti_f(r0,r1,i0)		fi(CC_L,r0,r1,i0)
429 #  define lti_d(r0,r1,i0)		di(CC_L,r0,r1,i0)
430 #  define ler_f(r0,r1,r2)		fr(CC_LE,r0,r1,r2)
431 #  define ler_d(r0,r1,r2)		dr(CC_LE,r0,r1,r2)
432 #  define lei_f(r0,r1,i0)		fi(CC_LE,r0,r1,i0)
433 #  define lei_d(r0,r1,i0)		di(CC_LE,r0,r1,i0)
434 #  define eqr_f(r0,r1,r2)		fr(CC_E,r0,r1,r2)
435 #  define eqr_d(r0,r1,r2)		dr(CC_E,r0,r1,r2)
436 #  define eqi_f(r0,r1,i0)		fi(CC_E,r0,r1,i0)
437 #  define eqi_d(r0,r1,i0)		di(CC_E,r0,r1,i0)
438 #  define ger_f(r0,r1,r2)		fr(CC_HE,r0,r1,r2)
439 #  define ger_d(r0,r1,r2)		dr(CC_HE,r0,r1,r2)
440 #  define gei_f(r0,r1,i0)		fi(CC_HE,r0,r1,i0)
441 #  define gei_d(r0,r1,i0)		di(CC_HE,r0,r1,i0)
442 #  define gtr_f(r0,r1,r2)		fr(CC_H,r0,r1,r2)
443 #  define gtr_d(r0,r1,r2)		dr(CC_H,r0,r1,r2)
444 #  define gti_f(r0,r1,i0)		fi(CC_H,r0,r1,i0)
445 #  define gti_d(r0,r1,i0)		di(CC_H,r0,r1,i0)
446 #  define ner_f(r0,r1,r2)		fr(CC_NE,r0,r1,r2)
447 #  define ner_d(r0,r1,r2)		dr(CC_NE,r0,r1,r2)
448 #  define nei_f(r0,r1,i0)		fi(CC_NE,r0,r1,i0)
449 #  define nei_d(r0,r1,i0)		di(CC_NE,r0,r1,i0)
450 #  define unltr_f(r0,r1,r2)		fr(CC_NHE,r0,r1,r2)
451 #  define unltr_d(r0,r1,r2)		dr(CC_NHE,r0,r1,r2)
452 #  define unlti_f(r0,r1,i0)		fi(CC_NHE,r0,r1,i0)
453 #  define unlti_d(r0,r1,i0)		di(CC_NHE,r0,r1,i0)
454 #  define unler_f(r0,r1,r2)		fr(CC_NH,r0,r1,r2)
455 #  define unler_d(r0,r1,r2)		dr(CC_NH,r0,r1,r2)
456 #  define unlei_f(r0,r1,i0)		fi(CC_NH,r0,r1,i0)
457 #  define unlei_d(r0,r1,i0)		di(CC_NH,r0,r1,i0)
458 #  define uneqr_f(r0,r1,r2)		_uneqr_f(_jit,r0,r1,r2)
459 static void _uneqr_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
460 #  define uneqr_d(r0,r1,r2)		_uneqr_d(_jit,r0,r1,r2)
461 static void _uneqr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
462 #  define uneqi_f(r0,r1,i0)		fp(uneq,r0,r1,i0)
463 #  define uneqi_d(r0,r1,i0)		dp(uneq,r0,r1,i0)
464 #  define unger_f(r0,r1,r2)		fr(CC_NL,r0,r1,r2)
465 #  define unger_d(r0,r1,r2)		dr(CC_NL,r0,r1,r2)
466 #  define ungei_f(r0,r1,i0)		fi(CC_NL,r0,r1,i0)
467 #  define ungei_d(r0,r1,i0)		di(CC_NL,r0,r1,i0)
468 #  define ungtr_f(r0,r1,r2)		fr(CC_NLE,r0,r1,r2)
469 #  define ungtr_d(r0,r1,r2)		dr(CC_NLE,r0,r1,r2)
470 #  define ungti_f(r0,r1,i0)		fi(CC_NLE,r0,r1,i0)
471 #  define ungti_d(r0,r1,i0)		di(CC_NLE,r0,r1,i0)
472 #  define ltgtr_f(r0,r1,r2)		_ltgtr_f(_jit,r0,r1,r2)
473 static void _ltgtr_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
474 #  define ltgtr_d(r0,r1,r2)		_ltgtr_d(_jit,r0,r1,r2)
475 static void _ltgtr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
476 #  define ltgti_f(r0,r1,i0)		fp(ltgt,r0,r1,i0)
477 #  define ltgti_d(r0,r1,i0)		dp(ltgt,r0,r1,i0)
478 #  define ordr_f(r0,r1,r2)		fr(CC_NO,r0,r1,r2)
479 #  define ordr_d(r0,r1,r2)		dr(CC_NO,r0,r1,r2)
480 #  define ordi_f(r0,r1,i0)		fi(CC_NO,r0,r1,i0)
481 #  define ordi_d(r0,r1,i0)		di(CC_NO,r0,r1,i0)
482 #  define unordr_f(r0,r1,r2)		fr(CC_O,r0,r1,r2)
483 #  define unordr_d(r0,r1,r2)		dr(CC_O,r0,r1,r2)
484 #  define unordi_f(r0,r1,i0)		fi(CC_O,r0,r1,i0)
485 #  define unordi_d(r0,r1,i0)		di(CC_O,r0,r1,i0)
486 #  define bltr_f(i0,r0,r1)		bfr(CC_L,i0,r0,r1)
487 #  define bltr_d(i0,r0,r1)		bdr(CC_L,i0,r0,r1)
488 #  define blti_f(i0,r0,i1)		bfi(CC_L,i0,r0,i1)
489 #  define blti_d(i0,r0,i1)		bdi(CC_L,i0,r0,i1)
490 #  define bltr_f_p(i0,r0,r1)		bfr_p(CC_L,i0,r0,r1)
491 #  define bltr_d_p(i0,r0,r1)		bdr_p(CC_L,i0,r0,r1)
492 #  define blti_f_p(i0,r0,i1)		bfi_p(CC_L,i0,r0,i1)
493 #  define blti_d_p(i0,r0,i1)		bdi_p(CC_L,i0,r0,i1)
494 #  define bler_f(i0,r0,r1)		bfr(CC_LE,i0,r0,r1)
495 #  define bler_d(i0,r0,r1)		bdr(CC_LE,i0,r0,r1)
496 #  define blei_f(i0,r0,i1)		bfi(CC_LE,i0,r0,i1)
497 #  define blei_d(i0,r0,i1)		bdi(CC_LE,i0,r0,i1)
498 #  define bler_f_p(i0,r0,r1)		bfr_p(CC_LE,i0,r0,r1)
499 #  define bler_d_p(i0,r0,r1)		bdr_p(CC_LE,i0,r0,r1)
500 #  define blei_f_p(i0,r0,i1)		bfi_p(CC_LE,i0,r0,i1)
501 #  define blei_d_p(i0,r0,i1)		bdi_p(CC_LE,i0,r0,i1)
502 #  define beqr_f(i0,r0,r1)		bfr(CC_E,i0,r0,r1)
503 #  define beqr_d(i0,r0,r1)		bdr(CC_E,i0,r0,r1)
504 #  define beqi_f(i0,r0,i1)		bfi(CC_E,i0,r0,i1)
505 #  define beqi_d(i0,r0,i1)		bdi(CC_E,i0,r0,i1)
506 #  define beqr_f_p(i0,r0,r1)		bfr_p(CC_E,i0,r0,r1)
507 #  define beqr_d_p(i0,r0,r1)		bdr_p(CC_E,i0,r0,r1)
508 #  define beqi_f_p(i0,r0,i1)		bfi_p(CC_E,i0,r0,i1)
509 #  define beqi_d_p(i0,r0,i1)		bdi_p(CC_E,i0,r0,i1)
510 #  define bger_f(i0,r0,r1)		bfr(CC_HE,i0,r0,r1)
511 #  define bger_d(i0,r0,r1)		bdr(CC_HE,i0,r0,r1)
512 #  define bgei_f(i0,r0,i1)		bfi(CC_HE,i0,r0,i1)
513 #  define bgei_d(i0,r0,i1)		bdi(CC_HE,i0,r0,i1)
514 #  define bger_f_p(i0,r0,r1)		bfr_p(CC_HE,i0,r0,r1)
515 #  define bger_d_p(i0,r0,r1)		bdr_p(CC_HE,i0,r0,r1)
516 #  define bgei_f_p(i0,r0,i1)		bfi_p(CC_HE,i0,r0,i1)
517 #  define bgei_d_p(i0,r0,i1)		bdi_p(CC_HE,i0,r0,i1)
518 #  define bgtr_f(i0,r0,r1)		bfr(CC_H,i0,r0,r1)
519 #  define bgtr_d(i0,r0,r1)		bdr(CC_H,i0,r0,r1)
520 #  define bgti_f(i0,r0,i1)		bfi(CC_H,i0,r0,i1)
521 #  define bgti_d(i0,r0,i1)		bdi(CC_H,i0,r0,i1)
522 #  define bgtr_f_p(i0,r0,r1)		bfr_p(CC_H,i0,r0,r1)
523 #  define bgtr_d_p(i0,r0,r1)		bdr_p(CC_H,i0,r0,r1)
524 #  define bgti_f_p(i0,r0,i1)		bfi_p(CC_H,i0,r0,i1)
525 #  define bgti_d_p(i0,r0,i1)		bdi_p(CC_H,i0,r0,i1)
526 #  define bner_f(i0,r0,r1)		bfr(CC_NE,i0,r0,r1)
527 #  define bner_d(i0,r0,r1)		bdr(CC_NE,i0,r0,r1)
528 #  define bnei_f(i0,r0,i1)		bfi(CC_NE,i0,r0,i1)
529 #  define bnei_d(i0,r0,i1)		bdi(CC_NE,i0,r0,i1)
530 #  define bner_f_p(i0,r0,r1)		bfr_p(CC_NE,i0,r0,r1)
531 #  define bner_d_p(i0,r0,r1)		bdr_p(CC_NE,i0,r0,r1)
532 #  define bnei_f_p(i0,r0,i1)		bfi_p(CC_NE,i0,r0,i1)
533 #  define bnei_d_p(i0,r0,i1)		bdi_p(CC_NE,i0,r0,i1)
534 #  define bunltr_f(i0,r0,r1)		bfr(CC_NHE,i0,r0,r1)
535 #  define bunltr_d(i0,r0,r1)		bdr(CC_NHE,i0,r0,r1)
536 #  define bunlti_f(i0,r0,i1)		bfi(CC_NHE,i0,r0,i1)
537 #  define bunlti_d(i0,r0,i1)		bdi(CC_NHE,i0,r0,i1)
538 #  define bunltr_f_p(i0,r0,r1)		bfr_p(CC_NHE,i0,r0,r1)
539 #  define bunltr_d_p(i0,r0,r1)		bdr_p(CC_NHE,i0,r0,r1)
540 #  define bunlti_f_p(i0,r0,i1)		bfi_p(CC_NHE,i0,r0,i1)
541 #  define bunlti_d_p(i0,r0,i1)		bdi_p(CC_NHE,i0,r0,i1)
542 #  define bunler_f(i0,r0,r1)		bfr(CC_NH,i0,r0,r1)
543 #  define bunler_d(i0,r0,r1)		bdr(CC_NH,i0,r0,r1)
544 #  define bunlei_f(i0,r0,i1)		bfi(CC_NH,i0,r0,i1)
545 #  define bunlei_d(i0,r0,i1)		bdi(CC_NH,i0,r0,i1)
546 #  define bunler_f_p(i0,r0,r1)		bfr_p(CC_NH,i0,r0,r1)
547 #  define bunler_d_p(i0,r0,r1)		bdr_p(CC_NH,i0,r0,r1)
548 #  define bunlei_f_p(i0,r0,i1)		bfi_p(CC_NH,i0,r0,i1)
549 #  define bunlei_d_p(i0,r0,i1)		bdi_p(CC_NH,i0,r0,i1)
550 #  define buneqr_f(i0,r0,r1)		buneqr(0,i0,r0,r1)
551 #  define buneqr_d(i0,r0,r1)		buneqr(1,i0,r0,r1)
552 #  define buneqi_f(i0,r0,i1)		buneqi(0,i0,r0,i1)
553 #  define buneqi_d(i0,r0,i1)		buneqi(1,i0,r0,i1)
554 #  define buneqr_f_p(i0,r0,r1)		buneqr(0,i0,r0,r1)
555 #  define buneqr_d_p(i0,r0,r1)		buneqr(1,i0,r0,r1)
556 #  define buneqi_f_p(i0,r0,i1)		buneqi(0,i0,r0,i1)
557 #  define buneqi_d_p(i0,r0,i1)		buneqi(1,i0,r0,i1)
558 #  define bunger_f(i0,r0,r1)		bfr(CC_NL,i0,r0,r1)
559 #  define bunger_d(i0,r0,r1)		bdr(CC_NL,i0,r0,r1)
560 #  define bungei_f(i0,r0,i1)		bfi(CC_NL,i0,r0,i1)
561 #  define bungei_d(i0,r0,i1)		bdi(CC_NL,i0,r0,i1)
562 #  define bunger_f_p(i0,r0,r1)		bfr_p(CC_NL,i0,r0,r1)
563 #  define bunger_d_p(i0,r0,r1)		bdr_p(CC_NL,i0,r0,r1)
564 #  define bungei_f_p(i0,r0,i1)		bfi_p(CC_NL,i0,r0,i1)
565 #  define bungei_d_p(i0,r0,i1)		bdi_p(CC_NL,i0,r0,i1)
566 #  define bungtr_f(i0,r0,r1)		bfr(CC_NLE,i0,r0,r1)
567 #  define bungtr_d(i0,r0,r1)		bdr(CC_NLE,i0,r0,r1)
568 #  define bungti_f(i0,r0,i1)		bfi(CC_NLE,i0,r0,i1)
569 #  define bungti_d(i0,r0,i1)		bdi(CC_NLE,i0,r0,i1)
570 #  define bungtr_f_p(i0,r0,r1)		bfr_p(CC_NLE,i0,r0,r1)
571 #  define bungtr_d_p(i0,r0,r1)		bdr_p(CC_NLE,i0,r0,r1)
572 #  define bungti_f_p(i0,r0,i1)		bfi_p(CC_NLE,i0,r0,i1)
573 #  define bungti_d_p(i0,r0,i1)		bdi_p(CC_NLE,i0,r0,i1)
574 #  define bltgtr_f(i0,r0,r1)		bltgtr(0,i0,r0,r1)
575 #  define bltgtr_d(i0,r0,r1)		bltgtr(1,i0,r0,r1)
576 #  define bltgti_f(i0,r0,i1)		bltgti(0,i0,r0,i1)
577 #  define bltgti_d(i0,r0,i1)		bltgti(1,i0,r0,i1)
578 #  define bltgtr_f_p(i0,r0,r1)		bltgtr(0,i0,r0,r1)
579 #  define bltgtr_d_p(i0,r0,r1)		bltgtr(1,i0,r0,r1)
580 #  define bltgti_f_p(i0,r0,i1)		bltgti(0,i0,r0,i1)
581 #  define bltgti_d_p(i0,r0,i1)		bltgti(1,i0,r0,i1)
582 #  define bordr_f(i0,r0,r1)		bfr(CC_NO,i0,r0,r1)
583 #  define bordr_d(i0,r0,r1)		bdr(CC_NO,i0,r0,r1)
584 #  define bordi_f(i0,r0,i1)		bfi(CC_NO,i0,r0,i1)
585 #  define bordi_d(i0,r0,i1)		bdi(CC_NO,i0,r0,i1)
586 #  define bordr_f_p(i0,r0,r1)		bfr_p(CC_NO,i0,r0,r1)
587 #  define bordr_d_p(i0,r0,r1)		bdr_p(CC_NO,i0,r0,r1)
588 #  define bordi_f_p(i0,r0,i1)		bfi_p(CC_NO,i0,r0,i1)
589 #  define bordi_d_p(i0,r0,i1)		bdi_p(CC_NO,i0,r0,i1)
590 #  define bunordr_f(i0,r0,r1)		bfr(CC_O,i0,r0,r1)
591 #  define bunordr_d(i0,r0,r1)		bdr(CC_O,i0,r0,r1)
592 #  define bunordi_f(i0,r0,i1)		bfi(CC_O,i0,r0,i1)
593 #  define bunordi_d(i0,r0,i1)		bdi(CC_O,i0,r0,i1)
594 #  define bunordr_f_p(i0,r0,r1)		bfr_p(CC_O,i0,r0,r1)
595 #  define bunordr_d_p(i0,r0,r1)		bdr_p(CC_O,i0,r0,r1)
596 #  define bunordi_f_p(i0,r0,i1)		bfi_p(CC_O,i0,r0,i1)
597 #  define bunordi_d_p(i0,r0,i1)		bdi_p(CC_O,i0,r0,i1)
598 #  define vaarg_d(r0, r1)		_vaarg_d(_jit, r0, r1)
599 static void _vaarg_d(jit_state_t*, jit_int32_t, jit_int32_t);
600 #endif
601 
602 #if CODE
603 static void
_fp(jit_state_t * _jit,jit_code_t code,jit_int32_t r0,jit_int32_t r1,jit_float32_t * i0)604 _fp(jit_state_t *_jit, jit_code_t code,
605     jit_int32_t r0, jit_int32_t r1, jit_float32_t *i0)
606 {
607     jit_int32_t		reg;
608     reg = jit_get_reg(jit_class_fpr);
609     movi_f(rn(reg), i0);
610     switch (code) {
611 	case jit_code_addi_f:	addr_f(r0, r1, rn(reg));	break;
612 	case jit_code_subi_f:	subr_f(r0, r1, rn(reg));	break;
613 	case jit_code_rsbi_f:	rsbr_f(r0, r1, rn(reg));	break;
614 	case jit_code_muli_f:	mulr_f(r0, r1, rn(reg));	break;
615 	case jit_code_divi_f:	divr_f(r0, r1, rn(reg));	break;
616 	case jit_code_uneqi_f:	uneqr_f(r0, r1, rn(reg));	break;
617 	case jit_code_ltgti_f:	ltgtr_f(r0, r1, rn(reg));	break;
618 	default:		abort();
619     }
620     jit_unget_reg(reg);
621 }
622 
623 static void
_dp(jit_state_t * _jit,jit_code_t code,jit_int32_t r0,jit_int32_t r1,jit_float64_t * i0)624 _dp(jit_state_t *_jit, jit_code_t code,
625     jit_int32_t r0, jit_int32_t r1, jit_float64_t *i0)
626 {
627     jit_int32_t		reg;
628     reg = jit_get_reg(jit_class_fpr);
629     movi_d(rn(reg), i0);
630     switch (code) {
631 	case jit_code_addi_d:	addr_d(r0, r1, rn(reg));	break;
632 	case jit_code_subi_d:	subr_d(r0, r1, rn(reg));	break;
633 	case jit_code_rsbi_d:	rsbr_d(r0, r1, rn(reg));	break;
634 	case jit_code_muli_d:	mulr_d(r0, r1, rn(reg));	break;
635 	case jit_code_divi_d:	divr_d(r0, r1, rn(reg));	break;
636 	case jit_code_uneqi_d:	uneqr_d(r0, r1, rn(reg));	break;
637 	case jit_code_ltgti_d:	ltgtr_d(r0, r1, rn(reg));	break;
638 	default:		abort();
639     }
640     jit_unget_reg(reg);
641 }
642 
643 static void
_fr(jit_state_t * _jit,jit_int32_t cc,jit_int32_t r0,jit_int32_t r1,jit_int32_t r2)644 _fr(jit_state_t *_jit, jit_int32_t cc,
645      jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
646 {
647     jit_word_t		w;
648     LGHI(r0, 1);
649     CEBR(r1, r2);
650     w = _jit->pc.w;
651     BRC(cc, 0);
652     LGHI(r0, 0);
653     patch_at(w, _jit->pc.w);
654 }
655 
656 static void
_dr(jit_state_t * _jit,jit_int32_t cc,jit_int32_t r0,jit_int32_t r1,jit_int32_t r2)657 _dr(jit_state_t *_jit, jit_int32_t cc,
658      jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
659 {
660     jit_word_t		w;
661     LGHI(r0, 1);
662     CDBR(r1, r2);
663     w = _jit->pc.w;
664     BRC(cc, 0);
665     LGHI(r0, 0);
666     patch_at(w, _jit->pc.w);
667 }
668 
669 static void
_fi(jit_state_t * _jit,jit_int32_t cc,jit_int32_t r0,jit_int32_t r1,jit_float32_t * i0)670 _fi(jit_state_t *_jit, jit_int32_t cc,
671      jit_int32_t r0, jit_int32_t r1, jit_float32_t *i0)
672 {
673     jit_int32_t		reg;
674     reg = jit_get_reg(jit_class_fpr|jit_class_nospill);
675     movi_f(rn(reg), i0);
676     fr(cc, r0, r1, rn(reg));
677     jit_unget_reg(reg);
678 }
679 
680 static void
_di(jit_state_t * _jit,jit_int32_t cc,jit_int32_t r0,jit_int32_t r1,jit_float64_t * i0)681 _di(jit_state_t *_jit, jit_int32_t cc,
682      jit_int32_t r0, jit_int32_t r1, jit_float64_t *i0)
683 {
684     jit_int32_t		reg;
685     reg = jit_get_reg(jit_class_fpr|jit_class_nospill);
686     movi_d(rn(reg), i0);
687     dr(cc, r0, r1, rn(reg));
688     jit_unget_reg(reg);
689 }
690 
691 
692 static void
_bfr(jit_state_t * _jit,jit_int32_t cc,jit_word_t i0,jit_int32_t r0,jit_int32_t r1)693 _bfr(jit_state_t *_jit, jit_int32_t cc,
694      jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
695 {
696     jit_word_t		d;
697     CEBR(r0, r1);
698     d = (i0 - _jit->pc.w) >> 1;
699     if (s16_p(d))
700 	BRC(cc, x16(d));
701     else {
702 	assert(s32_p(d));
703 	BRCL(cc, d);
704     }
705 }
706 
707 static void
_bdr(jit_state_t * _jit,jit_int32_t cc,jit_word_t i0,jit_int32_t r0,jit_int32_t r1)708 _bdr(jit_state_t *_jit, jit_int32_t cc,
709      jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
710 {
711     jit_word_t		d;
712     CDBR(r0, r1);
713     d = (i0 - _jit->pc.w) >> 1;
714     if (s16_p(d))
715 	BRC(cc, x16(d));
716     else {
717 	assert(s32_p(d));
718 	BRCL(cc, d);
719     }
720 }
721 
722 static jit_word_t
_bfr_p(jit_state_t * _jit,jit_int32_t cc,jit_word_t i0,jit_int32_t r0,jit_int32_t r1)723 _bfr_p(jit_state_t *_jit, jit_int32_t cc,
724        jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
725 {
726     jit_word_t		w;
727     CEBR(r0, r1);
728     w = _jit->pc.w;
729     BRCL(cc, 0);
730     return (w);
731 }
732 
733 static jit_word_t
_bdr_p(jit_state_t * _jit,jit_int32_t cc,jit_word_t i0,jit_int32_t r0,jit_int32_t r1)734 _bdr_p(jit_state_t *_jit, jit_int32_t cc,
735        jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
736 {
737     jit_word_t		w;
738     CDBR(r0, r1);
739     w = _jit->pc.w;
740     BRCL(cc, 0);
741     return (w);
742 }
743 
744 static void
_bfi(jit_state_t * _jit,jit_int32_t cc,jit_word_t i0,jit_int32_t r0,jit_float32_t * i1)745 _bfi(jit_state_t *_jit, jit_int32_t cc,
746      jit_word_t i0, jit_int32_t r0, jit_float32_t *i1)
747 {
748     jit_int32_t		reg;
749     reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
750     movi_f(rn(reg), i1);
751     bfr(cc, i0, r0, rn(reg));
752     jit_unget_reg(reg);
753 }
754 
755 static void
_bdi(jit_state_t * _jit,jit_int32_t cc,jit_word_t i0,jit_int32_t r0,jit_float64_t * i1)756 _bdi(jit_state_t *_jit, jit_int32_t cc,
757      jit_word_t i0, jit_int32_t r0, jit_float64_t *i1)
758 {
759     jit_int32_t		reg;
760     reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
761     movi_d(rn(reg), i1);
762     bdr(cc, i0, r0, rn(reg));
763     jit_unget_reg(reg);
764 }
765 
766 static jit_word_t
_bfi_p(jit_state_t * _jit,jit_int32_t cc,jit_word_t i0,jit_int32_t r0,jit_float32_t * i1)767 _bfi_p(jit_state_t *_jit, jit_int32_t cc,
768      jit_word_t i0, jit_int32_t r0, jit_float32_t *i1)
769 {
770     jit_word_t		w;
771     jit_int32_t		reg;
772     reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
773     movi_f(rn(reg), i1);
774     w = bfr_p(cc, i0, r0, rn(reg));
775     jit_unget_reg(reg);
776     return (w);
777 }
778 
779 static jit_word_t
_bdi_p(jit_state_t * _jit,jit_int32_t cc,jit_word_t i0,jit_int32_t r0,jit_float64_t * i1)780 _bdi_p(jit_state_t *_jit, jit_int32_t cc,
781      jit_word_t i0, jit_int32_t r0, jit_float64_t *i1)
782 {
783     jit_word_t		w;
784     jit_int32_t		reg;
785     reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
786     movi_d(rn(reg), i1);
787     w = bdr_p(cc, i0, r0, rn(reg));
788     jit_unget_reg(reg);
789     return (w);
790 }
791 
792 static jit_word_t
_buneqr(jit_state_t * _jit,jit_int32_t db,jit_word_t i0,jit_int32_t r0,jit_int32_t r1)793 _buneqr(jit_state_t *_jit, jit_int32_t db,
794 	jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
795 {
796     jit_word_t		unord, ne, w;
797     if (db)	CDBR(r0, r1);
798     else	CEBR(r0, r1);
799     unord = _jit->pc.w;
800     BRC(CC_O, 0);			/* unord satisfies condition */
801     ne = _jit->pc.w;
802     BRC(CC_NE, 0);			/* ne does not satisfy condition */
803     patch_at(unord, _jit->pc.w);
804     w = _jit->pc.w;
805     BRCL(CC_AL, (i0 - _jit->pc.w) >> 1);
806     patch_at(ne, _jit->pc.w);
807     return (w);
808 }
809 
810 static jit_word_t
_buneqi(jit_state_t * _jit,jit_int32_t db,jit_word_t i0,jit_int32_t r0,jit_word_t i1)811 _buneqi(jit_state_t *_jit, jit_int32_t db,
812 	jit_word_t i0, jit_int32_t r0, jit_word_t i1)
813 {
814     jit_word_t		w;
815     jit_int32_t		reg;
816     reg = jit_get_reg(jit_class_fpr|jit_class_nospill);
817     if (db)
818 	movi_d(rn(reg), (jit_float64_t *)i1);
819     else
820 	movi_f(rn(reg), (jit_float32_t *)i1);
821     w = buneqr(db, i0, r0, rn(reg));
822     jit_unget_reg(reg);
823     return (w);
824 }
825 
826 static jit_word_t
_bltgtr(jit_state_t * _jit,jit_int32_t db,jit_word_t i0,jit_int32_t r0,jit_int32_t r1)827 _bltgtr(jit_state_t *_jit, jit_int32_t db,
828 	jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
829 {
830     jit_word_t		unord, eq, w;
831     if (db)	CDBR(r0, r1);
832     else	CEBR(r0, r1);
833     unord = _jit->pc.w;
834     BRC(CC_O, 0);			/* unord does not satisfy condition */
835     eq = _jit->pc.w;
836     BRC(CC_E, 0);			/* eq does not satisfy condition */
837     w = _jit->pc.w;
838     BRCL(CC_AL, (i0 - _jit->pc.w) >> 1);
839     patch_at(unord, _jit->pc.w);
840     patch_at(eq, _jit->pc.w);
841     return (w);
842 }
843 
844 static jit_word_t
_bltgti(jit_state_t * _jit,jit_int32_t db,jit_word_t i0,jit_int32_t r0,jit_word_t i1)845 _bltgti(jit_state_t *_jit, jit_int32_t db,
846 	jit_word_t i0, jit_int32_t r0, jit_word_t i1)
847 {
848     jit_word_t		w;
849     jit_int32_t		reg;
850     reg = jit_get_reg(jit_class_fpr|jit_class_nospill);
851     if (db)
852 	movi_d(rn(reg), (jit_float64_t *)i1);
853     else
854 	movi_f(rn(reg), (jit_float32_t *)i1);
855     w = bltgtr(db, i0, r0, rn(reg));
856     jit_unget_reg(reg);
857     return (w);
858 }
859 
860 static void
_movr_f(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1)861 _movr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
862 {
863     if (r0 != r1)
864 	LER(r0, r1);
865 }
866 
867 static void
_movi_f(jit_state_t * _jit,jit_int32_t r0,jit_float32_t * i0)868 _movi_f(jit_state_t *_jit, jit_int32_t r0, jit_float32_t *i0)
869 {
870     union {
871 	jit_int32_t	 i;
872 	jit_float32_t	 f;
873     } data;
874     jit_int32_t		 reg;
875 
876     if (*(jit_int32_t *)i0 == 0)
877 	LZER(r0);
878     else if (_jitc->no_data) {
879 	data.f = *i0;
880 	reg = jit_get_reg_but_zero(0);
881 	movi(rn(reg), data.i & 0xffffffff);
882 	stxi_i(-4, _FP_REGNO, rn(reg));
883 	jit_unget_reg_but_zero(reg);
884 	ldxi_f(r0, _FP_REGNO, -4);
885     }
886     else
887 	ldi_f(r0, (jit_word_t)i0);
888 }
889 
890 static void
_movr_d(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1)891 _movr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
892 {
893     if (r0 != r1)
894 	LDR(r0, r1);
895 }
896 
897 static void
_movi_d(jit_state_t * _jit,jit_int32_t r0,jit_float64_t * i0)898 _movi_d(jit_state_t *_jit, jit_int32_t r0, jit_float64_t *i0)
899 {
900     union {
901 #if __WORDSIZE == 32
902 	jit_int32_t	 i[2];
903 #else
904 	jit_int64_t	 l;
905 #endif
906 	jit_float64_t	 d;
907     } data;
908     jit_int32_t		 reg;
909 
910     if (*(jit_int64_t *)i0 == 0)
911 	LZDR(r0);
912     else if (_jitc->no_data) {
913 	data.d = *i0;
914 	reg = jit_get_reg_but_zero(0);
915 #if __WORDSIZE == 32
916 	movi(rn(reg), data.i[0]);
917 	stxi_i(-8, _FP_REGNO, rn(reg));
918 	movi(rn(reg), data.i[1]);
919 	stxi_i(-4, _FP_REGNO, rn(reg));
920 #else
921 	movi(rn(reg), data.l);
922 	stxi_l(-8, _FP_REGNO, rn(reg));
923 #endif
924 	jit_unget_reg_but_zero(reg);
925 	ldxi_d(r0, _FP_REGNO, -8);
926     }
927     else
928 	ldi_d(r0, (jit_word_t)i0);
929 }
930 
931 static void
_addr_f(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_int32_t r2)932 _addr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
933 {
934     if (r0 == r2)
935 	AEBR(r0, r1);
936     else {
937 	movr_f(r0, r1);
938 	AEBR(r0, r2);
939     }
940 }
941 
942 static void
_addr_d(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_int32_t r2)943 _addr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
944 {
945     if (r0 == r2)
946 	ADBR(r0, r1);
947     else {
948 	movr_d(r0, r1);
949 	ADBR(r0, r2);
950     }
951 }
952 
953 static void
_subr_f(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_int32_t r2)954 _subr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
955 {
956     jit_int32_t		reg;
957     if (r0 == r2) {
958 	reg = jit_get_reg(jit_class_fpr);
959 	movr_f(rn(reg), r2);
960 	movr_f(r0, r1);
961 	SEBR(r0, rn(reg));
962 	jit_unget_reg(reg);
963     }
964     else {
965 	movr_f(r0, r1);
966 	SEBR(r0, r2);
967     }
968 }
969 
970 static void
_subr_d(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_int32_t r2)971 _subr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
972 {
973     jit_int32_t		reg;
974     if (r0 == r2) {
975 	reg = jit_get_reg(jit_class_fpr);
976 	movr_d(rn(reg), r2);
977 	movr_d(r0, r1);
978 	SDBR(r0, rn(reg));
979 	jit_unget_reg(reg);
980     }
981     else {
982 	movr_d(r0, r1);
983 	SDBR(r0, r2);
984     }
985 }
986 
987 static void
_mulr_f(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_int32_t r2)988 _mulr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
989 {
990     if (r0 == r2)
991 	MEEBR(r0, r1);
992     else {
993 	movr_f(r0, r1);
994 	MEEBR(r0, r2);
995     }
996 }
997 
998 static void
_mulr_d(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_int32_t r2)999 _mulr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1000 {
1001     if (r0 == r2)
1002 	MDBR(r0, r1);
1003     else {
1004 	movr_d(r0, r1);
1005 	MDBR(r0, r2);
1006     }
1007 }
1008 
1009 static void
_divr_f(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_int32_t r2)1010 _divr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1011 {
1012     jit_int32_t		reg;
1013     if (r0 == r2) {
1014 	reg = jit_get_reg(jit_class_fpr);
1015 	movr_f(rn(reg), r2);
1016 	movr_f(r0, r1);
1017 	DEBR(r0, rn(reg));
1018 	jit_unget_reg(reg);
1019     }
1020     else {
1021 	movr_f(r0, r1);
1022 	DEBR(r0, r2);
1023     }
1024 }
1025 
1026 static void
_divr_d(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_int32_t r2)1027 _divr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1028 {
1029     jit_int32_t		reg;
1030     if (r0 == r2) {
1031 	reg = jit_get_reg(jit_class_fpr);
1032 	movr_d(rn(reg), r2);
1033 	movr_d(r0, r1);
1034 	DDBR(r0, rn(reg));
1035 	jit_unget_reg(reg);
1036     }
1037     else {
1038 	movr_d(r0, r1);
1039 	DDBR(r0, r2);
1040     }
1041 }
1042 
1043 static void
_ldi_f(jit_state_t * _jit,jit_int32_t r0,jit_word_t i0)1044 _ldi_f(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
1045 {
1046     jit_int32_t		reg;
1047     reg = jit_get_reg_but_zero(0);
1048     movi(rn(reg), i0);
1049     ldr_f(r0, rn(reg));
1050     jit_unget_reg_but_zero(reg);
1051 }
1052 
1053 static void
_ldi_d(jit_state_t * _jit,jit_int32_t r0,jit_word_t i0)1054 _ldi_d(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
1055 {
1056     jit_int32_t		reg;
1057     reg = jit_get_reg_but_zero(0);
1058     movi(rn(reg), i0);
1059     ldr_d(r0, rn(reg));
1060     jit_unget_reg_but_zero(reg);
1061 }
1062 
1063 static void
_ldxr_f(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_int32_t r2)1064 _ldxr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1065 {
1066     jit_int32_t		reg;
1067     reg = jit_get_reg_but_zero(0);
1068     movr(rn(reg), r1);
1069     addr(rn(reg), rn(reg), r2);
1070     ldr_f(r0, rn(reg));
1071     jit_unget_reg_but_zero(reg);
1072 }
1073 
1074 static void
_ldxr_d(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_int32_t r2)1075 _ldxr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1076 {
1077     jit_int32_t		reg;
1078     reg = jit_get_reg_but_zero(0);
1079     movr(rn(reg), r1);
1080     addr(rn(reg), rn(reg), r2);
1081     ldr_d(r0, rn(reg));
1082     jit_unget_reg_but_zero(reg);
1083 }
1084 
1085 static void
_ldxi_f(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_word_t i0)1086 _ldxi_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1087 {
1088     jit_int32_t		reg;
1089     if (u12_p(i0))
1090 	LE(r0, i0, 0, r1);
1091     else if (s20_p(i0))
1092 	LEY(r0, x20(i0), 0, r1);
1093     else {
1094 	reg = jit_get_reg_but_zero(0);
1095 	movi(rn(reg), i0);
1096 	addr(rn(reg), rn(reg), r1);
1097 	ldr_f(r0, rn(reg));
1098 	jit_unget_reg_but_zero(reg);
1099     }
1100 }
1101 
1102 static void
_ldxi_d(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_word_t i0)1103 _ldxi_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1104 {
1105     jit_int32_t		reg;
1106     if (u12_p(i0))
1107 	LD(r0, i0, 0, r1);
1108     else if (s20_p(i0))
1109 	LDY(r0, x20(i0), 0, r1);
1110     else {
1111 	reg = jit_get_reg_but_zero(0);
1112 	movi(rn(reg), i0);
1113 	addr(rn(reg), rn(reg), r1);
1114 	ldr_d(r0, rn(reg));
1115 	jit_unget_reg_but_zero(reg);
1116     }
1117 }
1118 
1119 static void
_sti_f(jit_state_t * _jit,jit_word_t i0,jit_int32_t r0)1120 _sti_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
1121 {
1122     jit_int32_t		reg;
1123     reg = jit_get_reg_but_zero(0);
1124     movi(rn(reg), i0);
1125     str_f(rn(reg), r0);
1126     jit_unget_reg_but_zero(reg);
1127 }
1128 
1129 static void
_sti_d(jit_state_t * _jit,jit_word_t i0,jit_int32_t r0)1130 _sti_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
1131 {
1132     jit_int32_t		reg;
1133     reg = jit_get_reg_but_zero(0);
1134     movi(rn(reg), i0);
1135     str_d(rn(reg), r0);
1136     jit_unget_reg_but_zero(reg);
1137 }
1138 
1139 static void
_stxr_f(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_int32_t r2)1140 _stxr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1141 {
1142     jit_int32_t		reg;
1143     reg = jit_get_reg_but_zero(0);
1144     movr(rn(reg), r0);
1145     addr(rn(reg), rn(reg), r1);
1146     str_f(rn(reg), r2);
1147     jit_unget_reg_but_zero(reg);
1148 }
1149 
1150 static void
_stxr_d(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_int32_t r2)1151 _stxr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1152 {
1153     jit_int32_t		reg;
1154     reg = jit_get_reg_but_zero(0);
1155     movr(rn(reg), r0);
1156     addr(rn(reg), rn(reg), r1);
1157     str_d(rn(reg), r2);
1158     jit_unget_reg_but_zero(reg);
1159 }
1160 
1161 static void
_stxi_f(jit_state_t * _jit,jit_word_t i0,jit_int32_t r0,jit_int32_t r1)1162 _stxi_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
1163 {
1164     jit_int32_t		reg;
1165     if (u12_p(i0))
1166 	STE(r1, i0, 0, r0);
1167     else if (s20_p(i0))
1168 	STEY(r1, x20(i0), 0, r0);
1169     else {
1170 	reg = jit_get_reg_but_zero(0);
1171 	movi(rn(reg), i0);
1172 	addr(rn(reg), rn(reg), r0);
1173 	str_f(rn(reg), r1);
1174 	jit_unget_reg_but_zero(reg);
1175     }
1176 }
1177 
1178 static void
_stxi_d(jit_state_t * _jit,jit_word_t i0,jit_int32_t r0,jit_int32_t r1)1179 _stxi_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
1180 {
1181     jit_int32_t		reg;
1182     if (u12_p(i0))
1183 	STD(r1, i0, 0, r0);
1184     else if (s20_p(i0))
1185 	STDY(r1, x20(i0), 0, r0);
1186     else {
1187 	reg = jit_get_reg_but_zero(0);
1188 	movi(rn(reg), i0);
1189 	addr(rn(reg), rn(reg), r0);
1190 	str_d(rn(reg), r1);
1191 	jit_unget_reg_but_zero(reg);
1192     }
1193 }
1194 
1195 static void
_uneqr_f(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_int32_t r2)1196 _uneqr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1197 {
1198     jit_word_t		unord, eq;
1199     movi(r0, 1);			/* set to one */
1200     CEBR(r1, r2);
1201     unord = _jit->pc.w;			/* keep set to one if unord */
1202     BRC(CC_O, 0);
1203     eq = _jit->pc.w;
1204     BRC(CC_E, 0);			/* keep set to one if eq */
1205     movi(r0, 0);			/* set to zero */
1206     patch_at(unord, _jit->pc.w);
1207     patch_at(eq, _jit->pc.w);
1208 }
1209 
1210 static void
_uneqr_d(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_int32_t r2)1211 _uneqr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1212 {
1213     jit_word_t		unord, eq;
1214     movi(r0, 1);			/* set to one */
1215     CDBR(r1, r2);
1216     unord = _jit->pc.w;			/* keep set to one if unord */
1217     BRC(CC_O, 0);
1218     eq = _jit->pc.w;
1219     BRC(CC_E, 0);			/* keep set to one if eq */
1220     movi(r0, 0);			/* set to zero */
1221     patch_at(unord, _jit->pc.w);
1222     patch_at(eq, _jit->pc.w);
1223 }
1224 
1225 static void
_ltgtr_f(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_int32_t r2)1226 _ltgtr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1227 {
1228     jit_word_t		unord, eq;
1229     movi(r0, 0);			/* set to zero */
1230     CEBR(r1, r2);
1231     unord = _jit->pc.w;			/* keep set to zero if unord */
1232     BRC(CC_O, 0);
1233     eq = _jit->pc.w;
1234     BRC(CC_E, 0);			/* keep set to zero if eq */
1235     movi(r0, 1);			/* set to one */
1236     patch_at(unord, _jit->pc.w);
1237     patch_at(eq, _jit->pc.w);
1238 }
1239 
1240 static void
_ltgtr_d(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_int32_t r2)1241 _ltgtr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1242 {
1243     jit_word_t		unord, eq;
1244     movi(r0, 0);			/* set to zero */
1245     CDBR(r1, r2);
1246     unord = _jit->pc.w;			/* keep set to zero if unord */
1247     BRC(CC_O, 0);
1248     eq = _jit->pc.w;
1249     BRC(CC_E, 0);			/* keep set to zero if eq */
1250     movi(r0, 1);			/* set to one */
1251     patch_at(unord, _jit->pc.w);
1252     patch_at(eq, _jit->pc.w);
1253 }
1254 
1255 static void
_vaarg_d(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1)1256 _vaarg_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1257 {
1258     jit_int32_t		rg0;
1259     jit_int32_t		rg1;
1260     jit_int32_t		rg2;
1261     jit_word_t		ge_code;
1262     jit_word_t		lt_code;
1263 
1264     assert(_jitc->function->self.call & jit_call_varargs);
1265 
1266     rg0 = jit_get_reg_but_zero(jit_class_gpr);
1267     rg1 = jit_get_reg_but_zero(jit_class_gpr);
1268 
1269     /* Load the fp offset in save area in the first temporary. */
1270     ldxi(rn(rg0), r1, offsetof(jit_va_list_t, fpoff));
1271 
1272     /* Jump over if there are no remaining arguments in the save area. */
1273     ge_code = bgei_p(_jit->pc.w, rn(rg0), NUM_FLOAT_REG_ARGS);
1274 
1275     /* Load the save area pointer in the second temporary. */
1276     ldxi(rn(rg1), r1, offsetof(jit_va_list_t, save));
1277 
1278     /* Scale offset. */
1279     rg2 = jit_get_reg_but_zero(0);
1280     lshi(rn(rg2), rn(rg0), 3);
1281     /* Add offset to saved area */
1282     addi(rn(rg2), rn(rg2), 16 * sizeof(jit_word_t));
1283 
1284     /* Load the vararg argument in the first argument. */
1285     ldxr_d(r0, rn(rg1), rn(rg2));
1286     jit_unget_reg_but_zero(rg2);
1287 
1288     /* Update the fp offset. */
1289     addi(rn(rg0), rn(rg0), 1);
1290     stxi(offsetof(jit_va_list_t, fpoff), r1, rn(rg0));
1291 
1292     /* Will only need one temporary register below. */
1293     jit_unget_reg_but_zero(rg1);
1294 
1295     /* Jump over overflow code. */
1296     lt_code = jmpi_p(_jit->pc.w);
1297 
1298     /* Where to land if argument is in overflow area. */
1299     patch_at(ge_code, _jit->pc.w);
1300 
1301     /* Load overflow pointer. */
1302     ldxi(rn(rg0), r1, offsetof(jit_va_list_t, over));
1303 
1304     /* Load argument. */
1305     ldr_d(r0, rn(rg0));
1306 
1307     /* Update overflow pointer. */
1308     addi(rn(rg0), rn(rg0), sizeof(jit_float64_t));
1309     stxi(offsetof(jit_va_list_t, over), r1, rn(rg0));
1310 
1311     /* Where to land if argument is in save area. */
1312     patch_at(lt_code, _jit->pc.w);
1313 
1314     jit_unget_reg_but_zero(rg0);
1315 }
1316 #endif
1317