diff options
author | Karol Herbst <[email protected]> | 2019-03-20 18:09:20 +0100 |
---|---|---|
committer | Karol Herbst <[email protected]> | 2019-05-04 12:27:51 +0200 |
commit | 681fb7ea05d5f77d6a754c27ae938ebcd00cab3b (patch) | |
tree | d9afe74d82e2573c39fcc14754cea70d088af19a /src/compiler/nir | |
parent | c91ea6343f6b54d8cd3f8c72708a2425cc94d575 (diff) |
nir: Add a nir_builder_alu variant which takes an array of components
v2: rename to nir_build_alu_src_arr
Signed-off-by: Karol Herbst <[email protected]>
Reviewed-by: Jason Ekstrand <[email protected]>
Diffstat (limited to 'src/compiler/nir')
-rw-r--r-- | src/compiler/nir/nir_builder.h | 50 |
1 files changed, 36 insertions, 14 deletions
diff --git a/src/compiler/nir/nir_builder.h b/src/compiler/nir/nir_builder.h index d4f9f32a76b..5f6bb0b1d5a 100644 --- a/src/compiler/nir/nir_builder.h +++ b/src/compiler/nir/nir_builder.h @@ -389,24 +389,12 @@ nir_imm_boolN_t(nir_builder *build, bool x, unsigned bit_size) } static inline 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) +nir_builder_alu_instr_finish_and_insert(nir_builder *build, nir_alu_instr *instr) { - const nir_op_info *op_info = &nir_op_infos[op]; - nir_alu_instr *instr = nir_alu_instr_create(build->shader, op); - if (!instr) - return NULL; + const nir_op_info *op_info = &nir_op_infos[instr->op]; instr->exact = build->exact; - instr->src[0].src = nir_src_for_ssa(src0); - if (src1) - instr->src[1].src = nir_src_for_ssa(src1); - if (src2) - instr->src[2].src = nir_src_for_ssa(src2); - if (src3) - instr->src[3].src = nir_src_for_ssa(src3); - /* Guess the number of components the destination temporary should have * based on our input sizes, if it's not fixed for the op. */ @@ -462,6 +450,40 @@ nir_build_alu(nir_builder *build, nir_op op, nir_ssa_def *src0, return &instr->dest.dest.ssa; } +static inline 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) +{ + nir_alu_instr *instr = nir_alu_instr_create(build->shader, op); + if (!instr) + return NULL; + + instr->src[0].src = nir_src_for_ssa(src0); + if (src1) + instr->src[1].src = nir_src_for_ssa(src1); + if (src2) + instr->src[2].src = nir_src_for_ssa(src2); + if (src3) + 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: */ +static inline nir_ssa_def * +nir_build_alu_src_arr(nir_builder *build, nir_op op, nir_ssa_def **srcs) +{ + const nir_op_info *op_info = &nir_op_infos[op]; + nir_alu_instr *instr = nir_alu_instr_create(build->shader, op); + if (!instr) + return NULL; + + for (unsigned i = 0; i < op_info->num_inputs; i++) + instr->src[i].src = nir_src_for_ssa(srcs[i]); + + return nir_builder_alu_instr_finish_and_insert(build, instr); +} + #include "nir_builder_opcodes.h" static inline nir_ssa_def * |