Replace FSF snail mail address with URLs.
[glibc.git] / sysdeps / sparc / sparc64 / strpbrk.S
blob9267893bf1a95ba326b9407b42b02305476e42d7
1 /* strpbrk (s, accept) -- Find the first occurrence in S of any character in
2                           ACCEPT.
3    For SPARC v9.
4    Copyright (C) 1999, 2003 Free Software Foundation, Inc.
5    This file is part of the GNU C Library.
6    Contributed by Jakub Jelinek <jj@ultra.linux.cz>
8    The GNU C Library is free software; you can redistribute it and/or
9    modify it under the terms of the GNU Lesser General Public
10    License as published by the Free Software Foundation; either
11    version 2.1 of the License, or (at your option) any later version.
13    The GNU C Library is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16    Lesser General Public License for more details.
18    You should have received a copy of the GNU Lesser General Public
19    License along with the GNU C Library; if not, see
20    <http://www.gnu.org/licenses/>.  */
22 #include <sysdep.h>
23 #include <asm/asi.h>
24 #ifndef XCC
25 #define XCC xcc
26 #define STACK_SIZE      128
27 #define STACK_OFFSET    128+0x7ff
28         .register       %g2, #scratch
29 #else
30 #define STACK_SIZE      64
31 #define STACK_OFFSET    64
32 #endif
34         .text
35         .align          32
36 ENTRY(strpbrk)
37         sub             %sp, STACK_SIZE+32, %sp         /* IEU0         Group           */
38         mov             1, %o4                          /* IEU1                         */
39         stx             %o4, [%sp + STACK_OFFSET]       /* Store        Group           */
40         stx             %g0, [%sp + STACK_OFFSET + 8]   /* Store        Group           */
42         add             %sp, STACK_OFFSET, %o5          /* IEU0                         */
43         stx             %g0, [%sp + STACK_OFFSET + 16]  /* Store        Group           */
44         stx             %g0, [%sp + STACK_OFFSET + 24]  /* Store        Group           */
45 1:      ldub            [%o1], %o2                      /* Load         Group           */
47         brz,pn          %o2, 2f                         /* CTI+IEU1     Group           */
48          srl            %o2, 3, %o3                     /* IEU0                         */
49         and             %o3, 0x18, %o3                  /* IEU0         Group           */
50         and             %o2, 0x3f, %o2                  /* IEU1                         */
52         ldx             [%o5 + %o3], %g2                /* Load         Group           */
53         sllx            %o4, %o2, %g1                   /* IEU0                         */
54         add             %o1, 1, %o1                     /* IEU1                         */
55         or              %g2, %g1, %g2                   /* IEU0         Group           */
57         ba,pt           %xcc, 1b                        /* CTI                          */
58          stx            %g2, [%o5 + %o3]                /* Store                        */
59 2:      andcc           %o0, 7, %g0                     /* IEU1         Group           */
60         be,a,pt         %xcc, 4f                        /* CTI                          */
62          ldx            [%o0], %o2                      /* Load                         */
63         ldub            [%o0], %o2                      /* Load         Group           */
64 3:      srl             %o2, 3, %o3                     /* IEU0         Group           */
65         and             %o2, 0x3f, %o2                  /* IEU1                         */
67         and             %o3, 0x18, %o3                  /* IEU0         Group           */
68         ldx             [%o5 + %o3], %g2                /* Load         Group           */
69         sllx            %o4, %o2, %g1                   /* IEU0                         */
70         add             %o0, 1, %o0                     /* IEU1                         */
72         andcc           %g2, %g1, %g0                   /* IEU1         Group           */
73         bne,pn          %xcc, 12f                       /* CTI                          */
74          andcc          %o0, 7, %g0                     /* IEU1         Group           */
75         bne,a,pt        %icc, 3b                        /* CTI                          */
77          ldub           [%o0], %o2                      /* Load                         */
78         ldx             [%o0], %o2                      /* Load         Group           */
79 4:      srlx            %o2, 59, %o3                    /* IEU0         Group           */
80         srlx            %o2, 56, %g4                    /* IEU0         Group           */
82 5:      and             %o3, 0x18, %o3                  /* IEU1                         */
83         andcc           %g4, 0x3f, %g4                  /* IEU1         Group           */
84         ldx             [%o5 + %o3], %g2                /* Load                         */
85         srlx            %o2, 51, %o3                    /* IEU0                         */
87         sllx            %o4, %g4, %g1                   /* IEU0         Group           */
88         srlx            %o2, 48, %g4                    /* IEU0         Group           */
89         andcc           %g2, %g1, %g2                   /* IEU1                         */
90         bne,pn          %xcc, 13f                       /* CTI                          */
92          and            %o3, 0x18, %o3                  /* IEU0         Group           */
93         and             %g4, 0x3f, %g4                  /* IEU1                         */
94         ldx             [%o5 + %o3], %g2                /* Load         Group           */
95         srlx            %o2, 43, %o3                    /* IEU0                         */
97         sllx            %o4, %g4, %g1                   /* IEU0         Group           */
98         srlx            %o2, 40, %g4                    /* IEU0         Group           */
99         andcc           %g2, %g1, %g2                   /* IEU1                         */
100         bne,pn          %xcc, 14f                       /* CTI                          */
102          and            %o3, 0x18, %o3                  /* IEU0         Group           */
103         and             %g4, 0x3f, %g4                  /* IEU1                         */
104         ldx             [%o5 + %o3], %g2                /* Load         Group           */
105         srlx            %o2, 35, %o3                    /* IEU0                         */
107         sllx            %o4, %g4, %g1                   /* IEU0         Group           */
108         srlx            %o2, 32, %g4                    /* IEU0         Group           */
109         andcc           %g2, %g1, %g2                   /* IEU1                         */
110         bne,pn          %xcc, 15f                       /* CTI                          */
112          and            %o3, 0x18, %o3                  /* IEU0         Group           */
113         and             %g4, 0x3f, %g4                  /* IEU1                         */
114         ldx             [%o5 + %o3], %g2                /* Load         Group           */
115         srlx            %o2, 27, %o3                    /* IEU0                         */
117         sllx            %o4, %g4, %g1                   /* IEU0         Group           */
118         srlx            %o2, 24, %g4                    /* IEU0         Group           */
119         andcc           %g2, %g1, %g2                   /* IEU1                         */
120         bne,pn          %xcc, 16f                       /* CTI                          */
122          and            %o3, 0x18, %o3                  /* IEU0         Group           */
123         and             %g4, 0x3f, %g4                  /* IEU1                         */
124         ldx             [%o5 + %o3], %g2                /* Load         Group           */
125         srlx            %o2, 19, %o3                    /* IEU0                         */
127         sllx            %o4, %g4, %g1                   /* IEU0         Group           */
128         srlx            %o2, 16, %g4                    /* IEU0         Group           */
129         andcc           %g2, %g1, %g2                   /* IEU1                         */
130         bne,pn          %xcc, 17f                       /* CTI                          */
132          and            %o3, 0x18, %o3                  /* IEU0         Group           */
133         and             %g4, 0x3f, %g4                  /* IEU1                         */
134         ldx             [%o5 + %o3], %g2                /* Load         Group           */
135         srlx            %o2, 11, %o3                    /* IEU0                         */
137         sllx            %o4, %g4, %g1                   /* IEU0         Group           */
138         add             %o0, 8, %o0                     /* IEU1                         */
139         srlx            %o2, 8, %g4                     /* IEU0         Group           */
140         andcc           %g2, %g1, %g2                   /* IEU1                         */
142         bne,pn          %xcc, 18f                       /* CTI                          */
143          and            %o3, 0x18, %o3                  /* IEU0         Group           */
144         and             %g4, 0x3f, %g4                  /* IEU1                         */
145         ldx             [%o5 + %o3], %g2                /* Load         Group           */
147         sllx            %o4, %g4, %g1                   /* IEU0                         */
148         mov             %o2, %g5                        /* IEU1                         */
149         srlx            %o2, 3, %o3                     /* IEU0         Group           */
150         ldxa            [%o0] ASI_PNF, %o2              /* Load                         */
152         andcc           %g2, %g1, %g2                   /* IEU1         Group           */
153         bne,pn          %xcc, 19f                       /* CTI                          */
154          and            %o3, 0x18, %o3                  /* IEU0         Group           */
155         and             %g5, 0x3f, %g4                  /* IEU1                         */
157         ldx             [%o5 + %o3], %g2                /* Load         Group           */
158         sllx            %o4, %g4, %g1                   /* IEU0                         */
159         srlx            %o2, 59, %o3                    /* IEU0         Group           */
160         andcc           %g2, %g1, %g2                   /* IEU1         Group           */
162         be,pt           %xcc, 5b                        /* CTI                          */
163          srlx           %o2, 56, %g4                    /* IEU0         Group           */
164         sub             %o0, 1, %o0                     /* IEU1                         */
165         add             %sp, STACK_SIZE+32, %sp         /* IEU0         Group           */
167         andcc           %g5, 0xff, %g0                  /* IEU1                         */
168         retl                                            /* CTI+IEU1     Group           */
169          move           %icc, 0, %o0                    /* Single       Group           */
171         .align          16
172 19:     sub             %o0, 2, %o0                     /* IEU1                         */
173         srl             %g5, 8, %g1                     /* IEU0         Group           */
174         add             %sp, STACK_SIZE+32, %sp         /* IEU1                         */
175         andcc           %g1, 0xff, %g0                  /* IEU1         Group           */
177         retl                                            /* CTI+IEU1     Group           */
178          move           %icc, 0, %o0                    /* Single       Group           */
179 18:     sub             %o0, 3, %o0                     /* IEU1                         */
180         srl             %o2, 16, %g1                    /* IEU0         Group           */
182         add             %sp, STACK_SIZE+32, %sp         /* IEU1                         */
183         andcc           %g1, 0xff, %g0                  /* IEU1         Group           */
184         retl                                            /* CTI+IEU1     Group           */
185          move           %icc, 0, %o0                    /* Single       Group           */
187 17:     add             %o0, 4, %o0                     /* IEU1                         */
188         srl             %o2, 24, %g1                    /* IEU0         Group           */
189         add             %sp, STACK_SIZE+32, %sp         /* IEU1                         */
190         retl                                            /* CTI+IEU1     Group           */
192          movrz          %g1, 0, %o0                     /* Single       Group           */
193 16:     add             %o0, 3, %o0                     /* IEU1                         */
194         srlx            %o2, 32, %g1                    /* IEU0         Group           */
195         add             %sp, STACK_SIZE+32, %sp         /* IEU1                         */
197         andcc           %g1, 0xff, %g0                  /* IEU1         Group           */
198         retl                                            /* CTI+IEU1     Group           */
199          move           %icc, 0, %o0                    /* Single       Group           */
201         .align          16
202 15:     add             %o0, 2, %o0                     /* IEU1                         */
203         srlx            %o2, 40, %g1                    /* IEU0         Group           */
204         add             %sp, STACK_SIZE+32, %sp         /* IEU1                         */
205         andcc           %g1, 0xff, %g0                  /* IEU1         Group           */
207         retl                                            /* CTI+IEU1     Group           */
208          move           %icc, 0, %o0                    /* Single       Group           */
209 14:     add             %o0, 1, %o0                     /* IEU1                         */
210         srlx            %o2, 48, %g1                    /* IEU0         Group           */
212         add             %sp, STACK_SIZE+32, %sp         /* IEU1                         */
213         andcc           %g1, 0xff, %g0                  /* IEU1         Group           */
214         retl                                            /* CTI+IEU1     Group           */
215          move           %icc, 0, %o0                    /* Single       Group           */
217 13:     add             %sp, STACK_SIZE+32, %sp         /* IEU1                         */
218         srlx            %o2, 56, %g1                    /* IEU0         Group           */
219         retl                                            /* CTI+IEU1     Group           */
220          movrz          %g1, 0, %o0                     /* Single       Group           */
222         .align          16
223 12:     sub             %o0, 1, %o0                     /* IEU0         Group           */
224         or              %o3, %o2, %g1                   /* IEU1                         */
225         add             %sp, STACK_SIZE+32, %sp         /* IEU0         Group           */
226         retl                                            /* CTI+IEU1     Group           */
228          movrz          %g1, 0, %o0                     /* Single       Group           */
229 END(strpbrk)
230 libc_hidden_builtin_def (strpbrk)