blob: e5f9499b7c881e31092770c9190813b51a26c243 [file] [log] [blame]
/*
* Require float128 support because __ibm128 currently is not enabled unless we
* also have __float128 support. We require software IEEE 128-bit support,
* which will work on power8. If we have hardware IEEE 128-bit support (power9
* or power10), ppc_float128_sw will still enable running the test.
*/
/* { dg-do run } */
/* { dg-require-effective-target ppc_float128_sw } */
/* { dg-options "-O2 -mvsx -mfloat128" } */
/* { dg-prune-output ".-mfloat128. option may not be fully supported" } */
/*
* PR target/104253
*
* Verify that the various conversions to and from __ibm128 work. When the
* default for long double is changed to IEEE 128-bit, originally GCC would
* call the functions using an 'if' name instead of 'tf' name.
*/
#include <stdlib.h>
extern float ibm128_to_sf (__ibm128) __attribute__((noinline));
extern double ibm128_to_df (__ibm128) __attribute__((noinline));
extern int ibm128_to_si (__ibm128) __attribute__((noinline));
extern long long ibm128_to_di (__ibm128) __attribute__((noinline));
extern unsigned int ibm128_to_usi (__ibm128) __attribute__((noinline));
extern unsigned long long ibm128_to_udi (__ibm128) __attribute__((noinline));
extern __ibm128 sf_to_ibm128 (float) __attribute__((noinline));
extern __ibm128 df_to_ibm128 (double) __attribute__((noinline));
extern __ibm128 si_to_ibm128 (int) __attribute__((noinline));
extern __ibm128 di_to_ibm128 (long long) __attribute__((noinline));
extern __ibm128 usi_to_ibm128 (unsigned int) __attribute__((noinline));
extern __ibm128 udi_to_ibm128 (unsigned long long) __attribute__((noinline));
float
ibm128_to_sf (__ibm128 x)
{
return x;
}
double
ibm128_to_df (__ibm128 x)
{
return x;
}
int
ibm128_to_si (__ibm128 x)
{
return x;
}
long long
ibm128_to_di (__ibm128 x)
{
return x;
}
unsigned int
ibm128_to_usi (__ibm128 x)
{
return x;
}
unsigned long long
ibm128_to_udi (__ibm128 x)
{
return x;
}
__ibm128
sf_to_ibm128 (float x)
{
return x;
}
__ibm128
df_to_ibm128 (double x)
{
return x;
}
__ibm128
si_to_ibm128 (int x)
{
return x;
}
__ibm128
di_to_ibm128 (long long x)
{
return x;
}
__ibm128
usi_to_ibm128 (unsigned int x)
{
return x;
}
__ibm128
udi_to_ibm128 (unsigned long long x)
{
return x;
}
volatile float seven_sf = 7.0f;
volatile double seven_df = 7.0;
volatile int seven_si = 7;
volatile long long seven_di = 7LL;
volatile unsigned int seven_usi = 7U;
volatile unsigned long long seven_udi = 7ULL;
volatile __ibm128 seven_ibm128 = 7.0;
int
main (void)
{
if (seven_ibm128 != sf_to_ibm128 (seven_sf))
abort ();
if (seven_ibm128 != df_to_ibm128 (seven_df))
abort ();
if (seven_ibm128 != si_to_ibm128 (seven_si))
abort ();
if (seven_ibm128 != di_to_ibm128 (seven_di))
abort ();
if (seven_ibm128 != usi_to_ibm128 (seven_usi))
abort ();
if (seven_ibm128 != udi_to_ibm128 (seven_udi))
abort ();
if (seven_sf != ibm128_to_sf (seven_ibm128))
abort ();
if (seven_df != ibm128_to_df (seven_ibm128))
abort ();
if (seven_si != ibm128_to_si (seven_ibm128))
abort ();
if (seven_di != ibm128_to_di (seven_ibm128))
abort ();
if (seven_usi != ibm128_to_usi (seven_ibm128))
abort ();
if (seven_udi != ibm128_to_udi (seven_ibm128))
abort ();
return 0;
}