xref: /aosp_15_r20/external/arm-optimized-routines/math/test/runulp.sh (revision 412f47f9e737e10ed5cc46ec6a8d7fa2264f8a14)
1#!/bin/bash
2
3# ULP error check script.
4#
5# Copyright (c) 2019-2024, Arm Limited.
6# SPDX-License-Identifier: MIT OR Apache-2.0 WITH LLVM-exception
7
8#set -x
9set -eu
10
11# cd to bin directory.
12cd "${0%/*}"
13
14rmodes='n u d z'
15#rmodes=n
16flags="${ULPFLAGS:--q}"
17emu="$@"
18
19FAIL=0
20PASS=0
21
22t() {
23	[ $r = "n" ] && Lt=$L || Lt=$Ldir
24	$emu ./ulp -r $r -e $Lt $flags "$@" && PASS=$((PASS+1)) || FAIL=$((FAIL+1))
25}
26
27check() {
28	$emu ./ulp -f -q "$@" >/dev/null
29}
30
31Ldir=0.5
32for r in $rmodes
33do
34L=0.01
35t exp  0 0xffff000000000000 10000
36t exp  0x1p-6     0x1p6     40000
37t exp -0x1p-6    -0x1p6     40000
38t exp  633.3      733.3     10000
39t exp -633.3     -777.3     10000
40
41L=0.01
42t exp2  0 0xffff000000000000 10000
43t exp2  0x1p-6     0x1p6     40000
44t exp2 -0x1p-6    -0x1p6     40000
45t exp2  633.3      733.3     10000
46t exp2 -633.3     -777.3     10000
47
48L=0.02
49t log  0 0xffff000000000000 10000
50t log  0x1p-4    0x1p4      40000
51t log  0         inf        40000
52
53L=0.05
54t log2  0 0xffff000000000000 10000
55t log2  0x1p-4    0x1p4      40000
56t log2  0         inf        40000
57
58L=0.05
59t pow  0.5  2.0  x  0  inf 20000
60t pow -0.5 -2.0  x  0  inf 20000
61t pow  0.5  2.0  x -0 -inf 20000
62t pow -0.5 -2.0  x -0 -inf 20000
63t pow  0.5  2.0  x  0x1p-10  0x1p10  40000
64t pow  0.5  2.0  x -0x1p-10 -0x1p10  40000
65t pow  0    inf  x    0.5      2.0   80000
66t pow  0    inf  x   -0.5     -2.0   80000
67t pow  0x1.fp-1   0x1.08p0  x  0x1p8 0x1p17  80000
68t pow  0x1.fp-1   0x1.08p0  x -0x1p8 -0x1p17 80000
69t pow  0         0x1p-1000  x  0 1.0 50000
70t pow  0x1p1000        inf  x  0 1.0 50000
71t pow  0x1.ffffffffffff0p-1  0x1.0000000000008p0 x 0x1p60 0x1p68 50000
72t pow  0x1.ffffffffff000p-1  0x1p0 x 0x1p50 0x1p52 50000
73t pow -0x1.ffffffffff000p-1 -0x1p0 x 0x1p50 0x1p52 50000
74
75if [ "$WANT_EXP10_TESTS" = 1 ]; then
76L=0.02
77t exp10   0                   0x1p-47             5000
78t exp10  -0                  -0x1p-47             5000
79t exp10   0x1p-47             1                   50000
80t exp10  -0x1p-47            -1                   50000
81t exp10   1                   0x1.34413509f79ffp8 50000
82t exp10  -1                  -0x1.434e6420f4374p8 50000
83t exp10  0x1.34413509f79ffp8  inf                 5000
84t exp10 -0x1.434e6420f4374p8 -inf                 5000
85fi # WANT_EXP10_TESTS
86
87L=1.0
88Ldir=0.9
89t erf  0 0xffff000000000000 10000
90t erf  0x1p-1022  0x1p-26   40000
91t erf  -0x1p-1022 -0x1p-26  40000
92t erf  0x1p-26    0x1p3     40000
93t erf  -0x1p-26  -0x1p3     40000
94t erf  0         inf        40000
95Ldir=0.5
96
97L=0.01
98t expf  0    0xffff0000    10000
99t expf  0x1p-14   0x1p8    50000
100t expf -0x1p-14  -0x1p8    50000
101
102L=0.01
103t exp2f  0    0xffff0000   10000
104t exp2f  0x1p-14   0x1p8   50000
105t exp2f -0x1p-14  -0x1p8   50000
106
107L=0.32
108t logf  0    0xffff0000    10000
109t logf  0x1p-4    0x1p4    50000
110t logf  0         inf      50000
111
112L=0.26
113t log2f  0    0xffff0000   10000
114t log2f  0x1p-4    0x1p4   50000
115t log2f  0         inf     50000
116
117L=0.06
118t sinf  0    0xffff0000    10000
119t sinf  0x1p-14  0x1p54    50000
120t sinf -0x1p-14 -0x1p54    50000
121
122L=0.06
123t cosf  0    0xffff0000    10000
124t cosf  0x1p-14  0x1p54    50000
125t cosf -0x1p-14 -0x1p54    50000
126
127L=0.06
128t sincosf_sinf  0    0xffff0000    10000
129t sincosf_sinf  0x1p-14  0x1p54    50000
130t sincosf_sinf -0x1p-14 -0x1p54    50000
131
132L=0.06
133t sincosf_cosf  0    0xffff0000    10000
134t sincosf_cosf  0x1p-14  0x1p54    50000
135t sincosf_cosf -0x1p-14 -0x1p54    50000
136
137L=0.4
138t powf  0x1p-1   0x1p1  x  0x1p-7 0x1p7   50000
139t powf  0x1p-1   0x1p1  x -0x1p-7 -0x1p7  50000
140t powf  0x1p-70 0x1p70  x  0x1p-1 0x1p1   50000
141t powf  0x1p-70 0x1p70  x  -0x1p-1 -0x1p1 50000
142t powf  0x1.ep-1 0x1.1p0 x  0x1p8 0x1p14  50000
143t powf  0x1.ep-1 0x1.1p0 x -0x1p8 -0x1p14 50000
144
145L=0.6
146Ldir=0.9
147t erff  0      0xffff0000 10000
148t erff  0x1p-127  0x1p-26 40000
149t erff -0x1p-127 -0x1p-26 40000
150t erff  0x1p-26   0x1p3   40000
151t erff -0x1p-26  -0x1p3   40000
152t erff  0         inf     40000
153Ldir=0.5
154
155done
156
157# vector functions
158
159if [ "$WANT_SIMD_TESTS" = 1 ]; then
160
161Ldir=0.5
162r='n'
163flags="${ULPFLAGS:--q}"
164
165range_exp='
166  0 0xffff000000000000 10000
167  0x1p-6     0x1p6     400000
168 -0x1p-6    -0x1p6     400000
169  633.3      733.3     10000
170 -633.3     -777.3     10000
171'
172
173range_log='
174  0 0xffff000000000000 10000
175  0x1p-4     0x1p4     400000
176  0          inf       400000
177'
178
179range_pow='
180 0x1p-1   0x1p1  x  0x1p-10 0x1p10   50000
181 0x1p-1   0x1p1  x -0x1p-10 -0x1p10  50000
182 0x1p-500 0x1p500  x  0x1p-1 0x1p1   50000
183 0x1p-500 0x1p500  x  -0x1p-1 -0x1p1 50000
184 0x1.ep-1 0x1.1p0 x  0x1p8 0x1p16    50000
185 0x1.ep-1 0x1.1p0 x -0x1p8 -0x1p16   50000
186'
187
188range_sin='
189  0       0x1p23     500000
190 -0      -0x1p23     500000
191  0x1p23  inf        10000
192 -0x1p23 -inf        10000
193'
194range_cos="$range_sin"
195
196range_expf='
197  0    0xffff0000    10000
198  0x1p-14   0x1p8    500000
199 -0x1p-14  -0x1p8    500000
200'
201
202range_expf_1u="$range_expf"
203range_exp2f="$range_expf"
204range_exp2f_1u="$range_expf"
205
206range_logf='
207 0    0xffff0000    10000
208 0x1p-4    0x1p4    500000
209'
210
211range_sinf='
212  0        0x1p20   500000
213 -0       -0x1p20   500000
214  0x1p20   inf      10000
215 -0x1p20  -inf      10000
216'
217range_cosf="$range_sinf"
218
219range_powf='
220 0x1p-1   0x1p1  x  0x1p-7 0x1p7   50000
221 0x1p-1   0x1p1  x -0x1p-7 -0x1p7  50000
222 0x1p-70 0x1p70  x  0x1p-1 0x1p1   50000
223 0x1p-70 0x1p70  x  -0x1p-1 -0x1p1 50000
224 0x1.ep-1 0x1.1p0 x  0x1p8 0x1p14  50000
225 0x1.ep-1 0x1.1p0 x -0x1p8 -0x1p14 50000
226'
227
228# error limits
229L_exp=1.9
230L_log=1.2
231L_pow=0.05
232L_sin=3.0
233L_cos=3.0
234L_expf=1.49
235L_expf_1u=0.4
236L_exp2f=1.49
237L_exp2f_1u=0.4
238L_logf=2.9
239L_sinf=1.4
240L_cosf=1.4
241L_powf=2.1
242
243while read G F D
244do
245	case "$G" in \#*) continue ;; esac
246	eval range="\${range_$G}"
247	eval L="\${L_$G}"
248	while read X
249	do
250		[ -n "$X" ] || continue
251		case "$X" in \#*) continue ;; esac
252		disable_fenv=""
253		if [ -z "$WANT_SIMD_EXCEPT" ] || [ $WANT_SIMD_EXCEPT -eq 0 ]; then
254			# If library was built with SIMD exceptions
255			# disabled, disable fenv checking in ulp
256			# tool. Otherwise, fenv checking may still be
257			# disabled by adding -f to the end of the run
258			# line.
259			disable_fenv="-f"
260		fi
261		t $D $disable_fenv $F $X
262	done << EOF
263$range
264
265EOF
266done << EOF
267# group symbol run
268exp       _ZGVnN2v_exp
269log       _ZGVnN2v_log
270pow       _ZGVnN2vv_pow      -f
271sin       _ZGVnN2v_sin       -z
272cos       _ZGVnN2v_cos
273expf      _ZGVnN4v_expf
274expf_1u   _ZGVnN4v_expf_1u   -f
275exp2f     _ZGVnN4v_exp2f
276exp2f_1u  _ZGVnN4v_exp2f_1u  -f
277logf      _ZGVnN4v_logf
278sinf      _ZGVnN4v_sinf      -z
279cosf      _ZGVnN4v_cosf
280powf      _ZGVnN4vv_powf     -f
281EOF
282
283fi # WANT_SIMD_TESTS
284
285[ 0 -eq $FAIL ] || {
286	echo "FAILED $FAIL PASSED $PASS"
287	exit 1
288}
289