Statistics
| Branch: | Revision:

root / target-ppc / op_helper_mem.h @ c7697e1f

History | View | Annotate | Download (13.8 kB)

1 76a66253 j_mayer
/*
2 76a66253 j_mayer
 *  PowerPC emulation micro-operations helpers for qemu.
3 d9bce9d9 j_mayer
 *
4 76a66253 j_mayer
 *  Copyright (c) 2003-2007 Jocelyn Mayer
5 76a66253 j_mayer
 *
6 76a66253 j_mayer
 * This library is free software; you can redistribute it and/or
7 76a66253 j_mayer
 * modify it under the terms of the GNU Lesser General Public
8 76a66253 j_mayer
 * License as published by the Free Software Foundation; either
9 76a66253 j_mayer
 * version 2 of the License, or (at your option) any later version.
10 76a66253 j_mayer
 *
11 76a66253 j_mayer
 * This library is distributed in the hope that it will be useful,
12 76a66253 j_mayer
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 76a66253 j_mayer
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 76a66253 j_mayer
 * Lesser General Public License for more details.
15 76a66253 j_mayer
 *
16 76a66253 j_mayer
 * You should have received a copy of the GNU Lesser General Public
17 76a66253 j_mayer
 * License along with this library; if not, write to the Free Software
18 76a66253 j_mayer
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19 76a66253 j_mayer
 */
20 76a66253 j_mayer
21 76a66253 j_mayer
/* Multiple word / string load and store */
22 b068d6a7 j_mayer
static always_inline target_ulong glue(ld32r, MEMSUFFIX) (target_ulong EA)
23 76a66253 j_mayer
{
24 76a66253 j_mayer
    uint32_t tmp = glue(ldl, MEMSUFFIX)(EA);
25 76a66253 j_mayer
    return ((tmp & 0xFF000000UL) >> 24) | ((tmp & 0x00FF0000UL) >> 8) |
26 76a66253 j_mayer
        ((tmp & 0x0000FF00UL) << 8) | ((tmp & 0x000000FFUL) << 24);
27 76a66253 j_mayer
}
28 76a66253 j_mayer
29 b068d6a7 j_mayer
static always_inline void glue(st32r, MEMSUFFIX) (target_ulong EA,
30 b068d6a7 j_mayer
                                                  target_ulong data)
31 76a66253 j_mayer
{
32 76a66253 j_mayer
    uint32_t tmp =
33 76a66253 j_mayer
        ((data & 0xFF000000UL) >> 24) | ((data & 0x00FF0000UL) >> 8) |
34 76a66253 j_mayer
        ((data & 0x0000FF00UL) << 8) | ((data & 0x000000FFUL) << 24);
35 76a66253 j_mayer
    glue(stl, MEMSUFFIX)(EA, tmp);
36 76a66253 j_mayer
}
37 76a66253 j_mayer
38 76a66253 j_mayer
void glue(do_lmw, MEMSUFFIX) (int dst)
39 76a66253 j_mayer
{
40 76a66253 j_mayer
    for (; dst < 32; dst++, T0 += 4) {
41 8b67546f j_mayer
        env->gpr[dst] = glue(ldl, MEMSUFFIX)((uint32_t)T0);
42 d9bce9d9 j_mayer
    }
43 d9bce9d9 j_mayer
}
44 d9bce9d9 j_mayer
45 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
46 d9bce9d9 j_mayer
void glue(do_lmw_64, MEMSUFFIX) (int dst)
47 d9bce9d9 j_mayer
{
48 d9bce9d9 j_mayer
    for (; dst < 32; dst++, T0 += 4) {
49 8b67546f j_mayer
        env->gpr[dst] = glue(ldl, MEMSUFFIX)((uint64_t)T0);
50 76a66253 j_mayer
    }
51 76a66253 j_mayer
}
52 d9bce9d9 j_mayer
#endif
53 76a66253 j_mayer
54 76a66253 j_mayer
void glue(do_stmw, MEMSUFFIX) (int src)
55 76a66253 j_mayer
{
56 76a66253 j_mayer
    for (; src < 32; src++, T0 += 4) {
57 8b67546f j_mayer
        glue(stl, MEMSUFFIX)((uint32_t)T0, env->gpr[src]);
58 d9bce9d9 j_mayer
    }
59 d9bce9d9 j_mayer
}
60 d9bce9d9 j_mayer
61 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
62 d9bce9d9 j_mayer
void glue(do_stmw_64, MEMSUFFIX) (int src)
63 d9bce9d9 j_mayer
{
64 d9bce9d9 j_mayer
    for (; src < 32; src++, T0 += 4) {
65 8b67546f j_mayer
        glue(stl, MEMSUFFIX)((uint64_t)T0, env->gpr[src]);
66 76a66253 j_mayer
    }
67 76a66253 j_mayer
}
68 d9bce9d9 j_mayer
#endif
69 76a66253 j_mayer
70 76a66253 j_mayer
void glue(do_lmw_le, MEMSUFFIX) (int dst)
71 76a66253 j_mayer
{
72 76a66253 j_mayer
    for (; dst < 32; dst++, T0 += 4) {
73 8b67546f j_mayer
        env->gpr[dst] = glue(ld32r, MEMSUFFIX)((uint32_t)T0);
74 d9bce9d9 j_mayer
    }
75 d9bce9d9 j_mayer
}
76 d9bce9d9 j_mayer
77 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
78 d9bce9d9 j_mayer
void glue(do_lmw_le_64, MEMSUFFIX) (int dst)
79 d9bce9d9 j_mayer
{
80 d9bce9d9 j_mayer
    for (; dst < 32; dst++, T0 += 4) {
81 8b67546f j_mayer
        env->gpr[dst] = glue(ld32r, MEMSUFFIX)((uint64_t)T0);
82 76a66253 j_mayer
    }
83 76a66253 j_mayer
}
84 d9bce9d9 j_mayer
#endif
85 76a66253 j_mayer
86 76a66253 j_mayer
void glue(do_stmw_le, MEMSUFFIX) (int src)
87 76a66253 j_mayer
{
88 76a66253 j_mayer
    for (; src < 32; src++, T0 += 4) {
89 8b67546f j_mayer
        glue(st32r, MEMSUFFIX)((uint32_t)T0, env->gpr[src]);
90 76a66253 j_mayer
    }
91 76a66253 j_mayer
}
92 76a66253 j_mayer
93 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
94 d9bce9d9 j_mayer
void glue(do_stmw_le_64, MEMSUFFIX) (int src)
95 d9bce9d9 j_mayer
{
96 d9bce9d9 j_mayer
    for (; src < 32; src++, T0 += 4) {
97 8b67546f j_mayer
        glue(st32r, MEMSUFFIX)((uint64_t)T0, env->gpr[src]);
98 d9bce9d9 j_mayer
    }
99 d9bce9d9 j_mayer
}
100 d9bce9d9 j_mayer
#endif
101 d9bce9d9 j_mayer
102 9a64fbe4 bellard
void glue(do_lsw, MEMSUFFIX) (int dst)
103 9a64fbe4 bellard
{
104 9a64fbe4 bellard
    uint32_t tmp;
105 9a64fbe4 bellard
    int sh;
106 9a64fbe4 bellard
107 9a64fbe4 bellard
    for (; T1 > 3; T1 -= 4, T0 += 4) {
108 8b67546f j_mayer
        env->gpr[dst++] = glue(ldl, MEMSUFFIX)((uint32_t)T0);
109 76a66253 j_mayer
        if (unlikely(dst == 32))
110 9a64fbe4 bellard
            dst = 0;
111 9a64fbe4 bellard
    }
112 76a66253 j_mayer
    if (unlikely(T1 != 0)) {
113 9a64fbe4 bellard
        tmp = 0;
114 9a64fbe4 bellard
        for (sh = 24; T1 > 0; T1--, T0++, sh -= 8) {
115 d9bce9d9 j_mayer
            tmp |= glue(ldub, MEMSUFFIX)((uint32_t)T0) << sh;
116 9a64fbe4 bellard
        }
117 8b67546f j_mayer
        env->gpr[dst] = tmp;
118 9a64fbe4 bellard
    }
119 9a64fbe4 bellard
}
120 9a64fbe4 bellard
121 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
122 d9bce9d9 j_mayer
void glue(do_lsw_64, MEMSUFFIX) (int dst)
123 d9bce9d9 j_mayer
{
124 d9bce9d9 j_mayer
    uint32_t tmp;
125 d9bce9d9 j_mayer
    int sh;
126 d9bce9d9 j_mayer
127 d9bce9d9 j_mayer
    for (; T1 > 3; T1 -= 4, T0 += 4) {
128 8b67546f j_mayer
        env->gpr[dst++] = glue(ldl, MEMSUFFIX)((uint64_t)T0);
129 d9bce9d9 j_mayer
        if (unlikely(dst == 32))
130 d9bce9d9 j_mayer
            dst = 0;
131 d9bce9d9 j_mayer
    }
132 d9bce9d9 j_mayer
    if (unlikely(T1 != 0)) {
133 d9bce9d9 j_mayer
        tmp = 0;
134 d9bce9d9 j_mayer
        for (sh = 24; T1 > 0; T1--, T0++, sh -= 8) {
135 d9bce9d9 j_mayer
            tmp |= glue(ldub, MEMSUFFIX)((uint64_t)T0) << sh;
136 d9bce9d9 j_mayer
        }
137 8b67546f j_mayer
        env->gpr[dst] = tmp;
138 d9bce9d9 j_mayer
    }
139 d9bce9d9 j_mayer
}
140 d9bce9d9 j_mayer
#endif
141 d9bce9d9 j_mayer
142 9a64fbe4 bellard
void glue(do_stsw, MEMSUFFIX) (int src)
143 9a64fbe4 bellard
{
144 9a64fbe4 bellard
    int sh;
145 9a64fbe4 bellard
146 9a64fbe4 bellard
    for (; T1 > 3; T1 -= 4, T0 += 4) {
147 8b67546f j_mayer
        glue(stl, MEMSUFFIX)((uint32_t)T0, env->gpr[src++]);
148 76a66253 j_mayer
        if (unlikely(src == 32))
149 9a64fbe4 bellard
            src = 0;
150 9a64fbe4 bellard
    }
151 76a66253 j_mayer
    if (unlikely(T1 != 0)) {
152 9a64fbe4 bellard
        for (sh = 24; T1 > 0; T1--, T0++, sh -= 8)
153 8b67546f j_mayer
            glue(stb, MEMSUFFIX)((uint32_t)T0, (env->gpr[src] >> sh) & 0xFF);
154 9a64fbe4 bellard
    }
155 9a64fbe4 bellard
}
156 9a64fbe4 bellard
157 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
158 d9bce9d9 j_mayer
void glue(do_stsw_64, MEMSUFFIX) (int src)
159 d9bce9d9 j_mayer
{
160 d9bce9d9 j_mayer
    int sh;
161 d9bce9d9 j_mayer
162 d9bce9d9 j_mayer
    for (; T1 > 3; T1 -= 4, T0 += 4) {
163 8b67546f j_mayer
        glue(stl, MEMSUFFIX)((uint64_t)T0, env->gpr[src++]);
164 d9bce9d9 j_mayer
        if (unlikely(src == 32))
165 d9bce9d9 j_mayer
            src = 0;
166 d9bce9d9 j_mayer
    }
167 d9bce9d9 j_mayer
    if (unlikely(T1 != 0)) {
168 d9bce9d9 j_mayer
        for (sh = 24; T1 > 0; T1--, T0++, sh -= 8)
169 8b67546f j_mayer
            glue(stb, MEMSUFFIX)((uint64_t)T0, (env->gpr[src] >> sh) & 0xFF);
170 d9bce9d9 j_mayer
    }
171 d9bce9d9 j_mayer
}
172 d9bce9d9 j_mayer
#endif
173 d9bce9d9 j_mayer
174 111bfab3 bellard
void glue(do_lsw_le, MEMSUFFIX) (int dst)
175 111bfab3 bellard
{
176 111bfab3 bellard
    uint32_t tmp;
177 111bfab3 bellard
    int sh;
178 111bfab3 bellard
179 111bfab3 bellard
    for (; T1 > 3; T1 -= 4, T0 += 4) {
180 8b67546f j_mayer
        env->gpr[dst++] = glue(ld32r, MEMSUFFIX)((uint32_t)T0);
181 d9bce9d9 j_mayer
        if (unlikely(dst == 32))
182 d9bce9d9 j_mayer
            dst = 0;
183 d9bce9d9 j_mayer
    }
184 d9bce9d9 j_mayer
    if (unlikely(T1 != 0)) {
185 d9bce9d9 j_mayer
        tmp = 0;
186 d9bce9d9 j_mayer
        for (sh = 0; T1 > 0; T1--, T0++, sh += 8) {
187 d9bce9d9 j_mayer
            tmp |= glue(ldub, MEMSUFFIX)((uint32_t)T0) << sh;
188 d9bce9d9 j_mayer
        }
189 8b67546f j_mayer
        env->gpr[dst] = tmp;
190 d9bce9d9 j_mayer
    }
191 d9bce9d9 j_mayer
}
192 d9bce9d9 j_mayer
193 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
194 d9bce9d9 j_mayer
void glue(do_lsw_le_64, MEMSUFFIX) (int dst)
195 d9bce9d9 j_mayer
{
196 d9bce9d9 j_mayer
    uint32_t tmp;
197 d9bce9d9 j_mayer
    int sh;
198 d9bce9d9 j_mayer
199 d9bce9d9 j_mayer
    for (; T1 > 3; T1 -= 4, T0 += 4) {
200 8b67546f j_mayer
        env->gpr[dst++] = glue(ld32r, MEMSUFFIX)((uint64_t)T0);
201 76a66253 j_mayer
        if (unlikely(dst == 32))
202 111bfab3 bellard
            dst = 0;
203 111bfab3 bellard
    }
204 76a66253 j_mayer
    if (unlikely(T1 != 0)) {
205 111bfab3 bellard
        tmp = 0;
206 111bfab3 bellard
        for (sh = 0; T1 > 0; T1--, T0++, sh += 8) {
207 d9bce9d9 j_mayer
            tmp |= glue(ldub, MEMSUFFIX)((uint64_t)T0) << sh;
208 111bfab3 bellard
        }
209 8b67546f j_mayer
        env->gpr[dst] = tmp;
210 111bfab3 bellard
    }
211 111bfab3 bellard
}
212 d9bce9d9 j_mayer
#endif
213 111bfab3 bellard
214 111bfab3 bellard
void glue(do_stsw_le, MEMSUFFIX) (int src)
215 111bfab3 bellard
{
216 111bfab3 bellard
    int sh;
217 111bfab3 bellard
218 111bfab3 bellard
    for (; T1 > 3; T1 -= 4, T0 += 4) {
219 8b67546f j_mayer
        glue(st32r, MEMSUFFIX)((uint32_t)T0, env->gpr[src++]);
220 d9bce9d9 j_mayer
        if (unlikely(src == 32))
221 d9bce9d9 j_mayer
            src = 0;
222 d9bce9d9 j_mayer
    }
223 d9bce9d9 j_mayer
    if (unlikely(T1 != 0)) {
224 d9bce9d9 j_mayer
        for (sh = 0; T1 > 0; T1--, T0++, sh += 8)
225 8b67546f j_mayer
            glue(stb, MEMSUFFIX)((uint32_t)T0, (env->gpr[src] >> sh) & 0xFF);
226 d9bce9d9 j_mayer
    }
227 d9bce9d9 j_mayer
}
228 d9bce9d9 j_mayer
229 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
230 d9bce9d9 j_mayer
void glue(do_stsw_le_64, MEMSUFFIX) (int src)
231 d9bce9d9 j_mayer
{
232 d9bce9d9 j_mayer
    int sh;
233 d9bce9d9 j_mayer
234 d9bce9d9 j_mayer
    for (; T1 > 3; T1 -= 4, T0 += 4) {
235 8b67546f j_mayer
        glue(st32r, MEMSUFFIX)((uint64_t)T0, env->gpr[src++]);
236 76a66253 j_mayer
        if (unlikely(src == 32))
237 111bfab3 bellard
            src = 0;
238 111bfab3 bellard
    }
239 76a66253 j_mayer
    if (unlikely(T1 != 0)) {
240 111bfab3 bellard
        for (sh = 0; T1 > 0; T1--, T0++, sh += 8)
241 8b67546f j_mayer
            glue(stb, MEMSUFFIX)((uint64_t)T0, (env->gpr[src] >> sh) & 0xFF);
242 111bfab3 bellard
    }
243 111bfab3 bellard
}
244 d9bce9d9 j_mayer
#endif
245 111bfab3 bellard
246 36f69651 j_mayer
/* Instruction cache invalidation helper */
247 36f69651 j_mayer
void glue(do_icbi, MEMSUFFIX) (void)
248 36f69651 j_mayer
{
249 36f69651 j_mayer
    uint32_t tmp;
250 36f69651 j_mayer
    /* Invalidate one cache line :
251 36f69651 j_mayer
     * PowerPC specification says this is to be treated like a load
252 36f69651 j_mayer
     * (not a fetch) by the MMU. To be sure it will be so,
253 36f69651 j_mayer
     * do the load "by hand".
254 36f69651 j_mayer
     */
255 36f69651 j_mayer
    tmp = glue(ldl, MEMSUFFIX)((uint32_t)T0);
256 d63001d1 j_mayer
    T0 &= ~(env->icache_line_size - 1);
257 d63001d1 j_mayer
    tb_invalidate_page_range((uint32_t)T0,
258 d63001d1 j_mayer
                             (uint32_t)(T0 + env->icache_line_size));
259 36f69651 j_mayer
}
260 36f69651 j_mayer
261 36f69651 j_mayer
#if defined(TARGET_PPC64)
262 36f69651 j_mayer
void glue(do_icbi_64, MEMSUFFIX) (void)
263 36f69651 j_mayer
{
264 36f69651 j_mayer
    uint64_t tmp;
265 36f69651 j_mayer
    /* Invalidate one cache line :
266 36f69651 j_mayer
     * PowerPC specification says this is to be treated like a load
267 36f69651 j_mayer
     * (not a fetch) by the MMU. To be sure it will be so,
268 36f69651 j_mayer
     * do the load "by hand".
269 36f69651 j_mayer
     */
270 36f69651 j_mayer
    tmp = glue(ldq, MEMSUFFIX)((uint64_t)T0);
271 d63001d1 j_mayer
    T0 &= ~(env->icache_line_size - 1);
272 d63001d1 j_mayer
    tb_invalidate_page_range((uint64_t)T0,
273 d63001d1 j_mayer
                             (uint64_t)(T0 + env->icache_line_size));
274 d63001d1 j_mayer
}
275 d63001d1 j_mayer
#endif
276 d63001d1 j_mayer
277 d63001d1 j_mayer
void glue(do_dcbz, MEMSUFFIX) (void)
278 d63001d1 j_mayer
{
279 d63001d1 j_mayer
    int dcache_line_size = env->dcache_line_size;
280 d63001d1 j_mayer
281 d63001d1 j_mayer
    /* XXX: should be 970 specific (?) */
282 d63001d1 j_mayer
    if (((env->spr[SPR_970_HID5] >> 7) & 0x3) == 1)
283 d63001d1 j_mayer
        dcache_line_size = 32;
284 d63001d1 j_mayer
    glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x00), 0);
285 d63001d1 j_mayer
    glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x04), 0);
286 d63001d1 j_mayer
    glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x08), 0);
287 d63001d1 j_mayer
    glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x0C), 0);
288 d63001d1 j_mayer
    glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x10), 0);
289 d63001d1 j_mayer
    glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x14), 0);
290 d63001d1 j_mayer
    glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x18), 0);
291 d63001d1 j_mayer
    glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x1C), 0);
292 d63001d1 j_mayer
    if (dcache_line_size >= 64) {
293 d63001d1 j_mayer
        glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x20UL), 0);
294 d63001d1 j_mayer
        glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x24UL), 0);
295 d63001d1 j_mayer
        glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x28UL), 0);
296 d63001d1 j_mayer
        glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x2CUL), 0);
297 d63001d1 j_mayer
        glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x30UL), 0);
298 d63001d1 j_mayer
        glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x34UL), 0);
299 d63001d1 j_mayer
        glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x38UL), 0);
300 d63001d1 j_mayer
        glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x3CUL), 0);
301 d63001d1 j_mayer
        if (dcache_line_size >= 128) {
302 d63001d1 j_mayer
            glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x40UL), 0);
303 d63001d1 j_mayer
            glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x44UL), 0);
304 d63001d1 j_mayer
            glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x48UL), 0);
305 d63001d1 j_mayer
            glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x4CUL), 0);
306 d63001d1 j_mayer
            glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x50UL), 0);
307 d63001d1 j_mayer
            glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x54UL), 0);
308 d63001d1 j_mayer
            glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x58UL), 0);
309 d63001d1 j_mayer
            glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x5CUL), 0);
310 d63001d1 j_mayer
            glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x60UL), 0);
311 d63001d1 j_mayer
            glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x64UL), 0);
312 d63001d1 j_mayer
            glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x68UL), 0);
313 d63001d1 j_mayer
            glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x6CUL), 0);
314 d63001d1 j_mayer
            glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x70UL), 0);
315 d63001d1 j_mayer
            glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x74UL), 0);
316 d63001d1 j_mayer
            glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x78UL), 0);
317 d63001d1 j_mayer
            glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x7CUL), 0);
318 d63001d1 j_mayer
        }
319 d63001d1 j_mayer
    }
320 d63001d1 j_mayer
}
321 d63001d1 j_mayer
322 d63001d1 j_mayer
#if defined(TARGET_PPC64)
323 d63001d1 j_mayer
void glue(do_dcbz_64, MEMSUFFIX) (void)
324 d63001d1 j_mayer
{
325 d63001d1 j_mayer
    int dcache_line_size = env->dcache_line_size;
326 d63001d1 j_mayer
327 d63001d1 j_mayer
    /* XXX: should be 970 specific (?) */
328 e57448f1 j_mayer
    if (((env->spr[SPR_970_HID5] >> 6) & 0x3) == 0x2)
329 d63001d1 j_mayer
        dcache_line_size = 32;
330 d63001d1 j_mayer
    glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x00), 0);
331 d63001d1 j_mayer
    glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x04), 0);
332 d63001d1 j_mayer
    glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x08), 0);
333 d63001d1 j_mayer
    glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x0C), 0);
334 d63001d1 j_mayer
    glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x10), 0);
335 d63001d1 j_mayer
    glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x14), 0);
336 d63001d1 j_mayer
    glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x18), 0);
337 d63001d1 j_mayer
    glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x1C), 0);
338 d63001d1 j_mayer
    if (dcache_line_size >= 64) {
339 d63001d1 j_mayer
        glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x20UL), 0);
340 d63001d1 j_mayer
        glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x24UL), 0);
341 d63001d1 j_mayer
        glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x28UL), 0);
342 d63001d1 j_mayer
        glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x2CUL), 0);
343 d63001d1 j_mayer
        glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x30UL), 0);
344 d63001d1 j_mayer
        glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x34UL), 0);
345 d63001d1 j_mayer
        glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x38UL), 0);
346 d63001d1 j_mayer
        glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x3CUL), 0);
347 d63001d1 j_mayer
        if (dcache_line_size >= 128) {
348 d63001d1 j_mayer
            glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x40UL), 0);
349 d63001d1 j_mayer
            glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x44UL), 0);
350 d63001d1 j_mayer
            glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x48UL), 0);
351 d63001d1 j_mayer
            glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x4CUL), 0);
352 d63001d1 j_mayer
            glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x50UL), 0);
353 d63001d1 j_mayer
            glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x54UL), 0);
354 d63001d1 j_mayer
            glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x58UL), 0);
355 d63001d1 j_mayer
            glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x5CUL), 0);
356 d63001d1 j_mayer
            glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x60UL), 0);
357 d63001d1 j_mayer
            glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x64UL), 0);
358 d63001d1 j_mayer
            glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x68UL), 0);
359 d63001d1 j_mayer
            glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x6CUL), 0);
360 d63001d1 j_mayer
            glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x70UL), 0);
361 d63001d1 j_mayer
            glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x74UL), 0);
362 d63001d1 j_mayer
            glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x78UL), 0);
363 d63001d1 j_mayer
            glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x7CUL), 0);
364 d63001d1 j_mayer
        }
365 d63001d1 j_mayer
    }
366 36f69651 j_mayer
}
367 36f69651 j_mayer
#endif
368 36f69651 j_mayer
369 36081602 j_mayer
/* PowerPC 601 specific instructions (POWER bridge) */
370 76a66253 j_mayer
// XXX: to be tested
371 76a66253 j_mayer
void glue(do_POWER_lscbx, MEMSUFFIX) (int dest, int ra, int rb)
372 76a66253 j_mayer
{
373 76a66253 j_mayer
    int i, c, d, reg;
374 76a66253 j_mayer
375 76a66253 j_mayer
    d = 24;
376 76a66253 j_mayer
    reg = dest;
377 76a66253 j_mayer
    for (i = 0; i < T1; i++) {
378 d9bce9d9 j_mayer
        c = glue(ldub, MEMSUFFIX)((uint32_t)T0++);
379 76a66253 j_mayer
        /* ra (if not 0) and rb are never modified */
380 76a66253 j_mayer
        if (likely(reg != rb && (ra == 0 || reg != ra))) {
381 8b67546f j_mayer
            env->gpr[reg] = (env->gpr[reg] & ~(0xFF << d)) | (c << d);
382 76a66253 j_mayer
        }
383 76a66253 j_mayer
        if (unlikely(c == T2))
384 76a66253 j_mayer
            break;
385 76a66253 j_mayer
        if (likely(d != 0)) {
386 76a66253 j_mayer
            d -= 8;
387 76a66253 j_mayer
        } else {
388 76a66253 j_mayer
            d = 24;
389 76a66253 j_mayer
            reg++;
390 76a66253 j_mayer
            reg = reg & 0x1F;
391 76a66253 j_mayer
        }
392 76a66253 j_mayer
    }
393 76a66253 j_mayer
    T0 = i;
394 76a66253 j_mayer
}
395 76a66253 j_mayer
396 76a66253 j_mayer
/* XXX: TAGs are not managed */
397 76a66253 j_mayer
void glue(do_POWER2_lfq, MEMSUFFIX) (void)
398 76a66253 j_mayer
{
399 d9bce9d9 j_mayer
    FT0 = glue(ldfq, MEMSUFFIX)((uint32_t)T0);
400 d9bce9d9 j_mayer
    FT1 = glue(ldfq, MEMSUFFIX)((uint32_t)(T0 + 4));
401 76a66253 j_mayer
}
402 76a66253 j_mayer
403 b068d6a7 j_mayer
static always_inline double glue(ldfqr, MEMSUFFIX) (target_ulong EA)
404 76a66253 j_mayer
{
405 76a66253 j_mayer
    union {
406 76a66253 j_mayer
        double d;
407 76a66253 j_mayer
        uint64_t u;
408 76a66253 j_mayer
    } u;
409 76a66253 j_mayer
410 76a66253 j_mayer
    u.d = glue(ldfq, MEMSUFFIX)(EA);
411 76a66253 j_mayer
    u.u = ((u.u & 0xFF00000000000000ULL) >> 56) |
412 76a66253 j_mayer
        ((u.u & 0x00FF000000000000ULL) >> 40) |
413 76a66253 j_mayer
        ((u.u & 0x0000FF0000000000ULL) >> 24) |
414 76a66253 j_mayer
        ((u.u & 0x000000FF00000000ULL) >> 8) |
415 76a66253 j_mayer
        ((u.u & 0x00000000FF000000ULL) << 8) |
416 76a66253 j_mayer
        ((u.u & 0x0000000000FF0000ULL) << 24) |
417 76a66253 j_mayer
        ((u.u & 0x000000000000FF00ULL) << 40) |
418 76a66253 j_mayer
        ((u.u & 0x00000000000000FFULL) << 56);
419 76a66253 j_mayer
420 76a66253 j_mayer
    return u.d;
421 76a66253 j_mayer
}
422 76a66253 j_mayer
423 76a66253 j_mayer
void glue(do_POWER2_lfq_le, MEMSUFFIX) (void)
424 76a66253 j_mayer
{
425 d9bce9d9 j_mayer
    FT0 = glue(ldfqr, MEMSUFFIX)((uint32_t)(T0 + 4));
426 d9bce9d9 j_mayer
    FT1 = glue(ldfqr, MEMSUFFIX)((uint32_t)T0);
427 76a66253 j_mayer
}
428 76a66253 j_mayer
429 76a66253 j_mayer
void glue(do_POWER2_stfq, MEMSUFFIX) (void)
430 76a66253 j_mayer
{
431 d9bce9d9 j_mayer
    glue(stfq, MEMSUFFIX)((uint32_t)T0, FT0);
432 d9bce9d9 j_mayer
    glue(stfq, MEMSUFFIX)((uint32_t)(T0 + 4), FT1);
433 76a66253 j_mayer
}
434 76a66253 j_mayer
435 b068d6a7 j_mayer
static always_inline void glue(stfqr, MEMSUFFIX) (target_ulong EA, double d)
436 76a66253 j_mayer
{
437 76a66253 j_mayer
    union {
438 76a66253 j_mayer
        double d;
439 76a66253 j_mayer
        uint64_t u;
440 76a66253 j_mayer
    } u;
441 76a66253 j_mayer
442 76a66253 j_mayer
    u.d = d;
443 76a66253 j_mayer
    u.u = ((u.u & 0xFF00000000000000ULL) >> 56) |
444 76a66253 j_mayer
        ((u.u & 0x00FF000000000000ULL) >> 40) |
445 76a66253 j_mayer
        ((u.u & 0x0000FF0000000000ULL) >> 24) |
446 76a66253 j_mayer
        ((u.u & 0x000000FF00000000ULL) >> 8) |
447 76a66253 j_mayer
        ((u.u & 0x00000000FF000000ULL) << 8) |
448 76a66253 j_mayer
        ((u.u & 0x0000000000FF0000ULL) << 24) |
449 76a66253 j_mayer
        ((u.u & 0x000000000000FF00ULL) << 40) |
450 76a66253 j_mayer
        ((u.u & 0x00000000000000FFULL) << 56);
451 76a66253 j_mayer
    glue(stfq, MEMSUFFIX)(EA, u.d);
452 76a66253 j_mayer
}
453 76a66253 j_mayer
454 76a66253 j_mayer
void glue(do_POWER2_stfq_le, MEMSUFFIX) (void)
455 76a66253 j_mayer
{
456 d9bce9d9 j_mayer
    glue(stfqr, MEMSUFFIX)((uint32_t)(T0 + 4), FT0);
457 d9bce9d9 j_mayer
    glue(stfqr, MEMSUFFIX)((uint32_t)T0, FT1);
458 76a66253 j_mayer
}
459 76a66253 j_mayer
460 9a64fbe4 bellard
#undef MEMSUFFIX