git subrepo pull --force deps/lightning
[pcsx_rearmed.git] / deps / lightning / lib / jit_s390-fpu.c
CommitLineData
4a71579b 1/*
c0c16242 2 * Copyright (C) 2013-2022 Free Software Foundation, Inc.
4a71579b
PC
3 *
4 * This file is part of GNU lightning.
5 *
6 * GNU lightning is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU Lesser General Public License as published
8 * by the Free Software Foundation; either version 3, or (at your option)
9 * any later version.
10 *
11 * GNU lightning is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
14 * License for more details.
15 *
16 * Authors:
17 * Paulo Cesar Pereira de Andrade
18 */
19
20#if PROTO
21# define 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)
288static 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)
291static 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)
294static 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)
297static 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)
300static 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)
303static 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)
306static 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)
309static 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)
312static 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)
315static 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)
318static 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)
321static 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)
324static 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)
327static 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)
330static 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)
333static 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)
336static 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)
339static 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)
342static void _movr_f(jit_state_t*,jit_int32_t,jit_int32_t);
343# define movi_f(r0,i0) _movi_f(_jit,r0,i0)
344static void _movi_f(jit_state_t*,jit_int32_t,jit_float32_t*);
345# define movr_d(r0,r1) _movr_d(_jit,r0,r1)
346static void _movr_d(jit_state_t*,jit_int32_t,jit_int32_t);
347# define movi_d(r0,i0) _movi_d(_jit,r0,i0)
348static 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)
371static 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)
374static 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)
377static 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)
380static 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)
387static 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)
390static 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)
393static 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)
396static 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)
401static void _ldi_f(jit_state_t*,jit_int32_t,jit_word_t);
402# define ldi_d(r0,i0) _ldi_d(_jit,r0,i0)
403static 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)
405static 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)
407static 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)
409static 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)
411static 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)
415static void _sti_f(jit_state_t*,jit_word_t,jit_int32_t);
416# define sti_d(i0,r0) _sti_d(_jit,i0,r0)
417static 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)
419static 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)
421static 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)
423static 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)
425static 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)
459static 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)
461static 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)
473static 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)
475static 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)
599static void _vaarg_d(jit_state_t*, jit_int32_t, jit_int32_t);
600#endif
601
602#if CODE
603static void
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
623static void
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
643static void
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
656static void
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
669static void
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
680static void
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
692static void
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
707static void
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
722static jit_word_t
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
733static jit_word_t
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
744static void
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
755static void
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
766static jit_word_t
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
779static jit_word_t
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
792static jit_word_t
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
810static jit_word_t
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
826static jit_word_t
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
844static jit_word_t
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
860static void
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
867static void
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
890static void
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
897static void
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
931static void
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
942static void
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
953static void
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
970static void
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
987static void
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
998static void
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
1009static void
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
1026static void
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
1043static void
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
1053static void
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
1063static void
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
1074static void
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
1085static void
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
1102static void
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
1119static void
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
1129static void
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
1139static void
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
1150static void
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
1161static void
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
1178static void
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
1195static void
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
1210static void
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
1225static void
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
1240static void
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
1255static void
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