diff --git a/iconvdata/sjis.c b/iconvdata/sjis.c index 07f03f78d7..172246843c 100644 --- a/iconvdata/sjis.c +++ b/iconvdata/sjis.c @@ -4337,12 +4337,12 @@ static const char from_ucs4_extra[0x100][2] = { \ uint32_t ch = *inptr; \ \ - if (ch == 0x5c) \ + if (__builtin_expect (ch, 0) == 0x5c) \ { \ ch = 0xa5; \ ++inptr; \ } \ - else if (ch == 0x7e) \ + else if (__builtin_expect (ch, 0) == 0x7e) \ { \ ch = 0x203e; \ ++inptr; \ @@ -4354,7 +4354,9 @@ static const char from_ucs4_extra[0x100][2] = ch = halfkana_to_ucs4[ch - 0xa1]; \ ++inptr; \ } \ - else if (ch > 0xea || ch == 0xa0 || ch <= 0x80) \ + else if (__builtin_expect (ch, 0) > 0xea \ + || __builtin_expect (ch, 0) == 0xa0 \ + || __builtin_expect (ch, 0x81) <= 0x80) \ { \ /* These are illegal. */ \ if (! ignore_errors_p ()) \ @@ -4375,7 +4377,7 @@ static const char from_ucs4_extra[0x100][2] = uint32_t ch2; \ uint_fast32_t idx; \ \ - if (NEED_LENGTH_TEST && inptr + 1 >= inend) \ + if (NEED_LENGTH_TEST && __builtin_expect (inptr + 1 >= inend, 0)) \ { \ /* The second character is not available. Store \ the intermediate result. */ \ @@ -4385,9 +4387,11 @@ static const char from_ucs4_extra[0x100][2] = \ ch2 = inptr[1]; \ idx = ch * 256 + ch2; \ - if (idx < 0x8140 || (idx > 0x84be && idx < 0x889f) \ - || (idx > 0x88fc && idx < 0x8940) \ - || (idx > 0x9ffc && idx < 0xe040) || idx > 0xeaa4) \ + if (__builtin_expect (idx, 0x8140) < 0x8140 \ + || (__builtin_expect (idx, 0x8140) > 0x84be && idx < 0x889f) \ + || (__builtin_expect (idx, 0x8140) > 0x88fc && idx < 0x8940) \ + || (__builtin_expect (idx, 0x8140) > 0x9ffc && idx < 0xe040) \ + || __builtin_expect (idx, 0x8140) > 0xeaa4) \ { \ /* This is illegal. */ \ if (! ignore_errors_p ()) \ @@ -4418,7 +4422,7 @@ static const char from_ucs4_extra[0x100][2] = inptr += 2; \ } \ \ - if (ch == 0) \ + if (__builtin_expect (ch, 1) == 0) \ { \ /* This is an illegal character. */ \ if (! ignore_errors_p ()) \ @@ -4456,7 +4460,8 @@ static const char from_ucs4_extra[0x100][2] = cp = from_ucs4_greek[ch - 0x391]; \ else if (ch >= 0x2010 && ch <= 0x9fa0) \ cp = from_ucs4_cjk[ch - 0x02010]; \ - else if (ch >= 0xff01 && ch <= 0xffef) \ + else if (__builtin_expect (ch, 0xff01) >= 0xff01 \ + && __builtin_expect (ch, 0xff01) <= 0xffef) \ cp = from_ucs4_extra[ch - 0xff00]; \ else \ { \ @@ -4476,7 +4481,7 @@ static const char from_ucs4_extra[0x100][2] = else \ cp = from_ucs4_lat1[ch]; \ \ - if (cp[0] == '\0' && ch != 0) \ + if (__builtin_expect (cp[0], '\1') == '\0' && ch != 0) \ { \ /* Illegal character. */ \ if (! ignore_errors_p ()) \ @@ -4494,7 +4499,7 @@ static const char from_ucs4_extra[0x100][2] = /* Now test for a possible second byte and write this if possible. */\ if (cp[1] != '\0') \ { \ - if (NEED_LENGTH_TEST && outptr >= outend) \ + if (NEED_LENGTH_TEST && __builtin_expect (outptr >= outend, 0)) \ { \ /* The result does not fit into the buffer. */ \ result = __GCONV_FULL_OUTPUT; \ diff --git a/iconvdata/t.61.c b/iconvdata/t.61.c index 1623606496..766dd0fe97 100644 --- a/iconvdata/t.61.c +++ b/iconvdata/t.61.c @@ -382,14 +382,15 @@ static const char from_ucs4[][2] = #define BODY \ { \ uint32_t ch = *inptr; \ + int increment = 1; \ \ - if (ch >= 0xc1 && ch <= 0xcf) \ + if (__builtin_expect (ch, 0x20) >= 0xc1 && ch <= 0xcf) \ { \ /* Composed character. First test whether the next character \ is also available. */ \ uint32_t ch2; \ \ - if (NEED_LENGTH_TEST && inptr + 1 >= inend) \ + if (NEED_LENGTH_TEST && __builtin_expect (inptr + 1 >= inend, 0)) \ { \ /* The second character is not available. */ \ result = __GCONV_INCOMPLETE_INPUT; \ @@ -398,7 +399,8 @@ static const char from_ucs4[][2] = \ ch2 = inptr[1]; \ \ - if (ch2 < 0x20 || ch2 >= 0x80) \ + if (__builtin_expect (ch2, 0x20) < 0x20 \ + || __builtin_expect (ch2, 0x20) >= 0x80) \ { \ /* This is illegal. */ \ if (! ignore_errors_p ()) \ @@ -415,21 +417,17 @@ static const char from_ucs4[][2] = \ ch = to_ucs4_comb[ch - 0xc1][ch2 - 0x20]; \ \ - inptr += 2; \ + increment = 2; \ } \ else \ - { \ - ch = to_ucs4[ch]; \ - ++inptr; \ - } \ + ch = to_ucs4[ch]; \ \ - if (ch == 0 && *inptr != '\0') \ + if (__builtin_expect (ch, 1) == 0 && *inptr != '\0') \ { \ /* This is an illegal character. */ \ if (! ignore_errors_p ()) \ { \ /* This is an illegal character. */ \ - --inptr; \ result = __GCONV_ILLEGAL_INPUT; \ break; \ } \ @@ -441,6 +439,7 @@ static const char from_ucs4[][2] = put32 (outptr, ch); \ outptr += 4; \ } \ + inptr += increment; \ } #include @@ -456,13 +455,16 @@ static const char from_ucs4[][2] = uint32_t ch = get32 (inptr); \ const char *cp; \ \ - if (ch >= sizeof (from_ucs4) / sizeof (from_ucs4[0])) \ + if (__builtin_expect (ch, 0) \ + >= sizeof (from_ucs4) / sizeof (from_ucs4[0])) \ { \ - if (ch == 0x2126) \ + if (__builtin_expect (ch, 0) == 0x2126) \ cp = "\xe0"; \ - else if (ch == 0x2c7) \ + else if (__builtin_expect (ch, 0) == 0x2c7) \ cp = "\xcf\x20"; \ - else if (ch < 0x2d8 || ch > 0x2dd || ch == 0x02dc) \ + else if (__builtin_expect (ch, 0x2d8) < 0x2d8 \ + || __builtin_expect (ch, 0x2d8) > 0x2dd \ + || __builtin_expect (ch, 0x2d8) == 0x02dc) \ { \ /* Illegal characters. */ \ if (! ignore_errors_p ()) \ @@ -489,7 +491,7 @@ static const char from_ucs4[][2] = { \ cp = from_ucs4[ch]; \ \ - if (cp[0] == '\0' && ch != 0) \ + if (__builtin_expect (cp[0], '\1') == '\0' && ch != 0) \ { \ /* Illegal. */ \ if (! ignore_errors_p ()) \ @@ -509,7 +511,7 @@ static const char from_ucs4[][2] = /* Now test for a possible second byte and write this if possible. */ \ if (cp[1] != '\0') \ { \ - if (NEED_LENGTH_TEST && outptr >= outend) \ + if (NEED_LENGTH_TEST && __builtin_expect (outptr >= outend, 0)) \ { \ /* The result does not fit into the buffer. */ \ --outptr; \ diff --git a/iconvdata/uhc.c b/iconvdata/uhc.c index 15faf1ea89..767c21f513 100644 --- a/iconvdata/uhc.c +++ b/iconvdata/uhc.c @@ -3063,7 +3063,9 @@ static const char uhc_hangul_from_ucs[11172][2] = */ \ if (ch <= 0x7f) \ ++inptr; \ - else if (ch <= 0x80 || ch >= 0xfe || ch == 0xc9) \ + else if (__builtin_expect (ch, 0x81) <= 0x80 \ + || __builtin_expect (ch, 0x81) >= 0xfe \ + || __builtin_expect (ch, 0x81) == 0xc9) \ { \ /* This is illegal. */ \ if (! ignore_errors_p ()) \ @@ -3083,7 +3085,7 @@ static const char uhc_hangul_from_ucs[11172][2] = is also available. */ \ uint32_t ch2; \ \ - if (NEED_LENGTH_TEST && inptr + 1 >= inend) \ + if (NEED_LENGTH_TEST && __builtin_expect (inptr + 1 >= inend, 0)) \ { \ /* The second character is not available. Store \ the intermediate result. */ \ @@ -3113,8 +3115,11 @@ static const char uhc_hangul_from_ucs[11172][2] = \ if (ch < 0xa1 || ch2 < 0xa1) \ { \ - if (ch > 0xc6 || ch2 <0x41 || (ch2 > 0x5a && ch2 < 0x61) \ - || (ch2 > 0x7a && ch2 < 0x81) || (ch == 0xc6 && ch2 > 0x52)) \ + if (__builtin_expect (ch, 0xc5) > 0xc6 \ + || __builtin_expect (ch2, 0x41) < 0x41 \ + || (__builtin_expect (ch2, 0x41) > 0x5a && ch2 < 0x61) \ + || (__builtin_expect (ch2, 0x41) > 0x7a && ch2 < 0x81) \ + || (__builtin_expect (ch, 0xc5) == 0xc6 && ch2 > 0x52)) \ { \ /* This is not legal. */ \ if (! ignore_errors_p ()) \ @@ -3135,7 +3140,7 @@ static const char uhc_hangul_from_ucs[11172][2] = ? (ch - 0x81) * 178 \ : 5696 + (ch - 0xa1) * 84)]; \ \ - if (ch == 0) \ + if (__builtin_expect (ch, 1) == 0) \ { \ /* This is an illegal character. */ \ if (! ignore_errors_p ()) \ @@ -3155,7 +3160,7 @@ static const char uhc_hangul_from_ucs[11172][2] = else \ { \ ch = ksc5601_to_ucs4 (&inptr, 2, 0x80); \ - if (ch == __UNKNOWN_10646_CHAR) \ + if (__builtin_expect (ch, 0) == __UNKNOWN_10646_CHAR) \ { \ /* Illegal. */ \ if (! ignore_errors_p ()) \ @@ -3194,7 +3199,7 @@ static const char uhc_hangul_from_ucs[11172][2] = { \ const char *s = uhc_hangul_from_ucs[ch - 0xac00]; \ \ - if (NEED_LENGTH_TEST && outptr + 2 > outend) \ + if (NEED_LENGTH_TEST && __builtin_expect (outptr + 2 > outend, 0)) \ { \ result = __GCONV_FULL_OUTPUT; \ break; \ @@ -3209,12 +3214,12 @@ static const char uhc_hangul_from_ucs[11172][2] = (NEED_LENGTH_TEST \ ? outend - outptr : 2)); \ \ - if (NEED_LENGTH_TEST && written == 0) \ + if (NEED_LENGTH_TEST && __builtin_expect (written, 1) == 0) \ { \ result = __GCONV_FULL_OUTPUT; \ break; \ } \ - if (written == __UNKNOWN_10646_CHAR) \ + if (__builtin_expect (written, 0) == __UNKNOWN_10646_CHAR) \ { \ if (! ignore_errors_p ()) \ { \ @@ -3241,12 +3246,12 @@ static const char uhc_hangul_from_ucs[11172][2] = (NEED_LENGTH_TEST \ ? outend - outptr : 2)); \ \ - if (NEED_LENGTH_TEST && written == 0) \ + if (NEED_LENGTH_TEST && __builtin_expect (written, 1) == 0) \ { \ result = __GCONV_FULL_OUTPUT; \ break; \ } \ - if (written == __UNKNOWN_10646_CHAR) \ + if (__builtin_expect (written, 0) == __UNKNOWN_10646_CHAR) \ { \ if (! ignore_errors_p ()) \ { \ diff --git a/iconvdata/unicode.c b/iconvdata/unicode.c index 7f2aca51b4..34c563bd79 100644 --- a/iconvdata/unicode.c +++ b/iconvdata/unicode.c @@ -63,7 +63,7 @@ else if (!data->__internal_use && data->__invocation_counter == 0) \ { \ /* Emit the Byte Order Mark. */ \ - if (outbuf + 2 > outend) \ + if (__builtin_expect (outbuf + 2 > outend, 0)) \ return __GCONV_FULL_OUTPUT; \ \ put16u (outbuf, BOM); \ @@ -149,7 +149,7 @@ gconv_end (struct __gconv_step *data) { \ uint32_t c = get32 (inptr); \ \ - if (c >= 0x10000) \ + if (__builtin_expect (c, 0) >= 0x10000) \ { \ if (! ignore_errors_p ()) \ { \ diff --git a/iconvdata/utf-16.c b/iconvdata/utf-16.c index 9ca2e0bc42..0be1108113 100644 --- a/iconvdata/utf-16.c +++ b/iconvdata/utf-16.c @@ -66,7 +66,7 @@ && data->__invocation_counter == 0) \ { \ /* Emit the Byte Order Mark. */ \ - if (outbuf + 2 > outend) \ + if (__builtin_expect (outbuf + 2 > outend, 0)) \ return __GCONV_FULL_OUTPUT; \ \ put16u (outbuf, BOM); \ @@ -140,7 +140,7 @@ gconv_init (struct __gconv_step *step) } result = __GCONV_NOCONV; - if (dir != illegal_dir) + if (__builtin_expect (dir, to_utf16) != illegal_dir) { new_data = (struct utf16_data *) malloc (sizeof (struct utf16_data)); @@ -197,9 +197,9 @@ gconv_end (struct __gconv_step *data) \ if (swap) \ { \ - if (c >= 0x10000) \ + if (__builtin_expect (c, 0) >= 0x10000) \ { \ - if (c >= 0x110000) \ + if (__builtin_expect (c, 0) >= 0x110000) \ { \ if (! ignore_errors_p ()) \ { \ @@ -214,7 +214,7 @@ gconv_end (struct __gconv_step *data) } \ \ /* Generate a surrogate character. */ \ - if (NEED_LENGTH_TEST && outptr + 4 > outend) \ + if (NEED_LENGTH_TEST && __builtin_expect (outptr + 4 > outend, 0))\ { \ /* Overflow in the output buffer. */ \ result = __GCONV_FULL_OUTPUT; \ @@ -230,9 +230,9 @@ gconv_end (struct __gconv_step *data) } \ else \ { \ - if (c >= 0x10000) \ + if (__builtin_expect (c, 0) >= 0x10000) \ { \ - if (c >= 0x110000) \ + if (__builtin_expect (c, 0) >= 0x110000) \ { \ if (! ignore_errors_p ()) \ { \ @@ -247,7 +247,7 @@ gconv_end (struct __gconv_step *data) } \ \ /* Generate a surrogate character. */ \ - if (NEED_LENGTH_TEST && outptr + 4 > outend) \ + if (NEED_LENGTH_TEST && __builtin_expect (outptr + 4 > outend, 0))\ { \ /* Overflow in the output buffer. */ \ result = __GCONV_FULL_OUTPUT; \ @@ -282,10 +282,10 @@ gconv_end (struct __gconv_step *data) { \ u1 = bswap_16 (u1); \ \ - if (u1 < 0xd800 || u1 > 0xdfff) \ + if (__builtin_expect (u1, 0) < 0xd800 || u1 > 0xdfff) \ { \ /* No surrogate. */ \ - put32 (outptr, u1); \ + put32 (outptr, u1); \ inptr += 2; \ } \ else \ @@ -294,7 +294,7 @@ gconv_end (struct __gconv_step *data) \ /* It's a surrogate character. At least the first word says \ it is. */ \ - if (NEED_LENGTH_TEST && inptr + 4 > inend) \ + if (NEED_LENGTH_TEST && __builtin_expect (inptr + 4 > inend, 0)) \ { \ /* We don't have enough input for another complete input \ character. */ \ @@ -304,7 +304,8 @@ gconv_end (struct __gconv_step *data) \ inptr += 2; \ u2 = bswap_16 (get16 (inptr)); \ - if (u2 < 0xdc00 || u2 >= 0xdfff) \ + if (__builtin_expect (u2, 0xdc00) < 0xdc00 \ + || __builtin_expect (u2, 0xdc00) >= 0xdfff) \ { \ /* This is no valid second word for a surrogate. */ \ if (! ignore_errors_p ()) \ @@ -324,7 +325,7 @@ gconv_end (struct __gconv_step *data) } \ else \ { \ - if (u1 < 0xd800 || u1 > 0xdfff) \ + if (__builtin_expect (u1, 0) < 0xd800 || u1 > 0xdfff) \ { \ /* No surrogate. */ \ put32 (outptr, u1); \ @@ -336,7 +337,7 @@ gconv_end (struct __gconv_step *data) \ /* It's a surrogate character. At least the first word says \ it is. */ \ - if (NEED_LENGTH_TEST && inptr + 4 > inend) \ + if (NEED_LENGTH_TEST && __builtin_expect (inptr + 4 > inend, 0)) \ { \ /* We don't have enough input for another complete input \ character. */ \ @@ -346,7 +347,8 @@ gconv_end (struct __gconv_step *data) \ inptr += 2; \ u2 = get16 (inptr); \ - if (u2 < 0xdc00 || u2 >= 0xdfff) \ + if (__builtin_expect (u2, 0xdc00) < 0xdc00 \ + || __builtin_expect (u2, 0xdc00) >= 0xdfff) \ { \ /* This is no valid second word for a surrogate. */ \ if (! ignore_errors_p ()) \