]> git.baikalelectronics.ru Git - kernel.git/commitdiff
riscv: Less inefficient gcc tishift helpers (and export their symbols)
authorOlof Johansson <olof@lixom.net>
Tue, 17 Dec 2019 04:06:31 +0000 (20:06 -0800)
committerPaul Walmsley <paul.walmsley@sifive.com>
Sun, 19 Jan 2020 03:13:41 +0000 (19:13 -0800)
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>
arch/riscv/include/asm/asm-prototypes.h
arch/riscv/lib/tishift.S

index dd62b691c443d821163e7460c4376b482c30396f..27e005fca5849e059bc920d937250bdb251ff35c 100644 (file)
@@ -5,4 +5,8 @@
 #include <linux/ftrace.h>
 #include <asm-generic/asm-prototypes.h>
 
+long long __lshrti3(long long a, int b);
+long long __ashrti3(long long a, int b);
+long long __ashlti3(long long a, int b);
+
 #endif /* _ASM_RISCV_PROTOTYPES_H */
index 15f9d54c7db63859de60f86ced505165aa7a84cb..ef90075c4b0a9c153c02cdfc0d0fbdc98e151134 100644 (file)
@@ -4,34 +4,73 @@
  */
 
 #include <linux/linkage.h>
+#include <asm-generic/export.h>
 
-ENTRY(__lshrti3)
+SYM_FUNC_START(__lshrti3)
        beqz    a2, .L1
        li      a5,64
        sub     a5,a5,a2
-       addi    sp,sp,-16
        sext.w  a4,a5
        blez    a5, .L2
        sext.w  a2,a2
-       sll     a4,a1,a4
        srl     a0,a0,a2
-       srl     a1,a1,a2
+       sll     a4,a1,a4
+       srl     a2,a1,a2
        or      a0,a0,a4
-       sd      a1,8(sp)
-       sd      a0,0(sp)
-       ld      a0,0(sp)
-       ld      a1,8(sp)
-       addi    sp,sp,16
-       ret
+       mv      a1,a2
 .L1:
        ret
 .L2:
-       negw    a4,a4
-       srl     a1,a1,a4
-       sd      a1,0(sp)
-       sd      zero,8(sp)
-       ld      a0,0(sp)
-       ld      a1,8(sp)
-       addi    sp,sp,16
+       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
-ENDPROC(__lshrti3)
+SYM_FUNC_END(__ashlti3)
+EXPORT_SYMBOL(__ashlti3)