2 * Copyright 2017 Advanced Micro Devices, Inc.
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
26 #include "dcn_calc_math.h"
28 #define isNaN(number) ((number) != (number))
32 * This file is gcc-parseable HW gospel, coming straight from HW engineers.
34 * It doesn't adhere to Linux kernel style and sometimes will do things in odd
35 * ways. Unless there is something clearly wrong with it the code should
36 * remain as-is as it provides us with a guarantee from HW that it is correct.
39 float dcn_bw_mod(const float arg1
, const float arg2
)
45 return arg1
- arg1
* ((int) (arg1
/ arg2
));
48 float dcn_bw_min2(const float arg1
, const float arg2
)
54 return arg1
< arg2
? arg1
: arg2
;
57 unsigned int dcn_bw_max(const unsigned int arg1
, const unsigned int arg2
)
59 return arg1
> arg2
? arg1
: arg2
;
61 float dcn_bw_max2(const float arg1
, const float arg2
)
67 return arg1
> arg2
? arg1
: arg2
;
70 float dcn_bw_floor2(const float arg
, const float significance
)
72 if (significance
== 0)
74 return ((int) (arg
/ significance
)) * significance
;
76 float dcn_bw_floor(const float arg
)
81 float dcn_bw_ceil(const float arg
)
83 float flr
= dcn_bw_floor2(arg
, 1);
85 return flr
+ 0.00001 >= arg
? arg
: flr
+ 1;
88 float dcn_bw_ceil2(const float arg
, const float significance
)
90 float flr
= dcn_bw_floor2(arg
, significance
);
91 if (significance
== 0)
93 return flr
+ 0.00001 >= arg
? arg
: flr
+ significance
;
96 float dcn_bw_max3(float v1
, float v2
, float v3
)
98 return v3
> dcn_bw_max2(v1
, v2
) ? v3
: dcn_bw_max2(v1
, v2
);
101 float dcn_bw_max5(float v1
, float v2
, float v3
, float v4
, float v5
)
103 return dcn_bw_max3(v1
, v2
, v3
) > dcn_bw_max2(v4
, v5
) ? dcn_bw_max3(v1
, v2
, v3
) : dcn_bw_max2(v4
, v5
);
106 float dcn_bw_pow(float a
, float exp
)
109 /*ASSERT(exp == (int)exp);*/
112 temp
= dcn_bw_pow(a
, (int)(exp
/ 2));
113 if (((int)exp
% 2) == 0) {
117 return a
* temp
* temp
;
119 return (temp
* temp
) / a
;
123 double dcn_bw_fabs(double a
)
132 float dcn_bw_log(float a
, float b
)
134 int * const exp_ptr
= (int *)(&a
);
136 const int log_2
= ((x
>> 23) & 255) - 128;
141 a
= ((-1.0f
/ 3) * a
+ 2) * a
- 2.0f
/ 3;
143 if (b
> 2.00001 || b
< 1.99999)
144 return (a
+ log_2
) / dcn_bw_log(b
, 2);