Commit d4b0d46898ec67e733b64b14d623550d1e7f6b9d
1 parent
38482a77
Convert sub
Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
Showing
2 changed files
with
83 additions
and
37 deletions
target-sparc/op_helper.c
@@ -902,6 +902,76 @@ static uint32_t compute_C_addx_xcc(void) | @@ -902,6 +902,76 @@ static uint32_t compute_C_addx_xcc(void) | ||
902 | } | 902 | } |
903 | #endif | 903 | #endif |
904 | 904 | ||
905 | +static inline uint32_t get_C_sub_icc(target_ulong src1, target_ulong src2) | ||
906 | +{ | ||
907 | + uint32_t ret = 0; | ||
908 | + | ||
909 | + if ((src1 & 0xffffffffULL) < (src2 & 0xffffffffULL)) | ||
910 | + ret |= PSR_CARRY; | ||
911 | + return ret; | ||
912 | +} | ||
913 | + | ||
914 | +static inline uint32_t get_V_sub_icc(target_ulong dst, target_ulong src1, | ||
915 | + target_ulong src2) | ||
916 | +{ | ||
917 | + uint32_t ret = 0; | ||
918 | + | ||
919 | + if (((src1 ^ src2) & (src1 ^ dst)) & (1ULL << 31)) | ||
920 | + ret |= PSR_OVF; | ||
921 | + return ret; | ||
922 | +} | ||
923 | + | ||
924 | +static uint32_t compute_all_sub(void) | ||
925 | +{ | ||
926 | + uint32_t ret; | ||
927 | + | ||
928 | + ret = get_NZ_icc(CC_DST); | ||
929 | + ret |= get_C_sub_icc(CC_SRC, CC_SRC2); | ||
930 | + ret |= get_V_sub_icc(CC_DST, CC_SRC, CC_SRC2); | ||
931 | + return ret; | ||
932 | +} | ||
933 | + | ||
934 | +static uint32_t compute_C_sub(void) | ||
935 | +{ | ||
936 | + return get_C_sub_icc(CC_SRC, CC_SRC2); | ||
937 | +} | ||
938 | + | ||
939 | +#ifdef TARGET_SPARC64 | ||
940 | +static inline uint32_t get_C_sub_xcc(target_ulong src1, target_ulong src2) | ||
941 | +{ | ||
942 | + uint32_t ret = 0; | ||
943 | + | ||
944 | + if (src1 < src2) | ||
945 | + ret |= PSR_CARRY; | ||
946 | + return ret; | ||
947 | +} | ||
948 | + | ||
949 | +static inline uint32_t get_V_sub_xcc(target_ulong dst, target_ulong src1, | ||
950 | + target_ulong src2) | ||
951 | +{ | ||
952 | + uint32_t ret = 0; | ||
953 | + | ||
954 | + if (((src1 ^ src2) & (src1 ^ dst)) & (1ULL << 63)) | ||
955 | + ret |= PSR_OVF; | ||
956 | + return ret; | ||
957 | +} | ||
958 | + | ||
959 | +static uint32_t compute_all_sub_xcc(void) | ||
960 | +{ | ||
961 | + uint32_t ret; | ||
962 | + | ||
963 | + ret = get_NZ_xcc(CC_DST); | ||
964 | + ret |= get_C_sub_xcc(CC_SRC, CC_SRC2); | ||
965 | + ret |= get_V_sub_xcc(CC_DST, CC_SRC, CC_SRC2); | ||
966 | + return ret; | ||
967 | +} | ||
968 | + | ||
969 | +static uint32_t compute_C_sub_xcc(void) | ||
970 | +{ | ||
971 | + return get_C_sub_xcc(CC_SRC, CC_SRC2); | ||
972 | +} | ||
973 | +#endif | ||
974 | + | ||
905 | static uint32_t compute_all_logic(void) | 975 | static uint32_t compute_all_logic(void) |
906 | { | 976 | { |
907 | return get_NZ_icc(CC_DST); | 977 | return get_NZ_icc(CC_DST); |
@@ -929,6 +999,7 @@ static const CCTable icc_table[CC_OP_NB] = { | @@ -929,6 +999,7 @@ static const CCTable icc_table[CC_OP_NB] = { | ||
929 | [CC_OP_FLAGS] = { compute_all_flags, compute_C_flags }, | 999 | [CC_OP_FLAGS] = { compute_all_flags, compute_C_flags }, |
930 | [CC_OP_ADD] = { compute_all_add, compute_C_add }, | 1000 | [CC_OP_ADD] = { compute_all_add, compute_C_add }, |
931 | [CC_OP_ADDX] = { compute_all_addx, compute_C_addx }, | 1001 | [CC_OP_ADDX] = { compute_all_addx, compute_C_addx }, |
1002 | + [CC_OP_SUB] = { compute_all_sub, compute_C_sub }, | ||
932 | [CC_OP_LOGIC] = { compute_all_logic, compute_C_logic }, | 1003 | [CC_OP_LOGIC] = { compute_all_logic, compute_C_logic }, |
933 | }; | 1004 | }; |
934 | 1005 | ||
@@ -938,6 +1009,7 @@ static const CCTable xcc_table[CC_OP_NB] = { | @@ -938,6 +1009,7 @@ static const CCTable xcc_table[CC_OP_NB] = { | ||
938 | [CC_OP_FLAGS] = { compute_all_flags_xcc, compute_C_flags_xcc }, | 1009 | [CC_OP_FLAGS] = { compute_all_flags_xcc, compute_C_flags_xcc }, |
939 | [CC_OP_ADD] = { compute_all_add_xcc, compute_C_add_xcc }, | 1010 | [CC_OP_ADD] = { compute_all_add_xcc, compute_C_add_xcc }, |
940 | [CC_OP_ADDX] = { compute_all_addx_xcc, compute_C_addx_xcc }, | 1011 | [CC_OP_ADDX] = { compute_all_addx_xcc, compute_C_addx_xcc }, |
1012 | + [CC_OP_SUB] = { compute_all_sub_xcc, compute_C_sub_xcc }, | ||
941 | [CC_OP_LOGIC] = { compute_all_logic_xcc, compute_C_logic }, | 1013 | [CC_OP_LOGIC] = { compute_all_logic_xcc, compute_C_logic }, |
942 | }; | 1014 | }; |
943 | #endif | 1015 | #endif |
target-sparc/translate.c
@@ -432,18 +432,6 @@ static inline void gen_cc_V_tag(TCGv src1, TCGv src2) | @@ -432,18 +432,6 @@ static inline void gen_cc_V_tag(TCGv src1, TCGv src2) | ||
432 | gen_set_label(l1); | 432 | gen_set_label(l1); |
433 | } | 433 | } |
434 | 434 | ||
435 | -static inline void gen_op_logic_cc(TCGv dst) | ||
436 | -{ | ||
437 | - tcg_gen_mov_tl(cpu_cc_dst, dst); | ||
438 | - | ||
439 | - gen_cc_clear_icc(); | ||
440 | - gen_cc_NZ_icc(cpu_cc_dst); | ||
441 | -#ifdef TARGET_SPARC64 | ||
442 | - gen_cc_clear_xcc(); | ||
443 | - gen_cc_NZ_xcc(cpu_cc_dst); | ||
444 | -#endif | ||
445 | -} | ||
446 | - | ||
447 | static inline void gen_tag_tv(TCGv src1, TCGv src2) | 435 | static inline void gen_tag_tv(TCGv src1, TCGv src2) |
448 | { | 436 | { |
449 | int l1; | 437 | int l1; |
@@ -623,32 +611,20 @@ static inline void gen_sub_tv(TCGv dst, TCGv src1, TCGv src2) | @@ -623,32 +611,20 @@ static inline void gen_sub_tv(TCGv dst, TCGv src1, TCGv src2) | ||
623 | tcg_temp_free(r_temp); | 611 | tcg_temp_free(r_temp); |
624 | } | 612 | } |
625 | 613 | ||
626 | -static inline void gen_op_sub_cc2(TCGv dst) | ||
627 | -{ | ||
628 | - gen_cc_clear_icc(); | ||
629 | - gen_cc_NZ_icc(cpu_cc_dst); | ||
630 | - gen_cc_C_sub_icc(cpu_cc_src, cpu_cc_src2); | ||
631 | - gen_cc_V_sub_icc(cpu_cc_dst, cpu_cc_src, cpu_cc_src2); | ||
632 | -#ifdef TARGET_SPARC64 | ||
633 | - gen_cc_clear_xcc(); | ||
634 | - gen_cc_NZ_xcc(cpu_cc_dst); | ||
635 | - gen_cc_C_sub_xcc(cpu_cc_src, cpu_cc_src2); | ||
636 | - gen_cc_V_sub_xcc(cpu_cc_dst, cpu_cc_src, cpu_cc_src2); | ||
637 | -#endif | ||
638 | - tcg_gen_mov_tl(dst, cpu_cc_dst); | ||
639 | -} | ||
640 | - | ||
641 | -static inline void gen_op_subi_cc(TCGv dst, TCGv src1, target_long src2) | 614 | +static inline void gen_op_subi_cc(TCGv dst, TCGv src1, target_long src2, DisasContext *dc) |
642 | { | 615 | { |
643 | tcg_gen_mov_tl(cpu_cc_src, src1); | 616 | tcg_gen_mov_tl(cpu_cc_src, src1); |
644 | tcg_gen_movi_tl(cpu_cc_src2, src2); | 617 | tcg_gen_movi_tl(cpu_cc_src2, src2); |
645 | if (src2 == 0) { | 618 | if (src2 == 0) { |
646 | - tcg_gen_mov_tl(dst, src1); | ||
647 | - gen_op_logic_cc(dst); | 619 | + tcg_gen_mov_tl(cpu_cc_dst, src1); |
620 | + tcg_gen_movi_i32(cpu_cc_op, CC_OP_LOGIC); | ||
621 | + dc->cc_op = CC_OP_LOGIC; | ||
648 | } else { | 622 | } else { |
649 | tcg_gen_subi_tl(cpu_cc_dst, cpu_cc_src, src2); | 623 | tcg_gen_subi_tl(cpu_cc_dst, cpu_cc_src, src2); |
650 | - gen_op_sub_cc2(dst); | 624 | + tcg_gen_movi_i32(cpu_cc_op, CC_OP_SUB); |
625 | + dc->cc_op = CC_OP_SUB; | ||
651 | } | 626 | } |
627 | + tcg_gen_mov_tl(dst, cpu_cc_dst); | ||
652 | } | 628 | } |
653 | 629 | ||
654 | static inline void gen_op_sub_cc(TCGv dst, TCGv src1, TCGv src2) | 630 | static inline void gen_op_sub_cc(TCGv dst, TCGv src1, TCGv src2) |
@@ -656,7 +632,7 @@ static inline void gen_op_sub_cc(TCGv dst, TCGv src1, TCGv src2) | @@ -656,7 +632,7 @@ static inline void gen_op_sub_cc(TCGv dst, TCGv src1, TCGv src2) | ||
656 | tcg_gen_mov_tl(cpu_cc_src, src1); | 632 | tcg_gen_mov_tl(cpu_cc_src, src1); |
657 | tcg_gen_mov_tl(cpu_cc_src2, src2); | 633 | tcg_gen_mov_tl(cpu_cc_src2, src2); |
658 | tcg_gen_sub_tl(cpu_cc_dst, cpu_cc_src, cpu_cc_src2); | 634 | tcg_gen_sub_tl(cpu_cc_dst, cpu_cc_src, cpu_cc_src2); |
659 | - gen_op_sub_cc2(dst); | 635 | + tcg_gen_mov_tl(dst, cpu_cc_dst); |
660 | } | 636 | } |
661 | 637 | ||
662 | static inline void gen_op_subx_cc2(TCGv dst) | 638 | static inline void gen_op_subx_cc2(TCGv dst) |
@@ -3171,17 +3147,15 @@ static void disas_sparc_insn(DisasContext * dc) | @@ -3171,17 +3147,15 @@ static void disas_sparc_insn(DisasContext * dc) | ||
3171 | if (IS_IMM) { | 3147 | if (IS_IMM) { |
3172 | simm = GET_FIELDs(insn, 19, 31); | 3148 | simm = GET_FIELDs(insn, 19, 31); |
3173 | if (xop & 0x10) { | 3149 | if (xop & 0x10) { |
3174 | - gen_op_subi_cc(cpu_dst, cpu_src1, simm); | ||
3175 | - tcg_gen_movi_i32(cpu_cc_op, CC_OP_FLAGS); | ||
3176 | - dc->cc_op = CC_OP_FLAGS; | 3150 | + gen_op_subi_cc(cpu_dst, cpu_src1, simm, dc); |
3177 | } else { | 3151 | } else { |
3178 | tcg_gen_subi_tl(cpu_dst, cpu_src1, simm); | 3152 | tcg_gen_subi_tl(cpu_dst, cpu_src1, simm); |
3179 | } | 3153 | } |
3180 | } else { | 3154 | } else { |
3181 | if (xop & 0x10) { | 3155 | if (xop & 0x10) { |
3182 | gen_op_sub_cc(cpu_dst, cpu_src1, cpu_src2); | 3156 | gen_op_sub_cc(cpu_dst, cpu_src1, cpu_src2); |
3183 | - tcg_gen_movi_i32(cpu_cc_op, CC_OP_FLAGS); | ||
3184 | - dc->cc_op = CC_OP_FLAGS; | 3157 | + tcg_gen_movi_i32(cpu_cc_op, CC_OP_SUB); |
3158 | + dc->cc_op = CC_OP_SUB; | ||
3185 | } else { | 3159 | } else { |
3186 | tcg_gen_sub_tl(cpu_dst, cpu_src1, cpu_src2); | 3160 | tcg_gen_sub_tl(cpu_dst, cpu_src1, cpu_src2); |
3187 | } | 3161 | } |