Current section
Files
Jump to
Current section
Files
scrypt/libcperciva/cpusupport/Build/cpusupport.sh
# Should be sourced by `command -p sh path/to/cpusupport.sh "$PATH"` from
# within a Makefile.
if ! [ ${PATH} = "$1" ]; then
echo "WARNING: POSIX violation: $SHELL's command -p resets \$PATH" 1>&2
PATH=$1
fi
# Standard output should be written to cpusupport-config.h, which is both a
# C header file defining CPUSUPPORT_ARCH_FEATURE macros and sourceable sh
# code which sets CFLAGS_ARCH_FEATURE environment variables.
SRCDIR=`command -p dirname "$0"`
feature() {
ARCH=$1
FEATURE=$2
shift 2;
if ! [ -f ${SRCDIR}/cpusupport-$ARCH-$FEATURE.c ]; then
return
fi
printf "Checking if compiler supports $ARCH $FEATURE feature..." 1>&2
for CPU_CFLAGS in "$@"; do
if ${CC} ${CFLAGS} -D_POSIX_C_SOURCE=200809L ${CPU_CFLAGS} \
${SRCDIR}/cpusupport-$ARCH-$FEATURE.c 2>/dev/null; then
rm -f a.out
break;
fi
CPU_CFLAGS=NOTSUPPORTED;
done
case $CPU_CFLAGS in
NOTSUPPORTED)
echo " no" 1>&2
;;
"")
echo " yes" 1>&2
echo "#define CPUSUPPORT_${ARCH}_${FEATURE} 1"
;;
*)
echo " yes, via $CPU_CFLAGS" 1>&2
echo "#define CPUSUPPORT_${ARCH}_${FEATURE} 1"
echo "#ifdef cpusupport_dummy"
echo "export CFLAGS_${ARCH}_${FEATURE}=\"${CPU_CFLAGS}\""
echo "#endif"
;;
esac
}
# Detect CPU-detection features
feature X86 CPUID ""
feature X86 CPUID_COUNT ""
# Detect specific features
feature X86 AESNI "" "-maes" \
"-maes -Wno-cast-align" \
"-maes -Wno-missing-prototypes -Wno-cast-qual" \
"-maes -Wno-missing-prototypes -Wno-cast-qual -Wno-cast-align"
feature X86 CRC32_64 "" "-msse4.2" \
"-msse4.2 -Wno-cast-align" \
"-msse4.2 -Wno-cast-align -fno-strict-aliasing" \
"-msse4.2 -Wno-cast-align -fno-strict-aliasing -Wno-cast-qual"
feature X86 RDRAND "" "-mrdrnd"
feature X86 SHANI "" "-msse2 -msha" \
"-msse2 -msha -Wno-cast-align"
feature X86 SSE2 "" "-msse2" \
"-msse2 -Wno-cast-align"
feature X86 SSSE3 "" "-mssse3" \
"-mssse3 -Wno-cast-align"