1
1
Signed-off-by: Ralph Castain <rhc@open-mpi.org>
Этот коммит содержится в:
Ralph Castain 2017-08-10 15:42:39 -07:00
родитель 03544d7cfa
Коммит 4290247d64
77 изменённых файлов: 360 добавлений и 5655 удалений

Просмотреть файл

@ -30,7 +30,7 @@ greek=
# command, or with the date (if "git describe" fails) in the form of
# "date<date>".
repo_rev=git59f8ecb
repo_rev=gite38cd0a
# If tarball_version is not empty, it is used as the version string in
# the tarball filename, regardless of all other versions listed in
@ -44,7 +44,7 @@ tarball_version=
# The date when this release was created
date="Jul 21, 2017"
date="Aug 10, 2017"
# The shared library version of each of PMIx's public libraries.
# These versions are maintained in accordance with the "Library

Просмотреть файл

@ -757,7 +757,6 @@ AC_DEFUN([PMIX_SETUP_CORE],[
pmix_config_prefix[Makefile]
pmix_config_prefix[config/Makefile]
pmix_config_prefix[include/Makefile]
pmix_config_prefix[src/atomics/asm/Makefile]
pmix_config_prefix[src/Makefile]
pmix_config_prefix[src/util/keyval/Makefile]
pmix_config_prefix[src/mca/base/Makefile]
@ -937,25 +936,6 @@ AC_DEFINE_UNQUOTED([PMIX_WANT_PRETTY_PRINT_STACKTRACE],
[$WANT_PRETTY_PRINT_STACKTRACE],
[if want pretty-print stack trace feature])
#
# Do we want the shared memory datastore usage?
#
AC_MSG_CHECKING([if want shared memory datastore])
AC_ARG_ENABLE([dstore],
[AC_HELP_STRING([--disable-dstore],
[Using shared memory datastore (default: enabled)])])
if test "$enable_dstore" = "no" ; then
AC_MSG_RESULT([no])
WANT_DSTORE=0
else
AC_MSG_RESULT([yes])
WANT_DSTORE=1
fi
AC_DEFINE_UNQUOTED([PMIX_ENABLE_DSTORE],
[$WANT_DSTORE],
[if want shared memory dstore feature])
#
# Use pthread-based locking
#

Просмотреть файл

@ -55,7 +55,6 @@ AC_DEFUN([PMIX_CHECK_DSTOR_LOCK],[
if test "$_x_ac_fcntl_lock_found" = "0"; then
AC_MSG_ERROR([dstore: no available locking mechanisms was found. Can not continue. Try disabling dstore])
fi
LIBS="$orig_libs"
fi
LIBS="$orig_libs"
])

Просмотреть файл

@ -12,6 +12,7 @@
# All rights reserved.
# Copyright (c) 2006-2015 Cisco Systems, Inc. All rights reserved.
# Copyright (c) 2009-2011 Oracle and/or its affiliates. All rights reserved.
# Copyright (c) 2017 Intel, Inc. All rights reserved.
# $COPYRIGHT$
#
# Additional copyrights may follow
@ -86,7 +87,7 @@ AC_DEFUN([PMIX_CHECK_VISIBILITY],[
unset pmix_add
fi
AC_DEFINE_UNQUOTED([PMIX_C_HAVE_VISIBILITY], [$WANT_VISIBILITY],
AC_DEFINE_UNQUOTED([PMIX_HAVE_VISIBILITY], [$WANT_VISIBILITY],
[Whether C compiler supports symbol visibility or not])
AM_CONDITIONAL([WANT_HIDDEN],[test "$WANT_VISIBILITY" = "1"])
])

Просмотреть файл

@ -13,7 +13,7 @@ dnl Copyright (c) 2008-2015 Cisco Systems, Inc. All rights reserved.
dnl Copyright (c) 2010 Oracle and/or its affiliates. All rights reserved.
dnl Copyright (c) 2015-2017 Research Organization for Information Science
dnl and Technology (RIST). All rights reserved.
dnl Copyright (c) 2014-2016 Los Alamos National Security, LLC. All rights
dnl Copyright (c) 2014-2017 Los Alamos National Security, LLC. All rights
dnl reserved.
dnl Copyright (c) 2017 Amazon.com, Inc. or its affiliates. All Rights
dnl reserved.
@ -194,9 +194,15 @@ AC_DEFUN([PMIX_CHECK_GCC_BUILTIN_CSWAP_INT128], [
AC_DEFUN([PMIX_CHECK_GCC_ATOMIC_BUILTINS], [
AC_MSG_CHECKING([for __atomic builtin atomics])
AC_TRY_LINK([long tmp, old = 0;], [__atomic_thread_fence(__ATOMIC_SEQ_CST);
AC_TRY_LINK([
#include <stdint.h>
uint32_t tmp, old = 0;
uint64_t tmp64, old64 = 0;], [
__atomic_thread_fence(__ATOMIC_SEQ_CST);
__atomic_compare_exchange_n(&tmp, &old, 1, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
__atomic_add_fetch(&tmp, 1, __ATOMIC_RELAXED);],
__atomic_add_fetch(&tmp, 1, __ATOMIC_RELAXED);
__atomic_compare_exchange_n(&tmp64, &old64, 1, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
__atomic_add_fetch(&tmp64, 1, __ATOMIC_RELAXED);],
[AC_MSG_RESULT([yes])
$1],
[AC_MSG_RESULT([no])
@ -879,6 +885,7 @@ return ret;
if test "$asm_result" = "yes" ; then
PMIX_C_GCC_INLINE_ASSEMBLY=1
pmix_cv_asm_inline_supported="yes"
else
PMIX_C_GCC_INLINE_ASSEMBLY=0
fi
@ -890,70 +897,6 @@ return ret;
unset PMIX_C_GCC_INLINE_ASSEMBLY assembly asm_result
])dnl
dnl #################################################################
dnl
dnl PMIX_CHECK_INLINE_DEC
dnl
dnl DEFINE PMIX_DEC to 0 or 1 depending on DEC
dnl support
dnl
dnl #################################################################
AC_DEFUN([PMIX_CHECK_INLINE_C_DEC],[
AC_MSG_CHECKING([if $CC supports DEC inline assembly])
AC_LINK_IFELSE([AC_LANG_PROGRAM([
AC_INCLUDES_DEFAULT
#include <c_asm.h>],
[[asm("");
return 0;]])],
[asm_result="yes"], [asm_result="no"])
AC_MSG_RESULT([$asm_result])
if test "$asm_result" = "yes" ; then
PMIX_C_DEC_INLINE_ASSEMBLY=1
else
PMIX_C_DEC_INLINE_ASSEMBLY=0
fi
AC_DEFINE_UNQUOTED([PMIX_C_DEC_INLINE_ASSEMBLY],
[$PMIX_C_DEC_INLINE_ASSEMBLY],
[Whether C compiler supports DEC style inline assembly])
unset PMIX_C_DEC_INLINE_ASSEMBLY asm_result
])dnl
dnl #################################################################
dnl
dnl PMIX_CHECK_INLINE_XLC
dnl
dnl DEFINE PMIX_XLC to 0 or 1 depending on XLC
dnl support
dnl
dnl #################################################################
AC_DEFUN([PMIX_CHECK_INLINE_C_XLC],[
AC_MSG_CHECKING([if $CC supports XLC inline assembly])
PMIX_C_XLC_INLINE_ASSEMBLY=0
asm_result="no"
if test "$CC" = "xlc" ; then
PMIX_XLC_INLINE_ASSEMBLY=1
asm_result="yes"
fi
AC_MSG_RESULT([$asm_result])
AC_DEFINE_UNQUOTED([PMIX_C_XLC_INLINE_ASSEMBLY],
[$PMIX_C_XLC_INLINE_ASSEMBLY],
[Whether C compiler supports XLC style inline assembly])
unset PMIX_C_XLC_INLINE_ASSEMBLY
])dnl
dnl #################################################################
dnl
dnl PMIX_CONFIG_ASM
@ -975,12 +918,12 @@ AC_DEFUN([PMIX_CONFIG_ASM],[
[], [enable_builtin_atomics="yes"])
pmix_cv_asm_builtin="BUILTIN_NO"
if test "$pmix_cv_asm_builtin" = "BUILTIN_NO" && test "$enable_builtin_atomics" = "yes" ; then
PMIX_CHECK_GCC_ATOMIC_BUILTINS([pmix_cv_asm_builtin="BUILTIN_GCC"], [])
fi
if test "$pmix_cv_asm_builtin" = "BUILTIN_NO" && test "$enable_builtin_atomics" = "yes" ; then
PMIX_CHECK_SYNC_BUILTINS([pmix_cv_asm_builtin="BUILTIN_SYNC"], [])
fi
AS_IF([test "$pmix_cv_asm_builtin" = "BUILTIN_NO" && test "$enable_builtin_atomics" != "no"],
[PMIX_CHECK_GCC_ATOMIC_BUILTINS([pmix_cv_asm_builtin="BUILTIN_GCC"], [])])
AS_IF([test "$pmix_cv_asm_builtin" = "BUILTIN_NO" && test "$enable_builtin_atomics" != "no"],
[PMIX_CHECK_SYNC_BUILTINS([pmix_cv_asm_builtin="BUILTIN_SYNC"], [])])
AS_IF([test "$pmix_cv_asm_builtin" = "BUILTIN_NO" && test "$enable_builtin_atomics" = "yes"],
[AC_MSG_WARN([__sync builtin atomics requested but not found - proceeding with inline atomics])])
PMIX_CHECK_ASM_PROC
PMIX_CHECK_ASM_TEXT
@ -1084,17 +1027,19 @@ AC_DEFUN([PMIX_CONFIG_ASM],[
fi
PMIX_GCC_INLINE_ASSIGN='"1: li %0,0" : "=&r"(ret)'
;;
# There is no current difference between s390 and s390x
# But use two different defines in case some come later
# as s390 is 31bits while s390x is 64bits
s390-*)
pmix_cv_asm_arch="S390"
PMIX_CHECK_SYNC_BUILTINS([pmix_cv_asm_builtin="BUILTIN_SYNC"],
[AC_MSG_ERROR([No atomic primitives available for $host])])
;;
s390x-*)
pmix_cv_asm_arch="S390X"
PMIX_CHECK_SYNC_BUILTINS([pmix_cv_asm_builtin="BUILTIN_SYNC"],
[AC_MSG_ERROR([No atomic primitives available for $host])])
;;
sparc*-*)
# SPARC v9 (and above) are the only ones with 64bit support
# if compiling 32 bit, see if we are v9 (aka v8plus) or
@ -1156,10 +1101,9 @@ AC_MSG_ERROR([Can not continue.])
;;
esac
pmix_cv_asm_inline_supported="no"
# now that we know our architecture, try to inline assemble
PMIX_CHECK_INLINE_C_GCC([$PMIX_GCC_INLINE_ASSIGN])
PMIX_CHECK_INLINE_C_DEC
PMIX_CHECK_INLINE_C_XLC
# format:
# config_file-text-global-label_suffix-gsym-lsym-type-size-align_log-ppc_r_reg-64_bit-gnu_stack
@ -1244,64 +1188,10 @@ AC_DEFUN([PMIX_ASM_FIND_FILE], [
AC_REQUIRE([AC_PROG_GREP])
AC_REQUIRE([AC_PROG_FGREP])
if test "$pmix_cv_asm_arch" != "WINDOWS" && test "$pmix_cv_asm_builtin" != "BUILTIN_SYNC" && test "$pmix_cv_asm_builtin" != "BUILTIN_GCC" && test "$pmix_cv_asm_builtin" != "BUILTIN_OSX" ; then
# see if we have a pre-built one already
AC_MSG_CHECKING([for pre-built assembly file])
pmix_cv_asm_file=""
if $GREP "$pmix_cv_asm_arch" "${PMIX_TOP_SRCDIR}/src/atomics/asm/asm-data.txt" | $FGREP "$pmix_cv_asm_format" >conftest.out 2>&1 ; then
pmix_cv_asm_file="`cut -f3 conftest.out`"
if test ! "$pmix_cv_asm_file" = "" ; then
pmix_cv_asm_file="atomic-${pmix_cv_asm_file}.s"
if test -f "${PMIX_TOP_SRCDIR}/src/atomics/asm/generated/${pmix_cv_asm_file}" ; then
AC_MSG_RESULT([yes ($pmix_cv_asm_file)])
else
AC_MSG_RESULT([no ($pmix_cv_asm_file not found)])
pmix_cv_asm_file=""
fi
fi
else
AC_MSG_RESULT([no (not in asm-data)])
fi
rm -rf conftest.*
if test "$pmix_cv_asm_file" = "" ; then
# Can we generate a file?
AC_MSG_CHECKING([whether possible to generate assembly file])
mkdir -p pmix/asm/generated
pmix_cv_asm_file="atomic-local.s"
pmix_try='$PERL $PMIX_TOP_SRCDIR/src/atomics/asm/generate-asm.pl $pmix_cv_asm_arch "$pmix_cv_asm_format" $PMIX_TOP_SRCDIR/src/atomics/asm/base $PMIX_TOP_BUILDDIR/src/atomics/asm/generated/$pmix_cv_asm_file >conftest.out 2>&1'
if AC_TRY_EVAL(pmix_try) ; then
# save the warnings
cat conftest.out >&AC_FD_CC
AC_MSG_RESULT([yes])
else
# save output
cat conftest.out >&AC_FD_CC
pmix_cv_asm_file=""
AC_MSG_RESULT([failed])
AC_MSG_WARN([Could not build atomic operations assembly file.])
AC_MSG_WARN([There will be no atomic operations for this build.])
fi
fi
rm -rf conftest.*
if test "$pmix_cv_asm_arch" != "WINDOWS" && test "$pmix_cv_asm_builtin" != "BUILTIN_SYNC" && test "$pmix_cv_asm_builtin" != "BUILTIN_GCC" && test "$pmix_cv_asm_builtin" != "BUILTIN_OSX" && test "$pmix_cv_asm_inline_arch" = "no" ; then
AC_MSG_ERROR([no atomic support available. exiting])
else
# On windows with VC++, atomics are done with compiler primitives
pmix_cv_asm_file=""
fi
AC_MSG_CHECKING([for atomic assembly filename])
if test "$pmix_cv_asm_file" = "" ; then
AC_MSG_RESULT([none])
result=0
else
AC_MSG_RESULT([$pmix_cv_asm_file])
result=1
fi
AC_DEFINE_UNQUOTED([PMIX_HAVE_ASM_FILE], [$result],
[Whether there is an atomic assembly file available])
AM_CONDITIONAL([PMIX_HAVE_ASM_FILE], [test "$result" = "1"])
PMIX_ASM_FILE=$pmix_cv_asm_file
AC_SUBST(PMIX_ASM_FILE)
])dnl

Просмотреть файл

@ -48,6 +48,12 @@
#ifndef PMI_H
#define PMI_H
#ifdef PMIX_HAVE_VISIBILITY
#define PMIX_EXPORT __attribute__((__visibility__("default")))
#else
#define PMIX_EXPORT
#endif
/* prototypes for the PMI interface in MPICH2 */
#if defined(__cplusplus)
@ -119,7 +125,7 @@ this process was created by 'PMI_Spawn_multiple'. 'spawned' will be 'PMI_TRUE'
this process group has a parent and 'PMI_FALSE' if it does not.
@*/
int PMI_Init( int *spawned );
PMIX_EXPORT int PMI_Init( int *spawned );
/*@
PMI_Initialized - check if PMI has been initialized
@ -139,7 +145,7 @@ On successful output, initialized will either be 'PMI_TRUE' or 'PMI_FALSE'.
- PMI_FALSE - initialize has not been called or previously failed.
@*/
int PMI_Initialized( PMI_BOOL *initialized );
PMIX_EXPORT int PMI_Initialized( PMI_BOOL *initialized );
/*@
PMI_Finalize - finalize the Process Manager Interface
@ -152,7 +158,7 @@ Notes:
Finalize PMI for this process group.
@*/
int PMI_Finalize( void );
PMIX_EXPORT int PMI_Finalize( void );
/*@
PMI_Get_size - obtain the size of the process group
@ -170,7 +176,7 @@ This function returns the size of the process group to which the local process
belongs.
@*/
int PMI_Get_size( int *size );
PMIX_EXPORT int PMI_Get_size( int *size );
/*@
PMI_Get_rank - obtain the rank of the local process in the process group
@ -187,7 +193,7 @@ Notes:
This function returns the rank of the local process in its process group.
@*/
int PMI_Get_rank( int *rank );
PMIX_EXPORT int PMI_Get_rank( int *rank );
/*@
PMI_Get_universe_size - obtain the universe size
@ -202,7 +208,7 @@ Return values:
@*/
int PMI_Get_universe_size( int *size );
PMIX_EXPORT int PMI_Get_universe_size( int *size );
/*@
PMI_Get_appnum - obtain the application number
@ -217,7 +223,7 @@ Return values:
@*/
int PMI_Get_appnum( int *appnum );
PMIX_EXPORT int PMI_Get_appnum( int *appnum );
/*@
PMI_Publish_name - publish a name
@ -233,7 +239,7 @@ Return values:
@*/
int PMI_Publish_name( const char service_name[], const char port[] );
PMIX_EXPORT int PMI_Publish_name( const char service_name[], const char port[] );
/*@
PMI_Unpublish_name - unpublish a name
@ -248,7 +254,7 @@ Return values:
@*/
int PMI_Unpublish_name( const char service_name[] );
PMIX_EXPORT int PMI_Unpublish_name( const char service_name[] );
/*@
PMI_Lookup_name - lookup a service by name
@ -266,7 +272,7 @@ Return values:
@*/
int PMI_Lookup_name( const char service_name[], char port[] );
PMIX_EXPORT int PMI_Lookup_name( const char service_name[], char port[] );
/*@
PMI_Get_id - obtain the id of the process group
@ -289,7 +295,7 @@ that the local process belongs to. The string passed in must be at least
as long as the number returned by 'PMI_Get_id_length_max()'.
@*/
int PMI_Get_id( char id_str[], int length );
PMIX_EXPORT int PMI_Get_id( char id_str[], int length );
/*@
PMI_Get_kvs_domain_id - obtain the id of the PMI domain
@ -312,7 +318,7 @@ where keyval spaces can be shared. The string passed in must be at least
as long as the number returned by 'PMI_Get_id_length_max()'.
@*/
int PMI_Get_kvs_domain_id( char id_str[], int length );
PMIX_EXPORT int PMI_Get_kvs_domain_id( char id_str[], int length );
/*@
PMI_Get_id_length_max - obtain the maximum length of an id string
@ -329,7 +335,7 @@ Notes:
This function returns the maximum length of a process group id string.
@*/
int PMI_Get_id_length_max( int *length );
PMIX_EXPORT int PMI_Get_id_length_max( int *length );
/*@
PMI_Barrier - barrier across the process group
@ -344,7 +350,7 @@ the local process belongs to. It will not return until all the processes
have called 'PMI_Barrier()'.
@*/
int PMI_Barrier( void );
PMIX_EXPORT int PMI_Barrier( void );
/*@
PMI_Get_clique_size - obtain the number of processes on the local node
@ -364,7 +370,7 @@ function to distinguish between processes that can communicate through IPC
mechanisms (e.g., shared memory) and other network mechanisms.
@*/
int PMI_Get_clique_size( int *size );
PMIX_EXPORT int PMI_Get_clique_size( int *size );
/*@
PMI_Get_clique_ranks - get the ranks of the local processes in the process group
@ -389,7 +395,7 @@ communicate through IPC mechanisms (e.g., shared memory) and other network
mechanisms.
@*/
int PMI_Get_clique_ranks( int ranks[], int length);
PMIX_EXPORT int PMI_Get_clique_ranks( int ranks[], int length);
/*@
PMI_Abort - abort the process group associated with this process
@ -401,7 +407,7 @@ Input Parameters:
Return values:
. none - this function should not return
@*/
int PMI_Abort(int exit_code, const char error_msg[]);
PMIX_EXPORT int PMI_Abort(int exit_code, const char error_msg[]);
/* PMI Keymap functions */
/*@
@ -426,7 +432,7 @@ kvsname, must be at least as long as the value returned by
'PMI_KVS_Get_name_length_max()'.
@*/
int PMI_KVS_Get_my_name( char kvsname[], int length );
PMIX_EXPORT int PMI_KVS_Get_my_name( char kvsname[], int length );
/*@
PMI_KVS_Get_name_length_max - obtain the length necessary to store a kvsname
@ -448,7 +454,7 @@ different implementations may allow different maximum lengths; by using a
routine here, we can interface with a variety of implementations of PMI.
@*/
int PMI_KVS_Get_name_length_max( int *length );
PMIX_EXPORT int PMI_KVS_Get_name_length_max( int *length );
/*@
PMI_KVS_Get_key_length_max - obtain the length necessary to store a key
@ -465,7 +471,7 @@ Notes:
This function returns the string length required to store a key.
@*/
int PMI_KVS_Get_key_length_max( int *length );
PMIX_EXPORT int PMI_KVS_Get_key_length_max( int *length );
/*@
PMI_KVS_Get_value_length_max - obtain the length necessary to store a value
@ -483,7 +489,7 @@ This function returns the string length required to store a value from a
keyval space.
@*/
int PMI_KVS_Get_value_length_max( int *length );
PMIX_EXPORT int PMI_KVS_Get_value_length_max( int *length );
/*@
PMI_KVS_Create - create a new keyval space
@ -508,7 +514,7 @@ parameter, kvsname, must be at least as long as the value returned by
'PMI_KVS_Get_name_length_max()'.
@*/
int PMI_KVS_Create( char kvsname[], int length );
PMIX_EXPORT int PMI_KVS_Create( char kvsname[], int length );
/*@
PMI_KVS_Destroy - destroy keyval space
@ -525,7 +531,7 @@ Notes:
This function destroys a keyval space created by 'PMI_KVS_Create()'.
@*/
int PMI_KVS_Destroy( const char kvsname[] );
PMIX_EXPORT int PMI_KVS_Destroy( const char kvsname[] );
/*@
PMI_KVS_Put - put a key/value pair in a keyval space
@ -551,7 +557,7 @@ space must be unique to the keyval space. You may not put more than once
with the same key.
@*/
int PMI_KVS_Put( const char kvsname[], const char key[], const char value[]);
PMIX_EXPORT int PMI_KVS_Put( const char kvsname[], const char key[], const char value[]);
/*@
PMI_KVS_Commit - commit all previous puts to the keyval space
@ -569,7 +575,7 @@ This function commits all previous puts since the last 'PMI_KVS_Commit()' into
the specified keyval space. It is a process local operation.
@*/
int PMI_KVS_Commit( const char kvsname[] );
PMIX_EXPORT int PMI_KVS_Commit( const char kvsname[] );
/*@
PMI_KVS_Get - get a key/value pair from a keyval space
@ -594,7 +600,7 @@ Notes:
This function gets the value of the specified key in the keyval space.
@*/
int PMI_KVS_Get( const char kvsname[], const char key[], char value[], int length);
PMIX_EXPORT int PMI_KVS_Get( const char kvsname[], const char key[], char value[], int length);
/*@
PMI_KVS_Iter_first - initialize the iterator and get the first value
@ -625,7 +631,7 @@ the values returned by 'PMI_KVS_Get_key_length_max()' and
'PMI_KVS_Get_value_length_max()'.
@*/
int PMI_KVS_Iter_first(const char kvsname[], char key[], int key_len, char val[], int val_len);
PMIX_EXPORT int PMI_KVS_Iter_first(const char kvsname[], char key[], int key_len, char val[], int val_len);
/*@
PMI_KVS_Iter_next - get the next keyval pair from the keyval space
@ -656,7 +662,7 @@ key and val, must be at least as long as the values returned by
'PMI_KVS_Get_key_length_max()' and 'PMI_KVS_Get_value_length_max()'.
@*/
int PMI_KVS_Iter_next(const char kvsname[], char key[], int key_len, char val[], int val_len);
PMIX_EXPORT int PMI_KVS_Iter_next(const char kvsname[], char key[], int key_len, char val[], int val_len);
/* PMI Process Creation functions */
@ -710,15 +716,15 @@ maxprocs. The acceptable number of processes spawned may be controlled by
mpiexec in the MPI-2 standard. Environment variables may be passed to the
spawned processes through PMI implementation specific 'info_keyval' parameters.
@*/
int PMI_Spawn_multiple(int count,
const char * cmds[],
const char ** argvs[],
const int maxprocs[],
const int info_keyval_sizesp[],
const PMI_keyval_t * info_keyval_vectors[],
int preput_keyval_size,
const PMI_keyval_t preput_keyval_vector[],
int errors[]);
PMIX_EXPORT int PMI_Spawn_multiple(int count,
const char * cmds[],
const char ** argvs[],
const int maxprocs[],
const int info_keyval_sizesp[],
const PMI_keyval_t * info_keyval_vectors[],
int preput_keyval_size,
const PMI_keyval_t preput_keyval_vector[],
int errors[]);
/*@
@ -752,7 +758,7 @@ arguments in the args array, this function may parse more than one argument as l
as the options are contiguous in the args array.
@*/
int PMI_Parse_option(int num_args, char *args[], int *num_parsed, PMI_keyval_t **keyvalp, int *size);
PMIX_EXPORT int PMI_Parse_option(int num_args, char *args[], int *num_parsed, PMI_keyval_t **keyvalp, int *size);
/*@
PMI_Args_to_keyval - create keyval structures from command line arguments
@ -779,7 +785,7 @@ not be used to free this array as there is no requirement that the array be
allocated with 'malloc()'.
@*/
int PMI_Args_to_keyval(int *argcp, char *((*argvp)[]), PMI_keyval_t **keyvalp, int *size);
PMIX_EXPORT int PMI_Args_to_keyval(int *argcp, char *((*argvp)[]), PMI_keyval_t **keyvalp, int *size);
/*@
PMI_Free_keyvals - free the keyval structures created by PMI_Args_to_keyval
@ -798,7 +804,7 @@ Notes:
Using this routine instead of 'free' allows the PMI package to track
allocation of storage or to use interal storage as it sees fit.
@*/
int PMI_Free_keyvals(PMI_keyval_t keyvalp[], int size);
PMIX_EXPORT int PMI_Free_keyvals(PMI_keyval_t keyvalp[], int size);
/*@
PMI_Get_options - get a string of command line argument descriptions that may be printed to the user
@ -820,7 +826,7 @@ Return values:
Notes:
This function returns the command line options specific to the pmi implementation
@*/
int PMI_Get_options(char *str, int *length);
PMIX_EXPORT int PMI_Get_options(char *str, int *length);
#if defined(__cplusplus)
}

Просмотреть файл

@ -7,6 +7,12 @@
#ifndef PMI2_H_INCLUDED
#define PMI2_H_INCLUDED
#ifdef PMIX_HAVE_VISIBILITY
#define PMIX_EXPORT __attribute__((__visibility__("default")))
#else
#define PMIX_EXPORT
#endif
#define PMI2_MAX_KEYLEN 64
#define PMI2_MAX_VALLEN 1024
#define PMI2_MAX_ATTRVALUE 1024
@ -117,7 +123,7 @@ typedef struct PMI2_Connect_comm {
iff this process group has a parent.
@*/
int PMI2_Init(int *spawned, int *size, int *rank, int *appnum);
PMIX_EXPORT int PMI2_Init(int *spawned, int *size, int *rank, int *appnum);
/*@
PMI2_Finalize - finalize the Process Manager Interface
@ -129,7 +135,7 @@ int PMI2_Init(int *spawned, int *size, int *rank, int *appnum);
Finalize PMI for this job.
@*/
int PMI2_Finalize(void);
PMIX_EXPORT int PMI2_Finalize(void);
/*@
PMI2_Initialized - check if PMI has been initialized
@ -138,7 +144,7 @@ int PMI2_Finalize(void);
Non-zero if PMI2_Initialize has been called successfully, zero otherwise.
@*/
int PMI2_Initialized(void);
PMIX_EXPORT int PMI2_Initialized(void);
/*@
PMI2_Abort - abort the process group associated with this process
@ -152,7 +158,7 @@ int PMI2_Initialized(void);
error code otherwise.
@*/
int PMI2_Abort(int flag, const char msg[]);
PMIX_EXPORT int PMI2_Abort(int flag, const char msg[]);
/*@
PMI2_Spawn - spawn a new set of processes
@ -191,15 +197,15 @@ int PMI2_Abort(int flag, const char msg[]);
mpiexec in the MPI-2 standard. Environment variables may be passed to the
spawned processes through PMI implementation specific 'info_keyval' parameters.
@*/
int PMI2_Job_Spawn(int count, const char * cmds[],
int argcs[], const char ** argvs[],
const int maxprocs[],
const int info_keyval_sizes[],
const PMI_keyval_t *info_keyval_vectors[],
int preput_keyval_size,
const PMI_keyval_t *preput_keyval_vector[],
char jobId[], int jobIdSize,
int errors[]);
PMIX_EXPORT int PMI2_Job_Spawn(int count, const char * cmds[],
int argcs[], const char ** argvs[],
const int maxprocs[],
const int info_keyval_sizes[],
const PMI_keyval_t *info_keyval_vectors[],
int preput_keyval_size,
const PMI_keyval_t *preput_keyval_vector[],
char jobId[], int jobIdSize,
int errors[]);
/*@
PMI2_Job_GetId - get job id of this job
@ -214,7 +220,7 @@ int PMI2_Job_Spawn(int count, const char * cmds[],
Returns 'PMI2_SUCCESS' on success and an PMI error code on failure.
@*/
int PMI2_Job_GetId(char jobid[], int jobid_size);
PMIX_EXPORT int PMI2_Job_GetId(char jobid[], int jobid_size);
/*@
PMI2_Job_GetRank - get rank of this job
@ -223,7 +229,7 @@ int PMI2_Job_GetId(char jobid[], int jobid_size);
Return values:
Returns 'PMI2_SUCCESS' on success and an PMI error code on failure.
@*/
int PMI2_Job_GetRank(int* rank);
PMIX_EXPORT int PMI2_Job_GetRank(int* rank);
/*@
PMI2_Info_GetSize - get the number of processes on the node
@ -232,7 +238,7 @@ int PMI2_Job_GetRank(int* rank);
Return values:
Returns 'PMI2_SUCCESS' on success and an PMI error code on failure.
@*/
int PMI2_Info_GetSize(int* size);
PMIX_EXPORT int PMI2_Info_GetSize(int* size);
/*@
PMI2_Job_Connect - connect to the parallel job with ID jobid
@ -256,7 +262,7 @@ int PMI2_Info_GetSize(int* size);
side. Processes that are already connected may call this routine.
@*/
int PMI2_Job_Connect(const char jobid[], PMI2_Connect_comm_t *conn);
PMIX_EXPORT int PMI2_Job_Connect(const char jobid[], PMI2_Connect_comm_t *conn);
/*@
PMI2_Job_Disconnect - disconnects from the job with ID jobid
@ -268,7 +274,7 @@ int PMI2_Job_Connect(const char jobid[], PMI2_Connect_comm_t *conn);
Returns 'PMI2_SUCCESS' on success and an PMI error code on failure.
@*/
int PMI2_Job_Disconnect(const char jobid[]);
PMIX_EXPORT int PMI2_Job_Disconnect(const char jobid[]);
/*@
PMI2_KVS_Put - put a key/value pair in the keyval space for this job
@ -287,7 +293,7 @@ int PMI2_Job_Disconnect(const char jobid[]);
is not defined.
@*/
int PMI2_KVS_Put(const char key[], const char value[]);
PMIX_EXPORT int PMI2_KVS_Put(const char key[], const char value[]);
/*@
PMI2_KVS_Fence - commit all PMI2_KVS_Put calls made before this fence
@ -307,7 +313,7 @@ int PMI2_KVS_Put(const char key[], const char value[]);
implementations.
@*/
int PMI2_KVS_Fence(void);
PMIX_EXPORT int PMI2_KVS_Fence(void);
/*@
PMI2_KVS_Get - returns the value associated with key in the key-value
@ -331,7 +337,7 @@ int PMI2_KVS_Fence(void);
Returns 'PMI2_SUCCESS' on success and an PMI error code on failure.
@*/
int PMI2_KVS_Get(const char *jobid, int src_pmi_id, const char key[], char value [], int maxvalue, int *vallen);
PMIX_EXPORT int PMI2_KVS_Get(const char *jobid, int src_pmi_id, const char key[], char value [], int maxvalue, int *vallen);
/*@
PMI2_Info_GetNodeAttr - returns the value of the attribute associated
@ -371,7 +377,7 @@ int PMI2_KVS_Get(const char *jobid, int src_pmi_id, const char key[], char value
file. Returned as a string.
@*/
int PMI2_Info_GetNodeAttr(const char name[], char value[], int valuelen, int *found, int waitfor);
PMIX_EXPORT int PMI2_Info_GetNodeAttr(const char name[], char value[], int valuelen, int *found, int waitfor);
/*@
PMI2_Info_GetNodeAttrIntArray - returns the value of the attribute associated
@ -405,7 +411,7 @@ int PMI2_Info_GetNodeAttr(const char name[], char value[], int valuelen, int *fo
cartesian.
@*/
int PMI2_Info_GetNodeAttrIntArray(const char name[], int array[], int arraylen, int *outlen, int *found);
PMIX_EXPORT int PMI2_Info_GetNodeAttrIntArray(const char name[], int array[], int arraylen, int *outlen, int *found);
/*@
PMI2_Info_PutNodeAttr - stores the value of the named attribute
@ -423,7 +429,7 @@ int PMI2_Info_GetNodeAttrIntArray(const char name[], int array[], int arraylen,
processes on the same SMP node.
@*/
int PMI2_Info_PutNodeAttr(const char name[], const char value[]);
PMIX_EXPORT int PMI2_Info_PutNodeAttr(const char name[], const char value[]);
/*@
PMI2_Info_GetJobAttr - returns the value of the attribute associated
@ -441,7 +447,7 @@ int PMI2_Info_PutNodeAttr(const char name[], const char value[]);
Returns 'PMI2_SUCCESS' on success and an PMI error code on failure.
@*/
int PMI2_Info_GetJobAttr(const char name[], char value[], int valuelen, int *found);
PMIX_EXPORT int PMI2_Info_GetJobAttr(const char name[], char value[], int valuelen, int *found);
/*@
PMI2_Info_GetJobAttrIntArray - returns the value of the attribute associated
@ -506,7 +512,7 @@ int PMI2_Info_GetJobAttr(const char name[], char value[], int valuelen, int *fou
underlying data models.
@*/
int PMI2_Info_GetJobAttrIntArray(const char name[], int array[], int arraylen, int *outlen, int *found);
PMIX_EXPORT int PMI2_Info_GetJobAttrIntArray(const char name[], int array[], int arraylen, int *outlen, int *found);
/*@
PMI2_Nameserv_publish - publish a name
@ -520,7 +526,7 @@ int PMI2_Info_GetJobAttrIntArray(const char name[], int array[], int arraylen, i
Returns 'PMI2_SUCCESS' on success and an PMI error code on failure.
@*/
int PMI2_Nameserv_publish(const char service_name[], const PMI_keyval_t *info_ptr, const char port[]);
PMIX_EXPORT int PMI2_Nameserv_publish(const char service_name[], const PMI_keyval_t *info_ptr, const char port[]);
/*@
PMI2_Nameserv_lookup - lookup a service by name
@ -537,8 +543,8 @@ int PMI2_Nameserv_publish(const char service_name[], const PMI_keyval_t *info_pt
Returns 'PMI2_SUCCESS' on success and an PMI error code on failure.
@*/
int PMI2_Nameserv_lookup(const char service_name[], const PMI_keyval_t *info_ptr,
char port[], int portLen);
PMIX_EXPORT int PMI2_Nameserv_lookup(const char service_name[], const PMI_keyval_t *info_ptr,
char port[], int portLen);
/*@
PMI2_Nameserv_unpublish - unpublish a name
@ -550,8 +556,8 @@ int PMI2_Nameserv_lookup(const char service_name[], const PMI_keyval_t *info_ptr
Returns 'PMI2_SUCCESS' on success and an PMI error code on failure.
@*/
int PMI2_Nameserv_unpublish(const char service_name[],
const PMI_keyval_t *info_ptr);
PMIX_EXPORT int PMI2_Nameserv_unpublish(const char service_name[],
const PMI_keyval_t *info_ptr);

Просмотреть файл

@ -80,8 +80,8 @@ extern "C" {
* and subsequent operations. Pass a _NULL_ value for the array pointer
* is supported if no directives are desired.
*/
pmix_status_t PMIx_Init(pmix_proc_t *proc,
pmix_info_t info[], size_t ninfo);
PMIX_EXPORT pmix_status_t PMIx_Init(pmix_proc_t *proc,
pmix_info_t info[], size_t ninfo);
/* Finalize the PMIx client, closing the connection to the local server.
* An error code will be returned if, for some reason, the connection
@ -94,14 +94,14 @@ extern "C" {
* internal barrier operation. This attribute directs PMIx_Finalize to
* execute a barrier as part of the finalize operation.
*/
pmix_status_t PMIx_Finalize(const pmix_info_t info[], size_t ninfo);
PMIX_EXPORT pmix_status_t PMIx_Finalize(const pmix_info_t info[], size_t ninfo);
/* Returns _true_ if the PMIx client has been successfully initialized,
* returns _false_ otherwise. Note that the function only reports the
* internal state of the PMIx client - it does not verify an active
* connection with the server, nor that the server is functional. */
int PMIx_Initialized(void);
PMIX_EXPORT int PMIx_Initialized(void);
/* Request that the provided array of procs be aborted, returning the
@ -121,22 +121,22 @@ extern "C" {
* caused by multiple processes calling PMIx_Abort are left to the
* server implementation to resolve with regard to which status is
* returned and what messages (if any) are printed. */
pmix_status_t PMIx_Abort(int status, const char msg[],
pmix_proc_t procs[], size_t nprocs);
PMIX_EXPORT pmix_status_t PMIx_Abort(int status, const char msg[],
pmix_proc_t procs[], size_t nprocs);
/* Push a value into the client's namespace. The client library will cache
* the information locally until _PMIx_Commit_ is called. The provided scope
* value is passed to the local PMIx server, which will distribute the data
* as directed. */
pmix_status_t PMIx_Put(pmix_scope_t scope, const char key[], pmix_value_t *val);
PMIX_EXPORT pmix_status_t PMIx_Put(pmix_scope_t scope, const char key[], pmix_value_t *val);
/* Push all previously _PMIx_Put_ values to the local PMIx server.
* This is an asynchronous operation - the library will immediately
* return to the caller while the data is transmitted to the local
* server in the background */
pmix_status_t PMIx_Commit(void);
PMIX_EXPORT pmix_status_t PMIx_Commit(void);
/* Execute a blocking barrier across the processes identified in the
@ -174,14 +174,14 @@ extern "C" {
* the timeout parameter can help avoid "hangs" due to programming errors
* that prevent one or more procs from reaching the "fence".
*/
pmix_status_t PMIx_Fence(const pmix_proc_t procs[], size_t nprocs,
const pmix_info_t info[], size_t ninfo);
PMIX_EXPORT pmix_status_t PMIx_Fence(const pmix_proc_t procs[], size_t nprocs,
const pmix_info_t info[], size_t ninfo);
/* Non-blocking version of PMIx_Fence. Note that the function will return
* an error if a _NULL_ callback function is given. */
pmix_status_t PMIx_Fence_nb(const pmix_proc_t procs[], size_t nprocs,
const pmix_info_t info[], size_t ninfo,
pmix_op_cbfunc_t cbfunc, void *cbdata);
PMIX_EXPORT pmix_status_t PMIx_Fence_nb(const pmix_proc_t procs[], size_t nprocs,
const pmix_info_t info[], size_t ninfo,
pmix_op_cbfunc_t cbfunc, void *cbdata);
/* Retrieve information for the specified _key_ as published by the process
@ -200,17 +200,17 @@ extern "C" {
* an error. The timeout parameter can help avoid "hangs" due to programming
* errors that prevent the target proc from ever exposing its data.
*/
pmix_status_t PMIx_Get(const pmix_proc_t *proc, const char key[],
const pmix_info_t info[], size_t ninfo,
pmix_value_t **val);
PMIX_EXPORT pmix_status_t PMIx_Get(const pmix_proc_t *proc, const char key[],
const pmix_info_t info[], size_t ninfo,
pmix_value_t **val);
/* A non-blocking operation version of PMIx_Get - the callback function will
* be executed once the specified data has been _PMIx_Put_
* by the identified process and retrieved by the local server. The info
* array is used as described above for the blocking form of this call. */
pmix_status_t PMIx_Get_nb(const pmix_proc_t *proc, const char key[],
const pmix_info_t info[], size_t ninfo,
pmix_value_cbfunc_t cbfunc, void *cbdata);
PMIX_EXPORT pmix_status_t PMIx_Get_nb(const pmix_proc_t *proc, const char key[],
const pmix_info_t info[], size_t ninfo,
pmix_value_cbfunc_t cbfunc, void *cbdata);
/* Publish the data in the info array for lookup. By default,
@ -232,9 +232,9 @@ extern "C" {
* return immediately, executing the callback when the server confirms
* availability of the data.
*/
pmix_status_t PMIx_Publish(const pmix_info_t info[], size_t ninfo);
pmix_status_t PMIx_Publish_nb(const pmix_info_t info[], size_t ninfo,
pmix_op_cbfunc_t cbfunc, void *cbdata);
PMIX_EXPORT pmix_status_t PMIx_Publish(const pmix_info_t info[], size_t ninfo);
PMIX_EXPORT pmix_status_t PMIx_Publish_nb(const pmix_info_t info[], size_t ninfo,
pmix_op_cbfunc_t cbfunc, void *cbdata);
/* Lookup information published by this or another process. By default,
@ -273,8 +273,8 @@ extern "C" {
* (b) PMIX_TIMEOUT - max time to wait for data to become available.
*
*/
pmix_status_t PMIx_Lookup(pmix_pdata_t data[], size_t ndata,
const pmix_info_t info[], size_t ninfo);
PMIX_EXPORT pmix_status_t PMIx_Lookup(pmix_pdata_t data[], size_t ndata,
const pmix_info_t info[], size_t ninfo);
/* Non-blocking form of the _PMIx_Lookup_ function. Data for
* the provided NULL-terminated keys array will be returned
@ -282,8 +282,8 @@ extern "C" {
* behavior is to _not_ wait for data to be published. The
* info keys can be used to modify the behavior as previously
* described */
pmix_status_t PMIx_Lookup_nb(char **keys, const pmix_info_t info[], size_t ninfo,
pmix_lookup_cbfunc_t cbfunc, void *cbdata);
PMIX_EXPORT pmix_status_t PMIx_Lookup_nb(char **keys, const pmix_info_t info[], size_t ninfo,
pmix_lookup_cbfunc_t cbfunc, void *cbdata);
/* Unpublish data posted by this process using the given keys.
@ -294,15 +294,15 @@ extern "C" {
* By default, the range is assumed to be PMIX_SESSION. Changes
* to the range, and any additional directives, can be provided
* in the pmix_info_t array */
pmix_status_t PMIx_Unpublish(char **keys,
const pmix_info_t info[], size_t ninfo);
PMIX_EXPORT pmix_status_t PMIx_Unpublish(char **keys,
const pmix_info_t info[], size_t ninfo);
/* Non-blocking form of the _PMIx_Unpublish_ function. The
* callback function will be executed once the server confirms
* removal of the specified data. */
pmix_status_t PMIx_Unpublish_nb(char **keys,
const pmix_info_t info[], size_t ninfo,
pmix_op_cbfunc_t cbfunc, void *cbdata);
PMIX_EXPORT pmix_status_t PMIx_Unpublish_nb(char **keys,
const pmix_info_t info[], size_t ninfo,
pmix_op_cbfunc_t cbfunc, void *cbdata);
/* Spawn a new job. The assigned namespace of the spawned applications
@ -335,17 +335,17 @@ extern "C" {
* (c) PMIX_NOTIFY_COMPLETION - notify the parent process when the
* child job terminates, either normally or with error
*/
pmix_status_t PMIx_Spawn(const pmix_info_t job_info[], size_t ninfo,
const pmix_app_t apps[], size_t napps,
char nspace[]);
PMIX_EXPORT pmix_status_t PMIx_Spawn(const pmix_info_t job_info[], size_t ninfo,
const pmix_app_t apps[], size_t napps,
char nspace[]);
/* Non-blocking form of the _PMIx_Spawn_ function. The callback
* will be executed upon launch of the specified applications,
* or upon failure to launch any of them. */
pmix_status_t PMIx_Spawn_nb(const pmix_info_t job_info[], size_t ninfo,
const pmix_app_t apps[], size_t napps,
pmix_spawn_cbfunc_t cbfunc, void *cbdata);
PMIX_EXPORT pmix_status_t PMIx_Spawn_nb(const pmix_info_t job_info[], size_t ninfo,
const pmix_app_t apps[], size_t napps,
pmix_spawn_cbfunc_t cbfunc, void *cbdata);
/* Record the specified processes as "connected". Both blocking and non-blocking
* versions are provided. This means that the resource manager should treat the
@ -367,12 +367,12 @@ extern "C" {
* user-level directives regarding the algorithm to be used for the collective
* operation involved in the "connect", timeout constraints, and other options
* available from the host RM */
pmix_status_t PMIx_Connect(const pmix_proc_t procs[], size_t nprocs,
const pmix_info_t info[], size_t ninfo);
PMIX_EXPORT pmix_status_t PMIx_Connect(const pmix_proc_t procs[], size_t nprocs,
const pmix_info_t info[], size_t ninfo);
pmix_status_t PMIx_Connect_nb(const pmix_proc_t procs[], size_t nprocs,
const pmix_info_t info[], size_t ninfo,
pmix_op_cbfunc_t cbfunc, void *cbdata);
PMIX_EXPORT pmix_status_t PMIx_Connect_nb(const pmix_proc_t procs[], size_t nprocs,
const pmix_info_t info[], size_t ninfo,
pmix_op_cbfunc_t cbfunc, void *cbdata);
/* Disconnect a previously connected set of processes. An error will be returned
* if the specified set of procs was not previously "connected". As above, a process
@ -380,12 +380,12 @@ extern "C" {
* is not allowed to reconnect to a set of procs that has not fully completed
* disconnect - i.e., you have to fully disconnect before you can reconnect to the
* _same_ group of processes. The info array is used as above. */
pmix_status_t PMIx_Disconnect(const pmix_proc_t procs[], size_t nprocs,
const pmix_info_t info[], size_t ninfo);
PMIX_EXPORT pmix_status_t PMIx_Disconnect(const pmix_proc_t procs[], size_t nprocs,
const pmix_info_t info[], size_t ninfo);
pmix_status_t PMIx_Disconnect_nb(const pmix_proc_t ranges[], size_t nprocs,
const pmix_info_t info[], size_t ninfo,
pmix_op_cbfunc_t cbfunc, void *cbdata);
PMIX_EXPORT pmix_status_t PMIx_Disconnect_nb(const pmix_proc_t ranges[], size_t nprocs,
const pmix_info_t info[], size_t ninfo,
pmix_op_cbfunc_t cbfunc, void *cbdata);
/* Given a node name, return an array of processes within the specified nspace
* on that node. If the nspace is NULL, then all processes on the node will
@ -394,15 +394,15 @@ extern "C" {
* for releasing the array when done with it - the PMIX_PROC_FREE macro is
* provided for this purpose.
*/
pmix_status_t PMIx_Resolve_peers(const char *nodename, const char *nspace,
pmix_proc_t **procs, size_t *nprocs);
PMIX_EXPORT pmix_status_t PMIx_Resolve_peers(const char *nodename, const char *nspace,
pmix_proc_t **procs, size_t *nprocs);
/* Given an nspace, return the list of nodes hosting processes within
* that nspace. The returned string will contain a comma-delimited list
* of nodenames. The caller is responsible for releasing the string
* when done with it */
pmix_status_t PMIx_Resolve_nodes(const char *nspace, char **nodelist);
PMIX_EXPORT pmix_status_t PMIx_Resolve_nodes(const char *nspace, char **nodelist);
/* Query information about the system in general - can include
* a list of active nspaces, network topology, etc. Also can be
@ -420,8 +420,8 @@ extern "C" {
* PMIX_ERR_PARTIAL_SUCCESS - some of the data has been returned
* PMIX_ERR_NOT_SUPPORTED - the host RM does not support this function
*/
pmix_status_t PMIx_Query_info_nb(pmix_query_t queries[], size_t nqueries,
pmix_info_cbfunc_t cbfunc, void *cbdata);
PMIX_EXPORT pmix_status_t PMIx_Query_info_nb(pmix_query_t queries[], size_t nqueries,
pmix_info_cbfunc_t cbfunc, void *cbdata);
/* Log data to a central data service/store, subject to the
* services offered by the host resource manager. The data to
@ -433,9 +433,9 @@ pmix_status_t PMIx_Query_info_nb(pmix_query_t queries[], size_t nqueries,
* has been completed. The data array must be maintained until
* the callback is provided
*/
pmix_status_t PMIx_Log_nb(const pmix_info_t data[], size_t ndata,
const pmix_info_t directives[], size_t ndirs,
pmix_op_cbfunc_t cbfunc, void *cbdata);
PMIX_EXPORT pmix_status_t PMIx_Log_nb(const pmix_info_t data[], size_t ndata,
const pmix_info_t directives[], size_t ndirs,
pmix_op_cbfunc_t cbfunc, void *cbdata);
/* Request an allocation operation from the host resource manager.
* Several broad categories are envisioned, including the ability to:
@ -469,9 +469,9 @@ pmix_status_t PMIx_Log_nb(const pmix_info_t data[], size_t ndata,
* lieue of preemption. A corresponding ability to "reacquire" resources
* previously released is included.
*/
pmix_status_t PMIx_Allocation_request_nb(pmix_alloc_directive_t directive,
pmix_info_t *info, size_t ninfo,
pmix_info_cbfunc_t cbfunc, void *cbdata);
PMIX_EXPORT pmix_status_t PMIx_Allocation_request_nb(pmix_alloc_directive_t directive,
pmix_info_t *info, size_t ninfo,
pmix_info_cbfunc_t cbfunc, void *cbdata);
/* Request a job control action. The targets array identifies the
* processes to which the requested job control action is to be applied.
@ -487,9 +487,9 @@ pmix_status_t PMIx_Allocation_request_nb(pmix_alloc_directive_t directive,
* when the callback function completes - this will be used to release
* any provided pmix_info_t array.
*/
pmix_status_t PMIx_Job_control_nb(const pmix_proc_t targets[], size_t ntargets,
const pmix_info_t directives[], size_t ndirs,
pmix_info_cbfunc_t cbfunc, void *cbdata);
PMIX_EXPORT pmix_status_t PMIx_Job_control_nb(const pmix_proc_t targets[], size_t ntargets,
const pmix_info_t directives[], size_t ndirs,
pmix_info_cbfunc_t cbfunc, void *cbdata);
/* Request that something be monitored - e.g., that the server monitor
* this process for periodic heartbeats as an indication that the process
@ -518,9 +518,9 @@ pmix_status_t PMIx_Job_control_nb(const pmix_proc_t targets[], size_t ntargets,
*
* Note: a process can send a heartbeat to the server using the PMIx_Heartbeat
* macro provided below*/
pmix_status_t PMIx_Process_monitor_nb(const pmix_info_t *monitor, pmix_status_t error,
const pmix_info_t directives[], size_t ndirs,
pmix_info_cbfunc_t cbfunc, void *cbdata);
PMIX_EXPORT pmix_status_t PMIx_Process_monitor_nb(const pmix_info_t *monitor, pmix_status_t error,
const pmix_info_t directives[], size_t ndirs,
pmix_info_cbfunc_t cbfunc, void *cbdata);
/* define a special macro to simplify sending of a heartbeat */
#define PMIx_Heartbeat() \

Просмотреть файл

@ -60,6 +60,13 @@
#include <sys/time.h> /* for struct timeval */
#include <unistd.h> /* for uid_t and gid_t */
#include <sys/types.h> /* for uid_t and gid_t */
#ifdef PMIX_HAVE_VISIBILITY
#define PMIX_EXPORT __attribute__((__visibility__("default")))
#else
#define PMIX_EXPORT
#endif
#include <pmix_rename.h>
#include <pmix_version.h>
@ -126,8 +133,6 @@ typedef uint32_t pmix_rank_t;
#define PMIX_SERVER_ENABLE_MONITORING "pmix.srv.monitor" // (bool) Enable PMIx internal monitoring by server
#define PMIX_SERVER_NSPACE "pmix.srv.nspace" // (char*) Name of the nspace to use for this server
#define PMIX_SERVER_RANK "pmix.srv.rank" // (pmix_rank_t) Rank of this server
#define PMIX_TOOL_NSPACE "pmix.tool.nspace" // (char*) Name of the nspace to use for this tool
#define PMIX_TOOL_RANK "pmix.tool.rank" // (uint32_t) Rank of this tool
/* identification attributes */
@ -221,6 +226,9 @@ typedef uint32_t pmix_rank_t;
#define PMIX_TOPOLOGY "pmix.topo" // (hwloc_topology_t) pointer to the PMIx client's internal topology object
#define PMIX_TOPOLOGY_SIGNATURE "pmix.toposig" // (char*) topology signature string
#define PMIX_LOCALITY_STRING "pmix.locstr" // (char*) string describing a proc's location
#define PMIX_HWLOC_SHMEM_ADDR "pmix.hwlocaddr" // (size_t) address of HWLOC shared memory segment
#define PMIX_HWLOC_SHMEM_SIZE "pmix.hwlocsize" // (size_t) size of HWLOC shared memory segment
#define PMIX_HWLOC_SHMEM_FILE "pmix.hwlocfile" // (char*) path to HWLOC shared memory file
/* request-related info */
#define PMIX_COLLECT_DATA "pmix.collect" // (bool) collect data and return it at the end of the operation
@ -1531,19 +1539,19 @@ typedef void (*pmix_info_cbfunc_t)(pmix_status_t status,
* using a new set of info values.
*
* See pmix_common.h for a description of the notification function */
void PMIx_Register_event_handler(pmix_status_t codes[], size_t ncodes,
pmix_info_t info[], size_t ninfo,
pmix_notification_fn_t evhdlr,
pmix_evhdlr_reg_cbfunc_t cbfunc,
void *cbdata);
PMIX_EXPORT void PMIx_Register_event_handler(pmix_status_t codes[], size_t ncodes,
pmix_info_t info[], size_t ninfo,
pmix_notification_fn_t evhdlr,
pmix_evhdlr_reg_cbfunc_t cbfunc,
void *cbdata);
/* Deregister an event handler
* evhdlr_ref is the reference returned by PMIx from the call to
* PMIx_Register_event_handler. If non-NULL, the provided cbfunc
* will be called to confirm removal of the designated handler */
void PMIx_Deregister_event_handler(size_t evhdlr_ref,
pmix_op_cbfunc_t cbfunc,
void *cbdata);
PMIX_EXPORT void PMIx_Deregister_event_handler(size_t evhdlr_ref,
pmix_op_cbfunc_t cbfunc,
void *cbdata);
/* Report an event to a process for notification via any
* registered evhdlr. The evhdlr registration can be
@ -1575,11 +1583,11 @@ void PMIx_Deregister_event_handler(size_t evhdlr_ref,
* time. Note that the caller is required to maintain the input
* data until the callback function has been executed!
*/
pmix_status_t PMIx_Notify_event(pmix_status_t status,
const pmix_proc_t *source,
pmix_data_range_t range,
pmix_info_t info[], size_t ninfo,
pmix_op_cbfunc_t cbfunc, void *cbdata);
PMIX_EXPORT pmix_status_t PMIx_Notify_event(pmix_status_t status,
const pmix_proc_t *source,
pmix_data_range_t range,
pmix_info_t info[], size_t ninfo,
pmix_op_cbfunc_t cbfunc, void *cbdata);
/* Provide a string representation for several types of value. Note
* that the provided string is statically defined and must NOT be
@ -1593,24 +1601,24 @@ pmix_status_t PMIx_Notify_event(pmix_status_t status,
* - pmix_data_type_t (PMIX_DATA_TYPE)
* - pmix_alloc_directive_t (PMIX_ALLOC_DIRECTIVE)
*/
const char* PMIx_Error_string(pmix_status_t status);
const char* PMIx_Proc_state_string(pmix_proc_state_t state);
const char* PMIx_Scope_string(pmix_scope_t scope);
const char* PMIx_Persistence_string(pmix_persistence_t persist);
const char* PMIx_Data_range_string(pmix_data_range_t range);
const char* PMIx_Info_directives_string(pmix_info_directives_t directives);
const char* PMIx_Data_type_string(pmix_data_type_t type);
const char* PMIx_Alloc_directive_string(pmix_alloc_directive_t directive);
PMIX_EXPORT const char* PMIx_Error_string(pmix_status_t status);
PMIX_EXPORT const char* PMIx_Proc_state_string(pmix_proc_state_t state);
PMIX_EXPORT const char* PMIx_Scope_string(pmix_scope_t scope);
PMIX_EXPORT const char* PMIx_Persistence_string(pmix_persistence_t persist);
PMIX_EXPORT const char* PMIx_Data_range_string(pmix_data_range_t range);
PMIX_EXPORT const char* PMIx_Info_directives_string(pmix_info_directives_t directives);
PMIX_EXPORT const char* PMIx_Data_type_string(pmix_data_type_t type);
PMIX_EXPORT const char* PMIx_Alloc_directive_string(pmix_alloc_directive_t directive);
/* Get the PMIx version string. Note that the provided string is
* statically defined and must NOT be free'd */
const char* PMIx_Get_version(void);
PMIX_EXPORT const char* PMIx_Get_version(void);
/* Store some data locally for retrieval by other areas of the
* proc. This is data that has only internal scope - it will
* never be "pushed" externally */
pmix_status_t PMIx_Store_internal(const pmix_proc_t *proc,
const char *key, pmix_value_t *val);
PMIX_EXPORT pmix_status_t PMIx_Store_internal(const pmix_proc_t *proc,
const char *key, pmix_value_t *val);
/**
@ -1664,9 +1672,9 @@ pmix_status_t PMIx_Store_internal(const pmix_proc_t *proc,
* status_code = PMIx_Data_pack(buffer, &src, 1, PMIX_INT32);
* @endcode
*/
pmix_status_t PMIx_Data_pack(pmix_data_buffer_t *buffer,
void *src, int32_t num_vals,
pmix_data_type_t type);
PMIX_EXPORT pmix_status_t PMIx_Data_pack(pmix_data_buffer_t *buffer,
void *src, int32_t num_vals,
pmix_data_type_t type);
/**
* Unpack values from a buffer.
@ -1760,9 +1768,9 @@ pmix_status_t PMIx_Data_pack(pmix_data_buffer_t *buffer,
*
* @endcode
*/
pmix_status_t PMIx_Data_unpack(pmix_data_buffer_t *buffer, void *dest,
int32_t *max_num_values,
pmix_data_type_t type);
PMIX_EXPORT pmix_status_t PMIx_Data_unpack(pmix_data_buffer_t *buffer, void *dest,
int32_t *max_num_values,
pmix_data_type_t type);
/**
* Copy a data value from one location to another.
@ -1787,7 +1795,8 @@ pmix_status_t PMIx_Data_unpack(pmix_data_buffer_t *buffer, void *dest,
* @retval PMIX_ERROR(s) An appropriate error code.
*
*/
pmix_status_t PMIx_Data_copy(void **dest, void *src, pmix_data_type_t type);
PMIX_EXPORT pmix_status_t PMIx_Data_copy(void **dest, void *src,
pmix_data_type_t type);
/**
* Print a data value.
@ -1800,8 +1809,8 @@ pmix_status_t PMIx_Data_copy(void **dest, void *src, pmix_data_type_t type);
*
* @retval PMIX_ERROR(s) An appropriate error code.
*/
pmix_status_t PMIx_Data_print(char **output, char *prefix,
void *src, pmix_data_type_t type);
PMIX_EXPORT pmix_status_t PMIx_Data_print(char **output, char *prefix,
void *src, pmix_data_type_t type);
/**
* Copy a payload from one buffer to another
@ -1812,8 +1821,8 @@ pmix_status_t PMIx_Data_print(char **output, char *prefix,
* source buffer's payload will remain intact, as will any pre-existing
* payload in the destination's buffer.
*/
pmix_status_t PMIx_Data_copy_payload(pmix_data_buffer_t *dest,
pmix_data_buffer_t *src);
PMIX_EXPORT pmix_status_t PMIx_Data_copy_payload(pmix_data_buffer_t *dest,
pmix_data_buffer_t *src);
/* Key-Value pair management macros */

Просмотреть файл

@ -378,13 +378,13 @@ typedef struct pmix_server_module_2_0_0_t {
* also may include the PMIX_SERVER_TOOL_SUPPORT key, thereby
* indicating that the daemon is willing to accept connection
* requests from tools */
pmix_status_t PMIx_server_init(pmix_server_module_t *module,
pmix_info_t info[], size_t ninfo);
PMIX_EXPORT pmix_status_t PMIx_server_init(pmix_server_module_t *module,
pmix_info_t info[], size_t ninfo);
/* Finalize the server support library. If internal comm is
* in-use, the server will shut it down at this time. All
* memory usage is released */
pmix_status_t PMIx_server_finalize(void);
PMIX_EXPORT pmix_status_t PMIx_server_finalize(void);
/* given a semicolon-separated list of input values, generate
* a regex that can be passed down to the client for parsing.
@ -402,7 +402,7 @@ pmix_status_t PMIx_server_finalize(void);
* parsing the provided regex. Other parsers may be supported - see
* the pmix_client.h header for a list.
*/
pmix_status_t PMIx_generate_regex(const char *input, char **regex);
PMIX_EXPORT pmix_status_t PMIx_generate_regex(const char *input, char **regex);
/* The input is expected to consist of a comma-separated list
* of ranges. Thus, an input of:
@ -415,7 +415,7 @@ pmix_status_t PMIx_generate_regex(const char *input, char **regex);
* parsing the provided regex. Other parsers may be supported - see
* the pmix_client.h header for a list.
*/
pmix_status_t PMIx_generate_ppn(const char *input, char **ppn);
PMIX_EXPORT pmix_status_t PMIx_generate_ppn(const char *input, char **ppn);
/* Setup the data about a particular nspace so it can
* be passed to any child process upon startup. The PMIx
@ -442,7 +442,7 @@ pmix_status_t PMIx_generate_ppn(const char *input, char **ppn);
* for the PMIx server library to correctly handle collectives
* as a collective operation call can occur before all the
* procs have been started */
pmix_status_t PMIx_server_register_nspace(const char nspace[], int nlocalprocs,
PMIX_EXPORT pmix_status_t PMIx_server_register_nspace(const char nspace[], int nlocalprocs,
pmix_info_t info[], size_t ninfo,
pmix_op_cbfunc_t cbfunc, void *cbdata);
@ -451,8 +451,8 @@ pmix_status_t PMIx_server_register_nspace(const char nspace[], int nlocalprocs,
* intended to support persistent PMIx servers by providing
* an opportunity for the host RM to tell the PMIx server
* library to release all memory for a completed job */
void PMIx_server_deregister_nspace(const char nspace[],
pmix_op_cbfunc_t cbfunc, void *cbdata);
PMIX_EXPORT void PMIx_server_deregister_nspace(const char nspace[],
pmix_op_cbfunc_t cbfunc, void *cbdata);
/* Register a client process with the PMIx server library. The
* expected user ID and group ID of the child process helps the
@ -467,24 +467,24 @@ void PMIx_server_deregister_nspace(const char nspace[],
* return that object when the client calls "finalize", thus
* allowing the host server to access the object without
* performing a lookup. */
pmix_status_t PMIx_server_register_client(const pmix_proc_t *proc,
uid_t uid, gid_t gid,
void *server_object,
pmix_op_cbfunc_t cbfunc, void *cbdata);
PMIX_EXPORT pmix_status_t PMIx_server_register_client(const pmix_proc_t *proc,
uid_t uid, gid_t gid,
void *server_object,
pmix_op_cbfunc_t cbfunc, void *cbdata);
/* Deregister a client and purge all data relating to it. The
* deregister_nspace API will automatically delete all client
* info for that nspace - this API is therefore intended solely
* for use in exception cases */
void PMIx_server_deregister_client(const pmix_proc_t *proc,
pmix_op_cbfunc_t cbfunc, void *cbdata);
PMIX_EXPORT void PMIx_server_deregister_client(const pmix_proc_t *proc,
pmix_op_cbfunc_t cbfunc, void *cbdata);
/* Setup the environment of a child process to be forked
* by the host so it can correctly interact with the PMIx
* server. The PMIx client needs some setup information
* so it can properly connect back to the server. This function
* will set appropriate environmental variables for this purpose. */
pmix_status_t PMIx_server_setup_fork(const pmix_proc_t *proc, char ***env);
PMIX_EXPORT pmix_status_t PMIx_server_setup_fork(const pmix_proc_t *proc, char ***env);
/* Define a callback function the PMIx server will use to return
* direct modex requests to the host server. The PMIx server
@ -502,9 +502,9 @@ typedef void (*pmix_dmodex_response_fn_t)(pmix_status_t status,
* request into the PMIx server. The PMIx server will return a blob
* (once it becomes available) via the cbfunc - the host
* server shall send the blob back to the original requestor */
pmix_status_t PMIx_server_dmodex_request(const pmix_proc_t *proc,
pmix_dmodex_response_fn_t cbfunc,
void *cbdata);
PMIX_EXPORT pmix_status_t PMIx_server_dmodex_request(const pmix_proc_t *proc,
pmix_dmodex_response_fn_t cbfunc,
void *cbdata);
/* define a callback function for the setup_application API. The returned info
* array is owned by the PMIx server library and will be free'd when the
@ -521,18 +521,18 @@ typedef void (*pmix_setup_application_cbfunc_t)(pmix_status_t status,
* is defined as a non-blocking operation in case network
* libraries need to perform some action before responding. The
* returned env will be distributed along with the application */
pmix_status_t PMIx_server_setup_application(const char nspace[],
pmix_info_t info[], size_t ninfo,
pmix_setup_application_cbfunc_t cbfunc, void *cbdata);
PMIX_EXPORT pmix_status_t PMIx_server_setup_application(const char nspace[],
pmix_info_t info[], size_t ninfo,
pmix_setup_application_cbfunc_t cbfunc, void *cbdata);
/* Provide a function by which the local PMIx server can perform
* any application-specific operations prior to spawning local
* clients of a given application. For example, a network library
* might need to setup the local driver for "instant on" addressing.
*/
pmix_status_t PMIx_server_setup_local_support(const char nspace[],
pmix_info_t info[], size_t ninfo,
pmix_op_cbfunc_t cbfunc, void *cbdata);
PMIX_EXPORT pmix_status_t PMIx_server_setup_local_support(const char nspace[],
pmix_info_t info[], size_t ninfo,
pmix_op_cbfunc_t cbfunc, void *cbdata);
#if defined(c_plusplus) || defined(__cplusplus)
}

Просмотреть файл

@ -1,5 +1,5 @@
/*
* Copyright (c) 2013-2016 Intel, Inc. All rights reserved
* Copyright (c) 2013-2017 Intel, Inc. All rights reserved.
* Copyright (c) 2015 Artem Y. Polyakov <artpol84@gmail.com>.
* All rights reserved.
* Copyright (c) 2015 Research Organization for Information Science
@ -87,8 +87,8 @@ extern "C" {
* and subsequent operations. Passing a _NULL_ value for the array pointer
* is supported if no directives are desired.
*/
pmix_status_t PMIx_tool_init(pmix_proc_t *proc,
pmix_info_t info[], size_t ninfo);
PMIX_EXPORT pmix_status_t PMIx_tool_init(pmix_proc_t *proc,
pmix_info_t info[], size_t ninfo);
/* Finalize the PMIx tool library, closing the connection to the local server.
* An error code will be returned if, for some reason, the connection
@ -96,7 +96,7 @@ pmix_status_t PMIx_tool_init(pmix_proc_t *proc,
*
* The info array is used to pass user requests regarding the finalize
* operation. */
pmix_status_t PMIx_tool_finalize(void);
PMIX_EXPORT pmix_status_t PMIx_tool_finalize(void);
#if defined(c_plusplus) || defined(__cplusplus)
}

Просмотреть файл

@ -24,7 +24,6 @@
ACLOCAL_AMFLAGS = -I ./config
SUBDIRS = \
atomics/asm \
util/keyval \
mca/base \
$(MCA_pmix_FRAMEWORKS_SUBDIRS) \
@ -33,7 +32,6 @@ SUBDIRS = \
$(MCA_pmix_FRAMEWORK_COMPONENT_DSO_SUBDIRS)
DIST_SUBDIRS = \
atomics/asm \
util/keyval \
mca/base \
$(MCA_pmix_FRAMEWORKS_SUBDIRS) \

Просмотреть файл

@ -1,92 +0,0 @@
#
# Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
# University Research and Technology
# Corporation. All rights reserved.
# Copyright (c) 2004-2005 The University of Tennessee and The University
# of Tennessee Research Foundation. All rights
# reserved.
# Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
# University of Stuttgart. All rights reserved.
# Copyright (c) 2004-2005 The Regents of the University of California.
# All rights reserved.
# Copyright (c) 2011-2014 Cisco Systems, Inc. All rights reserved.
# Copyright (c) 2017 Research Organization for Information Science
# and Technology (RIST). All rights reserved.
# Copyright (c) 2017 Intel, Inc. All rights reserved.
# $COPYRIGHT$
#
# Additional copyrights may follow
#
# $HEADER$
#
######################################################################
#
# This is a bit complicated. If there is anything in the library,
# it will always be atomic-asm.S. We just symlink atomic-asm.S to
# the best atomic operations available (as determined at configure
# time)
#
######################################################################
generated/@PMIX_ASM_FILE@: base/@PMIX_ASSEMBLY_ARCH@.asm
@ if test ! -f "$(top_srcdir)/src/atomics/asm/$@" ; then \
cmd="$(PERL) '$(top_srcdir)/src/atomics/asm/generate-asm.pl' '@PMIX_ASSEMBLY_ARCH@' '@PMIX_ASSEMBLY_FORMAT@' '$(top_srcdir)/src/atomics/asm/base' '$(top_builddir)/src/atomics/asm/generated/@PMIX_ASM_FILE@'" ; \
echo "$$cmd" ; \
eval $$cmd ; \
fi
atomic-asm.S: generated/@PMIX_ASM_FILE@
rm -f atomic-asm.S
@ if test -f "$(top_builddir)/src/atomics/asm/generated/@PMIX_ASM_FILE@" ; then \
cmd="ln -s \"$(top_builddir)/src/atomics/asm/generated/@PMIX_ASM_FILE@\" atomic-asm.S" ; \
echo "$$cmd" ; \
eval $$cmd ; \
else \
cmd="ln -s \"$(top_srcdir)/src/atomics/asm/generated/@PMIX_ASM_FILE@\" atomic-asm.S" ; \
echo "$$cmd" ; \
eval $$cmd ; \
fi
if PMIX_HAVE_ASM_FILE
nodist_libasm_la_SOURCES = atomic-asm.S
libasm_la_DEPENDENCIES = generated/@PMIX_ASM_FILE@
else
nodist_libasm_la_SOURCES =
libasm_la_DEPENDENCIES =
endif
noinst_LTLIBRARIES = libasm.la
dist_libasm_la_SOURCES = asm.c
EXTRA_DIST = \
asm-data.txt \
generate-asm.pl \
generate-all-asm.pl \
base/aix.conf \
base/default.conf \
base/X86_64.asm \
base/ARM.asm \
base/IA32.asm \
base/IA64.asm \
base/MIPS.asm \
base/POWERPC32.asm \
base/POWERPC64.asm \
base/SPARCV9_32.asm \
base/SPARCV9_64.asm
######################################################################
clean-local:
rm -f atomic-asm.S
distclean-local:
rm -f generated/atomic-local.s
######################################################################
#
# Copy over all the generated files
#
dist-hook:
mkdir "${distdir}/generated"
$(PERL) "$(top_srcdir)/src/atomics/asm/generate-all-asm.pl" "$(PERL)" "$(srcdir)" "$(distdir)"

Просмотреть файл

@ -1,133 +0,0 @@
# -*- sh -*-
# Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
# University Research and Technology
# Corporation. All rights reserved.
# Copyright (c) 2004-2005 The University of Tennessee and The University
# of Tennessee Research Foundation. All rights
# reserved.
# Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
# University of Stuttgart. All rights reserved.
# Copyright (c) 2004-2005 The Regents of the University of California.
# All rights reserved.
# Copyright (c) 2014-2017 Intel, Inc. All rights reserved.
# Copyright (c) 2017 Research Organization for Information Science
# and Technology (RIST). All rights reserved.
# $COPYRIGHT$
#
# Additional copyrights may follow
#
# $HEADER$
#
#
# Database for mapping architecture and assembly format to prebuilt
# assembly files. For explination of the assembly operations, see
# the inline assembly header files in src/include/sys/<arch>.
#
# FORMAT:
# ARCHITECTURE ASSEMBLY FORMAT BASE FILENAME
#
# Assembly Format field:
# config_file-text-global-label_suffix-gsym-lsym-type-size-align_log-ppc_r_reg-64_bit-gnu_stack
######################################################################
#
# AMD Opteron / Intel EM64T
#
######################################################################
X86_64 default-.text-.globl-:--.L-@-1-0-1-1-1 x86_64-linux
X86_64 default-.text-.globl-:--.L-@-1-0-1-1-0 x86_64-linux-nongas
######################################################################
#
# ARM (ARMv7 and later)
#
######################################################################
ARM default-.text-.globl-:--.L-#-1-1-1-1-1 arm-linux
######################################################################
#
# Intel Pentium Class
#
######################################################################
IA32 default-.text-.globl-:--.L-@-1-0-1-1-1 ia32-linux
IA32 default-.text-.globl-:--.L-@-1-0-1-1-0 ia32-linux-nongas
IA32 default-.text-.globl-:-_-L--0-1-1-1-0 ia32-osx
IA32 default-.text-.globl-:-_-L--0-0-1-1-1 ia32-cygwin
IA32 default-.text-.globl-:-_-L--0-0-1-1-0 ia32-cygwin-nongas
######################################################################
#
# IA64 (Intel Itanium)
#
######################################################################
IA64 default-.text-.globl-:--.L-@-1-0-1-1-1 ia64-linux
IA64 default-.text-.globl-:--.L-@-1-0-1-1-0 ia64-linux-nongas
######################################################################
#
# PowerPC / POWER
#
######################################################################
# standard ppc instruction set (AIX calls it ppc). This is not the
# true intersection of all the POWER / PowerPC machines, but works
# on PowerPCs since the 601 and on at least POWER 3 and above.
POWERPC32 default-.text-.globl-:-_-L--0-1-1-0-0 powerpc32-osx
POWERPC32 default-.text-.globl-:--.L-@-1-1-0-0-1 powerpc32-linux
POWERPC32 default-.text-.globl-:--.L-@-1-1-0-0-0 powerpc32-linux-nongas
POWERPC32 aix-.csect .text[PR]-.globl-:-.-L--0-1-0-0-0 powerpc32-aix
# The ppc code above, plus support for the 64 bit operations. This
# mode is really only available on OS X when using the OS X 10.3
# compiler chain with the -mcpu=970 option.
POWERPC32 default-.text-.globl-:-_-L--0-1-1-1-0 powerpc32-64-osx
# PowerPC / POWER 64bit machines. sizeof(void*) == 8.
POWERPC64 default-.text-.globl-:-_-L--0-1-1-1-0 powerpc64-osx
POWERPC64 default-.text-.globl-:-.-.L-@-1-1-0-1-1 powerpc64-linux
POWERPC64 default-.text-.globl-:-.-.L-@-1-1-0-1-0 powerpc64-linux-nongas
POWERPC64 aix-.csect .text[PR]-.globl-:-.-L--0-1-0-1-0 powerpc64-aix
######################################################################
#
# SPARC / UltraSPARC (Scalalable Processor ARChitecture)
#
######################################################################
# Usually compiled with -xarch=v8plus. Basically Sparc V9, but with
# sizeof(void*) == 4 instead of 8. Different from V9_64 because still
# uses 2 registers to pass in a 64bit integer
SPARCV9_32 default-.text-.globl-:--.L-#-1-0-1-1-0 sparcv9-32-solaris
# The Sparc v9 (aka Ultra Sparc). Sizeof(void*) == 8.
SPARCV9_64 default-.text-.globl-:--.L-#-1-0-1-1-0 sparcv9-64-solaris
######################################################################
#
# MIPS III (Microprocessor without Interlocked Pipeline Stages)
# R4000 and above
#
######################################################################
# So MIPS, in it's infinite wisdom (thank you!) decided that when
# compiling in 32bit mode and passing in a 64bit integer, it is done
# in one register (instead of SPARC and POWER, who use two). Which
# means that we can use the same code either way. Woo hoo!
MIPS default-.text-.globl-:--L--1-1-1-1-0 mips-irix
MIPS default-.text-.globl-:--L--1-1-1-1-0 mips64el
MIPS default-.text-.globl-:--L-@-1-1-1-1-1 mips64-linux
# However, this doesn't hold true for 32-bit MIPS as used on Linux.
MIPS default-.text-.globl-:--L-@-1-1-1-0-1 mips-linux

Просмотреть файл

@ -1,75 +0,0 @@
/*
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
* University Research and Technology
* Corporation. All rights reserved.
* Copyright (c) 2004-2005 The University of Tennessee and The University
* of Tennessee Research Foundation. All rights
* reserved.
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
* University of Stuttgart. All rights reserved.
* Copyright (c) 2004-2005 The Regents of the University of California.
* All rights reserved.
* Copyright (c) 2017 Intel, Inc. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
#include "pmix_config.h"
#include "src/atomics/sys/atomic.h"
#include "src/atomics/sys/architecture.h"
#if PMIX_ASSEMBLY_ARCH == PMIX_SPARC
#define LOCKS_TABLE_SIZE 8
/* make sure to get into reasonably useful bits (so shift at least 5) */
#define FIND_LOCK(addr) (&(locks_table[(((unsigned long) addr) >> 8) & \
(LOCKS_TABLE_SIZE - 1)]))
/* have to fix if you change LOCKS_TABLE_SIZE */
static pmix_atomic_lock_t locks_table[LOCKS_TABLE_SIZE] = {
{ { PMIX_ATOMIC_UNLOCKED } },
{ { PMIX_ATOMIC_UNLOCKED } },
{ { PMIX_ATOMIC_UNLOCKED } },
{ { PMIX_ATOMIC_UNLOCKED } },
{ { PMIX_ATOMIC_UNLOCKED } },
{ { PMIX_ATOMIC_UNLOCKED } },
{ { PMIX_ATOMIC_UNLOCKED } },
{ { PMIX_ATOMIC_UNLOCKED } }
};
int32_t
pmix_atomic_add_32(volatile int32_t *addr, int delta)
{
int32_t ret;
pmix_atomic_lock(FIND_LOCK(addr));
ret = (*addr += delta);
pmix_atomic_unlock(FIND_LOCK(addr));
return ret;
}
int32_t
pmix_atomic_sub_32(volatile int32_t *addr, int delta)
{
int32_t ret;
pmix_atomic_lock(FIND_LOCK(addr));
ret = (*addr -= delta);
pmix_atomic_unlock(FIND_LOCK(addr));
return ret;
}
#endif /* PMIX_ASSEMBLY_ARCH == PMIX_SPARC32 */

Просмотреть файл

@ -1,153 +0,0 @@
START_FILE
TEXT
ALIGN(4)
START_FUNC(pmix_atomic_mb)
dmb
bx lr
END_FUNC(pmix_atomic_mb)
START_FUNC(pmix_atomic_rmb)
dmb
bx lr
END_FUNC(pmix_atomic_rmb)
START_FUNC(pmix_atomic_wmb)
dmb
bx lr
END_FUNC(pmix_atomic_wmb)
START_FUNC(pmix_atomic_cmpset_32)
LSYM(1)
ldrex r3, [r0]
cmp r1, r3
bne REFLSYM(2)
strex r12, r2, [r0]
cmp r12, #0
bne REFLSYM(1)
mov r0, #1
LSYM(2)
movne r0, #0
bx lr
END_FUNC(pmix_atomic_cmpset_32)
START_FUNC(pmix_atomic_cmpset_acq_32)
LSYM(3)
ldrex r3, [r0]
cmp r1, r3
bne REFLSYM(4)
strex r12, r2, [r0]
cmp r12, #0
bne REFLSYM(3)
dmb
mov r0, #1
LSYM(4)
movne r0, #0
bx lr
END_FUNC(pmix_atomic_cmpset_acq_32)
START_FUNC(pmix_atomic_cmpset_rel_32)
LSYM(5)
ldrex r3, [r0]
cmp r1, r3
bne REFLSYM(6)
dmb
strex r12, r2, [r0]
cmp r12, #0
bne REFLSYM(4)
mov r0, #1
LSYM(6)
movne r0, #0
bx lr
END_FUNC(pmix_atomic_cmpset_rel_32)
#START_64BIT
START_FUNC(pmix_atomic_cmpset_64)
push {r4-r7}
ldrd r6, r7, [sp, #16]
LSYM(7)
ldrexd r4, r5, [r0]
cmp r4, r2
it eq
cmpeq r5, r3
bne REFLSYM(8)
strexd r1, r6, r7, [r0]
cmp r1, #0
bne REFLSYM(7)
mov r0, #1
LSYM(8)
movne r0, #0
pop {r4-r7}
bx lr
END_FUNC(pmix_atomic_cmpset_64)
START_FUNC(pmix_atomic_cmpset_acq_64)
push {r4-r7}
ldrd r6, r7, [sp, #16]
LSYM(9)
ldrexd r4, r5, [r0]
cmp r4, r2
it eq
cmpeq r5, r3
bne REFLSYM(10)
strexd r1, r6, r7, [r0]
cmp r1, #0
bne REFLSYM(9)
dmb
mov r0, #1
LSYM(10)
movne r0, #0
pop {r4-r7}
bx lr
END_FUNC(pmix_atomic_cmpset_acq_64)
START_FUNC(pmix_atomic_cmpset_rel_64)
push {r4-r7}
ldrd r6, r7, [sp, #16]
LSYM(11)
ldrexd r4, r5, [r0]
cmp r4, r2
it eq
cmpeq r5, r3
bne REFLSYM(12)
dmb
strexd r1, r6, r7, [r0]
cmp r1, #0
bne REFLSYM(11)
mov r0, #1
LSYM(12)
movne r0, #0
pop {r4-r7}
bx lr
END_FUNC(pmix_atomic_cmpset_rel_64)
#END_64BIT
START_FUNC(pmix_atomic_add_32)
LSYM(13)
ldrex r2, [r0]
add r2, r2, r1
strex r3, r2, [r0]
cmp r3, #0
bne REFLSYM(13)
mov r0, r2
bx lr
END_FUNC(pmix_atomic_add_32)
START_FUNC(pmix_atomic_sub_32)
LSYM(14)
ldrex r2, [r0]
sub r2, r2, r1
strex r3, r2, [r0]
cmp r3, #0
bne REFLSYM(14)
mov r0, r2
bx lr
END_FUNC(pmix_atomic_sub_32)

Просмотреть файл

@ -1,110 +0,0 @@
START_FILE
TEXT
START_FUNC(pmix_atomic_mb)
pushl %ebp
movl %esp, %ebp
leave
ret
END_FUNC(pmix_atomic_mb)
START_FUNC(pmix_atomic_rmb)
pushl %ebp
movl %esp, %ebp
leave
ret
END_FUNC(pmix_atomic_rmb)
START_FUNC(pmix_atomic_wmb)
pushl %ebp
movl %esp, %ebp
leave
ret
END_FUNC(pmix_atomic_wmb)
START_FUNC(pmix_atomic_cmpset_32)
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %edx
movl 16(%ebp), %ecx
movl 12(%ebp), %eax
lock; cmpxchgl %ecx,(%edx)
sete %dl
movzbl %dl, %eax
leave
ret
END_FUNC(pmix_atomic_cmpset_32)
START_FUNC(pmix_atomic_cmpset_64)
pushl %ebp
movl %esp, %ebp
subl $32, %esp
movl %ebx, -12(%ebp)
movl %esi, -8(%ebp)
movl %edi, -4(%ebp)
movl 8(%ebp), %edi
movl 12(%ebp), %eax
movl 16(%ebp), %edx
movl %eax, -24(%ebp)
movl %edx, -20(%ebp)
movl 20(%ebp), %eax
movl 24(%ebp), %edx
movl %eax, -32(%ebp)
movl %edx, -28(%ebp)
movl -24(%ebp), %ebx
movl -20(%ebp), %edx
movl -32(%ebp), %esi
movl -28(%ebp), %ecx
movl %ebx, %eax
push %ebx
movl %esi, %ebx
lock; cmpxchg8b (%edi)
sete %dl
pop %ebx
movzbl %dl, %eax
movl -12(%ebp), %ebx
movl -8(%ebp), %esi
movl -4(%ebp), %edi
movl %ebp, %esp
popl %ebp
ret
END_FUNC(pmix_atomic_cmpset_64)
START_FUNC(pmix_atomic_add_32)
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
movl 12(%ebp), %edx
lock; addl %edx,(%eax)
movl (%eax), %eax
leave
ret
END_FUNC(pmix_atomic_add_32)
START_FUNC(pmix_atomic_sub_32)
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
movl 12(%ebp), %edx
lock; subl %edx,(%eax)
movl (%eax), %eax
leave
ret
END_FUNC(pmix_atomic_sub_32)
START_FUNC(pmix_sys_timer_get_cycles)
pushl %ebp
movl %esp, %ebp
rdtsc
popl %ebp
ret
END_FUNC(pmix_sys_timer_get_cycles)

Просмотреть файл

@ -1,109 +0,0 @@
START_FILE
.pred.safe_across_calls p1-p5,p16-p63
.text
.align 16
.global pmix_atomic_mb#
.proc pmix_atomic_mb#
pmix_atomic_mb:
.prologue
.body
mf
br.ret.sptk.many b0
;;
.endp pmix_atomic_mb#
.align 16
.global pmix_atomic_rmb#
.proc pmix_atomic_rmb#
pmix_atomic_rmb:
.prologue
.body
mf
br.ret.sptk.many b0
;;
.endp pmix_atomic_rmb#
.align 16
.global pmix_atomic_wmb#
.proc pmix_atomic_wmb#
pmix_atomic_wmb:
.prologue
.body
mf
br.ret.sptk.many b0
;;
.endp pmix_atomic_wmb#
.align 16
.global pmix_atomic_cmpset_acq_32#
.proc pmix_atomic_cmpset_acq_32#
pmix_atomic_cmpset_acq_32:
.prologue
.body
mov ar.ccv=r33;;
cmpxchg4.acq r32=[r32],r34,ar.ccv
;;
cmp4.eq p6, p7 = r32, r33
;;
(p6) addl r8 = 1, r0
(p7) mov r8 = r0
br.ret.sptk.many b0
;;
.endp pmix_atomic_cmpset_acq_32#
.align 16
.global pmix_atomic_cmpset_rel_32#
.proc pmix_atomic_cmpset_rel_32#
pmix_atomic_cmpset_rel_32:
.prologue
.body
mov ar.ccv=r33;;
cmpxchg4.rel r32=[r32],r34,ar.ccv
;;
cmp4.eq p6, p7 = r32, r33
;;
(p6) addl r8 = 1, r0
(p7) mov r8 = r0
br.ret.sptk.many b0
;;
.endp pmix_atomic_cmpset_rel_32#
.align 16
.global pmix_atomic_cmpset_acq_64#
.proc pmix_atomic_cmpset_acq_64#
pmix_atomic_cmpset_acq_64:
.prologue
.body
mov ar.ccv=r33;;
cmpxchg8.acq r32=[r32],r34,ar.ccv
;;
cmp.eq p6, p7 = r33, r32
;;
(p6) addl r8 = 1, r0
(p7) mov r8 = r0
br.ret.sptk.many b0
;;
.endp pmix_atomic_cmpset_acq_64#
.align 16
.global pmix_atomic_cmpset_rel_64#
.proc pmix_atomic_cmpset_rel_64#
pmix_atomic_cmpset_rel_64:
.prologue
.body
mov ar.ccv=r33;;
cmpxchg8.rel r32=[r32],r34,ar.ccv
;;
cmp.eq p6, p7 = r33, r32
;;
(p6) addl r8 = 1, r0
(p7) mov r8 = r0
br.ret.sptk.many b0
;;
.endp pmix_atomic_cmpset_rel_64#
.align 16
.global pmix_sys_timer_get_cycles#
.proc pmix_sys_timer_get_cycles#
pmix_sys_timer_get_cycles:
.prologue
.body
mov r8=ar.itc
br.ret.sptk.many b0
;;
.endp pmix_sys_timer_get_cycles#
.ident "GCC: (GNU) 3.2.3 20030502 (Red Hat Linux 3.2.3-49)"

Просмотреть файл

@ -1,196 +0,0 @@
START_FILE
#ifdef __linux__
#include <sys/asm.h>
#else
#include <asm.h>
#endif
#include <regdef.h>
TEXT
ALIGN(8)
LEAF(pmix_atomic_mb)
#ifdef __linux__
.set mips2
#endif
sync
#ifdef __linux__
.set mips0
#endif
j ra
END(pmix_atomic_mb)
ALIGN(8)
LEAF(pmix_atomic_rmb)
#ifdef __linux__
.set mips2
#endif
sync
#ifdef __linux__
.set mips0
#endif
j ra
END(pmix_atomic_rmb)
LEAF(pmix_atomic_wmb)
#ifdef __linux__
.set mips2
#endif
sync
#ifdef __linux__
.set mips0
#endif
j ra
END(pmix_atomic_wmb)
LEAF(pmix_atomic_cmpset_32)
.set noreorder
retry1:
#ifdef __linux__
.set mips2
#endif
ll $3, 0($4)
#ifdef __linux__
.set mips0
#endif
bne $3, $5, done1
or $2, $6, 0
#ifdef __linux__
.set mips2
#endif
sc $2, 0($4)
#ifdef __linux__
.set mips0
#endif
beqz $2, retry1
done1:
xor $3,$3,$5
j ra
sltu $2,$3,1
.set reorder
END(pmix_atomic_cmpset_32)
LEAF(pmix_atomic_cmpset_acq_32)
.set noreorder
retry2:
#ifdef __linux__
.set mips2
#endif
ll $3, 0($4)
#ifdef __linux__
.set mips0
#endif
bne $3, $5, done2
or $2, $6, 0
#ifdef __linux__
.set mips2
#endif
sc $2, 0($4)
#ifdef __linux__
.set mips0
#endif
beqz $2, retry2
done2:
#ifdef __linux__
.set mips2
#endif
sync
#ifdef __linux__
.set mips0
#endif
xor $3,$3,$5
j ra
sltu $2,$3,1
.set reorder
END(pmix_atomic_cmpset_acq_32)
LEAF(pmix_atomic_cmpset_rel_32)
.set noreorder
#ifdef __linux__
.set mips2
#endif
sync
#ifdef __linux__
.set mips0
#endif
retry3:
#ifdef __linux__
.set mips2
#endif
ll $3, 0($4)
#ifdef __linux__
.set mips0
#endif
bne $3, $5, done3
or $2, $6, 0
#ifdef __linux__
.set mips2
#endif
sc $2, 0($4)
#ifdef __linux__
.set mips0
#endif
beqz $2, retry3
done3:
xor $3,$3,$5
j ra
sltu $2,$3,1
.set reorder
END(pmix_atomic_cmpset_rel_32)
#ifdef __mips64
LEAF(pmix_atomic_cmpset_64)
.set noreorder
retry4:
lld $3, 0($4)
bne $3, $5, done4
or $2, $6, 0
scd $2, 0($4)
beqz $2, retry4
done4:
xor $3,$3,$5
j ra
sltu $2,$3,1
.set reorder
END(pmix_atomic_cmpset_64)
LEAF(pmix_atomic_cmpset_acq_64)
.set noreorder
retry5:
lld $3, 0($4)
bne $3, $5, done5
or $2, $6, 0
scd $2, 0($4)
beqz $2, retry5
done5:
sync
xor $3,$3,$5
j ra
sltu $2,$3,1
.set reorder
END(pmix_atomic_cmpset_acq_64)
LEAF(pmix_atomic_cmpset_rel_64)
.set noreorder
sync
retry6:
lld $3, 0($4)
bne $3, $5, done6
or $2, $6, 0
scd $2, 0($4)
beqz $2, retry6
done6:
xor $3,$3,$5
j ra
sltu $2,$3,1
.set reorder
END(pmix_atomic_cmpset_rel_64)
#endif /* __mips64 */

Просмотреть файл

@ -1,168 +0,0 @@
START_FILE
TEXT
ALIGN(4)
START_FUNC(pmix_atomic_mb)
sync
blr
END_FUNC(pmix_atomic_mb)
START_FUNC(pmix_atomic_rmb)
lwsync
blr
END_FUNC(pmix_atomic_rmb)
START_FUNC(pmix_atomic_wmb)
eieio
blr
END_FUNC(pmix_atomic_wmb)
START_FUNC(pmix_atomic_cmpset_32)
LSYM(1) lwarx r0, 0, r3
cmpw 0, r0, r4
bne- REFLSYM(2)
stwcx. r5, 0, r3
bne- REFLSYM(1)
LSYM(2)
xor r3,r0,r4
subfic r5,r3,0
adde r3,r5,r3
blr
END_FUNC(pmix_atomic_cmpset_32)
START_FUNC(pmix_atomic_cmpset_acq_32)
LSYM(3) lwarx r0, 0, r3
cmpw 0, r0, r4
bne- REFLSYM(4)
stwcx. r5, 0, r3
bne- REFLSYM(3)
sync
LSYM(4)
xor r3,r0,r4
subfic r5,r3,0
adde r3,r5,r3
lwsync
blr
END_FUNC(pmix_atomic_cmpset_acq_32)
START_FUNC(pmix_atomic_cmpset_rel_32)
eieio
LSYM(5) lwarx r0, 0, r3
cmpw 0, r0, r4
bne- REFLSYM(6)
stwcx. r5, 0, r3
bne- REFLSYM(5)
sync
LSYM(6)
xor r3,r0,r4
subfic r5,r3,0
adde r3,r5,r3
blr
END_FUNC(pmix_atomic_cmpset_rel_32)
#START_64BIT
START_FUNC(pmix_atomic_cmpset_64)
stw r4,-32(r1)
stw r5,-28(r1)
stw r6,-24(r1)
stw r7,-20(r1)
ld r5,-32(r1)
ld r7,-24(r1)
LSYM(7) ldarx r9, 0, r3
cmpd 0, r9, r5
bne- REFLSYM(8)
stdcx. r7, 0, r3
bne- REFLSYM(7)
LSYM(8)
xor r3,r5,r9
subfic r5,r3,0
adde r3,r5,r3
blr
END_FUNC(pmix_atomic_cmpset_64)
START_FUNC(pmix_atomic_cmpset_acq_64)
stw r4,-32(r1)
stw r5,-28(r1)
stw r6,-24(r1)
stw r7,-20(r1)
ld r5,-32(r1)
ld r7,-24(r1)
LSYM(9) ldarx r9, 0, r3
cmpd 0, r9, r5
bne- REFLSYM(10)
stdcx. r7, 0, r3
bne- REFLSYM(9)
LSYM(10)
xor r3,r5,r9
subfic r5,r3,0
adde r3,r5,r3
blr
lwsync
blr
END_FUNC(pmix_atomic_cmpset_acq_64)
START_FUNC(pmix_atomic_cmpset_rel_64)
stw r4,-32(r1)
stw r5,-28(r1)
stw r6,-24(r1)
stw r7,-20(r1)
ld r5,-32(r1)
ld r7,-24(r1)
eieio
LSYM(11) ldarx r9, 0, r3
cmpd 0, r9, r5
bne- REFLSYM(12)
stdcx. r7, 0, r3
bne- REFLSYM(11)
LSYM(12)
xor r3,r5,r9
subfic r5,r3,0
adde r3,r5,r3
blr
lwsync
blr
END_FUNC(pmix_atomic_cmpset_rel_64)
#END_64BIT
START_FUNC(pmix_atomic_add_32)
LSYM(13) lwarx r0, 0, r3
add r0, r4, r0
stwcx. r0, 0, r3
bne- REFLSYM(13)
mr r3,r0
blr
END_FUNC(pmix_atomic_add_32)
START_FUNC(pmix_atomic_sub_32)
LSYM(14) lwarx r0,0,r3
subf r0,r4,r0
stwcx. r0,0,r3
bne- REFLSYM(14)
mr r3,r0
blr
END_FUNC(pmix_atomic_sub_32)
START_FUNC(pmix_sys_timer_get_cycles)
LSYM(15)
mftbu r0
mftb r11
mftbu r2
cmpw cr7,r2,r0
bne+ cr7,REFLSYM(15)
li r4,0
li r9,0
or r3,r2,r9
or r4,r4,r11
blr
END_FUNC(pmix_sys_timer_get_cycles)

Просмотреть файл

@ -1,157 +0,0 @@
START_FILE
TEXT
ALIGN(4)
START_FUNC(pmix_atomic_mb)
sync
blr
END_FUNC(pmix_atomic_mb)
START_FUNC(pmix_atomic_rmb)
lwsync
blr
END_FUNC(pmix_atomic_rmb)
START_FUNC(pmix_atomic_wmb)
eieio
blr
END_FUNC(pmix_atomic_wmb)
START_FUNC(pmix_atomic_cmpset_32)
LSYM(1) lwarx r0, 0, r3
cmpw 0, r0, r4
bne- REFLSYM(2)
stwcx. r5, 0, r3
bne- REFLSYM(1)
LSYM(2)
cmpw cr7,r0,r4
mfcr r3
rlwinm r3,r3,31,1
blr
END_FUNC(pmix_atomic_cmpset_32)
START_FUNC(pmix_atomic_cmpset_acq_32)
mflr r0
std r29,-24(r1)
std r0,16(r1)
stdu r1,-144(r1)
bl REFGSYM(pmix_atomic_cmpset_32)
mr r29,r3
bl REFGSYM(pmix_atomic_rmb)
mr r3,r29
addi r1,r1,144
ld r0,16(r1)
mtlr r0
ld r29,-24(r1)
blr
END_FUNC(pmix_atomic_cmpset_acq_32)
START_FUNC(pmix_atomic_cmpset_rel_32)
mflr r0
std r27,-40(r1)
std r28,-32(r1)
std r29,-24(r1)
std r0,16(r1)
stdu r1,-160(r1)
mr r29,r3
mr r28,r4
mr r27,r5
bl REFGSYM(pmix_atomic_wmb)
mr r3,r29
mr r4,r28
mr r5,r27
bl REFGSYM(pmix_atomic_cmpset_32)
addi r1,r1,160
ld r0,16(r1)
mtlr r0
ld r27,-40(r1)
ld r28,-32(r1)
ld r29,-24(r1)
blr
END_FUNC(pmix_atomic_cmpset_rel_32)
START_FUNC(pmix_atomic_cmpset_64)
LSYM(3) ldarx r0, 0, r3
cmpd 0, r0, r4
bne- REFLSYM(4)
stdcx. r5, 0, r3
bne- REFLSYM(3)
LSYM(4)
xor r3,r4,r0
subfic r5,r3,0
adde r3,r5,r3
blr
END_FUNC(pmix_atomic_cmpset_64)
START_FUNC(pmix_atomic_cmpset_acq_64)
LSYM(7) ldarx r0, 0, r3
cmpd 0, r0, r4
bne- REFLSYM(8)
stdcx. r5, 0, r3
bne- REFLSYM(7)
LSYM(8)
lwsync
xor r3,r4,r0
subfic r5,r3,0
adde r3,r5,r3
blr
END_FUNC(pmix_atomic_cmpset_acq_64)
START_FUNC(pmix_atomic_cmpset_rel_64)
eieio
LSYM(9) ldarx r0, 0, r3
cmpd 0, r0, r4
bne- REFLSYM(10)
stdcx. r5, 0, r3
bne- REFLSYM(9)
LSYM(10)
xor r3,r4,r0
subfic r5,r3,0
adde r3,r5,r3
blr
END_FUNC(pmix_atomic_cmpset_rel_64)
START_FUNC(pmix_atomic_add_32)
LSYM(5) lwarx r0, 0, r3
add r0, r4, r0
stwcx. r0, 0, r3
bne- REFLSYM(5)
mr r3,r0
blr
END_FUNC(pmix_atomic_add_32)
START_FUNC(pmix_atomic_sub_32)
LSYM(6) lwarx r0,0,r3
subf r0,r4,r0
stwcx. r0,0,r3
bne- REFLSYM(6)
mr r3,r0
blr
END_FUNC(pmix_atomic_sub_32)
START_FUNC(pmix_sys_timer_get_cycles)
LSYM(11)
mftbu r2
rldicl r2,r2,0,32
mftb r0
rldicl r9,r0,0,32
mftbu r0
rldicl r0,r0,0,32
cmpw cr7,r0,r2
bne cr7,REFLSYM(11)
sldi r3,r0,32
or r3,r3,r9
blr
END_FUNC(pmix_sys_timer_get_cycles)

Просмотреть файл

@ -1,171 +0,0 @@
START_FILE
TEXT
ALIGN(4)
START_FUNC(pmix_atomic_mb)
!#PROLOGUE# 0
!#PROLOGUE# 1
membar #LoadLoad | #LoadStore | #StoreStore | #StoreLoad
retl
nop
END_FUNC(pmix_atomic_mb)
START_FUNC(pmix_atomic_rmb)
!#PROLOGUE# 0
!#PROLOGUE# 1
membar #LoadLoad
retl
nop
END_FUNC(pmix_atomic_rmb)
START_FUNC(pmix_atomic_wmb)
!#PROLOGUE# 0
!#PROLOGUE# 1
membar #StoreStore
retl
nop
END_FUNC(pmix_atomic_wmb)
START_FUNC(pmix_atomic_cmpset_32)
!#PROLOGUE# 0
!#PROLOGUE# 1
casa [%o0] 0x80, %o1, %o2
xor %o2, %o1, %o2
subcc %g0, %o2, %g0
retl
subx %g0, -1, %o0
END_FUNC(pmix_atomic_cmpset_32)
START_FUNC(pmix_atomic_cmpset_acq_32)
!#PROLOGUE# 0
!#PROLOGUE# 1
casa [%o0] 0x80, %o1, %o2
xor %o2, %o1, %o2
subcc %g0, %o2, %g0
subx %g0, -1, %o0
membar #LoadLoad
retl
sra %o0, 0, %o0
END_FUNC(pmix_atomic_cmpset_acq_32)
START_FUNC(pmix_atomic_cmpset_rel_32)
!#PROLOGUE# 0
!#PROLOGUE# 1
membar #StoreStore
casa [%o0] 0x80, %o1, %o2
xor %o2, %o1, %o2
subcc %g0, %o2, %g0
retl
subx %g0, -1, %o0
END_FUNC(pmix_atomic_cmpset_rel_32)
START_FUNC(pmix_atomic_cmpset_64)
!#PROLOGUE# 0
save %sp, -128, %sp
!#PROLOGUE# 1
mov %i3, %o4
mov %i4, %o5
st %i1, [%fp-32]
st %i2, [%fp-28]
std %o4, [%fp-24]
ldx [%fp-24], %g1
ldx [%fp-32], %g2
casxa [%i0] 0x80, %g2, %g1
stx %g1, [%fp-24]
ld [%fp-24], %i5
ld [%fp-32], %g1
cmp %i5, %g1
bne REFLSYM(12)
mov 0, %i0
ld [%fp-20], %i2
ld [%fp-28], %i1
cmp %i2, %i1
be,a REFLSYM(12)
mov 1, %i0
LSYM(12)
ret
restore
END_FUNC(pmix_atomic_cmpset_64)
START_FUNC(pmix_atomic_cmpset_acq_64)
!#PROLOGUE# 0
save %sp, -128, %sp
!#PROLOGUE# 1
mov %i1, %o4
mov %i2, %o5
mov %i3, %o2
mov %i4, %o3
std %o4, [%fp-32]
std %o2, [%fp-24]
ldx [%fp-24], %g1
ldx [%fp-32], %g2
casxa [%i0] 0x80, %g2, %g1
stx %g1, [%fp-24]
ld [%fp-24], %i5
ld [%fp-32], %g1
cmp %i5, %g1
bne REFLSYM(16)
mov 0, %i0
ld [%fp-20], %i2
ld [%fp-28], %i1
cmp %i2, %i1
be,a REFLSYM(16)
mov 1, %i0
LSYM(16)
membar #LoadLoad
ret
restore
END_FUNC(pmix_atomic_cmpset_acq_64)
START_FUNC(pmix_atomic_cmpset_rel_64)
!#PROLOGUE# 0
save %sp, -128, %sp
!#PROLOGUE# 1
mov %i1, %o4
mov %i2, %o5
mov %i3, %o2
mov %i4, %o3
membar #StoreStore
std %o4, [%fp-32]
std %o2, [%fp-24]
ldx [%fp-24], %g1
ldx [%fp-32], %g2
casxa [%i0] 0x80, %g2, %g1
stx %g1, [%fp-24]
ld [%fp-24], %i5
ld [%fp-32], %g1
cmp %i5, %g1
bne REFLSYM(21)
mov 0, %i0
ld [%fp-20], %i2
ld [%fp-28], %i1
cmp %i2, %i1
be,a REFLSYM(21)
mov 1, %i0
LSYM(21)
ret
restore
END_FUNC(pmix_atomic_cmpset_rel_64)
START_FUNC(pmix_sys_timer_get_cycles)
save %sp,-96,%sp
rd %tick,%o0
srlx %o0,32,%o1
or %g0,%o1,%i0
ret ! Result = %i0
restore %o0,0,%o1
END_FUNC(pmix_sys_timer_get_cycles)

Просмотреть файл

@ -1,111 +0,0 @@
START_FILE
TEXT
ALIGN(4)
START_FUNC(pmix_atomic_mb)
!#PROLOGUE# 0
!#PROLOGUE# 1
membar #LoadLoad | #LoadStore | #StoreStore | #StoreLoad
retl
nop
END_FUNC(pmix_atomic_mb)
START_FUNC(pmix_atomic_rmb)
!#PROLOGUE# 0
!#PROLOGUE# 1
membar #LoadLoad
retl
nop
END_FUNC(pmix_atomic_rmb)
START_FUNC(pmix_atomic_wmb)
!#PROLOGUE# 0
!#PROLOGUE# 1
membar #StoreStore
retl
nop
END_FUNC(pmix_atomic_wmb)
START_FUNC(pmix_atomic_cmpset_32)
!#PROLOGUE# 0
!#PROLOGUE# 1
casa [%o0] 0x80, %o1, %o2
xor %o2, %o1, %o2
subcc %g0, %o2, %g0
retl
subx %g0, -1, %o0
END_FUNC(pmix_atomic_cmpset_32)
START_FUNC(pmix_atomic_cmpset_acq_32)
!#PROLOGUE# 0
!#PROLOGUE# 1
casa [%o0] 0x80, %o1, %o2
xor %o2, %o1, %o2
subcc %g0, %o2, %g0
subx %g0, -1, %o0
membar #LoadLoad
retl
sra %o0, 0, %o0
END_FUNC(pmix_atomic_cmpset_acq_32)
START_FUNC(pmix_atomic_cmpset_rel_32)
!#PROLOGUE# 0
!#PROLOGUE# 1
membar #StoreStore
casa [%o0] 0x80, %o1, %o2
xor %o2, %o1, %o2
subcc %g0, %o2, %g0
retl
subx %g0, -1, %o0
END_FUNC(pmix_atomic_cmpset_rel_32)
START_FUNC(pmix_atomic_cmpset_64)
!#PROLOGUE# 0
!#PROLOGUE# 1
casxa [%o0] 0x80, %o1, %o2
mov 0, %o0
xor %o2, %o1, %o2
retl
movre %o2, 1, %o0
END_FUNC(pmix_atomic_cmpset_64)
START_FUNC(pmix_atomic_cmpset_acq_64)
!#PROLOGUE# 0
!#PROLOGUE# 1
casxa [%o0] 0x80, %o1, %o2
mov 0, %o0
xor %o2, %o1, %o2
movre %o2, 1, %o0
membar #LoadLoad
retl
sra %o0, 0, %o0
END_FUNC(pmix_atomic_cmpset_acq_64)
START_FUNC(pmix_atomic_cmpset_rel_64)
!#PROLOGUE# 0
!#PROLOGUE# 1
membar #StoreStore
casxa [%o0] 0x80, %o1, %o2
mov 0, %o0
xor %o2, %o1, %o2
retl
movre %o2, 1, %o0
END_FUNC(pmix_atomic_cmpset_rel_64)
START_FUNC(pmix_sys_timer_get_cycles)
save %sp,-176,%sp
rd %tick,%o0
ret ! Result = %i0
restore %o0,0,%o0
END_FUNC(pmix_sys_timer_get_cycles)

Просмотреть файл

@ -1,52 +0,0 @@
START_FILE
TEXT
START_FUNC(pmix_atomic_mb)
pushq %rbp
movq %rsp, %rbp
leave
ret
END_FUNC(pmix_atomic_mb)
START_FUNC(pmix_atomic_rmb)
pushq %rbp
movq %rsp, %rbp
leave
ret
END_FUNC(pmix_atomic_rmb)
START_FUNC(pmix_atomic_wmb)
pushq %rbp
movq %rsp, %rbp
leave
ret
END_FUNC(pmix_atomic_wmb)
START_FUNC(pmix_atomic_cmpset_32)
movl %esi, %eax
lock; cmpxchgl %edx,(%rdi)
sete %dl
movzbl %dl, %eax
ret
END_FUNC(pmix_atomic_cmpset_32)
START_FUNC(pmix_atomic_cmpset_64)
movq %rsi, %rax
lock; cmpxchgq %rdx,(%rdi)
sete %dl
movzbl %dl, %eax
ret
END_FUNC(pmix_atomic_cmpset_64)
START_FUNC(pmix_sys_timer_get_cycles)
rdtsc
salq $32, %rdx
mov %eax, %eax
orq %rdx, %rax
ret
END_FUNC(pmix_sys_timer_get_cycles)

Просмотреть файл

@ -1,44 +0,0 @@
sub start_file()
{
my $ret = "";
if ($IS64BIT == 1) {
$ret .= "\t.machine \"ppc64\"\n";
} else {
$ret .= "\t.machine \"ppc\"\n";
}
$ret .= "\t.toc\n";
return $ret;
}
sub start_func($)
{
my $func_name = shift;
my $ret = "";
$ret = "\t$GLOBAL $func_name\n";
$ret .= "\t$GLOBAL $GSYM$func_name\n";
$ret .= "\t.csect [DS],3\n";
$ret .= "$func_name$SUFFIX\n";
if ($IS64BIT == 1) {
$ret .= "\t.llong .$func_name, TOC[tc0], 0\n";
} else {
$ret .= "\t.long .$func_name, TOC[tc0], 0\n";
}
$ret .= "\t.csect [PR]\n";
$ret .= "\t.align 2\n";
$ret .= "$GSYM$func_name$SUFFIX\n";
return $ret;
}
sub end_func($)
{
return "";
}
1

Просмотреть файл

@ -1,34 +0,0 @@
sub start_file
{
return "";
}
sub start_func($)
{
my $func_name = shift;
my $ret = "";
$ret = "\t$GLOBAL $GSYM$func_name\n";
if (! $TYPE eq "") {
$ret .= "\t.type $GSYM$func_name, $TYPE" . "function\n";
}
$ret .= "$GSYM$func_name$SUFFIX\n";
return $ret;
}
sub end_func($)
{
my $func_name = shift;
my $ret = "";
if ($SIZE != 0) {
$ret = "\t.size $GSYM$func_name, .-$GSYM$func_name\n";
}
return $ret;
}
1

Просмотреть файл

@ -1,27 +0,0 @@
#!/usr/bin/perl -w
my $perl = shift;
my $srcdir = shift;
my $destdir = shift;
if (! $perl || ! $srcdir || ! $destdir) {
print "ERROR: invalid argument to generate-all-asm.pl\n";
print "usage: generate-all-asm.pl [PERL] [SRCDIR] [DESTDIR]\n";
exit 1;
}
open(DATAFILE, "$srcdir/asm-data.txt") || die "Could not open data file: $!\n";
my $ASMARCH = "";
my $ASMFORMAT = "";
my $ASMFILE = "";
while(<DATAFILE>) {
if (/^#/) { next; }
($ASMARCH, $ASMFORMAT, $ASMFILE) = /(.*)\t(.*)\t(.*)/;
if (! $ASMARCH || ! $ASMFORMAT) { next; }
print "--> Generating assembly for \"$ASMARCH\" \"$ASMFORMAT\"\n";
system("$perl \'$srcdir/generate-asm.pl\' \'$ASMARCH\' \'$ASMFORMAT\' \'$srcdir/base\' \'$destdir/generated/atomic-$ASMFILE.s\'");
}

Просмотреть файл

@ -1,123 +0,0 @@
#!/usr/bin/perl -w
#
# Copyright (c) 2014 Cisco Systems, Inc. All rights reserved.
# Copyright (c) 2017 Intel, Inc. All rights reserved.
# $COPYRIGHT$
#
# Additional copyrights may follow
#
# $HEADER$
#
my $asmarch = shift;
my $asmformat = shift;
my $basedir = shift;
my $output = shift;
if ( ! $asmarch) {
print "usage: generate-asm.pl [ASMARCH] [ASMFORMAT] [BASEDIR] [OUTPUT NAME]\n";
exit(1);
}
open(INPUT, "$basedir/$asmarch.asm") ||
die "Could not open $basedir/$asmarch.asm: $!\n";
open(OUTPUT, ">$output") || die "Could not open $output: $!\n";
$CONFIG = "default";
$TEXT = "";
$GLOBAL = "";
$SUFFIX = "";
$GSYM = "";
$LSYM = "";
$TYPE = "";
$SIZE = 0;
$ALIGN_LOG = 0;
$DEL_R_REG = 0;
$IS64BIT = 0;
($CONFIG, $TEXT, $GLOBAL, $SUFFIX, $GSYM, $LSYM, $TYPE, $SIZE, $ALIGN_LOG, $DEL_R_REG, $IS64BIT, $GNU_STACK) = (
$asmformat =~ /(.*)\-(.*)\-(.*)\-(.*)\-(.*)\-(.*)\-(.*)\-(.*)\-(.*)\-(.*)\-(.*)\-(.*)/);
if (0) {
print "$asmformat\n";
print "CONFIG: $CONFIG\n";
print "TEXT: $TEXT\n";
print "GLOBAL: $GLOBAL\n";
print "SUFFIX: $SUFFIX\n";
print "GSYM: $GSYM\n";
print "LSYM: $LSYM\n";
print "GNU_STACK: $GNU_STACK\n";
}
my $current_func = "";
my $delete = 0;
# load our configuration
do "$basedir/$CONFIG.conf" or die "Could not open config file $basedir/$CONFIG.conf: $!\n";
while (<INPUT>) {
s/TEXT/$TEXT/g;
s/GLOBAL/$GLOBAL/g;
s/REFGSYM\((.*)\)/$GSYM$1/g;
s/REFLSYM\((.*)\)/$LSYM$1/g;
s/GSYM\((.*)\)/$GSYM$1$SUFFIX/g;
s/LSYM\((.*)\)/$LSYM$1$SUFFIX/g;
if ($DEL_R_REG == 0) {
s/cr([0-9][0-9]?)/$1/g;
s/r([0-9][0-9]?)/$1/g;
}
if (/START_FILE/) {
$_ = start_file();
}
if (/START_FUNC\((.*)\)/) {
$current_func = $1;
$_ = start_func($current_func);
}
if (/END_FUNC\((.*)\)/) {
$current_func = $1;
$_ = end_func($current_func);
}
if ($ALIGN_LOG == 0) {
s/ALIGN\((\d*)\)/.align $1/g;
} else {
# Ugh...
if (m/ALIGN\((\d*)\)/) {
$val = $1;
$result = 0;
while ($val > 1) { $val /= 2; $result++ }
s/ALIGN\((\d*)\)/.align $result/;
}
}
if (/^\#START_64BIT/) {
$_ = "";
if ($IS64BIT == 0) {
$delete = 1;
}
}
if (/^\#END_64BIT/) {
$_ = "";
$delete = 0;
}
if ($delete == 0) {
print OUTPUT $_;
}
}
if ($GNU_STACK == 1) {
if ($asmarch eq "ARM") {
print OUTPUT "\n\t.section\t.note.GNU-stack,\"\",\%progbits\n";
} else {
print OUTPUT "\n\t.section\t.note.GNU-stack,\"\",\@progbits\n";
}
}
close(INPUT);
close(OUTPUT);

Просмотреть файл

@ -1,109 +0,0 @@
.text
.globl _pmix_atomic_mb
_pmix_atomic_mb:
pushl %ebp
movl %esp, %ebp
leave
ret
.globl _pmix_atomic_rmb
_pmix_atomic_rmb:
pushl %ebp
movl %esp, %ebp
leave
ret
.globl _pmix_atomic_wmb
_pmix_atomic_wmb:
pushl %ebp
movl %esp, %ebp
leave
ret
.globl _pmix_atomic_cmpset_32
_pmix_atomic_cmpset_32:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %edx
movl 16(%ebp), %ecx
movl 12(%ebp), %eax
lock; cmpxchgl %ecx,(%edx)
sete %dl
movzbl %dl, %eax
leave
ret
.globl _pmix_atomic_cmpset_64
_pmix_atomic_cmpset_64:
pushl %ebp
movl %esp, %ebp
subl $32, %esp
movl %ebx, -12(%ebp)
movl %esi, -8(%ebp)
movl %edi, -4(%ebp)
movl 8(%ebp), %edi
movl 12(%ebp), %eax
movl 16(%ebp), %edx
movl %eax, -24(%ebp)
movl %edx, -20(%ebp)
movl 20(%ebp), %eax
movl 24(%ebp), %edx
movl %eax, -32(%ebp)
movl %edx, -28(%ebp)
movl -24(%ebp), %ebx
movl -20(%ebp), %edx
movl -32(%ebp), %esi
movl -28(%ebp), %ecx
movl %ebx, %eax
push %ebx
movl %esi, %ebx
lock; cmpxchg8b (%edi)
sete %dl
pop %ebx
movzbl %dl, %eax
movl -12(%ebp), %ebx
movl -8(%ebp), %esi
movl -4(%ebp), %edi
movl %ebp, %esp
popl %ebp
ret
.globl _pmix_atomic_add_32
_pmix_atomic_add_32:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
movl 12(%ebp), %edx
lock; addl %edx,(%eax)
movl (%eax), %eax
leave
ret
.globl _pmix_atomic_sub_32
_pmix_atomic_sub_32:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
movl 12(%ebp), %edx
lock; subl %edx,(%eax)
movl (%eax), %eax
leave
ret
.globl _pmix_sys_timer_get_cycles
_pmix_sys_timer_get_cycles:
pushl %ebp
movl %esp, %ebp
rdtsc
popl %ebp
ret

Просмотреть файл

@ -1,111 +0,0 @@
.text
.globl _pmix_atomic_mb
_pmix_atomic_mb:
pushl %ebp
movl %esp, %ebp
leave
ret
.globl _pmix_atomic_rmb
_pmix_atomic_rmb:
pushl %ebp
movl %esp, %ebp
leave
ret
.globl _pmix_atomic_wmb
_pmix_atomic_wmb:
pushl %ebp
movl %esp, %ebp
leave
ret
.globl _pmix_atomic_cmpset_32
_pmix_atomic_cmpset_32:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %edx
movl 16(%ebp), %ecx
movl 12(%ebp), %eax
lock; cmpxchgl %ecx,(%edx)
sete %dl
movzbl %dl, %eax
leave
ret
.globl _pmix_atomic_cmpset_64
_pmix_atomic_cmpset_64:
pushl %ebp
movl %esp, %ebp
subl $32, %esp
movl %ebx, -12(%ebp)
movl %esi, -8(%ebp)
movl %edi, -4(%ebp)
movl 8(%ebp), %edi
movl 12(%ebp), %eax
movl 16(%ebp), %edx
movl %eax, -24(%ebp)
movl %edx, -20(%ebp)
movl 20(%ebp), %eax
movl 24(%ebp), %edx
movl %eax, -32(%ebp)
movl %edx, -28(%ebp)
movl -24(%ebp), %ebx
movl -20(%ebp), %edx
movl -32(%ebp), %esi
movl -28(%ebp), %ecx
movl %ebx, %eax
push %ebx
movl %esi, %ebx
lock; cmpxchg8b (%edi)
sete %dl
pop %ebx
movzbl %dl, %eax
movl -12(%ebp), %ebx
movl -8(%ebp), %esi
movl -4(%ebp), %edi
movl %ebp, %esp
popl %ebp
ret
.globl _pmix_atomic_add_32
_pmix_atomic_add_32:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
movl 12(%ebp), %edx
lock; addl %edx,(%eax)
movl (%eax), %eax
leave
ret
.globl _pmix_atomic_sub_32
_pmix_atomic_sub_32:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
movl 12(%ebp), %edx
lock; subl %edx,(%eax)
movl (%eax), %eax
leave
ret
.globl _pmix_sys_timer_get_cycles
_pmix_sys_timer_get_cycles:
pushl %ebp
movl %esp, %ebp
rdtsc
popl %ebp
ret
.section .note.GNU-stack,"",@progbits

Просмотреть файл

@ -1,125 +0,0 @@
.text
.globl pmix_atomic_mb
.type pmix_atomic_mb, @function
pmix_atomic_mb:
pushl %ebp
movl %esp, %ebp
leave
ret
.size pmix_atomic_mb, .-pmix_atomic_mb
.globl pmix_atomic_rmb
.type pmix_atomic_rmb, @function
pmix_atomic_rmb:
pushl %ebp
movl %esp, %ebp
leave
ret
.size pmix_atomic_rmb, .-pmix_atomic_rmb
.globl pmix_atomic_wmb
.type pmix_atomic_wmb, @function
pmix_atomic_wmb:
pushl %ebp
movl %esp, %ebp
leave
ret
.size pmix_atomic_wmb, .-pmix_atomic_wmb
.globl pmix_atomic_cmpset_32
.type pmix_atomic_cmpset_32, @function
pmix_atomic_cmpset_32:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %edx
movl 16(%ebp), %ecx
movl 12(%ebp), %eax
lock; cmpxchgl %ecx,(%edx)
sete %dl
movzbl %dl, %eax
leave
ret
.size pmix_atomic_cmpset_32, .-pmix_atomic_cmpset_32
.globl pmix_atomic_cmpset_64
.type pmix_atomic_cmpset_64, @function
pmix_atomic_cmpset_64:
pushl %ebp
movl %esp, %ebp
subl $32, %esp
movl %ebx, -12(%ebp)
movl %esi, -8(%ebp)
movl %edi, -4(%ebp)
movl 8(%ebp), %edi
movl 12(%ebp), %eax
movl 16(%ebp), %edx
movl %eax, -24(%ebp)
movl %edx, -20(%ebp)
movl 20(%ebp), %eax
movl 24(%ebp), %edx
movl %eax, -32(%ebp)
movl %edx, -28(%ebp)
movl -24(%ebp), %ebx
movl -20(%ebp), %edx
movl -32(%ebp), %esi
movl -28(%ebp), %ecx
movl %ebx, %eax
push %ebx
movl %esi, %ebx
lock; cmpxchg8b (%edi)
sete %dl
pop %ebx
movzbl %dl, %eax
movl -12(%ebp), %ebx
movl -8(%ebp), %esi
movl -4(%ebp), %edi
movl %ebp, %esp
popl %ebp
ret
.size pmix_atomic_cmpset_64, .-pmix_atomic_cmpset_64
.globl pmix_atomic_add_32
.type pmix_atomic_add_32, @function
pmix_atomic_add_32:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
movl 12(%ebp), %edx
lock; addl %edx,(%eax)
movl (%eax), %eax
leave
ret
.size pmix_atomic_add_32, .-pmix_atomic_add_32
.globl pmix_atomic_sub_32
.type pmix_atomic_sub_32, @function
pmix_atomic_sub_32:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
movl 12(%ebp), %edx
lock; subl %edx,(%eax)
movl (%eax), %eax
leave
ret
.size pmix_atomic_sub_32, .-pmix_atomic_sub_32
.globl pmix_sys_timer_get_cycles
.type pmix_sys_timer_get_cycles, @function
pmix_sys_timer_get_cycles:
pushl %ebp
movl %esp, %ebp
rdtsc
popl %ebp
ret
.size pmix_sys_timer_get_cycles, .-pmix_sys_timer_get_cycles

Просмотреть файл

@ -1,127 +0,0 @@
.text
.globl pmix_atomic_mb
.type pmix_atomic_mb, @function
pmix_atomic_mb:
pushl %ebp
movl %esp, %ebp
leave
ret
.size pmix_atomic_mb, .-pmix_atomic_mb
.globl pmix_atomic_rmb
.type pmix_atomic_rmb, @function
pmix_atomic_rmb:
pushl %ebp
movl %esp, %ebp
leave
ret
.size pmix_atomic_rmb, .-pmix_atomic_rmb
.globl pmix_atomic_wmb
.type pmix_atomic_wmb, @function
pmix_atomic_wmb:
pushl %ebp
movl %esp, %ebp
leave
ret
.size pmix_atomic_wmb, .-pmix_atomic_wmb
.globl pmix_atomic_cmpset_32
.type pmix_atomic_cmpset_32, @function
pmix_atomic_cmpset_32:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %edx
movl 16(%ebp), %ecx
movl 12(%ebp), %eax
lock; cmpxchgl %ecx,(%edx)
sete %dl
movzbl %dl, %eax
leave
ret
.size pmix_atomic_cmpset_32, .-pmix_atomic_cmpset_32
.globl pmix_atomic_cmpset_64
.type pmix_atomic_cmpset_64, @function
pmix_atomic_cmpset_64:
pushl %ebp
movl %esp, %ebp
subl $32, %esp
movl %ebx, -12(%ebp)
movl %esi, -8(%ebp)
movl %edi, -4(%ebp)
movl 8(%ebp), %edi
movl 12(%ebp), %eax
movl 16(%ebp), %edx
movl %eax, -24(%ebp)
movl %edx, -20(%ebp)
movl 20(%ebp), %eax
movl 24(%ebp), %edx
movl %eax, -32(%ebp)
movl %edx, -28(%ebp)
movl -24(%ebp), %ebx
movl -20(%ebp), %edx
movl -32(%ebp), %esi
movl -28(%ebp), %ecx
movl %ebx, %eax
push %ebx
movl %esi, %ebx
lock; cmpxchg8b (%edi)
sete %dl
pop %ebx
movzbl %dl, %eax
movl -12(%ebp), %ebx
movl -8(%ebp), %esi
movl -4(%ebp), %edi
movl %ebp, %esp
popl %ebp
ret
.size pmix_atomic_cmpset_64, .-pmix_atomic_cmpset_64
.globl pmix_atomic_add_32
.type pmix_atomic_add_32, @function
pmix_atomic_add_32:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
movl 12(%ebp), %edx
lock; addl %edx,(%eax)
movl (%eax), %eax
leave
ret
.size pmix_atomic_add_32, .-pmix_atomic_add_32
.globl pmix_atomic_sub_32
.type pmix_atomic_sub_32, @function
pmix_atomic_sub_32:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
movl 12(%ebp), %edx
lock; subl %edx,(%eax)
movl (%eax), %eax
leave
ret
.size pmix_atomic_sub_32, .-pmix_atomic_sub_32
.globl pmix_sys_timer_get_cycles
.type pmix_sys_timer_get_cycles, @function
pmix_sys_timer_get_cycles:
pushl %ebp
movl %esp, %ebp
rdtsc
popl %ebp
ret
.size pmix_sys_timer_get_cycles, .-pmix_sys_timer_get_cycles
.section .note.GNU-stack,"",@progbits

Просмотреть файл

@ -1,109 +0,0 @@
.text
.globl _pmix_atomic_mb
_pmix_atomic_mb:
pushl %ebp
movl %esp, %ebp
leave
ret
.globl _pmix_atomic_rmb
_pmix_atomic_rmb:
pushl %ebp
movl %esp, %ebp
leave
ret
.globl _pmix_atomic_wmb
_pmix_atomic_wmb:
pushl %ebp
movl %esp, %ebp
leave
ret
.globl _pmix_atomic_cmpset_32
_pmix_atomic_cmpset_32:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %edx
movl 16(%ebp), %ecx
movl 12(%ebp), %eax
lock; cmpxchgl %ecx,(%edx)
sete %dl
movzbl %dl, %eax
leave
ret
.globl _pmix_atomic_cmpset_64
_pmix_atomic_cmpset_64:
pushl %ebp
movl %esp, %ebp
subl $32, %esp
movl %ebx, -12(%ebp)
movl %esi, -8(%ebp)
movl %edi, -4(%ebp)
movl 8(%ebp), %edi
movl 12(%ebp), %eax
movl 16(%ebp), %edx
movl %eax, -24(%ebp)
movl %edx, -20(%ebp)
movl 20(%ebp), %eax
movl 24(%ebp), %edx
movl %eax, -32(%ebp)
movl %edx, -28(%ebp)
movl -24(%ebp), %ebx
movl -20(%ebp), %edx
movl -32(%ebp), %esi
movl -28(%ebp), %ecx
movl %ebx, %eax
push %ebx
movl %esi, %ebx
lock; cmpxchg8b (%edi)
sete %dl
pop %ebx
movzbl %dl, %eax
movl -12(%ebp), %ebx
movl -8(%ebp), %esi
movl -4(%ebp), %edi
movl %ebp, %esp
popl %ebp
ret
.globl _pmix_atomic_add_32
_pmix_atomic_add_32:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
movl 12(%ebp), %edx
lock; addl %edx,(%eax)
movl (%eax), %eax
leave
ret
.globl _pmix_atomic_sub_32
_pmix_atomic_sub_32:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
movl 12(%ebp), %edx
lock; subl %edx,(%eax)
movl (%eax), %eax
leave
ret
.globl _pmix_sys_timer_get_cycles
_pmix_sys_timer_get_cycles:
pushl %ebp
movl %esp, %ebp
rdtsc
popl %ebp
ret

Просмотреть файл

@ -1,108 +0,0 @@
.pred.safe_across_calls p1-p5,p16-p63
.text
.align 16
.global pmix_atomic_mb#
.proc pmix_atomic_mb#
pmix_atomic_mb:
.prologue
.body
mf
br.ret.sptk.many b0
;;
.endp pmix_atomic_mb#
.align 16
.global pmix_atomic_rmb#
.proc pmix_atomic_rmb#
pmix_atomic_rmb:
.prologue
.body
mf
br.ret.sptk.many b0
;;
.endp pmix_atomic_rmb#
.align 16
.global pmix_atomic_wmb#
.proc pmix_atomic_wmb#
pmix_atomic_wmb:
.prologue
.body
mf
br.ret.sptk.many b0
;;
.endp pmix_atomic_wmb#
.align 16
.global pmix_atomic_cmpset_acq_32#
.proc pmix_atomic_cmpset_acq_32#
pmix_atomic_cmpset_acq_32:
.prologue
.body
mov ar.ccv=r33;;
cmpxchg4.acq r32=[r32],r34,ar.ccv
;;
cmp4.eq p6, p7 = r32, r33
;;
(p6) addl r8 = 1, r0
(p7) mov r8 = r0
br.ret.sptk.many b0
;;
.endp pmix_atomic_cmpset_acq_32#
.align 16
.global pmix_atomic_cmpset_rel_32#
.proc pmix_atomic_cmpset_rel_32#
pmix_atomic_cmpset_rel_32:
.prologue
.body
mov ar.ccv=r33;;
cmpxchg4.rel r32=[r32],r34,ar.ccv
;;
cmp4.eq p6, p7 = r32, r33
;;
(p6) addl r8 = 1, r0
(p7) mov r8 = r0
br.ret.sptk.many b0
;;
.endp pmix_atomic_cmpset_rel_32#
.align 16
.global pmix_atomic_cmpset_acq_64#
.proc pmix_atomic_cmpset_acq_64#
pmix_atomic_cmpset_acq_64:
.prologue
.body
mov ar.ccv=r33;;
cmpxchg8.acq r32=[r32],r34,ar.ccv
;;
cmp.eq p6, p7 = r33, r32
;;
(p6) addl r8 = 1, r0
(p7) mov r8 = r0
br.ret.sptk.many b0
;;
.endp pmix_atomic_cmpset_acq_64#
.align 16
.global pmix_atomic_cmpset_rel_64#
.proc pmix_atomic_cmpset_rel_64#
pmix_atomic_cmpset_rel_64:
.prologue
.body
mov ar.ccv=r33;;
cmpxchg8.rel r32=[r32],r34,ar.ccv
;;
cmp.eq p6, p7 = r33, r32
;;
(p6) addl r8 = 1, r0
(p7) mov r8 = r0
br.ret.sptk.many b0
;;
.endp pmix_atomic_cmpset_rel_64#
.align 16
.global pmix_sys_timer_get_cycles#
.proc pmix_sys_timer_get_cycles#
pmix_sys_timer_get_cycles:
.prologue
.body
mov r8=ar.itc
br.ret.sptk.many b0
;;
.endp pmix_sys_timer_get_cycles#
.ident "GCC: (GNU) 3.2.3 20030502 (Red Hat Linux 3.2.3-49)"

Просмотреть файл

@ -1,110 +0,0 @@
.pred.safe_across_calls p1-p5,p16-p63
.text
.align 16
.global pmix_atomic_mb#
.proc pmix_atomic_mb#
pmix_atomic_mb:
.prologue
.body
mf
br.ret.sptk.many b0
;;
.endp pmix_atomic_mb#
.align 16
.global pmix_atomic_rmb#
.proc pmix_atomic_rmb#
pmix_atomic_rmb:
.prologue
.body
mf
br.ret.sptk.many b0
;;
.endp pmix_atomic_rmb#
.align 16
.global pmix_atomic_wmb#
.proc pmix_atomic_wmb#
pmix_atomic_wmb:
.prologue
.body
mf
br.ret.sptk.many b0
;;
.endp pmix_atomic_wmb#
.align 16
.global pmix_atomic_cmpset_acq_32#
.proc pmix_atomic_cmpset_acq_32#
pmix_atomic_cmpset_acq_32:
.prologue
.body
mov ar.ccv=r33;;
cmpxchg4.acq r32=[r32],r34,ar.ccv
;;
cmp4.eq p6, p7 = r32, r33
;;
(p6) addl r8 = 1, r0
(p7) mov r8 = r0
br.ret.sptk.many b0
;;
.endp pmix_atomic_cmpset_acq_32#
.align 16
.global pmix_atomic_cmpset_rel_32#
.proc pmix_atomic_cmpset_rel_32#
pmix_atomic_cmpset_rel_32:
.prologue
.body
mov ar.ccv=r33;;
cmpxchg4.rel r32=[r32],r34,ar.ccv
;;
cmp4.eq p6, p7 = r32, r33
;;
(p6) addl r8 = 1, r0
(p7) mov r8 = r0
br.ret.sptk.many b0
;;
.endp pmix_atomic_cmpset_rel_32#
.align 16
.global pmix_atomic_cmpset_acq_64#
.proc pmix_atomic_cmpset_acq_64#
pmix_atomic_cmpset_acq_64:
.prologue
.body
mov ar.ccv=r33;;
cmpxchg8.acq r32=[r32],r34,ar.ccv
;;
cmp.eq p6, p7 = r33, r32
;;
(p6) addl r8 = 1, r0
(p7) mov r8 = r0
br.ret.sptk.many b0
;;
.endp pmix_atomic_cmpset_acq_64#
.align 16
.global pmix_atomic_cmpset_rel_64#
.proc pmix_atomic_cmpset_rel_64#
pmix_atomic_cmpset_rel_64:
.prologue
.body
mov ar.ccv=r33;;
cmpxchg8.rel r32=[r32],r34,ar.ccv
;;
cmp.eq p6, p7 = r33, r32
;;
(p6) addl r8 = 1, r0
(p7) mov r8 = r0
br.ret.sptk.many b0
;;
.endp pmix_atomic_cmpset_rel_64#
.align 16
.global pmix_sys_timer_get_cycles#
.proc pmix_sys_timer_get_cycles#
pmix_sys_timer_get_cycles:
.prologue
.body
mov r8=ar.itc
br.ret.sptk.many b0
;;
.endp pmix_sys_timer_get_cycles#
.ident "GCC: (GNU) 3.2.3 20030502 (Red Hat Linux 3.2.3-49)"
.section .note.GNU-stack,"",@progbits

Просмотреть файл

@ -1,195 +0,0 @@
#ifdef __linux__
#include <sys/asm.h>
#else
#include <asm.h>
#endif
#include <regdef.h>
.text
.align 3
LEAF(pmix_atomic_mb)
#ifdef __linux__
.set mips2
#endif
sync
#ifdef __linux__
.set mips0
#endif
j ra
END(pmix_atomic_mb)
.align 3
LEAF(pmix_atomic_rmb)
#ifdef __linux__
.set mips2
#endif
sync
#ifdef __linux__
.set mips0
#endif
j ra
END(pmix_atomic_rmb)
LEAF(pmix_atomic_wmb)
#ifdef __linux__
.set mips2
#endif
sync
#ifdef __linux__
.set mips0
#endif
j ra
END(pmix_atomic_wmb)
LEAF(pmix_atomic_cmpset_32)
.set noreorder
retry1:
#ifdef __linux__
.set mips2
#endif
ll $3, 0($4)
#ifdef __linux__
.set mips0
#endif
bne $3, $5, done1
or $2, $6, 0
#ifdef __linux__
.set mips2
#endif
sc $2, 0($4)
#ifdef __linux__
.set mips0
#endif
beqz $2, retry1
done1:
xor $3,$3,$5
j ra
sltu $2,$3,1
.set reorder
END(pmix_atomic_cmpset_32)
LEAF(pmix_atomic_cmpset_acq_32)
.set noreorder
retry2:
#ifdef __linux__
.set mips2
#endif
ll $3, 0($4)
#ifdef __linux__
.set mips0
#endif
bne $3, $5, done2
or $2, $6, 0
#ifdef __linux__
.set mips2
#endif
sc $2, 0($4)
#ifdef __linux__
.set mips0
#endif
beqz $2, retry2
done2:
#ifdef __linux__
.set mips2
#endif
sync
#ifdef __linux__
.set mips0
#endif
xor $3,$3,$5
j ra
sltu $2,$3,1
.set reorder
END(pmix_atomic_cmpset_acq_32)
LEAF(pmix_atomic_cmpset_rel_32)
.set noreorder
#ifdef __linux__
.set mips2
#endif
sync
#ifdef __linux__
.set mips0
#endif
retry3:
#ifdef __linux__
.set mips2
#endif
ll $3, 0($4)
#ifdef __linux__
.set mips0
#endif
bne $3, $5, done3
or $2, $6, 0
#ifdef __linux__
.set mips2
#endif
sc $2, 0($4)
#ifdef __linux__
.set mips0
#endif
beqz $2, retry3
done3:
xor $3,$3,$5
j ra
sltu $2,$3,1
.set reorder
END(pmix_atomic_cmpset_rel_32)
#ifdef __mips64
LEAF(pmix_atomic_cmpset_64)
.set noreorder
retry4:
lld $3, 0($4)
bne $3, $5, done4
or $2, $6, 0
scd $2, 0($4)
beqz $2, retry4
done4:
xor $3,$3,$5
j ra
sltu $2,$3,1
.set reorder
END(pmix_atomic_cmpset_64)
LEAF(pmix_atomic_cmpset_acq_64)
.set noreorder
retry5:
lld $3, 0($4)
bne $3, $5, done5
or $2, $6, 0
scd $2, 0($4)
beqz $2, retry5
done5:
sync
xor $3,$3,$5
j ra
sltu $2,$3,1
.set reorder
END(pmix_atomic_cmpset_acq_64)
LEAF(pmix_atomic_cmpset_rel_64)
.set noreorder
sync
retry6:
lld $3, 0($4)
bne $3, $5, done6
or $2, $6, 0
scd $2, 0($4)
beqz $2, retry6
done6:
xor $3,$3,$5
j ra
sltu $2,$3,1
.set reorder
END(pmix_atomic_cmpset_rel_64)
#endif /* __mips64 */

Просмотреть файл

@ -1,197 +0,0 @@
#ifdef __linux__
#include <sys/asm.h>
#else
#include <asm.h>
#endif
#include <regdef.h>
.text
.align 3
LEAF(pmix_atomic_mb)
#ifdef __linux__
.set mips2
#endif
sync
#ifdef __linux__
.set mips0
#endif
j ra
END(pmix_atomic_mb)
.align 3
LEAF(pmix_atomic_rmb)
#ifdef __linux__
.set mips2
#endif
sync
#ifdef __linux__
.set mips0
#endif
j ra
END(pmix_atomic_rmb)
LEAF(pmix_atomic_wmb)
#ifdef __linux__
.set mips2
#endif
sync
#ifdef __linux__
.set mips0
#endif
j ra
END(pmix_atomic_wmb)
LEAF(pmix_atomic_cmpset_32)
.set noreorder
retry1:
#ifdef __linux__
.set mips2
#endif
ll $3, 0($4)
#ifdef __linux__
.set mips0
#endif
bne $3, $5, done1
or $2, $6, 0
#ifdef __linux__
.set mips2
#endif
sc $2, 0($4)
#ifdef __linux__
.set mips0
#endif
beqz $2, retry1
done1:
xor $3,$3,$5
j ra
sltu $2,$3,1
.set reorder
END(pmix_atomic_cmpset_32)
LEAF(pmix_atomic_cmpset_acq_32)
.set noreorder
retry2:
#ifdef __linux__
.set mips2
#endif
ll $3, 0($4)
#ifdef __linux__
.set mips0
#endif
bne $3, $5, done2
or $2, $6, 0
#ifdef __linux__
.set mips2
#endif
sc $2, 0($4)
#ifdef __linux__
.set mips0
#endif
beqz $2, retry2
done2:
#ifdef __linux__
.set mips2
#endif
sync
#ifdef __linux__
.set mips0
#endif
xor $3,$3,$5
j ra
sltu $2,$3,1
.set reorder
END(pmix_atomic_cmpset_acq_32)
LEAF(pmix_atomic_cmpset_rel_32)
.set noreorder
#ifdef __linux__
.set mips2
#endif
sync
#ifdef __linux__
.set mips0
#endif
retry3:
#ifdef __linux__
.set mips2
#endif
ll $3, 0($4)
#ifdef __linux__
.set mips0
#endif
bne $3, $5, done3
or $2, $6, 0
#ifdef __linux__
.set mips2
#endif
sc $2, 0($4)
#ifdef __linux__
.set mips0
#endif
beqz $2, retry3
done3:
xor $3,$3,$5
j ra
sltu $2,$3,1
.set reorder
END(pmix_atomic_cmpset_rel_32)
#ifdef __mips64
LEAF(pmix_atomic_cmpset_64)
.set noreorder
retry4:
lld $3, 0($4)
bne $3, $5, done4
or $2, $6, 0
scd $2, 0($4)
beqz $2, retry4
done4:
xor $3,$3,$5
j ra
sltu $2,$3,1
.set reorder
END(pmix_atomic_cmpset_64)
LEAF(pmix_atomic_cmpset_acq_64)
.set noreorder
retry5:
lld $3, 0($4)
bne $3, $5, done5
or $2, $6, 0
scd $2, 0($4)
beqz $2, retry5
done5:
sync
xor $3,$3,$5
j ra
sltu $2,$3,1
.set reorder
END(pmix_atomic_cmpset_acq_64)
LEAF(pmix_atomic_cmpset_rel_64)
.set noreorder
sync
retry6:
lld $3, 0($4)
bne $3, $5, done6
or $2, $6, 0
scd $2, 0($4)
beqz $2, retry6
done6:
xor $3,$3,$5
j ra
sltu $2,$3,1
.set reorder
END(pmix_atomic_cmpset_rel_64)
#endif /* __mips64 */
.section .note.GNU-stack,"",@progbits

Просмотреть файл

@ -1,197 +0,0 @@
#ifdef __linux__
#include <sys/asm.h>
#else
#include <asm.h>
#endif
#include <regdef.h>
.text
.align 3
LEAF(pmix_atomic_mb)
#ifdef __linux__
.set mips2
#endif
sync
#ifdef __linux__
.set mips0
#endif
j ra
END(pmix_atomic_mb)
.align 3
LEAF(pmix_atomic_rmb)
#ifdef __linux__
.set mips2
#endif
sync
#ifdef __linux__
.set mips0
#endif
j ra
END(pmix_atomic_rmb)
LEAF(pmix_atomic_wmb)
#ifdef __linux__
.set mips2
#endif
sync
#ifdef __linux__
.set mips0
#endif
j ra
END(pmix_atomic_wmb)
LEAF(pmix_atomic_cmpset_32)
.set noreorder
retry1:
#ifdef __linux__
.set mips2
#endif
ll $3, 0($4)
#ifdef __linux__
.set mips0
#endif
bne $3, $5, done1
or $2, $6, 0
#ifdef __linux__
.set mips2
#endif
sc $2, 0($4)
#ifdef __linux__
.set mips0
#endif
beqz $2, retry1
done1:
xor $3,$3,$5
j ra
sltu $2,$3,1
.set reorder
END(pmix_atomic_cmpset_32)
LEAF(pmix_atomic_cmpset_acq_32)
.set noreorder
retry2:
#ifdef __linux__
.set mips2
#endif
ll $3, 0($4)
#ifdef __linux__
.set mips0
#endif
bne $3, $5, done2
or $2, $6, 0
#ifdef __linux__
.set mips2
#endif
sc $2, 0($4)
#ifdef __linux__
.set mips0
#endif
beqz $2, retry2
done2:
#ifdef __linux__
.set mips2
#endif
sync
#ifdef __linux__
.set mips0
#endif
xor $3,$3,$5
j ra
sltu $2,$3,1
.set reorder
END(pmix_atomic_cmpset_acq_32)
LEAF(pmix_atomic_cmpset_rel_32)
.set noreorder
#ifdef __linux__
.set mips2
#endif
sync
#ifdef __linux__
.set mips0
#endif
retry3:
#ifdef __linux__
.set mips2
#endif
ll $3, 0($4)
#ifdef __linux__
.set mips0
#endif
bne $3, $5, done3
or $2, $6, 0
#ifdef __linux__
.set mips2
#endif
sc $2, 0($4)
#ifdef __linux__
.set mips0
#endif
beqz $2, retry3
done3:
xor $3,$3,$5
j ra
sltu $2,$3,1
.set reorder
END(pmix_atomic_cmpset_rel_32)
#ifdef __mips64
LEAF(pmix_atomic_cmpset_64)
.set noreorder
retry4:
lld $3, 0($4)
bne $3, $5, done4
or $2, $6, 0
scd $2, 0($4)
beqz $2, retry4
done4:
xor $3,$3,$5
j ra
sltu $2,$3,1
.set reorder
END(pmix_atomic_cmpset_64)
LEAF(pmix_atomic_cmpset_acq_64)
.set noreorder
retry5:
lld $3, 0($4)
bne $3, $5, done5
or $2, $6, 0
scd $2, 0($4)
beqz $2, retry5
done5:
sync
xor $3,$3,$5
j ra
sltu $2,$3,1
.set reorder
END(pmix_atomic_cmpset_acq_64)
LEAF(pmix_atomic_cmpset_rel_64)
.set noreorder
sync
retry6:
lld $3, 0($4)
bne $3, $5, done6
or $2, $6, 0
scd $2, 0($4)
beqz $2, retry6
done6:
xor $3,$3,$5
j ra
sltu $2,$3,1
.set reorder
END(pmix_atomic_cmpset_rel_64)
#endif /* __mips64 */
.section .note.GNU-stack,"",@progbits

Просмотреть файл

@ -1,195 +0,0 @@
#ifdef __linux__
#include <sys/asm.h>
#else
#include <asm.h>
#endif
#include <regdef.h>
.text
.align 3
LEAF(pmix_atomic_mb)
#ifdef __linux__
.set mips2
#endif
sync
#ifdef __linux__
.set mips0
#endif
j ra
END(pmix_atomic_mb)
.align 3
LEAF(pmix_atomic_rmb)
#ifdef __linux__
.set mips2
#endif
sync
#ifdef __linux__
.set mips0
#endif
j ra
END(pmix_atomic_rmb)
LEAF(pmix_atomic_wmb)
#ifdef __linux__
.set mips2
#endif
sync
#ifdef __linux__
.set mips0
#endif
j ra
END(pmix_atomic_wmb)
LEAF(pmix_atomic_cmpset_32)
.set noreorder
retry1:
#ifdef __linux__
.set mips2
#endif
ll $3, 0($4)
#ifdef __linux__
.set mips0
#endif
bne $3, $5, done1
or $2, $6, 0
#ifdef __linux__
.set mips2
#endif
sc $2, 0($4)
#ifdef __linux__
.set mips0
#endif
beqz $2, retry1
done1:
xor $3,$3,$5
j ra
sltu $2,$3,1
.set reorder
END(pmix_atomic_cmpset_32)
LEAF(pmix_atomic_cmpset_acq_32)
.set noreorder
retry2:
#ifdef __linux__
.set mips2
#endif
ll $3, 0($4)
#ifdef __linux__
.set mips0
#endif
bne $3, $5, done2
or $2, $6, 0
#ifdef __linux__
.set mips2
#endif
sc $2, 0($4)
#ifdef __linux__
.set mips0
#endif
beqz $2, retry2
done2:
#ifdef __linux__
.set mips2
#endif
sync
#ifdef __linux__
.set mips0
#endif
xor $3,$3,$5
j ra
sltu $2,$3,1
.set reorder
END(pmix_atomic_cmpset_acq_32)
LEAF(pmix_atomic_cmpset_rel_32)
.set noreorder
#ifdef __linux__
.set mips2
#endif
sync
#ifdef __linux__
.set mips0
#endif
retry3:
#ifdef __linux__
.set mips2
#endif
ll $3, 0($4)
#ifdef __linux__
.set mips0
#endif
bne $3, $5, done3
or $2, $6, 0
#ifdef __linux__
.set mips2
#endif
sc $2, 0($4)
#ifdef __linux__
.set mips0
#endif
beqz $2, retry3
done3:
xor $3,$3,$5
j ra
sltu $2,$3,1
.set reorder
END(pmix_atomic_cmpset_rel_32)
#ifdef __mips64
LEAF(pmix_atomic_cmpset_64)
.set noreorder
retry4:
lld $3, 0($4)
bne $3, $5, done4
or $2, $6, 0
scd $2, 0($4)
beqz $2, retry4
done4:
xor $3,$3,$5
j ra
sltu $2,$3,1
.set reorder
END(pmix_atomic_cmpset_64)
LEAF(pmix_atomic_cmpset_acq_64)
.set noreorder
retry5:
lld $3, 0($4)
bne $3, $5, done5
or $2, $6, 0
scd $2, 0($4)
beqz $2, retry5
done5:
sync
xor $3,$3,$5
j ra
sltu $2,$3,1
.set reorder
END(pmix_atomic_cmpset_acq_64)
LEAF(pmix_atomic_cmpset_rel_64)
.set noreorder
sync
retry6:
lld $3, 0($4)
bne $3, $5, done6
or $2, $6, 0
scd $2, 0($4)
beqz $2, retry6
done6:
xor $3,$3,$5
j ra
sltu $2,$3,1
.set reorder
END(pmix_atomic_cmpset_rel_64)
#endif /* __mips64 */

Просмотреть файл

@ -1,165 +0,0 @@
.text
.align 2
.globl _pmix_atomic_mb
_pmix_atomic_mb:
sync
blr
.globl _pmix_atomic_rmb
_pmix_atomic_rmb:
lwsync
blr
.globl _pmix_atomic_wmb
_pmix_atomic_wmb:
eieio
blr
.globl _pmix_atomic_cmpset_32
_pmix_atomic_cmpset_32:
L1: lwarx r0, 0, r3
cmpw 0, r0, r4
bne- L2
stwcx. r5, 0, r3
bne- L1
L2:
xor r3,r0,r4
subfic r5,r3,0
adde r3,r5,r3
blr
.globl _pmix_atomic_cmpset_acq_32
_pmix_atomic_cmpset_acq_32:
L3: lwarx r0, 0, r3
cmpw 0, r0, r4
bne- L4
stwcx. r5, 0, r3
bne- L3
sync
L4:
xor r3,r0,r4
subfic r5,r3,0
adde r3,r5,r3
lwsync
blr
.globl _pmix_atomic_cmpset_rel_32
_pmix_atomic_cmpset_rel_32:
eieio
L5: lwarx r0, 0, r3
cmpw 0, r0, r4
bne- L6
stwcx. r5, 0, r3
bne- L5
sync
L6:
xor r3,r0,r4
subfic r5,r3,0
adde r3,r5,r3
blr
.globl _pmix_atomic_cmpset_64
_pmix_atomic_cmpset_64:
stw r4,-32(r1)
stw r5,-28(r1)
stw r6,-24(r1)
stw r7,-20(r1)
ld r5,-32(r1)
ld r7,-24(r1)
L7: ldarx r9, 0, r3
cmpd 0, r9, r5
bne- L8
stdcx. r7, 0, r3
bne- L7
L8:
xor r3,r5,r9
subfic r5,r3,0
adde r3,r5,r3
blr
.globl _pmix_atomic_cmpset_acq_64
_pmix_atomic_cmpset_acq_64:
stw r4,-32(r1)
stw r5,-28(r1)
stw r6,-24(r1)
stw r7,-20(r1)
ld r5,-32(r1)
ld r7,-24(r1)
L9: ldarx r9, 0, r3
cmpd 0, r9, r5
bne- L10
stdcx. r7, 0, r3
bne- L9
L10:
xor r3,r5,r9
subfic r5,r3,0
adde r3,r5,r3
blr
lwsync
blr
.globl _pmix_atomic_cmpset_rel_64
_pmix_atomic_cmpset_rel_64:
stw r4,-32(r1)
stw r5,-28(r1)
stw r6,-24(r1)
stw r7,-20(r1)
ld r5,-32(r1)
ld r7,-24(r1)
eieio
L11: ldarx r9, 0, r3
cmpd 0, r9, r5
bne- L12
stdcx. r7, 0, r3
bne- L11
L12:
xor r3,r5,r9
subfic r5,r3,0
adde r3,r5,r3
blr
lwsync
blr
.globl _pmix_atomic_add_32
_pmix_atomic_add_32:
L13: lwarx r0, 0, r3
add r0, r4, r0
stwcx. r0, 0, r3
bne- L13
mr r3,r0
blr
.globl _pmix_atomic_sub_32
_pmix_atomic_sub_32:
L14: lwarx r0,0,r3
subf r0,r4,r0
stwcx. r0,0,r3
bne- L14
mr r3,r0
blr
.globl _pmix_sys_timer_get_cycles
_pmix_sys_timer_get_cycles:
L15:
mftbu r0
mftb r11
mftbu r2
cmpw cr7,r2,r0
bne+ cr7,L15
li r4,0
li r9,0
or r3,r2,r9
or r4,r4,r11
blr

Просмотреть файл

@ -1,156 +0,0 @@
.machine "ppc"
.toc
.csect .text[PR]
.align 2
.globl pmix_atomic_mb
.globl .pmix_atomic_mb
.csect [DS],3
pmix_atomic_mb:
.long .pmix_atomic_mb, TOC[tc0], 0
.csect [PR]
.align 2
.pmix_atomic_mb:
sync
blr
.globl pmix_atomic_rmb
.globl .pmix_atomic_rmb
.csect [DS],3
pmix_atomic_rmb:
.long .pmix_atomic_rmb, TOC[tc0], 0
.csect [PR]
.align 2
.pmix_atomic_rmb:
lwsync
blr
.globl pmix_atomic_wmb
.globl .pmix_atomic_wmb
.csect [DS],3
pmix_atomic_wmb:
.long .pmix_atomic_wmb, TOC[tc0], 0
.csect [PR]
.align 2
.pmix_atomic_wmb:
eieio
blr
.globl pmix_atomic_cmpset_32
.globl .pmix_atomic_cmpset_32
.csect [DS],3
pmix_atomic_cmpset_32:
.long .pmix_atomic_cmpset_32, TOC[tc0], 0
.csect [PR]
.align 2
.pmix_atomic_cmpset_32:
L1: lwarx 0, 0, 3
cmpw 0, 0, 4
bne- L2
stwcx. 5, 0, 3
bne- L1
L2:
xor 3,0,4
subfic 5,3,0
adde 3,5,3
blr
.globl pmix_atomic_cmpset_acq_32
.globl .pmix_atomic_cmpset_acq_32
.csect [DS],3
pmix_atomic_cmpset_acq_32:
.long .pmix_atomic_cmpset_acq_32, TOC[tc0], 0
.csect [PR]
.align 2
.pmix_atomic_cmpset_acq_32:
L3: lwarx 0, 0, 3
cmpw 0, 0, 4
bne- L4
stwcx. 5, 0, 3
bne- L3
sync
L4:
xor 3,0,4
subfic 5,3,0
adde 3,5,3
lwsync
blr
.globl pmix_atomic_cmpset_rel_32
.globl .pmix_atomic_cmpset_rel_32
.csect [DS],3
pmix_atomic_cmpset_rel_32:
.long .pmix_atomic_cmpset_rel_32, TOC[tc0], 0
.csect [PR]
.align 2
.pmix_atomic_cmpset_rel_32:
eieio
L5: lwarx 0, 0, 3
cmpw 0, 0, 4
bne- L6
stwcx. 5, 0, 3
bne- L5
sync
L6:
xor 3,0,4
subfic 5,3,0
adde 3,5,3
blr
.globl pmix_atomic_add_32
.globl .pmix_atomic_add_32
.csect [DS],3
pmix_atomic_add_32:
.long .pmix_atomic_add_32, TOC[tc0], 0
.csect [PR]
.align 2
.pmix_atomic_add_32:
L13: lwarx 0, 0, 3
add 0, 4, 0
stwcx. 0, 0, 3
bne- L13
mr 3,0
blr
.globl pmix_atomic_sub_32
.globl .pmix_atomic_sub_32
.csect [DS],3
pmix_atomic_sub_32:
.long .pmix_atomic_sub_32, TOC[tc0], 0
.csect [PR]
.align 2
.pmix_atomic_sub_32:
L14: lwarx 0,0,3
subf 0,4,0
stwcx. 0,0,3
bne- L14
mr 3,0
blr
.globl pmix_sys_timer_get_cycles
.globl .pmix_sys_timer_get_cycles
.csect [DS],3
pmix_sys_timer_get_cycles:
.long .pmix_sys_timer_get_cycles, TOC[tc0], 0
.csect [PR]
.align 2
.pmix_sys_timer_get_cycles:
L15:
mftbu 0
mftb 11
mftbu 2
cmpw 7,2,0
bne+ 7,L15
li 4,0
li 9,0
or 3,2,9
or 4,4,11
blr

Просмотреть файл

@ -1,118 +0,0 @@
.text
.align 2
.globl pmix_atomic_mb
.type pmix_atomic_mb, @function
pmix_atomic_mb:
sync
blr
.size pmix_atomic_mb, .-pmix_atomic_mb
.globl pmix_atomic_rmb
.type pmix_atomic_rmb, @function
pmix_atomic_rmb:
lwsync
blr
.size pmix_atomic_rmb, .-pmix_atomic_rmb
.globl pmix_atomic_wmb
.type pmix_atomic_wmb, @function
pmix_atomic_wmb:
eieio
blr
.size pmix_atomic_wmb, .-pmix_atomic_wmb
.globl pmix_atomic_cmpset_32
.type pmix_atomic_cmpset_32, @function
pmix_atomic_cmpset_32:
.L1: lwarx 0, 0, 3
cmpw 0, 0, 4
bne- .L2
stwcx. 5, 0, 3
bne- .L1
.L2:
xor 3,0,4
subfic 5,3,0
adde 3,5,3
blr
.size pmix_atomic_cmpset_32, .-pmix_atomic_cmpset_32
.globl pmix_atomic_cmpset_acq_32
.type pmix_atomic_cmpset_acq_32, @function
pmix_atomic_cmpset_acq_32:
.L3: lwarx 0, 0, 3
cmpw 0, 0, 4
bne- .L4
stwcx. 5, 0, 3
bne- .L3
sync
.L4:
xor 3,0,4
subfic 5,3,0
adde 3,5,3
lwsync
blr
.size pmix_atomic_cmpset_acq_32, .-pmix_atomic_cmpset_acq_32
.globl pmix_atomic_cmpset_rel_32
.type pmix_atomic_cmpset_rel_32, @function
pmix_atomic_cmpset_rel_32:
eieio
.L5: lwarx 0, 0, 3
cmpw 0, 0, 4
bne- .L6
stwcx. 5, 0, 3
bne- .L5
sync
.L6:
xor 3,0,4
subfic 5,3,0
adde 3,5,3
blr
.size pmix_atomic_cmpset_rel_32, .-pmix_atomic_cmpset_rel_32
.globl pmix_atomic_add_32
.type pmix_atomic_add_32, @function
pmix_atomic_add_32:
.L13: lwarx 0, 0, 3
add 0, 4, 0
stwcx. 0, 0, 3
bne- .L13
mr 3,0
blr
.size pmix_atomic_add_32, .-pmix_atomic_add_32
.globl pmix_atomic_sub_32
.type pmix_atomic_sub_32, @function
pmix_atomic_sub_32:
.L14: lwarx 0,0,3
subf 0,4,0
stwcx. 0,0,3
bne- .L14
mr 3,0
blr
.size pmix_atomic_sub_32, .-pmix_atomic_sub_32
.globl pmix_sys_timer_get_cycles
.type pmix_sys_timer_get_cycles, @function
pmix_sys_timer_get_cycles:
.L15:
mftbu 0
mftb 11
mftbu 2
cmpw 7,2,0
bne+ 7,.L15
li 4,0
li 9,0
or 3,2,9
or 4,4,11
blr
.size pmix_sys_timer_get_cycles, .-pmix_sys_timer_get_cycles

Просмотреть файл

@ -1,120 +0,0 @@
.text
.align 2
.globl pmix_atomic_mb
.type pmix_atomic_mb, @function
pmix_atomic_mb:
sync
blr
.size pmix_atomic_mb, .-pmix_atomic_mb
.globl pmix_atomic_rmb
.type pmix_atomic_rmb, @function
pmix_atomic_rmb:
lwsync
blr
.size pmix_atomic_rmb, .-pmix_atomic_rmb
.globl pmix_atomic_wmb
.type pmix_atomic_wmb, @function
pmix_atomic_wmb:
eieio
blr
.size pmix_atomic_wmb, .-pmix_atomic_wmb
.globl pmix_atomic_cmpset_32
.type pmix_atomic_cmpset_32, @function
pmix_atomic_cmpset_32:
.L1: lwarx 0, 0, 3
cmpw 0, 0, 4
bne- .L2
stwcx. 5, 0, 3
bne- .L1
.L2:
xor 3,0,4
subfic 5,3,0
adde 3,5,3
blr
.size pmix_atomic_cmpset_32, .-pmix_atomic_cmpset_32
.globl pmix_atomic_cmpset_acq_32
.type pmix_atomic_cmpset_acq_32, @function
pmix_atomic_cmpset_acq_32:
.L3: lwarx 0, 0, 3
cmpw 0, 0, 4
bne- .L4
stwcx. 5, 0, 3
bne- .L3
sync
.L4:
xor 3,0,4
subfic 5,3,0
adde 3,5,3
lwsync
blr
.size pmix_atomic_cmpset_acq_32, .-pmix_atomic_cmpset_acq_32
.globl pmix_atomic_cmpset_rel_32
.type pmix_atomic_cmpset_rel_32, @function
pmix_atomic_cmpset_rel_32:
eieio
.L5: lwarx 0, 0, 3
cmpw 0, 0, 4
bne- .L6
stwcx. 5, 0, 3
bne- .L5
sync
.L6:
xor 3,0,4
subfic 5,3,0
adde 3,5,3
blr
.size pmix_atomic_cmpset_rel_32, .-pmix_atomic_cmpset_rel_32
.globl pmix_atomic_add_32
.type pmix_atomic_add_32, @function
pmix_atomic_add_32:
.L13: lwarx 0, 0, 3
add 0, 4, 0
stwcx. 0, 0, 3
bne- .L13
mr 3,0
blr
.size pmix_atomic_add_32, .-pmix_atomic_add_32
.globl pmix_atomic_sub_32
.type pmix_atomic_sub_32, @function
pmix_atomic_sub_32:
.L14: lwarx 0,0,3
subf 0,4,0
stwcx. 0,0,3
bne- .L14
mr 3,0
blr
.size pmix_atomic_sub_32, .-pmix_atomic_sub_32
.globl pmix_sys_timer_get_cycles
.type pmix_sys_timer_get_cycles, @function
pmix_sys_timer_get_cycles:
.L15:
mftbu 0
mftb 11
mftbu 2
cmpw 7,2,0
bne+ 7,.L15
li 4,0
li 9,0
or 3,2,9
or 4,4,11
blr
.size pmix_sys_timer_get_cycles, .-pmix_sys_timer_get_cycles
.section .note.GNU-stack,"",@progbits

Просмотреть файл

@ -1,100 +0,0 @@
.text
.align 2
.globl _pmix_atomic_mb
_pmix_atomic_mb:
sync
blr
.globl _pmix_atomic_rmb
_pmix_atomic_rmb:
lwsync
blr
.globl _pmix_atomic_wmb
_pmix_atomic_wmb:
eieio
blr
.globl _pmix_atomic_cmpset_32
_pmix_atomic_cmpset_32:
L1: lwarx r0, 0, r3
cmpw 0, r0, r4
bne- L2
stwcx. r5, 0, r3
bne- L1
L2:
xor r3,r0,r4
subfic r5,r3,0
adde r3,r5,r3
blr
.globl _pmix_atomic_cmpset_acq_32
_pmix_atomic_cmpset_acq_32:
L3: lwarx r0, 0, r3
cmpw 0, r0, r4
bne- L4
stwcx. r5, 0, r3
bne- L3
sync
L4:
xor r3,r0,r4
subfic r5,r3,0
adde r3,r5,r3
lwsync
blr
.globl _pmix_atomic_cmpset_rel_32
_pmix_atomic_cmpset_rel_32:
eieio
L5: lwarx r0, 0, r3
cmpw 0, r0, r4
bne- L6
stwcx. r5, 0, r3
bne- L5
sync
L6:
xor r3,r0,r4
subfic r5,r3,0
adde r3,r5,r3
blr
.globl _pmix_atomic_add_32
_pmix_atomic_add_32:
L13: lwarx r0, 0, r3
add r0, r4, r0
stwcx. r0, 0, r3
bne- L13
mr r3,r0
blr
.globl _pmix_atomic_sub_32
_pmix_atomic_sub_32:
L14: lwarx r0,0,r3
subf r0,r4,r0
stwcx. r0,0,r3
bne- L14
mr r3,r0
blr
.globl _pmix_sys_timer_get_cycles
_pmix_sys_timer_get_cycles:
L15:
mftbu r0
mftb r11
mftbu r2
cmpw cr7,r2,r0
bne+ cr7,L15
li r4,0
li r9,0
or r3,r2,r9
or r4,r4,r11
blr

Просмотреть файл

@ -1,230 +0,0 @@
.machine "ppc64"
.toc
.csect .text[PR]
.align 2
.globl pmix_atomic_mb
.globl .pmix_atomic_mb
.csect [DS],3
pmix_atomic_mb:
.llong .pmix_atomic_mb, TOC[tc0], 0
.csect [PR]
.align 2
.pmix_atomic_mb:
sync
blr
.globl pmix_atomic_rmb
.globl .pmix_atomic_rmb
.csect [DS],3
pmix_atomic_rmb:
.llong .pmix_atomic_rmb, TOC[tc0], 0
.csect [PR]
.align 2
.pmix_atomic_rmb:
lwsync
blr
.globl pmix_atomic_wmb
.globl .pmix_atomic_wmb
.csect [DS],3
pmix_atomic_wmb:
.llong .pmix_atomic_wmb, TOC[tc0], 0
.csect [PR]
.align 2
.pmix_atomic_wmb:
eieio
blr
.globl pmix_atomic_cmpset_32
.globl .pmix_atomic_cmpset_32
.csect [DS],3
pmix_atomic_cmpset_32:
.llong .pmix_atomic_cmpset_32, TOC[tc0], 0
.csect [PR]
.align 2
.pmix_atomic_cmpset_32:
L1: lwarx 0, 0, 3
cmpw 0, 0, 4
bne- L2
stwcx. 5, 0, 3
bne- L1
L2:
cmpw 7,0,4
mfcr 3
rlwinm 3,3,31,1
blr
.globl pmix_atomic_cmpset_acq_32
.globl .pmix_atomic_cmpset_acq_32
.csect [DS],3
pmix_atomic_cmpset_acq_32:
.llong .pmix_atomic_cmpset_acq_32, TOC[tc0], 0
.csect [PR]
.align 2
.pmix_atomic_cmpset_acq_32:
mflr 0
std 29,-24(1)
std 0,16(1)
stdu 1,-144(1)
bl .pmix_atomic_cmpset_32
mr 29,3
bl .pmix_atomic_rmb
mr 3,29
addi 1,1,144
ld 0,16(1)
mtlr 0
ld 29,-24(1)
blr
.globl pmix_atomic_cmpset_rel_32
.globl .pmix_atomic_cmpset_rel_32
.csect [DS],3
pmix_atomic_cmpset_rel_32:
.llong .pmix_atomic_cmpset_rel_32, TOC[tc0], 0
.csect [PR]
.align 2
.pmix_atomic_cmpset_rel_32:
mflr 0
std 27,-40(1)
std 28,-32(1)
std 29,-24(1)
std 0,16(1)
stdu 1,-160(1)
mr 29,3
mr 28,4
mr 27,5
bl .pmix_atomic_wmb
mr 3,29
mr 4,28
mr 5,27
bl .pmix_atomic_cmpset_32
addi 1,1,160
ld 0,16(1)
mtlr 0
ld 27,-40(1)
ld 28,-32(1)
ld 29,-24(1)
blr
.globl pmix_atomic_cmpset_64
.globl .pmix_atomic_cmpset_64
.csect [DS],3
pmix_atomic_cmpset_64:
.llong .pmix_atomic_cmpset_64, TOC[tc0], 0
.csect [PR]
.align 2
.pmix_atomic_cmpset_64:
L3: ldarx 0, 0, 3
cmpd 0, 0, 4
bne- L4
stdcx. 5, 0, 3
bne- L3
L4:
xor 3,4,0
subfic 5,3,0
adde 3,5,3
blr
.globl pmix_atomic_cmpset_acq_64
.globl .pmix_atomic_cmpset_acq_64
.csect [DS],3
pmix_atomic_cmpset_acq_64:
.llong .pmix_atomic_cmpset_acq_64, TOC[tc0], 0
.csect [PR]
.align 2
.pmix_atomic_cmpset_acq_64:
L7: ldarx 0, 0, 3
cmpd 0, 0, 4
bne- L8
stdcx. 5, 0, 3
bne- L7
L8:
lwsync
xor 3,4,0
subfic 5,3,0
adde 3,5,3
blr
.globl pmix_atomic_cmpset_rel_64
.globl .pmix_atomic_cmpset_rel_64
.csect [DS],3
pmix_atomic_cmpset_rel_64:
.llong .pmix_atomic_cmpset_rel_64, TOC[tc0], 0
.csect [PR]
.align 2
.pmix_atomic_cmpset_rel_64:
eieio
L9: ldarx 0, 0, 3
cmpd 0, 0, 4
bne- L10
stdcx. 5, 0, 3
bne- L9
L10:
xor 3,4,0
subfic 5,3,0
adde 3,5,3
blr
.globl pmix_atomic_add_32
.globl .pmix_atomic_add_32
.csect [DS],3
pmix_atomic_add_32:
.llong .pmix_atomic_add_32, TOC[tc0], 0
.csect [PR]
.align 2
.pmix_atomic_add_32:
L5: lwarx 0, 0, 3
add 0, 4, 0
stwcx. 0, 0, 3
bne- L5
mr 3,0
blr
.globl pmix_atomic_sub_32
.globl .pmix_atomic_sub_32
.csect [DS],3
pmix_atomic_sub_32:
.llong .pmix_atomic_sub_32, TOC[tc0], 0
.csect [PR]
.align 2
.pmix_atomic_sub_32:
L6: lwarx 0,0,3
subf 0,4,0
stwcx. 0,0,3
bne- L6
mr 3,0
blr
.globl pmix_sys_timer_get_cycles
.globl .pmix_sys_timer_get_cycles
.csect [DS],3
pmix_sys_timer_get_cycles:
.llong .pmix_sys_timer_get_cycles, TOC[tc0], 0
.csect [PR]
.align 2
.pmix_sys_timer_get_cycles:
L11:
mftbu 2
rldicl 2,2,0,32
mftb 0
rldicl 9,0,0,32
mftbu 0
rldicl 0,0,0,32
cmpw 7,0,2
bne 7,L11
sldi 3,0,32
or 3,3,9
blr

Просмотреть файл

@ -1,180 +0,0 @@
.text
.align 2
.globl .pmix_atomic_mb
.type .pmix_atomic_mb, @function
.pmix_atomic_mb:
sync
blr
.size .pmix_atomic_mb, .-.pmix_atomic_mb
.globl .pmix_atomic_rmb
.type .pmix_atomic_rmb, @function
.pmix_atomic_rmb:
lwsync
blr
.size .pmix_atomic_rmb, .-.pmix_atomic_rmb
.globl .pmix_atomic_wmb
.type .pmix_atomic_wmb, @function
.pmix_atomic_wmb:
eieio
blr
.size .pmix_atomic_wmb, .-.pmix_atomic_wmb
.globl .pmix_atomic_cmpset_32
.type .pmix_atomic_cmpset_32, @function
.pmix_atomic_cmpset_32:
.L1: lwarx 0, 0, 3
cmpw 0, 0, 4
bne- .L2
stwcx. 5, 0, 3
bne- .L1
.L2:
cmpw 7,0,4
mfcr 3
rlwinm 3,3,31,1
blr
.size .pmix_atomic_cmpset_32, .-.pmix_atomic_cmpset_32
.globl .pmix_atomic_cmpset_acq_32
.type .pmix_atomic_cmpset_acq_32, @function
.pmix_atomic_cmpset_acq_32:
mflr 0
std 29,-24(1)
std 0,16(1)
stdu 1,-144(1)
bl .pmix_atomic_cmpset_32
mr 29,3
bl .pmix_atomic_rmb
mr 3,29
addi 1,1,144
ld 0,16(1)
mtlr 0
ld 29,-24(1)
blr
.size .pmix_atomic_cmpset_acq_32, .-.pmix_atomic_cmpset_acq_32
.globl .pmix_atomic_cmpset_rel_32
.type .pmix_atomic_cmpset_rel_32, @function
.pmix_atomic_cmpset_rel_32:
mflr 0
std 27,-40(1)
std 28,-32(1)
std 29,-24(1)
std 0,16(1)
stdu 1,-160(1)
mr 29,3
mr 28,4
mr 27,5
bl .pmix_atomic_wmb
mr 3,29
mr 4,28
mr 5,27
bl .pmix_atomic_cmpset_32
addi 1,1,160
ld 0,16(1)
mtlr 0
ld 27,-40(1)
ld 28,-32(1)
ld 29,-24(1)
blr
.size .pmix_atomic_cmpset_rel_32, .-.pmix_atomic_cmpset_rel_32
.globl .pmix_atomic_cmpset_64
.type .pmix_atomic_cmpset_64, @function
.pmix_atomic_cmpset_64:
.L3: ldarx 0, 0, 3
cmpd 0, 0, 4
bne- .L4
stdcx. 5, 0, 3
bne- .L3
.L4:
xor 3,4,0
subfic 5,3,0
adde 3,5,3
blr
.size .pmix_atomic_cmpset_64, .-.pmix_atomic_cmpset_64
.globl .pmix_atomic_cmpset_acq_64
.type .pmix_atomic_cmpset_acq_64, @function
.pmix_atomic_cmpset_acq_64:
.L7: ldarx 0, 0, 3
cmpd 0, 0, 4
bne- .L8
stdcx. 5, 0, 3
bne- .L7
.L8:
lwsync
xor 3,4,0
subfic 5,3,0
adde 3,5,3
blr
.size .pmix_atomic_cmpset_acq_64, .-.pmix_atomic_cmpset_acq_64
.globl .pmix_atomic_cmpset_rel_64
.type .pmix_atomic_cmpset_rel_64, @function
.pmix_atomic_cmpset_rel_64:
eieio
.L9: ldarx 0, 0, 3
cmpd 0, 0, 4
bne- .L10
stdcx. 5, 0, 3
bne- .L9
.L10:
xor 3,4,0
subfic 5,3,0
adde 3,5,3
blr
.size .pmix_atomic_cmpset_rel_64, .-.pmix_atomic_cmpset_rel_64
.globl .pmix_atomic_add_32
.type .pmix_atomic_add_32, @function
.pmix_atomic_add_32:
.L5: lwarx 0, 0, 3
add 0, 4, 0
stwcx. 0, 0, 3
bne- .L5
mr 3,0
blr
.size .pmix_atomic_add_32, .-.pmix_atomic_add_32
.globl .pmix_atomic_sub_32
.type .pmix_atomic_sub_32, @function
.pmix_atomic_sub_32:
.L6: lwarx 0,0,3
subf 0,4,0
stwcx. 0,0,3
bne- .L6
mr 3,0
blr
.size .pmix_atomic_sub_32, .-.pmix_atomic_sub_32
.globl .pmix_sys_timer_get_cycles
.type .pmix_sys_timer_get_cycles, @function
.pmix_sys_timer_get_cycles:
.L11:
mftbu 2
rldicl 2,2,0,32
mftb 0
rldicl 9,0,0,32
mftbu 0
rldicl 0,0,0,32
cmpw 7,0,2
bne 7,.L11
sldi 3,0,32
or 3,3,9
blr
.size .pmix_sys_timer_get_cycles, .-.pmix_sys_timer_get_cycles

Просмотреть файл

@ -1,182 +0,0 @@
.text
.align 2
.globl .pmix_atomic_mb
.type .pmix_atomic_mb, @function
.pmix_atomic_mb:
sync
blr
.size .pmix_atomic_mb, .-.pmix_atomic_mb
.globl .pmix_atomic_rmb
.type .pmix_atomic_rmb, @function
.pmix_atomic_rmb:
lwsync
blr
.size .pmix_atomic_rmb, .-.pmix_atomic_rmb
.globl .pmix_atomic_wmb
.type .pmix_atomic_wmb, @function
.pmix_atomic_wmb:
eieio
blr
.size .pmix_atomic_wmb, .-.pmix_atomic_wmb
.globl .pmix_atomic_cmpset_32
.type .pmix_atomic_cmpset_32, @function
.pmix_atomic_cmpset_32:
.L1: lwarx 0, 0, 3
cmpw 0, 0, 4
bne- .L2
stwcx. 5, 0, 3
bne- .L1
.L2:
cmpw 7,0,4
mfcr 3
rlwinm 3,3,31,1
blr
.size .pmix_atomic_cmpset_32, .-.pmix_atomic_cmpset_32
.globl .pmix_atomic_cmpset_acq_32
.type .pmix_atomic_cmpset_acq_32, @function
.pmix_atomic_cmpset_acq_32:
mflr 0
std 29,-24(1)
std 0,16(1)
stdu 1,-144(1)
bl .pmix_atomic_cmpset_32
mr 29,3
bl .pmix_atomic_rmb
mr 3,29
addi 1,1,144
ld 0,16(1)
mtlr 0
ld 29,-24(1)
blr
.size .pmix_atomic_cmpset_acq_32, .-.pmix_atomic_cmpset_acq_32
.globl .pmix_atomic_cmpset_rel_32
.type .pmix_atomic_cmpset_rel_32, @function
.pmix_atomic_cmpset_rel_32:
mflr 0
std 27,-40(1)
std 28,-32(1)
std 29,-24(1)
std 0,16(1)
stdu 1,-160(1)
mr 29,3
mr 28,4
mr 27,5
bl .pmix_atomic_wmb
mr 3,29
mr 4,28
mr 5,27
bl .pmix_atomic_cmpset_32
addi 1,1,160
ld 0,16(1)
mtlr 0
ld 27,-40(1)
ld 28,-32(1)
ld 29,-24(1)
blr
.size .pmix_atomic_cmpset_rel_32, .-.pmix_atomic_cmpset_rel_32
.globl .pmix_atomic_cmpset_64
.type .pmix_atomic_cmpset_64, @function
.pmix_atomic_cmpset_64:
.L3: ldarx 0, 0, 3
cmpd 0, 0, 4
bne- .L4
stdcx. 5, 0, 3
bne- .L3
.L4:
xor 3,4,0
subfic 5,3,0
adde 3,5,3
blr
.size .pmix_atomic_cmpset_64, .-.pmix_atomic_cmpset_64
.globl .pmix_atomic_cmpset_acq_64
.type .pmix_atomic_cmpset_acq_64, @function
.pmix_atomic_cmpset_acq_64:
.L7: ldarx 0, 0, 3
cmpd 0, 0, 4
bne- .L8
stdcx. 5, 0, 3
bne- .L7
.L8:
lwsync
xor 3,4,0
subfic 5,3,0
adde 3,5,3
blr
.size .pmix_atomic_cmpset_acq_64, .-.pmix_atomic_cmpset_acq_64
.globl .pmix_atomic_cmpset_rel_64
.type .pmix_atomic_cmpset_rel_64, @function
.pmix_atomic_cmpset_rel_64:
eieio
.L9: ldarx 0, 0, 3
cmpd 0, 0, 4
bne- .L10
stdcx. 5, 0, 3
bne- .L9
.L10:
xor 3,4,0
subfic 5,3,0
adde 3,5,3
blr
.size .pmix_atomic_cmpset_rel_64, .-.pmix_atomic_cmpset_rel_64
.globl .pmix_atomic_add_32
.type .pmix_atomic_add_32, @function
.pmix_atomic_add_32:
.L5: lwarx 0, 0, 3
add 0, 4, 0
stwcx. 0, 0, 3
bne- .L5
mr 3,0
blr
.size .pmix_atomic_add_32, .-.pmix_atomic_add_32
.globl .pmix_atomic_sub_32
.type .pmix_atomic_sub_32, @function
.pmix_atomic_sub_32:
.L6: lwarx 0,0,3
subf 0,4,0
stwcx. 0,0,3
bne- .L6
mr 3,0
blr
.size .pmix_atomic_sub_32, .-.pmix_atomic_sub_32
.globl .pmix_sys_timer_get_cycles
.type .pmix_sys_timer_get_cycles, @function
.pmix_sys_timer_get_cycles:
.L11:
mftbu 2
rldicl 2,2,0,32
mftb 0
rldicl 9,0,0,32
mftbu 0
rldicl 0,0,0,32
cmpw 7,0,2
bne 7,.L11
sldi 3,0,32
or 3,3,9
blr
.size .pmix_sys_timer_get_cycles, .-.pmix_sys_timer_get_cycles
.section .note.GNU-stack,"",@progbits

Просмотреть файл

@ -1,156 +0,0 @@
.text
.align 2
.globl _pmix_atomic_mb
_pmix_atomic_mb:
sync
blr
.globl _pmix_atomic_rmb
_pmix_atomic_rmb:
lwsync
blr
.globl _pmix_atomic_wmb
_pmix_atomic_wmb:
eieio
blr
.globl _pmix_atomic_cmpset_32
_pmix_atomic_cmpset_32:
L1: lwarx r0, 0, r3
cmpw 0, r0, r4
bne- L2
stwcx. r5, 0, r3
bne- L1
L2:
cmpw cr7,r0,r4
mfcr r3
rlwinm r3,r3,31,1
blr
.globl _pmix_atomic_cmpset_acq_32
_pmix_atomic_cmpset_acq_32:
mflr r0
std r29,-24(r1)
std r0,16(r1)
stdu r1,-144(r1)
bl _pmix_atomic_cmpset_32
mr r29,r3
bl _pmix_atomic_rmb
mr r3,r29
addi r1,r1,144
ld r0,16(r1)
mtlr r0
ld r29,-24(r1)
blr
.globl _pmix_atomic_cmpset_rel_32
_pmix_atomic_cmpset_rel_32:
mflr r0
std r27,-40(r1)
std r28,-32(r1)
std r29,-24(r1)
std r0,16(r1)
stdu r1,-160(r1)
mr r29,r3
mr r28,r4
mr r27,r5
bl _pmix_atomic_wmb
mr r3,r29
mr r4,r28
mr r5,r27
bl _pmix_atomic_cmpset_32
addi r1,r1,160
ld r0,16(r1)
mtlr r0
ld r27,-40(r1)
ld r28,-32(r1)
ld r29,-24(r1)
blr
.globl _pmix_atomic_cmpset_64
_pmix_atomic_cmpset_64:
L3: ldarx r0, 0, r3
cmpd 0, r0, r4
bne- L4
stdcx. r5, 0, r3
bne- L3
L4:
xor r3,r4,r0
subfic r5,r3,0
adde r3,r5,r3
blr
.globl _pmix_atomic_cmpset_acq_64
_pmix_atomic_cmpset_acq_64:
L7: ldarx r0, 0, r3
cmpd 0, r0, r4
bne- L8
stdcx. r5, 0, r3
bne- L7
L8:
lwsync
xor r3,r4,r0
subfic r5,r3,0
adde r3,r5,r3
blr
.globl _pmix_atomic_cmpset_rel_64
_pmix_atomic_cmpset_rel_64:
eieio
L9: ldarx r0, 0, r3
cmpd 0, r0, r4
bne- L10
stdcx. r5, 0, r3
bne- L9
L10:
xor r3,r4,r0
subfic r5,r3,0
adde r3,r5,r3
blr
.globl _pmix_atomic_add_32
_pmix_atomic_add_32:
L5: lwarx r0, 0, r3
add r0, r4, r0
stwcx. r0, 0, r3
bne- L5
mr r3,r0
blr
.globl _pmix_atomic_sub_32
_pmix_atomic_sub_32:
L6: lwarx r0,0,r3
subf r0,r4,r0
stwcx. r0,0,r3
bne- L6
mr r3,r0
blr
.globl _pmix_sys_timer_get_cycles
_pmix_sys_timer_get_cycles:
L11:
mftbu r2
rldicl r2,r2,0,32
mftb r0
rldicl r9,r0,0,32
mftbu r0
rldicl r0,r0,0,32
cmpw cr7,r0,r2
bne cr7,L11
sldi r3,r0,32
or r3,r3,r9
blr

Просмотреть файл

@ -1,190 +0,0 @@
.text
.align 4
.globl pmix_atomic_mb
.type pmix_atomic_mb, #function
pmix_atomic_mb:
!#PROLOGUE# 0
!#PROLOGUE# 1
membar #LoadLoad | #LoadStore | #StoreStore | #StoreLoad
retl
nop
.size pmix_atomic_mb, .-pmix_atomic_mb
.globl pmix_atomic_rmb
.type pmix_atomic_rmb, #function
pmix_atomic_rmb:
!#PROLOGUE# 0
!#PROLOGUE# 1
membar #LoadLoad
retl
nop
.size pmix_atomic_rmb, .-pmix_atomic_rmb
.globl pmix_atomic_wmb
.type pmix_atomic_wmb, #function
pmix_atomic_wmb:
!#PROLOGUE# 0
!#PROLOGUE# 1
membar #StoreStore
retl
nop
.size pmix_atomic_wmb, .-pmix_atomic_wmb
.globl pmix_atomic_cmpset_32
.type pmix_atomic_cmpset_32, #function
pmix_atomic_cmpset_32:
!#PROLOGUE# 0
!#PROLOGUE# 1
casa [%o0] 0x80, %o1, %o2
xor %o2, %o1, %o2
subcc %g0, %o2, %g0
retl
subx %g0, -1, %o0
.size pmix_atomic_cmpset_32, .-pmix_atomic_cmpset_32
.globl pmix_atomic_cmpset_acq_32
.type pmix_atomic_cmpset_acq_32, #function
pmix_atomic_cmpset_acq_32:
!#PROLOGUE# 0
!#PROLOGUE# 1
casa [%o0] 0x80, %o1, %o2
xor %o2, %o1, %o2
subcc %g0, %o2, %g0
subx %g0, -1, %o0
membar #LoadLoad
retl
sra %o0, 0, %o0
.size pmix_atomic_cmpset_acq_32, .-pmix_atomic_cmpset_acq_32
.globl pmix_atomic_cmpset_rel_32
.type pmix_atomic_cmpset_rel_32, #function
pmix_atomic_cmpset_rel_32:
!#PROLOGUE# 0
!#PROLOGUE# 1
membar #StoreStore
casa [%o0] 0x80, %o1, %o2
xor %o2, %o1, %o2
subcc %g0, %o2, %g0
retl
subx %g0, -1, %o0
.size pmix_atomic_cmpset_rel_32, .-pmix_atomic_cmpset_rel_32
.globl pmix_atomic_cmpset_64
.type pmix_atomic_cmpset_64, #function
pmix_atomic_cmpset_64:
!#PROLOGUE# 0
save %sp, -128, %sp
!#PROLOGUE# 1
mov %i3, %o4
mov %i4, %o5
st %i1, [%fp-32]
st %i2, [%fp-28]
std %o4, [%fp-24]
ldx [%fp-24], %g1
ldx [%fp-32], %g2
casxa [%i0] 0x80, %g2, %g1
stx %g1, [%fp-24]
ld [%fp-24], %i5
ld [%fp-32], %g1
cmp %i5, %g1
bne .L12
mov 0, %i0
ld [%fp-20], %i2
ld [%fp-28], %i1
cmp %i2, %i1
be,a .L12
mov 1, %i0
.L12:
ret
restore
.size pmix_atomic_cmpset_64, .-pmix_atomic_cmpset_64
.globl pmix_atomic_cmpset_acq_64
.type pmix_atomic_cmpset_acq_64, #function
pmix_atomic_cmpset_acq_64:
!#PROLOGUE# 0
save %sp, -128, %sp
!#PROLOGUE# 1
mov %i1, %o4
mov %i2, %o5
mov %i3, %o2
mov %i4, %o3
std %o4, [%fp-32]
std %o2, [%fp-24]
ldx [%fp-24], %g1
ldx [%fp-32], %g2
casxa [%i0] 0x80, %g2, %g1
stx %g1, [%fp-24]
ld [%fp-24], %i5
ld [%fp-32], %g1
cmp %i5, %g1
bne .L16
mov 0, %i0
ld [%fp-20], %i2
ld [%fp-28], %i1
cmp %i2, %i1
be,a .L16
mov 1, %i0
.L16:
membar #LoadLoad
ret
restore
.size pmix_atomic_cmpset_acq_64, .-pmix_atomic_cmpset_acq_64
.globl pmix_atomic_cmpset_rel_64
.type pmix_atomic_cmpset_rel_64, #function
pmix_atomic_cmpset_rel_64:
!#PROLOGUE# 0
save %sp, -128, %sp
!#PROLOGUE# 1
mov %i1, %o4
mov %i2, %o5
mov %i3, %o2
mov %i4, %o3
membar #StoreStore
std %o4, [%fp-32]
std %o2, [%fp-24]
ldx [%fp-24], %g1
ldx [%fp-32], %g2
casxa [%i0] 0x80, %g2, %g1
stx %g1, [%fp-24]
ld [%fp-24], %i5
ld [%fp-32], %g1
cmp %i5, %g1
bne .L21
mov 0, %i0
ld [%fp-20], %i2
ld [%fp-28], %i1
cmp %i2, %i1
be,a .L21
mov 1, %i0
.L21:
ret
restore
.size pmix_atomic_cmpset_rel_64, .-pmix_atomic_cmpset_rel_64
.globl pmix_sys_timer_get_cycles
.type pmix_sys_timer_get_cycles, #function
pmix_sys_timer_get_cycles:
save %sp,-96,%sp
rd %tick,%o0
srlx %o0,32,%o1
or %g0,%o1,%i0
ret ! Result = %i0
restore %o0,0,%o1
.size pmix_sys_timer_get_cycles, .-pmix_sys_timer_get_cycles

Просмотреть файл

@ -1,130 +0,0 @@
.text
.align 4
.globl pmix_atomic_mb
.type pmix_atomic_mb, #function
pmix_atomic_mb:
!#PROLOGUE# 0
!#PROLOGUE# 1
membar #LoadLoad | #LoadStore | #StoreStore | #StoreLoad
retl
nop
.size pmix_atomic_mb, .-pmix_atomic_mb
.globl pmix_atomic_rmb
.type pmix_atomic_rmb, #function
pmix_atomic_rmb:
!#PROLOGUE# 0
!#PROLOGUE# 1
membar #LoadLoad
retl
nop
.size pmix_atomic_rmb, .-pmix_atomic_rmb
.globl pmix_atomic_wmb
.type pmix_atomic_wmb, #function
pmix_atomic_wmb:
!#PROLOGUE# 0
!#PROLOGUE# 1
membar #StoreStore
retl
nop
.size pmix_atomic_wmb, .-pmix_atomic_wmb
.globl pmix_atomic_cmpset_32
.type pmix_atomic_cmpset_32, #function
pmix_atomic_cmpset_32:
!#PROLOGUE# 0
!#PROLOGUE# 1
casa [%o0] 0x80, %o1, %o2
xor %o2, %o1, %o2
subcc %g0, %o2, %g0
retl
subx %g0, -1, %o0
.size pmix_atomic_cmpset_32, .-pmix_atomic_cmpset_32
.globl pmix_atomic_cmpset_acq_32
.type pmix_atomic_cmpset_acq_32, #function
pmix_atomic_cmpset_acq_32:
!#PROLOGUE# 0
!#PROLOGUE# 1
casa [%o0] 0x80, %o1, %o2
xor %o2, %o1, %o2
subcc %g0, %o2, %g0
subx %g0, -1, %o0
membar #LoadLoad
retl
sra %o0, 0, %o0
.size pmix_atomic_cmpset_acq_32, .-pmix_atomic_cmpset_acq_32
.globl pmix_atomic_cmpset_rel_32
.type pmix_atomic_cmpset_rel_32, #function
pmix_atomic_cmpset_rel_32:
!#PROLOGUE# 0
!#PROLOGUE# 1
membar #StoreStore
casa [%o0] 0x80, %o1, %o2
xor %o2, %o1, %o2
subcc %g0, %o2, %g0
retl
subx %g0, -1, %o0
.size pmix_atomic_cmpset_rel_32, .-pmix_atomic_cmpset_rel_32
.globl pmix_atomic_cmpset_64
.type pmix_atomic_cmpset_64, #function
pmix_atomic_cmpset_64:
!#PROLOGUE# 0
!#PROLOGUE# 1
casxa [%o0] 0x80, %o1, %o2
mov 0, %o0
xor %o2, %o1, %o2
retl
movre %o2, 1, %o0
.size pmix_atomic_cmpset_64, .-pmix_atomic_cmpset_64
.globl pmix_atomic_cmpset_acq_64
.type pmix_atomic_cmpset_acq_64, #function
pmix_atomic_cmpset_acq_64:
!#PROLOGUE# 0
!#PROLOGUE# 1
casxa [%o0] 0x80, %o1, %o2
mov 0, %o0
xor %o2, %o1, %o2
movre %o2, 1, %o0
membar #LoadLoad
retl
sra %o0, 0, %o0
.size pmix_atomic_cmpset_acq_64, .-pmix_atomic_cmpset_acq_64
.globl pmix_atomic_cmpset_rel_64
.type pmix_atomic_cmpset_rel_64, #function
pmix_atomic_cmpset_rel_64:
!#PROLOGUE# 0
!#PROLOGUE# 1
membar #StoreStore
casxa [%o0] 0x80, %o1, %o2
mov 0, %o0
xor %o2, %o1, %o2
retl
movre %o2, 1, %o0
.size pmix_atomic_cmpset_rel_64, .-pmix_atomic_cmpset_rel_64
.globl pmix_sys_timer_get_cycles
.type pmix_sys_timer_get_cycles, #function
pmix_sys_timer_get_cycles:
save %sp,-176,%sp
rd %tick,%o0
ret ! Result = %i0
restore %o0,0,%o0
.size pmix_sys_timer_get_cycles, .-pmix_sys_timer_get_cycles

Просмотреть файл

@ -1,63 +0,0 @@
.text
.globl pmix_atomic_mb
.type pmix_atomic_mb, @function
pmix_atomic_mb:
pushq %rbp
movq %rsp, %rbp
leave
ret
.size pmix_atomic_mb, .-pmix_atomic_mb
.globl pmix_atomic_rmb
.type pmix_atomic_rmb, @function
pmix_atomic_rmb:
pushq %rbp
movq %rsp, %rbp
leave
ret
.size pmix_atomic_rmb, .-pmix_atomic_rmb
.globl pmix_atomic_wmb
.type pmix_atomic_wmb, @function
pmix_atomic_wmb:
pushq %rbp
movq %rsp, %rbp
leave
ret
.size pmix_atomic_wmb, .-pmix_atomic_wmb
.globl pmix_atomic_cmpset_32
.type pmix_atomic_cmpset_32, @function
pmix_atomic_cmpset_32:
movl %esi, %eax
lock; cmpxchgl %edx,(%rdi)
sete %dl
movzbl %dl, %eax
ret
.size pmix_atomic_cmpset_32, .-pmix_atomic_cmpset_32
.globl pmix_atomic_cmpset_64
.type pmix_atomic_cmpset_64, @function
pmix_atomic_cmpset_64:
movq %rsi, %rax
lock; cmpxchgq %rdx,(%rdi)
sete %dl
movzbl %dl, %eax
ret
.size pmix_atomic_cmpset_64, .-pmix_atomic_cmpset_64
.globl pmix_sys_timer_get_cycles
.type pmix_sys_timer_get_cycles, @function
pmix_sys_timer_get_cycles:
rdtsc
salq $32, %rdx
mov %eax, %eax
orq %rdx, %rax
ret
.size pmix_sys_timer_get_cycles, .-pmix_sys_timer_get_cycles

Просмотреть файл

@ -1,65 +0,0 @@
.text
.globl pmix_atomic_mb
.type pmix_atomic_mb, @function
pmix_atomic_mb:
pushq %rbp
movq %rsp, %rbp
leave
ret
.size pmix_atomic_mb, .-pmix_atomic_mb
.globl pmix_atomic_rmb
.type pmix_atomic_rmb, @function
pmix_atomic_rmb:
pushq %rbp
movq %rsp, %rbp
leave
ret
.size pmix_atomic_rmb, .-pmix_atomic_rmb
.globl pmix_atomic_wmb
.type pmix_atomic_wmb, @function
pmix_atomic_wmb:
pushq %rbp
movq %rsp, %rbp
leave
ret
.size pmix_atomic_wmb, .-pmix_atomic_wmb
.globl pmix_atomic_cmpset_32
.type pmix_atomic_cmpset_32, @function
pmix_atomic_cmpset_32:
movl %esi, %eax
lock; cmpxchgl %edx,(%rdi)
sete %dl
movzbl %dl, %eax
ret
.size pmix_atomic_cmpset_32, .-pmix_atomic_cmpset_32
.globl pmix_atomic_cmpset_64
.type pmix_atomic_cmpset_64, @function
pmix_atomic_cmpset_64:
movq %rsi, %rax
lock; cmpxchgq %rdx,(%rdi)
sete %dl
movzbl %dl, %eax
ret
.size pmix_atomic_cmpset_64, .-pmix_atomic_cmpset_64
.globl pmix_sys_timer_get_cycles
.type pmix_sys_timer_get_cycles, @function
pmix_sys_timer_get_cycles:
rdtsc
salq $32, %rdx
mov %eax, %eax
orq %rdx, %rax
ret
.size pmix_sys_timer_get_cycles, .-pmix_sys_timer_get_cycles
.section .note.GNU-stack,"",@progbits

Просмотреть файл

@ -62,10 +62,6 @@
#ifdef PMIX_DISABLE_INLINE_ASM
#undef PMIX_C_GCC_INLINE_ASSEMBLY
#define PMIX_C_GCC_INLINE_ASSEMBLY 0
#undef PMIX_C_DEC_INLINE_ASSEMBLY
#define PMIX_C_DEC_INLINE_ASSEMBLY 0
#undef PMIX_C_XLC_INLINE_ASSEMBLY
#define PMIX_C_XLC_INLINE_ASSEMBLY 0
#endif
/* define PMIX_{GCC,DEC,XLC}_INLINE_ASSEMBLY based on the
@ -74,12 +70,8 @@
#if defined(c_plusplus) || defined(__cplusplus)
/* We no longer support inline assembly for C++ as PMIX is a C-only interface */
#define PMIX_GCC_INLINE_ASSEMBLY 0
#define PMIX_DEC_INLINE_ASSEMBLY 0
#define PMIX_XLC_INLINE_ASSEMBLY 0
#else
#define PMIX_GCC_INLINE_ASSEMBLY PMIX_C_GCC_INLINE_ASSEMBLY
#define PMIX_DEC_INLINE_ASSEMBLY PMIX_C_DEC_INLINE_ASSEMBLY
#define PMIX_XLC_INLINE_ASSEMBLY PMIX_C_XLC_INLINE_ASSEMBLY
#endif

Просмотреть файл

@ -43,16 +43,6 @@
#ifdef PMIX_DISABLE_INLINE_ASM
#undef PMIX_C_GCC_INLINE_ASSEMBLY
#define PMIX_C_GCC_INLINE_ASSEMBLY 0
#undef PMIX_CXX_GCC_INLINE_ASSEMBLY
#define PMIX_CXX_GCC_INLINE_ASSEMBLY 0
#undef PMIX_C_DEC_INLINE_ASSEMBLY
#define PMIX_C_DEC_INLINE_ASSEMBLY 0
#undef PMIX_CXX_DEC_INLINE_ASSEMBLY
#define PMIX_CXX_DEC_INLINE_ASSEMBLY 0
#undef PMIX_C_XLC_INLINE_ASSEMBLY
#define PMIX_C_XLC_INLINE_ASSEMBLY 0
#undef PMIX_CXX_XLC_INLINE_ASSEMBLY
#define PMIX_CXX_XLC_INLINE_ASSEMBLY 0
#endif
/* define PMIX_{GCC,DEC,XLC}_INLINE_ASSEMBLY based on the
@ -60,12 +50,8 @@
are in C or C++ */
#if defined(c_plusplus) || defined(__cplusplus)
#define PMIX_GCC_INLINE_ASSEMBLY PMIX_CXX_GCC_INLINE_ASSEMBLY
#define PMIX_DEC_INLINE_ASSEMBLY PMIX_CXX_DEC_INLINE_ASSEMBLY
#define PMIX_XLC_INLINE_ASSEMBLY PMIX_CXX_XLC_INLINE_ASSEMBLY
#else
#define PMIX_GCC_INLINE_ASSEMBLY PMIX_C_GCC_INLINE_ASSEMBLY
#define PMIX_DEC_INLINE_ASSEMBLY PMIX_C_DEC_INLINE_ASSEMBLY
#define PMIX_XLC_INLINE_ASSEMBLY PMIX_C_XLC_INLINE_ASSEMBLY
#endif
/**********************************************************************

Просмотреть файл

@ -121,6 +121,7 @@
#define PMIX_OBJECT_H
#include <src/include/pmix_config.h>
#include <pmix_common.h>
#include <assert.h>
#ifdef HAVE_STDLIB_H

Просмотреть файл

@ -325,12 +325,6 @@
# define __pmix_attribute_unused__
#endif
#if PMIX_HAVE_ATTRIBUTE_VISIBILITY
# define __pmix_attribute_visibility__(a) __attribute__((__visibility__(a)))
#else
# define __pmix_attribute_visibility__(a)
#endif
#if PMIX_HAVE_ATTRIBUTE_WARN_UNUSED_RESULT
# define __pmix_attribute_warn_unused_result__ __attribute__((__warn_unused_result__))
#else
@ -343,16 +337,6 @@
# define __pmix_attribute_destructor__
#endif
#ifdef PMIX_C_HAVE_VISIBILITY
# if PMIX_C_HAVE_VISIBILITY
# define PMIX_EXPORT __pmix_attribute_visibility__("default")
# else
# define PMIX_EXPORT
# endif
#else
# define PMIX_EXPORT
#endif
/*
* Do we have <stdint.h>?
*/

Просмотреть файл

@ -212,7 +212,6 @@ int pmix_mca_base_component_repository_add (const char *path)
return PMIX_SUCCESS;
}
/*
* Initialize the repository
*/

Просмотреть файл

@ -216,12 +216,12 @@ static void parse_verbose(char *e, pmix_output_stream_t *lds)
have_output = true;
}
else if (strcasecmp(ptr, "file") == 0) {
else if (strcasecmp(ptr, "file") == 0 || strcasecmp(ptr, "file:") == 0) {
lds->lds_want_file = true;
have_output = true;
} else if (strncasecmp(ptr, "file:", 5) == 0) {
lds->lds_want_file = true;
lds->lds_file_suffix = ptr + 5;
lds->lds_file_suffix = strdup(ptr + 5);
have_output = true;
} else if (strcasecmp(ptr, "fileappend") == 0) {
lds->lds_want_file = true;

Просмотреть файл

@ -24,6 +24,8 @@
#include "src/mca/mca.h"
#include "src/mca/base/base.h"
#include "src/util/error.h"
#include "src/util/show_help.h"
#include "src/mca/bfrops/base/base.h"
@ -108,6 +110,12 @@ int pmix_bfrop_base_select(void)
}
}
/* if no modules were found, then that's an error as we require at least one */
if (0 == pmix_list_get_size(&pmix_bfrops_globals.actives)) {
pmix_show_help("help-pmix-runtime.txt", "no-plugins", true, "BFROPS");
return PMIX_ERR_SILENT;
}
if (4 < pmix_output_get_verbosity(pmix_bfrops_base_framework.framework_output)) {
pmix_output(0, "Final Bfrop priorities");
/* show the prioritized list */

Просмотреть файл

@ -23,6 +23,8 @@
#include <string.h>
#include "src/util/argv.h"
#include "src/util/error.h"
#include "src/util/show_help.h"
#include "src/mca/mca.h"
#include "src/mca/base/base.h"
@ -106,6 +108,12 @@ int pmix_gds_base_select(pmix_info_t info[], size_t ninfo)
}
}
/* if no modules were found, then that's an error as we require at least one */
if (0 == pmix_list_get_size(&pmix_gds_globals.actives)) {
pmix_show_help("help-pmix-runtime.txt", "no-plugins", true, "GDS");
return PMIX_ERR_SILENT;
}
/* setup the list of all module names */
PMIX_LIST_FOREACH(mod, &pmix_gds_globals.actives, pmix_gds_base_active_module_t) {
pmix_argv_append_nosize(&mods, mod->module->name);

Просмотреть файл

@ -23,8 +23,6 @@
# $HEADER$
#
AM_CPPFLAGS = $(gds_ds12_CPPFLAGS)
headers = \
gds_dstore.h
@ -51,10 +49,8 @@ endif
mcacomponentdir = $(pmixlibdir)
mcacomponent_LTLIBRARIES = $(component)
mca_gds_ds12_la_SOURCES = $(component_sources)
mca_gds_ds12_la_LIBADD = $(gds_ds12_LIBS)
mca_gds_ds12_la_LDFLAGS = -module -avoid-version $(gds_ds12_LDFLAGS)
mca_gds_ds12_la_LDFLAGS = -module -avoid-version
noinst_LTLIBRARIES = $(lib)
libmca_gds_ds12_la_SOURCES = $(lib_sources)
libmca_gds_ds12_la_LIBADD = $(gds_dstore_LIBS)
libmca_gds_ds12_la_LDFLAGS = -module -avoid-version $(gds_ds12_LDFLAGS)
libmca_gds_ds12_la_LDFLAGS = -module -avoid-version

Просмотреть файл

@ -1,20 +0,0 @@
# -*- shell-script -*-
#
# Copyright (c) 2015-2017 Intel, Inc. All rights reserved.
# Copyright (c) 2015 Research Organization for Information Science
# and Technology (RIST). All rights reserved.
# $COPYRIGHT$
#
# Additional copyrights may follow
#
# $HEADER$
#
# MCA_gds_ds12_CONFIG([action-if-found], [action-if-not-found])
# --------------------------------------------------------------------
AC_DEFUN([MCA_pmix_gds_ds12_CONFIG],[
AC_CONFIG_FILES([src/mca/gds/ds12/Makefile])
AS_IF([test "$enable_dstore" == "yes"], [$1], [$2])
])dnl

Просмотреть файл

@ -835,7 +835,6 @@ static inline ns_map_data_t * _esh_session_map_search_client(const char *nspace)
static inline int _esh_session_init(size_t idx, ns_map_data_t *m, size_t jobuid, int setjobuid)
{
struct stat st = {0};
seg_desc_t *seg = NULL;
session_t *s = &(PMIX_VALUE_ARRAY_GET_ITEM(_session_array, session_t, idx));
pmix_status_t rc = PMIX_SUCCESS;
@ -856,8 +855,10 @@ static inline int _esh_session_init(size_t idx, ns_map_data_t *m, size_t jobuid,
"%s:%d:%s _lockfile_name: %s", __FILE__, __LINE__, __func__, s->lockfile));
if (PMIX_PROC_SERVER == pmix_globals.proc_type) {
if (stat(s->nspace_path, &st) == -1){
if (0 != mkdir(s->nspace_path, 0770)) {
if (0 != mkdir(s->nspace_path, 0770)) {
if (EEXIST != errno) {
pmix_output(0, "session init: can not create session directory \"%s\": %s",
s->nspace_path, strerror(errno));
rc = PMIX_ERROR;
PMIX_ERROR_LOG(rc);
return rc;
@ -1937,7 +1938,6 @@ static pmix_status_t dstore_init(pmix_info_t info[], size_t ninfo)
size_t n;
char *dstor_tmpdir = NULL;
size_t tbl_idx;
struct stat st = {0};
ns_map_data_t *ns_map = NULL;
pmix_output_verbose(2, pmix_gds_base_framework.framework_output,
@ -2043,9 +2043,9 @@ static pmix_status_t dstore_init(pmix_info_t info[], size_t ninfo)
goto err_exit;
}
if (0 > stat(_base_path, &st)){
if (0 > mkdir(_base_path, 0770)) {
rc = PMIX_ERR_NO_PERMISSIONS;
if (0 != mkdir(_base_path, 0770)) {
if (EEXIST != errno) {
rc = PMIX_ERROR;
PMIX_ERROR_LOG(rc);
goto err_exit;
}
@ -2304,8 +2304,10 @@ inline pmix_status_t _dstore_fetch(const char *nspace, pmix_rank_t rank, const c
return rc;
}
if (kvs) {
*kvs = NULL;
if (NULL == kvs) {
rc = PMIX_ERR_FATAL;
PMIX_ERROR_LOG(rc);
return rc;
}
if (PMIX_RANK_UNDEF == rank) {
@ -2396,11 +2398,12 @@ inline pmix_status_t _dstore_fetch(const char *nspace, pmix_rank_t rank, const c
kval_cnt = rinfo->count;
/* Initialize array for all keys of rank */
if ((NULL == key) || (kval_cnt > 0)) {
if ((NULL == key) && (kval_cnt > 0)) {
kval = (pmix_value_t*)malloc(sizeof(pmix_value_t));
if (NULL == kval) {
return PMIX_ERR_NOMEM;
}
PMIX_VALUE_CONSTRUCT(kval);
ninfo = kval_cnt;
PMIX_INFO_CREATE(info, ninfo);
@ -2409,7 +2412,6 @@ inline pmix_status_t _dstore_fetch(const char *nspace, pmix_rank_t rank, const c
goto done;
}
PMIX_VALUE_CONSTRUCT(kval);
kval->type = PMIX_DATA_ARRAY;
kval->data.darray = (pmix_data_array_t*)malloc(sizeof(pmix_data_array_t));
if (NULL == kval->data.darray) {
@ -2543,10 +2545,11 @@ done:
}
if( rc != PMIX_SUCCESS ){
if( NULL == key ) {
if ((NULL == key) && (kval_cnt > 0)) {
if( NULL != info ) {
PMIX_INFO_FREE(info, ninfo);
}
PMIX_VALUE_RELEASE(kval);
}
return rc;
}

Просмотреть файл

@ -21,7 +21,7 @@
BEGIN_C_DECLS
/*
* Most of this file is just for ompi_info. The only public interface
* Most of this file is just for pmix_info. The only public interface
* once pmix_init has been called is the pmix_pinstall_dirs structure
* and the pmix_pinstall_dirs_expand() call */
struct pmix_pinstall_dirs_t {
@ -40,18 +40,9 @@ struct pmix_pinstall_dirs_t {
char* infodir;
char* mandir;
/* Note that the following fields intentionally have an "ompi"
prefix, even though they're down in the PMIX layer. This is
not abstraction break because the "ompi" they're referring to
is for the build system of the overall software tree -- not an
individual project within that overall tree.
Rather than using pkg{data,lib,includedir}, use our own
ompi{data,lib,includedir}, which is always set to
{datadir,libdir,includedir}/pmix. This will keep us from
having help files in prefix/share/open-rte when building
without PMIX, but in prefix/share/pmix when building
with PMIX.
/* Rather than using pkg{data,lib,includedir}, use our own
pmix{data,lib,includedir}, which is always set to
{datadir,libdir,includedir}/pmix.
Note that these field names match macros set by configure that
are used in Makefile.am files. E.g., project help files are

Просмотреть файл

@ -24,6 +24,8 @@
#include "src/mca/mca.h"
#include "src/mca/base/base.h"
#include "src/util/error.h"
#include "src/util/show_help.h"
#include "src/mca/preg/base/base.h"
@ -100,6 +102,12 @@ int pmix_preg_base_select(void)
}
}
/* if no modules were found, then that's an error as we require at least one */
if (0 == pmix_list_get_size(&pmix_preg_globals.actives)) {
pmix_show_help("help-pmix-runtime.txt", "no-plugins", true, "PREG");
return PMIX_ERR_SILENT;
}
if (4 < pmix_output_get_verbosity(pmix_preg_base_framework.framework_output)) {
pmix_output(0, "Final preg priorities");
/* show the prioritized list */

Просмотреть файл

@ -24,6 +24,8 @@
#include "src/mca/mca.h"
#include "src/mca/base/base.h"
#include "src/util/error.h"
#include "src/util/show_help.h"
#include "src/mca/psec/base/base.h"
@ -100,6 +102,12 @@ int pmix_psec_base_select(void)
}
}
/* if no modules were found, then that's an error as we require at least one */
if (0 == pmix_list_get_size(&pmix_psec_globals.actives)) {
pmix_show_help("help-pmix-runtime.txt", "no-plugins", true, "PSEC");
return PMIX_ERR_SILENT;
}
if (4 < pmix_output_get_verbosity(pmix_psec_base_framework.framework_output)) {
pmix_output(0, "Final psec priorities");
/* show the prioritized list */

Просмотреть файл

@ -24,6 +24,8 @@
#include "src/mca/mca.h"
#include "src/mca/base/base.h"
#include "src/util/error.h"
#include "src/util/show_help.h"
#include "src/mca/ptl/base/base.h"
@ -81,6 +83,12 @@ int pmix_ptl_base_select(void)
}
}
/* if no modules were found, then that's an error as we require at least one */
if (0 == pmix_list_get_size(&pmix_ptl_globals.actives)) {
pmix_show_help("help-pmix-runtime.txt", "no-plugins", true, "PTL");
return PMIX_ERR_SILENT;
}
if (4 < pmix_output_get_verbosity(pmix_ptl_base_framework.framework_output)) {
pmix_output(0, "Final PTL priorities");
/* show the prioritized list */

Просмотреть файл

@ -40,3 +40,21 @@ a fatal situation, but may negatively impact your launch performance.
If you feel you have received this warning in error, or wish to ignore
it in the future, you can disable it by setting the PMIx MCA parameter
"pmix_suppress_missing_data_warning=1"
#
[no-plugins]
We were unable to find any usable plugins for the %s framework. This PMIx
framework requires at least one plugin in order to operate. This can be caused
by any of the following:
* we were unable to build any of the plugins due to some combination
of configure directives and available system support
* no plugin was selected due to some combination of MCA parameter
directives versus built plugins (i.e., you excluded all the plugins
that were built and/or could execute)
* the PMIX_INSTALL_PREFIX environment variable, or the MCA parameter
"mca_base_component_path", is set and doesn't point to any location
that includes at least one usable plugin for this framework.
Please check your installation and environment.

Просмотреть файл

@ -285,9 +285,11 @@ int pmix_rte_init(pmix_proc_type_t type,
return PMIX_SUCCESS;
return_error:
pmix_show_help( "help-pmix-runtime.txt",
"pmix_init:startup:internal-failure", true,
error, ret );
return_error:
if (PMIX_ERR_SILENT != ret) {
pmix_show_help( "help-pmix-runtime.txt",
"pmix_init:startup:internal-failure", true,
error, ret );
}
return ret;
}

Просмотреть файл

@ -293,7 +293,6 @@ pmix_status_t pmix_server_get(pmix_buffer_t *buf,
PMIX_GDS_ASSEMB_KVS_REQ(rc, peer, &proc, &cb.kvs, &pkt, cd);
if (PMIX_SUCCESS != rc) {
PMIX_ERROR_LOG(rc);
PMIX_DESTRUCT(&pbkt);
PMIX_DESTRUCT(&cb);
return rc;
}

Просмотреть файл

@ -14,6 +14,7 @@
#define PMIX_ALFG_H
#include <src/include/pmix_config.h>
#include <pmix_common.h>
#include "src/include/pmix_stdint.h"

Просмотреть файл

@ -27,7 +27,7 @@
#define PMIX_BASENAME_H
#include <src/include/pmix_config.h>
#include <pmix_common.h>
BEGIN_C_DECLS

Просмотреть файл

@ -43,7 +43,7 @@
#define PMIX_OS_PATH_H
#include <src/include/pmix_config.h>
#include <pmix_common.h>
#include <stdio.h>
#include <stdarg.h>

Просмотреть файл

@ -86,6 +86,7 @@ typedef struct {
* Private functions
*/
static void construct(pmix_object_t *stream);
static void destruct(pmix_object_t *stream);
static int do_open(int output_id, pmix_output_stream_t * lds);
static int open_file(int i);
static void free_descriptor(int output_id);
@ -116,7 +117,7 @@ static bool syslog_opened = false;
#endif
static char *redirect_syslog_ident = NULL;
PMIX_CLASS_INSTANCE(pmix_output_stream_t, pmix_object_t, construct, NULL);
PMIX_CLASS_INSTANCE(pmix_output_stream_t, pmix_object_t, construct, destruct);
/*
* Setup the output stream infrastructure
@ -481,6 +482,15 @@ static void construct(pmix_object_t *obj)
stream->lds_want_file_append = false;
stream->lds_file_suffix = NULL;
}
static void destruct(pmix_object_t *obj)
{
pmix_output_stream_t *stream = (pmix_output_stream_t*) obj;
if( NULL != stream->lds_file_suffix ) {
free(stream->lds_file_suffix);
stream->lds_file_suffix = NULL;
}
}
/*
* Back-end of open() and reopen().

Просмотреть файл

@ -26,7 +26,7 @@
#define PMIX_PRINTF_H
#include <src/include/pmix_config.h>
#include <pmix_common.h>
#include <stdarg.h>
#include <stdlib.h>

Просмотреть файл

@ -91,6 +91,7 @@
#define PMIX_SHOW_HELP_H
#include <src/include/pmix_config.h>
#include <pmix_common.h>
#include <stdarg.h>

Просмотреть файл

@ -37,6 +37,12 @@
BEGIN_C_DECLS
#ifdef OPAL_C_HAVE_VISIBILITY
#define PMIX_HAVE_VISIBILITY 1
#else
#undef PMIX_HAVE_VISIBILITY
#endif
typedef struct {
opal_pmix_base_component_t super;
opal_list_t jobids;