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 1988 Sun Microsystems, Inc.  All rights reserved.
     24  * Use is subject to license terms.
     25  */
     26 
     27 #pragma ident	"%Z%%M%	%I%	%E% SMI"
     28 
     29 #include "_Qquad.h"
     30 #include "_Qglobals.h"
     31 
     32 static double zero = 0.0, tiny = 1.0e-300, huge = 1.0e300;
     33 static void	dummy(double);
     34 
     35 QUAD
     36 _Q_add(QUAD x, QUAD y)
     37 {
     38 	unpacked	px,py,pz;
     39 	QUAD		z;
     40 	_fp_current_exceptions = 0;
     41 	_Q_get_rp_rd();		/* get fp_precision, fp_direction */
     42 	_fp_unpack(&px,(int *)&x,fp_op_extended);
     43 	_fp_unpack(&py,(int *)&y,fp_op_extended);
     44 	_fp_add(&px,&py,&pz);
     45 	_fp_pack(&pz,(int *)&z,fp_op_extended);
     46 	_Q_set_exception(_fp_current_exceptions);
     47 	return (z);
     48 }
     49 
     50 void
     51 _Q_set_exception(unsigned ex)
     52 {
     53     /* simulate exceptions using double arithmetic */
     54 	double t;
     55 	if((ex&(1<<fp_invalid))!=0)	t = (zero/zero);
     56 	if((ex&(1<<fp_overflow))!=0)	t = (huge*huge);
     57 	if((ex&(1<<fp_underflow))!=0)	t = (tiny*tiny);
     58 	if((ex&(1<<fp_division))!=0)	t = (tiny/zero);
     59 	if((ex&(1<<fp_inexact))!=0)	t = (huge+tiny);
     60 	dummy(t);  /* prevent optimizer eliminating previous expression */
     61 }
     62 
     63 static void
     64 dummy(double x)
     65 {
     66 }
     67