Linux 2.6.31.6
[linux/fpc-iii.git] / arch / x86 / lib / clear_page_64.S
blobebeafcce04a9bd595b645af6941429fe8fc26c62
1 #include <linux/linkage.h>
2 #include <asm/dwarf2.h>
4 /*
5  * Zero a page.         
6  * rdi  page
7  */                     
8 ENTRY(clear_page_c)
9         CFI_STARTPROC
10         movl $4096/8,%ecx
11         xorl %eax,%eax
12         rep stosq
13         ret
14         CFI_ENDPROC
15 ENDPROC(clear_page_c)
17 ENTRY(clear_page)
18         CFI_STARTPROC
19         xorl   %eax,%eax
20         movl   $4096/64,%ecx
21         .p2align 4
22 .Lloop:
23         decl    %ecx
24 #define PUT(x) movq %rax,x*8(%rdi)
25         movq %rax,(%rdi)
26         PUT(1)
27         PUT(2)
28         PUT(3)
29         PUT(4)
30         PUT(5)
31         PUT(6)
32         PUT(7)
33         leaq    64(%rdi),%rdi
34         jnz     .Lloop
35         nop
36         ret
37         CFI_ENDPROC
38 .Lclear_page_end:
39 ENDPROC(clear_page)
41         /* Some CPUs run faster using the string instructions.
42            It is also a lot simpler. Use this when possible */
44 #include <asm/cpufeature.h>
46         .section .altinstr_replacement,"ax"
47 1:      .byte 0xeb                                      /* jmp <disp8> */
48         .byte (clear_page_c - clear_page) - (2f - 1b)   /* offset */
50         .previous
51         .section .altinstructions,"a"
52         .align 8
53         .quad clear_page
54         .quad 1b
55         .byte X86_FEATURE_REP_GOOD
56         .byte .Lclear_page_end - clear_page
57         .byte 2b - 1b
58         .previous