aboutsummaryrefslogtreecommitdiffstats
path: root/lib/umoddi3.c
diff options
context:
space:
mode:
authorZong Li <zongbox@gmail.com>2018-10-02 16:52:29 +0800
committerPalmer Dabbelt <palmer@sifive.com>2018-10-22 17:02:56 -0700
commit6315730e9eab7de5fa9864bb13a352713f48aef1 (patch)
tree8971b00693f003a5e5b71d57b40fd5d91de11879 /lib/umoddi3.c
parent51858aaf9bea3ddf166bf9d252a1fc351260b497 (diff)
downloadkernel_replicant_linux-6315730e9eab7de5fa9864bb13a352713f48aef1.tar.gz
kernel_replicant_linux-6315730e9eab7de5fa9864bb13a352713f48aef1.tar.bz2
kernel_replicant_linux-6315730e9eab7de5fa9864bb13a352713f48aef1.zip
lib: Add umoddi3 and udivmoddi4 of GCC library routines
Add umoddi3 and udivmoddi4 support for 32-bit. The RV32 need the umoddi3 to do modulo when the operands are long long type, like other libraries implementation such as ucmpdi2, lshrdi3 and so on. I encounter the undefined reference 'umoddi3' when I use the in house dma driver, although it is in house driver, but I think that umoddi3 is a common function for RV32. The udivmoddi4 and umoddi3 are copies from libgcc in gcc. There are other functions use the udivmoddi4 in libgcc, so I separate the umoddi3 and udivmoddi4 for flexible extension in the future. Signed-off-by: Zong Li <zong@andestech.com> Signed-off-by: Palmer Dabbelt <palmer@sifive.com>
Diffstat (limited to 'lib/umoddi3.c')
-rw-r--r--lib/umoddi3.c32
1 files changed, 32 insertions, 0 deletions
diff --git a/lib/umoddi3.c b/lib/umoddi3.c
new file mode 100644
index 000000000000..d7bbf0f85197
--- /dev/null
+++ b/lib/umoddi3.c
@@ -0,0 +1,32 @@
+// SPDX-License-Identifier: GPL-2.0
+
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see the file COPYING, or write
+ * to the Free Software Foundation, Inc.
+ */
+
+#include <linux/module.h>
+#include <linux/libgcc.h>
+
+extern unsigned long long __udivmoddi4(unsigned long long u,
+ unsigned long long v,
+ unsigned long long *rp);
+
+unsigned long long __umoddi3(unsigned long long u, unsigned long long v)
+{
+ unsigned long long w;
+ (void)__udivmoddi4(u, v, &w);
+ return w;
+}
+EXPORT_SYMBOL(__umoddi3);