(root)/
gcc-13.2.0/
libgomp/
testsuite/
libgomp.oacc-c-c++-common/
atomic_capture-3.c
       1  /* { dg-do run } */
       2  /* { dg-additional-options "-fmodulo-sched -fmodulo-sched-allow-regmoves" } */
       3  
       4  #include <stdlib.h>
       5  
       6  int
       7  main(int argc, char **argv)
       8  {
       9    int   iexp, igot, imax, imin;
      10    long long lexp, lgot;
      11    int   N = 32;
      12    int	i;
      13    int   idata[N];
      14    long long ldata[N];
      15    float fexp, fgot;
      16    float fdata[N];
      17  
      18    igot = 1234;
      19    iexp = 31;
      20  
      21    for (i = 0; i < N; i++)
      22      idata[i] = i;
      23  
      24  #pragma acc data copy (igot, idata[0:N])
      25    {
      26  #pragma acc parallel loop
      27      for (i = 0; i < N; i++)
      28  #pragma acc atomic capture
      29        { idata[i] = igot; igot = i; }
      30    }
      31  
      32    imax = 0;
      33    imin = N;
      34  
      35    for (i = 0; i < N; i++)
      36      {
      37        imax = idata[i] > imax ? idata[i] : imax;
      38        imin = idata[i] < imin ? idata[i] : imin;
      39      }
      40  
      41    if (imax != 1234 || imin != 0)
      42      abort ();
      43  
      44    return 0;
      45  
      46    igot = 0;
      47    iexp = 32;
      48  
      49  #pragma acc data copy (igot, idata[0:N])
      50    {
      51  #pragma acc parallel loop
      52      for (i = 0; i < N; i++)
      53  #pragma acc atomic capture
      54        { idata[i] = igot; igot++; }
      55    }
      56  
      57    if (iexp != igot)
      58      abort ();
      59  
      60    igot = 0;
      61    iexp = 32;
      62  
      63  #pragma acc data copy (igot, idata[0:N])
      64    {
      65  #pragma acc parallel loop
      66      for (i = 0; i < N; i++)
      67  #pragma acc atomic capture
      68        { idata[i] = igot; ++igot; }
      69    }
      70  
      71    if (iexp != igot)
      72      abort ();
      73  
      74    igot = 0;
      75    iexp = 32;
      76  
      77  #pragma acc data copy (igot, idata[0:N])
      78    {
      79  #pragma acc parallel loop
      80      for (i = 0; i < N; i++)
      81  #pragma acc atomic capture
      82        { ++igot; idata[i] = igot; }
      83    }
      84  
      85    if (iexp != igot)
      86      abort ();
      87  
      88    igot = 0;
      89    iexp = 32;
      90  
      91  #pragma acc data copy (igot, idata[0:N])
      92    {
      93  #pragma acc parallel loop
      94      for (i = 0; i < N; i++)
      95  #pragma acc atomic capture
      96        { igot++; idata[i] = igot; }
      97    }
      98  
      99    if (iexp != igot)
     100      abort ();
     101  
     102    igot = 32;
     103    iexp = 0;
     104  
     105  #pragma acc data copy (igot, idata[0:N])
     106    {
     107  #pragma acc parallel loop
     108      for (i = 0; i < N; i++)
     109  #pragma acc atomic capture
     110        { idata[i] = igot; igot--; }
     111    }
     112  
     113    if (iexp != igot)
     114      abort ();
     115  
     116    igot = 32;
     117    iexp = 0;
     118  
     119  #pragma acc data copy (igot, idata[0:N])
     120    {
     121  #pragma acc parallel loop
     122      for (i = 0; i < N; i++)
     123  #pragma acc atomic capture
     124        { idata[i] = igot; --igot; }
     125    }
     126  
     127    if (iexp != igot)
     128      abort ();
     129  
     130    igot = 32;
     131    iexp = 0;
     132  
     133  #pragma acc data copy (igot, idata[0:N])
     134    {
     135  #pragma acc parallel loop
     136      for (i = 0; i < N; i++)
     137  #pragma acc atomic capture
     138        { --igot; idata[i] = igot; }
     139    }
     140  
     141    if (iexp != igot)
     142      abort ();
     143  
     144    igot = 32;
     145    iexp = 0;
     146  
     147  #pragma acc data copy (igot, idata[0:N])
     148    {
     149  #pragma acc parallel loop
     150      for (i = 0; i < N; i++)
     151  #pragma acc atomic capture
     152        { igot--; idata[i] = igot; }
     153    }
     154  
     155    if (iexp != igot)
     156      abort ();
     157  
     158    /* BINOP = + */
     159    igot = 0;
     160    iexp = 32;
     161  
     162  #pragma acc data copy (igot, idata[0:N])
     163    {
     164  #pragma acc parallel loop
     165      for (i = 0; i < N; i++)
     166        {
     167          int expr = 1;
     168  
     169  #pragma acc atomic capture
     170          { idata[i] = igot; igot += expr; }
     171        }
     172    }
     173  
     174    if (iexp != igot)
     175      abort ();
     176  
     177    igot = 0;
     178    iexp = 32;
     179  
     180  #pragma acc data copy (igot, idata[0:N])
     181    {
     182  #pragma acc parallel loop
     183      for (i = 0; i < N; i++)
     184        {
     185          int expr = 1;
     186  
     187  #pragma acc atomic capture
     188          { igot += expr; idata[i] = igot; }
     189        }
     190    }
     191  
     192    if (iexp != igot)
     193      abort ();
     194  
     195    igot = 0;
     196    iexp = 32;
     197  
     198  #pragma acc data copy (igot, idata[0:N])
     199    {
     200  #pragma acc parallel loop
     201      for (i = 0; i < N; i++)
     202        {
     203          int expr = 1;
     204  
     205  #pragma acc atomic capture
     206          { idata[i] = igot; igot = igot + expr; }
     207        }
     208    }
     209  
     210    if (iexp != igot)
     211      abort ();
     212  
     213    igot = 0;
     214    iexp = 32;
     215  
     216  #pragma acc data copy (igot, idata[0:N])
     217    {
     218  #pragma acc parallel loop
     219      for (i = 0; i < N; i++)
     220        {
     221          int expr = 1;
     222  
     223  #pragma acc atomic capture
     224          { idata[i] = igot; igot = expr + igot; }
     225        }
     226    }
     227  
     228    if (iexp != igot)
     229      abort ();
     230  
     231    igot = 0;
     232    iexp = 32;
     233  
     234  #pragma acc data copy (igot, idata[0:N])
     235    {
     236  #pragma acc parallel loop
     237      for (i = 0; i < N; i++)
     238        {
     239          int expr = 1;
     240  
     241  #pragma acc atomic capture
     242          { igot = igot + expr; idata[i] = igot; }
     243        }
     244    }
     245  
     246    if (iexp != igot)
     247      abort ();
     248  
     249  
     250    igot = 0;
     251    iexp = 32;
     252  
     253  #pragma acc data copy (igot, idata[0:N])
     254    {
     255  #pragma acc parallel loop
     256      for (i = 0; i < N; i++)
     257        {
     258          int expr = 1;
     259  
     260  #pragma acc atomic capture
     261          { igot = expr + igot; idata[i] = igot; }
     262        }
     263    }
     264  
     265    if (iexp != igot)
     266      abort ();
     267  
     268    /* BINOP = * */
     269    lgot = 1LL;
     270    lexp = 1LL << 32;
     271  
     272  #pragma acc data copy (lgot, ldata[0:N])
     273    {
     274  #pragma acc parallel loop
     275      for (i = 0; i < N; i++)
     276        {
     277        long long expr = 2LL;
     278  
     279  #pragma acc atomic capture
     280        { ldata[i] = lgot; lgot *= expr; }
     281      }
     282    }
     283  
     284    if (lexp != lgot)
     285      abort ();
     286  
     287    lgot = 1LL;
     288    lexp = 1LL << 32;
     289  
     290  #pragma acc data copy (lgot, ldata[0:N])
     291    {
     292  #pragma acc parallel loop
     293      for (i = 0; i < N; i++)
     294        {
     295          long long expr = 2LL;
     296  
     297  #pragma acc atomic capture
     298          { lgot *= expr; ldata[i] = lgot; }
     299        }
     300    }
     301  
     302    if (lexp != lgot)
     303      abort ();
     304  
     305    lgot = 1LL;
     306    lexp = 1LL << 32;
     307  
     308  #pragma acc data copy (lgot, ldata[0:N])
     309    {
     310  #pragma acc parallel loop
     311      for (i = 0; i < N; i++)
     312        {
     313          long long expr = 2LL;
     314  
     315  #pragma acc atomic capture
     316          { ldata[i] = lgot; lgot = lgot * expr; }
     317        }
     318    }
     319  
     320    if (lexp != lgot)
     321      abort ();
     322  
     323    lgot = 1LL;
     324    lexp = 1LL << 32;
     325  
     326  #pragma acc data copy (lgot, ldata[0:N])
     327    {
     328  #pragma acc parallel loop
     329      for (i = 0; i < N; i++)
     330        {
     331        long long expr = 2LL;
     332  
     333  #pragma acc atomic capture
     334        { ldata[i] = lgot; lgot = expr * lgot; }
     335      }
     336    }
     337  
     338    if (lexp != lgot)
     339      abort ();
     340  
     341    lgot = 1LL;
     342    lexp = 1LL << 32;
     343  
     344  #pragma acc data copy (lgot, ldata[0:N])
     345    {
     346  #pragma acc parallel loop
     347      for (i = 0; i < N; i++)
     348        {
     349          long long expr = 2LL;
     350  
     351  #pragma acc atomic capture
     352          { lgot = lgot * expr; ldata[i] = lgot; }
     353        }
     354    }
     355  
     356    if (lexp != lgot)
     357      abort ();
     358  
     359    lgot = 1LL;
     360    lexp = 1LL << 32;
     361  
     362  #pragma acc data copy (lgot, ldata[0:N])
     363    {
     364  #pragma acc parallel loop
     365      for (i = 0; i < N; i++)
     366        {
     367        long long expr = 2;
     368  
     369  #pragma acc atomic capture
     370        { lgot = expr * lgot; ldata[i] = lgot; }
     371      }
     372    }
     373  
     374    if (lexp != lgot)
     375      abort ();
     376  
     377    /* BINOP = - */
     378    igot = 32;
     379    iexp = 0;
     380  
     381  #pragma acc data copy (igot, idata[0:N])
     382    {
     383  #pragma acc parallel loop
     384      for (i = 0; i < N; i++)
     385        {
     386        int expr = 1;
     387  
     388  #pragma acc atomic capture
     389        { idata[i] = igot; igot -= expr; }
     390      }
     391    }
     392  
     393    if (iexp != igot)
     394      abort ();
     395  
     396    igot = 32;
     397    iexp = 0;
     398  
     399  #pragma acc data copy (igot, idata[0:N])
     400    {
     401  #pragma acc parallel loop
     402      for (i = 0; i < N; i++)
     403        {
     404          int expr = 1;
     405  
     406  #pragma acc atomic capture
     407          { igot -= expr; idata[i] = igot; }
     408        }
     409    }
     410  
     411    if (iexp != igot)
     412      abort ();
     413  
     414    igot = 32;
     415    iexp = 0;
     416  
     417  #pragma acc data copy (igot, idata[0:N])
     418    {
     419  #pragma acc parallel loop
     420      for (i = 0; i < N; i++)
     421        {
     422          int expr = 1;
     423  
     424  #pragma acc atomic capture
     425          { idata[i] = igot; igot = igot - expr; }
     426        }
     427    }
     428  
     429    if (iexp != igot)
     430      abort ();
     431  
     432    igot = 1;
     433    iexp = 1;
     434  
     435  #pragma acc data copy (igot, idata[0:N])
     436    {
     437  #pragma acc parallel loop
     438      for (i = 0; i < N; i++)
     439        {
     440        int expr = 1;
     441  
     442  #pragma acc atomic capture
     443        { idata[i] = igot; igot = expr - igot; }
     444      }
     445    }
     446  
     447    for (i = 0; i < N; i++)
     448      if (i % 2 == 0)
     449        {
     450  	if (idata[i] != 1)
     451  	  abort ();
     452        }
     453      else
     454        {
     455  	if (idata[i] != 0)
     456  	  abort ();
     457        }
     458  
     459    if (iexp != igot)
     460      abort ();
     461  
     462    igot = 1;
     463    iexp = -31;
     464  
     465  #pragma acc data copy (igot, idata[0:N])
     466    {
     467  #pragma acc parallel loop
     468      for (i = 0; i < N; i++)
     469        {
     470          int expr = 1;
     471  
     472  #pragma acc atomic capture
     473          { igot = igot - expr; idata[i] = igot; }
     474        }
     475    }
     476  
     477    if (iexp != igot)
     478      abort ();
     479  
     480    igot = 1;
     481    iexp = 1;
     482  
     483  #pragma acc data copy (igot, idata[0:N])
     484    {
     485  #pragma acc parallel loop
     486      for (i = 0; i < N; i++)
     487        {
     488          int expr = 1;
     489  
     490  #pragma acc atomic capture
     491          { igot = expr - igot; idata[i] = igot; }
     492        }
     493    }
     494  
     495    for (i = 0; i < N; i++)
     496      if (i % 2 == 0)
     497        {
     498  	if (idata[i] != 0)
     499  	  abort ();
     500        }
     501      else
     502        {
     503  	if (idata[i] != 1)
     504  	  abort ();
     505        }
     506  
     507    if (iexp != igot)
     508      abort ();
     509  
     510    /* BINOP = / */
     511    lgot = 1LL << 32;
     512    lexp = 1LL;
     513  
     514  #pragma acc data copy (lgot, ldata[0:N])
     515    {
     516  #pragma acc parallel loop
     517      for (i = 0; i < N; i++)
     518        {
     519          long long expr = 2LL;
     520  
     521  #pragma acc atomic capture
     522          { ldata[i] = lgot; lgot /= expr; }
     523        }
     524    }
     525  
     526    if (lexp != lgot)
     527      abort ();
     528  
     529    lgot = 1LL << 32;
     530    lexp = 1LL;
     531  
     532  #pragma acc data copy (lgot, ldata[0:N])
     533    {
     534  #pragma acc parallel loop
     535      for (i = 0; i < N; i++)
     536        {
     537          long long expr = 2LL;
     538  
     539  #pragma acc atomic capture
     540          { lgot /= expr; ldata[i] = lgot; }
     541        }
     542    }
     543  
     544    if (lexp != lgot)
     545      abort ();
     546  
     547    lgot = 1LL << 32;
     548    lexp = 1LL;
     549  
     550  #pragma acc data copy (lgot, ldata[0:N])
     551    {
     552  #pragma acc parallel loop
     553      for (i = 0; i < N; i++)
     554        {
     555        long long expr = 2LL;
     556  
     557  #pragma acc atomic capture
     558        { ldata[i] = lgot; lgot = lgot / expr; }
     559      }
     560    }
     561  
     562    if (lexp != lgot)
     563      abort ();
     564  
     565    lgot = 2LL;
     566    lexp = 2LL;
     567  
     568  #pragma acc data copy (lgot, ldata[0:N])
     569    {
     570  #pragma acc parallel loop
     571      for (i = 0; i < N; i++)
     572        {
     573          long long expr = 1LL << N;
     574  
     575  #pragma acc atomic capture
     576          { ldata[i] = lgot; lgot = expr / lgot; }
     577        }
     578    }
     579  
     580    if (lexp != lgot)
     581      abort ();
     582  
     583    lgot = 2LL;
     584    lexp = 2LL;
     585  
     586  #pragma acc data copy (lgot, ldata[0:N])
     587    {
     588  #pragma acc parallel loop
     589      for (i = 0; i < N; i++)
     590        {
     591          long long expr = 1LL << N;
     592  
     593  #pragma acc atomic capture
     594          { lgot = lgot / expr; ldata[i] = lgot; }
     595        }
     596    }
     597  
     598    if (lexp != lgot)
     599      abort ();
     600  
     601    lgot = 2LL;
     602    lexp = 2LL;
     603  
     604  #pragma acc data copy (lgot, ldata[0:N])
     605    {
     606  #pragma acc parallel loop
     607      for (i = 0; i < N; i++)
     608        {
     609          long long expr = 1LL << N;
     610  
     611  #pragma acc atomic capture
     612          { lgot = expr / lgot; ldata[i] = lgot; }
     613        }
     614    }
     615  
     616    if (lexp != lgot)
     617      abort ();
     618  
     619    /* BINOP = & */
     620    lgot = ~0LL;
     621    lexp = 0LL;
     622  
     623  #pragma acc data copy (lgot, ldata[0:N])
     624    {
     625  #pragma acc parallel loop
     626      for (i = 0; i < N; i++)
     627        {
     628          long long expr = ~(1 << i);
     629  
     630  #pragma acc atomic capture
     631          { ldata[i] = lgot; lgot &= expr; }
     632        }
     633    }
     634  
     635    if (lexp != lgot)
     636      abort ();
     637  
     638    lgot = ~0LL;
     639    iexp = 0LL; 
     640  
     641  #pragma acc data copy (lgot, ldata[0:N])
     642    {
     643  #pragma acc parallel loop
     644      for (i = 0; i < N; i++)
     645        {
     646          long long expr = ~(1 << i);
     647  
     648  #pragma acc atomic capture
     649          { lgot &= expr; ldata[i] = lgot; }
     650        }
     651    }
     652  
     653    if (lexp != lgot)
     654      abort ();
     655  
     656    lgot = ~0LL;
     657    lexp = 0LL;
     658  
     659  #pragma acc data copy (lgot, ldata[0:N])
     660    {
     661  #pragma acc parallel loop
     662      for (i = 0; i < N; i++)
     663        {
     664          long long expr = ~(1 << i);
     665  
     666  #pragma acc atomic capture
     667          { ldata[i] = lgot; lgot = lgot & expr; }
     668        }
     669    }
     670  
     671    if (lexp != lgot)
     672      abort ();
     673  
     674    lgot = ~0LL;
     675    lexp = 0LL;
     676  
     677  #pragma acc data copy (lgot, ldata[0:N])
     678    {
     679  #pragma acc parallel loop
     680      for (i = 0; i < N; i++)
     681        {
     682          long long expr = ~(1 << i);
     683  
     684  #pragma acc atomic capture
     685          { ldata[i] = lgot; lgot = expr & lgot; }
     686        }
     687    }
     688  
     689    if (lexp != lgot)
     690      abort ();
     691  
     692    lgot = ~0LL;
     693    iexp = 0LL;
     694  
     695  #pragma acc data copy (lgot, ldata[0:N])
     696    {
     697  #pragma acc parallel loop
     698      for (i = 0; i < N; i++)
     699        {
     700          long long expr = ~(1 << i);
     701  
     702  #pragma acc atomic capture
     703          { lgot = lgot & expr; ldata[i] = lgot; }
     704        }
     705    }
     706  
     707    if (lexp != lgot)
     708      abort ();
     709  
     710    lgot = ~0LL;
     711    lexp = 0LL;
     712  
     713  #pragma acc data copy (lgot, ldata[0:N])
     714    {
     715  #pragma acc parallel loop
     716      for (i = 0; i < N; i++)
     717        {
     718        long long expr = ~(1 << i);
     719  
     720  #pragma acc atomic capture
     721        { lgot = expr & lgot; ldata[i] = lgot; }
     722      }
     723    }
     724  
     725    if (lexp != lgot)
     726      abort ();
     727  
     728    /* BINOP = ^ */
     729    lgot = ~0LL;
     730    lexp = 0LL;
     731  
     732  #pragma acc data copy (lgot, ldata[0:N])
     733    {
     734  #pragma acc parallel loop
     735      for (i = 0; i < N; i++)
     736        {
     737        long long expr = 1 << i;
     738  
     739  #pragma acc atomic capture
     740        { ldata[i] = lgot; lgot ^= expr; }
     741      }
     742    }
     743  
     744    if (lexp != lgot)
     745      abort ();
     746  
     747    lgot = ~0LL;
     748    iexp = 0LL; 
     749  
     750  #pragma acc data copy (lgot, ldata[0:N])
     751    {
     752  #pragma acc parallel loop
     753      for (i = 0; i < N; i++)
     754        {
     755          long long expr = ~(1 << i);
     756  
     757  #pragma acc atomic capture
     758          { lgot ^= expr; ldata[i] = lgot; }
     759        }
     760    }
     761  
     762    if (lexp != lgot)
     763      abort ();
     764  
     765    lgot = ~0LL;
     766    lexp = 0LL;
     767  
     768  #pragma acc data copy (lgot, ldata[0:N])
     769    {
     770  #pragma acc parallel loop
     771      for (i = 0; i < N; i++)
     772        {
     773          long long expr = ~(1 << i);
     774  
     775  #pragma acc atomic capture
     776          { ldata[i] = lgot; lgot = lgot ^ expr; }
     777        }
     778    }
     779  
     780    if (lexp != lgot)
     781      abort ();
     782  
     783    lgot = ~0LL;
     784    lexp = 0LL;
     785  
     786  #pragma acc data copy (lgot, ldata[0:N])
     787    {
     788  #pragma acc parallel loop
     789      for (i = 0; i < N; i++)
     790        {
     791        long long expr = ~(1 << i);
     792  
     793  #pragma acc atomic capture
     794        { ldata[i] = lgot; lgot = expr ^ lgot; }
     795      }
     796    }
     797  
     798    if (lexp != lgot)
     799      abort ();
     800  
     801    lgot = ~0LL;
     802    iexp = 0LL;
     803  
     804  #pragma acc data copy (lgot, ldata[0:N])
     805    {
     806  #pragma acc parallel loop
     807      for (i = 0; i < N; i++)
     808        {
     809          long long expr = ~(1 << i);
     810  
     811  #pragma acc atomic capture
     812          { lgot = lgot ^ expr; ldata[i] = lgot; }
     813        }
     814    }
     815  
     816    if (lexp != lgot)
     817      abort ();
     818  
     819    lgot = ~0LL;
     820    lexp = 0LL;
     821  
     822  #pragma acc data copy (lgot, ldata[0:N])
     823    {
     824  #pragma acc parallel loop
     825      for (i = 0; i < N; i++)
     826        {
     827          long long expr = ~(1 << i);
     828  
     829  #pragma acc atomic capture
     830          { lgot = expr ^ lgot; ldata[i] = lgot; }
     831        }
     832    }
     833  
     834    if (lexp != lgot)
     835      abort ();
     836  
     837    /* BINOP = | */
     838    lgot = 0LL;
     839    lexp = ~0LL;
     840  
     841  #pragma acc data copy (lgot, ldata[0:N])
     842    {
     843  #pragma acc parallel loop
     844      for (i = 0; i < N; i++)
     845        {
     846          long long expr = 1 << i;
     847  
     848  #pragma acc atomic capture
     849          { ldata[i] = lgot; lgot |= expr; }
     850        }
     851    }
     852  
     853    if (lexp != lgot)
     854      abort ();
     855  
     856    lgot = 0LL;
     857    iexp = ~0LL; 
     858  
     859  #pragma acc data copy (lgot, ldata[0:N])
     860    {
     861  #pragma acc parallel loop
     862      for (i = 0; i < N; i++)
     863        {
     864          long long expr = ~(1 << i);
     865  
     866  #pragma acc atomic capture
     867          { lgot |= expr; ldata[i] = lgot; }
     868        }
     869    }
     870  
     871    if (lexp != lgot)
     872      abort ();
     873  
     874    lgot = 0LL;
     875    lexp = ~0LL;
     876  
     877  #pragma acc data copy (lgot, ldata[0:N])
     878    {
     879  #pragma acc parallel loop
     880      for (i = 0; i < N; i++)
     881        {
     882          long long expr = ~(1 << i);
     883  
     884  #pragma acc atomic capture
     885          { ldata[i] = lgot; lgot = lgot | expr; }
     886        }
     887    }
     888  
     889    if (lexp != lgot)
     890      abort ();
     891  
     892    lgot = 0LL;
     893    lexp = ~0LL;
     894  
     895  #pragma acc data copy (lgot, ldata[0:N])
     896    {
     897  #pragma acc parallel loop
     898      for (i = 0; i < N; i++)
     899        {
     900          long long expr = ~(1 << i);
     901  
     902  #pragma acc atomic capture
     903          { ldata[i] = lgot; lgot = expr | lgot; }
     904        }
     905    }
     906  
     907    if (lexp != lgot)
     908      abort ();
     909  
     910    lgot = 0LL;
     911    iexp = ~0LL;
     912  
     913  #pragma acc data copy (lgot, ldata[0:N])
     914    {
     915  #pragma acc parallel loop
     916      for (i = 0; i < N; i++)
     917        {
     918          long long expr = ~(1 << i);
     919  
     920  #pragma acc atomic capture
     921          { lgot = lgot | expr; ldata[i] = lgot; }
     922        }
     923    }
     924  
     925    if (lexp != lgot)
     926      abort ();
     927  
     928    lgot = 0LL;
     929    lexp = ~0LL;
     930  
     931  #pragma acc data copy (lgot, ldata[0:N])
     932    {
     933  #pragma acc parallel loop
     934      for (i = 0; i < N; i++)
     935        {
     936          long long expr = ~(1 << i);
     937  
     938  #pragma acc atomic capture
     939          { lgot = expr | lgot; ldata[i] = lgot; }
     940        }
     941    }
     942  
     943    if (lexp != lgot)
     944      abort ();
     945  
     946    /* BINOP = << */
     947    lgot = 1LL;
     948    lexp = 1LL << N;
     949  
     950  #pragma acc data copy (lgot, ldata[0:N])
     951    {
     952  #pragma acc parallel loop
     953      for (i = 0; i < N; i++)
     954        {
     955          long long expr = 1LL;
     956  
     957  #pragma acc atomic capture
     958          { ldata[i] = lgot; lgot <<= expr; }
     959        }
     960    }
     961  
     962    if (lexp != lgot)
     963      abort ();
     964  
     965    lgot = 1LL;
     966    iexp = 1LL << N; 
     967  
     968  #pragma acc data copy (lgot, ldata[0:N])
     969    {
     970  #pragma acc parallel loop
     971      for (i = 0; i < N; i++)
     972        {
     973          long long expr = 1LL;
     974  
     975  #pragma acc atomic capture
     976          { lgot <<= expr; ldata[i] = lgot; }
     977        }
     978    }
     979  
     980    if (lexp != lgot)
     981      abort ();
     982  
     983    lgot = 1LL;
     984    lexp = 1LL << N;
     985  
     986  #pragma acc data copy (lgot, ldata[0:N])
     987    {
     988  #pragma acc parallel loop
     989      for (i = 0; i < N; i++)
     990        {
     991          long long expr = 1LL;
     992  
     993  #pragma acc atomic capture
     994          { ldata[i] = lgot; lgot = lgot << expr; }
     995        }
     996    }
     997  
     998    if (lexp != lgot)
     999      abort ();
    1000  
    1001    lgot = 1LL;
    1002    lexp = 2LL;
    1003  
    1004  #pragma acc data copy (lgot, ldata[0:N])
    1005    {
    1006  #pragma acc parallel loop
    1007      for (i = 0; i < 1; i++)
    1008        {
    1009          long long expr = 1LL;
    1010  
    1011  #pragma acc atomic capture
    1012          { ldata[i] = lgot; lgot = expr << lgot; }
    1013        }
    1014    }
    1015  
    1016    if (lexp != lgot)
    1017      abort ();
    1018  
    1019    lgot = 1LL;
    1020    lexp = 2LL;
    1021  
    1022  #pragma acc data copy (lgot, ldata[0:N])
    1023    {
    1024  #pragma acc parallel loop
    1025      for (i = 0; i < 1; i++)
    1026        {
    1027          long long expr = 1LL;
    1028  
    1029  #pragma acc atomic capture
    1030          { lgot = lgot << expr; ldata[i] = lgot; }
    1031        }
    1032    }
    1033  
    1034    if (lexp != lgot)
    1035      abort ();
    1036  
    1037    lgot = 1LL;
    1038    lexp = 2LL;
    1039  
    1040  #pragma acc data copy (lgot, ldata[0:N])
    1041    {
    1042  #pragma acc parallel loop
    1043      for (i = 0; i < 1; i++)
    1044        {
    1045          long long expr = 1LL;
    1046  
    1047  #pragma acc atomic capture
    1048          { lgot = expr << lgot; ldata[i] = lgot; }
    1049        }
    1050    }
    1051  
    1052    if (lexp != lgot)
    1053      abort ();
    1054  
    1055    /* BINOP = >> */
    1056    lgot = 1LL << N;
    1057    lexp = 1LL;
    1058  
    1059  #pragma acc data copy (lgot, ldata[0:N])
    1060    {
    1061  #pragma acc parallel loop
    1062      for (i = 0; i < N; i++)
    1063        {
    1064          long long expr = 1LL;
    1065    
    1066  #pragma acc atomic capture
    1067          { ldata[i] = lgot; lgot >>= expr; }
    1068        }
    1069    }
    1070  
    1071    if (lexp != lgot)
    1072      abort ();
    1073  
    1074    lgot = 1LL << N;
    1075    iexp = 1LL; 
    1076  
    1077  #pragma acc data copy (lgot, ldata[0:N])
    1078    {
    1079  #pragma acc parallel loop
    1080      for (i = 0; i < N; i++)
    1081        {
    1082          long long expr = 1LL;
    1083  
    1084  #pragma acc atomic capture
    1085          { lgot >>= expr; ldata[i] = lgot; }
    1086        }
    1087    }
    1088  
    1089    if (lexp != lgot)
    1090      abort ();
    1091  
    1092    lgot = 1LL << N;
    1093    lexp = 1LL;
    1094  
    1095  #pragma acc data copy (lgot, ldata[0:N])
    1096    {
    1097  #pragma acc parallel loop
    1098      for (i = 0; i < N; i++)
    1099        {
    1100          long long expr = 1LL;
    1101  
    1102  #pragma acc atomic capture
    1103          { ldata[i] = lgot; lgot = lgot >> expr; }
    1104        }
    1105    }
    1106  
    1107    if (lexp != lgot)
    1108      abort ();
    1109  
    1110    lgot = 1LL;
    1111    lexp = 1LL << (N - 1);
    1112  
    1113  #pragma acc data copy (lgot, ldata[0:N])
    1114    {
    1115  #pragma acc parallel loop
    1116      for (i = 0; i < 1; i++)
    1117        {
    1118          long long expr = 1LL << N;
    1119  
    1120  #pragma acc atomic capture
    1121          { ldata[i] = lgot; lgot = expr >> lgot; }
    1122      }
    1123    }
    1124  
    1125    if (lexp != lgot)
    1126      abort ();
    1127  
    1128    lgot = 1LL << N;
    1129    lexp = 1LL;
    1130  
    1131  #pragma acc data copy (lgot, ldata[0:N])
    1132    {
    1133  #pragma acc parallel loop
    1134      for (i = 0; i < N; i++)
    1135        {
    1136          long long expr = 1LL;
    1137  
    1138  #pragma acc atomic capture
    1139          { lgot = lgot >> expr; ldata[i] = lgot; }
    1140        }
    1141    }
    1142  
    1143    if (lexp != lgot)
    1144      abort ();
    1145  
    1146    lgot = 1LL;
    1147    lexp = 1LL << (N - 1);
    1148  
    1149  #pragma acc data copy (lgot, ldata[0:N])
    1150    {
    1151  #pragma acc parallel loop
    1152      for (i = 0; i < 1; i++)
    1153        {
    1154          long long expr = 1LL << N;
    1155  
    1156  #pragma acc atomic capture
    1157          { lgot = expr >> lgot; ldata[i] = lgot; }
    1158        }
    1159    }
    1160  
    1161    if (lexp != lgot)
    1162      abort ();
    1163  
    1164    // FLOAT FLOAT FLOAT
    1165  
    1166    /* BINOP = + */
    1167    fgot = 0.0;
    1168    fexp = 32.0;
    1169  
    1170  #pragma acc data copy (fgot, fdata[0:N])
    1171    {
    1172  #pragma acc parallel loop
    1173      for (i = 0; i < N; i++)
    1174        {
    1175        float expr = 1.0;
    1176  
    1177  #pragma acc atomic capture
    1178        { fdata[i] = fgot; fgot += expr; }
    1179      }
    1180    }
    1181  
    1182    if (fexp != fgot)
    1183      abort ();
    1184  
    1185    fgot = 0.0;
    1186    fexp = 32.0;
    1187  
    1188  #pragma acc data copy (fgot, fdata[0:N])
    1189    {
    1190  #pragma acc parallel loop
    1191      for (i = 0; i < N; i++)
    1192        {
    1193          float expr = 1.0;
    1194  
    1195  #pragma acc atomic capture
    1196          { fgot += expr; fdata[i] = fgot; }
    1197        }
    1198    }
    1199  
    1200    if (fexp != fgot)
    1201      abort ();
    1202  
    1203    fgot = 0.0;
    1204    fexp = 32.0;
    1205  
    1206  #pragma acc data copy (fgot, fdata[0:N])
    1207    {
    1208  #pragma acc parallel loop
    1209      for (i = 0; i < N; i++)
    1210        {
    1211          float expr = 1.0;
    1212  
    1213  #pragma acc atomic capture
    1214          { idata[i] = fgot; fgot = fgot + expr; }
    1215        }
    1216    }
    1217  
    1218    if (fexp != fgot)
    1219      abort ();
    1220  
    1221    fgot = 0.0;
    1222    fexp = 32.0;
    1223  
    1224  #pragma acc data copy (fgot, fdata[0:N])
    1225    {
    1226  #pragma acc parallel loop
    1227      for (i = 0; i < N; i++)
    1228        {
    1229        float expr = 1.0;
    1230  
    1231  #pragma acc atomic capture
    1232        { fdata[i] = fgot; fgot = expr + fgot; }
    1233      }
    1234    }
    1235  
    1236    if (fexp != fgot)
    1237      abort ();
    1238  
    1239    fgot = 0.0;
    1240    fexp = 32.0;
    1241  
    1242  #pragma acc data copy (fgot, fdata[0:N])
    1243    {
    1244  #pragma acc parallel loop
    1245      for (i = 0; i < N; i++)
    1246        {
    1247          float expr = 1.0;
    1248  
    1249  #pragma acc atomic capture
    1250          { fgot = fgot + expr; fdata[i] = fgot; }
    1251        }
    1252    }
    1253  
    1254    if (fexp != fgot)
    1255      abort ();
    1256  
    1257    fgot = 0.0;
    1258    fexp = 32.0;
    1259  
    1260  #pragma acc data copy (fgot, fdata[0:N])
    1261    {
    1262  #pragma acc parallel loop
    1263      for (i = 0; i < N; i++)
    1264        {
    1265          float expr = 1.0;
    1266  
    1267  #pragma acc atomic capture
    1268          { fgot = expr + fgot; fdata[i] = fgot; }
    1269        }
    1270    }
    1271  
    1272    if (fexp != fgot)
    1273      abort ();
    1274  
    1275    /* BINOP = * */
    1276    fgot = 1.0;
    1277    fexp = 8192.0*8192.0*64.0;
    1278  
    1279  #pragma acc data copy (fgot, fdata[0:N])
    1280    {
    1281  #pragma acc parallel loop
    1282      for (i = 0; i < N; i++)
    1283        {
    1284        float expr = 2.0;
    1285  
    1286  #pragma acc atomic capture
    1287        { fdata[i] = fgot; fgot *= expr; }
    1288      }
    1289    }
    1290  
    1291    if (fexp != fgot)
    1292      abort ();
    1293  
    1294    fgot = 1.0;
    1295    fexp = 8192.0*8192.0*64.0;
    1296  
    1297  #pragma acc data copy (fgot, fdata[0:N])
    1298    {
    1299  #pragma acc parallel loop
    1300      for (i = 0; i < N; i++)
    1301        {
    1302          float expr = 2.0;
    1303  
    1304  #pragma acc atomic capture
    1305          { fgot *= expr; fdata[i] = fgot; }
    1306        }
    1307    }
    1308  
    1309    if (fexp != fgot)
    1310      abort ();
    1311  
    1312    fgot = 1.0;
    1313    fexp = 8192.0*8192.0*64.0;
    1314  
    1315  #pragma acc data copy (fgot, fdata[0:N])
    1316    {
    1317  #pragma acc parallel loop
    1318      for (i = 0; i < N; i++)
    1319        {
    1320          float expr = 2.0;
    1321  
    1322  #pragma acc atomic capture
    1323          { fdata[i] = fgot; fgot = fgot * expr; }
    1324        }
    1325    }
    1326  
    1327    if (fexp != fgot)
    1328      abort ();
    1329  
    1330    fgot = 1.0;
    1331    fexp = 8192.0*8192.0*64.0;
    1332  
    1333  #pragma acc data copy (fgot, fdata[0:N])
    1334    {
    1335  #pragma acc parallel loop
    1336      for (i = 0; i < N; i++)
    1337        {
    1338          float expr = 2.0;
    1339  
    1340  #pragma acc atomic capture
    1341          { fdata[i] = fgot; fgot = expr * fgot; }
    1342        }
    1343    }
    1344  
    1345    if (fexp != fgot)
    1346      abort ();
    1347  
    1348    lgot = 1LL;
    1349    lexp = 1LL << 32;
    1350  
    1351  #pragma acc data copy (lgot, ldata[0:N])
    1352    {
    1353  #pragma acc parallel loop
    1354      for (i = 0; i < N; i++)
    1355        {
    1356        long long expr = 2LL;
    1357  
    1358  #pragma acc atomic capture
    1359        { lgot = lgot * expr; ldata[i] = lgot; }
    1360      }
    1361    }
    1362  
    1363    if (lexp != lgot)
    1364      abort ();
    1365  
    1366    fgot = 1.0;
    1367    fexp = 8192.0*8192.0*64.0;
    1368  
    1369  #pragma acc data copy (fgot, fdata[0:N])
    1370    {
    1371  #pragma acc parallel loop
    1372      for (i = 0; i < N; i++)
    1373        {
    1374          long long expr = 2;
    1375  
    1376  #pragma acc atomic capture
    1377          { fgot = expr * fgot; fdata[i] = fgot; }
    1378        }
    1379    }
    1380  
    1381    if (fexp != fgot)
    1382      abort ();
    1383  
    1384    /* BINOP = - */
    1385    fgot = 32.0;
    1386    fexp = 0.0;
    1387  
    1388  #pragma acc data copy (fgot, fdata[0:N])
    1389    {
    1390  #pragma acc parallel loop
    1391      for (i = 0; i < N; i++)
    1392        {
    1393          float expr = 1.0;
    1394    
    1395  #pragma acc atomic capture
    1396          { fdata[i] = fgot; fgot -= expr; }
    1397        }
    1398    }
    1399  
    1400    if (fexp != fgot)
    1401      abort ();
    1402  
    1403    fgot = 32.0;
    1404    fexp = 0.0;
    1405  
    1406  #pragma acc data copy (fgot, fdata[0:N])
    1407    {
    1408  #pragma acc parallel loop
    1409      for (i = 0; i < N; i++)
    1410        {
    1411        float expr = 1.0;
    1412  
    1413  #pragma acc atomic capture
    1414        { fgot -= expr; fdata[i] = fgot; }
    1415      }
    1416    }
    1417  
    1418    if (fexp != fgot)
    1419      abort ();
    1420  
    1421    fgot = 32.0;
    1422    fexp = 0.0;
    1423  
    1424  #pragma acc data copy (fgot, fdata[0:N])
    1425    {
    1426  #pragma acc parallel loop
    1427      for (i = 0; i < N; i++)
    1428        {
    1429          float expr = 1.0;
    1430  
    1431  #pragma acc atomic capture
    1432          { fdata[i] = fgot; fgot = fgot - expr; }
    1433        }
    1434    }
    1435  
    1436    if (fexp != fgot)
    1437      abort ();
    1438  
    1439    fgot = 1.0;
    1440    fexp = 1.0;
    1441  
    1442  #pragma acc data copy (fgot, fdata[0:N])
    1443    {
    1444  #pragma acc parallel loop
    1445      for (i = 0; i < N; i++)
    1446        {
    1447          float expr = 1.0;
    1448  
    1449  #pragma acc atomic capture
    1450          { fdata[i] = fgot; fgot = expr - fgot; }
    1451        }
    1452    }
    1453  
    1454    for (i = 0; i < N; i++)
    1455      if (i % 2 == 0)
    1456        {
    1457  	if (fdata[i] != 1.0)
    1458  	  abort ();
    1459        }
    1460      else
    1461        {
    1462  	if (fdata[i] != 0.0)
    1463  	  abort ();
    1464        }
    1465  
    1466    if (fexp != fgot)
    1467      abort ();
    1468  
    1469    fgot = 1.0;
    1470    fexp = -31.0;
    1471  
    1472  #pragma acc data copy (fgot, fdata[0:N])
    1473    {
    1474  #pragma acc parallel loop
    1475      for (i = 0; i < N; i++)
    1476        {
    1477          float expr = 1.0;
    1478  
    1479  #pragma acc atomic capture
    1480          { fgot = fgot - expr; fdata[i] = fgot; }
    1481        }
    1482    }
    1483  
    1484    if (fexp != fgot)
    1485      abort ();
    1486  
    1487    fgot = 1.0;
    1488    fexp = 1.0;
    1489  
    1490  #pragma acc data copy (fgot, fdata[0:N])
    1491    {
    1492  #pragma acc parallel loop
    1493      for (i = 0; i < N; i++)
    1494        {
    1495          float expr = 1.0;
    1496  
    1497  #pragma acc atomic capture
    1498          { fgot = expr - fgot; fdata[i] = fgot; }
    1499        }
    1500    }
    1501  
    1502    for (i = 0; i < N; i++)
    1503      if (i % 2 == 0)
    1504        {
    1505  	if (fdata[i] != 0.0)
    1506  	  abort ();
    1507        }
    1508      else
    1509        {
    1510  	if (fdata[i] != 1.0)
    1511  	  abort ();
    1512        }
    1513  
    1514    if (fexp != fgot)
    1515      abort ();
    1516  
    1517    /* BINOP = / */
    1518    fgot = 8192.0*8192.0*64.0;
    1519    fexp = 1.0;
    1520  
    1521  #pragma acc data copy (fgot, fdata[0:N])
    1522    {
    1523  #pragma acc parallel loop
    1524      for (i = 0; i < N; i++)
    1525        {
    1526          float expr = 2.0;
    1527  
    1528  #pragma acc atomic capture
    1529          { fdata[i] = fgot; fgot /= expr; }
    1530        }
    1531    }
    1532  
    1533    if (fexp != fgot)
    1534      abort ();
    1535  
    1536    fgot = 8192.0*8192.0*64.0;
    1537    fexp = 1.0;
    1538  
    1539  #pragma acc data copy (fgot, fdata[0:N])
    1540    {
    1541  #pragma acc parallel loop
    1542      for (i = 0; i < N; i++)
    1543        {
    1544          float expr = 2.0;
    1545  
    1546  #pragma acc atomic capture
    1547          { fgot /= expr; fdata[i] = fgot; }
    1548        }
    1549    }
    1550  
    1551    if (fexp != fgot)
    1552      abort ();
    1553  
    1554    fgot = 8192.0*8192.0*64.0;
    1555    fexp = 1.0;
    1556  
    1557  #pragma acc data copy (fgot, fdata[0:N])
    1558    {
    1559  #pragma acc parallel loop
    1560      for (i = 0; i < N; i++)
    1561        {
    1562          float expr = 2.0;
    1563  
    1564  #pragma acc atomic capture
    1565          { fdata[i] = fgot; fgot = fgot / expr; }
    1566        }
    1567    }
    1568  
    1569    if (fexp != fgot)
    1570      abort ();
    1571  
    1572    fgot = 8192.0*8192.0*64.0;
    1573    fexp = 1.0;
    1574  
    1575  #pragma acc data copy (fgot, fdata[0:N])
    1576    {
    1577  #pragma acc parallel loop
    1578      for (i = 0; i < N; i++)
    1579        {
    1580          float expr = 1.0;
    1581  
    1582  #pragma acc atomic capture
    1583          { fdata[i] = fgot; fgot = expr / fgot; }
    1584        }
    1585    }
    1586  
    1587    if (fexp != fgot)
    1588      abort ();
    1589  
    1590    fgot = 4.0;
    1591    fexp = 4.0;
    1592  
    1593  #pragma acc data copy (fgot, fdata[0:N])
    1594    {
    1595  #pragma acc parallel loop
    1596      for (i = 0; i < N; i++)
    1597        {
    1598          long long expr = 1LL << N;
    1599  
    1600  #pragma acc atomic capture
    1601          { fgot = fgot / expr; fdata[i] = fgot; }
    1602        }
    1603    }
    1604  
    1605    if (fexp != fgot)
    1606      abort ();
    1607  
    1608    fgot = 4.0;
    1609    fexp = 4.0;
    1610  
    1611  #pragma acc data copy (fgot, fdata[0:N])
    1612    {
    1613  #pragma acc parallel loop
    1614      for (i = 0; i < N; i++)
    1615        {
    1616          float expr = 2.0;
    1617  
    1618  #pragma acc atomic capture
    1619          { fgot = expr / fgot; fdata[i] = fgot; }
    1620        }
    1621    }
    1622  
    1623    if (fexp != fgot)
    1624      abort ();
    1625  
    1626    return 0;
    1627  }