xref: /aosp_15_r20/external/arm-optimized-routines/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 Lirmodes='n u d z'
15*412f47f9SXin Li#rmodes=n
16*412f47f9SXin Liflags="${ULPFLAGS:--q}"
17*412f47f9SXin Liemu="$@"
18*412f47f9SXin Li
19*412f47f9SXin LiFAIL=0
20*412f47f9SXin LiPASS=0
21*412f47f9SXin Li
22*412f47f9SXin Lit() {
23*412f47f9SXin Li	[ $r = "n" ] && Lt=$L || Lt=$Ldir
24*412f47f9SXin Li	$emu ./ulp -r $r -e $Lt $flags "$@" && PASS=$((PASS+1)) || FAIL=$((FAIL+1))
25*412f47f9SXin Li}
26*412f47f9SXin Li
27*412f47f9SXin Licheck() {
28*412f47f9SXin Li	$emu ./ulp -f -q "$@" >/dev/null
29*412f47f9SXin Li}
30*412f47f9SXin Li
31*412f47f9SXin LiLdir=0.5
32*412f47f9SXin Lifor r in $rmodes
33*412f47f9SXin Lido
34*412f47f9SXin LiL=0.01
35*412f47f9SXin Lit exp  0 0xffff000000000000 10000
36*412f47f9SXin Lit exp  0x1p-6     0x1p6     40000
37*412f47f9SXin Lit exp -0x1p-6    -0x1p6     40000
38*412f47f9SXin Lit exp  633.3      733.3     10000
39*412f47f9SXin Lit exp -633.3     -777.3     10000
40*412f47f9SXin Li
41*412f47f9SXin LiL=0.01
42*412f47f9SXin Lit exp2  0 0xffff000000000000 10000
43*412f47f9SXin Lit exp2  0x1p-6     0x1p6     40000
44*412f47f9SXin Lit exp2 -0x1p-6    -0x1p6     40000
45*412f47f9SXin Lit exp2  633.3      733.3     10000
46*412f47f9SXin Lit exp2 -633.3     -777.3     10000
47*412f47f9SXin Li
48*412f47f9SXin LiL=0.02
49*412f47f9SXin Lit log  0 0xffff000000000000 10000
50*412f47f9SXin Lit log  0x1p-4    0x1p4      40000
51*412f47f9SXin Lit log  0         inf        40000
52*412f47f9SXin Li
53*412f47f9SXin LiL=0.05
54*412f47f9SXin Lit log2  0 0xffff000000000000 10000
55*412f47f9SXin Lit log2  0x1p-4    0x1p4      40000
56*412f47f9SXin Lit log2  0         inf        40000
57*412f47f9SXin Li
58*412f47f9SXin LiL=0.05
59*412f47f9SXin Lit pow  0.5  2.0  x  0  inf 20000
60*412f47f9SXin Lit pow -0.5 -2.0  x  0  inf 20000
61*412f47f9SXin Lit pow  0.5  2.0  x -0 -inf 20000
62*412f47f9SXin Lit pow -0.5 -2.0  x -0 -inf 20000
63*412f47f9SXin Lit pow  0.5  2.0  x  0x1p-10  0x1p10  40000
64*412f47f9SXin Lit pow  0.5  2.0  x -0x1p-10 -0x1p10  40000
65*412f47f9SXin Lit pow  0    inf  x    0.5      2.0   80000
66*412f47f9SXin Lit pow  0    inf  x   -0.5     -2.0   80000
67*412f47f9SXin Lit pow  0x1.fp-1   0x1.08p0  x  0x1p8 0x1p17  80000
68*412f47f9SXin Lit pow  0x1.fp-1   0x1.08p0  x -0x1p8 -0x1p17 80000
69*412f47f9SXin Lit pow  0         0x1p-1000  x  0 1.0 50000
70*412f47f9SXin Lit pow  0x1p1000        inf  x  0 1.0 50000
71*412f47f9SXin Lit pow  0x1.ffffffffffff0p-1  0x1.0000000000008p0 x 0x1p60 0x1p68 50000
72*412f47f9SXin Lit pow  0x1.ffffffffff000p-1  0x1p0 x 0x1p50 0x1p52 50000
73*412f47f9SXin Lit pow -0x1.ffffffffff000p-1 -0x1p0 x 0x1p50 0x1p52 50000
74*412f47f9SXin Li
75*412f47f9SXin Liif [ "$WANT_EXP10_TESTS" = 1 ]; then
76*412f47f9SXin LiL=0.02
77*412f47f9SXin Lit exp10   0                   0x1p-47             5000
78*412f47f9SXin Lit exp10  -0                  -0x1p-47             5000
79*412f47f9SXin Lit exp10   0x1p-47             1                   50000
80*412f47f9SXin Lit exp10  -0x1p-47            -1                   50000
81*412f47f9SXin Lit exp10   1                   0x1.34413509f79ffp8 50000
82*412f47f9SXin Lit exp10  -1                  -0x1.434e6420f4374p8 50000
83*412f47f9SXin Lit exp10  0x1.34413509f79ffp8  inf                 5000
84*412f47f9SXin Lit exp10 -0x1.434e6420f4374p8 -inf                 5000
85*412f47f9SXin Lifi # WANT_EXP10_TESTS
86*412f47f9SXin Li
87*412f47f9SXin LiL=1.0
88*412f47f9SXin LiLdir=0.9
89*412f47f9SXin Lit erf  0 0xffff000000000000 10000
90*412f47f9SXin Lit erf  0x1p-1022  0x1p-26   40000
91*412f47f9SXin Lit erf  -0x1p-1022 -0x1p-26  40000
92*412f47f9SXin Lit erf  0x1p-26    0x1p3     40000
93*412f47f9SXin Lit erf  -0x1p-26  -0x1p3     40000
94*412f47f9SXin Lit erf  0         inf        40000
95*412f47f9SXin LiLdir=0.5
96*412f47f9SXin Li
97*412f47f9SXin LiL=0.01
98*412f47f9SXin Lit expf  0    0xffff0000    10000
99*412f47f9SXin Lit expf  0x1p-14   0x1p8    50000
100*412f47f9SXin Lit expf -0x1p-14  -0x1p8    50000
101*412f47f9SXin Li
102*412f47f9SXin LiL=0.01
103*412f47f9SXin Lit exp2f  0    0xffff0000   10000
104*412f47f9SXin Lit exp2f  0x1p-14   0x1p8   50000
105*412f47f9SXin Lit exp2f -0x1p-14  -0x1p8   50000
106*412f47f9SXin Li
107*412f47f9SXin LiL=0.32
108*412f47f9SXin Lit logf  0    0xffff0000    10000
109*412f47f9SXin Lit logf  0x1p-4    0x1p4    50000
110*412f47f9SXin Lit logf  0         inf      50000
111*412f47f9SXin Li
112*412f47f9SXin LiL=0.26
113*412f47f9SXin Lit log2f  0    0xffff0000   10000
114*412f47f9SXin Lit log2f  0x1p-4    0x1p4   50000
115*412f47f9SXin Lit log2f  0         inf     50000
116*412f47f9SXin Li
117*412f47f9SXin LiL=0.06
118*412f47f9SXin Lit sinf  0    0xffff0000    10000
119*412f47f9SXin Lit sinf  0x1p-14  0x1p54    50000
120*412f47f9SXin Lit sinf -0x1p-14 -0x1p54    50000
121*412f47f9SXin Li
122*412f47f9SXin LiL=0.06
123*412f47f9SXin Lit cosf  0    0xffff0000    10000
124*412f47f9SXin Lit cosf  0x1p-14  0x1p54    50000
125*412f47f9SXin Lit cosf -0x1p-14 -0x1p54    50000
126*412f47f9SXin Li
127*412f47f9SXin LiL=0.06
128*412f47f9SXin Lit sincosf_sinf  0    0xffff0000    10000
129*412f47f9SXin Lit sincosf_sinf  0x1p-14  0x1p54    50000
130*412f47f9SXin Lit sincosf_sinf -0x1p-14 -0x1p54    50000
131*412f47f9SXin Li
132*412f47f9SXin LiL=0.06
133*412f47f9SXin Lit sincosf_cosf  0    0xffff0000    10000
134*412f47f9SXin Lit sincosf_cosf  0x1p-14  0x1p54    50000
135*412f47f9SXin Lit sincosf_cosf -0x1p-14 -0x1p54    50000
136*412f47f9SXin Li
137*412f47f9SXin LiL=0.4
138*412f47f9SXin Lit powf  0x1p-1   0x1p1  x  0x1p-7 0x1p7   50000
139*412f47f9SXin Lit powf  0x1p-1   0x1p1  x -0x1p-7 -0x1p7  50000
140*412f47f9SXin Lit powf  0x1p-70 0x1p70  x  0x1p-1 0x1p1   50000
141*412f47f9SXin Lit powf  0x1p-70 0x1p70  x  -0x1p-1 -0x1p1 50000
142*412f47f9SXin Lit powf  0x1.ep-1 0x1.1p0 x  0x1p8 0x1p14  50000
143*412f47f9SXin Lit powf  0x1.ep-1 0x1.1p0 x -0x1p8 -0x1p14 50000
144*412f47f9SXin Li
145*412f47f9SXin LiL=0.6
146*412f47f9SXin LiLdir=0.9
147*412f47f9SXin Lit erff  0      0xffff0000 10000
148*412f47f9SXin Lit erff  0x1p-127  0x1p-26 40000
149*412f47f9SXin Lit erff -0x1p-127 -0x1p-26 40000
150*412f47f9SXin Lit erff  0x1p-26   0x1p3   40000
151*412f47f9SXin Lit erff -0x1p-26  -0x1p3   40000
152*412f47f9SXin Lit erff  0         inf     40000
153*412f47f9SXin LiLdir=0.5
154*412f47f9SXin Li
155*412f47f9SXin Lidone
156*412f47f9SXin Li
157*412f47f9SXin Li# vector functions
158*412f47f9SXin Li
159*412f47f9SXin Liif [ "$WANT_SIMD_TESTS" = 1 ]; then
160*412f47f9SXin Li
161*412f47f9SXin LiLdir=0.5
162*412f47f9SXin Lir='n'
163*412f47f9SXin Liflags="${ULPFLAGS:--q}"
164*412f47f9SXin Li
165*412f47f9SXin Lirange_exp='
166*412f47f9SXin Li  0 0xffff000000000000 10000
167*412f47f9SXin Li  0x1p-6     0x1p6     400000
168*412f47f9SXin Li -0x1p-6    -0x1p6     400000
169*412f47f9SXin Li  633.3      733.3     10000
170*412f47f9SXin Li -633.3     -777.3     10000
171*412f47f9SXin Li'
172*412f47f9SXin Li
173*412f47f9SXin Lirange_log='
174*412f47f9SXin Li  0 0xffff000000000000 10000
175*412f47f9SXin Li  0x1p-4     0x1p4     400000
176*412f47f9SXin Li  0          inf       400000
177*412f47f9SXin Li'
178*412f47f9SXin Li
179*412f47f9SXin Lirange_pow='
180*412f47f9SXin Li 0x1p-1   0x1p1  x  0x1p-10 0x1p10   50000
181*412f47f9SXin Li 0x1p-1   0x1p1  x -0x1p-10 -0x1p10  50000
182*412f47f9SXin Li 0x1p-500 0x1p500  x  0x1p-1 0x1p1   50000
183*412f47f9SXin Li 0x1p-500 0x1p500  x  -0x1p-1 -0x1p1 50000
184*412f47f9SXin Li 0x1.ep-1 0x1.1p0 x  0x1p8 0x1p16    50000
185*412f47f9SXin Li 0x1.ep-1 0x1.1p0 x -0x1p8 -0x1p16   50000
186*412f47f9SXin Li'
187*412f47f9SXin Li
188*412f47f9SXin Lirange_sin='
189*412f47f9SXin Li  0       0x1p23     500000
190*412f47f9SXin Li -0      -0x1p23     500000
191*412f47f9SXin Li  0x1p23  inf        10000
192*412f47f9SXin Li -0x1p23 -inf        10000
193*412f47f9SXin Li'
194*412f47f9SXin Lirange_cos="$range_sin"
195*412f47f9SXin Li
196*412f47f9SXin Lirange_expf='
197*412f47f9SXin Li  0    0xffff0000    10000
198*412f47f9SXin Li  0x1p-14   0x1p8    500000
199*412f47f9SXin Li -0x1p-14  -0x1p8    500000
200*412f47f9SXin Li'
201*412f47f9SXin Li
202*412f47f9SXin Lirange_expf_1u="$range_expf"
203*412f47f9SXin Lirange_exp2f="$range_expf"
204*412f47f9SXin Lirange_exp2f_1u="$range_expf"
205*412f47f9SXin Li
206*412f47f9SXin Lirange_logf='
207*412f47f9SXin Li 0    0xffff0000    10000
208*412f47f9SXin Li 0x1p-4    0x1p4    500000
209*412f47f9SXin Li'
210*412f47f9SXin Li
211*412f47f9SXin Lirange_sinf='
212*412f47f9SXin Li  0        0x1p20   500000
213*412f47f9SXin Li -0       -0x1p20   500000
214*412f47f9SXin Li  0x1p20   inf      10000
215*412f47f9SXin Li -0x1p20  -inf      10000
216*412f47f9SXin Li'
217*412f47f9SXin Lirange_cosf="$range_sinf"
218*412f47f9SXin Li
219*412f47f9SXin Lirange_powf='
220*412f47f9SXin Li 0x1p-1   0x1p1  x  0x1p-7 0x1p7   50000
221*412f47f9SXin Li 0x1p-1   0x1p1  x -0x1p-7 -0x1p7  50000
222*412f47f9SXin Li 0x1p-70 0x1p70  x  0x1p-1 0x1p1   50000
223*412f47f9SXin Li 0x1p-70 0x1p70  x  -0x1p-1 -0x1p1 50000
224*412f47f9SXin Li 0x1.ep-1 0x1.1p0 x  0x1p8 0x1p14  50000
225*412f47f9SXin Li 0x1.ep-1 0x1.1p0 x -0x1p8 -0x1p14 50000
226*412f47f9SXin Li'
227*412f47f9SXin Li
228*412f47f9SXin Li# error limits
229*412f47f9SXin LiL_exp=1.9
230*412f47f9SXin LiL_log=1.2
231*412f47f9SXin LiL_pow=0.05
232*412f47f9SXin LiL_sin=3.0
233*412f47f9SXin LiL_cos=3.0
234*412f47f9SXin LiL_expf=1.49
235*412f47f9SXin LiL_expf_1u=0.4
236*412f47f9SXin LiL_exp2f=1.49
237*412f47f9SXin LiL_exp2f_1u=0.4
238*412f47f9SXin LiL_logf=2.9
239*412f47f9SXin LiL_sinf=1.4
240*412f47f9SXin LiL_cosf=1.4
241*412f47f9SXin LiL_powf=2.1
242*412f47f9SXin Li
243*412f47f9SXin Liwhile read G F D
244*412f47f9SXin Lido
245*412f47f9SXin Li	case "$G" in \#*) continue ;; esac
246*412f47f9SXin Li	eval range="\${range_$G}"
247*412f47f9SXin Li	eval L="\${L_$G}"
248*412f47f9SXin Li	while read X
249*412f47f9SXin Li	do
250*412f47f9SXin Li		[ -n "$X" ] || continue
251*412f47f9SXin Li		case "$X" in \#*) continue ;; esac
252*412f47f9SXin Li		disable_fenv=""
253*412f47f9SXin Li		if [ -z "$WANT_SIMD_EXCEPT" ] || [ $WANT_SIMD_EXCEPT -eq 0 ]; then
254*412f47f9SXin Li			# If library was built with SIMD exceptions
255*412f47f9SXin Li			# disabled, disable fenv checking in ulp
256*412f47f9SXin Li			# tool. Otherwise, fenv checking may still be
257*412f47f9SXin Li			# disabled by adding -f to the end of the run
258*412f47f9SXin Li			# line.
259*412f47f9SXin Li			disable_fenv="-f"
260*412f47f9SXin Li		fi
261*412f47f9SXin Li		t $D $disable_fenv $F $X
262*412f47f9SXin Li	done << EOF
263*412f47f9SXin Li$range
264*412f47f9SXin Li
265*412f47f9SXin LiEOF
266*412f47f9SXin Lidone << EOF
267*412f47f9SXin Li# group symbol run
268*412f47f9SXin Liexp       _ZGVnN2v_exp
269*412f47f9SXin Lilog       _ZGVnN2v_log
270*412f47f9SXin Lipow       _ZGVnN2vv_pow      -f
271*412f47f9SXin Lisin       _ZGVnN2v_sin       -z
272*412f47f9SXin Licos       _ZGVnN2v_cos
273*412f47f9SXin Liexpf      _ZGVnN4v_expf
274*412f47f9SXin Liexpf_1u   _ZGVnN4v_expf_1u   -f
275*412f47f9SXin Liexp2f     _ZGVnN4v_exp2f
276*412f47f9SXin Liexp2f_1u  _ZGVnN4v_exp2f_1u  -f
277*412f47f9SXin Lilogf      _ZGVnN4v_logf
278*412f47f9SXin Lisinf      _ZGVnN4v_sinf      -z
279*412f47f9SXin Licosf      _ZGVnN4v_cosf
280*412f47f9SXin Lipowf      _ZGVnN4vv_powf     -f
281*412f47f9SXin LiEOF
282*412f47f9SXin Li
283*412f47f9SXin Lifi # WANT_SIMD_TESTS
284*412f47f9SXin Li
285*412f47f9SXin Li[ 0 -eq $FAIL ] || {
286*412f47f9SXin Li	echo "FAILED $FAIL PASSED $PASS"
287*412f47f9SXin Li	exit 1
288*412f47f9SXin Li}
289