@@ -693,22 +693,76 @@ static void gen_op_sdivx(TCGv dst, TCGv src1, TCGv src2)
693
693
694
694
static void gen_op_udiv (TCGv dst , TCGv src1 , TCGv src2 )
695
695
{
696
+ #ifdef TARGET_SPARC64
696
697
gen_helper_udiv (dst , tcg_env , src1 , src2 );
698
+ tcg_gen_ext32u_tl (dst , dst );
699
+ #else
700
+ TCGv_i64 t64 = tcg_temp_new_i64 ();
701
+ gen_helper_udiv (t64 , tcg_env , src1 , src2 );
702
+ tcg_gen_trunc_i64_tl (dst , t64 );
703
+ #endif
697
704
}
698
705
699
706
static void gen_op_sdiv (TCGv dst , TCGv src1 , TCGv src2 )
700
707
{
708
+ #ifdef TARGET_SPARC64
701
709
gen_helper_sdiv (dst , tcg_env , src1 , src2 );
710
+ tcg_gen_ext32s_tl (dst , dst );
711
+ #else
712
+ TCGv_i64 t64 = tcg_temp_new_i64 ();
713
+ gen_helper_sdiv (t64 , tcg_env , src1 , src2 );
714
+ tcg_gen_trunc_i64_tl (dst , t64 );
715
+ #endif
702
716
}
703
717
704
718
static void gen_op_udivcc (TCGv dst , TCGv src1 , TCGv src2 )
705
719
{
706
- gen_helper_udiv_cc (dst , tcg_env , src1 , src2 );
720
+ TCGv_i64 t64 ;
721
+
722
+ #ifdef TARGET_SPARC64
723
+ t64 = cpu_cc_V ;
724
+ #else
725
+ t64 = tcg_temp_new_i64 ();
726
+ #endif
727
+
728
+ gen_helper_udiv (t64 , tcg_env , src1 , src2 );
729
+
730
+ #ifdef TARGET_SPARC64
731
+ tcg_gen_ext32u_tl (cpu_cc_N , t64 );
732
+ tcg_gen_shri_tl (cpu_cc_V , t64 , 32 );
733
+ tcg_gen_mov_tl (cpu_icc_Z , cpu_cc_N );
734
+ tcg_gen_movi_tl (cpu_icc_C , 0 );
735
+ #else
736
+ tcg_gen_extr_i64_tl (cpu_cc_N , cpu_cc_V , t64 );
737
+ #endif
738
+ tcg_gen_mov_tl (cpu_cc_Z , cpu_cc_N );
739
+ tcg_gen_movi_tl (cpu_cc_C , 0 );
740
+ tcg_gen_mov_tl (dst , cpu_cc_N );
707
741
}
708
742
709
743
static void gen_op_sdivcc (TCGv dst , TCGv src1 , TCGv src2 )
710
744
{
711
- gen_helper_sdiv_cc (dst , tcg_env , src1 , src2 );
745
+ TCGv_i64 t64 ;
746
+
747
+ #ifdef TARGET_SPARC64
748
+ t64 = cpu_cc_V ;
749
+ #else
750
+ t64 = tcg_temp_new_i64 ();
751
+ #endif
752
+
753
+ gen_helper_sdiv (t64 , tcg_env , src1 , src2 );
754
+
755
+ #ifdef TARGET_SPARC64
756
+ tcg_gen_ext32s_tl (cpu_cc_N , t64 );
757
+ tcg_gen_shri_tl (cpu_cc_V , t64 , 32 );
758
+ tcg_gen_mov_tl (cpu_icc_Z , cpu_cc_N );
759
+ tcg_gen_movi_tl (cpu_icc_C , 0 );
760
+ #else
761
+ tcg_gen_extr_i64_tl (cpu_cc_N , cpu_cc_V , t64 );
762
+ #endif
763
+ tcg_gen_mov_tl (cpu_cc_Z , cpu_cc_N );
764
+ tcg_gen_movi_tl (cpu_cc_C , 0 );
765
+ tcg_gen_mov_tl (dst , cpu_cc_N );
712
766
}
713
767
714
768
static void gen_op_taddcctv (TCGv dst , TCGv src1 , TCGv src2 )
@@ -3717,8 +3771,8 @@ TRANS(SMUL, MUL, do_logic, a, gen_op_smul, NULL)
3717
3771
3718
3772
TRANS (UDIVX , 64 , do_arith , a , -1 , gen_op_udivx , NULL , NULL )
3719
3773
TRANS (SDIVX , 64 , do_arith , a , -1 , gen_op_sdivx , NULL , NULL )
3720
- TRANS (UDIV , DIV , do_arith , a , CC_OP_DIV , gen_op_udiv , NULL , gen_op_udivcc )
3721
- TRANS (SDIV , DIV , do_arith , a , CC_OP_DIV , gen_op_sdiv , NULL , gen_op_sdivcc )
3774
+ TRANS (UDIV , DIV , do_arith , a , CC_OP_FLAGS , gen_op_udiv , NULL , gen_op_udivcc )
3775
+ TRANS (SDIV , DIV , do_arith , a , CC_OP_FLAGS , gen_op_sdiv , NULL , gen_op_sdivcc )
3722
3776
3723
3777
/* TODO: Should have feature bit -- comes in with UltraSparc T2. */
3724
3778
TRANS (POPC , 64 , do_arith , a , -1 , gen_op_popc , NULL , NULL )
@@ -3743,10 +3797,6 @@ static bool trans_OR(DisasContext *dc, arg_r_r_ri_cc *a)
3743
3797
static bool trans_ADDC (DisasContext * dc , arg_r_r_ri_cc * a )
3744
3798
{
3745
3799
switch (dc -> cc_op ) {
3746
- case CC_OP_DIV :
3747
- /* Carry is known to be zero. Fall back to plain ADD. */
3748
- return do_arith (dc , a , CC_OP_ADD ,
3749
- tcg_gen_add_tl , tcg_gen_addi_tl , gen_op_add_cc );
3750
3800
case CC_OP_ADD :
3751
3801
case CC_OP_TADD :
3752
3802
case CC_OP_TADDTV :
@@ -3766,10 +3816,6 @@ static bool trans_ADDC(DisasContext *dc, arg_r_r_ri_cc *a)
3766
3816
static bool trans_SUBC (DisasContext * dc , arg_r_r_ri_cc * a )
3767
3817
{
3768
3818
switch (dc -> cc_op ) {
3769
- case CC_OP_DIV :
3770
- /* Carry is known to be zero. Fall back to plain SUB. */
3771
- return do_arith (dc , a , CC_OP_SUB ,
3772
- tcg_gen_sub_tl , tcg_gen_subi_tl , gen_op_sub_cc );
3773
3819
case CC_OP_ADD :
3774
3820
case CC_OP_TADD :
3775
3821
case CC_OP_TADDTV :
0 commit comments