ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/libecb/ecb.pod
(Generate patch)

Comparing libecb/ecb.pod (file contents):
Revision 1.23 by sf-exg, Fri May 27 01:35:46 2011 UTC vs.
Revision 1.44 by root, Tue May 29 14:30:44 2012 UTC

15It mainly provides a number of wrappers around GCC built-ins, together 15It mainly provides a number of wrappers around GCC built-ins, together
16with replacement functions for other compilers. In addition to this, 16with replacement functions for other compilers. In addition to this,
17it provides a number of other lowlevel C utilities, such as endianness 17it provides a number of other lowlevel C utilities, such as endianness
18detection, byte swapping or bit rotations. 18detection, byte swapping or bit rotations.
19 19
20Or in other words, things that should be built-in into any standard C 20Or in other words, things that should be built into any standard C system,
21system, but aren't. 21but aren't, implemented as efficient as possible with GCC, and still
22correct with other compilers.
22 23
23More might come. 24More might come.
24 25
25=head2 ABOUT THE HEADER 26=head2 ABOUT THE HEADER
26 27
53only a generic name is used (C<expr>, C<cond>, C<value> and so on), then 54only a generic name is used (C<expr>, C<cond>, C<value> and so on), then
54the corresponding function relies on C to implement the correct types, and 55the corresponding function relies on C to implement the correct types, and
55is usually implemented as a macro. Specifically, a "bool" in this manual 56is usually implemented as a macro. Specifically, a "bool" in this manual
56refers to any kind of boolean value, not a specific type. 57refers to any kind of boolean value, not a specific type.
57 58
59=head2 TYPES / TYPE SUPPORT
60
61ecb.h makes sure that the following types are defined (in the expected way):
62
63 int8_t uint8_t int16_t uint16_t
64 int32_t uint32_t int64_t uint64_t
65 intptr_t uintptr_t ptrdiff_t
66
67The macro C<ECB_PTRSIZE> is defined to the size of a pointer on this
68platform (currently C<4> or C<8>).
69
70=head2 LANGUAGE/COMPILER VERSIONS
71
72All the following symbols expand to an expressionb that cna be tested in
73preprocessor instructions as well as treated as a boolean (use C<!!> to
74ensure it's either C<0> or C<1> if you need that).
75
76=over 4
77
78=item ECB_C
79
80True if the implementation defines the C<__STDC__> macro to a true value,
81which is typically true for both C and C++ compilers.
82
83=item ECB_C99
84
85True if the implementation claims to be C99 compliant.
86
87=item ECB_C11
88
89True if the implementation claims to be C11 compliant.
90
91=item ECB_CPP
92
93True if the implementation defines the C<__cplusplus__> macro to a true
94value, which is typically true for C++ compilers.
95
96=item ECB_CPP98
97
98True if the implementation claims to be compliant to ISO/IEC 14882:1998
99(the first C++ ISO standard) or any later vwersion. Typically true for all
100C++ compilers.
101
102=item ECB_CPP11
103
104True if the implementation claims to be compliant to ISO/IEC 14882:2011
105(C++11) or any later vwersion.
106
107=item ECB_GCC_VERSION(major,minor)
108
109Expands to a true value (suitable for testing in by the preprocessor)
110if the compiler used is GNU C and the version is the givne version, or
111higher.
112
113This macro tries to return false on compilers that claim to be GCC
114compatible but aren't.
115
116=back
117
58=head2 GCC ATTRIBUTES 118=head2 GCC ATTRIBUTES
59 119
60A major part of libecb deals with GCC attributes. These are additional 120A major part of libecb deals with GCC attributes. These are additional
61attributes that you cna assign to functions, variables and sometimes even 121attributes that you can assign to functions, variables and sometimes even
62types - much like C<const> or C<volatile> in C. 122types - much like C<const> or C<volatile> in C.
63 123
64While GCC allows declarations to show up in many surprising places, 124While GCC allows declarations to show up in many surprising places,
65but not in many expeted places, the safest way is to put attribute 125but not in many expected places, the safest way is to put attribute
66declarations before the whole declaration: 126declarations before the whole declaration:
67 127
68 ecb_const int mysqrt (int a); 128 ecb_const int mysqrt (int a);
69 ecb_unused int i; 129 ecb_unused int i;
70 130
100 #else 160 #else
101 return 0; 161 return 0;
102 #endif 162 #endif
103 } 163 }
104 164
165=item ecb_inline
166
167This is not actually an attribute, but you use it like one. It expands
168either to C<static inline> or to just C<static>, if inline isn't
169supported. It should be used to declare functions that should be inlined,
170for code size or speed reasons.
171
172Example: inline this function, it surely will reduce codesize.
173
174 ecb_inline int
175 negmul (int a, int b)
176 {
177 return - (a * b);
178 }
179
105=item ecb_noinline 180=item ecb_noinline
106 181
107Prevent a function from being inlined - it might be optimised away, but 182Prevent a function from being inlined - it might be optimised away, but
108not inlined into other functions. This is useful if you know your function 183not inlined into other functions. This is useful if you know your function
109is rarely called and large enough for inlining not to be helpful. 184is rarely called and large enough for inlining not to be helpful.
183 258
184In addition to placing cold functions together (or at least away from hot 259In addition to placing cold functions together (or at least away from hot
185functions), this knowledge can be used in other ways, for example, the 260functions), this knowledge can be used in other ways, for example, the
186function will be optimised for size, as opposed to speed, and codepaths 261function will be optimised for size, as opposed to speed, and codepaths
187leading to calls to those functions can automatically be marked as if 262leading to calls to those functions can automatically be marked as if
188C<ecb_unlikely> had been used to reach them. 263C<ecb_expect_false> had been used to reach them.
189 264
190Good examples for such functions would be error reporting functions, or 265Good examples for such functions would be error reporting functions, or
191functions only called in exceptional or rare cases. 266functions only called in exceptional or rare cases.
192 267
193=item ecb_artificial 268=item ecb_artificial
255 330
256Evaluates C<expr> and returns it. In addition, it tells the compiler that 331Evaluates C<expr> and returns it. In addition, it tells the compiler that
257the C<expr> evaluates to C<value> a lot, which can be used for static 332the C<expr> evaluates to C<value> a lot, which can be used for static
258branch optimisations. 333branch optimisations.
259 334
260Usually, you want to use the more intuitive C<ecb_likely> and 335Usually, you want to use the more intuitive C<ecb_expect_true> and
261C<ecb_unlikely> functions instead. 336C<ecb_expect_false> functions instead.
262 337
338=item bool ecb_expect_true (cond)
339
263=item bool ecb_likely (cond) 340=item bool ecb_expect_false (cond)
264
265=item bool ecb_unlikely (cond)
266 341
267These two functions expect a expression that is true or false and return 342These two functions expect a expression that is true or false and return
268C<1> or C<0>, respectively, so when used in the condition of an C<if> or 343C<1> or C<0>, respectively, so when used in the condition of an C<if> or
269other conditional statement, it will not change the program: 344other conditional statement, it will not change the program:
270 345
271 /* these two do the same thing */ 346 /* these two do the same thing */
272 if (some_condition) ...; 347 if (some_condition) ...;
273 if (ecb_likely (some_condition)) ...; 348 if (ecb_expect_true (some_condition)) ...;
274 349
275However, by using C<ecb_likely>, you tell the compiler that the condition 350However, by using C<ecb_expect_true>, you tell the compiler that the
276is likely to be true (and for C<ecb_unlikely>, that it is unlikely to be 351condition is likely to be true (and for C<ecb_expect_false>, that it is
277true). 352unlikely to be true).
278 353
279For example, when you check for a null pointer and expect this to be a 354For example, when you check for a null pointer and expect this to be a
280rare, exceptional, case, then use C<ecb_unlikely>: 355rare, exceptional, case, then use C<ecb_expect_false>:
281 356
282 void my_free (void *ptr) 357 void my_free (void *ptr)
283 { 358 {
284 if (ecb_unlikely (ptr == 0)) 359 if (ecb_expect_false (ptr == 0))
285 return; 360 return;
286 } 361 }
287 362
288Consequent use of these functions to mark away exceptional cases or to 363Consequent use of these functions to mark away exceptional cases or to
289tell the compiler what the hot path through a function is can increase 364tell the compiler what the hot path through a function is can increase
290performance considerably. 365performance considerably.
366
367You might know these functions under the name C<likely> and C<unlikely>
368- while these are common aliases, we find that the expect name is easier
369to understand when quickly skimming code. If you wish, you can use
370C<ecb_likely> instead of C<ecb_expect_true> and C<ecb_unlikely> instead of
371C<ecb_expect_false> - these are simply aliases.
291 372
292A very good example is in a function that reserves more space for some 373A very good example is in a function that reserves more space for some
293memory block (for example, inside an implementation of a string stream) - 374memory block (for example, inside an implementation of a string stream) -
294each time something is added, you have to check for a buffer overrun, but 375each time something is added, you have to check for a buffer overrun, but
295you expect that most checks will turn out to be false: 376you expect that most checks will turn out to be false:
296 377
297 /* make sure we have "size" extra room in our buffer */ 378 /* make sure we have "size" extra room in our buffer */
298 ecb_inline void 379 ecb_inline void
299 reserve (int size) 380 reserve (int size)
300 { 381 {
301 if (ecb_unlikely (current + size > end)) 382 if (ecb_expect_false (current + size > end))
302 real_reserve_method (size); /* presumably noinline */ 383 real_reserve_method (size); /* presumably noinline */
303 } 384 }
304 385
305=item bool ecb_assume (cond) 386=item bool ecb_assume (cond)
306 387
309 390
310This can be used to teach the compiler about invariants or other 391This can be used to teach the compiler about invariants or other
311conditions that might improve code generation, but which are impossible to 392conditions that might improve code generation, but which are impossible to
312deduce form the code itself. 393deduce form the code itself.
313 394
314For example, the example reservation function from the C<ecb_unlikely> 395For example, the example reservation function from the C<ecb_expect_false>
315description could be written thus (only C<ecb_assume> was added): 396description could be written thus (only C<ecb_assume> was added):
316 397
317 ecb_inline void 398 ecb_inline void
318 reserve (int size) 399 reserve (int size)
319 { 400 {
320 if (ecb_unlikely (current + size > end)) 401 if (ecb_expect_false (current + size > end))
321 real_reserve_method (size); /* presumably noinline */ 402 real_reserve_method (size); /* presumably noinline */
322 403
323 ecb_assume (current + size <= end); 404 ecb_assume (current + size <= end);
324 } 405 }
325 406
374After processing the node, (part of) the next node might already be in 455After processing the node, (part of) the next node might already be in
375cache. 456cache.
376 457
377=back 458=back
378 459
379=head2 BIT FIDDLING / BITSTUFFS 460=head2 BIT FIDDLING / BIT WIZARDRY
380 461
381=over 4 462=over 4
382 463
383=item bool ecb_big_endian () 464=item bool ecb_big_endian ()
384 465
386 467
387These two functions return true if the byte order is big endian 468These two functions return true if the byte order is big endian
388(most-significant byte first) or little endian (least-significant byte 469(most-significant byte first) or little endian (least-significant byte
389first) respectively. 470first) respectively.
390 471
472On systems that are neither, their return values are unspecified.
473
391=item int ecb_ctz32 (uint32_t x) 474=item int ecb_ctz32 (uint32_t x)
392 475
476=item int ecb_ctz64 (uint64_t x)
477
393Returns the index of the least significant bit set in C<x> (or 478Returns the index of the least significant bit set in C<x> (or
394equivalently the number of bits set to 0 before the least significant 479equivalently the number of bits set to 0 before the least significant bit
395bit set), starting from 0. If C<x> is 0 the result is undefined. A 480set), starting from 0. If C<x> is 0 the result is undefined.
396common use case is to compute the integer binary logarithm, i.e., 481
397floor(log2(n)). For example: 482For smaller types than C<uint32_t> you can safely use C<ecb_ctz32>.
483
484For example:
398 485
399 ecb_ctz32 (3) = 0 486 ecb_ctz32 (3) = 0
400 ecb_ctz32 (6) = 1 487 ecb_ctz32 (6) = 1
401 488
489=item bool ecb_is_pot32 (uint32_t x)
490
491=item bool ecb_is_pot64 (uint32_t x)
492
493Return true iff C<x> is a power of two or C<x == 0>.
494
495For smaller types then C<uint32_t> you can safely use C<ecb_is_pot32>.
496
497=item int ecb_ld32 (uint32_t x)
498
499=item int ecb_ld64 (uint64_t x)
500
501Returns the index of the most significant bit set in C<x>, or the number
502of digits the number requires in binary (so that C<< 2**ld <= x <
5032**(ld+1) >>). If C<x> is 0 the result is undefined. A common use case is
504to compute the integer binary logarithm, i.e. C<floor (log2 (n))>, for
505example to see how many bits a certain number requires to be encoded.
506
507This function is similar to the "count leading zero bits" function, except
508that that one returns how many zero bits are "in front" of the number (in
509the given data type), while C<ecb_ld> returns how many bits the number
510itself requires.
511
512For smaller types than C<uint32_t> you can safely use C<ecb_ld32>.
513
402=item int ecb_popcount32 (uint32_t x) 514=item int ecb_popcount32 (uint32_t x)
403 515
516=item int ecb_popcount64 (uint64_t x)
517
404Returns the number of bits set to 1 in C<x>. For example: 518Returns the number of bits set to 1 in C<x>.
519
520For smaller types than C<uint32_t> you can safely use C<ecb_popcount32>.
521
522For example:
405 523
406 ecb_popcount32 (7) = 3 524 ecb_popcount32 (7) = 3
407 ecb_popcount32 (255) = 8 525 ecb_popcount32 (255) = 8
408 526
527=item uint8_t ecb_bitrev8 (uint8_t x)
528
529=item uint16_t ecb_bitrev16 (uint16_t x)
530
531=item uint32_t ecb_bitrev32 (uint32_t x)
532
533Reverses the bits in x, i.e. the MSB becomes the LSB, MSB-1 becomes LSB+1
534and so on.
535
536Example:
537
538 ecb_bitrev8 (0xa7) = 0xea
539 ecb_bitrev32 (0xffcc4411) = 0x882233ff
540
409=item uint32_t ecb_bswap16 (uint32_t x) 541=item uint32_t ecb_bswap16 (uint32_t x)
410 542
411=item uint32_t ecb_bswap32 (uint32_t x) 543=item uint32_t ecb_bswap32 (uint32_t x)
412 544
545=item uint64_t ecb_bswap64 (uint64_t x)
546
413These two functions return the value of the 16-bit (32-bit) value C<x> 547These functions return the value of the 16-bit (32-bit, 64-bit) value
414after reversing the order of bytes (0x11223344 becomes 0x44332211). 548C<x> after reversing the order of bytes (0x11223344 becomes 0x44332211 in
549C<ecb_bswap32>).
550
551=item uint8_t ecb_rotl8 (uint8_t x, unsigned int count)
552
553=item uint16_t ecb_rotl16 (uint16_t x, unsigned int count)
554
555=item uint32_t ecb_rotl32 (uint32_t x, unsigned int count)
556
557=item uint64_t ecb_rotl64 (uint64_t x, unsigned int count)
558
559=item uint8_t ecb_rotr8 (uint8_t x, unsigned int count)
560
561=item uint16_t ecb_rotr16 (uint16_t x, unsigned int count)
415 562
416=item uint32_t ecb_rotr32 (uint32_t x, unsigned int count) 563=item uint32_t ecb_rotr32 (uint32_t x, unsigned int count)
417 564
418=item uint32_t ecb_rotl32 (uint32_t x, unsigned int count) 565=item uint64_t ecb_rotr64 (uint64_t x, unsigned int count)
419 566
420These two functions return the value of C<x> after rotating all the bits 567These two families of functions return the value of C<x> after rotating
421by C<count> positions to the right or left respectively. 568all the bits by C<count> positions to the right (C<ecb_rotr>) or left
569(C<ecb_rotl>).
422 570
423Current GCC versions understand these functions and usually compile them 571Current GCC versions understand these functions and usually compile them
424to "optimal" code (e.g. a single C<roll> on x86). 572to "optimal" code (e.g. a single C<rol> or a combination of C<shld> on
573x86).
425 574
426=back 575=back
427 576
428=head2 ARITHMETIC 577=head2 ARITHMETIC
429 578
430=over 4 579=over 4
431 580
432=item x = ecb_mod (m, n) 581=item x = ecb_mod (m, n)
433 582
434Returns the positive remainder of the modulo operation between C<m> and 583Returns C<m> modulo C<n>, which is the same as the positive remainder
584of the division operation between C<m> and C<n>, using floored
435C<n>. Unlike the C modulo operator C<%>, this function ensures that the 585division. Unlike the C remainder operator C<%>, this function ensures that
436return value is always positive - ISO C guarantees very little when 586the return value is always positive and that the two numbers I<m> and
437negative numbers are used with C<%>. 587I<m' = m + i * n> result in the same value modulo I<n> - in other words,
588C<ecb_mod> implements the mathematical modulo operation, which is missing
589in the language.
438 590
439C<n> must be strictly positive (i.e. C<< >= 1 >>), while C<m> must be 591C<n> must be strictly positive (i.e. C<< >= 1 >>), while C<m> must be
440negatable, that is, both C<m> and C<-m> must be representable in its 592negatable, that is, both C<m> and C<-m> must be representable in its
441type. 593type (this typically excludes the minimum signed integer value, the same
594limitation as for C</> and C<%> in C).
595
596Current GCC versions compile this into an efficient branchless sequence on
597almost all CPUs.
598
599For example, when you want to rotate forward through the members of an
600array for increasing C<m> (which might be negative), then you should use
601C<ecb_mod>, as the C<%> operator might give either negative results, or
602change direction for negative values:
603
604 for (m = -100; m <= 100; ++m)
605 int elem = myarray [ecb_mod (m, ecb_array_length (myarray))];
606
607=item x = ecb_div_rd (val, div)
608
609=item x = ecb_div_ru (val, div)
610
611Returns C<val> divided by C<div> rounded down or up, respectively.
612C<val> and C<div> must have integer types and C<div> must be strictly
613positive. Note that these functions are implemented with macros in C
614and with function templates in C++.
442 615
443=back 616=back
444 617
445=head2 UTILITY 618=head2 UTILITY
446 619
456 for (i = 0; i < ecb_array_length (primes); i++) 629 for (i = 0; i < ecb_array_length (primes); i++)
457 sum += primes [i]; 630 sum += primes [i];
458 631
459=back 632=back
460 633
634=head2 SYMBOLS GOVERNING COMPILATION OF ECB.H ITSELF
461 635
636These symbols need to be defined before including F<ecb.h> the first time.
637
638=over 4
639
640=item ECB_NO_THRADS
641
642If F<ecb.h> is never used from multiple threads, then this symbol can
643be defined, in which case memory fences (and similar constructs) are
644completely removed, leading to more efficient code and fewer dependencies.
645
646Setting this symbol to a true value implies C<ECB_NO_SMP>.
647
648=item ECB_NO_SMP
649
650The weaker version of C<ECB_NO_THREADS> - if F<ecb.h> is used from
651multiple threads, but never concurrently (e.g. if the system the program
652runs on has only a single CPU with a single core, no hyperthreading and so
653on), then this symbol can be defined, leading to more efficient code and
654fewer dependencies.
655
656=back
657
658

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines