1  /* { dg-do run } */
       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  
      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  }