1072a4ba8SAndrew Turner#!/bin/bash 2072a4ba8SAndrew Turner 3072a4ba8SAndrew Turner# ULP error check script. 4072a4ba8SAndrew Turner# 5072a4ba8SAndrew Turner# Copyright (c) 2019-2023, Arm Limited. 6072a4ba8SAndrew Turner# SPDX-License-Identifier: MIT OR Apache-2.0 WITH LLVM-exception 7072a4ba8SAndrew Turner 8072a4ba8SAndrew Turner#set -x 9072a4ba8SAndrew Turnerset -eu 10072a4ba8SAndrew Turner 11072a4ba8SAndrew Turner# cd to bin directory. 12072a4ba8SAndrew Turnercd "${0%/*}" 13072a4ba8SAndrew Turner 14072a4ba8SAndrew Turnerflags="${ULPFLAGS:--q}" 15072a4ba8SAndrew Turneremu="$@" 16072a4ba8SAndrew Turner 17072a4ba8SAndrew Turner# Enable SVE testing 18072a4ba8SAndrew TurnerWANT_SVE_MATH=${WANT_SVE_MATH:-0} 19072a4ba8SAndrew Turner 20072a4ba8SAndrew TurnerFAIL=0 21072a4ba8SAndrew TurnerPASS=0 22072a4ba8SAndrew Turner 23072a4ba8SAndrew Turnert() { 24*5a02ffc3SAndrew Turner routine=$1 25*5a02ffc3SAndrew Turner L=$(cat $LIMITS | grep "^$routine " | awk '{print $2}') 26072a4ba8SAndrew Turner [[ $L =~ ^[0-9]+\.[0-9]+$ ]] 27*5a02ffc3SAndrew Turner extra_flags= 28072a4ba8SAndrew Turner [[ -z "${5:-}" ]] || extra_flags="$extra_flags -c $5" 29*5a02ffc3SAndrew Turner grep -q "^$routine$" $FENV || extra_flags="$extra_flags -f" 30*5a02ffc3SAndrew Turner IFS=',' read -ra LO <<< "$2" 31*5a02ffc3SAndrew Turner IFS=',' read -ra HI <<< "$3" 32*5a02ffc3SAndrew Turner ITV="${LO[0]} ${HI[0]}" 33*5a02ffc3SAndrew Turner for i in "${!LO[@]}"; do 34*5a02ffc3SAndrew Turner [[ "$i" -eq "0" ]] || ITV="$ITV x ${LO[$i]} ${HI[$i]}" 35*5a02ffc3SAndrew Turner done 36*5a02ffc3SAndrew Turner # Add -z flag to ignore zero sign for vector routines 37*5a02ffc3SAndrew Turner { echo $routine | grep -q "ZGV"; } && extra_flags="$extra_flags -z" 38*5a02ffc3SAndrew Turner $emu ./ulp -e $L $flags ${extra_flags} $routine $ITV $4 && PASS=$((PASS+1)) || FAIL=$((FAIL+1)) 39072a4ba8SAndrew Turner} 40072a4ba8SAndrew Turner 41072a4ba8SAndrew Turnercheck() { 42072a4ba8SAndrew Turner $emu ./ulp -f -q "$@" #>/dev/null 43072a4ba8SAndrew Turner} 44072a4ba8SAndrew Turner 45*5a02ffc3SAndrew Turnerif [ "$FUNC" == "atan2" ] || [ -z "$FUNC" ]; then 46072a4ba8SAndrew Turner # Regression-test for correct NaN handling in atan2 47072a4ba8SAndrew Turner check atan2 0x1p-1022 0x1p-1000 x 0 0x1p-1022 40000 48072a4ba8SAndrew Turner check atan2 0x1.7887a0a717aefp+1017 0x1.7887a0a717aefp+1017 x -nan -nan 49072a4ba8SAndrew Turner check atan2 nan nan x -nan -nan 50*5a02ffc3SAndrew Turnerfi 51072a4ba8SAndrew Turner 52072a4ba8SAndrew Turner# vector functions 53072a4ba8SAndrew Turnerflags="${ULPFLAGS:--q}" 54072a4ba8SAndrew Turnerrunsv= 55072a4ba8SAndrew Turnerif [ $WANT_SVE_MATH -eq 1 ]; then 56072a4ba8SAndrew Turner# No guarantees about powi accuracy, so regression-test for exactness 57072a4ba8SAndrew Turner# w.r.t. the custom reference impl in ulp_wrappers.h 58*5a02ffc3SAndrew Turnercheck -q -f -e 0 _ZGVsMxvv_powi 0 inf x 0 1000 100000 && runsv=1 59*5a02ffc3SAndrew Turnercheck -q -f -e 0 _ZGVsMxvv_powi -0 -inf x 0 1000 100000 && runsv=1 60*5a02ffc3SAndrew Turnercheck -q -f -e 0 _ZGVsMxvv_powi 0 inf x -0 -1000 100000 && runsv=1 61*5a02ffc3SAndrew Turnercheck -q -f -e 0 _ZGVsMxvv_powi -0 -inf x -0 -1000 100000 && runsv=1 62*5a02ffc3SAndrew Turnercheck -q -f -e 0 _ZGVsMxvv_powk 0 inf x 0 1000 100000 && runsv=1 63*5a02ffc3SAndrew Turnercheck -q -f -e 0 _ZGVsMxvv_powk -0 -inf x 0 1000 100000 && runsv=1 64*5a02ffc3SAndrew Turnercheck -q -f -e 0 _ZGVsMxvv_powk 0 inf x -0 -1000 100000 && runsv=1 65*5a02ffc3SAndrew Turnercheck -q -f -e 0 _ZGVsMxvv_powk -0 -inf x -0 -1000 100000 && runsv=1 66072a4ba8SAndrew Turnerfi 67072a4ba8SAndrew Turner 68072a4ba8SAndrew Turnerwhile read F LO HI N C 69072a4ba8SAndrew Turnerdo 70072a4ba8SAndrew Turner t $F $LO $HI $N $C 71072a4ba8SAndrew Turnerdone << EOF 72*5a02ffc3SAndrew Turner$(cat $INTERVALS | grep "\b$FUNC\b") 73072a4ba8SAndrew TurnerEOF 74072a4ba8SAndrew Turner 75072a4ba8SAndrew Turner[ 0 -eq $FAIL ] || { 76072a4ba8SAndrew Turner echo "FAILED $FAIL PASSED $PASS" 77072a4ba8SAndrew Turner exit 1 78072a4ba8SAndrew Turner} 79