From 233caaf353ea27a54f6ec5d4d0bc5980d41df740 Mon Sep 17 00:00:00 2001 From: Heinz-Bernd Eggenstein <heinz-bernd.eggenstein@aei.mpg.de> Date: Wed, 25 Jul 2012 15:42:58 +0200 Subject: [PATCH] Bug #1608: clFFT use of native_sin , native_cos can cause validation problems -fixed compilation warning -fixed problem of using "%a" printf-format which is only supported in C99 and later, which cannot be assumed for mingw cross compiles for Windows. Now uses this format only conditionally if supported, otherwise falls back to %f for generated float literals --- src/fft_kernelstring.cpp | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/src/fft_kernelstring.cpp b/src/fft_kernelstring.cpp index 8519332..f14b0aa 100644 --- a/src/fft_kernelstring.cpp +++ b/src/fft_kernelstring.cpp @@ -984,6 +984,12 @@ getGlobalRadixInfo(int n, int *radix, int *R1, int *R2, int *numRadices) static void insertSinCosCalcDirectNative(string & kernel_string, cl_fft_plan *plan, int num, int denom , string & expr, string & varRes) { +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + const char format[] = "%a"; +#else + const char format[] = "%f"; +#endif + if(denom & (denom-1)) { kernel_string += string("ang = dir*(2.0f*M_PI*") + num2str(num) + string("/") + num2str(denom) + string(")*("+expr+");\n"); } else { @@ -1006,7 +1012,7 @@ insertSinCosCalcDirectNative(string & kernel_string, cl_fft_plan *plan, int num, default: float pi2=0x1.921fb54442d18p+2; char tw[200]; - sprintf(tw,"%a",pi2*num / (float) denom); + sprintf(tw,format,pi2*num / (float) denom); kernel_string += string("ang = dir*(" + string(tw) + string(") * (")+expr+");\n"); break; } @@ -1017,6 +1023,12 @@ insertSinCosCalcDirectNative(string & kernel_string, cl_fft_plan *plan, int num, static void insertSinCosCalcDirect(string & kernel_string, cl_fft_plan *plan, int num, int denom , string & expr, string & varRes) { +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + const char format[] = "%a"; +#else + const char format[] = "%f"; +#endif + if(denom & (denom-1)) { kernel_string += string("ang = dir*(2.0f*M_PI*") + num2str(num) + string("/") + num2str(denom) + string(")*("+expr+");\n"); } else { @@ -1039,7 +1051,7 @@ insertSinCosCalcDirect(string & kernel_string, cl_fft_plan *plan, int num, int d default: float pi2=0x1.921fb54442d18p+2; char tw[200]; - sprintf(tw,"%a",pi2*num / (float) denom); + sprintf(tw,format,pi2*num / (float) denom); kernel_string += string("ang = dir*(" + string(tw) + string(") * (")+expr+");\n"); break; } @@ -1094,6 +1106,14 @@ insertSinCosCalc(string & kernel_string, cl_fft_plan *plan, int num, int denom , static void insertSinCosCalcTaylor3(string & kernel_string, cl_fft_plan *plan, int num, int denom , string & expr, string & varRes) { + +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + const char format[] = "%a"; +#else + const char format[] = "%f"; +#endif + + if(denom & (denom-1)) { kernel_string += string("ang = dir*(2.0f*M_PI*") + num2str(num) + string("/") + num2str(denom) + string(")*("+expr+");\n"); kernel_string += varRes+string(" = (float2)(native_cos(ang), native_sin(ang));\n"); @@ -1112,7 +1132,7 @@ insertSinCosCalcTaylor3(string & kernel_string, cl_fft_plan *plan, int num, int num >>=1; } // if normalized denom < grid size, pick directly from LUT. - if(denom <= plan->N2) { + if((size_t) denom <= plan->N2) { kernel_string += string("{ int ang_index = (") + num2str(num) + string(" * ( ") + expr + string(")) & ") + num2str(denom -1) + string("; \n"); kernel_string += string(" int k = ang_index * ") + num2str(plan->N2 / denom ) + string(";\n"); kernel_string += string(" float2 cs =cossin_T_LUT[k];\n"); @@ -1148,7 +1168,7 @@ insertSinCosCalcTaylor3(string & kernel_string, cl_fft_plan *plan, int num, int // precompute h0=2*pi/denom; float pi2=0x1.921fb54442d18p+2; char tw[200]; - sprintf(tw,"%A",-pi2/(float) denom); + sprintf(tw,format,-pi2/(float) denom); kernel_string += string(" float mh=") +string(tw)+string("*(float)r;\n"); // compute taylor series terms to order 3 and add them up, in "reverse" order (highest order first) -- GitLab