初始提交
This commit is contained in:
148
common/utils/iot_bitops.c
Normal file
148
common/utils/iot_bitops.c
Normal file
@@ -0,0 +1,148 @@
|
||||
/****************************************************************************
|
||||
|
||||
Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED.
|
||||
|
||||
This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT
|
||||
be copied by any method or incorporated into another program without
|
||||
the express written consent of Aerospace C.Power. This Information or any portion
|
||||
thereof remains the property of Aerospace C.Power. The Information contained herein
|
||||
is believed to be accurate and Aerospace C.Power assumes no responsibility or
|
||||
liability for its use in any way and conveys no license or title under
|
||||
any patent or copyright and makes no representation or warranty that this
|
||||
Information is free from patent or copyright infringement.
|
||||
|
||||
****************************************************************************/
|
||||
|
||||
/* os shim includes */
|
||||
#include "os_types.h"
|
||||
|
||||
/* common includes */
|
||||
#include "iot_bitops.h"
|
||||
|
||||
/* table used for ffs and ffz operation */
|
||||
const IRAM_ATTR uint8_t iot_bitops_ffs_tab[IOT_BITOPS_TAB_SIZE] = {
|
||||
0, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1,
|
||||
5, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1,
|
||||
6, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1,
|
||||
5, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1,
|
||||
7, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1,
|
||||
5, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1,
|
||||
6, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1,
|
||||
5, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1,
|
||||
8, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1,
|
||||
5, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1,
|
||||
6, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1,
|
||||
5, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1,
|
||||
7, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1,
|
||||
5, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1,
|
||||
6, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1,
|
||||
5, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1 };
|
||||
|
||||
/* table used for fls and ffz operation */
|
||||
const IRAM_ATTR uint8_t iot_bitops_fls_tab[IOT_BITOPS_TAB_SIZE] = {
|
||||
0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
|
||||
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
|
||||
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
|
||||
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
|
||||
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
||||
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
||||
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
||||
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
||||
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
|
||||
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
|
||||
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
|
||||
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
|
||||
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
|
||||
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
|
||||
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
|
||||
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8 };
|
||||
|
||||
/* table used for cbs and cbz operation */
|
||||
const uint8_t iot_bitops_cbs_tab[IOT_BITOPS_TAB_SIZE] = {
|
||||
0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4,
|
||||
1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
|
||||
1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
|
||||
2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
|
||||
1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
|
||||
2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
|
||||
2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
|
||||
3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
|
||||
1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
|
||||
2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
|
||||
2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
|
||||
3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
|
||||
2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
|
||||
3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
|
||||
3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
|
||||
4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8 };
|
||||
|
||||
/* find the first bit set to 1 for non-zero byte */
|
||||
static inline uint8_t __iot_bitops_ffs(uint8_t tmp)
|
||||
{
|
||||
uint8_t b = 1;
|
||||
|
||||
if (!(tmp & 0x0F)) {
|
||||
tmp >>= 4;
|
||||
b += 4;
|
||||
}
|
||||
if (!(tmp & 0x03)) {
|
||||
tmp >>= 2;
|
||||
b += 2;
|
||||
}
|
||||
if (!(tmp & 0x01)) {
|
||||
b += 1;
|
||||
}
|
||||
|
||||
return b;
|
||||
}
|
||||
|
||||
/* find the last bit set to 1 for non-zero byte */
|
||||
static inline uint8_t __iot_bitops_fls(uint8_t tmp)
|
||||
{
|
||||
uint8_t b = 8;
|
||||
|
||||
if (!(tmp & 0xF0)) {
|
||||
tmp <<= 4;
|
||||
b -= 4;
|
||||
}
|
||||
if (!(tmp & 0xC0)) {
|
||||
tmp <<= 2;
|
||||
b -= 2;
|
||||
}
|
||||
if (!(tmp & 0x80)) {
|
||||
b -= 1;
|
||||
}
|
||||
|
||||
return b;
|
||||
}
|
||||
|
||||
/* find number of bits set to 1 for one byte */
|
||||
static inline uint8_t __iot_bitops_cbs(uint8_t tmp)
|
||||
{
|
||||
uint8_t b = 0;
|
||||
|
||||
for (b = 0; tmp; b++) {
|
||||
/* clear the least significant bit set */
|
||||
tmp &= tmp - 1;
|
||||
}
|
||||
|
||||
return b;
|
||||
}
|
||||
|
||||
void iot_bitops_init()
|
||||
{
|
||||
uint32_t i;
|
||||
|
||||
for (i = 1; i < IOT_BITOPS_TAB_SIZE; i++) {
|
||||
if (iot_bitops_ffs_tab[i] != __iot_bitops_ffs((uint8_t)i))
|
||||
IOT_ASSERT(0);
|
||||
}
|
||||
for (i = 1; i < IOT_BITOPS_TAB_SIZE; i++) {
|
||||
if (iot_bitops_fls_tab[i] != __iot_bitops_fls((uint8_t)i))
|
||||
IOT_ASSERT(0);
|
||||
}
|
||||
for (i = 1; i < IOT_BITOPS_TAB_SIZE; i++) {
|
||||
if (iot_bitops_cbs_tab[i] != __iot_bitops_cbs((uint8_t)i))
|
||||
IOT_ASSERT(0);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user