]>
git.proxmox.com Git - qemu.git/blob - target-sh4/op_helper.c
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
23 #ifndef CONFIG_USER_ONLY
25 #define MMUSUFFIX _mmu
28 #include "softmmu_template.h"
31 #include "softmmu_template.h"
34 #include "softmmu_template.h"
37 #include "softmmu_template.h"
39 void tlb_fill(target_ulong addr
, int is_write
, int mmu_idx
, void *retaddr
)
46 /* XXX: hack to restore env in all cases, even if not called from
50 ret
= cpu_sh4_handle_mmu_fault(env
, addr
, is_write
, mmu_idx
, 1);
53 /* now we have a real cpu fault */
54 pc
= (unsigned long) retaddr
;
57 /* the PC is inside the translated code. It means that we have
58 a virtual CPU fault */
59 cpu_restore_state(tb
, env
, pc
, NULL
);
69 void helper_ldtlb(void)
71 #ifdef CONFIG_USER_ONLY
79 void helper_raise_illegal_instruction(void)
81 env
->exception_index
= 0x180;
85 void helper_raise_slot_illegal_instruction(void)
87 env
->exception_index
= 0x1a0;
91 void helper_debug(void)
93 env
->exception_index
= EXCP_DEBUG
;
97 void helper_sleep(void)
100 env
->exception_index
= EXCP_HLT
;
104 void helper_trapa(uint32_t tra
)
107 env
->exception_index
= 0x160;
111 uint32_t helper_addc(uint32_t arg0
, uint32_t arg1
)
117 arg1
= tmp1
+ (env
->sr
& 1);
127 uint32_t helper_addv(uint32_t arg0
, uint32_t arg1
)
129 uint32_t dest
, src
, ans
;
131 if ((int32_t) arg1
>= 0)
135 if ((int32_t) arg0
>= 0)
141 if ((int32_t) arg1
>= 0)
146 if (src
== 0 || src
== 2) {
156 #define T (env->sr & SR_T)
157 #define Q (env->sr & SR_Q ? 1 : 0)
158 #define M (env->sr & SR_M ? 1 : 0)
159 #define SETT env->sr |= SR_T
160 #define CLRT env->sr &= ~SR_T
161 #define SETQ env->sr |= SR_Q
162 #define CLRQ env->sr &= ~SR_Q
163 #define SETM env->sr |= SR_M
164 #define CLRM env->sr &= ~SR_M
166 uint32_t helper_div1(uint32_t arg0
, uint32_t arg1
)
169 uint8_t old_q
, tmp1
= 0xff;
171 //printf("div1 arg0=0x%08x arg1=0x%08x M=%d Q=%d T=%d\n", arg0, arg1, M, Q, T);
173 if ((0x80000000 & arg1
) != 0)
270 //printf("Output: arg1=0x%08x M=%d Q=%d T=%d\n", arg1, M, Q, T);
274 void helper_macl(uint32_t arg0
, uint32_t arg1
)
278 res
= ((uint64_t) env
->mach
<< 32) | env
->macl
;
279 res
+= (int64_t) (int32_t) arg0
*(int64_t) (int32_t) arg1
;
280 env
->mach
= (res
>> 32) & 0xffffffff;
281 env
->macl
= res
& 0xffffffff;
282 if (env
->sr
& SR_S
) {
284 env
->mach
|= 0xffff0000;
286 env
->mach
&= 0x00007fff;
290 void helper_macw(uint32_t arg0
, uint32_t arg1
)
294 res
= ((uint64_t) env
->mach
<< 32) | env
->macl
;
295 res
+= (int64_t) (int16_t) arg0
*(int64_t) (int16_t) arg1
;
296 env
->mach
= (res
>> 32) & 0xffffffff;
297 env
->macl
= res
& 0xffffffff;
298 if (env
->sr
& SR_S
) {
299 if (res
< -0x80000000) {
301 env
->macl
= 0x80000000;
302 } else if (res
> 0x000000007fffffff) {
304 env
->macl
= 0x7fffffff;
309 uint32_t helper_negc(uint32_t arg
)
314 arg
= temp
- (env
->sr
& SR_T
);
324 uint32_t helper_subc(uint32_t arg0
, uint32_t arg1
)
330 arg1
= tmp1
- (env
->sr
& SR_T
);
340 uint32_t helper_subv(uint32_t arg0
, uint32_t arg1
)
342 int32_t dest
, src
, ans
;
344 if ((int32_t) arg1
>= 0)
348 if ((int32_t) arg0
>= 0)
354 if ((int32_t) arg1
>= 0)
369 void helper_ld_fpscr(uint32_t val
)
371 env
->fpscr
= val
& 0x003fffff;
373 set_float_rounding_mode(float_round_to_zero
, &env
->fp_status
);
375 set_float_rounding_mode(float_round_nearest_even
, &env
->fp_status
);