(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
powerpc/
vsx_mask-move-runnable.c
       1  /* { dg-do run { target { power10_hw } } } */
       2  /* { dg-do link { target { ! power10_hw } } } */
       3  /* { dg-options "-mdejagnu-cpu=power10 -O2 -save-temps" } */
       4  /* { dg-require-effective-target power10_ok } */
       5  /* { dg-require-effective-target int128 } */
       6  
       7  /* Check that the expected 128-bit instructions are generated if the processor
       8     supports the 128-bit integer instructions. */
       9  /* { dg-final { scan-assembler-times {\mmtvsrbm\M} 1 } } */
      10  /* { dg-final { scan-assembler-times {\mmtvsrhm\M} 1 } } */
      11  /* { dg-final { scan-assembler-times {\mmtvsrwm\M} 1 } } */
      12  /* { dg-final { scan-assembler-times {\mmtvsrdm\M} 1 } } */
      13  /* { dg-final { scan-assembler-times {\mmtvsrqm\M} 1 } } */
      14  /* { dg-final { scan-assembler-times {\mmtvsrbmi\M} 2 } } */
      15  
      16  #define DEBUG 0
      17  
      18  #if DEBUG
      19  #include <stdio.h>
      20  #include <stdlib.h>
      21  #endif
      22  #include <altivec.h>
      23  
      24  void abort (void);
      25  
      26  int main ()
      27  {
      28    int i, num_elements;
      29    unsigned long long arg1;
      30    
      31    vector unsigned char  vbc_result_bi, vbc_expected_result_bi;
      32    vector unsigned short vbc_result_hi, vbc_expected_result_hi;
      33    vector unsigned int  vbc_result_wi, vbc_expected_result_wi;
      34    vector unsigned long long vbc_result_di, vbc_expected_result_di;
      35    vector __uint128_t vbc_result_qi, vbc_expected_result_qi;
      36  
      37    unsigned int result_wi, expected_result_wi;
      38    unsigned long long result, expected_result;
      39    const unsigned char mp=1;
      40    vector unsigned char vbc_bi_src;
      41    vector unsigned short vbc_hi_src;
      42    vector unsigned int vbc_wi_src;
      43    vector unsigned long long vbc_di_src;
      44    vector __uint128_t vbc_qi_src;
      45    
      46   /* mtvsrbmi */
      47    num_elements = 16;
      48    
      49    for (i = 0; i<num_elements; i++)
      50      vbc_expected_result_bi[i] = 0x0;
      51  
      52    vbc_expected_result_bi[0] = 0xFF;
      53    vbc_expected_result_bi[2] = 0xFF;
      54  
      55    vbc_result_bi = vec_genbm(5);
      56    
      57    for (i = 0; i<num_elements; i++) {
      58      if (vbc_result_bi[i] != vbc_expected_result_bi[i]) {
      59  #if DEBUG
      60        printf("ERROR: vec_genbm(const 5) ");
      61        printf("element %d equals 0x%x does not match expected_result = 0x%x",
      62  	     i, vbc_result_bi[i], vbc_expected_result_bi[i]);
      63        printf("\n\n");
      64  #else
      65      abort();
      66  #endif
      67      }
      68    }
      69  
      70    /* mtvsrbm */
      71    num_elements = 16;
      72    /* -O2 should generate mtvsrbmi as argument will fit in 6-bit field. */
      73    arg1 = 3;
      74    
      75    for (i = 0; i<num_elements; i++)
      76      vbc_expected_result_bi[i] = 0x0;
      77  
      78    vbc_expected_result_bi[1] = 0xFF;
      79    vbc_expected_result_bi[0] = 0xFF;
      80  
      81    vbc_result_bi = vec_genbm(arg1);
      82    
      83    for (i = 0; i<num_elements; i++) {
      84      if (vbc_result_bi[i] != vbc_expected_result_bi[i]) {
      85  #if DEBUG
      86        printf("ERROR: vec_genbm(%d) ", arg1);
      87        printf("element %d equals 0x%x does not match expected_result = 0x%x",
      88  	     i, vbc_result_bi[i], vbc_expected_result_bi[i]);
      89        printf("\n\n");
      90  #else
      91      abort();
      92  #endif
      93      }
      94    }
      95  
      96    num_elements = 16;
      97    /* Should generate mtvsrbm as argument will not fit in 6-bit field. */
      98    arg1 = 0xEA;   // 234 decimal
      99    
     100    for (i = 0; i<num_elements; i++)
     101      vbc_expected_result_bi[i] = 0x0;
     102  
     103    vbc_expected_result_bi[7] = 0xFF;
     104    vbc_expected_result_bi[6] = 0xFF;
     105    vbc_expected_result_bi[5] = 0xFF;
     106    vbc_expected_result_bi[3] = 0xFF;
     107    vbc_expected_result_bi[1] = 0xFF;
     108  
     109    vbc_result_bi = vec_genbm(arg1);
     110    
     111    for (i = 0; i<num_elements; i++) {
     112      if (vbc_result_bi[i] != vbc_expected_result_bi[i]) {
     113  #if DEBUG
     114        printf("ERROR: vec_genbm(%d) ", arg1);
     115        printf("element %d equals 0x%x does not match expected_result = 0x%x",
     116  	     i, vbc_result_bi[i], vbc_expected_result_bi[i]);
     117        printf("\n\n");
     118  #else
     119      abort();
     120  #endif
     121      }
     122    }
     123  
     124    /* mtvsrhm */
     125    num_elements = 8;
     126    arg1 = 5;
     127    
     128    for (i = 0; i<num_elements; i++)
     129      vbc_expected_result_hi[i] = 0x0;
     130  
     131    vbc_expected_result_hi[2] = 0xFFFF;
     132    vbc_expected_result_hi[0] = 0xFFFF;
     133  
     134    vbc_result_hi = vec_genhm(arg1);
     135    
     136    for (i = 0; i<num_elements; i++) {
     137      if (vbc_result_hi[i] != vbc_expected_result_hi[i]) {
     138  #if DEBUG
     139        printf("ERROR: vec_genhm(%d) ", arg1);
     140        printf("element %d equals 0x%x does not match expected_result = 0x%x",
     141  	     i, vbc_result_hi[i], vbc_expected_result_hi[i]);
     142        printf("\n\n");
     143  #else
     144      abort();
     145  #endif
     146      }
     147    }
     148  
     149    /* mtvsrwm */
     150    num_elements = 4;
     151    arg1 = 7;
     152    
     153    for (i = 0; i<num_elements; i++)
     154      vbc_expected_result_wi[i] = 0x0;
     155  
     156    vbc_expected_result_wi[2] = 0xFFFFFFFF;
     157    vbc_expected_result_wi[1] = 0xFFFFFFFF;
     158    vbc_expected_result_wi[0] = 0xFFFFFFFF;
     159  
     160    vbc_result_wi = vec_genwm(arg1);
     161    
     162    for (i = 0; i<num_elements; i++) {
     163      if (vbc_result_wi[i] != vbc_expected_result_wi[i]) {
     164  #if DEBUG
     165        printf("ERROR: vec_genwm(%d) ", arg1);
     166        printf("element %d equals 0x%x does not match expected_result = 0x%x",
     167  	     i, vbc_result_wi[i], vbc_expected_result_wi[i]);
     168        printf("\n\n");
     169  #else
     170      abort();
     171  #endif
     172      }
     173    }
     174  
     175    /* mtvsrdm */
     176    num_elements = 2;
     177    arg1 = 1;
     178    
     179    for (i = 0; i<num_elements; i++)
     180      vbc_expected_result_di[i] = 0x0;
     181  
     182    vbc_expected_result_di[1] = 0x0;
     183    vbc_expected_result_di[0] = 0xFFFFFFFFFFFFFFFF;
     184  
     185    vbc_result_di = vec_gendm(arg1);
     186    
     187    for (i = 0; i<num_elements; i++) {
     188      if (vbc_result_di[i] != vbc_expected_result_di[i]) {
     189  #if DEBUG
     190        printf("ERROR: vec_gendm(%d) ", arg1);
     191        printf("element %d equals 0x%llx does not match expected_result = ",
     192  	     i, vbc_result_di[i]);
     193        printf("0x%llx\n\n", vbc_expected_result_di[i]);
     194  #else
     195      abort();
     196  #endif
     197      }
     198    }
     199  
     200    /* mtvsrqm */
     201    num_elements = 1;
     202    arg1 = 1;
     203    
     204    for (i = 0; i<num_elements; i++)
     205      vbc_expected_result_qi[i] = 0x0;
     206  
     207    vbc_expected_result_qi[0] = 0xFFFFFFFFFFFFFFFFULL;
     208    vbc_expected_result_qi[0] = (vbc_expected_result_qi[0] << 64)
     209      | 0xFFFFFFFFFFFFFFFFULL;
     210  
     211    vbc_result_qi = vec_genqm(arg1);
     212    
     213    for (i = 0; i<num_elements; i++) {
     214      if (vbc_result_qi[i] != vbc_expected_result_qi[i]) {
     215  #if DEBUG
     216        printf("ERROR: vec_genqm(%d) ", arg1);
     217        printf("element %d equals 0x%llx does not match expected_result = ",
     218  	     i, vbc_result_qi[i]);
     219        printf("0x%llx\n\n", vbc_expected_result_qi[i]);
     220  #else
     221      abort();
     222  #endif
     223      }
     224    }
     225  
     226    return 0;
     227  }