From patchwork Mon Apr 14 22:16:50 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christophe Lyon X-Patchwork-Id: 28373 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-ie0-f197.google.com (mail-ie0-f197.google.com [209.85.223.197]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id 64CC12036A for ; Mon, 14 Apr 2014 22:16:53 +0000 (UTC) Received: by mail-ie0-f197.google.com with SMTP id rd18sf48951983iec.8 for ; Mon, 14 Apr 2014 15:16:52 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:delivered-to:mime-version:in-reply-to:references :date:message-id:subject:from:to:cc:x-original-sender :x-original-authentication-results:precedence:mailing-list:list-id :list-post:list-help:list-archive:list-unsubscribe:content-type; bh=v3iZ5IxYTEz1mFPMOYESqqp1Hsd79ZV84LSVguKlhhk=; b=AHK6FPsNQzqa6/uIbRezI9PksMXGISJiFg8sgudF6mM6q8jV69vlao1Kbt4bCSzKND 63BTbK8qUraHunFDN8hOD7D5oZUp+9M5uPn8/ehmCsvr4kKmVqG8iDqEw1dmaiMnphtM 3XCpJPvswEzgY0+Zh/78q7iwuGT2bfOzUJ/teXfXmmdwpTywthiCXrE7glGf8ZJv3S/p +YdczNZf5kCuSclHxrZea6Q4e6+Zi59JCjPTyP/NkLY+/75f1X6qj4RClSefGObdHsgZ IJPRX2lUbqulLBWP7XxOtMwknHQqcWblugKQsGcwrt9dwyQdDPkqetv3RolSbjrsli7K 37Zg== X-Gm-Message-State: ALoCoQlQzW3butLj+oWv1wAcRlkYqDP7pKuStDiv58HqbwffxDVe0adE4Ak2uYm0n+7Tz25PsvLn X-Received: by 10.50.222.3 with SMTP id qi3mr8938063igc.7.1397513812774; Mon, 14 Apr 2014 15:16:52 -0700 (PDT) X-BeenThere: patchwork-forward@linaro.org Received: by 10.140.87.177 with SMTP id r46ls2297277qgd.98.gmail; Mon, 14 Apr 2014 15:16:52 -0700 (PDT) X-Received: by 10.221.55.133 with SMTP id vy5mr38764800vcb.17.1397513812626; Mon, 14 Apr 2014 15:16:52 -0700 (PDT) Received: from mail-vc0-f178.google.com (mail-vc0-f178.google.com [209.85.220.178]) by mx.google.com with ESMTPS id p4si3009807vem.192.2014.04.14.15.16.52 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 14 Apr 2014 15:16:52 -0700 (PDT) Received-SPF: neutral (google.com: 209.85.220.178 is neither permitted nor denied by best guess record for domain of patch+caf_=patchwork-forward=linaro.org@linaro.org) client-ip=209.85.220.178; Received: by mail-vc0-f178.google.com with SMTP id im17so8500982vcb.9 for ; Mon, 14 Apr 2014 15:16:52 -0700 (PDT) X-Received: by 10.220.92.135 with SMTP id r7mr38722472vcm.11.1397513812525; Mon, 14 Apr 2014 15:16:52 -0700 (PDT) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patches@linaro.org Received: by 10.220.221.72 with SMTP id ib8csp183669vcb; Mon, 14 Apr 2014 15:16:51 -0700 (PDT) X-Received: by 10.224.16.69 with SMTP id n5mr49996771qaa.7.1397513811539; Mon, 14 Apr 2014 15:16:51 -0700 (PDT) Received: from mail-qa0-f45.google.com (mail-qa0-f45.google.com [209.85.216.45]) by mx.google.com with ESMTPS id d4si7335396qar.87.2014.04.14.15.16.51 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 14 Apr 2014 15:16:51 -0700 (PDT) Received-SPF: neutral (google.com: 209.85.216.45 is neither permitted nor denied by best guess record for domain of christophe.lyon@linaro.org) client-ip=209.85.216.45; Received: by mail-qa0-f45.google.com with SMTP id cm18so7652537qab.4 for ; Mon, 14 Apr 2014 15:16:51 -0700 (PDT) MIME-Version: 1.0 X-Received: by 10.224.114.130 with SMTP id e2mr23182478qaq.53.1397513811325; Mon, 14 Apr 2014 15:16:51 -0700 (PDT) Received: by 10.140.103.180 with HTTP; Mon, 14 Apr 2014 15:16:50 -0700 (PDT) In-Reply-To: References: <526F8CC4.3040909@arm.com> Date: Tue, 15 Apr 2014 00:16:50 +0200 Message-ID: Subject: Re: [RFC] [Testsuite,ARM] Neon intrinsics executable tests From: Christophe Lyon To: Ramana Radhakrishnan Cc: "gcc-patches@gcc.gnu.org" , Patch Tracking , Richard Earnshaw , Marcus Shawcroft X-Removed-Original-Auth: Dkim didn't pass. X-Original-Sender: christophe.lyon@linaro.org X-Original-Authentication-Results: mx.google.com; spf=neutral (google.com: 209.85.220.178 is neither permitted nor denied by best guess record for domain of patch+caf_=patchwork-forward=linaro.org@linaro.org) smtp.mail=patch+caf_=patchwork-forward=linaro.org@linaro.org Precedence: list Mailing-list: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org List-ID: X-Google-Group-Id: 836684582541 List-Post: , List-Help: , List-Archive: List-Unsubscribe: , Hi Ramana, Here is an updated version of my proposal to include tests for Neon intrinsics. wrt to my previous post, I have made a few changes: - renamed the test files, removing the "ref_" prefix. - removed the TEST_ prefix on some initialization macros - use the c-torture framework I have run it successfully on the following configurations: aarch64-none-linux-gnu aarch64-none-elf aarch64_be-none-elf arm-none-linux-gnueabihf armeb-none-linux-gnueabihf arm-none-linux-gnueabi armeb-none-linux-gnueabi arm-none-eabi using qemu for most of them and the Foundation Model for aarch64*elf Any comments? Thanks, Christophe. On 29 October 2013 19:09, Christophe Lyon wrote: > On 29 October 2013 03:24, Ramana Radhakrishnan wrote: >> On 10/09/13 23:16, Christophe Lyon wrote: > >> Irrespective of our earlier conversations on this now I'm actually wondering >> if instead of doing this and integrating this in the GCC source base it >> maybe easier to write a harness to test this cross on qemu or natively. >> Additionally setting up an auto-tester to do this might be a more productive >> use of time rather than manually dejagnuizing this which appears to be a >> tedious and slow process. > > This would be easy to setup, since the Makefile on gitorious is > already targetting qemu. I used it occasionnally on boards with > minimal changes. > This just means we'd have to agree on how to set up such an > auto-tester, where do we send the results to, etc... > >>> I'd like your feedback before continuing, as there are a lot more >>> files to come. >>> >>> I have made some cleanup to help review, but the two .h files will >>> need to grow as more intrinsics will be added (see the original ones). >> >> Which one should I compare this with in terms of the original file ? > > I have kept the same file names. > > >>> I'd like to keep the modifications at a minimal level, to save my time >>> when adapting each test (there are currently 145 test files, so 143 >>> left:-). >> >> >> On to the patch itself. >> >> The prefix TEST_ seems a bit misleading in that it suggests this is testing >> something when in reality this is initializing stuff. > In fact, TEST_XXXX executes the XXXX intrinsics, and copies the > results to memory when relevant. But I can easily change TEST_ to > something else. > > So in the sample I posted: > > TEST_VABA: VAR=vaba(....); vst1(BUFFER,VAR) > TEST_VLD1: VAR=vld1(....); vst1(BUFFER, VAR) > > VDUP is special in that it is a helper for other tests: > TEST_VDUP: VAR1=vdup(VAR2,xxxx) > and similarly for TEST_VLOAD and TEST_VSETLANE > >>> +# Exit immediately if this isn't an ARM target. >>> +if ![istarget arm*-*-*] then { >>> + return >>> +} >> >> >> Also for aarch64*-*-* as all these intrinsics are compatible with the >> aarch64 port. I would also prefer that this be tortured over multiple >> optimization levels as many times we find issues with different optimization >> levels. > > OK, this sounds easy to do, and I agree. I prefered to post a simple > version first. > And given you talked me about your plans to factorize arm and aarch64 > tests, I thought it was better to start with a simple version I knew > was working. > >> More later I need to get back to something else and I need to play more with >> your original testsuite - but I'd like some discussion around some of these >> points anyway. >> >> Ramana > > OK thanks for the feedback. If we decide to go with auto-testers > instead, the discussion will probably be shorter. > > Christophe > >> >>> + >>> +# Load support procs. >>> +load_lib gcc-dg.exp >>> + >>> +# Initialize `dg'. >>> +dg-init >>> + >>> +# Main loop. >>> +gcc-dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.\[cCS\]]] \ >>> + "" >>> + >>> +# All done. >>> +dg-finish >>> diff -rNup '--exclude=.git' >>> gcc-fsf/gcc/testsuite/gcc.target/arm/neon-intrinsics/arm-neon-ref.h >>> gcc-fsf-neontests/gcc/testsuite/gcc.target/arm/neon-intrinsics/arm-neon-ref.h >>> --- gcc-fsf/gcc/testsuite/gcc.target/arm/neon-intrinsics/arm-neon-ref.h >>> 1970-01-01 01:00:00.000000000 +0100 >>> +++ >>> gcc-fsf-neontests/gcc/testsuite/gcc.target/arm/neon-intrinsics/arm-neon-ref.h >>> 2013-05-09 00:48:59.395628726 +0200 >>> @@ -0,0 +1,349 @@ >>> +#ifndef_ARM_NEON_REF_H_ >>> +#define_ARM_NEON_REF_H_ >>> + >>> +#include >>> +#include >>> +#include >>> +#include >>> + >>> +#define xSTR(X) #X >>> +#define STR(X) xSTR(X) >>> + >>> +#define xNAME1(V,T) V ## _ ## T >>> +#define xNAME(V,T) xNAME1(V,T) >>> + >>> +#define VAR(V,T,W) xNAME(V,T##W) >>> +#define VAR_DECL(V, T, W) T##W##_t VAR(V,T,W) >>> + >>> +#define VECT_NAME(T, W, N) T##W##x##N >>> +#define VECT_ARRAY_NAME(T, W, N, L) T##W##x##N##x##L >>> +#define VECT_TYPE(T, W, N) xNAME(VECT_NAME(T,W,N),t) >>> +#define VECT_ARRAY_TYPE(T, W, N, L) xNAME(VECT_ARRAY_NAME(T,W,N,L),t) >>> + >>> +#define VECT_VAR(V,T,W,N) xNAME(V,VECT_NAME(T,W,N)) >>> +#define VECT_VAR_DECL(V, T, W, N) T##W##_t VECT_VAR(V,T,W,N) >>> + >>> +/* Array declarations. */ >>> +#define ARRAY(V, T, W, N) VECT_VAR_DECL(V,T,W,N)[N] >>> + >>> +/* Check results vs expected values. */ >>> +#define CHECK(MSG,T,W,N,FMT) \ >>> + for(i=0; i>> + { \ >>> + if (VECT_VAR(result, T, W, N)[i] != VECT_VAR(expected, T, W, N)[i]) >>> { \ >>> + fprintf(stderr, \ >>> + "ERROR in %s at type %s index %d: 0x%" FMT " != 0x%" \ >>> + FMT " (expected)\n", \ >>> + MSG, STR(VECT_NAME(T, W, N)), i, \ >>> + VECT_VAR(result, T, W, N)[i], \ >>> + VECT_VAR(expected, T, W, N)[i]); \ >>> + abort(); \ >>> + } >>> \ >>> + } >>> + >>> +/* Floating-point variant. */ >>> +#define CHECK_FP(MSG,T,W,N,FMT) >>> \ >>> + for(i=0; i>> + { \ >>> + union fp_operand { \ >>> + uint##W##_t i; \ >>> + float##W##_t f; \ >>> + } tmp_res, tmp_exp; \ >>> + tmp_res.f = VECT_VAR(result, T, W, N)[i]; >>> \ >>> + tmp_exp.f = VECT_VAR(expected, T, W, N)[i]; \ >>> + if (tmp_res.i != tmp_exp.i) { \ >>> + fprintf(stderr, \ >>> + "ERROR in %s at type %s index %d: 0x%" FMT " != 0x%" \ >>> + FMT " (expected)\n", \ >>> + MSG, STR(VECT_NAME(T, W, N)), i, \ >>> + tmp_res.i, \ >>> + tmp_exp.i); \ >>> + abort(); \ >>> + } >>> \ >>> + } >>> + >>> +/* Clean buffer with a non-zero pattern. */ >>> +#define CLEAN_PATTERN_8 0x33 >>> + >>> +#define CLEAN(VAR,T,W,N) \ >>> + memset(VECT_VAR(VAR, T, W, N), \ >>> + CLEAN_PATTERN_8, \ >>> + sizeof(VECT_VAR(VAR, T, W, N))); >>> + >>> +/* Input buffers, one of each size. */ >>> +extern ARRAY(buffer, int, 8, 8); >>> +extern ARRAY(buffer, int, 16, 4); >>> +extern ARRAY(buffer, int, 32, 2); >>> +extern ARRAY(buffer, int, 64, 1); >>> +extern ARRAY(buffer, uint, 8, 8); >>> +extern ARRAY(buffer, uint, 16, 4); >>> +extern ARRAY(buffer, uint, 32, 2); >>> +extern ARRAY(buffer, uint, 64, 1); >>> +extern ARRAY(buffer, poly, 8, 8); >>> +extern ARRAY(buffer, poly, 16, 4); >>> +extern ARRAY(buffer, float, 32, 2); >>> +extern ARRAY(buffer, int, 8, 16); >>> +extern ARRAY(buffer, int, 16, 8); >>> +extern ARRAY(buffer, int, 32, 4); >>> +extern ARRAY(buffer, int, 64, 2); >>> +extern ARRAY(buffer, uint, 8, 16); >>> +extern ARRAY(buffer, uint, 16, 8); >>> +extern ARRAY(buffer, uint, 32, 4); >>> +extern ARRAY(buffer, uint, 64, 2); >>> +extern ARRAY(buffer, poly, 8, 16); >>> +extern ARRAY(buffer, poly, 16, 8); >>> +extern ARRAY(buffer, float, 32, 4); >>> + >>> +/* Output buffers, one of each size. */ >>> +static ARRAY(result, int, 8, 8); >>> +static ARRAY(result, int, 16, 4); >>> +static ARRAY(result, int, 32, 2); >>> +static ARRAY(result, int, 64, 1); >>> +static ARRAY(result, uint, 8, 8); >>> +static ARRAY(result, uint, 16, 4); >>> +static ARRAY(result, uint, 32, 2); >>> +static ARRAY(result, uint, 64, 1); >>> +static ARRAY(result, poly, 8, 8); >>> +static ARRAY(result, poly, 16, 4); >>> +static ARRAY(result, float, 32, 2); >>> +static ARRAY(result, int, 8, 16); >>> +static ARRAY(result, int, 16, 8); >>> +static ARRAY(result, int, 32, 4); >>> +static ARRAY(result, int, 64, 2); >>> +static ARRAY(result, uint, 8, 16); >>> +static ARRAY(result, uint, 16, 8); >>> +static ARRAY(result, uint, 32, 4); >>> +static ARRAY(result, uint, 64, 2); >>> +static ARRAY(result, poly, 8, 16); >>> +static ARRAY(result, poly, 16, 8); >>> +static ARRAY(result, float, 32, 4); >>> + >>> +/* Expected results, one of each size. */ >>> +extern ARRAY(expected, int, 8, 8); >>> +extern ARRAY(expected, int, 16, 4); >>> +extern ARRAY(expected, int, 32, 2); >>> +extern ARRAY(expected, int, 64, 1); >>> +extern ARRAY(expected, uint, 8, 8); >>> +extern ARRAY(expected, uint, 16, 4); >>> +extern ARRAY(expected, uint, 32, 2); >>> +extern ARRAY(expected, uint, 64, 1); >>> +extern ARRAY(expected, poly, 8, 8); >>> +extern ARRAY(expected, poly, 16, 4); >>> +extern ARRAY(expected, float, 32, 2); >>> +extern ARRAY(expected, int, 8, 16); >>> +extern ARRAY(expected, int, 16, 8); >>> +extern ARRAY(expected, int, 32, 4); >>> +extern ARRAY(expected, int, 64, 2); >>> +extern ARRAY(expected, uint, 8, 16); >>> +extern ARRAY(expected, uint, 16, 8); >>> +extern ARRAY(expected, uint, 32, 4); >>> +extern ARRAY(expected, uint, 64, 2); >>> +extern ARRAY(expected, poly, 8, 16); >>> +extern ARRAY(expected, poly, 16, 8); >>> +extern ARRAY(expected, float, 32, 4); >>> + >>> +/* Check results. */ >>> +static void check_results (const char*test_name, const char* comment) >>> +{ >>> + int i; >>> + >>> + CHECK(test_name, int, 8, 8, PRIx8); >>> + CHECK(test_name, int, 16, 4, PRIx16); >>> + CHECK(test_name, int, 32, 2, PRIx32); >>> + CHECK(test_name, int, 64, 1, PRIx64); >>> + CHECK(test_name, uint, 8, 8, PRIx8); >>> + CHECK(test_name, uint, 16, 4, PRIx16); >>> + CHECK(test_name, uint, 32, 2, PRIx32); >>> + CHECK(test_name, uint, 64, 1, PRIx64); >>> + CHECK(test_name, poly, 8, 8, PRIx8); >>> + CHECK(test_name, poly, 16, 4, PRIx16); >>> + CHECK_FP(test_name, float, 32, 2, PRIx32); >>> + >>> + CHECK(test_name, int, 8, 16, PRIx8); >>> + CHECK(test_name, int, 16, 8, PRIx16); >>> + CHECK(test_name, int, 32, 4, PRIx32); >>> + CHECK(test_name, int, 64, 2, PRIx64); >>> + CHECK(test_name, uint, 8, 16, PRIx8); >>> + CHECK(test_name, uint, 16, 8, PRIx16); >>> + CHECK(test_name, uint, 32, 4, PRIx32); >>> + CHECK(test_name, uint, 64, 2, PRIx64); >>> + CHECK(test_name, poly, 8, 16, PRIx8); >>> + CHECK(test_name, poly, 16, 8, PRIx16); >>> + CHECK_FP(test_name, float, 32, 4, PRIx32); >>> +} >>> + >>> +/* Clean output buffers before execution. */ >>> +static void clean_results (void) >>> +{ >>> + CLEAN(result, int, 8, 8); >>> + CLEAN(result, int, 16, 4); >>> + CLEAN(result, int, 32, 2); >>> + CLEAN(result, int, 64, 1); >>> + CLEAN(result, uint, 8, 8); >>> + CLEAN(result, uint, 16, 4); >>> + CLEAN(result, uint, 32, 2); >>> + CLEAN(result, uint, 64, 1); >>> + CLEAN(result, poly, 8, 8); >>> + CLEAN(result, poly, 16, 4); >>> + CLEAN(result, float, 32, 2); >>> + >>> + CLEAN(result, int, 8, 16); >>> + CLEAN(result, int, 16, 8); >>> + CLEAN(result, int, 32, 4); >>> + CLEAN(result, int, 64, 2); >>> + CLEAN(result, uint, 8, 16); >>> + CLEAN(result, uint, 16, 8); >>> + CLEAN(result, uint, 32, 4); >>> + CLEAN(result, uint, 64, 2); >>> + CLEAN(result, poly, 8, 16); >>> + CLEAN(result, poly, 16, 8); >>> + CLEAN(result, float, 32, 4); >>> +} >>> + >>> + >>> +/* Helpers to declare variables of various types. */ >>> +#define DECL_VARIABLE(VAR, T1, W, N) \ >>> + VECT_TYPE(T1, W, N) VECT_VAR(VAR, T1, W, N) >>> + >>> +#define DECL_VARIABLE_64BITS_SIGNED_VARIANTS(VAR) \ >>> + DECL_VARIABLE(VAR, int, 8, 8); \ >>> + DECL_VARIABLE(VAR, int, 16, 4); \ >>> + DECL_VARIABLE(VAR, int, 32, 2); \ >>> + DECL_VARIABLE(VAR, int, 64, 1) >>> + >>> +#define DECL_VARIABLE_64BITS_UNSIGNED_VARIANTS(VAR) \ >>> + DECL_VARIABLE(VAR, uint, 8, 8); \ >>> + DECL_VARIABLE(VAR, uint, 16, 4); \ >>> + DECL_VARIABLE(VAR, uint, 32, 2); \ >>> + DECL_VARIABLE(VAR, uint, 64, 1) >>> + >>> +#define DECL_VARIABLE_128BITS_SIGNED_VARIANTS(VAR) \ >>> + DECL_VARIABLE(VAR, int, 8, 16); \ >>> + DECL_VARIABLE(VAR, int, 16, 8); \ >>> + DECL_VARIABLE(VAR, int, 32, 4); \ >>> + DECL_VARIABLE(VAR, int, 64, 2) >>> + >>> +#define DECL_VARIABLE_128BITS_UNSIGNED_VARIANTS(VAR) \ >>> + DECL_VARIABLE(VAR, uint, 8, 16); \ >>> + DECL_VARIABLE(VAR, uint, 16, 8); \ >>> + DECL_VARIABLE(VAR, uint, 32, 4); \ >>> + DECL_VARIABLE(VAR, uint, 64, 2) >>> + >>> +#define DECL_VARIABLE_64BITS_VARIANTS(VAR) \ >>> + DECL_VARIABLE_64BITS_SIGNED_VARIANTS(VAR); \ >>> + DECL_VARIABLE_64BITS_UNSIGNED_VARIANTS(VAR); \ >>> + DECL_VARIABLE(VAR, poly, 8, 8); \ >>> + DECL_VARIABLE(VAR, poly, 16, 4); \ >>> + DECL_VARIABLE(VAR, float, 32, 2) >>> + >>> +#define DECL_VARIABLE_128BITS_VARIANTS(VAR) \ >>> + DECL_VARIABLE_128BITS_SIGNED_VARIANTS(VAR); \ >>> + DECL_VARIABLE_128BITS_UNSIGNED_VARIANTS(VAR); \ >>> + DECL_VARIABLE(VAR, poly, 8, 16); \ >>> + DECL_VARIABLE(VAR, poly, 16, 8); \ >>> + DECL_VARIABLE(VAR, float, 32, 4) >>> + >>> +#define DECL_VARIABLE_ALL_VARIANTS(VAR) \ >>> + DECL_VARIABLE_64BITS_VARIANTS(VAR); \ >>> + DECL_VARIABLE_128BITS_VARIANTS(VAR) >>> + >>> +/* Helpers to initialize vectors. */ >>> +#define TEST_VDUP(VAR, Q, T1, T2, W, N, V) \ >>> + VECT_VAR(VAR, T1, W, N) = vdup##Q##_n_##T2##W(V) >>> + >>> +#define TEST_VSET_LANE(VAR, Q, T1, T2, W, N, L, V) \ >>> + VECT_VAR(VAR, T1, W, N) = vset##Q##_lane_##T2##W(V, \ >>> + VECT_VAR(VAR, T1, W, >>> N), \ >>> + L) >>> + >>> +/* We need to load initial values first, so rely on VLD1. */ >>> +#define TEST_VLOAD(VAR, BUF, Q, T1, T2, W, N) \ >>> + VECT_VAR(VAR, T1, W, N) = vld1##Q##_##T2##W(VECT_VAR(BUF, T1, W, N)) >>> + >>> +/* Helpers for macros with 1 constant and 5 variable arguments. */ >>> +#define TEST_MACRO_64BITS_SIGNED_VARIANTS_1_5(MACRO, VAR) \ >>> + MACRO(VAR, , int, s, 8, 8); \ >>> + MACRO(VAR, , int, s, 16, 4); \ >>> + MACRO(VAR, , int, s, 32, 2); \ >>> + MACRO(VAR, , int, s, 64, 1) >>> + >>> +#define TEST_MACRO_64BITS_UNSIGNED_VARIANTS_1_5(MACRO, VAR) \ >>> + MACRO(VAR, , uint, u, 8, 8); \ >>> + MACRO(VAR, , uint, u, 16, 4); \ >>> + MACRO(VAR, , uint, u, 32, 2); \ >>> + MACRO(VAR, , uint, u, 64, 1) >>> + >>> +#define TEST_MACRO_128BITS_SIGNED_VARIANTS_1_5(MACRO, VAR) \ >>> + MACRO(VAR, q, int, s, 8, 16); \ >>> + MACRO(VAR, q, int, s, 16, 8); \ >>> + MACRO(VAR, q, int, s, 32, 4); \ >>> + MACRO(VAR, q, int, s, 64, 2) >>> + >>> +#define TEST_MACRO_128BITS_UNSIGNED_VARIANTS_1_5(MACRO,VAR) \ >>> + MACRO(VAR, q, uint, u, 8, 16); \ >>> + MACRO(VAR, q, uint, u, 16, 8); \ >>> + MACRO(VAR, q, uint, u, 32, 4); \ >>> + MACRO(VAR, q, uint, u, 64, 2) >>> + >>> +#define TEST_MACRO_64BITS_VARIANTS_1_5(MACRO, VAR) \ >>> + TEST_MACRO_64BITS_SIGNED_VARIANTS_1_5(MACRO, VAR); \ >>> + TEST_MACRO_64BITS_UNSIGNED_VARIANTS_1_5(MACRO, VAR) >>> + >>> +#define TEST_MACRO_128BITS_VARIANTS_1_5(MACRO, VAR) \ >>> + TEST_MACRO_128BITS_SIGNED_VARIANTS_1_5(MACRO, VAR); \ >>> + TEST_MACRO_128BITS_UNSIGNED_VARIANTS_1_5(MACRO, VAR) >>> + >>> +#define TEST_MACRO_ALL_VARIANTS_1_5(MACRO, VAR) \ >>> + TEST_MACRO_64BITS_VARIANTS_1_5(MACRO, VAR); \ >>> + TEST_MACRO_128BITS_VARIANTS_1_5(MACRO, VAR) >>> + >>> +#define TEST_MACRO_SIGNED_VARIANTS_1_5(MACRO, VAR) \ >>> + TEST_MACRO_64BITS_SIGNED_VARIANTS_1_5(MACRO, VAR); \ >>> + TEST_MACRO_128BITS_SIGNED_VARIANTS_1_5(MACRO, VAR) >>> + >>> +/* Helpers for macros with 2 constant and 5 variable arguments. */ >>> +#define TEST_MACRO_64BITS_SIGNED_VARIANTS_2_5(MACRO, VAR1, VAR2) \ >>> + MACRO(VAR1, VAR2, , int, s, 8, 8); \ >>> + MACRO(VAR1, VAR2, , int, s, 16, 4); \ >>> + MACRO(VAR1, VAR2, , int, s, 32, 2); \ >>> + MACRO(VAR1, VAR2 , , int, s, 64, 1) >>> + >>> +#define TEST_MACRO_64BITS_UNSIGNED_VARIANTS_2_5(MACRO, VAR1, VAR2) \ >>> + MACRO(VAR1, VAR2, , uint, u, 8, 8); \ >>> + MACRO(VAR1, VAR2, , uint, u, 16, 4); \ >>> + MACRO(VAR1, VAR2, , uint, u, 32, 2); \ >>> + MACRO(VAR1, VAR2, , uint, u, 64, 1) >>> + >>> +#define TEST_MACRO_128BITS_SIGNED_VARIANTS_2_5(MACRO, VAR1, VAR2) \ >>> + MACRO(VAR1, VAR2, q, int, s, 8, 16); \ >>> + MACRO(VAR1, VAR2, q, int, s, 16, 8); \ >>> + MACRO(VAR1, VAR2, q, int, s, 32, 4); \ >>> + MACRO(VAR1, VAR2, q, int, s, 64, 2) >>> + >>> +#define TEST_MACRO_128BITS_UNSIGNED_VARIANTS_2_5(MACRO, VAR1, VAR2) \ >>> + MACRO(VAR1, VAR2, q, uint, u, 8, 16); >>> \ >>> + MACRO(VAR1, VAR2, q, uint, u, 16, 8); >>> \ >>> + MACRO(VAR1, VAR2, q, uint, u, 32, 4); >>> \ >>> + MACRO(VAR1, VAR2, q, uint, u, 64, 2) >>> + >>> +#define TEST_MACRO_64BITS_VARIANTS_2_5(MACRO, VAR1, VAR2) \ >>> + TEST_MACRO_64BITS_SIGNED_VARIANTS_2_5(MACRO, VAR1, VAR2); \ >>> + TEST_MACRO_64BITS_UNSIGNED_VARIANTS_2_5(MACRO, VAR1, VAR2); \ >>> + MACRO(VAR1, VAR2, , poly, p, 8, 8); \ >>> + MACRO(VAR1, VAR2, , poly, p, 16, 4) >>> + >>> +#define TEST_MACRO_128BITS_VARIANTS_2_5(MACRO, VAR1, VAR2) \ >>> + TEST_MACRO_128BITS_SIGNED_VARIANTS_2_5(MACRO, VAR1, VAR2); \ >>> + TEST_MACRO_128BITS_UNSIGNED_VARIANTS_2_5(MACRO, VAR1, VAR2); \ >>> + MACRO(VAR1, VAR2, q, poly, p, 8, 16); \ >>> + MACRO(VAR1, VAR2, q, poly, p, 16, 8) >>> + >>> +#define TEST_MACRO_ALL_VARIANTS_2_5(MACRO, VAR1, VAR2) \ >>> + TEST_MACRO_64BITS_VARIANTS_2_5(MACRO, VAR1, VAR2); \ >>> + TEST_MACRO_128BITS_VARIANTS_2_5(MACRO, VAR1, VAR2) >>> + >>> +#define TEST_MACRO_SIGNED_VARIANTS_2_5(MACRO, VAR1, VAR2) \ >>> + TEST_MACRO_64BITS_SIGNED_VARIANTS_2_5(MACRO, VAR1, VAR2); \ >>> + TEST_MACRO_128BITS_SIGNED_VARIANTS_2_5(MACRO, VAR1, VAR2) >>> + >>> +#endif /*_ARM_NEON_REF_H_ */ >>> diff -rNup '--exclude=.git' >>> gcc-fsf/gcc/testsuite/gcc.target/arm/neon-intrinsics/compute_ref_data.h >>> gcc-fsf-neontests/gcc/testsuite/gcc.target/arm/neon-intrinsics/compute_ref_data.h >>> --- >>> gcc-fsf/gcc/testsuite/gcc.target/arm/neon-intrinsics/compute_ref_data.h >>> 1970-01-01 01:00:00.000000000 +0100 >>> +++ >>> gcc-fsf-neontests/gcc/testsuite/gcc.target/arm/neon-intrinsics/compute_ref_data.h >>> 2013-05-09 00:31:03.563656926 +0200 >>> @@ -0,0 +1,80 @@ >>> +#include >>> +#include "arm-neon-ref.h" >>> + >>> +/* Initialization helpers; 4 slices are needed for vld2, vld3 and >>> + vld4. */ >>> +#define MY_INIT_TAB(T,W,N) xNAME(INIT_TAB,N)(T##W##_t) >>> +#define MY_INIT_TAB2(T,W,N) xNAME(INIT_TAB2,N)(T##W##_t) >>> +#define MY_INIT_TAB3(T,W,N) xNAME(INIT_TAB3,N)(T##W##_t) >>> +#define MY_INIT_TAB4(T,W,N) xNAME(INIT_TAB4,N)(T##W##_t) >>> + >>> +/* Initialized input buffers. */ >>> +#define VECT_VAR_DECL_INIT(V, T, W, N) \ >>> + VECT_VAR_DECL(V,T,W,N) [] = { MY_INIT_TAB(T,W,N) }; >>> + >>> +/* Sample initialization vectors. */ >>> +#define INIT_TAB_1(T) \ >>> + (T)-16, >>> + >>> +#define INIT_TAB_2(T) \ >>> + (T)-16, (T)-15, >>> + >>> +#define INIT_TAB_4(T) \ >>> + (T)-16, (T)-15, (T)-14, (T)-13, >>> + >>> +#define INIT_TAB_8(T) \ >>> + (T)-16, (T)-15, (T)-14, (T)-13, (T)-12, (T)-11, (T)-10, (T)-9, >>> + >>> +#define INIT_TAB_16(T) \ >>> + (T)-16, (T)-15, (T)-14, (T)-13, (T)-12, (T)-11, (T)-10, (T)-9, \ >>> + (T)-8, (T)-7, (T)-6, (T)-5, (T)-4, (T)-3, (T)-2, (T)-1, >>> + >>> +/* This one is used for padding between input buffers. */ >>> +#define PAD(V, T, W, N) char VECT_VAR(V,T,W,N)=42; >>> + >>> +/* Input buffers, one of each size. */ >>> +/* Insert some padding to try to exhibit out of bounds accesses. */ >>> +VECT_VAR_DECL_INIT(buffer, int, 8, 8); >>> +PAD(buffer_pad, int, 8, 8); >>> +VECT_VAR_DECL_INIT(buffer, int, 16, 4); >>> +PAD(buffer_pad, int, 16, 4); >>> +VECT_VAR_DECL_INIT(buffer, int, 32, 2); >>> +PAD(buffer_pad, int, 32, 2); >>> +VECT_VAR_DECL_INIT(buffer, int, 64, 1); >>> +PAD(buffer_pad, int, 64, 1); >>> +VECT_VAR_DECL_INIT(buffer, uint, 8, 8); >>> +PAD(buffer_pad, uint, 8, 8); >>> +VECT_VAR_DECL_INIT(buffer, poly, 8, 8); >>> +PAD(buffer_pad, poly, 8, 8); >>> +VECT_VAR_DECL_INIT(buffer, poly, 16, 4); >>> +PAD(buffer_pad, poly, 16, 4); >>> +VECT_VAR_DECL_INIT(buffer, uint, 16, 4); >>> +PAD(buffer_pad, uint, 16, 4); >>> +VECT_VAR_DECL_INIT(buffer, uint, 32, 2); >>> +PAD(buffer_pad, uint, 32, 2); >>> +VECT_VAR_DECL_INIT(buffer, uint, 64, 1); >>> +PAD(buffer_pad, uint, 64, 1); >>> +VECT_VAR_DECL_INIT(buffer, float, 32, 2); >>> +PAD(buffer_pad, float, 32, 2); >>> +VECT_VAR_DECL_INIT(buffer, int, 8, 16); >>> +PAD(buffer_pad, int, 8, 16); >>> +VECT_VAR_DECL_INIT(buffer, int, 16, 8); >>> +PAD(buffer_pad, int, 16, 8); >>> +VECT_VAR_DECL_INIT(buffer, int, 32, 4); >>> +PAD(buffer_pad, int, 32, 4); >>> +VECT_VAR_DECL_INIT(buffer, int, 64, 2); >>> +PAD(buffer_pad, int, 64, 2); >>> +VECT_VAR_DECL_INIT(buffer, uint, 8, 16); >>> +PAD(buffer_pad, uint, 8, 16); >>> +VECT_VAR_DECL_INIT(buffer, uint, 16, 8); >>> +PAD(buffer_pad, uint, 16, 8); >>> +VECT_VAR_DECL_INIT(buffer, uint, 32, 4); >>> +PAD(buffer_pad, uint, 32, 4); >>> +VECT_VAR_DECL_INIT(buffer, uint, 64, 2); >>> +PAD(buffer_pad, uint, 64, 2); >>> +VECT_VAR_DECL_INIT(buffer, poly, 8, 16); >>> +PAD(buffer_pad, poly, 8, 16); >>> +VECT_VAR_DECL_INIT(buffer, poly, 16, 8); >>> +PAD(buffer_pad, poly, 16, 8); >>> +VECT_VAR_DECL_INIT(buffer, float, 32, 4); >>> +PAD(buffer_pad, float, 32, 4); >>> diff -rNup '--exclude=.git' >>> gcc-fsf/gcc/testsuite/gcc.target/arm/neon-intrinsics/ref_vaba.c >>> gcc-fsf-neontests/gcc/testsuite/gcc.target/arm/neon-intrinsics/ref_vaba.c >>> --- gcc-fsf/gcc/testsuite/gcc.target/arm/neon-intrinsics/ref_vaba.c >>> 1970-01-01 01:00:00.000000000 +0100 >>> +++ >>> gcc-fsf-neontests/gcc/testsuite/gcc.target/arm/neon-intrinsics/ref_vaba.c >>> 2013-05-09 00:40:27.611642141 +0200 >>> @@ -0,0 +1,145 @@ >>> +/* { dg-do run } */ >>> +/* { dg-require-effective-target arm_neon_hw } */ >>> +/* { dg-add-options arm_neon } */ >>> + >>> +#include >>> +#include "arm-neon-ref.h" >>> +#include "compute_ref_data.h" >>> + >>> +VECT_VAR_DECL(expected,int,8,8) [] = { 0xf6, 0xf7, 0xf8, 0xf9, >>> + 0xfa, 0xfb, 0xfc, 0xfd }; >>> +VECT_VAR_DECL(expected,int,16,4) [] = { 0x16, 0x17, 0x18, 0x19 }; >>> +VECT_VAR_DECL(expected,int,32,2) [] = { 0x20, 0x21 }; >>> +VECT_VAR_DECL(expected,int,64,1) [] = { 0x3333333333333333 }; >>> +VECT_VAR_DECL(expected,uint,8,8) [] = { 0x53, 0x54, 0x55, 0x56, >>> + 0x57, 0x58, 0x59, 0x5a }; >>> +VECT_VAR_DECL(expected,uint,16,4) [] = { 0x907, 0x908, 0x909, 0x90a }; >>> +VECT_VAR_DECL(expected,uint,32,2) [] = { 0xffffffe7, 0xffffffe8 }; >>> +VECT_VAR_DECL(expected,uint,64,1) [] = { 0x3333333333333333 }; >>> +VECT_VAR_DECL(expected,poly,8,8) [] = { 0x33, 0x33, 0x33, 0x33, >>> + 0x33, 0x33, 0x33, 0x33 }; >>> +VECT_VAR_DECL(expected,poly,16,4) [] = { 0x3333, 0x3333, 0x3333, 0x3333 >>> }; >>> +VECT_VAR_DECL(expected,float,32,2) [] = { 4.172325e-08, 4.172325e-08 }; >>> +VECT_VAR_DECL(expected,int,8,16) [] = { 0x5e, 0x5f, 0x60, 0x61, >>> + 0x62, 0x63, 0x64, 0x65, >>> + 0x66, 0x67, 0x68, 0x69, >>> + 0x6a, 0x6b, 0x6c, 0x6d }; >>> +VECT_VAR_DECL(expected,int,16,8) [] = { 0xb9c, 0xb9d, 0xb9e, 0xb9f, >>> + 0xba0, 0xba1, 0xba2, 0xba3 }; >>> +VECT_VAR_DECL(expected,int,32,4) [] = { 0x26e0, 0x26e1, 0x26e2, 0x26e3 }; >>> +VECT_VAR_DECL(expected,int,64,2) [] = { 0x3333333333333333, >>> + 0x3333333333333333 }; >>> +VECT_VAR_DECL(expected,uint,8,16) [] = { 0xf8, 0xf9, 0xfa, 0xfb, >>> + 0xfc, 0xfd, 0xfe, 0xff, >>> + 0x0, 0x1, 0x2, 0x3, >>> + 0x4, 0x5, 0x6, 0x7 }; >>> +VECT_VAR_DECL(expected,uint,16,8) [] = { 0xfff9, 0xfffa, 0xfffb, 0xfffc, >>> + 0xfffd, 0xfffe, 0xffff, 0x0 }; >>> +VECT_VAR_DECL(expected,uint,32,4) [] = { 0xc, 0xd, 0xe, 0xf }; >>> +VECT_VAR_DECL(expected,uint,64,2) [] = { 0x3333333333333333, >>> + 0x3333333333333333 }; >>> +VECT_VAR_DECL(expected,poly,8,16) [] = { 0x33, 0x33, 0x33, 0x33, >>> + 0x33, 0x33, 0x33, 0x33, >>> + 0x33, 0x33, 0x33, 0x33, >>> + 0x33, 0x33, 0x33, 0x33 }; >>> +VECT_VAR_DECL(expected,poly,16,8) [] = { 0x3333, 0x3333, 0x3333, 0x3333, >>> + 0x3333, 0x3333, 0x3333, 0x3333 }; >>> +VECT_VAR_DECL(expected,float,32,4) [] = { 4.172325e-08, 4.172325e-08, >>> + 4.172325e-08, 4.172325e-08 }; >>> + >>> +#define TEST_MSG "VABA/VABAQ" >>> +void exec_vaba (void) >>> +{ >>> + /* Basic test: v4=vaba(v1,v2,v3), then store the result. */ >>> +#define TEST_VABA(Q, T1, T2, W, N) \ >>> + VECT_VAR(vector_res, T1, W, N) = \ >>> + vaba##Q##_##T2##W(VECT_VAR(vector1, T1, W, N), \ >>> + VECT_VAR(vector2, T1, W, N), \ >>> + VECT_VAR(vector3, T1, W, N)); \ >>> + vst1##Q##_##T2##W(VECT_VAR(result, T1, W, N), VECT_VAR(vector_res, T1, >>> W, N)) >>> + >>> +#define DECL_VABA_VAR(VAR) \ >>> + DECL_VARIABLE(VAR, int, 8, 8); \ >>> + DECL_VARIABLE(VAR, int, 16, 4); \ >>> + DECL_VARIABLE(VAR, int, 32, 2); \ >>> + DECL_VARIABLE(VAR, uint, 8, 8); \ >>> + DECL_VARIABLE(VAR, uint, 16, 4); \ >>> + DECL_VARIABLE(VAR, uint, 32, 2); \ >>> + DECL_VARIABLE(VAR, int, 8, 16); \ >>> + DECL_VARIABLE(VAR, int, 16, 8); \ >>> + DECL_VARIABLE(VAR, int, 32, 4); \ >>> + DECL_VARIABLE(VAR, uint, 8, 16); \ >>> + DECL_VARIABLE(VAR, uint, 16, 8); \ >>> + DECL_VARIABLE(VAR, uint, 32, 4) >>> + >>> + DECL_VABA_VAR(vector1); >>> + DECL_VABA_VAR(vector2); >>> + DECL_VABA_VAR(vector3); >>> + DECL_VABA_VAR(vector_res); >>> + >>> + clean_results (); >>> + >>> + /* Initialize input "vector" from "buffer". */ >>> + TEST_VLOAD(vector1, buffer, , int, s, 8, 8); >>> + TEST_VLOAD(vector1, buffer, , int, s, 16, 4); >>> + TEST_VLOAD(vector1, buffer, , int, s, 32, 2); >>> + TEST_VLOAD(vector1, buffer, , uint, u, 8, 8); >>> + TEST_VLOAD(vector1, buffer, , uint, u, 16, 4); >>> + TEST_VLOAD(vector1, buffer, , uint, u, 32, 2); >>> + TEST_VLOAD(vector1, buffer, q, int, s, 8, 16); >>> + TEST_VLOAD(vector1, buffer, q, int, s, 16, 8); >>> + TEST_VLOAD(vector1, buffer, q, int, s, 32, 4); >>> + TEST_VLOAD(vector1, buffer, q, uint, u, 8, 16); >>> + TEST_VLOAD(vector1, buffer, q, uint, u, 16, 8); >>> + TEST_VLOAD(vector1, buffer, q, uint, u, 32, 4); >>> + >>> + /* Choose init value arbitrarily. */ >>> + TEST_VDUP(vector2, , int, s, 8, 8, 1); >>> + TEST_VDUP(vector2, , int, s, 16, 4, -13); >>> + TEST_VDUP(vector2, , int, s, 32, 2, 8); >>> + TEST_VDUP(vector2, , uint, u, 8, 8, 1); >>> + TEST_VDUP(vector2, , uint, u, 16, 4, 13); >>> + TEST_VDUP(vector2, , uint, u, 32, 2, 8); >>> + TEST_VDUP(vector2, q, int, s, 8, 16, 10); >>> + TEST_VDUP(vector2, q, int, s, 16, 8, -12); >>> + TEST_VDUP(vector2, q, int, s, 32, 4, 32); >>> + TEST_VDUP(vector2, q, uint, u, 8, 16, 10); >>> + TEST_VDUP(vector2, q, uint, u, 16, 8, 12); >>> + TEST_VDUP(vector2, q, uint, u, 32, 4, 32); >>> + >>> + /* Choose init value arbitrarily. */ >>> + TEST_VDUP(vector3, , int, s, 8, 8, -5); >>> + TEST_VDUP(vector3, , int, s, 16, 4, 25); >>> + TEST_VDUP(vector3, , int, s, 32, 2, -40); >>> + TEST_VDUP(vector3, , uint, u, 8, 8, 100); >>> + TEST_VDUP(vector3, , uint, u, 16, 4, 2340); >>> + TEST_VDUP(vector3, , uint, u, 32, 2, 0xffffffff); >>> + TEST_VDUP(vector3, q, int, s, 8, 16, -100); >>> + TEST_VDUP(vector3, q, int, s, 16, 8, -3000); >>> + TEST_VDUP(vector3, q, int, s, 32, 4, 10000); >>> + TEST_VDUP(vector3, q, uint, u, 8, 16, 2); >>> + TEST_VDUP(vector3, q, uint, u, 16, 8, 3); >>> + TEST_VDUP(vector3, q, uint, u, 32, 4, 4); >>> + >>> + /* Execute the tests. */ >>> + TEST_VABA(, int, s, 8, 8); >>> + TEST_VABA(, int, s, 16, 4); >>> + TEST_VABA(, int, s, 32, 2); >>> + TEST_VABA(, uint, u, 8, 8); >>> + TEST_VABA(, uint, u, 16, 4); >>> + TEST_VABA(, uint, u, 32, 2); >>> + TEST_VABA(q, int, s, 8, 16); >>> + TEST_VABA(q, int, s, 16, 8); >>> + TEST_VABA(q, int, s, 32, 4); >>> + TEST_VABA(q, uint, u, 8, 16); >>> + TEST_VABA(q, uint, u, 16, 8); >>> + TEST_VABA(q, uint, u, 32, 4); >>> + >>> + check_results (TEST_MSG, ""); >>> +} >>> + >>> +int main (void) >>> +{ >>> + exec_vaba (); >>> + return 0; >>> +} >>> diff -rNup '--exclude=.git' >>> gcc-fsf/gcc/testsuite/gcc.target/arm/neon-intrinsics/ref_vld1.c >>> gcc-fsf-neontests/gcc/testsuite/gcc.target/arm/neon-intrinsics/ref_vld1.c >>> --- gcc-fsf/gcc/testsuite/gcc.target/arm/neon-intrinsics/ref_vld1.c >>> 1970-01-01 01:00:00.000000000 +0100 >>> +++ >>> gcc-fsf-neontests/gcc/testsuite/gcc.target/arm/neon-intrinsics/ref_vld1.c >>> 2013-05-09 00:39:00.351644429 +0200 >>> @@ -0,0 +1,77 @@ >>> +/* { dg-do run } */ >>> +/* { dg-require-effective-target arm_neon_hw } */ >>> +/* { dg-add-options arm_neon } */ >>> + >>> +#include >>> +#include "arm-neon-ref.h" >>> +#include "compute_ref_data.h" >>> + >>> +VECT_VAR_DECL(expected,int,8,8) [] = { 0xf0, 0xf1, 0xf2, 0xf3, >>> + 0xf4, 0xf5, 0xf6, 0xf7 }; >>> +VECT_VAR_DECL(expected,int,16,4) [] = { 0xfff0, 0xfff1, 0xfff2, 0xfff3 }; >>> +VECT_VAR_DECL(expected,int,32,2) [] = { 0xfffffff0, 0xfffffff1 }; >>> +VECT_VAR_DECL(expected,int,64,1) [] = { 0xfffffffffffffff0 }; >>> +VECT_VAR_DECL(expected,uint,8,8) [] = { 0xf0, 0xf1, 0xf2, 0xf3, >>> + 0xf4, 0xf5, 0xf6, 0xf7 }; >>> +VECT_VAR_DECL(expected,uint,16,4) [] = { 0xfff0, 0xfff1, 0xfff2, 0xfff3 >>> }; >>> +VECT_VAR_DECL(expected,uint,32,2) [] = { 0xfffffff0, 0xfffffff1 }; >>> +VECT_VAR_DECL(expected,uint,64,1) [] = { 0xfffffffffffffff0 }; >>> +VECT_VAR_DECL(expected,poly,8,8) [] = { 0xf0, 0xf1, 0xf2, 0xf3, >>> + 0xf4, 0xf5, 0xf6, 0xf7 }; >>> +VECT_VAR_DECL(expected,poly,16,4) [] = { 0xfff0, 0xfff1, 0xfff2, 0xfff3 >>> }; >>> +VECT_VAR_DECL(expected,float,32,2) [] = { -16, -15 }; >>> +VECT_VAR_DECL(expected,int,8,16) [] = { 0xf0, 0xf1, 0xf2, 0xf3, >>> + 0xf4, 0xf5, 0xf6, 0xf7, >>> + 0xf8, 0xf9, 0xfa, 0xfb, >>> + 0xfc, 0xfd, 0xfe, 0xff }; >>> +VECT_VAR_DECL(expected,int,16,8) [] = { 0xfff0, 0xfff1, 0xfff2, 0xfff3, >>> + 0xfff4, 0xfff5, 0xfff6, 0xfff7 }; >>> +VECT_VAR_DECL(expected,int,32,4) [] = { 0xfffffff0, 0xfffffff1, >>> + 0xfffffff2, 0xfffffff3 }; >>> +VECT_VAR_DECL(expected,int,64,2) [] = { 0xfffffffffffffff0, >>> + 0xfffffffffffffff1 }; >>> +VECT_VAR_DECL(expected,uint,8,16) [] = { 0xf0, 0xf1, 0xf2, 0xf3, >>> + 0xf4, 0xf5, 0xf6, 0xf7, >>> + 0xf8, 0xf9, 0xfa, 0xfb, >>> + 0xfc, 0xfd, 0xfe, 0xff }; >>> +VECT_VAR_DECL(expected,uint,16,8) [] = { 0xfff0, 0xfff1, 0xfff2, >>> + 0xfff3, 0xfff4, 0xfff5, >>> + 0xfff6, 0xfff7 }; >>> +VECT_VAR_DECL(expected,uint,32,4) [] = { 0xfffffff0, 0xfffffff1, >>> + 0xfffffff2, 0xfffffff3 }; >>> +VECT_VAR_DECL(expected,uint,64,2) [] = { 0xfffffffffffffff0, >>> + 0xfffffffffffffff1 }; >>> +VECT_VAR_DECL(expected,poly,8,16) [] = { 0xf0, 0xf1, 0xf2, 0xf3, >>> + 0xf4, 0xf5, 0xf6, 0xf7, >>> + 0xf8, 0xf9, 0xfa, 0xfb, >>> + 0xfc, 0xfd, 0xfe, 0xff }; >>> +VECT_VAR_DECL(expected,poly,16,8) [] = { 0xfff0, 0xfff1, 0xfff2, 0xfff3, >>> + 0xfff4, 0xfff5, 0xfff6, 0xfff7 }; >>> +VECT_VAR_DECL(expected,float,32,4) [] = { -16, -15, -14, -13 }; >>> + >>> +#define TEST_MSG "VLD1/VLD1Q" >>> +void exec_vld1 (void) >>> +{ >>> + /* Basic test vec=vld1(buffer); then store vec: vst1(result, vector). >>> */ >>> + /* This test actually tests vdl1 and vst1 at the same time. */ >>> +#define TEST_VLD1(VAR, BUF, Q, T1, T2, W, N) \ >>> + VECT_VAR(VAR, T1, W, N) = vld1##Q##_##T2##W(VECT_VAR(BUF, T1, W, N)); \ >>> + vst1##Q##_##T2##W(VECT_VAR(result, T1, W, N), VECT_VAR(VAR, T1, W, N)) >>> + >>> + DECL_VARIABLE_ALL_VARIANTS(vector); >>> + >>> + clean_results (); >>> + >>> + TEST_MACRO_ALL_VARIANTS_2_5(TEST_VLD1, vector, buffer); >>> + >>> + TEST_VLD1(vector, buffer, , float, f, 32, 2); >>> + TEST_VLD1(vector, buffer, q, float, f, 32, 4); >>> + >>> + check_results (TEST_MSG, ""); >>> +} >>> + >>> +int main (void) >>> +{ >>> + exec_vld1 (); >>> + return 0; >>> +} >>> >> >> diff --git a/gcc/testsuite/gcc.target/arm/neon-intrinsics/arm-neon-ref.h b/gcc/testsuite/gcc.target/arm/neon-intrinsics/arm-neon-ref.h new file mode 100644 index 0000000..597ecf0 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/neon-intrinsics/arm-neon-ref.h @@ -0,0 +1,350 @@ +#ifndef _ARM_NEON_REF_H_ +#define _ARM_NEON_REF_H_ + +#include +#include + +extern void abort(void); +extern void *memset(void *, int, size_t); + +#define xSTR(X) #X +#define STR(X) xSTR(X) + +#define xNAME1(V,T) V ## _ ## T +#define xNAME(V,T) xNAME1(V,T) + +#define VAR(V,T,W) xNAME(V,T##W) +#define VAR_DECL(V, T, W) T##W##_t VAR(V,T,W) + +#define VECT_NAME(T, W, N) T##W##x##N +#define VECT_ARRAY_NAME(T, W, N, L) T##W##x##N##x##L +#define VECT_TYPE(T, W, N) xNAME(VECT_NAME(T,W,N),t) +#define VECT_ARRAY_TYPE(T, W, N, L) xNAME(VECT_ARRAY_NAME(T,W,N,L),t) + +#define VECT_VAR(V,T,W,N) xNAME(V,VECT_NAME(T,W,N)) +#define VECT_VAR_DECL(V, T, W, N) T##W##_t VECT_VAR(V,T,W,N) + +/* Array declarations. */ +#define ARRAY(V, T, W, N) VECT_VAR_DECL(V,T,W,N)[N] + +/* Check results vs expected values. */ +#define CHECK(MSG,T,W,N,FMT) \ + for(i=0; i +#include "arm-neon-ref.h" + +/* Initialization helpers; 4 slices are needed for vld2, vld3 and + vld4. */ +#define MY_INIT_TAB(T,W,N) xNAME(INIT_TAB,N)(T##W##_t) +#define MY_INIT_TAB2(T,W,N) xNAME(INIT_TAB2,N)(T##W##_t) +#define MY_INIT_TAB3(T,W,N) xNAME(INIT_TAB3,N)(T##W##_t) +#define MY_INIT_TAB4(T,W,N) xNAME(INIT_TAB4,N)(T##W##_t) + +/* Initialized input buffers. */ +#define VECT_VAR_DECL_INIT(V, T, W, N) \ + VECT_VAR_DECL(V,T,W,N) [] = { MY_INIT_TAB(T,W,N) }; + +/* Sample initialization vectors. */ +#define INIT_TAB_1(T) \ + (T)-16, + +#define INIT_TAB_2(T) \ + (T)-16, (T)-15, + +#define INIT_TAB_4(T) \ + (T)-16, (T)-15, (T)-14, (T)-13, + +#define INIT_TAB_8(T) \ + (T)-16, (T)-15, (T)-14, (T)-13, (T)-12, (T)-11, (T)-10, (T)-9, + +#define INIT_TAB_16(T) \ + (T)-16, (T)-15, (T)-14, (T)-13, (T)-12, (T)-11, (T)-10, (T)-9, \ + (T)-8, (T)-7, (T)-6, (T)-5, (T)-4, (T)-3, (T)-2, (T)-1, + +/* This one is used for padding between input buffers. */ +#define PAD(V, T, W, N) char VECT_VAR(V,T,W,N)=42; + +/* Input buffers, one of each size. */ +/* Insert some padding to try to exhibit out of bounds accesses. */ +VECT_VAR_DECL_INIT(buffer, int, 8, 8); +PAD(buffer_pad, int, 8, 8); +VECT_VAR_DECL_INIT(buffer, int, 16, 4); +PAD(buffer_pad, int, 16, 4); +VECT_VAR_DECL_INIT(buffer, int, 32, 2); +PAD(buffer_pad, int, 32, 2); +VECT_VAR_DECL_INIT(buffer, int, 64, 1); +PAD(buffer_pad, int, 64, 1); +VECT_VAR_DECL_INIT(buffer, uint, 8, 8); +PAD(buffer_pad, uint, 8, 8); +VECT_VAR_DECL_INIT(buffer, poly, 8, 8); +PAD(buffer_pad, poly, 8, 8); +VECT_VAR_DECL_INIT(buffer, poly, 16, 4); +PAD(buffer_pad, poly, 16, 4); +VECT_VAR_DECL_INIT(buffer, uint, 16, 4); +PAD(buffer_pad, uint, 16, 4); +VECT_VAR_DECL_INIT(buffer, uint, 32, 2); +PAD(buffer_pad, uint, 32, 2); +VECT_VAR_DECL_INIT(buffer, uint, 64, 1); +PAD(buffer_pad, uint, 64, 1); +VECT_VAR_DECL_INIT(buffer, float, 32, 2); +PAD(buffer_pad, float, 32, 2); +VECT_VAR_DECL_INIT(buffer, int, 8, 16); +PAD(buffer_pad, int, 8, 16); +VECT_VAR_DECL_INIT(buffer, int, 16, 8); +PAD(buffer_pad, int, 16, 8); +VECT_VAR_DECL_INIT(buffer, int, 32, 4); +PAD(buffer_pad, int, 32, 4); +VECT_VAR_DECL_INIT(buffer, int, 64, 2); +PAD(buffer_pad, int, 64, 2); +VECT_VAR_DECL_INIT(buffer, uint, 8, 16); +PAD(buffer_pad, uint, 8, 16); +VECT_VAR_DECL_INIT(buffer, uint, 16, 8); +PAD(buffer_pad, uint, 16, 8); +VECT_VAR_DECL_INIT(buffer, uint, 32, 4); +PAD(buffer_pad, uint, 32, 4); +VECT_VAR_DECL_INIT(buffer, uint, 64, 2); +PAD(buffer_pad, uint, 64, 2); +VECT_VAR_DECL_INIT(buffer, poly, 8, 16); +PAD(buffer_pad, poly, 8, 16); +VECT_VAR_DECL_INIT(buffer, poly, 16, 8); +PAD(buffer_pad, poly, 16, 8); +VECT_VAR_DECL_INIT(buffer, float, 32, 4); +PAD(buffer_pad, float, 32, 4); diff --git a/gcc/testsuite/gcc.target/arm/neon-intrinsics/neon-intrinsics.exp b/gcc/testsuite/gcc.target/arm/neon-intrinsics/neon-intrinsics.exp new file mode 100644 index 0000000..0ef4640 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/neon-intrinsics/neon-intrinsics.exp @@ -0,0 +1,49 @@ +# Copyright (C) 2013 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GCC; see the file COPYING3. If not see +# . + +# GCC testsuite that uses the `dg.exp' driver. + +# Exit immediately if this isn't an ARM target. +if {![istarget arm*-*-*] + && ![istarget aarch64*-*-*]} then { + return +} + +# Load support procs. +load_lib gcc-dg.exp + +# Initialize `dg'. +load_lib c-torture.exp +load_lib target-supports.exp +load_lib torture-options.exp + +torture-init +set-torture-options $C_TORTURE_OPTIONS {{}} $LTO_TORTURE_OPTIONS + +set additional_flags [add_options_for_arm_neon ""] + +# Main loop. +foreach src [lsort [glob -nocomplain $srcdir/$subdir/*.c]] { + # If we're only testing specific files and this isn't one of them, skip it. + if ![runtest_file_p $runtests $src] then { + continue + } + + c-torture-execute $src $additional_flags +} + +# All done. +torture-finish diff --git a/gcc/testsuite/gcc.target/arm/neon-intrinsics/vaba.c b/gcc/testsuite/gcc.target/arm/neon-intrinsics/vaba.c new file mode 100644 index 0000000..62b1e67 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/neon-intrinsics/vaba.c @@ -0,0 +1,145 @@ +/* { dg-do run } */ +/* { dg-require-effective-target arm_neon_hw { target { "arm* } } } */ +/* { dg-add-options arm_neon } */ + +#include +#include "arm-neon-ref.h" +#include "compute_ref_data.h" + +VECT_VAR_DECL(expected,int,8,8) [] = { 0xf6, 0xf7, 0xf8, 0xf9, + 0xfa, 0xfb, 0xfc, 0xfd }; +VECT_VAR_DECL(expected,int,16,4) [] = { 0x16, 0x17, 0x18, 0x19 }; +VECT_VAR_DECL(expected,int,32,2) [] = { 0x20, 0x21 }; +VECT_VAR_DECL(expected,int,64,1) [] = { 0x3333333333333333 }; +VECT_VAR_DECL(expected,uint,8,8) [] = { 0x53, 0x54, 0x55, 0x56, + 0x57, 0x58, 0x59, 0x5a }; +VECT_VAR_DECL(expected,uint,16,4) [] = { 0x907, 0x908, 0x909, 0x90a }; +VECT_VAR_DECL(expected,uint,32,2) [] = { 0xffffffe7, 0xffffffe8 }; +VECT_VAR_DECL(expected,uint,64,1) [] = { 0x3333333333333333 }; +VECT_VAR_DECL(expected,poly,8,8) [] = { 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33 }; +VECT_VAR_DECL(expected,poly,16,4) [] = { 0x3333, 0x3333, 0x3333, 0x3333 }; +VECT_VAR_DECL(expected,float,32,2) [] = { 4.172325e-08, 4.172325e-08 }; +VECT_VAR_DECL(expected,int,8,16) [] = { 0x5e, 0x5f, 0x60, 0x61, + 0x62, 0x63, 0x64, 0x65, + 0x66, 0x67, 0x68, 0x69, + 0x6a, 0x6b, 0x6c, 0x6d }; +VECT_VAR_DECL(expected,int,16,8) [] = { 0xb9c, 0xb9d, 0xb9e, 0xb9f, + 0xba0, 0xba1, 0xba2, 0xba3 }; +VECT_VAR_DECL(expected,int,32,4) [] = { 0x26e0, 0x26e1, 0x26e2, 0x26e3 }; +VECT_VAR_DECL(expected,int,64,2) [] = { 0x3333333333333333, + 0x3333333333333333 }; +VECT_VAR_DECL(expected,uint,8,16) [] = { 0xf8, 0xf9, 0xfa, 0xfb, + 0xfc, 0xfd, 0xfe, 0xff, + 0x0, 0x1, 0x2, 0x3, + 0x4, 0x5, 0x6, 0x7 }; +VECT_VAR_DECL(expected,uint,16,8) [] = { 0xfff9, 0xfffa, 0xfffb, 0xfffc, + 0xfffd, 0xfffe, 0xffff, 0x0 }; +VECT_VAR_DECL(expected,uint,32,4) [] = { 0xc, 0xd, 0xe, 0xf }; +VECT_VAR_DECL(expected,uint,64,2) [] = { 0x3333333333333333, + 0x3333333333333333 }; +VECT_VAR_DECL(expected,poly,8,16) [] = { 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33 }; +VECT_VAR_DECL(expected,poly,16,8) [] = { 0x3333, 0x3333, 0x3333, 0x3333, + 0x3333, 0x3333, 0x3333, 0x3333 }; +VECT_VAR_DECL(expected,float,32,4) [] = { 4.172325e-08, 4.172325e-08, + 4.172325e-08, 4.172325e-08 }; + +#define TEST_MSG "VABA/VABAQ" +void exec_vaba (void) +{ + /* Basic test: v4=vaba(v1,v2,v3), then store the result. */ +#define TEST_VABA(Q, T1, T2, W, N) \ + VECT_VAR(vector_res, T1, W, N) = \ + vaba##Q##_##T2##W(VECT_VAR(vector1, T1, W, N), \ + VECT_VAR(vector2, T1, W, N), \ + VECT_VAR(vector3, T1, W, N)); \ + vst1##Q##_##T2##W(VECT_VAR(result, T1, W, N), VECT_VAR(vector_res, T1, W, N)) + +#define DECL_VABA_VAR(VAR) \ + DECL_VARIABLE(VAR, int, 8, 8); \ + DECL_VARIABLE(VAR, int, 16, 4); \ + DECL_VARIABLE(VAR, int, 32, 2); \ + DECL_VARIABLE(VAR, uint, 8, 8); \ + DECL_VARIABLE(VAR, uint, 16, 4); \ + DECL_VARIABLE(VAR, uint, 32, 2); \ + DECL_VARIABLE(VAR, int, 8, 16); \ + DECL_VARIABLE(VAR, int, 16, 8); \ + DECL_VARIABLE(VAR, int, 32, 4); \ + DECL_VARIABLE(VAR, uint, 8, 16); \ + DECL_VARIABLE(VAR, uint, 16, 8); \ + DECL_VARIABLE(VAR, uint, 32, 4) + + DECL_VABA_VAR(vector1); + DECL_VABA_VAR(vector2); + DECL_VABA_VAR(vector3); + DECL_VABA_VAR(vector_res); + + clean_results (); + + /* Initialize input "vector" from "buffer". */ + VLOAD(vector1, buffer, , int, s, 8, 8); + VLOAD(vector1, buffer, , int, s, 16, 4); + VLOAD(vector1, buffer, , int, s, 32, 2); + VLOAD(vector1, buffer, , uint, u, 8, 8); + VLOAD(vector1, buffer, , uint, u, 16, 4); + VLOAD(vector1, buffer, , uint, u, 32, 2); + VLOAD(vector1, buffer, q, int, s, 8, 16); + VLOAD(vector1, buffer, q, int, s, 16, 8); + VLOAD(vector1, buffer, q, int, s, 32, 4); + VLOAD(vector1, buffer, q, uint, u, 8, 16); + VLOAD(vector1, buffer, q, uint, u, 16, 8); + VLOAD(vector1, buffer, q, uint, u, 32, 4); + + /* Choose init value arbitrarily. */ + VDUP(vector2, , int, s, 8, 8, 1); + VDUP(vector2, , int, s, 16, 4, -13); + VDUP(vector2, , int, s, 32, 2, 8); + VDUP(vector2, , uint, u, 8, 8, 1); + VDUP(vector2, , uint, u, 16, 4, 13); + VDUP(vector2, , uint, u, 32, 2, 8); + VDUP(vector2, q, int, s, 8, 16, 10); + VDUP(vector2, q, int, s, 16, 8, -12); + VDUP(vector2, q, int, s, 32, 4, 32); + VDUP(vector2, q, uint, u, 8, 16, 10); + VDUP(vector2, q, uint, u, 16, 8, 12); + VDUP(vector2, q, uint, u, 32, 4, 32); + + /* Choose init value arbitrarily. */ + VDUP(vector3, , int, s, 8, 8, -5); + VDUP(vector3, , int, s, 16, 4, 25); + VDUP(vector3, , int, s, 32, 2, -40); + VDUP(vector3, , uint, u, 8, 8, 100); + VDUP(vector3, , uint, u, 16, 4, 2340); + VDUP(vector3, , uint, u, 32, 2, 0xffffffff); + VDUP(vector3, q, int, s, 8, 16, -100); + VDUP(vector3, q, int, s, 16, 8, -3000); + VDUP(vector3, q, int, s, 32, 4, 10000); + VDUP(vector3, q, uint, u, 8, 16, 2); + VDUP(vector3, q, uint, u, 16, 8, 3); + VDUP(vector3, q, uint, u, 32, 4, 4); + + /* Execute the tests. */ + TEST_VABA(, int, s, 8, 8); + TEST_VABA(, int, s, 16, 4); + TEST_VABA(, int, s, 32, 2); + TEST_VABA(, uint, u, 8, 8); + TEST_VABA(, uint, u, 16, 4); + TEST_VABA(, uint, u, 32, 2); + TEST_VABA(q, int, s, 8, 16); + TEST_VABA(q, int, s, 16, 8); + TEST_VABA(q, int, s, 32, 4); + TEST_VABA(q, uint, u, 8, 16); + TEST_VABA(q, uint, u, 16, 8); + TEST_VABA(q, uint, u, 32, 4); + + check_results (TEST_MSG, ""); +} + +int main (void) +{ + exec_vaba (); + return 0; +} diff --git a/gcc/testsuite/gcc.target/arm/neon-intrinsics/vld1.c b/gcc/testsuite/gcc.target/arm/neon-intrinsics/vld1.c new file mode 100644 index 0000000..859db92 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/neon-intrinsics/vld1.c @@ -0,0 +1,77 @@ +/* { dg-do run } */ +/* { dg-require-effective-target arm_neon_hw { target { "arm*-*-*" } } } */ +/* { dg-add-options arm_neon } */ + +#include +#include "arm-neon-ref.h" +#include "compute_ref_data.h" + +VECT_VAR_DECL(expected,int,8,8) [] = { 0xf0, 0xf1, 0xf2, 0xf3, + 0xf4, 0xf5, 0xf6, 0xf7 }; +VECT_VAR_DECL(expected,int,16,4) [] = { 0xfff0, 0xfff1, 0xfff2, 0xfff3 }; +VECT_VAR_DECL(expected,int,32,2) [] = { 0xfffffff0, 0xfffffff1 }; +VECT_VAR_DECL(expected,int,64,1) [] = { 0xfffffffffffffff0 }; +VECT_VAR_DECL(expected,uint,8,8) [] = { 0xf0, 0xf1, 0xf2, 0xf3, + 0xf4, 0xf5, 0xf6, 0xf7 }; +VECT_VAR_DECL(expected,uint,16,4) [] = { 0xfff0, 0xfff1, 0xfff2, 0xfff3 }; +VECT_VAR_DECL(expected,uint,32,2) [] = { 0xfffffff0, 0xfffffff1 }; +VECT_VAR_DECL(expected,uint,64,1) [] = { 0xfffffffffffffff0 }; +VECT_VAR_DECL(expected,poly,8,8) [] = { 0xf0, 0xf1, 0xf2, 0xf3, + 0xf4, 0xf5, 0xf6, 0xf7 }; +VECT_VAR_DECL(expected,poly,16,4) [] = { 0xfff0, 0xfff1, 0xfff2, 0xfff3 }; +VECT_VAR_DECL(expected,float,32,2) [] = { -16, -15 }; +VECT_VAR_DECL(expected,int,8,16) [] = { 0xf0, 0xf1, 0xf2, 0xf3, + 0xf4, 0xf5, 0xf6, 0xf7, + 0xf8, 0xf9, 0xfa, 0xfb, + 0xfc, 0xfd, 0xfe, 0xff }; +VECT_VAR_DECL(expected,int,16,8) [] = { 0xfff0, 0xfff1, 0xfff2, 0xfff3, + 0xfff4, 0xfff5, 0xfff6, 0xfff7 }; +VECT_VAR_DECL(expected,int,32,4) [] = { 0xfffffff0, 0xfffffff1, + 0xfffffff2, 0xfffffff3 }; +VECT_VAR_DECL(expected,int,64,2) [] = { 0xfffffffffffffff0, + 0xfffffffffffffff1 }; +VECT_VAR_DECL(expected,uint,8,16) [] = { 0xf0, 0xf1, 0xf2, 0xf3, + 0xf4, 0xf5, 0xf6, 0xf7, + 0xf8, 0xf9, 0xfa, 0xfb, + 0xfc, 0xfd, 0xfe, 0xff }; +VECT_VAR_DECL(expected,uint,16,8) [] = { 0xfff0, 0xfff1, 0xfff2, + 0xfff3, 0xfff4, 0xfff5, + 0xfff6, 0xfff7 }; +VECT_VAR_DECL(expected,uint,32,4) [] = { 0xfffffff0, 0xfffffff1, + 0xfffffff2, 0xfffffff3 }; +VECT_VAR_DECL(expected,uint,64,2) [] = { 0xfffffffffffffff0, + 0xfffffffffffffff1 }; +VECT_VAR_DECL(expected,poly,8,16) [] = { 0xf0, 0xf1, 0xf2, 0xf3, + 0xf4, 0xf5, 0xf6, 0xf7, + 0xf8, 0xf9, 0xfa, 0xfb, + 0xfc, 0xfd, 0xfe, 0xff }; +VECT_VAR_DECL(expected,poly,16,8) [] = { 0xfff0, 0xfff1, 0xfff2, 0xfff3, + 0xfff4, 0xfff5, 0xfff6, 0xfff7 }; +VECT_VAR_DECL(expected,float,32,4) [] = { -16, -15, -14, -13 }; + +#define TEST_MSG "VLD1/VLD1Q" +void exec_vld1 (void) +{ + /* Basic test vec=vld1(buffer); then store vec: vst1(result, vector). */ + /* This test actually tests vdl1 and vst1 at the same time. */ +#define TEST_VLD1(VAR, BUF, Q, T1, T2, W, N) \ + VECT_VAR(VAR, T1, W, N) = vld1##Q##_##T2##W(VECT_VAR(BUF, T1, W, N)); \ + vst1##Q##_##T2##W(VECT_VAR(result, T1, W, N), VECT_VAR(VAR, T1, W, N)) + + DECL_VARIABLE_ALL_VARIANTS(vector); + + clean_results (); + + TEST_MACRO_ALL_VARIANTS_2_5(TEST_VLD1, vector, buffer); + + TEST_VLD1(vector, buffer, , float, f, 32, 2); + TEST_VLD1(vector, buffer, q, float, f, 32, 4); + + check_results (TEST_MSG, ""); +} + +int main (void) +{ + exec_vld1 (); + return 0; +}