diff --git a/configure b/configure index 6df241a..7673b4d 100755 --- a/configure +++ b/configure @@ -103,6 +103,7 @@ generate() -e "s#@GZIP_SUFFIX@#$GZIP_SUFFIX#g" \ -e "s#@POINTER_PACK_ENABLE@#$POINTER_PACK_ENABLE#g" \ -e "s#@RTM_ENABLE@#$RTM_ENABLE#g" \ + -e "s#@RFO_ENABLE@#$RFO_ENABLE#g" \ -e "s#@VMA_BITS@#$VMA_BITS_R#g" \ -e "s#@VMA_BITS_VALUE@#$VMA_BITS_VALUE_R#g" \ -e "s#@MM@#$MM#g" \ @@ -137,6 +138,7 @@ generate_stdout() echo " POINTER_PACK = $POINTER_PACK_ENABLE" echo " VMA_BITS = $VMA_BITS" echo " MEMORY_MODEL = $MM" + echo " RFO = $RFO_ENABLE" echo " RTM = $RTM_ENABLE" echo echo "Headers will be installed in $HEADERS" @@ -170,13 +172,16 @@ for option; do echo " --mandir=N Manual pages directory (default is ${PREFIX}/man)" echo " --prefix=N Installs library files in N (default is $PREFIX)" echo - echo "The following options will modify code generation." - echo " --cores=N Specify number of cores available on target machine" + echo "The following options will affect generated code." echo " --enable-pointer-packing Assumes address encoding is subset of pointer range" - echo " --enable-rtm Enable restricted transactional memory (x86_64 only)" + echo " --enable-rtm Enable restricted transactional memory (power, x86_64)" + echo " --enable-rfo Enable read-for-ownership interface (power, x86_64)" echo " --memory-model=N Specify memory model (currently tso, pso or rmo)" echo " --vma-bits=N Specify valid number of VMA bits" echo + echo "The following options affect regression testing." + echo " --cores=N Specify number of cores available on target machine" + echo echo "The following environment variables may be used:" echo " CC C compiler command" echo " CFLAGS C compiler flags" @@ -212,6 +217,9 @@ for option; do --enable-rtm) RTM_ENABLE_SET="CK_MD_RTM_ENABLE" ;; + --enable-rfo) + RFO_ENABLE_SET="CK_MD_RFO_ENABLE" + ;; --cores=*) CORES=$value ;; @@ -272,6 +280,7 @@ MANDIR=${MANDIR:-"${PREFIX}/share/man"} GZIP=${GZIP:-"gzip -c"} POINTER_PACK_ENABLE=${POINTER_PACK_ENABLE:-"CK_MD_POINTER_PACK_DISABLE"} RTM_ENABLE=${RTM_ENABLE_SET:-"CK_MD_RTM_DISABLE"} +RFO_ENABLE=${RFO_ENABLE_SET:-"CK_MD_RFO_DISABLE"} VMA_BITS=${VMA_BITS:-"unknown"} if test "$PROFILE"; then diff --git a/include/ck_md.h.in b/include/ck_md.h.in index 4449cf8..63cbbf0 100644 --- a/include/ck_md.h.in +++ b/include/ck_md.h.in @@ -39,6 +39,10 @@ #define @RTM_ENABLE@ #endif /* @RTM_ENABLE@ */ +#ifndef @RFO_ENABLE@ +#define @RFO_ENABLE@ +#endif /* @RFO_ENABLE@ */ + #ifndef @POINTER_PACK_ENABLE@ #define @POINTER_PACK_ENABLE@ #endif /* @POINTER_PACK_ENABLE@ */ diff --git a/include/ck_pr.h b/include/ck_pr.h index 3ceea4c..f5533bb 100644 --- a/include/ck_pr.h +++ b/include/ck_pr.h @@ -138,6 +138,17 @@ CK_PR_FENCE_NOOP(release) #undef CK_PR_FENCE_EMIT #undef CK_PR_FENCE_NOOP +#ifndef CK_F_PR_RFO +#define CK_F_PR_RFO +CK_CC_INLINE static void +ck_pr_rfo(const void *m) +{ + + (void)m; + return; +} +#endif /* CK_F_PR_RFO */ + #define CK_PR_BIN(K, S, M, T, P, C) \ CK_CC_INLINE static void \ ck_pr_##K##_##S(M *target, T value) \ diff --git a/include/gcc/x86_64/ck_pr.h b/include/gcc/x86_64/ck_pr.h index 5dfa626..b57a845 100644 --- a/include/gcc/x86_64/ck_pr.h +++ b/include/gcc/x86_64/ck_pr.h @@ -91,6 +91,26 @@ CK_PR_FENCE(acquire, "mfence") #undef CK_PR_FENCE +/* + * Read for ownership. Older compilers will generate the 32-bit + * 3DNow! variant which is binary compatible with x86-64 variant + * of prefetchw. + */ +#ifdef CK_MD_RFO_ENABLE +#define CK_F_PR_RFO +CK_CC_INLINE static void +ck_pr_rfo(const void *m) +{ + + __asm__ __volatile__("prefetchw (%0)" + : + : "r" (m) + : "memory"); + + return; +} +#endif /* CD_MD_PREFETCHW_ENABLE */ + /* * Atomic fetch-and-store operations. */