return nir_builder_alu_instr_finish_and_insert(build, instr);
}
+nir_ssa_def *
+nir_build_alu1(nir_builder *build, nir_op op, nir_ssa_def *src0)
+{
+ nir_alu_instr *instr = nir_alu_instr_create(build->shader, op);
+ if (!instr)
+ return NULL;
+
+ instr->src[0].src = nir_src_for_ssa(src0);
+
+ return nir_builder_alu_instr_finish_and_insert(build, instr);
+}
+
+nir_ssa_def *
+nir_build_alu2(nir_builder *build, nir_op op, nir_ssa_def *src0,
+ nir_ssa_def *src1)
+{
+ nir_alu_instr *instr = nir_alu_instr_create(build->shader, op);
+ if (!instr)
+ return NULL;
+
+ instr->src[0].src = nir_src_for_ssa(src0);
+ instr->src[1].src = nir_src_for_ssa(src1);
+
+ return nir_builder_alu_instr_finish_and_insert(build, instr);
+}
+
+nir_ssa_def *
+nir_build_alu3(nir_builder *build, nir_op op, nir_ssa_def *src0,
+ nir_ssa_def *src1, nir_ssa_def *src2)
+{
+ nir_alu_instr *instr = nir_alu_instr_create(build->shader, op);
+ if (!instr)
+ return NULL;
+
+ instr->src[0].src = nir_src_for_ssa(src0);
+ instr->src[1].src = nir_src_for_ssa(src1);
+ instr->src[2].src = nir_src_for_ssa(src2);
+
+ return nir_builder_alu_instr_finish_and_insert(build, instr);
+}
+
+nir_ssa_def *
+nir_build_alu4(nir_builder *build, nir_op op, nir_ssa_def *src0,
+ nir_ssa_def *src1, nir_ssa_def *src2, nir_ssa_def *src3)
+{
+ nir_alu_instr *instr = nir_alu_instr_create(build->shader, op);
+ if (!instr)
+ return NULL;
+
+ instr->src[0].src = nir_src_for_ssa(src0);
+ instr->src[1].src = nir_src_for_ssa(src1);
+ instr->src[2].src = nir_src_for_ssa(src2);
+ instr->src[3].src = nir_src_for_ssa(src3);
+
+ return nir_builder_alu_instr_finish_and_insert(build, instr);
+}
+
/* for the couple special cases with more than 4 src args: */
nir_ssa_def *
nir_build_alu_src_arr(nir_builder *build, nir_op op, nir_ssa_def **srcs)
return build->cursor.instr;
}
+/* General nir_build_alu() taking a variable arg count with NULLs for the rest. */
nir_ssa_def *
nir_build_alu(nir_builder *build, nir_op op, nir_ssa_def *src0,
nir_ssa_def *src1, nir_ssa_def *src2, nir_ssa_def *src3);
+/* Fixed-arg-count variants to reduce size of codegen. */
+nir_ssa_def *
+nir_build_alu1(nir_builder *build, nir_op op, nir_ssa_def *src0);
+nir_ssa_def *
+nir_build_alu2(nir_builder *build, nir_op op, nir_ssa_def *src0,
+ nir_ssa_def *src1);
+nir_ssa_def *
+nir_build_alu3(nir_builder *build, nir_op op, nir_ssa_def *src0,
+ nir_ssa_def *src1, nir_ssa_def *src2);
+nir_ssa_def *
+nir_build_alu4(nir_builder *build, nir_op op, nir_ssa_def *src0,
+ nir_ssa_def *src1, nir_ssa_def *src2, nir_ssa_def *src3);
+
nir_ssa_def *nir_build_alu_src_arr(nir_builder *build, nir_op op, nir_ssa_def **srcs);
nir_instr *nir_builder_last_instr(nir_builder *build);
return ', '.join('nir_ssa_def *src' + str(i) for i in range(num_srcs))
def src_list(num_srcs):
- if num_srcs <= 4:
- return ', '.join('src' + str(i) if i < num_srcs else 'NULL' for i in range(4))
- else:
- return ', '.join('src' + str(i) for i in range(num_srcs))
+ return ', '.join('src' + str(i) for i in range(num_srcs))
%>
% for name, opcode in sorted(opcodes.items()):
nir_${name}(nir_builder *build, ${src_decl_list(opcode.num_inputs)})
{
% if opcode.num_inputs <= 4:
- return nir_build_alu(build, nir_op_${name}, ${src_list(opcode.num_inputs)});
+ return nir_build_alu${opcode.num_inputs}(build, nir_op_${name}, ${src_list(opcode.num_inputs)});
% else:
nir_ssa_def *srcs[${opcode.num_inputs}] = {${src_list(opcode.num_inputs)}};
return nir_build_alu_src_arr(build, nir_op_${name}, srcs);