// REQUIRES: target-is-powerpc64le // RUN: %clang_builtins %s %librt -o %t && %run %t /* * Test case execution for: long double __floattitf (__int128_t) * Conversion from 128 bit integer to long double (IBM double-double). */ #include <stdint.h> #include <stdio.h> #include "floattitf_test.h" /* The long double representation, with the high and low portions of * the long double, and the corresponding bit patterns of each double. */ typedef union { long double ld; double d[2]; /* [0] is the high double, [1] is the low double. */ unsigned long long ull[2]; /* High and low doubles as 64-bit integers. */ } ldUnion; long double __floattitf(__int128_t); int main(int argc, char *argv[]) { /* Necessary long double and 128 bit integer declarations used to * compare computed and expected high and low portions of the * IBM double-double. */ ldUnion expectedLongDouble; ldUnion computedLongDouble; __int128_t result128; for (int i = 0; i < numTests; ++i) { /* Set the expected high and low values of the long double, * and the 128 bit integer input to be converted. */ expectedLongDouble.d[0] = tests[i].hi; expectedLongDouble.d[1] = tests[i].lo; result128 = tests[i].input128; /* Get the computed long double from the int128->long double conversion * and check for errors between high and low portions. */ computedLongDouble.ld = __floattitf(result128); if ((computedLongDouble.d[0] != expectedLongDouble.d[0]) || (computedLongDouble.d[1] != expectedLongDouble.d[1])) { printf("Error on __floattitf( 0x%016llx 0x%016llx ):\n", (long long)(tests[i].input128 >> 64), (long long)tests[i].input128); printf("\tExpected value - %La = ( %a, %a )\n", expectedLongDouble.ld, expectedLongDouble.d[0], expectedLongDouble.d[1]); printf("\tComputed value - %La = ( %a, %a )\n\n", computedLongDouble.ld, computedLongDouble.d[0], computedLongDouble.d[1]); return 1; } } return 0; }