From 97b24efd9f44590fe262c99d91f78f53d4da121b Mon Sep 17 00:00:00 2001 From: Rob Clark Date: Fri, 18 Oct 2019 15:53:07 -0700 Subject: [PATCH] freedreno/ir3: remove restrictions on const + (abs)/(neg) These date back to relatively early days of ir3, when a lot was still not well understood. But according to CI (and what I've seen blob driver do), these are not actually real restrictions. Signed-off-by: Rob Clark Reviewed-by: Kristian H. Kristensen --- src/freedreno/ir3/ir3.c | 10 ++++++---- src/freedreno/ir3/ir3_cp.c | 10 ---------- 2 files changed, 6 insertions(+), 14 deletions(-) diff --git a/src/freedreno/ir3/ir3.c b/src/freedreno/ir3/ir3.c index aaf33bc6de2..b137ee1a695 100644 --- a/src/freedreno/ir3/ir3.c +++ b/src/freedreno/ir3/ir3.c @@ -235,7 +235,8 @@ static int emit_cat2(struct ir3_instruction *instr, void *ptr, } else if (src1->flags & IR3_REG_CONST) { iassert(src1->num < (1 << 12)); cat2->c1.src1 = reg(src1, info, instr->repeat, - IR3_REG_CONST | IR3_REG_R | IR3_REG_HALF); + IR3_REG_CONST | IR3_REG_R | IR3_REG_HALF | + absneg); cat2->c1.src1_c = 1; } else { iassert(src1->num < (1 << 11)); @@ -261,7 +262,8 @@ static int emit_cat2(struct ir3_instruction *instr, void *ptr, } else if (src2->flags & IR3_REG_CONST) { iassert(src2->num < (1 << 12)); cat2->c2.src2 = reg(src2, info, instr->repeat, - IR3_REG_CONST | IR3_REG_R | IR3_REG_HALF); + IR3_REG_CONST | IR3_REG_R | IR3_REG_HALF | + absneg); cat2->c2.src2_c = 1; } else { iassert(src2->num < (1 << 11)); @@ -345,7 +347,7 @@ static int emit_cat3(struct ir3_instruction *instr, void *ptr, } else if (src1->flags & IR3_REG_CONST) { iassert(src1->num < (1 << 12)); cat3->c1.src1 = reg(src1, info, instr->repeat, - IR3_REG_CONST | IR3_REG_R | IR3_REG_HALF); + IR3_REG_CONST | IR3_REG_R | IR3_REG_HALF | absneg); cat3->c1.src1_c = 1; } else { iassert(src1->num < (1 << 11)); @@ -370,7 +372,7 @@ static int emit_cat3(struct ir3_instruction *instr, void *ptr, } else if (src3->flags & IR3_REG_CONST) { iassert(src3->num < (1 << 12)); cat3->c2.src3 = reg(src3, info, instr->repeat, - IR3_REG_CONST | IR3_REG_R | IR3_REG_HALF); + IR3_REG_CONST | IR3_REG_R | IR3_REG_HALF | absneg); cat3->c2.src3_c = 1; } else { iassert(src3->num < (1 << 11)); diff --git a/src/freedreno/ir3/ir3_cp.c b/src/freedreno/ir3/ir3_cp.c index 01386b434ee..16dd8583f39 100644 --- a/src/freedreno/ir3/ir3_cp.c +++ b/src/freedreno/ir3/ir3_cp.c @@ -175,10 +175,6 @@ static bool valid_flags(struct ir3_instruction *instr, unsigned n, if ((flags & IR3_REG_IMMED) && (reg->flags & IR3_REG_IMMED)) return false; } - /* cannot be const + ABS|NEG: */ - if (flags & (IR3_REG_FABS | IR3_REG_FNEG | - IR3_REG_SABS | IR3_REG_SNEG | IR3_REG_BNOT)) - return false; } break; case 3: @@ -194,12 +190,6 @@ static bool valid_flags(struct ir3_instruction *instr, unsigned n, return false; } - if (flags & IR3_REG_CONST) { - /* cannot be const + ABS|NEG: */ - if (flags & (IR3_REG_FABS | IR3_REG_FNEG | - IR3_REG_SABS | IR3_REG_SNEG | IR3_REG_BNOT)) - return false; - } break; case 4: /* seems like blob compiler avoids const as src.. */ -- 2.30.2