Patchwork __sdivsi3_i4i and __udivsi3_i4i called for sh2 variant.

login
register
mail settings
Submitter Yoshinori Sato
Date March 4, 2013, 6:55 a.m.
Message ID <87hakrejrk.wl%ysato@users.sourceforge.jp>
Download mbox | patch
Permalink /patch/224599/
State New
Headers show

Comments

Yoshinori Sato - March 4, 2013, 6:55 a.m.
It function called to divide operator.
But libgcc.a is not include it helper functions.

This patch is included those functions.
Oleg Endo - March 4, 2013, 11:15 p.m.
Hi,

On Mon, 2013-03-04 at 15:55 +0900, Yoshinori Sato wrote:
> It function called to divide operator.
> But libgcc.a is not include it helper functions.
> 
> This patch is included those functions.
> 
> diff -ru gcc-4.7.2.org/gcc/config.gcc gcc-4.7.2/gcc/config.gcc
> --- gcc-4.7.2.org/gcc/config.gcc	2012-09-12 18:03:54.000000000 +0900
> +++ gcc-4.7.2/gcc/config.gcc	2013-03-03 03:12:41.000000000 +0900
> @@ -2338,7 +2338,7 @@
>  		sh[1234]*)	sh_multilibs=${sh_cpu_target} ;;
>  		sh64* | sh5*)	sh_multilibs=m5-32media,m5-32media-nofpu,m5-compact,m5-compact-nofpu,m5-64media,m5-64media-nofpu ;;
>  		sh-superh-*)	sh_multilibs=m4,m4-single,m4-single-only,m4-nofpu ;;
> -		sh*-*-linux*)	sh_multilibs=m1,m3e,m4 ;;
> +		sh*-*-linux*)	sh_multilibs=m1,m2,m3e,m4 ;;
>  		sh*-*-netbsd*)	sh_multilibs=m3,m3e,m4 ;;
>  		*) sh_multilibs=m1,m2,m2e,m4,m4-single,m4-single-only,m2a,m2a-single ;;
>  		esac

I think in this case, we might at well add SH2A to the multilib list.

> diff -ru gcc-4.7.2.org/libgcc/config/sh/lib1funcs.S gcc-4.7.2/libgcc/config/sh/lib1funcs.S
> --- gcc-4.7.2.org/libgcc/config/sh/lib1funcs.S	2011-11-03 00:03:19.000000000 +0900
> +++ gcc-4.7.2/libgcc/config/sh/lib1funcs.S	2013-03-03 03:29:32.000000000 +0900
> @@ -3255,8 +3255,8 @@
>  	.word	17136
>  	.word	16639
>  
> -#elif defined (__SH3__) || defined (__SH3E__) || defined (__SH4__) || defined (__SH4_SINGLE__) || defined (__SH4_SINGLE_ONLY__) || defined (__SH4_NOFPU__)
> -/* This code used shld, thus is not suitable for SH1 / SH2.  */
> +#elif defined (__sh2__) || defined (__SH3__) || defined (__SH3E__) || defined (__SH4__) || defined (__SH4_SINGLE__) || defined (__SH4_SINGLE_ONLY__) || defined (__SH4_NOFPU__)
> +/* This code used shld, thus is not suitable for SH1.  */
>  
>  /* Signed / unsigned division without use of FPU, optimized for SH4.
>     Uses a lookup table for divisors in the range -128 .. +128, and

The code that you have enabled in lib1funcs.S will utilize dynamic shift
instructions, which are not available on SH1 or SH2.  Maybe your target
HW is SH2A which has dynamic shift instructions and you haven't noticed
a problem?
Adding __SH2A__ instead of __SH2__ should be fine though.

If I'm not mistaken, the __sdivsi3_i4i and __udivsi3_i4i division
functions will be used by the compiler if the -mdiv=call-table option is
used.  The compiler should reject 'call-table' for SH targets that don't
have dynamic shifts ... in sh.c there is a check...

      else if (! strcmp (sh_div_str, "call-table") && TARGET_SH2)
	sh_div_strategy = SH_DIV_CALL_TABLE;

... which is not quite complete.
I will prepare a patch for this.

Cheers,
Oleg
Oleg Endo - March 4, 2013, 11:38 p.m.
On Tue, 2013-03-05 at 00:15 +0100, Oleg Endo wrote:
> Hi,
> 
> On Mon, 2013-03-04 at 15:55 +0900, Yoshinori Sato wrote:
> > It function called to divide operator.
> > But libgcc.a is not include it helper functions.
> > 
> > This patch is included those functions.
> > 
> > diff -ru gcc-4.7.2.org/gcc/config.gcc gcc-4.7.2/gcc/config.gcc
> > --- gcc-4.7.2.org/gcc/config.gcc	2012-09-12 18:03:54.000000000 +0900
> > +++ gcc-4.7.2/gcc/config.gcc	2013-03-03 03:12:41.000000000 +0900
> > @@ -2338,7 +2338,7 @@
> >  		sh[1234]*)	sh_multilibs=${sh_cpu_target} ;;
> >  		sh64* | sh5*)	sh_multilibs=m5-32media,m5-32media-nofpu,m5-compact,m5-compact-nofpu,m5-64media,m5-64media-nofpu ;;
> >  		sh-superh-*)	sh_multilibs=m4,m4-single,m4-single-only,m4-nofpu ;;
> > -		sh*-*-linux*)	sh_multilibs=m1,m3e,m4 ;;
> > +		sh*-*-linux*)	sh_multilibs=m1,m2,m3e,m4 ;;
> >  		sh*-*-netbsd*)	sh_multilibs=m3,m3e,m4 ;;
> >  		*) sh_multilibs=m1,m2,m2e,m4,m4-single,m4-single-only,m2a,m2a-single ;;
> >  		esac
> 
> I think in this case, we might at well add SH2A to the multilib list.
> 
> > diff -ru gcc-4.7.2.org/libgcc/config/sh/lib1funcs.S gcc-4.7.2/libgcc/config/sh/lib1funcs.S
> > --- gcc-4.7.2.org/libgcc/config/sh/lib1funcs.S	2011-11-03 00:03:19.000000000 +0900
> > +++ gcc-4.7.2/libgcc/config/sh/lib1funcs.S	2013-03-03 03:29:32.000000000 +0900
> > @@ -3255,8 +3255,8 @@
> >  	.word	17136
> >  	.word	16639
> >  
> > -#elif defined (__SH3__) || defined (__SH3E__) || defined (__SH4__) || defined (__SH4_SINGLE__) || defined (__SH4_SINGLE_ONLY__) || defined (__SH4_NOFPU__)
> > -/* This code used shld, thus is not suitable for SH1 / SH2.  */
> > +#elif defined (__sh2__) || defined (__SH3__) || defined (__SH3E__) || defined (__SH4__) || defined (__SH4_SINGLE__) || defined (__SH4_SINGLE_ONLY__) || defined (__SH4_NOFPU__)
> > +/* This code used shld, thus is not suitable for SH1.  */
> >  
> >  /* Signed / unsigned division without use of FPU, optimized for SH4.
> >     Uses a lookup table for divisors in the range -128 .. +128, and
> 
> The code that you have enabled in lib1funcs.S will utilize dynamic shift
> instructions, which are not available on SH1 or SH2.  Maybe your target
> HW is SH2A which has dynamic shift instructions and you haven't noticed
> a problem?
> Adding __SH2A__ instead of __SH2__ should be fine though.
> 
> If I'm not mistaken, the __sdivsi3_i4i and __udivsi3_i4i division
> functions will be used by the compiler if the -mdiv=call-table option is
> used.  The compiler should reject 'call-table' for SH targets that don't
> have dynamic shifts ... in sh.c there is a check...
> 
>       else if (! strcmp (sh_div_str, "call-table") && TARGET_SH2)
> 	sh_div_strategy = SH_DIV_CALL_TABLE;
> 
> ... which is not quite complete.
> I will prepare a patch for this.
> 

...and before that, open a new PR 56529.

Cheers,
Oleg
Yoshinori Sato - March 5, 2013, 9:02 a.m.
> >     Uses a lookup table for divisors in the range -128 .. +128, and
> 
> The code that you have enabled in lib1funcs.S will utilize dynamic shift
> instructions, which are not available on SH1 or SH2.  Maybe your target
> HW is SH2A which has dynamic shift instructions and you haven't noticed
> a problem?
> Adding __SH2A__ instead of __SH2__ should be fine though.
> 
> If I'm not mistaken, the __sdivsi3_i4i and __udivsi3_i4i division
> functions will be used by the compiler if the -mdiv=call-table option is
> used.  The compiler should reject 'call-table' for SH targets that don't
> have dynamic shifts ... in sh.c there is a check...
> 
>       else if (! strcmp (sh_div_str, "call-table") && TARGET_SH2)
> 	sh_div_strategy = SH_DIV_CALL_TABLE;
> 
> ... which is not quite complete.
> I will prepare a patch for this.
> 
> Cheers,
> Oleg
>

Patch

diff -ru gcc-4.7.2.org/gcc/config.gcc gcc-4.7.2/gcc/config.gcc
--- gcc-4.7.2.org/gcc/config.gcc	2012-09-12 18:03:54.000000000 +0900
+++ gcc-4.7.2/gcc/config.gcc	2013-03-03 03:12:41.000000000 +0900
@@ -2338,7 +2338,7 @@ 
 		sh[1234]*)	sh_multilibs=${sh_cpu_target} ;;
 		sh64* | sh5*)	sh_multilibs=m5-32media,m5-32media-nofpu,m5-compact,m5-compact-nofpu,m5-64media,m5-64media-nofpu ;;
 		sh-superh-*)	sh_multilibs=m4,m4-single,m4-single-only,m4-nofpu ;;
-		sh*-*-linux*)	sh_multilibs=m1,m3e,m4 ;;
+		sh*-*-linux*)	sh_multilibs=m1,m2,m3e,m4 ;;
 		sh*-*-netbsd*)	sh_multilibs=m3,m3e,m4 ;;
 		*) sh_multilibs=m1,m2,m2e,m4,m4-single,m4-single-only,m2a,m2a-single ;;
 		esac
diff -ru gcc-4.7.2.org/libgcc/config/sh/lib1funcs.S gcc-4.7.2/libgcc/config/sh/lib1funcs.S
--- gcc-4.7.2.org/libgcc/config/sh/lib1funcs.S	2011-11-03 00:03:19.000000000 +0900
+++ gcc-4.7.2/libgcc/config/sh/lib1funcs.S	2013-03-03 03:29:32.000000000 +0900
@@ -3255,8 +3255,8 @@ 
 	.word	17136
 	.word	16639
 
-#elif defined (__SH3__) || defined (__SH3E__) || defined (__SH4__) || defined (__SH4_SINGLE__) || defined (__SH4_SINGLE_ONLY__) || defined (__SH4_NOFPU__)
-/* This code used shld, thus is not suitable for SH1 / SH2.  */
+#elif defined (__sh2__) || defined (__SH3__) || defined (__SH3E__) || defined (__SH4__) || defined (__SH4_SINGLE__) || defined (__SH4_SINGLE_ONLY__) || defined (__SH4_NOFPU__)
+/* This code used shld, thus is not suitable for SH1.  */
 
 /* Signed / unsigned division without use of FPU, optimized for SH4.
    Uses a lookup table for divisors in the range -128 .. +128, and