[libatomic] Add nvptx support
authorTom de Vries <tdevries@suse.de>
Mon, 7 Sep 2020 08:47:25 +0000 (10:47 +0200)
committerTom de Vries <tdevries@suse.de>
Fri, 11 Sep 2020 10:06:15 +0000 (12:06 +0200)
commit15545563128f0240192c263522d4a36b7f86250f
tree746bb4c9e006aa697779062ec38bfd6e35ff6fea
parent8ae0de5621120b16295fe6b73ca044d4c576af6d
[libatomic] Add nvptx support

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.
gcc/config/nvptx/nvptx.md
libatomic/config/nvptx/host-config.h [new file with mode: 0644]
libatomic/config/nvptx/lock.c [new file with mode: 0644]
libatomic/configure.tgt
libatomic/libatomic_i.h