Commit bdf9f35dad46b3f20235b9a19f0a6633362e10ed

Authored by Blue Swirl
1 parent 8393617c

Convert add

Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
target-sparc/op_helper.c
... ... @@ -756,6 +756,17 @@ static uint32_t compute_C_flags(void)
756 756 return env->psr & PSR_CARRY;
757 757 }
758 758  
  759 +static inline uint32_t get_NZ_icc(target_ulong dst)
  760 +{
  761 + uint32_t ret = 0;
  762 +
  763 + if (!(dst & 0xffffffffULL))
  764 + ret |= PSR_ZERO;
  765 + if ((int32_t) (dst & 0xffffffffULL) < 0)
  766 + ret |= PSR_NEG;
  767 + return ret;
  768 +}
  769 +
759 770 #ifdef TARGET_SPARC64
760 771 static uint32_t compute_all_flags_xcc(void)
761 772 {
... ... @@ -767,6 +778,86 @@ static uint32_t compute_C_flags_xcc(void)
767 778 return env->xcc & PSR_CARRY;
768 779 }
769 780  
  781 +static inline uint32_t get_NZ_xcc(target_ulong dst)
  782 +{
  783 + uint32_t ret = 0;
  784 +
  785 + if (!dst)
  786 + ret |= PSR_ZERO;
  787 + if ((int64_t)dst < 0)
  788 + ret |= PSR_NEG;
  789 + return ret;
  790 +}
  791 +#endif
  792 +
  793 +static inline uint32_t get_C_add_icc(target_ulong dst, target_ulong src1)
  794 +{
  795 + uint32_t ret = 0;
  796 +
  797 + if ((dst & 0xffffffffULL) < (src1 & 0xffffffffULL))
  798 + ret |= PSR_CARRY;
  799 + return ret;
  800 +}
  801 +
  802 +static inline uint32_t get_V_add_icc(target_ulong dst, target_ulong src1,
  803 + target_ulong src2)
  804 +{
  805 + uint32_t ret = 0;
  806 +
  807 + if (((src1 ^ src2 ^ -1) & (src1 ^ dst)) & (1ULL << 31))
  808 + ret |= PSR_OVF;
  809 + return ret;
  810 +}
  811 +
  812 +static uint32_t compute_all_add(void)
  813 +{
  814 + uint32_t ret;
  815 +
  816 + ret = get_NZ_icc(CC_DST);
  817 + ret |= get_C_add_icc(CC_DST, CC_SRC);
  818 + ret |= get_V_add_icc(CC_DST, CC_SRC, CC_SRC2);
  819 + return ret;
  820 +}
  821 +
  822 +static uint32_t compute_C_add(void)
  823 +{
  824 + return get_C_add_icc(CC_DST, CC_SRC);
  825 +}
  826 +
  827 +#ifdef TARGET_SPARC64
  828 +static inline uint32_t get_C_add_xcc(target_ulong dst, target_ulong src1)
  829 +{
  830 + uint32_t ret = 0;
  831 +
  832 + if (dst < src1)
  833 + ret |= PSR_CARRY;
  834 + return ret;
  835 +}
  836 +
  837 +static inline uint32_t get_V_add_xcc(target_ulong dst, target_ulong src1,
  838 + target_ulong src2)
  839 +{
  840 + uint32_t ret = 0;
  841 +
  842 + if (((src1 ^ src2 ^ -1) & (src1 ^ dst)) & (1ULL << 63))
  843 + ret |= PSR_OVF;
  844 + return ret;
  845 +}
  846 +
  847 +static uint32_t compute_all_add_xcc(void)
  848 +{
  849 + uint32_t ret;
  850 +
  851 + ret = get_NZ_xcc(CC_DST);
  852 + ret |= get_C_add_xcc(CC_DST, CC_SRC);
  853 + ret |= get_V_add_xcc(CC_DST, CC_SRC, CC_SRC2);
  854 + return ret;
  855 +}
  856 +
  857 +static uint32_t compute_C_add_xcc(void)
  858 +{
  859 + return get_C_add_xcc(CC_DST, CC_SRC);
  860 +}
770 861 #endif
771 862  
772 863 typedef struct CCTable {
... ... @@ -777,12 +868,14 @@ typedef struct CCTable {
777 868 static const CCTable icc_table[CC_OP_NB] = {
778 869 /* CC_OP_DYNAMIC should never happen */
779 870 [CC_OP_FLAGS] = { compute_all_flags, compute_C_flags },
  871 + [CC_OP_ADD] = { compute_all_add, compute_C_add },
780 872 };
781 873  
782 874 #ifdef TARGET_SPARC64
783 875 static const CCTable xcc_table[CC_OP_NB] = {
784 876 /* CC_OP_DYNAMIC should never happen */
785 877 [CC_OP_FLAGS] = { compute_all_flags_xcc, compute_C_flags_xcc },
  878 + [CC_OP_ADD] = { compute_all_add_xcc, compute_C_add_xcc },
786 879 };
787 880 #endif
788 881  
... ...
target-sparc/translate.c
... ... @@ -459,27 +459,12 @@ static inline void gen_tag_tv(TCGv src1, TCGv src2)
459 459 gen_set_label(l1);
460 460 }
461 461  
462   -static inline void gen_op_add_cc2(TCGv dst)
463   -{
464   - gen_cc_clear_icc();
465   - gen_cc_NZ_icc(cpu_cc_dst);
466   - gen_cc_C_add_icc(cpu_cc_dst, cpu_cc_src);
467   - gen_cc_V_add_icc(cpu_cc_dst, cpu_cc_src, cpu_cc_src2);
468   -#ifdef TARGET_SPARC64
469   - gen_cc_clear_xcc();
470   - gen_cc_NZ_xcc(cpu_cc_dst);
471   - gen_cc_C_add_xcc(cpu_cc_dst, cpu_cc_src);
472   - gen_cc_V_add_xcc(cpu_cc_dst, cpu_cc_src, cpu_cc_src2);
473   -#endif
474   - tcg_gen_mov_tl(dst, cpu_cc_dst);
475   -}
476   -
477 462 static inline void gen_op_addi_cc(TCGv dst, TCGv src1, target_long src2)
478 463 {
479 464 tcg_gen_mov_tl(cpu_cc_src, src1);
480 465 tcg_gen_movi_tl(cpu_cc_src2, src2);
481 466 tcg_gen_addi_tl(cpu_cc_dst, cpu_cc_src, src2);
482   - gen_op_add_cc2(dst);
  467 + tcg_gen_mov_tl(dst, cpu_cc_dst);
483 468 }
484 469  
485 470 static inline void gen_op_add_cc(TCGv dst, TCGv src1, TCGv src2)
... ... @@ -487,7 +472,7 @@ static inline void gen_op_add_cc(TCGv dst, TCGv src1, TCGv src2)
487 472 tcg_gen_mov_tl(cpu_cc_src, src1);
488 473 tcg_gen_mov_tl(cpu_cc_src2, src2);
489 474 tcg_gen_add_tl(cpu_cc_dst, cpu_cc_src, cpu_cc_src2);
490   - gen_op_add_cc2(dst);
  475 + tcg_gen_mov_tl(dst, cpu_cc_dst);
491 476 }
492 477  
493 478 static inline void gen_op_addx_cc2(TCGv dst)
... ... @@ -3153,16 +3138,16 @@ static void disas_sparc_insn(DisasContext * dc)
3153 3138 simm = GET_FIELDs(insn, 19, 31);
3154 3139 if (xop & 0x10) {
3155 3140 gen_op_addi_cc(cpu_dst, cpu_src1, simm);
3156   - tcg_gen_movi_i32(cpu_cc_op, CC_OP_FLAGS);
3157   - dc->cc_op = CC_OP_FLAGS;
  3141 + tcg_gen_movi_i32(cpu_cc_op, CC_OP_ADD);
  3142 + dc->cc_op = CC_OP_ADD;
3158 3143 } else {
3159 3144 tcg_gen_addi_tl(cpu_dst, cpu_src1, simm);
3160 3145 }
3161 3146 } else {
3162 3147 if (xop & 0x10) {
3163 3148 gen_op_add_cc(cpu_dst, cpu_src1, cpu_src2);
3164   - tcg_gen_movi_i32(cpu_cc_op, CC_OP_FLAGS);
3165   - dc->cc_op = CC_OP_FLAGS;
  3149 + tcg_gen_movi_i32(cpu_cc_op, CC_OP_ADD);
  3150 + dc->cc_op = CC_OP_ADD;
3166 3151 } else {
3167 3152 tcg_gen_add_tl(cpu_dst, cpu_src1, cpu_src2);
3168 3153 }
... ...