Skip to content

Commit 36b2fd2

Browse files
committed
libm: Add a couple of tests for scalbn
These check for a bug handling overflow in scalbn caused by compiler optimization of integer overflow. Signed-off-by: Keith Packard <keithp@keithp.com>
1 parent 3bf0a10 commit 36b2fd2

File tree

4 files changed

+68
-0
lines changed

4 files changed

+68
-0
lines changed

newlib/libm/test/math.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -588,6 +588,20 @@ run_vector_1 (int vector,
588588
fresult = (float) ((pdblfunc)(func))(arg1, &result2);
589589
ffinish2(f, vector, fresult, result2, p, args, name);
590590
}
591+
else if (strcmp(args,"ddi") == 0)
592+
{
593+
typedef double (*pdblfunc)(double, int);
594+
595+
result = ((pdblfunc)func) (arg1, (int) arg2);
596+
finish(f, vector, result, p, args, name);
597+
}
598+
else if (strcmp(args,"ffi") == 0)
599+
{
600+
typedef float (*pdblfunc)(float, int);
601+
602+
fresult = ((pdblfunc)func) (arg1, (int) arg2);
603+
ffinish(f, vector, fresult, p, args, name);
604+
}
591605
p++;
592606
}
593607
if (vector)
@@ -656,6 +670,8 @@ test_math (int vector)
656670
test_modff(vector);
657671
test_pow_vec(vector);
658672
test_powf_vec(vector);
673+
test_scalbn(vector);
674+
test_scalbnf(vector);
659675
test_sin(vector);
660676
test_sinf(vector);
661677
test_sinh(vector);

newlib/libm/test/meson.build

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ math_test_src = [
9696
'modff_vec.c',
9797
'pow_vec.c',
9898
'powf_vec.c',
99+
'scalbn_vec.c',
99100
'sinf_vec.c',
100101
'sinhf_vec.c',
101102
'sinh_vec.c',

newlib/libm/test/scalbn_vec.c

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
/*
2+
* SPDX-License-Identifier: BSD-3-Clause
3+
*
4+
* Copyright © 2021 Keith Packard
5+
*
6+
* Redistribution and use in source and binary forms, with or without
7+
* modification, are permitted provided that the following conditions
8+
* are met:
9+
*
10+
* 1. Redistributions of source code must retain the above copyright
11+
* notice, this list of conditions and the following disclaimer.
12+
*
13+
* 2. Redistributions in binary form must reproduce the above
14+
* copyright notice, this list of conditions and the following
15+
* disclaimer in the documentation and/or other materials provided
16+
* with the distribution.
17+
*
18+
* 3. Neither the name of the copyright holder nor the names of its
19+
* contributors may be used to endorse or promote products derived
20+
* from this software without specific prior written permission.
21+
*
22+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23+
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24+
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
25+
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
26+
* COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
27+
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
28+
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
29+
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30+
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
31+
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
32+
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
33+
* OF THE POSSIBILITY OF SUCH DAMAGE.
34+
*/
35+
#include "test.h"
36+
37+
one_line_type scalbn_vec[] = {
38+
{ 64, 0, 123, __LINE__, 0x3ff00000, 0x00000000, 0x3ff00000, 0x00000000, 0x00000000, 0x00000000 }, /* 1 = f(1, 0); */
39+
{ 64, 0, 123, __LINE__, 0x7ff00000, 0x00000000, 0x3ff00000, 0x00000000, 0x40c38800, 0x00000000 }, /* +inf = f(1, 10000); */
40+
{ 64, 0, 123, __LINE__, 0x7ff00000, 0x00000000, 0x3ff00000, 0x00000000, 0x41dfffff, 0xffc00000 }, /* +inf = f(1, 0x7fffffff); */
41+
{ 0 },
42+
};
43+
44+
void test_scalbn(int m) { run_vector_1(m, scalbn_vec, (void*)scalbn,"scalbn","ddi"); }
45+
void test_scalbnf(int m) { run_vector_1(m, scalbn_vec, (void*)scalbnf,"scalbnf","ffi"); }

newlib/libm/test/test.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -480,6 +480,12 @@ test_pow_vec(int vector);
480480
void
481481
test_powf_vec(int vector);
482482

483+
void
484+
test_scalbn(int vector);
485+
486+
void
487+
test_scalbnf(int vector);
488+
483489
void
484490
test_sin(int vector);
485491

0 commit comments

Comments
 (0)