aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.c-torture/execute/scal-to-vec2.c
blob: 0a5037e333ea9c20ec7ea615f721fa56c2cebae7 (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
#define vector(elcount, type)  \
__attribute__((vector_size((elcount)*sizeof(type)))) type

#define vidx(type, vec, idx) (*((type *) &(vec) + idx))

#define operl(a, b, op) (a op b)
#define operr(a, b, op) (b op a)

#define check(type, count, vec0, vec1, num, op, lr) \
do {\
    int __i; \
    for (__i = 0; __i < count; __i++) {\
        if (vidx (type, vec1, __i) != oper##lr (num, vidx (type, vec0, __i), op)) \
            __builtin_abort (); \
    }\
} while (0)

#define veccompare(type, count, v0, v1) \
do {\
    int __i; \
    for (__i = 0; __i < count; __i++) { \
        if (vidx (type, v0, __i) != vidx (type, v1, __i)) \
            __builtin_abort (); \
    } \
} while (0)


long __attribute__ ((noinline)) vlng () {   return (long)42; }
int  __attribute__ ((noinline)) vint () {   return (int) 43; }
short __attribute__ ((noinline)) vsrt () {   return (short)42; }
char __attribute__ ((noinline)) vchr () {    return (char)42; }


int main (int argc, char *argv[]) {
    vector(16, char) c0 = {argc, 1,2,3,4,5,6,7, argc, 1,2,3,4,5,6,7};
    vector(16, char) c1;
    
    vector(8, short) s0 = {argc, 1,2,3,4,5,6,7};
    vector(8, short) s1;

    vector(4, int) i0 = {argc, 1, 2, 3};
    vector(4, int) i1;

    vector(2, long) l0 = {argc, 1};
    vector(2, long) l1;

    c1 = vchr() + c0; check (char, 16, c0, c1, vchr(), +, l);
    
    s1 = vsrt() + s0; check (short, 8, s0, s1, vsrt(), +, l);
    s1 = vchr() + s0; check (short, 8, s0, s1, vchr(), +, l);

    i1 = vint() * i0; check (int, 4, i0, i1, vint(), *, l);
    i1 = vsrt() * i0; check (int, 4, i0, i1, vsrt(), *, l);
    i1 = vchr() * i0; check (int, 4, i0, i1, vchr(), *, l);

    l1 = vlng() * l0; check (long, 2, l0, l1, vlng(), *, l);
    l1 = vint() * l0; check (long, 2, l0, l1, vint(), *, l);
    l1 = vsrt() * l0; check (long, 2, l0, l1, vsrt(), *, l);
    l1 = vchr() * l0; check (long, 2, l0, l1, vchr(), *, l);

    return 0;
}