• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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