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