(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
powerpc/
vec-extract-v16qiu-v2.h
       1  #include <stdlib.h>
       2  #include <stddef.h>
       3  #include <altivec.h>
       4  
       5  #ifndef RTYPE
       6  #define RTYPE TYPE
       7  #endif
       8  
       9  #ifdef DO_TRACE
      10  #include <stdio.h>
      11  
      12  #define TRACE(STRING, NUM)						\
      13  do									\
      14    {									\
      15      fprintf (stderr, "%s: %2d\n", STRING, (int) NUM);			\
      16      fflush (stderr);							\
      17    }									\
      18  while (0)
      19  
      20  #ifndef FAIL_FORMAT
      21  #define FAIL_FORMAT "%ld"
      22  #define FAIL_CAST(X) ((long)(X))
      23  #endif
      24  
      25  #define FAIL(EXP, GOT)							 \
      26  do									 \
      27    {									 \
      28      fprintf (stderr, "Expected: " FAIL_FORMAT ", got " FAIL_FORMAT "\n", \
      29  	     FAIL_CAST (EXP), FAIL_CAST (GOT));				 \
      30      fflush (stderr);							 \
      31      abort ();								 \
      32    }									 \
      33  while (0)
      34  
      35  #else
      36  #define TRACE(STRING, NUM)
      37  #define FAIL(EXP, GOT) abort ()
      38  #endif
      39  
      40  static void
      41  check (RTYPE, RTYPE) __attribute__((__noinline__));
      42  
      43  static vector TYPE
      44  deoptimize (vector TYPE) __attribute__((__noinline__));
      45  
      46  static vector TYPE
      47  *deoptimize_ptr (vector TYPE *)	__attribute__((__noinline__));
      48  
      49  static void
      50  check (RTYPE expected, RTYPE got)
      51  {
      52    if (expected != got)
      53      FAIL (expected, got);
      54  }
      55  
      56  static vector TYPE
      57  deoptimize (vector TYPE a)
      58  {
      59    __asm__ (" # %x0" : "+v" (a));
      60    return a;
      61  }
      62  
      63  static vector TYPE *
      64  deoptimize_ptr (vector TYPE *p)
      65  {
      66    __asm__ (" # %0" : "+r" (p));
      67    return p;
      68  }
      69  
      70  
      71  RTYPE
      72  get_auto_0 (vector TYPE a)
      73  {
      74    TRACE ("get_auto_", 0);
      75    return (RTYPE) vec_extract (a, 0);
      76  }
      77  
      78  RTYPE
      79  get_auto_1 (vector TYPE a)
      80  {
      81    TRACE ("get_auto_", 1);
      82    return (RTYPE) vec_extract (a, 1);
      83  }
      84  
      85  #if ELEMENTS >= 4
      86  RTYPE
      87  get_auto_2 (vector TYPE a)
      88  {
      89    return (RTYPE) vec_extract (a, 2);
      90  }
      91  
      92  RTYPE
      93  get_auto_3 (vector TYPE a)
      94  {
      95    return (RTYPE) vec_extract (a, 3);
      96  }
      97  
      98  #if ELEMENTS >= 8
      99  RTYPE
     100  get_auto_4 (vector TYPE a)
     101  {
     102    return (RTYPE) vec_extract (a, 4);
     103  }
     104  
     105  RTYPE
     106  get_auto_5 (vector TYPE a)
     107  {
     108    return (RTYPE) vec_extract (a, 5);
     109  }
     110  
     111  RTYPE
     112  get_auto_6 (vector TYPE a)
     113  {
     114    return (RTYPE) vec_extract (a, 6);
     115  }
     116  
     117  RTYPE
     118  get_auto_7 (vector TYPE a)
     119  {
     120    return (RTYPE) vec_extract (a, 7);
     121  }
     122  
     123  #if ELEMENTS >= 16
     124  RTYPE
     125  get_auto_8 (vector TYPE a)
     126  {
     127    return (RTYPE) vec_extract (a, 8);
     128  }
     129  
     130  RTYPE
     131  get_auto_9 (vector TYPE a)
     132  {
     133    return (RTYPE) vec_extract (a, 9);
     134  }
     135  
     136  RTYPE
     137  get_auto_10 (vector TYPE a)
     138  {
     139    return (RTYPE) vec_extract (a, 10);
     140  }
     141  
     142  RTYPE
     143  get_auto_11 (vector TYPE a)
     144  {
     145    return (RTYPE) vec_extract (a, 11);
     146  }
     147  
     148  RTYPE
     149  get_auto_12 (vector TYPE a)
     150  {
     151    return (RTYPE) vec_extract (a, 12);
     152  }
     153  
     154  RTYPE
     155  get_auto_13 (vector TYPE a)
     156  {
     157    return (RTYPE) vec_extract (a, 13);
     158  }
     159  
     160  RTYPE
     161  get_auto_14 (vector TYPE a)
     162  {
     163    return (RTYPE) vec_extract (a, 14);
     164  }
     165  
     166  RTYPE
     167  get_auto_15 (vector TYPE a)
     168  {
     169    return (RTYPE) vec_extract (a, 15);
     170  }
     171  
     172  #endif
     173  #endif
     174  #endif
     175  
     176  
     177  /* Tests for the normal case of vec_extract where the vector is in a register
     178     and returning the result in a register as a return value.  */
     179  #ifdef DISABLE_INLINE_OF_GET_AUTO_N
     180  __attribute__ ((__noinline__))
     181  #else
     182  /* gcc issues warning: always_inline function might not be inlinable
     183  
     184     __attribute__ ((__always_inline__))
     185  */
     186  #endif
     187  RTYPE
     188  get_auto_n (vector TYPE a, ssize_t n)
     189  {
     190    return (RTYPE) vec_extract (a, n);
     191  }
     192  
     193  typedef RTYPE (*auto_func_type) (vector TYPE);
     194  
     195  static auto_func_type get_auto_const[] = {
     196    get_auto_0,
     197    get_auto_1,
     198  #if ELEMENTS >= 4
     199    get_auto_2,
     200    get_auto_3,
     201  #if ELEMENTS >= 8
     202    get_auto_4,
     203    get_auto_5,
     204    get_auto_6,
     205    get_auto_7,
     206  #if ELEMENTS >= 16
     207    get_auto_8,
     208    get_auto_9,
     209    get_auto_10,
     210    get_auto_11,
     211    get_auto_12,
     212    get_auto_13,
     213    get_auto_14,
     214    get_auto_15,
     215  #endif
     216  #endif
     217  #endif
     218  };
     219  
     220  extern void do_auto (vector TYPE a) __attribute__((__noinline__));
     221  
     222  void
     223  do_auto (vector TYPE a)
     224  {
     225    size_t i;
     226  
     227    for (i = 1; i < 40; i += 3)
     228      {
     229        TRACE ("do_auto, i: ", i);
     230        TRACE ("  get_auto_const[i] returns: ",
     231  	     (*get_auto_const [i % ELEMENTS]) (a));
     232        TRACE ("  get_auto_n returns", get_auto_n (a, i));
     233        check (get_auto_n (a, i), (*get_auto_const [i % ELEMENTS]) (a));
     234      }
     235  }
     236  
     237  
     238  
     239  /* Main program to test all of the possibilities.  */
     240  int
     241  main (void)
     242  {
     243    size_t i;
     244    vector TYPE x = INITIAL;
     245    vector TYPE *p, *p2, a, y;
     246    vector TYPE z[2];
     247  
     248    a = deoptimize (x);
     249  
     250    do_auto (a);
     251  
     252    return 0;
     253  }