| /* Supply a set of generic atomic functions to test the compiler make the |
| calls properly. */ |
| /* { dg-do compile } */ |
| /* { dg-options "-w" } */ |
| |
| /* Test that the generic builtins make calls as expected. This file provides |
| the exact entry points the test file will require. All these routines |
| simply set the first parameter to 1, and the caller will test for that. */ |
| |
| #include <stddef.h> |
| #include <stdlib.h> |
| #include <stdbool.h> |
| #include <string.h> |
| |
| |
| char |
| __atomic_exchange_1 (char *p, char t, int i) |
| { |
| *p = 1; |
| } |
| |
| short |
| __atomic_load_2 (short *p, int i) |
| { |
| *p = 1; |
| } |
| |
| void |
| __atomic_store_1 (char *p, char v, int i) |
| { |
| *p = 1; |
| } |
| |
| int __atomic_compare_exchange_2 (short *p, short *a, short b, int y, int z) |
| { |
| /* Fail if the memory models aren't correct as that will indicate the external |
| call has failed to remove the weak/strong parameter as required by the |
| library. */ |
| if (y != __ATOMIC_SEQ_CST || z != __ATOMIC_ACQUIRE) |
| *p = 0; |
| else |
| *p = 1; |
| } |
| |
| char __atomic_fetch_add_1 (char *p, char v, int i) |
| { |
| *p = 1; |
| } |
| |
| short __atomic_fetch_add_2 (short *p, short v, int i) |
| { |
| *p = 1; |
| } |
| |
| /* Really perform a NAND. PR51040 showed incorrect calculation of a |
| non-inlined fetch_nand. */ |
| unsigned char |
| __atomic_fetch_nand_1 (unsigned char *p, unsigned char v, int i) |
| { |
| unsigned char ret; |
| |
| ret = *p; |
| *p = ~(*p & v); |
| |
| return ret; |
| } |
| |
| bool __atomic_is_lock_free (size_t i, void *p) |
| { |
| *(short *)p = 1; |
| return true; |
| } |