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

Comparing libecb/ecb.pod (file contents):
Revision 1.57 by root, Thu Oct 16 14:47:20 2014 UTC vs.
Revision 1.71 by root, Sat Nov 21 16:53:50 2015 UTC

68platform (currently C<4> or C<8>) and can be used in preprocessor 68platform (currently C<4> or C<8>) and can be used in preprocessor
69expressions. 69expressions.
70 70
71For C<ptrdiff_t> and C<size_t> use C<stddef.h>. 71For C<ptrdiff_t> and C<size_t> use C<stddef.h>.
72 72
73=head2 LANGUAGE/COMPILER VERSIONS 73=head2 LANGUAGE/ENVIRONMENT/COMPILER VERSIONS
74 74
75All the following symbols expand to an expression that can be tested in 75All the following symbols expand to an expression that can be tested in
76preprocessor instructions as well as treated as a boolean (use C<!!> to 76preprocessor instructions as well as treated as a boolean (use C<!!> to
77ensure it's either C<0> or C<1> if you need that). 77ensure it's either C<0> or C<1> if you need that).
78 78
163C<__x86_64> stands for, well, the x86-64 ABI, making these macros 163C<__x86_64> stands for, well, the x86-64 ABI, making these macros
164necessary. 164necessary.
165 165
166=back 166=back
167 167
168=head2 MACRO TRICKERY
169
170=over 4
171
172=item ECB_CONCAT (a, b)
173
174Expands any macros in C<a> and C<b>, then concatenates the result to form
175a single token. This is mainly useful to form identifiers from components,
176e.g.:
177
178 #define S1 str
179 #define S2 cpy
180
181 ECB_CONCAT (S1, S2)(dst, src); // == strcpy (dst, src);
182
183=item ECB_STRINGIFY (arg)
184
185Expands any macros in C<arg> and returns the stringified version of
186it. This is mainly useful to get the contents of a macro in string form,
187e.g.:
188
189 #define SQL_LIMIT 100
190 sql_exec ("select * from table limit " ECB_STRINGIFY (SQL_LIMIT));
191
192=item ECB_STRINGIFY_EXPR (expr)
193
194Like C<ECB_STRINGIFY>, but additionally evaluates C<expr> to make sure it
195is a valid expression. This is useful to catch typos or cases where the
196macro isn't available:
197
198 #include <errno.h>
199
200 ECB_STRINGIFY (EDOM); // "33" (on my system at least)
201 ECB_STRINGIFY_EXPR (EDOM); // "33"
202
203 // now imagine we had a typo:
204
205 ECB_STRINGIFY (EDAM); // "EDAM"
206 ECB_STRINGIFY_EXPR (EDAM); // error: EDAM undefined
207
208=back
209
168=head2 GCC ATTRIBUTES 210=head2 ATTRIBUTES
169 211
170A major part of libecb deals with GCC attributes. These are additional 212A major part of libecb deals with additional attributes that can be
171attributes that you can assign to functions, variables and sometimes even 213assigned to functions, variables and sometimes even types - much like
172types - much like C<const> or C<volatile> in C. 214C<const> or C<volatile> in C. They are implemented using either GCC
173 215attributes or other compiler/language specific features. Attributes
174While GCC allows declarations to show up in many surprising places,
175but not in many expected places, the safest way is to put attribute
176declarations before the whole declaration: 216declarations must be put before the whole declaration:
177 217
178 ecb_const int mysqrt (int a); 218 ecb_const int mysqrt (int a);
179 ecb_unused int i; 219 ecb_unused int i;
180 220
181For variables, it is often nicer to put the attribute after the name, and
182avoid multiple declarations using commas:
183
184 int i ecb_unused;
185
186=over 4 221=over 4
187
188=item ecb_attribute ((attrs...))
189
190A simple wrapper that expands to C<__attribute__((attrs))> on GCC 3.1+ and
191Clang 2.8+, and to nothing on other compilers, so the effect is that only
192GCC and Clang see these.
193
194Example: use the C<deprecated> attribute on a function.
195
196 ecb_attribute((__deprecated__)) void
197 do_not_use_me_anymore (void);
198 222
199=item ecb_unused 223=item ecb_unused
200 224
201Marks a function or a variable as "unused", which simply suppresses a 225Marks a function or a variable as "unused", which simply suppresses a
202warning by GCC when it detects it as unused. This is useful when you e.g. 226warning by GCC when it detects it as unused. This is useful when you e.g.
203declare a variable but do not always use it: 227declare a variable but do not always use it:
204 228
205 { 229 {
206 int var ecb_unused; 230 ecb_unused int var;
207 231
208 #ifdef SOMECONDITION 232 #ifdef SOMECONDITION
209 var = ...; 233 var = ...;
210 return var; 234 return var;
211 #else 235 #else
216=item ecb_deprecated 240=item ecb_deprecated
217 241
218Similar to C<ecb_unused>, but marks a function, variable or type as 242Similar to C<ecb_unused>, but marks a function, variable or type as
219deprecated. This makes some compilers warn when the type is used. 243deprecated. This makes some compilers warn when the type is used.
220 244
245=item ecb_deprecated_message (message)
246
247Same as C<ecb_deprecated>, but if possible, the specified diagnostic is
248used instead of a generic depreciation message when the object is being
249used.
250
221=item ecb_inline 251=item ecb_inline
222 252
223This is not actually an attribute, but you use it like one. It expands
224either to C<static inline> or to just C<static>, if inline isn't 253Expands either to C<static inline> or to just C<static>, if inline
225supported. It should be used to declare functions that should be inlined, 254isn't supported. It should be used to declare functions that should be
226for code size or speed reasons. 255inlined, for code size or speed reasons.
227 256
228Example: inline this function, it surely will reduce codesize. 257Example: inline this function, it surely will reduce codesize.
229 258
230 ecb_inline int 259 ecb_inline int
231 negmul (int a, int b) 260 negmul (int a, int b)
233 return - (a * b); 262 return - (a * b);
234 } 263 }
235 264
236=item ecb_noinline 265=item ecb_noinline
237 266
238Prevent a function from being inlined - it might be optimised away, but 267Prevents a function from being inlined - it might be optimised away, but
239not inlined into other functions. This is useful if you know your function 268not inlined into other functions. This is useful if you know your function
240is rarely called and large enough for inlining not to be helpful. 269is rarely called and large enough for inlining not to be helpful.
241 270
242=item ecb_noreturn 271=item ecb_noreturn
243 272
264 293
265Example: multiply a vector, and allow the compiler to parallelise the 294Example: multiply a vector, and allow the compiler to parallelise the
266loop, because it knows it doesn't overwrite input values. 295loop, because it knows it doesn't overwrite input values.
267 296
268 void 297 void
269 multiply (float *ecb_restrict src, 298 multiply (ecb_restrict float *src,
270 float *ecb_restrict dst, 299 ecb_restrict float *dst,
271 int len, float factor) 300 int len, float factor)
272 { 301 {
273 int i; 302 int i;
274 303
275 for (i = 0; i < len; ++i) 304 for (i = 0; i < len; ++i)
373 402
374=head2 OPTIMISATION HINTS 403=head2 OPTIMISATION HINTS
375 404
376=over 4 405=over 4
377 406
378=item bool ecb_is_constant(expr) 407=item bool ecb_is_constant (expr)
379 408
380Returns true iff the expression can be deduced to be a compile-time 409Returns true iff the expression can be deduced to be a compile-time
381constant, and false otherwise. 410constant, and false otherwise.
382 411
383For example, when you have a C<rndm16> function that returns a 16 bit 412For example, when you have a C<rndm16> function that returns a 16 bit
401 return is_constant (n) && !(n & (n - 1)) 430 return is_constant (n) && !(n & (n - 1))
402 ? rndm16 () & (num - 1) 431 ? rndm16 () & (num - 1)
403 : (n * (uint32_t)rndm16 ()) >> 16; 432 : (n * (uint32_t)rndm16 ()) >> 16;
404 } 433 }
405 434
406=item bool ecb_expect (expr, value) 435=item ecb_expect (expr, value)
407 436
408Evaluates C<expr> and returns it. In addition, it tells the compiler that 437Evaluates C<expr> and returns it. In addition, it tells the compiler that
409the C<expr> evaluates to C<value> a lot, which can be used for static 438the C<expr> evaluates to C<value> a lot, which can be used for static
410branch optimisations. 439branch optimisations.
411 440
458 { 487 {
459 if (ecb_expect_false (current + size > end)) 488 if (ecb_expect_false (current + size > end))
460 real_reserve_method (size); /* presumably noinline */ 489 real_reserve_method (size); /* presumably noinline */
461 } 490 }
462 491
463=item bool ecb_assume (cond) 492=item ecb_assume (cond)
464 493
465Try to tell the compiler that some condition is true, even if it's not 494Tries to tell the compiler that some condition is true, even if it's not
466obvious. 495obvious. This is not a function, but a statement: it cannot be used in
496another expression.
467 497
468This can be used to teach the compiler about invariants or other 498This can be used to teach the compiler about invariants or other
469conditions that might improve code generation, but which are impossible to 499conditions that might improve code generation, but which are impossible to
470deduce form the code itself. 500deduce form the code itself.
471 501
488 518
489Then the compiler I<might> be able to optimise out the second call 519Then the compiler I<might> be able to optimise out the second call
490completely, as it knows that C<< current + 1 > end >> is false and the 520completely, as it knows that C<< current + 1 > end >> is false and the
491call will never be executed. 521call will never be executed.
492 522
493=item bool ecb_unreachable () 523=item ecb_unreachable ()
494 524
495This function does nothing itself, except tell the compiler that it will 525This function does nothing itself, except tell the compiler that it will
496never be executed. Apart from suppressing a warning in some cases, this 526never be executed. Apart from suppressing a warning in some cases, this
497function can be used to implement C<ecb_assume> or similar functions. 527function can be used to implement C<ecb_assume> or similar functionality.
498 528
499=item bool ecb_prefetch (addr, rw, locality) 529=item ecb_prefetch (addr, rw, locality)
500 530
501Tells the compiler to try to prefetch memory at the given C<addr>ess 531Tells the compiler to try to prefetch memory at the given C<addr>ess
502for either reading (C<rw> = 0) or writing (C<rw> = 1). A C<locality> of 532for either reading (C<rw> = 0) or writing (C<rw> = 1). A C<locality> of
503C<0> means that there will only be one access later, C<3> means that 533C<0> means that there will only be one access later, C<3> means that
504the data will likely be accessed very often, and values in between mean 534the data will likely be accessed very often, and values in between mean
505something... in between. The memory pointed to by the address does not 535something... in between. The memory pointed to by the address does not
506need to be accessible (it could be a null pointer for example), but C<rw> 536need to be accessible (it could be a null pointer for example), but C<rw>
507and C<locality> must be compile-time constants. 537and C<locality> must be compile-time constants.
508 538
539This is a statement, not a function: you cannot use it as part of an
540expression.
541
509An obvious way to use this is to prefetch some data far away, in a big 542An obvious way to use this is to prefetch some data far away, in a big
510array you loop over. This prefetches memory some 128 array elements later, 543array you loop over. This prefetches memory some 128 array elements later,
511in the hope that it will be ready when the CPU arrives at that location. 544in the hope that it will be ready when the CPU arrives at that location.
512 545
513 int sum = 0; 546 int sum = 0;
565 598
566=item bool ecb_is_pot32 (uint32_t x) 599=item bool ecb_is_pot32 (uint32_t x)
567 600
568=item bool ecb_is_pot64 (uint32_t x) 601=item bool ecb_is_pot64 (uint32_t x)
569 602
570Return true iff C<x> is a power of two or C<x == 0>. 603Returns true iff C<x> is a power of two or C<x == 0>.
571 604
572For smaller types then C<uint32_t> you can safely use C<ecb_is_pot32>. 605For smaller types than C<uint32_t> you can safely use C<ecb_is_pot32>.
573 606
574=item int ecb_ld32 (uint32_t x) 607=item int ecb_ld32 (uint32_t x)
575 608
576=item int ecb_ld64 (uint64_t x) 609=item int ecb_ld64 (uint64_t x)
577 610
653 686
654=head2 FLOATING POINT FIDDLING 687=head2 FLOATING POINT FIDDLING
655 688
656=over 4 689=over 4
657 690
691=item ECB_INFINITY [-UECB_NO_LIBM]
692
693Evaluates to positive infinity if supported by the platform, otherwise to
694a truly huge number.
695
696=item ECB_NAN [-UECB_NO_LIBM]
697
698Evaluates to a quiet NAN if supported by the platform, otherwise to
699C<ECB_INFINITY>.
700
701=item float ecb_ldexpf (float x, int exp) [-UECB_NO_LIBM]
702
703Same as C<ldexpf>, but always available.
704
705=item uint32_t ecb_float_to_binary16 (float x) [-UECB_NO_LIBM]
706
658=item uint32_t ecb_float_to_binary32 (float x) [-UECB_NO_LIBM] 707=item uint32_t ecb_float_to_binary32 (float x) [-UECB_NO_LIBM]
659 708
660=item uint64_t ecb_double_to_binary64 (double x) [-UECB_NO_LIBM] 709=item uint64_t ecb_double_to_binary64 (double x) [-UECB_NO_LIBM]
661 710
662These functions each take an argument in the native C<float> or C<double> 711These functions each take an argument in the native C<float> or C<double>
663type and return the IEEE 754 bit representation of it. 712type and return the IEEE 754 bit representation of it (binary16/half,
713binary32/single or binary64/double precision).
664 714
665The bit representation is just as IEEE 754 defines it, i.e. the sign bit 715The bit representation is just as IEEE 754 defines it, i.e. the sign bit
666will be the most significant bit, followed by exponent and mantissa. 716will be the most significant bit, followed by exponent and mantissa.
667 717
668This function should work even when the native floating point format isn't 718This function should work even when the native floating point format isn't
672 722
673On all modern platforms (where C<ECB_STDFP> is true), the compiler should 723On all modern platforms (where C<ECB_STDFP> is true), the compiler should
674be able to optimise away this function completely. 724be able to optimise away this function completely.
675 725
676These functions can be helpful when serialising floats to the network - you 726These functions can be helpful when serialising floats to the network - you
677can serialise the return value like a normal uint32_t/uint64_t. 727can serialise the return value like a normal uint16_t/uint32_t/uint64_t.
678 728
679Another use for these functions is to manipulate floating point values 729Another use for these functions is to manipulate floating point values
680directly. 730directly.
681 731
682Silly example: toggle the sign bit of a float. 732Silly example: toggle the sign bit of a float.
685 /* this results in a single add instruction to toggle the bit, and 4 extra */ 735 /* this results in a single add instruction to toggle the bit, and 4 extra */
686 /* instructions to move the float value to an integer register and back. */ 736 /* instructions to move the float value to an integer register and back. */
687 737
688 x = ecb_binary32_to_float (ecb_float_to_binary32 (x) ^ 0x80000000U) 738 x = ecb_binary32_to_float (ecb_float_to_binary32 (x) ^ 0x80000000U)
689 739
740=item float ecb_binary16_to_float (uint16_t x) [-UECB_NO_LIBM]
741
690=item float ecb_binary32_to_float (uint32_t x) [-UECB_NO_LIBM] 742=item float ecb_binary32_to_float (uint32_t x) [-UECB_NO_LIBM]
691 743
692=item double ecb_binary32_to_double (uint64_t x) [-UECB_NO_LIBM] 744=item double ecb_binary64_to_double (uint64_t x) [-UECB_NO_LIBM]
693 745
694The reverse operation of the previos function - takes the bit representation 746The reverse operation of the previous function - takes the bit
695of an IEEE binary32 or binary64 number and converts it to the native C<float> 747representation of an IEEE binary16, binary32 or binary64 number (half,
748single or double precision) and converts it to the native C<float> or
696or C<double> format. 749C<double> format.
697 750
698This function should work even when the native floating point format isn't 751This function should work even when the native floating point format isn't
699IEEE compliant, of course at a speed and code size penalty, and of course 752IEEE compliant, of course at a speed and code size penalty, and of course
700also within reasonable limits (it tries to convert normals and denormals, 753also within reasonable limits (it tries to convert normals and denormals,
701and might be lucky for infinities, and with extraordinary luck, also for 754and might be lucky for infinities, and with extraordinary luck, also for
702negative zero). 755negative zero).
703 756
704On all modern platforms (where C<ECB_STDFP> is true), the compiler should 757On all modern platforms (where C<ECB_STDFP> is true), the compiler should
705be able to optimise away this function completely. 758be able to optimise away this function completely.
759
760=item uint16_t ecb_binary32_to_binary16 (uint32_t x)
761
762=item uint32_t ecb_binary16_to_binary32 (uint16_t x)
763
764Convert a IEEE binary32/single precision to binary16/half format, and vice
765versa, handling all details (round-to-even, subnormals, infinity and NaNs)
766correctly.
767
768These are functions are available under C<-DECB_NO_LIBM>, since
769they do not rely on the platform floating point format. The
770C<ecb_float_to_binary16> and C<ecb_binary16_to_float> functions are
771usually what you want.
706 772
707=back 773=back
708 774
709=head2 ARITHMETIC 775=head2 ARITHMETIC
710 776
791dependencies on the math library (usually called F<-lm>) - these are 857dependencies on the math library (usually called F<-lm>) - these are
792marked with [-UECB_NO_LIBM]. 858marked with [-UECB_NO_LIBM].
793 859
794=back 860=back
795 861
862=head1 UNDOCUMENTED FUNCTIONALITY
796 863
864F<ecb.h> is full of undocumented functionality as well, some of which is
865intended to be internal-use only, some of which we forgot to document, and
866some of which we hide because we are not sure we will keep the interface
867stable.
868
869While you are welcome to rummage around and use whatever you find useful
870(we can't stop you), keep in mind that we will change undocumented
871functionality in incompatible ways without thinking twice, while we are
872considerably more conservative with documented things.
873
874=head1 AUTHORS
875
876C<libecb> is designed and maintained by:
877
878 Emanuele Giaquinta <e.giaquinta@glauco.it>
879 Marc Alexander Lehmann <schmorp@schmorp.de>
880
881

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines