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