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
22 # define x87_address_p(i0) 1
25 # define x87_address_p(i0) ((jit_word_t)(i0) >= 0)
27 # define x87_address_p(i0) can_sign_extend_int_p(i0)
37 # define x87rx(code, md, rb, ri, ms) _x87rx(_jit, code, md, rb, ri, ms)
38 # define fldcwm(md, rb, ri, ms) x87rx(015, md, rb, ri, ms)
39 # define fstcwm(md, rb, ri, ms) _fstcwm(_jit, md, rb, ri, ms)
41 _fstcwm(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t, jit_int32_t);
42 # define fldsm(md, rb, ri, ms) x87rx(010, md, rb, ri, ms)
43 # define fstsm(md, rb, ri, ms) x87rx(012, md, rb, ri, ms)
44 # define fldlm(md, rb, ri, ms) x87rx(050, md, rb, ri, ms)
45 # define fstlm(md, rb, ri, ms) x87rx(052, md, rb, ri, ms)
46 # define fisttplm(md, rb, ri, ms) x87rx(031, md, rb, ri, ms)
47 # define fistlm(md, rb, ri, ms) x87rx(032, md, rb, ri, ms)
48 # define fisttpqm(md, rb, ri, ms) x87rx(071, md, rb, ri, ms)
49 # define fildlm(md, rb, ri, ms) x87rx(030, md, rb,ri, ms)
50 # define fildqm(md, rb, ri, ms) x87rx(075, md, rb,ri, ms)
52 _x87rx(jit_state_t*, jit_int32_t, jit_int32_t,
53 jit_int32_t, jit_int32_t, jit_int32_t);
54 # define x87ri(cc,r0) _x87ri(_jit,cc,r0)
55 # define fchs_() x87ri(014, 0)
56 # define fabs_() x87ri(014, 1)
57 # define fld1() x87ri(015, 0)
58 # define fldl2t() x87ri(015, 1)
59 # define fldl2e() x87ri(015, 2)
60 # define fldpi() x87ri(015, 3)
61 # define fldlg2() x87ri(015, 4)
62 # define fldln2() x87ri(015, 5)
63 # define fldz() x87ri(015, 6)
64 # define fsqrt_() x87ri(017, 2)
65 # define fldr(r0) x87ri(010, r0)
66 # define fxchr(r0) x87ri(011, r0)
67 # define fstr(r0) x87ri(052, r0)
68 # define fstpr(r0) x87ri(053, r0)
69 # define fucomir(r0) x87ri(035, r0)
70 # define fucomipr(r0) x87ri(075, r0)
71 static void _x87ri(jit_state_t*, jit_int32_t, jit_int32_t);
72 # define faddr(r0, r1) x87rri(000, r0, r1)
73 # define fmulr(r0, r1) x87rri(001, r0, r1)
74 # define fsubr(r0, r1) x87rri(004, r0, r1)
75 # define fsubrr(r0, r1) x87rri(005, r0, r1)
76 # define fdivr(r0, r1) x87rri(006, r0, r1)
77 # define fdivrr(r0, r1) x87rri(007, r0, r1)
78 # define x87rri(cc, r0, r1) _x87rri(_jit, cc, r0, r1)
79 static void _x87rri(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
80 # define x87_addr_f(r0, r1, r2) _x87_addr_d(_jit, r0, r1, r2)
81 # define x87_addi_f(r0, r1, i0) _x87_addi_f(_jit, r0, r1, i0)
82 static void _x87_addi_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
83 # define x87_addr_d(r0, r1, r2) _x87_addr_d(_jit, r0, r1, r2)
84 static void _x87_addr_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
85 # define x87_addi_d(r0, r1, i0) _x87_addi_d(_jit, r0, r1, i0)
86 static void _x87_addi_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
87 # define x87_subr_f(r0, r1, r2) _x87_subr_d(_jit, r0, r1, r2)
88 # define x87_subi_f(r0, r1, i0) _x87_subi_f(_jit, r0, r1, i0)
89 static void _x87_subi_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
90 # define x87_subr_d(r0, r1, r2) _x87_subr_d(_jit, r0, r1, r2)
91 static void _x87_subr_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
92 # define x87_subi_d(r0, r1, i0) _x87_subi_d(_jit, r0, r1, i0)
93 static void _x87_subi_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
94 # define x87_rsbr_f(r0, r1, r2) x87_subr_f(r0, r2, r1)
95 # define x87_rsbi_f(r0, r1, i0) _x87_rsbi_f(_jit, r0, r1, i0)
96 static void _x87_rsbi_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
97 # define x87_rsbr_d(r0, r1, r2) x87_subr_d(r0, r2, r1)
98 # define x87_rsbi_d(r0, r1, i0) _x87_rsbi_d(_jit, r0, r1, i0)
99 static void _x87_rsbi_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
100 # define x87_mulr_f(r0, r1, r2) _x87_mulr_d(_jit, r0, r1, r2)
101 # define x87_muli_f(r0, r1, i0) _x87_muli_f(_jit, r0, r1, i0)
102 static void _x87_muli_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
103 # define x87_mulr_d(r0, r1, r2) _x87_mulr_d(_jit, r0, r1, r2)
104 static void _x87_mulr_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
105 # define x87_muli_d(r0, r1, i0) _x87_muli_d(_jit, r0, r1, i0)
106 static void _x87_muli_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
107 # define x87_divr_f(r0, r1, r2) _x87_divr_d(_jit, r0, r1, r2)
108 # define x87_divi_f(r0, r1, i0) _x87_divi_f(_jit, r0, r1, i0)
109 static void _x87_divi_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
110 # define x87_divr_d(r0, r1, r2) _x87_divr_d(_jit, r0, r1, r2)
111 static void _x87_divr_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
112 # define x87_divi_d(r0, r1, i0) _x87_divi_d(_jit, r0, r1, i0)
113 static void _x87_divi_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
114 # define x87_absr_f(r0, r1) _x87_absr_d(_jit, r0, r1)
115 # define x87_absr_d(r0, r1) _x87_absr_d(_jit, r0, r1)
116 static void _x87_absr_d(jit_state_t*, jit_int32_t, jit_int32_t);
117 # define x87_negr_f(r0, r1) _x87_negr_d(_jit, r0, r1)
118 # define x87_negr_d(r0, r1) _x87_negr_d(_jit, r0, r1)
119 static void _x87_negr_d(jit_state_t*, jit_int32_t, jit_int32_t);
120 # define x87_sqrtr_f(r0, r1) _x87_sqrtr_d(_jit, r0, r1)
121 # define x87_sqrtr_d(r0, r1) _x87_sqrtr_d(_jit, r0, r1)
122 static void _x87_sqrtr_d(jit_state_t*, jit_int32_t, jit_int32_t);
123 # define x87_fmar_f(r0, r1, r2, r3) _x87_fmar_f(_jit, r0, r1, r2, r3)
124 static void _x87_fmar_f(jit_state_t*,
125 jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t);
126 # define x87_fmar_d(r0, r1, r2, r3) _x87_fmar_d(_jit, r0, r1, r2, r3)
127 static void _x87_fmar_d(jit_state_t*,
128 jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t);
129 # define x87_fmsr_f(r0, r1, r2, r3) _x87_fmsr_f(_jit, r0, r1, r2, r3)
130 static void _x87_fmsr_f(jit_state_t*,
131 jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t);
132 # define x87_fmsr_d(r0, r1, r2, r3) _x87_fmsr_d(_jit, r0, r1, r2, r3)
133 static void _x87_fmsr_d(jit_state_t*,
134 jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t);
135 # define x87_fnmar_f(r0, r1, r2, r3) _x87_fnmar_f(_jit, r0, r1, r2, r3)
136 static void _x87_fnmar_f(jit_state_t*,
137 jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t);
138 # define x87_fnmar_d(r0, r1, r2, r3) _x87_fnmar_d(_jit, r0, r1, r2, r3)
139 static void _x87_fnmar_d(jit_state_t*,
140 jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t);
141 # define x87_fnmsr_f(r0, r1, r2, r3) _x87_fnmsr_f(_jit, r0, r1, r2, r3)
142 static void _x87_fnmsr_f(jit_state_t*,
143 jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t);
144 # define x87_fnmsr_d(r0, r1, r2, r3) _x87_fnmsr_d(_jit, r0, r1, r2, r3)
145 static void _x87_fnmsr_d(jit_state_t*,
146 jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t);
147 # define x87_truncr_f_i(r0, r1) _x87_truncr_d_i(_jit, r0, r1)
148 # define x87_truncr_d_i(r0, r1) _x87_truncr_d_i(_jit, r0, r1)
149 static void _x87_truncr_d_i(jit_state_t*, jit_int32_t, jit_int32_t);
151 # define x87_truncr_f_l(r0, r1) _x87_truncr_d_l(_jit, r0, r1)
152 # define x87_truncr_d_l(r0, r1) _x87_truncr_d_l(_jit, r0, r1)
153 static void _x87_truncr_d_l(jit_state_t*, jit_int32_t, jit_int32_t);
155 # define x87_extr_f(r0, r1) _x87_extr_d(_jit, r0, r1)
156 # define x87_extr_d(r0, r1) _x87_extr_d(_jit, r0, r1)
157 # define x87_extr_f_d(r0, r1) x87_movr_d(r0, r1)
158 # define x87_extr_d_f(r0, r1) x87_movr_d(r0, r1)
159 static void _x87_extr_d(jit_state_t*, jit_int32_t, jit_int32_t);
160 # define x87cmp(code, r0, r1, r2) _x87cmp(_jit, code, r0, r1, r2)
162 _x87cmp(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t, jit_int32_t);
163 # define x87cmp2(code, r0, r1, r2) _x87cmp2(_jit, code, r0, r1, r2)
165 _x87cmp2(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t, jit_int32_t);
166 # define x87jcc(code, i0, r0, r1) _x87jcc(_jit, code, i0, r0, r1)
168 _x87jcc(jit_state_t*, jit_int32_t, jit_word_t, jit_int32_t, jit_int32_t);
169 # define x87jcc2(code, i0, r0, r1) _x87jcc2(_jit, code, i0, r0, r1)
171 _x87jcc2(jit_state_t*, jit_int32_t, jit_word_t, jit_int32_t, jit_int32_t);
172 #define x87_movi_f(r0,i0) _x87_movi_f(_jit,r0,i0)
173 static void _x87_movi_f(jit_state_t*, jit_int32_t, jit_float32_t*);
174 #define x87_movr_w_f(r0,r1) _x87_movr_w_f(_jit,r0,r1)
175 static void _x87_movr_w_f(jit_state_t*, jit_int32_t, jit_int32_t);
176 #define x87_movr_f_w(r0,r1) _x87_movr_f_w(_jit,r0,r1)
177 static void _x87_movr_f_w(jit_state_t*, jit_int32_t, jit_int32_t);
178 #define x87_movi_w_f(r0, i0) _x87_movi_w_f(_jit, r0, i0)
179 static void _x87_movi_w_f(jit_state_t*, jit_int32_t, jit_word_t);
180 # define x87_ldr_f(r0, r1) _x87_ldr_f(_jit, r0, r1)
181 static void _x87_ldr_f(jit_state_t*, jit_int32_t, jit_int32_t);
182 # define x87_ldi_f(r0, i0) _x87_ldi_f(_jit, r0, i0)
183 static void _x87_ldi_f(jit_state_t*, jit_int32_t, jit_word_t);
184 # define x87_ldxr_f(r0, r1, r2) _x87_ldxr_f(_jit, r0, r1, r2)
185 static void _x87_ldxr_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
186 # define x87_ldxi_f(r0, r1, i0) _x87_ldxi_f(_jit, r0, r1, i0)
187 static void _x87_ldxi_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
188 # define x87_unldr_x(r0, r1, i0) _x87_unldr_x(_jit, r0, r1, i0)
189 static void _x87_unldr_x(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
190 # define x87_unldi_x(r0, i0, i1) _x87_unldi_x(_jit, r0, i0, i1)
191 static void _x87_unldi_x(jit_state_t*, jit_int32_t, jit_word_t, jit_word_t);
192 # define x87_str_f(r0, r1) _x87_str_f(_jit, r0, r1)
193 static void _x87_str_f(jit_state_t*,jit_int32_t,jit_int32_t);
194 # define x87_sti_f(i0, r0) _x87_sti_f(_jit, i0, r0)
195 static void _x87_sti_f(jit_state_t*,jit_word_t, jit_int32_t);
196 # define x87_stxr_f(r0, r1, r2) _x87_stxr_f(_jit, r0, r1, r2)
197 static void _x87_stxr_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
198 # define x87_stxi_f(i0, r0, r1) _x87_stxi_f(_jit, i0, r0, r1)
199 static void _x87_stxi_f(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
200 #define x87_unstr_x(r0, r1, i0) _x87_unstr_x(_jit, r0, r1, i0)
201 static void _x87_unstr_x(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
202 #define x87_unsti_x(i0, r0, i1) _x87_unsti_x(_jit, i0, r0, i1)
203 static void _x87_unsti_x(jit_state_t*, jit_word_t, jit_int32_t, jit_word_t);
204 # define x87_ltr_f(r0, r1, r2) x87cmp(X86_CC_A, r0, r2, r1)
205 # define x87_lti_f(r0, r1, i0) _x87_lti_f(_jit, r0, r1, i0)
206 static void _x87_lti_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
207 # define x87_ler_f(r0, r1, r2) x87cmp(X86_CC_AE, r0, r2, r1)
208 # define x87_lei_f(r0, r1, i0) _x87_lei_f(_jit, r0, r1, i0)
209 static void _x87_lei_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
210 # define x87_eqr_f(r0, r1, r2) x87_eqr_d(r0, r2, r1)
211 # define x87_eqi_f(r0, r1, i0) _x87_eqi_f(_jit, r0, r1, i0)
212 static void _x87_eqi_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
213 # define x87_ger_f(r0, r1, r2) x87cmp(X86_CC_AE, r0, r1, r2)
214 # define x87_gei_f(r0, r1, i0) _x87_gei_f(_jit, r0, r1, i0)
215 static void _x87_gei_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
216 # define x87_gtr_f(r0, r1, r2) x87cmp(X86_CC_A, r0, r1, r2)
217 # define x87_gti_f(r0, r1, i0) _x87_gti_f(_jit, r0, r1, i0)
218 static void _x87_gti_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
219 # define x87_ner_f(r0, r1, r2) x87_ner_d(r0, r2, r1)
220 # define x87_nei_f(r0, r1, i0) _x87_nei_f(_jit, r0, r1, i0)
221 static void _x87_nei_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
222 # define x87_unltr_f(r0, r1, r2) x87cmp(X86_CC_NAE, r0, r1, r2)
223 # define x87_unlti_f(r0, r1, i0) _x87_unlti_f(_jit, r0, r1, i0)
224 static void _x87_unlti_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
225 # define x87_unler_f(r0, r1, r2) x87cmp(X86_CC_NA, r0, r1, r2)
226 # define x87_unlei_f(r0, r1, i0) _x87_unlei_f(_jit, r0, r1, i0)
227 static void _x87_unlei_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
228 # define x87_uneqr_f(r0, r1, r2) x87cmp2(X86_CC_E, r0, r1, r2)
229 # define x87_uneqi_f(r0, r1, i0) _x87_uneqi_f(_jit, r0, r1, i0)
230 static void _x87_uneqi_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
231 # define x87_unger_f(r0, r1, r2) x87cmp(X86_CC_NA, r0, r2, r1)
232 # define x87_ungei_f(r0, r1, i0) _x87_ungei_f(_jit, r0, r1, i0)
233 static void _x87_ungei_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
234 # define x87_ungtr_f(r0, r1, r2) x87cmp(X86_CC_NAE, r0, r2, r1)
235 # define x87_ungti_f(r0, r1, i0) _x87_ungti_f(_jit, r0, r1, i0)
236 static void _x87_ungti_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
237 # define x87_ltgtr_f(r0, r1, r2) x87_ltgtr_d(r0, r1, r2)
238 # define x87_ltgti_f(r0, r1, i0) _x87_ltgti_f(_jit, r0, r1, i0)
239 static void _x87_ltgti_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
240 # define x87_ordr_f(r0, r1, r2) x87cmp2(X86_CC_NP, r0, r2, r1)
241 # define x87_ordi_f(r0, r1, i0) _x87_ordi_f(_jit, r0, r1, i0)
242 static void _x87_ordi_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
243 # define x87_unordr_f(r0, r1, r2) x87cmp2(X86_CC_P, r0, r2, r1)
244 # define x87_unordi_f(r0, r1, i0) _x87_unordi_f(_jit, r0, r1, i0)
245 static void _x87_unordi_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
246 # define x87_ltr_d(r0, r1, r2) x87cmp(X86_CC_A, r0, r2, r1)
247 # define x87_lti_d(r0, r1, i0) _x87_lti_d(_jit, r0, r1, i0)
248 static void _x87_lti_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
249 # define x87_ler_d(r0, r1, r2) x87cmp(X86_CC_AE, r0, r2, r1)
250 # define x87_lei_d(r0, r1, i0) _x87_lei_d(_jit, r0, r1, i0)
251 static void _x87_lei_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
252 # define x87_eqr_d(r0, r1, r2) _x87_eqr_d(_jit, r0, r2, r1)
253 static void _x87_eqr_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
254 # define x87_eqi_d(r0, r1, i0) _x87_eqi_d(_jit, r0, r1, i0)
255 static void _x87_eqi_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
256 # define x87_ger_d(r0, r1, r2) x87cmp(X86_CC_AE, r0, r1, r2)
257 # define x87_gei_d(r0, r1, i0) _x87_gei_d(_jit, r0, r1, i0)
258 static void _x87_gei_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
259 # define x87_gtr_d(r0, r1, r2) x87cmp(X86_CC_A, r0, r1, r2)
260 # define x87_gti_d(r0, r1, i0) _x87_gti_d(_jit, r0, r1, i0)
261 static void _x87_gti_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
262 # define x87_ner_d(r0, r1, r2) _x87_ner_d(_jit, r0, r2, r1)
263 static void _x87_ner_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
264 # define x87_nei_d(r0, r1, i0) _x87_nei_d(_jit, r0, r1, i0)
265 static void _x87_nei_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
266 # define x87_unltr_d(r0, r1, r2) x87cmp(X86_CC_NAE, r0, r1, r2)
267 # define x87_unlti_d(r0, r1, i0) _x87_unlti_d(_jit, r0, r1, i0)
268 static void _x87_unlti_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
269 # define x87_unler_d(r0, r1, r2) x87cmp(X86_CC_NA, r0, r1, r2)
270 # define x87_unlei_d(r0, r1, i0) _x87_unlei_d(_jit, r0, r1, i0)
271 static void _x87_unlei_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
272 # define x87_uneqr_d(r0, r1, r2) x87cmp2(X86_CC_E, r0, r1, r2)
273 # define x87_uneqi_d(r0, r1, i0) _x87_uneqi_d(_jit, r0, r1, i0)
274 static void _x87_uneqi_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
275 # define x87_unger_d(r0, r1, r2) x87cmp(X86_CC_NA, r0, r2, r1)
276 # define x87_ungei_d(r0, r1, i0) _x87_ungei_d(_jit, r0, r1, i0)
277 static void _x87_ungei_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
278 # define x87_ungtr_d(r0, r1, r2) x87cmp(X86_CC_NAE, r0, r2, r1)
279 # define x87_ungti_d(r0, r1, i0) _x87_ungti_d(_jit, r0, r1, i0)
280 static void _x87_ungti_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
281 # define x87_ltgtr_d(r0, r1, r2) _x87_ltgtr_d(_jit, r0, r1, r2)
282 static void _x87_ltgtr_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
283 # define x87_ltgti_d(r0, r1, i0) _x87_ltgti_d(_jit, r0, r1, i0)
284 static void _x87_ltgti_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
285 # define x87_ordr_d(r0, r1, r2) x87cmp2(X86_CC_NP, r0, r2, r1)
286 # define x87_ordi_d(r0, r1, i0) _x87_ordi_d(_jit, r0, r1, i0)
287 static void _x87_ordi_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
288 # define x87_unordr_d(r0, r1, r2) x87cmp2(X86_CC_P, r0, r2, r1)
289 # define x87_unordi_d(r0, r1, i0) _x87_unordi_d(_jit, r0, r1, i0)
290 static void _x87_unordi_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
291 #define x87_movr_f(r0,r1) _x87_movr_d(_jit,r0,r1)
292 #define x87_movr_d(r0,r1) _x87_movr_d(_jit,r0,r1)
293 static void _x87_movr_d(jit_state_t*, jit_int32_t, jit_int32_t);
294 #define x87_movi_d(r0,i0) _x87_movi_d(_jit,r0,i0)
295 static void _x87_movi_d(jit_state_t*, jit_int32_t, jit_float64_t*);
296 #if __X32 || __X64_32
297 # define x87_movr_ww_d(r0,r1,r2) _x87_movr_ww_d(_jit,r0,r1,r2)
298 static void _x87_movr_ww_d(jit_state_t*, jit_int32_t, jit_int32_t,jit_int32_t);
299 # define x87_movr_d_ww(r0,r1,r2) _x87_movr_d_ww(_jit,r0,r1,r2)
300 static void _x87_movr_d_ww(jit_state_t*, jit_int32_t, jit_int32_t,jit_int32_t);
301 # define x87_movi_ww_d(r0, i0, i1) _x87_movi_ww_d(_jit, r0, i0, i1)
302 static void _x87_movi_ww_d(jit_state_t*, jit_int32_t, jit_word_t, jit_word_t);
304 # define x87_movr_w_d(r0,r1) _x87_movr_w_d(_jit,r0,r1)
305 static void _x87_movr_w_d(jit_state_t*, jit_int32_t, jit_int32_t);
306 # define x87_movr_d_w(r0,r1) _x87_movr_d_w(_jit,r0,r1)
307 static void _x87_movr_d_w(jit_state_t*, jit_int32_t, jit_int32_t);
308 #define x87_movi_w_d(r0, i0) _x87_movi_w_d(_jit, r0, i0)
309 static void _x87_movi_w_d(jit_state_t*, jit_int32_t, jit_word_t);
311 # define x87_ldr_d(r0, r1) _x87_ldr_d(_jit, r0, r1)
312 static void _x87_ldr_d(jit_state_t*, jit_int32_t, jit_int32_t);
313 # define x87_ldi_d(r0, i0) _x87_ldi_d(_jit, r0, i0)
314 static void _x87_ldi_d(jit_state_t*, jit_int32_t, jit_word_t);
315 # define x87_ldxr_d(r0, r1, r2) _x87_ldxr_d(_jit, r0, r1, r2)
316 static void _x87_ldxr_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
317 # define x87_ldxi_d(r0, r1, i0) _x87_ldxi_d(_jit, r0, r1, i0)
318 static void _x87_ldxi_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
319 # define x87_str_d(r0, r1) _x87_str_d(_jit, r0, r1)
320 static void _x87_str_d(jit_state_t*,jit_int32_t,jit_int32_t);
321 # define x87_sti_d(i0, r0) _x87_sti_d(_jit, i0, r0)
322 static void _x87_sti_d(jit_state_t*,jit_word_t,jit_int32_t);
323 # define x87_stxr_d(r0, r1, r2) _x87_stxr_d(_jit, r0, r1, r2)
324 static void _x87_stxr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
325 # define x87_stxi_d(i0, r0, r1) _x87_stxi_d(_jit, i0, r0, r1)
326 static void _x87_stxi_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
327 # define x87_bltr_f(i0, r0, r1) x87jcc(X86_CC_A, i0, r1, r0)
328 # define x87_blti_f(i0, r0, i1) _x87_blti_f(_jit, i0, r0, i1)
330 _x87_blti_f(jit_state_t*, jit_word_t, jit_int32_t, jit_float32_t*);
331 # define x87_bler_f(i0, r0, r1) x87jcc(X86_CC_AE, i0, r1, r0)
332 # define x87_blei_f(i0, r0, i1) _x87_blei_f(_jit, i0, r0, i1)
334 _x87_blei_f(jit_state_t*, jit_word_t, jit_int32_t, jit_float32_t*);
335 # define x87_beqr_f(i0, r0, r1) _x87_beqr_d(_jit, i0, r0, r1)
336 # define x87_beqi_f(i0, r0, i1) _x87_beqi_f(_jit, i0, r0, i1)
338 _x87_beqi_f(jit_state_t*, jit_word_t, jit_int32_t, jit_float32_t*);
339 # define x87_bger_f(i0, r0, r1) x87jcc(X86_CC_AE, i0, r0, r1)
340 # define x87_bgei_f(i0, r0, i1) _x87_bgei_f(_jit, i0, r0, i1)
342 _x87_bgei_f(jit_state_t*, jit_word_t, jit_int32_t, jit_float32_t*);
343 # define x87_bgtr_f(i0, r0, r1) x87jcc(X86_CC_A, i0, r0, r1)
344 # define x87_bgti_f(i0, r0, i1) _x87_bgti_f(_jit, i0, r0, i1)
346 _x87_bgti_f(jit_state_t*, jit_word_t, jit_int32_t, jit_float32_t*);
347 # define x87_bner_f(i0, r0, r1) _x87_bner_d(_jit, i0, r0, r1)
348 # define x87_bnei_f(i0, r0, i1) _x87_bnei_f(_jit, i0, r0, i1)
350 _x87_bnei_f(jit_state_t*, jit_word_t, jit_int32_t, jit_float32_t*);
351 # define x87_bunltr_f(i0, r0, r1) x87jcc(X86_CC_NAE, i0, r0, r1)
352 # define x87_bunlti_f(i0, r0, i1) _x87_bunlti_f(_jit, i0, r0, i1)
354 _x87_bunlti_f(jit_state_t*, jit_word_t, jit_int32_t, jit_float32_t*);
355 # define x87_bunler_f(i0, r0, r1) x87jcc(X86_CC_NA, i0, r0, r1)
356 # define x87_bunlei_f(i0, r0, i1) _x87_bunlei_f(_jit, i0, r0, i1)
358 _x87_bunlei_f(jit_state_t*, jit_word_t, jit_int32_t, jit_float32_t*);
359 # define x87_buneqr_f(i0, r0, r1) x87jcc2(X86_CC_E, i0, r0, r1)
360 # define x87_buneqi_f(i0, r0, i1) _x87_buneqi_f(_jit, i0, r0, i1)
362 _x87_buneqi_f(jit_state_t*, jit_word_t, jit_int32_t, jit_float32_t*);
363 # define x87_bunger_f(i0, r0, r1) x87jcc(X86_CC_NA, i0, r1, r0)
364 # define x87_bungei_f(i0, r0, i1) _x87_bungei_f(_jit, i0, r0, i1)
366 _x87_bungei_f(jit_state_t*, jit_word_t, jit_int32_t, jit_float32_t*);
367 # define x87_bungtr_f(i0, r0, r1) x87jcc(X86_CC_NAE, i0, r1, r0)
368 # define x87_bungti_f(i0, r0, i1) _x87_bungti_f(_jit, i0, r0, i1)
370 _x87_bungti_f(jit_state_t*, jit_word_t, jit_int32_t, jit_float32_t*);
371 # define x87_bltgtr_f(i0, r0, r1) x87jcc2(X86_CC_NE, i0, r0, r1)
372 # define x87_bltgti_f(i0, r0, i1) _x87_bltgti_f(_jit, i0, r0, i1)
374 _x87_bltgti_f(jit_state_t*, jit_word_t, jit_int32_t, jit_float32_t*);
375 # define x87_bordr_f(i0, r0, r1) x87jcc2(X86_CC_NP, i0, r0, r1)
376 # define x87_bordi_f(i0, r0, i1) _x87_bordi_f(_jit, i0, r0, i1)
378 _x87_bordi_f(jit_state_t*, jit_word_t, jit_int32_t, jit_float32_t*);
379 # define x87_bunordr_f(i0, r0, r1) x87jcc2(X86_CC_P, i0, r0, r1)
380 # define x87_bunordi_f(i0, r0, i1) _x87_bunordi_f(_jit, i0, r0, i1)
382 _x87_bunordi_f(jit_state_t*, jit_word_t, jit_int32_t, jit_float32_t*);
383 # define x87_bltr_d(i0, r0, r1) x87jcc(X86_CC_A, i0, r1, r0)
384 # define x87_blti_d(i0, r0, i1) _x87_blti_d(_jit, i0, r0, i1)
386 _x87_blti_d(jit_state_t*, jit_word_t, jit_int32_t, jit_float64_t*);
387 # define x87_bler_d(i0, r0, r1) x87jcc(X86_CC_AE, i0, r1, r0)
388 # define x87_blei_d(i0, r0, i1) _x87_blei_d(_jit, i0, r0, i1)
390 _x87_blei_d(jit_state_t*, jit_word_t, jit_int32_t, jit_float64_t*);
391 # define x87_beqr_d(i0, r0, r1) _x87_beqr_d(_jit, i0, r0, r1)
393 _x87_beqr_d(jit_state_t*, jit_word_t, jit_int32_t, jit_int32_t);
394 # define x87_beqi_d(i0, r0, i1) _x87_beqi_d(_jit, i0, r0, i1)
396 _x87_beqi_d(jit_state_t*, jit_word_t, jit_int32_t, jit_float64_t*);
397 # define x87_bger_d(i0, r0, r1) x87jcc(X86_CC_AE, i0, r0, r1)
398 # define x87_bgei_d(i0, r0, i1) _x87_bgei_d(_jit, i0, r0, i1)
400 _x87_bgei_d(jit_state_t*, jit_word_t, jit_int32_t, jit_float64_t*);
401 # define x87_bgtr_d(i0, r0, r1) x87jcc(X86_CC_A, i0, r0, r1)
402 # define x87_bgti_d(i0, r0, i1) _x87_bgti_d(_jit, i0, r0, i1)
404 _x87_bgti_d(jit_state_t*, jit_word_t, jit_int32_t, jit_float64_t*);
405 # define x87_bner_d(i0, r0, r1) _x87_bner_d(_jit, i0, r0, r1)
407 _x87_bner_d(jit_state_t*, jit_word_t, jit_int32_t, jit_int32_t);
408 # define x87_bnei_d(i0, r0, i1) _x87_bnei_d(_jit, i0, r0, i1)
410 _x87_bnei_d(jit_state_t*, jit_word_t, jit_int32_t, jit_float64_t*);
411 # define x87_bunltr_d(i0, r0, r1) x87jcc(X86_CC_NAE, i0, r0, r1)
412 # define x87_bunlti_d(i0, r0, i1) _x87_bunlti_d(_jit, i0, r0, i1)
414 _x87_bunlti_d(jit_state_t*, jit_word_t, jit_int32_t, jit_float64_t*);
415 # define x87_bunler_d(i0, r0, r1) x87jcc(X86_CC_NA, i0, r0, r1)
416 # define x87_bunlei_d(i0, r0, i1) _x87_bunlei_d(_jit, i0, r0, i1)
418 _x87_bunlei_d(jit_state_t*, jit_word_t, jit_int32_t, jit_float64_t*);
419 # define x87_buneqr_d(i0, r0, r1) x87jcc2(X86_CC_E, i0, r0, r1)
420 # define x87_buneqi_d(i0, r0, i1) _x87_buneqi_d(_jit, i0, r0, i1)
422 _x87_buneqi_d(jit_state_t*, jit_word_t, jit_int32_t, jit_float64_t*);
423 # define x87_bunger_d(i0, r0, r1) x87jcc(X86_CC_NA, i0, r1, r0)
424 # define x87_bungei_d(i0, r0, i1) _x87_bungei_d(_jit, i0, r0, i1)
426 _x87_bungei_d(jit_state_t*, jit_word_t, jit_int32_t, jit_float64_t*);
427 # define x87_bungtr_d(i0, r0, r1) x87jcc(X86_CC_NAE, i0, r1, r0)
428 # define x87_bungti_d(i0, r0, i1) _x87_bungti_d(_jit, i0, r0, i1)
430 _x87_bungti_d(jit_state_t*, jit_word_t, jit_int32_t, jit_float64_t*);
431 # define x87_bltgtr_d(i0, r0, r1) x87jcc2(X86_CC_NE, i0, r0, r1)
432 # define x87_bltgti_d(i0, r0, i1) _x87_bltgti_d(_jit, i0, r0, i1)
434 _x87_bltgti_d(jit_state_t*, jit_word_t, jit_int32_t, jit_float64_t*);
435 # define x87_bordr_d(i0, r0, r1) x87jcc2(X86_CC_NP, i0, r0, r1)
436 # define x87_bordi_d(i0, r0, i1) _x87_bordi_d(_jit, i0, r0, i1)
438 _x87_bordi_d(jit_state_t*, jit_word_t, jit_int32_t, jit_float64_t*);
439 # define x87_bunordr_d(i0, r0, r1) x87jcc2(X86_CC_P, i0, r0, r1)
440 # define x87_bunordi_d(i0, r0, i1) _x87_bunordi_d(_jit, i0, r0, i1)
442 _x87_bunordi_d(jit_state_t*, jit_word_t, jit_int32_t, jit_float64_t*);
446 # define fpr_opi(name, type, size) \
448 _x87_##name##i_##type(jit_state_t *_jit, \
449 jit_int32_t r0, jit_int32_t r1, \
450 jit_float##size##_t *i0) \
452 jit_int32_t reg = jit_get_reg(jit_class_fpr); \
453 assert(jit_x87_reg_p(reg)); \
454 x87_movi_##type(rn(reg), i0); \
455 x87_##name##r_##type(r0, r1, rn(reg)); \
456 jit_unget_reg(reg); \
458 # define fpr_bopi(name, type, size) \
460 _x87_b##name##i_##type(jit_state_t *_jit, \
461 jit_word_t i0, jit_int32_t r0, \
462 jit_float##size##_t *i1) \
465 jit_int32_t reg = jit_get_reg(jit_class_fpr| \
466 jit_class_nospill); \
467 assert(jit_x87_reg_p(reg)); \
468 x87_movi_##type(rn(reg), i1); \
469 w = x87_b##name##r_##type(i0, r0, rn(reg)); \
470 jit_unget_reg(reg); \
473 # define fopi(name) fpr_opi(name, f, 32)
474 # define fbopi(name) fpr_bopi(name, f, 32)
475 # define dopi(name) fpr_opi(name, d, 64)
476 # define dbopi(name) fpr_bopi(name, d, 64)
479 _fstcwm(jit_state_t *_jit, jit_int32_t md,
480 jit_int32_t rb, jit_int32_t ri, jit_int32_t ms)
483 rex(0, 1, rb, ri, _NOREG);
484 x87rx(017, md, rb, ri, ms);
488 _x87rx(jit_state_t *_jit, jit_int32_t code, jit_int32_t md,
489 jit_int32_t rb, jit_int32_t ri, jit_int32_t ms)
491 rex(0, 1, rb, ri, _NOREG);
492 ic(0xd8 | (code >> 3));
493 rx((code & 7), md, rb, ri, ms);
497 _x87ri(jit_state_t *_jit, jit_int32_t code, jit_int32_t r0)
499 ic(0xd8 | (code >> 3));
500 mrm(0x03, (code & 7), r0);
504 _x87rri(jit_state_t *_jit, jit_int32_t code, jit_int32_t r0, jit_int32_t r1)
506 if (r1 == _ST0_REGNO)
507 x87ri(code | 040, r0);
509 assert(r0 == _ST0_REGNO);
521 _x87_addr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
524 if (r2 == _ST0_REGNO)
525 faddr(r0, _ST0_REGNO);
526 else if (r0 == _ST0_REGNO)
527 faddr(_ST0_REGNO, r2);
530 faddr(_ST0_REGNO, r0 == r2 ? _ST0_REGNO : r2);
535 if (r1 == _ST0_REGNO)
536 faddr(r0, _ST0_REGNO);
537 else if (r0 == _ST0_REGNO)
538 faddr(_ST0_REGNO, r1);
541 faddr(_ST0_REGNO, r1);
547 faddr(_ST0_REGNO, r2 + 1);
555 _x87_subr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
558 if (r2 == _ST0_REGNO)
559 fsubrr(r0, _ST0_REGNO);
560 else if (r0 == _ST0_REGNO)
561 fsubr(_ST0_REGNO, r2);
564 fsubr(_ST0_REGNO, r0 == r2 ? _ST0_REGNO : r2);
569 if (r1 == _ST0_REGNO)
570 fsubr(r0, _ST0_REGNO);
571 else if (r0 == _ST0_REGNO)
572 fsubrr(_ST0_REGNO, r1);
575 fsubrr(_ST0_REGNO, r1);
581 fsubr(_ST0_REGNO, r2 + 1);
591 _x87_mulr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
594 if (r2 == _ST0_REGNO)
595 fmulr(r0, _ST0_REGNO);
596 else if (r0 == _ST0_REGNO)
597 fmulr(_ST0_REGNO, r2);
600 fmulr(_ST0_REGNO, r0 == r2 ? _ST0_REGNO : r2);
605 if (r1 == _ST0_REGNO)
606 fmulr(r0, _ST0_REGNO);
607 else if (r0 == _ST0_REGNO)
608 fmulr(_ST0_REGNO, r1);
611 fmulr(_ST0_REGNO, r1);
617 fmulr(_ST0_REGNO, r2 + 1);
625 _x87_divr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
628 if (r2 == _ST0_REGNO)
629 fdivrr(r0, _ST0_REGNO);
630 else if (r0 == _ST0_REGNO)
631 fdivr(_ST0_REGNO, r2);
634 fdivr(_ST0_REGNO, r0 == r2 ? _ST0_REGNO : r2);
639 if (r1 == _ST0_REGNO)
640 fdivr(r0, _ST0_REGNO);
641 else if (r0 == _ST0_REGNO)
642 fsubrr(_ST0_REGNO, r1);
645 fdivrr(_ST0_REGNO, r1);
651 fdivr(_ST0_REGNO, r2 + 1);
659 _x87_absr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
662 if (r1 == _ST0_REGNO)
678 _x87_negr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
681 if (r1 == _ST0_REGNO)
697 _x87_sqrtr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
700 if (r1 == _ST0_REGNO)
716 _x87_fmar_f(jit_state_t *_jit,
717 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_int32_t r3)
721 x87_mulr_f(r0, r1, r2);
722 x87_addr_f(r0, r0, r3);
725 t0 = jit_get_reg(jit_class_fpr);
726 assert(jit_x87_reg_p(t0));
727 x87_mulr_f(rn(t0), r1, r2);
728 x87_addr_f(r0, rn(t0), r3);
734 _x87_fmar_d(jit_state_t *_jit,
735 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_int32_t r3)
739 x87_mulr_d(r0, r1, r2);
740 x87_addr_d(r0, r0, r3);
743 t0 = jit_get_reg(jit_class_fpr);
744 assert(jit_x87_reg_p(t0));
745 x87_mulr_d(rn(t0), r1, r2);
746 x87_addr_d(r0, rn(t0), r3);
752 _x87_fmsr_f(jit_state_t *_jit,
753 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_int32_t r3)
757 x87_mulr_f(r0, r1, r2);
758 x87_subr_f(r0, r0, r3);
761 t0 = jit_get_reg(jit_class_fpr);
762 assert(jit_x87_reg_p(t0));
763 x87_mulr_f(rn(t0), r1, r2);
764 x87_subr_f(r0, rn(t0), r3);
770 _x87_fmsr_d(jit_state_t *_jit,
771 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_int32_t r3)
775 x87_mulr_d(r0, r1, r2);
776 x87_subr_d(r0, r0, r3);
779 t0 = jit_get_reg(jit_class_fpr);
780 assert(jit_x87_reg_p(t0));
781 x87_mulr_d(rn(t0), r1, r2);
782 x87_subr_d(r0, rn(t0), r3);
788 _x87_fnmar_f(jit_state_t *_jit,
789 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_int32_t r3)
792 t0 = jit_get_reg(jit_class_fpr);
793 x87_negr_f(rn(t0), r1);
794 x87_mulr_f(rn(t0), rn(t0), r2);
795 x87_subr_f(r0, rn(t0), r3);
800 _x87_fnmar_d(jit_state_t *_jit,
801 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_int32_t r3)
804 t0 = jit_get_reg(jit_class_fpr);
805 x87_negr_d(rn(t0), r1);
806 x87_mulr_d(rn(t0), rn(t0), r2);
807 x87_subr_d(r0, rn(t0), r3);
812 _x87_fnmsr_f(jit_state_t *_jit,
813 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_int32_t r3)
816 t0 = jit_get_reg(jit_class_fpr);
817 x87_negr_f(rn(t0), r1);
818 x87_mulr_f(rn(t0), rn(t0), r2);
819 x87_addr_f(r0, rn(t0), r3);
824 _x87_fnmsr_d(jit_state_t *_jit,
825 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_int32_t r3)
828 t0 = jit_get_reg(jit_class_fpr);
829 x87_negr_d(rn(t0), r1);
830 x87_mulr_d(rn(t0), rn(t0), r2);
831 x87_addr_d(r0, rn(t0), r3);
836 _x87_truncr_d_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
840 /* for the sake of passing test cases in x87 mode, otherwise only sse
842 fstcwm(-4, _RBP_REGNO, _NOREG, _SCL1);
843 ldxi_s(r0, _RBP_REGNO, -4);
845 # define FPCW_CHOP 0xc00
846 ori(r0, r0, FPCW_CHOP);
847 stxi_s(-8, _RBP_REGNO, r0);
848 fldcwm(-8, _RBP_REGNO, _NOREG, _SCL1);
849 if (r1 == _ST0_REGNO)
850 fistlm(CVT_OFFSET, _RBP_REGNO, _NOREG, _SCL1);
853 fistlm(CVT_OFFSET, _RBP_REGNO, _NOREG, _SCL1);
856 fldcwm(-4, _RBP_REGNO, _NOREG, _SCL1);
857 ldxi(r0, _RBP_REGNO, CVT_OFFSET);
860 fisttplm(CVT_OFFSET, _RBP_REGNO, _NOREG, _SCL1);
861 ldxi_i(r0, _RBP_REGNO, CVT_OFFSET);
867 _x87_truncr_d_l(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
871 fisttpqm(CVT_OFFSET, _RBP_REGNO, _NOREG, _SCL1);
872 ldxi(r0, _RBP_REGNO, CVT_OFFSET);
877 _x87_extr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
880 stxi(CVT_OFFSET, _RBP_REGNO, r1);
882 fildlm(CVT_OFFSET, _RBP_REGNO, _NOREG, _SCL1);
884 fildqm(CVT_OFFSET, _RBP_REGNO, _NOREG, _SCL1);
890 _x87cmp(jit_state_t *_jit, jit_int32_t code,
891 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
895 if ((rc = reg8_p(r0)))
902 if (r1 == _ST0_REGNO)
914 _x87cmp2(jit_state_t *_jit, jit_int32_t code,
915 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
920 if (r2 == _ST0_REGNO) f1 = r2, f2 = r1;
921 else f1 = r1, f2 = r2;
922 if ((rc = reg8_p(r0)))
929 if (f1 == _ST0_REGNO)
941 _x87jcc(jit_state_t *_jit, jit_int32_t code,
942 jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
944 if (r0 == _ST0_REGNO)
950 return (jcc(code, i0));
954 _x87jcc2(jit_state_t *_jit, jit_int32_t code,
955 jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
958 if (r1 == _ST0_REGNO) f0 = r1, f1 = r0;
959 else f0 = r0, f1 = r1;
960 if (f0 == _ST0_REGNO)
966 return (jcc(code, i0));
999 _x87_movi_f(jit_state_t *_jit, jit_int32_t r0, jit_float32_t *i0)
1008 if (data.f == 0.0 && !(data.i & 0x80000000))
1010 else if (data.f == 1.0)
1012 else if (data.f == 3.3219280948873623478703195458468f)
1014 else if (data.f == 1.4426950408889634073599246886656f)
1016 else if (data.f == 3.1415926535897932384626421096161f)
1018 else if (data.f == 0.3010299956639811952137387498515f)
1020 else if (data.f == 0.6931471805599453094172323683399f)
1023 if (_jitc->no_data) {
1025 reg = jit_get_reg(jit_class_gpr);
1026 movi(rn(reg), data.i);
1027 stxi_i(CVT_OFFSET, _RBP_REGNO, rn(reg));
1029 x87_ldxi_f(r0, _RBP_REGNO, CVT_OFFSET);
1032 x87_ldi_f(r0, (jit_word_t)i0);
1039 _x87_movr_w_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1042 stxi_i(CVT_OFFSET, _RBP_REGNO, r1);
1043 x87_ldxi_f(r0, _RBP_REGNO, CVT_OFFSET);
1047 _x87_movr_f_w(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1050 x87_stxi_f(CVT_OFFSET, _RBP_REGNO, r1);
1051 ldxi_i(r0, _RBP_REGNO, CVT_OFFSET);
1055 _x87_movi_w_f(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
1059 reg = jit_get_reg(jit_class_gpr);
1061 stxi_i(CVT_OFFSET, _RBP_REGNO, rn(reg));
1063 x87_ldxi_f(r0, _RBP_REGNO, CVT_OFFSET);
1067 _x87_ldr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1069 fldsm(0, r1, _NOREG, _SCL1);
1074 _x87_ldi_f(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
1077 if (x87_address_p(i0)) {
1078 fldsm(i0, _NOREG, _NOREG, _SCL1);
1082 reg = jit_get_reg(jit_class_gpr);
1084 x87_ldr_f(r0, rn(reg));
1090 _x87_ldxr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1094 reg = jit_get_reg(jit_class_gpr);
1095 addr(rn(reg), r1, r2);
1096 x87_ldr_f(r0, rn(reg));
1099 fldsm(0, r1, r2, _SCL1);
1105 _x87_ldxi_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1108 if (can_sign_extend_int_p(i0)) {
1109 fldsm(i0, r1, _NOREG, _SCL1);
1113 reg = jit_get_reg(jit_class_gpr);
1115 addi(rn(reg), r1, i0);
1116 x87_ldr_f(r0, rn(reg));
1119 x87_ldxr_f(r0, r1, rn(reg));
1126 _x87_unldr_x(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1128 assert(i0 == 4 || i0 == 8);
1136 _x87_unldi_x(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0, jit_word_t i1)
1138 assert(i1 == 4 || i1 == 8);
1146 _x87_str_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1148 if (r1 == _ST0_REGNO)
1149 fstsm(0, r0, _NOREG, _SCL1);
1152 fstsm(0, r0, _NOREG, _SCL1);
1158 _x87_sti_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
1161 if (!x87_address_p(i0)) {
1162 reg = jit_get_reg(jit_class_gpr);
1164 x87_str_f(rn(reg), r0);
1167 else if (r0 == _ST0_REGNO)
1168 fstsm(i0, _NOREG, _NOREG, _SCL1);
1171 fstsm(i0, _NOREG, _NOREG, _SCL1);
1177 _x87_stxr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1181 reg = jit_get_reg(jit_class_gpr);
1182 addr(rn(reg), r0, r1);
1183 x87_str_f(rn(reg), r2);
1186 if (r2 == _ST0_REGNO)
1187 fstsm(0, r0, r1, _SCL1);
1190 fstsm(0, r0, r1, _SCL1);
1197 _x87_stxi_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
1200 if (!can_sign_extend_int_p(i0)) {
1201 reg = jit_get_reg(jit_class_gpr);
1203 addi(rn(reg), r0, i0);
1204 x87_str_f(rn(reg), r1);
1207 x87_stxr_f(rn(reg), r0, r1);
1211 else if (r1 == _ST0_REGNO)
1212 fstsm(i0, r0, _NOREG, _SCL1);
1215 fstsm(i0, r0, _NOREG, _SCL1);
1221 _x87_unstr_x(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1223 assert(i0 == 4 || i0 == 8);
1231 _x87_unsti_x(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
1233 assert(i1 == 4 || i1 == 8);
1241 _x87_movr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1246 else if (r0 == _ST0) {
1258 _x87_movi_d(jit_state_t *_jit, jit_int32_t r0, jit_float64_t *i0)
1268 if (data.d == 0.0 && !(data.ii[1] & 0x80000000))
1270 else if (data.d == 1.0)
1272 else if (data.d == 3.3219280948873623478703195458468)
1274 else if (data.d == 1.4426950408889634073599246886656)
1276 else if (data.d == 3.1415926535897932384626421096161)
1278 else if (data.d == 0.3010299956639811952137387498515)
1280 else if (data.d == 0.6931471805599453094172323683399)
1283 if (_jitc->no_data) {
1285 reg = jit_get_reg(jit_class_gpr);
1286 #if __X32 || __X64_32
1287 movi(rn(reg), data.ii[0]);
1288 stxi_i(CVT_OFFSET, _RBP_REGNO, rn(reg));
1289 movi(rn(reg), data.ii[1]);
1290 stxi_i(CVT_OFFSET + 4, _RBP_REGNO, rn(reg));
1292 movi(rn(reg), data.w);
1293 stxi_l(CVT_OFFSET, _RBP_REGNO, rn(reg));
1296 x87_ldxi_d(r0, _RBP_REGNO, CVT_OFFSET);
1299 x87_ldi_d(r0, (jit_word_t)i0);
1305 #if __X32 || __X64_32
1307 _x87_movr_ww_d(jit_state_t *_jit,
1308 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1311 stxi_i(CVT_OFFSET, _RBP_REGNO, r1);
1312 stxi_i(CVT_OFFSET + 4, _RBP_REGNO, r2);
1313 x87_ldxi_d(r0, _RBP_REGNO, CVT_OFFSET);
1317 _x87_movr_d_ww(jit_state_t *_jit,
1318 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1321 x87_stxi_d(CVT_OFFSET, _RBP_REGNO, r2);
1322 ldxi_i(r0, _RBP_REGNO, CVT_OFFSET);
1323 ldxi_i(r1, _RBP_REGNO, CVT_OFFSET + 4);
1327 _x87_movi_ww_d(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0, jit_word_t i1)
1331 reg = jit_get_reg(jit_class_gpr);
1333 stxi_i(CVT_OFFSET, _RBP_REGNO, rn(reg));
1335 stxi_i(CVT_OFFSET + 4, _RBP_REGNO, rn(reg));
1337 x87_ldxi_d(r0, _RBP_REGNO, CVT_OFFSET);
1342 _x87_movr_w_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1345 stxi_l(CVT_OFFSET, _RBP_REGNO, r1);
1346 x87_ldxi_d(r0, _RBP_REGNO, CVT_OFFSET);
1350 _x87_movr_d_w(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1353 x87_stxi_d(CVT_OFFSET, _RBP_REGNO, r1);
1354 ldxi_l(r0, _RBP_REGNO, CVT_OFFSET);
1358 _x87_movi_w_d(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
1362 reg = jit_get_reg(jit_class_gpr);
1364 stxi(CVT_OFFSET, _RBP_REGNO, rn(reg));
1366 x87_ldxi_d(r0, _RBP_REGNO, CVT_OFFSET);
1374 _x87_eqr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1378 jit_int32_t reg, f1, f2;
1379 if (r2 == _ST0_REGNO) f1 = r2, f2 = r1;
1380 else f1 = r1, f2 = r2;
1381 if ((rc = reg8_p(r0)))
1388 if (f1 == _ST0_REGNO)
1396 patch_at(jp_code, _jit->pc.w);
1406 _x87_ner_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1410 jit_int32_t reg, f1, f2;
1411 if (r2 == _ST0_REGNO) f1 = r2, f2 = r1;
1412 else f1 = r1, f2 = r2;
1413 if ((rc = reg8_p(r0)))
1420 if (f1 == _ST0_REGNO)
1428 patch_at(jp_code, _jit->pc.w);
1441 _x87_ltgtr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1446 x87cmp2(X86_CC_NE, r0, r1, r2);
1454 _x87_ldr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1456 fldlm(0, r1, _NOREG, _SCL1);
1461 _x87_ldi_d(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
1464 if (x87_address_p(i0)) {
1465 fldlm(i0, _NOREG, _NOREG, _SCL1);
1469 reg = jit_get_reg(jit_class_gpr);
1471 x87_ldr_d(r0, rn(reg));
1477 _x87_ldxr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1481 reg = jit_get_reg(jit_class_gpr);
1482 addr(rn(reg), r1, r2);
1483 x87_ldr_d(r0, rn(reg));
1486 fldlm(0, r1, r2, _SCL1);
1492 _x87_ldxi_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1495 if (can_sign_extend_int_p(i0)) {
1496 fldlm(i0, r1, _NOREG, _SCL1);
1500 reg = jit_get_reg(jit_class_gpr);
1502 addi(rn(reg), r1, i0);
1503 x87_ldr_d(r0, rn(reg));
1506 x87_ldxr_d(r0, r1, rn(reg));
1513 _x87_str_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1515 if (r1 == _ST0_REGNO)
1516 fstlm(0, r0, _NOREG, _SCL1);
1519 fstlm(0, r0, _NOREG, _SCL1);
1525 _x87_sti_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
1528 if (!x87_address_p(i0)) {
1529 reg = jit_get_reg(jit_class_gpr);
1531 x87_str_d(rn(reg), r0);
1534 else if (r0 == _ST0_REGNO)
1535 fstlm(i0, _NOREG, _NOREG, _SCL1);
1538 fstlm(i0, _NOREG, _NOREG, _SCL1);
1544 _x87_stxr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1548 reg = jit_get_reg(jit_class_gpr);
1549 addr(rn(reg), r0, r1);
1550 x87_str_d(rn(reg), r2);
1553 if (r2 == _ST0_REGNO)
1554 fstlm(0, r0, r1, _SCL1);
1557 fstlm(0, r0, r1, _SCL1);
1564 _x87_stxi_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
1567 if (!can_sign_extend_int_p(i0)) {
1568 reg = jit_get_reg(jit_class_gpr);
1570 addi(rn(reg), r0, i0);
1571 x87_str_d(rn(reg), r1);
1574 x87_stxr_d(rn(reg), r0, r1);
1578 else if (r1 == _ST0_REGNO)
1579 fstlm(i0, r0, _NOREG, _SCL1);
1582 fstlm(i0, r0, _NOREG, _SCL1);
1591 _x87_beqr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
1596 if (r1 == _ST0_REGNO) f0 = r1, f1 = r0;
1597 else f0 = r0, f1 = r1;
1598 if (f0 == _ST0_REGNO)
1605 w = jcc(X86_CC_E, i0);
1606 patch_at(jp_code, _jit->pc.w);
1614 _x87_bner_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
1620 if (r1 == _ST0_REGNO) f0 = r1, f1 = r0;
1621 else f0 = r0, f1 = r1;
1622 if (f0 == _ST0_REGNO)
1630 patch_at(jp_code, _jit->pc.w);
1632 patch_at(jz_code, _jit->pc.w);