2 * Copyright (C) 2016 Intel Corporation
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 (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
35 #define __gen_validate_value(x) VALGRIND_CHECK_MEM_IS_DEFINED(&(x), sizeof(x))
41 #ifndef __gen_validate_value
42 #define __gen_validate_value(x)
45 #ifndef __gen_address_type
46 #error #define __gen_address_type before including this file
49 #ifndef __gen_user_data
50 #error #define __gen_combine_address before including this file
58 static inline uint64_t
59 __gen_mbo(uint32_t start
, uint32_t end
)
61 return (~0ull >> (64 - (end
- start
+ 1))) << start
;
64 static inline uint64_t
65 __gen_uint(uint64_t v
, uint32_t start
, uint32_t end
)
67 __gen_validate_value(v
);
70 const int width
= end
- start
+ 1;
72 const uint64_t max
= (1ull << width
) - 1;
80 static inline uint64_t
81 __gen_sint(int64_t v
, uint32_t start
, uint32_t end
)
83 const int width
= end
- start
+ 1;
85 __gen_validate_value(v
);
89 const int64_t max
= (1ll << (width
- 1)) - 1;
90 const int64_t min
= -(1ll << (width
- 1));
91 assert(min
<= v
&& v
<= max
);
95 const uint64_t mask
= ~0ull >> (64 - width
);
97 return (v
& mask
) << start
;
100 static inline uint64_t
101 __gen_offset(uint64_t v
, uint32_t start
, uint32_t end
)
103 __gen_validate_value(v
);
105 uint64_t mask
= (~0ull >> (64 - (end
- start
+ 1))) << start
;
107 assert((v
& ~mask
) == 0);
113 static inline uint32_t
116 __gen_validate_value(v
);
117 return ((union __gen_value
) { .f
= (v
) }).dw
;
120 static inline uint64_t
121 __gen_sfixed(float v
, uint32_t start
, uint32_t end
, uint32_t fract_bits
)
123 __gen_validate_value(v
);
125 const float factor
= (1 << fract_bits
);
128 const float max
= ((1 << (end
- start
)) - 1) / factor
;
129 const float min
= -(1 << (end
- start
)) / factor
;
130 assert(min
<= v
&& v
<= max
);
133 const int64_t int_val
= llroundf(v
* factor
);
134 const uint64_t mask
= ~0ull >> (64 - (end
- start
+ 1));
136 return (int_val
& mask
) << start
;
139 static inline uint64_t
140 __gen_ufixed(float v
, uint32_t start
, uint32_t end
, uint32_t fract_bits
)
142 __gen_validate_value(v
);
144 const float factor
= (1 << fract_bits
);
147 const float max
= ((1 << (end
- start
+ 1)) - 1) / factor
;
148 const float min
= 0.0f
;
149 assert(min
<= v
&& v
<= max
);
152 const uint64_t uint_val
= llroundf(v
* factor
);
154 return uint_val
<< start
;
157 static inline uint64_t
158 __gen_unpack_uint(const uint8_t *restrict cl
, uint32_t start
, uint32_t end
)
161 const int width
= end
- start
+ 1;
162 const uint32_t mask
= (width
== 32 ? ~0 : (1 << width
) - 1 );
164 for (int byte
= start
/ 8; byte
<= end
/ 8; byte
++) {
165 val
|= cl
[byte
] << ((byte
- start
/ 8) * 8);
168 return (val
>> (start
% 8)) & mask
;
171 static inline uint64_t
172 __gen_unpack_sint(const uint8_t *restrict cl
, uint32_t start
, uint32_t end
)
174 int size
= end
- start
+ 1;
175 int64_t val
= __gen_unpack_uint(cl
, start
, end
);
177 /* Get the sign bit extended. */
178 return (val
<< (64 - size
)) >> (64 - size
);
182 __gen_unpack_sfixed(const uint8_t *restrict cl
, uint32_t start
, uint32_t end
,
183 uint32_t fractional_size
)
185 int32_t bits
= __gen_unpack_sint(cl
, start
, end
);
186 return (float)bits
/ (1 << fractional_size
);
190 __gen_unpack_ufixed(const uint8_t *restrict cl
, uint32_t start
, uint32_t end
,
191 uint32_t fractional_size
)
193 int32_t bits
= __gen_unpack_uint(cl
, start
, end
);
194 return (float)bits
/ (1 << fractional_size
);
198 __gen_unpack_float(const uint8_t *restrict cl
, uint32_t start
, uint32_t end
)
200 assert(start
% 8 == 0);
201 assert(end
- start
== 31);
203 struct PACKED
{ float f
; } *f
= (void *)(cl
+ (start
/ 8));