]>
git.proxmox.com Git - qemu.git/blob - target-sh4/op.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
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_cmp_str_T0_T1(void)
42 cond_t((T0
& 0x000000ff) == (T1
& 0x000000ff) ||
43 (T0
& 0x0000ff00) == (T1
& 0x0000ff00) ||
44 (T0
& 0x00ff0000) == (T1
& 0x00ff0000) ||
45 (T0
& 0xff000000) == (T1
& 0xff000000));
49 void OPPROTO
op_div0s_T0_T1(void)
59 cond_t((T1
^ T0
) & 0x80000000);
63 void OPPROTO
op_div1_T0_T1(void)
69 void OPPROTO
op_shad_T0_T1(void)
71 if ((T0
& 0x80000000) == 0)
73 else if ((T0
& 0x1f) == 0)
74 T1
= (T1
& 0x80000000)? 0xffffffff : 0;
76 T1
= ((int32_t) T1
) >> ((~T0
& 0x1f) + 1);
80 void OPPROTO
op_shld_T0_T1(void)
82 if ((T0
& 0x80000000) == 0)
84 else if ((T0
& 0x1f) == 0)
87 T1
= ((uint32_t) T1
) >> ((~T0
& 0x1f) + 1);
91 void OPPROTO
op_ldc_T0_sr(void)
93 env
->sr
= T0
& 0x700083f3;
97 void OPPROTO
op_stc_sr_T0(void)
103 #define LDSTOPS(target,load,store) \
104 void OPPROTO op_##load##_T0_##target (void) \
105 { env ->target = T0; RETURN(); \
107 void OPPROTO op_##store##_##target##_T0 (void) \
108 { T0 = env->target; RETURN(); \
111 LDSTOPS(gbr, ldc, stc)
112 LDSTOPS(vbr
, ldc
, stc
)
113 LDSTOPS(ssr
, ldc
, stc
)
114 LDSTOPS(spc
, ldc
, stc
)
115 LDSTOPS(sgr
, ldc
, stc
)
116 LDSTOPS(dbr
, ldc
, stc
)
117 LDSTOPS(mach
, lds
, sts
)
118 LDSTOPS(macl
, lds
, sts
)
119 LDSTOPS(pr
, lds
, sts
)
120 LDSTOPS(fpul
, lds
, sts
)
122 void OPPROTO
op_lds_T0_fpscr(void)
124 env
->fpscr
= T0
& 0x003fffff;
125 env
->fp_status
.float_rounding_mode
= T0
& 0x01 ?
126 float_round_to_zero
: float_round_nearest_even
;
131 void OPPROTO
op_sts_fpscr_T0(void)
133 T0
= env
->fpscr
& 0x003fffff;
137 void OPPROTO
op_rotcl_Rn(void)
139 helper_rotcl(&env
->gregs
[PARAM1
]);
143 void OPPROTO
op_rotcr_Rn(void)
145 helper_rotcr(&env
->gregs
[PARAM1
]);
149 void OPPROTO
op_rotl_Rn(void)
151 cond_t(env
->gregs
[PARAM1
] & 0x80000000);
152 env
->gregs
[PARAM1
] = (env
->gregs
[PARAM1
] << 1) | (env
->sr
& SR_T
);
156 void OPPROTO
op_rotr_Rn(void)
158 cond_t(env
->gregs
[PARAM1
] & 1);
159 env
->gregs
[PARAM1
] = (env
->gregs
[PARAM1
] >> 1) |
160 ((env
->sr
& SR_T
) ? 0x80000000 : 0);
164 void OPPROTO
op_shal_Rn(void)
166 cond_t(env
->gregs
[PARAM1
] & 0x80000000);
167 env
->gregs
[PARAM1
] <<= 1;
171 void OPPROTO
op_shar_Rn(void)
173 cond_t(env
->gregs
[PARAM1
] & 1);
174 *(int32_t *)&env
->gregs
[PARAM1
] >>= 1;
178 void OPPROTO
op_shlr_Rn(void)
180 cond_t(env
->gregs
[PARAM1
] & 1);
181 env
->gregs
[PARAM1
] >>= 1;
185 void OPPROTO
op_fmov_frN_FT0(void)
187 FT0
= env
->fregs
[PARAM1
];
191 void OPPROTO
op_fmov_drN_DT0(void)
195 d
.l
.upper
= *(uint32_t *)&env
->fregs
[PARAM1
];
196 d
.l
.lower
= *(uint32_t *)&env
->fregs
[PARAM1
+ 1];
201 void OPPROTO
op_fmov_frN_FT1(void)
203 FT1
= env
->fregs
[PARAM1
];
207 void OPPROTO
op_fmov_drN_DT1(void)
211 d
.l
.upper
= *(uint32_t *)&env
->fregs
[PARAM1
];
212 d
.l
.lower
= *(uint32_t *)&env
->fregs
[PARAM1
+ 1];
217 void OPPROTO
op_fmov_FT0_frN(void)
219 env
->fregs
[PARAM1
] = FT0
;
223 void OPPROTO
op_fmov_DT0_drN(void)
228 *(uint32_t *)&env
->fregs
[PARAM1
] = d
.l
.upper
;
229 *(uint32_t *)&env
->fregs
[PARAM1
+ 1] = d
.l
.lower
;
233 void OPPROTO
op_fadd_FT(void)
235 FT0
= float32_add(FT0
, FT1
, &env
->fp_status
);
239 void OPPROTO
op_fadd_DT(void)
241 DT0
= float64_add(DT0
, DT1
, &env
->fp_status
);
245 void OPPROTO
op_fsub_FT(void)
247 FT0
= float32_sub(FT0
, FT1
, &env
->fp_status
);
251 void OPPROTO
op_fsub_DT(void)
253 DT0
= float64_sub(DT0
, DT1
, &env
->fp_status
);
257 void OPPROTO
op_fmul_FT(void)
259 FT0
= float32_mul(FT0
, FT1
, &env
->fp_status
);
263 void OPPROTO
op_fmul_DT(void)
265 DT0
= float64_mul(DT0
, DT1
, &env
->fp_status
);
269 void OPPROTO
op_fdiv_FT(void)
271 FT0
= float32_div(FT0
, FT1
, &env
->fp_status
);
275 void OPPROTO
op_fdiv_DT(void)
277 DT0
= float64_div(DT0
, DT1
, &env
->fp_status
);
281 void OPPROTO
op_fcmp_eq_FT(void)
283 cond_t(float32_compare(FT0
, FT1
, &env
->fp_status
) == 0);
287 void OPPROTO
op_fcmp_eq_DT(void)
289 cond_t(float64_compare(DT0
, DT1
, &env
->fp_status
) == 0);
293 void OPPROTO
op_fcmp_gt_FT(void)
295 cond_t(float32_compare(FT0
, FT1
, &env
->fp_status
) == 1);
299 void OPPROTO
op_fcmp_gt_DT(void)
301 cond_t(float64_compare(DT0
, DT1
, &env
->fp_status
) == 1);
305 void OPPROTO
op_float_FT(void)
307 FT0
= int32_to_float32(env
->fpul
, &env
->fp_status
);
311 void OPPROTO
op_float_DT(void)
313 DT0
= int32_to_float64(env
->fpul
, &env
->fp_status
);
317 void OPPROTO
op_ftrc_FT(void)
319 env
->fpul
= float32_to_int32_round_to_zero(FT0
, &env
->fp_status
);
323 void OPPROTO
op_ftrc_DT(void)
325 env
->fpul
= float64_to_int32_round_to_zero(DT0
, &env
->fp_status
);
329 void OPPROTO
op_fneg_frN(void)
331 env
->fregs
[PARAM1
] = float32_chs(env
->fregs
[PARAM1
]);
335 void OPPROTO
op_fabs_FT(void)
337 FT0
= float32_abs(FT0
);
341 void OPPROTO
op_fabs_DT(void)
343 DT0
= float64_abs(DT0
);
347 void OPPROTO
op_fcnvsd_FT_DT(void)
349 DT0
= float32_to_float64(FT0
, &env
->fp_status
);
353 void OPPROTO
op_fcnvds_DT_FT(void)
355 FT0
= float64_to_float32(DT0
, &env
->fp_status
);
359 void OPPROTO
op_fsqrt_FT(void)
361 FT0
= float32_sqrt(FT0
, &env
->fp_status
);
365 void OPPROTO
op_fsqrt_DT(void)
367 DT0
= float64_sqrt(DT0
, &env
->fp_status
);
371 void OPPROTO
op_fmov_T0_frN(void)
373 *(uint32_t *)&env
->fregs
[PARAM1
] = T0
;
377 void OPPROTO
op_movl_fpul_FT0(void)
379 FT0
= *(float32
*)&env
->fpul
;
383 void OPPROTO
op_movl_FT0_fpul(void)
385 *(float32
*)&env
->fpul
= FT0
;
390 #define MEMSUFFIX _raw
393 #if !defined(CONFIG_USER_ONLY)
394 #define MEMSUFFIX _user
398 #define MEMSUFFIX _kernel