diff --git a/stdlib.ispc b/stdlib.ispc index 01aae815..7d91a231 100644 --- a/stdlib.ispc +++ b/stdlib.ispc @@ -3810,22 +3810,14 @@ static inline double sin(double x) { } } __declspec(safe) -static inline double asin(double x) { +static inline uniform double asin(uniform double x) { if (__have_native_trigonometry) { - return __asin_varying_double(x); + return __asin_uniform_double(x); } - else if (__math_lib == __math_lib_svml) + else { - return __svml_asind(x); - } - else { - double ret; - foreach_active (i) { - uniform double r = __stdlib_asin(extract(x, i)); - ret = insert(ret, i, r); - } - return ret; + return __stdlib_asin(x); } } diff --git a/tests/asin.ispc b/tests/asin.ispc index 4ad23b3a..20609570 100644 --- a/tests/asin.ispc +++ b/tests/asin.ispc @@ -3,17 +3,47 @@ export uniform int width() { return programCount; } bool ok(float x, float ref) { return (abs(x - ref) < 1e-6) || abs((x-ref)/ref) < 1e-6; } +bool ok(double x, double ref) { return (abs(x - ref) < 1e-6) || abs((x-ref)/ref) < 1e-6; } export void f_v(uniform float RET[]) { - uniform float vals[8] = { 0, 1, 0.5, -1, -.87, -.25, 1e-3, -.99999999 }; - uniform float r[8]; - foreach (i = 0 ... 8) - r[i] = sin(asin(vals[i%8])); + uniform float vals_f[8] = { 0, 1, 0.5, -1, -.87, -.25, 1e-3, -.99999999 }; + uniform float r_f[8]; + foreach (i = 0 ... 8) //testing varying float + r_f[i] = sin(asin(vals_f[i%8])); int errors = 0; for (uniform int i = 0; i < 8; ++i) { - if (ok(r[i], vals[i%8]) == false) { - print("error @ %: got %, expected %\n", i, r[i], vals[i%8]); + if (ok(r_f[i], vals_f[i%8]) == false) { + print("error @ %: got %, expected %\n", i, r_f[i], vals_f[i%8]); + ++errors; + } + } + for (uniform int i = 0; i < 8 ; i++){ + r_f[i] = sin(asin(vals_f[i%8])); //testing uniform float + } + for (uniform int i = 0; i < 8; ++i) { + if (ok(r_f[i], vals_f[i%8]) == false) { + print("error @ %: got %, expected %\n", i, r_f[i], vals_f[i%8]); + ++errors; + } + } + uniform double vals_d[8] = { 0, 1, 0.5, -1, -.87, -.25, 1e-3, -.99999999 }; + uniform double r_d[8]; + foreach (i = 0 ... 8) + r_d[i] = sin(asin(vals_d[i%8])); //testing varying double + + for (uniform int i = 0; i < 8; ++i) { + if (ok(r_d[i], vals_d[i%8]) == false) { + print("error @ %: got %, expected %\n", i, r_d[i], vals_d[i%8]); + ++errors; + } + } + for (uniform int i = 0; i < 8 ; i++){ + r_d[i] = sin(asin(vals_d[i%8])); //testing uniform double + } + for (uniform int i = 0; i < 8; ++i) { + if (ok(r_d[i], vals_d[i%8]) == false) { + print("error @ %: got %, expected %\n", i, r_d[i], vals_d[i%8]); ++errors; } }