Correct and improve fread_unlocked and fwrite_unlocked optimizations.

This commit is contained in:
Ulrich Drepper 1998-11-13 13:21:56 +00:00
parent 2dc9c8cd69
commit 7f2a1e3cf8

View 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