static inline A0_n asin(const A0_n a0_n) { const A0 a0 = { a0_n }; A0 sign, x; x = nt2::abs(a0); sign = bitofsign(a0); const bA0 x_smaller_1e_4 = lt(x, single_constant<A0, 0x38d1b717>()); //1.0e-4f; const bA0 x_larger_05 = gt(x, Half<A0>()); const bA0 x_else = logical_or(x_smaller_1e_4, x_larger_05); A0 a = if_else_zero(x_smaller_1e_4, x); const A0 b = if_else_zero(x_larger_05, Half<A0>()*oneminus(x)); A0 z = b_or(b_or(if_zero_else(x_else, sqr(x)), a), b); x = if_zero_else(x_else, x); a = if_else_zero(x_larger_05, sqrt(z)); x = b_or(a, x); A0 z1 = madd(z, single_constant<A0, 0x3d2cb352>(), single_constant<A0, 0x3cc617e3>()); z1 = madd(z1, z, single_constant<A0, 0x3d3a3ec7>()); z1 = madd(z1, z, single_constant<A0, 0x3d9980f6>()); z1 = madd(z1, z, single_constant<A0, 0x3e2aaae4>()); z1 = madd(z1, z*x, x); z = select(x_smaller_1e_4, z, z1); z1 = z+z; z1 = Pio_2<A0>()-z1; z = select(x_larger_05, z1, z); return b_xor(z, sign); }
static inline void kernel_log(const A0& a0, A0& fe, A0& x, A0& x2, A0& y) { typedef typename meta::as_integer<A0, signed>::type int_type; int_type e; x = fast_frexp(a0, e); int_type x_lt_sqrthf = if_else_zero(gt(single_constant<A0, 0x3f3504f3>(),x), Mone<int_type>()); e = e+x_lt_sqrthf; x = x+b_and(x, x_lt_sqrthf)+single_constant<A0, 0xbf800000>(); x2 = sqr(x); A0 y1 = madd(single_constant<A0, 0x3d9021bb>() ,x2,single_constant<A0, 0x3def251a>() ); A0 y2 = madd(single_constant<A0, 0xbdebd1b8>() ,x2,single_constant<A0, 0xbdfe5d4f>() ); y1 = madd(y1,x2,single_constant<A0, 0x3e11e9bf>() ); y2 = madd(y2,x2,single_constant<A0, 0xbe2aae50>() ); y1 = madd(y1,x2,single_constant<A0, 0x3e4cceac>() ); y2 = madd(y2,x2,single_constant<A0, 0xbe7ffffc>() ); y1 = madd(y1,x2,single_constant<A0, 0x3eaaaaaa>() ); y = madd(x,y2,y1)*x*x2; fe = tofloat(e); }