1*412f47f9SXin Li#!/bin/bash 2*412f47f9SXin Li 3*412f47f9SXin Li# ULP error check script. 4*412f47f9SXin Li# 5*412f47f9SXin Li# Copyright (c) 2019-2024, Arm Limited. 6*412f47f9SXin Li# SPDX-License-Identifier: MIT OR Apache-2.0 WITH LLVM-exception 7*412f47f9SXin Li 8*412f47f9SXin Li#set -x 9*412f47f9SXin Liset -eu 10*412f47f9SXin Li 11*412f47f9SXin Li# cd to bin directory. 12*412f47f9SXin Licd "${0%/*}" 13*412f47f9SXin Li 14*412f47f9SXin Liflags="${ULPFLAGS:--q}" 15*412f47f9SXin Liemu="$@" 16*412f47f9SXin Li 17*412f47f9SXin Li# Enable SVE testing 18*412f47f9SXin LiWANT_SVE_MATH=${WANT_SVE_MATH:-0} 19*412f47f9SXin Li 20*412f47f9SXin LiFAIL=0 21*412f47f9SXin LiPASS=0 22*412f47f9SXin Li 23*412f47f9SXin Lit() { 24*412f47f9SXin Li routine=$1 25*412f47f9SXin Li L=$(cat $LIMITS | grep "^$routine " | awk '{print $2}') 26*412f47f9SXin Li [[ $L =~ ^[0-9]+\.[0-9]+$ ]] 27*412f47f9SXin Li extra_flags= 28*412f47f9SXin Li [[ -z "${PRED:-}" ]] || extra_flags="$extra_flags -p $PRED" 29*412f47f9SXin Li [[ -z "${5:-}" ]] || extra_flags="$extra_flags -c $5" 30*412f47f9SXin Li grep -q "^$routine$" $FENV || extra_flags="$extra_flags -f" 31*412f47f9SXin Li IFS=',' read -ra LO <<< "$2" 32*412f47f9SXin Li IFS=',' read -ra HI <<< "$3" 33*412f47f9SXin Li ITV="${LO[0]} ${HI[0]}" 34*412f47f9SXin Li for i in "${!LO[@]}"; do 35*412f47f9SXin Li [[ "$i" -eq "0" ]] || ITV="$ITV x ${LO[$i]} ${HI[$i]}" 36*412f47f9SXin Li done 37*412f47f9SXin Li # Add -z flag to ignore zero sign for vector routines 38*412f47f9SXin Li { echo $routine | grep -q "ZGV"; } && extra_flags="$extra_flags -z" 39*412f47f9SXin Li $emu ./ulp -e $L $flags ${extra_flags} $routine $ITV $4 && PASS=$((PASS+1)) || FAIL=$((FAIL+1)) 40*412f47f9SXin Li} 41*412f47f9SXin Li 42*412f47f9SXin Licheck() { 43*412f47f9SXin Li $emu ./ulp -f -q "$@" #>/dev/null 44*412f47f9SXin Li} 45*412f47f9SXin Li 46*412f47f9SXin Liif [ "$FUNC" == "atan2" ] || [ -z "$FUNC" ]; then 47*412f47f9SXin Li # Regression-test for correct NaN handling in atan2 48*412f47f9SXin Li check atan2 0x1p-1022 0x1p-1000 x 0 0x1p-1022 40000 49*412f47f9SXin Li check atan2 0x1.7887a0a717aefp+1017 0x1.7887a0a717aefp+1017 x -nan -nan 50*412f47f9SXin Li check atan2 nan nan x -nan -nan 51*412f47f9SXin Lifi 52*412f47f9SXin Li 53*412f47f9SXin Li# vector functions 54*412f47f9SXin Liflags="${ULPFLAGS:--q}" 55*412f47f9SXin Lirunsv= 56*412f47f9SXin Liif [ $WANT_SVE_MATH -eq 1 ]; then 57*412f47f9SXin Li# No guarantees about powi accuracy, so regression-test for exactness 58*412f47f9SXin Li# w.r.t. the custom reference impl in ulp_wrappers.h 59*412f47f9SXin Li if [ -z "$FUNC" ] || [ "$FUNC" == "_ZGVsMxvv_powi" ]; then 60*412f47f9SXin Li check -q -f -e 0 _ZGVsMxvv_powi 0 inf x 0 1000 100000 && runsv=1 61*412f47f9SXin Li check -q -f -e 0 _ZGVsMxvv_powi -0 -inf x 0 1000 100000 && runsv=1 62*412f47f9SXin Li check -q -f -e 0 _ZGVsMxvv_powi 0 inf x -0 -1000 100000 && runsv=1 63*412f47f9SXin Li check -q -f -e 0 _ZGVsMxvv_powi -0 -inf x -0 -1000 100000 && runsv=1 64*412f47f9SXin Li fi 65*412f47f9SXin Li if [ -z "$FUNC" ] || [ "$FUNC" == "_ZGVsMxvv_powk" ]; then 66*412f47f9SXin Li check -q -f -e 0 _ZGVsMxvv_powk 0 inf x 0 1000 100000 && runsv=1 67*412f47f9SXin Li check -q -f -e 0 _ZGVsMxvv_powk -0 -inf x 0 1000 100000 && runsv=1 68*412f47f9SXin Li check -q -f -e 0 _ZGVsMxvv_powk 0 inf x -0 -1000 100000 && runsv=1 69*412f47f9SXin Li check -q -f -e 0 _ZGVsMxvv_powk -0 -inf x -0 -1000 100000 && runsv=1 70*412f47f9SXin Li fi 71*412f47f9SXin Lifi 72*412f47f9SXin Li 73*412f47f9SXin Liwhile read F LO HI N C 74*412f47f9SXin Lido 75*412f47f9SXin Li [[ -z $F ]] || t $F $LO $HI $N $C 76*412f47f9SXin Lidone << EOF 77*412f47f9SXin Li$(cat $INTERVALS | grep "\b$FUNC\b") 78*412f47f9SXin LiEOF 79*412f47f9SXin Li 80*412f47f9SXin Li[ 0 -eq $FAIL ] || { 81*412f47f9SXin Li echo "FAILED $FAIL PASSED $PASS" 82*412f47f9SXin Li exit 1 83*412f47f9SXin Li} 84