Correct and improve fread_unlocked and fwrite_unlocked optimizations.
authorUlrich Drepper <drepper@redhat.com>
Fri, 13 Nov 1998 13:21:56 +0000 (13:21 +0000)
committerUlrich Drepper <drepper@redhat.com>
Fri, 13 Nov 1998 13:21:56 +0000 (13:21 +0000)
libio/bits/stdio.h

index f47749e..a3e3d6f 100644 (file)
@@ -127,32 +127,47 @@ ferror_unlocked (FILE *__stream) __THROW
 #if defined __USE_MISC && defined __GNUC__ && defined __OPTIMIZE__
 /* Perform some simple optimizations.  */
 # define fread_unlocked(ptr, size, n, stream) \
-  (__extension__ ((__builtin_constant_p (size) && __builtin_constant_p (n)    \
+  (__extension__ ((((__builtin_constant_p (size)                             \
+                    && ((size) == 0 || __builtin_constant_p (n)))            \
+                   || (__builtin_constant_p (n) && (n) == 0))                \
                   && (size_t) ((size) * (n)) <= 8)                           \
                  ? ({ char *__ptr = (char *) (ptr);                          \
                       FILE *__stream = (stream);                             \
-                      int __c;                                               \
-                      size_t __cnt = (size) * (n);                           \
-                      while (__cnt-- > 0)                                    \
+                      size_t __size = (size);                                \
+                      size_t __n = (n);                                      \
+                      size_t __readres = __n;                                \
+                      size_t __cnt = __size * __n + 1;                       \
+                      while (--__cnt > 0)                                    \
                         {                                                    \
-                          __c = _IO_getc_unlocked (__stream);                \
+                          int __c = _IO_getc_unlocked (__stream);            \
                           if (__c == EOF)                                    \
-                            break;                                           \
+                            {                                                \
+                              __readres = (__size * __n - __cnt) / __size;   \
+                              break;                                         \
+                            }                                                \
                           *__ptr++ = __c;                                    \
                         }                                                    \
-                      ((size_t) ((size) * (n)) - __cnt) / (size); })         \
+                      __readres; })                                          \
                  : fread_unlocked (ptr, size, n, stream)))
 
 # define fwrite_unlocked(ptr, size, n, stream) \
-  (__extension__ ((__builtin_constant_p (size) && __builtin_constant_p (n)    \
+  (__extension__ ((((__builtin_constant_p (size)                             \
+                    && ((size) == 0 || __builtin_constant_p (n)))            \
+                   || (__builtin_constant_p (n) && (n) == 0))                \
                   && (size_t) ((size) * (n)) <= 8)                           \
                  ? ({ const char *__ptr = (const char *) (ptr);              \
                       FILE *__stream = (stream);                             \
-                      size_t __cnt = (size) * (n);                           \
-                      while (__cnt-- > 0)                                    \
+                      size_t __size = (size);                                \
+                      size_t __n = (n);                                      \
+                      size_t __writeres = __n;                               \
+                      size_t __cnt = __size * __n + 1;                       \
+                      while (--__cnt > 0)                                    \
                         if (_IO_putc_unlocked (*__ptr++, __stream) == EOF)   \
-                          break;                                             \
-                      ((size_t) ((size) * (n)) - __cnt) / (size); })         \
+                          {                                                  \
+                            __writeres = (__size * __n - __cnt) / __size;    \
+                            break;                                           \
+                          }                                                  \
+                      __writeres; })                                         \
                  : fwrite_unlocked (ptr, size, n, stream)))
 #endif