Fix spelling errors in sysdeps/powerpc files.
[glibc.git] / sysdeps / powerpc / powerpc64 / power7 / strcasecmp.S
blob6323154eaae8b4fa923477f723284f1c209be93f
1 /* Optimized strcasecmp implementation for PowerPC64.
2    Copyright (C) 2011-2013 Free Software Foundation, Inc.
3    This file is part of the GNU C Library.
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library; if not, see
17    <http://www.gnu.org/licenses/>.  */
19 #include <sysdep.h>
20 #include <bp-sym.h>
21 #include <bp-asm.h>
22 #include <locale-defines.h>
24 /* int [r3] strcasecmp (const char *s1 [r3], const char *s2 [r4] )
26    or if defined USE_IN_EXTENDED_LOCALE_MODEL:
28    int [r3] strcasecmp_l (const char *s1 [r3], const char *s2 [r4],
29                           __locale_t loc [r5]) */
31 #ifndef STRCMP
32 # define __STRCMP __strcasecmp
33 # define STRCMP   strcasecmp
34 #endif
36 ENTRY (BP_SYM (__STRCMP))
37         CALL_MCOUNT 2
39 #define rRTN    r3      /* Return value */
40 #define rSTR1   r5      /* 1st string */
41 #define rSTR2   r4      /* 2nd string */
42 #define rLOCARG r5      /* 3rd argument: locale_t */
43 #define rCHAR1  r6      /* Byte read from 1st string */
44 #define rCHAR2  r7      /* Byte read from 2nd string */
45 #define rADDR1  r8      /* Address of tolower(rCHAR1) */
46 #define rADDR2  r12     /* Address of tolower(rCHAR2) */
47 #define rLWR1   r8      /* Word tolower(rCHAR1) */
48 #define rLWR2   r12     /* Word tolower(rCHAR2) */
49 #define rTMP    r9
50 #define rLOC    r11     /* Default locale address */
52         cmpd    cr7, r3, r4
53 #ifndef USE_IN_EXTENDED_LOCALE_MODEL
54         ld      rTMP, __libc_tsd_LOCALE@got@tprel(r2)
55         add     rLOC, rTMP, __libc_tsd_LOCALE@tls
56         ld      rLOC, 0(rLOC)
57 #else
58         mr      rLOC, rLOCARG
59 #endif
60         ld      rLOC, LOCALE_CTYPE_TOLOWER(rLOC)
61         mr      rSTR1, rRTN
62         li      rRTN, 0
63         beqlr   cr7
66         /* Unrolling loop for POWER: loads are done with 'lbz' plus
67         offset and string descriptors are only updated in the end
68         of loop unrolling. */
70         lbz     rCHAR1, 0(rSTR1)        /* Load char from s1 */
71         lbz     rCHAR2, 0(rSTR2)        /* Load char from s2 */
72 L(loop):
73         cmpdi   rCHAR1, 0               /* *s1 == '\0' ? */
74         sldi    rADDR1, rCHAR1, 2       /* Calculate address for tolower(*s1) */
75         sldi    rADDR2, rCHAR2, 2       /* Calculate address for tolower(*s2) */
76         lwzx    rLWR1, rLOC, rADDR1     /* Load tolower(*s1) */
77         lwzx    rLWR2, rLOC, rADDR2     /* Load tolower(*s2) */
78         cmpw    cr1, rLWR1, rLWR2       /* r = tolower(*s1) == tolower(*s2) ? */
79         crorc   4*cr1+eq,eq,4*cr1+eq    /* (*s1 != '\0') || (r == 1) */
80         beq     cr1, L(done)
81         lbz     rCHAR1, 1(rSTR1)
82         lbz     rCHAR2, 1(rSTR2)
83         cmpdi   rCHAR1, 0
84         sldi    rADDR1, rCHAR1, 2
85         sldi    rADDR2, rCHAR2, 2
86         lwzx    rLWR1, rLOC, rADDR1
87         lwzx    rLWR2, rLOC, rADDR2
88         cmpw    cr1, rLWR1, rLWR2
89         crorc   4*cr1+eq,eq,4*cr1+eq
90         beq     cr1, L(done)
91         lbz     rCHAR1, 2(rSTR1)
92         lbz     rCHAR2, 2(rSTR2)
93         cmpdi   rCHAR1, 0
94         sldi    rADDR1, rCHAR1, 2
95         sldi    rADDR2, rCHAR2, 2
96         lwzx    rLWR1, rLOC, rADDR1
97         lwzx    rLWR2, rLOC, rADDR2
98         cmpw    cr1, rLWR1, rLWR2
99         crorc   4*cr1+eq,eq,4*cr1+eq
100         beq     cr1, L(done)
101         lbz     rCHAR1, 3(rSTR1)
102         lbz     rCHAR2, 3(rSTR2)
103         cmpdi   rCHAR1, 0
104         /* Increment both string descriptors */
105         addi    rSTR1, rSTR1, 4
106         addi    rSTR2, rSTR2, 4
107         sldi    rADDR1, rCHAR1, 2
108         sldi    rADDR2, rCHAR2, 2
109         lwzx    rLWR1, rLOC, rADDR1
110         lwzx    rLWR2, rLOC, rADDR2
111         cmpw    cr1, rLWR1, rLWR2
112         crorc   4*cr1+eq,eq,4*cr1+eq
113         beq     cr1,L(done)
114         lbz     rCHAR1, 0(rSTR1)        /* Load char from s1 */
115         lbz     rCHAR2, 0(rSTR2)        /* Load char from s2 */
116         b       L(loop)
117 L(done):
118         subf    r0, rLWR2, rLWR1
119         extsw   rRTN, r0
120         blr
121 END (BP_SYM (__STRCMP))
123 weak_alias (BP_SYM (__STRCMP), BP_SYM (STRCMP))
124 libc_hidden_builtin_def (__STRCMP)