1554556312
Add nvptx support to libatomic. Given that atomic_test_and_set is not implemented for nvptx (PR96964), the compiler translates __atomic_test_and_set falling back onto the "Failing all else, assume a single threaded environment and simply perform the operation" case in expand_atomic_test_and_set, so it doesn't map onto an actual atomic operation. Still, that counts as supported for the configure test of libatomic, so we end up with HAVE_ATOMIC_TAS_1/2/4/8/16 == 1, and the corresponding __atomic_test_and_set_1/2/4/8/16 in libatomic all using that non-atomic implementation. Fix this by adding an atomic_test_and_set expansion for nvptx, that uses libatomics __atomic_test_and_set_1. This again makes the configure tests for HAVE_ATOMIC_TAS_1/2/4/8/16 fail, so instead we use this case in tas_n.c: ... /* If this type is smaller than word-sized, fall back to a word-sized compare-and-swap loop. */ bool SIZE(libat_test_and_set) (UTYPE *mptr, int smodel) ... which for __atomic_test_and_set_8 uses INVERT_MASK_8. Add INVERT_MASK_8 in libatomic_i.h, as well as MASK_8. Tested libatomic testsuite on nvptx. gcc/ChangeLog: PR target/96964 * config/nvptx/nvptx.md (define_expand "atomic_test_and_set"): New expansion. libatomic/ChangeLog: PR target/96898 * configure.tgt: Add nvptx. * libatomic_i.h (MASK_8, INVERT_MASK_8): New macro definition. * config/nvptx/host-config.h: New file. * config/nvptx/lock.c: New file. |
||
---|---|---|
.. | ||
config | ||
testsuite | ||
.gitignore | ||
acinclude.m4 | ||
aclocal.m4 | ||
auto-config.h.in | ||
cas_n.c | ||
ChangeLog | ||
configure | ||
configure.ac | ||
configure.tgt | ||
exch_n.c | ||
fadd_n.c | ||
fand_n.c | ||
fence.c | ||
fenv.c | ||
fior_n.c | ||
flag.c | ||
fnand_n.c | ||
fop_n.c | ||
fsub_n.c | ||
fxor_n.c | ||
gcas.c | ||
gexch.c | ||
glfree.c | ||
gload.c | ||
gstore.c | ||
host-config.h | ||
init.c | ||
libatomic_i.h | ||
libatomic.map | ||
load_n.c | ||
Makefile.am | ||
Makefile.in | ||
store_n.c | ||
tas_n.c |