root / target-ppc / op_mem.h @ 01a4afeb
History | View | Annotate | Download (17.5 kB)
1 |
/*
|
---|---|
2 |
* PowerPC emulation micro-operations for qemu.
|
3 |
*
|
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 |
*/
|
20 |
|
21 |
#include "op_mem_access.h" |
22 |
|
23 |
/*** Integer load and store multiple ***/
|
24 |
void OPPROTO glue(op_lmw, MEMSUFFIX) (void) |
25 |
{ |
26 |
glue(do_lmw, MEMSUFFIX)(PARAM1); |
27 |
RETURN(); |
28 |
} |
29 |
|
30 |
#if defined(TARGET_PPC64)
|
31 |
void OPPROTO glue(op_lmw_64, MEMSUFFIX) (void) |
32 |
{ |
33 |
glue(do_lmw_64, MEMSUFFIX)(PARAM1); |
34 |
RETURN(); |
35 |
} |
36 |
#endif
|
37 |
|
38 |
void OPPROTO glue(op_lmw_le, MEMSUFFIX) (void) |
39 |
{ |
40 |
glue(do_lmw_le, MEMSUFFIX)(PARAM1); |
41 |
RETURN(); |
42 |
} |
43 |
|
44 |
#if defined(TARGET_PPC64)
|
45 |
void OPPROTO glue(op_lmw_le_64, MEMSUFFIX) (void) |
46 |
{ |
47 |
glue(do_lmw_le_64, MEMSUFFIX)(PARAM1); |
48 |
RETURN(); |
49 |
} |
50 |
#endif
|
51 |
|
52 |
void OPPROTO glue(op_stmw, MEMSUFFIX) (void) |
53 |
{ |
54 |
glue(do_stmw, MEMSUFFIX)(PARAM1); |
55 |
RETURN(); |
56 |
} |
57 |
|
58 |
#if defined(TARGET_PPC64)
|
59 |
void OPPROTO glue(op_stmw_64, MEMSUFFIX) (void) |
60 |
{ |
61 |
glue(do_stmw_64, MEMSUFFIX)(PARAM1); |
62 |
RETURN(); |
63 |
} |
64 |
#endif
|
65 |
|
66 |
void OPPROTO glue(op_stmw_le, MEMSUFFIX) (void) |
67 |
{ |
68 |
glue(do_stmw_le, MEMSUFFIX)(PARAM1); |
69 |
RETURN(); |
70 |
} |
71 |
|
72 |
#if defined(TARGET_PPC64)
|
73 |
void OPPROTO glue(op_stmw_le_64, MEMSUFFIX) (void) |
74 |
{ |
75 |
glue(do_stmw_le_64, MEMSUFFIX)(PARAM1); |
76 |
RETURN(); |
77 |
} |
78 |
#endif
|
79 |
|
80 |
/*** Integer load and store strings ***/
|
81 |
void OPPROTO glue(op_lswi, MEMSUFFIX) (void) |
82 |
{ |
83 |
glue(do_lsw, MEMSUFFIX)(PARAM1); |
84 |
RETURN(); |
85 |
} |
86 |
|
87 |
#if defined(TARGET_PPC64)
|
88 |
void OPPROTO glue(op_lswi_64, MEMSUFFIX) (void) |
89 |
{ |
90 |
glue(do_lsw_64, MEMSUFFIX)(PARAM1); |
91 |
RETURN(); |
92 |
} |
93 |
#endif
|
94 |
|
95 |
/* PPC32 specification says we must generate an exception if
|
96 |
* rA is in the range of registers to be loaded.
|
97 |
* In an other hand, IBM says this is valid, but rA won't be loaded.
|
98 |
* For now, I'll follow the spec...
|
99 |
*/
|
100 |
void OPPROTO glue(op_lswx, MEMSUFFIX) (void) |
101 |
{ |
102 |
/* Note: T1 comes from xer_bc then no cast is needed */
|
103 |
if (likely(T1 != 0)) { |
104 |
if (unlikely((PARAM1 < PARAM2 && (PARAM1 + T1) > PARAM2) ||
|
105 |
(PARAM1 < PARAM3 && (PARAM1 + T1) > PARAM3))) { |
106 |
raise_exception_err(env, POWERPC_EXCP_PROGRAM, |
107 |
POWERPC_EXCP_INVAL | |
108 |
POWERPC_EXCP_INVAL_LSWX); |
109 |
} else {
|
110 |
glue(do_lsw, MEMSUFFIX)(PARAM1); |
111 |
} |
112 |
} |
113 |
RETURN(); |
114 |
} |
115 |
|
116 |
#if defined(TARGET_PPC64)
|
117 |
void OPPROTO glue(op_lswx_64, MEMSUFFIX) (void) |
118 |
{ |
119 |
/* Note: T1 comes from xer_bc then no cast is needed */
|
120 |
if (likely(T1 != 0)) { |
121 |
if (unlikely((PARAM1 < PARAM2 && (PARAM1 + T1) > PARAM2) ||
|
122 |
(PARAM1 < PARAM3 && (PARAM1 + T1) > PARAM3))) { |
123 |
raise_exception_err(env, POWERPC_EXCP_PROGRAM, |
124 |
POWERPC_EXCP_INVAL | |
125 |
POWERPC_EXCP_INVAL_LSWX); |
126 |
} else {
|
127 |
glue(do_lsw_64, MEMSUFFIX)(PARAM1); |
128 |
} |
129 |
} |
130 |
RETURN(); |
131 |
} |
132 |
#endif
|
133 |
|
134 |
void OPPROTO glue(op_stsw, MEMSUFFIX) (void) |
135 |
{ |
136 |
glue(do_stsw, MEMSUFFIX)(PARAM1); |
137 |
RETURN(); |
138 |
} |
139 |
|
140 |
#if defined(TARGET_PPC64)
|
141 |
void OPPROTO glue(op_stsw_64, MEMSUFFIX) (void) |
142 |
{ |
143 |
glue(do_stsw_64, MEMSUFFIX)(PARAM1); |
144 |
RETURN(); |
145 |
} |
146 |
#endif
|
147 |
|
148 |
/* Load and set reservation */
|
149 |
void OPPROTO glue(op_lwarx, MEMSUFFIX) (void) |
150 |
{ |
151 |
if (unlikely(T0 & 0x03)) { |
152 |
raise_exception(env, POWERPC_EXCP_ALIGN); |
153 |
} else {
|
154 |
T1 = glue(ldu32, MEMSUFFIX)((uint32_t)T0); |
155 |
env->reserve = (uint32_t)T0; |
156 |
} |
157 |
RETURN(); |
158 |
} |
159 |
|
160 |
#if defined(TARGET_PPC64)
|
161 |
void OPPROTO glue(op_lwarx_64, MEMSUFFIX) (void) |
162 |
{ |
163 |
if (unlikely(T0 & 0x03)) { |
164 |
raise_exception(env, POWERPC_EXCP_ALIGN); |
165 |
} else {
|
166 |
T1 = glue(ldu32, MEMSUFFIX)((uint64_t)T0); |
167 |
env->reserve = (uint64_t)T0; |
168 |
} |
169 |
RETURN(); |
170 |
} |
171 |
|
172 |
void OPPROTO glue(op_ldarx, MEMSUFFIX) (void) |
173 |
{ |
174 |
if (unlikely(T0 & 0x03)) { |
175 |
raise_exception(env, POWERPC_EXCP_ALIGN); |
176 |
} else {
|
177 |
T1 = glue(ldu64, MEMSUFFIX)((uint32_t)T0); |
178 |
env->reserve = (uint32_t)T0; |
179 |
} |
180 |
RETURN(); |
181 |
} |
182 |
|
183 |
void OPPROTO glue(op_ldarx_64, MEMSUFFIX) (void) |
184 |
{ |
185 |
if (unlikely(T0 & 0x03)) { |
186 |
raise_exception(env, POWERPC_EXCP_ALIGN); |
187 |
} else {
|
188 |
T1 = glue(ldu64, MEMSUFFIX)((uint64_t)T0); |
189 |
env->reserve = (uint64_t)T0; |
190 |
} |
191 |
RETURN(); |
192 |
} |
193 |
#endif
|
194 |
|
195 |
void OPPROTO glue(op_lwarx_le, MEMSUFFIX) (void) |
196 |
{ |
197 |
if (unlikely(T0 & 0x03)) { |
198 |
raise_exception(env, POWERPC_EXCP_ALIGN); |
199 |
} else {
|
200 |
T1 = glue(ldu32r, MEMSUFFIX)((uint32_t)T0); |
201 |
env->reserve = (uint32_t)T0; |
202 |
} |
203 |
RETURN(); |
204 |
} |
205 |
|
206 |
#if defined(TARGET_PPC64)
|
207 |
void OPPROTO glue(op_lwarx_le_64, MEMSUFFIX) (void) |
208 |
{ |
209 |
if (unlikely(T0 & 0x03)) { |
210 |
raise_exception(env, POWERPC_EXCP_ALIGN); |
211 |
} else {
|
212 |
T1 = glue(ldu32r, MEMSUFFIX)((uint64_t)T0); |
213 |
env->reserve = (uint64_t)T0; |
214 |
} |
215 |
RETURN(); |
216 |
} |
217 |
|
218 |
void OPPROTO glue(op_ldarx_le, MEMSUFFIX) (void) |
219 |
{ |
220 |
if (unlikely(T0 & 0x03)) { |
221 |
raise_exception(env, POWERPC_EXCP_ALIGN); |
222 |
} else {
|
223 |
T1 = glue(ldu64r, MEMSUFFIX)((uint32_t)T0); |
224 |
env->reserve = (uint32_t)T0; |
225 |
} |
226 |
RETURN(); |
227 |
} |
228 |
|
229 |
void OPPROTO glue(op_ldarx_le_64, MEMSUFFIX) (void) |
230 |
{ |
231 |
if (unlikely(T0 & 0x03)) { |
232 |
raise_exception(env, POWERPC_EXCP_ALIGN); |
233 |
} else {
|
234 |
T1 = glue(ldu64r, MEMSUFFIX)((uint64_t)T0); |
235 |
env->reserve = (uint64_t)T0; |
236 |
} |
237 |
RETURN(); |
238 |
} |
239 |
#endif
|
240 |
|
241 |
/* Store with reservation */
|
242 |
void OPPROTO glue(op_stwcx, MEMSUFFIX) (void) |
243 |
{ |
244 |
if (unlikely(T0 & 0x03)) { |
245 |
raise_exception(env, POWERPC_EXCP_ALIGN); |
246 |
} else {
|
247 |
if (unlikely(env->reserve != (uint32_t)T0)) {
|
248 |
env->crf[0] = xer_so;
|
249 |
} else {
|
250 |
glue(st32, MEMSUFFIX)((uint32_t)T0, T1); |
251 |
env->crf[0] = xer_so | 0x02; |
252 |
} |
253 |
} |
254 |
env->reserve = (target_ulong)-1ULL;
|
255 |
RETURN(); |
256 |
} |
257 |
|
258 |
#if defined(TARGET_PPC64)
|
259 |
void OPPROTO glue(op_stwcx_64, MEMSUFFIX) (void) |
260 |
{ |
261 |
if (unlikely(T0 & 0x03)) { |
262 |
raise_exception(env, POWERPC_EXCP_ALIGN); |
263 |
} else {
|
264 |
if (unlikely(env->reserve != (uint64_t)T0)) {
|
265 |
env->crf[0] = xer_so;
|
266 |
} else {
|
267 |
glue(st32, MEMSUFFIX)((uint64_t)T0, T1); |
268 |
env->crf[0] = xer_so | 0x02; |
269 |
} |
270 |
} |
271 |
env->reserve = (target_ulong)-1ULL;
|
272 |
RETURN(); |
273 |
} |
274 |
|
275 |
void OPPROTO glue(op_stdcx, MEMSUFFIX) (void) |
276 |
{ |
277 |
if (unlikely(T0 & 0x03)) { |
278 |
raise_exception(env, POWERPC_EXCP_ALIGN); |
279 |
} else {
|
280 |
if (unlikely(env->reserve != (uint32_t)T0)) {
|
281 |
env->crf[0] = xer_so;
|
282 |
} else {
|
283 |
glue(st64, MEMSUFFIX)((uint32_t)T0, T1); |
284 |
env->crf[0] = xer_so | 0x02; |
285 |
} |
286 |
} |
287 |
env->reserve = (target_ulong)-1ULL;
|
288 |
RETURN(); |
289 |
} |
290 |
|
291 |
void OPPROTO glue(op_stdcx_64, MEMSUFFIX) (void) |
292 |
{ |
293 |
if (unlikely(T0 & 0x03)) { |
294 |
raise_exception(env, POWERPC_EXCP_ALIGN); |
295 |
} else {
|
296 |
if (unlikely(env->reserve != (uint64_t)T0)) {
|
297 |
env->crf[0] = xer_so;
|
298 |
} else {
|
299 |
glue(st64, MEMSUFFIX)((uint64_t)T0, T1); |
300 |
env->crf[0] = xer_so | 0x02; |
301 |
} |
302 |
} |
303 |
env->reserve = (target_ulong)-1ULL;
|
304 |
RETURN(); |
305 |
} |
306 |
#endif
|
307 |
|
308 |
void OPPROTO glue(op_stwcx_le, MEMSUFFIX) (void) |
309 |
{ |
310 |
if (unlikely(T0 & 0x03)) { |
311 |
raise_exception(env, POWERPC_EXCP_ALIGN); |
312 |
} else {
|
313 |
if (unlikely(env->reserve != (uint32_t)T0)) {
|
314 |
env->crf[0] = xer_so;
|
315 |
} else {
|
316 |
glue(st32r, MEMSUFFIX)((uint32_t)T0, T1); |
317 |
env->crf[0] = xer_so | 0x02; |
318 |
} |
319 |
} |
320 |
env->reserve = (target_ulong)-1ULL;
|
321 |
RETURN(); |
322 |
} |
323 |
|
324 |
#if defined(TARGET_PPC64)
|
325 |
void OPPROTO glue(op_stwcx_le_64, MEMSUFFIX) (void) |
326 |
{ |
327 |
if (unlikely(T0 & 0x03)) { |
328 |
raise_exception(env, POWERPC_EXCP_ALIGN); |
329 |
} else {
|
330 |
if (unlikely(env->reserve != (uint64_t)T0)) {
|
331 |
env->crf[0] = xer_so;
|
332 |
} else {
|
333 |
glue(st32r, MEMSUFFIX)((uint64_t)T0, T1); |
334 |
env->crf[0] = xer_so | 0x02; |
335 |
} |
336 |
} |
337 |
env->reserve = (target_ulong)-1ULL;
|
338 |
RETURN(); |
339 |
} |
340 |
|
341 |
void OPPROTO glue(op_stdcx_le, MEMSUFFIX) (void) |
342 |
{ |
343 |
if (unlikely(T0 & 0x03)) { |
344 |
raise_exception(env, POWERPC_EXCP_ALIGN); |
345 |
} else {
|
346 |
if (unlikely(env->reserve != (uint32_t)T0)) {
|
347 |
env->crf[0] = xer_so;
|
348 |
} else {
|
349 |
glue(st64r, MEMSUFFIX)((uint32_t)T0, T1); |
350 |
env->crf[0] = xer_so | 0x02; |
351 |
} |
352 |
} |
353 |
env->reserve = (target_ulong)-1ULL;
|
354 |
RETURN(); |
355 |
} |
356 |
|
357 |
void OPPROTO glue(op_stdcx_le_64, MEMSUFFIX) (void) |
358 |
{ |
359 |
if (unlikely(T0 & 0x03)) { |
360 |
raise_exception(env, POWERPC_EXCP_ALIGN); |
361 |
} else {
|
362 |
if (unlikely(env->reserve != (uint64_t)T0)) {
|
363 |
env->crf[0] = xer_so;
|
364 |
} else {
|
365 |
glue(st64r, MEMSUFFIX)((uint64_t)T0, T1); |
366 |
env->crf[0] = xer_so | 0x02; |
367 |
} |
368 |
} |
369 |
env->reserve = (target_ulong)-1ULL;
|
370 |
RETURN(); |
371 |
} |
372 |
#endif
|
373 |
|
374 |
void OPPROTO glue(op_dcbz_l32, MEMSUFFIX) (void) |
375 |
{ |
376 |
T0 &= ~((uint32_t)31);
|
377 |
glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x00), 0); |
378 |
glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x04), 0); |
379 |
glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x08), 0); |
380 |
glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x0C), 0); |
381 |
glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x10), 0); |
382 |
glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x14), 0); |
383 |
glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x18), 0); |
384 |
glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x1C), 0); |
385 |
RETURN(); |
386 |
} |
387 |
|
388 |
void OPPROTO glue(op_dcbz_l64, MEMSUFFIX) (void) |
389 |
{ |
390 |
T0 &= ~((uint32_t)63);
|
391 |
glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x00), 0); |
392 |
glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x04), 0); |
393 |
glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x08), 0); |
394 |
glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x0C), 0); |
395 |
glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x10), 0); |
396 |
glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x14), 0); |
397 |
glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x18), 0); |
398 |
glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x1C), 0); |
399 |
glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x20UL), 0); |
400 |
glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x24UL), 0); |
401 |
glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x28UL), 0); |
402 |
glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x2CUL), 0); |
403 |
glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x30UL), 0); |
404 |
glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x34UL), 0); |
405 |
glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x38UL), 0); |
406 |
glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x3CUL), 0); |
407 |
RETURN(); |
408 |
} |
409 |
|
410 |
void OPPROTO glue(op_dcbz_l128, MEMSUFFIX) (void) |
411 |
{ |
412 |
T0 &= ~((uint32_t)127);
|
413 |
glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x00), 0); |
414 |
glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x04), 0); |
415 |
glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x08), 0); |
416 |
glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x0C), 0); |
417 |
glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x10), 0); |
418 |
glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x14), 0); |
419 |
glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x18), 0); |
420 |
glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x1C), 0); |
421 |
glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x20UL), 0); |
422 |
glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x24UL), 0); |
423 |
glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x28UL), 0); |
424 |
glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x2CUL), 0); |
425 |
glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x30UL), 0); |
426 |
glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x34UL), 0); |
427 |
glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x38UL), 0); |
428 |
glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x3CUL), 0); |
429 |
glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x40UL), 0); |
430 |
glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x44UL), 0); |
431 |
glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x48UL), 0); |
432 |
glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x4CUL), 0); |
433 |
glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x50UL), 0); |
434 |
glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x54UL), 0); |
435 |
glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x58UL), 0); |
436 |
glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x5CUL), 0); |
437 |
glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x60UL), 0); |
438 |
glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x64UL), 0); |
439 |
glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x68UL), 0); |
440 |
glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x6CUL), 0); |
441 |
glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x70UL), 0); |
442 |
glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x74UL), 0); |
443 |
glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x78UL), 0); |
444 |
glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x7CUL), 0); |
445 |
RETURN(); |
446 |
} |
447 |
|
448 |
void OPPROTO glue(op_dcbz, MEMSUFFIX) (void) |
449 |
{ |
450 |
glue(do_dcbz, MEMSUFFIX)(); |
451 |
RETURN(); |
452 |
} |
453 |
|
454 |
#if defined(TARGET_PPC64)
|
455 |
void OPPROTO glue(op_dcbz_l32_64, MEMSUFFIX) (void) |
456 |
{ |
457 |
T0 &= ~((uint64_t)31);
|
458 |
glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x00), 0); |
459 |
glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x04), 0); |
460 |
glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x08), 0); |
461 |
glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x0C), 0); |
462 |
glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x10), 0); |
463 |
glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x14), 0); |
464 |
glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x18), 0); |
465 |
glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x1C), 0); |
466 |
RETURN(); |
467 |
} |
468 |
|
469 |
void OPPROTO glue(op_dcbz_l64_64, MEMSUFFIX) (void) |
470 |
{ |
471 |
T0 &= ~((uint64_t)63);
|
472 |
glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x00), 0); |
473 |
glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x04), 0); |
474 |
glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x08), 0); |
475 |
glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x0C), 0); |
476 |
glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x10), 0); |
477 |
glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x14), 0); |
478 |
glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x18), 0); |
479 |
glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x1C), 0); |
480 |
glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x20UL), 0); |
481 |
glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x24UL), 0); |
482 |
glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x28UL), 0); |
483 |
glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x2CUL), 0); |
484 |
glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x30UL), 0); |
485 |
glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x34UL), 0); |
486 |
glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x38UL), 0); |
487 |
glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x3CUL), 0); |
488 |
RETURN(); |
489 |
} |
490 |
|
491 |
void OPPROTO glue(op_dcbz_l128_64, MEMSUFFIX) (void) |
492 |
{ |
493 |
T0 &= ~((uint64_t)127);
|
494 |
glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x00), 0); |
495 |
glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x04), 0); |
496 |
glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x08), 0); |
497 |
glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x0C), 0); |
498 |
glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x10), 0); |
499 |
glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x14), 0); |
500 |
glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x18), 0); |
501 |
glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x1C), 0); |
502 |
glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x20UL), 0); |
503 |
glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x24UL), 0); |
504 |
glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x28UL), 0); |
505 |
glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x2CUL), 0); |
506 |
glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x30UL), 0); |
507 |
glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x34UL), 0); |
508 |
glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x38UL), 0); |
509 |
glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x3CUL), 0); |
510 |
glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x40UL), 0); |
511 |
glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x44UL), 0); |
512 |
glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x48UL), 0); |
513 |
glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x4CUL), 0); |
514 |
glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x50UL), 0); |
515 |
glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x54UL), 0); |
516 |
glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x58UL), 0); |
517 |
glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x5CUL), 0); |
518 |
glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x60UL), 0); |
519 |
glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x64UL), 0); |
520 |
glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x68UL), 0); |
521 |
glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x6CUL), 0); |
522 |
glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x70UL), 0); |
523 |
glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x74UL), 0); |
524 |
glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x78UL), 0); |
525 |
glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x7CUL), 0); |
526 |
RETURN(); |
527 |
} |
528 |
|
529 |
void OPPROTO glue(op_dcbz_64, MEMSUFFIX) (void) |
530 |
{ |
531 |
glue(do_dcbz_64, MEMSUFFIX)(); |
532 |
RETURN(); |
533 |
} |
534 |
#endif
|
535 |
|
536 |
/* Instruction cache block invalidate */
|
537 |
void OPPROTO glue(op_icbi, MEMSUFFIX) (void) |
538 |
{ |
539 |
glue(do_icbi, MEMSUFFIX)(); |
540 |
RETURN(); |
541 |
} |
542 |
|
543 |
#if defined(TARGET_PPC64)
|
544 |
void OPPROTO glue(op_icbi_64, MEMSUFFIX) (void) |
545 |
{ |
546 |
glue(do_icbi_64, MEMSUFFIX)(); |
547 |
RETURN(); |
548 |
} |
549 |
#endif
|
550 |
|
551 |
/* External access */
|
552 |
void OPPROTO glue(op_eciwx, MEMSUFFIX) (void) |
553 |
{ |
554 |
T1 = glue(ldu32, MEMSUFFIX)((uint32_t)T0); |
555 |
RETURN(); |
556 |
} |
557 |
|
558 |
#if defined(TARGET_PPC64)
|
559 |
void OPPROTO glue(op_eciwx_64, MEMSUFFIX) (void) |
560 |
{ |
561 |
T1 = glue(ldu32, MEMSUFFIX)((uint64_t)T0); |
562 |
RETURN(); |
563 |
} |
564 |
#endif
|
565 |
|
566 |
void OPPROTO glue(op_ecowx, MEMSUFFIX) (void) |
567 |
{ |
568 |
glue(st32, MEMSUFFIX)((uint32_t)T0, T1); |
569 |
RETURN(); |
570 |
} |
571 |
|
572 |
#if defined(TARGET_PPC64)
|
573 |
void OPPROTO glue(op_ecowx_64, MEMSUFFIX) (void) |
574 |
{ |
575 |
glue(st32, MEMSUFFIX)((uint64_t)T0, T1); |
576 |
RETURN(); |
577 |
} |
578 |
#endif
|
579 |
|
580 |
void OPPROTO glue(op_eciwx_le, MEMSUFFIX) (void) |
581 |
{ |
582 |
T1 = glue(ldu32r, MEMSUFFIX)((uint32_t)T0); |
583 |
RETURN(); |
584 |
} |
585 |
|
586 |
#if defined(TARGET_PPC64)
|
587 |
void OPPROTO glue(op_eciwx_le_64, MEMSUFFIX) (void) |
588 |
{ |
589 |
T1 = glue(ldu32r, MEMSUFFIX)((uint64_t)T0); |
590 |
RETURN(); |
591 |
} |
592 |
#endif
|
593 |
|
594 |
void OPPROTO glue(op_ecowx_le, MEMSUFFIX) (void) |
595 |
{ |
596 |
glue(st32r, MEMSUFFIX)((uint32_t)T0, T1); |
597 |
RETURN(); |
598 |
} |
599 |
|
600 |
#if defined(TARGET_PPC64)
|
601 |
void OPPROTO glue(op_ecowx_le_64, MEMSUFFIX) (void) |
602 |
{ |
603 |
glue(st32r, MEMSUFFIX)((uint64_t)T0, T1); |
604 |
RETURN(); |
605 |
} |
606 |
#endif
|
607 |
|
608 |
/* XXX: those micro-ops need tests ! */
|
609 |
/* PowerPC 601 specific instructions (POWER bridge) */
|
610 |
void OPPROTO glue(op_POWER_lscbx, MEMSUFFIX) (void) |
611 |
{ |
612 |
/* When byte count is 0, do nothing */
|
613 |
if (likely(T1 != 0)) { |
614 |
glue(do_POWER_lscbx, MEMSUFFIX)(PARAM1, PARAM2, PARAM3); |
615 |
} |
616 |
RETURN(); |
617 |
} |
618 |
|
619 |
#undef MEMSUFFIX
|