xref: /aosp_15_r20/external/arm-optimized-routines/pl/math/test/runulp.sh (revision 412f47f9e737e10ed5cc46ec6a8d7fa2264f8a14)
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