nir: Allow adding descriptions to ALU opcodes

This will let us generate nicer documentation.

Signed-off-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
Reviewed-by: Rhys Perry <pendingchaos02@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22929>
This commit is contained in:
Alyssa Rosenzweig 2023-05-09 17:10:05 -04:00 committed by Marge Bot
parent 72a84ebbd6
commit 6b4f00a3ac

View file

@ -33,7 +33,8 @@ class Opcode(object):
NOTE: this must be kept in sync with nir_op_info NOTE: this must be kept in sync with nir_op_info
""" """
def __init__(self, name, output_size, output_type, input_sizes, def __init__(self, name, output_size, output_type, input_sizes,
input_types, is_conversion, algebraic_properties, const_expr): input_types, is_conversion, algebraic_properties, const_expr,
description):
"""Parameters: """Parameters:
- name is the name of the opcode (prepend nir_op_ for the enum name) - name is the name of the opcode (prepend nir_op_ for the enum name)
@ -44,6 +45,7 @@ class Opcode(object):
prepended before each entry prepended before each entry
- const_expr is an expression or series of statements that computes the - const_expr is an expression or series of statements that computes the
constant value of the opcode given the constant values of its inputs. constant value of the opcode given the constant values of its inputs.
- Optional description of the opcode for documentation.
Constant expressions are formed from the variables src0, src1, ..., Constant expressions are formed from the variables src0, src1, ...,
src(N-1), where N is the number of arguments. The output of the src(N-1), where N is the number of arguments. The output of the
@ -89,6 +91,7 @@ class Opcode(object):
self.is_conversion = is_conversion self.is_conversion = is_conversion
self.algebraic_properties = algebraic_properties self.algebraic_properties = algebraic_properties
self.const_expr = const_expr self.const_expr = const_expr
self.description = description
# helper variables for strings # helper variables for strings
tfloat = "float" tfloat = "float"
@ -152,25 +155,25 @@ selection = "selection "
opcodes = {} opcodes = {}
def opcode(name, output_size, output_type, input_sizes, input_types, def opcode(name, output_size, output_type, input_sizes, input_types,
is_conversion, algebraic_properties, const_expr): is_conversion, algebraic_properties, const_expr, description = ""):
assert name not in opcodes assert name not in opcodes
opcodes[name] = Opcode(name, output_size, output_type, input_sizes, opcodes[name] = Opcode(name, output_size, output_type, input_sizes,
input_types, is_conversion, algebraic_properties, input_types, is_conversion, algebraic_properties,
const_expr) const_expr, description)
def unop_convert(name, out_type, in_type, const_expr): def unop_convert(name, out_type, in_type, const_expr, description = ""):
opcode(name, 0, out_type, [0], [in_type], False, "", const_expr) opcode(name, 0, out_type, [0], [in_type], False, "", const_expr, description)
def unop(name, ty, const_expr): def unop(name, ty, const_expr, description = ""):
opcode(name, 0, ty, [0], [ty], False, "", const_expr) opcode(name, 0, ty, [0], [ty], False, "", const_expr, description)
def unop_horiz(name, output_size, output_type, input_size, input_type, def unop_horiz(name, output_size, output_type, input_size, input_type,
const_expr): const_expr, description = ""):
opcode(name, output_size, output_type, [input_size], [input_type], opcode(name, output_size, output_type, [input_size], [input_type],
False, "", const_expr) False, "", const_expr, description)
def unop_reduce(name, output_size, output_type, input_type, prereduce_expr, def unop_reduce(name, output_size, output_type, input_type, prereduce_expr,
reduce_expr, final_expr): reduce_expr, final_expr, description = ""):
def prereduce(src): def prereduce(src):
return "(" + prereduce_expr.format(src=src) + ")" return "(" + prereduce_expr.format(src=src) + ")"
def final(src): def final(src):
@ -182,14 +185,15 @@ def unop_reduce(name, output_size, output_type, input_type, prereduce_expr,
src2 = prereduce("src0.z") src2 = prereduce("src0.z")
src3 = prereduce("src0.w") src3 = prereduce("src0.w")
unop_horiz(name + "2", output_size, output_type, 2, input_type, unop_horiz(name + "2", output_size, output_type, 2, input_type,
final(reduce_(src0, src1))) final(reduce_(src0, src1)), description)
unop_horiz(name + "3", output_size, output_type, 3, input_type, unop_horiz(name + "3", output_size, output_type, 3, input_type,
final(reduce_(reduce_(src0, src1), src2))) final(reduce_(reduce_(src0, src1), src2)), description)
unop_horiz(name + "4", output_size, output_type, 4, input_type, unop_horiz(name + "4", output_size, output_type, 4, input_type,
final(reduce_(reduce_(src0, src1), reduce_(src2, src3)))) final(reduce_(reduce_(src0, src1), reduce_(src2, src3))),
description)
def unop_numeric_convert(name, out_type, in_type, const_expr): def unop_numeric_convert(name, out_type, in_type, const_expr, description = ""):
opcode(name, 0, out_type, [0], [in_type], True, "", const_expr) opcode(name, 0, out_type, [0], [in_type], True, "", const_expr, description)
unop("mov", tuint, "src0") unop("mov", tuint, "src0")
@ -559,38 +563,38 @@ if (src0.z < 0 && absZ >= absX && absZ >= absY) dst.x = 5;
# Sum of vector components # Sum of vector components
unop_reduce("fsum", 1, tfloat, tfloat, "{src}", "{src0} + {src1}", "{src}") unop_reduce("fsum", 1, tfloat, tfloat, "{src}", "{src0} + {src1}", "{src}")
def binop_convert(name, out_type, in_type, alg_props, const_expr): def binop_convert(name, out_type, in_type, alg_props, const_expr, description=""):
opcode(name, 0, out_type, [0, 0], [in_type, in_type], opcode(name, 0, out_type, [0, 0], [in_type, in_type],
False, alg_props, const_expr) False, alg_props, const_expr, description)
def binop(name, ty, alg_props, const_expr): def binop(name, ty, alg_props, const_expr, description = ""):
binop_convert(name, ty, ty, alg_props, const_expr) binop_convert(name, ty, ty, alg_props, const_expr, description)
def binop_compare(name, ty, alg_props, const_expr): def binop_compare(name, ty, alg_props, const_expr, description = ""):
binop_convert(name, tbool1, ty, alg_props, const_expr) binop_convert(name, tbool1, ty, alg_props, const_expr, description)
def binop_compare8(name, ty, alg_props, const_expr): def binop_compare8(name, ty, alg_props, const_expr, description = ""):
binop_convert(name, tbool8, ty, alg_props, const_expr) binop_convert(name, tbool8, ty, alg_props, const_expr, description)
def binop_compare16(name, ty, alg_props, const_expr): def binop_compare16(name, ty, alg_props, const_expr, description = ""):
binop_convert(name, tbool16, ty, alg_props, const_expr) binop_convert(name, tbool16, ty, alg_props, const_expr, description)
def binop_compare32(name, ty, alg_props, const_expr): def binop_compare32(name, ty, alg_props, const_expr, description = ""):
binop_convert(name, tbool32, ty, alg_props, const_expr) binop_convert(name, tbool32, ty, alg_props, const_expr, description)
def binop_compare_all_sizes(name, ty, alg_props, const_expr): def binop_compare_all_sizes(name, ty, alg_props, const_expr, description = ""):
binop_compare(name, ty, alg_props, const_expr) binop_compare(name, ty, alg_props, const_expr, description)
binop_compare8(name + "8", ty, alg_props, const_expr) binop_compare8(name + "8", ty, alg_props, const_expr, description)
binop_compare16(name + "16", ty, alg_props, const_expr) binop_compare16(name + "16", ty, alg_props, const_expr, description)
binop_compare32(name + "32", ty, alg_props, const_expr) binop_compare32(name + "32", ty, alg_props, const_expr, description)
def binop_horiz(name, out_size, out_type, src1_size, src1_type, src2_size, def binop_horiz(name, out_size, out_type, src1_size, src1_type, src2_size,
src2_type, const_expr): src2_type, const_expr, description = ""):
opcode(name, out_size, out_type, [src1_size, src2_size], [src1_type, src2_type], opcode(name, out_size, out_type, [src1_size, src2_size], [src1_type, src2_type],
False, "", const_expr) False, "", const_expr, description)
def binop_reduce(name, output_size, output_type, src_type, prereduce_expr, def binop_reduce(name, output_size, output_type, src_type, prereduce_expr,
reduce_expr, final_expr, suffix=""): reduce_expr, final_expr, suffix="", description = ""):
def final(src): def final(src):
return final_expr.format(src= "(" + src + ")") return final_expr.format(src= "(" + src + ")")
def reduce_(src0, src1): def reduce_(src0, src1):
@ -605,24 +609,26 @@ def binop_reduce(name, output_size, output_type, src_type, prereduce_expr,
for size in [2, 4, 8, 16]: for size in [2, 4, 8, 16]:
opcode(name + str(size) + suffix, output_size, output_type, opcode(name + str(size) + suffix, output_size, output_type,
[size, size], [src_type, src_type], False, _2src_commutative, [size, size], [src_type, src_type], False, _2src_commutative,
final(pairwise_reduce(0, size))) final(pairwise_reduce(0, size)), description)
opcode(name + "3" + suffix, output_size, output_type, opcode(name + "3" + suffix, output_size, output_type,
[3, 3], [src_type, src_type], False, _2src_commutative, [3, 3], [src_type, src_type], False, _2src_commutative,
final(reduce_(reduce_(srcs[2], srcs[1]), srcs[0]))) final(reduce_(reduce_(srcs[2], srcs[1]), srcs[0])), description)
opcode(name + "5" + suffix, output_size, output_type, opcode(name + "5" + suffix, output_size, output_type,
[5, 5], [src_type, src_type], False, _2src_commutative, [5, 5], [src_type, src_type], False, _2src_commutative,
final(reduce_(srcs[4], reduce_(reduce_(srcs[3], srcs[2]), reduce_(srcs[1], srcs[0]))))) final(reduce_(srcs[4], reduce_(reduce_(srcs[3], srcs[2]),
reduce_(srcs[1], srcs[0])))),
description)
def binop_reduce_all_sizes(name, output_size, src_type, prereduce_expr, def binop_reduce_all_sizes(name, output_size, src_type, prereduce_expr,
reduce_expr, final_expr): reduce_expr, final_expr, description = ""):
binop_reduce(name, output_size, tbool1, src_type, binop_reduce(name, output_size, tbool1, src_type,
prereduce_expr, reduce_expr, final_expr) prereduce_expr, reduce_expr, final_expr, description)
binop_reduce("b8" + name[1:], output_size, tbool8, src_type, binop_reduce("b8" + name[1:], output_size, tbool8, src_type,
prereduce_expr, reduce_expr, final_expr) prereduce_expr, reduce_expr, final_expr, description)
binop_reduce("b16" + name[1:], output_size, tbool16, src_type, binop_reduce("b16" + name[1:], output_size, tbool16, src_type,
prereduce_expr, reduce_expr, final_expr) prereduce_expr, reduce_expr, final_expr, description)
binop_reduce("b32" + name[1:], output_size, tbool32, src_type, binop_reduce("b32" + name[1:], output_size, tbool32, src_type,
prereduce_expr, reduce_expr, final_expr) prereduce_expr, reduce_expr, final_expr, description)
binop("fadd", tfloat, _2src_commutative + associative,""" binop("fadd", tfloat, _2src_commutative + associative,"""
if (nir_is_rounding_mode_rtz(execution_mode, bit_size)) { if (nir_is_rounding_mode_rtz(execution_mode, bit_size)) {
@ -961,12 +967,14 @@ binop("insert_u8", tuint, "", "(src0 & 0xff) << (src1 * 8)")
binop("insert_u16", tuint, "", "(src0 & 0xffff) << (src1 * 16)") binop("insert_u16", tuint, "", "(src0 & 0xffff) << (src1 * 16)")
def triop(name, ty, alg_props, const_expr): def triop(name, ty, alg_props, const_expr, description = ""):
opcode(name, 0, ty, [0, 0, 0], [ty, ty, ty], False, alg_props, const_expr) opcode(name, 0, ty, [0, 0, 0], [ty, ty, ty], False, alg_props, const_expr,
def triop_horiz(name, output_size, src1_size, src2_size, src3_size, const_expr): description)
def triop_horiz(name, output_size, src1_size, src2_size, src3_size, const_expr,
description = ""):
opcode(name, output_size, tuint, opcode(name, output_size, tuint,
[src1_size, src2_size, src3_size], [src1_size, src2_size, src3_size],
[tuint, tuint, tuint], False, "", const_expr) [tuint, tuint, tuint], False, "", const_expr, description)
triop("ffma", tfloat, _2src_commutative, """ triop("ffma", tfloat, _2src_commutative, """
if (nir_is_rounding_mode_rtz(execution_mode, bit_size)) { if (nir_is_rounding_mode_rtz(execution_mode, bit_size)) {