From dbf041e61fe0583fa11f53bcc8d361923ae2b505 Mon Sep 17 00:00:00 2001 From: Rob Clark Date: Sat, 7 Sep 2013 19:57:04 -0400 Subject: [PATCH] freedreno/a3xx/compiler: implement SUB Signed-off-by: Rob Clark --- src/gallium/drivers/freedreno/a3xx/fd3_compiler.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/gallium/drivers/freedreno/a3xx/fd3_compiler.c b/src/gallium/drivers/freedreno/a3xx/fd3_compiler.c index be6ecdc41fb..b05b27278f8 100644 --- a/src/gallium/drivers/freedreno/a3xx/fd3_compiler.c +++ b/src/gallium/drivers/freedreno/a3xx/fd3_compiler.c @@ -556,7 +556,10 @@ vectorize(struct fd3_compile_context *ctx, struct ir3_instruction *instr, struct tgsi_src_register *src = va_arg(ap, struct tgsi_src_register *); unsigned flags = va_arg(ap, unsigned); - add_src_reg(ctx, instr, src, 0)->flags |= flags; + struct ir3_register *reg = add_src_reg(ctx, instr, src, 0); + reg->flags |= flags & ~IR3_REG_NEGATE; + if (flags & IR3_REG_NEGATE) + reg->flags ^= IR3_REG_NEGATE; } va_end(ap); @@ -1288,12 +1291,15 @@ instr_cat2(const struct instr_translater *t, struct tgsi_src_register *src0 = &inst->Src[0].Register; struct tgsi_src_register *src1 = &inst->Src[1].Register; struct ir3_instruction *instr; - unsigned src0_flags = 0; + unsigned src0_flags = 0, src1_flags = 0; switch (t->tgsi_opc) { case TGSI_OPCODE_ABS: src0_flags = IR3_REG_ABS; break; + case TGSI_OPCODE_SUB: + src1_flags = IR3_REG_NEGATE; + break; } switch (t->opc) { @@ -1320,7 +1326,8 @@ instr_cat2(const struct instr_translater *t, src0 = get_unconst(ctx, src0); instr = ir3_instr_create(ctx->ir, 2, t->opc); - vectorize(ctx, instr, dst, 2, src0, src0_flags, src1, 0); + vectorize(ctx, instr, dst, 2, src0, src0_flags, + src1, src1_flags); break; } @@ -1410,6 +1417,7 @@ static const struct instr_translater translaters[TGSI_OPCODE_LAST] = { INSTR(SQRT, instr_cat4, .opc = OPC_SQRT), INSTR(MUL, instr_cat2, .opc = OPC_MUL_F), INSTR(ADD, instr_cat2, .opc = OPC_ADD_F), + INSTR(SUB, instr_cat2, .opc = OPC_ADD_F), INSTR(DP2, trans_dotp, .arg = 2), INSTR(DP3, trans_dotp, .arg = 3), INSTR(DP4, trans_dotp, .arg = 4), -- 2.30.2