]>
git.proxmox.com Git - qemu.git/blob - target-sh4/op.c
d6bb5203b88b8b26f745c386176ac2788d42d288
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_t(void)
27 static inline void clr_t(void)
32 static inline void cond_t(int cond
)
40 void OPPROTO
op_frchg(void)
42 env
->fpscr
^= FPSCR_FR
;
46 void OPPROTO
op_fschg(void)
48 env
->fpscr
^= FPSCR_SZ
;
52 void OPPROTO
op_addc_T0_T1(void)
58 void OPPROTO
op_addv_T0_T1(void)
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));
73 void OPPROTO
op_div0s_T0_T1(void)
83 cond_t((T1
^ T0
) & 0x80000000);
87 void OPPROTO
op_div1_T0_T1(void)
93 void OPPROTO
op_dmulsl_T0_T1(void)
95 helper_dmulsl_T0_T1();
99 void OPPROTO
op_dmulul_T0_T1(void)
101 helper_dmulul_T0_T1();
105 void OPPROTO
op_macl_T0_T1(void)
111 void OPPROTO
op_macw_T0_T1(void)
117 void OPPROTO
op_mull_T0_T1(void)
119 env
->macl
= (T0
* T1
) & 0xffffffff;
123 void OPPROTO
op_mulsw_T0_T1(void)
125 env
->macl
= (int32_t)(int16_t) T0
*(int32_t)(int16_t) T1
;
129 void OPPROTO
op_muluw_T0_T1(void)
131 env
->macl
= (uint32_t)(uint16_t) T0
*(uint32_t)(uint16_t) T1
;
135 void OPPROTO
op_negc_T0(void)
141 void OPPROTO
op_shad_T0_T1(void)
143 if ((T0
& 0x80000000) == 0)
145 else if ((T0
& 0x1f) == 0)
146 T1
= (T1
& 0x80000000)? 0xffffffff : 0;
148 T1
= ((int32_t) T1
) >> ((~T0
& 0x1f) + 1);
152 void OPPROTO
op_shld_T0_T1(void)
154 if ((T0
& 0x80000000) == 0)
156 else if ((T0
& 0x1f) == 0)
159 T1
= ((uint32_t) T1
) >> ((~T0
& 0x1f) + 1);
163 void OPPROTO
op_subc_T0_T1(void)
169 void OPPROTO
op_subv_T0_T1(void)
175 void OPPROTO
op_ldcl_rMplus_rN_bank(void)
177 env
->gregs
[PARAM2
] = env
->gregs
[PARAM1
];
178 env
->gregs
[PARAM1
] += 4;
182 void OPPROTO
op_ldc_T0_sr(void)
184 env
->sr
= T0
& 0x700083f3;
188 void OPPROTO
op_stc_sr_T0(void)
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
;
222 void OPPROTO
op_sts_fpscr_T0(void)
224 T0
= env
->fpscr
& 0x003fffff;
228 void OPPROTO
op_rotcl_Rn(void)
230 helper_rotcl(&env
->gregs
[PARAM1
]);
234 void OPPROTO
op_rotcr_Rn(void)
236 helper_rotcr(&env
->gregs
[PARAM1
]);
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
);
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);
255 void OPPROTO
op_shal_Rn(void)
257 cond_t(env
->gregs
[PARAM1
] & 0x80000000);
258 env
->gregs
[PARAM1
] <<= 1;
262 void OPPROTO
op_shar_Rn(void)
264 cond_t(env
->gregs
[PARAM1
] & 1);
265 *(int32_t *)&env
->gregs
[PARAM1
] >>= 1;
269 void OPPROTO
op_shlr_Rn(void)
271 cond_t(env
->gregs
[PARAM1
] & 1);
272 env
->gregs
[PARAM1
] >>= 1;
276 void OPPROTO
op_fmov_frN_FT0(void)
278 FT0
= env
->fregs
[PARAM1
];
282 void OPPROTO
op_fmov_drN_DT0(void)
286 d
.l
.upper
= *(uint32_t *)&env
->fregs
[PARAM1
];
287 d
.l
.lower
= *(uint32_t *)&env
->fregs
[PARAM1
+ 1];
292 void OPPROTO
op_fmov_frN_FT1(void)
294 FT1
= env
->fregs
[PARAM1
];
298 void OPPROTO
op_fmov_drN_DT1(void)
302 d
.l
.upper
= *(uint32_t *)&env
->fregs
[PARAM1
];
303 d
.l
.lower
= *(uint32_t *)&env
->fregs
[PARAM1
+ 1];
308 void OPPROTO
op_fmov_FT0_frN(void)
310 env
->fregs
[PARAM1
] = FT0
;
314 void OPPROTO
op_fmov_DT0_drN(void)
319 *(uint32_t *)&env
->fregs
[PARAM1
] = d
.l
.upper
;
320 *(uint32_t *)&env
->fregs
[PARAM1
+ 1] = d
.l
.lower
;
324 void OPPROTO
op_fadd_FT(void)
326 FT0
= float32_add(FT0
, FT1
, &env
->fp_status
);
330 void OPPROTO
op_fadd_DT(void)
332 DT0
= float64_add(DT0
, DT1
, &env
->fp_status
);
336 void OPPROTO
op_fsub_FT(void)
338 FT0
= float32_sub(FT0
, FT1
, &env
->fp_status
);
342 void OPPROTO
op_fsub_DT(void)
344 DT0
= float64_sub(DT0
, DT1
, &env
->fp_status
);
348 void OPPROTO
op_fmul_FT(void)
350 FT0
= float32_mul(FT0
, FT1
, &env
->fp_status
);
354 void OPPROTO
op_fmul_DT(void)
356 DT0
= float64_mul(DT0
, DT1
, &env
->fp_status
);
360 void OPPROTO
op_fdiv_FT(void)
362 FT0
= float32_div(FT0
, FT1
, &env
->fp_status
);
366 void OPPROTO
op_fdiv_DT(void)
368 DT0
= float64_div(DT0
, DT1
, &env
->fp_status
);
372 void OPPROTO
op_fcmp_eq_FT(void)
374 cond_t(float32_compare(FT0
, FT1
, &env
->fp_status
) == 0);
378 void OPPROTO
op_fcmp_eq_DT(void)
380 cond_t(float64_compare(DT0
, DT1
, &env
->fp_status
) == 0);
384 void OPPROTO
op_fcmp_gt_FT(void)
386 cond_t(float32_compare(FT0
, FT1
, &env
->fp_status
) == 1);
390 void OPPROTO
op_fcmp_gt_DT(void)
392 cond_t(float64_compare(DT0
, DT1
, &env
->fp_status
) == 1);
396 void OPPROTO
op_float_FT(void)
398 FT0
= int32_to_float32(env
->fpul
, &env
->fp_status
);
402 void OPPROTO
op_float_DT(void)
404 DT0
= int32_to_float64(env
->fpul
, &env
->fp_status
);
408 void OPPROTO
op_ftrc_FT(void)
410 env
->fpul
= float32_to_int32_round_to_zero(FT0
, &env
->fp_status
);
414 void OPPROTO
op_ftrc_DT(void)
416 env
->fpul
= float64_to_int32_round_to_zero(DT0
, &env
->fp_status
);
420 void OPPROTO
op_fneg_frN(void)
422 env
->fregs
[PARAM1
] = float32_chs(env
->fregs
[PARAM1
]);
426 void OPPROTO
op_fabs_FT(void)
428 FT0
= float32_abs(FT0
);
432 void OPPROTO
op_fabs_DT(void)
434 DT0
= float64_abs(DT0
);
438 void OPPROTO
op_fcnvsd_FT_DT(void)
440 DT0
= float32_to_float64(FT0
, &env
->fp_status
);
444 void OPPROTO
op_fcnvds_DT_FT(void)
446 FT0
= float64_to_float32(DT0
, &env
->fp_status
);
450 void OPPROTO
op_fsqrt_FT(void)
452 FT0
= float32_sqrt(FT0
, &env
->fp_status
);
456 void OPPROTO
op_fsqrt_DT(void)
458 DT0
= float64_sqrt(DT0
, &env
->fp_status
);
462 void OPPROTO
op_fmov_T0_frN(void)
464 *(uint32_t *)&env
->fregs
[PARAM1
] = T0
;
468 void OPPROTO
op_movl_fpul_FT0(void)
470 FT0
= *(float32
*)&env
->fpul
;
474 void OPPROTO
op_movl_FT0_fpul(void)
476 *(float32
*)&env
->fpul
= FT0
;
481 #define MEMSUFFIX _raw
484 #if !defined(CONFIG_USER_ONLY)
485 #define MEMSUFFIX _user
489 #define MEMSUFFIX _kernel