1  /* Check that addressing modes for atomics are generated as expected.  */
       2  
       3  #define concat_1(x, y) x ## y
       4  #define concat(x, y) concat_1 (x, y)
       5  #define makefuncname(name) concat (concat (test_, __LINE__), name)
       6  
       7  #define emitfuncs(name,val,off)\
       8    char makefuncname (_0) (char* mem)\
       9    {\
      10      return name (mem + off, val, __ATOMIC_ACQ_REL);\
      11    }\
      12    char makefuncname (_1) (void)\
      13    {\
      14      char* mem = (char*)__builtin_thread_pointer ();\
      15      return name (mem + off, val, __ATOMIC_ACQ_REL);\
      16    }\
      17    short makefuncname (_2) (short* mem)\
      18    {\
      19      return name (mem + off, val, __ATOMIC_ACQ_REL);\
      20    }\
      21    short makefuncname (_3) (void)\
      22    {\
      23      short* mem = (short*)__builtin_thread_pointer ();\
      24      return name (mem + off, val, __ATOMIC_ACQ_REL);\
      25    }\
      26    int makefuncname (_4) (int* mem)\
      27    {\
      28      return name (mem + off, val, __ATOMIC_ACQ_REL);\
      29    }\
      30    int makefuncname (_5) (void)\
      31    {\
      32      int* mem = (int*)__builtin_thread_pointer ();\
      33      return name (mem + off, val, __ATOMIC_ACQ_REL);\
      34    }\
      35  
      36  emitfuncs (__atomic_add_fetch, 1, 0)
      37  emitfuncs (__atomic_add_fetch, 1, 4)
      38  
      39  emitfuncs (__atomic_fetch_add, 1, 0)
      40  emitfuncs (__atomic_fetch_add, 1, 4)
      41  
      42  emitfuncs (__atomic_sub_fetch, 1, 0)
      43  emitfuncs (__atomic_sub_fetch, 1, 4)
      44  emitfuncs (__atomic_fetch_sub, 1, 0)
      45  emitfuncs (__atomic_fetch_sub, 1, 4)
      46  
      47  emitfuncs (__atomic_and_fetch, 1, 0)
      48  emitfuncs (__atomic_and_fetch, 1, 4)
      49  emitfuncs (__atomic_fetch_and, 1, 0)
      50  emitfuncs (__atomic_fetch_and, 1, 4)
      51  
      52  emitfuncs (__atomic_or_fetch, 1, 0)
      53  emitfuncs (__atomic_or_fetch, 1, 4)
      54  emitfuncs (__atomic_fetch_or, 1, 0)
      55  emitfuncs (__atomic_fetch_or, 1, 4)
      56  
      57  emitfuncs (__atomic_xor_fetch, 1, 0)
      58  emitfuncs (__atomic_xor_fetch, 1, 4)
      59  emitfuncs (__atomic_fetch_xor, 1, 0)
      60  emitfuncs (__atomic_fetch_xor, 1, 4)
      61  
      62  emitfuncs (__atomic_nand_fetch, 1, 0)
      63  emitfuncs (__atomic_nand_fetch, 1, 4)
      64  emitfuncs (__atomic_fetch_nand, 1, 0)
      65  emitfuncs (__atomic_fetch_nand, 1, 4)
      66  
      67  emitfuncs (__atomic_xor_fetch, -1, 0)
      68  emitfuncs (__atomic_xor_fetch, -1, 4)
      69  emitfuncs (__atomic_fetch_xor, -1, 0)
      70  emitfuncs (__atomic_fetch_xor, -1, 4)
      71  
      72  emitfuncs (__atomic_nand_fetch, -1, 0)
      73  emitfuncs (__atomic_nand_fetch, -1, 4)
      74  emitfuncs (__atomic_fetch_nand, -1, 0)
      75  emitfuncs (__atomic_fetch_nand, -1, 4)
      76  
      77  #undef emitfuncs
      78  #define emitfuncs(off)\
      79    char makefuncname (_6) (char* mem)\
      80    {\
      81      char expected = 1;\
      82      char desired = 5;\
      83      return __atomic_compare_exchange (mem + off, &expected, &desired, 0,\
      84  				      __ATOMIC_ACQ_REL, __ATOMIC_RELAXED);\
      85    }\
      86    char makefuncname (_7) (void)\
      87    {\
      88      char* mem = (char*)__builtin_thread_pointer ();\
      89      char expected = 1;\
      90      char desired = 5;\
      91      return __atomic_compare_exchange (mem + off, &expected, &desired, 0,\
      92  				      __ATOMIC_ACQ_REL, __ATOMIC_RELAXED);\
      93    }\
      94    short makefuncname (_8) (short* mem)\
      95    {\
      96      short expected = 1;\
      97      short desired = 5;\
      98      return __atomic_compare_exchange (mem + off, &expected, &desired, 0,\
      99  				      __ATOMIC_ACQ_REL, __ATOMIC_RELAXED);\
     100    }\
     101    short makefuncname (_9) (void)\
     102    {\
     103      short* mem = (short*)__builtin_thread_pointer ();\
     104      short expected = 1;\
     105      short desired = 5;\
     106      return __atomic_compare_exchange (mem + off, &expected, &desired, 0,\
     107  				      __ATOMIC_ACQ_REL, __ATOMIC_RELAXED);\
     108    }\
     109    int makefuncname (_10) (int* mem)\
     110    {\
     111      int expected = 1;\
     112      int desired = 5;\
     113      return __atomic_compare_exchange (mem + off, &expected, &desired, 0,\
     114  				      __ATOMIC_ACQ_REL, __ATOMIC_RELAXED);\
     115    }\
     116    int makefuncname (_11) (void)\
     117    {\
     118      int* mem = (int*)__builtin_thread_pointer ();\
     119      int expected = 1;\
     120      int desired = 5;\
     121      return __atomic_compare_exchange (mem + off, &expected, &desired, 0,\
     122  				      __ATOMIC_ACQ_REL, __ATOMIC_RELAXED);\
     123    }\
     124    char makefuncname (_12) (char* mem)\
     125    {\
     126      char newval = 5;\
     127      char prevval;\
     128      __atomic_exchange (mem + off, &newval, &prevval, __ATOMIC_ACQ_REL);\
     129      return prevval;\
     130    }\
     131    char makefuncname (_13) (void)\
     132    {\
     133      char* mem = (char*)__builtin_thread_pointer ();\
     134      char newval = 5;\
     135      char prevval;\
     136      __atomic_exchange (mem + off, &newval, &prevval, __ATOMIC_ACQ_REL);\
     137      return prevval;\
     138    }\
     139    short makefuncname (_14) (short* mem)\
     140    {\
     141      short newval = 5;\
     142      short prevval;\
     143      __atomic_exchange (mem + off, &newval, &prevval, __ATOMIC_ACQ_REL);\
     144      return prevval;\
     145    }\
     146    short makefuncname (_15) (void)\
     147    {\
     148      short* mem = (short*)__builtin_thread_pointer ();\
     149      short newval = 5;\
     150      short prevval;\
     151      __atomic_exchange (mem + off, &newval, &prevval, __ATOMIC_ACQ_REL);\
     152      return prevval;\
     153    }\
     154    int makefuncname (_16) (int* mem)\
     155    {\
     156      int newval = 5;\
     157      int prevval;\
     158      __atomic_exchange (mem + off, &newval, &prevval, __ATOMIC_ACQ_REL);\
     159      return prevval;\
     160    }\
     161    int makefuncname (_17) (void)\
     162    {\
     163      int* mem = (int*)__builtin_thread_pointer ();\
     164      int newval = 5;\
     165      int prevval;\
     166      __atomic_exchange (mem + off, &newval, &prevval, __ATOMIC_ACQ_REL);\
     167      return prevval;\
     168    }\
     169  
     170  emitfuncs (0)
     171  emitfuncs (4)