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