(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
powerpc/
vsx-builtin-7.c
       1  /* { dg-do compile { target { powerpc*-*-* } } } */
       2  /* { dg-skip-if "" { powerpc*-*-darwin* } } */
       3  /* { dg-require-effective-target powerpc_vsx_ok } */
       4  /* { dg-options "-O2 -mdejagnu-cpu=power7 -fno-inline-functions" } */
       5  
       6  /* Test simple extract/insert/slat operations.  Make sure all types are
       7     supported with various options.  */
       8  
       9  #include <altivec.h>
      10  int c0 = 0;
      11  int c1 = 1;
      12  int c3 = 3;
      13  int c7 = 7;
      14  int c15 = 15;
      15  
      16  double extract_df_0_reg (vector double p) { return vec_extract (p, c0); }
      17  double extract_df_1_reg (vector double p) { return vec_extract (p, c1); }
      18  double extract_df_n_reg (vector double p, int n) { return vec_extract (p, n); }
      19  
      20  double extract_df_0_mem (vector double *p) { return vec_extract (*p, c0); }
      21  double extract_df_1_mem (vector double *p) { return vec_extract (*p, c1); }
      22  double extract_df_n_mem (vector double *p, int n) { return vec_extract (*p, n); }
      23  
      24  vector double insert_df_0 (vector double p, double x) { return vec_insert (x, p, c0); }
      25  vector double insert_df_1 (vector double p, double x) { return vec_insert (x, p, c1); }
      26  vector double insert_df_n (vector double p, double x, int n) { return vec_insert (x, p, n); }
      27  
      28  vector double splat_df_reg (double x) { return vec_splats (x); }
      29  vector double splat_df_mem (double *x) { return vec_splats (*x); }
      30  
      31  #ifdef _ARCH_PPC64
      32  #define ll long
      33  #else
      34  #define ll long long
      35  #endif
      36  
      37  ll extract_di_0_reg (vector ll p) { return vec_extract (p, c0); }
      38  ll extract_di_1_reg (vector ll p) { return vec_extract (p, c1); }
      39  ll extract_di_n_reg (vector ll p, int n) { return vec_extract (p, n); }
      40  
      41  ll extract_di_0_mem (vector ll *p) { return vec_extract (*p, c0); }
      42  ll extract_di_1_mem (vector ll *p) { return vec_extract (*p, c1); }
      43  ll extract_di_n_mem (vector ll *p, int n) { return vec_extract (*p, n); }
      44  
      45  vector ll insert_di_0 (vector ll p, ll x) { return vec_insert (x, p, c0); }
      46  vector ll insert_di_1 (vector ll p, ll x) { return vec_insert (x, p, c1); }
      47  vector ll insert_di_n (vector ll p, ll x, int n) { return vec_insert (x, p, n); }
      48  vector ll insert_di_0_v2 (vector ll int p, ll int x) { return vec_insert (x, p, c0); }
      49  vector unsigned ll insert_di_0_v3 (vector unsigned ll int p, unsigned ll int x) { return vec_insert (x, p, c0); }
      50  
      51  vector ll splat_di_reg (ll x) { return vec_splats (x); }
      52  vector ll splat_di_mem (ll *x) { return vec_splats (*x); }
      53  
      54  float extract_sf_0_reg (vector float p) { return vec_extract (p, c0); }
      55  float extract_sf_3_reg (vector float p) { return vec_extract (p, c3); }
      56  float extract_sf_n_reg (vector float p, int n) { return vec_extract (p, n); }
      57  
      58  float extract_sf_0_mem (vector float *p) { return vec_extract (*p, c0); }
      59  float extract_sf_3_mem (vector float *p) { return vec_extract (*p, c3); }
      60  float extract_sf_n_mem (vector float *p, int n) { return vec_extract (*p, n); }
      61  
      62  vector float insert_sf_0 (vector float p, float x) { return vec_insert (x, p, c0); }
      63  vector float insert_sf_3 (vector float p, float x) { return vec_insert (x, p, c3); }
      64  vector float insert_sf_n (vector float p, float x, int n) { return vec_insert (x, p, n); }
      65  
      66  vector float splat_sf_reg (float x) { return vec_splats (x); }
      67  vector float splat_sf_mem (float *x) { return vec_splats (*x); }
      68  
      69  int extract_si_0_reg (vector int p) { return vec_extract (p, c0); }
      70  int extract_si_3_reg (vector int p) { return vec_extract (p, c3); }
      71  int extract_si_n_reg (vector int p, int n) { return vec_extract (p, n); }
      72  
      73  int extract_si_0_mem (vector int *p) { return vec_extract (*p, c0); }
      74  int extract_si_3_mem (vector int *p) { return vec_extract (*p, c3); }
      75  int extract_si_n_mem (vector int *p, int n) { return vec_extract (*p, n); }
      76  
      77  vector int insert_si_0 (vector int p, int x) { return vec_insert (x, p, c0); }
      78  vector int insert_si_3 (vector int p, int x) { return vec_insert (x, p, c3); }
      79  vector int insert_si_n (vector int p, int x, int n) { return vec_insert (x, p, n); }
      80  
      81  vector int splat_si_reg (int x) { return vec_splats (x); }
      82  vector int splat_si_mem (int *x) { return vec_splats (*x); }
      83  
      84  unsigned int extract_usi_0_reg (vector unsigned int p) { return vec_extract (p, c0); }
      85  unsigned int extract_usi_3_reg (vector unsigned int p) { return vec_extract (p, c3); }
      86  unsigned int extract_usi_n_reg (vector unsigned int p, int n) { return vec_extract (p, n); }
      87  
      88  unsigned int extract_usi_0_mem (vector unsigned int *p) { return vec_extract (*p, c0); }
      89  unsigned int extract_usi_3_mem (vector unsigned int *p) { return vec_extract (*p, c3); }
      90  unsigned int extract_usi_n_mem (vector unsigned int *p, int n) { return vec_extract (*p, n); }
      91  
      92  vector unsigned int insert_usi_0 (vector unsigned int p, unsigned int x) { return vec_insert (x, p, c0); }
      93  vector unsigned int insert_usi_3 (vector unsigned int p, unsigned int x) { return vec_insert (x, p, c3); }
      94  vector unsigned int insert_usi_n (vector unsigned int p, unsigned int x, int n) { return vec_insert (x, p, n); }
      95  
      96  vector unsigned int splat_usi_reg (unsigned int x) { return vec_splats (x); }
      97  vector unsigned int splat_usi_mem (unsigned int *x) { return vec_splats (*x); }
      98  
      99  short extract_hi_0_reg (vector short p) { return vec_extract (p, c0); }
     100  short extract_hi_7_reg (vector short p) { return vec_extract (p, c7); }
     101  short extract_hi_n_reg (vector short p, int n) { return vec_extract (p, n); }
     102  
     103  short extract_hi_0_mem (vector short *p) { return vec_extract (*p, c0); }
     104  short extract_hi_7_mem (vector short *p) { return vec_extract (*p, c7); }
     105  short extract_hi_n_mem (vector short *p, int n) { return vec_extract (*p, n); }
     106  
     107  vector short insert_hi_0 (vector short p, short x) { return vec_insert (x, p, c0); }
     108  vector short insert_hi_7 (vector short p, short x) { return vec_insert (x, p, c7); }
     109  vector short insert_hi_n (vector short p, short x, int n) { return vec_insert (x, p, n); }
     110  
     111  vector short splat_hi_reg (short x) { return vec_splats (x); }
     112  vector short splat_hi_mem (short *x) { return vec_splats (*x); }
     113  
     114  unsigned short extract_uhi_0_reg (vector unsigned short p) { return vec_extract (p, c0); }
     115  unsigned short extract_uhi_7_reg (vector unsigned short p) { return vec_extract (p, c7); }
     116  unsigned short extract_uhi_n_reg (vector unsigned short p, int n) { return vec_extract (p, n); }
     117  
     118  unsigned short extract_uhi_0_mem (vector unsigned short *p) { return vec_extract (*p, c0); }
     119  unsigned short extract_uhi_7_mem (vector unsigned short *p) { return vec_extract (*p, c7); }
     120  unsigned short extract_uhi_n_mem (vector unsigned short *p, int n) { return vec_extract (*p, n); }
     121  
     122  vector unsigned short insert_uhi_0 (vector unsigned short p, unsigned short x) { return vec_insert (x, p, c0); }
     123  vector unsigned short insert_uhi_7 (vector unsigned short p, unsigned short x) { return vec_insert (x, p, c7); }
     124  vector unsigned short insert_uhi_n (vector unsigned short p, unsigned short x, int n) { return vec_insert (x, p, n); }
     125  
     126  vector unsigned short splat_uhi_reg (unsigned short x) { return vec_splats (x); }
     127  vector unsigned short splat_uhi_mem (unsigned short *x) { return vec_splats (*x); }
     128  
     129  signed char extract_qi_0_reg (vector signed char p) { return vec_extract (p, c0); }
     130  unsigned char extract_uqi_0_reg (vector unsigned char p) { return vec_extract (p, c0); }
     131  signed char extract_qi_1_reg5 (vector signed char p) { return vec_extract (p, c15); }
     132  signed char extract_qi_n_reg (vector signed char p, int n) { return vec_extract (p, n); }
     133  
     134  signed char extract_qi_0_mem (vector signed char *p) { return vec_extract (*p, c0); }
     135  signed char extract_qi_1_mem5 (vector signed char *p) { return vec_extract (*p, c15); }
     136  signed char extract_qi_n_mem (vector signed char *p, int n) { return vec_extract (*p, n); }
     137  
     138  vector signed char insert_qi_0 (vector signed char p, signed char x) { return vec_insert (x, p, c0); }
     139  vector signed char insert_qi_15 (vector signed char p, signed char x) { return vec_insert (x, p, c15); }
     140  vector signed char insert_qi_n (vector signed char p, signed char x, int n) { return vec_insert (x, p, n); }
     141  
     142  vector signed char splat_qi_reg (signed char x) { return vec_splats (x); }
     143  vector signed char splat_qi_mem (signed char *x) { return vec_splats (*x); }
     144  
     145  unsigned char extract_uqi_1_reg5 (vector unsigned char p) { return vec_extract (p, c15); }
     146  unsigned char extract_uqi_n_reg (vector unsigned char p, int n) { return vec_extract (p, n); }
     147  
     148  unsigned char extract_uqi_0_mem (vector unsigned char *p) { return vec_extract (*p, c0); }
     149  unsigned char extract_uqi_1_mem5 (vector unsigned char *p) { return vec_extract (*p, c15); }
     150  unsigned char extract_uqi_n_mem (vector unsigned char *p, int n) { return vec_extract (*p, n); }
     151  
     152  vector unsigned char insert_uqi_0 (vector unsigned char p, unsigned char x) { return vec_insert (x, p, c0); }
     153  vector unsigned char insert_uqi_15 (vector unsigned char p, unsigned char x) { return vec_insert (x, p, c15); }
     154  vector unsigned char insert_uqi_n (vector unsigned char p, unsigned char x, int n) { return vec_insert (x, p, n); }
     155  
     156  vector unsigned char splat_uqi_reg (unsigned char x) { return vec_splats (x); }
     157  vector unsigned char splat_uqi_mem (unsigned char *x) { return vec_splats (*x); }
     158  
     159  vector signed char splat_sc_s8 () { return vec_splat_s8 (2); }
     160  vector unsigned char splat_uc_u8 () { return vec_splat_u8 (3); }
     161  
     162  vector signed short int splat_ssi_s16() { return vec_splat_s16 (4); }
     163  vector unsigned short int splat_usi_s16() { return vec_splat_u16 (5); }
     164  
     165  vector signed int splat_si_s32() { return vec_splat_s32 (6); }
     166  vector unsigned int splat_ui_u32() { return vec_splat_u32 (7); }
     167  
     168  vector signed long long splat_sll (signed long long x)
     169    { return vec_splats (x); }
     170  
     171  vector unsigned long long splat_uc (unsigned long long x)
     172    { return vec_splats (x); }
     173  
     174  #ifdef __SIZEOF_INT128__
     175  /* Note, int128 not supported on 32-bit platforms.  */
     176  vector signed __int128 splat_int128 (signed __int128 x) { return vec_splats (x); }
     177  vector unsigned __int128 splat_uint128 (unsigned __int128 x) { return vec_splats (x); }
     178  #endif
     179  
     180  /* Expected results:
     181     vec_extract                       rldic
     182     vec_insert                        rldicr
     183     vec_splats                        xxspltd detected as xxpermdi
     184     vec_splat_s8                      vspltisb
     185     vec_splat_u8                      vspltisb
     186     vec_splat_s16                     vspltish
     187     vec_splat_u16                     vspltish
     188     vec_splat_s32                     vspltisw
     189     vec_splat_u32                     vspltisw
     190     return 128 vec_splats             vspltisw
     191   */
     192  
     193  /* { dg-final { scan-assembler-times {\mrldic\M} 0  { target { be && ilp32 } } } } */
     194  /* { dg-final { scan-assembler-times {\mrldic\M} 65 { target { be && lp64 } } } } */
     195  /* { dg-final { scan-assembler-times {\mrldic\M} 65 { target le } } } */
     196  /* { dg-final { scan-assembler-times "xxpermdi" 33 { target be } } } */
     197  /* { dg-final { scan-assembler-times "xxpermdi" 35 { target le } } } */
     198  /* { dg-final { scan-assembler-times "vspltisb" 2 } } */
     199  /* { dg-final { scan-assembler-times "vspltish" 2 } } */
     200  /* { dg-final { scan-assembler-times "vspltisw" 2 { target be } } } */
     201  /* { dg-final { scan-assembler-times "vspltisw" 23 { target le } } } */