1 /*
2 * Copyright (C) 2012-2019 Free Software Foundation, Inc.
3 *
4 * This file is part of GNU lightning.
5 *
6 * GNU lightning is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU Lesser General Public License as published
8 * by the Free Software Foundation; either version 3, or (at your option)
9 * any later version.
10 *
11 * GNU lightning is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
14 * License for more details.
15 *
16 * Authors:
17 * Paulo Cesar Pereira de Andrade
18 */
19
20 #if PROTO
21 /* 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)
52 static void
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)
55 static void
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_movr_d(r0,r1) _swf_movr_d(_jit,r0,r1)
132 static void _swf_movr_d(jit_state_t*,jit_int32_t,jit_int32_t);
133 # define swf_movi_f(r0,i0) _swf_movi_f(_jit,r0,i0)
134 static void _swf_movi_f(jit_state_t*,jit_int32_t,jit_float32_t);
135 # define swf_movi_d(r0,i0) _swf_movi_d(_jit,r0,i0)
136 static void _swf_movi_d(jit_state_t*,jit_int32_t,jit_float64_t);
137 # define swf_absr_f(r0,r1) _swf_absr_f(_jit,r0,r1)
138 static void _swf_absr_f(jit_state_t*,jit_int32_t,jit_int32_t);
139 # define swf_absr_d(r0,r1) _swf_absr_d(_jit,r0,r1)
140 static void _swf_absr_d(jit_state_t*,jit_int32_t,jit_int32_t);
141 # define swf_negr_f(r0,r1) _swf_negr_f(_jit,r0,r1)
142 static void _swf_negr_f(jit_state_t*,jit_int32_t,jit_int32_t);
143 # define swf_negr_d(r0,r1) _swf_negr_d(_jit,r0,r1)
144 static void _swf_negr_d(jit_state_t*,jit_int32_t,jit_int32_t);
145 # define swf_sqrtr_f(r0,r1) swf_ff(sqrtf,r0,r1)
146 # define swf_sqrtr_d(r0,r1) swf_dd(sqrt,r0,r1)
147 # define swf_addr_f(r0,r1,r2) swf_fff(__addsf3,r0,r1,r2)
148 # define swf_addi_f(r0,r1,i0) swf_fff_(__addsf3,r0,r1,i0)
149 # define swf_addr_d(r0,r1,r2) swf_ddd(__adddf3,r0,r1,r2)
150 # define swf_addi_d(r0,r1,i0) swf_ddd_(__adddf3,r0,r1,i0)
151 # define swf_subr_f(r0,r1,r2) swf_fff(__aeabi_fsub,r0,r1,r2)
152 # define swf_subi_f(r0,r1,i0) swf_fff_(__aeabi_fsub,r0,r1,i0)
153 # define swf_subr_d(r0,r1,r2) swf_ddd(__aeabi_dsub,r0,r1,r2)
154 # define swf_subi_d(r0,r1,i0) swf_ddd_(__aeabi_dsub,r0,r1,i0)
155 # define swf_rsbr_f(r0, r1, r2) swf_subr_f(r0, r2, r1)
156 # define swf_rsbi_f(r0, r1, i0) _swf_rsbi_f(_jit, r0, r1, i0)
157 static void _swf_rsbi_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t);
158 # define swf_rsbr_d(r0, r1, r2) swf_subr_d(r0, r2, r1)
159 # define swf_rsbi_d(r0, r1, i0) _swf_rsbi_d(_jit, r0, r1, i0)
160 static void _swf_rsbi_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t);
161 # define swf_mulr_f(r0,r1,r2) swf_fff(__aeabi_fmul,r0,r1,r2)
162 # define swf_muli_f(r0,r1,i0) swf_fff_(__aeabi_fmul,r0,r1,i0)
163 # define swf_mulr_d(r0,r1,r2) swf_ddd(__aeabi_dmul,r0,r1,r2)
164 # define swf_muli_d(r0,r1,i0) swf_ddd_(__aeabi_dmul,r0,r1,i0)
165 # define swf_divr_f(r0,r1,r2) swf_fff(__aeabi_fdiv,r0,r1,r2)
166 # define swf_divi_f(r0,r1,i0) swf_fff_(__aeabi_fdiv,r0,r1,i0)
167 # define swf_divr_d(r0,r1,r2) swf_ddd(__aeabi_ddiv,r0,r1,r2)
168 # define swf_divi_d(r0,r1,i0) swf_ddd_(__aeabi_ddiv,r0,r1,i0)
169 # define swf_ltr_f(r0,r1,r2) swf_iff(__aeabi_fcmplt,r0,r1,r2)
170 # define swf_lti_f(r0,r1,i0) swf_iff_(__aeabi_fcmplt,r0,r1,i0)
171 # define swf_ltr_d(r0,r1,r2) swf_idd(__aeabi_dcmplt,r0,r1,r2)
172 # define swf_lti_d(r0,r1,i0) swf_idd_(__aeabi_dcmplt,r0,r1,i0)
173 # define swf_ler_f(r0,r1,r2) swf_iff(__aeabi_fcmple,r0,r1,r2)
174 # define swf_lei_f(r0,r1,i0) swf_iff_(__aeabi_fcmple,r0,r1,i0)
175 # define swf_ler_d(r0,r1,r2) swf_idd(__aeabi_dcmple,r0,r1,r2)
176 # define swf_lei_d(r0,r1,i0) swf_idd_(__aeabi_dcmple,r0,r1,i0)
177 # define swf_eqr_f(r0,r1,r2) swf_iff(__aeabi_fcmpeq,r0,r1,r2)
178 # define swf_eqi_f(r0,r1,i0) swf_iff_(__aeabi_fcmpeq,r0,r1,i0)
179 # define swf_eqr_d(r0,r1,r2) swf_idd(__aeabi_dcmpeq,r0,r1,r2)
180 # define swf_eqi_d(r0,r1,i0) swf_idd_(__aeabi_dcmpeq,r0,r1,i0)
181 # define swf_ger_f(r0,r1,r2) swf_iff(__aeabi_fcmpge,r0,r1,r2)
182 # define swf_gei_f(r0,r1,i0) swf_iff_(__aeabi_fcmpge,r0,r1,i0)
183 # define swf_ger_d(r0,r1,r2) swf_idd(__aeabi_dcmpge,r0,r1,r2)
184 # define swf_gei_d(r0,r1,i0) swf_idd_(__aeabi_dcmpge,r0,r1,i0)
185 # define swf_gtr_f(r0,r1,r2) swf_iff(__aeabi_fcmpgt,r0,r1,r2)
186 # define swf_gti_f(r0,r1,i0) swf_iff_(__aeabi_fcmpgt,r0,r1,i0)
187 # define swf_gtr_d(r0,r1,r2) swf_idd(__aeabi_dcmpgt,r0,r1,r2)
188 # define swf_gti_d(r0,r1,i0) swf_idd_(__aeabi_dcmpgt,r0,r1,i0)
189 # define swf_ner_f(r0,r1,r2) _swf_ner_f(_jit,r0,r1,r2)
190 static void _swf_ner_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
191 # define swf_nei_f(r0,r1,i0) _swf_nei_f(_jit,r0,r1,i0)
192 static void _swf_nei_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t);
193 # define swf_ner_d(r0,r1,r2) _swf_ner_d(_jit,r0,r1,r2)
194 static void _swf_ner_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
195 # define swf_nei_d(r0,r1,i0) _swf_nei_d(_jit,r0,r1,i0)
196 static void _swf_nei_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t);
197 # define swf_unltr_f(r0,r1,r2) swf_iunff(__aeabi_fcmplt,r0,r1,r2)
198 # define swf_unlti_f(r0,r1,i0) swf_iunff_(__aeabi_fcmplt,r0,r1,i0)
199 # define swf_unltr_d(r0,r1,r2) swf_iundd(__aeabi_dcmplt,r0,r1,r2)
200 # define swf_unlti_d(r0,r1,i0) swf_iundd_(__aeabi_dcmplt,r0,r1,i0)
201 # define swf_unler_f(r0,r1,r2) swf_iunff(__aeabi_fcmple,r0,r1,r2)
202 # define swf_unlei_f(r0,r1,i0) swf_iunff_(__aeabi_fcmple,r0,r1,i0)
203 # define swf_unler_d(r0,r1,r2) swf_iundd(__aeabi_dcmple,r0,r1,r2)
204 # define swf_unlei_d(r0,r1,i0) swf_iundd_(__aeabi_dcmple,r0,r1,i0)
205 # define swf_uneqr_f(r0,r1,r2) swf_iunff(__aeabi_fcmpeq,r0,r1,r2)
206 # define swf_uneqi_f(r0,r1,i0) swf_iunff_(__aeabi_fcmpeq,r0,r1,i0)
207 # define swf_uneqr_d(r0,r1,r2) swf_iundd(__aeabi_dcmpeq,r0,r1,r2)
208 # define swf_uneqi_d(r0,r1,i0) swf_iundd_(__aeabi_dcmpeq,r0,r1,i0)
209 # define swf_unger_f(r0,r1,r2) swf_iunff(__aeabi_fcmpge,r0,r1,r2)
210 # define swf_ungei_f(r0,r1,i0) swf_iunff_(__aeabi_fcmpge,r0,r1,i0)
211 # define swf_unger_d(r0,r1,r2) swf_iundd(__aeabi_dcmpge,r0,r1,r2)
212 # define swf_ungei_d(r0,r1,i0) swf_iundd_(__aeabi_dcmpge,r0,r1,i0)
213 # define swf_ungtr_f(r0,r1,r2) swf_iunff(__aeabi_fcmpgt,r0,r1,r2)
214 # define swf_ungti_f(r0,r1,i0) swf_iunff_(__aeabi_fcmpgt,r0,r1,i0)
215 # define swf_ungtr_d(r0,r1,r2) swf_iundd(__aeabi_dcmpgt,r0,r1,r2)
216 # define swf_ungti_d(r0,r1,i0) swf_iundd_(__aeabi_dcmpgt,r0,r1,i0)
217 # define swf_ltgtr_f(r0,r1,r2) _swf_ltgtr_f(_jit,r0,r1,r2)
218 static void _swf_ltgtr_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
219 # define swf_ltgti_f(r0,r1,i0) _swf_ltgti_f(_jit,r0,r1,i0)
220 static void _swf_ltgti_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t);
221 # define swf_ltgtr_d(r0,r1,r2) _swf_ltgtr_d(_jit,r0,r1,r2)
222 static void _swf_ltgtr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
223 # define swf_ltgti_d(r0,r1,i0) _swf_ltgti_d(_jit,r0,r1,i0)
224 static void _swf_ltgti_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t);
225 # define swf_ordr_f(r0,r1,r2) _swf_ordr_f(_jit,r0,r1,r2)
226 static void _swf_ordr_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
227 # define swf_ordi_f(r0,r1,i0) _swf_ordi_f(_jit,r0,r1,i0)
228 static void _swf_ordi_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t);
229 # define swf_ordr_d(r0,r1,r2) _swf_ordr_d(_jit,r0,r1,r2)
230 static void _swf_ordr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
231 # define swf_ordi_d(r0,r1,i0) _swf_ordi_d(_jit,r0,r1,i0)
232 static void _swf_ordi_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t);
233 # define swf_unordr_f(r0,r1,r2) swf_iunff(__aeabi_fcmpun,r0,r1,r2)
234 # define swf_unordi_f(r0,r1,i0) swf_iunff_(__aeabi_fcmpun,r0,r1,i0)
235 # define swf_unordr_d(r0,r1,r2) swf_iundd(__aeabi_dcmpun,r0,r1,r2)
236 # define swf_unordi_d(r0,r1,i0) swf_iundd_(__aeabi_dcmpun,r0,r1,i0)
237 # define swf_bltr_f(i0,r0,r1) swf_bff(__aeabi_fcmplt,ARM_CC_NE,i0,r0,r1)
238 # define swf_blti_f(i0,r0,i1) swf_bff_(__aeabi_fcmplt,ARM_CC_NE,i0,r0,i1)
239 # define swf_bltr_d(i0,r0,r1) swf_bdd(__aeabi_dcmplt,ARM_CC_NE,i0,r0,r1)
240 # define swf_blti_d(i0,r0,i1) swf_bdd_(__aeabi_dcmplt,ARM_CC_NE,i0,r0,i1)
241 # define swf_bler_f(i0,r0,r1) swf_bff(__aeabi_fcmple,ARM_CC_NE,i0,r0,r1)
242 # define swf_blei_f(i0,r0,i1) swf_bff_(__aeabi_fcmple,ARM_CC_NE,i0,r0,i1)
243 # define swf_bler_d(i0,r0,r1) swf_bdd(__aeabi_dcmple,ARM_CC_NE,i0,r0,r1)
244 # define swf_blei_d(i0,r0,i1) swf_bdd_(__aeabi_dcmple,ARM_CC_NE,i0,r0,i1)
245 # define swf_beqr_f(i0,r0,r1) swf_bff(__aeabi_fcmpeq,ARM_CC_NE,i0,r0,r1)
246 # define swf_beqi_f(i0,r0,i1) swf_bff_(__aeabi_fcmpeq,ARM_CC_NE,i0,r0,i1)
247 # define swf_beqr_d(i0,r0,r1) swf_bdd(__aeabi_dcmpeq,ARM_CC_NE,i0,r0,r1)
248 # define swf_beqi_d(i0,r0,i1) swf_bdd_(__aeabi_dcmpeq,ARM_CC_NE,i0,r0,i1)
249 # define swf_bger_f(i0,r0,r1) swf_bff(__aeabi_fcmpge,ARM_CC_NE,i0,r0,r1)
250 # define swf_bgei_f(i0,r0,i1) swf_bff_(__aeabi_fcmpge,ARM_CC_NE,i0,r0,i1)
251 # define swf_bger_d(i0,r0,r1) swf_bdd(__aeabi_dcmpge,ARM_CC_NE,i0,r0,r1)
252 # define swf_bgei_d(i0,r0,i1) swf_bdd_(__aeabi_dcmpge,ARM_CC_NE,i0,r0,i1)
253 # define swf_bgtr_f(i0,r0,r1) swf_bff(__aeabi_fcmpgt,ARM_CC_NE,i0,r0,r1)
254 # define swf_bgti_f(i0,r0,i1) swf_bff_(__aeabi_fcmpgt,ARM_CC_NE,i0,r0,i1)
255 # define swf_bgtr_d(i0,r0,r1) swf_bdd(__aeabi_dcmpgt,ARM_CC_NE,i0,r0,r1)
256 # define swf_bgti_d(i0,r0,i1) swf_bdd_(__aeabi_dcmpgt,ARM_CC_NE,i0,r0,i1)
257 # define swf_bner_f(i0,r0,r1) swf_bff(__aeabi_fcmpeq,ARM_CC_EQ,i0,r0,r1)
258 # define swf_bnei_f(i0,r0,i1) swf_bff_(__aeabi_fcmpeq,ARM_CC_EQ,i0,r0,i1)
259 # define swf_bner_d(i0,r0,r1) swf_bdd(__aeabi_dcmpeq,ARM_CC_EQ,i0,r0,r1)
260 # define swf_bnei_d(i0,r0,i1) swf_bdd_(__aeabi_dcmpeq,ARM_CC_EQ,i0,r0,i1)
261 # define swf_bunltr_f(i0,r0,r1) swf_bff(__aeabi_fcmpge,ARM_CC_EQ,i0,r0,r1)
262 # define swf_bunlti_f(i0,r0,i1) swf_bff_(__aeabi_fcmpge,ARM_CC_EQ,i0,r0,i1)
263 # define swf_bunltr_d(i0,r0,r1) swf_bdd(__aeabi_dcmpge,ARM_CC_EQ,i0,r0,r1)
264 # define swf_bunlti_d(i0,r0,i1) swf_bdd_(__aeabi_dcmpge,ARM_CC_EQ,i0,r0,i1)
265 # define swf_bunler_f(i0,r0,r1) swf_bff(__aeabi_fcmpgt,ARM_CC_EQ,i0,r0,r1)
266 # define swf_bunlei_f(i0,r0,i1) swf_bff_(__aeabi_fcmpgt,ARM_CC_EQ,i0,r0,i1)
267 # define swf_bunler_d(i0,r0,r1) swf_bdd(__aeabi_dcmpgt,ARM_CC_EQ,i0,r0,r1)
268 # define swf_bunlei_d(i0,r0,i1) swf_bdd_(__aeabi_dcmpgt,ARM_CC_EQ,i0,r0,i1)
269 # define swf_buneqr_f(i0,r0,r1) swf_bunff(1,i0,r0,r1)
270 # define swf_buneqi_f(i0,r0,i1) swf_bunff_(1,i0,r0,i1)
271 # define swf_buneqr_d(i0,r0,r1) swf_bundd(1,i0,r0,r1)
272 # define swf_buneqi_d(i0,r0,i1) swf_bundd_(1,i0,r0,i1)
273 # define swf_bunger_f(i0,r0,r1) swf_bff(__aeabi_fcmplt,ARM_CC_EQ,i0,r0,r1)
274 # define swf_bungei_f(i0,r0,i1) swf_bff_(__aeabi_fcmplt,ARM_CC_EQ,i0,r0,i1)
275 # define swf_bunger_d(i0,r0,r1) swf_bdd(__aeabi_dcmplt,ARM_CC_EQ,i0,r0,r1)
276 # define swf_bungei_d(i0,r0,i1) swf_bdd_(__aeabi_dcmplt,ARM_CC_EQ,i0,r0,i1)
277 # define swf_bungtr_f(i0,r0,r1) swf_bff(__aeabi_fcmple,ARM_CC_EQ,i0,r0,r1)
278 # define swf_bungti_f(i0,r0,i1) swf_bff_(__aeabi_fcmple,ARM_CC_EQ,i0,r0,i1)
279 # define swf_bungtr_d(i0,r0,r1) swf_bdd(__aeabi_dcmple,ARM_CC_EQ,i0,r0,r1)
280 # define swf_bungti_d(i0,r0,i1) swf_bdd_(__aeabi_dcmple,ARM_CC_EQ,i0,r0,i1)
281 # define swf_bltgtr_f(i0,r0,r1) swf_bunff(0,i0,r0,r1)
282 # define swf_bltgti_f(i0,r0,i1) swf_bunff_(0,i0,r0,i1)
283 # define swf_bltgtr_d(i0,r0,r1) swf_bundd(0,i0,r0,r1)
284 # define swf_bltgti_d(i0,r0,i1) swf_bundd_(0,i0,r0,i1)
285 # define swf_bordr_f(i0,r0,r1) swf_bff(__aeabi_fcmpun,ARM_CC_EQ,i0,r0,r1)
286 # define swf_bordi_f(i0,r0,i1) swf_bff_(__aeabi_fcmpun,ARM_CC_EQ,i0,r0,i1)
287 # define swf_bordr_d(i0,r0,r1) swf_bdd(__aeabi_dcmpun,ARM_CC_EQ,i0,r0,r1)
288 # define swf_bordi_d(i0,r0,i1) swf_bdd_(__aeabi_dcmpun,ARM_CC_EQ,i0,r0,i1)
289 # define swf_bunordr_f(i0,r0,r1) swf_bff(__aeabi_fcmpun,ARM_CC_NE,i0,r0,r1)
290 # define swf_bunordi_f(i0,r0,i1) swf_bff_(__aeabi_fcmpun,ARM_CC_NE,i0,r0,i1)
291 # define swf_bunordr_d(i0,r0,r1) swf_bdd(__aeabi_dcmpun,ARM_CC_NE,i0,r0,r1)
292 # define swf_bunordi_d(i0,r0,i1) swf_bdd_(__aeabi_dcmpun,ARM_CC_NE,i0,r0,i1)
293 # define swf_ldr_f(r0,r1) _swf_ldr_f(_jit,r0,r1)
294 static void _swf_ldr_f(jit_state_t*,jit_int32_t,jit_int32_t);
295 # define swf_ldr_d(r0,r1) _swf_ldr_d(_jit,r0,r1)
296 static void _swf_ldr_d(jit_state_t*,jit_int32_t,jit_int32_t);
297 # define swf_ldi_f(r0,i0) _swf_ldi_f(_jit,r0,i0)
298 static void _swf_ldi_f(jit_state_t*,jit_int32_t,jit_word_t);
299 # define swf_ldi_d(r0,i0) _swf_ldi_d(_jit,r0,i0)
300 static void _swf_ldi_d(jit_state_t*,jit_int32_t,jit_word_t);
301 # define swf_ldxr_f(r0,r1,r2) _swf_ldxr_f(_jit,r0,r1,r2)
302 static void _swf_ldxr_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
303 # define swf_ldxr_d(r0,r1,r2) _swf_ldxr_d(_jit,r0,r1,r2)
304 static void _swf_ldxr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
305 # define swf_ldxi_f(r0,r1,i0) _swf_ldxi_f(_jit,r0,r1,i0)
306 static void _swf_ldxi_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
307 # define swf_ldxi_d(r0,r1,i0) _swf_ldxi_d(_jit,r0,r1,i0)
308 static void _swf_ldxi_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
309 # define swf_str_f(r0,r1) _swf_str_f(_jit,r0,r1)
310 static void _swf_str_f(jit_state_t*,jit_int32_t,jit_int32_t);
311 # define swf_str_d(r0,r1) _swf_str_d(_jit,r0,r1)
312 static void _swf_str_d(jit_state_t*,jit_int32_t,jit_int32_t);
313 # define swf_sti_f(r0,i0) _swf_sti_f(_jit,r0,i0)
314 static void _swf_sti_f(jit_state_t*,jit_word_t,jit_int32_t);
315 # define swf_sti_d(r0,i0) _swf_sti_d(_jit,r0,i0)
316 static void _swf_sti_d(jit_state_t*,jit_word_t,jit_int32_t);
317 # define swf_stxr_f(r0,r1,r2) _swf_stxr_f(_jit,r0,r1,r2)
318 static void _swf_stxr_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
319 # define swf_stxr_d(r0,r1,r2) _swf_stxr_d(_jit,r0,r1,r2)
320 static void _swf_stxr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
321 # define swf_stxi_f(r0,r1,i0) _swf_stxi_f(_jit,r0,r1,i0)
322 static void _swf_stxi_f(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
323 # define swf_stxi_d(r0,r1,i0) _swf_stxi_d(_jit,r0,r1,i0)
324 static void _swf_stxi_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
325 # define swf_vaarg_d(r0, r1) _swf_vaarg_d(_jit, r0, r1)
326 static void _swf_vaarg_d(jit_state_t*, jit_int32_t, jit_int32_t);
327 #endif
328
329 #if CODE
330 #define swf_off(rn) ((rn - 16) << 2)
331
332 #define swf_call(function, label, regno) \
333 do { \
334 jit_word_t d; \
335 if (!jit_exchange_p()) { \
336 if (jit_thumb_p()) \
337 d = (((jit_word_t)function - _jit->pc.w) >> 1) - 2; \
338 else \
339 d = (((jit_word_t)function - _jit->pc.w) >> 2) - 2; \
340 if (_s24P(d)) { \
341 if (jit_thumb_p()) \
342 T2_BLI(encode_thumb_jump(d)); \
343 else \
344 BLI(d & 0x00ffffff); \
345 } \
346 else \
347 goto label; \
348 } \
349 else { \
350 label: \
351 movi(regno, (jit_word_t)function); \
352 if (jit_thumb_p()) \
353 T1_BLX(regno); \
354 else \
355 BLX(regno); \
356 } \
357 } while (0)
358 #define swf_call_with_get_reg(function, label) \
359 do { \
360 jit_word_t d; \
361 jit_int32_t reg; \
362 if (!jit_exchange_p()) { \
363 if (jit_thumb_p()) \
364 d = (((jit_word_t)function - _jit->pc.w) >> 1) - 2; \
365 else \
366 d = (((jit_word_t)function - _jit->pc.w) >> 2) - 2; \
367 if (_s24P(d)) { \
368 if (jit_thumb_p()) \
369 T2_BLI(encode_thumb_jump(d)); \
370 else \
371 BLI(d & 0x00ffffff); \
372 } \
373 else \
374 goto label; \
375 } \
376 else { \
377 label: \
378 reg = jit_get_reg(jit_class_gpr); \
379 movi(rn(reg), (jit_word_t)function); \
380 if (jit_thumb_p()) \
381 T1_BLX(rn(reg)); \
382 else \
383 BLX(rn(reg)); \
384 jit_unget_reg(reg); \
385 } \
386 } while (0)
387 #define swf_ldrin(rt, rn, im) \
388 do { \
389 if (jit_thumb_p()) T2_LDRIN(rt, rn, im); \
390 else LDRIN(rt, rn, im); \
391 } while (0)
392 #define swf_strin(rt, rn, im) \
393 do { \
394 if (jit_thumb_p()) T2_STRIN(rt, rn, im); \
395 else STRIN(rt, rn, im); \
396 } while (0)
397 #define swf_bici(rt, rn, im) \
398 do { \
399 if (jit_thumb_p()) \
400 T2_BICI(rt, rn, encode_thumb_immediate(im)); \
401 else \
402 BICI(rt, rn, encode_arm_immediate(im)); \
403 } while (0)
404
405 #if !defined(__GNUC__)
__addsf3(float u,float v)406 float __addsf3(float u, float v)
407 {
408 return (u + v);
409 }
410
411 double
__adddf3(double u,double v)412 __adddf3(double u, double v)
413 {
414 return (u + v);
415 }
416
417 float
__aeabi_fsub(float u,float v)418 __aeabi_fsub(float u, float v)
419 {
420 return (u - v);
421 }
422
423 double
__aeabi_dsub(double u,double v)424 __aeabi_dsub(double u, double v)
425 {
426 return (u - v);
427 }
428
429 float
__aeabi_fmul(float u,float v)430 __aeabi_fmul(float u, float v)
431 {
432 return (u * v);
433 }
434
435 double
__aeabi_dmul(double u,double v)436 __aeabi_dmul(double u, double v)
437 {
438 return (u * v);
439 }
440
441 float
__aeabi_fdiv(float u,float v)442 __aeabi_fdiv(float u, float v)
443 {
444 return (u / v);
445 }
446
447 double
__aeabi_ddiv(double u,double v)448 __aeabi_ddiv(double u, double v)
449 {
450 return (u / v);
451 }
452
453 float
__aeabi_i2f(int u)454 __aeabi_i2f(int u)
455 {
456 return (u);
457 }
458
459 double
__aeabi_i2d(int u)460 __aeabi_i2d(int u)
461 {
462 return (u);
463 }
464
465 float
__aeabi_d2f(double u)466 __aeabi_d2f(double u)
467 {
468 return (u);
469 }
470
471 double
__aeabi_f2d(float u)472 __aeabi_f2d(float u)
473 {
474 return (u);
475 }
476
477 extern int
__aeabi_f2iz(float u)478 __aeabi_f2iz(float u)
479 {
480 return (u);
481 }
482
483 int
__aeabi_d2iz(double u)484 __aeabi_d2iz(double u)
485 {
486 return (u);
487 }
488
489 int
__aeabi_fcmplt(float u,float v)490 __aeabi_fcmplt(float u, float v)
491 {
492 return (u < v);
493 }
494
495 int
__aeabi_dcmplt(double u,double v)496 __aeabi_dcmplt(double u, double v)
497 {
498 return (u < v);
499 }
500
501 int
__aeabi_fcmple(float u,float v)502 __aeabi_fcmple(float u, float v)
503 {
504 return (u <= v);
505 }
506
507 int
__aeabi_dcmple(double u,double v)508 __aeabi_dcmple(double u, double v)
509 {
510 return (u <= v);
511 }
512
513 int
__aeabi_fcmpeq(float u,float v)514 __aeabi_fcmpeq(float u, float v)
515 {
516 return (u == v);
517 }
518
519 int
__aeabi_dcmpeq(double u,double v)520 __aeabi_dcmpeq(double u, double v)
521 {
522 return (u == v);
523 }
524
525 int
__aeabi_fcmpge(float u,float v)526 __aeabi_fcmpge(float u, float v)
527 {
528 return (u >= v);
529 }
530
531 int
__aeabi_dcmpge(double u,double v)532 __aeabi_dcmpge(double u, double v)
533 {
534 return (u >= v);
535 }
536
537 int
__aeabi_fcmpgt(float u,float v)538 __aeabi_fcmpgt(float u, float v)
539 {
540 return (u > v);
541 }
542
543 int
__aeabi_dcmpgt(double u,double v)544 __aeabi_dcmpgt(double u, double v)
545 {
546 return (u > v);
547 }
548
549 int
__aeabi_fcmpun(float u,float v)550 __aeabi_fcmpun(float u, float v)
551 {
552 return ((u != u) || (v != v));
553 }
554
555 int
__aeabi_dcmpun(double u,double v)556 __aeabi_dcmpun(double u, double v)
557 {
558 return ((u != u) || (v != v));
559 }
560 #endif
561
562 static void
_swf_ff(jit_state_t * _jit,float (* i0)(float),jit_int32_t r0,jit_int32_t r1)563 _swf_ff(jit_state_t *_jit, float(*i0)(float),
564 jit_int32_t r0, jit_int32_t r1)
565 {
566 jit_get_reg_args();
567 if (jit_fpr_p(r1))
568 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
569 else
570 movr(_R0_REGNO, r1);
571 swf_call(i0, fallback, _R1_REGNO);
572 if (jit_fpr_p(r0))
573 swf_strin(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
574 else
575 movr(r0, _R0_REGNO);
576 jit_unget_reg_args();
577 }
578
579 static void
_swf_dd(jit_state_t * _jit,double (* i0)(double),jit_int32_t r0,jit_int32_t r1)580 _swf_dd(jit_state_t *_jit, double (*i0)(double),
581 jit_int32_t r0, jit_int32_t r1)
582 {
583 jit_get_reg_args();
584 if (jit_fpr_p(r1)) {
585 if (!jit_thumb_p() && jit_armv5e_p())
586 LDRDIN(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
587 else {
588 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
589 swf_ldrin(_R1_REGNO, _FP_REGNO, swf_off(r1) + 4);
590 }
591 }
592 else {
593 movr(_R0_REGNO, r1);
594 movr(_R1_REGNO, r1 + 1);
595 }
596 swf_call(i0, fallback, _R2_REGNO);
597 if (jit_fpr_p(r0)) {
598 if (!jit_thumb_p() && jit_armv5e_p())
599 STRDIN(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
600 else {
601 swf_strin(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
602 swf_strin(_R1_REGNO, _FP_REGNO, swf_off(r0) + 4);
603 }
604 }
605 else {
606 movr(r0, _R0_REGNO);
607 movr(r0 + 1, _R1_REGNO);
608 }
609 jit_unget_reg_args();
610 }
611
612 static void
_swf_fff(jit_state_t * _jit,float (* i0)(float,float),jit_int32_t r0,jit_int32_t r1,jit_int32_t r2)613 _swf_fff(jit_state_t *_jit, float (*i0)(float, float),
614 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
615 {
616 jit_get_reg_args();
617 if (jit_fpr_p(r1))
618 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
619 else
620 movr(_R0_REGNO, r1);
621 if (jit_fpr_p(r2))
622 swf_ldrin(_R1_REGNO, _FP_REGNO, swf_off(r2) + 8);
623 else
624 movr(_R1_REGNO, r1);
625 swf_call(i0, fallback, _R3_REGNO);
626 if (jit_fpr_p(r0))
627 swf_strin(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
628 else
629 movr(r0, _R0_REGNO);
630 jit_unget_reg_args();
631 }
632
633 static void
_swf_ddd(jit_state_t * _jit,double (* i0)(double,double),jit_int32_t r0,jit_int32_t r1,jit_int32_t r2)634 _swf_ddd(jit_state_t *_jit, double (*i0)(double, double),
635 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
636 {
637 jit_get_reg_args();
638 if (jit_fpr_p(r1)) {
639 if (!jit_thumb_p() && jit_armv5e_p())
640 LDRDIN(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
641 else {
642 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
643 swf_ldrin(_R1_REGNO, _FP_REGNO, swf_off(r1) + 4);
644 }
645 }
646 else {
647 movr(_R0_REGNO, r1);
648 movr(_R1_REGNO, r1 + 1);
649 }
650 if (jit_fpr_p(r2)) {
651 if (!jit_thumb_p() && jit_armv5e_p())
652 LDRDIN(_R2_REGNO, _FP_REGNO, swf_off(r2) + 8);
653 else {
654 swf_ldrin(_R2_REGNO, _FP_REGNO, swf_off(r2) + 8);
655 swf_ldrin(_R3_REGNO, _FP_REGNO, swf_off(r2) + 4);
656 }
657 }
658 else {
659 movr(_R2_REGNO, r2);
660 movr(_R3_REGNO, r2 + 1);
661 }
662 swf_call_with_get_reg(i0, fallback);
663 if (jit_fpr_p(r0)) {
664 if (!jit_thumb_p() && jit_armv5e_p())
665 STRDIN(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
666 else {
667 swf_strin(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
668 swf_strin(_R1_REGNO, _FP_REGNO, swf_off(r0) + 4);
669 }
670 }
671 else {
672 movr(r0, _R0_REGNO);
673 movr(r0 + 1, _R1_REGNO);
674 }
675 jit_unget_reg_args();
676 }
677
678 static void
_swf_fff_(jit_state_t * _jit,float (* i0)(float,float),jit_int32_t r0,jit_int32_t r1,jit_float32_t i1)679 _swf_fff_(jit_state_t *_jit, float (*i0)(float, float),
680 jit_int32_t r0, jit_int32_t r1, jit_float32_t i1)
681 {
682 union {
683 jit_int32_t i;
684 jit_float32_t f;
685 } data;
686 jit_get_reg_args();
687 data.f = i1;
688 if (jit_fpr_p(r1))
689 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
690 else
691 movr(_R0_REGNO, r1);
692 movi(_R1_REGNO, data.i);
693 swf_call(i0, fallback, _R3_REGNO);
694 if (jit_fpr_p(r0))
695 swf_strin(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
696 else
697 movr(r0, _R0_REGNO);
698 jit_unget_reg_args();
699 }
700
701 static void
_swf_rsbi_f(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_float32_t i0)702 _swf_rsbi_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_float32_t i0)
703 {
704 union {
705 jit_int32_t i;
706 jit_float32_t f;
707 } data;
708 jit_get_reg_args();
709 data.f = i0;
710 movi(_R0_REGNO, data.i);
711 if (jit_fpr_p(r1))
712 swf_ldrin(_R1_REGNO, _FP_REGNO, swf_off(r1) + 8);
713 else
714 movr(_R1_REGNO, r1);
715 swf_call(__aeabi_fsub, fallback, _R3_REGNO);
716 if (jit_fpr_p(r0))
717 swf_strin(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
718 else
719 movr(r0, _R0_REGNO);
720 jit_unget_reg_args();
721 }
722
723 static void
_swf_ddd_(jit_state_t * _jit,double (* i0)(double,double),jit_int32_t r0,jit_int32_t r1,jit_float64_t i1)724 _swf_ddd_(jit_state_t *_jit, double (*i0)(double, double),
725 jit_int32_t r0, jit_int32_t r1, jit_float64_t i1)
726 {
727 union {
728 jit_int32_t i[2];
729 jit_float64_t d;
730 } data;
731 jit_get_reg_args();
732
733 data.d = i1;
734 if (jit_fpr_p(r1)) {
735 if (!jit_thumb_p() && jit_armv5e_p())
736 LDRDIN(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
737 else {
738 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
739 swf_ldrin(_R1_REGNO, _FP_REGNO, swf_off(r1) + 4);
740 }
741 }
742 else {
743 movr(_R0_REGNO, r1);
744 movr(_R1_REGNO, r1 + 1);
745 }
746 movi(_R2_REGNO, data.i[0]);
747 movi(_R3_REGNO, data.i[1]);
748 swf_call_with_get_reg(i0, fallback);
749 if (jit_fpr_p(r0)) {
750 if (!jit_thumb_p() && jit_armv5e_p())
751 STRDIN(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
752 else {
753 swf_strin(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
754 swf_strin(_R1_REGNO, _FP_REGNO, swf_off(r0) + 4);
755 }
756 }
757 else {
758 movr(r0, _R0_REGNO);
759 movr(r0 + 1, _R1_REGNO);
760 }
761 jit_unget_reg_args();
762 }
763
764 static void
_swf_rsbi_d(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_float64_t i0)765 _swf_rsbi_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_float64_t i0)
766 {
767 union {
768 jit_int32_t i[2];
769 jit_float64_t d;
770 } data;
771 jit_get_reg_args();
772 data.d = i0;
773 movi(_R0_REGNO, data.i[0]);
774 movi(_R1_REGNO, data.i[1]);
775 if (jit_fpr_p(r1)) {
776 if (!jit_thumb_p() && jit_armv5e_p())
777 LDRDIN(_R2_REGNO, _FP_REGNO, swf_off(r1) + 8);
778 else {
779 swf_ldrin(_R2_REGNO, _FP_REGNO, swf_off(r1) + 8);
780 swf_ldrin(_R3_REGNO, _FP_REGNO, swf_off(r1) + 4);
781 }
782 }
783 else {
784 movr(_R2_REGNO, r1);
785 movr(_R3_REGNO, r1 + 1);
786 }
787 swf_call_with_get_reg(__aeabi_dsub, fallback);
788 if (jit_fpr_p(r0)) {
789 if (!jit_thumb_p() && jit_armv5e_p())
790 STRDIN(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
791 else {
792 swf_strin(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
793 swf_strin(_R1_REGNO, _FP_REGNO, swf_off(r0) + 4);
794 }
795 }
796 else {
797 movr(r0, _R0_REGNO);
798 movr(r0 + 1, _R1_REGNO);
799 }
800 jit_unget_reg_args();
801 }
802
803 static void
_swf_iff(jit_state_t * _jit,int (* i0)(float,float),jit_int32_t r0,jit_int32_t r1,jit_int32_t r2)804 _swf_iff(jit_state_t *_jit, int (*i0)(float, float),
805 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
806 {
807 jit_get_reg_args();
808 if (jit_fpr_p(r1))
809 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
810 else
811 movr(_R0_REGNO, r1);
812 if (jit_fpr_p(r2))
813 swf_ldrin(_R1_REGNO, _FP_REGNO, swf_off(r2) + 8);
814 else
815 movr(_R1_REGNO, r2);
816 swf_call(i0, fallback, _R2_REGNO);
817 movr(r0, _R0_REGNO);
818 jit_unget_reg_args();
819 }
820
821 static void
_swf_idd(jit_state_t * _jit,int (* i0)(double,double),jit_int32_t r0,jit_int32_t r1,jit_int32_t r2)822 _swf_idd(jit_state_t *_jit, int (*i0)(double, double),
823 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
824 {
825 jit_get_reg_args();
826 if (jit_fpr_p(r1)) {
827 if (!jit_thumb_p() && jit_armv5e_p())
828 LDRDIN(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
829 else {
830 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
831 swf_ldrin(_R1_REGNO, _FP_REGNO, swf_off(r1) + 4);
832 }
833 }
834 else {
835 movr(_R0_REGNO, r1);
836 movr(_R1_REGNO, r1 + 1);
837 }
838 if (jit_fpr_p(r2)) {
839 if (!jit_thumb_p() && jit_armv5e_p())
840 LDRDIN(_R2_REGNO, _FP_REGNO, swf_off(r2) + 8);
841 else {
842 swf_ldrin(_R2_REGNO, _FP_REGNO, swf_off(r2) + 8);
843 swf_ldrin(_R3_REGNO, _FP_REGNO, swf_off(r2) + 4);
844 }
845 }
846 else {
847 movr(_R2_REGNO, r2);
848 movr(_R3_REGNO, r2 + 1);
849 }
850 swf_call_with_get_reg(i0, fallback);
851 movr(r0, _R0_REGNO);
852 jit_unget_reg_args();
853 }
854
855 static void
_swf_iff_(jit_state_t * _jit,int (* i0)(float,float),jit_int32_t r0,jit_int32_t r1,jit_float32_t i1)856 _swf_iff_(jit_state_t *_jit, int (*i0)(float, float),
857 jit_int32_t r0, jit_int32_t r1, jit_float32_t i1)
858 {
859 union {
860 jit_int32_t i;
861 jit_float32_t f;
862 } data;
863 jit_get_reg_args();
864 data.f = i1;
865 if (jit_fpr_p(r1))
866 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
867 else
868 movr(_R0_REGNO, r1);
869 movi(_R1_REGNO, data.i);
870 swf_call(i0, fallback, _R2_REGNO);
871 movr(r0, _R0_REGNO);
872 jit_unget_reg_args();
873 }
874
875 static void
_swf_idd_(jit_state_t * _jit,int (* i0)(double,double),jit_int32_t r0,jit_int32_t r1,jit_float64_t i1)876 _swf_idd_(jit_state_t *_jit, int (*i0)(double, double),
877 jit_int32_t r0, jit_int32_t r1, jit_float64_t i1)
878 {
879 union {
880 jit_int32_t i[2];
881 jit_float64_t d;
882 } data;
883 jit_get_reg_args();
884 data.d = i1;
885 if (jit_fpr_p(r1)) {
886 if (!jit_thumb_p() && jit_armv5e_p())
887 LDRDIN(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
888 else {
889 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
890 swf_ldrin(_R1_REGNO, _FP_REGNO, swf_off(r1) + 4);
891 }
892 }
893 else {
894 movr(_R0_REGNO, r1);
895 movr(_R1_REGNO, r1 + 1);
896 }
897 movi(_R2_REGNO, data.i[0]);
898 movi(_R3_REGNO, data.i[1]);
899 swf_call_with_get_reg(i0, fallback);
900 movr(r0, _R0_REGNO);
901 jit_unget_reg_args();
902 }
903
904 static void
_swf_iunff(jit_state_t * _jit,int (* i0)(float,float),jit_int32_t r0,jit_int32_t r1,jit_int32_t r2)905 _swf_iunff(jit_state_t *_jit, int (*i0)(float, float),
906 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
907 {
908 jit_word_t instr;
909 jit_get_reg_args();
910 if (jit_fpr_p(r1))
911 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
912 else
913 movr(_R0_REGNO, r1);
914 if (jit_fpr_p(r2))
915 swf_ldrin(_R1_REGNO, _FP_REGNO, swf_off(r2) + 8);
916 else
917 movr(_R1_REGNO, r2);
918 swf_call(__aeabi_fcmpun, fcmpun, _R2_REGNO);
919 if (jit_thumb_p()) {
920 T1_CMPI(_R0_REGNO, 0);
921 IT(ARM_CC_NE);
922 if (r0 < 8)
923 T1_MOVI(r0, 1);
924 else
925 T2_MOVI(r0, 1);
926 instr = _jit->pc.w;
927 T2_CC_B(ARM_CC_NE, 0);
928 }
929 else {
930 CMPI(_R0_REGNO, 0);
931 CC_MOVI(ARM_CC_NE, r0, 1);
932 instr = _jit->pc.w;
933 CC_B(ARM_CC_NE, 0);
934 }
935 if (jit_fpr_p(r1))
936 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
937 else
938 movr(_R0_REGNO, r1);
939 if (jit_fpr_p(r2))
940 swf_ldrin(_R1_REGNO, _FP_REGNO, swf_off(r2) + 8);
941 else
942 movr(_R1_REGNO, r2);
943 swf_call(i0, fallback, _R2_REGNO);
944 movr(r0, _R0_REGNO);
945 patch_at(arm_patch_jump, instr, _jit->pc.w);
946 jit_unget_reg_args();
947 }
948
949 static void
_swf_iundd(jit_state_t * _jit,int (* i0)(double,double),jit_int32_t r0,jit_int32_t r1,jit_int32_t r2)950 _swf_iundd(jit_state_t *_jit, int (*i0)(double, double),
951 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
952 {
953 jit_word_t instr;
954 jit_get_reg_args();
955 if (jit_fpr_p(r1)) {
956 if (!jit_thumb_p() && jit_armv5e_p())
957 LDRDIN(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
958 else {
959 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
960 swf_ldrin(_R1_REGNO, _FP_REGNO, swf_off(r1) + 4);
961 }
962 }
963 else {
964 movr(_R0_REGNO, r1);
965 movr(_R1_REGNO, r1 + 1);
966 }
967 if (jit_fpr_p(r2)) {
968 if (!jit_thumb_p() && jit_armv5e_p())
969 LDRDIN(_R2_REGNO, _FP_REGNO, swf_off(r2) + 8);
970 else {
971 swf_ldrin(_R2_REGNO, _FP_REGNO, swf_off(r2) + 8);
972 swf_ldrin(_R3_REGNO, _FP_REGNO, swf_off(r2) + 4);
973 }
974 }
975 else {
976 movr(_R2_REGNO, r2);
977 movr(_R3_REGNO, r2 + 1);
978 }
979 swf_call_with_get_reg(__aeabi_dcmpun, dcmpun);
980 if (jit_thumb_p()) {
981 T1_CMPI(_R0_REGNO, 0);
982 IT(ARM_CC_NE);
983 if (r0 < 8)
984 T1_MOVI(r0, 1);
985 else
986 T2_MOVI(r0, 1);
987 instr = _jit->pc.w;
988 T2_CC_B(ARM_CC_NE, 0);
989 }
990 else {
991 CMPI(_R0_REGNO, 0);
992 CC_MOVI(ARM_CC_NE, r0, 1);
993 instr = _jit->pc.w;
994 CC_B(ARM_CC_NE, 0);
995 }
996 if (jit_fpr_p(r1)) {
997 if (!jit_thumb_p() && jit_armv5e_p())
998 LDRDIN(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
999 else {
1000 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
1001 swf_ldrin(_R1_REGNO, _FP_REGNO, swf_off(r1) + 4);
1002 }
1003 }
1004 else {
1005 movr(_R0_REGNO, r1);
1006 movr(_R1_REGNO, r1 + 1);
1007 }
1008 if (jit_fpr_p(r2)) {
1009 if (!jit_thumb_p() && jit_armv5e_p())
1010 LDRDIN(_R2_REGNO, _FP_REGNO, swf_off(r2) + 8);
1011 else {
1012 swf_ldrin(_R2_REGNO, _FP_REGNO, swf_off(r2) + 8);
1013 swf_ldrin(_R3_REGNO, _FP_REGNO, swf_off(r2) + 4);
1014 }
1015 }
1016 else {
1017 movr(_R2_REGNO, r2);
1018 movr(_R3_REGNO, r2 + 1);
1019 }
1020 swf_call_with_get_reg(i0, fallback);
1021 movr(r0, _R0_REGNO);
1022 patch_at(arm_patch_jump, instr, _jit->pc.w);
1023 jit_unget_reg_args();
1024 }
1025
1026 static void
_swf_iunff_(jit_state_t * _jit,int (* i0)(float,float),jit_int32_t r0,jit_int32_t r1,jit_float32_t i1)1027 _swf_iunff_(jit_state_t *_jit, int (*i0)(float, float),
1028 jit_int32_t r0, jit_int32_t r1, jit_float32_t i1)
1029 {
1030 jit_word_t instr;
1031 union {
1032 jit_int32_t i;
1033 jit_float32_t f;
1034 } data;
1035 jit_get_reg_args();
1036 data.f = i1;
1037 if (jit_fpr_p(r1))
1038 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
1039 else
1040 movr(_R0_REGNO, r1);
1041 movi(_R1_REGNO, data.i);
1042 swf_call(__aeabi_fcmpun, fcmpun, _R2_REGNO);
1043 if (jit_thumb_p()) {
1044 T1_CMPI(_R0_REGNO, 0);
1045 IT(ARM_CC_NE);
1046 if (r0 < 8)
1047 T1_MOVI(r0, 1);
1048 else
1049 T2_MOVI(r0, 1);
1050 instr = _jit->pc.w;
1051 T2_CC_B(ARM_CC_NE, 0);
1052 }
1053 else {
1054 CMPI(_R0_REGNO, 0);
1055 CC_MOVI(ARM_CC_NE, r0, 1);
1056 instr = _jit->pc.w;
1057 CC_B(ARM_CC_NE, 0);
1058 }
1059 if (jit_fpr_p(r1))
1060 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
1061 else
1062 movr(_R0_REGNO, r1);
1063 movi(_R1_REGNO, data.i);
1064 swf_call(i0, fallback, _R2_REGNO);
1065 movr(r0, _R0_REGNO);
1066 patch_at(arm_patch_jump, instr, _jit->pc.w);
1067 jit_unget_reg_args();
1068 }
1069
1070 static void
_swf_iundd_(jit_state_t * _jit,int (* i0)(double,double),jit_int32_t r0,jit_int32_t r1,jit_float64_t i1)1071 _swf_iundd_(jit_state_t *_jit, int (*i0)(double, double),
1072 jit_int32_t r0, jit_int32_t r1, jit_float64_t i1)
1073 {
1074 jit_word_t instr;
1075 union {
1076 jit_int32_t i[2];
1077 jit_float64_t d;
1078 } data;
1079 jit_get_reg_args();
1080 data.d = i1;
1081 if (jit_fpr_p(r1)) {
1082 if (!jit_thumb_p() && jit_armv5e_p())
1083 LDRDIN(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
1084 else {
1085 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
1086 swf_ldrin(_R1_REGNO, _FP_REGNO, swf_off(r1) + 4);
1087 }
1088 }
1089 else {
1090 movr(_R0_REGNO, r1);
1091 movr(_R1_REGNO, r1 + 1);
1092 }
1093 movi(_R2_REGNO, data.i[0]);
1094 movi(_R3_REGNO, data.i[1]);
1095 swf_call_with_get_reg(__aeabi_dcmpun, dcmpun);
1096 if (jit_thumb_p()) {
1097 T1_CMPI(_R0_REGNO, 0);
1098 IT(ARM_CC_NE);
1099 if (r0 < 8)
1100 T1_MOVI(r0, 1);
1101 else
1102 T2_MOVI(r0, 1);
1103 instr = _jit->pc.w;
1104 T2_CC_B(ARM_CC_NE, 0);
1105 }
1106 else {
1107 CMPI(_R0_REGNO, 0);
1108 CC_MOVI(ARM_CC_NE, r0, 1);
1109 instr = _jit->pc.w;
1110 CC_B(ARM_CC_NE, 0);
1111 }
1112 if (jit_fpr_p(r1)) {
1113 if (!jit_thumb_p() && jit_armv5e_p())
1114 LDRDIN(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
1115 else {
1116 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
1117 swf_ldrin(_R1_REGNO, _FP_REGNO, swf_off(r1) + 4);
1118 }
1119 }
1120 else {
1121 movr(_R0_REGNO, r1);
1122 movr(_R1_REGNO, r1 + 1);
1123 }
1124 movi(_R2_REGNO, data.i[0]);
1125 movi(_R3_REGNO, data.i[1]);
1126 swf_call_with_get_reg(i0, fallback);
1127 movr(r0, _R0_REGNO);
1128 patch_at(arm_patch_jump, instr, _jit->pc.w);
1129 jit_unget_reg_args();
1130 }
1131
1132 static jit_word_t
_swf_bff(jit_state_t * _jit,int (* i0)(float,float),int cc,jit_word_t i1,jit_int32_t r0,jit_int32_t r1)1133 _swf_bff(jit_state_t *_jit, int (*i0)(float, float), int cc,
1134 jit_word_t i1, jit_int32_t r0, jit_int32_t r1)
1135 {
1136 jit_word_t w, d;
1137 jit_get_reg_args();
1138 if (jit_fpr_p(r0))
1139 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
1140 else
1141 movr(_R0_REGNO, r0);
1142 if (jit_fpr_p(r1))
1143 swf_ldrin(_R1_REGNO, _FP_REGNO, swf_off(r1) + 8);
1144 else
1145 movr(_R1_REGNO, r1);
1146 swf_call(i0, fallback, _R2_REGNO);
1147 if (jit_thumb_p()) {
1148 T1_CMPI(_R0_REGNO, 0);
1149 w = _jit->pc.w;
1150 d = ((i1 - w) >> 1) - 2;
1151 assert(_s20P(d));
1152 T2_CC_B(cc, encode_thumb_cc_jump(d));
1153 }
1154 else {
1155 CMPI(_R0_REGNO, 0);
1156 w = _jit->pc.w;
1157 d = ((i1 - w) >> 2) - 2;
1158 assert(_s24P(d));
1159 CC_B(cc, d & 0x00ffffff);
1160 }
1161 jit_unget_reg_args();
1162 return (w);
1163 }
1164
1165 static jit_word_t
_swf_bdd(jit_state_t * _jit,int (* i0)(double,double),int cc,jit_word_t i1,jit_int32_t r0,jit_int32_t r1)1166 _swf_bdd(jit_state_t *_jit, int (*i0)(double, double), int cc,
1167 jit_word_t i1, jit_int32_t r0, jit_int32_t r1)
1168 {
1169 jit_word_t w, d;
1170 jit_get_reg_args();
1171 if (jit_fpr_p(r0)) {
1172 if (!jit_thumb_p() && jit_armv5e_p())
1173 LDRDIN(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
1174 else {
1175 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
1176 swf_ldrin(_R1_REGNO, _FP_REGNO, swf_off(r0) + 4);
1177 }
1178 }
1179 else {
1180 movr(_R0_REGNO, r0);
1181 movr(_R1_REGNO, r0 + 1);
1182 }
1183 if (jit_fpr_p(r1)) {
1184 if (!jit_thumb_p() && jit_armv5e_p())
1185 LDRDIN(_R2_REGNO, _FP_REGNO, swf_off(r1) + 8);
1186 else {
1187 swf_ldrin(_R2_REGNO, _FP_REGNO, swf_off(r1) + 8);
1188 swf_ldrin(_R3_REGNO, _FP_REGNO, swf_off(r1) + 4);
1189 }
1190 }
1191 else {
1192 movr(_R2_REGNO, r1);
1193 movr(_R3_REGNO, r1 + 1);
1194 }
1195 swf_call_with_get_reg(i0, fallback);
1196 if (jit_thumb_p()) {
1197 T1_CMPI(_R0_REGNO, 0);
1198 w = _jit->pc.w;
1199 d = ((i1 - w) >> 1) - 2;
1200 assert(_s20P(d));
1201 T2_CC_B(cc, encode_thumb_cc_jump(d));
1202 }
1203 else {
1204 CMPI(_R0_REGNO, 0);
1205 w = _jit->pc.w;
1206 d = ((i1 - w) >> 2) - 2;
1207 assert(_s24P(d));
1208 CC_B(cc, d & 0x00ffffff);
1209 }
1210 jit_unget_reg_args();
1211 return (w);
1212 }
1213
1214 static jit_word_t
_swf_bff_(jit_state_t * _jit,int (* i0)(float,float),int cc,jit_word_t i1,jit_int32_t r0,jit_float32_t i2)1215 _swf_bff_(jit_state_t *_jit, int (*i0)(float, float), int cc,
1216 jit_word_t i1, jit_int32_t r0, jit_float32_t i2)
1217 {
1218 union {
1219 jit_int32_t i;
1220 jit_float32_t f;
1221 } data;
1222 jit_word_t w, d;
1223 jit_get_reg_args();
1224 data.f = i2;
1225 if (jit_fpr_p(r0))
1226 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
1227 else
1228 movr(_R0_REGNO, r0);
1229 movi(_R1_REGNO, data.i);
1230 swf_call(i0, fallback, _R2_REGNO);
1231 if (jit_thumb_p()) {
1232 T1_CMPI(_R0_REGNO, 0);
1233 w = _jit->pc.w;
1234 d = ((i1 - w) >> 1) - 2;
1235 assert(_s20P(d));
1236 T2_CC_B(cc, encode_thumb_cc_jump(d));
1237 }
1238 else {
1239 CMPI(_R0_REGNO, 0);
1240 w = _jit->pc.w;
1241 d = ((i1 - w) >> 2) - 2;
1242 assert(_s24P(d));
1243 CC_B(cc, d & 0x00ffffff);
1244 }
1245 jit_unget_reg_args();
1246 return (w);
1247 }
1248
1249 static jit_word_t
_swf_bdd_(jit_state_t * _jit,int (* i0)(double,double),int cc,jit_word_t i1,jit_int32_t r0,jit_float64_t i2)1250 _swf_bdd_(jit_state_t *_jit, int (*i0)(double, double), int cc,
1251 jit_word_t i1, jit_int32_t r0, jit_float64_t i2)
1252 {
1253 jit_word_t w, d;
1254 union {
1255 jit_int32_t i[2];
1256 jit_float64_t d;
1257 } data;
1258 jit_get_reg_args();
1259 data.d = i2;
1260 if (jit_fpr_p(r0)) {
1261 if (!jit_thumb_p() && jit_armv5e_p())
1262 LDRDIN(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
1263 else {
1264 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
1265 swf_ldrin(_R1_REGNO, _FP_REGNO, swf_off(r0) + 4);
1266 }
1267 }
1268 else {
1269 movr(_R0_REGNO, r0);
1270 movr(_R1_REGNO, r0 + 1);
1271 }
1272 movi(_R2_REGNO, data.i[0]);
1273 movi(_R3_REGNO, data.i[1]);
1274 swf_call_with_get_reg(i0, fallback);
1275 if (jit_thumb_p()) {
1276 T1_CMPI(_R0_REGNO, 0);
1277 w = _jit->pc.w;
1278 d = ((i1 - w) >> 1) - 2;
1279 assert(_s20P(d));
1280 T2_CC_B(cc, encode_thumb_cc_jump(d));
1281 }
1282 else {
1283 CMPI(_R0_REGNO, 0);
1284 w = _jit->pc.w;
1285 d = ((i1 - w) >> 2) - 2;
1286 assert(_s24P(d));
1287 CC_B(cc, d & 0x00ffffff);
1288 }
1289 jit_unget_reg_args();
1290 return (w);
1291 }
1292
1293 static jit_word_t
_swf_bunff(jit_state_t * _jit,int eq,jit_word_t i0,jit_int32_t r0,jit_int32_t r1)1294 _swf_bunff(jit_state_t *_jit, int eq,
1295 jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
1296 {
1297 jit_word_t w, d, j0, j1;
1298 jit_get_reg_args();
1299 if (jit_fpr_p(r0))
1300 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
1301 else
1302 movr(_R0_REGNO, r0);
1303 if (jit_fpr_p(r1))
1304 swf_ldrin(_R1_REGNO, _FP_REGNO, swf_off(r1) + 8);
1305 else
1306 movr(_R1_REGNO, r1);
1307 swf_call(__aeabi_fcmpun, fcmpun, _R2_REGNO);
1308 /* if unordered */
1309 if (jit_thumb_p()) {
1310 T1_CMPI(_R0_REGNO, 0);
1311 j0 = _jit->pc.w;
1312 T2_CC_B(ARM_CC_NE, 0);
1313 }
1314 else {
1315 CMPI(_R0_REGNO, 0);
1316 j0 = _jit->pc.w;
1317 CC_B(ARM_CC_NE, 0);
1318 }
1319 if (jit_fpr_p(r0))
1320 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
1321 else
1322 movr(_R0_REGNO, r0);
1323 if (jit_fpr_p(r1))
1324 swf_ldrin(_R1_REGNO, _FP_REGNO, swf_off(r1) + 8);
1325 else
1326 movr(_R1_REGNO, r1);
1327 swf_call(__aeabi_fcmpeq, fcmpeq, _R2_REGNO);
1328 if (jit_thumb_p()) {
1329 T1_CMPI(_R0_REGNO, 0);
1330 j1 = _jit->pc.w;
1331 if (eq) {
1332 T2_CC_B(ARM_CC_EQ, 0);
1333 patch_at(arm_patch_jump, j0, _jit->pc.w);
1334 }
1335 else
1336 T2_CC_B(ARM_CC_NE, 0);
1337 w = _jit->pc.w;
1338 d = ((i0 - w) >> 1) - 2;
1339 assert(_s24P(d));
1340 T2_B(encode_thumb_jump(d));
1341 }
1342 else {
1343 CMPI(_R0_REGNO, 0);
1344 j1 = _jit->pc.w;
1345 if (eq) {
1346 CC_B(ARM_CC_EQ, 0);
1347 patch_at(arm_patch_jump, j0, _jit->pc.w);
1348 }
1349 else
1350 CC_B(ARM_CC_NE, 0);
1351 w = _jit->pc.w;
1352 d = ((i0 - w) >> 2) - 2;
1353 assert(_s24P(d));
1354 B(d & 0x00ffffff);
1355 }
1356 if (!eq)
1357 patch_at(arm_patch_jump, j0, _jit->pc.w);
1358 patch_at(arm_patch_jump, j1, _jit->pc.w);
1359 jit_unget_reg_args();
1360 return (w);
1361 }
1362
1363 static jit_word_t
_swf_bundd(jit_state_t * _jit,int eq,jit_word_t i0,jit_int32_t r0,jit_int32_t r1)1364 _swf_bundd(jit_state_t *_jit, int eq,
1365 jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
1366 {
1367 jit_word_t w, d, j0, j1;
1368 jit_get_reg_args();
1369 if (jit_fpr_p(r0)) {
1370 if (!jit_thumb_p() && jit_armv5e_p())
1371 LDRDIN(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
1372 else {
1373 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
1374 swf_ldrin(_R1_REGNO, _FP_REGNO, swf_off(r0) + 4);
1375 }
1376 }
1377 else {
1378 movr(_R0_REGNO, r0);
1379 movr(_R1_REGNO, r0 + 1);
1380 }
1381 if (jit_fpr_p(r1)) {
1382 if (!jit_thumb_p() && jit_armv5e_p())
1383 LDRDIN(_R2_REGNO, _FP_REGNO, swf_off(r1) + 8);
1384 else {
1385 swf_ldrin(_R2_REGNO, _FP_REGNO, swf_off(r1) + 8);
1386 swf_ldrin(_R3_REGNO, _FP_REGNO, swf_off(r1) + 4);
1387 }
1388 }
1389 else {
1390 movr(_R2_REGNO, r0);
1391 movr(_R3_REGNO, r0 + 1);
1392 }
1393 swf_call_with_get_reg(__aeabi_dcmpun, dcmpun);
1394 /* if unordered */
1395 if (jit_thumb_p()) {
1396 T1_CMPI(_R0_REGNO, 0);
1397 j0 = _jit->pc.w;
1398 T2_CC_B(ARM_CC_NE, 0);
1399 }
1400 else {
1401 CMPI(_R0_REGNO, 0);
1402 j0 = _jit->pc.w;
1403 CC_B(ARM_CC_NE, 0);
1404 }
1405 if (jit_fpr_p(r0)) {
1406 if (!jit_thumb_p() && jit_armv5e_p())
1407 LDRDIN(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
1408 else {
1409 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
1410 swf_ldrin(_R1_REGNO, _FP_REGNO, swf_off(r0) + 4);
1411 }
1412 }
1413 else {
1414 movr(_R0_REGNO, r0);
1415 movr(_R1_REGNO, r0 + 1);
1416 }
1417 if (jit_fpr_p(r1)) {
1418 if (!jit_thumb_p() && jit_armv5e_p())
1419 LDRDIN(_R2_REGNO, _FP_REGNO, swf_off(r1) + 8);
1420 else {
1421 swf_ldrin(_R2_REGNO, _FP_REGNO, swf_off(r1) + 8);
1422 swf_ldrin(_R3_REGNO, _FP_REGNO, swf_off(r1) + 4);
1423 }
1424 }
1425 else {
1426 movr(_R2_REGNO, r0);
1427 movr(_R3_REGNO, r0 + 1);
1428 }
1429 swf_call_with_get_reg(__aeabi_dcmpeq, dcmpeq);
1430 if (jit_thumb_p()) {
1431 T1_CMPI(_R0_REGNO, 0);
1432 j1 = _jit->pc.w;
1433 if (eq) {
1434 T2_CC_B(ARM_CC_EQ, 0);
1435 patch_at(arm_patch_jump, j0, _jit->pc.w);
1436 }
1437 else
1438 T2_CC_B(ARM_CC_NE, 0);
1439 w = _jit->pc.w;
1440 d = ((i0 - w) >> 1) - 2;
1441 assert(_s24P(d));
1442 T2_B(encode_thumb_jump(d));
1443 }
1444 else {
1445 CMPI(_R0_REGNO, 0);
1446 j1 = _jit->pc.w;
1447 if (eq) {
1448 CC_B(ARM_CC_EQ, 0);
1449 patch_at(arm_patch_jump, j0, _jit->pc.w);
1450 }
1451 else
1452 CC_B(ARM_CC_NE, 0);
1453 w = _jit->pc.w;
1454 d = ((i0 - w) >> 2) - 2;
1455 assert(_s24P(d));
1456 B(d & 0x00ffffff);
1457 }
1458 if (!eq)
1459 patch_at(arm_patch_jump, j0, _jit->pc.w);
1460 patch_at(arm_patch_jump, j1, _jit->pc.w);
1461 jit_unget_reg_args();
1462 return (w);
1463 }
1464
1465 static jit_word_t
_swf_bunff_(jit_state_t * _jit,int eq,jit_word_t i0,jit_int32_t r0,jit_float32_t i1)1466 _swf_bunff_(jit_state_t *_jit, int eq,
1467 jit_word_t i0, jit_int32_t r0, jit_float32_t i1)
1468 {
1469 union {
1470 jit_int32_t i;
1471 jit_float32_t f;
1472 } data;
1473 jit_word_t w, d, j0, j1;
1474 data.f = i1;
1475 jit_get_reg_args();
1476 if (jit_fpr_p(r0))
1477 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
1478 else
1479 movr(_R0_REGNO, r0);
1480 movi(_R1_REGNO, data.i);
1481 swf_call(__aeabi_fcmpun, fcmpun, _R2_REGNO);
1482 /* if unordered */
1483 if (jit_thumb_p()) {
1484 T1_CMPI(_R0_REGNO, 0);
1485 j0 = _jit->pc.w;
1486 T2_CC_B(ARM_CC_NE, 0);
1487 }
1488 else {
1489 CMPI(_R0_REGNO, 0);
1490 j0 = _jit->pc.w;
1491 CC_B(ARM_CC_NE, 0);
1492 }
1493 if (jit_fpr_p(r0))
1494 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
1495 else
1496 movr(_R0_REGNO, r0);
1497 movi(_R1_REGNO, data.i);
1498 swf_call(__aeabi_fcmpeq, fcmpeq, _R2_REGNO);
1499 if (jit_thumb_p()) {
1500 T1_CMPI(_R0_REGNO, 0);
1501 j1 = _jit->pc.w;
1502 if (eq) {
1503 T2_CC_B(ARM_CC_EQ, 0);
1504 patch_at(arm_patch_jump, j0, _jit->pc.w);
1505 }
1506 else
1507 T2_CC_B(ARM_CC_NE, 0);
1508 w = _jit->pc.w;
1509 d = ((i0 - w) >> 1) - 2;
1510 assert(_s24P(d));
1511 T2_B(encode_thumb_jump(d));
1512 }
1513 else {
1514 CMPI(_R0_REGNO, 0);
1515 j1 = _jit->pc.w;
1516 if (eq) {
1517 CC_B(ARM_CC_EQ, 0);
1518 patch_at(arm_patch_jump, j0, _jit->pc.w);
1519 }
1520 else
1521 CC_B(ARM_CC_NE, 0);
1522 w = _jit->pc.w;
1523 d = ((i0 - w) >> 2) - 2;
1524 assert(_s24P(d));
1525 B(d & 0x00ffffff);
1526 }
1527 if (!eq)
1528 patch_at(arm_patch_jump, j0, _jit->pc.w);
1529 patch_at(arm_patch_jump, j1, _jit->pc.w);
1530 jit_unget_reg_args();
1531 return (w);
1532 }
1533
1534 static jit_word_t
_swf_bundd_(jit_state_t * _jit,int eq,jit_word_t i0,jit_int32_t r0,jit_float64_t i1)1535 _swf_bundd_(jit_state_t *_jit, int eq,
1536 jit_word_t i0, jit_int32_t r0, jit_float64_t i1)
1537 {
1538 jit_word_t w, d, j0, j1;
1539 union {
1540 jit_int32_t i[2];
1541 jit_float64_t d;
1542 } data;
1543 jit_get_reg_args();
1544 data.d = i1;
1545 if (jit_fpr_p(r0)) {
1546 if (!jit_thumb_p() && jit_armv5e_p())
1547 LDRDIN(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
1548 else {
1549 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
1550 swf_ldrin(_R1_REGNO, _FP_REGNO, swf_off(r0) + 4);
1551 }
1552 }
1553 else {
1554 movr(_R0_REGNO, r0);
1555 movr(_R1_REGNO, r0 + 1);
1556 }
1557 movi(_R2_REGNO, data.i[0]);
1558 movi(_R3_REGNO, data.i[1]);
1559 swf_call_with_get_reg(__aeabi_dcmpun, fcmpun);
1560 /* if unordered */
1561 if (jit_thumb_p()) {
1562 T1_CMPI(_R0_REGNO, 0);
1563 j0 = _jit->pc.w;
1564 T2_CC_B(ARM_CC_NE, 0);
1565 }
1566 else {
1567 CMPI(_R0_REGNO, 0);
1568 j0 = _jit->pc.w;
1569 CC_B(ARM_CC_NE, 0);
1570 }
1571 if (jit_fpr_p(r0)) {
1572 if (!jit_thumb_p() && jit_armv5e_p())
1573 LDRDIN(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
1574 else {
1575 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
1576 swf_ldrin(_R1_REGNO, _FP_REGNO, swf_off(r0) + 4);
1577 }
1578 }
1579 else {
1580 movr(_R0_REGNO, r0);
1581 movr(_R1_REGNO, r0 + 1);
1582 }
1583 movi(_R2_REGNO, data.i[0]);
1584 movi(_R3_REGNO, data.i[1]);
1585 swf_call_with_get_reg(__aeabi_dcmpeq, fcmpeq);
1586 if (jit_thumb_p()) {
1587 T1_CMPI(_R0_REGNO, 0);
1588 j1 = _jit->pc.w;
1589 if (eq) {
1590 T2_CC_B(ARM_CC_EQ, 0);
1591 patch_at(arm_patch_jump, j0, _jit->pc.w);
1592 }
1593 else
1594 T2_CC_B(ARM_CC_NE, 0);
1595 w = _jit->pc.w;
1596 d = ((i0 - w) >> 1) - 2;
1597 assert(_s24P(d));
1598 T2_B(encode_thumb_jump(d));
1599 }
1600 else {
1601 CMPI(_R0_REGNO, 0);
1602 j1 = _jit->pc.w;
1603 if (eq) {
1604 CC_B(ARM_CC_EQ, 0);
1605 patch_at(arm_patch_jump, j0, _jit->pc.w);
1606 }
1607 else
1608 CC_B(ARM_CC_NE, 0);
1609 w = _jit->pc.w;
1610 d = ((i0 - w) >> 2) - 2;
1611 assert(_s24P(d));
1612 B(d & 0x00ffffff);
1613 }
1614 if (!eq)
1615 patch_at(arm_patch_jump, j0, _jit->pc.w);
1616 patch_at(arm_patch_jump, j1, _jit->pc.w);
1617 jit_unget_reg_args();
1618 return (w);
1619 }
1620
1621 static void
_swf_extr_f(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1)1622 _swf_extr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1623 {
1624 jit_get_reg_args();
1625 movr(_R0_REGNO, r1);
1626 swf_call(__aeabi_i2f, i2f, _R1_REGNO);
1627 if (jit_fpr_p(r0))
1628 swf_strin(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
1629 else
1630 movr(r0, _R0_REGNO);
1631 jit_unget_reg_args();
1632 }
1633
1634 static void
_swf_extr_d(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1)1635 _swf_extr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1636 {
1637 jit_get_reg_args();
1638 movr(_R0_REGNO, r1);
1639 swf_call(__aeabi_i2d, i2d, _R2_REGNO);
1640 if (jit_fpr_p(r0)) {
1641 if (!jit_thumb_p() && jit_armv5e_p())
1642 STRDIN(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
1643 else {
1644 swf_strin(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
1645 swf_strin(_R1_REGNO, _FP_REGNO, swf_off(r0) + 4);
1646 }
1647 }
1648 else {
1649 movr(r0, _R0_REGNO);
1650 movr(r0 + 1, _R1_REGNO);
1651 }
1652 jit_unget_reg_args();
1653 }
1654
1655 static void
_swf_extr_d_f(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1)1656 _swf_extr_d_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1657 {
1658 jit_get_reg_args();
1659 if (jit_fpr_p(r1)) {
1660 if (!jit_thumb_p() && jit_armv5e_p())
1661 LDRDIN(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
1662 else {
1663 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
1664 swf_ldrin(_R1_REGNO, _FP_REGNO, swf_off(r1) + 4);
1665 }
1666 }
1667 else {
1668 movr(_R0_REGNO, r1);
1669 movr(_R1_REGNO, r1 + 1);
1670 }
1671 swf_call(__aeabi_d2f, d2f, _R2_REGNO);
1672 if (jit_fpr_p(r0))
1673 swf_strin(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
1674 else
1675 movr(r0, _R0_REGNO);
1676 jit_unget_reg_args();
1677 }
1678
1679 static void
_swf_extr_f_d(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1)1680 _swf_extr_f_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1681 {
1682 jit_get_reg_args();
1683 if (jit_fpr_p(r1))
1684 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
1685 else
1686 movr(_R0_REGNO, r1);
1687 swf_call(__aeabi_f2d, f2d, _R1_REGNO);
1688 if (jit_fpr_p(r0)) {
1689 if (!jit_thumb_p() && jit_armv5e_p())
1690 STRDIN(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
1691 else {
1692 swf_strin(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
1693 swf_strin(_R1_REGNO, _FP_REGNO, swf_off(r0) + 4);
1694 }
1695 }
1696 else {
1697 movr(r0, _R0_REGNO);
1698 movr(r0 + 1, _R1_REGNO);
1699 }
1700 jit_unget_reg_args();
1701 }
1702
1703 static void
_swf_truncr_f_i(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1)1704 _swf_truncr_f_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1705 {
1706 #if !NAN_TO_INT_IS_ZERO
1707 jit_word_t is_nan;
1708 jit_word_t fast_not_nan;
1709 jit_word_t slow_not_nan;
1710 #endif
1711 jit_get_reg_args();
1712 if (jit_fpr_p(r1))
1713 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
1714 else
1715 movr(_R0_REGNO, r1);
1716 #if !NAN_TO_INT_IS_ZERO
1717 /* >> based on fragment of __aeabi_fcmpun */
1718 lshi(_R2_REGNO, _R0_REGNO, 1);
1719 if (jit_thumb_p())
1720 torrrs(THUMB2_MVN|ARM_S, _R0_REGNO, _R3_REGNO, _R2_REGNO,
1721 encode_thumb_shift(24, ARM_ASR));
1722 else
1723 corrrs(ARM_CC_AL, ARM_MVN|ARM_S|ARM_ASR,
1724 _R0_REGNO, _R3_REGNO, _R2_REGNO, 24);
1725 fast_not_nan = _jit->pc.w;
1726 if (jit_thumb_p()) {
1727 T2_CC_B(ARM_CC_NE, 0);
1728 tshift(THUMB2_LSLI|ARM_S, _R0_REGNO, _R3_REGNO, 9);
1729 }
1730 else {
1731 CC_B(ARM_CC_NE, 0);
1732 cshift(ARM_CC_AL, ARM_S|ARM_LSL, _R0_REGNO, _R3_REGNO, _R0_REGNO, 9);
1733 }
1734 slow_not_nan = _jit->pc.w;
1735 if (jit_thumb_p())
1736 T2_CC_B(ARM_CC_EQ, 0);
1737 else
1738 CC_B(ARM_CC_EQ, 0);
1739 movi(r0, 0x80000000);
1740 is_nan = _jit->pc.w;
1741 if (jit_thumb_p())
1742 T2_B(0);
1743 else
1744 B(0);
1745 patch_at(arm_patch_jump, fast_not_nan, _jit->pc.w);
1746 patch_at(arm_patch_jump, slow_not_nan, _jit->pc.w);
1747 /* << based on fragment of __aeabi_fcmpun */
1748 #endif
1749 swf_call(__aeabi_f2iz, f2iz, _R2_REGNO);
1750 movr(r0, _R0_REGNO);
1751 #if !NAN_TO_INT_IS_ZERO
1752 patch_at(arm_patch_jump, is_nan, _jit->pc.w);
1753 #endif
1754 jit_unget_reg_args();
1755 }
1756
1757 static void
_swf_truncr_d_i(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1)1758 _swf_truncr_d_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1759 {
1760 #if !NAN_TO_INT_IS_ZERO
1761 jit_word_t is_nan;
1762 jit_word_t fast_not_nan;
1763 jit_word_t slow_not_nan;
1764 #endif
1765 jit_get_reg_args();
1766 if (jit_fpr_p(r1)) {
1767 if (!jit_thumb_p() && jit_armv5e_p())
1768 LDRDIN(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
1769 else {
1770 swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8);
1771 swf_ldrin(_R1_REGNO, _FP_REGNO, swf_off(r1) + 4);
1772 }
1773 }
1774 else {
1775 movr(_R0_REGNO, r1);
1776 movr(_R1_REGNO, r1 + 1);
1777 }
1778 #if !NAN_TO_INT_IS_ZERO
1779 /* >> based on fragment of __aeabi_dcmpun */
1780 lshi(_R3_REGNO, _R1_REGNO, 1);
1781 if (jit_thumb_p())
1782 torrrs(THUMB2_MVN|ARM_S, _R0_REGNO, _R3_REGNO, _R3_REGNO,
1783 encode_thumb_shift(21, ARM_ASR));
1784 else
1785 corrrs(ARM_CC_AL, ARM_MVN|ARM_S|ARM_ASR,
1786 _R0_REGNO, _R3_REGNO, _R3_REGNO, 21);
1787 fast_not_nan = _jit->pc.w;
1788 if (jit_thumb_p()) {
1789 T2_CC_B(ARM_CC_NE, 0);
1790 torrrs(THUMB2_ORR|ARM_S, _R0_REGNO, _R3_REGNO, _R1_REGNO,
1791 encode_thumb_shift(12, ARM_LSL));
1792 }
1793 else {
1794 CC_B(ARM_CC_NE, 0);
1795 corrrs(ARM_CC_AL, ARM_ORR|ARM_S|ARM_LSL,
1796 _R0_REGNO, _R3_REGNO, _R1_REGNO, 12);
1797 }
1798 slow_not_nan = _jit->pc.w;
1799 if (jit_thumb_p())
1800 T2_CC_B(ARM_CC_EQ, 0);
1801 else
1802 CC_B(ARM_CC_EQ, 0);
1803 movi(r0, 0x80000000);
1804 is_nan = _jit->pc.w;
1805 if (jit_thumb_p())
1806 T2_B(0);
1807 else
1808 B(0);
1809 patch_at(arm_patch_jump, fast_not_nan, _jit->pc.w);
1810 patch_at(arm_patch_jump, slow_not_nan, _jit->pc.w);
1811 /* << based on fragment of __aeabi_dcmpun */
1812 #endif
1813 swf_call(__aeabi_d2iz, d2iz, _R3_REGNO);
1814 movr(r0, _R0_REGNO);
1815 #if !NAN_TO_INT_IS_ZERO
1816 patch_at(arm_patch_jump, is_nan, _jit->pc.w);
1817 #endif
1818 jit_unget_reg_args();
1819 }
1820
1821 static void
_swf_movr_f(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1)1822 _swf_movr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1823 {
1824 jit_int32_t reg;
1825 if (r0 != r1) {
1826 if (jit_fpr_p(r1)) {
1827 reg = jit_get_reg(jit_class_gpr);
1828 swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 8);
1829 if (jit_fpr_p(r0))
1830 swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8);
1831 else
1832 movr(r0, rn(reg));
1833 jit_unget_reg(reg);
1834 }
1835 else if (jit_fpr_p(r0))
1836 swf_strin(r1, _FP_REGNO, swf_off(r0) + 8);
1837 else
1838 movr(r0, r1);
1839 }
1840 }
1841
1842 static void
_swf_movr_d(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1)1843 _swf_movr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1844 {
1845 jit_int32_t reg;
1846 if (r0 != r1) {
1847 if (jit_fpr_p(r1)) {
1848 if (!jit_thumb_p() && jit_armv5e_p() &&
1849 (reg = jit_get_reg_pair()) != JIT_NOREG) {
1850 LDRDIN(rn(reg), _FP_REGNO, swf_off(r1) + 8);
1851 if (jit_fpr_p(r0))
1852 STRDIN(rn(reg), _FP_REGNO, swf_off(r0) + 8);
1853 else {
1854 movr(r0, rn(reg));
1855 movr(r0 + 1, rn(reg) + 1);
1856 }
1857 jit_unget_reg_pair(reg);
1858 }
1859 else {
1860 reg = jit_get_reg(jit_class_gpr);
1861 swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 8);
1862 if (jit_fpr_p(r0))
1863 swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8);
1864 else
1865 movr(r0, rn(reg));
1866 swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 4);
1867 if (jit_fpr_p(r0))
1868 swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 4);
1869 else
1870 movr(r0 + 1, rn(reg));
1871 jit_unget_reg(reg);
1872 }
1873 }
1874 else if (jit_fpr_p(r0)) {
1875 if (!jit_thumb_p() && jit_armv5e_p() && !(r1 & 1))
1876 STRDIN(r1, _FP_REGNO, swf_off(r0) + 8);
1877 else {
1878 swf_strin(r1, _FP_REGNO, swf_off(r0) + 8);
1879 swf_strin(r1 + 1, _FP_REGNO, swf_off(r0) + 4);
1880 }
1881 }
1882 else {
1883 movr(r0, r1);
1884 movr(r0 + 1, r1 + 1);
1885 }
1886 }
1887 }
1888
1889 static void
_swf_movi_f(jit_state_t * _jit,jit_int32_t r0,jit_float32_t i0)1890 _swf_movi_f(jit_state_t *_jit, jit_int32_t r0, jit_float32_t i0)
1891 {
1892 union {
1893 jit_int32_t i;
1894 jit_float32_t f;
1895 } data;
1896 jit_int32_t reg;
1897 data.f = i0;
1898 if (jit_fpr_p(r0)) {
1899 reg = jit_get_reg(jit_class_gpr);
1900 movi(rn(reg), data.i);
1901 swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8);
1902 jit_unget_reg(reg);
1903 }
1904 else
1905 movi(r0, data.i);
1906 }
1907
1908 static void
_swf_movi_d(jit_state_t * _jit,jit_int32_t r0,jit_float64_t i0)1909 _swf_movi_d(jit_state_t *_jit, jit_int32_t r0, jit_float64_t i0)
1910 {
1911 jit_int32_t reg;
1912 union {
1913 jit_int32_t i[2];
1914 jit_float64_t d;
1915 } data;
1916 data.d = i0;
1917 if (jit_fpr_p(r0)) {
1918 if (!jit_thumb_p() && jit_armv5e_p() &&
1919 (reg = jit_get_reg_pair()) != JIT_NOREG) {
1920 movi(rn(reg), data.i[0]);
1921 movi(rn(reg) + 1, data.i[1]);
1922 STRDIN(rn(reg), _FP_REGNO, swf_off(r0) + 8);
1923 jit_unget_reg_pair(reg);
1924 }
1925 else {
1926 reg = jit_get_reg(jit_class_gpr);
1927 movi(rn(reg), data.i[0]);
1928 swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8);
1929 movi(rn(reg), data.i[1]);
1930 swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 4);
1931 jit_unget_reg(reg);
1932 }
1933 }
1934 else {
1935 movi(r0, data.i[0]);
1936 movi(r0 + 1, data.i[1]);
1937 }
1938 }
1939
1940 static void
_swf_absr_f(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1)1941 _swf_absr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1942 {
1943 jit_int32_t reg;
1944 if (jit_fpr_p(r1)) {
1945 reg = jit_get_reg(jit_class_gpr);
1946 swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 8);
1947 swf_bici(rn(reg), rn(reg), 0x80000000);
1948 if (jit_fpr_p(r0))
1949 swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8);
1950 else
1951 movr(r0, rn(reg));
1952 jit_unget_reg(reg);
1953 }
1954 else if (jit_fpr_p(r0)) {
1955 reg = jit_get_reg(jit_class_gpr);
1956 movr(rn(reg), r1);
1957 swf_bici(rn(reg), rn(reg), 0x80000000);
1958 swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8);
1959 jit_unget_reg(reg);
1960 }
1961 else
1962 swf_bici(r0, r1, 0x80000000);
1963 }
1964
1965 static void
_swf_absr_d(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1)1966 _swf_absr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1967 {
1968 jit_int32_t reg;
1969 if (jit_fpr_p(r1)) {
1970 if (jit_fpr_p(r0) && !jit_thumb_p() && jit_armv5e_p() &&
1971 r0 != r1 && (reg = jit_get_reg_pair()) != JIT_NOREG) {
1972 LDRDIN(rn(reg), _FP_REGNO, swf_off(r1) + 8);
1973 swf_bici(rn(reg) + 1, rn(reg) + 1, 0x80000000);
1974 STRDIN(rn(reg), _FP_REGNO, swf_off(r0) + 8);
1975 jit_unget_reg_pair(reg);
1976 }
1977 else {
1978 reg = jit_get_reg(jit_class_gpr);
1979 swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 4);
1980 swf_bici(rn(reg), rn(reg), 0x80000000);
1981 if (jit_fpr_p(r0)) {
1982 swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 4);
1983 if (r0 != r1) {
1984 swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 8);
1985 swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8);
1986 }
1987 }
1988 else {
1989 movr(r0, rn(reg));
1990 swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 8);
1991 movr(r0 + 1, rn(reg));
1992 }
1993 jit_unget_reg(reg);
1994 }
1995 }
1996 else if (jit_fpr_p(r0)) {
1997 reg = jit_get_reg(jit_class_gpr);
1998 movr(rn(reg), r1);
1999 swf_bici(rn(reg), rn(reg), 0x80000000);
2000 swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 4);
2001 movr(rn(reg), r1 + 1);
2002 swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8);
2003 jit_unget_reg(reg);
2004 }
2005 else {
2006 swf_bici(r0, r1, 0x80000000);
2007 if (r0 != r1)
2008 movr(r0 + 1, r1 + 1);
2009 }
2010 }
2011
2012 static void
_swf_negr_f(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1)2013 _swf_negr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
2014 {
2015 jit_int32_t reg;
2016 if (jit_fpr_p(r1)) {
2017 reg = jit_get_reg(jit_class_gpr);
2018 swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 8);
2019 xori(rn(reg), rn(reg), 0x80000000);
2020 if (jit_fpr_p(r0))
2021 swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8);
2022 else
2023 movr(r0, rn(reg));
2024 jit_unget_reg(reg);
2025 }
2026 else if (jit_fpr_p(r0)) {
2027 reg = jit_get_reg(jit_class_gpr);
2028 movr(rn(reg), r1);
2029 xori(rn(reg), rn(reg), 0x80000000);
2030 swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8);
2031 jit_unget_reg(reg);
2032 }
2033 else
2034 xori(r0, r1, 0x80000000);
2035 }
2036
2037 static void
_swf_negr_d(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1)2038 _swf_negr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
2039 {
2040 jit_int32_t reg;
2041 if (jit_fpr_p(r1)) {
2042 if (jit_fpr_p(r0) && !jit_thumb_p() && jit_armv5e_p() &&
2043 r0 != r1 && (reg = jit_get_reg_pair()) != JIT_NOREG) {
2044 LDRDIN(rn(reg), _FP_REGNO, swf_off(r1) + 8);
2045 EORI(rn(reg) + 1, rn(reg) + 1, encode_arm_immediate(0x80000000));
2046 STRDIN(rn(reg), _FP_REGNO, swf_off(r0) + 8);
2047 jit_unget_reg_pair(reg);
2048 }
2049 else {
2050 reg = jit_get_reg(jit_class_gpr);
2051 swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 4);
2052 xori(rn(reg), rn(reg), 0x80000000);
2053 if (jit_fpr_p(r0)) {
2054 swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 4);
2055 if (r0 != r1) {
2056 swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 8);
2057 swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8);
2058 }
2059 }
2060 else {
2061 movr(r0, rn(reg));
2062 swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 8);
2063 movr(r0 + 1, rn(reg));
2064 }
2065 jit_unget_reg(reg);
2066 }
2067 }
2068 else if (jit_fpr_p(r0)) {
2069 reg = jit_get_reg(jit_class_gpr);
2070 movr(rn(reg), r1);
2071 xori(rn(reg), rn(reg), 0x80000000);
2072 swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 4);
2073 movr(rn(reg), r1 + 1);
2074 swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8);
2075 jit_unget_reg(reg);
2076 }
2077 else {
2078 xori(r0, r1, 0x80000000);
2079 if (r0 != r1)
2080 movr(r0 + 1, r1 + 1);
2081 }
2082 }
2083
2084 static void
_swf_ner_f(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_int32_t r2)2085 _swf_ner_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2086 {
2087 swf_iff(__aeabi_fcmpeq, r0, r1, r2);
2088 xori(r0, r0, 1);
2089 }
2090
2091 static void
_swf_nei_f(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_float32_t i0)2092 _swf_nei_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_float32_t i0)
2093 {
2094 swf_iff_(__aeabi_fcmpeq, r0, r1, i0);
2095 xori(r0, r0, 1);
2096 }
2097
2098 static void
_swf_ner_d(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_int32_t r2)2099 _swf_ner_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2100 {
2101 swf_idd(__aeabi_dcmpeq, r0, r1, r2);
2102 xori(r0, r0, 1);
2103 }
2104
2105 static void
_swf_nei_d(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_float64_t i0)2106 _swf_nei_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_float64_t i0)
2107 {
2108 swf_idd_(__aeabi_dcmpeq, r0, r1, i0);
2109 xori(r0, r0, 1);
2110 }
2111
2112 static void
_swf_ltgtr_f(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_int32_t r2)2113 _swf_ltgtr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2114 {
2115 swf_iunff(__aeabi_fcmpeq, r0, r1, r2);
2116 xori(r0, r0, 1);
2117 }
2118
2119 static void
_swf_ltgti_f(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_float32_t i0)2120 _swf_ltgti_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_float32_t i0)
2121 {
2122 swf_iunff_(__aeabi_fcmpeq, r0, r1, i0);
2123 xori(r0, r0, 1);
2124 }
2125
2126 static void
_swf_ltgtr_d(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_int32_t r2)2127 _swf_ltgtr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2128 {
2129 swf_iundd(__aeabi_dcmpeq, r0, r1, r2);
2130 xori(r0, r0, 1);
2131 }
2132
2133 static void
_swf_ltgti_d(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_float64_t i0)2134 _swf_ltgti_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_float64_t i0)
2135 {
2136 swf_iundd_(__aeabi_dcmpeq, r0, r1, i0);
2137 xori(r0, r0, 1);
2138 }
2139
2140 static void
_swf_ordr_f(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_int32_t r2)2141 _swf_ordr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2142 {
2143 swf_iff(__aeabi_fcmpun, r0, r1, r2);
2144 xori(r0, r0, 1);
2145 }
2146
2147 static void
_swf_ordi_f(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_float32_t i0)2148 _swf_ordi_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_float32_t i0)
2149 {
2150 swf_iff_(__aeabi_fcmpun, r0, r1, i0);
2151 xori(r0, r0, 1);
2152 }
2153
2154 static void
_swf_ordr_d(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_int32_t r2)2155 _swf_ordr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2156 {
2157 swf_idd(__aeabi_dcmpun, r0, r1, r2);
2158 xori(r0, r0, 1);
2159 }
2160
2161 static void
_swf_ordi_d(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_float64_t i0)2162 _swf_ordi_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_float64_t i0)
2163 {
2164 swf_idd_(__aeabi_dcmpun, r0, r1, i0);
2165 xori(r0, r0, 1);
2166 }
2167
2168 static void
_swf_ldr_f(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1)2169 _swf_ldr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
2170 {
2171 jit_int32_t reg;
2172 if (jit_fpr_p(r0)) {
2173 reg = jit_get_reg(jit_class_gpr);
2174 ldxi_i(rn(reg), r1, 0);
2175 swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8);
2176 jit_unget_reg(reg);
2177 }
2178 else
2179 ldxi_i(r0, r1, 0);
2180 }
2181
2182 static void
_swf_ldr_d(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1)2183 _swf_ldr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
2184 {
2185 jit_int32_t reg;
2186 if (jit_fpr_p(r0)) {
2187 if (!jit_thumb_p() && jit_armv5e_p() &&
2188 (reg = jit_get_reg_pair()) != JIT_NOREG) {
2189 LDRDI(rn(reg), r1, 0);
2190 STRDIN(rn(reg), _FP_REGNO, swf_off(r0) + 8);
2191 jit_unget_reg_pair(reg);
2192 }
2193 else {
2194 reg = jit_get_reg(jit_class_gpr);
2195 ldxi_i(rn(reg), r1, 0);
2196 swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8);
2197 ldxi_i(rn(reg), r1, 4);
2198 swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 4);
2199 jit_unget_reg(reg);
2200 }
2201 }
2202 else if (!jit_thumb_p() && jit_armv5e_p() && !(r0 & 1))
2203 LDRDI(r0, r1, 0);
2204 else {
2205 ldxi_i(r0, r1, 0);
2206 ldxi_i(r0 + 1, r1, 4);
2207 }
2208 }
2209
2210 static void
_swf_ldi_f(jit_state_t * _jit,jit_int32_t r0,jit_word_t i0)2211 _swf_ldi_f(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
2212 {
2213 jit_int32_t reg;
2214 if (jit_fpr_p(r0)) {
2215 reg = jit_get_reg(jit_class_gpr);
2216 ldi_i(rn(reg), i0);
2217 swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8);
2218 jit_unget_reg(reg);
2219 }
2220 else
2221 ldi_i(r0, i0);
2222 }
2223
2224 static void
_swf_ldi_d(jit_state_t * _jit,jit_int32_t r0,jit_word_t i0)2225 _swf_ldi_d(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
2226 {
2227 jit_int32_t rg0, rg1;
2228 if (jit_fpr_p(r0) && !jit_thumb_p() && jit_armv5e_p() &&
2229 (rg0 = jit_get_reg_pair()) != JIT_NOREG) {
2230 movi(rn(rg0), i0);
2231 LDRDI(rn(rg0), rn(rg0), 0);
2232 STRDIN(rn(rg0), _FP_REGNO, swf_off(r0) + 8);
2233 jit_unget_reg_pair(rg0);
2234 }
2235 else {
2236 rg1 = jit_get_reg(jit_class_gpr);
2237 movi(rn(rg1), i0);
2238 if (jit_fpr_p(r0)) {
2239 rg0 = jit_get_reg(jit_class_gpr);
2240 ldxi_i(rn(rg0), rn(rg1), 0);
2241 swf_strin(rn(rg0), _FP_REGNO, swf_off(r0) + 8);
2242 ldxi_i(rn(rg0), rn(rg1), 4);
2243 swf_strin(rn(rg0), _FP_REGNO, swf_off(r0) + 4);
2244 jit_unget_reg(rg0);
2245 }
2246 else if (!jit_thumb_p() && jit_armv5e_p() && !(r0 & 1))
2247 LDRDI(r0, rn(rg1), 0);
2248 else {
2249 ldxi_i(r0, rn(rg1), 0);
2250 ldxi_i(r0 + 1, rn(rg1), 0);
2251 }
2252 jit_unget_reg(rg1);
2253 }
2254 }
2255
2256 static void
_swf_ldxr_f(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_int32_t r2)2257 _swf_ldxr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2258 {
2259 jit_int32_t reg;
2260 if (jit_fpr_p(r0)) {
2261 reg = jit_get_reg(jit_class_gpr);
2262 ldxr_i(rn(reg), r1, r2);
2263 swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8);
2264 jit_unget_reg(reg);
2265 }
2266 else
2267 ldxr_i(r0, r1, r2);
2268 }
2269
2270 static void
_swf_ldxr_d(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_int32_t r2)2271 _swf_ldxr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2272 {
2273 jit_int32_t rg0, rg1;
2274 if (jit_fpr_p(r0)) {
2275 if (!jit_thumb_p() && jit_armv5e_p() &&
2276 (rg0 = jit_get_reg_pair()) != JIT_NOREG) {
2277 LDRD(rn(rg0), r1, r2);
2278 STRDIN(rn(rg0), _FP_REGNO, swf_off(r0) + 8);
2279 jit_unget_reg_pair(rg0);
2280 }
2281 else {
2282 rg1 = jit_get_reg(jit_class_gpr);
2283 addr(rn(rg1), r1, r2);
2284 rg0 = jit_get_reg(jit_class_gpr);
2285 ldxi_i(rn(rg0), rn(rg1), 0);
2286 swf_strin(rn(rg0), _FP_REGNO, swf_off(r0) + 8);
2287 ldxi_i(rn(rg0), rn(rg1), 4);
2288 swf_strin(rn(rg0), _FP_REGNO, swf_off(r0) + 4);
2289 jit_unget_reg(rg0);
2290 jit_unget_reg(rg1);
2291 }
2292 }
2293 else {
2294 if (!jit_thumb_p() && jit_armv5e_p() && !(r0 & 1))
2295 LDRD(r0, r1, r2);
2296 else {
2297 rg1 = jit_get_reg(jit_class_gpr);
2298 addr(rn(rg1), r1, r2);
2299 ldxi_i(r0, rn(rg1), 0);
2300 ldxi_i(r0 + 1, rn(rg1), 4);
2301 jit_unget_reg(rg1);
2302 }
2303 }
2304 }
2305
2306 static void
_swf_ldxi_f(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_word_t i0)2307 _swf_ldxi_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2308 {
2309 jit_int32_t reg;
2310 if (jit_fpr_p(r0)) {
2311 reg = jit_get_reg(jit_class_gpr);
2312 ldxi_i(rn(reg), r1, i0);
2313 swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8);
2314 jit_unget_reg(reg);
2315 }
2316 else
2317 ldxi_i(r0, r1, i0);
2318 }
2319
2320 static void
_swf_ldxi_d(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_word_t i0)2321 _swf_ldxi_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2322 {
2323 jit_int32_t rg0, rg1;
2324 if (jit_fpr_p(r0)) {
2325 if (!jit_thumb_p() && jit_armv5e_p() &&
2326 ((i0 >= 0 && i0 <= 255) || (i0 < 0 && i0 >= -255)) &&
2327 (rg0 = jit_get_reg_pair()) != JIT_NOREG) {
2328 if (i0 >= 0)
2329 LDRDI(rn(rg0), r1, i0);
2330 else
2331 LDRDIN(rn(rg0), r1, -i0);
2332 STRDIN(rn(rg0), _FP_REGNO, swf_off(r0) + 8);
2333 jit_unget_reg_pair(rg0);
2334 }
2335 else if (i0 >= 0 && i0 + 4 <= 4095) {
2336 rg0 = jit_get_reg(jit_class_gpr);
2337 ldxi_i(rn(rg0), r1, i0);
2338 swf_strin(rn(rg0), _FP_REGNO, swf_off(r0) + 8);
2339 ldxi_i(rn(rg0), r1, i0 + 4);
2340 swf_strin(rn(rg0), _FP_REGNO, swf_off(r0) + 4);
2341 jit_unget_reg(rg0);
2342 }
2343 else if (i0 < 0 && ((jit_thumb_p() && i0 >= -255) ||
2344 (!jit_thumb_p() && i0 >= -4095))) {
2345 rg0 = jit_get_reg(jit_class_gpr);
2346 swf_ldrin(rn(rg0), r1, -i0);
2347 swf_strin(rn(rg0), _FP_REGNO, swf_off(r0) + 8);
2348 swf_ldrin(rn(rg0), r1, -(i0 + 4));
2349 swf_strin(rn(rg0), _FP_REGNO, swf_off(r0) + 4);
2350 jit_unget_reg(rg0);
2351 }
2352 else {
2353 rg0 = jit_get_reg(jit_class_gpr);
2354 rg1 = jit_get_reg(jit_class_gpr);
2355 addi(rn(rg1), r1, i0);
2356 ldxi_i(rn(rg0), rn(rg1), 0);
2357 swf_strin(rn(rg0), _FP_REGNO, swf_off(r0) + 8);
2358 ldxi_i(rn(rg0), rn(rg1), 4);
2359 swf_strin(rn(rg0), _FP_REGNO, swf_off(r0) + 4);
2360 jit_unget_reg(rg1);
2361 jit_unget_reg(rg0);
2362 }
2363 }
2364 else {
2365 if (!jit_thumb_p() && jit_armv5e_p() &&
2366 i0 >= 0 && i0 <= 255 && !(r0 & 1))
2367 LDRDI(r0, r1, i0);
2368 else if (!jit_thumb_p() && jit_armv5e_p() &&
2369 i0 < 0 && i0 >= -255 && !(r0 & 1))
2370 LDRDIN(r0, r1, -i0);
2371 else if (i0 >= 0 && i0 + 4 <= 4095) {
2372 ldxi_i(r0, r1, i0);
2373 ldxi_i(r0 + 1, r1, i0 + 4);
2374 }
2375 else if (i0 < 0 && i0 >= -4095) {
2376 swf_ldrin(r0, r1, -i0);
2377 swf_ldrin(r0 + 1, r1, -(i0 + 4));
2378 }
2379 else {
2380 rg0 = jit_get_reg(jit_class_gpr);
2381 addi(rn(rg0), r1, i0);
2382 ldxi_i(r0, rn(rg0), 0);
2383 ldxi_i(r0 + 1, rn(rg0), 4);
2384 jit_unget_reg(rg0);
2385 }
2386 }
2387 }
2388
2389 static void
_swf_str_f(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1)2390 _swf_str_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
2391 {
2392 jit_int32_t reg;
2393 if (jit_fpr_p(r1)) {
2394 reg = jit_get_reg(jit_class_gpr);
2395 swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 8);
2396 stxi_i(0, r0, rn(reg));
2397 jit_unget_reg(reg);
2398 }
2399 else
2400 str_i(r0, r1);
2401 }
2402
2403 static void
_swf_str_d(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1)2404 _swf_str_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
2405 {
2406 jit_int32_t reg;
2407 if (jit_fpr_p(r1)) {
2408 if (!jit_thumb_p() && jit_armv5e_p() &&
2409 (reg = jit_get_reg_pair()) != JIT_NOREG) {
2410 LDRDIN(rn(reg), _FP_REGNO, swf_off(r1) + 8);
2411 STRDI(rn(reg), r0, 0);
2412 jit_unget_reg_pair(reg);
2413 }
2414 else {
2415 reg = jit_get_reg(jit_class_gpr);
2416 swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 8);
2417 stxi_i(0, r0, rn(reg));
2418 swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 4);
2419 stxi_i(4, r0, rn(reg));
2420 jit_unget_reg(reg);
2421 }
2422 }
2423 else {
2424 if (!jit_thumb_p() && jit_armv5e_p() && !(r1 & 1))
2425 STRDI(r1, r0, 0);
2426 else {
2427 stxi_i(0, r0, r1);
2428 stxi_i(4, r0, r1 + 1);
2429 }
2430 }
2431 }
2432
2433 static void
_swf_sti_f(jit_state_t * _jit,jit_word_t i0,jit_int32_t r0)2434 _swf_sti_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
2435 {
2436 jit_int32_t reg;
2437 if (jit_fpr_p(r0)) {
2438 reg = jit_get_reg(jit_class_gpr);
2439 swf_ldrin(rn(reg), _FP_REGNO, swf_off(r0) + 8);
2440 sti_i(i0, rn(reg));
2441 jit_unget_reg(reg);
2442 }
2443 else
2444 sti_i(i0, r0);
2445 }
2446
2447 static void
_swf_sti_d(jit_state_t * _jit,jit_word_t i0,jit_int32_t r0)2448 _swf_sti_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
2449 {
2450 jit_int32_t rg0, rg1;
2451 if (jit_fpr_p(r0)) {
2452 if (!jit_thumb_p() && jit_armv5e_p() &&
2453 (rg0 = jit_get_reg_pair()) != JIT_NOREG) {
2454 rg1 = jit_get_reg(jit_class_gpr);
2455 movi(rn(rg1), i0);
2456 LDRDIN(rn(rg0), _FP_REGNO, swf_off(r0) + 8);
2457 STRDI(rn(rg0), rn(rg1), 0);
2458 jit_unget_reg(rg1);
2459 jit_unget_reg_pair(rg0);
2460 }
2461 else {
2462 rg1 = jit_get_reg(jit_class_gpr);
2463 movi(rn(rg1), i0);
2464 rg0 = jit_get_reg(jit_class_gpr);
2465 swf_ldrin(rn(rg0), _FP_REGNO, swf_off(r0) + 8);
2466 stxi_i(0, rn(rg1), rn(rg0));
2467 swf_ldrin(rn(rg0), _FP_REGNO, swf_off(r0) + 4);
2468 stxi_i(4, rn(rg1), rn(rg0));
2469 jit_unget_reg(rg1);
2470 jit_unget_reg(rg0);
2471 }
2472 }
2473 else {
2474 rg1 = jit_get_reg(jit_class_gpr);
2475 movi(rn(rg1), i0);
2476 if (!jit_thumb_p() && jit_armv5e_p() && !(r0 & 1))
2477 STRDI(r0, rn(rg1), 0);
2478 else {
2479 stxi_i(0, rn(rg1), r0);
2480 stxi_i(4, rn(rg1), r0 + 1);
2481 }
2482 jit_unget_reg(rg1);
2483 }
2484 }
2485
2486 static void
_swf_stxr_f(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_int32_t r2)2487 _swf_stxr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2488 {
2489 jit_int32_t reg;
2490 if (jit_fpr_p(r2)) {
2491 reg = jit_get_reg(jit_class_gpr);
2492 swf_ldrin(rn(reg), _FP_REGNO, swf_off(r2) + 8);
2493 stxr_i(r1, r0, rn(reg));
2494 jit_unget_reg(reg);
2495 }
2496 else
2497 stxr_i(r0, r1, r2);
2498 }
2499
2500 static void
_swf_stxr_d(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1,jit_int32_t r2)2501 _swf_stxr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2502 {
2503 jit_int32_t rg0, rg1;
2504 if (jit_fpr_p(r2)) {
2505 if (!jit_thumb_p() && jit_armv5e_p() &&
2506 (rg0 = jit_get_reg_pair()) != JIT_NOREG) {
2507 LDRDIN(rn(rg0), _FP_REGNO, swf_off(r2) + 8);
2508 STRD(rn(rg0), r0, r1);
2509 jit_unget_reg_pair(rg0);
2510 }
2511 else {
2512 rg1 = jit_get_reg(jit_class_gpr);
2513 addr(rn(rg1), r0, r1);
2514 rg0 = jit_get_reg(jit_class_gpr);
2515 swf_ldrin(rn(rg0), _FP_REGNO, swf_off(r2) + 8);
2516 stxi_i(0, rn(rg1), rn(rg0));
2517 swf_ldrin(rn(rg0), _FP_REGNO, swf_off(r2) + 4);
2518 stxi_i(4, rn(rg1), rn(rg0));
2519 jit_unget_reg(rg0);
2520 jit_unget_reg(rg1);
2521 }
2522 }
2523 else {
2524 if (!jit_thumb_p() && jit_armv5e_p() && !(r2 & 1))
2525 STRD(r0, r1, r2);
2526 else {
2527 rg1 = jit_get_reg(jit_class_gpr);
2528 addr(rn(rg1), r0, r1);
2529 stxi_i(0, rn(rg1), r2);
2530 stxi_i(4, rn(rg1), r2 + 1);
2531 jit_unget_reg(rg1);
2532 }
2533 }
2534 }
2535
2536 static void
_swf_stxi_f(jit_state_t * _jit,jit_word_t i0,jit_int32_t r0,jit_int32_t r1)2537 _swf_stxi_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2538 {
2539 jit_int32_t reg;
2540 if (jit_fpr_p(r1)) {
2541 reg = jit_get_reg(jit_class_gpr);
2542 swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 8);
2543 stxi_i(i0, r0, rn(reg));
2544 jit_unget_reg(reg);
2545 }
2546 else
2547 stxi_i(i0, r0, r1);
2548 }
2549
2550 static void
_swf_stxi_d(jit_state_t * _jit,jit_word_t i0,jit_int32_t r0,jit_int32_t r1)2551 _swf_stxi_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2552 {
2553 jit_int32_t rg0, rg1;
2554 if (jit_fpr_p(r1)) {
2555 if (!jit_thumb_p() && jit_armv5e_p() &&
2556 ((i0 >= 0 && i0 <= 255) || (i0 < 0 && i0 >= -255)) &&
2557 (rg0 = jit_get_reg_pair()) != JIT_NOREG) {
2558 LDRDIN(rn(rg0), _FP_REGNO, swf_off(r1) + 8);
2559 if (i0 >= 0 && i0 <= 255)
2560 STRDI(rn(rg0), r0, i0);
2561 else
2562 STRDIN(rn(rg0), r0, -i0);
2563 jit_unget_reg_pair(rg0);
2564 }
2565 else if (i0 >= 0 && i0 + 4 <= 4095) {
2566 rg0 = jit_get_reg(jit_class_gpr);
2567 swf_ldrin(rn(rg0), _FP_REGNO, swf_off(r1) + 8);
2568 stxi_i(i0, r0, rn(rg0));
2569 swf_ldrin(rn(rg0), _FP_REGNO, swf_off(r1) + 4);
2570 stxi_i(i0 + 4, r0, rn(rg0));
2571 jit_unget_reg(rg0);
2572 }
2573 else if (i0 < 0 && ((jit_thumb_p() && i0 >= -255) ||
2574 (!jit_thumb_p() && i0 >= -4095))) {
2575 rg0 = jit_get_reg(jit_class_gpr);
2576 swf_ldrin(rn(rg0), _FP_REGNO, swf_off(r1) + 8);
2577 swf_strin(rn(rg0), r0, -i0);
2578 swf_ldrin(rn(rg0), _FP_REGNO, swf_off(r1) + 4);
2579 swf_strin(rn(rg0), r0, -(i0 + 4));
2580 jit_unget_reg(rg0);
2581 }
2582 else {
2583 rg1 = jit_get_reg(jit_class_gpr);
2584 addi(rn(rg1), r0, i0);
2585 rg0 = jit_get_reg(jit_class_gpr);
2586 swf_ldrin(rn(rg0), _FP_REGNO, swf_off(r1) + 8);
2587 stxi_i(0, rn(rg1), rn(rg0));
2588 swf_ldrin(rn(rg0), _FP_REGNO, swf_off(r1) + 4);
2589 stxi_i(4, rn(rg1), rn(rg0));
2590 jit_unget_reg(rg0);
2591 jit_unget_reg(rg1);
2592 }
2593 }
2594 else {
2595 if (!jit_thumb_p() && jit_armv5e_p() &&
2596 i0 >= 0 && i0 <= 255 && !(r1 & 1))
2597 STRDI(r1, r0, i0);
2598 else if (!jit_thumb_p() && jit_armv5e_p() &&
2599 i0 < 0 && i0 >= -255 && !(r1 & 1))
2600 STRDIN(r1, r0, -i0);
2601 else if (i0 >= 0 && i0 + 4 <= 4095) {
2602 stxi_i(i0, r0, r1);
2603 stxi_i(i0 + 4, r0, r1 + 1);
2604 }
2605 else if (i0 < 0 && ((jit_thumb_p() && i0 >= 255) ||
2606 (!jit_thumb_p() && i0 >= -4095))) {
2607 swf_strin(r1, r0, -i0);
2608 swf_strin(r1 + 1, r0, -(i0 + 4));
2609 }
2610 else {
2611 rg1 = jit_get_reg(jit_class_gpr);
2612 addi(rn(rg1), r0, i0);
2613 stxi_i(0, rn(rg1), r1);
2614 stxi_i(4, rn(rg1), r1 + 1);
2615 jit_unget_reg(rg1);
2616 }
2617 }
2618 }
2619
2620 static void
_swf_vaarg_d(jit_state_t * _jit,jit_int32_t r0,jit_int32_t r1)2621 _swf_vaarg_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
2622 {
2623 jit_int32_t reg;
2624
2625 assert(_jitc->function->self.call & jit_call_varargs);
2626
2627 /* Adjust pointer. */
2628 reg = jit_get_reg(jit_class_gpr);
2629 andi(rn(reg), r1, 7);
2630 addr(r1, r1, rn(reg));
2631 jit_unget_reg(reg);
2632
2633 /* Load argument. */
2634 swf_ldr_d(r0, r1);
2635
2636 /* Update stack pointer. */
2637 addi(r1, r1, sizeof(jit_float64_t));
2638 }
2639
2640 #endif
2641