mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2026-08-29 14:20:58 +08:00
nios2: Add _Nios2_Count_leading_zeros()
Add _Nios2_Count_trailing_zeros(). They are currently more efficient than the corresponding GCC builtins.
This commit is contained in:
committed by
Sebastian Huber
parent
3ac61e5262
commit
1cddf47a4d
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 */
|
||||
Reference in New Issue
Block a user