[PATCH v7] Practical improvement to libgcc complex divide

Joseph Myers joseph@codesourcery.com
Fri Feb 19 21:27:22 GMT 2021


On Tue, 2 Feb 2021, Patrick McGehearty via Gcc-patches wrote:

>  	  if (mode == TYPE_MODE (double_type_node))
> -	    ; /* Empty suffix correct.  */
> +	    {
> +	      ; /* Empty suffix correct.  */
> +	      memcpy (modename, "DBL", 4);
> +	    }
>  	  else if (mode == TYPE_MODE (float_type_node))
> -	    suffix[0] = 'f';
> +	    {
> +	      suffix[0] = 'f';
> +	      memcpy (modename, "FLT", 4);
> +	    }
>  	  else if (mode == TYPE_MODE (long_double_type_node))
> -	    suffix[0] = 'l';
> +	    {
> +	      suffix[0] = 'l';
> +	      memcpy (modename, "LDBL", 4);
> +	    }
>  	  else
>  	    {
>  	      bool found_suffix = false;
> @@ -1305,6 +1316,8 @@ c_cpp_builtins (cpp_reader *pfile)
>  		    sprintf (suffix, "f%d%s", floatn_nx_types[i].n,
>  			     floatn_nx_types[i].extended ? "x" : "");
>  		    found_suffix = true;
> +		    sprintf (modename, "FLT%d%s", floatn_nx_types[i].n,
> +			     floatn_nx_types[i].extended ? "X" : "");
>  		    break;
>  		  }
>  	      gcc_assert (found_suffix);

Here you're properly computing the mapping from mode to float.h macro 
prefix (though I think "modename" is a confusing name for the variable 
used for float.h macro prefixes; to me, "modename" suggests the names such 
as SF or DF, which are actually "name" here, and something like 
"float_h_prefix" would be better than "modename").

> +	  if ((mode == TYPE_MODE (float_type_node))
> +	      || (mode == TYPE_MODE (double_type_node))
> +	      || (mode == TYPE_MODE (long_double_type_node)))

But then here you still have the check for the mode matching one of those 
three types, which defeats the point of computing the prefix in a way that 
works for *all* floating-point modes supported in libgcc.  (The above 
"gcc_assert (found_suffix)" asserts that the relevant mapping did get 
found.)

To be able to use the __LIBGCC_* macros in libgcc in all cases, they 
should be defined, using the modename (or float_h_prefix) found above, 
whether or not the mode matches one of float, double and long double.

>  #elif defined(L_multc3) || defined(L_divtc3)
>  # define MTYPE	TFtype
>  # define CTYPE	TCtype
>  # define MODE	tc
>  # define CEXT	__LIBGCC_TF_FUNC_EXT__
>  # define NOTRUNC (!__LIBGCC_TF_EXCESS_PRECISION__)
> +#if defined(__LIBGCC_TF_MIN__)
> +# define RBIG	((__LIBGCC_TF_MAX__)/2)
> +# define RMIN	(__LIBGCC_TF_MIN__)
> +# define RMIN2	(__LIBGCC_TF_EPSILON__)
> +# define RMINSCAL (1/__LIBGCC_TF_EPSILON__)
> +#else
> +# define RBIG	((__LIBGCC_XF_MAX__)/2)
> +# define RMIN	(__LIBGCC_XF_MIN__)
> +# define RMIN2	(__LIBGCC_XF_EPSILON__)
> +# define RMINSCAL (1/__LIBGCC_XF_EPSILON__)
> +#endif

Once you've removed the unnecessary conditional above, you don't need this 
conditional on __LIBGCC_TF_MIN__ being defined either; the *TF* macros 
will always be defined when TFmode is supported in libgcc, so you never 
need to use *XF* macros instead when building TFmode code.

-- 
Joseph S. Myers
joseph@codesourcery.com


More information about the Gcc-patches mailing list