Commit cc4ba6a9826d94bb46f13856927f7883fd6b9d51

Authored by aurel32
1 parent 105a1f04

SH4: convert floating-point ops to TCG

Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5124 c046a42c-6fe2-441c-8c8c-71466251a162
target-sh4/helper.h
... ... @@ -19,3 +19,27 @@ DEF_HELPER(void, helper_macl, (uint32_t, uint32_t))
19 19 DEF_HELPER(void, helper_macw, (uint32_t, uint32_t))
20 20  
21 21 DEF_HELPER(void, helper_ld_fpscr, (uint32_t))
  22 +
  23 +DEF_HELPER(uint32_t, helper_fabs_FT, (uint32_t))
  24 +DEF_HELPER(uint64_t, helper_fabs_DT, (uint64_t))
  25 +DEF_HELPER(uint32_t, helper_fadd_FT, (uint32_t, uint32_t))
  26 +DEF_HELPER(uint64_t, helper_fadd_DT, (uint64_t, uint64_t))
  27 +DEF_HELPER(uint64_t, helper_fcnvsd_FT_DT, (uint32_t))
  28 +DEF_HELPER(uint32_t, helper_fcnvds_DT_FT, (uint64_t))
  29 +
  30 +DEF_HELPER(void, helper_fcmp_eq_FT, (uint32_t, uint32_t))
  31 +DEF_HELPER(void, helper_fcmp_eq_DT, (uint64_t, uint64_t))
  32 +DEF_HELPER(void, helper_fcmp_gt_FT, (uint32_t, uint32_t))
  33 +DEF_HELPER(void, helper_fcmp_gt_DT, (uint64_t, uint64_t))
  34 +DEF_HELPER(uint32_t, helper_fdiv_FT, (uint32_t, uint32_t))
  35 +DEF_HELPER(uint64_t, helper_fdiv_DT, (uint64_t, uint64_t))
  36 +DEF_HELPER(uint32_t, helper_float_FT, (uint32_t))
  37 +DEF_HELPER(uint64_t, helper_float_DT, (uint32_t))
  38 +DEF_HELPER(uint32_t, helper_fmul_FT, (uint32_t, uint32_t))
  39 +DEF_HELPER(uint64_t, helper_fmul_DT, (uint64_t, uint64_t))
  40 +DEF_HELPER(uint32_t, helper_fsub_FT, (uint32_t, uint32_t))
  41 +DEF_HELPER(uint64_t, helper_fsub_DT, (uint64_t, uint64_t))
  42 +DEF_HELPER(uint32_t, helper_fsqrt_FT, (uint32_t))
  43 +DEF_HELPER(uint64_t, helper_fsqrt_DT, (uint64_t))
  44 +DEF_HELPER(uint32_t, helper_ftrc_FT, (uint32_t))
  45 +DEF_HELPER(uint32_t, helper_ftrc_DT, (uint64_t))
... ...
target-sh4/op.c
... ... @@ -19,238 +19,9 @@
19 19 */
20 20 #include "exec.h"
21 21  
22   -static inline void set_t(void)
23   -{
24   - env->sr |= SR_T;
25   -}
26   -
27   -static inline void clr_t(void)
28   -{
29   - env->sr &= ~SR_T;
30   -}
31   -
32   -static inline void cond_t(int cond)
33   -{
34   - if (cond)
35   - set_t();
36   - else
37   - clr_t();
38   -}
39   -
40   -void OPPROTO op_fmov_frN_FT0(void)
41   -{
42   - FT0 = env->fregs[PARAM1];
43   - RETURN();
44   -}
45   -
46   -void OPPROTO op_fmov_drN_DT0(void)
47   -{
48   - CPU_DoubleU d;
49   -
50   - d.l.upper = *(uint32_t *)&env->fregs[PARAM1];
51   - d.l.lower = *(uint32_t *)&env->fregs[PARAM1 + 1];
52   - DT0 = d.d;
53   - RETURN();
54   -}
55   -
56   -void OPPROTO op_fmov_frN_FT1(void)
57   -{
58   - FT1 = env->fregs[PARAM1];
59   - RETURN();
60   -}
61   -
62   -void OPPROTO op_fmov_drN_DT1(void)
63   -{
64   - CPU_DoubleU d;
65   -
66   - d.l.upper = *(uint32_t *)&env->fregs[PARAM1];
67   - d.l.lower = *(uint32_t *)&env->fregs[PARAM1 + 1];
68   - DT1 = d.d;
69   - RETURN();
70   -}
71   -
72   -void OPPROTO op_fmov_FT0_frN(void)
73   -{
74   - env->fregs[PARAM1] = FT0;
75   - RETURN();
76   -}
77   -
78   -void OPPROTO op_fmov_DT0_drN(void)
79   -{
80   - CPU_DoubleU d;
81   -
82   - d.d = DT0;
83   - *(uint32_t *)&env->fregs[PARAM1] = d.l.upper;
84   - *(uint32_t *)&env->fregs[PARAM1 + 1] = d.l.lower;
85   - RETURN();
86   -}
87   -
88   -void OPPROTO op_fadd_FT(void)
89   -{
90   - FT0 = float32_add(FT0, FT1, &env->fp_status);
91   - RETURN();
92   -}
93   -
94   -void OPPROTO op_fadd_DT(void)
95   -{
96   - DT0 = float64_add(DT0, DT1, &env->fp_status);
97   - RETURN();
98   -}
99   -
100   -void OPPROTO op_fsub_FT(void)
101   -{
102   - FT0 = float32_sub(FT0, FT1, &env->fp_status);
103   - RETURN();
104   -}
105   -
106   -void OPPROTO op_fsub_DT(void)
107   -{
108   - DT0 = float64_sub(DT0, DT1, &env->fp_status);
109   - RETURN();
110   -}
111   -
112   -void OPPROTO op_fmul_FT(void)
113   -{
114   - FT0 = float32_mul(FT0, FT1, &env->fp_status);
115   - RETURN();
116   -}
117   -
118   -void OPPROTO op_fmul_DT(void)
119   -{
120   - DT0 = float64_mul(DT0, DT1, &env->fp_status);
121   - RETURN();
122   -}
123   -
124   -void OPPROTO op_fdiv_FT(void)
125   -{
126   - FT0 = float32_div(FT0, FT1, &env->fp_status);
127   - RETURN();
128   -}
129   -
130   -void OPPROTO op_fdiv_DT(void)
131   -{
132   - DT0 = float64_div(DT0, DT1, &env->fp_status);
133   - RETURN();
134   -}
135   -
136   -void OPPROTO op_fcmp_eq_FT(void)
137   -{
138   - cond_t(float32_compare(FT0, FT1, &env->fp_status) == 0);
139   - RETURN();
140   -}
141   -
142   -void OPPROTO op_fcmp_eq_DT(void)
143   -{
144   - cond_t(float64_compare(DT0, DT1, &env->fp_status) == 0);
145   - RETURN();
146   -}
147   -
148   -void OPPROTO op_fcmp_gt_FT(void)
149   -{
150   - cond_t(float32_compare(FT0, FT1, &env->fp_status) == 1);
151   - RETURN();
152   -}
153   -
154   -void OPPROTO op_fcmp_gt_DT(void)
155   -{
156   - cond_t(float64_compare(DT0, DT1, &env->fp_status) == 1);
157   - RETURN();
158   -}
159   -
160   -void OPPROTO op_float_FT(void)
161   -{
162   - FT0 = int32_to_float32(env->fpul, &env->fp_status);
163   - RETURN();
164   -}
165   -
166   -void OPPROTO op_float_DT(void)
167   -{
168   - DT0 = int32_to_float64(env->fpul, &env->fp_status);
169   - RETURN();
170   -}
171   -
172   -void OPPROTO op_ftrc_FT(void)
173   -{
174   - env->fpul = float32_to_int32_round_to_zero(FT0, &env->fp_status);
175   - RETURN();
176   -}
177   -
178   -void OPPROTO op_ftrc_DT(void)
179   -{
180   - env->fpul = float64_to_int32_round_to_zero(DT0, &env->fp_status);
181   - RETURN();
182   -}
183   -
184 22 void OPPROTO op_fneg_frN(void)
185 23 {
186 24 env->fregs[PARAM1] = float32_chs(env->fregs[PARAM1]);
187 25 RETURN();
188 26 }
189 27  
190   -void OPPROTO op_fabs_FT(void)
191   -{
192   - FT0 = float32_abs(FT0);
193   - RETURN();
194   -}
195   -
196   -void OPPROTO op_fabs_DT(void)
197   -{
198   - DT0 = float64_abs(DT0);
199   - RETURN();
200   -}
201   -
202   -void OPPROTO op_fcnvsd_FT_DT(void)
203   -{
204   - DT0 = float32_to_float64(FT0, &env->fp_status);
205   - RETURN();
206   -}
207   -
208   -void OPPROTO op_fcnvds_DT_FT(void)
209   -{
210   - FT0 = float64_to_float32(DT0, &env->fp_status);
211   - RETURN();
212   -}
213   -
214   -void OPPROTO op_fsqrt_FT(void)
215   -{
216   - FT0 = float32_sqrt(FT0, &env->fp_status);
217   - RETURN();
218   -}
219   -
220   -void OPPROTO op_fsqrt_DT(void)
221   -{
222   - DT0 = float64_sqrt(DT0, &env->fp_status);
223   - RETURN();
224   -}
225   -
226   -void OPPROTO op_fmov_T0_frN(void)
227   -{
228   - *(uint32_t *)&env->fregs[PARAM1] = T0;
229   - RETURN();
230   -}
231   -
232   -void OPPROTO op_movl_fpul_FT0(void)
233   -{
234   - FT0 = *(float32 *)&env->fpul;
235   - RETURN();
236   -}
237   -
238   -void OPPROTO op_movl_FT0_fpul(void)
239   -{
240   - *(float32 *)&env->fpul = FT0;
241   - RETURN();
242   -}
243   -
244   -/* Load and store */
245   -#define MEMSUFFIX _raw
246   -#include "op_mem.c"
247   -#undef MEMSUFFIX
248   -#if !defined(CONFIG_USER_ONLY)
249   -#define MEMSUFFIX _user
250   -#include "op_mem.c"
251   -#undef MEMSUFFIX
252   -
253   -#define MEMSUFFIX _kernel
254   -#include "op_mem.c"
255   -#undef MEMSUFFIX
256   -#endif
... ...
target-sh4/op_helper.c
... ... @@ -366,6 +366,16 @@ uint32_t helper_subv(uint32_t arg0, uint32_t arg1)
366 366 return arg1;
367 367 }
368 368  
  369 +static inline void set_t(void)
  370 +{
  371 + env->sr |= SR_T;
  372 +}
  373 +
  374 +static inline void clr_t(void)
  375 +{
  376 + env->sr &= ~SR_T;
  377 +}
  378 +
369 379 void helper_ld_fpscr(uint32_t val)
370 380 {
371 381 env->fpscr = val & 0x003fffff;
... ... @@ -374,3 +384,141 @@ void helper_ld_fpscr(uint32_t val)
374 384 else
375 385 set_float_rounding_mode(float_round_nearest_even, &env->fp_status);
376 386 }
  387 +
  388 +uint32_t helper_fabs_FT(uint32_t t0)
  389 +{
  390 + float32 ret = float32_abs(*(float32*)&t0);
  391 + return *(uint32_t*)(&ret);
  392 +}
  393 +
  394 +uint64_t helper_fabs_DT(uint64_t t0)
  395 +{
  396 + float64 ret = float64_abs(*(float64*)&t0);
  397 + return *(uint64_t*)(&ret);
  398 +}
  399 +
  400 +uint32_t helper_fadd_FT(uint32_t t0, uint32_t t1)
  401 +{
  402 + float32 ret = float32_add(*(float32*)&t0, *(float32*)&t1, &env->fp_status);
  403 + return *(uint32_t*)(&ret);
  404 +}
  405 +
  406 +uint64_t helper_fadd_DT(uint64_t t0, uint64_t t1)
  407 +{
  408 + float64 ret = float64_add(*(float64*)&t0, *(float64*)&t1, &env->fp_status);
  409 + return *(uint64_t*)(&ret);
  410 +}
  411 +
  412 +void helper_fcmp_eq_FT(uint32_t t0, uint32_t t1)
  413 +{
  414 + if (float32_compare(*(float32*)&t0, *(float32*)&t1, &env->fp_status) == 0)
  415 + set_t();
  416 + else
  417 + clr_t();
  418 +}
  419 +
  420 +void helper_fcmp_eq_DT(uint64_t t0, uint64_t t1)
  421 +{
  422 + if (float64_compare(*(float64*)&t0, *(float64*)&t1, &env->fp_status) == 0)
  423 + set_t();
  424 + else
  425 + clr_t();
  426 +}
  427 +
  428 +void helper_fcmp_gt_FT(uint32_t t0, uint32_t t1)
  429 +{
  430 + if (float32_compare(*(float32*)&t0, *(float32*)&t1, &env->fp_status) == 1)
  431 + set_t();
  432 + else
  433 + clr_t();
  434 +}
  435 +
  436 +void helper_fcmp_gt_DT(uint64_t t0, uint64_t t1)
  437 +{
  438 + if (float64_compare(*(float64*)&t0, *(float64*)&t1, &env->fp_status) == 1)
  439 + set_t();
  440 + else
  441 + clr_t();
  442 +}
  443 +
  444 +uint64_t helper_fcnvsd_FT_DT(uint32_t t0)
  445 +{
  446 + float64 ret = float32_to_float64(*(float32*)&t0, &env->fp_status);
  447 + return *(uint64_t*)(&ret);
  448 +}
  449 +
  450 +uint32_t helper_fcnvds_DT_FT(uint64_t t0)
  451 +{
  452 + float32 ret = float64_to_float32(*(float64*)&t0, &env->fp_status);
  453 + return *(uint32_t*)(&ret);
  454 +}
  455 +
  456 +uint32_t helper_fdiv_FT(uint32_t t0, uint32_t t1)
  457 +{
  458 + float32 ret = float32_div(*(float32*)&t0, *(float32*)&t1, &env->fp_status);
  459 + return *(uint32_t*)(&ret);
  460 +}
  461 +
  462 +uint64_t helper_fdiv_DT(uint64_t t0, uint64_t t1)
  463 +{
  464 + float64 ret = float64_div(*(float64*)&t0, *(float64*)&t1, &env->fp_status);
  465 + return *(uint64_t*)(&ret);
  466 +}
  467 +
  468 +uint32_t helper_float_FT(uint32_t t0)
  469 +{
  470 + float32 ret = int32_to_float32(t0, &env->fp_status);
  471 + return *(uint32_t*)(&ret);
  472 +}
  473 +
  474 +uint64_t helper_float_DT(uint32_t t0)
  475 +{
  476 + float64 ret = int32_to_float64(t0, &env->fp_status);
  477 + return *(uint64_t*)(&ret);
  478 +}
  479 +
  480 +uint32_t helper_fmul_FT(uint32_t t0, uint32_t t1)
  481 +{
  482 + float32 ret = float32_mul(*(float32*)&t0, *(float32*)&t1, &env->fp_status);
  483 + return *(uint32_t*)(&ret);
  484 +}
  485 +
  486 +uint64_t helper_fmul_DT(uint64_t t0, uint64_t t1)
  487 +{
  488 + float64 ret = float64_mul(*(float64*)&t0, *(float64*)&t1, &env->fp_status);
  489 + return *(uint64_t*)(&ret);
  490 +}
  491 +
  492 +uint32_t helper_fsqrt_FT(uint32_t t0)
  493 +{
  494 + float32 ret = float32_sqrt(*(float32*)&t0, &env->fp_status);
  495 + return *(uint32_t*)(&ret);
  496 +}
  497 +
  498 +uint64_t helper_fsqrt_DT(uint64_t t0)
  499 +{
  500 + float64 ret = float64_sqrt(*(float64*)&t0, &env->fp_status);
  501 + return *(uint64_t*)(&ret);
  502 +}
  503 +
  504 +uint32_t helper_fsub_FT(uint32_t t0, uint32_t t1)
  505 +{
  506 + float32 ret = float32_sub(*(float32*)&t0, *(float32*)&t1, &env->fp_status);
  507 + return *(uint32_t*)(&ret);
  508 +}
  509 +
  510 +uint64_t helper_fsub_DT(uint64_t t0, uint64_t t1)
  511 +{
  512 + float64 ret = float64_sub(*(float64*)&t0, *(float64*)&t1, &env->fp_status);
  513 + return *(uint64_t*)(&ret);
  514 +}
  515 +
  516 +uint32_t helper_ftrc_FT(uint32_t t0)
  517 +{
  518 + return float32_to_int32_round_to_zero(*(float32*)&t0, &env->fp_status);
  519 +}
  520 +
  521 +uint32_t helper_ftrc_DT(uint64_t t0)
  522 +{
  523 + return float64_to_int32_round_to_zero(*(float64*)&t0, &env->fp_status);
  524 +}
... ...
target-sh4/op_mem.c deleted 100644 โ†’ 0
1   -/*
2   - * SH4 emulation
3   - *
4   - * Copyright (c) 2005 Samuel Tardieu
5   - *
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.
10   - *
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.
15   - *
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
19   - */
20   -void glue(op_ldfl_T0_FT0, MEMSUFFIX) (void) {
21   - FT0 = glue(ldfl, MEMSUFFIX) (T0);
22   - RETURN();
23   -}
24   -
25   -void glue(op_stfl_FT0_T1, MEMSUFFIX) (void) {
26   - glue(stfl, MEMSUFFIX) (T1, FT0);
27   - RETURN();
28   -}
29   -
30   -void glue(op_ldfq_T0_DT0, MEMSUFFIX) (void) {
31   - DT0 = glue(ldfq, MEMSUFFIX) (T0);
32   - RETURN();
33   -}
34   -
35   -void glue(op_stfq_DT0_T1, MEMSUFFIX) (void) {
36   - glue(stfq, MEMSUFFIX) (T1, DT0);
37   - RETURN();
38   -}
target-sh4/translate.c
... ... @@ -137,37 +137,6 @@ static void sh4_translate_init(void)
137 137 done_init = 1;
138 138 }
139 139  
140   -#ifdef CONFIG_USER_ONLY
141   -
142   -#define GEN_OP_LD(width, reg) \
143   - void gen_op_ld##width##_T0_##reg (DisasContext *ctx) { \
144   - gen_op_ld##width##_T0_##reg##_raw(); \
145   - }
146   -#define GEN_OP_ST(width, reg) \
147   - void gen_op_st##width##_##reg##_T1 (DisasContext *ctx) { \
148   - gen_op_st##width##_##reg##_T1_raw(); \
149   - }
150   -
151   -#else
152   -
153   -#define GEN_OP_LD(width, reg) \
154   - void gen_op_ld##width##_T0_##reg (DisasContext *ctx) { \
155   - if (ctx->memidx) gen_op_ld##width##_T0_##reg##_kernel(); \
156   - else gen_op_ld##width##_T0_##reg##_user();\
157   - }
158   -#define GEN_OP_ST(width, reg) \
159   - void gen_op_st##width##_##reg##_T1 (DisasContext *ctx) { \
160   - if (ctx->memidx) gen_op_st##width##_##reg##_T1_kernel(); \
161   - else gen_op_st##width##_##reg##_T1_user();\
162   - }
163   -
164   -#endif
165   -
166   -GEN_OP_LD(fl, FT0)
167   -GEN_OP_ST(fl, FT0)
168   -GEN_OP_LD(fq, DT0)
169   -GEN_OP_ST(fq, DT0)
170   -
171 140 void cpu_dump_state(CPUState * env, FILE * f,
172 141 int (*cpu_fprintf) (FILE * f, const char *fmt, ...),
173 142 int flags)
... ... @@ -361,6 +330,44 @@ static inline void gen_copy_bit_i32(TCGv t0, int p0, TCGv t1, int p1)
361 330 tcg_temp_free(tmp);
362 331 }
363 332  
  333 +
  334 +static inline void gen_load_fpr32(TCGv t, int reg)
  335 +{
  336 + tcg_gen_ld_i32(t, cpu_env, offsetof(CPUState, fregs[reg]));
  337 +}
  338 +
  339 +static inline void gen_load_fpr64(TCGv t, int reg)
  340 +{
  341 + TCGv tmp1 = tcg_temp_new(TCG_TYPE_I32);
  342 + TCGv tmp2 = tcg_temp_new(TCG_TYPE_I64);
  343 +
  344 + tcg_gen_ld_i32(tmp1, cpu_env, offsetof(CPUState, fregs[reg]));
  345 + tcg_gen_extu_i32_i64(t, tmp1);
  346 + tcg_gen_shli_i64(t, t, 32);
  347 + tcg_gen_ld_i32(tmp1, cpu_env, offsetof(CPUState, fregs[reg + 1]));
  348 + tcg_gen_extu_i32_i64(tmp2, tmp1);
  349 + tcg_temp_free(tmp1);
  350 + tcg_gen_or_i64(t, t, tmp2);
  351 + tcg_temp_free(tmp2);
  352 +}
  353 +
  354 +static inline void gen_store_fpr32(TCGv t, int reg)
  355 +{
  356 + tcg_gen_st_i32(t, cpu_env, offsetof(CPUState, fregs[reg]));
  357 +}
  358 +
  359 +static inline void gen_store_fpr64 (TCGv t, int reg)
  360 +{
  361 + TCGv tmp = tcg_temp_new(TCG_TYPE_I32);
  362 +
  363 + tcg_gen_trunc_i64_i32(tmp, t);
  364 + tcg_gen_st_i32(tmp, cpu_env, offsetof(CPUState, fregs[reg + 1]));
  365 + tcg_gen_shri_i64(t, t, 32);
  366 + tcg_gen_trunc_i64_i32(tmp, t);
  367 + tcg_gen_st_i32(tmp, cpu_env, offsetof(CPUState, fregs[reg]));
  368 + tcg_temp_free(tmp);
  369 +}
  370 +
364 371 #define B3_0 (ctx->opcode & 0xf)
365 372 #define B6_4 ((ctx->opcode >> 4) & 0x7)
366 373 #define B7_4 ((ctx->opcode >> 4) & 0xf)
... ... @@ -913,88 +920,115 @@ void _decode_opc(DisasContext * ctx)
913 920 return;
914 921 case 0xf00c: /* fmov {F,D,X}Rm,{F,D,X}Rn - FPSCR: Nothing */
915 922 if (ctx->fpscr & FPSCR_SZ) {
916   - gen_op_fmov_drN_DT0(XREG(B7_4));
917   - gen_op_fmov_DT0_drN(XREG(B11_8));
  923 + TCGv fp = tcg_temp_new(TCG_TYPE_I64);
  924 + gen_load_fpr64(fp, XREG(B7_4));
  925 + gen_store_fpr64(fp, XREG(B11_8));
  926 + tcg_temp_free(fp);
918 927 } else {
919   - gen_op_fmov_frN_FT0(FREG(B7_4));
920   - gen_op_fmov_FT0_frN(FREG(B11_8));
  928 + TCGv fp = tcg_temp_new(TCG_TYPE_I32);
  929 + gen_load_fpr32(fp, FREG(B7_4));
  930 + gen_store_fpr32(fp, FREG(B11_8));
  931 + tcg_temp_free(fp);
921 932 }
922 933 return;
923 934 case 0xf00a: /* fmov {F,D,X}Rm,@Rn - FPSCR: Nothing */
924 935 if (ctx->fpscr & FPSCR_SZ) {
925   - gen_op_fmov_drN_DT0(XREG(B7_4));
926   - tcg_gen_mov_i32(cpu_T[1], REG(B11_8));
927   - gen_op_stfq_DT0_T1(ctx);
  936 + TCGv fp = tcg_temp_new(TCG_TYPE_I64);
  937 + gen_load_fpr64(fp, XREG(B7_4));
  938 + tcg_gen_qemu_st64(fp, REG(B11_8), ctx->memidx);
  939 + tcg_temp_free(fp);
928 940 } else {
929   - gen_op_fmov_frN_FT0(FREG(B7_4));
930   - tcg_gen_mov_i32(cpu_T[1], REG(B11_8));
931   - gen_op_stfl_FT0_T1(ctx);
  941 + TCGv fp = tcg_temp_new(TCG_TYPE_I32);
  942 + gen_load_fpr32(fp, FREG(B7_4));
  943 + tcg_gen_qemu_st32(fp, REG(B11_8), ctx->memidx);
  944 + tcg_temp_free(fp);
932 945 }
933 946 return;
934 947 case 0xf008: /* fmov @Rm,{F,D,X}Rn - FPSCR: Nothing */
935 948 if (ctx->fpscr & FPSCR_SZ) {
936   - tcg_gen_mov_i32(cpu_T[0], REG(B7_4));
937   - gen_op_ldfq_T0_DT0(ctx);
938   - gen_op_fmov_DT0_drN(XREG(B11_8));
  949 + TCGv fp = tcg_temp_new(TCG_TYPE_I64);
  950 + tcg_gen_qemu_ld64(fp, REG(B7_4), ctx->memidx);
  951 + gen_store_fpr64(fp, XREG(B11_8));
  952 + tcg_temp_free(fp);
939 953 } else {
940   - tcg_gen_mov_i32(cpu_T[0], REG(B7_4));
941   - gen_op_ldfl_T0_FT0(ctx);
942   - gen_op_fmov_FT0_frN(FREG(B11_8));
  954 + TCGv fp = tcg_temp_new(TCG_TYPE_I32);
  955 + tcg_gen_qemu_ld32u(fp, REG(B7_4), ctx->memidx);
  956 + gen_store_fpr32(fp, FREG(B11_8));
  957 + tcg_temp_free(fp);
943 958 }
944 959 return;
945 960 case 0xf009: /* fmov @Rm+,{F,D,X}Rn - FPSCR: Nothing */
946 961 if (ctx->fpscr & FPSCR_SZ) {
947   - tcg_gen_mov_i32(cpu_T[0], REG(B7_4));
948   - gen_op_ldfq_T0_DT0(ctx);
949   - gen_op_fmov_DT0_drN(XREG(B11_8));
950   - tcg_gen_addi_i32(REG(B7_4),
951   - REG(B7_4), 8);
  962 + TCGv fp = tcg_temp_new(TCG_TYPE_I64);
  963 + tcg_gen_qemu_ld64(fp, REG(B7_4), ctx->memidx);
  964 + gen_store_fpr64(fp, XREG(B11_8));
  965 + tcg_temp_free(fp);
  966 + tcg_gen_addi_i32(REG(B7_4),REG(B7_4), 8);
952 967 } else {
953   - tcg_gen_mov_i32(cpu_T[0], REG(B7_4));
954   - gen_op_ldfl_T0_FT0(ctx);
955   - gen_op_fmov_FT0_frN(FREG(B11_8));
956   - tcg_gen_addi_i32(REG(B7_4),
957   - REG(B7_4), 4);
  968 + TCGv fp = tcg_temp_new(TCG_TYPE_I32);
  969 + tcg_gen_qemu_ld32u(fp, REG(B7_4), ctx->memidx);
  970 + gen_store_fpr32(fp, FREG(B11_8));
  971 + tcg_temp_free(fp);
  972 + tcg_gen_addi_i32(REG(B7_4), REG(B7_4), 4);
958 973 }
959 974 return;
960 975 case 0xf00b: /* fmov {F,D,X}Rm,@-Rn - FPSCR: Nothing */
961 976 if (ctx->fpscr & FPSCR_SZ) {
962   - tcg_gen_subi_i32(REG(B11_8), REG(B11_8), 8);
963   - gen_op_fmov_drN_DT0(XREG(B7_4));
964   - tcg_gen_mov_i32(cpu_T[1], REG(B11_8));
965   - tcg_gen_addi_i32(REG(B11_8), REG(B11_8), 8);
966   - gen_op_stfq_DT0_T1(ctx);
  977 + TCGv addr, fp;
  978 + addr = tcg_temp_new(TCG_TYPE_I32);
  979 + tcg_gen_subi_i32(addr, REG(B11_8), 8);
  980 + fp = tcg_temp_new(TCG_TYPE_I64);
  981 + gen_load_fpr64(fp, XREG(B7_4));
  982 + tcg_gen_qemu_st64(fp, addr, ctx->memidx);
  983 + tcg_temp_free(fp);
  984 + tcg_temp_free(addr);
967 985 tcg_gen_subi_i32(REG(B11_8), REG(B11_8), 8);
968 986 } else {
969   - tcg_gen_subi_i32(REG(B11_8), REG(B11_8), 4);
970   - gen_op_fmov_frN_FT0(FREG(B7_4));
971   - tcg_gen_mov_i32(cpu_T[1], REG(B11_8));
972   - tcg_gen_addi_i32(REG(B11_8), REG(B11_8), 4);
973   - gen_op_stfl_FT0_T1(ctx);
  987 + TCGv addr, fp;
  988 + addr = tcg_temp_new(TCG_TYPE_I32);
  989 + tcg_gen_subi_i32(addr, REG(B11_8), 4);
  990 + fp = tcg_temp_new(TCG_TYPE_I32);
  991 + gen_load_fpr32(fp, FREG(B7_4));
  992 + tcg_gen_qemu_st32(fp, addr, ctx->memidx);
  993 + tcg_temp_free(fp);
  994 + tcg_temp_free(addr);
974 995 tcg_gen_subi_i32(REG(B11_8), REG(B11_8), 4);
975 996 }
976 997 return;
977 998 case 0xf006: /* fmov @(R0,Rm),{F,D,X}Rm - FPSCR: Nothing */
978   - tcg_gen_add_i32(cpu_T[0], REG(B7_4), REG(0));
979   - if (ctx->fpscr & FPSCR_SZ) {
980   - gen_op_ldfq_T0_DT0(ctx);
981   - gen_op_fmov_DT0_drN(XREG(B11_8));
982   - } else {
983   - gen_op_ldfl_T0_FT0(ctx);
984   - gen_op_fmov_FT0_frN(FREG(B11_8));
  999 + {
  1000 + TCGv addr = tcg_temp_new(TCG_TYPE_I32);
  1001 + tcg_gen_add_i32(addr, REG(B7_4), REG(0));
  1002 + if (ctx->fpscr & FPSCR_SZ) {
  1003 + TCGv fp = tcg_temp_new(TCG_TYPE_I64);
  1004 + tcg_gen_qemu_ld64(fp, addr, ctx->memidx);
  1005 + gen_store_fpr64(fp, XREG(B11_8));
  1006 + tcg_temp_free(fp);
  1007 + } else {
  1008 + TCGv fp = tcg_temp_new(TCG_TYPE_I32);
  1009 + tcg_gen_qemu_ld32u(fp, addr, ctx->memidx);
  1010 + gen_store_fpr32(fp, FREG(B11_8));
  1011 + tcg_temp_free(fp);
  1012 + }
  1013 + tcg_temp_free(addr);
985 1014 }
986 1015 return;
987 1016 case 0xf007: /* fmov {F,D,X}Rn,@(R0,Rn) - FPSCR: Nothing */
988   - if (ctx->fpscr & FPSCR_SZ) {
989   - gen_op_fmov_drN_DT0(XREG(B7_4));
990   - tcg_gen_mov_i32(cpu_T[1], REG(B11_8));
991   - tcg_gen_add_i32(cpu_T[1], cpu_T[1], REG(0));
992   - gen_op_stfq_DT0_T1(ctx);
993   - } else {
994   - gen_op_fmov_frN_FT0(FREG(B7_4));
995   - tcg_gen_mov_i32(cpu_T[1], REG(B11_8));
996   - tcg_gen_add_i32(cpu_T[1], cpu_T[1], REG(0));
997   - gen_op_stfl_FT0_T1(ctx);
  1017 + {
  1018 + TCGv addr = tcg_temp_new(TCG_TYPE_I32);
  1019 + tcg_gen_add_i32(addr, REG(B11_8), REG(0));
  1020 + if (ctx->fpscr & FPSCR_SZ) {
  1021 + TCGv fp = tcg_temp_new(TCG_TYPE_I64);
  1022 + gen_load_fpr64(fp, XREG(B7_4));
  1023 + tcg_gen_qemu_st64(fp, addr, ctx->memidx);
  1024 + tcg_temp_free(fp);
  1025 + } else {
  1026 + TCGv fp = tcg_temp_new(TCG_TYPE_I32);
  1027 + gen_load_fpr32(fp, FREG(B7_4));
  1028 + tcg_gen_qemu_st32(fp, addr, ctx->memidx);
  1029 + tcg_temp_free(fp);
  1030 + }
  1031 + tcg_temp_free(addr);
998 1032 }
999 1033 return;
1000 1034 case 0xf000: /* fadd Rm,Rn - FPSCR: R[PR,Enable.O/U/I]/W[Cause,Flag] */
... ... @@ -1003,43 +1037,71 @@ void _decode_opc(DisasContext * ctx)
1003 1037 case 0xf003: /* fdiv Rm,Rn - FPSCR: R[PR,Enable.O/U/I]/W[Cause,Flag] */
1004 1038 case 0xf004: /* fcmp/eq Rm,Rn - FPSCR: R[PR,Enable.V]/W[Cause,Flag] */
1005 1039 case 0xf005: /* fcmp/gt Rm,Rn - FPSCR: R[PR,Enable.V]/W[Cause,Flag] */
1006   - if (ctx->fpscr & FPSCR_PR) {
1007   - if (ctx->opcode & 0x0110)
1008   - break; /* illegal instruction */
1009   - gen_op_fmov_drN_DT1(DREG(B7_4));
1010   - gen_op_fmov_drN_DT0(DREG(B11_8));
1011   - }
1012   - else {
1013   - gen_op_fmov_frN_FT1(FREG(B7_4));
1014   - gen_op_fmov_frN_FT0(FREG(B11_8));
1015   - }
  1040 + {
  1041 + TCGv fp0, fp1;
  1042 +
  1043 + if (ctx->fpscr & FPSCR_PR) {
  1044 + if (ctx->opcode & 0x0110)
  1045 + break; /* illegal instruction */
  1046 + fp0 = tcg_temp_new(TCG_TYPE_I64);
  1047 + fp1 = tcg_temp_new(TCG_TYPE_I64);
  1048 + gen_load_fpr64(fp0, DREG(B11_8));
  1049 + gen_load_fpr64(fp1, DREG(B7_4));
  1050 + }
  1051 + else {
  1052 + fp0 = tcg_temp_new(TCG_TYPE_I32);
  1053 + fp1 = tcg_temp_new(TCG_TYPE_I32);
  1054 + gen_load_fpr32(fp0, FREG(B11_8));
  1055 + gen_load_fpr32(fp1, FREG(B7_4));
  1056 + }
1016 1057  
1017   - switch (ctx->opcode & 0xf00f) {
1018   - case 0xf000: /* fadd Rm,Rn */
1019   - ctx->fpscr & FPSCR_PR ? gen_op_fadd_DT() : gen_op_fadd_FT();
1020   - break;
1021   - case 0xf001: /* fsub Rm,Rn */
1022   - ctx->fpscr & FPSCR_PR ? gen_op_fsub_DT() : gen_op_fsub_FT();
1023   - break;
1024   - case 0xf002: /* fmul Rm,Rn */
1025   - ctx->fpscr & FPSCR_PR ? gen_op_fmul_DT() : gen_op_fmul_FT();
1026   - break;
1027   - case 0xf003: /* fdiv Rm,Rn */
1028   - ctx->fpscr & FPSCR_PR ? gen_op_fdiv_DT() : gen_op_fdiv_FT();
1029   - break;
1030   - case 0xf004: /* fcmp/eq Rm,Rn */
1031   - ctx->fpscr & FPSCR_PR ? gen_op_fcmp_eq_DT() : gen_op_fcmp_eq_FT();
1032   - return;
1033   - case 0xf005: /* fcmp/gt Rm,Rn */
1034   - ctx->fpscr & FPSCR_PR ? gen_op_fcmp_gt_DT() : gen_op_fcmp_gt_FT();
1035   - return;
1036   - }
  1058 + switch (ctx->opcode & 0xf00f) {
  1059 + case 0xf000: /* fadd Rm,Rn */
  1060 + if (ctx->fpscr & FPSCR_PR)
  1061 + tcg_gen_helper_1_2(helper_fadd_DT, fp0, fp0, fp1);
  1062 + else
  1063 + tcg_gen_helper_1_2(helper_fadd_FT, fp0, fp0, fp1);
  1064 + break;
  1065 + case 0xf001: /* fsub Rm,Rn */
  1066 + if (ctx->fpscr & FPSCR_PR)
  1067 + tcg_gen_helper_1_2(helper_fsub_DT, fp0, fp0, fp1);
  1068 + else
  1069 + tcg_gen_helper_1_2(helper_fsub_FT, fp0, fp0, fp1);
  1070 + break;
  1071 + case 0xf002: /* fmul Rm,Rn */
  1072 + if (ctx->fpscr & FPSCR_PR)
  1073 + tcg_gen_helper_1_2(helper_fmul_DT, fp0, fp0, fp1);
  1074 + else
  1075 + tcg_gen_helper_1_2(helper_fmul_FT, fp0, fp0, fp1);
  1076 + break;
  1077 + case 0xf003: /* fdiv Rm,Rn */
  1078 + if (ctx->fpscr & FPSCR_PR)
  1079 + tcg_gen_helper_1_2(helper_fdiv_DT, fp0, fp0, fp1);
  1080 + else
  1081 + tcg_gen_helper_1_2(helper_fdiv_FT, fp0, fp0, fp1);
  1082 + break;
  1083 + case 0xf004: /* fcmp/eq Rm,Rn */
  1084 + if (ctx->fpscr & FPSCR_PR)
  1085 + tcg_gen_helper_0_2(helper_fcmp_eq_DT, fp0, fp1);
  1086 + else
  1087 + tcg_gen_helper_0_2(helper_fcmp_eq_FT, fp0, fp1);
  1088 + return;
  1089 + case 0xf005: /* fcmp/gt Rm,Rn */
  1090 + if (ctx->fpscr & FPSCR_PR)
  1091 + tcg_gen_helper_0_2(helper_fcmp_gt_DT, fp0, fp1);
  1092 + else
  1093 + tcg_gen_helper_0_2(helper_fcmp_gt_FT, fp0, fp1);
  1094 + return;
  1095 + }
1037 1096  
1038   - if (ctx->fpscr & FPSCR_PR) {
1039   - gen_op_fmov_DT0_drN(DREG(B11_8));
1040   - }
1041   - else {
1042   - gen_op_fmov_FT0_frN(FREG(B11_8));
  1097 + if (ctx->fpscr & FPSCR_PR) {
  1098 + gen_store_fpr64(fp0, DREG(B11_8));
  1099 + }
  1100 + else {
  1101 + gen_store_fpr32(fp0, FREG(B11_8));
  1102 + }
  1103 + tcg_temp_free(fp1);
  1104 + tcg_temp_free(fp0);
1043 1105 }
1044 1106 return;
1045 1107 }
... ... @@ -1481,35 +1543,53 @@ void _decode_opc(DisasContext * ctx)
1481 1543 }
1482 1544 return;
1483 1545 case 0xf00d: /* fsts FPUL,FRn - FPSCR: Nothing */
1484   - gen_op_movl_fpul_FT0();
1485   - gen_op_fmov_FT0_frN(FREG(B11_8));
  1546 + {
  1547 + TCGv fp = tcg_temp_new(TCG_TYPE_I32);
  1548 + tcg_gen_mov_i32(fp, cpu_fpul);
  1549 + gen_store_fpr32(fp, FREG(B11_8));
  1550 + tcg_temp_free(fp);
  1551 + }
1486 1552 return;
1487 1553 case 0xf01d: /* flds FRm,FPUL - FPSCR: Nothing */
1488   - gen_op_fmov_frN_FT0(FREG(B11_8));
1489   - gen_op_movl_FT0_fpul();
  1554 + {
  1555 + TCGv fp = tcg_temp_new(TCG_TYPE_I32);
  1556 + gen_load_fpr32(fp, FREG(B11_8));
  1557 + tcg_gen_mov_i32(cpu_fpul, fp);
  1558 + tcg_temp_free(fp);
  1559 + }
1490 1560 return;
1491 1561 case 0xf02d: /* float FPUL,FRn/DRn - FPSCR: R[PR,Enable.I]/W[Cause,Flag] */
1492 1562 if (ctx->fpscr & FPSCR_PR) {
  1563 + TCGv fp;
1493 1564 if (ctx->opcode & 0x0100)
1494 1565 break; /* illegal instruction */
1495   - gen_op_float_DT();
1496   - gen_op_fmov_DT0_drN(DREG(B11_8));
  1566 + fp = tcg_temp_new(TCG_TYPE_I64);
  1567 + tcg_gen_helper_1_1(helper_float_DT, fp, cpu_fpul);
  1568 + gen_store_fpr64(fp, DREG(B11_8));
  1569 + tcg_temp_free(fp);
1497 1570 }
1498 1571 else {
1499   - gen_op_float_FT();
1500   - gen_op_fmov_FT0_frN(FREG(B11_8));
  1572 + TCGv fp = tcg_temp_new(TCG_TYPE_I32);
  1573 + tcg_gen_helper_1_1(helper_float_FT, fp, cpu_fpul);
  1574 + gen_store_fpr32(fp, FREG(B11_8));
  1575 + tcg_temp_free(fp);
1501 1576 }
1502 1577 return;
1503 1578 case 0xf03d: /* ftrc FRm/DRm,FPUL - FPSCR: R[PR,Enable.V]/W[Cause,Flag] */
1504 1579 if (ctx->fpscr & FPSCR_PR) {
  1580 + TCGv fp;
1505 1581 if (ctx->opcode & 0x0100)
1506 1582 break; /* illegal instruction */
1507   - gen_op_fmov_drN_DT0(DREG(B11_8));
1508   - gen_op_ftrc_DT();
  1583 + fp = tcg_temp_new(TCG_TYPE_I64);
  1584 + gen_load_fpr64(fp, DREG(B11_8));
  1585 + tcg_gen_helper_1_1(helper_ftrc_DT, cpu_fpul, fp);
  1586 + tcg_temp_free(fp);
1509 1587 }
1510 1588 else {
1511   - gen_op_fmov_frN_FT0(FREG(B11_8));
1512   - gen_op_ftrc_FT();
  1589 + TCGv fp = tcg_temp_new(TCG_TYPE_I32);
  1590 + gen_load_fpr32(fp, FREG(B11_8));
  1591 + tcg_gen_helper_1_1(helper_ftrc_FT, cpu_fpul, fp);
  1592 + tcg_temp_free(fp);
1513 1593 }
1514 1594 return;
1515 1595 case 0xf04d: /* fneg FRn/DRn - FPSCR: Nothing */
... ... @@ -1519,53 +1599,69 @@ void _decode_opc(DisasContext * ctx)
1519 1599 if (ctx->fpscr & FPSCR_PR) {
1520 1600 if (ctx->opcode & 0x0100)
1521 1601 break; /* illegal instruction */
1522   - gen_op_fmov_drN_DT0(DREG(B11_8));
1523   - gen_op_fabs_DT();
1524   - gen_op_fmov_DT0_drN(DREG(B11_8));
  1602 + TCGv fp = tcg_temp_new(TCG_TYPE_I64);
  1603 + gen_load_fpr64(fp, DREG(B11_8));
  1604 + tcg_gen_helper_1_1(helper_fabs_DT, fp, fp);
  1605 + gen_store_fpr64(fp, DREG(B11_8));
  1606 + tcg_temp_free(fp);
1525 1607 } else {
1526   - gen_op_fmov_frN_FT0(FREG(B11_8));
1527   - gen_op_fabs_FT();
1528   - gen_op_fmov_FT0_frN(FREG(B11_8));
  1608 + TCGv fp = tcg_temp_new(TCG_TYPE_I32);
  1609 + gen_load_fpr32(fp, FREG(B11_8));
  1610 + tcg_gen_helper_1_1(helper_fabs_FT, fp, fp);
  1611 + gen_store_fpr32(fp, FREG(B11_8));
  1612 + tcg_temp_free(fp);
1529 1613 }
1530 1614 return;
1531 1615 case 0xf06d: /* fsqrt FRn */
1532 1616 if (ctx->fpscr & FPSCR_PR) {
1533 1617 if (ctx->opcode & 0x0100)
1534 1618 break; /* illegal instruction */
1535   - gen_op_fmov_drN_DT0(FREG(B11_8));
1536   - gen_op_fsqrt_DT();
1537   - gen_op_fmov_DT0_drN(FREG(B11_8));
  1619 + TCGv fp = tcg_temp_new(TCG_TYPE_I64);
  1620 + gen_load_fpr64(fp, DREG(B11_8));
  1621 + tcg_gen_helper_1_1(helper_fsqrt_DT, fp, fp);
  1622 + gen_store_fpr64(fp, DREG(B11_8));
  1623 + tcg_temp_free(fp);
1538 1624 } else {
1539   - gen_op_fmov_frN_FT0(FREG(B11_8));
1540   - gen_op_fsqrt_FT();
1541   - gen_op_fmov_FT0_frN(FREG(B11_8));
  1625 + TCGv fp = tcg_temp_new(TCG_TYPE_I32);
  1626 + gen_load_fpr32(fp, FREG(B11_8));
  1627 + tcg_gen_helper_1_1(helper_fsqrt_FT, fp, fp);
  1628 + gen_store_fpr32(fp, FREG(B11_8));
  1629 + tcg_temp_free(fp);
1542 1630 }
1543 1631 return;
1544 1632 case 0xf07d: /* fsrra FRn */
1545 1633 break;
1546 1634 case 0xf08d: /* fldi0 FRn - FPSCR: R[PR] */
1547 1635 if (!(ctx->fpscr & FPSCR_PR)) {
1548   - tcg_gen_movi_i32(cpu_T[0], 0);
1549   - gen_op_fmov_T0_frN(FREG(B11_8));
  1636 + TCGv val = tcg_const_i32(0);
  1637 + gen_load_fpr32(val, FREG(B11_8));
  1638 + tcg_temp_free(val);
1550 1639 return;
1551 1640 }
1552 1641 break;
1553 1642 case 0xf09d: /* fldi1 FRn - FPSCR: R[PR] */
1554 1643 if (!(ctx->fpscr & FPSCR_PR)) {
1555   - tcg_gen_movi_i32(cpu_T[0], 0x3f800000);
1556   - gen_op_fmov_T0_frN(FREG(B11_8));
  1644 + TCGv val = tcg_const_i32(0x3f800000);
  1645 + gen_load_fpr32(val, FREG(B11_8));
  1646 + tcg_temp_free(val);
1557 1647 return;
1558 1648 }
1559 1649 break;
1560 1650 case 0xf0ad: /* fcnvsd FPUL,DRn */
1561   - gen_op_movl_fpul_FT0();
1562   - gen_op_fcnvsd_FT_DT();
1563   - gen_op_fmov_DT0_drN(DREG(B11_8));
  1651 + {
  1652 + TCGv fp = tcg_temp_new(TCG_TYPE_I64);
  1653 + tcg_gen_helper_1_1(helper_fcnvsd_FT_DT, fp, cpu_fpul);
  1654 + gen_store_fpr64(fp, DREG(B11_8));
  1655 + tcg_temp_free(fp);
  1656 + }
1564 1657 return;
1565 1658 case 0xf0bd: /* fcnvds DRn,FPUL */
1566   - gen_op_fmov_drN_DT0(DREG(B11_8));
1567   - gen_op_fcnvds_DT_FT();
1568   - gen_op_movl_FT0_fpul();
  1659 + {
  1660 + TCGv fp = tcg_temp_new(TCG_TYPE_I64);
  1661 + gen_load_fpr64(fp, DREG(B11_8));
  1662 + tcg_gen_helper_1_1(helper_fcnvds_DT_FT, cpu_fpul, fp);
  1663 + tcg_temp_free(fp);
  1664 + }
1569 1665 return;
1570 1666 }
1571 1667  
... ...