Skip to content

Commit fd79426

Browse files
committed
bitreverse implementation
fix and tests fix tests
1 parent f1c0820 commit fd79426

2 files changed

Lines changed: 89 additions & 1 deletion

File tree

‎cfg/gnu.cfg‎

Lines changed: 72 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
<alloc init="false" buffer-size="malloc">pvalloc</alloc>
2626
<dealloc>free</dealloc>
2727
</memory>
28+
<!-- https://gcc.gnu.org/onlinedocs/gcc/Byte-Swapping-Builtins.html -->
2829
<function name="bswap_16">
2930
<noreturn>false</noreturn>
3031
<use-retval/>
@@ -64,10 +65,80 @@
6465
<not-bool/>
6566
</arg>
6667
</function>
67-
<define name="__builtin_bit_cast(type,value)" value="std::bit_cast&lt;type&gt;(value)"/>
6868
<define name="__bswap_constant_64(x)" value="bswap_64(x)"/>
6969
<define name="__builtin_bswap64(x)" value="bswap_64(x)"/>
7070
<define name="__bswap_64(x)" value="bswap_64(x)"/>
71+
<function name="__builtin_bitreverse8">
72+
<noreturn>false</noreturn>
73+
<use-retval/>
74+
<returnValue type="uint8_t">(arg1 = ((arg1 &amp; 0x55555555) &lt;&lt; 1) | ((arg1 &amp; 0xAAAAAAAA) &gt;&gt; 1),
75+
arg1 = ((arg1 &amp; 0x33333333) &lt;&lt; 2) | ((arg1 &amp; 0xCCCCCCCC) &gt;&gt; 2),
76+
arg1 = ((arg1 &amp; 0x0F0F0F0F) &lt;&lt; 4) | ((arg1 &amp; 0xF0F0F0F0) &gt;&gt; 4),
77+
arg1)
78+
</returnValue>
79+
<leak-ignore/>
80+
<const/>
81+
<arg nr="1" direction="in">
82+
<not-uninit/>
83+
<not-bool/>
84+
<valid>0:</valid>
85+
</arg>
86+
</function>
87+
<function name="__builtin_bitreverse16">
88+
<noreturn>false</noreturn>
89+
<use-retval/>
90+
<returnValue type="uint16_t">(arg1 = ((arg1 &amp; 0x55555555u) &lt;&lt; 1) | ((arg1 &amp; 0xAAAAAAAAu) &gt;&gt; 1),
91+
arg1 = ((arg1 &amp; 0x33333333u) &lt;&lt; 2) | ((arg1 &amp; 0xCCCCCCCCu) &gt;&gt; 2),
92+
arg1 = ((arg1 &amp; 0x0F0F0F0Fu) &lt;&lt; 4) | ((arg1 &amp; 0xF0F0F0F0u) &gt;&gt; 4),
93+
arg1 = ((arg1 &amp; 0x00FF00FFu) &lt;&lt; 8) | ((arg1 &amp; 0xFF00FF00u) &gt;&gt; 8),
94+
arg1)
95+
</returnValue>
96+
<leak-ignore/>
97+
<const/>
98+
<arg nr="1" direction="in">
99+
<not-uninit/>
100+
<not-bool/>
101+
<valid>0:</valid>
102+
</arg>
103+
</function>
104+
<function name="__builtin_bitreverse32">
105+
<noreturn>false</noreturn>
106+
<use-retval/>
107+
<returnValue type="uint32_t">(arg1 = ((arg1 &amp; 0x55555555ul) &lt;&lt; 1) | ((arg1 &amp; 0xAAAAAAAAul) &gt;&gt; 1),
108+
arg1 = ((arg1 &amp; 0x33333333ul) &lt;&lt; 2) | ((arg1 &amp; 0xCCCCCCCCul) &gt;&gt; 2),
109+
arg1 = ((arg1 &amp; 0x0F0F0F0Ful) &lt;&lt; 4) | ((arg1 &amp; 0xF0F0F0F0ul) &gt;&gt; 4),
110+
arg1 = ((arg1 &amp; 0x00FF00FFul) &lt;&lt; 8) | ((arg1 &amp; 0xFF00FF00ul) &gt;&gt; 8),
111+
arg1 = ((arg1 &amp; 0x0000FFFFul) &lt;&lt; 16) | ((arg1 &amp; 0xFFFF0000ul) &gt;&gt; 16),
112+
arg1)
113+
</returnValue>
114+
<leak-ignore/>
115+
<const/>
116+
<arg nr="1" direction="in">
117+
<not-uninit/>
118+
<not-bool/>
119+
<valid>0:</valid>
120+
</arg>
121+
</function>
122+
<function name="__builtin_bitreverse64">
123+
<noreturn>false</noreturn>
124+
<use-retval/>
125+
<returnValue type="uint64_t">(arg1 = ((arg1 &amp; 0x55555555ull) &lt;&lt; 1) | ((arg1 &amp; 0xAAAAAAAAull) &gt;&gt; 1),
126+
arg1 = ((arg1 &amp; 0x33333333ull) &lt;&lt; 2) | ((arg1 &amp; 0xCCCCCCCCull) &gt;&gt; 2),
127+
arg1 = ((arg1 &amp; 0x0F0F0F0Full) &lt;&lt; 4) | ((arg1 &amp; 0xF0F0F0F0ull) &gt;&gt; 4),
128+
arg1 = ((arg1 &amp; 0x00FF00FFull) &lt;&lt; 8) | ((arg1 &amp; 0xFF00FF00ull) &gt;&gt; 8),
129+
arg1 = ((arg1 &amp; 0x0000FFFFull) &lt;&lt; 16) | ((arg1 &amp; 0xFFFF0000ull) &gt;&gt; 16),
130+
arg1 = ((arg1 &amp; 0x00000000FFFFFFFFull) &lt;&lt; 32) | ((arg1 &amp; 0xFFFFFFFF00000000ull) &gt;&gt; 32),
131+
arg1)
132+
</returnValue>
133+
<leak-ignore/>
134+
<const/>
135+
<arg nr="1" direction="in">
136+
<not-uninit/>
137+
<not-bool/>
138+
<valid>0:</valid>
139+
</arg>
140+
</function>
141+
<define name="__builtin_bit_cast(type,value)" value="std::bit_cast&lt;type&gt;(value)"/>
71142
<!-- https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html -->
72143
<define name="__builtin_alloca(size)" value="alloca(size)"/>
73144
<define name="__builtin_memcpy(dest, source, size)" value="memcpy(dest, source, size)"/>

‎test/cfg/gnu.c‎

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -390,6 +390,23 @@ void valid_code(int argInt1, va_list valist_arg, const int * parg)
390390
// cppcheck-suppress zerodiv
391391
// cppcheck-suppress unreadVariable
392392
i64_1 /= bswap_64(0x023456789abcde0f) - 0x0fdebc9a78563402;
393+
394+
#if __GNUC__ > 16
395+
uint8_t i8_1 = 0;
396+
// cppcheck-suppress zerodiv
397+
// cppcheck-suppress unreadVariable
398+
i8_1 /= __builtin_bitreverse8(1) - 128;
399+
// cppcheck-suppress zerodiv
400+
// cppcheck-suppress unreadVariable
401+
i16_1 /= __builtin_bitreverse16(5) - 40960;
402+
// cppcheck-suppress zerodiv
403+
// cppcheck-suppress unreadVariable
404+
i32_1 /= __builtin_bitreverse32(4294967295) - 4294967295;
405+
// cppcheck-suppress zerodiv
406+
// cppcheck-suppress unreadVariable
407+
i64_1 /= __builtin_bitreverse64(8) - 1152921504606846976;
408+
#endif
409+
393410
#endif
394411
}
395412

0 commit comments

Comments
 (0)