about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog4
-rw-r--r--iconv/gconv_simple.c16
2 files changed, 11 insertions, 9 deletions
diff --git a/ChangeLog b/ChangeLog
index 75ec4e753c..7d43d5adb0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2007-10-11  Ulrich Drepper  <drepper@redhat.com>
+
+	* iconv/gconv_simple.c: Add some branch prediction.
+
 2007-10-12  Jakub Jelinek  <jakub@redhat.com>
 
 	* locale/programs/ld-collate.c (collate_read): If ignore_content
diff --git a/iconv/gconv_simple.c b/iconv/gconv_simple.c
index 343c27521f..ec8f38a962 100644
--- a/iconv/gconv_simple.c
+++ b/iconv/gconv_simple.c
@@ -1,5 +1,5 @@
 /* Simple transformations functions.
-   Copyright (C) 1997-2003, 2004, 2005 Free Software Foundation, Inc.
+   Copyright (C) 1997-2003, 2004, 2005, 2007 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
 
@@ -880,7 +880,7 @@ ucs4le_internal_loop_single (struct __gconv_step *step,
   {									      \
     uint32_t wc = *((const uint32_t *) inptr);				      \
 									      \
-    if (wc < 0x80)							      \
+    if (__builtin_expect (wc < 0x80, 1))				      \
       /* It's an one byte sequence.  */					      \
       *outptr++ = (unsigned char) wc;					      \
     else if (__builtin_expect (wc <= 0x7fffffff, 1))			      \
@@ -940,21 +940,19 @@ ucs4le_internal_loop_single (struct __gconv_step *step,
 #define LOOPFCT			FROM_LOOP
 #define BODY \
   {									      \
-    uint32_t ch;							      \
-    uint_fast32_t cnt;							      \
-    uint_fast32_t i;							      \
-									      \
     /* Next input byte.  */						      \
-    ch = *inptr;							      \
+    uint32_t ch = *inptr;						      \
 									      \
-    if (ch < 0x80)							      \
+    if (__builtin_expect (ch < 0x80, 1))				      \
       {									      \
 	/* One byte sequence.  */					      \
-	cnt = 1;							      \
 	++inptr;							      \
       }									      \
     else								      \
       {									      \
+	uint_fast32_t cnt;						      \
+	uint_fast32_t i;						      \
+									      \
 	if (ch >= 0xc2 && ch < 0xe0)					      \
 	  {								      \
 	    /* We expect two bytes.  The first byte cannot be 0xc0 or 0xc1,   \