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 <robdclark@chromium.org> Reviewed-by: Kristian H. Kristensen <hoegsberg@google.com>
This commit is contained in:
@@ -235,7 +235,8 @@ static int emit_cat2(struct ir3_instruction *instr, void *ptr,
|
|||||||
} else if (src1->flags & IR3_REG_CONST) {
|
} else if (src1->flags & IR3_REG_CONST) {
|
||||||
iassert(src1->num < (1 << 12));
|
iassert(src1->num < (1 << 12));
|
||||||
cat2->c1.src1 = reg(src1, info, instr->repeat,
|
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;
|
cat2->c1.src1_c = 1;
|
||||||
} else {
|
} else {
|
||||||
iassert(src1->num < (1 << 11));
|
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) {
|
} else if (src2->flags & IR3_REG_CONST) {
|
||||||
iassert(src2->num < (1 << 12));
|
iassert(src2->num < (1 << 12));
|
||||||
cat2->c2.src2 = reg(src2, info, instr->repeat,
|
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;
|
cat2->c2.src2_c = 1;
|
||||||
} else {
|
} else {
|
||||||
iassert(src2->num < (1 << 11));
|
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) {
|
} else if (src1->flags & IR3_REG_CONST) {
|
||||||
iassert(src1->num < (1 << 12));
|
iassert(src1->num < (1 << 12));
|
||||||
cat3->c1.src1 = reg(src1, info, instr->repeat,
|
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;
|
cat3->c1.src1_c = 1;
|
||||||
} else {
|
} else {
|
||||||
iassert(src1->num < (1 << 11));
|
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) {
|
} else if (src3->flags & IR3_REG_CONST) {
|
||||||
iassert(src3->num < (1 << 12));
|
iassert(src3->num < (1 << 12));
|
||||||
cat3->c2.src3 = reg(src3, info, instr->repeat,
|
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;
|
cat3->c2.src3_c = 1;
|
||||||
} else {
|
} else {
|
||||||
iassert(src3->num < (1 << 11));
|
iassert(src3->num < (1 << 11));
|
||||||
|
@@ -175,10 +175,6 @@ static bool valid_flags(struct ir3_instruction *instr, unsigned n,
|
|||||||
if ((flags & IR3_REG_IMMED) && (reg->flags & IR3_REG_IMMED))
|
if ((flags & IR3_REG_IMMED) && (reg->flags & IR3_REG_IMMED))
|
||||||
return false;
|
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;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
@@ -194,12 +190,6 @@ static bool valid_flags(struct ir3_instruction *instr, unsigned n,
|
|||||||
return false;
|
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;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
/* seems like blob compiler avoids const as src.. */
|
/* seems like blob compiler avoids const as src.. */
|
||||||
|
Reference in New Issue
Block a user