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

Comparing cvsroot/libecb/ecb.pod (file contents):
Revision 1.17 by root, Thu May 26 23:55:58 2011 UTC vs.
Revision 1.47 by root, Tue May 29 16:51:24 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 isn'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>) and can be used in preprocessor
69expressions.
70
71=head2 LANGUAGE/COMPILER VERSIONS
72
73All the following symbols expand to an expression that can be tested in
74preprocessor instructions as well as treated as a boolean (use C<!!> to
75ensure it's either C<0> or C<1> if you need that).
76
77=over 4
78
79=item ECB_C
80
81True if the implementation defines the C<__STDC__> macro to a true value,
82which is typically true for both C and C++ compilers.
83
84=item ECB_C99
85
86True if the implementation claims to be compliant to C99 (ISO/IEC
879899:1999) or any later version.
88
89Note that later versions (ECB_C11) remove core features again (for
90example, variable length arrays).
91
92=item ECB_C11
93
94True if the implementation claims to be compliant to C11 (ISO/IEC
959899:2011) or any later version.
96
97=item ECB_CPP
98
99True if the implementation defines the C<__cplusplus__> macro to a true
100value, which is typically true for C++ compilers.
101
102=item ECB_CPP98
103
104True if the implementation claims to be compliant to ISO/IEC 14882:1998
105(the first C++ ISO standard) or any later version. Typically true for all
106C++ compilers.
107
108=item ECB_CPP11
109
110True if the implementation claims to be compliant to ISO/IEC 14882:2011
111(C++11) or any later version.
112
113=item ECB_GCC_VERSION(major,minor)
114
115Expands to a true value (suitable for testing in by the preprocessor)
116if the compiler used is GNU C and the version is the given version, or
117higher.
118
119This macro tries to return false on compilers that claim to be GCC
120compatible but aren't.
121
122=back
123
58=head2 GCC ATTRIBUTES 124=head2 GCC ATTRIBUTES
59 125
60blabla where to put, what others 126A major part of libecb deals with GCC attributes. These are additional
127attributes that you can assign to functions, variables and sometimes even
128types - much like C<const> or C<volatile> in C.
129
130While GCC allows declarations to show up in many surprising places,
131but not in many expected places, the safest way is to put attribute
132declarations before the whole declaration:
133
134 ecb_const int mysqrt (int a);
135 ecb_unused int i;
136
137For variables, it is often nicer to put the attribute after the name, and
138avoid multiple declarations using commas:
139
140 int i ecb_unused;
61 141
62=over 4 142=over 4
63 143
64=item ecb_attribute ((attrs...)) 144=item ecb_attribute ((attrs...))
65 145
86 #else 166 #else
87 return 0; 167 return 0;
88 #endif 168 #endif
89 } 169 }
90 170
171=item ecb_inline
172
173This is not actually an attribute, but you use it like one. It expands
174either to C<static inline> or to just C<static>, if inline isn't
175supported. It should be used to declare functions that should be inlined,
176for code size or speed reasons.
177
178Example: inline this function, it surely will reduce codesize.
179
180 ecb_inline int
181 negmul (int a, int b)
182 {
183 return - (a * b);
184 }
185
91=item ecb_noinline 186=item ecb_noinline
92 187
93Prevent a function from being inlined - it might be optimised away, but 188Prevent a function from being inlined - it might be optimised away, but
94not inlined into other functions. This is useful if you know your function 189not inlined into other functions. This is useful if you know your function
95is rarely called and large enough for inlining not to be helpful. 190is rarely called and large enough for inlining not to be helpful.
105 { 200 {
106 puts (errline); 201 puts (errline);
107 abort (); 202 abort ();
108 } 203 }
109 204
110In this case, the compiler would probbaly be smart enough to decude it on 205In this case, the compiler would probably be smart enough to deduce it on
111it's own, so this is mainly useful for declarations. 206its own, so this is mainly useful for declarations.
112 207
113=item ecb_const 208=item ecb_const
114 209
115Declares that the function only depends on the values of it's arguments, 210Declares that the function only depends on the values of its arguments,
116much like a mathematical function. It specifically does not read or write 211much like a mathematical function. It specifically does not read or write
117any memory any arguments might point to, global variables, or call any 212any memory any arguments might point to, global variables, or call any
118non-const functions. It also must not have any side effects. 213non-const functions. It also must not have any side effects.
119 214
120Such a function can be optimised much more aggressively by the compiler - 215Such a function can be optimised much more aggressively by the compiler -
121for example, multiple calls with the same arguments can be optimised into 216for example, multiple calls with the same arguments can be optimised into
122a single call, which wouldn't be possible if the compiler would have to 217a single call, which wouldn't be possible if the compiler would have to
123expect any side effects. 218expect any side effects.
124 219
125It is best suited for functions in the sense of mathematical functions, 220It is best suited for functions in the sense of mathematical functions,
126such as a function return the square root of its input argument. 221such as a function returning the square root of its input argument.
127 222
128Not suited would be a function that calculates the hash of some memory 223Not suited would be a function that calculates the hash of some memory
129area you pass in, prints some messages or looks at a global variable to 224area you pass in, prints some messages or looks at a global variable to
130decide on rounding. 225decide on rounding.
131 226
154possible. 249possible.
155 250
156The compiler reacts by trying to place hot functions near to each other in 251The compiler reacts by trying to place hot functions near to each other in
157memory. 252memory.
158 253
159Whether a function is hot or not often depend son the whole program, 254Whether a function is hot or not often depends on the whole program,
160and less on the function itself. C<ecb_cold> is likely more useful in 255and less on the function itself. C<ecb_cold> is likely more useful in
161practise. 256practise.
162 257
163=item ecb_cold 258=item ecb_cold
164 259
169 264
170In addition to placing cold functions together (or at least away from hot 265In addition to placing cold functions together (or at least away from hot
171functions), this knowledge can be used in other ways, for example, the 266functions), this knowledge can be used in other ways, for example, the
172function will be optimised for size, as opposed to speed, and codepaths 267function will be optimised for size, as opposed to speed, and codepaths
173leading to calls to those functions can automatically be marked as if 268leading to calls to those functions can automatically be marked as if
174C<ecb_unlikel> had been used to reach them. 269C<ecb_expect_false> had been used to reach them.
175 270
176Good examples for such functions would be error reporting functions, or 271Good examples for such functions would be error reporting functions, or
177functions only called in exceptional or rare cases. 272functions only called in exceptional or rare cases.
178 273
179=item ecb_artificial 274=item ecb_artificial
241 336
242Evaluates C<expr> and returns it. In addition, it tells the compiler that 337Evaluates C<expr> and returns it. In addition, it tells the compiler that
243the C<expr> evaluates to C<value> a lot, which can be used for static 338the C<expr> evaluates to C<value> a lot, which can be used for static
244branch optimisations. 339branch optimisations.
245 340
246Usually, you want to use the more intuitive C<ecb_likely> and 341Usually, you want to use the more intuitive C<ecb_expect_true> and
247C<ecb_unlikely> functions instead. 342C<ecb_expect_false> functions instead.
248 343
344=item bool ecb_expect_true (cond)
345
249=item bool ecb_likely (cond) 346=item bool ecb_expect_false (cond)
250
251=item bool ecb_unlikely (cond)
252 347
253These two functions expect a expression that is true or false and return 348These two functions expect a expression that is true or false and return
254C<1> or C<0>, respectively, so when used in the condition of an C<if> or 349C<1> or C<0>, respectively, so when used in the condition of an C<if> or
255other conditional statement, it will not change the program: 350other conditional statement, it will not change the program:
256 351
257 /* these two do the same thing */ 352 /* these two do the same thing */
258 if (some_condition) ...; 353 if (some_condition) ...;
259 if (ecb_likely (some_condition)) ...; 354 if (ecb_expect_true (some_condition)) ...;
260 355
261However, by using C<ecb_likely>, you tell the compiler that the condition 356However, by using C<ecb_expect_true>, you tell the compiler that the
262is likely to be true (and for C<ecb_unlikely>, that it is unlikely to be 357condition is likely to be true (and for C<ecb_expect_false>, that it is
263true). 358unlikely to be true).
264 359
265For example, when you check for a null pointer and expect this to be a 360For example, when you check for a null pointer and expect this to be a
266rare, exceptional, case, then use C<ecb_unlikely>: 361rare, exceptional, case, then use C<ecb_expect_false>:
267 362
268 void my_free (void *ptr) 363 void my_free (void *ptr)
269 { 364 {
270 if (ecb_unlikely (ptr == 0)) 365 if (ecb_expect_false (ptr == 0))
271 return; 366 return;
272 } 367 }
273 368
274Consequent use of these functions to mark away exceptional cases or to 369Consequent use of these functions to mark away exceptional cases or to
275tell the compiler what the hot path through a function is can increase 370tell the compiler what the hot path through a function is can increase
276performance considerably. 371performance considerably.
372
373You might know these functions under the name C<likely> and C<unlikely>
374- while these are common aliases, we find that the expect name is easier
375to understand when quickly skimming code. If you wish, you can use
376C<ecb_likely> instead of C<ecb_expect_true> and C<ecb_unlikely> instead of
377C<ecb_expect_false> - these are simply aliases.
277 378
278A very good example is in a function that reserves more space for some 379A very good example is in a function that reserves more space for some
279memory block (for example, inside an implementation of a string stream) - 380memory block (for example, inside an implementation of a string stream) -
280each time something is added, you have to check for a buffer overrun, but 381each time something is added, you have to check for a buffer overrun, but
281you expect that most checks will turn out to be false: 382you expect that most checks will turn out to be false:
282 383
283 /* make sure we have "size" extra room in our buffer */ 384 /* make sure we have "size" extra room in our buffer */
284 ecb_inline void 385 ecb_inline void
285 reserve (int size) 386 reserve (int size)
286 { 387 {
287 if (ecb_unlikely (current + size > end)) 388 if (ecb_expect_false (current + size > end))
288 real_reserve_method (size); /* presumably noinline */ 389 real_reserve_method (size); /* presumably noinline */
289 } 390 }
290 391
291=item bool ecb_assume (cond) 392=item bool ecb_assume (cond)
292 393
295 396
296This can be used to teach the compiler about invariants or other 397This can be used to teach the compiler about invariants or other
297conditions that might improve code generation, but which are impossible to 398conditions that might improve code generation, but which are impossible to
298deduce form the code itself. 399deduce form the code itself.
299 400
300For example, the example reservation function from the C<ecb_unlikely> 401For example, the example reservation function from the C<ecb_expect_false>
301description could be written thus (only C<ecb_assume> was added): 402description could be written thus (only C<ecb_assume> was added):
302 403
303 ecb_inline void 404 ecb_inline void
304 reserve (int size) 405 reserve (int size)
305 { 406 {
306 if (ecb_unlikely (current + size > end)) 407 if (ecb_expect_false (current + size > end))
307 real_reserve_method (size); /* presumably noinline */ 408 real_reserve_method (size); /* presumably noinline */
308 409
309 ecb_assume (current + size <= end); 410 ecb_assume (current + size <= end);
310 } 411 }
311 412
360After processing the node, (part of) the next node might already be in 461After processing the node, (part of) the next node might already be in
361cache. 462cache.
362 463
363=back 464=back
364 465
365=head2 BIT FIDDLING / BITSTUFFS 466=head2 BIT FIDDLING / BIT WIZARDRY
366 467
367=over 4 468=over 4
368 469
369=item bool ecb_big_endian () 470=item bool ecb_big_endian ()
370 471
372 473
373These two functions return true if the byte order is big endian 474These two functions return true if the byte order is big endian
374(most-significant byte first) or little endian (least-significant byte 475(most-significant byte first) or little endian (least-significant byte
375first) respectively. 476first) respectively.
376 477
478On systems that are neither, their return values are unspecified.
479
377=item int ecb_ctz32 (uint32_t x) 480=item int ecb_ctz32 (uint32_t x)
378 481
482=item int ecb_ctz64 (uint64_t x)
483
379Returns the index of the least significant bit set in C<x> (or 484Returns the index of the least significant bit set in C<x> (or
380equivalently the number of bits set to 0 before the least significant 485equivalently the number of bits set to 0 before the least significant bit
381bit set), starting from 0. If C<x> is 0 the result is undefined. A 486set), starting from 0. If C<x> is 0 the result is undefined.
382common use case is to compute the integer binary logarithm, i.e., 487
383floor(log2(n)). For example: 488For smaller types than C<uint32_t> you can safely use C<ecb_ctz32>.
489
490For example:
384 491
385 ecb_ctz32 (3) = 0 492 ecb_ctz32 (3) = 0
386 ecb_ctz32 (6) = 1 493 ecb_ctz32 (6) = 1
387 494
495=item bool ecb_is_pot32 (uint32_t x)
496
497=item bool ecb_is_pot64 (uint32_t x)
498
499Return true iff C<x> is a power of two or C<x == 0>.
500
501For smaller types then C<uint32_t> you can safely use C<ecb_is_pot32>.
502
503=item int ecb_ld32 (uint32_t x)
504
505=item int ecb_ld64 (uint64_t x)
506
507Returns the index of the most significant bit set in C<x>, or the number
508of digits the number requires in binary (so that C<< 2**ld <= x <
5092**(ld+1) >>). If C<x> is 0 the result is undefined. A common use case is
510to compute the integer binary logarithm, i.e. C<floor (log2 (n))>, for
511example to see how many bits a certain number requires to be encoded.
512
513This function is similar to the "count leading zero bits" function, except
514that that one returns how many zero bits are "in front" of the number (in
515the given data type), while C<ecb_ld> returns how many bits the number
516itself requires.
517
518For smaller types than C<uint32_t> you can safely use C<ecb_ld32>.
519
388=item int ecb_popcount32 (uint32_t x) 520=item int ecb_popcount32 (uint32_t x)
389 521
522=item int ecb_popcount64 (uint64_t x)
523
390Returns the number of bits set to 1 in C<x>. For example: 524Returns the number of bits set to 1 in C<x>.
525
526For smaller types than C<uint32_t> you can safely use C<ecb_popcount32>.
527
528For example:
391 529
392 ecb_popcount32 (7) = 3 530 ecb_popcount32 (7) = 3
393 ecb_popcount32 (255) = 8 531 ecb_popcount32 (255) = 8
394 532
533=item uint8_t ecb_bitrev8 (uint8_t x)
534
535=item uint16_t ecb_bitrev16 (uint16_t x)
536
537=item uint32_t ecb_bitrev32 (uint32_t x)
538
539Reverses the bits in x, i.e. the MSB becomes the LSB, MSB-1 becomes LSB+1
540and so on.
541
542Example:
543
544 ecb_bitrev8 (0xa7) = 0xea
545 ecb_bitrev32 (0xffcc4411) = 0x882233ff
546
395=item uint32_t ecb_bswap16 (uint32_t x) 547=item uint32_t ecb_bswap16 (uint32_t x)
396 548
397=item uint32_t ecb_bswap32 (uint32_t x) 549=item uint32_t ecb_bswap32 (uint32_t x)
398 550
551=item uint64_t ecb_bswap64 (uint64_t x)
552
399These two functions return the value of the 16-bit (32-bit) variable 553These functions return the value of the 16-bit (32-bit, 64-bit) value
400C<x> after reversing the order of bytes. 554C<x> after reversing the order of bytes (0x11223344 becomes 0x44332211 in
555C<ecb_bswap32>).
556
557=item uint8_t ecb_rotl8 (uint8_t x, unsigned int count)
558
559=item uint16_t ecb_rotl16 (uint16_t x, unsigned int count)
560
561=item uint32_t ecb_rotl32 (uint32_t x, unsigned int count)
562
563=item uint64_t ecb_rotl64 (uint64_t x, unsigned int count)
564
565=item uint8_t ecb_rotr8 (uint8_t x, unsigned int count)
566
567=item uint16_t ecb_rotr16 (uint16_t x, unsigned int count)
401 568
402=item uint32_t ecb_rotr32 (uint32_t x, unsigned int count) 569=item uint32_t ecb_rotr32 (uint32_t x, unsigned int count)
403 570
404=item uint32_t ecb_rotl32 (uint32_t x, unsigned int count) 571=item uint64_t ecb_rotr64 (uint64_t x, unsigned int count)
405 572
406These two functions return the value of C<x> after shifting all the bits 573These two families of functions return the value of C<x> after rotating
407by C<count> positions to the right or left respectively. 574all the bits by C<count> positions to the right (C<ecb_rotr>) or left
575(C<ecb_rotl>).
576
577Current GCC versions understand these functions and usually compile them
578to "optimal" code (e.g. a single C<rol> or a combination of C<shld> on
579x86).
408 580
409=back 581=back
410 582
411=head2 ARITHMETIC 583=head2 ARITHMETIC
412 584
413=over 4 585=over 4
414 586
415=item x = ecb_mod (m, n) 587=item x = ecb_mod (m, n)
416 588
417Returns the positive remainder of the modulo operation between C<m> and 589Returns C<m> modulo C<n>, which is the same as the positive remainder
590of the division operation between C<m> and C<n>, using floored
418C<n>. Unlike the C modulo operator C<%>, this function ensures that the 591division. Unlike the C remainder operator C<%>, this function ensures that
419return value is always positive). 592the return value is always positive and that the two numbers I<m> and
593I<m' = m + i * n> result in the same value modulo I<n> - in other words,
594C<ecb_mod> implements the mathematical modulo operation, which is missing
595in the language.
420 596
421C<n> must be strictly positive (i.e. C<< >1 >>), while C<m> must be 597C<n> must be strictly positive (i.e. C<< >= 1 >>), while C<m> must be
422negatable, that is, both C<m> and C<-m> must be representable in its 598negatable, that is, both C<m> and C<-m> must be representable in its
423type. 599type (this typically excludes the minimum signed integer value, the same
600limitation as for C</> and C<%> in C).
601
602Current GCC versions compile this into an efficient branchless sequence on
603almost all CPUs.
604
605For example, when you want to rotate forward through the members of an
606array for increasing C<m> (which might be negative), then you should use
607C<ecb_mod>, as the C<%> operator might give either negative results, or
608change direction for negative values:
609
610 for (m = -100; m <= 100; ++m)
611 int elem = myarray [ecb_mod (m, ecb_array_length (myarray))];
612
613=item x = ecb_div_rd (val, div)
614
615=item x = ecb_div_ru (val, div)
616
617Returns C<val> divided by C<div> rounded down or up, respectively.
618C<val> and C<div> must have integer types and C<div> must be strictly
619positive. Note that these functions are implemented with macros in C
620and with function templates in C++.
424 621
425=back 622=back
426 623
427=head2 UTILITY 624=head2 UTILITY
428 625
429=over 4 626=over 4
430 627
431=item element_count = ecb_array_length (name) [MACRO] 628=item element_count = ecb_array_length (name)
432 629
433Returns the number of elements in the array C<name>. For example: 630Returns the number of elements in the array C<name>. For example:
434 631
435 int primes[] = { 2, 3, 5, 7, 11 }; 632 int primes[] = { 2, 3, 5, 7, 11 };
436 int sum = 0; 633 int sum = 0;
438 for (i = 0; i < ecb_array_length (primes); i++) 635 for (i = 0; i < ecb_array_length (primes); i++)
439 sum += primes [i]; 636 sum += primes [i];
440 637
441=back 638=back
442 639
640=head2 SYMBOLS GOVERNING COMPILATION OF ECB.H ITSELF
443 641
642These symbols need to be defined before including F<ecb.h> the first time.
643
644=over 4
645
646=item ECB_NO_THRADS
647
648If F<ecb.h> is never used from multiple threads, then this symbol can
649be defined, in which case memory fences (and similar constructs) are
650completely removed, leading to more efficient code and fewer dependencies.
651
652Setting this symbol to a true value implies C<ECB_NO_SMP>.
653
654=item ECB_NO_SMP
655
656The weaker version of C<ECB_NO_THREADS> - if F<ecb.h> is used from
657multiple threads, but never concurrently (e.g. if the system the program
658runs on has only a single CPU with a single core, no hyperthreading and so
659on), then this symbol can be defined, leading to more efficient code and
660fewer dependencies.
661
662=back
663
664

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines