提交 1b246d22 编写于 作者: L Linus Torvalds

Merge branch 'x86-asm-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull x86 asm updates from Ingo Molnar:

 - better support (non-atomic) 64-bit readq()/writeq() variants (Andy
   Shevchenko)

 - __clear_user() micro-optimization (Alexey Dobriyan)

* 'x86-asm-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  x86/io: Define readq()/writeq() to use 64-bit type
  x86/asm/64: Micro-optimize __clear_user() - Use immediate constants
...@@ -94,10 +94,10 @@ build_mmio_write(__writel, "l", unsigned int, "r", ) ...@@ -94,10 +94,10 @@ build_mmio_write(__writel, "l", unsigned int, "r", )
#ifdef CONFIG_X86_64 #ifdef CONFIG_X86_64
build_mmio_read(readq, "q", unsigned long, "=r", :"memory") build_mmio_read(readq, "q", u64, "=r", :"memory")
build_mmio_read(__readq, "q", unsigned long, "=r", ) build_mmio_read(__readq, "q", u64, "=r", )
build_mmio_write(writeq, "q", unsigned long, "r", :"memory") build_mmio_write(writeq, "q", u64, "r", :"memory")
build_mmio_write(__writeq, "q", unsigned long, "r", ) build_mmio_write(__writeq, "q", u64, "r", )
#define readq_relaxed(a) __readq(a) #define readq_relaxed(a) __readq(a)
#define writeq_relaxed(v, a) __writeq(v, a) #define writeq_relaxed(v, a) __writeq(v, a)
......
...@@ -23,13 +23,13 @@ unsigned long __clear_user(void __user *addr, unsigned long size) ...@@ -23,13 +23,13 @@ unsigned long __clear_user(void __user *addr, unsigned long size)
asm volatile( asm volatile(
" testq %[size8],%[size8]\n" " testq %[size8],%[size8]\n"
" jz 4f\n" " jz 4f\n"
"0: movq %[zero],(%[dst])\n" "0: movq $0,(%[dst])\n"
" addq %[eight],%[dst]\n" " addq $8,%[dst]\n"
" decl %%ecx ; jnz 0b\n" " decl %%ecx ; jnz 0b\n"
"4: movq %[size1],%%rcx\n" "4: movq %[size1],%%rcx\n"
" testl %%ecx,%%ecx\n" " testl %%ecx,%%ecx\n"
" jz 2f\n" " jz 2f\n"
"1: movb %b[zero],(%[dst])\n" "1: movb $0,(%[dst])\n"
" incq %[dst]\n" " incq %[dst]\n"
" decl %%ecx ; jnz 1b\n" " decl %%ecx ; jnz 1b\n"
"2:\n" "2:\n"
...@@ -40,8 +40,7 @@ unsigned long __clear_user(void __user *addr, unsigned long size) ...@@ -40,8 +40,7 @@ unsigned long __clear_user(void __user *addr, unsigned long size)
_ASM_EXTABLE(0b,3b) _ASM_EXTABLE(0b,3b)
_ASM_EXTABLE(1b,2b) _ASM_EXTABLE(1b,2b)
: [size8] "=&c"(size), [dst] "=&D" (__d0) : [size8] "=&c"(size), [dst] "=&D" (__d0)
: [size1] "r"(size & 7), "[size8]" (size / 8), "[dst]"(addr), : [size1] "r"(size & 7), "[size8]" (size / 8), "[dst]"(addr));
[zero] "r" (0UL), [eight] "r" (8UL));
clac(); clac();
return size; return size;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册