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