modernc.org/ccgo/v3@v3.16.14/lib/testdata/gcc-9.1.0/gcc/testsuite/gcc.c-torture/execute/20021120-1.c (about)

     1  /* Macros to emit "L Nxx R" for each octal number xx between 000 and 037.  */
     2  #define OP1(L, N, R, I, J) L N##I##J R
     3  #define OP2(L, N, R, I) \
     4      OP1(L, N, R, 0, I), OP1(L, N, R, 1, I), \
     5      OP1(L, N, R, 2, I), OP1(L, N, R, 3, I)
     6  #define OP(L, N, R) \
     7      OP2(L, N, R, 0), OP2(L, N, R, 1), OP2(L, N, R, 2), OP2(L, N, R, 3), \
     8      OP2(L, N, R, 4), OP2(L, N, R, 5), OP2(L, N, R, 6), OP2(L, N, R, 7)
     9  
    10  /* Declare 32 unique variables with prefix N.  */
    11  #define DECLARE(N) OP (, N,)
    12  
    13  /* Copy 32 variables with prefix N from the array at ADDR.
    14     Leave ADDR pointing to the end of the array.  */
    15  #define COPYIN(N, ADDR) OP (, N, = *(ADDR++))
    16  
    17  /* Likewise, but copy the other way.  */
    18  #define COPYOUT(N, ADDR) OP (*(ADDR++) =, N,)
    19  
    20  /* Add the contents of the array at ADDR to 32 variables with prefix N.
    21     Leave ADDR pointing to the end of the array.  */
    22  #define ADD(N, ADDR) OP (, N, += *(ADDR++))
    23  
    24  volatile double gd[32];
    25  volatile float gf[32];
    26  
    27  void foo (int n)
    28  {
    29    double DECLARE(d);
    30    float DECLARE(f);
    31    volatile double *pd;
    32    volatile float *pf;
    33    int i;
    34  
    35    pd = gd; COPYIN (d, pd);
    36    for (i = 0; i < n; i++)
    37      {
    38        pf = gf; COPYIN (f, pf);
    39        pd = gd; ADD (d, pd);
    40        pd = gd; ADD (d, pd);
    41        pd = gd; ADD (d, pd);
    42        pf = gf; COPYOUT (f, pf);
    43      }
    44    pd = gd; COPYOUT (d, pd);
    45  }
    46  
    47  int main ()
    48  {
    49    int i;
    50  
    51    for (i = 0; i < 32; i++)
    52      gd[i] = i, gf[i] = i;
    53    foo (1);
    54    for (i = 0; i < 32; i++)
    55      if (gd[i] != i * 4 || gf[i] != i)
    56        abort ();
    57    exit (0);
    58  }