Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause 2 : : * Copyright (C) 2019 Intel Corporation. All rights reserved. 3 : : * All rights reserved. 4 : : */ 5 : : 6 : : #include "spdk/stdinc.h" 7 : : #include "spdk/util.h" 8 : : #include "spdk/assert.h" 9 : : 10 : : /* The following will automatically generate several version of 11 : : * this function, targeted at different architectures. This 12 : : * is only supported by GCC 6 or newer. */ 13 : : #if defined(__GNUC__) && __GNUC__ >= 6 && !defined(__clang__) \ 14 : : && (defined(__i386__) || defined(__x86_64__)) \ 15 : : && defined(__ELF__) 16 : : __attribute__((target_clones("bmi", "arch=core2", "arch=atom", "default"))) 17 : : #endif 18 : : uint32_t 19 : 413371217 : spdk_u32log2(uint32_t x) 20 : : { 21 [ + + ]: 413371217 : if (x == 0) { 22 : : /* log(0) is undefined */ 23 : 537 : return 0; 24 : : } 25 : : SPDK_STATIC_ASSERT(sizeof(x) == sizeof(unsigned int), "Incorrect size"); 26 [ - + ]: 413370701 : return 31u - __builtin_clz(x); 27 : : } 28 : : 29 : : /* The following will automatically generate several version of 30 : : * this function, targeted at different architectures. This 31 : : * is only supported by GCC 6 or newer. */ 32 : : #if defined(__GNUC__) && __GNUC__ >= 6 && !defined(__clang__) \ 33 : : && (defined(__i386__) || defined(__x86_64__)) \ 34 : : && defined(__ELF__) 35 : : __attribute__((target_clones("bmi", "arch=core2", "arch=atom", "default"))) 36 : : #endif 37 : : uint64_t 38 : 20769260 : spdk_u64log2(uint64_t x) 39 : : { 40 [ + + ]: 20769260 : if (x == 0) { 41 : : /* log(0) is undefined */ 42 : 978 : return 0; 43 : : } 44 : : SPDK_STATIC_ASSERT(sizeof(x) == sizeof(unsigned long long), "Incorrect size"); 45 [ - + ]: 20768282 : return 63u - __builtin_clzll(x); 46 : : }