(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
powerpc/
pr79799-4.c
       1  /* { dg-do run { target { powerpc*-*-linux* } } } */
       2  /* { dg-require-effective-target vsx_hw } */
       3  /* { dg-require-effective-target p9vector_hw } */
       4  /* { dg-options "-mdejagnu-cpu=power9 -O2" } */
       5  
       6  #include <altivec.h>
       7  #include <stdlib.h>
       8  
       9  __attribute__ ((__noinline__))
      10  vector float
      11  insert_0 (vector float v, float f)
      12  {
      13    return vec_insert (f, v, 0);
      14  }
      15  
      16  __attribute__ ((__noinline__))
      17  vector float
      18  insert_1 (vector float v, float f)
      19  {
      20    return vec_insert (f, v, 1);
      21  }
      22  
      23  __attribute__ ((__noinline__))
      24  vector float
      25  insert_2 (vector float v, float f)
      26  {
      27    return vec_insert (f, v, 2);
      28  }
      29  
      30  __attribute__ ((__noinline__))
      31  vector float
      32  insert_3 (vector float v, float f)
      33  {
      34    return vec_insert (f, v, 3);
      35  }
      36  
      37  __attribute__ ((__noinline__))
      38  void
      39  test_insert (void)
      40  {
      41    vector float v1 = { 1.0f, 2.0f, 3.0f, 4.0f };
      42    vector float v2 = { 5.0f, 6.0f, 7.0f, 8.0f };
      43  
      44    v1 = insert_0 (v1, 5.0f);
      45    v1 = insert_1 (v1, 6.0f);
      46    v1 = insert_2 (v1, 7.0f);
      47    v1 = insert_3 (v1, 8.0f);
      48  
      49    if (vec_any_ne (v1, v2))
      50      abort ();
      51  }
      52  
      53  __attribute__ ((__noinline__))
      54  vector float
      55  insert_extract_0_3 (vector float v1, vector float v2)
      56  {
      57    return vec_insert (vec_extract (v2, 3), v1, 0);
      58  }
      59  
      60  __attribute__ ((__noinline__))
      61  vector float
      62  insert_extract_1_2 (vector float v1, vector float v2)
      63  {
      64    return vec_insert (vec_extract (v2, 2), v1, 1);
      65  }
      66  
      67  __attribute__ ((__noinline__))
      68  vector float
      69  insert_extract_2_1 (vector float v1, vector float v2)
      70  {
      71    return vec_insert (vec_extract (v2, 1), v1, 2);
      72  }
      73  
      74  __attribute__ ((__noinline__))
      75  vector float
      76  insert_extract_3_0 (vector float v1, vector float v2)
      77  {
      78    return vec_insert (vec_extract (v2, 0), v1, 3);
      79  }
      80  
      81  __attribute__ ((__noinline__))
      82  void
      83  test_insert_extract (void)
      84  {
      85    vector float v1 = { 1.0f, 2.0f, 3.0f, 4.0f };
      86    vector float v2 = { 5.0f, 6.0f, 7.0f, 8.0f };
      87    vector float v3 = { 8.0f, 7.0f, 6.0f, 5.0f };
      88  
      89    v1 = insert_extract_0_3 (v1, v2);
      90    v1 = insert_extract_1_2 (v1, v2);
      91    v1 = insert_extract_2_1 (v1, v2);
      92    v1 = insert_extract_3_0 (v1, v2);
      93  
      94    if (vec_any_ne (v1, v3))
      95      abort ();
      96  }
      97  
      98  int
      99  main (void)
     100  {
     101    test_insert ();
     102    test_insert_extract ();
     103    return 0;
     104  }