119 lines
2.9 KiB
C
119 lines
2.9 KiB
C
|
/*
|
||
|
* Copyright (C) 2018, NVIDIA CORPORATION. All rights reserved.
|
||
|
*
|
||
|
* This software is licensed under the terms of the GNU General Public
|
||
|
* License version 2, as published by the Free Software Foundation, and
|
||
|
* may be copied, distributed, and modified under those terms.
|
||
|
*
|
||
|
* This program 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 General Public License for more details.
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
#ifndef _FIXED_POINT_H
|
||
|
#define _FIXED_POINT_H
|
||
|
|
||
|
struct fixed_point {
|
||
|
unsigned int int_part;
|
||
|
unsigned int frac_part;
|
||
|
unsigned int int_prec;
|
||
|
unsigned int frac_prec;
|
||
|
unsigned int int_mask;
|
||
|
unsigned int frac_mask;
|
||
|
};
|
||
|
|
||
|
struct fixed_point fixed_point_init(
|
||
|
unsigned int int_part,
|
||
|
unsigned int frac_part,
|
||
|
unsigned int int_prec,
|
||
|
unsigned int frac_prec,
|
||
|
unsigned int *error);
|
||
|
|
||
|
struct fixed_point fixed_point_shift_left(
|
||
|
struct fixed_point fp_arg,
|
||
|
unsigned int places,
|
||
|
unsigned int *error);
|
||
|
|
||
|
struct fixed_point fixed_point_shift_right(
|
||
|
struct fixed_point fp_arg,
|
||
|
unsigned int places,
|
||
|
unsigned int *error);
|
||
|
|
||
|
struct fixed_point fixed_point_negate(
|
||
|
struct fixed_point fp_arg,
|
||
|
unsigned int *error);
|
||
|
|
||
|
struct fixed_point fixed_point_add(
|
||
|
struct fixed_point fp_arg1,
|
||
|
struct fixed_point fp_arg2,
|
||
|
unsigned int *error);
|
||
|
|
||
|
/* returns difference = minuend - subtrahend */
|
||
|
struct fixed_point fixed_point_sub(
|
||
|
struct fixed_point minuend_arg,
|
||
|
struct fixed_point subtrahend_arg,
|
||
|
unsigned int *error);
|
||
|
|
||
|
struct fixed_point fixed_point_mult(
|
||
|
struct fixed_point fp_arg1,
|
||
|
struct fixed_point fp_arg2,
|
||
|
unsigned int *error);
|
||
|
|
||
|
/* returns quotient = dividend / divisor*/
|
||
|
struct fixed_point fixed_point_div(
|
||
|
struct fixed_point dividend_arg,
|
||
|
struct fixed_point divisor_arg,
|
||
|
unsigned int *error);
|
||
|
|
||
|
/* Return 1 is lhs < rhs, 0 otherwise */
|
||
|
int fixed_point_lt(
|
||
|
struct fixed_point fp_lhs_arg,
|
||
|
struct fixed_point fp_rhs_arg,
|
||
|
unsigned int *error);
|
||
|
|
||
|
/* Return 1 is lhs > rhs, 0 otherwise */
|
||
|
int fixed_point_gt(
|
||
|
struct fixed_point fp_lhs_arg,
|
||
|
struct fixed_point fp_rhs_arg,
|
||
|
unsigned int *error);
|
||
|
|
||
|
/* Return 1 is lhs <= rhs, 0 otherwise */
|
||
|
int fixed_point_loet(
|
||
|
struct fixed_point fp_lhs_arg,
|
||
|
struct fixed_point fp_rhs_arg,
|
||
|
unsigned int *error);
|
||
|
|
||
|
/* Return 1 is lhs >= rhs, 0 otherwise */
|
||
|
int fixed_point_goet(
|
||
|
struct fixed_point fp_lhs_arg,
|
||
|
struct fixed_point fp_rhs_arg,
|
||
|
unsigned int *error);
|
||
|
|
||
|
/* Return 1 is lhs == rhs, 0 otherwise */
|
||
|
int fixed_point_eq(
|
||
|
struct fixed_point fp_lhs_arg,
|
||
|
struct fixed_point fp_rhs_arg,
|
||
|
unsigned int *error);
|
||
|
|
||
|
int fixed_point_to_int(
|
||
|
struct fixed_point fp_arg,
|
||
|
unsigned int *error);
|
||
|
|
||
|
int fixed_point_ceil(
|
||
|
struct fixed_point fp_arg,
|
||
|
unsigned int *error);
|
||
|
|
||
|
struct fixed_point fixed_point_min(
|
||
|
struct fixed_point fp_arg1,
|
||
|
struct fixed_point fp_arg2,
|
||
|
unsigned int *error);
|
||
|
|
||
|
struct fixed_point fixed_point_max(
|
||
|
struct fixed_point fp_arg1,
|
||
|
struct fixed_point fp_arg2,
|
||
|
unsigned int *error);
|
||
|
|
||
|
#endif /* _FIXED_POINT_H */
|