[Patch 5/5] rs6000, Conversions between 128-bit integer and floating point values.

will schmidt will_schmidt@vnet.ibm.com
Fri Aug 14 18:50:08 GMT 2020


On Tue, 2020-08-11 at 12:23 -0700, Carl Love wrote:
> Segher, Will:
> 
> Patch 5 adds the 128-bit integer to/from 128-floating point
> conversions.  This patch has to invoke the routines to use the 128-bit
> hardware instructions if on Power 10 or use software routines if
> running on a pre Power 10 system via the resolve function.  
> 




>                           Carl 
> 
> -----------------------------------------------------------
> Conversions between 128-bit integer and floating point values.
> 
> gcc/ChangeLog
> 
> 2020-08-10  Carl Love  <cel@us.ibm.com>
> 	config/rs6000/rs6000.md (floatunsti<mode>2,
> 	fix_trunc<mode>ti2, fixuns_trunc<mode>ti2): Add
> 	define_insn for mode IEEE 128.

s/Add/Update/

missing floatti<mode>2



> 	libgcc/config/rs6000/fixkfi-sw.c: New file.
> 	libgcc/config/rs6000/fixkfi.c: Remove file.
> 	libgcc/config/rs6000/fixunskfi-sw.c: New file.
> 	libgcc/config/rs6000/fixunskfi.c: Remove file.

... rename to ... ?


> 	libgcc/config/rs6000/float128-hw.c (__floattikf_hw,
> 	__floatuntikf_hw, __fixkfti_hw, __fixunskfti_hw):
> 	New functions.
> 	libgcc/config/rs6000/float128-ifunc.c (SW_OR_HW_ISA3_1):
> 	New macro.
> 	(__floattikf_resolve, __floatuntikf_resolve, __fixkfti_resolve,
> 	__fixunskfti_resolve): Add resolve functions.
> 	(__floattikf, __floatuntikf, __fixkfti, __fixunskfti): New
> 	functions.
> 	libgcc/config/rs6000/float128-sed (floattitf, __floatuntitf,
> 	__fixtfti, __fixunstfti): Add editor commands to change
> 	names.
> 	libgcc/config/rs6000/float128-sed-hw (__floattitf,
> 	__floatuntitf, __fixtfti, __fixunstfti): Add editor commands
> 	to change names.


> 	libgcc/config/rs6000/floattikf-sw.c: New file.
> 	libgcc/config/rs6000/floattikf.c: Remove file.
> 	libgcc/config/rs6000/floatuntikf-sw.c: New file.
> 	libgcc/config/rs6000/floatuntikf.c: Remove file.
> 	libgcc/config/rs6000/floatuntikf-sw.c: New file.

floatuntikf-sw was so good, it was added twice.
... rename to ... ? 


> 	libgcc/config/rs6000/quaad-float128.h (__floattikf_sw,

One 'a' in quad.

> 	__floatuntikf_sw, __fixkfti_sw, __fixunskfti_sw, __floattikf_hw,
> 	__floatuntikf_hw, __fixkfti_hw, __fixunskfti_hw, __floattikf,
> 	__floatuntikf, __fixkfti, __fixunskfti):	New extern declarations.

Tab in there that should not be.


> 	libgcc/config/rs6000/t-float128 (floattikf, floatuntikf,
> 	fixkfti, fixunskfti): Remove file names from fp128_ppc_funcs.
> 	(floattikf-sw, floatuntikf-sw, fixkfti-sw, fixunskfti-sw): Add
> 	file names to fp128_ppc_funcs.


Perhaps
	libgcc/config/rs6000/t-float128 (floattikf, floatuntikf,
 	fixkfti, fixunskfti): Rename to (floattikf-sw, floatuntikf-sw, 
	fixkfti-sw, fixunskfti-sw)



> 
> gcc/testsuite/ChangeLog
> 
> 2020-08-10  Carl Love  <cel@us.ibm.com>
> 	gcc.target/powerpc/fl128_conversions.c: New file.

New test.  or just New.


> ---
>  gcc/config/rs6000/rs6000.md                   |  36 +++
>  .../gcc.target/powerpc/fp128_conversions.c    | 287 ++++++++++++++++++
>  .../config/rs6000/{fixkfti.c => fixkfti-sw.c} |   4 +-
>  .../rs6000/{fixunskfti.c => fixunskfti-sw.c}  |   4 +-
>  libgcc/config/rs6000/float128-hw.c            |  24 ++
>  libgcc/config/rs6000/float128-ifunc.c         |  44 ++-
>  libgcc/config/rs6000/float128-sed             |   4 +
>  libgcc/config/rs6000/float128-sed-hw          |   4 +
>  .../rs6000/{floattikf.c => floattikf-sw.c}    |   4 +-
>  .../{floatuntikf.c => floatuntikf-sw.c}       |   4 +-
>  libgcc/config/rs6000/quad-float128.h          |  17 +-
>  libgcc/config/rs6000/t-float128               |   3 +-
>  12 files changed, 415 insertions(+), 20 deletions(-)
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/fp128_conversions.c
>  rename libgcc/config/rs6000/{fixkfti.c => fixkfti-sw.c} (96%)
>  rename libgcc/config/rs6000/{fixunskfti.c => fixunskfti-sw.c} (96%)
>  rename libgcc/config/rs6000/{floattikf.c => floattikf-sw.c} (96%)
>  rename libgcc/config/rs6000/{floatuntikf.c => floatuntikf-sw.c} (96%)
> 
> diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md
> index 43b620ae1c0..3853ebd4195 100644
> --- a/gcc/config/rs6000/rs6000.md
> +++ b/gcc/config/rs6000/rs6000.md
> @@ -6390,6 +6390,42 @@
>     xscvsxddp %x0,%x1"
>    [(set_attr "type" "fp")])
> 
> +(define_insn "floatti<mode>2"
> +  [(set (match_operand:IEEE128 0 "vsx_register_operand" "=v")
> +       (float:IEEE128 (match_operand:TI 1 "vsx_register_operand" "v")))]
> +  "TARGET_POWER10"
> +{
> +  return  "xscvsqqp %0,%1";
> +}
> +  [(set_attr "type" "fp")])
> +
> +(define_insn "floatunsti<mode>2"
> +  [(set (match_operand:IEEE128 0 "vsx_register_operand" "=v")
> +       (unsigned_float:IEEE128 (match_operand:TI 1 "vsx_register_operand" "v")))]
> +  "TARGET_POWER10"
> +{
> +  return  "xscvuqqp %0,%1";
> +}
> +  [(set_attr "type" "fp")])
> +
> +(define_insn "fix_trunc<mode>ti2"
> +  [(set (match_operand:TI 0 "vsx_register_operand" "=v")
> +       (fix:TI (match_operand:IEEE128 1 "vsx_register_operand" "v")))]
> +  "TARGET_POWER10"
> +{
> +  return  "xscvqpsqz %0,%1";
> +}
> +  [(set_attr "type" "fp")])
> +
> +(define_insn "fixuns_trunc<mode>ti2"
> +  [(set (match_operand:TI 0 "vsx_register_operand" "=v")
> +       (unsigned_fix:TI (match_operand:IEEE128 1 "vsx_register_operand" "v")))]
> +  "TARGET_POWER10"
> +{
> +  return  "xscvqpuqz %0,%1";
> +}
> +  [(set_attr "type" "fp")])
> +
>  ; Allow the combiner to merge source memory operands to the conversion so that
>  ; the optimizer/register allocator doesn't try to load the value too early in a
>  ; GPR and then use store/load to move it to a FPR and suffer from a store-load

ok.

> diff --git a/gcc/testsuite/gcc.target/powerpc/fp128_conversions.c b/gcc/testsuite/gcc.target/powerpc/fp128_conversions.c
> new file mode 100644
> index 00000000000..f0336e6f1fc
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/fp128_conversions.c
> @@ -0,0 +1,287 @@
> +/* { dg-do run } */
> +/* { dg-require-effective-target power10_hw } */
> +/* { dg-options "-mdejagnu-cpu=power10" } */
> +
> +/* Check that the expected 128-bit instructions are generated if the processor
> +   supports the 128-bit integer instructions. */
> +/* { dg-final { scan-assembler-times {\mxscvsqqp\M} 1 { target { ppc_native_128bit } } } } */
> +/* { dg-final { scan-assembler-times {\mxscvuqqp\M} 1 { target { ppc_native_128bit } } } } */
> +/* { dg-final { scan-assembler-times {\mxscvqpsqz\M} 1 { target { ppc_native_128bit } } } } */
> +/* { dg-final { scan-assembler-times {\mxscvqpuqz\M} 1 { target { ppc_native_128bit } } } } */
> +
> +#include <stdio.h>
> +#include <math.h>
> +#include <fenv.h>
> +#include <stdlib.h>
> +#include <wchar.h>
> +
> +#define DEBUG 1

Turn off Debug.


> +
> +void abort (void);
> +
> +float conv_i_2_fp( long long int a)
> +{
> +  return (float) a;
> +}
> +
> +double conv_i_2_fpd( long long int a)
> +{
> +  return (double) a;
> +}
> +
> +double conv_ui_2_fpd( unsigned long long int a)
> +{
> +  return (double) a;
> +}
> +
> +__float128 conv_i128_2_fp128 (__int128_t a)
> +{
> +  // default, gen inst KF mode
> +  // -mabi=ibmlongdouble, gen inst floattiieee KF mode
> +  // -mabi=ieeelongdouble gen inst floattiieee TF mode
> +  return (__float128) a;


So..  Should this test be duplicated and updated to test both
of those -mabi=<foo> options?  And the default?


> +}
> +
> +__float128 conv_ui128_2_fp128 (__uint128_t a)
> +{
> +  // default, gen inst KF mode
> +  // -mabi=ibmlongdouble, gen inst floattiieee KF mode
> +  // -mabi=ieeelongdouble gen inst floattiieee TF mode
> +  return (__float128) a;
> +}
> +
> +__int128_t conv_fp128_2_i128 (__float128 a)
> +{
> +  // default, gen inst KF mode
> +  // -mabi=ibmlongdouble, gen inst floattiieee KF mode
> +  // -mabi=ieeelongdouble gen inst floattiieee TF mode
> +  return (__int128_t) a;
> +}
> +
> +__uint128_t conv_fp128_2_ui128 (__float128 a)
> +{
> +  // default, gen inst KF mode
> +  // -mabi=ibmlongdouble, gen inst floattiieee KF mode
> +  // -mabi=ieeelongdouble gen inst floattiieee TF mode
> +  return (__uint128_t) a;
> +}
> +
> +long double conv_i128_2_ld (__int128_t a)
> +{
> +  // default, gen call __floattitf
> +  // -mabi=ibmlongdouble, gen call __floattitf
> +  // -mabi=ieeelongdouble gen inst floattiieee TF mode
> +  return (long double) a;
> +}
> +
> +__ibm128 conv_i128_2_ibm128 (__int128_t a)
> +{
> +  // default, gen call __floattitf
> +  // -mabi=ibmlongdouble, gen call __floattitf
> +  // -mabi=ieeelongdouble, messages about uses IBM long double, no binary output

What does that mean?  What messages?  Clarify.

> +  return (__ibm128) a;
> +}
> +
> +int main()
> +{
> +	float a, expected_result_float;
> +	double b, expected_result_double;
> +	long long int c, expected_result_llint;
> +	unsigned long long int u;
> +	__int128_t d;
> +	__uint128_t u128;
> +	unsigned long long expected_result_uint128[2] ;
> +	__float128 e;
> +	long double ld;     // another 128-bit float version
> +
> +	union conv_t {
> +		float a;
> +		double b;
> +		long long int c;
> +		long long int128[2] ;
> +		unsigned long long uint128[2] ;
> +		unsigned long long int u;
> +		__int128_t d;
> +		__uint128_t u128;
> +		__float128 e;
> +		long double ld;     // another 128-bit float version
> +	} conv, conv_result;
> +
> + 
> +	c = 20;
> +	expected_result_llint = 20.00000;
> +	a = conv_i_2_fp (c);
> +
> +	if (a != expected_result_llint) {
> +#if DEBUG
> +		printf("ERROR: conv_i_2_fp(%lld) = %10.5f\n", c, a);
> +		printf("\n does not match expected_result = %10.5f\n\n",
> +				 expected_result_llint);
> + #else
> +		abort();
> +#endif
> +	}
> +
> +	c = 20;
> +	expected_result_double = 20.00000;
> +	b = conv_i_2_fpd (c);
> +
> +	if (b != expected_result_double) {
> +#if DEBUG
> +		printf("ERROR: conv_i_2_fpd(%lld) = %10.5f\n", d, b);
> +		printf("\n does not match expected_result = %10.5f\n\n",
> +				 expected_result_double);
> + #else
> +		abort();
> +#endif
> +	}
> +
> +	u = 20;
> +	expected_result_double = 20.00000;
> +	b = conv_ui_2_fpd (u);
> +
> +	if (b != expected_result_double) {
> +#if DEBUG
> +		printf("ERROR: conv_ui_2_fpd(%llu) = %10.5f\n", u, b);
> +		printf("\n does not match expected_result = %10.5f\n\n",
> +				 expected_result_double);
> + #else
> +		abort();
> +#endif
> +	}
> +
> +  /* Currently printing 128-bit float does not work correctly  */

What does that mean?   (Limitations in printing the type? Perhaps
just a comment at the printf that clarifies you are printing the
values in hex for reasons..)   Here and elsewhere.


> +  d = -3210;
> +  d = (d * 10000000000) + 9876543210;
> +  conv_result.e = conv_i128_2_fp128 (d);
> +  expected_result_uint128[1] = 0xc02bd2f9068d1160;
> +  expected_result_uint128[0] = 0x0;
> +  
> +  if ((conv_result.uint128[1] != expected_result_uint128[1])
> +		&& (conv_result.uint128[0] != expected_result_uint128[0])) {
> +#if DEBUG
> +	  printf("ERROR: conv_i128_2_fp128(-32109876543210) = (result in hex) 0x%llx %llx\n",
> +				conv.uint128[1], conv.uint128[0]);
> +	  printf("\n does not match expected_result = (result in hex) 0x%llx %llx\n\n",
> +				expected_result_uint128[1], expected_result_uint128[0]);
> + #else
> +	  abort();
> +#endif
> +	}
> +
> +  d = 123;
> +  d = (d * 10000000000) + 1234567890;
> +  conv_result.ld = conv_i128_2_fp128 (d);
> +  expected_result_uint128[1] = 0x0;
> +  expected_result_uint128[0] = 0x4271eab4c8ed2000;
> +
> +  if ((conv_result.uint128[1] != expected_result_uint128[1])
> +		&& (conv_result.uint128[0] != expected_result_uint128[0])) {
> +#if DEBUG
> +	  printf("ERROR: conv_i128_2_fp128(1231234567890) = (result in hex) 0x%llx %llx\n",
> +				conv.uint128[1], conv.uint128[0]);
> +	  printf("\n does not match expected_result = (result in hex) 0x%llx %llx\n\n",
> +				expected_result_uint128[1], expected_result_uint128[0]);
> + #else
> +	  abort();
> +#endif
> +	}
> +
> +  /* Currently printing 128-bit float does not work correctly  */
> +  u128 = 8760;
> +  u128 = (u128 * 10000000000) + 1234567890;
> +  conv_result.e = conv_ui128_2_fp128 (u128);
> +  expected_result_uint128[1] = 0x402d3eb101df8b48;
> +  expected_result_uint128[0] = 0x0;
> +
> +  if ((conv_result.uint128[1] != expected_result_uint128[1])
> +		&& (conv_result.uint128[0] != expected_result_uint128[0])) {
> +#if DEBUG
> +	  printf("ERROR: conv_ui128_2_fp128(87601234567890) = (result in hex) 0x%llx %llx\n",
> +				conv.uint128[1], conv.uint128[0]);
> +	  printf("\n does not match expected_result = (result in hex) 0x%llx %llx\n\n",
> +				expected_result_uint128[1], expected_result_uint128[0]);
> + #else
> +	  abort();
> +#endif
> +	}
> +
> +  /* Currently printing 128-bit float does not work correctly  */
> +  u128 = 3210;
> +  u128 = (u128 * 10000000000) + 9876543210;
> +  expected_result_uint128[1] = 0x402bd3429c8feea0;
> +  expected_result_uint128[0] = 0x0;
> +  conv_result.e = conv_ui128_2_fp128 (u128);
> +
> +  if ((conv_result.uint128[1] != expected_result_uint128[1])
> +		&& (conv_result.uint128[0] != expected_result_uint128[0])) {
> +#if DEBUG
> +	  printf("ERROR: conv_ui128_2_fp128(32109876543210) = (result in hex) 0x%llx %llx\n",
> +				conv.uint128[1], conv.uint128[0]);
> +	  printf("\n does not match expected_result = (result in hex) 0x%llx %llx\n\n",
> +				expected_result_uint128[1], expected_result_uint128[0]);
> + #else
> +	  abort();
> +#endif
> +	}
> +
> +  conv.e = 12345.6789;
> +  expected_result_uint128[1] = 0x1407374883526960;
> +  expected_result_uint128[0] = 0x3039;
> +
> +  conv_result.d = conv_fp128_2_i128 (conv.e);
> +
> +  if ((conv_result.uint128[1] != expected_result_uint128[1])
> +		&& (conv_result.uint128[0] != expected_result_uint128[0])) {
> +#if DEBUG
> +	  printf("ERROR: conv_fp128_2_i128(0x%llx %llx) =  ",
> +				conv.uint128[1], conv.uint128[0]);
> +	  printf("0x%llx %llx\n", conv_result.uint128[1], conv_result.uint128[0]);
> +
> +	  printf("\n does not match expected_result = (result in hex) 0x%llx %llx\n\n",
> +				expected_result_uint128[1], expected_result_uint128[0]);
> + #else
> +	  abort();
> +#endif
> +	}
> +
> +  conv.e = -6789.12345;
> +  expected_result_uint128[1] = 0x0;
> +  expected_result_uint128[0] = 0xffffffffffffe57b;
> +  conv_result.d = conv_fp128_2_i128 (conv.e);
> + 
> +  if ((conv_result.uint128[1] != expected_result_uint128[1])
> +		&& (conv_result.uint128[0] != expected_result_uint128[0])) {
> +#if DEBUG
> +	  printf("ERROR: conv_fp128_2_i128(0x%llx %llx) = ",
> +				conv.uint128[1], conv.uint128[0]);
> +	  printf("0x%llx %llx\n", conv_result.uint128[1], conv_result.uint128[0]);
> +
> +	  printf("\n does not match expected_result = (result in hex) 0x%llx %llx\n\n",
> +				expected_result_uint128[1], expected_result_uint128[0]);
> + #else
> +	  abort();
> +#endif
> +	}
> +
> +  conv.e = 6789.12345;
> +  expected_result_uint128[1] = 0x0;
> +  expected_result_uint128[0] = 0x1a85;
> +  conv_result.d = conv_fp128_2_ui128 (conv.e);
> + 
> +  if ((conv_result.uint128[1] != expected_result_uint128[1])
> +		&& (conv_result.uint128[0] != expected_result_uint128[0])) {
> +#if DEBUG
> +	  printf("ERROR: conv_fp128_2_ui128(0x%llx %llx) = ",
> +				conv.uint128[1], conv.uint128[0]);
> +	  printf("0x%llx %llx\n", conv_result.uint128[1], conv_result.uint128[0]);
> +	  
> +	  printf("\n does not match expected_result = (result in hex) 0x%llx %llx\n\n",
> +				expected_result_uint128[1], expected_result_uint128[0]);
> + #else
> +	  abort();
> +#endif
> +	}
> +
> +  return 0;
> +}

ok


> diff --git a/libgcc/config/rs6000/fixkfti.c b/libgcc/config/rs6000/fixkfti-sw.c
> similarity index 96%
> rename from libgcc/config/rs6000/fixkfti.c
> rename to libgcc/config/rs6000/fixkfti-sw.c
> index a22286228aa..d6bbbf889b7 100644
> --- a/libgcc/config/rs6000/fixkfti.c
> +++ b/libgcc/config/rs6000/fixkfti-sw.c
> @@ -5,7 +5,7 @@
>     This file is part of the GNU C Library.
>     Contributed by Steven Munroe (munroesj@linux.vnet.ibm.com)
>     Code is based on the main soft-fp library written by:
> -   	   Uros Bizjak (ubizjak@gmail.com).
> +	   Uros Bizjak (ubizjak@gmail.com).
> 
>     The GNU C Library is free software; you can redistribute it and/or
>     modify it under the terms of the GNU Lesser General Public
> @@ -35,7 +35,7 @@
>  #include "quad-float128.h"
> 
>  TItype
> -__fixkfti (TFtype a)
> +__fixkfti_sw (TFtype a)
>  {
>    FP_DECL_EX;
>    FP_DECL_Q (A);
ok

> diff --git a/libgcc/config/rs6000/fixunskfti.c b/libgcc/config/rs6000/fixunskfti-sw.c
> similarity index 96%
> rename from libgcc/config/rs6000/fixunskfti.c
> rename to libgcc/config/rs6000/fixunskfti-sw.c
> index ab232d92d24..d803936e48a 100644
> --- a/libgcc/config/rs6000/fixunskfti.c
> +++ b/libgcc/config/rs6000/fixunskfti-sw.c
> @@ -5,7 +5,7 @@
>     This file is part of the GNU C Library.
>     Contributed by Steven Munroe (munroesj@linux.vnet.ibm.com)
>     Code is based on the main soft-fp library written by:
> -   	   Uros Bizjak (ubizjak@gmail.com).
> +	   Uros Bizjak (ubizjak@gmail.com).
> 
>     The GNU C Library is free software; you can redistribute it and/or
>     modify it under the terms of the GNU Lesser General Public
> @@ -35,7 +35,7 @@
>  #include "quad-float128.h"
> 
>  UTItype
> -__fixunskfti (TFtype a)
> +__fixunskfti_sw (TFtype a)
>  {
>    FP_DECL_EX;
>    FP_DECL_Q (A);

ok

> diff --git a/libgcc/config/rs6000/float128-hw.c b/libgcc/config/rs6000/float128-hw.c
> index 8705b53e22a..be8bd07e853 100644
> --- a/libgcc/config/rs6000/float128-hw.c
> +++ b/libgcc/config/rs6000/float128-hw.c
> @@ -86,6 +86,30 @@ __floatdikf_hw (DItype_ppc a)
>    return (TFtype) a;
>  }
> 
> +TFtype
> +__floattikf_hw (TItype_ppc a)
> +{
> +  return (TFtype) a;
> +}
> +
> +TFtype
> +__floatuntikf_hw (UTItype_ppc a)
> +{
> +  return (TFtype) a;
> +}
> +
> +TItype_ppc
> +__fixkfti_hw (TFtype a)
> +{
> +  return (TItype_ppc) a;
> +}
> +
> +UTItype_ppc
> +__fixunskfti_hw (TFtype a)
> +{
> +  return (UTItype_ppc) a;
> +}
> +
>  TFtype
>  __floatundikf_hw (UDItype_ppc a)
>  {

ok.

> diff --git a/libgcc/config/rs6000/float128-ifunc.c b/libgcc/config/rs6000/float128-ifunc.c
> index c2f65912a74..c221be2c864 100644
> --- a/libgcc/config/rs6000/float128-ifunc.c
> +++ b/libgcc/config/rs6000/float128-ifunc.c
> @@ -46,14 +46,9 @@
>  #endif
> 
>  #define SW_OR_HW(SW, HW) (__builtin_cpu_supports ("ieee128") ? HW : SW)
> +#define SW_OR_HW_ISA3_1(SW, HW) (__builtin_cpu_supports ("arch_3_1") ? HW : SW)
> 
>  /* Resolvers.  */
> -
> -/* We do not provide ifunc resolvers for __fixkfti, __fixunskfti, __floattikf,
> -   and __floatuntikf.  There is no ISA 3.0 instruction that converts between
> -   128-bit integer types and 128-bit IEEE floating point, or vice versa.  So
> -   use the emulator functions for these conversions.  */
> -
>  static __typeof__ (__addkf3_sw) *
>  __addkf3_resolve (void)
>  {
> @@ -102,6 +97,18 @@ __floatdikf_resolve (void)
>    return SW_OR_HW (__floatdikf_sw, __floatdikf_hw);
>  }
> 
> +static __typeof__ (__floattikf_sw) *
> +__floattikf_resolve (void)
> +{
> +  return SW_OR_HW_ISA3_1 (__floattikf_sw, __floattikf_hw);
> +}
> +
> +static __typeof__ (__floatuntikf_sw) *
> +__floatuntikf_resolve (void)
> +{
> +  return SW_OR_HW_ISA3_1 (__floatuntikf_sw, __floatuntikf_hw);
> +}
> +
>  static __typeof__ (__floatunsikf_sw) *
>  __floatunsikf_resolve (void)
>  {
> @@ -114,6 +121,19 @@ __floatundikf_resolve (void)
>    return SW_OR_HW (__floatundikf_sw, __floatundikf_hw);
>  }
> 
> +
> +static __typeof__ (__fixkfti_sw) *
> +__fixkfti_resolve (void)
> +{
> +  return SW_OR_HW_ISA3_1 (__fixkfti_sw, __fixkfti_hw);
> +}
> +
> +static __typeof__ (__fixunskfti_sw) *
> +__fixunskfti_resolve (void)
> +{
> +  return SW_OR_HW_ISA3_1 (__fixunskfti_sw, __fixunskfti_hw);
> +}
> +
>  static __typeof__ (__fixkfsi_sw) *
>  __fixkfsi_resolve (void)
>  {
> @@ -303,6 +323,18 @@ TFtype __floatsikf (SItype_ppc)
>  TFtype __floatdikf (DItype_ppc)
>    __attribute__ ((__ifunc__ ("__floatdikf_resolve")));
> 
> +TFtype __floattikf (TItype_ppc)
> +  __attribute__ ((__ifunc__ ("__floattikf_resolve")));
> +
> +TFtype __floatuntikf (UTItype_ppc)
> +  __attribute__ ((__ifunc__ ("__floatuntikf_resolve")));
> +
> +TItype_ppc __fixkfti (TFtype)
> +  __attribute__ ((__ifunc__ ("__fixkfti_resolve")));
> +
> +UTItype_ppc __fixunskfti (TFtype)
> +  __attribute__ ((__ifunc__ ("__fixunskfti_resolve")));
> +
>  TFtype __floatunsikf (USItype_ppc)
>    __attribute__ ((__ifunc__ ("__floatunsikf_resolve")));
> 

ok

> diff --git a/libgcc/config/rs6000/float128-sed b/libgcc/config/rs6000/float128-sed
> index d9a089ff9ba..c0fcddb1959 100644
> --- a/libgcc/config/rs6000/float128-sed
> +++ b/libgcc/config/rs6000/float128-sed
> @@ -8,6 +8,10 @@ s/__fixtfsi/__fixkfsi/g
>  s/__fixunstfdi/__fixunskfdi/g
>  s/__fixunstfsi/__fixunskfsi/g
>  s/__floatditf/__floatdikf/g
> +s/__floattitf/__floattikf/g
> +s/__floatuntitf/__floatuntikf/g
> +s/__fixtfti/__fixkfti/g
> +s/__fixunstfti/__fixunskfti/g
>  s/__floatsitf/__floatsikf/g
>  s/__floatunditf/__floatundikf/g
>  s/__floatunsitf/__floatunsikf/g
> diff --git a/libgcc/config/rs6000/float128-sed-hw b/libgcc/config/rs6000/float128-sed-hw
> index acf36b0c17d..3d2bf556da1 100644
> --- a/libgcc/config/rs6000/float128-sed-hw
> +++ b/libgcc/config/rs6000/float128-sed-hw
> @@ -8,6 +8,10 @@ s/__fixtfsi/__fixkfsi_sw/g
>  s/__fixunstfdi/__fixunskfdi_sw/g
>  s/__fixunstfsi/__fixunskfsi_sw/g
>  s/__floatditf/__floatdikf_sw/g
> +s/__floattitf/__floattikf_sw/g
> +s/__floatuntitf/__floatuntikf_sw/g
> +s/__fixtfti/__fixkfti_sw/g
> +s/__fixunstfti/__fixunskfti_sw/g
>  s/__floatsitf/__floatsikf_sw/g
>  s/__floatunditf/__floatundikf_sw/g
>  s/__floatunsitf/__floatunsikf_sw/g

ok

> diff --git a/libgcc/config/rs6000/floattikf.c b/libgcc/config/rs6000/floattikf-sw.c
> similarity index 96%
> rename from libgcc/config/rs6000/floattikf.c
> rename to libgcc/config/rs6000/floattikf-sw.c
> index 4e8c40cfbe4..110706352bb 100644
> --- a/libgcc/config/rs6000/floattikf.c
> +++ b/libgcc/config/rs6000/floattikf-sw.c
> @@ -5,7 +5,7 @@
>     This file is part of the GNU C Library.
>     Contributed by Steven Munroe (munroesj@linux.vnet.ibm.com)
>     Code is based on the main soft-fp library written by:
> -   	   Uros Bizjak (ubizjak@gmail.com).
> +	   Uros Bizjak (ubizjak@gmail.com).
> 
>     The GNU C Library is free software; you can redistribute it and/or
>     modify it under the terms of the GNU Lesser General Public
> @@ -35,7 +35,7 @@
>  #include "quad-float128.h"
> 
>  TFtype
> -__floattikf (TItype i)
> +__floattikf_sw (TItype i)
>  {
>    FP_DECL_EX;
>    FP_DECL_Q (A);
> diff --git a/libgcc/config/rs6000/floatuntikf.c b/libgcc/config/rs6000/floatuntikf-sw.c
> similarity index 96%
> rename from libgcc/config/rs6000/floatuntikf.c
> rename to libgcc/config/rs6000/floatuntikf-sw.c
> index 8bfba4267d4..5e712a67e26 100644
> --- a/libgcc/config/rs6000/floatuntikf.c
> +++ b/libgcc/config/rs6000/floatuntikf-sw.c
> @@ -5,7 +5,7 @@
>     This file is part of the GNU C Library.
>     Contributed by Steven Munroe (munroesj@linux.vnet.ibm.com)
>     Code is based on the main soft-fp library written by:
> -   	   Uros Bizjak (ubizjak@gmail.com).
> +	   Uros Bizjak (ubizjak@gmail.com).
> 
>     The GNU C Library is free software; you can redistribute it and/or
>     modify it under the terms of the GNU Lesser General Public
> @@ -35,7 +35,7 @@
>  #include "quad-float128.h"
> 
>  TFtype
> -__floatuntikf (UTItype i)
> +__floatuntikf_sw (UTItype i)
>  {
>    FP_DECL_EX;
>    FP_DECL_Q (A);
> diff --git a/libgcc/config/rs6000/quad-float128.h b/libgcc/config/rs6000/quad-float128.h
> index 32ef328a8ea..24712b9277f 100644
> --- a/libgcc/config/rs6000/quad-float128.h
> +++ b/libgcc/config/rs6000/quad-float128.h
> @@ -87,19 +87,18 @@ extern USItype_ppc __fixunskfsi_sw (TFtype);
>  extern UDItype_ppc __fixunskfdi_sw (TFtype);
>  extern TFtype __floatsikf_sw (SItype_ppc);
>  extern TFtype __floatdikf_sw (DItype_ppc);
> +extern TFtype __floattikf_sw (TItype_ppc);
>  extern TFtype __floatunsikf_sw (USItype_ppc);
>  extern TFtype __floatundikf_sw (UDItype_ppc);
> +extern TFtype __floatuntikf_sw (UTItype_ppc);
> +extern TItype_ppc __fixkfti_sw (TFtype);
> +extern UTItype_ppc __fixunskfti_sw (TFtype);
>  extern IBM128_TYPE __extendkftf2_sw (TFtype);
>  extern TFtype __trunctfkf2_sw (IBM128_TYPE);
>  extern TCtype __mulkc3_sw (TFtype, TFtype, TFtype, TFtype);
>  extern TCtype __divkc3_sw (TFtype, TFtype, TFtype, TFtype);
> 
>  #ifdef _ARCH_PPC64
> -/* We do not provide ifunc resolvers for __fixkfti, __fixunskfti, __floattikf,
> -   and __floatuntikf.  There is no ISA 3.0 instruction that converts between
> -   128-bit integer types and 128-bit IEEE floating point, or vice versa.  So
> -   use the emulator functions for these conversions.  */
> -
>  extern TItype_ppc __fixkfti (TFtype);
>  extern UTItype_ppc __fixunskfti (TFtype);
>  extern TFtype __floattikf (TItype_ppc);
> @@ -130,8 +129,12 @@ extern USItype_ppc __fixunskfsi_hw (TFtype);
>  extern UDItype_ppc __fixunskfdi_hw (TFtype);
>  extern TFtype __floatsikf_hw (SItype_ppc);
>  extern TFtype __floatdikf_hw (DItype_ppc);
> +extern TFtype __floattikf_hw (TItype_ppc);
>  extern TFtype __floatunsikf_hw (USItype_ppc);
>  extern TFtype __floatundikf_hw (UDItype_ppc);
> +extern TFtype __floatuntikf_hw (UTItype_ppc);
> +extern TItype_ppc __fixkfti_hw (TFtype);
> +extern UTItype_ppc __fixunskfti_hw (TFtype);
>  extern IBM128_TYPE __extendkftf2_hw (TFtype);
>  extern TFtype __trunctfkf2_hw (IBM128_TYPE);
>  extern TCtype __mulkc3_hw (TFtype, TFtype, TFtype, TFtype);
> @@ -162,8 +165,12 @@ extern USItype_ppc __fixunskfsi (TFtype);
>  extern UDItype_ppc __fixunskfdi (TFtype);
>  extern TFtype __floatsikf (SItype_ppc);
>  extern TFtype __floatdikf (DItype_ppc);
> +extern TFtype __floattikf (TItype_ppc);
>  extern TFtype __floatunsikf (USItype_ppc);
>  extern TFtype __floatundikf (UDItype_ppc);
> +extern TFtype __floatuntikf (UTItype_ppc);
> +extern TItype_ppc __fixkfti (TFtype);
> +extern UTItype_ppc __fixunskfti (TFtype);
>  extern IBM128_TYPE __extendkftf2 (TFtype);
>  extern TFtype __trunctfkf2 (IBM128_TYPE);

ok

> diff --git a/libgcc/config/rs6000/t-float128 b/libgcc/config/rs6000/t-float128
> index d5413445189..325b22fd49e 100644
> --- a/libgcc/config/rs6000/t-float128
> +++ b/libgcc/config/rs6000/t-float128
> @@ -23,7 +23,8 @@ fp128_softfp_shared_obj	= $(addsuffix -sw_s$(objext),$(fp128_softfp_funcs))
>  fp128_softfp_obj	= $(fp128_softfp_static_obj) $(fp128_softfp_shared_obj)
> 
>  # New functions for software emulation
> -fp128_ppc_funcs		= floattikf floatuntikf fixkfti fixunskfti \
> +fp128_ppc_funcs		= floattikf-sw floatuntikf-sw \
> +			  fixkfti-sw fixunskfti-sw \
>  			  extendkftf2-sw trunctfkf2-sw \
>  			  sfp-exceptions _mulkc3 _divkc3 _powikf2


ok.



More information about the Gcc-patches mailing list