OSDN Git Service

2010-12-30 Kai Tietz <kai.tietz@onevision.com>
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / gcc.target / i386 / pr46939.c
1 /* { dg-do compile } */
2 /* { dg-options "-O2" } */
3 int
4 php_filter_parse_int (char const *str, unsigned int str_len, long *ret)
5 {
6   long ctx_value;
7   int sign;
8   int digit;
9   char const *end;
10   int tmp;
11   char const *tmp___0;
12   char const *tmp___1;
13
14   sign = 0;
15   digit = 0;
16   end = str + str_len;
17   switch ((int) *str)
18     {
19     case 45:
20       sign = 1;
21     case 43:
22       str++;
23     default:;
24       break;
25     }
26   if ((unsigned long) str < (unsigned long) end)
27     {
28       if ((int const) *str >= 49)
29         {
30           if ((int const) *str <= 57)
31             {
32               if (sign)
33                 {
34                   tmp = -1;
35                 }
36               else
37                 {
38                   tmp = 1;
39                 }
40               tmp___0 = str;
41               str++;
42               ctx_value = (long) (tmp * (int) ((int const) *tmp___0 - 48));
43             }
44           else
45             {
46               return (-1);
47             }
48         }
49       else
50         {
51           return (-1);
52         }
53     }
54   else
55     {
56       return (-1);
57     }
58   if (end - str > 19)
59     {
60       return (-1);
61     }
62   while ((unsigned long) str < (unsigned long) end)
63     {
64       if ((int const) *str >= 48)
65         {
66           if ((int const) *str <= 57)
67             {
68               tmp___1 = str;
69               str++;
70               digit = (int) ((int const) *tmp___1 - 48);
71               if (!sign)
72                 {
73                   if (ctx_value <=
74                       (9223372036854775807L - (long) digit) / 10L)
75                     {
76                       ctx_value = ctx_value * 10L + (long) digit;
77                     }
78                   else
79                     {
80                       goto _L;
81                     }
82                 }
83               else
84                 {
85                 _L:
86                   if (sign)
87                     {
88                       if (ctx_value >=
89                           ((-0x7FFFFFFFFFFFFFFF - 1) + (long) digit) / 10L)
90                         {
91                           ctx_value = ctx_value * 10L - (long) digit;
92                         }
93                       else
94                         {
95                           return (-1);
96                         }
97                     }
98                   else
99                     {
100                       return (-1);
101                     }
102                 }
103             }
104           else
105             {
106               return (-1);
107             }
108         }
109       else
110         {
111           return (-1);
112         }
113     }
114   *ret = ctx_value;
115   return (1);
116 }
117
118 /* { dg-final { scan-assembler-not "idiv" } } */