forked from luck/tmp_suning_uos_patched
Merge branch 'x86-asm-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull x86 asm updates from Thomas Gleixner: "Two cleanup patches removing dead conditionals and unused code" * 'x86-asm-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: x86/asm: Remove unused __constant_c_x_memset() macro and inlines x86/asm: Remove dead __GNUC__ conditionals
This commit is contained in:
commit
80b98e92eb
|
@ -36,13 +36,7 @@
|
|||
* bit 0 is the LSB of addr; bit 32 is the LSB of (addr+1).
|
||||
*/
|
||||
|
||||
#if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 1)
|
||||
/* Technically wrong, but this avoids compilation errors on some gcc
|
||||
versions. */
|
||||
#define BITOP_ADDR(x) "=m" (*(volatile long *) (x))
|
||||
#else
|
||||
#define BITOP_ADDR(x) "+m" (*(volatile long *) (x))
|
||||
#endif
|
||||
|
||||
#define ADDR BITOP_ADDR(addr)
|
||||
|
||||
|
|
|
@ -179,14 +179,7 @@ static inline void *__memcpy3d(void *to, const void *from, size_t len)
|
|||
* No 3D Now!
|
||||
*/
|
||||
|
||||
#if (__GNUC__ >= 4)
|
||||
#define memcpy(t, f, n) __builtin_memcpy(t, f, n)
|
||||
#else
|
||||
#define memcpy(t, f, n) \
|
||||
(__builtin_constant_p((n)) \
|
||||
? __constant_memcpy((t), (f), (n)) \
|
||||
: __memcpy((t), (f), (n)))
|
||||
#endif
|
||||
|
||||
#endif
|
||||
#endif /* !CONFIG_FORTIFY_SOURCE */
|
||||
|
@ -216,29 +209,6 @@ static inline void *__memset_generic(void *s, char c, size_t count)
|
|||
/* we might want to write optimized versions of these later */
|
||||
#define __constant_count_memset(s, c, count) __memset_generic((s), (c), (count))
|
||||
|
||||
/*
|
||||
* memset(x, 0, y) is a reasonably common thing to do, so we want to fill
|
||||
* things 32 bits at a time even when we don't know the size of the
|
||||
* area at compile-time..
|
||||
*/
|
||||
static __always_inline
|
||||
void *__constant_c_memset(void *s, unsigned long c, size_t count)
|
||||
{
|
||||
int d0, d1;
|
||||
asm volatile("rep ; stosl\n\t"
|
||||
"testb $2,%b3\n\t"
|
||||
"je 1f\n\t"
|
||||
"stosw\n"
|
||||
"1:\ttestb $1,%b3\n\t"
|
||||
"je 2f\n\t"
|
||||
"stosb\n"
|
||||
"2:"
|
||||
: "=&c" (d0), "=&D" (d1)
|
||||
: "a" (c), "q" (count), "0" (count/4), "1" ((long)s)
|
||||
: "memory");
|
||||
return s;
|
||||
}
|
||||
|
||||
/* Added by Gertjan van Wingerde to make minix and sysv module work */
|
||||
#define __HAVE_ARCH_STRNLEN
|
||||
extern size_t strnlen(const char *s, size_t count);
|
||||
|
@ -247,72 +217,6 @@ extern size_t strnlen(const char *s, size_t count);
|
|||
#define __HAVE_ARCH_STRSTR
|
||||
extern char *strstr(const char *cs, const char *ct);
|
||||
|
||||
/*
|
||||
* This looks horribly ugly, but the compiler can optimize it totally,
|
||||
* as we by now know that both pattern and count is constant..
|
||||
*/
|
||||
static __always_inline
|
||||
void *__constant_c_and_count_memset(void *s, unsigned long pattern,
|
||||
size_t count)
|
||||
{
|
||||
switch (count) {
|
||||
case 0:
|
||||
return s;
|
||||
case 1:
|
||||
*(unsigned char *)s = pattern & 0xff;
|
||||
return s;
|
||||
case 2:
|
||||
*(unsigned short *)s = pattern & 0xffff;
|
||||
return s;
|
||||
case 3:
|
||||
*(unsigned short *)s = pattern & 0xffff;
|
||||
*((unsigned char *)s + 2) = pattern & 0xff;
|
||||
return s;
|
||||
case 4:
|
||||
*(unsigned long *)s = pattern;
|
||||
return s;
|
||||
}
|
||||
|
||||
#define COMMON(x) \
|
||||
asm volatile("rep ; stosl" \
|
||||
x \
|
||||
: "=&c" (d0), "=&D" (d1) \
|
||||
: "a" (eax), "0" (count/4), "1" ((long)s) \
|
||||
: "memory")
|
||||
|
||||
{
|
||||
int d0, d1;
|
||||
#if __GNUC__ == 4 && __GNUC_MINOR__ == 0
|
||||
/* Workaround for broken gcc 4.0 */
|
||||
register unsigned long eax asm("%eax") = pattern;
|
||||
#else
|
||||
unsigned long eax = pattern;
|
||||
#endif
|
||||
|
||||
switch (count % 4) {
|
||||
case 0:
|
||||
COMMON("");
|
||||
return s;
|
||||
case 1:
|
||||
COMMON("\n\tstosb");
|
||||
return s;
|
||||
case 2:
|
||||
COMMON("\n\tstosw");
|
||||
return s;
|
||||
default:
|
||||
COMMON("\n\tstosw\n\tstosb");
|
||||
return s;
|
||||
}
|
||||
}
|
||||
|
||||
#undef COMMON
|
||||
}
|
||||
|
||||
#define __constant_c_x_memset(s, c, count) \
|
||||
(__builtin_constant_p(count) \
|
||||
? __constant_c_and_count_memset((s), (c), (count)) \
|
||||
: __constant_c_memset((s), (c), (count)))
|
||||
|
||||
#define __memset(s, c, count) \
|
||||
(__builtin_constant_p(count) \
|
||||
? __constant_count_memset((s), (c), (count)) \
|
||||
|
@ -321,15 +225,7 @@ void *__constant_c_and_count_memset(void *s, unsigned long pattern,
|
|||
#define __HAVE_ARCH_MEMSET
|
||||
extern void *memset(void *, int, size_t);
|
||||
#ifndef CONFIG_FORTIFY_SOURCE
|
||||
#if (__GNUC__ >= 4)
|
||||
#define memset(s, c, count) __builtin_memset(s, c, count)
|
||||
#else
|
||||
#define memset(s, c, count) \
|
||||
(__builtin_constant_p(c) \
|
||||
? __constant_c_x_memset((s), (0x01010101UL * (unsigned char)(c)), \
|
||||
(count)) \
|
||||
: __memset((s), (c), (count)))
|
||||
#endif
|
||||
#endif /* !CONFIG_FORTIFY_SOURCE */
|
||||
|
||||
#define __HAVE_ARCH_MEMSET16
|
||||
|
|
|
@ -14,21 +14,6 @@
|
|||
extern void *memcpy(void *to, const void *from, size_t len);
|
||||
extern void *__memcpy(void *to, const void *from, size_t len);
|
||||
|
||||
#ifndef CONFIG_FORTIFY_SOURCE
|
||||
#if (__GNUC__ == 4 && __GNUC_MINOR__ < 3) || __GNUC__ < 4
|
||||
#define memcpy(dst, src, len) \
|
||||
({ \
|
||||
size_t __len = (len); \
|
||||
void *__ret; \
|
||||
if (__builtin_constant_p(len) && __len >= 64) \
|
||||
__ret = __memcpy((dst), (src), __len); \
|
||||
else \
|
||||
__ret = __builtin_memcpy((dst), (src), __len); \
|
||||
__ret; \
|
||||
})
|
||||
#endif
|
||||
#endif /* !CONFIG_FORTIFY_SOURCE */
|
||||
|
||||
#define __HAVE_ARCH_MEMSET
|
||||
void *memset(void *s, int c, size_t n);
|
||||
void *__memset(void *s, int c, size_t n);
|
||||
|
|
Loading…
Reference in New Issue
Block a user