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

Comparing libecb/ecb.pod (file contents):
Revision 1.2 by root, Thu May 26 19:49:21 2011 UTC vs.
Revision 1.11 by sf-exg, Thu May 26 21:18:52 2011 UTC

1=head1 LIBECB
2
3You suck, we don't(tm)
4
5=head2 ABOUT THE HEADER
6
7- how to include it
8- it includes inttypes.h
9- no .a
10- whats a bool
11- function mean macro or function
12- macro means untyped
1 13
2=head2 GCC ATTRIBUTES 14=head2 GCC ATTRIBUTES
15
16blabla where to put, what others
3 17
4=over 4 18=over 4
5 19
6=item ecb_attribute ((attrs...)) 20=item ecb_attribute ((attrs...))
7 21
8A simple wrapper that expands to C<__attribute__((attrs))> on GCC, and 22A simple wrapper that expands to C<__attribute__((attrs))> on GCC, and
9to nothing on other compilers, so the effect is that only GCC sees these. 23to nothing on other compilers, so the effect is that only GCC sees these.
10 24
25=item ecb_unused
26
27Marks a function or a variable as "unused", which simply suppresses a
28warning by GCC when it detects it as unused. This is useful when you e.g.
29declare a variable but do not always use it:
30
31 {
32 int var ecb_unused;
33
34 #ifdef SOMECONDITION
35 var = ...;
36 return var;
37 #else
38 return 0;
39 #endif
40 }
41
11=item ecb_noinline 42=item ecb_noinline
12 43
44Prevent a function from being inlined - it might be optimised away, but
45not inlined into other functions. This is useful if you know your function
46is rarely called and large enough for inlining not to be helpful.
47
13=item ecb_noreturn 48=item ecb_noreturn
14 49
15=item ecb_unused
16
17=item ecb_const 50=item ecb_const
18 51
19=item ecb_pure 52=item ecb_pure
20 53
21=item ecb_hot 54=item ecb_hot
28 61
29=head2 OPTIMISATION HINTS 62=head2 OPTIMISATION HINTS
30 63
31=over 4 64=over 4
32 65
33=item bool ecb_is_constant(expr) 66=item bool ecb_is_constant(expr) [MACRO]
34 67
68Returns true iff the expression can be deduced to be a compile-time
69constant, and false otherwise.
70
71For example, when you have a C<rndm16> function that returns a 16 bit
72random number, and you have a function that maps this to a range from
730..n-1, then you could use this inline function in a header file:
74
75 ecb_inline uint32_t
76 rndm (uint32_t n)
77 {
78 return (n * (uint32_t)rndm16 ()) >> 16;
79 }
80
81However, for powers of two, you could use a normal mask, but that is only
82worth it if, at compile time, you can detect this case. This is the case
83when the passed number is a constant and also a power of two (C<n & (n -
841) == 0>):
85
86 ecb_inline uint32_t
87 rndm (uint32_t n)
88 {
89 return is_constant (n) && !(n & (n - 1))
90 ? rndm16 () & (num - 1)
91 : (n * (uint32_t)rndm16 ()) >> 16;
92 }
93
35=item bool ecb_expect(expr,value) 94=item bool ecb_expect (expr, value) [MACRO]
36 95
96Evaluates C<expr> and returns it. In addition, it tells the compiler that
97the C<expr> evaluates to C<value> a lot, which can be used for static
98branch optimisations.
99
100Usually, you want to use the more intuitive C<ecb_likely> and
101C<ecb_unlikely> functions instead.
102
103=item bool ecb_likely (bool) [MACRO]
104
37=item bool ecb_unlikely(bool) 105=item bool ecb_unlikely (bool) [MACRO]
38 106
39=item bool ecb_likely(bool) 107These two functions expect a expression that is true or false and return
108C<1> or C<0>, respectively, so when used in the condition of an C<if> or
109other conditional statement, it will not change the program:
40 110
111 /* these two do the same thing */
112 if (some_condition) ...;
113 if (ecb_likely (some_condition)) ...;
114
115However, by using C<ecb_likely>, you tell the compiler that the condition
116is likely to be true (and for C<ecb_unlikely>, that it is unlikely to be
117true).
118
119For example, when you check for a null pointer and expect this to be a
120rare, exceptional, case, then use C<ecb_unlikely>:
121
122 void my_free (void *ptr)
123 {
124 if (ecb_unlikely (ptr == 0))
125 return;
126 }
127
128Consequent use of these functions to mark away exceptional cases or to
129tell the compiler what the hot path through a function is can increase
130performance considerably.
131
132A very good example is in a function that reserves more space for some
133memory block (for example, inside an implementation of a string stream) -
134each time something is added, you have to check for a buffer overrun, but
135you expect that most checks will turn out to be false:
136
137 /* make sure we have "size" extra room in our buffer */
138 ecb_inline void
139 reserve (int size)
140 {
141 if (ecb_unlikely (current + size > end))
142 real_reserve_method (size); /* presumably noinline */
143 }
144
41=item bool ecb_assume(cond) 145=item bool ecb_assume (cond) [MACRO]
42 146
147Try to tell the compiler that some condition is true, even if it's not
148obvious.
149
150This can be used to teach the compiler about invariants or other
151conditions that might improve code generation, but which are impossible to
152deduce form the code itself.
153
154For example, the example reservation function from the C<ecb_unlikely>
155description could be written thus (only C<ecb_assume> was added):
156
157 ecb_inline void
158 reserve (int size)
159 {
160 if (ecb_unlikely (current + size > end))
161 real_reserve_method (size); /* presumably noinline */
162
163 ecb_assume (current + size <= end);
164 }
165
166If you then call this function twice, like this:
167
168 reserve (10);
169 reserve (1);
170
171Then the compiler I<might> be able to optimise out the second call
172completely, as it knows that C<< current + 1 > end >> is false and the
173call will never be executed.
174
43=item bool ecb_unreachable() 175=item bool ecb_unreachable ()
44 176
177This function does nothing itself, except tell the compiler that it will
178never be executed. Apart from suppressing a warning in some cases, this
179function can be used to implement C<ecb_assume> or similar functions.
180
45=item bool ecb_prefetch(addr,rw,locality) 181=item bool ecb_prefetch (addr, rw, locality) [MACRO]
182
183Tells the compiler to try to prefetch memory at the given C<addr>ess
184for either reading (C<rw> = 0) or writing (C<rw> = 1). A C<locality> of
185C<0> means that there will only be one access later, C<3> means that
186the data will likely be accessed very often, and values in between mean
187something... in between. The memory pointed to by the address does not
188need to be accessible (it could be a null pointer for example), but C<rw>
189and C<locality> must be compile-time constants.
190
191An obvious way to use this is to prefetch some data far away, in a big
192array you loop over. This prefetches memory some 128 array elements later,
193in the hope that it will be ready when the CPU arrives at that location.
194
195 int sum = 0;
196
197 for (i = 0; i < N; ++i)
198 {
199 sum += arr [i]
200 ecb_prefetch (arr + i + 128, 0, 0);
201 }
202
203It's hard to predict how far to prefetch, and most CPUs that can prefetch
204are often good enough to predict this kind of behaviour themselves. It
205gets more interesting with linked lists, especially when you do some fair
206processing on each list element:
207
208 for (node *n = start; n; n = n->next)
209 {
210 ecb_prefetch (n->next, 0, 0);
211 ... do medium amount of work with *n
212 }
213
214After processing the node, (part of) the next node might already be in
215cache.
46 216
47=back 217=back
48 218
49=head2 BIT FIDDLING / BITSTUFFS 219=head2 BIT FIDDLING / BITSTUFFS
50 220
221=over 4
222
51bool ecb_big_endian (); 223=item bool ecb_big_endian ()
224
52bool ecb_little_endian (); 225=item bool ecb_little_endian ()
226
227These two functions return true if the byte order is big endian
228(most-significant byte first) or little endian (least-significant byte
229first) respectively.
230
53int ecb_ctz32 (uint32_t x); 231=item int ecb_ctz32 (uint32_t x)
232
233Returns the index of the least significant bit set in C<x> (or
234equivalently the number of bits set to 0 before the least significant
235bit set), starting from 0. If C<x> is 0 the result is undefined. A
236common use case is to compute the integer binary logarithm, i.e.,
237floor(log2(n)). For example:
238
239 ecb_ctz32(3) = 1
240 ecb_ctz32(6) = 2
241
54int ecb_popcount32 (uint32_t x); 242=item int ecb_popcount32 (uint32_t x)
55uint32_t ecb_bswap32 (uint32_t x); 243
244Returns the number of bits set to 1 in C<x>. For example:
245
246 ecb_popcount32(7) = 3
247 ecb_popcount32(255) = 8
248
56uint32_t ecb_bswap16 (uint32_t x); 249=item uint32_t ecb_bswap16 (uint32_t x)
250
251=item uint32_t ecb_bswap32 (uint32_t x)
252
57uint32_t ecb_rotr32 (uint32_t x, unsigned int count); 253=item uint32_t ecb_rotr32 (uint32_t x, unsigned int count)
254
58uint32_t ecb_rotl32 (uint32_t x, unsigned int count); 255=item uint32_t ecb_rotl32 (uint32_t x, unsigned int count)
256
257These two functions return the value of C<x> after shifting all the bits
258by C<count> positions to the right or left respectively.
259
260=back
59 261
60=head2 ARITHMETIC 262=head2 ARITHMETIC
61 263
62x = ecb_mod (m, n) 264=over 4
265
266=item x = ecb_mod (m, n) [MACRO]
267
268Returns the positive remainder of the modulo operation between C<m>
269and C<n>.
270
271=back
63 272
64=head2 UTILITY 273=head2 UTILITY
65 274
66ecb_array_length (name) 275=over 4
67 276
277=item element_count = ecb_array_length (name) [MACRO]
68 278
279=back
280
281

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines