mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-30 08:02:30 +00:00
s390/lib: use basic blocks for inline assemblies
Use only simple inline assemblies which consist of a single basic block if the register asm construct is being used. Otherwise gcc would generate broken code if the compiler option --sanitize-coverage=trace-pc would be used. Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:
parent
dc4aace160
commit
db7f5eef3d
1 changed files with 25 additions and 23 deletions
|
@ -236,6 +236,26 @@ char * strrchr(const char * s, int c)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(strrchr);
|
EXPORT_SYMBOL(strrchr);
|
||||||
|
|
||||||
|
static inline int clcle(const char *s1, unsigned long l1,
|
||||||
|
const char *s2, unsigned long l2,
|
||||||
|
int *diff)
|
||||||
|
{
|
||||||
|
register unsigned long r2 asm("2") = (unsigned long) s1;
|
||||||
|
register unsigned long r3 asm("3") = (unsigned long) l2;
|
||||||
|
register unsigned long r4 asm("4") = (unsigned long) s2;
|
||||||
|
register unsigned long r5 asm("5") = (unsigned long) l2;
|
||||||
|
int cc;
|
||||||
|
|
||||||
|
asm volatile ("0: clcle %1,%3,0\n"
|
||||||
|
" jo 0b\n"
|
||||||
|
" ipm %0\n"
|
||||||
|
" srl %0,28"
|
||||||
|
: "=&d" (cc), "+a" (r2), "+a" (r3),
|
||||||
|
"+a" (r4), "+a" (r5) : : "cc");
|
||||||
|
*diff = *(char *)r2 - *(char *)r4;
|
||||||
|
return cc;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* strstr - Find the first substring in a %NUL terminated string
|
* strstr - Find the first substring in a %NUL terminated string
|
||||||
* @s1: The string to be searched
|
* @s1: The string to be searched
|
||||||
|
@ -250,18 +270,9 @@ char * strstr(const char * s1,const char * s2)
|
||||||
return (char *) s1;
|
return (char *) s1;
|
||||||
l1 = __strend(s1) - s1;
|
l1 = __strend(s1) - s1;
|
||||||
while (l1-- >= l2) {
|
while (l1-- >= l2) {
|
||||||
register unsigned long r2 asm("2") = (unsigned long) s1;
|
int cc, dummy;
|
||||||
register unsigned long r3 asm("3") = (unsigned long) l2;
|
|
||||||
register unsigned long r4 asm("4") = (unsigned long) s2;
|
|
||||||
register unsigned long r5 asm("5") = (unsigned long) l2;
|
|
||||||
int cc;
|
|
||||||
|
|
||||||
asm volatile ("0: clcle %1,%3,0\n"
|
cc = clcle(s1, l1, s2, l2, &dummy);
|
||||||
" jo 0b\n"
|
|
||||||
" ipm %0\n"
|
|
||||||
" srl %0,28"
|
|
||||||
: "=&d" (cc), "+a" (r2), "+a" (r3),
|
|
||||||
"+a" (r4), "+a" (r5) : : "cc" );
|
|
||||||
if (!cc)
|
if (!cc)
|
||||||
return (char *) s1;
|
return (char *) s1;
|
||||||
s1++;
|
s1++;
|
||||||
|
@ -302,20 +313,11 @@ EXPORT_SYMBOL(memchr);
|
||||||
*/
|
*/
|
||||||
int memcmp(const void *cs, const void *ct, size_t n)
|
int memcmp(const void *cs, const void *ct, size_t n)
|
||||||
{
|
{
|
||||||
register unsigned long r2 asm("2") = (unsigned long) cs;
|
int ret, diff;
|
||||||
register unsigned long r3 asm("3") = (unsigned long) n;
|
|
||||||
register unsigned long r4 asm("4") = (unsigned long) ct;
|
|
||||||
register unsigned long r5 asm("5") = (unsigned long) n;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
asm volatile ("0: clcle %1,%3,0\n"
|
ret = clcle(cs, n, ct, n, &diff);
|
||||||
" jo 0b\n"
|
|
||||||
" ipm %0\n"
|
|
||||||
" srl %0,28"
|
|
||||||
: "=&d" (ret), "+a" (r2), "+a" (r3), "+a" (r4), "+a" (r5)
|
|
||||||
: : "cc" );
|
|
||||||
if (ret)
|
if (ret)
|
||||||
ret = *(char *) r2 - *(char *) r4;
|
ret = diff;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(memcmp);
|
EXPORT_SYMBOL(memcmp);
|
||||||
|
|
Loading…
Reference in a new issue