Update copyright notices with scripts/update-copyrights
[glibc.git] / sysdeps / sparc / sparc64 / strspn.S
blob90420853a6616833663c2ae69d0e0d135a8c2c97
1 /* strspn (str, ss) -- Return the length of the maximum initial segment
2                        of S which contains only characters in ACCEPT.
3    For SPARC v9.
4    Copyright (C) 1999-2014 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(strspn)
37         sub             %sp, STACK_SIZE+32, %sp         /* IEU0         Group           */
38         mov             1, %o4                          /* IEU1                         */
39         stx             %g0, [%sp + STACK_OFFSET]       /* Store        Group           */
40         mov             %o0, %g4                        /* IEU0                         */
42         stx             %g0, [%sp + STACK_OFFSET + 8]   /* Store        Group           */
43         add             %sp, STACK_OFFSET, %o5          /* IEU0                         */
44         stx             %g0, [%sp + STACK_OFFSET + 16]  /* Store        Group           */
45         stx             %g0, [%sp + STACK_OFFSET + 24]  /* Store        Group           */
47 1:      ldub            [%o1], %o2                      /* Load         Group           */
48         brz,pn          %o2, 2f                         /* CTI+IEU1     Group           */
49          srl            %o2, 3, %o3                     /* IEU0                         */
50         and             %o3, 0x18, %o3                  /* IEU0         Group           */
52         and             %o2, 0x3f, %o2                  /* IEU1                         */
53         ldx             [%o5 + %o3], %g2                /* Load         Group           */
54         sllx            %o4, %o2, %g1                   /* IEU0                         */
55         add             %o1, 1, %o1                     /* IEU1                         */
57         or              %g2, %g1, %g2                   /* IEU0         Group           */
58         ba,pt           %xcc, 1b                        /* CTI                          */
59          stx            %g2, [%o5 + %o3]                /* Store                        */
60 2:      andcc           %o0, 7, %g0                     /* IEU1         Group           */
62         be,a,pt         %xcc, 4f                        /* CTI                          */
63          ldx            [%o0], %o2                      /* Load                         */
64         ldub            [%o0], %o2                      /* Load         Group           */
65 3:      srl             %o2, 3, %o3                     /* IEU0         Group           */
67         and             %o2, 0x3f, %o2                  /* IEU1                         */
68         and             %o3, 0x18, %o3                  /* IEU0         Group           */
69         ldx             [%o5 + %o3], %g2                /* Load         Group           */
70         sllx            %o4, %o2, %g1                   /* IEU0                         */
72         add             %o0, 1, %o0                     /* IEU1                         */
73         andcc           %g2, %g1, %g0                   /* IEU1         Group           */
74         be,pn           %xcc, 12f                       /* CTI                          */
75          andcc          %o0, 7, %g0                     /* IEU1         Group           */
77         bne,a,pt        %icc, 3b                        /* CTI                          */
78          ldub           [%o0], %o2                      /* Load                         */
79         ldx             [%o0], %o2                      /* Load         Group           */
80 4:      srlx            %o2, 59, %o3                    /* IEU0         Group           */
82         srlx            %o2, 56, %g5                    /* IEU0         Group           */
83 5:      and             %o3, 0x18, %o3                  /* IEU1                         */
84         andcc           %g5, 0x3f, %g5                  /* IEU1         Group           */
85         ldx             [%o5 + %o3], %g2                /* Load                         */
87         srlx            %o2, 51, %o3                    /* IEU0                         */
88         sllx            %o4, %g5, %g1                   /* IEU0         Group           */
89         srlx            %o2, 48, %g5                    /* IEU0         Group           */
90         andcc           %g2, %g1, %g2                   /* IEU1                         */
92         be,pn           %xcc, 13f                       /* CTI                          */
93          and            %o3, 0x18, %o3                  /* IEU0         Group           */
94         and             %g5, 0x3f, %g5                  /* IEU1                         */
95         ldx             [%o5 + %o3], %g2                /* Load         Group           */
97         srlx            %o2, 43, %o3                    /* IEU0                         */
98         sllx            %o4, %g5, %g1                   /* IEU0         Group           */
99         srlx            %o2, 40, %g5                    /* IEU0         Group           */
100         andcc           %g2, %g1, %g2                   /* IEU1                         */
102         be,pn           %xcc, 14f                       /* CTI                          */
103          and            %o3, 0x18, %o3                  /* IEU0         Group           */
104         and             %g5, 0x3f, %g5                  /* IEU1                         */
105         ldx             [%o5 + %o3], %g2                /* Load         Group           */
107         srlx            %o2, 35, %o3                    /* IEU0                         */
108         sllx            %o4, %g5, %g1                   /* IEU0         Group           */
109         srlx            %o2, 32, %g5                    /* IEU0         Group           */
110         andcc           %g2, %g1, %g2                   /* IEU1                         */
112         be,pn           %xcc, 15f                       /* CTI                          */
113          and            %o3, 0x18, %o3                  /* IEU0         Group           */
114         and             %g5, 0x3f, %g5                  /* IEU1                         */
115         ldx             [%o5 + %o3], %g2                /* Load         Group           */
117         srlx            %o2, 27, %o3                    /* IEU0                         */
118         sllx            %o4, %g5, %g1                   /* IEU0         Group           */
119         srlx            %o2, 24, %g5                    /* IEU0         Group           */
120         andcc           %g2, %g1, %g2                   /* IEU1                         */
122         be,pn           %xcc, 16f                       /* CTI                          */
123          and            %o3, 0x18, %o3                  /* IEU0         Group           */
124         and             %g5, 0x3f, %g5                  /* IEU1                         */
125         ldx             [%o5 + %o3], %g2                /* Load         Group           */
127         srlx            %o2, 19, %o3                    /* IEU0                         */
128         sllx            %o4, %g5, %g1                   /* IEU0         Group           */
129         srlx            %o2, 16, %g5                    /* IEU0         Group           */
130         andcc           %g2, %g1, %g2                   /* IEU1                         */
132         be,pn           %xcc, 17f                       /* CTI                          */
133          and            %o3, 0x18, %o3                  /* IEU0         Group           */
134         and             %g5, 0x3f, %g5                  /* IEU1                         */
135         ldx             [%o5 + %o3], %g2                /* Load         Group           */
137         srlx            %o2, 11, %o3                    /* IEU0                         */
138         sllx            %o4, %g5, %g1                   /* IEU0         Group           */
139         add             %o0, 8, %o0                     /* IEU1                         */
140         srlx            %o2, 8, %g5                     /* IEU0         Group           */
142         andcc           %g2, %g1, %g2                   /* IEU1                         */
143         be,pn           %xcc, 18f                       /* CTI                          */
144          and            %o3, 0x18, %o3                  /* IEU0         Group           */
145         and             %g5, 0x3f, %g5                  /* IEU1                         */
147         ldx             [%o5 + %o3], %g2                /* Load         Group           */
148         sllx            %o4, %g5, %g1                   /* IEU0                         */
149         mov             %o2, %g5                        /* IEU1                         */
150         srlx            %o2, 3, %o3                     /* IEU0         Group           */
152         ldxa            [%o0] ASI_PNF, %o2              /* Load                         */
153         andcc           %g2, %g1, %g2                   /* IEU1         Group           */
154         be,pn           %xcc, 19f                       /* CTI                          */
155          and            %o3, 0x18, %o3                  /* IEU0         Group           */
157         and             %g5, 0x3f, %g5                  /* IEU1                         */
158         ldx             [%o5 + %o3], %g2                /* Load         Group           */
159         sllx            %o4, %g5, %g1                   /* IEU0                         */
160         srlx            %o2, 59, %o3                    /* IEU0         Group           */
162         andcc           %g2, %g1, %g2                   /* IEU1         Group           */
163         bne,pt          %xcc, 5b                        /* CTI                          */
164          srlx           %o2, 56, %g5                    /* IEU0         Group           */
165         sub             %o0, 1, %o0                     /* IEU1                         */
167         add             %sp, STACK_SIZE+32, %sp         /* IEU0         Group           */
168         retl                                            /* CTI+IEU1     Group           */
169          sub            %o0, %g4, %o0                   /* IEU0                         */
171         .align          16
172 19:     sub             %o0, 2, %o0                     /* IEU1                         */
173         add             %sp, STACK_SIZE+32, %sp         /* IEU0         Group           */
174         retl                                            /* CTI+IEU1     Group           */
175          sub            %o0, %g4, %o0                   /* IEU0                         */
177 18:     sub             %o0, 3, %o0                     /* IEU1                         */
178         add             %sp, STACK_SIZE+32, %sp         /* IEU0         Group           */
179         retl                                            /* CTI+IEU1     Group           */
180          sub            %o0, %g4, %o0                   /* IEU0                         */
182 17:     add             %o0, 4, %o0                     /* IEU1                         */
183         add             %sp, STACK_SIZE+32, %sp         /* IEU0         Group           */
184         retl                                            /* CTI+IEU1     Group           */
185          sub            %o0, %g4, %o0                   /* IEU0                         */
187 16:     add             %o0, 3, %o0                     /* IEU1                         */
188         add             %sp, STACK_SIZE+32, %sp         /* IEU0         Group           */
189         retl                                            /* CTI+IEU1     Group           */
190          sub            %o0, %g4, %o0                   /* IEU0                         */
192 15:     add             %o0, 2, %o0                     /* IEU1                         */
193         add             %sp, STACK_SIZE+32, %sp         /* IEU0         Group           */
194         retl                                            /* CTI+IEU1     Group           */
195          sub            %o0, %g4, %o0                   /* IEU0                         */
197 14:     add             %o0, 1, %o0                     /* IEU1                         */
198         add             %sp, STACK_SIZE+32, %sp         /* IEU0         Group           */
199         retl                                            /* CTI+IEU1     Group           */
200          sub            %o0, %g4, %o0                   /* IEU0                         */
202 13:     add             %sp, STACK_SIZE+32, %sp         /* IEU1                         */
203         retl                                            /* CTI+IEU1     Group           */
204          sub            %o0, %g4, %o0                   /* IEU0                         */
206         .align          16
207 12:     sub             %o0, 1, %o0                     /* IEU0         Group           */
208         add             %sp, STACK_SIZE+32, %sp         /* IEU1                         */
209         retl                                            /* CTI+IEU1     Group           */
210          sub            %o0, %g4, %o0                   /* IEU0                         */
211 END(strspn)
212 libc_hidden_builtin_def (strspn)