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

     1  /* Test saving and restoring of SIMD registers.  */
     2  
     3  typedef short Q __attribute__((vector_size(8)));
     4  
     5  Q q1 = {1, 2}, q2 = {3, 4}, q3 = {5, 6}, q4 = {7, 8};
     6  
     7  Q w1, w2, w3, w4;
     8  Q z1, z2, z3, z4;
     9  
    10  volatile int dummy;
    11  
    12  void  __attribute__((__noinline__))
    13  func0 (void)
    14  {
    15    dummy = 1;
    16  }
    17  
    18  void __attribute__((__noinline__))
    19  func1 (void)
    20  {
    21    Q a, b;
    22    a = q1 * q2;
    23    b = q3 * q4;
    24    w1 = a;
    25    w2 = b;
    26    func0 ();
    27    w3 = a;
    28    w4 = b;
    29  }
    30  
    31  void __attribute__((__noinline__))
    32  func2 (void)
    33  {
    34    Q a, b;
    35    a = q1 + q2;
    36    b = q3 - q4;
    37    z1 = a;
    38    z2 = b;
    39    func1 ();
    40    z3 = a;
    41    z4 = b;
    42  }
    43  
    44  int
    45  main (void)
    46  {
    47    func2 ();
    48  
    49    if (memcmp (&w1, &w3, sizeof (Q)) != 0)
    50      abort ();
    51    if (memcmp (&w2, &w4, sizeof (Q)) != 0)
    52      abort ();
    53    if (memcmp (&z1, &z3, sizeof (Q)) != 0)
    54      abort ();
    55    if (memcmp (&z2, &z4, sizeof (Q)) != 0)
    56      abort ();
    57  
    58    return 0;
    59  }