This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: __sdivsi3_i4i and __udivsi3_i4i called for sh2 variant.


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]