1
/* Optimized strcasecmp implementation for PowerPC32.
2
Copyright (C) 2011 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, write to the Free
17
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
23
#include <locale-defines.h>
25
/* int [r3] strcasecmp (const char *s1 [r3], const char *s2 [r4] )
27
or if defined USE_IN_EXTENDED_LOCALE_MODEL:
29
int [r3] strcasecmp_l (const char *s1 [r3], const char *s2 [r4],
30
__locale_t loc [r5]) */
33
# define __STRCMP __strcasecmp
34
# define STRCMP strcasecmp
37
ENTRY (BP_SYM (__STRCMP))
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 readed from 1st string */
44
#define rCHAR2 r7 /* Byte readed from 2nd string */
45
#define rADDR1 r8 /* Address of tolower(rCHAR1) */
46
#define rADDR2 r12 /* Address of tolower(rCHAR2) */
47
#define rLWR1 r8 /* Byte tolower(rCHAR1) */
48
#define rLWR2 r12 /* Byte tolower(rCHAR2) */
50
#define rGOT r9 /* Address of the Global Offset Table */
51
#define rLOC r11 /* Default locale address */
54
#ifndef USE_IN_EXTENDED_LOCALE_MODEL
59
addis rGOT, rGOT, _GLOBAL_OFFSET_TABLE_-.L1@ha
60
addi rGOT, rGOT, _GLOBAL_OFFSET_TABLE_-.L1@l
61
lwz rLOC, __libc_tsd_LOCALE@got@tprel(rGOT)
62
add rLOC, rLOC, __libc_tsd_LOCALE@tls
66
lis rTMP,_GLOBAL_OFFSET_TABLE_@ha
67
la rLOC,_GLOBAL_OFFSET_TABLE_@l(rTMP)
68
lwz rLOC, __libc_tsd_LOCALE@got@tprel(rGOT)
69
add rLOC, rLOC, __libc_tsd_LOCALE@tls
76
lwz rLOC, LOCALE_CTYPE_TOLOWER(rLOC)
80
/* Unrolling loop for POWER: loads are done with 'lbz' plus
81
offset and string descriptors are only updated in the end
85
lbz rCHAR1, 0(rSTR1) /* Load char from s1 */
86
lbz rCHAR2, 0(rSTR2) /* Load char from s2 */
87
sldi rADDR1, rCHAR1, 2 /* Calculate address for tolower(*s1) */
88
sldi rADDR2, rCHAR2, 2 /* Calculate address for tolower(*s2) */
89
lwzx rLWR1, rLOC, rADDR1 /* Load tolower(*s1) */
90
lwzx rLWR2, rLOC, rADDR2 /* Load tolower(*s2) */
91
cmpwi cr7, rCHAR1, 0 /* *s1 == '\0' ? */
92
subf. r3, rLWR2, rLWR1
97
sldi rADDR1, rCHAR1, 2
98
sldi rADDR2, rCHAR2, 2
99
lwzx rLWR1, rLOC, rADDR1
100
lwzx rLWR2, rLOC, rADDR2
102
subf. r3, rLWR2, rLWR1
107
sldi rADDR1, rCHAR1, 2
108
sldi rADDR2, rCHAR2, 2
109
lwzx rLWR1, rLOC, rADDR1
110
lwzx rLWR2, rLOC, rADDR2
112
subf. r3, rLWR2, rLWR1
117
/* Increment both string descriptors */
120
sldi rADDR1, rCHAR1, 2
121
sldi rADDR2, rCHAR2, 2
122
lwzx rLWR1, rLOC, rADDR1
123
lwzx rLWR2, rLOC, rADDR2
125
subf. r3, rLWR2, rLWR1
129
END (BP_SYM (__STRCMP))
131
weak_alias (BP_SYM (__STRCMP), BP_SYM (STRCMP))
132
libc_hidden_builtin_def (__STRCMP)