added support for native and double precision trigonometry/transendentals
This commit is contained in:
79
stdlib.ispc
79
stdlib.ispc
@@ -2433,29 +2433,29 @@ static inline uniform float sin(uniform float x_full) {
|
||||
|
||||
|
||||
__declspec(safe)
|
||||
static inline float asin(float x) {
|
||||
bool isneg = x < 0;
|
||||
x = abs(x);
|
||||
|
||||
static inline float asin(float x0) {
|
||||
bool isneg = x0< 0;
|
||||
float x = abs(x0);
|
||||
bool isnan = (x > 1);
|
||||
|
||||
float v;
|
||||
|
||||
if (__have_native_trigonometry)
|
||||
{
|
||||
return __asin_varying_float(x_full);
|
||||
return __asin_varying_float(x0);
|
||||
}
|
||||
else if (__math_lib == __math_lib_svml) {
|
||||
return __svml_asinf(x);
|
||||
return __svml_asinf(x0);
|
||||
}
|
||||
else if (__math_lib == __math_lib_system) {
|
||||
float ret;
|
||||
foreach_active (i) {
|
||||
uniform float r = __stdlib_asinf(extract(x, i));
|
||||
uniform float r = __stdlib_asinf(extract(x0, i));
|
||||
ret = insert(ret, i, r);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
else if (__math_lib == __math_lib_ispc)
|
||||
{
|
||||
// sollya
|
||||
// fpminimax(((asin(x)-pi/2)/-sqrt(1-x)), [|0,1,2,3,4,5,6,7,8,9,10|],
|
||||
// [|single...|], [1e-20;.9999999999999999]);
|
||||
@@ -2471,7 +2471,9 @@ static inline float asin(float x) {
|
||||
x * (3.05023305118083953857421875e-2f +
|
||||
x * (-1.2897425331175327301025390625e-2f +
|
||||
x * 2.38926825113594532012939453125e-3f)))))))));
|
||||
}
|
||||
else if (__math_lib == __math_lib_ispc_fast)
|
||||
{
|
||||
// sollya
|
||||
// fpminimax(((asin(x)-pi/2)/-sqrt(1-x)), [|0,1,2,3,4,5|],[|single...|],
|
||||
// [1e-20;.9999999999999999]);
|
||||
@@ -2482,6 +2484,7 @@ static inline float asin(float x) {
|
||||
x * (-4.489909112453460693359375e-2f +
|
||||
x * (1.928029954433441162109375e-2f +
|
||||
x * (-4.3095736764371395111083984375e-3f)))));
|
||||
}
|
||||
|
||||
v *= -sqrt(1.f - x);
|
||||
v = v + 1.57079637050628662109375;
|
||||
@@ -2496,22 +2499,21 @@ static inline float asin(float x) {
|
||||
|
||||
|
||||
__declspec(safe)
|
||||
static inline uniform float asin(uniform float x) {
|
||||
uniform bool isneg = x < 0;
|
||||
x = abs(x);
|
||||
|
||||
static inline uniform float asin(uniform float x0) {
|
||||
uniform bool isneg = x0 < 0;
|
||||
uniform float x = abs(x0);
|
||||
uniform bool isnan = (x > 1);
|
||||
|
||||
uniform float v;
|
||||
if (__have_native_trigonometry)
|
||||
{
|
||||
return __asin_uniform_float(x_full);
|
||||
return __asin_uniform_float(x0);
|
||||
}
|
||||
else if (__math_lib == __math_lib_svml ||
|
||||
__math_lib == __math_lib_system) {
|
||||
return __stdlib_asinf(x);
|
||||
return __stdlib_asinf(x0);
|
||||
}
|
||||
else if (__math_lib == __math_lib_ispc)
|
||||
{
|
||||
// sollya
|
||||
// fpminimax(((asin(x)-pi/2)/-sqrt(1-x)), [|0,1,2,3,4,5,6,7,8,9,10|],
|
||||
// [|single...|], [1e-20;.9999999999999999]);
|
||||
@@ -2527,7 +2529,9 @@ static inline uniform float asin(uniform float x) {
|
||||
x * (3.05023305118083953857421875e-2f +
|
||||
x * (-1.2897425331175327301025390625e-2f +
|
||||
x * 2.38926825113594532012939453125e-3f)))))))));
|
||||
}
|
||||
else if (__math_lib == __math_lib_ispc_fast)
|
||||
{
|
||||
// sollya
|
||||
// fpminimax(((asin(x)-pi/2)/-sqrt(1-x)), [|0,1,2,3,4,5|],[|single...|],
|
||||
// [1e-20;.9999999999999999]);
|
||||
@@ -2538,6 +2542,7 @@ static inline uniform float asin(uniform float x) {
|
||||
x * (-4.489909112453460693359375e-2f +
|
||||
x * (1.928029954433441162109375e-2f +
|
||||
x * (-4.3095736764371395111083984375e-3f)))));
|
||||
}
|
||||
|
||||
v *= -sqrt(1.f - x);
|
||||
v = v + 1.57079637050628662109375;
|
||||
@@ -2687,22 +2692,34 @@ static inline uniform float cos(uniform float x_full) {
|
||||
|
||||
__declspec(safe)
|
||||
static inline float acos(float v) {
|
||||
if (__have_native_trigonometry)
|
||||
return __acos_varying_float(v);
|
||||
else
|
||||
return 1.57079637050628662109375 - asin(v);
|
||||
}
|
||||
|
||||
__declspec(safe)
|
||||
static inline double acos(const double v) {
|
||||
if (__have_native_trigonometry)
|
||||
return __acos_varying_double(v);
|
||||
else
|
||||
return 1.57079637050628662109375d0 - asin(v);
|
||||
}
|
||||
|
||||
|
||||
__declspec(safe)
|
||||
static inline uniform float acos(uniform float v) {
|
||||
if (__have_native_trigonometry)
|
||||
return __acos_uniform_float(v);
|
||||
else
|
||||
return 1.57079637050628662109375 - asin(v);
|
||||
}
|
||||
|
||||
__declspec(safe)
|
||||
static inline uniform double acos(const uniform double v) {
|
||||
if (__have_native_trigonometry)
|
||||
return __acos_uniform_double(v);
|
||||
else
|
||||
return 1.57079637050628662109375d0 - asin(v);
|
||||
}
|
||||
|
||||
@@ -3696,7 +3713,7 @@ __declspec(safe)
|
||||
static inline double sin(double x) {
|
||||
if (__have_native_trigonometry)
|
||||
{
|
||||
return __sin_varying_double(x_full);
|
||||
return __sin_varying_double(x);
|
||||
}
|
||||
else if (__math_lib == __math_lib_svml)
|
||||
{
|
||||
@@ -3715,7 +3732,7 @@ __declspec(safe)
|
||||
static inline double asin(double x) {
|
||||
if (__have_native_trigonometry)
|
||||
{
|
||||
return __asin_varying_double(x_full);
|
||||
return __asin_varying_double(x);
|
||||
}
|
||||
else if (__math_lib == __math_lib_svml)
|
||||
{
|
||||
@@ -3735,7 +3752,7 @@ __declspec(safe)
|
||||
static inline uniform double sin(uniform double x) {
|
||||
if (__have_native_trigonometry)
|
||||
{
|
||||
return __sin_uniform_double(x_full);
|
||||
return __sin_uniform_double(x);
|
||||
}
|
||||
else
|
||||
return __stdlib_sin(x);
|
||||
@@ -3745,7 +3762,7 @@ __declspec(safe)
|
||||
static inline double asin(const double x) {
|
||||
if (__have_native_trigonometry)
|
||||
{
|
||||
return __asin_varying_double(x_full);
|
||||
return __asin_varying_double(x);
|
||||
}
|
||||
else if (__math_lib == __math_lib_svml)
|
||||
{
|
||||
@@ -3765,7 +3782,7 @@ __declspec(safe)
|
||||
static inline double cos(const double x) {
|
||||
if (__have_native_trigonometry)
|
||||
{
|
||||
return __cos_varying_double(x_full);
|
||||
return __cos_varying_double(x);
|
||||
}
|
||||
if (__math_lib == __math_lib_svml)
|
||||
{
|
||||
@@ -3785,7 +3802,7 @@ __declspec(safe)
|
||||
static inline uniform double cos(uniform double x) {
|
||||
if (__have_native_trigonometry)
|
||||
{
|
||||
return __cos_uniform_double(x_full);
|
||||
return __cos_uniform_double(x);
|
||||
}
|
||||
else
|
||||
return __stdlib_cos(x);
|
||||
@@ -3796,7 +3813,7 @@ static inline void sincos(double x, varying double * uniform sin_result,
|
||||
varying double * uniform cos_result) {
|
||||
if (__have_native_trigonometry)
|
||||
{
|
||||
__sincos_varying_double(x_full),sin_result,cos_result);
|
||||
__sincos_varying_double(x,sin_result,cos_result);
|
||||
}
|
||||
if (__math_lib == __math_lib_svml)
|
||||
{
|
||||
@@ -3817,7 +3834,7 @@ static inline void sincos(uniform double x, uniform double * uniform sin_result,
|
||||
uniform double * uniform cos_result) {
|
||||
if (__have_native_trigonometry)
|
||||
{
|
||||
__sincos_uniform_double(x_full,sin_result, cos_result);
|
||||
__sincos_uniform_double(x,sin_result, cos_result);
|
||||
}
|
||||
else
|
||||
__stdlib_sincos(x, sin_result, cos_result);
|
||||
@@ -3827,7 +3844,7 @@ __declspec(safe)
|
||||
static inline double tan(double x) {
|
||||
if (__have_native_trigonometry)
|
||||
{
|
||||
return __tan_varying_double(x_full);
|
||||
return __tan_varying_double(x);
|
||||
}
|
||||
else if (__math_lib == __math_lib_svml)
|
||||
{
|
||||
@@ -3847,7 +3864,7 @@ __declspec(safe)
|
||||
static inline uniform double tan(uniform double x) {
|
||||
if (__have_native_trigonometry)
|
||||
{
|
||||
return __tan_uniform_double(x_full);
|
||||
return __tan_uniform_double(x);
|
||||
}
|
||||
else
|
||||
return __stdlib_tan(x);
|
||||
@@ -3857,7 +3874,7 @@ __declspec(safe)
|
||||
static inline double atan(double x) {
|
||||
if (__have_native_trigonometry)
|
||||
{
|
||||
return __atan_varying_double(x_full);
|
||||
return __atan_varying_double(x);
|
||||
}
|
||||
else {
|
||||
double ret;
|
||||
@@ -3873,7 +3890,7 @@ __declspec(safe)
|
||||
static inline uniform double atan(uniform double x) {
|
||||
if (__have_native_trigonometry)
|
||||
{
|
||||
return __atan_uniform_double(x_full);
|
||||
return __atan_uniform_double(x);
|
||||
}
|
||||
else
|
||||
return __stdlib_atan(x);
|
||||
@@ -3912,7 +3929,7 @@ static inline uniform double atan2(uniform double y, uniform double x) {
|
||||
__declspec(safe)
|
||||
static inline double exp(double x) {
|
||||
if (__have_native_transcendentals) {
|
||||
return __exp_varying_double(x_full);
|
||||
return __exp_varying_double(x);
|
||||
}
|
||||
else if (__math_lib == __math_lib_svml)
|
||||
{
|
||||
@@ -3931,7 +3948,7 @@ static inline double exp(double x) {
|
||||
__declspec(safe)
|
||||
static inline uniform double exp(uniform double x) {
|
||||
if (__have_native_transcendentals) {
|
||||
return __exp_uniform_double(x_full);
|
||||
return __exp_uniform_double(x);
|
||||
}
|
||||
else
|
||||
return __stdlib_exp(x);
|
||||
@@ -3940,7 +3957,7 @@ static inline uniform double exp(uniform double x) {
|
||||
__declspec(safe)
|
||||
static inline double log(double x) {
|
||||
if (__have_native_transcendentals) {
|
||||
return __log_varying_double(x_full);
|
||||
return __log_varying_double(x);
|
||||
}
|
||||
else if (__math_lib == __math_lib_svml)
|
||||
{
|
||||
@@ -3959,7 +3976,7 @@ static inline double log(double x) {
|
||||
__declspec(safe)
|
||||
static inline uniform double log(uniform double x) {
|
||||
if (__have_native_transcendentals) {
|
||||
return __log_uniform_double(x_full);
|
||||
return __log_uniform_double(x);
|
||||
}
|
||||
else
|
||||
return __stdlib_log(x);
|
||||
|
||||
Reference in New Issue
Block a user