8e82af1166
Check in a generated smootherstep table as smoothstep.h rather than generating it at configure time, since not all systems (e.g. Windows) have dc.
116 lines
3.3 KiB
Bash
Executable File
116 lines
3.3 KiB
Bash
Executable File
#!/bin/sh
|
|
#
|
|
# Generate a discrete lookup table for a sigmoid function in the smoothstep
|
|
# family (https://en.wikipedia.org/wiki/Smoothstep), where the lookup table
|
|
# entries correspond to x in [1/nsteps, 2/nsteps, ..., nsteps/nsteps]. Encode
|
|
# the entries using a binary fixed point representation.
|
|
#
|
|
# Usage: smoothstep.sh <variant> <nsteps> <bfp> <xprec> <yprec>
|
|
#
|
|
# <variant> is in {smooth, smoother, smoothest}.
|
|
# <nsteps> must be greater than zero.
|
|
# <bfp> must be in [0..62]; reasonable values are roughly [10..30].
|
|
# <xprec> is x decimal precision.
|
|
# <yprec> is y decimal precision.
|
|
|
|
#set -x
|
|
|
|
cmd="sh smoothstep.sh $*"
|
|
variant=$1
|
|
nsteps=$2
|
|
bfp=$3
|
|
xprec=$4
|
|
yprec=$5
|
|
|
|
case "${variant}" in
|
|
smooth)
|
|
;;
|
|
smoother)
|
|
;;
|
|
smoothest)
|
|
;;
|
|
*)
|
|
echo "Unsupported variant"
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
smooth() {
|
|
step=$1
|
|
y=`echo ${yprec} k ${step} ${nsteps} / sx _2 lx 3 ^ '*' 3 lx 2 ^ '*' + p | dc | tr -d '\\\\\n' | sed -e 's#^\.#0.#g'`
|
|
h=`echo ${yprec} k 2 ${bfp} ^ ${y} '*' p | dc | tr -d '\\\\\n' | sed -e 's#^\.#0.#g' | tr '.' ' ' | awk '{print $1}' `
|
|
}
|
|
|
|
smoother() {
|
|
step=$1
|
|
y=`echo ${yprec} k ${step} ${nsteps} / sx 6 lx 5 ^ '*' _15 lx 4 ^ '*' + 10 lx 3 ^ '*' + p | dc | tr -d '\\\\\n' | sed -e 's#^\.#0.#g'`
|
|
h=`echo ${yprec} k 2 ${bfp} ^ ${y} '*' p | dc | tr -d '\\\\\n' | sed -e 's#^\.#0.#g' | tr '.' ' ' | awk '{print $1}' `
|
|
}
|
|
|
|
smoothest() {
|
|
step=$1
|
|
y=`echo ${yprec} k ${step} ${nsteps} / sx _20 lx 7 ^ '*' 70 lx 6 ^ '*' + _84 lx 5 ^ '*' + 35 lx 4 ^ '*' + p | dc | tr -d '\\\\\n' | sed -e 's#^\.#0.#g'`
|
|
h=`echo ${yprec} k 2 ${bfp} ^ ${y} '*' p | dc | tr -d '\\\\\n' | sed -e 's#^\.#0.#g' | tr '.' ' ' | awk '{print $1}' `
|
|
}
|
|
|
|
cat <<EOF
|
|
/*
|
|
* This file was generated by the following command:
|
|
* $cmd
|
|
*/
|
|
/******************************************************************************/
|
|
#ifdef JEMALLOC_H_TYPES
|
|
|
|
/*
|
|
* This header defines a precomputed table based on the smoothstep family of
|
|
* sigmoidal curves (https://en.wikipedia.org/wiki/Smoothstep) that grow from 0
|
|
* to 1 in 0 <= x <= 1. The table is stored as integer fixed point values so
|
|
* that floating point math can be avoided.
|
|
*
|
|
* 3 2
|
|
* smoothstep(x) = -2x + 3x
|
|
*
|
|
* 5 4 3
|
|
* smootherstep(x) = 6x - 15x + 10x
|
|
*
|
|
* 7 6 5 4
|
|
* smootheststep(x) = -20x + 70x - 84x + 35x
|
|
*/
|
|
|
|
#define SMOOTHSTEP_VARIANT "${variant}"
|
|
#define SMOOTHSTEP_NSTEPS ${nsteps}
|
|
#define SMOOTHSTEP_BFP ${bfp}
|
|
#define SMOOTHSTEP \\
|
|
/* STEP(step, h, x, y) */ \\
|
|
EOF
|
|
|
|
s=1
|
|
while [ $s -le $nsteps ] ; do
|
|
$variant ${s}
|
|
x=`echo ${xprec} k ${s} ${nsteps} / p | dc | tr -d '\\\\\n' | sed -e 's#^\.#0.#g'`
|
|
printf ' STEP(%4d, UINT64_C(0x%016x), %s, %s) \\\n' ${s} ${h} ${x} ${y}
|
|
|
|
s=$((s+1))
|
|
done
|
|
echo
|
|
|
|
cat <<EOF
|
|
#endif /* JEMALLOC_H_TYPES */
|
|
/******************************************************************************/
|
|
#ifdef JEMALLOC_H_STRUCTS
|
|
|
|
|
|
#endif /* JEMALLOC_H_STRUCTS */
|
|
/******************************************************************************/
|
|
#ifdef JEMALLOC_H_EXTERNS
|
|
|
|
|
|
#endif /* JEMALLOC_H_EXTERNS */
|
|
/******************************************************************************/
|
|
#ifdef JEMALLOC_H_INLINES
|
|
|
|
|
|
#endif /* JEMALLOC_H_INLINES */
|
|
/******************************************************************************/
|
|
EOF
|