[rtems commit] nios2: Add _Nios2_Count_leading_zeros()

Sebastian Huber sebh at rtems.org
Mon Mar 11 16:54:35 UTC 2013


Module:    rtems
Branch:    master
Commit:    1cddf47a4dedaefbd8895fb658ffc69a80631493
Changeset: http://git.rtems.org/rtems/commit/?id=1cddf47a4dedaefbd8895fb658ffc69a80631493

Author:    Jeffrey O. Hill <hill at wombat.lanl.gov>
Date:      Wed Feb  6 08:08:43 2013 +0100

nios2: Add _Nios2_Count_leading_zeros()

Add _Nios2_Count_trailing_zeros().  They are currently more efficient
than the corresponding GCC builtins.

---

 cpukit/score/cpu/nios2/Makefile.am                 |    1 +
 cpukit/score/cpu/nios2/preinstall.am               |    4 +
 .../cpu/nios2/rtems/score/nios2-count-zeros.h      |   70 ++++++++++++++++++++
 3 files changed, 75 insertions(+), 0 deletions(-)

diff --git a/cpukit/score/cpu/nios2/Makefile.am b/cpukit/score/cpu/nios2/Makefile.am
index 28587d8..25ff46a 100644
--- a/cpukit/score/cpu/nios2/Makefile.am
+++ b/cpukit/score/cpu/nios2/Makefile.am
@@ -13,6 +13,7 @@ include_rtems_score_HEADERS =
 include_rtems_score_HEADERS += rtems/score/cpu.h
 include_rtems_score_HEADERS += rtems/score/nios2.h
 include_rtems_score_HEADERS += rtems/score/nios2-utility.h
+include_rtems_score_HEADERS += rtems/score/nios2-count-zeros.h
 include_rtems_score_HEADERS += rtems/score/cpu_asm.h
 include_rtems_score_HEADERS += rtems/score/types.h
 
diff --git a/cpukit/score/cpu/nios2/preinstall.am b/cpukit/score/cpu/nios2/preinstall.am
index d0d846d..92e75e1 100644
--- a/cpukit/score/cpu/nios2/preinstall.am
+++ b/cpukit/score/cpu/nios2/preinstall.am
@@ -39,6 +39,10 @@ $(PROJECT_INCLUDE)/rtems/score/nios2-utility.h: rtems/score/nios2-utility.h $(PR
 	$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/nios2-utility.h
 PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/nios2-utility.h
 
+$(PROJECT_INCLUDE)/rtems/score/nios2-count-zeros.h: rtems/score/nios2-count-zeros.h $(PROJECT_INCLUDE)/rtems/score/$(dirstamp)
+	$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/nios2-count-zeros.h
+PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/nios2-count-zeros.h
+
 $(PROJECT_INCLUDE)/rtems/score/cpu_asm.h: rtems/score/cpu_asm.h $(PROJECT_INCLUDE)/rtems/score/$(dirstamp)
 	$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/cpu_asm.h
 PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/cpu_asm.h
diff --git a/cpukit/score/cpu/nios2/rtems/score/nios2-count-zeros.h b/cpukit/score/cpu/nios2/rtems/score/nios2-count-zeros.h
new file mode 100644
index 0000000..3e16a8a
--- /dev/null
+++ b/cpukit/score/cpu/nios2/rtems/score/nios2-count-zeros.h
@@ -0,0 +1,70 @@
+/*
+ * Author: Jeffrey O. Hill
+ *
+ * Copyright 2012. Los Alamos National Security, LLC.
+ * This material was produced under U.S. Government contract
+ * DE-AC52-06NA25396 for Los Alamos National Laboratory (LANL),
+ * which is operated by Los Alamos National Security, LLC for
+ * the U.S. Department of Energy. The U.S. Government has rights
+ * to use, reproduce, and distribute this software.  NEITHER THE
+ * GOVERNMENT NOR LOS ALAMOS NATIONAL SECURITY, LLC MAKES ANY
+ * WARRANTY, EXPRESS OR IMPLIED, OR ASSUMES ANY LIABILITY FOR
+ * THE USE OF THIS SOFTWARE.
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ */
+
+#ifndef _NIOS2_COUNT_ZEROS_H
+#define _NIOS2_COUNT_ZEROS_H
+
+#include <stdint.h>
+
+#include <rtems/score/bitfield.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/*
+ * This implementation is currently much more efficient than
+ * the GCC provided __builtin_clz
+ */
+static inline unsigned _Nios2_Count_leading_zeros( uint32_t p )
+{
+  unsigned bitIdx;
+
+  if ( p <= 0xffffu ) {
+    if ( p < 0x100u ) {
+      bitIdx = __log2table[ p ] + 24u;
+    } else {
+      bitIdx = __log2table[ p >> 8u ] + 16u;
+    }
+  } else {
+    p >>= 16u;
+
+    if ( p < 0x100u ) {
+      bitIdx = __log2table[ p ] + 8u;
+    } else {
+      bitIdx = __log2table[ p >> 8u ];
+    }
+  }
+
+  return bitIdx;
+}
+
+/*
+ * This implementation is currently much more efficient than
+ * the GCC provided __builtin_ctz
+ */
+static inline unsigned _Nios2_Count_trailing_zeros( uint32_t p )
+{
+  return 31u - _Nios2_Count_leading_zeros( p & ( -p ) );
+}
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* _NIOS2_COUNT_ZEROS_H */




More information about the vc mailing list