def type_sizes(type_):
if type_has_size(type_):
return [type_size(type_)]
+ elif type_ == 'float':
+ return [16, 32, 64]
else:
- return [32, 64]
+ return [8, 16, 32, 64]
def type_add_size(type_, size):
if type_has_size(type_):
def get_const_field(type_):
if type_ == "bool32":
return "u32"
+ elif type_ == "float16":
+ return "u16"
else:
m = type_split_re.match(type_)
if not m:
}
/* Some typed vector structures to make things like src0.y work */
+typedef float float16_t;
typedef float float32_t;
typedef double float64_t;
typedef bool bool32_t;
% for k in range(op.input_sizes[j]):
% if input_types[j] == "bool32":
_src[${j}].u32[${k}] != 0,
+ % elif input_types[j] == "float16":
+ _mesa_half_to_float(_src[${j}].u16[${k}]),
% else:
_src[${j}].${get_const_field(input_types[j])}[${k}],
% endif
<% continue %>
% elif input_types[j] == "bool32":
const bool src${j} = _src[${j}].u32[_i] != 0;
+ % elif input_types[j] == "float16":
+ const float src${j} =
+ _mesa_half_to_float(_src[${j}].u16[_i]);
% else:
const ${input_types[j]}_t src${j} =
_src[${j}].${get_const_field(input_types[j])}[_i];
% if output_type == "bool32":
## Sanitize the C value to a proper NIR bool
_dst_val.u32[_i] = dst ? NIR_TRUE : NIR_FALSE;
+ % elif output_type == "float16":
+ _dst_val.u16[_i] = _mesa_float_to_half(dst);
% else:
_dst_val.${get_const_field(output_type)}[_i] = dst;
% endif
% if output_type == "bool32":
## Sanitize the C value to a proper NIR bool
_dst_val.u32[${k}] = dst.${"xyzw"[k]} ? NIR_TRUE : NIR_FALSE;
+ % elif output_type == "float16":
+ _dst_val.u16[${k}] = _mesa_float_to_half(dst.${"xyzw"[k]});
% else:
_dst_val.${get_const_field(output_type)}[${k}] = dst.${"xyzw"[k]};
% endif
% for name, op in sorted(opcodes.iteritems()):
static nir_const_value
-evaluate_${name}(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
+evaluate_${name}(MAYBE_UNUSED unsigned num_components,
+ ${"UNUSED" if op_bit_sizes(op) is None else ""} unsigned bit_size,
MAYBE_UNUSED nir_const_value *_src)
{
nir_const_value _dst_val = { {0, } };