1 /* { dg-do run { target { powerpc64*-*-* } } } */
2 /* { dg-require-effective-target powerpc_vsx_ok } */
3 /* { dg-options "-mvsx -O3" } */
4 
5 /* Test that the vec_mul builtin works as expected.  */
6 
7 #include "altivec.h"
8 
9 #define N 4096
10 
11 void abort ();
12 
13 #define define_test_functions(STYPE, NAMESUFFIX) \
14 \
15 STYPE result_##NAMESUFFIX[N]; \
16 STYPE operand1_##NAMESUFFIX[N]; \
17 STYPE operand2_##NAMESUFFIX[N]; \
18 STYPE expected_##NAMESUFFIX[N]; \
19 \
20 __attribute__((noinline)) void vector_tests_##NAMESUFFIX () \
21 { \
22   int i; \
23   vector STYPE v1, v2, tmp; \
24   for (i = 0; i < N; i+=16/sizeof (STYPE)) \
25     { \
26       /* result=operand1*operand2.  */ \
27       v1 = vec_vsx_ld (0, &operand1_##NAMESUFFIX[i]); \
28       v2 = vec_vsx_ld (0, &operand2_##NAMESUFFIX[i]); \
29 \
30       tmp = vec_mul (v1, v2); \
31       vec_vsx_st (tmp, 0, &result_##NAMESUFFIX[i]); \
32     } \
33 } \
34 \
35 __attribute__((noinline)) void init_##NAMESUFFIX () \
36 { \
37   int i; \
38   for (i = 0; i < N; ++i) \
39     { \
40       result_##NAMESUFFIX[i] = 0; \
41       operand1_##NAMESUFFIX[i] = (i+1) % 31; \
42       operand2_##NAMESUFFIX[i] = (i*2) % 15; \
43       expected_##NAMESUFFIX[i] = operand1_##NAMESUFFIX[i] * \
44 				 operand2_##NAMESUFFIX[i]; \
45     } \
46 } \
47 \
48 __attribute__((noinline)) void verify_results_##NAMESUFFIX () \
49 { \
50   int i; \
51   for (i = 0; i < N; ++i) \
52     { \
53       if (result_##NAMESUFFIX[i] != expected_##NAMESUFFIX[i]) \
54 	abort (); \
55     } \
56 }
57 
58 
59 #define execute_test_functions(STYPE, NAMESUFFIX) \
60 { \
61   init_##NAMESUFFIX (); \
62   vector_tests_##NAMESUFFIX (); \
63   verify_results_##NAMESUFFIX (); \
64 }
65 
66 
67 define_test_functions (signed int, si);
68 define_test_functions (unsigned int, ui);
69 define_test_functions (signed short, ss);
70 define_test_functions (unsigned short, us);
71 define_test_functions (signed char, sc);
72 define_test_functions (unsigned char, uc);
73 define_test_functions (float, f);
74 
main()75 int main ()
76 {
77   execute_test_functions (signed int, si);
78   execute_test_functions (unsigned int, ui);
79   execute_test_functions (signed short, ss);
80   execute_test_functions (unsigned short, us);
81   execute_test_functions (signed char, sc);
82   execute_test_functions (unsigned char, uc);
83   execute_test_functions (float, f);
84 
85   return 0;
86 }
87