Skip to content
Snippets Groups Projects
  • Tom de Vries's avatar
    15545563
    [libatomic] Add nvptx support · 15545563
    Tom de Vries authored
    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.
    15545563
    History
    [libatomic] Add nvptx support
    Tom de Vries authored
    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.