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