1  /* { dg-do compile } */
       2  /* { dg-options "-O3 -mcpu=cortex-a72+aes -dp" } */
       3  /* { dg-additional-options "-march=armv8-a+aes" { target { aarch64*-*-* } } }*/
       4  
       5  #include <arm_neon.h>
       6  
       7  #define AESD(r, v, key) (r = vaesdq_u8 ((v), (key)));
       8  #define AESIMC(r, i) (r = vaesimcq_u8 (i))
       9  
      10  const uint8x16_t zero = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
      11  
      12  uint8x16_t dummy;
      13  uint8x16_t a;
      14  uint8x16_t b;
      15  uint8x16_t c;
      16  uint8x16_t d;
      17  uint8x16_t x;
      18  uint8x16_t y;
      19  uint8x16_t k;
      20  
      21  void foo (void)
      22  {
      23    AESD (a, a, k);
      24    dummy = vaddq_u8 (dummy, dummy);
      25    dummy = vaddq_u8 (dummy, dummy);
      26    AESD (b, b, k);
      27    dummy = vaddq_u8 (dummy, dummy);
      28    dummy = vaddq_u8 (dummy, dummy);
      29    AESD (c, c, k);
      30    dummy = vaddq_u8 (dummy, dummy);
      31    dummy = vaddq_u8 (dummy, dummy);
      32    AESD (d, d, k);
      33    dummy = vaddq_u8 (dummy, dummy);
      34    dummy = vaddq_u8 (dummy, dummy);
      35  
      36    x = x ^ k;
      37    AESD (x, x, zero);
      38    dummy = vaddq_u8 (dummy, dummy);
      39    dummy = vaddq_u8 (dummy, dummy);
      40    y = y ^ k;
      41    AESD (y, y, zero);
      42    dummy = vaddq_u8 (dummy, dummy);
      43    dummy = vaddq_u8 (dummy, dummy);
      44  
      45    AESIMC (d, d);
      46    dummy = vaddq_u8 (dummy, dummy);
      47    dummy = vaddq_u8 (dummy, dummy);
      48    AESIMC (c, c);
      49    dummy = vaddq_u8 (dummy, dummy);
      50    dummy = vaddq_u8 (dummy, dummy);
      51    AESIMC (b, b);
      52    dummy = vaddq_u8 (dummy, dummy);
      53    dummy = vaddq_u8 (dummy, dummy);
      54    AESIMC (a, a);
      55    dummy = vaddq_u8 (dummy, dummy);
      56    dummy = vaddq_u8 (dummy, dummy);
      57  
      58    AESIMC (y, y);
      59    dummy = vaddq_u8 (dummy, dummy);
      60    dummy = vaddq_u8 (dummy, dummy);
      61    AESIMC (x, x);
      62  }
      63  
      64  /* { dg-final { scan-assembler-times "crypto_aesd_fused" 6 } } */
      65  /* { dg-final { scan-assembler-not "veor" } } */