Replace FSF snail mail address with URLs.
[glibc.git] / sysdeps / sparc / sparc64 / memcmp.S
blob5263257adbfd1523b37dc789455e96f880b844ae
1 /* Compare two memory blocks for differences in the first COUNT bytes.
2    For SPARC v9.
3    Copyright (C) 1998, 1999, 2004 Free Software Foundation, Inc.
4    This file is part of the GNU C Library.
5    Contributed by Jan Vondrak <jvon4518@ss1000.ms.mff.cuni.cz> and
6                   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 USE_BPR
27         .register       %g2, #scratch
28         .register       %g3, #scratch
29 #endif
31         .text
32         .align          32
33 ENTRY(memcmp)
34 #ifdef USE_BPR
35         brz,pn          %o2, 3f                         /* CTI+IEU1     Group           */
36 #else
37         tst             %o2                             /* IEU1         Group           */
38         be,pn           %XCC, 3f                        /* CTI                          */
39 #endif
40          andcc          %o0, 7, %g0                     /* IEU1         Group           */
41         bne,pn          %icc, 8f                        /* CTI                          */
42 1:       andcc          %o1, 7, %g1                     /* IEU1         Group           */
44         bne,pn          %icc, 10f                       /* CTI                          */
45          mov            64, %g3                         /* IEU0                         */
46         ldx             [%o0], %g1                      /* Load         Group           */
47         sub             %o1, %o0, %o1                   /* IEU0                         */
49         ldx             [%o0 + %o1], %g2                /* Load         Group           */
50         add             %o0, 8, %o0                     /* IEU0                         */
51 2:      mov             %g1, %o3                        /* IEU0         Group           */
52         subcc           %o2, 8, %o2                     /* IEU1                         */
54         bl,pn           %XCC, 5f                        /* CTI                          */
55          ldxa           [%o0] ASI_PNF, %g1              /* Load         Group           */
56         mov             %g2, %o4                        /* IEU0                         */
57         ldxa            [%o0 + %o1] ASI_PNF, %g2        /* Load         Group           */
59         cmp             %o3, %o4                        /* IEU1                         */
60         be,pt           %xcc, 2b                        /* CTI                          */
61          add            %o0, 8, %o0                     /* IEU0                         */
62 7:      mov             -1, %o0                         /* IEU1                         */
64         retl                                            /* CTI+IEU1     Group           */
65          movgu          %xcc, 1, %o0                    /* Single       Group           */
66 3:      retl                                            /* CTI+IEU1     Group           */
67          clr            %o0                             /* IEU0                         */
69         .align          16
70 5:      mov             %g2, %o4                        /* IEU0                         */
71 6:      cmp             %o2, -8                         /* IEU1                         */
72         be,pn           %XCC, 3b                        /* CTI                          */
73          sub            %g0, %o2, %o2                   /* IEU0         Group           */
75         sllx            %o2, 3, %o2                     /* IEU0         Group           */
76         srlx            %o3, %o2, %o3                   /* IEU0         Group           */
77         srlx            %o4, %o2, %o4                   /* IEU0         Group           */
78         clr             %o0                             /* IEU1                         */
80         cmp             %o3, %o4                        /* IEU1         Group           */
81         movgu           %xcc, 1, %o0                    /* Single       Group           */
82         retl                                            /* CTI+IEU1     Group           */
83          movlu          %xcc, -1, %o0                   /* Single       Group           */
85 8:      ldub            [%o0], %o3                      /* Load                         */
86         add             %o0, 1, %o0                     /* IEU0                         */
87         ldub            [%o1], %o4                      /* Load         Group           */
88         add             %o1, 1, %o1                     /* IEU0                         */
90 9:      cmp             %o3, %o4                        /* IEU1         Group           */
91         bne,pn          %xcc, 12f                       /* CTI                          */
92          subcc          %o2, 1, %o2                     /* IEU1         Group           */
93         be,pn           %XCC, 3b                        /* CTI                          */
95          lduba          [%o0] ASI_PNF, %o3              /* Load                         */
96         andcc           %o0, 7, %g0                     /* IEU1         Group           */
97         be,pn           %icc, 1b                        /* CTI                          */
98          lduba          [%o1] ASI_PNF, %o4              /* Load                         */
100         add             %o0, 1, %o0                     /* IEU0         Group           */
101         ba,pt           %xcc, 9b                        /* CTI                          */
102          add            %o1, 1, %o1                     /* IEU1                         */
104         .align          16
105 12:     mov             -1, %o0                         /* IEU0         Group           */
106         cmp             %o3, %o4                        /* IEU1                         */
107         retl                                            /* CTI+IEU1     Group           */
108          movgu          %xcc, 1, %o0                    /* Single       Group           */
110         .align          16
111         nop                                             /* Stub                         */
112 10:     sllx            %g1, 3, %g2                     /* IEU0         Group           */
113         sub             %o1, %g1, %o1                   /* IEU1                         */
114         sub             %g3, %g2, %g3                   /* IEU0         Group           */
116         ldxa            [%o0] ASI_PNF, %g5              /* Load                         */
117         sub             %o1, %o0, %o1                   /* IEU1                         */
118         ldxa            [%o0 + %o1] ASI_PNF, %g4        /* Load         Group           */
119         add             %o0, 8, %o0                     /* IEU0                         */
121 11:     sllx            %g4, %g2, %o4                   /* IEU0         Group           */
122         ldxa            [%o0 + %o1] ASI_PNF, %g4        /* Load                         */
123         srlx            %g4, %g3, %o5                   /* IEU0         Group           */
124         mov             %g5, %o3                        /* IEU1                         */
126         ldxa            [%o0] ASI_PNF, %g5              /* Load                         */
127         subcc           %o2, 8, %o2                     /* IEU1         Group           */
128         bl,pn           %XCC, 6b                        /* CTI                          */
129          or             %o4, %o5, %o4                   /* IEU0                         */
131         cmp             %o3, %o4                        /* IEU1         Group           */
132         be,pt           %xcc, 11b                       /* CTI                          */
133          add            %o0, 8, %o0                     /* IEU0                         */
134         mov             -1, %o0                         /* IEU0                         */
136         retl                                            /* CTI+IEU1     Group           */
137          movgu          %xcc, 1, %o0                    /* Single       Group           */
138 END(memcmp)
140 #undef bcmp
141 weak_alias (memcmp, bcmp)
142 libc_hidden_builtin_def (memcmp)