mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-20 15:38:19 +02:00
Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com> Reviewed-by: Kenneth Graunke <kenneth@whitecape.org> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26797>
60 lines
1.4 KiB
C
60 lines
1.4 KiB
C
/* Copyright © 2023 Intel Corporation
|
|
* SPDX-License-Identifier: MIT
|
|
*/
|
|
|
|
#ifndef __GENX_HELPERS_H__
|
|
#define __GENX_HELPERS_H__
|
|
|
|
#ifndef __gen_validate_value
|
|
#define __gen_validate_value(x)
|
|
#endif
|
|
|
|
#ifndef __intel_field_functions
|
|
#define __intel_field_functions
|
|
#endif
|
|
|
|
#ifndef __gen_address_type
|
|
#error #define __gen_address_type before including this file
|
|
#endif
|
|
|
|
#ifndef __gen_user_data
|
|
#error #define __gen_combine_address before including this file
|
|
#endif
|
|
|
|
static inline __attribute__((always_inline)) uint64_t
|
|
__gen_offset(uint64_t v, ASSERTED uint32_t start, ASSERTED uint32_t end)
|
|
{
|
|
__gen_validate_value(v);
|
|
#ifndef NDEBUG
|
|
uint64_t mask = (~0ull >> (64 - (end - start + 1))) << start;
|
|
|
|
assert((v & ~mask) == 0);
|
|
#endif
|
|
|
|
return v;
|
|
}
|
|
|
|
static inline __attribute__((always_inline)) uint64_t
|
|
__gen_offset_nonzero(uint64_t v, uint32_t start, uint32_t end)
|
|
{
|
|
assert(v != 0ull);
|
|
return __gen_offset(v, start, end);
|
|
}
|
|
|
|
static inline __attribute__((always_inline)) uint64_t
|
|
__gen_address(__gen_user_data *data, void *location,
|
|
__gen_address_type address, uint32_t delta,
|
|
__attribute__((unused)) uint32_t start, uint32_t end)
|
|
{
|
|
uint64_t addr_u64 = __gen_combine_address(data, location, address, delta);
|
|
if (end == 31) {
|
|
return addr_u64;
|
|
} else if (end < 63) {
|
|
const unsigned shift = 63 - end;
|
|
return (addr_u64 << shift) >> shift;
|
|
} else {
|
|
return addr_u64;
|
|
}
|
|
}
|
|
|
|
#endif /* __GENX_HELPERS_H__ */
|