1  /* Machine description pattern tests.  */
       2  
       3  /* { dg-do compile } */
       4  /* { dg-options "-lpthread" } */
       5  /* { dg-do run { target { s390_useable_hw } } } */
       6  
       7  /**/
       8  
       9  char
      10  ae_8_0 (char *lock)
      11  {
      12    return __atomic_exchange_n (lock, 0, 2);
      13  }
      14  
      15  char
      16  ae_8_1 (char *lock)
      17  {
      18    return __atomic_exchange_n (lock, 1, 2);
      19  }
      20  
      21  char g8;
      22  
      23  char
      24  ae_8_g_0 (void)
      25  {
      26    return __atomic_exchange_n (&g8, 0, 2);
      27  }
      28  
      29  char
      30  ae_8_g_1 (void)
      31  {
      32    return __atomic_exchange_n (&g8, 1, 2);
      33  }
      34  
      35  /**/
      36  
      37  short
      38  ae_16_0 (short *lock)
      39  {
      40    return __atomic_exchange_n (lock, 0, 2);
      41  }
      42  
      43  short
      44  ae_16_1 (short *lock)
      45  {
      46    return __atomic_exchange_n (lock, 1, 2);
      47  }
      48  
      49  short g16;
      50  
      51  short
      52  ae_16_g_0 (void)
      53  {
      54    return __atomic_exchange_n (&g16, 0, 2);
      55  }
      56  
      57  short
      58  ae_16_g_1 (void)
      59  {
      60    return __atomic_exchange_n (&g16, 1, 2);
      61  }
      62  
      63  /**/
      64  
      65  int
      66  ae_32_0 (int *lock)
      67  {
      68    return __atomic_exchange_n (lock, 0, 2);
      69  }
      70  
      71  int
      72  ae_32_1 (int *lock)
      73  {
      74    return __atomic_exchange_n (lock, 1, 2);
      75  }
      76  
      77  int g32;
      78  
      79  int
      80  ae_32_g_0 (void)
      81  {
      82    return __atomic_exchange_n (&g32, 0, 2);
      83  }
      84  
      85  int
      86  ae_32_g_1 (void)
      87  {
      88    return __atomic_exchange_n (&g32, 1, 2);
      89  }
      90  
      91  /**/
      92  
      93  long long
      94  ae_64_0 (long long *lock)
      95  {
      96    return __atomic_exchange_n (lock, 0, 2);
      97  }
      98  
      99  long long
     100  ae_64_1 (long long *lock)
     101  {
     102    return __atomic_exchange_n (lock, 1, 2);
     103  }
     104  
     105  long long g64;
     106  
     107  long long
     108   ae_64_g_0 (void)
     109  {
     110    return __atomic_exchange_n (&g64, 0, 2);
     111  }
     112  
     113  long long
     114  ae_64_g_1 (void)
     115  {
     116    return __atomic_exchange_n (&g64, 1, 2);
     117  }
     118  
     119  /**/
     120  
     121  #ifdef __s390x__
     122  __int128
     123  ae_128_0 (__int128 *lock)
     124  {
     125    return __atomic_exchange_n (lock, 0, 2);
     126  }
     127  
     128  __int128
     129  ae_128_1 (__int128 *lock)
     130  {
     131    return __atomic_exchange_n (lock, 1, 2);
     132  }
     133  
     134  __int128 g128;
     135  
     136  __int128
     137  ae_128_g_0 (void)
     138  {
     139    return __atomic_exchange_n (&g128, 0, 2);
     140  }
     141  
     142  __int128
     143  ae_128_g_1 (void)
     144  {
     145    return __atomic_exchange_n (&g128, 1, 2);
     146  }
     147  
     148  #endif
     149  
     150  int main(void)
     151  {
     152    int i;
     153  
     154    for (i = 0; i <= 2; i++)
     155      {
     156        int oval = i;
     157  
     158        {
     159  	char lock;
     160  	char rval;
     161  
     162  	lock = oval;
     163  	rval = ae_8_0 (&lock);
     164  	if (lock != 0)
     165  	  __builtin_abort ();
     166  	if (rval != oval)
     167  	  __builtin_abort ();
     168  	lock = oval;
     169  	rval = ae_8_1 (&lock);
     170  	if (lock != 1)
     171  	  __builtin_abort ();
     172  	if (rval != oval)
     173  	  __builtin_abort ();
     174  	g8 = oval;
     175  	rval = ae_8_g_0 ();
     176  	if (g8 != 0)
     177  	  __builtin_abort ();
     178  	if (rval != oval)
     179  	  __builtin_abort ();
     180  	g8 = oval;
     181  	rval = ae_8_g_1 ();
     182  	if (g8 != 1)
     183  	  __builtin_abort ();
     184  	if (rval != oval)
     185  	  __builtin_abort ();
     186        }
     187        {
     188  	short lock;
     189  	short rval;
     190  
     191  	lock = oval;
     192  	rval = ae_16_0 (&lock);
     193  	if (lock != 0)
     194  	  __builtin_abort ();
     195  	if (rval != oval)
     196  	  __builtin_abort ();
     197  	lock = oval;
     198  	rval = ae_16_1 (&lock);
     199  	if (lock != 1)
     200  	  __builtin_abort ();
     201  	if (rval != oval)
     202  	  __builtin_abort ();
     203  	g16 = oval;
     204  	rval = ae_16_g_0 ();
     205  	if (g16 != 0)
     206  	  __builtin_abort ();
     207  	if (rval != oval)
     208  	  __builtin_abort ();
     209  	g16 = oval;
     210  	rval = ae_16_g_1 ();
     211  	if (g16 != 1)
     212  	  __builtin_abort ();
     213  	if (rval != oval)
     214  	  __builtin_abort ();
     215        }
     216        {
     217  	int lock;
     218  	int rval;
     219  
     220  	lock = oval;
     221  	rval = ae_32_0 (&lock);
     222  	if (lock != 0)
     223  	  __builtin_abort ();
     224  	if (rval != oval)
     225  	  __builtin_abort ();
     226  	lock = oval;
     227  	rval = ae_32_1 (&lock);
     228  	if (lock != 1)
     229  	  __builtin_abort ();
     230  	if (rval != oval)
     231  	  __builtin_abort ();
     232  	g32 = oval;
     233  	rval = ae_32_g_0 ();
     234  	if (g32 != 0)
     235  	  __builtin_abort ();
     236  	if (rval != oval)
     237  	  __builtin_abort ();
     238  	g32 = oval;
     239  	rval = ae_32_g_1 ();
     240  	if (g32 != 1)
     241  	  __builtin_abort ();
     242  	if (rval != oval)
     243  	  __builtin_abort ();
     244        }
     245        {
     246  	long long lock;
     247  	long long rval;
     248  
     249  	lock = oval;
     250  	rval = ae_64_0 (&lock);
     251  	if (lock != 0)
     252  	  __builtin_abort ();
     253  	if (rval != oval)
     254  	  __builtin_abort ();
     255  	lock = oval;
     256  	rval = ae_64_1 (&lock);
     257  	if (lock != 1)
     258  	  __builtin_abort ();
     259  	if (rval != oval)
     260  	  __builtin_abort ();
     261  	g64 = oval;
     262  	rval = ae_64_g_0 ();
     263  	if (g64 != 0)
     264  	  __builtin_abort ();
     265  	if (rval != oval)
     266  	  __builtin_abort ();
     267  	g64 = oval;
     268  	rval = ae_64_g_1 ();
     269  	if (g64 != 1)
     270  	  __builtin_abort ();
     271  	if (rval != oval)
     272  	  __builtin_abort ();
     273        }
     274  
     275  #ifdef __s390x__
     276        {
     277  	__int128 lock;
     278  	__int128 rval;
     279  
     280  	lock = oval;
     281  	rval = ae_128_0 (&lock);
     282  	if (lock != 0)
     283  	  __builtin_abort ();
     284  	if (rval != oval)
     285  	  __builtin_abort ();
     286  	lock = oval;
     287  	rval = ae_128_1 (&lock);
     288  	if (lock != 1)
     289  	  __builtin_abort ();
     290  	if (rval != oval)
     291  	  __builtin_abort ();
     292  	g128 = oval;
     293  	rval = ae_128_g_0 ();
     294  	if (g128 != 0)
     295  	  __builtin_abort ();
     296  	if (rval != oval)
     297  	  __builtin_abort ();
     298  	g128 = oval;
     299  	rval = ae_128_g_1 ();
     300  	if (g128 != 1)
     301  	  __builtin_abort ();
     302  	if (rval != oval)
     303  	  __builtin_abort ();
     304        }
     305  #endif
     306      }
     307  
     308    return 0;
     309  }