blob: c20282fa0e0bc5c4c41609b3baa9e50888e78d20 [file] [log] [blame]
/* { dg-do run } */
/* { dg-require-effective-target power10_hw } */
/* { dg-options "-mdejagnu-cpu=power10 -save-temps" } */
/* 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 } } */
/* { dg-final { scan-assembler-times {\mxscvuqqp\M} 1 } } */
/* { dg-final { scan-assembler-times {\mxscvqpsqz\M} 1 } } */
/* { dg-final { scan-assembler-times {\mxscvqpuqz\M} 1 } } */
#include <stdio.h>
#include <math.h>
#include <fenv.h>
#include <stdlib.h>
#include <wchar.h>
#define DEBUG 0
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;
}
__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, message uses IBM long double, no binary output
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
}
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
}
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
}
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;
}