]> git.ipfire.org Git - thirdparty/glibc.git/blame - sysdeps/powerpc/powerpc32/power7/strcasecmp.S
Update copyright dates with scripts/update-copyrights.
[thirdparty/glibc.git] / sysdeps / powerpc / powerpc32 / power7 / strcasecmp.S
CommitLineData
f0b264f1 1/* Optimized strcasecmp implementation for PowerPC32.
04277e02 2 Copyright (C) 2011-2019 Free Software Foundation, Inc.
f0b264f1
AZ
3 This file is part of the GNU C Library.
4
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.
9
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.
14
15 You should have received a copy of the GNU Lesser General Public
59ba27a6
PE
16 License along with the GNU C Library; if not, see
17 <http://www.gnu.org/licenses/>. */
f0b264f1
AZ
18
19#include <sysdep.h>
f0b264f1
AZ
20#include <locale-defines.h>
21
22/* int [r3] strcasecmp (const char *s1 [r3], const char *s2 [r4] )
23
24 or if defined USE_IN_EXTENDED_LOCALE_MODEL:
25
26 int [r3] strcasecmp_l (const char *s1 [r3], const char *s2 [r4],
af85385f 27 locale_t loc [r5]) */
f0b264f1
AZ
28
29#ifndef STRCMP
30# define __STRCMP __strcasecmp
31# define STRCMP strcasecmp
32#endif
33
b5510883 34ENTRY (__STRCMP)
f0b264f1
AZ
35
36#define rRTN r3 /* Return value */
37#define rSTR1 r5 /* 1st string */
38#define rSTR2 r4 /* 2nd string */
39#define rLOCARG r5 /* 3rd argument: locale_t */
2ccdea26
AB
40#define rCHAR1 r6 /* Byte read from 1st string */
41#define rCHAR2 r7 /* Byte read from 2nd string */
f0b264f1
AZ
42#define rADDR1 r8 /* Address of tolower(rCHAR1) */
43#define rADDR2 r12 /* Address of tolower(rCHAR2) */
44#define rLWR1 r8 /* Byte tolower(rCHAR1) */
45#define rLWR2 r12 /* Byte tolower(rCHAR2) */
46#define rTMP r0
47#define rGOT r9 /* Address of the Global Offset Table */
48#define rLOC r11 /* Default locale address */
49
50 cmpw cr7, r3, r4
51#ifndef USE_IN_EXTENDED_LOCALE_MODEL
52# ifdef SHARED
53 mflr rTMP
54 bcl 20,31,.L1
55.L1: mflr rGOT
56 addis rGOT, rGOT, _GLOBAL_OFFSET_TABLE_-.L1@ha
57 addi rGOT, rGOT, _GLOBAL_OFFSET_TABLE_-.L1@l
58 lwz rLOC, __libc_tsd_LOCALE@got@tprel(rGOT)
59 add rLOC, rLOC, __libc_tsd_LOCALE@tls
60 lwz rLOC, 0(rLOC)
61 mtlr rTMP
62# else
63 lis rTMP,_GLOBAL_OFFSET_TABLE_@ha
64 la rLOC,_GLOBAL_OFFSET_TABLE_@l(rTMP)
65 lwz rLOC, __libc_tsd_LOCALE@got@tprel(rGOT)
66 add rLOC, rLOC, __libc_tsd_LOCALE@tls
67 lwz rLOC, 0(rLOC)
68# endif /* SHARED */
69#else
70 mr rLOC, rLOCARG
71#endif
72 mr rSTR1, rRTN
73 lwz rLOC, LOCALE_CTYPE_TOLOWER(rLOC)
74 li rRTN, 0
75 beqlr cr7
76
77 /* Unrolling loop for POWER: loads are done with 'lbz' plus
78 offset and string descriptors are only updated in the end
79 of loop unrolling. */
80
81L(loop):
82 lbz rCHAR1, 0(rSTR1) /* Load char from s1 */
83 lbz rCHAR2, 0(rSTR2) /* Load char from s2 */
84 sldi rADDR1, rCHAR1, 2 /* Calculate address for tolower(*s1) */
85 sldi rADDR2, rCHAR2, 2 /* Calculate address for tolower(*s2) */
86 lwzx rLWR1, rLOC, rADDR1 /* Load tolower(*s1) */
87 lwzx rLWR2, rLOC, rADDR2 /* Load tolower(*s2) */
88 cmpwi cr7, rCHAR1, 0 /* *s1 == '\0' ? */
89 subf. r3, rLWR2, rLWR1
90 bnelr
91 beqlr cr7
92 lbz rCHAR1, 1(rSTR1)
93 lbz rCHAR2, 1(rSTR2)
94 sldi rADDR1, rCHAR1, 2
95 sldi rADDR2, rCHAR2, 2
96 lwzx rLWR1, rLOC, rADDR1
97 lwzx rLWR2, rLOC, rADDR2
98 cmpwi cr7, rCHAR1, 0
99 subf. r3, rLWR2, rLWR1
100 bnelr
101 beqlr cr7
102 lbz rCHAR1, 2(rSTR1)
103 lbz rCHAR2, 2(rSTR2)
104 sldi rADDR1, rCHAR1, 2
105 sldi rADDR2, rCHAR2, 2
106 lwzx rLWR1, rLOC, rADDR1
107 lwzx rLWR2, rLOC, rADDR2
108 cmpwi cr7, rCHAR1, 0
109 subf. r3, rLWR2, rLWR1
110 bnelr
111 beqlr cr7
112 lbz rCHAR1, 3(rSTR1)
113 lbz rCHAR2, 3(rSTR2)
114 /* Increment both string descriptors */
115 addi rSTR1, rSTR1, 4
116 addi rSTR2, rSTR2, 4
117 sldi rADDR1, rCHAR1, 2
118 sldi rADDR2, rCHAR2, 2
119 lwzx rLWR1, rLOC, rADDR1
120 lwzx rLWR2, rLOC, rADDR2
121 cmpwi cr7, rCHAR1, 0
122 subf. r3, rLWR2, rLWR1
123 bnelr
124 bne cr7,L(loop)
125 blr
b5510883 126END (__STRCMP)
f0b264f1 127
b5510883 128weak_alias (__STRCMP, STRCMP)
f0b264f1 129libc_hidden_builtin_def (__STRCMP)