Commit 2ca1d92b0785b65c48b415ee9074f3674432edde
1 parent
d4b0d468
Convert subx
Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
Showing
2 changed files
with
50 additions
and
31 deletions
target-sparc/op_helper.c
... | ... | @@ -972,6 +972,48 @@ static uint32_t compute_C_sub_xcc(void) |
972 | 972 | } |
973 | 973 | #endif |
974 | 974 | |
975 | +static uint32_t compute_all_subx(void) | |
976 | +{ | |
977 | + uint32_t ret; | |
978 | + | |
979 | + ret = get_NZ_icc(CC_DST); | |
980 | + ret |= get_C_sub_icc(CC_DST - CC_SRC2, CC_SRC); | |
981 | + ret |= get_C_sub_icc(CC_DST, CC_SRC2); | |
982 | + ret |= get_V_sub_icc(CC_DST, CC_SRC, CC_SRC2); | |
983 | + return ret; | |
984 | +} | |
985 | + | |
986 | +static uint32_t compute_C_subx(void) | |
987 | +{ | |
988 | + uint32_t ret; | |
989 | + | |
990 | + ret = get_C_sub_icc(CC_DST - CC_SRC2, CC_SRC); | |
991 | + ret |= get_C_sub_icc(CC_DST, CC_SRC2); | |
992 | + return ret; | |
993 | +} | |
994 | + | |
995 | +#ifdef TARGET_SPARC64 | |
996 | +static uint32_t compute_all_subx_xcc(void) | |
997 | +{ | |
998 | + uint32_t ret; | |
999 | + | |
1000 | + ret = get_NZ_xcc(CC_DST); | |
1001 | + ret |= get_C_sub_xcc(CC_DST - CC_SRC2, CC_SRC); | |
1002 | + ret |= get_C_sub_xcc(CC_DST, CC_SRC2); | |
1003 | + ret |= get_V_sub_xcc(CC_DST, CC_SRC, CC_SRC2); | |
1004 | + return ret; | |
1005 | +} | |
1006 | + | |
1007 | +static uint32_t compute_C_subx_xcc(void) | |
1008 | +{ | |
1009 | + uint32_t ret; | |
1010 | + | |
1011 | + ret = get_C_sub_xcc(CC_DST - CC_SRC2, CC_SRC); | |
1012 | + ret |= get_C_sub_xcc(CC_DST, CC_SRC2); | |
1013 | + return ret; | |
1014 | +} | |
1015 | +#endif | |
1016 | + | |
975 | 1017 | static uint32_t compute_all_logic(void) |
976 | 1018 | { |
977 | 1019 | return get_NZ_icc(CC_DST); |
... | ... | @@ -1000,6 +1042,7 @@ static const CCTable icc_table[CC_OP_NB] = { |
1000 | 1042 | [CC_OP_ADD] = { compute_all_add, compute_C_add }, |
1001 | 1043 | [CC_OP_ADDX] = { compute_all_addx, compute_C_addx }, |
1002 | 1044 | [CC_OP_SUB] = { compute_all_sub, compute_C_sub }, |
1045 | + [CC_OP_SUBX] = { compute_all_subx, compute_C_subx }, | |
1003 | 1046 | [CC_OP_LOGIC] = { compute_all_logic, compute_C_logic }, |
1004 | 1047 | }; |
1005 | 1048 | |
... | ... | @@ -1010,6 +1053,7 @@ static const CCTable xcc_table[CC_OP_NB] = { |
1010 | 1053 | [CC_OP_ADD] = { compute_all_add_xcc, compute_C_add_xcc }, |
1011 | 1054 | [CC_OP_ADDX] = { compute_all_addx_xcc, compute_C_addx_xcc }, |
1012 | 1055 | [CC_OP_SUB] = { compute_all_sub_xcc, compute_C_sub_xcc }, |
1056 | + [CC_OP_SUBX] = { compute_all_subx_xcc, compute_C_subx_xcc }, | |
1013 | 1057 | [CC_OP_LOGIC] = { compute_all_logic_xcc, compute_C_logic }, |
1014 | 1058 | }; |
1015 | 1059 | #endif | ... | ... |
target-sparc/translate.c
... | ... | @@ -635,33 +635,14 @@ static inline void gen_op_sub_cc(TCGv dst, TCGv src1, TCGv src2) |
635 | 635 | tcg_gen_mov_tl(dst, cpu_cc_dst); |
636 | 636 | } |
637 | 637 | |
638 | -static inline void gen_op_subx_cc2(TCGv dst) | |
639 | -{ | |
640 | - gen_cc_NZ_icc(cpu_cc_dst); | |
641 | - gen_cc_C_sub_icc(cpu_cc_dst, cpu_cc_src); | |
642 | - gen_cc_V_sub_icc(cpu_cc_dst, cpu_cc_src, cpu_cc_src2); | |
643 | -#ifdef TARGET_SPARC64 | |
644 | - gen_cc_NZ_xcc(cpu_cc_dst); | |
645 | - gen_cc_C_sub_xcc(cpu_cc_dst, cpu_cc_src); | |
646 | - gen_cc_V_sub_xcc(cpu_cc_dst, cpu_cc_src, cpu_cc_src2); | |
647 | -#endif | |
648 | - tcg_gen_mov_tl(dst, cpu_cc_dst); | |
649 | -} | |
650 | - | |
651 | 638 | static inline void gen_op_subxi_cc(TCGv dst, TCGv src1, target_long src2) |
652 | 639 | { |
653 | 640 | tcg_gen_mov_tl(cpu_cc_src, src1); |
654 | 641 | tcg_gen_movi_tl(cpu_cc_src2, src2); |
655 | 642 | gen_mov_reg_C(cpu_tmp0, cpu_psr); |
656 | 643 | tcg_gen_sub_tl(cpu_cc_dst, cpu_cc_src, cpu_tmp0); |
657 | - gen_cc_clear_icc(); | |
658 | - gen_cc_C_sub_icc(cpu_cc_dst, cpu_cc_src); | |
659 | -#ifdef TARGET_SPARC64 | |
660 | - gen_cc_clear_xcc(); | |
661 | - gen_cc_C_sub_xcc(cpu_cc_dst, cpu_cc_src); | |
662 | -#endif | |
663 | 644 | tcg_gen_subi_tl(cpu_cc_dst, cpu_cc_dst, src2); |
664 | - gen_op_subx_cc2(dst); | |
645 | + tcg_gen_mov_tl(dst, cpu_cc_dst); | |
665 | 646 | } |
666 | 647 | |
667 | 648 | static inline void gen_op_subx_cc(TCGv dst, TCGv src1, TCGv src2) |
... | ... | @@ -670,14 +651,8 @@ static inline void gen_op_subx_cc(TCGv dst, TCGv src1, TCGv src2) |
670 | 651 | tcg_gen_mov_tl(cpu_cc_src2, src2); |
671 | 652 | gen_mov_reg_C(cpu_tmp0, cpu_psr); |
672 | 653 | tcg_gen_sub_tl(cpu_cc_dst, cpu_cc_src, cpu_tmp0); |
673 | - gen_cc_clear_icc(); | |
674 | - gen_cc_C_sub_icc(cpu_cc_dst, cpu_cc_src); | |
675 | -#ifdef TARGET_SPARC64 | |
676 | - gen_cc_clear_xcc(); | |
677 | - gen_cc_C_sub_xcc(cpu_cc_dst, cpu_cc_src); | |
678 | -#endif | |
679 | 654 | tcg_gen_sub_tl(cpu_cc_dst, cpu_cc_dst, cpu_cc_src2); |
680 | - gen_op_subx_cc2(dst); | |
655 | + tcg_gen_mov_tl(dst, cpu_cc_dst); | |
681 | 656 | } |
682 | 657 | |
683 | 658 | static inline void gen_op_tsub_cc(TCGv dst, TCGv src1, TCGv src2) |
... | ... | @@ -3263,8 +3238,8 @@ static void disas_sparc_insn(DisasContext * dc) |
3263 | 3238 | if (xop & 0x10) { |
3264 | 3239 | gen_helper_compute_psr(); |
3265 | 3240 | gen_op_subxi_cc(cpu_dst, cpu_src1, simm); |
3266 | - tcg_gen_movi_i32(cpu_cc_op, CC_OP_FLAGS); | |
3267 | - dc->cc_op = CC_OP_FLAGS; | |
3241 | + tcg_gen_movi_i32(cpu_cc_op, CC_OP_SUBX); | |
3242 | + dc->cc_op = CC_OP_SUBX; | |
3268 | 3243 | } else { |
3269 | 3244 | gen_helper_compute_psr(); |
3270 | 3245 | gen_mov_reg_C(cpu_tmp0, cpu_psr); |
... | ... | @@ -3275,8 +3250,8 @@ static void disas_sparc_insn(DisasContext * dc) |
3275 | 3250 | if (xop & 0x10) { |
3276 | 3251 | gen_helper_compute_psr(); |
3277 | 3252 | gen_op_subx_cc(cpu_dst, cpu_src1, cpu_src2); |
3278 | - tcg_gen_movi_i32(cpu_cc_op, CC_OP_FLAGS); | |
3279 | - dc->cc_op = CC_OP_FLAGS; | |
3253 | + tcg_gen_movi_i32(cpu_cc_op, CC_OP_SUBX); | |
3254 | + dc->cc_op = CC_OP_SUBX; | |
3280 | 3255 | } else { |
3281 | 3256 | gen_helper_compute_psr(); |
3282 | 3257 | gen_mov_reg_C(cpu_tmp0, cpu_psr); | ... | ... |