- Implement RtlPrefectMemoryNonTemporal. Patch by Patrick Baggett <baggett.patrick...
[reactos.git] / reactos / lib / rtl / i386 / mem_asm.S
index 61a2912..5ad5a39 100644 (file)
@@ -1,11 +1,11 @@
 /* \r
  * COPYRIGHT:       See COPYING in the top level directory\r
  * PROJECT:         ReactOS kernel\r
- * FILE:  mem.asm\r
+ * FILE:            mem_asm.S\r
  * PURPOSE:         Memory functions\r
- * PROGRAMMER:      Magnus Olsen (magnusolsen@greatlord.com)\r
- * UPDATE HISTORY:\r
- *        Created 27/07/2005\r
+ * PROGRAMMERS:     Patrick Baggett (baggett.patrick@gmail.com)\r
+ *                  Alex Ionescu (alex@relsoft.net)\r
+ *                  Magnus Olsen (magnusolsen@greatlord.com)\r
  */\r
 \r
 .intel_syntax noprefix\r
@@ -17,6 +17,7 @@
 .globl  _RtlFillMemory@12         // [4]  (no bug)\r
 .globl  _RtlCompareMemoryUlong@12 // [5]  (no bug)  \r
 .globl  _RtlCompareMemory@12      // [4]  (no bug)\r
+.globl  @RtlPrefetchMemoryNonTemporal@8\r
 \r
 /* FUNCTIONS ***************************************************************/\r
 \r
@@ -145,3 +146,18 @@ _RtlCompareMemory@12:
      pop edi   \r
 3:       \r
      ret 12  // return count\r
+\r
+\r
+@RtlPrefetchMemoryNonTemporal@8:\r
+       ret         /* Overwritten by ntoskrnl/ke/i386/kernel.c if SSE is supported (see Ki386SetProcessorFeatures() ) */\r
+\r
+       mov eax, [_Ke386CacheGranularity]    // Get cache line size\r
+\r
+       // This is fastcall, so ecx = address, edx = size\r
+       fetch_next_line:\r
+       prefetchnta byte ptr [ecx]  // prefechnta(address)\r
+       sub edx, eax                // count = count - cache_line_size\r
+       add ecx, eax                // address = address + cache_line_size\r
+       cmp edx, 0                  // if(count) <= 0\r
+       ja fetch_next_line          //     goto fetch_next_line\r
+       ret\r