freedreno/ir3: remove restrictions on const + (abs)/(neg)
authorRob Clark <robdclark@chromium.org>
Fri, 18 Oct 2019 22:53:07 +0000 (15:53 -0700)
committerRob Clark <robdclark@chromium.org>
Thu, 24 Oct 2019 20:08:56 +0000 (13:08 -0700)
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 <robdclark@chromium.org>
Reviewed-by: Kristian H. Kristensen <hoegsberg@google.com>
src/freedreno/ir3/ir3.c
src/freedreno/ir3/ir3_cp.c

index aaf33bc6de208d9aba518ac8f67a3225a6df35c3..b137ee1a695a2a7cf90e3ba6f2a207cda8f55f9b 100644 (file)
@@ -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));
index 01386b434ee412be02896a23313c1ab0d7925f14..16dd8583f3982a7609823329e9862c524baff778 100644 (file)
@@ -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.. */