copy_page.S
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:1k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. #include <linux/linkage.h>
  2. #include <linux/config.h>
  3. #ifdef CONFIG_PREEMPT
  4. #warning "check your fpu context saving!"
  5. #endif
  6. /*
  7.  * Copy a page. 
  8.  *
  9.  * rdi destination page
  10.  * rsi source page
  11.  *
  12.  * src/dst must be aligned to 16 bytes.
  13.  * 
  14.  * Warning: in case of super lazy FP save this needs to be preempt_stop
  15.  */
  16. .globl copy_page
  17. .p2align
  18. copy_page:
  19. prefetchnta (%rsi) 
  20. prefetchnta 64(%rsi)
  21.     
  22. movq %rsp,%rax
  23. subq $16*4,%rsp
  24. andq $~15,%rsp
  25. movdqa %xmm0,(%rsp) 
  26. movdqa %xmm1,16(%rsp) 
  27. movdqa %xmm2,32(%rsp) 
  28. movdqa %xmm3,48(%rsp)
  29. movl   $(4096/128)-2,%ecx
  30. movl   $128,%edx
  31. loop:
  32. prefetchnta (%rsi) 
  33. prefetchnta 64(%rsi) 
  34. loop_no_prefetch:
  35. movdqa (%rsi),%xmm0     
  36. movdqa 16(%rsi),%xmm1
  37. movdqa 32(%rsi),%xmm2     
  38. movdqa 48(%rsi),%xmm3     
  39. movntdq %xmm0,(%rdi)  
  40. movntdq %xmm1,16(%rdi)  
  41. movntdq %xmm2,32(%rdi)  
  42. movntdq %xmm3,48(%rdi)
  43. movdqa 64(%rsi),%xmm0     
  44. movdqa 80(%rsi),%xmm1
  45. movdqa 96(%rsi),%xmm2     
  46. movdqa 112(%rsi),%xmm3     
  47. movntdq %xmm0,64(%rdi)  
  48. movntdq %xmm1,80(%rdi)  
  49. movntdq %xmm2,96(%rdi)  
  50. movntdq %xmm3,112(%rdi)
  51. addq   %rdx,%rdi
  52. addq   %rdx,%rsi
  53. decl   %ecx
  54. jns    loop
  55. cmpl   $-1,%ecx
  56. je     loop_no_prefetch
  57. sfence
  58. movdqa (%rsp),%xmm0
  59. movdqa 16(%rsp),%xmm1
  60. movdqa 32(%rsp),%xmm2
  61. movdqa 48(%rsp),%xmm3
  62. movq   %rax,%rsp
  63. ret