2 * Copyright (C) 2013-2023 Free Software Foundation, Inc.
4 * This file is part of GNU lightning.
6 * GNU lightning is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU Lesser General Public License as published
8 * by the Free Software Foundation; either version 3, or (at your option)
11 * GNU lightning is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
14 * License for more details.
17 * Paulo Cesar Pereira de Andrade
22 # define RND_BIAS_NEAR 1
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)
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)
45 # define LZER(R1) RRE_(0xB374,R1,0)
46 # define LZDR(R1) RRE_(0xB375,R1,0)
47 # define LZXR(R1) RRE_(0xB376,R1,0)
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 ****************************************************************/
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)
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)
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)
94 # define HER(R1,R2) RR_(0x34,R1,R2)
95 # define HDR(R1,R2) RR_(0x24,R1,R2)
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)
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)
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)
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)
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)
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 ****************************************************************/
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)
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)
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)
213 # define EFPC(R1) RRE_(0xB38C,R1,0)
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)
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)
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)
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)
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)
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)
268 # define SFPC(R1) RRE_(0xB384,R1,0)
269 /* SET ROUNDING MODE */
270 # define SRNM(D2,B2) S_(0xB299,B2,D2)
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)
276 # define STFPC(D2,B2) S_(0xB29C,B2,D2)
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 movi_w_f(r0, i0) _movi_w_f(_jit, r0, i0)
346 static void _movi_w_f(jit_state_t*, jit_int32_t, jit_word_t);
347 # define movr_d(r0,r1) _movr_d(_jit,r0,r1)
348 static void _movr_d(jit_state_t*,jit_int32_t,jit_int32_t);
349 # define movi_d(r0,i0) _movi_d(_jit,r0,i0)
350 static void _movi_d(jit_state_t*,jit_int32_t,jit_float64_t*);
351 # define absr_f(r0,r1) LPEBR(r0,r1)
352 # define absr_d(r0,r1) LPDBR(r0,r1)
353 # define negr_f(r0,r1) LCEBR(r0,r1)
354 # define negr_d(r0,r1) LCDBR(r0,r1)
355 # define sqrtr_f(r0,r1) SQEBR(r0,r1)
356 # define fmar_f(r0,r1,r2,r3) _fmar_f(_jit,r0,r1,r2,r3)
357 static void _fmar_f(jit_state_t*,
358 jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t);
359 # define fmsr_f(r0,r1,r2,r3) _fmsr_f(_jit,r0,r1,r2,r3)
360 static void _fmsr_f(jit_state_t*,
361 jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t);
362 # define fnmar_f(r0,r1,r2,r3) _fnmar_f(_jit,r0,r1,r2,r3)
363 static void _fnmar_f(jit_state_t*,
364 jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t);
365 # define fnmsr_f(r0,r1,r2,r3) _fnmsr_f(_jit,r0,r1,r2,r3)
366 static void _fnmsr_f(jit_state_t*,
367 jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t);
368 # define sqrtr_d(r0,r1) SQDBR(r0,r1)
369 # define fmar_d(r0,r1,r2,r3) _fmar_d(_jit,r0,r1,r2,r3)
370 static void _fmar_d(jit_state_t*,
371 jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t);
372 # define fmsr_d(r0,r1,r2,r3) _fmsr_d(_jit,r0,r1,r2,r3)
373 static void _fmsr_d(jit_state_t*,
374 jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t);
375 # define fnmar_d(r0,r1,r2,r3) _fnmar_d(_jit,r0,r1,r2,r3)
376 static void _fnmar_d(jit_state_t*,
377 jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t);
378 # define fnmsr_d(r0,r1,r2,r3) _fnmsr_d(_jit,r0,r1,r2,r3)
379 static void _fnmsr_d(jit_state_t*,
380 jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t);
381 # define truncr_f_i(r0,r1) CFEBR(r0,RND_ZERO,r1)
382 # define truncr_d_i(r0,r1) CFDBR(r0,RND_ZERO,r1)
383 # if __WORDSIZE == 64
384 # define truncr_f_l(r0,r1) CGEBR(r0,RND_ZERO,r1)
385 # define truncr_d_l(r0,r1) CGDBR(r0,RND_ZERO,r1)
387 # if __WORDSIZE == 32
388 # define extr_f(r0,r1) CEFBR(r0,r1)
389 # define extr_d(r0,r1) CDFBR(r0,r1)
390 # define movi_ww_d(r0, i0, i1) _movi_ww_d(_jit, r0, i0, i1)
391 static void _movi_ww_d(jit_state_t*, jit_int32_t, jit_word_t, jit_word_t);
393 # define extr_f(r0,r1) CEGBR(r0,r1)
394 # define extr_d(r0,r1) CDGBR(r0,r1)
395 # define movi_w_d(r0, i0) _movi_w_d(_jit, r0, i0)
396 static void _movi_w_d(jit_state_t*, jit_int32_t, jit_word_t);
398 # define extr_d_f(r0,r1) LEDBR(r0,r1)
399 # define extr_f_d(r0,r1) LDEBR(r0,r1)
400 # define addr_f(r0,r1,r2) _addr_f(_jit,r0,r1,r2)
401 static void _addr_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
402 # define addi_f(r0,r1,i0) fp(add,r0,r1,i0)
403 # define addr_d(r0,r1,r2) _addr_d(_jit,r0,r1,r2)
404 static void _addr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
405 # define addi_d(r0,r1,i0) dp(add,r0,r1,i0)
406 # define subr_f(r0,r1,r2) _subr_f(_jit,r0,r1,r2)
407 static void _subr_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
408 # define subi_f(r0,r1,i0) fp(sub,r0,r1,i0)
409 # define subr_d(r0,r1,r2) _subr_d(_jit,r0,r1,r2)
410 static void _subr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
411 # define subi_d(r0,r1,i0) dp(sub,r0,r1,i0)
412 # define rsbr_f(r0,r1,r2) subr_f(r0,r2,r1)
413 # define rsbi_f(r0,r1,i0) fp(rsb,r0,r1,i0)
414 # define rsbr_d(r0,r1,r2) subr_d(r0,r2,r1)
415 # define rsbi_d(r0,r1,i0) dp(rsb,r0,r1,i0)
416 # define mulr_f(r0,r1,r2) _mulr_f(_jit,r0,r1,r2)
417 static void _mulr_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
418 # define muli_f(r0,r1,i0) fp(mul,r0,r1,i0)
419 # define mulr_d(r0,r1,r2) _mulr_d(_jit,r0,r1,r2)
420 static void _mulr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
421 # define muli_d(r0,r1,i0) dp(mul,r0,r1,i0)
422 # define divr_f(r0,r1,r2) _divr_f(_jit,r0,r1,r2)
423 static void _divr_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
424 # define divi_f(r0,r1,i0) fp(div,r0,r1,i0)
425 # define divr_d(r0,r1,r2) _divr_d(_jit,r0,r1,r2)
426 static void _divr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
427 # define divi_d(r0,r1,i0) dp(div,r0,r1,i0)
428 # define ldr_f(r0,r1) LE(r0,0,0,r1)
429 # define ldr_d(r0,r1) LD(r0,0,0,r1)
430 # define ldi_f(r0,i0) _ldi_f(_jit,r0,i0)
431 static void _ldi_f(jit_state_t*,jit_int32_t,jit_word_t);
432 # define ldi_d(r0,i0) _ldi_d(_jit,r0,i0)
433 static void _ldi_d(jit_state_t*,jit_int32_t,jit_word_t);
434 # define ldxr_f(r0,r1,r2) _ldxr_f(_jit,r0,r1,r2)
435 static void _ldxr_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
436 # define ldxr_d(r0,r1,r2) _ldxr_d(_jit,r0,r1,r2)
437 static void _ldxr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
438 # define ldxi_f(r0,r1,i0) _ldxi_f(_jit,r0,r1,i0)
439 static void _ldxi_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
440 # define ldxi_d(r0,r1,i0) _ldxi_d(_jit,r0,r1,i0)
441 static void _ldxi_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
442 # define str_f(r0,r1) STE(r1,0,0,r0)
443 # define str_d(r0,r1) STD(r1,0,0,r0)
444 # define sti_f(i0,r0) _sti_f(_jit,i0,r0)
445 static void _sti_f(jit_state_t*,jit_word_t,jit_int32_t);
446 # define sti_d(i0,r0) _sti_d(_jit,i0,r0)
447 static void _sti_d(jit_state_t*,jit_word_t,jit_int32_t);
448 # define stxr_f(r0,r1,r2) _stxr_f(_jit,r0,r1,r2)
449 static void _stxr_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
450 # define stxr_d(r0,r1,r2) _stxr_d(_jit,r0,r1,r2)
451 static void _stxr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
452 # define stxi_f(i0,r0,r1) _stxi_f(_jit,i0,r0,r1)
453 static void _stxi_f(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
454 # define stxi_d(i0,r0,r1) _stxi_d(_jit,i0,r0,r1)
455 static void _stxi_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
456 # define ltr_f(r0,r1,r2) fr(CC_L,r0,r1,r2)
457 # define ltr_d(r0,r1,r2) dr(CC_L,r0,r1,r2)
458 # define lti_f(r0,r1,i0) fi(CC_L,r0,r1,i0)
459 # define lti_d(r0,r1,i0) di(CC_L,r0,r1,i0)
460 # define ler_f(r0,r1,r2) fr(CC_LE,r0,r1,r2)
461 # define ler_d(r0,r1,r2) dr(CC_LE,r0,r1,r2)
462 # define lei_f(r0,r1,i0) fi(CC_LE,r0,r1,i0)
463 # define lei_d(r0,r1,i0) di(CC_LE,r0,r1,i0)
464 # define eqr_f(r0,r1,r2) fr(CC_E,r0,r1,r2)
465 # define eqr_d(r0,r1,r2) dr(CC_E,r0,r1,r2)
466 # define eqi_f(r0,r1,i0) fi(CC_E,r0,r1,i0)
467 # define eqi_d(r0,r1,i0) di(CC_E,r0,r1,i0)
468 # define ger_f(r0,r1,r2) fr(CC_HE,r0,r1,r2)
469 # define ger_d(r0,r1,r2) dr(CC_HE,r0,r1,r2)
470 # define gei_f(r0,r1,i0) fi(CC_HE,r0,r1,i0)
471 # define gei_d(r0,r1,i0) di(CC_HE,r0,r1,i0)
472 # define gtr_f(r0,r1,r2) fr(CC_H,r0,r1,r2)
473 # define gtr_d(r0,r1,r2) dr(CC_H,r0,r1,r2)
474 # define gti_f(r0,r1,i0) fi(CC_H,r0,r1,i0)
475 # define gti_d(r0,r1,i0) di(CC_H,r0,r1,i0)
476 # define ner_f(r0,r1,r2) fr(CC_NE,r0,r1,r2)
477 # define ner_d(r0,r1,r2) dr(CC_NE,r0,r1,r2)
478 # define nei_f(r0,r1,i0) fi(CC_NE,r0,r1,i0)
479 # define nei_d(r0,r1,i0) di(CC_NE,r0,r1,i0)
480 # define unltr_f(r0,r1,r2) fr(CC_NHE,r0,r1,r2)
481 # define unltr_d(r0,r1,r2) dr(CC_NHE,r0,r1,r2)
482 # define unlti_f(r0,r1,i0) fi(CC_NHE,r0,r1,i0)
483 # define unlti_d(r0,r1,i0) di(CC_NHE,r0,r1,i0)
484 # define unler_f(r0,r1,r2) fr(CC_NH,r0,r1,r2)
485 # define unler_d(r0,r1,r2) dr(CC_NH,r0,r1,r2)
486 # define unlei_f(r0,r1,i0) fi(CC_NH,r0,r1,i0)
487 # define unlei_d(r0,r1,i0) di(CC_NH,r0,r1,i0)
488 # define uneqr_f(r0,r1,r2) _uneqr_f(_jit,r0,r1,r2)
489 static void _uneqr_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
490 # define uneqr_d(r0,r1,r2) _uneqr_d(_jit,r0,r1,r2)
491 static void _uneqr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
492 # define uneqi_f(r0,r1,i0) fp(uneq,r0,r1,i0)
493 # define uneqi_d(r0,r1,i0) dp(uneq,r0,r1,i0)
494 # define unger_f(r0,r1,r2) fr(CC_NL,r0,r1,r2)
495 # define unger_d(r0,r1,r2) dr(CC_NL,r0,r1,r2)
496 # define ungei_f(r0,r1,i0) fi(CC_NL,r0,r1,i0)
497 # define ungei_d(r0,r1,i0) di(CC_NL,r0,r1,i0)
498 # define ungtr_f(r0,r1,r2) fr(CC_NLE,r0,r1,r2)
499 # define ungtr_d(r0,r1,r2) dr(CC_NLE,r0,r1,r2)
500 # define ungti_f(r0,r1,i0) fi(CC_NLE,r0,r1,i0)
501 # define ungti_d(r0,r1,i0) di(CC_NLE,r0,r1,i0)
502 # define ltgtr_f(r0,r1,r2) _ltgtr_f(_jit,r0,r1,r2)
503 static void _ltgtr_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
504 # define ltgtr_d(r0,r1,r2) _ltgtr_d(_jit,r0,r1,r2)
505 static void _ltgtr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
506 # define ltgti_f(r0,r1,i0) fp(ltgt,r0,r1,i0)
507 # define ltgti_d(r0,r1,i0) dp(ltgt,r0,r1,i0)
508 # define ordr_f(r0,r1,r2) fr(CC_NO,r0,r1,r2)
509 # define ordr_d(r0,r1,r2) dr(CC_NO,r0,r1,r2)
510 # define ordi_f(r0,r1,i0) fi(CC_NO,r0,r1,i0)
511 # define ordi_d(r0,r1,i0) di(CC_NO,r0,r1,i0)
512 # define unordr_f(r0,r1,r2) fr(CC_O,r0,r1,r2)
513 # define unordr_d(r0,r1,r2) dr(CC_O,r0,r1,r2)
514 # define unordi_f(r0,r1,i0) fi(CC_O,r0,r1,i0)
515 # define unordi_d(r0,r1,i0) di(CC_O,r0,r1,i0)
516 # define bltr_f(i0,r0,r1) bfr(CC_L,i0,r0,r1)
517 # define bltr_d(i0,r0,r1) bdr(CC_L,i0,r0,r1)
518 # define blti_f(i0,r0,i1) bfi(CC_L,i0,r0,i1)
519 # define blti_d(i0,r0,i1) bdi(CC_L,i0,r0,i1)
520 # define bltr_f_p(i0,r0,r1) bfr_p(CC_L,i0,r0,r1)
521 # define bltr_d_p(i0,r0,r1) bdr_p(CC_L,i0,r0,r1)
522 # define blti_f_p(i0,r0,i1) bfi_p(CC_L,i0,r0,i1)
523 # define blti_d_p(i0,r0,i1) bdi_p(CC_L,i0,r0,i1)
524 # define bler_f(i0,r0,r1) bfr(CC_LE,i0,r0,r1)
525 # define bler_d(i0,r0,r1) bdr(CC_LE,i0,r0,r1)
526 # define blei_f(i0,r0,i1) bfi(CC_LE,i0,r0,i1)
527 # define blei_d(i0,r0,i1) bdi(CC_LE,i0,r0,i1)
528 # define bler_f_p(i0,r0,r1) bfr_p(CC_LE,i0,r0,r1)
529 # define bler_d_p(i0,r0,r1) bdr_p(CC_LE,i0,r0,r1)
530 # define blei_f_p(i0,r0,i1) bfi_p(CC_LE,i0,r0,i1)
531 # define blei_d_p(i0,r0,i1) bdi_p(CC_LE,i0,r0,i1)
532 # define beqr_f(i0,r0,r1) bfr(CC_E,i0,r0,r1)
533 # define beqr_d(i0,r0,r1) bdr(CC_E,i0,r0,r1)
534 # define beqi_f(i0,r0,i1) bfi(CC_E,i0,r0,i1)
535 # define beqi_d(i0,r0,i1) bdi(CC_E,i0,r0,i1)
536 # define beqr_f_p(i0,r0,r1) bfr_p(CC_E,i0,r0,r1)
537 # define beqr_d_p(i0,r0,r1) bdr_p(CC_E,i0,r0,r1)
538 # define beqi_f_p(i0,r0,i1) bfi_p(CC_E,i0,r0,i1)
539 # define beqi_d_p(i0,r0,i1) bdi_p(CC_E,i0,r0,i1)
540 # define bger_f(i0,r0,r1) bfr(CC_HE,i0,r0,r1)
541 # define bger_d(i0,r0,r1) bdr(CC_HE,i0,r0,r1)
542 # define bgei_f(i0,r0,i1) bfi(CC_HE,i0,r0,i1)
543 # define bgei_d(i0,r0,i1) bdi(CC_HE,i0,r0,i1)
544 # define bger_f_p(i0,r0,r1) bfr_p(CC_HE,i0,r0,r1)
545 # define bger_d_p(i0,r0,r1) bdr_p(CC_HE,i0,r0,r1)
546 # define bgei_f_p(i0,r0,i1) bfi_p(CC_HE,i0,r0,i1)
547 # define bgei_d_p(i0,r0,i1) bdi_p(CC_HE,i0,r0,i1)
548 # define bgtr_f(i0,r0,r1) bfr(CC_H,i0,r0,r1)
549 # define bgtr_d(i0,r0,r1) bdr(CC_H,i0,r0,r1)
550 # define bgti_f(i0,r0,i1) bfi(CC_H,i0,r0,i1)
551 # define bgti_d(i0,r0,i1) bdi(CC_H,i0,r0,i1)
552 # define bgtr_f_p(i0,r0,r1) bfr_p(CC_H,i0,r0,r1)
553 # define bgtr_d_p(i0,r0,r1) bdr_p(CC_H,i0,r0,r1)
554 # define bgti_f_p(i0,r0,i1) bfi_p(CC_H,i0,r0,i1)
555 # define bgti_d_p(i0,r0,i1) bdi_p(CC_H,i0,r0,i1)
556 # define bner_f(i0,r0,r1) bfr(CC_NE,i0,r0,r1)
557 # define bner_d(i0,r0,r1) bdr(CC_NE,i0,r0,r1)
558 # define bnei_f(i0,r0,i1) bfi(CC_NE,i0,r0,i1)
559 # define bnei_d(i0,r0,i1) bdi(CC_NE,i0,r0,i1)
560 # define bner_f_p(i0,r0,r1) bfr_p(CC_NE,i0,r0,r1)
561 # define bner_d_p(i0,r0,r1) bdr_p(CC_NE,i0,r0,r1)
562 # define bnei_f_p(i0,r0,i1) bfi_p(CC_NE,i0,r0,i1)
563 # define bnei_d_p(i0,r0,i1) bdi_p(CC_NE,i0,r0,i1)
564 # define bunltr_f(i0,r0,r1) bfr(CC_NHE,i0,r0,r1)
565 # define bunltr_d(i0,r0,r1) bdr(CC_NHE,i0,r0,r1)
566 # define bunlti_f(i0,r0,i1) bfi(CC_NHE,i0,r0,i1)
567 # define bunlti_d(i0,r0,i1) bdi(CC_NHE,i0,r0,i1)
568 # define bunltr_f_p(i0,r0,r1) bfr_p(CC_NHE,i0,r0,r1)
569 # define bunltr_d_p(i0,r0,r1) bdr_p(CC_NHE,i0,r0,r1)
570 # define bunlti_f_p(i0,r0,i1) bfi_p(CC_NHE,i0,r0,i1)
571 # define bunlti_d_p(i0,r0,i1) bdi_p(CC_NHE,i0,r0,i1)
572 # define bunler_f(i0,r0,r1) bfr(CC_NH,i0,r0,r1)
573 # define bunler_d(i0,r0,r1) bdr(CC_NH,i0,r0,r1)
574 # define bunlei_f(i0,r0,i1) bfi(CC_NH,i0,r0,i1)
575 # define bunlei_d(i0,r0,i1) bdi(CC_NH,i0,r0,i1)
576 # define bunler_f_p(i0,r0,r1) bfr_p(CC_NH,i0,r0,r1)
577 # define bunler_d_p(i0,r0,r1) bdr_p(CC_NH,i0,r0,r1)
578 # define bunlei_f_p(i0,r0,i1) bfi_p(CC_NH,i0,r0,i1)
579 # define bunlei_d_p(i0,r0,i1) bdi_p(CC_NH,i0,r0,i1)
580 # define buneqr_f(i0,r0,r1) buneqr(0,i0,r0,r1)
581 # define buneqr_d(i0,r0,r1) buneqr(1,i0,r0,r1)
582 # define buneqi_f(i0,r0,i1) buneqi(0,i0,r0,i1)
583 # define buneqi_d(i0,r0,i1) buneqi(1,i0,r0,i1)
584 # define buneqr_f_p(i0,r0,r1) buneqr(0,i0,r0,r1)
585 # define buneqr_d_p(i0,r0,r1) buneqr(1,i0,r0,r1)
586 # define buneqi_f_p(i0,r0,i1) buneqi(0,i0,r0,i1)
587 # define buneqi_d_p(i0,r0,i1) buneqi(1,i0,r0,i1)
588 # define bunger_f(i0,r0,r1) bfr(CC_NL,i0,r0,r1)
589 # define bunger_d(i0,r0,r1) bdr(CC_NL,i0,r0,r1)
590 # define bungei_f(i0,r0,i1) bfi(CC_NL,i0,r0,i1)
591 # define bungei_d(i0,r0,i1) bdi(CC_NL,i0,r0,i1)
592 # define bunger_f_p(i0,r0,r1) bfr_p(CC_NL,i0,r0,r1)
593 # define bunger_d_p(i0,r0,r1) bdr_p(CC_NL,i0,r0,r1)
594 # define bungei_f_p(i0,r0,i1) bfi_p(CC_NL,i0,r0,i1)
595 # define bungei_d_p(i0,r0,i1) bdi_p(CC_NL,i0,r0,i1)
596 # define bungtr_f(i0,r0,r1) bfr(CC_NLE,i0,r0,r1)
597 # define bungtr_d(i0,r0,r1) bdr(CC_NLE,i0,r0,r1)
598 # define bungti_f(i0,r0,i1) bfi(CC_NLE,i0,r0,i1)
599 # define bungti_d(i0,r0,i1) bdi(CC_NLE,i0,r0,i1)
600 # define bungtr_f_p(i0,r0,r1) bfr_p(CC_NLE,i0,r0,r1)
601 # define bungtr_d_p(i0,r0,r1) bdr_p(CC_NLE,i0,r0,r1)
602 # define bungti_f_p(i0,r0,i1) bfi_p(CC_NLE,i0,r0,i1)
603 # define bungti_d_p(i0,r0,i1) bdi_p(CC_NLE,i0,r0,i1)
604 # define bltgtr_f(i0,r0,r1) bltgtr(0,i0,r0,r1)
605 # define bltgtr_d(i0,r0,r1) bltgtr(1,i0,r0,r1)
606 # define bltgti_f(i0,r0,i1) bltgti(0,i0,r0,i1)
607 # define bltgti_d(i0,r0,i1) bltgti(1,i0,r0,i1)
608 # define bltgtr_f_p(i0,r0,r1) bltgtr(0,i0,r0,r1)
609 # define bltgtr_d_p(i0,r0,r1) bltgtr(1,i0,r0,r1)
610 # define bltgti_f_p(i0,r0,i1) bltgti(0,i0,r0,i1)
611 # define bltgti_d_p(i0,r0,i1) bltgti(1,i0,r0,i1)
612 # define bordr_f(i0,r0,r1) bfr(CC_NO,i0,r0,r1)
613 # define bordr_d(i0,r0,r1) bdr(CC_NO,i0,r0,r1)
614 # define bordi_f(i0,r0,i1) bfi(CC_NO,i0,r0,i1)
615 # define bordi_d(i0,r0,i1) bdi(CC_NO,i0,r0,i1)
616 # define bordr_f_p(i0,r0,r1) bfr_p(CC_NO,i0,r0,r1)
617 # define bordr_d_p(i0,r0,r1) bdr_p(CC_NO,i0,r0,r1)
618 # define bordi_f_p(i0,r0,i1) bfi_p(CC_NO,i0,r0,i1)
619 # define bordi_d_p(i0,r0,i1) bdi_p(CC_NO,i0,r0,i1)
620 # define bunordr_f(i0,r0,r1) bfr(CC_O,i0,r0,r1)
621 # define bunordr_d(i0,r0,r1) bdr(CC_O,i0,r0,r1)
622 # define bunordi_f(i0,r0,i1) bfi(CC_O,i0,r0,i1)
623 # define bunordi_d(i0,r0,i1) bdi(CC_O,i0,r0,i1)
624 # define bunordr_f_p(i0,r0,r1) bfr_p(CC_O,i0,r0,r1)
625 # define bunordr_d_p(i0,r0,r1) bdr_p(CC_O,i0,r0,r1)
626 # define bunordi_f_p(i0,r0,i1) bfi_p(CC_O,i0,r0,i1)
627 # define bunordi_d_p(i0,r0,i1) bdi_p(CC_O,i0,r0,i1)
628 # define vaarg_d(r0, r1) _vaarg_d(_jit, r0, r1)
629 static void _vaarg_d(jit_state_t*, jit_int32_t, jit_int32_t);
634 _fp(jit_state_t *_jit, jit_code_t code,
635 jit_int32_t r0, jit_int32_t r1, jit_float32_t *i0)
638 reg = jit_get_reg(jit_class_fpr);
641 case jit_code_addi_f: addr_f(r0, r1, rn(reg)); break;
642 case jit_code_subi_f: subr_f(r0, r1, rn(reg)); break;
643 case jit_code_rsbi_f: rsbr_f(r0, r1, rn(reg)); break;
644 case jit_code_muli_f: mulr_f(r0, r1, rn(reg)); break;
645 case jit_code_divi_f: divr_f(r0, r1, rn(reg)); break;
646 case jit_code_uneqi_f: uneqr_f(r0, r1, rn(reg)); break;
647 case jit_code_ltgti_f: ltgtr_f(r0, r1, rn(reg)); break;
654 _dp(jit_state_t *_jit, jit_code_t code,
655 jit_int32_t r0, jit_int32_t r1, jit_float64_t *i0)
658 reg = jit_get_reg(jit_class_fpr);
661 case jit_code_addi_d: addr_d(r0, r1, rn(reg)); break;
662 case jit_code_subi_d: subr_d(r0, r1, rn(reg)); break;
663 case jit_code_rsbi_d: rsbr_d(r0, r1, rn(reg)); break;
664 case jit_code_muli_d: mulr_d(r0, r1, rn(reg)); break;
665 case jit_code_divi_d: divr_d(r0, r1, rn(reg)); break;
666 case jit_code_uneqi_d: uneqr_d(r0, r1, rn(reg)); break;
667 case jit_code_ltgti_d: ltgtr_d(r0, r1, rn(reg)); break;
674 _fr(jit_state_t *_jit, jit_int32_t cc,
675 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
683 patch_at(w, _jit->pc.w);
687 _dr(jit_state_t *_jit, jit_int32_t cc,
688 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
696 patch_at(w, _jit->pc.w);
700 _fi(jit_state_t *_jit, jit_int32_t cc,
701 jit_int32_t r0, jit_int32_t r1, jit_float32_t *i0)
704 reg = jit_get_reg(jit_class_fpr|jit_class_nospill);
706 fr(cc, r0, r1, rn(reg));
711 _di(jit_state_t *_jit, jit_int32_t cc,
712 jit_int32_t r0, jit_int32_t r1, jit_float64_t *i0)
715 reg = jit_get_reg(jit_class_fpr|jit_class_nospill);
717 dr(cc, r0, r1, rn(reg));
723 _bfr(jit_state_t *_jit, jit_int32_t cc,
724 jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
728 d = (i0 - _jit->pc.w) >> 1;
738 _bdr(jit_state_t *_jit, jit_int32_t cc,
739 jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
743 d = (i0 - _jit->pc.w) >> 1;
753 _bfr_p(jit_state_t *_jit, jit_int32_t cc,
754 jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
764 _bdr_p(jit_state_t *_jit, jit_int32_t cc,
765 jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
775 _bfi(jit_state_t *_jit, jit_int32_t cc,
776 jit_word_t i0, jit_int32_t r0, jit_float32_t *i1)
779 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
781 bfr(cc, i0, r0, rn(reg));
786 _bdi(jit_state_t *_jit, jit_int32_t cc,
787 jit_word_t i0, jit_int32_t r0, jit_float64_t *i1)
790 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
792 bdr(cc, i0, r0, rn(reg));
797 _bfi_p(jit_state_t *_jit, jit_int32_t cc,
798 jit_word_t i0, jit_int32_t r0, jit_float32_t *i1)
802 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
804 w = bfr_p(cc, i0, r0, rn(reg));
810 _bdi_p(jit_state_t *_jit, jit_int32_t cc,
811 jit_word_t i0, jit_int32_t r0, jit_float64_t *i1)
815 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
817 w = bdr_p(cc, i0, r0, rn(reg));
823 _buneqr(jit_state_t *_jit, jit_int32_t db,
824 jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
826 jit_word_t unord, ne, w;
827 if (db) CDBR(r0, r1);
830 BRC(CC_O, 0); /* unord satisfies condition */
832 BRC(CC_NE, 0); /* ne does not satisfy condition */
833 patch_at(unord, _jit->pc.w);
835 BRCL(CC_AL, (i0 - _jit->pc.w) >> 1);
836 patch_at(ne, _jit->pc.w);
841 _buneqi(jit_state_t *_jit, jit_int32_t db,
842 jit_word_t i0, jit_int32_t r0, jit_word_t i1)
846 reg = jit_get_reg(jit_class_fpr|jit_class_nospill);
848 movi_d(rn(reg), (jit_float64_t *)i1);
850 movi_f(rn(reg), (jit_float32_t *)i1);
851 w = buneqr(db, i0, r0, rn(reg));
857 _bltgtr(jit_state_t *_jit, jit_int32_t db,
858 jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
860 jit_word_t unord, eq, w;
861 if (db) CDBR(r0, r1);
864 BRC(CC_O, 0); /* unord does not satisfy condition */
866 BRC(CC_E, 0); /* eq does not satisfy condition */
868 BRCL(CC_AL, (i0 - _jit->pc.w) >> 1);
869 patch_at(unord, _jit->pc.w);
870 patch_at(eq, _jit->pc.w);
875 _bltgti(jit_state_t *_jit, jit_int32_t db,
876 jit_word_t i0, jit_int32_t r0, jit_word_t i1)
880 reg = jit_get_reg(jit_class_fpr|jit_class_nospill);
882 movi_d(rn(reg), (jit_float64_t *)i1);
884 movi_f(rn(reg), (jit_float32_t *)i1);
885 w = bltgtr(db, i0, r0, rn(reg));
891 _movr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
898 _movi_f(jit_state_t *_jit, jit_int32_t r0, jit_float32_t *i0)
906 if (*(jit_int32_t *)i0 == 0)
908 else if (_jitc->no_data) {
910 reg = jit_get_reg_but_zero(0);
911 movi(rn(reg), data.i & 0xffffffff);
912 stxi_i(-4, _FP_REGNO, rn(reg));
913 jit_unget_reg_but_zero(reg);
914 ldxi_f(r0, _FP_REGNO, -4);
917 ldi_f(r0, (jit_word_t)i0);
921 _movi_w_f(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
924 reg = jit_get_reg(jit_class_gpr);
926 movr_w_f(r0, rn(reg));
931 _movr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
938 _movi_d(jit_state_t *_jit, jit_int32_t r0, jit_float64_t *i0)
950 if (*(jit_int64_t *)i0 == 0)
952 else if (_jitc->no_data) {
954 reg = jit_get_reg_but_zero(0);
956 movi(rn(reg), data.i[0]);
957 stxi_i(-8, _FP_REGNO, rn(reg));
958 movi(rn(reg), data.i[1]);
959 stxi_i(-4, _FP_REGNO, rn(reg));
961 movi(rn(reg), data.l);
962 stxi_l(-8, _FP_REGNO, rn(reg));
964 jit_unget_reg_but_zero(reg);
965 ldxi_d(r0, _FP_REGNO, -8);
968 ldi_d(r0, (jit_word_t)i0);
973 _movi_ww_d(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0, jit_word_t i1)
976 t0 = jit_get_reg(jit_class_gpr);
977 t1 = jit_get_reg(jit_class_gpr);
980 movr_ww_d(r0, rn(t0), rn(t1));
986 _movi_w_d(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
989 reg = jit_get_reg(jit_class_gpr);
991 movr_w_d(r0, rn(reg));
997 _fmar_f(jit_state_t* _jit,
998 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_int32_t r3)
1004 t0 = jit_get_reg(jit_class_fpr);
1006 MAEBR(rn(t0), r2, r1);
1013 _fmsr_f(jit_state_t* _jit,
1014 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_int32_t r3)
1020 t0 = jit_get_reg(jit_class_fpr);
1022 MSEBR(rn(t0), r2, r1);
1029 _fnmar_f(jit_state_t* _jit,
1030 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_int32_t r3)
1038 t0 = jit_get_reg(jit_class_fpr);
1040 MAEBR(rn(t0), r2, r1);
1047 _fnmsr_f(jit_state_t* _jit,
1048 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_int32_t r3)
1056 t0 = jit_get_reg(jit_class_fpr);
1058 MSEBR(rn(t0), r2, r1);
1065 _fmar_d(jit_state_t* _jit,
1066 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_int32_t r3)
1072 t0 = jit_get_reg(jit_class_fpr);
1074 MADBR(rn(t0), r2, r1);
1081 _fmsr_d(jit_state_t* _jit,
1082 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_int32_t r3)
1088 t0 = jit_get_reg(jit_class_fpr);
1090 MSDBR(rn(t0), r2, r1);
1097 _fnmar_d(jit_state_t* _jit,
1098 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_int32_t r3)
1106 t0 = jit_get_reg(jit_class_fpr);
1108 MADBR(rn(t0), r2, r1);
1115 _fnmsr_d(jit_state_t* _jit,
1116 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_int32_t r3)
1124 t0 = jit_get_reg(jit_class_fpr);
1126 MSDBR(rn(t0), r2, r1);
1133 _addr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1144 _addr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1155 _subr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1159 reg = jit_get_reg(jit_class_fpr);
1160 movr_f(rn(reg), r2);
1172 _subr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1176 reg = jit_get_reg(jit_class_fpr);
1177 movr_d(rn(reg), r2);
1189 _mulr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1200 _mulr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1211 _divr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1215 reg = jit_get_reg(jit_class_fpr);
1216 movr_f(rn(reg), r2);
1228 _divr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1232 reg = jit_get_reg(jit_class_fpr);
1233 movr_d(rn(reg), r2);
1245 _ldi_f(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
1248 reg = jit_get_reg_but_zero(0);
1251 jit_unget_reg_but_zero(reg);
1255 _ldi_d(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
1258 reg = jit_get_reg_but_zero(0);
1261 jit_unget_reg_but_zero(reg);
1265 _ldxr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1268 reg = jit_get_reg_but_zero(0);
1270 addr(rn(reg), rn(reg), r2);
1272 jit_unget_reg_but_zero(reg);
1276 _ldxr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1279 reg = jit_get_reg_but_zero(0);
1281 addr(rn(reg), rn(reg), r2);
1283 jit_unget_reg_but_zero(reg);
1287 _ldxi_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1293 LEY(r0, x20(i0), 0, r1);
1295 reg = jit_get_reg_but_zero(0);
1297 addr(rn(reg), rn(reg), r1);
1299 jit_unget_reg_but_zero(reg);
1304 _ldxi_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1310 LDY(r0, x20(i0), 0, r1);
1312 reg = jit_get_reg_but_zero(0);
1314 addr(rn(reg), rn(reg), r1);
1316 jit_unget_reg_but_zero(reg);
1321 _sti_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
1324 reg = jit_get_reg_but_zero(0);
1327 jit_unget_reg_but_zero(reg);
1331 _sti_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
1334 reg = jit_get_reg_but_zero(0);
1337 jit_unget_reg_but_zero(reg);
1341 _stxr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1344 reg = jit_get_reg_but_zero(0);
1346 addr(rn(reg), rn(reg), r1);
1348 jit_unget_reg_but_zero(reg);
1352 _stxr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1355 reg = jit_get_reg_but_zero(0);
1357 addr(rn(reg), rn(reg), r1);
1359 jit_unget_reg_but_zero(reg);
1363 _stxi_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
1369 STEY(r1, x20(i0), 0, r0);
1371 reg = jit_get_reg_but_zero(0);
1373 addr(rn(reg), rn(reg), r0);
1375 jit_unget_reg_but_zero(reg);
1380 _stxi_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
1386 STDY(r1, x20(i0), 0, r0);
1388 reg = jit_get_reg_but_zero(0);
1390 addr(rn(reg), rn(reg), r0);
1392 jit_unget_reg_but_zero(reg);
1397 _uneqr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1399 jit_word_t unord, eq;
1400 movi(r0, 1); /* set to one */
1402 unord = _jit->pc.w; /* keep set to one if unord */
1405 BRC(CC_E, 0); /* keep set to one if eq */
1406 movi(r0, 0); /* set to zero */
1407 patch_at(unord, _jit->pc.w);
1408 patch_at(eq, _jit->pc.w);
1412 _uneqr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1414 jit_word_t unord, eq;
1415 movi(r0, 1); /* set to one */
1417 unord = _jit->pc.w; /* keep set to one if unord */
1420 BRC(CC_E, 0); /* keep set to one if eq */
1421 movi(r0, 0); /* set to zero */
1422 patch_at(unord, _jit->pc.w);
1423 patch_at(eq, _jit->pc.w);
1427 _ltgtr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1429 jit_word_t unord, eq;
1430 movi(r0, 0); /* set to zero */
1432 unord = _jit->pc.w; /* keep set to zero if unord */
1435 BRC(CC_E, 0); /* keep set to zero if eq */
1436 movi(r0, 1); /* set to one */
1437 patch_at(unord, _jit->pc.w);
1438 patch_at(eq, _jit->pc.w);
1442 _ltgtr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1444 jit_word_t unord, eq;
1445 movi(r0, 0); /* set to zero */
1447 unord = _jit->pc.w; /* keep set to zero if unord */
1450 BRC(CC_E, 0); /* keep set to zero if eq */
1451 movi(r0, 1); /* set to one */
1452 patch_at(unord, _jit->pc.w);
1453 patch_at(eq, _jit->pc.w);
1457 _vaarg_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1465 assert(_jitc->function->self.call & jit_call_varargs);
1467 rg0 = jit_get_reg_but_zero(jit_class_gpr);
1468 rg1 = jit_get_reg_but_zero(jit_class_gpr);
1470 /* Load the fp offset in save area in the first temporary. */
1471 ldxi(rn(rg0), r1, offsetof(jit_va_list_t, fpoff));
1473 /* Jump over if there are no remaining arguments in the save area. */
1474 ge_code = bgei_p(_jit->pc.w, rn(rg0), NUM_FLOAT_REG_ARGS);
1476 /* Load the save area pointer in the second temporary. */
1477 ldxi(rn(rg1), r1, offsetof(jit_va_list_t, save));
1480 rg2 = jit_get_reg_but_zero(0);
1481 lshi(rn(rg2), rn(rg0), 3);
1482 /* Add offset to saved area */
1483 addi(rn(rg2), rn(rg2), 16 * sizeof(jit_word_t));
1485 /* Load the vararg argument in the first argument. */
1486 ldxr_d(r0, rn(rg1), rn(rg2));
1487 jit_unget_reg_but_zero(rg2);
1489 /* Update the fp offset. */
1490 addi(rn(rg0), rn(rg0), 1);
1491 stxi(offsetof(jit_va_list_t, fpoff), r1, rn(rg0));
1493 /* Will only need one temporary register below. */
1494 jit_unget_reg_but_zero(rg1);
1496 /* Jump over overflow code. */
1497 lt_code = jmpi_p(_jit->pc.w);
1499 /* Where to land if argument is in overflow area. */
1500 patch_at(ge_code, _jit->pc.w);
1502 /* Load overflow pointer. */
1503 ldxi(rn(rg0), r1, offsetof(jit_va_list_t, over));
1505 /* Load argument. */
1508 /* Update overflow pointer. */
1509 addi(rn(rg0), rn(rg0), sizeof(jit_float64_t));
1510 stxi(offsetof(jit_va_list_t, over), r1, rn(rg0));
1512 /* Where to land if argument is in save area. */
1513 patch_at(lt_code, _jit->pc.w);
1515 jit_unget_reg_but_zero(rg0);