Home | History | Annotate | Download | only in common
      1 /*
      2  * CDDL HEADER START
      3  *
      4  * The contents of this file are subject to the terms of the
      5  * Common Development and Distribution License, Version 1.0 only
      6  * (the "License").  You may not use this file except in compliance
      7  * with the License.
      8  *
      9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
     10  * or http://www.opensolaris.org/os/licensing.
     11  * See the License for the specific language governing permissions
     12  * and limitations under the License.
     13  *
     14  * When distributing Covered Code, include this CDDL HEADER in each
     15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     16  * If applicable, add the following below this CDDL HEADER, with the
     17  * fields enclosed by brackets "[]" replaced with your own identifying
     18  * information: Portions Copyright [yyyy] [name of copyright owner]
     19  *
     20  * CDDL HEADER END
     21  */
     22 /*
     23  * Copyright 1989 Sun Microsystems, Inc.  All rights reserved.
     24  * Use is subject to license terms.
     25  */
     26 
     27 #ifndef _QUAD_INCLUDED_
     28 #define	_QUAD_INCLUDED_		/* Render harmless multiple inclusions. */
     29 
     30 #pragma ident	"%Z%%M%	%I%	%E% SMI"
     31 
     32 /*
     33  * Header file for long double == quadruple-precision run-time support. C
     34  * "long double" and Fortran "real*16" are implemented identically on all
     35  * architectures.
     36  *
     37  * Thus the quad run-time support is intentionally coded as C-callable routines
     38  * for portability.
     39  *
     40  * Mixed-case identifiers with leading _ are intentionally chosen to minimize
     41  * conflicts with user-defined C and Fortran identifiers.
     42  */
     43 
     44 #include <math.h>		/* to get float macros */
     45 
     46 #ifdef __STDC__			/* are we there yet */
     47 
     48 #define QUAD long double
     49 #define SINGLE float
     50 #define SINGLERESULT float
     51 #define RETURNSINGLE(x) return x
     52 #define ASSIGNSINGLERESULT(x,y) x = y
     53 
     54 #else
     55 
     56 struct quadstruct {
     57 	unsigned        parts[4]
     58 };
     59 
     60 #define QUAD struct quadstruct
     61 
     62 #define SINGLE FLOATPARAMETER
     63 #define SINGLERESULT FLOATFUNCTIONTYPE
     64 #define RETURNSINGLE(x) RETURNFLOAT(x)
     65 #define ASSIGNSINGLERESULT(x,y) {SINGLERESULT _kug = y; *(int *)&x = *(int*)&_kug;}
     66 
     67 #endif
     68 
     69 /******		Phase I Quad support: C run-time in libc/crt		*****/
     70 
     71 extern QUAD _Q_neg(QUAD);		/* returns -x */
     72 extern QUAD _Q_add(QUAD, QUAD);		/* returns x + y */
     73 extern QUAD _Q_sub(QUAD, QUAD);		/* returns x - y */
     74 extern QUAD _Q_mul(QUAD, QUAD);		/* returns x * y */
     75 extern QUAD _Q_div(QUAD, QUAD);		/* returns x / y */
     76 extern QUAD _Q_sqrt(QUAD);		/* return sqrt(x) */
     77 extern enum fcc_type
     78 	_Q_cmp(QUAD, QUAD);		/* x compare y , exception */
     79 					/* only on signaling NaN */
     80 extern enum fcc_type
     81 	_Q_cmpe(QUAD, QUAD);		/* x compare y , exception */
     82 					/* on quiet NaN */
     83 extern int   _Q_feq(QUAD, QUAD);	/* return TRUE if x == y */
     84 extern int   _Q_fne(QUAD, QUAD);	/* return TRUE if x != y */
     85 extern int   _Q_fgt(QUAD, QUAD);	/* return TRUE if x >  y */
     86 extern int   _Q_fge(QUAD, QUAD);	/* return TRUE if x >= y */
     87 extern int   _Q_flt(QUAD, QUAD);	/* return TRUE if x <  y */
     88 extern int   _Q_fle(QUAD, QUAD);	/* return TRUE if x <= y */
     89 
     90 /* Conversion routines are pretty straightforward. */
     91 
     92 extern QUAD _Q_stoq(SINGLE);
     93 extern QUAD _Q_dtoq(double);
     94 extern QUAD _Q_itoq(int);
     95 extern QUAD _Q_utoq(unsigned);
     96 extern SINGLERESULT	_Q_qtos(QUAD);
     97 extern double		_Q_qtod(QUAD);
     98 extern int		_Q_qtoi(QUAD);
     99 extern unsigned		_Q_qtou(QUAD);
    100 
    101 /******
    102     Phase I Quad support: scanf/printf support in libc/gen/common
    103 *****/
    104 
    105 enum fcc_type 	 		/* relationships for loading into cc */
    106 	{
    107 	fcc_equal	= 0,
    108 	fcc_less	= 1,
    109 	fcc_greater	= 2,
    110 	fcc_unordered	= 3
    111 	} ;
    112 
    113 typedef			/* FPU register viewed as single components. */
    114 	struct
    115 	{
    116 	unsigned sign :		 1 ;
    117 	unsigned exponent :	 8 ;
    118 	unsigned significand :	23 ;
    119 	}
    120 	single_type ;
    121 
    122 typedef			/* FPU register viewed as double components. */
    123 	struct
    124 	{
    125 	unsigned sign :		 1 ;
    126 	unsigned exponent :	11 ;
    127 	unsigned significand :	20 ;
    128 	}
    129 	double_type ;
    130 typedef			/* FPU register viewed as extended components. */
    131 	struct
    132 	{
    133 	unsigned sign :		 1 ;
    134 	unsigned exponent :	15 ;
    135 	unsigned significand :	16 ;
    136 	}
    137 	extended_type ;
    138 
    139 enum fp_op_type		/* Type specifiers in FPU instructions. */
    140 	{
    141 	fp_op_integer	= 0,	/* Not in hardware, but convenient to define. */
    142 	fp_op_single	= 1,
    143 	fp_op_double	= 2,
    144 	fp_op_extended	= 3
    145 	} ;
    146 
    147 
    148 extern void	_Q_get_rp_rd(void);
    149 extern void	_Q_set_exception(unsigned);
    150 
    151 #endif				/* QUAD_INCLUDED */
    152