4 * Copyright (c) 2005 Samuel Tardieu
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.
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.
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
22 static inline void set_t(void)
27 static inline void clr_t(void)
32 static inline void cond_t(int cond)
40 void OPPROTO op_ldtlb(void)
46 void OPPROTO op_frchg(void)
48 env->fpscr ^= FPSCR_FR;
52 void OPPROTO op_fschg(void)
54 env->fpscr ^= FPSCR_SZ;
58 void OPPROTO op_addc_T0_T1(void)
64 void OPPROTO op_addv_T0_T1(void)
70 void OPPROTO op_cmp_str_T0_T1(void)
72 cond_t((T0 & 0x000000ff) == (T1 & 0x000000ff) ||
73 (T0 & 0x0000ff00) == (T1 & 0x0000ff00) ||
74 (T0 & 0x00ff0000) == (T1 & 0x00ff0000) ||
75 (T0 & 0xff000000) == (T1 & 0xff000000));
79 void OPPROTO op_div0s_T0_T1(void)
89 cond_t((T1 ^ T0) & 0x80000000);
93 void OPPROTO op_div1_T0_T1(void)
99 void OPPROTO op_dmulsl_T0_T1(void)
101 helper_dmulsl_T0_T1();
105 void OPPROTO op_dmulul_T0_T1(void)
107 helper_dmulul_T0_T1();
111 void OPPROTO op_macl_T0_T1(void)
117 void OPPROTO op_macw_T0_T1(void)
123 void OPPROTO op_mull_T0_T1(void)
125 env->macl = (T0 * T1) & 0xffffffff;
129 void OPPROTO op_mulsw_T0_T1(void)
131 env->macl = (int32_t)(int16_t) T0 *(int32_t)(int16_t) T1;
135 void OPPROTO op_muluw_T0_T1(void)
137 env->macl = (uint32_t)(uint16_t) T0 *(uint32_t)(uint16_t) T1;
141 void OPPROTO op_negc_T0(void)
147 void OPPROTO op_shad_T0_T1(void)
149 if ((T0 & 0x80000000) == 0)
151 else if ((T0 & 0x1f) == 0)
152 T1 = (T1 & 0x80000000)? 0xffffffff : 0;
154 T1 = ((int32_t) T1) >> ((~T0 & 0x1f) + 1);
158 void OPPROTO op_shld_T0_T1(void)
160 if ((T0 & 0x80000000) == 0)
162 else if ((T0 & 0x1f) == 0)
165 T1 = ((uint32_t) T1) >> ((~T0 & 0x1f) + 1);
169 void OPPROTO op_subc_T0_T1(void)
175 void OPPROTO op_subv_T0_T1(void)
181 void OPPROTO op_trapa(void)
183 env->tra = PARAM1 << 2;
184 env->exception_index = 0x160;
185 do_raise_exception();
189 void OPPROTO op_ldcl_rMplus_rN_bank(void)
191 env->gregs[PARAM2] = env->gregs[PARAM1];
192 env->gregs[PARAM1] += 4;
196 void OPPROTO op_ldc_T0_sr(void)
198 env->sr = T0 & 0x700083f3;
202 void OPPROTO op_stc_sr_T0(void)
208 #define LDSTOPS(target,load,store) \
209 void OPPROTO op_##load##_T0_##target (void) \
210 { env ->target = T0; RETURN(); \
212 void OPPROTO op_##store##_##target##_T0 (void) \
213 { T0 = env->target; RETURN(); \
216 LDSTOPS(gbr, ldc, stc)
217 LDSTOPS(vbr, ldc, stc)
218 LDSTOPS(ssr, ldc, stc)
219 LDSTOPS(spc, ldc, stc)
220 LDSTOPS(sgr, ldc, stc)
221 LDSTOPS(dbr, ldc, stc)
222 LDSTOPS(mach, lds, sts)
223 LDSTOPS(macl, lds, sts)
224 LDSTOPS(pr, lds, sts)
225 LDSTOPS(fpul, lds, sts)
227 void OPPROTO op_lds_T0_fpscr(void)
229 env->fpscr = T0 & 0x003fffff;
230 env->fp_status.float_rounding_mode = T0 & 0x01 ?
231 float_round_to_zero : float_round_nearest_even;
236 void OPPROTO op_sts_fpscr_T0(void)
238 T0 = env->fpscr & 0x003fffff;
242 void OPPROTO op_rotcl_Rn(void)
244 helper_rotcl(&env->gregs[PARAM1]);
248 void OPPROTO op_rotcr_Rn(void)
250 helper_rotcr(&env->gregs[PARAM1]);
254 void OPPROTO op_rotl_Rn(void)
256 cond_t(env->gregs[PARAM1] & 0x80000000);
257 env->gregs[PARAM1] = (env->gregs[PARAM1] << 1) | (env->sr & SR_T);
261 void OPPROTO op_rotr_Rn(void)
263 cond_t(env->gregs[PARAM1] & 1);
264 env->gregs[PARAM1] = (env->gregs[PARAM1] >> 1) |
265 ((env->sr & SR_T) ? 0x80000000 : 0);
269 void OPPROTO op_shal_Rn(void)
271 cond_t(env->gregs[PARAM1] & 0x80000000);
272 env->gregs[PARAM1] <<= 1;
276 void OPPROTO op_shar_Rn(void)
278 cond_t(env->gregs[PARAM1] & 1);
279 *(int32_t *)&env->gregs[PARAM1] >>= 1;
283 void OPPROTO op_shlr_Rn(void)
285 cond_t(env->gregs[PARAM1] & 1);
286 env->gregs[PARAM1] >>= 1;
290 void OPPROTO op_fmov_frN_FT0(void)
292 FT0 = env->fregs[PARAM1];
296 void OPPROTO op_fmov_drN_DT0(void)
300 d.l.upper = *(uint32_t *)&env->fregs[PARAM1];
301 d.l.lower = *(uint32_t *)&env->fregs[PARAM1 + 1];
306 void OPPROTO op_fmov_frN_FT1(void)
308 FT1 = env->fregs[PARAM1];
312 void OPPROTO op_fmov_drN_DT1(void)
316 d.l.upper = *(uint32_t *)&env->fregs[PARAM1];
317 d.l.lower = *(uint32_t *)&env->fregs[PARAM1 + 1];
322 void OPPROTO op_fmov_FT0_frN(void)
324 env->fregs[PARAM1] = FT0;
328 void OPPROTO op_fmov_DT0_drN(void)
333 *(uint32_t *)&env->fregs[PARAM1] = d.l.upper;
334 *(uint32_t *)&env->fregs[PARAM1 + 1] = d.l.lower;
338 void OPPROTO op_fadd_FT(void)
340 FT0 = float32_add(FT0, FT1, &env->fp_status);
344 void OPPROTO op_fadd_DT(void)
346 DT0 = float64_add(DT0, DT1, &env->fp_status);
350 void OPPROTO op_fsub_FT(void)
352 FT0 = float32_sub(FT0, FT1, &env->fp_status);
356 void OPPROTO op_fsub_DT(void)
358 DT0 = float64_sub(DT0, DT1, &env->fp_status);
362 void OPPROTO op_fmul_FT(void)
364 FT0 = float32_mul(FT0, FT1, &env->fp_status);
368 void OPPROTO op_fmul_DT(void)
370 DT0 = float64_mul(DT0, DT1, &env->fp_status);
374 void OPPROTO op_fdiv_FT(void)
376 FT0 = float32_div(FT0, FT1, &env->fp_status);
380 void OPPROTO op_fdiv_DT(void)
382 DT0 = float64_div(DT0, DT1, &env->fp_status);
386 void OPPROTO op_fcmp_eq_FT(void)
388 cond_t(float32_compare(FT0, FT1, &env->fp_status) == 0);
392 void OPPROTO op_fcmp_eq_DT(void)
394 cond_t(float64_compare(DT0, DT1, &env->fp_status) == 0);
398 void OPPROTO op_fcmp_gt_FT(void)
400 cond_t(float32_compare(FT0, FT1, &env->fp_status) == 1);
404 void OPPROTO op_fcmp_gt_DT(void)
406 cond_t(float64_compare(DT0, DT1, &env->fp_status) == 1);
410 void OPPROTO op_float_FT(void)
412 FT0 = int32_to_float32(env->fpul, &env->fp_status);
416 void OPPROTO op_float_DT(void)
418 DT0 = int32_to_float64(env->fpul, &env->fp_status);
422 void OPPROTO op_ftrc_FT(void)
424 env->fpul = float32_to_int32_round_to_zero(FT0, &env->fp_status);
428 void OPPROTO op_ftrc_DT(void)
430 env->fpul = float64_to_int32_round_to_zero(DT0, &env->fp_status);
434 void OPPROTO op_fneg_frN(void)
436 env->fregs[PARAM1] = float32_chs(env->fregs[PARAM1]);
440 void OPPROTO op_fabs_FT(void)
442 FT0 = float32_abs(FT0);
446 void OPPROTO op_fabs_DT(void)
448 DT0 = float64_abs(DT0);
452 void OPPROTO op_fcnvsd_FT_DT(void)
454 DT0 = float32_to_float64(FT0, &env->fp_status);
458 void OPPROTO op_fcnvds_DT_FT(void)
460 FT0 = float64_to_float32(DT0, &env->fp_status);
464 void OPPROTO op_fsqrt_FT(void)
466 FT0 = float32_sqrt(FT0, &env->fp_status);
470 void OPPROTO op_fsqrt_DT(void)
472 DT0 = float64_sqrt(DT0, &env->fp_status);
476 void OPPROTO op_fmov_T0_frN(void)
478 *(uint32_t *)&env->fregs[PARAM1] = T0;
482 void OPPROTO op_movl_fpul_FT0(void)
484 FT0 = *(float32 *)&env->fpul;
488 void OPPROTO op_movl_FT0_fpul(void)
490 *(float32 *)&env->fpul = FT0;
494 void OPPROTO op_raise_illegal_instruction(void)
496 env->exception_index = 0x180;
497 do_raise_exception();
501 void OPPROTO op_raise_slot_illegal_instruction(void)
503 env->exception_index = 0x1a0;
504 do_raise_exception();
508 void OPPROTO op_debug(void)
510 env->exception_index = EXCP_DEBUG;
514 void OPPROTO op_sleep(void)
517 env->exception_index = EXCP_HLT;
522 #define MEMSUFFIX _raw
525 #if !defined(CONFIG_USER_ONLY)
526 #define MEMSUFFIX _user
530 #define MEMSUFFIX _kernel