diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/AArch64/ashlti3.S b/ArmPkg/Library/CompilerIntrinsicsLib/AArch64/ashlti3.S new file mode 100644 index 0000000000..79a7b3514c --- /dev/null +++ b/ArmPkg/Library/CompilerIntrinsicsLib/AArch64/ashlti3.S @@ -0,0 +1,33 @@ +#------------------------------------------------------------------------------ +# +# Copyright (c) 2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +#------------------------------------------------------------------------------ + +#include + +ASM_FUNC(__ashlti3) + # return if shift is 0 + cbz x2, 1f + + mov x3, #64 + sub x3, x3, x2 + cmp x3, #0 + b.le 2f + + # shift is <= 64 bits + lsr x3, x0, x3 + lsl x1, x1, x2 + orr x1, x1, x3 + lsl x0, x0, x2 +1: + ret + +2: + # shift is > 64 + neg w3, w3 + lsl x1, x0, x3 + mov x0, #0 + ret diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf b/ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf index 7e22e6f67b..054e681307 100644 --- a/ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf +++ b/ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf @@ -66,6 +66,7 @@ [Sources.AARCH64] AArch64/Atomics.S | GCC + AArch64/ashlti3.S | GCC [Packages] MdePkg/MdePkg.dec