Commit d84763bc1771583e1731c6a351daa157e2d02125
1 parent
c5d04e99
Convert rest of ops using float32 to TCG, remove FT0 and FT1
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5193 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
5 changed files
with
39 additions
and
64 deletions
target-sparc/cpu.h
target-sparc/exec.h
target-sparc/helper.h
| ... | ... | @@ -93,10 +93,6 @@ DEF_HELPER(void, helper_fcmpeq_fcc3, (void)) |
| 93 | 93 | #endif |
| 94 | 94 | DEF_HELPER(void, raise_exception, (int tt)) |
| 95 | 95 | #define F_HELPER_0_0(name) DEF_HELPER(void, helper_f ## name, (void)) |
| 96 | -#define F_HELPER_SDQ_0_0(name) \ | |
| 97 | - F_HELPER_0_0(name ## s); \ | |
| 98 | - F_HELPER_0_0(name ## d); \ | |
| 99 | - F_HELPER_0_0(name ## q) | |
| 100 | 96 | #define F_HELPER_DQ_0_0(name) \ |
| 101 | 97 | F_HELPER_0_0(name ## d); \ |
| 102 | 98 | F_HELPER_0_0(name ## q) |
| ... | ... | @@ -111,11 +107,11 @@ DEF_HELPER(float32, helper_fsubs, (float32 src1, float32 src2)) |
| 111 | 107 | DEF_HELPER(float32, helper_fmuls, (float32 src1, float32 src2)) |
| 112 | 108 | DEF_HELPER(float32, helper_fdivs, (float32 src1, float32 src2)) |
| 113 | 109 | |
| 114 | -F_HELPER_0_0(smuld); | |
| 110 | +DEF_HELPER(void, helper_fsmuld, (float32 src1, float32 src2)) | |
| 115 | 111 | F_HELPER_0_0(dmulq); |
| 116 | 112 | |
| 117 | 113 | DEF_HELPER(float32, helper_fnegs, (float32 src)) |
| 118 | -F_HELPER_0_0(itod); | |
| 114 | +DEF_HELPER(void, helper_fitod, (int32_t src)) | |
| 119 | 115 | DEF_HELPER(void, helper_fitoq, (int32_t src)) |
| 120 | 116 | |
| 121 | 117 | DEF_HELPER(float32, helper_fitos, (int32_t src)) |
| ... | ... | @@ -123,19 +119,20 @@ DEF_HELPER(float32, helper_fitos, (int32_t src)) |
| 123 | 119 | #ifdef TARGET_SPARC64 |
| 124 | 120 | DEF_HELPER(void, helper_fnegd, (void)) |
| 125 | 121 | DEF_HELPER(void, helper_fnegq, (void)) |
| 126 | -F_HELPER_SDQ_0_0(xto); | |
| 122 | +DEF_HELPER(uint32_t, helper_fxtos, (void)) | |
| 123 | +F_HELPER_DQ_0_0(xto); | |
| 127 | 124 | #endif |
| 128 | -F_HELPER_0_0(dtos); | |
| 129 | -F_HELPER_0_0(stod); | |
| 125 | +DEF_HELPER(float32, helper_fdtos, (void)) | |
| 126 | +DEF_HELPER(void, helper_fstod, (float32 src)) | |
| 130 | 127 | DEF_HELPER(float32, helper_fqtos, (void)) |
| 131 | 128 | DEF_HELPER(void, helper_fstoq, (float32 src)) |
| 132 | 129 | F_HELPER_0_0(qtod); |
| 133 | 130 | F_HELPER_0_0(dtoq); |
| 134 | 131 | DEF_HELPER(int32_t, helper_fstoi, (float32 src)) |
| 135 | -F_HELPER_0_0(dtoi); | |
| 132 | +DEF_HELPER(int32_t, helper_fdtoi, (void)) | |
| 136 | 133 | DEF_HELPER(int32_t, helper_fqtoi, (void)) |
| 137 | 134 | #ifdef TARGET_SPARC64 |
| 138 | -F_HELPER_0_0(stox); | |
| 135 | +DEF_HELPER(void, helper_fstox, (uint32_t src)) | |
| 139 | 136 | F_HELPER_0_0(dtox); |
| 140 | 137 | F_HELPER_0_0(qtox); |
| 141 | 138 | F_HELPER_0_0(aligndata); | ... | ... |
target-sparc/op_helper.c
| ... | ... | @@ -106,10 +106,10 @@ F_BINOP(mul); |
| 106 | 106 | F_BINOP(div); |
| 107 | 107 | #undef F_BINOP |
| 108 | 108 | |
| 109 | -void helper_fsmuld(void) | |
| 109 | +void helper_fsmuld(float32 src1, float32 src2) | |
| 110 | 110 | { |
| 111 | - DT0 = float64_mul(float32_to_float64(FT0, &env->fp_status), | |
| 112 | - float32_to_float64(FT1, &env->fp_status), | |
| 111 | + DT0 = float64_mul(float32_to_float64(src1, &env->fp_status), | |
| 112 | + float32_to_float64(src2, &env->fp_status), | |
| 113 | 113 | &env->fp_status); |
| 114 | 114 | } |
| 115 | 115 | |
| ... | ... | @@ -143,9 +143,9 @@ float32 helper_fitos(int32_t src) |
| 143 | 143 | return int32_to_float32(src, &env->fp_status); |
| 144 | 144 | } |
| 145 | 145 | |
| 146 | -F_HELPER(ito, d) | |
| 146 | +void helper_fitod(int32_t src) | |
| 147 | 147 | { |
| 148 | - DT0 = int32_to_float64(*((int32_t *)&FT1), &env->fp_status); | |
| 148 | + DT0 = int32_to_float64(src, &env->fp_status); | |
| 149 | 149 | } |
| 150 | 150 | |
| 151 | 151 | void helper_fitoq(int32_t src) |
| ... | ... | @@ -154,9 +154,9 @@ void helper_fitoq(int32_t src) |
| 154 | 154 | } |
| 155 | 155 | |
| 156 | 156 | #ifdef TARGET_SPARC64 |
| 157 | -F_HELPER(xto, s) | |
| 157 | +float32 helper_fxtos(void) | |
| 158 | 158 | { |
| 159 | - FT0 = int64_to_float32(*((int64_t *)&DT1), &env->fp_status); | |
| 159 | + return int64_to_float32(*((int64_t *)&DT1), &env->fp_status); | |
| 160 | 160 | } |
| 161 | 161 | |
| 162 | 162 | F_HELPER(xto, d) |
| ... | ... | @@ -172,14 +172,14 @@ F_HELPER(xto, q) |
| 172 | 172 | #undef F_HELPER |
| 173 | 173 | |
| 174 | 174 | /* floating point conversion */ |
| 175 | -void helper_fdtos(void) | |
| 175 | +float32 helper_fdtos(void) | |
| 176 | 176 | { |
| 177 | - FT0 = float64_to_float32(DT1, &env->fp_status); | |
| 177 | + return float64_to_float32(DT1, &env->fp_status); | |
| 178 | 178 | } |
| 179 | 179 | |
| 180 | -void helper_fstod(void) | |
| 180 | +void helper_fstod(float32 src) | |
| 181 | 181 | { |
| 182 | - DT0 = float32_to_float64(FT1, &env->fp_status); | |
| 182 | + DT0 = float32_to_float64(src, &env->fp_status); | |
| 183 | 183 | } |
| 184 | 184 | |
| 185 | 185 | float32 helper_fqtos(void) |
| ... | ... | @@ -208,9 +208,9 @@ int32_t helper_fstoi(float32 src) |
| 208 | 208 | return float32_to_int32_round_to_zero(src, &env->fp_status); |
| 209 | 209 | } |
| 210 | 210 | |
| 211 | -void helper_fdtoi(void) | |
| 211 | +int32_t helper_fdtoi(void) | |
| 212 | 212 | { |
| 213 | - *((int32_t *)&FT0) = float64_to_int32_round_to_zero(DT1, &env->fp_status); | |
| 213 | + return float64_to_int32_round_to_zero(DT1, &env->fp_status); | |
| 214 | 214 | } |
| 215 | 215 | |
| 216 | 216 | int32_t helper_fqtoi(void) |
| ... | ... | @@ -219,9 +219,9 @@ int32_t helper_fqtoi(void) |
| 219 | 219 | } |
| 220 | 220 | |
| 221 | 221 | #ifdef TARGET_SPARC64 |
| 222 | -void helper_fstox(void) | |
| 222 | +void helper_fstox(float32 src) | |
| 223 | 223 | { |
| 224 | - *((int64_t *)&DT0) = float32_to_int64_round_to_zero(FT1, &env->fp_status); | |
| 224 | + *((int64_t *)&DT0) = float32_to_int64_round_to_zero(src, &env->fp_status); | |
| 225 | 225 | } |
| 226 | 226 | |
| 227 | 227 | void helper_fdtox(void) | ... | ... |
target-sparc/translate.c
| ... | ... | @@ -102,21 +102,6 @@ static int sign_extend(int x, int len) |
| 102 | 102 | #define IS_IMM (insn & (1<<13)) |
| 103 | 103 | |
| 104 | 104 | /* floating point registers moves */ |
| 105 | -static void gen_op_load_fpr_FT0(unsigned int src) | |
| 106 | -{ | |
| 107 | - tcg_gen_st_i32(cpu_fpr[src], cpu_env, offsetof(CPUSPARCState, ft0)); | |
| 108 | -} | |
| 109 | - | |
| 110 | -static void gen_op_load_fpr_FT1(unsigned int src) | |
| 111 | -{ | |
| 112 | - tcg_gen_st_i32(cpu_fpr[src], cpu_env, offsetof(CPUSPARCState, ft1)); | |
| 113 | -} | |
| 114 | - | |
| 115 | -static void gen_op_store_FT0_fpr(unsigned int dst) | |
| 116 | -{ | |
| 117 | - tcg_gen_ld_i32(cpu_fpr[dst], cpu_env, offsetof(CPUSPARCState, ft0)); | |
| 118 | -} | |
| 119 | - | |
| 120 | 105 | static void gen_op_load_fpr_DT0(unsigned int src) |
| 121 | 106 | { |
| 122 | 107 | tcg_gen_st_i32(cpu_fpr[src], cpu_env, offsetof(CPUSPARCState, dt0) + |
| ... | ... | @@ -2475,12 +2460,11 @@ static void disas_sparc_insn(DisasContext * dc) |
| 2475 | 2460 | tcg_gen_helper_0_0(helper_check_ieee_exceptions); |
| 2476 | 2461 | gen_op_store_QT0_fpr(QFPREG(rd)); |
| 2477 | 2462 | break; |
| 2478 | - case 0x69: | |
| 2463 | + case 0x69: /* fsmuld */ | |
| 2479 | 2464 | CHECK_FPU_FEATURE(dc, FSMULD); |
| 2480 | - gen_op_load_fpr_FT0(rs1); | |
| 2481 | - gen_op_load_fpr_FT1(rs2); | |
| 2482 | 2465 | gen_clear_float_exceptions(); |
| 2483 | - tcg_gen_helper_0_0(helper_fsmuld); | |
| 2466 | + tcg_gen_helper_0_2(helper_fsmuld, cpu_fpr[rs1], | |
| 2467 | + cpu_fpr[rs2]); | |
| 2484 | 2468 | tcg_gen_helper_0_0(helper_check_ieee_exceptions); |
| 2485 | 2469 | gen_op_store_DT0_fpr(DFPREG(rd)); |
| 2486 | 2470 | break; |
| ... | ... | @@ -2500,12 +2484,12 @@ static void disas_sparc_insn(DisasContext * dc) |
| 2500 | 2484 | tcg_gen_helper_0_0(helper_check_ieee_exceptions); |
| 2501 | 2485 | tcg_gen_mov_i32(cpu_fpr[rd], cpu_tmp32); |
| 2502 | 2486 | break; |
| 2503 | - case 0xc6: | |
| 2487 | + case 0xc6: /* fdtos */ | |
| 2504 | 2488 | gen_op_load_fpr_DT1(DFPREG(rs2)); |
| 2505 | 2489 | gen_clear_float_exceptions(); |
| 2506 | - tcg_gen_helper_0_0(helper_fdtos); | |
| 2490 | + tcg_gen_helper_1_0(helper_fdtos, cpu_tmp32); | |
| 2507 | 2491 | tcg_gen_helper_0_0(helper_check_ieee_exceptions); |
| 2508 | - gen_op_store_FT0_fpr(rd); | |
| 2492 | + tcg_gen_mov_i32(cpu_fpr[rd], cpu_tmp32); | |
| 2509 | 2493 | break; |
| 2510 | 2494 | case 0xc7: /* fqtos */ |
| 2511 | 2495 | CHECK_FPU_FEATURE(dc, FLOAT128); |
| ... | ... | @@ -2515,14 +2499,12 @@ static void disas_sparc_insn(DisasContext * dc) |
| 2515 | 2499 | tcg_gen_helper_0_0(helper_check_ieee_exceptions); |
| 2516 | 2500 | tcg_gen_mov_i32(cpu_fpr[rd], cpu_tmp32); |
| 2517 | 2501 | break; |
| 2518 | - case 0xc8: | |
| 2519 | - gen_op_load_fpr_FT1(rs2); | |
| 2520 | - tcg_gen_helper_0_0(helper_fitod); | |
| 2502 | + case 0xc8: /* fitod */ | |
| 2503 | + tcg_gen_helper_0_1(helper_fitod, cpu_fpr[rs2]); | |
| 2521 | 2504 | gen_op_store_DT0_fpr(DFPREG(rd)); |
| 2522 | 2505 | break; |
| 2523 | - case 0xc9: | |
| 2524 | - gen_op_load_fpr_FT1(rs2); | |
| 2525 | - tcg_gen_helper_0_0(helper_fstod); | |
| 2506 | + case 0xc9: /* fstod */ | |
| 2507 | + tcg_gen_helper_0_1(helper_fstod, cpu_fpr[rs2]); | |
| 2526 | 2508 | gen_op_store_DT0_fpr(DFPREG(rd)); |
| 2527 | 2509 | break; |
| 2528 | 2510 | case 0xcb: /* fqtod */ |
| ... | ... | @@ -2556,12 +2538,12 @@ static void disas_sparc_insn(DisasContext * dc) |
| 2556 | 2538 | tcg_gen_helper_0_0(helper_check_ieee_exceptions); |
| 2557 | 2539 | tcg_gen_mov_i32(cpu_fpr[rd], cpu_tmp32); |
| 2558 | 2540 | break; |
| 2559 | - case 0xd2: | |
| 2541 | + case 0xd2: /* fdtoi */ | |
| 2560 | 2542 | gen_op_load_fpr_DT1(DFPREG(rs2)); |
| 2561 | 2543 | gen_clear_float_exceptions(); |
| 2562 | - tcg_gen_helper_0_0(helper_fdtoi); | |
| 2544 | + tcg_gen_helper_1_0(helper_fdtoi, cpu_tmp32); | |
| 2563 | 2545 | tcg_gen_helper_0_0(helper_check_ieee_exceptions); |
| 2564 | - gen_op_store_FT0_fpr(rd); | |
| 2546 | + tcg_gen_mov_i32(cpu_fpr[rd], cpu_tmp32); | |
| 2565 | 2547 | break; |
| 2566 | 2548 | case 0xd3: /* fqtoi */ |
| 2567 | 2549 | CHECK_FPU_FEATURE(dc, FLOAT128); |
| ... | ... | @@ -2612,9 +2594,8 @@ static void disas_sparc_insn(DisasContext * dc) |
| 2612 | 2594 | gen_op_store_QT0_fpr(QFPREG(rd)); |
| 2613 | 2595 | break; |
| 2614 | 2596 | case 0x81: /* V9 fstox */ |
| 2615 | - gen_op_load_fpr_FT1(rs2); | |
| 2616 | 2597 | gen_clear_float_exceptions(); |
| 2617 | - tcg_gen_helper_0_0(helper_fstox); | |
| 2598 | + tcg_gen_helper_0_1(helper_fstox, cpu_fpr[rs2]); | |
| 2618 | 2599 | tcg_gen_helper_0_0(helper_check_ieee_exceptions); |
| 2619 | 2600 | gen_op_store_DT0_fpr(DFPREG(rd)); |
| 2620 | 2601 | break; |
| ... | ... | @@ -2636,9 +2617,9 @@ static void disas_sparc_insn(DisasContext * dc) |
| 2636 | 2617 | case 0x84: /* V9 fxtos */ |
| 2637 | 2618 | gen_op_load_fpr_DT1(DFPREG(rs2)); |
| 2638 | 2619 | gen_clear_float_exceptions(); |
| 2639 | - tcg_gen_helper_0_0(helper_fxtos); | |
| 2620 | + tcg_gen_helper_1_0(helper_fxtos, cpu_tmp32); | |
| 2640 | 2621 | tcg_gen_helper_0_0(helper_check_ieee_exceptions); |
| 2641 | - gen_op_store_FT0_fpr(rd); | |
| 2622 | + tcg_gen_mov_i32(cpu_fpr[rd], cpu_tmp32); | |
| 2642 | 2623 | break; |
| 2643 | 2624 | case 0x88: /* V9 fxtod */ |
| 2644 | 2625 | gen_op_load_fpr_DT1(DFPREG(rs2)); | ... | ... |