packages feed

feldspar-compiler-0.2.1: Feldspar/C/feldspar.c

/*
 * 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.h"



int mod_fun_signed_int( int a, int b )
{
    if ((a > 0 && b > 0) || (a < 0 && b < 0)) return a % b;
    return (a % b) * (-1);
}

int mod_fun_unsigned_int( unsigned int a, unsigned int b )
{
    return a % b;
}

long mod_fun_signed_long( long a, long b )
{
    if ((a > 0 && b > 0) || (a < 0 && b < 0)) return a % b;
    return (a % b) * (-1);
}

long mod_fun_unsigned_long( unsigned long a, unsigned long b )
{
    return a % b;
}



int pow_fun_signed_int( int a, int b)
{
    int out = 1;
    int i;
    for(i=0; i<b; i++) out *= a;
    return out;
}

int pow_fun_unsigned_int( unsigned int a, unsigned int b )
{
    int out = 1;
    unsigned int i;
    for(i=0; i<b; i++) out *= a;
    return out;
}



int bit_fun_signed_int( int i )
{
    return 1 << i;
}

int setBit_fun_signed_int( int x, int i )
{
    return x ^ 1 << i;
}

int clearBit_fun_signed_int( int x, int i )
{
    return x & ~(1 << i);
}

int complementBit_fun_signed_int( int x, int i )
{
    return x | 1 << i;
}

int testBit_fun_signed_int( int x, int i )
{
    return (x & (1 << i)) != 0;
}


int bit_shift_fun_signed_int( int x, int i )
 {
     if (i < 0) return x >> -i;
     if (i > 0) return x << i;
     return x;
 }


int bit_rotate_fun_signed_int( int x, int i )
{
    if (i < 0 && x < 0) {
      int left = i + sizeof(x) * 8;
      return ((x >> -i) & ~bit_shift_fun_signed_int(-1, left)) ^ bit_shift_fun_signed_int(x, left);
    }
    if (i < 0) return x >> -i ^ bit_shift_fun_signed_int(x, i + sizeof(x) * 8);
    else if (i == 0) return x;
    else return x << i ^ bit_shift_fun_signed_int(x, i - sizeof(x) * 8);
}

int rotateL_fun_signed_int( int x, int i )
{
    return bit_rotate_fun_signed_int(x, i);
}

int rotateR_fun_signed_int( int x, int i )
{
    return bit_rotate_fun_signed_int(x, -i);
}




int bitSize_fun_signed_int( int x )
{
    return sizeof x * 8;
}

int isSigned_fun_signed_int( int x )
{
    (void) x;
    return 1;
}



int abs_fun_signed_int( int a )
{
    if (a < 0) return a*(-1);
    return a;
}

int abs_fun_unsigned_int( unsigned int a )
{
    return a;
}

long abs_fun_signed_long( long a )
{
    if (a < 0) return a*(-1);
    return a;
}

long abs_fun_unsigned_long( unsigned long a )
{
    return a;
}

double abs_fun_float( float a )
{
    if (a < 0) return a*(-1);
    return a;
}

double abs_fun_double( double a )
{
    if (a < 0) return a*(-1);
    return a;
}



int signum_fun_signed_int( int a )
{
    if (a < 0) return -1;
    if (a > 0) return 1;
    return 0;
}

int signum_fun_unsigned_int( unsigned int a )
{
    if (a > 0) return 1;
    return 0;
}

long signum_fun_signed_long( long a )
{
    if (a < 0) return -1;
    if (a > 0) return 1;
    return 0;
}

long signum_fun_unsigned_long( unsigned long a )
{
    if (a > 0) return 1;
    return 0;
}

double signum_fun_float( float a )
{
    if (a < 0) return -1;
    if (a > 0) return 1;
    return 0;
}

double signum_fun_double( double a )
{
    if (a < 0) return -1;
    if (a > 0) return 1;
    return 0;
}



void copy_arrayOf_signed_int( int* a, int a1, int* b)
{
    int i;
    for( i=0; i<a1; ++i )
        b[i] = a[i];
}

void copy_arrayOf_unsigned_int( unsigned int* a, int a1, unsigned int* b )
{
    int i;
    for( i=0; i<a1; ++i )
        b[i] = a[i];
}

void copy_arrayOf_signed_long( long* a, int a1, long* b )
{
    int i;
    for( i=0; i<a1; ++i )
        b[i] = a[i];
}

void copy_arrayOf_unsigned_long( unsigned long* a, int a1, unsigned long* b )
{
    int i;
    for( i=0; i<a1; ++i )
        b[i] = a[i];
}

void copy_arrayOf_float( float* a, int a1, float* b )
{
    int i;
    for( i=0; i<a1; ++i )
        b[i] = a[i];
}


void copy_arrayOf_double( double* a, int a1, double* b )
{
    int i;
    for( i=0; i<a1; ++i )
        b[i] = a[i];
}