2 * Copyright (C) 2012-2023 Free Software Foundation, Inc.
4 * This file is part of GNU lightning.
6 * GNU lightning is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU Lesser General Public License as published
8 * by the Free Software Foundation; either version 3, or (at your option)
11 * GNU lightning is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
14 * License for more details.
17 * Paulo Cesar Pereira de Andrade
21 /* match vfpv3 result */
22 #define NAN_TO_INT_IS_ZERO 1
23 extern float sqrtf(float);
24 extern double sqrt(double);
25 extern float __addsf3(float, float);
26 extern double __adddf3(double, double);
27 extern float __aeabi_fsub(float, float);
28 extern double __aeabi_dsub(double, double);
29 extern float __aeabi_fmul(float, float);
30 extern double __aeabi_dmul(double, double);
31 extern float __aeabi_fdiv(float, float);
32 extern double __aeabi_ddiv(double, double);
33 extern float __aeabi_i2f(int);
34 extern double __aeabi_i2d(int);
35 extern float __aeabi_d2f(double);
36 extern double __aeabi_f2d(float);
37 extern int __aeabi_f2iz(float);
38 extern int __aeabi_d2iz(double);
39 extern int __aeabi_fcmplt(float, float);
40 extern int __aeabi_dcmplt(double, double);
41 extern int __aeabi_fcmple(float, float);
42 extern int __aeabi_dcmple(double, double);
43 extern int __aeabi_fcmpeq(float, float);
44 extern int __aeabi_dcmpeq(double, double);
45 extern int __aeabi_fcmpge(float, float);
46 extern int __aeabi_dcmpge(double, double);
47 extern int __aeabi_fcmpgt(float, float);
48 extern int __aeabi_dcmpgt(double, double);
49 extern int __aeabi_fcmpun(float, float);
50 extern int __aeabi_dcmpun(double, double);
51 # define swf_ff(i0,r0,r1) _swf_ff(_jit,i0,r0,r1)
53 _swf_ff(jit_state_t*,float(*)(float),jit_int32_t,jit_int32_t) maybe_unused;
54 # define swf_dd(i0,r0,r1) _swf_dd(_jit,i0,r0,r1)
56 _swf_dd(jit_state_t*,double(*)(double),jit_int32_t,jit_int32_t) maybe_unused;
57 # define swf_fff(i0,r0,r1,r2) _swf_fff(_jit,i0,r0,r1,r2)
58 static void _swf_fff(jit_state_t*,float(*)(float,float),
59 jit_int32_t,jit_int32_t,jit_int32_t);
60 # define swf_ddd(i0,r0,r1,r2) _swf_ddd(_jit,i0,r0,r1,r2)
61 static void _swf_ddd(jit_state_t*,double(*)(double,double),
62 jit_int32_t,jit_int32_t,jit_int32_t);
63 # define swf_fff_(i0,r0,r1,i1) _swf_fff_(_jit,i0,r0,r1,i1)
64 static void _swf_fff_(jit_state_t*,float(*)(float,float),
65 jit_int32_t,jit_int32_t,jit_float32_t);
66 # define swf_ddd_(i0,r0,r1,i1) _swf_ddd_(_jit,i0,r0,r1,i1)
67 static void _swf_ddd_(jit_state_t*,double(*)(double,double),
68 jit_int32_t,jit_int32_t,jit_float64_t);
69 # define swf_iff(i0,r0,r1,r2) _swf_iff(_jit,i0,r0,r1,r2)
70 static void _swf_iff(jit_state_t*,int(*)(float,float),
71 jit_int32_t,jit_int32_t,jit_int32_t);
72 # define swf_idd(i0,r0,r1,r2) _swf_idd(_jit,i0,r0,r1,r2)
73 static void _swf_idd(jit_state_t*,int(*)(double,double),
74 jit_int32_t,jit_int32_t,jit_int32_t);
75 # define swf_iff_(i0,r0,r1,r2) _swf_iff_(_jit,i0,r0,r1,r2)
76 static void _swf_iff_(jit_state_t*,int(*)(float,float),
77 jit_int32_t,jit_int32_t,jit_float32_t);
78 # define swf_idd_(i0,r0,r1,r2) _swf_idd_(_jit,i0,r0,r1,r2)
79 static void _swf_idd_(jit_state_t*,int(*)(double,double),
80 jit_int32_t,jit_int32_t,jit_float64_t);
81 # define swf_iunff(i0,r0,r1,r2) _swf_iunff(_jit,i0,r0,r1,r2)
82 static void _swf_iunff(jit_state_t*,int(*)(float,float),
83 jit_int32_t,jit_int32_t,jit_int32_t);
84 # define swf_iundd(i0,r0,r1,r2) _swf_iundd(_jit,i0,r0,r1,r2)
85 static void _swf_iundd(jit_state_t*,int(*)(double,double),
86 jit_int32_t,jit_int32_t,jit_int32_t);
87 # define swf_iunff_(i0,r0,r1,i1) _swf_iunff_(_jit,i0,r0,r1,i1)
88 static void _swf_iunff_(jit_state_t*,int(*)(float,float),
89 jit_int32_t,jit_int32_t,jit_float32_t);
90 # define swf_iundd_(i0,r0,r1,i1) _swf_iundd_(_jit,i0,r0,r1,i1)
91 static void _swf_iundd_(jit_state_t*,int(*)(double,double),
92 jit_int32_t,jit_int32_t,jit_float64_t);
93 # define swf_bff(i0,cc,i1,r0,r1) _swf_bff(_jit,i0,cc,i1,r0,r1)
94 static jit_word_t _swf_bff(jit_state_t*,int(*)(float,float),int,
95 jit_word_t,jit_int32_t,jit_int32_t);
96 # define swf_bdd(i0,cc,i1,r0,r1) _swf_bdd(_jit,i0,cc,i1,r0,r1)
97 static jit_word_t _swf_bdd(jit_state_t*,int(*)(double,double),int,
98 jit_word_t,jit_int32_t,jit_int32_t);
99 # define swf_bff_(i0,cc,i1,r0,i2) _swf_bff_(_jit,i0,cc,i1,r0,i2)
100 static jit_word_t _swf_bff_(jit_state_t*,int(*)(float,float),int,
101 jit_word_t,jit_int32_t,jit_float32_t);
102 # define swf_bdd_(i0,cc,i1,r0,i2) _swf_bdd_(_jit,i0,cc,i1,r0,i2)
103 static jit_word_t _swf_bdd_(jit_state_t*,int(*)(double,double),int,
104 jit_word_t,jit_int32_t,jit_float64_t);
105 # define swf_bunff(eq,i0,r0,r1) _swf_bunff(_jit,eq,i0,r0,r1)
106 static jit_word_t _swf_bunff(jit_state_t*,int,
107 jit_word_t,jit_int32_t,jit_int32_t);
108 # define swf_bundd(eq,i0,r0,r1) _swf_bundd(_jit,eq,i0,r0,r1)
109 static jit_word_t _swf_bundd(jit_state_t*,int,
110 jit_word_t,jit_int32_t,jit_int32_t);
111 # define swf_bunff_(eq,i0,r0,i1) _swf_bunff_(_jit,eq,i0,r0,i1)
112 static jit_word_t _swf_bunff_(jit_state_t*,int,
113 jit_word_t,jit_int32_t,jit_float32_t);
114 # define swf_bundd_(eq,i0,r0,i1) _swf_bundd_(_jit,eq,i0,r0,i1)
115 static jit_word_t _swf_bundd_(jit_state_t*,int,
116 jit_word_t,jit_int32_t,jit_float64_t);
117 # define swf_extr_f(r0,r1) _swf_extr_f(_jit,r0,r1)
118 static void _swf_extr_f(jit_state_t*,jit_int32_t,jit_int32_t);
119 # define swf_extr_d(r0,r1) _swf_extr_d(_jit,r0,r1)
120 static void _swf_extr_d(jit_state_t*,jit_int32_t,jit_int32_t);
121 # define swf_extr_d_f(r0,r1) _swf_extr_d_f(_jit,r0,r1)
122 static void _swf_extr_d_f(jit_state_t*,jit_int32_t,jit_int32_t);
123 # define swf_extr_f_d(r0,r1) _swf_extr_f_d(_jit,r0,r1)
124 static void _swf_extr_f_d(jit_state_t*,jit_int32_t,jit_int32_t);
125 # define swf_truncr_f_i(r0,r1) _swf_truncr_f_i(_jit,r0,r1)
126 static void _swf_truncr_f_i(jit_state_t*,jit_int32_t,jit_int32_t);
127 # define swf_truncr_d_i(r0,r1) _swf_truncr_d_i(_jit,r0,r1)
128 static void _swf_truncr_d_i(jit_state_t*,jit_int32_t,jit_int32_t);
129 # define swf_movr_f(r0,r1) _swf_movr_f(_jit,r0,r1)
130 static void _swf_movr_f(jit_state_t*,jit_int32_t,jit_int32_t);
131 # define swf_movi_f(r0,i0) _swf_movi_f(_jit,r0,i0)
132 static void _swf_movi_f(jit_state_t*,jit_int32_t,jit_float32_t);
133 # define swf_movr_w_f(r0, r1) _swf_movr_w_f(_jit, r0, r1)
134 static void _swf_movr_w_f(jit_state_t*,jit_int32_t,jit_int32_t);
135 # define swf_movr_f_w(r0, r1) _swf_movr_f_w(_jit, r0, r1)
136 static void _swf_movr_f_w(jit_state_t*,jit_int32_t,jit_int32_t);
137 #define swf_movi_w_f(r0, i0) _swf_movi_w_f(_jit, r0, i0)
138 static void _swf_movi_w_f(jit_state_t*, jit_int32_t, jit_word_t);
139 # define swf_movr_d(r0,r1) _swf_movr_d(_jit,r0,r1)
140 static void _swf_movr_d(jit_state_t*,jit_int32_t,jit_int32_t);
141 # define swf_movi_d(r0,i0) _swf_movi_d(_jit,r0,i0)
142 static void _swf_movi_d(jit_state_t*,jit_int32_t,jit_float64_t);
143 # define swf_movr_ww_d(r0, r1, r2) _swf_movr_ww_d(_jit, r0, r1, r2)
144 static void _swf_movr_ww_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
145 # define swf_movr_d_ww(r0, r1, r2) _swf_movr_d_ww(_jit, r0, r1, r2)
146 static void _swf_movr_d_ww(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
147 # define swf_movi_ww_d(r0, i0, i1) _swf_movi_ww_d(_jit, r0, i0, i1)
148 static void _swf_movi_ww_d(jit_state_t*, jit_int32_t, jit_word_t, jit_word_t);
149 # define swf_absr_f(r0,r1) _swf_absr_f(_jit,r0,r1)
150 static void _swf_absr_f(jit_state_t*,jit_int32_t,jit_int32_t);
151 # define swf_absr_d(r0,r1) _swf_absr_d(_jit,r0,r1)
152 static void _swf_absr_d(jit_state_t*,jit_int32_t,jit_int32_t);
153 # define swf_negr_f(r0,r1) _swf_negr_f(_jit,r0,r1)
154 static void _swf_negr_f(jit_state_t*,jit_int32_t,jit_int32_t);
155 # define swf_negr_d(r0,r1) _swf_negr_d(_jit,r0,r1)
156 static void _swf_negr_d(jit_state_t*,jit_int32_t,jit_int32_t);
157 # define swf_sqrtr_f(r0,r1) swf_ff(sqrtf,r0,r1)
158 # define swf_sqrtr_d(r0,r1) swf_dd(sqrt,r0,r1)
159 # define swf_fmar_f(r0,r1,r2,r3) _swf_fmar_f(_jit,r0,r1,r2,r3)
160 static void _swf_fmar_f(jit_state_t*,
161 jit_int32_t, jit_int32_t, jit_int32_t, jit_int32_t);
162 # define swf_fmsr_f(r0,r1,r2,r3) _swf_fmsr_f(_jit,r0,r1,r2,r3)
163 static void _swf_fmsr_f(jit_state_t*,
164 jit_int32_t, jit_int32_t, jit_int32_t, jit_int32_t);
165 # define swf_fmar_d(r0,r1,r2,r3) _swf_fmar_d(_jit,r0,r1,r2,r3)
166 static void _swf_fmar_d(jit_state_t*,
167 jit_int32_t, jit_int32_t, jit_int32_t, jit_int32_t);
168 # define swf_fmsr_d(r0,r1,r2,r3) _swf_fmsr_d(_jit,r0,r1,r2,r3)
169 static void _swf_fmsr_d(jit_state_t*,
170 jit_int32_t, jit_int32_t, jit_int32_t, jit_int32_t);
171 # define swf_fnmar_f(r0,r1,r2,r3) _swf_fnmar_f(_jit,r0,r1,r2,r3)
172 static void _swf_fnmar_f(jit_state_t*,
173 jit_int32_t, jit_int32_t, jit_int32_t, jit_int32_t);
174 # define swf_fnmsr_f(r0,r1,r2,r3) _swf_fnmsr_f(_jit,r0,r1,r2,r3)
175 static void _swf_fnmsr_f(jit_state_t*,
176 jit_int32_t, jit_int32_t, jit_int32_t, jit_int32_t);
177 # define swf_fnmar_d(r0,r1,r2,r3) _swf_fnmar_d(_jit,r0,r1,r2,r3)
178 static void _swf_fnmar_d(jit_state_t*,
179 jit_int32_t, jit_int32_t, jit_int32_t, jit_int32_t);
180 # define swf_fnmsr_d(r0,r1,r2,r3) _swf_fnmsr_d(_jit,r0,r1,r2,r3)
181 static void _swf_fnmsr_d(jit_state_t*,
182 jit_int32_t, jit_int32_t, jit_int32_t, jit_int32_t);
183 # define swf_addr_f(r0,r1,r2) swf_fff(__addsf3,r0,r1,r2)
184 # define swf_addi_f(r0,r1,i0) swf_fff_(__addsf3,r0,r1,i0)
185 # define swf_addr_d(r0,r1,r2) swf_ddd(__adddf3,r0,r1,r2)
186 # define swf_addi_d(r0,r1,i0) swf_ddd_(__adddf3,r0,r1,i0)
187 # define swf_subr_f(r0,r1,r2) swf_fff(__aeabi_fsub,r0,r1,r2)
188 # define swf_subi_f(r0,r1,i0) swf_fff_(__aeabi_fsub,r0,r1,i0)
189 # define swf_subr_d(r0,r1,r2) swf_ddd(__aeabi_dsub,r0,r1,r2)
190 # define swf_subi_d(r0,r1,i0) swf_ddd_(__aeabi_dsub,r0,r1,i0)
191 # define swf_rsbr_f(r0, r1, r2) swf_subr_f(r0, r2, r1)
192 # define swf_rsbi_f(r0, r1, i0) _swf_rsbi_f(_jit, r0, r1, i0)
193 static void _swf_rsbi_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t);
194 # define swf_rsbr_d(r0, r1, r2) swf_subr_d(r0, r2, r1)
195 # define swf_rsbi_d(r0, r1, i0) _swf_rsbi_d(_jit, r0, r1, i0)
196 static void _swf_rsbi_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t);
197 # define swf_mulr_f(r0,r1,r2) swf_fff(__aeabi_fmul,r0,r1,r2)
198 # define swf_muli_f(r0,r1,i0) swf_fff_(__aeabi_fmul,r0,r1,i0)
199 # define swf_mulr_d(r0,r1,r2) swf_ddd(__aeabi_dmul,r0,r1,r2)
200 # define swf_muli_d(r0,r1,i0) swf_ddd_(__aeabi_dmul,r0,r1,i0)
201 # define swf_divr_f(r0,r1,r2) swf_fff(__aeabi_fdiv,r0,r1,r2)
202 # define swf_divi_f(r0,r1,i0) swf_fff_(__aeabi_fdiv,r0,r1,i0)
203 # define swf_divr_d(r0,r1,r2) swf_ddd(__aeabi_ddiv,r0,r1,r2)
204 # define swf_divi_d(r0,r1,i0) swf_ddd_(__aeabi_ddiv,r0,r1,i0)
205 # define swf_ltr_f(r0,r1,r2) swf_iff(__aeabi_fcmplt,r0,r1,r2)
206 # define swf_lti_f(r0,r1,i0) swf_iff_(__aeabi_fcmplt,r0,r1,i0)
207 # define swf_ltr_d(r0,r1,r2) swf_idd(__aeabi_dcmplt,r0,r1,r2)
208 # define swf_lti_d(r0,r1,i0) swf_idd_(__aeabi_dcmplt,r0,r1,i0)
209 # define swf_ler_f(r0,r1,r2) swf_iff(__aeabi_fcmple,r0,r1,r2)
210 # define swf_lei_f(r0,r1,i0) swf_iff_(__aeabi_fcmple,r0,r1,i0)
211 # define swf_ler_d(r0,r1,r2) swf_idd(__aeabi_dcmple,r0,r1,r2)
212 # define swf_lei_d(r0,r1,i0) swf_idd_(__aeabi_dcmple,r0,r1,i0)
213 # define swf_eqr_f(r0,r1,r2) swf_iff(__aeabi_fcmpeq,r0,r1,r2)
214 # define swf_eqi_f(r0,r1,i0) swf_iff_(__aeabi_fcmpeq,r0,r1,i0)
215 # define swf_eqr_d(r0,r1,r2) swf_idd(__aeabi_dcmpeq,r0,r1,r2)
216 # define swf_eqi_d(r0,r1,i0) swf_idd_(__aeabi_dcmpeq,r0,r1,i0)
217 # define swf_ger_f(r0,r1,r2) swf_iff(__aeabi_fcmpge,r0,r1,r2)
218 # define swf_gei_f(r0,r1,i0) swf_iff_(__aeabi_fcmpge,r0,r1,i0)
219 # define swf_ger_d(r0,r1,r2) swf_idd(__aeabi_dcmpge,r0,r1,r2)
220 # define swf_gei_d(r0,r1,i0) swf_idd_(__aeabi_dcmpge,r0,r1,i0)
221 # define swf_gtr_f(r0,r1,r2) swf_iff(__aeabi_fcmpgt,r0,r1,r2)
222 # define swf_gti_f(r0,r1,i0) swf_iff_(__aeabi_fcmpgt,r0,r1,i0)
223 # define swf_gtr_d(r0,r1,r2) swf_idd(__aeabi_dcmpgt,r0,r1,r2)
224 # define swf_gti_d(r0,r1,i0) swf_idd_(__aeabi_dcmpgt,r0,r1,i0)
225 # define swf_ner_f(r0,r1,r2) _swf_ner_f(_jit,r0,r1,r2)
226 static void _swf_ner_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
227 # define swf_nei_f(r0,r1,i0) _swf_nei_f(_jit,r0,r1,i0)
228 static void _swf_nei_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t);
229 # define swf_ner_d(r0,r1,r2) _swf_ner_d(_jit,r0,r1,r2)
230 static void _swf_ner_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
231 # define swf_nei_d(r0,r1,i0) _swf_nei_d(_jit,r0,r1,i0)
232 static void _swf_nei_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t);
233 # define swf_unltr_f(r0,r1,r2) swf_iunff(__aeabi_fcmplt,r0,r1,r2)
234 # define swf_unlti_f(r0,r1,i0) swf_iunff_(__aeabi_fcmplt,r0,r1,i0)
235 # define swf_unltr_d(r0,r1,r2) swf_iundd(__aeabi_dcmplt,r0,r1,r2)
236 # define swf_unlti_d(r0,r1,i0) swf_iundd_(__aeabi_dcmplt,r0,r1,i0)
237 # define swf_unler_f(r0,r1,r2) swf_iunff(__aeabi_fcmple,r0,r1,r2)
238 # define swf_unlei_f(r0,r1,i0) swf_iunff_(__aeabi_fcmple,r0,r1,i0)
239 # define swf_unler_d(r0,r1,r2) swf_iundd(__aeabi_dcmple,r0,r1,r2)
240 # define swf_unlei_d(r0,r1,i0) swf_iundd_(__aeabi_dcmple,r0,r1,i0)
241 # define swf_uneqr_f(r0,r1,r2) swf_iunff(__aeabi_fcmpeq,r0,r1,r2)
242 # define swf_uneqi_f(r0,r1,i0) swf_iunff_(__aeabi_fcmpeq,r0,r1,i0)
243 # define swf_uneqr_d(r0,r1,r2) swf_iundd(__aeabi_dcmpeq,r0,r1,r2)
244 # define swf_uneqi_d(r0,r1,i0) swf_iundd_(__aeabi_dcmpeq,r0,r1,i0)
245 # define swf_unger_f(r0,r1,r2) swf_iunff(__aeabi_fcmpge,r0,r1,r2)
246 # define swf_ungei_f(r0,r1,i0) swf_iunff_(__aeabi_fcmpge,r0,r1,i0)
247 # define swf_unger_d(r0,r1,r2) swf_iundd(__aeabi_dcmpge,r0,r1,r2)
248 # define swf_ungei_d(r0,r1,i0) swf_iundd_(__aeabi_dcmpge,r0,r1,i0)
249 # define swf_ungtr_f(r0,r1,r2) swf_iunff(__aeabi_fcmpgt,r0,r1,r2)
250 # define swf_ungti_f(r0,r1,i0) swf_iunff_(__aeabi_fcmpgt,r0,r1,i0)
251 # define swf_ungtr_d(r0,r1,r2) swf_iundd(__aeabi_dcmpgt,r0,r1,r2)
252 # define swf_ungti_d(r0,r1,i0) swf_iundd_(__aeabi_dcmpgt,r0,r1,i0)
253 # define swf_ltgtr_f(r0,r1,r2) _swf_ltgtr_f(_jit,r0,r1,r2)
254 static void _swf_ltgtr_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
255 # define swf_ltgti_f(r0,r1,i0) _swf_ltgti_f(_jit,r0,r1,i0)
256 static void _swf_ltgti_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t);
257 # define swf_ltgtr_d(r0,r1,r2) _swf_ltgtr_d(_jit,r0,r1,r2)
258 static void _swf_ltgtr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
259 # define swf_ltgti_d(r0,r1,i0) _swf_ltgti_d(_jit,r0,r1,i0)
260 static void _swf_ltgti_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t);
261 # define swf_ordr_f(r0,r1,r2) _swf_ordr_f(_jit,r0,r1,r2)
262 static void _swf_ordr_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
263 # define swf_ordi_f(r0,r1,i0) _swf_ordi_f(_jit,r0,r1,i0)
264 static void _swf_ordi_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t);
265 # define swf_ordr_d(r0,r1,r2) _swf_ordr_d(_jit,r0,r1,r2)
266 static void _swf_ordr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
267 # define swf_ordi_d(r0,r1,i0) _swf_ordi_d(_jit,r0,r1,i0)
268 static void _swf_ordi_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t);
269 # define swf_unordr_f(r0,r1,r2) swf_iunff(__aeabi_fcmpun,r0,r1,r2)
270 # define swf_unordi_f(r0,r1,i0) swf_iunff_(__aeabi_fcmpun,r0,r1,i0)
271 # define swf_unordr_d(r0,r1,r2) swf_iundd(__aeabi_dcmpun,r0,r1,r2)
272 # define swf_unordi_d(r0,r1,i0) swf_iundd_(__aeabi_dcmpun,r0,r1,i0)
273 # define swf_bltr_f(i0,r0,r1) swf_bff(__aeabi_fcmplt,ARM_CC_NE,i0,r0,r1)
274 # define swf_blti_f(i0,r0,i1) swf_bff_(__aeabi_fcmplt,ARM_CC_NE,i0,r0,i1)
275 # define swf_bltr_d(i0,r0,r1) swf_bdd(__aeabi_dcmplt,ARM_CC_NE,i0,r0,r1)
276 # define swf_blti_d(i0,r0,i1) swf_bdd_(__aeabi_dcmplt,ARM_CC_NE,i0,r0,i1)
277 # define swf_bler_f(i0,r0,r1) swf_bff(__aeabi_fcmple,ARM_CC_NE,i0,r0,r1)
278 # define swf_blei_f(i0,r0,i1) swf_bff_(__aeabi_fcmple,ARM_CC_NE,i0,r0,i1)
279 # define swf_bler_d(i0,r0,r1) swf_bdd(__aeabi_dcmple,ARM_CC_NE,i0,r0,r1)
280 # define swf_blei_d(i0,r0,i1) swf_bdd_(__aeabi_dcmple,ARM_CC_NE,i0,r0,i1)
281 # define swf_beqr_f(i0,r0,r1) swf_bff(__aeabi_fcmpeq,ARM_CC_NE,i0,r0,r1)
282 # define swf_beqi_f(i0,r0,i1) swf_bff_(__aeabi_fcmpeq,ARM_CC_NE,i0,r0,i1)
283 # define swf_beqr_d(i0,r0,r1) swf_bdd(__aeabi_dcmpeq,ARM_CC_NE,i0,r0,r1)
284 # define swf_beqi_d(i0,r0,i1) swf_bdd_(__aeabi_dcmpeq,ARM_CC_NE,i0,r0,i1)
285 # define swf_bger_f(i0,r0,r1) swf_bff(__aeabi_fcmpge,ARM_CC_NE,i0,r0,r1)
286 # define swf_bgei_f(i0,r0,i1) swf_bff_(__aeabi_fcmpge,ARM_CC_NE,i0,r0,i1)
287 # define swf_bger_d(i0,r0,r1) swf_bdd(__aeabi_dcmpge,ARM_CC_NE,i0,r0,r1)
288 # define swf_bgei_d(i0,r0,i1) swf_bdd_(__aeabi_dcmpge,ARM_CC_NE,i0,r0,i1)
289 # define swf_bgtr_f(i0,r0,r1) swf_bff(__aeabi_fcmpgt,ARM_CC_NE,i0,r0,r1)
290 # define swf_bgti_f(i0,r0,i1) swf_bff_(__aeabi_fcmpgt,ARM_CC_NE,i0,r0,i1)
291 # define swf_bgtr_d(i0,r0,r1) swf_bdd(__aeabi_dcmpgt,ARM_CC_NE,i0,r0,r1)
292 # define swf_bgti_d(i0,r0,i1) swf_bdd_(__aeabi_dcmpgt,ARM_CC_NE,i0,r0,i1)
293 # define swf_bner_f(i0,r0,r1) swf_bff(__aeabi_fcmpeq,ARM_CC_EQ,i0,r0,r1)
294 # define swf_bnei_f(i0,r0,i1) swf_bff_(__aeabi_fcmpeq,ARM_CC_EQ,i0,r0,i1)
295 # define swf_bner_d(i0,r0,r1) swf_bdd(__aeabi_dcmpeq,ARM_CC_EQ,i0,r0,r1)
296 # define swf_bnei_d(i0,r0,i1) swf_bdd_(__aeabi_dcmpeq,ARM_CC_EQ,i0,r0,i1)
297 # define swf_bunltr_f(i0,r0,r1) swf_bff(__aeabi_fcmpge,ARM_CC_EQ,i0,r0,r1)
298 # define swf_bunlti_f(i0,r0,i1) swf_bff_(__aeabi_fcmpge,ARM_CC_EQ,i0,r0,i1)
299 # define swf_bunltr_d(i0,r0,r1) swf_bdd(__aeabi_dcmpge,ARM_CC_EQ,i0,r0,r1)
300 # define swf_bunlti_d(i0,r0,i1) swf_bdd_(__aeabi_dcmpge,ARM_CC_EQ,i0,r0,i1)
301 # define swf_bunler_f(i0,r0,r1) swf_bff(__aeabi_fcmpgt,ARM_CC_EQ,i0,r0,r1)
302 # define swf_bunlei_f(i0,r0,i1) swf_bff_(__aeabi_fcmpgt,ARM_CC_EQ,i0,r0,i1)
303 # define swf_bunler_d(i0,r0,r1) swf_bdd(__aeabi_dcmpgt,ARM_CC_EQ,i0,r0,r1)
304 # define swf_bunlei_d(i0,r0,i1) swf_bdd_(__aeabi_dcmpgt,ARM_CC_EQ,i0,r0,i1)
305 # define swf_buneqr_f(i0,r0,r1) swf_bunff(1,i0,r0,r1)
306 # define swf_buneqi_f(i0,r0,i1) swf_bunff_(1,i0,r0,i1)
307 # define swf_buneqr_d(i0,r0,r1) swf_bundd(1,i0,r0,r1)
308 # define swf_buneqi_d(i0,r0,i1) swf_bundd_(1,i0,r0,i1)
309 # define swf_bunger_f(i0,r0,r1) swf_bff(__aeabi_fcmplt,ARM_CC_EQ,i0,r0,r1)
310 # define swf_bungei_f(i0,r0,i1) swf_bff_(__aeabi_fcmplt,ARM_CC_EQ,i0,r0,i1)
311 # define swf_bunger_d(i0,r0,r1) swf_bdd(__aeabi_dcmplt,ARM_CC_EQ,i0,r0,r1)
312 # define swf_bungei_d(i0,r0,i1) swf_bdd_(__aeabi_dcmplt,ARM_CC_EQ,i0,r0,i1)
313 # define swf_bungtr_f(i0,r0,r1) swf_bff(__aeabi_fcmple,ARM_CC_EQ,i0,r0,r1)
314 # define swf_bungti_f(i0,r0,i1) swf_bff_(__aeabi_fcmple,ARM_CC_EQ,i0,r0,i1)
315 # define swf_bungtr_d(i0,r0,r1) swf_bdd(__aeabi_dcmple,ARM_CC_EQ,i0,r0,r1)
316 # define swf_bungti_d(i0,r0,i1) swf_bdd_(__aeabi_dcmple,ARM_CC_EQ,i0,r0,i1)
317 # define swf_bltgtr_f(i0,r0,r1) swf_bunff(0,i0,r0,r1)
318 # define swf_bltgti_f(i0,r0,i1) swf_bunff_(0,i0,r0,i1)
319 # define swf_bltgtr_d(i0,r0,r1) swf_bundd(0,i0,r0,r1)
320 # define swf_bltgti_d(i0,r0,i1) swf_bundd_(0,i0,r0,i1)
321 # define swf_bordr_f(i0,r0,r1) swf_bff(__aeabi_fcmpun,ARM_CC_EQ,i0,r0,r1)
322 # define swf_bordi_f(i0,r0,i1) swf_bff_(__aeabi_fcmpun,ARM_CC_EQ,i0,r0,i1)
323 # define swf_bordr_d(i0,r0,r1) swf_bdd(__aeabi_dcmpun,ARM_CC_EQ,i0,r0,r1)
324 # define swf_bordi_d(i0,r0,i1) swf_bdd_(__aeabi_dcmpun,ARM_CC_EQ,i0,r0,i1)
325 # define swf_bunordr_f(i0,r0,r1) swf_bff(__aeabi_fcmpun,ARM_CC_NE,i0,r0,r1)
326 # define swf_bunordi_f(i0,r0,i1) swf_bff_(__aeabi_fcmpun,ARM_CC_NE,i0,r0,i1)
327 # define swf_bunordr_d(i0,r0,r1) swf_bdd(__aeabi_dcmpun,ARM_CC_NE,i0,r0,r1)
328 # define swf_bunordi_d(i0,r0,i1) swf_bdd_(__aeabi_dcmpun,ARM_CC_NE,i0,r0,i1)
329 # define swf_ldr_f(r0,r1) _swf_ldr_f(_jit,r0,r1)
330 static void _swf_ldr_f(jit_state_t*,jit_int32_t,jit_int32_t);
331 # define swf_ldr_d(r0,r1) _swf_ldr_d(_jit,r0,r1)
332 static void _swf_ldr_d(jit_state_t*,jit_int32_t,jit_int32_t);
333 # define swf_ldi_f(r0,i0) _swf_ldi_f(_jit,r0,i0)
334 static void _swf_ldi_f(jit_state_t*,jit_int32_t,jit_word_t);
335 # define swf_ldi_d(r0,i0) _swf_ldi_d(_jit,r0,i0)
336 static void _swf_ldi_d(jit_state_t*,jit_int32_t,jit_word_t);
337 # define swf_ldxr_f(r0,r1,r2) _swf_ldxr_f(_jit,r0,r1,r2)
338 static void _swf_ldxr_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
339 # define swf_ldxr_d(r0,r1,r2) _swf_ldxr_d(_jit,r0,r1,r2)
340 static void _swf_ldxr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
341 # define swf_ldxi_f(r0,r1,i0) _swf_ldxi_f(_jit,r0,r1,i0)
342 static void _swf_ldxi_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
343 # define swf_ldxi_d(r0,r1,i0) _swf_ldxi_d(_jit,r0,r1,i0)
344 static void _swf_ldxi_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
345 # define swf_unldr_x(r0, r1, i0) _swf_unldr_x(_jit, r0, r1, i0)
346 static void _swf_unldr_x(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
347 # define swf_unldi_x(r0, i0, i1) _swf_unldi_x(_jit, r0, i0, i1)
348 static void _swf_unldi_x(jit_state_t*, jit_int32_t, jit_word_t, jit_word_t);
349 # define swf_str_f(r0,r1) _swf_str_f(_jit,r0,r1)
350 static void _swf_str_f(jit_state_t*,jit_int32_t,jit_int32_t);
351 # define swf_str_d(r0,r1) _swf_str_d(_jit,r0,r1)
352 static void _swf_str_d(jit_state_t*,jit_int32_t,jit_int32_t);
353 # define swf_sti_f(r0,i0) _swf_sti_f(_jit,r0,i0)
354 static void _swf_sti_f(jit_state_t*,jit_word_t,jit_int32_t);
355 #define swf_unstr_x(r0, r1, i0) _swf_unstr_x(_jit, r0, r1, i0)
356 static void _swf_unstr_x(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
357 #define swf_unsti_x(i0, r0, i1) _swf_unsti_x(_jit, i0, r0, i1)
358 static void _swf_unsti_x(jit_state_t*, jit_word_t, jit_int32_t, jit_word_t);
359 # define swf_sti_d(r0,i0) _swf_sti_d(_jit,r0,i0)
360 static void _swf_sti_d(jit_state_t*,jit_word_t,jit_int32_t);
361 # define swf_stxr_f(r0,r1,r2) _swf_stxr_f(_jit,r0,r1,r2)
362 static void _swf_stxr_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
363 # define swf_stxr_d(r0,r1,r2) _swf_stxr_d(_jit,r0,r1,r2)
364 static void _swf_stxr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
365 # define swf_stxi_f(r0,r1,i0) _swf_stxi_f(_jit,r0,r1,i0)
366 static void _swf_stxi_f(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
367 # define swf_stxi_d(r0,r1,i0) _swf_stxi_d(_jit,r0,r1,i0)
368 static void _swf_stxi_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
369 # define swf_vaarg_d(r0, r1) _swf_vaarg_d(_jit, r0, r1)
370 static void _swf_vaarg_d(jit_state_t*, jit_int32_t, jit_int32_t);
374 #define swf_off(rn) ((rn - 16) << 2)
376 #define swf_call(function, label, regno) \
379 if (!jit_exchange_p()) { \
381 d = (((jit_word_t)function - _jit->pc.w) >> 1) - 2; \
383 d = (((jit_word_t)function - _jit->pc.w) >> 2) - 2; \
386 T2_BLI(encode_thumb_jump(d)); \
388 BLI(d & 0x00ffffff); \
395 movi(regno, (jit_word_t)function); \
402 #define swf_call_with_get_reg(function, label) \
406 if (!jit_exchange_p()) { \
408 d = (((jit_word_t)function - _jit->pc.w) >> 1) - 2; \
410 d = (((jit_word_t)function - _jit->pc.w) >> 2) - 2; \
413 T2_BLI(encode_thumb_jump(d)); \
415 BLI(d & 0x00ffffff); \
422 reg = jit_get_reg(jit_class_gpr); \
423 movi(rn(reg), (jit_word_t)function); \
428 jit_unget_reg(reg); \
431 #define swf_ldrin(rt, rn, im) \
433 if (jit_thumb_p()) T2_LDRIN(rt, rn, im); \
434 else LDRIN(rt, rn, im); \
436 #define swf_strin(rt, rn, im) \
438 if (jit_thumb_p()) T2_STRIN(rt, rn, im); \
439 else STRIN(rt, rn, im); \
441 #define swf_bici(rt, rn, im) \
444 T2_BICI(rt, rn, encode_thumb_immediate(im)); \
446 BICI(rt, rn, encode_arm_immediate(im)); \
449 #if !defined(__GNUC__)
450 float __addsf3(float u, float v)
456 __adddf3(double u, double v)
462 __aeabi_fsub(float u, float v)
468 __aeabi_dsub(double u, double v)
474 __aeabi_fmul(float u, float v)
480 __aeabi_dmul(double u, double v)
486 __aeabi_fdiv(float u, float v)
492 __aeabi_ddiv(double u, double v)
510 __aeabi_d2f(double u)
522 __aeabi_f2iz(float u)
528 __aeabi_d2iz(double u)
534 __aeabi_fcmplt(float u, float v)
540 __aeabi_dcmplt(double u, double v)
546 __aeabi_fcmple(float u, float v)
552 __aeabi_dcmple(double u, double v)
558 __aeabi_fcmpeq(float u, float v)
564 __aeabi_dcmpeq(double u, double v)
570 __aeabi_fcmpge(float u, float v)
576 __aeabi_dcmpge(double u, double v)
582 __aeabi_fcmpgt(float u, float v)
588 __aeabi_dcmpgt(double u, double v)
594 __aeabi_fcmpun(float u, float v)
596 return ((u != u) || (v != v));
600 __aeabi_dcmpun(double u, double v)
602 return ((u != u) || (v != v));
607 _swf_ff(jit_state_t *_jit, float(*i0)(float),
608 jit_int32_t r0, jit_int32_t r1)
611 if (jit_fpr_p(r0) || jit_fpr_p(r1))
614 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
617 swf_call(i0, fallback, _R1_REGNO);
619 swf_strin(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
622 jit_unget_reg_args();
626 _swf_dd(jit_state_t *_jit, double (*i0)(double),
627 jit_int32_t r0, jit_int32_t r1)
630 if (jit_fpr_p(r0) || jit_fpr_p(r1))
633 if (!jit_thumb_p() && jit_armv5e_p())
634 LDRDIN(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
636 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
637 swf_ldrin(_R1_REGNO, _FP_REGNO, swf_off(r1) + 4);
642 movr(_R1_REGNO, r1 + 1);
644 swf_call(i0, fallback, _R2_REGNO);
646 if (!jit_thumb_p() && jit_armv5e_p())
647 STRDIN(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
649 swf_strin(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
650 swf_strin(_R1_REGNO, _FP_REGNO, swf_off(r0) + 4);
655 movr(r0 + 1, _R1_REGNO);
657 jit_unget_reg_args();
661 _swf_fff(jit_state_t *_jit, float (*i0)(float, float),
662 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
665 if (jit_fpr_p(r0) || jit_fpr_p(r1) || jit_fpr_p(r2))
668 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
672 swf_ldrin(_R1_REGNO, _FP_REGNO, swf_off(r2) + 8);
675 swf_call(i0, fallback, _R3_REGNO);
677 swf_strin(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
680 jit_unget_reg_args();
684 _swf_ddd(jit_state_t *_jit, double (*i0)(double, double),
685 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
688 if (jit_fpr_p(r0) || jit_fpr_p(r1) || jit_fpr_p(r2))
691 if (!jit_thumb_p() && jit_armv5e_p())
692 LDRDIN(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
694 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
695 swf_ldrin(_R1_REGNO, _FP_REGNO, swf_off(r1) + 4);
700 movr(_R1_REGNO, r1 + 1);
703 if (!jit_thumb_p() && jit_armv5e_p())
704 LDRDIN(_R2_REGNO, _FP_REGNO, swf_off(r2) + 8);
706 swf_ldrin(_R2_REGNO, _FP_REGNO, swf_off(r2) + 8);
707 swf_ldrin(_R3_REGNO, _FP_REGNO, swf_off(r2) + 4);
712 movr(_R3_REGNO, r2 + 1);
714 swf_call_with_get_reg(i0, fallback);
716 if (!jit_thumb_p() && jit_armv5e_p())
717 STRDIN(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
719 swf_strin(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
720 swf_strin(_R1_REGNO, _FP_REGNO, swf_off(r0) + 4);
725 movr(r0 + 1, _R1_REGNO);
727 jit_unget_reg_args();
731 _swf_fff_(jit_state_t *_jit, float (*i0)(float, float),
732 jit_int32_t r0, jit_int32_t r1, jit_float32_t i1)
739 if (jit_fpr_p(r0) || jit_fpr_p(r1))
743 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
746 movi(_R1_REGNO, data.i);
747 swf_call(i0, fallback, _R3_REGNO);
749 swf_strin(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
752 jit_unget_reg_args();
756 _swf_rsbi_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_float32_t i0)
763 if (jit_fpr_p(r0) || jit_fpr_p(r1))
766 movi(_R0_REGNO, data.i);
768 swf_ldrin(_R1_REGNO, _FP_REGNO, swf_off(r1) + 8);
771 swf_call(__aeabi_fsub, fallback, _R3_REGNO);
773 swf_strin(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
776 jit_unget_reg_args();
780 _swf_ddd_(jit_state_t *_jit, double (*i0)(double, double),
781 jit_int32_t r0, jit_int32_t r1, jit_float64_t i1)
788 if (jit_fpr_p(r0) || jit_fpr_p(r1))
792 if (!jit_thumb_p() && jit_armv5e_p())
793 LDRDIN(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
795 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
796 swf_ldrin(_R1_REGNO, _FP_REGNO, swf_off(r1) + 4);
801 movr(_R1_REGNO, r1 + 1);
803 movi(_R2_REGNO, data.i[0]);
804 movi(_R3_REGNO, data.i[1]);
805 swf_call_with_get_reg(i0, fallback);
807 if (!jit_thumb_p() && jit_armv5e_p())
808 STRDIN(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
810 swf_strin(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
811 swf_strin(_R1_REGNO, _FP_REGNO, swf_off(r0) + 4);
816 movr(r0 + 1, _R1_REGNO);
818 jit_unget_reg_args();
822 _swf_rsbi_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_float64_t i0)
829 if (jit_fpr_p(r0) || jit_fpr_p(r1))
832 movi(_R0_REGNO, data.i[0]);
833 movi(_R1_REGNO, data.i[1]);
835 if (!jit_thumb_p() && jit_armv5e_p())
836 LDRDIN(_R2_REGNO, _FP_REGNO, swf_off(r1) + 8);
838 swf_ldrin(_R2_REGNO, _FP_REGNO, swf_off(r1) + 8);
839 swf_ldrin(_R3_REGNO, _FP_REGNO, swf_off(r1) + 4);
844 movr(_R3_REGNO, r1 + 1);
846 swf_call_with_get_reg(__aeabi_dsub, fallback);
848 if (!jit_thumb_p() && jit_armv5e_p())
849 STRDIN(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
851 swf_strin(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
852 swf_strin(_R1_REGNO, _FP_REGNO, swf_off(r0) + 4);
857 movr(r0 + 1, _R1_REGNO);
859 jit_unget_reg_args();
863 _swf_iff(jit_state_t *_jit, int (*i0)(float, float),
864 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
867 if (jit_fpr_p(r1) || jit_fpr_p(r2))
870 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
874 swf_ldrin(_R1_REGNO, _FP_REGNO, swf_off(r2) + 8);
877 swf_call(i0, fallback, _R2_REGNO);
879 jit_unget_reg_args();
883 _swf_idd(jit_state_t *_jit, int (*i0)(double, double),
884 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
887 if (jit_fpr_p(r1) || jit_fpr_p(r2))
890 if (!jit_thumb_p() && jit_armv5e_p())
891 LDRDIN(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
893 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
894 swf_ldrin(_R1_REGNO, _FP_REGNO, swf_off(r1) + 4);
899 movr(_R1_REGNO, r1 + 1);
902 if (!jit_thumb_p() && jit_armv5e_p())
903 LDRDIN(_R2_REGNO, _FP_REGNO, swf_off(r2) + 8);
905 swf_ldrin(_R2_REGNO, _FP_REGNO, swf_off(r2) + 8);
906 swf_ldrin(_R3_REGNO, _FP_REGNO, swf_off(r2) + 4);
911 movr(_R3_REGNO, r2 + 1);
913 swf_call_with_get_reg(i0, fallback);
915 jit_unget_reg_args();
919 _swf_iff_(jit_state_t *_jit, int (*i0)(float, float),
920 jit_int32_t r0, jit_int32_t r1, jit_float32_t i1)
931 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
934 movi(_R1_REGNO, data.i);
935 swf_call(i0, fallback, _R2_REGNO);
937 jit_unget_reg_args();
941 _swf_idd_(jit_state_t *_jit, int (*i0)(double, double),
942 jit_int32_t r0, jit_int32_t r1, jit_float64_t i1)
953 if (!jit_thumb_p() && jit_armv5e_p())
954 LDRDIN(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
956 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
957 swf_ldrin(_R1_REGNO, _FP_REGNO, swf_off(r1) + 4);
962 movr(_R1_REGNO, r1 + 1);
964 movi(_R2_REGNO, data.i[0]);
965 movi(_R3_REGNO, data.i[1]);
966 swf_call_with_get_reg(i0, fallback);
968 jit_unget_reg_args();
972 _swf_iunff(jit_state_t *_jit, int (*i0)(float, float),
973 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
977 if (jit_fpr_p(r1) || jit_fpr_p(r2))
980 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
984 swf_ldrin(_R1_REGNO, _FP_REGNO, swf_off(r2) + 8);
987 swf_call(__aeabi_fcmpun, fcmpun, _R2_REGNO);
989 T1_CMPI(_R0_REGNO, 0);
996 T2_CC_B(ARM_CC_NE, 0);
1000 CC_MOVI(ARM_CC_NE, r0, 1);
1005 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
1007 movr(_R0_REGNO, r1);
1009 swf_ldrin(_R1_REGNO, _FP_REGNO, swf_off(r2) + 8);
1011 movr(_R1_REGNO, r2);
1012 swf_call(i0, fallback, _R2_REGNO);
1013 movr(r0, _R0_REGNO);
1014 patch_at(arm_patch_jump, instr, _jit->pc.w);
1015 jit_unget_reg_args();
1019 _swf_iundd(jit_state_t *_jit, int (*i0)(double, double),
1020 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1024 if (jit_fpr_p(r1) || jit_fpr_p(r2))
1026 if (jit_fpr_p(r1)) {
1027 if (!jit_thumb_p() && jit_armv5e_p())
1028 LDRDIN(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
1030 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
1031 swf_ldrin(_R1_REGNO, _FP_REGNO, swf_off(r1) + 4);
1035 movr(_R0_REGNO, r1);
1036 movr(_R1_REGNO, r1 + 1);
1038 if (jit_fpr_p(r2)) {
1039 if (!jit_thumb_p() && jit_armv5e_p())
1040 LDRDIN(_R2_REGNO, _FP_REGNO, swf_off(r2) + 8);
1042 swf_ldrin(_R2_REGNO, _FP_REGNO, swf_off(r2) + 8);
1043 swf_ldrin(_R3_REGNO, _FP_REGNO, swf_off(r2) + 4);
1047 movr(_R2_REGNO, r2);
1048 movr(_R3_REGNO, r2 + 1);
1050 swf_call_with_get_reg(__aeabi_dcmpun, dcmpun);
1051 if (jit_thumb_p()) {
1052 T1_CMPI(_R0_REGNO, 0);
1059 T2_CC_B(ARM_CC_NE, 0);
1063 CC_MOVI(ARM_CC_NE, r0, 1);
1067 if (jit_fpr_p(r1)) {
1068 if (!jit_thumb_p() && jit_armv5e_p())
1069 LDRDIN(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
1071 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
1072 swf_ldrin(_R1_REGNO, _FP_REGNO, swf_off(r1) + 4);
1076 movr(_R0_REGNO, r1);
1077 movr(_R1_REGNO, r1 + 1);
1079 if (jit_fpr_p(r2)) {
1080 if (!jit_thumb_p() && jit_armv5e_p())
1081 LDRDIN(_R2_REGNO, _FP_REGNO, swf_off(r2) + 8);
1083 swf_ldrin(_R2_REGNO, _FP_REGNO, swf_off(r2) + 8);
1084 swf_ldrin(_R3_REGNO, _FP_REGNO, swf_off(r2) + 4);
1088 movr(_R2_REGNO, r2);
1089 movr(_R3_REGNO, r2 + 1);
1091 swf_call_with_get_reg(i0, fallback);
1092 movr(r0, _R0_REGNO);
1093 patch_at(arm_patch_jump, instr, _jit->pc.w);
1094 jit_unget_reg_args();
1098 _swf_iunff_(jit_state_t *_jit, int (*i0)(float, float),
1099 jit_int32_t r0, jit_int32_t r1, jit_float32_t i1)
1111 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
1113 movr(_R0_REGNO, r1);
1114 movi(_R1_REGNO, data.i);
1115 swf_call(__aeabi_fcmpun, fcmpun, _R2_REGNO);
1116 if (jit_thumb_p()) {
1117 T1_CMPI(_R0_REGNO, 0);
1124 T2_CC_B(ARM_CC_NE, 0);
1128 CC_MOVI(ARM_CC_NE, r0, 1);
1133 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
1135 movr(_R0_REGNO, r1);
1136 movi(_R1_REGNO, data.i);
1137 swf_call(i0, fallback, _R2_REGNO);
1138 movr(r0, _R0_REGNO);
1139 patch_at(arm_patch_jump, instr, _jit->pc.w);
1140 jit_unget_reg_args();
1144 _swf_iundd_(jit_state_t *_jit, int (*i0)(double, double),
1145 jit_int32_t r0, jit_int32_t r1, jit_float64_t i1)
1156 if (jit_fpr_p(r1)) {
1157 if (!jit_thumb_p() && jit_armv5e_p())
1158 LDRDIN(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
1160 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
1161 swf_ldrin(_R1_REGNO, _FP_REGNO, swf_off(r1) + 4);
1165 movr(_R0_REGNO, r1);
1166 movr(_R1_REGNO, r1 + 1);
1168 movi(_R2_REGNO, data.i[0]);
1169 movi(_R3_REGNO, data.i[1]);
1170 swf_call_with_get_reg(__aeabi_dcmpun, dcmpun);
1171 if (jit_thumb_p()) {
1172 T1_CMPI(_R0_REGNO, 0);
1179 T2_CC_B(ARM_CC_NE, 0);
1183 CC_MOVI(ARM_CC_NE, r0, 1);
1187 if (jit_fpr_p(r1)) {
1188 if (!jit_thumb_p() && jit_armv5e_p())
1189 LDRDIN(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
1191 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
1192 swf_ldrin(_R1_REGNO, _FP_REGNO, swf_off(r1) + 4);
1196 movr(_R0_REGNO, r1);
1197 movr(_R1_REGNO, r1 + 1);
1199 movi(_R2_REGNO, data.i[0]);
1200 movi(_R3_REGNO, data.i[1]);
1201 swf_call_with_get_reg(i0, fallback);
1202 movr(r0, _R0_REGNO);
1203 patch_at(arm_patch_jump, instr, _jit->pc.w);
1204 jit_unget_reg_args();
1208 _swf_bff(jit_state_t *_jit, int (*i0)(float, float), int cc,
1209 jit_word_t i1, jit_int32_t r0, jit_int32_t r1)
1213 if (jit_fpr_p(r0) || jit_fpr_p(r1))
1216 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
1218 movr(_R0_REGNO, r0);
1220 swf_ldrin(_R1_REGNO, _FP_REGNO, swf_off(r1) + 8);
1222 movr(_R1_REGNO, r1);
1223 swf_call(i0, fallback, _R2_REGNO);
1224 if (jit_thumb_p()) {
1225 T1_CMPI(_R0_REGNO, 0);
1227 d = ((i1 - w) >> 1) - 2;
1229 T2_CC_B(cc, encode_thumb_cc_jump(d));
1234 d = ((i1 - w) >> 2) - 2;
1236 CC_B(cc, d & 0x00ffffff);
1238 jit_unget_reg_args();
1243 _swf_bdd(jit_state_t *_jit, int (*i0)(double, double), int cc,
1244 jit_word_t i1, jit_int32_t r0, jit_int32_t r1)
1248 if (jit_fpr_p(r0) || jit_fpr_p(r1))
1250 if (jit_fpr_p(r0)) {
1251 if (!jit_thumb_p() && jit_armv5e_p())
1252 LDRDIN(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
1254 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
1255 swf_ldrin(_R1_REGNO, _FP_REGNO, swf_off(r0) + 4);
1259 movr(_R0_REGNO, r0);
1260 movr(_R1_REGNO, r0 + 1);
1262 if (jit_fpr_p(r1)) {
1263 if (!jit_thumb_p() && jit_armv5e_p())
1264 LDRDIN(_R2_REGNO, _FP_REGNO, swf_off(r1) + 8);
1266 swf_ldrin(_R2_REGNO, _FP_REGNO, swf_off(r1) + 8);
1267 swf_ldrin(_R3_REGNO, _FP_REGNO, swf_off(r1) + 4);
1271 movr(_R2_REGNO, r1);
1272 movr(_R3_REGNO, r1 + 1);
1274 swf_call_with_get_reg(i0, fallback);
1275 if (jit_thumb_p()) {
1276 T1_CMPI(_R0_REGNO, 0);
1278 d = ((i1 - w) >> 1) - 2;
1280 T2_CC_B(cc, encode_thumb_cc_jump(d));
1285 d = ((i1 - w) >> 2) - 2;
1287 CC_B(cc, d & 0x00ffffff);
1289 jit_unget_reg_args();
1294 _swf_bff_(jit_state_t *_jit, int (*i0)(float, float), int cc,
1295 jit_word_t i1, jit_int32_t r0, jit_float32_t i2)
1307 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
1309 movr(_R0_REGNO, r0);
1310 movi(_R1_REGNO, data.i);
1311 swf_call(i0, fallback, _R2_REGNO);
1312 if (jit_thumb_p()) {
1313 T1_CMPI(_R0_REGNO, 0);
1315 d = ((i1 - w) >> 1) - 2;
1317 T2_CC_B(cc, encode_thumb_cc_jump(d));
1322 d = ((i1 - w) >> 2) - 2;
1324 CC_B(cc, d & 0x00ffffff);
1326 jit_unget_reg_args();
1331 _swf_bdd_(jit_state_t *_jit, int (*i0)(double, double), int cc,
1332 jit_word_t i1, jit_int32_t r0, jit_float64_t i2)
1343 if (jit_fpr_p(r0)) {
1344 if (!jit_thumb_p() && jit_armv5e_p())
1345 LDRDIN(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
1347 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
1348 swf_ldrin(_R1_REGNO, _FP_REGNO, swf_off(r0) + 4);
1352 movr(_R0_REGNO, r0);
1353 movr(_R1_REGNO, r0 + 1);
1355 movi(_R2_REGNO, data.i[0]);
1356 movi(_R3_REGNO, data.i[1]);
1357 swf_call_with_get_reg(i0, fallback);
1358 if (jit_thumb_p()) {
1359 T1_CMPI(_R0_REGNO, 0);
1361 d = ((i1 - w) >> 1) - 2;
1363 T2_CC_B(cc, encode_thumb_cc_jump(d));
1368 d = ((i1 - w) >> 2) - 2;
1370 CC_B(cc, d & 0x00ffffff);
1372 jit_unget_reg_args();
1377 _swf_bunff(jit_state_t *_jit, int eq,
1378 jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
1380 jit_word_t w, d, j0, j1;
1382 if (jit_fpr_p(r0) || jit_fpr_p(r1))
1385 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
1387 movr(_R0_REGNO, r0);
1389 swf_ldrin(_R1_REGNO, _FP_REGNO, swf_off(r1) + 8);
1391 movr(_R1_REGNO, r1);
1392 swf_call(__aeabi_fcmpun, fcmpun, _R2_REGNO);
1394 if (jit_thumb_p()) {
1395 T1_CMPI(_R0_REGNO, 0);
1397 T2_CC_B(ARM_CC_NE, 0);
1405 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
1407 movr(_R0_REGNO, r0);
1409 swf_ldrin(_R1_REGNO, _FP_REGNO, swf_off(r1) + 8);
1411 movr(_R1_REGNO, r1);
1412 swf_call(__aeabi_fcmpeq, fcmpeq, _R2_REGNO);
1413 if (jit_thumb_p()) {
1414 T1_CMPI(_R0_REGNO, 0);
1417 T2_CC_B(ARM_CC_EQ, 0);
1418 patch_at(arm_patch_jump, j0, _jit->pc.w);
1421 T2_CC_B(ARM_CC_NE, 0);
1423 d = ((i0 - w) >> 1) - 2;
1425 T2_B(encode_thumb_jump(d));
1432 patch_at(arm_patch_jump, j0, _jit->pc.w);
1437 d = ((i0 - w) >> 2) - 2;
1442 patch_at(arm_patch_jump, j0, _jit->pc.w);
1443 patch_at(arm_patch_jump, j1, _jit->pc.w);
1444 jit_unget_reg_args();
1449 _swf_bundd(jit_state_t *_jit, int eq,
1450 jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
1452 jit_word_t w, d, j0, j1;
1454 if (jit_fpr_p(r0) || jit_fpr_p(r1))
1456 if (jit_fpr_p(r0)) {
1457 if (!jit_thumb_p() && jit_armv5e_p())
1458 LDRDIN(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
1460 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
1461 swf_ldrin(_R1_REGNO, _FP_REGNO, swf_off(r0) + 4);
1465 movr(_R0_REGNO, r0);
1466 movr(_R1_REGNO, r0 + 1);
1468 if (jit_fpr_p(r1)) {
1469 if (!jit_thumb_p() && jit_armv5e_p())
1470 LDRDIN(_R2_REGNO, _FP_REGNO, swf_off(r1) + 8);
1472 swf_ldrin(_R2_REGNO, _FP_REGNO, swf_off(r1) + 8);
1473 swf_ldrin(_R3_REGNO, _FP_REGNO, swf_off(r1) + 4);
1477 movr(_R2_REGNO, r0);
1478 movr(_R3_REGNO, r0 + 1);
1480 swf_call_with_get_reg(__aeabi_dcmpun, dcmpun);
1482 if (jit_thumb_p()) {
1483 T1_CMPI(_R0_REGNO, 0);
1485 T2_CC_B(ARM_CC_NE, 0);
1492 if (jit_fpr_p(r0)) {
1493 if (!jit_thumb_p() && jit_armv5e_p())
1494 LDRDIN(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
1496 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
1497 swf_ldrin(_R1_REGNO, _FP_REGNO, swf_off(r0) + 4);
1501 movr(_R0_REGNO, r0);
1502 movr(_R1_REGNO, r0 + 1);
1504 if (jit_fpr_p(r1)) {
1505 if (!jit_thumb_p() && jit_armv5e_p())
1506 LDRDIN(_R2_REGNO, _FP_REGNO, swf_off(r1) + 8);
1508 swf_ldrin(_R2_REGNO, _FP_REGNO, swf_off(r1) + 8);
1509 swf_ldrin(_R3_REGNO, _FP_REGNO, swf_off(r1) + 4);
1513 movr(_R2_REGNO, r0);
1514 movr(_R3_REGNO, r0 + 1);
1516 swf_call_with_get_reg(__aeabi_dcmpeq, dcmpeq);
1517 if (jit_thumb_p()) {
1518 T1_CMPI(_R0_REGNO, 0);
1521 T2_CC_B(ARM_CC_EQ, 0);
1522 patch_at(arm_patch_jump, j0, _jit->pc.w);
1525 T2_CC_B(ARM_CC_NE, 0);
1527 d = ((i0 - w) >> 1) - 2;
1529 T2_B(encode_thumb_jump(d));
1536 patch_at(arm_patch_jump, j0, _jit->pc.w);
1541 d = ((i0 - w) >> 2) - 2;
1546 patch_at(arm_patch_jump, j0, _jit->pc.w);
1547 patch_at(arm_patch_jump, j1, _jit->pc.w);
1548 jit_unget_reg_args();
1553 _swf_bunff_(jit_state_t *_jit, int eq,
1554 jit_word_t i0, jit_int32_t r0, jit_float32_t i1)
1560 jit_word_t w, d, j0, j1;
1566 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
1568 movr(_R0_REGNO, r0);
1569 movi(_R1_REGNO, data.i);
1570 swf_call(__aeabi_fcmpun, fcmpun, _R2_REGNO);
1572 if (jit_thumb_p()) {
1573 T1_CMPI(_R0_REGNO, 0);
1575 T2_CC_B(ARM_CC_NE, 0);
1583 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
1585 movr(_R0_REGNO, r0);
1586 movi(_R1_REGNO, data.i);
1587 swf_call(__aeabi_fcmpeq, fcmpeq, _R2_REGNO);
1588 if (jit_thumb_p()) {
1589 T1_CMPI(_R0_REGNO, 0);
1592 T2_CC_B(ARM_CC_EQ, 0);
1593 patch_at(arm_patch_jump, j0, _jit->pc.w);
1596 T2_CC_B(ARM_CC_NE, 0);
1598 d = ((i0 - w) >> 1) - 2;
1600 T2_B(encode_thumb_jump(d));
1607 patch_at(arm_patch_jump, j0, _jit->pc.w);
1612 d = ((i0 - w) >> 2) - 2;
1617 patch_at(arm_patch_jump, j0, _jit->pc.w);
1618 patch_at(arm_patch_jump, j1, _jit->pc.w);
1619 jit_unget_reg_args();
1624 _swf_bundd_(jit_state_t *_jit, int eq,
1625 jit_word_t i0, jit_int32_t r0, jit_float64_t i1)
1627 jit_word_t w, d, j0, j1;
1636 if (jit_fpr_p(r0)) {
1637 if (!jit_thumb_p() && jit_armv5e_p())
1638 LDRDIN(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
1640 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
1641 swf_ldrin(_R1_REGNO, _FP_REGNO, swf_off(r0) + 4);
1645 movr(_R0_REGNO, r0);
1646 movr(_R1_REGNO, r0 + 1);
1648 movi(_R2_REGNO, data.i[0]);
1649 movi(_R3_REGNO, data.i[1]);
1650 swf_call_with_get_reg(__aeabi_dcmpun, fcmpun);
1652 if (jit_thumb_p()) {
1653 T1_CMPI(_R0_REGNO, 0);
1655 T2_CC_B(ARM_CC_NE, 0);
1662 if (jit_fpr_p(r0)) {
1663 if (!jit_thumb_p() && jit_armv5e_p())
1664 LDRDIN(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
1666 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
1667 swf_ldrin(_R1_REGNO, _FP_REGNO, swf_off(r0) + 4);
1671 movr(_R0_REGNO, r0);
1672 movr(_R1_REGNO, r0 + 1);
1674 movi(_R2_REGNO, data.i[0]);
1675 movi(_R3_REGNO, data.i[1]);
1676 swf_call_with_get_reg(__aeabi_dcmpeq, fcmpeq);
1677 if (jit_thumb_p()) {
1678 T1_CMPI(_R0_REGNO, 0);
1681 T2_CC_B(ARM_CC_EQ, 0);
1682 patch_at(arm_patch_jump, j0, _jit->pc.w);
1685 T2_CC_B(ARM_CC_NE, 0);
1687 d = ((i0 - w) >> 1) - 2;
1689 T2_B(encode_thumb_jump(d));
1696 patch_at(arm_patch_jump, j0, _jit->pc.w);
1701 d = ((i0 - w) >> 2) - 2;
1706 patch_at(arm_patch_jump, j0, _jit->pc.w);
1707 patch_at(arm_patch_jump, j1, _jit->pc.w);
1708 jit_unget_reg_args();
1713 _swf_extr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1718 movr(_R0_REGNO, r1);
1719 swf_call(__aeabi_i2f, i2f, _R1_REGNO);
1721 swf_strin(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
1723 movr(r0, _R0_REGNO);
1724 jit_unget_reg_args();
1728 _swf_extr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1733 movr(_R0_REGNO, r1);
1734 swf_call(__aeabi_i2d, i2d, _R2_REGNO);
1735 if (jit_fpr_p(r0)) {
1736 if (!jit_thumb_p() && jit_armv5e_p())
1737 STRDIN(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
1739 swf_strin(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
1740 swf_strin(_R1_REGNO, _FP_REGNO, swf_off(r0) + 4);
1744 movr(r0, _R0_REGNO);
1745 movr(r0 + 1, _R1_REGNO);
1747 jit_unget_reg_args();
1751 _swf_extr_d_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1754 if (jit_fpr_p(r0) || jit_fpr_p(r1))
1756 if (jit_fpr_p(r1)) {
1757 if (!jit_thumb_p() && jit_armv5e_p())
1758 LDRDIN(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
1760 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
1761 swf_ldrin(_R1_REGNO, _FP_REGNO, swf_off(r1) + 4);
1765 movr(_R0_REGNO, r1);
1766 movr(_R1_REGNO, r1 + 1);
1768 swf_call(__aeabi_d2f, d2f, _R2_REGNO);
1770 swf_strin(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
1772 movr(r0, _R0_REGNO);
1773 jit_unget_reg_args();
1777 _swf_extr_f_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1780 if (jit_fpr_p(r0) || jit_fpr_p(r1))
1783 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
1785 movr(_R0_REGNO, r1);
1786 swf_call(__aeabi_f2d, f2d, _R1_REGNO);
1787 if (jit_fpr_p(r0)) {
1788 if (!jit_thumb_p() && jit_armv5e_p())
1789 STRDIN(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
1791 swf_strin(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
1792 swf_strin(_R1_REGNO, _FP_REGNO, swf_off(r0) + 4);
1796 movr(r0, _R0_REGNO);
1797 movr(r0 + 1, _R1_REGNO);
1799 jit_unget_reg_args();
1803 _swf_truncr_f_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1805 #if !NAN_TO_INT_IS_ZERO
1807 jit_word_t fast_not_nan;
1808 jit_word_t slow_not_nan;
1814 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
1816 movr(_R0_REGNO, r1);
1817 #if !NAN_TO_INT_IS_ZERO
1818 /* >> based on fragment of __aeabi_fcmpun */
1819 lshi(_R2_REGNO, _R0_REGNO, 1);
1821 torrrs(THUMB2_MVN|ARM_S, _R0_REGNO, _R3_REGNO, _R2_REGNO,
1822 encode_thumb_shift(24, ARM_ASR));
1824 corrrs(ARM_CC_AL, ARM_MVN|ARM_S|ARM_ASR,
1825 _R0_REGNO, _R3_REGNO, _R2_REGNO, 24);
1826 fast_not_nan = _jit->pc.w;
1827 if (jit_thumb_p()) {
1828 T2_CC_B(ARM_CC_NE, 0);
1829 tshift(THUMB2_LSLI|ARM_S, _R0_REGNO, _R3_REGNO, 9);
1833 cshift(ARM_CC_AL, ARM_S|ARM_LSL, _R0_REGNO, _R3_REGNO, _R0_REGNO, 9);
1835 slow_not_nan = _jit->pc.w;
1837 T2_CC_B(ARM_CC_EQ, 0);
1840 movi(r0, 0x80000000);
1841 is_nan = _jit->pc.w;
1846 patch_at(arm_patch_jump, fast_not_nan, _jit->pc.w);
1847 patch_at(arm_patch_jump, slow_not_nan, _jit->pc.w);
1848 /* << based on fragment of __aeabi_fcmpun */
1850 swf_call(__aeabi_f2iz, f2iz, _R2_REGNO);
1851 movr(r0, _R0_REGNO);
1852 #if !NAN_TO_INT_IS_ZERO
1853 patch_at(arm_patch_jump, is_nan, _jit->pc.w);
1855 jit_unget_reg_args();
1859 _swf_truncr_d_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1861 #if !NAN_TO_INT_IS_ZERO
1863 jit_word_t fast_not_nan;
1864 jit_word_t slow_not_nan;
1869 if (jit_fpr_p(r1)) {
1870 if (!jit_thumb_p() && jit_armv5e_p())
1871 LDRDIN(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
1873 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
1874 swf_ldrin(_R1_REGNO, _FP_REGNO, swf_off(r1) + 4);
1878 movr(_R0_REGNO, r1);
1879 movr(_R1_REGNO, r1 + 1);
1881 #if !NAN_TO_INT_IS_ZERO
1882 /* >> based on fragment of __aeabi_dcmpun */
1883 lshi(_R3_REGNO, _R1_REGNO, 1);
1885 torrrs(THUMB2_MVN|ARM_S, _R0_REGNO, _R3_REGNO, _R3_REGNO,
1886 encode_thumb_shift(21, ARM_ASR));
1888 corrrs(ARM_CC_AL, ARM_MVN|ARM_S|ARM_ASR,
1889 _R0_REGNO, _R3_REGNO, _R3_REGNO, 21);
1890 fast_not_nan = _jit->pc.w;
1891 if (jit_thumb_p()) {
1892 T2_CC_B(ARM_CC_NE, 0);
1893 torrrs(THUMB2_ORR|ARM_S, _R0_REGNO, _R3_REGNO, _R1_REGNO,
1894 encode_thumb_shift(12, ARM_LSL));
1898 corrrs(ARM_CC_AL, ARM_ORR|ARM_S|ARM_LSL,
1899 _R0_REGNO, _R3_REGNO, _R1_REGNO, 12);
1901 slow_not_nan = _jit->pc.w;
1903 T2_CC_B(ARM_CC_EQ, 0);
1906 movi(r0, 0x80000000);
1907 is_nan = _jit->pc.w;
1912 patch_at(arm_patch_jump, fast_not_nan, _jit->pc.w);
1913 patch_at(arm_patch_jump, slow_not_nan, _jit->pc.w);
1914 /* << based on fragment of __aeabi_dcmpun */
1916 swf_call(__aeabi_d2iz, d2iz, _R3_REGNO);
1917 movr(r0, _R0_REGNO);
1918 #if !NAN_TO_INT_IS_ZERO
1919 patch_at(arm_patch_jump, is_nan, _jit->pc.w);
1921 jit_unget_reg_args();
1925 _swf_movr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1929 assert(jit_fpr_p(r0) && jit_fpr_p(r1));
1931 reg = jit_get_reg(jit_class_gpr);
1932 swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 8);
1933 swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8);
1939 _swf_movi_f(jit_state_t *_jit, jit_int32_t r0, jit_float32_t i0)
1946 assert(jit_fpr_p(r0));
1949 reg = jit_get_reg(jit_class_gpr);
1950 movi(rn(reg), data.i);
1951 swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8);
1956 _swf_movr_w_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1958 assert(jit_fpr_p(r0));
1960 swf_strin(r1, _FP_REGNO, swf_off(r0) + 8);
1964 _swf_movr_f_w(jit_state_t *_jit ,jit_int32_t r0, jit_int32_t r1)
1966 assert(jit_fpr_p(r1));
1968 swf_ldrin(r0, _FP_REGNO, swf_off(r1) + 8);
1972 _swf_movi_w_f(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
1976 reg = jit_get_reg(jit_class_gpr);
1978 swf_movr_w_f(r0, rn(reg));
1983 _swf_movr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1987 assert(jit_fpr_p(r0) && jit_fpr_p(r1));
1989 if (!jit_thumb_p() && jit_armv5e_p() &&
1990 (reg = jit_get_reg_pair()) != JIT_NOREG) {
1991 LDRDIN(rn(reg), _FP_REGNO, swf_off(r1) + 8);
1992 STRDIN(rn(reg), _FP_REGNO, swf_off(r0) + 8);
1993 jit_unget_reg_pair(reg);
1996 reg = jit_get_reg(jit_class_gpr);
1997 swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 8);
1998 swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8);
1999 swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 4);
2000 swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 4);
2007 _swf_movi_d(jit_state_t *_jit, jit_int32_t r0, jit_float64_t i0)
2014 assert(jit_fpr_p(r0));
2017 if (!jit_thumb_p() && jit_armv5e_p() &&
2018 (reg = jit_get_reg_pair()) != JIT_NOREG) {
2019 movi(rn(reg), data.i[0]);
2020 movi(rn(reg) + 1, data.i[1]);
2021 STRDIN(rn(reg), _FP_REGNO, swf_off(r0) + 8);
2022 jit_unget_reg_pair(reg);
2025 reg = jit_get_reg(jit_class_gpr);
2026 movi(rn(reg), data.i[0]);
2027 swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8);
2028 movi(rn(reg), data.i[1]);
2029 swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 4);
2035 _swf_movr_ww_d(jit_state_t *_jit,
2036 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2038 assert(jit_fpr_p(r0));
2040 swf_strin(r1, _FP_REGNO, swf_off(r0) + 8);
2041 swf_strin(r2, _FP_REGNO, swf_off(r0) + 4);
2045 _swf_movr_d_ww(jit_state_t *_jit,
2046 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2048 assert(jit_fpr_p(r2));
2050 swf_ldrin(r0, _FP_REGNO, swf_off(r2) + 8);
2051 swf_ldrin(r1, _FP_REGNO, swf_off(r2) + 4);
2055 _swf_movi_ww_d(jit_state_t *_jit,
2056 jit_int32_t r0, jit_word_t i0, jit_word_t i1)
2059 assert(jit_fpr_p(r0));
2061 reg = jit_get_reg(jit_class_gpr);
2063 swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8);
2065 swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 4);
2070 _swf_absr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
2073 if (jit_fpr_p(r0) || jit_fpr_p(r1))
2075 if (jit_fpr_p(r1)) {
2076 reg = jit_get_reg(jit_class_gpr);
2077 swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 8);
2078 swf_bici(rn(reg), rn(reg), 0x80000000);
2080 swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8);
2085 else if (jit_fpr_p(r0)) {
2086 reg = jit_get_reg(jit_class_gpr);
2088 swf_bici(rn(reg), rn(reg), 0x80000000);
2089 swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8);
2093 swf_bici(r0, r1, 0x80000000);
2097 _swf_absr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
2100 if (jit_fpr_p(r0) || jit_fpr_p(r1))
2102 if (jit_fpr_p(r1)) {
2103 if (jit_fpr_p(r0) && !jit_thumb_p() && jit_armv5e_p() &&
2104 r0 != r1 && (reg = jit_get_reg_pair()) != JIT_NOREG) {
2105 LDRDIN(rn(reg), _FP_REGNO, swf_off(r1) + 8);
2106 swf_bici(rn(reg) + 1, rn(reg) + 1, 0x80000000);
2107 STRDIN(rn(reg), _FP_REGNO, swf_off(r0) + 8);
2108 jit_unget_reg_pair(reg);
2111 reg = jit_get_reg(jit_class_gpr);
2112 swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 4);
2113 swf_bici(rn(reg), rn(reg), 0x80000000);
2114 if (jit_fpr_p(r0)) {
2115 swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 4);
2117 swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 8);
2118 swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8);
2123 swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 8);
2124 movr(r0 + 1, rn(reg));
2129 else if (jit_fpr_p(r0)) {
2130 reg = jit_get_reg(jit_class_gpr);
2132 swf_bici(rn(reg), rn(reg), 0x80000000);
2133 swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 4);
2134 movr(rn(reg), r1 + 1);
2135 swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8);
2139 swf_bici(r0, r1, 0x80000000);
2141 movr(r0 + 1, r1 + 1);
2146 _swf_negr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
2149 if (jit_fpr_p(r0) || jit_fpr_p(r1))
2151 if (jit_fpr_p(r1)) {
2152 reg = jit_get_reg(jit_class_gpr);
2153 swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 8);
2154 xori(rn(reg), rn(reg), 0x80000000);
2156 swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8);
2161 else if (jit_fpr_p(r0)) {
2162 reg = jit_get_reg(jit_class_gpr);
2164 xori(rn(reg), rn(reg), 0x80000000);
2165 swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8);
2169 xori(r0, r1, 0x80000000);
2173 _swf_negr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
2176 if (jit_fpr_p(r0) || jit_fpr_p(r1))
2178 if (jit_fpr_p(r1)) {
2179 if (jit_fpr_p(r0) && !jit_thumb_p() && jit_armv5e_p() &&
2180 r0 != r1 && (reg = jit_get_reg_pair()) != JIT_NOREG) {
2181 LDRDIN(rn(reg), _FP_REGNO, swf_off(r1) + 8);
2182 EORI(rn(reg) + 1, rn(reg) + 1, encode_arm_immediate(0x80000000));
2183 STRDIN(rn(reg), _FP_REGNO, swf_off(r0) + 8);
2184 jit_unget_reg_pair(reg);
2187 reg = jit_get_reg(jit_class_gpr);
2188 swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 4);
2189 xori(rn(reg), rn(reg), 0x80000000);
2190 if (jit_fpr_p(r0)) {
2191 swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 4);
2193 swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 8);
2194 swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8);
2199 swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 8);
2200 movr(r0 + 1, rn(reg));
2205 else if (jit_fpr_p(r0)) {
2206 reg = jit_get_reg(jit_class_gpr);
2208 xori(rn(reg), rn(reg), 0x80000000);
2209 swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 4);
2210 movr(rn(reg), r1 + 1);
2211 swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8);
2215 xori(r0, r1, 0x80000000);
2217 movr(r0 + 1, r1 + 1);
2222 _swf_fmar_f(jit_state_t *_jit,
2223 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_int32_t r3)
2227 swf_mulr_f(r0, r1, r2);
2228 swf_addr_f(r0, r0, r3);
2231 t0 = jit_get_reg(jit_class_fpr);
2232 swf_mulr_f(rn(t0), r1, r2);
2233 swf_addr_f(r0, rn(t0), r3);
2239 _swf_fmsr_f(jit_state_t *_jit,
2240 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_int32_t r3)
2244 swf_mulr_f(r0, r1, r2);
2245 swf_subr_f(r0, r0, r3);
2248 t0 = jit_get_reg(jit_class_fpr);
2249 swf_mulr_f(rn(t0), r1, r2);
2250 swf_subr_f(r0, rn(t0), r3);
2256 _swf_fnmar_f(jit_state_t *_jit,
2257 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_int32_t r3)
2260 t0 = jit_get_reg(jit_class_fpr);
2261 swf_negr_f(rn(t0), r1);
2262 swf_mulr_f(rn(t0), rn(t0), r2);
2263 swf_subr_f(r0, rn(t0), r3);
2268 _swf_fnmsr_f(jit_state_t *_jit,
2269 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_int32_t r3)
2272 t0 = jit_get_reg(jit_class_fpr);
2273 swf_negr_f(rn(t0), r1);
2274 swf_mulr_f(rn(t0), rn(t0), r2);
2275 swf_addr_f(r0, rn(t0), r3);
2280 _swf_fmar_d(jit_state_t *_jit,
2281 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_int32_t r3)
2285 swf_mulr_d(r0, r1, r2);
2286 swf_addr_d(r0, r0, r3);
2289 t0 = jit_get_reg(jit_class_fpr);
2290 swf_mulr_d(rn(t0), r1, r2);
2291 swf_addr_d(r0, rn(t0), r3);
2297 _swf_fmsr_d(jit_state_t *_jit,
2298 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_int32_t r3)
2302 swf_mulr_d(r0, r1, r2);
2303 swf_subr_d(r0, r0, r3);
2306 t0 = jit_get_reg(jit_class_fpr);
2307 swf_mulr_d(rn(t0), r1, r2);
2308 swf_subr_d(r0, rn(t0), r3);
2314 _swf_fnmar_d(jit_state_t *_jit,
2315 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_int32_t r3)
2318 t0 = jit_get_reg(jit_class_fpr);
2319 swf_negr_d(rn(t0), r1);
2320 swf_mulr_d(rn(t0), rn(t0), r2);
2321 swf_subr_d(r0, rn(t0), r3);
2326 _swf_fnmsr_d(jit_state_t *_jit,
2327 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_int32_t r3)
2330 t0 = jit_get_reg(jit_class_fpr);
2331 swf_negr_d(rn(t0), r1);
2332 swf_mulr_d(rn(t0), rn(t0), r2);
2333 swf_addr_d(r0, rn(t0), r3);
2338 _swf_ner_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2340 swf_iff(__aeabi_fcmpeq, r0, r1, r2);
2345 _swf_nei_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_float32_t i0)
2347 swf_iff_(__aeabi_fcmpeq, r0, r1, i0);
2352 _swf_ner_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2354 swf_idd(__aeabi_dcmpeq, r0, r1, r2);
2359 _swf_nei_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_float64_t i0)
2361 swf_idd_(__aeabi_dcmpeq, r0, r1, i0);
2366 _swf_ltgtr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2368 swf_iunff(__aeabi_fcmpeq, r0, r1, r2);
2373 _swf_ltgti_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_float32_t i0)
2375 swf_iunff_(__aeabi_fcmpeq, r0, r1, i0);
2380 _swf_ltgtr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2382 swf_iundd(__aeabi_dcmpeq, r0, r1, r2);
2387 _swf_ltgti_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_float64_t i0)
2389 swf_iundd_(__aeabi_dcmpeq, r0, r1, i0);
2394 _swf_ordr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2396 swf_iff(__aeabi_fcmpun, r0, r1, r2);
2401 _swf_ordi_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_float32_t i0)
2403 swf_iff_(__aeabi_fcmpun, r0, r1, i0);
2408 _swf_ordr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2410 swf_idd(__aeabi_dcmpun, r0, r1, r2);
2415 _swf_ordi_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_float64_t i0)
2417 swf_idd_(__aeabi_dcmpun, r0, r1, i0);
2422 _swf_ldr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
2425 if (jit_fpr_p(r0)) {
2427 reg = jit_get_reg(jit_class_gpr);
2428 ldxi_i(rn(reg), r1, 0);
2429 swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8);
2437 _swf_ldr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
2440 if (jit_fpr_p(r0)) {
2442 if (!jit_thumb_p() && jit_armv5e_p() &&
2443 (reg = jit_get_reg_pair()) != JIT_NOREG) {
2444 LDRDI(rn(reg), r1, 0);
2445 STRDIN(rn(reg), _FP_REGNO, swf_off(r0) + 8);
2446 jit_unget_reg_pair(reg);
2449 reg = jit_get_reg(jit_class_gpr);
2450 ldxi_i(rn(reg), r1, 0);
2451 swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8);
2452 ldxi_i(rn(reg), r1, 4);
2453 swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 4);
2457 else if (!jit_thumb_p() && jit_armv5e_p() && !(r0 & 1))
2461 ldxi_i(r0 + 1, r1, 4);
2466 _swf_ldi_f(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
2469 if (jit_fpr_p(r0)) {
2471 reg = jit_get_reg(jit_class_gpr);
2473 swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8);
2481 _swf_ldi_d(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
2483 jit_int32_t rg0, rg1;
2486 if (jit_fpr_p(r0) && !jit_thumb_p() && jit_armv5e_p() &&
2487 (rg0 = jit_get_reg_pair()) != JIT_NOREG) {
2489 LDRDI(rn(rg0), rn(rg0), 0);
2490 STRDIN(rn(rg0), _FP_REGNO, swf_off(r0) + 8);
2491 jit_unget_reg_pair(rg0);
2494 rg1 = jit_get_reg(jit_class_gpr);
2496 if (jit_fpr_p(r0)) {
2497 rg0 = jit_get_reg(jit_class_gpr);
2498 ldxi_i(rn(rg0), rn(rg1), 0);
2499 swf_strin(rn(rg0), _FP_REGNO, swf_off(r0) + 8);
2500 ldxi_i(rn(rg0), rn(rg1), 4);
2501 swf_strin(rn(rg0), _FP_REGNO, swf_off(r0) + 4);
2504 else if (!jit_thumb_p() && jit_armv5e_p() && !(r0 & 1))
2505 LDRDI(r0, rn(rg1), 0);
2507 ldxi_i(r0, rn(rg1), 0);
2508 ldxi_i(r0 + 1, rn(rg1), 0);
2515 _swf_ldxr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2518 if (jit_fpr_p(r0)) {
2520 reg = jit_get_reg(jit_class_gpr);
2521 ldxr_i(rn(reg), r1, r2);
2522 swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8);
2530 _swf_ldxr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2532 jit_int32_t rg0, rg1;
2533 if (jit_fpr_p(r0)) {
2535 if (!jit_thumb_p() && jit_armv5e_p() &&
2536 (rg0 = jit_get_reg_pair()) != JIT_NOREG) {
2537 LDRD(rn(rg0), r1, r2);
2538 STRDIN(rn(rg0), _FP_REGNO, swf_off(r0) + 8);
2539 jit_unget_reg_pair(rg0);
2542 rg1 = jit_get_reg(jit_class_gpr);
2543 addr(rn(rg1), r1, r2);
2544 rg0 = jit_get_reg(jit_class_gpr);
2545 ldxi_i(rn(rg0), rn(rg1), 0);
2546 swf_strin(rn(rg0), _FP_REGNO, swf_off(r0) + 8);
2547 ldxi_i(rn(rg0), rn(rg1), 4);
2548 swf_strin(rn(rg0), _FP_REGNO, swf_off(r0) + 4);
2554 if (!jit_thumb_p() && jit_armv5e_p() && !(r0 & 1))
2557 rg1 = jit_get_reg(jit_class_gpr);
2558 addr(rn(rg1), r1, r2);
2559 ldxi_i(r0, rn(rg1), 0);
2560 ldxi_i(r0 + 1, rn(rg1), 4);
2567 _swf_ldxi_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2572 if (jit_fpr_p(r0)) {
2573 reg = jit_get_reg(jit_class_gpr);
2574 ldxi_i(rn(reg), r1, i0);
2575 swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8);
2583 _swf_unldr_x(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2587 assert(i0 == 4 || i0 == 8);
2588 if (jit_unaligned_p()) {
2589 t0 = fallback_jit_get_reg(jit_class_gpr);
2593 swf_movr_w_f(r0, r2);
2596 t1 = fallback_jit_get_reg(jit_class_gpr);
2598 #if __BYTE_ORDER == __LITTLE_ENDIAN
2607 swf_movr_ww_d(r0, r2, r3);
2621 _swf_unldi_x(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0, jit_word_t i1)
2625 assert(i1 == 4 || i1 == 8);
2626 if (jit_unaligned_p()) {
2627 t0 = fallback_jit_get_reg(jit_class_gpr);
2631 swf_movr_w_f(r0, r2);
2634 t1 = fallback_jit_get_reg(jit_class_gpr);
2636 #if __BYTE_ORDER == __LITTLE_ENDIAN
2638 unldi(r3, i0 + 4, 4);
2641 unldi(r2, i0 + 4, 4);
2643 swf_movr_ww_d(r0, r3, r2);
2657 _swf_ldxi_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2659 jit_int32_t rg0, rg1;
2660 if (jit_fpr_p(r0)) {
2662 if (!jit_thumb_p() && jit_armv5e_p() &&
2663 ((i0 >= 0 && i0 <= 255) || (i0 < 0 && i0 >= -255)) &&
2664 (rg0 = jit_get_reg_pair()) != JIT_NOREG) {
2666 LDRDI(rn(rg0), r1, i0);
2668 LDRDIN(rn(rg0), r1, -i0);
2669 STRDIN(rn(rg0), _FP_REGNO, swf_off(r0) + 8);
2670 jit_unget_reg_pair(rg0);
2672 else if (i0 >= 0 && i0 + 4 <= 4095) {
2673 rg0 = jit_get_reg(jit_class_gpr);
2674 ldxi_i(rn(rg0), r1, i0);
2675 swf_strin(rn(rg0), _FP_REGNO, swf_off(r0) + 8);
2676 ldxi_i(rn(rg0), r1, i0 + 4);
2677 swf_strin(rn(rg0), _FP_REGNO, swf_off(r0) + 4);
2680 else if (i0 < 0 && ((jit_thumb_p() && i0 >= -255) ||
2681 (!jit_thumb_p() && i0 >= -4095))) {
2682 rg0 = jit_get_reg(jit_class_gpr);
2683 swf_ldrin(rn(rg0), r1, -i0);
2684 swf_strin(rn(rg0), _FP_REGNO, swf_off(r0) + 8);
2685 swf_ldrin(rn(rg0), r1, -(i0 + 4));
2686 swf_strin(rn(rg0), _FP_REGNO, swf_off(r0) + 4);
2690 rg0 = jit_get_reg(jit_class_gpr);
2691 rg1 = jit_get_reg(jit_class_gpr);
2692 addi(rn(rg1), r1, i0);
2693 ldxi_i(rn(rg0), rn(rg1), 0);
2694 swf_strin(rn(rg0), _FP_REGNO, swf_off(r0) + 8);
2695 ldxi_i(rn(rg0), rn(rg1), 4);
2696 swf_strin(rn(rg0), _FP_REGNO, swf_off(r0) + 4);
2702 if (!jit_thumb_p() && jit_armv5e_p() &&
2703 i0 >= 0 && i0 <= 255 && !(r0 & 1))
2705 else if (!jit_thumb_p() && jit_armv5e_p() &&
2706 i0 < 0 && i0 >= -255 && !(r0 & 1))
2707 LDRDIN(r0, r1, -i0);
2708 else if (i0 >= 0 && i0 + 4 <= 4095) {
2710 ldxi_i(r0 + 1, r1, i0 + 4);
2712 else if (i0 < 0 && i0 >= -4095) {
2713 swf_ldrin(r0, r1, -i0);
2714 swf_ldrin(r0 + 1, r1, -(i0 + 4));
2717 rg0 = jit_get_reg(jit_class_gpr);
2718 addi(rn(rg0), r1, i0);
2719 ldxi_i(r0, rn(rg0), 0);
2720 ldxi_i(r0 + 1, rn(rg0), 4);
2727 _swf_str_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
2730 if (jit_fpr_p(r1)) {
2732 reg = jit_get_reg(jit_class_gpr);
2733 swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 8);
2734 stxi_i(0, r0, rn(reg));
2742 _swf_str_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
2745 if (jit_fpr_p(r1)) {
2747 if (!jit_thumb_p() && jit_armv5e_p() &&
2748 (reg = jit_get_reg_pair()) != JIT_NOREG) {
2749 LDRDIN(rn(reg), _FP_REGNO, swf_off(r1) + 8);
2750 STRDI(rn(reg), r0, 0);
2751 jit_unget_reg_pair(reg);
2754 reg = jit_get_reg(jit_class_gpr);
2755 swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 8);
2756 stxi_i(0, r0, rn(reg));
2757 swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 4);
2758 stxi_i(4, r0, rn(reg));
2763 if (!jit_thumb_p() && jit_armv5e_p() && !(r1 & 1))
2767 stxi_i(4, r0, r1 + 1);
2773 _swf_sti_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
2776 if (jit_fpr_p(r0)) {
2778 reg = jit_get_reg(jit_class_gpr);
2779 swf_ldrin(rn(reg), _FP_REGNO, swf_off(r0) + 8);
2788 _swf_unstr_x(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2792 assert(i0 == 4 || i0 == 8);
2793 if (jit_unaligned_p()) {
2794 t0 = fallback_jit_get_reg(jit_class_gpr);
2797 swf_movr_f_w(r2, r1);
2801 t1 = fallback_jit_get_reg(jit_class_gpr);
2803 swf_movr_d_ww(r2, r3, r1);
2804 #if __BYTE_ORDER == __LITTLE_ENDIAN
2826 _swf_unsti_x(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
2830 assert(i1 == 4 || i1 == 8);
2831 if (jit_unaligned_p()) {
2832 t0 = fallback_jit_get_reg(jit_class_gpr);
2835 swf_movr_f_w(r2, r0);
2839 t1 = fallback_jit_get_reg(jit_class_gpr);
2841 swf_movr_d_ww(r2, r3, r0);
2842 #if __BYTE_ORDER == __LITTLE_ENDIAN
2844 unsti(i0 + 4, r2, 4);
2847 unsti(i0 + 4, r3, 4);
2862 _swf_sti_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
2864 jit_int32_t rg0, rg1;
2865 if (jit_fpr_p(r0)) {
2867 if (!jit_thumb_p() && jit_armv5e_p() &&
2868 (rg0 = jit_get_reg_pair()) != JIT_NOREG) {
2869 rg1 = jit_get_reg(jit_class_gpr);
2871 LDRDIN(rn(rg0), _FP_REGNO, swf_off(r0) + 8);
2872 STRDI(rn(rg0), rn(rg1), 0);
2874 jit_unget_reg_pair(rg0);
2877 rg1 = jit_get_reg(jit_class_gpr);
2879 rg0 = jit_get_reg(jit_class_gpr);
2880 swf_ldrin(rn(rg0), _FP_REGNO, swf_off(r0) + 8);
2881 stxi_i(0, rn(rg1), rn(rg0));
2882 swf_ldrin(rn(rg0), _FP_REGNO, swf_off(r0) + 4);
2883 stxi_i(4, rn(rg1), rn(rg0));
2889 rg1 = jit_get_reg(jit_class_gpr);
2891 if (!jit_thumb_p() && jit_armv5e_p() && !(r0 & 1))
2892 STRDI(r0, rn(rg1), 0);
2894 stxi_i(0, rn(rg1), r0);
2895 stxi_i(4, rn(rg1), r0 + 1);
2902 _swf_stxr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2905 if (jit_fpr_p(r2)) {
2907 reg = jit_get_reg(jit_class_gpr);
2908 swf_ldrin(rn(reg), _FP_REGNO, swf_off(r2) + 8);
2909 stxr_i(r1, r0, rn(reg));
2917 _swf_stxr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2919 jit_int32_t rg0, rg1;
2920 if (jit_fpr_p(r2)) {
2922 if (!jit_thumb_p() && jit_armv5e_p() &&
2923 (rg0 = jit_get_reg_pair()) != JIT_NOREG) {
2924 LDRDIN(rn(rg0), _FP_REGNO, swf_off(r2) + 8);
2925 STRD(rn(rg0), r0, r1);
2926 jit_unget_reg_pair(rg0);
2929 rg1 = jit_get_reg(jit_class_gpr);
2930 addr(rn(rg1), r0, r1);
2931 rg0 = jit_get_reg(jit_class_gpr);
2932 swf_ldrin(rn(rg0), _FP_REGNO, swf_off(r2) + 8);
2933 stxi_i(0, rn(rg1), rn(rg0));
2934 swf_ldrin(rn(rg0), _FP_REGNO, swf_off(r2) + 4);
2935 stxi_i(4, rn(rg1), rn(rg0));
2941 if (!jit_thumb_p() && jit_armv5e_p() && !(r2 & 1))
2944 rg1 = jit_get_reg(jit_class_gpr);
2945 addr(rn(rg1), r0, r1);
2946 stxi_i(0, rn(rg1), r2);
2947 stxi_i(4, rn(rg1), r2 + 1);
2954 _swf_stxi_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2957 if (jit_fpr_p(r1)) {
2959 reg = jit_get_reg(jit_class_gpr);
2960 swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 8);
2961 stxi_i(i0, r0, rn(reg));
2969 _swf_stxi_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2971 jit_int32_t rg0, rg1;
2972 if (jit_fpr_p(r1)) {
2974 if (!jit_thumb_p() && jit_armv5e_p() &&
2975 ((i0 >= 0 && i0 <= 255) || (i0 < 0 && i0 >= -255)) &&
2976 (rg0 = jit_get_reg_pair()) != JIT_NOREG) {
2977 LDRDIN(rn(rg0), _FP_REGNO, swf_off(r1) + 8);
2978 if (i0 >= 0 && i0 <= 255)
2979 STRDI(rn(rg0), r0, i0);
2981 STRDIN(rn(rg0), r0, -i0);
2982 jit_unget_reg_pair(rg0);
2984 else if (i0 >= 0 && i0 + 4 <= 4095) {
2985 rg0 = jit_get_reg(jit_class_gpr);
2986 swf_ldrin(rn(rg0), _FP_REGNO, swf_off(r1) + 8);
2987 stxi_i(i0, r0, rn(rg0));
2988 swf_ldrin(rn(rg0), _FP_REGNO, swf_off(r1) + 4);
2989 stxi_i(i0 + 4, r0, rn(rg0));
2992 else if (i0 < 0 && ((jit_thumb_p() && i0 >= -255) ||
2993 (!jit_thumb_p() && i0 >= -4095))) {
2994 rg0 = jit_get_reg(jit_class_gpr);
2995 swf_ldrin(rn(rg0), _FP_REGNO, swf_off(r1) + 8);
2996 swf_strin(rn(rg0), r0, -i0);
2997 swf_ldrin(rn(rg0), _FP_REGNO, swf_off(r1) + 4);
2998 swf_strin(rn(rg0), r0, -(i0 + 4));
3002 rg1 = jit_get_reg(jit_class_gpr);
3003 addi(rn(rg1), r0, i0);
3004 rg0 = jit_get_reg(jit_class_gpr);
3005 swf_ldrin(rn(rg0), _FP_REGNO, swf_off(r1) + 8);
3006 stxi_i(0, rn(rg1), rn(rg0));
3007 swf_ldrin(rn(rg0), _FP_REGNO, swf_off(r1) + 4);
3008 stxi_i(4, rn(rg1), rn(rg0));
3014 if (!jit_thumb_p() && jit_armv5e_p() &&
3015 i0 >= 0 && i0 <= 255 && !(r1 & 1))
3017 else if (!jit_thumb_p() && jit_armv5e_p() &&
3018 i0 < 0 && i0 >= -255 && !(r1 & 1))
3019 STRDIN(r1, r0, -i0);
3020 else if (i0 >= 0 && i0 + 4 <= 4095) {
3022 stxi_i(i0 + 4, r0, r1 + 1);
3024 else if (i0 < 0 && ((jit_thumb_p() && i0 >= 255) ||
3025 (!jit_thumb_p() && i0 >= -4095))) {
3026 swf_strin(r1, r0, -i0);
3027 swf_strin(r1 + 1, r0, -(i0 + 4));
3030 rg1 = jit_get_reg(jit_class_gpr);
3031 addi(rn(rg1), r0, i0);
3032 stxi_i(0, rn(rg1), r1);
3033 stxi_i(4, rn(rg1), r1 + 1);
3040 _swf_vaarg_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
3044 assert(_jitc->function->self.call & jit_call_varargs);
3046 /* Adjust pointer. */
3047 reg = jit_get_reg(jit_class_gpr);
3048 andi(rn(reg), r1, 7);
3049 addr(r1, r1, rn(reg));
3052 /* Load argument. */
3055 /* Update stack pointer. */
3056 addi(r1, r1, sizeof(jit_float64_t));