Commit e0e906bc by Alan Lawrence Committed by Alan Lawrence

Add execution + assembler tests of AArch64 EXT intrinsics.

	gcc.target/aarch64/simd/ext_f32.x: New file.
	gcc.target/aarch64/simd/ext_f32_1.c: New file.
	gcc.target/aarch64/simd/ext_p16.x: New file.
	gcc.target/aarch64/simd/ext_p16_1.c: New file.
	gcc.target/aarch64/simd/ext_p8.x: New file.
	gcc.target/aarch64/simd/ext_p8_1.c: New file.
	gcc.target/aarch64/simd/ext_s16.x: New file.
	gcc.target/aarch64/simd/ext_s16_1.c: New file.
	gcc.target/aarch64/simd/ext_s32.x: New file.
	gcc.target/aarch64/simd/ext_s32_1.c: New file.
	gcc.target/aarch64/simd/ext_s64.x: New file.
	gcc.target/aarch64/simd/ext_s64_1.c: New file.
	gcc.target/aarch64/simd/ext_s8.x: New file.
	gcc.target/aarch64/simd/ext_s8_1.c: New file.
	gcc.target/aarch64/simd/ext_u16.x: New file.
	gcc.target/aarch64/simd/ext_u16_1.c: New file.
	gcc.target/aarch64/simd/ext_u32.x: New file.
	gcc.target/aarch64/simd/ext_u32_1.c: New file.
	gcc.target/aarch64/simd/ext_u64.x: New file.
	gcc.target/aarch64/simd/ext_u64_1.c: New file.
	gcc.target/aarch64/simd/ext_u8.x: New file.
	gcc.target/aarch64/simd/ext_u8_1.c: New file.
	gcc.target/aarch64/simd/ext_f64.c: New file.
	gcc.target/aarch64/simd/extq_f32.x: New file.
	gcc.target/aarch64/simd/extq_f32_1.c: New file.
	gcc.target/aarch64/simd/extq_p16.x: New file.
	gcc.target/aarch64/simd/extq_p16_1.c: New file.
	gcc.target/aarch64/simd/extq_p8.x: New file.
	gcc.target/aarch64/simd/extq_p8_1.c: New file.
	gcc.target/aarch64/simd/extq_s16.x: New file.
	gcc.target/aarch64/simd/extq_s16_1.c: New file.
	gcc.target/aarch64/simd/extq_s32.x: New file.
	gcc.target/aarch64/simd/extq_s32_1.c: New file.
	gcc.target/aarch64/simd/extq_s64.x: New file.
	gcc.target/aarch64/simd/extq_s64_1.c: New file.
	gcc.target/aarch64/simd/extq_s8.x: New file.
	gcc.target/aarch64/simd/extq_s8_1.c: New file.
	gcc.target/aarch64/simd/extq_u16.x: New file.
	gcc.target/aarch64/simd/extq_u16_1.c: New file.
	gcc.target/aarch64/simd/extq_u32.x: New file.
	gcc.target/aarch64/simd/extq_u32_1.c: New file.
	gcc.target/aarch64/simd/extq_u64.x: New file.
	gcc.target/aarch64/simd/extq_u64_1.c: New file.
	gcc.target/aarch64/simd/extq_u8.x: New file.
	gcc.target/aarch64/simd/extq_u8_1.c: New file.
	gcc.target/aarch64/simd/extq_f64.c: New file.

From-SVN: r210152
parent 1d175503
2014-05-07 Alan Lawrence <alan.lawrence@arm.com>
gcc.target/aarch64/simd/ext_f32.x: New file.
gcc.target/aarch64/simd/ext_f32_1.c: New file.
gcc.target/aarch64/simd/ext_p16.x: New file.
gcc.target/aarch64/simd/ext_p16_1.c: New file.
gcc.target/aarch64/simd/ext_p8.x: New file.
gcc.target/aarch64/simd/ext_p8_1.c: New file.
gcc.target/aarch64/simd/ext_s16.x: New file.
gcc.target/aarch64/simd/ext_s16_1.c: New file.
gcc.target/aarch64/simd/ext_s32.x: New file.
gcc.target/aarch64/simd/ext_s32_1.c: New file.
gcc.target/aarch64/simd/ext_s64.x: New file.
gcc.target/aarch64/simd/ext_s64_1.c: New file.
gcc.target/aarch64/simd/ext_s8.x: New file.
gcc.target/aarch64/simd/ext_s8_1.c: New file.
gcc.target/aarch64/simd/ext_u16.x: New file.
gcc.target/aarch64/simd/ext_u16_1.c: New file.
gcc.target/aarch64/simd/ext_u32.x: New file.
gcc.target/aarch64/simd/ext_u32_1.c: New file.
gcc.target/aarch64/simd/ext_u64.x: New file.
gcc.target/aarch64/simd/ext_u64_1.c: New file.
gcc.target/aarch64/simd/ext_u8.x: New file.
gcc.target/aarch64/simd/ext_u8_1.c: New file.
gcc.target/aarch64/simd/ext_f64.c: New file.
gcc.target/aarch64/simd/extq_f32.x: New file.
gcc.target/aarch64/simd/extq_f32_1.c: New file.
gcc.target/aarch64/simd/extq_p16.x: New file.
gcc.target/aarch64/simd/extq_p16_1.c: New file.
gcc.target/aarch64/simd/extq_p8.x: New file.
gcc.target/aarch64/simd/extq_p8_1.c: New file.
gcc.target/aarch64/simd/extq_s16.x: New file.
gcc.target/aarch64/simd/extq_s16_1.c: New file.
gcc.target/aarch64/simd/extq_s32.x: New file.
gcc.target/aarch64/simd/extq_s32_1.c: New file.
gcc.target/aarch64/simd/extq_s64.x: New file.
gcc.target/aarch64/simd/extq_s64_1.c: New file.
gcc.target/aarch64/simd/extq_s8.x: New file.
gcc.target/aarch64/simd/extq_s8_1.c: New file.
gcc.target/aarch64/simd/extq_u16.x: New file.
gcc.target/aarch64/simd/extq_u16_1.c: New file.
gcc.target/aarch64/simd/extq_u32.x: New file.
gcc.target/aarch64/simd/extq_u32_1.c: New file.
gcc.target/aarch64/simd/extq_u64.x: New file.
gcc.target/aarch64/simd/extq_u64_1.c: New file.
gcc.target/aarch64/simd/extq_u8.x: New file.
gcc.target/aarch64/simd/extq_u8_1.c: New file.
gcc.target/aarch64/simd/extq_f64.c: New file.
2014-05-07 Alan Lawrence <alan.lawrence@arm.com>
* gcc.target/aarch64/vtrns32.c: Expect zip[12] insn rather than trn[12].
* gcc.target/aarch64/vtrnu32.c: Likewise.
* gcc.target/aarch64/vtrnf32.c: Likewise.
......
extern void abort (void);
float32x2_t
test_vext_f32_1 (float32x2_t a, float32x2_t b)
{
return vext_f32 (a, b, 1);
}
int
main (int argc, char **argv)
{
int i, off;
float32_t arr1[] = {0, 1};
float32x2_t in1 = vld1_f32 (arr1);
float32_t arr2[] = {2, 3};
float32x2_t in2 = vld1_f32 (arr2);
float32_t exp[2];
float32x2_t expected;
float32x2_t actual = test_vext_f32_1 (in1, in2);
for (i = 0; i < 2; i++)
exp[i] = i + 1;
expected = vld1_f32 (exp);
for (i = 0; i < 2; i++)
if (actual[i] != expected[i])
abort ();
return 0;
}
/* Test the `vextf32' AArch64 SIMD intrinsic. */
/* { dg-do run } */
/* { dg-options "-save-temps -O3 -fno-inline" } */
#include "arm_neon.h"
#include "ext_f32.x"
/* { dg-final { scan-assembler-times "ext\[ \t\]+\[vV\]\[0-9\]+\.8\[bB\], ?\[vV\]\[0-9\]+\.8\[bB\], ?\[vV\]\[0-9\]+\.8\[bB\], ?#\[0-9\]+\(?:.4)?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
/* { dg-final { cleanup-saved-temps } } */
/* Test the `vextf64' AArch64 SIMD intrinsic. */
/* { dg-do run } */
/* { dg-options "-save-temps -O3 -fno-inline" } */
#include "arm_neon.h"
extern void abort (void);
int
main (int argc, char **argv)
{
int i, off;
float64x1_t in1 = {0};
float64x1_t in2 = {1};
float64x1_t actual = vext_f64 (in1, in2, 0);
if (actual != in1)
abort ();
return 0;
}
/* Do not scan-assembler. An EXT instruction could be emitted, but would merely
return its first argument, so it is legitimate to optimize it out. */
/* { dg-final { cleanup-saved-temps } } */
extern void abort (void);
poly16x4_t
test_vext_p16_1 (poly16x4_t a, poly16x4_t b)
{
return vext_p16 (a, b, 1);
}
poly16x4_t
test_vext_p16_2 (poly16x4_t a, poly16x4_t b)
{
return vext_p16 (a, b, 2);
}
poly16x4_t
test_vext_p16_3 (poly16x4_t a, poly16x4_t b)
{
return vext_p16 (a, b, 3);
}
int
main (int argc, char **argv)
{
int i, off;
poly16_t arr1[] = {0, 1, 2, 3};
poly16x4_t in1 = vld1_p16 (arr1);
poly16_t arr2[] = {4, 5, 6, 7};
poly16x4_t in2 = vld1_p16 (arr2);
poly16_t exp[4];
poly16x4_t expected;
poly16x4_t actual = test_vext_p16_1 (in1, in2);
for (i = 0; i < 4; i++)
exp[i] = i + 1;
expected = vld1_p16 (exp);
for (i = 0; i < 4; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vext_p16_2 (in1, in2);
for (i = 0; i < 4; i++)
exp[i] = i + 2;
expected = vld1_p16 (exp);
for (i = 0; i < 4; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vext_p16_3 (in1, in2);
for (i = 0; i < 4; i++)
exp[i] = i + 3;
expected = vld1_p16 (exp);
for (i = 0; i < 4; i++)
if (actual[i] != expected[i])
abort ();
return 0;
}
/* Test the `vextp16' AArch64 SIMD intrinsic. */
/* { dg-do run } */
/* { dg-options "-save-temps -O3 -fno-inline" } */
#include "arm_neon.h"
#include "ext_p16.x"
/* { dg-final { scan-assembler-times "ext\[ \t\]+\[vV\]\[0-9\]+\.8\[bB\], ?\[vV\]\[0-9\]+\.8\[bB\], ?\[vV\]\[0-9\]+\.8\[bB\], ?#\[0-9\]+\(?:.2\)?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 3 } } */
/* { dg-final { cleanup-saved-temps } } */
extern void abort (void);
poly8x8_t
test_vext_p8_1 (poly8x8_t a, poly8x8_t b)
{
return vext_p8 (a, b, 1);
}
poly8x8_t
test_vext_p8_2 (poly8x8_t a, poly8x8_t b)
{
return vext_p8 (a, b, 2);
}
poly8x8_t
test_vext_p8_3 (poly8x8_t a, poly8x8_t b)
{
return vext_p8 (a, b, 3);
}
poly8x8_t
test_vext_p8_4 (poly8x8_t a, poly8x8_t b)
{
return vext_p8 (a, b, 4);
}
poly8x8_t
test_vext_p8_5 (poly8x8_t a, poly8x8_t b)
{
return vext_p8 (a, b, 5);
}
poly8x8_t
test_vext_p8_6 (poly8x8_t a, poly8x8_t b)
{
return vext_p8 (a, b, 6);
}
poly8x8_t
test_vext_p8_7 (poly8x8_t a, poly8x8_t b)
{
return vext_p8 (a, b, 7);
}
int
main (int argc, char **argv)
{
int i, off;
poly8_t arr1[] = {0, 1, 2, 3, 4, 5, 6, 7};
poly8x8_t in1 = vld1_p8 (arr1);
poly8_t arr2[] = {8, 9, 10, 11, 12, 13, 14, 15};
poly8x8_t in2 = vld1_p8 (arr2);
poly8_t exp[8];
poly8x8_t expected;
poly8x8_t actual = test_vext_p8_1 (in1, in2);
for (i = 0; i < 8; i++)
exp[i] = i + 1;
expected = vld1_p8 (exp);
for (i = 0; i < 8; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vext_p8_2 (in1, in2);
for (i = 0; i < 8; i++)
exp[i] = i + 2;
expected = vld1_p8 (exp);
for (i = 0; i < 8; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vext_p8_3 (in1, in2);
for (i = 0; i < 8; i++)
exp[i] = i + 3;
expected = vld1_p8 (exp);
for (i = 0; i < 8; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vext_p8_4 (in1, in2);
for (i = 0; i < 8; i++)
exp[i] = i + 4;
expected = vld1_p8 (exp);
for (i = 0; i < 8; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vext_p8_5 (in1, in2);
for (i = 0; i < 8; i++)
exp[i] = i + 5;
expected = vld1_p8 (exp);
for (i = 0; i < 8; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vext_p8_6 (in1, in2);
for (i = 0; i < 8; i++)
exp[i] = i + 6;
expected = vld1_p8 (exp);
for (i = 0; i < 8; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vext_p8_7 (in1, in2);
for (i = 0; i < 8; i++)
exp[i] = i + 7;
expected = vld1_p8 (exp);
for (i = 0; i < 8; i++)
if (actual[i] != expected[i])
abort ();
return 0;
}
/* Test the `vextp8' AArch64 SIMD intrinsic. */
/* { dg-do run } */
/* { dg-options "-save-temps -O3 -fno-inline" } */
#include "arm_neon.h"
#include "ext_p8.x"
/* { dg-final { scan-assembler-times "ext\[ \t\]+\[vV\]\[0-9\]+\.8\[bB\], ?\[vV\]\[0-9\]+\.8\[bB\], ?\[vV\]\[0-9\]+\.8\[bB\], ?#?\[0-9\]+\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 7 } } */
/* { dg-final { cleanup-saved-temps } } */
extern void abort (void);
int16x4_t
test_vext_s16_1 (int16x4_t a, int16x4_t b)
{
return vext_s16 (a, b, 1);
}
int16x4_t
test_vext_s16_2 (int16x4_t a, int16x4_t b)
{
return vext_s16 (a, b, 2);
}
int16x4_t
test_vext_s16_3 (int16x4_t a, int16x4_t b)
{
return vext_s16 (a, b, 3);
}
int
main (int argc, char **argv)
{
int i, off;
int16_t arr1[] = {0, 1, 2, 3};
int16x4_t in1 = vld1_s16 (arr1);
int16_t arr2[] = {4, 5, 6, 7};
int16x4_t in2 = vld1_s16 (arr2);
int16_t exp[4];
int16x4_t expected;
int16x4_t actual = test_vext_s16_1 (in1, in2);
for (i = 0; i < 4; i++)
exp[i] = i + 1;
expected = vld1_s16 (exp);
for (i = 0; i < 4; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vext_s16_2 (in1, in2);
for (i = 0; i < 4; i++)
exp[i] = i + 2;
expected = vld1_s16 (exp);
for (i = 0; i < 4; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vext_s16_3 (in1, in2);
for (i = 0; i < 4; i++)
exp[i] = i + 3;
expected = vld1_s16 (exp);
for (i = 0; i < 4; i++)
if (actual[i] != expected[i])
abort ();
return 0;
}
/* Test the `vexts16' AArch64 SIMD intrinsic. */
/* { dg-do run } */
/* { dg-options "-save-temps -O3 -fno-inline" } */
#include "arm_neon.h"
#include "ext_s16.x"
/* { dg-final { scan-assembler-times "ext\[ \t\]+\[vV\]\[0-9\]+\.8\[bB\], ?\[vV\]\[0-9\]+\.8\[bB\], ?\[vV\]\[0-9\]+\.8\[bB\], ?#\[0-9\]+\(?:.2\)?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 3 } } */
/* { dg-final { cleanup-saved-temps } } */
extern void abort (void);
int32x2_t
test_vext_s32_1 (int32x2_t a, int32x2_t b)
{
return vext_s32 (a, b, 1);
}
int
main (int argc, char **argv)
{
int i, off;
int32_t arr1[] = {0, 1};
int32x2_t in1 = vld1_s32 (arr1);
int32_t arr2[] = {2, 3};
int32x2_t in2 = vld1_s32 (arr2);
int32_t exp[2];
int32x2_t expected;
int32x2_t actual = test_vext_s32_1 (in1, in2);
for (i = 0; i < 2; i++)
exp[i] = i + 1;
expected = vld1_s32 (exp);
for (i = 0; i < 2; i++)
if (actual[i] != expected[i])
abort ();
return 0;
}
/* Test the `vexts32' AArch64 SIMD intrinsic. */
/* { dg-do run } */
/* { dg-options "-save-temps -O3 -fno-inline" } */
#include "arm_neon.h"
#include "ext_s32.x"
/* { dg-final { scan-assembler-times "ext\[ \t\]+\[vV\]\[0-9\]+\.8\[bB\], ?\[vV\]\[0-9\]+\.8\[bB\], ?\[vV\]\[0-9\]+\.8\[bB\], ?#\[0-9\]+\(?:.4)?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
/* { dg-final { cleanup-saved-temps } } */
extern void abort (void);
int
main (int argc, char **argv)
{
int i, off;
int64_t arr1[] = {0};
int64x1_t in1 = vld1_s64 (arr1);
int64_t arr2[] = {1};
int64x1_t in2 = vld1_s64 (arr2);
int64x1_t actual = vext_s64 (in1, in2, 0);
if (actual != in1)
abort ();
return 0;
}
/* Test the `vexts64' AArch64 SIMD intrinsic. */
/* { dg-do run } */
/* { dg-options "-save-temps -O3 -fno-inline" } */
#include "arm_neon.h"
#include "ext_s64.x"
/* Do not scan-assembler. An EXT instruction could be emitted, but would merely
return its first argument, so it is legitimate to optimize it out. */
/* { dg-final { cleanup-saved-temps } } */
extern void abort (void);
int8x8_t
test_vext_s8_1 (int8x8_t a, int8x8_t b)
{
return vext_s8 (a, b, 1);
}
int8x8_t
test_vext_s8_2 (int8x8_t a, int8x8_t b)
{
return vext_s8 (a, b, 2);
}
int8x8_t
test_vext_s8_3 (int8x8_t a, int8x8_t b)
{
return vext_s8 (a, b, 3);
}
int8x8_t
test_vext_s8_4 (int8x8_t a, int8x8_t b)
{
return vext_s8 (a, b, 4);
}
int8x8_t
test_vext_s8_5 (int8x8_t a, int8x8_t b)
{
return vext_s8 (a, b, 5);
}
int8x8_t
test_vext_s8_6 (int8x8_t a, int8x8_t b)
{
return vext_s8 (a, b, 6);
}
int8x8_t
test_vext_s8_7 (int8x8_t a, int8x8_t b)
{
return vext_s8 (a, b, 7);
}
int
main (int argc, char **argv)
{
int i, off;
int8_t arr1[] = {0, 1, 2, 3, 4, 5, 6, 7};
int8x8_t in1 = vld1_s8 (arr1);
int8_t arr2[] = {8, 9, 10, 11, 12, 13, 14, 15};
int8x8_t in2 = vld1_s8 (arr2);
int8_t exp[8];
int8x8_t expected;
int8x8_t actual = test_vext_s8_1 (in1, in2);
for (i = 0; i < 8; i++)
exp[i] = i + 1;
expected = vld1_s8 (exp);
for (i = 0; i < 8; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vext_s8_2 (in1, in2);
for (i = 0; i < 8; i++)
exp[i] = i + 2;
expected = vld1_s8 (exp);
for (i = 0; i < 8; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vext_s8_3 (in1, in2);
for (i = 0; i < 8; i++)
exp[i] = i + 3;
expected = vld1_s8 (exp);
for (i = 0; i < 8; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vext_s8_4 (in1, in2);
for (i = 0; i < 8; i++)
exp[i] = i + 4;
expected = vld1_s8 (exp);
for (i = 0; i < 8; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vext_s8_5 (in1, in2);
for (i = 0; i < 8; i++)
exp[i] = i + 5;
expected = vld1_s8 (exp);
for (i = 0; i < 8; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vext_s8_6 (in1, in2);
for (i = 0; i < 8; i++)
exp[i] = i + 6;
expected = vld1_s8 (exp);
for (i = 0; i < 8; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vext_s8_7 (in1, in2);
for (i = 0; i < 8; i++)
exp[i] = i + 7;
expected = vld1_s8 (exp);
for (i = 0; i < 8; i++)
if (actual[i] != expected[i])
abort ();
return 0;
}
/* Test the `vexts8' AArch64 SIMD intrinsic. */
/* { dg-do run } */
/* { dg-options "-save-temps -O3 -fno-inline" } */
#include "arm_neon.h"
#include "ext_s8.x"
/* { dg-final { scan-assembler-times "ext\[ \t\]+\[vV\]\[0-9\]+\.8\[bB\], ?\[vV\]\[0-9\]+\.8\[bB\], ?\[vV\]\[0-9\]+\.8\[bB\], ?#?\[0-9\]+\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 7 } } */
/* { dg-final { cleanup-saved-temps } } */
extern void abort (void);
uint16x4_t
test_vext_u16_1 (uint16x4_t a, uint16x4_t b)
{
return vext_u16 (a, b, 1);
}
uint16x4_t
test_vext_u16_2 (uint16x4_t a, uint16x4_t b)
{
return vext_u16 (a, b, 2);
}
uint16x4_t
test_vext_u16_3 (uint16x4_t a, uint16x4_t b)
{
return vext_u16 (a, b, 3);
}
int
main (int argc, char **argv)
{
int i, off;
uint16_t arr1[] = {0, 1, 2, 3};
uint16x4_t in1 = vld1_u16 (arr1);
uint16_t arr2[] = {4, 5, 6, 7};
uint16x4_t in2 = vld1_u16 (arr2);
uint16_t exp[4];
uint16x4_t expected;
uint16x4_t actual = test_vext_u16_1 (in1, in2);
for (i = 0; i < 4; i++)
exp[i] = i + 1;
expected = vld1_u16 (exp);
for (i = 0; i < 4; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vext_u16_2 (in1, in2);
for (i = 0; i < 4; i++)
exp[i] = i + 2;
expected = vld1_u16 (exp);
for (i = 0; i < 4; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vext_u16_3 (in1, in2);
for (i = 0; i < 4; i++)
exp[i] = i + 3;
expected = vld1_u16 (exp);
for (i = 0; i < 4; i++)
if (actual[i] != expected[i])
abort ();
return 0;
}
/* Test the `vextu16' AArch64 SIMD intrinsic. */
/* { dg-do run } */
/* { dg-options "-save-temps -O3 -fno-inline" } */
#include "arm_neon.h"
#include "ext_u16.x"
/* { dg-final { scan-assembler-times "ext\[ \t\]+\[vV\]\[0-9\]+\.8\[bB\], ?\[vV\]\[0-9\]+\.8\[bB\], ?\[vV\]\[0-9\]+\.8\[bB\], ?#\[0-9\]+\(?:.2\)?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 3 } } */
/* { dg-final { cleanup-saved-temps } } */
extern void abort (void);
uint32x2_t
test_vext_u32_1 (uint32x2_t a, uint32x2_t b)
{
return vext_u32 (a, b, 1);
}
int
main (int argc, char **argv)
{
int i, off;
uint32_t arr1[] = {0, 1};
uint32x2_t in1 = vld1_u32 (arr1);
uint32_t arr2[] = {2, 3};
uint32x2_t in2 = vld1_u32 (arr2);
uint32_t exp[2];
uint32x2_t expected;
uint32x2_t actual = test_vext_u32_1 (in1, in2);
for (i = 0; i < 2; i++)
exp[i] = i + 1;
expected = vld1_u32 (exp);
for (i = 0; i < 2; i++)
if (actual[i] != expected[i])
abort ();
return 0;
}
/* Test the `vextu32' AArch64 SIMD intrinsic. */
/* { dg-do run } */
/* { dg-options "-save-temps -O3 -fno-inline" } */
#include "arm_neon.h"
#include "ext_u32.x"
/* { dg-final { scan-assembler-times "ext\[ \t\]+\[vV\]\[0-9\]+\.8\[bB\], ?\[vV\]\[0-9\]+\.8\[bB\], ?\[vV\]\[0-9\]+\.8\[bB\], ?#\[0-9\]+\(?:.4)?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
/* { dg-final { cleanup-saved-temps } } */
extern void abort (void);
int
main (int argc, char **argv)
{
int i, off;
uint64_t arr1[] = {0};
uint64x1_t in1 = vld1_u64 (arr1);
uint64_t arr2[] = {1};
uint64x1_t in2 = vld1_u64 (arr2);
uint64x1_t actual = vext_u64 (in1, in2, 0);
if (actual != in1)
abort ();
return 0;
}
/* Test the `vextu64' AArch64 SIMD intrinsic. */
/* { dg-do run } */
/* { dg-options "-save-temps -O3 -fno-inline" } */
#include "arm_neon.h"
#include "ext_u64.x"
/* Do not scan-assembler. An EXT instruction could be emitted, but would merely
return its first argument, so it is legitimate to optimize it out. */
/* { dg-final { cleanup-saved-temps } } */
extern void abort (void);
uint8x8_t
test_vext_u8_1 (uint8x8_t a, uint8x8_t b)
{
return vext_u8 (a, b, 1);
}
uint8x8_t
test_vext_u8_2 (uint8x8_t a, uint8x8_t b)
{
return vext_u8 (a, b, 2);
}
uint8x8_t
test_vext_u8_3 (uint8x8_t a, uint8x8_t b)
{
return vext_u8 (a, b, 3);
}
uint8x8_t
test_vext_u8_4 (uint8x8_t a, uint8x8_t b)
{
return vext_u8 (a, b, 4);
}
uint8x8_t
test_vext_u8_5 (uint8x8_t a, uint8x8_t b)
{
return vext_u8 (a, b, 5);
}
uint8x8_t
test_vext_u8_6 (uint8x8_t a, uint8x8_t b)
{
return vext_u8 (a, b, 6);
}
uint8x8_t
test_vext_u8_7 (uint8x8_t a, uint8x8_t b)
{
return vext_u8 (a, b, 7);
}
int
main (int argc, char **argv)
{
int i, off;
uint8_t arr1[] = {0, 1, 2, 3, 4, 5, 6, 7};
uint8x8_t in1 = vld1_u8 (arr1);
uint8_t arr2[] = {8, 9, 10, 11, 12, 13, 14, 15};
uint8x8_t in2 = vld1_u8 (arr2);
uint8_t exp[8];
uint8x8_t expected;
uint8x8_t actual = test_vext_u8_1 (in1, in2);
for (i = 0; i < 8; i++)
exp[i] = i + 1;
expected = vld1_u8 (exp);
for (i = 0; i < 8; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vext_u8_2 (in1, in2);
for (i = 0; i < 8; i++)
exp[i] = i + 2;
expected = vld1_u8 (exp);
for (i = 0; i < 8; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vext_u8_3 (in1, in2);
for (i = 0; i < 8; i++)
exp[i] = i + 3;
expected = vld1_u8 (exp);
for (i = 0; i < 8; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vext_u8_4 (in1, in2);
for (i = 0; i < 8; i++)
exp[i] = i + 4;
expected = vld1_u8 (exp);
for (i = 0; i < 8; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vext_u8_5 (in1, in2);
for (i = 0; i < 8; i++)
exp[i] = i + 5;
expected = vld1_u8 (exp);
for (i = 0; i < 8; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vext_u8_6 (in1, in2);
for (i = 0; i < 8; i++)
exp[i] = i + 6;
expected = vld1_u8 (exp);
for (i = 0; i < 8; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vext_u8_7 (in1, in2);
for (i = 0; i < 8; i++)
exp[i] = i + 7;
expected = vld1_u8 (exp);
for (i = 0; i < 8; i++)
if (actual[i] != expected[i])
abort ();
return 0;
}
/* Test the `vextu8' AArch64 SIMD intrinsic. */
/* { dg-do run } */
/* { dg-options "-save-temps -O3 -fno-inline" } */
#include "arm_neon.h"
#include "ext_u8.x"
/* { dg-final { scan-assembler-times "ext\[ \t\]+\[vV\]\[0-9\]+\.8\[bB\], ?\[vV\]\[0-9\]+\.8\[bB\], ?\[vV\]\[0-9\]+\.8\[bB\], ?#?\[0-9\]+\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 7 } } */
/* { dg-final { cleanup-saved-temps } } */
extern void abort (void);
float32x4_t
test_vextq_f32_1 (float32x4_t a, float32x4_t b)
{
return vextq_f32 (a, b, 1);
}
float32x4_t
test_vextq_f32_2 (float32x4_t a, float32x4_t b)
{
return vextq_f32 (a, b, 2);
}
float32x4_t
test_vextq_f32_3 (float32x4_t a, float32x4_t b)
{
return vextq_f32 (a, b, 3);
}
int
main (int argc, char **argv)
{
int i, off;
float32_t arr1[] = {0, 1, 2, 3};
float32x4_t in1 = vld1q_f32 (arr1);
float32_t arr2[] = {4, 5, 6, 7};
float32x4_t in2 = vld1q_f32 (arr2);
float32_t exp[4];
float32x4_t expected;
float32x4_t actual = test_vextq_f32_1 (in1, in2);
for (i = 0; i < 4; i++)
exp[i] = i + 1;
expected = vld1q_f32 (exp);
for (i = 0; i < 4; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_f32_2 (in1, in2);
for (i = 0; i < 4; i++)
exp[i] = i + 2;
expected = vld1q_f32 (exp);
for (i = 0; i < 4; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_f32_3 (in1, in2);
for (i = 0; i < 4; i++)
exp[i] = i + 3;
expected = vld1q_f32 (exp);
for (i = 0; i < 4; i++)
if (actual[i] != expected[i])
abort ();
return 0;
}
/* Test the `vextQf32' AArch64 SIMD intrinsic. */
/* { dg-do run } */
/* { dg-options "-save-temps -O3 -fno-inline" } */
#include "arm_neon.h"
#include "extq_f32.x"
/* { dg-final { scan-assembler-times "ext\[ \t\]+\[vV\]\[0-9\]+\.16\[bB\], ?\[vV\]\[0-9\]+\.16\[bB\], ?\[vV\]\[0-9\]+\.16\[bB\], ?#\[0-9\]+\(?:.4)?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 3 } } */
/* { dg-final { cleanup-saved-temps } } */
/* Test the `vextq_f64' AArch64 SIMD intrinsic. */
/* { dg-do run } */
/* { dg-options "-save-temps -O3 -fno-inline" } */
#include "arm_neon.h"
extern void abort (void);
#include <stdio.h>
float64x2_t
test_vextq_f64_1 (float64x2_t a, float64x2_t b)
{
return vextq_f64 (a, b, 1);
}
int
main (int argc, char **argv)
{
int i, off;
float64_t arr1[] = {0, 1};
float64x2_t in1 = vld1q_f64 (arr1);
float64_t arr2[] = {2, 3};
float64x2_t in2 = vld1q_f64 (arr2);
float64_t exp[] = {1, 2};
float64x2_t expected = vld1q_f64 (exp);
float64x2_t actual = test_vextq_f64_1 (in1, in2);
for (i = 0; i < 2; i++)
if (actual[i] != expected[i])
abort ();
return 0;
}
/* { dg-final { scan-assembler-times "ext\[ \t\]+\[vV\]\[0-9\]+\.16\[bB\], ?\[vV\]\[0-9\]+\.16\[bB\], ?\[vV\]\[0-9\]+\.16\[bB\], ?#\[0-9\]+\(?:.8\)?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
/* { dg-final { cleanup-saved-temps } } */
extern void abort (void);
poly16x8_t
test_vextq_p16_1 (poly16x8_t a, poly16x8_t b)
{
return vextq_p16 (a, b, 1);
}
poly16x8_t
test_vextq_p16_2 (poly16x8_t a, poly16x8_t b)
{
return vextq_p16 (a, b, 2);
}
poly16x8_t
test_vextq_p16_3 (poly16x8_t a, poly16x8_t b)
{
return vextq_p16 (a, b, 3);
}
poly16x8_t
test_vextq_p16_4 (poly16x8_t a, poly16x8_t b)
{
return vextq_p16 (a, b, 4);
}
poly16x8_t
test_vextq_p16_5 (poly16x8_t a, poly16x8_t b)
{
return vextq_p16 (a, b, 5);
}
poly16x8_t
test_vextq_p16_6 (poly16x8_t a, poly16x8_t b)
{
return vextq_p16 (a, b, 6);
}
poly16x8_t
test_vextq_p16_7 (poly16x8_t a, poly16x8_t b)
{
return vextq_p16 (a, b, 7);
}
int
main (int argc, char **argv)
{
int i, off;
poly16_t arr1[] = {0, 1, 2, 3, 4, 5, 6, 7};
poly16x8_t in1 = vld1q_p16 (arr1);
poly16_t arr2[] = {8, 9, 10, 11, 12, 13, 14, 15};
poly16x8_t in2 = vld1q_p16 (arr2);
poly16_t exp[8];
poly16x8_t expected;
poly16x8_t actual = test_vextq_p16_1 (in1, in2);
for (i = 0; i < 8; i++)
exp[i] = i + 1;
expected = vld1q_p16 (exp);
for (i = 0; i < 8; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_p16_2 (in1, in2);
for (i = 0; i < 8; i++)
exp[i] = i + 2;
expected = vld1q_p16 (exp);
for (i = 0; i < 8; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_p16_3 (in1, in2);
for (i = 0; i < 8; i++)
exp[i] = i + 3;
expected = vld1q_p16 (exp);
for (i = 0; i < 8; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_p16_4 (in1, in2);
for (i = 0; i < 8; i++)
exp[i] = i + 4;
expected = vld1q_p16 (exp);
for (i = 0; i < 8; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_p16_5 (in1, in2);
for (i = 0; i < 8; i++)
exp[i] = i + 5;
expected = vld1q_p16 (exp);
for (i = 0; i < 8; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_p16_6 (in1, in2);
for (i = 0; i < 8; i++)
exp[i] = i + 6;
expected = vld1q_p16 (exp);
for (i = 0; i < 8; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_p16_7 (in1, in2);
for (i = 0; i < 8; i++)
exp[i] = i + 7;
expected = vld1q_p16 (exp);
for (i = 0; i < 8; i++)
if (actual[i] != expected[i])
abort ();
return 0;
}
/* Test the `vextQp16' AArch64 SIMD intrinsic. */
/* { dg-do run } */
/* { dg-options "-save-temps -O3 -fno-inline" } */
#include "arm_neon.h"
#include "extq_p16.x"
/* { dg-final { scan-assembler-times "ext\[ \t\]+\[vV\]\[0-9\]+\.16\[bB\], ?\[vV\]\[0-9\]+\.16\[bB\], ?\[vV\]\[0-9\]+\.16\[bB\], ?#\[0-9\]+\(?:.2\)?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 7 } } */
/* { dg-final { cleanup-saved-temps } } */
extern void abort (void);
poly8x16_t
test_vextq_p8_1 (poly8x16_t a, poly8x16_t b)
{
return vextq_p8 (a, b, 1);
}
poly8x16_t
test_vextq_p8_2 (poly8x16_t a, poly8x16_t b)
{
return vextq_p8 (a, b, 2);
}
poly8x16_t
test_vextq_p8_3 (poly8x16_t a, poly8x16_t b)
{
return vextq_p8 (a, b, 3);
}
poly8x16_t
test_vextq_p8_4 (poly8x16_t a, poly8x16_t b)
{
return vextq_p8 (a, b, 4);
}
poly8x16_t
test_vextq_p8_5 (poly8x16_t a, poly8x16_t b)
{
return vextq_p8 (a, b, 5);
}
poly8x16_t
test_vextq_p8_6 (poly8x16_t a, poly8x16_t b)
{
return vextq_p8 (a, b, 6);
}
poly8x16_t
test_vextq_p8_7 (poly8x16_t a, poly8x16_t b)
{
return vextq_p8 (a, b, 7);
}
poly8x16_t
test_vextq_p8_8 (poly8x16_t a, poly8x16_t b)
{
return vextq_p8 (a, b, 8);
}
poly8x16_t
test_vextq_p8_9 (poly8x16_t a, poly8x16_t b)
{
return vextq_p8 (a, b, 9);
}
poly8x16_t
test_vextq_p8_10 (poly8x16_t a, poly8x16_t b)
{
return vextq_p8 (a, b, 10);
}
poly8x16_t
test_vextq_p8_11 (poly8x16_t a, poly8x16_t b)
{
return vextq_p8 (a, b, 11);
}
poly8x16_t
test_vextq_p8_12 (poly8x16_t a, poly8x16_t b)
{
return vextq_p8 (a, b, 12);
}
poly8x16_t
test_vextq_p8_13 (poly8x16_t a, poly8x16_t b)
{
return vextq_p8 (a, b, 13);
}
poly8x16_t
test_vextq_p8_14 (poly8x16_t a, poly8x16_t b)
{
return vextq_p8 (a, b, 14);
}
poly8x16_t
test_vextq_p8_15 (poly8x16_t a, poly8x16_t b)
{
return vextq_p8 (a, b, 15);
}
int
main (int argc, char **argv)
{
int i;
poly8_t arr1[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
poly8x16_t in1 = vld1q_p8 (arr1);
poly8_t arr2[] =
{16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31};
poly8x16_t in2 = vld1q_p8 (arr2);
poly8_t exp[16];
poly8x16_t expected;
poly8x16_t actual = test_vextq_p8_1 (in1, in2);
for (i = 0; i < 16; i++)
exp[i] = i + 1;
expected = vld1q_p8 (exp);
for (i = 0; i < 16; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_p8_2 (in1, in2);
for (i = 0; i < 16; i++)
exp[i] = i + 2;
expected = vld1q_p8 (exp);
for (i = 0; i < 16; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_p8_3 (in1, in2);
for (i = 0; i < 16; i++)
exp[i] = i + 3;
expected = vld1q_p8 (exp);
for (i = 0; i < 16; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_p8_4 (in1, in2);
for (i = 0; i < 16; i++)
exp[i] = i + 4;
expected = vld1q_p8 (exp);
for (i = 0; i < 16; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_p8_5 (in1, in2);
for (i = 0; i < 16; i++)
exp[i] = i + 5;
expected = vld1q_p8 (exp);
for (i = 0; i < 16; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_p8_6 (in1, in2);
for (i = 0; i < 16; i++)
exp[i] = i + 6;
expected = vld1q_p8 (exp);
for (i = 0; i < 16; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_p8_7 (in1, in2);
for (i = 0; i < 16; i++)
exp[i] = i + 7;
expected = vld1q_p8 (exp);
for (i = 0; i < 16; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_p8_8 (in1, in2);
for (i = 0; i < 16; i++)
exp[i] = i + 8;
expected = vld1q_p8 (exp);
for (i = 0; i < 16; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_p8_9 (in1, in2);
for (i = 0; i < 16; i++)
exp[i] = i + 9;
expected = vld1q_p8 (exp);
for (i = 0; i < 16; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_p8_10 (in1, in2);
for (i = 0; i < 16; i++)
exp[i] = i + 10;
expected = vld1q_p8 (exp);
for (i = 0; i < 16; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_p8_11 (in1, in2);
for (i = 0; i < 16; i++)
exp[i] = i + 11;
expected = vld1q_p8 (exp);
for (i = 0; i < 16; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_p8_12 (in1, in2);
for (i = 0; i < 16; i++)
exp[i] = i + 12;
expected = vld1q_p8 (exp);
for (i = 0; i < 16; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_p8_13 (in1, in2);
for (i = 0; i < 16; i++)
exp[i] = i + 13;
expected = vld1q_p8 (exp);
for (i = 0; i < 16; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_p8_14 (in1, in2);
for (i = 0; i < 16; i++)
exp[i] = i + 14;
expected = vld1q_p8 (exp);
for (i = 0; i < 16; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_p8_15 (in1, in2);
for (i = 0; i < 16; i++)
exp[i] = i + 15;
expected = vld1q_p8 (exp);
for (i = 0; i < 16; i++)
if (actual[i] != expected[i])
abort ();
return 0;
}
/* Test the `vextQp8' AArch64 SIMD intrinsic. */
/* { dg-do run } */
/* { dg-options "-save-temps -O3 -fno-inline" } */
#include "arm_neon.h"
#include "extq_p8.x"
/* { dg-final { scan-assembler-times "ext\[ \t\]+\[vV\]\[0-9\]+\.16\[bB\], ?\[vV\]\[0-9\]+\.16\[bB\], ?\[vV\]\[0-9\]+\.16\[bB\], ?#?\[0-9\]+\(?:.2\)?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 15 } } */
/* { dg-final { cleanup-saved-temps } } */
extern void abort (void);
int16x8_t
test_vextq_s16_1 (int16x8_t a, int16x8_t b)
{
return vextq_s16 (a, b, 1);
}
int16x8_t
test_vextq_s16_2 (int16x8_t a, int16x8_t b)
{
return vextq_s16 (a, b, 2);
}
int16x8_t
test_vextq_s16_3 (int16x8_t a, int16x8_t b)
{
return vextq_s16 (a, b, 3);
}
int16x8_t
test_vextq_s16_4 (int16x8_t a, int16x8_t b)
{
return vextq_s16 (a, b, 4);
}
int16x8_t
test_vextq_s16_5 (int16x8_t a, int16x8_t b)
{
return vextq_s16 (a, b, 5);
}
int16x8_t
test_vextq_s16_6 (int16x8_t a, int16x8_t b)
{
return vextq_s16 (a, b, 6);
}
int16x8_t
test_vextq_s16_7 (int16x8_t a, int16x8_t b)
{
return vextq_s16 (a, b, 7);
}
int
main (int argc, char **argv)
{
int i, off;
int16_t arr1[] = {0, 1, 2, 3, 4, 5, 6, 7};
int16x8_t in1 = vld1q_s16 (arr1);
int16_t arr2[] = {8, 9, 10, 11, 12, 13, 14, 15};
int16x8_t in2 = vld1q_s16 (arr2);
int16_t exp[8];
int16x8_t expected;
int16x8_t actual = test_vextq_s16_1 (in1, in2);
for (i = 0; i < 8; i++)
exp[i] = i + 1;
expected = vld1q_s16 (exp);
for (i = 0; i < 8; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_s16_2 (in1, in2);
for (i = 0; i < 8; i++)
exp[i] = i + 2;
expected = vld1q_s16 (exp);
for (i = 0; i < 8; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_s16_3 (in1, in2);
for (i = 0; i < 8; i++)
exp[i] = i + 3;
expected = vld1q_s16 (exp);
for (i = 0; i < 8; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_s16_4 (in1, in2);
for (i = 0; i < 8; i++)
exp[i] = i + 4;
expected = vld1q_s16 (exp);
for (i = 0; i < 8; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_s16_5 (in1, in2);
for (i = 0; i < 8; i++)
exp[i] = i + 5;
expected = vld1q_s16 (exp);
for (i = 0; i < 8; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_s16_6 (in1, in2);
for (i = 0; i < 8; i++)
exp[i] = i + 6;
expected = vld1q_s16 (exp);
for (i = 0; i < 8; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_s16_7 (in1, in2);
for (i = 0; i < 8; i++)
exp[i] = i + 7;
expected = vld1q_s16 (exp);
for (i = 0; i < 8; i++)
if (actual[i] != expected[i])
abort ();
return 0;
}
/* Test the `vextQs16' AArch64 SIMD intrinsic. */
/* { dg-do run } */
/* { dg-options "-save-temps -O3 -fno-inline" } */
#include "arm_neon.h"
#include "extq_s16.x"
/* { dg-final { scan-assembler-times "ext\[ \t\]+\[vV\]\[0-9\]+\.16\[bB\], ?\[vV\]\[0-9\]+\.16\[bB\], ?\[vV\]\[0-9\]+\.16\[bB\], ?#\[0-9\]+\(?:.2\)?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 7 } } */
/* { dg-final { cleanup-saved-temps } } */
extern void abort (void);
int32x4_t
test_vextq_s32_1 (int32x4_t a, int32x4_t b)
{
return vextq_s32 (a, b, 1);
}
int32x4_t
test_vextq_s32_2 (int32x4_t a, int32x4_t b)
{
return vextq_s32 (a, b, 2);
}
int32x4_t
test_vextq_s32_3 (int32x4_t a, int32x4_t b)
{
return vextq_s32 (a, b, 3);
}
int
main (int argc, char **argv)
{
int i, off;
int32_t arr1[] = {0, 1, 2, 3};
int32x4_t in1 = vld1q_s32 (arr1);
int32_t arr2[] = {4, 5, 6, 7};
int32x4_t in2 = vld1q_s32 (arr2);
int32_t exp[4];
int32x4_t expected;
int32x4_t actual = test_vextq_s32_1 (in1, in2);
for (i = 0; i < 4; i++)
exp[i] = i + 1;
expected = vld1q_s32 (exp);
for (i = 0; i < 4; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_s32_2 (in1, in2);
for (i = 0; i < 4; i++)
exp[i] = i + 2;
expected = vld1q_s32 (exp);
for (i = 0; i < 4; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_s32_3 (in1, in2);
for (i = 0; i < 4; i++)
exp[i] = i + 3;
expected = vld1q_s32 (exp);
for (i = 0; i < 4; i++)
if (actual[i] != expected[i])
abort ();
return 0;
}
/* Test the `vextQs32' AArch64 SIMD intrinsic. */
/* { dg-do run } */
/* { dg-options "-save-temps -O3 -fno-inline" } */
#include "arm_neon.h"
#include "extq_s32.x"
/* { dg-final { scan-assembler-times "ext\[ \t\]+\[vV\]\[0-9\]+\.16\[bB\], ?\[vV\]\[0-9\]+\.16\[bB\], ?\[vV\]\[0-9\]+\.16\[bB\], ?#\[0-9\]+\(?:.4)?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 3 } } */
/* { dg-final { cleanup-saved-temps } } */
extern void abort (void);
int64x2_t
test_vextq_s64_1 (int64x2_t a, int64x2_t b)
{
return vextq_s64 (a, b, 1);
}
int
main (int argc, char **argv)
{
int i, off;
int64_t arr1[] = {0, 1};
int64x2_t in1 = vld1q_s64 (arr1);
int64_t arr2[] = {2, 3};
int64x2_t in2 = vld1q_s64 (arr2);
int64_t exp[2];
int64x2_t expected;
int64x2_t actual = test_vextq_s64_1 (in1, in2);
for (i = 0; i < 2; i++)
exp[i] = i + 1;
expected = vld1q_s64 (exp);
for (i = 0; i < 2; i++)
if (actual[i] != expected[i])
abort ();
return 0;
}
/* Test the `vextQs64' AArch64 SIMD intrinsic. */
/* { dg-do run } */
/* { dg-options "-save-temps -O3 -fno-inline" } */
#include "arm_neon.h"
#include "extq_s64.x"
/* { dg-final { scan-assembler-times "ext\[ \t\]+\[vV\]\[0-9\]+\.16\[bB\], ?\[vV\]\[0-9\]+\.16\[bB\], ?\[vV\]\[0-9\]+\.16\[bB\], ?#\[0-9\]+\(?:.8\)?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
/* { dg-final { cleanup-saved-temps } } */
extern void abort (void);
int8x16_t
test_vextq_s8_1 (int8x16_t a, int8x16_t b)
{
return vextq_s8 (a, b, 1);
}
int8x16_t
test_vextq_s8_2 (int8x16_t a, int8x16_t b)
{
return vextq_s8 (a, b, 2);
}
int8x16_t
test_vextq_s8_3 (int8x16_t a, int8x16_t b)
{
return vextq_s8 (a, b, 3);
}
int8x16_t
test_vextq_s8_4 (int8x16_t a, int8x16_t b)
{
return vextq_s8 (a, b, 4);
}
int8x16_t
test_vextq_s8_5 (int8x16_t a, int8x16_t b)
{
return vextq_s8 (a, b, 5);
}
int8x16_t
test_vextq_s8_6 (int8x16_t a, int8x16_t b)
{
return vextq_s8 (a, b, 6);
}
int8x16_t
test_vextq_s8_7 (int8x16_t a, int8x16_t b)
{
return vextq_s8 (a, b, 7);
}
int8x16_t
test_vextq_s8_8 (int8x16_t a, int8x16_t b)
{
return vextq_s8 (a, b, 8);
}
int8x16_t
test_vextq_s8_9 (int8x16_t a, int8x16_t b)
{
return vextq_s8 (a, b, 9);
}
int8x16_t
test_vextq_s8_10 (int8x16_t a, int8x16_t b)
{
return vextq_s8 (a, b, 10);
}
int8x16_t
test_vextq_s8_11 (int8x16_t a, int8x16_t b)
{
return vextq_s8 (a, b, 11);
}
int8x16_t
test_vextq_s8_12 (int8x16_t a, int8x16_t b)
{
return vextq_s8 (a, b, 12);
}
int8x16_t
test_vextq_s8_13 (int8x16_t a, int8x16_t b)
{
return vextq_s8 (a, b, 13);
}
int8x16_t
test_vextq_s8_14 (int8x16_t a, int8x16_t b)
{
return vextq_s8 (a, b, 14);
}
int8x16_t
test_vextq_s8_15 (int8x16_t a, int8x16_t b)
{
return vextq_s8 (a, b, 15);
}
int
main (int argc, char **argv)
{
int i;
int8_t arr1[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
int8x16_t in1 = vld1q_s8 (arr1);
int8_t arr2[] =
{16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31};
int8x16_t in2 = vld1q_s8 (arr2);
int8_t exp[16];
int8x16_t expected;
int8x16_t actual = test_vextq_s8_1 (in1, in2);
for (i = 0; i < 16; i++)
exp[i] = i + 1;
expected = vld1q_s8 (exp);
for (i = 0; i < 16; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_s8_2 (in1, in2);
for (i = 0; i < 16; i++)
exp[i] = i + 2;
expected = vld1q_s8 (exp);
for (i = 0; i < 16; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_s8_3 (in1, in2);
for (i = 0; i < 16; i++)
exp[i] = i + 3;
expected = vld1q_s8 (exp);
for (i = 0; i < 16; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_s8_4 (in1, in2);
for (i = 0; i < 16; i++)
exp[i] = i + 4;
expected = vld1q_s8 (exp);
for (i = 0; i < 16; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_s8_5 (in1, in2);
for (i = 0; i < 16; i++)
exp[i] = i + 5;
expected = vld1q_s8 (exp);
for (i = 0; i < 16; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_s8_6 (in1, in2);
for (i = 0; i < 16; i++)
exp[i] = i + 6;
expected = vld1q_s8 (exp);
for (i = 0; i < 16; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_s8_7 (in1, in2);
for (i = 0; i < 16; i++)
exp[i] = i + 7;
expected = vld1q_s8 (exp);
for (i = 0; i < 16; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_s8_8 (in1, in2);
for (i = 0; i < 16; i++)
exp[i] = i + 8;
expected = vld1q_s8 (exp);
for (i = 0; i < 16; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_s8_9 (in1, in2);
for (i = 0; i < 16; i++)
exp[i] = i + 9;
expected = vld1q_s8 (exp);
for (i = 0; i < 16; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_s8_10 (in1, in2);
for (i = 0; i < 16; i++)
exp[i] = i + 10;
expected = vld1q_s8 (exp);
for (i = 0; i < 16; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_s8_11 (in1, in2);
for (i = 0; i < 16; i++)
exp[i] = i + 11;
expected = vld1q_s8 (exp);
for (i = 0; i < 16; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_s8_12 (in1, in2);
for (i = 0; i < 16; i++)
exp[i] = i + 12;
expected = vld1q_s8 (exp);
for (i = 0; i < 16; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_s8_13 (in1, in2);
for (i = 0; i < 16; i++)
exp[i] = i + 13;
expected = vld1q_s8 (exp);
for (i = 0; i < 16; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_s8_14 (in1, in2);
for (i = 0; i < 16; i++)
exp[i] = i + 14;
expected = vld1q_s8 (exp);
for (i = 0; i < 16; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_s8_15 (in1, in2);
for (i = 0; i < 16; i++)
exp[i] = i + 15;
expected = vld1q_s8 (exp);
for (i = 0; i < 16; i++)
if (actual[i] != expected[i])
abort ();
return 0;
}
/* Test the `vextQs8' AArch64 SIMD intrinsic. */
/* { dg-do run } */
/* { dg-options "-save-temps -O3 -fno-inline" } */
#include "arm_neon.h"
#include "extq_s8.x"
/* { dg-final { scan-assembler-times "ext\[ \t\]+\[vV\]\[0-9\]+\.16\[bB\], ?\[vV\]\[0-9\]+\.16\[bB\], ?\[vV\]\[0-9\]+\.16\[bB\], ?#?\[0-9\]+\(?:.2\)?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 15 } } */
/* { dg-final { cleanup-saved-temps } } */
extern void abort (void);
uint16x8_t
test_vextq_u16_1 (uint16x8_t a, uint16x8_t b)
{
return vextq_u16 (a, b, 1);
}
uint16x8_t
test_vextq_u16_2 (uint16x8_t a, uint16x8_t b)
{
return vextq_u16 (a, b, 2);
}
uint16x8_t
test_vextq_u16_3 (uint16x8_t a, uint16x8_t b)
{
return vextq_u16 (a, b, 3);
}
uint16x8_t
test_vextq_u16_4 (uint16x8_t a, uint16x8_t b)
{
return vextq_u16 (a, b, 4);
}
uint16x8_t
test_vextq_u16_5 (uint16x8_t a, uint16x8_t b)
{
return vextq_u16 (a, b, 5);
}
uint16x8_t
test_vextq_u16_6 (uint16x8_t a, uint16x8_t b)
{
return vextq_u16 (a, b, 6);
}
uint16x8_t
test_vextq_u16_7 (uint16x8_t a, uint16x8_t b)
{
return vextq_u16 (a, b, 7);
}
int
main (int argc, char **argv)
{
int i, off;
uint16_t arr1[] = {0, 1, 2, 3, 4, 5, 6, 7};
uint16x8_t in1 = vld1q_u16 (arr1);
uint16_t arr2[] = {8, 9, 10, 11, 12, 13, 14, 15};
uint16x8_t in2 = vld1q_u16 (arr2);
uint16_t exp[8];
uint16x8_t expected;
uint16x8_t actual = test_vextq_u16_1 (in1, in2);
for (i = 0; i < 8; i++)
exp[i] = i + 1;
expected = vld1q_u16 (exp);
for (i = 0; i < 8; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_u16_2 (in1, in2);
for (i = 0; i < 8; i++)
exp[i] = i + 2;
expected = vld1q_u16 (exp);
for (i = 0; i < 8; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_u16_3 (in1, in2);
for (i = 0; i < 8; i++)
exp[i] = i + 3;
expected = vld1q_u16 (exp);
for (i = 0; i < 8; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_u16_4 (in1, in2);
for (i = 0; i < 8; i++)
exp[i] = i + 4;
expected = vld1q_u16 (exp);
for (i = 0; i < 8; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_u16_5 (in1, in2);
for (i = 0; i < 8; i++)
exp[i] = i + 5;
expected = vld1q_u16 (exp);
for (i = 0; i < 8; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_u16_6 (in1, in2);
for (i = 0; i < 8; i++)
exp[i] = i + 6;
expected = vld1q_u16 (exp);
for (i = 0; i < 8; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_u16_7 (in1, in2);
for (i = 0; i < 8; i++)
exp[i] = i + 7;
expected = vld1q_u16 (exp);
for (i = 0; i < 8; i++)
if (actual[i] != expected[i])
abort ();
return 0;
}
/* Test the `vextQu16' AArch64 SIMD intrinsic. */
/* { dg-do run } */
/* { dg-options "-save-temps -O3 -fno-inline" } */
#include "arm_neon.h"
#include "extq_u16.x"
/* { dg-final { scan-assembler-times "ext\[ \t\]+\[vV\]\[0-9\]+\.16\[bB\], ?\[vV\]\[0-9\]+\.16\[bB\], ?\[vV\]\[0-9\]+\.16\[bB\], ?#\[0-9\]+\(?:.2\)?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 7 } } */
/* { dg-final { cleanup-saved-temps } } */
extern void abort (void);
uint32x4_t
test_vextq_u32_1 (uint32x4_t a, uint32x4_t b)
{
return vextq_u32 (a, b, 1);
}
uint32x4_t
test_vextq_u32_2 (uint32x4_t a, uint32x4_t b)
{
return vextq_u32 (a, b, 2);
}
uint32x4_t
test_vextq_u32_3 (uint32x4_t a, uint32x4_t b)
{
return vextq_u32 (a, b, 3);
}
int
main (int argc, char **argv)
{
int i, off;
uint32_t arr1[] = {0, 1, 2, 3};
uint32x4_t in1 = vld1q_u32 (arr1);
uint32_t arr2[] = {4, 5, 6, 7};
uint32x4_t in2 = vld1q_u32 (arr2);
uint32_t exp[4];
uint32x4_t expected;
uint32x4_t actual = test_vextq_u32_1 (in1, in2);
for (i = 0; i < 4; i++)
exp[i] = i + 1;
expected = vld1q_u32 (exp);
for (i = 0; i < 4; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_u32_2 (in1, in2);
for (i = 0; i < 4; i++)
exp[i] = i + 2;
expected = vld1q_u32 (exp);
for (i = 0; i < 4; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_u32_3 (in1, in2);
for (i = 0; i < 4; i++)
exp[i] = i + 3;
expected = vld1q_u32 (exp);
for (i = 0; i < 4; i++)
if (actual[i] != expected[i])
abort ();
return 0;
}
/* Test the `vextQu32' AArch64 SIMD intrinsic. */
/* { dg-do run } */
/* { dg-options "-save-temps -O3 -fno-inline" } */
#include "arm_neon.h"
#include "extq_u32.x"
/* { dg-final { scan-assembler-times "ext\[ \t\]+\[vV\]\[0-9\]+\.16\[bB\], ?\[vV\]\[0-9\]+\.16\[bB\], ?\[vV\]\[0-9\]+\.16\[bB\], ?#\[0-9\]+\(?:.4)?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 3 } } */
/* { dg-final { cleanup-saved-temps } } */
extern void abort (void);
uint64x2_t
test_vextq_u64_1 (uint64x2_t a, uint64x2_t b)
{
return vextq_u64 (a, b, 1);
}
int
main (int argc, char **argv)
{
int i, off;
uint64_t arr1[] = {0, 1};
uint64x2_t in1 = vld1q_u64 (arr1);
uint64_t arr2[] = {2, 3};
uint64x2_t in2 = vld1q_u64 (arr2);
uint64_t exp[2];
uint64x2_t expected;
uint64x2_t actual = test_vextq_u64_1 (in1, in2);
for (i = 0; i < 2; i++)
exp[i] = i + 1;
expected = vld1q_u64 (exp);
for (i = 0; i < 2; i++)
if (actual[i] != expected[i])
abort ();
return 0;
}
/* Test the `vextQu64' AArch64 SIMD intrinsic. */
/* { dg-do run } */
/* { dg-options "-save-temps -O3 -fno-inline" } */
#include "arm_neon.h"
#include "extq_u64.x"
/* { dg-final { scan-assembler-times "ext\[ \t\]+\[vV\]\[0-9\]+\.16\[bB\], ?\[vV\]\[0-9\]+\.16\[bB\], ?\[vV\]\[0-9\]+\.16\[bB\], ?#\[0-9\]+\(?:.8\)?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
/* { dg-final { cleanup-saved-temps } } */
extern void abort (void);
uint8x16_t
test_vextq_u8_1 (uint8x16_t a, uint8x16_t b)
{
return vextq_u8 (a, b, 1);
}
uint8x16_t
test_vextq_u8_2 (uint8x16_t a, uint8x16_t b)
{
return vextq_u8 (a, b, 2);
}
uint8x16_t
test_vextq_u8_3 (uint8x16_t a, uint8x16_t b)
{
return vextq_u8 (a, b, 3);
}
uint8x16_t
test_vextq_u8_4 (uint8x16_t a, uint8x16_t b)
{
return vextq_u8 (a, b, 4);
}
uint8x16_t
test_vextq_u8_5 (uint8x16_t a, uint8x16_t b)
{
return vextq_u8 (a, b, 5);
}
uint8x16_t
test_vextq_u8_6 (uint8x16_t a, uint8x16_t b)
{
return vextq_u8 (a, b, 6);
}
uint8x16_t
test_vextq_u8_7 (uint8x16_t a, uint8x16_t b)
{
return vextq_u8 (a, b, 7);
}
uint8x16_t
test_vextq_u8_8 (uint8x16_t a, uint8x16_t b)
{
return vextq_u8 (a, b, 8);
}
uint8x16_t
test_vextq_u8_9 (uint8x16_t a, uint8x16_t b)
{
return vextq_u8 (a, b, 9);
}
uint8x16_t
test_vextq_u8_10 (uint8x16_t a, uint8x16_t b)
{
return vextq_u8 (a, b, 10);
}
uint8x16_t
test_vextq_u8_11 (uint8x16_t a, uint8x16_t b)
{
return vextq_u8 (a, b, 11);
}
uint8x16_t
test_vextq_u8_12 (uint8x16_t a, uint8x16_t b)
{
return vextq_u8 (a, b, 12);
}
uint8x16_t
test_vextq_u8_13 (uint8x16_t a, uint8x16_t b)
{
return vextq_u8 (a, b, 13);
}
uint8x16_t
test_vextq_u8_14 (uint8x16_t a, uint8x16_t b)
{
return vextq_u8 (a, b, 14);
}
uint8x16_t
test_vextq_u8_15 (uint8x16_t a, uint8x16_t b)
{
return vextq_u8 (a, b, 15);
}
int
main (int argc, char **argv)
{
int i;
uint8_t arr1[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
uint8x16_t in1 = vld1q_u8 (arr1);
uint8_t arr2[] =
{16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31};
uint8x16_t in2 = vld1q_u8 (arr2);
uint8_t exp[16];
uint8x16_t expected;
uint8x16_t actual = test_vextq_u8_1 (in1, in2);
for (i = 0; i < 16; i++)
exp[i] = i + 1;
expected = vld1q_u8 (exp);
for (i = 0; i < 16; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_u8_2 (in1, in2);
for (i = 0; i < 16; i++)
exp[i] = i + 2;
expected = vld1q_u8 (exp);
for (i = 0; i < 16; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_u8_3 (in1, in2);
for (i = 0; i < 16; i++)
exp[i] = i + 3;
expected = vld1q_u8 (exp);
for (i = 0; i < 16; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_u8_4 (in1, in2);
for (i = 0; i < 16; i++)
exp[i] = i + 4;
expected = vld1q_u8 (exp);
for (i = 0; i < 16; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_u8_5 (in1, in2);
for (i = 0; i < 16; i++)
exp[i] = i + 5;
expected = vld1q_u8 (exp);
for (i = 0; i < 16; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_u8_6 (in1, in2);
for (i = 0; i < 16; i++)
exp[i] = i + 6;
expected = vld1q_u8 (exp);
for (i = 0; i < 16; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_u8_7 (in1, in2);
for (i = 0; i < 16; i++)
exp[i] = i + 7;
expected = vld1q_u8 (exp);
for (i = 0; i < 16; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_u8_8 (in1, in2);
for (i = 0; i < 16; i++)
exp[i] = i + 8;
expected = vld1q_u8 (exp);
for (i = 0; i < 16; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_u8_9 (in1, in2);
for (i = 0; i < 16; i++)
exp[i] = i + 9;
expected = vld1q_u8 (exp);
for (i = 0; i < 16; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_u8_10 (in1, in2);
for (i = 0; i < 16; i++)
exp[i] = i + 10;
expected = vld1q_u8 (exp);
for (i = 0; i < 16; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_u8_11 (in1, in2);
for (i = 0; i < 16; i++)
exp[i] = i + 11;
expected = vld1q_u8 (exp);
for (i = 0; i < 16; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_u8_12 (in1, in2);
for (i = 0; i < 16; i++)
exp[i] = i + 12;
expected = vld1q_u8 (exp);
for (i = 0; i < 16; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_u8_13 (in1, in2);
for (i = 0; i < 16; i++)
exp[i] = i + 13;
expected = vld1q_u8 (exp);
for (i = 0; i < 16; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_u8_14 (in1, in2);
for (i = 0; i < 16; i++)
exp[i] = i + 14;
expected = vld1q_u8 (exp);
for (i = 0; i < 16; i++)
if (actual[i] != expected[i])
abort ();
actual = test_vextq_u8_15 (in1, in2);
for (i = 0; i < 16; i++)
exp[i] = i + 15;
expected = vld1q_u8 (exp);
for (i = 0; i < 16; i++)
if (actual[i] != expected[i])
abort ();
return 0;
}
/* Test the `vextQu8' AArch64 SIMD intrinsic. */
/* { dg-do run } */
/* { dg-options "-save-temps -O3 -fno-inline" } */
#include "arm_neon.h"
#include "extq_u8.x"
/* { dg-final { scan-assembler-times "ext\[ \t\]+\[vV\]\[0-9\]+\.16\[bB\], ?\[vV\]\[0-9\]+\.16\[bB\], ?\[vV\]\[0-9\]+\.16\[bB\], ?#?\[0-9\]+\(?:.2\)?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 15 } } */
/* { dg-final { cleanup-saved-temps } } */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment