diff options
| author | Richard Qin <richard.qin.x@gmail.com> | 2025-09-24 13:50:55 +0800 |
|---|---|---|
| committer | Richard Qin <richard.qin.x@gmail.com> | 2025-09-24 13:50:55 +0800 |
| commit | 87f0114dd8d2cf355c4e631ab089ddd75abdcc0c (patch) | |
| tree | ddb6753774ee91f090f59a89adf7e21f780dc2ad /tests.c | |
| download | datalab2026-87f0114dd8d2cf355c4e631ab089ddd75abdcc0c.tar.gz datalab2026-87f0114dd8d2cf355c4e631ab089ddd75abdcc0c.tar.xz | |
Initial commit: Add starter code for Datalab
Diffstat (limited to 'tests.c')
| -rw-r--r-- | tests.c | 184 |
1 files changed, 184 insertions, 0 deletions
@@ -0,0 +1,184 @@ +/* Testing Code */ + +#include <math.h> +#include <stdio.h> +#include <limits.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_bitXor(int x, int y) { + return x ^ y; +} + +int test_logtwo(int v) { + if (v <= 1) + return 0; // 32-bit value to find the log2 of + const unsigned int b[] = {0x2, 0xC, 0xF0, 0xFF00, 0xFFFF0000}; + const unsigned int S[] = {1, 2, 4, 8, 16}; + int i; + unsigned int r = 0; // result of log2(v) will go here + for (i = 4; i >= 0; i--) // unroll for speed... + { + if (v & b[i]) { + v >>= S[i]; + r |= S[i]; + } + } + return r; +} +int test_byteSwap(int x, int n, int m) { + /* little endiamachine */ + /* least significant byte stored first */ + unsigned int nmask, mmask; + switch (n) { + case 0: + nmask = x & 0xFF; + x &= 0xFFFFFF00; + break; + case 1: + nmask = (x & 0xFF00) >> 8; + x &= 0xFFFF00FF; + break; + case 2: + nmask = (x & 0xFF0000) >> 16; + x &= 0xFF00FFFF; + break; + default: + nmask = ((unsigned int)(x & 0xFF000000)) >> 24; + x &= 0x00FFFFFF; + break; + } + switch (m) { + case 0: + mmask = x & 0xFF; + x &= 0xFFFFFF00; + break; + case 1: + mmask = (x & 0xFF00) >> 8; + x &= 0xFFFF00FF; + break; + case 2: + mmask = (x & 0xFF0000) >> 16; + x &= 0xFF00FFFF; + break; + default: + mmask = ((unsigned int)(x & 0xFF000000)) >> 24; + x &= 0x00FFFFFF; + break; + } + nmask <<= 8 * m; + mmask <<= 8 * n; + return x | nmask | mmask; +} +int test_samesign(int x, int y) { + if (x < 0 && y < 0) { + return 1; + } else if (x > 0 && y > 0) { + return 1; + } else if (x == y && x == 0) { + return 1; + } else { + return 0; + } +} +int test_logicalShift(int x, int n) { + unsigned u = (unsigned)x; + unsigned shifted = u >> n; + return (int)shifted; +} +unsigned test_reverse(unsigned v) { + static const unsigned char BitReverseTable256[256] = + { +#define R2(n) n, n + 2 * 64, n + 1 * 64, n + 3 * 64 +#define R4(n) R2(n), R2(n + 2 * 16), R2(n + 1 * 16), R2(n + 3 * 16) +#define R6(n) R4(n), R4(n + 2 * 4), R4(n + 1 * 4), R4(n + 3 * 4) + R6(0), R6(2), R6(1), R6(3)}; + unsigned int c; + c = (BitReverseTable256[v & 0xff] << 24) | + (BitReverseTable256[(v >> 8) & 0xff] << 16) | + (BitReverseTable256[(v >> 16) & 0xff] << 8) | + (BitReverseTable256[(v >> 24) & 0xff]); + return c; +} +unsigned test_float_i2f(int x) { + float f = (float)x; + return f2u(f); +} +int test_float64_f2i(unsigned uf1, unsigned uf2) { + unsigned sign = uf2 >> 31; + unsigned exp = (uf2 >> 20) & 0x7FF; + unsigned val = 0x80000000u | ((uf2 & 0xFFFFF) << 11) | (uf1 >> 21); + if (exp < 1023) { + return 0; + } + if (exp > 1054) + return 0x80000000u; + val = val >> (1054 - exp); + if (sign) { + return val > 0x80000000u ? 0x80000000u : -val; + } else { + return val > 0x7FFFFFFF ? 0x80000000u : val; + } +} +int test_leftBitCount(int x) { + int result = 0; + int i; + for (i = 31; i >= 0; i--) { + int bit = (x >> i) & 0x1; + if (!bit) + break; + result++; + } + return result; +} +unsigned test_floatScale2(unsigned uf) { + float f = u2f(uf); + float tf = 2 * f; + if (isnan(f)) + return uf; + else + return f2u(tf); +} +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); +} |
