int remainder_pio2_kernel(double *x, double *y, int e0, int nx, int prec, const int *ipio2) { int jz, jx, jv, jp, jk, carry, n, iq[20], i, j, k, m, q0, ih; double z, fw, f[20], fq[20], q[20]; /* initialize jk*/ jk = init_jk[prec]; jp = jk; /* determine jx,jv,q0, note that 3>q0 */ jx = nx - 1; jv = (e0 - 3) / 24; if (jv < 0) { jv = 0; } q0 = e0 - 24 * (jv + 1); /* set up f[0] to f[jx+jk] where f[jx+jk] = ipio2[jv+jk] */ j = jv - jx; m = jx + jk; for (i = 0; i <= m; i++, j++) { f[i] = (j < 0) ? zero_kr : jvm_i2d(ipio2[j]); } /* compute q[0],q[1],...q[jk] */ for (i=0; i <= jk; i++) { for(j = 0, fw = 0.0; j <= jx; j++) { fw = jvm_dadd(fw, jvm_dmul(x[j], f[jx + i - j])); } q[i] = fw; } jz = jk; recompute: /* distill q[] into iq[] reversingly */ for(i = 0, j = jz, z = q[jz]; j > 0; i++,j--) { fw = jvm_i2d(jvm_d2i(jvm_dmul(twon24, z))); iq[i] = jvm_d2i(jvm_dsub(z, jvm_dmul(two24_kr, fw))); z = jvm_dadd(q[j-1], fw); } /* compute n */ z = jvm_fplib_scalbn(z,q0); /* actual value of z */ z = jvm_dsub(z, jvm_dmul(8.0, jvm_fplib_floor(jvm_dmul(z,0.125)))); /* trim off integer >= 8 */ n = jvm_d2i(z); z = jvm_dsub(z, jvm_i2d(n)); ih = 0; if(q0 > 0) { /* need iq[jz-1] to determine n */ i = (iq[jz-1] >> (24 - q0)); n += i; iq[jz - 1] -= i << (24 - q0); ih = iq[jz - 1] >> (23 - q0); } else if (q0 == 0) {
double tangent_kernel(double x, double y, int iy) { double z, r, v, w, s; int ix, hx; hx = __JHI(x); /* high word of x */ ix = hx & 0x7fffffff; /* high word of |x| */ if (ix < 0x3e300000) { /* x < 2**-28 */ if (jvm_d2i(x) == 0) { /* generate inexact */ if (((ix | __JLO(x)) | (iy + 1)) == 0) { return jvm_ddiv(one_t, jvm_fplib_fabs(x)); } else { return (iy == 1)? x: jvm_ddiv(jvm_dneg(one_t), x); } } } if (ix >= 0x3FE59428) { /* |x|>=0.6744 */ if (hx < 0) { x = jvm_dneg(x); y = jvm_dneg(y); } z = jvm_dsub(pio4, x); w = jvm_dsub(pio4lo, y); x = jvm_dadd(z, w); y = 0.0; } z = jvm_dmul(x, x); w = jvm_dmul(z, z); /* Break x^5*(T[1]+x^2*T[2]+...) into * x^5(T[1]+x^4*T[3]+...+x^20*T[11]) + * x^5(x^2*(T[2]+x^4*T[4]+...+x^22*[T12])) */ //r = T[1]+w*(T[3]+w*(T[5]+w*(T[7]+w*(T[9]+w*T[11])))); r = jvm_dadd(T[1], jvm_dmul(w, jvm_dadd(T[3], jvm_dmul(w, jvm_dadd(T[5], jvm_dmul(w, jvm_dadd(T[7], jvm_dmul(w, jvm_dadd(T[9], jvm_dmul(w, T[11])))))))))); //v = z*(T[2]+w*(T[4]+w*(T[6]+w*(T[8]+w*(T[10]+w*T[12]))))); v = jvm_dmul(z, jvm_dadd(T[2], jvm_dmul(w, jvm_dadd(T[4], jvm_dmul(w, jvm_dadd(T[6], jvm_dmul(w, jvm_dadd(T[8], jvm_dmul(w, jvm_dadd(T[10], jvm_dmul(w, T[12]))))))))))); s = jvm_dmul(z, x); r = jvm_dadd(y, jvm_dmul(z, jvm_dmul(s, jvm_dadd(jvm_dadd(r, v), y)))); r = jvm_dadd(r, jvm_dmul(T[0], s)); w = jvm_dadd(x, r); if(ix >= 0x3FE59428) { v = jvm_i2d(iy); return jvm_dmul(jvm_i2d((1 - ((hx >> 30) & 2))), jvm_dsub(v, jvm_dmul(2.0, jvm_dsub(x, jvm_dsub(jvm_dmul(w, jvm_ddiv( w, jvm_dadd(w, v))), r))))); }