diff --git a/science/cdo/files/patch-libcdi_src_cgribexlib.c b/science/cdo/files/patch-libcdi_src_cgribexlib.c index 11aaf5c127f6..904c7971669d 100644 --- a/science/cdo/files/patch-libcdi_src_cgribexlib.c +++ b/science/cdo/files/patch-libcdi_src_cgribexlib.c @@ -1,31 +1,50 @@ --- libcdi/src/cgribexlib.c.orig 2022-01-28 10:46:29 UTC +++ libcdi/src/cgribexlib.c @@ -12,7 +12,7 @@ #pragma GCC diagnostic warning "-Wstrict-overflow" #endif -#ifdef _ARCH_PWR6 +#if defined(_ARCH_PWR6) && defined(__GLIBC__) #pragma options nostrict #include #endif -@@ -734,6 +734,19 @@ void sse2_minmax_val_double(const double *restrict buf - #endif // SIMD +@@ -745,8 +745,8 @@ void pwr6_minmax_val_double_unrolled6(const double *re + size_t i, j; + size_t residual = datasize % __UNROLL_DEPTH_1; + size_t ofs = datasize - residual; +- double register dmin[__UNROLL_DEPTH_1]; +- double register dmax[__UNROLL_DEPTH_1]; ++ double dmin[__UNROLL_DEPTH_1]; ++ double dmax[__UNROLL_DEPTH_1]; - #if defined(_ARCH_PWR6) -+ -+#ifndef __fsel -+static __inline__ double __fsel(double x, double y, double z) -+ __attribute__((always_inline)); -+static __inline__ double -+__fsel(double x, double y, double z) -+{ -+ double r; -+ __asm__("fsel %0,%1,%2,%3" : "=d"(r) : "d"(x),"d"(y),"d"(z)); -+ return r; -+} -+#endif -+ - static - void pwr6_minmax_val_double_unrolled6(const double *restrict data, size_t datasize, double *fmin, double *fmax) - { + for ( j = 0; j < __UNROLL_DEPTH_1; j++) + { +@@ -758,21 +758,21 @@ void pwr6_minmax_val_double_unrolled6(const double *re + { + for (j = 0; j < __UNROLL_DEPTH_1; j++) + { +- dmin[j] = __fsel(dmin[j] - data[i+j], data[i+j], dmin[j]); +- dmax[j] = __fsel(data[i+j] - dmax[j], data[i+j], dmax[j]); ++ dmin[j] = __builtin_ppc_fsel(dmin[j] - data[i+j], data[i+j], dmin[j]); ++ dmax[j] = __builtin_ppc_fsel(data[i+j] - dmax[j], data[i+j], dmax[j]); + } + } + + for (j = 0; j < residual; j++) + { +- dmin[j] = __fsel(dmin[j] - data[ofs+j], data[ofs+j], dmin[j]); +- dmax[j] = __fsel(data[ofs+j] - dmax[j], data[ofs+j], dmax[j]); ++ dmin[j] = __builtin_ppc_fsel(dmin[j] - data[ofs+j], data[ofs+j], dmin[j]); ++ dmax[j] = __builtin_ppc_fsel(data[ofs+j] - dmax[j], data[ofs+j], dmax[j]); + } + + for ( j = 0; j < __UNROLL_DEPTH_1; j++) + { +- *fmin = __fsel(*fmin - dmin[j], dmin[j], *fmin); +- *fmax = __fsel(dmax[j] - *fmax, dmax[j], *fmax); ++ *fmin = __builtin_ppc_fsel(*fmin - dmin[j], dmin[j], *fmin); ++ *fmax = __builtin_ppc_fsel(dmax[j] - *fmax, dmax[j], *fmax); + } + } + #undef __UNROLL_DEPTH_1