added svml support. experimental. for some reason all sybmols are visible..

This commit is contained in:
egaburov
2013-09-11 15:16:50 +02:00
parent 9c79d4d182
commit 320c41ffcf
17 changed files with 216 additions and 269 deletions

View File

@@ -2180,7 +2180,7 @@ static inline uniform float frexp(uniform float x, uniform int * uniform pw2) {
__declspec(safe)
static inline float sin(float x_full) {
if (__math_lib == __math_lib_svml) {
return __svml_sin(x_full);
return __svml_sinf(x_full);
}
else if (__math_lib == __math_lib_system) {
float ret;
@@ -2313,8 +2313,10 @@ static inline float asin(float x) {
bool isnan = (x > 1);
float v;
if (__math_lib == __math_lib_svml ||
__math_lib == __math_lib_system) {
if (__math_lib == __math_lib_svml) {
return __svml_asinf(x);
}
else if (__math_lib == __math_lib_system) {
float ret;
foreach_active (i) {
uniform float r = __stdlib_asinf(extract(x, i));
@@ -2417,7 +2419,7 @@ static inline uniform float asin(uniform float x) {
__declspec(safe)
static inline float cos(float x_full) {
if (__math_lib == __math_lib_svml) {
return __svml_cos(x_full);
return __svml_cosf(x_full);
}
else if (__math_lib == __math_lib_system) {
float ret;
@@ -2545,18 +2547,28 @@ static inline float acos(float v) {
return 1.57079637050628662109375 - asin(v);
}
__declspec(safe)
static inline double acos(const double v) {
return 1.57079637050628662109375 - asin(v);
}
__declspec(safe)
static inline uniform float acos(uniform float v) {
return 1.57079637050628662109375 - asin(v);
}
__declspec(safe)
static inline uniform double acos(const uniform double v) {
return 1.57079637050628662109375 - asin(v);
}
__declspec(safe)
static inline void sincos(float x_full, varying float * uniform sin_result,
varying float * uniform cos_result) {
if (__math_lib == __math_lib_svml) {
__svml_sincos(x_full, sin_result, cos_result);
__svml_sincosf(x_full, sin_result, cos_result);
}
else if (__math_lib == __math_lib_system) {
foreach_active (i) {
@@ -2688,7 +2700,7 @@ static inline void sincos(uniform float x_full, uniform float * uniform sin_resu
__declspec(safe)
static inline float tan(float x_full) {
if (__math_lib == __math_lib_svml) {
return __svml_tan(x_full);
return __svml_tanf(x_full);
}
else if (__math_lib == __math_lib_system) {
float ret;
@@ -2839,7 +2851,7 @@ static inline uniform float tan(uniform float x_full) {
__declspec(safe)
static inline float atan(float x_full) {
if (__math_lib == __math_lib_svml) {
return __svml_atan(x_full);
return __svml_atanf(x_full);
}
else if (__math_lib == __math_lib_system) {
float ret;
@@ -2934,7 +2946,7 @@ static inline uniform float atan(uniform float x_full) {
__declspec(safe)
static inline float atan2(float y, float x) {
if (__math_lib == __math_lib_svml) {
return __svml_atan2(y, x);
return __svml_atan2f(y, x);
}
else if (__math_lib == __math_lib_system) {
float ret;
@@ -2997,7 +3009,7 @@ static inline float exp(float x_full) {
return __exp_varying_float(x_full);
}
else if (__math_lib == __math_lib_svml) {
return __svml_exp(x_full);
return __svml_expf(x_full);
}
else if (__math_lib == __math_lib_system) {
float ret;
@@ -3204,7 +3216,7 @@ static inline float log(float x_full) {
return __log_varying_float(x_full);
}
else if (__math_lib == __math_lib_svml) {
return __svml_log(x_full);
return __svml_logf(x_full);
}
else if (__math_lib == __math_lib_system) {
float ret;
@@ -3379,7 +3391,7 @@ static inline float pow(float a, float b) {
return __pow_varying_float(a, b);
}
else if (__math_lib == __math_lib_svml) {
return __svml_pow(a, b);
return __svml_powf(a, b);
}
else if (__math_lib == __math_lib_system) {
float ret;
@@ -3469,7 +3481,11 @@ static inline uniform double frexp(uniform double x, uniform int * uniform pw2)
__declspec(safe)
static inline double sin(double x) {
if (__math_lib == __math_lib_ispc_fast)
if (__math_lib == __math_lib_svml)
{
return __svml_sind(x);
}
else if (__math_lib == __math_lib_ispc_fast)
return sin((float)x);
else {
double ret;
@@ -3490,8 +3506,30 @@ static inline uniform double sin(uniform double x) {
}
__declspec(safe)
static inline double cos(double x) {
if (__math_lib == __math_lib_ispc_fast)
static inline double asin(const double x) {
if (__math_lib == __math_lib_svml)
{
return __svml_asind(x);
}
else if (__math_lib == __math_lib_ispc_fast)
return asin((float)x);
else {
double ret;
foreach_active (i) {
uniform double r = __stdlib_asin(extract(x, i));
ret = insert(ret, i, r);
}
return ret;
}
}
__declspec(safe)
static inline double cos(const double x) {
if (__math_lib == __math_lib_svml)
{
return __svml_cosd(x);
}
else if (__math_lib == __math_lib_ispc_fast)
return cos((float)x);
else {
double ret;
@@ -3514,7 +3552,11 @@ static inline uniform double cos(uniform double x) {
__declspec(safe)
static inline void sincos(double x, varying double * uniform sin_result,
varying double * uniform cos_result) {
if (__math_lib == __math_lib_ispc_fast) {
if (__math_lib == __math_lib_svml)
{
__svml_sincosd(x, sin_result, cos_result);
}
else if (__math_lib == __math_lib_ispc_fast) {
float sr, cr;
sincos((float)x, &sr, &cr);
*sin_result = sr;
@@ -3545,7 +3587,11 @@ static inline void sincos(uniform double x, uniform double * uniform sin_result,
__declspec(safe)
static inline double tan(double x) {
if (__math_lib == __math_lib_ispc_fast)
if (__math_lib == __math_lib_svml)
{
return __svml_tand(x);
}
else if (__math_lib == __math_lib_ispc_fast)
return tan((float)x);
else {
double ret;
@@ -3589,7 +3635,11 @@ static inline uniform double atan(uniform double x) {
__declspec(safe)
static inline double atan2(double y, double x) {
if (__math_lib == __math_lib_ispc_fast)
if (__math_lib == __math_lib_svml)
{
return __svml_atan2d(y,x);
}
else if (__math_lib == __math_lib_ispc_fast)
return atan2((float)y, (float)x);
else {
double ret;
@@ -3611,7 +3661,11 @@ static inline uniform double atan2(uniform double y, uniform double x) {
__declspec(safe)
static inline double exp(double x) {
if (__math_lib == __math_lib_ispc_fast)
if (__math_lib == __math_lib_svml)
{
return __svml_expd(x);
}
else if (__math_lib == __math_lib_ispc_fast)
return exp((float)x);
else {
double ret;
@@ -3633,7 +3687,11 @@ static inline uniform double exp(uniform double x) {
__declspec(safe)
static inline double log(double x) {
if (__math_lib == __math_lib_ispc_fast)
if (__math_lib == __math_lib_svml)
{
return __svml_logd(x);
}
else if (__math_lib == __math_lib_ispc_fast)
return log((float)x);
else {
double ret;
@@ -3655,7 +3713,11 @@ static inline uniform double log(uniform double x) {
__declspec(safe)
static inline double pow(double a, double b) {
if (__math_lib == __math_lib_ispc_fast)
if (__math_lib == __math_lib_svml)
{
return __svml_powd(a,b);
}
else if (__math_lib == __math_lib_ispc_fast)
return pow((float)a, (float)b);
else {
double ret;