aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.dg/torture/neon-sve-bridge.c
blob: 4f8f26cec1b44cdba222757a2988089b5ed4acc4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
// { dg-options "-march=armv8.2-a+sve" }
// { dg-do run { target aarch64_sve_hw } }

#include <arm_neon_sve_bridge.h>

extern void abort (void);

int
svget_neonq_test ()
{
  int64_t val1 = 987654321;
  int64_t val2 = 123456789;
  svint64_t sveInput = svdupq_n_s64 (val1, val2);
  int64x2_t neonReturn = svget_neonq_s64 (sveInput);
  int64_t val1Return = vgetq_lane_s64 (neonReturn, 0);
  int64_t val2Return = vgetq_lane_s64 (neonReturn, 1);
  if (val1 == val1Return && val2 == val2Return)
    return 0;
  return 1;
}

int
svset_neonq_test ()
{
  int64_t val1 = 987654321;
  int64_t val2 = 123456789;
  int64x2_t NeonInput;
  NeonInput = vsetq_lane_s64 (val1, NeonInput, 0);
  NeonInput = vsetq_lane_s64 (val2, NeonInput, 1);
  svint64_t sveReturn = svset_neonq_s64 (sveReturn, NeonInput);
  int64_t val1Return = svlasta_s64 (svptrue_b64(), sveReturn);
  int64_t val2Return = svlastb_s64 (svptrue_pat_b8(SV_VL16), sveReturn);
  if (val1 == val1Return && val2 == val2Return)
    return 0;
  return 1;
}

int
svdup_neonq_test ()
{
  int64_t val1 = 987654321;
  int64_t val2 = 123456789;
  int64x2_t NeonInput;
  NeonInput = vsetq_lane_s64 (val1, NeonInput, 0);
  NeonInput = vsetq_lane_s64 (val2, NeonInput, 1);
  svint64_t sveReturn = svdup_neonq_s64 (NeonInput);
  int64_t val1Return = svlasta_s64 (svptrue_b64(), sveReturn);
  int64_t val2Return = svlastb_s64 (svptrue_b64(), sveReturn);
  if (val1 == val1Return && val2 == val2Return)
    return 0;
  return 1;
}

int
main ()
{
  if (svget_neonq_test () == 1)
    abort ();
  if (svset_neonq_test () == 1)
    abort ();
  if (svdup_neonq_test () == 1)
    abort ();
  return 0;
}