Commit 3b2d1e9286e1ddbb36499c9fd59e14b736441969
1 parent
2ca1d92b
Convert tagged ops
Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
Showing
2 changed files
with
85 additions
and
129 deletions
target-sparc/op_helper.c
| ... | ... | @@ -902,6 +902,45 @@ static uint32_t compute_C_addx_xcc(void) |
| 902 | 902 | } |
| 903 | 903 | #endif |
| 904 | 904 | |
| 905 | +static inline uint32_t get_V_tag_icc(target_ulong src1, target_ulong src2) | |
| 906 | +{ | |
| 907 | + uint32_t ret = 0; | |
| 908 | + | |
| 909 | + if ((src1 | src2) & 0x3) | |
| 910 | + ret |= PSR_OVF; | |
| 911 | + return ret; | |
| 912 | +} | |
| 913 | + | |
| 914 | +static uint32_t compute_all_tadd(void) | |
| 915 | +{ | |
| 916 | + uint32_t ret; | |
| 917 | + | |
| 918 | + ret = get_NZ_icc(CC_DST); | |
| 919 | + ret |= get_C_add_icc(CC_DST, CC_SRC); | |
| 920 | + ret |= get_V_add_icc(CC_DST, CC_SRC, CC_SRC2); | |
| 921 | + ret |= get_V_tag_icc(CC_SRC, CC_SRC2); | |
| 922 | + return ret; | |
| 923 | +} | |
| 924 | + | |
| 925 | +static uint32_t compute_C_tadd(void) | |
| 926 | +{ | |
| 927 | + return get_C_add_icc(CC_DST, CC_SRC); | |
| 928 | +} | |
| 929 | + | |
| 930 | +static uint32_t compute_all_taddtv(void) | |
| 931 | +{ | |
| 932 | + uint32_t ret; | |
| 933 | + | |
| 934 | + ret = get_NZ_icc(CC_DST); | |
| 935 | + ret |= get_C_add_icc(CC_DST, CC_SRC); | |
| 936 | + return ret; | |
| 937 | +} | |
| 938 | + | |
| 939 | +static uint32_t compute_C_taddtv(void) | |
| 940 | +{ | |
| 941 | + return get_C_add_icc(CC_DST, CC_SRC); | |
| 942 | +} | |
| 943 | + | |
| 905 | 944 | static inline uint32_t get_C_sub_icc(target_ulong src1, target_ulong src2) |
| 906 | 945 | { |
| 907 | 946 | uint32_t ret = 0; |
| ... | ... | @@ -1014,6 +1053,36 @@ static uint32_t compute_C_subx_xcc(void) |
| 1014 | 1053 | } |
| 1015 | 1054 | #endif |
| 1016 | 1055 | |
| 1056 | +static uint32_t compute_all_tsub(void) | |
| 1057 | +{ | |
| 1058 | + uint32_t ret; | |
| 1059 | + | |
| 1060 | + ret = get_NZ_icc(CC_DST); | |
| 1061 | + ret |= get_C_sub_icc(CC_DST, CC_SRC); | |
| 1062 | + ret |= get_V_sub_icc(CC_DST, CC_SRC, CC_SRC2); | |
| 1063 | + ret |= get_V_tag_icc(CC_SRC, CC_SRC2); | |
| 1064 | + return ret; | |
| 1065 | +} | |
| 1066 | + | |
| 1067 | +static uint32_t compute_C_tsub(void) | |
| 1068 | +{ | |
| 1069 | + return get_C_sub_icc(CC_DST, CC_SRC); | |
| 1070 | +} | |
| 1071 | + | |
| 1072 | +static uint32_t compute_all_tsubtv(void) | |
| 1073 | +{ | |
| 1074 | + uint32_t ret; | |
| 1075 | + | |
| 1076 | + ret = get_NZ_icc(CC_DST); | |
| 1077 | + ret |= get_C_sub_icc(CC_DST, CC_SRC); | |
| 1078 | + return ret; | |
| 1079 | +} | |
| 1080 | + | |
| 1081 | +static uint32_t compute_C_tsubtv(void) | |
| 1082 | +{ | |
| 1083 | + return get_C_sub_icc(CC_DST, CC_SRC); | |
| 1084 | +} | |
| 1085 | + | |
| 1017 | 1086 | static uint32_t compute_all_logic(void) |
| 1018 | 1087 | { |
| 1019 | 1088 | return get_NZ_icc(CC_DST); |
| ... | ... | @@ -1041,8 +1110,12 @@ static const CCTable icc_table[CC_OP_NB] = { |
| 1041 | 1110 | [CC_OP_FLAGS] = { compute_all_flags, compute_C_flags }, |
| 1042 | 1111 | [CC_OP_ADD] = { compute_all_add, compute_C_add }, |
| 1043 | 1112 | [CC_OP_ADDX] = { compute_all_addx, compute_C_addx }, |
| 1113 | + [CC_OP_TADD] = { compute_all_tadd, compute_C_tadd }, | |
| 1114 | + [CC_OP_TADDTV] = { compute_all_taddtv, compute_C_taddtv }, | |
| 1044 | 1115 | [CC_OP_SUB] = { compute_all_sub, compute_C_sub }, |
| 1045 | 1116 | [CC_OP_SUBX] = { compute_all_subx, compute_C_subx }, |
| 1117 | + [CC_OP_TSUB] = { compute_all_tsub, compute_C_tsub }, | |
| 1118 | + [CC_OP_TSUBTV] = { compute_all_tsubtv, compute_C_tsubtv }, | |
| 1046 | 1119 | [CC_OP_LOGIC] = { compute_all_logic, compute_C_logic }, |
| 1047 | 1120 | }; |
| 1048 | 1121 | |
| ... | ... | @@ -1052,8 +1125,12 @@ static const CCTable xcc_table[CC_OP_NB] = { |
| 1052 | 1125 | [CC_OP_FLAGS] = { compute_all_flags_xcc, compute_C_flags_xcc }, |
| 1053 | 1126 | [CC_OP_ADD] = { compute_all_add_xcc, compute_C_add_xcc }, |
| 1054 | 1127 | [CC_OP_ADDX] = { compute_all_addx_xcc, compute_C_addx_xcc }, |
| 1128 | + [CC_OP_TADD] = { compute_all_add_xcc, compute_C_add_xcc }, | |
| 1129 | + [CC_OP_TADDTV] = { compute_all_add_xcc, compute_C_add_xcc }, | |
| 1055 | 1130 | [CC_OP_SUB] = { compute_all_sub_xcc, compute_C_sub_xcc }, |
| 1056 | 1131 | [CC_OP_SUBX] = { compute_all_subx_xcc, compute_C_subx_xcc }, |
| 1132 | + [CC_OP_TSUB] = { compute_all_sub_xcc, compute_C_sub_xcc }, | |
| 1133 | + [CC_OP_TSUBTV] = { compute_all_sub_xcc, compute_C_sub_xcc }, | |
| 1057 | 1134 | [CC_OP_LOGIC] = { compute_all_logic_xcc, compute_C_logic }, |
| 1058 | 1135 | }; |
| 1059 | 1136 | #endif | ... | ... |
target-sparc/translate.c
| ... | ... | @@ -420,18 +420,6 @@ static inline void gen_add_tv(TCGv dst, TCGv src1, TCGv src2) |
| 420 | 420 | tcg_temp_free(r_temp); |
| 421 | 421 | } |
| 422 | 422 | |
| 423 | -static inline void gen_cc_V_tag(TCGv src1, TCGv src2) | |
| 424 | -{ | |
| 425 | - int l1; | |
| 426 | - | |
| 427 | - l1 = gen_new_label(); | |
| 428 | - tcg_gen_or_tl(cpu_tmp0, src1, src2); | |
| 429 | - tcg_gen_andi_tl(cpu_tmp0, cpu_tmp0, 0x3); | |
| 430 | - tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_tmp0, 0, l1); | |
| 431 | - tcg_gen_ori_i32(cpu_psr, cpu_psr, PSR_OVF); | |
| 432 | - gen_set_label(l1); | |
| 433 | -} | |
| 434 | - | |
| 435 | 423 | static inline void gen_tag_tv(TCGv src1, TCGv src2) |
| 436 | 424 | { |
| 437 | 425 | int l1; |
| ... | ... | @@ -488,17 +476,6 @@ static inline void gen_op_tadd_cc(TCGv dst, TCGv src1, TCGv src2) |
| 488 | 476 | tcg_gen_mov_tl(cpu_cc_src, src1); |
| 489 | 477 | tcg_gen_mov_tl(cpu_cc_src2, src2); |
| 490 | 478 | tcg_gen_add_tl(cpu_cc_dst, cpu_cc_src, cpu_cc_src2); |
| 491 | - gen_cc_clear_icc(); | |
| 492 | - gen_cc_NZ_icc(cpu_cc_dst); | |
| 493 | - gen_cc_C_add_icc(cpu_cc_dst, cpu_cc_src); | |
| 494 | - gen_cc_V_add_icc(cpu_cc_dst, cpu_cc_src, cpu_cc_src2); | |
| 495 | - gen_cc_V_tag(cpu_cc_src, cpu_cc_src2); | |
| 496 | -#ifdef TARGET_SPARC64 | |
| 497 | - gen_cc_clear_xcc(); | |
| 498 | - gen_cc_NZ_xcc(cpu_cc_dst); | |
| 499 | - gen_cc_C_add_xcc(cpu_cc_dst, cpu_cc_src); | |
| 500 | - gen_cc_V_add_xcc(cpu_cc_dst, cpu_cc_src, cpu_cc_src2); | |
| 501 | -#endif | |
| 502 | 479 | tcg_gen_mov_tl(dst, cpu_cc_dst); |
| 503 | 480 | } |
| 504 | 481 | |
| ... | ... | @@ -509,87 +486,9 @@ static inline void gen_op_tadd_ccTV(TCGv dst, TCGv src1, TCGv src2) |
| 509 | 486 | gen_tag_tv(cpu_cc_src, cpu_cc_src2); |
| 510 | 487 | tcg_gen_add_tl(cpu_cc_dst, cpu_cc_src, cpu_cc_src2); |
| 511 | 488 | gen_add_tv(cpu_cc_dst, cpu_cc_src, cpu_cc_src2); |
| 512 | - gen_cc_clear_icc(); | |
| 513 | - gen_cc_NZ_icc(cpu_cc_dst); | |
| 514 | - gen_cc_C_add_icc(cpu_cc_dst, cpu_cc_src); | |
| 515 | -#ifdef TARGET_SPARC64 | |
| 516 | - gen_cc_clear_xcc(); | |
| 517 | - gen_cc_NZ_xcc(cpu_cc_dst); | |
| 518 | - gen_cc_C_add_xcc(cpu_cc_dst, cpu_cc_src); | |
| 519 | - gen_cc_V_add_xcc(cpu_cc_dst, cpu_cc_src, cpu_cc_src2); | |
| 520 | -#endif | |
| 521 | 489 | tcg_gen_mov_tl(dst, cpu_cc_dst); |
| 522 | 490 | } |
| 523 | 491 | |
| 524 | -/* old op: | |
| 525 | - if (src1 < T1) | |
| 526 | - env->psr |= PSR_CARRY; | |
| 527 | -*/ | |
| 528 | -static inline void gen_cc_C_sub_icc(TCGv src1, TCGv src2) | |
| 529 | -{ | |
| 530 | - TCGv r_temp1, r_temp2; | |
| 531 | - int l1; | |
| 532 | - | |
| 533 | - l1 = gen_new_label(); | |
| 534 | - r_temp1 = tcg_temp_new(); | |
| 535 | - r_temp2 = tcg_temp_new(); | |
| 536 | - tcg_gen_andi_tl(r_temp1, src1, 0xffffffffULL); | |
| 537 | - tcg_gen_andi_tl(r_temp2, src2, 0xffffffffULL); | |
| 538 | - tcg_gen_brcond_tl(TCG_COND_GEU, r_temp1, r_temp2, l1); | |
| 539 | - tcg_gen_ori_i32(cpu_psr, cpu_psr, PSR_CARRY); | |
| 540 | - gen_set_label(l1); | |
| 541 | - tcg_temp_free(r_temp1); | |
| 542 | - tcg_temp_free(r_temp2); | |
| 543 | -} | |
| 544 | - | |
| 545 | -#ifdef TARGET_SPARC64 | |
| 546 | -static inline void gen_cc_C_sub_xcc(TCGv src1, TCGv src2) | |
| 547 | -{ | |
| 548 | - int l1; | |
| 549 | - | |
| 550 | - l1 = gen_new_label(); | |
| 551 | - tcg_gen_brcond_tl(TCG_COND_GEU, src1, src2, l1); | |
| 552 | - tcg_gen_ori_i32(cpu_xcc, cpu_xcc, PSR_CARRY); | |
| 553 | - gen_set_label(l1); | |
| 554 | -} | |
| 555 | -#endif | |
| 556 | - | |
| 557 | -/* old op: | |
| 558 | - if (((src1 ^ T1) & (src1 ^ T0)) & (1 << 31)) | |
| 559 | - env->psr |= PSR_OVF; | |
| 560 | -*/ | |
| 561 | -static inline void gen_cc_V_sub_icc(TCGv dst, TCGv src1, TCGv src2) | |
| 562 | -{ | |
| 563 | - TCGv r_temp; | |
| 564 | - | |
| 565 | - r_temp = tcg_temp_new(); | |
| 566 | - tcg_gen_xor_tl(r_temp, src1, src2); | |
| 567 | - tcg_gen_xor_tl(cpu_tmp0, src1, dst); | |
| 568 | - tcg_gen_and_tl(r_temp, r_temp, cpu_tmp0); | |
| 569 | - tcg_gen_andi_tl(r_temp, r_temp, (1ULL << 31)); | |
| 570 | - tcg_gen_shri_tl(r_temp, r_temp, 31 - PSR_OVF_SHIFT); | |
| 571 | - tcg_gen_trunc_tl_i32(cpu_tmp32, r_temp); | |
| 572 | - tcg_gen_or_i32(cpu_psr, cpu_psr, cpu_tmp32); | |
| 573 | - tcg_temp_free(r_temp); | |
| 574 | -} | |
| 575 | - | |
| 576 | -#ifdef TARGET_SPARC64 | |
| 577 | -static inline void gen_cc_V_sub_xcc(TCGv dst, TCGv src1, TCGv src2) | |
| 578 | -{ | |
| 579 | - TCGv r_temp; | |
| 580 | - | |
| 581 | - r_temp = tcg_temp_new(); | |
| 582 | - tcg_gen_xor_tl(r_temp, src1, src2); | |
| 583 | - tcg_gen_xor_tl(cpu_tmp0, src1, dst); | |
| 584 | - tcg_gen_and_tl(r_temp, r_temp, cpu_tmp0); | |
| 585 | - tcg_gen_andi_tl(r_temp, r_temp, (1ULL << 63)); | |
| 586 | - tcg_gen_shri_tl(r_temp, r_temp, 63 - PSR_OVF_SHIFT); | |
| 587 | - tcg_gen_trunc_tl_i32(cpu_tmp32, r_temp); | |
| 588 | - tcg_gen_or_i32(cpu_xcc, cpu_xcc, cpu_tmp32); | |
| 589 | - tcg_temp_free(r_temp); | |
| 590 | -} | |
| 591 | -#endif | |
| 592 | - | |
| 593 | 492 | static inline void gen_sub_tv(TCGv dst, TCGv src1, TCGv src2) |
| 594 | 493 | { |
| 595 | 494 | TCGv r_temp; |
| ... | ... | @@ -660,17 +559,6 @@ static inline void gen_op_tsub_cc(TCGv dst, TCGv src1, TCGv src2) |
| 660 | 559 | tcg_gen_mov_tl(cpu_cc_src, src1); |
| 661 | 560 | tcg_gen_mov_tl(cpu_cc_src2, src2); |
| 662 | 561 | tcg_gen_sub_tl(cpu_cc_dst, cpu_cc_src, cpu_cc_src2); |
| 663 | - gen_cc_clear_icc(); | |
| 664 | - gen_cc_NZ_icc(cpu_cc_dst); | |
| 665 | - gen_cc_C_sub_icc(cpu_cc_src, cpu_cc_src2); | |
| 666 | - gen_cc_V_sub_icc(cpu_cc_dst, cpu_cc_src, cpu_cc_src2); | |
| 667 | - gen_cc_V_tag(cpu_cc_src, cpu_cc_src2); | |
| 668 | -#ifdef TARGET_SPARC64 | |
| 669 | - gen_cc_clear_xcc(); | |
| 670 | - gen_cc_NZ_xcc(cpu_cc_dst); | |
| 671 | - gen_cc_C_sub_xcc(cpu_cc_src, cpu_cc_src2); | |
| 672 | - gen_cc_V_sub_xcc(cpu_cc_dst, cpu_cc_src, cpu_cc_src2); | |
| 673 | -#endif | |
| 674 | 562 | tcg_gen_mov_tl(dst, cpu_cc_dst); |
| 675 | 563 | } |
| 676 | 564 | |
| ... | ... | @@ -681,15 +569,6 @@ static inline void gen_op_tsub_ccTV(TCGv dst, TCGv src1, TCGv src2) |
| 681 | 569 | gen_tag_tv(cpu_cc_src, cpu_cc_src2); |
| 682 | 570 | tcg_gen_sub_tl(cpu_cc_dst, cpu_cc_src, cpu_cc_src2); |
| 683 | 571 | gen_sub_tv(cpu_cc_dst, cpu_cc_src, cpu_cc_src2); |
| 684 | - gen_cc_clear_icc(); | |
| 685 | - gen_cc_NZ_icc(cpu_cc_dst); | |
| 686 | - gen_cc_C_sub_icc(cpu_cc_src, cpu_cc_src2); | |
| 687 | -#ifdef TARGET_SPARC64 | |
| 688 | - gen_cc_clear_xcc(); | |
| 689 | - gen_cc_NZ_xcc(cpu_cc_dst); | |
| 690 | - gen_cc_C_sub_xcc(cpu_cc_src, cpu_cc_src2); | |
| 691 | - gen_cc_V_sub_xcc(cpu_cc_dst, cpu_cc_src, cpu_cc_src2); | |
| 692 | -#endif | |
| 693 | 572 | tcg_gen_mov_tl(dst, cpu_cc_dst); |
| 694 | 573 | } |
| 695 | 574 | |
| ... | ... | @@ -3297,28 +3176,28 @@ static void disas_sparc_insn(DisasContext * dc) |
| 3297 | 3176 | case 0x20: /* taddcc */ |
| 3298 | 3177 | gen_op_tadd_cc(cpu_dst, cpu_src1, cpu_src2); |
| 3299 | 3178 | gen_movl_TN_reg(rd, cpu_dst); |
| 3300 | - tcg_gen_movi_i32(cpu_cc_op, CC_OP_FLAGS); | |
| 3301 | - dc->cc_op = CC_OP_FLAGS; | |
| 3179 | + tcg_gen_movi_i32(cpu_cc_op, CC_OP_TADD); | |
| 3180 | + dc->cc_op = CC_OP_TADD; | |
| 3302 | 3181 | break; |
| 3303 | 3182 | case 0x21: /* tsubcc */ |
| 3304 | 3183 | gen_op_tsub_cc(cpu_dst, cpu_src1, cpu_src2); |
| 3305 | 3184 | gen_movl_TN_reg(rd, cpu_dst); |
| 3306 | - tcg_gen_movi_i32(cpu_cc_op, CC_OP_FLAGS); | |
| 3307 | - dc->cc_op = CC_OP_FLAGS; | |
| 3185 | + tcg_gen_movi_i32(cpu_cc_op, CC_OP_TSUB); | |
| 3186 | + dc->cc_op = CC_OP_TSUB; | |
| 3308 | 3187 | break; |
| 3309 | 3188 | case 0x22: /* taddcctv */ |
| 3310 | 3189 | save_state(dc, cpu_cond); |
| 3311 | 3190 | gen_op_tadd_ccTV(cpu_dst, cpu_src1, cpu_src2); |
| 3312 | 3191 | gen_movl_TN_reg(rd, cpu_dst); |
| 3313 | - tcg_gen_movi_i32(cpu_cc_op, CC_OP_FLAGS); | |
| 3314 | - dc->cc_op = CC_OP_FLAGS; | |
| 3192 | + tcg_gen_movi_i32(cpu_cc_op, CC_OP_TADDTV); | |
| 3193 | + dc->cc_op = CC_OP_TADDTV; | |
| 3315 | 3194 | break; |
| 3316 | 3195 | case 0x23: /* tsubcctv */ |
| 3317 | 3196 | save_state(dc, cpu_cond); |
| 3318 | 3197 | gen_op_tsub_ccTV(cpu_dst, cpu_src1, cpu_src2); |
| 3319 | 3198 | gen_movl_TN_reg(rd, cpu_dst); |
| 3320 | - tcg_gen_movi_i32(cpu_cc_op, CC_OP_FLAGS); | |
| 3321 | - dc->cc_op = CC_OP_FLAGS; | |
| 3199 | + tcg_gen_movi_i32(cpu_cc_op, CC_OP_TSUBTV); | |
| 3200 | + dc->cc_op = CC_OP_TSUBTV; | |
| 3322 | 3201 | break; |
| 3323 | 3202 | case 0x24: /* mulscc */ |
| 3324 | 3203 | gen_helper_compute_psr(); | ... | ... |