aboutsummaryrefslogtreecommitdiff
path: root/pl/math/test/runulp.sh
blob: 4d02530d44b17689bfda00d6ac307b874c9acc07 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#!/bin/bash

# ULP error check script.
#
# Copyright (c) 2019-2023, Arm Limited.
# SPDX-License-Identifier: MIT OR Apache-2.0 WITH LLVM-exception

#set -x
set -eu

# cd to bin directory.
cd "${0%/*}"

flags="${ULPFLAGS:--q}"
emu="$@"

# Enable SVE testing
WANT_SVE_MATH=${WANT_SVE_MATH:-0}

FAIL=0
PASS=0

t() {
	key=$(cat $ALIASES | { grep " $1$" || echo $1; } | awk '{print $1}')
	L=$(cat $LIMITS | grep "^$key " | awk '{print $2}')
	[[ $L =~ ^[0-9]+\.[0-9]+$ ]]
	extra_flags=""
	[[ -z "${5:-}" ]] || extra_flags="$extra_flags -c $5"
	grep -q "^$key$" $FENV || extra_flags="$extra_flags -f"
	$emu ./ulp -e $L $flags ${extra_flags} $1 $2 $3 $4 && PASS=$((PASS+1)) || FAIL=$((FAIL+1))
}

check() {
	$emu ./ulp -f -q "$@" #>/dev/null
}

# Regression-test for correct NaN handling in atan2
check atan2 0x1p-1022 0x1p-1000 x 0 0x1p-1022 40000
check atan2 0x1.7887a0a717aefp+1017 0x1.7887a0a717aefp+1017 x -nan -nan
check atan2 nan nan x -nan -nan

# vector functions
flags="${ULPFLAGS:--q}"
runs=
check __s_log10f 1 && runs=1
runv=
check __v_log10f 1 && runv=1
runvn=
check __vn_log10f 1 && runvn=1
runsv=
if [ $WANT_SVE_MATH -eq 1 ]; then
check __sv_cosf 0 && runsv=1
check __sv_cos  0 && runsv=1
check __sv_sinf 0 && runsv=1
check __sv_sin 0 && runsv=1
# No guarantees about powi accuracy, so regression-test for exactness
# w.r.t. the custom reference impl in ulp_wrappers.h
check -q -f -e 0 __sv_powif  0  inf x  0  1000 100000 && runsv=1
check -q -f -e 0 __sv_powif -0 -inf x  0  1000 100000 && runsv=1
check -q -f -e 0 __sv_powif  0  inf x -0 -1000 100000 && runsv=1
check -q -f -e 0 __sv_powif -0 -inf x -0 -1000 100000 && runsv=1
check -q -f -e 0 __sv_powi   0  inf x  0  1000 100000 && runsv=1
check -q -f -e 0 __sv_powi  -0 -inf x  0  1000 100000 && runsv=1
check -q -f -e 0 __sv_powi   0  inf x -0 -1000 100000 && runsv=1
check -q -f -e 0 __sv_powi  -0 -inf x -0 -1000 100000 && runsv=1
fi

while read F LO HI N C
do
	t $F $LO $HI $N $C
done << EOF
$(cat $INTERVALS)
EOF

[ 0 -eq $FAIL ] || {
	echo "FAILED $FAIL PASSED $PASS"
	exit 1
}