mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-29 07:04:10 +08:00
fc585d4a5c
The existing __lshrti3 was really inefficient, and the other two helpers are also needed to compile some modules. Add the missing versions, and export all of the symbols like arm64 already does. This code is based on the assembly generated by libgcc builds. This fixes a build break triggered by ubsan: riscv64-unknown-linux-gnu-ld: lib/ubsan.o: in function `.L2': ubsan.c:(.text.unlikely+0x38): undefined reference to `__ashlti3' riscv64-unknown-linux-gnu-ld: ubsan.c:(.text.unlikely+0x42): undefined reference to `__ashrti3' Signed-off-by: Olof Johansson <olof@lixom.net> [paul.walmsley@sifive.com: use SYM_FUNC_{START,END} instead of ENTRY/ENDPROC; note libgcc origin] Signed-off-by: Paul Walmsley <paul.walmsley@sifive.com>
77 lines
1.0 KiB
ArmAsm
77 lines
1.0 KiB
ArmAsm
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/*
|
|
* Copyright (C) 2018 Free Software Foundation, Inc.
|
|
*/
|
|
|
|
#include <linux/linkage.h>
|
|
#include <asm-generic/export.h>
|
|
|
|
SYM_FUNC_START(__lshrti3)
|
|
beqz a2, .L1
|
|
li a5,64
|
|
sub a5,a5,a2
|
|
sext.w a4,a5
|
|
blez a5, .L2
|
|
sext.w a2,a2
|
|
srl a0,a0,a2
|
|
sll a4,a1,a4
|
|
srl a2,a1,a2
|
|
or a0,a0,a4
|
|
mv a1,a2
|
|
.L1:
|
|
ret
|
|
.L2:
|
|
negw a0,a4
|
|
li a2,0
|
|
srl a0,a1,a0
|
|
mv a1,a2
|
|
ret
|
|
SYM_FUNC_END(__lshrti3)
|
|
EXPORT_SYMBOL(__lshrti3)
|
|
|
|
SYM_FUNC_START(__ashrti3)
|
|
beqz a2, .L3
|
|
li a5,64
|
|
sub a5,a5,a2
|
|
sext.w a4,a5
|
|
blez a5, .L4
|
|
sext.w a2,a2
|
|
srl a0,a0,a2
|
|
sll a4,a1,a4
|
|
sra a2,a1,a2
|
|
or a0,a0,a4
|
|
mv a1,a2
|
|
.L3:
|
|
ret
|
|
.L4:
|
|
negw a0,a4
|
|
srai a2,a1,0x3f
|
|
sra a0,a1,a0
|
|
mv a1,a2
|
|
ret
|
|
SYM_FUNC_END(__ashrti3)
|
|
EXPORT_SYMBOL(__ashrti3)
|
|
|
|
SYM_FUNC_START(__ashlti3)
|
|
beqz a2, .L5
|
|
li a5,64
|
|
sub a5,a5,a2
|
|
sext.w a4,a5
|
|
blez a5, .L6
|
|
sext.w a2,a2
|
|
sll a1,a1,a2
|
|
srl a4,a0,a4
|
|
sll a2,a0,a2
|
|
or a1,a1,a4
|
|
mv a0,a2
|
|
.L5:
|
|
ret
|
|
.L6:
|
|
negw a1,a4
|
|
li a2,0
|
|
sll a1,a0,a1
|
|
mv a0,a2
|
|
ret
|
|
SYM_FUNC_END(__ashlti3)
|
|
EXPORT_SYMBOL(__ashlti3)
|