//
// Copyright (c) 2009-2010, ERICSSON AB All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
// * Neither the name of the ERICSSON AB nor the names of its contributors
// may be used to endorse or promote products derived from this software
// without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS
// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
// OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
// THE POSSIBILITY OF SUCH DAMAGE.
//
#include "feldspar_c99.h"
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#if defined(WIN32)
#include <windows.h>
#else
#include <sys/time.h>
#include <time.h>
#endif /* WIN32 */
/*--------------------------------------------------------------------------*
* pow(), abs(), signum() *
*--------------------------------------------------------------------------*/
int8_t pow_fun_int8( int8_t a, int8_t b )
{
if (b < 0) {
fprintf(stderr, "Negative exponent in function pow_fun_(): %d `pow` %d", a, b);
exit(1);
}
int8_t r = 1;
int i;
for(i = 0; i < b; ++i)
r *= a;
return r;
}
int16_t pow_fun_int16( int16_t a, int16_t b )
{
if (b < 0) {
fprintf(stderr, "Negative exponent in function pow_fun_(): %d `pow` %d", a, b);
exit(1);
}
int16_t r = 1;
int i;
for(i = 0; i < b; ++i)
r *= a;
return r;
}
int32_t pow_fun_int32( int32_t a, int32_t b )
{
if (b < 0) {
fprintf(stderr, "Negative exponent in function pow_fun_(): %d `pow` %d", a, b);
exit(1);
}
int32_t r = 1;
int i;
for(i = 0; i < b; ++i)
r *= a;
return r;
}
int64_t pow_fun_int64( int64_t a, int64_t b )
{
if (b < 0) {
fprintf(stderr, "Negative exponent in function pow_fun_(): %lld `pow` %lld", a, b);
exit(1);
}
int64_t r = 1;
int i;
for(i = 0; i < b; ++i)
r *= a;
return r;
}
uint8_t pow_fun_uint8( uint8_t a, uint8_t b )
{
uint8_t r = 1;
int i;
for(i = 0; i < b; ++i)
r *= a;
return r;
}
uint16_t pow_fun_uint16( uint16_t a, uint16_t b )
{
uint16_t r = 1;
int i;
for(i = 0; i < b; ++i)
r *= a;
return r;
}
uint32_t pow_fun_uint32( uint32_t a, uint32_t b )
{
uint32_t r = 1;
int i;
for(i = 0; i < b; ++i)
r *= a;
return r;
}
uint64_t pow_fun_uint64( uint64_t a, uint64_t b )
{
uint64_t r = 1;
int i;
for(i = 0; i < b; ++i)
r *= a;
return r;
}
int8_t abs_fun_int8( int8_t a )
{
// From Bit Twiddling Hacks:
// "Compute the integer absolute value (abs) without branching"
int8_t mask = a >> 7;
return (a + mask) ^ mask;
}
int16_t abs_fun_int16( int16_t a )
{
// From Bit Twiddling Hacks:
// "Compute the integer absolute value (abs) without branching"
int16_t mask = a >> 15;
return (a + mask) ^ mask;
}
int32_t abs_fun_int32( int32_t a )
{
// From Bit Twiddling Hacks:
// "Compute the integer absolute value (abs) without branching"
int32_t mask = a >> 31;
return (a + mask) ^ mask;
}
int64_t abs_fun_int64( int64_t a )
{
// From Bit Twiddling Hacks:
// "Compute the integer absolute value (abs) without branching"
int64_t mask = a >> 63;
return (a + mask) ^ mask;
}
int8_t signum_fun_int8( int8_t a )
{
// From Bit Twiddling Hacks: "Compute the sign of an integer"
return (a != 0) | (a >> 7);
}
int16_t signum_fun_int16( int16_t a )
{
// From Bit Twiddling Hacks: "Compute the sign of an integer"
return (a != 0) | (a >> 15);
}
int32_t signum_fun_int32( int32_t a )
{
// From Bit Twiddling Hacks: "Compute the sign of an integer"
return (a != 0) | (a >> 31);
}
int64_t signum_fun_int64( int64_t a )
{
// From Bit Twiddling Hacks: "Compute the sign of an integer"
return (a != 0) | (a >> 63);
}
uint8_t signum_fun_uint8( uint8_t a )
{
return (a > 0);
}
uint16_t signum_fun_uint16( uint16_t a )
{
return (a > 0);
}
uint32_t signum_fun_uint32( uint32_t a )
{
return (a > 0);
}
uint64_t signum_fun_uint64( uint64_t a )
{
return (a > 0);
}
float signum_fun_float( float a )
{
// From Bit Twiddling Hacks: "Compute the sign of an integer"
return (a > 0) - (a < 0);
}
/*--------------------------------------------------------------------------*
* Bit operations *
*--------------------------------------------------------------------------*/
int8_t bit_fun_int8( int32_t i )
{
return 1 << i;
}
int16_t bit_fun_int16( int32_t i )
{
return 1 << i;
}
int32_t bit_fun_int32( int32_t i )
{
return 1 << i;
}
int64_t bit_fun_int64( int32_t i )
{
return 1 << i;
}
uint8_t bit_fun_uint8( int32_t i )
{
return 1 << i;
}
uint16_t bit_fun_uint16( int32_t i )
{
return 1 << i;
}
uint32_t bit_fun_uint32( int32_t i )
{
return 1 << i;
}
uint64_t bit_fun_uint64( int32_t i )
{
return 1 << i;
}
int8_t setBit_fun_int8( int8_t x, int32_t i )
{
return x | 1 << i;
}
int16_t setBit_fun_int16( int16_t x, int32_t i )
{
return x | 1 << i;
}
int32_t setBit_fun_int32( int32_t x, int32_t i )
{
return x | 1 << i;
}
int64_t setBit_fun_int64( int64_t x, int32_t i )
{
return x | 1 << i;
}
uint8_t setBit_fun_uint8( uint8_t x, int32_t i )
{
return x | 1 << i;
}
uint16_t setBit_fun_uint16( uint16_t x, int32_t i )
{
return x | 1 << i;
}
uint32_t setBit_fun_uint32( uint32_t x, int32_t i )
{
return x | 1 << i;
}
uint64_t setBit_fun_uint64( uint64_t x, int32_t i )
{
return x | 1 << i;
}
int8_t clearBit_fun_int8( int8_t x, int32_t i )
{
return x & ~(1 << i);
}
int16_t clearBit_fun_int16( int16_t x, int32_t i )
{
return x & ~(1 << i);
}
int32_t clearBit_fun_int32( int32_t x, int32_t i )
{
return x & ~(1 << i);
}
int64_t clearBit_fun_int64( int64_t x, int32_t i )
{
return x & ~(1 << i);
}
uint8_t clearBit_fun_uint8( uint8_t x, int32_t i )
{
return x & ~(1 << i);
}
uint16_t clearBit_fun_uint16( uint16_t x, int32_t i )
{
return x & ~(1 << i);
}
uint32_t clearBit_fun_uint32( uint32_t x, int32_t i )
{
return x & ~(1 << i);
}
uint64_t clearBit_fun_uint64( uint64_t x, int32_t i )
{
return x & ~(1 << i);
}
int8_t complementBit_fun_int8( int8_t x, int32_t i )
{
return x ^ 1 << i;
}
int16_t complementBit_fun_int16( int16_t x, int32_t i )
{
return x ^ 1 << i;
}
int32_t complementBit_fun_int32( int32_t x, int32_t i )
{
return x ^ 1 << i;
}
int64_t complementBit_fun_int64( int64_t x, int32_t i )
{
return x ^ 1 << i;
}
uint8_t complementBit_fun_uint8( uint8_t x, int32_t i )
{
return x ^ 1 << i;
}
uint16_t complementBit_fun_uint16( uint16_t x, int32_t i )
{
return x ^ 1 << i;
}
uint32_t complementBit_fun_uint32( uint32_t x, int32_t i )
{
return x ^ 1 << i;
}
uint64_t complementBit_fun_uint64( uint64_t x, int32_t i )
{
return x ^ 1 << i;
}
int testBit_fun_int8( int8_t x, int32_t i )
{
return (x & 1 << i) != 0;
}
int testBit_fun_int16( int16_t x, int32_t i )
{
return (x & 1 << i) != 0;
}
int testBit_fun_int32( int32_t x, int32_t i )
{
return (x & 1 << i) != 0;
}
int testBit_fun_int64( int64_t x, int32_t i )
{
return (x & 1 << i) != 0;
}
int testBit_fun_uint8( uint8_t x, int32_t i )
{
return (x & 1 << i) != 0;
}
int testBit_fun_uint16( uint16_t x, int32_t i )
{
return (x & 1 << i) != 0;
}
int testBit_fun_uint32( uint32_t x, int32_t i )
{
return (x & 1 << i) != 0;
}
int testBit_fun_uint64( uint64_t x, int32_t i )
{
return (x & 1 << i) != 0;
}
int8_t rotateL_fun_int8( int8_t x, int32_t i )
{
if ((i %= 8) == 0) return x;
return (x << i) | ((0x7f >> (7 - i)) & (x >> (8 - i)));
}
int16_t rotateL_fun_int16( int16_t x, int32_t i )
{
if ((i %= 16) == 0) return x;
return (x << i) | ((0x7fff >> (15 - i)) & (x >> (16 - i)));
}
int32_t rotateL_fun_int32( int32_t x, int32_t i )
{
if ((i %= 32) == 0) return x;
return (x << i) | ((0x7fffffff >> (31 - i)) & (x >> (32 - i)));
}
int64_t rotateL_fun_int64( int64_t x, int32_t i )
{
if ((i %= 64) == 0) return x;
return (x << i) | ((0x7fffffffffffffffll >> (63 - i)) & (x >> (64 - i)));
}
uint8_t rotateL_fun_uint8( uint8_t x, int32_t i )
{
if ((i %= 8) == 0) return x;
return (x << i) | (x >> (8 - i));
}
uint16_t rotateL_fun_uint16( uint16_t x, int32_t i )
{
if ((i %= 16) == 0) return x;
return (x << i) | (x >> (16 - i));
}
uint32_t rotateL_fun_uint32( uint32_t x, int32_t i )
{
if ((i %= 32) == 0) return x;
return (x << i) | (x >> (32 - i));
}
uint64_t rotateL_fun_uint64( uint64_t x, int32_t i )
{
if ((i %= 64) == 0) return x;
return (x << i) | (x >> (64 - i));
}
int8_t rotateR_fun_int8( int8_t x, int32_t i )
{
if ((i %= 8) == 0) return x;
return (x << (8 - i)) | ((0x7f >> (i - 1)) & (x >> i));
}
int16_t rotateR_fun_int16( int16_t x, int32_t i )
{
if ((i %= 16) == 0) return x;
return (x << (16 - i)) | ((0x7fff >> (i - 1)) & (x >> i));
}
int32_t rotateR_fun_int32( int32_t x, int32_t i )
{
if ((i %= 32) == 0) return x;
return (x << (32 - i)) | ((0x7fffffff >> (i - 1)) & (x >> i));
}
int64_t rotateR_fun_int64( int64_t x, int32_t i )
{
if ((i %= 64) == 0) return x;
return (x << (64 - i)) | ((0x7fffffffffffffffll >> (i - 1)) & (x >> i));
}
uint8_t rotateR_fun_uint8( uint8_t x, int32_t i )
{
if ((i %= 8) == 0) return x;
return (x << (8 - i)) | (x >> i);
}
uint16_t rotateR_fun_uint16( uint16_t x, int32_t i )
{
if ((i %= 16) == 0) return x;
return (x << (16 - i)) | (x >> i);
}
uint32_t rotateR_fun_uint32( uint32_t x, int32_t i )
{
if ((i %= 32) == 0) return x;
return (x << (32 - i)) | (x >> i);
}
uint64_t rotateR_fun_uint64( uint64_t x, int32_t i )
{
if ((i %= 64) == 0) return x;
return (x << (64 - i)) | (x >> i);
}
int8_t reverseBits_fun_int8( int8_t x )
{
int8_t r = x;
int i = 7;
for (x = x >> 1 & 0x7f; x; x >>= 1)
{
r = (r << 1) | (x & 1);
--i;
}
return r << i;
}
int16_t reverseBits_fun_int16( int16_t x )
{
int16_t r = x;
int i = 15;
for (x = x >> 1 & 0x7fff; x; x >>= 1)
{
r = (r << 1) | (x & 1);
--i;
}
return r << i;
}
int32_t reverseBits_fun_int32( int32_t x )
{
int32_t r = x;
int i = 31;
for (x = x >> 1 & 0x7fffffff; x; x >>= 1)
{
r = (r << 1) | (x & 1);
--i;
}
return r << i;
}
int64_t reverseBits_fun_int64( int64_t x )
{
int64_t r = x;
int i = 63;
for (x = x >> 1 & 0x7fffffffffffffffll; x; x >>= 1)
{
r = (r << 1) | (x & 1);
--i;
}
return r << i;
}
uint8_t reverseBits_fun_uint8( uint8_t x )
{
uint8_t r = x;
int i = 7;
while (x >>= 1)
{
r = (r << 1) | (x & 1);
--i;
}
return x << i;
}
uint16_t reverseBits_fun_uint16( uint16_t x )
{
uint16_t r = x;
int i = 15;
while (x >>= 1)
{
r = (r << 1) | (x & 1);
--i;
}
return r << i;
}
uint32_t reverseBits_fun_uint32( uint32_t x )
{
uint32_t r = x;
int i = 31;
while (x >>= 1)
{
r = (r << 1) | (x & 1);
--i;
}
return r << i;
}
uint64_t reverseBits_fun_uint64( uint64_t x )
{
uint64_t r = x;
int i = 63;
while (x >>= 1)
{
r = (r << 1) | (x & 1);
--i;
}
return r << i;
}
int32_t bitScan_fun_int8( int8_t x )
{
if (x == 0) return 7;
int32_t r = 0;
int8_t s = (x & 0x80);
while (((x <<= 1) & 0x80) == s)
++r;
return r;
}
int32_t bitScan_fun_int16( int16_t x )
{
if (x == 0) return 15;
int32_t r = 0;
int16_t s = (x & 0x8000);
while (((x <<= 1) & 0x8000) == s)
++r;
return r;
}
int32_t bitScan_fun_int32( int32_t x )
{
if (x == 0) return 31;
int32_t r = 0;
int32_t s = (x & 0x80000000);
while (((x <<= 1) & 0x80000000) == s)
++r;
return r;
}
int32_t bitScan_fun_int64( int64_t x )
{
if (x == 0) return 63;
int32_t r = 0;
int64_t s = (x & 0x8000000000000000ll);
while (((x <<= 1) & 0x8000000000000000ll) == s)
++r;
return r;
}
int32_t bitScan_fun_uint8( uint8_t x )
{
int32_t r = 8;
while (x)
{
--r;
x >>= 1;
}
return r;
}
int32_t bitScan_fun_uint16( uint16_t x )
{
int32_t r = 16;
while (x)
{
--r;
x >>= 1;
}
return r;
}
int32_t bitScan_fun_uint32( uint32_t x )
{
int32_t r = 32;
while (x)
{
--r;
x >>= 1;
}
return r;
}
int32_t bitScan_fun_uint64( uint64_t x )
{
int32_t r = 64;
while (x)
{
--r;
x >>= 1;
}
return r;
}
int32_t bitCount_fun_int8( int8_t x )
{
int32_t r = x & 1;
for (x = x >> 1 & 0x7f; x; x >>= 1)
r += x & 1;
return r;
}
int32_t bitCount_fun_int16( int16_t x )
{
int32_t r = x & 1;
for (x = x >> 1 & 0x7fff; x; x >>= 1)
r += x & 1;
return r;
}
int32_t bitCount_fun_int32( int32_t x )
{
int32_t r = x & 1;
for (x = x >> 1 & 0x7fffffff; x; x >>= 1)
r += x & 1;
return r;
}
int32_t bitCount_fun_int64( int64_t x )
{
int32_t r = x & 1;
for (x = x >> 1 & 0x7fffffffffffffffll; x; x >>= 1)
r += x & 1;
return r;
}
int32_t bitCount_fun_uint8( uint8_t x )
{
int32_t r = x & 1;
while (x >>= 1)
r += x & 1;
return r;
}
int32_t bitCount_fun_uint16( uint16_t x )
{
int32_t r = x & 1;
while (x >>= 1)
r += x & 1;
return r;
}
int32_t bitCount_fun_uint32( uint32_t x )
{
int32_t r = x & 1;
while (x >>= 1)
r += x & 1;
return r;
}
int32_t bitCount_fun_uint64( uint64_t x )
{
int32_t r = x & 1;
while (x >>= 1)
r += x & 1;
return r;
}
/*--------------------------------------------------------------------------*
* copy_arrayOf() *
*--------------------------------------------------------------------------*/
void copy_arrayOf_int8( int8_t* a, int32_t a1, int8_t* b )
{
int i;
for(i = 0; i < a1; ++i)
b[i] = a[i];
}
void copy_arrayOf_int16( int16_t* a, int32_t a1, int16_t* b )
{
int i;
for(i = 0; i < a1; ++i)
b[i] = a[i];
}
void copy_arrayOf_int32( int32_t* a, int32_t a1, int32_t* b )
{
int i;
for(i = 0; i < a1; ++i)
b[i] = a[i];
}
void copy_arrayOf_int64( int64_t* a, int32_t a1, int64_t* b )
{
int i;
for(i = 0; i < a1; ++i)
b[i] = a[i];
}
void copy_arrayOf_uint8( uint8_t* a, int32_t a1, uint8_t* b )
{
int i;
for(i = 0; i < a1; ++i)
b[i] = a[i];
}
void copy_arrayOf_uint16( uint16_t* a, int32_t a1, uint16_t* b )
{
int i;
for(i = 0; i < a1; ++i)
b[i] = a[i];
}
void copy_arrayOf_uint32( uint32_t* a, int32_t a1, uint32_t* b )
{
int i;
for(i = 0; i < a1; ++i)
b[i] = a[i];
}
void copy_arrayOf_uint64( uint64_t* a, int32_t a1, uint64_t* b )
{
int i;
for(i = 0; i < a1; ++i)
b[i] = a[i];
}
void copy_arrayOf_float( float* a, signed int a1, float* b )
{
int i;
for(i = 0; i < a1; ++i)
b[i] = a[i];
}
/*--------------------------------------------------------------------------*
* Trace functions *
*--------------------------------------------------------------------------*/
static FILE *trace_log_file;
#if defined(WIN32)
static DWORD trace_start_time;
void traceStart()
{
SYSTEMTIME lt;
GetLocalTime(<);
char str [256];
sprintf(str, "trace-%04d%02d%02d-%02d%02d%02d.log",
lt.wYear, lt.wMonth, lt.wDay, lt.wHour, lt.wMinute, lt.wSecond);
trace_log_file = fopen(str, "a");
if (trace_log_file == NULL) {
fprintf(stderr,"Can not open trace file.\n");
exit (8);
}
fprintf(trace_log_file,
"The logging started at %02d-%02d-%04d %02d:%02d:%02d.\n",
lt.wDay, lt.wMonth, lt.wYear, lt.wHour, lt.wMinute, lt.wSecond);
fflush(trace_log_file);
trace_start_time = GetTickCount();
}
inline void elapsedTimeString( char* str )
{
DWORD diff_ms = GetTickCount() - trace_start_time;
DWORD diff = diff_ms / 1000;
diff_ms = diff_ms % 1000;
sprintf(str, "%d.%.3d", diff, diff_ms);
}
#else
static struct timeval trace_start_time;
void traceStart()
{
gettimeofday(&trace_start_time, NULL);
struct tm * timeinfo = localtime(&(trace_start_time.tv_sec));
char timestr [80];
char str [256];
strftime(timestr, 80, "%Y%m%d-%H%M%S", timeinfo);
sprintf(str, "trace-%s.log", timestr);
trace_log_file = fopen(str, "a");
if (trace_log_file == NULL) {
fprintf(stderr,"Can not open trace file.\n");
exit (8);
}
strftime(timestr, 80, "%d-%b-%Y %H:%M:%S", timeinfo);
fprintf(trace_log_file, "The logging started at %s.\n", timestr);
fflush(trace_log_file);
gettimeofday(&trace_start_time, NULL);
}
inline void elapsedTimeString( char* str )
{
struct timeval tv;
gettimeofday (&tv, NULL);
if (trace_start_time.tv_usec <= tv.tv_usec) {
tv.tv_sec = tv.tv_sec - trace_start_time.tv_sec;
tv.tv_usec = tv.tv_usec - trace_start_time.tv_usec;
} else {
tv.tv_sec = tv.tv_sec - trace_start_time.tv_sec - 1;
tv.tv_usec = 1000000 + tv.tv_usec - trace_start_time.tv_usec;
}
sprintf(str, "%ld.%06ld", tv.tv_sec, tv.tv_usec);
}
#endif /* WIN32 */
void traceEnd()
{
fprintf(trace_log_file, "The logging finished.\n");
fclose(trace_log_file);
}
void trace_int8( int8_t val, int32_t id )
{
char timestr [80];
elapsedTimeString(timestr);
fprintf(trace_log_file, "id=%d, time=%s, value=%d\n", id, timestr, val);
fflush(trace_log_file);
}
void trace_int16( int16_t val, int32_t id )
{
char timestr [80];
elapsedTimeString(timestr);
fprintf(trace_log_file, "id=%d, time=%s, value=%d\n", id, timestr, val);
fflush(trace_log_file);
}
void trace_int32( int32_t val, int32_t id )
{
char timestr [80];
elapsedTimeString(timestr);
fprintf(trace_log_file, "id=%d, time=%s, value=%d\n", id, timestr, val);
fflush(trace_log_file);
}
void trace_int64( int64_t val, int32_t id )
{
char timestr [80];
elapsedTimeString(timestr);
fprintf(trace_log_file, "id=%d, time=%s, value=%lld\n", id, timestr, val);
fflush(trace_log_file);
}
void trace_uint8( uint8_t val, int32_t id )
{
char timestr [80];
elapsedTimeString(timestr);
fprintf(trace_log_file, "id=%d, time=%s, value=%u\n", id, timestr, val);
fflush(trace_log_file);
}
void trace_uint16( uint16_t val, int32_t id )
{
char timestr [80];
elapsedTimeString(timestr);
fprintf(trace_log_file, "id=%d, time=%s, value=%u\n", id, timestr, val);
fflush(trace_log_file);
}
void trace_uint32( uint32_t val, int32_t id )
{
char timestr [80];
elapsedTimeString(timestr);
fprintf(trace_log_file, "id=%d, time=%s, value=%u\n", id, timestr, val);
fflush(trace_log_file);
}
void trace_uint64( uint64_t val, int32_t id )
{
char timestr [80];
elapsedTimeString(timestr);
fprintf(trace_log_file, "id=%d, time=%s, value=%llu\n", id, timestr, val);
fflush(trace_log_file);
}
void trace_float( float val, int32_t id )
{
char timestr [80];
elapsedTimeString(timestr);
fprintf(trace_log_file, "id=%d, time=%s, value=%f\n", id, timestr, val);
fflush(trace_log_file);
}