[RISCV-V] Provide muldi3 builtin assembly implementation
authorkamlesh kumar <kamleshbhalui@gmail.com>
Tue, 2 Jun 2020 19:48:30 +0000 (20:48 +0100)
committerLuís Marques <luismarques@lowrisc.org>
Tue, 2 Jun 2020 20:04:55 +0000 (21:04 +0100)
Provides an assembly implementation of muldi3 for RISC-V, to solve bug 43388.
Since the implementation is the same as for mulsi3, that code was moved to
`riscv/int_mul_impl.inc` and is now reused by both `mulsi3.S` and `muldi3.S`.

Differential Revision: https://reviews.llvm.org/D80465

compiler-rt/lib/builtins/riscv/int_mul_impl.inc [new file with mode: 0644]
compiler-rt/lib/builtins/riscv/muldi3.S [new file with mode: 0644]
compiler-rt/lib/builtins/riscv/mulsi3.S

diff --git a/compiler-rt/lib/builtins/riscv/int_mul_impl.inc b/compiler-rt/lib/builtins/riscv/int_mul_impl.inc
new file mode 100644 (file)
index 0000000..50951d5
--- /dev/null
@@ -0,0 +1,31 @@
+//===-- int_mul_impl.inc - Integer multiplication -------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// Helpers used by __mulsi3, __muldi3.
+//
+//===----------------------------------------------------------------------===//
+
+#if !defined(__riscv_mul)
+       .text
+       .align 2
+
+       .globl __mulxi3
+       .type  __mulxi3, @function
+__mulxi3:
+       mv     a2, a0
+       mv     a0, zero
+.L1:
+       andi   a3, a1, 1
+       beqz   a3, .L2
+       add    a0, a0, a2
+.L2:
+       srli   a1, a1, 1
+       slli   a2, a2, 1
+       bnez   a1, .L1
+       ret
+#endif
diff --git a/compiler-rt/lib/builtins/riscv/muldi3.S b/compiler-rt/lib/builtins/riscv/muldi3.S
new file mode 100644 (file)
index 0000000..9e292e8
--- /dev/null
@@ -0,0 +1,11 @@
+//===--- muldi3.S - Integer multiplication routines -----------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+#if __riscv_xlen == 64
+#define __mulxi3 __muldi3
+#include "int_mul_impl.inc"
+#endif
index 5464919..cfafb7a 100644 (file)
@@ -1,4 +1,4 @@
-//===--- mulsi3.S - Integer multiplication routines routines ---===//
+//===--- mulsi3.S - Integer multiplication routines -----------------------===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -6,22 +6,7 @@
 //
 //===----------------------------------------------------------------------===//
 
-#if !defined(__riscv_mul) && __riscv_xlen == 32
-       .text
-       .align 2
-
-       .globl __mulsi3
-       .type  __mulsi3, @function
-__mulsi3:
-       mv     a2, a0
-       mv     a0, zero
-.L1:
-       andi   a3, a1, 1
-       beqz   a3, .L2
-       add    a0, a0, a2
-.L2:
-       srli   a1, a1, 1
-       slli   a2, a2, 1
-       bnez   a1, .L1
-       ret
+#if __riscv_xlen == 32
+#define __mulxi3 __mulsi3
+#include "int_mul_impl.inc"
 #endif