diff options
Diffstat (limited to 'libgfortran/m4/minloc0.m4')
-rw-r--r-- | libgfortran/m4/minloc0.m4 | 99 |
1 files changed, 82 insertions, 17 deletions
diff --git a/libgfortran/m4/minloc0.m4 b/libgfortran/m4/minloc0.m4 index 45b6e90880a..1345f2df472 100644 --- a/libgfortran/m4/minloc0.m4 +++ b/libgfortran/m4/minloc0.m4 @@ -34,28 +34,93 @@ include(iforeach.m4)dnl `#if defined (HAVE_'atype_name`) && defined (HAVE_'rtype_name`)' FOREACH_FUNCTION( -` atype_name minval; +` atype_name minval; +#if defined('atype_nan`) + int fast = 0; +#endif - minval = atype_max;' -, -` if (*base < minval || !dest[0]) - { - minval = *base; - for (n = 0; n < rank; n++) - dest[n * dstride] = count[n] + 1; - }') +#if defined('atype_inf`) + minval = atype_inf; +#else + minval = atype_max; +#endif', +`#if defined('atype_nan`) + } + while (0); + if (unlikely (!fast)) + { + do + { + if (*base <= minval) + { + fast = 1; + minval = *base; + for (n = 0; n < rank; n++) + dest[n * dstride] = count[n] + 1; + break; + } + base += sstride[0]; + } + while (++count[0] != extent[0]); + if (likely (fast)) + continue; + } + else do + { +#endif + if (*base < minval) + { + minval = *base; + for (n = 0; n < rank; n++) + dest[n * dstride] = count[n] + 1; + }') MASKED_FOREACH_FUNCTION( ` atype_name minval; + int fast = 0; - minval = atype_max;' -, -` if (*mbase && (*base < minval || !dest[0])) - { - minval = *base; - for (n = 0; n < rank; n++) - dest[n * dstride] = count[n] + 1; - }') +#if defined('atype_inf`) + minval = atype_inf; +#else + minval = atype_max; +#endif', +` } + while (0); + if (unlikely (!fast)) + { + do + { + if (*mbase) + { +#if defined('atype_nan`) + if (unlikely (dest[0] == 0)) + for (n = 0; n < rank; n++) + dest[n * dstride] = count[n] + 1; + if (*base <= minval) +#endif + { + fast = 1; + minval = *base; + for (n = 0; n < rank; n++) + dest[n * dstride] = count[n] + 1; + break; + } + } + base += sstride[0]; + mbase += mstride[0]; + } + while (++count[0] != extent[0]); + if (likely (fast)) + continue; + } + else do + { + if (*mbase && *base < minval) + { + minval = *base; + for (n = 0; n < rank; n++) + dest[n * dstride] = count[n] + 1; + }') SCALAR_FOREACH_FUNCTION(`0') #endif |