summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQiang Yu <yuq825@gmail.com>2017-10-20 21:50:53 +0800
committerQiang Yu <yuq825@gmail.com>2017-10-21 12:30:26 +0800
commit7abf82882ef6b79a94fe8a4a5952481533cb280c (patch)
treedd208ebdd6790f2fb214a626e3b3718f3978c0bd
parent83cde935b08a86c1786faa98af2fb035430b31e4 (diff)
lima/ppir: add rsqrt codegen
Signed-off-by: Qiang Yu <yuq825@gmail.com>
-rw-r--r--src/gallium/drivers/lima/ir/pp/codegen.c34
-rw-r--r--src/gallium/drivers/lima/ir/pp/instr.c4
-rw-r--r--src/gallium/drivers/lima/ir/pp/nir.c1
-rw-r--r--src/gallium/drivers/lima/ir/pp/node.c4
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,