123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- /* Written 2003 by Andi Kleen, based on a kernel by Evandro Menezes */
-
- /* Don't use streaming store because it's better when the target
- ends up in cache. */
-
- /* Could vary the prefetch distance based on SMP/UP */
- .globl copy_page
- .p2align 4
- copy_page:
- subq $3*8,%rsp
- movq %rbx,(%rsp)
- movq %r12,1*8(%rsp)
- movq %r13,2*8(%rsp)
- movl $(4096/64)-5,%ecx
- .p2align 4
- .Loop64:
- dec %rcx
- movq (%rsi), %rax
- movq 8 (%rsi), %rbx
- movq 16 (%rsi), %rdx
- movq 24 (%rsi), %r8
- movq 32 (%rsi), %r9
- movq 40 (%rsi), %r10
- movq 48 (%rsi), %r11
- movq 56 (%rsi), %r12
- prefetcht0 5*64(%rsi)
- movq %rax, (%rdi)
- movq %rbx, 8 (%rdi)
- movq %rdx, 16 (%rdi)
- movq %r8, 24 (%rdi)
- movq %r9, 32 (%rdi)
- movq %r10, 40 (%rdi)
- movq %r11, 48 (%rdi)
- movq %r12, 56 (%rdi)
- leaq 64 (%rsi), %rsi
- leaq 64 (%rdi), %rdi
- jnz .Loop64
- movl $5,%ecx
- .p2align 4
- .Loop2:
- decl %ecx
- movq (%rsi), %rax
- movq 8 (%rsi), %rbx
- movq 16 (%rsi), %rdx
- movq 24 (%rsi), %r8
- movq 32 (%rsi), %r9
- movq 40 (%rsi), %r10
- movq 48 (%rsi), %r11
- movq 56 (%rsi), %r12
- movq %rax, (%rdi)
- movq %rbx, 8 (%rdi)
- movq %rdx, 16 (%rdi)
- movq %r8, 24 (%rdi)
- movq %r9, 32 (%rdi)
- movq %r10, 40 (%rdi)
- movq %r11, 48 (%rdi)
- movq %r12, 56 (%rdi)
- leaq 64(%rdi),%rdi
- leaq 64(%rsi),%rsi
- jnz .Loop2
- movq (%rsp),%rbx
- movq 1*8(%rsp),%r12
- movq 2*8(%rsp),%r13
- addq $3*8,%rsp
- ret
- /* Some CPUs run faster using the string copy instructions.
- It is also a lot simpler. Use this when possible */
- #include <asm/cpufeature.h>
- .section .altinstructions,"a"
- .align 8
- .quad copy_page
- .quad copy_page_c
- .byte X86_FEATURE_REP_GOOD
- .byte copy_page_c_end-copy_page_c
- .byte copy_page_c_end-copy_page_c
- .previous
- .section .altinstr_replacement,"ax"
- copy_page_c:
- movl $4096/8,%ecx
- rep
- movsq
- ret
- copy_page_c_end:
- .previous
|