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 {
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); }
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); } }
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); }
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; }
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; }
int ffs(int i) { return __builtin_ffs(i); }
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; }
.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),
// Use gcc's built-in. inline uint8_t findfirstsetbit(uint32_t bits) noexcept { return __builtin_ffs(bits); }
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); }
int __ffs (int x) { return __builtin_ffs (x); }
int nextCandidateVectorized() { unsigned int validCandidatesIndices = ~(bitZero | bitOne); return __builtin_ffs(validCandidatesIndices); }
inline unsigned int ffs (unsigned int x) { return __builtin_ffs (x); }
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);
static int ETLSF_ffs(uint32_t word) { return __builtin_ffs(word) - 1; }
int ffs(int val) { return __builtin_ffs(val); }
// 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; }