Statistics
| Branch: | Revision:

root / target-sparc / op.c @ 1e64e78d

History | View | Annotate | Download (52.4 kB)

1 7a3f1944 bellard
/*
2 7a3f1944 bellard
   SPARC micro operations
3 7a3f1944 bellard

4 7a3f1944 bellard
   Copyright (C) 2003 Thomas M. Ogrisegg <tom@fnord.at>
5 7a3f1944 bellard

6 7a3f1944 bellard
   This library is free software; you can redistribute it and/or
7 7a3f1944 bellard
   modify it under the terms of the GNU Lesser General Public
8 7a3f1944 bellard
   License as published by the Free Software Foundation; either
9 7a3f1944 bellard
   version 2 of the License, or (at your option) any later version.
10 7a3f1944 bellard

11 7a3f1944 bellard
   This library is distributed in the hope that it will be useful,
12 7a3f1944 bellard
   but WITHOUT ANY WARRANTY; without even the implied warranty of
13 7a3f1944 bellard
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 7a3f1944 bellard
   Lesser General Public License for more details.
15 7a3f1944 bellard

16 7a3f1944 bellard
   You should have received a copy of the GNU Lesser General Public
17 7a3f1944 bellard
   License along with this library; if not, write to the Free Software
18 7a3f1944 bellard
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19 7a3f1944 bellard
*/
20 7a3f1944 bellard
21 7a3f1944 bellard
#include "exec.h"
22 7a3f1944 bellard
23 cf495bcf bellard
 /*XXX*/
24 7a3f1944 bellard
#define REGNAME g0
25 7a3f1944 bellard
#define REG (env->gregs[0])
26 7a3f1944 bellard
#include "op_template.h"
27 7a3f1944 bellard
#define REGNAME g1
28 7a3f1944 bellard
#define REG (env->gregs[1])
29 7a3f1944 bellard
#include "op_template.h"
30 7a3f1944 bellard
#define REGNAME g2
31 7a3f1944 bellard
#define REG (env->gregs[2])
32 7a3f1944 bellard
#include "op_template.h"
33 7a3f1944 bellard
#define REGNAME g3
34 7a3f1944 bellard
#define REG (env->gregs[3])
35 7a3f1944 bellard
#include "op_template.h"
36 7a3f1944 bellard
#define REGNAME g4
37 7a3f1944 bellard
#define REG (env->gregs[4])
38 7a3f1944 bellard
#include "op_template.h"
39 7a3f1944 bellard
#define REGNAME g5
40 7a3f1944 bellard
#define REG (env->gregs[5])
41 7a3f1944 bellard
#include "op_template.h"
42 7a3f1944 bellard
#define REGNAME g6
43 7a3f1944 bellard
#define REG (env->gregs[6])
44 7a3f1944 bellard
#include "op_template.h"
45 7a3f1944 bellard
#define REGNAME g7
46 7a3f1944 bellard
#define REG (env->gregs[7])
47 7a3f1944 bellard
#include "op_template.h"
48 7a3f1944 bellard
#define REGNAME i0
49 3475187d bellard
#define REG (REGWPTR[16])
50 7a3f1944 bellard
#include "op_template.h"
51 7a3f1944 bellard
#define REGNAME i1
52 3475187d bellard
#define REG (REGWPTR[17])
53 7a3f1944 bellard
#include "op_template.h"
54 7a3f1944 bellard
#define REGNAME i2
55 3475187d bellard
#define REG (REGWPTR[18])
56 7a3f1944 bellard
#include "op_template.h"
57 7a3f1944 bellard
#define REGNAME i3
58 3475187d bellard
#define REG (REGWPTR[19])
59 7a3f1944 bellard
#include "op_template.h"
60 7a3f1944 bellard
#define REGNAME i4
61 3475187d bellard
#define REG (REGWPTR[20])
62 7a3f1944 bellard
#include "op_template.h"
63 7a3f1944 bellard
#define REGNAME i5
64 3475187d bellard
#define REG (REGWPTR[21])
65 7a3f1944 bellard
#include "op_template.h"
66 7a3f1944 bellard
#define REGNAME i6
67 3475187d bellard
#define REG (REGWPTR[22])
68 7a3f1944 bellard
#include "op_template.h"
69 7a3f1944 bellard
#define REGNAME i7
70 3475187d bellard
#define REG (REGWPTR[23])
71 7a3f1944 bellard
#include "op_template.h"
72 7a3f1944 bellard
#define REGNAME l0
73 3475187d bellard
#define REG (REGWPTR[8])
74 7a3f1944 bellard
#include "op_template.h"
75 7a3f1944 bellard
#define REGNAME l1
76 3475187d bellard
#define REG (REGWPTR[9])
77 7a3f1944 bellard
#include "op_template.h"
78 7a3f1944 bellard
#define REGNAME l2
79 3475187d bellard
#define REG (REGWPTR[10])
80 7a3f1944 bellard
#include "op_template.h"
81 7a3f1944 bellard
#define REGNAME l3
82 3475187d bellard
#define REG (REGWPTR[11])
83 7a3f1944 bellard
#include "op_template.h"
84 7a3f1944 bellard
#define REGNAME l4
85 3475187d bellard
#define REG (REGWPTR[12])
86 7a3f1944 bellard
#include "op_template.h"
87 7a3f1944 bellard
#define REGNAME l5
88 3475187d bellard
#define REG (REGWPTR[13])
89 7a3f1944 bellard
#include "op_template.h"
90 7a3f1944 bellard
#define REGNAME l6
91 3475187d bellard
#define REG (REGWPTR[14])
92 7a3f1944 bellard
#include "op_template.h"
93 7a3f1944 bellard
#define REGNAME l7
94 3475187d bellard
#define REG (REGWPTR[15])
95 7a3f1944 bellard
#include "op_template.h"
96 7a3f1944 bellard
#define REGNAME o0
97 3475187d bellard
#define REG (REGWPTR[0])
98 7a3f1944 bellard
#include "op_template.h"
99 7a3f1944 bellard
#define REGNAME o1
100 3475187d bellard
#define REG (REGWPTR[1])
101 7a3f1944 bellard
#include "op_template.h"
102 7a3f1944 bellard
#define REGNAME o2
103 3475187d bellard
#define REG (REGWPTR[2])
104 7a3f1944 bellard
#include "op_template.h"
105 7a3f1944 bellard
#define REGNAME o3
106 3475187d bellard
#define REG (REGWPTR[3])
107 7a3f1944 bellard
#include "op_template.h"
108 7a3f1944 bellard
#define REGNAME o4
109 3475187d bellard
#define REG (REGWPTR[4])
110 7a3f1944 bellard
#include "op_template.h"
111 7a3f1944 bellard
#define REGNAME o5
112 3475187d bellard
#define REG (REGWPTR[5])
113 7a3f1944 bellard
#include "op_template.h"
114 7a3f1944 bellard
#define REGNAME o6
115 3475187d bellard
#define REG (REGWPTR[6])
116 7a3f1944 bellard
#include "op_template.h"
117 7a3f1944 bellard
#define REGNAME o7
118 3475187d bellard
#define REG (REGWPTR[7])
119 7a3f1944 bellard
#include "op_template.h"
120 e8af50a3 bellard
121 e8af50a3 bellard
#define REGNAME f0
122 e8af50a3 bellard
#define REG (env->fpr[0])
123 e8af50a3 bellard
#include "fop_template.h"
124 e8af50a3 bellard
#define REGNAME f1
125 e8af50a3 bellard
#define REG (env->fpr[1])
126 e8af50a3 bellard
#include "fop_template.h"
127 e8af50a3 bellard
#define REGNAME f2
128 e8af50a3 bellard
#define REG (env->fpr[2])
129 e8af50a3 bellard
#include "fop_template.h"
130 e8af50a3 bellard
#define REGNAME f3
131 e8af50a3 bellard
#define REG (env->fpr[3])
132 e8af50a3 bellard
#include "fop_template.h"
133 e8af50a3 bellard
#define REGNAME f4
134 e8af50a3 bellard
#define REG (env->fpr[4])
135 e8af50a3 bellard
#include "fop_template.h"
136 e8af50a3 bellard
#define REGNAME f5
137 e8af50a3 bellard
#define REG (env->fpr[5])
138 e8af50a3 bellard
#include "fop_template.h"
139 e8af50a3 bellard
#define REGNAME f6
140 e8af50a3 bellard
#define REG (env->fpr[6])
141 e8af50a3 bellard
#include "fop_template.h"
142 e8af50a3 bellard
#define REGNAME f7
143 e8af50a3 bellard
#define REG (env->fpr[7])
144 e8af50a3 bellard
#include "fop_template.h"
145 e8af50a3 bellard
#define REGNAME f8
146 e8af50a3 bellard
#define REG (env->fpr[8])
147 e8af50a3 bellard
#include "fop_template.h"
148 e8af50a3 bellard
#define REGNAME f9
149 e8af50a3 bellard
#define REG (env->fpr[9])
150 e8af50a3 bellard
#include "fop_template.h"
151 e8af50a3 bellard
#define REGNAME f10
152 e8af50a3 bellard
#define REG (env->fpr[10])
153 e8af50a3 bellard
#include "fop_template.h"
154 e8af50a3 bellard
#define REGNAME f11
155 e8af50a3 bellard
#define REG (env->fpr[11])
156 e8af50a3 bellard
#include "fop_template.h"
157 e8af50a3 bellard
#define REGNAME f12
158 e8af50a3 bellard
#define REG (env->fpr[12])
159 e8af50a3 bellard
#include "fop_template.h"
160 e8af50a3 bellard
#define REGNAME f13
161 e8af50a3 bellard
#define REG (env->fpr[13])
162 e8af50a3 bellard
#include "fop_template.h"
163 e8af50a3 bellard
#define REGNAME f14
164 e8af50a3 bellard
#define REG (env->fpr[14])
165 e8af50a3 bellard
#include "fop_template.h"
166 e8af50a3 bellard
#define REGNAME f15
167 e8af50a3 bellard
#define REG (env->fpr[15])
168 e8af50a3 bellard
#include "fop_template.h"
169 e8af50a3 bellard
#define REGNAME f16
170 e8af50a3 bellard
#define REG (env->fpr[16])
171 e8af50a3 bellard
#include "fop_template.h"
172 e8af50a3 bellard
#define REGNAME f17
173 e8af50a3 bellard
#define REG (env->fpr[17])
174 e8af50a3 bellard
#include "fop_template.h"
175 e8af50a3 bellard
#define REGNAME f18
176 e8af50a3 bellard
#define REG (env->fpr[18])
177 e8af50a3 bellard
#include "fop_template.h"
178 e8af50a3 bellard
#define REGNAME f19
179 e8af50a3 bellard
#define REG (env->fpr[19])
180 e8af50a3 bellard
#include "fop_template.h"
181 e8af50a3 bellard
#define REGNAME f20
182 e8af50a3 bellard
#define REG (env->fpr[20])
183 e8af50a3 bellard
#include "fop_template.h"
184 e8af50a3 bellard
#define REGNAME f21
185 e8af50a3 bellard
#define REG (env->fpr[21])
186 e8af50a3 bellard
#include "fop_template.h"
187 e8af50a3 bellard
#define REGNAME f22
188 e8af50a3 bellard
#define REG (env->fpr[22])
189 e8af50a3 bellard
#include "fop_template.h"
190 e8af50a3 bellard
#define REGNAME f23
191 e8af50a3 bellard
#define REG (env->fpr[23])
192 e8af50a3 bellard
#include "fop_template.h"
193 e8af50a3 bellard
#define REGNAME f24
194 e8af50a3 bellard
#define REG (env->fpr[24])
195 e8af50a3 bellard
#include "fop_template.h"
196 e8af50a3 bellard
#define REGNAME f25
197 e8af50a3 bellard
#define REG (env->fpr[25])
198 e8af50a3 bellard
#include "fop_template.h"
199 e8af50a3 bellard
#define REGNAME f26
200 e8af50a3 bellard
#define REG (env->fpr[26])
201 e8af50a3 bellard
#include "fop_template.h"
202 e8af50a3 bellard
#define REGNAME f27
203 e8af50a3 bellard
#define REG (env->fpr[27])
204 e8af50a3 bellard
#include "fop_template.h"
205 e8af50a3 bellard
#define REGNAME f28
206 e8af50a3 bellard
#define REG (env->fpr[28])
207 e8af50a3 bellard
#include "fop_template.h"
208 e8af50a3 bellard
#define REGNAME f29
209 e8af50a3 bellard
#define REG (env->fpr[29])
210 e8af50a3 bellard
#include "fop_template.h"
211 e8af50a3 bellard
#define REGNAME f30
212 e8af50a3 bellard
#define REG (env->fpr[30])
213 e8af50a3 bellard
#include "fop_template.h"
214 e8af50a3 bellard
#define REGNAME f31
215 e8af50a3 bellard
#define REG (env->fpr[31])
216 e8af50a3 bellard
#include "fop_template.h"
217 e8af50a3 bellard
218 3475187d bellard
#ifdef TARGET_SPARC64
219 3475187d bellard
#define REGNAME f32
220 3475187d bellard
#define REG (env->fpr[32])
221 3475187d bellard
#include "fop_template.h"
222 3475187d bellard
#define REGNAME f34
223 3475187d bellard
#define REG (env->fpr[34])
224 3475187d bellard
#include "fop_template.h"
225 3475187d bellard
#define REGNAME f36
226 3475187d bellard
#define REG (env->fpr[36])
227 3475187d bellard
#include "fop_template.h"
228 3475187d bellard
#define REGNAME f38
229 3475187d bellard
#define REG (env->fpr[38])
230 3475187d bellard
#include "fop_template.h"
231 3475187d bellard
#define REGNAME f40
232 3475187d bellard
#define REG (env->fpr[40])
233 3475187d bellard
#include "fop_template.h"
234 3475187d bellard
#define REGNAME f42
235 3475187d bellard
#define REG (env->fpr[42])
236 3475187d bellard
#include "fop_template.h"
237 3475187d bellard
#define REGNAME f44
238 3475187d bellard
#define REG (env->fpr[44])
239 3475187d bellard
#include "fop_template.h"
240 3475187d bellard
#define REGNAME f46
241 3475187d bellard
#define REG (env->fpr[46])
242 3475187d bellard
#include "fop_template.h"
243 3475187d bellard
#define REGNAME f48
244 3475187d bellard
#define REG (env->fpr[47])
245 3475187d bellard
#include "fop_template.h"
246 3475187d bellard
#define REGNAME f50
247 3475187d bellard
#define REG (env->fpr[50])
248 3475187d bellard
#include "fop_template.h"
249 3475187d bellard
#define REGNAME f52
250 3475187d bellard
#define REG (env->fpr[52])
251 3475187d bellard
#include "fop_template.h"
252 3475187d bellard
#define REGNAME f54
253 3475187d bellard
#define REG (env->fpr[54])
254 3475187d bellard
#include "fop_template.h"
255 3475187d bellard
#define REGNAME f56
256 3475187d bellard
#define REG (env->fpr[56])
257 3475187d bellard
#include "fop_template.h"
258 3475187d bellard
#define REGNAME f58
259 3475187d bellard
#define REG (env->fpr[58])
260 3475187d bellard
#include "fop_template.h"
261 3475187d bellard
#define REGNAME f60
262 3475187d bellard
#define REG (env->fpr[60])
263 3475187d bellard
#include "fop_template.h"
264 3475187d bellard
#define REGNAME f62
265 3475187d bellard
#define REG (env->fpr[62])
266 3475187d bellard
#include "fop_template.h"
267 3475187d bellard
#endif
268 3475187d bellard
269 3475187d bellard
#ifdef TARGET_SPARC64
270 3475187d bellard
#ifdef WORDS_BIGENDIAN
271 3475187d bellard
typedef union UREG64 {
272 3475187d bellard
    struct { uint16_t v3, v2, v1, v0; } w;
273 3475187d bellard
    struct { uint32_t v1, v0; } l;
274 3475187d bellard
    uint64_t q;
275 3475187d bellard
} UREG64;
276 3475187d bellard
#else
277 3475187d bellard
typedef union UREG64 {
278 3475187d bellard
    struct { uint16_t v0, v1, v2, v3; } w;
279 3475187d bellard
    struct { uint32_t v0, v1; } l;
280 3475187d bellard
    uint64_t q;
281 3475187d bellard
} UREG64;
282 3475187d bellard
#endif
283 3475187d bellard
284 3475187d bellard
#define PARAMQ1 \
285 3475187d bellard
({\
286 3475187d bellard
    UREG64 __p;\
287 3475187d bellard
    __p.l.v1 = PARAM1;\
288 3475187d bellard
    __p.l.v0 = PARAM2;\
289 3475187d bellard
    __p.q;\
290 5fafdf24 ths
})
291 3475187d bellard
292 3475187d bellard
void OPPROTO op_movq_T0_im64(void)
293 3475187d bellard
{
294 3475187d bellard
    T0 = PARAMQ1;
295 3475187d bellard
}
296 3475187d bellard
297 3475187d bellard
void OPPROTO op_movq_T1_im64(void)
298 3475187d bellard
{
299 3475187d bellard
    T1 = PARAMQ1;
300 3475187d bellard
}
301 3475187d bellard
302 3475187d bellard
#define XFLAG_SET(x) ((env->xcc&x)?1:0)
303 3475187d bellard
304 3475187d bellard
#else
305 7a3f1944 bellard
#define EIP (env->pc)
306 3475187d bellard
#endif
307 7a3f1944 bellard
308 af7bf89b bellard
#define FLAG_SET(x) ((env->psr&x)?1:0)
309 cf495bcf bellard
310 7a3f1944 bellard
void OPPROTO op_movl_T0_0(void)
311 7a3f1944 bellard
{
312 cf495bcf bellard
    T0 = 0;
313 7a3f1944 bellard
}
314 7a3f1944 bellard
315 7a3f1944 bellard
void OPPROTO op_movl_T0_im(void)
316 7a3f1944 bellard
{
317 3475187d bellard
    T0 = (uint32_t)PARAM1;
318 7a3f1944 bellard
}
319 7a3f1944 bellard
320 7a3f1944 bellard
void OPPROTO op_movl_T1_im(void)
321 7a3f1944 bellard
{
322 3475187d bellard
    T1 = (uint32_t)PARAM1;
323 7a3f1944 bellard
}
324 7a3f1944 bellard
325 7a3f1944 bellard
void OPPROTO op_movl_T2_im(void)
326 7a3f1944 bellard
{
327 3475187d bellard
    T2 = (uint32_t)PARAM1;
328 3475187d bellard
}
329 3475187d bellard
330 3475187d bellard
void OPPROTO op_movl_T0_sim(void)
331 3475187d bellard
{
332 3475187d bellard
    T0 = (int32_t)PARAM1;
333 3475187d bellard
}
334 3475187d bellard
335 3475187d bellard
void OPPROTO op_movl_T1_sim(void)
336 3475187d bellard
{
337 3475187d bellard
    T1 = (int32_t)PARAM1;
338 3475187d bellard
}
339 3475187d bellard
340 3475187d bellard
void OPPROTO op_movl_T2_sim(void)
341 3475187d bellard
{
342 3475187d bellard
    T2 = (int32_t)PARAM1;
343 3475187d bellard
}
344 3475187d bellard
345 3475187d bellard
void OPPROTO op_movl_T0_env(void)
346 3475187d bellard
{
347 3475187d bellard
    T0 = *(uint32_t *)((char *)env + PARAM1);
348 3475187d bellard
}
349 3475187d bellard
350 3475187d bellard
void OPPROTO op_movl_env_T0(void)
351 3475187d bellard
{
352 3475187d bellard
    *(uint32_t *)((char *)env + PARAM1) = T0;
353 3475187d bellard
}
354 3475187d bellard
355 3475187d bellard
void OPPROTO op_movtl_T0_env(void)
356 3475187d bellard
{
357 3475187d bellard
    T0 = *(target_ulong *)((char *)env + PARAM1);
358 3475187d bellard
}
359 3475187d bellard
360 3475187d bellard
void OPPROTO op_movtl_env_T0(void)
361 3475187d bellard
{
362 3475187d bellard
    *(target_ulong *)((char *)env + PARAM1) = T0;
363 7a3f1944 bellard
}
364 7a3f1944 bellard
365 af7bf89b bellard
void OPPROTO op_add_T1_T0(void)
366 7a3f1944 bellard
{
367 af7bf89b bellard
    T0 += T1;
368 7a3f1944 bellard
}
369 7a3f1944 bellard
370 af7bf89b bellard
void OPPROTO op_add_T1_T0_cc(void)
371 7a3f1944 bellard
{
372 af7bf89b bellard
    target_ulong src1;
373 7a3f1944 bellard
374 af7bf89b bellard
    src1 = T0;
375 af7bf89b bellard
    T0 += T1;
376 af7bf89b bellard
    env->psr = 0;
377 3475187d bellard
#ifdef TARGET_SPARC64
378 3475187d bellard
    if (!(T0 & 0xffffffff))
379 0f8a249a blueswir1
        env->psr |= PSR_ZERO;
380 3475187d bellard
    if ((int32_t) T0 < 0)
381 0f8a249a blueswir1
        env->psr |= PSR_NEG;
382 bb3911a6 bellard
    if ((T0 & 0xffffffff) < (src1 & 0xffffffff))
383 0f8a249a blueswir1
        env->psr |= PSR_CARRY;
384 3475187d bellard
    if ((((src1 & 0xffffffff) ^ (T1 & 0xffffffff) ^ -1) &
385 0f8a249a blueswir1
         ((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31))
386 0f8a249a blueswir1
        env->psr |= PSR_OVF;
387 3475187d bellard
388 3475187d bellard
    env->xcc = 0;
389 3475187d bellard
    if (!T0)
390 0f8a249a blueswir1
        env->xcc |= PSR_ZERO;
391 3475187d bellard
    if ((int64_t) T0 < 0)
392 0f8a249a blueswir1
        env->xcc |= PSR_NEG;
393 3475187d bellard
    if (T0 < src1)
394 0f8a249a blueswir1
        env->xcc |= PSR_CARRY;
395 3475187d bellard
    if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1ULL << 63))
396 0f8a249a blueswir1
        env->xcc |= PSR_OVF;
397 3475187d bellard
#else
398 af7bf89b bellard
    if (!T0)
399 0f8a249a blueswir1
        env->psr |= PSR_ZERO;
400 af7bf89b bellard
    if ((int32_t) T0 < 0)
401 0f8a249a blueswir1
        env->psr |= PSR_NEG;
402 af7bf89b bellard
    if (T0 < src1)
403 0f8a249a blueswir1
        env->psr |= PSR_CARRY;
404 af7bf89b bellard
    if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1 << 31))
405 0f8a249a blueswir1
        env->psr |= PSR_OVF;
406 3475187d bellard
#endif
407 af7bf89b bellard
    FORCE_RET();
408 7a3f1944 bellard
}
409 7a3f1944 bellard
410 af7bf89b bellard
void OPPROTO op_addx_T1_T0(void)
411 7a3f1944 bellard
{
412 af7bf89b bellard
    T0 += T1 + FLAG_SET(PSR_CARRY);
413 7a3f1944 bellard
}
414 7a3f1944 bellard
415 af7bf89b bellard
void OPPROTO op_addx_T1_T0_cc(void)
416 7a3f1944 bellard
{
417 af7bf89b bellard
    target_ulong src1;
418 cf495bcf bellard
    src1 = T0;
419 b854608e bellard
    if (FLAG_SET(PSR_CARRY))
420 b854608e bellard
    {
421 b854608e bellard
      T0 += T1 + 1;
422 b854608e bellard
      env->psr = 0;
423 b854608e bellard
#ifdef TARGET_SPARC64
424 b854608e bellard
      if ((T0 & 0xffffffff) <= (src1 & 0xffffffff))
425 b854608e bellard
        env->psr |= PSR_CARRY;
426 b854608e bellard
      env->xcc = 0;
427 b854608e bellard
      if (T0 <= src1)
428 b854608e bellard
        env->xcc |= PSR_CARRY;
429 b854608e bellard
#else
430 b854608e bellard
      if (T0 <= src1)
431 b854608e bellard
        env->psr |= PSR_CARRY;
432 b854608e bellard
#endif
433 b854608e bellard
    }
434 b854608e bellard
    else
435 b854608e bellard
    {
436 b854608e bellard
      T0 += T1;
437 b854608e bellard
      env->psr = 0;
438 b854608e bellard
#ifdef TARGET_SPARC64
439 b854608e bellard
      if ((T0 & 0xffffffff) < (src1 & 0xffffffff))
440 b854608e bellard
        env->psr |= PSR_CARRY;
441 b854608e bellard
      env->xcc = 0;
442 b854608e bellard
      if (T0 < src1)
443 b854608e bellard
        env->xcc |= PSR_CARRY;
444 b854608e bellard
#else
445 b854608e bellard
      if (T0 < src1)
446 b854608e bellard
        env->psr |= PSR_CARRY;
447 b854608e bellard
#endif
448 b854608e bellard
    }
449 3475187d bellard
#ifdef TARGET_SPARC64
450 3475187d bellard
    if (!(T0 & 0xffffffff))
451 0f8a249a blueswir1
        env->psr |= PSR_ZERO;
452 3475187d bellard
    if ((int32_t) T0 < 0)
453 0f8a249a blueswir1
        env->psr |= PSR_NEG;
454 3475187d bellard
    if ((((src1 & 0xffffffff) ^ (T1 & 0xffffffff) ^ -1) &
455 0f8a249a blueswir1
         ((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31))
456 0f8a249a blueswir1
        env->psr |= PSR_OVF;
457 3475187d bellard
458 3475187d bellard
    if (!T0)
459 0f8a249a blueswir1
        env->xcc |= PSR_ZERO;
460 3475187d bellard
    if ((int64_t) T0 < 0)
461 0f8a249a blueswir1
        env->xcc |= PSR_NEG;
462 3475187d bellard
    if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1ULL << 63))
463 0f8a249a blueswir1
        env->xcc |= PSR_OVF;
464 3475187d bellard
#else
465 cf495bcf bellard
    if (!T0)
466 0f8a249a blueswir1
        env->psr |= PSR_ZERO;
467 af7bf89b bellard
    if ((int32_t) T0 < 0)
468 0f8a249a blueswir1
        env->psr |= PSR_NEG;
469 cf495bcf bellard
    if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1 << 31))
470 0f8a249a blueswir1
        env->psr |= PSR_OVF;
471 3475187d bellard
#endif
472 cf495bcf bellard
    FORCE_RET();
473 7a3f1944 bellard
}
474 7a3f1944 bellard
475 e32f879d blueswir1
void OPPROTO op_tadd_T1_T0_cc(void)
476 e32f879d blueswir1
{
477 e32f879d blueswir1
    target_ulong src1;
478 e32f879d blueswir1
479 e32f879d blueswir1
    src1 = T0;
480 e32f879d blueswir1
    T0 += T1;
481 e32f879d blueswir1
    env->psr = 0;
482 e32f879d blueswir1
#ifdef TARGET_SPARC64
483 e32f879d blueswir1
    if (!(T0 & 0xffffffff))
484 0f8a249a blueswir1
        env->psr |= PSR_ZERO;
485 e32f879d blueswir1
    if ((int32_t) T0 < 0)
486 0f8a249a blueswir1
        env->psr |= PSR_NEG;
487 e32f879d blueswir1
    if ((T0 & 0xffffffff) < (src1 & 0xffffffff))
488 0f8a249a blueswir1
        env->psr |= PSR_CARRY;
489 e32f879d blueswir1
    if ((((src1 & 0xffffffff) ^ (T1 & 0xffffffff) ^ -1) &
490 0f8a249a blueswir1
         ((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31))
491 0f8a249a blueswir1
        env->psr |= PSR_OVF;
492 e32f879d blueswir1
    if ((src1 & 0x03) || (T1 & 0x03))
493 0f8a249a blueswir1
        env->psr |= PSR_OVF;
494 e32f879d blueswir1
495 e32f879d blueswir1
    env->xcc = 0;
496 e32f879d blueswir1
    if (!T0)
497 0f8a249a blueswir1
        env->xcc |= PSR_ZERO;
498 e32f879d blueswir1
    if ((int64_t) T0 < 0)
499 0f8a249a blueswir1
        env->xcc |= PSR_NEG;
500 e32f879d blueswir1
    if (T0 < src1)
501 0f8a249a blueswir1
        env->xcc |= PSR_CARRY;
502 e32f879d blueswir1
    if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1ULL << 63))
503 0f8a249a blueswir1
        env->xcc |= PSR_OVF;
504 e32f879d blueswir1
#else
505 e32f879d blueswir1
    if (!T0)
506 0f8a249a blueswir1
        env->psr |= PSR_ZERO;
507 e32f879d blueswir1
    if ((int32_t) T0 < 0)
508 0f8a249a blueswir1
        env->psr |= PSR_NEG;
509 e32f879d blueswir1
    if (T0 < src1)
510 0f8a249a blueswir1
        env->psr |= PSR_CARRY;
511 e32f879d blueswir1
    if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1 << 31))
512 0f8a249a blueswir1
        env->psr |= PSR_OVF;
513 e32f879d blueswir1
    if ((src1 & 0x03) || (T1 & 0x03))
514 0f8a249a blueswir1
        env->psr |= PSR_OVF;
515 e32f879d blueswir1
#endif
516 e32f879d blueswir1
    FORCE_RET();
517 e32f879d blueswir1
}
518 e32f879d blueswir1
519 e32f879d blueswir1
void OPPROTO op_tadd_T1_T0_ccTV(void)
520 e32f879d blueswir1
{
521 e32f879d blueswir1
    target_ulong src1;
522 e32f879d blueswir1
523 d69d2ca9 blueswir1
    if ((T0 & 0x03) || (T1 & 0x03)) {
524 e32f879d blueswir1
        raise_exception(TT_TOVF);
525 d69d2ca9 blueswir1
        FORCE_RET();
526 d69d2ca9 blueswir1
        return;
527 d69d2ca9 blueswir1
    }
528 e32f879d blueswir1
529 e32f879d blueswir1
    src1 = T0;
530 e32f879d blueswir1
    T0 += T1;
531 e32f879d blueswir1
532 e32f879d blueswir1
#ifdef TARGET_SPARC64
533 e32f879d blueswir1
    if ((((src1 & 0xffffffff) ^ (T1 & 0xffffffff) ^ -1) &
534 0f8a249a blueswir1
         ((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31))
535 e32f879d blueswir1
        raise_exception(TT_TOVF);
536 e32f879d blueswir1
#else
537 90251fb9 blueswir1
    if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1 << 31))
538 e32f879d blueswir1
        raise_exception(TT_TOVF);
539 e32f879d blueswir1
#endif
540 e32f879d blueswir1
541 e32f879d blueswir1
    env->psr = 0;
542 e32f879d blueswir1
#ifdef TARGET_SPARC64
543 e32f879d blueswir1
    if (!(T0 & 0xffffffff))
544 0f8a249a blueswir1
        env->psr |= PSR_ZERO;
545 e32f879d blueswir1
    if ((int32_t) T0 < 0)
546 0f8a249a blueswir1
        env->psr |= PSR_NEG;
547 e32f879d blueswir1
    if ((T0 & 0xffffffff) < (src1 & 0xffffffff))
548 0f8a249a blueswir1
        env->psr |= PSR_CARRY;
549 e32f879d blueswir1
550 e32f879d blueswir1
    env->xcc = 0;
551 e32f879d blueswir1
    if (!T0)
552 0f8a249a blueswir1
        env->xcc |= PSR_ZERO;
553 e32f879d blueswir1
    if ((int64_t) T0 < 0)
554 0f8a249a blueswir1
        env->xcc |= PSR_NEG;
555 e32f879d blueswir1
    if (T0 < src1)
556 0f8a249a blueswir1
        env->xcc |= PSR_CARRY;
557 e32f879d blueswir1
#else
558 e32f879d blueswir1
    if (!T0)
559 0f8a249a blueswir1
        env->psr |= PSR_ZERO;
560 e32f879d blueswir1
    if ((int32_t) T0 < 0)
561 0f8a249a blueswir1
        env->psr |= PSR_NEG;
562 e32f879d blueswir1
    if (T0 < src1)
563 0f8a249a blueswir1
        env->psr |= PSR_CARRY;
564 e32f879d blueswir1
#endif
565 e32f879d blueswir1
    FORCE_RET();
566 e32f879d blueswir1
}
567 e32f879d blueswir1
568 cf495bcf bellard
void OPPROTO op_sub_T1_T0(void)
569 7a3f1944 bellard
{
570 cf495bcf bellard
    T0 -= T1;
571 7a3f1944 bellard
}
572 7a3f1944 bellard
573 cf495bcf bellard
void OPPROTO op_sub_T1_T0_cc(void)
574 7a3f1944 bellard
{
575 af7bf89b bellard
    target_ulong src1;
576 cf495bcf bellard
577 cf495bcf bellard
    src1 = T0;
578 cf495bcf bellard
    T0 -= T1;
579 cf495bcf bellard
    env->psr = 0;
580 3475187d bellard
#ifdef TARGET_SPARC64
581 3475187d bellard
    if (!(T0 & 0xffffffff))
582 0f8a249a blueswir1
        env->psr |= PSR_ZERO;
583 3475187d bellard
    if ((int32_t) T0 < 0)
584 0f8a249a blueswir1
        env->psr |= PSR_NEG;
585 83469015 bellard
    if ((src1 & 0xffffffff) < (T1 & 0xffffffff))
586 0f8a249a blueswir1
        env->psr |= PSR_CARRY;
587 3475187d bellard
    if ((((src1 & 0xffffffff) ^ (T1 & 0xffffffff)) &
588 0f8a249a blueswir1
         ((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31))
589 0f8a249a blueswir1
        env->psr |= PSR_OVF;
590 3475187d bellard
591 3475187d bellard
    env->xcc = 0;
592 3475187d bellard
    if (!T0)
593 0f8a249a blueswir1
        env->xcc |= PSR_ZERO;
594 3475187d bellard
    if ((int64_t) T0 < 0)
595 0f8a249a blueswir1
        env->xcc |= PSR_NEG;
596 bb3911a6 bellard
    if (src1 < T1)
597 0f8a249a blueswir1
        env->xcc |= PSR_CARRY;
598 3475187d bellard
    if (((src1 ^ T1) & (src1 ^ T0)) & (1ULL << 63))
599 0f8a249a blueswir1
        env->xcc |= PSR_OVF;
600 3475187d bellard
#else
601 cf495bcf bellard
    if (!T0)
602 0f8a249a blueswir1
        env->psr |= PSR_ZERO;
603 af7bf89b bellard
    if ((int32_t) T0 < 0)
604 0f8a249a blueswir1
        env->psr |= PSR_NEG;
605 cf495bcf bellard
    if (src1 < T1)
606 0f8a249a blueswir1
        env->psr |= PSR_CARRY;
607 cf495bcf bellard
    if (((src1 ^ T1) & (src1 ^ T0)) & (1 << 31))
608 0f8a249a blueswir1
        env->psr |= PSR_OVF;
609 3475187d bellard
#endif
610 af7bf89b bellard
    FORCE_RET();
611 af7bf89b bellard
}
612 af7bf89b bellard
613 af7bf89b bellard
void OPPROTO op_subx_T1_T0(void)
614 af7bf89b bellard
{
615 af7bf89b bellard
    T0 -= T1 + FLAG_SET(PSR_CARRY);
616 af7bf89b bellard
}
617 af7bf89b bellard
618 af7bf89b bellard
void OPPROTO op_subx_T1_T0_cc(void)
619 af7bf89b bellard
{
620 af7bf89b bellard
    target_ulong src1;
621 af7bf89b bellard
    src1 = T0;
622 b854608e bellard
    if (FLAG_SET(PSR_CARRY))
623 b854608e bellard
    {
624 b854608e bellard
      T0 -= T1 + 1;
625 b854608e bellard
      env->psr = 0;
626 b854608e bellard
#ifdef TARGET_SPARC64
627 b854608e bellard
      if ((src1 & 0xffffffff) <= (T1 & 0xffffffff))
628 b854608e bellard
        env->psr |= PSR_CARRY;
629 b854608e bellard
      env->xcc = 0;
630 b854608e bellard
      if (src1 <= T1)
631 b854608e bellard
        env->xcc |= PSR_CARRY;
632 b854608e bellard
#else
633 b854608e bellard
      if (src1 <= T1)
634 b854608e bellard
        env->psr |= PSR_CARRY;
635 b854608e bellard
#endif
636 b854608e bellard
    }
637 b854608e bellard
    else
638 b854608e bellard
    {
639 b854608e bellard
      T0 -= T1;
640 b854608e bellard
      env->psr = 0;
641 b854608e bellard
#ifdef TARGET_SPARC64
642 b854608e bellard
      if ((src1 & 0xffffffff) < (T1 & 0xffffffff))
643 b854608e bellard
        env->psr |= PSR_CARRY;
644 b854608e bellard
      env->xcc = 0;
645 b854608e bellard
      if (src1 < T1)
646 b854608e bellard
        env->xcc |= PSR_CARRY;
647 b854608e bellard
#else
648 b854608e bellard
      if (src1 < T1)
649 b854608e bellard
        env->psr |= PSR_CARRY;
650 b854608e bellard
#endif
651 b854608e bellard
    }
652 3475187d bellard
#ifdef TARGET_SPARC64
653 3475187d bellard
    if (!(T0 & 0xffffffff))
654 0f8a249a blueswir1
        env->psr |= PSR_ZERO;
655 3475187d bellard
    if ((int32_t) T0 < 0)
656 0f8a249a blueswir1
        env->psr |= PSR_NEG;
657 3475187d bellard
    if ((((src1 & 0xffffffff) ^ (T1 & 0xffffffff)) &
658 0f8a249a blueswir1
         ((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31))
659 0f8a249a blueswir1
        env->psr |= PSR_OVF;
660 3475187d bellard
661 3475187d bellard
    if (!T0)
662 0f8a249a blueswir1
        env->xcc |= PSR_ZERO;
663 3475187d bellard
    if ((int64_t) T0 < 0)
664 0f8a249a blueswir1
        env->xcc |= PSR_NEG;
665 3475187d bellard
    if (((src1 ^ T1) & (src1 ^ T0)) & (1ULL << 63))
666 0f8a249a blueswir1
        env->xcc |= PSR_OVF;
667 3475187d bellard
#else
668 af7bf89b bellard
    if (!T0)
669 0f8a249a blueswir1
        env->psr |= PSR_ZERO;
670 af7bf89b bellard
    if ((int32_t) T0 < 0)
671 0f8a249a blueswir1
        env->psr |= PSR_NEG;
672 af7bf89b bellard
    if (((src1 ^ T1) & (src1 ^ T0)) & (1 << 31))
673 0f8a249a blueswir1
        env->psr |= PSR_OVF;
674 3475187d bellard
#endif
675 cf495bcf bellard
    FORCE_RET();
676 7a3f1944 bellard
}
677 7a3f1944 bellard
678 e32f879d blueswir1
void OPPROTO op_tsub_T1_T0_cc(void)
679 e32f879d blueswir1
{
680 e32f879d blueswir1
    target_ulong src1;
681 e32f879d blueswir1
682 e32f879d blueswir1
    src1 = T0;
683 e32f879d blueswir1
    T0 -= T1;
684 e32f879d blueswir1
    env->psr = 0;
685 e32f879d blueswir1
#ifdef TARGET_SPARC64
686 e32f879d blueswir1
    if (!(T0 & 0xffffffff))
687 0f8a249a blueswir1
        env->psr |= PSR_ZERO;
688 e32f879d blueswir1
    if ((int32_t) T0 < 0)
689 0f8a249a blueswir1
        env->psr |= PSR_NEG;
690 e32f879d blueswir1
    if ((src1 & 0xffffffff) < (T1 & 0xffffffff))
691 0f8a249a blueswir1
        env->psr |= PSR_CARRY;
692 e32f879d blueswir1
    if ((((src1 & 0xffffffff) ^ (T1 & 0xffffffff)) &
693 0f8a249a blueswir1
         ((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31))
694 0f8a249a blueswir1
        env->psr |= PSR_OVF;
695 e32f879d blueswir1
    if ((src1 & 0x03) || (T1 & 0x03))
696 0f8a249a blueswir1
        env->psr |= PSR_OVF;
697 e32f879d blueswir1
698 e32f879d blueswir1
    env->xcc = 0;
699 e32f879d blueswir1
    if (!T0)
700 0f8a249a blueswir1
        env->xcc |= PSR_ZERO;
701 e32f879d blueswir1
    if ((int64_t) T0 < 0)
702 0f8a249a blueswir1
        env->xcc |= PSR_NEG;
703 e32f879d blueswir1
    if (src1 < T1)
704 0f8a249a blueswir1
        env->xcc |= PSR_CARRY;
705 e32f879d blueswir1
    if (((src1 ^ T1) & (src1 ^ T0)) & (1ULL << 63))
706 0f8a249a blueswir1
        env->xcc |= PSR_OVF;
707 e32f879d blueswir1
#else
708 e32f879d blueswir1
    if (!T0)
709 0f8a249a blueswir1
        env->psr |= PSR_ZERO;
710 e32f879d blueswir1
    if ((int32_t) T0 < 0)
711 0f8a249a blueswir1
        env->psr |= PSR_NEG;
712 e32f879d blueswir1
    if (src1 < T1)
713 0f8a249a blueswir1
        env->psr |= PSR_CARRY;
714 e32f879d blueswir1
    if (((src1 ^ T1) & (src1 ^ T0)) & (1 << 31))
715 0f8a249a blueswir1
        env->psr |= PSR_OVF;
716 e32f879d blueswir1
    if ((src1 & 0x03) || (T1 & 0x03))
717 0f8a249a blueswir1
        env->psr |= PSR_OVF;
718 e32f879d blueswir1
#endif
719 e32f879d blueswir1
    FORCE_RET();
720 e32f879d blueswir1
}
721 e32f879d blueswir1
722 e32f879d blueswir1
void OPPROTO op_tsub_T1_T0_ccTV(void)
723 e32f879d blueswir1
{
724 e32f879d blueswir1
    target_ulong src1;
725 e32f879d blueswir1
726 e32f879d blueswir1
    if ((T0 & 0x03) || (T1 & 0x03))
727 e32f879d blueswir1
        raise_exception(TT_TOVF);
728 e32f879d blueswir1
729 e32f879d blueswir1
    src1 = T0;
730 e32f879d blueswir1
    T0 -= T1;
731 e32f879d blueswir1
732 e32f879d blueswir1
#ifdef TARGET_SPARC64
733 e32f879d blueswir1
    if ((((src1 & 0xffffffff) ^ (T1 & 0xffffffff)) &
734 0f8a249a blueswir1
         ((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31))
735 e32f879d blueswir1
        raise_exception(TT_TOVF);
736 e32f879d blueswir1
#else
737 e32f879d blueswir1
    if (((src1 ^ T1) & (src1 ^ T0)) & (1 << 31))
738 e32f879d blueswir1
        raise_exception(TT_TOVF);
739 e32f879d blueswir1
#endif
740 e32f879d blueswir1
741 e32f879d blueswir1
    env->psr = 0;
742 e32f879d blueswir1
#ifdef TARGET_SPARC64
743 e32f879d blueswir1
    if (!(T0 & 0xffffffff))
744 0f8a249a blueswir1
        env->psr |= PSR_ZERO;
745 e32f879d blueswir1
    if ((int32_t) T0 < 0)
746 0f8a249a blueswir1
        env->psr |= PSR_NEG;
747 e32f879d blueswir1
    if ((src1 & 0xffffffff) < (T1 & 0xffffffff))
748 0f8a249a blueswir1
        env->psr |= PSR_CARRY;
749 e32f879d blueswir1
750 e32f879d blueswir1
    env->xcc = 0;
751 e32f879d blueswir1
    if (!T0)
752 0f8a249a blueswir1
        env->xcc |= PSR_ZERO;
753 e32f879d blueswir1
    if ((int64_t) T0 < 0)
754 0f8a249a blueswir1
        env->xcc |= PSR_NEG;
755 e32f879d blueswir1
    if (src1 < T1)
756 0f8a249a blueswir1
        env->xcc |= PSR_CARRY;
757 e32f879d blueswir1
#else
758 e32f879d blueswir1
    if (!T0)
759 0f8a249a blueswir1
        env->psr |= PSR_ZERO;
760 e32f879d blueswir1
    if ((int32_t) T0 < 0)
761 0f8a249a blueswir1
        env->psr |= PSR_NEG;
762 e32f879d blueswir1
    if (src1 < T1)
763 0f8a249a blueswir1
        env->psr |= PSR_CARRY;
764 e32f879d blueswir1
#endif
765 e32f879d blueswir1
    FORCE_RET();
766 e32f879d blueswir1
}
767 e32f879d blueswir1
768 cf495bcf bellard
void OPPROTO op_and_T1_T0(void)
769 7a3f1944 bellard
{
770 cf495bcf bellard
    T0 &= T1;
771 7a3f1944 bellard
}
772 7a3f1944 bellard
773 cf495bcf bellard
void OPPROTO op_or_T1_T0(void)
774 7a3f1944 bellard
{
775 cf495bcf bellard
    T0 |= T1;
776 7a3f1944 bellard
}
777 7a3f1944 bellard
778 cf495bcf bellard
void OPPROTO op_xor_T1_T0(void)
779 7a3f1944 bellard
{
780 cf495bcf bellard
    T0 ^= T1;
781 7a3f1944 bellard
}
782 7a3f1944 bellard
783 cf495bcf bellard
void OPPROTO op_andn_T1_T0(void)
784 7a3f1944 bellard
{
785 cf495bcf bellard
    T0 &= ~T1;
786 7a3f1944 bellard
}
787 7a3f1944 bellard
788 cf495bcf bellard
void OPPROTO op_orn_T1_T0(void)
789 7a3f1944 bellard
{
790 cf495bcf bellard
    T0 |= ~T1;
791 7a3f1944 bellard
}
792 7a3f1944 bellard
793 cf495bcf bellard
void OPPROTO op_xnor_T1_T0(void)
794 7a3f1944 bellard
{
795 cf495bcf bellard
    T0 ^= ~T1;
796 7a3f1944 bellard
}
797 7a3f1944 bellard
798 cf495bcf bellard
void OPPROTO op_umul_T1_T0(void)
799 7a3f1944 bellard
{
800 cf495bcf bellard
    uint64_t res;
801 af7bf89b bellard
    res = (uint64_t) T0 * (uint64_t) T1;
802 83469015 bellard
#ifdef TARGET_SPARC64
803 83469015 bellard
    T0 = res;
804 83469015 bellard
#else
805 cf495bcf bellard
    T0 = res & 0xffffffff;
806 83469015 bellard
#endif
807 cf495bcf bellard
    env->y = res >> 32;
808 7a3f1944 bellard
}
809 7a3f1944 bellard
810 cf495bcf bellard
void OPPROTO op_smul_T1_T0(void)
811 7a3f1944 bellard
{
812 cf495bcf bellard
    uint64_t res;
813 cf495bcf bellard
    res = (int64_t) ((int32_t) T0) * (int64_t) ((int32_t) T1);
814 83469015 bellard
#ifdef TARGET_SPARC64
815 83469015 bellard
    T0 = res;
816 83469015 bellard
#else
817 cf495bcf bellard
    T0 = res & 0xffffffff;
818 83469015 bellard
#endif
819 cf495bcf bellard
    env->y = res >> 32;
820 7a3f1944 bellard
}
821 7a3f1944 bellard
822 cf495bcf bellard
void OPPROTO op_mulscc_T1_T0(void)
823 7a3f1944 bellard
{
824 af7bf89b bellard
    unsigned int b1, N, V, b2;
825 af7bf89b bellard
    target_ulong src1;
826 af7bf89b bellard
827 4e8b5da2 bellard
    N = FLAG_SET(PSR_NEG);
828 cf495bcf bellard
    V = FLAG_SET(PSR_OVF);
829 4e8b5da2 bellard
    b1 = N ^ V;
830 cf495bcf bellard
    b2 = T0 & 1;
831 cf495bcf bellard
    T0 = (b1 << 31) | (T0 >> 1);
832 cf495bcf bellard
    if (!(env->y & 1))
833 cf495bcf bellard
        T1 = 0;
834 cf495bcf bellard
    /* do addition and update flags */
835 cf495bcf bellard
    src1 = T0;
836 cf495bcf bellard
    T0 += T1;
837 cf495bcf bellard
    env->psr = 0;
838 cf495bcf bellard
    if (!T0)
839 0f8a249a blueswir1
        env->psr |= PSR_ZERO;
840 af7bf89b bellard
    if ((int32_t) T0 < 0)
841 0f8a249a blueswir1
        env->psr |= PSR_NEG;
842 cf495bcf bellard
    if (T0 < src1)
843 0f8a249a blueswir1
        env->psr |= PSR_CARRY;
844 cf495bcf bellard
    if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1 << 31))
845 0f8a249a blueswir1
        env->psr |= PSR_OVF;
846 cf495bcf bellard
    env->y = (b2 << 31) | (env->y >> 1);
847 cf495bcf bellard
    FORCE_RET();
848 cf495bcf bellard
}
849 cf495bcf bellard
850 cf495bcf bellard
void OPPROTO op_udiv_T1_T0(void)
851 cf495bcf bellard
{
852 cf495bcf bellard
    uint64_t x0;
853 cf495bcf bellard
    uint32_t x1;
854 cf495bcf bellard
855 cf495bcf bellard
    x0 = T0 | ((uint64_t) (env->y) << 32);
856 cf495bcf bellard
    x1 = T1;
857 9bb234b3 ths
858 9bb234b3 ths
    if (x1 == 0) {
859 9bb234b3 ths
        raise_exception(TT_DIV_ZERO);
860 9bb234b3 ths
    }
861 9bb234b3 ths
862 cf495bcf bellard
    x0 = x0 / x1;
863 cf495bcf bellard
    if (x0 > 0xffffffff) {
864 0f8a249a blueswir1
        T0 = 0xffffffff;
865 0f8a249a blueswir1
        T1 = 1;
866 cf495bcf bellard
    } else {
867 0f8a249a blueswir1
        T0 = x0;
868 0f8a249a blueswir1
        T1 = 0;
869 cf495bcf bellard
    }
870 cf495bcf bellard
    FORCE_RET();
871 7a3f1944 bellard
}
872 7a3f1944 bellard
873 cf495bcf bellard
void OPPROTO op_sdiv_T1_T0(void)
874 7a3f1944 bellard
{
875 cf495bcf bellard
    int64_t x0;
876 cf495bcf bellard
    int32_t x1;
877 cf495bcf bellard
878 af7bf89b bellard
    x0 = T0 | ((int64_t) (env->y) << 32);
879 cf495bcf bellard
    x1 = T1;
880 9bb234b3 ths
881 9bb234b3 ths
    if (x1 == 0) {
882 9bb234b3 ths
        raise_exception(TT_DIV_ZERO);
883 9bb234b3 ths
    }
884 9bb234b3 ths
885 cf495bcf bellard
    x0 = x0 / x1;
886 cf495bcf bellard
    if ((int32_t) x0 != x0) {
887 0f8a249a blueswir1
        T0 = x0 < 0? 0x80000000: 0x7fffffff;
888 0f8a249a blueswir1
        T1 = 1;
889 cf495bcf bellard
    } else {
890 0f8a249a blueswir1
        T0 = x0;
891 0f8a249a blueswir1
        T1 = 0;
892 cf495bcf bellard
    }
893 cf495bcf bellard
    FORCE_RET();
894 7a3f1944 bellard
}
895 7a3f1944 bellard
896 cf495bcf bellard
void OPPROTO op_div_cc(void)
897 7a3f1944 bellard
{
898 cf495bcf bellard
    env->psr = 0;
899 3475187d bellard
#ifdef TARGET_SPARC64
900 3475187d bellard
    if (!T0)
901 0f8a249a blueswir1
        env->psr |= PSR_ZERO;
902 3475187d bellard
    if ((int32_t) T0 < 0)
903 0f8a249a blueswir1
        env->psr |= PSR_NEG;
904 3475187d bellard
    if (T1)
905 0f8a249a blueswir1
        env->psr |= PSR_OVF;
906 3475187d bellard
907 3475187d bellard
    env->xcc = 0;
908 3475187d bellard
    if (!T0)
909 0f8a249a blueswir1
        env->xcc |= PSR_ZERO;
910 3475187d bellard
    if ((int64_t) T0 < 0)
911 0f8a249a blueswir1
        env->xcc |= PSR_NEG;
912 3475187d bellard
#else
913 cf495bcf bellard
    if (!T0)
914 0f8a249a blueswir1
        env->psr |= PSR_ZERO;
915 af7bf89b bellard
    if ((int32_t) T0 < 0)
916 0f8a249a blueswir1
        env->psr |= PSR_NEG;
917 cf495bcf bellard
    if (T1)
918 0f8a249a blueswir1
        env->psr |= PSR_OVF;
919 3475187d bellard
#endif
920 cf495bcf bellard
    FORCE_RET();
921 7a3f1944 bellard
}
922 7a3f1944 bellard
923 3475187d bellard
#ifdef TARGET_SPARC64
924 3475187d bellard
void OPPROTO op_mulx_T1_T0(void)
925 3475187d bellard
{
926 3475187d bellard
    T0 *= T1;
927 3475187d bellard
    FORCE_RET();
928 3475187d bellard
}
929 3475187d bellard
930 3475187d bellard
void OPPROTO op_udivx_T1_T0(void)
931 3475187d bellard
{
932 14a1120e blueswir1
    if (T1 == 0) {
933 14a1120e blueswir1
        raise_exception(TT_DIV_ZERO);
934 14a1120e blueswir1
    }
935 3475187d bellard
    T0 /= T1;
936 3475187d bellard
    FORCE_RET();
937 3475187d bellard
}
938 3475187d bellard
939 3475187d bellard
void OPPROTO op_sdivx_T1_T0(void)
940 3475187d bellard
{
941 14a1120e blueswir1
    if (T1 == 0) {
942 14a1120e blueswir1
        raise_exception(TT_DIV_ZERO);
943 14a1120e blueswir1
    }
944 3475187d bellard
    if (T0 == INT64_MIN && T1 == -1)
945 0f8a249a blueswir1
        T0 = INT64_MIN;
946 3475187d bellard
    else
947 0f8a249a blueswir1
        T0 /= (target_long) T1;
948 3475187d bellard
    FORCE_RET();
949 3475187d bellard
}
950 3475187d bellard
#endif
951 3475187d bellard
952 cf495bcf bellard
void OPPROTO op_logic_T0_cc(void)
953 7a3f1944 bellard
{
954 cf495bcf bellard
    env->psr = 0;
955 3475187d bellard
#ifdef TARGET_SPARC64
956 3475187d bellard
    if (!(T0 & 0xffffffff))
957 0f8a249a blueswir1
        env->psr |= PSR_ZERO;
958 3475187d bellard
    if ((int32_t) T0 < 0)
959 0f8a249a blueswir1
        env->psr |= PSR_NEG;
960 3475187d bellard
961 3475187d bellard
    env->xcc = 0;
962 3475187d bellard
    if (!T0)
963 0f8a249a blueswir1
        env->xcc |= PSR_ZERO;
964 3475187d bellard
    if ((int64_t) T0 < 0)
965 0f8a249a blueswir1
        env->xcc |= PSR_NEG;
966 3475187d bellard
#else
967 cf495bcf bellard
    if (!T0)
968 0f8a249a blueswir1
        env->psr |= PSR_ZERO;
969 af7bf89b bellard
    if ((int32_t) T0 < 0)
970 0f8a249a blueswir1
        env->psr |= PSR_NEG;
971 3475187d bellard
#endif
972 cf495bcf bellard
    FORCE_RET();
973 7a3f1944 bellard
}
974 7a3f1944 bellard
975 cf495bcf bellard
void OPPROTO op_sll(void)
976 7a3f1944 bellard
{
977 8a08f9a8 blueswir1
    T0 <<= (T1 & 0x1f);
978 7a3f1944 bellard
}
979 7a3f1944 bellard
980 3475187d bellard
#ifdef TARGET_SPARC64
981 8a08f9a8 blueswir1
void OPPROTO op_sllx(void)
982 8a08f9a8 blueswir1
{
983 8a08f9a8 blueswir1
    T0 <<= (T1 & 0x3f);
984 8a08f9a8 blueswir1
}
985 8a08f9a8 blueswir1
986 3475187d bellard
void OPPROTO op_srl(void)
987 3475187d bellard
{
988 8a08f9a8 blueswir1
    T0 = (T0 & 0xffffffff) >> (T1 & 0x1f);
989 3475187d bellard
}
990 3475187d bellard
991 3475187d bellard
void OPPROTO op_srlx(void)
992 3475187d bellard
{
993 8a08f9a8 blueswir1
    T0 >>= (T1 & 0x3f);
994 3475187d bellard
}
995 3475187d bellard
996 3475187d bellard
void OPPROTO op_sra(void)
997 3475187d bellard
{
998 8a08f9a8 blueswir1
    T0 = ((int32_t) (T0 & 0xffffffff)) >> (T1 & 0x1f);
999 3475187d bellard
}
1000 3475187d bellard
1001 3475187d bellard
void OPPROTO op_srax(void)
1002 3475187d bellard
{
1003 8a08f9a8 blueswir1
    T0 = ((int64_t) T0) >> (T1 & 0x3f);
1004 3475187d bellard
}
1005 3475187d bellard
#else
1006 cf495bcf bellard
void OPPROTO op_srl(void)
1007 7a3f1944 bellard
{
1008 8a08f9a8 blueswir1
    T0 >>= (T1 & 0x1f);
1009 7a3f1944 bellard
}
1010 7a3f1944 bellard
1011 cf495bcf bellard
void OPPROTO op_sra(void)
1012 7a3f1944 bellard
{
1013 8a08f9a8 blueswir1
    T0 = ((int32_t) T0) >> (T1 & 0x1f);
1014 7a3f1944 bellard
}
1015 3475187d bellard
#endif
1016 7a3f1944 bellard
1017 e8af50a3 bellard
/* Load and store */
1018 e8af50a3 bellard
#define MEMSUFFIX _raw
1019 e8af50a3 bellard
#include "op_mem.h"
1020 e8af50a3 bellard
#if !defined(CONFIG_USER_ONLY)
1021 e8af50a3 bellard
#define MEMSUFFIX _user
1022 e8af50a3 bellard
#include "op_mem.h"
1023 e8af50a3 bellard
1024 e8af50a3 bellard
#define MEMSUFFIX _kernel
1025 e8af50a3 bellard
#include "op_mem.h"
1026 6f27aba6 blueswir1
1027 6f27aba6 blueswir1
#ifdef TARGET_SPARC64
1028 6f27aba6 blueswir1
#define MEMSUFFIX _hypv
1029 6f27aba6 blueswir1
#include "op_mem.h"
1030 6f27aba6 blueswir1
#endif
1031 e8af50a3 bellard
#endif
1032 e8af50a3 bellard
1033 e8af50a3 bellard
void OPPROTO op_ldfsr(void)
1034 e8af50a3 bellard
{
1035 3475187d bellard
    PUT_FSR32(env, *((uint32_t *) &FT0));
1036 8d5f07fa bellard
    helper_ldfsr();
1037 e8af50a3 bellard
}
1038 e8af50a3 bellard
1039 e8af50a3 bellard
void OPPROTO op_stfsr(void)
1040 e8af50a3 bellard
{
1041 3475187d bellard
    *((uint32_t *) &FT0) = GET_FSR32(env);
1042 e8af50a3 bellard
}
1043 e8af50a3 bellard
1044 3475187d bellard
#ifndef TARGET_SPARC64
1045 3475187d bellard
void OPPROTO op_rdpsr(void)
1046 7a3f1944 bellard
{
1047 3475187d bellard
    do_rdpsr();
1048 7a3f1944 bellard
}
1049 7a3f1944 bellard
1050 3475187d bellard
void OPPROTO op_wrpsr(void)
1051 7a3f1944 bellard
{
1052 3475187d bellard
    do_wrpsr();
1053 3475187d bellard
    FORCE_RET();
1054 7a3f1944 bellard
}
1055 7a3f1944 bellard
1056 c688a6eb bellard
void OPPROTO op_wrwim(void)
1057 c688a6eb bellard
{
1058 c688a6eb bellard
#if NWINDOWS == 32
1059 c688a6eb bellard
    env->wim = T0;
1060 c688a6eb bellard
#else
1061 c688a6eb bellard
    env->wim = T0 & ((1 << NWINDOWS) - 1);
1062 c688a6eb bellard
#endif
1063 c688a6eb bellard
}
1064 c688a6eb bellard
1065 3475187d bellard
void OPPROTO op_rett(void)
1066 cf495bcf bellard
{
1067 3475187d bellard
    helper_rett();
1068 3475187d bellard
    FORCE_RET();
1069 e8af50a3 bellard
}
1070 e8af50a3 bellard
1071 3475187d bellard
/* XXX: use another pointer for %iN registers to avoid slow wrapping
1072 3475187d bellard
   handling ? */
1073 3475187d bellard
void OPPROTO op_save(void)
1074 e8af50a3 bellard
{
1075 3475187d bellard
    uint32_t cwp;
1076 5fafdf24 ths
    cwp = (env->cwp - 1) & (NWINDOWS - 1);
1077 3475187d bellard
    if (env->wim & (1 << cwp)) {
1078 3475187d bellard
        raise_exception(TT_WIN_OVF);
1079 3475187d bellard
    }
1080 3475187d bellard
    set_cwp(cwp);
1081 e8af50a3 bellard
    FORCE_RET();
1082 e8af50a3 bellard
}
1083 e8af50a3 bellard
1084 3475187d bellard
void OPPROTO op_restore(void)
1085 e8af50a3 bellard
{
1086 3475187d bellard
    uint32_t cwp;
1087 5fafdf24 ths
    cwp = (env->cwp + 1) & (NWINDOWS - 1);
1088 3475187d bellard
    if (env->wim & (1 << cwp)) {
1089 3475187d bellard
        raise_exception(TT_WIN_UNF);
1090 3475187d bellard
    }
1091 3475187d bellard
    set_cwp(cwp);
1092 3475187d bellard
    FORCE_RET();
1093 3475187d bellard
}
1094 3475187d bellard
#else
1095 3475187d bellard
void OPPROTO op_rdccr(void)
1096 3475187d bellard
{
1097 3475187d bellard
    T0 = GET_CCR(env);
1098 e8af50a3 bellard
}
1099 e8af50a3 bellard
1100 3475187d bellard
void OPPROTO op_wrccr(void)
1101 e8af50a3 bellard
{
1102 3475187d bellard
    PUT_CCR(env, T0);
1103 e8af50a3 bellard
}
1104 e8af50a3 bellard
1105 3475187d bellard
void OPPROTO op_rdtick(void)
1106 e8af50a3 bellard
{
1107 20c9f095 blueswir1
    T0 = do_tick_get_count(env->tick);
1108 e8af50a3 bellard
}
1109 cf495bcf bellard
1110 3475187d bellard
void OPPROTO op_wrtick(void)
1111 7a3f1944 bellard
{
1112 20c9f095 blueswir1
    do_tick_set_count(env->tick, T0);
1113 20c9f095 blueswir1
}
1114 20c9f095 blueswir1
1115 20c9f095 blueswir1
void OPPROTO op_wrtick_cmpr(void)
1116 20c9f095 blueswir1
{
1117 20c9f095 blueswir1
    do_tick_set_limit(env->tick, T0);
1118 20c9f095 blueswir1
}
1119 20c9f095 blueswir1
1120 20c9f095 blueswir1
void OPPROTO op_rdstick(void)
1121 20c9f095 blueswir1
{
1122 20c9f095 blueswir1
    T0 = do_tick_get_count(env->stick);
1123 20c9f095 blueswir1
}
1124 20c9f095 blueswir1
1125 20c9f095 blueswir1
void OPPROTO op_wrstick(void)
1126 20c9f095 blueswir1
{
1127 20c9f095 blueswir1
    do_tick_set_count(env->stick, T0);
1128 20c9f095 blueswir1
    do_tick_set_count(env->hstick, T0);
1129 20c9f095 blueswir1
}
1130 20c9f095 blueswir1
1131 20c9f095 blueswir1
void OPPROTO op_wrstick_cmpr(void)
1132 20c9f095 blueswir1
{
1133 20c9f095 blueswir1
    do_tick_set_limit(env->stick, T0);
1134 20c9f095 blueswir1
}
1135 20c9f095 blueswir1
1136 20c9f095 blueswir1
void OPPROTO op_wrhstick_cmpr(void)
1137 20c9f095 blueswir1
{
1138 20c9f095 blueswir1
    do_tick_set_limit(env->hstick, T0);
1139 7a3f1944 bellard
}
1140 7a3f1944 bellard
1141 3475187d bellard
void OPPROTO op_rdtpc(void)
1142 cf495bcf bellard
{
1143 3475187d bellard
    T0 = env->tpc[env->tl];
1144 3475187d bellard
}
1145 3475187d bellard
1146 3475187d bellard
void OPPROTO op_wrtpc(void)
1147 3475187d bellard
{
1148 3475187d bellard
    env->tpc[env->tl] = T0;
1149 3475187d bellard
}
1150 3475187d bellard
1151 3475187d bellard
void OPPROTO op_rdtnpc(void)
1152 3475187d bellard
{
1153 3475187d bellard
    T0 = env->tnpc[env->tl];
1154 3475187d bellard
}
1155 3475187d bellard
1156 3475187d bellard
void OPPROTO op_wrtnpc(void)
1157 3475187d bellard
{
1158 3475187d bellard
    env->tnpc[env->tl] = T0;
1159 3475187d bellard
}
1160 3475187d bellard
1161 3475187d bellard
void OPPROTO op_rdtstate(void)
1162 3475187d bellard
{
1163 3475187d bellard
    T0 = env->tstate[env->tl];
1164 3475187d bellard
}
1165 3475187d bellard
1166 3475187d bellard
void OPPROTO op_wrtstate(void)
1167 3475187d bellard
{
1168 3475187d bellard
    env->tstate[env->tl] = T0;
1169 3475187d bellard
}
1170 3475187d bellard
1171 3475187d bellard
void OPPROTO op_rdtt(void)
1172 3475187d bellard
{
1173 3475187d bellard
    T0 = env->tt[env->tl];
1174 3475187d bellard
}
1175 3475187d bellard
1176 3475187d bellard
void OPPROTO op_wrtt(void)
1177 3475187d bellard
{
1178 3475187d bellard
    env->tt[env->tl] = T0;
1179 3475187d bellard
}
1180 3475187d bellard
1181 3475187d bellard
void OPPROTO op_rdpstate(void)
1182 3475187d bellard
{
1183 3475187d bellard
    T0 = env->pstate;
1184 3475187d bellard
}
1185 3475187d bellard
1186 3475187d bellard
void OPPROTO op_wrpstate(void)
1187 3475187d bellard
{
1188 83469015 bellard
    do_wrpstate();
1189 3475187d bellard
}
1190 3475187d bellard
1191 3475187d bellard
// CWP handling is reversed in V9, but we still use the V8 register
1192 3475187d bellard
// order.
1193 3475187d bellard
void OPPROTO op_rdcwp(void)
1194 3475187d bellard
{
1195 17d996e1 blueswir1
    T0 = GET_CWP64(env);
1196 3475187d bellard
}
1197 3475187d bellard
1198 3475187d bellard
void OPPROTO op_wrcwp(void)
1199 3475187d bellard
{
1200 17d996e1 blueswir1
    PUT_CWP64(env, T0);
1201 cf495bcf bellard
}
1202 7a3f1944 bellard
1203 cf495bcf bellard
/* XXX: use another pointer for %iN registers to avoid slow wrapping
1204 cf495bcf bellard
   handling ? */
1205 cf495bcf bellard
void OPPROTO op_save(void)
1206 7a3f1944 bellard
{
1207 af7bf89b bellard
    uint32_t cwp;
1208 5fafdf24 ths
    cwp = (env->cwp - 1) & (NWINDOWS - 1);
1209 3475187d bellard
    if (env->cansave == 0) {
1210 5fafdf24 ths
        raise_exception(TT_SPILL | (env->otherwin != 0 ?
1211 0f8a249a blueswir1
                                    (TT_WOTHER | ((env->wstate & 0x38) >> 1)):
1212 0f8a249a blueswir1
                                    ((env->wstate & 0x7) << 2)));
1213 3475187d bellard
    } else {
1214 0f8a249a blueswir1
        if (env->cleanwin - env->canrestore == 0) {
1215 0f8a249a blueswir1
            // XXX Clean windows without trap
1216 0f8a249a blueswir1
            raise_exception(TT_CLRWIN);
1217 0f8a249a blueswir1
        } else {
1218 0f8a249a blueswir1
            env->cansave--;
1219 0f8a249a blueswir1
            env->canrestore++;
1220 0f8a249a blueswir1
            set_cwp(cwp);
1221 0f8a249a blueswir1
        }
1222 cf495bcf bellard
    }
1223 cf495bcf bellard
    FORCE_RET();
1224 7a3f1944 bellard
}
1225 7a3f1944 bellard
1226 cf495bcf bellard
void OPPROTO op_restore(void)
1227 7a3f1944 bellard
{
1228 af7bf89b bellard
    uint32_t cwp;
1229 5fafdf24 ths
    cwp = (env->cwp + 1) & (NWINDOWS - 1);
1230 3475187d bellard
    if (env->canrestore == 0) {
1231 5fafdf24 ths
        raise_exception(TT_FILL | (env->otherwin != 0 ?
1232 0f8a249a blueswir1
                                   (TT_WOTHER | ((env->wstate & 0x38) >> 1)):
1233 0f8a249a blueswir1
                                   ((env->wstate & 0x7) << 2)));
1234 3475187d bellard
    } else {
1235 0f8a249a blueswir1
        env->cansave++;
1236 0f8a249a blueswir1
        env->canrestore--;
1237 0f8a249a blueswir1
        set_cwp(cwp);
1238 cf495bcf bellard
    }
1239 cf495bcf bellard
    FORCE_RET();
1240 7a3f1944 bellard
}
1241 3475187d bellard
#endif
1242 7a3f1944 bellard
1243 cf495bcf bellard
void OPPROTO op_exception(void)
1244 7a3f1944 bellard
{
1245 cf495bcf bellard
    env->exception_index = PARAM1;
1246 cf495bcf bellard
    cpu_loop_exit();
1247 7a3f1944 bellard
}
1248 7a3f1944 bellard
1249 cf495bcf bellard
void OPPROTO op_trap_T0(void)
1250 7a3f1944 bellard
{
1251 cf495bcf bellard
    env->exception_index = TT_TRAP + (T0 & 0x7f);
1252 cf495bcf bellard
    cpu_loop_exit();
1253 7a3f1944 bellard
}
1254 7a3f1944 bellard
1255 cf495bcf bellard
void OPPROTO op_trapcc_T0(void)
1256 7a3f1944 bellard
{
1257 cf495bcf bellard
    if (T2) {
1258 cf495bcf bellard
        env->exception_index = TT_TRAP + (T0 & 0x7f);
1259 cf495bcf bellard
        cpu_loop_exit();
1260 cf495bcf bellard
    }
1261 cf495bcf bellard
    FORCE_RET();
1262 7a3f1944 bellard
}
1263 7a3f1944 bellard
1264 e80cfcfc bellard
void OPPROTO op_fpexception_im(void)
1265 e8af50a3 bellard
{
1266 e80cfcfc bellard
    env->exception_index = TT_FP_EXCP;
1267 e80cfcfc bellard
    env->fsr &= ~FSR_FTT_MASK;
1268 e80cfcfc bellard
    env->fsr |= PARAM1;
1269 e8af50a3 bellard
    cpu_loop_exit();
1270 e80cfcfc bellard
    FORCE_RET();
1271 e80cfcfc bellard
}
1272 e80cfcfc bellard
1273 e80cfcfc bellard
void OPPROTO op_debug(void)
1274 e80cfcfc bellard
{
1275 e80cfcfc bellard
    helper_debug();
1276 e8af50a3 bellard
}
1277 e8af50a3 bellard
1278 cf495bcf bellard
void OPPROTO op_exit_tb(void)
1279 7a3f1944 bellard
{
1280 cf495bcf bellard
    EXIT_TB();
1281 7a3f1944 bellard
}
1282 7a3f1944 bellard
1283 3475187d bellard
void OPPROTO op_eval_ba(void)
1284 3475187d bellard
{
1285 3475187d bellard
    T2 = 1;
1286 3475187d bellard
}
1287 3475187d bellard
1288 cf495bcf bellard
void OPPROTO op_eval_be(void)
1289 7a3f1944 bellard
{
1290 af7bf89b bellard
    T2 = FLAG_SET(PSR_ZERO);
1291 7a3f1944 bellard
}
1292 7a3f1944 bellard
1293 cf495bcf bellard
void OPPROTO op_eval_ble(void)
1294 7a3f1944 bellard
{
1295 af7bf89b bellard
    target_ulong Z = FLAG_SET(PSR_ZERO), N = FLAG_SET(PSR_NEG), V = FLAG_SET(PSR_OVF);
1296 3b46e624 ths
1297 cf495bcf bellard
    T2 = Z | (N ^ V);
1298 7a3f1944 bellard
}
1299 7a3f1944 bellard
1300 cf495bcf bellard
void OPPROTO op_eval_bl(void)
1301 7a3f1944 bellard
{
1302 af7bf89b bellard
    target_ulong N = FLAG_SET(PSR_NEG), V = FLAG_SET(PSR_OVF);
1303 612b477d bellard
1304 cf495bcf bellard
    T2 = N ^ V;
1305 7a3f1944 bellard
}
1306 7a3f1944 bellard
1307 cf495bcf bellard
void OPPROTO op_eval_bleu(void)
1308 7a3f1944 bellard
{
1309 af7bf89b bellard
    target_ulong Z = FLAG_SET(PSR_ZERO), C = FLAG_SET(PSR_CARRY);
1310 612b477d bellard
1311 cf495bcf bellard
    T2 = C | Z;
1312 7a3f1944 bellard
}
1313 7a3f1944 bellard
1314 cf495bcf bellard
void OPPROTO op_eval_bcs(void)
1315 7a3f1944 bellard
{
1316 af7bf89b bellard
    T2 = FLAG_SET(PSR_CARRY);
1317 7a3f1944 bellard
}
1318 7a3f1944 bellard
1319 cf495bcf bellard
void OPPROTO op_eval_bvs(void)
1320 7a3f1944 bellard
{
1321 af7bf89b bellard
    T2 = FLAG_SET(PSR_OVF);
1322 7a3f1944 bellard
}
1323 7a3f1944 bellard
1324 3475187d bellard
void OPPROTO op_eval_bn(void)
1325 3475187d bellard
{
1326 3475187d bellard
    T2 = 0;
1327 3475187d bellard
}
1328 3475187d bellard
1329 cf495bcf bellard
void OPPROTO op_eval_bneg(void)
1330 7a3f1944 bellard
{
1331 af7bf89b bellard
    T2 = FLAG_SET(PSR_NEG);
1332 7a3f1944 bellard
}
1333 7a3f1944 bellard
1334 cf495bcf bellard
void OPPROTO op_eval_bne(void)
1335 7a3f1944 bellard
{
1336 af7bf89b bellard
    T2 = !FLAG_SET(PSR_ZERO);
1337 7a3f1944 bellard
}
1338 7a3f1944 bellard
1339 cf495bcf bellard
void OPPROTO op_eval_bg(void)
1340 7a3f1944 bellard
{
1341 af7bf89b bellard
    target_ulong Z = FLAG_SET(PSR_ZERO), N = FLAG_SET(PSR_NEG), V = FLAG_SET(PSR_OVF);
1342 612b477d bellard
1343 cf495bcf bellard
    T2 = !(Z | (N ^ V));
1344 7a3f1944 bellard
}
1345 7a3f1944 bellard
1346 cf495bcf bellard
void OPPROTO op_eval_bge(void)
1347 7a3f1944 bellard
{
1348 af7bf89b bellard
    target_ulong N = FLAG_SET(PSR_NEG), V = FLAG_SET(PSR_OVF);
1349 612b477d bellard
1350 cf495bcf bellard
    T2 = !(N ^ V);
1351 7a3f1944 bellard
}
1352 7a3f1944 bellard
1353 cf495bcf bellard
void OPPROTO op_eval_bgu(void)
1354 7a3f1944 bellard
{
1355 af7bf89b bellard
    target_ulong Z = FLAG_SET(PSR_ZERO), C = FLAG_SET(PSR_CARRY);
1356 612b477d bellard
1357 cf495bcf bellard
    T2 = !(C | Z);
1358 7a3f1944 bellard
}
1359 7a3f1944 bellard
1360 cf495bcf bellard
void OPPROTO op_eval_bcc(void)
1361 7a3f1944 bellard
{
1362 af7bf89b bellard
    T2 = !FLAG_SET(PSR_CARRY);
1363 7a3f1944 bellard
}
1364 7a3f1944 bellard
1365 cf495bcf bellard
void OPPROTO op_eval_bpos(void)
1366 cf495bcf bellard
{
1367 af7bf89b bellard
    T2 = !FLAG_SET(PSR_NEG);
1368 cf495bcf bellard
}
1369 cf495bcf bellard
1370 cf495bcf bellard
void OPPROTO op_eval_bvc(void)
1371 cf495bcf bellard
{
1372 af7bf89b bellard
    T2 = !FLAG_SET(PSR_OVF);
1373 cf495bcf bellard
}
1374 cf495bcf bellard
1375 3475187d bellard
#ifdef TARGET_SPARC64
1376 3475187d bellard
void OPPROTO op_eval_xbe(void)
1377 3475187d bellard
{
1378 3475187d bellard
    T2 = XFLAG_SET(PSR_ZERO);
1379 3475187d bellard
}
1380 e8af50a3 bellard
1381 3475187d bellard
void OPPROTO op_eval_xble(void)
1382 e8af50a3 bellard
{
1383 3475187d bellard
    target_ulong Z = XFLAG_SET(PSR_ZERO), N = XFLAG_SET(PSR_NEG), V = XFLAG_SET(PSR_OVF);
1384 3b46e624 ths
1385 3475187d bellard
    T2 = Z | (N ^ V);
1386 e8af50a3 bellard
}
1387 e8af50a3 bellard
1388 3475187d bellard
void OPPROTO op_eval_xbl(void)
1389 e8af50a3 bellard
{
1390 3475187d bellard
    target_ulong N = XFLAG_SET(PSR_NEG), V = XFLAG_SET(PSR_OVF);
1391 3475187d bellard
1392 3475187d bellard
    T2 = N ^ V;
1393 e8af50a3 bellard
}
1394 e8af50a3 bellard
1395 3475187d bellard
void OPPROTO op_eval_xbleu(void)
1396 e8af50a3 bellard
{
1397 3475187d bellard
    target_ulong Z = XFLAG_SET(PSR_ZERO), C = XFLAG_SET(PSR_CARRY);
1398 3475187d bellard
1399 3475187d bellard
    T2 = C | Z;
1400 e8af50a3 bellard
}
1401 e8af50a3 bellard
1402 3475187d bellard
void OPPROTO op_eval_xbcs(void)
1403 e8af50a3 bellard
{
1404 3475187d bellard
    T2 = XFLAG_SET(PSR_CARRY);
1405 e8af50a3 bellard
}
1406 e8af50a3 bellard
1407 3475187d bellard
void OPPROTO op_eval_xbvs(void)
1408 e8af50a3 bellard
{
1409 3475187d bellard
    T2 = XFLAG_SET(PSR_OVF);
1410 e8af50a3 bellard
}
1411 e8af50a3 bellard
1412 3475187d bellard
void OPPROTO op_eval_xbneg(void)
1413 e8af50a3 bellard
{
1414 3475187d bellard
    T2 = XFLAG_SET(PSR_NEG);
1415 e8af50a3 bellard
}
1416 e8af50a3 bellard
1417 3475187d bellard
void OPPROTO op_eval_xbne(void)
1418 e8af50a3 bellard
{
1419 3475187d bellard
    T2 = !XFLAG_SET(PSR_ZERO);
1420 e8af50a3 bellard
}
1421 e8af50a3 bellard
1422 3475187d bellard
void OPPROTO op_eval_xbg(void)
1423 e8af50a3 bellard
{
1424 3475187d bellard
    target_ulong Z = XFLAG_SET(PSR_ZERO), N = XFLAG_SET(PSR_NEG), V = XFLAG_SET(PSR_OVF);
1425 3475187d bellard
1426 3475187d bellard
    T2 = !(Z | (N ^ V));
1427 e8af50a3 bellard
}
1428 e8af50a3 bellard
1429 3475187d bellard
void OPPROTO op_eval_xbge(void)
1430 e8af50a3 bellard
{
1431 3475187d bellard
    target_ulong N = XFLAG_SET(PSR_NEG), V = XFLAG_SET(PSR_OVF);
1432 3475187d bellard
1433 3475187d bellard
    T2 = !(N ^ V);
1434 3475187d bellard
}
1435 3475187d bellard
1436 3475187d bellard
void OPPROTO op_eval_xbgu(void)
1437 3475187d bellard
{
1438 3475187d bellard
    target_ulong Z = XFLAG_SET(PSR_ZERO), C = XFLAG_SET(PSR_CARRY);
1439 3475187d bellard
1440 3475187d bellard
    T2 = !(C | Z);
1441 3475187d bellard
}
1442 3475187d bellard
1443 3475187d bellard
void OPPROTO op_eval_xbcc(void)
1444 3475187d bellard
{
1445 3475187d bellard
    T2 = !XFLAG_SET(PSR_CARRY);
1446 3475187d bellard
}
1447 3475187d bellard
1448 3475187d bellard
void OPPROTO op_eval_xbpos(void)
1449 3475187d bellard
{
1450 3475187d bellard
    T2 = !XFLAG_SET(PSR_NEG);
1451 3475187d bellard
}
1452 3475187d bellard
1453 3475187d bellard
void OPPROTO op_eval_xbvc(void)
1454 3475187d bellard
{
1455 3475187d bellard
    T2 = !XFLAG_SET(PSR_OVF);
1456 3475187d bellard
}
1457 3475187d bellard
#endif
1458 3475187d bellard
1459 3475187d bellard
#define FCC
1460 3475187d bellard
#define FFLAG_SET(x) (env->fsr & x? 1: 0)
1461 3475187d bellard
#include "fbranch_template.h"
1462 3475187d bellard
1463 3475187d bellard
#ifdef TARGET_SPARC64
1464 3475187d bellard
#define FCC _fcc1
1465 3475187d bellard
#define FFLAG_SET(x) ((env->fsr & ((uint64_t)x >> 32))? 1: 0)
1466 3475187d bellard
#include "fbranch_template.h"
1467 3475187d bellard
#define FCC _fcc2
1468 3475187d bellard
#define FFLAG_SET(x) ((env->fsr & ((uint64_t)x >> 34))? 1: 0)
1469 3475187d bellard
#include "fbranch_template.h"
1470 3475187d bellard
#define FCC _fcc3
1471 3475187d bellard
#define FFLAG_SET(x) ((env->fsr & ((uint64_t)x >> 36))? 1: 0)
1472 3475187d bellard
#include "fbranch_template.h"
1473 3475187d bellard
#endif
1474 3475187d bellard
1475 3475187d bellard
#ifdef TARGET_SPARC64
1476 3475187d bellard
void OPPROTO op_eval_brz(void)
1477 3475187d bellard
{
1478 83469015 bellard
    T2 = (T0 == 0);
1479 e8af50a3 bellard
}
1480 e8af50a3 bellard
1481 3475187d bellard
void OPPROTO op_eval_brnz(void)
1482 e8af50a3 bellard
{
1483 83469015 bellard
    T2 = (T0 != 0);
1484 e8af50a3 bellard
}
1485 e8af50a3 bellard
1486 3475187d bellard
void OPPROTO op_eval_brlz(void)
1487 e8af50a3 bellard
{
1488 3475187d bellard
    T2 = ((int64_t)T0 < 0);
1489 e8af50a3 bellard
}
1490 e8af50a3 bellard
1491 3475187d bellard
void OPPROTO op_eval_brlez(void)
1492 e8af50a3 bellard
{
1493 3475187d bellard
    T2 = ((int64_t)T0 <= 0);
1494 e8af50a3 bellard
}
1495 e8af50a3 bellard
1496 3475187d bellard
void OPPROTO op_eval_brgz(void)
1497 e8af50a3 bellard
{
1498 3475187d bellard
    T2 = ((int64_t)T0 > 0);
1499 e8af50a3 bellard
}
1500 e8af50a3 bellard
1501 3475187d bellard
void OPPROTO op_eval_brgez(void)
1502 e8af50a3 bellard
{
1503 3475187d bellard
    T2 = ((int64_t)T0 >= 0);
1504 e8af50a3 bellard
}
1505 e8af50a3 bellard
1506 3475187d bellard
void OPPROTO op_jmp_im64(void)
1507 3475187d bellard
{
1508 3475187d bellard
    env->pc = PARAMQ1;
1509 3475187d bellard
}
1510 3475187d bellard
1511 3475187d bellard
void OPPROTO op_movq_npc_im64(void)
1512 3475187d bellard
{
1513 3475187d bellard
    env->npc = PARAMQ1;
1514 3475187d bellard
}
1515 3475187d bellard
#endif
1516 3475187d bellard
1517 cf495bcf bellard
void OPPROTO op_jmp_im(void)
1518 cf495bcf bellard
{
1519 3475187d bellard
    env->pc = (uint32_t)PARAM1;
1520 cf495bcf bellard
}
1521 cf495bcf bellard
1522 cf495bcf bellard
void OPPROTO op_movl_npc_im(void)
1523 cf495bcf bellard
{
1524 3475187d bellard
    env->npc = (uint32_t)PARAM1;
1525 cf495bcf bellard
}
1526 7a3f1944 bellard
1527 cf495bcf bellard
void OPPROTO op_movl_npc_T0(void)
1528 7a3f1944 bellard
{
1529 6ea4a6c8 blueswir1
    env->npc = T0;
1530 7a3f1944 bellard
}
1531 7a3f1944 bellard
1532 0bee699e bellard
void OPPROTO op_mov_pc_npc(void)
1533 0bee699e bellard
{
1534 0bee699e bellard
    env->pc = env->npc;
1535 0bee699e bellard
}
1536 0bee699e bellard
1537 cf495bcf bellard
void OPPROTO op_next_insn(void)
1538 7a3f1944 bellard
{
1539 cf495bcf bellard
    env->pc = env->npc;
1540 cf495bcf bellard
    env->npc = env->npc + 4;
1541 7a3f1944 bellard
}
1542 7a3f1944 bellard
1543 83469015 bellard
void OPPROTO op_goto_tb0(void)
1544 72cbca10 bellard
{
1545 83469015 bellard
    GOTO_TB(op_goto_tb0, PARAM1, 0);
1546 72cbca10 bellard
}
1547 72cbca10 bellard
1548 83469015 bellard
void OPPROTO op_goto_tb1(void)
1549 7a3f1944 bellard
{
1550 83469015 bellard
    GOTO_TB(op_goto_tb1, PARAM1, 1);
1551 72cbca10 bellard
}
1552 72cbca10 bellard
1553 83469015 bellard
void OPPROTO op_jmp_label(void)
1554 72cbca10 bellard
{
1555 83469015 bellard
    GOTO_LABEL_PARAM(1);
1556 83469015 bellard
}
1557 83469015 bellard
1558 83469015 bellard
void OPPROTO op_jnz_T2_label(void)
1559 83469015 bellard
{
1560 83469015 bellard
    if (T2)
1561 83469015 bellard
        GOTO_LABEL_PARAM(1);
1562 cf495bcf bellard
    FORCE_RET();
1563 7a3f1944 bellard
}
1564 7a3f1944 bellard
1565 83469015 bellard
void OPPROTO op_jz_T2_label(void)
1566 7a3f1944 bellard
{
1567 83469015 bellard
    if (!T2)
1568 83469015 bellard
        GOTO_LABEL_PARAM(1);
1569 cf495bcf bellard
    FORCE_RET();
1570 7a3f1944 bellard
}
1571 72cbca10 bellard
1572 658138bc bellard
void OPPROTO op_flush_T0(void)
1573 658138bc bellard
{
1574 658138bc bellard
    helper_flush(T0);
1575 658138bc bellard
}
1576 e8af50a3 bellard
1577 417454b0 blueswir1
void OPPROTO op_clear_ieee_excp_and_FTT(void)
1578 417454b0 blueswir1
{
1579 417454b0 blueswir1
    env->fsr &= ~(FSR_FTT_MASK | FSR_CEXC_MASK);;
1580 417454b0 blueswir1
}
1581 417454b0 blueswir1
1582 65ce8c2f bellard
#define F_OP(name, p) void OPPROTO op_f##name##p(void)
1583 65ce8c2f bellard
1584 65ce8c2f bellard
#define F_BINOP(name)                                           \
1585 65ce8c2f bellard
    F_OP(name, s)                                               \
1586 65ce8c2f bellard
    {                                                           \
1587 0f8a249a blueswir1
        set_float_exception_flags(0, &env->fp_status);          \
1588 65ce8c2f bellard
        FT0 = float32_ ## name (FT0, FT1, &env->fp_status);     \
1589 0f8a249a blueswir1
        check_ieee_exceptions();                                \
1590 65ce8c2f bellard
    }                                                           \
1591 65ce8c2f bellard
    F_OP(name, d)                                               \
1592 65ce8c2f bellard
    {                                                           \
1593 0f8a249a blueswir1
        set_float_exception_flags(0, &env->fp_status);          \
1594 65ce8c2f bellard
        DT0 = float64_ ## name (DT0, DT1, &env->fp_status);     \
1595 0f8a249a blueswir1
        check_ieee_exceptions();                                \
1596 65ce8c2f bellard
    }
1597 e8af50a3 bellard
1598 65ce8c2f bellard
F_BINOP(add);
1599 65ce8c2f bellard
F_BINOP(sub);
1600 65ce8c2f bellard
F_BINOP(mul);
1601 65ce8c2f bellard
F_BINOP(div);
1602 65ce8c2f bellard
#undef F_BINOP
1603 e8af50a3 bellard
1604 e8af50a3 bellard
void OPPROTO op_fsmuld(void)
1605 e8af50a3 bellard
{
1606 417454b0 blueswir1
    set_float_exception_flags(0, &env->fp_status);
1607 65ce8c2f bellard
    DT0 = float64_mul(float32_to_float64(FT0, &env->fp_status),
1608 65ce8c2f bellard
                      float32_to_float64(FT1, &env->fp_status),
1609 65ce8c2f bellard
                      &env->fp_status);
1610 417454b0 blueswir1
    check_ieee_exceptions();
1611 e8af50a3 bellard
}
1612 e8af50a3 bellard
1613 65ce8c2f bellard
#define F_HELPER(name)    \
1614 65ce8c2f bellard
    F_OP(name, s)         \
1615 65ce8c2f bellard
    {                     \
1616 65ce8c2f bellard
        do_f##name##s();  \
1617 65ce8c2f bellard
    }                     \
1618 65ce8c2f bellard
    F_OP(name, d)         \
1619 65ce8c2f bellard
    {                     \
1620 65ce8c2f bellard
        do_f##name##d();  \
1621 65ce8c2f bellard
    }
1622 e8af50a3 bellard
1623 65ce8c2f bellard
F_HELPER(sqrt);
1624 e8af50a3 bellard
1625 65ce8c2f bellard
F_OP(neg, s)
1626 e8af50a3 bellard
{
1627 65ce8c2f bellard
    FT0 = float32_chs(FT1);
1628 e8af50a3 bellard
}
1629 e8af50a3 bellard
1630 65ce8c2f bellard
F_OP(abs, s)
1631 e8af50a3 bellard
{
1632 65ce8c2f bellard
    do_fabss();
1633 e8af50a3 bellard
}
1634 e8af50a3 bellard
1635 65ce8c2f bellard
F_HELPER(cmp);
1636 417454b0 blueswir1
F_HELPER(cmpe);
1637 e8af50a3 bellard
1638 65ce8c2f bellard
#ifdef TARGET_SPARC64
1639 65ce8c2f bellard
F_OP(neg, d)
1640 e8af50a3 bellard
{
1641 65ce8c2f bellard
    DT0 = float64_chs(DT1);
1642 e8af50a3 bellard
}
1643 e8af50a3 bellard
1644 65ce8c2f bellard
F_OP(abs, d)
1645 e8af50a3 bellard
{
1646 65ce8c2f bellard
    do_fabsd();
1647 e8af50a3 bellard
}
1648 e8af50a3 bellard
1649 3475187d bellard
void OPPROTO op_fcmps_fcc1(void)
1650 3475187d bellard
{
1651 3475187d bellard
    do_fcmps_fcc1();
1652 3475187d bellard
}
1653 3475187d bellard
1654 3475187d bellard
void OPPROTO op_fcmpd_fcc1(void)
1655 3475187d bellard
{
1656 3475187d bellard
    do_fcmpd_fcc1();
1657 3475187d bellard
}
1658 3475187d bellard
1659 3475187d bellard
void OPPROTO op_fcmps_fcc2(void)
1660 3475187d bellard
{
1661 3475187d bellard
    do_fcmps_fcc2();
1662 3475187d bellard
}
1663 3475187d bellard
1664 3475187d bellard
void OPPROTO op_fcmpd_fcc2(void)
1665 3475187d bellard
{
1666 3475187d bellard
    do_fcmpd_fcc2();
1667 3475187d bellard
}
1668 3475187d bellard
1669 3475187d bellard
void OPPROTO op_fcmps_fcc3(void)
1670 3475187d bellard
{
1671 3475187d bellard
    do_fcmps_fcc3();
1672 3475187d bellard
}
1673 3475187d bellard
1674 3475187d bellard
void OPPROTO op_fcmpd_fcc3(void)
1675 3475187d bellard
{
1676 3475187d bellard
    do_fcmpd_fcc3();
1677 3475187d bellard
}
1678 417454b0 blueswir1
1679 417454b0 blueswir1
void OPPROTO op_fcmpes_fcc1(void)
1680 417454b0 blueswir1
{
1681 417454b0 blueswir1
    do_fcmpes_fcc1();
1682 417454b0 blueswir1
}
1683 417454b0 blueswir1
1684 417454b0 blueswir1
void OPPROTO op_fcmped_fcc1(void)
1685 417454b0 blueswir1
{
1686 417454b0 blueswir1
    do_fcmped_fcc1();
1687 417454b0 blueswir1
}
1688 417454b0 blueswir1
1689 417454b0 blueswir1
void OPPROTO op_fcmpes_fcc2(void)
1690 417454b0 blueswir1
{
1691 417454b0 blueswir1
    do_fcmpes_fcc2();
1692 417454b0 blueswir1
}
1693 417454b0 blueswir1
1694 417454b0 blueswir1
void OPPROTO op_fcmped_fcc2(void)
1695 417454b0 blueswir1
{
1696 417454b0 blueswir1
    do_fcmped_fcc2();
1697 417454b0 blueswir1
}
1698 417454b0 blueswir1
1699 417454b0 blueswir1
void OPPROTO op_fcmpes_fcc3(void)
1700 417454b0 blueswir1
{
1701 417454b0 blueswir1
    do_fcmpes_fcc3();
1702 417454b0 blueswir1
}
1703 417454b0 blueswir1
1704 417454b0 blueswir1
void OPPROTO op_fcmped_fcc3(void)
1705 417454b0 blueswir1
{
1706 417454b0 blueswir1
    do_fcmped_fcc3();
1707 417454b0 blueswir1
}
1708 417454b0 blueswir1
1709 3475187d bellard
#endif
1710 3475187d bellard
1711 65ce8c2f bellard
/* Integer to float conversion.  */
1712 a0c4cb4a bellard
#ifdef USE_INT_TO_FLOAT_HELPERS
1713 65ce8c2f bellard
F_HELPER(ito);
1714 1e64e78d blueswir1
#ifdef TARGET_SPARC64
1715 1e64e78d blueswir1
F_HELPER(xto);
1716 1e64e78d blueswir1
#endif
1717 a0c4cb4a bellard
#else
1718 65ce8c2f bellard
F_OP(ito, s)
1719 a0c4cb4a bellard
{
1720 417454b0 blueswir1
    set_float_exception_flags(0, &env->fp_status);
1721 65ce8c2f bellard
    FT0 = int32_to_float32(*((int32_t *)&FT1), &env->fp_status);
1722 417454b0 blueswir1
    check_ieee_exceptions();
1723 e8af50a3 bellard
}
1724 e8af50a3 bellard
1725 65ce8c2f bellard
F_OP(ito, d)
1726 e8af50a3 bellard
{
1727 417454b0 blueswir1
    set_float_exception_flags(0, &env->fp_status);
1728 65ce8c2f bellard
    DT0 = int32_to_float64(*((int32_t *)&FT1), &env->fp_status);
1729 417454b0 blueswir1
    check_ieee_exceptions();
1730 e8af50a3 bellard
}
1731 3475187d bellard
1732 3475187d bellard
#ifdef TARGET_SPARC64
1733 65ce8c2f bellard
F_OP(xto, s)
1734 3475187d bellard
{
1735 417454b0 blueswir1
    set_float_exception_flags(0, &env->fp_status);
1736 65ce8c2f bellard
    FT0 = int64_to_float32(*((int64_t *)&DT1), &env->fp_status);
1737 417454b0 blueswir1
    check_ieee_exceptions();
1738 3475187d bellard
}
1739 3475187d bellard
1740 65ce8c2f bellard
F_OP(xto, d)
1741 3475187d bellard
{
1742 417454b0 blueswir1
    set_float_exception_flags(0, &env->fp_status);
1743 65ce8c2f bellard
    DT0 = int64_to_float64(*((int64_t *)&DT1), &env->fp_status);
1744 417454b0 blueswir1
    check_ieee_exceptions();
1745 3475187d bellard
}
1746 3475187d bellard
#endif
1747 a0c4cb4a bellard
#endif
1748 65ce8c2f bellard
#undef F_HELPER
1749 a0c4cb4a bellard
1750 65ce8c2f bellard
/* floating point conversion */
1751 a0c4cb4a bellard
void OPPROTO op_fdtos(void)
1752 a0c4cb4a bellard
{
1753 417454b0 blueswir1
    set_float_exception_flags(0, &env->fp_status);
1754 65ce8c2f bellard
    FT0 = float64_to_float32(DT1, &env->fp_status);
1755 417454b0 blueswir1
    check_ieee_exceptions();
1756 a0c4cb4a bellard
}
1757 e8af50a3 bellard
1758 e8af50a3 bellard
void OPPROTO op_fstod(void)
1759 e8af50a3 bellard
{
1760 417454b0 blueswir1
    set_float_exception_flags(0, &env->fp_status);
1761 65ce8c2f bellard
    DT0 = float32_to_float64(FT1, &env->fp_status);
1762 417454b0 blueswir1
    check_ieee_exceptions();
1763 e8af50a3 bellard
}
1764 e8af50a3 bellard
1765 65ce8c2f bellard
/* Float to integer conversion.  */
1766 e8af50a3 bellard
void OPPROTO op_fstoi(void)
1767 e8af50a3 bellard
{
1768 417454b0 blueswir1
    set_float_exception_flags(0, &env->fp_status);
1769 bd59780c ths
    *((int32_t *)&FT0) = float32_to_int32_round_to_zero(FT1, &env->fp_status);
1770 417454b0 blueswir1
    check_ieee_exceptions();
1771 e8af50a3 bellard
}
1772 e8af50a3 bellard
1773 e8af50a3 bellard
void OPPROTO op_fdtoi(void)
1774 e8af50a3 bellard
{
1775 417454b0 blueswir1
    set_float_exception_flags(0, &env->fp_status);
1776 bd59780c ths
    *((int32_t *)&FT0) = float64_to_int32_round_to_zero(DT1, &env->fp_status);
1777 417454b0 blueswir1
    check_ieee_exceptions();
1778 e8af50a3 bellard
}
1779 e8af50a3 bellard
1780 3475187d bellard
#ifdef TARGET_SPARC64
1781 3475187d bellard
void OPPROTO op_fstox(void)
1782 3475187d bellard
{
1783 417454b0 blueswir1
    set_float_exception_flags(0, &env->fp_status);
1784 bd59780c ths
    *((int64_t *)&DT0) = float32_to_int64_round_to_zero(FT1, &env->fp_status);
1785 417454b0 blueswir1
    check_ieee_exceptions();
1786 3475187d bellard
}
1787 3475187d bellard
1788 3475187d bellard
void OPPROTO op_fdtox(void)
1789 3475187d bellard
{
1790 417454b0 blueswir1
    set_float_exception_flags(0, &env->fp_status);
1791 bd59780c ths
    *((int64_t *)&DT0) = float64_to_int64_round_to_zero(DT1, &env->fp_status);
1792 417454b0 blueswir1
    check_ieee_exceptions();
1793 3475187d bellard
}
1794 3475187d bellard
1795 3475187d bellard
void OPPROTO op_fmovs_cc(void)
1796 3475187d bellard
{
1797 3475187d bellard
    if (T2)
1798 0f8a249a blueswir1
        FT0 = FT1;
1799 3475187d bellard
}
1800 3475187d bellard
1801 3475187d bellard
void OPPROTO op_fmovd_cc(void)
1802 3475187d bellard
{
1803 3475187d bellard
    if (T2)
1804 0f8a249a blueswir1
        DT0 = DT1;
1805 3475187d bellard
}
1806 3475187d bellard
1807 3475187d bellard
void OPPROTO op_mov_cc(void)
1808 3475187d bellard
{
1809 3475187d bellard
    if (T2)
1810 0f8a249a blueswir1
        T0 = T1;
1811 3475187d bellard
}
1812 3475187d bellard
1813 3475187d bellard
void OPPROTO op_flushw(void)
1814 3475187d bellard
{
1815 3475187d bellard
    if (env->cansave != NWINDOWS - 2) {
1816 5fafdf24 ths
        raise_exception(TT_SPILL | (env->otherwin != 0 ?
1817 0f8a249a blueswir1
                                    (TT_WOTHER | ((env->wstate & 0x38) >> 1)):
1818 0f8a249a blueswir1
                                    ((env->wstate & 0x7) << 2)));
1819 3475187d bellard
    }
1820 3475187d bellard
}
1821 3475187d bellard
1822 3475187d bellard
void OPPROTO op_saved(void)
1823 3475187d bellard
{
1824 3475187d bellard
    env->cansave++;
1825 3475187d bellard
    if (env->otherwin == 0)
1826 0f8a249a blueswir1
        env->canrestore--;
1827 725cb90b bellard
    else
1828 0f8a249a blueswir1
        env->otherwin--;
1829 725cb90b bellard
    FORCE_RET();
1830 3475187d bellard
}
1831 3475187d bellard
1832 3475187d bellard
void OPPROTO op_restored(void)
1833 3475187d bellard
{
1834 3475187d bellard
    env->canrestore++;
1835 3475187d bellard
    if (env->cleanwin < NWINDOWS - 1)
1836 0f8a249a blueswir1
        env->cleanwin++;
1837 3475187d bellard
    if (env->otherwin == 0)
1838 0f8a249a blueswir1
        env->cansave--;
1839 3475187d bellard
    else
1840 0f8a249a blueswir1
        env->otherwin--;
1841 725cb90b bellard
    FORCE_RET();
1842 3475187d bellard
}
1843 3475187d bellard
1844 3475187d bellard
void OPPROTO op_popc(void)
1845 3475187d bellard
{
1846 3475187d bellard
    do_popc();
1847 3475187d bellard
}
1848 3475187d bellard
1849 3475187d bellard
void OPPROTO op_done(void)
1850 3475187d bellard
{
1851 83469015 bellard
    do_done();
1852 3475187d bellard
}
1853 3475187d bellard
1854 3475187d bellard
void OPPROTO op_retry(void)
1855 3475187d bellard
{
1856 83469015 bellard
    do_retry();
1857 3475187d bellard
}
1858 3475187d bellard
1859 3475187d bellard
void OPPROTO op_sir(void)
1860 3475187d bellard
{
1861 e9ebed4d blueswir1
    T0 = 0;  // XXX
1862 3475187d bellard
}
1863 3475187d bellard
1864 3475187d bellard
void OPPROTO op_ld_asi_reg()
1865 3475187d bellard
{
1866 3475187d bellard
    T0 += PARAM1;
1867 3475187d bellard
    helper_ld_asi(env->asi, PARAM2, PARAM3);
1868 3475187d bellard
}
1869 3475187d bellard
1870 3475187d bellard
void OPPROTO op_st_asi_reg()
1871 3475187d bellard
{
1872 3475187d bellard
    T0 += PARAM1;
1873 81ad8ba2 blueswir1
    helper_st_asi(env->asi, PARAM2);
1874 81ad8ba2 blueswir1
}
1875 81ad8ba2 blueswir1
1876 3391c818 blueswir1
void OPPROTO op_ldf_asi_reg()
1877 3391c818 blueswir1
{
1878 3391c818 blueswir1
    T0 += PARAM1;
1879 3391c818 blueswir1
    helper_ldf_asi(env->asi, PARAM2, PARAM3);
1880 3391c818 blueswir1
}
1881 3391c818 blueswir1
1882 3391c818 blueswir1
void OPPROTO op_stf_asi_reg()
1883 3391c818 blueswir1
{
1884 3391c818 blueswir1
    T0 += PARAM1;
1885 3391c818 blueswir1
    helper_stf_asi(env->asi, PARAM2, PARAM3);
1886 3391c818 blueswir1
}
1887 3391c818 blueswir1
1888 3391c818 blueswir1
void OPPROTO op_ldf_asi()
1889 3391c818 blueswir1
{
1890 3391c818 blueswir1
    helper_ldf_asi(PARAM1, PARAM2, PARAM3);
1891 3391c818 blueswir1
}
1892 3391c818 blueswir1
1893 3391c818 blueswir1
void OPPROTO op_stf_asi()
1894 3391c818 blueswir1
{
1895 3391c818 blueswir1
    helper_stf_asi(PARAM1, PARAM2, PARAM3);
1896 3391c818 blueswir1
}
1897 3391c818 blueswir1
1898 81ad8ba2 blueswir1
void OPPROTO op_ldstub_asi_reg()             /* XXX: should be atomically */
1899 81ad8ba2 blueswir1
{
1900 81ad8ba2 blueswir1
    target_ulong tmp;
1901 81ad8ba2 blueswir1
1902 81ad8ba2 blueswir1
    T0 += PARAM1;
1903 81ad8ba2 blueswir1
    helper_ld_asi(env->asi, 1, 0);
1904 81ad8ba2 blueswir1
    tmp = T1;
1905 81ad8ba2 blueswir1
    T1 = 0xff;
1906 81ad8ba2 blueswir1
    helper_st_asi(env->asi, 1);
1907 81ad8ba2 blueswir1
    T1 = tmp;
1908 81ad8ba2 blueswir1
}
1909 81ad8ba2 blueswir1
1910 81ad8ba2 blueswir1
void OPPROTO op_swap_asi_reg()               /* XXX: should be atomically */
1911 81ad8ba2 blueswir1
{
1912 81ad8ba2 blueswir1
    target_ulong tmp1, tmp2;
1913 81ad8ba2 blueswir1
1914 81ad8ba2 blueswir1
    T0 += PARAM1;
1915 81ad8ba2 blueswir1
    tmp1 = T1;
1916 81ad8ba2 blueswir1
    helper_ld_asi(env->asi, 4, 0);
1917 81ad8ba2 blueswir1
    tmp2 = T1;
1918 81ad8ba2 blueswir1
    T1 = tmp1;
1919 81ad8ba2 blueswir1
    helper_st_asi(env->asi, 4);
1920 81ad8ba2 blueswir1
    T1 = tmp2;
1921 81ad8ba2 blueswir1
}
1922 81ad8ba2 blueswir1
1923 81ad8ba2 blueswir1
void OPPROTO op_ldda_asi()
1924 81ad8ba2 blueswir1
{
1925 81ad8ba2 blueswir1
    helper_ld_asi(PARAM1, 8, 0);
1926 81ad8ba2 blueswir1
    T0 = T1 & 0xffffffffUL;
1927 81ad8ba2 blueswir1
    T1 >>= 32;
1928 81ad8ba2 blueswir1
}
1929 81ad8ba2 blueswir1
1930 81ad8ba2 blueswir1
void OPPROTO op_ldda_asi_reg()
1931 81ad8ba2 blueswir1
{
1932 81ad8ba2 blueswir1
    T0 += PARAM1;
1933 81ad8ba2 blueswir1
    helper_ld_asi(env->asi, 8, 0);
1934 81ad8ba2 blueswir1
    T0 = T1 & 0xffffffffUL;
1935 81ad8ba2 blueswir1
    T1 >>= 32;
1936 81ad8ba2 blueswir1
}
1937 81ad8ba2 blueswir1
1938 81ad8ba2 blueswir1
void OPPROTO op_stda_asi()
1939 81ad8ba2 blueswir1
{
1940 81ad8ba2 blueswir1
    T1 <<= 32;
1941 81ad8ba2 blueswir1
    T1 += T2 & 0xffffffffUL;
1942 81ad8ba2 blueswir1
    helper_st_asi(PARAM1, 8);
1943 81ad8ba2 blueswir1
}
1944 81ad8ba2 blueswir1
1945 81ad8ba2 blueswir1
void OPPROTO op_stda_asi_reg()
1946 81ad8ba2 blueswir1
{
1947 81ad8ba2 blueswir1
    T0 += PARAM1;
1948 81ad8ba2 blueswir1
    T1 <<= 32;
1949 81ad8ba2 blueswir1
    T1 += T2 & 0xffffffffUL;
1950 81ad8ba2 blueswir1
    helper_st_asi(env->asi, 8);
1951 81ad8ba2 blueswir1
}
1952 81ad8ba2 blueswir1
1953 81ad8ba2 blueswir1
void OPPROTO op_cas_asi()                    /* XXX: should be atomically */
1954 81ad8ba2 blueswir1
{
1955 81ad8ba2 blueswir1
    target_ulong tmp;
1956 81ad8ba2 blueswir1
1957 81ad8ba2 blueswir1
    tmp = T1 & 0xffffffffUL;
1958 81ad8ba2 blueswir1
    helper_ld_asi(PARAM1, 4, 0);
1959 81ad8ba2 blueswir1
    if (tmp == T1) {
1960 81ad8ba2 blueswir1
        tmp = T1;
1961 81ad8ba2 blueswir1
        T1 = T2 & 0xffffffffUL;
1962 81ad8ba2 blueswir1
        helper_st_asi(PARAM1, 4);
1963 81ad8ba2 blueswir1
        T1 = tmp;
1964 81ad8ba2 blueswir1
    }
1965 81ad8ba2 blueswir1
    T1 &= 0xffffffffUL;
1966 81ad8ba2 blueswir1
}
1967 81ad8ba2 blueswir1
1968 81ad8ba2 blueswir1
void OPPROTO op_cas_asi_reg()                /* XXX: should be atomically */
1969 81ad8ba2 blueswir1
{
1970 81ad8ba2 blueswir1
    target_ulong tmp;
1971 81ad8ba2 blueswir1
1972 81ad8ba2 blueswir1
    T0 += PARAM1;
1973 81ad8ba2 blueswir1
    tmp = T1 & 0xffffffffUL;
1974 81ad8ba2 blueswir1
    helper_ld_asi(env->asi, 4, 0);
1975 81ad8ba2 blueswir1
    if (tmp == T1) {
1976 81ad8ba2 blueswir1
        tmp = T1;
1977 81ad8ba2 blueswir1
        T1 = T2 & 0xffffffffUL;
1978 81ad8ba2 blueswir1
        helper_st_asi(env->asi, 4);
1979 81ad8ba2 blueswir1
        T1 = tmp;
1980 81ad8ba2 blueswir1
    }
1981 81ad8ba2 blueswir1
    T1 &= 0xffffffffUL;
1982 81ad8ba2 blueswir1
}
1983 81ad8ba2 blueswir1
1984 81ad8ba2 blueswir1
void OPPROTO op_casx_asi()                   /* XXX: should be atomically */
1985 81ad8ba2 blueswir1
{
1986 81ad8ba2 blueswir1
    target_ulong tmp;
1987 81ad8ba2 blueswir1
1988 81ad8ba2 blueswir1
    tmp = T1;
1989 81ad8ba2 blueswir1
    helper_ld_asi(PARAM1, 8, 0);
1990 81ad8ba2 blueswir1
    if (tmp == T1) {
1991 81ad8ba2 blueswir1
        tmp = T1;
1992 81ad8ba2 blueswir1
        T1 = T2;
1993 81ad8ba2 blueswir1
        helper_st_asi(PARAM1, 8);
1994 81ad8ba2 blueswir1
        T1 = tmp;
1995 81ad8ba2 blueswir1
    }
1996 81ad8ba2 blueswir1
}
1997 81ad8ba2 blueswir1
1998 81ad8ba2 blueswir1
void OPPROTO op_casx_asi_reg()               /* XXX: should be atomically */
1999 81ad8ba2 blueswir1
{
2000 81ad8ba2 blueswir1
    target_ulong tmp;
2001 81ad8ba2 blueswir1
2002 81ad8ba2 blueswir1
    T0 += PARAM1;
2003 81ad8ba2 blueswir1
    tmp = T1;
2004 81ad8ba2 blueswir1
    helper_ld_asi(env->asi, 8, 0);
2005 81ad8ba2 blueswir1
    if (tmp == T1) {
2006 81ad8ba2 blueswir1
        tmp = T1;
2007 81ad8ba2 blueswir1
        T1 = T2;
2008 81ad8ba2 blueswir1
        helper_st_asi(env->asi, 8);
2009 81ad8ba2 blueswir1
        T1 = tmp;
2010 81ad8ba2 blueswir1
    }
2011 3475187d bellard
}
2012 3475187d bellard
#endif
2013 3475187d bellard
2014 81ad8ba2 blueswir1
#if !defined(CONFIG_USER_ONLY) || defined(TARGET_SPARC64)
2015 e8af50a3 bellard
void OPPROTO op_ld_asi()
2016 e8af50a3 bellard
{
2017 e8af50a3 bellard
    helper_ld_asi(PARAM1, PARAM2, PARAM3);
2018 e8af50a3 bellard
}
2019 e8af50a3 bellard
2020 e8af50a3 bellard
void OPPROTO op_st_asi()
2021 e8af50a3 bellard
{
2022 81ad8ba2 blueswir1
    helper_st_asi(PARAM1, PARAM2);
2023 e8af50a3 bellard
}
2024 e8af50a3 bellard
2025 81ad8ba2 blueswir1
void OPPROTO op_ldstub_asi()                 /* XXX: should be atomically */
2026 81ad8ba2 blueswir1
{
2027 81ad8ba2 blueswir1
    target_ulong tmp;
2028 81ad8ba2 blueswir1
2029 81ad8ba2 blueswir1
    helper_ld_asi(PARAM1, 1, 0);
2030 81ad8ba2 blueswir1
    tmp = T1;
2031 81ad8ba2 blueswir1
    T1 = 0xff;
2032 81ad8ba2 blueswir1
    helper_st_asi(PARAM1, 1);
2033 81ad8ba2 blueswir1
    T1 = tmp;
2034 81ad8ba2 blueswir1
}
2035 81ad8ba2 blueswir1
2036 81ad8ba2 blueswir1
void OPPROTO op_swap_asi()                   /* XXX: should be atomically */
2037 81ad8ba2 blueswir1
{
2038 81ad8ba2 blueswir1
    target_ulong tmp1, tmp2;
2039 81ad8ba2 blueswir1
2040 81ad8ba2 blueswir1
    tmp1 = T1;
2041 81ad8ba2 blueswir1
    helper_ld_asi(PARAM1, 4, 0);
2042 81ad8ba2 blueswir1
    tmp2 = T1;
2043 81ad8ba2 blueswir1
    T1 = tmp1;
2044 81ad8ba2 blueswir1
    helper_st_asi(PARAM1, 4);
2045 81ad8ba2 blueswir1
    T1 = tmp2;
2046 81ad8ba2 blueswir1
}
2047 81ad8ba2 blueswir1
#endif
2048 81ad8ba2 blueswir1
2049 725cb90b bellard
#ifdef TARGET_SPARC64
2050 e9ebed4d blueswir1
// This function uses non-native bit order
2051 e9ebed4d blueswir1
#define GET_FIELD(X, FROM, TO)                                  \
2052 e9ebed4d blueswir1
    ((X) >> (63 - (TO)) & ((1ULL << ((TO) - (FROM) + 1)) - 1))
2053 e9ebed4d blueswir1
2054 e9ebed4d blueswir1
// This function uses the order in the manuals, i.e. bit 0 is 2^0
2055 e9ebed4d blueswir1
#define GET_FIELD_SP(X, FROM, TO)               \
2056 e9ebed4d blueswir1
    GET_FIELD(X, 63 - (TO), 63 - (FROM))
2057 e9ebed4d blueswir1
2058 e9ebed4d blueswir1
void OPPROTO op_array8()
2059 e9ebed4d blueswir1
{
2060 e9ebed4d blueswir1
    T0 = (GET_FIELD_SP(T0, 60, 63) << (17 + 2 * T1)) |
2061 e9ebed4d blueswir1
        (GET_FIELD_SP(T0, 39, 39 + T1 - 1) << (17 + T1)) |
2062 e9ebed4d blueswir1
        (GET_FIELD_SP(T0, 17 + T1 - 1, 17) << 17) |
2063 e9ebed4d blueswir1
        (GET_FIELD_SP(T0, 56, 59) << 13) | (GET_FIELD_SP(T0, 35, 38) << 9) |
2064 e9ebed4d blueswir1
        (GET_FIELD_SP(T0, 13, 16) << 5) | (((T0 >> 55) & 1) << 4) |
2065 e9ebed4d blueswir1
        (GET_FIELD_SP(T0, 33, 34) << 2) | GET_FIELD_SP(T0, 11, 12);
2066 e9ebed4d blueswir1
}
2067 e9ebed4d blueswir1
2068 e9ebed4d blueswir1
void OPPROTO op_array16()
2069 e9ebed4d blueswir1
{
2070 e9ebed4d blueswir1
    T0 = ((GET_FIELD_SP(T0, 60, 63) << (17 + 2 * T1)) |
2071 e9ebed4d blueswir1
          (GET_FIELD_SP(T0, 39, 39 + T1 - 1) << (17 + T1)) |
2072 e9ebed4d blueswir1
          (GET_FIELD_SP(T0, 17 + T1 - 1, 17) << 17) |
2073 e9ebed4d blueswir1
          (GET_FIELD_SP(T0, 56, 59) << 13) | (GET_FIELD_SP(T0, 35, 38) << 9) |
2074 e9ebed4d blueswir1
          (GET_FIELD_SP(T0, 13, 16) << 5) | (((T0 >> 55) & 1) << 4) |
2075 e9ebed4d blueswir1
          (GET_FIELD_SP(T0, 33, 34) << 2) | GET_FIELD_SP(T0, 11, 12)) << 1;
2076 e9ebed4d blueswir1
}
2077 e9ebed4d blueswir1
2078 e9ebed4d blueswir1
void OPPROTO op_array32()
2079 e9ebed4d blueswir1
{
2080 e9ebed4d blueswir1
    T0 = ((GET_FIELD_SP(T0, 60, 63) << (17 + 2 * T1)) |
2081 e9ebed4d blueswir1
          (GET_FIELD_SP(T0, 39, 39 + T1 - 1) << (17 + T1)) |
2082 e9ebed4d blueswir1
          (GET_FIELD_SP(T0, 17 + T1 - 1, 17) << 17) |
2083 e9ebed4d blueswir1
          (GET_FIELD_SP(T0, 56, 59) << 13) | (GET_FIELD_SP(T0, 35, 38) << 9) |
2084 e9ebed4d blueswir1
          (GET_FIELD_SP(T0, 13, 16) << 5) | (((T0 >> 55) & 1) << 4) |
2085 e9ebed4d blueswir1
          (GET_FIELD_SP(T0, 33, 34) << 2) | GET_FIELD_SP(T0, 11, 12)) << 2;
2086 e9ebed4d blueswir1
}
2087 e9ebed4d blueswir1
2088 725cb90b bellard
void OPPROTO op_alignaddr()
2089 725cb90b bellard
{
2090 725cb90b bellard
    uint64_t tmp;
2091 725cb90b bellard
2092 725cb90b bellard
    tmp = T0 + T1;
2093 725cb90b bellard
    env->gsr &= ~7ULL;
2094 725cb90b bellard
    env->gsr |= tmp & 7ULL;
2095 725cb90b bellard
    T0 = tmp & ~7ULL;
2096 725cb90b bellard
}
2097 725cb90b bellard
2098 725cb90b bellard
void OPPROTO op_faligndata()
2099 725cb90b bellard
{
2100 725cb90b bellard
    uint64_t tmp;
2101 725cb90b bellard
2102 725cb90b bellard
    tmp = (*((uint64_t *)&DT0)) << ((env->gsr & 7) * 8);
2103 725cb90b bellard
    tmp |= (*((uint64_t *)&DT1)) >> (64 - (env->gsr & 7) * 8);
2104 e9ebed4d blueswir1
    *((uint64_t *)&DT0) = tmp;
2105 725cb90b bellard
}
2106 3299908c blueswir1
2107 3299908c blueswir1
void OPPROTO op_movl_FT0_0(void)
2108 3299908c blueswir1
{
2109 e9ebed4d blueswir1
    *((uint32_t *)&FT0) = 0;
2110 3299908c blueswir1
}
2111 3299908c blueswir1
2112 3299908c blueswir1
void OPPROTO op_movl_DT0_0(void)
2113 3299908c blueswir1
{
2114 e9ebed4d blueswir1
    *((uint64_t *)&DT0) = 0;
2115 3299908c blueswir1
}
2116 3299908c blueswir1
2117 3299908c blueswir1
void OPPROTO op_movl_FT0_1(void)
2118 3299908c blueswir1
{
2119 e9ebed4d blueswir1
    *((uint32_t *)&FT0) = 0xffffffff;
2120 3299908c blueswir1
}
2121 3299908c blueswir1
2122 3299908c blueswir1
void OPPROTO op_movl_DT0_1(void)
2123 3299908c blueswir1
{
2124 e9ebed4d blueswir1
    *((uint64_t *)&DT0) = 0xffffffffffffffffULL;
2125 e9ebed4d blueswir1
}
2126 e9ebed4d blueswir1
2127 e9ebed4d blueswir1
void OPPROTO op_fnot(void)
2128 e9ebed4d blueswir1
{
2129 e9ebed4d blueswir1
    *(uint64_t *)&DT0 = ~*(uint64_t *)&DT1;
2130 e9ebed4d blueswir1
}
2131 e9ebed4d blueswir1
2132 e9ebed4d blueswir1
void OPPROTO op_fnots(void)
2133 e9ebed4d blueswir1
{
2134 e9ebed4d blueswir1
    *(uint32_t *)&FT0 = ~*(uint32_t *)&FT1;
2135 e9ebed4d blueswir1
}
2136 e9ebed4d blueswir1
2137 e9ebed4d blueswir1
void OPPROTO op_fnor(void)
2138 e9ebed4d blueswir1
{
2139 e9ebed4d blueswir1
    *(uint64_t *)&DT0 = ~(*(uint64_t *)&DT0 | *(uint64_t *)&DT1);
2140 e9ebed4d blueswir1
}
2141 e9ebed4d blueswir1
2142 e9ebed4d blueswir1
void OPPROTO op_fnors(void)
2143 e9ebed4d blueswir1
{
2144 e9ebed4d blueswir1
    *(uint32_t *)&FT0 = ~(*(uint32_t *)&FT0 | *(uint32_t *)&FT1);
2145 e9ebed4d blueswir1
}
2146 e9ebed4d blueswir1
2147 e9ebed4d blueswir1
void OPPROTO op_for(void)
2148 e9ebed4d blueswir1
{
2149 e9ebed4d blueswir1
    *(uint64_t *)&DT0 |= *(uint64_t *)&DT1;
2150 e9ebed4d blueswir1
}
2151 e9ebed4d blueswir1
2152 e9ebed4d blueswir1
void OPPROTO op_fors(void)
2153 e9ebed4d blueswir1
{
2154 e9ebed4d blueswir1
    *(uint32_t *)&FT0 |= *(uint32_t *)&FT1;
2155 e9ebed4d blueswir1
}
2156 e9ebed4d blueswir1
2157 e9ebed4d blueswir1
void OPPROTO op_fxor(void)
2158 e9ebed4d blueswir1
{
2159 e9ebed4d blueswir1
    *(uint64_t *)&DT0 ^= *(uint64_t *)&DT1;
2160 e9ebed4d blueswir1
}
2161 e9ebed4d blueswir1
2162 e9ebed4d blueswir1
void OPPROTO op_fxors(void)
2163 e9ebed4d blueswir1
{
2164 e9ebed4d blueswir1
    *(uint32_t *)&FT0 ^= *(uint32_t *)&FT1;
2165 e9ebed4d blueswir1
}
2166 e9ebed4d blueswir1
2167 e9ebed4d blueswir1
void OPPROTO op_fand(void)
2168 e9ebed4d blueswir1
{
2169 e9ebed4d blueswir1
    *(uint64_t *)&DT0 &= *(uint64_t *)&DT1;
2170 e9ebed4d blueswir1
}
2171 e9ebed4d blueswir1
2172 e9ebed4d blueswir1
void OPPROTO op_fands(void)
2173 e9ebed4d blueswir1
{
2174 e9ebed4d blueswir1
    *(uint32_t *)&FT0 &= *(uint32_t *)&FT1;
2175 e9ebed4d blueswir1
}
2176 e9ebed4d blueswir1
2177 e9ebed4d blueswir1
void OPPROTO op_fornot(void)
2178 e9ebed4d blueswir1
{
2179 e9ebed4d blueswir1
    *(uint64_t *)&DT0 = *(uint64_t *)&DT0 | ~*(uint64_t *)&DT1;
2180 e9ebed4d blueswir1
}
2181 e9ebed4d blueswir1
2182 e9ebed4d blueswir1
void OPPROTO op_fornots(void)
2183 e9ebed4d blueswir1
{
2184 e9ebed4d blueswir1
    *(uint32_t *)&FT0 = *(uint32_t *)&FT0 | ~*(uint32_t *)&FT1;
2185 e9ebed4d blueswir1
}
2186 e9ebed4d blueswir1
2187 e9ebed4d blueswir1
void OPPROTO op_fandnot(void)
2188 e9ebed4d blueswir1
{
2189 e9ebed4d blueswir1
    *(uint64_t *)&DT0 = *(uint64_t *)&DT0 & ~*(uint64_t *)&DT1;
2190 e9ebed4d blueswir1
}
2191 e9ebed4d blueswir1
2192 e9ebed4d blueswir1
void OPPROTO op_fandnots(void)
2193 e9ebed4d blueswir1
{
2194 e9ebed4d blueswir1
    *(uint32_t *)&FT0 = *(uint32_t *)&FT0 & ~*(uint32_t *)&FT1;
2195 e9ebed4d blueswir1
}
2196 e9ebed4d blueswir1
2197 e9ebed4d blueswir1
void OPPROTO op_fnand(void)
2198 e9ebed4d blueswir1
{
2199 e9ebed4d blueswir1
    *(uint64_t *)&DT0 = ~(*(uint64_t *)&DT0 & *(uint64_t *)&DT1);
2200 e9ebed4d blueswir1
}
2201 e9ebed4d blueswir1
2202 e9ebed4d blueswir1
void OPPROTO op_fnands(void)
2203 e9ebed4d blueswir1
{
2204 e9ebed4d blueswir1
    *(uint32_t *)&FT0 = ~(*(uint32_t *)&FT0 & *(uint32_t *)&FT1);
2205 e9ebed4d blueswir1
}
2206 e9ebed4d blueswir1
2207 e9ebed4d blueswir1
void OPPROTO op_fxnor(void)
2208 e9ebed4d blueswir1
{
2209 e9ebed4d blueswir1
    *(uint64_t *)&DT0 ^= ~*(uint64_t *)&DT1;
2210 e9ebed4d blueswir1
}
2211 e9ebed4d blueswir1
2212 e9ebed4d blueswir1
void OPPROTO op_fxnors(void)
2213 e9ebed4d blueswir1
{
2214 e9ebed4d blueswir1
    *(uint32_t *)&FT0 ^= ~*(uint32_t *)&FT1;
2215 e9ebed4d blueswir1
}
2216 e9ebed4d blueswir1
2217 e9ebed4d blueswir1
#ifdef WORDS_BIGENDIAN
2218 e9ebed4d blueswir1
#define VIS_B64(n) b[7 - (n)]
2219 e9ebed4d blueswir1
#define VIS_W64(n) w[3 - (n)]
2220 e9ebed4d blueswir1
#define VIS_SW64(n) sw[3 - (n)]
2221 e9ebed4d blueswir1
#define VIS_L64(n) l[1 - (n)]
2222 e9ebed4d blueswir1
#define VIS_B32(n) b[3 - (n)]
2223 e9ebed4d blueswir1
#define VIS_W32(n) w[1 - (n)]
2224 e9ebed4d blueswir1
#else
2225 e9ebed4d blueswir1
#define VIS_B64(n) b[n]
2226 e9ebed4d blueswir1
#define VIS_W64(n) w[n]
2227 e9ebed4d blueswir1
#define VIS_SW64(n) sw[n]
2228 e9ebed4d blueswir1
#define VIS_L64(n) l[n]
2229 e9ebed4d blueswir1
#define VIS_B32(n) b[n]
2230 e9ebed4d blueswir1
#define VIS_W32(n) w[n]
2231 e9ebed4d blueswir1
#endif
2232 e9ebed4d blueswir1
2233 e9ebed4d blueswir1
typedef union {
2234 e9ebed4d blueswir1
    uint8_t b[8];
2235 e9ebed4d blueswir1
    uint16_t w[4];
2236 e9ebed4d blueswir1
    int16_t sw[4];
2237 e9ebed4d blueswir1
    uint32_t l[2];
2238 e9ebed4d blueswir1
    float64 d;
2239 e9ebed4d blueswir1
} vis64;
2240 e9ebed4d blueswir1
2241 e9ebed4d blueswir1
typedef union {
2242 e9ebed4d blueswir1
    uint8_t b[4];
2243 e9ebed4d blueswir1
    uint16_t w[2];
2244 e9ebed4d blueswir1
    uint32_t l;
2245 e9ebed4d blueswir1
    float32 f;
2246 e9ebed4d blueswir1
} vis32;
2247 e9ebed4d blueswir1
2248 e9ebed4d blueswir1
void OPPROTO op_fpmerge(void)
2249 e9ebed4d blueswir1
{
2250 e9ebed4d blueswir1
    vis64 s, d;
2251 e9ebed4d blueswir1
2252 e9ebed4d blueswir1
    s.d = DT0;
2253 e9ebed4d blueswir1
    d.d = DT1;
2254 e9ebed4d blueswir1
2255 e9ebed4d blueswir1
    // Reverse calculation order to handle overlap
2256 e9ebed4d blueswir1
    d.VIS_B64(7) = s.VIS_B64(3);
2257 e9ebed4d blueswir1
    d.VIS_B64(6) = d.VIS_B64(3);
2258 e9ebed4d blueswir1
    d.VIS_B64(5) = s.VIS_B64(2);
2259 e9ebed4d blueswir1
    d.VIS_B64(4) = d.VIS_B64(2);
2260 e9ebed4d blueswir1
    d.VIS_B64(3) = s.VIS_B64(1);
2261 e9ebed4d blueswir1
    d.VIS_B64(2) = d.VIS_B64(1);
2262 e9ebed4d blueswir1
    d.VIS_B64(1) = s.VIS_B64(0);
2263 e9ebed4d blueswir1
    //d.VIS_B64(0) = d.VIS_B64(0);
2264 e9ebed4d blueswir1
2265 e9ebed4d blueswir1
    DT0 = d.d;
2266 e9ebed4d blueswir1
}
2267 e9ebed4d blueswir1
2268 e9ebed4d blueswir1
void OPPROTO op_fmul8x16(void)
2269 e9ebed4d blueswir1
{
2270 e9ebed4d blueswir1
    vis64 s, d;
2271 e9ebed4d blueswir1
    uint32_t tmp;
2272 e9ebed4d blueswir1
2273 e9ebed4d blueswir1
    s.d = DT0;
2274 e9ebed4d blueswir1
    d.d = DT1;
2275 e9ebed4d blueswir1
2276 e9ebed4d blueswir1
#define PMUL(r)                                                 \
2277 e9ebed4d blueswir1
    tmp = (int32_t)d.VIS_SW64(r) * (int32_t)s.VIS_B64(r);       \
2278 e9ebed4d blueswir1
    if ((tmp & 0xff) > 0x7f)                                    \
2279 e9ebed4d blueswir1
        tmp += 0x100;                                           \
2280 e9ebed4d blueswir1
    d.VIS_W64(r) = tmp >> 8;
2281 e9ebed4d blueswir1
2282 e9ebed4d blueswir1
    PMUL(0);
2283 e9ebed4d blueswir1
    PMUL(1);
2284 e9ebed4d blueswir1
    PMUL(2);
2285 e9ebed4d blueswir1
    PMUL(3);
2286 e9ebed4d blueswir1
#undef PMUL
2287 e9ebed4d blueswir1
2288 e9ebed4d blueswir1
    DT0 = d.d;
2289 e9ebed4d blueswir1
}
2290 e9ebed4d blueswir1
2291 e9ebed4d blueswir1
void OPPROTO op_fmul8x16al(void)
2292 e9ebed4d blueswir1
{
2293 e9ebed4d blueswir1
    vis64 s, d;
2294 e9ebed4d blueswir1
    uint32_t tmp;
2295 e9ebed4d blueswir1
2296 e9ebed4d blueswir1
    s.d = DT0;
2297 e9ebed4d blueswir1
    d.d = DT1;
2298 e9ebed4d blueswir1
2299 e9ebed4d blueswir1
#define PMUL(r)                                                 \
2300 e9ebed4d blueswir1
    tmp = (int32_t)d.VIS_SW64(1) * (int32_t)s.VIS_B64(r);       \
2301 e9ebed4d blueswir1
    if ((tmp & 0xff) > 0x7f)                                    \
2302 e9ebed4d blueswir1
        tmp += 0x100;                                           \
2303 e9ebed4d blueswir1
    d.VIS_W64(r) = tmp >> 8;
2304 e9ebed4d blueswir1
2305 e9ebed4d blueswir1
    PMUL(0);
2306 e9ebed4d blueswir1
    PMUL(1);
2307 e9ebed4d blueswir1
    PMUL(2);
2308 e9ebed4d blueswir1
    PMUL(3);
2309 e9ebed4d blueswir1
#undef PMUL
2310 e9ebed4d blueswir1
2311 e9ebed4d blueswir1
    DT0 = d.d;
2312 3299908c blueswir1
}
2313 e9ebed4d blueswir1
2314 e9ebed4d blueswir1
void OPPROTO op_fmul8x16au(void)
2315 e9ebed4d blueswir1
{
2316 e9ebed4d blueswir1
    vis64 s, d;
2317 e9ebed4d blueswir1
    uint32_t tmp;
2318 e9ebed4d blueswir1
2319 e9ebed4d blueswir1
    s.d = DT0;
2320 e9ebed4d blueswir1
    d.d = DT1;
2321 e9ebed4d blueswir1
2322 e9ebed4d blueswir1
#define PMUL(r)                                                 \
2323 e9ebed4d blueswir1
    tmp = (int32_t)d.VIS_SW64(0) * (int32_t)s.VIS_B64(r);       \
2324 e9ebed4d blueswir1
    if ((tmp & 0xff) > 0x7f)                                    \
2325 e9ebed4d blueswir1
        tmp += 0x100;                                           \
2326 e9ebed4d blueswir1
    d.VIS_W64(r) = tmp >> 8;
2327 e9ebed4d blueswir1
2328 e9ebed4d blueswir1
    PMUL(0);
2329 e9ebed4d blueswir1
    PMUL(1);
2330 e9ebed4d blueswir1
    PMUL(2);
2331 e9ebed4d blueswir1
    PMUL(3);
2332 e9ebed4d blueswir1
#undef PMUL
2333 e9ebed4d blueswir1
2334 e9ebed4d blueswir1
    DT0 = d.d;
2335 e9ebed4d blueswir1
}
2336 e9ebed4d blueswir1
2337 e9ebed4d blueswir1
void OPPROTO op_fmul8sux16(void)
2338 e9ebed4d blueswir1
{
2339 e9ebed4d blueswir1
    vis64 s, d;
2340 e9ebed4d blueswir1
    uint32_t tmp;
2341 e9ebed4d blueswir1
2342 e9ebed4d blueswir1
    s.d = DT0;
2343 e9ebed4d blueswir1
    d.d = DT1;
2344 e9ebed4d blueswir1
2345 e9ebed4d blueswir1
#define PMUL(r)                                                         \
2346 e9ebed4d blueswir1
    tmp = (int32_t)d.VIS_SW64(r) * ((int32_t)s.VIS_SW64(r) >> 8);       \
2347 e9ebed4d blueswir1
    if ((tmp & 0xff) > 0x7f)                                            \
2348 e9ebed4d blueswir1
        tmp += 0x100;                                                   \
2349 e9ebed4d blueswir1
    d.VIS_W64(r) = tmp >> 8;
2350 e9ebed4d blueswir1
2351 e9ebed4d blueswir1
    PMUL(0);
2352 e9ebed4d blueswir1
    PMUL(1);
2353 e9ebed4d blueswir1
    PMUL(2);
2354 e9ebed4d blueswir1
    PMUL(3);
2355 e9ebed4d blueswir1
#undef PMUL
2356 e9ebed4d blueswir1
2357 e9ebed4d blueswir1
    DT0 = d.d;
2358 e9ebed4d blueswir1
}
2359 e9ebed4d blueswir1
2360 e9ebed4d blueswir1
void OPPROTO op_fmul8ulx16(void)
2361 e9ebed4d blueswir1
{
2362 e9ebed4d blueswir1
    vis64 s, d;
2363 e9ebed4d blueswir1
    uint32_t tmp;
2364 e9ebed4d blueswir1
2365 e9ebed4d blueswir1
    s.d = DT0;
2366 e9ebed4d blueswir1
    d.d = DT1;
2367 e9ebed4d blueswir1
2368 e9ebed4d blueswir1
#define PMUL(r)                                                         \
2369 e9ebed4d blueswir1
    tmp = (int32_t)d.VIS_SW64(r) * ((uint32_t)s.VIS_B64(r * 2));        \
2370 e9ebed4d blueswir1
    if ((tmp & 0xff) > 0x7f)                                            \
2371 e9ebed4d blueswir1
        tmp += 0x100;                                                   \
2372 e9ebed4d blueswir1
    d.VIS_W64(r) = tmp >> 8;
2373 e9ebed4d blueswir1
2374 e9ebed4d blueswir1
    PMUL(0);
2375 e9ebed4d blueswir1
    PMUL(1);
2376 e9ebed4d blueswir1
    PMUL(2);
2377 e9ebed4d blueswir1
    PMUL(3);
2378 e9ebed4d blueswir1
#undef PMUL
2379 e9ebed4d blueswir1
2380 e9ebed4d blueswir1
    DT0 = d.d;
2381 e9ebed4d blueswir1
}
2382 e9ebed4d blueswir1
2383 e9ebed4d blueswir1
void OPPROTO op_fmuld8sux16(void)
2384 e9ebed4d blueswir1
{
2385 e9ebed4d blueswir1
    vis64 s, d;
2386 e9ebed4d blueswir1
    uint32_t tmp;
2387 e9ebed4d blueswir1
2388 e9ebed4d blueswir1
    s.d = DT0;
2389 e9ebed4d blueswir1
    d.d = DT1;
2390 e9ebed4d blueswir1
2391 e9ebed4d blueswir1
#define PMUL(r)                                                         \
2392 e9ebed4d blueswir1
    tmp = (int32_t)d.VIS_SW64(r) * ((int32_t)s.VIS_SW64(r) >> 8);       \
2393 e9ebed4d blueswir1
    if ((tmp & 0xff) > 0x7f)                                            \
2394 e9ebed4d blueswir1
        tmp += 0x100;                                                   \
2395 e9ebed4d blueswir1
    d.VIS_L64(r) = tmp;
2396 e9ebed4d blueswir1
2397 e9ebed4d blueswir1
    // Reverse calculation order to handle overlap
2398 e9ebed4d blueswir1
    PMUL(1);
2399 e9ebed4d blueswir1
    PMUL(0);
2400 e9ebed4d blueswir1
#undef PMUL
2401 e9ebed4d blueswir1
2402 e9ebed4d blueswir1
    DT0 = d.d;
2403 e9ebed4d blueswir1
}
2404 e9ebed4d blueswir1
2405 e9ebed4d blueswir1
void OPPROTO op_fmuld8ulx16(void)
2406 e9ebed4d blueswir1
{
2407 e9ebed4d blueswir1
    vis64 s, d;
2408 e9ebed4d blueswir1
    uint32_t tmp;
2409 e9ebed4d blueswir1
2410 e9ebed4d blueswir1
    s.d = DT0;
2411 e9ebed4d blueswir1
    d.d = DT1;
2412 e9ebed4d blueswir1
2413 e9ebed4d blueswir1
#define PMUL(r)                                                         \
2414 e9ebed4d blueswir1
    tmp = (int32_t)d.VIS_SW64(r) * ((uint32_t)s.VIS_B64(r * 2));        \
2415 e9ebed4d blueswir1
    if ((tmp & 0xff) > 0x7f)                                            \
2416 e9ebed4d blueswir1
        tmp += 0x100;                                                   \
2417 e9ebed4d blueswir1
    d.VIS_L64(r) = tmp;
2418 e9ebed4d blueswir1
2419 e9ebed4d blueswir1
    // Reverse calculation order to handle overlap
2420 e9ebed4d blueswir1
    PMUL(1);
2421 e9ebed4d blueswir1
    PMUL(0);
2422 e9ebed4d blueswir1
#undef PMUL
2423 e9ebed4d blueswir1
2424 e9ebed4d blueswir1
    DT0 = d.d;
2425 e9ebed4d blueswir1
}
2426 e9ebed4d blueswir1
2427 e9ebed4d blueswir1
void OPPROTO op_fexpand(void)
2428 e9ebed4d blueswir1
{
2429 e9ebed4d blueswir1
    vis32 s;
2430 e9ebed4d blueswir1
    vis64 d;
2431 e9ebed4d blueswir1
2432 e9ebed4d blueswir1
    s.l = (uint32_t)(*(uint64_t *)&DT0 & 0xffffffff);
2433 e9ebed4d blueswir1
    d.d = DT1;
2434 e9ebed4d blueswir1
    d.VIS_L64(0) = s.VIS_W32(0) << 4;
2435 e9ebed4d blueswir1
    d.VIS_L64(1) = s.VIS_W32(1) << 4;
2436 e9ebed4d blueswir1
    d.VIS_L64(2) = s.VIS_W32(2) << 4;
2437 e9ebed4d blueswir1
    d.VIS_L64(3) = s.VIS_W32(3) << 4;
2438 e9ebed4d blueswir1
2439 e9ebed4d blueswir1
    DT0 = d.d;
2440 e9ebed4d blueswir1
}
2441 e9ebed4d blueswir1
2442 e9ebed4d blueswir1
#define VIS_OP(name, F)                                 \
2443 e9ebed4d blueswir1
    void OPPROTO name##16(void)                         \
2444 e9ebed4d blueswir1
    {                                                   \
2445 e9ebed4d blueswir1
        vis64 s, d;                                     \
2446 e9ebed4d blueswir1
                                                        \
2447 e9ebed4d blueswir1
        s.d = DT0;                                      \
2448 e9ebed4d blueswir1
        d.d = DT1;                                      \
2449 e9ebed4d blueswir1
                                                        \
2450 e9ebed4d blueswir1
        d.VIS_W64(0) = F(d.VIS_W64(0), s.VIS_W64(0));   \
2451 e9ebed4d blueswir1
        d.VIS_W64(1) = F(d.VIS_W64(1), s.VIS_W64(1));   \
2452 e9ebed4d blueswir1
        d.VIS_W64(2) = F(d.VIS_W64(2), s.VIS_W64(2));   \
2453 e9ebed4d blueswir1
        d.VIS_W64(3) = F(d.VIS_W64(3), s.VIS_W64(3));   \
2454 e9ebed4d blueswir1
                                                        \
2455 e9ebed4d blueswir1
        DT0 = d.d;                                      \
2456 e9ebed4d blueswir1
    }                                                   \
2457 e9ebed4d blueswir1
                                                        \
2458 e9ebed4d blueswir1
    void OPPROTO name##16s(void)                        \
2459 e9ebed4d blueswir1
    {                                                   \
2460 e9ebed4d blueswir1
        vis32 s, d;                                     \
2461 e9ebed4d blueswir1
                                                        \
2462 e9ebed4d blueswir1
        s.f = FT0;                                      \
2463 e9ebed4d blueswir1
        d.f = FT1;                                      \
2464 e9ebed4d blueswir1
                                                        \
2465 e9ebed4d blueswir1
        d.VIS_W32(0) = F(d.VIS_W32(0), s.VIS_W32(0));   \
2466 e9ebed4d blueswir1
        d.VIS_W32(1) = F(d.VIS_W32(1), s.VIS_W32(1));   \
2467 e9ebed4d blueswir1
                                                        \
2468 e9ebed4d blueswir1
        FT0 = d.f;                                      \
2469 e9ebed4d blueswir1
    }                                                   \
2470 e9ebed4d blueswir1
                                                        \
2471 e9ebed4d blueswir1
    void OPPROTO name##32(void)                         \
2472 e9ebed4d blueswir1
    {                                                   \
2473 e9ebed4d blueswir1
        vis64 s, d;                                     \
2474 e9ebed4d blueswir1
                                                        \
2475 e9ebed4d blueswir1
        s.d = DT0;                                      \
2476 e9ebed4d blueswir1
        d.d = DT1;                                      \
2477 e9ebed4d blueswir1
                                                        \
2478 e9ebed4d blueswir1
        d.VIS_L64(0) = F(d.VIS_L64(0), s.VIS_L64(0));   \
2479 e9ebed4d blueswir1
        d.VIS_L64(1) = F(d.VIS_L64(1), s.VIS_L64(1));   \
2480 e9ebed4d blueswir1
                                                        \
2481 e9ebed4d blueswir1
        DT0 = d.d;                                      \
2482 e9ebed4d blueswir1
    }                                                   \
2483 e9ebed4d blueswir1
                                                        \
2484 e9ebed4d blueswir1
    void OPPROTO name##32s(void)                        \
2485 e9ebed4d blueswir1
    {                                                   \
2486 e9ebed4d blueswir1
        vis32 s, d;                                     \
2487 e9ebed4d blueswir1
                                                        \
2488 e9ebed4d blueswir1
        s.f = FT0;                                      \
2489 e9ebed4d blueswir1
        d.f = FT1;                                      \
2490 e9ebed4d blueswir1
                                                        \
2491 e9ebed4d blueswir1
        d.l = F(d.l, s.l);                              \
2492 e9ebed4d blueswir1
                                                        \
2493 e9ebed4d blueswir1
        FT0 = d.f;                                      \
2494 e9ebed4d blueswir1
    }
2495 e9ebed4d blueswir1
2496 e9ebed4d blueswir1
#define FADD(a, b) ((a) + (b))
2497 e9ebed4d blueswir1
#define FSUB(a, b) ((a) - (b))
2498 e9ebed4d blueswir1
VIS_OP(op_fpadd, FADD)
2499 e9ebed4d blueswir1
VIS_OP(op_fpsub, FSUB)
2500 e9ebed4d blueswir1
2501 e9ebed4d blueswir1
#define VIS_CMPOP(name, F)                                        \
2502 e9ebed4d blueswir1
    void OPPROTO name##16(void)                                   \
2503 e9ebed4d blueswir1
    {                                                             \
2504 e9ebed4d blueswir1
        vis64 s, d;                                               \
2505 e9ebed4d blueswir1
                                                                  \
2506 e9ebed4d blueswir1
        s.d = DT0;                                                \
2507 e9ebed4d blueswir1
        d.d = DT1;                                                \
2508 e9ebed4d blueswir1
                                                                  \
2509 e9ebed4d blueswir1
        d.VIS_W64(0) = F(d.VIS_W64(0), s.VIS_W64(0))? 1: 0;       \
2510 e9ebed4d blueswir1
        d.VIS_W64(0) |= F(d.VIS_W64(1), s.VIS_W64(1))? 2: 0;      \
2511 e9ebed4d blueswir1
        d.VIS_W64(0) |= F(d.VIS_W64(2), s.VIS_W64(2))? 4: 0;      \
2512 e9ebed4d blueswir1
        d.VIS_W64(0) |= F(d.VIS_W64(3), s.VIS_W64(3))? 8: 0;      \
2513 e9ebed4d blueswir1
                                                                  \
2514 e9ebed4d blueswir1
        DT0 = d.d;                                                \
2515 e9ebed4d blueswir1
    }                                                             \
2516 e9ebed4d blueswir1
                                                                  \
2517 e9ebed4d blueswir1
    void OPPROTO name##32(void)                                   \
2518 e9ebed4d blueswir1
    {                                                             \
2519 e9ebed4d blueswir1
        vis64 s, d;                                               \
2520 e9ebed4d blueswir1
                                                                  \
2521 e9ebed4d blueswir1
        s.d = DT0;                                                \
2522 e9ebed4d blueswir1
        d.d = DT1;                                                \
2523 e9ebed4d blueswir1
                                                                  \
2524 e9ebed4d blueswir1
        d.VIS_L64(0) = F(d.VIS_L64(0), s.VIS_L64(0))? 1: 0;       \
2525 e9ebed4d blueswir1
        d.VIS_L64(0) |= F(d.VIS_L64(1), s.VIS_L64(1))? 2: 0;      \
2526 e9ebed4d blueswir1
                                                                  \
2527 e9ebed4d blueswir1
        DT0 = d.d;                                                \
2528 e9ebed4d blueswir1
    }
2529 e9ebed4d blueswir1
2530 e9ebed4d blueswir1
#define FCMPGT(a, b) ((a) > (b))
2531 e9ebed4d blueswir1
#define FCMPEQ(a, b) ((a) == (b))
2532 e9ebed4d blueswir1
#define FCMPLE(a, b) ((a) <= (b))
2533 e9ebed4d blueswir1
#define FCMPNE(a, b) ((a) != (b))
2534 e9ebed4d blueswir1
2535 e9ebed4d blueswir1
VIS_CMPOP(op_fcmpgt, FCMPGT)
2536 e9ebed4d blueswir1
VIS_CMPOP(op_fcmpeq, FCMPEQ)
2537 e9ebed4d blueswir1
VIS_CMPOP(op_fcmple, FCMPLE)
2538 e9ebed4d blueswir1
VIS_CMPOP(op_fcmpne, FCMPNE)
2539 e9ebed4d blueswir1
2540 725cb90b bellard
#endif
2541 6ea4a6c8 blueswir1
2542 6ea4a6c8 blueswir1
#define CHECK_ALIGN_OP(align)                           \
2543 6ea4a6c8 blueswir1
    void OPPROTO op_check_align_T0_ ## align (void)     \
2544 6ea4a6c8 blueswir1
    {                                                   \
2545 6ea4a6c8 blueswir1
        if (T0 & align)                                 \
2546 6ea4a6c8 blueswir1
            raise_exception(TT_UNALIGNED);              \
2547 6ea4a6c8 blueswir1
        FORCE_RET();                                    \
2548 6ea4a6c8 blueswir1
    }
2549 6ea4a6c8 blueswir1
2550 6ea4a6c8 blueswir1
CHECK_ALIGN_OP(1)
2551 6ea4a6c8 blueswir1
CHECK_ALIGN_OP(3)
2552 6ea4a6c8 blueswir1
CHECK_ALIGN_OP(7)