intel/genxml: Add an field option for nonzero="true"
This asserts that the value supplied is non-zero. Useful for things like MOCS fields on modern platforms where we really want to avoid setting it to 0 (uncached). mbz types cannot be flagged as nonzero. Reviewed-by: Jason Ekstrand <jason@jlekstrand.net> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13480>
This commit is contained in:

committed by
Marge Bot

parent
e6ebf5add7
commit
ebe2a2b5f6
@@ -89,6 +89,13 @@ __gen_uint(uint64_t v, uint32_t start, NDEBUG_UNUSED uint32_t end)
|
|||||||
return v << start;
|
return v << start;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline __attribute__((always_inline)) uint64_t
|
||||||
|
__gen_uint_nonzero(uint64_t v, uint32_t start, uint32_t end)
|
||||||
|
{
|
||||||
|
assert(v != 0ull);
|
||||||
|
return __gen_uint(v, start, end);
|
||||||
|
}
|
||||||
|
|
||||||
static inline __attribute__((always_inline)) uint64_t
|
static inline __attribute__((always_inline)) uint64_t
|
||||||
__gen_sint(int64_t v, uint32_t start, uint32_t end)
|
__gen_sint(int64_t v, uint32_t start, uint32_t end)
|
||||||
{
|
{
|
||||||
@@ -109,6 +116,13 @@ __gen_sint(int64_t v, uint32_t start, uint32_t end)
|
|||||||
return (v & mask) << start;
|
return (v & mask) << start;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline __attribute__((always_inline)) uint64_t
|
||||||
|
__gen_sint_nonzero(int64_t v, uint32_t start, uint32_t end)
|
||||||
|
{
|
||||||
|
assert(v != 0ll);
|
||||||
|
return __gen_sint(v, start, end);
|
||||||
|
}
|
||||||
|
|
||||||
static inline __attribute__((always_inline)) uint64_t
|
static inline __attribute__((always_inline)) uint64_t
|
||||||
__gen_offset(uint64_t v, NDEBUG_UNUSED uint32_t start, NDEBUG_UNUSED uint32_t end)
|
__gen_offset(uint64_t v, NDEBUG_UNUSED uint32_t start, NDEBUG_UNUSED uint32_t end)
|
||||||
{
|
{
|
||||||
@@ -122,6 +136,13 @@ __gen_offset(uint64_t v, NDEBUG_UNUSED uint32_t start, NDEBUG_UNUSED uint32_t en
|
|||||||
return v;
|
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
|
static inline __attribute__((always_inline)) uint64_t
|
||||||
__gen_address(__gen_user_data *data, void *location,
|
__gen_address(__gen_user_data *data, void *location,
|
||||||
__gen_address_type address, uint32_t delta,
|
__gen_address_type address, uint32_t delta,
|
||||||
@@ -145,6 +166,13 @@ __gen_float(float v)
|
|||||||
return ((union __intel_value) { .f = (v) }).dw;
|
return ((union __intel_value) { .f = (v) }).dw;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline __attribute__((always_inline)) uint32_t
|
||||||
|
__gen_float_nonzero(float v)
|
||||||
|
{
|
||||||
|
assert(v != 0.0f);
|
||||||
|
return __gen_float(v);
|
||||||
|
}
|
||||||
|
|
||||||
static inline __attribute__((always_inline)) uint64_t
|
static inline __attribute__((always_inline)) uint64_t
|
||||||
__gen_sfixed(float v, uint32_t start, uint32_t end, uint32_t fract_bits)
|
__gen_sfixed(float v, uint32_t start, uint32_t end, uint32_t fract_bits)
|
||||||
{
|
{
|
||||||
@@ -164,6 +192,13 @@ __gen_sfixed(float v, uint32_t start, uint32_t end, uint32_t fract_bits)
|
|||||||
return (int_val & mask) << start;
|
return (int_val & mask) << start;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline __attribute__((always_inline)) uint64_t
|
||||||
|
__gen_sfixed_nonzero(float v, uint32_t start, uint32_t end, uint32_t fract_bits)
|
||||||
|
{
|
||||||
|
assert(v != 0.0f);
|
||||||
|
return __gen_sfixed(v, start, end, fract_bits);
|
||||||
|
}
|
||||||
|
|
||||||
static inline __attribute__((always_inline)) uint64_t
|
static inline __attribute__((always_inline)) uint64_t
|
||||||
__gen_ufixed(float v, uint32_t start, NDEBUG_UNUSED uint32_t end, uint32_t fract_bits)
|
__gen_ufixed(float v, uint32_t start, NDEBUG_UNUSED uint32_t end, uint32_t fract_bits)
|
||||||
{
|
{
|
||||||
@@ -182,6 +217,13 @@ __gen_ufixed(float v, uint32_t start, NDEBUG_UNUSED uint32_t end, uint32_t fract
|
|||||||
return uint_val << start;
|
return uint_val << start;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline __attribute__((always_inline)) uint64_t
|
||||||
|
__gen_ufixed_nonzero(float v, uint32_t start, uint32_t end, uint32_t fract_bits)
|
||||||
|
{
|
||||||
|
assert(v != 0.0f);
|
||||||
|
return __gen_ufixed(v, start, end, fract_bits);
|
||||||
|
}
|
||||||
|
|
||||||
#ifndef __gen_address_type
|
#ifndef __gen_address_type
|
||||||
#error #define __gen_address_type before including this file
|
#error #define __gen_address_type before including this file
|
||||||
#endif
|
#endif
|
||||||
@@ -203,6 +245,10 @@ def num_from_str(num_str):
|
|||||||
assert not num_str.startswith('0'), 'octals numbers not allowed'
|
assert not num_str.startswith('0'), 'octals numbers not allowed'
|
||||||
return int(num_str)
|
return int(num_str)
|
||||||
|
|
||||||
|
def bool_from_str(bool_str):
|
||||||
|
options = { "true": True, "false": False }
|
||||||
|
return options[bool_str];
|
||||||
|
|
||||||
class Field(object):
|
class Field(object):
|
||||||
ufixed_pattern = re.compile(r"u(\d+)\.(\d+)")
|
ufixed_pattern = re.compile(r"u(\d+)\.(\d+)")
|
||||||
sfixed_pattern = re.compile(r"s(\d+)\.(\d+)")
|
sfixed_pattern = re.compile(r"s(\d+)\.(\d+)")
|
||||||
@@ -214,6 +260,7 @@ class Field(object):
|
|||||||
self.start = int(attrs["start"])
|
self.start = int(attrs["start"])
|
||||||
self.end = int(attrs["end"])
|
self.end = int(attrs["end"])
|
||||||
self.type = attrs["type"]
|
self.type = attrs["type"]
|
||||||
|
self.nonzero = bool_from_str(attrs.get("nonzero", "false"))
|
||||||
|
|
||||||
assert self.start <= self.end, \
|
assert self.start <= self.end, \
|
||||||
'field {} has end ({}) < start ({})'.format(self.name, self.end,
|
'field {} has end ({}) < start ({})'.format(self.name, self.end,
|
||||||
@@ -435,36 +482,38 @@ class Group(object):
|
|||||||
if field.type != "mbo" and field.type != "mbz":
|
if field.type != "mbo" and field.type != "mbz":
|
||||||
name = field.name + field.dim
|
name = field.name + field.dim
|
||||||
|
|
||||||
|
nz = "_nonzero" if field.nonzero else ""
|
||||||
|
|
||||||
if field.type == "mbo":
|
if field.type == "mbo":
|
||||||
non_address_fields.append("__gen_mbo(%d, %d)" % \
|
non_address_fields.append("__gen_mbo(%d, %d)" % \
|
||||||
(field.start - dword_start, field.end - dword_start))
|
(field.start - dword_start, field.end - dword_start))
|
||||||
elif field.type == "mbz":
|
elif field.type == "mbz":
|
||||||
pass
|
assert not field.nonzero
|
||||||
elif field.type == "address":
|
elif field.type == "address":
|
||||||
pass
|
pass
|
||||||
elif field.type == "uint":
|
elif field.type == "uint":
|
||||||
non_address_fields.append("__gen_uint(values->%s, %d, %d)" % \
|
non_address_fields.append("__gen_uint%s(values->%s, %d, %d)" % \
|
||||||
(name, field.start - dword_start, field.end - dword_start))
|
(nz, name, field.start - dword_start, field.end - dword_start))
|
||||||
elif field.is_enum_type():
|
elif field.is_enum_type():
|
||||||
non_address_fields.append("__gen_uint(values->%s, %d, %d)" % \
|
non_address_fields.append("__gen_uint%s(values->%s, %d, %d)" % \
|
||||||
(name, field.start - dword_start, field.end - dword_start))
|
(nz, name, field.start - dword_start, field.end - dword_start))
|
||||||
elif field.type == "int":
|
elif field.type == "int":
|
||||||
non_address_fields.append("__gen_sint(values->%s, %d, %d)" % \
|
non_address_fields.append("__gen_sint%s(values->%s, %d, %d)" % \
|
||||||
(name, field.start - dword_start, field.end - dword_start))
|
(nz, name, field.start - dword_start, field.end - dword_start))
|
||||||
elif field.type == "bool":
|
elif field.type == "bool":
|
||||||
non_address_fields.append("__gen_uint(values->%s, %d, %d)" % \
|
non_address_fields.append("__gen_uint%s(values->%s, %d, %d)" % \
|
||||||
(name, field.start - dword_start, field.end - dword_start))
|
(nz, name, field.start - dword_start, field.end - dword_start))
|
||||||
elif field.type == "float":
|
elif field.type == "float":
|
||||||
non_address_fields.append("__gen_float(values->%s)" % name)
|
non_address_fields.append("__gen_float%s(values->%s)" % (nz, name))
|
||||||
elif field.type == "offset":
|
elif field.type == "offset":
|
||||||
non_address_fields.append("__gen_offset(values->%s, %d, %d)" % \
|
non_address_fields.append("__gen_offset%s(values->%s, %d, %d)" % \
|
||||||
(name, field.start - dword_start, field.end - dword_start))
|
(nz, name, field.start - dword_start, field.end - dword_start))
|
||||||
elif field.type == 'ufixed':
|
elif field.type == 'ufixed':
|
||||||
non_address_fields.append("__gen_ufixed(values->%s, %d, %d, %d)" % \
|
non_address_fields.append("__gen_ufixed%s(values->%s, %d, %d, %d)" % \
|
||||||
(name, field.start - dword_start, field.end - dword_start, field.fractional_size))
|
(nz, name, field.start - dword_start, field.end - dword_start, field.fractional_size))
|
||||||
elif field.type == 'sfixed':
|
elif field.type == 'sfixed':
|
||||||
non_address_fields.append("__gen_sfixed(values->%s, %d, %d, %d)" % \
|
non_address_fields.append("__gen_sfixed%s(values->%s, %d, %d, %d)" % \
|
||||||
(name, field.start - dword_start, field.end - dword_start, field.fractional_size))
|
(nz, name, field.start - dword_start, field.end - dword_start, field.fractional_size))
|
||||||
elif field.is_struct_type():
|
elif field.is_struct_type():
|
||||||
non_address_fields.append("__gen_uint(v%d_%d, %d, %d)" % \
|
non_address_fields.append("__gen_uint(v%d_%d, %d, %d)" % \
|
||||||
(index, field_index, field.start - dword_start, field.end - dword_start))
|
(index, field_index, field.start - dword_start, field.end - dword_start))
|
||||||
|
Reference in New Issue
Block a user