gcc/libquadmath/quadmath-imp.h
Francois-Xavier Coudert 1ec601bf9f re PR fortran/32049 (Support on x86_64 also kind=16)
/
2010-11-13  Francois-Xavier Coudert  <fxcoudert@gcc.gnu.org>
            Tobias Burnus  <burnus@net-b.de>

        PR fortran/32049
        * Makefile.def: Add libquadmath; build it with language=fortran.
        * configure.ac: Add libquadmath.
        * Makefile.tpl: Handle multiple libs in check-[+language+].
        * Makefile.in: Regenerate.
        * configure: Regenerate.

libquadmath/
2010-11-13  Francois-Xavier Coudert  <fxcoudert@gcc.gnu.org>
            Tobias Burnus  <burnus@net-b.de>

        PR fortran/32049
        Initial implementation and checkin.

gcc/fortran/
2010-11-13  Francois-Xavier Coudert  <fxcoudert@gcc.gnu.org>
            Tobias Burnus  <burnus@net-b.de>

        PR fortran/32049
        * gfortranspec.c (find_spec_file): New function.
        (lang_specific_driver): Try to find .spec file and use it.
        * trans-io.c (iocall): Define
        * IOCALL_X_REAL128/COMPLEX128(,write).
        (gfc_build_io_library_fndecls): Build decl for __float128 I/O.
        (transfer_expr): Call __float128 I/O functions.
        * trans-types.c (gfc_init_kinds): Allow kind-16 belonging
        to __float128.

gcc/testsuite/
2010-11-13  Francois-Xavier Coudert  <fxcoudert@gcc.gnu.org>
            Tobias Burnus  <burnus@net-b.de>

        PR fortran/32049
        * gfortran.dg/quad_1.f90: New.
        * lib/gcc-defs.exp (gcc-set-multilib-library-path): Use also
        compiler arguments.
        * lib/gfortran.exp (gfortran_link_flags): Add libquadmath to
        library search path; call gcc-set-multilib-library-path with
        arguments such that libgfortran.spec is found.
        (gfortran_init): Add path for libgfortran.spec to
GFORTRAN_UNDER_TEST.

libgomp/
2010-11-13  Francois-Xavier Coudert  <fxcoudert@gcc.gnu.org>
            Tobias Burnus  <burnus@net-b.de>

        PR fortran/32049
        * configure.ac: 
        * configure: Regenerate.

libgfortran/
2010-11-13  Francois-Xavier Coudert  <fxcoudert@gcc.gnu.org>
            Tobias Burnus  <burnus@net-b.de>

        PR fortran/32049
        * Makefile.am: Add missing pow_r16_i4.c, add transfer128.c,
        link libquadmath, if used.
        * acinclude.m4 (LIBGFOR_CHECK_FLOAT128): Add.
        * configure.ac: Use it, touch spec file.
        * gfortran.map: Add pow_r16_i4 and
        transfer_(real,complex)128(,write) functions.
        * intrinsics/cshift0.c (cshift0): Handle __float128 type.
        * intrinsics/erfc_scaled_inc.c: Ditto.
        * intrinsics/pack_generic.c (pack): Ditto
        * intrinsics/spread_generic.c (spread): Ditto.
        * intrinsics/unpack_generic.c (unpack1): Ditto.
        * io/read.c (convert_real): Ditto.
        * io/transfer.c: Update comments.
        * io/transfer128.c: New file.
        * io/write_float.def (write_float): Handle __float128 type.
        * libgfortran.h: #include quadmath_weak.h, define __builtin_infq
        and nanq.
        * m4/mtype.m4: Handle __float128 type.
        * runtime/in_pack_generic.c (internal_pack): Ditto.
        * runtime/in_unpack_generic.c (internal_unpack): Ditto.
        * kinds-override.h: New file.
        * libgfortran.spec.in: Ditto.
        * generated/pow_r16_i4.c: Generated.
        * Makefile.in: Regenerate.
        * configure: Regenerate.
        * config.h: Regenerate.
        * bessel_r10.c: Regenerate.
        * bessel_r16.c: Regenerate.
        * bessel_r4.c: Regenerate.
        * bessel_r8.c: Regenerate.
        * exponent_r16.c: Regenerate.
        * fraction_r16.c: Regenerate.
        * nearest_r16.c: Regenerate.
        * norm2_r10.c: Regenerate.
        * norm2_r16.c: Regenerate.
        * norm2_r4.c: Regenerate.
        * norm2_r8.c: Regenerate.
        * rrspacing_r16.c: Regenerate.
        * set_exponent_r16.c: Regenerate.
        * spacing_r16.c: Regenerate.


Co-Authored-By: Tobias Burnus <burnus@net-b.de>

From-SVN: r166825
2010-11-16 22:23:19 +01:00

147 lines
3.3 KiB
C

#ifndef QUADMATH_IMP_H
#define QUADMATH_IMP_H
#include <stdint.h>
#include <stdlib.h>
#include "quadmath.h"
// Prototypes for internal functions
extern int32_t rem_pio2q (__float128, __float128 *);
extern void __kernel_sincosq (__float128, __float128, __float128 *, __float128 *, int);
extern __float128 __kernel_sinq (__float128, __float128, int);
extern __float128 __kernel_cosq (__float128, __float128);
// Frankly, if you have __float128, you have 64-bit integers, right?
#ifndef UINT64_C
# error "No way!"
#endif
// If we don't have macros to know endianess, assume little endian
#if !defined(__BIG_ENDIAN__) && !defined(__LITTLE_ENDIAN__)
# define __LITTLE_ENDIAN__ 1
#endif
// Main union type we use to manipulate the floating-point type
typedef union
{
__float128 value;
struct
{
#if __BIG_ENDIAN__
unsigned negative:1;
unsigned exponent:15;
uint64_t mant_high:48;
uint64_t mant_low:64;
#endif
#if __LITTLE_ENDIAN__
uint64_t mant_low:64;
uint64_t mant_high:48;
unsigned exponent:15;
unsigned negative:1;
#endif
} ieee;
struct
{
#if __BIG_ENDIAN__
uint64_t high;
uint64_t low;
#endif
#if __LITTLE_ENDIAN__
uint64_t low;
uint64_t high;
#endif
} words64;
struct
{
#if __BIG_ENDIAN__
uint32_t w0;
uint32_t w1;
uint32_t w2;
uint32_t w3;
#endif
#if __LITTLE_ENDIAN__
uint32_t w3;
uint32_t w2;
uint32_t w1;
uint32_t w0;
#endif
} words32;
struct
{
#if __BIG_ENDIAN__
unsigned negative:1;
unsigned exponent:15;
unsigned quiet_nan:1;
uint64_t mant_high:47;
uint64_t mant_low:64;
#endif
#if __LITTLE_ENDIAN__
uint64_t mant_low:64;
uint64_t mant_high:47;
unsigned quiet_nan:1;
unsigned exponent:15;
unsigned negative:1;
#endif
} nan;
} ieee854_float128;
/* Get two 64 bit ints from a long double. */
#define GET_FLT128_WORDS64(ix0,ix1,d) \
do { \
ieee854_float128 u; \
u.value = (d); \
(ix0) = u.words64.high; \
(ix1) = u.words64.low; \
} while (0)
/* Set a long double from two 64 bit ints. */
#define SET_FLT128_WORDS64(d,ix0,ix1) \
do { \
ieee854_float128 u; \
u.words64.high = (ix0); \
u.words64.low = (ix1); \
(d) = u.value; \
} while (0)
/* Get the more significant 64 bits of a long double mantissa. */
#define GET_FLT128_MSW64(v,d) \
do { \
ieee854_float128 u; \
u.value = (d); \
(v) = u.words64.high; \
} while (0)
/* Set the more significant 64 bits of a long double mantissa from an int. */
#define SET_FLT128_MSW64(d,v) \
do { \
ieee854_float128 u; \
u.value = (d); \
u.words64.high = (v); \
(d) = u.value; \
} while (0)
/* Get the least significant 64 bits of a long double mantissa. */
#define GET_FLT128_LSW64(v,d) \
do { \
ieee854_float128 u; \
u.value = (d); \
(v) = u.words64.low; \
} while (0)
#define IEEE854_FLOAT128_BIAS 0x3fff
#endif