-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtests.c
121 lines (116 loc) · 1.98 KB
/
tests.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
/* 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;
}
int test_bitAnd(int x, int y)
{
return x&y;
}
int test_getByte(int x, int n)
{
unsigned char byte;
switch(n) {
case 0:
byte = x;
break;
case 1:
byte = x >> 8;
break;
case 2:
byte = x >> 16;
break;
default:
byte = x >> 24;
break;
}
return (int) (unsigned) byte;
}
int test_logicalShift(int x, int n) {
unsigned u = (unsigned) x;
unsigned shifted = u >> n;
return (int) shifted;
}
int test_bitCount(int x) {
int result = 0;
int i;
for (i = 0; i < 32; i++)
result += (x >> i) & 0x1;
return result;
}
int test_bang(int x)
{
return !x;
}
int test_tmin(void) {
return 0x80000000;
}
int test_fitsBits(int x, int n)
{
int TMin_n = -(1 << (n-1));
int TMax_n = (1 << (n-1)) - 1;
return x >= TMin_n && x <= TMax_n;
}
int test_divpwr2(int x, int n)
{
int p2n = 1<<n;
return x/p2n;
}
int test_negate(int x) {
return -x;
}
int test_isPositive(int x) {
return x > 0;
}
int test_isLessOrEqual(int x, int y)
{
return x <= y;
}
int test_ilog2(int x) {
int mask, result;
/* find the leftmost bit */
result = 31;
mask = 1 << result;
while (!(x & mask)) {
result--;
mask = 1 << result;
}
return result;
}
unsigned test_float_neg(unsigned uf) {
float f = u2f(uf);
float nf = -f;
if (isnan(f))
return uf;
else
return f2u(nf);
}
unsigned test_float_i2f(int x) {
float f = (float) x;
return f2u(f);
}
unsigned test_float_twice(unsigned uf) {
float f = u2f(uf);
float tf = 2*f;
if (isnan(f))
return uf;
else
return f2u(tf);
}