diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/AArch64/memcpy.S b/ArmPkg/Library/CompilerIntrinsicsLib/AArch64/memcpy.S
deleted file mode 100644
index 4dd6cf207754..000000000000
--- a/ArmPkg/Library/CompilerIntrinsicsLib/AArch64/memcpy.S
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Copyright (c) 2011 - 2013, ARM Ltd
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. The name of the company may not be used to endorse or promote
- *    products derived from this software without specific prior written
- *    permission.
- *
- * THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <AsmMacroIoLibV8.h>
-
-// Taken from Newlib BSD implementation.
-ASM_FUNC(memcpy)
-        // Copy dst to x6, so we can preserve return value.
-        mov     x6, x0
-
-        // NOTE: although size_t is unsigned, this code uses signed
-        // comparisons on x2 so relies on nb never having its top bit
-        // set. In practice this is not going to be a real problem.
-
-        // Require at least 64 bytes to be worth aligning.
-        cmp     x2, #64
-        blt     qwordcopy
-
-        // Compute offset to align destination to 16 bytes.
-        neg     x3, x0
-        and     x3, x3, 15
-
-        cbz     x3, blockcopy           // offset == 0 is likely
-
-        // We know there is at least 64 bytes to be done, so we
-        // do a 16 byte misaligned copy at first and then later do
-        // all 16-byte aligned copies.  Some bytes will be copied
-        // twice, but there's no harm in that since memcpy does not
-        // guarantee correctness on overlap.
-
-        sub     x2, x2, x3              // nb -= offset
-        ldp     x4, x5, [x1]
-        add     x1, x1, x3
-        stp     x4, x5, [x6]
-        add     x6, x6, x3
-
-        // The destination pointer is now qword (16 byte) aligned.
-        // (The src pointer might be.)
-
-blockcopy:
-        // Copy 64 bytes at a time.
-        subs    x2, x2, #64
-        blt     3f
-2:      subs    x2, x2, #64
-        ldp     x4, x5, [x1,#0]
-        ldp     x8, x9, [x1,#16]
-        ldp     x10,x11,[x1,#32]
-        ldp     x12,x13,[x1,#48]
-        add     x1, x1, #64
-        stp     x4, x5, [x6,#0]
-        stp     x8, x9, [x6,#16]
-        stp     x10,x11,[x6,#32]
-        stp     x12,x13,[x6,#48]
-        add     x6, x6, #64
-        bge     2b
-
-        // Unwind pre-decrement
-3:      add     x2, x2, #64
-
-qwordcopy:
-        // Copy 0-48 bytes, 16 bytes at a time.
-        subs    x2, x2, #16
-        blt     tailcopy
-2:      ldp     x4, x5, [x1],#16
-        subs    x2, x2, #16
-        stp     x4, x5, [x6],#16
-        bge     2b
-
-        // No need to unwind the pre-decrement, it would not change
-        // the low 4 bits of the count. But how likely is it for the
-        // byte count to be multiple of 16? Is it worth the overhead
-        // of testing for x2 == -16?
-
-tailcopy:
-        // Copy trailing 0-15 bytes.
-        tbz     x2, #3, 1f
-        ldr     x4, [x1],#8             // copy 8 bytes
-        str     x4, [x6],#8
-1:
-        tbz     x2, #2, 1f
-        ldr     w4, [x1],#4             // copy 4 bytes
-        str     w4, [x6],#4
-1:
-        tbz     x2, #1, 1f
-        ldrh    w4, [x1],#2             // copy 2 bytes
-        strh    w4, [x6],#2
-1:
-        tbz     x2, #0, return
-        ldrb    w4, [x1]                // copy 1 byte
-        strb    w4, [x6]
-
-return:
-        // This is the only return point of memcpy.
-        ret
diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/AArch64/memset.c b/ArmPkg/Library/CompilerIntrinsicsLib/AArch64/memset.c
deleted file mode 100644
index 069c932a6763..000000000000
--- a/ArmPkg/Library/CompilerIntrinsicsLib/AArch64/memset.c
+++ /dev/null
@@ -1,25 +0,0 @@
-/** @file
-
-  Copyright (c) 2014, ARM Ltd. All rights reserved.<BR>
-
-  This program and the accompanying materials
-  are licensed and made available under the terms and conditions of the BSD License
-  which accompanies this distribution.  The full text of the license may be found at
-  http://opensource.org/licenses/bsd-license.php
-
-  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#include <Base.h>
-
-void *memset(void *Destination, int Value, int Count)
-{
-  CHAR8 *Ptr = Destination;
-
-  while (Count--)
-          *Ptr++ = Value;
-
-  return Destination;
-}
diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memcpy.S b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memcpy.S
deleted file mode 100644
index b68ed8a6ea6b..000000000000
--- a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memcpy.S
+++ /dev/null
@@ -1,32 +0,0 @@
-#------------------------------------------------------------------------------
-#
-# Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
-#
-# This program and the accompanying materials
-# are licensed and made available under the terms and conditions of the BSD License
-# which accompanies this distribution.  The full text of the license may be found at
-# http://opensource.org/licenses/bsd-license.php
-#
-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-#
-#------------------------------------------------------------------------------
-
-  .text
-  .align 2
-  GCC_ASM_EXPORT(__aeabi_memcpy)
-  GCC_ASM_EXPORT(memcpy)
-
-ASM_PFX(__aeabi_memcpy):
-ASM_PFX(memcpy):
-  cmp     r2, #0
-  bxeq    lr
-  push    {lr}
-  mov     lr, r0
-L5:
-  ldrb  r3, [r1], #1  @ zero_extendqisi2
-  strb  r3, [lr], #1
-  subs r2, r2, #1
-  bne  L5
-  pop  {pc}
-
diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memcpy.asm b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memcpy.asm
deleted file mode 100644
index ae911971286a..000000000000
--- a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memcpy.asm
+++ /dev/null
@@ -1,40 +0,0 @@
-//------------------------------------------------------------------------------
-//
-// Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
-//
-// This program and the accompanying materials
-// are licensed and made available under the terms and conditions of the BSD License
-// which accompanies this distribution.  The full text of the license may be found at
-// http://opensource.org/licenses/bsd-license.php
-//
-// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-//
-//------------------------------------------------------------------------------
-
-
-
-    INCLUDE AsmMacroExport.inc
-
-;
-;VOID
-;EFIAPI
-;__aeabi_memcpy (
-; IN  VOID    *Destination,
-; IN  VOID    *Source,
-; IN  UINT32  Size
-; );
-;
- RVCT_ASM_EXPORT __aeabi_memcpy
-  cmp     r2, #0
-  bxeq    lr
-  push    {lr}
-  mov     lr, r0
-L5
-  ldrb  r3, [r1], #1
-  strb  r3, [lr], #1
-  subs r2, r2, #1
-  bne  L5
-  pop  {pc}
-
-  END
diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memcpy4.asm b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memcpy4.asm
deleted file mode 100644
index 3465e89eba34..000000000000
--- a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memcpy4.asm
+++ /dev/null
@@ -1,60 +0,0 @@
-//------------------------------------------------------------------------------
-//
-// Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
-//
-// This program and the accompanying materials
-// are licensed and made available under the terms and conditions of the BSD License
-// which accompanies this distribution.  The full text of the license may be found at
-// http://opensource.org/licenses/bsd-license.php
-//
-// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-//
-//------------------------------------------------------------------------------
-
-
-
-    INCLUDE AsmMacroExport.inc
-
-;
-;VOID
-;EFIAPI
-;__aeabi_memcpy (
-; IN  VOID    *Destination,
-; IN  VOID    *Source,
-; IN  UINT32  Size
-; );
-;
- RVCT_ASM_EXPORT __aeabi_memcpy4
-    stmdb   sp!, {r4, lr}
-    subs    r2, r2, #32     ; 0x20
-    bcc     memcpy4_label2
-memcpy4_label1
-    ldmcsia r1!, {r3, r4, ip, lr}
-    stmcsia r0!, {r3, r4, ip, lr}
-    ldmcsia r1!, {r3, r4, ip, lr}
-    stmcsia r0!, {r3, r4, ip, lr}
-    subcss  r2, r2, #32     ; 0x20
-    bcs     memcpy4_label1
-memcpy4_label2
-    movs    ip, r2, lsl #28
-    ldmcsia r1!, {r3, r4, ip, lr}
-    stmcsia r0!, {r3, r4, ip, lr}
-    ldmmiia r1!, {r3, r4}
-    stmmiia r0!, {r3, r4}
-    ldmia   sp!, {r4, lr}
-    movs    ip, r2, lsl #30
-    ldrcs   r3, [r1], #4
-    strcs   r3, [r0], #4
-    bxeq    lr
-
-_memcpy4_lastbytes_aligned
-    movs    r2, r2, lsl #31
-    ldrcsh  r3, [r1], #2
-    ldrmib  r2, [r1], #1
-    strcsh  r3, [r0], #2
-    strmib  r2, [r0], #1
-    bx      lr
-
-    END
-
diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memset.S b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memset.S
deleted file mode 100644
index 65f6289b410b..000000000000
--- a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memset.S
+++ /dev/null
@@ -1,61 +0,0 @@
-#------------------------------------------------------------------------------
-#
-# Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
-# Copyright (c) 2014, ARM Ltd. All rights reserved.<BR>
-#
-# This program and the accompanying materials
-# are licensed and made available under the terms and conditions of the BSD License
-# which accompanies this distribution.  The full text of the license may be found at
-# http://opensource.org/licenses/bsd-license.php
-#
-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-#
-#------------------------------------------------------------------------------
-
-
-  .text
-  .syntax unified
-  .align 2
-  GCC_ASM_EXPORT (memset)
-  GCC_ASM_EXPORT (__aeabi_memset)
-
-# VOID
-# EFIAPI
-# __aeabi_memset (
-#  IN  VOID    *Destination,
-#  IN  UINT32  Size
-#  IN  UINT32  Character,
-#  );
-ASM_PFX(__aeabi_memset):
-  subs  ip, r1, #0
-  bxeq  lr
-  mov   r1, r2
-  b     L10
-
-# VOID
-# EFIAPI
-# memset (
-#  IN  VOID    *Destination,
-#  IN  UINT32  Character,
-#  IN  UINT32  Size
-#  );
-  //
-  // This object may be pulled in to satisfy an undefined reference to
-  // __aeabi_memset above, but in some cases, memset() is already provided
-  // by another library (i.e., CryptoPkg/IntrinsicLib), in which case we
-  // prefer the other version. So allow this one to be overridden by
-  // giving it weak linkage.
-  //
-  .weak   memset
-ASM_PFX(memset):
-  subs ip, r2, #0
-  bxeq lr
-  @ args = 0, pretend = 0, frame = 0
-  @ frame_needed = 1, uses_anonymous_args = 0
-L10:
-  strb  r1, [r0], #1
-  subs  ip, ip, #1
-  @ While size is not 0
-  bne  L10
-  bx   lr
diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memset.asm b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memset.asm
deleted file mode 100644
index bae3c1fada11..000000000000
--- a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memset.asm
+++ /dev/null
@@ -1,50 +0,0 @@
-//------------------------------------------------------------------------------
-//
-// Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
-// Copyright (c) 2014, ARM Ltd. All rights reserved.<BR>
-//
-// This program and the accompanying materials
-// are licensed and made available under the terms and conditions of the BSD License
-// which accompanies this distribution.  The full text of the license may be found at
-// http://opensource.org/licenses/bsd-license.php
-//
-// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-//
-//------------------------------------------------------------------------------
-
-
-    EXPORT  __aeabi_memset
-    EXPORT  __aeabi_memclr
-    EXPORT  __aeabi_memclr4
-
-    AREA    Memset, CODE, READONLY
-
-; void __aeabi_memclr4(void *dest, size_t n);
-; void __aeabi_memclr(void *dest, size_t n);
-__aeabi_memclr
-__aeabi_memclr4
-  mov   r2, #0
-
-;
-;VOID
-;EFIAPI
-;__aeabi_memset (
-; IN  VOID    *Destination,
-; IN  UINT32  Size,
-; IN  UINT32  Character
-; );
-;
-__aeabi_memset
-  cmp  r1, #0
-  bxeq lr
-  ; args = 0, pretend = 0, frame = 0
-  ; frame_needed = 1, uses_anonymous_args = 0
-L10
-  strb  r2, [r0], #1
-  subs  r1, r1, #1
-  ; While size is not 0
-  bne  L10
-  bx   lr
-
-  END
diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf b/ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf
index 103f515064ba..44333141a70a 100644
--- a/ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf
+++ b/ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf
@@ -22,17 +22,14 @@ [Defines]
   VERSION_STRING                 = 1.0
   LIBRARY_CLASS                  = CompilerIntrinsicsLib
 
-[Sources.AARCH64]
-  AArch64/memcpy.S
-  AArch64/memset.c
+[Sources]
+  memcpy.c
+  memset.c
 
 [Sources.ARM]
   Arm/mullu.asm        | RVCT
   Arm/switch.asm       | RVCT
   Arm/llsr.asm         | RVCT
-  Arm/memcpy.asm       | RVCT
-  Arm/memcpy4.asm      | RVCT
-  Arm/memset.asm       | RVCT
   Arm/memmove.asm      | RVCT
   Arm/uread.asm        | RVCT
   Arm/uwrite.asm       | RVCT
@@ -58,8 +55,6 @@ [Sources.ARM]
   Arm/divsi3.S     | GCC
   Arm/lshrdi3.S    | GCC
 
-  Arm/memcpy.S     | GCC
-  Arm/memset.S     | GCC
   Arm/memmove.S    | GCC
 
 #  Arm/modsi3.c     | GCC
diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/memcpy.c b/ArmPkg/Library/CompilerIntrinsicsLib/memcpy.c
new file mode 100644
index 000000000000..62c79a6d2491
--- /dev/null
+++ b/ArmPkg/Library/CompilerIntrinsicsLib/memcpy.c
@@ -0,0 +1,43 @@
+//------------------------------------------------------------------------------
+//
+// Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>
+//
+// This program and the accompanying materials
+// are licensed and made available under the terms and conditions of the BSD License
+// which accompanies this distribution.  The full text of the license may be found at
+// http://opensource.org/licenses/bsd-license.php
+//
+// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+//
+//------------------------------------------------------------------------------
+
+typedef __SIZE_TYPE__ size_t;
+
+static __attribute__((__used__))
+void *__memcpy(void *dest, const void *src, size_t n)
+{
+  unsigned char *d = dest;
+  unsigned char const *s = src;
+
+  while (n--)
+    *d++ = *s++;
+
+  return dest;
+}
+
+__attribute__((__alias__("__memcpy")))
+void *memcpy(void *dest, const void *src, size_t n);
+
+#ifdef __arm__
+
+__attribute__((__alias__("__memcpy")))
+void __aeabi_memcpy(void *dest, const void *src, size_t n);
+
+__attribute__((__alias__("__memcpy")))
+void __aeabi_memcpy4(void *dest, const void *src, size_t n);
+
+__attribute__((__alias__("__memcpy")))
+void __aeabi_memcpy8(void *dest, const void *src, size_t n);
+
+#endif
diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/memset.c b/ArmPkg/Library/CompilerIntrinsicsLib/memset.c
new file mode 100644
index 000000000000..81505f155827
--- /dev/null
+++ b/ArmPkg/Library/CompilerIntrinsicsLib/memset.c
@@ -0,0 +1,55 @@
+//------------------------------------------------------------------------------
+//
+// Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>
+//
+// This program and the accompanying materials
+// are licensed and made available under the terms and conditions of the BSD License
+// which accompanies this distribution.  The full text of the license may be found at
+// http://opensource.org/licenses/bsd-license.php
+//
+// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+//
+//------------------------------------------------------------------------------
+
+typedef __SIZE_TYPE__ size_t;
+
+static __attribute__((__used__))
+void *__memset(void *s, int c, size_t n)
+{
+  unsigned char *d = s;
+
+  while (n--)
+    *d++ = c;
+
+  return s;
+}
+
+__attribute__((__alias__("__memset")))
+void *memset(void *dest, size_t n, int c);
+
+#ifdef __arm__
+
+void __aeabi_memset(void *dest, size_t n, int c)
+{
+  __memset(dest, c, n);
+}
+
+__attribute__((__alias__("__aeabi_memset")))
+void __aeabi_memset4(void *dest, size_t n, int c);
+
+__attribute__((__alias__("__aeabi_memset")))
+void __aeabi_memset8(void *dest, size_t n, int c);
+
+void __aeabi_memclr(void *dest, size_t n)
+{
+  __memset(dest, 0, n);
+}
+
+__attribute__((__alias__("__aeabi_memclr")))
+void __aeabi_memclr4(void *dest, size_t n);
+
+__attribute__((__alias__("__aeabi_memclr")))
+void __aeabi_memclr8(void *dest, size_t n);
+
+#endif
