]> Git Repo - qemu.git/blame - target-ppc/op_mem.h
Report missing elf_addr_t definition from Linux kernel header
[qemu.git] / target-ppc / op_mem.h
CommitLineData
76a66253
JM
1/*
2 * PowerPC emulation micro-operations for qemu.
5fafdf24 3 *
76a66253
JM
4 * Copyright (c) 2003-2007 Jocelyn Mayer
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 */
9a64fbe4 20
0fa85d43 21static inline uint16_t glue(ld16r, MEMSUFFIX) (target_ulong EA)
9a64fbe4 22{
ac9eb073 23 uint16_t tmp = glue(lduw, MEMSUFFIX)(EA);
9a64fbe4
FB
24 return ((tmp & 0xFF00) >> 8) | ((tmp & 0x00FF) << 8);
25}
26
111bfab3
FB
27static inline int32_t glue(ld16rs, MEMSUFFIX) (target_ulong EA)
28{
29 int16_t tmp = glue(lduw, MEMSUFFIX)(EA);
76a66253 30 return (int16_t)((tmp & 0xFF00) >> 8) | ((tmp & 0x00FF) << 8);
111bfab3
FB
31}
32
0fa85d43 33static inline uint32_t glue(ld32r, MEMSUFFIX) (target_ulong EA)
9a64fbe4 34{
ac9eb073 35 uint32_t tmp = glue(ldl, MEMSUFFIX)(EA);
9a64fbe4
FB
36 return ((tmp & 0xFF000000) >> 24) | ((tmp & 0x00FF0000) >> 8) |
37 ((tmp & 0x0000FF00) << 8) | ((tmp & 0x000000FF) << 24);
38}
39
35cdaad6 40#if defined(TARGET_PPC64) || defined(TARGET_PPCEMB)
d9bce9d9
JM
41static inline uint64_t glue(ld64r, MEMSUFFIX) (target_ulong EA)
42{
43 uint64_t tmp = glue(ldq, MEMSUFFIX)(EA);
44 return ((tmp & 0xFF00000000000000ULL) >> 56) |
45 ((tmp & 0x00FF000000000000ULL) >> 40) |
46 ((tmp & 0x0000FF0000000000ULL) >> 24) |
47 ((tmp & 0x000000FF00000000ULL) >> 8) |
48 ((tmp & 0x00000000FF000000ULL) << 8) |
49 ((tmp & 0x0000000000FF0000ULL) << 24) |
50 ((tmp & 0x000000000000FF00ULL) << 40) |
51 ((tmp & 0x00000000000000FFULL) << 54);
52}
0487d6a8
JM
53#endif
54
55#if defined(TARGET_PPC64)
56static inline int64_t glue(ldsl, MEMSUFFIX) (target_ulong EA)
57{
58 return (int32_t)glue(ldl, MEMSUFFIX)(EA);
59}
d9bce9d9
JM
60
61static inline int64_t glue(ld32rs, MEMSUFFIX) (target_ulong EA)
62{
63 uint32_t tmp = glue(ldl, MEMSUFFIX)(EA);
64 return (int32_t)((tmp & 0xFF000000) >> 24) | ((tmp & 0x00FF0000) >> 8) |
65 ((tmp & 0x0000FF00) << 8) | ((tmp & 0x000000FF) << 24);
66}
67#endif
68
0fa85d43 69static inline void glue(st16r, MEMSUFFIX) (target_ulong EA, uint16_t data)
9a64fbe4
FB
70{
71 uint16_t tmp = ((data & 0xFF00) >> 8) | ((data & 0x00FF) << 8);
ac9eb073 72 glue(stw, MEMSUFFIX)(EA, tmp);
9a64fbe4
FB
73}
74
0fa85d43 75static inline void glue(st32r, MEMSUFFIX) (target_ulong EA, uint32_t data)
9a64fbe4
FB
76{
77 uint32_t tmp = ((data & 0xFF000000) >> 24) | ((data & 0x00FF0000) >> 8) |
78 ((data & 0x0000FF00) << 8) | ((data & 0x000000FF) << 24);
ac9eb073 79 glue(stl, MEMSUFFIX)(EA, tmp);
9a64fbe4
FB
80}
81
35cdaad6 82#if defined(TARGET_PPC64) || defined(TARGET_PPCEMB)
d9bce9d9
JM
83static inline void glue(st64r, MEMSUFFIX) (target_ulong EA, uint64_t data)
84{
85 uint64_t tmp = ((data & 0xFF00000000000000ULL) >> 56) |
86 ((data & 0x00FF000000000000ULL) >> 40) |
87 ((data & 0x0000FF0000000000ULL) >> 24) |
88 ((data & 0x000000FF00000000ULL) >> 8) |
89 ((data & 0x00000000FF000000ULL) << 8) |
90 ((data & 0x0000000000FF0000ULL) << 24) |
91 ((data & 0x000000000000FF00ULL) << 40) |
92 ((data & 0x00000000000000FFULL) << 56);
93 glue(stq, MEMSUFFIX)(EA, tmp);
94}
95#endif
96
9a64fbe4
FB
97/*** Integer load ***/
98#define PPC_LD_OP(name, op) \
d9bce9d9 99void OPPROTO glue(glue(op_l, name), MEMSUFFIX) (void) \
9a64fbe4 100{ \
d9bce9d9 101 T1 = glue(op, MEMSUFFIX)((uint32_t)T0); \
9a64fbe4
FB
102 RETURN(); \
103}
104
d9bce9d9
JM
105#if defined(TARGET_PPC64)
106#define PPC_LD_OP_64(name, op) \
107void OPPROTO glue(glue(glue(op_l, name), _64), MEMSUFFIX) (void) \
108{ \
109 T1 = glue(op, MEMSUFFIX)((uint64_t)T0); \
110 RETURN(); \
111}
112#endif
113
9a64fbe4 114#define PPC_ST_OP(name, op) \
d9bce9d9 115void OPPROTO glue(glue(op_st, name), MEMSUFFIX) (void) \
9a64fbe4 116{ \
d9bce9d9 117 glue(op, MEMSUFFIX)((uint32_t)T0, T1); \
9a64fbe4
FB
118 RETURN(); \
119}
120
d9bce9d9
JM
121#if defined(TARGET_PPC64)
122#define PPC_ST_OP_64(name, op) \
123void OPPROTO glue(glue(glue(op_st, name), _64), MEMSUFFIX) (void) \
124{ \
125 glue(op, MEMSUFFIX)((uint64_t)T0, T1); \
126 RETURN(); \
127}
128#endif
129
ac9eb073
FB
130PPC_LD_OP(bz, ldub);
131PPC_LD_OP(ha, ldsw);
132PPC_LD_OP(hz, lduw);
133PPC_LD_OP(wz, ldl);
d9bce9d9
JM
134#if defined(TARGET_PPC64)
135PPC_LD_OP(d, ldq);
136PPC_LD_OP(wa, ldsl);
137PPC_LD_OP_64(d, ldq);
138PPC_LD_OP_64(wa, ldsl);
139PPC_LD_OP_64(bz, ldub);
140PPC_LD_OP_64(ha, ldsw);
141PPC_LD_OP_64(hz, lduw);
142PPC_LD_OP_64(wz, ldl);
143#endif
9a64fbe4 144
111bfab3
FB
145PPC_LD_OP(ha_le, ld16rs);
146PPC_LD_OP(hz_le, ld16r);
147PPC_LD_OP(wz_le, ld32r);
d9bce9d9
JM
148#if defined(TARGET_PPC64)
149PPC_LD_OP(d_le, ld64r);
150PPC_LD_OP(wa_le, ld32rs);
151PPC_LD_OP_64(d_le, ld64r);
152PPC_LD_OP_64(wa_le, ld32rs);
153PPC_LD_OP_64(ha_le, ld16rs);
154PPC_LD_OP_64(hz_le, ld16r);
155PPC_LD_OP_64(wz_le, ld32r);
156#endif
111bfab3 157
9a64fbe4 158/*** Integer store ***/
ac9eb073
FB
159PPC_ST_OP(b, stb);
160PPC_ST_OP(h, stw);
161PPC_ST_OP(w, stl);
d9bce9d9
JM
162#if defined(TARGET_PPC64)
163PPC_ST_OP(d, stq);
164PPC_ST_OP_64(d, stq);
165PPC_ST_OP_64(b, stb);
166PPC_ST_OP_64(h, stw);
167PPC_ST_OP_64(w, stl);
168#endif
9a64fbe4 169
111bfab3
FB
170PPC_ST_OP(h_le, st16r);
171PPC_ST_OP(w_le, st32r);
d9bce9d9
JM
172#if defined(TARGET_PPC64)
173PPC_ST_OP(d_le, st64r);
174PPC_ST_OP_64(d_le, st64r);
175PPC_ST_OP_64(h_le, st16r);
176PPC_ST_OP_64(w_le, st32r);
177#endif
111bfab3 178
9a64fbe4 179/*** Integer load and store with byte reverse ***/
ac9eb073
FB
180PPC_LD_OP(hbr, ld16r);
181PPC_LD_OP(wbr, ld32r);
182PPC_ST_OP(hbr, st16r);
183PPC_ST_OP(wbr, st32r);
d9bce9d9
JM
184#if defined(TARGET_PPC64)
185PPC_LD_OP_64(hbr, ld16r);
186PPC_LD_OP_64(wbr, ld32r);
187PPC_ST_OP_64(hbr, st16r);
188PPC_ST_OP_64(wbr, st32r);
189#endif
9a64fbe4 190
111bfab3
FB
191PPC_LD_OP(hbr_le, lduw);
192PPC_LD_OP(wbr_le, ldl);
193PPC_ST_OP(hbr_le, stw);
194PPC_ST_OP(wbr_le, stl);
d9bce9d9
JM
195#if defined(TARGET_PPC64)
196PPC_LD_OP_64(hbr_le, lduw);
197PPC_LD_OP_64(wbr_le, ldl);
198PPC_ST_OP_64(hbr_le, stw);
199PPC_ST_OP_64(wbr_le, stl);
200#endif
111bfab3 201
9a64fbe4 202/*** Integer load and store multiple ***/
d9bce9d9 203void OPPROTO glue(op_lmw, MEMSUFFIX) (void)
9a64fbe4 204{
76a66253 205 glue(do_lmw, MEMSUFFIX)(PARAM1);
9a64fbe4
FB
206 RETURN();
207}
208
d9bce9d9
JM
209#if defined(TARGET_PPC64)
210void OPPROTO glue(op_lmw_64, MEMSUFFIX) (void)
211{
212 glue(do_lmw_64, MEMSUFFIX)(PARAM1);
213 RETURN();
214}
215#endif
216
217void OPPROTO glue(op_lmw_le, MEMSUFFIX) (void)
9a64fbe4 218{
76a66253 219 glue(do_lmw_le, MEMSUFFIX)(PARAM1);
9a64fbe4
FB
220 RETURN();
221}
222
d9bce9d9
JM
223#if defined(TARGET_PPC64)
224void OPPROTO glue(op_lmw_le_64, MEMSUFFIX) (void)
225{
226 glue(do_lmw_le_64, MEMSUFFIX)(PARAM1);
227 RETURN();
228}
229#endif
230
231void OPPROTO glue(op_stmw, MEMSUFFIX) (void)
111bfab3 232{
76a66253 233 glue(do_stmw, MEMSUFFIX)(PARAM1);
111bfab3
FB
234 RETURN();
235}
236
d9bce9d9
JM
237#if defined(TARGET_PPC64)
238void OPPROTO glue(op_stmw_64, MEMSUFFIX) (void)
239{
240 glue(do_stmw_64, MEMSUFFIX)(PARAM1);
241 RETURN();
242}
243#endif
244
245void OPPROTO glue(op_stmw_le, MEMSUFFIX) (void)
111bfab3 246{
76a66253 247 glue(do_stmw_le, MEMSUFFIX)(PARAM1);
111bfab3
FB
248 RETURN();
249}
250
d9bce9d9
JM
251#if defined(TARGET_PPC64)
252void OPPROTO glue(op_stmw_le_64, MEMSUFFIX) (void)
253{
254 glue(do_stmw_le_64, MEMSUFFIX)(PARAM1);
255 RETURN();
256}
257#endif
258
9a64fbe4 259/*** Integer load and store strings ***/
d9bce9d9
JM
260void OPPROTO glue(op_lswi, MEMSUFFIX) (void)
261{
262 glue(do_lsw, MEMSUFFIX)(PARAM1);
263 RETURN();
264}
265
266#if defined(TARGET_PPC64)
267void OPPROTO glue(op_lswi_64, MEMSUFFIX) (void)
9a64fbe4 268{
d9bce9d9 269 glue(do_lsw_64, MEMSUFFIX)(PARAM1);
9a64fbe4
FB
270 RETURN();
271}
d9bce9d9 272#endif
9a64fbe4 273
d9bce9d9 274void OPPROTO glue(op_lswi_le, MEMSUFFIX) (void)
111bfab3 275{
d9bce9d9 276 glue(do_lsw_le, MEMSUFFIX)(PARAM1);
111bfab3
FB
277 RETURN();
278}
279
d9bce9d9
JM
280#if defined(TARGET_PPC64)
281void OPPROTO glue(op_lswi_le_64, MEMSUFFIX) (void)
282{
283 glue(do_lsw_le_64, MEMSUFFIX)(PARAM1);
284 RETURN();
285}
286#endif
287
9a64fbe4
FB
288/* PPC32 specification says we must generate an exception if
289 * rA is in the range of registers to be loaded.
290 * In an other hand, IBM says this is valid, but rA won't be loaded.
291 * For now, I'll follow the spec...
292 */
d9bce9d9
JM
293void OPPROTO glue(op_lswx, MEMSUFFIX) (void)
294{
295 /* Note: T1 comes from xer_bc then no cast is needed */
296 if (likely(T1 != 0)) {
297 if (unlikely((PARAM1 < PARAM2 && (PARAM1 + T1) > PARAM2) ||
298 (PARAM1 < PARAM3 && (PARAM1 + T1) > PARAM3))) {
e1833e1f
JM
299 do_raise_exception_err(POWERPC_EXCP_PROGRAM,
300 POWERPC_EXCP_INVAL |
301 POWERPC_EXCP_INVAL_LSWX);
d9bce9d9
JM
302 } else {
303 glue(do_lsw, MEMSUFFIX)(PARAM1);
304 }
305 }
306 RETURN();
307}
308
309#if defined(TARGET_PPC64)
310void OPPROTO glue(op_lswx_64, MEMSUFFIX) (void)
311{
312 /* Note: T1 comes from xer_bc then no cast is needed */
313 if (likely(T1 != 0)) {
314 if (unlikely((PARAM1 < PARAM2 && (PARAM1 + T1) > PARAM2) ||
315 (PARAM1 < PARAM3 && (PARAM1 + T1) > PARAM3))) {
e1833e1f
JM
316 do_raise_exception_err(POWERPC_EXCP_PROGRAM,
317 POWERPC_EXCP_INVAL |
318 POWERPC_EXCP_INVAL_LSWX);
d9bce9d9
JM
319 } else {
320 glue(do_lsw_64, MEMSUFFIX)(PARAM1);
321 }
322 }
323 RETURN();
324}
325#endif
326
327void OPPROTO glue(op_lswx_le, MEMSUFFIX) (void)
9a64fbe4 328{
d9bce9d9
JM
329 /* Note: T1 comes from xer_bc then no cast is needed */
330 if (likely(T1 != 0)) {
76a66253
JM
331 if (unlikely((PARAM1 < PARAM2 && (PARAM1 + T1) > PARAM2) ||
332 (PARAM1 < PARAM3 && (PARAM1 + T1) > PARAM3))) {
e1833e1f
JM
333 do_raise_exception_err(POWERPC_EXCP_PROGRAM,
334 POWERPC_EXCP_INVAL |
335 POWERPC_EXCP_INVAL_LSWX);
9a64fbe4 336 } else {
d9bce9d9 337 glue(do_lsw_le, MEMSUFFIX)(PARAM1);
9a64fbe4
FB
338 }
339 }
340 RETURN();
341}
342
d9bce9d9
JM
343#if defined(TARGET_PPC64)
344void OPPROTO glue(op_lswx_le_64, MEMSUFFIX) (void)
111bfab3 345{
d9bce9d9
JM
346 /* Note: T1 comes from xer_bc then no cast is needed */
347 if (likely(T1 != 0)) {
76a66253
JM
348 if (unlikely((PARAM1 < PARAM2 && (PARAM1 + T1) > PARAM2) ||
349 (PARAM1 < PARAM3 && (PARAM1 + T1) > PARAM3))) {
e1833e1f
JM
350 do_raise_exception_err(POWERPC_EXCP_PROGRAM,
351 POWERPC_EXCP_INVAL |
352 POWERPC_EXCP_INVAL_LSWX);
111bfab3 353 } else {
d9bce9d9 354 glue(do_lsw_le_64, MEMSUFFIX)(PARAM1);
111bfab3
FB
355 }
356 }
357 RETURN();
358}
d9bce9d9
JM
359#endif
360
361void OPPROTO glue(op_stsw, MEMSUFFIX) (void)
362{
363 glue(do_stsw, MEMSUFFIX)(PARAM1);
364 RETURN();
365}
366
367#if defined(TARGET_PPC64)
368void OPPROTO glue(op_stsw_64, MEMSUFFIX) (void)
369{
370 glue(do_stsw_64, MEMSUFFIX)(PARAM1);
371 RETURN();
372}
373#endif
111bfab3 374
d9bce9d9 375void OPPROTO glue(op_stsw_le, MEMSUFFIX) (void)
9a64fbe4 376{
d9bce9d9 377 glue(do_stsw_le, MEMSUFFIX)(PARAM1);
9a64fbe4
FB
378 RETURN();
379}
380
d9bce9d9
JM
381#if defined(TARGET_PPC64)
382void OPPROTO glue(op_stsw_le_64, MEMSUFFIX) (void)
111bfab3 383{
d9bce9d9 384 glue(do_stsw_le_64, MEMSUFFIX)(PARAM1);
111bfab3
FB
385 RETURN();
386}
d9bce9d9 387#endif
111bfab3 388
9a64fbe4
FB
389/*** Floating-point store ***/
390#define PPC_STF_OP(name, op) \
d9bce9d9
JM
391void OPPROTO glue(glue(op_st, name), MEMSUFFIX) (void) \
392{ \
393 glue(op, MEMSUFFIX)((uint32_t)T0, FT0); \
394 RETURN(); \
395}
396
397#if defined(TARGET_PPC64)
398#define PPC_STF_OP_64(name, op) \
399void OPPROTO glue(glue(glue(op_st, name), _64), MEMSUFFIX) (void) \
9a64fbe4 400{ \
d9bce9d9 401 glue(op, MEMSUFFIX)((uint64_t)T0, FT0); \
9a64fbe4
FB
402 RETURN(); \
403}
d9bce9d9 404#endif
9a64fbe4 405
477023a6
JM
406static inline void glue(stfs, MEMSUFFIX) (target_ulong EA, double d)
407{
408 glue(stfl, MEMSUFFIX)(EA, float64_to_float32(d, &env->fp_status));
409}
410
411static inline void glue(stfiwx, MEMSUFFIX) (target_ulong EA, double d)
412{
413 union {
414 double d;
415 uint64_t u;
416 } u;
417
418 /* Store the low order 32 bits without any conversion */
419 u.d = d;
420 glue(stl, MEMSUFFIX)(EA, u.u);
421}
422
9a64fbe4 423PPC_STF_OP(fd, stfq);
477023a6
JM
424PPC_STF_OP(fs, stfs);
425PPC_STF_OP(fiwx, stfiwx);
d9bce9d9
JM
426#if defined(TARGET_PPC64)
427PPC_STF_OP_64(fd, stfq);
477023a6
JM
428PPC_STF_OP_64(fs, stfs);
429PPC_STF_OP_64(fiwx, stfiwx);
d9bce9d9 430#endif
9a64fbe4 431
111bfab3
FB
432static inline void glue(stfqr, MEMSUFFIX) (target_ulong EA, double d)
433{
434 union {
435 double d;
436 uint64_t u;
437 } u;
438
439 u.d = d;
440 u.u = ((u.u & 0xFF00000000000000ULL) >> 56) |
441 ((u.u & 0x00FF000000000000ULL) >> 40) |
442 ((u.u & 0x0000FF0000000000ULL) >> 24) |
443 ((u.u & 0x000000FF00000000ULL) >> 8) |
444 ((u.u & 0x00000000FF000000ULL) << 8) |
445 ((u.u & 0x0000000000FF0000ULL) << 24) |
446 ((u.u & 0x000000000000FF00ULL) << 40) |
447 ((u.u & 0x00000000000000FFULL) << 56);
448 glue(stfq, MEMSUFFIX)(EA, u.d);
449}
450
477023a6 451static inline void glue(stfsr, MEMSUFFIX) (target_ulong EA, double d)
111bfab3
FB
452{
453 union {
454 float f;
455 uint32_t u;
456 } u;
457
477023a6 458 u.f = float64_to_float32(d, &env->fp_status);
111bfab3
FB
459 u.u = ((u.u & 0xFF000000UL) >> 24) |
460 ((u.u & 0x00FF0000ULL) >> 8) |
461 ((u.u & 0x0000FF00UL) << 8) |
462 ((u.u & 0x000000FFULL) << 24);
463 glue(stfl, MEMSUFFIX)(EA, u.f);
464}
465
477023a6
JM
466static inline void glue(stfiwxr, MEMSUFFIX) (target_ulong EA, double d)
467{
468 union {
469 double d;
470 uint64_t u;
471 } u;
472
473 /* Store the low order 32 bits without any conversion */
474 u.d = d;
475 u.u = ((u.u & 0xFF000000UL) >> 24) |
476 ((u.u & 0x00FF0000ULL) >> 8) |
477 ((u.u & 0x0000FF00UL) << 8) |
478 ((u.u & 0x000000FFULL) << 24);
479 glue(stl, MEMSUFFIX)(EA, u.u);
480}
481
482
111bfab3 483PPC_STF_OP(fd_le, stfqr);
477023a6
JM
484PPC_STF_OP(fs_le, stfsr);
485PPC_STF_OP(fiwx_le, stfiwxr);
d9bce9d9
JM
486#if defined(TARGET_PPC64)
487PPC_STF_OP_64(fd_le, stfqr);
477023a6
JM
488PPC_STF_OP_64(fs_le, stfsr);
489PPC_STF_OP_64(fiwx_le, stfiwxr);
d9bce9d9 490#endif
111bfab3 491
9a64fbe4
FB
492/*** Floating-point load ***/
493#define PPC_LDF_OP(name, op) \
d9bce9d9
JM
494void OPPROTO glue(glue(op_l, name), MEMSUFFIX) (void) \
495{ \
496 FT0 = glue(op, MEMSUFFIX)((uint32_t)T0); \
497 RETURN(); \
498}
499
500#if defined(TARGET_PPC64)
501#define PPC_LDF_OP_64(name, op) \
502void OPPROTO glue(glue(glue(op_l, name), _64), MEMSUFFIX) (void) \
9a64fbe4 503{ \
d9bce9d9 504 FT0 = glue(op, MEMSUFFIX)((uint64_t)T0); \
9a64fbe4
FB
505 RETURN(); \
506}
d9bce9d9 507#endif
9a64fbe4 508
477023a6
JM
509static inline double glue(ldfs, MEMSUFFIX) (target_ulong EA)
510{
511 return float32_to_float64(glue(ldfl, MEMSUFFIX)(EA), &env->fp_status);
512}
513
9a64fbe4 514PPC_LDF_OP(fd, ldfq);
477023a6 515PPC_LDF_OP(fs, ldfs);
d9bce9d9
JM
516#if defined(TARGET_PPC64)
517PPC_LDF_OP_64(fd, ldfq);
477023a6 518PPC_LDF_OP_64(fs, ldfs);
d9bce9d9 519#endif
9a64fbe4 520
111bfab3
FB
521static inline double glue(ldfqr, MEMSUFFIX) (target_ulong EA)
522{
523 union {
524 double d;
525 uint64_t u;
526 } u;
527
528 u.d = glue(ldfq, MEMSUFFIX)(EA);
529 u.u = ((u.u & 0xFF00000000000000ULL) >> 56) |
530 ((u.u & 0x00FF000000000000ULL) >> 40) |
531 ((u.u & 0x0000FF0000000000ULL) >> 24) |
532 ((u.u & 0x000000FF00000000ULL) >> 8) |
533 ((u.u & 0x00000000FF000000ULL) << 8) |
534 ((u.u & 0x0000000000FF0000ULL) << 24) |
535 ((u.u & 0x000000000000FF00ULL) << 40) |
536 ((u.u & 0x00000000000000FFULL) << 56);
537
538 return u.d;
539}
540
477023a6 541static inline double glue(ldfsr, MEMSUFFIX) (target_ulong EA)
111bfab3
FB
542{
543 union {
544 float f;
545 uint32_t u;
546 } u;
547
548 u.f = glue(ldfl, MEMSUFFIX)(EA);
549 u.u = ((u.u & 0xFF000000UL) >> 24) |
550 ((u.u & 0x00FF0000ULL) >> 8) |
551 ((u.u & 0x0000FF00UL) << 8) |
552 ((u.u & 0x000000FFULL) << 24);
553
477023a6 554 return float32_to_float64(u.f, &env->fp_status);
111bfab3
FB
555}
556
557PPC_LDF_OP(fd_le, ldfqr);
477023a6 558PPC_LDF_OP(fs_le, ldfsr);
d9bce9d9
JM
559#if defined(TARGET_PPC64)
560PPC_LDF_OP_64(fd_le, ldfqr);
477023a6 561PPC_LDF_OP_64(fs_le, ldfsr);
d9bce9d9 562#endif
111bfab3 563
985a19d6 564/* Load and set reservation */
d9bce9d9
JM
565void OPPROTO glue(op_lwarx, MEMSUFFIX) (void)
566{
567 if (unlikely(T0 & 0x03)) {
e1833e1f 568 do_raise_exception(POWERPC_EXCP_ALIGN);
d9bce9d9
JM
569 } else {
570 T1 = glue(ldl, MEMSUFFIX)((uint32_t)T0);
36081602 571 env->reserve = (uint32_t)T0;
d9bce9d9
JM
572 }
573 RETURN();
574}
575
576#if defined(TARGET_PPC64)
577void OPPROTO glue(op_lwarx_64, MEMSUFFIX) (void)
578{
579 if (unlikely(T0 & 0x03)) {
e1833e1f 580 do_raise_exception(POWERPC_EXCP_ALIGN);
d9bce9d9
JM
581 } else {
582 T1 = glue(ldl, MEMSUFFIX)((uint64_t)T0);
36081602 583 env->reserve = (uint64_t)T0;
d9bce9d9
JM
584 }
585 RETURN();
586}
587
426613db
JM
588void OPPROTO glue(op_ldarx, MEMSUFFIX) (void)
589{
590 if (unlikely(T0 & 0x03)) {
e1833e1f 591 do_raise_exception(POWERPC_EXCP_ALIGN);
426613db
JM
592 } else {
593 T1 = glue(ldq, MEMSUFFIX)((uint32_t)T0);
36081602 594 env->reserve = (uint32_t)T0;
426613db
JM
595 }
596 RETURN();
597}
598
d9bce9d9
JM
599void OPPROTO glue(op_ldarx_64, MEMSUFFIX) (void)
600{
601 if (unlikely(T0 & 0x03)) {
e1833e1f 602 do_raise_exception(POWERPC_EXCP_ALIGN);
d9bce9d9
JM
603 } else {
604 T1 = glue(ldq, MEMSUFFIX)((uint64_t)T0);
36081602 605 env->reserve = (uint64_t)T0;
d9bce9d9
JM
606 }
607 RETURN();
608}
609#endif
610
611void OPPROTO glue(op_lwarx_le, MEMSUFFIX) (void)
612{
613 if (unlikely(T0 & 0x03)) {
e1833e1f 614 do_raise_exception(POWERPC_EXCP_ALIGN);
d9bce9d9
JM
615 } else {
616 T1 = glue(ld32r, MEMSUFFIX)((uint32_t)T0);
36081602 617 env->reserve = (uint32_t)T0;
d9bce9d9
JM
618 }
619 RETURN();
620}
621
622#if defined(TARGET_PPC64)
623void OPPROTO glue(op_lwarx_le_64, MEMSUFFIX) (void)
985a19d6 624{
76a66253 625 if (unlikely(T0 & 0x03)) {
e1833e1f 626 do_raise_exception(POWERPC_EXCP_ALIGN);
985a19d6 627 } else {
d9bce9d9 628 T1 = glue(ld32r, MEMSUFFIX)((uint64_t)T0);
36081602 629 env->reserve = (uint64_t)T0;
985a19d6
FB
630 }
631 RETURN();
632}
633
426613db
JM
634void OPPROTO glue(op_ldarx_le, MEMSUFFIX) (void)
635{
636 if (unlikely(T0 & 0x03)) {
e1833e1f 637 do_raise_exception(POWERPC_EXCP_ALIGN);
426613db
JM
638 } else {
639 T1 = glue(ld64r, MEMSUFFIX)((uint32_t)T0);
36081602 640 env->reserve = (uint32_t)T0;
426613db
JM
641 }
642 RETURN();
643}
644
d9bce9d9 645void OPPROTO glue(op_ldarx_le_64, MEMSUFFIX) (void)
111bfab3 646{
76a66253 647 if (unlikely(T0 & 0x03)) {
e1833e1f 648 do_raise_exception(POWERPC_EXCP_ALIGN);
111bfab3 649 } else {
d9bce9d9 650 T1 = glue(ld64r, MEMSUFFIX)((uint64_t)T0);
36081602 651 env->reserve = (uint64_t)T0;
111bfab3
FB
652 }
653 RETURN();
654}
d9bce9d9 655#endif
111bfab3 656
9a64fbe4 657/* Store with reservation */
d9bce9d9
JM
658void OPPROTO glue(op_stwcx, MEMSUFFIX) (void)
659{
660 if (unlikely(T0 & 0x03)) {
e1833e1f 661 do_raise_exception(POWERPC_EXCP_ALIGN);
d9bce9d9 662 } else {
36081602 663 if (unlikely(env->reserve != (uint32_t)T0)) {
966439a6 664 env->crf[0] = xer_so;
d9bce9d9
JM
665 } else {
666 glue(stl, MEMSUFFIX)((uint32_t)T0, T1);
966439a6 667 env->crf[0] = xer_so | 0x02;
d9bce9d9
JM
668 }
669 }
36081602 670 env->reserve = -1;
d9bce9d9
JM
671 RETURN();
672}
673
674#if defined(TARGET_PPC64)
675void OPPROTO glue(op_stwcx_64, MEMSUFFIX) (void)
676{
677 if (unlikely(T0 & 0x03)) {
e1833e1f 678 do_raise_exception(POWERPC_EXCP_ALIGN);
d9bce9d9 679 } else {
36081602 680 if (unlikely(env->reserve != (uint64_t)T0)) {
966439a6 681 env->crf[0] = xer_so;
d9bce9d9
JM
682 } else {
683 glue(stl, MEMSUFFIX)((uint64_t)T0, T1);
966439a6 684 env->crf[0] = xer_so | 0x02;
d9bce9d9
JM
685 }
686 }
36081602 687 env->reserve = -1;
d9bce9d9
JM
688 RETURN();
689}
690
426613db
JM
691void OPPROTO glue(op_stdcx, MEMSUFFIX) (void)
692{
693 if (unlikely(T0 & 0x03)) {
e1833e1f 694 do_raise_exception(POWERPC_EXCP_ALIGN);
426613db 695 } else {
36081602 696 if (unlikely(env->reserve != (uint32_t)T0)) {
966439a6 697 env->crf[0] = xer_so;
426613db
JM
698 } else {
699 glue(stq, MEMSUFFIX)((uint32_t)T0, T1);
966439a6 700 env->crf[0] = xer_so | 0x02;
426613db
JM
701 }
702 }
36081602 703 env->reserve = -1;
426613db
JM
704 RETURN();
705}
706
d9bce9d9 707void OPPROTO glue(op_stdcx_64, MEMSUFFIX) (void)
9a64fbe4 708{
76a66253 709 if (unlikely(T0 & 0x03)) {
e1833e1f 710 do_raise_exception(POWERPC_EXCP_ALIGN);
9a64fbe4 711 } else {
36081602 712 if (unlikely(env->reserve != (uint64_t)T0)) {
966439a6 713 env->crf[0] = xer_so;
9a64fbe4 714 } else {
d9bce9d9 715 glue(stq, MEMSUFFIX)((uint64_t)T0, T1);
966439a6 716 env->crf[0] = xer_so | 0x02;
d9bce9d9
JM
717 }
718 }
36081602 719 env->reserve = -1;
d9bce9d9
JM
720 RETURN();
721}
722#endif
723
724void OPPROTO glue(op_stwcx_le, MEMSUFFIX) (void)
725{
726 if (unlikely(T0 & 0x03)) {
e1833e1f 727 do_raise_exception(POWERPC_EXCP_ALIGN);
d9bce9d9 728 } else {
36081602 729 if (unlikely(env->reserve != (uint32_t)T0)) {
966439a6 730 env->crf[0] = xer_so;
d9bce9d9
JM
731 } else {
732 glue(st32r, MEMSUFFIX)((uint32_t)T0, T1);
966439a6 733 env->crf[0] = xer_so | 0x02;
9a64fbe4
FB
734 }
735 }
36081602 736 env->reserve = -1;
9a64fbe4
FB
737 RETURN();
738}
739
d9bce9d9
JM
740#if defined(TARGET_PPC64)
741void OPPROTO glue(op_stwcx_le_64, MEMSUFFIX) (void)
111bfab3 742{
76a66253 743 if (unlikely(T0 & 0x03)) {
e1833e1f 744 do_raise_exception(POWERPC_EXCP_ALIGN);
111bfab3 745 } else {
36081602 746 if (unlikely(env->reserve != (uint64_t)T0)) {
966439a6 747 env->crf[0] = xer_so;
111bfab3 748 } else {
d9bce9d9 749 glue(st32r, MEMSUFFIX)((uint64_t)T0, T1);
966439a6 750 env->crf[0] = xer_so | 0x02;
111bfab3
FB
751 }
752 }
36081602 753 env->reserve = -1;
111bfab3
FB
754 RETURN();
755}
756
426613db
JM
757void OPPROTO glue(op_stdcx_le, MEMSUFFIX) (void)
758{
759 if (unlikely(T0 & 0x03)) {
e1833e1f 760 do_raise_exception(POWERPC_EXCP_ALIGN);
426613db 761 } else {
36081602 762 if (unlikely(env->reserve != (uint32_t)T0)) {
966439a6 763 env->crf[0] = xer_so;
426613db
JM
764 } else {
765 glue(st64r, MEMSUFFIX)((uint32_t)T0, T1);
966439a6 766 env->crf[0] = xer_so | 0x02;
426613db
JM
767 }
768 }
36081602 769 env->reserve = -1;
426613db
JM
770 RETURN();
771}
772
d9bce9d9
JM
773void OPPROTO glue(op_stdcx_le_64, MEMSUFFIX) (void)
774{
775 if (unlikely(T0 & 0x03)) {
e1833e1f 776 do_raise_exception(POWERPC_EXCP_ALIGN);
d9bce9d9 777 } else {
36081602 778 if (unlikely(env->reserve != (uint64_t)T0)) {
966439a6 779 env->crf[0] = xer_so;
d9bce9d9
JM
780 } else {
781 glue(st64r, MEMSUFFIX)((uint64_t)T0, T1);
966439a6 782 env->crf[0] = xer_so | 0x02;
d9bce9d9
JM
783 }
784 }
36081602 785 env->reserve = -1;
d9bce9d9
JM
786 RETURN();
787}
788#endif
789
d63001d1
JM
790void OPPROTO glue(op_dcbz_l32, MEMSUFFIX) (void)
791{
792 glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x00), 0);
793 glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x04), 0);
794 glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x08), 0);
795 glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x0C), 0);
796 glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x10), 0);
797 glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x14), 0);
798 glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x18), 0);
799 glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x1C), 0);
800 RETURN();
801}
802
803void OPPROTO glue(op_dcbz_l64, MEMSUFFIX) (void)
d9bce9d9
JM
804{
805 glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x00), 0);
806 glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x04), 0);
807 glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x08), 0);
808 glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x0C), 0);
809 glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x10), 0);
810 glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x14), 0);
811 glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x18), 0);
812 glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x1C), 0);
d9bce9d9
JM
813 glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x20UL), 0);
814 glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x24UL), 0);
815 glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x28UL), 0);
816 glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x2CUL), 0);
817 glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x30UL), 0);
818 glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x34UL), 0);
819 glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x38UL), 0);
820 glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x3CUL), 0);
d63001d1
JM
821 RETURN();
822}
823
824void OPPROTO glue(op_dcbz_l128, MEMSUFFIX) (void)
825{
826 glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x00), 0);
827 glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x04), 0);
828 glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x08), 0);
829 glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x0C), 0);
830 glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x10), 0);
831 glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x14), 0);
832 glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x18), 0);
833 glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x1C), 0);
834 glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x20UL), 0);
835 glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x24UL), 0);
836 glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x28UL), 0);
837 glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x2CUL), 0);
838 glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x30UL), 0);
839 glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x34UL), 0);
840 glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x38UL), 0);
841 glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x3CUL), 0);
842 glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x40UL), 0);
843 glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x44UL), 0);
844 glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x48UL), 0);
845 glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x4CUL), 0);
846 glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x50UL), 0);
847 glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x54UL), 0);
848 glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x58UL), 0);
849 glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x5CUL), 0);
850 glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x60UL), 0);
851 glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x64UL), 0);
852 glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x68UL), 0);
853 glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x6CUL), 0);
854 glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x70UL), 0);
855 glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x74UL), 0);
856 glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x78UL), 0);
857 glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x7CUL), 0);
858 RETURN();
859}
860
861void OPPROTO glue(op_dcbz, MEMSUFFIX) (void)
862{
863 glue(do_dcbz, MEMSUFFIX)();
d9bce9d9
JM
864 RETURN();
865}
866
867#if defined(TARGET_PPC64)
d63001d1
JM
868void OPPROTO glue(op_dcbz_l32_64, MEMSUFFIX) (void)
869{
870 glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x00), 0);
871 glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x04), 0);
872 glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x08), 0);
873 glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x0C), 0);
874 glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x10), 0);
875 glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x14), 0);
876 glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x18), 0);
877 glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x1C), 0);
878 RETURN();
879}
880
881void OPPROTO glue(op_dcbz_l64_64, MEMSUFFIX) (void)
9a64fbe4 882{
d9bce9d9
JM
883 glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x00), 0);
884 glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x04), 0);
885 glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x08), 0);
886 glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x0C), 0);
887 glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x10), 0);
888 glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x14), 0);
889 glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x18), 0);
890 glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x1C), 0);
d9bce9d9
JM
891 glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x20UL), 0);
892 glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x24UL), 0);
893 glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x28UL), 0);
894 glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x2CUL), 0);
895 glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x30UL), 0);
896 glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x34UL), 0);
897 glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x38UL), 0);
898 glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x3CUL), 0);
d63001d1
JM
899 RETURN();
900}
901
902void OPPROTO glue(op_dcbz_l128_64, MEMSUFFIX) (void)
903{
904 glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x00), 0);
905 glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x04), 0);
906 glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x08), 0);
907 glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x0C), 0);
908 glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x10), 0);
909 glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x14), 0);
910 glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x18), 0);
911 glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x1C), 0);
912 glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x20UL), 0);
913 glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x24UL), 0);
914 glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x28UL), 0);
915 glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x2CUL), 0);
916 glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x30UL), 0);
917 glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x34UL), 0);
918 glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x38UL), 0);
919 glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x3CUL), 0);
920 glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x40UL), 0);
921 glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x44UL), 0);
922 glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x48UL), 0);
923 glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x4CUL), 0);
924 glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x50UL), 0);
925 glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x54UL), 0);
926 glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x58UL), 0);
927 glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x5CUL), 0);
928 glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x60UL), 0);
929 glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x64UL), 0);
930 glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x68UL), 0);
931 glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x6CUL), 0);
932 glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x70UL), 0);
933 glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x74UL), 0);
934 glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x78UL), 0);
935 glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x7CUL), 0);
936 RETURN();
937}
938
939void OPPROTO glue(op_dcbz_64, MEMSUFFIX) (void)
940{
941 glue(do_dcbz_64, MEMSUFFIX)();
9a64fbe4
FB
942 RETURN();
943}
d9bce9d9 944#endif
9a64fbe4 945
36f69651
JM
946/* Instruction cache block invalidate */
947void OPPROTO glue(op_icbi, MEMSUFFIX) (void)
948{
949 glue(do_icbi, MEMSUFFIX)();
950 RETURN();
951}
952
953#if defined(TARGET_PPC64)
954void OPPROTO glue(op_icbi_64, MEMSUFFIX) (void)
955{
956 glue(do_icbi_64, MEMSUFFIX)();
957 RETURN();
958}
959#endif
960
9a64fbe4 961/* External access */
d9bce9d9
JM
962void OPPROTO glue(op_eciwx, MEMSUFFIX) (void)
963{
964 T1 = glue(ldl, MEMSUFFIX)((uint32_t)T0);
965 RETURN();
966}
967
968#if defined(TARGET_PPC64)
969void OPPROTO glue(op_eciwx_64, MEMSUFFIX) (void)
970{
971 T1 = glue(ldl, MEMSUFFIX)((uint64_t)T0);
972 RETURN();
973}
974#endif
975
976void OPPROTO glue(op_ecowx, MEMSUFFIX) (void)
977{
978 glue(stl, MEMSUFFIX)((uint32_t)T0, T1);
979 RETURN();
980}
981
982#if defined(TARGET_PPC64)
983void OPPROTO glue(op_ecowx_64, MEMSUFFIX) (void)
9a64fbe4 984{
d9bce9d9 985 glue(stl, MEMSUFFIX)((uint64_t)T0, T1);
9a64fbe4
FB
986 RETURN();
987}
d9bce9d9 988#endif
9a64fbe4 989
d9bce9d9 990void OPPROTO glue(op_eciwx_le, MEMSUFFIX) (void)
9a64fbe4 991{
d9bce9d9 992 T1 = glue(ld32r, MEMSUFFIX)((uint32_t)T0);
9a64fbe4
FB
993 RETURN();
994}
995
d9bce9d9
JM
996#if defined(TARGET_PPC64)
997void OPPROTO glue(op_eciwx_le_64, MEMSUFFIX) (void)
111bfab3 998{
d9bce9d9 999 T1 = glue(ld32r, MEMSUFFIX)((uint64_t)T0);
111bfab3
FB
1000 RETURN();
1001}
d9bce9d9 1002#endif
111bfab3 1003
d9bce9d9 1004void OPPROTO glue(op_ecowx_le, MEMSUFFIX) (void)
111bfab3 1005{
d9bce9d9 1006 glue(st32r, MEMSUFFIX)((uint32_t)T0, T1);
111bfab3
FB
1007 RETURN();
1008}
1009
d9bce9d9
JM
1010#if defined(TARGET_PPC64)
1011void OPPROTO glue(op_ecowx_le_64, MEMSUFFIX) (void)
1012{
1013 glue(st32r, MEMSUFFIX)((uint64_t)T0, T1);
1014 RETURN();
1015}
1016#endif
1017
76a66253
JM
1018/* XXX: those micro-ops need tests ! */
1019/* PowerPC 601 specific instructions (POWER bridge) */
1020void OPPROTO glue(op_POWER_lscbx, MEMSUFFIX) (void)
1021{
1022 /* When byte count is 0, do nothing */
d9bce9d9 1023 if (likely(T1 != 0)) {
76a66253
JM
1024 glue(do_POWER_lscbx, MEMSUFFIX)(PARAM1, PARAM2, PARAM3);
1025 }
1026 RETURN();
1027}
1028
1029/* POWER2 quad load and store */
1030/* XXX: TAGs are not managed */
1031void OPPROTO glue(op_POWER2_lfq, MEMSUFFIX) (void)
1032{
1033 glue(do_POWER2_lfq, MEMSUFFIX)();
1034 RETURN();
1035}
1036
1037void glue(op_POWER2_lfq_le, MEMSUFFIX) (void)
1038{
1039 glue(do_POWER2_lfq_le, MEMSUFFIX)();
1040 RETURN();
1041}
1042
1043void OPPROTO glue(op_POWER2_stfq, MEMSUFFIX) (void)
1044{
1045 glue(do_POWER2_stfq, MEMSUFFIX)();
1046 RETURN();
1047}
1048
1049void OPPROTO glue(op_POWER2_stfq_le, MEMSUFFIX) (void)
1050{
1051 glue(do_POWER2_stfq_le, MEMSUFFIX)();
1052 RETURN();
1053}
1054
35cdaad6 1055#if defined(TARGET_PPCEMB)
0487d6a8
JM
1056/* SPE extension */
1057#define _PPC_SPE_LD_OP(name, op) \
1058void OPPROTO glue(glue(op_spe_l, name), MEMSUFFIX) (void) \
1059{ \
1060 T1_64 = glue(op, MEMSUFFIX)((uint32_t)T0); \
1061 RETURN(); \
1062}
1063
1064#if defined(TARGET_PPC64)
1065#define _PPC_SPE_LD_OP_64(name, op) \
1066void OPPROTO glue(glue(glue(op_spe_l, name), _64), MEMSUFFIX) (void) \
1067{ \
1068 T1_64 = glue(op, MEMSUFFIX)((uint64_t)T0); \
1069 RETURN(); \
1070}
1071#define PPC_SPE_LD_OP(name, op) \
1072_PPC_SPE_LD_OP(name, op); \
1073_PPC_SPE_LD_OP_64(name, op)
1074#else
1075#define PPC_SPE_LD_OP(name, op) \
1076_PPC_SPE_LD_OP(name, op)
1077#endif
1078
1079
1080#define _PPC_SPE_ST_OP(name, op) \
1081void OPPROTO glue(glue(op_spe_st, name), MEMSUFFIX) (void) \
1082{ \
1083 glue(op, MEMSUFFIX)((uint32_t)T0, T1_64); \
1084 RETURN(); \
1085}
1086
1087#if defined(TARGET_PPC64)
1088#define _PPC_SPE_ST_OP_64(name, op) \
1089void OPPROTO glue(glue(glue(op_spe_st, name), _64), MEMSUFFIX) (void) \
1090{ \
1091 glue(op, MEMSUFFIX)((uint64_t)T0, T1_64); \
1092 RETURN(); \
1093}
1094#define PPC_SPE_ST_OP(name, op) \
1095_PPC_SPE_ST_OP(name, op); \
1096_PPC_SPE_ST_OP_64(name, op)
1097#else
1098#define PPC_SPE_ST_OP(name, op) \
1099_PPC_SPE_ST_OP(name, op)
1100#endif
1101
1102#if !defined(TARGET_PPC64)
1103PPC_SPE_LD_OP(dd, ldq);
1104PPC_SPE_ST_OP(dd, stq);
1105PPC_SPE_LD_OP(dd_le, ld64r);
1106PPC_SPE_ST_OP(dd_le, st64r);
1107#endif
1108static inline uint64_t glue(spe_ldw, MEMSUFFIX) (target_ulong EA)
1109{
1110 uint64_t ret;
1111 ret = (uint64_t)glue(ldl, MEMSUFFIX)(EA) << 32;
1112 ret |= (uint64_t)glue(ldl, MEMSUFFIX)(EA + 4);
1113 return ret;
1114}
1115PPC_SPE_LD_OP(dw, spe_ldw);
1116static inline void glue(spe_stdw, MEMSUFFIX) (target_ulong EA, uint64_t data)
1117{
1118 glue(stl, MEMSUFFIX)(EA, data >> 32);
1119 glue(stl, MEMSUFFIX)(EA + 4, data);
1120}
1121PPC_SPE_ST_OP(dw, spe_stdw);
1122static inline uint64_t glue(spe_ldw_le, MEMSUFFIX) (target_ulong EA)
1123{
1124 uint64_t ret;
1125 ret = (uint64_t)glue(ld32r, MEMSUFFIX)(EA) << 32;
1126 ret |= (uint64_t)glue(ld32r, MEMSUFFIX)(EA + 4);
1127 return ret;
1128}
1129PPC_SPE_LD_OP(dw_le, spe_ldw_le);
1130static inline void glue(spe_stdw_le, MEMSUFFIX) (target_ulong EA,
1131 uint64_t data)
1132{
1133 glue(st32r, MEMSUFFIX)(EA, data >> 32);
1134 glue(st32r, MEMSUFFIX)(EA + 4, data);
1135}
1136PPC_SPE_ST_OP(dw_le, spe_stdw_le);
1137static inline uint64_t glue(spe_ldh, MEMSUFFIX) (target_ulong EA)
1138{
1139 uint64_t ret;
1140 ret = (uint64_t)glue(lduw, MEMSUFFIX)(EA) << 48;
1141 ret |= (uint64_t)glue(lduw, MEMSUFFIX)(EA + 2) << 32;
1142 ret |= (uint64_t)glue(lduw, MEMSUFFIX)(EA + 4) << 16;
1143 ret |= (uint64_t)glue(lduw, MEMSUFFIX)(EA + 6);
1144 return ret;
1145}
1146PPC_SPE_LD_OP(dh, spe_ldh);
1147static inline void glue(spe_stdh, MEMSUFFIX) (target_ulong EA, uint64_t data)
1148{
1149 glue(stw, MEMSUFFIX)(EA, data >> 48);
1150 glue(stw, MEMSUFFIX)(EA + 2, data >> 32);
1151 glue(stw, MEMSUFFIX)(EA + 4, data >> 16);
1152 glue(stw, MEMSUFFIX)(EA + 6, data);
1153}
1154PPC_SPE_ST_OP(dh, spe_stdh);
1155static inline uint64_t glue(spe_ldh_le, MEMSUFFIX) (target_ulong EA)
1156{
1157 uint64_t ret;
1158 ret = (uint64_t)glue(ld16r, MEMSUFFIX)(EA) << 48;
1159 ret |= (uint64_t)glue(ld16r, MEMSUFFIX)(EA + 2) << 32;
1160 ret |= (uint64_t)glue(ld16r, MEMSUFFIX)(EA + 4) << 16;
1161 ret |= (uint64_t)glue(ld16r, MEMSUFFIX)(EA + 6);
1162 return ret;
1163}
1164PPC_SPE_LD_OP(dh_le, spe_ldh_le);
1165static inline void glue(spe_stdh_le, MEMSUFFIX) (target_ulong EA,
1166 uint64_t data)
1167{
1168 glue(st16r, MEMSUFFIX)(EA, data >> 48);
1169 glue(st16r, MEMSUFFIX)(EA + 2, data >> 32);
1170 glue(st16r, MEMSUFFIX)(EA + 4, data >> 16);
1171 glue(st16r, MEMSUFFIX)(EA + 6, data);
1172}
1173PPC_SPE_ST_OP(dh_le, spe_stdh_le);
1174static inline uint64_t glue(spe_lwhe, MEMSUFFIX) (target_ulong EA)
1175{
1176 uint64_t ret;
1177 ret = (uint64_t)glue(lduw, MEMSUFFIX)(EA) << 48;
1178 ret |= (uint64_t)glue(lduw, MEMSUFFIX)(EA + 2) << 16;
1179 return ret;
1180}
1181PPC_SPE_LD_OP(whe, spe_lwhe);
1182static inline void glue(spe_stwhe, MEMSUFFIX) (target_ulong EA, uint64_t data)
1183{
1184 glue(stw, MEMSUFFIX)(EA, data >> 48);
1185 glue(stw, MEMSUFFIX)(EA + 2, data >> 16);
1186}
1187PPC_SPE_ST_OP(whe, spe_stwhe);
1188static inline uint64_t glue(spe_lwhe_le, MEMSUFFIX) (target_ulong EA)
1189{
1190 uint64_t ret;
1191 ret = (uint64_t)glue(ld16r, MEMSUFFIX)(EA) << 48;
1192 ret |= (uint64_t)glue(ld16r, MEMSUFFIX)(EA + 2) << 16;
1193 return ret;
1194}
1195PPC_SPE_LD_OP(whe_le, spe_lwhe_le);
1196static inline void glue(spe_stwhe_le, MEMSUFFIX) (target_ulong EA,
1197 uint64_t data)
1198{
1199 glue(st16r, MEMSUFFIX)(EA, data >> 48);
1200 glue(st16r, MEMSUFFIX)(EA + 2, data >> 16);
1201}
1202PPC_SPE_ST_OP(whe_le, spe_stwhe_le);
1203static inline uint64_t glue(spe_lwhou, MEMSUFFIX) (target_ulong EA)
1204{
1205 uint64_t ret;
1206 ret = (uint64_t)glue(lduw, MEMSUFFIX)(EA) << 32;
1207 ret |= (uint64_t)glue(lduw, MEMSUFFIX)(EA + 2);
1208 return ret;
1209}
1210PPC_SPE_LD_OP(whou, spe_lwhou);
1211static inline uint64_t glue(spe_lwhos, MEMSUFFIX) (target_ulong EA)
1212{
1213 uint64_t ret;
1214 ret = ((uint64_t)((int32_t)glue(ldsw, MEMSUFFIX)(EA))) << 32;
1215 ret |= (uint64_t)((int32_t)glue(ldsw, MEMSUFFIX)(EA + 2));
1216 return ret;
1217}
1218PPC_SPE_LD_OP(whos, spe_lwhos);
1219static inline void glue(spe_stwho, MEMSUFFIX) (target_ulong EA, uint64_t data)
1220{
1221 glue(stw, MEMSUFFIX)(EA, data >> 32);
1222 glue(stw, MEMSUFFIX)(EA + 2, data);
1223}
1224PPC_SPE_ST_OP(who, spe_stwho);
1225static inline uint64_t glue(spe_lwhou_le, MEMSUFFIX) (target_ulong EA)
1226{
1227 uint64_t ret;
1228 ret = (uint64_t)glue(ld16r, MEMSUFFIX)(EA) << 32;
1229 ret |= (uint64_t)glue(ld16r, MEMSUFFIX)(EA + 2);
1230 return ret;
1231}
1232PPC_SPE_LD_OP(whou_le, spe_lwhou_le);
1233static inline uint64_t glue(spe_lwhos_le, MEMSUFFIX) (target_ulong EA)
1234{
1235 uint64_t ret;
1236 ret = ((uint64_t)((int32_t)glue(ld16rs, MEMSUFFIX)(EA))) << 32;
1237 ret |= (uint64_t)((int32_t)glue(ld16rs, MEMSUFFIX)(EA + 2));
1238 return ret;
1239}
1240PPC_SPE_LD_OP(whos_le, spe_lwhos_le);
1241static inline void glue(spe_stwho_le, MEMSUFFIX) (target_ulong EA,
1242 uint64_t data)
1243{
1244 glue(st16r, MEMSUFFIX)(EA, data >> 32);
1245 glue(st16r, MEMSUFFIX)(EA + 2, data);
1246}
1247PPC_SPE_ST_OP(who_le, spe_stwho_le);
1248#if !defined(TARGET_PPC64)
1249static inline void glue(spe_stwwo, MEMSUFFIX) (target_ulong EA, uint64_t data)
1250{
1251 glue(stl, MEMSUFFIX)(EA, data);
1252}
1253PPC_SPE_ST_OP(wwo, spe_stwwo);
1254static inline void glue(spe_stwwo_le, MEMSUFFIX) (target_ulong EA,
36081602 1255 uint64_t data)
0487d6a8
JM
1256{
1257 glue(st32r, MEMSUFFIX)(EA, data);
1258}
1259PPC_SPE_ST_OP(wwo_le, spe_stwwo_le);
1260#endif
1261static inline uint64_t glue(spe_lh, MEMSUFFIX) (target_ulong EA)
1262{
1263 uint16_t tmp;
1264 tmp = glue(lduw, MEMSUFFIX)(EA);
1265 return ((uint64_t)tmp << 48) | ((uint64_t)tmp << 16);
1266}
1267PPC_SPE_LD_OP(h, spe_lh);
1268static inline uint64_t glue(spe_lh_le, MEMSUFFIX) (target_ulong EA)
1269{
1270 uint16_t tmp;
1271 tmp = glue(ld16r, MEMSUFFIX)(EA);
1272 return ((uint64_t)tmp << 48) | ((uint64_t)tmp << 16);
1273}
1274PPC_SPE_LD_OP(h_le, spe_lh_le);
1275static inline uint64_t glue(spe_lwwsplat, MEMSUFFIX) (target_ulong EA)
1276{
1277 uint32_t tmp;
1278 tmp = glue(ldl, MEMSUFFIX)(EA);
1279 return ((uint64_t)tmp << 32) | (uint64_t)tmp;
1280}
1281PPC_SPE_LD_OP(wwsplat, spe_lwwsplat);
1282static inline uint64_t glue(spe_lwwsplat_le, MEMSUFFIX) (target_ulong EA)
1283{
1284 uint32_t tmp;
1285 tmp = glue(ld32r, MEMSUFFIX)(EA);
1286 return ((uint64_t)tmp << 32) | (uint64_t)tmp;
1287}
1288PPC_SPE_LD_OP(wwsplat_le, spe_lwwsplat_le);
1289static inline uint64_t glue(spe_lwhsplat, MEMSUFFIX) (target_ulong EA)
1290{
1291 uint64_t ret;
1292 uint16_t tmp;
1293 tmp = glue(lduw, MEMSUFFIX)(EA);
1294 ret = ((uint64_t)tmp << 48) | ((uint64_t)tmp << 32);
1295 tmp = glue(lduw, MEMSUFFIX)(EA + 2);
1296 ret |= ((uint64_t)tmp << 16) | (uint64_t)tmp;
1297 return ret;
1298}
1299PPC_SPE_LD_OP(whsplat, spe_lwhsplat);
1300static inline uint64_t glue(spe_lwhsplat_le, MEMSUFFIX) (target_ulong EA)
1301{
1302 uint64_t ret;
1303 uint16_t tmp;
1304 tmp = glue(ld16r, MEMSUFFIX)(EA);
1305 ret = ((uint64_t)tmp << 48) | ((uint64_t)tmp << 32);
1306 tmp = glue(ld16r, MEMSUFFIX)(EA + 2);
1307 ret |= ((uint64_t)tmp << 16) | (uint64_t)tmp;
1308 return ret;
1309}
1310PPC_SPE_LD_OP(whsplat_le, spe_lwhsplat_le);
35cdaad6 1311#endif /* defined(TARGET_PPCEMB) */
0487d6a8 1312
9a64fbe4 1313#undef MEMSUFFIX
This page took 0.309823 seconds and 4 git commands to generate.