Path: blob/main/contrib/arm-optimized-routines/math/test/runulp.sh
48254 views
#!/bin/bash12# ULP error check script.3#4# Copyright (c) 2019-2024, Arm Limited.5# SPDX-License-Identifier: MIT OR Apache-2.0 WITH LLVM-exception67#set -x8set -eu910# cd to bin directory.11cd "${0%/*}"1213rmodes='n u d z'14#rmodes=n15flags="${ULPFLAGS:--q}"16emu="$@"1718FAIL=019PASS=02021t() {22# First argument: routine name23routine=$1; shift24# Second and third argument: lo and hi bounds25# Extra processing needed for bivariate routines26IFS=',' read -ra LO <<< "$1"; shift27IFS=',' read -ra HI <<< "$1"; shift28ITV="${LO[0]} ${HI[0]}"29for i in "${!LO[@]}"; do30[[ "$i" -eq "0" ]] || ITV="$ITV x ${LO[$i]} ${HI[$i]}"31done32# Fourth argument: number of test points33n=$1; shift34# Any remaining arguments forwards directly to ulp tool35extra_flags="$@"3637# Read ULP limits, fenv expectation and control values from autogenerated files38limits_file=$LIMITS39[ $r == "n" ] || limits_file=${limits_file}_nn40L=$(grep "^$routine " $limits_file | awk '{print $2}')41[ -n "$L" ] || { echo ERROR: Could not determine ULP limit for $routine in $limits_file && false; }42cvals=($(grep "^$routine " $CVALS | awk '{print $2}'))4344if grep -q "^$routine$" $DISABLE_FENV; then extra_flags="$extra_flags -f"; fi45# Emulate a do-while loop to loop over cvals, but still execute once if it is empty46while : ; do47# Empty string if we are at the end of cvals array48c_arg=""49[ -z "${cvals[0]:-}" ] || c_arg="-c ${cvals[0]}"50$emu ./ulp -e $L $flags $extra_flags -r $r $c_arg $routine $ITV $n && PASS=$((PASS+1)) || FAIL=$((FAIL+1))51# Shift cvals by 1, and break if it is now empty52cvals=("${cvals[@]:1}")53[ -n "${cvals[0]:-}" ] || break54done5556# Run ULP tool5758}5960check() {61$emu ./ulp -f -q "$@"62}6364if [[ $WANT_EXPERIMENTAL_MATH -eq 1 ]] && [[ $WANT_SVE_TESTS -eq 1 ]] && [[ $USE_MPFR -eq 0 ]]; then65# No guarantees about powi accuracy, so regression-test for exactness66# w.r.t. the custom reference impl in ulp_wrappers.h67if [ -z "$FUNC" ] || [ "$FUNC" == "_ZGVsMxvv_powi" ]; then68check -q -f -e 0 _ZGVsMxvv_powi 0 inf x 0 1000 10000069check -q -f -e 0 _ZGVsMxvv_powi -0 -inf x 0 1000 10000070check -q -f -e 0 _ZGVsMxvv_powi 0 inf x -0 -1000 10000071check -q -f -e 0 _ZGVsMxvv_powi -0 -inf x -0 -1000 10000072fi73if [ -z "$FUNC" ] || [ "$FUNC" == "_ZGVsMxvv_powk" ]; then74check -q -f -e 0 _ZGVsMxvv_powk 0 inf x 0 1000 10000075check -q -f -e 0 _ZGVsMxvv_powk -0 -inf x 0 1000 10000076check -q -f -e 0 _ZGVsMxvv_powk 0 inf x -0 -1000 10000077check -q -f -e 0 _ZGVsMxvv_powk -0 -inf x -0 -1000 10000078fi79fi8081# Test generic routines in all rounding modes82for r in $rmodes83do84while read F LO HI N85do86[[ -z $F ]] || t $F $LO $HI $N87done << EOF88$(grep "\b$FUNC\b" $GEN_ITVS)89EOF90done9192# Only test arch-specific routines in round-to-nearest, with sign of zero ignored (-z flag)93r=n94while read F LO HI N95do96[[ -z $F ]] || t $F $LO $HI $N -z97done << EOF98$(grep "\b$FUNC\b" $ARCH_ITVS)99EOF100101[ 0 -eq $FAIL ] || {102echo "FAILED $FAIL PASSED $PASS"103exit 1104}105106107