Blame jemalloc/include/jemalloc/internal/smoothstep.sh

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