Statistics
| Branch: | Revision:

root / target-ppc / op_helper.h @ 64adab3f

History | View | Annotate | Download (8.5 kB)

1 76a66253 j_mayer
/*
2 76a66253 j_mayer
 *  PowerPC emulation helpers header for qemu.
3 5fafdf24 ths
 *
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
#if defined(MEMSUFFIX)
22 76a66253 j_mayer
23 76a66253 j_mayer
/* Memory load/store helpers */
24 76a66253 j_mayer
void glue(do_lsw, MEMSUFFIX) (int dst);
25 76a66253 j_mayer
void glue(do_stsw, MEMSUFFIX) (int src);
26 76a66253 j_mayer
void glue(do_lmw, MEMSUFFIX) (int dst);
27 76a66253 j_mayer
void glue(do_lmw_le, MEMSUFFIX) (int dst);
28 76a66253 j_mayer
void glue(do_stmw, MEMSUFFIX) (int src);
29 76a66253 j_mayer
void glue(do_stmw_le, MEMSUFFIX) (int src);
30 36f69651 j_mayer
void glue(do_icbi, MEMSUFFIX) (void);
31 d63001d1 j_mayer
void glue(do_dcbz, MEMSUFFIX) (void);
32 76a66253 j_mayer
void glue(do_POWER_lscbx, MEMSUFFIX) (int dest, int ra, int rb);
33 76a66253 j_mayer
void glue(do_POWER2_lfq, MEMSUFFIX) (void);
34 76a66253 j_mayer
void glue(do_POWER2_lfq_le, MEMSUFFIX) (void);
35 76a66253 j_mayer
void glue(do_POWER2_stfq, MEMSUFFIX) (void);
36 76a66253 j_mayer
void glue(do_POWER2_stfq_le, MEMSUFFIX) (void);
37 76a66253 j_mayer
38 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
39 d9bce9d9 j_mayer
void glue(do_lsw_64, MEMSUFFIX) (int dst);
40 d9bce9d9 j_mayer
void glue(do_stsw_64, MEMSUFFIX) (int src);
41 d9bce9d9 j_mayer
void glue(do_lmw_64, MEMSUFFIX) (int dst);
42 d9bce9d9 j_mayer
void glue(do_lmw_le_64, MEMSUFFIX) (int dst);
43 d9bce9d9 j_mayer
void glue(do_stmw_64, MEMSUFFIX) (int src);
44 d9bce9d9 j_mayer
void glue(do_stmw_le_64, MEMSUFFIX) (int src);
45 36f69651 j_mayer
void glue(do_icbi_64, MEMSUFFIX) (void);
46 d63001d1 j_mayer
void glue(do_dcbz_64, MEMSUFFIX) (void);
47 d9bce9d9 j_mayer
#endif
48 d9bce9d9 j_mayer
49 76a66253 j_mayer
#else
50 76a66253 j_mayer
51 a496775f j_mayer
void do_print_mem_EA (target_ulong EA);
52 a496775f j_mayer
53 76a66253 j_mayer
/* Registers load and stores */
54 6676f424 aurel32
void do_load_cr (void);
55 76a66253 j_mayer
void do_store_cr (uint32_t mask);
56 c80f84e3 j_mayer
#if defined(TARGET_PPC64)
57 c80f84e3 j_mayer
void do_store_pri (int prio);
58 c80f84e3 j_mayer
#endif
59 7c58044c j_mayer
void do_fpscr_setbit (int bit);
60 76a66253 j_mayer
void do_store_fpscr (uint32_t mask);
61 a496775f j_mayer
target_ulong ppc_load_dump_spr (int sprn);
62 a496775f j_mayer
void ppc_store_dump_spr (int sprn, target_ulong val);
63 76a66253 j_mayer
64 76a66253 j_mayer
/* Floating-point arithmetic helpers */
65 7c58044c j_mayer
void do_compute_fprf (int set_class);
66 7c58044c j_mayer
#ifdef CONFIG_SOFTFLOAT
67 7c58044c j_mayer
void do_float_check_status (void);
68 7c58044c j_mayer
#endif
69 1cdb9c3d aurel32
#if USE_PRECISE_EMULATION
70 7c58044c j_mayer
void do_fadd (void);
71 7c58044c j_mayer
void do_fsub (void);
72 7c58044c j_mayer
void do_fmul (void);
73 7c58044c j_mayer
void do_fdiv (void);
74 7c58044c j_mayer
#endif
75 76a66253 j_mayer
void do_fsqrt (void);
76 d7e4b87e j_mayer
void do_fre (void);
77 76a66253 j_mayer
void do_fres (void);
78 76a66253 j_mayer
void do_frsqrte (void);
79 76a66253 j_mayer
void do_fsel (void);
80 1cdb9c3d aurel32
#if USE_PRECISE_EMULATION
81 e864cabd j_mayer
void do_fmadd (void);
82 e864cabd j_mayer
void do_fmsub (void);
83 e864cabd j_mayer
#endif
84 76a66253 j_mayer
void do_fnmadd (void);
85 76a66253 j_mayer
void do_fnmsub (void);
86 1cdb9c3d aurel32
#if USE_PRECISE_EMULATION
87 7c58044c j_mayer
void do_frsp (void);
88 7c58044c j_mayer
#endif
89 76a66253 j_mayer
void do_fctiw (void);
90 76a66253 j_mayer
void do_fctiwz (void);
91 426613db j_mayer
#if defined(TARGET_PPC64)
92 426613db j_mayer
void do_fcfid (void);
93 426613db j_mayer
void do_fctid (void);
94 426613db j_mayer
void do_fctidz (void);
95 426613db j_mayer
#endif
96 d7e4b87e j_mayer
void do_frin (void);
97 d7e4b87e j_mayer
void do_friz (void);
98 d7e4b87e j_mayer
void do_frip (void);
99 d7e4b87e j_mayer
void do_frim (void);
100 76a66253 j_mayer
void do_fcmpu (void);
101 76a66253 j_mayer
void do_fcmpo (void);
102 76a66253 j_mayer
103 0487d6a8 j_mayer
/* Misc */
104 76a66253 j_mayer
void do_tw (int flags);
105 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
106 d9bce9d9 j_mayer
void do_td (int flags);
107 d9bce9d9 j_mayer
#endif
108 76a66253 j_mayer
#if !defined(CONFIG_USER_ONLY)
109 6676f424 aurel32
void do_store_msr (void);
110 76a66253 j_mayer
void do_rfi (void);
111 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
112 426613db j_mayer
void do_rfid (void);
113 be147d08 j_mayer
void do_hrfid (void);
114 be147d08 j_mayer
#endif
115 76a66253 j_mayer
void do_load_6xx_tlb (int is_code);
116 7dbe11ac j_mayer
void do_load_74xx_tlb (int is_code);
117 76a66253 j_mayer
#endif
118 76a66253 j_mayer
119 76a66253 j_mayer
/* POWER / PowerPC 601 specific helpers */
120 76a66253 j_mayer
void do_POWER_abso (void);
121 76a66253 j_mayer
void do_POWER_clcs (void);
122 76a66253 j_mayer
void do_POWER_div (void);
123 76a66253 j_mayer
void do_POWER_divo (void);
124 76a66253 j_mayer
void do_POWER_divs (void);
125 76a66253 j_mayer
void do_POWER_divso (void);
126 76a66253 j_mayer
void do_POWER_dozo (void);
127 76a66253 j_mayer
void do_POWER_maskg (void);
128 76a66253 j_mayer
void do_POWER_mulo (void);
129 76a66253 j_mayer
#if !defined(CONFIG_USER_ONLY)
130 76a66253 j_mayer
void do_POWER_rac (void);
131 76a66253 j_mayer
void do_POWER_rfsvc (void);
132 056401ea j_mayer
void do_store_hid0_601 (void);
133 76a66253 j_mayer
#endif
134 76a66253 j_mayer
135 76a66253 j_mayer
/* PowerPC 602 specific helper */
136 76a66253 j_mayer
#if !defined(CONFIG_USER_ONLY)
137 76a66253 j_mayer
void do_op_602_mfrom (void);
138 76a66253 j_mayer
#endif
139 76a66253 j_mayer
140 a4bb6c3e j_mayer
/* PowerPC 440 specific helpers */
141 5eb7995e j_mayer
#if !defined(CONFIG_USER_ONLY)
142 a4bb6c3e j_mayer
void do_440_tlbre (int word);
143 a4bb6c3e j_mayer
void do_440_tlbwe (int word);
144 5eb7995e j_mayer
#endif
145 5eb7995e j_mayer
146 76a66253 j_mayer
/* PowerPC 4xx specific helpers */
147 a42bd6cc j_mayer
void do_load_dcr (void);
148 a42bd6cc j_mayer
void do_store_dcr (void);
149 a750fc0b j_mayer
#if !defined(CONFIG_USER_ONLY)
150 a42bd6cc j_mayer
void do_40x_rfci (void);
151 a42bd6cc j_mayer
void do_rfci (void);
152 a42bd6cc j_mayer
void do_rfdi (void);
153 a42bd6cc j_mayer
void do_rfmci (void);
154 76a66253 j_mayer
void do_4xx_tlbre_lo (void);
155 76a66253 j_mayer
void do_4xx_tlbre_hi (void);
156 76a66253 j_mayer
void do_4xx_tlbwe_lo (void);
157 76a66253 j_mayer
void do_4xx_tlbwe_hi (void);
158 76a66253 j_mayer
#endif
159 76a66253 j_mayer
160 0487d6a8 j_mayer
/* PowerPC 440 specific helpers */
161 76a66253 j_mayer
void do_440_dlmzb (void);
162 76a66253 j_mayer
163 0487d6a8 j_mayer
/* PowerPC 403 specific helpers */
164 76a66253 j_mayer
#if !defined(CONFIG_USER_ONLY)
165 76a66253 j_mayer
void do_load_403_pb (int num);
166 76a66253 j_mayer
void do_store_403_pb (int num);
167 76a66253 j_mayer
#endif
168 76a66253 j_mayer
169 0487d6a8 j_mayer
/* SPE extension helpers */
170 0487d6a8 j_mayer
void do_brinc (void);
171 0487d6a8 j_mayer
/* Fixed-point vector helpers */
172 0487d6a8 j_mayer
void do_evabs (void);
173 0487d6a8 j_mayer
void do_evaddw (void);
174 0487d6a8 j_mayer
void do_evcntlsw (void);
175 0487d6a8 j_mayer
void do_evcntlzw (void);
176 0487d6a8 j_mayer
void do_evneg (void);
177 0487d6a8 j_mayer
void do_evrlw (void);
178 0487d6a8 j_mayer
void do_evsel (void);
179 0487d6a8 j_mayer
void do_evrndw (void);
180 0487d6a8 j_mayer
void do_evslw (void);
181 0487d6a8 j_mayer
void do_evsrws (void);
182 0487d6a8 j_mayer
void do_evsrwu (void);
183 0487d6a8 j_mayer
void do_evsubfw (void);
184 0487d6a8 j_mayer
void do_evcmpeq (void);
185 0487d6a8 j_mayer
void do_evcmpgts (void);
186 0487d6a8 j_mayer
void do_evcmpgtu (void);
187 0487d6a8 j_mayer
void do_evcmplts (void);
188 0487d6a8 j_mayer
void do_evcmpltu (void);
189 0487d6a8 j_mayer
190 0487d6a8 j_mayer
/* Single precision floating-point helpers */
191 0487d6a8 j_mayer
void do_efscmplt (void);
192 0487d6a8 j_mayer
void do_efscmpgt (void);
193 0487d6a8 j_mayer
void do_efscmpeq (void);
194 0487d6a8 j_mayer
void do_efscfsf (void);
195 0487d6a8 j_mayer
void do_efscfuf (void);
196 0487d6a8 j_mayer
void do_efsctsf (void);
197 0487d6a8 j_mayer
void do_efsctuf (void);
198 0487d6a8 j_mayer
199 0487d6a8 j_mayer
void do_efscfsi (void);
200 0487d6a8 j_mayer
void do_efscfui (void);
201 0487d6a8 j_mayer
void do_efsctsi (void);
202 0487d6a8 j_mayer
void do_efsctui (void);
203 0487d6a8 j_mayer
void do_efsctsiz (void);
204 0487d6a8 j_mayer
void do_efsctuiz (void);
205 0487d6a8 j_mayer
206 0487d6a8 j_mayer
/* Double precision floating-point helpers */
207 0487d6a8 j_mayer
void do_efdcmplt (void);
208 0487d6a8 j_mayer
void do_efdcmpgt (void);
209 0487d6a8 j_mayer
void do_efdcmpeq (void);
210 0487d6a8 j_mayer
void do_efdcfsf (void);
211 0487d6a8 j_mayer
void do_efdcfuf (void);
212 0487d6a8 j_mayer
void do_efdctsf (void);
213 0487d6a8 j_mayer
void do_efdctuf (void);
214 0487d6a8 j_mayer
215 0487d6a8 j_mayer
void do_efdcfsi (void);
216 0487d6a8 j_mayer
void do_efdcfui (void);
217 0487d6a8 j_mayer
void do_efdctsi (void);
218 0487d6a8 j_mayer
void do_efdctui (void);
219 0487d6a8 j_mayer
void do_efdctsiz (void);
220 0487d6a8 j_mayer
void do_efdctuiz (void);
221 0487d6a8 j_mayer
222 0487d6a8 j_mayer
void do_efdcfs (void);
223 0487d6a8 j_mayer
void do_efscfd (void);
224 0487d6a8 j_mayer
225 0487d6a8 j_mayer
/* Floating-point vector helpers */
226 0487d6a8 j_mayer
void do_evfsabs (void);
227 0487d6a8 j_mayer
void do_evfsnabs (void);
228 0487d6a8 j_mayer
void do_evfsneg (void);
229 0487d6a8 j_mayer
void do_evfsadd (void);
230 0487d6a8 j_mayer
void do_evfssub (void);
231 0487d6a8 j_mayer
void do_evfsmul (void);
232 0487d6a8 j_mayer
void do_evfsdiv (void);
233 0487d6a8 j_mayer
void do_evfscmplt (void);
234 0487d6a8 j_mayer
void do_evfscmpgt (void);
235 0487d6a8 j_mayer
void do_evfscmpeq (void);
236 0487d6a8 j_mayer
void do_evfststlt (void);
237 0487d6a8 j_mayer
void do_evfststgt (void);
238 0487d6a8 j_mayer
void do_evfststeq (void);
239 0487d6a8 j_mayer
void do_evfscfsi (void);
240 0487d6a8 j_mayer
void do_evfscfui (void);
241 0487d6a8 j_mayer
void do_evfscfsf (void);
242 0487d6a8 j_mayer
void do_evfscfuf (void);
243 0487d6a8 j_mayer
void do_evfsctsf (void);
244 0487d6a8 j_mayer
void do_evfsctuf (void);
245 0487d6a8 j_mayer
void do_evfsctsi (void);
246 0487d6a8 j_mayer
void do_evfsctui (void);
247 0487d6a8 j_mayer
void do_evfsctsiz (void);
248 0487d6a8 j_mayer
void do_evfsctuiz (void);
249 0487d6a8 j_mayer
250 0487d6a8 j_mayer
/* SPE extension */
251 0487d6a8 j_mayer
/* Single precision floating-point helpers */
252 b068d6a7 j_mayer
static always_inline uint32_t _do_efsabs (uint32_t val)
253 0487d6a8 j_mayer
{
254 0487d6a8 j_mayer
    return val & ~0x80000000;
255 0487d6a8 j_mayer
}
256 b068d6a7 j_mayer
static always_inline uint32_t _do_efsnabs (uint32_t val)
257 0487d6a8 j_mayer
{
258 0487d6a8 j_mayer
    return val | 0x80000000;
259 0487d6a8 j_mayer
}
260 b068d6a7 j_mayer
static always_inline uint32_t _do_efsneg (uint32_t val)
261 0487d6a8 j_mayer
{
262 0487d6a8 j_mayer
    return val ^ 0x80000000;
263 0487d6a8 j_mayer
}
264 b068d6a7 j_mayer
static always_inline uint32_t _do_efsadd (uint32_t op1, uint32_t op2)
265 0487d6a8 j_mayer
{
266 0ca9d380 aurel32
    CPU_FloatU u1, u2;
267 0ca9d380 aurel32
    u1.l = op1;
268 0ca9d380 aurel32
    u2.l = op2;
269 0487d6a8 j_mayer
    u1.f = float32_add(u1.f, u2.f, &env->spe_status);
270 0ca9d380 aurel32
    return u1.l;
271 0487d6a8 j_mayer
}
272 b068d6a7 j_mayer
static always_inline uint32_t _do_efssub (uint32_t op1, uint32_t op2)
273 0487d6a8 j_mayer
{
274 0ca9d380 aurel32
    CPU_FloatU u1, u2;
275 0ca9d380 aurel32
    u1.l = op1;
276 0ca9d380 aurel32
    u2.l = op2;
277 0487d6a8 j_mayer
    u1.f = float32_sub(u1.f, u2.f, &env->spe_status);
278 0ca9d380 aurel32
    return u1.l;
279 0487d6a8 j_mayer
}
280 b068d6a7 j_mayer
static always_inline uint32_t _do_efsmul (uint32_t op1, uint32_t op2)
281 0487d6a8 j_mayer
{
282 0ca9d380 aurel32
    CPU_FloatU u1, u2;
283 0ca9d380 aurel32
    u1.l = op1;
284 0ca9d380 aurel32
    u2.l = op2;
285 0487d6a8 j_mayer
    u1.f = float32_mul(u1.f, u2.f, &env->spe_status);
286 0ca9d380 aurel32
    return u1.l;
287 0487d6a8 j_mayer
}
288 b068d6a7 j_mayer
static always_inline uint32_t _do_efsdiv (uint32_t op1, uint32_t op2)
289 0487d6a8 j_mayer
{
290 0ca9d380 aurel32
    CPU_FloatU u1, u2;
291 0ca9d380 aurel32
    u1.l = op1;
292 0ca9d380 aurel32
    u2.l = op2;
293 0487d6a8 j_mayer
    u1.f = float32_div(u1.f, u2.f, &env->spe_status);
294 0ca9d380 aurel32
    return u1.l;
295 0487d6a8 j_mayer
}
296 0487d6a8 j_mayer
297 b068d6a7 j_mayer
static always_inline int _do_efststlt (uint32_t op1, uint32_t op2)
298 0487d6a8 j_mayer
{
299 0ca9d380 aurel32
    CPU_FloatU u1, u2;
300 0ca9d380 aurel32
    u1.l = op1;
301 0ca9d380 aurel32
    u2.l = op2;
302 894efddb aurel32
    return float32_lt(u1.f, u2.f, &env->spe_status) ? 4 : 0;
303 0487d6a8 j_mayer
}
304 b068d6a7 j_mayer
static always_inline int _do_efststgt (uint32_t op1, uint32_t op2)
305 0487d6a8 j_mayer
{
306 0ca9d380 aurel32
    CPU_FloatU u1, u2;
307 0ca9d380 aurel32
    u1.l = op1;
308 0ca9d380 aurel32
    u2.l = op2;
309 894efddb aurel32
    return float32_le(u1.f, u2.f, &env->spe_status) ? 0 : 4;
310 0487d6a8 j_mayer
}
311 b068d6a7 j_mayer
static always_inline int _do_efststeq (uint32_t op1, uint32_t op2)
312 0487d6a8 j_mayer
{
313 0ca9d380 aurel32
    CPU_FloatU u1, u2;
314 0ca9d380 aurel32
    u1.l = op1;
315 0ca9d380 aurel32
    u2.l = op2;
316 894efddb aurel32
    return float32_eq(u1.f, u2.f, &env->spe_status) ? 4 : 0;
317 0487d6a8 j_mayer
}
318 0487d6a8 j_mayer
/* Double precision floating-point helpers */
319 b068d6a7 j_mayer
static always_inline int _do_efdtstlt (uint64_t op1, uint64_t op2)
320 0487d6a8 j_mayer
{
321 0ca9d380 aurel32
    CPU_DoubleU u1, u2;
322 0ca9d380 aurel32
    u1.ll = op1;
323 0ca9d380 aurel32
    u2.ll = op2;
324 894efddb aurel32
    return float64_lt(u1.d, u2.d, &env->spe_status) ? 4 : 0;
325 0487d6a8 j_mayer
}
326 b068d6a7 j_mayer
static always_inline int _do_efdtstgt (uint64_t op1, uint64_t op2)
327 0487d6a8 j_mayer
{
328 0ca9d380 aurel32
    CPU_DoubleU u1, u2;
329 0ca9d380 aurel32
    u1.ll = op1;
330 0ca9d380 aurel32
    u2.ll = op2;
331 894efddb aurel32
    return float64_le(u1.d, u2.d, &env->spe_status) ? 0 : 4;
332 0487d6a8 j_mayer
}
333 b068d6a7 j_mayer
static always_inline int _do_efdtsteq (uint64_t op1, uint64_t op2)
334 0487d6a8 j_mayer
{
335 0ca9d380 aurel32
    CPU_DoubleU u1, u2;
336 0ca9d380 aurel32
    u1.ll = op1;
337 0ca9d380 aurel32
    u2.ll = op2;
338 894efddb aurel32
    return float64_eq(u1.d, u2.d, &env->spe_status) ? 4 : 0;
339 0487d6a8 j_mayer
}
340 76a66253 j_mayer
#endif