memmove() is implemented by inline assembly. It calls std at first
and cld at last, but EFLAGS still should be clobbered.
Signed-off-by: Jike Song <[email protected]>
---
arch/x86/lib/memcpy_32.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/arch/x86/lib/memcpy_32.c b/arch/x86/lib/memcpy_32.c
index 5415a9d..99a8240 100644
--- a/arch/x86/lib/memcpy_32.c
+++ b/arch/x86/lib/memcpy_32.c
@@ -36,7 +36,7 @@ void *memmove(void *dest, const void *src, size_t n)
:"0" (n),
"1" (n-1+src),
"2" (n-1+dest)
- :"memory");
+ :"cc", "memory");
}
return dest;
}
--
1.6.0.1
Jike Song wrote:
> memmove() is implemented by inline assembly. It calls std at first
> and cld at last, but EFLAGS still should be clobbered.
>
I think x86 gcc assumes "cc" is always clobbered by asms. Otherwise
there'll need to be a lot more "cc" clobbers than this...
J
> Signed-off-by: Jike Song <[email protected]>
> ---
> arch/x86/lib/memcpy_32.c | 2 +-
> 1 files changed, 1 insertions(+), 1 deletions(-)
>
> diff --git a/arch/x86/lib/memcpy_32.c b/arch/x86/lib/memcpy_32.c
> index 5415a9d..99a8240 100644
> --- a/arch/x86/lib/memcpy_32.c
> +++ b/arch/x86/lib/memcpy_32.c
> @@ -36,7 +36,7 @@ void *memmove(void *dest, const void *src, size_t n)
> :"0" (n),
> "1" (n-1+src),
> "2" (n-1+dest)
> - :"memory");
> + :"cc", "memory");
> }
> return dest;
> }
>
Jike Song wrote:
> memmove() is implemented by inline assembly. It calls std at first
> and cld at last, but EFLAGS still should be clobbered.
gcc always treats EFLAGS as clobbered on x86. The "cc" clobber is
needed on some platforms, but is a noop on x86.
-hpa
On Sat, Oct 18, 2008 at 12:35 AM, H. Peter Anvin <[email protected]> wrote:
> Jike Song wrote:
>>
>> memmove() is implemented by inline assembly. It calls std at first
>> and cld at last, but EFLAGS still should be clobbered.
>
> gcc always treats EFLAGS as clobbered on x86. The "cc" clobber is needed on
> some platforms, but is a noop on x86.
No wonder there are inline asms that clobbered eflags/rflags but
without declaring them as clobbered. Thanks for your information.
It turns out that I need to read through the gcc x86 back-end as long
as I want to be a Linux/x86 developer, right? That sounds
discouraging:)
--
Thanks,
Jike