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) {
Ejemplo n.º 2
0
JVM_SOFTFP_LINKAGE jdouble jvm_floor(jdouble x) {
  return jvm_fplib_floor(x);
}