root / target-ppc / op_helper_mem.h @ 9c7e37e7
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 | d63001d1 | j_mayer | T0 &= ~(env->icache_line_size - 1);
|
256 | f0685f6e | j_mayer | tmp = glue(ldl, MEMSUFFIX)((uint32_t)T0); |
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 | d63001d1 | j_mayer | T0 &= ~(env->icache_line_size - 1);
|
271 | f0685f6e | j_mayer | tmp = glue(ldq, MEMSUFFIX)((uint64_t)T0); |
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 |