Statistics
| Branch: | Revision:

root / target-ppc / op.c @ 1698b741

History | View | Annotate | Download (44.3 kB)

1 79aceca5 bellard
/*
2 3fc6c082 bellard
 *  PowerPC emulation micro-operations for qemu.
3 79aceca5 bellard
 * 
4 76a66253 j_mayer
 *  Copyright (c) 2003-2007 Jocelyn Mayer
5 79aceca5 bellard
 *
6 79aceca5 bellard
 * This library is free software; you can redistribute it and/or
7 79aceca5 bellard
 * modify it under the terms of the GNU Lesser General Public
8 79aceca5 bellard
 * License as published by the Free Software Foundation; either
9 79aceca5 bellard
 * version 2 of the License, or (at your option) any later version.
10 79aceca5 bellard
 *
11 79aceca5 bellard
 * This library is distributed in the hope that it will be useful,
12 79aceca5 bellard
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 79aceca5 bellard
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 79aceca5 bellard
 * Lesser General Public License for more details.
15 79aceca5 bellard
 *
16 79aceca5 bellard
 * You should have received a copy of the GNU Lesser General Public
17 79aceca5 bellard
 * License along with this library; if not, write to the Free Software
18 79aceca5 bellard
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19 79aceca5 bellard
 */
20 79aceca5 bellard
21 a541f297 bellard
//#define DEBUG_OP
22 a541f297 bellard
23 79aceca5 bellard
#include "config.h"
24 79aceca5 bellard
#include "exec.h"
25 76a66253 j_mayer
#include "op_helper.h"
26 79aceca5 bellard
27 76a66253 j_mayer
/* XXX: this is to be suppressed */
28 79aceca5 bellard
#define regs (env)
29 79aceca5 bellard
30 28b6751f bellard
#define FT0 (env->ft0)
31 fb0eaffc bellard
#define FT1 (env->ft1)
32 fb0eaffc bellard
#define FT2 (env->ft2)
33 fb0eaffc bellard
34 76a66253 j_mayer
/* XXX: this is to be suppressed... */
35 76a66253 j_mayer
#define PPC_OP(name) void OPPROTO glue(op_, name)(void)
36 79aceca5 bellard
37 28b6751f bellard
#define REG 0
38 28b6751f bellard
#include "op_template.h"
39 28b6751f bellard
40 28b6751f bellard
#define REG 1
41 28b6751f bellard
#include "op_template.h"
42 28b6751f bellard
43 28b6751f bellard
#define REG 2
44 28b6751f bellard
#include "op_template.h"
45 28b6751f bellard
46 28b6751f bellard
#define REG 3
47 28b6751f bellard
#include "op_template.h"
48 28b6751f bellard
49 28b6751f bellard
#define REG 4
50 28b6751f bellard
#include "op_template.h"
51 28b6751f bellard
52 28b6751f bellard
#define REG 5
53 28b6751f bellard
#include "op_template.h"
54 28b6751f bellard
55 28b6751f bellard
#define REG 6
56 28b6751f bellard
#include "op_template.h"
57 28b6751f bellard
58 28b6751f bellard
#define REG 7
59 28b6751f bellard
#include "op_template.h"
60 28b6751f bellard
61 28b6751f bellard
#define REG 8
62 28b6751f bellard
#include "op_template.h"
63 28b6751f bellard
64 28b6751f bellard
#define REG 9
65 28b6751f bellard
#include "op_template.h"
66 28b6751f bellard
67 28b6751f bellard
#define REG 10
68 28b6751f bellard
#include "op_template.h"
69 28b6751f bellard
70 28b6751f bellard
#define REG 11
71 28b6751f bellard
#include "op_template.h"
72 28b6751f bellard
73 28b6751f bellard
#define REG 12
74 28b6751f bellard
#include "op_template.h"
75 28b6751f bellard
76 28b6751f bellard
#define REG 13
77 28b6751f bellard
#include "op_template.h"
78 28b6751f bellard
79 28b6751f bellard
#define REG 14
80 28b6751f bellard
#include "op_template.h"
81 28b6751f bellard
82 28b6751f bellard
#define REG 15
83 28b6751f bellard
#include "op_template.h"
84 28b6751f bellard
85 28b6751f bellard
#define REG 16
86 28b6751f bellard
#include "op_template.h"
87 28b6751f bellard
88 28b6751f bellard
#define REG 17
89 28b6751f bellard
#include "op_template.h"
90 28b6751f bellard
91 28b6751f bellard
#define REG 18
92 28b6751f bellard
#include "op_template.h"
93 28b6751f bellard
94 28b6751f bellard
#define REG 19
95 28b6751f bellard
#include "op_template.h"
96 28b6751f bellard
97 28b6751f bellard
#define REG 20
98 28b6751f bellard
#include "op_template.h"
99 28b6751f bellard
100 28b6751f bellard
#define REG 21
101 28b6751f bellard
#include "op_template.h"
102 28b6751f bellard
103 28b6751f bellard
#define REG 22
104 28b6751f bellard
#include "op_template.h"
105 28b6751f bellard
106 28b6751f bellard
#define REG 23
107 28b6751f bellard
#include "op_template.h"
108 28b6751f bellard
109 28b6751f bellard
#define REG 24
110 28b6751f bellard
#include "op_template.h"
111 28b6751f bellard
112 28b6751f bellard
#define REG 25
113 28b6751f bellard
#include "op_template.h"
114 28b6751f bellard
115 28b6751f bellard
#define REG 26
116 28b6751f bellard
#include "op_template.h"
117 28b6751f bellard
118 28b6751f bellard
#define REG 27
119 28b6751f bellard
#include "op_template.h"
120 28b6751f bellard
121 28b6751f bellard
#define REG 28
122 28b6751f bellard
#include "op_template.h"
123 28b6751f bellard
124 28b6751f bellard
#define REG 29
125 28b6751f bellard
#include "op_template.h"
126 28b6751f bellard
127 28b6751f bellard
#define REG 30
128 28b6751f bellard
#include "op_template.h"
129 28b6751f bellard
130 28b6751f bellard
#define REG 31
131 28b6751f bellard
#include "op_template.h"
132 28b6751f bellard
133 3fc6c082 bellard
/* PowerPC state maintenance operations */
134 79aceca5 bellard
/* set_Rc0 */
135 79aceca5 bellard
PPC_OP(set_Rc0)
136 79aceca5 bellard
{
137 76a66253 j_mayer
    env->crf[0] = T0 | xer_ov;
138 79aceca5 bellard
    RETURN();
139 79aceca5 bellard
}
140 79aceca5 bellard
141 fb0eaffc bellard
/* Set Rc1 (for floating point arithmetic) */
142 fb0eaffc bellard
PPC_OP(set_Rc1)
143 fb0eaffc bellard
{
144 fb0eaffc bellard
    env->crf[1] = regs->fpscr[7];
145 fb0eaffc bellard
    RETURN();
146 fb0eaffc bellard
}
147 fb0eaffc bellard
148 9a64fbe4 bellard
/* Constants load */
149 76a66253 j_mayer
void OPPROTO op_reset_T0 (void)
150 76a66253 j_mayer
{
151 76a66253 j_mayer
    T0 = 0;
152 76a66253 j_mayer
    RETURN();
153 76a66253 j_mayer
}
154 76a66253 j_mayer
155 79aceca5 bellard
PPC_OP(set_T0)
156 79aceca5 bellard
{
157 d9bce9d9 j_mayer
    T0 = (uint32_t)PARAM1;
158 79aceca5 bellard
    RETURN();
159 79aceca5 bellard
}
160 79aceca5 bellard
161 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
162 d9bce9d9 j_mayer
void OPPROTO op_set_T0_64 (void)
163 d9bce9d9 j_mayer
{
164 d9bce9d9 j_mayer
    T0 = ((uint64_t)PARAM1 << 32) | (uint64_t)PARAM2;
165 d9bce9d9 j_mayer
    RETURN();
166 d9bce9d9 j_mayer
}
167 d9bce9d9 j_mayer
#endif
168 d9bce9d9 j_mayer
169 79aceca5 bellard
PPC_OP(set_T1)
170 79aceca5 bellard
{
171 d9bce9d9 j_mayer
    T1 = (uint32_t)PARAM1;
172 d9bce9d9 j_mayer
    RETURN();
173 d9bce9d9 j_mayer
}
174 d9bce9d9 j_mayer
175 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
176 d9bce9d9 j_mayer
void OPPROTO op_set_T1_64 (void)
177 d9bce9d9 j_mayer
{
178 d9bce9d9 j_mayer
    T1 = ((uint64_t)PARAM1 << 32) | (uint64_t)PARAM2;
179 79aceca5 bellard
    RETURN();
180 79aceca5 bellard
}
181 d9bce9d9 j_mayer
#endif
182 79aceca5 bellard
183 76a66253 j_mayer
#if 0 // unused
184 79aceca5 bellard
PPC_OP(set_T2)
185 79aceca5 bellard
{
186 79aceca5 bellard
    T2 = PARAM(1);
187 79aceca5 bellard
    RETURN();
188 79aceca5 bellard
}
189 76a66253 j_mayer
#endif
190 79aceca5 bellard
191 76a66253 j_mayer
void OPPROTO op_move_T1_T0 (void)
192 79aceca5 bellard
{
193 76a66253 j_mayer
    T1 = T0;
194 76a66253 j_mayer
    RETURN();
195 9a64fbe4 bellard
}
196 9a64fbe4 bellard
197 d9bce9d9 j_mayer
void OPPROTO op_move_T2_T0 (void)
198 d9bce9d9 j_mayer
{
199 d9bce9d9 j_mayer
    T2 = T0;
200 d9bce9d9 j_mayer
    RETURN();
201 d9bce9d9 j_mayer
}
202 d9bce9d9 j_mayer
203 76a66253 j_mayer
/* Generate exceptions */
204 76a66253 j_mayer
PPC_OP(raise_exception_err)
205 9a64fbe4 bellard
{
206 76a66253 j_mayer
    do_raise_exception_err(PARAM(1), PARAM(2));
207 9a64fbe4 bellard
}
208 9a64fbe4 bellard
209 9fddaa0c bellard
PPC_OP(update_nip)
210 9a64fbe4 bellard
{
211 d9bce9d9 j_mayer
    env->nip = (uint32_t)PARAM1;
212 76a66253 j_mayer
    RETURN();
213 9a64fbe4 bellard
}
214 9a64fbe4 bellard
215 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
216 d9bce9d9 j_mayer
void OPPROTO op_update_nip_64 (void)
217 d9bce9d9 j_mayer
{
218 d9bce9d9 j_mayer
    env->nip = ((uint64_t)PARAM1 << 32) | (uint64_t)PARAM2;
219 d9bce9d9 j_mayer
    RETURN();
220 d9bce9d9 j_mayer
}
221 d9bce9d9 j_mayer
#endif
222 d9bce9d9 j_mayer
223 ea4e754f bellard
PPC_OP(debug)
224 ea4e754f bellard
{
225 ea4e754f bellard
    do_raise_exception(EXCP_DEBUG);
226 ea4e754f bellard
}
227 ea4e754f bellard
228 76a66253 j_mayer
PPC_OP(exit_tb)
229 9a64fbe4 bellard
{
230 76a66253 j_mayer
    EXIT_TB();
231 9a64fbe4 bellard
}
232 9a64fbe4 bellard
233 76a66253 j_mayer
/* Load/store special registers */
234 76a66253 j_mayer
PPC_OP(load_cr)
235 9a64fbe4 bellard
{
236 76a66253 j_mayer
    do_load_cr();
237 79aceca5 bellard
    RETURN();
238 79aceca5 bellard
}
239 79aceca5 bellard
240 76a66253 j_mayer
PPC_OP(store_cr)
241 79aceca5 bellard
{
242 76a66253 j_mayer
    do_store_cr(PARAM(1));
243 79aceca5 bellard
    RETURN();
244 79aceca5 bellard
}
245 79aceca5 bellard
246 76a66253 j_mayer
void OPPROTO op_load_cro (void)
247 79aceca5 bellard
{
248 76a66253 j_mayer
    T0 = env->crf[PARAM1];
249 79aceca5 bellard
    RETURN();
250 79aceca5 bellard
}
251 79aceca5 bellard
252 76a66253 j_mayer
void OPPROTO op_store_cro (void)
253 79aceca5 bellard
{
254 76a66253 j_mayer
    env->crf[PARAM1] = T0;
255 79aceca5 bellard
    RETURN();
256 79aceca5 bellard
}
257 79aceca5 bellard
258 79aceca5 bellard
PPC_OP(load_xer_cr)
259 79aceca5 bellard
{
260 79aceca5 bellard
    T0 = (xer_so << 3) | (xer_ov << 2) | (xer_ca << 1);
261 79aceca5 bellard
    RETURN();
262 79aceca5 bellard
}
263 79aceca5 bellard
264 79aceca5 bellard
PPC_OP(clear_xer_cr)
265 79aceca5 bellard
{
266 79aceca5 bellard
    xer_so = 0;
267 79aceca5 bellard
    xer_ov = 0;
268 79aceca5 bellard
    xer_ca = 0;
269 79aceca5 bellard
    RETURN();
270 79aceca5 bellard
}
271 79aceca5 bellard
272 79aceca5 bellard
PPC_OP(load_xer_bc)
273 79aceca5 bellard
{
274 9a64fbe4 bellard
    T1 = xer_bc;
275 79aceca5 bellard
    RETURN();
276 79aceca5 bellard
}
277 79aceca5 bellard
278 76a66253 j_mayer
void OPPROTO op_store_xer_bc (void)
279 76a66253 j_mayer
{
280 76a66253 j_mayer
    xer_bc = T0;
281 76a66253 j_mayer
    RETURN();
282 76a66253 j_mayer
}
283 76a66253 j_mayer
284 79aceca5 bellard
PPC_OP(load_xer)
285 79aceca5 bellard
{
286 76a66253 j_mayer
    do_load_xer();
287 79aceca5 bellard
    RETURN();
288 79aceca5 bellard
}
289 79aceca5 bellard
290 79aceca5 bellard
PPC_OP(store_xer)
291 79aceca5 bellard
{
292 76a66253 j_mayer
    do_store_xer();
293 76a66253 j_mayer
    RETURN();
294 76a66253 j_mayer
}
295 76a66253 j_mayer
296 76a66253 j_mayer
#if !defined(CONFIG_USER_ONLY)
297 76a66253 j_mayer
/* Segment registers load and store */
298 76a66253 j_mayer
PPC_OP(load_sr)
299 76a66253 j_mayer
{
300 76a66253 j_mayer
    T0 = regs->sr[T1];
301 76a66253 j_mayer
    RETURN();
302 76a66253 j_mayer
}
303 76a66253 j_mayer
304 76a66253 j_mayer
PPC_OP(store_sr)
305 76a66253 j_mayer
{
306 76a66253 j_mayer
    do_store_sr(env, T1, T0);
307 76a66253 j_mayer
    RETURN();
308 76a66253 j_mayer
}
309 76a66253 j_mayer
310 76a66253 j_mayer
PPC_OP(load_sdr1)
311 76a66253 j_mayer
{
312 76a66253 j_mayer
    T0 = regs->sdr1;
313 76a66253 j_mayer
    RETURN();
314 76a66253 j_mayer
}
315 76a66253 j_mayer
316 76a66253 j_mayer
PPC_OP(store_sdr1)
317 76a66253 j_mayer
{
318 76a66253 j_mayer
    do_store_sdr1(env, T0);
319 79aceca5 bellard
    RETURN();
320 79aceca5 bellard
}
321 79aceca5 bellard
322 d9bce9d9 j_mayer
#if defined (TARGET_PPC64)
323 d9bce9d9 j_mayer
void OPPROTO op_load_asr (void)
324 d9bce9d9 j_mayer
{
325 d9bce9d9 j_mayer
    T0 = env->asr;
326 d9bce9d9 j_mayer
    RETURN();
327 d9bce9d9 j_mayer
}
328 d9bce9d9 j_mayer
329 d9bce9d9 j_mayer
void OPPROTO op_store_asr (void)
330 d9bce9d9 j_mayer
{
331 d9bce9d9 j_mayer
    ppc_store_asr(env, T0);
332 d9bce9d9 j_mayer
    RETURN();
333 d9bce9d9 j_mayer
}
334 d9bce9d9 j_mayer
#endif
335 d9bce9d9 j_mayer
336 79aceca5 bellard
PPC_OP(load_msr)
337 79aceca5 bellard
{
338 3fc6c082 bellard
    T0 = do_load_msr(env);
339 79aceca5 bellard
    RETURN();
340 79aceca5 bellard
}
341 79aceca5 bellard
342 79aceca5 bellard
PPC_OP(store_msr)
343 79aceca5 bellard
{
344 3fc6c082 bellard
    do_store_msr(env, T0);
345 9a64fbe4 bellard
    RETURN();
346 9a64fbe4 bellard
}
347 d9bce9d9 j_mayer
348 d9bce9d9 j_mayer
#if defined (TARGET_PPC64)
349 d9bce9d9 j_mayer
void OPPROTO op_store_msr_32 (void)
350 d9bce9d9 j_mayer
{
351 d9bce9d9 j_mayer
    ppc_store_msr_32(env, T0);
352 d9bce9d9 j_mayer
    RETURN();
353 d9bce9d9 j_mayer
}
354 d9bce9d9 j_mayer
#endif
355 76a66253 j_mayer
#endif
356 9a64fbe4 bellard
357 9a64fbe4 bellard
/* SPR */
358 9a64fbe4 bellard
PPC_OP(load_spr)
359 9a64fbe4 bellard
{
360 9a64fbe4 bellard
    T0 = regs->spr[PARAM(1)];
361 9a64fbe4 bellard
    RETURN();
362 9a64fbe4 bellard
}
363 9a64fbe4 bellard
364 9a64fbe4 bellard
PPC_OP(store_spr)
365 9a64fbe4 bellard
{
366 9a64fbe4 bellard
    regs->spr[PARAM(1)] = T0;
367 79aceca5 bellard
    RETURN();
368 79aceca5 bellard
}
369 79aceca5 bellard
370 79aceca5 bellard
PPC_OP(load_lr)
371 79aceca5 bellard
{
372 9a64fbe4 bellard
    T0 = regs->lr;
373 9a64fbe4 bellard
    RETURN();
374 9a64fbe4 bellard
}
375 9a64fbe4 bellard
376 9a64fbe4 bellard
PPC_OP(store_lr)
377 9a64fbe4 bellard
{
378 9a64fbe4 bellard
    regs->lr = T0;
379 9a64fbe4 bellard
    RETURN();
380 9a64fbe4 bellard
}
381 9a64fbe4 bellard
382 9a64fbe4 bellard
PPC_OP(load_ctr)
383 9a64fbe4 bellard
{
384 9a64fbe4 bellard
    T0 = regs->ctr;
385 9a64fbe4 bellard
    RETURN();
386 9a64fbe4 bellard
}
387 9a64fbe4 bellard
388 9a64fbe4 bellard
PPC_OP(store_ctr)
389 9a64fbe4 bellard
{
390 9a64fbe4 bellard
    regs->ctr = T0;
391 9a64fbe4 bellard
    RETURN();
392 9a64fbe4 bellard
}
393 9a64fbe4 bellard
394 9fddaa0c bellard
PPC_OP(load_tbl)
395 9a64fbe4 bellard
{
396 9fddaa0c bellard
    T0 = cpu_ppc_load_tbl(regs);
397 9a64fbe4 bellard
    RETURN();
398 9a64fbe4 bellard
}
399 9a64fbe4 bellard
400 9fddaa0c bellard
PPC_OP(load_tbu)
401 9a64fbe4 bellard
{
402 9fddaa0c bellard
    T0 = cpu_ppc_load_tbu(regs);
403 9a64fbe4 bellard
    RETURN();
404 9a64fbe4 bellard
}
405 9a64fbe4 bellard
406 76a66253 j_mayer
#if !defined(CONFIG_USER_ONLY)
407 9fddaa0c bellard
PPC_OP(store_tbl)
408 9a64fbe4 bellard
{
409 9fddaa0c bellard
    cpu_ppc_store_tbl(regs, T0);
410 79aceca5 bellard
    RETURN();
411 79aceca5 bellard
}
412 79aceca5 bellard
413 9fddaa0c bellard
PPC_OP(store_tbu)
414 9a64fbe4 bellard
{
415 9fddaa0c bellard
    cpu_ppc_store_tbu(regs, T0);
416 9a64fbe4 bellard
    RETURN();
417 9a64fbe4 bellard
}
418 9a64fbe4 bellard
419 9fddaa0c bellard
PPC_OP(load_decr)
420 9a64fbe4 bellard
{
421 9fddaa0c bellard
    T0 = cpu_ppc_load_decr(regs);
422 76a66253 j_mayer
    RETURN();
423 76a66253 j_mayer
}
424 9fddaa0c bellard
425 9fddaa0c bellard
PPC_OP(store_decr)
426 9fddaa0c bellard
{
427 9fddaa0c bellard
    cpu_ppc_store_decr(regs, T0);
428 9a64fbe4 bellard
    RETURN();
429 9a64fbe4 bellard
}
430 9a64fbe4 bellard
431 9a64fbe4 bellard
PPC_OP(load_ibat)
432 9a64fbe4 bellard
{
433 9a64fbe4 bellard
    T0 = regs->IBAT[PARAM(1)][PARAM(2)];
434 76a66253 j_mayer
    RETURN();
435 9a64fbe4 bellard
}
436 9a64fbe4 bellard
437 76a66253 j_mayer
void OPPROTO op_store_ibatu (void)
438 9a64fbe4 bellard
{
439 3fc6c082 bellard
    do_store_ibatu(env, PARAM1, T0);
440 3fc6c082 bellard
    RETURN();
441 3fc6c082 bellard
}
442 3fc6c082 bellard
443 76a66253 j_mayer
void OPPROTO op_store_ibatl (void)
444 3fc6c082 bellard
{
445 3fc6c082 bellard
#if 1
446 3fc6c082 bellard
    env->IBAT[1][PARAM1] = T0;
447 3fc6c082 bellard
#else
448 3fc6c082 bellard
    do_store_ibatl(env, PARAM1, T0);
449 3fc6c082 bellard
#endif
450 3fc6c082 bellard
    RETURN();
451 9a64fbe4 bellard
}
452 9a64fbe4 bellard
453 9a64fbe4 bellard
PPC_OP(load_dbat)
454 9a64fbe4 bellard
{
455 9a64fbe4 bellard
    T0 = regs->DBAT[PARAM(1)][PARAM(2)];
456 76a66253 j_mayer
    RETURN();
457 9a64fbe4 bellard
}
458 9a64fbe4 bellard
459 76a66253 j_mayer
void OPPROTO op_store_dbatu (void)
460 3fc6c082 bellard
{
461 3fc6c082 bellard
    do_store_dbatu(env, PARAM1, T0);
462 3fc6c082 bellard
    RETURN();
463 3fc6c082 bellard
}
464 3fc6c082 bellard
465 76a66253 j_mayer
void OPPROTO op_store_dbatl (void)
466 9a64fbe4 bellard
{
467 3fc6c082 bellard
#if 1
468 3fc6c082 bellard
    env->DBAT[1][PARAM1] = T0;
469 3fc6c082 bellard
#else
470 3fc6c082 bellard
    do_store_dbatl(env, PARAM1, T0);
471 3fc6c082 bellard
#endif
472 3fc6c082 bellard
    RETURN();
473 9a64fbe4 bellard
}
474 76a66253 j_mayer
#endif /* !defined(CONFIG_USER_ONLY) */
475 9a64fbe4 bellard
476 fb0eaffc bellard
/* FPSCR */
477 fb0eaffc bellard
PPC_OP(load_fpscr)
478 fb0eaffc bellard
{
479 76a66253 j_mayer
    do_load_fpscr();
480 fb0eaffc bellard
    RETURN();
481 fb0eaffc bellard
}
482 fb0eaffc bellard
483 fb0eaffc bellard
PPC_OP(store_fpscr)
484 fb0eaffc bellard
{
485 76a66253 j_mayer
    do_store_fpscr(PARAM1);
486 fb0eaffc bellard
    RETURN();
487 fb0eaffc bellard
}
488 fb0eaffc bellard
489 fb0eaffc bellard
PPC_OP(reset_scrfx)
490 fb0eaffc bellard
{
491 fb0eaffc bellard
    regs->fpscr[7] &= ~0x8;
492 fb0eaffc bellard
    RETURN();
493 fb0eaffc bellard
}
494 fb0eaffc bellard
495 79aceca5 bellard
/* crf operations */
496 79aceca5 bellard
PPC_OP(getbit_T0)
497 79aceca5 bellard
{
498 79aceca5 bellard
    T0 = (T0 >> PARAM(1)) & 1;
499 79aceca5 bellard
    RETURN();
500 79aceca5 bellard
}
501 79aceca5 bellard
502 79aceca5 bellard
PPC_OP(getbit_T1)
503 79aceca5 bellard
{
504 79aceca5 bellard
    T1 = (T1 >> PARAM(1)) & 1;
505 79aceca5 bellard
    RETURN();
506 79aceca5 bellard
}
507 79aceca5 bellard
508 79aceca5 bellard
PPC_OP(setcrfbit)
509 79aceca5 bellard
{
510 d9bce9d9 j_mayer
    T1 = (T1 & PARAM(1)) | (T0 << PARAM(2));
511 79aceca5 bellard
    RETURN();
512 79aceca5 bellard
}
513 79aceca5 bellard
514 79aceca5 bellard
/* Branch */
515 9a64fbe4 bellard
#define EIP regs->nip
516 9a64fbe4 bellard
517 e98a6e40 bellard
PPC_OP(setlr)
518 e98a6e40 bellard
{
519 d9bce9d9 j_mayer
    regs->lr = (uint32_t)PARAM1;
520 76a66253 j_mayer
    RETURN();
521 e98a6e40 bellard
}
522 e98a6e40 bellard
523 d9bce9d9 j_mayer
#if defined (TARGET_PPC64)
524 d9bce9d9 j_mayer
void OPPROTO op_setlr_64 (void)
525 d9bce9d9 j_mayer
{
526 d9bce9d9 j_mayer
    regs->lr = ((uint64_t)PARAM1 << 32) | (uint64_t)PARAM2;
527 d9bce9d9 j_mayer
    RETURN();
528 d9bce9d9 j_mayer
}
529 d9bce9d9 j_mayer
#endif
530 d9bce9d9 j_mayer
531 c53be334 bellard
PPC_OP(goto_tb0)
532 e98a6e40 bellard
{
533 c53be334 bellard
    GOTO_TB(op_goto_tb0, PARAM1, 0);
534 c53be334 bellard
}
535 c53be334 bellard
536 c53be334 bellard
PPC_OP(goto_tb1)
537 c53be334 bellard
{
538 c53be334 bellard
    GOTO_TB(op_goto_tb1, PARAM1, 1);
539 e98a6e40 bellard
}
540 e98a6e40 bellard
541 d9bce9d9 j_mayer
void OPPROTO op_b_T1 (void)
542 e98a6e40 bellard
{
543 d9bce9d9 j_mayer
    regs->nip = (uint32_t)(T1 & ~3);
544 76a66253 j_mayer
    RETURN();
545 e98a6e40 bellard
}
546 e98a6e40 bellard
547 d9bce9d9 j_mayer
#if defined (TARGET_PPC64)
548 d9bce9d9 j_mayer
void OPPROTO op_b_T1_64 (void)
549 d9bce9d9 j_mayer
{
550 d9bce9d9 j_mayer
    regs->nip = (uint64_t)(T1 & ~3);
551 d9bce9d9 j_mayer
    RETURN();
552 d9bce9d9 j_mayer
}
553 d9bce9d9 j_mayer
#endif
554 d9bce9d9 j_mayer
555 c53be334 bellard
PPC_OP(jz_T0)
556 e98a6e40 bellard
{
557 c53be334 bellard
    if (!T0)
558 c53be334 bellard
        GOTO_LABEL_PARAM(1);
559 e98a6e40 bellard
    RETURN();
560 e98a6e40 bellard
}
561 e98a6e40 bellard
562 d9bce9d9 j_mayer
void OPPROTO op_btest_T1 (void)
563 e98a6e40 bellard
{
564 e98a6e40 bellard
    if (T0) {
565 d9bce9d9 j_mayer
        regs->nip = (uint32_t)(T1 & ~3);
566 e98a6e40 bellard
    } else {
567 d9bce9d9 j_mayer
        regs->nip = (uint32_t)PARAM1;
568 e98a6e40 bellard
    }
569 e98a6e40 bellard
    RETURN();
570 e98a6e40 bellard
}
571 e98a6e40 bellard
572 d9bce9d9 j_mayer
#if defined (TARGET_PPC64)
573 d9bce9d9 j_mayer
void OPPROTO op_btest_T1_64 (void)
574 d9bce9d9 j_mayer
{
575 d9bce9d9 j_mayer
    if (T0) {
576 d9bce9d9 j_mayer
        regs->nip = (uint64_t)(T1 & ~3);
577 d9bce9d9 j_mayer
    } else {
578 d9bce9d9 j_mayer
        regs->nip = ((uint64_t)PARAM1 << 32) | (uint64_t)PARAM2;
579 d9bce9d9 j_mayer
    }
580 d9bce9d9 j_mayer
    RETURN();
581 d9bce9d9 j_mayer
}
582 d9bce9d9 j_mayer
#endif
583 d9bce9d9 j_mayer
584 e98a6e40 bellard
PPC_OP(movl_T1_ctr)
585 e98a6e40 bellard
{
586 e98a6e40 bellard
    T1 = regs->ctr;
587 76a66253 j_mayer
    RETURN();
588 e98a6e40 bellard
}
589 e98a6e40 bellard
590 e98a6e40 bellard
PPC_OP(movl_T1_lr)
591 e98a6e40 bellard
{
592 e98a6e40 bellard
    T1 = regs->lr;
593 76a66253 j_mayer
    RETURN();
594 e98a6e40 bellard
}
595 e98a6e40 bellard
596 e98a6e40 bellard
/* tests with result in T0 */
597 d9bce9d9 j_mayer
void OPPROTO op_test_ctr (void)
598 d9bce9d9 j_mayer
{
599 d9bce9d9 j_mayer
    T0 = (uint32_t)regs->ctr;
600 d9bce9d9 j_mayer
    RETURN();
601 d9bce9d9 j_mayer
}
602 e98a6e40 bellard
603 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
604 d9bce9d9 j_mayer
void OPPROTO op_test_ctr_64 (void)
605 e98a6e40 bellard
{
606 d9bce9d9 j_mayer
    T0 = (uint64_t)regs->ctr;
607 d9bce9d9 j_mayer
    RETURN();
608 d9bce9d9 j_mayer
}
609 d9bce9d9 j_mayer
#endif
610 d9bce9d9 j_mayer
611 d9bce9d9 j_mayer
void OPPROTO op_test_ctr_true (void)
612 d9bce9d9 j_mayer
{
613 d9bce9d9 j_mayer
    T0 = ((uint32_t)regs->ctr != 0 && (T0 & PARAM1) != 0);
614 76a66253 j_mayer
    RETURN();
615 e98a6e40 bellard
}
616 e98a6e40 bellard
617 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
618 d9bce9d9 j_mayer
void OPPROTO op_test_ctr_true_64 (void)
619 e98a6e40 bellard
{
620 d9bce9d9 j_mayer
    T0 = ((uint64_t)regs->ctr != 0 && (T0 & PARAM1) != 0);
621 76a66253 j_mayer
    RETURN();
622 e98a6e40 bellard
}
623 d9bce9d9 j_mayer
#endif
624 e98a6e40 bellard
625 d9bce9d9 j_mayer
void OPPROTO op_test_ctr_false (void)
626 e98a6e40 bellard
{
627 d9bce9d9 j_mayer
    T0 = ((uint32_t)regs->ctr != 0 && (T0 & PARAM1) == 0);
628 76a66253 j_mayer
    RETURN();
629 e98a6e40 bellard
}
630 e98a6e40 bellard
631 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
632 d9bce9d9 j_mayer
void OPPROTO op_test_ctr_false_64 (void)
633 e98a6e40 bellard
{
634 d9bce9d9 j_mayer
    T0 = ((uint64_t)regs->ctr != 0 && (T0 & PARAM1) == 0);
635 76a66253 j_mayer
    RETURN();
636 e98a6e40 bellard
}
637 d9bce9d9 j_mayer
#endif
638 d9bce9d9 j_mayer
639 d9bce9d9 j_mayer
void OPPROTO op_test_ctrz (void)
640 d9bce9d9 j_mayer
{
641 d9bce9d9 j_mayer
    T0 = ((uint32_t)regs->ctr == 0);
642 d9bce9d9 j_mayer
    RETURN();
643 d9bce9d9 j_mayer
}
644 d9bce9d9 j_mayer
645 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
646 d9bce9d9 j_mayer
void OPPROTO op_test_ctrz_64 (void)
647 d9bce9d9 j_mayer
{
648 d9bce9d9 j_mayer
    T0 = ((uint64_t)regs->ctr == 0);
649 d9bce9d9 j_mayer
    RETURN();
650 d9bce9d9 j_mayer
}
651 d9bce9d9 j_mayer
#endif
652 d9bce9d9 j_mayer
653 d9bce9d9 j_mayer
void OPPROTO op_test_ctrz_true (void)
654 d9bce9d9 j_mayer
{
655 d9bce9d9 j_mayer
    T0 = ((uint32_t)regs->ctr == 0 && (T0 & PARAM1) != 0);
656 d9bce9d9 j_mayer
    RETURN();
657 d9bce9d9 j_mayer
}
658 d9bce9d9 j_mayer
659 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
660 d9bce9d9 j_mayer
void OPPROTO op_test_ctrz_true_64 (void)
661 d9bce9d9 j_mayer
{
662 d9bce9d9 j_mayer
    T0 = ((uint64_t)regs->ctr == 0 && (T0 & PARAM1) != 0);
663 d9bce9d9 j_mayer
    RETURN();
664 d9bce9d9 j_mayer
}
665 d9bce9d9 j_mayer
#endif
666 e98a6e40 bellard
667 d9bce9d9 j_mayer
void OPPROTO op_test_ctrz_false (void)
668 e98a6e40 bellard
{
669 d9bce9d9 j_mayer
    T0 = ((uint32_t)regs->ctr == 0 && (T0 & PARAM1) == 0);
670 76a66253 j_mayer
    RETURN();
671 e98a6e40 bellard
}
672 e98a6e40 bellard
673 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
674 d9bce9d9 j_mayer
void OPPROTO op_test_ctrz_false_64 (void)
675 e98a6e40 bellard
{
676 d9bce9d9 j_mayer
    T0 = ((uint64_t)regs->ctr == 0 && (T0 & PARAM1) == 0);
677 76a66253 j_mayer
    RETURN();
678 e98a6e40 bellard
}
679 d9bce9d9 j_mayer
#endif
680 e98a6e40 bellard
681 e98a6e40 bellard
PPC_OP(test_true)
682 e98a6e40 bellard
{
683 b88e4a9a bellard
    T0 = (T0 & PARAM(1));
684 76a66253 j_mayer
    RETURN();
685 e98a6e40 bellard
}
686 e98a6e40 bellard
687 e98a6e40 bellard
PPC_OP(test_false)
688 e98a6e40 bellard
{
689 e98a6e40 bellard
    T0 = ((T0 & PARAM(1)) == 0);
690 76a66253 j_mayer
    RETURN();
691 e98a6e40 bellard
}
692 79aceca5 bellard
693 79aceca5 bellard
/* CTR maintenance */
694 79aceca5 bellard
PPC_OP(dec_ctr)
695 79aceca5 bellard
{
696 9a64fbe4 bellard
    regs->ctr--;
697 79aceca5 bellard
    RETURN();
698 79aceca5 bellard
}
699 79aceca5 bellard
700 79aceca5 bellard
/***                           Integer arithmetic                          ***/
701 79aceca5 bellard
/* add */
702 79aceca5 bellard
PPC_OP(add)
703 79aceca5 bellard
{
704 79aceca5 bellard
    T0 += T1;
705 79aceca5 bellard
    RETURN();
706 79aceca5 bellard
}
707 79aceca5 bellard
708 d9bce9d9 j_mayer
void OPPROTO op_check_addo (void)
709 79aceca5 bellard
{
710 d9bce9d9 j_mayer
    if (likely(!(((uint32_t)T2 ^ (uint32_t)T1 ^ UINT32_MAX) &
711 d9bce9d9 j_mayer
                 ((uint32_t)T2 ^ (uint32_t)T0) & (1UL << 31)))) {
712 d9bce9d9 j_mayer
        xer_ov = 0;
713 d9bce9d9 j_mayer
    } else {
714 d9bce9d9 j_mayer
        xer_so = 1;
715 d9bce9d9 j_mayer
        xer_ov = 1;
716 d9bce9d9 j_mayer
    }
717 79aceca5 bellard
}
718 79aceca5 bellard
719 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
720 d9bce9d9 j_mayer
void OPPROTO op_check_addo_64 (void)
721 79aceca5 bellard
{
722 d9bce9d9 j_mayer
    if (likely(!(((uint64_t)T2 ^ (uint64_t)T1 ^ UINT64_MAX) &
723 1698b741 j_mayer
                 ((uint64_t)T2 ^ (uint64_t)T0) & (1ULL << 63)))) {
724 d9bce9d9 j_mayer
        xer_ov = 0;
725 79aceca5 bellard
    } else {
726 d9bce9d9 j_mayer
        xer_so = 1;
727 d9bce9d9 j_mayer
        xer_ov = 1;
728 d9bce9d9 j_mayer
    }
729 d9bce9d9 j_mayer
}
730 d9bce9d9 j_mayer
#endif
731 d9bce9d9 j_mayer
732 d9bce9d9 j_mayer
/* add carrying */
733 d9bce9d9 j_mayer
void OPPROTO op_check_addc (void)
734 d9bce9d9 j_mayer
{
735 d9bce9d9 j_mayer
    if (likely((uint32_t)T0 >= (uint32_t)T2)) {
736 79aceca5 bellard
        xer_ca = 0;
737 d9bce9d9 j_mayer
    } else {
738 d9bce9d9 j_mayer
        xer_ca = 1;
739 79aceca5 bellard
    }
740 79aceca5 bellard
    RETURN();
741 79aceca5 bellard
}
742 79aceca5 bellard
743 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
744 d9bce9d9 j_mayer
void OPPROTO op_check_addc_64 (void)
745 79aceca5 bellard
{
746 d9bce9d9 j_mayer
    if (likely((uint64_t)T0 >= (uint64_t)T2)) {
747 d9bce9d9 j_mayer
        xer_ca = 0;
748 d9bce9d9 j_mayer
    } else {
749 d9bce9d9 j_mayer
        xer_ca = 1;
750 d9bce9d9 j_mayer
    }
751 79aceca5 bellard
    RETURN();
752 79aceca5 bellard
}
753 d9bce9d9 j_mayer
#endif
754 79aceca5 bellard
755 79aceca5 bellard
/* add extended */
756 76a66253 j_mayer
void OPPROTO op_adde (void)
757 79aceca5 bellard
{
758 fdabc366 bellard
    do_adde();
759 76a66253 j_mayer
    RETURN();
760 79aceca5 bellard
}
761 79aceca5 bellard
762 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
763 d9bce9d9 j_mayer
void OPPROTO op_adde_64 (void)
764 79aceca5 bellard
{
765 d9bce9d9 j_mayer
    do_adde_64();
766 79aceca5 bellard
    RETURN();
767 79aceca5 bellard
}
768 d9bce9d9 j_mayer
#endif
769 79aceca5 bellard
770 79aceca5 bellard
/* add immediate */
771 79aceca5 bellard
PPC_OP(addi)
772 79aceca5 bellard
{
773 79aceca5 bellard
    T0 += PARAM(1);
774 79aceca5 bellard
    RETURN();
775 79aceca5 bellard
}
776 79aceca5 bellard
777 d9bce9d9 j_mayer
/* add to minus one extended */
778 d9bce9d9 j_mayer
void OPPROTO op_add_me (void)
779 79aceca5 bellard
{
780 d9bce9d9 j_mayer
    T0 += xer_ca + (-1);
781 d9bce9d9 j_mayer
    if (likely((uint32_t)T1 != 0))
782 79aceca5 bellard
        xer_ca = 1;
783 79aceca5 bellard
    RETURN();
784 79aceca5 bellard
}
785 79aceca5 bellard
786 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
787 d9bce9d9 j_mayer
void OPPROTO op_add_me_64 (void)
788 79aceca5 bellard
{
789 79aceca5 bellard
    T0 += xer_ca + (-1);
790 d9bce9d9 j_mayer
    if (likely((uint64_t)T1 != 0))
791 79aceca5 bellard
        xer_ca = 1;
792 79aceca5 bellard
    RETURN();
793 79aceca5 bellard
}
794 d9bce9d9 j_mayer
#endif
795 79aceca5 bellard
796 76a66253 j_mayer
void OPPROTO op_addmeo (void)
797 79aceca5 bellard
{
798 fdabc366 bellard
    do_addmeo();
799 79aceca5 bellard
    RETURN();
800 79aceca5 bellard
}
801 79aceca5 bellard
802 d9bce9d9 j_mayer
void OPPROTO op_addmeo_64 (void)
803 d9bce9d9 j_mayer
{
804 d9bce9d9 j_mayer
    do_addmeo();
805 d9bce9d9 j_mayer
    RETURN();
806 d9bce9d9 j_mayer
}
807 d9bce9d9 j_mayer
808 79aceca5 bellard
/* add to zero extended */
809 d9bce9d9 j_mayer
void OPPROTO op_add_ze (void)
810 79aceca5 bellard
{
811 79aceca5 bellard
    T0 += xer_ca;
812 79aceca5 bellard
    RETURN();
813 79aceca5 bellard
}
814 79aceca5 bellard
815 d9bce9d9 j_mayer
/* divide word */
816 d9bce9d9 j_mayer
void OPPROTO op_divw (void)
817 79aceca5 bellard
{
818 d9bce9d9 j_mayer
    if (unlikely(((int32_t)T0 == INT32_MIN && (int32_t)T1 == -1) ||
819 d9bce9d9 j_mayer
                 (int32_t)T1 == 0)) {
820 d9bce9d9 j_mayer
        T0 = (int32_t)((-1) * ((uint32_t)T0 >> 31));
821 d9bce9d9 j_mayer
    } else {
822 d9bce9d9 j_mayer
        T0 = (int32_t)T0 / (int32_t)T1;
823 d9bce9d9 j_mayer
    }
824 79aceca5 bellard
    RETURN();
825 79aceca5 bellard
}
826 79aceca5 bellard
827 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
828 d9bce9d9 j_mayer
void OPPROTO op_divd (void)
829 79aceca5 bellard
{
830 d9bce9d9 j_mayer
    if (unlikely(((int64_t)T0 == INT64_MIN && (int64_t)T1 == -1) ||
831 d9bce9d9 j_mayer
                 (int64_t)T1 == 0)) {
832 d9bce9d9 j_mayer
        T0 = (int64_t)((-1ULL) * ((uint64_t)T0 >> 63));
833 79aceca5 bellard
    } else {
834 d9bce9d9 j_mayer
        T0 = (int64_t)T0 / (int64_t)T1;
835 79aceca5 bellard
    }
836 79aceca5 bellard
    RETURN();
837 79aceca5 bellard
}
838 d9bce9d9 j_mayer
#endif
839 79aceca5 bellard
840 76a66253 j_mayer
void OPPROTO op_divwo (void)
841 79aceca5 bellard
{
842 fdabc366 bellard
    do_divwo();
843 79aceca5 bellard
    RETURN();
844 79aceca5 bellard
}
845 79aceca5 bellard
846 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
847 d9bce9d9 j_mayer
void OPPROTO op_divdo (void)
848 d9bce9d9 j_mayer
{
849 d9bce9d9 j_mayer
    do_divdo();
850 d9bce9d9 j_mayer
    RETURN();
851 d9bce9d9 j_mayer
}
852 d9bce9d9 j_mayer
#endif
853 d9bce9d9 j_mayer
854 79aceca5 bellard
/* divide word unsigned */
855 d9bce9d9 j_mayer
void OPPROTO op_divwu (void)
856 d9bce9d9 j_mayer
{
857 d9bce9d9 j_mayer
    if (unlikely(T1 == 0)) {
858 d9bce9d9 j_mayer
        T0 = 0;
859 d9bce9d9 j_mayer
    } else {
860 d9bce9d9 j_mayer
        T0 = (uint32_t)T0 / (uint32_t)T1;
861 d9bce9d9 j_mayer
    }
862 d9bce9d9 j_mayer
    RETURN();
863 d9bce9d9 j_mayer
}
864 d9bce9d9 j_mayer
865 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
866 d9bce9d9 j_mayer
void OPPROTO op_divdu (void)
867 79aceca5 bellard
{
868 d9bce9d9 j_mayer
    if (unlikely(T1 == 0)) {
869 79aceca5 bellard
        T0 = 0;
870 79aceca5 bellard
    } else {
871 79aceca5 bellard
        T0 /= T1;
872 79aceca5 bellard
    }
873 79aceca5 bellard
    RETURN();
874 79aceca5 bellard
}
875 d9bce9d9 j_mayer
#endif
876 79aceca5 bellard
877 76a66253 j_mayer
void OPPROTO op_divwuo (void)
878 79aceca5 bellard
{
879 fdabc366 bellard
    do_divwuo();
880 79aceca5 bellard
    RETURN();
881 79aceca5 bellard
}
882 79aceca5 bellard
883 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
884 d9bce9d9 j_mayer
void OPPROTO op_divduo (void)
885 d9bce9d9 j_mayer
{
886 d9bce9d9 j_mayer
    do_divduo();
887 d9bce9d9 j_mayer
    RETURN();
888 d9bce9d9 j_mayer
}
889 d9bce9d9 j_mayer
#endif
890 d9bce9d9 j_mayer
891 79aceca5 bellard
/* multiply high word */
892 d9bce9d9 j_mayer
void OPPROTO op_mulhw (void)
893 79aceca5 bellard
{
894 d9bce9d9 j_mayer
    T0 = ((int64_t)((int32_t)T0) * (int64_t)((int32_t)T1)) >> 32;
895 79aceca5 bellard
    RETURN();
896 79aceca5 bellard
}
897 79aceca5 bellard
898 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
899 d9bce9d9 j_mayer
void OPPROTO op_mulhd (void)
900 d9bce9d9 j_mayer
{
901 d9bce9d9 j_mayer
    uint64_t tl, th;
902 d9bce9d9 j_mayer
903 d9bce9d9 j_mayer
    do_imul64(&tl, &th);
904 d9bce9d9 j_mayer
    T0 = th;
905 d9bce9d9 j_mayer
    RETURN();
906 d9bce9d9 j_mayer
}
907 d9bce9d9 j_mayer
#endif
908 d9bce9d9 j_mayer
909 79aceca5 bellard
/* multiply high word unsigned */
910 d9bce9d9 j_mayer
void OPPROTO op_mulhwu (void)
911 79aceca5 bellard
{
912 d9bce9d9 j_mayer
    T0 = ((uint64_t)(uint32_t)T0 * (uint64_t)(uint32_t)T1) >> 32;
913 79aceca5 bellard
    RETURN();
914 79aceca5 bellard
}
915 79aceca5 bellard
916 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
917 d9bce9d9 j_mayer
void OPPROTO op_mulhdu (void)
918 d9bce9d9 j_mayer
{
919 d9bce9d9 j_mayer
    uint64_t tl, th;
920 d9bce9d9 j_mayer
921 d9bce9d9 j_mayer
    do_mul64(&tl, &th);
922 d9bce9d9 j_mayer
    T0 = th;
923 d9bce9d9 j_mayer
    RETURN();
924 d9bce9d9 j_mayer
}
925 d9bce9d9 j_mayer
#endif
926 d9bce9d9 j_mayer
927 79aceca5 bellard
/* multiply low immediate */
928 79aceca5 bellard
PPC_OP(mulli)
929 79aceca5 bellard
{
930 d9bce9d9 j_mayer
    T0 = ((int32_t)T0 * (int32_t)PARAM1);
931 79aceca5 bellard
    RETURN();
932 79aceca5 bellard
}
933 79aceca5 bellard
934 79aceca5 bellard
/* multiply low word */
935 79aceca5 bellard
PPC_OP(mullw)
936 79aceca5 bellard
{
937 d9bce9d9 j_mayer
    T0 = (int32_t)(T0 * T1);
938 d9bce9d9 j_mayer
    RETURN();
939 d9bce9d9 j_mayer
}
940 d9bce9d9 j_mayer
941 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
942 d9bce9d9 j_mayer
void OPPROTO op_mulld (void)
943 d9bce9d9 j_mayer
{
944 79aceca5 bellard
    T0 *= T1;
945 79aceca5 bellard
    RETURN();
946 79aceca5 bellard
}
947 d9bce9d9 j_mayer
#endif
948 79aceca5 bellard
949 76a66253 j_mayer
void OPPROTO op_mullwo (void)
950 79aceca5 bellard
{
951 fdabc366 bellard
    do_mullwo();
952 79aceca5 bellard
    RETURN();
953 79aceca5 bellard
}
954 79aceca5 bellard
955 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
956 d9bce9d9 j_mayer
void OPPROTO op_mulldo (void)
957 d9bce9d9 j_mayer
{
958 d9bce9d9 j_mayer
    do_mulldo();
959 d9bce9d9 j_mayer
    RETURN();
960 d9bce9d9 j_mayer
}
961 d9bce9d9 j_mayer
#endif
962 d9bce9d9 j_mayer
963 79aceca5 bellard
/* negate */
964 d9bce9d9 j_mayer
void OPPROTO op_neg (void)
965 79aceca5 bellard
{
966 d9bce9d9 j_mayer
    if (likely(T0 != INT32_MIN)) {
967 d9bce9d9 j_mayer
        T0 = -(int32_t)T0;
968 79aceca5 bellard
    }
969 79aceca5 bellard
    RETURN();
970 79aceca5 bellard
}
971 79aceca5 bellard
972 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
973 d9bce9d9 j_mayer
void OPPROTO op_neg_64 (void)
974 d9bce9d9 j_mayer
{
975 d9bce9d9 j_mayer
    if (likely(T0 != INT64_MIN)) {
976 d9bce9d9 j_mayer
        T0 = -(int64_t)T0;
977 d9bce9d9 j_mayer
    }
978 d9bce9d9 j_mayer
    RETURN();
979 d9bce9d9 j_mayer
}
980 d9bce9d9 j_mayer
#endif
981 d9bce9d9 j_mayer
982 76a66253 j_mayer
void OPPROTO op_nego (void)
983 79aceca5 bellard
{
984 fdabc366 bellard
    do_nego();
985 79aceca5 bellard
    RETURN();
986 79aceca5 bellard
}
987 79aceca5 bellard
988 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
989 d9bce9d9 j_mayer
void OPPROTO op_nego_64 (void)
990 d9bce9d9 j_mayer
{
991 d9bce9d9 j_mayer
    do_nego_64();
992 d9bce9d9 j_mayer
    RETURN();
993 d9bce9d9 j_mayer
}
994 d9bce9d9 j_mayer
#endif
995 d9bce9d9 j_mayer
996 79aceca5 bellard
/* substract from */
997 79aceca5 bellard
PPC_OP(subf)
998 79aceca5 bellard
{
999 79aceca5 bellard
    T0 = T1 - T0;
1000 79aceca5 bellard
    RETURN();
1001 79aceca5 bellard
}
1002 79aceca5 bellard
1003 d9bce9d9 j_mayer
void OPPROTO op_check_subfo (void)
1004 d9bce9d9 j_mayer
{
1005 d9bce9d9 j_mayer
    if (likely(!(((uint32_t)(~T2) ^ (uint32_t)T1 ^ UINT32_MAX) &
1006 d9bce9d9 j_mayer
                 ((uint32_t)(~T2) ^ (uint32_t)T0) & (1UL << 31)))) {
1007 d9bce9d9 j_mayer
        xer_ov = 0;
1008 d9bce9d9 j_mayer
    } else {
1009 d9bce9d9 j_mayer
        xer_so = 1;
1010 d9bce9d9 j_mayer
        xer_ov = 1;
1011 d9bce9d9 j_mayer
    }
1012 d9bce9d9 j_mayer
    RETURN();
1013 d9bce9d9 j_mayer
}
1014 d9bce9d9 j_mayer
1015 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
1016 d9bce9d9 j_mayer
void OPPROTO op_check_subfo_64 (void)
1017 79aceca5 bellard
{
1018 d9bce9d9 j_mayer
    if (likely(!(((uint64_t)(~T2) ^ (uint64_t)T1 ^ UINT64_MAX) &
1019 d9bce9d9 j_mayer
                 ((uint64_t)(~T2) ^ (uint64_t)T0) & (1ULL << 63)))) {
1020 d9bce9d9 j_mayer
        xer_ov = 0;
1021 d9bce9d9 j_mayer
    } else {
1022 d9bce9d9 j_mayer
        xer_so = 1;
1023 d9bce9d9 j_mayer
        xer_ov = 1;
1024 d9bce9d9 j_mayer
    }
1025 79aceca5 bellard
    RETURN();
1026 79aceca5 bellard
}
1027 d9bce9d9 j_mayer
#endif
1028 79aceca5 bellard
1029 79aceca5 bellard
/* substract from carrying */
1030 d9bce9d9 j_mayer
void OPPROTO op_check_subfc (void)
1031 79aceca5 bellard
{
1032 d9bce9d9 j_mayer
    if (likely((uint32_t)T0 > (uint32_t)T1)) {
1033 79aceca5 bellard
        xer_ca = 0;
1034 d9bce9d9 j_mayer
    } else {
1035 d9bce9d9 j_mayer
        xer_ca = 1;
1036 79aceca5 bellard
    }
1037 79aceca5 bellard
    RETURN();
1038 79aceca5 bellard
}
1039 79aceca5 bellard
1040 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
1041 d9bce9d9 j_mayer
void OPPROTO op_check_subfc_64 (void)
1042 79aceca5 bellard
{
1043 d9bce9d9 j_mayer
    if (likely((uint64_t)T0 > (uint64_t)T1)) {
1044 d9bce9d9 j_mayer
        xer_ca = 0;
1045 d9bce9d9 j_mayer
    } else {
1046 d9bce9d9 j_mayer
        xer_ca = 1;
1047 d9bce9d9 j_mayer
    }
1048 79aceca5 bellard
    RETURN();
1049 79aceca5 bellard
}
1050 d9bce9d9 j_mayer
#endif
1051 79aceca5 bellard
1052 79aceca5 bellard
/* substract from extended */
1053 76a66253 j_mayer
void OPPROTO op_subfe (void)
1054 79aceca5 bellard
{
1055 fdabc366 bellard
    do_subfe();
1056 79aceca5 bellard
    RETURN();
1057 79aceca5 bellard
}
1058 79aceca5 bellard
1059 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
1060 d9bce9d9 j_mayer
void OPPROTO op_subfe_64 (void)
1061 79aceca5 bellard
{
1062 d9bce9d9 j_mayer
    do_subfe_64();
1063 79aceca5 bellard
    RETURN();
1064 79aceca5 bellard
}
1065 d9bce9d9 j_mayer
#endif
1066 79aceca5 bellard
1067 79aceca5 bellard
/* substract from immediate carrying */
1068 d9bce9d9 j_mayer
void OPPROTO op_subfic (void)
1069 79aceca5 bellard
{
1070 d9bce9d9 j_mayer
    T0 = PARAM1 + ~T0 + 1;
1071 d9bce9d9 j_mayer
    if ((uint32_t)T0 <= (uint32_t)PARAM1) {
1072 79aceca5 bellard
        xer_ca = 1;
1073 79aceca5 bellard
    } else {
1074 79aceca5 bellard
        xer_ca = 0;
1075 79aceca5 bellard
    }
1076 79aceca5 bellard
    RETURN();
1077 79aceca5 bellard
}
1078 79aceca5 bellard
1079 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
1080 d9bce9d9 j_mayer
void OPPROTO op_subfic_64 (void)
1081 d9bce9d9 j_mayer
{
1082 d9bce9d9 j_mayer
    T0 = PARAM1 + ~T0 + 1;
1083 d9bce9d9 j_mayer
    if ((uint64_t)T0 <= (uint64_t)PARAM1) {
1084 d9bce9d9 j_mayer
        xer_ca = 1;
1085 d9bce9d9 j_mayer
    } else {
1086 d9bce9d9 j_mayer
        xer_ca = 0;
1087 d9bce9d9 j_mayer
    }
1088 d9bce9d9 j_mayer
    RETURN();
1089 d9bce9d9 j_mayer
}
1090 d9bce9d9 j_mayer
#endif
1091 d9bce9d9 j_mayer
1092 79aceca5 bellard
/* substract from minus one extended */
1093 d9bce9d9 j_mayer
void OPPROTO op_subfme (void)
1094 79aceca5 bellard
{
1095 79aceca5 bellard
    T0 = ~T0 + xer_ca - 1;
1096 d9bce9d9 j_mayer
    if (likely((uint32_t)T0 != (uint32_t)-1))
1097 d9bce9d9 j_mayer
        xer_ca = 1;
1098 d9bce9d9 j_mayer
    RETURN();
1099 d9bce9d9 j_mayer
}
1100 79aceca5 bellard
1101 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
1102 d9bce9d9 j_mayer
void OPPROTO op_subfme_64 (void)
1103 d9bce9d9 j_mayer
{
1104 d9bce9d9 j_mayer
    T0 = ~T0 + xer_ca - 1;
1105 d9bce9d9 j_mayer
    if (likely((uint64_t)T0 != (uint64_t)-1))
1106 79aceca5 bellard
        xer_ca = 1;
1107 79aceca5 bellard
    RETURN();
1108 79aceca5 bellard
}
1109 d9bce9d9 j_mayer
#endif
1110 79aceca5 bellard
1111 76a66253 j_mayer
void OPPROTO op_subfmeo (void)
1112 79aceca5 bellard
{
1113 fdabc366 bellard
    do_subfmeo();
1114 79aceca5 bellard
    RETURN();
1115 79aceca5 bellard
}
1116 79aceca5 bellard
1117 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
1118 d9bce9d9 j_mayer
void OPPROTO op_subfmeo_64 (void)
1119 d9bce9d9 j_mayer
{
1120 d9bce9d9 j_mayer
    do_subfmeo_64();
1121 d9bce9d9 j_mayer
    RETURN();
1122 d9bce9d9 j_mayer
}
1123 d9bce9d9 j_mayer
#endif
1124 d9bce9d9 j_mayer
1125 79aceca5 bellard
/* substract from zero extended */
1126 d9bce9d9 j_mayer
void OPPROTO op_subfze (void)
1127 79aceca5 bellard
{
1128 79aceca5 bellard
    T1 = ~T0;
1129 79aceca5 bellard
    T0 = T1 + xer_ca;
1130 d9bce9d9 j_mayer
    if ((uint32_t)T0 < (uint32_t)T1) {
1131 79aceca5 bellard
        xer_ca = 1;
1132 79aceca5 bellard
    } else {
1133 79aceca5 bellard
        xer_ca = 0;
1134 79aceca5 bellard
    }
1135 79aceca5 bellard
    RETURN();
1136 79aceca5 bellard
}
1137 79aceca5 bellard
1138 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
1139 d9bce9d9 j_mayer
void OPPROTO op_subfze_64 (void)
1140 d9bce9d9 j_mayer
{
1141 d9bce9d9 j_mayer
    T1 = ~T0;
1142 d9bce9d9 j_mayer
    T0 = T1 + xer_ca;
1143 d9bce9d9 j_mayer
    if ((uint64_t)T0 < (uint64_t)T1) {
1144 d9bce9d9 j_mayer
        xer_ca = 1;
1145 d9bce9d9 j_mayer
    } else {
1146 d9bce9d9 j_mayer
        xer_ca = 0;
1147 d9bce9d9 j_mayer
    }
1148 d9bce9d9 j_mayer
    RETURN();
1149 d9bce9d9 j_mayer
}
1150 d9bce9d9 j_mayer
#endif
1151 d9bce9d9 j_mayer
1152 76a66253 j_mayer
void OPPROTO op_subfzeo (void)
1153 79aceca5 bellard
{
1154 fdabc366 bellard
    do_subfzeo();
1155 79aceca5 bellard
    RETURN();
1156 79aceca5 bellard
}
1157 79aceca5 bellard
1158 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
1159 d9bce9d9 j_mayer
void OPPROTO op_subfzeo_64 (void)
1160 d9bce9d9 j_mayer
{
1161 d9bce9d9 j_mayer
    do_subfzeo_64();
1162 d9bce9d9 j_mayer
    RETURN();
1163 d9bce9d9 j_mayer
}
1164 d9bce9d9 j_mayer
#endif
1165 d9bce9d9 j_mayer
1166 79aceca5 bellard
/***                           Integer comparison                          ***/
1167 79aceca5 bellard
/* compare */
1168 d9bce9d9 j_mayer
void OPPROTO op_cmp (void)
1169 d9bce9d9 j_mayer
{
1170 d9bce9d9 j_mayer
    if ((int32_t)T0 < (int32_t)T1) {
1171 d9bce9d9 j_mayer
        T0 = 0x08;
1172 d9bce9d9 j_mayer
    } else if ((int32_t)T0 > (int32_t)T1) {
1173 d9bce9d9 j_mayer
        T0 = 0x04;
1174 d9bce9d9 j_mayer
    } else {
1175 d9bce9d9 j_mayer
        T0 = 0x02;
1176 d9bce9d9 j_mayer
    }
1177 d9bce9d9 j_mayer
    RETURN();
1178 d9bce9d9 j_mayer
}
1179 d9bce9d9 j_mayer
1180 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
1181 d9bce9d9 j_mayer
void OPPROTO op_cmp_64 (void)
1182 79aceca5 bellard
{
1183 d9bce9d9 j_mayer
    if ((int64_t)T0 < (int64_t)T1) {
1184 79aceca5 bellard
        T0 = 0x08;
1185 d9bce9d9 j_mayer
    } else if ((int64_t)T0 > (int64_t)T1) {
1186 79aceca5 bellard
        T0 = 0x04;
1187 79aceca5 bellard
    } else {
1188 79aceca5 bellard
        T0 = 0x02;
1189 79aceca5 bellard
    }
1190 79aceca5 bellard
    RETURN();
1191 79aceca5 bellard
}
1192 d9bce9d9 j_mayer
#endif
1193 79aceca5 bellard
1194 79aceca5 bellard
/* compare immediate */
1195 d9bce9d9 j_mayer
void OPPROTO op_cmpi (void)
1196 79aceca5 bellard
{
1197 d9bce9d9 j_mayer
    if ((int32_t)T0 < (int32_t)PARAM1) {
1198 79aceca5 bellard
        T0 = 0x08;
1199 d9bce9d9 j_mayer
    } else if ((int32_t)T0 > (int32_t)PARAM1) {
1200 79aceca5 bellard
        T0 = 0x04;
1201 79aceca5 bellard
    } else {
1202 79aceca5 bellard
        T0 = 0x02;
1203 79aceca5 bellard
    }
1204 79aceca5 bellard
    RETURN();
1205 79aceca5 bellard
}
1206 79aceca5 bellard
1207 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
1208 d9bce9d9 j_mayer
void OPPROTO op_cmpi_64 (void)
1209 d9bce9d9 j_mayer
{
1210 d9bce9d9 j_mayer
    if ((int64_t)T0 < (int64_t)((int32_t)PARAM1)) {
1211 d9bce9d9 j_mayer
        T0 = 0x08;
1212 d9bce9d9 j_mayer
    } else if ((int64_t)T0 > (int64_t)((int32_t)PARAM1)) {
1213 d9bce9d9 j_mayer
        T0 = 0x04;
1214 d9bce9d9 j_mayer
    } else {
1215 d9bce9d9 j_mayer
        T0 = 0x02;
1216 d9bce9d9 j_mayer
    }
1217 d9bce9d9 j_mayer
    RETURN();
1218 d9bce9d9 j_mayer
}
1219 d9bce9d9 j_mayer
#endif
1220 d9bce9d9 j_mayer
1221 79aceca5 bellard
/* compare logical */
1222 d9bce9d9 j_mayer
void OPPROTO op_cmpl (void)
1223 79aceca5 bellard
{
1224 d9bce9d9 j_mayer
    if ((uint32_t)T0 < (uint32_t)T1) {
1225 79aceca5 bellard
        T0 = 0x08;
1226 d9bce9d9 j_mayer
    } else if ((uint32_t)T0 > (uint32_t)T1) {
1227 79aceca5 bellard
        T0 = 0x04;
1228 79aceca5 bellard
    } else {
1229 79aceca5 bellard
        T0 = 0x02;
1230 79aceca5 bellard
    }
1231 79aceca5 bellard
    RETURN();
1232 79aceca5 bellard
}
1233 79aceca5 bellard
1234 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
1235 d9bce9d9 j_mayer
void OPPROTO op_cmpl_64 (void)
1236 d9bce9d9 j_mayer
{
1237 d9bce9d9 j_mayer
    if ((uint64_t)T0 < (uint64_t)T1) {
1238 d9bce9d9 j_mayer
        T0 = 0x08;
1239 d9bce9d9 j_mayer
    } else if ((uint64_t)T0 > (uint64_t)T1) {
1240 d9bce9d9 j_mayer
        T0 = 0x04;
1241 d9bce9d9 j_mayer
    } else {
1242 d9bce9d9 j_mayer
        T0 = 0x02;
1243 d9bce9d9 j_mayer
    }
1244 d9bce9d9 j_mayer
    RETURN();
1245 d9bce9d9 j_mayer
}
1246 d9bce9d9 j_mayer
#endif
1247 d9bce9d9 j_mayer
1248 79aceca5 bellard
/* compare logical immediate */
1249 d9bce9d9 j_mayer
void OPPROTO op_cmpli (void)
1250 d9bce9d9 j_mayer
{
1251 d9bce9d9 j_mayer
    if ((uint32_t)T0 < (uint32_t)PARAM1) {
1252 d9bce9d9 j_mayer
        T0 = 0x08;
1253 d9bce9d9 j_mayer
    } else if ((uint32_t)T0 > (uint32_t)PARAM1) {
1254 d9bce9d9 j_mayer
        T0 = 0x04;
1255 d9bce9d9 j_mayer
    } else {
1256 d9bce9d9 j_mayer
        T0 = 0x02;
1257 d9bce9d9 j_mayer
    }
1258 d9bce9d9 j_mayer
    RETURN();
1259 d9bce9d9 j_mayer
}
1260 d9bce9d9 j_mayer
1261 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
1262 d9bce9d9 j_mayer
void OPPROTO op_cmpli_64 (void)
1263 79aceca5 bellard
{
1264 d9bce9d9 j_mayer
    if ((uint64_t)T0 < (uint64_t)PARAM1) {
1265 79aceca5 bellard
        T0 = 0x08;
1266 d9bce9d9 j_mayer
    } else if ((uint64_t)T0 > (uint64_t)PARAM1) {
1267 79aceca5 bellard
        T0 = 0x04;
1268 79aceca5 bellard
    } else {
1269 79aceca5 bellard
        T0 = 0x02;
1270 79aceca5 bellard
    }
1271 79aceca5 bellard
    RETURN();
1272 79aceca5 bellard
}
1273 d9bce9d9 j_mayer
#endif
1274 d9bce9d9 j_mayer
1275 d9bce9d9 j_mayer
void OPPROTO op_isel (void)
1276 d9bce9d9 j_mayer
{
1277 d9bce9d9 j_mayer
    if (T0)
1278 d9bce9d9 j_mayer
        T0 = T1;
1279 d9bce9d9 j_mayer
    else
1280 d9bce9d9 j_mayer
        T0 = T2;
1281 d9bce9d9 j_mayer
    RETURN();
1282 d9bce9d9 j_mayer
}
1283 d9bce9d9 j_mayer
1284 d9bce9d9 j_mayer
void OPPROTO op_popcntb (void)
1285 d9bce9d9 j_mayer
{
1286 d9bce9d9 j_mayer
    do_popcntb();
1287 d9bce9d9 j_mayer
    RETURN();
1288 d9bce9d9 j_mayer
}
1289 d9bce9d9 j_mayer
1290 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
1291 d9bce9d9 j_mayer
void OPPROTO op_popcntb_64 (void)
1292 d9bce9d9 j_mayer
{
1293 d9bce9d9 j_mayer
    do_popcntb_64();
1294 d9bce9d9 j_mayer
    RETURN();
1295 d9bce9d9 j_mayer
}
1296 d9bce9d9 j_mayer
#endif
1297 79aceca5 bellard
1298 79aceca5 bellard
/***                            Integer logical                            ***/
1299 79aceca5 bellard
/* and */
1300 79aceca5 bellard
PPC_OP(and)
1301 79aceca5 bellard
{
1302 79aceca5 bellard
    T0 &= T1;
1303 79aceca5 bellard
    RETURN();
1304 79aceca5 bellard
}
1305 79aceca5 bellard
1306 79aceca5 bellard
/* andc */
1307 79aceca5 bellard
PPC_OP(andc)
1308 79aceca5 bellard
{
1309 79aceca5 bellard
    T0 &= ~T1;
1310 79aceca5 bellard
    RETURN();
1311 79aceca5 bellard
}
1312 79aceca5 bellard
1313 79aceca5 bellard
/* andi. */
1314 76a66253 j_mayer
void OPPROTO op_andi_T0 (void)
1315 79aceca5 bellard
{
1316 79aceca5 bellard
    T0 &= PARAM(1);
1317 79aceca5 bellard
    RETURN();
1318 79aceca5 bellard
}
1319 79aceca5 bellard
1320 76a66253 j_mayer
void OPPROTO op_andi_T1 (void)
1321 76a66253 j_mayer
{
1322 76a66253 j_mayer
    T1 &= PARAM1;
1323 76a66253 j_mayer
    RETURN();
1324 76a66253 j_mayer
}
1325 76a66253 j_mayer
1326 79aceca5 bellard
/* count leading zero */
1327 76a66253 j_mayer
void OPPROTO op_cntlzw (void)
1328 79aceca5 bellard
{
1329 0487d6a8 j_mayer
    T0 = _do_cntlzw(T0);
1330 79aceca5 bellard
    RETURN();
1331 79aceca5 bellard
}
1332 79aceca5 bellard
1333 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
1334 d9bce9d9 j_mayer
void OPPROTO op_cntlzd (void)
1335 d9bce9d9 j_mayer
{
1336 0487d6a8 j_mayer
    T0 = _do_cntlzd(T0);
1337 d9bce9d9 j_mayer
    RETURN();
1338 d9bce9d9 j_mayer
}
1339 d9bce9d9 j_mayer
#endif
1340 d9bce9d9 j_mayer
1341 79aceca5 bellard
/* eqv */
1342 79aceca5 bellard
PPC_OP(eqv)
1343 79aceca5 bellard
{
1344 79aceca5 bellard
    T0 = ~(T0 ^ T1);
1345 79aceca5 bellard
    RETURN();
1346 79aceca5 bellard
}
1347 79aceca5 bellard
1348 79aceca5 bellard
/* extend sign byte */
1349 d9bce9d9 j_mayer
void OPPROTO op_extsb (void)
1350 79aceca5 bellard
{
1351 d9bce9d9 j_mayer
#if defined (TARGET_PPC64)
1352 d9bce9d9 j_mayer
    T0 = (int64_t)((int8_t)T0);
1353 d9bce9d9 j_mayer
#else
1354 d9bce9d9 j_mayer
    T0 = (int32_t)((int8_t)T0);
1355 d9bce9d9 j_mayer
#endif
1356 79aceca5 bellard
    RETURN();
1357 79aceca5 bellard
}
1358 79aceca5 bellard
1359 79aceca5 bellard
/* extend sign half word */
1360 d9bce9d9 j_mayer
void OPPROTO op_extsh (void)
1361 79aceca5 bellard
{
1362 d9bce9d9 j_mayer
#if defined (TARGET_PPC64)
1363 d9bce9d9 j_mayer
    T0 = (int64_t)((int16_t)T0);
1364 d9bce9d9 j_mayer
#else
1365 d9bce9d9 j_mayer
    T0 = (int32_t)((int16_t)T0);
1366 d9bce9d9 j_mayer
#endif
1367 79aceca5 bellard
    RETURN();
1368 79aceca5 bellard
}
1369 79aceca5 bellard
1370 d9bce9d9 j_mayer
#if defined (TARGET_PPC64)
1371 d9bce9d9 j_mayer
void OPPROTO op_extsw (void)
1372 d9bce9d9 j_mayer
{
1373 d9bce9d9 j_mayer
    T0 = (int64_t)((int32_t)T0);
1374 d9bce9d9 j_mayer
    RETURN();
1375 d9bce9d9 j_mayer
}
1376 d9bce9d9 j_mayer
#endif
1377 d9bce9d9 j_mayer
1378 79aceca5 bellard
/* nand */
1379 79aceca5 bellard
PPC_OP(nand)
1380 79aceca5 bellard
{
1381 79aceca5 bellard
    T0 = ~(T0 & T1);
1382 79aceca5 bellard
    RETURN();
1383 79aceca5 bellard
}
1384 79aceca5 bellard
1385 79aceca5 bellard
/* nor */
1386 79aceca5 bellard
PPC_OP(nor)
1387 79aceca5 bellard
{
1388 79aceca5 bellard
    T0 = ~(T0 | T1);
1389 79aceca5 bellard
    RETURN();
1390 79aceca5 bellard
}
1391 79aceca5 bellard
1392 79aceca5 bellard
/* or */
1393 79aceca5 bellard
PPC_OP(or)
1394 79aceca5 bellard
{
1395 79aceca5 bellard
    T0 |= T1;
1396 79aceca5 bellard
    RETURN();
1397 79aceca5 bellard
}
1398 79aceca5 bellard
1399 79aceca5 bellard
/* orc */
1400 79aceca5 bellard
PPC_OP(orc)
1401 79aceca5 bellard
{
1402 79aceca5 bellard
    T0 |= ~T1;
1403 79aceca5 bellard
    RETURN();
1404 79aceca5 bellard
}
1405 79aceca5 bellard
1406 79aceca5 bellard
/* ori */
1407 79aceca5 bellard
PPC_OP(ori)
1408 79aceca5 bellard
{
1409 79aceca5 bellard
    T0 |= PARAM(1);
1410 79aceca5 bellard
    RETURN();
1411 79aceca5 bellard
}
1412 79aceca5 bellard
1413 79aceca5 bellard
/* xor */
1414 79aceca5 bellard
PPC_OP(xor)
1415 79aceca5 bellard
{
1416 79aceca5 bellard
    T0 ^= T1;
1417 79aceca5 bellard
    RETURN();
1418 79aceca5 bellard
}
1419 79aceca5 bellard
1420 79aceca5 bellard
/* xori */
1421 79aceca5 bellard
PPC_OP(xori)
1422 79aceca5 bellard
{
1423 79aceca5 bellard
    T0 ^= PARAM(1);
1424 79aceca5 bellard
    RETURN();
1425 79aceca5 bellard
}
1426 79aceca5 bellard
1427 79aceca5 bellard
/***                             Integer rotate                            ***/
1428 76a66253 j_mayer
void OPPROTO op_rotl32_T0_T1 (void)
1429 79aceca5 bellard
{
1430 76a66253 j_mayer
    T0 = rotl32(T0, T1 & 0x1F);
1431 79aceca5 bellard
    RETURN();
1432 79aceca5 bellard
}
1433 79aceca5 bellard
1434 76a66253 j_mayer
void OPPROTO op_rotli32_T0 (void)
1435 79aceca5 bellard
{
1436 76a66253 j_mayer
    T0 = rotl32(T0, PARAM1);
1437 79aceca5 bellard
    RETURN();
1438 79aceca5 bellard
}
1439 79aceca5 bellard
1440 79aceca5 bellard
/***                             Integer shift                             ***/
1441 79aceca5 bellard
/* shift left word */
1442 d9bce9d9 j_mayer
void OPPROTO op_slw (void)
1443 79aceca5 bellard
{
1444 79aceca5 bellard
    if (T1 & 0x20) {
1445 79aceca5 bellard
        T0 = 0;
1446 79aceca5 bellard
    } else {
1447 d9bce9d9 j_mayer
        T0 = (uint32_t)(T0 << T1);
1448 d9bce9d9 j_mayer
    }
1449 d9bce9d9 j_mayer
    RETURN();
1450 d9bce9d9 j_mayer
}
1451 d9bce9d9 j_mayer
1452 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
1453 d9bce9d9 j_mayer
void OPPROTO op_sld (void)
1454 d9bce9d9 j_mayer
{
1455 d9bce9d9 j_mayer
    if (T1 & 0x40) {
1456 d9bce9d9 j_mayer
        T0 = 0;
1457 d9bce9d9 j_mayer
    } else {
1458 79aceca5 bellard
        T0 = T0 << T1;
1459 79aceca5 bellard
    }
1460 79aceca5 bellard
    RETURN();
1461 79aceca5 bellard
}
1462 d9bce9d9 j_mayer
#endif
1463 79aceca5 bellard
1464 79aceca5 bellard
/* shift right algebraic word */
1465 76a66253 j_mayer
void OPPROTO op_sraw (void)
1466 79aceca5 bellard
{
1467 9a64fbe4 bellard
    do_sraw();
1468 79aceca5 bellard
    RETURN();
1469 79aceca5 bellard
}
1470 79aceca5 bellard
1471 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
1472 d9bce9d9 j_mayer
void OPPROTO op_srad (void)
1473 d9bce9d9 j_mayer
{
1474 d9bce9d9 j_mayer
    do_srad();
1475 d9bce9d9 j_mayer
    RETURN();
1476 d9bce9d9 j_mayer
}
1477 d9bce9d9 j_mayer
#endif
1478 d9bce9d9 j_mayer
1479 79aceca5 bellard
/* shift right algebraic word immediate */
1480 d9bce9d9 j_mayer
void OPPROTO op_srawi (void)
1481 79aceca5 bellard
{
1482 d9bce9d9 j_mayer
    uint32_t mask = (uint32_t)PARAM2;
1483 d9bce9d9 j_mayer
1484 d9bce9d9 j_mayer
    T0 = (int32_t)T0 >> PARAM1;
1485 d9bce9d9 j_mayer
    if ((int32_t)T1 < 0 && (T1 & mask) != 0) {
1486 79aceca5 bellard
        xer_ca = 1;
1487 79aceca5 bellard
    } else {
1488 79aceca5 bellard
        xer_ca = 0;
1489 79aceca5 bellard
    }
1490 79aceca5 bellard
    RETURN();
1491 79aceca5 bellard
}
1492 79aceca5 bellard
1493 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
1494 d9bce9d9 j_mayer
void OPPROTO op_sradi (void)
1495 d9bce9d9 j_mayer
{
1496 d9bce9d9 j_mayer
    uint64_t mask = ((uint64_t)PARAM2 << 32) | (uint64_t)PARAM3;
1497 d9bce9d9 j_mayer
1498 d9bce9d9 j_mayer
    T0 = (int64_t)T0 >> PARAM1;
1499 d9bce9d9 j_mayer
    if ((int64_t)T1 < 0 && ((uint64_t)T1 & mask) != 0) {
1500 d9bce9d9 j_mayer
        xer_ca = 1;
1501 d9bce9d9 j_mayer
    } else {
1502 d9bce9d9 j_mayer
        xer_ca = 0;
1503 d9bce9d9 j_mayer
    }
1504 d9bce9d9 j_mayer
    RETURN();
1505 d9bce9d9 j_mayer
}
1506 d9bce9d9 j_mayer
#endif
1507 d9bce9d9 j_mayer
1508 79aceca5 bellard
/* shift right word */
1509 d9bce9d9 j_mayer
void OPPROTO op_srw (void)
1510 79aceca5 bellard
{
1511 79aceca5 bellard
    if (T1 & 0x20) {
1512 79aceca5 bellard
        T0 = 0;
1513 79aceca5 bellard
    } else {
1514 d9bce9d9 j_mayer
        T0 = (uint32_t)T0 >> T1;
1515 d9bce9d9 j_mayer
    }
1516 d9bce9d9 j_mayer
    RETURN();
1517 d9bce9d9 j_mayer
}
1518 d9bce9d9 j_mayer
1519 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
1520 d9bce9d9 j_mayer
void OPPROTO op_srd (void)
1521 d9bce9d9 j_mayer
{
1522 d9bce9d9 j_mayer
    if (T1 & 0x40) {
1523 d9bce9d9 j_mayer
        T0 = 0;
1524 d9bce9d9 j_mayer
    } else {
1525 d9bce9d9 j_mayer
        T0 = (uint64_t)T0 >> T1;
1526 79aceca5 bellard
    }
1527 79aceca5 bellard
    RETURN();
1528 79aceca5 bellard
}
1529 d9bce9d9 j_mayer
#endif
1530 79aceca5 bellard
1531 76a66253 j_mayer
void OPPROTO op_sl_T0_T1 (void)
1532 76a66253 j_mayer
{
1533 76a66253 j_mayer
    T0 = T0 << T1;
1534 76a66253 j_mayer
    RETURN();
1535 76a66253 j_mayer
}
1536 76a66253 j_mayer
1537 76a66253 j_mayer
void OPPROTO op_sli_T0 (void)
1538 76a66253 j_mayer
{
1539 76a66253 j_mayer
    T0 = T0 << PARAM1;
1540 76a66253 j_mayer
    RETURN();
1541 76a66253 j_mayer
}
1542 76a66253 j_mayer
1543 76a66253 j_mayer
void OPPROTO op_srl_T0_T1 (void)
1544 76a66253 j_mayer
{
1545 d9bce9d9 j_mayer
    T0 = (uint32_t)T0 >> T1;
1546 d9bce9d9 j_mayer
    RETURN();
1547 d9bce9d9 j_mayer
}
1548 d9bce9d9 j_mayer
1549 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
1550 d9bce9d9 j_mayer
void OPPROTO op_srl_T0_T1_64 (void)
1551 d9bce9d9 j_mayer
{
1552 d9bce9d9 j_mayer
    T0 = (uint32_t)T0 >> T1;
1553 76a66253 j_mayer
    RETURN();
1554 76a66253 j_mayer
}
1555 d9bce9d9 j_mayer
#endif
1556 76a66253 j_mayer
1557 76a66253 j_mayer
void OPPROTO op_srli_T0 (void)
1558 76a66253 j_mayer
{
1559 d9bce9d9 j_mayer
    T0 = (uint32_t)T0 >> PARAM1;
1560 76a66253 j_mayer
    RETURN();
1561 76a66253 j_mayer
}
1562 76a66253 j_mayer
1563 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
1564 d9bce9d9 j_mayer
void OPPROTO op_srli_T0_64 (void)
1565 d9bce9d9 j_mayer
{
1566 d9bce9d9 j_mayer
    T0 = (uint64_t)T0 >> PARAM1;
1567 d9bce9d9 j_mayer
    RETURN();
1568 d9bce9d9 j_mayer
}
1569 d9bce9d9 j_mayer
#endif
1570 d9bce9d9 j_mayer
1571 76a66253 j_mayer
void OPPROTO op_srli_T1 (void)
1572 76a66253 j_mayer
{
1573 d9bce9d9 j_mayer
    T1 = (uint32_t)T1 >> PARAM1;
1574 76a66253 j_mayer
    RETURN();
1575 76a66253 j_mayer
}
1576 76a66253 j_mayer
1577 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
1578 d9bce9d9 j_mayer
void OPPROTO op_srli_T1_64 (void)
1579 d9bce9d9 j_mayer
{
1580 d9bce9d9 j_mayer
    T1 = (uint64_t)T1 >> PARAM1;
1581 d9bce9d9 j_mayer
    RETURN();
1582 d9bce9d9 j_mayer
}
1583 d9bce9d9 j_mayer
#endif
1584 d9bce9d9 j_mayer
1585 79aceca5 bellard
/***                       Floating-Point arithmetic                       ***/
1586 9a64fbe4 bellard
/* fadd - fadd. */
1587 9a64fbe4 bellard
PPC_OP(fadd)
1588 79aceca5 bellard
{
1589 76a66253 j_mayer
    FT0 = float64_add(FT0, FT1, &env->fp_status);
1590 79aceca5 bellard
    RETURN();
1591 79aceca5 bellard
}
1592 79aceca5 bellard
1593 9a64fbe4 bellard
/* fsub - fsub. */
1594 9a64fbe4 bellard
PPC_OP(fsub)
1595 79aceca5 bellard
{
1596 76a66253 j_mayer
    FT0 = float64_sub(FT0, FT1, &env->fp_status);
1597 79aceca5 bellard
    RETURN();
1598 79aceca5 bellard
}
1599 79aceca5 bellard
1600 9a64fbe4 bellard
/* fmul - fmul. */
1601 9a64fbe4 bellard
PPC_OP(fmul)
1602 79aceca5 bellard
{
1603 76a66253 j_mayer
    FT0 = float64_mul(FT0, FT1, &env->fp_status);
1604 79aceca5 bellard
    RETURN();
1605 79aceca5 bellard
}
1606 79aceca5 bellard
1607 9a64fbe4 bellard
/* fdiv - fdiv. */
1608 9a64fbe4 bellard
PPC_OP(fdiv)
1609 79aceca5 bellard
{
1610 fdabc366 bellard
    FT0 = float64_div(FT0, FT1, &env->fp_status);
1611 79aceca5 bellard
    RETURN();
1612 79aceca5 bellard
}
1613 28b6751f bellard
1614 9a64fbe4 bellard
/* fsqrt - fsqrt. */
1615 9a64fbe4 bellard
PPC_OP(fsqrt)
1616 28b6751f bellard
{
1617 9a64fbe4 bellard
    do_fsqrt();
1618 9a64fbe4 bellard
    RETURN();
1619 28b6751f bellard
}
1620 28b6751f bellard
1621 9a64fbe4 bellard
/* fres - fres. */
1622 9a64fbe4 bellard
PPC_OP(fres)
1623 28b6751f bellard
{
1624 9a64fbe4 bellard
    do_fres();
1625 9a64fbe4 bellard
    RETURN();
1626 28b6751f bellard
}
1627 28b6751f bellard
1628 9a64fbe4 bellard
/* frsqrte  - frsqrte. */
1629 9a64fbe4 bellard
PPC_OP(frsqrte)
1630 28b6751f bellard
{
1631 4ecc3190 bellard
    do_frsqrte();
1632 9a64fbe4 bellard
    RETURN();
1633 28b6751f bellard
}
1634 28b6751f bellard
1635 9a64fbe4 bellard
/* fsel - fsel. */
1636 9a64fbe4 bellard
PPC_OP(fsel)
1637 28b6751f bellard
{
1638 9a64fbe4 bellard
    do_fsel();
1639 9a64fbe4 bellard
    RETURN();
1640 28b6751f bellard
}
1641 28b6751f bellard
1642 9a64fbe4 bellard
/***                     Floating-Point multiply-and-add                   ***/
1643 9a64fbe4 bellard
/* fmadd - fmadd. */
1644 9a64fbe4 bellard
PPC_OP(fmadd)
1645 28b6751f bellard
{
1646 76a66253 j_mayer
    FT0 = float64_mul(FT0, FT1, &env->fp_status);
1647 76a66253 j_mayer
    FT0 = float64_add(FT0, FT2, &env->fp_status);
1648 9a64fbe4 bellard
    RETURN();
1649 28b6751f bellard
}
1650 28b6751f bellard
1651 9a64fbe4 bellard
/* fmsub - fmsub. */
1652 9a64fbe4 bellard
PPC_OP(fmsub)
1653 28b6751f bellard
{
1654 76a66253 j_mayer
    FT0 = float64_mul(FT0, FT1, &env->fp_status);
1655 76a66253 j_mayer
    FT0 = float64_sub(FT0, FT2, &env->fp_status);
1656 9a64fbe4 bellard
    RETURN();
1657 28b6751f bellard
}
1658 28b6751f bellard
1659 9a64fbe4 bellard
/* fnmadd - fnmadd. - fnmadds - fnmadds. */
1660 9a64fbe4 bellard
PPC_OP(fnmadd)
1661 28b6751f bellard
{
1662 4b3686fa bellard
    do_fnmadd();
1663 9a64fbe4 bellard
    RETURN();
1664 28b6751f bellard
}
1665 28b6751f bellard
1666 9a64fbe4 bellard
/* fnmsub - fnmsub. */
1667 9a64fbe4 bellard
PPC_OP(fnmsub)
1668 28b6751f bellard
{
1669 4b3686fa bellard
    do_fnmsub();
1670 9a64fbe4 bellard
    RETURN();
1671 28b6751f bellard
}
1672 28b6751f bellard
1673 9a64fbe4 bellard
/***                     Floating-Point round & convert                    ***/
1674 9a64fbe4 bellard
/* frsp - frsp. */
1675 9a64fbe4 bellard
PPC_OP(frsp)
1676 28b6751f bellard
{
1677 76a66253 j_mayer
    FT0 = float64_to_float32(FT0, &env->fp_status);
1678 9a64fbe4 bellard
    RETURN();
1679 28b6751f bellard
}
1680 28b6751f bellard
1681 9a64fbe4 bellard
/* fctiw - fctiw. */
1682 9a64fbe4 bellard
PPC_OP(fctiw)
1683 28b6751f bellard
{
1684 9a64fbe4 bellard
    do_fctiw();
1685 9a64fbe4 bellard
    RETURN();
1686 28b6751f bellard
}
1687 28b6751f bellard
1688 9a64fbe4 bellard
/* fctiwz - fctiwz. */
1689 9a64fbe4 bellard
PPC_OP(fctiwz)
1690 28b6751f bellard
{
1691 9a64fbe4 bellard
    do_fctiwz();
1692 9a64fbe4 bellard
    RETURN();
1693 28b6751f bellard
}
1694 28b6751f bellard
1695 9a64fbe4 bellard
/***                         Floating-Point compare                        ***/
1696 9a64fbe4 bellard
/* fcmpu */
1697 9a64fbe4 bellard
PPC_OP(fcmpu)
1698 28b6751f bellard
{
1699 9a64fbe4 bellard
    do_fcmpu();
1700 9a64fbe4 bellard
    RETURN();
1701 28b6751f bellard
}
1702 28b6751f bellard
1703 9a64fbe4 bellard
/* fcmpo */
1704 9a64fbe4 bellard
PPC_OP(fcmpo)
1705 28b6751f bellard
{
1706 9a64fbe4 bellard
    do_fcmpo();
1707 9a64fbe4 bellard
    RETURN();
1708 fb0eaffc bellard
}
1709 fb0eaffc bellard
1710 9a64fbe4 bellard
/***                         Floating-point move                           ***/
1711 9a64fbe4 bellard
/* fabs */
1712 9a64fbe4 bellard
PPC_OP(fabs)
1713 fb0eaffc bellard
{
1714 fdabc366 bellard
    FT0 = float64_abs(FT0);
1715 fb0eaffc bellard
    RETURN();
1716 fb0eaffc bellard
}
1717 fb0eaffc bellard
1718 9a64fbe4 bellard
/* fnabs */
1719 9a64fbe4 bellard
PPC_OP(fnabs)
1720 fb0eaffc bellard
{
1721 fdabc366 bellard
    FT0 = float64_abs(FT0);
1722 fdabc366 bellard
    FT0 = float64_chs(FT0);
1723 fb0eaffc bellard
    RETURN();
1724 fb0eaffc bellard
}
1725 fb0eaffc bellard
1726 9a64fbe4 bellard
/* fneg */
1727 9a64fbe4 bellard
PPC_OP(fneg)
1728 fb0eaffc bellard
{
1729 fdabc366 bellard
    FT0 = float64_chs(FT0);
1730 fb0eaffc bellard
    RETURN();
1731 fb0eaffc bellard
}
1732 fb0eaffc bellard
1733 9a64fbe4 bellard
/* Load and store */
1734 9a64fbe4 bellard
#define MEMSUFFIX _raw
1735 76a66253 j_mayer
#include "op_helper.h"
1736 9a64fbe4 bellard
#include "op_mem.h"
1737 a541f297 bellard
#if !defined(CONFIG_USER_ONLY)
1738 9a64fbe4 bellard
#define MEMSUFFIX _user
1739 76a66253 j_mayer
#include "op_helper.h"
1740 9a64fbe4 bellard
#include "op_mem.h"
1741 9a64fbe4 bellard
#define MEMSUFFIX _kernel
1742 76a66253 j_mayer
#include "op_helper.h"
1743 9a64fbe4 bellard
#include "op_mem.h"
1744 9a64fbe4 bellard
#endif
1745 9a64fbe4 bellard
1746 4b3686fa bellard
/* Special op to check and maybe clear reservation */
1747 d9bce9d9 j_mayer
void OPPROTO op_check_reservation (void)
1748 4b3686fa bellard
{
1749 fdabc366 bellard
    if ((uint32_t)env->reserve == (uint32_t)(T0 & ~0x00000003))
1750 fdabc366 bellard
        env->reserve = -1;
1751 4b3686fa bellard
    RETURN();
1752 4b3686fa bellard
}
1753 4b3686fa bellard
1754 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
1755 d9bce9d9 j_mayer
void OPPROTO op_check_reservation_64 (void)
1756 d9bce9d9 j_mayer
{
1757 d9bce9d9 j_mayer
    if ((uint64_t)env->reserve == (uint64_t)(T0 & ~0x00000003))
1758 d9bce9d9 j_mayer
        env->reserve = -1;
1759 d9bce9d9 j_mayer
    RETURN();
1760 d9bce9d9 j_mayer
}
1761 d9bce9d9 j_mayer
#endif
1762 d9bce9d9 j_mayer
1763 9a64fbe4 bellard
/* Return from interrupt */
1764 76a66253 j_mayer
#if !defined(CONFIG_USER_ONLY)
1765 76a66253 j_mayer
void OPPROTO op_rfi (void)
1766 fb0eaffc bellard
{
1767 fdabc366 bellard
    do_rfi();
1768 fb0eaffc bellard
    RETURN();
1769 fb0eaffc bellard
}
1770 d9bce9d9 j_mayer
1771 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
1772 d9bce9d9 j_mayer
void OPPROTO op_rfi_32 (void)
1773 d9bce9d9 j_mayer
{
1774 d9bce9d9 j_mayer
    do_rfi_32();
1775 d9bce9d9 j_mayer
    RETURN();
1776 d9bce9d9 j_mayer
}
1777 d9bce9d9 j_mayer
#endif
1778 76a66253 j_mayer
#endif
1779 fb0eaffc bellard
1780 9a64fbe4 bellard
/* Trap word */
1781 76a66253 j_mayer
void OPPROTO op_tw (void)
1782 fb0eaffc bellard
{
1783 76a66253 j_mayer
    do_tw(PARAM1);
1784 fb0eaffc bellard
    RETURN();
1785 fb0eaffc bellard
}
1786 fb0eaffc bellard
1787 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
1788 d9bce9d9 j_mayer
void OPPROTO op_td (void)
1789 d9bce9d9 j_mayer
{
1790 d9bce9d9 j_mayer
    do_td(PARAM1);
1791 d9bce9d9 j_mayer
    RETURN();
1792 d9bce9d9 j_mayer
}
1793 d9bce9d9 j_mayer
#endif
1794 d9bce9d9 j_mayer
1795 76a66253 j_mayer
#if !defined(CONFIG_USER_ONLY)
1796 9a64fbe4 bellard
/* tlbia */
1797 9a64fbe4 bellard
PPC_OP(tlbia)
1798 fb0eaffc bellard
{
1799 9a64fbe4 bellard
    do_tlbia();
1800 9a64fbe4 bellard
    RETURN();
1801 9a64fbe4 bellard
}
1802 9a64fbe4 bellard
1803 9a64fbe4 bellard
/* tlbie */
1804 d9bce9d9 j_mayer
void OPPROTO op_tlbie (void)
1805 9a64fbe4 bellard
{
1806 9a64fbe4 bellard
    do_tlbie();
1807 fb0eaffc bellard
    RETURN();
1808 28b6751f bellard
}
1809 d9bce9d9 j_mayer
1810 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
1811 d9bce9d9 j_mayer
void OPPROTO op_tlbie_64 (void)
1812 d9bce9d9 j_mayer
{
1813 d9bce9d9 j_mayer
    do_tlbie_64();
1814 d9bce9d9 j_mayer
    RETURN();
1815 d9bce9d9 j_mayer
}
1816 d9bce9d9 j_mayer
#endif
1817 d9bce9d9 j_mayer
1818 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
1819 d9bce9d9 j_mayer
void OPPROTO op_slbia (void)
1820 d9bce9d9 j_mayer
{
1821 d9bce9d9 j_mayer
    do_slbia();
1822 d9bce9d9 j_mayer
    RETURN();
1823 d9bce9d9 j_mayer
}
1824 d9bce9d9 j_mayer
1825 d9bce9d9 j_mayer
void OPPROTO op_slbie (void)
1826 d9bce9d9 j_mayer
{
1827 d9bce9d9 j_mayer
    do_slbie();
1828 d9bce9d9 j_mayer
    RETURN();
1829 d9bce9d9 j_mayer
}
1830 d9bce9d9 j_mayer
#endif
1831 76a66253 j_mayer
#endif
1832 3fc6c082 bellard
1833 76a66253 j_mayer
/* PowerPC 602/603/755 software TLB load instructions */
1834 76a66253 j_mayer
#if !defined(CONFIG_USER_ONLY)
1835 76a66253 j_mayer
void OPPROTO op_6xx_tlbld (void)
1836 76a66253 j_mayer
{
1837 76a66253 j_mayer
    do_load_6xx_tlb(0);
1838 76a66253 j_mayer
    RETURN();
1839 76a66253 j_mayer
}
1840 76a66253 j_mayer
1841 76a66253 j_mayer
void OPPROTO op_6xx_tlbli (void)
1842 76a66253 j_mayer
{
1843 76a66253 j_mayer
    do_load_6xx_tlb(1);
1844 76a66253 j_mayer
    RETURN();
1845 76a66253 j_mayer
}
1846 76a66253 j_mayer
#endif
1847 76a66253 j_mayer
1848 76a66253 j_mayer
/* 601 specific */
1849 76a66253 j_mayer
void OPPROTO op_load_601_rtcl (void)
1850 76a66253 j_mayer
{
1851 76a66253 j_mayer
    T0 = cpu_ppc601_load_rtcl(env);
1852 76a66253 j_mayer
    RETURN();
1853 76a66253 j_mayer
}
1854 76a66253 j_mayer
1855 76a66253 j_mayer
void OPPROTO op_load_601_rtcu (void)
1856 76a66253 j_mayer
{
1857 76a66253 j_mayer
    T0 = cpu_ppc601_load_rtcu(env);
1858 76a66253 j_mayer
    RETURN();
1859 76a66253 j_mayer
}
1860 76a66253 j_mayer
1861 76a66253 j_mayer
#if !defined(CONFIG_USER_ONLY)
1862 76a66253 j_mayer
void OPPROTO op_store_601_rtcl (void)
1863 76a66253 j_mayer
{
1864 76a66253 j_mayer
    cpu_ppc601_store_rtcl(env, T0);
1865 76a66253 j_mayer
    RETURN();
1866 76a66253 j_mayer
}
1867 76a66253 j_mayer
1868 76a66253 j_mayer
void OPPROTO op_store_601_rtcu (void)
1869 76a66253 j_mayer
{
1870 76a66253 j_mayer
    cpu_ppc601_store_rtcu(env, T0);
1871 76a66253 j_mayer
    RETURN();
1872 76a66253 j_mayer
}
1873 76a66253 j_mayer
1874 76a66253 j_mayer
void OPPROTO op_load_601_bat (void)
1875 76a66253 j_mayer
{
1876 76a66253 j_mayer
    T0 = env->IBAT[PARAM1][PARAM2];
1877 76a66253 j_mayer
    RETURN();
1878 76a66253 j_mayer
}
1879 76a66253 j_mayer
#endif /* !defined(CONFIG_USER_ONLY) */
1880 76a66253 j_mayer
1881 76a66253 j_mayer
/* 601 unified BATs store.
1882 76a66253 j_mayer
 * To avoid using specific MMU code for 601, we store BATs in
1883 76a66253 j_mayer
 * IBAT and DBAT simultaneously, then emulate unified BATs.
1884 76a66253 j_mayer
 */
1885 76a66253 j_mayer
#if !defined(CONFIG_USER_ONLY)
1886 76a66253 j_mayer
void OPPROTO op_store_601_batl (void)
1887 76a66253 j_mayer
{
1888 76a66253 j_mayer
    int nr = PARAM1;
1889 76a66253 j_mayer
1890 76a66253 j_mayer
    env->IBAT[1][nr] = T0;
1891 76a66253 j_mayer
    env->DBAT[1][nr] = T0;
1892 76a66253 j_mayer
    RETURN();
1893 76a66253 j_mayer
}
1894 76a66253 j_mayer
1895 76a66253 j_mayer
void OPPROTO op_store_601_batu (void)
1896 76a66253 j_mayer
{
1897 76a66253 j_mayer
    do_store_601_batu(PARAM1);
1898 76a66253 j_mayer
    RETURN();
1899 76a66253 j_mayer
}
1900 76a66253 j_mayer
#endif /* !defined(CONFIG_USER_ONLY) */
1901 76a66253 j_mayer
1902 76a66253 j_mayer
/* PowerPC 601 specific instructions (POWER bridge) */
1903 76a66253 j_mayer
/* XXX: those micro-ops need tests ! */
1904 76a66253 j_mayer
void OPPROTO op_POWER_abs (void)
1905 76a66253 j_mayer
{
1906 76a66253 j_mayer
    if (T0 == INT32_MIN)
1907 76a66253 j_mayer
        T0 = INT32_MAX;
1908 76a66253 j_mayer
    else if (T0 < 0)
1909 76a66253 j_mayer
        T0 = -T0;
1910 76a66253 j_mayer
    RETURN();
1911 76a66253 j_mayer
}
1912 76a66253 j_mayer
1913 76a66253 j_mayer
void OPPROTO op_POWER_abso (void)
1914 76a66253 j_mayer
{
1915 76a66253 j_mayer
    do_POWER_abso();
1916 76a66253 j_mayer
    RETURN();
1917 76a66253 j_mayer
}
1918 76a66253 j_mayer
1919 76a66253 j_mayer
void OPPROTO op_POWER_clcs (void)
1920 76a66253 j_mayer
{
1921 76a66253 j_mayer
    do_POWER_clcs();
1922 76a66253 j_mayer
    RETURN();
1923 76a66253 j_mayer
}
1924 76a66253 j_mayer
1925 76a66253 j_mayer
void OPPROTO op_POWER_div (void)
1926 76a66253 j_mayer
{
1927 76a66253 j_mayer
    do_POWER_div();
1928 76a66253 j_mayer
    RETURN();
1929 76a66253 j_mayer
}
1930 76a66253 j_mayer
1931 76a66253 j_mayer
void OPPROTO op_POWER_divo (void)
1932 76a66253 j_mayer
{
1933 76a66253 j_mayer
    do_POWER_divo();
1934 76a66253 j_mayer
    RETURN();
1935 76a66253 j_mayer
}
1936 76a66253 j_mayer
1937 76a66253 j_mayer
void OPPROTO op_POWER_divs (void)
1938 76a66253 j_mayer
{
1939 76a66253 j_mayer
    do_POWER_divs();
1940 76a66253 j_mayer
    RETURN();
1941 76a66253 j_mayer
}
1942 76a66253 j_mayer
1943 76a66253 j_mayer
void OPPROTO op_POWER_divso (void)
1944 76a66253 j_mayer
{
1945 76a66253 j_mayer
    do_POWER_divso();
1946 76a66253 j_mayer
    RETURN();
1947 76a66253 j_mayer
}
1948 76a66253 j_mayer
1949 76a66253 j_mayer
void OPPROTO op_POWER_doz (void)
1950 76a66253 j_mayer
{
1951 d9bce9d9 j_mayer
    if ((int32_t)T1 > (int32_t)T0)
1952 76a66253 j_mayer
        T0 = T1 - T0;
1953 76a66253 j_mayer
    else
1954 76a66253 j_mayer
        T0 = 0;
1955 76a66253 j_mayer
    RETURN();
1956 76a66253 j_mayer
}
1957 76a66253 j_mayer
1958 76a66253 j_mayer
void OPPROTO op_POWER_dozo (void)
1959 76a66253 j_mayer
{
1960 76a66253 j_mayer
    do_POWER_dozo();
1961 76a66253 j_mayer
    RETURN();
1962 76a66253 j_mayer
}
1963 76a66253 j_mayer
1964 76a66253 j_mayer
void OPPROTO op_load_xer_cmp (void)
1965 76a66253 j_mayer
{
1966 76a66253 j_mayer
    T2 = xer_cmp;
1967 76a66253 j_mayer
    RETURN();
1968 76a66253 j_mayer
}
1969 76a66253 j_mayer
1970 76a66253 j_mayer
void OPPROTO op_POWER_maskg (void)
1971 76a66253 j_mayer
{
1972 76a66253 j_mayer
    do_POWER_maskg();
1973 76a66253 j_mayer
    RETURN();
1974 76a66253 j_mayer
}
1975 76a66253 j_mayer
1976 76a66253 j_mayer
void OPPROTO op_POWER_maskir (void)
1977 76a66253 j_mayer
{
1978 76a66253 j_mayer
    T0 = (T0 & ~T2) | (T1 & T2);
1979 76a66253 j_mayer
    RETURN();
1980 76a66253 j_mayer
}
1981 76a66253 j_mayer
1982 76a66253 j_mayer
void OPPROTO op_POWER_mul (void)
1983 76a66253 j_mayer
{
1984 76a66253 j_mayer
    uint64_t tmp;
1985 76a66253 j_mayer
1986 76a66253 j_mayer
    tmp = (uint64_t)T0 * (uint64_t)T1;
1987 76a66253 j_mayer
    env->spr[SPR_MQ] = tmp >> 32;
1988 76a66253 j_mayer
    T0 = tmp;
1989 76a66253 j_mayer
    RETURN();
1990 76a66253 j_mayer
}
1991 76a66253 j_mayer
1992 76a66253 j_mayer
void OPPROTO op_POWER_mulo (void)
1993 76a66253 j_mayer
{
1994 76a66253 j_mayer
    do_POWER_mulo();
1995 76a66253 j_mayer
    RETURN();
1996 76a66253 j_mayer
}
1997 76a66253 j_mayer
1998 76a66253 j_mayer
void OPPROTO op_POWER_nabs (void)
1999 76a66253 j_mayer
{
2000 76a66253 j_mayer
    if (T0 > 0)
2001 76a66253 j_mayer
        T0 = -T0;
2002 76a66253 j_mayer
    RETURN();
2003 76a66253 j_mayer
}
2004 76a66253 j_mayer
2005 76a66253 j_mayer
void OPPROTO op_POWER_nabso (void)
2006 76a66253 j_mayer
{
2007 76a66253 j_mayer
    /* nabs never overflows */
2008 76a66253 j_mayer
    if (T0 > 0)
2009 76a66253 j_mayer
        T0 = -T0;
2010 76a66253 j_mayer
    xer_ov = 0;
2011 76a66253 j_mayer
    RETURN();
2012 76a66253 j_mayer
}
2013 76a66253 j_mayer
2014 76a66253 j_mayer
/* XXX: factorise POWER rotates... */
2015 76a66253 j_mayer
void OPPROTO op_POWER_rlmi (void)
2016 76a66253 j_mayer
{
2017 76a66253 j_mayer
    T0 = rotl32(T0, T2) & PARAM1;
2018 76a66253 j_mayer
    T0 |= T1 & PARAM2;
2019 76a66253 j_mayer
    RETURN();
2020 76a66253 j_mayer
}
2021 76a66253 j_mayer
2022 76a66253 j_mayer
void OPPROTO op_POWER_rrib (void)
2023 76a66253 j_mayer
{
2024 76a66253 j_mayer
    T2 &= 0x1FUL;
2025 76a66253 j_mayer
    T0 = rotl32(T0 & INT32_MIN, T2);
2026 76a66253 j_mayer
    T0 |= T1 & ~rotl32(INT32_MIN, T2);
2027 76a66253 j_mayer
    RETURN();
2028 76a66253 j_mayer
}
2029 76a66253 j_mayer
2030 76a66253 j_mayer
void OPPROTO op_POWER_sle (void)
2031 76a66253 j_mayer
{
2032 76a66253 j_mayer
    T1 &= 0x1FUL;
2033 76a66253 j_mayer
    env->spr[SPR_MQ] = rotl32(T0, T1);
2034 76a66253 j_mayer
    T0 = T0 << T1;
2035 76a66253 j_mayer
    RETURN();
2036 76a66253 j_mayer
}
2037 76a66253 j_mayer
2038 76a66253 j_mayer
void OPPROTO op_POWER_sleq (void)
2039 76a66253 j_mayer
{
2040 76a66253 j_mayer
    uint32_t tmp = env->spr[SPR_MQ];
2041 76a66253 j_mayer
2042 76a66253 j_mayer
    T1 &= 0x1FUL;
2043 76a66253 j_mayer
    env->spr[SPR_MQ] = rotl32(T0, T1);
2044 76a66253 j_mayer
    T0 = T0 << T1;
2045 76a66253 j_mayer
    T0 |= tmp >> (32 - T1);
2046 76a66253 j_mayer
    RETURN();
2047 76a66253 j_mayer
}
2048 76a66253 j_mayer
2049 76a66253 j_mayer
void OPPROTO op_POWER_sllq (void)
2050 76a66253 j_mayer
{
2051 76a66253 j_mayer
    uint32_t msk = -1;
2052 76a66253 j_mayer
2053 76a66253 j_mayer
    msk = msk << (T1 & 0x1FUL);
2054 76a66253 j_mayer
    if (T1 & 0x20UL)
2055 76a66253 j_mayer
        msk = ~msk;
2056 76a66253 j_mayer
    T1 &= 0x1FUL;
2057 76a66253 j_mayer
    T0 = (T0 << T1) & msk;
2058 76a66253 j_mayer
    T0 |= env->spr[SPR_MQ] & ~msk;
2059 76a66253 j_mayer
    RETURN();
2060 76a66253 j_mayer
}
2061 76a66253 j_mayer
2062 76a66253 j_mayer
void OPPROTO op_POWER_slq (void)
2063 76a66253 j_mayer
{
2064 76a66253 j_mayer
    uint32_t msk = -1, tmp;
2065 76a66253 j_mayer
2066 76a66253 j_mayer
    msk = msk << (T1 & 0x1FUL);
2067 76a66253 j_mayer
    if (T1 & 0x20UL)
2068 76a66253 j_mayer
        msk = ~msk;
2069 76a66253 j_mayer
    T1 &= 0x1FUL;
2070 76a66253 j_mayer
    tmp = rotl32(T0, T1);
2071 76a66253 j_mayer
    T0 = tmp & msk;
2072 76a66253 j_mayer
    env->spr[SPR_MQ] = tmp;
2073 76a66253 j_mayer
    RETURN();
2074 76a66253 j_mayer
}
2075 76a66253 j_mayer
2076 76a66253 j_mayer
void OPPROTO op_POWER_sraq (void)
2077 76a66253 j_mayer
{
2078 76a66253 j_mayer
    env->spr[SPR_MQ] = rotl32(T0, 32 - (T1 & 0x1FUL));
2079 76a66253 j_mayer
    if (T1 & 0x20UL)
2080 76a66253 j_mayer
        T0 = -1L;
2081 76a66253 j_mayer
    else
2082 d9bce9d9 j_mayer
        T0 = (int32_t)T0 >> T1;
2083 76a66253 j_mayer
    RETURN();
2084 76a66253 j_mayer
}
2085 76a66253 j_mayer
2086 76a66253 j_mayer
void OPPROTO op_POWER_sre (void)
2087 76a66253 j_mayer
{
2088 76a66253 j_mayer
    T1 &= 0x1FUL;
2089 76a66253 j_mayer
    env->spr[SPR_MQ] = rotl32(T0, 32 - T1);
2090 d9bce9d9 j_mayer
    T0 = (int32_t)T0 >> T1;
2091 76a66253 j_mayer
    RETURN();
2092 76a66253 j_mayer
}
2093 76a66253 j_mayer
2094 76a66253 j_mayer
void OPPROTO op_POWER_srea (void)
2095 76a66253 j_mayer
{
2096 76a66253 j_mayer
    T1 &= 0x1FUL;
2097 76a66253 j_mayer
    env->spr[SPR_MQ] = T0 >> T1;
2098 d9bce9d9 j_mayer
    T0 = (int32_t)T0 >> T1;
2099 76a66253 j_mayer
    RETURN();
2100 76a66253 j_mayer
}
2101 76a66253 j_mayer
2102 76a66253 j_mayer
void OPPROTO op_POWER_sreq (void)
2103 76a66253 j_mayer
{
2104 76a66253 j_mayer
    uint32_t tmp;
2105 76a66253 j_mayer
    int32_t msk;
2106 76a66253 j_mayer
2107 76a66253 j_mayer
    T1 &= 0x1FUL;
2108 76a66253 j_mayer
    msk = INT32_MIN >> T1;
2109 76a66253 j_mayer
    tmp = env->spr[SPR_MQ];
2110 76a66253 j_mayer
    env->spr[SPR_MQ] = rotl32(T0, 32 - T1);
2111 76a66253 j_mayer
    T0 = T0 >> T1;
2112 76a66253 j_mayer
    T0 |= tmp & msk;
2113 76a66253 j_mayer
    RETURN();
2114 76a66253 j_mayer
}
2115 76a66253 j_mayer
2116 76a66253 j_mayer
void OPPROTO op_POWER_srlq (void)
2117 76a66253 j_mayer
{
2118 76a66253 j_mayer
    uint32_t tmp;
2119 76a66253 j_mayer
    int32_t msk;
2120 76a66253 j_mayer
2121 76a66253 j_mayer
    msk = INT32_MIN >> (T1 & 0x1FUL);
2122 76a66253 j_mayer
    if (T1 & 0x20UL)
2123 76a66253 j_mayer
        msk = ~msk;
2124 76a66253 j_mayer
    T1 &= 0x1FUL;
2125 76a66253 j_mayer
    tmp = env->spr[SPR_MQ];
2126 76a66253 j_mayer
    env->spr[SPR_MQ] = rotl32(T0, 32 - T1);
2127 76a66253 j_mayer
    T0 = T0 >> T1;
2128 76a66253 j_mayer
    T0 &= msk;
2129 76a66253 j_mayer
    T0 |= tmp & ~msk;
2130 76a66253 j_mayer
    RETURN();
2131 76a66253 j_mayer
}
2132 76a66253 j_mayer
2133 76a66253 j_mayer
void OPPROTO op_POWER_srq (void)
2134 76a66253 j_mayer
{
2135 76a66253 j_mayer
    T1 &= 0x1FUL;
2136 76a66253 j_mayer
    env->spr[SPR_MQ] = rotl32(T0, 32 - T1);
2137 76a66253 j_mayer
    T0 = T0 >> T1;
2138 76a66253 j_mayer
    RETURN();
2139 76a66253 j_mayer
}
2140 76a66253 j_mayer
2141 76a66253 j_mayer
/* POWER instructions not implemented in PowerPC 601 */
2142 76a66253 j_mayer
#if !defined(CONFIG_USER_ONLY)
2143 76a66253 j_mayer
void OPPROTO op_POWER_mfsri (void)
2144 76a66253 j_mayer
{
2145 76a66253 j_mayer
    T1 = T0 >> 28;
2146 76a66253 j_mayer
    T0 = env->sr[T1];
2147 76a66253 j_mayer
    RETURN();
2148 76a66253 j_mayer
}
2149 76a66253 j_mayer
2150 76a66253 j_mayer
void OPPROTO op_POWER_rac (void)
2151 76a66253 j_mayer
{
2152 76a66253 j_mayer
    do_POWER_rac();
2153 76a66253 j_mayer
    RETURN();
2154 76a66253 j_mayer
}
2155 76a66253 j_mayer
2156 76a66253 j_mayer
void OPPROTO op_POWER_rfsvc (void)
2157 76a66253 j_mayer
{
2158 76a66253 j_mayer
    do_POWER_rfsvc();
2159 76a66253 j_mayer
    RETURN();
2160 76a66253 j_mayer
}
2161 76a66253 j_mayer
#endif
2162 76a66253 j_mayer
2163 76a66253 j_mayer
/* PowerPC 602 specific instruction */
2164 76a66253 j_mayer
#if !defined(CONFIG_USER_ONLY)
2165 76a66253 j_mayer
void OPPROTO op_602_mfrom (void)
2166 76a66253 j_mayer
{
2167 76a66253 j_mayer
    do_op_602_mfrom();
2168 76a66253 j_mayer
    RETURN();
2169 76a66253 j_mayer
}
2170 76a66253 j_mayer
#endif
2171 76a66253 j_mayer
2172 76a66253 j_mayer
/* PowerPC 4xx specific micro-ops */
2173 76a66253 j_mayer
void OPPROTO op_405_add_T0_T2 (void)
2174 76a66253 j_mayer
{
2175 76a66253 j_mayer
    T0 = (int32_t)T0 + (int32_t)T2;
2176 76a66253 j_mayer
    RETURN();
2177 76a66253 j_mayer
}
2178 76a66253 j_mayer
2179 76a66253 j_mayer
void OPPROTO op_405_mulchw (void)
2180 76a66253 j_mayer
{
2181 76a66253 j_mayer
    T0 = ((int16_t)T0) * ((int16_t)(T1 >> 16));
2182 76a66253 j_mayer
    RETURN();
2183 76a66253 j_mayer
}
2184 76a66253 j_mayer
2185 76a66253 j_mayer
void OPPROTO op_405_mulchwu (void)
2186 76a66253 j_mayer
{
2187 76a66253 j_mayer
    T0 = ((uint16_t)T0) * ((uint16_t)(T1 >> 16));
2188 76a66253 j_mayer
    RETURN();
2189 76a66253 j_mayer
}
2190 76a66253 j_mayer
2191 76a66253 j_mayer
void OPPROTO op_405_mulhhw (void)
2192 76a66253 j_mayer
{
2193 76a66253 j_mayer
    T0 = ((int16_t)(T0 >> 16)) * ((int16_t)(T1 >> 16));
2194 76a66253 j_mayer
    RETURN();
2195 76a66253 j_mayer
}
2196 76a66253 j_mayer
2197 76a66253 j_mayer
void OPPROTO op_405_mulhhwu (void)
2198 76a66253 j_mayer
{
2199 76a66253 j_mayer
    T0 = ((uint16_t)(T0 >> 16)) * ((uint16_t)(T1 >> 16));
2200 76a66253 j_mayer
    RETURN();
2201 76a66253 j_mayer
}
2202 76a66253 j_mayer
2203 76a66253 j_mayer
void OPPROTO op_405_mullhw (void)
2204 76a66253 j_mayer
{
2205 76a66253 j_mayer
    T0 = ((int16_t)T0) * ((int16_t)T1);
2206 76a66253 j_mayer
    RETURN();
2207 76a66253 j_mayer
}
2208 76a66253 j_mayer
2209 76a66253 j_mayer
void OPPROTO op_405_mullhwu (void)
2210 76a66253 j_mayer
{
2211 76a66253 j_mayer
    T0 = ((uint16_t)T0) * ((uint16_t)T1);
2212 76a66253 j_mayer
    RETURN();
2213 76a66253 j_mayer
}
2214 76a66253 j_mayer
2215 76a66253 j_mayer
void OPPROTO op_405_check_ov (void)
2216 76a66253 j_mayer
{
2217 76a66253 j_mayer
    do_405_check_ov();
2218 76a66253 j_mayer
    RETURN();
2219 76a66253 j_mayer
}
2220 76a66253 j_mayer
2221 76a66253 j_mayer
void OPPROTO op_405_check_sat (void)
2222 76a66253 j_mayer
{
2223 76a66253 j_mayer
    do_405_check_sat();
2224 76a66253 j_mayer
    RETURN();
2225 76a66253 j_mayer
}
2226 76a66253 j_mayer
2227 76a66253 j_mayer
void OPPROTO op_405_check_ovu (void)
2228 76a66253 j_mayer
{
2229 76a66253 j_mayer
    if (likely(T0 >= T2)) {
2230 76a66253 j_mayer
        xer_ov = 0;
2231 76a66253 j_mayer
    } else {
2232 76a66253 j_mayer
        xer_ov = 1;
2233 76a66253 j_mayer
        xer_so = 1;
2234 76a66253 j_mayer
    }
2235 76a66253 j_mayer
    RETURN();
2236 76a66253 j_mayer
}
2237 76a66253 j_mayer
2238 76a66253 j_mayer
void OPPROTO op_405_check_satu (void)
2239 76a66253 j_mayer
{
2240 76a66253 j_mayer
    if (unlikely(T0 < T2)) {
2241 76a66253 j_mayer
        /* Saturate result */
2242 76a66253 j_mayer
        T0 = -1;
2243 76a66253 j_mayer
    }
2244 76a66253 j_mayer
    RETURN();
2245 76a66253 j_mayer
}
2246 76a66253 j_mayer
2247 76a66253 j_mayer
#if !defined(CONFIG_USER_ONLY)
2248 76a66253 j_mayer
void OPPROTO op_4xx_load_dcr (void)
2249 76a66253 j_mayer
{
2250 76a66253 j_mayer
    do_4xx_load_dcr(PARAM1);
2251 76a66253 j_mayer
    RETURN();
2252 76a66253 j_mayer
}
2253 76a66253 j_mayer
2254 76a66253 j_mayer
void OPPROTO op_4xx_store_dcr (void)
2255 76a66253 j_mayer
{
2256 76a66253 j_mayer
    do_4xx_store_dcr(PARAM1);
2257 76a66253 j_mayer
    RETURN();
2258 76a66253 j_mayer
}
2259 76a66253 j_mayer
2260 76a66253 j_mayer
/* Return from critical interrupt :
2261 76a66253 j_mayer
 * same as rfi, except nip & MSR are loaded from SRR2/3 instead of SRR0/1
2262 76a66253 j_mayer
 */
2263 76a66253 j_mayer
void OPPROTO op_4xx_rfci (void)
2264 76a66253 j_mayer
{
2265 76a66253 j_mayer
    do_4xx_rfci();
2266 76a66253 j_mayer
    RETURN();
2267 76a66253 j_mayer
}
2268 76a66253 j_mayer
2269 76a66253 j_mayer
void OPPROTO op_4xx_wrte (void)
2270 76a66253 j_mayer
{
2271 76a66253 j_mayer
    msr_ee = T0 >> 16;
2272 76a66253 j_mayer
    RETURN();
2273 76a66253 j_mayer
}
2274 76a66253 j_mayer
2275 76a66253 j_mayer
void OPPROTO op_4xx_tlbre_lo (void)
2276 76a66253 j_mayer
{
2277 76a66253 j_mayer
    do_4xx_tlbre_lo();
2278 76a66253 j_mayer
    RETURN();
2279 76a66253 j_mayer
}
2280 76a66253 j_mayer
2281 76a66253 j_mayer
void OPPROTO op_4xx_tlbre_hi (void)
2282 76a66253 j_mayer
{
2283 76a66253 j_mayer
    do_4xx_tlbre_hi();
2284 76a66253 j_mayer
    RETURN();
2285 76a66253 j_mayer
}
2286 76a66253 j_mayer
2287 76a66253 j_mayer
void OPPROTO op_4xx_tlbsx (void)
2288 76a66253 j_mayer
{
2289 76a66253 j_mayer
    do_4xx_tlbsx();
2290 76a66253 j_mayer
    RETURN();
2291 76a66253 j_mayer
}
2292 76a66253 j_mayer
2293 76a66253 j_mayer
void OPPROTO op_4xx_tlbsx_ (void)
2294 76a66253 j_mayer
{
2295 76a66253 j_mayer
    do_4xx_tlbsx_();
2296 76a66253 j_mayer
    RETURN();
2297 76a66253 j_mayer
}
2298 76a66253 j_mayer
2299 76a66253 j_mayer
void OPPROTO op_4xx_tlbwe_lo (void)
2300 76a66253 j_mayer
{
2301 76a66253 j_mayer
    do_4xx_tlbwe_lo();
2302 76a66253 j_mayer
    RETURN();
2303 76a66253 j_mayer
}
2304 76a66253 j_mayer
2305 76a66253 j_mayer
void OPPROTO op_4xx_tlbwe_hi (void)
2306 76a66253 j_mayer
{
2307 76a66253 j_mayer
    do_4xx_tlbwe_hi();
2308 76a66253 j_mayer
    RETURN();
2309 76a66253 j_mayer
}
2310 76a66253 j_mayer
#endif
2311 76a66253 j_mayer
2312 76a66253 j_mayer
/* SPR micro-ops */
2313 76a66253 j_mayer
/* 440 specific */
2314 76a66253 j_mayer
void OPPROTO op_440_dlmzb (void)
2315 76a66253 j_mayer
{
2316 76a66253 j_mayer
    do_440_dlmzb();
2317 76a66253 j_mayer
    RETURN();
2318 76a66253 j_mayer
}
2319 76a66253 j_mayer
2320 76a66253 j_mayer
void OPPROTO op_440_dlmzb_update_Rc (void)
2321 76a66253 j_mayer
{
2322 76a66253 j_mayer
    if (T0 == 8)
2323 76a66253 j_mayer
        T0 = 0x2;
2324 76a66253 j_mayer
    else if (T0 < 4)
2325 76a66253 j_mayer
        T0 = 0x4;
2326 76a66253 j_mayer
    else
2327 76a66253 j_mayer
        T0 = 0x8;
2328 76a66253 j_mayer
    RETURN();
2329 76a66253 j_mayer
}
2330 76a66253 j_mayer
2331 76a66253 j_mayer
#if !defined(CONFIG_USER_ONLY)
2332 76a66253 j_mayer
void OPPROTO op_store_pir (void)
2333 3fc6c082 bellard
{
2334 3fc6c082 bellard
    env->spr[SPR_PIR] = T0 & 0x0000000FUL;
2335 3fc6c082 bellard
    RETURN();
2336 3fc6c082 bellard
}
2337 76a66253 j_mayer
2338 76a66253 j_mayer
void OPPROTO op_load_403_pb (void)
2339 76a66253 j_mayer
{
2340 76a66253 j_mayer
    do_load_403_pb(PARAM1);
2341 76a66253 j_mayer
    RETURN();
2342 76a66253 j_mayer
}
2343 76a66253 j_mayer
2344 76a66253 j_mayer
void OPPROTO op_store_403_pb (void)
2345 76a66253 j_mayer
{
2346 76a66253 j_mayer
    do_store_403_pb(PARAM1);
2347 76a66253 j_mayer
    RETURN();
2348 76a66253 j_mayer
}
2349 76a66253 j_mayer
2350 76a66253 j_mayer
void OPPROTO op_load_40x_pit (void)
2351 76a66253 j_mayer
{
2352 76a66253 j_mayer
    T0 = load_40x_pit(env);
2353 76a66253 j_mayer
    RETURN();
2354 76a66253 j_mayer
}
2355 76a66253 j_mayer
2356 76a66253 j_mayer
void OPPROTO op_store_40x_pit (void)
2357 76a66253 j_mayer
{
2358 76a66253 j_mayer
    store_40x_pit(env, T0);
2359 76a66253 j_mayer
    RETURN();
2360 76a66253 j_mayer
}
2361 76a66253 j_mayer
2362 76a66253 j_mayer
void OPPROTO op_store_booke_tcr (void)
2363 76a66253 j_mayer
{
2364 76a66253 j_mayer
    store_booke_tcr(env, T0);
2365 76a66253 j_mayer
    RETURN();
2366 76a66253 j_mayer
}
2367 76a66253 j_mayer
2368 76a66253 j_mayer
void OPPROTO op_store_booke_tsr (void)
2369 76a66253 j_mayer
{
2370 76a66253 j_mayer
    store_booke_tsr(env, T0);
2371 76a66253 j_mayer
    RETURN();
2372 76a66253 j_mayer
}
2373 0487d6a8 j_mayer
2374 76a66253 j_mayer
#endif /* !defined(CONFIG_USER_ONLY) */
2375 0487d6a8 j_mayer
2376 0487d6a8 j_mayer
#if defined(TARGET_PPCSPE)
2377 0487d6a8 j_mayer
/* SPE extension */
2378 0487d6a8 j_mayer
void OPPROTO op_splatw_T1_64 (void)
2379 0487d6a8 j_mayer
{
2380 0487d6a8 j_mayer
    T1_64 = (T1_64 << 32) | (T1_64 & 0x00000000FFFFFFFFULL);
2381 0487d6a8 j_mayer
}
2382 0487d6a8 j_mayer
2383 0487d6a8 j_mayer
void OPPROTO op_splatwi_T0_64 (void)
2384 0487d6a8 j_mayer
{
2385 0487d6a8 j_mayer
    uint64_t tmp = PARAM1;
2386 0487d6a8 j_mayer
2387 0487d6a8 j_mayer
    T0_64 = (tmp << 32) | tmp;
2388 0487d6a8 j_mayer
}
2389 0487d6a8 j_mayer
2390 0487d6a8 j_mayer
void OPPROTO op_splatwi_T1_64 (void)
2391 0487d6a8 j_mayer
{
2392 0487d6a8 j_mayer
    uint64_t tmp = PARAM1;
2393 0487d6a8 j_mayer
2394 0487d6a8 j_mayer
    T1_64 = (tmp << 32) | tmp;
2395 0487d6a8 j_mayer
}
2396 0487d6a8 j_mayer
2397 0487d6a8 j_mayer
void OPPROTO op_extsh_T1_64 (void)
2398 0487d6a8 j_mayer
{
2399 0487d6a8 j_mayer
    T1_64 = (int32_t)((int16_t)T1_64);
2400 0487d6a8 j_mayer
    RETURN();
2401 0487d6a8 j_mayer
}
2402 0487d6a8 j_mayer
2403 0487d6a8 j_mayer
void OPPROTO op_sli16_T1_64 (void)
2404 0487d6a8 j_mayer
{
2405 0487d6a8 j_mayer
    T1_64 = T1_64 << 16;
2406 0487d6a8 j_mayer
    RETURN();
2407 0487d6a8 j_mayer
}
2408 0487d6a8 j_mayer
2409 0487d6a8 j_mayer
void OPPROTO op_sli32_T1_64 (void)
2410 0487d6a8 j_mayer
{
2411 0487d6a8 j_mayer
    T1_64 = T1_64 << 32;
2412 0487d6a8 j_mayer
    RETURN();
2413 0487d6a8 j_mayer
}
2414 0487d6a8 j_mayer
2415 0487d6a8 j_mayer
void OPPROTO op_srli32_T1_64 (void)
2416 0487d6a8 j_mayer
{
2417 0487d6a8 j_mayer
    T1_64 = T1_64 >> 32;
2418 0487d6a8 j_mayer
    RETURN();
2419 0487d6a8 j_mayer
}
2420 0487d6a8 j_mayer
2421 0487d6a8 j_mayer
void OPPROTO op_evsel (void)
2422 0487d6a8 j_mayer
{
2423 0487d6a8 j_mayer
    do_evsel();
2424 0487d6a8 j_mayer
    RETURN();
2425 0487d6a8 j_mayer
}
2426 0487d6a8 j_mayer
2427 0487d6a8 j_mayer
void OPPROTO op_evaddw (void)
2428 0487d6a8 j_mayer
{
2429 0487d6a8 j_mayer
    do_evaddw();
2430 0487d6a8 j_mayer
    RETURN();
2431 0487d6a8 j_mayer
}
2432 0487d6a8 j_mayer
2433 0487d6a8 j_mayer
void OPPROTO op_evsubfw (void)
2434 0487d6a8 j_mayer
{
2435 0487d6a8 j_mayer
    do_evsubfw();
2436 0487d6a8 j_mayer
    RETURN();
2437 0487d6a8 j_mayer
}
2438 0487d6a8 j_mayer
2439 0487d6a8 j_mayer
void OPPROTO op_evneg (void)
2440 0487d6a8 j_mayer
{
2441 0487d6a8 j_mayer
    do_evneg();
2442 0487d6a8 j_mayer
    RETURN();
2443 0487d6a8 j_mayer
}
2444 0487d6a8 j_mayer
2445 0487d6a8 j_mayer
void OPPROTO op_evabs (void)
2446 0487d6a8 j_mayer
{
2447 0487d6a8 j_mayer
    do_evabs();
2448 0487d6a8 j_mayer
    RETURN();
2449 0487d6a8 j_mayer
}
2450 0487d6a8 j_mayer
2451 0487d6a8 j_mayer
void OPPROTO op_evextsh (void)
2452 0487d6a8 j_mayer
{
2453 0487d6a8 j_mayer
    T0_64 = ((uint64_t)((int32_t)(int16_t)(T0_64 >> 32)) << 32) |
2454 0487d6a8 j_mayer
        (uint64_t)((int32_t)(int16_t)T0_64);
2455 0487d6a8 j_mayer
    RETURN();
2456 0487d6a8 j_mayer
}
2457 0487d6a8 j_mayer
2458 0487d6a8 j_mayer
void OPPROTO op_evextsb (void)
2459 0487d6a8 j_mayer
{
2460 0487d6a8 j_mayer
    T0_64 = ((uint64_t)((int32_t)(int8_t)(T0_64 >> 32)) << 32) |
2461 0487d6a8 j_mayer
        (uint64_t)((int32_t)(int8_t)T0_64);
2462 0487d6a8 j_mayer
    RETURN();
2463 0487d6a8 j_mayer
}
2464 0487d6a8 j_mayer
2465 0487d6a8 j_mayer
void OPPROTO op_evcntlzw (void)
2466 0487d6a8 j_mayer
{
2467 0487d6a8 j_mayer
    do_evcntlzw();
2468 0487d6a8 j_mayer
    RETURN();
2469 0487d6a8 j_mayer
}
2470 0487d6a8 j_mayer
2471 0487d6a8 j_mayer
void OPPROTO op_evrndw (void)
2472 0487d6a8 j_mayer
{
2473 0487d6a8 j_mayer
    do_evrndw();
2474 0487d6a8 j_mayer
    RETURN();
2475 0487d6a8 j_mayer
}
2476 0487d6a8 j_mayer
2477 0487d6a8 j_mayer
void OPPROTO op_brinc (void)
2478 0487d6a8 j_mayer
{
2479 0487d6a8 j_mayer
    do_brinc();
2480 0487d6a8 j_mayer
    RETURN();
2481 0487d6a8 j_mayer
}
2482 0487d6a8 j_mayer
2483 0487d6a8 j_mayer
void OPPROTO op_evcntlsw (void)
2484 0487d6a8 j_mayer
{
2485 0487d6a8 j_mayer
    do_evcntlsw();
2486 0487d6a8 j_mayer
    RETURN();
2487 0487d6a8 j_mayer
}
2488 0487d6a8 j_mayer
2489 0487d6a8 j_mayer
void OPPROTO op_evand (void)
2490 0487d6a8 j_mayer
{
2491 0487d6a8 j_mayer
    T0_64 &= T1_64;
2492 0487d6a8 j_mayer
    RETURN();
2493 0487d6a8 j_mayer
}
2494 0487d6a8 j_mayer
2495 0487d6a8 j_mayer
void OPPROTO op_evandc (void)
2496 0487d6a8 j_mayer
{
2497 0487d6a8 j_mayer
    T0_64 &= ~T1_64;
2498 0487d6a8 j_mayer
    RETURN();
2499 0487d6a8 j_mayer
}
2500 0487d6a8 j_mayer
2501 0487d6a8 j_mayer
void OPPROTO op_evor (void)
2502 0487d6a8 j_mayer
{
2503 0487d6a8 j_mayer
    T0_64 |= T1_64;
2504 0487d6a8 j_mayer
    RETURN();
2505 0487d6a8 j_mayer
}
2506 0487d6a8 j_mayer
2507 0487d6a8 j_mayer
void OPPROTO op_evxor (void)
2508 0487d6a8 j_mayer
{
2509 0487d6a8 j_mayer
    T0_64 ^= T1_64;
2510 0487d6a8 j_mayer
    RETURN();
2511 0487d6a8 j_mayer
}
2512 0487d6a8 j_mayer
2513 0487d6a8 j_mayer
void OPPROTO op_eveqv (void)
2514 0487d6a8 j_mayer
{
2515 0487d6a8 j_mayer
    T0_64 = ~(T0_64 ^ T1_64);
2516 0487d6a8 j_mayer
    RETURN();
2517 0487d6a8 j_mayer
}
2518 0487d6a8 j_mayer
2519 0487d6a8 j_mayer
void OPPROTO op_evnor (void)
2520 0487d6a8 j_mayer
{
2521 0487d6a8 j_mayer
    T0_64 = ~(T0_64 | T1_64);
2522 0487d6a8 j_mayer
    RETURN();
2523 0487d6a8 j_mayer
}
2524 0487d6a8 j_mayer
2525 0487d6a8 j_mayer
void OPPROTO op_evorc (void)
2526 0487d6a8 j_mayer
{
2527 0487d6a8 j_mayer
    T0_64 |= ~T1_64;
2528 0487d6a8 j_mayer
    RETURN();
2529 0487d6a8 j_mayer
}
2530 0487d6a8 j_mayer
2531 0487d6a8 j_mayer
void OPPROTO op_evnand (void)
2532 0487d6a8 j_mayer
{
2533 0487d6a8 j_mayer
    T0_64 = ~(T0_64 & T1_64);
2534 0487d6a8 j_mayer
    RETURN();
2535 0487d6a8 j_mayer
}
2536 0487d6a8 j_mayer
2537 0487d6a8 j_mayer
void OPPROTO op_evsrws (void)
2538 0487d6a8 j_mayer
{
2539 0487d6a8 j_mayer
    do_evsrws();
2540 0487d6a8 j_mayer
    RETURN();
2541 0487d6a8 j_mayer
}
2542 0487d6a8 j_mayer
2543 0487d6a8 j_mayer
void OPPROTO op_evsrwu (void)
2544 0487d6a8 j_mayer
{
2545 0487d6a8 j_mayer
    do_evsrwu();
2546 0487d6a8 j_mayer
    RETURN();
2547 0487d6a8 j_mayer
}
2548 0487d6a8 j_mayer
2549 0487d6a8 j_mayer
void OPPROTO op_evslw (void)
2550 0487d6a8 j_mayer
{
2551 0487d6a8 j_mayer
    do_evslw();
2552 0487d6a8 j_mayer
    RETURN();
2553 0487d6a8 j_mayer
}
2554 0487d6a8 j_mayer
2555 0487d6a8 j_mayer
void OPPROTO op_evrlw (void)
2556 0487d6a8 j_mayer
{
2557 0487d6a8 j_mayer
    do_evrlw();
2558 0487d6a8 j_mayer
    RETURN();
2559 0487d6a8 j_mayer
}
2560 0487d6a8 j_mayer
2561 0487d6a8 j_mayer
void OPPROTO op_evmergelo (void)
2562 0487d6a8 j_mayer
{
2563 0487d6a8 j_mayer
    T0_64 = (T0_64 << 32) | (T1_64 & 0x00000000FFFFFFFFULL);
2564 0487d6a8 j_mayer
    RETURN();
2565 0487d6a8 j_mayer
}
2566 0487d6a8 j_mayer
2567 0487d6a8 j_mayer
void OPPROTO op_evmergehi (void)
2568 0487d6a8 j_mayer
{
2569 0487d6a8 j_mayer
    T0_64 = (T0_64 & 0xFFFFFFFF00000000ULL) | (T1_64 >> 32);
2570 0487d6a8 j_mayer
    RETURN();
2571 0487d6a8 j_mayer
}
2572 0487d6a8 j_mayer
2573 0487d6a8 j_mayer
void OPPROTO op_evmergelohi (void)
2574 0487d6a8 j_mayer
{
2575 0487d6a8 j_mayer
    T0_64 = (T0_64 << 32) | (T1_64 >> 32);
2576 0487d6a8 j_mayer
    RETURN();
2577 0487d6a8 j_mayer
}
2578 0487d6a8 j_mayer
2579 0487d6a8 j_mayer
void OPPROTO op_evmergehilo (void)
2580 0487d6a8 j_mayer
{
2581 0487d6a8 j_mayer
    T0_64 = (T0_64 & 0xFFFFFFFF00000000ULL) | (T1_64 & 0x00000000FFFFFFFFULL);
2582 0487d6a8 j_mayer
    RETURN();
2583 0487d6a8 j_mayer
}
2584 0487d6a8 j_mayer
2585 0487d6a8 j_mayer
void OPPROTO op_evcmpgts (void)
2586 0487d6a8 j_mayer
{
2587 0487d6a8 j_mayer
    do_evcmpgts();
2588 0487d6a8 j_mayer
    RETURN();
2589 0487d6a8 j_mayer
}
2590 0487d6a8 j_mayer
2591 0487d6a8 j_mayer
void OPPROTO op_evcmpgtu (void)
2592 0487d6a8 j_mayer
{
2593 0487d6a8 j_mayer
    do_evcmpgtu();
2594 0487d6a8 j_mayer
    RETURN();
2595 0487d6a8 j_mayer
}
2596 0487d6a8 j_mayer
2597 0487d6a8 j_mayer
void OPPROTO op_evcmplts (void)
2598 0487d6a8 j_mayer
{
2599 0487d6a8 j_mayer
    do_evcmplts();
2600 0487d6a8 j_mayer
    RETURN();
2601 0487d6a8 j_mayer
}
2602 0487d6a8 j_mayer
2603 0487d6a8 j_mayer
void OPPROTO op_evcmpltu (void)
2604 0487d6a8 j_mayer
{
2605 0487d6a8 j_mayer
    do_evcmpltu();
2606 0487d6a8 j_mayer
    RETURN();
2607 0487d6a8 j_mayer
}
2608 0487d6a8 j_mayer
2609 0487d6a8 j_mayer
void OPPROTO op_evcmpeq (void)
2610 0487d6a8 j_mayer
{
2611 0487d6a8 j_mayer
    do_evcmpeq();
2612 0487d6a8 j_mayer
    RETURN();
2613 0487d6a8 j_mayer
}
2614 0487d6a8 j_mayer
2615 0487d6a8 j_mayer
void OPPROTO op_evfssub (void)
2616 0487d6a8 j_mayer
{
2617 0487d6a8 j_mayer
    do_evfssub();
2618 0487d6a8 j_mayer
    RETURN();
2619 0487d6a8 j_mayer
}
2620 0487d6a8 j_mayer
2621 0487d6a8 j_mayer
void OPPROTO op_evfsadd (void)
2622 0487d6a8 j_mayer
{
2623 0487d6a8 j_mayer
    do_evfsadd();
2624 0487d6a8 j_mayer
    RETURN();
2625 0487d6a8 j_mayer
}
2626 0487d6a8 j_mayer
2627 0487d6a8 j_mayer
void OPPROTO op_evfsnabs (void)
2628 0487d6a8 j_mayer
{
2629 0487d6a8 j_mayer
    do_evfsnabs();
2630 0487d6a8 j_mayer
    RETURN();
2631 0487d6a8 j_mayer
}
2632 0487d6a8 j_mayer
2633 0487d6a8 j_mayer
void OPPROTO op_evfsabs (void)
2634 0487d6a8 j_mayer
{
2635 0487d6a8 j_mayer
    do_evfsabs();
2636 0487d6a8 j_mayer
    RETURN();
2637 0487d6a8 j_mayer
}
2638 0487d6a8 j_mayer
2639 0487d6a8 j_mayer
void OPPROTO op_evfsneg (void)
2640 0487d6a8 j_mayer
{
2641 0487d6a8 j_mayer
    do_evfsneg();
2642 0487d6a8 j_mayer
    RETURN();
2643 0487d6a8 j_mayer
}
2644 0487d6a8 j_mayer
2645 0487d6a8 j_mayer
void OPPROTO op_evfsdiv (void)
2646 0487d6a8 j_mayer
{
2647 0487d6a8 j_mayer
    do_evfsdiv();
2648 0487d6a8 j_mayer
    RETURN();
2649 0487d6a8 j_mayer
}
2650 0487d6a8 j_mayer
2651 0487d6a8 j_mayer
void OPPROTO op_evfsmul (void)
2652 0487d6a8 j_mayer
{
2653 0487d6a8 j_mayer
    do_evfsmul();
2654 0487d6a8 j_mayer
    RETURN();
2655 0487d6a8 j_mayer
}
2656 0487d6a8 j_mayer
2657 0487d6a8 j_mayer
void OPPROTO op_evfscmplt (void)
2658 0487d6a8 j_mayer
{
2659 0487d6a8 j_mayer
    do_evfscmplt();
2660 0487d6a8 j_mayer
    RETURN();
2661 0487d6a8 j_mayer
}
2662 0487d6a8 j_mayer
2663 0487d6a8 j_mayer
void OPPROTO op_evfscmpgt (void)
2664 0487d6a8 j_mayer
{
2665 0487d6a8 j_mayer
    do_evfscmpgt();
2666 0487d6a8 j_mayer
    RETURN();
2667 0487d6a8 j_mayer
}
2668 0487d6a8 j_mayer
2669 0487d6a8 j_mayer
void OPPROTO op_evfscmpeq (void)
2670 0487d6a8 j_mayer
{
2671 0487d6a8 j_mayer
    do_evfscmpeq();
2672 0487d6a8 j_mayer
    RETURN();
2673 0487d6a8 j_mayer
}
2674 0487d6a8 j_mayer
2675 0487d6a8 j_mayer
void OPPROTO op_evfscfsi (void)
2676 0487d6a8 j_mayer
{
2677 0487d6a8 j_mayer
    do_evfscfsi();
2678 0487d6a8 j_mayer
    RETURN();
2679 0487d6a8 j_mayer
}
2680 0487d6a8 j_mayer
2681 0487d6a8 j_mayer
void OPPROTO op_evfscfui (void)
2682 0487d6a8 j_mayer
{
2683 0487d6a8 j_mayer
    do_evfscfui();
2684 0487d6a8 j_mayer
    RETURN();
2685 0487d6a8 j_mayer
}
2686 0487d6a8 j_mayer
2687 0487d6a8 j_mayer
void OPPROTO op_evfscfsf (void)
2688 0487d6a8 j_mayer
{
2689 0487d6a8 j_mayer
    do_evfscfsf();
2690 0487d6a8 j_mayer
    RETURN();
2691 0487d6a8 j_mayer
}
2692 0487d6a8 j_mayer
2693 0487d6a8 j_mayer
void OPPROTO op_evfscfuf (void)
2694 0487d6a8 j_mayer
{
2695 0487d6a8 j_mayer
    do_evfscfuf();
2696 0487d6a8 j_mayer
    RETURN();
2697 0487d6a8 j_mayer
}
2698 0487d6a8 j_mayer
2699 0487d6a8 j_mayer
void OPPROTO op_evfsctsi (void)
2700 0487d6a8 j_mayer
{
2701 0487d6a8 j_mayer
    do_evfsctsi();
2702 0487d6a8 j_mayer
    RETURN();
2703 0487d6a8 j_mayer
}
2704 0487d6a8 j_mayer
2705 0487d6a8 j_mayer
void OPPROTO op_evfsctui (void)
2706 0487d6a8 j_mayer
{
2707 0487d6a8 j_mayer
    do_evfsctui();
2708 0487d6a8 j_mayer
    RETURN();
2709 0487d6a8 j_mayer
}
2710 0487d6a8 j_mayer
2711 0487d6a8 j_mayer
void OPPROTO op_evfsctsf (void)
2712 0487d6a8 j_mayer
{
2713 0487d6a8 j_mayer
    do_evfsctsf();
2714 0487d6a8 j_mayer
    RETURN();
2715 0487d6a8 j_mayer
}
2716 0487d6a8 j_mayer
2717 0487d6a8 j_mayer
void OPPROTO op_evfsctuf (void)
2718 0487d6a8 j_mayer
{
2719 0487d6a8 j_mayer
    do_evfsctuf();
2720 0487d6a8 j_mayer
    RETURN();
2721 0487d6a8 j_mayer
}
2722 0487d6a8 j_mayer
2723 0487d6a8 j_mayer
void OPPROTO op_evfsctuiz (void)
2724 0487d6a8 j_mayer
{
2725 0487d6a8 j_mayer
    do_evfsctuiz();
2726 0487d6a8 j_mayer
    RETURN();
2727 0487d6a8 j_mayer
}
2728 0487d6a8 j_mayer
2729 0487d6a8 j_mayer
void OPPROTO op_evfsctsiz (void)
2730 0487d6a8 j_mayer
{
2731 0487d6a8 j_mayer
    do_evfsctsiz();
2732 0487d6a8 j_mayer
    RETURN();
2733 0487d6a8 j_mayer
}
2734 0487d6a8 j_mayer
2735 0487d6a8 j_mayer
void OPPROTO op_evfststlt (void)
2736 0487d6a8 j_mayer
{
2737 0487d6a8 j_mayer
    do_evfststlt();
2738 0487d6a8 j_mayer
    RETURN();
2739 0487d6a8 j_mayer
}
2740 0487d6a8 j_mayer
2741 0487d6a8 j_mayer
void OPPROTO op_evfststgt (void)
2742 0487d6a8 j_mayer
{
2743 0487d6a8 j_mayer
    do_evfststgt();
2744 0487d6a8 j_mayer
    RETURN();
2745 0487d6a8 j_mayer
}
2746 0487d6a8 j_mayer
2747 0487d6a8 j_mayer
void OPPROTO op_evfststeq (void)
2748 0487d6a8 j_mayer
{
2749 0487d6a8 j_mayer
    do_evfststeq();
2750 0487d6a8 j_mayer
    RETURN();
2751 0487d6a8 j_mayer
}
2752 0487d6a8 j_mayer
2753 0487d6a8 j_mayer
void OPPROTO op_efssub (void)
2754 0487d6a8 j_mayer
{
2755 0487d6a8 j_mayer
    T0_64 = _do_efssub(T0_64, T1_64);
2756 0487d6a8 j_mayer
    RETURN();
2757 0487d6a8 j_mayer
}
2758 0487d6a8 j_mayer
2759 0487d6a8 j_mayer
void OPPROTO op_efsadd (void)
2760 0487d6a8 j_mayer
{
2761 0487d6a8 j_mayer
    T0_64 = _do_efsadd(T0_64, T1_64);
2762 0487d6a8 j_mayer
    RETURN();
2763 0487d6a8 j_mayer
}
2764 0487d6a8 j_mayer
2765 0487d6a8 j_mayer
void OPPROTO op_efsnabs (void)
2766 0487d6a8 j_mayer
{
2767 0487d6a8 j_mayer
    T0_64 = _do_efsnabs(T0_64);
2768 0487d6a8 j_mayer
    RETURN();
2769 0487d6a8 j_mayer
}
2770 0487d6a8 j_mayer
2771 0487d6a8 j_mayer
void OPPROTO op_efsabs (void)
2772 0487d6a8 j_mayer
{
2773 0487d6a8 j_mayer
    T0_64 = _do_efsabs(T0_64);
2774 0487d6a8 j_mayer
    RETURN();
2775 0487d6a8 j_mayer
}
2776 0487d6a8 j_mayer
2777 0487d6a8 j_mayer
void OPPROTO op_efsneg (void)
2778 0487d6a8 j_mayer
{
2779 0487d6a8 j_mayer
    T0_64 = _do_efsneg(T0_64);
2780 0487d6a8 j_mayer
    RETURN();
2781 0487d6a8 j_mayer
}
2782 0487d6a8 j_mayer
2783 0487d6a8 j_mayer
void OPPROTO op_efsdiv (void)
2784 0487d6a8 j_mayer
{
2785 0487d6a8 j_mayer
    T0_64 = _do_efsdiv(T0_64, T1_64);
2786 0487d6a8 j_mayer
    RETURN();
2787 0487d6a8 j_mayer
}
2788 0487d6a8 j_mayer
2789 0487d6a8 j_mayer
void OPPROTO op_efsmul (void)
2790 0487d6a8 j_mayer
{
2791 0487d6a8 j_mayer
    T0_64 = _do_efsmul(T0_64, T1_64);
2792 0487d6a8 j_mayer
    RETURN();
2793 0487d6a8 j_mayer
}
2794 0487d6a8 j_mayer
2795 0487d6a8 j_mayer
void OPPROTO op_efscmplt (void)
2796 0487d6a8 j_mayer
{
2797 0487d6a8 j_mayer
    do_efscmplt();
2798 0487d6a8 j_mayer
    RETURN();
2799 0487d6a8 j_mayer
}
2800 0487d6a8 j_mayer
2801 0487d6a8 j_mayer
void OPPROTO op_efscmpgt (void)
2802 0487d6a8 j_mayer
{
2803 0487d6a8 j_mayer
    do_efscmpgt();
2804 0487d6a8 j_mayer
    RETURN();
2805 0487d6a8 j_mayer
}
2806 0487d6a8 j_mayer
2807 0487d6a8 j_mayer
void OPPROTO op_efscfd (void)
2808 0487d6a8 j_mayer
{
2809 0487d6a8 j_mayer
    do_efscfd();
2810 0487d6a8 j_mayer
    RETURN();
2811 0487d6a8 j_mayer
}
2812 0487d6a8 j_mayer
2813 0487d6a8 j_mayer
void OPPROTO op_efscmpeq (void)
2814 0487d6a8 j_mayer
{
2815 0487d6a8 j_mayer
    do_efscmpeq();
2816 0487d6a8 j_mayer
    RETURN();
2817 0487d6a8 j_mayer
}
2818 0487d6a8 j_mayer
2819 0487d6a8 j_mayer
void OPPROTO op_efscfsi (void)
2820 0487d6a8 j_mayer
{
2821 0487d6a8 j_mayer
    do_efscfsi();
2822 0487d6a8 j_mayer
    RETURN();
2823 0487d6a8 j_mayer
}
2824 0487d6a8 j_mayer
2825 0487d6a8 j_mayer
void OPPROTO op_efscfui (void)
2826 0487d6a8 j_mayer
{
2827 0487d6a8 j_mayer
    do_efscfui();
2828 0487d6a8 j_mayer
    RETURN();
2829 0487d6a8 j_mayer
}
2830 0487d6a8 j_mayer
2831 0487d6a8 j_mayer
void OPPROTO op_efscfsf (void)
2832 0487d6a8 j_mayer
{
2833 0487d6a8 j_mayer
    do_efscfsf();
2834 0487d6a8 j_mayer
    RETURN();
2835 0487d6a8 j_mayer
}
2836 0487d6a8 j_mayer
2837 0487d6a8 j_mayer
void OPPROTO op_efscfuf (void)
2838 0487d6a8 j_mayer
{
2839 0487d6a8 j_mayer
    do_efscfuf();
2840 0487d6a8 j_mayer
    RETURN();
2841 0487d6a8 j_mayer
}
2842 0487d6a8 j_mayer
2843 0487d6a8 j_mayer
void OPPROTO op_efsctsi (void)
2844 0487d6a8 j_mayer
{
2845 0487d6a8 j_mayer
    do_efsctsi();
2846 0487d6a8 j_mayer
    RETURN();
2847 0487d6a8 j_mayer
}
2848 0487d6a8 j_mayer
2849 0487d6a8 j_mayer
void OPPROTO op_efsctui (void)
2850 0487d6a8 j_mayer
{
2851 0487d6a8 j_mayer
    do_efsctui();
2852 0487d6a8 j_mayer
    RETURN();
2853 0487d6a8 j_mayer
}
2854 0487d6a8 j_mayer
2855 0487d6a8 j_mayer
void OPPROTO op_efsctsf (void)
2856 0487d6a8 j_mayer
{
2857 0487d6a8 j_mayer
    do_efsctsf();
2858 0487d6a8 j_mayer
    RETURN();
2859 0487d6a8 j_mayer
}
2860 0487d6a8 j_mayer
2861 0487d6a8 j_mayer
void OPPROTO op_efsctuf (void)
2862 0487d6a8 j_mayer
{
2863 0487d6a8 j_mayer
    do_efsctuf();
2864 0487d6a8 j_mayer
    RETURN();
2865 0487d6a8 j_mayer
}
2866 0487d6a8 j_mayer
2867 0487d6a8 j_mayer
void OPPROTO op_efsctsiz (void)
2868 0487d6a8 j_mayer
{
2869 0487d6a8 j_mayer
    do_efsctsiz();
2870 0487d6a8 j_mayer
    RETURN();
2871 0487d6a8 j_mayer
}
2872 0487d6a8 j_mayer
2873 0487d6a8 j_mayer
void OPPROTO op_efsctuiz (void)
2874 0487d6a8 j_mayer
{
2875 0487d6a8 j_mayer
    do_efsctuiz();
2876 0487d6a8 j_mayer
    RETURN();
2877 0487d6a8 j_mayer
}
2878 0487d6a8 j_mayer
2879 0487d6a8 j_mayer
void OPPROTO op_efststlt (void)
2880 0487d6a8 j_mayer
{
2881 0487d6a8 j_mayer
    T0 = _do_efststlt(T0_64, T1_64);
2882 0487d6a8 j_mayer
    RETURN();
2883 0487d6a8 j_mayer
}
2884 0487d6a8 j_mayer
2885 0487d6a8 j_mayer
void OPPROTO op_efststgt (void)
2886 0487d6a8 j_mayer
{
2887 0487d6a8 j_mayer
    T0 = _do_efststgt(T0_64, T1_64);
2888 0487d6a8 j_mayer
    RETURN();
2889 0487d6a8 j_mayer
}
2890 0487d6a8 j_mayer
2891 0487d6a8 j_mayer
void OPPROTO op_efststeq (void)
2892 0487d6a8 j_mayer
{
2893 0487d6a8 j_mayer
    T0 = _do_efststeq(T0_64, T1_64);
2894 0487d6a8 j_mayer
    RETURN();
2895 0487d6a8 j_mayer
}
2896 0487d6a8 j_mayer
2897 0487d6a8 j_mayer
void OPPROTO op_efdsub (void)
2898 0487d6a8 j_mayer
{
2899 0487d6a8 j_mayer
    union {
2900 0487d6a8 j_mayer
        uint64_t u;
2901 0487d6a8 j_mayer
        float64 f;
2902 0487d6a8 j_mayer
    } u1, u2;
2903 0487d6a8 j_mayer
    u1.u = T0_64;
2904 0487d6a8 j_mayer
    u2.u = T1_64;
2905 0487d6a8 j_mayer
    u1.f = float64_sub(u1.f, u2.f, &env->spe_status);
2906 0487d6a8 j_mayer
    T0_64 = u1.u;
2907 0487d6a8 j_mayer
    RETURN();
2908 0487d6a8 j_mayer
}
2909 0487d6a8 j_mayer
2910 0487d6a8 j_mayer
void OPPROTO op_efdadd (void)
2911 0487d6a8 j_mayer
{
2912 0487d6a8 j_mayer
    union {
2913 0487d6a8 j_mayer
        uint64_t u;
2914 0487d6a8 j_mayer
        float64 f;
2915 0487d6a8 j_mayer
    } u1, u2;
2916 0487d6a8 j_mayer
    u1.u = T0_64;
2917 0487d6a8 j_mayer
    u2.u = T1_64;
2918 0487d6a8 j_mayer
    u1.f = float64_add(u1.f, u2.f, &env->spe_status);
2919 0487d6a8 j_mayer
    T0_64 = u1.u;
2920 0487d6a8 j_mayer
    RETURN();
2921 0487d6a8 j_mayer
}
2922 0487d6a8 j_mayer
2923 0487d6a8 j_mayer
void OPPROTO op_efdcfsid (void)
2924 0487d6a8 j_mayer
{
2925 0487d6a8 j_mayer
    do_efdcfsi();
2926 0487d6a8 j_mayer
    RETURN();
2927 0487d6a8 j_mayer
}
2928 0487d6a8 j_mayer
2929 0487d6a8 j_mayer
void OPPROTO op_efdcfuid (void)
2930 0487d6a8 j_mayer
{
2931 0487d6a8 j_mayer
    do_efdcfui();
2932 0487d6a8 j_mayer
    RETURN();
2933 0487d6a8 j_mayer
}
2934 0487d6a8 j_mayer
2935 0487d6a8 j_mayer
void OPPROTO op_efdnabs (void)
2936 0487d6a8 j_mayer
{
2937 0487d6a8 j_mayer
    T0_64 |= 0x8000000000000000ULL;
2938 0487d6a8 j_mayer
    RETURN();
2939 0487d6a8 j_mayer
}
2940 0487d6a8 j_mayer
2941 0487d6a8 j_mayer
void OPPROTO op_efdabs (void)
2942 0487d6a8 j_mayer
{
2943 0487d6a8 j_mayer
    T0_64 &= ~0x8000000000000000ULL;
2944 0487d6a8 j_mayer
    RETURN();
2945 0487d6a8 j_mayer
}
2946 0487d6a8 j_mayer
2947 0487d6a8 j_mayer
void OPPROTO op_efdneg (void)
2948 0487d6a8 j_mayer
{
2949 0487d6a8 j_mayer
    T0_64 ^= 0x8000000000000000ULL;
2950 0487d6a8 j_mayer
    RETURN();
2951 0487d6a8 j_mayer
}
2952 0487d6a8 j_mayer
2953 0487d6a8 j_mayer
void OPPROTO op_efddiv (void)
2954 0487d6a8 j_mayer
{
2955 0487d6a8 j_mayer
    union {
2956 0487d6a8 j_mayer
        uint64_t u;
2957 0487d6a8 j_mayer
        float64 f;
2958 0487d6a8 j_mayer
    } u1, u2;
2959 0487d6a8 j_mayer
    u1.u = T0_64;
2960 0487d6a8 j_mayer
    u2.u = T1_64;
2961 0487d6a8 j_mayer
    u1.f = float64_div(u1.f, u2.f, &env->spe_status);
2962 0487d6a8 j_mayer
    T0_64 = u1.u;
2963 0487d6a8 j_mayer
    RETURN();
2964 0487d6a8 j_mayer
}
2965 0487d6a8 j_mayer
2966 0487d6a8 j_mayer
void OPPROTO op_efdmul (void)
2967 0487d6a8 j_mayer
{
2968 0487d6a8 j_mayer
    union {
2969 0487d6a8 j_mayer
        uint64_t u;
2970 0487d6a8 j_mayer
        float64 f;
2971 0487d6a8 j_mayer
    } u1, u2;
2972 0487d6a8 j_mayer
    u1.u = T0_64;
2973 0487d6a8 j_mayer
    u2.u = T1_64;
2974 0487d6a8 j_mayer
    u1.f = float64_mul(u1.f, u2.f, &env->spe_status);
2975 0487d6a8 j_mayer
    T0_64 = u1.u;
2976 0487d6a8 j_mayer
    RETURN();
2977 0487d6a8 j_mayer
}
2978 0487d6a8 j_mayer
2979 0487d6a8 j_mayer
void OPPROTO op_efdctsidz (void)
2980 0487d6a8 j_mayer
{
2981 0487d6a8 j_mayer
    do_efdctsiz();
2982 0487d6a8 j_mayer
    RETURN();
2983 0487d6a8 j_mayer
}
2984 0487d6a8 j_mayer
2985 0487d6a8 j_mayer
void OPPROTO op_efdctuidz (void)
2986 0487d6a8 j_mayer
{
2987 0487d6a8 j_mayer
    do_efdctuiz();
2988 0487d6a8 j_mayer
    RETURN();
2989 0487d6a8 j_mayer
}
2990 0487d6a8 j_mayer
2991 0487d6a8 j_mayer
void OPPROTO op_efdcmplt (void)
2992 0487d6a8 j_mayer
{
2993 0487d6a8 j_mayer
    do_efdcmplt();
2994 0487d6a8 j_mayer
    RETURN();
2995 0487d6a8 j_mayer
}
2996 0487d6a8 j_mayer
2997 0487d6a8 j_mayer
void OPPROTO op_efdcmpgt (void)
2998 0487d6a8 j_mayer
{
2999 0487d6a8 j_mayer
    do_efdcmpgt();
3000 0487d6a8 j_mayer
    RETURN();
3001 0487d6a8 j_mayer
}
3002 0487d6a8 j_mayer
3003 0487d6a8 j_mayer
void OPPROTO op_efdcfs (void)
3004 0487d6a8 j_mayer
{
3005 0487d6a8 j_mayer
    do_efdcfs();
3006 0487d6a8 j_mayer
    RETURN();
3007 0487d6a8 j_mayer
}
3008 0487d6a8 j_mayer
3009 0487d6a8 j_mayer
void OPPROTO op_efdcmpeq (void)
3010 0487d6a8 j_mayer
{
3011 0487d6a8 j_mayer
    do_efdcmpeq();
3012 0487d6a8 j_mayer
    RETURN();
3013 0487d6a8 j_mayer
}
3014 0487d6a8 j_mayer
3015 0487d6a8 j_mayer
void OPPROTO op_efdcfsi (void)
3016 0487d6a8 j_mayer
{
3017 0487d6a8 j_mayer
    do_efdcfsi();
3018 0487d6a8 j_mayer
    RETURN();
3019 0487d6a8 j_mayer
}
3020 0487d6a8 j_mayer
3021 0487d6a8 j_mayer
void OPPROTO op_efdcfui (void)
3022 0487d6a8 j_mayer
{
3023 0487d6a8 j_mayer
    do_efdcfui();
3024 0487d6a8 j_mayer
    RETURN();
3025 0487d6a8 j_mayer
}
3026 0487d6a8 j_mayer
3027 0487d6a8 j_mayer
void OPPROTO op_efdcfsf (void)
3028 0487d6a8 j_mayer
{
3029 0487d6a8 j_mayer
    do_efdcfsf();
3030 0487d6a8 j_mayer
    RETURN();
3031 0487d6a8 j_mayer
}
3032 0487d6a8 j_mayer
3033 0487d6a8 j_mayer
void OPPROTO op_efdcfuf (void)
3034 0487d6a8 j_mayer
{
3035 0487d6a8 j_mayer
    do_efdcfuf();
3036 0487d6a8 j_mayer
    RETURN();
3037 0487d6a8 j_mayer
}
3038 0487d6a8 j_mayer
3039 0487d6a8 j_mayer
void OPPROTO op_efdctsi (void)
3040 0487d6a8 j_mayer
{
3041 0487d6a8 j_mayer
    do_efdctsi();
3042 0487d6a8 j_mayer
    RETURN();
3043 0487d6a8 j_mayer
}
3044 0487d6a8 j_mayer
3045 0487d6a8 j_mayer
void OPPROTO op_efdctui (void)
3046 0487d6a8 j_mayer
{
3047 0487d6a8 j_mayer
    do_efdctui();
3048 0487d6a8 j_mayer
    RETURN();
3049 0487d6a8 j_mayer
}
3050 0487d6a8 j_mayer
3051 0487d6a8 j_mayer
void OPPROTO op_efdctsf (void)
3052 0487d6a8 j_mayer
{
3053 0487d6a8 j_mayer
    do_efdctsf();
3054 0487d6a8 j_mayer
    RETURN();
3055 0487d6a8 j_mayer
}
3056 0487d6a8 j_mayer
3057 0487d6a8 j_mayer
void OPPROTO op_efdctuf (void)
3058 0487d6a8 j_mayer
{
3059 0487d6a8 j_mayer
    do_efdctuf();
3060 0487d6a8 j_mayer
    RETURN();
3061 0487d6a8 j_mayer
}
3062 0487d6a8 j_mayer
3063 0487d6a8 j_mayer
void OPPROTO op_efdctuiz (void)
3064 0487d6a8 j_mayer
{
3065 0487d6a8 j_mayer
    do_efdctuiz();
3066 0487d6a8 j_mayer
    RETURN();
3067 0487d6a8 j_mayer
}
3068 0487d6a8 j_mayer
3069 0487d6a8 j_mayer
void OPPROTO op_efdctsiz (void)
3070 0487d6a8 j_mayer
{
3071 0487d6a8 j_mayer
    do_efdctsiz();
3072 0487d6a8 j_mayer
    RETURN();
3073 0487d6a8 j_mayer
}
3074 0487d6a8 j_mayer
3075 0487d6a8 j_mayer
void OPPROTO op_efdtstlt (void)
3076 0487d6a8 j_mayer
{
3077 0487d6a8 j_mayer
    T0 = _do_efdtstlt(T0_64, T1_64);
3078 0487d6a8 j_mayer
    RETURN();
3079 0487d6a8 j_mayer
}
3080 0487d6a8 j_mayer
3081 0487d6a8 j_mayer
void OPPROTO op_efdtstgt (void)
3082 0487d6a8 j_mayer
{
3083 0487d6a8 j_mayer
    T0 = _do_efdtstgt(T0_64, T1_64);
3084 0487d6a8 j_mayer
    RETURN();
3085 0487d6a8 j_mayer
}
3086 0487d6a8 j_mayer
3087 0487d6a8 j_mayer
void OPPROTO op_efdtsteq (void)
3088 0487d6a8 j_mayer
{
3089 0487d6a8 j_mayer
    T0 = _do_efdtsteq(T0_64, T1_64);
3090 0487d6a8 j_mayer
    RETURN();
3091 0487d6a8 j_mayer
}
3092 0487d6a8 j_mayer
#endif /* defined(TARGET_PPCSPE) */