ALL: Huge upstream synch + PerRom DelaySI & CountPerOp parameters
[mupen64plus-pandora.git] / source / mupen64plus-core / src / r4300 / x86 / gbc.c
CommitLineData
451ab91e 1/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
2 * Mupen64plus - gbc.c *
3 * Mupen64Plus homepage: http://code.google.com/p/mupen64plus/ *
4 * Copyright (C) 2002 Hacktarux *
5 * *
6 * This program is free software; you can redistribute it and/or modify *
7 * it under the terms of the GNU General Public License as published by *
8 * the Free Software Foundation; either version 2 of the License, or *
9 * (at your option) any later version. *
10 * *
11 * This program 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 *
14 * GNU General Public License for more details. *
15 * *
16 * You should have received a copy of the GNU General Public License *
17 * along with this program; if not, write to the *
18 * Free Software Foundation, Inc., *
19 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
20 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
21
22#include <stdio.h>
23
24#include "assemble.h"
25#include "interpret.h"
26
27#include "r4300/recomph.h"
28#include "r4300/r4300.h"
29#include "r4300/ops.h"
30
31static void genbc1f_test(void)
32{
33 test_m32_imm32((unsigned int*)&FCR31, 0x800000);
34 jne_rj(12);
35 mov_m32_imm32((unsigned int*)(&branch_taken), 1); // 10
36 jmp_imm_short(10); // 2
37 mov_m32_imm32((unsigned int*)(&branch_taken), 0); // 10
38}
39
40void genbc1f(void)
41{
42#ifdef INTERPRET_BC1F
43 gencallinterp((unsigned int)cached_interpreter_table.BC1F, 1);
44#else
45 if (((dst->addr & 0xFFF) == 0xFFC &&
46 (dst->addr < 0x80000000 || dst->addr >= 0xC0000000))||no_compiled_jump)
47 {
48 gencallinterp((unsigned int)cached_interpreter_table.BC1F, 1);
49 return;
50 }
51
52 gencheck_cop1_unusable();
53 genbc1f_test();
54 gendelayslot();
55 gentest();
56#endif
57}
58
59void genbc1f_out(void)
60{
61#ifdef INTERPRET_BC1F_OUT
62 gencallinterp((unsigned int)cached_interpreter_table.BC1F_OUT, 1);
63#else
64 if (((dst->addr & 0xFFF) == 0xFFC &&
65 (dst->addr < 0x80000000 || dst->addr >= 0xC0000000))||no_compiled_jump)
66 {
67 gencallinterp((unsigned int)cached_interpreter_table.BC1F_OUT, 1);
68 return;
69 }
70
71 gencheck_cop1_unusable();
72 genbc1f_test();
73 gendelayslot();
74 gentest_out();
75#endif
76}
77
78void genbc1f_idle(void)
79{
80#ifdef INTERPRET_BC1F_IDLE
81 gencallinterp((unsigned int)cached_interpreter_table.BC1F_IDLE, 1);
82#else
83 if (((dst->addr & 0xFFF) == 0xFFC &&
84 (dst->addr < 0x80000000 || dst->addr >= 0xC0000000))||no_compiled_jump)
85 {
86 gencallinterp((unsigned int)cached_interpreter_table.BC1F_IDLE, 1);
87 return;
88 }
89
90 gencheck_cop1_unusable();
91 genbc1f_test();
92 gentest_idle();
93 genbc1f();
94#endif
95}
96
97static void genbc1t_test(void)
98{
99 test_m32_imm32((unsigned int*)&FCR31, 0x800000);
100 je_rj(12);
101 mov_m32_imm32((unsigned int*)(&branch_taken), 1); // 10
102 jmp_imm_short(10); // 2
103 mov_m32_imm32((unsigned int*)(&branch_taken), 0); // 10
104}
105
106void genbc1t(void)
107{
108#ifdef INTERPRET_BC1T
109 gencallinterp((unsigned int)cached_interpreter_table.BC1T, 1);
110#else
111 if (((dst->addr & 0xFFF) == 0xFFC &&
112 (dst->addr < 0x80000000 || dst->addr >= 0xC0000000))||no_compiled_jump)
113 {
114 gencallinterp((unsigned int)cached_interpreter_table.BC1T, 1);
115 return;
116 }
117
118 gencheck_cop1_unusable();
119 genbc1t_test();
120 gendelayslot();
121 gentest();
122#endif
123}
124
125void genbc1t_out(void)
126{
127#ifdef INTERPRET_BC1T_OUT
128 gencallinterp((unsigned int)cached_interpreter_table.BC1T_OUT, 1);
129#else
130 if (((dst->addr & 0xFFF) == 0xFFC &&
131 (dst->addr < 0x80000000 || dst->addr >= 0xC0000000))||no_compiled_jump)
132 {
133 gencallinterp((unsigned int)cached_interpreter_table.BC1T_OUT, 1);
134 return;
135 }
136
137 gencheck_cop1_unusable();
138 genbc1t_test();
139 gendelayslot();
140 gentest_out();
141#endif
142}
143
144void genbc1t_idle(void)
145{
146#ifdef INTERPRET_BC1T_IDLE
147 gencallinterp((unsigned int)cached_interpreter_table.BC1T_IDLE, 1);
148#else
149 if (((dst->addr & 0xFFF) == 0xFFC &&
150 (dst->addr < 0x80000000 || dst->addr >= 0xC0000000))||no_compiled_jump)
151 {
152 gencallinterp((unsigned int)cached_interpreter_table.BC1T_IDLE, 1);
153 return;
154 }
155
156 gencheck_cop1_unusable();
157 genbc1t_test();
158 gentest_idle();
159 genbc1t();
160#endif
161}
162
163void genbc1fl(void)
164{
165#ifdef INTERPRET_BC1FL
166 gencallinterp((unsigned int)cached_interpreter_table.BC1FL, 1);
167#else
168 if (((dst->addr & 0xFFF) == 0xFFC &&
169 (dst->addr < 0x80000000 || dst->addr >= 0xC0000000))||no_compiled_jump)
170 {
171 gencallinterp((unsigned int)cached_interpreter_table.BC1FL, 1);
172 return;
173 }
174
175 gencheck_cop1_unusable();
176 genbc1f_test();
177 free_all_registers();
178 gentestl();
179#endif
180}
181
182void genbc1fl_out(void)
183{
184#ifdef INTERPRET_BC1FL_OUT
185 gencallinterp((unsigned int)cached_interpreter_table.BC1FL_OUT, 1);
186#else
187 if (((dst->addr & 0xFFF) == 0xFFC &&
188 (dst->addr < 0x80000000 || dst->addr >= 0xC0000000))||no_compiled_jump)
189 {
190 gencallinterp((unsigned int)cached_interpreter_table.BC1FL_OUT, 1);
191 return;
192 }
193
194 gencheck_cop1_unusable();
195 genbc1f_test();
196 free_all_registers();
197 gentestl_out();
198#endif
199}
200
201void genbc1fl_idle(void)
202{
203#ifdef INTERPRET_BC1FL_IDLE
204 gencallinterp((unsigned int)cached_interpreter_table.BC1FL_IDLE, 1);
205#else
206 if (((dst->addr & 0xFFF) == 0xFFC &&
207 (dst->addr < 0x80000000 || dst->addr >= 0xC0000000))||no_compiled_jump)
208 {
209 gencallinterp((unsigned int)cached_interpreter_table.BC1FL_IDLE, 1);
210 return;
211 }
212
213 gencheck_cop1_unusable();
214 genbc1f_test();
215 gentest_idle();
216 genbc1fl();
217#endif
218}
219
220void genbc1tl(void)
221{
222#ifdef INTERPRET_BC1TL
223 gencallinterp((unsigned int)cached_interpreter_table.BC1TL, 1);
224#else
225 if (((dst->addr & 0xFFF) == 0xFFC &&
226 (dst->addr < 0x80000000 || dst->addr >= 0xC0000000))||no_compiled_jump)
227 {
228 gencallinterp((unsigned int)cached_interpreter_table.BC1TL, 1);
229 return;
230 }
231
232 gencheck_cop1_unusable();
233 genbc1t_test();
234 free_all_registers();
235 gentestl();
236#endif
237}
238
239void genbc1tl_out(void)
240{
241#ifdef INTERPRET_BC1TL_OUT
242 gencallinterp((unsigned int)cached_interpreter_table.BC1TL_OUT, 1);
243#else
244 if (((dst->addr & 0xFFF) == 0xFFC &&
245 (dst->addr < 0x80000000 || dst->addr >= 0xC0000000))||no_compiled_jump)
246 {
247 gencallinterp((unsigned int)cached_interpreter_table.BC1TL_OUT, 1);
248 return;
249 }
250
251 gencheck_cop1_unusable();
252 genbc1t_test();
253 free_all_registers();
254 gentestl_out();
255#endif
256}
257
258void genbc1tl_idle(void)
259{
260#ifdef INTERPRET_BC1TL_IDLE
261 gencallinterp((unsigned int)cached_interpreter_table.BC1TL_IDLE, 1);
262#else
263 if (((dst->addr & 0xFFF) == 0xFFC &&
264 (dst->addr < 0x80000000 || dst->addr >= 0xC0000000))||no_compiled_jump)
265 {
266 gencallinterp((unsigned int)cached_interpreter_table.BC1TL_IDLE, 1);
267 return;
268 }
269
270 gencheck_cop1_unusable();
271 genbc1t_test();
272 gentest_idle();
273 genbc1tl();
274#endif
275}
276