aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.target/powerpc/pr106069-2.c
blob: 283e3290fb310c4c22b20e2f4fa0b6bef9f59087 (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
/* { dg-do run } */
/* { dg-options "-O2" } */
/* { dg-require-effective-target vmx_hw } */

/* Test vector merge for 16-bit element size,
   it will abort if the RTL pattern isn't expected.  */

#include "altivec.h"

__attribute__((noipa))
signed short elem_2 (vector signed short a, vector signed short b)
{
  vector signed short c = vec_mergeh (a,b);
  return vec_extract (c, 2);
}

__attribute__((noipa))
unsigned short elem_7 (vector unsigned short a, vector unsigned short b)
{
  vector unsigned short c = vec_mergel (a,b);
  return vec_extract (c, 7);
}

int
main ()
{
  vector unsigned short v1 = {3, 22, 12, 34, 5, 25, 30, 11};
  vector unsigned short v2 = {84, 168, 267, 966, 65, 399, 999, 99};
  signed short x1 = elem_2 ((vector signed short) v1, (vector signed short) v2);
  unsigned short x2 = elem_7 (v1, v2);

  if (x1 != 22 || x2 != 99)
    __builtin_abort ();

  return 0;
}