aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.target/powerpc/builtins-8-runnable.c
blob: 38a1390d18e0d0a2d3d917bd5369bca4ecfc9fbd (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
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
/* { dg-do run } */
/* { dg-require-effective-target p8vector_hw } */
/* { dg-options "-mdejagnu-cpu=power8 -O2" } */

#include <stdint.h>
#include <stdio.h>
#include <math.h>
#include <altivec.h>

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

void abort (void);

int main()
  {
    int i;
    vector float f_arg1;
    vector double d_arg1;
   
    vector float vec_f_expected1, vec_f_result1, vec_f_error;
    vector double vec_d_expected1, vec_d_result1, vec_d_error;
  
    /* vec_expte: float args, result */
    f_arg1 = (vector float){1.0, 2.0, 3.0, 4.0};
    vec_f_expected1 = (vector float){2.0, 4.0, 8.0, 16.0};

    vec_f_result1 = vec_expte (f_arg1);

    for (i = 0; i < 4; i++)
      {
        if (vec_f_expected1[i] != vec_f_result1[i])
#ifdef DEBUG
           printf("ERROR vec_expte (f) result[%d]=%f != expected[%d]=%f\n",
		  i, vec_f_result1[i],  i, vec_f_expected1[i]);
#else
        abort();
#endif
      }

    /* vec_loge: float args, result */
    f_arg1 = (vector float){4.0, 8.0, 16.0, 64};
    vec_f_expected1 = (vector float){2.0, 3.0, 4.0, 6.0};

    vec_f_result1 = vec_loge (f_arg1);

    for (i = 0; i < 4; i++)
      {
        if (vec_f_expected1[i] != vec_f_result1[i])
#ifdef DEBUG
	  printf("ERROR vec_loge (f) result[%d]=%f != expected[%d]=%f\n",
		 i, vec_f_result1[i],  i, vec_f_expected1[i]);
#else
          abort();
#endif
    }

    /* vec_re: float args, result  (calculate approximate reciprocal)  */
    f_arg1 = (vector float){1.0, 5.0, 4.0, 8.0};
    vec_f_expected1 = (vector float){1.0, 0.2, 0.25, 0.125};
    vec_f_error = (vector float){1.0, 0.2, 0.25, 0.125};

    vec_f_result1 = vec_re (f_arg1);
  
    for (i = 0; i < 4; i++)
      {
        vec_f_error[i] = fabs(vec_f_expected1[i] - vec_f_result1[i]);
  
        if (vec_f_error[i] >=  0.0001)
#ifdef DEBUG
           printf("ERROR vec_re (f) result[%d]=%f != expected[%d]=%f\n",
		  i, vec_f_result1[i],  i, vec_f_expected1[i]);
#else
	abort();
#endif
      }

    /* vec_re: double args, result  (calculate approximate reciprocal)  */
    d_arg1 = (vector double){1.0, 8.0};
    vec_d_expected1 = (vector double){1.0, 0.125};
    vec_d_error = (vector double){1.0, 0.125};

    vec_d_result1 = vec_re (d_arg1);
  
    for (i = 0; i < 2; i++)
      {
         vec_d_error[i] = fabs(vec_d_expected1[i] - vec_d_result1[i]);
  
         if (vec_d_error[i] >=  0.0001)
#ifdef DEBUG
           printf("ERROR vec_re (d) result[%d]=%f != expected[%d]=%f\n",
		  i, vec_d_result1[i],  i, vec_d_expected1[i]);
#else
          abort();
#endif
      }
  }