diff options
author | Qiang Yu <yuq825@gmail.com> | 2017-10-24 16:21:40 +0800 |
---|---|---|
committer | Qiang Yu <yuq825@gmail.com> | 2017-10-24 16:21:40 +0800 |
commit | 2c6258f9f9310eb7de57ebead1ead675475dfb39 (patch) | |
tree | 46200741aacd91101f56c531ce7eb81c261f3fdb | |
parent | 73dcbde22ae244390545a5a027f28018a46dd135 (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.c | 54 | ||||
-rw-r--r-- | src/gallium/drivers/lima/ir/gp/nir.c | 1 | ||||
-rw-r--r-- | src/gallium/drivers/lima/ir/gp/node.c | 1 |
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", |