--- libecb/ecb.pod 2011/05/31 21:10:37 1.24 +++ libecb/ecb.pod 2011/06/10 11:51:03 1.28 @@ -59,11 +59,11 @@ =head2 GCC ATTRIBUTES A major part of libecb deals with GCC attributes. These are additional -attributes that you cna assign to functions, variables and sometimes even +attributes that you can assign to functions, variables and sometimes even types - much like C or C in C. While GCC allows declarations to show up in many surprising places, -but not in many expeted places, the safest way is to put attribute +but not in many expected places, the safest way is to put attribute declarations before the whole declaration: ecb_const int mysqrt (int a); @@ -186,7 +186,7 @@ functions), this knowledge can be used in other ways, for example, the function will be optimised for size, as opposed to speed, and codepaths leading to calls to those functions can automatically be marked as if -C had been used to reach them. +C had been used to reach them. Good examples for such functions would be error reporting functions, or functions only called in exceptional or rare cases. @@ -258,12 +258,12 @@ the C evaluates to C a lot, which can be used for static branch optimisations. -Usually, you want to use the more intuitive C and -C functions instead. +Usually, you want to use the more intuitive C and +C functions instead. -=item bool ecb_likely (cond) +=item bool ecb_expect_true (cond) -=item bool ecb_unlikely (cond) +=item bool ecb_expect_false (cond) These two functions expect a expression that is true or false and return C<1> or C<0>, respectively, so when used in the condition of an C or @@ -271,18 +271,18 @@ /* these two do the same thing */ if (some_condition) ...; - if (ecb_likely (some_condition)) ...; + if (ecb_expect_true (some_condition)) ...; -However, by using C, you tell the compiler that the condition -is likely to be true (and for C, that it is unlikely to be -true). +However, by using C, you tell the compiler that the +condition is likely to be true (and for C, that it is +unlikely to be true). For example, when you check for a null pointer and expect this to be a -rare, exceptional, case, then use C: +rare, exceptional, case, then use C: void my_free (void *ptr) { - if (ecb_unlikely (ptr == 0)) + if (ecb_expect_false (ptr == 0)) return; } @@ -290,6 +290,12 @@ tell the compiler what the hot path through a function is can increase performance considerably. +You might know these functions under the name C and C +- while these are common aliases, we find that the expect name is easier +to understand when quickly skimming code. If you wish, you can use +C instead of C and C instead of +C - these are simply aliases. + A very good example is in a function that reserves more space for some memory block (for example, inside an implementation of a string stream) - each time something is added, you have to check for a buffer overrun, but @@ -299,7 +305,7 @@ ecb_inline void reserve (int size) { - if (ecb_unlikely (current + size > end)) + if (ecb_expect_false (current + size > end)) real_reserve_method (size); /* presumably noinline */ } @@ -312,13 +318,13 @@ conditions that might improve code generation, but which are impossible to deduce form the code itself. -For example, the example reservation function from the C +For example, the example reservation function from the C description could be written thus (only C was added): ecb_inline void reserve (int size) { - if (ecb_unlikely (current + size > end)) + if (ecb_expect_false (current + size > end)) real_reserve_method (size); /* presumably noinline */ ecb_assume (current + size <= end); @@ -434,18 +440,21 @@ =item x = ecb_mod (m, n) -Returns the positive remainder of the modulo operation between C and -C, using floored division. Unlike the C modulo operator C<%>, this -function ensures that the return value is always positive and that the two -numbers I and I result in the same value modulo I - -the C<%> operator usually has a behaviour change at C. +Returns C modulo C, which is the same as the positive remainder +of the division operation between C and C, using floored +division. Unlike the C remainder operator C<%>, this function ensures that +the return value is always positive and that the two numbers I and +I result in the same value modulo I - in other words, +C implements the mathematical modulo operation, which is missing +in the language. C must be strictly positive (i.e. C<< >= 1 >>), while C must be negatable, that is, both C and C<-m> must be representable in its -type. +type (this typically includes the minimum signed integer value, the same +limitation as for C and C<%> in C). Current GCC versions compile this into an efficient branchless sequence on -many systems. +almost all CPUs. For example, when you want to rotate forward through the members of an array for increasing C (which might be negative), then you should use