summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQiang Yu <yuq825@gmail.com>2017-10-24 16:21:40 +0800
committerQiang Yu <yuq825@gmail.com>2017-10-24 16:21:40 +0800
commit2c6258f9f9310eb7de57ebead1ead675475dfb39 (patch)
tree46200741aacd91101f56c531ce7eb81c261f3fdb
parent73dcbde22ae244390545a5a027f28018a46dd135 (diff)
lima/gpir: add max node support
Signed-off-by: Qiang Yu <yuq825@gmail.com>
-rw-r--r--src/gallium/drivers/lima/ir/gp/codegen.c54
-rw-r--r--src/gallium/drivers/lima/ir/gp/nir.c1
-rw-r--r--src/gallium/drivers/lima/ir/gp/node.c1
3 files changed, 42 insertions, 14 deletions
diff --git a/src/gallium/drivers/lima/ir/gp/codegen.c b/src/gallium/drivers/lima/ir/gp/codegen.c
index 35c852e085..b000b22007 100644
--- a/src/gallium/drivers/lima/ir/gp/codegen.c
+++ b/src/gallium/drivers/lima/ir/gp/codegen.c
@@ -192,23 +192,36 @@ static void gpir_codegen_add0_slot(gpir_codegen_instr *code, gpir_instr *instr)
switch (node->op) {
case gpir_op_add:
+ case gpir_op_max:
code->acc0_src0 = gpir_get_alu_input(node, alu->children[0]);
code->acc0_src1 = gpir_get_alu_input(node, alu->children[1]);
code->acc0_src0_neg = alu->children_negate[0];
code->acc0_src1_neg = alu->children_negate[1];
- if (code->acc0_src1 == gpir_codegen_src_p1_complex) {
- code->acc0_src1 = code->acc0_src0;
- code->acc0_src0 = gpir_codegen_src_p1_complex;
-
- bool tmp = code->acc0_src0_neg;
- code->acc0_src0_neg = code->acc0_src1_neg;
- code->acc0_src1_neg = tmp;
+ switch (node->op) {
+ case gpir_op_add:
+ code->acc_op = gpir_codegen_acc_op_add;
+ if (code->acc0_src1 == gpir_codegen_src_p1_complex) {
+ code->acc0_src1 = code->acc0_src0;
+ code->acc0_src0 = gpir_codegen_src_p1_complex;
+
+ bool tmp = code->acc0_src0_neg;
+ code->acc0_src0_neg = code->acc0_src1_neg;
+ code->acc0_src1_neg = tmp;
+ }
+ break;
+ case gpir_op_max:
+ code->acc_op = gpir_codegen_acc_op_max;
+ break;
+ default:
+ assert(0);
}
+
break;
case gpir_op_mov:
+ code->acc_op = gpir_codegen_acc_op_add;
code->acc0_src0 = gpir_get_alu_input(node, alu->children[0]);
code->acc0_src1 = gpir_codegen_src_ident;
code->acc0_src1_neg = true;
@@ -233,23 +246,36 @@ static void gpir_codegen_add1_slot(gpir_codegen_instr *code, gpir_instr *instr)
switch (node->op) {
case gpir_op_add:
+ case gpir_op_max:
code->acc1_src0 = gpir_get_alu_input(node, alu->children[0]);
code->acc1_src1 = gpir_get_alu_input(node, alu->children[1]);
code->acc1_src0_neg = alu->children_negate[0];
code->acc1_src1_neg = alu->children_negate[1];
- if (code->acc1_src1 == gpir_codegen_src_p1_complex) {
- code->acc1_src1 = code->acc1_src0;
- code->acc1_src0 = gpir_codegen_src_p1_complex;
-
- bool tmp = code->acc1_src0_neg;
- code->acc1_src0_neg = code->acc1_src1_neg;
- code->acc1_src1_neg = tmp;
+ switch (node->op) {
+ case gpir_op_add:
+ code->acc_op = gpir_codegen_acc_op_add;
+ if (code->acc1_src1 == gpir_codegen_src_p1_complex) {
+ code->acc1_src1 = code->acc1_src0;
+ code->acc1_src0 = gpir_codegen_src_p1_complex;
+
+ bool tmp = code->acc1_src0_neg;
+ code->acc1_src0_neg = code->acc1_src1_neg;
+ code->acc1_src1_neg = tmp;
+ }
+ break;
+ case gpir_op_max:
+ code->acc_op = gpir_codegen_acc_op_max;
+ break;
+ default:
+ assert(0);
}
+
break;
case gpir_op_mov:
+ code->acc_op = gpir_codegen_acc_op_add;
code->acc1_src0 = gpir_get_alu_input(node, alu->children[0]);
code->acc1_src1 = gpir_codegen_src_ident;
code->acc1_src1_neg = true;
diff --git a/src/gallium/drivers/lima/ir/gp/nir.c b/src/gallium/drivers/lima/ir/gp/nir.c
index 43961a2891..4921d4cda2 100644
--- a/src/gallium/drivers/lima/ir/gp/nir.c
+++ b/src/gallium/drivers/lima/ir/gp/nir.c
@@ -73,6 +73,7 @@ static int nir_to_gpir_opcodes[nir_num_opcodes] = {
[nir_op_fmul] = gpir_op_mul,
[nir_op_fadd] = gpir_op_add,
[nir_op_fneg] = gpir_op_neg,
+ [nir_op_fmax] = gpir_op_max,
[nir_op_frcp] = gpir_op_rcp,
[nir_op_frsq] = gpir_op_rsqrt,
};
diff --git a/src/gallium/drivers/lima/ir/gp/node.c b/src/gallium/drivers/lima/ir/gp/node.c
index 0e6b90e811..bd1a081340 100644
--- a/src/gallium/drivers/lima/ir/gp/node.c
+++ b/src/gallium/drivers/lima/ir/gp/node.c
@@ -85,6 +85,7 @@ const gpir_op_info gpir_op_infos[] = {
[gpir_op_max] = {
.name = "max",
.src_neg = {true, true, false, false},
+ .slots = (int []) { GPIR_INSTR_SLOT_ADD0, GPIR_INSTR_SLOT_ADD1, GPIR_INSTR_SLOT_END },
},
[gpir_op_abs] = {
.name = "abs",