(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
arm/
acle/
cde-errors.c
       1  /* Test the Custom Datapath Extension ACLE intrinsic.  */
       2  
       3  /* This file is to check we catch incorrect uses of the ACLE.  */
       4  
       5  /* { dg-do assemble } */
       6  /* { dg-require-effective-target arm_v8m_main_cde_ok } */
       7  /* { dg-add-options arm_v8m_main_cde } */
       8  /* { dg-additional-options "-save-temps" } */
       9  
      10  #include "arm_cde.h"
      11  
      12  /*
      13     These are the scalar intrinsics.
      14  uint32_t __arm_cx1(int coproc, uint32_t imm);
      15  uint32_t __arm_cx1a(int coproc, uint32_t acc, uint32_t imm);
      16  uint32_t __arm_cx2(int coproc, uint32_t n, uint32_t imm);
      17  uint32_t __arm_cx2a(int coproc, uint32_t acc, uint32_t n, uint32_t imm);
      18  uint32_t __arm_cx3(int coproc, uint32_t n, uint32_t m, uint32_t imm);
      19  uint32_t __arm_cx3a(int coproc, uint32_t acc, uint32_t n, uint32_t m, uint32_t imm);
      20  
      21  uint64_t __arm_cx1d(int coproc, uint32_t imm);
      22  uint64_t __arm_cx1da(int coproc, uint64_t acc, uint32_t imm);
      23  uint64_t __arm_cx2d(int coproc, uint32_t n, uint32_t imm);
      24  uint64_t __arm_cx2da(int coproc, uint64_t acc, uint32_t n, uint32_t imm);
      25  uint64_t __arm_cx3d(int coproc, uint32_t n, uint32_t m, uint32_t imm);
      26  uint64_t __arm_cx3da(int coproc, uint64_t acc, uint32_t n, uint32_t m, uint32_t imm);
      27  */
      28  
      29  /* Incorrect types as the constants.  */
      30  uint64_t test_cde (uint32_t n, uint32_t m)
      31  {
      32    uint64_t accum = 0;
      33  
      34    /* `coproc` not enabled.  */
      35    accum += __arm_cx1   (7,                        0); /* { dg-error {coprocessor 7 is not enabled with \+cdecp7} } */
      36    accum += __arm_cx1a  (7, (uint32_t)accum,       0); /* { dg-error {coprocessor 7 is not enabled with \+cdecp7} } */
      37    accum += __arm_cx2   (7, n,                     0); /* { dg-error {coprocessor 7 is not enabled with \+cdecp7} } */
      38    accum += __arm_cx2a  (7, (uint32_t)accum, n,    0); /* { dg-error {coprocessor 7 is not enabled with \+cdecp7} } */
      39    accum += __arm_cx3   (7, n, m,                  0); /* { dg-error {coprocessor 7 is not enabled with \+cdecp7} } */
      40    accum += __arm_cx3a  (7, (uint32_t)accum, n, m, 0); /* { dg-error {coprocessor 7 is not enabled with \+cdecp7} } */
      41  
      42    accum += __arm_cx1d  (7,                        0); /* { dg-error {coprocessor 7 is not enabled with \+cdecp7} } */
      43    accum += __arm_cx1da (7, accum,                 0); /* { dg-error {coprocessor 7 is not enabled with \+cdecp7} } */
      44    accum += __arm_cx2d  (7, n,                     0); /* { dg-error {coprocessor 7 is not enabled with \+cdecp7} } */
      45    accum += __arm_cx2da (7, accum, n,              0); /* { dg-error {coprocessor 7 is not enabled with \+cdecp7} } */
      46    accum += __arm_cx3d  (7, n, m,                  0); /* { dg-error {coprocessor 7 is not enabled with \+cdecp7} } */
      47    accum += __arm_cx3da (7, accum, n, m,           0); /* { dg-error {coprocessor 7 is not enabled with \+cdecp7} } */
      48  
      49    /* `coproc` out of range.  */
      50    accum += __arm_cx1   (8,                        0); /* { dg-error {coproc must be a constant immediate in range \[0-7\] enabled with .\+cdecp<N>.} } */
      51    accum += __arm_cx1a  (8, (uint32_t)accum,       0); /* { dg-error {coproc must be a constant immediate in range \[0-7\] enabled with .\+cdecp<N>.} } */
      52    accum += __arm_cx2   (8, n,                     0); /* { dg-error {coproc must be a constant immediate in range \[0-7\] enabled with .\+cdecp<N>.} } */
      53    accum += __arm_cx2a  (8, (uint32_t)accum, n,    0); /* { dg-error {coproc must be a constant immediate in range \[0-7\] enabled with .\+cdecp<N>.} } */
      54    accum += __arm_cx3   (8, n, m,                  0); /* { dg-error {coproc must be a constant immediate in range \[0-7\] enabled with .\+cdecp<N>.} } */
      55    accum += __arm_cx3a  (8, (uint32_t)accum, n, m, 0); /* { dg-error {coproc must be a constant immediate in range \[0-7\] enabled with .\+cdecp<N>.} } */
      56  
      57    accum += __arm_cx1d  (8,                        0); /* { dg-error {coproc must be a constant immediate in range \[0-7\] enabled with .\+cdecp<N>.} } */
      58    accum += __arm_cx1da (8, accum,                 0); /* { dg-error {coproc must be a constant immediate in range \[0-7\] enabled with .\+cdecp<N>.} } */
      59    accum += __arm_cx2d  (8, n,                     0); /* { dg-error {coproc must be a constant immediate in range \[0-7\] enabled with .\+cdecp<N>.} } */
      60    accum += __arm_cx2da (8, accum, n,              0); /* { dg-error {coproc must be a constant immediate in range \[0-7\] enabled with .\+cdecp<N>.} } */
      61    accum += __arm_cx3d  (8, n, m,                  0); /* { dg-error {coproc must be a constant immediate in range \[0-7\] enabled with .\+cdecp<N>.} } */
      62    accum += __arm_cx3da (8, accum, n, m,           0); /* { dg-error {coproc must be a constant immediate in range \[0-7\] enabled with .\+cdecp<N>.} } */
      63  
      64    /* `imm` out of range.  */
      65    accum += __arm_cx1   (0,                        8192); /* { dg-error {argument 2 to '__builtin_arm_cx1si' must be a constant immediate in range \[0-8191\]} } */
      66    accum += __arm_cx1a  (0, (uint32_t)accum,       8192); /* { dg-error {argument 3 to '__builtin_arm_cx1asi' must be a constant immediate in range \[0-8191\]} } */
      67    accum += __arm_cx2   (0, n,                     512);  /* { dg-error {argument 3 to '__builtin_arm_cx2si' must be a constant immediate in range \[0-511\]} } */
      68    accum += __arm_cx2a  (0, (uint32_t)accum, n,    512);  /* { dg-error {argument 4 to '__builtin_arm_cx2asi' must be a constant immediate in range \[0-511\]} } */
      69    accum += __arm_cx3   (0, n, m,                  64);   /* { dg-error {argument 4 to '__builtin_arm_cx3si' must be a constant immediate in range \[0-63\]} } */
      70    accum += __arm_cx3a  (0, (uint32_t)accum, n, m, 64);   /* { dg-error {argument 5 to '__builtin_arm_cx3asi' must be a constant immediate in range \[0-63\]} } */
      71  
      72    accum += __arm_cx1d  (0,                        8192); /* { dg-error {argument 2 to '__builtin_arm_cx1di' must be a constant immediate in range \[0-8191\]} } */
      73    accum += __arm_cx1da (0, accum,                 8192); /* { dg-error {argument 3 to '__builtin_arm_cx1adi' must be a constant immediate in range \[0-8191\]} } */
      74    accum += __arm_cx2d  (0, n,                     512);  /* { dg-error {argument 3 to '__builtin_arm_cx2di' must be a constant immediate in range \[0-511\]} } */
      75    accum += __arm_cx2da (0, accum, n,              512);  /* { dg-error {argument 4 to '__builtin_arm_cx2adi' must be a constant immediate in range \[0-511\]} } */
      76    accum += __arm_cx3d  (0, n, m,                  64);   /* { dg-error {argument 4 to '__builtin_arm_cx3di' must be a constant immediate in range \[0-63\]} } */
      77    accum += __arm_cx3da (0, accum, n, m,           64);   /* { dg-error {argument 5 to '__builtin_arm_cx3adi' must be a constant immediate in range \[0-63\]} } */
      78  
      79    /* `imm` must be an immediate.  */
      80    accum += __arm_cx1   (0,                        n);    /* { dg-error {argument 2 to '__builtin_arm_cx1si' must be a constant immediate in range \[0-8191\]} } */
      81    accum += __arm_cx1a  (0, (uint32_t)accum,       n);    /* { dg-error {argument 3 to '__builtin_arm_cx1asi' must be a constant immediate in range \[0-8191\]} } */
      82    accum += __arm_cx2   (0, n,                     n);    /* { dg-error {argument 3 to '__builtin_arm_cx2si' must be a constant immediate in range \[0-511\]} } */
      83    accum += __arm_cx2a  (0, (uint32_t)accum, n,    n);    /* { dg-error {argument 4 to '__builtin_arm_cx2asi' must be a constant immediate in range \[0-511\]} } */
      84    accum += __arm_cx3   (0, n, m,                  n);    /* { dg-error {argument 4 to '__builtin_arm_cx3si' must be a constant immediate in range \[0-63\]} } */
      85    accum += __arm_cx3a  (0, (uint32_t)accum, n, m, n);    /* { dg-error {argument 5 to '__builtin_arm_cx3asi' must be a constant immediate in range \[0-63\]} } */
      86  
      87    accum += __arm_cx1d  (0,                        n);    /* { dg-error {argument 2 to '__builtin_arm_cx1di' must be a constant immediate in range \[0-8191\]} } */
      88    accum += __arm_cx1da (0, accum,                 n);    /* { dg-error {argument 3 to '__builtin_arm_cx1adi' must be a constant immediate in range \[0-8191\]} } */
      89    accum += __arm_cx2d  (0, n,                     n);    /* { dg-error {argument 3 to '__builtin_arm_cx2di' must be a constant immediate in range \[0-511\]} } */
      90    accum += __arm_cx2da (0, accum, n,              n);    /* { dg-error {argument 4 to '__builtin_arm_cx2adi' must be a constant immediate in range \[0-511\]} } */
      91    accum += __arm_cx3d  (0, n, m,                  n);    /* { dg-error {argument 4 to '__builtin_arm_cx3di' must be a constant immediate in range \[0-63\]} } */
      92    accum += __arm_cx3da (0, accum, n, m,           n);    /* { dg-error {argument 5 to '__builtin_arm_cx3adi' must be a constant immediate in range \[0-63\]} } */
      93  
      94    /* `coproc` is not an immediate.  */
      95    accum += __arm_cx1   ((int)m,                        0); /* { dg-error {coproc must be a constant immediate in range \[0-7\] enabled with .\+cdecp<N>.} } */
      96    accum += __arm_cx1a  ((int)m, (uint32_t)accum,       0); /* { dg-error {coproc must be a constant immediate in range \[0-7\] enabled with .\+cdecp<N>.} } */
      97    accum += __arm_cx2   ((int)m, n,                     0); /* { dg-error {coproc must be a constant immediate in range \[0-7\] enabled with .\+cdecp<N>.} } */
      98    accum += __arm_cx2a  ((int)m, (uint32_t)accum, n,    0); /* { dg-error {coproc must be a constant immediate in range \[0-7\] enabled with .\+cdecp<N>.} } */
      99    accum += __arm_cx3   ((int)m, n, m,                  0); /* { dg-error {coproc must be a constant immediate in range \[0-7\] enabled with .\+cdecp<N>.} } */
     100    accum += __arm_cx3a  ((int)m, (uint32_t)accum, n, m, 0); /* { dg-error {coproc must be a constant immediate in range \[0-7\] enabled with .\+cdecp<N>.} } */
     101  
     102    accum += __arm_cx1d  ((int)m,                        0); /* { dg-error {coproc must be a constant immediate in range \[0-7\] enabled with .\+cdecp<N>.} } */
     103    accum += __arm_cx1da ((int)m, accum,                 0); /* { dg-error {coproc must be a constant immediate in range \[0-7\] enabled with .\+cdecp<N>.} } */
     104    accum += __arm_cx2d  ((int)m, n,                     0); /* { dg-error {coproc must be a constant immediate in range \[0-7\] enabled with .\+cdecp<N>.} } */
     105    accum += __arm_cx2da ((int)m, accum, n,              0); /* { dg-error {coproc must be a constant immediate in range \[0-7\] enabled with .\+cdecp<N>.} } */
     106    accum += __arm_cx3d  ((int)m, n, m,                  0); /* { dg-error {coproc must be a constant immediate in range \[0-7\] enabled with .\+cdecp<N>.} } */
     107    accum += __arm_cx3da ((int)m, accum, n, m,           0); /* { dg-error {coproc must be a constant immediate in range \[0-7\] enabled with .\+cdecp<N>.} } */
     108  
     109    return accum;
     110  }
     111