1/* { dg-do compile } */
2/* { dg-options "-O -mcpu=ultrasparc -mvis" } */
3typedef char  vec8 __attribute__((vector_size(8)));
4typedef short vec16 __attribute__((vector_size(8)));
5typedef int   vec32 __attribute__((vector_size(8)));
6
7extern vec8 foo1_8(void);
8extern vec8 foo2_8(void);
9
10vec8 fun8(void)
11{
12  return ~foo1_8 () | foo2_8 ();
13}
14
15#ifndef __LP64__
16/* Test the 32-bit splitter. */
17vec8 fun8_2(vec8 a, vec8 b)
18{
19  return ~a | b;
20}
21#endif
22
23extern vec16 foo1_16(void);
24extern vec16 foo2_16(void);
25
26vec16 fun16(void)
27{
28  return ~foo1_16 () | foo2_16 ();
29}
30
31#ifndef __LP64__
32/* Test the 32-bit splitter. */
33vec16 fun16_2(vec16 a, vec16 b)
34{
35  return ~a | b;
36}
37#endif
38
39extern vec32 foo1_32(void);
40extern vec32 foo2_32(void);
41
42vec32 fun32(void)
43{
44  return ~foo1_32 () | foo2_32 ();
45}
46
47#ifndef __LP64__
48/* Test the 32-bit splitter. */
49vec32 fun32_2(vec32 a, vec32 b)
50{
51  return ~a | b;
52}
53#endif
54
55
56/* This should be transformed into ~b | a.  */
57vec8 fun8b(void)
58{
59  return foo1_8 () | ~foo2_8 ();
60}
61
62#ifndef __LP64__
63/* Test the 32-bit splitter. */
64vec8 fun8_2b(vec8 a, vec8 b)
65{
66  return a | ~b;
67}
68#endif
69
70vec16 fun16b(void)
71{
72  return foo1_16 () | ~foo2_16 ();
73}
74
75#ifndef __LP64__
76/* Test the 32-bit splitter. */
77vec16 fun16_2b(vec16 a, vec16 b)
78{
79  return a | ~b;
80}
81#endif
82
83vec32 fun32b(void)
84{
85  return foo1_32 () | ~foo2_32 ();
86}
87
88#ifndef __LP64__
89/* Test the 32-bit splitter. */
90vec32 fun32_2b(vec32 a, vec32 b)
91{
92  return a | ~b;
93}
94#endif
95
96/* { dg-final { scan-assembler-times "fornot1\t%" 6 } } */
97