mail archive of the barebox mailing list
 help / color / mirror / Atom feed
From: Lucas Stach <l.stach@pengutronix.de>
To: barebox@lists.infradead.org
Subject: [PATCH 2/3] lib: add weak clz/ctz functions
Date: Wed, 21 Feb 2018 10:53:33 +0100	[thread overview]
Message-ID: <20180221095334.30747-2-l.stach@pengutronix.de> (raw)
In-Reply-To: <20180221095334.30747-1-l.stach@pengutronix.de>

This is a copy of the Linux kernel implementation. This adds weak
functions for the clz and ctz gcc builtins. Normally GCC will map
those builtins to CPU instructions directly, but for CPUs where those
are unavailable, we need to provide a fallback implementation.

Fixes build of the zlib decompressor on ARMv4 CPUs.

Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
---
 lib/Makefile  |  1 +
 lib/clz_ctz.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 60 insertions(+)
 create mode 100644 lib/clz_ctz.c

diff --git a/lib/Makefile b/lib/Makefile
index a6a32e0d1fd2..29cad3501f0c 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -64,3 +64,4 @@ obj-y			+= list_sort.o
 obj-y			+= int_sqrt.o
 obj-y			+= parseopt.o
 obj-y			+= find_bit.o
+obj-y			+= clz_ctz.o
diff --git a/lib/clz_ctz.c b/lib/clz_ctz.c
new file mode 100644
index 000000000000..b5ac7f447ac1
--- /dev/null
+++ b/lib/clz_ctz.c
@@ -0,0 +1,59 @@
+/*
+ * lib/clz_ctz.c
+ *
+ * Copyright (C) 2013 Chanho Min <chanho.min@lge.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ * The functions in this file aren't called directly, but are required by
+ * GCC builtins such as __builtin_ctz, and therefore they can't be removed
+ * despite appearing unreferenced in kernel source.
+ *
+ * __c[lt]z[sd]i2 can be overridden by linking arch-specific versions.
+ */
+
+#include <linux/bitops.h>
+#include <linux/kernel.h>
+
+int __weak __ctzsi2(int val);
+int __weak __ctzsi2(int val)
+{
+	return __ffs(val);
+}
+
+int __weak __clzsi2(int val);
+int __weak __clzsi2(int val)
+{
+	return 32 - fls(val);
+}
+
+int __weak __clzdi2(long val);
+int __weak __ctzdi2(long val);
+#if BITS_PER_LONG == 32
+
+int __weak __clzdi2(long val)
+{
+	return 32 - fls((int)val);
+}
+
+int __weak __ctzdi2(long val)
+{
+	return __ffs((u32)val);
+}
+
+#elif BITS_PER_LONG == 64
+
+int __weak __clzdi2(long val)
+{
+	return 64 - fls64((u64)val);
+}
+
+int __weak __ctzdi2(long val)
+{
+	return __ffs64((u64)val);
+}
+
+#else
+#error BITS_PER_LONG not 32 or 64
+#endif
-- 
2.16.1


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

  reply	other threads:[~2018-02-21  9:53 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-02-21  9:53 [PATCH 1/3] arm: ARM64 doen't provide the armlinux_ functions Lucas Stach
2018-02-21  9:53 ` Lucas Stach [this message]
2018-02-21  9:53 ` [PATCH 3/3] at91sam9263ek: don't build legacy init when OFDEVICE is enabled Lucas Stach
2018-02-21 10:26 ` [PATCH 1/3] arm: ARM64 doen't provide the armlinux_ functions Roland Hieber
2018-02-26 12:00 ` Sascha Hauer

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20180221095334.30747-2-l.stach@pengutronix.de \
    --to=l.stach@pengutronix.de \
    --cc=barebox@lists.infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox