23
23
<div class="contents">
24
<h1>Processor specific optimizations for SSE2 instructions<br/>
24
<h1>Processor specific optimizations for SSE4.2 instructions<br/>
26
[<a class="el" href="a00118.html">BitMagic C++ Library</a>]</small>
26
[<a class="el" href="a00117.html">BitMagic C++ Library</a>]</small>
28
28
<p><div class="dynheader">
29
Collaboration diagram for Processor specific optimizations for SSE2 instructions:</div>
29
Collaboration diagram for Processor specific optimizations for SSE4.2 instructions:</div>
30
30
<div class="dynsection">
31
31
<center><table><tr><td><img src="a00123.png" border="0" alt="" usemap="#a00123_map"/>
32
32
<map name="a00123_map" id="a00123">
33
<area shape="rect" href="a00118.html" title="For more information please visit: http://bmagic.sourceforge.net." alt="" coords="5,5,149,35"/></map></td></tr></table></center>
33
<area shape="rect" href="a00117.html" title="For more information please visit: http://bmagic.sourceforge.net." alt="" coords="5,5,149,35"/></map></td></tr></table></center>
36
36
<table border="0" cellpadding="0" cellspacing="0">
37
<tr><td colspan="2"><h2>Data Structures</h2></td></tr>
38
<tr><td class="memItemLeft" align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00085.html">bm::sse_empty_guard</a></td></tr>
39
<tr><td class="mdescLeft"> </td><td class="mdescRight">SSE2 reinitialization guard class. <a href="a00085.html#_details">More...</a><br/></td></tr>
40
37
<tr><td colspan="2"><h2>Functions</h2></td></tr>
41
<tr><td class="memItemLeft" align="right" valign="top">BMFORCEINLINE void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00123.html#ga75c6ddeb0d8a279caa92341878309b50">bm::sse2_xor_arr_2_mask</a> (__m128i *BMRESTRICT dst, const __m128i *BMRESTRICT src, const __m128i *BMRESTRICT src_end, <a class="el" href="a00116.html#a17fd5ba52db3ddda05e6f8dd5000a1a4">bm::word_t</a> mask)</td></tr>
42
<tr><td class="mdescLeft"> </td><td class="mdescRight">XOR array elements to specified mask dst = *src ^ mask. <a href="#ga75c6ddeb0d8a279caa92341878309b50"></a><br/></td></tr>
43
<tr><td class="memItemLeft" align="right" valign="top">BMFORCEINLINE void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00123.html#gab7b21f448684c4d84927792661e67ed5">bm::sse2_andnot_arr_2_mask</a> (__m128i *BMRESTRICT dst, const __m128i *BMRESTRICT src, const __m128i *BMRESTRICT src_end, <a class="el" href="a00116.html#a17fd5ba52db3ddda05e6f8dd5000a1a4">bm::word_t</a> mask)</td></tr>
44
<tr><td class="mdescLeft"> </td><td class="mdescRight">Inverts array elements and NOT them to specified mask dst = ~*src & mask. <a href="#gab7b21f448684c4d84927792661e67ed5"></a><br/></td></tr>
45
<tr><td class="memItemLeft" align="right" valign="top">BMFORCEINLINE void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00123.html#ga795b544f311409a55da4ee61a3cd939a">bm::sse2_and_arr</a> (__m128i *BMRESTRICT dst, const __m128i *BMRESTRICT src, const __m128i *BMRESTRICT src_end)</td></tr>
46
<tr><td class="mdescLeft"> </td><td class="mdescRight">AND array elements against another array dst &= *src. <a href="#ga795b544f311409a55da4ee61a3cd939a"></a><br/></td></tr>
47
<tr><td class="memItemLeft" align="right" valign="top">BMFORCEINLINE void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00123.html#ga3a7d61e4e8ad8791ab38fd1c3436aa67">bm::sse2_or_arr</a> (__m128i *BMRESTRICT dst, const __m128i *BMRESTRICT src, const __m128i *BMRESTRICT src_end)</td></tr>
48
<tr><td class="mdescLeft"> </td><td class="mdescRight">OR array elements against another array dst |= *src. <a href="#ga3a7d61e4e8ad8791ab38fd1c3436aa67"></a><br/></td></tr>
49
<tr><td class="memItemLeft" align="right" valign="top">BMFORCEINLINE void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00123.html#gaf1a5ad26557cc4d71d7421c35a8445fe">bm::sse2_xor_arr</a> (__m128i *BMRESTRICT dst, const __m128i *BMRESTRICT src, const __m128i *BMRESTRICT src_end)</td></tr>
50
<tr><td class="mdescLeft"> </td><td class="mdescRight">OR array elements against another array dst ^= *src. <a href="#gaf1a5ad26557cc4d71d7421c35a8445fe"></a><br/></td></tr>
51
<tr><td class="memItemLeft" align="right" valign="top">BMFORCEINLINE void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00123.html#gac99f3b138f8a5e8ffb1296b129f618f0">bm::sse2_sub_arr</a> (__m128i *BMRESTRICT dst, const __m128i *BMRESTRICT src, const __m128i *BMRESTRICT src_end)</td></tr>
52
<tr><td class="mdescLeft"> </td><td class="mdescRight">AND-NOT (SUB) array elements against another array dst &= ~*src. <a href="#gac99f3b138f8a5e8ffb1296b129f618f0"></a><br/></td></tr>
53
<tr><td class="memItemLeft" align="right" valign="top">BMFORCEINLINE void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00123.html#ga302f4fcd0abf355957b305d16d04f452">bm::sse2_set_block</a> (__m128i *BMRESTRICT dst, __m128i *BMRESTRICT dst_end, <a class="el" href="a00116.html#a17fd5ba52db3ddda05e6f8dd5000a1a4">bm::word_t</a> value)</td></tr>
54
<tr><td class="mdescLeft"> </td><td class="mdescRight">SSE2 block memset dst = value. <a href="#ga302f4fcd0abf355957b305d16d04f452"></a><br/></td></tr>
55
<tr><td class="memItemLeft" align="right" valign="top">BMFORCEINLINE void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00123.html#ga571dd54af5c555cad9dfa6bef4561777">bm::sse2_copy_block</a> (__m128i *BMRESTRICT dst, const __m128i *BMRESTRICT src, const __m128i *BMRESTRICT src_end)</td></tr>
56
<tr><td class="mdescLeft"> </td><td class="mdescRight">SSE2 block copy dst = *src. <a href="#ga571dd54af5c555cad9dfa6bef4561777"></a><br/></td></tr>
57
<tr><td class="memItemLeft" align="right" valign="top">BMFORCEINLINE void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00123.html#ga8d506147673d88005f92caee7f5dd23a">bm::sse2_invert_arr</a> (<a class="el" href="a00116.html#a17fd5ba52db3ddda05e6f8dd5000a1a4">bm::word_t</a> *first, <a class="el" href="a00116.html#a17fd5ba52db3ddda05e6f8dd5000a1a4">bm::word_t</a> *last)</td></tr>
58
<tr><td class="mdescLeft"> </td><td class="mdescRight">Invert array elements dst = ~*dst or dst ^= *dst. <a href="#ga8d506147673d88005f92caee7f5dd23a"></a><br/></td></tr>
59
<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="a00116.html#aa3824d882a037396370b16f2f0a8bf37">bm::id_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00123.html#ga0f7e0b2eb9ac7b2c6a8cd3b8f15b071f">bm::sse2_bit_count</a> (const __m128i *block, const __m128i *block_end)</td></tr>
38
<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="a00115.html#aa3824d882a037396370b16f2f0a8bf37">bm::id_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00123.html#ga266ed6594dc786e46c1f353443dc41fe">bm::sse4_bit_count</a> (const __m128i *block, const __m128i *block_end)</td></tr>
39
<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="a00115.html#aa3824d882a037396370b16f2f0a8bf37">bm::id_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00123.html#gad686391db4cdc6382ae6785f62981474">bm::sse4_bit_block_calc_count_change</a> (const __m128i *BMRESTRICT block, const __m128i *BMRESTRICT block_end, unsigned *BMRESTRICT bit_count)</td></tr>
61
41
<hr/><h2>Function Documentation</h2>
62
<a class="anchor" id="ga795b544f311409a55da4ee61a3cd939a"></a><!-- doxytag: member="bm::sse2_and_arr" ref="ga795b544f311409a55da4ee61a3cd939a" args="(__m128i *BMRESTRICT dst, const __m128i *BMRESTRICT src, const __m128i *BMRESTRICT src_end)" -->
64
<div class="memproto">
65
<table class="memname">
67
<td class="memname">BMFORCEINLINE void bm::sse2_and_arr </td>
69
<td class="paramtype">__m128i *BMRESTRICT </td>
70
<td class="paramname"> <em>dst</em>, </td>
73
<td class="paramkey"></td>
75
<td class="paramtype">const __m128i *BMRESTRICT </td>
76
<td class="paramname"> <em>src</em>, </td>
79
<td class="paramkey"></td>
81
<td class="paramtype">const __m128i *BMRESTRICT </td>
82
<td class="paramname"> <em>src_end</em></td><td> </td>
87
<td></td><td></td><td></td>
93
<p>AND array elements against another array dst &= *src. </p>
95
<p>Definition at line <a class="el" href="a00100_source.html#l00126">126</a> of file <a class="el" href="a00100_source.html">bmsse_util.h</a>.</p>
99
<a class="anchor" id="gab7b21f448684c4d84927792661e67ed5"></a><!-- doxytag: member="bm::sse2_andnot_arr_2_mask" ref="gab7b21f448684c4d84927792661e67ed5" args="(__m128i *BMRESTRICT dst, const __m128i *BMRESTRICT src, const __m128i *BMRESTRICT src_end, bm::word_t mask)" -->
100
<div class="memitem">
101
<div class="memproto">
102
<table class="memname">
104
<td class="memname">BMFORCEINLINE void bm::sse2_andnot_arr_2_mask </td>
106
<td class="paramtype">__m128i *BMRESTRICT </td>
107
<td class="paramname"> <em>dst</em>, </td>
110
<td class="paramkey"></td>
112
<td class="paramtype">const __m128i *BMRESTRICT </td>
113
<td class="paramname"> <em>src</em>, </td>
116
<td class="paramkey"></td>
118
<td class="paramtype">const __m128i *BMRESTRICT </td>
119
<td class="paramname"> <em>src_end</em>, </td>
122
<td class="paramkey"></td>
124
<td class="paramtype"><a class="el" href="a00116.html#a17fd5ba52db3ddda05e6f8dd5000a1a4">bm::word_t</a> </td>
125
<td class="paramname"> <em>mask</em></td><td> </td>
130
<td></td><td></td><td></td>
136
<p>Inverts array elements and NOT them to specified mask dst = ~*src & mask. </p>
138
<p>Definition at line <a class="el" href="a00100_source.html#l00098">98</a> of file <a class="el" href="a00100_source.html">bmsse_util.h</a>.</p>
142
<a class="anchor" id="ga0f7e0b2eb9ac7b2c6a8cd3b8f15b071f"></a><!-- doxytag: member="bm::sse2_bit_count" ref="ga0f7e0b2eb9ac7b2c6a8cd3b8f15b071f" args="(const __m128i *block, const __m128i *block_end)" -->
143
<div class="memitem">
144
<div class="memproto">
145
<table class="memname">
147
<td class="memname"><a class="el" href="a00116.html#aa3824d882a037396370b16f2f0a8bf37">bm::id_t</a> bm::sse2_bit_count </td>
42
<a class="anchor" id="gad686391db4cdc6382ae6785f62981474"></a><!-- doxytag: member="bm::sse4_bit_block_calc_count_change" ref="gad686391db4cdc6382ae6785f62981474" args="(const __m128i *BMRESTRICT block, const __m128i *BMRESTRICT block_end, unsigned *BMRESTRICT bit_count)" -->
44
<div class="memproto">
45
<table class="memname">
47
<td class="memname"><a class="el" href="a00115.html#aa3824d882a037396370b16f2f0a8bf37">bm::id_t</a> bm::sse4_bit_block_calc_count_change </td>
49
<td class="paramtype">const __m128i *BMRESTRICT </td>
50
<td class="paramname"> <em>block</em>, </td>
53
<td class="paramkey"></td>
55
<td class="paramtype">const __m128i *BMRESTRICT </td>
56
<td class="paramname"> <em>block_end</em>, </td>
59
<td class="paramkey"></td>
61
<td class="paramtype">unsigned *BMRESTRICT </td>
62
<td class="paramname"> <em>bit_count</em></td><td> </td>
67
<td></td><td></td><td><code> [inline]</code></td>
72
<p>SSE4.2 optimized bitcounting and number of GAPs </p>
74
<p>Definition at line <a class="el" href="a00098_source.html#l00248">248</a> of file <a class="el" href="a00098_source.html">bmsse4.h</a>.</p>
76
<p>Referenced by <a class="el" href="a00093_source.html#l02864">bm::bit_block_calc_count_change()</a>.</p>
80
<a class="anchor" id="ga266ed6594dc786e46c1f353443dc41fe"></a><!-- doxytag: member="bm::sse4_bit_count" ref="ga266ed6594dc786e46c1f353443dc41fe" args="(const __m128i *block, const __m128i *block_end)" -->
82
<div class="memproto">
83
<table class="memname">
85
<td class="memname"><a class="el" href="a00115.html#aa3824d882a037396370b16f2f0a8bf37">bm::id_t</a> bm::sse4_bit_count </td>
149
87
<td class="paramtype">const __m128i * </td>
150
88
<td class="paramname"> <em>block</em>, </td>
165
103
<div class="memdoc">
166
<p>SSE2 optimized bitcounting function implements parallel bitcounting algorithm for SSE2 instruction set.</p>
168
unsigned CalcBitCount32(unsigned b)
170
b = (b & 0x55555555) + (b >> 1 & 0x55555555);
171
b = (b & 0x33333333) + (b >> 2 & 0x33333333);
172
b = (b + (b >> 4)) & 0x0F0F0F0F;
173
b = b + (b >> 8);
174
b = (b + (b >> 16)) & 0x0000003F;
178
<p>Definition at line <a class="el" href="a00098_source.html#l00064">64</a> of file <a class="el" href="a00098_source.html">bmsse2.h</a>.</p>
180
<p>References <a class="el" href="a00093_source.html#l00153">BM_ALIGN16ATTR</a>.</p>
184
<a class="anchor" id="ga571dd54af5c555cad9dfa6bef4561777"></a><!-- doxytag: member="bm::sse2_copy_block" ref="ga571dd54af5c555cad9dfa6bef4561777" args="(__m128i *BMRESTRICT dst, const __m128i *BMRESTRICT src, const __m128i *BMRESTRICT src_end)" -->
185
<div class="memitem">
186
<div class="memproto">
187
<table class="memname">
189
<td class="memname">BMFORCEINLINE void bm::sse2_copy_block </td>
191
<td class="paramtype">__m128i *BMRESTRICT </td>
192
<td class="paramname"> <em>dst</em>, </td>
195
<td class="paramkey"></td>
197
<td class="paramtype">const __m128i *BMRESTRICT </td>
198
<td class="paramname"> <em>src</em>, </td>
201
<td class="paramkey"></td>
203
<td class="paramtype">const __m128i *BMRESTRICT </td>
204
<td class="paramname"> <em>src_end</em></td><td> </td>
209
<td></td><td></td><td></td>
215
<p>SSE2 block copy dst = *src. </p>
217
<p>Definition at line <a class="el" href="a00100_source.html#l00322">322</a> of file <a class="el" href="a00100_source.html">bmsse_util.h</a>.</p>
221
<a class="anchor" id="ga8d506147673d88005f92caee7f5dd23a"></a><!-- doxytag: member="bm::sse2_invert_arr" ref="ga8d506147673d88005f92caee7f5dd23a" args="(bm::word_t *first, bm::word_t *last)" -->
222
<div class="memitem">
223
<div class="memproto">
224
<table class="memname">
226
<td class="memname">BMFORCEINLINE void bm::sse2_invert_arr </td>
228
<td class="paramtype"><a class="el" href="a00116.html#a17fd5ba52db3ddda05e6f8dd5000a1a4">bm::word_t</a> * </td>
229
<td class="paramname"> <em>first</em>, </td>
232
<td class="paramkey"></td>
234
<td class="paramtype"><a class="el" href="a00116.html#a17fd5ba52db3ddda05e6f8dd5000a1a4">bm::word_t</a> * </td>
235
<td class="paramname"> <em>last</em></td><td> </td>
240
<td></td><td></td><td></td>
246
<p>Invert array elements dst = ~*dst or dst ^= *dst. </p>
248
<p>Definition at line <a class="el" href="a00100_source.html#l00366">366</a> of file <a class="el" href="a00100_source.html">bmsse_util.h</a>.</p>
252
<a class="anchor" id="ga3a7d61e4e8ad8791ab38fd1c3436aa67"></a><!-- doxytag: member="bm::sse2_or_arr" ref="ga3a7d61e4e8ad8791ab38fd1c3436aa67" args="(__m128i *BMRESTRICT dst, const __m128i *BMRESTRICT src, const __m128i *BMRESTRICT src_end)" -->
253
<div class="memitem">
254
<div class="memproto">
255
<table class="memname">
257
<td class="memname">BMFORCEINLINE void bm::sse2_or_arr </td>
259
<td class="paramtype">__m128i *BMRESTRICT </td>
260
<td class="paramname"> <em>dst</em>, </td>
263
<td class="paramkey"></td>
265
<td class="paramtype">const __m128i *BMRESTRICT </td>
266
<td class="paramname"> <em>src</em>, </td>
269
<td class="paramkey"></td>
271
<td class="paramtype">const __m128i *BMRESTRICT </td>
272
<td class="paramname"> <em>src_end</em></td><td> </td>
277
<td></td><td></td><td></td>
283
<p>OR array elements against another array dst |= *src. </p>
285
<p>Definition at line <a class="el" href="a00100_source.html#l00167">167</a> of file <a class="el" href="a00100_source.html">bmsse_util.h</a>.</p>
289
<a class="anchor" id="ga302f4fcd0abf355957b305d16d04f452"></a><!-- doxytag: member="bm::sse2_set_block" ref="ga302f4fcd0abf355957b305d16d04f452" args="(__m128i *BMRESTRICT dst, __m128i *BMRESTRICT dst_end, bm::word_t value)" -->
290
<div class="memitem">
291
<div class="memproto">
292
<table class="memname">
294
<td class="memname">BMFORCEINLINE void bm::sse2_set_block </td>
296
<td class="paramtype">__m128i *BMRESTRICT </td>
297
<td class="paramname"> <em>dst</em>, </td>
300
<td class="paramkey"></td>
302
<td class="paramtype">__m128i *BMRESTRICT </td>
303
<td class="paramname"> <em>dst_end</em>, </td>
306
<td class="paramkey"></td>
308
<td class="paramtype"><a class="el" href="a00116.html#a17fd5ba52db3ddda05e6f8dd5000a1a4">bm::word_t</a> </td>
309
<td class="paramname"> <em>value</em></td><td> </td>
314
<td></td><td></td><td></td>
320
<p>SSE2 block memset dst = value. </p>
322
<p>Definition at line <a class="el" href="a00100_source.html#l00288">288</a> of file <a class="el" href="a00100_source.html">bmsse_util.h</a>.</p>
326
<a class="anchor" id="gac99f3b138f8a5e8ffb1296b129f618f0"></a><!-- doxytag: member="bm::sse2_sub_arr" ref="gac99f3b138f8a5e8ffb1296b129f618f0" args="(__m128i *BMRESTRICT dst, const __m128i *BMRESTRICT src, const __m128i *BMRESTRICT src_end)" -->
327
<div class="memitem">
328
<div class="memproto">
329
<table class="memname">
331
<td class="memname">BMFORCEINLINE void bm::sse2_sub_arr </td>
333
<td class="paramtype">__m128i *BMRESTRICT </td>
334
<td class="paramname"> <em>dst</em>, </td>
337
<td class="paramkey"></td>
339
<td class="paramtype">const __m128i *BMRESTRICT </td>
340
<td class="paramname"> <em>src</em>, </td>
343
<td class="paramkey"></td>
345
<td class="paramtype">const __m128i *BMRESTRICT </td>
346
<td class="paramname"> <em>src_end</em></td><td> </td>
351
<td></td><td></td><td></td>
357
<p>AND-NOT (SUB) array elements against another array dst &= ~*src. </p>
359
<p>Definition at line <a class="el" href="a00100_source.html#l00248">248</a> of file <a class="el" href="a00100_source.html">bmsse_util.h</a>.</p>
363
<a class="anchor" id="gaf1a5ad26557cc4d71d7421c35a8445fe"></a><!-- doxytag: member="bm::sse2_xor_arr" ref="gaf1a5ad26557cc4d71d7421c35a8445fe" args="(__m128i *BMRESTRICT dst, const __m128i *BMRESTRICT src, const __m128i *BMRESTRICT src_end)" -->
364
<div class="memitem">
365
<div class="memproto">
366
<table class="memname">
368
<td class="memname">BMFORCEINLINE void bm::sse2_xor_arr </td>
370
<td class="paramtype">__m128i *BMRESTRICT </td>
371
<td class="paramname"> <em>dst</em>, </td>
374
<td class="paramkey"></td>
376
<td class="paramtype">const __m128i *BMRESTRICT </td>
377
<td class="paramname"> <em>src</em>, </td>
380
<td class="paramkey"></td>
382
<td class="paramtype">const __m128i *BMRESTRICT </td>
383
<td class="paramname"> <em>src_end</em></td><td> </td>
388
<td></td><td></td><td></td>
394
<p>OR array elements against another array dst ^= *src. </p>
396
<p>Definition at line <a class="el" href="a00100_source.html#l00207">207</a> of file <a class="el" href="a00100_source.html">bmsse_util.h</a>.</p>
400
<a class="anchor" id="ga75c6ddeb0d8a279caa92341878309b50"></a><!-- doxytag: member="bm::sse2_xor_arr_2_mask" ref="ga75c6ddeb0d8a279caa92341878309b50" args="(__m128i *BMRESTRICT dst, const __m128i *BMRESTRICT src, const __m128i *BMRESTRICT src_end, bm::word_t mask)" -->
401
<div class="memitem">
402
<div class="memproto">
403
<table class="memname">
405
<td class="memname">BMFORCEINLINE void bm::sse2_xor_arr_2_mask </td>
407
<td class="paramtype">__m128i *BMRESTRICT </td>
408
<td class="paramname"> <em>dst</em>, </td>
411
<td class="paramkey"></td>
413
<td class="paramtype">const __m128i *BMRESTRICT </td>
414
<td class="paramname"> <em>src</em>, </td>
417
<td class="paramkey"></td>
419
<td class="paramtype">const __m128i *BMRESTRICT </td>
420
<td class="paramname"> <em>src_end</em>, </td>
423
<td class="paramkey"></td>
425
<td class="paramtype"><a class="el" href="a00116.html#a17fd5ba52db3ddda05e6f8dd5000a1a4">bm::word_t</a> </td>
426
<td class="paramname"> <em>mask</em></td><td> </td>
431
<td></td><td></td><td></td>
437
<p>XOR array elements to specified mask dst = *src ^ mask. </p>
439
<p>Definition at line <a class="el" href="a00100_source.html#l00072">72</a> of file <a class="el" href="a00100_source.html">bmsse_util.h</a>.</p>
444
<hr size="1"/><address style="text-align: right;"><small>Generated on Tue Mar 23 20:48:07 2010 for BitMagic by
104
<p>SSE4.2 optimized bitcounting . </p>
106
<p>Definition at line <a class="el" href="a00098_source.html#l00055">55</a> of file <a class="el" href="a00098_source.html">bmsse4.h</a>.</p>
111
<hr size="1"/><address style="text-align: right;"><small>Generated on Sun Apr 25 09:37:39 2010 for BitMagic by
445
112
<a href="http://www.doxygen.org/index.html">
446
113
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>