Commit d4b0d46898ec67e733b64b14d623550d1e7f6b9d

Authored by Blue Swirl
1 parent 38482a77

Convert sub

Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
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 }