diff options
author | Qiang Yu <yuq825@gmail.com> | 2017-10-20 21:50:53 +0800 |
---|---|---|
committer | Qiang Yu <yuq825@gmail.com> | 2017-10-21 12:30:26 +0800 |
commit | 7abf82882ef6b79a94fe8a4a5952481533cb280c (patch) | |
tree | dd208ebdd6790f2fb214a626e3b3718f3978c0bd | |
parent | 83cde935b08a86c1786faa98af2fb035430b31e4 (diff) |
lima/ppir: add rsqrt codegen
Signed-off-by: Qiang Yu <yuq825@gmail.com>
-rw-r--r-- | src/gallium/drivers/lima/ir/pp/codegen.c | 34 | ||||
-rw-r--r-- | src/gallium/drivers/lima/ir/pp/instr.c | 4 | ||||
-rw-r--r-- | src/gallium/drivers/lima/ir/pp/nir.c | 1 | ||||
-rw-r--r-- | src/gallium/drivers/lima/ir/pp/node.c | 4 |
4 files changed, 42 insertions, 1 deletions
diff --git a/src/gallium/drivers/lima/ir/pp/codegen.c b/src/gallium/drivers/lima/ir/pp/codegen.c index def999c5bd..1d8f73036c 100644 --- a/src/gallium/drivers/lima/ir/pp/codegen.c +++ b/src/gallium/drivers/lima/ir/pp/codegen.c @@ -26,6 +26,7 @@ #include "util/ralloc.h" #include "util/u_half.h" +#include "util/bitscan.h" #include "ppir.h" #include "codegen.h" @@ -199,7 +200,38 @@ static void ppir_codegen_encode_scl_add(ppir_node *node, void *code) static void ppir_codegen_encode_combine(ppir_node *node, void *code) { - + ppir_codegen_field_combine *f = code; + ppir_alu_node *alu = ppir_node_to_alu(node); + + switch (node->op) { + case ppir_op_rsqrt: + { + f->scalar.dest_vec = false; + f->scalar.arg1_en = false; + + ppir_dest *dest = &alu->dest; + int dest_component = ffs(dest->write_mask) - 1; + assert(dest_component >= 0); + f->scalar.dest = ppir_target_get_dest_reg_index(dest) + dest_component; + f->scalar.dest = dest->modifier; + + ppir_src *src = alu->src; + int src_component = src->swizzle[dest_component]; + f->scalar.arg0_src = ppir_target_get_src_reg_index(src) + src_component; + f->scalar.arg0_absolute = src->absolute; + f->scalar.arg0_negate = src->negate; + + switch (node->op) { + case ppir_op_rsqrt: + f->scalar.op = ppir_codegen_combine_scalar_op_rsqrt; + break; + default: + break; + } + } + default: + break; + } } static void ppir_codegen_encode_store_temp(ppir_node *node, void *code) diff --git a/src/gallium/drivers/lima/ir/pp/instr.c b/src/gallium/drivers/lima/ir/pp/instr.c index 42bc5f5b82..db15d99681 100644 --- a/src/gallium/drivers/lima/ir/pp/instr.c +++ b/src/gallium/drivers/lima/ir/pp/instr.c @@ -128,6 +128,10 @@ bool ppir_instr_insert_node(ppir_instr *instr, ppir_node *node) instr->slots[PPIR_INSTR_SLOT_ALU_VEC_ADD] = node; break; + case ppir_op_rsqrt: + instr->slots[PPIR_INSTR_SLOT_ALU_COMBINE] = node; + break; + case ppir_op_const: { int i; diff --git a/src/gallium/drivers/lima/ir/pp/nir.c b/src/gallium/drivers/lima/ir/pp/nir.c index 5a0aebc986..433ae2cf00 100644 --- a/src/gallium/drivers/lima/ir/pp/nir.c +++ b/src/gallium/drivers/lima/ir/pp/nir.c @@ -130,6 +130,7 @@ static int nir_to_ppir_opcodes[nir_num_opcodes] = { [nir_op_fdot2] = ppir_op_dot2, [nir_op_fdot3] = ppir_op_dot3, [nir_op_fdot4] = ppir_op_dot4, + [nir_op_frsq] = ppir_op_rsqrt, }; static ppir_node *ppir_emit_alu(ppir_compiler *comp, nir_alu_instr *instr) diff --git a/src/gallium/drivers/lima/ir/pp/node.c b/src/gallium/drivers/lima/ir/pp/node.c index 18016a0dd6..fdb4649051 100644 --- a/src/gallium/drivers/lima/ir/pp/node.c +++ b/src/gallium/drivers/lima/ir/pp/node.c @@ -68,6 +68,10 @@ const ppir_op_info ppir_op_infos[] = { .name = "sum4", .type = ppir_node_type_alu, }, + [ppir_op_rsqrt] = { + .name = "rsqrt", + .type = ppir_node_type_alu, + }, [ppir_op_load_varying] = { .name = "ld_var", .type = ppir_node_type_load, |