From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1KGDDX-0002bd-Po for qemu-devel@nongnu.org; Tue, 08 Jul 2008 09:26:51 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1KGDDW-0002bK-8k for qemu-devel@nongnu.org; Tue, 08 Jul 2008 09:26:51 -0400 Received: from [199.232.76.173] (port=58457 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1KGDDW-0002bE-3h for qemu-devel@nongnu.org; Tue, 08 Jul 2008 09:26:50 -0400 Received: from mail.codesourcery.com ([65.74.133.4]:54080) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1KGDDV-00076f-8Q for qemu-devel@nongnu.org; Tue, 08 Jul 2008 09:26:49 -0400 From: Paul Brook Subject: Re: [Qemu-devel] [RFC] ARM test generator Date: Tue, 8 Jul 2008 14:26:43 +0100 References: <761ea48b0807080535h4dadd1eev8c076bfb86f72e92@mail.gmail.com> In-Reply-To: <761ea48b0807080535h4dadd1eev8c076bfb86f72e92@mail.gmail.com> MIME-Version: 1.0 Content-Type: Multipart/Mixed; boundary="Boundary-00=_Ts2cIhxm9BYfM72" Message-Id: <200807081426.43774.paul@codesourcery.com> 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 Cc: Laurent Desnogues --Boundary-00=_Ts2cIhxm9BYfM72 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Content-Disposition: inline On Tuesday 08 July 2008, Laurent Desnogues wrote: > Hello, > > this is a very simple test generator for ARM. > > The aim is to help test instruction correctness since several people > already noticed some problems, that are not always easy to > reproduce in the absence of test infrastructure (a big word for such > a simple thing). I suggest creating a separate project for this. I'm unconvinced how much value this actually adds unless you can get fairly extensive coverage. i.e. the interesting bit is how you generate test-arm.txt and test-ref.txt. You should also cover different combinations of overlapping source/destination operands. I wrote reasonably extensive self-checking tests for a subset of NEON. However it ended up a bit of a mess, needs rewriting (probably in something other than C), doesn't cover some of the hard instructions, and the input generator needs a lot of improvement. I've attached it for reference. GCC also has a set of tests for the NEON compiler intrinsics. We've considered augmenting those to be runtime tests. Paul --Boundary-00=_Ts2cIhxm9BYfM72 Content-Type: application/x-tbz; name="test-neon.tar.bz2" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="test-neon.tar.bz2" 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 jJbzYINBGYl/8XckU4UJDWHiU3A= --Boundary-00=_Ts2cIhxm9BYfM72--