About __builtin_Functions.
Ian Lance Taylor
ian@wasabisystems.com
Mon Mar 15 17:41:00 GMT 2004
Dhruv Matani <dhruvbird@HotPOP.com> writes:
> > Are you looking for a specific answer about a specific builtin on a
> > specific target? If so, ask that question. It is impossible to
> > answer the question in general. Some builtins have no associated
> > code. Some builtins are always opencoded. Some builtins are
> > opencoded under particular circumstances for particular targets.
>
> Ok, but what does the term "opencoded" mean in general when used in such
> a context?
>
> The closest I can guess is soemthing related to inlining.
> Also, the documentation on this page: gcc/Keyword-Index.html links open
> coding to inlining.
I suppose that open-coded is essentially equivalent to inlined. The
difference is that there is no actual function to be inlined. For
example, the multiplication operator may be open-coded, and usually
is. But on a machine which does not support hardware multiplication,
the operator is handled as a call to the function __mulsi3. It would
be a little strange to say that the multiplication operator is
normally inlined, so instead we say that it is normally open-coded.
In general gcc will either open-code a builtin function, or it will
generate a call to a function provided in libgcc.a.
> > > However I could find the macro __builtin_expect which is defined to be a
> > > macro translating to the first expression passed to it, and as you
> > > mentioned about it being an intrinsic, which does not generate any code
> > > so there is no question about inlining.
> >
> > I don't know where you found that, but obviously gcc does not
> > implement __builtin_expect simply as a macro which returns its first
> > argument.
>
> The particular definition of the macro I'm talking about is located in
> the file: system.h
>
> /* __builtin_expect(A, B) evaluates to A, but notifies the compiler that
> the most likely value of A is B. This feature was added at some
> point
> between 2.95 and 3.0. Let's use 3.0 as the lower bound for now. */
> #if (GCC_VERSION < 3000)
> #define __builtin_expect(a, b) (a)
> #endif
>
> But then again, this might be for older versions of the compiler that
> didn't implement this optimization?
Correct. That is there because the gcc code itself uses
__builtin_expect, and it arranges to #define the macro when gcc itself
is compiled with versions of gcc before __builtin_expect was defined.
The actual implementation of __builtin_expect can be found in
expand_builtin_expect() in builtins.c. That is fairly simple--it just
emits a NOTE_INSN_EXPECTED_VALUE note. A few other places in the
compiler then check for that note, notably the branch prediction
routines found in predict.c.
Ian
More information about the Libstdc++
mailing list