Remove memcpy32() prototype leftover from r5109
[qemu/mini2440.git] / target-sh4 / op.c
blobd6bb5203b88b8b26f745c386176ac2788d42d288
1 /*
2 * SH4 emulation
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
20 #include "exec.h"
22 static inline void set_t(void)
24 env->sr |= SR_T;
27 static inline void clr_t(void)
29 env->sr &= ~SR_T;
32 static inline void cond_t(int cond)
34 if (cond)
35 set_t();
36 else
37 clr_t();
40 void OPPROTO op_frchg(void)
42 env->fpscr ^= FPSCR_FR;
43 RETURN();
46 void OPPROTO op_fschg(void)
48 env->fpscr ^= FPSCR_SZ;
49 RETURN();
52 void OPPROTO op_addc_T0_T1(void)
54 helper_addc_T0_T1();
55 RETURN();
58 void OPPROTO op_addv_T0_T1(void)
60 helper_addv_T0_T1();
61 RETURN();
64 void OPPROTO op_cmp_str_T0_T1(void)
66 cond_t((T0 & 0x000000ff) == (T1 & 0x000000ff) ||
67 (T0 & 0x0000ff00) == (T1 & 0x0000ff00) ||
68 (T0 & 0x00ff0000) == (T1 & 0x00ff0000) ||
69 (T0 & 0xff000000) == (T1 & 0xff000000));
70 RETURN();
73 void OPPROTO op_div0s_T0_T1(void)
75 if (T1 & 0x80000000)
76 env->sr |= SR_Q;
77 else
78 env->sr &= ~SR_Q;
79 if (T0 & 0x80000000)
80 env->sr |= SR_M;
81 else
82 env->sr &= ~SR_M;
83 cond_t((T1 ^ T0) & 0x80000000);
84 RETURN();
87 void OPPROTO op_div1_T0_T1(void)
89 helper_div1_T0_T1();
90 RETURN();
93 void OPPROTO op_dmulsl_T0_T1(void)
95 helper_dmulsl_T0_T1();
96 RETURN();
99 void OPPROTO op_dmulul_T0_T1(void)
101 helper_dmulul_T0_T1();
102 RETURN();
105 void OPPROTO op_macl_T0_T1(void)
107 helper_macl_T0_T1();
108 RETURN();
111 void OPPROTO op_macw_T0_T1(void)
113 helper_macw_T0_T1();
114 RETURN();
117 void OPPROTO op_mull_T0_T1(void)
119 env->macl = (T0 * T1) & 0xffffffff;
120 RETURN();
123 void OPPROTO op_mulsw_T0_T1(void)
125 env->macl = (int32_t)(int16_t) T0 *(int32_t)(int16_t) T1;
126 RETURN();
129 void OPPROTO op_muluw_T0_T1(void)
131 env->macl = (uint32_t)(uint16_t) T0 *(uint32_t)(uint16_t) T1;
132 RETURN();
135 void OPPROTO op_negc_T0(void)
137 helper_negc_T0();
138 RETURN();
141 void OPPROTO op_shad_T0_T1(void)
143 if ((T0 & 0x80000000) == 0)
144 T1 <<= (T0 & 0x1f);
145 else if ((T0 & 0x1f) == 0)
146 T1 = (T1 & 0x80000000)? 0xffffffff : 0;
147 else
148 T1 = ((int32_t) T1) >> ((~T0 & 0x1f) + 1);
149 RETURN();
152 void OPPROTO op_shld_T0_T1(void)
154 if ((T0 & 0x80000000) == 0)
155 T1 <<= (T0 & 0x1f);
156 else if ((T0 & 0x1f) == 0)
157 T1 = 0;
158 else
159 T1 = ((uint32_t) T1) >> ((~T0 & 0x1f) + 1);
160 RETURN();
163 void OPPROTO op_subc_T0_T1(void)
165 helper_subc_T0_T1();
166 RETURN();
169 void OPPROTO op_subv_T0_T1(void)
171 helper_subv_T0_T1();
172 RETURN();
175 void OPPROTO op_ldcl_rMplus_rN_bank(void)
177 env->gregs[PARAM2] = env->gregs[PARAM1];
178 env->gregs[PARAM1] += 4;
179 RETURN();
182 void OPPROTO op_ldc_T0_sr(void)
184 env->sr = T0 & 0x700083f3;
185 RETURN();
188 void OPPROTO op_stc_sr_T0(void)
190 T0 = env->sr;
191 RETURN();
194 #define LDSTOPS(target,load,store) \
195 void OPPROTO op_##load##_T0_##target (void) \
196 { env ->target = T0; RETURN(); \
198 void OPPROTO op_##store##_##target##_T0 (void) \
199 { T0 = env->target; RETURN(); \
202 LDSTOPS(gbr, ldc, stc)
203 LDSTOPS(vbr, ldc, stc)
204 LDSTOPS(ssr, ldc, stc)
205 LDSTOPS(spc, ldc, stc)
206 LDSTOPS(sgr, ldc, stc)
207 LDSTOPS(dbr, ldc, stc)
208 LDSTOPS(mach, lds, sts)
209 LDSTOPS(macl, lds, sts)
210 LDSTOPS(pr, lds, sts)
211 LDSTOPS(fpul, lds, sts)
213 void OPPROTO op_lds_T0_fpscr(void)
215 env->fpscr = T0 & 0x003fffff;
216 env->fp_status.float_rounding_mode = T0 & 0x01 ?
217 float_round_to_zero : float_round_nearest_even;
219 RETURN();
222 void OPPROTO op_sts_fpscr_T0(void)
224 T0 = env->fpscr & 0x003fffff;
225 RETURN();
228 void OPPROTO op_rotcl_Rn(void)
230 helper_rotcl(&env->gregs[PARAM1]);
231 RETURN();
234 void OPPROTO op_rotcr_Rn(void)
236 helper_rotcr(&env->gregs[PARAM1]);
237 RETURN();
240 void OPPROTO op_rotl_Rn(void)
242 cond_t(env->gregs[PARAM1] & 0x80000000);
243 env->gregs[PARAM1] = (env->gregs[PARAM1] << 1) | (env->sr & SR_T);
244 RETURN();
247 void OPPROTO op_rotr_Rn(void)
249 cond_t(env->gregs[PARAM1] & 1);
250 env->gregs[PARAM1] = (env->gregs[PARAM1] >> 1) |
251 ((env->sr & SR_T) ? 0x80000000 : 0);
252 RETURN();
255 void OPPROTO op_shal_Rn(void)
257 cond_t(env->gregs[PARAM1] & 0x80000000);
258 env->gregs[PARAM1] <<= 1;
259 RETURN();
262 void OPPROTO op_shar_Rn(void)
264 cond_t(env->gregs[PARAM1] & 1);
265 *(int32_t *)&env->gregs[PARAM1] >>= 1;
266 RETURN();
269 void OPPROTO op_shlr_Rn(void)
271 cond_t(env->gregs[PARAM1] & 1);
272 env->gregs[PARAM1] >>= 1;
273 RETURN();
276 void OPPROTO op_fmov_frN_FT0(void)
278 FT0 = env->fregs[PARAM1];
279 RETURN();
282 void OPPROTO op_fmov_drN_DT0(void)
284 CPU_DoubleU d;
286 d.l.upper = *(uint32_t *)&env->fregs[PARAM1];
287 d.l.lower = *(uint32_t *)&env->fregs[PARAM1 + 1];
288 DT0 = d.d;
289 RETURN();
292 void OPPROTO op_fmov_frN_FT1(void)
294 FT1 = env->fregs[PARAM1];
295 RETURN();
298 void OPPROTO op_fmov_drN_DT1(void)
300 CPU_DoubleU d;
302 d.l.upper = *(uint32_t *)&env->fregs[PARAM1];
303 d.l.lower = *(uint32_t *)&env->fregs[PARAM1 + 1];
304 DT1 = d.d;
305 RETURN();
308 void OPPROTO op_fmov_FT0_frN(void)
310 env->fregs[PARAM1] = FT0;
311 RETURN();
314 void OPPROTO op_fmov_DT0_drN(void)
316 CPU_DoubleU d;
318 d.d = DT0;
319 *(uint32_t *)&env->fregs[PARAM1] = d.l.upper;
320 *(uint32_t *)&env->fregs[PARAM1 + 1] = d.l.lower;
321 RETURN();
324 void OPPROTO op_fadd_FT(void)
326 FT0 = float32_add(FT0, FT1, &env->fp_status);
327 RETURN();
330 void OPPROTO op_fadd_DT(void)
332 DT0 = float64_add(DT0, DT1, &env->fp_status);
333 RETURN();
336 void OPPROTO op_fsub_FT(void)
338 FT0 = float32_sub(FT0, FT1, &env->fp_status);
339 RETURN();
342 void OPPROTO op_fsub_DT(void)
344 DT0 = float64_sub(DT0, DT1, &env->fp_status);
345 RETURN();
348 void OPPROTO op_fmul_FT(void)
350 FT0 = float32_mul(FT0, FT1, &env->fp_status);
351 RETURN();
354 void OPPROTO op_fmul_DT(void)
356 DT0 = float64_mul(DT0, DT1, &env->fp_status);
357 RETURN();
360 void OPPROTO op_fdiv_FT(void)
362 FT0 = float32_div(FT0, FT1, &env->fp_status);
363 RETURN();
366 void OPPROTO op_fdiv_DT(void)
368 DT0 = float64_div(DT0, DT1, &env->fp_status);
369 RETURN();
372 void OPPROTO op_fcmp_eq_FT(void)
374 cond_t(float32_compare(FT0, FT1, &env->fp_status) == 0);
375 RETURN();
378 void OPPROTO op_fcmp_eq_DT(void)
380 cond_t(float64_compare(DT0, DT1, &env->fp_status) == 0);
381 RETURN();
384 void OPPROTO op_fcmp_gt_FT(void)
386 cond_t(float32_compare(FT0, FT1, &env->fp_status) == 1);
387 RETURN();
390 void OPPROTO op_fcmp_gt_DT(void)
392 cond_t(float64_compare(DT0, DT1, &env->fp_status) == 1);
393 RETURN();
396 void OPPROTO op_float_FT(void)
398 FT0 = int32_to_float32(env->fpul, &env->fp_status);
399 RETURN();
402 void OPPROTO op_float_DT(void)
404 DT0 = int32_to_float64(env->fpul, &env->fp_status);
405 RETURN();
408 void OPPROTO op_ftrc_FT(void)
410 env->fpul = float32_to_int32_round_to_zero(FT0, &env->fp_status);
411 RETURN();
414 void OPPROTO op_ftrc_DT(void)
416 env->fpul = float64_to_int32_round_to_zero(DT0, &env->fp_status);
417 RETURN();
420 void OPPROTO op_fneg_frN(void)
422 env->fregs[PARAM1] = float32_chs(env->fregs[PARAM1]);
423 RETURN();
426 void OPPROTO op_fabs_FT(void)
428 FT0 = float32_abs(FT0);
429 RETURN();
432 void OPPROTO op_fabs_DT(void)
434 DT0 = float64_abs(DT0);
435 RETURN();
438 void OPPROTO op_fcnvsd_FT_DT(void)
440 DT0 = float32_to_float64(FT0, &env->fp_status);
441 RETURN();
444 void OPPROTO op_fcnvds_DT_FT(void)
446 FT0 = float64_to_float32(DT0, &env->fp_status);
447 RETURN();
450 void OPPROTO op_fsqrt_FT(void)
452 FT0 = float32_sqrt(FT0, &env->fp_status);
453 RETURN();
456 void OPPROTO op_fsqrt_DT(void)
458 DT0 = float64_sqrt(DT0, &env->fp_status);
459 RETURN();
462 void OPPROTO op_fmov_T0_frN(void)
464 *(uint32_t *)&env->fregs[PARAM1] = T0;
465 RETURN();
468 void OPPROTO op_movl_fpul_FT0(void)
470 FT0 = *(float32 *)&env->fpul;
471 RETURN();
474 void OPPROTO op_movl_FT0_fpul(void)
476 *(float32 *)&env->fpul = FT0;
477 RETURN();
480 /* Load and store */
481 #define MEMSUFFIX _raw
482 #include "op_mem.c"
483 #undef MEMSUFFIX
484 #if !defined(CONFIG_USER_ONLY)
485 #define MEMSUFFIX _user
486 #include "op_mem.c"
487 #undef MEMSUFFIX
489 #define MEMSUFFIX _kernel
490 #include "op_mem.c"
491 #undef MEMSUFFIX
492 #endif