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