summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQiang Yu <yuq825@gmail.com>2017-10-24 15:07:15 +0800
committerQiang Yu <yuq825@gmail.com>2017-10-24 15:21:59 +0800
commit73dcbde22ae244390545a5a027f28018a46dd135 (patch)
treedce80ebbabcbacf49f02a0e3b46eb05817964ca3
parent4b1d212cb4628f4bbb8c205b17257768ce029aad (diff)
lima/gpir: add rsqrt support
Signed-off-by: Qiang Yu <yuq825@gmail.com>
-rw-r--r--src/gallium/drivers/lima/ir/gp/codegen.c4
-rw-r--r--src/gallium/drivers/lima/ir/gp/lower.c19
-rw-r--r--src/gallium/drivers/lima/ir/gp/nir.c1
-rw-r--r--src/gallium/drivers/lima/ir/gp/node.c1
4 files changed, 22 insertions, 3 deletions
diff --git a/src/gallium/drivers/lima/ir/gp/codegen.c b/src/gallium/drivers/lima/ir/gp/codegen.c
index 67b8c3ebbc..35c852e085 100644
--- a/src/gallium/drivers/lima/ir/gp/codegen.c
+++ b/src/gallium/drivers/lima/ir/gp/codegen.c
@@ -272,6 +272,7 @@ static void gpir_codegen_complex_slot(gpir_codegen_instr *code, gpir_instr *inst
switch (node->op) {
case gpir_op_mov:
case gpir_op_rcp_impl:
+ case gpir_op_rsqrt_impl:
{
gpir_alu_node *alu = gpir_node_to_alu(node);
code->complex_src = gpir_get_alu_input(node, alu->children[0]);
@@ -288,6 +289,9 @@ static void gpir_codegen_complex_slot(gpir_codegen_instr *code, gpir_instr *inst
case gpir_op_rcp_impl:
code->complex_op = gpir_codegen_complex_op_rcp;
break;
+ case gpir_op_rsqrt_impl:
+ code->complex_op = gpir_codegen_complex_op_rsqrt;
+ break;
default:
assert(0);
}
diff --git a/src/gallium/drivers/lima/ir/gp/lower.c b/src/gallium/drivers/lima/ir/gp/lower.c
index dff5f21f64..98d72b6a5c 100644
--- a/src/gallium/drivers/lima/ir/gp/lower.c
+++ b/src/gallium/drivers/lima/ir/gp/lower.c
@@ -135,7 +135,7 @@ static bool gpir_lower_neg(gpir_block *block, gpir_node *node)
return true;
}
-static bool gpir_lower_rcp(gpir_block *block, gpir_node *node)
+static bool gpir_lower_complex(gpir_block *block, gpir_node *node)
{
gpir_alu_node *alu = gpir_node_to_alu(node);
gpir_node *child = alu->children[0];
@@ -148,7 +148,19 @@ static bool gpir_lower_rcp(gpir_block *block, gpir_node *node)
gpir_node_add_child(&complex2->node, child);
list_addtail(&complex2->node.list, &node->list);
- gpir_alu_node *impl = gpir_node_create(block->comp, gpir_op_rcp_impl, -1);
+ int impl_op = 0;
+ switch (node->op) {
+ case gpir_op_rcp:
+ impl_op = gpir_op_rcp_impl;
+ break;
+ case gpir_op_rsqrt:
+ impl_op = gpir_op_rsqrt_impl;
+ break;
+ default:
+ assert(0);
+ }
+
+ gpir_alu_node *impl = gpir_node_create(block->comp, impl_op, -1);
if (!impl)
return false;
impl->children[0] = child;
@@ -170,7 +182,8 @@ static bool gpir_lower_rcp(gpir_block *block, gpir_node *node)
static bool (*gpir_lower_funcs[gpir_op_num])(gpir_block *, gpir_node *) = {
[gpir_op_neg] = gpir_lower_neg,
- [gpir_op_rcp] = gpir_lower_rcp,
+ [gpir_op_rcp] = gpir_lower_complex,
+ [gpir_op_rsqrt] = gpir_lower_complex,
};
bool gpir_lower_prog(gpir_compiler *comp)
diff --git a/src/gallium/drivers/lima/ir/gp/nir.c b/src/gallium/drivers/lima/ir/gp/nir.c
index ff067f6eae..43961a2891 100644
--- a/src/gallium/drivers/lima/ir/gp/nir.c
+++ b/src/gallium/drivers/lima/ir/gp/nir.c
@@ -74,6 +74,7 @@ static int nir_to_gpir_opcodes[nir_num_opcodes] = {
[nir_op_fadd] = gpir_op_add,
[nir_op_fneg] = gpir_op_neg,
[nir_op_frcp] = gpir_op_rcp,
+ [nir_op_frsq] = gpir_op_rsqrt,
};
static gpir_node *gpir_emit_alu(gpir_compiler *comp, nir_alu_instr *instr)
diff --git a/src/gallium/drivers/lima/ir/gp/node.c b/src/gallium/drivers/lima/ir/gp/node.c
index d84b103081..0e6b90e811 100644
--- a/src/gallium/drivers/lima/ir/gp/node.c
+++ b/src/gallium/drivers/lima/ir/gp/node.c
@@ -114,6 +114,7 @@ const gpir_op_info gpir_op_infos[] = {
},
[gpir_op_rsqrt_impl] = {
.name = "rsqrt_impl",
+ .slots = (int []) { GPIR_INSTR_SLOT_COMPLEX, GPIR_INSTR_SLOT_END },
},
[gpir_op_load_uniform] = {
.name = "ld_uni",