Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

86 lines
2.6 KiB

  1. /******************************Module*Header*******************************\
  2. * Module Name: srcalign.cxx
  3. *
  4. * This contains code that can be used to do source aligned reads. This
  5. * will improve performance when reading from non cached video memory resisdent
  6. * surfaces.
  7. *
  8. * Created: 04-May-1999
  9. * Author: Pravin Santiago pravins.
  10. *
  11. * Copyright (c) 1999 Microsoft Corporation
  12. *
  13. \**************************************************************************/
  14. #include "precomp.hxx"
  15. void vSrcAlignCopyMemory(PBYTE pjDst, PBYTE pjSrc, ULONG c)
  16. {
  17. // If overlap use RtlMoveMemory()
  18. if(pjSrc < pjDst && pjDst < pjSrc + c)
  19. {
  20. RtlMoveMemory((PVOID)pjDst,(PVOID)pjSrc,c);
  21. }
  22. else
  23. {
  24. while(c != 0)
  25. {
  26. // Do correctly aligned data reads from the source while
  27. // maximizing the number of QuadWord reads.
  28. if((((ULONG_PTR)pjSrc & 7) == 0) && (c >= 8)) // 8 byte aligned
  29. {
  30. // Maximize QuadWord reads of pjSrc.
  31. #if i386
  32. if(HasMMX)
  33. {
  34. __asm
  35. {
  36. mov ecx, c
  37. mov esi, pjSrc
  38. mov edi, pjDst
  39. nextf:
  40. movq mm0, [esi]
  41. movq [edi], mm0
  42. add esi, 8
  43. add edi, 8
  44. sub ecx, 8
  45. cmp ecx, 8
  46. jae nextf
  47. mov pjSrc, esi
  48. mov pjDst, edi
  49. mov c, ecx
  50. }
  51. }
  52. else
  53. #endif
  54. {
  55. do
  56. {
  57. *UNALIGNED_QWORD_POINTER(pjDst) = *(volatile ULONGLONG *)pjSrc;
  58. pjDst += 8; pjSrc += 8;
  59. c -= 8;
  60. } while(c >= 8);
  61. }
  62. }
  63. else if((((ULONG_PTR)pjSrc & 3) == 0) && (c >= 4))// 4 byte aligned
  64. {
  65. *UNALIGNED_DWORD_POINTER(pjDst) = *(volatile ULONG *)pjSrc;
  66. pjDst += 4; pjSrc += 4;
  67. c -= 4;
  68. }
  69. else if((((ULONG_PTR)pjSrc & 1) == 0) && (c >= 2))// 2 byte aligned
  70. {
  71. *UNALIGNED_WORD_POINTER(pjDst) = *(volatile USHORT *)pjSrc;
  72. pjDst += 2; pjSrc += 2;
  73. c -= 2;
  74. }
  75. else // odd byte aligned
  76. {
  77. *pjDst++ = *pjSrc++;
  78. c--;
  79. }
  80. }
  81. }
  82. }