All of lore.kernel.org
 help / color / mirror / Atom feed
From: Blue Swirl <blauwirbel@gmail.com>
To: Stefano Bonifazi <stefboombastic@gmail.com>
Cc: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] TCG flow vs dyngen
Date: Sat, 11 Dec 2010 11:02:05 +0000	[thread overview]
Message-ID: <AANLkTikYqKz4feKX0J4inN1mTgb9FjRGwnC4CpA6-6Ep@mail.gmail.com> (raw)
In-Reply-To: <4D029B13.3050002@gmail.com>

On Fri, Dec 10, 2010 at 9:26 PM, Stefano Bonifazi
<stefboombastic@gmail.com> wrote:
> Hi all!
>  From the technical documentation
> (http://www.usenix.org/publications/library/proceedings/usenix05/tech/freenix/bellard.html)
> I read:
>
> The first step is to split each target CPU instruction into fewer simpler
> instructions called micro operations. Each micro operation is implemented by
> a small piece of C code. This small C source code is compiled by GCC to an
> object file. The micro operations are chosen so that their number is much
> smaller (typically a few hundreds) than all the combinations of instructions
> and operands of the target CPU. The translation from target CPU instructions
> to micro operations is done entirely with hand coded code.
>
> A compile time tool called dyngen uses the object file containing the micro
> operations as input to generate a dynamic code generator. This dynamic code
> generator is invoked at runtime to generate a complete host function which
> concatenates several micro operations.
>
> instead from wikipedia(http://en.wikipedia.org/wiki/QEMU) and other sources
> I read:
>
> The Tiny Code Generator (TCG) aims to remove the shortcoming of relying on a
> particular version of GCC or any compiler, instead incorporating the
> compiler (code generator) into other tasks performed by QEMU in run-time.
> The whole translation task thus consists of two parts: blocks of target code
> (TBs) being rewritten in TCG ops - a kind of machine-independent
> intermediate notation, and subsequently this notation being compiled for the
> host's architecture by TCG. Optional optimisation passes are performed
> between them.
>
> - So, I think that the technical documentation is now obsolete, isn't it?

At least we shouldn't link to that paper anymore. There's also
documentation generated from qemu-tech.texi that should be up to date.

> - The "old way" used much offline (compile time) work compiling the micro
> operations into host machine code, while if I understand well, TCG does
> everything in run-time(please correct me if I am wrong!).. so I wonder, how
> can it be as fast as the previous method (or even faster)?

The dyngen way was to extract machine instructions for each micro-op
from an object file (op.o) compiled by GCC during QEMU build. TCG
instead generates the instructions directly. Since the whole host
register set is available for the micro-ops (in contrast to fixed
T0/T1/T2 used by dyngen), TCG should outperform dyngen in some cases.
In other cases, GCC may have used some optimization when generating
the op which would be too complex to implement by the TCG generator so
the dyngen op may have been more optimal.

The old way was not portable to GCC 4.x series. Now it might be even
possible to replace GCC extensions with something else and use other
compilers.

> - If I understand well, TGC runtime flow is the following:
>     - TCG takes the target binary, and splits it into target blocks
>     - if the TB is not cached, TGC translates it (or better the target
> instructions it is composed by) into TCG micro ops,

The above is not the job of TCG (which is host specific), but the
target specific translators (target-*/translate.c).

>     - TGC compiles TGC uops into host object code,

OK.

>     - TGC caches the TB,
>     - TGC tries to chain the block with others,

The above is part of the CPU execution loop (cpu-exec.c), TCG is not
involved anymore.

>     - TGC copies the TB into the execution buffer

There is no copying.

>     - TGC runs it
> Am I right? Please correct me, whether I am wrong, as I wanna use that flow
> scheme for trying to understand the code..

Otherwise right.

  reply	other threads:[~2010-12-11 11:02 UTC|newest]

Thread overview: 35+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-12-10 21:26 [Qemu-devel] TCG flow vs dyngen Stefano Bonifazi
2010-12-11 11:02 ` Blue Swirl [this message]
2010-12-11 12:29   ` Stefano Bonifazi
2010-12-11 13:11     ` Blue Swirl
2010-12-11 14:32       ` Stefano Bonifazi
2010-12-11 14:44         ` Blue Swirl
2010-12-14 20:17           ` Stefano Bonifazi
2011-01-16 14:46 Raphael Lefevre
2011-01-16 15:21 ` Stefano Bonifazi
2011-01-16 16:01   ` Raphaël Lefèvre
2011-01-16 16:43     ` Stefano Bonifazi
2011-01-16 18:29       ` Peter Maydell
2011-01-16 19:02         ` Stefano Bonifazi
2011-01-16 19:24           ` Peter Maydell
2011-01-16 20:50           ` Stefano Bonifazi
2011-01-16 21:08             ` Raphaël Lefèvre
2011-01-17 11:59             ` Lluís
2011-01-16 19:16       ` Raphaël Lefèvre
2011-01-23 21:50     ` Rob Landley
2011-01-23 22:25       ` Stefano Bonifazi
2011-01-23 23:40         ` Rob Landley
2011-01-24 10:17           ` Stefano Bonifazi
2011-01-24 18:20             ` Rob Landley
2011-01-24 21:16               ` Stefano Bonifazi
2011-01-25  1:19                 ` Rob Landley
2011-01-25  8:53                   ` Stefano Bonifazi
2011-01-24 14:32       ` Peter Maydell
2011-01-24 14:56         ` Stefano Bonifazi
2011-01-24 15:15           ` Lluís
2011-01-24 18:02           ` Dushyant Bansal
2011-01-24 19:38             ` Stefano Bonifazi
2011-01-25  7:56               ` Dushyant Bansal
2011-01-25  9:04                 ` Stefano Bonifazi
2011-01-25  9:05                   ` Edgar E. Iglesias
2011-01-25  9:28                     ` Stefano Bonifazi

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=AANLkTikYqKz4feKX0J4inN1mTgb9FjRGwnC4CpA6-6Ep@mail.gmail.com \
    --to=blauwirbel@gmail.com \
    --cc=qemu-devel@nongnu.org \
    --cc=stefboombastic@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.