1  /* { dg-do compile } */
       2  /* { dg-options "-march=rv32gcv -mabi=ilp32 -fno-tree-vectorize" } */
       3  
       4  #include "riscv_vector.h"
       5  
       6  void f (int8_t * restrict in, int8_t * restrict out, int n)
       7  {
       8    switch (n)
       9    {
      10    case 0:{
      11      vbool64_t v = *(vbool64_t*)(in + 500);
      12      *(vbool64_t*)(out + 500) = v;
      13      break;
      14    }
      15    case 1:{
      16      vbool64_t v = *(vbool64_t*)(in + 500);
      17      *(vbool64_t*)(out + 500) = v;
      18      break;
      19    }
      20    default:{
      21      vbool64_t v = *(vbool64_t*)(in + 700);
      22      *(vbool64_t*)(out + 700) = v;
      23      break;
      24    }
      25    }
      26  
      27    for (int i = 0 ; i < n * n; i++)
      28      out[i] = out[i] + out[i];
      29    
      30    for (int i = 0 ; i < n * n * n; i++)
      31      out[i] = out[i] * out[i];
      32  
      33    for (int i = 0 ; i < n * n * n * n; i++)
      34      out[i] = out[i] * out[i];
      35    
      36    for (int i = 0 ; i < n * n * n * n; i++) {
      37      vbool64_t v = *(vbool64_t*)(in + 900 + i);
      38      *(vbool64_t*)(out + 900 + i) = v;
      39    }
      40  }
      41  
      42  void f2 (int8_t * restrict in, int8_t * restrict out, int n)
      43  {
      44    switch (n)
      45    {
      46    case 0:{
      47      vbool32_t v = *(vbool32_t*)(in + 500);
      48      *(vbool32_t*)(out + 500) = v;
      49      break;
      50    }
      51    case 1:{
      52      vbool32_t v = *(vbool32_t*)(in + 500);
      53      *(vbool32_t*)(out + 500) = v;
      54      break;
      55    }
      56    default:{
      57      vbool32_t v = *(vbool32_t*)(in + 700);
      58      *(vbool32_t*)(out + 700) = v;
      59      break;
      60    }
      61    }
      62  
      63    for (int i = 0 ; i < n * n; i++)
      64      out[i] = out[i] + out[i];
      65    
      66    for (int i = 0 ; i < n * n * n; i++)
      67      out[i] = out[i] * out[i];
      68  
      69    for (int i = 0 ; i < n * n * n * n; i++)
      70      out[i] = out[i] * out[i];
      71    
      72    for (int i = 0 ; i < n * n * n * n; i++) {
      73      vbool32_t v = *(vbool32_t*)(in + 900 + i);
      74      *(vbool32_t*)(out + 900 + i) = v;
      75    }
      76  }
      77  
      78  void f3 (int8_t * restrict in, int8_t * restrict out, int n)
      79  {
      80    switch (n)
      81    {
      82    case 0:{
      83      vbool16_t v = *(vbool16_t*)(in + 500);
      84      *(vbool16_t*)(out + 500) = v;
      85      break;
      86    }
      87    case 1:{
      88      vbool16_t v = *(vbool16_t*)(in + 500);
      89      *(vbool16_t*)(out + 500) = v;
      90      break;
      91    }
      92    default:{
      93      vbool16_t v = *(vbool16_t*)(in + 700);
      94      *(vbool16_t*)(out + 700) = v;
      95      break;
      96    }
      97    }
      98  
      99    for (int i = 0 ; i < n * n; i++)
     100      out[i] = out[i] + out[i];
     101    
     102    for (int i = 0 ; i < n * n * n; i++)
     103      out[i] = out[i] * out[i];
     104  
     105    for (int i = 0 ; i < n * n * n * n; i++)
     106      out[i] = out[i] * out[i];
     107    
     108    for (int i = 0 ; i < n * n * n * n; i++) {
     109      vbool16_t v = *(vbool16_t*)(in + 900 + i);
     110      *(vbool16_t*)(out + 900 + i) = v;
     111    }
     112  }
     113  
     114  void f4 (int8_t * restrict in, int8_t * restrict out, int n)
     115  {
     116    switch (n)
     117    {
     118    case 0:{
     119      vbool8_t v = *(vbool8_t*)(in + 500);
     120      *(vbool8_t*)(out + 500) = v;
     121      break;
     122    }
     123    case 1:{
     124      vbool8_t v = *(vbool8_t*)(in + 500);
     125      *(vbool8_t*)(out + 500) = v;
     126      break;
     127    }
     128    default:{
     129      vbool8_t v = *(vbool8_t*)(in + 700);
     130      *(vbool8_t*)(out + 700) = v;
     131      break;
     132    }
     133    }
     134  
     135    for (int i = 0 ; i < n * n; i++)
     136      out[i] = out[i] + out[i];
     137    
     138    for (int i = 0 ; i < n * n * n; i++)
     139      out[i] = out[i] * out[i];
     140  
     141    for (int i = 0 ; i < n * n * n * n; i++)
     142      out[i] = out[i] * out[i];
     143    
     144    for (int i = 0 ; i < n * n * n * n; i++) {
     145      vbool8_t v = *(vbool8_t*)(in + 900 + i);
     146      *(vbool8_t*)(out + 900 + i) = v;
     147    }
     148  }
     149  
     150  void f5 (int8_t * restrict in, int8_t * restrict out, int n)
     151  {
     152    switch (n)
     153    {
     154    case 0:{
     155      vbool4_t v = *(vbool4_t*)(in + 500);
     156      *(vbool4_t*)(out + 500) = v;
     157      break;
     158    }
     159    case 1:{
     160      vbool4_t v = *(vbool4_t*)(in + 500);
     161      *(vbool4_t*)(out + 500) = v;
     162      break;
     163    }
     164    default:{
     165      vbool4_t v = *(vbool4_t*)(in + 700);
     166      *(vbool4_t*)(out + 700) = v;
     167      break;
     168    }
     169    }
     170  
     171    for (int i = 0 ; i < n * n; i++)
     172      out[i] = out[i] + out[i];
     173    
     174    for (int i = 0 ; i < n * n * n; i++)
     175      out[i] = out[i] * out[i];
     176  
     177    for (int i = 0 ; i < n * n * n * n; i++)
     178      out[i] = out[i] * out[i];
     179    
     180    for (int i = 0 ; i < n * n * n * n; i++) {
     181      vbool4_t v = *(vbool4_t*)(in + 900 + i);
     182      *(vbool4_t*)(out + 900 + i) = v;
     183    }
     184  }
     185  
     186  void f6 (int8_t * restrict in, int8_t * restrict out, int n)
     187  {
     188    switch (n)
     189    {
     190    case 0:{
     191      vbool2_t v = *(vbool2_t*)(in + 500);
     192      *(vbool2_t*)(out + 500) = v;
     193      break;
     194    }
     195    case 1:{
     196      vbool2_t v = *(vbool2_t*)(in + 500);
     197      *(vbool2_t*)(out + 500) = v;
     198      break;
     199    }
     200    default:{
     201      vbool2_t v = *(vbool2_t*)(in + 700);
     202      *(vbool2_t*)(out + 700) = v;
     203      break;
     204    }
     205    }
     206  
     207    for (int i = 0 ; i < n * n; i++)
     208      out[i] = out[i] + out[i];
     209    
     210    for (int i = 0 ; i < n * n * n; i++)
     211      out[i] = out[i] * out[i];
     212  
     213    for (int i = 0 ; i < n * n * n * n; i++)
     214      out[i] = out[i] * out[i];
     215    
     216    for (int i = 0 ; i < n * n * n * n; i++) {
     217      vbool2_t v = *(vbool2_t*)(in + 900 + i);
     218      *(vbool2_t*)(out + 900 + i) = v;
     219    }
     220  }
     221  
     222  void f7 (int8_t * restrict in, int8_t * restrict out, int n)
     223  {
     224    switch (n)
     225    {
     226    case 0:{
     227      vbool1_t v = *(vbool1_t*)(in + 500);
     228      *(vbool1_t*)(out + 500) = v;
     229      break;
     230    }
     231    case 1:{
     232      vbool1_t v = *(vbool1_t*)(in + 500);
     233      *(vbool1_t*)(out + 500) = v;
     234      break;
     235    }
     236    default:{
     237      vbool1_t v = *(vbool1_t*)(in + 700);
     238      *(vbool1_t*)(out + 700) = v;
     239      break;
     240    }
     241    }
     242  
     243    for (int i = 0 ; i < n * n; i++)
     244      out[i] = out[i] + out[i];
     245    
     246    for (int i = 0 ; i < n * n * n; i++)
     247      out[i] = out[i] * out[i];
     248  
     249    for (int i = 0 ; i < n * n * n * n; i++)
     250      out[i] = out[i] * out[i];
     251    
     252    for (int i = 0 ; i < n * n * n * n; i++) {
     253      vbool1_t v = *(vbool1_t*)(in + 900 + i);
     254      *(vbool1_t*)(out + 900 + i) = v;
     255    }
     256  }
     257  
     258  /* { dg-final { scan-assembler-times {vsetvli\s+[a-x0-9]+,\s*zero,\s*e8,\s*mf8,\s*t[au],\s*m[au]} 3 { target { no-opts "-O0"  no-opts "-Os" no-opts "-Oz" no-opts "-funroll-loops" no-opts "-g" no-opts "-O1" no-opts "-O1" } } } } */
     259  /* { dg-final { scan-assembler-times {vsetvli\s+[a-x0-9]+,\s*zero,\s*e8,\s*mf4,\s*t[au],\s*m[au]} 3 { target { no-opts "-O0"  no-opts "-Os" no-opts "-Oz" no-opts "-funroll-loops" no-opts "-g" no-opts "-O1" no-opts "-O1" } } } } */
     260  /* { dg-final { scan-assembler-times {vsetvli\s+[a-x0-9]+,\s*zero,\s*e8,\s*mf2,\s*t[au],\s*m[au]} 3 { target { no-opts "-O0"  no-opts "-Os" no-opts "-Oz" no-opts "-funroll-loops" no-opts "-g" no-opts "-O1" no-opts "-O1" } } } } */
     261  /* { dg-final { scan-assembler-times {vsetvli\s+[a-x0-9]+,\s*zero,\s*e8,\s*m1,\s*t[au],\s*m[au]} 3 { target { no-opts "-O0"  no-opts "-Os" no-opts "-Oz" no-opts "-funroll-loops" no-opts "-g" no-opts "-O1" no-opts "-O1" } } } } */
     262  /* { dg-final { scan-assembler-times {vsetvli\s+[a-x0-9]+,\s*zero,\s*e8,\s*m2,\s*t[au],\s*m[au]} 3 { target { no-opts "-O0"  no-opts "-Os" no-opts "-Oz" no-opts "-funroll-loops" no-opts "-g" no-opts "-O1" no-opts "-O1" } } } } */
     263  /* { dg-final { scan-assembler-times {vsetvli\s+[a-x0-9]+,\s*zero,\s*e8,\s*m4,\s*t[au],\s*m[au]} 3 { target { no-opts "-O0"  no-opts "-Os" no-opts "-Oz" no-opts "-funroll-loops" no-opts "-g" no-opts "-O1" no-opts "-O1" } } } } */
     264  /* { dg-final { scan-assembler-times {vsetvli\s+[a-x0-9]+,\s*zero,\s*e8,\s*m8,\s*t[au],\s*m[au]} 3 { target { no-opts "-O0"  no-opts "-Os" no-opts "-Oz" no-opts "-funroll-loops" no-opts "-g" no-opts "-O1" no-opts "-O1" } } } } */
     265  /* { dg-final { scan-assembler-times {add\ta[0-7],a[0-7],a[0-7]\s+\.L[0-9][0-9]\:\s+vlm\.v\s+(?:v[0-9]|v[1-2][0-9]|v3[0-1]),0\s*\([a-x0-9]+\)} 5 { target { no-opts "-O0"  no-opts "-Os" no-opts "-Oz" no-opts "-funroll-loops" no-opts "-g" no-opts "-O1" no-opts "-O1" } } } } */
     266  /* { dg-final { scan-assembler-times {add\ta[0-7],a[0-7],a[0-7]\s+\.L[0-9][0-9][0-9]\:\s+vlm\.v\s+(?:v[0-9]|v[1-2][0-9]|v3[0-1]),0\s*\([a-x0-9]+\)} 2 { target { no-opts "-O0"  no-opts "-Os" no-opts "-Oz" no-opts "-funroll-loops" no-opts "-g" no-opts "-O1" no-opts "-O1" } } } } */