#define _HAVE_STRING_ARCH_memcpy 1
#define memcpy(dest, src, n) \
(__extension__ (__builtin_constant_p (n) \
- ? __memcpy_c (dest, src, n) \
- : memcpy (dest, src, n)))
+ ? __memcpy_c ((dest), (src), (n)) \
+ : memcpy ((dest), (src), (n))))
/* This looks horribly ugly, but the compiler can optimize it totally,
as the count is constant. */
__STRING_INLINE void *__memcpy_c (void *__dest, __const void *__src,
"movl $1,%0\n"
"1:"
: "=D" (__res), "=&c" (__d0)
- : "a" (__c), "0" (__s), "1" (__n)
+ : "a" (__c), "0" (__s), "1" (__n),
+ "m" ( *(struct { __extension__ char __x[__n]; } *)__s)
: "cc");
return __res - 1;
}
"1:\tcld\n\t"
"incl %0"
: "=D" (__res), "=&c" (__d0)
- : "a" (__c), "0" (__s + __n - 1), "1" (__n)
+ : "a" (__c), "0" (__s + __n - 1), "1" (__n),
+ "m" ( *(struct { __extension__ char __x[__n]; } *)__s)
: "cc");
return __res;
}
"repne; scasb\n\t"
"notl %0"
: "=c" (__res), "=&D" (__d0)
- : "1" (__str), "a" (0), "0" (0xffffffff)
+ : "1" (__str), "a" (0), "0" (0xffffffff),
+ "m" ( *(struct { char __x[0xfffffff]; } *)__str)
: "cc");
return __res - 1;
}
"orb $1,%%al\n"
"3:"
: "=a" (__res), "=&S" (__d0), "=&D" (__d1)
- : "1" (__s1), "2" (__s2)
+ : "1" (__s1), "2" (__s2),
+ "m" ( *(struct { char __x[0xfffffff]; } *)__s1),
+ "m" ( *(struct { char __x[0xfffffff]; } *)__s2)
: "cc");
return __res;
}
"orb $1,%%al\n"
"4:"
: "=a" (__res), "=&S" (__d0), "=&D" (__d1), "=&c" (__d2)
- : "1" (__s1), "2" (__s2), "3" (__n)
+ : "1" (__s1), "2" (__s2), "3" (__n),
+ "m" ( *(struct { __extension__ char __x[__n]; } *)__s1),
+ "m" ( *(struct { __extension__ char __x[__n]; } *)__s2)
: "cc");
return __res;
}
"2:\n\t"
"movl %1,%0"
: "=a" (__res), "=&S" (__d0)
- : "0" (__c), "1" (__s)
+ : "0" (__c), "1" (__s),
+ "m" ( *(struct { char __x[0xfffffff]; } *)__s)
: "cc");
return __res - 1;
}
"2:\n\t"
"movl %1,%0"
: "=a" (__res), "=&S" (__d0)
- : "0" (__c), "1" (__s)
+ : "0" (__c), "1" (__s),
+ "m" ( *(struct { char __x[0xfffffff]; } *)__s)
: "cc");
return __res - 1;
}
"2:\n\t"
"movl %1,%0"
: "=a" (__res), "=&S" (__d0)
- : "0" (__c), "1" (__s)
+ : "0" (__c), "1" (__s),
+ "m" ( *(struct { char __x[0xfffffff]; } *)__s)
: "cc");
return __res - 1;
}
"2:\n\t"
"movl %1,%0"
: "=a" (__res), "=&S" (__d0)
- : "0" (__c), "1" (__s)
+ : "0" (__c), "1" (__s),
+ "m" ( *(struct { char __x[0xfffffff]; } *)__s)
: "cc");
return __res - 1;
}
"2:\n\t"
"popl %%ebx"
: "=&S" (__res), "=&a" (__d0), "=&c" (__d1), "=&D" (__d2)
- : "d" (__reject), "0" (__s), "1" (0), "2" (0xffffffff)
+ : "d" (__reject), "0" (__s), "1" (0), "2" (0xffffffff),
+ "m" ( *(struct { char __x[0xfffffff]; } *)__s)
: "cc");
return (__res - 1) - __s;
}
"jne 1b\n"
"2:"
: "=&S" (__res), "=&a" (__d0), "=&c" (__d1), "=&d" (__d2), "=&D" (__d3)
- : "g" (__reject), "0" (__s), "1" (0), "2" (0xffffffff)
+ : "g" (__reject), "0" (__s), "1" (0), "2" (0xffffffff),
+ "m" ( *(struct { char __x[0xfffffff]; } *)__s)
: "cc");
return (__res - 1) - __s;
}
"2:\n\t"
"popl %%ebx"
: "=&S" (__res), "=&a" (__d0), "=&c" (__d1), "=&D" (__d2)
- : "r" (__accept), "0" (__s), "1" (0), "2" (0xffffffff)
+ : "r" (__accept), "0" (__s), "1" (0), "2" (0xffffffff),
+ "m" ( *(struct { char __x[0xfffffff]; } *)__s)
: "cc");
return (__res - 1) - __s;
}
"je 1b\n"
"2:"
: "=&S" (__res), "=&a" (__d0), "=&c" (__d1), "=&d" (__d2), "=&D" (__d3)
- : "g" (__accept), "0" (__s), "1" (0), "2" (0xffffffff)
+ : "g" (__accept), "0" (__s), "1" (0), "2" (0xffffffff),
+ "m" ( *(struct { char __x[0xfffffff]; } *)__s)
: "cc");
return (__res - 1) - __s;
}
"3:\n\t"
"popl %%ebx"
: "=&S" (__res), "=&a" (__d0), "=&c" (__d1), "=&D" (__d2)
- : "r" (__accept), "0" (__s), "1" (0), "2" (0xffffffff)
+ : "r" (__accept), "0" (__s), "1" (0), "2" (0xffffffff),
+ "m" ( *(struct { char __x[0xfffffff]; } *)__s)
: "cc");
return __res;
}
"xorl %0,%0\n"
"3:"
: "=&S" (__res), "=&a" (__d0), "=&c" (__d1), "=&d" (__d2), "=&D" (__d3)
- : "g" (__accept), "0" (__s), "1" (0), "2" (0xffffffff)
+ : "g" (__accept), "0" (__s), "1" (0), "2" (0xffffffff),
+ "m" ( *(struct { char __x[0xfffffff]; } *)__s)
: "cc");
return __res;
}
"popl %%ebx"
: "=&a" (__res), "=&c" (__d0), "=&S" (__d1), "=&D" (__d2)
: "r" (__needle), "0" (0), "1" (0xffffffff), "2" (__haystack)
- : "cc");
+ : "memory", "cc");
return __res;
}
# else
"2:"
: "=&a" (__res), "=&c" (__d0), "=&S" (__d1), "=&d" (__d2), "=&D" (__d3)
: "g" (__needle), "0" (0), "1" (0xffffffff), "2" (__haystack)
- : "cc");
+ : "memory", "cc");
return __res;
}
# endif