2 * Copyright (C) 2022 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
21 # define FADD_S(fd, fj, fk) orrr(0x201, fk, fj, fd)
22 # define FADD_D(fd, fj, fk) orrr(0x202, fk, fj, fd)
23 # define FSUB_S(fd, fj, fk) orrr(0x205, fk, fj, fd)
24 # define FSUB_D(fd, fj, fk) orrr(0x206, fk, fj, fd)
25 # define FMUL_S(fd, fj, fk) orrr(0x209, fk, fj, fd)
26 # define FMUL_D(fd, fj, fk) orrr(0x20a, fk, fj, fd)
27 # define FDIV_S(fd, fj, fk) orrr(0x20d, fk, fj, fd)
28 # define FDIV_D(fd, fj, fk) orrr(0x20e, fk, fj, fd)
29 # define FMAX_S(fd, fj, fk) orrr(0x211, fk, fj, fd)
30 # define FMAX_D(fd, fj, fk) orrr(0x212, fk, fj, fd)
31 # define FMIN_S(fd, fj, fk) orrr(0x215, fk, fj, fd)
32 # define FMIN_D(fd, fj, fk) orrr(0x216, fk, fj, fd)
33 # define FMAXA_S(fd, fj, fk) orrr(0x219, fk, fj, fd)
34 # define FMAXA_D(fd, fj, fk) orrr(0x21a, fk, fj, fd)
35 # define FMINA_S(fd, fj, fk) orrr(0x21d, fk, fj, fd)
36 # define FMINA_D(fd, fj, fk) orrr(0x21e, fk, fj, fd)
37 # define FSCALEB_S(fd, fj, fk) orrr(0x221, fk, fj, fd)
38 # define FSCALEB_D(fd, fj, fk) orrr(0x222, fk, fj, fd)
39 # define FCOPYSIGN_S(fd, fj, fk) orrr(0x225, fk, fj, fd)
40 # define FCOPYSIGN_D(fd, fj, fk) orrr(0x226, fk, fj, fd)
41 # define FABS_S(fd, fj) ou5rr(0x228, 0x01, fj, fd)
42 # define FABS_D(fd, fj) ou5rr(0x228, 0x02, fj, fd)
43 # define FNEG_S(fd, fj) ou5rr(0x228, 0x05, fj, fd)
44 # define FNEG_D(fd, fj) ou5rr(0x228, 0x06, fj, fd)
45 # define FGLOB_S(fd, fj) ou5rr(0x228, 0x09, fj, fd)
46 # define FGLOB_D(fd, fj) ou5rr(0x228, 0x0a, fj, fd)
47 # define FCLASS_S(fd, fj) ou5rr(0x228, 0x0d, fj, fd)
48 # define FCLASS_D(fd, fj) ou5rr(0x228, 0x0e, fj, fd)
49 # define FSQRT_S(fd, fj) ou5rr(0x228, 0x11, fj, fd)
50 # define FSQRT_D(fd, fj) ou5rr(0x228, 0x12, fj, fd)
51 # define FRECIP_S(fd, fj) ou5rr(0x228, 0x15, fj, fd)
52 # define FRECIP_D(fd, fj) ou5rr(0x228, 0x16, fj, fd)
53 # define FRSQRT_S(fd, fj) ou5rr(0x228, 0x19, fj, fd)
54 # define FRSQRT_D(fd, fj) ou5rr(0x228, 0x1a, fj, fd)
55 # define FMOV_S(fd, fj) ou5rr(0x229, 0x05, fj, fd)
56 # define FMOV_D(fd, fj) ou5rr(0x229, 0x06, fj, fd)
57 # define MOVGR2FR_W(fd, rj) ou5rr(0x229, 0x09, rj, fd)
58 # define MOVGR2FR_D(fd, rj) ou5rr(0x229, 0x0a, rj, fd)
59 # define MOVGR2FRH_W(fd, rj) ou5rr(0x229, 0x0b, rj, fd)
60 # define MOVFR2GR_S(rd, fj) ou5rr(0x229, 0x0d, fj, rd)
61 # define MOVFR2GR_D(rd, fj) ou5rr(0x229, 0x0e, fj, rd)
62 # define MOVFRH2GR_S(rd, fj) ou5rr(0x229, 0x0f, fj, rd)
63 # define MOVGR2FCSR(fc, rj) ou5rr(0x229, 0x10, rj, fc)
64 # define MOVFCSR2GR(rd, fc) ou5rr(0x229, 0x12, fc, rd)
65 # define MOVFR2CF(cd, fj) o5r23(0x229, 0x14, fj, 0, cd)
66 # define MOVCF2FR(fd, cj) o523r(0x229, 0x15, 0, cj, fd)
67 # define MOVGR2CF(cd, fj) o5r23(0x229, 0x16, fj, 0, cd)
68 # define MOVCF2GR(fd, cj) o523r(0x229, 0x17, 0, cj, fd)
69 # define FCVT_S_D(fd, fj) ou5rr(0x232, 0x06, fj, fd)
70 # define FCVT_D_S(fd, fj) ou5rr(0x232, 0x09, fj, fd)
71 # define FTINTRM_W_S(fd, fj) ou5rr(0x234, 0x01, fj, fd)
72 # define FTINTRM_W_D(fd, fj) ou5rr(0x234, 0x02, fj, fd)
73 # define FTINTRM_L_S(fd, fj) ou5rr(0x234, 0x09, fj, fd)
74 # define FTINTRM_L_D(fd, fj) ou5rr(0x234, 0x0a, fj, fd)
75 # define FTINTRP_W_S(fd, fj) ou5rr(0x234, 0x11, fj, fd)
76 # define FTINTRP_W_D(fd, fj) ou5rr(0x234, 0x12, fj, fd)
77 # define FTINTRP_L_S(fd, fj) ou5rr(0x234, 0x19, fj, fd)
78 # define FTINTRP_L_D(fd, fj) ou5rr(0x234, 0x1a, fj, fd)
79 # define FTINTRZ_W_S(fd, fj) ou5rr(0x235, 0x01, fj, fd)
80 # define FTINTRZ_W_D(fd, fj) ou5rr(0x235, 0x02, fj, fd)
81 # define FTINTRZ_L_S(fd, fj) ou5rr(0x235, 0x09, fj, fd)
82 # define FTINTRZ_L_D(fd, fj) ou5rr(0x235, 0x0a, fj, fd)
83 # define FTINTRNE_W_S(fd, fj) ou5rr(0x235, 0x11, fj, fd)
84 # define FTINTRNE_W_D(fd, fj) ou5rr(0x235, 0x12, fj, fd)
85 # define FTINTRNE_L_S(fd, fj) ou5rr(0x235, 0x19, fj, fd)
86 # define FTINTRNE_L_D(fd, fj) ou5rr(0x235, 0x1a, fj, fd)
87 # define FTINT_W_S(fd, fj) ou5rr(0x236, 0x01, fj, fd)
88 # define FTINT_W_D(fd, fj) ou5rr(0x236, 0x02, fj, fd)
89 # define FTINT_L_S(fd, fj) ou5rr(0x236, 0x09, fj, fd)
90 # define FTINT_L_D(fd, fj) ou5rr(0x236, 0x0a, fj, fd)
91 # define FFINT_S_W(fd, fj) ou5rr(0x23a, 0x04, fj, fd)
92 # define FFINT_S_L(fd, fj) ou5rr(0x23a, 0x06, fj, fd)
93 # define FFINT_D_W(fd, fj) ou5rr(0x23a, 0x08, fj, fd)
94 # define FFINT_D_L(fd, fj) ou5rr(0x23a, 0x0a, fj, fd)
95 # define FRINT_S(fd, fj) ou5rr(0x23c, 0x11, fj, fd)
96 # define FRINT_D(fd, fj) ou5rr(0x23c, 0x12, fj, fd)
97 # define FMADD_S(fd, fj, fk, fa) orrrr(0x081, fa, fk, fj, fd)
98 # define FMADD_D(fd, fj, fk, fa) orrrr(0x082, fa, fk, fj, fd)
99 # define FMSUB_S(fd, fj, fk, fa) orrrr(0x085, fa, fk, fj, fd)
100 # define FMSUB_D(fd, fj, fk, fa) orrrr(0x086, fa, fk, fj, fd)
101 # define FNMADD_S(fd, fj, fk, fa) orrrr(0x089, fa, fk, fj, fd)
102 # define FNMADD_D(fd, fj, fk, fa) orrrr(0x08a, fa, fk, fj, fd)
103 # define FNMSUB_S(fd, fj, fk, fa) orrrr(0x08d, fa, fk, fj, fd)
104 # define FNMSUB_D(fd, fj, fk, fa) orrrr(0x08e, fa, fk, fj, fd)
105 /* No QNaN exception */
129 # define FCMP_cond_S(cc, cd, fj, fk) ou5rru2u3(0x0c1, cc, fk, fj, 0, cd)
130 # define FCMP_CAF_S(cd, fj, fk) FCMP_cond_S( _CAF, cd, fj, fk)
131 # define FCMP_CUN_S(cd, fj, fk) FCMP_cond_S( _CUN, cd, fj, fk)
132 # define FCMP_CEQ_S(cd, fj, fk) FCMP_cond_S( _CEQ, cd, fj, fk)
133 # define FCMP_CUEQ_S(cd, fj, fk) FCMP_cond_S(_CUEQ, cd, fj, fk)
134 # define FCMP_CLT_S(cd, fj, fk) FCMP_cond_S( _CLT, cd, fj, fk)
135 # define FCMP_CULT_S(cd, fj, fk) FCMP_cond_S(_CULT, cd, fj, fk)
136 # define FCMP_CLE_S(cd, fj, fk) FCMP_cond_S( _CLE, cd, fj, fk)
137 # define FCMP_CULE_S(cd, fj, fk) FCMP_cond_S(_CULE, cd, fj, fk)
138 # define FCMP_CNE_S(cd, fj, fk) FCMP_cond_S( _CNE, cd, fj, fk)
139 # define FCMP_COR_S(cd, fj, fk) FCMP_cond_S( _COR, cd, fj, fk)
140 # define FCMP_CUNE_S(cd, fj, fk) FCMP_cond_S(_CUNE, cd, fj, fk)
141 # define FCMP_SAF_S(cd, fj, fk) FCMP_cond_S( _CAF, cd, fj, fk)
142 # define FCMP_SUN_S(cd, fj, fk) FCMP_cond_S( _CUN, cd, fj, fk)
143 # define FCMP_SEQ_S(cd, fj, fk) FCMP_cond_S( _CEQ, cd, fj, fk)
144 # define FCMP_SUEQ_S(cd, fj, fk) FCMP_cond_S(_CUEQ, cd, fj, fk)
145 # define FCMP_SLT_S(cd, fj, fk) FCMP_cond_S( _CLT, cd, fj, fk)
146 # define FCMP_SULT_S(cd, fj, fk) FCMP_cond_S(_CULT, cd, fj, fk)
147 # define FCMP_SLE_S(cd, fj, fk) FCMP_cond_S( _CLE, cd, fj, fk)
148 # define FCMP_SULE_S(cd, fj, fk) FCMP_cond_S(_CULE, cd, fj, fk)
149 # define FCMP_SNE_S(cd, fj, fk) FCMP_cond_S( _CNE, cd, fj, fk)
150 # define FCMP_SOR_S(cd, fj, fk) FCMP_cond_S( _COR, cd, fj, fk)
151 # define FCMP_SUNE_S(cd, fj, fk) FCMP_cond_S(_CUNE, cd, fj, fk)
152 # define FCMP_cond_D(cc, cd, fj, fk) ou5rru2u3(0x0c2, cc, fk, fj, 0, cd)
153 # define FCMP_CAF_D(cd, fj, fk) FCMP_cond_D( _CAF, cd, fj, fk)
154 # define FCMP_CUN_D(cd, fj, fk) FCMP_cond_D( _CUN, cd, fj, fk)
155 # define FCMP_CEQ_D(cd, fj, fk) FCMP_cond_D( _CEQ, cd, fj, fk)
156 # define FCMP_CUEQ_D(cd, fj, fk) FCMP_cond_D(_CUEQ, cd, fj, fk)
157 # define FCMP_CLT_D(cd, fj, fk) FCMP_cond_D( _CLT, cd, fj, fk)
158 # define FCMP_CULT_D(cd, fj, fk) FCMP_cond_D(_CULT, cd, fj, fk)
159 # define FCMP_CLE_D(cd, fj, fk) FCMP_cond_D( _CLE, cd, fj, fk)
160 # define FCMP_CULE_D(cd, fj, fk) FCMP_cond_D(_CULE, cd, fj, fk)
161 # define FCMP_CNE_D(cd, fj, fk) FCMP_cond_D( _CNE, cd, fj, fk)
162 # define FCMP_COR_D(cd, fj, fk) FCMP_cond_D( _COR, cd, fj, fk)
163 # define FCMP_CUNE_D(cd, fj, fk) FCMP_cond_D(_CUNE, cd, fj, fk)
164 # define FCMP_SAF_D(cd, fj, fk) FCMP_cond_D( _CAF, cd, fj, fk)
165 # define FCMP_SUN_D(cd, fj, fk) FCMP_cond_D( _CUN, cd, fj, fk)
166 # define FCMP_SEQ_D(cd, fj, fk) FCMP_cond_D( _CEQ, cd, fj, fk)
167 # define FCMP_SUEQ_D(cd, fj, fk) FCMP_cond_D(_CUEQ, cd, fj, fk)
168 # define FCMP_SLT_D(cd, fj, fk) FCMP_cond_D( _CLT, cd, fj, fk)
169 # define FCMP_SULT_D(cd, fj, fk) FCMP_cond_D(_CULT, cd, fj, fk)
170 # define FCMP_SLE_D(cd, fj, fk) FCMP_cond_D( _CLE, cd, fj, fk)
171 # define FCMP_SULE_D(cd, fj, fk) FCMP_cond_D(_CULE, cd, fj, fk)
172 # define FCMP_SNE_D(cd, fj, fk) FCMP_cond_D( _CNE, cd, fj, fk)
173 # define FCMP_SOR_D(cd, fj, fk) FCMP_cond_D( _COR, cd, fj, fk)
174 # define FCMP_SUNE_D(cd, fj, fk) FCMP_cond_D(_CUNE, cd, fj, fk)
175 # define FSEL(fd, fj, fk, u3) ou3rrr(0x340, u3, fk, fj, fd)
176 # define FLD_S(fd, rj, si12) os12rr(0x0ac, si12, rj, fd)
177 # define FST_S(fd, rj, si12) os12rr(0x0ad, si12, rj, fd)
178 # define FLD_D(fd, rj, si12) os12rr(0x0ae, si12, rj, fd)
179 # define FST_D(fd, rj, si12) os12rr(0x0af, si12, rj, fd)
180 # define FLDX_S(fd, rj, rk) orrr(0x7060, rk, rj, fd)
181 # define FLDX_D(fd, rj, rk) orrr(0x7068, rk, rj, fd)
182 # define FSTX_S(fd, rj, rk) orrr(0x7070, rk, rj, fd)
183 # define FSTX_D(fd, rj, rk) orrr(0x7078, rk, rj, fd)
184 # define FLDGT_S(fd, rj, rk) orrr(0x70e8, rk, rj, fd)
185 # define FLDGT_D(fd, rj, rk) orrr(0x70e9, rk, rj, fd)
186 # define FLDLE_S(fd, rj, rk) orrr(0x70ea, rk, rj, fd)
187 # define FLDLE_D(fd, rj, rk) orrr(0x70eb, rk, rj, fd)
188 # define FSTGT_S(fd, rj, rk) orrr(0x70ec, rk, rj, fd)
189 # define FSTGT_D(fd, rj, rk) orrr(0x70ed, rk, rj, fd)
190 # define FSTLE_S(fd, rj, rk) orrr(0x70ee, rk, rj, fd)
191 # define FSTLE_D(fd, rj, rk) orrr(0x70ef, rk, rj, fd)
192 # define truncr_f_i(r0, r1) _truncr_f_i(_jit, r0, r1)
193 static void _truncr_f_i(jit_state_t*, jit_int32_t, jit_int32_t);
194 # define truncr_d_i(r0, r1) _truncr_d_i(_jit, r0, r1)
195 static void _truncr_d_i(jit_state_t*, jit_int32_t, jit_int32_t);
196 # define truncr_f_l(r0, r1) _truncr_f_l(_jit, r0, r1)
197 static void _truncr_f_l(jit_state_t*, jit_int32_t, jit_int32_t);
198 # define truncr_d_l(r0, r1) _truncr_d_l(_jit, r0, r1)
199 static void _truncr_d_l(jit_state_t*, jit_int32_t, jit_int32_t);
200 # define addr_f(r0, r1, r2) FADD_S(r0, r1, r2)
201 # define addi_f(r0, r1, i0) _addi_f(_jit, r0, r1, i0)
202 static void _addi_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_float32_t);
203 # define subr_f(r0, r1, r2) FSUB_S(r0, r1, r2)
204 # define subi_f(r0, r1, i0) _subi_f(_jit, r0, r1, i0)
205 static void _subi_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_float32_t);
206 # define rsbr_f(r0, r1, r2) FSUB_S(r0, r2, r1)
207 # define rsbi_f(r0, r1, i0) _rsbi_f(_jit, r0, r1, i0)
208 static void _rsbi_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_float32_t);
209 # define mulr_f(r0, r1, r2) FMUL_S(r0, r1, r2)
210 # define muli_f(r0, r1, i0) _muli_f(_jit, r0, r1, i0)
211 static void _muli_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_float32_t);
212 # define divr_f(r0, r1, r2) FDIV_S(r0, r1, r2)
213 # define divi_f(r0, r1, i0) _divi_f(_jit, r0, r1, i0)
214 static void _divi_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_float32_t);
215 # define absr_f(r0, r1) FABS_S(r0, r1)
216 # define negr_f(r0, r1) FNEG_S(r0, r1)
217 # define sqrtr_f(r0, r1) FSQRT_S(r0, r1)
218 # define extr_f(r0, r1) _extr_f(_jit, r0, r1)
219 static void _extr_f(jit_state_t*, jit_int32_t, jit_int32_t);
220 # define ldr_f(r0, r1) FLD_S(r0, r1, 0)
221 # define ldi_f(r0, i0) _ldi_f(_jit, r0, i0)
222 static void _ldi_f(jit_state_t*, jit_int32_t, jit_word_t);
223 # define ldxr_f(r0, r1, r2) FLDX_S(r0, r1, r2)
224 # define ldxi_f(r0, r1, i0) _ldxi_f(_jit, r0, r1, i0)
225 static void _ldxi_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
226 # define str_f(r0, r1) FST_S(r1, r0, 0)
227 # define sti_f(i0, r0) _sti_f(_jit, i0, r0)
228 static void _sti_f(jit_state_t*, jit_word_t, jit_int32_t);
229 # define stxr_f(r0, r1, r2) FSTX_S(r2, r1, r0)
230 # define stxi_f(i0, r0, r1) _stxi_f(_jit, i0, r0, r1)
231 static void _stxi_f(jit_state_t*, jit_word_t, jit_int32_t, jit_int32_t);
232 # define movr_f(r0, r1) FMOV_S(r0, r1)
233 # define movi_f(r0, i0) _movi_f(_jit, r0, i0)
234 static void _movi_f(jit_state_t*, jit_int32_t, jit_float32_t);
235 # define movr_f_w(r0, r1) MOVFR2GR_S(r0, r1)
236 # define movi_f_w(r0, im) _movi_f_w(_jit, r0, im)
237 static void _movi_f_w(jit_state_t*, jit_int32_t, jit_float32_t);
238 # define movr_w_f(r0, r1) MOVGR2FR_W(r0, r1)
239 # define extr_d_f(r0, r1) FCVT_S_D(r0, r1)
240 # define ltr_f(r0, r1, r2) _ltr_f(_jit, r0, r1, r2)
241 static void _ltr_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
242 # define lti_f(r0, r1, i0) _lti_f(_jit, r0, r1, i0)
243 static void _lti_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_float32_t);
244 # define ler_f(r0, r1, r2) _ler_f(_jit, r0, r1, r2)
245 static void _ler_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
246 # define lei_f(r0, r1, i0) _lei_f(_jit, r0, r1, i0)
247 static void _lei_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_float32_t);
248 # define eqr_f(r0, r1, r2) _eqr_f(_jit, r0, r1, r2)
249 static void _eqr_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
250 # define eqi_f(r0, r1, i0) _eqi_f(_jit, r0, r1, i0)
251 static void _eqi_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_float32_t);
252 # define ger_f(r0, r1, r2) _ger_f(_jit, r0, r1, r2)
253 static void _ger_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
254 # define gei_f(r0, r1, i0) _gei_f(_jit, r0, r1, i0)
255 static void _gei_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_float32_t);
256 # define gtr_f(r0, r1, r2) _gtr_f(_jit, r0, r1, r2)
257 static void _gtr_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
258 # define gti_f(r0, r1, i0) _gti_f(_jit, r0, r1, i0)
259 static void _gti_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_float32_t);
260 # define ner_f(r0, r1, r2) _ner_f(_jit, r0, r1, r2)
261 static void _ner_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
262 # define nei_f(r0, r1, i0) _nei_f(_jit, r0, r1, i0)
263 static void _nei_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_float32_t);
264 # define unltr_f(r0, r1, r2) _unltr_f(_jit, r0, r1, r2)
265 static void _unltr_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
266 # define unlti_f(r0, r1, i0) _unlti_f(_jit, r0, r1, i0)
267 static void _unlti_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_float32_t);
268 # define unler_f(r0, r1, r2) _unler_f(_jit, r0, r1, r2)
269 static void _unler_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
270 # define unlei_f(r0, r1, i1) _unlei_f(_jit, r0, r1, i1)
271 static void _unlei_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_float32_t);
272 # define uneqr_f(r0, r1, r2) _uneqr_f(_jit, r0, r1, r2)
273 static void _uneqr_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
274 # define uneqi_f(r0, r1, i0) _uneqi_f(_jit, r0, r1, i0)
275 static void _uneqi_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_float32_t);
276 # define unger_f(r0, r1, r2) _unger_f(_jit, r0, r1, r2)
277 static void _unger_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
278 # define ungei_f(r0, r1, i0) _ungei_f(_jit, r0, r1, i0)
279 static void _ungei_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_float32_t);
280 # define ungtr_f(r0, r1, r2) _ungtr_f(_jit, r0, r1, r2)
281 static void _ungtr_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
282 # define ungti_f(r0, r1, i0) _ungti_f(_jit, r0, r1, i0)
283 static void _ungti_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_float32_t);
284 # define ltgtr_f(r0, r1, r2) _ltgtr_f(_jit, r0, r1, r2)
285 static void _ltgtr_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
286 # define ltgti_f(r0, r1, i0) _ltgti_f(_jit, r0, r1, i0)
287 static void _ltgti_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_float32_t);
288 # define ordr_f(r0, r1, r2) _ordr_f(_jit, r0, r1, r2)
289 static void _ordr_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
290 # define ordi_f(r0, r1, i0) _ordi_f(_jit, r0, r1, i0)
291 static void _ordi_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_float32_t);
292 # define unordr_f(r0, r1, r2) _unordr_f(_jit, r0, r1, r2)
293 static void _unordr_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
294 # define unordi_f(r0, r1, i0) _unordi_f(_jit, r0, r1, i0)
295 static void _unordi_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_float32_t);
296 # define bltr_f(i0, r0, r1) _bltr_f(_jit, i0, r0, r1)
297 static jit_word_t _bltr_f(jit_state_t*, jit_word_t, jit_int32_t, jit_int32_t);
298 # define blti_f(i0, r0, i1) _blti_f(_jit, i0, r0, i1)
299 static jit_word_t _blti_f(jit_state_t*, jit_word_t, jit_int32_t, jit_float32_t);
300 # define bler_f(i0, r0, r1) _bler_f(_jit, i0, r0, r1)
301 static jit_word_t _bler_f(jit_state_t*, jit_word_t, jit_int32_t, jit_int32_t);
302 # define blei_f(i0, r0, i1) _blei_f(_jit, i0, r0, i1)
303 static jit_word_t _blei_f(jit_state_t*, jit_word_t, jit_int32_t, jit_float32_t);
304 # define beqr_f(i0, r0, r1) _beqr_f(_jit, i0, r0, r1)
305 static jit_word_t _beqr_f(jit_state_t*, jit_word_t, jit_int32_t, jit_int32_t);
306 # define beqi_f(i0, r0, i1) _beqi_f(_jit, i0, r0, i1)
307 static jit_word_t _beqi_f(jit_state_t*, jit_word_t, jit_int32_t, jit_float32_t);
308 # define bger_f(i0, r0, r1) _bger_f(_jit, i0, r0, r1)
309 static jit_word_t _bger_f(jit_state_t*, jit_word_t, jit_int32_t, jit_int32_t);
310 # define bgei_f(i0, r0, i1) _bgei_f(_jit, i0, r0, i1)
311 static jit_word_t _bgei_f(jit_state_t*, jit_word_t, jit_int32_t, jit_float32_t);
312 # define bgtr_f(i0, r0, r1) _bgtr_f(_jit,i0, r0, r1)
313 static jit_word_t _bgtr_f(jit_state_t*, jit_word_t, jit_int32_t, jit_int32_t);
314 # define bgti_f(i0, r0, i1) _bgti_f(_jit, i0, r0, i1)
315 static jit_word_t _bgti_f(jit_state_t*, jit_word_t, jit_int32_t, jit_float32_t);
316 # define bner_f(i0, r0, r1) _bner_f(_jit, i0, r0, r1)
317 static jit_word_t _bner_f(jit_state_t*, jit_word_t, jit_int32_t, jit_int32_t);
318 # define bnei_f(i0, r0, i1) _bnei_f(_jit, i0, r0, i1)
319 static jit_word_t _bnei_f(jit_state_t*, jit_word_t, jit_int32_t, jit_float32_t);
320 # define bunltr_f(i0, r0, r1) _bunltr_f(_jit, i0, r0, r1)
321 static jit_word_t _bunltr_f(jit_state_t*, jit_word_t, jit_int32_t, jit_int32_t);
322 # define bunlti_f(i0, r0, i1) _bunlti_f(_jit, i0, r0, i1)
323 static jit_word_t _bunlti_f(jit_state_t*, jit_word_t,jit_int32_t,jit_float32_t);
324 # define bunler_f(i0, r0, r1) _bunler_f(_jit, i0, r0, r1)
325 static jit_word_t _bunler_f(jit_state_t*, jit_word_t, jit_int32_t, jit_int32_t);
326 # define bunlei_f(i0, r0, i1) _bunlei_f(_jit, i0, r0, i1)
327 static jit_word_t _bunlei_f(jit_state_t*, jit_word_t,jit_int32_t,jit_float32_t);
328 # define buneqr_f(i0, r0, r1) _buneqr_f(_jit, i0, r0, r1)
329 static jit_word_t _buneqr_f(jit_state_t*, jit_word_t, jit_int32_t, jit_int32_t);
330 # define buneqi_f(i0, r0, i1) _buneqi_f(_jit, i0, r0, i1)
331 static jit_word_t _buneqi_f(jit_state_t*, jit_word_t,jit_int32_t,jit_float32_t);
332 # define bunger_f(i0, r0, r1) _bunger_f(_jit, i0, r0, r1)
333 static jit_word_t _bunger_f(jit_state_t*, jit_word_t, jit_int32_t, jit_int32_t);
334 # define bungei_f(i0, r0, i1) _bungei_f(_jit, i0, r0, i1)
335 static jit_word_t _bungei_f(jit_state_t*, jit_word_t,jit_int32_t,jit_float32_t);
336 # define bungtr_f(i0, r0, r1) _bungtr_f(_jit, i0, r0, r1)
337 static jit_word_t _bungtr_f(jit_state_t*, jit_word_t, jit_int32_t, jit_int32_t);
338 # define bungti_f(i0, r0, i1) _bungti_f(_jit, i0, r0, i1)
339 static jit_word_t _bungti_f(jit_state_t*, jit_word_t,jit_int32_t,jit_float32_t);
340 # define bltgtr_f(i0, r0, r1) _bltgtr_f(_jit, i0, r0, r1)
341 static jit_word_t _bltgtr_f(jit_state_t*, jit_word_t, jit_int32_t, jit_int32_t);
342 # define bltgti_f(i0, r0, i1) _bltgti_f(_jit, i0, r0, i1)
343 static jit_word_t _bltgti_f(jit_state_t*, jit_word_t,jit_int32_t,jit_float32_t);
344 # define bordr_f(i0, r0, r1) _bordr_f(_jit, i0, r0, r1)
345 static jit_word_t _bordr_f(jit_state_t*, jit_word_t, jit_int32_t, jit_int32_t);
346 # define bordi_f(i0, r0, i1) _bordi_f(_jit, i0, r0, i1)
347 static jit_word_t _bordi_f(jit_state_t*, jit_word_t, jit_int32_t,jit_float32_t);
348 # define bunordr_f(i0, r0, r1) _bunordr_f(_jit, i0, r0, r1)
349 static jit_word_t _bunordr_f(jit_state_t*, jit_word_t, jit_int32_t,jit_int32_t);
350 # define bunordi_f(i0, r0, i1) _bunordi_f(_jit, i0,r0, i1)
351 static jit_word_t _bunordi_f(jit_state_t*,jit_word_t,jit_int32_t,jit_float32_t);
352 # define addr_d(r0, r1, r2) FADD_D(r0, r1, r2)
353 # define addi_d(r0, r1, i0) _addi_d(_jit, r0, r1, i0)
354 static void _addi_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_float64_t);
355 # define subr_d(r0, r1, r2) FSUB_D(r0, r1, r2)
356 # define subi_d(r0, r1, i0) _subi_d(_jit, r0, r1, i0)
357 static void _subi_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_float64_t);
358 # define rsbr_d(r0, r1, r2) FSUB_D(r0, r2, r1)
359 # define rsbi_d(r0, r1, i0) _rsbi_d(_jit, r0, r1, i0)
360 static void _rsbi_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_float64_t);
361 # define mulr_d(r0, r1, r2) FMUL_D(r0, r1, r2)
362 # define muli_d(r0, r1, i0) _muli_d(_jit, r0, r1, i0)
363 static void _muli_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_float64_t);
364 # define divr_d(r0, r1, r2) FDIV_D(r0, r1, r2)
365 # define divi_d(r0, r1, i0) _divi_d(_jit, r0, r1, i0)
366 static void _divi_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_float64_t);
367 # define absr_d(r0, r1) FABS_D(r0, r1)
368 # define negr_d(r0, r1) FNEG_D(r0, r1)
369 # define sqrtr_d(r0, r1) FSQRT_D(r0, r1)
370 # define extr_d(r0, r1) _extr_d(_jit, r0, r1)
371 static void _extr_d(jit_state_t*, jit_int32_t, jit_int32_t);
372 # define ldr_d(r0, r1) FLD_D(r0, r1, 0)
373 # define ldi_d(r0, i0) _ldi_d(_jit, r0, i0)
374 static void _ldi_d(jit_state_t*, jit_int32_t, jit_word_t);
375 # define ldxr_d(r0, r1, r2) FLDX_D(r0, r1, r2)
376 # define ldxi_d(r0, r1, i0) _ldxi_d(_jit, r0, r1, i0)
377 static void _ldxi_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
378 # define str_d(r0, r1) FST_D(r1, r0, 0)
379 # define sti_d(i0, r0) _sti_d(_jit, i0, r0)
380 static void _sti_d(jit_state_t*, jit_word_t, jit_int32_t);
381 # define stxr_d(r0, r1, r2) FSTX_D(r2, r1, r0)
382 # define stxi_d(i0, r0, r1) _stxi_d(_jit, i0, r0, r1)
383 static void _stxi_d(jit_state_t*, jit_word_t, jit_int32_t, jit_int32_t);
384 # define movr_d(r0, r1) FMOV_D(r0, r1)
385 # define movi_d(r0, i0) _movi_d(_jit, r0, i0)
386 static void _movi_d(jit_state_t*, jit_int32_t, jit_float64_t);
387 # define movr_d_w(r0, r1) MOVFR2GR_D(r0, r1)
388 # define movi_d_w(r0, im) _movi_d_w(_jit, r0, im)
389 static void _movi_d_w(jit_state_t*, jit_int32_t, jit_float64_t);
390 # define movr_w_d(r0, r1) MOVGR2FR_D(r0, r1)
391 # define extr_f_d(r0, r1) FCVT_D_S(r0, r1)
392 # define ltr_d(r0, r1, r2) _ltr_d(_jit, r0, r1, r2)
393 static void _ltr_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
394 # define lti_d(r0, r1, i0) _lti_d(_jit, r0, r1, i0)
395 static void _lti_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_float64_t);
396 # define ler_d(r0, r1, r2) _ler_d(_jit, r0, r1, r2)
397 static void _ler_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
398 # define lei_d(r0, r1, i0) _lei_d(_jit, r0, r1, i0)
399 static void _lei_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_float64_t);
400 # define eqr_d(r0, r1, r2) _eqr_d(_jit, r0, r1, r2)
401 static void _eqr_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
402 # define eqi_d(r0, r1, i0) _eqi_d(_jit, r0, r1, i0)
403 static void _eqi_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_float64_t);
404 # define ger_d(r0, r1, r2) _ger_d(_jit, r0, r1, r2)
405 static void _ger_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
406 # define gei_d(r0, r1, i0) _gei_d(_jit, r0, r1, i0)
407 static void _gei_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_float64_t);
408 # define gtr_d(r0, r1, r2) _gtr_d(_jit, r0, r1, r2)
409 static void _gtr_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
410 # define gti_d(r0, r1, i0) _gti_d(_jit, r0, r1, i0)
411 static void _gti_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_float64_t);
412 # define ner_d(r0, r1, r2) _ner_d(_jit, r0, r1, r2)
413 static void _ner_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
414 # define nei_d(r0, r1, i0) _nei_d(_jit, r0, r1, i0)
415 static void _nei_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_float64_t);
416 # define unltr_d(r0, r1, r2) _unltr_d(_jit, r0, r1, r2)
417 static void _unltr_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
418 # define unlti_d(r0, r1, i0) _unlti_d(_jit, r0, r1, i0)
419 static void _unlti_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_float64_t);
420 # define unler_d(r0, r1, r2) _unler_d(_jit, r0, r1, r2)
421 static void _unler_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
422 # define unlei_d(r0, r1, i0) _unlei_d(_jit, r0, r1, i0)
423 static void _unlei_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_float64_t);
424 # define uneqr_d(r0, r1, r2) _uneqr_d(_jit, r0, r1, r2)
425 static void _uneqr_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
426 # define uneqi_d(r0, r1, i0) _uneqi_d(_jit, r0, r1, i0)
427 static void _uneqi_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_float64_t);
428 # define unger_d(r0, r1, r2) _unger_d(_jit, r0, r1, r2)
429 static void _unger_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
430 # define ungei_d(r0, r1, i0) _ungei_d(_jit, r0, r1, i0)
431 static void _ungei_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_float64_t);
432 # define ungtr_d(r0, r1, r2) _ungtr_d(_jit, r0, r1, r2)
433 static void _ungtr_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
434 # define ungti_d(r0, r1, i0) _ungti_d(_jit, r0, r1, i0)
435 static void _ungti_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_float64_t);
436 # define ltgtr_d(r0, r1, r2) _ltgtr_d(_jit, r0, r1, r2)
437 static void _ltgtr_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
438 # define ltgti_d(r0, r1, i0) _ltgti_d(_jit, r0, r1, i0)
439 static void _ltgti_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_float64_t);
440 # define ordr_d(r0, r1, r2) _ordr_d(_jit, r0, r1, r2)
441 static void _ordr_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
442 # define ordi_d(r0, r1, i0) _ordi_d(_jit, r0, r1, i0)
443 static void _ordi_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_float64_t);
444 # define unordr_d(r0, r1, r2) _unordr_d(_jit, r0, r1, r2)
445 static void _unordr_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
446 # define unordi_d(r0, r1, i0) _unordi_d(_jit, r0, r1, i0)
447 static void _unordi_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_float64_t);
448 # define bltr_d(i0, r0, r1) _bltr_d(_jit, i0, r0, r1)
449 static jit_word_t _bltr_d(jit_state_t*, jit_word_t, jit_int32_t, jit_int32_t);
450 # define blti_d(i0, r0, i1) _blti_d(_jit, i0, r0, i1)
451 static jit_word_t _blti_d(jit_state_t*, jit_word_t, jit_int32_t, jit_float64_t);
452 # define bler_d(i0, r0, r1) _bler_d(_jit, i0, r0, r1)
453 static jit_word_t _bler_d(jit_state_t*, jit_word_t, jit_int32_t, jit_int32_t);
454 # define blei_d(i0, r0, i1) _blei_d(_jit, i0,r0, i1)
455 static jit_word_t _blei_d(jit_state_t*, jit_word_t, jit_int32_t, jit_float64_t);
456 # define beqr_d(i0, r0, r1) _beqr_d(_jit, i0, r0, r1)
457 static jit_word_t _beqr_d(jit_state_t*, jit_word_t, jit_int32_t, jit_int32_t);
458 # define beqi_d(i0, r0, i1) _beqi_d(_jit, i0, r0, i1)
459 static jit_word_t _beqi_d(jit_state_t*, jit_word_t, jit_int32_t, jit_float64_t);
460 # define bger_d(i0, r0, r1) _bger_d(_jit, i0, r0, r1)
461 static jit_word_t _bger_d(jit_state_t*, jit_word_t, jit_int32_t, jit_int32_t);
462 # define bgei_d(i0, r0, i1) _bgei_d(_jit, i0, r0, i1)
463 static jit_word_t _bgei_d(jit_state_t*, jit_word_t, jit_int32_t, jit_float64_t);
464 # define bgtr_d(i0, r0, r1) _bgtr_d(_jit, i0, r0, r1)
465 static jit_word_t _bgtr_d(jit_state_t*, jit_word_t, jit_int32_t, jit_int32_t);
466 # define bgti_d(i0, r0, i1) _bgti_d(_jit, i0, r0, i1)
467 static jit_word_t _bgti_d(jit_state_t*, jit_word_t, jit_int32_t, jit_float64_t);
468 # define bner_d(i0, r0, r1) _bner_d(_jit, i0, r0, r1)
469 static jit_word_t _bner_d(jit_state_t*, jit_word_t, jit_int32_t, jit_int32_t);
470 # define bnei_d(i0, r0, i1) _bnei_d(_jit, i0, r0, i1)
471 static jit_word_t _bnei_d(jit_state_t*, jit_word_t, jit_int32_t, jit_float64_t);
472 # define bunltr_d(i0, r0, r1) _bunltr_d(_jit, i0, r0, r1)
473 static jit_word_t _bunltr_d(jit_state_t*, jit_word_t, jit_int32_t, jit_int32_t);
474 # define bunlti_d(i0, r0, i1) _bunlti_d(_jit, i0, r0, i1)
475 static jit_word_t _bunlti_d(jit_state_t*, jit_word_t,jit_int32_t,jit_float64_t);
476 # define bunler_d(i0, r0, r1) _bunler_d(_jit, i0, r0, r1)
477 static jit_word_t _bunler_d(jit_state_t*, jit_word_t, jit_int32_t, jit_int32_t);
478 # define bunlei_d(i0, r0, i1) _bunlei_d(_jit, i0, r0, i1)
479 static jit_word_t _bunlei_d(jit_state_t*, jit_word_t,jit_int32_t,jit_float64_t);
480 # define buneqr_d(i0, r0, r1) _buneqr_d(_jit, i0, r0, r1)
481 static jit_word_t _buneqr_d(jit_state_t*, jit_word_t, jit_int32_t, jit_int32_t);
482 # define buneqi_d(i0, r0, i1) _buneqi_d(_jit, i0,r0, i1)
483 static jit_word_t _buneqi_d(jit_state_t*, jit_word_t,jit_int32_t,jit_float64_t);
484 # define bunger_d(i0, r0, r1) _bunger_d(_jit, i0, r0, r1)
485 static jit_word_t _bunger_d(jit_state_t*, jit_word_t, jit_int32_t, jit_int32_t);
486 # define bungei_d(i0, r0, i1) _bungei_d(_jit, i0, r0, i1)
487 static jit_word_t _bungei_d(jit_state_t*, jit_word_t,jit_int32_t,jit_float64_t);
488 # define bungtr_d(i0, r0, r1) _bungtr_d(_jit, i0, r0, r1)
489 static jit_word_t _bungtr_d(jit_state_t*, jit_word_t, jit_int32_t, jit_int32_t);
490 # define bungti_d(i0, r0, i1) _bungti_d(_jit, i0, r0, i1)
491 static jit_word_t _bungti_d(jit_state_t*, jit_word_t,jit_int32_t,jit_float64_t);
492 # define bltgtr_d(i0, r0, r1) _bltgtr_d(_jit, i0, r0, r1)
493 static jit_word_t _bltgtr_d(jit_state_t*, jit_word_t, jit_int32_t, jit_int32_t);
494 # define bltgti_d(i0, r0, i1) _bltgti_d(_jit, i0, r0, i1)
495 static jit_word_t _bltgti_d(jit_state_t*, jit_word_t,jit_int32_t,jit_float64_t);
496 # define bordr_d(i0, r0, r1) _bordr_d(_jit, i0, r0, r1)
497 static jit_word_t _bordr_d(jit_state_t*, jit_word_t, jit_int32_t, jit_int32_t);
498 # define bordi_d(i0, r0, i1) _bordi_d(_jit, i0, r0, i1)
499 static jit_word_t _bordi_d(jit_state_t*, jit_word_t, jit_int32_t,jit_float64_t);
500 # define bunordr_d(i0, r0, r1) _bunordr_d(_jit, i0, r0, r1)
501 static jit_word_t _bunordr_d(jit_state_t*, jit_word_t, jit_int32_t,jit_int32_t);
502 # define bunordi_d(i0, r0, i1) _bunordi_d(_jit, i0, r0, i1)
503 static jit_word_t _bunordi_d(jit_state_t*,jit_word_t,jit_int32_t,jit_float64_t);
504 # define vaarg_d(r0, r1) _vaarg_d(_jit, r0, r1)
505 static void _vaarg_d(jit_state_t*, jit_int32_t, jit_int32_t);
510 _truncr_f_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
512 jit_int32_t reg = jit_get_reg(jit_class_fpr);
513 FTINTRZ_W_S(rn(reg), r1);
514 MOVFR2GR_S(r0, rn(reg));
519 _truncr_d_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
521 jit_int32_t reg = jit_get_reg(jit_class_fpr);
522 FTINTRZ_W_D(rn(reg), r1);
523 MOVFR2GR_S(r0, rn(reg));
528 _truncr_f_l(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
530 jit_int32_t reg = jit_get_reg(jit_class_fpr);
531 FTINTRZ_L_S(rn(reg), r1);
532 MOVFR2GR_D(r0, rn(reg));
537 _truncr_d_l(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
539 jit_int32_t reg = jit_get_reg(jit_class_fpr);
540 FTINTRZ_L_D(rn(reg), r1);
541 MOVFR2GR_D(r0, rn(reg));
545 # define fpr_opi(name, type, size) \
547 _##name##i_##type(jit_state_t *_jit, \
548 jit_int32_t r0, jit_int32_t r1, \
549 jit_float##size##_t i0) \
551 jit_int32_t reg = jit_get_reg(jit_class_fpr); \
552 movi_##type(rn(reg), i0); \
553 name##r_##type(r0, r1, rn(reg)); \
554 jit_unget_reg(reg); \
556 # define fopi(name) fpr_opi(name, f, 32)
557 # define dopi(name) fpr_opi(name, d, 64)
559 # define fpr_bopi(name, type, size) \
561 _b##name##i_##type(jit_state_t *_jit, \
562 jit_word_t i0, jit_int32_t r0, \
563 jit_float##size##_t i1) \
566 jit_int32_t reg = jit_get_reg(jit_class_fpr| \
567 jit_class_nospill); \
568 movi_##type(rn(reg), i1); \
569 word = b##name##r_##type(i0, r0, rn(reg)); \
570 jit_unget_reg(reg); \
573 # define fbopi(name) fpr_bopi(name, f, 32)
574 # define dbopi(name) fpr_bopi(name, d, 64)
583 _extr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
590 _ldi_f(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
593 if (can_sign_extend_si12_p(i0))
594 FLD_S(r0, _ZERO_REGNO, i0);
596 t0 = jit_get_reg(jit_class_gpr);
604 _ldxi_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
607 if (can_sign_extend_si12_p(i0))
610 t0 = jit_get_reg(jit_class_gpr);
612 ldxr_f(r0, r1, rn(t0));
618 _sti_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
621 if (can_sign_extend_si12_p(i0))
622 FST_S(r0, _ZERO_REGNO, i0);
624 t0 = jit_get_reg(jit_class_gpr);
632 _stxi_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
635 if (can_sign_extend_si12_p(i0))
638 t0 = jit_get_reg(jit_class_gpr);
640 stxr_f(rn(t0), r0, r1);
646 _movi_f(jit_state_t *_jit, jit_int32_t r0, jit_float32_t i0)
655 movr_w_f(r0, _ZERO_REGNO);
657 reg = jit_get_reg(jit_class_gpr);
658 movi(rn(reg), data.i);
659 movr_w_f(r0, rn(reg));
665 _movi_f_w(jit_state_t *_jit, jit_int32_t r0, jit_float32_t i0)
676 _ltr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
678 FCMP_SLT_S(0, r1, r2);
684 _ler_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
686 FCMP_SLE_S(0, r1, r2);
692 _eqr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
694 FCMP_CEQ_S(0, r1, r2);
700 _ger_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
702 FCMP_SLE_S(0, r2, r1);
708 _gtr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
710 FCMP_SLT_S(0, r2, r1);
716 _ner_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
718 FCMP_CUNE_S(0, r1, r2);
724 _unltr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
726 FCMP_CULT_S(0, r1, r2);
732 _unler_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
734 FCMP_CULE_S(0, r1, r2);
740 _uneqr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
742 FCMP_CUEQ_S(0, r1, r2);
748 _unger_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
750 FCMP_CULE_S(0, r2, r1);
756 _ungtr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
758 FCMP_CULT_S(0, r2, r1);
764 _ltgtr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
766 FCMP_CNE_S(0, r1, r2);
772 _ordr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
774 FCMP_COR_S(0, r1, r2);
780 _unordr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
782 FCMP_COR_S(0, r1, r2);
789 _bltr_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
792 FCMP_SLT_S(0, r1, r2);
794 BCNEZ(0, (i0 - w) >> 2);
800 _bler_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
803 FCMP_SLE_S(0, r1, r2);
805 BCNEZ(0, (i0 - w) >> 2);
811 _beqr_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
814 FCMP_CEQ_S(0, r1, r2);
816 BCNEZ(0, (i0 - w) >> 2);
822 _bger_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
825 FCMP_SLE_S(0, r2, r1);
827 BCNEZ(0, (i0 - w) >> 2);
833 _bgtr_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
836 FCMP_SLT_S(0, r2, r1);
838 BCNEZ(0, (i0 - w) >> 2);
844 _bner_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
847 FCMP_CUNE_S(0, r1, r2);
849 BCNEZ(0, (i0 - w) >> 2);
855 _bunltr_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
858 FCMP_CULT_S(0, r1, r2);
860 BCNEZ(0, (i0 - w) >> 2);
866 _bunler_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
869 FCMP_CULE_S(0, r1, r2);
871 BCNEZ(0, (i0 - w) >> 2);
877 _buneqr_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
880 FCMP_CUEQ_S(0, r1, r2);
882 BCNEZ(0, (i0 - w) >> 2);
888 _bunger_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
891 FCMP_CULE_S(0, r2, r1);
893 BCNEZ(0, (i0 - w) >> 2);
899 _bungtr_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
902 FCMP_CULT_S(0, r2, r1);
904 BCNEZ(0, (i0 - w) >> 2);
910 _bltgtr_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
913 FCMP_CNE_S(0, r2, r1);
915 BCNEZ(0, (i0 - w) >> 2);
921 _bordr_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
924 FCMP_COR_S(0, r2, r1);
926 BCNEZ(0, (i0 - w) >> 2);
932 _bunordr_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
935 FCMP_COR_S(0, r2, r1);
937 BCEQZ(0, (i0 - w) >> 2);
949 _extr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
956 _ldi_d(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
959 if (can_sign_extend_si12_p(i0))
960 FLD_D(r0, _ZERO_REGNO, i0);
962 t0 = jit_get_reg(jit_class_gpr);
970 _ldxi_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
973 if (can_sign_extend_si12_p(i0))
976 t0 = jit_get_reg(jit_class_gpr);
978 ldxr_d(r0, r1, rn(t0));
984 _sti_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
987 if (can_sign_extend_si12_p(i0))
988 FST_D(r0, _ZERO_REGNO, i0);
990 t0 = jit_get_reg(jit_class_gpr);
998 _stxi_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
1001 if (can_sign_extend_si12_p(i0))
1004 t0 = jit_get_reg(jit_class_gpr);
1006 stxr_d(rn(t0), r0, r1);
1012 _movi_d(jit_state_t *_jit, jit_int32_t r0, jit_float64_t i0)
1021 movr_w_d(r0, _ZERO_REGNO);
1023 reg = jit_get_reg(jit_class_gpr);
1024 movi(rn(reg), data.w);
1025 movr_w_d(r0, rn(reg));
1031 _movi_d_w(jit_state_t *_jit, jit_int32_t r0, jit_float64_t i0)
1042 _ltr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1044 FCMP_SLT_D(0, r1, r2);
1050 _ler_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1052 FCMP_SLE_D(0, r1, r2);
1058 _eqr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1060 FCMP_CEQ_D(0, r1, r2);
1066 _ger_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1068 FCMP_SLE_D(0, r2, r1);
1074 _gtr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1076 FCMP_SLT_D(0, r2, r1);
1082 _ner_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1084 FCMP_CUNE_D(0, r1, r2);
1090 _unltr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1092 FCMP_CULT_D(0, r1, r2);
1098 _unler_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1100 FCMP_CULE_D(0, r1, r2);
1106 _uneqr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1108 FCMP_CUEQ_D(0, r1, r2);
1114 _unger_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1116 FCMP_CULE_D(0, r2, r1);
1122 _ungtr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1124 FCMP_CULT_D(0, r2, r1);
1130 _ltgtr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1132 FCMP_CNE_D(0, r1, r2);
1138 _ordr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1140 FCMP_COR_D(0, r1, r2);
1146 _unordr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1148 FCMP_COR_D(0, r1, r2);
1155 _bltr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
1158 FCMP_SLT_D(0, r1, r2);
1160 BCNEZ(0, (i0 - w) >> 2);
1166 _bler_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
1169 FCMP_SLE_D(0, r1, r2);
1171 BCNEZ(0, (i0 - w) >> 2);
1177 _beqr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
1180 FCMP_CEQ_D(0, r1, r2);
1182 BCNEZ(0, (i0 - w) >> 2);
1188 _bger_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
1191 FCMP_SLE_D(0, r2, r1);
1193 BCNEZ(0, (i0 - w) >> 2);
1199 _bgtr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
1202 FCMP_SLT_D(0, r2, r1);
1204 BCNEZ(0, (i0 - w) >> 2);
1210 _bner_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
1213 FCMP_CUNE_D(0, r1, r2);
1215 BCNEZ(0, (i0 - w) >> 2);
1221 _bunltr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
1224 FCMP_CULT_D(0, r1, r2);
1226 BCNEZ(0, (i0 - w) >> 2);
1232 _bunler_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
1235 FCMP_CULE_D(0, r1, r2);
1237 BCNEZ(0, (i0 - w) >> 2);
1243 _buneqr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
1246 FCMP_CUEQ_D(0, r1, r2);
1248 BCNEZ(0, (i0 - w) >> 2);
1254 _bunger_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
1257 FCMP_CULE_D(0, r2, r1);
1259 BCNEZ(0, (i0 - w) >> 2);
1265 _bungtr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
1268 FCMP_CULT_D(0, r2, r1);
1270 BCNEZ(0, (i0 - w) >> 2);
1276 _bltgtr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
1279 FCMP_CNE_D(0, r2, r1);
1281 BCNEZ(0, (i0 - w) >> 2);
1287 _bordr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
1290 FCMP_COR_D(0, r2, r1);
1292 BCNEZ(0, (i0 - w) >> 2);
1298 _bunordr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
1301 FCMP_COR_D(0, r2, r1);
1303 BCEQZ(0, (i0 - w) >> 2);
1309 _vaarg_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1311 assert(_jitc->function->self.call & jit_call_varargs);
1312 /* Load argument. */
1314 /* Update va_list. */
1315 addi(r1, r1, sizeof(jit_float64_t));