2 * Copyright (C) 2019 Free Software Foundation, Inc.
4 * This file is part of GNU lightning.
6 * GNU lightning is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU Lesser General Public License as published
8 * by the Free Software Foundation; either version 3, or (at your option)
11 * GNU lightning is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
14 * License for more details.
17 * Paulo Cesar Pereira de Andrade
22 * RV32F Standard Extension
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)
51 * RV64F Standard Extension (in addition to RV32F)
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)
58 * RV32D Standard Extension
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)
87 * RV64D Standard Extension (in addition to RV32D)
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)
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)
106 * Lightning instructions
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)
114 static 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)
117 static 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)
120 static 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)
123 static 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)
126 static 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)
133 static 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)
135 static 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)
137 static 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)
140 static 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)
142 static 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)
144 static 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)
147 static 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)
150 static 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)
155 static 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)
158 static 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)
161 static 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)
164 static 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)
167 static 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)
169 static 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)
171 static 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)
173 static 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)
175 static 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)
177 static 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)
179 static 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)
181 static 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)
183 static 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)
185 static 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)
187 static 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)
189 static 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)
191 static 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)
193 static 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)
195 static 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)
197 static 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)
199 static 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)
201 static 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)
203 static 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)
205 static 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)
207 static 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)
209 static 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)
211 static 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)
213 static 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)
215 static 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)
217 static 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)
219 static 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)
221 static 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)
223 static 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)
225 static 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)
227 static 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)
229 static 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)
231 static 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)
233 static 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)
235 static 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)
237 static 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)
239 static 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)
241 static 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)
243 static 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)
245 static 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)
247 static 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)
249 static 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)
251 static 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)
253 static 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)
255 static 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)
257 static 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)
259 static 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)
262 static 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)
265 static 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)
268 static 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)
271 static 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)
274 static 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)
281 static 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)
283 static 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)
285 static 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)
288 static 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)
290 static 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)
292 static 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)
295 static 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)
298 static 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)
303 static 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)
306 static 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)
309 static 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)
312 static 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)
315 static 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)
317 static 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)
319 static 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)
321 static 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)
323 static 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)
325 static 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)
327 static 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)
329 static 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)
331 static 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)
333 static 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)
335 static 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)
337 static 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)
339 static 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)
341 static 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)
343 static 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)
345 static 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)
347 static 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)
349 static 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)
351 static 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)
353 static 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)
355 static 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)
357 static 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)
359 static 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)
361 static 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)
363 static 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)
365 static 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)
367 static 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)
369 static 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)
371 static 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)
373 static 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)
375 static 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)
377 static 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)
379 static 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)
381 static 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)
383 static 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)
385 static 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)
387 static 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)
389 static 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)
391 static 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)
393 static 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)
395 static 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)
397 static 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)
399 static 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)
401 static 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)
403 static 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)
405 static 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)
407 static 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)
409 static void _vaarg_d(jit_state_t*, jit_int32_t, jit_int32_t);
413 # define fpr_opi(name, type, size) \
415 _##name##i_##type(jit_state_t *_jit, \
416 jit_int32_t r0, jit_int32_t r1, \
417 jit_float##size##_t i0) \
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); \
424 # define fopi(name) fpr_opi(name, f, 32)
425 # define dopi(name) fpr_opi(name, d, 64)
434 _ldi_f(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
438 FLW(r0, _ZERO_REGNO, i0);
440 t0 = jit_get_reg(jit_class_gpr);
448 _ldxr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
451 t0 = jit_get_reg(jit_class_gpr);
452 addr(rn(t0), r1, r2);
458 _ldxi_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
464 t0 = jit_get_reg(jit_class_gpr);
465 addi(rn(t0), r1, i0);
472 _sti_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
476 FSW(r0, _ZERO_REGNO, i0);
478 t0 = jit_get_reg(jit_class_gpr);
486 _stxr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
489 t0 = jit_get_reg(jit_class_gpr);
490 addr(rn(t0), r0, r1);
496 _stxi_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
502 t0 = jit_get_reg(jit_class_gpr);
503 addi(rn(t0), r0, i0);
510 _movi_f(jit_state_t *_jit, jit_int32_t r0, jit_float32_t i0)
519 movr_w_f(r0, _ZERO_REGNO);
521 reg = jit_get_reg(jit_class_gpr);
522 movi(rn(reg), data.i);
523 movr_w_f(r0, rn(reg));
529 _movi_f_w(jit_state_t *_jit, jit_int32_t r0, jit_float32_t i0)
546 _ner_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
553 # define fpr_bopi(name, type, size) \
555 _b##name##i_##type(jit_state_t *_jit, \
556 jit_word_t i0, jit_int32_t r0, \
557 jit_float##size##_t i1) \
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); \
567 # define fbopi(name) fpr_bopi(name, f, 32)
568 # define dbopi(name) fpr_bopi(name, d, 64)
570 # define unop(CLASS, OP) \
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)); \
579 rshi(rn(t0), rn(t0), 8); \
580 ltr(r0, _ZERO_REGNO, rn(t0)); \
583 BLT(_ZERO_REGNO, r0, 0); \
585 patch_at(w, _jit->pc.w)
588 _unltr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
595 _unler_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
602 _uneqr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
609 _unger_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
616 _ungtr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
623 _ltgtr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
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));
633 rshi(rn(t0), rn(t0), 8);
634 ltr(r0, _ZERO_REGNO, rn(t0));
637 BEQ(_ZERO_REGNO, r0, 0);
638 movr(r0, _ZERO_REGNO);
641 patch_at(w0, _jit->pc.w);
643 patch_at(w1, _jit->pc.w);
648 _ordr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
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));
657 rshi(rn(t0), rn(t0), 8);
658 eqr(r0, _ZERO_REGNO, rn(t0));
664 _unordr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
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));
673 rshi(rn(t0), rn(t0), 8);
674 ltr(r0, _ZERO_REGNO, rn(t0));
680 _bltr_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
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));
693 _bler_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
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));
706 _beqr_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
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));
719 _bger_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
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));
732 _bgtr_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
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));
745 _bner_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
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));
758 _bunltr_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
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));
771 _bunler_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
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));
784 _buneqr_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
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));
797 _bunger_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
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));
810 _bungtr_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
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));
823 _bltgtr_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
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));
836 _bordr_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
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));
849 _bunordr_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
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));
868 _ldi_d(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
872 FLD(r0, _ZERO_REGNO, i0);
874 t0 = jit_get_reg(jit_class_gpr);
882 _ldxr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
885 t0 = jit_get_reg(jit_class_gpr);
886 addr(rn(t0), r1, r2);
892 _ldxi_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
898 t0 = jit_get_reg(jit_class_gpr);
899 addi(rn(t0), r1, i0);
906 _sti_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
910 FSD(r0, _ZERO_REGNO, i0);
912 t0 = jit_get_reg(jit_class_gpr);
920 _stxr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
923 t0 = jit_get_reg(jit_class_gpr);
924 addr(rn(t0), r0, r1);
930 _stxi_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
936 t0 = jit_get_reg(jit_class_gpr);
937 addi(rn(t0), r0, i0);
944 _movi_d(jit_state_t *_jit, jit_int32_t r0, jit_float64_t i0)
953 movr_w_d(r0, _ZERO_REGNO);
955 reg = jit_get_reg(jit_class_gpr);
956 movi(rn(reg), data.w);
957 movr_w_d(r0, rn(reg));
963 _movi_d_w(jit_state_t *_jit, jit_int32_t r0, jit_float64_t i0)
980 _ner_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
988 _unltr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
995 _unler_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1002 _uneqr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1009 _unger_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1016 _ungtr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1023 _ltgtr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
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));
1033 rshi(rn(t0), rn(t0), 8);
1034 ltr(r0, _ZERO_REGNO, rn(t0));
1037 BEQ(_ZERO_REGNO, r0, 0);
1038 movr(r0, _ZERO_REGNO);
1040 JAL(_ZERO_REGNO, 0);
1041 patch_at(w0, _jit->pc.w);
1043 patch_at(w1, _jit->pc.w);
1048 _ordr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
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));
1057 rshi(rn(t0), rn(t0), 8);
1058 eqr(r0, _ZERO_REGNO, rn(t0));
1064 _unordr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
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));
1073 rshi(rn(t0), rn(t0), 8);
1074 ltr(r0, _ZERO_REGNO, rn(t0));
1080 _bltr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
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));
1093 _bler_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
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));
1106 _beqr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
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));
1119 _bger_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
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));
1132 _bgtr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
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));
1145 _bner_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
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));
1158 _bunltr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
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));
1171 _bunler_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
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));
1184 _buneqr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
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));
1197 _bunger_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
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));
1210 _bungtr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
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));
1223 _bltgtr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
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));
1236 _bordr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
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));
1249 _bunordr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
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));
1262 _vaarg_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1264 assert(_jitc->function->self.call & jit_call_varargs);
1265 /* Load argument. */
1267 /* Update va_list. */
1268 addi(r1, r1, sizeof(jit_float64_t));