root / target-ppc / op_template.h @ f9fdea6b
History | View | Annotate | Download (4.5 kB)
1 | 28b6751f | bellard | /*
|
---|---|---|---|
2 | 3fc6c082 | bellard | * PowerPC emulation micro-operations for qemu.
|
3 | 5fafdf24 | ths | *
|
4 | 76a66253 | j_mayer | * Copyright (c) 2003-2007 Jocelyn Mayer
|
5 | 28b6751f | bellard | *
|
6 | 28b6751f | bellard | * This library is free software; you can redistribute it and/or
|
7 | 28b6751f | bellard | * modify it under the terms of the GNU Lesser General Public
|
8 | 28b6751f | bellard | * License as published by the Free Software Foundation; either
|
9 | 28b6751f | bellard | * version 2 of the License, or (at your option) any later version.
|
10 | 28b6751f | bellard | *
|
11 | 28b6751f | bellard | * This library is distributed in the hope that it will be useful,
|
12 | 28b6751f | bellard | * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13 | 28b6751f | bellard | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
14 | 28b6751f | bellard | * Lesser General Public License for more details.
|
15 | 28b6751f | bellard | *
|
16 | 28b6751f | bellard | * You should have received a copy of the GNU Lesser General Public
|
17 | 28b6751f | bellard | * License along with this library; if not, write to the Free Software
|
18 | 28b6751f | bellard | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
19 | 28b6751f | bellard | */
|
20 | 28b6751f | bellard | |
21 | 9a64fbe4 | bellard | /* General purpose registers moves */
|
22 | 76a66253 | j_mayer | void OPPROTO glue(op_load_gpr_T0_gpr, REG) (void) |
23 | 28b6751f | bellard | { |
24 | 36081602 | j_mayer | T0 = env->gpr[REG]; |
25 | 9a64fbe4 | bellard | RETURN(); |
26 | 28b6751f | bellard | } |
27 | 28b6751f | bellard | |
28 | 76a66253 | j_mayer | void OPPROTO glue(op_load_gpr_T1_gpr, REG) (void) |
29 | 28b6751f | bellard | { |
30 | 36081602 | j_mayer | T1 = env->gpr[REG]; |
31 | 9a64fbe4 | bellard | RETURN(); |
32 | 28b6751f | bellard | } |
33 | 28b6751f | bellard | |
34 | 76a66253 | j_mayer | void OPPROTO glue(op_load_gpr_T2_gpr, REG) (void) |
35 | 28b6751f | bellard | { |
36 | 36081602 | j_mayer | T2 = env->gpr[REG]; |
37 | 9a64fbe4 | bellard | RETURN(); |
38 | 28b6751f | bellard | } |
39 | 28b6751f | bellard | |
40 | 76a66253 | j_mayer | void OPPROTO glue(op_store_T0_gpr_gpr, REG) (void) |
41 | 28b6751f | bellard | { |
42 | 36081602 | j_mayer | env->gpr[REG] = T0; |
43 | 9a64fbe4 | bellard | RETURN(); |
44 | 28b6751f | bellard | } |
45 | 28b6751f | bellard | |
46 | 76a66253 | j_mayer | void OPPROTO glue(op_store_T1_gpr_gpr, REG) (void) |
47 | 28b6751f | bellard | { |
48 | 36081602 | j_mayer | env->gpr[REG] = T1; |
49 | 9a64fbe4 | bellard | RETURN(); |
50 | 28b6751f | bellard | } |
51 | 28b6751f | bellard | |
52 | 76a66253 | j_mayer | #if 0 // unused
|
53 | 76a66253 | j_mayer | void OPPROTO glue(op_store_T2_gpr_gpr, REG) (void)
|
54 | 28b6751f | bellard | {
|
55 | 36081602 | j_mayer | env->gpr[REG] = T2;
|
56 | 9a64fbe4 | bellard | RETURN();
|
57 | 28b6751f | bellard | }
|
58 | 76a66253 | j_mayer | #endif
|
59 | 28b6751f | bellard | |
60 | a9d9eb8f | j_mayer | /* General purpose registers containing vector operands moves */
|
61 | 35cdaad6 | j_mayer | #if defined(TARGET_PPCEMB)
|
62 | 0487d6a8 | j_mayer | void OPPROTO glue(op_load_gpr64_T0_gpr, REG) (void) |
63 | 0487d6a8 | j_mayer | { |
64 | 36081602 | j_mayer | T0_64 = env->gpr[REG]; |
65 | 0487d6a8 | j_mayer | RETURN(); |
66 | 0487d6a8 | j_mayer | } |
67 | 0487d6a8 | j_mayer | |
68 | 0487d6a8 | j_mayer | void OPPROTO glue(op_load_gpr64_T1_gpr, REG) (void) |
69 | 0487d6a8 | j_mayer | { |
70 | 36081602 | j_mayer | T1_64 = env->gpr[REG]; |
71 | 0487d6a8 | j_mayer | RETURN(); |
72 | 0487d6a8 | j_mayer | } |
73 | 0487d6a8 | j_mayer | |
74 | 0487d6a8 | j_mayer | #if 0 // unused
|
75 | 0487d6a8 | j_mayer | void OPPROTO glue(op_load_gpr64_T2_gpr, REG) (void)
|
76 | 0487d6a8 | j_mayer | {
|
77 | 36081602 | j_mayer | T2_64 = env->gpr[REG];
|
78 | 0487d6a8 | j_mayer | RETURN();
|
79 | 0487d6a8 | j_mayer | }
|
80 | 0487d6a8 | j_mayer | #endif
|
81 | 0487d6a8 | j_mayer | |
82 | 0487d6a8 | j_mayer | void OPPROTO glue(op_store_T0_gpr64_gpr, REG) (void) |
83 | 0487d6a8 | j_mayer | { |
84 | 36081602 | j_mayer | env->gpr[REG] = T0_64; |
85 | 0487d6a8 | j_mayer | RETURN(); |
86 | 0487d6a8 | j_mayer | } |
87 | 0487d6a8 | j_mayer | |
88 | 0487d6a8 | j_mayer | void OPPROTO glue(op_store_T1_gpr64_gpr, REG) (void) |
89 | 0487d6a8 | j_mayer | { |
90 | 36081602 | j_mayer | env->gpr[REG] = T1_64; |
91 | 0487d6a8 | j_mayer | RETURN(); |
92 | 0487d6a8 | j_mayer | } |
93 | 0487d6a8 | j_mayer | |
94 | 0487d6a8 | j_mayer | #if 0 // unused
|
95 | 0487d6a8 | j_mayer | void OPPROTO glue(op_store_T2_gpr64_gpr, REG) (void)
|
96 | 0487d6a8 | j_mayer | {
|
97 | 36081602 | j_mayer | env->gpr[REG] = T2_64;
|
98 | 0487d6a8 | j_mayer | RETURN();
|
99 | 0487d6a8 | j_mayer | }
|
100 | 0487d6a8 | j_mayer | #endif
|
101 | 35cdaad6 | j_mayer | #endif /* defined(TARGET_PPCEMB) */ |
102 | 0487d6a8 | j_mayer | |
103 | a9d9eb8f | j_mayer | /* Altivec registers moves */
|
104 | a9d9eb8f | j_mayer | void OPPROTO glue(op_load_avr_A0_avr, REG) (void) |
105 | a9d9eb8f | j_mayer | { |
106 | a9d9eb8f | j_mayer | AVR0 = env->avr[REG]; |
107 | a9d9eb8f | j_mayer | RETURN(); |
108 | a9d9eb8f | j_mayer | } |
109 | a9d9eb8f | j_mayer | |
110 | a9d9eb8f | j_mayer | void OPPROTO glue(op_load_avr_A1_avr, REG) (void) |
111 | a9d9eb8f | j_mayer | { |
112 | a9d9eb8f | j_mayer | AVR1 = env->avr[REG]; |
113 | a9d9eb8f | j_mayer | RETURN(); |
114 | a9d9eb8f | j_mayer | } |
115 | a9d9eb8f | j_mayer | |
116 | a9d9eb8f | j_mayer | void OPPROTO glue(op_load_avr_A2_avr, REG) (void) |
117 | a9d9eb8f | j_mayer | { |
118 | a9d9eb8f | j_mayer | AVR2 = env->avr[REG]; |
119 | a9d9eb8f | j_mayer | RETURN(); |
120 | a9d9eb8f | j_mayer | } |
121 | a9d9eb8f | j_mayer | |
122 | a9d9eb8f | j_mayer | void OPPROTO glue(op_store_A0_avr_avr, REG) (void) |
123 | a9d9eb8f | j_mayer | { |
124 | a9d9eb8f | j_mayer | env->avr[REG] = AVR0; |
125 | a9d9eb8f | j_mayer | RETURN(); |
126 | a9d9eb8f | j_mayer | } |
127 | a9d9eb8f | j_mayer | |
128 | a9d9eb8f | j_mayer | void OPPROTO glue(op_store_A1_avr_avr, REG) (void) |
129 | a9d9eb8f | j_mayer | { |
130 | a9d9eb8f | j_mayer | env->avr[REG] = AVR1; |
131 | a9d9eb8f | j_mayer | RETURN(); |
132 | a9d9eb8f | j_mayer | } |
133 | a9d9eb8f | j_mayer | |
134 | a9d9eb8f | j_mayer | #if 0 // unused
|
135 | a9d9eb8f | j_mayer | void OPPROTO glue(op_store_A2_avr_avr, REG) (void)
|
136 | a9d9eb8f | j_mayer | {
|
137 | a9d9eb8f | j_mayer | env->avr[REG] = AVR2;
|
138 | a9d9eb8f | j_mayer | RETURN();
|
139 | a9d9eb8f | j_mayer | }
|
140 | a9d9eb8f | j_mayer | #endif
|
141 | a9d9eb8f | j_mayer | |
142 | 28b6751f | bellard | #if REG <= 7 |
143 | 9a64fbe4 | bellard | /* Condition register moves */
|
144 | 76a66253 | j_mayer | void OPPROTO glue(op_load_crf_T0_crf, REG) (void) |
145 | 28b6751f | bellard | { |
146 | 36081602 | j_mayer | T0 = env->crf[REG]; |
147 | 9a64fbe4 | bellard | RETURN(); |
148 | 28b6751f | bellard | } |
149 | 28b6751f | bellard | |
150 | 76a66253 | j_mayer | void OPPROTO glue(op_load_crf_T1_crf, REG) (void) |
151 | 28b6751f | bellard | { |
152 | 36081602 | j_mayer | T1 = env->crf[REG]; |
153 | 9a64fbe4 | bellard | RETURN(); |
154 | 28b6751f | bellard | } |
155 | 28b6751f | bellard | |
156 | 76a66253 | j_mayer | void OPPROTO glue(op_store_T0_crf_crf, REG) (void) |
157 | 28b6751f | bellard | { |
158 | 36081602 | j_mayer | env->crf[REG] = T0; |
159 | 9a64fbe4 | bellard | RETURN(); |
160 | 28b6751f | bellard | } |
161 | 28b6751f | bellard | |
162 | 76a66253 | j_mayer | void OPPROTO glue(op_store_T1_crf_crf, REG) (void) |
163 | 28b6751f | bellard | { |
164 | 36081602 | j_mayer | env->crf[REG] = T1; |
165 | 9a64fbe4 | bellard | RETURN(); |
166 | 28b6751f | bellard | } |
167 | 28b6751f | bellard | |
168 | fb0eaffc | bellard | /* Floating point condition and status register moves */
|
169 | 76a66253 | j_mayer | void OPPROTO glue(op_load_fpscr_T0_fpscr, REG) (void) |
170 | fb0eaffc | bellard | { |
171 | 36081602 | j_mayer | T0 = env->fpscr[REG]; |
172 | fb0eaffc | bellard | RETURN(); |
173 | fb0eaffc | bellard | } |
174 | fb0eaffc | bellard | |
175 | fb0eaffc | bellard | #if REG == 0 |
176 | 76a66253 | j_mayer | void OPPROTO glue(op_store_T0_fpscr_fpscr, REG) (void) |
177 | fb0eaffc | bellard | { |
178 | 36081602 | j_mayer | env->fpscr[REG] = (env->fpscr[REG] & 0x9) | (T0 & ~0x9); |
179 | fb0eaffc | bellard | RETURN(); |
180 | fb0eaffc | bellard | } |
181 | fb0eaffc | bellard | |
182 | 76a66253 | j_mayer | void OPPROTO glue(op_clear_fpscr_fpscr, REG) (void) |
183 | fb0eaffc | bellard | { |
184 | 36081602 | j_mayer | env->fpscr[REG] = (env->fpscr[REG] & 0x9);
|
185 | fb0eaffc | bellard | RETURN(); |
186 | fb0eaffc | bellard | } |
187 | fb0eaffc | bellard | #else
|
188 | 76a66253 | j_mayer | void OPPROTO glue(op_store_T0_fpscr_fpscr, REG) (void) |
189 | fb0eaffc | bellard | { |
190 | 36081602 | j_mayer | env->fpscr[REG] = T0; |
191 | fb0eaffc | bellard | RETURN(); |
192 | fb0eaffc | bellard | } |
193 | fb0eaffc | bellard | |
194 | 76a66253 | j_mayer | void OPPROTO glue(op_clear_fpscr_fpscr, REG) (void) |
195 | fb0eaffc | bellard | { |
196 | 36081602 | j_mayer | env->fpscr[REG] = 0x0;
|
197 | fb0eaffc | bellard | RETURN(); |
198 | fb0eaffc | bellard | } |
199 | fb0eaffc | bellard | #endif
|
200 | fb0eaffc | bellard | |
201 | 28b6751f | bellard | #endif /* REG <= 7 */ |
202 | 28b6751f | bellard | |
203 | fb0eaffc | bellard | /* floating point registers moves */
|
204 | 76a66253 | j_mayer | void OPPROTO glue(op_load_fpr_FT0_fpr, REG) (void) |
205 | 28b6751f | bellard | { |
206 | 28b6751f | bellard | FT0 = env->fpr[REG]; |
207 | fb0eaffc | bellard | RETURN(); |
208 | 28b6751f | bellard | } |
209 | 28b6751f | bellard | |
210 | 76a66253 | j_mayer | void OPPROTO glue(op_store_FT0_fpr_fpr, REG) (void) |
211 | 28b6751f | bellard | { |
212 | 28b6751f | bellard | env->fpr[REG] = FT0; |
213 | fb0eaffc | bellard | RETURN(); |
214 | fb0eaffc | bellard | } |
215 | fb0eaffc | bellard | |
216 | 76a66253 | j_mayer | void OPPROTO glue(op_load_fpr_FT1_fpr, REG) (void) |
217 | fb0eaffc | bellard | { |
218 | fb0eaffc | bellard | FT1 = env->fpr[REG]; |
219 | fb0eaffc | bellard | RETURN(); |
220 | fb0eaffc | bellard | } |
221 | fb0eaffc | bellard | |
222 | 76a66253 | j_mayer | void OPPROTO glue(op_store_FT1_fpr_fpr, REG) (void) |
223 | fb0eaffc | bellard | { |
224 | fb0eaffc | bellard | env->fpr[REG] = FT1; |
225 | fb0eaffc | bellard | RETURN(); |
226 | fb0eaffc | bellard | } |
227 | fb0eaffc | bellard | |
228 | 76a66253 | j_mayer | void OPPROTO glue(op_load_fpr_FT2_fpr, REG) (void) |
229 | fb0eaffc | bellard | { |
230 | fb0eaffc | bellard | FT2 = env->fpr[REG]; |
231 | fb0eaffc | bellard | RETURN(); |
232 | fb0eaffc | bellard | } |
233 | fb0eaffc | bellard | |
234 | 76a66253 | j_mayer | #if 0 // unused
|
235 | 76a66253 | j_mayer | void OPPROTO glue(op_store_FT2_fpr_fpr, REG) (void)
|
236 | fb0eaffc | bellard | {
|
237 | fb0eaffc | bellard | env->fpr[REG] = FT2;
|
238 | fb0eaffc | bellard | RETURN();
|
239 | 28b6751f | bellard | }
|
240 | 9a64fbe4 | bellard | #endif
|
241 | 9a64fbe4 | bellard | |
242 | 28b6751f | bellard | #undef REG |