Line data Source code
1 : /*
2 : * Copyright 2017 Advanced Micro Devices, Inc.
3 : *
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:
10 : *
11 : * The above copyright notice and this permission notice shall be included in
12 : * all copies or substantial portions of the Software.
13 : *
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.
21 : *
22 : * Authors: AMD
23 : *
24 : */
25 :
26 : #ifndef __DML_INLINE_DEFS_H__
27 : #define __DML_INLINE_DEFS_H__
28 :
29 : #include "dcn_calc_math.h"
30 : #include "dml_logger.h"
31 :
32 : static inline double dml_min(double a, double b)
33 : {
34 0 : return (double) dcn_bw_min2(a, b);
35 : }
36 :
37 : static inline double dml_min3(double a, double b, double c)
38 : {
39 0 : return dml_min(dml_min(a, b), c);
40 : }
41 :
42 0 : static inline double dml_min4(double a, double b, double c, double d)
43 : {
44 0 : return dml_min(dml_min(a, b), dml_min(c, d));
45 : }
46 :
47 : static inline double dml_max(double a, double b)
48 : {
49 87 : return (double) dcn_bw_max2(a, b);
50 : }
51 :
52 : static inline double dml_max3(double a, double b, double c)
53 : {
54 0 : return dml_max(dml_max(a, b), c);
55 : }
56 :
57 0 : static inline double dml_max4(double a, double b, double c, double d)
58 : {
59 0 : return dml_max(dml_max(a, b), dml_max(c, d));
60 : }
61 :
62 : static inline double dml_max5(double a, double b, double c, double d, double e)
63 : {
64 0 : return dml_max(dml_max4(a, b, c, d), e);
65 : }
66 :
67 : static inline double dml_ceil(double a, double granularity)
68 : {
69 252 : return (double) dcn_bw_ceil2(a, granularity);
70 : }
71 :
72 : static inline double dml_floor(double a, double granularity)
73 : {
74 57 : return (double) dcn_bw_floor2(a, granularity);
75 : }
76 :
77 24 : static inline double dml_round(double a)
78 : {
79 24 : double round_pt = 0.5;
80 24 : double ceil = dml_ceil(a, 1);
81 24 : double floor = dml_floor(a, 1);
82 :
83 24 : if (a - floor >= round_pt)
84 : return ceil;
85 : else
86 13 : return floor;
87 : }
88 :
89 : /* float
90 : static inline int dml_log2(float x)
91 : {
92 : unsigned int ix = *((unsigned int *)&x);
93 :
94 : return (int)((ix >> 23) & 0xff) - 127;
95 : }*/
96 :
97 : /* double */
98 : static inline int dml_log2(double x)
99 : {
100 0 : unsigned long long ix = *((unsigned long long *)&x);
101 :
102 0 : return (int)((ix >> 52) & 0x7ff) - 1023;
103 : }
104 :
105 : static inline double dml_pow(double a, int exp)
106 : {
107 0 : return (double) dcn_bw_pow(a, exp);
108 : }
109 :
110 : static inline double dml_fmod(double f, int val)
111 : {
112 : return (double) dcn_bw_mod(f, val);
113 : }
114 :
115 : static inline double dml_ceil_2(double f)
116 : {
117 : return (double) dcn_bw_ceil2(f, 2);
118 : }
119 :
120 : static inline double dml_ceil_ex(double x, double granularity)
121 : {
122 : return (double) dcn_bw_ceil2(x, granularity);
123 : }
124 :
125 : static inline double dml_floor_ex(double x, double granularity)
126 : {
127 : return (double) dcn_bw_floor2(x, granularity);
128 : }
129 :
130 : static inline unsigned int dml_round_to_multiple(unsigned int num,
131 : unsigned int multiple,
132 : unsigned char up)
133 : {
134 : unsigned int remainder;
135 :
136 0 : if (multiple == 0)
137 : return num;
138 :
139 0 : remainder = num % multiple;
140 :
141 0 : if (remainder == 0)
142 : return num;
143 :
144 : if (up)
145 0 : return (num + multiple - remainder);
146 : else
147 0 : return (num - remainder);
148 : }
149 : static inline double dml_abs(double a)
150 : {
151 : if (a > 0)
152 : return a;
153 : else
154 : return (a*(-1));
155 : }
156 :
157 : #endif
|