diff options
author | Thomas Koenig <tkoenig@gcc.gnu.org> | 2009-08-30 09:02:01 +0000 |
---|---|---|
committer | Thomas Koenig <tkoenig@gcc.gnu.org> | 2009-08-30 09:02:01 +0000 |
commit | 01d93568e892e196fbc28454f9f9e3553cbfcd7e (patch) | |
tree | 6f3af1ff5e03befb8f48fd165af7da8a30aacf8e /libgfortran/m4 | |
parent | 26ef2b4293ed8aa1d1cea04015d6d06dce5fd9d5 (diff) | |
download | gcc-01d93568e892e196fbc28454f9f9e3553cbfcd7e.tar.gz |
pack.m4 (pack_'rtype_code`): Use count_0 for counting true values in a logical array.
2009-08-30 Thomas Koenig <tkoenig@gcc.gnu.org>
* m4/pack.m4 (pack_'rtype_code`): Use count_0 for counting true
values in a logical array. Mark bounds checking tests as
unlikely.
* intrinsics/pack_generic.c (pack_internal): Likewise.
* runtime/bounds.c (count_0): Fix off-by-one error in detecting
empty arrays.
* generated/pack_c4.c: Regenerated.
* generated/pack_c8.c: Regenerated.
* generated/pack_c10.c: Regenerated.
* generated/pack_c16.c: Regenerated.
* generated/pack_i1.c: Regenerated.
* generated/pack_i16.c: Regenerated.
* generated/pack_i2.c: Regenerated.
* generated/pack_i4.c: Regenerated.
* generated/pack_i8.c: Regenerated.
* generated/pack_r4.c: Regenerated.
* generated/pack_r8.c: Regenerated.
* generated/pack_r10.c: Regenerated.
* generated/pack_r16.c: Regenerated.
From-SVN: r151225
Diffstat (limited to 'libgfortran/m4')
-rw-r--r-- | libgfortran/m4/pack.m4 | 62 |
1 files changed, 5 insertions, 57 deletions
diff --git a/libgfortran/m4/pack.m4 b/libgfortran/m4/pack.m4 index 910ffdcaac1..c5fd2fd817d 100644 --- a/libgfortran/m4/pack.m4 +++ b/libgfortran/m4/pack.m4 @@ -139,7 +139,7 @@ pack_'rtype_code` ('rtype` *ret, const 'rtype` *array, else sptr = array->data; - if (ret->data == NULL || compile_options.bounds_check) + if (ret->data == NULL || unlikely (compile_options.bounds_check)) { /* Count the elements, either for allocating memory or for bounds checking. */ @@ -156,62 +156,10 @@ pack_'rtype_code` ('rtype` *ret, const 'rtype` *array, } } else - { - /* We have to count the true elements in MASK. */ - - /* TODO: We could speed up pack easily in the case of only - few .TRUE. entries in MASK, by keeping track of where we - would be in the source array during the initial traversal - of MASK, and caching the pointers to those elements. Then, - supposed the number of elements is small enough, we would - only have to traverse the list, and copy those elements - into the result array. In the case of datatypes which fit - in one of the integer types we could also cache the - value instead of a pointer to it. - This approach might be bad from the point of view of - cache behavior in the case where our cache is not big - enough to hold all elements that have to be copied. */ - - const GFC_LOGICAL_1 *m = mptr; - - total = 0; - if (zero_sized) - m = NULL; - - while (m) - { - /* Test this element. */ - if (*m) - total++; - - /* Advance to the next element. */ - m += mstride[0]; - count[0]++; - n = 0; - while (count[n] == extent[n]) - { - /* When we get to the end of a dimension, reset it - and increment the next dimension. */ - count[n] = 0; - /* We could precalculate this product, but this is a - less frequently used path so probably not worth - it. */ - m -= mstride[n] * extent[n]; - n++; - if (n >= dim) - { - /* Break out of the loop. */ - m = NULL; - break; - } - else - { - count[n]++; - m += mstride[n]; - } - } - } - } + { + /* We have to count the true elements in MASK. */ + total = count_0 (mask); + } if (ret->data == NULL) { |