72 lines
1.4 KiB
C
72 lines
1.4 KiB
C
/* 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;
|
|
}
|