summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeffrey O. Hill <hill@wombat.lanl.gov>2013-02-06 08:08:43 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2013-03-11 17:57:41 +0100
commit1cddf47a4dedaefbd8895fb658ffc69a80631493 (patch)
tree0a6f99033d879b4023915ef74dba64d4b983594f
parentnios2: Rename file (diff)
downloadrtems-1cddf47a4dedaefbd8895fb658ffc69a80631493.tar.bz2
nios2: Add _Nios2_Count_leading_zeros()
Add _Nios2_Count_trailing_zeros(). They are currently more efficient than the corresponding GCC builtins.
-rw-r--r--cpukit/score/cpu/nios2/Makefile.am1
-rw-r--r--cpukit/score/cpu/nios2/preinstall.am4
-rw-r--r--cpukit/score/cpu/nios2/rtems/score/nios2-count-zeros.h70
3 files changed, 75 insertions, 0 deletions
diff --git a/cpukit/score/cpu/nios2/Makefile.am b/cpukit/score/cpu/nios2/Makefile.am
index 28587d814f..25ff46abfd 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 d0d846d609..92e75e1a0e 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 0000000000..3e16a8aeef
--- /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 */