If that intrinsic is specific to RISCV, then should CompilerHelper.c go into a RiscV64 subdir?
Mike
Hi Mike,
While this intrinsic is not specific to RISCV, it is needed due to the GCC for RISCV64 does not generate internal implementation, requiring external link with libgcc/compile-rt. It can happen to other platforms or future GCC toolchain if it decides to move __ctzdi2 to libgcc.
If you think it is better to put it in the RiscV64 subdir for now, I am good with it.
Tuan,
> -----Original Message-----
> From: Tuan Phan <tphan@ventanamicro.com>
> Sent: Friday, December 16, 2022 10:48 AM
> Cc: devel@edk2.groups.io; sunilvl@ventanamicro.com; Kinney, Michael D <michael.d.kinney@intel.com>; Yao, Jiewen
> <jiewen.yao@intel.com>; Wang, Jian J <jian.j.wang@intel.com>; Lu, Xiaoyu1 <xiaoyu1.lu@intel.com>; Jiang, Guomin
> <guomin.jiang@intel.com>; Tuan Phan <tphan@ventanamicro.com>
> Subject: [PATCH v2] CryptoPkg/IntrinsicLib: RiscV: Provide implementation of memcpy and __ctzdi2
>
> The RiscV toolchain doesn't provide __ctzdi2 implementation when
> compiled with -nostdlib that needed by openssl library.
> So adding the implementation of __ctzdi2.
>
> Forcing to use CopyMem of EDK2 as memcpy buildin disabled for RiscV
> with -fno-builtin-memcpy flag.
>
> REF: https://bugzilla.tianocore.org/show_bug.cgi?id=4103
> Signed-off-by: Tuan Phan <tphan@ventanamicro.com>
> Acked-by: Sunil V L <sunilvl@ventanamicro.com>
> ---
> V2:
> - Add license header.
> - Add REF to the bugzilla.
>
> .../Library/IntrinsicLib/CompilerHelper.c | 42 +++++++++++++++++++
> .../Library/IntrinsicLib/IntrinsicLib.inf | 6 ++-
> 2 files changed, 47 insertions(+), 1 deletion(-)
> create mode 100644 CryptoPkg/Library/IntrinsicLib/CompilerHelper.c
>
> diff --git a/CryptoPkg/Library/IntrinsicLib/CompilerHelper.c b/CryptoPkg/Library/IntrinsicLib/CompilerHelper.c
> new file mode 100644
> index 000000000000..3844fd14ae66
> --- /dev/null
> +++ b/CryptoPkg/Library/IntrinsicLib/CompilerHelper.c
> @@ -0,0 +1,42 @@
> +/** @file
> + Implement functions that not available when compiled with -nostdlib.
> +
> + Copyright (c) 2022, Ventana Micro Systems Inc. All Rights Reserved.<BR>
> + SPDX-License-Identifier: BSD-2-Clause-Patent
> +
> +**/
> +
> +unsigned int
> +__ctzdi2 (unsigned long long x)
> +{
> + unsigned int ret = 0;
> +
> + if (!x) {
> + return 64;
> + }
> + if (!(x & 0xffffffff)) {
> + x >>= 32;
> + ret |= 32;
> + }
> + if (!(x & 0xffff)) {
> + x >>= 16;
> + ret |= 16;
> + }
> + if (!(x & 0xff)) {
> + x >>= 8;
> + ret |= 8;
> + }
> + if (!(x & 0xf)) {
> + x >>= 4;
> + ret |= 4;
> + }
> + if (!(x & 0x3)) {
> + x >>= 2;
> + ret |= 2;
> + }
> + if (!(x & 0x1)) {
> + x >>= 1;
> + ret |= 1;
> + }
> + return ret;
> +}
> diff --git a/CryptoPkg/Library/IntrinsicLib/IntrinsicLib.inf b/CryptoPkg/Library/IntrinsicLib/IntrinsicLib.inf
> index 86e74b57b109..6796b39b07cf 100644
> --- a/CryptoPkg/Library/IntrinsicLib/IntrinsicLib.inf
> +++ b/CryptoPkg/Library/IntrinsicLib/IntrinsicLib.inf
> @@ -18,7 +18,7 @@
> #
>
> # The following information is for reference only and not required by the build tools.
>
> #
>
> -# VALID_ARCHITECTURES = IA32 X64
>
> +# VALID_ARCHITECTURES = IA32 X64 RISCV64
>
> #
>
>
>
> [Sources]
>
> @@ -43,6 +43,10 @@
> [Sources.X64]
>
> CopyMem.c
>
>
>
> +[Sources.RISCV64]
>
> + CopyMem.c
>
> + CompilerHelper.c
>
> +
>
> [Packages]
>
> MdePkg/MdePkg.dec
>
>
>
> --
> 2.25.1