trace: reduce tracepoint fast-path overhead

While we compile a tracepoint into a single nop instruction, there is still
overhead on the fast path: since the compiler believes it is calling a
function (a belief which happens to be correct, since if the tracepoint
is enabled, it will), the compiler must assume that all the side effects
of calling an out-of-line function will happen: registers will be clobbered,
and memory may be read or written.

However, the tracepoint slow path doesn't touch any memory that the compiler
is interested in - it just writes to some buffer, and cannot affect the
calling function in any way.  So we pretend that we aren't calling a
a function, by calling it from assembly, and saving and restoring all
caller-saved registers.

Note 1: we don't save and restore fpu registers
Note 2: in some cases, we prevent the compiler from flushing data to memory
        (e.g. strings).

Signed-off-by: Avi Kivity <avi@cloudius-systems.com>
Signed-off-by: Pekka Enberg <penberg@cloudius-systems.com>