157 lines
3.8 KiB
C
157 lines
3.8 KiB
C
|
/* Testing Code */
|
||
|
|
||
|
#include <limits.h>
|
||
|
#include <math.h>
|
||
|
|
||
|
/* Routines used by floation point test code */
|
||
|
|
||
|
/* Convert from bit level representation to floating point number */
|
||
|
float u2f(unsigned u) {
|
||
|
union {
|
||
|
unsigned u;
|
||
|
float f;
|
||
|
} a;
|
||
|
a.u = u;
|
||
|
return a.f;
|
||
|
}
|
||
|
|
||
|
/* Convert from floating point number to bit-level representation */
|
||
|
unsigned f2u(float f) {
|
||
|
union {
|
||
|
unsigned u;
|
||
|
float f;
|
||
|
} a;
|
||
|
a.f = f;
|
||
|
return a.u;
|
||
|
}
|
||
|
|
||
|
/* Copyright (C) 1991-2022 Free Software Foundation, Inc.
|
||
|
This file is part of the GNU C Library.
|
||
|
|
||
|
The GNU C Library is free software; you can redistribute it and/or
|
||
|
modify it under the terms of the GNU Lesser General Public
|
||
|
License as published by the Free Software Foundation; either
|
||
|
version 2.1 of the License, or (at your option) any later version.
|
||
|
|
||
|
The GNU C Library is distributed in the hope that it will be useful,
|
||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||
|
Lesser General Public License for more details.
|
||
|
|
||
|
You should have received a copy of the GNU Lesser General Public
|
||
|
License along with the GNU C Library; if not, see
|
||
|
<https://www.gnu.org/licenses/>. */
|
||
|
/* This header is separate from features.h so that the compiler can
|
||
|
include it implicitly at the start of every compilation. It must
|
||
|
not itself include <features.h> or any other header that includes
|
||
|
<features.h> because the implicit include comes before any feature
|
||
|
test macros that may be defined in a source file before it first
|
||
|
explicitly includes a system header. GCC knows the name of this
|
||
|
header in order to preinclude it. */
|
||
|
/* glibc's intent is to support the IEC 559 math functionality, real
|
||
|
and complex. If the GCC (4.9 and later) predefined macros
|
||
|
specifying compiler intent are available, use them to determine
|
||
|
whether the overall intent is to support these features; otherwise,
|
||
|
presume an older compiler has intent to support these features and
|
||
|
define these macros by default. */
|
||
|
/* wchar_t uses Unicode 10.0.0. Version 10.0 of the Unicode Standard is
|
||
|
synchronized with ISO/IEC 10646:2017, fifth edition, plus
|
||
|
the following additions from Amendment 1 to the fifth edition:
|
||
|
- 56 emoji characters
|
||
|
- 285 hentaigana
|
||
|
- 3 additional Zanabazar Square characters */
|
||
|
//1
|
||
|
int test_bitAnd(int x, int y)
|
||
|
{
|
||
|
return x&y;
|
||
|
}
|
||
|
int test_tmin(void) {
|
||
|
return 0x80000000;
|
||
|
}
|
||
|
int test_isZero(int x) {
|
||
|
return x == 0;
|
||
|
}
|
||
|
int test_isTmin(int x) {
|
||
|
return x == 0x80000000;
|
||
|
}
|
||
|
//2
|
||
|
int test_allOddBits(int x) {
|
||
|
int i;
|
||
|
for (i = 1; i < 32; i+=2)
|
||
|
if ((x & (1<<i)) == 0)
|
||
|
return 0;
|
||
|
return 1;
|
||
|
}
|
||
|
int test_negate(int x) {
|
||
|
return -x;
|
||
|
}
|
||
|
int test_isNotEqual(int x, int y)
|
||
|
{
|
||
|
return x != y;
|
||
|
}
|
||
|
//3
|
||
|
int test_isAsciiDigit(int x) {
|
||
|
return (0x30 <= x) && (x <= 0x39);
|
||
|
}
|
||
|
int test_conditional(int x, int y, int z)
|
||
|
{
|
||
|
return x?y:z;
|
||
|
}
|
||
|
int test_bitMask(int highbit, int lowbit)
|
||
|
{
|
||
|
int result = 0;
|
||
|
int i;
|
||
|
for (i = lowbit; i <= highbit; i++)
|
||
|
result |= 1 << i;
|
||
|
return result;
|
||
|
}
|
||
|
//4
|
||
|
int test_logicalNeg(int x)
|
||
|
{
|
||
|
return !x;
|
||
|
}
|
||
|
int test_bitParity(int x) {
|
||
|
int result = 0;
|
||
|
int i;
|
||
|
for (i = 0; i < 32; i++)
|
||
|
result ^= (x >> i) & 0x1;
|
||
|
return result;
|
||
|
}
|
||
|
int test_absVal(int x) {
|
||
|
return (x < 0) ? -x : x;
|
||
|
}
|
||
|
//float
|
||
|
unsigned test_floatScale2(unsigned uf) {
|
||
|
float f = u2f(uf);
|
||
|
float tf = 2*f;
|
||
|
if (isnan(f))
|
||
|
return uf;
|
||
|
else
|
||
|
return f2u(tf);
|
||
|
}
|
||
|
int test_floatFloat2Int(unsigned uf) {
|
||
|
float f = u2f(uf);
|
||
|
int x = (int) f;
|
||
|
return x;
|
||
|
}
|
||
|
unsigned test_floatPower2(int x) {
|
||
|
float result = 1.0;
|
||
|
float p2 = 2.0;
|
||
|
int recip = (x < 0);
|
||
|
/* treat tmin specially */
|
||
|
if ((unsigned)x == 0x80000000) {
|
||
|
return 0;
|
||
|
}
|
||
|
if (recip) {
|
||
|
x = -x;
|
||
|
p2 = 0.5;
|
||
|
}
|
||
|
while (x > 0) {
|
||
|
if (x & 0x1)
|
||
|
result = result * p2;
|
||
|
p2 = p2 * p2;
|
||
|
x >>= 1;
|
||
|
}
|
||
|
return f2u(result);
|
||
|
}
|