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_flag(uint32_t flag)
27 static inline void clr_flag(uint32_t flag)
32 static inline void set_t(void)
37 static inline void clr_t(void)
42 static inline void cond_t(int cond)
50 void OPPROTO op_movl_imm_T0(void)
52 T0 = (uint32_t) PARAM1;
56 void OPPROTO op_movl_imm_T1(void)
58 T0 = (uint32_t) PARAM1;
62 void OPPROTO op_movl_imm_T2(void)
64 T0 = (uint32_t) PARAM1;
68 void OPPROTO op_cmp_eq_imm_T0(void)
70 cond_t((int32_t) T0 == (int32_t) PARAM1);
74 void OPPROTO op_cmd_eq_T0_T1(void)
80 void OPPROTO op_cmd_hs_T0_T1(void)
82 cond_t((uint32_t) T0 <= (uint32_t) T1);
86 void OPPROTO op_cmd_ge_T0_T1(void)
88 cond_t((int32_t) T0 <= (int32_t) T1);
92 void OPPROTO op_cmd_hi_T0_T1(void)
94 cond_t((uint32_t) T0 < (uint32_t) T1);
98 void OPPROTO op_cmd_gt_T0_T1(void)
100 cond_t((int32_t) T0 < (int32_t) T1);
104 void OPPROTO op_not_T0(void)
110 void OPPROTO op_bf_s(void)
113 env->delayed_pc = PARAM1;
114 set_flag(DELAY_SLOT_CONDITIONAL);
118 void OPPROTO op_bt_s(void)
121 env->delayed_pc = PARAM1;
122 set_flag(DELAY_SLOT_CONDITIONAL);
126 void OPPROTO op_bra(void)
128 env->delayed_pc = PARAM1;
129 set_flag(DELAY_SLOT);
133 void OPPROTO op_braf_T0(void)
135 env->delayed_pc = PARAM1 + T0;
136 set_flag(DELAY_SLOT);
140 void OPPROTO op_bsr(void)
143 env->delayed_pc = PARAM2;
144 set_flag(DELAY_SLOT);
148 void OPPROTO op_bsrf_T0(void)
151 env->delayed_pc = PARAM1 + T0;
152 set_flag(DELAY_SLOT);
156 void OPPROTO op_jsr_T0(void)
159 env->delayed_pc = T0;
160 set_flag(DELAY_SLOT);
164 void OPPROTO op_rts(void)
166 env->delayed_pc = env->pr;
167 set_flag(DELAY_SLOT);
171 void OPPROTO op_clr_delay_slot(void)
173 clr_flag(DELAY_SLOT);
177 void OPPROTO op_clr_delay_slot_conditional(void)
179 clr_flag(DELAY_SLOT_CONDITIONAL);
183 void OPPROTO op_exit_tb(void)
189 void OPPROTO op_addl_imm_T0(void)
195 void OPPROTO op_addl_imm_T1(void)
201 void OPPROTO op_clrmac(void)
203 env->mach = env->macl = 0;
207 void OPPROTO op_clrs(void)
213 void OPPROTO op_clrt(void)
219 void OPPROTO op_sets(void)
225 void OPPROTO op_sett(void)
231 void OPPROTO op_rte(void)
234 env->delayed_pc = env->spc;
235 set_flag(DELAY_SLOT);
239 void OPPROTO op_swapb_T0(void)
241 T0 = (T0 & 0xffff0000) | ((T0 & 0xff) << 8) | ((T0 >> 8) & 0xff);
245 void OPPROTO op_swapw_T0(void)
247 T0 = ((T0 & 0xffff) << 16) | ((T0 >> 16) & 0xffff);
251 void OPPROTO op_xtrct_T0_T1(void)
253 T1 = ((T0 & 0xffff) << 16) | ((T1 >> 16) & 0xffff);
257 void OPPROTO op_addc_T0_T1(void)
263 void OPPROTO op_addv_T0_T1(void)
269 void OPPROTO op_cmp_eq_T0_T1(void)
275 void OPPROTO op_cmp_ge_T0_T1(void)
277 cond_t((int32_t) T1 >= (int32_t) T0);
281 void OPPROTO op_cmp_gt_T0_T1(void)
283 cond_t((int32_t) T1 > (int32_t) T0);
287 void OPPROTO op_cmp_hi_T0_T1(void)
289 cond_t((uint32_t) T1 > (uint32_t) T0);
293 void OPPROTO op_cmp_hs_T0_T1(void)
295 cond_t((uint32_t) T1 >= (uint32_t) T0);
299 void OPPROTO op_cmp_str_T0_T1(void)
301 cond_t((T0 & 0x000000ff) == (T1 & 0x000000ff) ||
302 (T0 & 0x0000ff00) == (T1 & 0x0000ff00) ||
303 (T0 & 0x00ff0000) == (T1 & 0x00ff0000) ||
304 (T0 & 0xff000000) == (T1 & 0xff000000));
308 void OPPROTO op_tst_T0_T1(void)
310 cond_t((T1 & T0) == 0);
314 void OPPROTO op_div0s_T0_T1(void)
324 cond_t((T1 ^ T0) & 0x80000000);
328 void OPPROTO op_div0u(void)
330 env->sr &= ~(SR_M | SR_Q | SR_T);
334 void OPPROTO op_div1_T0_T1(void)
340 void OPPROTO op_dmulsl_T0_T1(void)
342 helper_dmulsl_T0_T1();
346 void OPPROTO op_dmulul_T0_T1(void)
348 helper_dmulul_T0_T1();
352 void OPPROTO op_macl_T0_T1(void)
358 void OPPROTO op_macw_T0_T1(void)
364 void OPPROTO op_mull_T0_T1(void)
366 env->macl = (T0 * T1) & 0xffffffff;
370 void OPPROTO op_mulsw_T0_T1(void)
372 env->macl = (int32_t) T0 *(int32_t) T1;
376 void OPPROTO op_muluw_T0_T1(void)
378 env->macl = (uint32_t) T0 *(uint32_t) T1;
382 void OPPROTO op_neg_T0(void)
388 void OPPROTO op_negc_T0(void)
394 void OPPROTO op_shad_T0_T1(void)
396 if ((T0 & 0x80000000) == 0)
398 else if ((T0 & 0x1f) == 0)
401 T1 = ((int32_t) T1) >> ((~T0 & 0x1f) + 1);
405 void OPPROTO op_shld_T0_T1(void)
407 if ((T0 & 0x80000000) == 0)
409 else if ((T0 & 0x1f) == 0)
412 T1 = ((uint32_t) T1) >> ((~T0 & 0x1f) + 1);
416 void OPPROTO op_subc_T0_T1(void)
422 void OPPROTO op_subv_T0_T1(void)
428 void OPPROTO op_trapa(void)
430 env->tra = PARAM1 * 2;
431 env->exception_index = 0x160;
432 do_raise_exception();
436 void OPPROTO op_cmp_pl_T0(void)
438 cond_t((int32_t) T0 > 0);
442 void OPPROTO op_cmp_pz_T0(void)
444 cond_t((int32_t) T0 >= 0);
448 void OPPROTO op_jmp_T0(void)
450 env->delayed_pc = T0;
451 set_flag(DELAY_SLOT);
455 void OPPROTO op_movl_rN_rN(void)
457 env->gregs[PARAM2] = env->gregs[PARAM1];
461 void OPPROTO op_ldcl_rMplus_rN_bank(void)
463 env->gregs[PARAM2] = env->gregs[PARAM1];
464 env->gregs[PARAM1] += 4;
468 #define LDSTOPS(target,load,store) \
469 void OPPROTO op_##load##_T0_##target (void) \
470 { env ->target = T0; RETURN(); \
472 void OPPROTO op_##store##_##target##_T0 (void) \
473 { T0 = env->target; RETURN(); \
476 LDSTOPS(sr, ldc, stc)
477 LDSTOPS(gbr, ldc, stc)
478 LDSTOPS(vbr, ldc, stc)
479 LDSTOPS(ssr, ldc, stc)
480 LDSTOPS(spc, ldc, stc)
481 LDSTOPS(sgr, ldc, stc)
482 LDSTOPS(dbr, ldc, stc)
483 LDSTOPS(mach, lds, sts)
484 LDSTOPS(macl, lds, sts)
485 LDSTOPS(pr, lds, sts)
487 void OPPROTO op_movt_rN(void)
489 env->gregs[PARAM1] = env->sr & SR_T;
493 void OPPROTO op_rotcl_Rn(void)
495 helper_rotcl(&env->gregs[PARAM1]);
499 void OPPROTO op_rotcr_Rn(void)
501 helper_rotcr(&env->gregs[PARAM1]);
505 void OPPROTO op_rotl_Rn(void)
507 cond_t(env->gregs[PARAM1] & 0x80000000);
508 env->gregs[PARAM1] = (env->gregs[PARAM1] << 1) | (env->sr & SR_T);
512 void OPPROTO op_rotr_Rn(void)
514 cond_t(env->gregs[PARAM1] & 1);
515 env->gregs[PARAM1] = (env->gregs[PARAM1] >> 1) |
516 ((env->sr & SR_T) ? 0x80000000 : 0);
520 void OPPROTO op_shal_Rn(void)
522 cond_t(env->gregs[PARAM1] & 0x80000000);
523 env->gregs[PARAM1] <<= 1;
527 void OPPROTO op_shar_Rn(void)
529 cond_t(env->gregs[PARAM1] & 1);
530 *(int32_t *) & env->gregs[PARAM1] >>= 1;
534 void OPPROTO op_shlr_Rn(void)
536 cond_t(env->gregs[PARAM1] & 1);
537 *(uint32_t *) & env->gregs[PARAM1] >>= 1;
541 void OPPROTO op_shll2_Rn(void)
543 env->gregs[PARAM1] <<= 2;
547 void OPPROTO op_shll8_Rn(void)
549 env->gregs[PARAM1] <<= 8;
553 void OPPROTO op_shll16_Rn(void)
555 env->gregs[PARAM1] <<= 16;
559 void OPPROTO op_shlr2_Rn(void)
561 *(uint32_t *) & env->gregs[PARAM1] >>= 2;
565 void OPPROTO op_shlr8_Rn(void)
567 *(uint32_t *) & env->gregs[PARAM1] >>= 8;
571 void OPPROTO op_shlr16_Rn(void)
573 *(uint32_t *) & env->gregs[PARAM1] >>= 16;
577 void OPPROTO op_tasb_rN(void)
579 cond_t(*(int8_t *) env->gregs[PARAM1] == 0);
580 *(int8_t *) env->gregs[PARAM1] |= 0x80;
584 void OPPROTO op_movl_T0_rN(void)
586 env->gregs[PARAM1] = T0;
590 void OPPROTO op_movl_T1_rN(void)
592 env->gregs[PARAM1] = T1;
596 void OPPROTO op_movb_rN_T0(void)
598 T0 = (int32_t) (int8_t) (env->gregs[PARAM1] & 0xff);
602 void OPPROTO op_movub_rN_T0(void)
604 T0 = env->gregs[PARAM1] & 0xff;
608 void OPPROTO op_movw_rN_T0(void)
610 T0 = (int32_t) (int16_t) (env->gregs[PARAM1] & 0xffff);
614 void OPPROTO op_movuw_rN_T0(void)
616 T0 = env->gregs[PARAM1] & 0xffff;
620 void OPPROTO op_movl_rN_T0(void)
622 T0 = env->gregs[PARAM1];
626 void OPPROTO op_movb_rN_T1(void)
628 T1 = (int32_t) (int8_t) (env->gregs[PARAM1] & 0xff);
632 void OPPROTO op_movub_rN_T1(void)
634 T1 = env->gregs[PARAM1] & 0xff;
638 void OPPROTO op_movw_rN_T1(void)
640 T1 = (int32_t) (int16_t) (env->gregs[PARAM1] & 0xffff);
644 void OPPROTO op_movuw_rN_T1(void)
646 T1 = env->gregs[PARAM1] & 0xffff;
650 void OPPROTO op_movl_rN_T1(void)
652 T1 = env->gregs[PARAM1];
656 void OPPROTO op_movl_imm_rN(void)
658 env->gregs[PARAM2] = PARAM1;
662 void OPPROTO op_dec1_rN(void)
664 env->gregs[PARAM1] -= 1;
668 void OPPROTO op_dec2_rN(void)
670 env->gregs[PARAM1] -= 2;
674 void OPPROTO op_dec4_rN(void)
676 env->gregs[PARAM1] -= 4;
680 void OPPROTO op_inc1_rN(void)
682 env->gregs[PARAM1] += 1;
686 void OPPROTO op_inc2_rN(void)
688 env->gregs[PARAM1] += 2;
692 void OPPROTO op_inc4_rN(void)
694 env->gregs[PARAM1] += 4;
698 void OPPROTO op_add_T0_rN(void)
700 env->gregs[PARAM1] += T0;
704 void OPPROTO op_sub_T0_rN(void)
706 env->gregs[PARAM1] -= T0;
710 void OPPROTO op_and_T0_rN(void)
712 env->gregs[PARAM1] &= T0;
716 void OPPROTO op_or_T0_rN(void)
718 env->gregs[PARAM1] |= T0;
722 void OPPROTO op_xor_T0_rN(void)
724 env->gregs[PARAM1] ^= T0;
728 void OPPROTO op_add_rN_T0(void)
730 T0 += env->gregs[PARAM1];
734 void OPPROTO op_add_rN_T1(void)
736 T1 += env->gregs[PARAM1];
740 void OPPROTO op_add_imm_rN(void)
742 env->gregs[PARAM2] += PARAM1;
746 void OPPROTO op_and_imm_rN(void)
748 env->gregs[PARAM2] &= PARAM1;
752 void OPPROTO op_or_imm_rN(void)
754 env->gregs[PARAM2] |= PARAM1;
758 void OPPROTO op_xor_imm_rN(void)
760 env->gregs[PARAM2] ^= PARAM1;
764 void OPPROTO op_dt_rN(void)
766 cond_t((--env->gregs[PARAM1]) == 0);
770 void OPPROTO op_tst_imm_rN(void)
772 cond_t((env->gregs[PARAM2] & PARAM1) == 0);
776 void OPPROTO op_movl_T0_T1(void)
782 void OPPROTO op_goto_tb0(void)
784 GOTO_TB(op_goto_tb0, PARAM1, 0);
788 void OPPROTO op_goto_tb1(void)
790 GOTO_TB(op_goto_tb1, PARAM1, 1);
794 void OPPROTO op_movl_imm_PC(void)
800 void OPPROTO op_jT(void)
807 void OPPROTO op_jTT2(void)
814 void OPPROTO op_movl_delayed_pc_PC(void)
816 env->pc = env->delayed_pc;
820 void OPPROTO op_addl_GBR_T0(void)
826 void OPPROTO op_and_imm_T0(void)
832 void OPPROTO op_or_imm_T0(void)
838 void OPPROTO op_xor_imm_T0(void)
844 void OPPROTO op_tst_imm_T0(void)
846 cond_t((T0 & PARAM1) == 0);
850 void OPPROTO op_raise_illegal_instruction(void)
852 env->exception_index = 0x180;
853 do_raise_exception();
857 void OPPROTO op_raise_slot_illegal_instruction(void)
859 env->exception_index = 0x1a0;
860 do_raise_exception();
864 void OPPROTO op_debug(void)
866 env->exception_index = EXCP_DEBUG;
871 #define MEMSUFFIX _raw
874 #if !defined(CONFIG_USER_ONLY)
875 #define MEMSUFFIX _user
879 #define MEMSUFFIX _kernel