xref: /aosp_15_r20/external/mesa3d/src/intel/genxml/genX_helpers.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /* Copyright © 2023 Intel Corporation
2*61046927SAndroid Build Coastguard Worker  * SPDX-License-Identifier: MIT
3*61046927SAndroid Build Coastguard Worker  */
4*61046927SAndroid Build Coastguard Worker 
5*61046927SAndroid Build Coastguard Worker #ifndef __GENX_HELPERS_H__
6*61046927SAndroid Build Coastguard Worker #define __GENX_HELPERS_H__
7*61046927SAndroid Build Coastguard Worker 
8*61046927SAndroid Build Coastguard Worker #ifndef __gen_validate_value
9*61046927SAndroid Build Coastguard Worker #define __gen_validate_value(x)
10*61046927SAndroid Build Coastguard Worker #endif
11*61046927SAndroid Build Coastguard Worker 
12*61046927SAndroid Build Coastguard Worker #ifndef __intel_field_functions
13*61046927SAndroid Build Coastguard Worker #define __intel_field_functions
14*61046927SAndroid Build Coastguard Worker #endif
15*61046927SAndroid Build Coastguard Worker 
16*61046927SAndroid Build Coastguard Worker #ifndef __gen_address_type
17*61046927SAndroid Build Coastguard Worker #error #define __gen_address_type before including this file
18*61046927SAndroid Build Coastguard Worker #endif
19*61046927SAndroid Build Coastguard Worker 
20*61046927SAndroid Build Coastguard Worker #ifndef __gen_user_data
21*61046927SAndroid Build Coastguard Worker #error #define __gen_combine_address before including this file
22*61046927SAndroid Build Coastguard Worker #endif
23*61046927SAndroid Build Coastguard Worker 
24*61046927SAndroid Build Coastguard Worker static inline __attribute__((always_inline)) uint64_t
__gen_offset(uint64_t v,ASSERTED uint32_t start,ASSERTED uint32_t end)25*61046927SAndroid Build Coastguard Worker __gen_offset(uint64_t v, ASSERTED uint32_t start, ASSERTED uint32_t end)
26*61046927SAndroid Build Coastguard Worker {
27*61046927SAndroid Build Coastguard Worker    __gen_validate_value(v);
28*61046927SAndroid Build Coastguard Worker #ifndef NDEBUG
29*61046927SAndroid Build Coastguard Worker    uint64_t mask = (~0ull >> (64 - (end - start + 1))) << start;
30*61046927SAndroid Build Coastguard Worker 
31*61046927SAndroid Build Coastguard Worker    assert((v & ~mask) == 0);
32*61046927SAndroid Build Coastguard Worker #endif
33*61046927SAndroid Build Coastguard Worker 
34*61046927SAndroid Build Coastguard Worker    return v;
35*61046927SAndroid Build Coastguard Worker }
36*61046927SAndroid Build Coastguard Worker 
37*61046927SAndroid Build Coastguard Worker static inline __attribute__((always_inline)) uint64_t
__gen_offset_nonzero(uint64_t v,uint32_t start,uint32_t end)38*61046927SAndroid Build Coastguard Worker __gen_offset_nonzero(uint64_t v, uint32_t start, uint32_t end)
39*61046927SAndroid Build Coastguard Worker {
40*61046927SAndroid Build Coastguard Worker    assert(v != 0ull);
41*61046927SAndroid Build Coastguard Worker    return __gen_offset(v, start, end);
42*61046927SAndroid Build Coastguard Worker }
43*61046927SAndroid Build Coastguard Worker 
44*61046927SAndroid Build Coastguard Worker static inline __attribute__((always_inline)) uint64_t
__gen_address(__gen_user_data * data,void * location,__gen_address_type address,uint32_t delta,uint32_t start,uint32_t end)45*61046927SAndroid Build Coastguard Worker __gen_address(__gen_user_data *data, void *location,
46*61046927SAndroid Build Coastguard Worker               __gen_address_type address, uint32_t delta,
47*61046927SAndroid Build Coastguard Worker               __attribute__((unused)) uint32_t start, uint32_t end)
48*61046927SAndroid Build Coastguard Worker {
49*61046927SAndroid Build Coastguard Worker    uint64_t addr_u64 = __gen_combine_address(data, location, address, delta);
50*61046927SAndroid Build Coastguard Worker    if (end == 31) {
51*61046927SAndroid Build Coastguard Worker       return addr_u64;
52*61046927SAndroid Build Coastguard Worker    } else if (end < 63) {
53*61046927SAndroid Build Coastguard Worker       const unsigned shift = 63 - end;
54*61046927SAndroid Build Coastguard Worker       return (addr_u64 << shift) >> shift;
55*61046927SAndroid Build Coastguard Worker    } else {
56*61046927SAndroid Build Coastguard Worker       return addr_u64;
57*61046927SAndroid Build Coastguard Worker    }
58*61046927SAndroid Build Coastguard Worker }
59*61046927SAndroid Build Coastguard Worker 
60*61046927SAndroid Build Coastguard Worker #endif /* __GENX_HELPERS_H__ */
61