Blender V5.0
math_bits_inline.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
9#ifndef __MATH_BITS_INLINE_C__
10#define __MATH_BITS_INLINE_C__
11
12#ifdef _MSC_VER
13# include <intrin.h>
14#endif
15
16#include "BLI_assert.h"
17#include "BLI_math_bits.h"
18
19MINLINE unsigned int bitscan_forward_uint(unsigned int a)
20{
21 BLI_assert(a != 0);
22#ifdef _MSC_VER
23 unsigned long ctz;
24 _BitScanForward(&ctz, a);
25 return ctz;
26#else
27 return (unsigned int)__builtin_ctz(a);
28#endif
29}
30
31MINLINE unsigned int bitscan_forward_uint64(unsigned long long a)
32{
33 BLI_assert(a != 0);
34#ifdef _MSC_VER
35 unsigned long ctz;
36 _BitScanForward64(&ctz, a);
37 return ctz;
38#else
39 return (unsigned int)__builtin_ctzll(a);
40#endif
41}
42
44{
45 return (int)bitscan_forward_uint((unsigned int)a);
46}
47
48MINLINE unsigned int bitscan_forward_clear_uint(unsigned int *a)
49{
50 unsigned int i = bitscan_forward_uint(*a);
51 *a &= (*a) - 1;
52 return i;
53}
54
56{
57 return (int)bitscan_forward_clear_uint((unsigned int *)a);
58}
59
60MINLINE unsigned int bitscan_reverse_uint(unsigned int a)
61{
62 BLI_assert(a != 0);
63#ifdef _MSC_VER
64 unsigned long clz;
65 _BitScanReverse(&clz, a);
66 return 31 - clz;
67#else
68 return (unsigned int)__builtin_clz(a);
69#endif
70}
71
72MINLINE unsigned int bitscan_reverse_uint64(unsigned long long a)
73{
74 BLI_assert(a != 0);
75#ifdef _MSC_VER
76 unsigned long clz;
77 _BitScanReverse64(&clz, a);
78 return 63 - clz;
79#else
80 return (unsigned int)__builtin_clzll(a);
81#endif
82}
83
85{
86 return (int)bitscan_reverse_uint((unsigned int)a);
87}
88
89MINLINE unsigned int bitscan_reverse_clear_uint(unsigned int *a)
90{
91 unsigned int i = bitscan_reverse_uint(*a);
92 *a &= ~(0x80000000 >> i);
93 return i;
94}
95
97{
98 return (int)bitscan_reverse_clear_uint((unsigned int *)a);
99}
100
101MINLINE unsigned int highest_order_bit_uint(unsigned int n)
102{
103 if (n == 0) {
104 return 0;
105 }
106 return 1 << (sizeof(unsigned int) * 8 - bitscan_reverse_uint(n));
107}
108
109MINLINE unsigned short highest_order_bit_s(unsigned short n)
110{
111 n |= (unsigned short)(n >> 1);
112 n |= (unsigned short)(n >> 2);
113 n |= (unsigned short)(n >> 4);
114 n |= (unsigned short)(n >> 8);
115 return (unsigned short)(n - (n >> 1));
116}
117
118#if !(COMPILER_GCC || COMPILER_CLANG || COMPILER_MSVC)
119MINLINE int count_bits_i(unsigned int i)
120{
121 /* variable-precision SWAR algorithm. */
122 i = i - ((i >> 1) & 0x55555555);
123 i = (i & 0x33333333) + ((i >> 2) & 0x33333333);
124 return (((i + (i >> 4)) & 0x0F0F0F0F) * 0x01010101) >> 24;
125}
127{
128 return count_bits_i((uint32_t)a) + count_bits_i((uint32_t)(a >> 32));
129}
130#endif
131
133{
134 union {
135 int i;
136 float f;
137 } u;
138 u.f = f;
139 return u.i;
140}
141
142MINLINE unsigned int float_as_uint(float f)
143{
144 union {
145 unsigned int i;
146 float f;
147 } u;
148 u.f = f;
149 return u.i;
150}
151
153{
154 union {
155 int i;
156 float f;
157 } u;
158 u.i = i;
159 return u.f;
160}
161
162MINLINE float uint_as_float(unsigned int i)
163{
164 union {
165 unsigned int i;
166 float f;
167 } u;
168 u.i = i;
169 return u.f;
170}
171
172MINLINE float xor_fl(float x, int y)
173{
174 return int_as_float(float_as_int(x) ^ y);
175}
176
177#endif /* __MATH_BITS_INLINE_C__ */
#define BLI_assert(a)
Definition BLI_assert.h:46
#define MINLINE
unsigned long long int uint64_t
MINLINE int float_as_int(float f)
MINLINE unsigned int bitscan_forward_uint(unsigned int a)
MINLINE int count_bits_uint64(const uint64_t a)
MINLINE int bitscan_forward_clear_i(int *a)
MINLINE float xor_fl(float x, int y)
MINLINE unsigned int bitscan_forward_clear_uint(unsigned int *a)
MINLINE float int_as_float(int i)
MINLINE int count_bits_i(unsigned int i)
MINLINE unsigned int float_as_uint(float f)
MINLINE unsigned int bitscan_reverse_uint(unsigned int a)
MINLINE int bitscan_reverse_clear_i(int *a)
MINLINE unsigned short highest_order_bit_s(unsigned short n)
MINLINE float uint_as_float(unsigned int i)
MINLINE int bitscan_forward_i(int a)
MINLINE unsigned int bitscan_forward_uint64(unsigned long long a)
MINLINE unsigned int bitscan_reverse_clear_uint(unsigned int *a)
MINLINE unsigned int highest_order_bit_uint(unsigned int n)
MINLINE int bitscan_reverse_i(int a)
MINLINE unsigned int bitscan_reverse_uint64(unsigned long long a)
i
Definition text_draw.cc:230