From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1DZHsP-0007Nd-7n for qemu-devel@nongnu.org; Fri, 20 May 2005 20:30:01 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1DZHsK-0007Lg-RF for qemu-devel@nongnu.org; Fri, 20 May 2005 20:29:58 -0400 Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1DZHsJ-0007IZ-E8 for qemu-devel@nongnu.org; Fri, 20 May 2005 20:29:55 -0400 Received: from [65.74.133.9] (helo=mail.codesourcery.com) by monty-python.gnu.org with esmtp (TLS-1.0:DHE_RSA_3DES_EDE_CBC_SHA:24) (Exim 4.34) id 1DZHm7-0000ik-2x for qemu-devel@nongnu.org; Fri, 20 May 2005 20:23:32 -0400 From: Paul Brook Date: Sat, 21 May 2005 01:14:36 +0100 MIME-Version: 1.0 Content-Type: Multipart/Mixed; boundary="Boundary-00=_s1njCPJ6uHYYyky" Message-Id: <200505210114.36243.paul@codesourcery.com> Subject: [Qemu-devel] Prototype hand written code generator Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org --Boundary-00=_s1njCPJ6uHYYyky Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline The attached patch is an initial implementation of a hand-written code generation backend for qemu. Salient features are: The basic principle is that (as before) guest code is broken down into simple operations ("qOPs"). These qops use a simple three-argument model, with the goal of being very easy to convert to native code. Each operand is a "qreg". There are four types of qreg: - Temporary values. An arbitrary number of these can be created. These will be turned into either host regs or stack slots before we generate host code. - Host "hard" registers. - Guest state. This is areas in the CPUenv structure. - Stack slots. - Integer constants. Each guest defines a number of qregs to hold guest CPU state (qregs.def). These can either be locations in the CPUenv structure, or host registers (aka. AREGN). Existing (dyngen) ops are left untouched. It's assume that they require guest state to be consistent, and that they clobber all other host registers. Guest instruction locations are encoded explicitly into the qop stream. This allows optimization of the qop stream while retaining precise guest CPU exception handling. Long-term I hope that this will totally replace dyngen. The more complicated ops can either be broken down into simple ops, or moved into helper functions. Most of the complicated ops are already helper functions anyway. All references to guest CPU state from the new qops is explicit. This allows us to do inter-op optimization and register allocation. In particular is allows the code generator to choose where a guest register value should be stored at any one time. This is a big win on RISC guests with large register files because it means we can dynamically choose which subset of guest state is held in host registers. I've implemented a copy/constant propagation pass, which is tuned to have this effect. This is currently the only real optimization done. I currently run this optimization all the time. If more expensive optimizations are written we probably want to instrument the generated code and use profile feedback to decide when to run these optimizations. After optimization the qop stream is transformed into two-argument from (this is not necessary on hosts that have a three-argument instruction set). Then register allocation is performed, assigning host registers to qregs, and making sure all qops have no more that one non-register operand. These constraints make it very easy to transform this into host code. So far I've only implemented x86 host and arm guest support. As a demonstration I've converted the arm target to use the new qops for simple operations (mostly they are a drop-in replacement for the existing ops). This has allowed removal the "T2" global register variable, freeing another host register for general use. This patch gives approximately 30% speed increase on the nbench benchmark. Other less repetitive tasks (eg. running "gcc dyngen.c") it appears to be performance-neutral. I'm fairly sure there is still a lot of low-hanging fruit to be had. I'm posting this patch for information and comment. It is not suitable for inclusion in its current state. - It's missing proper makefile dependencies. - Some of the source/header files are a bit mixed up. I've put things wherever was most convenient, rather than breaking them up logically. - qops use a fairly high-overhead double-linked-list representaton. This is mainly to simplify development. I think it should be possible to use a lower overhead representation (single-linked-list or array). - Other hosts and guests need implementing. - Calling helper function and accessing guest memory is still done done via dyngen. I think all the infrastructure is there to support this, it's just not used yet. All the above are mainly just a matter of coding. However: - It doesn't handle 64-bit hosts or guests. I'm not sure how to handle this. One possible solution is to give qregs a size/mode. 32-bit hosts we can then lie about having 64-bit registers, and hack around it in the final code generation stages. Performance of 64-bit guests on 32-bit hosts would suck, but that's already true with the current scheme. Suggestions are welcome Paul --Boundary-00=_s1njCPJ6uHYYyky Content-Type: application/x-gzip; name="patch.qemu_qop.gz" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="patch.qemu_qop.gz" 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 --Boundary-00=_s1njCPJ6uHYYyky--