aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.target/powerpc/pr121007.c
blob: 9e6b1be7911fcb3edbd5614f011cef3c5622e8f9 (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
/* { dg-do compile } */
/* { dg-options "-O2 -mdejagnu-cpu=power9" } */

typedef struct { int a; } A;
unsigned char *a;
char b;
int c;
void foo (vector char, vector char, vector char);

void
bar (long stride)
{
  vector char v0, v1, v2, v3, v5;
  vector char r0 = __builtin_vec_vsx_ld (0, a);
  vector char r2 = __builtin_vec_vsx_ld (2 * stride, a - 3);
  vector char r3 = __builtin_vec_vsx_ld (3 * stride, a - 3);
  vector char r4;
  vector char r6 = __builtin_vec_vsx_ld (6 * stride, a - 3);
  vector char r7 = __builtin_vec_vsx_ld (7 * stride, a - 3);
  vector char r14, h, i, j;
  if (b)
    return;
  v1 = __builtin_vec_vsx_ld (9 * stride, a);
  v2 = __builtin_vec_vsx_ld (10 * stride, a - 3);
  v3 = __builtin_vec_vsx_ld (11 * stride, a - 3);
  r3 = __builtin_vec_mergeh (r3, v3);
  v5 = __builtin_vec_mergel (r2, r6);
  r14 = __builtin_vec_mergeh (r3, r7);
  r4 = __builtin_vec_mergeh (v2, r14);
  v0 = __builtin_vec_mergeh (r0, r4);
  union { unsigned char a[16]; A b; } temp;
  vector signed char k;
  h = __builtin_vec_ld (0, temp.a);
  i = __builtin_vec_splat (h, 1);
  temp.b.a = c;
  k = __builtin_vec_ld (0, (signed char *) temp.a);
  j = __builtin_vec_and (i, (vector char) k);
  foo (v1, v0, j);
  foo (v1, v5, j);
}