File: altivec-2-runnable.c

package info (click to toggle)
gcc-arm-none-eabi 15%3A12.2.rel1-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 959,712 kB
  • sloc: cpp: 3,275,382; ansic: 2,061,766; ada: 840,956; f90: 208,513; makefile: 76,132; asm: 73,433; xml: 50,448; exp: 34,146; sh: 32,436; objc: 15,637; fortran: 14,012; python: 11,991; pascal: 6,787; awk: 4,779; perl: 3,054; yacc: 338; ml: 285; lex: 201; haskell: 122
file content (141 lines) | stat: -rw-r--r-- 4,064 bytes parent folder | download
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
/* { dg-do compile { target powerpc*-*-* } } */
/* { dg-require-effective-target powerpc_p8vector_ok } */
/* { dg-options "-mpower8-vector -mvsx" } */

#include <altivec.h>

#ifdef DEBUG
#include <stdio.h>
#endif

void abort (void);

/* Endian considerations: The "high" half of a vector with n elements is the
   first n/2 elements of the vector. For little endian, these elements are in
   the rightmost half of the vector. For big endian, these elements are in the
   leftmost half of the vector.  */

int main ()
{
  int i;
  vector bool int vec_bi_arg;
  vector bool long long vec_bll_result, vec_bll_expected;

  vector signed int vec_si_arg;
  vector signed long long int vec_slli_result, vec_slli_expected;
  vector float vec_float_arg;
  vector double vec_double_result, vec_double_expected;

  union conv {
	  double d;
	  unsigned long long l;
  } conv_exp, conv_val;

  /* Use of 'double' and ‘long long’ in AltiVec types requires -mvsx */
  /* __builtin_altivec_vupkhsw and __builtin_altivec_vupklsw
     requires the -mpower8-vector option */

  vec_bi_arg = (vector bool int){ 0, 1, 1, 0 };

  vec_bll_expected = (vector bool long long){ 0, 1 };

  vec_bll_result = vec_unpackh (vec_bi_arg);

  for (i = 0; i < 2; i++) {
    if (vec_bll_expected[i] != vec_bll_result[i])
#if DEBUG
       printf("ERROR: vec_unpackh, vec_bll_expected[%d] = %d does not match vec_bll_result[%d] = %d\n",
	      i, vec_bll_expected[i], i, vec_bll_result[i]);
#else
       abort();
#endif
  }

  vec_bll_expected = (vector bool long long){ 1, 0 };

  vec_bll_result = vec_unpackl (vec_bi_arg);

  for (i = 0; i < 2; i++) {
    if (vec_bll_expected[i] != vec_bll_result[i])
#if DEBUG
       printf("ERROR: vec_unpackl, vec_bll_expected[%d] = %d does not match vec_bll_result[%d] = %d\n",
	      i, vec_bll_expected[i], i, vec_bll_result[i]);
#else
       abort();
#endif
  }


  vec_si_arg = (vector signed int){ 0, 101, 202, 303 };

  vec_slli_expected = (vector signed long long int){ 0, 101 };

  vec_slli_result = vec_unpackh (vec_si_arg);

  for (i = 0; i < 2; i++) {
    if (vec_slli_expected[i] != vec_slli_result[i])
#if DEBUG
       printf("ERROR: vec_unpackh, vec_slli_expected[%d] = %d does not match vec_slli_result[%d] = %d\n",
	      i, vec_slli_expected[i], i, vec_slli_result[i]);
#else
       abort();
#endif
  }

  vec_slli_result = vec_unpackl (vec_si_arg);
  vec_slli_expected = (vector signed long long int){ 202, 303 };

  for (i = 0; i < 2; i++) {
    if (vec_slli_expected[i] != vec_slli_result[i])
#if DEBUG
       printf("ERROR: vec_unpackl, vec_slli_expected[%d] = %d does not match vec_slli_result[%d] = %d\n",
	      i, vec_slli_expected[i], i, vec_slli_result[i]);
#else
       abort();
#endif
  }

  vec_float_arg = (vector float){ 0.0, 1.5, 2.5, 3.5 };

  vec_double_expected = (vector double){ 0.0, 1.5 };

  vec_double_result = vec_unpackh (vec_float_arg);

  for (i = 0; i < 2; i++) {
    if (vec_double_expected[i] != vec_double_result[i])
      {
#if DEBUG
	 printf("ERROR: vec_unpackh(), vec_double_expected[%d] = %f does not match vec_double_result[%d] = %f\n",
		i, vec_double_expected[i], i, vec_double_result[i]);
	 conv_val.d = vec_double_result[i];
	 conv_exp.d = vec_double_expected[i];
	 printf("     vec_unpackh(), vec_double_expected[%d] = 0x%llx does not match vec_double_result[%d] = 0x%llx\n",
		i, conv_exp.l, i,conv_val.l);
#else
	 abort();
#endif
    }
  }

  vec_double_expected = (vector double){ 2.5, 3.5 };

  vec_double_result = vec_unpackl (vec_float_arg);

  for (i = 0; i < 2; i++) {
    if (vec_double_expected[i] != vec_double_result[i])
      {
#if DEBUG
         printf("ERROR: vec_unpackl() vec_double_expected[%d] = %f does not match vec_double_result[%d] = %f\n",
		i, vec_double_expected[i], i, vec_double_result[i]);
	 conv_val.d = vec_double_result[i];
	 conv_exp.d = vec_double_expected[i];
	 printf("     vec_unpackh(), vec_double_expected[%d] = 0x%llx does not match vec_double_result[%d] = 0x%llx\n",
		i, conv_exp.l, i,conv_val.l);
#else
         abort();
#endif
      }
  }

  return 0;
}