| /* { dg-do compile } */ |
| /* { dg-options "-O2" } */ |
| |
| __extension__ typedef __SIZE_TYPE__ size_t; |
| |
| int |
| php_filter_parse_int (char const *str, unsigned int str_len, long *ret) |
| { |
| long ctx_value; |
| int sign; |
| int digit; |
| char const *end; |
| int tmp; |
| char const *tmp___0; |
| char const *tmp___1; |
| |
| sign = 0; |
| digit = 0; |
| end = str + str_len; |
| switch ((int) *str) |
| { |
| case 45: |
| sign = 1; |
| case 43: |
| str++; |
| default:; |
| break; |
| } |
| if ((size_t) str < (size_t) end) |
| { |
| if ((int const) *str >= 49) |
| { |
| if ((int const) *str <= 57) |
| { |
| if (sign) |
| { |
| tmp = -1; |
| } |
| else |
| { |
| tmp = 1; |
| } |
| tmp___0 = str; |
| str++; |
| ctx_value = (long) (tmp * (int) ((int const) *tmp___0 - 48)); |
| } |
| else |
| { |
| return (-1); |
| } |
| } |
| else |
| { |
| return (-1); |
| } |
| } |
| else |
| { |
| return (-1); |
| } |
| if (end - str > 19) |
| { |
| return (-1); |
| } |
| while ((size_t) str < (size_t) end) |
| { |
| if ((int const) *str >= 48) |
| { |
| if ((int const) *str <= 57) |
| { |
| tmp___1 = str; |
| str++; |
| digit = (int) ((int const) *tmp___1 - 48); |
| if (!sign) |
| { |
| if (ctx_value <= |
| (9223372036854775807L - (long) digit) / 10L) |
| { |
| ctx_value = ctx_value * 10L + (long) digit; |
| } |
| else |
| { |
| goto _L; |
| } |
| } |
| else |
| { |
| _L: |
| if (sign) |
| { |
| if (ctx_value >= |
| ((-0x7FFFFFFFFFFFFFFF - 1) + (long) digit) / 10L) |
| { |
| ctx_value = ctx_value * 10L - (long) digit; |
| } |
| else |
| { |
| return (-1); |
| } |
| } |
| else |
| { |
| return (-1); |
| } |
| } |
| } |
| else |
| { |
| return (-1); |
| } |
| } |
| else |
| { |
| return (-1); |
| } |
| } |
| *ret = ctx_value; |
| return (1); |
| } |
| |
| /* { dg-final { scan-assembler-not "idiv" } } */ |