]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdePkg/Library/BaseMemoryLib/SetMem.c
MdePkg/BaseMemoryLib: Fix VS2015 build error
[mirror_edk2.git] / MdePkg / Library / BaseMemoryLib / SetMem.c
index 5e74085c56f01860ff9b45457355e14a3f52b5cc..b6fb811c388a0e1115ae2ef080d24b15f9199712 100644 (file)
@@ -5,6 +5,9 @@
   is desired.\r
 \r
   Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2012 - 2013, ARM Ltd. All rights reserved.<BR>\r
+  Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>\r
+\r
   This program and the accompanying materials\r
   are licensed and made available under the terms and conditions of the BSD License\r
   which accompanies this distribution.  The full text of the license may be found at\r
@@ -43,11 +46,42 @@ InternalMemSetMem (
   // volatile to prevent the optimizer from replacing this function with\r
   // the intrinsic memset()\r
   //\r
-  volatile UINT8                    *Pointer;\r
+  volatile UINT8                    *Pointer8;\r
+  volatile UINT32                   *Pointer32;\r
+  volatile UINT64                   *Pointer64;\r
+  UINT32                            Value32;\r
+  UINT64                            Value64;\r
+\r
+  if ((((UINTN)Buffer & 0x7) == 0) && (Length >= 8)) {\r
+    // Generate the 64bit value\r
+    Value32 = (Value << 24) | (Value << 16) | (Value << 8) | Value;\r
+    Value64 = LShiftU64 (Value32, 32) | Value32;\r
+\r
+    Pointer64 = (UINT64*)Buffer;\r
+    while (Length >= 8) {\r
+      *(Pointer64++) = Value64;\r
+      Length -= 8;\r
+    }\r
 \r
-  Pointer = (UINT8*)Buffer;\r
+    // Finish with bytes if needed\r
+    Pointer8 = (UINT8*)Pointer64;\r
+  } else if ((((UINTN)Buffer & 0x3) == 0) && (Length >= 4)) {\r
+    // Generate the 32bit value\r
+    Value32 = (Value << 24) | (Value << 16) | (Value << 8) | Value;\r
+\r
+    Pointer32 = (UINT32*)Buffer;\r
+    while (Length >= 4) {\r
+      *(Pointer32++) = Value32;\r
+      Length -= 4;\r
+    }\r
+\r
+    // Finish with bytes if needed\r
+    Pointer8 = (UINT8*)Pointer32;\r
+  } else {\r
+    Pointer8 = (UINT8*)Buffer;\r
+  }\r
   while (Length-- > 0) {\r
-    *(Pointer++) = Value;\r
+    *(Pointer8++) = Value;\r
   }\r
   return Buffer;\r
 }\r