1 /* Copyright © 2023 Intel Corporation
2 * SPDX-License-Identifier: MIT
3 */
4
5 #ifndef __GENX_CL_HELPERS_H__
6 #define __GENX_CL_HELPERS_H__
7
8 #include "compiler/libcl/libcl.h"
9
10 #define UNUSED
11
12 ALWAYS_INLINE static uint64_t
util_bitpack_uint(uint64_t v,uint32_t start,UNUSED uint32_t end)13 util_bitpack_uint(uint64_t v, uint32_t start, UNUSED uint32_t end)
14 {
15 return v << start;
16 }
17
18 ALWAYS_INLINE static uint64_t
util_bitpack_uint_nonzero(uint64_t v,uint32_t start,uint32_t end)19 util_bitpack_uint_nonzero(uint64_t v, uint32_t start, uint32_t end)
20 {
21 return util_bitpack_uint(v, start, end);
22 }
23
24 ALWAYS_INLINE static uint64_t
util_bitpack_sint(int64_t v,uint32_t start,uint32_t end)25 util_bitpack_sint(int64_t v, uint32_t start, uint32_t end)
26 {
27 int32_t bits = end - start + 1;
28
29 uint64_t mask = BITFIELD64_MASK(bits);
30
31 return (v & mask) << start;
32 }
33
34 ALWAYS_INLINE static uint64_t
util_bitpack_sint_nonzero(int64_t v,uint32_t start,uint32_t end)35 util_bitpack_sint_nonzero(int64_t v, uint32_t start, uint32_t end)
36 {
37 return util_bitpack_sint(v, start, end);
38 }
39
40 ALWAYS_INLINE static uint32_t
util_bitpack_float(float v)41 util_bitpack_float(float v)
42 {
43 union { float f; uint32_t dw; } x;
44 x.f = v;
45 return x.dw;
46 }
47
48 ALWAYS_INLINE static uint32_t
util_bitpack_float_nonzero(float v)49 util_bitpack_float_nonzero(float v)
50 {
51 return util_bitpack_float(v);
52 }
53
54 ALWAYS_INLINE static uint64_t
util_bitpack_sfixed(float v,uint32_t start,uint32_t end,uint32_t fract_bits)55 util_bitpack_sfixed(float v, uint32_t start, uint32_t end,
56 uint32_t fract_bits)
57 {
58 float factor = (1 << fract_bits);
59
60 int64_t int_val = round(v * factor);
61 uint64_t mask = ~0ul >> (64 - (end - start + 1));
62
63 return (int_val & mask) << start;
64 }
65
66 ALWAYS_INLINE static uint64_t
util_bitpack_sfixed_clamp(float v,uint32_t start,uint32_t end,uint32_t fract_bits)67 util_bitpack_sfixed_clamp(float v, uint32_t start, uint32_t end,
68 uint32_t fract_bits)
69 {
70 float factor = (1 << fract_bits);
71
72 uint32_t total_bits = end - start + 1;
73 float min = u_intN_min(total_bits) / factor;
74 float max = u_intN_max(total_bits) / factor;
75
76 int64_t int_val = round(CLAMP(v, min, max) * factor);
77 uint64_t mask = ~0ul >> (64 - (end - start + 1));
78
79 return (int_val & mask) << start;
80 }
81
82 ALWAYS_INLINE static uint64_t
util_bitpack_sfixed_nonzero(float v,uint32_t start,uint32_t end,uint32_t fract_bits)83 util_bitpack_sfixed_nonzero(float v, uint32_t start, uint32_t end,
84 uint32_t fract_bits)
85 {
86 return util_bitpack_sfixed(v, start, end, fract_bits);
87 }
88
89 ALWAYS_INLINE static uint64_t
util_bitpack_ufixed(float v,uint32_t start,uint32_t end,uint32_t fract_bits)90 util_bitpack_ufixed(float v, uint32_t start, uint32_t end, uint32_t fract_bits)
91 {
92 float factor = (1 << fract_bits);
93
94 uint64_t uint_val = round(v * factor);
95
96 return uint_val << start;
97 }
98
99 ALWAYS_INLINE static uint64_t
util_bitpack_ufixed_clamp(float v,uint32_t start,uint32_t end,uint32_t fract_bits)100 util_bitpack_ufixed_clamp(float v, uint32_t start, uint32_t end, uint32_t fract_bits)
101 {
102 float factor = (1 << fract_bits);
103
104 int total_bits = end - start + 1;
105 float min = 0.0f;
106 float max = u_uintN_max(total_bits) / factor;
107
108 uint64_t uint_val = round(CLAMP(v, min, max) * factor);
109
110 return uint_val << start;
111 }
112
113 ALWAYS_INLINE static uint64_t
util_bitpack_ufixed_nonzero(float v,uint32_t start,uint32_t end,uint32_t fract_bits)114 util_bitpack_ufixed_nonzero(float v, uint32_t start, uint32_t end,
115 uint32_t fract_bits)
116 {
117 return util_bitpack_ufixed(v, start, end, fract_bits);
118 }
119
120 #ifndef __gen_validate_value
121 #define __gen_validate_value(x)
122 #endif
123
124 #ifndef __intel_field_functions
125 #define __intel_field_functions
126 #endif
127
128 static inline __attribute__((always_inline)) uint64_t
__gen_offset(uint64_t v,UNUSED uint32_t start,UNUSED uint32_t end)129 __gen_offset(uint64_t v, UNUSED uint32_t start, UNUSED uint32_t end)
130 {
131 return v;
132 }
133
134 static inline __attribute__((always_inline)) uint64_t
__gen_offset_nonzero(uint64_t v,uint32_t start,uint32_t end)135 __gen_offset_nonzero(uint64_t v, uint32_t start, uint32_t end)
136 {
137 return __gen_offset(v, start, end);
138 }
139
140 static inline __attribute__((always_inline)) uint64_t
__gen_address(uint64_t address,uint32_t start,uint32_t end)141 __gen_address(uint64_t address,
142 __attribute__((unused)) uint32_t start, uint32_t end)
143 {
144 if (end < 63) {
145 uint32_t shift = 63 - end;
146 return (address << shift) >> shift;
147 } else {
148 return address;
149 }
150 }
151
152 #endif /* __GENX_CL_HELPERS_H__ */
153