[edk2] [PATCH v5 4/6] ArmPkg/Library/CompilerIntrinsicsLib: Enable VS2017/ARM builds

Pete Batard posted 6 patches 8 years ago
[edk2] [PATCH v5 4/6] ArmPkg/Library/CompilerIntrinsicsLib: Enable VS2017/ARM builds
Posted by Pete Batard 8 years ago
Introduce CRT assembly replacements for __rt_sdiv, __rt_udiv,
__rt_udiv64, __rt_sdiv64, __rt_srsh (by reusing the RVCT code)
as well as memcpy and memset.
For MSFT compatibility, some of the code needs to be explicitly
forced to ARM, and the /oldit assembly flag needs to be added.
Also, while RVCT_ASM_EXPORT macro invocations have been removed,
the replacement code is designed to be as close as possible to
the one that would have been generated if using the macros.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Pete Batard <pete@akeo.ie>
---
 ArmPkg/Library/CompilerIntrinsicsLib/Arm/div.asm               | 43 +++++++++++++++++---
 ArmPkg/Library/CompilerIntrinsicsLib/Arm/ldivmod.asm           | 40 +++++++++++++-----
 ArmPkg/Library/CompilerIntrinsicsLib/Arm/llsr.asm              | 22 +++++-----
 ArmPkg/Library/CompilerIntrinsicsLib/Arm/uldiv.asm             | 29 +++++++++++--
 ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf | 16 +++++++-
 ArmPkg/Library/CompilerIntrinsicsLib/memcpy_ms.c               | 34 ++++++++++++++++
 ArmPkg/Library/CompilerIntrinsicsLib/memset_ms.c               | 33 +++++++++++++++
 7 files changed, 185 insertions(+), 32 deletions(-)

diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/div.asm b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/div.asm
index b539e516892d..f9e0107395f2 100644
--- a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/div.asm
+++ b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/div.asm
@@ -1,6 +1,7 @@
 //------------------------------------------------------------------------------
 //
 // Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
+// Copyright (c) 2018, Pete Batard. All rights reserved.<BR>
 //
 // This program and the accompanying materials
 // are licensed and made available under the terms and conditions of the BSD License
@@ -17,18 +18,19 @@
     EXPORT  __aeabi_uidivmod
     EXPORT  __aeabi_idiv
     EXPORT  __aeabi_idivmod
+    EXPORT  __rt_udiv
+    EXPORT  __rt_sdiv
 
     AREA  Math, CODE, READONLY
 
 ;
 ;UINT32
 ;EFIAPI
-;__aeabi_uidivmode (
-;  IN UINT32  Dividen
+;__aeabi_uidivmod (
+;  IN UINT32  Dividend
 ;  IN UINT32  Divisor
 ;  );
 ;
-
 __aeabi_uidiv
 __aeabi_uidivmod
     RSBS    r12, r1, r0, LSR #4
@@ -40,10 +42,40 @@ __aeabi_uidivmod
     B       __arm_div_large
 
 ;
+;UINT64
+;EFIAPI
+;__rt_udiv (
+;  IN UINT32  Divisor,
+;  IN UINT32  Dividend
+;  );
+;
+__rt_udiv
+    ; Swap R0 and R1
+    MOV     r12, r0
+    MOV     r0, r1
+    MOV     r1, r12
+    B       __aeabi_uidivmod
+
+;
+;UINT64
+;EFIAPI
+;__rt_sdiv (
+;  IN INT32  Divisor,
+;  IN INT32  Dividend
+;  );
+;
+__rt_sdiv
+    ; Swap R0 and R1
+    MOV     r12, r0
+    MOV     r0, r1
+    MOV     r1, r12
+    B       __aeabi_idivmod
+
+;
 ;INT32
 ;EFIAPI
-;__aeabi_idivmode (
-;  IN INT32  Dividen
+;__aeabi_idivmod (
+;  IN INT32  Dividend
 ;  IN INT32  Divisor
 ;  );
 ;
@@ -152,4 +184,3 @@ __aeabi_idiv0
     BX      r14
 
     END
-
diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/ldivmod.asm b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/ldivmod.asm
index c71bd59e4520..115a2b9c0e3c 100644
--- a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/ldivmod.asm
+++ b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/ldivmod.asm
@@ -1,6 +1,7 @@
 //------------------------------------------------------------------------------
 //
 // Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
+// Copyright (c) 2018, Pete Batard. All rights reserved.<BR>
 //
 // This program and the accompanying materials
 // are licensed and made available under the terms and conditions of the BSD License
@@ -13,20 +14,41 @@
 //------------------------------------------------------------------------------
 
 
-    EXTERN  __aeabi_uldivmod
+    IMPORT  __aeabi_uldivmod
+    EXPORT  __aeabi_ldivmod
+    EXPORT  __rt_sdiv64
 
-    INCLUDE AsmMacroExport.inc
+    AREA  s___aeabi_ldivmod, CODE, READONLY, ARM
+
+    ARM
 
 ;
-;UINT32
+;INT64
 ;EFIAPI
-;__aeabi_uidivmode (
-;  IN UINT32  Dividen
-;  IN UINT32  Divisor
+;__rt_sdiv64 (
+;  IN  INT64  Divisor
+;  IN  INT64  Dividend
 ;  );
 ;
+__rt_sdiv64
+    ; Swap r0-r1 and r2-r3
+    MOV     r12, r0
+    MOV     r0, r2
+    MOV     r2, r12
+    MOV     r12, r1
+    MOV     r1, r3
+    MOV     r3, r12
+    B       __aeabi_ldivmod
 
- RVCT_ASM_EXPORT __aeabi_ldivmod
+;
+;INT64
+;EFIAPI
+;__aeabi_ldivmod (
+;  IN  INT64  Dividend
+;  IN  INT64  Divisor
+;  );
+;
+__aeabi_ldivmod
     PUSH     {r4,lr}
     ASRS     r4,r1,#1
     EOR      r4,r4,r3,LSR #1
@@ -39,7 +61,7 @@ L_Test1
     RSBS     r2,r2,#0
     RSC      r3,r3,#0
 L_Test2
-    BL       __aeabi_uldivmod  ;
+    BL       __aeabi_uldivmod
     TST      r4,#0x40000000
     BEQ      L_Test3
     RSBS     r0,r0,#0
@@ -53,5 +75,3 @@ L_Exit
     POP      {r4,pc}
 
     END
-
-
diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/llsr.asm b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/llsr.asm
index 881db106d9d7..abfd7ab64a79 100644
--- a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/llsr.asm
+++ b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/llsr.asm
@@ -1,6 +1,7 @@
 //------------------------------------------------------------------------------
 //
 // Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
+// Copyright (c) 2018, Pete Batard. All rights reserved.<BR>
 //
 // This program and the accompanying materials
 // are licensed and made available under the terms and conditions of the BSD License
@@ -12,32 +13,33 @@
 //
 //------------------------------------------------------------------------------
 
+  EXPORT  __aeabi_llsr
+  EXPORT  __rt_srsh
 
+  AREA  s___aeabi_llsr, CODE, READONLY, ARM
 
-    INCLUDE AsmMacroExport.inc
+  ARM
 
 ;
 ;VOID
 ;EFIAPI
 ;__aeabi_llsr (
-; IN  VOID    *Destination,
-; IN  VOID    *Source,
-; IN  UINT32  Size
-; );
+;  IN  UINT64  Value,
+;  IN  UINT32  Shift
+;)
 ;
- RVCT_ASM_EXPORT __aeabi_llsr
+__aeabi_llsr
+__rt_srsh
     SUBS     r3,r2,#0x20
-    BPL      {pc} + 0x18  ; 0x1c
+    BPL      __aeabi_llsr_label1
     RSB      r3,r2,#0x20
     LSR      r0,r0,r2
     ORR      r0,r0,r1,LSL r3
     LSR      r1,r1,r2
     BX       lr
+__aeabi_llsr_label1
     LSR      r0,r1,r3
     MOV      r1,#0
     BX       lr
 
     END
-
-
-
diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/uldiv.asm b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/uldiv.asm
index 6b6184ebd3fc..aedaac8c6c7f 100644
--- a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/uldiv.asm
+++ b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/uldiv.asm
@@ -1,6 +1,7 @@
 //------------------------------------------------------------------------------
 //
 // Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
+// Copyright (c) 2018, Pete Batard. All rights reserved.<BR>
 //
 // This program and the accompanying materials
 // are licensed and made available under the terms and conditions of the BSD License
@@ -13,9 +14,30 @@
 //------------------------------------------------------------------------------
 
 
+    EXPORT  __aeabi_uldivmod
+    EXPORT  __rt_udiv64
 
+    AREA  s___aeabi_uldivmod, CODE, READONLY, ARM
 
-    INCLUDE AsmMacroExport.inc
+    ARM
+
+;
+;UINT64
+;EFIAPI
+;__rt_udiv64 (
+;  IN  UINT64   Divisor
+;  IN  UINT64   Dividend
+;  )
+;
+__rt_udiv64
+  ; Swap r0-r1 and r2-r3
+  mov     r12, r0
+  mov     r0, r2
+  mov     r2, r12
+  mov     r12, r1
+  mov     r1, r3
+  mov     r3, r12
+  b       __aeabi_uldivmod
 
 ;
 ;UINT64
@@ -25,7 +47,7 @@
 ;  IN  UINT64   Divisor
 ;  )
 ;
- RVCT_ASM_EXPORT __aeabi_uldivmod
+__aeabi_uldivmod
   stmdb   sp!, {r4, r5, r6, lr}
   mov     r4, r1
   mov     r5, r0
@@ -261,7 +283,6 @@ _ll_div0
   b       __aeabi_ldiv0
 
 __aeabi_ldiv0
-  BX        r14
+  bx        r14
 
   END
-
diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf b/ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf
index 44333141a70a..14e88da7ce06 100644
--- a/ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf
+++ b/ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf
@@ -23,8 +23,12 @@ [Defines]
   LIBRARY_CLASS                  = CompilerIntrinsicsLib
 
 [Sources]
-  memcpy.c
-  memset.c
+  memcpy.c             | RVCT
+  memcpy.c             | GCC
+  memcpy_ms.c          | MSFT
+  memset.c             | RVCT
+  memset.c             | GCC
+  memset_ms.c          | MSFT
 
 [Sources.ARM]
   Arm/mullu.asm        | RVCT
@@ -94,6 +98,10 @@ [Sources.ARM]
   Arm/llsr.S       | GCC
   Arm/llsl.S       | GCC
 
+  Arm/div.asm      | MSFT
+  Arm/uldiv.asm    | MSFT
+  Arm/ldivmod.asm  | MSFT
+  Arm/llsr.asm     | MSFT
 
 [Packages]
   MdePkg/MdePkg.dec
@@ -101,3 +109,7 @@ [Packages]
 
 [LibraryClasses]
 
+[BuildOptions]
+  MSFT:*_*_ARM_CC_FLAGS = /GL-
+  MSFT:*_*_ARM_ASM_FLAGS = /oldit
+  MSFT:*_*_AARCH64_CC_FLAGS = /GL-
diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/memcpy_ms.c b/ArmPkg/Library/CompilerIntrinsicsLib/memcpy_ms.c
new file mode 100644
index 000000000000..90bbbb930d31
--- /dev/null
+++ b/ArmPkg/Library/CompilerIntrinsicsLib/memcpy_ms.c
@@ -0,0 +1,34 @@
+//------------------------------------------------------------------------------
+//
+// Copyright (c) 2017, Pete Batard. 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.
+//
+//------------------------------------------------------------------------------
+
+#if defined(_M_ARM64)
+typedef unsigned __int64  size_t;
+#else
+typedef unsigned __int32  size_t;
+#endif
+
+void* memcpy(void *, const void *, size_t);
+#pragma intrinsic(memcpy)
+#pragma function(memcpy)
+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;
+}
diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/memset_ms.c b/ArmPkg/Library/CompilerIntrinsicsLib/memset_ms.c
new file mode 100644
index 000000000000..64205e5d1012
--- /dev/null
+++ b/ArmPkg/Library/CompilerIntrinsicsLib/memset_ms.c
@@ -0,0 +1,33 @@
+//------------------------------------------------------------------------------
+//
+// Copyright (c) 2017, Pete Batard. 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.
+//
+//------------------------------------------------------------------------------
+
+#if defined(_M_ARM64)
+typedef unsigned __int64  size_t;
+#else
+typedef unsigned __int32  size_t;
+#endif
+
+void* memset(void *, int, size_t);
+#pragma intrinsic(memset)
+#pragma function(memset)
+void *memset(void *s, int c, size_t n)
+{
+  unsigned char *d = s;
+
+  while (n--)
+    *d++ = (unsigned char)c;
+
+  return s;
+}
-- 
2.9.3.windows.2

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel
Re: [edk2] [PATCH v5 4/6] ArmPkg/Library/CompilerIntrinsicsLib: Enable VS2017/ARM builds
Posted by Ard Biesheuvel 8 years ago
On 12 January 2018 at 13:33, Pete Batard <pete@akeo.ie> wrote:
> Introduce CRT assembly replacements for __rt_sdiv, __rt_udiv,
> __rt_udiv64, __rt_sdiv64, __rt_srsh (by reusing the RVCT code)
> as well as memcpy and memset.
> For MSFT compatibility, some of the code needs to be explicitly
> forced to ARM, and the /oldit assembly flag needs to be added.
> Also, while RVCT_ASM_EXPORT macro invocations have been removed,
> the replacement code is designed to be as close as possible to
> the one that would have been generated if using the macros.
>
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Pete Batard <pete@akeo.ie>

Reviewed-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>

> ---
>  ArmPkg/Library/CompilerIntrinsicsLib/Arm/div.asm               | 43 +++++++++++++++++---
>  ArmPkg/Library/CompilerIntrinsicsLib/Arm/ldivmod.asm           | 40 +++++++++++++-----
>  ArmPkg/Library/CompilerIntrinsicsLib/Arm/llsr.asm              | 22 +++++-----
>  ArmPkg/Library/CompilerIntrinsicsLib/Arm/uldiv.asm             | 29 +++++++++++--
>  ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf | 16 +++++++-
>  ArmPkg/Library/CompilerIntrinsicsLib/memcpy_ms.c               | 34 ++++++++++++++++
>  ArmPkg/Library/CompilerIntrinsicsLib/memset_ms.c               | 33 +++++++++++++++
>  7 files changed, 185 insertions(+), 32 deletions(-)
>
> diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/div.asm b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/div.asm
> index b539e516892d..f9e0107395f2 100644
> --- a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/div.asm
> +++ b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/div.asm
> @@ -1,6 +1,7 @@
>  //------------------------------------------------------------------------------
>  //
>  // Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
> +// Copyright (c) 2018, Pete Batard. All rights reserved.<BR>
>  //
>  // This program and the accompanying materials
>  // are licensed and made available under the terms and conditions of the BSD License
> @@ -17,18 +18,19 @@
>      EXPORT  __aeabi_uidivmod
>      EXPORT  __aeabi_idiv
>      EXPORT  __aeabi_idivmod
> +    EXPORT  __rt_udiv
> +    EXPORT  __rt_sdiv
>
>      AREA  Math, CODE, READONLY
>
>  ;
>  ;UINT32
>  ;EFIAPI
> -;__aeabi_uidivmode (
> -;  IN UINT32  Dividen
> +;__aeabi_uidivmod (
> +;  IN UINT32  Dividend
>  ;  IN UINT32  Divisor
>  ;  );
>  ;
> -
>  __aeabi_uidiv
>  __aeabi_uidivmod
>      RSBS    r12, r1, r0, LSR #4
> @@ -40,10 +42,40 @@ __aeabi_uidivmod
>      B       __arm_div_large
>
>  ;
> +;UINT64
> +;EFIAPI
> +;__rt_udiv (
> +;  IN UINT32  Divisor,
> +;  IN UINT32  Dividend
> +;  );
> +;
> +__rt_udiv
> +    ; Swap R0 and R1
> +    MOV     r12, r0
> +    MOV     r0, r1
> +    MOV     r1, r12
> +    B       __aeabi_uidivmod
> +
> +;
> +;UINT64
> +;EFIAPI
> +;__rt_sdiv (
> +;  IN INT32  Divisor,
> +;  IN INT32  Dividend
> +;  );
> +;
> +__rt_sdiv
> +    ; Swap R0 and R1
> +    MOV     r12, r0
> +    MOV     r0, r1
> +    MOV     r1, r12
> +    B       __aeabi_idivmod
> +
> +;
>  ;INT32
>  ;EFIAPI
> -;__aeabi_idivmode (
> -;  IN INT32  Dividen
> +;__aeabi_idivmod (
> +;  IN INT32  Dividend
>  ;  IN INT32  Divisor
>  ;  );
>  ;
> @@ -152,4 +184,3 @@ __aeabi_idiv0
>      BX      r14
>
>      END
> -
> diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/ldivmod.asm b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/ldivmod.asm
> index c71bd59e4520..115a2b9c0e3c 100644
> --- a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/ldivmod.asm
> +++ b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/ldivmod.asm
> @@ -1,6 +1,7 @@
>  //------------------------------------------------------------------------------
>  //
>  // Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
> +// Copyright (c) 2018, Pete Batard. All rights reserved.<BR>
>  //
>  // This program and the accompanying materials
>  // are licensed and made available under the terms and conditions of the BSD License
> @@ -13,20 +14,41 @@
>  //------------------------------------------------------------------------------
>
>
> -    EXTERN  __aeabi_uldivmod
> +    IMPORT  __aeabi_uldivmod
> +    EXPORT  __aeabi_ldivmod
> +    EXPORT  __rt_sdiv64
>
> -    INCLUDE AsmMacroExport.inc
> +    AREA  s___aeabi_ldivmod, CODE, READONLY, ARM
> +
> +    ARM
>
>  ;
> -;UINT32
> +;INT64
>  ;EFIAPI
> -;__aeabi_uidivmode (
> -;  IN UINT32  Dividen
> -;  IN UINT32  Divisor
> +;__rt_sdiv64 (
> +;  IN  INT64  Divisor
> +;  IN  INT64  Dividend
>  ;  );
>  ;
> +__rt_sdiv64
> +    ; Swap r0-r1 and r2-r3
> +    MOV     r12, r0
> +    MOV     r0, r2
> +    MOV     r2, r12
> +    MOV     r12, r1
> +    MOV     r1, r3
> +    MOV     r3, r12
> +    B       __aeabi_ldivmod
>
> - RVCT_ASM_EXPORT __aeabi_ldivmod
> +;
> +;INT64
> +;EFIAPI
> +;__aeabi_ldivmod (
> +;  IN  INT64  Dividend
> +;  IN  INT64  Divisor
> +;  );
> +;
> +__aeabi_ldivmod
>      PUSH     {r4,lr}
>      ASRS     r4,r1,#1
>      EOR      r4,r4,r3,LSR #1
> @@ -39,7 +61,7 @@ L_Test1
>      RSBS     r2,r2,#0
>      RSC      r3,r3,#0
>  L_Test2
> -    BL       __aeabi_uldivmod  ;
> +    BL       __aeabi_uldivmod
>      TST      r4,#0x40000000
>      BEQ      L_Test3
>      RSBS     r0,r0,#0
> @@ -53,5 +75,3 @@ L_Exit
>      POP      {r4,pc}
>
>      END
> -
> -
> diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/llsr.asm b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/llsr.asm
> index 881db106d9d7..abfd7ab64a79 100644
> --- a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/llsr.asm
> +++ b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/llsr.asm
> @@ -1,6 +1,7 @@
>  //------------------------------------------------------------------------------
>  //
>  // Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
> +// Copyright (c) 2018, Pete Batard. All rights reserved.<BR>
>  //
>  // This program and the accompanying materials
>  // are licensed and made available under the terms and conditions of the BSD License
> @@ -12,32 +13,33 @@
>  //
>  //------------------------------------------------------------------------------
>
> +  EXPORT  __aeabi_llsr
> +  EXPORT  __rt_srsh
>
> +  AREA  s___aeabi_llsr, CODE, READONLY, ARM
>
> -    INCLUDE AsmMacroExport.inc
> +  ARM
>
>  ;
>  ;VOID
>  ;EFIAPI
>  ;__aeabi_llsr (
> -; IN  VOID    *Destination,
> -; IN  VOID    *Source,
> -; IN  UINT32  Size
> -; );
> +;  IN  UINT64  Value,
> +;  IN  UINT32  Shift
> +;)
>  ;
> - RVCT_ASM_EXPORT __aeabi_llsr
> +__aeabi_llsr
> +__rt_srsh
>      SUBS     r3,r2,#0x20
> -    BPL      {pc} + 0x18  ; 0x1c
> +    BPL      __aeabi_llsr_label1
>      RSB      r3,r2,#0x20
>      LSR      r0,r0,r2
>      ORR      r0,r0,r1,LSL r3
>      LSR      r1,r1,r2
>      BX       lr
> +__aeabi_llsr_label1
>      LSR      r0,r1,r3
>      MOV      r1,#0
>      BX       lr
>
>      END
> -
> -
> -
> diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/uldiv.asm b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/uldiv.asm
> index 6b6184ebd3fc..aedaac8c6c7f 100644
> --- a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/uldiv.asm
> +++ b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/uldiv.asm
> @@ -1,6 +1,7 @@
>  //------------------------------------------------------------------------------
>  //
>  // Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
> +// Copyright (c) 2018, Pete Batard. All rights reserved.<BR>
>  //
>  // This program and the accompanying materials
>  // are licensed and made available under the terms and conditions of the BSD License
> @@ -13,9 +14,30 @@
>  //------------------------------------------------------------------------------
>
>
> +    EXPORT  __aeabi_uldivmod
> +    EXPORT  __rt_udiv64
>
> +    AREA  s___aeabi_uldivmod, CODE, READONLY, ARM
>
> -    INCLUDE AsmMacroExport.inc
> +    ARM
> +
> +;
> +;UINT64
> +;EFIAPI
> +;__rt_udiv64 (
> +;  IN  UINT64   Divisor
> +;  IN  UINT64   Dividend
> +;  )
> +;
> +__rt_udiv64
> +  ; Swap r0-r1 and r2-r3
> +  mov     r12, r0
> +  mov     r0, r2
> +  mov     r2, r12
> +  mov     r12, r1
> +  mov     r1, r3
> +  mov     r3, r12
> +  b       __aeabi_uldivmod
>
>  ;
>  ;UINT64
> @@ -25,7 +47,7 @@
>  ;  IN  UINT64   Divisor
>  ;  )
>  ;
> - RVCT_ASM_EXPORT __aeabi_uldivmod
> +__aeabi_uldivmod
>    stmdb   sp!, {r4, r5, r6, lr}
>    mov     r4, r1
>    mov     r5, r0
> @@ -261,7 +283,6 @@ _ll_div0
>    b       __aeabi_ldiv0
>
>  __aeabi_ldiv0
> -  BX        r14
> +  bx        r14
>
>    END
> -
> diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf b/ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf
> index 44333141a70a..14e88da7ce06 100644
> --- a/ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf
> +++ b/ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf
> @@ -23,8 +23,12 @@ [Defines]
>    LIBRARY_CLASS                  = CompilerIntrinsicsLib
>
>  [Sources]
> -  memcpy.c
> -  memset.c
> +  memcpy.c             | RVCT
> +  memcpy.c             | GCC
> +  memcpy_ms.c          | MSFT
> +  memset.c             | RVCT
> +  memset.c             | GCC
> +  memset_ms.c          | MSFT
>
>  [Sources.ARM]
>    Arm/mullu.asm        | RVCT
> @@ -94,6 +98,10 @@ [Sources.ARM]
>    Arm/llsr.S       | GCC
>    Arm/llsl.S       | GCC
>
> +  Arm/div.asm      | MSFT
> +  Arm/uldiv.asm    | MSFT
> +  Arm/ldivmod.asm  | MSFT
> +  Arm/llsr.asm     | MSFT
>
>  [Packages]
>    MdePkg/MdePkg.dec
> @@ -101,3 +109,7 @@ [Packages]
>
>  [LibraryClasses]
>
> +[BuildOptions]
> +  MSFT:*_*_ARM_CC_FLAGS = /GL-
> +  MSFT:*_*_ARM_ASM_FLAGS = /oldit
> +  MSFT:*_*_AARCH64_CC_FLAGS = /GL-
> diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/memcpy_ms.c b/ArmPkg/Library/CompilerIntrinsicsLib/memcpy_ms.c
> new file mode 100644
> index 000000000000..90bbbb930d31
> --- /dev/null
> +++ b/ArmPkg/Library/CompilerIntrinsicsLib/memcpy_ms.c
> @@ -0,0 +1,34 @@
> +//------------------------------------------------------------------------------
> +//
> +// Copyright (c) 2017, Pete Batard. 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.
> +//
> +//------------------------------------------------------------------------------
> +
> +#if defined(_M_ARM64)
> +typedef unsigned __int64  size_t;
> +#else
> +typedef unsigned __int32  size_t;
> +#endif
> +
> +void* memcpy(void *, const void *, size_t);
> +#pragma intrinsic(memcpy)
> +#pragma function(memcpy)
> +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;
> +}
> diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/memset_ms.c b/ArmPkg/Library/CompilerIntrinsicsLib/memset_ms.c
> new file mode 100644
> index 000000000000..64205e5d1012
> --- /dev/null
> +++ b/ArmPkg/Library/CompilerIntrinsicsLib/memset_ms.c
> @@ -0,0 +1,33 @@
> +//------------------------------------------------------------------------------
> +//
> +// Copyright (c) 2017, Pete Batard. 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.
> +//
> +//------------------------------------------------------------------------------
> +
> +#if defined(_M_ARM64)
> +typedef unsigned __int64  size_t;
> +#else
> +typedef unsigned __int32  size_t;
> +#endif
> +
> +void* memset(void *, int, size_t);
> +#pragma intrinsic(memset)
> +#pragma function(memset)
> +void *memset(void *s, int c, size_t n)
> +{
> +  unsigned char *d = s;
> +
> +  while (n--)
> +    *d++ = (unsigned char)c;
> +
> +  return s;
> +}
> --
> 2.9.3.windows.2
>
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel