示例#1
0
int
ffs (int i)
{
#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
    return __builtin_ffs (i);
#else
    /* http://graphics.stanford.edu/~seander/bithacks.html#ZerosOnRightMultLookup
       gives this deBruijn constant for a branch-less computation, although
       that table counted trailing zeros rather than bit position.  This
       requires 32-bit int, we fall back to a naive algorithm on the rare
       platforms where that assumption is not true.  */
    if (CHAR_BIT * sizeof i == 32)
    {
        static unsigned int table[] = {
            1, 2, 29, 3, 30, 15, 25, 4, 31, 23, 21, 16, 26, 18, 5, 9,
            32, 28, 14, 24, 22, 20, 17, 8, 27, 13, 19, 7, 12, 6, 11, 10
        };
        unsigned int u = i;
        unsigned int bit = u & -u;
        return table[(bit * 0x077cb531U) >> 27] - !i;
    }
    else
    {
示例#2
0
文件: spi_api.c 项目: dreschpe/mbed
void spi_frequency(spi_t *obj, int hz) {
    // Get SPI clock frequency
    uint32_t PCLK = SystemCoreClock;

    // Choose the baud rate divisor (between 2 and 256)
    uint32_t divisor = PCLK / hz;

    // Find the nearest power-of-2
    divisor = (divisor > 0 ? divisor-1 : 0);
    divisor |= divisor >> 1;
    divisor |= divisor >> 2;
    divisor |= divisor >> 4;
    divisor |= divisor >> 8;
    divisor |= divisor >> 16;
    divisor++;

    uint32_t baud_rate = __builtin_ffs(divisor) - 2;
    
    // Save new value
    obj->br_presc = ((baud_rate > 7) ? (7 << 3) : (baud_rate << 3));
 
    init_spi(obj);
}
示例#3
0
文件: ivar.cpp 项目: Hasimir/darling
void ConvertIvarList(Class c, const ivar_list_t* list)
{
	LOG << list->count << " ivars within\n";

	for (size_t i = 0; i < list->count; i++)
	{
		auto* v = &list->ivar_list[i];
		int align = __builtin_ffs(v->alignment) - 1;

		LOG << "Ivar: name: " << v->name << "; type: " << v->type << "; offset: " << *v->offset << "; size: " << v->size << "; alignment: " << v->alignment << std::endl;
		class_addIvar(c, v->name, v->size, v->alignment, v->type);
		
		Ivar ivar = class_getInstanceVariable(c, v->name);
		
		if (ivar)
		{
			*v->offset = ivar_getOffset(ivar);
			LOG << "Ivar registered, ivar_getOffset() = " << ivar_getOffset(ivar) << " in " << class_getInstanceSize(c) << std::endl;
		}

		assert(ivar != nullptr);
		// assert(ivar_getOffset(ivar) == *v->offset);
	}
}
示例#4
0
文件: pl190.c 项目: bkolobara/Benu-pi
static int pl190_get_irq ()
{
	volatile uint32 *vicreg, mask, irq;

	vicreg = (void *) ( VICBASE + VICIRQSTATUS );

	mask = *vicreg;

	if ( mask )
	{
		/* if more interrupt request are acitve get one:
		 * with lowest or higest number? */
#if 0	/* return highest number */
		irq = 31 - __builtin_clz ( mask ) + IRQ_OFFSET;
#else	/* return lowest number */
		irq = __builtin_ffs ( mask ) - 1 + IRQ_OFFSET;
#endif
	}
	else {
		irq = 0;
	}

	return irq;
}
void* Chunk::Alloc() {
  assert(free_count_ > 0);

  unsigned int i = first_free_bitmap_;
  while (free_bitmap_[i] == 0)
    i++;
  assert(i < arraysize(free_bitmap_));
  unsigned int bit = __builtin_ffs(free_bitmap_[i]) - 1;
  assert(free_bitmap_[i] & (1U << bit));
  free_bitmap_[i] &= ~(1U << bit);
  unsigned int n = i * 32 + bit;
  assert(n < max_allocations_);

  unsigned int page = n * allocation_size_ / kPageSize;
  assert(page / 32 < arraysize(dirty_pages_));
  dirty_pages_[page / 32] |= 1U << (page % 32);

  free_count_--;
  if (free_count_ == 0) {
    heap_->MoveToFullList(this, bucket_);
  }

  return n_to_ptr(n);
}
示例#6
0
文件: problem49.cpp 项目: stdk/euler
bool is_correct_sequence(Sequence &sequence) {
    if(sequence.size() < 3) return false;

    uint32_t mask = (1 << sequence.size()) - 1;
    uint32_t combination = 0b111;

    Sequence c(3);

    while(next_combination(combination,mask)) {
        auto i = c.begin();
        uint32_t x = combination;
        while(uint32_t k = __builtin_ffs(x)) {
            *i++ = sequence[k-1];
             x &= ~(1 << (k-1));
        }

        if(c[1]-c[0] == c[2]-c[1]) {
            sequence = c;
            return true;
        }
    }

    return false;
}
示例#7
0
文件: position.c 项目: dsteuer/laska
int Position::moveValue(const Move m, const unsigned int square) {	// value difference of a move / undo
	unsigned int s = (tower[square].isOfficer()) ? 2 : turn;
	int v = tower[square].getValue();
	v += square_value[s][square];

	if (m.isJump()) {
		unsigned int other = !turn;
		for (unsigned int j = m.overMask(); j; j &= (j-1)) {		// for movelength > 4, ensure each key is removed only once.
			unsigned int over = __builtin_ffs(j) - 1;
			if (tower[over].size()) {
				if (tower[over].color() == turn) {	// color switch
					unsigned int s = (tower[over].isOfficer()) ? 2 : turn;
					v += square_value[s][over];
					v += tower[over].getValue();
				} else {
					unsigned int s = (tower[over].isOfficer()) ? 2 : other;
					v -= square_value[s][over];
					v -= tower[over].getValue();
				}
			}
		}
	}
	return v;
}
示例#8
0
文件: ffs.c 项目: saltstar/smartnix
int ffs(int i) {
    return __builtin_ffs(i);
}
示例#9
0
文件: position.c 项目: dsteuer/laska
std::string Position::toString(unsigned int style) const {
	std::string s[squares];
	std::string t = "";
	for(unsigned int j=0; j<squares; j++) { s[j] =  tower[j].toString(); }

	if (style == 2) {
		unsigned int last = 0;
		for (unsigned int i  = bitb.bits[0]; i; i &= (i - 1)) {
			unsigned int at = __builtin_ffs(i)-1;
			if (at && at-last>1) {
				unsigned int d = at-last;
				if (last) d--;
				t += std::to_string(d);
			} else {
				if (at) t+=".";
			}
			t += s[at];
			last = at;
		}
		if (24-last)
		t += std::to_string(24-last);
		std::bitset<361> bs;
		int bsi = 0;		
		for (unsigned int i=0; i<t.length(); i++) {
			char cc = t[i];
			for (int j=0; j<8; j++) {
				if (cc&(1<<j))
					bs.set(bsi);
				bsi++;
			}
		}
		std::cerr << bs << '\n';

		t += "\n";
		last = 0;
		for (unsigned int i  = bitb.bits[1]; i; i &= (i - 1)) {
			unsigned int at = __builtin_ffs(i)-1;
			if (at && at-last>1) {
				unsigned int d = at-last;
				if(last) d--;
				t += std::to_string(d);
			} else {
				if (at) t+=".";
			}
			t += s[at];
			last = at;
		}
		if (24-last)
		t += std::to_string(24-last);
		t += "\n";
		return t;
	}
	if (style) {		// return compact string
		std::vector<unsigned int> ranks;
		     if (squares == 25) ranks = { 0, 3, 6, 10, 13, 17, 20 };
		else if (squares == 13) ranks = { 0, 2, 4, 7, 9 };
		else if (squares ==  5) ranks = { 0, 1, 2 };
		unsigned int r = 1;
		for(unsigned int i=0; i<squares-1; i++) {
			t += s[i];
			if (ranks[r] == i) {
				t+= '|';
				r++;
			} else {
				t += '.';
			}
		}
		t += s[squares-1];

		// t += " " + std::to_string(bitb.bits[2]) + " " + std::to_string(bitb.bits[3]);
		return t;
	}

	for(unsigned int i=0; i<squares; i++) {		// fill strings with blanks. string class most likely has a better way?
		for (int j=s[i].length(); j<7; j++) { s[i] += ' '; }
	}

	if (squares == 25) {
		t += "        _______________________________________________________\n";
		t += "       |       |_______|       |_______|       |_______|       |\n";
		t += "  7    |       |_______|       |_______|       |_______|       |\n";
		t += "       |" + s[21] + "|_______|" + s[22] + "|_______|" + s[23] + "|_______|" + s[24] + "|\n";
		t += "       |_______|_______|_______|_______|_______|_______|_______|\n";
		t += "       |_______|       |_______|       |_______|       |_______|\n";
		t += "  6    |_______|       |_______|       |_______|       |_______|\n";
		t += "       |_______|" + s[18] + "|_______|" + s[19] + "|_______|" + s[20] + "|_______|\n";
		t += "       |_______|_______|_______|_______|_______|_______|_______|\n";
		t += "       |       |_______|       |_______|       |_______|       |\n";
		t += "  5    |       |_______|       |_______|       |_______|       |\n";
		t += "       |" + s[14] + "|_______|" + s[15] + "|_______|" + s[16] + "|_______|" + s[17] + "|\n";
		t += "       |_______|_______|_______|_______|_______|_______|_______|\n";
		t += "       |_______|       |_______|       |_______|       |_______|\n";
		t += "  4    |_______|       |_______|       |_______|       |_______|\n";
		t += "       |_______|" + s[11] + "|_______|" + s[12] + "|_______|" + s[13] + "|_______|\n";
		t += "       |_______|_______|_______|_______|_______|_______|_______|\n";
		t += "       |       |_______|       |_______|       |_______|       |\n";
		t += "  3    |       |_______|       |_______|       |_______|       |\n";
		t += "       |" + s[7] + "|_______|" + s[8] + "|_______|" + s[9] + "|_______|" + s[10] + "|\n";
		t += "       |_______|_______|_______|_______|_______|_______|_______|\n";
		t += "       |_______|       |_______|       |_______|       |_______|\n";
		t += "  2    |_______|       |_______|       |_______|       |_______|\n";
		t += "       |_______|" + s[4] + "|_______|" + s[5] + "|_______|" + s[6] + "|_______|\n";
		t += "       |_______|_______|_______|_______|_______|_______|_______|\n";
		t += "       |       |_______|       |_______|       |_______|       |\n";
		t += "  1    |       |_______|       |_______|       |_______|       |\n";
		t += "       |" + s[0] + "|_______|" + s[1] + "|_______|" + s[2] + "|_______|" + s[3] + "|\n";
		t += "       |_______|_______|_______|_______|_______|_______|_______|\n";
		t += "\n";
		t += "           A       B       C       D       E       F       G\n";
	} else if (squares == 13) {
		t += "        _______________________________________\n";
		t += "  5    |       |_______|       |_______|       |\n";
		t += "       |" + s[10] + "|_______|" + s[11] + "|_______|" + s[12] + "|\n";
		t += "       |_______|_______|_______|_______|_______|\n";
		t += "       |_______|       |_______|       |_______|\n";
		t += "  4    |_______|       |_______|       |_______|\n";
		t += "       |_______|" + s[8] + "|_______|" + s[9]  + "|_______|\n";
		t += "       |_______|_______|_______|_______|_______|\n";
		t += "       |       |_______|       |_______|       |\n";
		t += "  3    |       |_______|       |_______|       |\n";
		t += "       |" + s[5] + "|_______|" + s[6] + "|_______|" + s[7] + "|\n";
		t += "       |_______|_______|_______|_______|_______|\n";
		t += "       |_______|       |_______|       |_______|\n";
		t += "  2    |_______|       |_______|       |_______|\n";
		t += "       |_______|" + s[3] + "|_______|" + s[4] + "|_______|\n";
		t += "       |_______|_______|_______|_______|_______|\n";
		t += "       |       |_______|       |_______|       |\n";
		t += "  1    |       |_______|       |_______|       |\n";
		t += "       |" + s[0] + "|_______|" + s[1] + "|_______|" + s[2] + "|\n";
		t += "       |_______|_______|_______|_______|_______|\n";
		t += "\n";
		t += "           A       B       C       D       E\n";
	} else if (squares == 5) {
		t += "        _______________________\n";
		t += "       |       |_______|       |\n";
		t += "  3    |       |_______|       |\n";
		t += "       |" + s[3] + "|_______|" + s[4] + "|\n";
		t += "       |_______|_______|_______|\n";
		t += "       |_______|       |_______|\n";
		t += "  2    |_______|       |_______|\n";
		t += "       |_______|" + s[2] + "|_______|\n";
		t += "       |_______|_______|_______|\n";
		t += "       |       |_______|       |\n";
		t += "  1    |       |_______|       |\n";
		t += "       |" + s[0] + "|_______|" + s[1] + "|\n";
		t += "       |_______|_______|_______|\n";
		t += "\n";
		t += "           A       B       C\n";
	}

	return t;
}
示例#10
0
		.desc.name = "DA9062 BUCK1",
		.desc.of_match = of_match_ptr("buck1"),
		.desc.regulators_node = of_match_ptr("regulators"),
		.desc.ops = &da9062_buck_ops,
		.desc.min_uV = (300) * 1000,
		.desc.uV_step = (10) * 1000,
		.desc.n_voltages = ((1570) - (300))/(10) + 1,
		.current_limits = da9062_buck_a_limits,
		.n_current_limits = ARRAY_SIZE(da9062_buck_a_limits),
		.desc.enable_reg = DA9062AA_BUCK1_CONT,
		.desc.enable_mask = DA9062AA_BUCK1_EN_MASK,
		.desc.vsel_reg = DA9062AA_VBUCK1_A,
		.desc.vsel_mask = DA9062AA_VBUCK1_A_MASK,
		.desc.linear_min_sel = 0,
		.sleep = REG_FIELD(DA9062AA_VBUCK1_A,
			__builtin_ffs((int)DA9062AA_BUCK1_SL_A_MASK) - 1,
			sizeof(unsigned int) * 8 -
			__builtin_clz((DA9062AA_BUCK1_SL_A_MASK)) - 1),
		.suspend_sleep = REG_FIELD(DA9062AA_VBUCK1_B,
			__builtin_ffs((int)DA9062AA_BUCK1_SL_B_MASK) - 1,
			sizeof(unsigned int) * 8 -
			__builtin_clz((DA9062AA_BUCK1_SL_B_MASK)) - 1),
		.suspend_vsel_reg = DA9062AA_VBUCK1_B,
		.mode = REG_FIELD(DA9062AA_BUCK1_CFG,
			__builtin_ffs((int)DA9062AA_BUCK1_MODE_MASK) - 1,
			sizeof(unsigned int) * 8 -
			__builtin_clz((DA9062AA_BUCK1_MODE_MASK)) - 1),
		.suspend = REG_FIELD(DA9062AA_DVC_1,
			__builtin_ffs((int)DA9062AA_VBUCK1_SEL_MASK) - 1,
			sizeof(unsigned int) * 8 -
			__builtin_clz((DA9062AA_VBUCK1_SEL_MASK)) - 1),
示例#11
0
// Use gcc's built-in.
inline uint8_t findfirstsetbit(uint32_t bits) noexcept
{
    return __builtin_ffs(bits);
}
示例#12
0
文件: ffs.c 项目: 0day-ci/gcc
unsigned int functest(unsigned int x)
{
  return __builtin_ffs(x);
}
/* mingw32 needs ffs for compilations without optimization. */
int ffs(int i)
{
    /* Use gcc's builtin ffs. */
    return __builtin_ffs(i);
}
int __rt_ffs(int value)
{
    return __builtin_ffs(value);
}
示例#15
0
文件: ffs.c 项目: AubrCool/glibc
int
__ffs (int x)
{
  return __builtin_ffs (x);
}
 int nextCandidateVectorized() {
   unsigned int validCandidatesIndices = ~(bitZero | bitOne);
   return __builtin_ffs(validCandidatesIndices);
 }
示例#17
0
inline unsigned int ffs (unsigned int x) { return __builtin_ffs (x); }
示例#18
0
char popcount8[__builtin_popcountll(0LL) == 0 ? 1 : -1];
char popcount9[__builtin_popcountll(0xF0F0LL) == 8 ? 1 : -1];
char popcount10[__builtin_popcountll(~0LL) == BITSIZE(long long) ? 1 : -1];

char parity1[__builtin_parity(0) == 0 ? 1 : -1];
char parity2[__builtin_parity(0xb821) == 0 ? 1 : -1];
char parity3[__builtin_parity(0xb822) == 0 ? 1 : -1];
char parity4[__builtin_parity(0xb823) == 1 ? 1 : -1];
char parity5[__builtin_parity(0xb824) == 0 ? 1 : -1];
char parity6[__builtin_parity(0xb825) == 1 ? 1 : -1];
char parity7[__builtin_parity(0xb826) == 1 ? 1 : -1];
char parity8[__builtin_parity(~0) == 0 ? 1 : -1];
char parity9[__builtin_parityl(1L << (BITSIZE(long) - 1)) == 1 ? 1 : -1];
char parity10[__builtin_parityll(1LL << (BITSIZE(long long) - 1)) == 1 ? 1 : -1];

char ffs1[__builtin_ffs(0) == 0 ? 1 : -1];
char ffs2[__builtin_ffs(1) == 1 ? 1 : -1];
char ffs3[__builtin_ffs(0xfbe71) == 1 ? 1 : -1];
char ffs4[__builtin_ffs(0xfbe70) == 5 ? 1 : -1];
char ffs5[__builtin_ffs(1U << (BITSIZE(int) - 1)) == BITSIZE(int) ? 1 : -1];
char ffs6[__builtin_ffsl(0x10L) == 5 ? 1 : -1];
char ffs7[__builtin_ffsll(0x100LL) == 9 ? 1 : -1];
#undef BITSIZE

// GCC misc stuff

extern int f();

int h0 = __builtin_types_compatible_p(int, float);
//int h1 = __builtin_choose_expr(1, 10, f());
//int h2 = __builtin_expect(0, 0);
示例#19
0
static int ETLSF_ffs(uint32_t word)
{
    return __builtin_ffs(word) - 1;
}
示例#20
0
int ffs(int val)
{
	return __builtin_ffs(val);
}
示例#21
0
文件: spi_api.c 项目: Illuminux/mbed
    // Get SPI clock frequency
    uint32_t PCLK = SystemCoreClock >> 1;

    // Choose the baud rate divisor (between 2 and 256)
    uint32_t divisor = PCLK / hz;

    // Find the nearest power-of-2
    divisor = (divisor > 0 ? divisor-1 : 0);
    divisor |= divisor >> 1;
    divisor |= divisor >> 2;
    divisor |= divisor >> 4;
    divisor |= divisor >> 8;
    divisor |= divisor >> 16;
    divisor++;

    uint32_t baud_rate = __builtin_ffs(divisor) - 2;
    
    // Save new value
    obj->br_presc = ((baud_rate > 7) ? (7 << 3) : (baud_rate << 3));
 
    init_spi(obj);
}

static inline int ssp_readable(spi_t *obj) {
    int status;
    SPI_TypeDef *spi = (SPI_TypeDef *)(obj->spi);
    // Check if data is received
    status = ((SPI_I2S_GetFlagStatus(spi, SPI_I2S_FLAG_RXNE) != RESET) ? 1 : 0);
    return status;  
}