Home | History | Annotate | Line # | Download | only in math
rem_pio2q.c revision 1.2
      1  1.1  mrg #include "quadmath-imp.h"
      2  1.1  mrg #include <math.h>
      3  1.1  mrg 
      4  1.1  mrg 
      5  1.1  mrg /* @(#)k_rem_pio2.c 5.1 93/09/24 */
      6  1.1  mrg /*
      7  1.1  mrg  * ====================================================
      8  1.1  mrg  * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
      9  1.1  mrg  *
     10  1.1  mrg  * Developed at SunPro, a Sun Microsystems, Inc. business.
     11  1.1  mrg  * Permission to use, copy, modify, and distribute this
     12  1.1  mrg  * software is freely granted, provided that this notice
     13  1.1  mrg  * is preserved.
     14  1.1  mrg  * ====================================================
     15  1.1  mrg  */
     16  1.1  mrg 
     17  1.1  mrg /*
     18  1.1  mrg  * __quadmath_kernel_rem_pio2 (x,y,e0,nx,prec,ipio2)
     19  1.1  mrg  * double x[],y[]; int e0,nx,prec; int ipio2[];
     20  1.1  mrg  *
     21  1.1  mrg  * __quadmath_kernel_rem_pio2  return the last three digits of N with
     22  1.1  mrg  *		y = x - N*pi/2
     23  1.1  mrg  * so that |y| < pi/2.
     24  1.1  mrg  *
     25  1.1  mrg  * The method is to compute the integer (mod 8) and fraction parts of
     26  1.1  mrg  * (2/pi)*x without doing the full multiplication. In general we
     27  1.1  mrg  * skip the part of the product that are known to be a huge integer (
     28  1.1  mrg  * more accurately, = 0 mod 8 ). Thus the number of operations are
     29  1.1  mrg  * independent of the exponent of the input.
     30  1.1  mrg  *
     31  1.1  mrg  * (2/pi) is represented by an array of 24-bit integers in ipio2[].
     32  1.1  mrg  *
     33  1.1  mrg  * Input parameters:
     34  1.1  mrg  * 	x[]	The input value (must be positive) is broken into nx
     35  1.1  mrg  *		pieces of 24-bit integers in double precision format.
     36  1.1  mrg  *		x[i] will be the i-th 24 bit of x. The scaled exponent
     37  1.1  mrg  *		of x[0] is given in input parameter e0 (i.e., x[0]*2^e0
     38  1.1  mrg  *		match x's up to 24 bits.
     39  1.1  mrg  *
     40  1.1  mrg  *		Example of breaking a double positive z into x[0]+x[1]+x[2]:
     41  1.1  mrg  *			e0 = ilogb(z)-23
     42  1.1  mrg  *			z  = scalbn(z,-e0)
     43  1.1  mrg  *		for i = 0,1,2
     44  1.1  mrg  *			x[i] = floor(z)
     45  1.1  mrg  *			z    = (z-x[i])*2**24
     46  1.1  mrg  *
     47  1.1  mrg  *
     48  1.1  mrg  *	y[]	ouput result in an array of double precision numbers.
     49  1.1  mrg  *		The dimension of y[] is:
     50  1.1  mrg  *			24-bit  precision	1
     51  1.1  mrg  *			53-bit  precision	2
     52  1.1  mrg  *			64-bit  precision	2
     53  1.1  mrg  *			113-bit precision	3
     54  1.1  mrg  *		The actual value is the sum of them. Thus for 113-bit
     55  1.1  mrg  *		precision, one may have to do something like:
     56  1.1  mrg  *
     57  1.1  mrg  *		long double t,w,r_head, r_tail;
     58  1.1  mrg  *		t = (long double)y[2] + (long double)y[1];
     59  1.1  mrg  *		w = (long double)y[0];
     60  1.1  mrg  *		r_head = t+w;
     61  1.1  mrg  *		r_tail = w - (r_head - t);
     62  1.1  mrg  *
     63  1.1  mrg  *	e0	The exponent of x[0]
     64  1.1  mrg  *
     65  1.1  mrg  *	nx	dimension of x[]
     66  1.1  mrg  *
     67  1.1  mrg  *  	prec	an integer indicating the precision:
     68  1.1  mrg  *			0	24  bits (single)
     69  1.1  mrg  *			1	53  bits (double)
     70  1.1  mrg  *			2	64  bits (extended)
     71  1.1  mrg  *			3	113 bits (quad)
     72  1.1  mrg  *
     73  1.1  mrg  *	ipio2[]
     74  1.1  mrg  *		integer array, contains the (24*i)-th to (24*i+23)-th
     75  1.1  mrg  *		bit of 2/pi after binary point. The corresponding
     76  1.1  mrg  *		floating value is
     77  1.1  mrg  *
     78  1.1  mrg  *			ipio2[i] * 2^(-24(i+1)).
     79  1.1  mrg  *
     80  1.1  mrg  * External function:
     81  1.1  mrg  *	double scalbn(), floor();
     82  1.1  mrg  *
     83  1.1  mrg  *
     84  1.1  mrg  * Here is the description of some local variables:
     85  1.1  mrg  *
     86  1.1  mrg  * 	jk	jk+1 is the initial number of terms of ipio2[] needed
     87  1.1  mrg  *		in the computation. The recommended value is 2,3,4,
     88  1.1  mrg  *		6 for single, double, extended,and quad.
     89  1.1  mrg  *
     90  1.1  mrg  * 	jz	local integer variable indicating the number of
     91  1.1  mrg  *		terms of ipio2[] used.
     92  1.1  mrg  *
     93  1.1  mrg  *	jx	nx - 1
     94  1.1  mrg  *
     95  1.1  mrg  *	jv	index for pointing to the suitable ipio2[] for the
     96  1.1  mrg  *		computation. In general, we want
     97  1.1  mrg  *			( 2^e0*x[0] * ipio2[jv-1]*2^(-24jv) )/8
     98  1.1  mrg  *		is an integer. Thus
     99  1.1  mrg  *			e0-3-24*jv >= 0 or (e0-3)/24 >= jv
    100  1.1  mrg  *		Hence jv = max(0,(e0-3)/24).
    101  1.1  mrg  *
    102  1.1  mrg  *	jp	jp+1 is the number of terms in PIo2[] needed, jp = jk.
    103  1.1  mrg  *
    104  1.1  mrg  * 	q[]	double array with integral value, representing the
    105  1.1  mrg  *		24-bits chunk of the product of x and 2/pi.
    106  1.1  mrg  *
    107  1.1  mrg  *	q0	the corresponding exponent of q[0]. Note that the
    108  1.1  mrg  *		exponent for q[i] would be q0-24*i.
    109  1.1  mrg  *
    110  1.1  mrg  *	PIo2[]	double precision array, obtained by cutting pi/2
    111  1.1  mrg  *		into 24 bits chunks.
    112  1.1  mrg  *
    113  1.1  mrg  *	f[]	ipio2[] in floating point
    114  1.1  mrg  *
    115  1.1  mrg  *	iq[]	integer array by breaking up q[] in 24-bits chunk.
    116  1.1  mrg  *
    117  1.1  mrg  *	fq[]	final product of x*(2/pi) in fq[0],..,fq[jk]
    118  1.1  mrg  *
    119  1.1  mrg  *	ih	integer. If >0 it indicates q[] is >= 0.5, hence
    120  1.1  mrg  *		it also indicates the *sign* of the result.
    121  1.1  mrg  *
    122  1.1  mrg  */
    123  1.1  mrg 
    124  1.1  mrg /*
    125  1.1  mrg  * Constants:
    126  1.1  mrg  * The hexadecimal values are the intended ones for the following
    127  1.1  mrg  * constants. The decimal values may be used, provided that the
    128  1.1  mrg  * compiler will convert from decimal to binary accurately enough
    129  1.1  mrg  * to produce the hexadecimal values shown.
    130  1.1  mrg  */
    131  1.1  mrg 
    132  1.1  mrg 
    133  1.1  mrg static const int init_jk[] = {2,3,4,6}; /* initial value for jk */
    134  1.1  mrg 
    135  1.1  mrg static const double PIo2[] = {
    136  1.1  mrg   1.57079625129699707031e+00, /* 0x3FF921FB, 0x40000000 */
    137  1.1  mrg   7.54978941586159635335e-08, /* 0x3E74442D, 0x00000000 */
    138  1.1  mrg   5.39030252995776476554e-15, /* 0x3CF84698, 0x80000000 */
    139  1.1  mrg   3.28200341580791294123e-22, /* 0x3B78CC51, 0x60000000 */
    140  1.1  mrg   1.27065575308067607349e-29, /* 0x39F01B83, 0x80000000 */
    141  1.1  mrg   1.22933308981111328932e-36, /* 0x387A2520, 0x40000000 */
    142  1.1  mrg   2.73370053816464559624e-44, /* 0x36E38222, 0x80000000 */
    143  1.1  mrg   2.16741683877804819444e-51, /* 0x3569F31D, 0x00000000 */
    144  1.1  mrg };
    145  1.1  mrg 
    146  1.1  mrg static const double
    147  1.1  mrg   zero   = 0.0,
    148  1.1  mrg   one    = 1.0,
    149  1.1  mrg   two24   =  1.67772160000000000000e+07, /* 0x41700000, 0x00000000 */
    150  1.1  mrg   twon24  =  5.96046447753906250000e-08; /* 0x3E700000, 0x00000000 */
    151  1.1  mrg 
    152  1.1  mrg 
    153  1.1  mrg static int
    154  1.1  mrg __quadmath_kernel_rem_pio2 (double *x, double *y, int e0, int nx, int prec, const int32_t *ipio2)
    155  1.1  mrg {
    156  1.1  mrg 	int32_t jz,jx,jv,jp,jk,carry,n,iq[20],i,j,k,m,q0,ih;
    157  1.1  mrg 	double z,fw,f[20],fq[20],q[20];
    158  1.1  mrg 
    159  1.1  mrg     /* initialize jk*/
    160  1.1  mrg 	jk = init_jk[prec];
    161  1.1  mrg 	jp = jk;
    162  1.1  mrg 
    163  1.1  mrg     /* determine jx,jv,q0, note that 3>q0 */
    164  1.1  mrg 	jx =  nx-1;
    165  1.1  mrg 	jv = (e0-3)/24; if(jv<0) jv=0;
    166  1.1  mrg 	q0 =  e0-24*(jv+1);
    167  1.1  mrg 
    168  1.1  mrg     /* set up f[0] to f[jx+jk] where f[jx+jk] = ipio2[jv+jk] */
    169  1.1  mrg 	j = jv-jx; m = jx+jk;
    170  1.1  mrg 	for(i=0;i<=m;i++,j++) f[i] = (j<0)? zero : (double) ipio2[j];
    171  1.1  mrg 
    172  1.1  mrg     /* compute q[0],q[1],...q[jk] */
    173  1.1  mrg 	for (i=0;i<=jk;i++) {
    174  1.2  mrg 	    for(j=0,fw=0.0;j<=jx;j++) fw += x[j]*f[jx+i-j];
    175  1.2  mrg 	    q[i] = fw;
    176  1.1  mrg 	}
    177  1.1  mrg 
    178  1.1  mrg 	jz = jk;
    179  1.1  mrg recompute:
    180  1.1  mrg     /* distill q[] into iq[] reversingly */
    181  1.1  mrg 	for(i=0,j=jz,z=q[jz];j>0;i++,j--) {
    182  1.1  mrg 	    fw    =  (double)((int32_t)(twon24* z));
    183  1.1  mrg 	    iq[i] =  (int32_t)(z-two24*fw);
    184  1.1  mrg 	    z     =  q[j-1]+fw;
    185  1.1  mrg 	}
    186  1.1  mrg 
    187  1.1  mrg     /* compute n */
    188  1.1  mrg 	z  = scalbn(z,q0);		/* actual value of z */
    189  1.1  mrg 	z -= 8.0*floor(z*0.125);		/* trim off integer >= 8 */
    190  1.1  mrg 	n  = (int32_t) z;
    191  1.1  mrg 	z -= (double)n;
    192  1.1  mrg 	ih = 0;
    193  1.1  mrg 	if(q0>0) {	/* need iq[jz-1] to determine n */
    194  1.1  mrg 	    i  = (iq[jz-1]>>(24-q0)); n += i;
    195  1.1  mrg 	    iq[jz-1] -= i<<(24-q0);
    196  1.1  mrg 	    ih = iq[jz-1]>>(23-q0);
    197  1.1  mrg 	}
    198  1.1  mrg 	else if(q0==0) ih = iq[jz-1]>>23;
    199  1.1  mrg 	else if(z>=0.5) ih=2;
    200  1.1  mrg 
    201  1.1  mrg 	if(ih>0) {	/* q > 0.5 */
    202  1.1  mrg 	    n += 1; carry = 0;
    203  1.1  mrg 	    for(i=0;i<jz ;i++) {	/* compute 1-q */
    204  1.1  mrg 		j = iq[i];
    205  1.1  mrg 		if(carry==0) {
    206  1.1  mrg 		    if(j!=0) {
    207  1.1  mrg 			carry = 1; iq[i] = 0x1000000- j;
    208  1.1  mrg 		    }
    209  1.1  mrg 		} else  iq[i] = 0xffffff - j;
    210  1.1  mrg 	    }
    211  1.1  mrg 	    if(q0>0) {		/* rare case: chance is 1 in 12 */
    212  1.1  mrg 	        switch(q0) {
    213  1.1  mrg 	        case 1:
    214  1.1  mrg 	    	   iq[jz-1] &= 0x7fffff; break;
    215  1.1  mrg 	    	case 2:
    216  1.1  mrg 	    	   iq[jz-1] &= 0x3fffff; break;
    217  1.1  mrg 	        }
    218  1.1  mrg 	    }
    219  1.1  mrg 	    if(ih==2) {
    220  1.1  mrg 		z = one - z;
    221  1.1  mrg 		if(carry!=0) z -= scalbn(one,q0);
    222  1.1  mrg 	    }
    223  1.1  mrg 	}
    224  1.1  mrg 
    225  1.1  mrg     /* check if recomputation is needed */
    226  1.1  mrg 	if(z==zero) {
    227  1.1  mrg 	    j = 0;
    228  1.1  mrg 	    for (i=jz-1;i>=jk;i--) j |= iq[i];
    229  1.1  mrg 	    if(j==0) { /* need recomputation */
    230  1.1  mrg 		for(k=1;iq[jk-k]==0;k++);   /* k = no. of terms needed */
    231  1.1  mrg 
    232  1.1  mrg 		for(i=jz+1;i<=jz+k;i++) {   /* add q[jz+1] to q[jz+k] */
    233  1.1  mrg 		    f[jx+i] = (double) ipio2[jv+i];
    234  1.1  mrg 		    for(j=0,fw=0.0;j<=jx;j++) fw += x[j]*f[jx+i-j];
    235  1.1  mrg 		    q[i] = fw;
    236  1.1  mrg 		}
    237  1.1  mrg 		jz += k;
    238  1.1  mrg 		goto recompute;
    239  1.1  mrg 	    }
    240  1.1  mrg 	}
    241  1.1  mrg 
    242  1.1  mrg     /* chop off zero terms */
    243  1.1  mrg 	if(z==0.0) {
    244  1.1  mrg 	    jz -= 1; q0 -= 24;
    245  1.1  mrg 	    while(iq[jz]==0) { jz--; q0-=24;}
    246  1.1  mrg 	} else { /* break z into 24-bit if necessary */
    247  1.1  mrg 	    z = scalbn(z,-q0);
    248  1.1  mrg 	    if(z>=two24) {
    249  1.1  mrg 		fw = (double)((int32_t)(twon24*z));
    250  1.1  mrg 		iq[jz] = (int32_t)(z-two24*fw);
    251  1.1  mrg 		jz += 1; q0 += 24;
    252  1.1  mrg 		iq[jz] = (int32_t) fw;
    253  1.1  mrg 	    } else iq[jz] = (int32_t) z ;
    254  1.1  mrg 	}
    255  1.1  mrg 
    256  1.1  mrg     /* convert integer "bit" chunk to floating-point value */
    257  1.1  mrg 	fw = scalbn(one,q0);
    258  1.1  mrg 	for(i=jz;i>=0;i--) {
    259  1.1  mrg 	    q[i] = fw*(double)iq[i]; fw*=twon24;
    260  1.1  mrg 	}
    261  1.1  mrg 
    262  1.1  mrg     /* compute PIo2[0,...,jp]*q[jz,...,0] */
    263  1.1  mrg 	for(i=jz;i>=0;i--) {
    264  1.1  mrg 	    for(fw=0.0,k=0;k<=jp&&k<=jz-i;k++) fw += PIo2[k]*q[i+k];
    265  1.1  mrg 	    fq[jz-i] = fw;
    266  1.1  mrg 	}
    267  1.1  mrg 
    268  1.1  mrg     /* compress fq[] into y[] */
    269  1.1  mrg 	switch(prec) {
    270  1.1  mrg 	    case 0:
    271  1.1  mrg 		fw = 0.0;
    272  1.1  mrg 		for (i=jz;i>=0;i--) fw += fq[i];
    273  1.1  mrg 		y[0] = (ih==0)? fw: -fw;
    274  1.1  mrg 		break;
    275  1.1  mrg 	    case 1:
    276  1.1  mrg 	    case 2:
    277  1.1  mrg 		fw = 0.0;
    278  1.1  mrg 		for (i=jz;i>=0;i--) fw += fq[i];
    279  1.1  mrg 		y[0] = (ih==0)? fw: -fw;
    280  1.1  mrg 		fw = fq[0]-fw;
    281  1.1  mrg 		for (i=1;i<=jz;i++) fw += fq[i];
    282  1.1  mrg 		y[1] = (ih==0)? fw: -fw;
    283  1.1  mrg 		break;
    284  1.1  mrg 	    case 3:	/* painful */
    285  1.1  mrg 		for (i=jz;i>0;i--) {
    286  1.1  mrg #if __FLT_EVAL_METHOD__ != 0
    287  1.1  mrg 		    volatile
    288  1.1  mrg #endif
    289  1.1  mrg 		    double fv = (double)(fq[i-1]+fq[i]);
    290  1.1  mrg 		    fq[i]  += fq[i-1]-fv;
    291  1.1  mrg 		    fq[i-1] = fv;
    292  1.1  mrg 		}
    293  1.1  mrg 		for (i=jz;i>1;i--) {
    294  1.1  mrg #if __FLT_EVAL_METHOD__ != 0
    295  1.1  mrg 		    volatile
    296  1.1  mrg #endif
    297  1.1  mrg 		    double fv = (double)(fq[i-1]+fq[i]);
    298  1.1  mrg 		    fq[i]  += fq[i-1]-fv;
    299  1.1  mrg 		    fq[i-1] = fv;
    300  1.1  mrg 		}
    301  1.1  mrg 		for (fw=0.0,i=jz;i>=2;i--) fw += fq[i];
    302  1.1  mrg 		if(ih==0) {
    303  1.1  mrg 		    y[0] =  fq[0]; y[1] =  fq[1]; y[2] =  fw;
    304  1.1  mrg 		} else {
    305  1.1  mrg 		    y[0] = -fq[0]; y[1] = -fq[1]; y[2] = -fw;
    306  1.1  mrg 		}
    307  1.1  mrg 	}
    308  1.1  mrg 	return n&7;
    309  1.1  mrg }
    310  1.1  mrg 
    311  1.1  mrg 
    312  1.1  mrg 
    313  1.1  mrg 
    315  1.1  mrg 
    316  1.1  mrg /* Quad-precision floating point argument reduction.
    317  1.1  mrg    Copyright (C) 1999-2017 Free Software Foundation, Inc.
    318  1.1  mrg    This file is part of the GNU C Library.
    319  1.1  mrg    Contributed by Jakub Jelinek <jj (at) ultra.linux.cz>
    320  1.1  mrg 
    321  1.1  mrg    The GNU C Library is free software; you can redistribute it and/or
    322  1.1  mrg    modify it under the terms of the GNU Lesser General Public
    323  1.1  mrg    License as published by the Free Software Foundation; either
    324  1.1  mrg    version 2.1 of the License, or (at your option) any later version.
    325  1.1  mrg 
    326  1.1  mrg    The GNU C Library is distributed in the hope that it will be useful,
    327  1.1  mrg    but WITHOUT ANY WARRANTY; without even the implied warranty of
    328  1.1  mrg    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    329  1.1  mrg    Lesser General Public License for more details.
    330  1.1  mrg 
    331  1.1  mrg    You should have received a copy of the GNU Lesser General Public
    332  1.1  mrg    License along with the GNU C Library; if not, write to the Free
    333  1.1  mrg    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
    334  1.1  mrg    02111-1307 USA.  */
    335  1.1  mrg 
    336  1.1  mrg /*
    337  1.1  mrg  * Table of constants for 2/pi, 5628 hexadecimal digits of 2/pi
    338  1.1  mrg  */
    339  1.1  mrg static const int32_t two_over_pi[] = {
    340  1.1  mrg 0xa2f983, 0x6e4e44, 0x1529fc, 0x2757d1, 0xf534dd, 0xc0db62,
    341  1.1  mrg 0x95993c, 0x439041, 0xfe5163, 0xabdebb, 0xc561b7, 0x246e3a,
    342  1.1  mrg 0x424dd2, 0xe00649, 0x2eea09, 0xd1921c, 0xfe1deb, 0x1cb129,
    343  1.1  mrg 0xa73ee8, 0x8235f5, 0x2ebb44, 0x84e99c, 0x7026b4, 0x5f7e41,
    344  1.1  mrg 0x3991d6, 0x398353, 0x39f49c, 0x845f8b, 0xbdf928, 0x3b1ff8,
    345  1.1  mrg 0x97ffde, 0x05980f, 0xef2f11, 0x8b5a0a, 0x6d1f6d, 0x367ecf,
    346  1.1  mrg 0x27cb09, 0xb74f46, 0x3f669e, 0x5fea2d, 0x7527ba, 0xc7ebe5,
    347  1.1  mrg 0xf17b3d, 0x0739f7, 0x8a5292, 0xea6bfb, 0x5fb11f, 0x8d5d08,
    348  1.1  mrg 0x560330, 0x46fc7b, 0x6babf0, 0xcfbc20, 0x9af436, 0x1da9e3,
    349  1.1  mrg 0x91615e, 0xe61b08, 0x659985, 0x5f14a0, 0x68408d, 0xffd880,
    350  1.1  mrg 0x4d7327, 0x310606, 0x1556ca, 0x73a8c9, 0x60e27b, 0xc08c6b,
    351  1.1  mrg 0x47c419, 0xc367cd, 0xdce809, 0x2a8359, 0xc4768b, 0x961ca6,
    352  1.1  mrg 0xddaf44, 0xd15719, 0x053ea5, 0xff0705, 0x3f7e33, 0xe832c2,
    353  1.1  mrg 0xde4f98, 0x327dbb, 0xc33d26, 0xef6b1e, 0x5ef89f, 0x3a1f35,
    354  1.1  mrg 0xcaf27f, 0x1d87f1, 0x21907c, 0x7c246a, 0xfa6ed5, 0x772d30,
    355  1.1  mrg 0x433b15, 0xc614b5, 0x9d19c3, 0xc2c4ad, 0x414d2c, 0x5d000c,
    356  1.1  mrg 0x467d86, 0x2d71e3, 0x9ac69b, 0x006233, 0x7cd2b4, 0x97a7b4,
    357  1.1  mrg 0xd55537, 0xf63ed7, 0x1810a3, 0xfc764d, 0x2a9d64, 0xabd770,
    358  1.1  mrg 0xf87c63, 0x57b07a, 0xe71517, 0x5649c0, 0xd9d63b, 0x3884a7,
    359  1.1  mrg 0xcb2324, 0x778ad6, 0x23545a, 0xb91f00, 0x1b0af1, 0xdfce19,
    360  1.1  mrg 0xff319f, 0x6a1e66, 0x615799, 0x47fbac, 0xd87f7e, 0xb76522,
    361  1.1  mrg 0x89e832, 0x60bfe6, 0xcdc4ef, 0x09366c, 0xd43f5d, 0xd7de16,
    362  1.1  mrg 0xde3b58, 0x929bde, 0x2822d2, 0xe88628, 0x4d58e2, 0x32cac6,
    363  1.1  mrg 0x16e308, 0xcb7de0, 0x50c017, 0xa71df3, 0x5be018, 0x34132e,
    364  1.1  mrg 0x621283, 0x014883, 0x5b8ef5, 0x7fb0ad, 0xf2e91e, 0x434a48,
    365  1.1  mrg 0xd36710, 0xd8ddaa, 0x425fae, 0xce616a, 0xa4280a, 0xb499d3,
    366  1.1  mrg 0xf2a606, 0x7f775c, 0x83c2a3, 0x883c61, 0x78738a, 0x5a8caf,
    367  1.1  mrg 0xbdd76f, 0x63a62d, 0xcbbff4, 0xef818d, 0x67c126, 0x45ca55,
    368  1.1  mrg 0x36d9ca, 0xd2a828, 0x8d61c2, 0x77c912, 0x142604, 0x9b4612,
    369  1.1  mrg 0xc459c4, 0x44c5c8, 0x91b24d, 0xf31700, 0xad43d4, 0xe54929,
    370  1.1  mrg 0x10d5fd, 0xfcbe00, 0xcc941e, 0xeece70, 0xf53e13, 0x80f1ec,
    371  1.1  mrg 0xc3e7b3, 0x28f8c7, 0x940593, 0x3e71c1, 0xb3092e, 0xf3450b,
    372  1.1  mrg 0x9c1288, 0x7b20ab, 0x9fb52e, 0xc29247, 0x2f327b, 0x6d550c,
    373  1.1  mrg 0x90a772, 0x1fe76b, 0x96cb31, 0x4a1679, 0xe27941, 0x89dff4,
    374  1.1  mrg 0x9794e8, 0x84e6e2, 0x973199, 0x6bed88, 0x365f5f, 0x0efdbb,
    375  1.1  mrg 0xb49a48, 0x6ca467, 0x427271, 0x325d8d, 0xb8159f, 0x09e5bc,
    376  1.1  mrg 0x25318d, 0x3974f7, 0x1c0530, 0x010c0d, 0x68084b, 0x58ee2c,
    377  1.1  mrg 0x90aa47, 0x02e774, 0x24d6bd, 0xa67df7, 0x72486e, 0xef169f,
    378  1.1  mrg 0xa6948e, 0xf691b4, 0x5153d1, 0xf20acf, 0x339820, 0x7e4bf5,
    379  1.1  mrg 0x6863b2, 0x5f3edd, 0x035d40, 0x7f8985, 0x295255, 0xc06437,
    380  1.1  mrg 0x10d86d, 0x324832, 0x754c5b, 0xd4714e, 0x6e5445, 0xc1090b,
    381  1.1  mrg 0x69f52a, 0xd56614, 0x9d0727, 0x50045d, 0xdb3bb4, 0xc576ea,
    382  1.1  mrg 0x17f987, 0x7d6b49, 0xba271d, 0x296996, 0xacccc6, 0x5414ad,
    383  1.1  mrg 0x6ae290, 0x89d988, 0x50722c, 0xbea404, 0x940777, 0x7030f3,
    384  1.1  mrg 0x27fc00, 0xa871ea, 0x49c266, 0x3de064, 0x83dd97, 0x973fa3,
    385  1.1  mrg 0xfd9443, 0x8c860d, 0xde4131, 0x9d3992, 0x8c70dd, 0xe7b717,
    386  1.1  mrg 0x3bdf08, 0x2b3715, 0xa0805c, 0x93805a, 0x921110, 0xd8e80f,
    387  1.1  mrg 0xaf806c, 0x4bffdb, 0x0f9038, 0x761859, 0x15a562, 0xbbcb61,
    388  1.1  mrg 0xb989c7, 0xbd4010, 0x04f2d2, 0x277549, 0xf6b6eb, 0xbb22db,
    389  1.1  mrg 0xaa140a, 0x2f2689, 0x768364, 0x333b09, 0x1a940e, 0xaa3a51,
    390  1.1  mrg 0xc2a31d, 0xaeedaf, 0x12265c, 0x4dc26d, 0x9c7a2d, 0x9756c0,
    391  1.1  mrg 0x833f03, 0xf6f009, 0x8c402b, 0x99316d, 0x07b439, 0x15200c,
    392  1.1  mrg 0x5bc3d8, 0xc492f5, 0x4badc6, 0xa5ca4e, 0xcd37a7, 0x36a9e6,
    393  1.1  mrg 0x9492ab, 0x6842dd, 0xde6319, 0xef8c76, 0x528b68, 0x37dbfc,
    394  1.1  mrg 0xaba1ae, 0x3115df, 0xa1ae00, 0xdafb0c, 0x664d64, 0xb705ed,
    395  1.1  mrg 0x306529, 0xbf5657, 0x3aff47, 0xb9f96a, 0xf3be75, 0xdf9328,
    396  1.1  mrg 0x3080ab, 0xf68c66, 0x15cb04, 0x0622fa, 0x1de4d9, 0xa4b33d,
    397  1.1  mrg 0x8f1b57, 0x09cd36, 0xe9424e, 0xa4be13, 0xb52333, 0x1aaaf0,
    398  1.1  mrg 0xa8654f, 0xa5c1d2, 0x0f3f0b, 0xcd785b, 0x76f923, 0x048b7b,
    399  1.1  mrg 0x721789, 0x53a6c6, 0xe26e6f, 0x00ebef, 0x584a9b, 0xb7dac4,
    400  1.1  mrg 0xba66aa, 0xcfcf76, 0x1d02d1, 0x2df1b1, 0xc1998c, 0x77adc3,
    401  1.1  mrg 0xda4886, 0xa05df7, 0xf480c6, 0x2ff0ac, 0x9aecdd, 0xbc5c3f,
    402  1.1  mrg 0x6dded0, 0x1fc790, 0xb6db2a, 0x3a25a3, 0x9aaf00, 0x9353ad,
    403  1.1  mrg 0x0457b6, 0xb42d29, 0x7e804b, 0xa707da, 0x0eaa76, 0xa1597b,
    404  1.1  mrg 0x2a1216, 0x2db7dc, 0xfde5fa, 0xfedb89, 0xfdbe89, 0x6c76e4,
    405  1.1  mrg 0xfca906, 0x70803e, 0x156e85, 0xff87fd, 0x073e28, 0x336761,
    406  1.1  mrg 0x86182a, 0xeabd4d, 0xafe7b3, 0x6e6d8f, 0x396795, 0x5bbf31,
    407  1.1  mrg 0x48d784, 0x16df30, 0x432dc7, 0x356125, 0xce70c9, 0xb8cb30,
    408  1.1  mrg 0xfd6cbf, 0xa200a4, 0xe46c05, 0xa0dd5a, 0x476f21, 0xd21262,
    409  1.1  mrg 0x845cb9, 0x496170, 0xe0566b, 0x015299, 0x375550, 0xb7d51e,
    410  1.1  mrg 0xc4f133, 0x5f6e13, 0xe4305d, 0xa92e85, 0xc3b21d, 0x3632a1,
    411  1.1  mrg 0xa4b708, 0xd4b1ea, 0x21f716, 0xe4698f, 0x77ff27, 0x80030c,
    412  1.1  mrg 0x2d408d, 0xa0cd4f, 0x99a520, 0xd3a2b3, 0x0a5d2f, 0x42f9b4,
    413  1.1  mrg 0xcbda11, 0xd0be7d, 0xc1db9b, 0xbd17ab, 0x81a2ca, 0x5c6a08,
    414  1.1  mrg 0x17552e, 0x550027, 0xf0147f, 0x8607e1, 0x640b14, 0x8d4196,
    415  1.1  mrg 0xdebe87, 0x2afdda, 0xb6256b, 0x34897b, 0xfef305, 0x9ebfb9,
    416  1.1  mrg 0x4f6a68, 0xa82a4a, 0x5ac44f, 0xbcf82d, 0x985ad7, 0x95c7f4,
    417  1.1  mrg 0x8d4d0d, 0xa63a20, 0x5f57a4, 0xb13f14, 0x953880, 0x0120cc,
    418  1.1  mrg 0x86dd71, 0xb6dec9, 0xf560bf, 0x11654d, 0x6b0701, 0xacb08c,
    419  1.1  mrg 0xd0c0b2, 0x485551, 0x0efb1e, 0xc37295, 0x3b06a3, 0x3540c0,
    420  1.1  mrg 0x7bdc06, 0xcc45e0, 0xfa294e, 0xc8cad6, 0x41f3e8, 0xde647c,
    421  1.1  mrg 0xd8649b, 0x31bed9, 0xc397a4, 0xd45877, 0xc5e369, 0x13daf0,
    422  1.1  mrg 0x3c3aba, 0x461846, 0x5f7555, 0xf5bdd2, 0xc6926e, 0x5d2eac,
    423  1.1  mrg 0xed440e, 0x423e1c, 0x87c461, 0xe9fd29, 0xf3d6e7, 0xca7c22,
    424  1.1  mrg 0x35916f, 0xc5e008, 0x8dd7ff, 0xe26a6e, 0xc6fdb0, 0xc10893,
    425  1.1  mrg 0x745d7c, 0xb2ad6b, 0x9d6ecd, 0x7b723e, 0x6a11c6, 0xa9cff7,
    426  1.1  mrg 0xdf7329, 0xbac9b5, 0x5100b7, 0x0db2e2, 0x24ba74, 0x607de5,
    427  1.1  mrg 0x8ad874, 0x2c150d, 0x0c1881, 0x94667e, 0x162901, 0x767a9f,
    428  1.1  mrg 0xbefdfd, 0xef4556, 0x367ed9, 0x13d9ec, 0xb9ba8b, 0xfc97c4,
    429  1.1  mrg 0x27a831, 0xc36ef1, 0x36c594, 0x56a8d8, 0xb5a8b4, 0x0ecccf,
    430  1.1  mrg 0x2d8912, 0x34576f, 0x89562c, 0xe3ce99, 0xb920d6, 0xaa5e6b,
    431  1.1  mrg 0x9c2a3e, 0xcc5f11, 0x4a0bfd, 0xfbf4e1, 0x6d3b8e, 0x2c86e2,
    432  1.1  mrg 0x84d4e9, 0xa9b4fc, 0xd1eeef, 0xc9352e, 0x61392f, 0x442138,
    433  1.1  mrg 0xc8d91b, 0x0afc81, 0x6a4afb, 0xd81c2f, 0x84b453, 0x8c994e,
    434  1.1  mrg 0xcc2254, 0xdc552a, 0xd6c6c0, 0x96190b, 0xb8701a, 0x649569,
    435  1.1  mrg 0x605a26, 0xee523f, 0x0f117f, 0x11b5f4, 0xf5cbfc, 0x2dbc34,
    436  1.1  mrg 0xeebc34, 0xcc5de8, 0x605edd, 0x9b8e67, 0xef3392, 0xb817c9,
    437  1.1  mrg 0x9b5861, 0xbc57e1, 0xc68351, 0x103ed8, 0x4871dd, 0xdd1c2d,
    438  1.1  mrg 0xa118af, 0x462c21, 0xd7f359, 0x987ad9, 0xc0549e, 0xfa864f,
    439  1.1  mrg 0xfc0656, 0xae79e5, 0x362289, 0x22ad38, 0xdc9367, 0xaae855,
    440  1.1  mrg 0x382682, 0x9be7ca, 0xa40d51, 0xb13399, 0x0ed7a9, 0x480569,
    441  1.1  mrg 0xf0b265, 0xa7887f, 0x974c88, 0x36d1f9, 0xb39221, 0x4a827b,
    442  1.1  mrg 0x21cf98, 0xdc9f40, 0x5547dc, 0x3a74e1, 0x42eb67, 0xdf9dfe,
    443  1.1  mrg 0x5fd45e, 0xa4677b, 0x7aacba, 0xa2f655, 0x23882b, 0x55ba41,
    444  1.1  mrg 0x086e59, 0x862a21, 0x834739, 0xe6e389, 0xd49ee5, 0x40fb49,
    445  1.1  mrg 0xe956ff, 0xca0f1c, 0x8a59c5, 0x2bfa94, 0xc5c1d3, 0xcfc50f,
    446  1.1  mrg 0xae5adb, 0x86c547, 0x624385, 0x3b8621, 0x94792c, 0x876110,
    447  1.1  mrg 0x7b4c2a, 0x1a2c80, 0x12bf43, 0x902688, 0x893c78, 0xe4c4a8,
    448  1.1  mrg 0x7bdbe5, 0xc23ac4, 0xeaf426, 0x8a67f7, 0xbf920d, 0x2ba365,
    449  1.1  mrg 0xb1933d, 0x0b7cbd, 0xdc51a4, 0x63dd27, 0xdde169, 0x19949a,
    450  1.1  mrg 0x9529a8, 0x28ce68, 0xb4ed09, 0x209f44, 0xca984e, 0x638270,
    451  1.1  mrg 0x237c7e, 0x32b90f, 0x8ef5a7, 0xe75614, 0x08f121, 0x2a9db5,
    452  1.1  mrg 0x4d7e6f, 0x5119a5, 0xabf9b5, 0xd6df82, 0x61dd96, 0x023616,
    453  1.1  mrg 0x9f3ac4, 0xa1a283, 0x6ded72, 0x7a8d39, 0xa9b882, 0x5c326b,
    454  1.1  mrg 0x5b2746, 0xed3400, 0x7700d2, 0x55f4fc, 0x4d5901, 0x8071e0,
    455  1.1  mrg 0xe13f89, 0xb295f3, 0x64a8f1, 0xaea74b, 0x38fc4c, 0xeab2bb,
    456  1.1  mrg 0x47270b, 0xabc3a7, 0x34ba60, 0x52dd34, 0xf8563a, 0xeb7e8a,
    457  1.1  mrg 0x31bb36, 0x5895b7, 0x47f7a9, 0x94c3aa, 0xd39225, 0x1e7f3e,
    458  1.1  mrg 0xd8974e, 0xbba94f, 0xd8ae01, 0xe661b4, 0x393d8e, 0xa523aa,
    459  1.1  mrg 0x33068e, 0x1633b5, 0x3bb188, 0x1d3a9d, 0x4013d0, 0xcc1be5,
    460  1.1  mrg 0xf862e7, 0x3bf28f, 0x39b5bf, 0x0bc235, 0x22747e, 0xa247c0,
    461  1.1  mrg 0xd52d1f, 0x19add3, 0x9094df, 0x9311d0, 0xb42b25, 0x496db2,
    462  1.1  mrg 0xe264b2, 0x5ef135, 0x3bc6a4, 0x1a4ad0, 0xaac92e, 0x64e886,
    463  1.1  mrg 0x573091, 0x982cfb, 0x311b1a, 0x08728b, 0xbdcee1, 0x60e142,
    464  1.1  mrg 0xeb641d, 0xd0bba3, 0xe559d4, 0x597b8c, 0x2a4483, 0xf332ba,
    465  1.1  mrg 0xf84867, 0x2c8d1b, 0x2fa9b0, 0x50f3dd, 0xf9f573, 0xdb61b4,
    466  1.1  mrg 0xfe233e, 0x6c41a6, 0xeea318, 0x775a26, 0xbc5e5c, 0xcea708,
    467  1.1  mrg 0x94dc57, 0xe20196, 0xf1e839, 0xbe4851, 0x5d2d2f, 0x4e9555,
    468  1.1  mrg 0xd96ec2, 0xe7d755, 0x6304e0, 0xc02e0e, 0xfc40a0, 0xbbf9b3,
    469  1.1  mrg 0x7125a7, 0x222dfb, 0xf619d8, 0x838c1c, 0x6619e6, 0xb20d55,
    470  1.1  mrg 0xbb5137, 0x79e809, 0xaf9149, 0x0d73de, 0x0b0da5, 0xce7f58,
    471  1.1  mrg 0xac1934, 0x724667, 0x7a1a13, 0x9e26bc, 0x4555e7, 0x585cb5,
    472  1.1  mrg 0x711d14, 0x486991, 0x480d60, 0x56adab, 0xd62f64, 0x96ee0c,
    473  1.1  mrg 0x212ff3, 0x5d6d88, 0xa67684, 0x95651e, 0xab9e0a, 0x4ddefe,
    474  1.1  mrg 0x571010, 0x836a39, 0xf8ea31, 0x9e381d, 0xeac8b1, 0xcac96b,
    475  1.1  mrg 0x37f21e, 0xd505e9, 0x984743, 0x9fc56c, 0x0331b7, 0x3b8bf8,
    476  1.1  mrg 0x86e56a, 0x8dc343, 0x6230e7, 0x93cfd5, 0x6a8f2d, 0x733005,
    477  1.1  mrg 0x1af021, 0xa09fcb, 0x7415a1, 0xd56b23, 0x6ff725, 0x2f4bc7,
    478  1.1  mrg 0xb8a591, 0x7fac59, 0x5c55de, 0x212c38, 0xb13296, 0x5cff50,
    479  1.1  mrg 0x366262, 0xfa7b16, 0xf4d9a6, 0x2acfe7, 0xf07403, 0xd4d604,
    480  1.1  mrg 0x6fd916, 0x31b1bf, 0xcbb450, 0x5bd7c8, 0x0ce194, 0x6bd643,
    481  1.1  mrg 0x4fd91c, 0xdf4543, 0x5f3453, 0xe2b5aa, 0xc9aec8, 0x131485,
    482  1.1  mrg 0xf9d2bf, 0xbadb9e, 0x76f5b9, 0xaf15cf, 0xca3182, 0x14b56d,
    483  1.1  mrg 0xe9fe4d, 0x50fc35, 0xf5aed5, 0xa2d0c1, 0xc96057, 0x192eb6,
    484  1.1  mrg 0xe91d92, 0x07d144, 0xaea3c6, 0x343566, 0x26d5b4, 0x3161e2,
    485  1.1  mrg 0x37f1a2, 0x209eff, 0x958e23, 0x493798, 0x35f4a6, 0x4bdc02,
    486  1.1  mrg 0xc2be13, 0xbe80a0, 0x0b72a3, 0x115c5f, 0x1e1bd1, 0x0db4d3,
    487  1.1  mrg 0x869e85, 0x96976b, 0x2ac91f, 0x8a26c2, 0x3070f0, 0x041412,
    488  1.1  mrg 0xfc9fa5, 0xf72a38, 0x9c6878, 0xe2aa76, 0x50cfe1, 0x559274,
    489  1.1  mrg 0x934e38, 0x0a92f7, 0x5533f0, 0xa63db4, 0x399971, 0xe2b755,
    490  1.1  mrg 0xa98a7c, 0x008f19, 0xac54d2, 0x2ea0b4, 0xf5f3e0, 0x60c849,
    491  1.1  mrg 0xffd269, 0xae52ce, 0x7a5fdd, 0xe9ce06, 0xfb0ae8, 0xa50cce,
    492  1.1  mrg 0xea9d3e, 0x3766dd, 0xb834f5, 0x0da090, 0x846f88, 0x4ae3d5,
    493  1.1  mrg 0x099a03, 0x2eae2d, 0xfcb40a, 0xfb9b33, 0xe281dd, 0x1b16ba,
    494  1.1  mrg 0xd8c0af, 0xd96b97, 0xb52dc9, 0x9c277f, 0x5951d5, 0x21ccd6,
    495  1.1  mrg 0xb6496b, 0x584562, 0xb3baf2, 0xa1a5c4, 0x7ca2cf, 0xa9b93d,
    496  1.1  mrg 0x7b7b89, 0x483d38,
    497  1.1  mrg };
    498  1.1  mrg 
    499  1.1  mrg static const __float128 c[] = {
    500  1.1  mrg /* 113 bits of pi/2 */
    501  1.1  mrg #define PI_2_1 c[0]
    502  1.1  mrg  0x1.921fb54442d18469898cc51701b8p+0Q,
    503  1.1  mrg 
    504  1.1  mrg /* pi/2 - PI_2_1 */
    505  1.1  mrg #define PI_2_1t c[1]
    506  1.1  mrg  0x3.9a252049c1114cf98e804177d4c8p-116Q,
    507  1.1  mrg };
    508  1.1  mrg 
    509  1.1  mrg 
    510  1.1  mrg int32_t
    511  1.1  mrg __quadmath_rem_pio2q (__float128 x, __float128 *y)
    512  1.1  mrg {
    513  1.1  mrg   __float128 z, w, t;
    514  1.1  mrg   double tx[8];
    515  1.1  mrg   int64_t exp, n, ix, hx;
    516  1.1  mrg   uint64_t lx;
    517  1.1  mrg 
    518  1.1  mrg   GET_FLT128_WORDS64 (hx, lx, x);
    519  1.1  mrg   ix = hx & 0x7fffffffffffffffLL;
    520  1.1  mrg   if (ix <= 0x3ffe921fb54442d1LL)	/* x in <-pi/4, pi/4> */
    521  1.1  mrg     {
    522  1.1  mrg       y[0] = x;
    523  1.1  mrg       y[1] = 0;
    524  1.1  mrg       return 0;
    525  1.1  mrg     }
    526  1.1  mrg 
    527  1.1  mrg   if (ix < 0x40002d97c7f3321dLL)	/* |x| in <pi/4, 3pi/4) */
    528  1.1  mrg     {
    529  1.1  mrg       if (hx > 0)
    530  1.1  mrg 	{
    531  1.1  mrg 	  /* 113 + 113 bit PI is ok */
    532  1.1  mrg 	  z = x - PI_2_1;
    533  1.1  mrg 	  y[0] = z - PI_2_1t;
    534  1.1  mrg 	  y[1] = (z - y[0]) - PI_2_1t;
    535  1.1  mrg 	  return 1;
    536  1.1  mrg 	}
    537  1.1  mrg       else
    538  1.1  mrg         {
    539  1.1  mrg 	  /* 113 + 113 bit PI is ok */
    540  1.1  mrg 	  z = x + PI_2_1;
    541  1.1  mrg 	  y[0] = z + PI_2_1t;
    542  1.1  mrg 	  y[1] = (z - y[0]) + PI_2_1t;
    543  1.1  mrg 	  return -1;
    544  1.1  mrg 	}
    545  1.1  mrg     }
    546  1.1  mrg 
    547  1.1  mrg   if (ix >= 0x7fff000000000000LL)	/* x is +=oo or NaN */
    548  1.1  mrg     {
    549  1.1  mrg       y[0] = x - x;
    550  1.1  mrg       y[1] = y[0];
    551  1.1  mrg       return 0;
    552  1.1  mrg     }
    553  1.1  mrg 
    554  1.1  mrg   /* Handle large arguments.
    555  1.1  mrg      We split the 113 bits of the mantissa into 5 24bit integers
    556  1.1  mrg      stored in a double array.  */
    557  1.1  mrg   exp = (ix >> 48) - 16383 - 23;
    558  1.1  mrg 
    559  1.1  mrg   /* This is faster than doing this in floating point, because we
    560  1.1  mrg      have to convert it to integers anyway and like this we can keep
    561  1.1  mrg      both integer and floating point units busy.  */
    562  1.1  mrg   tx [0] = (double)(((ix >> 25) & 0x7fffff) | 0x800000);
    563  1.1  mrg   tx [1] = (double)((ix >> 1) & 0xffffff);
    564  1.1  mrg   tx [2] = (double)(((ix << 23) | (lx >> 41)) & 0xffffff);
    565  1.1  mrg   tx [3] = (double)((lx >> 17) & 0xffffff);
    566  1.1  mrg   tx [4] = (double)((lx << 7) & 0xffffff);
    567  1.1  mrg 
    568  1.1  mrg   n = __quadmath_kernel_rem_pio2 (tx, tx + 5, exp,
    569  1.1  mrg 				  ((lx << 7) & 0xffffff) ? 5 : 4,
    570  1.1  mrg 				  3, two_over_pi);
    571  1.1  mrg 
    572  1.1  mrg   /* The result is now stored in 3 double values, we need to convert it into
    573  1.1  mrg      two __float128 values.  */
    574  1.1  mrg   t = (__float128) tx [6] + (__float128) tx [7];
    575  1.1  mrg   w = (__float128) tx [5];
    576  1.1  mrg 
    577  1.1  mrg   if (hx >= 0)
    578  1.1  mrg     {
    579  1.1  mrg       y[0] = w + t;
    580  1.1  mrg       y[1] = t - (y[0] - w);
    581  1.1  mrg       return n;
    582  1.1  mrg     }
    583  1.1  mrg   else
    584  1.1  mrg     {
    585  1.1  mrg       y[0] = -(w + t);
    586  1.1  mrg       y[1] = -t - (y[0] + w);
    587  1.1  mrg       return -n;
    588  1.1  mrg     }
    589           }
    590