]> git.proxmox.com Git - qemu.git/blame - target-ppc/op.c
target-ppc: convert SLB/TLB instructions to TCG
[qemu.git] / target-ppc / op.c
CommitLineData
79aceca5 1/*
3fc6c082 2 * PowerPC emulation micro-operations for qemu.
5fafdf24 3 *
76a66253 4 * Copyright (c) 2003-2007 Jocelyn Mayer
79aceca5
FB
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
a541f297
FB
21//#define DEBUG_OP
22
79aceca5
FB
23#include "config.h"
24#include "exec.h"
603fccce 25#include "host-utils.h"
0411a972 26#include "helper_regs.h"
76a66253 27#include "op_helper.h"
79aceca5 28
76a66253 29#if !defined(CONFIG_USER_ONLY)
36081602 30void OPPROTO op_load_sdr1 (void)
76a66253 31{
36081602 32 T0 = env->sdr1;
76a66253
JM
33 RETURN();
34}
35
36081602 36void OPPROTO op_store_sdr1 (void)
76a66253
JM
37{
38 do_store_sdr1(env, T0);
79aceca5
FB
39 RETURN();
40}
41
d9bce9d9
JM
42#if defined (TARGET_PPC64)
43void OPPROTO op_load_asr (void)
44{
45 T0 = env->asr;
46 RETURN();
47}
48
49void OPPROTO op_store_asr (void)
50{
51 ppc_store_asr(env, T0);
52 RETURN();
53}
54#endif
d9bce9d9 55#endif
9a64fbe4
FB
56
57/* SPR */
a496775f
JM
58void OPPROTO op_load_spr (void)
59{
60 T0 = env->spr[PARAM1];
61 RETURN();
62}
63
64void OPPROTO op_store_spr (void)
65{
66 env->spr[PARAM1] = T0;
67 RETURN();
68}
69
70void OPPROTO op_load_dump_spr (void)
71{
72 T0 = ppc_load_dump_spr(PARAM1);
73 RETURN();
74}
75
76void OPPROTO op_store_dump_spr (void)
9a64fbe4 77{
a496775f 78 ppc_store_dump_spr(PARAM1, T0);
9a64fbe4
FB
79 RETURN();
80}
81
a496775f 82void OPPROTO op_mask_spr (void)
9a64fbe4 83{
a496775f 84 env->spr[PARAM1] &= ~T0;
79aceca5
FB
85 RETURN();
86}
87
36081602 88void OPPROTO op_load_tbl (void)
9a64fbe4 89{
36081602 90 T0 = cpu_ppc_load_tbl(env);
9a64fbe4
FB
91 RETURN();
92}
93
36081602 94void OPPROTO op_load_tbu (void)
9a64fbe4 95{
36081602 96 T0 = cpu_ppc_load_tbu(env);
9a64fbe4
FB
97 RETURN();
98}
99
a062e36c
JM
100void OPPROTO op_load_atbl (void)
101{
102 T0 = cpu_ppc_load_atbl(env);
103 RETURN();
104}
105
106void OPPROTO op_load_atbu (void)
107{
108 T0 = cpu_ppc_load_atbu(env);
109 RETURN();
110}
111
76a66253 112#if !defined(CONFIG_USER_ONLY)
36081602 113void OPPROTO op_store_tbl (void)
9a64fbe4 114{
36081602 115 cpu_ppc_store_tbl(env, T0);
79aceca5
FB
116 RETURN();
117}
118
36081602 119void OPPROTO op_store_tbu (void)
9a64fbe4 120{
36081602 121 cpu_ppc_store_tbu(env, T0);
9a64fbe4
FB
122 RETURN();
123}
124
a062e36c
JM
125void OPPROTO op_store_atbl (void)
126{
127 cpu_ppc_store_atbl(env, T0);
128 RETURN();
129}
130
131void OPPROTO op_store_atbu (void)
132{
133 cpu_ppc_store_atbu(env, T0);
134 RETURN();
135}
136
36081602 137void OPPROTO op_load_decr (void)
9a64fbe4 138{
36081602 139 T0 = cpu_ppc_load_decr(env);
76a66253
JM
140 RETURN();
141}
9fddaa0c 142
36081602 143void OPPROTO op_store_decr (void)
9fddaa0c 144{
36081602 145 cpu_ppc_store_decr(env, T0);
9a64fbe4
FB
146 RETURN();
147}
148
36081602 149void OPPROTO op_load_ibat (void)
9a64fbe4 150{
36081602 151 T0 = env->IBAT[PARAM1][PARAM2];
76a66253 152 RETURN();
9a64fbe4
FB
153}
154
76a66253 155void OPPROTO op_store_ibatu (void)
9a64fbe4 156{
3fc6c082
FB
157 do_store_ibatu(env, PARAM1, T0);
158 RETURN();
159}
160
76a66253 161void OPPROTO op_store_ibatl (void)
3fc6c082
FB
162{
163#if 1
164 env->IBAT[1][PARAM1] = T0;
165#else
166 do_store_ibatl(env, PARAM1, T0);
167#endif
168 RETURN();
9a64fbe4
FB
169}
170
36081602 171void OPPROTO op_load_dbat (void)
9a64fbe4 172{
36081602 173 T0 = env->DBAT[PARAM1][PARAM2];
76a66253 174 RETURN();
9a64fbe4
FB
175}
176
76a66253 177void OPPROTO op_store_dbatu (void)
3fc6c082
FB
178{
179 do_store_dbatu(env, PARAM1, T0);
180 RETURN();
181}
182
76a66253 183void OPPROTO op_store_dbatl (void)
9a64fbe4 184{
3fc6c082
FB
185#if 1
186 env->DBAT[1][PARAM1] = T0;
187#else
188 do_store_dbatl(env, PARAM1, T0);
189#endif
190 RETURN();
9a64fbe4 191}
76a66253 192#endif /* !defined(CONFIG_USER_ONLY) */
9a64fbe4 193
9a64fbe4 194/* Return from interrupt */
76a66253 195#if !defined(CONFIG_USER_ONLY)
6f5d427d
JM
196/* Exception vectors */
197void OPPROTO op_store_excp_prefix (void)
198{
199 T0 &= env->ivpr_mask;
200 env->excp_prefix = T0;
201 RETURN();
202}
203
204void OPPROTO op_store_excp_vector (void)
205{
206 T0 &= env->ivor_mask;
207 env->excp_vectors[PARAM1] = T0;
208 RETURN();
209}
76a66253 210#endif
fb0eaffc 211
76a66253 212/* 601 specific */
76a66253
JM
213void OPPROTO op_load_601_rtcl (void)
214{
215 T0 = cpu_ppc601_load_rtcl(env);
216 RETURN();
217}
218
76a66253
JM
219void OPPROTO op_load_601_rtcu (void)
220{
221 T0 = cpu_ppc601_load_rtcu(env);
222 RETURN();
223}
224
225#if !defined(CONFIG_USER_ONLY)
76a66253
JM
226void OPPROTO op_store_601_rtcl (void)
227{
228 cpu_ppc601_store_rtcl(env, T0);
229 RETURN();
230}
231
76a66253
JM
232void OPPROTO op_store_601_rtcu (void)
233{
234 cpu_ppc601_store_rtcu(env, T0);
235 RETURN();
236}
237
056401ea
JM
238void OPPROTO op_store_hid0_601 (void)
239{
240 do_store_hid0_601();
241 RETURN();
242}
243
76a66253
JM
244void OPPROTO op_load_601_bat (void)
245{
246 T0 = env->IBAT[PARAM1][PARAM2];
247 RETURN();
248}
76a66253 249
76a66253
JM
250void OPPROTO op_store_601_batl (void)
251{
056401ea 252 do_store_ibatl_601(env, PARAM1, T0);
76a66253
JM
253 RETURN();
254}
255
256void OPPROTO op_store_601_batu (void)
257{
056401ea 258 do_store_ibatu_601(env, PARAM1, T0);
76a66253
JM
259 RETURN();
260}
261#endif /* !defined(CONFIG_USER_ONLY) */
262
76a66253
JM
263/* SPR micro-ops */
264/* 440 specific */
76a66253
JM
265#if !defined(CONFIG_USER_ONLY)
266void OPPROTO op_store_pir (void)
3fc6c082
FB
267{
268 env->spr[SPR_PIR] = T0 & 0x0000000FUL;
269 RETURN();
270}
76a66253
JM
271
272void OPPROTO op_load_403_pb (void)
273{
274 do_load_403_pb(PARAM1);
275 RETURN();
276}
277
278void OPPROTO op_store_403_pb (void)
279{
280 do_store_403_pb(PARAM1);
281 RETURN();
282}
283
76a66253
JM
284void OPPROTO op_load_40x_pit (void)
285{
286 T0 = load_40x_pit(env);
287 RETURN();
288}
289
76a66253
JM
290void OPPROTO op_store_40x_pit (void)
291{
292 store_40x_pit(env, T0);
293 RETURN();
294}
295
8ecc7913
JM
296void OPPROTO op_store_40x_dbcr0 (void)
297{
298 store_40x_dbcr0(env, T0);
be147d08 299 RETURN();
8ecc7913
JM
300}
301
c294fc58
JM
302void OPPROTO op_store_40x_sler (void)
303{
304 store_40x_sler(env, T0);
305 RETURN();
306}
307
76a66253
JM
308void OPPROTO op_store_booke_tcr (void)
309{
310 store_booke_tcr(env, T0);
311 RETURN();
312}
313
76a66253
JM
314void OPPROTO op_store_booke_tsr (void)
315{
316 store_booke_tsr(env, T0);
317 RETURN();
318}
319#endif /* !defined(CONFIG_USER_ONLY) */
0487d6a8 320