Commit 789c91ef396252e7fedbc5c5b02b91df6daa08c3
1 parent
bdf9f35d
Convert addx
Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
Showing
2 changed files
with
50 additions
and
31 deletions
target-sparc/op_helper.c
... | ... | @@ -860,6 +860,48 @@ static uint32_t compute_C_add_xcc(void) |
860 | 860 | } |
861 | 861 | #endif |
862 | 862 | |
863 | +static uint32_t compute_all_addx(void) | |
864 | +{ | |
865 | + uint32_t ret; | |
866 | + | |
867 | + ret = get_NZ_icc(CC_DST); | |
868 | + ret |= get_C_add_icc(CC_DST - CC_SRC2, CC_SRC); | |
869 | + ret |= get_C_add_icc(CC_DST, CC_SRC); | |
870 | + ret |= get_V_add_icc(CC_DST, CC_SRC, CC_SRC2); | |
871 | + return ret; | |
872 | +} | |
873 | + | |
874 | +static uint32_t compute_C_addx(void) | |
875 | +{ | |
876 | + uint32_t ret; | |
877 | + | |
878 | + ret = get_C_add_icc(CC_DST - CC_SRC2, CC_SRC); | |
879 | + ret |= get_C_add_icc(CC_DST, CC_SRC); | |
880 | + return ret; | |
881 | +} | |
882 | + | |
883 | +#ifdef TARGET_SPARC64 | |
884 | +static uint32_t compute_all_addx_xcc(void) | |
885 | +{ | |
886 | + uint32_t ret; | |
887 | + | |
888 | + ret = get_NZ_xcc(CC_DST); | |
889 | + ret |= get_C_add_xcc(CC_DST - CC_SRC2, CC_SRC); | |
890 | + ret |= get_C_add_xcc(CC_DST, CC_SRC); | |
891 | + ret |= get_V_add_xcc(CC_DST, CC_SRC, CC_SRC2); | |
892 | + return ret; | |
893 | +} | |
894 | + | |
895 | +static uint32_t compute_C_addx_xcc(void) | |
896 | +{ | |
897 | + uint32_t ret; | |
898 | + | |
899 | + ret = get_C_add_xcc(CC_DST - CC_SRC2, CC_SRC); | |
900 | + ret |= get_C_add_xcc(CC_DST, CC_SRC); | |
901 | + return ret; | |
902 | +} | |
903 | +#endif | |
904 | + | |
863 | 905 | typedef struct CCTable { |
864 | 906 | uint32_t (*compute_all)(void); /* return all the flags */ |
865 | 907 | uint32_t (*compute_c)(void); /* return the C flag */ |
... | ... | @@ -869,6 +911,7 @@ static const CCTable icc_table[CC_OP_NB] = { |
869 | 911 | /* CC_OP_DYNAMIC should never happen */ |
870 | 912 | [CC_OP_FLAGS] = { compute_all_flags, compute_C_flags }, |
871 | 913 | [CC_OP_ADD] = { compute_all_add, compute_C_add }, |
914 | + [CC_OP_ADDX] = { compute_all_addx, compute_C_addx }, | |
872 | 915 | }; |
873 | 916 | |
874 | 917 | #ifdef TARGET_SPARC64 |
... | ... | @@ -876,6 +919,7 @@ static const CCTable xcc_table[CC_OP_NB] = { |
876 | 919 | /* CC_OP_DYNAMIC should never happen */ |
877 | 920 | [CC_OP_FLAGS] = { compute_all_flags_xcc, compute_C_flags_xcc }, |
878 | 921 | [CC_OP_ADD] = { compute_all_add_xcc, compute_C_add_xcc }, |
922 | + [CC_OP_ADDX] = { compute_all_addx_xcc, compute_C_addx_xcc }, | |
879 | 923 | }; |
880 | 924 | #endif |
881 | 925 | ... | ... |
target-sparc/translate.c
... | ... | @@ -475,33 +475,14 @@ static inline void gen_op_add_cc(TCGv dst, TCGv src1, TCGv src2) |
475 | 475 | tcg_gen_mov_tl(dst, cpu_cc_dst); |
476 | 476 | } |
477 | 477 | |
478 | -static inline void gen_op_addx_cc2(TCGv dst) | |
479 | -{ | |
480 | - gen_cc_NZ_icc(cpu_cc_dst); | |
481 | - gen_cc_C_add_icc(cpu_cc_dst, cpu_cc_src); | |
482 | - gen_cc_V_add_icc(cpu_cc_dst, cpu_cc_src, cpu_cc_src2); | |
483 | -#ifdef TARGET_SPARC64 | |
484 | - gen_cc_NZ_xcc(cpu_cc_dst); | |
485 | - gen_cc_C_add_xcc(cpu_cc_dst, cpu_cc_src); | |
486 | - gen_cc_V_add_xcc(cpu_cc_dst, cpu_cc_src, cpu_cc_src2); | |
487 | -#endif | |
488 | - tcg_gen_mov_tl(dst, cpu_cc_dst); | |
489 | -} | |
490 | - | |
491 | 478 | static inline void gen_op_addxi_cc(TCGv dst, TCGv src1, target_long src2) |
492 | 479 | { |
493 | 480 | tcg_gen_mov_tl(cpu_cc_src, src1); |
494 | 481 | tcg_gen_movi_tl(cpu_cc_src2, src2); |
495 | 482 | gen_mov_reg_C(cpu_tmp0, cpu_psr); |
496 | 483 | tcg_gen_add_tl(cpu_cc_dst, cpu_cc_src, cpu_tmp0); |
497 | - gen_cc_clear_icc(); | |
498 | - gen_cc_C_add_icc(cpu_cc_dst, cpu_cc_src); | |
499 | -#ifdef TARGET_SPARC64 | |
500 | - gen_cc_clear_xcc(); | |
501 | - gen_cc_C_add_xcc(cpu_cc_dst, cpu_cc_src); | |
502 | -#endif | |
503 | 484 | tcg_gen_addi_tl(cpu_cc_dst, cpu_cc_dst, src2); |
504 | - gen_op_addx_cc2(dst); | |
485 | + tcg_gen_mov_tl(dst, cpu_cc_dst); | |
505 | 486 | } |
506 | 487 | |
507 | 488 | static inline void gen_op_addx_cc(TCGv dst, TCGv src1, TCGv src2) |
... | ... | @@ -510,14 +491,8 @@ static inline void gen_op_addx_cc(TCGv dst, TCGv src1, TCGv src2) |
510 | 491 | tcg_gen_mov_tl(cpu_cc_src2, src2); |
511 | 492 | gen_mov_reg_C(cpu_tmp0, cpu_psr); |
512 | 493 | tcg_gen_add_tl(cpu_cc_dst, cpu_cc_src, cpu_tmp0); |
513 | - gen_cc_clear_icc(); | |
514 | - gen_cc_C_add_icc(cpu_cc_dst, cpu_cc_src); | |
515 | -#ifdef TARGET_SPARC64 | |
516 | - gen_cc_clear_xcc(); | |
517 | - gen_cc_C_add_xcc(cpu_cc_dst, cpu_cc_src); | |
518 | -#endif | |
519 | 494 | tcg_gen_add_tl(cpu_cc_dst, cpu_cc_dst, cpu_cc_src2); |
520 | - gen_op_addx_cc2(dst); | |
495 | + tcg_gen_mov_tl(dst, cpu_cc_dst); | |
521 | 496 | } |
522 | 497 | |
523 | 498 | static inline void gen_op_tadd_cc(TCGv dst, TCGv src1, TCGv src2) |
... | ... | @@ -3258,8 +3233,8 @@ static void disas_sparc_insn(DisasContext * dc) |
3258 | 3233 | if (xop & 0x10) { |
3259 | 3234 | gen_helper_compute_psr(); |
3260 | 3235 | gen_op_addxi_cc(cpu_dst, cpu_src1, simm); |
3261 | - tcg_gen_movi_i32(cpu_cc_op, CC_OP_FLAGS); | |
3262 | - dc->cc_op = CC_OP_FLAGS; | |
3236 | + tcg_gen_movi_i32(cpu_cc_op, CC_OP_ADDX); | |
3237 | + dc->cc_op = CC_OP_ADDX; | |
3263 | 3238 | } else { |
3264 | 3239 | gen_helper_compute_psr(); |
3265 | 3240 | gen_mov_reg_C(cpu_tmp0, cpu_psr); |
... | ... | @@ -3270,8 +3245,8 @@ static void disas_sparc_insn(DisasContext * dc) |
3270 | 3245 | if (xop & 0x10) { |
3271 | 3246 | gen_helper_compute_psr(); |
3272 | 3247 | gen_op_addx_cc(cpu_dst, cpu_src1, cpu_src2); |
3273 | - tcg_gen_movi_i32(cpu_cc_op, CC_OP_FLAGS); | |
3274 | - dc->cc_op = CC_OP_FLAGS; | |
3248 | + tcg_gen_movi_i32(cpu_cc_op, CC_OP_ADDX); | |
3249 | + dc->cc_op = CC_OP_ADDX; | |
3275 | 3250 | } else { |
3276 | 3251 | gen_helper_compute_psr(); |
3277 | 3252 | gen_mov_reg_C(cpu_tmp0, cpu_psr); | ... | ... |