optimize internal putc_unlocked macro used in putc
authorRich Felker <dalias@aerifal.cx>
Thu, 18 Oct 2018 17:37:05 +0000 (13:37 -0400)
committerRich Felker <dalias@aerifal.cx>
Thu, 18 Oct 2018 17:41:25 +0000 (13:41 -0400)
to check whether flush due to line buffering is needed, the int-type
character argument must be truncated to unsigned char for comparison.
if the original value is subsequently passed to __overflow, it must be
preserved, adding to register pressure. since it doesn't matter,
truncate all uses so the original value is no longer live.

src/internal/stdio_impl.h

index 44497344971821c326a511ccb5687d9463730b61..055ef718f94a0f0d8819c4f28fa503edbaabf503 100644 (file)
@@ -106,7 +106,8 @@ hidden void __getopt_msg(const char *, const char *, const char *, size_t);
 
 #define putc_unlocked(c, f) \
        ( (((unsigned char)(c)!=(f)->lbf && (f)->wpos!=(f)->wend)) \
-       ? *(f)->wpos++ = (c) : __overflow((f),(c)) )
+       ? *(f)->wpos++ = (unsigned char)(c) \
+       : __overflow((f),(unsigned char)(c)) )
 
 /* Caller-allocated FILE * operations */
 hidden FILE *__fopen_rb_ca(const char *, FILE *, unsigned char *, size_t);