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