summaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.target/powerpc/builtins-3-runnable.c
blob: 08b7a5395d21f494a5025494eff6091a6cf586b5 (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
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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
/* { dg-do run { target { powerpc*-*-linux* } } } */
/* { dg-require-effective-target vsx_hw } */
/* { dg-options "-O2 -mvsx -mcpu=power8" } */
/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power8" } } */

#include <altivec.h> // vector

#define ALL  1
#define EVEN 2
#define ODD  3

void abort (void);

void test_result_sp(int check, vector float vec_result, vector float vec_expected)
{
	int i;
	for(i = 0; i<4; i++) {

	switch (check) {
	case ALL:
		break;
	case EVEN:
		if (i%2 == 0)
			break;
		else
			continue;
	case ODD:
		if (i%2 != 0)
			break;
		else
			continue;
	}

	if (vec_result[i] != vec_expected[i])
		abort();
	}
}

void test_result_dp(vector double vec_result, vector double vec_expected)
{
	if (vec_result[0] != vec_expected[0])
		abort();

	if (vec_result[1] != vec_expected[1])
		abort();
}

int main()
{
	int i;
	vector unsigned int vec_unint;
	vector signed int vec_int;
	vector long long int vec_ll_int0, vec_ll_int1;
	vector long long unsigned int vec_ll_uns_int0, vec_ll_uns_int1;
	vector float  vec_flt, vec_flt_result, vec_flt_expected;
	vector double vec_dble0, vec_dble1, vec_dble_result, vec_dble_expected;

	vec_int = (vector signed int){ -1, 3, -5, 1234567 };
	vec_ll_int0 = (vector long long int){ -12, -12345678901234 };
	vec_ll_int1 = (vector long long int){ 12, 9876543210 };
	vec_unint = (vector unsigned int){ 9, 11, 15, 2468013579 };
	vec_ll_uns_int0 = (vector unsigned long long int){ 102, 9753108642 };
	vec_ll_uns_int1 = (vector unsigned long long int){ 23, 29 };
	vec_flt = (vector float){ -21., 3.5, -53., 78. };
	vec_dble0 = (vector double){ 34.0, 97.0 };
	vec_dble1 = (vector double){ 214.0, -5.5 };

	/* conversion of words 0 and 2 */
	vec_dble_expected = (vector double){-1.000000, -5.000000};
	vec_dble_result = vec_doublee (vec_int);
	test_result_dp(vec_dble_result, vec_dble_expected);

	vec_dble_expected = (vector double){9.000000, 15.000000};
	vec_dble_result = vec_doublee (vec_unint);
	test_result_dp(vec_dble_result, vec_dble_expected);

	vec_dble_expected = (vector double){-21.000000, -53.000000};
	vec_dble_result = vec_doublee (vec_flt);
	test_result_dp(vec_dble_result, vec_dble_expected);


	/* conversion of words 1 and 3 */
	vec_dble_expected = (vector double){3.000000, 1234567.000000};
	vec_dble_result = vec_doubleo (vec_int);
	test_result_dp(vec_dble_result, vec_dble_expected);

	vec_dble_expected = (vector double){11.000000, 2468013579.000000};
	vec_dble_result = vec_doubleo (vec_unint);
	test_result_dp(vec_dble_result, vec_dble_expected);

	vec_dble_expected = (vector double){3.500000, 78.000000};
	vec_dble_result = vec_doubleo (vec_flt);
	test_result_dp(vec_dble_result, vec_dble_expected);


	/* conversion of words 0 and 1 */
	vec_dble_expected = (vector double){-5.000000, 1234567.000000};
	vec_dble_result = vec_doublel (vec_int);
	test_result_dp(vec_dble_result, vec_dble_expected);

	vec_dble_expected = (vector double){15.000000, 2468013579.000000};
	vec_dble_result = vec_doublel (vec_unint);
	test_result_dp(vec_dble_result, vec_dble_expected);

	vec_dble_expected = (vector double){-53.000000, 78.000000};
	vec_dble_result = vec_doublel (vec_flt);
	test_result_dp(vec_dble_result, vec_dble_expected);


	/* conversion of words 2 and 3 */
	vec_dble_expected = (vector double){-1.000000, 3.000000};
	vec_dble_result = vec_doubleh (vec_int);
	test_result_dp(vec_dble_result, vec_dble_expected);

	vec_dble_expected = (vector double){9.000000, 11.000000};
	vec_dble_result = vec_doubleh (vec_unint);
	test_result_dp(vec_dble_result, vec_dble_expected);

	vec_dble_expected = (vector double){-21.000000, 3.500000};
	vec_dble_result = vec_doubleh (vec_flt);
	test_result_dp(vec_dble_result, vec_dble_expected);

	/* conversion of integer vector to single precision float vector */
	vec_flt_expected = (vector float){-1.00, 3.00, -5.00, 1234567.00};
	vec_flt_result = vec_float (vec_int);
	test_result_sp(ALL, vec_flt_result, vec_flt_expected);

	vec_flt_expected = (vector float){9.00, 11.00, 15.00, 2468013579.0};
	vec_flt_result = vec_float (vec_unint);
	test_result_sp(ALL, vec_flt_result, vec_flt_expected);

	/* conversion of two double precision vectors to single precision vector */
	vec_flt_expected = (vector float){-12.00, -12345678901234.00, 12.00, 9876543210.00};
	vec_flt_result = vec_float2 (vec_ll_int0, vec_ll_int1);
	test_result_sp(ALL, vec_flt_result, vec_flt_expected);

	vec_flt_expected = (vector float){102.00, 9753108642.00, 23.00, 29.00};
	vec_flt_result = vec_float2 (vec_ll_uns_int0, vec_ll_uns_int1);
	test_result_sp(ALL, vec_flt_result, vec_flt_expected);

	/* conversion of even words in double precision vector to single precision vector */
	vec_flt_expected = (vector float){-12.00, 00.00, -12345678901234.00, 0.00};
	vec_flt_result = vec_floate (vec_ll_int0);
	test_result_sp(EVEN, vec_flt_result, vec_flt_expected);

	vec_flt_expected = (vector float){102.00, 0.00, 9753108642.00, 0.00};
	vec_flt_result = vec_floate (vec_ll_uns_int0);
	test_result_sp(EVEN, vec_flt_result, vec_flt_expected);

	vec_flt_expected = (vector float){34.00, 0.00, 97.00, 0.00};
	vec_flt_result = vec_floate (vec_dble0);
	test_result_sp(EVEN, vec_flt_result, vec_flt_expected);

	/* conversion of odd words in double precision vector to single precision vector */
	vec_flt_expected = (vector float){0.00, -12.00, 00.00, -12345678901234.00};
	vec_flt_result = vec_floato (vec_ll_int0);
	test_result_sp(ODD, vec_flt_result, vec_flt_expected);

	vec_flt_expected = (vector float){0.00, 102.00, 0.00, 9753108642.00};
	vec_flt_result = vec_floato (vec_ll_uns_int0);
	test_result_sp(ODD, vec_flt_result, vec_flt_expected);

	vec_flt_expected = (vector float){0.00, 34.00, 0.00, 97.00};
	vec_flt_result = vec_floato (vec_dble0);
	test_result_sp(ODD, vec_flt_result, vec_flt_expected);
}