Commit 41d728522b6f269b636fe5e2bc91b399a23e5a4c

Authored by Blue Swirl
1 parent 67526b20

Optimize operations with immediate parameters

Showing 1 changed file with 200 additions and 52 deletions
target-sparc/translate.c
@@ -446,17 +446,43 @@ static inline void gen_tag_tv(TCGv src1, TCGv src2) @@ -446,17 +446,43 @@ static inline void gen_tag_tv(TCGv src1, TCGv src2)
446 gen_set_label(l1); 446 gen_set_label(l1);
447 } 447 }
448 448
  449 +static inline void gen_op_add_cc2(TCGv dst)
  450 +{
  451 + gen_cc_clear_icc();
  452 + gen_cc_NZ_icc(cpu_cc_dst);
  453 + gen_cc_C_add_icc(cpu_cc_dst, cpu_cc_src);
  454 + gen_cc_V_add_icc(cpu_cc_dst, cpu_cc_src, cpu_cc_src2);
  455 +#ifdef TARGET_SPARC64
  456 + gen_cc_clear_xcc();
  457 + gen_cc_NZ_xcc(cpu_cc_dst);
  458 + gen_cc_C_add_xcc(cpu_cc_dst, cpu_cc_src);
  459 + gen_cc_V_add_xcc(cpu_cc_dst, cpu_cc_src, cpu_cc_src2);
  460 +#endif
  461 + tcg_gen_mov_tl(dst, cpu_cc_dst);
  462 +}
  463 +
  464 +static inline void gen_op_addi_cc(TCGv dst, TCGv src1, target_long src2)
  465 +{
  466 + tcg_gen_mov_tl(cpu_cc_src, src1);
  467 + tcg_gen_movi_tl(cpu_cc_src2, src2);
  468 + tcg_gen_addi_tl(cpu_cc_dst, cpu_cc_src, src2);
  469 + gen_op_add_cc2(dst);
  470 +}
  471 +
449 static inline void gen_op_add_cc(TCGv dst, TCGv src1, TCGv src2) 472 static inline void gen_op_add_cc(TCGv dst, TCGv src1, TCGv src2)
450 { 473 {
451 tcg_gen_mov_tl(cpu_cc_src, src1); 474 tcg_gen_mov_tl(cpu_cc_src, src1);
452 tcg_gen_mov_tl(cpu_cc_src2, src2); 475 tcg_gen_mov_tl(cpu_cc_src2, src2);
453 tcg_gen_add_tl(cpu_cc_dst, cpu_cc_src, cpu_cc_src2); 476 tcg_gen_add_tl(cpu_cc_dst, cpu_cc_src, cpu_cc_src2);
454 - gen_cc_clear_icc(); 477 + gen_op_add_cc2(dst);
  478 +}
  479 +
  480 +static inline void gen_op_addx_cc2(TCGv dst)
  481 +{
455 gen_cc_NZ_icc(cpu_cc_dst); 482 gen_cc_NZ_icc(cpu_cc_dst);
456 gen_cc_C_add_icc(cpu_cc_dst, cpu_cc_src); 483 gen_cc_C_add_icc(cpu_cc_dst, cpu_cc_src);
457 gen_cc_V_add_icc(cpu_cc_dst, cpu_cc_src, cpu_cc_src2); 484 gen_cc_V_add_icc(cpu_cc_dst, cpu_cc_src, cpu_cc_src2);
458 #ifdef TARGET_SPARC64 485 #ifdef TARGET_SPARC64
459 - gen_cc_clear_xcc();  
460 gen_cc_NZ_xcc(cpu_cc_dst); 486 gen_cc_NZ_xcc(cpu_cc_dst);
461 gen_cc_C_add_xcc(cpu_cc_dst, cpu_cc_src); 487 gen_cc_C_add_xcc(cpu_cc_dst, cpu_cc_src);
462 gen_cc_V_add_xcc(cpu_cc_dst, cpu_cc_src, cpu_cc_src2); 488 gen_cc_V_add_xcc(cpu_cc_dst, cpu_cc_src, cpu_cc_src2);
@@ -464,10 +490,10 @@ static inline void gen_op_add_cc(TCGv dst, TCGv src1, TCGv src2) @@ -464,10 +490,10 @@ static inline void gen_op_add_cc(TCGv dst, TCGv src1, TCGv src2)
464 tcg_gen_mov_tl(dst, cpu_cc_dst); 490 tcg_gen_mov_tl(dst, cpu_cc_dst);
465 } 491 }
466 492
467 -static inline void gen_op_addx_cc(TCGv dst, TCGv src1, TCGv src2) 493 +static inline void gen_op_addxi_cc(TCGv dst, TCGv src1, target_long src2)
468 { 494 {
469 tcg_gen_mov_tl(cpu_cc_src, src1); 495 tcg_gen_mov_tl(cpu_cc_src, src1);
470 - tcg_gen_mov_tl(cpu_cc_src2, src2); 496 + tcg_gen_movi_tl(cpu_cc_src2, src2);
471 gen_mov_reg_C(cpu_tmp0, cpu_psr); 497 gen_mov_reg_C(cpu_tmp0, cpu_psr);
472 tcg_gen_add_tl(cpu_cc_dst, cpu_cc_src, cpu_tmp0); 498 tcg_gen_add_tl(cpu_cc_dst, cpu_cc_src, cpu_tmp0);
473 gen_cc_clear_icc(); 499 gen_cc_clear_icc();
@@ -476,16 +502,24 @@ static inline void gen_op_addx_cc(TCGv dst, TCGv src1, TCGv src2) @@ -476,16 +502,24 @@ static inline void gen_op_addx_cc(TCGv dst, TCGv src1, TCGv src2)
476 gen_cc_clear_xcc(); 502 gen_cc_clear_xcc();
477 gen_cc_C_add_xcc(cpu_cc_dst, cpu_cc_src); 503 gen_cc_C_add_xcc(cpu_cc_dst, cpu_cc_src);
478 #endif 504 #endif
479 - tcg_gen_add_tl(cpu_cc_dst, cpu_cc_dst, cpu_cc_src2);  
480 - gen_cc_NZ_icc(cpu_cc_dst); 505 + tcg_gen_addi_tl(cpu_cc_dst, cpu_cc_dst, src2);
  506 + gen_op_addx_cc2(dst);
  507 +}
  508 +
  509 +static inline void gen_op_addx_cc(TCGv dst, TCGv src1, TCGv src2)
  510 +{
  511 + tcg_gen_mov_tl(cpu_cc_src, src1);
  512 + tcg_gen_mov_tl(cpu_cc_src2, src2);
  513 + gen_mov_reg_C(cpu_tmp0, cpu_psr);
  514 + tcg_gen_add_tl(cpu_cc_dst, cpu_cc_src, cpu_tmp0);
  515 + gen_cc_clear_icc();
481 gen_cc_C_add_icc(cpu_cc_dst, cpu_cc_src); 516 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 517 #ifdef TARGET_SPARC64
484 - gen_cc_NZ_xcc(cpu_cc_dst); 518 + gen_cc_clear_xcc();
485 gen_cc_C_add_xcc(cpu_cc_dst, cpu_cc_src); 519 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 520 #endif
488 - tcg_gen_mov_tl(dst, cpu_cc_dst); 521 + tcg_gen_add_tl(cpu_cc_dst, cpu_cc_dst, cpu_cc_src2);
  522 + gen_op_addx_cc2(dst);
489 } 523 }
490 524
491 static inline void gen_op_tadd_cc(TCGv dst, TCGv src1, TCGv src2) 525 static inline void gen_op_tadd_cc(TCGv dst, TCGv src1, TCGv src2)
@@ -616,11 +650,8 @@ static inline void gen_sub_tv(TCGv dst, TCGv src1, TCGv src2) @@ -616,11 +650,8 @@ static inline void gen_sub_tv(TCGv dst, TCGv src1, TCGv src2)
616 tcg_temp_free(r_temp); 650 tcg_temp_free(r_temp);
617 } 651 }
618 652
619 -static inline void gen_op_sub_cc(TCGv dst, TCGv src1, TCGv src2) 653 +static inline void gen_op_sub_cc2(TCGv dst)
620 { 654 {
621 - tcg_gen_mov_tl(cpu_cc_src, src1);  
622 - tcg_gen_mov_tl(cpu_cc_src2, src2);  
623 - tcg_gen_sub_tl(cpu_cc_dst, cpu_cc_src, cpu_cc_src2);  
624 gen_cc_clear_icc(); 655 gen_cc_clear_icc();
625 gen_cc_NZ_icc(cpu_cc_dst); 656 gen_cc_NZ_icc(cpu_cc_dst);
626 gen_cc_C_sub_icc(cpu_cc_src, cpu_cc_src2); 657 gen_cc_C_sub_icc(cpu_cc_src, cpu_cc_src2);
@@ -634,10 +665,39 @@ static inline void gen_op_sub_cc(TCGv dst, TCGv src1, TCGv src2) @@ -634,10 +665,39 @@ static inline void gen_op_sub_cc(TCGv dst, TCGv src1, TCGv src2)
634 tcg_gen_mov_tl(dst, cpu_cc_dst); 665 tcg_gen_mov_tl(dst, cpu_cc_dst);
635 } 666 }
636 667
637 -static inline void gen_op_subx_cc(TCGv dst, TCGv src1, TCGv src2) 668 +static inline void gen_op_subi_cc(TCGv dst, TCGv src1, target_long src2)
  669 +{
  670 + tcg_gen_mov_tl(cpu_cc_src, src1);
  671 + tcg_gen_movi_tl(cpu_cc_src2, src2);
  672 + tcg_gen_subi_tl(cpu_cc_dst, cpu_cc_src, src2);
  673 + gen_op_sub_cc2(dst);
  674 +}
  675 +
  676 +static inline void gen_op_sub_cc(TCGv dst, TCGv src1, TCGv src2)
638 { 677 {
639 tcg_gen_mov_tl(cpu_cc_src, src1); 678 tcg_gen_mov_tl(cpu_cc_src, src1);
640 tcg_gen_mov_tl(cpu_cc_src2, src2); 679 tcg_gen_mov_tl(cpu_cc_src2, src2);
  680 + tcg_gen_sub_tl(cpu_cc_dst, cpu_cc_src, cpu_cc_src2);
  681 + gen_op_sub_cc2(dst);
  682 +}
  683 +
  684 +static inline void gen_op_subx_cc2(TCGv dst)
  685 +{
  686 + gen_cc_NZ_icc(cpu_cc_dst);
  687 + gen_cc_C_sub_icc(cpu_cc_dst, cpu_cc_src);
  688 + gen_cc_V_sub_icc(cpu_cc_dst, cpu_cc_src, cpu_cc_src2);
  689 +#ifdef TARGET_SPARC64
  690 + gen_cc_NZ_xcc(cpu_cc_dst);
  691 + gen_cc_C_sub_xcc(cpu_cc_dst, cpu_cc_src);
  692 + gen_cc_V_sub_xcc(cpu_cc_dst, cpu_cc_src, cpu_cc_src2);
  693 +#endif
  694 + tcg_gen_mov_tl(dst, cpu_cc_dst);
  695 +}
  696 +
  697 +static inline void gen_op_subxi_cc(TCGv dst, TCGv src1, target_long src2)
  698 +{
  699 + tcg_gen_mov_tl(cpu_cc_src, src1);
  700 + tcg_gen_movi_tl(cpu_cc_src2, src2);
641 gen_mov_reg_C(cpu_tmp0, cpu_psr); 701 gen_mov_reg_C(cpu_tmp0, cpu_psr);
642 tcg_gen_sub_tl(cpu_cc_dst, cpu_cc_src, cpu_tmp0); 702 tcg_gen_sub_tl(cpu_cc_dst, cpu_cc_src, cpu_tmp0);
643 gen_cc_clear_icc(); 703 gen_cc_clear_icc();
@@ -646,16 +706,24 @@ static inline void gen_op_subx_cc(TCGv dst, TCGv src1, TCGv src2) @@ -646,16 +706,24 @@ static inline void gen_op_subx_cc(TCGv dst, TCGv src1, TCGv src2)
646 gen_cc_clear_xcc(); 706 gen_cc_clear_xcc();
647 gen_cc_C_sub_xcc(cpu_cc_dst, cpu_cc_src); 707 gen_cc_C_sub_xcc(cpu_cc_dst, cpu_cc_src);
648 #endif 708 #endif
649 - tcg_gen_sub_tl(cpu_cc_dst, cpu_cc_dst, cpu_cc_src2);  
650 - gen_cc_NZ_icc(cpu_cc_dst); 709 + tcg_gen_subi_tl(cpu_cc_dst, cpu_cc_dst, src2);
  710 + gen_op_subx_cc2(dst);
  711 +}
  712 +
  713 +static inline void gen_op_subx_cc(TCGv dst, TCGv src1, TCGv src2)
  714 +{
  715 + tcg_gen_mov_tl(cpu_cc_src, src1);
  716 + tcg_gen_mov_tl(cpu_cc_src2, src2);
  717 + gen_mov_reg_C(cpu_tmp0, cpu_psr);
  718 + tcg_gen_sub_tl(cpu_cc_dst, cpu_cc_src, cpu_tmp0);
  719 + gen_cc_clear_icc();
651 gen_cc_C_sub_icc(cpu_cc_dst, cpu_cc_src); 720 gen_cc_C_sub_icc(cpu_cc_dst, cpu_cc_src);
652 - gen_cc_V_sub_icc(cpu_cc_dst, cpu_cc_src, cpu_cc_src2);  
653 #ifdef TARGET_SPARC64 721 #ifdef TARGET_SPARC64
654 - gen_cc_NZ_xcc(cpu_cc_dst); 722 + gen_cc_clear_xcc();
655 gen_cc_C_sub_xcc(cpu_cc_dst, cpu_cc_src); 723 gen_cc_C_sub_xcc(cpu_cc_dst, cpu_cc_src);
656 - gen_cc_V_sub_xcc(cpu_cc_dst, cpu_cc_src, cpu_cc_src2);  
657 #endif 724 #endif
658 - tcg_gen_mov_tl(dst, cpu_cc_dst); 725 + tcg_gen_sub_tl(cpu_cc_dst, cpu_cc_dst, cpu_cc_src2);
  726 + gen_op_subx_cc2(dst);
659 } 727 }
660 728
661 static inline void gen_op_tsub_cc(TCGv dst, TCGv src1, TCGv src2) 729 static inline void gen_op_tsub_cc(TCGv dst, TCGv src1, TCGv src2)
@@ -3064,65 +3132,132 @@ static void disas_sparc_insn(DisasContext * dc) @@ -3064,65 +3132,132 @@ static void disas_sparc_insn(DisasContext * dc)
3064 gen_movl_TN_reg(rd, cpu_dst); 3132 gen_movl_TN_reg(rd, cpu_dst);
3065 #endif 3133 #endif
3066 } else if (xop < 0x36) { 3134 } else if (xop < 0x36) {
3067 - cpu_src1 = get_src1(insn, cpu_src1);  
3068 - cpu_src2 = get_src2(insn, cpu_src2);  
3069 if (xop < 0x20) { 3135 if (xop < 0x20) {
  3136 + cpu_src1 = get_src1(insn, cpu_src1);
  3137 + cpu_src2 = get_src2(insn, cpu_src2);
3070 switch (xop & ~0x10) { 3138 switch (xop & ~0x10) {
3071 case 0x0: 3139 case 0x0:
3072 - if (xop & 0x10)  
3073 - gen_op_add_cc(cpu_dst, cpu_src1, cpu_src2);  
3074 - else  
3075 - tcg_gen_add_tl(cpu_dst, cpu_src1, cpu_src2); 3140 + if (IS_IMM) {
  3141 + simm = GET_FIELDs(insn, 19, 31);
  3142 + if (xop & 0x10) {
  3143 + gen_op_addi_cc(cpu_dst, cpu_src1, simm);
  3144 + } else {
  3145 + tcg_gen_addi_tl(cpu_dst, cpu_src1, simm);
  3146 + }
  3147 + } else {
  3148 + if (xop & 0x10) {
  3149 + gen_op_add_cc(cpu_dst, cpu_src1, cpu_src2);
  3150 + } else {
  3151 + tcg_gen_add_tl(cpu_dst, cpu_src1, cpu_src2);
  3152 + }
  3153 + }
3076 break; 3154 break;
3077 case 0x1: 3155 case 0x1:
3078 - tcg_gen_and_tl(cpu_dst, cpu_src1, cpu_src2);  
3079 - if (xop & 0x10) 3156 + if (IS_IMM) {
  3157 + simm = GET_FIELDs(insn, 19, 31);
  3158 + tcg_gen_andi_tl(cpu_dst, cpu_src1, simm);
  3159 + } else {
  3160 + tcg_gen_and_tl(cpu_dst, cpu_src1, cpu_src2);
  3161 + }
  3162 + if (xop & 0x10) {
3080 gen_op_logic_cc(cpu_dst); 3163 gen_op_logic_cc(cpu_dst);
  3164 + }
3081 break; 3165 break;
3082 case 0x2: 3166 case 0x2:
3083 - tcg_gen_or_tl(cpu_dst, cpu_src1, cpu_src2); 3167 + if (IS_IMM) {
  3168 + simm = GET_FIELDs(insn, 19, 31);
  3169 + tcg_gen_ori_tl(cpu_dst, cpu_src1, simm);
  3170 + } else {
  3171 + tcg_gen_or_tl(cpu_dst, cpu_src1, cpu_src2);
  3172 + }
3084 if (xop & 0x10) 3173 if (xop & 0x10)
3085 gen_op_logic_cc(cpu_dst); 3174 gen_op_logic_cc(cpu_dst);
3086 break; 3175 break;
3087 case 0x3: 3176 case 0x3:
3088 - tcg_gen_xor_tl(cpu_dst, cpu_src1, cpu_src2); 3177 + if (IS_IMM) {
  3178 + simm = GET_FIELDs(insn, 19, 31);
  3179 + tcg_gen_xori_tl(cpu_dst, cpu_src1, simm);
  3180 + } else {
  3181 + tcg_gen_xor_tl(cpu_dst, cpu_src1, cpu_src2);
  3182 + }
3089 if (xop & 0x10) 3183 if (xop & 0x10)
3090 gen_op_logic_cc(cpu_dst); 3184 gen_op_logic_cc(cpu_dst);
3091 break; 3185 break;
3092 case 0x4: 3186 case 0x4:
3093 - if (xop & 0x10)  
3094 - gen_op_sub_cc(cpu_dst, cpu_src1, cpu_src2);  
3095 - else  
3096 - tcg_gen_sub_tl(cpu_dst, cpu_src1, cpu_src2); 3187 + if (IS_IMM) {
  3188 + simm = GET_FIELDs(insn, 19, 31);
  3189 + if (xop & 0x10) {
  3190 + gen_op_subi_cc(cpu_dst, cpu_src1, simm);
  3191 + } else {
  3192 + tcg_gen_subi_tl(cpu_dst, cpu_src1, simm);
  3193 + }
  3194 + } else {
  3195 + if (xop & 0x10) {
  3196 + gen_op_sub_cc(cpu_dst, cpu_src1, cpu_src2);
  3197 + } else {
  3198 + tcg_gen_sub_tl(cpu_dst, cpu_src1, cpu_src2);
  3199 + }
  3200 + }
3097 break; 3201 break;
3098 case 0x5: 3202 case 0x5:
3099 - tcg_gen_andc_tl(cpu_dst, cpu_src1, cpu_src2); 3203 + if (IS_IMM) {
  3204 + simm = GET_FIELDs(insn, 19, 31);
  3205 + tcg_gen_andi_tl(cpu_dst, cpu_src1, ~simm);
  3206 + } else {
  3207 + tcg_gen_andc_tl(cpu_dst, cpu_src1, cpu_src2);
  3208 + }
3100 if (xop & 0x10) 3209 if (xop & 0x10)
3101 gen_op_logic_cc(cpu_dst); 3210 gen_op_logic_cc(cpu_dst);
3102 break; 3211 break;
3103 case 0x6: 3212 case 0x6:
3104 - tcg_gen_orc_tl(cpu_dst, cpu_src1, cpu_src2); 3213 + if (IS_IMM) {
  3214 + simm = GET_FIELDs(insn, 19, 31);
  3215 + tcg_gen_ori_tl(cpu_dst, cpu_src1, ~simm);
  3216 + } else {
  3217 + tcg_gen_orc_tl(cpu_dst, cpu_src1, cpu_src2);
  3218 + }
3105 if (xop & 0x10) 3219 if (xop & 0x10)
3106 gen_op_logic_cc(cpu_dst); 3220 gen_op_logic_cc(cpu_dst);
3107 break; 3221 break;
3108 case 0x7: 3222 case 0x7:
3109 - tcg_gen_not_tl(cpu_tmp0, cpu_src2);  
3110 - tcg_gen_xor_tl(cpu_dst, cpu_src1, cpu_tmp0); 3223 + if (IS_IMM) {
  3224 + simm = GET_FIELDs(insn, 19, 31);
  3225 + tcg_gen_xori_tl(cpu_dst, cpu_src1, ~simm);
  3226 + } else {
  3227 + tcg_gen_not_tl(cpu_tmp0, cpu_src2);
  3228 + tcg_gen_xor_tl(cpu_dst, cpu_src1, cpu_tmp0);
  3229 + }
3111 if (xop & 0x10) 3230 if (xop & 0x10)
3112 gen_op_logic_cc(cpu_dst); 3231 gen_op_logic_cc(cpu_dst);
3113 break; 3232 break;
3114 case 0x8: 3233 case 0x8:
3115 - if (xop & 0x10)  
3116 - gen_op_addx_cc(cpu_dst, cpu_src1, cpu_src2);  
3117 - else {  
3118 - gen_mov_reg_C(cpu_tmp0, cpu_psr);  
3119 - tcg_gen_add_tl(cpu_tmp0, cpu_src2, cpu_tmp0);  
3120 - tcg_gen_add_tl(cpu_dst, cpu_src1, cpu_tmp0); 3234 + if (IS_IMM) {
  3235 + simm = GET_FIELDs(insn, 19, 31);
  3236 + if (xop & 0x10)
  3237 + gen_op_addxi_cc(cpu_dst, cpu_src1, simm);
  3238 + else {
  3239 + gen_mov_reg_C(cpu_tmp0, cpu_psr);
  3240 + tcg_gen_addi_tl(cpu_tmp0, cpu_tmp0, simm);
  3241 + tcg_gen_add_tl(cpu_dst, cpu_src1, cpu_tmp0);
  3242 + }
  3243 + } else {
  3244 + if (xop & 0x10)
  3245 + gen_op_addx_cc(cpu_dst, cpu_src1, cpu_src2);
  3246 + else {
  3247 + gen_mov_reg_C(cpu_tmp0, cpu_psr);
  3248 + tcg_gen_add_tl(cpu_tmp0, cpu_src2, cpu_tmp0);
  3249 + tcg_gen_add_tl(cpu_dst, cpu_src1, cpu_tmp0);
  3250 + }
3121 } 3251 }
3122 break; 3252 break;
3123 #ifdef TARGET_SPARC64 3253 #ifdef TARGET_SPARC64
3124 case 0x9: /* V9 mulx */ 3254 case 0x9: /* V9 mulx */
3125 - tcg_gen_mul_i64(cpu_dst, cpu_src1, cpu_src2); 3255 + if (IS_IMM) {
  3256 + simm = GET_FIELDs(insn, 19, 31);
  3257 + tcg_gen_muli_i64(cpu_dst, cpu_src1, simm);
  3258 + } else {
  3259 + tcg_gen_mul_i64(cpu_dst, cpu_src1, cpu_src2);
  3260 + }
3126 break; 3261 break;
3127 #endif 3262 #endif
3128 case 0xa: 3263 case 0xa:
@@ -3138,12 +3273,23 @@ static void disas_sparc_insn(DisasContext * dc) @@ -3138,12 +3273,23 @@ static void disas_sparc_insn(DisasContext * dc)
3138 gen_op_logic_cc(cpu_dst); 3273 gen_op_logic_cc(cpu_dst);
3139 break; 3274 break;
3140 case 0xc: 3275 case 0xc:
3141 - if (xop & 0x10)  
3142 - gen_op_subx_cc(cpu_dst, cpu_src1, cpu_src2);  
3143 - else {  
3144 - gen_mov_reg_C(cpu_tmp0, cpu_psr);  
3145 - tcg_gen_add_tl(cpu_tmp0, cpu_src2, cpu_tmp0);  
3146 - tcg_gen_sub_tl(cpu_dst, cpu_src1, cpu_tmp0); 3276 + if (IS_IMM) {
  3277 + simm = GET_FIELDs(insn, 19, 31);
  3278 + if (xop & 0x10) {
  3279 + gen_op_subxi_cc(cpu_dst, cpu_src1, simm);
  3280 + } else {
  3281 + gen_mov_reg_C(cpu_tmp0, cpu_psr);
  3282 + tcg_gen_addi_tl(cpu_tmp0, cpu_tmp0, simm);
  3283 + tcg_gen_sub_tl(cpu_dst, cpu_src1, cpu_tmp0);
  3284 + }
  3285 + } else {
  3286 + if (xop & 0x10) {
  3287 + gen_op_subx_cc(cpu_dst, cpu_src1, cpu_src2);
  3288 + } else {
  3289 + gen_mov_reg_C(cpu_tmp0, cpu_psr);
  3290 + tcg_gen_add_tl(cpu_tmp0, cpu_src2, cpu_tmp0);
  3291 + tcg_gen_sub_tl(cpu_dst, cpu_src1, cpu_tmp0);
  3292 + }
3147 } 3293 }
3148 break; 3294 break;
3149 #ifdef TARGET_SPARC64 3295 #ifdef TARGET_SPARC64
@@ -3171,6 +3317,8 @@ static void disas_sparc_insn(DisasContext * dc) @@ -3171,6 +3317,8 @@ static void disas_sparc_insn(DisasContext * dc)
3171 } 3317 }
3172 gen_movl_TN_reg(rd, cpu_dst); 3318 gen_movl_TN_reg(rd, cpu_dst);
3173 } else { 3319 } else {
  3320 + cpu_src1 = get_src1(insn, cpu_src1);
  3321 + cpu_src2 = get_src2(insn, cpu_src2);
3174 switch (xop) { 3322 switch (xop) {
3175 case 0x20: /* taddcc */ 3323 case 0x20: /* taddcc */
3176 gen_op_tadd_cc(cpu_dst, cpu_src1, cpu_src2); 3324 gen_op_tadd_cc(cpu_dst, cpu_src1, cpu_src2);