From 1cddf47a4dedaefbd8895fb658ffc69a80631493 Mon Sep 17 00:00:00 2001 From: "Jeffrey O. Hill" Date: Wed, 6 Feb 2013 08:08:43 +0100 Subject: nios2: Add _Nios2_Count_leading_zeros() Add _Nios2_Count_trailing_zeros(). They are currently more efficient than the corresponding GCC builtins. --- .../cpu/nios2/rtems/score/nios2-count-zeros.h | 70 ++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 cpukit/score/cpu/nios2/rtems/score/nios2-count-zeros.h (limited to 'cpukit/score/cpu/nios2/rtems') 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 + +#include + +#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 */ -- cgit v1.2.3