]>
git.proxmox.com Git - qemu.git/blob - target-sh4/op_helper.c
c1bc4e8942d0071b162549c20d8104f7b459af7b
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 void do_raise_exception(void)
28 #ifndef CONFIG_USER_ONLY
30 #define MMUSUFFIX _mmu
32 # define GETPC() ((void*)((unsigned long)__builtin_return_address(0) & 0x7fffffffUL))
34 # define GETPC() (__builtin_return_address(0))
38 #include "softmmu_template.h"
41 #include "softmmu_template.h"
44 #include "softmmu_template.h"
47 #include "softmmu_template.h"
49 void tlb_fill(target_ulong addr
, int is_write
, int mmu_idx
, void *retaddr
)
56 /* XXX: hack to restore env in all cases, even if not called from
60 ret
= cpu_sh4_handle_mmu_fault(env
, addr
, is_write
, mmu_idx
, 1);
63 /* now we have a real cpu fault */
64 pc
= (unsigned long) retaddr
;
67 /* the PC is inside the translated code. It means that we have
68 a virtual CPU fault */
69 cpu_restore_state(tb
, env
, pc
, NULL
);
79 void helper_addc_T0_T1(void)
85 T1
= tmp1
+ (env
->sr
& 1);
94 void helper_addv_T0_T1(void)
96 uint32_t dest
, src
, ans
;
98 if ((int32_t) T1
>= 0)
102 if ((int32_t) T0
>= 0)
108 if ((int32_t) T1
>= 0)
113 if (src
== 0 || src
== 2) {
122 #define T (env->sr & SR_T)
123 #define Q (env->sr & SR_Q ? 1 : 0)
124 #define M (env->sr & SR_M ? 1 : 0)
125 #define SETT env->sr |= SR_T
126 #define CLRT env->sr &= ~SR_T
127 #define SETQ env->sr |= SR_Q
128 #define CLRQ env->sr &= ~SR_Q
129 #define SETM env->sr |= SR_M
130 #define CLRM env->sr &= ~SR_M
132 void helper_div1_T0_T1(void)
135 uint8_t old_q
, tmp1
= 0xff;
137 //printf("div1 T0=0x%08x T1=0x%08x M=%d Q=%d T=%d\n", T0, T1, M, Q, T);
139 if ((0x80000000 & T1
) != 0)
236 //printf("Output: T1=0x%08x M=%d Q=%d T=%d\n", T1, M, Q, T);
239 void helper_dmulsl_T0_T1()
243 res
= (int64_t) (int32_t) T0
*(int64_t) (int32_t) T1
;
244 env
->mach
= (res
>> 32) & 0xffffffff;
245 env
->macl
= res
& 0xffffffff;
248 void helper_dmulul_T0_T1()
252 res
= (uint64_t) (uint32_t) T0
*(uint64_t) (uint32_t) T1
;
253 env
->mach
= (res
>> 32) & 0xffffffff;
254 env
->macl
= res
& 0xffffffff;
257 void helper_macl_T0_T1()
261 res
= ((uint64_t) env
->mach
<< 32) | env
->macl
;
262 res
+= (int64_t) (int32_t) T0
*(int64_t) (int32_t) T1
;
263 env
->mach
= (res
>> 32) & 0xffffffff;
264 env
->macl
= res
& 0xffffffff;
265 if (env
->sr
& SR_S
) {
267 env
->mach
|= 0xffff0000;
269 env
->mach
&= 0x00007fff;
273 void helper_macw_T0_T1()
277 res
= ((uint64_t) env
->mach
<< 32) | env
->macl
;
278 res
+= (int64_t) (int16_t) T0
*(int64_t) (int16_t) T1
;
279 env
->mach
= (res
>> 32) & 0xffffffff;
280 env
->macl
= res
& 0xffffffff;
281 if (env
->sr
& SR_S
) {
282 if (res
< -0x80000000) {
284 env
->macl
= 0x80000000;
285 } else if (res
> 0x000000007fffffff) {
287 env
->macl
= 0x7fffffff;
292 void helper_negc_T0()
297 T0
= temp
- (env
->sr
& SR_T
);
306 void helper_subc_T0_T1()
312 T1
= tmp1
- (env
->sr
& SR_T
);
321 void helper_subv_T0_T1()
323 int32_t dest
, src
, ans
;
325 if ((int32_t) T1
>= 0)
329 if ((int32_t) T0
>= 0)
335 if ((int32_t) T1
>= 0)
349 void helper_rotcl(uint32_t * addr
)
353 new = (*addr
<< 1) | (env
->sr
& SR_T
);
354 if (*addr
& 0x80000000)
361 void helper_rotcr(uint32_t * addr
)
365 new = (*addr
>> 1) | ((env
->sr
& SR_T
) ? 0x80000000 : 0);