git subrepo clone (merge) https://github.com/rtissera/libchdr deps/libchdr
[pcsx_rearmed.git] / deps / lightning / lib / jit_riscv-fpu.c
CommitLineData
4a71579b
PC
1/*
2 * Copyright (C) 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/*
22 * RV32F Standard Extension
23 */
24# define FLW(rd, rs1, im) Itype(7, rd, 2, rs1, im)
25# define FSW(rs1, rs2, imm) Stype(39, 2, rs1, rs2, imm)
26# define FMADD_S(rd, rs1, rs2, rs3) R4type(67, rd, 0, rs1, rs2, 0, rs3)
27# define FMSUB_S(rd, rs1, rs2, rs3) R4type(71, rd, 0, rs1, rs2, 0, rs3)
28# define FNMSUB_S(rd, rs1, rs2, rs3) R4type(75, rd, 0, rs1, rs2, 0, rs3)
29# define FNMADD_S(rd, rs1, rs2, rs3) R4type(79, rd, 0, rs1, rs2, 0, rs3)
30# define FADD_S(rd, rs1, rs2) Rtype(83, rd, 0, rs1, rs2, 0)
31# define FSUB_S(rd, rs1, rs2) Rtype(83, rd, 0, rs1, rs2, 4)
32# define FMUL_S(rd, rs1, rs2) Rtype(83, rd, 0, rs1, rs2, 8)
33# define FDIV_S(rd, rs1, rs2) Rtype(83, rd, 0, rs1, rs2, 12)
34# define FSQRT_S(rd, rs1) Rtype(83, rd, 0, rs1, 0, 44)
35# define FSGNJ_S(rd, rs1, rs2) Rtype(83, rd, 0, rs1, rs2, 16)
36# define FSGNJN_S(rd, rs1, rs2) Rtype(83, rd, 1, rs1, rs2, 16)
37# define FSGNJX_S(rd, rs1, rs2) Rtype(83, rd, 2, rs1, rs2, 16)
38# define FMIN_S(rd, rs1, rs2) Rtype(83, rd, 0, rs1, rs2, 20)
39# define FMAX_S(rd, rs1, rs2) Rtype(83, rd, 1, rs1, rs2, 20)
40# define FCVT_W_S(rd, rs1) Rtype(83, rd, 0, rs1, 0, 96)
41# define FCVT_WU_S(rd, rs1) Rtype(83, rd, 1, rs1, 1, 96)
42# define FMV_X_W(rd, rs1) Rtype(83, rd, 0, rs1, 0, 112)
43# define FEQ_S(rd, rs1, rs2) Rtype(83, rd, 2, rs1, rs2, 80)
44# define FLT_S(rd, rs1, rs2) Rtype(83, rd, 1, rs1, rs2, 80)
45# define FLE_S(rd, rs1, rs2) Rtype(83, rd, 0, rs1, rs2, 80)
46# define FCLASS_S(rd, rs1) Rtype(83, rd, 1, rs1, 0, 112)
47# define FCVT_S_W(rd, rs1) Rtype(83, rd, 0, rs1, 0, 104)
48# define FCVT_S_WU(rd, rs1) Rtype(83, rd, 0, rs1, 1, 104)
49# define FMV_W_X(rd, rs1) Rtype(83, rd, 0, rs1, 0, 120)
50/*
51 * RV64F Standard Extension (in addition to RV32F)
52 */
53# define FCVT_L_S(rd, rs1) Rtype(83, rd, 0, rs1, 2, 96)
54# define FCVT_LU_S(rd, rs1) Rtype(83, rd, 0, rs1, 3, 96)
55# define FCVT_S_L(rd, rs1) Rtype(83, rd, 0, rs1, 2, 104)
56# define FCVT_S_LU(rd, rs1) Rtype(83, rd, 0, rs1, 3, 104)
57/*
58 * RV32D Standard Extension
59 */
60# define FLD(rd, rs1, im) Itype(7, rd, 3, rs1, im)
61# define FSD(rs1, rs2, imm) Stype(39, 3, rs1, rs2, imm)
62# define FMADD_D(rd, rs1, rs2, rs3) R4type(67, rd, 0, rs1, rs2, 1, rs3)
63# define FMSUB_D(rd, rs1, rs2, rs3) R4type(71, rd, 0, rs1, rs2, 1, rs3)
64# define FNMSUB_D(rd, rs1, rs2, rs3) R4type(75, rd, 0, rs1, rs2, 1, rs3)
65# define FNMADD_D(rd, rs1, rs2, rs3) R4type(79, rd, 0, rs1, rs2, 1, rs3)
66# define FADD_D(rd, rs1, rs2) Rtype(83, rd, 0, rs1, rs2, 1)
67# define FSUB_D(rd, rs1, rs2) Rtype(83, rd, 0, rs1, rs2, 5)
68# define FMUL_D(rd, rs1, rs2) Rtype(83, rd, 0, rs1, rs2, 9)
69# define FDIV_D(rd, rs1, rs2) Rtype(83, rd, 0, rs1, rs2, 13)
70# define FSQRT_D(rd, rs1) Rtype(83, rd, 0, rs1, 0, 45)
71# define FSGNJ_D(rd, rs1, rs2) Rtype(83, rd, 0, rs1, rs2, 17)
72# define FSGNJN_D(rd, rs1, rs2) Rtype(83, rd, 1, rs1, rs2, 17)
73# define FSGNJX_D(rd, rs1, rs2) Rtype(83, rd, 2, rs1, rs2, 17)
74# define FMIN_D(rd, rs1, rs2) Rtype(83, rd, 0, rs1, rs2, 21)
75# define FMAX_D(rd, rs1, rs2) Rtype(83, rd, 1, rs1, rs2, 21)
76# define FCVT_S_D(rd, rs1) Rtype(83, rd, 0, rs1, 1, 32)
77# define FCVT_D_S(rd, rs1) Rtype(83, rd, 0, rs1, 0, 33)
78# define FEQ_D(rd, rs1, rs2) Rtype(83, rd, 2, rs1, rs2, 81)
79# define FLT_D(rd, rs1, rs2) Rtype(83, rd, 1, rs1, rs2, 81)
80# define FLE_D(rd, rs1, rs2) Rtype(83, rd, 0, rs1, rs2, 81)
81# define FCLASS_D(rd, rs1) Rtype(83, rd, 1, rs1, 0, 113)
82# define FCVT_W_D(rd, rs1) Rtype(83, rd, 0, rs1, 0, 97)
83# define FCVT_WU_D(rd, rs1) Rtype(83, rd, 0, rs1, 1, 97)
84# define FCVT_D_W(rd, rs1) Rtype(83, rd, 0, rs1, 0, 105)
85# define FCVT_D_WU(rd, rs1) Rtype(83, rd, 0, rs1, 1, 105)
86/*
87 * RV64D Standard Extension (in addition to RV32D)
88 */
89# define FCVT_L_D(rd, rs1) Rtype(83, rd, 0, rs1, 2, 97)
90# define FCVT_LU_D(rd, rs1) Rtype(83, rd, 0, rs1, 3, 97)
91# define FMV_X_D(rd, rs1) Rtype(83, rd, 0, rs1, 0, 113)
92# define FCVT_D_L(rd, rs1) Rtype(83, rd, 0, rs1, 2, 105)
93# define FCVT_D_LU(rd, rs1) Rtype(83, rd, 0, rs1, 3, 105)
94# define FMV_D_X(rd, rs1) Rtype(83, rd, 0, rs1, 0, 121)
95/*
96 * Pseudo instructions
97 */
98# define FMV_S(r0, r1) FSGNJ_S(r0, r1, r1)
99# define FABS_S(r0, r1) FSGNJX_S(r0, r1, r1)
100# define FNEG_S(r0, r1) FSGNJN_S(r0, r1, r1)
101# define FMV_D(r0, r1) FSGNJ_D(r0, r1, r1)
102# define FABS_D(r0, r1) FSGNJX_D(r0, r1, r1)
103# define FNEG_D(r0, r1) FSGNJN_D(r0, r1, r1)
104
105/*
106 * Lightning instructions
107 */
108# define truncr_f_i(r0, r1) FCVT_W_S(r0, r1)
109# define truncr_d_i(r0, r1) FCVT_W_D(r0, r1)
110# define truncr_f_l(r0, r1) FCVT_L_S(r0, r1)
111# define truncr_d_l(r0, r1) FCVT_L_D(r0, r1)
112# define addr_f(r0, r1, r2) FADD_S(r0, r1, r2)
113# define addi_f(r0, r1, im) _addi_f(_jit, r0, r1, im)
114static void _addi_f(jit_state_t *_jit,jit_int32_t,jit_int32_t,jit_float32_t);
115# define subr_f(r0, r1, r2) FSUB_S(r0, r1, r2)
116# define subi_f(r0, r1, im) _subi_f(_jit, r0, r1, im)
117static void _subi_f(jit_state_t *_jit,jit_int32_t,jit_int32_t,jit_float32_t);
118# define rsbr_f(r0, r1, r2) FSUB_S(r0, r2, r1)
119# define rsbi_f(r0, r1, im) _rsbi_f(_jit, r0, r1, im)
120static void _rsbi_f(jit_state_t *_jit,jit_int32_t,jit_int32_t,jit_float32_t);
121# define mulr_f(r0, r1, r2) FMUL_S(r0, r1, r2)
122# define muli_f(r0, r1, im) _muli_f(_jit, r0, r1, im)
123static void _muli_f(jit_state_t *_jit,jit_int32_t,jit_int32_t,jit_float32_t);
124# define divr_f(r0, r1, r2) FDIV_S(r0, r1, r2)
125# define divi_f(r0, r1, im) _divi_f(_jit, r0, r1, im)
126static void _divi_f(jit_state_t *_jit,jit_int32_t,jit_int32_t,jit_float32_t);
127# define absr_f(r0, r1) FABS_S(r0, r1)
128# define negr_f(r0, r1) FNEG_S(r0, r1)
129# define sqrtr_f(r0, r1) FSQRT_S(r0, r1)
130# define extr_f(r0, r1) FCVT_S_L(r0, r1)
131# define ldr_f(r0, r1) FLW(r0, r1, 0)
132# define ldi_f(r0, im) _ldi_f(_jit, r0, im)
133static void _ldi_f(jit_state_t*, jit_int32_t, jit_word_t);
134# define ldxr_f(r0, r1, r2) _ldxr_f(_jit, r0, r1, r2)
135static void _ldxr_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
136# define ldxi_f(r0, r1, i0) _ldxi_f(_jit, r0, r1, i0)
137static void _ldxi_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
138# define str_f(r0, r1) FSW(r0, r1, 0)
139# define sti_f(im, r0) _sti_f(_jit, im, r0)
140static void _sti_f(jit_state_t*, jit_word_t, jit_int32_t);
141# define stxr_f(r0, r1, r2) _stxr_f(_jit, r0, r1, r2)
142static void _stxr_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
143# define stxi_f(im, r0, r1) _stxi_f(_jit, im, r0, r1)
144static void _stxi_f(jit_state_t*, jit_word_t, jit_int32_t, jit_int32_t);
145# define movr_f(r0, r1) FMV_S(r0, r1)
146# define movi_f(r0, im) _movi_f(_jit, r0, im)
147static void _movi_f(jit_state_t*, jit_int32_t, jit_float32_t);
148# define movr_f_w(r0, r1) FMV_X_W(r0, r1)
149# define movi_f_w(r0, im) _movi_f_w(_jit, r0, im)
150static void _movi_f_w(jit_state_t*, jit_int32_t, jit_float32_t);
151# define movr_w_f(r0, r1) FMV_W_X(r0, r1)
152# define extr_d_f(r0, r1) FCVT_S_D(r0, r1)
153# define ltr_f(r0, r1, r2) FLT_S(r0, r1, r2)
154# define lti_f(r0, r1, im) _lti_f(_jit, r0, r1, im)
155static void _lti_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_float32_t);
156# define ler_f(r0, r1, r2) FLE_S(r0, r1, r2)
157# define lei_f(r0, r1, im) _lei_f(_jit, r0, r1, im)
158static void _lei_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_float32_t);
159# define eqr_f(r0, r1, r2) FEQ_S(r0, r1, r2)
160# define eqi_f(r0, r1, im) _eqi_f(_jit, r0, r1, im)
161static void _eqi_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_float32_t);
162# define ger_f(r0, r1, r2) FLE_S(r0, r2, r1)
163# define gei_f(r0, r1, im) _gei_f(_jit, r0, r1, im)
164static void _gei_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_float32_t);
165# define gtr_f(r0, r1, r2) FLT_S(r0, r2, r1)
166# define gti_f(r0, r1, im) _gti_f(_jit, r0, r1, im)
167static void _gti_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_float32_t);
168# define ner_f(r0, r1, r2) _ner_f(_jit, r0, r1, r2)
169static void _ner_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
170# define nei_f(r0, r1, im) _nei_f(_jit, r0, r1, im)
171static void _nei_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_float32_t);
172# define unltr_f(r0, r1, r2) _unltr_f(_jit, r0, r1, r2)
173static void _unltr_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
174# define unlti_f(r0, r1, im) _unlti_f(_jit, r0, r1, im)
175static void _unlti_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_float32_t);
176# define unler_f(r0, r1, r2) _unler_f(_jit, r0, r1, r2)
177static void _unler_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
178# define unlei_f(r0, r1, im) _unlei_f(_jit, r0, r1, im)
179static void _unlei_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_float32_t);
180# define uneqr_f(r0, r1, r2) _uneqr_f(_jit, r0, r1, r2)
181static void _uneqr_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
182# define uneqi_f(r0, r1, im) _uneqi_f(_jit, r0, r1, im)
183static void _uneqi_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_float32_t);
184# define unger_f(r0, r1, r2) _unger_f(_jit, r0, r1, r2)
185static void _unger_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
186# define ungei_f(r0, r1, im) _ungei_f(_jit, r0, r1, im)
187static void _ungei_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_float32_t);
188# define ungtr_f(r0, r1, r2) _ungtr_f(_jit, r0, r1, r2)
189static void _ungtr_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
190# define ungti_f(r0, r1, im) _ungti_f(_jit, r0, r1, im)
191static void _ungti_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_float32_t);
192# define ltgtr_f(r0, r1, r2) _ltgtr_f(_jit, r0, r1, r2)
193static void _ltgtr_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
194# define ltgti_f(r0, r1, im) _ltgti_f(_jit, r0, r1, im)
195static void _ltgti_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_float32_t);
196# define ordr_f(r0, r1, r2) _ordr_f(_jit, r0, r1, r2)
197static void _ordr_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
198# define ordi_f(r0, r1, im) _ordi_f(_jit, r0, r1, im)
199static void _ordi_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_float32_t);
200# define unordr_f(r0, r1, r2) _unordr_f(_jit, r0, r1, r2)
201static void _unordr_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
202# define unordi_f(r0, r1, im) _unordi_f(_jit, r0, r1, im)
203static void _unordi_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_float32_t);
204# define bltr_f(br, r0, r1) _bltr_f(_jit,br,r0,r1)
205static jit_word_t _bltr_f(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
206# define blti_f(br, r0, im) _blti_f(_jit,br,r0,im)
207static jit_word_t _blti_f(jit_state_t*,jit_word_t,jit_int32_t,jit_float32_t);
208# define bler_f(br, r0, r1) _bler_f(_jit,br,r0,r1)
209static jit_word_t _bler_f(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
210# define blei_f(br, r0, im) _blei_f(_jit,br,r0,im)
211static jit_word_t _blei_f(jit_state_t*,jit_word_t,jit_int32_t,jit_float32_t);
212# define beqr_f(br, r0, r1) _beqr_f(_jit,br,r0,r1)
213static jit_word_t _beqr_f(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
214# define beqi_f(br, r0, im) _beqi_f(_jit,br,r0,im)
215static jit_word_t _beqi_f(jit_state_t*,jit_word_t,jit_int32_t,jit_float32_t);
216# define bger_f(br, r0, r1) _bger_f(_jit,br,r0,r1)
217static jit_word_t _bger_f(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
218# define bgei_f(br, r0, im) _bgei_f(_jit,br,r0,im)
219static jit_word_t _bgei_f(jit_state_t*,jit_word_t,jit_int32_t,jit_float32_t);
220# define bgtr_f(br, r0, r1) _bgtr_f(_jit,br,r0,r1)
221static jit_word_t _bgtr_f(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
222# define bgti_f(br, r0, im) _bgti_f(_jit,br,r0,im)
223static jit_word_t _bgti_f(jit_state_t*,jit_word_t,jit_int32_t,jit_float32_t);
224# define bner_f(br, r0, r1) _bner_f(_jit,br,r0,r1)
225static jit_word_t _bner_f(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
226# define bnei_f(br, r0, im) _bnei_f(_jit,br,r0,im)
227static jit_word_t _bnei_f(jit_state_t*,jit_word_t,jit_int32_t,jit_float32_t);
228# define bunltr_f(br, r0, r1) _bunltr_f(_jit,br,r0,r1)
229static jit_word_t _bunltr_f(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
230# define bunlti_f(br, r0, im) _bunlti_f(_jit,br,r0,im)
231static jit_word_t _bunlti_f(jit_state_t*,jit_word_t,jit_int32_t,jit_float32_t);
232# define bunler_f(br, r0, r1) _bunler_f(_jit,br,r0,r1)
233static jit_word_t _bunler_f(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
234# define bunlei_f(br, r0, im) _bunlei_f(_jit,br,r0,im)
235static jit_word_t _bunlei_f(jit_state_t*,jit_word_t,jit_int32_t,jit_float32_t);
236# define buneqr_f(br, r0, r1) _buneqr_f(_jit,br,r0,r1)
237static jit_word_t _buneqr_f(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
238# define buneqi_f(br, r0, im) _buneqi_f(_jit,br,r0,im)
239static jit_word_t _buneqi_f(jit_state_t*,jit_word_t,jit_int32_t,jit_float32_t);
240# define bunger_f(br, r0, r1) _bunger_f(_jit,br,r0,r1)
241static jit_word_t _bunger_f(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
242# define bungei_f(br, r0, im) _bungei_f(_jit,br,r0,im)
243static jit_word_t _bungei_f(jit_state_t*,jit_word_t,jit_int32_t,jit_float32_t);
244# define bungtr_f(br, r0, r1) _bungtr_f(_jit,br,r0,r1)
245static jit_word_t _bungtr_f(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
246# define bungti_f(br, r0, im) _bungti_f(_jit,br,r0,im)
247static jit_word_t _bungti_f(jit_state_t*,jit_word_t,jit_int32_t,jit_float32_t);
248# define bltgtr_f(br, r0, r1) _bltgtr_f(_jit,br,r0,r1)
249static jit_word_t _bltgtr_f(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
250# define bltgti_f(br, r0, im) _bltgti_f(_jit,br,r0,im)
251static jit_word_t _bltgti_f(jit_state_t*,jit_word_t,jit_int32_t,jit_float32_t);
252# define bordr_f(br, r0, r1) _bordr_f(_jit,br,r0,r1)
253static jit_word_t _bordr_f(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
254# define bordi_f(br, r0, im) _bordi_f(_jit,br,r0,im)
255static jit_word_t _bordi_f(jit_state_t*,jit_word_t,jit_int32_t,jit_float32_t);
256# define bunordr_f(br, r0, r1) _bunordr_f(_jit,br,r0,r1)
257static jit_word_t _bunordr_f(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
258# define bunordi_f(br, r0, im) _bunordi_f(_jit,br,r0,im)
259static jit_word_t _bunordi_f(jit_state_t*,jit_word_t,jit_int32_t,jit_float32_t);
260# define addr_d(r0, r1, r2) FADD_D(r0, r1, r2)
261# define addi_d(r0, r1, im) _addi_d(_jit, r0, r1, im)
262static void _addi_d(jit_state_t *_jit,jit_int32_t,jit_int32_t,jit_float64_t);
263# define subr_d(r0, r1, r2) FSUB_D(r0, r1, r2)
264# define subi_d(r0, r1, im) _subi_d(_jit, r0, r1, im)
265static void _subi_d(jit_state_t *_jit,jit_int32_t,jit_int32_t,jit_float64_t);
266# define rsbr_d(r0, r1, r2) FSUB_D(r0, r2, r1)
267# define rsbi_d(r0, r1, im) _rsbi_d(_jit, r0, r1, im)
268static void _rsbi_d(jit_state_t *_jit,jit_int32_t,jit_int32_t,jit_float64_t);
269# define mulr_d(r0, r1, r2) FMUL_D(r0, r1, r2)
270# define muli_d(r0, r1, im) _muli_d(_jit, r0, r1, im)
271static void _muli_d(jit_state_t *_jit,jit_int32_t,jit_int32_t,jit_float64_t);
272# define divr_d(r0, r1, r2) FDIV_D(r0, r1, r2)
273# define divi_d(r0, r1, im) _divi_d(_jit, r0, r1, im)
274static void _divi_d(jit_state_t *_jit,jit_int32_t,jit_int32_t,jit_float64_t);
275# define absr_d(r0, r1) FABS_D(r0, r1)
276# define negr_d(r0, r1) FNEG_D(r0, r1)
277# define sqrtr_d(r0, r1) FSQRT_D(r0, r1)
278# define extr_d(r0, r1) FCVT_D_L(r0, r1)
279# define ldr_d(r0, r1) FLD(r0, r1, 0)
280# define ldi_d(r0, im) _ldi_d(_jit, r0, im)
281static void _ldi_d(jit_state_t*, jit_int32_t, jit_word_t);
282# define ldxr_d(r0, r1, r2) _ldxr_d(_jit, r0, r1, r2)
283static void _ldxr_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
284# define ldxi_d(r0, r1, i0) _ldxi_d(_jit, r0, r1, i0)
285static void _ldxi_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
286# define str_d(r0, r1) FSD(r0, r1, 0)
287# define sti_d(im, r0) _sti_d(_jit, im, r0)
288static void _sti_d(jit_state_t*, jit_word_t, jit_int32_t);
289# define stxr_d(r0, r1, r2) _stxr_d(_jit, r0, r1, r2)
290static void _stxr_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
291# define stxi_d(im, r0, r1) _stxi_d(_jit, im, r0, r1)
292static void _stxi_d(jit_state_t*, jit_word_t, jit_int32_t, jit_int32_t);
293# define movr_d(r0, r1) FMV_D(r0, r1)
294# define movi_d(r0, im) _movi_d(_jit, r0, im)
295static void _movi_d(jit_state_t*, jit_int32_t, jit_float64_t);
296# define movr_d_w(r0, r1) FMV_X_D(r0, r1)
297# define movi_d_w(r0, im) _movi_d_w(_jit, r0, im)
298static void _movi_d_w(jit_state_t*, jit_int32_t, jit_float64_t);
299# define movr_w_d(r0, r1) FMV_D_X(r0, r1)
300# define extr_f_d(r0, r1) FCVT_D_S(r0, r1)
301# define ltr_d(r0, r1, r2) FLT_D(r0, r1, r2)
302# define lti_d(r0, r1, r2) _lti_d(_jit, r0, r1, r2)
303static void _lti_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_float64_t);
304# define ler_d(r0, r1, r2) FLE_D(r0, r1, r2)
305# define lei_d(r0, r1, r2) _lei_d(_jit, r0, r1, r2)
306static void _lei_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_float64_t);
307# define eqr_d(r0, r1, r2) FEQ_D(r0, r1, r2)
308# define eqi_d(r0, r1, r2) _eqi_d(_jit, r0, r1, r2)
309static void _eqi_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_float64_t);
310# define ger_d(r0, r1, r2) FLE_D(r0, r2, r1)
311# define gei_d(r0, r1, r2) _gei_d(_jit, r0, r1, r2)
312static void _gei_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_float64_t);
313# define gtr_d(r0, r1, r2) FLT_D(r0, r2, r1)
314# define gti_d(r0, r1, r2) _gti_d(_jit, r0, r1, r2)
315static void _gti_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_float64_t);
316# define ner_d(r0, r1, r2) _ner_d(_jit, r0, r1, r2)
317static void _ner_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
318# define nei_d(r0, r1, r2) _nei_d(_jit, r0, r1, r2)
319static void _nei_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_float64_t);
320# define unltr_d(r0, r1, r2) _unltr_d(_jit, r0, r1, r2)
321static void _unltr_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
322# define unlti_d(r0, r1, im) _unlti_d(_jit, r0, r1, im)
323static void _unlti_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_float64_t);
324# define unler_d(r0, r1, r2) _unler_d(_jit, r0, r1, r2)
325static void _unler_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
326# define unlei_d(r0, r1, im) _unlei_d(_jit, r0, r1, im)
327static void _unlei_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_float64_t);
328# define uneqr_d(r0, r1, r2) _uneqr_d(_jit, r0, r1, r2)
329static void _uneqr_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
330# define uneqi_d(r0, r1, im) _uneqi_d(_jit, r0, r1, im)
331static void _uneqi_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_float64_t);
332# define unger_d(r0, r1, r2) _unger_d(_jit, r0, r1, r2)
333static void _unger_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
334# define ungei_d(r0, r1, im) _ungei_d(_jit, r0, r1, im)
335static void _ungei_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_float64_t);
336# define ungtr_d(r0, r1, r2) _ungtr_d(_jit, r0, r1, r2)
337static void _ungtr_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
338# define ungti_d(r0, r1, im) _ungti_d(_jit, r0, r1, im)
339static void _ungti_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_float64_t);
340# define ltgtr_d(r0, r1, r2) _ltgtr_d(_jit, r0, r1, r2)
341static void _ltgtr_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
342# define ltgti_d(r0, r1, im) _ltgti_d(_jit, r0, r1, im)
343static void _ltgti_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_float64_t);
344# define ordr_d(r0, r1, r2) _ordr_d(_jit, r0, r1, r2)
345static void _ordr_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
346# define ordi_d(r0, r1, im) _ordi_d(_jit, r0, r1, im)
347static void _ordi_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_float64_t);
348# define unordr_d(r0, r1, r2) _unordr_d(_jit, r0, r1, r2)
349static void _unordr_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
350# define unordi_d(r0, r1, im) _unordi_d(_jit, r0, r1, im)
351static void _unordi_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_float64_t);
352# define bltr_d(br, r0, r1) _bltr_d(_jit,br,r0,r1)
353static jit_word_t _bltr_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
354# define blti_d(br, r0, im) _blti_d(_jit,br,r0,im)
355static jit_word_t _blti_d(jit_state_t*,jit_word_t,jit_int32_t,jit_float64_t);
356# define bler_d(br, r0, r1) _bler_d(_jit,br,r0,r1)
357static jit_word_t _bler_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
358# define blei_d(br, r0, im) _blei_d(_jit,br,r0,im)
359static jit_word_t _blei_d(jit_state_t*,jit_word_t,jit_int32_t,jit_float64_t);
360# define beqr_d(br, r0, r1) _beqr_d(_jit,br,r0,r1)
361static jit_word_t _beqr_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
362# define beqi_d(br, r0, im) _beqi_d(_jit,br,r0,im)
363static jit_word_t _beqi_d(jit_state_t*,jit_word_t,jit_int32_t,jit_float64_t);
364# define bger_d(br, r0, r1) _bger_d(_jit,br,r0,r1)
365static jit_word_t _bger_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
366# define bgei_d(br, r0, im) _bgei_d(_jit,br,r0,im)
367static jit_word_t _bgei_d(jit_state_t*,jit_word_t,jit_int32_t,jit_float64_t);
368# define bgtr_d(br, r0, r1) _bgtr_d(_jit,br,r0,r1)
369static jit_word_t _bgtr_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
370# define bgti_d(br, r0, im) _bgti_d(_jit,br,r0,im)
371static jit_word_t _bgti_d(jit_state_t*,jit_word_t,jit_int32_t,jit_float64_t);
372# define bner_d(br, r0, r1) _bner_d(_jit,br,r0,r1)
373static jit_word_t _bner_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
374# define bnei_d(br, r0, im) _bnei_d(_jit,br,r0,im)
375static jit_word_t _bnei_d(jit_state_t*,jit_word_t,jit_int32_t,jit_float64_t);
376# define bunltr_d(br, r0, r1) _bunltr_d(_jit,br,r0,r1)
377static jit_word_t _bunltr_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
378# define bunlti_d(br, r0, im) _bunlti_d(_jit,br,r0,im)
379static jit_word_t _bunlti_d(jit_state_t*,jit_word_t,jit_int32_t,jit_float64_t);
380# define bunler_d(br, r0, r1) _bunler_d(_jit,br,r0,r1)
381static jit_word_t _bunler_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
382# define bunlei_d(br, r0, im) _bunlei_d(_jit,br,r0,im)
383static jit_word_t _bunlei_d(jit_state_t*,jit_word_t,jit_int32_t,jit_float64_t);
384# define buneqr_d(br, r0, r1) _buneqr_d(_jit,br,r0,r1)
385static jit_word_t _buneqr_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
386# define buneqi_d(br, r0, im) _buneqi_d(_jit,br,r0,im)
387static jit_word_t _buneqi_d(jit_state_t*,jit_word_t,jit_int32_t,jit_float64_t);
388# define bunger_d(br, r0, r1) _bunger_d(_jit,br,r0,r1)
389static jit_word_t _bunger_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
390# define bungei_d(br, r0, im) _bungei_d(_jit,br,r0,im)
391static jit_word_t _bungei_d(jit_state_t*,jit_word_t,jit_int32_t,jit_float64_t);
392# define bungtr_d(br, r0, r1) _bungtr_d(_jit,br,r0,r1)
393static jit_word_t _bungtr_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
394# define bungti_d(br, r0, im) _bungti_d(_jit,br,r0,im)
395static jit_word_t _bungti_d(jit_state_t*,jit_word_t,jit_int32_t,jit_float64_t);
396# define bltgtr_d(br, r0, r1) _bltgtr_d(_jit,br,r0,r1)
397static jit_word_t _bltgtr_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
398# define bltgti_d(br, r0, im) _bltgti_d(_jit,br,r0,im)
399static jit_word_t _bltgti_d(jit_state_t*,jit_word_t,jit_int32_t,jit_float64_t);
400# define bordr_d(br, r0, r1) _bordr_d(_jit,br,r0,r1)
401static jit_word_t _bordr_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
402# define bordi_d(br, r0, im) _bordi_d(_jit,br,r0,im)
403static jit_word_t _bordi_d(jit_state_t*,jit_word_t,jit_int32_t,jit_float64_t);
404# define bunordr_d(br, r0, r1) _bunordr_d(_jit,br,r0,r1)
405static jit_word_t _bunordr_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
406# define bunordi_d(br, r0, im) _bunordi_d(_jit,br,r0,im)
407static jit_word_t _bunordi_d(jit_state_t*,jit_word_t,jit_int32_t,jit_float64_t);
408# define vaarg_d(r0, r1) _vaarg_d(_jit, r0, r1)
409static void _vaarg_d(jit_state_t*, jit_int32_t, jit_int32_t);
410#endif /* PROTO */
411
412#if CODE
413# define fpr_opi(name, type, size) \
414static void \
415_##name##i_##type(jit_state_t *_jit, \
416 jit_int32_t r0, jit_int32_t r1, \
417 jit_float##size##_t i0) \
418{ \
419 jit_int32_t reg = jit_get_reg(jit_class_fpr); \
420 movi_##type(rn(reg), i0); \
421 name##r_##type(r0, r1, rn(reg)); \
422 jit_unget_reg(reg); \
423}
424# define fopi(name) fpr_opi(name, f, 32)
425# define dopi(name) fpr_opi(name, d, 64)
426
427fopi(add)
428fopi(sub)
429fopi(rsb)
430fopi(mul)
431fopi(div)
432
433static void
434_ldi_f(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
435{
436 jit_int32_t t0;
437 if (simm12_p(i0))
438 FLW(r0, _ZERO_REGNO, i0);
439 else {
440 t0 = jit_get_reg(jit_class_gpr);
441 movi(rn(t0), i0);
442 ldr_f(r0, rn(t0));
443 jit_unget_reg(t0);
444 }
445}
446
447static void
448_ldxr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
449{
450 jit_int32_t t0;
451 t0 = jit_get_reg(jit_class_gpr);
452 addr(rn(t0), r1, r2);
453 ldr_f(r0, rn(t0));
454 jit_unget_reg(t0);
455}
456
457static void
458_ldxi_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
459{
460 jit_int32_t t0;
461 if (simm12_p(i0))
462 FLW(r0, r1, i0);
463 else {
464 t0 = jit_get_reg(jit_class_gpr);
465 addi(rn(t0), r1, i0);
466 ldr_f(r0, rn(t0));
467 jit_unget_reg(t0);
468 }
469}
470
471static void
472_sti_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
473{
474 jit_int32_t t0;
475 if (simm12_p(i0))
476 FSW(r0, _ZERO_REGNO, i0);
477 else {
478 t0 = jit_get_reg(jit_class_gpr);
479 movi(rn(t0), i0);
480 str_f(rn(t0), r0);
481 jit_unget_reg(t0);
482 }
483}
484
485static void
486_stxr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
487{
488 jit_int32_t t0;
489 t0 = jit_get_reg(jit_class_gpr);
490 addr(rn(t0), r0, r1);
491 str_f(rn(t0), r2);
492 jit_unget_reg(t0);
493}
494
495static void
496_stxi_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
497{
498 jit_int32_t t0;
499 if (simm12_p(i0))
500 FSW(r0, r1, i0);
501 else {
502 t0 = jit_get_reg(jit_class_gpr);
503 addi(rn(t0), r0, i0);
504 str_f(rn(t0), r1);
505 jit_unget_reg(t0);
506 }
507}
508
509static void
510_movi_f(jit_state_t *_jit, jit_int32_t r0, jit_float32_t i0)
511{
512 union {
513 jit_int32_t i;
514 jit_float32_t f;
515 } data;
516 jit_int32_t reg;
517 data.f = i0;
518 if (data.i == 0)
519 movr_w_f(r0, _ZERO_REGNO);
520 else {
521 reg = jit_get_reg(jit_class_gpr);
522 movi(rn(reg), data.i);
523 movr_w_f(r0, rn(reg));
524 jit_unget_reg(reg);
525 }
526}
527
528static void
529_movi_f_w(jit_state_t *_jit, jit_int32_t r0, jit_float32_t i0)
530{
531 union {
532 jit_int32_t i;
533 jit_float32_t f;
534 } data;
535 data.f = i0;
536 movi(r0, data.i);
537}
538
539fopi(lt)
540fopi(le)
541fopi(eq)
542fopi(ge)
543fopi(gt)
544
545static void
546_ner_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
547{
548 eqr_f(r0, r1, r2);
549 xori(r0, r0, 1);
550}
551fopi(ne)
552
553# define fpr_bopi(name, type, size) \
554static jit_word_t \
555_b##name##i_##type(jit_state_t *_jit, \
556 jit_word_t i0, jit_int32_t r0, \
557 jit_float##size##_t i1) \
558{ \
559 jit_word_t word; \
560 jit_int32_t reg = jit_get_reg(jit_class_fpr| \
561 jit_class_nospill); \
562 movi_##type(rn(reg), i1); \
563 word = b##name##r_##type(i0, r0, rn(reg)); \
564 jit_unget_reg(reg); \
565 return (word); \
566}
567# define fbopi(name) fpr_bopi(name, f, 32)
568# define dbopi(name) fpr_bopi(name, d, 64)
569
570# define unop(CLASS, OP) \
571 jit_word_t w; \
572 jit_int32_t t0, t1; \
573 t0 = jit_get_reg(jit_class_gpr); \
574 FCLASS_##CLASS(rn(t0), r1); \
575 t1 = jit_get_reg(jit_class_gpr); \
576 FCLASS_##CLASS(rn(t1), r2); \
577 orr(rn(t0), rn(t0), rn(t1)); \
578 jit_unget_reg(t1); \
579 rshi(rn(t0), rn(t0), 8); \
580 ltr(r0, _ZERO_REGNO, rn(t0)); \
581 jit_unget_reg(t0); \
582 w = _jit->pc.w; \
583 BLT(_ZERO_REGNO, r0, 0); \
584 OP(r0, r1, r2); \
585 patch_at(w, _jit->pc.w)
586
587static void
588_unltr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
589{
590 unop(S, ltr_f);
591}
592fopi(unlt)
593
594static void
595_unler_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
596{
597 unop(S, ler_f);
598}
599fopi(unle)
600
601static void
602_uneqr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
603{
604 unop(S, eqr_f);
605}
606fopi(uneq)
607
608static void
609_unger_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
610{
611 unop(S, ger_f);
612}
613fopi(unge)
614
615static void
616_ungtr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
617{
618 unop(S, gtr_f);
619}
620fopi(ungt)
621
622static void
623_ltgtr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
624{
625 jit_word_t w0, w1;
626 jit_int32_t t0, t1;
627 t0 = jit_get_reg(jit_class_gpr);
628 FCLASS_S(rn(t0), r1);
629 t1 = jit_get_reg(jit_class_gpr);
630 FCLASS_S(rn(t1), r2);
631 orr(rn(t0), rn(t0), rn(t1));
632 jit_unget_reg(t1);
633 rshi(rn(t0), rn(t0), 8);
634 ltr(r0, _ZERO_REGNO, rn(t0));
635 jit_unget_reg(t0);
636 w0 = _jit->pc.w;
637 BEQ(_ZERO_REGNO, r0, 0);
638 movr(r0, _ZERO_REGNO);
639 w1 = _jit->pc.w;
640 JAL(_ZERO_REGNO, 0);
641 patch_at(w0, _jit->pc.w);
642 ner_f(r0, r1, r2);
643 patch_at(w1, _jit->pc.w);
644}
645fopi(ltgt)
646
647static void
648_ordr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
649{
650 jit_int32_t t0, t1;
651 t0 = jit_get_reg(jit_class_gpr);
652 FCLASS_S(rn(t0), r1);
653 t1 = jit_get_reg(jit_class_gpr);
654 FCLASS_S(rn(t1), r2);
655 orr(rn(t0), rn(t0), rn(t1));
656 jit_unget_reg(t1);
657 rshi(rn(t0), rn(t0), 8);
658 eqr(r0, _ZERO_REGNO, rn(t0));
659 jit_unget_reg(t0);
660}
661fopi(ord)
662
663static void
664_unordr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
665{
666 jit_int32_t t0, t1;
667 t0 = jit_get_reg(jit_class_gpr);
668 FCLASS_S(rn(t0), r1);
669 t1 = jit_get_reg(jit_class_gpr);
670 FCLASS_S(rn(t1), r2);
671 orr(rn(t0), rn(t0), rn(t1));
672 jit_unget_reg(t1);
673 rshi(rn(t0), rn(t0), 8);
674 ltr(r0, _ZERO_REGNO, rn(t0));
675 jit_unget_reg(t0);
676}
677fopi(unord)
678
679static jit_word_t
680_bltr_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
681{
682 jit_word_t w;
683 jit_int32_t t0;
684 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
685 ltr_f(rn(t0), r1, r2);
686 w = bner(i0, _ZERO_REGNO, rn(t0));
687 jit_unget_reg(t0);
688 return (w);
689}
690fbopi(lt)
691
692static jit_word_t
693_bler_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
694{
695 jit_word_t w;
696 jit_int32_t t0;
697 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
698 ler_f(rn(t0), r1, r2);
699 w = bner(i0, _ZERO_REGNO, rn(t0));
700 jit_unget_reg(t0);
701 return (w);
702}
703fbopi(le)
704
705static jit_word_t
706_beqr_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
707{
708 jit_word_t w;
709 jit_int32_t t0;
710 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
711 eqr_f(rn(t0), r1, r2);
712 w = bner(i0, _ZERO_REGNO, rn(t0));
713 jit_unget_reg(t0);
714 return (w);
715}
716fbopi(eq)
717
718static jit_word_t
719_bger_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
720{
721 jit_word_t w;
722 jit_int32_t t0;
723 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
724 ger_f(rn(t0), r1, r2);
725 w = bner(i0, _ZERO_REGNO, rn(t0));
726 jit_unget_reg(t0);
727 return (w);
728}
729fbopi(ge)
730
731static jit_word_t
732_bgtr_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
733{
734 jit_word_t w;
735 jit_int32_t t0;
736 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
737 gtr_f(rn(t0), r1, r2);
738 w = bner(i0, _ZERO_REGNO, rn(t0));
739 jit_unget_reg(t0);
740 return (w);
741}
742fbopi(gt)
743
744static jit_word_t
745_bner_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
746{
747 jit_word_t w;
748 jit_int32_t t0;
749 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
750 eqr_f(rn(t0), r1, r2);
751 w = beqr(i0, _ZERO_REGNO, rn(t0));
752 jit_unget_reg(t0);
753 return (w);
754}
755fbopi(ne)
756
757static jit_word_t
758_bunltr_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
759{
760 jit_word_t w;
761 jit_int32_t t0;
762 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
763 unltr_f(rn(t0), r1, r2);
764 w = bner(i0, _ZERO_REGNO, rn(t0));
765 jit_unget_reg(t0);
766 return (w);
767}
768fbopi(unlt)
769
770static jit_word_t
771_bunler_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
772{
773 jit_word_t w;
774 jit_int32_t t0;
775 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
776 unler_f(rn(t0), r1, r2);
777 w = bner(i0, _ZERO_REGNO, rn(t0));
778 jit_unget_reg(t0);
779 return (w);
780}
781fbopi(unle)
782
783static jit_word_t
784_buneqr_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
785{
786 jit_word_t w;
787 jit_int32_t t0;
788 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
789 uneqr_f(rn(t0), r1, r2);
790 w = bner(i0, _ZERO_REGNO, rn(t0));
791 jit_unget_reg(t0);
792 return (w);
793}
794fbopi(uneq)
795
796static jit_word_t
797_bunger_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
798{
799 jit_word_t w;
800 jit_int32_t t0;
801 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
802 unger_f(rn(t0), r1, r2);
803 w = bner(i0, _ZERO_REGNO, rn(t0));
804 jit_unget_reg(t0);
805 return (w);
806}
807fbopi(unge)
808
809static jit_word_t
810_bungtr_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
811{
812 jit_word_t w;
813 jit_int32_t t0;
814 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
815 ungtr_f(rn(t0), r1, r2);
816 w = bner(i0, _ZERO_REGNO, rn(t0));
817 jit_unget_reg(t0);
818 return (w);
819}
820fbopi(ungt)
821
822static jit_word_t
823_bltgtr_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
824{
825 jit_word_t w;
826 jit_int32_t t0;
827 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
828 ltgtr_f(rn(t0), r1, r2);
829 w = bner(i0, _ZERO_REGNO, rn(t0));
830 jit_unget_reg(t0);
831 return (w);
832}
833fbopi(ltgt)
834
835static jit_word_t
836_bordr_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
837{
838 jit_word_t w;
839 jit_int32_t t0;
840 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
841 ordr_f(rn(t0), r1, r2);
842 w = bner(i0, _ZERO_REGNO, rn(t0));
843 jit_unget_reg(t0);
844 return (w);
845}
846fbopi(ord)
847
848static jit_word_t
849_bunordr_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
850{
851 jit_word_t w;
852 jit_int32_t t0;
853 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
854 unordr_f(rn(t0), r1, r2);
855 w = bner(i0, _ZERO_REGNO, rn(t0));
856 jit_unget_reg(t0);
857 return (w);
858}
859fbopi(unord)
860
861dopi(add)
862dopi(sub)
863dopi(rsb)
864dopi(mul)
865dopi(div)
866
867static void
868_ldi_d(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
869{
870 jit_int32_t t0;
871 if (simm12_p(i0))
872 FLD(r0, _ZERO_REGNO, i0);
873 else {
874 t0 = jit_get_reg(jit_class_gpr);
875 movi(rn(t0), i0);
876 ldr_d(r0, rn(t0));
877 jit_unget_reg(t0);
878 }
879}
880
881static void
882_ldxr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
883{
884 jit_int32_t t0;
885 t0 = jit_get_reg(jit_class_gpr);
886 addr(rn(t0), r1, r2);
887 ldr_d(r0, rn(t0));
888 jit_unget_reg(t0);
889}
890
891static void
892_ldxi_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
893{
894 jit_int32_t t0;
895 if (simm12_p(i0))
896 FLD(r0, r1, i0);
897 else {
898 t0 = jit_get_reg(jit_class_gpr);
899 addi(rn(t0), r1, i0);
900 ldr_d(r0, rn(t0));
901 jit_unget_reg(t0);
902 }
903}
904
905static void
906_sti_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
907{
908 jit_int32_t t0;
909 if (simm12_p(i0))
910 FSD(r0, _ZERO_REGNO, i0);
911 else {
912 t0 = jit_get_reg(jit_class_gpr);
913 movi(rn(t0), i0);
914 str_d(rn(t0), r0);
915 jit_unget_reg(t0);
916 }
917}
918
919static void
920_stxr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
921{
922 jit_int32_t t0;
923 t0 = jit_get_reg(jit_class_gpr);
924 addr(rn(t0), r0, r1);
925 str_d(rn(t0), r2);
926 jit_unget_reg(t0);
927}
928
929static void
930_stxi_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
931{
932 jit_int32_t t0;
933 if (simm12_p(i0))
934 FSD(r0, r1, i0);
935 else {
936 t0 = jit_get_reg(jit_class_gpr);
937 addi(rn(t0), r0, i0);
938 str_d(rn(t0), r1);
939 jit_unget_reg(t0);
940 }
941}
942
943static void
944_movi_d(jit_state_t *_jit, jit_int32_t r0, jit_float64_t i0)
945{
946 union {
947 jit_word_t w;
948 jit_float64_t d;
949 } data;
950 jit_int32_t reg;
951 data.d = i0;
952 if (data.w == 0)
953 movr_w_d(r0, _ZERO_REGNO);
954 else {
955 reg = jit_get_reg(jit_class_gpr);
956 movi(rn(reg), data.w);
957 movr_w_d(r0, rn(reg));
958 jit_unget_reg(reg);
959 }
960}
961
962static void
963_movi_d_w(jit_state_t *_jit, jit_int32_t r0, jit_float64_t i0)
964{
965 union {
966 jit_int64_t l;
967 jit_float64_t d;
968 } data;
969 data.d = i0;
970 movi(r0, data.l);
971}
972
973dopi(lt)
974dopi(le)
975dopi(eq)
976dopi(ge)
977dopi(gt)
978
979static void
980_ner_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
981{
982 eqr_d(r0, r1, r2);
983 xori(r0, r0, 1);
984}
985dopi(ne)
986
987static void
988_unltr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
989{
990 unop(D, ltr_d);
991}
992dopi(unlt)
993
994static void
995_unler_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
996{
997 unop(D, ler_d);
998}
999dopi(unle)
1000
1001static void
1002_uneqr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1003{
1004 unop(D, eqr_d);
1005}
1006dopi(uneq)
1007
1008static void
1009_unger_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1010{
1011 unop(D, ger_d);
1012}
1013dopi(unge)
1014
1015static void
1016_ungtr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1017{
1018 unop(D, gtr_d);
1019}
1020dopi(ungt)
1021
1022static void
1023_ltgtr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1024{
1025 jit_word_t w0, w1;
1026 jit_int32_t t0, t1;
1027 t0 = jit_get_reg(jit_class_gpr);
1028 FCLASS_D(rn(t0), r1);
1029 t1 = jit_get_reg(jit_class_gpr);
1030 FCLASS_D(rn(t1), r2);
1031 orr(rn(t0), rn(t0), rn(t1));
1032 jit_unget_reg(t1);
1033 rshi(rn(t0), rn(t0), 8);
1034 ltr(r0, _ZERO_REGNO, rn(t0));
1035 jit_unget_reg(t0);
1036 w0 = _jit->pc.w;
1037 BEQ(_ZERO_REGNO, r0, 0);
1038 movr(r0, _ZERO_REGNO);
1039 w1 = _jit->pc.w;
1040 JAL(_ZERO_REGNO, 0);
1041 patch_at(w0, _jit->pc.w);
1042 ner_d(r0, r1, r2);
1043 patch_at(w1, _jit->pc.w);
1044}
1045dopi(ltgt)
1046
1047static void
1048_ordr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1049{
1050 jit_int32_t t0, t1;
1051 t0 = jit_get_reg(jit_class_gpr);
1052 FCLASS_D(rn(t0), r1);
1053 t1 = jit_get_reg(jit_class_gpr);
1054 FCLASS_D(rn(t1), r2);
1055 orr(rn(t0), rn(t0), rn(t1));
1056 jit_unget_reg(t1);
1057 rshi(rn(t0), rn(t0), 8);
1058 eqr(r0, _ZERO_REGNO, rn(t0));
1059 jit_unget_reg(t0);
1060}
1061dopi(ord)
1062
1063static void
1064_unordr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1065{
1066 jit_int32_t t0, t1;
1067 t0 = jit_get_reg(jit_class_gpr);
1068 FCLASS_D(rn(t0), r1);
1069 t1 = jit_get_reg(jit_class_gpr);
1070 FCLASS_D(rn(t1), r2);
1071 orr(rn(t0), rn(t0), rn(t1));
1072 jit_unget_reg(t1);
1073 rshi(rn(t0), rn(t0), 8);
1074 ltr(r0, _ZERO_REGNO, rn(t0));
1075 jit_unget_reg(t0);
1076}
1077dopi(unord)
1078
1079static jit_word_t
1080_bltr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
1081{
1082 jit_word_t w;
1083 jit_int32_t t0;
1084 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
1085 ltr_d(rn(t0), r1, r2);
1086 w = bner(i0, _ZERO_REGNO, rn(t0));
1087 jit_unget_reg(t0);
1088 return (w);
1089}
1090dbopi(lt)
1091
1092static jit_word_t
1093_bler_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
1094{
1095 jit_word_t w;
1096 jit_int32_t t0;
1097 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
1098 ler_d(rn(t0), r1, r2);
1099 w = bner(i0, _ZERO_REGNO, rn(t0));
1100 jit_unget_reg(t0);
1101 return (w);
1102}
1103dbopi(le)
1104
1105static jit_word_t
1106_beqr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
1107{
1108 jit_word_t w;
1109 jit_int32_t t0;
1110 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
1111 eqr_d(rn(t0), r1, r2);
1112 w = bner(i0, _ZERO_REGNO, rn(t0));
1113 jit_unget_reg(t0);
1114 return (w);
1115}
1116dbopi(eq)
1117
1118static jit_word_t
1119_bger_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
1120{
1121 jit_word_t w;
1122 jit_int32_t t0;
1123 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
1124 ger_d(rn(t0), r1, r2);
1125 w = bner(i0, _ZERO_REGNO, rn(t0));
1126 jit_unget_reg(t0);
1127 return (w);
1128}
1129dbopi(ge)
1130
1131static jit_word_t
1132_bgtr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
1133{
1134 jit_word_t w;
1135 jit_int32_t t0;
1136 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
1137 gtr_d(rn(t0), r1, r2);
1138 w = bner(i0, _ZERO_REGNO, rn(t0));
1139 jit_unget_reg(t0);
1140 return (w);
1141}
1142dbopi(gt)
1143
1144static jit_word_t
1145_bner_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
1146{
1147 jit_word_t w;
1148 jit_int32_t t0;
1149 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
1150 eqr_d(rn(t0), r1, r2);
1151 w = beqr(i0, _ZERO_REGNO, rn(t0));
1152 jit_unget_reg(t0);
1153 return (w);
1154}
1155dbopi(ne)
1156
1157static jit_word_t
1158_bunltr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
1159{
1160 jit_word_t w;
1161 jit_int32_t t0;
1162 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
1163 unltr_d(rn(t0), r1, r2);
1164 w = bner(i0, _ZERO_REGNO, rn(t0));
1165 jit_unget_reg(t0);
1166 return (w);
1167}
1168dbopi(unlt)
1169
1170static jit_word_t
1171_bunler_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
1172{
1173 jit_word_t w;
1174 jit_int32_t t0;
1175 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
1176 unler_d(rn(t0), r1, r2);
1177 w = bner(i0, _ZERO_REGNO, rn(t0));
1178 jit_unget_reg(t0);
1179 return (w);
1180}
1181dbopi(unle)
1182
1183static jit_word_t
1184_buneqr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
1185{
1186 jit_word_t w;
1187 jit_int32_t t0;
1188 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
1189 uneqr_d(rn(t0), r1, r2);
1190 w = bner(i0, _ZERO_REGNO, rn(t0));
1191 jit_unget_reg(t0);
1192 return (w);
1193}
1194dbopi(uneq)
1195
1196static jit_word_t
1197_bunger_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
1198{
1199 jit_word_t w;
1200 jit_int32_t t0;
1201 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
1202 unger_d(rn(t0), r1, r2);
1203 w = bner(i0, _ZERO_REGNO, rn(t0));
1204 jit_unget_reg(t0);
1205 return (w);
1206}
1207dbopi(unge)
1208
1209static jit_word_t
1210_bungtr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
1211{
1212 jit_word_t w;
1213 jit_int32_t t0;
1214 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
1215 ungtr_d(rn(t0), r1, r2);
1216 w = bner(i0, _ZERO_REGNO, rn(t0));
1217 jit_unget_reg(t0);
1218 return (w);
1219}
1220dbopi(ungt)
1221
1222static jit_word_t
1223_bltgtr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
1224{
1225 jit_word_t w;
1226 jit_int32_t t0;
1227 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
1228 ltgtr_d(rn(t0), r1, r2);
1229 w = bner(i0, _ZERO_REGNO, rn(t0));
1230 jit_unget_reg(t0);
1231 return (w);
1232}
1233dbopi(ltgt)
1234
1235static jit_word_t
1236_bordr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
1237{
1238 jit_word_t w;
1239 jit_int32_t t0;
1240 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
1241 ordr_d(rn(t0), r1, r2);
1242 w = bner(i0, _ZERO_REGNO, rn(t0));
1243 jit_unget_reg(t0);
1244 return (w);
1245}
1246dbopi(ord)
1247
1248static jit_word_t
1249_bunordr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
1250{
1251 jit_word_t w;
1252 jit_int32_t t0;
1253 t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
1254 unordr_d(rn(t0), r1, r2);
1255 w = bner(i0, _ZERO_REGNO, rn(t0));
1256 jit_unget_reg(t0);
1257 return (w);
1258}
1259dbopi(unord)
1260
1261static void
1262_vaarg_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1263{
1264 assert(_jitc->function->self.call & jit_call_varargs);
1265 /* Load argument. */
1266 ldr_d(r0, r1);
1267 /* Update va_list. */
1268 addi(r1, r1, sizeof(jit_float64_t));
1269}
1270
1271#endif /* CODE */