1  /* { dg-options "-O2 -fPIC" } */
       2  
       3  typedef struct test_struct
       4  {
       5      unsigned long long h[8];
       6      unsigned long long Nl,Nh;
       7      union {
       8          unsigned long long d[16];
       9          unsigned char p[(16*8)];
      10      } u;
      11      unsigned int num,md_len;
      12  } TEST_STRUCT;
      13  
      14  static const unsigned long long K512[12] = {
      15      0x428a2f98d728ae22,0x7137449123ef65cd,
      16      0xb5c0fbcfec4d3b2f,0xe9b5dba58189dbbc,
      17      0x3956c25bf348b538,0x59f111f1b605d019,
      18      0x923f82a4af194f9b,0xab1c5ed5da6d8118,
      19      0xd807aa98a3030242,0x12835b0145706fbe,
      20      0x243185be4ee4b28c,0x550c7dc3d5ffb4e2};
      21  
      22  #define ROTR(x,s)   (((x)>>s) | (x)<<(64-s))
      23  #define Sigma0(x)   (ROTR((x),28) ^ ROTR((x),34) ^ ROTR((x),39))
      24  #define Sigma1(x)   (ROTR((x),14) ^ ROTR((x),18) ^ ROTR((x),41))
      25  #define Ch(x,y,z)   (((x) & (y)) ^ ((~(x)) & (z)))
      26  #define Maj(x,y,z)  (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))
      27  
      28  #define ROUND_00_15(i,a,b,c,d,e,f,g,h)  do {    \
      29      T1 += h + Sigma1(e) + Ch(e,f,g) + K512[i];  \
      30      h = Sigma0(a) + Maj(a,b,c);         \
      31      d += T1;    h += T1;        } while (0)
      32  
      33  #define ROUND_16_80(i,a,b,c,d,e,f,g,h,X)    do {    \
      34      T1 = X[(i)&0x0f] += s0 + s1 + X[(i+9)&0x0f];    \
      35      ROUND_00_15(i,a,b,c,d,e,f,g,h);     } while (0)
      36  
      37  static void testfunc1 (TEST_STRUCT *ctx, const void *in, unsigned int num)
      38  {
      39      const unsigned long long *W=in;
      40      unsigned long long  a,b,c,d,e,f,g,h,s0,s1,T1;
      41      unsigned long long  X[16];
      42      int i;
      43  
      44      while (num--) {
      45  
      46          T1 = X[0] = W[0];   ROUND_00_15(0,a,b,c,d,e,f,g,h);
      47          T1 = X[1] = W[1];   ROUND_00_15(1,h,a,b,c,d,e,f,g);
      48          T1 = X[2] = W[2];   ROUND_00_15(2,g,h,a,b,c,d,e,f);
      49          T1 = X[3] = W[3];   ROUND_00_15(3,f,g,h,a,b,c,d,e);
      50          T1 = X[4] = W[4];   ROUND_00_15(4,e,f,g,h,a,b,c,d);
      51          T1 = X[5] = W[5];   ROUND_00_15(5,d,e,f,g,h,a,b,c);
      52          T1 = X[6] = W[6];   ROUND_00_15(6,c,d,e,f,g,h,a,b);
      53          T1 = X[7] = W[7];   ROUND_00_15(7,b,c,d,e,f,g,h,a);
      54          T1 = X[8] = W[8];   ROUND_00_15(8,a,b,c,d,e,f,g,h);
      55          T1 = X[9] = W[9];   ROUND_00_15(9,h,a,b,c,d,e,f,g);
      56  
      57          for (i=16;i<80;i+=8)
      58          {
      59              ROUND_16_80(i+0,a,b,c,d,e,f,g,h,X);
      60          }
      61  
      62          ctx->h[4] += e; ctx->h[5] += f; ctx->h[6] += g; ctx->h[7] += h;
      63      }
      64  }
      65  
      66  int testfunc2 (TEST_STRUCT *c, const void *_data, unsigned int len)
      67  {
      68      const unsigned char *data=(const unsigned char *)_data;
      69  
      70      unsigned char *p=(unsigned char *)c->u.p;
      71  
      72      testfunc1 (c,p,0);
      73      testfunc1 (c,data,len/sizeof(c->u));
      74  }