]>
git.proxmox.com Git - qemu.git/blob - target-sh4/op.c
687bded9593b3667cf63bed64cbbb7d327d3e3b9
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_ldtlb(void)
46 void OPPROTO
op_frchg(void)
48 env
->fpscr
^= FPSCR_FR
;
52 void OPPROTO
op_fschg(void)
54 env
->fpscr
^= FPSCR_SZ
;
58 void OPPROTO
op_addc_T0_T1(void)
64 void OPPROTO
op_addv_T0_T1(void)
70 void OPPROTO
op_cmp_str_T0_T1(void)
72 cond_t((T0
& 0x000000ff) == (T1
& 0x000000ff) ||
73 (T0
& 0x0000ff00) == (T1
& 0x0000ff00) ||
74 (T0
& 0x00ff0000) == (T1
& 0x00ff0000) ||
75 (T0
& 0xff000000) == (T1
& 0xff000000));
79 void OPPROTO
op_div0s_T0_T1(void)
89 cond_t((T1
^ T0
) & 0x80000000);
93 void OPPROTO
op_div1_T0_T1(void)
99 void OPPROTO
op_dmulsl_T0_T1(void)
101 helper_dmulsl_T0_T1();
105 void OPPROTO
op_dmulul_T0_T1(void)
107 helper_dmulul_T0_T1();
111 void OPPROTO
op_macl_T0_T1(void)
117 void OPPROTO
op_macw_T0_T1(void)
123 void OPPROTO
op_mull_T0_T1(void)
125 env
->macl
= (T0
* T1
) & 0xffffffff;
129 void OPPROTO
op_mulsw_T0_T1(void)
131 env
->macl
= (int32_t)(int16_t) T0
*(int32_t)(int16_t) T1
;
135 void OPPROTO
op_muluw_T0_T1(void)
137 env
->macl
= (uint32_t)(uint16_t) T0
*(uint32_t)(uint16_t) T1
;
141 void OPPROTO
op_negc_T0(void)
147 void OPPROTO
op_shad_T0_T1(void)
149 if ((T0
& 0x80000000) == 0)
151 else if ((T0
& 0x1f) == 0)
152 T1
= (T1
& 0x80000000)? 0xffffffff : 0;
154 T1
= ((int32_t) T1
) >> ((~T0
& 0x1f) + 1);
158 void OPPROTO
op_shld_T0_T1(void)
160 if ((T0
& 0x80000000) == 0)
162 else if ((T0
& 0x1f) == 0)
165 T1
= ((uint32_t) T1
) >> ((~T0
& 0x1f) + 1);
169 void OPPROTO
op_subc_T0_T1(void)
175 void OPPROTO
op_subv_T0_T1(void)
181 void OPPROTO
op_trapa(void)
183 env
->tra
= PARAM1
<< 2;
184 env
->exception_index
= 0x160;
185 do_raise_exception();
189 void OPPROTO
op_ldcl_rMplus_rN_bank(void)
191 env
->gregs
[PARAM2
] = env
->gregs
[PARAM1
];
192 env
->gregs
[PARAM1
] += 4;
196 void OPPROTO
op_ldc_T0_sr(void)
198 env
->sr
= T0
& 0x700083f3;
202 void OPPROTO
op_stc_sr_T0(void)
208 #define LDSTOPS(target,load,store) \
209 void OPPROTO op_##load##_T0_##target (void) \
210 { env ->target = T0; RETURN(); \
212 void OPPROTO op_##store##_##target##_T0 (void) \
213 { T0 = env->target; RETURN(); \
216 LDSTOPS(gbr, ldc, stc)
217 LDSTOPS(vbr
, ldc
, stc
)
218 LDSTOPS(ssr
, ldc
, stc
)
219 LDSTOPS(spc
, ldc
, stc
)
220 LDSTOPS(sgr
, ldc
, stc
)
221 LDSTOPS(dbr
, ldc
, stc
)
222 LDSTOPS(mach
, lds
, sts
)
223 LDSTOPS(macl
, lds
, sts
)
224 LDSTOPS(pr
, lds
, sts
)
225 LDSTOPS(fpul
, lds
, sts
)
227 void OPPROTO
op_lds_T0_fpscr(void)
229 env
->fpscr
= T0
& 0x003fffff;
230 env
->fp_status
.float_rounding_mode
= T0
& 0x01 ?
231 float_round_to_zero
: float_round_nearest_even
;
236 void OPPROTO
op_sts_fpscr_T0(void)
238 T0
= env
->fpscr
& 0x003fffff;
242 void OPPROTO
op_rotcl_Rn(void)
244 helper_rotcl(&env
->gregs
[PARAM1
]);
248 void OPPROTO
op_rotcr_Rn(void)
250 helper_rotcr(&env
->gregs
[PARAM1
]);
254 void OPPROTO
op_rotl_Rn(void)
256 cond_t(env
->gregs
[PARAM1
] & 0x80000000);
257 env
->gregs
[PARAM1
] = (env
->gregs
[PARAM1
] << 1) | (env
->sr
& SR_T
);
261 void OPPROTO
op_rotr_Rn(void)
263 cond_t(env
->gregs
[PARAM1
] & 1);
264 env
->gregs
[PARAM1
] = (env
->gregs
[PARAM1
] >> 1) |
265 ((env
->sr
& SR_T
) ? 0x80000000 : 0);
269 void OPPROTO
op_shal_Rn(void)
271 cond_t(env
->gregs
[PARAM1
] & 0x80000000);
272 env
->gregs
[PARAM1
] <<= 1;
276 void OPPROTO
op_shar_Rn(void)
278 cond_t(env
->gregs
[PARAM1
] & 1);
279 *(int32_t *)&env
->gregs
[PARAM1
] >>= 1;
283 void OPPROTO
op_shlr_Rn(void)
285 cond_t(env
->gregs
[PARAM1
] & 1);
286 env
->gregs
[PARAM1
] >>= 1;
290 void OPPROTO
op_fmov_frN_FT0(void)
292 FT0
= env
->fregs
[PARAM1
];
296 void OPPROTO
op_fmov_drN_DT0(void)
300 d
.l
.upper
= *(uint32_t *)&env
->fregs
[PARAM1
];
301 d
.l
.lower
= *(uint32_t *)&env
->fregs
[PARAM1
+ 1];
306 void OPPROTO
op_fmov_frN_FT1(void)
308 FT1
= env
->fregs
[PARAM1
];
312 void OPPROTO
op_fmov_drN_DT1(void)
316 d
.l
.upper
= *(uint32_t *)&env
->fregs
[PARAM1
];
317 d
.l
.lower
= *(uint32_t *)&env
->fregs
[PARAM1
+ 1];
322 void OPPROTO
op_fmov_FT0_frN(void)
324 env
->fregs
[PARAM1
] = FT0
;
328 void OPPROTO
op_fmov_DT0_drN(void)
333 *(uint32_t *)&env
->fregs
[PARAM1
] = d
.l
.upper
;
334 *(uint32_t *)&env
->fregs
[PARAM1
+ 1] = d
.l
.lower
;
338 void OPPROTO
op_fadd_FT(void)
340 FT0
= float32_add(FT0
, FT1
, &env
->fp_status
);
344 void OPPROTO
op_fadd_DT(void)
346 DT0
= float64_add(DT0
, DT1
, &env
->fp_status
);
350 void OPPROTO
op_fsub_FT(void)
352 FT0
= float32_sub(FT0
, FT1
, &env
->fp_status
);
356 void OPPROTO
op_fsub_DT(void)
358 DT0
= float64_sub(DT0
, DT1
, &env
->fp_status
);
362 void OPPROTO
op_fmul_FT(void)
364 FT0
= float32_mul(FT0
, FT1
, &env
->fp_status
);
368 void OPPROTO
op_fmul_DT(void)
370 DT0
= float64_mul(DT0
, DT1
, &env
->fp_status
);
374 void OPPROTO
op_fdiv_FT(void)
376 FT0
= float32_div(FT0
, FT1
, &env
->fp_status
);
380 void OPPROTO
op_fdiv_DT(void)
382 DT0
= float64_div(DT0
, DT1
, &env
->fp_status
);
386 void OPPROTO
op_fcmp_eq_FT(void)
388 cond_t(float32_compare(FT0
, FT1
, &env
->fp_status
) == 0);
392 void OPPROTO
op_fcmp_eq_DT(void)
394 cond_t(float64_compare(DT0
, DT1
, &env
->fp_status
) == 0);
398 void OPPROTO
op_fcmp_gt_FT(void)
400 cond_t(float32_compare(FT0
, FT1
, &env
->fp_status
) == 1);
404 void OPPROTO
op_fcmp_gt_DT(void)
406 cond_t(float64_compare(DT0
, DT1
, &env
->fp_status
) == 1);
410 void OPPROTO
op_float_FT(void)
412 FT0
= int32_to_float32(env
->fpul
, &env
->fp_status
);
416 void OPPROTO
op_float_DT(void)
418 DT0
= int32_to_float64(env
->fpul
, &env
->fp_status
);
422 void OPPROTO
op_ftrc_FT(void)
424 env
->fpul
= float32_to_int32_round_to_zero(FT0
, &env
->fp_status
);
428 void OPPROTO
op_ftrc_DT(void)
430 env
->fpul
= float64_to_int32_round_to_zero(DT0
, &env
->fp_status
);
434 void OPPROTO
op_fneg_frN(void)
436 env
->fregs
[PARAM1
] = float32_chs(env
->fregs
[PARAM1
]);
440 void OPPROTO
op_fabs_FT(void)
442 FT0
= float32_abs(FT0
);
446 void OPPROTO
op_fabs_DT(void)
448 DT0
= float64_abs(DT0
);
452 void OPPROTO
op_fcnvsd_FT_DT(void)
454 DT0
= float32_to_float64(FT0
, &env
->fp_status
);
458 void OPPROTO
op_fcnvds_DT_FT(void)
460 FT0
= float64_to_float32(DT0
, &env
->fp_status
);
464 void OPPROTO
op_fsqrt_FT(void)
466 FT0
= float32_sqrt(FT0
, &env
->fp_status
);
470 void OPPROTO
op_fsqrt_DT(void)
472 DT0
= float64_sqrt(DT0
, &env
->fp_status
);
476 void OPPROTO
op_fmov_T0_frN(void)
478 *(uint32_t *)&env
->fregs
[PARAM1
] = T0
;
482 void OPPROTO
op_movl_fpul_FT0(void)
484 FT0
= *(float32
*)&env
->fpul
;
488 void OPPROTO
op_movl_FT0_fpul(void)
490 *(float32
*)&env
->fpul
= FT0
;
494 void OPPROTO
op_raise_illegal_instruction(void)
496 env
->exception_index
= 0x180;
497 do_raise_exception();
501 void OPPROTO
op_raise_slot_illegal_instruction(void)
503 env
->exception_index
= 0x1a0;
504 do_raise_exception();
508 void OPPROTO
op_debug(void)
510 env
->exception_index
= EXCP_DEBUG
;
514 void OPPROTO
op_sleep(void)
517 env
->exception_index
= EXCP_HLT
;
522 #define MEMSUFFIX _raw
525 #if !defined(CONFIG_USER_ONLY)
526 #define MEMSUFFIX _user
530 #define MEMSUFFIX _kernel