I was reading the source code of Qemu and wonder how Qemu emulate eflags for x86 processor, in the target-i386/cc-helper.c
file I found that functions like compute_all_addw
do the job, I want to know how Qemu implements those functions but I can not find the definition of all these functions. Did I miss something? Help please.
QEMU is using a trick here that it does fairly often -- using the C preprocessor to create multiple very similar functions without having to write them all out by hand.
In this specific case, the code is in target-i386/cc_helper_template.h:
static int glue(compute_all_add, SUFFIX)(DATA_TYPE dst, DATA_TYPE src1)
{
int cf, pf, af, zf, sf, of;
[...]
}
where glue()
is a macro which just sticks its arguments together. SUFFIX
and DATA_TYPE
are defined earlier in the .h file based on the value of SHIFT
. target-i386/cc_helper.c
then #include
s the template .h file multiple times, defining SHIFT
differently each time. This results in function definitions for compute_all_addb
, compute_all_addw
, compute_all_addl
and compute_all_addq
being generated from the single template.
In general if you can't find a function definition in QEMU's source code with 'grep' the chances are good that it's being autogenerated like this -- searching for a substring of the function name may help.