]> Git Repo - qemu.git/blame - target-ppc/op_helper.h
target-ppc: convert exceptions generation 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 */
a42bd6cc
JM
147void do_load_dcr (void);
148void do_store_dcr (void);
a750fc0b 149#if !defined(CONFIG_USER_ONLY)
a42bd6cc
JM
150void do_40x_rfci (void);
151void do_rfci (void);
152void do_rfdi (void);
153void do_rfmci (void);
76a66253
JM
154void do_4xx_tlbre_lo (void);
155void do_4xx_tlbre_hi (void);
76a66253
JM
156void do_4xx_tlbwe_lo (void);
157void do_4xx_tlbwe_hi (void);
158#endif
159
0487d6a8 160/* PowerPC 440 specific helpers */
76a66253
JM
161void do_440_dlmzb (void);
162
0487d6a8 163/* PowerPC 403 specific helpers */
76a66253
JM
164#if !defined(CONFIG_USER_ONLY)
165void do_load_403_pb (int num);
166void do_store_403_pb (int num);
167#endif
168
0487d6a8
JM
169/* SPE extension helpers */
170void do_brinc (void);
171/* Fixed-point vector helpers */
172void do_evabs (void);
173void do_evaddw (void);
174void do_evcntlsw (void);
175void do_evcntlzw (void);
176void do_evneg (void);
177void do_evrlw (void);
178void do_evsel (void);
179void do_evrndw (void);
180void do_evslw (void);
181void do_evsrws (void);
182void do_evsrwu (void);
183void do_evsubfw (void);
184void do_evcmpeq (void);
185void do_evcmpgts (void);
186void do_evcmpgtu (void);
187void do_evcmplts (void);
188void do_evcmpltu (void);
189
190/* Single precision floating-point helpers */
191void do_efscmplt (void);
192void do_efscmpgt (void);
193void do_efscmpeq (void);
194void do_efscfsf (void);
195void do_efscfuf (void);
196void do_efsctsf (void);
197void do_efsctuf (void);
198
199void do_efscfsi (void);
200void do_efscfui (void);
201void do_efsctsi (void);
202void do_efsctui (void);
203void do_efsctsiz (void);
204void do_efsctuiz (void);
205
206/* Double precision floating-point helpers */
207void do_efdcmplt (void);
208void do_efdcmpgt (void);
209void do_efdcmpeq (void);
210void do_efdcfsf (void);
211void do_efdcfuf (void);
212void do_efdctsf (void);
213void do_efdctuf (void);
214
215void do_efdcfsi (void);
216void do_efdcfui (void);
217void do_efdctsi (void);
218void do_efdctui (void);
219void do_efdctsiz (void);
220void do_efdctuiz (void);
221
222void do_efdcfs (void);
223void do_efscfd (void);
224
225/* Floating-point vector helpers */
226void do_evfsabs (void);
227void do_evfsnabs (void);
228void do_evfsneg (void);
229void do_evfsadd (void);
230void do_evfssub (void);
231void do_evfsmul (void);
232void do_evfsdiv (void);
233void do_evfscmplt (void);
234void do_evfscmpgt (void);
235void do_evfscmpeq (void);
236void do_evfststlt (void);
237void do_evfststgt (void);
238void do_evfststeq (void);
239void do_evfscfsi (void);
240void do_evfscfui (void);
241void do_evfscfsf (void);
242void do_evfscfuf (void);
243void do_evfsctsf (void);
244void do_evfsctuf (void);
245void do_evfsctsi (void);
246void do_evfsctui (void);
247void do_evfsctsiz (void);
248void do_evfsctuiz (void);
0487d6a8 249
0487d6a8
JM
250/* SPE extension */
251/* Single precision floating-point helpers */
b068d6a7 252static always_inline uint32_t _do_efsabs (uint32_t val)
0487d6a8
JM
253{
254 return val & ~0x80000000;
255}
b068d6a7 256static always_inline uint32_t _do_efsnabs (uint32_t val)
0487d6a8
JM
257{
258 return val | 0x80000000;
259}
b068d6a7 260static always_inline uint32_t _do_efsneg (uint32_t val)
0487d6a8
JM
261{
262 return val ^ 0x80000000;
263}
b068d6a7 264static always_inline uint32_t _do_efsadd (uint32_t op1, uint32_t op2)
0487d6a8 265{
0ca9d380
AJ
266 CPU_FloatU u1, u2;
267 u1.l = op1;
268 u2.l = op2;
0487d6a8 269 u1.f = float32_add(u1.f, u2.f, &env->spe_status);
0ca9d380 270 return u1.l;
0487d6a8 271}
b068d6a7 272static always_inline uint32_t _do_efssub (uint32_t op1, uint32_t op2)
0487d6a8 273{
0ca9d380
AJ
274 CPU_FloatU u1, u2;
275 u1.l = op1;
276 u2.l = op2;
0487d6a8 277 u1.f = float32_sub(u1.f, u2.f, &env->spe_status);
0ca9d380 278 return u1.l;
0487d6a8 279}
b068d6a7 280static always_inline uint32_t _do_efsmul (uint32_t op1, uint32_t op2)
0487d6a8 281{
0ca9d380
AJ
282 CPU_FloatU u1, u2;
283 u1.l = op1;
284 u2.l = op2;
0487d6a8 285 u1.f = float32_mul(u1.f, u2.f, &env->spe_status);
0ca9d380 286 return u1.l;
0487d6a8 287}
b068d6a7 288static always_inline uint32_t _do_efsdiv (uint32_t op1, uint32_t op2)
0487d6a8 289{
0ca9d380
AJ
290 CPU_FloatU u1, u2;
291 u1.l = op1;
292 u2.l = op2;
0487d6a8 293 u1.f = float32_div(u1.f, u2.f, &env->spe_status);
0ca9d380 294 return u1.l;
0487d6a8
JM
295}
296
b068d6a7 297static always_inline int _do_efststlt (uint32_t op1, uint32_t op2)
0487d6a8 298{
0ca9d380
AJ
299 CPU_FloatU u1, u2;
300 u1.l = op1;
301 u2.l = op2;
894efddb 302 return float32_lt(u1.f, u2.f, &env->spe_status) ? 4 : 0;
0487d6a8 303}
b068d6a7 304static always_inline int _do_efststgt (uint32_t op1, uint32_t op2)
0487d6a8 305{
0ca9d380
AJ
306 CPU_FloatU u1, u2;
307 u1.l = op1;
308 u2.l = op2;
894efddb 309 return float32_le(u1.f, u2.f, &env->spe_status) ? 0 : 4;
0487d6a8 310}
b068d6a7 311static always_inline int _do_efststeq (uint32_t op1, uint32_t op2)
0487d6a8 312{
0ca9d380
AJ
313 CPU_FloatU u1, u2;
314 u1.l = op1;
315 u2.l = op2;
894efddb 316 return float32_eq(u1.f, u2.f, &env->spe_status) ? 4 : 0;
0487d6a8
JM
317}
318/* Double precision floating-point helpers */
b068d6a7 319static always_inline int _do_efdtstlt (uint64_t op1, uint64_t op2)
0487d6a8 320{
0ca9d380
AJ
321 CPU_DoubleU u1, u2;
322 u1.ll = op1;
323 u2.ll = op2;
894efddb 324 return float64_lt(u1.d, u2.d, &env->spe_status) ? 4 : 0;
0487d6a8 325}
b068d6a7 326static always_inline int _do_efdtstgt (uint64_t op1, uint64_t op2)
0487d6a8 327{
0ca9d380
AJ
328 CPU_DoubleU u1, u2;
329 u1.ll = op1;
330 u2.ll = op2;
894efddb 331 return float64_le(u1.d, u2.d, &env->spe_status) ? 0 : 4;
0487d6a8 332}
b068d6a7 333static always_inline int _do_efdtsteq (uint64_t op1, uint64_t op2)
0487d6a8 334{
0ca9d380
AJ
335 CPU_DoubleU u1, u2;
336 u1.ll = op1;
337 u2.ll = op2;
894efddb 338 return float64_eq(u1.d, u2.d, &env->spe_status) ? 4 : 0;
0487d6a8 339}
76a66253 340#endif
This page took 0.19722 seconds and 4 git commands to generate.