Revision e7c24003 target-ppc/op_helper_mem.h
b/target-ppc/op_helper_mem.h | ||
---|---|---|
18 | 18 |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
19 | 19 |
*/ |
20 | 20 |
|
21 |
/* Multiple word / string load and store */ |
|
22 |
static always_inline target_ulong glue(ld32r, MEMSUFFIX) (target_ulong EA) |
|
23 |
{ |
|
24 |
uint32_t tmp = glue(ldl, MEMSUFFIX)(EA); |
|
25 |
return ((tmp & 0xFF000000UL) >> 24) | ((tmp & 0x00FF0000UL) >> 8) | |
|
26 |
((tmp & 0x0000FF00UL) << 8) | ((tmp & 0x000000FFUL) << 24); |
|
27 |
} |
|
28 |
|
|
29 |
static always_inline void glue(st32r, MEMSUFFIX) (target_ulong EA, |
|
30 |
target_ulong data) |
|
31 |
{ |
|
32 |
uint32_t tmp = |
|
33 |
((data & 0xFF000000UL) >> 24) | ((data & 0x00FF0000UL) >> 8) | |
|
34 |
((data & 0x0000FF00UL) << 8) | ((data & 0x000000FFUL) << 24); |
|
35 |
glue(stl, MEMSUFFIX)(EA, tmp); |
|
36 |
} |
|
21 |
#include "op_mem_access.h" |
|
37 | 22 |
|
23 |
/* Multiple word / string load and store */ |
|
38 | 24 |
void glue(do_lmw, MEMSUFFIX) (int dst) |
39 | 25 |
{ |
40 | 26 |
for (; dst < 32; dst++, T0 += 4) { |
41 |
env->gpr[dst] = glue(ldl, MEMSUFFIX)((uint32_t)T0);
|
|
27 |
env->gpr[dst] = glue(ldu32, MEMSUFFIX)((uint32_t)T0);
|
|
42 | 28 |
} |
43 | 29 |
} |
44 | 30 |
|
... | ... | |
46 | 32 |
void glue(do_lmw_64, MEMSUFFIX) (int dst) |
47 | 33 |
{ |
48 | 34 |
for (; dst < 32; dst++, T0 += 4) { |
49 |
env->gpr[dst] = glue(ldl, MEMSUFFIX)((uint64_t)T0);
|
|
35 |
env->gpr[dst] = glue(ldu32, MEMSUFFIX)((uint64_t)T0);
|
|
50 | 36 |
} |
51 | 37 |
} |
52 | 38 |
#endif |
... | ... | |
54 | 40 |
void glue(do_stmw, MEMSUFFIX) (int src) |
55 | 41 |
{ |
56 | 42 |
for (; src < 32; src++, T0 += 4) { |
57 |
glue(stl, MEMSUFFIX)((uint32_t)T0, env->gpr[src]);
|
|
43 |
glue(st32, MEMSUFFIX)((uint32_t)T0, env->gpr[src]);
|
|
58 | 44 |
} |
59 | 45 |
} |
60 | 46 |
|
... | ... | |
62 | 48 |
void glue(do_stmw_64, MEMSUFFIX) (int src) |
63 | 49 |
{ |
64 | 50 |
for (; src < 32; src++, T0 += 4) { |
65 |
glue(stl, MEMSUFFIX)((uint64_t)T0, env->gpr[src]);
|
|
51 |
glue(st32, MEMSUFFIX)((uint64_t)T0, env->gpr[src]);
|
|
66 | 52 |
} |
67 | 53 |
} |
68 | 54 |
#endif |
... | ... | |
70 | 56 |
void glue(do_lmw_le, MEMSUFFIX) (int dst) |
71 | 57 |
{ |
72 | 58 |
for (; dst < 32; dst++, T0 += 4) { |
73 |
env->gpr[dst] = glue(ld32r, MEMSUFFIX)((uint32_t)T0); |
|
59 |
env->gpr[dst] = glue(ldu32r, MEMSUFFIX)((uint32_t)T0);
|
|
74 | 60 |
} |
75 | 61 |
} |
76 | 62 |
|
... | ... | |
78 | 64 |
void glue(do_lmw_le_64, MEMSUFFIX) (int dst) |
79 | 65 |
{ |
80 | 66 |
for (; dst < 32; dst++, T0 += 4) { |
81 |
env->gpr[dst] = glue(ld32r, MEMSUFFIX)((uint64_t)T0); |
|
67 |
env->gpr[dst] = glue(ldu32r, MEMSUFFIX)((uint64_t)T0);
|
|
82 | 68 |
} |
83 | 69 |
} |
84 | 70 |
#endif |
... | ... | |
105 | 91 |
int sh; |
106 | 92 |
|
107 | 93 |
for (; T1 > 3; T1 -= 4, T0 += 4) { |
108 |
env->gpr[dst++] = glue(ldl, MEMSUFFIX)((uint32_t)T0);
|
|
94 |
env->gpr[dst++] = glue(ldu32, MEMSUFFIX)((uint32_t)T0);
|
|
109 | 95 |
if (unlikely(dst == 32)) |
110 | 96 |
dst = 0; |
111 | 97 |
} |
112 | 98 |
if (unlikely(T1 != 0)) { |
113 | 99 |
tmp = 0; |
114 | 100 |
for (sh = 24; T1 > 0; T1--, T0++, sh -= 8) { |
115 |
tmp |= glue(ldub, MEMSUFFIX)((uint32_t)T0) << sh;
|
|
101 |
tmp |= glue(ldu8, MEMSUFFIX)((uint32_t)T0) << sh;
|
|
116 | 102 |
} |
117 | 103 |
env->gpr[dst] = tmp; |
118 | 104 |
} |
... | ... | |
125 | 111 |
int sh; |
126 | 112 |
|
127 | 113 |
for (; T1 > 3; T1 -= 4, T0 += 4) { |
128 |
env->gpr[dst++] = glue(ldl, MEMSUFFIX)((uint64_t)T0);
|
|
114 |
env->gpr[dst++] = glue(ldu32, MEMSUFFIX)((uint64_t)T0);
|
|
129 | 115 |
if (unlikely(dst == 32)) |
130 | 116 |
dst = 0; |
131 | 117 |
} |
132 | 118 |
if (unlikely(T1 != 0)) { |
133 | 119 |
tmp = 0; |
134 | 120 |
for (sh = 24; T1 > 0; T1--, T0++, sh -= 8) { |
135 |
tmp |= glue(ldub, MEMSUFFIX)((uint64_t)T0) << sh;
|
|
121 |
tmp |= glue(ldu8, MEMSUFFIX)((uint64_t)T0) << sh;
|
|
136 | 122 |
} |
137 | 123 |
env->gpr[dst] = tmp; |
138 | 124 |
} |
... | ... | |
144 | 130 |
int sh; |
145 | 131 |
|
146 | 132 |
for (; T1 > 3; T1 -= 4, T0 += 4) { |
147 |
glue(stl, MEMSUFFIX)((uint32_t)T0, env->gpr[src++]);
|
|
133 |
glue(st32, MEMSUFFIX)((uint32_t)T0, env->gpr[src++]);
|
|
148 | 134 |
if (unlikely(src == 32)) |
149 | 135 |
src = 0; |
150 | 136 |
} |
151 | 137 |
if (unlikely(T1 != 0)) { |
152 | 138 |
for (sh = 24; T1 > 0; T1--, T0++, sh -= 8) |
153 |
glue(stb, MEMSUFFIX)((uint32_t)T0, (env->gpr[src] >> sh) & 0xFF);
|
|
139 |
glue(st8, MEMSUFFIX)((uint32_t)T0, (env->gpr[src] >> sh) & 0xFF);
|
|
154 | 140 |
} |
155 | 141 |
} |
156 | 142 |
|
... | ... | |
160 | 146 |
int sh; |
161 | 147 |
|
162 | 148 |
for (; T1 > 3; T1 -= 4, T0 += 4) { |
163 |
glue(stl, MEMSUFFIX)((uint64_t)T0, env->gpr[src++]);
|
|
149 |
glue(st32, MEMSUFFIX)((uint64_t)T0, env->gpr[src++]);
|
|
164 | 150 |
if (unlikely(src == 32)) |
165 | 151 |
src = 0; |
166 | 152 |
} |
167 | 153 |
if (unlikely(T1 != 0)) { |
168 | 154 |
for (sh = 24; T1 > 0; T1--, T0++, sh -= 8) |
169 |
glue(stb, MEMSUFFIX)((uint64_t)T0, (env->gpr[src] >> sh) & 0xFF); |
|
170 |
} |
|
171 |
} |
|
172 |
#endif |
|
173 |
|
|
174 |
void glue(do_lsw_le, MEMSUFFIX) (int dst) |
|
175 |
{ |
|
176 |
uint32_t tmp; |
|
177 |
int sh; |
|
178 |
|
|
179 |
for (; T1 > 3; T1 -= 4, T0 += 4) { |
|
180 |
env->gpr[dst++] = glue(ld32r, MEMSUFFIX)((uint32_t)T0); |
|
181 |
if (unlikely(dst == 32)) |
|
182 |
dst = 0; |
|
183 |
} |
|
184 |
if (unlikely(T1 != 0)) { |
|
185 |
tmp = 0; |
|
186 |
for (sh = 0; T1 > 0; T1--, T0++, sh += 8) { |
|
187 |
tmp |= glue(ldub, MEMSUFFIX)((uint32_t)T0) << sh; |
|
188 |
} |
|
189 |
env->gpr[dst] = tmp; |
|
190 |
} |
|
191 |
} |
|
192 |
|
|
193 |
#if defined(TARGET_PPC64) |
|
194 |
void glue(do_lsw_le_64, MEMSUFFIX) (int dst) |
|
195 |
{ |
|
196 |
uint32_t tmp; |
|
197 |
int sh; |
|
198 |
|
|
199 |
for (; T1 > 3; T1 -= 4, T0 += 4) { |
|
200 |
env->gpr[dst++] = glue(ld32r, MEMSUFFIX)((uint64_t)T0); |
|
201 |
if (unlikely(dst == 32)) |
|
202 |
dst = 0; |
|
203 |
} |
|
204 |
if (unlikely(T1 != 0)) { |
|
205 |
tmp = 0; |
|
206 |
for (sh = 0; T1 > 0; T1--, T0++, sh += 8) { |
|
207 |
tmp |= glue(ldub, MEMSUFFIX)((uint64_t)T0) << sh; |
|
208 |
} |
|
209 |
env->gpr[dst] = tmp; |
|
210 |
} |
|
211 |
} |
|
212 |
#endif |
|
213 |
|
|
214 |
void glue(do_stsw_le, MEMSUFFIX) (int src) |
|
215 |
{ |
|
216 |
int sh; |
|
217 |
|
|
218 |
for (; T1 > 3; T1 -= 4, T0 += 4) { |
|
219 |
glue(st32r, MEMSUFFIX)((uint32_t)T0, env->gpr[src++]); |
|
220 |
if (unlikely(src == 32)) |
|
221 |
src = 0; |
|
222 |
} |
|
223 |
if (unlikely(T1 != 0)) { |
|
224 |
for (sh = 0; T1 > 0; T1--, T0++, sh += 8) |
|
225 |
glue(stb, MEMSUFFIX)((uint32_t)T0, (env->gpr[src] >> sh) & 0xFF); |
|
226 |
} |
|
227 |
} |
|
228 |
|
|
229 |
#if defined(TARGET_PPC64) |
|
230 |
void glue(do_stsw_le_64, MEMSUFFIX) (int src) |
|
231 |
{ |
|
232 |
int sh; |
|
233 |
|
|
234 |
for (; T1 > 3; T1 -= 4, T0 += 4) { |
|
235 |
glue(st32r, MEMSUFFIX)((uint64_t)T0, env->gpr[src++]); |
|
236 |
if (unlikely(src == 32)) |
|
237 |
src = 0; |
|
238 |
} |
|
239 |
if (unlikely(T1 != 0)) { |
|
240 |
for (sh = 0; T1 > 0; T1--, T0++, sh += 8) |
|
241 |
glue(stb, MEMSUFFIX)((uint64_t)T0, (env->gpr[src] >> sh) & 0xFF); |
|
155 |
glue(st8, MEMSUFFIX)((uint64_t)T0, (env->gpr[src] >> sh) & 0xFF); |
|
242 | 156 |
} |
243 | 157 |
} |
244 | 158 |
#endif |
... | ... | |
281 | 195 |
/* XXX: should be 970 specific (?) */ |
282 | 196 |
if (((env->spr[SPR_970_HID5] >> 7) & 0x3) == 1) |
283 | 197 |
dcache_line_size = 32; |
198 |
T0 &= ~(uint32_t)(dcache_line_size - 1); |
|
284 | 199 |
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x00), 0); |
285 | 200 |
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x04), 0); |
286 | 201 |
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x08), 0); |
... | ... | |
327 | 242 |
/* XXX: should be 970 specific (?) */ |
328 | 243 |
if (((env->spr[SPR_970_HID5] >> 6) & 0x3) == 0x2) |
329 | 244 |
dcache_line_size = 32; |
245 |
T0 &= ~(uint64_t)(dcache_line_size - 1); |
|
330 | 246 |
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x00), 0); |
331 | 247 |
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x04), 0); |
332 | 248 |
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x08), 0); |
... | ... | |
375 | 291 |
d = 24; |
376 | 292 |
reg = dest; |
377 | 293 |
for (i = 0; i < T1; i++) { |
378 |
c = glue(ldub, MEMSUFFIX)((uint32_t)T0++);
|
|
294 |
c = glue(ldu8, MEMSUFFIX)((uint32_t)T0++);
|
|
379 | 295 |
/* ra (if not 0) and rb are never modified */ |
380 | 296 |
if (likely(reg != rb && (ra == 0 || reg != ra))) { |
381 | 297 |
env->gpr[reg] = (env->gpr[reg] & ~(0xFF << d)) | (c << d); |
... | ... | |
408 | 324 |
} u; |
409 | 325 |
|
410 | 326 |
u.d = glue(ldfq, MEMSUFFIX)(EA); |
411 |
u.u = ((u.u & 0xFF00000000000000ULL) >> 56) | |
|
412 |
((u.u & 0x00FF000000000000ULL) >> 40) | |
|
413 |
((u.u & 0x0000FF0000000000ULL) >> 24) | |
|
414 |
((u.u & 0x000000FF00000000ULL) >> 8) | |
|
415 |
((u.u & 0x00000000FF000000ULL) << 8) | |
|
416 |
((u.u & 0x0000000000FF0000ULL) << 24) | |
|
417 |
((u.u & 0x000000000000FF00ULL) << 40) | |
|
418 |
((u.u & 0x00000000000000FFULL) << 56); |
|
327 |
u.u = bswap64(u.u); |
|
419 | 328 |
|
420 | 329 |
return u.d; |
421 | 330 |
} |
... | ... | |
440 | 349 |
} u; |
441 | 350 |
|
442 | 351 |
u.d = d; |
443 |
u.u = ((u.u & 0xFF00000000000000ULL) >> 56) | |
|
444 |
((u.u & 0x00FF000000000000ULL) >> 40) | |
|
445 |
((u.u & 0x0000FF0000000000ULL) >> 24) | |
|
446 |
((u.u & 0x000000FF00000000ULL) >> 8) | |
|
447 |
((u.u & 0x00000000FF000000ULL) << 8) | |
|
448 |
((u.u & 0x0000000000FF0000ULL) << 24) | |
|
449 |
((u.u & 0x000000000000FF00ULL) << 40) | |
|
450 |
((u.u & 0x00000000000000FFULL) << 56); |
|
352 |
u.u = bswap64(u.u); |
|
451 | 353 |
glue(stfq, MEMSUFFIX)(EA, u.d); |
452 | 354 |
} |
453 | 355 |
|
Also available in: Unified diff