diff options
Diffstat (limited to 'src/compiler/nir/nir_opcodes_c.py')
-rw-r--r-- | src/compiler/nir/nir_opcodes_c.py | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/src/compiler/nir/nir_opcodes_c.py b/src/compiler/nir/nir_opcodes_c.py index 5f8bdc12a07..c66f3bc7ad4 100644 --- a/src/compiler/nir/nir_opcodes_c.py +++ b/src/compiler/nir/nir_opcodes_c.py @@ -29,6 +29,72 @@ from mako.template import Template template = Template(""" #include "nir.h" +nir_op +nir_type_conversion_op(nir_alu_type src, nir_alu_type dst) +{ + nir_alu_type src_base = (nir_alu_type) nir_alu_type_get_base_type(src); + nir_alu_type dst_base = (nir_alu_type) nir_alu_type_get_base_type(dst); + unsigned src_bit_size = nir_alu_type_get_type_size(src); + unsigned dst_bit_size = nir_alu_type_get_type_size(dst); + + if (src == dst && src_base == nir_type_float) { + return nir_op_fmov; + } else if ((src_base == nir_type_int || src_base == nir_type_uint) && + (dst_base == nir_type_int || dst_base == nir_type_uint) && + src_bit_size == dst_bit_size) { + /* Integer <-> integer conversions with the same bit-size on both + * ends are just no-op moves. + */ + return nir_op_imov; + } + + switch (src_base) { +% for src_t in ['int', 'uint', 'float']: + case nir_type_${src_t}: + switch (dst_base) { +% for dst_t in ['int', 'uint', 'float']: + case nir_type_${dst_t}: +% if src_t in ['int', 'uint'] and dst_t in ['int', 'uint']: +% if dst_t == 'int': +<% continue %> +% else: +<% dst_t = src_t %> +% endif +% endif + switch (dst_bit_size) { +% for dst_bits in [32, 64]: + case ${dst_bits}: + return ${'nir_op_{}2{}{}'.format(src_t[0], dst_t[0], dst_bits)}; +% endfor + default: + unreachable("Invalid nir alu bit size"); + } +% endfor + case nir_type_bool: +% if src_t == 'float': + return nir_op_f2b; +% else: + return nir_op_i2b; +% endif + default: + unreachable("Invalid nir alu base type"); + } +% endfor + case nir_type_bool: + switch (dst_base) { + case nir_type_int: + case nir_type_uint: + return nir_op_b2i; + case nir_type_float: + return nir_op_b2f; + default: + unreachable("Invalid nir alu base type"); + } + default: + unreachable("Invalid nir alu base type"); + } +} + const nir_op_info nir_op_infos[nir_num_opcodes] = { % for name, opcode in sorted(opcodes.iteritems()): { |